function EstateWeb_Objects_MappingManager(oid){
	//properties (public)
	this.id = oid;
	this.rendertocontainer = "";
	this.searchManager = null;
	this.createUniqueID = EstateWeb_Objects_MappingManager_CreateUniqueID;
	//properties (private)
	//objects (public)
	
	//objects (private)
	this.mapoptions = new EstateWeb_Objects_MappingManager_MapOptions(this);
	this.markers = new EstateWeb_Objects_MappingManager_Markers(this);
	//methods
	this.load = EstateWeb_Objects_MappingManager_Load;
	this.setCenter = EstateWeb_Objects_MappingManager_SetCenter;
	this.preloadvalidation = EstateWeb_Objects_MappingManager_PreloadValidation;
	//events
	this.events = new HttpManager.Browser.eventManager();
	this.onPropertySearchComplete = EstateWeb_Objects_MappingManager_OnPropertySearchComplete;
	this.onPropertySearchBegin = EstateWeb_Objects_MappingManager_OnPropertySearchBegin;
	this.onPageDispose = EstateWeb_Objects_MappingManager_onPageDispose;
	this.onPropertyMarkerClick = EstateWeb_Objects_MappingManager_OnPropertyMarkerClick;
	this.onPropertyMarkerGroupClick = EstateWeb_Objects_MappingManager_OnPropertyMarkerGroupClick;
	this.onMapMoveEnd = EstateWeb_Objects_MappingManager_OnMapMoveEnd;
	this.onMapInfoWindowClose = EstateWeb_Objects_MappingManager_OnMapInfoWindowClose;
	this.onPropertyFullDetailsClick = EstateWeb_Objects_MappingManager_OnPropertyFullDetailsClick;
	this.onBrowserWindowResize = EstateWeb_Objects_MappingManager_OnBrowserWindowResize;
	this.onPropertyGroupOptionClick = EstateWeb_Objects_MappingManager_OnPropertyGroupOptionClick;
	this.onPropertyGroupOptionMouseOver = EstateWeb_Objects_MappingManager_OnPropertyGroupOptionMouseOver;
	this.onPropertyGroupOptionMouseOut = EstateWeb_Objects_MappingManager_OnPropertyGroupOptionMouseOut;
	this.onPropertyMarkerMouseOver = EstateWeb_Objects_MappingManager_OnPropertyMarkerMouseOver;
	this.onPropertyMarkerMouseOut = EstateWeb_Objects_MappingManager_OnPropertyMarkerMouseOut;
}

//#### Root Methods ######

function EstateWeb_Objects_MappingManager_CreateUniqueID(id){
	return HttpManager.Strings.Format("{0}_{1}", this.id, id);
}

//Prepares the map
function EstateWeb_Objects_MappingManager_Load(){
	if ( this.preloadvalidation() ){
		if ( GBrowserIsCompatible() ){
			this.mapoptions.mapreference = new GMap2( HttpManager.Document.GetObject(this.rendertocontainer) );
			this.mapoptions.apply();
			
			this.events.raiseEvent("mapload", this, null);
		}
	}
}

function EstateWeb_Objects_MappingManager_Markers(o){
	this.parent = o;
	this.items = new Array();
	this.add = EstateWeb_Objects_MappingManager_Markers_Add;
	this.show = EstateWeb_Objects_MappingManager_Markers_Show;
	this.removeAll = EstateWeb_Objects_MappingManager_Markers_RemoveAll;
}

function EstateWeb_Objects_MappingManager_Markers_Add(oproperty,omarker){
	this.items.push({
									"marker" : omarker,
									"propertyReference" : oproperty.propertyReference
								}
							  )
}

function EstateWeb_Objects_MappingManager_Markers_RemoveAll(){
	if ( this.parent.mapoptions.groupManager.reference ){
		for ( var i = 0; i < this.items.length; i ++ ){
			this.parent.mapoptions.groupManager.reference.RemoveMarker( this.items[i].marker );
		}
	}
}

function EstateWeb_Objects_MappingManager_Markers_Show(){
	omapoptions = this.parent.mapoptions;
	var iposition = 0;
	//draw markers on the map
	for ( var i = 0; i < this.parent.searchManager.properties.items.length; i ++ ){
		var oproperty = this.parent.searchManager.properties.items[i];
		var opropertyIcon = omapoptions.icons.createGIcon(omapoptions.icons.getIconForProperty(oproperty));
		var opropertyMarker = new GMarker( new GLatLng( oproperty.mapping.latitude, oproperty.mapping.longitude ), opropertyIcon);
		opropertyMarker.key = oproperty.propertyReference;
		iposition = i;
		omapoptions.groupManager.reference.AddMarker( opropertyMarker, oproperty.propertyReference );
		this.add( oproperty, opropertyMarker );
		setTimeout("omapoptions.parent.events.raiseEvent(\"propertymarkersplotprogresschange\", omapoptions.parent, { \"index\" : "+i+" , \"total\" : "+this.parent.searchManager.properties.items.length+" } );",20);
		
		GEvent.addListener( opropertyMarker, "click", function(){
			omapoptions.parent.events.raiseEvent("propertymarkerclick", omapoptions.parent, { "marker" : this } );
		});
		GEvent.addListener( opropertyMarker, "mouseover", function(){ 
			omapoptions.parent.events.raiseEvent("propertymarkermouseover", omapoptions.parent, { "marker" : this } );
		} );
		GEvent.addListener( opropertyMarker, "mouseout", function(){ 
			omapoptions.parent.events.raiseEvent("propertymarkermouseout", omapoptions.parent, { "marker" : this } );
		} );
	}
}

function EstateWeb_Objects_MappingManager_SetCenter(bounds, withCorrectZoomLevel){
	var oGLatLng = new GLatLng( ((bounds[0]+bounds[1])/2), ((bounds[2]+bounds[3])/2) );
	var oGLatLngBounds = new GLatLngBounds( new GLatLng(bounds[0],bounds[3]), new GLatLng(bounds[1],bounds[2]) );
	var ocorrectzoomlevel = this.mapoptions.mapreference.getBoundsZoomLevel( oGLatLngBounds );
	this.mapoptions.mapreference.setCenter( oGLatLng , ocorrectzoomlevel ); 
}


function EstateWeb_Objects_MappingManager_MapOptions(o){
	this.parent = o;
	this.styleDirectory = "images/controls/maps/style1";
	this.mapreference;
	this.showSmallNavigationControl = false;
	this.showLargeNavigationControl = false;
	this.enableDoubleClickZooming = true;
	this.showMapTypeControl = false;
	this.icons = new EstateWeb_Objects_MappingManager_MapOptions_Icons(this);
	this.groupManager = new EstateWeb_Objects_MappingManager_MapOptions_GroupManager(this);
	this.apply = EstateWeb_Objects_MappingManager_MapOptions_Apply;
	this.maximumTabs = 3;
	this.lastPosition;
	this.formatInfoWindowContents = EstateWeb_Objects_MappingManager_MapOptions_FormatInfoWindowContents;
	this.tooltips = new EstateWeb_Objects_MappingManager_MapOptions_Tooltips(this);
}

function EstateWeb_Objects_MappingManager_MapOptions_Tooltips(o){
	this.parent = o;
	this.enabled = true;
	this.style = new EstateWeb_Objects_MappingManager_MapOptions_Tooltips_Style(this);
	this.show = EstateWeb_Objects_MappingManager_MapOptions_Tooltips_Show;
	this.hide = EstateWeb_Objects_MappingManager_MapOptions_Tooltips_Hide;
	this.create = EstateWeb_Objects_MappingManager_MapOptions_Tooltips_Create;
}

function EstateWeb_Objects_MappingManager_MapOptions_Tooltips_Create(){
	//make sure not already rendered
	if (! HttpManager.Document.GetObject(this.parent.parent.createUniqueID("markertooltip")) ){
		var otooltip = document.createElement("div");
		otooltip.id = this.parent.parent.createUniqueID("markertooltip");
		with ( otooltip.style ){
			position = "absolute";
			backgroundColor = this.style.backgroundColour;
			border = HttpManager.Strings.Format("{0} {1} {2}", this.style.borderStyle, this.style.borderWidth + "px", this.style.borderColour);
			padding = this.style.padding + "px";
		}
		HttpManager.Document.GetObject(this.parent.parent.rendertocontainer).appendChild( otooltip );
	}
}

function EstateWeb_Objects_MappingManager_MapOptions_Tooltips_Hide(){
	//hide the tooltip div
	if ( HttpManager.Document.GetObject(this.parent.parent.createUniqueID("markertooltip")) ){
		HttpManager.Document.GetObject(this.parent.parent.createUniqueID("markertooltip")).style.display = "none";
	}
}

function EstateWeb_Objects_MappingManager_MapOptions_Tooltips_Show(omarker,oicon,text){
	if ( omarker ){
		//hide if its already visible
		this.hide();
		//convert the position of the marker to relative x,y
		var opoint = this.parent.mapreference.getCurrentMapType().getProjection().fromLatLngToPixel( this.parent.mapreference.getBounds().getSouthWest(), this.parent.mapreference.getZoom() );
		var ooffset = this.parent.mapreference.getCurrentMapType().getProjection().fromLatLngToPixel( omarker.getPoint(), this.parent.mapreference.getZoom() );
		var opos = new GControlPosition( G_ANCHOR_BOTTOM_LEFT, new GSize( ooffset.x - opoint.x, - ooffset.y + opoint.y) );
		
		
		//var opoint = omarker.getPoint();
		//var oposition = this.parent.mapreference.fromLatLngToDivPixel( opoint );
		this.create();
		opos.apply(  HttpManager.Document.GetObject(this.parent.parent.createUniqueID("markertooltip")) );
		with ( HttpManager.Document.GetObject(this.parent.parent.createUniqueID("markertooltip")) ){
			innerHTML = text;
		//	left = ( oposition.x - oicon.tooltipAnchorX ) + "px";
		//	top = ( oposition.y - oicon.tooltipAnchorY ) + "px";
		}
		HttpManager.Document.GetObject(this.parent.parent.createUniqueID("markertooltip")).style.display = "block";
	}
}

function EstateWeb_Objects_MappingManager_MapOptions_Tooltips_Style(o){
	this.parent = o;
	this.backgroundColour = "#F5E895";
	this.transparencyPerecentage = 100;
	this.borderColour = "#000000";
	this.borderWidth = 1;
	this.borderStyle = "solid";
	this.padding = 3;
	this.anchorX = 0;
	this.anchorY = 0;
}

function EstateWeb_Objects_MappingManager_MapOptions_FormatInfoWindowContents(markerType, oreference, contents){
	var ocontainer = document.createElement("div");
	var ocontaineritems;
	ocontainer.innerHTML = contents;
	var o = this;
	var lreference = oreference;
	switch ( markerType ){
		case this.icons.iconTypes.single:
			ocontaineritems = ocontainer.getElementsByTagName("a");
			for ( var i  =0; i < ocontaineritems.length; i ++ ){
				if ( ocontaineritems[i].id.toLowerCase() == "txtfulldetails" ){
					ocontaineritems[i].onclick = function(){
						o.parent.events.raiseEvent( "onpropertyfulldetailsclick", this, { "property" : lreference } );
					}
					break;
				}
			}
			ocontaineritems = ocontainer.getElementsByTagName("img");
			for ( var i  =0; i < ocontaineritems.length; i ++ ){
				if ( ocontaineritems[i].id.toLowerCase() == "imgpropertyphoto" ){
					ocontaineritems[i].onclick = function(){
						o.parent.events.raiseEvent( "onpropertyfulldetailsclick", this, { "property" : lreference } );
					}
					break;
				}
			}
			return ocontainer.childNodes[0];
			break;
		case this.icons.iconTypes.group:
			ocontaineritems = ocontainer.getElementsByTagName("a");
			for ( var i  =0; i < ocontaineritems.length; i ++ ){
				if ( ocontaineritems[i].id.toLowerCase() == "lnkzoomin" ){
					ocontaineritems[i].onclick = function(){
						o.parent.events.raiseEvent("onpropertygroupoptionclick", this, { "cluster" : lreference, "option" : "zoomTo" } );
					}	
				}
			}
			return ocontainer.childNodes[0];
			break;
	}
}

function EstateWeb_Objects_MappingManager_MapOptions_GroupManager(o){
	this.parent = o;
	this.reference;
	this.maximumVisibleMarkers = 60;
	this.minimumMarkersPerCluster = 8;
}

function EstateWeb_Objects_MappingManager_MapOptions_Apply(){
	var o = this;
	if ( this.showSmallNavigationControl ){
		this.mapreference.addControl( new GSmallMapControl() );
	}else if ( this.showLargeNavigationControl ){
		this.mapreference.addControl( new GLargeMapControl() );
	}
	if ( this.showMapTypeControl ){
		this.mapreference.addControl( new GMapTypeControl() );
	}
	if ( this.enableDoubleClickZooming ){
		this.mapreference.enableDoubleClickZoom();
		this.mapreference.enableContinuousZoom();
	}
	if (!this.groupManager.reference ){
		this.groupManager.reference = new Clusterer( this.parent );
		this.groupManager.reference.SetMaxVisibleMarkers( this.groupManager.maximumVisibleMarkers );
		this.groupManager.reference.SetMinMarkersPerCluster( this.groupManager.minimumMarkersPerCluster );
		this.groupManager.reference.SetIcon( this.icons.createGIcon(this.icons.getIconsByType(this.icons.iconTypes.group)[0]) );
		this.groupManager.reference.events.addHandler("markergroupclicked", this.parent, this.parent.onPropertyMarkerGroupClick);
		this.groupManager.reference.events.addHandler("markergroupmouseover", this.parent, this.parent.onPropertyGroupOptionMouseOver);
		this.groupManager.reference.events.addHandler("markergroupmouseout", this.parent, this.parent.onPropertyGroupOptionMouseOut);
		o.parent.events.addHandler("onpropertygroupoptionclick", this.parent, this.parent.onPropertyGroupOptionClick );
	}
	GEvent.addListener(this.mapreference, "moveend", function(){
		o.parent.events.raiseEvent("onmapmoveend", o.parent, null);
	});
	GEvent.addListener(this.mapreference, "infowindowclose", function(){
		o.parent.events.raiseEvent("onmapinfowindowclose", o.parent, null );
	});
}

function EstateWeb_Objects_MappingManager_MapOptions_Icons(o){
	this.parent = o;
	this.items = new Array();
	this.add = EstateWeb_Objects_MappingManager_MapOptions_Icons_Add;
	this.icon = EstateWeb_Objects_MappingManager_MapOptions_Icons_Icon;
	this.iconTypes = new EstateWeb_Objects_MappingManager_MapOptions_Icons_Icon_IconTypes(this);
	this.getIconsByType = EstateWeb_Objects_MappingManager_MapOptions_Icons_GetIconsByType;
	this.getIconForProperty = EstateWeb_Objects_MappingManager_MapOptions_Icons_GetIconForProperty;
	this.createGIcon = EstateWeb_Objects_MappingManager_MapOptions_Icons_CreateGIcon;
}

function EstateWeb_Objects_MappingManager_MapOptions_Icons_GetIconForProperty(oproperty){
	//gets the most appropriate icon from the collection for a property
	var oIconForProperty;
	var oIconsSingle = this.getIconsByType( this.iconTypes.single );
	for ( var i = 0; i < oIconsSingle.length; i ++ ){
		var oIcon = oIconsSingle[i];
		if ( oIcon.listingTypes.contains( oproperty.propertyListingType ) && oIcon.statuses.contains( oproperty.propertyStatusID ) ){
			oIconForProperty = oIcon;
			break;
		}
	}
	if (!oIconForProperty){
		oIconForProperty = this.getIconsByType( this.iconTypes.generic )[0];
	}
	return oIconForProperty;
}

function EstateWeb_Objects_MappingManager_MapOptions_Icons_CreateGIcon(oIcon){
	var oGIcon = new GIcon();
	oGIcon.image = oIcon.imageURL;
	oGIcon.iconSize = new GSize( oIcon.imageWidth, oIcon.imageHeight );
	oGIcon.iconAnchor = new GPoint( oIcon.anchorX, oIcon.anchorY );
	if ( oIcon.shadowURL.length > 0 ){
		oGIcon.shadow = oIcon.shadowURL;
		oGIcon.shadowSize = new GSize( oIcon.shadowWidth, oIcon.shadowHeight );
	}
	return oGIcon;
}

function EstateWeb_Objects_MappingManager_MapOptions_Icons_GetIconsByType(type){
	var result = new Array();
	for ( var i = 0 ; i < this.items.length; i ++ ){
		if ( this.items[i].iconType == type ){
			result.push( this.items[i] );
		}	
	}
	return result;
}

function EstateWeb_Objects_MappingManager_MapOptions_Icons_Icon(){
	this.propertyListingTypes = new EstateWeb_Objects_Property_PropertyListingTypes();
	this.listingTypes = new EstateWeb_Objects_MappingManager_MapOptions_Icons_Icon_ListingTypes();
	this.propertyStatuses = new EstateWeb_Objects_Property_PropertyStatuses();
	this.statuses = new EstateWeb_Objects_MappingManager_MapOptions_Icons_Icon_Statuses();
	this.imageURL = "";
	this.imageWidth = 0;
	this.imageHeight = 0;
	this.anchorX = 0;
	this.anchorY = 0;
	this.shadowURL = "";
	this.shadowWidth = 0;
	this.shadowHeight = 0;
	this.shadowAnchorX = 0;
	this.shadowAnchorY = 0;
	this.tooltipAnchorY = 0;
	this.tooltipAnchorX = 0;
	this.iconTypes = new EstateWeb_Objects_MappingManager_MapOptions_Icons_Icon_IconTypes(this);
	this.iconType = this.iconTypes.generic;
}

function EstateWeb_Objects_MappingManager_MapOptions_Icons_Icon_ListingTypes(){
	this.items = [];
	this.add = EstateWeb_Objects_MappingManager_MapOptions_Icons_Icon_Statuses_Add;
	this.contains = EstateWeb_Objects_MappingManager_MapOptions_Icons_Icon_Statuses_Contains;
}

function EstateWeb_Objects_MappingManager_MapOptions_Icons_Icon_Statuses_Contains( propertyListingType ){
	for ( var i = 0; i < this.items.length; i ++ ){
		if ( this.items[i] == propertyListingType ){
			return true;
		}
	}
	return false;
}

function EstateWeb_Objects_MappingManager_MapOptions_Icons_Icon_Statuses_Add( propertyListingType ){
	this.items.push( propertyListingType );
}

function EstateWeb_Objects_MappingManager_MapOptions_Icons_Icon_Statuses(){
	this.items = [];
	this.add = EstateWeb_Objects_MappingManager_MapOptions_Icons_Icon_Statuses_Add;
	this.contains = EstateWeb_Objects_MappingManager_MapOptions_Icons_Icon_Statuses_Contains;
}

function EstateWeb_Objects_MappingManager_MapOptions_Icons_Icon_Statuses_Contains( propertyStatus ){
	for ( var i = 0; i < this.items.length; i ++ ){
		if ( this.items[i] == propertyStatus ){
			return true;
		}
	}
	return false;
}

function EstateWeb_Objects_MappingManager_MapOptions_Icons_Icon_Statuses_Add( propertyStatus ){
	this.items.push( propertyStatus );
}

function EstateWeb_Objects_MappingManager_MapOptions_Icons_Icon_IconTypes(o){
	this.generic = 0;
	this.single = 1;
	this.group = 2;
}

function EstateWeb_Objects_MappingManager_MapOptions_Icons_Add(o){
	this.items.push( o );
}

//########## Event Handling #############################

function EstateWeb_Objects_MappingManager_OnPropertySearchComplete(creator,sender,eventArgs){
	creator.markers.removeAll();
	creator.mapoptions.mapreference.clearOverlays();
	if ( sender.properties.items.length > 0 ){
		creator.setCenter( sender.mapping.calculateCenter() );
		creator.markers.show();	
	}
}

function EstateWeb_Objects_MappingManager_OnPropertySearchBegin(creator,sender,eventArgs){ }

function EstateWeb_Objects_MappingManager_onPageDispose(creator,sender,eventArgs){
	//perform any tear down - cleanup methods
	try{
		GUnload();
	}catch(e){}
	delete creator.mapoptions.groupManager.reference;
}

function EstateWeb_Objects_MappingManager_OnPropertyMarkerClick(creator,sender,eventArgs){ 
	creator.mapoptions.lastPoint = creator.mapoptions.mapreference.getCenter();
	var oproperty = creator.searchManager.properties.getProperty( eventArgs.marker.key );
	if ( oproperty ){
		var shtml = oproperty.propertyDetails.getPropertyDetails( oproperty.propertyDetails.propertyDetailTypes.googleBriefDetails, false );
		var ohtml = creator.mapoptions.formatInfoWindowContents( creator.mapoptions.icons.iconTypes.single, oproperty, shtml );
		creator.mapoptions.mapreference.openInfoWindow( eventArgs.marker.getPoint(), ohtml );
	}
}

function EstateWeb_Objects_MappingManager_OnPropertyMarkerGroupClick(creator,sender,eventArgs){ 
	var aInfoTabs = [];
	creator.mapoptions.lastPoint = creator.mapoptions.mapreference.getCenter();
	for ( var i = 0; i < eventArgs.cluster.markers.length; i ++ ){
		var omarker = eventArgs.cluster.markers[i];
		if ( i < creator.mapoptions.maximumTabs || eventArgs.cluster.isSinglePointCluster ){
			var oproperty = creator.searchManager.properties.getProperty( omarker.key );
			var shtml = oproperty.propertyDetails.getPropertyDetails( oproperty.propertyDetails.propertyDetailTypes.googleBriefDetails, false );
			var ohtml = creator.mapoptions.formatInfoWindowContents( creator.mapoptions.icons.iconTypes.single, oproperty, shtml );
			aInfoTabs.push( new GInfoWindowTab(i+1, ohtml) );
		}else{
			//add last tab to show options for more
			var oparams = [];
			oparams.push( "totalproperties," + eventArgs.cluster.markers.length.toString() );
			oparams.push( "subtotalproperties," + ( eventArgs.cluster.markers.length - creator.mapoptions.maximumTabs ).toString() );
			var omoretabs = Mapping.GetPointerTabMoreProperties(oparams);
			if ( omoretabs.value ){
				var ohtml = creator.mapoptions.formatInfoWindowContents( creator.mapoptions.icons.iconTypes.group, sender, omoretabs.value );
				aInfoTabs.push( new GInfoWindowTab( "more...", ohtml ) );
			}
			break;
		}
	}
	creator.mapoptions.mapreference.openInfoWindowTabsHtml( eventArgs.cluster.marker.getPoint(),  aInfoTabs );
 }
 
 function EstateWeb_Objects_MappingManager_OnMapMoveEnd(creator,sender,eventArgs){ }
 
 function EstateWeb_Objects_MappingManager_OnMapInfoWindowClose(creator,sender,eventArgs){
	if ( creator.mapoptions.lastPoint ){
		creator.mapoptions.mapreference.panTo( creator.mapoptions.lastPoint );
	}
 }
 
 function EstateWeb_Objects_MappingManager_OnPropertyFullDetailsClick(creator,sender,eventArgs){ }
 
 function EstateWeb_Objects_MappingManager_OnBrowserWindowResize(creator,sender,eventArgs){
	if ( creator.mapoptions.mapreference ){
		creator.mapoptions.mapreference.checkResize();
		creator.mapoptions.mapreference.panTo( creator.mapoptions.mapreference.getCenter() );
	}
 }
 
 function EstateWeb_Objects_MappingManager_OnPropertyGroupOptionClick(creator,sender,eventArgs){
	switch ( eventArgs.option ){
		case "zoomTo":
			creator.mapoptions.mapreference.closeInfoWindow();
			creator.mapoptions.mapreference.setCenter( eventArgs.cluster.marker.getPoint() );
			creator.setCenter( eventArgs.cluster.getProperties().mapping.calculateCenter() );
			break;
	}
 }
 
 function EstateWeb_Objects_MappingManager_OnPropertyMarkerMouseOver(creator,sender,eventArgs){
	if ( creator.mapoptions.tooltips.enabled ){
		var oproperty = creator.searchManager.properties.getProperty( eventArgs.marker.key );
		var oicon = creator.mapoptions.icons.getIconForProperty( oproperty );
		var stext = HttpManager.Strings.Format("{0}{1}{2}", ( oproperty.propertyAddress.street ? oproperty.propertyAddress.street : "" ), ( oproperty.propertyAddress.street ? " - " : "" ) , oproperty.propertyPrice.formattedPrice);
		creator.mapoptions.tooltips.show(eventArgs.marker, oicon, stext);
	}
 }
 
function EstateWeb_Objects_MappingManager_OnPropertyMarkerMouseOut(creator,sender,eventArgs){
	creator.mapoptions.tooltips.hide();
}
 
 function EstateWeb_Objects_MappingManager_OnPropertyGroupOptionMouseOver(creator,sender,eventArgs){
	if ( creator.mapoptions.tooltips.enabled ){
		//get the correct icon for this group
		var aicons = creator.mapoptions.icons.getIconsByType( creator.mapoptions.icons.iconTypes.group );
		var oicon = aicons[0];
		var stext = HttpManager.Strings.Format("{0} propert{1} in {2}. Click for details", eventArgs.cluster.markers.length, ( eventArgs.cluster.markers.length > 1 ? "ies" :  "y" ), ( eventArgs.cluster.isSinglePointCluster ? "this area" : "this area" ) );
		creator.mapoptions.tooltips.show(eventArgs.cluster.marker, oicon, stext);
	}
 }
 
 function EstateWeb_Objects_MappingManager_OnPropertyGroupOptionMouseOut(creator,sender,eventArgs){
	creator.mapoptions.tooltips.hide();
 }

//####### Error Handling ###############

function EstateWeb_Objects_MappingManager_PreloadValidation(){
	var msg = "";
	
	if ( !this.id ){
		HttpManager.Document.Errors.add("Mapping Manager", "A unqiue ID must be set for this object");
	}else if ( typeof GBrowserIsCompatible != "function" ){ 
		HttpManager.Document.Errors.add("Mapping Manager", "Unable to find google API");
	}else if ( this.rendertocontainer.length == 0 ){
		HttpManager.Document.Errors.add("Mapping Manager", "rendertocontainer not set");
	}else if (! HttpManager.Document.GetObject( this.rendertocontainer ) ){
		HttpManager.Document.Errors.add("Mapping Manager", "Unable to find the object in the DOM for " + this.rendertocontainer);
	}else if ( this.mapoptions.icons.getIconsByType(this.mapoptions.icons.iconTypes.group).length != 1 ){
		HttpManager.Document.Errors.add("Mapping Manager", "An icon of type Group must be specified");
	}else if ( this.mapoptions.icons.getIconsByType(this.mapoptions.icons.iconTypes.generic).length != 1 ){
		HttpManager.Document.Errors.add("Mapping Manager", "An icon of type Generic must be specified");
	}
	
	if ( HttpManager.Document.Errors.errors.length > 0 ){
		HttpManager.Document.Errors.show();
		return false;
	}
	
	//inital event settings
	if (this.searchManager){
		this.searchManager.events.addHandler( "searchcompleted", this, this.onPropertySearchComplete );
		this.searchManager.events.addHandler( "searchbegin", this, this.onPropertySearchBegin );
		HttpManager.Browser.events.addHandler("onunload", this, this.onPageDispose );
	}
	this.events.addHandler("propertymarkerclick", this, this.onPropertyMarkerClick );
	this.events.addHandler("propertymarkermouseover", this, this.onPropertyMarkerMouseOver );
	this.events.addHandler("propertymarkermouseout", this, this.onPropertyMarkerMouseOut );
	this.events.addHandler("onmapmoveend", this, this.onMapMoveEnd );
	this.events.addHandler("onmapinfowindowclose", this, this.onMapInfoWindowClose );	
	HttpManager.Browser.events.addHandler("onresize", this, this.onBrowserWindowResize );
	
	return true;
}

function EstateWeb_Objects_MappingManager_ShowError(msg){
	alert("EstateWeb Mapping Manager:\n\nAn Error has occured in this application.\n\n"+msg);
}