var gm_prm = null;
var map = null;

function GMObject(id_container,lat,lng,zoomLiv) {
	this.id_container = id_container;
	this.lat = lat;
	this.lng = lng;
	this.zoomLiv = zoomLiv;
	this.SHOW_SMALL_CRT = false;  			//Visualizza ZOOM controller grande
	this.SHOW_LARGE_CRT = true;				//Visualizza ZOOM controller piccolo
	this.SHOW_HIERARCHICAL_CRT = false;		//Visualizza Controller per la visualizzazione MAPPA-SATELLITARE
	this.SHOW_TYPE_CRT = true;				//Visualizza Controller per la visualizzazione MAPPA-SATELLITARE-IBRIDA
	this.SHOW_OVERVIEW_CRT = false;			//Visualizza Riquadro con mappa in piccolo per spostamenti generali
	this.SHOW_SCALE_CRT = true;				//Visualizza barra della scala in basso a sinistra
	this.ENABLE_SCROLLWHELL_ZOOM = true;	//ABILITA ZOOM tramite scroll della rotella del mouse
	this.ENABLE_DOUBLECLICK_ZOOM = false;	//ABILITA ZOOM tramite doppio click del tasto sinistro del mouse
	this.ENABLE_GOOGLE_BAR = false;			//ABILITA una google bar interna alla mappa per la ricerca geografica
	this.ENABLE_INFO_WINDOW = true;			//Abilita la visualizzazione delle nuvolette informative al click sui nodi
	this.ENABLE_MAP_DRAGGING = true;		//Abilita lo spostamento tramite DRAGGING della mappa
	
	this.customIcons = [];
	this.last_point = null;
	this.map = null;
	this.iconList = new Array();
	this.geocoder = null;
	
	//METODI
	this.addGMapIcon = addGMapIcon;
	this.loadMap = loadMap;
	this.loadMapIcon = loadMapIcon;
	this.createMapMarker = createMapMarker;
	this.addNewNode = addNewNode;
	this.showMapAddress = showMapAddress;
	
}

var last_label_clk = "";
function loadLabelMap(id,name,marker) {
	$('#list_node').append("<div id='node_"+id+"' style='cursor: pointer'>"+name+"</div>");
	$('#node_'+id).click(function () { 
		GEvent.trigger(marker,'click');
	});	
}

function loadMap() {
	gm_prm = this;
	if (GBrowserIsCompatible()) {
		this.loadMapIcon();
		  
		map = new GMap2(document.getElementById(this.id_container));
		
		if(this.SHOW_LARGE_CRT) map.addControl(new GLargeMapControl());
		if(this.SHOW_SMALL_CRT) map.addControl(new GSmallMapControl()); //ZOOM controller piccolo
		if(this.SHOW_HIERARCHICAL_CRT) map.addControl(new GHierarchicalMapTypeControl()); //Controller alto per tipologia mappa
		if(this.SHOW_OVERVIEW_CRT) map.addControl(new GOverviewMapControl()); //Riquadro per spostamento veloce in basso
		if(this.SHOW_TYPE_CRT) map.addControl(new GMapTypeControl());
		if(this.SHOW_SCALE_CRT) map.addControl(new GScaleControl());
		
		if(this.ENABLE_SCROLLWHELL_ZOOM) map.enableScrollWheelZoom();
		else map.disableScrollWheelZoom();		
		if(this.ENABLE_DOUBLECLICK_ZOOM) map.enableDoubleClickZoom();
		else map.disableDoubleClickZoom();		
		if(this.ENABLE_GOOGLE_BAR) map.enableGoogleBar();
		else map.disableGoogleBar();		
		if(this.ENABLE_INFO_WINDOW) map.enableInfoWindow();
		else map.disableInfoWindow();		
		if(this.ENABLE_MAP_DRAGGING) map.enableDragging();
		else map.disableDragging();
		
		this.geocoder = new GClientGeocoder();
		map.setCenter(new GLatLng(this.lat,this.lng),this.zoomLiv);
		

		this.map = map;
		// CARICAMENTO NODI da file XML generato via PHP
		
		//GDownloadUrl("getXmlMap.php", function(data) {
		/*GDownloadUrl("getNearXml.php?lng=9.187703132629395&lat=45.463622252143225&radius=10", function(data) {
			var xml = GXml.parse(data);
			var markers = xml.documentElement.getElementsByTagName("marker");
	  		for (var i = 0; i < markers.length; i++) {
	  			var id = markers[i].getAttribute("id");
	  			var name = markers[i].getAttribute("name");
				var address = markers[i].getAttribute("address");
				var type = markers[i].getAttribute("type");
				var point = new GLatLng(parseFloat(markers[i].getAttribute("lat")),parseFloat(markers[i].getAttribute("lng")));
				var marker = this.createMapMarker(point, name, address, type, id);
	    		
				map.addOverlay(marker);
				loadLabelMap(id,name,marker);				
	  		}
		});*/
	
		// EVENTO sul CLICK per la rilevazione delle coordinate cliccate
		/*GEvent.addListener(map, 'click', function(overlay,point) {
			if(point) {
				$('#data_lat').attr('value',point.y);
				$('#data_long').attr('value',point.x);
				gm_prm.last_point = point;
			}
		});*/
	
		// EVENTO sul RIGHT-CLICK per la cancellazione di uno dei nodi nella mappa
		/*GEvent.addListener(map, 'singlerightclick', function(point,src,overlay) {
			if (overlay) {
				if(confirm("Sicuro di voler cancellare "+overlay.getTitle()+"?")) {
					map.removeOverlay(overlay);
				}
			}
	    });*/
	}
}


function showMapAddress(xmlscript,address,radius,countryCode,cnt) {
	//var markers = null;
	this.geocoder.setBaseCountryCode(countryCode);
	this.geocoder.getLatLng(address,
		function(point) {
			if (!point) {
				alert(address + " non trovato");
			} else {
				var xmlurl = xmlscript+"/"+point.x+"/"+point.y+"/"+radius;
				var center = new GLatLng(point.y, point.x);
				var base_marker = this.createStartMarker(center, address.toUpperCase(), "Località selezionata", 'start', 'start_node',false);
				var bounds = new GLatLngBounds();
				
				this.map.clearOverlays();
				$('#list_node').html("");
				
				GDownloadUrl(xmlurl, function(data) {
					var xml = GXml.parse(data);
					var markers = xml.documentElement.getElementsByTagName("marker");
					
			  		for (var i = 0; i < markers.length; i++) {
			  			var id = markers[i].getAttribute("map_id");
						var name = markers[i].getAttribute("name");
						var region = markers[i].getAttribute("region");
						var area = markers[i].getAttribute("area");
						var city = markers[i].getAttribute("city");
						var pr = markers[i].getAttribute("pr");
						var address = markers[i].getAttribute("address");
						var cap = markers[i].getAttribute("cap");
						var tel = markers[i].getAttribute("tel");
						var fax = markers[i].getAttribute("fax");
						var mail = markers[i].getAttribute("mail");
						var distance = markers[i].getAttribute("distance");
						
						var type = "mnp";
						var point = new GLatLng(parseFloat(markers[i].getAttribute("lat")),parseFloat(markers[i].getAttribute("lng")));
						var marker = this.createMapMarker(point, name, region, area, city, pr, address, cap, tel, fax, mail, distance, type, id, false);
						bounds.extend(point);
						
						this.map.addOverlay(marker);
						loadLabelMap(id,name,marker);				
			  		}
			  		this.map.addOverlay(base_marker);
			  		bounds.extend(center);
					
			  		map.setCenter(bounds.getCenter(), map.getBoundsZoomLevel(bounds));
				});
			}
		}
	);
	
}
 
function createMapMarker(point, name, region, area, city, pr, address, cap, tel, fax, mail, distance, type, id, drg) {
	var options = { 
		draggable: drg,
		bouncy: false,
		title: name,
		icon: gm_prm.customIcons[type]
	};

	var marker = new GMarker(point, options);
	var dst = ""+distance;
	var html ="<strong>" + name + " (" + dst.substring(0,3) + " km)</strong><br/>";
		html+="<br/><strong>Area:</strong> " + area;
		html+="<br/><strong>Sede:</strong> " + city + " - " + address + " (" + pr + " - " + cap + ")";
		html+="<br/><strong>Tel:</strong> " + tel;
		html+="<br/><strong>Fax:</strong> " + fax;
		html+="<br/><strong>e-mail:</strong> <a href='mailto:"+mail+"'>" + mail + "</a>";
	
	var html2 ="<p class='pad-15'><strong>" + name + " </strong>(" + pr + " - " + cap + " - " + dst.substring(0,3) + " km)";
		html2+="<br/>" + address;
		html2+=" - tel: " + tel + " fax: " + fax;
		html2+=" - e-mail: <a href='mailto:"+mail+"'>" + mail + "</a></p>";
	$('#list-map').append(html2);
		
		
	GEvent.addListener(marker, 'click', function() {
	  	marker.openInfoWindowHtml(html);
	  	if(id!=-1) {
	  		$('#node_'+id).css({"background-color": "#eee"});
	  		if(last_label_clk != "") $('#'+last_label_clk).css({"background-color": null});
	  		last_label_clk = 'node_'+id;
	  	}
	});

	
	GEvent.addListener(marker, 'dragend', function(latLng) {
		$('#latitude').attr('value',latLng.lat());
		$('#longitude').attr('value',latLng.lng());
    });

	return marker;
}

function createStartMarker(point, name, address, type, id, drg) {
	var options = { 
		draggable: drg,
		bouncy: false,
		title: name,
		icon: gm_prm.customIcons[type]
	};
	
	var marker = new GMarker(point, options);
	
	var html = "<strong>" + name + "</strong> <br/>" + address;
	GEvent.addListener(marker, 'click', function() {
	  	marker.openInfoWindowHtml(html);
	  	if(id!=-1) {
	  		$('#node_'+id).css({"background-color": "#eee"});
	  		if(last_label_clk != "") $('#'+last_label_clk).css({"background-color": null});
	  		last_label_clk = 'node_'+id;
	  	}
	});
	
	
	GEvent.addListener(marker, 'dragend', function(latLng) {
		$('#latitude').attr('value',latLng.lat());
		$('#longitude').attr('value',latLng.lng());
	});
	
	return marker;
}

/*function createMapMarker(point, name, address, type, id, drg) {
	var options = { 
		draggable: drg,
		bouncy: false,
		title: name,
		icon: gm_prm.customIcons[type]
	};

	var marker = new GMarker(point, options);
	
	var html = "<b>" + name + "</b> <br/>" + address;
	GEvent.addListener(marker, 'click', function() {
	  	marker.openInfoWindowHtml(html);
	  	if(id!=-1) {
	  		$('#node_'+id).css({"background-color": "#eee"});
	  		if(last_label_clk != "") $('#'+last_label_clk).css({"background-color": null});
	  		last_label_clk = 'node_'+id;
	  	}
	});

	
	GEvent.addListener(marker, 'dragend', function(latLng) {
		$('#latitude').attr('value',latLng.lat());
		$('#longitude').attr('value',latLng.lng());
    });

	return marker;
}*/

function addGMapIcon(type,iPath,iH,iW,sPath,sH,sW,aH,aW,infW,infH) {
	var iconPrm = new Array(type,iPath,iH,iW,sPath,sH,sW,aH,aW,infW,infH);
	this.iconList.push(iconPrm);
}

function loadMapIcon() {
	for(var i=0;i<this.iconList.length;i++) {
		var type = this.iconList[i][0];
		var iPath = this.iconList[i][1];
		var iH = this.iconList[i][2];
		var iW = this.iconList[i][3];
		var sPath = this.iconList[i][4];
		var sH = this.iconList[i][5];
		var sW = this.iconList[i][6];
		var aH = this.iconList[i][7];
		var aW = this.iconList[i][8];
		var infW = this.iconList[i][9];
		var infH = this.iconList[i][10];
		
		var icon = new GIcon(); 
		icon.image = iPath;
		icon.shadow = sPath;
		icon.iconSize = new GSize(iH, iW);
		icon.shadowSize = new GSize(sH, sW);
		icon.iconAnchor = new GPoint(aH, aW);
		icon.infoWindowAnchor = new GPoint(infH, infH);
		
		this.customIcons[type] = icon;
	}
}

/*function addNewNode() {
	var name = $('#data_eth').attr('value');
	var address = $('#data_address').attr('value');
	var pos = document.getElementById('data_type').selectedIndex;
	var type = document.getElementById('data_type').options[pos].value
		
	if(name!="" && address!="") {
		var marker = this.createMapMarker(this.last_point,name,address,type,-1);
		this.map.addOverlay(marker);
		var id = Number(new Date());
		loadLabelMap(id,name,marker);
	} else {
		alert("ERRORE: Impossibile procedere, inserire ETICHETTA ed INDIRIZZO");
	}
}*/

function addNewNode() {
	var name = "NOME";//$('#data_eth').attr('value');
	var address = $('#address').attr('value');
	//var pos = document.getElementById('data_type').selectedIndex;
	var type = "mnp";//document.getElementById('data_type').options[pos].value
		
	if(name!="" && address!="") {
		this.geocoder.getLatLng(address, function(point) {
			if (!point) {
				alert(address + " non trovato");
			} else {
				this.map.clearOverlays();
				var marker = this.createMapMarker(point,name,address,type,-1,true);
				this.map.addOverlay(marker);
				var id = Number(new Date());
				loadLabelMap(id,name,marker);
				var lat = point.y;
				var lng = point.x;
				$('#latitude').attr('value',lat);
				$('#longitude').attr('value',lng);
				
				var bounds = new GLatLngBounds();
				bounds.extend(point);				
		  		this.map.setCenter(bounds.getCenter(), this.map.getBoundsZoomLevel(bounds)-6);
			}
		});
	} else {
		alert("ERRORE: Impossibile procedere, inserire ETICHETTA ed INDIRIZZO");
	}
}