162 lines
5.6 KiB
JavaScript
162 lines
5.6 KiB
JavaScript
|
if(!dojo._hasResource["dojox.charting.scaler"]){ //_hasResource checks added by build. Do not use _hasResource directly in your code.
|
||
|
dojo._hasResource["dojox.charting.scaler"] = true;
|
||
|
dojo.provide("dojox.charting.scaler");
|
||
|
|
||
|
(function(){
|
||
|
var deltaLimit = 3; // pixels
|
||
|
|
||
|
var isText = function(val, text){
|
||
|
val = val.toLowerCase();
|
||
|
for(var i = 0; i < text.length; ++i){
|
||
|
if(val == text[i]){ return true; }
|
||
|
}
|
||
|
return false;
|
||
|
};
|
||
|
|
||
|
var calcTicks = function(min, max, kwArgs, majorTick, minorTick, microTick, span){
|
||
|
kwArgs = dojo.clone(kwArgs);
|
||
|
if(!majorTick){
|
||
|
if(kwArgs.fixUpper == "major"){ kwArgs.fixUpper = "minor"; }
|
||
|
if(kwArgs.fixLower == "major"){ kwArgs.fixLower = "minor"; }
|
||
|
}
|
||
|
if(!minorTick){
|
||
|
if(kwArgs.fixUpper == "minor"){ kwArgs.fixUpper = "micro"; }
|
||
|
if(kwArgs.fixLower == "minor"){ kwArgs.fixLower = "micro"; }
|
||
|
}
|
||
|
if(!microTick){
|
||
|
if(kwArgs.fixUpper == "micro"){ kwArgs.fixUpper = "none"; }
|
||
|
if(kwArgs.fixLower == "micro"){ kwArgs.fixLower = "none"; }
|
||
|
}
|
||
|
var lowerBound = isText(kwArgs.fixLower, ["major"]) ?
|
||
|
Math.floor(min / majorTick) * majorTick :
|
||
|
isText(kwArgs.fixLower, ["minor"]) ?
|
||
|
Math.floor(min / minorTick) * minorTick :
|
||
|
isText(kwArgs.fixLower, ["micro"]) ?
|
||
|
Math.floor(min / microTick) * unit : min,
|
||
|
upperBound = isText(kwArgs.fixUpper, ["major"]) ?
|
||
|
Math.ceil(max / majorTick) * majorTick :
|
||
|
isText(kwArgs.fixUpper, ["minor"]) ?
|
||
|
Math.ceil(max / minorTick) * minorTick :
|
||
|
isText(kwArgs.fixUpper, ["unit"]) ?
|
||
|
Math.ceil(max / unit) * unit : max,
|
||
|
majorStart = (isText(kwArgs.fixLower, ["major"]) || !majorTick) ?
|
||
|
lowerBound : Math.ceil(lowerBound / majorTick) * majorTick,
|
||
|
minorStart = (isText(kwArgs.fixLower, ["major", "minor"]) || !minorTick) ?
|
||
|
lowerBound : Math.ceil(lowerBound / minorTick) * minorTick,
|
||
|
microStart = (isText(kwArgs.fixLower, ["major", "minor", "micro"]) || ! microTick) ?
|
||
|
lowerBound : Math.ceil(lowerBound / microTick) * microTick,
|
||
|
majorCount = !majorTick ? 0 : (isText(kwArgs.fixUpper, ["major"]) ?
|
||
|
Math.round((upperBound - majorStart) / majorTick) :
|
||
|
Math.floor((upperBound - majorStart) / majorTick)) + 1,
|
||
|
minorCount = !minorTick ? 0 : (isText(kwArgs.fixUpper, ["major", "minor"]) ?
|
||
|
Math.round((upperBound - minorStart) / minorTick) :
|
||
|
Math.floor((upperBound - minorStart) / minorTick)) + 1,
|
||
|
microCount = !microTick ? 0 : (isText(kwArgs.fixUpper, ["major", "minor", "micro"]) ?
|
||
|
Math.round((upperBound - microStart) / microTick) :
|
||
|
Math.floor((upperBound - microStart) / microTick)) + 1,
|
||
|
minorPerMajor = minorTick ? Math.round(majorTick / minorTick) : 0,
|
||
|
microPerMinor = microTick ? Math.round(minorTick / microTick) : 0,
|
||
|
majorPrecision = majorTick ? Math.floor(Math.log(majorTick) / Math.LN10) : 0,
|
||
|
minorPrecision = minorTick ? Math.floor(Math.log(minorTick) / Math.LN10) : 0,
|
||
|
scale = span / (upperBound - lowerBound);
|
||
|
if(!isFinite(scale)){ scale = 1; }
|
||
|
return {
|
||
|
bounds: {
|
||
|
lower: lowerBound,
|
||
|
upper: upperBound
|
||
|
},
|
||
|
major: {
|
||
|
tick: majorTick,
|
||
|
start: majorStart,
|
||
|
count: majorCount,
|
||
|
prec: majorPrecision
|
||
|
},
|
||
|
minor: {
|
||
|
tick: minorTick,
|
||
|
start: minorStart,
|
||
|
count: minorCount,
|
||
|
prec: minorPrecision
|
||
|
},
|
||
|
micro: {
|
||
|
tick: microTick,
|
||
|
start: microStart,
|
||
|
count: microCount,
|
||
|
prec: 0
|
||
|
},
|
||
|
minorPerMajor: minorPerMajor,
|
||
|
microPerMinor: microPerMinor,
|
||
|
scale: scale
|
||
|
};
|
||
|
};
|
||
|
|
||
|
dojox.charting.scaler = function(min, max, span, kwArgs){
|
||
|
var h = {fixUpper: "none", fixLower: "none", natural: false};
|
||
|
if(kwArgs){
|
||
|
if("fixUpper" in kwArgs){ h.fixUpper = String(kwArgs.fixUpper); }
|
||
|
if("fixLower" in kwArgs){ h.fixLower = String(kwArgs.fixLower); }
|
||
|
if("natural" in kwArgs){ h.natural = Boolean(kwArgs.natural); }
|
||
|
}
|
||
|
|
||
|
if(max <= min){
|
||
|
return calcTicks(min, max, h, 0, 0, 0, span); // Object
|
||
|
}
|
||
|
|
||
|
var mag = Math.floor(Math.log(max - min) / Math.LN10),
|
||
|
major = kwArgs && ("majorTick" in kwArgs) ? kwArgs.majorTick : Math.pow(10, mag),
|
||
|
minor = 0, micro = 0, ticks;
|
||
|
|
||
|
// calculate minor ticks
|
||
|
if(kwArgs && ("minorTick" in kwArgs)){
|
||
|
minor = kwArgs.minorTick;
|
||
|
}else{
|
||
|
do{
|
||
|
minor = major / 10;
|
||
|
if(!h.natural || minor > 0.9){
|
||
|
ticks = calcTicks(min, max, h, major, minor, 0, span);
|
||
|
if(ticks.scale * ticks.minor.tick > deltaLimit){ break; }
|
||
|
}
|
||
|
minor = major / 5;
|
||
|
if(!h.natural || minor > 0.9){
|
||
|
ticks = calcTicks(min, max, h, major, minor, 0, span);
|
||
|
if(ticks.scale * ticks.minor.tick > deltaLimit){ break; }
|
||
|
}
|
||
|
minor = major / 2;
|
||
|
if(!h.natural || minor > 0.9){
|
||
|
ticks = calcTicks(min, max, h, major, minor, 0, span);
|
||
|
if(ticks.scale * ticks.minor.tick > deltaLimit){ break; }
|
||
|
}
|
||
|
return calcTicks(min, max, h, major, 0, 0, span); // Object
|
||
|
}while(false);
|
||
|
}
|
||
|
|
||
|
// calculate micro ticks
|
||
|
if(kwArgs && ("microTick" in kwArgs)){
|
||
|
micro = kwArgs.microTick;
|
||
|
ticks = calcTicks(min, max, h, major, minor, micro, span);
|
||
|
}else{
|
||
|
do{
|
||
|
micro = minor / 10;
|
||
|
if(!h.natural || micro > 0.9){
|
||
|
ticks = calcTicks(min, max, h, major, minor, micro, span);
|
||
|
if(ticks.scale * ticks.micro.tick > deltaLimit){ break; }
|
||
|
}
|
||
|
micro = minor / 5;
|
||
|
if(!h.natural || micro > 0.9){
|
||
|
ticks = calcTicks(min, max, h, major, minor, micro, span);
|
||
|
if(ticks.scale * ticks.micro.tick > deltaLimit){ break; }
|
||
|
}
|
||
|
micro = minor / 2;
|
||
|
if(!h.natural || micro > 0.9){
|
||
|
ticks = calcTicks(min, max, h, major, minor, micro, span);
|
||
|
if(ticks.scale * ticks.micro.tick > deltaLimit){ break; }
|
||
|
}
|
||
|
micro = 0;
|
||
|
}while(false);
|
||
|
}
|
||
|
|
||
|
return micro ? ticks : calcTicks(min, max, h, major, minor, 0, span); // Object
|
||
|
};
|
||
|
})();
|
||
|
|
||
|
}
|