227 lines
No EOL
5.9 KiB
JavaScript
227 lines
No EOL
5.9 KiB
JavaScript
|
|
GraphViewer= function(parent, w, h) {
|
|
|
|
this.show_labels = true;
|
|
this.font_size = 10;
|
|
|
|
if(!parent) {
|
|
this.wrapper = document.createElement('div')
|
|
parent = this.wrapper
|
|
}
|
|
|
|
this.body = $a(parent, 'div', 'gr_body');
|
|
|
|
if(w&&h) {
|
|
$w(this.body, w + 'px');
|
|
$w(this.body, h + 'px');
|
|
}
|
|
|
|
this._y_name = $a(parent, 'div', 'gr_y_name');
|
|
this._x_name = $a(parent, 'div', 'gr_x_name');
|
|
|
|
this._y_labels = $a(parent, 'div', 'gr_y_labels');
|
|
this._x_labels = $a(parent, 'div', 'gr_x_labels');
|
|
|
|
this.legend_area = $a(parent, 'div', 'gr_legend_area');
|
|
this.title_area = $a(parent, 'div', 'gr_title_area');
|
|
|
|
this.main_area = $a(parent, 'div', 'gr_main_area');
|
|
this.set_horizontal();
|
|
//this.set_vertical();
|
|
}
|
|
GraphViewer.prototype.clear = function() {
|
|
this.series = [];
|
|
this.xlabels = [];
|
|
this.xtitle = null;
|
|
this.ytitle = null;
|
|
}
|
|
GraphViewer.prototype.set_vertical = function() {
|
|
this.k_barwidth = 'width';
|
|
this.k_barstart = 'left';
|
|
this.k_barlength = 'height';
|
|
this.k_barbase = 'bottom';
|
|
this.k_bartop = 'top';
|
|
this.k_gridborder = 'borderTop';
|
|
|
|
this.y_name = this._y_name;
|
|
this.x_name = this._x_name;
|
|
|
|
this.y_labels = this._y_labels;
|
|
this.x_labels = this._x_labels;
|
|
|
|
this.vertical = true;
|
|
}
|
|
|
|
GraphViewer.prototype.set_horizontal = function() {
|
|
this.k_barwidth = 'height';
|
|
this.k_barstart = 'top';
|
|
this.k_barlength = 'width';
|
|
this.k_barbase = 'left';
|
|
this.k_bartop = 'right';
|
|
this.k_gridborder = 'borderRight';
|
|
|
|
this.y_name = this._x_name;
|
|
this.x_name = this._y_name;
|
|
|
|
this.y_labels = this._x_labels;
|
|
this.x_labels = this._y_labels;
|
|
|
|
this.vertical = false;
|
|
}
|
|
|
|
GraphViewer.prototype.set_title = function(t) {
|
|
this.title_area.innerHTML = t;
|
|
}
|
|
|
|
GraphViewer.prototype.add_series = function(label, color, values, borderColor) {
|
|
var s = new GraphViewer.GraphSeries(this, label);
|
|
s.color = color;
|
|
s.borderColor = borderColor;
|
|
s.data = values;
|
|
this.series[this.series.length] = s;
|
|
//this.xlabels[this.xlabels.length] = label;
|
|
}
|
|
|
|
GraphViewer.prototype.refresh = function() {
|
|
|
|
//
|
|
this.legend_area.innerHTML = '';
|
|
this.main_area.innerHTML = '';
|
|
this.x_labels.innerHTML = '';
|
|
this.y_labels.innerHTML = '';
|
|
this.x_name.innerHTML = '';
|
|
this.y_name.innerHTML = '';
|
|
|
|
// get max
|
|
var maxx=null;
|
|
var legendheight = 12;
|
|
|
|
for(i=0;i<this.series.length;i++) {
|
|
var series_max = this.series[i].get_max();
|
|
if(!maxx)maxx = series_max;
|
|
if(series_max > maxx)maxx = series_max;
|
|
|
|
// show series names
|
|
var tmp = $a(this.legend_area, 'div', 'gr_legend');
|
|
tmp.style.backgroundColor = this.series[i].color;
|
|
if(this.series[i].borderColor)
|
|
tmp.style.border = '1px solid ' + this.series[i].borderColor;
|
|
tmp.style.top = (i*(legendheight + 2)) + 'px';
|
|
tmp.style.height= legendheight + 'px';
|
|
|
|
var tmp1 = $a(this.legend_area, 'div', 'gr_legend');
|
|
tmp1.style.top = (i*(legendheight + 2)) + 'px';
|
|
tmp1.style.left = '30px';
|
|
$w(tmp1, '80px');
|
|
tmp1.innerHTML = this.series[i].name;
|
|
}
|
|
if(maxx==0)maxx = 1;
|
|
this.maxx = 1.1 * maxx;
|
|
|
|
// y - axis grid
|
|
var xfn = fmt_money;
|
|
|
|
// smart grid
|
|
if(maxx>1) {
|
|
var nchars = (cint(maxx)+'').length;
|
|
var gstep = Math.pow(10, (nchars-1));
|
|
while(flt(maxx / gstep) < 4) {
|
|
gstep = gstep / 2;
|
|
}
|
|
} else {
|
|
var gstep = maxx / 6;
|
|
}
|
|
|
|
var curstep = gstep;
|
|
|
|
while(curstep < this.maxx) {
|
|
var gr = $a(this.main_area, 'div', 'gr_grid');
|
|
gr.style[this.k_bartop] = (100-((flt(curstep)/this.maxx) * 100)) + '%';
|
|
gr.style[this.k_barwidth] = '100%';
|
|
gr.style[this.k_gridborder] = '1px dashed #888';
|
|
var ylab = $a(this.y_labels, 'div', 'gr_label');
|
|
ylab.style[this.k_bartop] = (99-((flt(curstep)/this.maxx)*100)) + '%';
|
|
ylab.style[this.k_barstart] = '10%';
|
|
ylab.innerHTML = xfn(curstep);
|
|
curstep += gstep;
|
|
}
|
|
|
|
if(this.vertical) {
|
|
this.x_name.innerHTML = this.xtitle;
|
|
middletext(this.y_name, this.ytitle);
|
|
} else {
|
|
middletext(this.x_name, this.xtitle);
|
|
this.y_name.innerHTML = this.ytitle;
|
|
}
|
|
|
|
// make X units
|
|
this.xunits = [];
|
|
this.xunit_width = (100 / this.xlabels.length);
|
|
if(this.series[0]){
|
|
for(i=0;i<this.xlabels.length;i++) {
|
|
this.xunits[this.xunits.length] = new GraphViewer.GraphXUnit(this, i, this.xlabels[i]);
|
|
}
|
|
}
|
|
}
|
|
|
|
GraphViewer.GraphSeries= function(graph, name) {
|
|
this.graph = graph;
|
|
this.name = name;
|
|
}
|
|
GraphViewer.GraphSeries.prototype.get_max = function() {
|
|
var m;
|
|
for(t=0;t<this.data.length;t++) {
|
|
if(!m)m = this.data[t];
|
|
if(this.data[t]>m)m=this.data[t]
|
|
}
|
|
return m;
|
|
}
|
|
|
|
GraphViewer.GraphXUnit= function(graph, idx, label) {
|
|
this.body = $a(graph.main_area, 'div', 'gr_xunit');
|
|
this.body.style[graph.k_barstart] = (idx * graph.xunit_width) + '%';
|
|
this.body.style[graph.k_barwidth] = graph.xunit_width + '%';
|
|
this.body.style[graph.k_barlength] = '100%';
|
|
this.show(graph, label, idx);
|
|
|
|
//
|
|
if(graph.show_labels) {
|
|
this.label = $a(graph.x_labels, 'div', 'gr_label');
|
|
this.label.style[graph.k_barstart] = (idx * graph.xunit_width) + '%';
|
|
this.label.style[graph.k_barwidth] = graph.xunit_width + '%';
|
|
if(graph.vertical) {
|
|
$y(this.label,{height:'100%',top:'10%'});
|
|
this.label.innerHTML = label;
|
|
} else {
|
|
middletext(this.label, label);
|
|
}
|
|
}
|
|
}
|
|
|
|
GraphViewer.GraphXUnit.prototype.show = function(graph, l, idx) {
|
|
var bar_width = (100 / (graph.series.length + 1));
|
|
//if(bar_width>15) bar_width = 15;
|
|
//if(bar_width<20) bar_width = 20;
|
|
start = (100 - (graph.series.length*bar_width)) / 2
|
|
|
|
for(var i=0;i<graph.series.length; i++) {
|
|
var v = graph.series[i].data[idx];
|
|
var b = $a(this.body, 'div', 'gr_bar');
|
|
b.style[graph.k_barbase] = '0%';
|
|
b.style[graph.k_barstart] = start + '%';
|
|
b.style[graph.k_barwidth] = bar_width + '%';
|
|
b.style[graph.k_barlength] = (v / graph.maxx * 100) + '%';
|
|
if(graph.series[i].color)b.style.backgroundColor = graph.series[i].color;
|
|
if(graph.series[i].borderColor)
|
|
b.style.border = '1px solid ' + graph.series[i].borderColor;
|
|
|
|
start += bar_width;
|
|
}
|
|
}
|
|
|
|
function middletext(par, t, size) {
|
|
if(!size)size = 10;
|
|
var tb = $a(par, 'div', 'absdiv');
|
|
tb.style.top = ((par.clientHeight - size) / 2) + 'px';
|
|
tb.innerHTML = t;
|
|
} |