
// geocoder - we need only one
var geocoder;
// store refs to all markers here
var markers = new Object();
// store refs to all maps here
var googlemaps = new Object();

function geo_init()
{
    if (GBrowserIsCompatible()) {
        geocoder = new GClientGeocoder();
    }
}

function geo_invalidateAddress(wname)
{
    var geocodeBtn = document.getElementById(wname+'_geocodeBtn');
    if (geocodeBtn)
    {
        geocodeBtn.style.display = "block";
    }

   /* var map = document.getElementById(wname+'_map');
    if (map)
    {
        map.style.display = "none";
    }*/
    
    return true;
}

function geo_invalidateCoords(wname)
{
    document.getElementById(wname + '_geocodeBtn').style.display = 'block';
    document.getElementById(wname + '_coordFields').style.display = 'none';
    
    var marker = markers[wname];
    var googlemap = googlemaps[wname];


    if (marker)
    {
        googlemap.removeOverlay(marker);
        delete markers[wname];
    }

    var map = document.getElementById(wname + '_map');
    map.style.display = "none";
}

function geo_onLocationFound(latlng, wname)
{
    var address = document.getElementById(wname + '_address').value;

    if (latlng)
    { // address was successfully located

        var zoom = parseInt(document.getElementById(wname + '_zoom').value);

        geo_initMap(latlng, wname, zoom, 'edit');

        var googlemap = googlemaps[wname];
        var marker = markers[wname];

        document.getElementById(wname + '_geocodeBtn').style.display = 'none';
        document.getElementById(wname + '_coordFields').style.display = 'block';

        document.getElementById(wname + '_lat').value = latlng.lat();
        document.getElementById(wname + '_lng').value = latlng.lng();

        document.getElementById(wname + '_btnReset').style.display = "none";

//         var googlemap = googlemaps[wname];
//         if (!googlemap)
//         {
//             geo_initMap(latlng,wname,zoom,'edit',address);
//         } else
//         {
//             googlemap.setCenter(marker.getLatLng(),zoom);
//         }
    } else
    { // failure to locate address
            geo_invalidateCoords(wname);
            alert("Can't locate the address you've entered: " + address);
    }
}

function geo_initMap(latlng, wname, zoom, mode, info_text)
{
    var googlemap = googlemaps[wname];
    if (! googlemap)
    {
        var map_div = document.getElementById(wname + "_map");
        map_div.style.display = "block";
        googlemap = new GMap2(map_div);
        googlemap.addControl(new GLargeMapControl());
        googlemap.enableContinuousZoom();

    }
    
    googlemap.setCenter(latlng, zoom);
    
    var marker = markers[wname];

    if (marker)
    {
        googlemap.removeOverlay(marker);
        delete markers[wname];
    }

    if (mode == 'edit')
    {
        marker = new GMarker(latlng, {draggable: true});

        GEvent.addListener(googlemap, "zoomend", function(oldLevel, newLevel) {
            document.getElementById(wname + '_zoom').value = newLevel;
        })
        
        GEvent.addListener(marker, "dragend", function() {
            document.getElementById(wname + '_lat').value = marker.getLatLng().lat();
            document.getElementById(wname + '_lng').value = marker.getLatLng().lng();
            document.getElementById(wname + '_btnReset').style.display = "inline";
        });
    } else /// mode == 'view'
    {
        marker = new GMarker(latlng, {draggable: false});

        if (info_text)
          googlemap.openInfoWindowHtml(marker.getLatLng(), info_text);
    }

    googlemap.addOverlay(marker);
    markers[wname] = marker;

    return googlemap;
}

function geo_initWidget(wname, lat, lng, zoom, mode, info_text)
{
    if (lat && lng)
    {
        var latlng = new GLatLng(lat,lng);
        geo_initMap(latlng, wname, zoom, mode,info_text);
    } else
    {
        geo_invalidateCoords(wname);
    }
}



function geo_lookupAddress(wname)
{
    var address = document.getElementById(wname + '_address').value;
    //TODO: use getLocations here to get multiple possible locations
    if (!geocoder)
    {
        geo_init();        
    }
    geocoder.getLatLng(address, function(point) { geo_onLocationFound(point, wname); } );

    return false;
}

/*
function geo_initWidget2(wname, lat, lng, zoom, mode, info_text, kml_name)
{
    if (lat && lng)
    {
        var latlng = new GLatLng(lat,lng);
        var googlemap = geo_initMap(latlng, wname, zoom, mode,info_text);

        alert('Loading kml '+kml_name);
        var kml = new GGeoXml(kml_name, function() { kml.show(); alert('KML loading result: ' + kml.loadedCorrectly()); })
        googlemap.addOverlay( kml );
    }
}
*/




