var map = null;
var gMap;

window.onload = function()
{
    if (typeof GUnload == 'undefined')
    {
        return;
    }

    window.onunload = GUnload;

    if (typeof mapConfig != 'undefined' )
    {
        map = new mapScript( mapConfig );

        if (!map.ok)
        {
            return;
        }
        map.initGMap();

    }
    else
    {


    }
}


function mapScript( config )
{

    this.ok = false;
    this.config = config;

    if (!this.config)
    {
        return;
    }

    this.box = document.getElementById( this.config.boxId );
    if (
    (!this.box)
    ||
    (!GBrowserIsCompatible())
    )
    {
        return;
    }

    this.map = null;
    this.ok = true;
}

mapScript.prototype.initGMap = function()
{
    this.map = new GMap2( this.box );

	gMap = this.map;


    var center = new GLatLng( parseFloat ( this.config.center.lat ) , parseFloat ( this.config.center.lng ));


    with (this.map)
    {
        addControl(new GLargeMapControl());

        enableScrollWheelZoom();
        enableDoubleClickZoom();
        enableContinuousZoom();

        setCenter( center , this.config.defaultZoom );

        var tmpInfoWindow = getInfoWindow(); // init

        // add points
        if (this.config.points.length > 0)
        {
            var points = [];
            for (var i=0; i < this.config.points.length; i++)
            {

                var pointData = this.config.points[i];


                if (
                    (pointData.lat.toString().length < 1)
                    ||
                    (pointData.lng.toString().length < 1)
                    ||
                    (pointData.categoryId.length < 1)
                    ||
                    (!this.config.iconUrls[ pointData.categoryId ])
                )
                {
                    continue;
                }

                var point = new GLatLng( parseFloat ( pointData.lat ) , parseFloat ( pointData.lng) );
                points[points.length] = point;


                var icon              = new GIcon( G_DEFAULT_ICON );


                icon.image            = this.config.iconUrls[ pointData.categoryId ];

                // icon.printImage       = pointData.iconGif;

                icon.shadow = null;
                icon.iconSize         = new GSize(24, 32);
                icon.iconAnchor       = new GPoint(9, 27);
                // icon.infoWindowAnchor = new GPoint(9, 9);

                var marker = new GMarker(point, icon);
                marker.pointData = pointData;

                GEvent.addListener(marker, "mouseover", function()
    	        {
                    this.openInfoWindowHtml(this.pointData.infoWindowHtml);
    	        });


    	        var headingId = 'locationHeading-'.concat( pointData.objectId );
    	        var heading = document.getElementById(headingId);
    	        if (heading)
    	        {
    	            var hoverTarget = heading.getElementsByTagName('span')[0];
    	            if (hoverTarget)
    	            {
                        hoverTarget.marker = marker;
                        hoverTarget.onmouseover = function()
            	        {
                            this.marker.openInfoWindowHtml( this.marker.pointData.infoWindowHtml );
            	        };
    	            }
    	        }

    	        /*
                GEvent.addListener(marker, "click", function()
    	        {
                    document.location.href = this.pointData.pointUrl;
    	           });
                */

                addOverlay( marker );
            }
        }



        // zoom / center to fit all points
        var hasMultiplePoints = (points.length > 1);

        var bounds = new GBounds( points );
        var sw = new GLatLng( bounds.maxY,  bounds.minX);
        var ne = new GLatLng( bounds.minY,  bounds.maxX);

        var b = new GLatLngBounds(sw, ne);
        var newzoom = getBoundsZoomLevel( b );

        if (newzoom > 8)
        {
            newzoom = 8;
        }
        var newcenter = b.getCenter();
        setCenter (newcenter, newzoom);

    }
    var self = this;
}

