var map;
//var blueIcon = new GIcon(G_DEFAULT_ICON);
//blueIcon.shadow = "/images/maps/shadow.png";
//blueIcon.iconSize = new GSize(32, 32);
//blueIcon.shadowSize = new GSize(59, 32);
//blueIcon.iconAnchor = new GPoint(16, 32);
//blueIcon.infoWindowAnchor = new GPoint(10, 30); 
//blueIcon.image = "/images/maps/blue-dot.png"

var defaultIcon = new GIcon(G_DEFAULT_ICON);

var blueIcon = MapIconMaker.createMarkerIcon( { width : 32, height : 32, primaryColor : "#6990FC", cornerColor : "#6990FC", strokeColor : "#000000" } );

var grayIconSmall = MapIconMaker.createMarkerIcon( { width : 24, height : 24, primaryColor : "#999999", cornerColor : "#999999", strokeColor : "#000000" } );

function initialize(id, markers, polylines, additionalData, zoomAndCenter) {
    if (GBrowserIsCompatible()) {
        map = new GMap2(document.getElementById(id));
        map.setCenter(new GLatLng(40, -97), 4);
        map.addControl(new GSmallMapControl());
        map.addControl(new GMapTypeControl());

        if (markers) {
            addMarkers(map, markers, additionalData);
            
            if (zoomAndCenter) {
                zoomAndCenterMarkers(markers);
            }
        }
        if (polylines) {
            addPolylines(map, polylines);
        }
    }
}

function initializeGeocode(id, lat, lon, address) {
    if (GBrowserIsCompatible()) {
        map = new GMap2(document.getElementById(id));
        // we have lat and lon, use it as our center point
        if (lat != 0 && lon != 0) {
            var point = new GLatLng(lat, lon);
            map.setCenter(point, 15);
            
            var marker = new GMarker(point);
            map.addOverlay(marker);
        }
        else { // temporarily set a center point until we geocode the address later
            map.setCenter(new GLatLng(40, -97), 4);
        }
        map.addControl(new GSmallMapControl());
        map.addControl(new GMapTypeControl());
        
        // if lat and lon are 0 then we need to try and geocode the address
        if (lat == 0 && lon == 0) {
            var geocoder = new GClientGeocoder();
            geocoder.getLocations(address, getLocationsCallback);
        }
    }
}

function getLocationsCallback(response) {
    if (!response || response.Status.code != 200) {
        alert("Sorry, we were unable to geocode that address");
    } else {
        place = response.Placemark[0];
        var point = new GLatLng(place.Point.coordinates[1],
                            place.Point.coordinates[0]);
        var marker = new GMarker(point);
        map.addOverlay(marker);
        map.setCenter(point, 15);
    }
}

function addMarkers(map, markers, additionalData) {
    for (var i = 0; i < markers.length; i++) {
        map.addOverlay(markers[i]);
        if (additionalData) {
            if (additionalData[i].url) {
                addMarkerClickEvent(markers[i], additionalData[i].url);
//                GEvent.addListener(markers[i], "click", function() {
//                    var url = data[i];
//                    window.location.href = url;
//                });
            }
        }
    }
}

function addMarkerClickEvent(marker, url) {
    GEvent.addListener(marker, "click", function() {
        window.location.href = url;
        });
}

function addPolylines(map, polylines) {
    for (var i = 0; i < polylines.length; i++) {
        map.addOverlay(polylines[i]);
    }
}

function getGeocodes(address, callback) {
    var geocoder = new GClientGeocoder();
    
    geocoder.getLocations(address, callback);
}

function getMarkerIconBounds(marker, mapProjection) {
    var mapZoomLevel = map.getZoom(), 
        i, 
        iconSize, 
        iconAnchorPoint,
        iconAnchorPointOffset,
        iconBoundsPointSw,
        iconBoundsPointNe,
        iconBoundsLatLngSw,
        iconBoundsLatLngNe;

    iconSize = marker.getIcon().iconSize;
    iconAnchorPoint = mapProjection.fromLatLngToPixel(marker.getLatLng(), mapZoomLevel);
    iconAnchorPointOffset = marker.getIcon().iconAnchor;
    iconBoundsPointSw = new GPoint(iconAnchorPoint.x /* - iconAnchorPointOffset.x*/, iconAnchorPoint.y/* - iconAnchorPointOffset.y + iconSize.height*/);
    iconBoundsPointNe = new GPoint(iconAnchorPoint.x /* - iconAnchorPointOffset.x + iconSize.width*/, iconAnchorPoint.y/* - iconAnchorPointOffset.y*/);
    iconBoundsLatLngSw = mapProjection.fromPixelToLatLng(iconBoundsPointSw, mapZoomLevel);
    iconBoundsLatLngNe = mapProjection.fromPixelToLatLng(iconBoundsPointNe, mapZoomLevel);

    return new GLatLngBounds(iconBoundsLatLngSw, iconBoundsLatLngNe);
}


function zoomAndCenterMarkers(markers) {
    var mapProjection = map.getCurrentMapType().getProjection();
    var iconBounds;
    var bounds = new GLatLngBounds();
    var centerMarker;

    for (var i = 0; i < markers.length; i++) {
        //iconBounds = getMarkerIconBounds(markers[i], mapProjection);
        //bounds.extend(iconBounds.getSouthWest());
        //bounds.extend(iconBounds.getNorthEast());

        if (i == 0) {
            centerMarker = markers[0];
        }
    }

    map.setCenter(centerMarker.getPoint(), 9/*map.getBoundsZoomLevel(bounds)*/);
}
