var ajax_site = 'ajax';
var refresh_rate = 3000;
var send_timeout = 20000;
var retry_rate = 3000;
function Blocker(sleeper) {
this.counter = 0;
this.waiting = false;
this.sleeper = sleeper;
}
Blocker.prototype.setHook = function() {
var blocker = this;
return function() {
blocker.counter++;
}
}
Blocker.prototype.setNotifier = function(cb) {
var blocker = this;
return function() {
cb.apply(this, arguments);
if (--blocker.counter == 0 && blocker.waiting)
blocker.sleeper();
}
};
Blocker.prototype.go = function() {
if (this.counter == 0)
this.sleeper();
this.waiting = true;
}
function send_request(on_success) {
$.ajax({
url: ajax_site,
type: 'GET',
cache: false,
dataType: 'json',
async: true,
success: on_success,
timeout: send_timeout,
error: function(a, b, c) {
console.log("failed while connecting, reason: " + b);
setTimeout(function() {
send_request(on_success);
}, retry_rate);
}
});
}
function hex(x) {
return ("0" + parseInt(x).toString(16)).slice(-2);
}
function random_range(min, max) {
return Math.random() * (max - min) + min;
}
function random_color() {
var r = (random_range(0, 200) + 150) / 2;
var g = (random_range(0, 200) + 150) / 2;
var b = (random_range(0, 200) + 150) / 2;
return "#" + hex(r) + hex(g) + hex(b);
}
var freeze_var = function(cont, i, val) { return cont[i] = function(){ return val }; };
function LineGraph() {}
LineGraph.prototype.recalc_y_domain = function(mdata) {
var min = d3.min($.map(mdata, function (data) {
return d3.min(data, function(d) { return d.y; }); }));
var max = d3.max($.map(mdata, function (data) {
return d3.max(data, function(d) { return d.y; }); }));
var delta = max - min;
this.y.domain([min - delta / 2.0, max + delta / 3.0]);
}
LineGraph.prototype.recalc_domain = function(mdata) {
this.x.domain(d3.extent(mdata[0], function(d) { return d.x; }));
this.recalc_y_domain(mdata);
}
LineGraph.prototype.parse_data = function(d) {
var data = [];
for (var i = 0; i < d.records.length; i++)
{
var row = d.records[i];
while (data.length < row.rec.length)
data.push([]);
for (var j = 0; j < row.rec.length; j++)
data[j].push({x: i, y: +row.rec[j], rid: row.rid});
}
return data;
}
LineGraph.prototype.update = function(d, i, b) {
var graph = this;
var mdata = this.parse_data(d);
var freezed_i = [];
var recalced = false;
for (var i = 0; i < mdata.length; i++)
{
var data = mdata[i];
if (data.length == 0) continue;
var pdata = this.pdata[i];
var svg = d3.select(this.elem).select("svg");
var path = this.line[i];
var shift = pdata.length ? data[0].rid - pdata[0].rid : 0;
var add = pdata.length ? data[data.length - 1].rid - pdata[pdata.length - 1].rid : 0;
if (pdata.length == 0 || pdata[pdata.length - 1].rid < data[0].rid ||
pdata[0] > data[data.length - 1].rid || shift < 0 || add < 0)
{
if (data