             })
 
             if bin.length
-                tooltips = bin.map(@tooltipFormatter)
-                    .filter((tooltip) -> !!(tooltip))
-
-                if tooltips.length
-                    @tooltip.html(tooltips.join("<br>"))
+                tooltip = @binTooltipFormatter(bin)
+                if tooltip.length
+                    @tooltip.html(tooltip)
                         .transition()
                         .duration(200)
                         .style("opacity", .9)

            .style("opacity", 0)

        @tooltipFormatter = @options.tooltipFormatter || (record) -> record[2]?.id || record[2]?.name

        # used for show()/hide()
        @originalDisplay = @element.style.display

    getPaths: -> @paths

    sync: (start, end, callback) ->
        @currentSyncState += 1
        syncState = @currentSyncState
        fetched = (records, paths) =>
            # only update the timeslider when the state is still valid
            if syncState == @currentSyncState
                callback(records, paths)

        # sources conforming to the Source interface
        if @source and typeof @source.fetch == "function"
            @source.fetch start, end, @sourceParams, fetched
        # sources that are functions
        else if typeof @source == "function"
            @source start, end, @sourceParams, fetched
        # no source, simply call the callback with the static records and paths
        else
            callback(@records, @paths)
