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 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;im)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