/* @requires jQuery, AXIS */

var Timeline = function(timestamps, id, options) {
    this.timestamps = timestamps;
    this.element = jQuery("#" + AXIS.escapeCSS(id));
    this.options = options || { };

    var n = timestamps.length; // number of nodes 
    var T0 = timestamps[0];
    var Tn = timestamps[n - 1];
    var T = Tn - T0; // total duration 
    var W = this.element.width();
    var W0 = this.element.offset().left;
    var H = this.element.height() - W; // total height 
    this.H0 = W/2;
    this.delta = 2;  // min separation between nodes: 1 px 
    var N = H/this.delta; // max possible nodes 
    var h = 2 * this.delta;  // min height of node 
    var t = T/N;  // smallest unit of time that can be represented
    this.points = [];
    var i;

    for (i=0; i < N + 1; i++) {
        this.points[i] = 0;
    };

    var up = this;
    for (i=0; i < n; i++) {
        up.points[Math.ceil((timestamps[i] - T0)/t)] += 1;
    };

    var j, node;
    for (i=0; i < N + 1; i++) {
        j = 1;
        while((i+j)<N+1 && this.points[i+j] != 0)  {
            if ( j*h*h < W*W/4 ) this.points[i] += this.points[i+j];
            this.points[i+j] = 0;
            j++;
        };

        this.points[i] = Math.ceil(Math.sqrt(this.points[i]));
        if (this.points[i]) {
            node = jQuery("<div class='timeline-node'></div>");
            this.element.append(node);
            node.css({
                top: this.H0 + i * this.delta,
                left: (W - h)/2,
                height: this.points[i] * h,
                width: h
            });
        }

    };
};
