common.js 2.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475
  1. define("dojox/charting/scaler/common", ["dojo/_base/lang"], function(lang){
  2. var eq = function(/*Number*/ a, /*Number*/ b){
  3. // summary: compare two FP numbers for equality
  4. return Math.abs(a - b) <= 1e-6 * (Math.abs(a) + Math.abs(b)); // Boolean
  5. };
  6. var common = lang.getObject("dojox.charting.scaler.common", true);
  7. var testedModules = {};
  8. return lang.mixin(common, {
  9. doIfLoaded: function(moduleName, ifloaded, ifnotloaded){
  10. if(testedModules[moduleName] == undefined){
  11. try{
  12. testedModules[moduleName] = require(moduleName);
  13. }catch(e){
  14. testedModules[moduleName] = null;
  15. }
  16. }
  17. if(testedModules[moduleName]){
  18. return ifloaded(testedModules[moduleName]);
  19. }else{
  20. return ifnotloaded();
  21. }
  22. },
  23. findString: function(/*String*/ val, /*Array*/ text){
  24. val = val.toLowerCase();
  25. for(var i = 0; i < text.length; ++i){
  26. if(val == text[i]){ return true; }
  27. }
  28. return false;
  29. },
  30. getNumericLabel: function(/*Number*/ number, /*Number*/ precision, /*Object*/ kwArgs){
  31. var def = "";
  32. common.doIfLoaded("dojo/number", function(numberLib){
  33. def = (kwArgs.fixed ? numberLib.format(number, {places : precision < 0 ? -precision : 0}) :
  34. numberLib.format(number)) || "";
  35. }, function(){
  36. def = kwArgs.fixed ? number.toFixed(precision < 0 ? -precision : 0) : number.toString();
  37. });
  38. if(kwArgs.labelFunc){
  39. var r = kwArgs.labelFunc(def, number, precision);
  40. if(r){ return r; }
  41. // else fall through to the regular labels search
  42. }
  43. if(kwArgs.labels){
  44. // classic binary search
  45. var l = kwArgs.labels, lo = 0, hi = l.length;
  46. while(lo < hi){
  47. var mid = Math.floor((lo + hi) / 2), val = l[mid].value;
  48. if(val < number){
  49. lo = mid + 1;
  50. }else{
  51. hi = mid;
  52. }
  53. }
  54. // lets take into account FP errors
  55. if(lo < l.length && eq(l[lo].value, number)){
  56. return l[lo].text;
  57. }
  58. --lo;
  59. if(lo >= 0 && lo < l.length && eq(l[lo].value, number)){
  60. return l[lo].text;
  61. }
  62. lo += 2;
  63. if(lo < l.length && eq(l[lo].value, number)){
  64. return l[lo].text;
  65. }
  66. // otherwise we will produce a number
  67. }
  68. return def;
  69. }
  70. });
  71. });