/**
 * @file
 * GMap Markers
 * Jef Poskanzer's Clusterer.js API version
 */

/*global Clusterer, Drupal, GMarker */

// Replace to override marker creation
Drupal.gmap.factory.marker = function (loc, opts) {
    return new GMarker(loc, opts);
};

Drupal.gmap.addHandler('gmap', function (elem) {
    var obj = this;

    obj.bind('init', function () {
        obj.clusterer = new Clusterer(obj.map);
        var s = Drupal.settings.gmap_markermanager;
        if (s) {
            obj.clusterer.SetMaxVisibleMarkers(+s.max_nocluster);
            obj.clusterer.SetMinMarkersPerCluster(+s.cluster_min);
            obj.clusterer.SetMaxLinesPerInfoBox(+s.max_lines);
        }
    });

    obj.bind('iconsready', function () {
        var s = Drupal.settings.gmap_markermanager;
        if (s.marker.length) {
            obj.clusterer.SetIcon(Drupal.gmap.getIcon(s.marker, 0));
        }
    });

    obj.bind('addmarker', function (marker) {
        var t = '';
        if (marker.opts.title) {
            t = marker.opts.title;
            if (marker.link) {
                t = '<a href="' + marker.link + '">' + t + '</a>';
            }
        }
        obj.clusterer.AddMarker(marker.marker, t);
    });

    obj.bind('delmarker', function (marker) {
        obj.clusterer.RemoveMarker(marker.marker);
    });

    obj.bind('clearmarkers', function () {
        // @@@ Maybe don't nuke ALL overlays?
        obj.map.clearOverlays();
    });
});

////////////////// Clusterer overrides section //////////////////

// Store original implementations of overridden functions
Clusterer.origFunctions = {};

// Alternate popup code from: http://drupal.org/node/155104#comment-574696
Clusterer.origFunctions.PopUp = Clusterer.PopUp;
Clusterer.PopUp = function (cluster) {
    var mode = Drupal.settings.gmap_markermanager.popup_mode;
    if (mode === 'orig') {
        return Clusterer.origFunctions.PopUp(cluster);
    }
    else if (mode === 'zoom') {
        var bounds = new GLatLngBounds();
        for (var k in cluster.markers)
            bounds.extend(cluster.markers[k].getPoint());

        var sw = bounds.getSouthWest();
        var ne = bounds.getNorthEast();
        var rect = [
            sw,
            new GLatLng(sw.lat(), ne.lng()),
            ne,
            new GLatLng(ne.lat(), sw.lng()),
            sw
        ];

        var center = bounds.getCenter();
        var zoom = cluster.clusterer.map.getBoundsZoomLevel(bounds);
        cluster.clusterer.map.setCenter(new GLatLng(+center.lat(), +center.lng()), +zoom);
    }
};
