function CometClient(url, queryString, callback) {
this.url = url;
this.queryString = queryString;
this.callback = callback;
}
CometClient.prototype.connect = function() {
var params = {
url : this.url,
queryString : this.queryString,
callback : this.callback
};
var xhr = new window.XMLHttpRequest();
window.setInterval(function() {
var url = params['url'];
xhr.open("POST", url, true);
xhr.onreadystatechange = function() {
if (xhr.readyState == 4 && xhr.status == 200) {
var jsonData = xhr.responseText;
params['callback'](jsonData);
}
};
xhr.send(params['queryString']);
}, 2000);
}
CometClient.prototype.close = function() {
// not implemented
}
function ChartConfiguration(aepId, htmlElementId, renderer) {
this.aepId = aepId;
this.htmlElementId = htmlElementId;
this.renderer = renderer;
}
function ChartClient() {
this.observers = new Array();
this.lastPoll = new Date().getTime();
this.consoleLog = new Array();
}
ChartClient.prototype.addObserver = function(observer) {
this.observers.push(observer);
}
ChartClient.prototype.addLogLine = function(data) {
var now = new Date();
var h = (now.getHours() < 10) ? "0" + now.getHours() : now.getHours();
var m = (now.getMinutes() < 10) ? "0" + now.getMinutes() : now.getMinutes();
var s = (now.getSeconds() < 10) ? "0" + now.getSeconds() : now.getSeconds();
var content = "[" + h + ":" + m + ":" + s + "] " + data;
this.consoleLog.push(content);
this.updateConsoleLog();
}
ChartClient.prototype.startGraphLoader = function() {
var url = "/synleaf/api/bootstrap/views";
var observerJSONtext = JSON.stringify(this.observers);
var queryString = jQuery.param({ o: observerJSONtext });
var context = this;
jQuery.post(url, queryString, function(data) {
context.loadView(data, context);
});
}
ChartClient.prototype.loadView = function(data, context) {
var response = JSON.parse(data);
jQuery.each(response['jsFiles'], function(index, objValue) {
jQuery('').attr({ type: objValue['type'], src: objValue['src']}).appendTo("head");
});
jQuery.each(response['widgets'], function(index, objValue) {
if (objValue['displayData'] != null) {
jQuery('#' + objValue['htmlElementId']).html(objValue['displayData']);
}
eval(objValue['scriptData']);
});
}
ChartClient.prototype.registerRenderer = function(renderer) {
for (var i = 0; i < this.observers.length; i++) {
if (renderer.getId() == this.observers[i].aepId) {
var o = this.observers[i];
o.renderer = renderer;
this.observers.splice(i, 1, o);
}
}
}
ChartClient.prototype.startDataProcessor = function() {
var url = "/synleaf/api/visistream";
var context = this;
var renderableObservers = new Array();
for (var i = 0; i < this.observers.length; i++) {
var configuration = {};
if (this.observers[i].renderer != null) {
configuration['aepId'] = this.observers[i].aepId;
renderableObservers.push(configuration['aepId']);
}
else {
setTimeout(function() { context.startDataProcessor(); }, 500);
return;
}
}
var queryString = jQuery.param({ o: renderableObservers }, true);
var callback = function(data) {
context.updateViews(data);
};
var c = new CometClient(url, queryString, callback);
c.connect();
}
ChartClient.prototype.updateConsoleLog = function() {
if (this.consoleLog.length >= 30) {
this.consoleLog.shift();
}
var content = "";
var j = this.consoleLog.length - 1;
for (var i = j; j >= 0; j--) {
content = content + this.consoleLog[j] + "
";
}
jQuery("#chart-console").html(content);
}
ChartClient.prototype.updateViews = function(response) {
var jsonData = JSON.parse(response);
for (j = 0; j < jsonData.length; j++) {
var chartData = jsonData[j];
for (i = 0; i < this.observers.length; i++) {
var observer = this.observers[i];
if (chartData['aepId'] == observer.aepId) {
var renderer = observer.renderer;
renderer.addData(chartData['data']);
renderer.renderChart();
break;
}
}
}
}