blob: 5947476bf1959b77285e1f97732cacd3e1fb8c91 [file] [log] [blame]
/*
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.charting.Axis");
dojo.require("dojo.lang.common");
dojo.charting.Axis = function (label, scale, labels) {
var id = "dojo-charting-axis-" + dojo.charting.Axis.count++;
this.getId = function () {
return id;
};
this.setId = function (key) {
id = key;
};
this.scale = scale || "linear";
this.label = label || "";
this.showLabel = true;
this.showLabels = true;
this.showLines = false;
this.showTicks = false;
this.range = {upper:100, lower:0};
this.origin = "min";
this._origin = null;
this.labels = labels || [];
this._labels = [];
this.nodes = {main:null, axis:null, label:null, labels:null, lines:null, ticks:null};
this._rerender = false;
};
dojo.charting.Axis.count = 0;
dojo.extend(dojo.charting.Axis, {getCoord:function (val, plotArea, plot) {
val = parseFloat(val, 10);
var area = plotArea.getArea();
if (plot.axisX == this) {
var offset = 0 - this.range.lower;
var min = this.range.lower + offset;
var max = this.range.upper + offset;
val += offset;
return (val * ((area.right - area.left) / max)) + area.left;
} else {
var max = this.range.upper;
var min = this.range.lower;
var offset = 0;
if (min < 0) {
offset += Math.abs(min);
}
max += offset;
min += offset;
val += offset;
var pmin = area.bottom;
var pmax = area.top;
return (((pmin - pmax) / (max - min)) * (max - val)) + pmax;
}
}, initializeOrigin:function (drawAgainst, plane) {
if (this._origin == null) {
this._origin = this.origin;
}
if (isNaN(this._origin)) {
if (this._origin.toLowerCase() == "max") {
this.origin = drawAgainst.range[(plane == "y") ? "upper" : "lower"];
} else {
if (this._origin.toLowerCase() == "min") {
this.origin = drawAgainst.range[(plane == "y") ? "lower" : "upper"];
} else {
this.origin = 0;
}
}
}
}, initializeLabels:function () {
this._labels = [];
if (this.labels.length == 0) {
this.showLabels = false;
this.showLines = false;
this.showTicks = false;
} else {
if (this.labels[0].label && this.labels[0].value != null) {
for (var i = 0; i < this.labels.length; i++) {
this._labels.push(this.labels[i]);
}
} else {
if (!isNaN(this.labels[0])) {
for (var i = 0; i < this.labels.length; i++) {
this._labels.push({label:this.labels[i], value:this.labels[i]});
}
} else {
var a = [];
for (var i = 0; i < this.labels.length; i++) {
a.push(this.labels[i]);
}
var s = a.shift();
this._labels.push({label:s, value:this.range.lower});
if (a.length > 0) {
var s = a.pop();
this._labels.push({label:s, value:this.range.upper});
}
if (a.length > 0) {
var range = this.range.upper - this.range.lower;
var step = range / (this.labels.length - 1);
for (var i = 1; i <= a.length; i++) {
this._labels.push({label:a[i - 1], value:this.range.lower + (step * i)});
}
}
}
}
}
}, initialize:function (plotArea, plot, drawAgainst, plane) {
this.destroy();
this.initializeOrigin(drawAgainst, plane);
this.initializeLabels();
var node = this.render(plotArea, plot, drawAgainst, plane);
return node;
}, destroy:function () {
for (var p in this.nodes) {
while (this.nodes[p] && this.nodes[p].childNodes.length > 0) {
this.nodes[p].removeChild(this.nodes[p].childNodes[0]);
}
if (this.nodes[p] && this.nodes[p].parentNode) {
this.nodes[p].parentNode.removeChild(this.nodes[p]);
}
this.nodes[p] = null;
}
}});
dojo.requireIf(dojo.render.svg.capable, "dojo.charting.svg.Axis");
dojo.requireIf(dojo.render.vml.capable, "dojo.charting.vml.Axis");