﻿/* googlemap functions */
var GoogleMap = new function() {

    var me = this;
    this.Map;
    this.GSearch;
    this.ImageWidth = 16;
    this.ImageHeight = 16;
    this.MapClickHandler;
    this.ZoomLevel;
    this.Markers = new Array();


    //show
    this.Show = function(Container, Latitude, Longitude, ZoomLevel, UseSmallControl) {

        UseSmallControl = UseSmallControl == undefined ? false : UseSmallControl;

        this.Map = new GMap2(f.GetObject(Container));
        if (!UseSmallControl) {
            this.Map.addControl(new GLargeMapControl());
        } else {
            this.Map.addControl(new GSmallMapControl());
        }
        this.Map.addControl(new GMapTypeControl());
        this.Map.setCenter(new GLatLng(Latitude, Longitude), ZoomLevel);
        GEvent.addListener(this.Map, 'click',
			function(oMarker, oPoint)
        { GoogleMap.MapClick(oMarker, oPoint); })
    }


    //zoomlevel
    this.SetZoomLevel = function(ZoomLevel) {
        if (this.Map) {
            this.Map.setZoom(ZoomLevel);
        }
    }


    //map click
    this.MapClick = function(oMarker, oPoint) {

        if (this.MapClickHandler) {
            if (oMarker) {
                oPoint = oMarker.getPoint();
            }
            this.MapClickHandler(oPoint.lat(), oPoint.lng());
        }
    }


    //search
    this.Search = function(SearchText, ZoomLevel) {
        if (!this.GSearch) {
            this.GSearch = new GlocalSearch();
            this.GSearch.setSearchCompleteCallback(null, this.OnLocalSearch);
        }
        this.ZoomLevel = ZoomLevel;
        this.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) {

        var oPoint = new GLatLng(Latitude, Longitude);
        var oMarker;
        if (Image != undefined && Image != null) {
            var oIcon = new GIcon();
            oIcon.image = Image;
            oIcon.iconSize = new GSize(GoogleMap.ImageWidth, GoogleMap.ImageHeight);
            oIcon.iconAnchor = new GPoint(6, 20);
            oIcon.infoWindowAnchor = new GPoint(5, 1);
            oMarker = new GMarker(oPoint, oIcon);
        } else {
            oMarker = new GMarker(oPoint);
        }

        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) {
            this.Map.removeOverlay(oMarker);
        }
    }

    //centre and zoom
    this.CentreAndZoom = function() {

        var aBounds = new GLatLngBounds();
        for (var i = 0; i < me.Markers.length; i++) {
            aBounds.extend(me.Markers[i].getPoint());
        }
        me.Map.setZoom(me.Map.getBoundsZoomLevel(aBounds));
        me.Map.setCenter(aBounds.getCenter());
    }
}

