summaryrefslogtreecommitdiff
path: root/js/dojo/dojox/charting/scaler/common.js
diff options
context:
space:
mode:
Diffstat (limited to 'js/dojo/dojox/charting/scaler/common.js')
-rw-r--r--js/dojo/dojox/charting/scaler/common.js76
1 files changed, 76 insertions, 0 deletions
diff --git a/js/dojo/dojox/charting/scaler/common.js b/js/dojo/dojox/charting/scaler/common.js
new file mode 100644
index 0000000..9bc62bd
--- /dev/null
+++ b/js/dojo/dojox/charting/scaler/common.js
@@ -0,0 +1,76 @@
+//>>built
+define("dojox/charting/scaler/common", ["dojo/_base/lang"], function(lang){
+
+ var eq = function(/*Number*/ a, /*Number*/ b){
+ // summary: compare two FP numbers for equality
+ return Math.abs(a - b) <= 1e-6 * (Math.abs(a) + Math.abs(b)); // Boolean
+ };
+
+ var common = lang.getObject("dojox.charting.scaler.common", true);
+
+ var testedModules = {};
+
+ return lang.mixin(common, {
+ doIfLoaded: function(moduleName, ifloaded, ifnotloaded){
+ if(testedModules[moduleName] == undefined){
+ try{
+ testedModules[moduleName] = require(moduleName);
+ }catch(e){
+ testedModules[moduleName] = null;
+ }
+ }
+ if(testedModules[moduleName]){
+ return ifloaded(testedModules[moduleName]);
+ }else{
+ return ifnotloaded();
+ }
+ },
+ findString: function(/*String*/ val, /*Array*/ text){
+ val = val.toLowerCase();
+ for(var i = 0; i < text.length; ++i){
+ if(val == text[i]){ return true; }
+ }
+ return false;
+ },
+ getNumericLabel: function(/*Number*/ number, /*Number*/ precision, /*Object*/ kwArgs){
+ var def = "";
+ common.doIfLoaded("dojo/number", function(numberLib){
+ def = (kwArgs.fixed ? numberLib.format(number, {places : precision < 0 ? -precision : 0}) :
+ numberLib.format(number)) || "";
+ }, function(){
+ def = kwArgs.fixed ? number.toFixed(precision < 0 ? -precision : 0) : number.toString();
+ });
+ if(kwArgs.labelFunc){
+ var r = kwArgs.labelFunc(def, number, precision);
+ if(r){ return r; }
+ // else fall through to the regular labels search
+ }
+ if(kwArgs.labels){
+ // classic binary search
+ var l = kwArgs.labels, lo = 0, hi = l.length;
+ while(lo < hi){
+ var mid = Math.floor((lo + hi) / 2), val = l[mid].value;
+ if(val < number){
+ lo = mid + 1;
+ }else{
+ hi = mid;
+ }
+ }
+ // lets take into account FP errors
+ if(lo < l.length && eq(l[lo].value, number)){
+ return l[lo].text;
+ }
+ --lo;
+ if(lo >= 0 && lo < l.length && eq(l[lo].value, number)){
+ return l[lo].text;
+ }
+ lo += 2;
+ if(lo < l.length && eq(l[lo].value, number)){
+ return l[lo].text;
+ }
+ // otherwise we will produce a number
+ }
+ return def;
+ }
+ });
+});