2150 |
mathias |
1 |
if(!dojo._hasResource["dojox.charting.scaler"]){ //_hasResource checks added by build. Do not use _hasResource directly in your code.
|
|
|
2 |
dojo._hasResource["dojox.charting.scaler"] = true;
|
|
|
3 |
dojo.provide("dojox.charting.scaler");
|
|
|
4 |
|
|
|
5 |
(function(){
|
|
|
6 |
var deltaLimit = 3; // pixels
|
|
|
7 |
|
|
|
8 |
var isText = function(val, text){
|
|
|
9 |
val = val.toLowerCase();
|
|
|
10 |
for(var i = 0; i < text.length; ++i){
|
|
|
11 |
if(val == text[i]){ return true; }
|
|
|
12 |
}
|
|
|
13 |
return false;
|
|
|
14 |
};
|
|
|
15 |
|
|
|
16 |
var calcTicks = function(min, max, kwArgs, majorTick, minorTick, microTick, span){
|
|
|
17 |
kwArgs = dojo.clone(kwArgs);
|
|
|
18 |
if(!majorTick){
|
|
|
19 |
if(kwArgs.fixUpper == "major"){ kwArgs.fixUpper = "minor"; }
|
|
|
20 |
if(kwArgs.fixLower == "major"){ kwArgs.fixLower = "minor"; }
|
|
|
21 |
}
|
|
|
22 |
if(!minorTick){
|
|
|
23 |
if(kwArgs.fixUpper == "minor"){ kwArgs.fixUpper = "micro"; }
|
|
|
24 |
if(kwArgs.fixLower == "minor"){ kwArgs.fixLower = "micro"; }
|
|
|
25 |
}
|
|
|
26 |
if(!microTick){
|
|
|
27 |
if(kwArgs.fixUpper == "micro"){ kwArgs.fixUpper = "none"; }
|
|
|
28 |
if(kwArgs.fixLower == "micro"){ kwArgs.fixLower = "none"; }
|
|
|
29 |
}
|
|
|
30 |
var lowerBound = isText(kwArgs.fixLower, ["major"]) ?
|
|
|
31 |
Math.floor(min / majorTick) * majorTick :
|
|
|
32 |
isText(kwArgs.fixLower, ["minor"]) ?
|
|
|
33 |
Math.floor(min / minorTick) * minorTick :
|
|
|
34 |
isText(kwArgs.fixLower, ["micro"]) ?
|
|
|
35 |
Math.floor(min / microTick) * unit : min,
|
|
|
36 |
upperBound = isText(kwArgs.fixUpper, ["major"]) ?
|
|
|
37 |
Math.ceil(max / majorTick) * majorTick :
|
|
|
38 |
isText(kwArgs.fixUpper, ["minor"]) ?
|
|
|
39 |
Math.ceil(max / minorTick) * minorTick :
|
|
|
40 |
isText(kwArgs.fixUpper, ["unit"]) ?
|
|
|
41 |
Math.ceil(max / unit) * unit : max,
|
|
|
42 |
majorStart = (isText(kwArgs.fixLower, ["major"]) || !majorTick) ?
|
|
|
43 |
lowerBound : Math.ceil(lowerBound / majorTick) * majorTick,
|
|
|
44 |
minorStart = (isText(kwArgs.fixLower, ["major", "minor"]) || !minorTick) ?
|
|
|
45 |
lowerBound : Math.ceil(lowerBound / minorTick) * minorTick,
|
|
|
46 |
microStart = (isText(kwArgs.fixLower, ["major", "minor", "micro"]) || ! microTick) ?
|
|
|
47 |
lowerBound : Math.ceil(lowerBound / microTick) * microTick,
|
|
|
48 |
majorCount = !majorTick ? 0 : (isText(kwArgs.fixUpper, ["major"]) ?
|
|
|
49 |
Math.round((upperBound - majorStart) / majorTick) :
|
|
|
50 |
Math.floor((upperBound - majorStart) / majorTick)) + 1,
|
|
|
51 |
minorCount = !minorTick ? 0 : (isText(kwArgs.fixUpper, ["major", "minor"]) ?
|
|
|
52 |
Math.round((upperBound - minorStart) / minorTick) :
|
|
|
53 |
Math.floor((upperBound - minorStart) / minorTick)) + 1,
|
|
|
54 |
microCount = !microTick ? 0 : (isText(kwArgs.fixUpper, ["major", "minor", "micro"]) ?
|
|
|
55 |
Math.round((upperBound - microStart) / microTick) :
|
|
|
56 |
Math.floor((upperBound - microStart) / microTick)) + 1,
|
|
|
57 |
minorPerMajor = minorTick ? Math.round(majorTick / minorTick) : 0,
|
|
|
58 |
microPerMinor = microTick ? Math.round(minorTick / microTick) : 0,
|
|
|
59 |
majorPrecision = majorTick ? Math.floor(Math.log(majorTick) / Math.LN10) : 0,
|
|
|
60 |
minorPrecision = minorTick ? Math.floor(Math.log(minorTick) / Math.LN10) : 0,
|
|
|
61 |
scale = span / (upperBound - lowerBound);
|
|
|
62 |
if(!isFinite(scale)){ scale = 1; }
|
|
|
63 |
return {
|
|
|
64 |
bounds: {
|
|
|
65 |
lower: lowerBound,
|
|
|
66 |
upper: upperBound
|
|
|
67 |
},
|
|
|
68 |
major: {
|
|
|
69 |
tick: majorTick,
|
|
|
70 |
start: majorStart,
|
|
|
71 |
count: majorCount,
|
|
|
72 |
prec: majorPrecision
|
|
|
73 |
},
|
|
|
74 |
minor: {
|
|
|
75 |
tick: minorTick,
|
|
|
76 |
start: minorStart,
|
|
|
77 |
count: minorCount,
|
|
|
78 |
prec: minorPrecision
|
|
|
79 |
},
|
|
|
80 |
micro: {
|
|
|
81 |
tick: microTick,
|
|
|
82 |
start: microStart,
|
|
|
83 |
count: microCount,
|
|
|
84 |
prec: 0
|
|
|
85 |
},
|
|
|
86 |
minorPerMajor: minorPerMajor,
|
|
|
87 |
microPerMinor: microPerMinor,
|
|
|
88 |
scale: scale
|
|
|
89 |
};
|
|
|
90 |
};
|
|
|
91 |
|
|
|
92 |
dojox.charting.scaler = function(min, max, span, kwArgs){
|
|
|
93 |
var h = {fixUpper: "none", fixLower: "none", natural: false};
|
|
|
94 |
if(kwArgs){
|
|
|
95 |
if("fixUpper" in kwArgs){ h.fixUpper = String(kwArgs.fixUpper); }
|
|
|
96 |
if("fixLower" in kwArgs){ h.fixLower = String(kwArgs.fixLower); }
|
|
|
97 |
if("natural" in kwArgs){ h.natural = Boolean(kwArgs.natural); }
|
|
|
98 |
}
|
|
|
99 |
|
|
|
100 |
if(max <= min){
|
|
|
101 |
return calcTicks(min, max, h, 0, 0, 0, span); // Object
|
|
|
102 |
}
|
|
|
103 |
|
|
|
104 |
var mag = Math.floor(Math.log(max - min) / Math.LN10),
|
|
|
105 |
major = kwArgs && ("majorTick" in kwArgs) ? kwArgs.majorTick : Math.pow(10, mag),
|
|
|
106 |
minor = 0, micro = 0, ticks;
|
|
|
107 |
|
|
|
108 |
// calculate minor ticks
|
|
|
109 |
if(kwArgs && ("minorTick" in kwArgs)){
|
|
|
110 |
minor = kwArgs.minorTick;
|
|
|
111 |
}else{
|
|
|
112 |
do{
|
|
|
113 |
minor = major / 10;
|
|
|
114 |
if(!h.natural || minor > 0.9){
|
|
|
115 |
ticks = calcTicks(min, max, h, major, minor, 0, span);
|
|
|
116 |
if(ticks.scale * ticks.minor.tick > deltaLimit){ break; }
|
|
|
117 |
}
|
|
|
118 |
minor = major / 5;
|
|
|
119 |
if(!h.natural || minor > 0.9){
|
|
|
120 |
ticks = calcTicks(min, max, h, major, minor, 0, span);
|
|
|
121 |
if(ticks.scale * ticks.minor.tick > deltaLimit){ break; }
|
|
|
122 |
}
|
|
|
123 |
minor = major / 2;
|
|
|
124 |
if(!h.natural || minor > 0.9){
|
|
|
125 |
ticks = calcTicks(min, max, h, major, minor, 0, span);
|
|
|
126 |
if(ticks.scale * ticks.minor.tick > deltaLimit){ break; }
|
|
|
127 |
}
|
|
|
128 |
return calcTicks(min, max, h, major, 0, 0, span); // Object
|
|
|
129 |
}while(false);
|
|
|
130 |
}
|
|
|
131 |
|
|
|
132 |
// calculate micro ticks
|
|
|
133 |
if(kwArgs && ("microTick" in kwArgs)){
|
|
|
134 |
micro = kwArgs.microTick;
|
|
|
135 |
ticks = calcTicks(min, max, h, major, minor, micro, span);
|
|
|
136 |
}else{
|
|
|
137 |
do{
|
|
|
138 |
micro = minor / 10;
|
|
|
139 |
if(!h.natural || micro > 0.9){
|
|
|
140 |
ticks = calcTicks(min, max, h, major, minor, micro, span);
|
|
|
141 |
if(ticks.scale * ticks.micro.tick > deltaLimit){ break; }
|
|
|
142 |
}
|
|
|
143 |
micro = minor / 5;
|
|
|
144 |
if(!h.natural || micro > 0.9){
|
|
|
145 |
ticks = calcTicks(min, max, h, major, minor, micro, span);
|
|
|
146 |
if(ticks.scale * ticks.micro.tick > deltaLimit){ break; }
|
|
|
147 |
}
|
|
|
148 |
micro = minor / 2;
|
|
|
149 |
if(!h.natural || micro > 0.9){
|
|
|
150 |
ticks = calcTicks(min, max, h, major, minor, micro, span);
|
|
|
151 |
if(ticks.scale * ticks.micro.tick > deltaLimit){ break; }
|
|
|
152 |
}
|
|
|
153 |
micro = 0;
|
|
|
154 |
}while(false);
|
|
|
155 |
}
|
|
|
156 |
|
|
|
157 |
return micro ? ticks : calcTicks(min, max, h, major, minor, 0, span); // Object
|
|
|
158 |
};
|
|
|
159 |
})();
|
|
|
160 |
|
|
|
161 |
}
|