var gmap = null;
var ymap = null;
var ggeocoder = null;

function initMap() {
    gmap = new GMap2(document.getElementById('gmap'));
    gmap.addControl(new GLargeMapControl());
    gmap.addControl(new GMapTypeControl());
    gmap.enableDoubleClickZoom();
    gmap.enableContinuousZoom();
    GEvent.addListener(gmap, 'moveend', gmapMoved);
    ggeocoder = new GClientGeocoder();

    ymap = new YMap(document.getElementById('ymap'));
    ymap.addTypeControl();
    ymap.addPanControl();
    ymap.addZoomLong();
    YEvent.Capture(ymap, 'endPan', ymapMoved);
    YEvent.Capture(ymap, 'endAutoPan', ymapMoved);
    YEvent.Capture(ymap, 'changeZoom', ymapMoved);
    YEvent.Capture(ymap, 'onEndGeoCode', showAddressOnYMap);
    YEvent.Capture(ymap, 'endMapDraw', writeURL);

    var lat = 52;
    var lon = 8.5;
    var zoom = 9;
    var gmaptype = 'map';
    var ymaptype = 'map';

    paramstr = location.search.substring(1, location.search.length);
    for (i=0; i<paramstr.split('&').length; i++) {
        var pair = paramstr.split('&')[i];
        var key = pair.split('=')[0];
        var val = pair.split('=')[1];
        switch(key) {
        case 'lon':
            lon=val; break;
        case 'lat':
            lat=val; break;
        case 'zoom':
            zoom=parseInt(val); break;
        case 'gmap':
            gmaptype=val; break;
        case 'ymap':
            ymaptype=val; break;
        }
    }

    gmap.setCenter(new GLatLng(lat, lon), zoom);
    ymap.drawZoomAndCenter(new YGeoPoint(lat ,lon), 18-zoom);

    switch(gmaptype) {
    case 'map':
        gmap.setMapType(G_NORMAL_MAP); break;
    case 'sat':
        gmap.setMapType(G_SATELLITE_MAP); break;
    case 'hyb':
        gmap.setMapType(G_HYBRID_MAP); break;
    }
    switch(ymaptype) {
    case 'map':
        ymap.setMapType(YAHOO_MAP_REG); break;
    case 'sat':
        ymap.setMapType(YAHOO_MAP_SAT); break;
    case 'hyb':
        ymap.setMapType(YAHOO_MAP_HYB); break;
    }
        
}

function gmapMoved() {
    var center = gmap.getCenter();
    ymap.drawZoomAndCenter(new YGeoPoint(center.lat(), center.lng()),
                           18-gmap.getZoom());
    writeURL();
}

function ymapMoved() {
    var center = ymap.getCenterLatLon();
    gmap.setCenter(new GLatLng(center.Lat, center.Lon),
                   18-ymap.getZoomLevel());
    writeURL();
}

function writeURL() {
    var center = gmap.getCenter();
    var lat = center.lat();
    var lon = center.lng();
    var zoom = gmap.getZoom();
    var gmaptype;
    switch(gmap.getCurrentMapType()) {
    case G_NORMAL_MAP:
        gmaptype = 'map'; break;
    case G_SATELLITE_MAP:
        gmaptype = 'sat'; break;
    case G_HYBRID_MAP:
        gmaptype = 'hyb'; break;
    }
    var ymaptype;
    switch(ymap.getCurrentMapType()) {
    case YAHOO_MAP_REG:
        ymaptype = 'map'; break;
    case YAHOO_MAP_SAT:
        ymaptype = 'sat'; break;
    case YAHOO_MAP_HYB:
        ymaptype = 'hyb'; break;
    }
        
    url = location.pathname+'?lat='+lat+'&lon='+lon+'&zoom='+zoom
        +'&gmap='+gmaptype+'&ymap='+ymaptype;
    document.getElementById('url').innerHTML
        = '<a href="'+url+'">link to these maps</a>';
}

function showAddressG(location) {
    ggeocoder.getLocations(location, showAddressOnGMap);
}

function showAddressOnGMap(response) {
    if (!response || response.Status.code != 200) {
        alert("Address not found by Google Geocoder");
    } else {
        var place = response.Placemark[0];
        var point = new GLatLng(place.Point.coordinates[1],
                                place.Point.coordinates[0]);
        gmap.setCenter(point);
    }
}

function showAddressY(location) {
    ymap.geoCodeAddress(location);
}

function showAddressOnYMap(response) {
    if (response.success) {
        ymap.drawZoomAndCenter(response.GeoPoint, ymap.getZoomLevel());
        ymapMoved();
    } else {
        alert("Address not found by Yahoo Geocoder");
    }
}

