$(document).ready(function() {
    if (GBrowserIsCompatible()) {
        var maptypes = [G_NORMAL_MAP, G_SATELLITE_MAP, G_HYBRID_MAP, G_PHYSICAL_MAP];
        var map = new GMap2(document.getElementById('mapmash-map'), {'mapTypes': maptypes});
        var bounds = new GLatLngBounds();
        var marker_groups = new Object();
        var all_markers = new Object();
        var all_feeds = new Object();
        map.addControl(new GSmallZoomControl());
        map.addControl(new GHierarchicalMapTypeControl(true));

        $.getJSON(mapmash_json_file, function(data) {
            for(var i in data.points) {
                var point = data.points[i];
                var marker = make_marker(point);
                bounds.extend(marker.getLatLng());
                if(!marker_groups[point.layer]) { marker_groups[point.layer] = new Object(); }
                marker_groups[point.layer][point.point] = marker;
                all_markers[point.point] = marker;
            }
            for(var j in data.feeds) {
                var feed = data.feeds[j];
                all_feeds[feed.layer] = new GGeoXml(feed.url);
            }
            var center = bounds.getCenter();
            var zoom = map.getBoundsZoomLevel(bounds);
            if(data.map.zoom) { zoom = data.map.zoom; }
            if(data.map.lat && data.map.lon) { center = new GLatLng(data.map.lat, data.map.lon); }
            if(data.map.default_viewport) { map.setCenter(new GLatLng(0, 0), 0); }
            else { map.setCenter(center, zoom); }
            for(var k in all_markers) { map.addOverlay(all_markers[k]); }
            for(var l in all_feeds) { 
                map.addOverlay(all_feeds[l]);
                if(data.map.default_viewport) { all_feeds[l].gotoDefaultViewport(map); }
            }
        });

    $('#mapmash-points a').click(function() {
        var index = $(this).attr('class');
        if(all_markers[index]) { GEvent.trigger(all_markers[index], 'click'); }
        return false;
    });

    $('#mapmash-layers input').click(function() {
        var index = $(this).attr('class');
        if(marker_groups[index]) {
            for(var l in marker_groups[index]) {
                if(marker_groups[index][l].isHidden()) { marker_groups[index][l].show(); }
                else { marker_groups[index][l].hide(); marker_groups[index][l].closeInfoWindow(); }
                jQuery("#mapmash-points li." + l).toggle();
            }
        } else if (all_feeds[index]) {
            if (all_feeds[index].isHidden()) { all_feeds[index].show(); }
            else { all_feeds[index].hide(); }
        }
    });

    }
});

$(window).unload(function() {
    GUnload();
});

function make_marker(input) {
    var baseIcon = new GIcon(G_DEFAULT_ICON);
    baseIcon.iconSize = new GSize(32, 32);
    baseIcon.shadowSize = new GSize(59, 32);
    baseIcon.iconAnchor = new GPoint(16, 32);
    baseIcon.infoWindowAnchor = new GPoint(16, 4);
    var point = new GLatLng(parseFloat(input.lat), parseFloat(input.lon));
    var icon = new GIcon(baseIcon, input.image);
    icon.shadow = input.shadow;
    var marker = new GMarker(point, {'title': input.title, 'icon': icon});
    marker.bindInfoWindowHtml(input.bubble, {maxWidth: 300});
    return marker;
}