123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240 |
- // Licensed Materials - Property of IBM
- //
- // IBM Cognos Products: cogadmin
- //
- // (C) Copyright IBM Corp. 2005, 2010
- //
- // US Government Users Restricted Rights - Use, duplication or disclosure restricted by GSA ADP Schedule Contract with IBM Corp.
- //
- //
- // Copyright (C) 2008 Cognos ULC, an IBM Company. All rights reserved.
- // Cognos (R) is a trademark of Cognos ULC, (formerly Cognos Incorporated).
- function bar_chart(chartdef) {
- this.chartdef = chartdef;
- this.chart = null;
-
- if (chartdef.columns != '') {
- this.columnCount = chartdef.columns;
- }
- else {
- // default to 3 columns which is what's shown in liz.
- this.columnCount = 3;
- }
-
- this.maxValue = 0;
- this.total = 0;
- for (var i=0; i < this.chartdef.rows.length; i++) {
- if (parseInt(this.chartdef.rows[i].value) > this.maxValue) {
- this.maxValue = parseInt(this.chartdef.rows[i].value);
- }
-
- this.total += new Number(this.chartdef.rows[i].value);
- }
- // Always want ticks to be a multiple of 5
- this.axisMultiplier = 5;
- // All of this to make sure the maximum y value is divisible by axisMultiplier (5) and columnCount.
- // Make sure we get astheticly pleasing numbers for the ticks.
- var axisRangeMultiplier = this.columnCount * this.axisMultiplier;
- var maxAxisValue = Math.ceil(this.maxValue / axisRangeMultiplier) * axisRangeMultiplier;
- // Each tick will be a multiple of this value
- this.axisTickInterval = Math.ceil(maxAxisValue / this.columnCount);
- }
- bar_chart.prototype = {
- buildChart: function() {
- var table = document.createElement('table');
- table.cellSpacing="0";
- table.cellPadding="0";
- table.border="0";
- if (this.chartdef.width) {
- table.style.width = this.chartdef.width;
- }
-
- tbody = document.createElement('tbody');
- table.appendChild(tbody);
-
- // title
- if (this.chartdef.title != '') {
- var tr = document.createElement('tr');
- // empty td for the labels
- tr.appendChild(document.createElement('td'));
-
- var td = document.createElement('td');
- td.className = 'tableText';
- td.setAttribute("colSpan",this.columnCount);
- td.style.textAlign = 'center';
- td.style.paddingBottom = '15px';
- td.style.fontWeight = 'bold';
- td.style.width = '100%';
- td.appendChild(document.createTextNode(this.chartdef.title + ' (' + this.total + ')'));
- tr.appendChild(td);
- tbody.appendChild(tr);
- }
- var columnWidth = Math.ceil(80 / this.columnCount);
- // build up the rows
- for (var row=0; row < this.chartdef.rows.length; row++) {
- var paddingTop = '2px';
- var paddingBottom = '2px';
-
- // label column
- var tr = document.createElement('tr');
- var td = tr.appendChild( document.createElement('td') );
- td.width = "20%";
- td.className = "tableText";
- td.style.textAlign = 'right';
- td.style.paddingRight = '5px';
- td.style.borderRight = '1px solid #000000';
- td.style.paddingTop = paddingTop;
- td.style.paddingBottom = paddingBottom;
- td.appendChild(document.createTextNode(this.chartdef.rows[row].label));
-
- for (var column=0; column < this.columnCount; column++) {
- var td = tr.appendChild( document.createElement('td') );
- td.setAttribute("id",this.chartdef.unique_id + row + column);
- td.setAttribute("nowrap","nowrap");
- td.style.width = columnWidth + "%";
- td.style.emptyCells = 'show';
- td.style.height = '21px';
- td.style.borderRight = '1px';
- td.style.borderColor = '#999999';
- td.style.borderRightStyle = 'dotted';
- td.style.paddingTop = paddingTop;
- td.style.paddingBottom = paddingBottom;
- td.style.verticalAlign = 'top';
-
- // if we're on the last row, need some extra styles
- if ((row + 1) == this.chartdef.rows.length) {
- td.style.borderBottom = '1px solid #000000';
- }
- if (column == 0) {
- var div = td.appendChild(document.createElement('div'))
- div.setAttribute("nowrap","nowrap");
- div.id = this.chartdef.unique_id + '_div_' + row;
- div.style.position = 'absolute';
- div.style.width = '500px';
- div.style.height = '17px';
- var table_bar = div.appendChild(document.createElement('table'));
- table_bar.cellSpacing="0";
- table_bar.cellPadding="0";
- table_bar.style.position = 'relative';
- table_bar.border="0";
-
- var tbody_bar = table_bar.appendChild(document.createElement('tbody'));
-
- var tr_bar = tbody_bar.appendChild(document.createElement('tr'));
- var td_bar = tr_bar.appendChild(document.createElement('td'));
- td_bar.id = this.chartdef.unique_id + '_td_' + row;
- td_bar.style.height = '17px';
- td_bar.style.backgroundImage = 'url(' + this.chartdef.bar_image + ')';
-
- var td_bar_value = tr_bar.appendChild(document.createElement('td'));
- if (this.chartdef.rows[row].value != '') {
- td_bar_value.appendChild(document.createTextNode(this.chartdef.rows[row].value));
- }
- else {
- td_bar_value.appendChild(document.createTextNode('0'));
- }
- td_bar_value.style.fontFamily = 'tahoma';
- td_bar_value.style.fontWeight = 'bold';
- td_bar_value.style.color = '#0000CC';
- td_bar_value.style.textAlign = 'left';
- td_bar_value.style.paddingLeft = '5px';
- }
- td.appendChild(document.createTextNode(' '));
- tr.appendChild(td);
- }
-
- tbody.appendChild(tr);
- }
- // row to show the x axis values
- var tr = document.createElement('tr');
-
- for (var column=-1; column < this.columnCount; column++) {
- var td = tr.appendChild( document.createElement('td') );
- td.setAttribute("nowrap","nowrap");
- td.className = 'dialogHeaderText';
- td.style.textAlign = 'right';
-
- var span = td.appendChild( document.createElement('span') );
- span.className = 'inactiveText';
-
- // when all the bars are zero, just put 1,2,3,... for the y axis values
- if (this.axisTickInterval == 0 ) {
- span.appendChild(document.createTextNode((column+1) * this.axisMultiplier));
- }
- else {
- span.appendChild(document.createTextNode(this.axisTickInterval * (column + 1)));
- }
-
- tr.appendChild(td);
- }
-
- tbody.appendChild(tr);
-
- $(this.chartdef.div_id).appendChild(table);
- this.chart = $(this.chartdef.div_id);
- },
-
- resizeBars: function() {
- // when a fragment that already had a graph gets refreshed, the onrezie even fires before we've
- // rebuilt the graph. Catch it here before we do any farther.
- if (!$(this.chartdef.unique_id + '_div_0')) {
- return;
- }
- var totalWidth = 0;
- var xAxisLimit = this.axisTickInterval * this.columnCount;
-
- // if xAxisLimit is 0 then return. This can happen if all the bars have a value of 0
- if (xAxisLimit == 0) {
- return;
- }
-
- // calculate the total width of the columns
- for (var column=0; column < this.columnCount; column++) {
- totalWidth += xWidth($(this.chartdef.unique_id + '0' + column));
- }
- // only resize the bars if we have a width. If the width is zero then it
- // means our div is hidden so there's no reason to resize the bars. Also
- // resizing the bars when we're hidden was causing a firefox only bug
- if (totalWidth > 0) {
- // resize the bars
- for (var row=0; row < this.chartdef.rows.length; row++) {
- // make sure the absolute div is wide enough for the table inside it (IE fix)
- $(this.chartdef.unique_id + '_div_' + row).style.width = totalWidth;
-
- var rowValue = this.chartdef.rows[row].value;
-
- var barDiv = $(this.chartdef.unique_id + '_td_' + row);
- var barLength = new Number( (rowValue * totalWidth ) / xAxisLimit).toFixed();
-
- barDiv.style.width = barLength + 'px';
- }
- }
- },
-
- show: function() {
- if (!this.chart) {
- this.buildChart();
- }
-
- $(this.chartdef.div_id).style.display = 'block';
-
- this.resizeBars();
- }
- }
|