var OVERLAY_MAX_ZOOM = 17;
var OVERLAY_FOLDER = "_tiles";


function getOverlaysLayer(){
	var copyright = new GCopyright(1,  new GLatLngBounds(new GLatLng(-90, -180), new GLatLng(90, 180)),10,'');
	var copyrightCollection = new GCopyrightCollection('');
	copyrightCollection.addCopyright(copyright);
	var getTileUrlFunction = function(a,b){
		return OVERLAY_FOLDER+'/tl_'+b+'_'+a.x+'_'+a.y+'.png';
	};
	var tilelayer = new GTileLayer(copyrightCollection,10,OVERLAY_MAX_ZOOM);
	tilelayer.getTileUrl = getTileUrlFunction;
	tilelayer.isPng = function(){return true;};
	tilelayer.getOpacity = function(){return 1;};
	return new GTileLayerOverlay(tilelayer);
}
function doCleanOnMap(){
	clearFilterFields(getFilterVisibleFields());
	clearFilterFields(getFilterHiddenFields());
	setFilterField('boundsNESW',gmpMap.getBounds().getNorthEast().toUrlValue()+','+gmpMap.getBounds().getSouthWest().toUrlValue())
	updateMapOverlays(false);		
	return false;
}
function doCleanOnList(){
	clearFilterFields(getFilterVisibleFields());
	clearFilterFields(getFilterHiddenFields());
	frmFilter.submit();
	return false;
}
function doSearchOnMap(){
	clearFilterFields(getFilterHiddenFields());
	updateMapOverlays(true);	
	return false;
}
function doSearchOnList(){
	clearFilterFields(getFilterHiddenFields());
	frmFilter.submit();
	return false;
}
function mapMoveEnd(){
	updateBoundsField();
}
function mapZoomEnd(){
	updateBoundsField();
	setFilterField('id','');
	updateMapOverlays(false);	
}
function mapDragEnd(){
	setFilterField('id','');
	updateMapOverlays(false);	
}
function updateBoundsField(){
	setFilterField('boundsNESW',gmpMap.getBounds().getNorthEast().toUrlValue()+','+gmpMap.getBounds().getSouthWest().toUrlValue());
}
function zoomOnID(id){
	clearFilterFields(getFilterVisibleFields());
	clearFilterFields(getFilterHiddenFields());
	setFilterField('id', id);
	updateMapOverlays(true);
}
function initPageLayout(){
    gmpMap.addControl(new GLargeMapControl()); 
	gmpMap.addControl(new GScaleControl()); 
	gmpMap.addControl(new GMapTypeControl());
	adjustMapSize();
}
function initPageEvents() {
	if (document.body.addEventListener) //FF
		document.body.addEventListener('unload', GUnload, false);
	else if (document.body.attachEvent) // IE
		document.body.attachEvent('unload', GUnload); 

	if (window.attachEvent)
		window.attachEvent("onresize", function() {adjustMapSize()} );
	else
		window.addEventListener("resize", function() {adjustMapSize()} , false);

	GEvent.addDomListener(divMap, "DOMMouseScroll", function(a) {
        wheelZoom(gmpMap, a);
    });                
    
	GEvent.addDomListener(divMap, "mousewheel", function(a) {
        wheelZoom(gmpMap, a);
    });    

    GEvent.addListener(gmpMap, "moveend", mapMoveEnd);
	GEvent.addListener(gmpMap, "dragend", mapDragEnd);
	GEvent.addListener(gmpMap, "dragend", function() {
		gmpMap.closeInfoWindow();
	});
    GEvent.addListener(gmpMap, "zoomend", mapZoomEnd);
}
function initMap() {
	if (getFilterUserConditions().length==0){
		var b = new GLatLngBounds();
		b.extend(new GLatLng(47.10, 6.85));
		b.extend(new GLatLng(36.61, 18.43));
		gmpMap.setCenter(b.getCenter(), gmpMap.getBoundsZoomLevel(b));
		updateMapOverlays(false);		
	} else {
		updateMapOverlays(true);		
	}
	gmpMap.addOverlay(getOverlaysLayer());
}
function adjustMapSize(){
	var mapTop = divMap.style.top;
	var mapLeft = divMap.style.left;
	
	var winWidth=document.all?document.body.clientWidth:window.innerWidth;
    var winHeight=document.all?document.body.clientHeight:window.innerHeight;

    divMap.style.width=(winWidth-mapLeft-50)+'px';
    divMap.style.height=(winHeight-mapTop-200)+'px';

	gmpMap.checkResize();
	setFilterField('dimensioneMappa',gmpMap.getSize().toString().replace('(', '').replace(')', '').replace(' ', ''));
}
function updateVisibleOverlays(newOverlays){
	// add not existing overlays
	for (var i=0; i<newOverlays.length();i++)
		if (!cllOverlays.exists(newOverlays.keyAt(i))){
			gmpMap.addOverlay(newOverlays.itemAt(i));
			cllOverlays.add(newOverlays.keyAt(i), newOverlays.itemAt(i));
		}
		
	// remove overlays not present any more
	for (var i=(cllOverlays.length()-1); i>-1;i--)
		if (!newOverlays.exists(cllOverlays.keyAt(i))){
			gmpMap.removeOverlay(cllOverlays.itemAt(i));
			cllOverlays.remove(cllOverlays.keyAt(i));
		}
}
function updateMapOverlays(centerOnResults){
    spnMessage.innerHTML = '<img src="_images/loading.gif" />Ricerca...';

	var conditions  = getFilterConditions();
    var KMLPath = "data.xml.asp?mode=shortXML&"+conditions.join('&');

    GDownloadUrl(KMLPath, function(data, responseCode) {
		if (responseCode=="200"){   
			spnMessage.innerHTML = 'Disegno...';
			var parseResult = parseOverlaysXMLData(data);
			var newOverlays = parseResult[0]; var bounds = parseResult[1]; var mapCount = parseResult[2];
			updateVisibleOverlays(newOverlays);
			if (centerOnResults)
				gmpMap.setCenter(bounds.getCenter(), gmpMap.getBoundsZoomLevel(bounds));
			spnMessage.innerHTML = (mapCount == 0)?"Nessun risultato.":((mapCount== 1)?"Trovato 1 impianto.":"Trovati " + mapCount+ " impianti.");
		} else {
			spnMessage.innerHTML = 'Errore #'+responseCode+'\n'+KMLPath;
		}
	});
    return false;
}
function parseOverlaysXMLData(data){
	var overlays = new Collection(); var bounds = new GLatLngBounds(); var mapCount = 0;
	var xml = GXml.parse(data);
    var maps = xml.documentElement.getElementsByTagName("Map");
    for (i=0;i<maps.length;i++){
		var map = maps[i];
        var id = map.getAttribute("id");
		var centro = map.getElementsByTagName("Center")[0];
		centro = new GLatLng(parseFloat(centro.getAttribute("lat")),parseFloat(centro.getAttribute("lng")));
		bounds.extend(centro);
		var infoHTML = maps[i].getElementsByTagName("InfoHTML")[0].childNodes[0].nodeValue;
		infoHTML += '<br><a href="impianto.asp?id='+id+'">dettaglio</a>,';
		infoHTML += ' <a href="" onclick="zoomOnID('+id+'); return false;">zoom</a>';
		var m = createSingleMapMarker(centro, infoHTML);
		overlays.add('m'+id, m);
		var bordo = map.getElementsByTagName("BoundingBox");
		if (bordo.length>0) {
			var NE = new GLatLng(parseFloat(bordo[0].getAttribute("N")),parseFloat(bordo[0].getAttribute("E")));
			bounds.extend(NE);
			var SW = new GLatLng(parseFloat(bordo[0].getAttribute("S")),parseFloat(bordo[0].getAttribute("W")));
			bounds.extend(SW);
		}
/**		var overlay = maps[i].getElementsByTagName("Overlay");
		if (overlay.length>0){
			var tlo = createTileLayerOverlay(id, overlay[0], bounds);
			overlays.add('t'+id,tlo);
		} */
		bordo = map.getElementsByTagName("BoundaryInitial");
		if ((bordo.length>0)&&(bordo[0].hasChildNodes())){
			var po = createPolylineOverlay(bordo[0], '#00FF00');
			overlays.add('br'+id, po);
		} 
		bordo = map.getElementsByTagName("BoundaryFinal");
		if ((bordo.length>0)&&(bordo[0].hasChildNodes())){
			var po = createPolylineOverlay(bordo[0], '#FF0000');
			overlays.add('bd'+id, po);
		} 
	}
	mapCount+=maps.length;
	var mapGroups = xml.documentElement.getElementsByTagName("MapGroup");
	for (i=0;i<mapGroups.length;i++){
        var id = mapGroups[i].getAttribute("id");
		var items = parseInt(mapGroups[i].getAttribute("items")); 
		mapCount += items;
		var center = mapGroups[i].getElementsByTagName("Center")[0];
		center = new GLatLng(parseFloat(center.getAttribute("lat")),parseFloat(center.getAttribute("lng")));
		bounds.extend(center);
		var boundingBox = mapGroups[i];
		boundingBox = boundingBox.getElementsByTagName("BoundingBox");
		boundingBox =boundingBox[0];
		var m = createMultipleMapMarker(items, center, parseFloat(boundingBox.getAttribute("N")), parseFloat(boundingBox.getAttribute("E")), parseFloat(boundingBox.getAttribute("S")), parseFloat(boundingBox.getAttribute("W")));
		overlays.add('M'+id, m);
	}
	return Array(overlays, bounds, mapCount);
}
function createPolylineOverlay(bordo, color){		
	bordo = bordo.childNodes[0].nodeValue;
	bordo = bordo.trim().split(" ");
	for(var j=0; j<bordo.length;j++)
		bordo[j] = bordo[j].split(",");
	var punti = new Array();					
	for(var j=0; j<bordo.length; j++)
		punti.push(new GLatLng(parseFloat(bordo[j][1]),parseFloat(bordo[j][0])));	
	return new GPolyline(punti, color, 2, 1);
}
function createTileLayerOverlay(id, overlay, bounds){
	var copyright = new GCopyright(1,  new GLatLngBounds(new GLatLng(-90, -180), new GLatLng(90, 180)),0,"");
	var copyrightCollection = new GCopyrightCollection('');
	copyrightCollection.addCopyright(copyright);
	var zoomLimits = overlay.getAttribute("zoomLimits");
	zoomLimits = zoomLimits.split(' ');
	var getTileUrlFunction = function(a,b){
		var str=OVERLAY_FOLDER+'/blank.png';
		if (zoomLimits=='')
			str=OVERLAY_FOLDER+'/' + id + '/tl_'+b+'_'+a.x+'_'+a.y+'.png';
		else
			for (var i=0; i<zoomLimits.length; i++){
				var s = zoomLimits[i].split(',');
				if (b==s[0])
					if ((a.x>=s[1])&&(a.x<=s[2])&&(a.y>=s[3])&&(a.y<=s[4]))
						str = OVERLAY_FOLDER+'/' + id + '/tl_'+b+'_'+a.x+'_'+a.y+'.png';
			}
		return str;
	};
	var tilelayer = new GTileLayer(copyrightCollection,0,OVERLAY_MAX_ZOOM);
	tilelayer.getTileUrl = getTileUrlFunction;
	tilelayer.isPng = function(){return true;};
	tilelayer.getOpacity = function(){return 1;};
	return new GTileLayerOverlay(tilelayer);
}
function createSingleMapMarker(point, html) {
    var marker = new GMarker(point); 
    GEvent.addListener(marker, "click", function() {
        marker.openInfoWindowHtml(html);
        });
    return marker;
}

function createMultipleMapMarker(mapCount, center, boundN, boundE, boundS, boundW) {
    var icon = new GIcon();
    
    if (mapCount<5){
        icon.image = "_images/logo_mappe_multiple_2.gif";
	} else if (mapCount<10){
        icon.image = "_images/logo_mappe_multiple_5.gif";            
    } else {
        icon.image = "_images/logo_mappe_multiple_10.gif";                        
        }
    
    icon.iconAnchor = new GPoint(12, 36);
    icon.iconSize = new GSize(24, 36);

    var marker = new GMarker(center, {clickable:true, icon:icon}); 
	GEvent.addListener(marker, "click", function() {
        var bounds = new GLatLngBounds();
        bounds.extend(new GLatLng(boundN, boundE));
        bounds.extend(new GLatLng(boundS, boundW));
        gmpMap.setCenter(bounds.getCenter(), gmpMap.getBoundsZoomLevel(bounds));
    });
    return marker;
}
function getFilterConditions(){
	var parameters = getFilterUserConditions();
	var par2 = getFilterSystemConditions();
	for (var i=0; i<par2.length; i++)
		parameters.push(par2[i]);
	return parameters;
}
function getFilterUserConditions(){
    var parameters = Array();
    var fields = getFilterVisibleFields();
    for (var i=0; i<fields.length; i++){
		var value = frmFilter[fields[i]].value;
		value = value.trim();
		if (value!= '')
			parameters.push(fields[i]+'='+value);
	}
    var fields = getFilterHiddenFields();
    for (var i=0; i<fields.length; i++){
		var value = frmFilter[fields[i]].value;
		value = value.trim();
		if (value!= '')
			parameters.push(fields[i]+'='+value);
	}
	return parameters;
}
function getFilterSystemConditions(){
    var parameters = Array();
	var fields = getFilterSystemFields();
    for (var i=0; i<fields.length; i++){
		var value = frmFilter[fields[i]].value;
		value = value.trim();
		if (value!= '')
			parameters.push(fields[i]+'='+value);
	}
    return parameters;
}    
function getFilterVisibleFields(){
	return new Array('omologazione_stato', 'omologazione_tipo', 'omologazione_numero', 'organo_superiore', 'nome', 'societa', 'realizzazione');        
} 
function getFilterHiddenFields(){
	return new Array('id', 'boundsNESW');        
}
function getFilterSystemFields(){
	return new Array('dimensioneMappa');
}
function setFilterField(field, value){
	frmFilter[field].value=value;
}
function getFilterField(field){
	return frmFilter[field].value;
}
function clearFilterFields(fields){
    for (var i=0; i<fields.length; i++)
		frmFilter[fields[i]].value='';
}
function wheelZoom(gmpMappa, a) { 
    if ((a.detail || -a.wheelDelta) < 0)
        gmpMappa.zoomIn(); 
    else 
        gmpMappa.zoomOut(); 
}
// aggiunta della funzione trim all'oggetto String
String.prototype.trim = function() {
	return this.replace(/^\s+|\s+$/g,"");
}
