//--------------------------------------------------------------------------
//----------------------------    CERQUES    -------------------------------
//--------------------------------------------------------------------------

/*
	Per afegir un nou element:
	1- Modificar ubicar.properties:
		- Afegir l'element a cerca.inputs
		- Modificar els select que es farān a la bd (all, filtre)
		- Afegir maxfiles (si es vol controlar el nē d'elements que retornarā la bd)
	2- Afegir element a l'arrayElements(dropdown.js) i al toc_ubicar.jsp (mateix nom que a ubicar.properties)
		a) SENSE FILLS (ningú depén d'ell)
			3- Afegir funciķ que haurā de cridar (arrayFunctions).
			4- Afegir funciķ del dwr que ha de cridar per retornar tota la taula (arrayDWRTots)
			5- Afegir funciķ del dwr que ha de cridar per retornar la taula filtrada(arrayDWRConcrets)
			6- Afegir '' a arrayPare(arrayPare)
			7- Afegir el nom del fill a arrayFill(arrayFill)
		b) AMB FILLS (algú depén d'ell)
			3- Afegir funciķ que haurā de cridar (la funciķ de l'element que depčn d'ell) (arrayFunctions).
			4- Afegir pareElement per saber quin es l'id del pare (retorna tots els elements que tenen id=x)(arrayDWRTots)
			5- Afegir pareElement per saber quin es l'id del pare (retorna tots els elements que tenen id=x i amb filtre y)(arrayDWRConcrets)
			6- Afegir el nom del pare a arrayFill(arrayPare)
			7- Afegir '' a arrayFill(arrayFill)
	8- Posar el valor booleā convenient a arrayDWRConcretsSimpli, segons si s'ha de passar el text per la funciķ de simplificaciķ
	9- Veure si el nom dels inputs es troba a la funciķ netejaInputs() (al final d'aquest fitxer)
*/
var timeoutId=0;
var timeoutDentro=0;
var letraApretada=true;

var newItem=0;
arrayNumeros=new Array();

//array dels elements
arrayElements	= new Array();
arrayElements	= ['carrer','portal','refCadastral'];

//array de la funciķ que ha de cridar (per exemple en aquest cas numero_buscar carga el select de numeros
//i el cargaCoordenadas fa la cerca de les coordenades al mapa i posa el tooltip
arrayFunctions	= new Array();
arrayFunctions	= ['numero_buscar','cargaCoordenadas','cargaCoordenadas'];

//array de les funcions del dwr que retorna tots els elements de la bd.
//pareElement: agafa el id del pare com a parāmetre obligatoria per enviar.
arrayDWRTots	= new Array();
arrayDWRTots	= ['Ubicar.buscaAll','pareElement','Ubicar.buscaAll'];

//array de les funcions del dwr que retorna els elements de la bd que comencen per X
//pareElement: agafa el id del pare com a parāmetre obligatoria per enviar.
arrayDWRConcrets	= new Array();
arrayDWRConcrets	= ['Ubicar.busca','pareElement','Ubicar.busca'];

//en les crides arrayDWRConcrets, valor del booleā de simplificar el text. També passa el text a majuscules.
arrayDWRConcretsSimpli	= new Array();
arrayDWRConcretsSimpli	= [true,true,false];

//Si l'element ha d'agafar l'informaciķ d'un altre element (per exemple portal agafa la info de carrer)
arrayPare	= new Array();
arrayPare	= ['','carrer',''];

//Si la seva informaciķ ha de ser agafar per un altre element (per exemple l'info de carrer ha de ser agafada per portal)
arrayFill	= new Array();
arrayFill	= ['portal','',''];

//si centrarā a les coordenades (el select retornarā els parāmetres XMIN, XMAX, YMIN i YMAX)
arrayCentreCoordenades	= new Array();
arrayCentreCoordenades	= [false,false,false];

/**
*    Rep l'event onkeydown i onclick del input
*/
function empezarEditar(menu,element) {
	document.onkeydown = wsTextChanged;

	function wsTextChanged(e) {
		letraApretada=true;				
		var keyCode = (window.event) ? event.keyCode : e.keyCode;

		if(document.getElementById("id"+element)!=null)document.getElementById("id"+element).value="";

		if(keyCode == 0){
			keyCode = (isNN) ? e.which : event.keyCode;
		}		

		if (keyCode==13 || keyCode==9){// enter o tabulador 
			buscarClick(element);
			return;
		}
		if (keyCode==27) return;

		if (keyCode==40){//flecha hacia abajo
			clearTimeout(timeoutId);
			obtenirDades(menu.value);
			clearTimeout(timeoutDentro);
			timeoutDentro = setTimeout ("moverDentroItem('0')", 300);
			return;
		}

		clearTimeout(timeoutId);
		letraApretada=false;
		timeoutId = setTimeout ("activarEventoS()", 2000);
	}
}

function moverDentroItem(elem,div) {
	if(elem=="0" && div!="undefined"){
		wsCurrentSelId=0;
		if(document.getElementById("wsResult_"+wsCurrentSelId) != null){
			document.getElementById("wsResult_"+wsCurrentSelId).style.backgroundColor=colorItemMouseOverBackground;
			document.getElementById("wsResult_"+wsCurrentSelId).style.color=colorItemMouseOverText;
		}
		if(document.getElementById("div"+elementCerca).style.visibility=="visible")	document.getElementById("div"+elementCerca).focus();
		document.onkeydown = eventKeyDown;
	}else{
		document.getElementById("input"+elementCerca).focus();
		
		empezarEditar();
	}

}

function activarEventoS(){
	if(!letraApretada){
		document.onkeypress = null;
		document.onkeydown = null;
		newItem=0;
		document.getElementById("buscar"+elementCerca).src="img/wait.gif";
		document.getElementById("div"+elementCerca).innerHTML="Cercant ... ";
		document.getElementById("div"+elementCerca).style.height="50px";
		var option=document.getElementById("input"+elementCerca);	
		obtenirDades(option.value);
	}
}

/*
	Retorna el nom de la funcio que utilitza l'element 
	array: variable que ens indica dins de quien array hem de buscar.
*/
function obtenirElement(array){

	var trobat = false;
	var posicioArray = 0; //la posicio de l'element dins de l'array.

	for(i=0; i<arrayElements.length && !trobat; i++){
		if(arrayElements[i]==elementCerca){
			trobat = true;
			posicioArray = i;
		}
	}
	return array[posicioArray];
}

// currently selected div id
var wsCurrentSelId=-1;


/**
*    Adds a new item to the dropdown list
*/
function getHtmlNewItem(id,text,title,tipusNum) {
	newItem++;
	var str='';

	document.getElementById("buscar"+elementCerca).src="img/lupa.gif";
	arrayNumeros[id]=id;

	var auxiliar=obtenirElement(arrayFunctions);

	var aux= parseInt(id)%(parseInt(2))==0;//per pintar les files de diferents colors

	if(aux){
		str+='<div id="wsResult_'+id+'" onkeydown="moverDentroItem();" onMouseOver="javascript:resultMouseOver('+id+');" txt="'+text+'" onClick="javascript:'+auxiliar+'('+id+','+tipusNum+');" class="treeGroupTitle treeLevelTitle" style="background-color:'+colorItemColum1+'; text-overflow:ellipsis;overflow:hidden;white-space:nowrap; width:220px; cursor:pointer;" title="'+title+'"><img src="img/blanc.gif" width="5px" height="1px"/>'+text+'<img src="img/blanc.gif" width="5px" height="1px"/></div>';
	}else{
		str+='<div id="wsResult_'+id+'" onkeydown="moverDentroItem();" onMouseOver="javascript:resultMouseOver('+id+');" txt="'+text+'" onClick="javascript:'+auxiliar+'('+id+','+tipusNum+');" class="treeGroupTitle treeLevelTitle" style="background-color:'+colorItemColum2+'; text-overflow:ellipsis;overflow:hidden;white-space:nowrap; width:220px; cursor:pointer;" title="'+title+'"><img src="img/blanc.gif" width="5px" height="1px"/>'+text+'<img src="img/blanc.gif" width="5px" height="1px"/></div>';
	}
	return str;
}

/**
*    Receives mouse over event
*/
function resultMouseOver(divId) {

	var divObj_new=document.getElementById("wsResult_"+divId);
	if (divObj_new==null) 		return;

	divObj_new.style.backgroundColor=colorItemMouseOverBackground;
	divObj_new.style.color=colorItemMouseOverText;
	
	if (wsCurrentSelId>-1) {
		var divObj_old=document.getElementById("wsResult_"+wsCurrentSelId);
		if(divObj_old == null)divObj_old=document.getElementById("wsResult_0");
		var aux= parseInt(wsCurrentSelId)%(parseInt(2))==0;//pinta files diferents colors
		if(aux)divObj_old.style.backgroundColor=colorItemColum1;
		else divObj_old.style.backgroundColor=colorItemColum2;
		divObj_old.style.color=colorTextItem;
	}
	wsCurrentSelId=divId;
}

/**
*    Hides the dropdown div
*/
function resultHide() {
	try {
		var obj="";

		obj=document.getElementById("div"+elementCerca);
		obj.style.height="0px";
		//obj.style.visibility="hidden";
		obj.style.display="none";
		obj.innerHTML="";
		newItem=0;
		// Assign event to  handle keys pressed.
		document.onkeydown=null;

		//per solucionar problema IE6 amb els selects que no s'amagen.
	//	visibleSelec();	
	}
	catch (e) {
	//	alert("Error a resultHide()\n: "+e.message+"\nlinia:"+e.line);//todo
	//	errorHandler(e);

	}
}

/**
*    Shows the dropdown div
*/
function resultShow(htmlCode) {
	var obj="";

	obj=document.getElementById("div"+elementCerca);
	var pos=findPosY(document.getElementById("input"+elementCerca));

	obj.style.top=pos+18+"px";
	if ((navigator.appName).indexOf("Microsoft")!=-1 && (navigator.appVersion).indexOf(6.)!=-1)
		obj.style.left="25px";
	obj.style.height="120px";	
	obj.style.visibility="visible";
	obj.style.display="block";
	obj.innerHTML=htmlCode;
	// Assign event to  handle keys pressed.
	document.onkeydown=eventKeyDown;

	//per solucionar problema IE6 amb els selects que no s'amagen.
//	hiddenSelec();
    

}

/**
*    Processes the key down events
*/
function eventKeyDown(e) {
	

	var KeyID = (window.event) ? event.keyCode : e.keyCode;
	var newId=-1;
	//alert(KeyID);
	switch(""+KeyID) {
		case "38":	//up
			newId=wsCurrentSelId-1;
			
			if (newId>=0 ) resultMouseOver(newId);
			else{ //canvi del select al input text
				moverDentroItem(newId);
				document.getElementById("wsResult_0").style.backgroundColor=colorItemMouseOverText;
				document.getElementById("wsResult_0").style.color=colorTextItem;
			}
			break;

		case "40":	//Down
			newId=wsCurrentSelId+1;

			if (newId>=0 ) resultMouseOver(newId);
			break;

		case "13":	//Enter
			newItem=0;
			var auxiliar=obtenirElement(arrayFunctions);
			var elemNum=obtenirElement(arrayPare);
			if(elemNum!="")elemNum=true;
			else elemNum=false;
			eval(auxiliar+"("+arrayNumeros[wsCurrentSelId]+","+elemNum+")");

			break;

		case "9":	//Tab
			newItem=0;
			var auxiliar=obtenirElement(arrayFunctions);
			var elemNum=obtenirElement(arrayPare);
			if(elemNum!="")elemNum=true;
			else elemNum=false;
			eval(auxiliar+"("+arrayNumeros[wsCurrentSelId]+","+elemNum+")");
			break;

		case "27":	//Esc
			resultHide();
			break;
	}

}

//per solucionar problema IE6 amb els selects que no s'amagen. Els fa invisibles
/*function hiddenSelec(){
	if(elementCerca=="carrer") {
		check =document.getElementById("selectportal");
	    if(check!=null)check.style.visibility="hidden";	
	
		check =document.getElementById("inputRefCad");
		if(check!=null)check.style.visibility="hidden";	
	}
}*/

//per solucionar problema IE6 amb els selects que no s'amagen. Els torna a posar visibles
/*function visibleSelec(){
	check =document.getElementById("selectportal");
    if(check!=null)check.style.visibility="visible";	

	check =document.getElementById("inputRefCad");
    if(check!=null)check.style.visibility="visible";	
}*/


var coordX = 0;var coordY = 0;
var minx = 0; var miny = 0;
var maxx = 0; var maxy = 0;

//missatges dels inputs
var buscarTexto="Cercar...";
var sinCandidatos="Sense candidats...";
var buscarNum="Escull un número...";
var buscarCarrer="Escull un carrer...";
var portalCentreCarrer="(carrer)";
var elementCerca="carrer";//element que esta actualment agafat

/* 
	Centre les coordenades al mapa (busqueda de carrers/numero) 
	element: el nom final del element. Cal anomenar el div i l'input amb el tipus que es i darrera el nom
		de l'element, per exemple inputcarrer i pasem a cercar('carrer')
*/
function cercar(element){
	var o = new Object();
	
	var selec=document.getElementById("input"+element);
	if(selec.value==buscarTexto || selec.value==sinCandidatos || selec.value==buscarCarrer || selec.value==buscarNum)selec.value = "";

	if(elementCerca!=element && elementCerca!=""){

		obj=document.getElementById("div"+elementCerca);
		if(obj!=null){
			obj.style.height="0px";
			obj.style.visibility="hidden";
			obj.innerHTML="";
			newItem=0;
		}
	}

	elementCerca=element;
	empezarEditar(selec,element);
}

function buscarClick(element){
	clearTimeout(timeoutId);
	resultHide();

	document.getElementById("buscar"+element).src="img/wait.gif";
	var text=document.getElementById("input"+element).value;

	elementCerca=element;
	if(text==buscarTexto || text==sinCandidatos || text==buscarCarrer || text==buscarNum)text = "";
	obtenirDades(text);
	clearTimeout(timeoutDentro);
	timeoutDentro = setTimeout ("moverDentroItem('0')", 300);
}


/*
	Fa la crida DWR
*/
function obtenirDades(text) {
	var elem=obtenirElement(arrayElements);

	if(text==""){
		var auxiliar=obtenirElement(arrayDWRTots);

		if(auxiliar!="Ubicar.multitaulaAll")eval(auxiliar+"(elem,"+carga+")");//Ubicar.busca("carrer",carga);
		else  seleccioMultitaula(text);
		
	}else{
		var auxiliar=obtenirElement(arrayDWRConcrets);
		var siplific=obtenirElement(arrayDWRConcretsSimpli);

		cadena=new Array();
		cadena[0]=text;
		if(auxiliar!="Ubicar.multitaula")eval(auxiliar+"(elem,cadena,siplific,"+carga+")");
		else seleccioMultitaula(text);//vem el tractament de multitaula
	}
}

copiaData = new Array();
copiaDataCadastre = new Array();
copiaDataNumero = new Array();
var infoMostrar = "";//el que mostrarem al tooltip
/*Aquesta copia la creem per si tenim seleccionat la primera cerca (que carrega el select num) i després seleccionem
un altre tipus de cerca, al clicar a sobre un número mostri l'informaciķ correctament*/
var infoMostrarCopia = "";//el que mostrarem al tooltip


function carga(data){
	var i=0;		
	copiaData=data;
	var str="";
	if(data.length<="0"){ 
			str=getHtmlNewItem("0","Sense candidats ...", "Sense candidats ...", false);
	}else{
		for(i=0;i<data.length;i++){
			var cadena=data[i][1];
			str+=getHtmlNewItem(i,cadena, cadena, false);
		}
	}
	resultShow(str);
}

function pareElement(){
	var auxiliar=obtenirElement(arrayPare);
	var id="";
	if(auxiliar!=""){
		id=document.getElementById("id"+auxiliar).value;
		var input= document.getElementById("input"+elementCerca).value;
		if(id!=""){
			if(input==buscarTexto || input==sinCandidatos || input==buscarCarrer || input==buscarNum)input = "";
			cadena=new Array();
			cadena[0]=id;
			cadena[1]="";
			if(input!="")cadena[1]=input;

			Ubicar.busca(elementCerca,cadena,true,cargaNumero);
		}else{
			alert("Cal fer la cerca per "+auxiliar+" primer.");

			document.getElementById("buscar"+elementCerca).src="img/lupa.gif";
		}
	}
}

/*inici per utilitzar el filtre segons la taula escollida*/
function seleccioMultitaula(text){
	//var valor = document.getElementById('selectMultitaula').value;
	var selectPare=obtenirElement(arrayPare);
	var valor = document.getElementById(selectPare).value;

	if(valor!=0){
		var arrayValor=valor.split(",");
		taula=new Array();

		if(arrayValor.length >1){
			for(i=0;i<arrayValor.length;i++){
				taula[i]=arrayValor[i];
			}
		}else{
			taula[0]=valor;
		}

		cadena=new Array();
		cadena[0]=text;
		
		var siplific=obtenirElement(arrayDWRConcretsSimpli);
		
		if(text=="")Ubicar.multitaulaAll("multitaula",taula,carga);
		else Ubicar.multitaula("multitaula",cadena,taula,siplific,carga);
	}
}

/*fi per utilitzar el filtre segons la taula escollida*/

function numero_buscar(id) {
	resultHide();
	numCarrer=copiaData[id][0];
	infoMostrar=copiaData[id][1];
	arrayInfo=infoMostrar.split(",");

	document.getElementById("input"+elementCerca).value=arrayInfo[0];
	document.getElementById("id"+elementCerca).value=copiaData[id][0];
	if (typeof(arrayInfo[1])=='undefined'){//per si no tenim article
		infoMostrar=arrayInfo[0];
		infoMostrarCopia=infoMostrar;
	}else{
		infoMostrar=arrayInfo[1]+ " " +arrayInfo[0];
		infoMostrarCopia=infoMostrar;
	}
	cadena=new Array();
	cadena[0]=numCarrer;
	cadena[1]="";

	elementCerca=obtenirElement(arrayFill);
	Ubicar.busca(elementCerca,cadena,true,cargaNumero);
}

function cargaNumero(data){
	var i=0;
	copiaDataNumero=data;
	//document.getElementById("input"+elementCerca).value="Nē...";
	copiaData=data;
	if(elementCerca == 'carrer'){
		document.getElementById("input"+elementCerca).value = buscarCarrer;
	}else{
		document.getElementById("input"+elementCerca).value = buscarNum;
	}
	//--
	document.getElementById("input"+elementCerca).focus();
	var str="";

	if(data.length<="0"){ 
			str=getHtmlNewItem("0","Sense candidats ...", "Sense candidats ...", true);
	}else{
		for(i=0;i<data.length;i++){
			str+=getHtmlNewItem(i,data[i][1], data[i][1], true);
		}
	}
	resultShow(str);

	coordX=0;	coordY=0;
	if(data.length>"0"){
		coordX = data[0][1];
		coordY = data[0][2];
	}
}

/*
*	Assigna les coordenades i l'informaciķ del tooltip.
*   el valor indica la posiciķ de l'element i elemNum indica (Cert/fals) si la crida la fet el select numeros
*/
function cargaCoordenadas(value,elemNum){
	resultHide();
	infoMostrar = "";

	//Amaguem previsualitzaciķ i reestablim escala actual
	/*hidePrintPreview();
	if(document.getElementById("escala5") != null){
		document.getElementById("escala5").value = "actual";
	}
	if(document.getElementById("printPreviewCheckbox") != null){
		document.getElementById("printPreviewCheckbox").checked = false;
	}*/


	if(!obtenirElement(arrayCentreCoordenades)){	//si s'ha de centrar al punt donat o a les coordenades
		if(elemNum){
			document.getElementById("input"+elementCerca).value=copiaDataNumero[value][1];
			infoMostrar=infoMostrarCopia;
			infoMostrar+=(copiaDataNumero[value][1] == portalCentreCarrer ? "" : ", " + copiaDataNumero[value][1]);
			coordX = copiaDataNumero[value][2];
			coordY = copiaDataNumero[value][3];
		}else{
			document.getElementById("input"+elementCerca).value=copiaData[value][1];
			if(copiaData[value][1]!=null)infoMostrar=copiaData[value][1];
			coordX = copiaData[value][2];
			coordY = copiaData[value][3];
		}
		busquedaCoordMapa();
	}else{
		document.getElementById("input"+elementCerca).value=copiaData[value][1];
		if(copiaData[value][1]!=null)infoMostrar=copiaData[value][1];
		
		coordX = copiaData[value][2];
		coordY = copiaData[value][3];
		minx = copiaData[value][4];
		miny = copiaData[value][5];
		maxx = copiaData[value][6];
		maxy = copiaData[value][7];
		//alert("coordX "+coordX+" coordY "+coordY+" minx "+minx+" miny "+miny+" maxx "+maxx+" maxy "+maxy);
		busquedaCentreCoordMapa();
	}
}

/*
	Centra i fa un zoom a les coordenades donades.
	Treu el tooltip.
*/
function busquedaCentreCoordMapa(){
	//map.zoomToExtent(new OpenLayers.Bounds(413333.28666682134,4576971.827139697,436035.0840634522,4585379.90024956)); 
	if(minx!=0){
		map.zoomToExtent(new OpenLayers.Bounds(minx, miny, maxx, maxy)); 
		var lonlat=new OpenLayers.LonLat(coordX, coordY);

		//esborrem popup del map i el poi
		if (this.map) {
			layers=map.getLayersByName("Markers");
			if (layers.length>0)
			layers[0].destroy();

			while (this.map.popups.length>0){
				this.map.popups[0].destroy();
			}
		}

		var markers = new OpenLayers.Layer.Markers( "Markers" );
		map.addLayer(markers);
		
		var size = new OpenLayers.Size(15,15);
		var offset = new OpenLayers.Pixel(-(size.w/2), -size.h);
		var icon = new OpenLayers.Icon("img/poi.gif",size,offset);
		var marker=new OpenLayers.Marker(lonlat,icon);
		markers.addMarker(marker);
		var bubble = new OpenLayers.Popup.FramedCloud("theid",
										lonlat,
										new OpenLayers.Size(200,70),
										"<div style='padding:5px;'>"+infoMostrar+"</div>",
										icon,
										true,
										null
		);
		bubble.autoSize=true;
		bubble.backgroundColor="#E6E6E6";

		map.addPopup(bubble);

		marker.popup=bubble;
		marker.events.register('mousedown', marker, 
			function(evt) { 
					this.popup.toggle();
					OpenLayers.Event.stop(evt); 
			}
		);
	}
}


/*
	Centra i fa un zoom al punt donat.
	Treu el tooltip.
*/
function busquedaCoordMapa(){
	if (typeof(zoomForResolution)=='undefined' || zoomForResolution==null)zoomForResolution=5000;//variable dins config.js
	if(coordX!=0){
		var lonlat=new OpenLayers.LonLat(coordX, coordY);
		map.setCenter(lonlat,map.getZoomForResolution(OpenLayers.Util.getResolutionFromScale(zoomForResolution,'m'),true));//

		// afegim popup
		var pp=new OpenLayers.NGPopups({'map':map});
		pp.addPopup(lonlat,infoMostrar);
	} else {
		alert("Element sense coordenades");
	}
}

function netejaInputs(id) {

	// camps: {{valor parāmetre id, camp a netejar, valor a colˇlocar-hi}}
	var camps = new Array(
			new Array("idmunicipi",		"inputmunicipi",		buscarTexto),
			new Array("idcarrer",			"inputcarrer",			buscarTexto),
			new Array("idportal",			"inputportal",			""),
			new Array("idnomurb",		"inputnomurb",			buscarTexto),
			new Array("idnumpar",		"inputnumpar",			buscarTexto),
			new Array("idrefcadastral",	"inputrefcadastral",	buscarTexto),
			new Array("idsector",		"inputsector",			buscarTexto),
			new Array("idedificis",		"inputedificis",		buscarTexto),
			new Array("idmultitaula",		"inputmultitaula",		buscarTexto)
		);

	var i,j
	for (i=0; i<camps.length; i++)
	{
		if (camps[i][0] != id)
		{
			var v = document.getElementById(camps[i][1]);
			if (v != null && v != "undefined") v.value = camps[i][2];
		}
	}
}