//Div per il trova localita'
var trovaLocalitaDiv;
//Elemento sulla quale applicare l'autocomplete
var element;
//Imposta l'oggetto per effettuare lo zoom o meno al momento della selezione 
var zoomActived=false;
//Localit� attiva
var lastActiveAttivita=-1;
// XML di risposta
var xmlResponse=null;
// Id del timeout attivo
var timeoutID =null;
//Elementi di supporto per la ricerca
var currentZoom = null;
var currentEle = null;

/* *************************************
 * Funzione associata all'evento onkeyup dei campi di input per richiamare la funzione 
 * per l'autocompletamento
 ************************************ */
function trovaLocalitaAutoComplete(evt,ele,zoom){
	if(ele.value.length > 2)
	{
		currentEle=ele;
		currentZoom = zoom;
	    if (evt.type == "keyup") {
			//Se non stiamo usando i tasti freccia
	    	if ((evt.keyCode < 37 || evt.keyCode > 40) && (evt.keyCode != 13)) {
		    	//Creo il div
				trovaLocalitaCreateDiv(ele);
	
				if (timeoutID != null)
				{
					window.clearTimeout(timeoutID);
				}
				timeoutID = window.setTimeout(launchRequestTrovaLocalita,800);
	    	}
	    	else
	    	{
	    		selectOneLocalita(evt.keyCode);
	    	}
	    }
	}
}

/* *************************************
 * Funzione richiamata dopo la fine del timeout per lanciare la richiesta Ajax
 ************************************ */
function launchRequestTrovaLocalita(){

	//Visualizziamo il messaggio di "elaborazione in corso"
	loadingMsg.startLoad();
        
	if (currentEle.value != "")
	{		
		var par = '?locale='+language+'&command=TrovaLoc&trova_valori='+currentEle.value;
		
        new OpenLayers.Ajax.Request(urlSentieriWebBackend + par,
                         {   method: 'get',
                             parameters: null,
                             onComplete: successTrovaLocalitFunc,
                             onFailure: failureTrovaLocalitFunc
                          }
                         );
       
        zoomActived = currentZoom;
	}
}

	
/* *************************************
 * Funzione richiamata quando va a buon fine la ricerca delle localit�
 ************************************ */
function successTrovaLocalitFunc(request){
	xmlResponse = request.responseXML;
	if (!xmlResponse || request.fileType!="XML") {
		xmlResponse = OpenLayers.parseXMLString(request.responseText);
	}

	var html;
	if (xmlResponse.getElementsByTagName('pt_notevoli').length==0)
	{
		html = localitaNonTrovata;
	}
	else
	{
		var xml = request.responseText;
	
		html = MW.transformXml(xml,xslLocalita);
		html=html.replace(/&lt;/g , "<");
		html=html.replace(/&gt;/g , ">");
	}

	//Nascondiamo il messaggio di "elaborazione in corso"
	loadingMsg.stopLoad();
    
	trovaLocalitaDiv.innerHTML = html;
   	trovaLocalitaDiv.className = "show autoCompletePanel";
	var maxHeight = trovaLocalitaDiv.style.maxHeight.substring(0,trovaLocalitaDiv.style.maxHeight.indexOf('px'));
	if (trovaLocalitaDiv.offsetHeight > maxHeight)
	{
		trovaLocalitaDiv.style.height = trovaLocalitaDiv.style.maxHeight;
	}
	   	
	selectFirstLocalita();
}

/* *************************************
 * Funzione richiamata quando non va a buon fine la ricerca delle localit�
 ************************************ */
function failureTrovaLocalitFunc(request){
	
	//Nascondiamo il messaggio di "elaborazione in corso"
	loadingMsg.stopLoad();
    
   	trovaLocalitaDiv.className = "hidden";
	lastActiveAttivita=-1;
}


/* *************************************
 * Funzione per la creazione del div menu per il trova localit�
 ************************************ */
function trovaLocalitaCreateDiv(ele){
   	if ($("trovaLocalitaDiv") == null)
   	{
   		trovaLocalitaDiv = document.createElement("div");
    	trovaLocalitaDiv.id = 'trovaLocalitaDiv';
   		document.body.appendChild(trovaLocalitaDiv);
	}
	var coord = getCoords(ele);

   	trovaLocalitaDiv.style.left = coord.x + 'px';
   	trovaLocalitaDiv.style.maxHeight = '200px';
   	var top = coord.y + ele.offsetHeight + 1;
   	trovaLocalitaDiv.style.top = top + 'px';
   	trovaLocalitaDiv.innerHTML = ele.value;
   	//trovaLocalitaDiv.style.width = '18em'; //ele.offsetWidth + 'px';
   	trovaLocalitaDiv.className = "hidden";
   	element = ele;
}

/* *************************************
 * Funzione per estrarre le coordinate dell'oggetto presente in qualsiasi browser
 ************************************ */
function getCoords(el){
	var c={x: 0, y: 0};
	while (el) {
		c.x+=el.offsetLeft;
		c.y+=el.offsetTop;
		el=el.offsetParent;
	}
	return c;
};

/* *************************************
 * Funzione per la chiusura del div menu localit�
 ************************************ */
function closeLocalitaMenu(input){
	if (input != null)
	{
		element.value = input.innerHTML;
	}
	if (trovaLocalitaDiv != null)
	{
	   	trovaLocalitaDiv.className = "hidden";
	   	trovaLocalitaDiv.scrollTop = 0;
	}
}

/* *************************************
 * Funzione richiamata alla selezione della localit�
 ************************************ */
function localitaSelected(id,x,y,ele){
	if (zoomActived)
	{
		map.setCenter(new OpenLayers.LonLat(x,y),6);
	}
	
	/******/
	if (vectorLayer != null)
	{
		vectorLayer.destroyFeatures();
	}
	else
	{
		var options = {
		   displayInLayerSwitcher:false
		}	
	    vectorLayer = new OpenLayers.Layer.Vector("Localita",options);
	    map.addLayer(vectorLayer);
	}
	
	var style= {
		        strokeColor: "yellow",
		        strokeOpacity: 0.7,
		        strokeWidth: 5,
		        pointRadius: 6,
		        pointerEvents: "visiblePainted"
		   };		   
	var newPoint = new OpenLayers.Geometry.Point(x,y);
	geometrypointlist = [];
	geometrypointlist.push(newPoint);
	var pointFeature = new OpenLayers.Feature.Vector(newPoint,null,style);
	
	    	vectorLayer.addFeatures([pointFeature]);
	/******/
	
	
	$(element.id+'Geom').value = x+","+y;
	$(element.id+'Id').value = id;
	closeLocalitaMenu(ele);
}

/* *************************************
 * Funzione per l'evidenzazione dell'attivit�
 ************************************ */
function selectOneLocalita(keyCode){
	var divList = trovaLocalitaDiv.getElementsByTagName('div');
	
   	//Se ho premuto invio
   	if (keyCode == 13)
   	{
		element.value = divList[lastActiveAttivita].firstChild.innerHTML;
		
		var puntiNotevoliList = xmlResponse.getElementsByTagName('pt_notevole');
		var puntoNotevole = puntiNotevoliList[lastActiveAttivita];
		var geometria = puntoNotevole.attributes.getNamedItem("geometria").value;  
		var id = puntoNotevole.attributes.getNamedItem("id").value;  
   		localitaSelected(id,geometria.substring(0,geometria.indexOf(',')),geometria.substring(geometria.indexOf(',')+1,geometria.length),null);
		
		return 0;
   	}
	
	var currentActiveAttivita = -1;
	
	if (keyCode == 38 && lastActiveAttivita > 0)
	{
		currentActiveAttivita = lastActiveAttivita - 1;
	
		if (trovaLocalitaDiv.scrollTop > divList[currentActiveAttivita].offsetTop)
		{
			trovaLocalitaDiv.scrollTop = divList[currentActiveAttivita].offsetTop;
		}  		
	}
	else if ((keyCode == 40) && (lastActiveAttivita < divList.length-1))
	{
		currentActiveAttivita = lastActiveAttivita + 1;
		
		var y = trovaLocalitaDiv.scrollTop;
		var c = trovaLocalitaDiv.clientHeight;
		
		if ((c + y) < (divList[currentActiveAttivita].offsetTop + divList[currentActiveAttivita].offsetHeight))
		{
			trovaLocalitaDiv.scrollTop = trovaLocalitaDiv.scrollTop + divList[currentActiveAttivita].offsetHeight;
		}  		
	}
	else
	{
		currentActiveAttivita = lastActiveAttivita;
	}
	if (lastActiveAttivita >= 0)
	{
		divList[lastActiveAttivita].className = divList[lastActiveAttivita].className.replace('listSelected','listUnselected');
	}
	if (currentActiveAttivita >= 0)
	{
		divList[currentActiveAttivita].className = divList[currentActiveAttivita].className.replace('listUnselected','listSelected');
		lastActiveAttivita = currentActiveAttivita;
	}
   	trovaLocalitaDiv.className = "show autoCompletePanel";
}

/* *************************************
 * Funzione per l'evidenzazione della prima localit�
 ************************************ */
function selectFirstLocalita(){
	var divList = trovaLocalitaDiv.getElementsByTagName('div');
	
	lastActiveAttivita = 0;
	if (divList.length > 0)
	{
		divList[lastActiveAttivita].className = divList[lastActiveAttivita].className.replace('listUnselected','listSelected');
		
	}
}
