﻿/* 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);
        }
    }
    this.ZoomOutTo = function(ZoomLevel) {
		if (me.Map && me.Map.getZoom() > ZoomLevel) {
			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(MaxZoomLevel) {
        var aBounds = new GLatLngBounds();
        for (var i = 0; i < me.Markers.length; i++) {
            aBounds.extend(me.Markers[i].getPoint());
        }
        
        me.Map.checkResize();
        me.Map.setZoom(me.Map.getBoundsZoomLevel(aBounds));
        me.Map.setCenter(aBounds.getCenter());
        
        if (MaxZoomLevel != undefined) {
			this.ZoomOutTo(MaxZoomLevel);
        }
    }



    //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
        }
    }

}