
function MapView(cont, zoom) {
	this.ControlPanel = null;
	this.DOMContainer = cont;
	this.usaZoom = true;
	this.usaTipoMappa = true;
	this.map = null;
	this.markManager = null;
	this.allMarkers = null;
	this.ctrlZoom = null;
	this.ctrlTipoMappa = null;
	this.ctrlHistory = null;
	this.mapclickevent = null;
	this.mapmoveevent = null;
	this.geocoder = null;
	this.bSuspendHistory = false;
	this.currentObject = null;
	this.getTabsContent = null;
	
	this.MIcon = new GIcon();
	this.MIcon.image = "icons/icon7.png";
	this.MIcon.image.shadow = "icons/icon7s.png";
	this.MIcon.iconSize=new GSize(32,32);
	this.MIcon.shadowSize=new GSize(59,32);
	this.MIcon.iconAnchor=new GPoint(16,32);
	this.MIcon.infoWindowAnchor=new GPoint(16,0);

  this.map = new GMap2(cont, {draggableCursor: 'pointer'});
  //this.map.setCenter(new GLatLng(45.081476, 8.264898), zoom);
  this.map.setCenter(new GLatLng(45.136978,8.45089), 15);
  this.map.savePosition();
  this.map.setMapType(G_HYBRID_MAP);
	this.ctrlHistory = new ZoomHistoryControl(this.map);
	this.ctrlHistory.addHistory();
  this.geocoder = new GClientGeocoder();
  this.geocoder.setCache(null);
	
	this.allMarkers = new Array();
	this.markManager = new GMarkerManager(this.map, {trackMarkers: true});
  this.loadAllMarkers();

	GEvent.bind(this.map, "click", this, this.mapClicked);
	GEvent.bind(this.map, "moveend", this, this.viewportChanged);
}

MapView.prototype.loadAllMarkersCB = function(httpObj, owner) {
	if (httpObj.readyState == 4) {
		if (httpObj.status == 200) {
			owner.processAllMarkersXML(GXml.parse(httpObj.responseText));
		}
	}
}

MapView.prototype.loadSingleObjectCB = function(httpObj, owner) {
	if (httpObj.readyState == 4) {
		if (httpObj.status == 200) {
			owner.processSingleObjectXML(GXml.parse(httpObj.responseText));
		}
	}
}

MapView.prototype.showInfo = function(httpObj, owner) {
	if (httpObj.readyState == 4) {
		if (httpObj.status == 200) {
			if (owner.currentObject != null) {
				owner.bSuspendHistory = true;
				owner.map.openInfoWindowTabs(owner.currentObject.getPoint(), owner.getTabsContent(GXml.parse(httpObj.responseText)));
			}
			owner.currentObject = null;
		}
	}
}


MapView.prototype.getHttpObject = function() {
	var ret = null;
	if (window.XMLHttpRequest) { 
		ret = new XMLHttpRequest();
		if (ret.overrideMimeType) {
			ret.overrideMimeType('text/xml');
		}
	} else if (window.ActiveXObject) { 
		try {
			ret = new ActiveXObject("Msxml2.XMLHTTP");
		} catch (e) {
			try {
				ret = new ActiveXObject("Microsoft.XMLHTTP");
			} catch (e) {
			}
		}
	}
	return ret;
}

MapView.prototype.downloadUrl = function(sUrl, cbfunc, ownerobj) {
	var httpObj = this.getHttpObject();
	if (!httpObj) {
		return false;
	}
	if (!ownerobj) ownerobj = this;
	httpObj.onreadystatechange = function() { 
		cbfunc(httpObj, ownerobj); 
	}
  httpObj.open('GET', sUrl, true);
  httpObj.send(null);
}


MapView.prototype.getObjectCenter = function(xObj) {
	ret = this.map.getCenter();
	var path = xObj.getElementsByTagName("VERTICI")[0];
	var nvertici = path.getAttribute("num");
	var vertici = path.getElementsByTagName("VERTICE");
	if (nvertici > 2) {
		var newLat = 0;
		var newLng = 0;
		var minLat = parseFloat(vertici[0].getAttribute("lat"));
		var minLng = parseFloat(vertici[0].getAttribute("lng"));
		var maxLat = minLat;
		var maxLng = minLng;
		for (var i = 1; i < nvertici; i++) {
			newLat = parseFloat(vertici[i].getAttribute("lat"));
			newLng = parseFloat(vertici[i].getAttribute("lng"));
			minLat = Math.min(minLat, newLat);
			minLng = Math.min(minLng, newLng);
			maxLat = Math.max(maxLat, newLat);
			maxLng = Math.max(maxLng, newLng);
		}
		ret = new GLatLng(minLat + ((maxLat - minLat) / 2), minLng + ((maxLng - minLng) / 2));
	}
	return ret;
}

MapView.prototype.addMarker = function(lat, lng, idrec, tit, ic, flag, zoom) {
	var point = null;
	var mk = null;
	var newIcon = this.MIcon;
	point = new GLatLng(lat, lng);
	if (ic != '') {
		newIcon = new GIcon();
		newIcon.image = "icons/" + ic + ".png";
		if (flag == 'continent') {
			newIcon.iconSize = new GSize(80,84);
		} else if (flag == 'nazione') {
			newIcon.iconSize = new GSize(30,20);
		} else {
			newIcon.iconSize = new GSize(30,45);
		}
		newIcon.iconAnchor = new GPoint(10,10);
		newIcon.infoWindowAnchor = new GPoint(10,10);
	}
	mk = new GMarker(point, {clickable: true, title: tit, icon: newIcon});
	mk.idrecord = idrec;
	mk.isPolygon = false;
	mk.flag = flag;
	if (flag == 'nazione') {
		mk.zoom = zoom;
	}
	return mk;
}

MapView.prototype.mapClicked = function(marker, point) {
	if (marker != null) {
		if (marker.idrecord) {
			MainTabs.closePanel(true);
			var iZoom = 6;
			if (marker.flag == 'continent') {
				this.map.setCenter(marker.getPoint(), 3);
			} else if (marker.flag == 'nazione') {
				iZoom = 6;
				if (marker.zoom) {
					iZoom = marker.zoom;
				}
				this.map.setCenter(marker.getPoint(), iZoom);
			} else {
				if (this.map.getZoom() < 11){
					this.map.setCenter(marker.getPoint(), 11);
				}
				var d = new Date();
				var strUrl = 'get_info.php?idrecord=' + marker.idrecord + '&dummy=' + d.getTime();
				this.currentObject = marker;
				this.downloadUrl(strUrl, this.showInfo);
			}
		}
	}
}

MapView.prototype.createMapObject = function(xObj) {
	var ret = null;
	var punti = new Array();
	var titolo = GXml.value(xObj.getElementsByTagName("TITOLO")[0]);
	if (titolo == '') {
		titolo = 'Senza nome';
	}
	var path = xObj.getElementsByTagName("VERTICI")[0];
	var nvertici = path.getAttribute("num");
	var vertici = path.getElementsByTagName("VERTICE");
	if (nvertici > 2) {
		var cntr = this.getObjectCenter(xObj);
		ret = this.addMarker(cntr.lat(), cntr.lng(), xObj.getAttribute("id"), titolo, GXml.value(xObj.getElementsByTagName("ICON")[0]));
	}
	return ret;
}

MapView.prototype.getViewport = function() {
	var mapbounds = this.map.getBounds();
	var sw = mapbounds.getSouthWest();
	var ne = mapbounds.getNorthEast();
	var str = 'envelope=';
	str += sw.lat() + ' ' + sw.lng() + ',' + ne.lat() + ' ' + ne.lng();
	str += '&zoom=' + this.map.getZoom();
	return str;	
}

MapView.prototype.viewportChanged = function() {
	if (this.bSuspendHistory) {
		this.bSuspendHistory = false;
	} else {
		this.ctrlHistory.addHistory();
	}
	if (this.ControlPanel) {
		this.ControlPanel.zoomChanged();
	}
}


MapView.prototype.processSingleObjectXML = function(xmlobj) {
	var xdoc = xmlobj.documentElement;
	var polRoot = xdoc.getElementsByTagName("POLYGONS")[0];
	var polygons = polRoot.getElementsByTagName("POLYGON");
	if (polygons.length > 0) {
		var xpolygon = null;
		var titolo = '';
		var polId = 0;
		var punti = null;
		var path = null;
		var nvertici = 0;
		var vertici = null;
		xpolygon = polygons[0];
		polId = parseInt(xpolygon.getAttribute("id"));
		this.allMarkers[polId] = this.createMapObject(xpolygon);
		this.markManager.addMarker(this.allMarkers[polId], 5);
		this.map.setCenter(this.getObjectCenter(xpolygon), xpolygon.getAttribute("max_zoom"));
		this.mapClicked(this.allMarkers[polId]);
	}	
}

MapView.prototype.processAllMarkersXML = function(xmlobj) {
	var xdoc = xmlobj.documentElement;
	var contRoot = xdoc.getElementsByTagName("CONTINENTS")[0];
	var continents = contRoot.getElementsByTagName("CONTINENT");
	if (continents.length > 0) {
		var allconts = new Array();
		for (var i = 0; i < continents.length; i++) {
			var xcont = continents[i];
			var sid = xcont.getAttribute("id");
			var contid = parseInt(sid.substr(3));
			var titolo = GXml.value(xcont.getElementsByTagName("TITOLO")[0]);
			var centro = xcont.getElementsByTagName("CENTRO")[0];
			allconts[i] = this.addMarker(parseFloat(centro.getAttribute("lat")), parseFloat(centro.getAttribute("lng")), contid, titolo, GXml.value(xcont.getElementsByTagName("ICON")[0]), 'continent');
		}
		this.markManager.addMarkers(allconts, 0, 2);
	}

	var natRoot = xdoc.getElementsByTagName("NATIONS")[0];
	var nations = natRoot.getElementsByTagName("NATION");
	if (nations.length > 0) {
		var allnats = new Array();
		for (var i = 0; i < nations.length; i++) {
			var xcont = nations[i];
			var sid = xcont.getAttribute("id");
			var contid = parseInt(sid.substr(3));
			var natzoom = parseInt(xcont.getAttribute("zoom"));
			var titolo = GXml.value(xcont.getElementsByTagName("TITOLO")[0]);
			var centro = xcont.getElementsByTagName("CENTRO")[0];
			allnats[i] = this.addMarker(parseFloat(centro.getAttribute("lat")), parseFloat(centro.getAttribute("lng")), contid, titolo, GXml.value(xcont.getElementsByTagName("ICON")[0]), 'nazione', natzoom);
		}
		this.markManager.addMarkers(allnats, 3, 4);
	}

	var polRoot = xdoc.getElementsByTagName("POLYGONS")[0];
	var polygons = polRoot.getElementsByTagName("POLYGON");
	if (polygons.length > 0) {
		var xpolygon = null;
		var titolo = '';
		var polId = 0;
		var punti = null;
		var path = null;
		var nvertici = 0;
		var vertici = null;
		var allpolys = new Array();
		for (var i = 0; i < polygons.length; i++) {
			xpolygon = polygons[i];
			polId = parseInt(xpolygon.getAttribute("id"));
			this.allMarkers[polId] = this.createMapObject(xpolygon);
			allpolys[i] = this.allMarkers[polId]
		}
		this.markManager.addMarkers(allpolys, 5);
	}	

	this.markManager.refresh();

}

MapView.prototype.loadAllMarkers = function() {
	var d = new Date();
	sUrl = 'getmarkerslist.php?dummy=' + d.getTime();
	this.downloadUrl(sUrl, this.loadAllMarkersCB);
}

MapView.prototype.loadSingleObject = function(nId) {
	var d = new Date();
	sUrl = 'getmarkerslist.php?dummy=' + d.getTime() + '&id_object=' + nId;
	this.downloadUrl(sUrl, this.loadSingleObjectCB);
}


