New file |
0,0 → 1,161 |
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 |
}; |
})(); |
|
} |