function FMarker(aPos, aMarkerTemplate, aContentId, aOptions, aTooltip)
{
	if(aOptions != null)
	{
		aOptions["icon"] = aMarkerTemplate.getGMapIcon();
		this._gmapMarker = new GMarker(aPos.toGLang(), aOptions);
	}
	else
	{
		this._gmapMarker = new GMarker(aPos.toGLang(), {draggable: true, icon:aMarkerTemplate.getGMapIcon()});
	}
		
	this._gmapMarker.tooltip = new FTooltip(this._gmapMarker, aTooltip, 4);
	this._tooltip = aTooltip;
	this._position = aPos;
	this._contentId = aContentId;
	this._markerTemplate = aMarkerTemplate;
	var _proxy = this;
	GEvent.addListener(this._gmapMarker, "dragend", function() { _proxy._dragEnd(); });
	this.disableDragging();
	this._id = 0;
	this._callbackArray = new Array();
}

FMarker.prototype._clickListener;
FMarker.prototype._mouseInListener;
FMarker.prototype._mouseOutListener;
FMarker.prototype._callbackArray;
FMarker.prototype._tooltip;

FMarker.prototype._position;
FMarker.prototype._markerTemplate;
FMarker.prototype._contentId;
FMarker.prototype._id;
FMarker.prototype._gmapMarker;
FMarker.prototype._fmap;

FMarker.prototype.enableDragging = function() { this._gmapMarker.enableDragging(); }
FMarker.prototype.disableDragging = function() { this._gmapMarker.disableDragging(); } 
FMarker.prototype.getContentID = function() { return this._contentId; }
FMarker.prototype.getID = function() { return this._id; }
FMarker.prototype.getPosition = function() { return this._position; }
FMarker.prototype.getMarkerTemplate = function() { return this._markerTemplate; }
FMarker.prototype.getGMapMarker = function() { return this._gmapMarker; }
FMarker.prototype.getFMap = function() { return this._fmap; } 

FMarker.prototype.setID = function(aId) { this._id = aId; }

FMarker.prototype.addListener = function (aName, aCallback)
{
	if(this._callbackArray[aName])
	{
		this._callbackArray[aName][0]++;
		this._callbackArray[aName][this._callbackArray[aName][0]] = aCallback;
		return this._callbackArray[aName][0];
	} else
	{
		this._callbackArray[aName] = new Array();
		this._callbackArray[aName][0] = 1;
		this._callbackArray[aName][this._callbackArray[aName][0]] = aCallback;
		return this._callbackArray[aName][0];
	}
}

FMarker.createFromArray = function(aArray)
{
	var lMarkerTemplate = null;
	if(aArray["image"] != null || aArray["shadowImage"] != null || aArray["hoverImage"] != null)
	{
		lMarkerTemplate = FConfig['MARKER_TEMPLATES'][aArray.template_type].copy();
		if(aArray["image"] != null)
			lMarkerTemplate.setImage(aArray["image"]);
		if(aArray["shadowImage"] != null)
			lMarkerTemplate.setShadowImage(aArray["shadowImage"]);
		if(aArray["hoverImage"] != null)
			lMarkerTemplate.setHoverImage(aArray["hoverImage"]);
			
	} else
		lMarkerTemplate = FConfig['MARKER_TEMPLATES'][aArray.template_type];

	/* var lFmarker = new FMarker(
			new FVector2(aArray.cor_x, aArray.cor_y),
			FConfig['MARKER_TEMPLATES'][aArray.template_type],
			aArray.content_id,
			null,
			aArray.tooltip);*/
	var lFmarker = new FMarker(
			new FVector2(aArray.cor_x, aArray.cor_y),
			lMarkerTemplate,
			aArray.content_id,
			null,
			aArray.tooltip);
		
	lFmarker.setID(aArray.id);
	return lFmarker;
}

FMarker.prototype._dragEnd = function()
{
	for(var lCallback in this._callbackArray["dragend"])
	{
		this._position = new FVector2(this._gmapMarker.getLatLng().lat(), this._gmapMarker.getLatLng().lng());
		if(lCallback != 0 && this._callbackArray["dragend"][lCallback]) { this._callbackArray["dragend"][lCallback](this); }
		this._gmapMarker.tooltip = new FTooltip(this._gmapMarker, this._tooltip, 4);
	}
}

FMarker.prototype._initialize = function(aFmap) 
{ 
	this._fmap = aFmap;
	
	this._clickListener = GEvent.bind(this.getGMapMarker(), "click", this, function() 
	{ 
		this.getMarkerTemplate().getClickCallback()(this);
	});
	this._mouseInListener = GEvent.bind(this.getGMapMarker(), "mouseover", this, function()
	{
		this.getGMapMarker().setImage(this.getMarkerTemplate().getHoverImage());
		this._gmapMarker.tooltip.show();
	});
	this._mouseInListener = GEvent.bind(this.getGMapMarker(), "mouseout", this, function()
	{
		this.getGMapMarker().setImage(this.getMarkerTemplate().getImage());
		this._gmapMarker.tooltip.hide();
	});
}

FMarker.prototype.setPosition = function(aPosition)
{
	this._position = aPosition;
	this._gmapMarker.setLatLng(aPosition.toGLang());
}

FMarker.prototype.getPosition = function()
{
	return this._position;
}

FMarker.prototype._destroy = function()
{
	GEvent.removeListener(this._clickListener);
}

FMarker.prototype.setContentID = function(aContentId)
{
	this._contentId = aContentId;
}
FMarker.prototype.setID = function(aId)
{
	this._id = aId;
}

FMarker.prototype.setMarkerTemplate = function(aMarkerTemplate)
{
	this._markerTemplate = aMarkerTemplate;
}

// Helper function to fetch data serverside



