{"version":3,"sources":["jsdelivr-header.js","/npm/just-gauge@0.0.1/justgage.js"],"names":[],"mappings":"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","file":"/npm/just-gauge@0.0.1/justgage.js","sourceRoot":"","sourcesContent":["/**\n * Minified by jsDelivr using Terser v5.37.0.\n * Original file: /npm/just-gauge@0.0.1/justgage.js\n *\n * Do NOT use SRI with dynamically generated files! More information: https://www.jsdelivr.com/using-sri-with-dynamic-files\n */\n","/**\n * JustGage - animated gauges using RaphaelJS\n * Check http://www.justgage.com for official releases\n * Licensed under MIT.\n * @author Bojan Djuricic (@Toorshia)\n **/\n\nvar Raphael = require('raphael');\nvar eve = require('eve');\n\nJustGage = function(config) {\n\n  var obj = this;\n\n  // Helps in case developer wants to debug it. unobtrusive\n  if (config === null || config === undefined) {\n    console.log('* justgage: Make sure to pass options to the constructor!');\n    return false;\n  }\n\n  var node;\n\n  if (config.id !== null && config.id !== undefined) {\n    node = document.getElementById(config.id);\n    if (!node) {\n      console.log('* justgage: No element with id : %s found', config.id);\n      return false;\n    }\n  } else if (config.parentNode !== null && config.parentNode !== undefined) {\n    node = config.parentNode;\n  } else {\n    console.log('* justgage: Make sure to pass the existing element id or parentNode to the constructor.');\n    return false;\n  }\n\n  var dataset = node.dataset ? node.dataset : {};\n\n  // check for defaults\n  var defaults = (config.defaults !== null && config.defaults !== undefined) ? config.defaults : false;\n  if (defaults !== false) {\n    config = extend({}, config, defaults);\n    delete config.defaults;\n  }\n\n  // configurable parameters\n  obj.config = {\n    // id : string\n    // this is container element id\n    id: config.id,\n\n    // value : float\n    // value gauge is showing\n    value: kvLookup('value', config, dataset, 0, 'float'),\n\n    // defaults : bool\n    // defaults parameter to use\n    defaults: kvLookup('defaults', config, dataset, 0, false),\n\n    // parentNode : node object\n    // this is container element\n    parentNode: kvLookup('parentNode', config, dataset, null),\n\n    // width : int\n    // gauge width\n    width: kvLookup('width', config, dataset, null),\n\n    // height : int\n    // gauge height\n    height: kvLookup('height', config, dataset, null),\n\n    // title : string\n    // gauge title\n    title: kvLookup('title', config, dataset, \"\"),\n\n    // titleFontColor : string\n    // color of gauge title\n    titleFontColor: kvLookup('titleFontColor', config, dataset, \"#999999\"),\n\n    // titleFontFamily : string\n    // color of gauge title\n    titleFontFamily: kvLookup('titleFontFamily', config, dataset, \"sans-serif\"),\n\n    // titlePosition : string\n    // 'above' or 'below'\n    titlePosition: kvLookup('titlePosition', config, dataset, \"above\"),\n\n    // valueFontColor : string\n    // color of label showing current value\n    valueFontColor: kvLookup('valueFontColor', config, dataset, \"#010101\"),\n\n    // valueFontFamily : string\n    // color of label showing current value\n    valueFontFamily: kvLookup('valueFontFamily', config, dataset, \"Arial\"),\n\n    // symbol : string\n    // special symbol to show next to value\n    symbol: kvLookup('symbol', config, dataset, ''),\n\n    // min : float\n    // min value\n    min: kvLookup('min', config, dataset, 0, 'float'),\n\n    // minTxt : string\n    // min value text\n    minTxt: kvLookup('minTxt', config, dataset, false),\n\n    // max : float\n    // max value\n    max: kvLookup('max', config, dataset, 100, 'float'),\n\n    // maxTxt : string\n    // max value text\n    maxTxt: kvLookup('maxTxt', config, dataset, false),\n\n    // reverse : bool\n    // reverse min and max\n    reverse: kvLookup('reverse', config, dataset, false),\n\n    // humanFriendlyDecimal : int\n    // number of decimal places for our human friendly number to contain\n    humanFriendlyDecimal: kvLookup('humanFriendlyDecimal', config, dataset, 0),\n\n\n    // textRenderer: func\n    // function applied before rendering text\n    textRenderer: kvLookup('textRenderer', config, dataset, null),\n\n    // onAnimationEnd: func\n    // function applied after animation is done\n    onAnimationEnd: kvLookup('onAnimationEnd', config, dataset, null),\n\n    // gaugeWidthScale : float\n    // width of the gauge element\n    gaugeWidthScale: kvLookup('gaugeWidthScale', config, dataset, 1.0),\n\n    // gaugeColor : string\n    // background color of gauge element\n    gaugeColor: kvLookup('gaugeColor', config, dataset, \"#edebeb\"),\n\n    // label : string\n    // text to show below value\n    label: kvLookup('label', config, dataset, ''),\n\n    // labelFontColor : string\n    // color of label showing label under value\n    labelFontColor: kvLookup('labelFontColor', config, dataset, \"#b3b3b3\"),\n\n    // shadowOpacity : int\n    // 0 ~ 1\n    shadowOpacity: kvLookup('shadowOpacity', config, dataset, 0.2),\n\n    // shadowSize: int\n    // inner shadow size\n    shadowSize: kvLookup('shadowSize', config, dataset, 5),\n\n    // shadowVerticalOffset : int\n    // how much shadow is offset from top\n    shadowVerticalOffset: kvLookup('shadowVerticalOffset', config, dataset, 3),\n\n    // levelColors : string[]\n    // colors of indicator, from lower to upper, in RGB format\n    levelColors: kvLookup('levelColors', config, dataset, [\"#a9d70b\", \"#f9c802\", \"#ff0000\"], 'array', ','),\n\n    // startAnimationTime : int\n    // length of initial animation\n    startAnimationTime: kvLookup('startAnimationTime', config, dataset, 700),\n\n    // startAnimationType : string\n    // type of initial animation (linear, >, <,  <>, bounce)\n    startAnimationType: kvLookup('startAnimationType', config, dataset, '>'),\n\n    // refreshAnimationTime : int\n    // length of refresh animation\n    refreshAnimationTime: kvLookup('refreshAnimationTime', config, dataset, 700),\n\n    // refreshAnimationType : string\n    // type of refresh animation (linear, >, <,  <>, bounce)\n    refreshAnimationType: kvLookup('refreshAnimationType', config, dataset, '>'),\n\n    // donutStartAngle : int\n    // angle to start from when in donut mode\n    donutStartAngle: kvLookup('donutStartAngle', config, dataset, 90),\n\n    // valueMinFontSize : int\n    // absolute minimum font size for the value\n    valueMinFontSize: kvLookup('valueMinFontSize', config, dataset, 16),\n\n    // titleMinFontSize\n    // absolute minimum font size for the title\n    titleMinFontSize: kvLookup('titleMinFontSize', config, dataset, 10),\n\n    // labelMinFontSize\n    // absolute minimum font size for the label\n    labelMinFontSize: kvLookup('labelMinFontSize', config, dataset, 10),\n\n    // minLabelMinFontSize\n    // absolute minimum font size for the minimum label\n    minLabelMinFontSize: kvLookup('minLabelMinFontSize', config, dataset, 10),\n\n    // maxLabelMinFontSize\n    // absolute minimum font size for the maximum label\n    maxLabelMinFontSize: kvLookup('maxLabelMinFontSize', config, dataset, 10),\n\n    // hideValue : bool\n    // hide value text\n    hideValue: kvLookup('hideValue', config, dataset, false),\n\n    // hideMinMax : bool\n    // hide min and max values\n    hideMinMax: kvLookup('hideMinMax', config, dataset, false),\n\n    // hideInnerShadow : bool\n    // hide inner shadow\n    hideInnerShadow: kvLookup('hideInnerShadow', config, dataset, false),\n\n    // humanFriendly : bool\n    // convert large numbers for min, max, value to human friendly (e.g. 1234567 -> 1.23M)\n    humanFriendly: kvLookup('humanFriendly', config, dataset, false),\n\n    // noGradient : bool\n    // whether to use gradual color change for value, or sector-based\n    noGradient: kvLookup('noGradient', config, dataset, false),\n\n    // donut : bool\n    // show full donut gauge\n    donut: kvLookup('donut', config, dataset, false),\n\n    // relativeGaugeSize : bool\n    // whether gauge size should follow changes in container element size\n    relativeGaugeSize: kvLookup('relativeGaugeSize', config, dataset, false),\n\n    // counter : bool\n    // animate level number change\n    counter: kvLookup('counter', config, dataset, false),\n\n    // decimals : int\n    // number of digits after floating point\n    decimals: kvLookup('decimals', config, dataset, 0),\n\n    // customSectors : [] of objects\n    // number of digits after floating point\n    customSectors: kvLookup('customSectors', config, dataset, []),\n\n    // formatNumber: boolean\n    // formats numbers with commas where appropriate\n    formatNumber: kvLookup('formatNumber', config, dataset, false),\n\n    // pointer : bool\n    // show value pointer\n    pointer: kvLookup('pointer', config, dataset, false),\n\n    // pointerOptions : object\n    // define pointer look\n    pointerOptions: kvLookup('pointerOptions', config, dataset, [])\n  };\n\n  // variables\n  var\n    canvasW,\n    canvasH,\n    widgetW,\n    widgetH,\n    aspect,\n    dx,\n    dy,\n    titleFontSize,\n    titleX,\n    titleY,\n    valueFontSize,\n    valueX,\n    valueY,\n    labelFontSize,\n    labelX,\n    labelY,\n    minFontSize,\n    minX,\n    minY,\n    maxFontSize,\n    maxX,\n    maxY;\n\n  // overflow values\n  if (obj.config.value > obj.config.max) obj.config.value = obj.config.max;\n  if (obj.config.value < obj.config.min) obj.config.value = obj.config.min;\n  obj.originalValue = kvLookup('value', config, dataset, -1, 'float');\n\n  // create canvas\n  if (obj.config.id !== null && (document.getElementById(obj.config.id)) !== null) {\n    obj.canvas = Raphael(obj.config.id, \"100%\", \"100%\");\n  } else if (obj.config.parentNode !== null) {\n    obj.canvas = Raphael(obj.config.parentNode, \"100%\", \"100%\");\n  }\n\n  if (obj.config.relativeGaugeSize === true) {\n    obj.canvas.setViewBox(0, 0, 200, 150, true);\n  }\n\n  // canvas dimensions\n  if (obj.config.relativeGaugeSize === true) {\n    canvasW = 200;\n    canvasH = 150;\n  } else if (obj.config.width !== null && obj.config.height !== null) {\n    canvasW = obj.config.width;\n    canvasH = obj.config.height;\n  } else if (obj.config.parentNode !== null) {\n    obj.canvas.setViewBox(0, 0, 200, 150, true);\n    canvasW = 200;\n    canvasH = 150;\n  } else {\n    canvasW = getStyle(document.getElementById(obj.config.id), \"width\").slice(0, -2) * 1;\n    canvasH = getStyle(document.getElementById(obj.config.id), \"height\").slice(0, -2) * 1;\n  }\n\n  // widget dimensions\n  if (obj.config.donut === true) {\n\n    // DONUT *******************************\n\n    // width more than height\n    if (canvasW > canvasH) {\n      widgetH = canvasH;\n      widgetW = widgetH;\n      // width less than height\n    } else if (canvasW < canvasH) {\n      widgetW = canvasW;\n      widgetH = widgetW;\n      // if height don't fit, rescale both\n      if (widgetH > canvasH) {\n        aspect = widgetH / canvasH;\n        widgetH = widgetH / aspect;\n        widgetW = widgetH / aspect;\n      }\n      // equal\n    } else {\n      widgetW = canvasW;\n      widgetH = widgetW;\n    }\n\n    // delta\n    dx = (canvasW - widgetW) / 2;\n    dy = (canvasH - widgetH) / 2;\n\n    // title\n    titleFontSize = ((widgetH / 8) > 10) ? (widgetH / 10) : 10;\n    titleX = dx + widgetW / 2;\n    titleY = dy + widgetH / 11;\n\n    // value\n    valueFontSize = ((widgetH / 6.4) > 16) ? (widgetH / 5.4) : 18;\n    valueX = dx + widgetW / 2;\n    if (obj.config.label !== '') {\n      valueY = dy + widgetH / 1.85;\n    } else {\n      valueY = dy + widgetH / 1.7;\n    }\n\n    // label\n    labelFontSize = ((widgetH / 16) > 10) ? (widgetH / 16) : 10;\n    labelX = dx + widgetW / 2;\n    labelY = valueY + labelFontSize;\n\n    // min\n    minFontSize = ((widgetH / 16) > 10) ? (widgetH / 16) : 10;\n    minX = dx + (widgetW / 10) + (widgetW / 6.666666666666667 * obj.config.gaugeWidthScale) / 2;\n    minY = labelY;\n\n    // max\n    maxFontSize = ((widgetH / 16) > 10) ? (widgetH / 16) : 10;\n    maxX = dx + widgetW - (widgetW / 10) - (widgetW / 6.666666666666667 * obj.config.gaugeWidthScale) / 2;\n    maxY = labelY;\n\n  } else {\n    // HALF *******************************\n\n    // width more than height\n    if (canvasW > canvasH) {\n      widgetH = canvasH;\n      widgetW = widgetH * 1.25;\n      //if width doesn't fit, rescale both\n      if (widgetW > canvasW) {\n        aspect = widgetW / canvasW;\n        widgetW = widgetW / aspect;\n        widgetH = widgetH / aspect;\n      }\n      // width less than height\n    } else if (canvasW < canvasH) {\n      widgetW = canvasW;\n      widgetH = widgetW / 1.25;\n      // if height don't fit, rescale both\n      if (widgetH > canvasH) {\n        aspect = widgetH / canvasH;\n        widgetH = widgetH / aspect;\n        widgetW = widgetH / aspect;\n      }\n      // equal\n    } else {\n      widgetW = canvasW;\n      widgetH = widgetW * 0.75;\n    }\n\n    // delta\n    dx = (canvasW - widgetW) / 2;\n    dy = (canvasH - widgetH) / 2;\n    if (obj.config.titlePosition === 'below') {\n      // shift whole thing down\n      dy -= (widgetH / 6.4);\n    }\n\n    // title\n    titleFontSize = ((widgetH / 8) > obj.config.titleMinFontSize) ? (widgetH / 10) : obj.config.titleMinFontSize;\n    titleX = dx + widgetW / 2;\n    titleY = dy + (obj.config.titlePosition === 'below' ? (widgetH * 1.07) : (widgetH / 6.4));\n\n    // value\n    valueFontSize = ((widgetH / 6.5) > obj.config.valueMinFontSize) ? (widgetH / 6.5) : obj.config.valueMinFontSize;\n    valueX = dx + widgetW / 2;\n    valueY = dy + widgetH / 1.275;\n\n    // label\n    labelFontSize = ((widgetH / 16) > obj.config.labelMinFontSize) ? (widgetH / 16) : obj.config.labelMinFontSize;\n    labelX = dx + widgetW / 2;\n    labelY = valueY + valueFontSize / 2 + 5;\n\n    // min\n    minFontSize = ((widgetH / 16) > obj.config.minLabelMinFontSize) ? (widgetH / 16) : obj.config.minLabelMinFontSize;\n    minX = dx + (widgetW / 10) + (widgetW / 6.666666666666667 * obj.config.gaugeWidthScale) / 2;\n    minY = labelY;\n\n    // max\n    maxFontSize = ((widgetH / 16) > obj.config.maxLabelMinFontSize) ? (widgetH / 16) : obj.config.maxLabelMinFontSize;\n    maxX = dx + widgetW - (widgetW / 10) - (widgetW / 6.666666666666667 * obj.config.gaugeWidthScale) / 2;\n    maxY = labelY;\n  }\n\n  // parameters\n  obj.params = {\n    canvasW: canvasW,\n    canvasH: canvasH,\n    widgetW: widgetW,\n    widgetH: widgetH,\n    dx: dx,\n    dy: dy,\n    titleFontSize: titleFontSize,\n    titleX: titleX,\n    titleY: titleY,\n    valueFontSize: valueFontSize,\n    valueX: valueX,\n    valueY: valueY,\n    labelFontSize: labelFontSize,\n    labelX: labelX,\n    labelY: labelY,\n    minFontSize: minFontSize,\n    minX: minX,\n    minY: minY,\n    maxFontSize: maxFontSize,\n    maxX: maxX,\n    maxY: maxY\n  };\n\n  // var clear\n  canvasW, canvasH, widgetW, widgetH, aspect, dx, dy, titleFontSize, titleX, titleY, valueFontSize, valueX, valueY, labelFontSize, labelX, labelY, minFontSize, minX, minY, maxFontSize, maxX, maxY = null;\n\n  // pki - custom attribute for generating gauge paths\n  obj.canvas.customAttributes.pki = function(value, min, max, w, h, dx, dy, gws, donut, reverse) {\n\n    var alpha, Ro, Ri, Cx, Cy, Xo, Yo, Xi, Yi, path;\n\n    if (donut) {\n      alpha = (1 - 2 * (value - min) / (max - min)) * Math.PI;\n      Ro = w / 2 - w / 7;\n      Ri = Ro - w / 6.666666666666667 * gws;\n\n      Cx = w / 2 + dx;\n      Cy = h / 1.95 + dy;\n\n      Xo = w / 2 + dx + Ro * Math.cos(alpha);\n      Yo = h - (h - Cy) - Ro * Math.sin(alpha);\n      Xi = w / 2 + dx + Ri * Math.cos(alpha);\n      Yi = h - (h - Cy) - Ri * Math.sin(alpha);\n\n      path = \"M\" + (Cx - Ri) + \",\" + Cy + \" \";\n      path += \"L\" + (Cx - Ro) + \",\" + Cy + \" \";\n      if (value > ((max - min) / 2)) {\n        path += \"A\" + Ro + \",\" + Ro + \" 0 0 1 \" + (Cx + Ro) + \",\" + Cy + \" \";\n      }\n      path += \"A\" + Ro + \",\" + Ro + \" 0 0 1 \" + Xo + \",\" + Yo + \" \";\n      path += \"L\" + Xi + \",\" + Yi + \" \";\n      if (value > ((max - min) / 2)) {\n        path += \"A\" + Ri + \",\" + Ri + \" 0 0 0 \" + (Cx + Ri) + \",\" + Cy + \" \";\n      }\n      path += \"A\" + Ri + \",\" + Ri + \" 0 0 0 \" + (Cx - Ri) + \",\" + Cy + \" \";\n      path += \"Z \";\n\n      return {\n        path: path\n      };\n\n    } else {\n      alpha = (1 - (value - min) / (max - min)) * Math.PI;\n      Ro = w / 2 - w / 10;\n      Ri = Ro - w / 6.666666666666667 * gws;\n\n      Cx = w / 2 + dx;\n      Cy = h / 1.25 + dy;\n\n      Xo = w / 2 + dx + Ro * Math.cos(alpha);\n      Yo = h - (h - Cy) - Ro * Math.sin(alpha);\n      Xi = w / 2 + dx + Ri * Math.cos(alpha);\n      Yi = h - (h - Cy) - Ri * Math.sin(alpha);\n\n      path = \"M\" + (Cx - Ri) + \",\" + Cy + \" \";\n      path += \"L\" + (Cx - Ro) + \",\" + Cy + \" \";\n      path += \"A\" + Ro + \",\" + Ro + \" 0 0 1 \" + Xo + \",\" + Yo + \" \";\n      path += \"L\" + Xi + \",\" + Yi + \" \";\n      path += \"A\" + Ri + \",\" + Ri + \" 0 0 0 \" + (Cx - Ri) + \",\" + Cy + \" \";\n      path += \"Z \";\n\n      return {\n        path: path\n      };\n    }\n\n    // var clear\n    alpha, Ro, Ri, Cx, Cy, Xo, Yo, Xi, Yi, path = null;\n  };\n\n  // ndl - custom attribute for generating needle path\n  obj.canvas.customAttributes.ndl = function(value, min, max, w, h, dx, dy, gws, donut) {\n\n    var dlt = w * 3.5 / 100;\n    var dlb = w / 15;\n    var dw = w / 100;\n\n    if (obj.config.pointerOptions.toplength != null && obj.config.pointerOptions.toplength != undefined) dlt = obj.config.pointerOptions.toplength;\n    if (obj.config.pointerOptions.bottomlength != null && obj.config.pointerOptions.bottomlength != undefined) dlb = obj.config.pointerOptions.bottomlength;\n    if (obj.config.pointerOptions.bottomwidth != null && obj.config.pointerOptions.bottomwidth != undefined) dw = obj.config.pointerOptions.bottomwidth;\n\n    var alpha, Ro, Ri, Cx, Cy, Xo, Yo, Xi, Yi, Xc, Yc, Xz, Yz, Xa, Ya, Xb, Yb, path;\n\n    if (donut) {\n\n      alpha = (1 - 2 * (value - min) / (max - min)) * Math.PI;\n      Ro = w / 2 - w / 7;\n      Ri = Ro - w / 6.666666666666667 * gws;\n\n      Cx = w / 2 + dx;\n      Cy = h / 1.95 + dy;\n\n      Xo = w / 2 + dx + Ro * Math.cos(alpha);\n      Yo = h - (h - Cy) - Ro * Math.sin(alpha);\n      Xi = w / 2 + dx + Ri * Math.cos(alpha);\n      Yi = h - (h - Cy) - Ri * Math.sin(alpha);\n\n      Xc = Xo + dlt * Math.cos(alpha);\n      Yc = Yo - dlt * Math.sin(alpha);\n      Xz = Xi - dlb * Math.cos(alpha);\n      Yz = Yi + dlb * Math.sin(alpha);\n\n      Xa = Xz + dw * Math.sin(alpha);\n      Ya = Yz + dw * Math.cos(alpha);\n      Xb = Xz - dw * Math.sin(alpha);\n      Yb = Yz - dw * Math.cos(alpha);\n\n      path = 'M' + Xa + ',' + Ya + ' ';\n      path += 'L' + Xb + ',' + Yb + ' ';\n      path += 'L' + Xc + ',' + Yc + ' ';\n      path += 'Z ';\n\n      return {\n        path: path\n      };\n\n    } else {\n      alpha = (1 - (value - min) / (max - min)) * Math.PI;\n      Ro = w / 2 - w / 10;\n      Ri = Ro - w / 6.666666666666667 * gws;\n\n      Cx = w / 2 + dx;\n      Cy = h / 1.25 + dy;\n\n      Xo = w / 2 + dx + Ro * Math.cos(alpha);\n      Yo = h - (h - Cy) - Ro * Math.sin(alpha);\n      Xi = w / 2 + dx + Ri * Math.cos(alpha);\n      Yi = h - (h - Cy) - Ri * Math.sin(alpha);\n\n      Xc = Xo + dlt * Math.cos(alpha);\n      Yc = Yo - dlt * Math.sin(alpha);\n      Xz = Xi - dlb * Math.cos(alpha);\n      Yz = Yi + dlb * Math.sin(alpha);\n\n      Xa = Xz + dw * Math.sin(alpha);\n      Ya = Yz + dw * Math.cos(alpha);\n      Xb = Xz - dw * Math.sin(alpha);\n      Yb = Yz - dw * Math.cos(alpha);\n\n      path = 'M' + Xa + ',' + Ya + ' ';\n      path += 'L' + Xb + ',' + Yb + ' ';\n      path += 'L' + Xc + ',' + Yc + ' ';\n      path += 'Z ';\n\n      return {\n        path: path\n      };\n    }\n\n    // var clear\n    alpha, Ro, Ri, Cx, Cy, Xo, Yo, Xi, Yi, Xc, Yc, Xz, Yz, Xa, Ya, Xb, Yb, path = null;\n  };\n\n  // gauge\n  obj.gauge = obj.canvas.path().attr({\n    \"stroke\": \"none\",\n    \"fill\": obj.config.gaugeColor,\n    pki: [\n      obj.config.max,\n      obj.config.min,\n      obj.config.max,\n      obj.params.widgetW,\n      obj.params.widgetH,\n      obj.params.dx,\n      obj.params.dy,\n      obj.config.gaugeWidthScale,\n      obj.config.donut,\n      obj.config.reverse\n    ]\n  });\n\n  // level\n  obj.level = obj.canvas.path().attr({\n    \"stroke\": \"none\",\n    \"fill\": getColor(obj.config.value, (obj.config.value - obj.config.min) / (obj.config.max - obj.config.min), obj.config.levelColors, obj.config.noGradient, obj.config.customSectors),\n    pki: [\n      obj.config.min,\n      obj.config.min,\n      obj.config.max,\n      obj.params.widgetW,\n      obj.params.widgetH,\n      obj.params.dx,\n      obj.params.dy,\n      obj.config.gaugeWidthScale,\n      obj.config.donut,\n      obj.config.reverse\n    ]\n  });\n  if (obj.config.donut) {\n    obj.level.transform(\"r\" + obj.config.donutStartAngle + \", \" + (obj.params.widgetW / 2 + obj.params.dx) + \", \" + (obj.params.widgetH / 1.95 + obj.params.dy));\n  }\n\n  if (obj.config.pointer) {\n    // needle\n    obj.needle = obj.canvas.path().attr({\n      \"stroke\": (obj.config.pointerOptions.stroke !== null && obj.config.pointerOptions.stroke !== undefined) ? obj.config.pointerOptions.stroke : \"none\",\n      \"stroke-width\": (obj.config.pointerOptions.stroke_width !== null && obj.config.pointerOptions.stroke_width !== undefined) ? obj.config.pointerOptions.stroke_width : 0,\n      \"stroke-linecap\": (obj.config.pointerOptions.stroke_linecap !== null && obj.config.pointerOptions.stroke_linecap !== undefined) ? obj.config.pointerOptions.stroke_linecap : \"square\",\n      \"fill\": (obj.config.pointerOptions.color !== null && obj.config.pointerOptions.color !== undefined) ? obj.config.pointerOptions.color : \"#000000\",\n      ndl: [\n        obj.config.min,\n        obj.config.min,\n        obj.config.max,\n        obj.params.widgetW,\n        obj.params.widgetH,\n        obj.params.dx,\n        obj.params.dy,\n        obj.config.gaugeWidthScale,\n        obj.config.donut\n      ]\n    });\n\n    if (obj.config.donut) {\n      obj.needle.transform(\"r\" + obj.config.donutStartAngle + \", \" + (obj.params.widgetW / 2 + obj.params.dx) + \", \" + (obj.params.widgetH / 1.95 + obj.params.dy));\n    }\n\n  }\n\n  // title\n  obj.txtTitle = obj.canvas.text(obj.params.titleX, obj.params.titleY, obj.config.title);\n  obj.txtTitle.attr({\n    \"font-size\": obj.params.titleFontSize,\n    \"font-weight\": \"bold\",\n    \"font-family\": obj.config.titleFontFamily,\n    \"fill\": obj.config.titleFontColor,\n    \"fill-opacity\": \"1\"\n  });\n  setDy(obj.txtTitle, obj.params.titleFontSize, obj.params.titleY);\n\n  // value\n  obj.txtValue = obj.canvas.text(obj.params.valueX, obj.params.valueY, 0);\n  obj.txtValue.attr({\n    \"font-size\": obj.params.valueFontSize,\n    \"font-weight\": \"bold\",\n    \"font-family\": obj.config.valueFontFamily,\n    \"fill\": obj.config.valueFontColor,\n    \"fill-opacity\": \"0\"\n  });\n  setDy(obj.txtValue, obj.params.valueFontSize, obj.params.valueY);\n\n  // label\n  obj.txtLabel = obj.canvas.text(obj.params.labelX, obj.params.labelY, obj.config.label);\n  obj.txtLabel.attr({\n    \"font-size\": obj.params.labelFontSize,\n    \"font-weight\": \"normal\",\n    \"font-family\": \"Arial\",\n    \"fill\": obj.config.labelFontColor,\n    \"fill-opacity\": \"0\"\n  });\n  setDy(obj.txtLabel, obj.params.labelFontSize, obj.params.labelY);\n\n  // min\n  var min = obj.config.min;\n  if (obj.config.reverse) {\n    min = obj.config.max;\n  }\n\n  obj.txtMinimum = min;\n  if (obj.config.minTxt) {\n    obj.txtMinimum = obj.config.minTxt;\n  } else if (obj.config.humanFriendly) {\n    obj.txtMinimum = humanFriendlyNumber(min, obj.config.humanFriendlyDecimal);\n  } else if (obj.config.formatNumber) {\n    obj.txtMinimum = formatNumber(min);\n  }\n  obj.txtMin = obj.canvas.text(obj.params.minX, obj.params.minY, obj.txtMinimum);\n  obj.txtMin.attr({\n    \"font-size\": obj.params.minFontSize,\n    \"font-weight\": \"normal\",\n    \"font-family\": \"Arial\",\n    \"fill\": obj.config.labelFontColor,\n    \"fill-opacity\": (obj.config.hideMinMax || obj.config.donut) ? \"0\" : \"1\"\n  });\n  setDy(obj.txtMin, obj.params.minFontSize, obj.params.minY);\n\n  // max\n  var max = obj.config.max;\n  if (obj.config.reverse) {\n    max = obj.config.min;\n  }\n  obj.txtMaximum = max;\n  if (obj.config.maxTxt) {\n    obj.txtMaximum = obj.config.maxTxt;\n  } else if (obj.config.humanFriendly) {\n    obj.txtMaximum = humanFriendlyNumber(max, obj.config.humanFriendlyDecimal);\n  } else if (obj.config.formatNumber) {\n    obj.txtMaximum = formatNumber(max);\n  }\n  obj.txtMax = obj.canvas.text(obj.params.maxX, obj.params.maxY, obj.txtMaximum);\n  obj.txtMax.attr({\n    \"font-size\": obj.params.maxFontSize,\n    \"font-weight\": \"normal\",\n    \"font-family\": \"Arial\",\n    \"fill\": obj.config.labelFontColor,\n    \"fill-opacity\": (obj.config.hideMinMax || obj.config.donut) ? \"0\" : \"1\"\n  });\n  setDy(obj.txtMax, obj.params.maxFontSize, obj.params.maxY);\n\n  var defs = obj.canvas.canvas.childNodes[1];\n  var svg = \"http://www.w3.org/2000/svg\";\n\n  if (ie !== 'undefined' && ie < 9) {\n    // VML mode - no SVG & SVG filter support\n  } else if (ie !== 'undefined') {\n    onCreateElementNsReady(function() {\n      obj.generateShadow(svg, defs);\n    });\n  } else {\n    obj.generateShadow(svg, defs);\n  }\n\n  // var clear\n  defs, svg = null;\n\n  // set value to display\n  if (obj.config.textRenderer) {\n    obj.originalValue = obj.config.textRenderer(obj.originalValue);\n  } else if (obj.config.humanFriendly) {\n    obj.originalValue = humanFriendlyNumber(obj.originalValue, obj.config.humanFriendlyDecimal) + obj.config.symbol;\n  } else if (obj.config.formatNumber) {\n    obj.originalValue = formatNumber(obj.originalValue) + obj.config.symbol;\n  } else {\n    obj.originalValue = (obj.originalValue * 1).toFixed(obj.config.decimals) + obj.config.symbol;\n  }\n\n  if (obj.config.counter === true) {\n    //on each animation frame\n    eve.on(\"raphael.anim.frame.\" + (obj.level.id), function() {\n      var currentValue = obj.level.attr(\"pki\")[0];\n      if (obj.config.reverse) {\n        currentValue = (obj.config.max * 1) + (obj.config.min * 1) - (obj.level.attr(\"pki\")[0] * 1);\n      }\n      if (obj.config.textRenderer) {\n        obj.txtValue.attr(\"text\", obj.config.textRenderer(Math.floor(currentValue)));\n      } else if (obj.config.humanFriendly) {\n        obj.txtValue.attr(\"text\", humanFriendlyNumber(Math.floor(currentValue), obj.config.humanFriendlyDecimal) + obj.config.symbol);\n      } else if (obj.config.formatNumber) {\n        obj.txtValue.attr(\"text\", formatNumber(Math.floor(currentValue)) + obj.config.symbol);\n      } else {\n        obj.txtValue.attr(\"text\", (currentValue * 1).toFixed(obj.config.decimals) + obj.config.symbol);\n      }\n      setDy(obj.txtValue, obj.params.valueFontSize, obj.params.valueY);\n      currentValue = null;\n    });\n    //on animation end\n    eve.on(\"raphael.anim.finish.\" + (obj.level.id), function() {\n      obj.txtValue.attr({\n        \"text\": obj.originalValue\n      });\n      setDy(obj.txtValue, obj.params.valueFontSize, obj.params.valueY);\n    });\n  } else {\n    //on animation start\n    eve.on(\"raphael.anim.start.\" + (obj.level.id), function() {\n      obj.txtValue.attr({\n        \"text\": obj.originalValue\n      });\n      setDy(obj.txtValue, obj.params.valueFontSize, obj.params.valueY);\n    });\n  }\n\n  // animate gauge level, value & label\n  var rvl = obj.config.value;\n  if (obj.config.reverse) {\n    rvl = (obj.config.max * 1) + (obj.config.min * 1) - (obj.config.value * 1);\n  }\n  obj.level.animate({\n    pki: [\n      rvl,\n      obj.config.min,\n      obj.config.max,\n      obj.params.widgetW,\n      obj.params.widgetH,\n      obj.params.dx,\n      obj.params.dy,\n      obj.config.gaugeWidthScale,\n      obj.config.donut,\n      obj.config.reverse\n    ]\n  }, obj.config.startAnimationTime, obj.config.startAnimationType, obj.config.onAnimationEnd);\n\n  if (obj.config.pointer) {\n    obj.needle.animate({\n      ndl: [\n        rvl,\n        obj.config.min,\n        obj.config.max,\n        obj.params.widgetW,\n        obj.params.widgetH,\n        obj.params.dx,\n        obj.params.dy,\n        obj.config.gaugeWidthScale,\n        obj.config.donut\n      ]\n    }, obj.config.startAnimationTime, obj.config.startAnimationType);\n  }\n\n  obj.txtValue.animate({\n    \"fill-opacity\": (obj.config.hideValue) ? \"0\" : \"1\"\n  }, obj.config.startAnimationTime, obj.config.startAnimationType);\n  obj.txtLabel.animate({\n    \"fill-opacity\": \"1\"\n  }, obj.config.startAnimationTime, obj.config.startAnimationType);\n};\n\n/** Refresh gauge level */\nJustGage.prototype.refresh = function(val, max, config) {\n\n  var obj = this;\n  var displayVal, color, max = max || null;\n\n  if(config && (typeof config  === \"object\")) {\n    for(var key in config) {\n      if(!config.hasOwnProperty(key)) {\n        continue;\n      }\n      obj.config[key] = config[key];\n    }\n  }\n\n  // set new max\n  if (max !== null) {\n    obj.config.max = max;\n    // TODO: update customSectors\n\n    obj.txtMaximum = obj.config.max;\n    if (obj.config.maxTxt) {\n      obj.txtMaximum = obj.config.maxTxt;\n    } else if (obj.config.humanFriendly) {\n      obj.txtMaximum = humanFriendlyNumber(obj.config.max, obj.config.humanFriendlyDecimal);\n    } else if (obj.config.formatNumber) {\n      obj.txtMaximum = formatNumber(obj.config.max);\n    }\n    if (!obj.config.reverse) {\n      obj.txtMax.attr({\n        \"text\": obj.txtMaximum\n      });\n      setDy(obj.txtMax, obj.params.maxFontSize, obj.params.maxY);\n    } else {\n      obj.txtMin.attr({\n        \"text\": obj.txtMaximum\n      });\n      obj.txtMax.attr({\n        \"text\": obj.txtMinimum\n      });\n      setDy(obj.txtMin, obj.params.minFontSize, obj.params.minY);\n      setDy(obj.txtMax, obj.params.minFontSize, obj.params.minY);\n    }\n  }\n\n  // overflow values\n  displayVal = val;\n  if ((val * 1) > (obj.config.max * 1)) {\n    val = (obj.config.max * 1);\n  }\n  if ((val * 1) < (obj.config.min * 1)) {\n    val = (obj.config.min * 1);\n  }\n\n  color = getColor(val, (val - obj.config.min) / (obj.config.max - obj.config.min), obj.config.levelColors, obj.config.noGradient, obj.config.customSectors);\n\n  if (obj.config.textRenderer) {\n    displayVal = obj.config.textRenderer(displayVal);\n  } else if (obj.config.humanFriendly) {\n    displayVal = humanFriendlyNumber(displayVal, obj.config.humanFriendlyDecimal) + obj.config.symbol;\n  } else if (obj.config.formatNumber) {\n    displayVal = formatNumber((displayVal * 1).toFixed(obj.config.decimals)) + obj.config.symbol;\n  } else {\n    displayVal = (displayVal * 1).toFixed(obj.config.decimals) + obj.config.symbol;\n  }\n  obj.originalValue = displayVal;\n  obj.config.value = val * 1;\n\n  if (!obj.config.counter) {\n    obj.txtValue.attr({\n      \"text\": displayVal\n    });\n    setDy(obj.txtValue, obj.params.valueFontSize, obj.params.valueY);\n  }\n\n  var rvl = obj.config.value;\n  if (obj.config.reverse) {\n    rvl = (obj.config.max * 1) + (obj.config.min * 1) - (obj.config.value * 1);\n  }\n  obj.level.animate({\n    pki: [\n      rvl,\n      obj.config.min,\n      obj.config.max,\n      obj.params.widgetW,\n      obj.params.widgetH,\n      obj.params.dx,\n      obj.params.dy,\n      obj.config.gaugeWidthScale,\n      obj.config.donut,\n      obj.config.reverse\n    ],\n    \"fill\": color\n  }, obj.config.refreshAnimationTime, obj.config.refreshAnimationType, obj.config.onAnimationEnd);\n\n  if (obj.config.pointer) {\n    obj.needle.animate({\n      ndl: [\n        rvl,\n        obj.config.min,\n        obj.config.max,\n        obj.params.widgetW,\n        obj.params.widgetH,\n        obj.params.dx,\n        obj.params.dy,\n        obj.config.gaugeWidthScale,\n        obj.config.donut\n      ]\n    }, obj.config.refreshAnimationTime, obj.config.refreshAnimationType);\n  }\n\n  // var clear\n  obj, displayVal, color, max = null;\n};\n\n/** Generate shadow */\nJustGage.prototype.generateShadow = function(svg, defs) {\n\n  var obj = this;\n  var sid = \"inner-shadow-\" + obj.config.id;\n  var gaussFilter, feOffset, feGaussianBlur, feComposite1, feFlood, feComposite2, feComposite3;\n\n  // FILTER\n  gaussFilter = document.createElementNS(svg, \"filter\");\n  gaussFilter.setAttribute(\"id\", sid);\n  defs.appendChild(gaussFilter);\n\n  // offset\n  feOffset = document.createElementNS(svg, \"feOffset\");\n  feOffset.setAttribute(\"dx\", 0);\n  feOffset.setAttribute(\"dy\", obj.config.shadowVerticalOffset);\n  gaussFilter.appendChild(feOffset);\n\n  // blur\n  feGaussianBlur = document.createElementNS(svg, \"feGaussianBlur\");\n  feGaussianBlur.setAttribute(\"result\", \"offset-blur\");\n  feGaussianBlur.setAttribute(\"stdDeviation\", obj.config.shadowSize);\n  gaussFilter.appendChild(feGaussianBlur);\n\n  // composite 1\n  feComposite1 = document.createElementNS(svg, \"feComposite\");\n  feComposite1.setAttribute(\"operator\", \"out\");\n  feComposite1.setAttribute(\"in\", \"SourceGraphic\");\n  feComposite1.setAttribute(\"in2\", \"offset-blur\");\n  feComposite1.setAttribute(\"result\", \"inverse\");\n  gaussFilter.appendChild(feComposite1);\n\n  // flood\n  feFlood = document.createElementNS(svg, \"feFlood\");\n  feFlood.setAttribute(\"flood-color\", \"black\");\n  feFlood.setAttribute(\"flood-opacity\", obj.config.shadowOpacity);\n  feFlood.setAttribute(\"result\", \"color\");\n  gaussFilter.appendChild(feFlood);\n\n  // composite 2\n  feComposite2 = document.createElementNS(svg, \"feComposite\");\n  feComposite2.setAttribute(\"operator\", \"in\");\n  feComposite2.setAttribute(\"in\", \"color\");\n  feComposite2.setAttribute(\"in2\", \"inverse\");\n  feComposite2.setAttribute(\"result\", \"shadow\");\n  gaussFilter.appendChild(feComposite2);\n\n  // composite 3\n  feComposite3 = document.createElementNS(svg, \"feComposite\");\n  feComposite3.setAttribute(\"operator\", \"over\");\n  feComposite3.setAttribute(\"in\", \"shadow\");\n  feComposite3.setAttribute(\"in2\", \"SourceGraphic\");\n  gaussFilter.appendChild(feComposite3);\n\n  // set shadow\n  if (!obj.config.hideInnerShadow) {\n    obj.canvas.canvas.childNodes[2].setAttribute(\"filter\", \"url(\" + window.location.pathname + \"#\" + sid + \")\");\n    obj.canvas.canvas.childNodes[3].setAttribute(\"filter\", \"url(\" + window.location.pathname + \"#\" + sid + \")\");\n  }\n\n  // var clear\n  gaussFilter, feOffset, feGaussianBlur, feComposite1, feFlood, feComposite2, feComposite3 = null;\n};\n\n//\n// tiny helper function to lookup value of a key from two hash tables\n// if none found, return defaultvalue\n//\n// key: string\n// tablea: object\n// tableb: DOMStringMap|object\n// defval: string|integer|float|null\n// datatype: return datatype\n// delimiter: delimiter to be used in conjunction with datatype formatting\n//\nfunction kvLookup(key, tablea, tableb, defval, datatype, delimiter) {\n  var val = defval;\n  var canConvert = false;\n  if (!(key === null || key === undefined)) {\n    if (tableb !== null && tableb !== undefined && typeof tableb === \"object\" && key in tableb) {\n      val = tableb[key];\n      canConvert = true;\n    } else if (tablea !== null && tablea !== undefined && typeof tablea === \"object\" && key in tablea) {\n      val = tablea[key];\n      canConvert = true;\n    } else {\n      val = defval;\n    }\n    if (canConvert === true) {\n      if (datatype !== null && datatype !== undefined) {\n        switch (datatype) {\n          case 'int':\n            val = parseInt(val, 10);\n            break;\n          case 'float':\n            val = parseFloat(val);\n            break;\n          default:\n            break;\n        }\n      }\n    }\n  }\n  return val;\n};\n\n/** Get color for value */\nfunction getColor(val, pct, col, noGradient, custSec) {\n\n  var no, inc, colors, percentage, rval, gval, bval, lower, upper, range, rangePct, pctLower, pctUpper, color;\n  var noGradient = noGradient || custSec.length > 0;\n\n  if (custSec.length > 0) {\n    for (var i = 0; i < custSec.length; i++) {\n      if (val >= custSec[i].lo && val <= custSec[i].hi) {\n        return custSec[i].color;\n      }\n    }\n  }\n\n  no = col.length;\n  if (no === 1) return col[0];\n  inc = (noGradient) ? (1 / no) : (1 / (no - 1));\n  colors = [];\n  for (i = 0; i < col.length; i++) {\n    percentage = (noGradient) ? (inc * (i + 1)) : (inc * i);\n    rval = parseInt((cutHex(col[i])).substring(0, 2), 16);\n    gval = parseInt((cutHex(col[i])).substring(2, 4), 16);\n    bval = parseInt((cutHex(col[i])).substring(4, 6), 16);\n    colors[i] = {\n      pct: percentage,\n      color: {\n        r: rval,\n        g: gval,\n        b: bval\n      }\n    };\n  }\n\n  if (pct === 0) {\n    return 'rgb(' + [colors[0].color.r, colors[0].color.g, colors[0].color.b].join(',') + ')';\n  }\n\n  for (var j = 0; j < colors.length; j++) {\n    if (pct <= colors[j].pct) {\n      if (noGradient) {\n        return 'rgb(' + [colors[j].color.r, colors[j].color.g, colors[j].color.b].join(',') + ')';\n      } else {\n        lower = colors[j - 1];\n        upper = colors[j];\n        range = upper.pct - lower.pct;\n        rangePct = (pct - lower.pct) / range;\n        pctLower = 1 - rangePct;\n        pctUpper = rangePct;\n        color = {\n          r: Math.floor(lower.color.r * pctLower + upper.color.r * pctUpper),\n          g: Math.floor(lower.color.g * pctLower + upper.color.g * pctUpper),\n          b: Math.floor(lower.color.b * pctLower + upper.color.b * pctUpper)\n        };\n        return 'rgb(' + [color.r, color.g, color.b].join(',') + ')';\n      }\n    }\n  }\n\n}\n\n/** Fix Raphael display:none tspan dy attribute bug */\nfunction setDy(elem, fontSize, txtYpos) {\n  if ((!ie || ie > 9) && elem.node.firstChild.attributes.dy) {\n    elem.node.firstChild.attributes.dy.value = 0;\n  }\n}\n\n/** Random integer  */\nfunction getRandomInt(min, max) {\n  return Math.floor(Math.random() * (max - min + 1)) + min;\n}\n\n/**  Cut hex  */\nfunction cutHex(str) {\n  return (str.charAt(0) == \"#\") ? str.substring(1, 7) : str;\n}\n\n/**  Human friendly number suffix - From: http://stackoverflow.com/questions/2692323/code-golf-friendly-number-abbreviator */\nfunction humanFriendlyNumber(n, d) {\n  var p, d2, i, s;\n\n  p = Math.pow;\n  d2 = p(10, d);\n  i = 7;\n  while (i) {\n    s = p(10, i-- * 3);\n    if (s <= n) {\n      n = Math.round(n * d2 / s) / d2 + \"KMGTPE\" [i];\n    }\n  }\n  return n;\n}\n\n/** Format numbers with commas - From: http://stackoverflow.com/questions/2901102/how-to-print-a-number-with-commas-as-thousands-separators-in-javascript */\nfunction formatNumber(x) {\n  var parts = x.toString().split(\".\");\n  parts[0] = parts[0].replace(/\\B(?=(\\d{3})+(?!\\d))/g, \",\");\n  return parts.join(\".\");\n}\n\n/**  Get style  */\nfunction getStyle(oElm, strCssRule) {\n  var strValue = \"\";\n  if (document.defaultView && document.defaultView.getComputedStyle) {\n    strValue = document.defaultView.getComputedStyle(oElm, \"\").getPropertyValue(strCssRule);\n  } else if (oElm.currentStyle) {\n    strCssRule = strCssRule.replace(/\\-(\\w)/g, function(strMatch, p1) {\n      return p1.toUpperCase();\n    });\n    strValue = oElm.currentStyle[strCssRule];\n  }\n  return strValue;\n}\n\n/**  Create Element NS Ready  */\nfunction onCreateElementNsReady(func) {\n  if (document.createElementNS !== undefined) {\n    func();\n  } else {\n    setTimeout(function() {\n      onCreateElementNsReady(func);\n    }, 100);\n  }\n}\n\n/**  Get IE version  */\n// ----------------------------------------------------------\n// A short snippet for detecting versions of IE in JavaScript\n// without resorting to user-agent sniffing\n// ----------------------------------------------------------\n// If you're not in IE (or IE version is less than 5) then:\n// ie === undefined\n// If you're in IE (>=5) then you can determine which version:\n// ie === 7; // IE7\n// Thus, to detect IE:\n// if (ie) {}\n// And to detect the version:\n// ie === 6 // IE6\n// ie > 7 // IE8, IE9 ...\n// ie < 9 // Anything less than IE9\n// ----------------------------------------------------------\n// UPDATE: Now using Live NodeList idea from @jdalton\nvar ie = (function() {\n\n  var undef,\n    v = 3,\n    div = document.createElement('div'),\n    all = div.getElementsByTagName('i');\n\n  while (\n    div.innerHTML = '<!--[if gt IE ' + (++v) + ']><i></i><![endif]-->',\n    all[0]\n  );\n  return v > 4 ? v : undef;\n}());\n\n// extend target object with second object\nfunction extend(out) {\n  out = out || {};\n\n  for (var i = 1; i < arguments.length; i++) {\n    if (!arguments[i])\n      continue;\n\n    for (var key in arguments[i]) {\n      if (arguments[i].hasOwnProperty(key))\n        out[key] = arguments[i][key];\n    }\n  }\n\n  return out;\n};\n\n\nmodule.exports = JustGage;\n"]}