
//
// geocoder: google.com
//
// Google Maps API Version 2 Documentation
//  http://www.google.com/apis/maps/documentation/
//

var g_listing_list          = new Array();
var g_run_google_map        = false;
var g_google_map_running    = false;
var g_map_container_id      = "map_container";
var g_map_area_id           = "map_area";
var g_zoom_level            = 13;               // from 0 to 17

var g_map  = false;
var g_icon = false;
var g_center_positioned = false;

function r7_listing( id, query, info )
{
    this.id     = id;
    this.info   = info;
    this.query  = query;
}

function r7_add_listing( id, query, info )
{
    var listing = new r7_listing( id, query, info );
    g_listing_list.push( listing );
}

function r7_decode( str )
{
    var r = str;

    r = r.replace( /%22%/g, "\"" );
    r = r.replace( /%27%/g, "'" );

    return ( r );
}


function destroy_google_map()
{
    var o = document.getElementById( g_map_container_id );
    if ( o ) o.parentNode.removeChild( o );

    return;
}


function init_google_map()
{
    g_google_map_running = true;

    g_icon = new GIcon();
    g_map  = new GMap2( document.getElementById( g_map_area_id ) );

    g_map.addControl( new GLargeMapControl() );
    g_map.addControl( new GMapTypeControl() );

    g_icon.image  = "images/google_marker.gif";
    g_icon.shadow = "images/google_marker_shadow.gif";
    g_icon.iconSize   = new GSize( 30, 40 );
    g_icon.shadowSize = new GSize( 47, 40 );
    g_icon.iconAnchor = new GPoint( 15, 40 );
    g_icon.infoWindowAnchor = new GPoint( 15, 10 );

    g_map.setCenter( new GLatLng( 34, 0 ), 1 );

}

function get_listing_info( name )
{
    var info = false;

    var n = g_listing_list.length;
    for ( var i=0; i<n; i++ ) {
        var l = g_listing_list[ i ] ;
        if ( l.query == name ) {
            info = r7_decode( l.info );
        }
    }

    return ( info );
}

function display_on_map( response )
{
    if ( !response || response.Status.code != 200 ) {
        if ( response ) {
            // alert( "geocoding error: " +  response.name );
        }
        return;
    }

    var name  = response.name;
    var place = response.Placemark[0];
    var lat   = place.Point.coordinates[1];
    var lon   = place.Point.coordinates[0];
    var point = new GLatLng( lat, lon );
    var marker= new GMarker( point, g_icon );

    marker.info = get_listing_info( name );
    GEvent.addListener( marker, "mouseover", function() { this.openInfoWindowHtml( this.info ); });
    GEvent.addListener( marker, "click", function() { this.openInfoWindowHtml( this.info ); });
    g_map.addOverlay( marker );

    if ( !g_center_positioned ) {
        g_map.setCenter( point, g_zoom_level );
        marker.openInfoWindowHtml( marker.info );
        g_center_positioned = true;
    }
}

function run_geo_query()
{
    var n = g_listing_list.length;
    var geocoder = new GClientGeocoder();

    for ( var i=0; i<n; i++) {
        var listing = g_listing_list[i];
        var q = listing.query;
        geocoder.getLocations( q, display_on_map );
    }
}

function unload_google_map()
{
    if ( g_google_map_running ) {
        GUnload();
    }
}

function load_google_map()
{
    var none = false;

    if ( g_run_google_map ) {
        r7_google_map_listings();
        if (g_listing_list.length <= 0) none = true;
    } else {
        none = true;
    }
    if ( ! GBrowserIsCompatible() ) none = true;

    if ( none ) {
        destroy_google_map();
        return;
    }

    init_google_map();
    run_geo_query();
}
