Subversion Repositories Applications.papyrus

Rev

Go to most recent revision | Blame | Compare with Previous | Last modification | View Log | RSS feed

/*
        Copyright (c) 2004-2006, The Dojo Foundation
        All Rights Reserved.

        Licensed under the Academic Free License version 2.1 or above OR the
        modified BSD license. For more information on Dojo licensing, see:

                http://dojotoolkit.org/community/licensing.shtml
*/

dojo.provide("dojo.widget.Chart");
dojo.require("dojo.widget.*");
dojo.require("dojo.gfx.color");
dojo.require("dojo.gfx.color.hsl");
dojo.declare("dojo.widget.Chart", null, function () {
        this.series = [];
}, {isContainer:false, assignColors:function () {
        var hue = 30;
        var sat = 120;
        var lum = 120;
        var steps = Math.round(330 / this.series.length);
        for (var i = 0; i < this.series.length; i++) {
                var c = dojo.gfx.color.hsl2rgb(hue, sat, lum);
                if (!this.series[i].color) {
                        this.series[i].color = dojo.gfx.color.rgb2hex(c[0], c[1], c[2]);
                }
                hue += steps;
        }
}, parseData:function (table) {
        var thead = table.getElementsByTagName("thead")[0];
        var tbody = table.getElementsByTagName("tbody")[0];
        if (!(thead && tbody)) {
                dojo.raise("dojo.widget.Chart: supplied table must define a head and a body.");
        }
        var columns = thead.getElementsByTagName("tr")[0].getElementsByTagName("th");
        for (var i = 1; i < columns.length; i++) {
                var key = "column" + i;
                var label = columns[i].innerHTML;
                var plotType = columns[i].getAttribute("plotType") || "line";
                var color = columns[i].getAttribute("color");
                var ds = new dojo.widget.Chart.DataSeries(key, label, plotType, color);
                this.series.push(ds);
        }
        var rows = tbody.rows;
        var xMin = Number.MAX_VALUE, xMax = Number.MIN_VALUE;
        var yMin = Number.MAX_VALUE, yMax = Number.MIN_VALUE;
        var ignore = ["accesskey", "align", "bgcolor", "class", "colspan", "height", "id", "nowrap", "rowspan", "style", "tabindex", "title", "valign", "width"];
        for (var i = 0; i < rows.length; i++) {
                var row = rows[i];
                var cells = row.cells;
                var x = Number.MIN_VALUE;
                for (var j = 0; j < cells.length; j++) {
                        if (j == 0) {
                                x = parseFloat(cells[j].innerHTML);
                                xMin = Math.min(xMin, x);
                                xMax = Math.max(xMax, x);
                        } else {
                                var ds = this.series[j - 1];
                                var y = parseFloat(cells[j].innerHTML);
                                yMin = Math.min(yMin, y);
                                yMax = Math.max(yMax, y);
                                var o = {x:x, value:y};
                                var attrs = cells[j].attributes;
                                for (var k = 0; k < attrs.length; k++) {
                                        var attr = attrs.item(k);
                                        var bIgnore = false;
                                        for (var l = 0; l < ignore.length; l++) {
                                                if (attr.nodeName.toLowerCase() == ignore[l]) {
                                                        bIgnore = true;
                                                        break;
                                                }
                                        }
                                        if (!bIgnore) {
                                                o[attr.nodeName] = attr.nodeValue;
                                        }
                                }
                                ds.add(o);
                        }
                }
        }
        return {x:{min:xMin, max:xMax}, y:{min:yMin, max:yMax}};
}});
dojo.declare("dojo.widget.Chart.DataSeries", null, function (key, label, plotType, color) {
        this.id = "DataSeries" + dojo.widget.Chart.DataSeries.count++;
        this.key = key;
        this.label = label || this.id;
        this.plotType = plotType || "line";
        this.color = color;
        this.values = [];
}, {add:function (v) {
        if (v.x == null || v.value == null) {
                dojo.raise("dojo.widget.Chart.DataSeries.add: v must have both an 'x' and 'value' property.");
        }
        this.values.push(v);
}, clear:function () {
        this.values = [];
}, createRange:function (len) {
        var idx = this.values.length - 1;
        var length = (len || this.values.length);
        return {"index":idx, "length":length, "start":Math.max(idx - length, 0)};
}, getMean:function (len) {
        var range = this.createRange(len);
        if (range.index < 0) {
                return 0;
        }
        var t = 0;
        var c = 0;
        for (var i = range.index; i >= range.start; i--) {
                var n = parseFloat(this.values[i].value);
                if (!isNaN(n)) {
                        t += n;
                        c++;
                }
        }
        t /= Math.max(c, 1);
        return t;
}, getMovingAverage:function (len) {
        var range = this.createRange(len);
        if (range.index < 0) {
                return 0;
        }
        var t = 0;
        var c = 0;
        for (var i = range.index; i >= range.start; i--) {
                var n = parseFloat(this.values[i].value);
                if (!isNaN(n)) {
                        t += n;
                        c++;
                }
        }
        t /= Math.max(c, 1);
        return t;
}, getVariance:function (len) {
        var range = this.createRange(len);
        if (range.index < 0) {
                return 0;
        }
        var t = 0;
        var s = 0;
        var c = 0;
        for (var i = range.index; i >= range.start; i--) {
                var n = parseFloat(this.values[i].value);
                if (!isNaN(n)) {
                        t += n;
                        s += Math.pow(n, 2);
                        c++;
                }
        }
        return (s / c) - Math.pow(t / c, 2);
}, getStandardDeviation:function (len) {
        return Math.sqrt(this.getVariance(len));
}, getMax:function (len) {
        var range = this.createRange(len);
        if (range.index < 0) {
                return 0;
        }
        var t = 0;
        for (var i = range.index; i >= range.start; i--) {
                var n = parseFloat(this.values[i].value);
                if (!isNaN(n)) {
                        t = Math.max(n, t);
                }
        }
        return t;
}, getMin:function (len) {
        var range = this.createRange(len);
        if (range.index < 0) {
                return 0;
        }
        var t = 0;
        for (var i = range.index; i >= range.start; i--) {
                var n = parseFloat(this.values[i].value);
                if (!isNaN(n)) {
                        t = Math.min(n, t);
                }
        }
        return t;
}, getMedian:function (len) {
        var range = this.createRange(len);
        if (range.index < 0) {
                return 0;
        }
        var a = [];
        for (var i = range.index; i >= range.start; i--) {
                var n = parseFloat(this.values[i].value);
                if (!isNaN(n)) {
                        var b = false;
                        for (var j = 0; j < a.length && !b; j++) {
                                if (n == a[j]) {
                                        b = true;
                                }
                        }
                        if (!b) {
                                a.push(n);
                        }
                }
        }
        a.sort();
        if (a.length > 0) {
                return a[Math.ceil(a.length / 2)];
        }
        return 0;
}, getMode:function (len) {
        var range = this.createRange(len);
        if (range.index < 0) {
                return 0;
        }
        var o = {};
        var ret = 0;
        var m = 0;
        for (var i = range.index; i >= range.start; i--) {
                var n = parseFloat(this.values[i].value);
                if (!isNaN(n)) {
                        if (!o[this.values[i].value]) {
                                o[this.values[i].value] = 1;
                        } else {
                                o[this.values[i].value]++;
                        }
                }
        }
        for (var p in o) {
                if (m < o[p]) {
                        m = o[p];
                        ret = p;
                }
        }
        return parseFloat(ret);
}});
dojo.requireIf(dojo.render.svg.capable, "dojo.widget.svg.Chart");
dojo.requireIf(!dojo.render.svg.capable && dojo.render.vml.capable, "dojo.widget.vml.Chart");