var iconSizePoi= new OpenLayers.Size(68, 48);
var namespace_uri = 'http://www.opengis.net/xls';
var namespace_prefix = 'xls';
var namespace_uri_gml = 'http://www.opengis.net/gml';
var namespace_prefix_gml = 'gml';


/**
 * gazetteerSearch metodo che effettua la ricerca dei toponimi 
 */
function  gazetteerSearch(page)
{
      objects = new Hashtable();    	
      var divRisultati = document.getElementById('risultati');  
	    		
	  divRisultati.innerHTML = '';  
	  
	  var numPagina = 1; 
	  if (page && page!=null)
      {
      	numPagina = page;
      }
	  if (this!=null && this.numPagina!=null && this.numPagina!='') {
		numPagina = this.numPagina;		
	  }
    
      var markerLayer = map.getLayerByName("objectMarkers");
	   if(markerLayer != null) {
		  if (markerLayer.markers != null) {
	            while(markerLayer.markers.length > 0) {
	            	var marker = markerLayer.markers[0];
	            	markerLayer.removeMarker(marker);
	            	marker.destroy();
	            }
	        }
	   }
	   else {
	   	  markerLayer = new Roja.Layer.Markers("objectMarkers");
		  markerLayer.displayInLayerSwitcher = false;
		  map.addLayer(markerLayer);		 
	   }
	   
	   var toponimo = document.getElementById('searchInput').value;	  
	   
	   var urlSearchGazetteer = serviceUrl + '/ricercatoponimi/RicercaToponimiService.ejb?serviceName=RTOpenGISResp&methodType=ejb';
	   var url = urlSearchGazetteer;
      
       if (Roja.Proxy && urlSearchGazetteer.startsWith("http")) {
			url = Roja.Proxy + Roja.Util.escapeUri(urlSearchGazetteer);
		}
		
		var par = '';
		
	   if (toponimo!=null && toponimo!='') 
	   {	
          par = 'xmlRequest=<xls:DirectoryRequest xmlns:xls="http://www.opengis.net/xls">' +
				      '<xls:POIProperties>'+
	                      '<xls:POIProperty name="other" value="freeFormDescription|'+ toponimo + '"/>'+    
	                      '<xls:POIProperty name="other" value="geometry|true"/>'+    
	                      '<xls:POIProperty name="other" value="numPagina|'+ numPagina + '"/>'+
	                      '<xls:POIProperty name="other" value="numRisultatiPerPagina|'+numRisultatiPagina+'"/>'+  						
	                  '</xls:POIProperties>'+
                  '</xls:DirectoryRequest>';   
        
            // to wiev loading state
		    var loading = new Roja.Control.LoadingMessage();
		    if ((map != null) && (loading != null)) {
			   	    map.addControl(loading);		
			   	    loading.startLoad();  
		    }
			
			var context = {
		        loading:loading
		    };
				  				
	        var req = new OpenLayers.Ajax.Request(url+'&'+par, 
	                            {   method: 'get',
	                                parameters: null,
	                                onComplete: successGazetteer.bind(context),
	                                onFailure: failureGazetteer.bind(context)
	                            }
	                        );
                        
      }	
	  else {
			alert('Inserire il testo di ricerca per la località.');
	  }                   
}

    

 /**
 * successGazetteer metodo in caso di successo nella ricerca
 * dei toponimi allora elabora il risultato e lo visualizza 
 */
function  successGazetteer(request)
{
	    var object= null;
	    this.loading.stopLoad();
        map.removeControl(this.loading);	
   	    if (request.responseXML == null){
	        return;
	    }
	    var xmlResponse = request.responseXML;
	    if (!xmlResponse || request.fileType!="XML") { //for IE compatibility
	        xmlResponse = OpenLayers.parseXMLString(request.responseText);
	    }	    
	    var markerLayer = map.getLayerByName("objectMarkers");
	   	    
	    var numPagina = 1;
	    var poiContextList = xmlResponse.documentElement.getElementsByTagName("POIContext");
	    //var poiContextList = OpenLayers.Ajax.getElementsByTagNameNS(xmlResponse.documentElement, namespace_uri,namespace_prefix, "POIContext");
	    var numRisultati = poiContextList.length;

	    if (poiContextList.length>0) {
	    	var poiContext = poiContextList[0];
		    var poiInfoList = poiContext.getElementsByTagName("POIInfo");
	    	//var poiInfoList = OpenLayers.Ajax.getElementsByTagNameNS(poiContext, namespace_uri,namespace_prefix, "POIInfo");
	       	for (i=0;i<poiInfoList.length;i++) {
	    		var poiInfo = poiInfoList[i];
	    		var nameAttribute  = poiInfo.getAttribute('name');
	    		if (nameAttribute=='POINumResults') {
	    			var numRisultatiString = poiInfo.getAttribute('value');
	    			if (numRisultatiString!=null && numRisultatiString!='') {
	    				numRisultati = new Number(numRisultatiString).valueOf();
	    			}	    			
	    		}
	    		if (nameAttribute=='POINumPage') {
	    			var numPaginaString = poiInfo.getAttribute('value');
	    			if (numPaginaString!=null && numPaginaString!='') {
	    				numPagina = new Number(numPaginaString).valueOf();
	    			}	    			
	    		}
	       	}   	
	    }	   
	    
	    if (numRisultati == 1)  {	    	
            	
	    	var divElement = null;
	    	    
	    	if (poiContextList.length>0) {	     	  	    	
	    
		    	var poiContext = poiContextList[0];
				var poiName = null;
	    		var poiCategory = null;
	    		var poiCountry = null;
	    		
	    		var poiInfoList = poiContext.getElementsByTagName("POIInfo");
	    		//var poiInfoList = OpenLayers.Ajax.getElementsByTagNameNS(poiContext, namespace_uri,namespace_prefix, "POIInfo");
		       	for (j=0;j<poiInfoList.length;j++) {
		    		var poiInfo = poiInfoList[j];
		    		var nameAttribute  = poiInfo.getAttribute('name');	    		
		    				    		
		    		if (nameAttribute=='Alias') {
		    			poiName = poiInfo.getAttribute('value');		    			 			
		    		}
		    		if (nameAttribute=='NomeTipo') {
		    			poiCategory = poiInfo.getAttribute('value');		    			 			
		    		}
		    		if (nameAttribute=='NomeComune') {
		    			poiCountry = poiInfo.getAttribute('value');		    			 			
		    		}
		    		
		       	}
		       	
		       	object={
					name:poiName,
			        category:poiCategory,					
					country:poiCountry
				}    
				objects.put('1',object);   	
		       	
		       	object={
					start:1,
			        end:1,
					numrisultati:1,	
					numPagina:1,
					type:'TOP',
					input: document.getElementById('searchInput').value						
				}    
				objects.put('risultati',object);   	
		       	
		       	var wkt = null;
		       	
		       	var pos = poiContext.getElementsByTagName("pos");
		       	//var pos = OpenLayers.Ajax.getElementsByTagNameNS(poiContext, namespace_uri_gml,namespace_prefix_gml, "pos");
	    		if (pos!=null) {
	    			var wktnodo = pos[0];
		    		if (wktnodo!=null)
		    		{
		    			wkt = wktnodo.firstChild.nodeValue;  
		    			wkt='POINT('+ wkt + ')';  			
		    		}
	    		}
				
				if (wkt!=null && wkt!='') {
				
		    		var g = new OpenLayers.Format.WKT();
		            var feature = g.read(wkt);
		            
		            feature.geometry.calculateBounds();
		             
		            var point = map.getViewPortPxFromLonLat(new OpenLayers.LonLat(feature.geometry.bounds.left,feature.geometry.bounds.bottom));
				    point.y= point.y + iconSizePoi.h;
				    point.x= point.x - (iconSizePoi.w/2);
				    
				    point = map.getLonLatFromViewPortPx(point);
				    feature.geometry.bounds.left = point.lon;
				    feature.geometry.bounds.bottom = point.lat;
				    
				    point = map.getViewPortPxFromLonLat(new OpenLayers.LonLat(feature.geometry.bounds.right,feature.geometry.bounds.top));
				    point.y= point.y - iconSizePoi.h;
				    point.x= point.x + (iconSizePoi.w/2);
				    
				    point = map.getLonLatFromViewPortPx(point);
				    feature.geometry.bounds.right = point.lon;
				    feature.geometry.bounds.top = point.lat;	  
		         
		            var x = (feature.geometry.bounds.right+feature.geometry.bounds.left)/2;
				    var y = (feature.geometry.bounds.top+feature.geometry.bounds.bottom)/2;		
				    
				    var options = { lonlat: new OpenLayers.LonLat(x,y),
									iconUrl: OpenLayers.ImgPath + 'poi/carattere_red_shadow_1.png',
				                    iconSize: iconSizePoi
				                  };
					  
					var marker = new Roja.Marker(options);
					markerLayer.addMarker(marker);
					marker.display(true);
					//var poiLinkSardegna3d =  'http://www.sardegna3d.it/xml/s3d.php?x='+ feature.geometry.x+'&y='+feature.geometry.y;
					var poiLinkSardegna3d =  rojaBackendUrl + "/CJSServlet?action=CJS01Link3D&extfile3d=s3d&minx="+feature.geometry.x+"&miny="+feature.geometry.y+"&maxx="+feature.geometry.x+"&maxy="+feature.geometry.y;
					
					if (poiName!=null) {
						//poiLinkSardegna3d  += '&nome='+ poiName;	
						//poiLinkSardegna3d  += '&nome='+ poiName.replace(/\'/g , '%27');	
						poiLinkSardegna3d  += '&name='+ poiName.replace(/\'/g , '%27');	
					}			
					
					var text = createTextBaloonGazetteer(poiName,poiCountry,poiLinkSardegna3d); 
				  
					marker.createPopup(text,true);	
					marker.events.register('click', this, openPopup.bind(marker));     
					if (feature.geometry.getBounds()!=null) {
					    map.zoomToExtent(feature.geometry.getBounds());
					}    					
				}
	    	}		
	    	
	    	showBottomDiv();
     	 	return;    		
	    }
	    
	    if (numRisultati == 0)
	    {
	    	createMessageErrorGazetteer('Impossibile trovare la localit&#224;.',this.loading);
	    }
	    else
	    {
	    	
	    	var divElement = null;
	    	    
	    	if (poiContextList.length>0) {	    	
	    	
	    		var divRisultati = document.getElementById('risultati');  
	    		
	    		divRisultati.innerHTML = '';  
    
			    var divRojaPoi = document.createElement('div');
			    divRojaPoi.className = 'RojaPoi';
			    divRisultati.appendChild(divRojaPoi);   	    
			     
			    var divAmbiguosResponse = document.createElement('div');
			    divAmbiguosResponse.className = 'ambiguosResponse';
			    divAmbiguosResponse.id = 'ambiguosResponse';
			    divRojaPoi.appendChild(divAmbiguosResponse);    
			    
			    divElement = document.createElement('div');
			    divElement.className = 'size100 floating';
			    divAmbiguosResponse.appendChild(divElement);
			    
			    var divPoi = document.createElement('div');
			    divPoi.className = 'size100 floating';
			    divElement.appendChild(divPoi);
			    
			    var divBr = document.createElement('br');
			    divPoi.appendChild(divBr);
			    
			    var divSpan = document.createElement('span');
			    divPoi.appendChild(divSpan);						    
			    divSpan.innerHTML = 'Risultati&#160;'; 
			    
			    var start = ((numPagina-1) * 10)+1 ;
			    var end = start + poiContextList.length - 1;
			    
			    var divSpan = document.createElement('span');
			    divPoi.appendChild(divSpan);	
			    divSpan.style.fontWeight='bold';					    
			    divSpan.innerHTML = start + '-' + end;
			    
			     var divSpan = document.createElement('span');
			    divPoi.appendChild(divSpan);						    
			    divSpan.innerHTML = '&#160;di&#160;'; 
			    
			    var divSpan = document.createElement('span');
			    divPoi.appendChild(divSpan);	
			    divSpan.style.fontWeight='bold';					    
			    divSpan.innerHTML = numRisultati;
			    
			    var divSpan = document.createElement('span');
			    divPoi.appendChild(divSpan);						    
			    divSpan.innerHTML = '&#160;localit&#224; trovate.'; 	
			    
			    	
		       	object={
					start:start,
			        end:end,
					numrisultati:numRisultati,	
					numPagina:numPagina,
					type:'TOP',
					input: document.getElementById('searchInput').value											
				}    
				objects.put('risultati',object);   		    
	    	
		        var maxExtent = null; 
	       	   	
		    	for (i=0;i<poiContextList.length;i++) {
		    		var poiContext = poiContextList[i];
		    		var poiName = null;
		    		var poiCategory = null;
		    		var poiCountry = null;
		    		
		    		var poiInfoList = poiContext.getElementsByTagName("POIInfo");
		    		//var poiInfoList = OpenLayers.Ajax.getElementsByTagNameNS(poiContext, namespace_uri,namespace_prefix, "POIInfo");
			       	for (j=0;j<poiInfoList.length;j++) {
			    		var poiInfo = poiInfoList[j];
			    		var nameAttribute  = poiInfo.getAttribute('name');		    				    		
			    				    		
			    		if (nameAttribute=='Alias') {
			    			poiName = poiInfo.getAttribute('value');		    			 			
			    		}
			    		if (nameAttribute=='NomeTipo') {
			    			poiCategory = poiInfo.getAttribute('value');		    			 			
			    		}
			    		if (nameAttribute=='NomeComune') {
			    			poiCountry = poiInfo.getAttribute('value');		    			 			
			    		}		    		
			       	}   	
			       	
			       	var index = i+1;
			       	object={
						name:poiName,
				        category:poiCategory,				
						country:poiCountry
					}    
					objects.put(index+'',object);
			       	
			       	var wkt = null;
			       	
			       	var pos = poiContext.getElementsByTagName("pos");
			       	//var pos = OpenLayers.Ajax.getElementsByTagNameNS(poiContext, namespace_uri_gml,namespace_prefix_gml, "pos");
		    		if (pos!=null) {
		    			var wktnodo = pos[0];
			    		if (wktnodo!=null)
			    		{
			    			wkt = wktnodo.firstChild.nodeValue;  
			    			wkt='POINT('+ wkt + ')';  			
			    		}
		    		}
		    		
		    		if (wkt!=null && wkt!='') {
		    		
			    		var g = new OpenLayers.Format.WKT();
			            var feature = g.read(wkt);
			            
			            feature.geometry.calculateBounds();			            
			           
			            if (maxExtent==null) {
			            	maxExtent = feature.geometry.getBounds(); 
			            }
			            else {
			            	maxExtent.extend(feature.geometry.getBounds()); 
			            }	           
			          
			            var x = (feature.geometry.bounds.right+feature.geometry.bounds.left)/2;
		 			    var y = (feature.geometry.bounds.top+feature.geometry.bounds.bottom)/2;					
						
					   	var options = { lonlat: new OpenLayers.LonLat(x,y),
										iconUrl: OpenLayers.ImgPath + 'poi/carattere_red_shadow_'+ index + '.png',
					                    iconSize: iconSizePoi
					    };
						  
						var marker = new Roja.Marker(options);
						marker.display(true);					
						markerLayer.addMarker(marker);										
						//var poiLinkSardegna3d =  'http://www.sardegna3d.it/xml/s3d.php?x='+ feature.geometry.x+'&y='+feature.geometry.y;
						var poiLinkSardegna3d =  rojaBackendUrl + "/CJSServlet?action=CJS01Link3D&extfile3d=s3d&minx="+feature.geometry.x+"&miny="+feature.geometry.y+"&maxx="+feature.geometry.x+"&maxy="+feature.geometry.y;
						
						if (poiName!=null) {
							//poiLinkSardegna3d  += '&nome='+ poiName.replace(/\'/g , '%27');	
							poiLinkSardegna3d  += '&name='+ poiName.replace(/\'/g , '%27');	
						}			

						var text = createTextBaloonGazetteer(poiName,poiCountry,poiLinkSardegna3d); 
						
						marker.createPopup(text,false);	
			    		marker.events.register('click', this, openPopup.bind(marker));    
			    		var divPoi = document.createElement('div');
					    divPoi.className = 'size100 floating';
					    divElement.appendChild(divPoi);
					    
					    var divBr = document.createElement('br');
					    divPoi.appendChild(divBr);
					    
					    var divImg = document.createElement('div');
					    divImg.style.width = '35px';
					    divImg.style.cursor = 'pointer';
					    
					    divImg.className = 'floating'; 
					    divPoi.appendChild(divImg);
					    
					    var img = document.createElement('img');
					    img.src =  OpenLayers.ImgPath + 'poi/carattere_red_'+index+'.gif';
					    divImg.appendChild(img);
					    
					    var divText = document.createElement('div');
					    divText.className = 'divText';
					    divPoi.appendChild(divText);
					    var divHref = document.createElement('a');
					    divHref.href = '#';
					    divText.appendChild(divHref);
					    
					    divHref.innerHTML = poiName;
					    
					    var context={
							marker: marker
					    }
			    			                    
			            Event.observe(divHref,'click',openMarker.bindAsEventListener(context));
			            Event.observe(divImg,'click',openMarker.bindAsEventListener(context));
			           	if (poiCountry!=null) {			
			    			var divBr = document.createElement('br');
					    	divText.appendChild(divBr);
				    		var divSpan = document.createElement('span');
				    		divSpan.className = 'country';
						    divText.appendChild(divSpan);						    
						    divSpan.innerHTML = poiCountry;  			
				    	}		
				    	if (poiCategory!=null) {	    					    				
			    			var divBr = document.createElement('br');
					    	divText.appendChild(divBr);
				    		var divSpan = document.createElement('span');
				    		divSpan.className = 'arancione';
						    divText.appendChild(divSpan);						    
						    divSpan.innerHTML = 'Categoria:';  
						    var divSpan = document.createElement('span');
				    		divText.appendChild(divSpan);						    
						    divSpan.innerHTML = poiCategory;  			
				    	}		                  
		    		} 	    		
		    	} 
	    	} 	
          
            if (maxExtent!=null) {
            	var point = map.getViewPortPxFromLonLat(new OpenLayers.LonLat(maxExtent.left,maxExtent.bottom));
			    point.y= point.y + iconSizePoi.h;
			    point.x= point.x - (iconSizePoi.w/2);
			    
			    point = map.getLonLatFromViewPortPx(point);
			    maxExtent.left = point.lon;
			    maxExtent.bottom = point.lat;
			    
			    point = map.getViewPortPxFromLonLat(new OpenLayers.LonLat(maxExtent.right,maxExtent.top));
			    point.y= point.y - iconSizePoi.h;
			    point.x= point.x + (iconSizePoi.w/2);
			    
			    point = map.getLonLatFromViewPortPx(point);
			    maxExtent.right = point.lon;
			    maxExtent.top = point.lat;	
              	map.zoomToExtent(maxExtent);
            }      
		    
		    if (numRisultati>numRisultatiPagina)
		    {	    	   
			    
			    var divPoi = document.createElement('div');
			    divPoi.className = 'size100 floating';
			    divPoi.style.textAlign='center';
			    divElement.appendChild(divPoi);
			    
			    var divBr = document.createElement('br');
			    divPoi.appendChild(divBr);
			    
			    var divBr = document.createElement('br');
			    divPoi.appendChild(divBr);
			    
			    if (numPagina!=1) 
			    {
			    	 var divHref = document.createElement('a');
			    	 divHref.className = 'pagina';
			    	 divHref.href = '#';
				     divPoi.appendChild(divHref);
				    
				     divHref.innerHTML = '&#171;&#160;Indietro&#160;';
				     
				     var context={
						numPagina: (new Number(numPagina)).valueOf()-1 
				     }
				     
				     Event.observe(divHref,'click',gazetteerSearch.bindAsEventListener(context));
			    }
			    
			    var pagine =  Math.ceil(numRisultati/numRisultatiPagina);
			    var start =  ((Math.ceil(numPagina/5)-1) * 5) + 1;
			    var end = start + 4;
			    for (i=1; i<=pagine;i++)
			    {
			    	if (i>=start && i<=end)
			    	{
				    	if (numPagina==i) {
				    		var divSpan = document.createElement('span');
				    		divSpan.className = 'link';
						    divPoi.appendChild(divSpan);
						    
						    divSpan.innerHTML = i + '&#160;';
				    	}
				    	else {
				    		
				    		 var divHref = document.createElement('a');
				    		 divHref.className = 'pagina';
				    		 divHref.href = '#';
						     divPoi.appendChild(divHref);
						    
						     divHref.innerHTML = i;
						     
						     var context={
								numPagina: i 
						     }
						     
						     Event.observe(divHref,'click',gazetteerSearch.bindAsEventListener(context));
						     
						     var divSpan = document.createElement('span');
						     divPoi.appendChild(divSpan);
						    
						     divSpan.innerHTML = '&#160;';						     
				    	}
			    	}			    	
			    }
			    
			    if (numPagina!=pagine) {
			    	 var divHref = document.createElement('a');
			    	 divHref.className = 'pagina';
			    	 divHref.href = '#';
				     divPoi.appendChild(divHref);
				    
				     divHref.innerHTML = 'Avanti&#160;&#187;';
				     
				     var context={
						numPagina: (new Number(numPagina)).valueOf()+1 
				     }
				     
				     Event.observe(divHref,'click',gazetteerSearch.bindAsEventListener(context));
			    }		    
		    }            	    	
	    }   
	    
	 	showBottomDiv();
	 	toggleSideBar('open');  
     	
}
    

   
 /**
 * failureGazetteer metodo in caso di fallimento nella ricerca
 * dei toponimi allora visualizza un messaggio di errore
 */
function failureGazetteer(request)
{
	createMessageErrorGazetteer('Impossibile trovare la localit&#224;.',this.loading);
}

/**
 * createMessageErrorGazetteer metodo che crea il messaggio di errore per i toponimi 
 */
function createMessageErrorGazetteer(text,loading) {

    loading.stopLoad();
    map.removeControl(loading);	
    
    var divRisultati = document.getElementById('risultati');    
    
    var divRojaPoi = document.createElement('div');
    divRojaPoi.className = 'RojaPoi';
    divRisultati.appendChild(divRojaPoi);    
     
    var divPoiResponseError = document.createElement('div');
    divPoiResponseError.className = 'poiResponseError';
    divPoiResponseError.id = 'poiResponseError';
    divRojaPoi.appendChild(divPoiResponseError);
    
    var divElement = document.createElement('div');
    divElement.className = 'size100';
    divPoiResponseError.appendChild(divElement);
    
    var bElement = document.createElement('b');
    divElement.appendChild(bElement);
    
    var spanElement = document.createElement('span');
    spanElement.className = 'errorpoi';
    bElement.appendChild(spanElement);
    
    spanElement.innerHTML = text;
    
    var brElement = document.createElement('br');
    divElement.appendChild(brElement);
     
    brElement = document.createElement('br');
    divElement.appendChild(brElement);
    
    spanElement = document.createElement('span');
    spanElement.className = 'orange';
    divElement.appendChild(spanElement);
    
    spanElement.innerHTML = 'Suggerimenti:';
    
    divElement = document.createElement('div');
    divElement.className = 'size95 floating margint';
    divPoiResponseError.appendChild(divElement);
    
    spanElement = document.createElement('span');
    divElement.appendChild(spanElement);
    
    spanElement.innerHTML = 'Assicurati che il testo relativo alla localit&#224; sia stato digitato correttamente.';
   
}

/**
 * loadLink metodo che apre una nuova finestra su un url
 */
function loadLink(url) {
	   var newWin=window.open(url);
	   newWin.focus();	  
}

/**
 * createTextBaloon metodo che crea il testo del Baloon per il popup dei poi  
 */
function createTextBaloonGazetteer(poiName,poiCountry,poiLinkSardegna3d) {
	    
	    var text = '';  
		if (poiName!=null) {
			text = '<span style="font-weight:bold">'+poiName+'</span><br/>';
		}
	
		if (poiCountry!=null) {
			text += poiCountry+'<br/>';						
		}		
				
		text+='<br/>Altri link:<br/>';
		//text+='<span class="arancione">|</span>';
		
		var linkComunas = 'http://www.comunas.it/';
		
		if (poiCountry!=null && poiCountry!='') {		
			if (hashTableComuni.get(poiCountry)!=null && hashTableComuni.get(poiCountry)[0]!='') {
				linkComunas = hashTableComuni.get(poiCountry.toUpperCase())[0];
				text +=  '<a href="#" onclick = "loadLink(\''+ linkComunas +'\')" style="text-decoration:underline;">Comunas</a><br/>'; 					
			}
		}
	
							
		//text+='<span class="arancione">|</span>';
		text +=  '<a href="#" onclick = "loadLink(\''+ poiLinkSardegna3d +'\')"  style="text-decoration:underline;">Guarda su Sardegna 3D</a>';
		return text;								
}
