function MarkerManager()
{
	this.callout = new Callout();
	this.callout.createCallout(); // create 1 callout for all markers to be used.

	this.overlayData = new Array();

	this.addMarkerGroup = function(markergroup) { this.overlayData[markergroup] = new Array(); }
	
	this.removeMarkerGroup = function(markergroup) { this.overlayData[markergroup] = null; }
	
	this.existsMarkerGroup = function(markergroup)
	{
		if(this.overlayData.length > 0)
		{
			for (s = 0; s < this.overlayData.length; s++)
			{
				if(s == markergroup)
				{
					if(this.overlayData[s].length > 0)
					{
						return true;
					}
				}
			}
		}
		return false;
	}

	this.showMarkerGroup = function(markergroup)
	{
		var markers = this.overlayData[markergroup];
		for(marker=0; marker < markers.length; marker++)
		{
			if(markers[marker].isHidden()) { markers[marker].show(); }
		}
	}

	this.hideMarkerGroup = function(markergroup)
	{
		var markers = this.overlayData[markergroup];
		for(marker=0; marker < markers.length; marker++)
		{
			if(!markers[marker].isHidden()) { markers[marker].hide(); }
		}
	}

	this.hideAllMarkerGroup = function()
	{
		for(group=0; group < this.overlayData.length; group++)
		{
			var markers = this.overlayData[group];
			if(markers.length > 0 && typeof(markers) != 'undefined')
			{
				for(marker=0; marker < markers.length; marker++)
				{
					if(!markers[marker].isHidden())
					{
						markers[marker].hide();
					}
				}
			}
		}
	}

	this.showMarkerGroups = function()
	{
		for (var i in this.overlayData)
		{
			alert(this.overlayData[i]);
		}
	}
	
	this.addMarker = function(markergroup, marker)
	{
		this.overlayData[markergroup].push(marker);
		applicationObject.mapObject.map.addOverlay(marker);
	}

	this.removeMarker = function(markergroup, markerSrc)
	{
		var markers = this.overlayData[markergroup];
		var markerCounter = 0;
		for(marker=0; marker < markers.length; marker++)
		{
			if(markers[marker] == markerSrc) { markers[marker].splice(markerCounter, 1); }
			markerCounter++;
		}
	}

	this.existMarker = function(id)
	{
		for(var group in this.overlayData)
		{
			var markers = this.overlayData[group];
			for(var marker in markers)
			{
				if(markers[marker].id == id)
				{
					return markers[marker];
				}
			}
		}
	}

	this.getCirclePoints = function(radius, nodes, centre)
	{
		var center = centre || applicationObject.mapObject.map.getCenter();

		//calculating km/degree
		var latConv = center.distanceFrom(new GLatLng(center.lat()+0.1, center.lng()))/100;
		var lngConv = center.distanceFrom(new GLatLng(center.lat(), center.lng()+0.1))/100;

		//Loop 
		var points = [];
		var step = parseInt(360/nodes) || 10;
		for(var i=0; i<=360; i+=step)
		{
			var pint = new GLatLng(center.lat() + (radius/latConv * Math.cos(i * Math.PI/180)), center.lng() + (radius/lngConv * Math.sin(i * Math.PI/180)));
			points.push(pint);
		}
		points.push(points[0]); // Closes the circle

		return points;
	}

	this.zoomMarkerGroups = function(zoom)
	{
		for(var group in this.overlayData)
		{
			var markers = this.overlayData[group];
			for(var marker in markers)
			{
				markers[marker].resize(zoom);
			}
		}
	}

	this.loadMarkerGroup = function(markergroup, force)
	{
		var markergroup = parseInt(markergroup);
		var loading = false;

		if(force)
		{
			this.addMarkerGroup(markergroup);
			loading = true;
		}
		else
		{
			if(!this.existsMarkerGroup(markergroup))
			{
				this.addMarkerGroup(markergroup);
				loading = true;
			}
		}	

		if(loading)
		{
			var self = this;
			var bounds = applicationObject.mapObject.map.getBounds();
			var southWest = bounds.getSouthWest();
			var northEast = bounds.getNorthEast();
			var zoom = applicationObject.mapObject.map.getZoom();

			$.getJSON("index.php", { page_id: "7", action: "getmarkersmodel1", markergroup: markergroup, ne: northEast.toUrlValue(), sw: southWest.toUrlValue(), zoom: zoom }, function(data)
			{
				var radius = data.radius;
				var count = data.node_count;
				var marker_points = self.getCirclePoints(radius, count);
				$.each(data.nodes, function(i, node)
				{
					var markerObject = new Marker(markergroup, node.id, marker_points[i], node.name, node.data);
					self.addMarker(markergroup, markerObject);
				});
			});
		}
	}
	
	this.loadModel1 = function(force)
	{
		for(markergroup=1; markergroup < 8; markergroup++)
		{
			this.loadMarkersModel1(markergroup, force);
		}
	}
	
	this.loadModel1Small = function(force)
	{
		for(markergroup=1; markergroup < 5; markergroup++)
		{
			this.loadMarkersModel1(markergroup, force);
		}
	}
	
	this.loadMarkersModel1 = function(markergroup, force)
	{
		var loading = false;

		if(force)
		{
			this.addMarkerGroup(markergroup);
			loading = true;
		}
		else
		{
			if(!this.existsMarkerGroup(markergroup))
			{
				this.addMarkerGroup(markergroup);
				loading = true;
			}
		}
		if(loading)
		{
			var self = this;
			var bounds = applicationObject.mapObject.map.getBounds();
			var southWest = bounds.getSouthWest();
			var northEast = bounds.getNorthEast();
			var zoom = applicationObject.mapObject.map.getZoom();

			$.getJSON("index.php", { page_id: "7", action: "getmarkersmodel1", markergroup: markergroup, ne: northEast.toUrlValue(), sw: southWest.toUrlValue(), zoom: zoom }, function(data)
			{
				if(markergroup > 1)
				{
					var radius = data.radius;
					var count = data.node_count;
					var marker_points = self.getCirclePoints(radius, count);
					$.each(data.nodes, function(i, node)
					{
						var markerObject = new Marker(markergroup, node.id, marker_points[i], node.name, node.data);
						self.addMarker(markergroup, markerObject);
					});
				}
				else
				{
					$.each(data.nodes, function(i, node)
					{
						var markerObject = new Marker(markergroup, node.id, applicationObject.mapObject.map.getCenter(), node.name, node.data);
						self.addMarker(markergroup, markerObject);
					});
				}
			});
		}
	}
	
	this.loadModel2 = function(madmen_id, force)
	{
		return true;
		for(markergroup=8; markergroup < 11; markergroup++)
		{
			this.loadMarkersModel2(markergroup, madmen_id, force);
		}
	}
	
	this.loadMarkersModel2 = function(markergroup, madmen_id, force)
	{
		var loading = false;

		if(force)
		{
			this.addMarkerGroup(markergroup);
			loading = true;
		}
		else
		{
			if(!this.existsMarkerGroup(markergroup))
			{
				this.addMarkerGroup(markergroup);
				loading = true;
			}
		}
		if(loading)
		{
			var self = this;
			var bounds = applicationObject.mapObject.map.getBounds();
			var southWest = bounds.getSouthWest();
			var northEast = bounds.getNorthEast();
			var zoom = applicationObject.mapObject.map.getZoom();

			$.getJSON("index.php", { page_id: "10", action: "getmarkersmodel2", markergroup: markergroup, madmen_id: madmen_id, ne: northEast.toUrlValue(), sw: southWest.toUrlValue(), zoom: zoom }, function(data)
			{
				if(markergroup > 8)
				{
					var radius = data.radius;
					var count = data.node_count;
					var marker_points = self.getCirclePoints(radius, count);
					$.each(data.nodes, function(i, node)
					{
						var markerObject = new Marker(markergroup, node.id, marker_points[i], node.name, node.data);
						self.addMarker(markergroup, markerObject);
					});
				}
				else
				{
					$.each(data.nodes, function(i, node)
					{
						var markerObject = new Marker(markergroup, node.id, applicationObject.mapObject.map.getCenter(), node.name, node.data);
						self.addMarker(markergroup, markerObject);
					});
				}
			});
		}
	}
}