/* 
    This file is part of MiraMon Map Browser.
    MiraMon Map Browser is free software: you can redistribute it and/or modify
    it under the terms of the GNU General Public License as published by
    the Free Software Foundation, either version 3 of the License, or
    (at your option) any later version.

    Foobar is distributed in the hope that it will be useful,
    but WITHOUT ANY WARRANTY; without even the implied warranty of
    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
    GNU General Public License for more details.

    You should have received a copy of the GNU General Public License
    along with MiraMon Map Browser.  If not, see "http://www.gnu.org/licenses/".

    Copyright 2001, 2011 Xavier Pons

    Aquest codi JavaScript ha estat realitzat per Joan Masó Pau 
    (joan maso at uab cat) i Nuria Julià (n julia at creaf uab cat)
    dins del grup de MiraMon. MiraMon és un projecte del Centre
    de recerca i aplicacions forestals (CREAF) que elabora programari de 
    Sistema d'Informació Geogràfica i de Teledetecció per a la 
    visualització, consulta, edició i anàlisi de mapes ràsters i 
    vectorials. Elabora programari d'escriptori i també servidors i clients 
    per Internet. No tots aquests productes són gratuïts o de codi obert. 
    En particular, el Navegador de Mapes del MiraMon (client per Internet) 
    es distribueix sota els termes de la llicència "GNU General Public 
    License". Es pot actualitzar des de www.creaf.uab.es/miramon/mmn
 */

function MoureASobreDeTot(i_capa)
{
	//he de baixar totes les capes que estan sobre i_capa una posició
	for(var i=0; i<i_capa; i++)
		capa[i].ordre=capa[i].ordre+1;
	capa[i_capa].ordre=0;
	capa.sort(OrdenaOrdreVisualitzacio);
	CreaParamInternCtrlCapa();
	RevisaEstatsCapes();
	CreaLlegenda();
	RepintaMapesIVistes();
	return;
}

function MoureASobre(i_capa)
{
	while(true)
	{
		if(i_capa>0)
		{
			capa[i_capa].ordre--;
			capa[i_capa-1].ordre++;			
			if(!EsCapaVisibleAAquestNivellDeZoomOEnLlegenda(i_capa-1))
			{
				capa.sort(OrdenaOrdreVisualitzacio);
				CreaParamInternCtrlCapa();
				i_capa--;
			}
			else
				break;
		}
	}
	//Caldrà fer alguna cosa amb els grups, capes no visibles a la llegenda en aquell moment,...
	capa.sort(OrdenaOrdreVisualitzacio);
	CreaParamInternCtrlCapa();
	RevisaEstatsCapes();
	CreaLlegenda();
	RepintaMapesIVistes();
	return;
}

function MoureASota(i_capa)
{
	while(true)
	{
		if(i_capa<(capa.length-1))
		{
			capa[i_capa].ordre++;
			capa[i_capa+1].ordre--;
			if(!EsCapaVisibleAAquestNivellDeZoomOEnLlegenda(i_capa+1))
			{
				capa.sort(OrdenaOrdreVisualitzacio);
				CreaParamInternCtrlCapa();
				i_capa++;
			}
			else
				break;
		}
	}

//Caldrà fer alguna cosa amb els grups, capes no visibles a la llegenda en aquell moment,...
	capa.sort(OrdenaOrdreVisualitzacio);
	CreaParamInternCtrlCapa();
	RevisaEstatsCapes();
	CreaLlegenda();
	RepintaMapesIVistes();
	return;
}

function MoureASotaDeTot(i_capa)
{
	//he de pujar totes les capes que estan sota i_capa una posició
	for(var i=capa.length-1; i>i_capa; i--)
		capa[i].ordre=capa[i].ordre-1;
	capa[i_capa].ordre=capa.length-1;

	capa.sort(OrdenaOrdreVisualitzacio);
	CreaParamInternCtrlCapa()
	RevisaEstatsCapes();
	CreaLlegenda();
	RepintaMapesIVistes();
	return;
}

function AfegirCapa(i_capa)
{
	IniciaFinestraAfegeixCapaServidor(i_capa);	
}

function EsborrarCapa(i_capa)
{
	capa[i_capa].ordre=capa.length-1;
	if((i_capa+1)<capa.length)
	{
		for(var i=i_capa+1; i<capa.length; i++)
			capa[i].ordre=capa[i].ordre-1;
	}
	capa.sort(OrdenaOrdreVisualitzacio);
	capa[capa.length-1]=null;
	capa.length--;
	CreaParamInternCtrlCapa()	
	RevisaEstatsCapes();
	CreaLlegenda();
	RepintaMapesIVistes();
}

function TancaContextMenuCapa()
{	
	var elem=getLayer(this, "menuContextualCapa");
	hideLayer(elem);
}

function OmpleLayerContextMenuCapa(event, i)
{
var cdns=new Array();
var s;
	if (ParamCtrl.TipusBarraBotons&boto_afegeixCapa || capa[i].ordre>0 || capa[i].ordre<(capa.length-1) || DonaCadena(capa[i].metadades))
	{
		cdns.push("<div class=\"MenuContextualCapa\">",
				  "<img align=\"right\" src=\"tanca_consulta.gif\" alt=\"",
					DonaCadena3("tancar", "cerrar", "close") , "\" onClick=\"TancaContextMenuCapa();\">",
				   "<div class=\"llistaMenuContext\">");
		if (ParamCtrl.TipusBarraBotons&boto_afegeixCapa)
		{
			cdns.push("<a class=\"unmenu\" href=\"javascript:void(0);\" onClick=\"AfegirCapa(", i, ");TancaContextMenuCapa();\" title=\"", 
							DonaCadena3("Afegir capa", "A&ntilde;adir capa", "Add layer"), "\">",
							DonaCadena3("Afegir capa", "A&ntilde;adir capa", "Add layer"), "</a><br>",
							"<a class=\"unmenu\" href=\"javascript:void(0);\" onClick=\"EsborrarCapa(", i,");TancaContextMenuCapa();\" title=\"", 
							DonaCadena3("Esborrar capa", "Borrar capa", "Delete layer"), "\">",
							DonaCadena3("Esborrar capa", "Borrar capa", "Delete layer"), "</a>");
		}
		if (capa[i].ordre>0 || capa[i].ordre<(capa.length-1))
		{
			cdns.push("<hr><b><font color=\"#888888\">",
				  DonaCadena3("Moure la capa", "Mover la capa", "Move the layer"), "</b><br>");
			if(capa[i].ordre>0)	
			{
				cdns.push("<a class=\"unmenu\" href=\"javascript:void(0);\" onClick=\"MoureASobreDeTot(", i, ");TancaContextMenuCapa();\" title=\"", 
						DonaCadena3("A sobre de tot", "Encima de todo", "To the top"), "\">",
						DonaCadena3("A sobre de tot", "Encima de todo", "To the top"), "</a><br>",
						"<a class=\"unmenu\" href=\"javascript:void(0);\" onClick=\"MoureASobre(", i,");TancaContextMenuCapa();\" title=\"", 
						DonaCadena3("A sobre", "Encima", "Up"), "\">",
						DonaCadena3("A sobre", "Encima", "Up"), "</a>");
			}
			if(capa[i].ordre<(capa.length-1))
			{
				cdns.push("<br><a class=\"unmenu\" href=\"javascript:void(0);\" onClick=\"MoureASota(", i,");TancaContextMenuCapa();\" title=\"",
						  DonaCadena3("A sota", "Debajo", "Down"), "\">",
						  DonaCadena3("A sota", "Debajo", "Down"), "</a><br>",
						  "<a class=\"unmenu\" href=\"javascript:void(0);\" onClick=\"MoureASotaDeTot(", i,");TancaContextMenuCapa();\" title=\"",
						  DonaCadena3("A sota de tot", "Debajo de todo", "To the end"), "\">",
						  DonaCadena3("A sota de tot", "Debajo de todo", "To the end"), "</a>");
			}
		
		}
		if (DonaCadena(capa[i].metadades))
		{
			cdns.push("<hr><a class=\"unmenu\" href=\"javascript:void(0);\" onClick=\"ObreFinestraFitxerMetadades(", i,",-1);TancaContextMenuCapa();\" title=\"", 																						
					DonaCadena3("metadades", "metadatos", "metadata"), "\">", 
					DonaCadena3("metadades", "metadatos", "metadata"), "</a>");
		}
	
		cdns.push("</div></div>");
		s=cdns.join("");
			
		//Crear la layer i mostrar-ho en la posició on s'ha fet el clic 
		//amb aquest contingut
		var elem=getLayer(this, "menuContextualCapa");
	
		if (isLayer(elem))
		{		
			var y;
			contentLayer(elem, s);
			
			var mida=event.screenY+10+parseInt(elem.style.height,10)+10; //li afegeixo 10 més de marge
			
			if(mida>=this.window.screen.height)
				y=event.clientY-10-parseInt(elem.style.height,10);
			else
				y=event.clientY+10;
			changePosAndShowLayer(elem, event.clientX, y);
		}
	}
}
	
function AfegirCapesAlNavegador(form, i_serv)
{
var i, j, k, i_capa, i_get_featureinfo, i_getmap;
var alguna_capa_afegida=false;
var estil;
var format;
var format_get_map;
var servidorGC=ServidorGetCapabilities[i_serv];
var i_on_afegir=servidorGC.i_capa_on_afegir;
	
	if(form==null)
		return;
	//Format de consulta comú per totes les capes
	i_get_featureinfo=-1;
	if(servidorGC.formatGetFeatureInfo)
	{
		for(j=0; j<servidorGC.formatGetFeatureInfo.length; j++)
		{
			if(servidorGC.formatGetFeatureInfo[j].search("text/xml"))
			{
				i_get_featureinfo=j;
				break;
			}
		}
		if(i_get_featureinfo==-1)
		{
			for(j=0; j<servidorGC.formatGetFeatureInfo.length; j++)
			{
				if(servidorGC.formatGetFeatureInfo[j].search("text/html"))
				{
					i_get_featureinfo=j;
					break;
				}
			}
		}
	}
	//Potser només tinc una capa al servidor, en aquest cap form.sel_capes no és un array i no puc fer sel_capes.length
	if(form.sel_capes.length!=null)
	{
		for(i=0; i<form.sel_capes.length; i++)
		{
			if(form.sel_capes[i].checked)  //Si la capa està seleccionada l'afegeix-ho al navegador
			{
				if(!alguna_capa_afegida)
					alguna_capa_afegida=true;
				i_capa=form.sel_capes[i].value;				
				format=eval("form.format_capa_"+i_capa);
				format_get_map=servidorGC.formatGetMap[format.options[format.selectedIndex].value];
				if(servidorGC.layer[i_capa].estil && servidorGC.layer[i_capa].estil.length>0)
				{
					estil = new Array();
					for(j=0; j<servidorGC.layer[i_capa].estil.length; j++)
					{
						estil[estil.length]=new CreaEstil(servidorGC.layer[i_capa].estil[j].nom,
											(servidorGC.layer[i_capa].estil[j].desc ?servidorGC.layer[i_capa].estil[j].desc: servidorGC.layer[i_capa].estil[j].nom),
												  null,
												  "I",
												  null,
												  null,
												  0);					
					}
				}
				else
					estil=null;			
				if(servidorGC.layer[i_capa].CostatMinim && servidorGC.layer[i_capa].CostatMinim>=zoom[zoom.length-1].costat)	
					minim=servidorGC.layer[i_capa].CostatMinim;
				else
					minim=zoom[zoom.length-1].costat;
				if(servidorGC.layer[i_capa].CostatMaxim && servidorGC.layer[i_capa].CostatMaxim<=zoom[0].costat)	
					maxim=servidorGC.layer[i_capa].CostatMaxim;
				else
					maxim=zoom[0].costat;
								
				if(i_on_afegir==-1)
					k=capa.length;
				else
				{
					for(k=i_on_afegir; k<capa.length; k++)
						capa[k].ordre=capa[k].ordre+1;
					k=i_on_afegir;				
				}
												
				capa[capa.length]=new CreaCapa(servidorGC.servidor, //servidor 
										   servidorGC.versio, //versio
										   servidorGC.tipus, //tipus
										   servidorGC.layer[i_capa].nom, //nom
										   servidorGC.layer[i_capa].desc, //descripcio
										   new Array(ParamCtrl.ImatgeSituacio[ParamInternCtrl.ISituacio].EnvTotal.CRS), //crs
										   null, //env_total
										   format_get_map, //format_imatge
										   (format_get_map=="image/jpeg") ? opac : transparent,	//Transparència
										   minim,	//CostatMinim
										   maxim,	//CostatMaxim
										   null, 	//tile matrix set			
										   (i_get_featureinfo==-1 ? null :servidorGC.formatGetFeatureInfo[i_get_featureinfo]), 
										   null, //grup
										   null, //separa
										   (servidorGC.layer[i_capa].desc ? servidorGC.layer[i_capa].desc : servidorGC.layer[i_capa].nom), //desc llegenda
										   estil, 
										   0, //i_estil
										   (estil && estil.length>0) ? 1: 0,  //ncol_estil
										   no, //lleg_desplegada
										   si, //visible_a_la_llegend
										   si, //visible
										   (i_get_featureinfo!=-1 && servidorGC.layer[i_capa].consultable)? si : no,   //consultable
										   no, //descarregable
										   null,  //param_coverage
										   null, //format_coverage
										   null, //res_coverage
										   null,  //metadades
										   null, //nom vídeo
										   null, //desc vídeo
										   servidorGC.layer[i_capa].FlagsData, 
										   servidorGC.layer[i_capa].data, 
										   servidorGC.layer[i_capa].i_data, 
										   (servidorGC.layer[i_capa].data)? si|multitime: no, //animable
										   null);  //process
				capa[capa.length-1].ordre=k;
				if (ParamCtrl.FlagsLlegenda&amaga_segons_escala && !EsCapaDinsRangDEscalesVisibles(capa[capa.length-1]))
					   alert(DonaCadena3("La nova capa afegida, \'"+capa[capa.length-1].nom+"\' no és visible al nivell de zoom actual del navegador",
										 "La nueva capa añadida, \'"+capa[capa.length-1].nom+"\' no es visible al nivel de zoom actual del navegador",
										 "The new layer added, \'"+capa[capa.length-1].nom+"\' is not visible in the current zoom level of the browser"));
				if(i_on_afegir!=-1)
				{
					capa.sort(OrdenaOrdreVisualitzacio);
					i_on_afegir++;
				}				
			}
		}
	}
	else
	{
		if(form.sel_capes.checked)  //Si la capa està seleccionada l'afegeix-ho al navegador
		{
			if(!alguna_capa_afegida)
				alguna_capa_afegida=true;
			i_capa=form.sel_capes.value;				
			format=eval("form.format_capa_"+i_capa);
			format_get_map=servidorGC.formatGetMap[format.options[format.selectedIndex].value];
			if(servidorGC.layer[i_capa].estil && servidorGC.layer[i_capa].estil.length>0)
			{
				estil = new Array();
				for(j=0; j<servidorGC.layer[i_capa].estil.length; j++)
				{
					estil[estil.length]=new CreaEstil(servidorGC.layer[i_capa].estil[j].nom,
											(servidorGC.layer[i_capa].estil[j].desc ?servidorGC.layer[i_capa].estil[j].desc: servidorGC.layer[i_capa].estil[j].nom),
											  null,
											  "I",
											  null,
											  null,
											  0);					
				}
			}
			else
				estil=null;			
			if(servidorGC.layer[i_capa].CostatMinim && servidorGC.layer[i_capa].CostatMinim>=zoom[zoom.length-1].costat)	
				minim=servidorGC.layer[i_capa].CostatMinim;
			else
				minim=zoom[zoom.length-1].costat;
			if(servidorGC.layer[i_capa].CostatMaxim && servidorGC.layer[i_capa].CostatMaxim<=zoom[0].costat)	
				maxim=servidorGC.layer[i_capa].CostatMaxim;
			else
				maxim=zoom[0].costat;
			
			if(i_on_afegir==-1)
				k=capa.length;
			else
			{
				for(k=i_on_afegir; k<capa.length; k++)
					capa[k].ordre=capa[k].ordre+1;
				k=i_on_afegir;				
			}
				
			capa[capa.length]=new CreaCapa(servidorGC.servidor, //servidor 
									   servidorGC.versio, //versio
									   servidorGC.tipus, //tipus
									   servidorGC.layer[i_capa].nom, //nom
									   servidorGC.layer[i_capa].desc, //descripcio
									   new Array(ParamCtrl.ImatgeSituacio[ParamInternCtrl.ISituacio].EnvTotal.CRS), //crs
									   null, //env_total
									   format_get_map, //format_imatge
									   (format_get_map=="image/jpeg") ? opac : transparent,	//Transparència
									   minim,	//CostatMinim
									   maxim,	//CostatMaxim
									   null, //tileMatrixSet				
									   (i_get_featureinfo==-1 ? null :servidorGC.formatGetFeatureInfo[i_get_featureinfo]), 
									   null, //grup
									   null, //separa
									   (servidorGC.layer[i_capa].desc ? servidorGC.layer[i_capa].desc : servidorGC.layer[i_capa].nom), //desc_llegenda
									   estil, 
									   0, //i_estil
									   (estil && estil.length>0) ? 1: 0,  //ncol_estil
									   no, //lleg_desplegada
									   si, //visible_a_la_llegend
									   si, //visible
									   (i_get_featureinfo==-1 && servidorGC.layer[i_capa].consultable)? no : si, //consultable
									   no, //descarregable
									   null, //param_coverage
									   null, //format_coverage
									   null, //res_coverage
									   null, //md
									   null, //nom vídeo
									   null, //desc vídeo
									   servidorGC.layer[i_capa].FlagsData, 
									   servidorGC.layer[i_capa].data, 
									   servidorGC.layer[i_capa].i_data, 
									   (servidorGC.layer[i_capa].data)? si|multitime: no, //animable
									   null);  //process
			capa[capa.length-1].ordre=k;
			if (ParamCtrl.FlagsLlegenda&amaga_segons_escala && !EsCapaDinsRangDEscalesVisibles(capa[capa.length-1]))
					   alert(DonaCadena3("La nova capa afegida, \'"+capa[capa.length-1].nom+"\' no és visible al nivell de zoom actual del navegador",
										 "La nueva capa añadida, \'"+capa[capa.length-1].nom+"\' no es visible al nivel de zoom actual del navegador",
										 "The new layer added, \'"+capa[capa.length-1].nom+"\' is not visible in the current zoom level of the browser"));
			if(i_on_afegir!=-1)
			{
				capa.sort(OrdenaOrdreVisualitzacio);
				i_on_afegir++;
			}			
		}
	}
	if(alguna_capa_afegida)
	{
		/*Si s'ha afegit alguna capa de servidor extern, relaxo les 
                limitacions d'àmbit de navegació per poder-me sortir del mapa 
		de situació. En realitat, el que voldria programar és que si la
                capa que afegixo se surt del àmbit "relaxo" però si no, doncs no
		però no sembla que NJ llegeixi l'àmbit de la capa i per això 
		decideixo fer-ho més general*/
		ParamCtrl.flags|=relaxa_ambit_visualitzacio;
                //Redibuixo el navegador perquè les noves capes siguin visibles
		CreaParamInternCtrlCapa();
		RevisaEstatsCapes();
		CreaLlegenda();
		RepintaMapesIVistes();
	}
}//Fi de AfegirCapesAlNavegador


function TancaFinestra_afegirCapa()
{
	hideFinestraLayer(this, "afegirCapa");
}//Fi de TancaFinestra_afegirCapa()

function SeleccionaTotesLesCapesDelServidor(form)
{
var i;

	if(form.sel_capes.length!=null)
	{
		if(form.seltotes_capes.checked=="1") //Seleccionar totes les capes
		{
			for(i=0; i<form.sel_capes.length; i++)
				form.sel_capes[i].checked=true;
		}
		else //Deseleccionar totes les capes
		{
			for(i=0; i<form.sel_capes.length; i++)
				form.sel_capes[i].checked=false;
		}
	}
	else
	{
		if(form.seltotes_capes.checked=="1") //Seleccionar totes les capes
		{
			form.sel_capes.checked=true;
		}
		else //Deseleccionar totes les capes
		{
			form.sel_capes.checked=false;
		}
	}
}


var ajaxGetCapabilities=new Array();
var ServidorGetCapabilities=new Array();

function CreaServidorGetCapabilities(servidor, win, index, i_capa)
{	
	this.win=win;
	this.index=index;
	this.i_capa_on_afegir=i_capa;
	this.servidor=servidor;
	this.versio=null;
	this.tipus=TipusWMS;
	this.titol=null;
	this.formatGetMap=new Array();
	this.formatGetFeatureInfo=new Array();
	this.layer=new Array();
}

function CreaCapaServidor()
{
	this.nom = null;
	this.desc = null;
	this.CostatMinim = null;
	this.CostatMaxim = null;	
	this.consultable = false;
	this.estil = new Array();
	this.FlagsData=0;
	this.i_data=0;
	this.data=null;
}

function LlegeixLayer(servidorGC, node, sistema_ref_comu, pare)
{
var i, j;	
var node2;
var trobat=false;
var cadena, cadena2;
var minim, maxim;
var factor_k, factorpixel;
	
	//Llegeixo les capacitats d'aquesta capa
	//Començo pel sistema de referència
	//versió 1.0.0, 1.1.0 i 1.1.1 en l'estil antic --> un únic element amb els diversos sistemes de referència separats per espais (SRS)
    //versió 1.1.1 en l'estil nou--> un element per cada sistema de referència (SRS)
	//versió major a 1.1.1 --> un element per cada sistema de referència (CRS)	
	
	
	if(DonaUnitatsCoordenadesProj(ParamCtrl.ImatgeSituacio[ParamInternCtrl.ISituacio].EnvTotal.CRS)=="°")
	{
		factor_k=120000*1000/0.28;  //pas de graus a mm dividit per la mida de píxel
		factorpixel=120000; // de graus a metres
	}
	else //if(unitats=="m")
	{
		factor_k=1000/0.28;  // pas de m a mm dividit per la mida de píxel
		factorpixel=1; //de m a m
	}

	//Això no ho puc usar perquè em dona els elements SRS de node i dels seus fills node.getElementsByTagName('SRS');	 
	for(i=0; i<node.childNodes.length; i++)
	{
		node2=node.childNodes[i];
		if(node2.nodeName=="SRS" || node2.nodeName=="CRS")
		{
			cadena=node2.childNodes[0].nodeValue;
			if(cadena)
			{
				cadena=cadena.toUpperCase();
				cadena2=ParamCtrl.ImatgeSituacio[ParamInternCtrl.ISituacio].EnvTotal.CRS.toUpperCase();
				if(cadena.search(cadena2)!=-1)
				{
					//·$·Aqui s'haurà de fer alguna cosa amb els sinònims,...
					trobat=true;
					break;
				}
			}
		}
	}
	if(trobat || sistema_ref_comu)
	{
		for(i=0; i<node.childNodes.length; i++)
		{
			node2=node.childNodes[i];
			if(node2.nodeName=="Name")
			{
				//Llegeix-ho la capa si té name
				servidorGC.layer[servidorGC.layer.length]=new CreaCapaServidor();				
				servidorGC.layer[servidorGC.layer.length-1].nom=node2.childNodes[0].nodeValue;
				//hereto les coses del pare
				if(pare)
				{
					if(pare.consultable) 
						servidorGC.layer[servidorGC.layer.length-1].consultable=true;
					if(pare.estil)
					{
						for(j=0; j<pare.estil.length; j++)
							servidorGC.layer[servidorGC.layer.length-1].estil[servidorGC.layer[servidorGC.layer.length-1].estil.length]=pare.estil[j];
					}
					servidorGC.layer[servidorGC.layer.length-1].CostatMinim=pare.CostatMinim;
					servidorGC.layer[servidorGC.layer.length-1].CostatMaxim=pare.CostatMaxim;
				}
				break;
			}
		}

		if(i<node.childNodes.length)  //vol dir que aquesta capa té name
		{
			var temps_defecte=null, valors_temps=null;
			for(i=0; i<node.childNodes.length; i++)
			{
				node2=node.childNodes[i];

				if(node2.nodeName=="Title")
				{
					servidorGC.layer[servidorGC.layer.length-1].desc=node2.childNodes[0].nodeValue;
				}
				else if(node2.nodeName=="Style")
				{
					node3=node2.getElementsByTagName('Name');
					if(node3 && node3.length>0)
					{
						cadena=node3[0].childNodes[0].nodeValue;
						node3=node2.getElementsByTagName('Title');
						if(node3 && node3.length>0)
							cadena2=node3[0].childNodes[0].nodeValue;
						servidorGC.layer[servidorGC.layer.length-1].estil[servidorGC.layer[servidorGC.layer.length-1].estil.length]=new CreaNomIDescripcio(cadena, cadena2);
					}
				}
				else if(node2.nodeName=="ScaleHint")
				{
					minim=parseInt(node2.getAttribute('min'),10);
					maxim=parseInt(node2.getAttribute('max'),10);
					if(minim)
						servidorGC.layer[servidorGC.layer.length-1].CostatMinim=minim/Math.SQRT2;
					if(maxim)
						servidorGC.layer[servidorGC.layer.length-1].CostatMaxim=maxim/Math.SQRT2;
				}
				else if(node2.nodeName=="MinScaleDenominator")
				{
					minim=parseInt(node2.childNodes[0].nodeValue, 10);				
					if(minim)
						servidorGC.layer[servidorGC.layer.length-1].CostatMinim=minim*factorpixel/factor_k;
				}
				else if(node2.nodeName=="MaxScaleDenominator")
				{
					maxim=parseInt(node2.childNodes[0].nodeValue, 10);
					if(maxim)
						servidorGC.layer[servidorGC.layer.length-1].CostatMaxim=maxim*factorpixel/factor_k;
				}
				else if ((node2.nodeName=="Dimension" || node2.nodeName=="Extent") && node2.getAttribute('name').toLowerCase()=='time')
				{
					temps_defecte=node2.getAttribute('default');
					if(node2.childNodes.length>0)
						valors_temps=node2.childNodes[0].nodeValue;
				}
			}	
			//Miro si és consultable
			if(node.getAttribute('queryable')=='1') 
			{
				servidorGC.layer[servidorGC.layer.length-1].consultable=true;			
			}
			if(valors_temps!=null)
			{
				if(valors_temps.search("/")==-1)  //Si és un interval (!=-1) de moment no li dono suport ·$·
				{
					var data_defecte=null;
					var dates;
					//És una capa multitemporal
					//valors_temps és una cadena que pot contenir un únic valor, una llista de valors separats per coma o un interval amb període
					//yyyy-mm-ddThh:mm:ss.sssZ
					if(temps_defecte)
					{
						data_defecte=new Date();
						OmpleDateAPartirDeDataISO8601(data_defecte, temps_defecte);
					}
					servidorGC.layer[servidorGC.layer.length-1].data=new Array();			
					dates=valors_temps.split(",");
					for(i=0; i<dates.length; i++)
					{
						servidorGC.layer[servidorGC.layer.length-1].data[servidorGC.layer[servidorGC.layer.length-1].data.length]=new Date();			
						if(i==0)
						{
							servidorGC.layer[servidorGC.layer.length-1].FlagsData=OmpleDateAPartirDeDataISO8601(
														servidorGC.layer[servidorGC.layer.length-1].data[servidorGC.layer[servidorGC.layer.length-1].data.length-1],
														dates[i]);
						}
						else
							OmpleDateAPartirDeDataISO8601(servidorGC.layer[servidorGC.layer.length-1].data[servidorGC.layer[servidorGC.layer.length-1].data.length-1],
														dates[i]);
						if(data_defecte &&
						   servidorGC.layer[servidorGC.layer.length-1].data[servidorGC.layer[servidorGC.layer.length-1].data.length-1]==data_defecte)
							servidorGC.layer[servidorGC.layer.length-1].i_data=servidorGC.layer[servidorGC.layer.length-1].data.length-1;
					}
				}
			}
		}
	}	
	
	//Si aquesta layer té fills continuo llegint
	node2=node.getElementsByTagName('Layer');	
	if(node2)
	{
		var pare2=servidorGC.layer[servidorGC.layer.length-1];
		for(i=0; i<node2.length; i++)
			LlegeixLayer(servidorGC, node2[i], trobat, pare2);
	}		
}//Fi de LlegeixLayer()

function HiHaAlgunErrorDeParsejat(doc)
{
	if (doc.parseError && doc.parseError.errorCode != 0)
    {
	    alert("Error in line " + doc.parseError.line +
				" position " + doc.parseError.linePos +
				"\nError Code: " + doc.parseError.errorCode +
				"\nError Reason: " + doc.parseError.reason +
				"Error Line: " + doc.parseError.srcText);
	    return true;
    }
	else if (doc.documentElement.nodeName=="parsererror")
	{
		var errStr=doc.documentElement.childNodes[0].nodeValue;
		errStr=errStr.replace(/</g, "&lt;");
		alert(errStr);
		return true;
	}
	return false;
}

function ParsejaRespostaGetCapabilities(doc, servidorGC)
{
var root;
var cadena;
var node, node2;
var i;
var cdns=new Array();
	
	if(!doc) 
	{
		alert(DonaCadena3("No s'ha obtingut cap resposta vàlida del servidor sol·licitat", 
						  "No se ha obtenido ninguna respuesta válida del servidor solicitado",
						  "Cannot obtain any valid response of server"));
		return;	
	}
	if(HiHaAlgunErrorDeParsejat(doc))
		return;
	root=doc.documentElement;		
	if(!root) 
	{
		alert(DonaCadena3("No s'ha obtingut cap resposta vàlida del servidor sol·licitat", 
						  "No se ha obtenido ninguna respuesta válida del servidor solicitado",
						  "Cannot obtain any valid response of server"));
		return;
	}

	//Cal comprovar que és un document de capacitats, potser és un error, en aquest cas el llegeix-ho i el mostraré directament
	if(root.nodeName!="WMT_MS_Capabilities")
	{
		alert(DonaCadena3("No s'ha obtingut cap resposta vàlida del servidor sol·licitat", 
						  "No se ha obtenido ninguna respuesta válida del servidor solicitado",
						  "Cannot obtain any valid response of server"));
		//·$· mirar de possar el que ens ha retornat el servidor
		return;
	}
	
	//Obtinc la versió de les capacitats
	cadena=root.getAttribute('version');	
	servidorGC.versio=new CreaVersio(cadena.substr(0,1), cadena.substr(2,1), cadena.substr(4));
	
	//Obtinc el títol del servidor
	servidorGC.titol=(root.getElementsByTagName('Service')[0]).getElementsByTagName('Title')[0].childNodes[0].nodeValue;
	
	
	//Selecciono el node request
	node=(root.getElementsByTagName('Capability')[0]).getElementsByTagName('Request')[0];
	
	//Formats de visualització
	if(servidorGC.versio.Vers==1 && servidorGC.versio.SubVers==0)
	{
		node2=(node.getElementsByTagName('Map')[0]).getElementsByTagName('Format');
		for(i=0; i<node2[0].childNodes.length; i++)
		{
			cadena=node2[0].childNodes[i].nodeName;
			if(cadena.search(/JPEG/i)!=-1)
				servidorGC.formatGetMap[servidorGC.formatGetMap.length]="image/jpeg";
			else if(cadena.search(/GIF/i)!=-1)
				servidorGC.formatGetMap[servidorGC.formatGetMap.length]="image/gif";
			else if(cadena.search(/PNG/i)!=-1)
				servidorGC.formatGetMap[servidorGC.formatGetMap.length]="image/png";
		}
	}
    else
	{
		node2=(node.getElementsByTagName('GetMap')[0]).getElementsByTagName('Format');
		for(i=0; i<node2.length; i++)
		{
			cadena=node2[i].childNodes[0].nodeValue;
			if(cadena)
				servidorGC.formatGetMap[servidorGC.formatGetMap.length]=cadena;		
		}
	}
	
	//Formats de consulta
	if(servidorGC.versio.Vers==1 && servidorGC.versio.SubVers==0)
	{
		node2=node.getElementsByTagName('FeatureInfo')[0];
		if(node2)
		{
			node2=node2.getElementsByTagName('Format');
			for(i=0; i<node2[0].childNodes.length; i++)
			{
				cadena=node2[0].childNodes[i].nodeName;
				if(cadena)
				{
					if(cadena.search(/XML/i)!=-1)
						servidorGC.formatGetFeatureInfo[servidorGC.formatGetFeatureInfo.length]="text/xml";
					else if(cadena.search(/HTML/i)!=-1)
						servidorGC.formatGetFeatureInfo[servidorGC.formatGetFeatureInfo.length]="text/html";
				}
			}
		}
	}
    else
	{
		node2=node.getElementsByTagName('GetFeatureInfo')[0];
		if(node2)
		{
			node2=node2.getElementsByTagName('Format');
			for(i=0; i<node2.length; i++)
			{
				cadena=node2[i].childNodes[0].nodeValue;
				if(cadena)
					servidorGC.formatGetFeatureInfo[servidorGC.formatGetFeatureInfo.length]=cadena;
			}
		}
	}
		
	//Llegeix-ho les capes disponibles en el sistema de referència actual del navegador
	node=root.getElementsByTagName('Capability')[0];
	for(i=0; i<node.childNodes.length; i++)
	{
		node2=node.childNodes[i];
		if(node2.nodeName=="Layer")  //És una layer que a dins pot tenir altres layers
		{
			//Si té name vol dir que és una capa de veritat, sinó és que és una capa d'agrupació
			LlegeixLayer(servidorGC, node2, false, null);
		}
	}
	if(servidorGC.layer.length>0)
	{
		cdns.push("<form name=\"AfegeixCapaServidor\">",
				"<div id=\"LayerAfegeixCapaServidor\" class=\"LayerAfegeixCapaServidor\" style=\"position:absolute;left:10px;top:10px;\">",
			  	"<span class=\"Verdana11px\"><b>",
			  	DonaCadena3("URL del servidor:", "URL del servidor:", "server URL:"),			  
			  	"</b></span><br><input type=\"text\" name=\"servidor\" readOnly class=\"input_url\" value=\"",
			  	servidorGC.servidor, "\">",
				  "<br><br><span class=\"Verdana11px\"><b>",
				  DonaCadena3("T&iacute;tol", "T&iacute;tulo", "Title"),
				  "</b><br></span><input type=\"text\" name=\"TitolServidor\" class=\"input_url\"");
		if(servidorGC.titol)
	  		cdns.push(" value=\"",servidorGC.titol, "\"");
		cdns.push("><br><br><hr><br><div class=\"layerselectorcapesafegir\">",
				  "<span class=\"Verdana11px\"><b>",DonaCadena3("Capes","Capas","Layers"),"</b><br>",
				  "<input name=\"seltotes_capes\" onclick=\"SeleccionaTotesLesCapesDelServidor(form);\" type=\"checkbox\">", 
				  DonaCadena3("Seleccionar totes les capes", "Seleccionar todas las capas", "Select all layers"), "<br><br><table class=\"Verdana11px\">");
		for(i=0; i<servidorGC.layer.length; i++)
		{
			cdns.push("<tr><td><input name=\"sel_capes\" value=\"", i, "\" type=\"checkbox\">", 
					(servidorGC.layer[i].desc? servidorGC.layer[i].desc : servidorGC.layer[i].nom));
			cdns.push("</td><td><select name=\"format_capa_", i, "\" class=\"Verdana11px\">");
			for(j=0; j<servidorGC.formatGetMap.length; j++)
				cdns.push("<option value=\"", j, "\">",  servidorGC.formatGetMap[j]);
			cdns.push("</select></td></tr>");
		}
		cdns.push("</table></div><br>",
				  "<input type=\"button\" class=\"Verdana11px\" value=\"",				
				  DonaCadena3("Afegir\"", "A&ntilde;adir\"", "Add\""), 
				  " onClick=\"AfegirCapesAlNavegador(form, ",servidorGC.index,");TancaFinestra_afegirCapa();\">",
				  "<input type=\"button\" class=\"Verdana11px\" value=\"",				
				  DonaCadena3("Cancel·lar\"", "Cancelar\"", "Cancel\""), 
				  " onClick=\"TancaFinestra_afegirCapa();\">",				  
				  "</div></form>");
		cadena=cdns.join("");
		
		if (isFinestraLayer(servidorGC.win, "afegirCapa"))
		{
			showFinestraLayer(servidorGC.win, "afegirCapa");
			var elem=getLayer(servidorGC.win, "afegirCapa_finestra");
			contentLayer(elem, cadena);
		}
	}
	else
	{
		alert(DonaCadena3("Aquest servidor no té cap capa disponible en el sistema de referència actual del navegador",
						  "Este servidor no tiene ninguna capa disponible en el sistema de referéncia actual del navegador",
						  "This server don't have any layer in the browser actual reference system"));
	}
}//Fi de ParsejaRespostaGetCapabilities()

function FesPeticioCapacitatsIParsejaResposta(form, i_capa)
{
var servidor=form.servidor.value;
var request;
	
	if(servidor)
		servidor=DonaCadenaSenseEspaisDavantDarrera(servidor);
	
	if(!servidor || servidor=="")
	{
		
		//·$· Crec que caldria mirar més a fons que l'adreça sigui vàlida
		alert(DonaCadena3("Cal indicar una adreça vàlida", "Se debe indicar una dirección válida", "Its necessary indicated a valid URL"));
		return;
	}
	ajaxGetCapabilities[ajaxGetCapabilities.length]=new Ajax();
	var i=ServidorGetCapabilities.length;
	ServidorGetCapabilities[ServidorGetCapabilities.length]=new CreaServidorGetCapabilities(servidor, this, i, i_capa);
	
	
	request=AfegeixNomServidorARequest(servidor, "REQUEST=GetCapabilities&VERSION=1.1.0&SERVICE=WMS", true);	
	ajaxGetCapabilities[ajaxGetCapabilities.length-1].doGet(request, 															
															ParsejaRespostaGetCapabilities, "text/xml", 
															ServidorGetCapabilities[ServidorGetCapabilities.length-1]);		
}//Fi de FesPeticioCapacitatsIParsejaResposta


function ActualitzaLlistaServSegonsCategoriaSel(form)
{
var nova_opcio;
var i, j;

	var categoria_sel=form.llista_cat_serveis_OWS.options[form.llista_cat_serveis_OWS.selectedIndex].value;
	DonaCadena(LlistaServOWS[0].categoria.desc).toLowerCase();
	form.llista_serveis_OWS.options.length=0;
	i=0;
	while( i<LlistaServOWS.length && categoria_sel!=DonaCadena(LlistaServOWS[i].categoria.desc).toLowerCase())
		i++;
	j=0;
	form.llista_serveis_OWS.options[j]=new Option(DonaCadena3("--Seleccciona'n un de la llista--", "--Escoja uno de la lista--", "--Choose one from list--"), "");
	j++;	
	while(i<LlistaServOWS.length && categoria_sel==DonaCadena(LlistaServOWS[i].categoria.desc).toLowerCase())
	{
		form.llista_serveis_OWS.options[j]=new Option(DonaCadena(LlistaServOWS[i].nom), LlistaServOWS[i].url);
		j++;
		i++;		
	}

}

function MostraServidorSeleccionatDeLlistaOWSAEdit(form)
{
var url_a_mostrar;
	if(form.llista_serveis_OWS.selectedIndex>0)
		url_a_mostrar=form.llista_serveis_OWS.options[form.llista_serveis_OWS.selectedIndex].value;
	if(url_a_mostrar)
		form.servidor.value=url_a_mostrar;
}

function OrdenacioServOWSPerCategoriaINom(a,b) {
	//Ascendent per identificador i descendent per data
    var x = DonaCadena(a.categoria.desc).toLowerCase();
    var y = DonaCadena(b.categoria.desc).toLowerCase();
	if( x < y) 
		return -1;
	if( x > y) 
		return 1;
	//Si són iguals ho ordeno pel nom
	x = DonaCadena(a.nom).toLowerCase();
    y = DonaCadena(b.nom).toLowerCase();
    return ((x < y) ? -1 : ((x > y) ? 1 : 0));
}

function PreparaLlistaServidorsOWS()
{
	for(var i=0; i<LlistaServOWS.length; i++)
	{
		if(LlistaServOWS[i].categoria==null || DonaCadena(LlistaServOWS[i].categoria.desc)==null)
			LlistaServOWS[i].categoria= new CreaNomIDescripcio("Altres", new CadenaMultiIdioma("ZZAltresZZ", "ZZOtrosZZ", "ZZOthersZZ"));		
	}
	LlistaServOWS.sort(OrdenacioServOWSPerCategoriaINom);
}//Fi de PreparaLlistaServidorsOWS()


function DonaCadenaAfegeixCapaServidor(elem, url, i_capa, tanca_div)
{
var cdns=new Array();
var i;

	cdns.push("<div id=\"LayerAfegeixCapaServidor\" class=\"LayerAfegeixCapaServidor\" style=\"position:absolute;left:10px;top:10px;\">",
			  "<span class=\"Verdana11px\">",
			  DonaCadena3("Especifica l'adreça URL del servidor:", "Especifique la dirección URL del servidor:", "Specify the server URL:"),			  
			  "</span><br><input type=\"text\" name=\"servidor\" class=\"input_url\" value=\"",
			  (url ? url: "http://"), "\">",
			  "<input type=\"button\" class=\"Verdana11px\" value=\"",				
	     	  DonaCadena3("Acceptar\"", "Aceptar\"", "OK\""), 
	          " onClick=\"FesPeticioCapacitatsIParsejaResposta(AfegeixCapaServidor,",i_capa,");\">");
	if(LlistaServOWS && LlistaServOWS.length)
	{
		cdns.push("<br><br><span class=\"Verdana11px\">",
				  DonaCadena3("o Seleccciona'n un de la llista de serveis", "o Escoja uno de la lista de servicios", "or Choose one from service list"),
				  "</span><br>",				  
				  "<select name=\"llista_cat_serveis_OWS\" id=\"llista_cat_serveis_OWS\" class=\"Verdana11px\"",
				  " onChange=\"ActualitzaLlistaServSegonsCategoriaSel(form);\">");
		var categoria_previa="";
		for(i=0;i<LlistaServOWS.length; i++)
		{			
			if(categoria_previa!=DonaCadena(LlistaServOWS[i].categoria.desc).toLowerCase())
			{
				categoria_previa=DonaCadena(LlistaServOWS[i].categoria.desc).toLowerCase();
				if(categoria_previa==DonaCadena3("ZZAltresZZ", "ZZOtrosZZ", "ZZOthersZZ").toLowerCase())
					cdns.push("<option value=\"", categoria_previa, "\">",  DonaCadena3("Altres", "Otros", "Others"));																		
				else
					cdns.push("<option value=\"", categoria_previa, "\">",  DonaCadena(LlistaServOWS[i].categoria.desc));																		
			}
		}
		cdns.push("</select><br><br>",
   		  		  "<select name=\"llista_serveis_OWS\" id=\"llista_serveis_OWS\" class=\"Verdana11px\"",
				  " onChange=\"MostraServidorSeleccionatDeLlistaOWSAEdit(form);\">");
		var categoria_sel=DonaCadena(LlistaServOWS[0].categoria.desc).toLowerCase();
		i=0;
		cdns.push("<option value=\"\">",  DonaCadena3("--Seleccciona'n un de la llista--", "--Escoja uno de la lista--", "--Choose one from list--"));
		while(categoria_sel==DonaCadena(LlistaServOWS[i].categoria.desc).toLowerCase())
		{
			cdns.push("<option value=\"", LlistaServOWS[i].url, "\">",  DonaCadena(LlistaServOWS[i].nom));
			i++;
		}
		cdns.push("</select>");
	}
	if(tanca_div)
		cdns.push("</div>");
	return cdns.join("");
}//Fi de DonaCadenaAfegeixCapaServidor()

function FinestraAfegeixCapaServidor(elem, i_capa)
{
var cdns=new Array();
var s;

	cdns.push("<form name=\"AfegeixCapaServidor\">");
	cdns.push(DonaCadenaAfegeixCapaServidor(elem, null, i_capa, true));
	cdns.push("</form>");
	s=cdns.join("");
	contentLayer(elem, s);

}//Fi de FinestraAfegeixCapaServidor

function IniciaFinestraAfegeixCapaServidor(i_capa)
{
	if (isFinestraLayer(this, "afegirCapa"))
	{
		showFinestraLayer(this, "afegirCapa");
		var elem=getLayer(this, "afegirCapa_finestra");
		FinestraAfegeixCapaServidor(elem, i_capa);		
	}
	else  //missatge error
	{
		alert(DonaCadena3("No s'ha definit la layer de tipus finestra 'afegirCapa' i per tant no es pot usar la funcionalitat d'afegir capes al navegador",
						  "No se ha definido la layer de tipo ventana 'afegirCapa' y en consecuencia no se puede usar la funcionalidad de añadir capas al navegador",
						  "The layer 'afegirCapa' don't has defined and its not possible use the funcionality add layer to browser"));						  
	}
	
}//Fi de IniciaFinestraAfegeixCapaServidor()

