/* Obiekt InfoLink przechowuje nazwy serwisów oraz warstwy (w postaci obiektów), o które można pytać */
function InfoLink() {
    this.services = [];
    this.layersForServices = [];
}

/* Dzięki temu, że InfoLink jest obiektem zmienia się gdy zostaną zmienione layersForServices
    a dzięki nadpisaniu toString możemy go traktować jako tekst */        
InfoLink.prototype.toString = function() {
    var link = '{"services": [';
    for (var i = 0; i < this.services.length; i++) {
        link += '{"name" : "' + this.services[i] + '", "layers" : "' + this.layersForServices[i] +'"}';
        if ( i < this.services.length-1)
            link+=",";
    }
    link+=']}';
    return link;
}

function showInfoFromServlet (latlng,link,map,infoID) {
    if (latlng) {
	wait(map);
        $.ajax({
            type: "POST",
    	    url: "agregat",
            data: 'parm='+link+'&lat='+(latlng.lat()*10000 | 0)/10000.0+'&lng='+(latlng.lng()*10000 | 0)/10000.0,
            success: function (msg) {
                try {
                    var obj=$.parseJSON(msg);
                    var infowindow = new google.maps.InfoWindow({
                        content: obj.popup,
                        position: latlng
                    });
                    infowindow.open(map);
                    document.getElementById(infoID).innerHTML=obj.info;
                } catch(e) {
                    alert("Niezrozumiała odpowiedź serwera.");
                }
                endWaiting(map);
            },
            error: function (msg) {
                endWaiting(map);
        	alert("Chwilowy brak możliwości połączenia z serwerem.");
            }});
        }
    }

function showPoint(map,form,link,infoID) {
 var latlng = new google.maps.LatLng(
	form.lat.value / 1.0 + form.latmin.value / 60.0 + form.latsec.value / 3600.0,
	form.lng.value / 1.0 + form.lngmin.value / 60.0 + form.lngsec.value / 3600.0);
  map.setCenter(latlng);
  showInfoFromServlet(latlng,link,map,infoID);
}                                
                                                                                                                                                                                                                                                                                                                                                                                                                        
google.maps.Map.prototype.getZoomForBounds = function(bounds) {
    var div = document.createElement('div');
    div.style.height = this.getDiv().offsetHeight + 'px';
    div.style.width = this.getDiv().offsetWidth + 'px';
    document.getElementsByTagName('body')[0].appendChild(div);
    var mapTemp = new google.maps.Map(div);
    mapTemp.fitBounds(bounds);
    var z = mapTemp.getZoom(); 
    document.getElementsByTagName('body')[0].removeChild(div);
    return z;
}  

function createSetPointFunction(map,x,y,z) {
    return function () {
	map.setCenter(new google.maps.LatLng(y,x));
	map.setZoom(z);
    };
}                                                                                                                                                                                                                                                                                                                                                                                                                                    

function searchPlace(map,value,infoID,moreInfoID) {
    var maxResults = 10;
    wait(map);
    var center = map.getCenter();
    
    $.ajax({
	type: "POST",
	url: "search",
	data: 'searchText='+value+'&maxResults='+maxResults+'&lat='+(center.lat()*10000 | 0)/10000.0+'&lng='+(center.lng()*10000 | 0)/10000.0,
	  success: function (msg) {
	    try{
		var results=$.parseJSON(msg);
		var wyszukInfo = document.getElementById(infoID);
		wyszukInfo.innerHTML = '';
		for (var i = 0; i < results.length; ++i) {
		    var z = map.getZoomForBounds(
			new google.maps.LatLngBounds(
			new google.maps.LatLng(results[i].YMin,results[i].XMin),
			new google.maps.LatLng(results[i].YMax,results[i].XMax))
		    );
		    var x = results[i].XMin+((results[i].XMax-results[i].XMin)/2);
		    var y = results[i].YMin+((results[i].YMax-results[i].YMin)/2);
		    if (i == 0) {
			(createSetPointFunction(map,x,y,z))();
			
			var fields=$.parseJSON(results[0].fields);
			var info=document.createElement('div');
			info.style.width = '400px';
			
			info.innerHTML += '<strong>'+results[0].type+': '+fields[0].wartosc+'</strong> <br />';
			
			for (var t=1; t<fields.length; t++) {
			    if (fields[t].wartosc.length>0) {	
				info.innerHTML += fields[t].pole + '<br />' + fields[t].wartosc+'<br />';
			    }
			}
			var a = document.createElement('a');
			a.href = '#';
			a.innerHTML = 'Więcej informacji';
			
			info.appendChild(a);
                	var infowindow = new google.maps.InfoWindow({
                            content: info,
                            position: new google.maps.LatLng(y,x)
                        });
                        infowindow.open(map);
			a.onclick = function() {document.getElementById(moreInfoID).click(); infowindow.close(); };
                    
		    }
		    var divLink = document.createElement('div');
		    divLink.innerHTML = results[i].value + ' - ' + results[i].type;
		    divLink.className = 'mapaLink';
		    divLink.onclick = createSetPointFunction(map,x,y,z);
		    wyszukInfo.appendChild(divLink);
		    var br = document.createElement('br');
		    wyszukInfo.appendChild(br);
		}
		                                                          
		  } catch(e){alert(e);alert("Niezrozumiała odpowiedź serwera");}
                endWaiting(map);
		},
		error: function (msg) {
		    alert("Chwilowy brak możliwości połączenia z serwerem.");
		    endWaiting(map);
		}
		});		

}
