﻿/* googlemap functions */
var GoogleMap = new function() {

	var me = this;
	this.Map;
	this.MapContainer;
	this.GSearch;
	this.ImageWidth = 20;
	this.ImageHeight = 34;
	this.MapClickHandler;
	this.ZoomLevel;
	this.Markers = new Array();

	//show
	this.Show = function(Container, Latitude, Longitude, ZoomLevel, UseSmallControl, HideMapTypeControl) {

		UseSmallControl = UseSmallControl == undefined ? false : UseSmallControl;

		me.Map = new GMap2(f.GetObject(Container));
		me.MapContainer = f.GetObject(Container);
		me.Map.enableScrollWheelZoom();

		if (!UseSmallControl) {
			me.Map.addControl(new GLargeMapControl());
		} else {
			me.Map.addControl(new GSmallMapControl());
		}

		if (HideMapTypeControl == undefined || HideMapTypeControl == true) {
			me.Map.addControl(new GMapTypeControl());
		}

		me.Map.setCenter(new GLatLng(Latitude, Longitude), ZoomLevel);
		GEvent.addListener(me.Map, 'click',
			function(oMarker, oPoint)
			{ GoogleMap.MapClick(oMarker, oPoint); })
	}


	//zoomlevel
	this.SetZoomLevel = function(ZoomLevel) {
		if (me.Map) {
			me.Map.setZoom(ZoomLevel);
		}
	}


	//map click
	this.MapClick = function(oMarker, oPoint) {

		if (me.MapClickHandler) {
			if (oMarker) {
				oPoint = oMarker.getPoint();
			}
			me.MapClickHandler(oPoint.lat(), oPoint.lng());
		}
	}


	//search
	this.Search = function(SearchText, ZoomLevel) {
		if (!me.GSearch) {
			me.GSearch = new GlocalSearch();
			me.GSearch.setSearchCompleteCallback(null, me.OnLocalSearch);
		}
		me.ZoomLevel = ZoomLevel;
		me.GSearch.execute(SearchText);
	}

	this.OnLocalSearch = function() {
		if (GoogleMap.GSearch.results && GoogleMap.GSearch.results.length > 0) {
			var oBestResult = GoogleMap.GSearch.results[0];
			if (GoogleMap.ZoomLevel) {
				GoogleMap.SetZoomLevel(GoogleMap.ZoomLevel);
			}

			GoogleMap.Map.panTo(new GLatLng(oBestResult.lat, oBestResult.lng));
		}
	}

	//markers
	this.AddMarker = function(Latitude, Longitude, Image, OnClick, OnMouseOver, OnMouseOut, Tag, imageWidth, imageHeight, zIndex) {

		var oPoint = new GLatLng(Latitude, Longitude);
		var oMarker;
		var markerZIndex = 0;
		var markerWidth = GoogleMap.ImageWidth;
		var markerHeight = GoogleMap.ImageHeight;

		if (zIndex != null && zIndex != undefined) { markerZIndex = zIndex; }
		if (imageWidth != null && imageWidth != undefined) { markerWidth = imageWidth; }
		if (imageHeight != null && imageHeight != undefined) { markerHeight = imageHeight; }

		if (Image != undefined && Image != null) {
			var oIcon = new GIcon();
			oIcon.image = Image;
			oIcon.iconSize = new GSize(markerWidth, markerHeight);
			oIcon.iconAnchor = new GPoint(markerWidth / 2, markerHeight);
			oIcon.infoWindowAnchor = new GPoint(1, 6);
			oMarker = new GMarker(oPoint, { icon: oIcon, zIndexProcess: function() { return markerZIndex; } });
		} else {
			oMarker = new GMarker(oPoint, { zIndexProcess: function() { return markerZIndex; } });
		}

		if (Tag != null && Tag != undefined) {
			oMarker.tag = Tag;
		}

		this.Map.addOverlay(oMarker);

		if (OnClick != null && OnClick != undefined) {
			GEvent.addListener(oMarker, 'click', OnClick);
		}

		if (OnMouseOver != undefined && OnMouseOver != null) {
			GEvent.addListener(oMarker, 'mouseover', OnMouseOver);
		}

		if (OnMouseOut != undefined && OnMouseOut != null) {
			GEvent.addListener(oMarker, 'mouseout', OnMouseOut);
		}

		me.Markers.push(oMarker);
		return oMarker;
	}



	//remove marker
	this.RemoveMarker = function(oMarker) {
		if (oMarker) {
			me.Map.removeOverlay(oMarker);
		}
	}


	//remove all markers
	this.RemoveAllMarkers = function() {
		me.Map.clearOverlays();
		me.Markers.length = 0;
	}

	//centre and zoom
	this.CentreAndZoom = function(iOverrideZoom) {
		var aBounds = new GLatLngBounds();
		for (var i = 0; i < me.Markers.length; i++) {
			aBounds.extend(me.Markers[i].getPoint());
		}
		
		me.Map.setZoom(iOverrideZoom);
		me.Map.setCenter(aBounds.getCenter());
	}



	//GetScreenPositionFromEvent
	this.GetScreenPositionFromEvent = function(oEvent) {
		var oMapPosition = e.GetPosition(me.MapContainer);
		var oMarkerPosition = me.Map.fromLatLngToContainerPixel(oEvent);
		return { Left: oMapPosition.Left + oMarkerPosition.x, Top: oMapPosition.Top + oMarkerPosition.y };
	}


	//GetMarkerFromEVent
	this.GetMarkerTagFromEvent = function(oEvent) {

		for (var i = 0; i < me.Markers.length; i++) {
			if (me.Markers[i].Z.x == oEvent.x && me.Markers[i].Z.y == oEvent.y) {
				return me.Markers[i].tag;
			}
		}
	}



	//AddEvent
	this.SetMapMovedEvent = function(oEvent) {
		GEvent.addListener(me.Map, 'moveend', oEvent);
	}


	//GetMapBounds
	this.GetMapBounds = function() {

		var oBounds = me.Map.getBounds();

		return { MinLatitude: oBounds.getSouthWest().y,
			MaxLatitude: oBounds.getNorthEast().y,
			MinLongitude: oBounds.getSouthWest().x,
			MaxLongitude: oBounds.getNorthEast().x
		}
	}

}




