function CartografiaAssociada(sModul)
{
  var oExtMap=map.getExtent();
  var sUrl='http://urgell.terrassa.cat/mapserver/cartografia_associada.html?bbox=';
  
   sUrl+=oExtMap.getMinX()+',';
   sUrl+=oExtMap.getMinY()+',';
   sUrl+=oExtMap.getMaxX()+',';
   sUrl+=oExtMap.getMaxY();
   if (sModul) sUrl+='&modul='+sModul;
   
   window.open(sUrl,'cartografia_associada');
}
function CursorInOut(oElement,sBkColor,sColor)
{
   oElement.style.background=sBkColor;
   oElement.style.color=sColor;
}
function getDataActual()
{
  var data='';
  var mes = new Array();
  var dia = new Array();
  
	 mes[0]='1';	 mes[1]='2';
	 mes[2]='3';	 mes[3]='4';
	 mes[4]='5';	 mes[5]='6';
	 mes[6]='7';	 mes[7]='8';
	 mes[8]='9';	 mes[9]='10';
	 mes[10]='11';	 mes[11]='12';

	 dia[0]='Diumenge';	 dia[1]='Dilluns';
	 dia[2]='Dimarts';	 dia[3]='Dimecres';
	 dia[4]='Dijous';	 dia[5]='Divendres';
	 dia[6]='Dissabte';

	 today=new Date();
	 data=today.getDate() + '-' + mes[today.getMonth()] + '-' + today.getFullYear() ;
	 
	 return data;
}

function getHoraActual()
{
 var hora=new Date();
 var horaEntera = hora.getHours() + ':' + hora.getMinutes() + ':' + hora.getSeconds();
 
	 return horaEntera;
}

function createHTMLCapcelera(sRightElement)
{
  var sHTML='';
  var sStyle='';
  
	sStyle+='position: absolute;';
	sStyle+='left: 0;';
	sStyle+='top: 0;';
	sStyle+='z-index: 999;';
	sStyle+='color: #ffffff;';
	sStyle+='background-color: #e41915;';
	sStyle+='font-family: Arial, Helvetica, sans-serif;';
	sStyle+='font-size: 7.5pt;';
	sStyle+='font-weight: normal;';
	sStyle+='border-bottom: 1px solid #000000;';
    sHTML='<table cellpadding="0" cellspacing="0" border="0" style="'+sStyle+'" width="100%">';
	sHTML+='<tr>';
	sHTML+='<td align="left" width="38px" style="cursor:pointer;" onclick="document.location.href=\'http://www3.terrassa.cat\';"><img src="img_TerrassaCAT/escut.gif" alt="Ajuntament de Terrassa" width="38px" height="29px" /></td>';
	sHTML+='<td>';
	sHTML+='<table cellpadding="0" cellspacing="0" border="0" height="19px" style="color:#ffffff;"><tr>';
	sHTML+='<td align="center" valign="middle" style="border-right: 1px solid #e88280;">&nbsp;&nbsp;'+getDataActual()+'&nbsp;&nbsp;</td>';
	sHTML+='<td align="center" valign="middle" style="border-right: 1px solid #e88280;">&nbsp;&nbsp;'+getHoraActual()+'&nbsp;&nbsp;</td>';
	sHTML+='<td style="display:none" align="center" valign="middle">&nbsp;&nbsp;<img src="img_TerrassaCAT/sol.gif" alt="Assolellat" style="vertical-align:middle;padding-right:5px;">&nbsp;&nbsp;30ºc&nbsp;&nbsp;</td>';
	sHTML+='</tr></table></td>';
	sHTML+='<td align="right">'+sRightElement+'</td>';
	sHTML+='</tr></table>';
	
	return sHTML;
}
function GotoLocation(themap)
{
	var sSearchStr=document.location.search;
	var sSubCmds,sParseParams,sPar;
	var strArray;
	var x=0,y=0,adr1='';
	var sCarrer='',sNro='';
	var fet=0;
	
		if (sSearchStr.length>0)
		{
		  sSubCmds=sSearchStr.substr(1);
		  sParseParams=sSubCmds.split('&');
		  for(i=0;i<sParseParams.length;i++)
			{
			  sPar=sParseParams[i].split('=');
			  if (sPar[0].toUpperCase()=='ADR1') adr1=sPar[1];
			  if (sPar[0].toUpperCase()=='X') x=sPar[1];
			  if (sPar[0].toUpperCase()=='Y') y=sPar[1];
			  if (sPar[0].toUpperCase()=='ERROR') alert('Missatge:\n'+unescape(sPar[1]));
			  if (sPar[0].toUpperCase()=='BBOX')
				{
				strArray=sPar[1].split(',');
				var catExtent=new NExtent(new NPoint(strArray[0],strArray[1]), new NPoint(strArray[2],strArray[3]));
				themap.centerToExtent(catExtent);
				fet=1;
				break;
				}
			  if (sPar[0].toUpperCase()=='CARRER') sCarrer=unescape(sPar[1]);
			  if (sPar[0].toUpperCase()=='NRO') sNro=unescape(sPar[1]);
			}
		}
		if (adr1!='') {fet=1; centraPortal(x,y,unescape(adr1));}
		if (sCarrer!='') {fet=1; fullExtent(themap); global_InputNro=sNro; document.getElementById('txtNomCarrer').value=sCarrer; BuscaCarrer();}
		if (fet==0) fullExtent(themap);
}		
function ClearElements(obj)
{

	 document.getElementById('tblInputNro').innerHTML='&nbsp;';
	 document.getElementById('txtNomCarrer').style.width='200px';
	 ClearProcessingTag('tagSearch');
	 obj.value='';
	 if (global_Canvas) global_Canvas.reset();
	 hideSPOT(true);
} 
function ClearProcessingTag(sTag)
{
  var oTag=document.getElementById(sTag);
  
   if (oTag) oTag.innerHTML='&nbsp;';
}
function TestKeyCarrer(e)
{
    var iKeyCode=(e) ? e.keyCode: ((window.event)?window.event.keyCode:0);
  
     if (iKeyCode==13) BuscaCarrer();
}
function TestNro(e)
{
    var iKeyCode=(e) ? e.keyCode: ((window.event)?window.event.keyCode:0);
  
     if (iKeyCode==13) BuscarNroonTable();
}
function BuscaCarrer()
{
    var sStringSearch;
    var sUrl;

	 if (document.getElementById('txtNro')) {BuscarNroonTable(); return;} // Recerca nro activada
	 sUrl='method=buscaCarrer&tipus=1&nom=';
	 sStringSearch=document.getElementById('txtNomCarrer').value.trim();
	 if (sStringSearch=='') alert('Cal entrar una part del texte.');
		else {
				sUrl+=ParseNomCarrer(sStringSearch);
				CallWebServiceAdreces(sUrl,'tagSearch','Buscant carrers...',WSReturn_Carrers);
			  }
}
function ShowProcessingTag(sTag,sMsg)
{
  var oTag=document.getElementById(sTag);
  var sText='<img src="img_TerrassaCAT/progress.gif" alt="en marxa..." title="en marxa..."> '+sMsg;
  
   if (oTag) oTag.innerHTML=sText;
   return sText;
}
String.prototype.trim = function()
{
    // Use a regular expression to replace leading and trailing 
    // spaces with the empty string
    return this.replace(/(^\s*)|(\s*$)/g, "");
}

function ParseNomCarrer(nom)
{
  var sCars;  
  var sCard;
  var I;
  var CarI;
  var CarO;

  sCars = ' áéíóúàèìòùäëïöü-.·\'ñç';  
  sCard = ' aeiouaeiouaeiou    ñç';

   nom=nom.toLowerCase();
   for(I=0;I<sCars.length;I++)
     {
       CarI=sCars.substring(I,I+1);
       CarO=sCard.substring(I,I+1);
       if (CarO==' ') CarO='';
       if (CarO=='ñ') CarO='nzz';
       if (CarO=='ç') CarO='czz';
       while (nom.indexOf(CarI)!=-1) nom=nom.replace(CarI,CarO);
     }
   nom=nom.toUpperCase();

   return nom;
}

function ParseNro(num)
{
  var Bis='';
  var HiHaBis;
  
        num=num.toUpperCase();
        Bis=' ';
        HiHaBis=num.substring(num.length-1,num.length);
        if ('ABCDEFGHIJKLMNOPQRSTUVWXYZ'.indexOf(HiHaBis)!=-1) 
          {
             Bis=HiHaBis;
             num=(num.substring(0,num.length-1)).split('-')[0];
          }
		  
	return num.trim()+'#'+Bis.trim();
}


var global_sCodiCarrer='';
var global_XMLNros=null;
var global_InputNro='';
var global_Canvas=null;

function BuscarNroonTable()
{
  var sNro=document.getElementById('txtNro').value.trim();
  
	if (sNro=='') {alert('Cal entrar un valor !'); return}
	
	sNro=ParseNro(sNro);
	var oNrosTbl=document.getElementById('nrosTable_'+sNro);
	if (oNrosTbl) 
	{ eval(oNrosTbl.onclick());}
	  else {alert('No existeix el valor entrat.');}
}
function TestNro(e)
  {
    var iKeyCode=(e) ? e.keyCode: ((window.event)?window.event.keyCode:0);
  
     if (iKeyCode==13) BuscarNroonTable();
  }
  
function BuscaCruilla(sXY,sAdr)
{
  var XYCoords=sXY.split('#');
  var sTxt='';
  
    if (sXY!='')
	{
		sTxt = document.getElementById('txtNomCarrer').value+' amb '+unescape(sAdr); 
		centraPortal(XYCoords[0],XYCoords[1],sTxt);
    }
}
function BuscaCarreriNumero(sXY,sAdr1)
{
  var XYCoords=sXY.split('#'); // IdPortal,X,Y
    if (sXY!='') centraPortal(XYCoords[1],XYCoords[2],unescape(sAdr1));
}

function Taula_Adreces_Cruilles(sTag,XMLAdr,XMLCru)
{
   var sHTMLAdr='';
   var sHTMLCru='';   
   var sId;
   var iIdPortal;
   var iNro;
   var sNro;
   var sAdr1;
   var sSigla;
   var sNomCarrer;
   var sNom;
   var sNomComplert;
   var dXCoord,dYCoord;
   var sTxt;
   var bTrobat=false;
   var oArrayRetorn;
   // Adreces....
	bTrobat=false;
	oArrayRetorn=AJT_ProcesaXMLDoc(XMLAdr);
	if (oArrayRetorn)
	  {
		var i;
		 sHTMLAdr+='';
		 sHTMLAdr+='<code>&nbsp;&nbsp;Adreces disponibles...&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;';
		 sHTMLAdr+='</code><div style="width:100%; height:65px; overflow:auto;">';
		 sHTMLAdr+='<table width="190px" align="left" cellpadding="0" cellspacing="0" border="0" class="normalText">';
		 for(i=0;i<oArrayRetorn.length;++i)
		 {
			sId=i;
			iIdPortal=(unescape(oArrayRetorn[i].idportal)).trim();
			iNro=(unescape(oArrayRetorn[i].numero)).trim();
			sNro=iNro+'#';
			if (oArrayRetorn[i].bis) sNro+=((unescape(oArrayRetorn[i].bis)).trim());
			dXCoord=(unescape(oArrayRetorn[i].xcoord)).trim();
			dYCoord=(unescape(oArrayRetorn[i].ycoord)).trim();
			sAdr1=(unescape(oArrayRetorn[i].adr1)).trim();

            sAdr1=sAdr1.replace(/ DEDE /g, ' DE '); // Extreure Error WebService
            sAdr1=sAdr1.replace(/ DELDEL /g, ' DEL ');
            sAdr1=sAdr1.replace(/ DE LESDE LES /g, ' DE LES ');
            sAdr1=sAdr1.replace(/ DE LADELA /g, ' DE LA ');
			
			if (iNro==-1) { i=Math.round(oArrayRetorn.length/2); sAdr1+=' - s/n -'; dXCoord=(unescape(oArrayRetorn[i].xcoord)).trim() ; dYCoord=(unescape(oArrayRetorn[i].ycoord)).trim() ;i=oArrayRetorn.length;}
			sTxt=''+iIdPortal+'#'+dXCoord+'#'+dYCoord;
			sHTMLAdr+='<tr><td id="nrosTable_'+sNro+'" style="cursor:pointer" onmouseover="javascript:CursorInOut(this,\'#ff7401\',\'#ffffff\');" onmouseout="javascript:CursorInOut(this,\'\',\'#000000\');" onclick="javascript:BuscaCarreriNumero(\''+sTxt+'\',\''+escape(sAdr1)+'\');">'+sAdr1+'</td></tr>';
			bTrobat=true;
		 }
		 sHTMLAdr+='</table></div>';
	  }
 	if (!bTrobat) sHTMLAdr='';
   // Cruilles....
    if (oArrayRetorn) oArrayRetorn.splice(0,oArrayRetorn.length);
	bTrobat=false;
	oArrayRetorn=AJT_ProcesaXMLDoc(XMLCru);
	if (oArrayRetorn)
	  {
		var i;
		 sHTMLCru+='';
		 sHTMLCru+='<code>&nbsp;&nbsp;Cru&iuml;lles disponibles...&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</code><div style="width:100%; height:65px; overflow:auto;">';
		 sHTMLCru+='<table width="190px" align="left" cellpadding="0" cellspacing="0" border="0" class="normalText">';
		 for(i=0;i<oArrayRetorn.length;++i)
		 {
			sId=i;
			sSigla=(unescape(oArrayRetorn[i].sigla)).trim();
			sNomCarrer=(unescape(oArrayRetorn[i].nomcarrer)).trim();
			sNom = sNomCarrer.split(',');
			if (sNom.length<2) sNom[1]='';
			sNomComplert=sSigla+'. '+sNom[1]+' '+sNom[0];
			dXCoord=(unescape(oArrayRetorn[i].coordx)).trim();
			dYCoord=(unescape(oArrayRetorn[i].coordy)).trim();
			sTxt=''+dXCoord+'#'+dYCoord;
			sHTMLCru+='<tr><td style="cursor:pointer" onmouseover="javascript:CursorInOut(this,\'#ff7401\',\'#ffffff\');" onmouseout="javascript:CursorInOut(this,\'\',\'#000000\');" onclick="javascript:BuscaCruilla(\''+sTxt+'\',\''+escape(sNomComplert)+'\');">'+sNomComplert+'</td></tr>';
			bTrobat=true;
		 }
		 sHTMLCru+='</table></div>';
	  }
 	 if (!bTrobat) sHTMLCru='';
	 
	 // Mostrar resultat.
	 if ((sHTMLAdr+sHTMLCru)=='') sHTMLAdr='<code class="normalText"> Sense informaci&oacute; disponible...</code>';
	 
     ClearProcessingTag(sTag);
	 if (sHTMLAdr!='')
	 {
	 document.getElementById('txtNomCarrer').style.width='200px'; // Original 280px;
	 document.getElementById('tblInputNro').innerHTML='Nro.:<input type="text" class="inputStyle" id="txtNro" style="width:25px; vertical-align:middle;" title="Número a buscar ?" onkeypress="javascript:TestNro(event);">';
	 document.getElementById('tblInputNro').style.display='';
	 document.getElementById('txtNro').focus();
	 }
	 document.getElementById(sTag).innerHTML='<div style="width:100%; height:150px; overflow:none;">'+sHTMLAdr+''+sHTMLCru+'</div>';
	 if (global_InputNro!='')
	   {
	     document.getElementById('txtNro').value=global_InputNro;
		 global_InputNro='';
		 BuscarNroonTable();
	   }
	 
}

function WSReturn_Carrers(sTag,oXMLDoc)
{
   var sHTML='';
   var sId;
   var iCodiCarrer;
   var sSigla;
   var sNomCarrer;
   var sNom;
   var sNomComplert;
   var bTrobat=0;
   var oArrayRetorn;
   
	// Montar el table amb els carrers que cumpleixen la condicio,
	// Capcelera i element table.
	oArrayRetorn=AJT_ProcesaXMLDoc(oXMLDoc);
	if (oArrayRetorn)
	  {
		var i;
		 sHTML+='<div style="width:100%; height:160px; overflow:auto;">';
		 sHTML+='<code>&nbsp;&nbsp;Seleccionar carrer...&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</code><div style="width:100%; height:140px; overflow:auto;">';
		 sHTML+='<table width="190px" align="left" cellpadding="0" cellspacing="0" border="0" class="normalText">';
		 for(i=0;i<oArrayRetorn.length;++i)
		 {
			sId			= i;
			iCodiCarrer	= (unescape(oArrayRetorn[i].codicarrer)).trim();
			sSigla		= (unescape(oArrayRetorn[i].sigla)).trim();
			sNomCarrer	= (unescape(oArrayRetorn[i].nomcarrer)).trim();
			sNom = sNomCarrer.split(',');
			if (sNom.length<2) sNom[1]='';
			sNomComplert=sSigla+'. '+sNom[1].trim()+' '+sNom[0].trim();
			sHTML+='<tr><td style="cursor:pointer" onmouseover="javascript:CursorInOut(this,\'#ff7401\',\'#ffffff\');" onmouseout="javascript:CursorInOut(this,\'\',\'#000000\');" onclick="javascript:BuscaDadesCarrer(this,'+iCodiCarrer+');">'+sNomComplert+'</td></tr>';
			bTrobat++;
		 }
		 sHTML+='</table></div>';
		 sHTML+='</div>';
	  }
	 switch(bTrobat)
	 {
	    case 0: document.getElementById(sTag).innerHTML='&nbsp;No s\'ha trobat cap carrer'; global_InputNro=''; break;
		case 1: document.getElementById(sTag).innerHTML=sNomComplert; BuscaDadesCarrer(document.getElementById(sTag),iCodiCarrer); break;
		default: ClearProcessingTag(sTag);document.getElementById(sTag).innerHTML=sHTML;break;
	 }
}

function CallWebServiceAdreces(sUrl,sTag,sMsg,oCallbackFunction)
{
  var URLWebService='http://urgell.terrassa.cat/mapserver/proxyADR.aspx?';
  var oAjax=new AJT_newXMLHttpRequest();
  
   if (sTag!='') ShowProcessingTag(sTag,sMsg);
   try {
		oAjax.open('GET',URLWebService+sUrl,true);
		oAjax.onreadystatechange=AJT_getReadyStateHandler(oAjax,sTag,oCallbackFunction);
		oAjax.send(null);
		} catch(e) {
					 alert('Error en crida webservice Adreces.\nProbi a refrescar la pàgina.\nDescripció:'+e.message);
					}
}
function callAjax4URL(URLService,oCallbackfunction)
{
    var oAjax=new AJT_newXMLHttpRequest();
    try {
		  oAjax.open('GET',URLService,true);
		  oAjax.onreadystatechange=AJT_getReadyStateHandlerHTML(oAjax,null,oCallbackfunction);
		  oAjax.send(null);
		 } catch(e) {
					  alert('Error en crida.\nProbi a refrescar la pàgina.\nDescripció:'+e.message);
			 		 }
}
function drawLiniaCarrerCallback(oTag,sRetorn)
{
  var oCoordinates=sRetorn.split('@');
  var xy;
  var xMin=9999999.9,yMin=9999999.9,xMax=0.0,yMax=0.0;
  var gCanvas;
  var offsetSelect=100.0;

  if (sRetorn.length<=0) return; // No troba eix carrer
  if (global_Canvas==null) global_Canvas=new graphicCanvas(document.getElementById('mapCanvas'));
  
  gCanvas=global_Canvas;
  gCanvas.WMSMap=map;
  for (var I=0;I<oCoordinates.length;I++)
  {
    var oXY=oCoordinates[I].split(',');
    var oX=new Array(oXY.length);
    var oY=new Array(oXY.length);

	for (var J=0;J<oXY.length;J++)
	{
		xy=oXY[J].split(':');
		oX[J]=xy[0];
		oY[J]=xy[1];
		if (oX[J]<xMin) xMin=oX[J];
		if (oX[J]>xMax) xMax=oX[J];
		if (oY[J]<yMin) yMin=oY[J];
		if (oY[J]>yMax) yMax=oY[J];
	}
  }	
  
  var catExtent=new NExtent( new NPoint(parseFloat(xMin)-offsetSelect,parseFloat(yMin)-offsetSelect) , new NPoint(parseFloat(xMax)+offsetSelect,parseFloat(yMax)+offsetSelect));
  var themap=map;
  themap.centerToExtent(catExtent);
  //return;
  
  gCanvas.reset();
  gCanvas.drawColor='#FF0000';
  gCanvas.drawWidth=5;
  gCanvas.Opacity=1.0;
  for (var I=0;I<oCoordinates.length;I++)
  {
    var oXY=oCoordinates[I].split(',');
    var oX=new Array(oXY.length);
    var oY=new Array(oXY.length);
	for (var J=0;J<oXY.length;J++)
	{
		xy=oXY[J].split(':');
		oX[J]=xy[0];
		oY[J]=xy[1];
	}
	gCanvas.drawPolyline(oX,oY);
  }
  gCanvas.redraw();	

}
function drawLiniaCarrer(iCodi,cbFunc)
{
 var URLService='http://urgell.terrassa.cat/mapserver/ASPService.asp?method=getXYCarrer&codi_carrer='+iCodi;
 callAjax4URL(URLService,cbFunc);
}

function BuscaDadesCarrer(oTD,iCodi)
{
    var sStringSearch;
    var sUrl;
	switch (typeof(oTD))
	{
	   case 'object': 	document.getElementById('txtNomCarrer').value=oTD.innerHTML;
						sUrl='method=buscaNro&codi='+iCodi+'&num=&bis=&tipus=';
						global_sCodiCarrer=iCodi;
						drawLiniaCarrer(iCodi,drawLiniaCarrerCallback);
						CallWebServiceAdreces(sUrl,'tagSearch','Buscant adreces...',BuscaDadesCarrer);
						break;
		default: 	if (global_sCodiCarrer!='')
					{
					   sUrl='method=buscaCruilla&codip='+global_sCodiCarrer+'&codis=';
					   global_sCodiCarrer='';
					   global_XMLNros=iCodi; // Segona crida ve d'Ajax i conte XML amb numeros
					   CallWebServiceAdreces(sUrl,'tagSearch','Buscant cru&iuml;lles',BuscaDadesCarrer);
					} else	{
							  Taula_Adreces_Cruilles('tagSearch',global_XMLNros,iCodi);
							  global_sCodiCarrer='';
							  global_XMLNros=null;
							}
					break;
	}
}



function AJT_ProcesaXMLDoc(responseXML)
{
	var mrNodes=responseXML.getElementsByTagName("multiRef");
	var strArray=new Array(mrNodes.length);

	// Els resultats a l'xml estan desordenats(excepte l'id).
	// Guardem tots els valors a un array amb l'id com a index.
	for (var i=0; i<mrNodes.length; i++)
	{
		var mrNode=mrNodes[i];	
		var idText=mrNode.getAttribute("id");
		var idValue=idText.substr(2,idText.length-2);
		strArray[idValue]=new Object;
		for (var j=0; j<mrNode.childNodes.length; j++)
		{
			var n=mrNode.childNodes[j];
			var fc = n.firstChild;
			if (fc!=null)
			{
			  var sNodeName=n.nodeName.toLowerCase();
			  var sNodeValue=escape(fc.nodeValue);
			 
			  var xevaluar='strArray['+idValue+'].'+sNodeName+'=\''+sNodeValue.trim()+'\'';
			  eval(xevaluar);
			}
		}
	}
	
	if (mrNodes.length==0) strArray=null;
	
	return strArray;
}
function AJT_loadXMLDoc(sXML)
{
  var xmlDoc;
	// code for IE
	if (window.ActiveXObject)
	{
	 xmlDoc=new ActiveXObject('Microsoft.XMLDOM');
	 xmlDoc.async=false;
	 xmlDoc.load(sXML);
	 return xmlDoc;
	}
	// code for Mozilla, Firefox, Opera, etc.
	else if (document.implementation && document.implementation.createDocument)
	{
	 xmlDoc=document.implementation.createDocument('','',null);
	 xmlDoc.load(sXML);
	 xmlDoc.onload=function(){return xmlDoc};
	} else return null;
}
function AJT_AplicaPlantillaXML(sXSL,oXMLdoc)
{
   var oXSLTrans=new AJT_XslTransform(sXSL);
   var sRetorn;
	    // ULL. Cal revisar per Mozilla
	   sRetorn=oXSLTrans.getResultString(oXMLdoc,null,null);
	   
	   return sRetorn;

}
function AJT_XslTransform(xsltUri)
{
	//	summary:
	//		dojo.xml.XslTransform is a convenience object that takes the URI
	//		String of an XSL file as a constructor argument. After each
	//		transformation all parameters will be cleared. Transformation is
	//		supported by IE, Mozilla, and partially by Opera. Other browsers
	//		(notably Safari) have not yet exposed their transformation
	//		primtives well enough to be useful.
	// xsltUri:
	//		Url of the xslt document to transform nodes with. Transformation is
	//		acheived with the transformTo* methods on instances of this class.

    var oBrowser = new AJT_Browser();
	
	var IS_IE = oBrowser.isIE;
	var ACTIVEX_DOMS = [
		'Msxml2.DOMDocument.5.0', 
		'Msxml2.DOMDocument.4.0', 
		'Msxml2.DOMDocument.3.0', 
		'MSXML2.DOMDocument', 
		'MSXML.DOMDocument', 
		'Microsoft.XMLDOM'
	];
	var ACTIVEX_FT_DOMS = [
		'Msxml2.FreeThreadedDOMDocument.5.0', 
		'MSXML2.FreeThreadedDOMDocument.4.0', 
		'MSXML2.FreeThreadedDOMDocument.3.0'
	];
	var ACTIVEX_TEMPLATES = [
		'Msxml2.XSLTemplate.5.0', 
		'Msxml2.XSLTemplate.4.0', 
		'MSXML2.XSLTemplate.3.0'
	];
  
	function getActiveXImpl(activeXArray){
		for(var i=0; i < activeXArray.length; i++){
			try{
				var testObj = new ActiveXObject(activeXArray[i]);
				if(testObj){
					return activeXArray[i];
				}
			}catch(e){}
		}
		alert('No es pot trobar una implementació ActiveX a:\n\n ' + activeXArray);
	}
    
    if(xsltUri == null || xsltUri == undefined){
        alert('Ha de passar-se una URL amb el fitxer XSL a utilitzar.!');
        return false;
    }
    
	var xsltDocument = null;
	var xsltProcessor = null;
	if(IS_IE){
		xsltDocument = new ActiveXObject(getActiveXImpl(ACTIVEX_FT_DOMS));
		xsltDocument.async = false;
	}else{
		xsltProcessor = new XSLTProcessor();
		xsltDocument = document.implementation.createDocument("", "", null);
		xsltDocument.addEventListener("load", onXslLoad, false);
	}
	xsltDocument.load(xsltUri);

	if(IS_IE){
		var xslt = new ActiveXObject(getActiveXImpl(ACTIVEX_TEMPLATES));
		xslt.stylesheet = xsltDocument;  
		xsltProcessor = xslt.createProcessor();
	}

	function onXslLoad(){
		xsltProcessor.importStylesheet(xsltDocument); 
	}

	function getResultDom(xmlDoc, params){
		if(IS_IE){
			addIeParams(params);
			var result = getIeResultDom(xmlDoc);
			removeIeParams(params);   
			return result;
		}else{
			return getMozillaResultDom(xmlDoc, params);
		}
	}

	function addIeParams(params){
		if(!params){ return; }
		for(var i=0; i<params.length; i++){
			xsltProcessor.addParameter(params[i][0], params[i][1]);
		}
	}

    function removeIeParams(params){
		if(!params){ return; }
		for(var i=0; i<params.length; i++){
			xsltProcessor.addParameter(params[i][0], "");
		}
    }

	function getIeResultDom(xmlDoc){
		xsltProcessor.input = xmlDoc;
		var outDoc = new ActiveXObject(getActiveXImpl(ACTIVEX_DOMS));
		outDoc.async = false;  
		outDoc.validateOnParse = false;
		xsltProcessor.output = outDoc;
		xsltProcessor.transform();
		if(outDoc.parseError.errorCode != 0){
			var err = outDoc.parseError;
			alert('err.errorCode: ' + err.errorCode + '\n\nerr.reason: ' + err.reason + '\n\nerr.url: ' + err.url + '\n\nerr.srcText: ' + err.srcText);
		}
		return outDoc;
	}

	function getIeResultStr(xmlDoc, params){
		xsltProcessor.input = xmlDoc;
		xsltProcessor.transform();    
		return xsltProcessor.output;
	}

	function addMozillaParams(params){
		if(!params){ return; }
		for(var i=0; i<params.length; i++){
			xsltProcessor.setParameter(null, params[i][0], params[i][1]);
		}
	}

	function getMozillaResultDom(xmlDoc, params){
		addMozillaParams(params);
		var resultDoc = xsltProcessor.transformToDocument(xmlDoc);
		xsltProcessor.clearParameters();
		return resultDoc;
	}

	function getMozillaResultStr(xmlDoc, params, parentDoc){
		addMozillaParams(params);
		if (parentDoc==null) parentDoc=document;
		var resultDoc = xsltProcessor.transformToFragment(xmlDoc, parentDoc);
		var serializer = new XMLSerializer();
		xsltProcessor.clearParameters();
		return serializer.serializeToString(resultDoc);
	}

	this.getResultString = function(	/*XMLDocument*/xmlDoc, 
										/*2 Dimensional Array*/params, 
										/*HTMLDocument*/parentDoc){
		// summary:
		//		transform the xmlDoc and return the result as a string.
		// xmlDoc: an XML Document to transform
		// params:
		//		a set of configuration parameters to pass to the transformation
		//		engine.
		// parentDoc: The HTML docuemnt to transform the subdocument "under"
		var content = null;
		if(IS_IE){
			addIeParams(params);
			content = getIeResultStr(xmlDoc, params);
			removeIeParams(params);  
		}else{
			content = getMozillaResultStr(xmlDoc, params, parentDoc);
		} 
		//dojo.debug(content);
		return content;
	};
};




/*****
*    Returns a new XMLHttpRequest object, or false if this browser doesn't support it
*    
*****/
function AJT_newXMLHttpRequest() {

  var xmlreq = false;


  if (window.XMLHttpRequest) {
    // Create XMLHttpRequest object in non-Microsoft browsers
    xmlreq = new XMLHttpRequest();

  } else if (window.ActiveXObject) {
    // Create XMLHttpRequest via MS ActiveX
    try {
      // Try to create XMLHttpRequest in later versions
      // of Internet Explorer
      xmlreq = new ActiveXObject("Msxml2.XMLHTTP");
    } catch (e1) {
      // Failed to create required ActiveXObject
      try {
        // Try version supported by older versions of Internet Explorer
        xmlreq = new ActiveXObject("Microsoft.XMLHTTP");
      } catch (e2) {
        // Unable to create an XMLHttpRequest with ActiveX
      }
    }
  }

  return xmlreq;
}


/*
 * Returns a function that waits for the specified XMLHttpRequest
 * to complete, then passes its XML response
 * to the given handler function.
 * req - The XMLHttpRequest whose state is changing
 * responseXmlHandler - Function to pass the XML response to
 */
function AJT_getReadyStateHandler(req, sTag,responseXmlHandler) {

  // Return an anonymous function that listens to the 
  // XMLHttpRequest instance
  return function () {

    // If the request's status is "complete"
    if (req.readyState == 4) {
      // Check that a successful server response was received
      if (req.status == 200) {

        // Pass the XML payload of the response to the 
        // handler function
        responseXmlHandler(sTag,req.responseXML);

      } else {

        // An HTTP problem has occurred
        alert('HTTP error: '+req.status+'\nAJAX Description: '+req.statusText);
      }
    }
  }
}
function AJT_getReadyStateHandlerHTML(req, sTag,responseXmlHandler) {

  // Return an anonymous function that listens to the 
  // XMLHttpRequest instance
  return function () {

    // If the request's status is "complete"
    if (req.readyState == 4) {
      // Check that a successful server response was received
      if (req.status == 200) {

        // Pass the XML payload of the response to the 
        // handler function
        responseXmlHandler(sTag,req.responseText);

      } else {

        // An HTTP problem has occurred
        alert('HTTP error: '+req.status+'\nAJAX Description: '+req.statusText);
      }
    }
  }
}


function AJT_Browser()
{
  var ua;

  this.isIE    = false;
  this.isNS    = false;
  this.isOP    = false;
  this.name    = navigator.appName;
  this.version = null;

  ua = navigator.userAgent;

  if ((navigator.userAgent).indexOf("Opera")!=-1)
  {
    this.isOP = true;
  } else
  if (navigator.appName=="Netscape")
  {
    this.isNS = true;
  } else
  if ( (navigator.appName).indexOf("Microsoft") != -1 )
  {
    this.isIE = true;
  }
  return;
}
/*
   ==========================================================================================
   == Graphical interface class prototype.                                                ===
   ==========================================================================================
*/
function graphicCanvas(obj)
{
   // Variables privades. 
   var _pjgCanvas=obj.getContext('2d');
   var _plinesArray=new Array();
   var _ppolysArray=new Array();
   var _pcirclesArray=new Array();
   var _tagContainer=obj;
   _pjgCanvas.lineCap='butt';
   _pjgCanvas.lineJoin='round';
   _pjgCanvas.globalCompositeOperation='source-over';
   
   this.drawColor='#000000';
   this.drawWidth=1;
   this.fillColor='#000000';
   this.Opacity=1.0;
   this.WMSMap=null;
   
   this.oTag  = function(){return _pjgCanvas;};
   this.clear = function(){_pjgCanvas.clearRect(0,0,_tagContainer.width,_tagContainer.height);};
   this.reset = function(){_plinesArray.splice(0,_plinesArray.length); _ppolysArray.splice(0,_ppolysArray.length); _pcirclesArray.splice(0,_pcirclesArray.length); this.clear();};
   this.redraw = function(){
                     var x0,y0,x1,y1,xy0,xy1;
					 var xs,ys;
					 this.clear();
					 for(var i=0;i<_plinesArray.length;i++)
					 {
					   x0=_plinesArray[i].XY1[0]; y0=_plinesArray[i].XY1[1];
					   x1=_plinesArray[i].XY2[0]; y1=_plinesArray[i].XY2[1];
					   if (this.WMSMap)
						{ 
						  xy0=this.WMSMap.coordsToPixels(x0,y0);
						  xy1=this.WMSMap.coordsToPixels(x1,y1);
						  
						  x0=xy0.getX(); y0=xy0.getY();
						  x1=xy1.getX(); y1=xy1.getY();
						}
						   _pjgCanvas.beginPath();
					       _pjgCanvas.strokeStyle=_plinesArray[i].color;
					       _pjgCanvas.lineWidth=_plinesArray[i].width;
					       _pjgCanvas.globalAlpha=_plinesArray[i].Opacity;
						   _pjgCanvas.moveTo(x0,y0);
						   _pjgCanvas.lineTo(x1,y1);
						   _pjgCanvas.stroke();
					 }
					 for(i=0;i<_ppolysArray.length;i++)
					 {
					   var xxs=_ppolysArray[i].Xs.join(','); var yys=_ppolysArray[i].Ys.join(',');
					   xs=xxs.split(','); ys=yys.split(',');
					   if (this.WMSMap)
					     {
						   for(var j=0;j<xs.length;xs[j]=this.WMSMap.xReal2pixel(xs[j]),j++) ;
						   for(var j=0;j<ys.length;ys[j]=this.WMSMap.yReal2pixel(ys[j]),j++) ;
						 }
						if (_ppolysArray[i].fill)
						{
							_pjgCanvas.beginPath();
							_pjgCanvas.fillStyle=_ppolysArray[i].fill;
							_pjgCanvas.lineWidth=1.0;
							_pjgCanvas.globalAlpha=_ppolysArray[i].Opacity;
							_pjgCanvas.moveTo(xs[0],ys[0]);
							for(var j=1;j<xs.length;j++) _pjgCanvas.lineTo(xs[j],ys[j]);
							_pjgCanvas.closePath();
							_pjgCanvas.fill();
						}
						_pjgCanvas.beginPath();
						_pjgCanvas.fillStyle=_ppolysArray[i].fill;
						_pjgCanvas.strokeStyle=_ppolysArray[i].color;
						_pjgCanvas.lineWidth=_ppolysArray[i].width;
						_pjgCanvas.globalAlpha=_ppolysArray[i].Opacity;
						_pjgCanvas.moveTo(xs[0],ys[0]);
						for(var j=1;j<xs.length;j++) _pjgCanvas.lineTo(xs[j],ys[j]);
						_pjgCanvas.closePath();
						_pjgCanvas.stroke();
					 }
					 for(i=0;i<_pcirclesArray.length;i++)
					 {
                       var startAngle=0.0;
                       var endAngle=2.0*Math.PI;
                       var clockWise=true;
					   var xs=_pcirclesArray[i].x; var ys=_pcirclesArray[i].y;
                       var radi=_pcirclesArray[i].radius;
					   if (this.WMSMap)
					     {
						   xs=this.WMSMap.xReal2pixel(xs);
						   ys=this.WMSMap.yReal2pixel(ys);
                           radi=this.WMSMap.dReal2pixel(radi);
						 }
						if (_pcirclesArray[i].fill)
						{
							_pjgCanvas.beginPath();
							_pjgCanvas.fillStyle=_pcirclesArray[i].fill;
							_pjgCanvas.lineWidth=1.0;
							_pjgCanvas.globalAlpha=_pcirclesArray[i].Opacity;
                            _pjgCanvas.arc(xs,ys,radi,startAngle,endAngle,clockWise);
							_pjgCanvas.fill();
						}
						_pjgCanvas.beginPath();
						_pjgCanvas.fillStyle=_pcirclesArray[i].fill;
						_pjgCanvas.strokeStyle=_pcirclesArray[i].color;
						_pjgCanvas.lineWidth=_pcirclesArray[i].width;
						_pjgCanvas.globalAlpha=_pcirclesArray[i].Opacity;
                        _pjgCanvas.arc(xs,ys,radi,startAngle,endAngle,clockWise);
						_pjgCanvas.stroke();
					 }
					};
   this.drawImage = function(oImg,x,y) {
							_pjgCanvas.drawImage(oImg,x,y);
                         }
   this.drawLine = function(x1,y1,x2,y2) {
						 var tmp=new Object;
						 tmp.XY1=[x1,y1];
						 tmp.XY2=[x2,y2];
						 tmp.color=this.drawColor;
						 tmp.width=this.drawWidth;
						 tmp.Opacity=this.Opacity;
						 _plinesArray.push(tmp);
						};
   this.drawPolyline = function(xs,ys) {
						 for(var i=0;i<xs.length-1;i++)
						    this.drawLine(xs[i],ys[i],xs[i+1],ys[i+1]);
						};
   this.drawPolygon = function(xs,ys,bOmplert) {
						 var tmp=new Object;
						 tmp.Xs=xs;
						 tmp.Ys=ys;
						 tmp.color=this.drawColor;
						 tmp.width=this.drawWidth;
						 tmp.fill=(bOmplert)?this.fillColor:null;
						 tmp.Opacity=this.Opacity;
						 _ppolysArray.push(tmp);
						};
   this.drawCircle = function (xc,yc,radi,bOmplert) {
                         var tmp=new Object;
						 tmp.x=xc;
						 tmp.y=yc;
                         tmp.radius=radi;
						 tmp.color=this.drawColor;
						 tmp.width=this.drawWidth;
						 tmp.fill=(bOmplert)?this.fillColor:null;
						 tmp.Opacity=this.Opacity;
						 _pcirclesArray.push(tmp);
                       };
}
