graphdb-workbench 2.2.1 → 2.2.2-TR2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (118) hide show
  1. package/dist/{108.19b6e7d30df333e42876.bundle.js → 108.3c3f9c242e6a3e18fff5.bundle.js} +2 -2
  2. package/dist/108.3c3f9c242e6a3e18fff5.bundle.js.map +1 -0
  3. package/dist/11.f4c5533cd200c8568ff6.bundle.js +1 -1
  4. package/dist/11.f4c5533cd200c8568ff6.bundle.js.map +1 -1
  5. package/dist/111.a12fdfab1d11ab373ecf.bundle.js +2 -0
  6. package/dist/111.a12fdfab1d11ab373ecf.bundle.js.map +1 -0
  7. package/dist/112.8cd13d27736494201244.bundle.js +2 -0
  8. package/dist/112.8cd13d27736494201244.bundle.js.map +1 -0
  9. package/dist/{12.d9d71e44fdefd12ffbd9.bundle.js → 12.f348b65d06b0213c492e.bundle.js} +2 -2
  10. package/dist/12.f348b65d06b0213c492e.bundle.js.map +1 -0
  11. package/dist/{13.c983d32d3e92f49cd670.bundle.js → 13.fc8afecbe1a39b84c1db.bundle.js} +2 -2
  12. package/dist/13.fc8afecbe1a39b84c1db.bundle.js.map +1 -0
  13. package/dist/{14.8661d578dfadafbcdf84.bundle.js → 14.457cf038826e0d9e033e.bundle.js} +2 -2
  14. package/dist/14.457cf038826e0d9e033e.bundle.js.map +1 -0
  15. package/dist/148.dd250d3cc5aafade33c6.bundle.js +1 -1
  16. package/dist/148.dd250d3cc5aafade33c6.bundle.js.map +1 -1
  17. package/dist/{15.6eada6724367dcd05007.bundle.js → 15.874aa7b7f7972283a629.bundle.js} +2 -2
  18. package/dist/15.874aa7b7f7972283a629.bundle.js.map +1 -0
  19. package/dist/20.fbcb31706f03a07e8827.bundle.js +1 -1
  20. package/dist/20.fbcb31706f03a07e8827.bundle.js.map +1 -1
  21. package/dist/{21.7f0a59ea2ad9340dcb2f.bundle.js → 21.ea150df1291050bc1c4a.bundle.js} +2 -2
  22. package/dist/21.ea150df1291050bc1c4a.bundle.js.map +1 -0
  23. package/dist/27.83b24ef9ec0fd6964d92.bundle.js +1 -1
  24. package/dist/27.83b24ef9ec0fd6964d92.bundle.js.map +1 -1
  25. package/dist/33.4d23fa109c9184727386.bundle.js +1 -1
  26. package/dist/33.4d23fa109c9184727386.bundle.js.map +1 -1
  27. package/dist/34.f019d485e103b291488a.bundle.js +2 -0
  28. package/dist/34.f019d485e103b291488a.bundle.js.map +1 -0
  29. package/dist/40.50b40301c8cc69a70457.bundle.js +1 -1
  30. package/dist/40.50b40301c8cc69a70457.bundle.js.map +1 -1
  31. package/dist/44.568afd25b8a568b1c18d.bundle.js +2 -0
  32. package/dist/44.568afd25b8a568b1c18d.bundle.js.map +1 -0
  33. package/dist/45.ff1425adb8765ead76fa.bundle.js +2 -0
  34. package/dist/45.ff1425adb8765ead76fa.bundle.js.map +1 -0
  35. package/dist/46.e92017f79bee05197e4a.bundle.js +2 -0
  36. package/dist/46.e92017f79bee05197e4a.bundle.js.map +1 -0
  37. package/dist/47.099bba66b99e58961fd9.bundle.js +2 -0
  38. package/dist/47.099bba66b99e58961fd9.bundle.js.map +1 -0
  39. package/dist/48.5a84d14ed4cb41f91fca.bundle.js +2 -0
  40. package/dist/48.5a84d14ed4cb41f91fca.bundle.js.map +1 -0
  41. package/dist/49.ad3b75a5d0c8679165b9.bundle.js +2 -0
  42. package/dist/49.ad3b75a5d0c8679165b9.bundle.js.map +1 -0
  43. package/dist/50.5114c92299726180a264.bundle.js +2 -0
  44. package/dist/50.5114c92299726180a264.bundle.js.map +1 -0
  45. package/dist/51.f884748db1436a79a134.bundle.js +2 -0
  46. package/dist/51.f884748db1436a79a134.bundle.js.map +1 -0
  47. package/dist/52.351e9098a43e13a6f2da.bundle.js +2 -0
  48. package/dist/52.351e9098a43e13a6f2da.bundle.js.map +1 -0
  49. package/dist/94.38349f52df66313fbcc0.bundle.js +1 -1
  50. package/dist/94.38349f52df66313fbcc0.bundle.js.map +1 -1
  51. package/dist/{bundle.119af3621ec41f8cbf04.bundle.js → bundle.f540ee201846422b1cb9.bundle.js} +3 -3
  52. package/dist/bundle.f540ee201846422b1cb9.bundle.js.map +1 -0
  53. package/dist/css/jmx.css +11 -1
  54. package/dist/i18n/locale-en.json +22 -6
  55. package/dist/i18n/locale-fr.json +61 -15
  56. package/dist/index.html +3 -3
  57. package/dist/js/angular/core/directives/rdfresourcesearch/templates/rdfResourceSearchTemplate.html +1 -1
  58. package/dist/pages/autocomplete.html +1 -1
  59. package/dist/pages/choose-repository-type.html +1 -1
  60. package/dist/pages/cluster-management/clusterInfo.html +3 -3
  61. package/dist/pages/create-index.html +4 -4
  62. package/dist/pages/dependencies.html +1 -1
  63. package/dist/pages/domainRangeInfo.html +2 -2
  64. package/dist/pages/edit.html +1 -1
  65. package/dist/pages/explore.html +1 -1
  66. package/dist/pages/export.html +1 -1
  67. package/dist/pages/find.html +1 -1
  68. package/dist/pages/graph-config/saveGraphConfig.html +11 -11
  69. package/dist/pages/graphs-visualizations.html +7 -7
  70. package/dist/pages/guides.html +1 -1
  71. package/dist/pages/import.html +1 -1
  72. package/dist/pages/jdbc-create.html +5 -5
  73. package/dist/pages/monitor/queries.html +1 -1
  74. package/dist/pages/monitor/resources.html +121 -31
  75. package/dist/pages/namespaces.html +2 -2
  76. package/dist/pages/plugins.html +1 -1
  77. package/dist/pages/rdfClassHierarchyInfo.html +7 -7
  78. package/dist/pages/rdfrank.html +2 -2
  79. package/dist/pages/repositories.html +2 -2
  80. package/dist/pages/repository.html +2 -2
  81. package/dist/pages/similarity-indexes.html +1 -1
  82. package/dist/pages/sparql-template-create.html +5 -5
  83. package/dist/pages/sparql.html +3 -3
  84. package/dist/pages/webapi.html +2 -2
  85. package/dist/plugins.js +4 -3
  86. package/dist/res/swagger/index.html +27 -27
  87. package/package.json +1 -1
  88. package/dist/108.19b6e7d30df333e42876.bundle.js.map +0 -1
  89. package/dist/111.4845cf402b3a4c3c006c.bundle.js +0 -2
  90. package/dist/111.4845cf402b3a4c3c006c.bundle.js.map +0 -1
  91. package/dist/112.99c50f08e6724346dc3a.bundle.js +0 -2
  92. package/dist/112.99c50f08e6724346dc3a.bundle.js.map +0 -1
  93. package/dist/12.d9d71e44fdefd12ffbd9.bundle.js.map +0 -1
  94. package/dist/13.c983d32d3e92f49cd670.bundle.js.map +0 -1
  95. package/dist/14.8661d578dfadafbcdf84.bundle.js.map +0 -1
  96. package/dist/15.6eada6724367dcd05007.bundle.js.map +0 -1
  97. package/dist/21.7f0a59ea2ad9340dcb2f.bundle.js.map +0 -1
  98. package/dist/34.01b159cdf635ac9d0dd7.bundle.js +0 -2
  99. package/dist/34.01b159cdf635ac9d0dd7.bundle.js.map +0 -1
  100. package/dist/44.4d7cb09cdd1413d5f879.bundle.js +0 -2
  101. package/dist/44.4d7cb09cdd1413d5f879.bundle.js.map +0 -1
  102. package/dist/45.8c6f6eba4736e953c2bc.bundle.js +0 -2
  103. package/dist/45.8c6f6eba4736e953c2bc.bundle.js.map +0 -1
  104. package/dist/46.3a0da10162409588560c.bundle.js +0 -2
  105. package/dist/46.3a0da10162409588560c.bundle.js.map +0 -1
  106. package/dist/47.049aedaa6cfccef06f69.bundle.js +0 -2
  107. package/dist/47.049aedaa6cfccef06f69.bundle.js.map +0 -1
  108. package/dist/48.d7b02a85dfa52084b1c4.bundle.js +0 -2
  109. package/dist/48.d7b02a85dfa52084b1c4.bundle.js.map +0 -1
  110. package/dist/49.2e7858348448fdde1332.bundle.js +0 -2
  111. package/dist/49.2e7858348448fdde1332.bundle.js.map +0 -1
  112. package/dist/50.1650ec02515a7dce98a5.bundle.js +0 -2
  113. package/dist/50.1650ec02515a7dce98a5.bundle.js.map +0 -1
  114. package/dist/51.c597233d286f68e37481.bundle.js +0 -2
  115. package/dist/51.c597233d286f68e37481.bundle.js.map +0 -1
  116. package/dist/52.0ea1cd862aeb2461a9c4.bundle.js +0 -2
  117. package/dist/52.0ea1cd862aeb2461a9c4.bundle.js.map +0 -1
  118. package/dist/bundle.119af3621ec41f8cbf04.bundle.js.map +0 -1
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["webpack:///./src/js/angular/jdbc/app.js","webpack:///./src/js/lib/nvd3/nv.d3.js","webpack:///./src/js/angular/resources/chart-models/chart-data.js","webpack:///./src/js/angular/utils/notifications.js","webpack:///./src/js/angular/resources/chart-models/resource/heap-memory-chart.js","webpack:///./src/js/angular/rest/cluster.rest.service.js","webpack:///./src/js/angular/core/directives/queryeditor/sparql-tab.directive.js","webpack:///./src/js/angular/resources/chart-models/resource/file-descriptors-chart.js","webpack:///./src/js/angular/resources/chart-models/resource/non-heap-memory-chart.js","webpack:///./src/js/angular/resources/chart-models/resource/cpu-load-chart.js","webpack:///./src/js/angular/resources/chart-models/resource/disk-storage-chart.js","webpack:///./src/js/angular/resources/chart-models/performance/queries-chart.js","webpack:///./src/js/angular/resources/chart-models/resource/global-cache-chart.js","webpack:///./src/js/angular/resources/chart-models/performance/connections-chart.js","webpack:///./src/js/angular/resources/chart-models/cluster-health/cluster-health-chart.js","webpack:///./src/js/angular/resources/chart-models/performance/epool-chart.js","webpack:///./src/js/angular/resources/controllers.js","webpack:///./src/js/angular/jdbc/controllers.js","webpack:///./src/js/angular/rest/jdbc.rest.service.js"],"names":["angular","module","nv","tooltip","utils","models","charts","logs","dom","d3","dispatch","Function","prototype","bind","oThis","this","TypeError","aArgs","Array","slice","call","arguments","fToBind","fNOP","fBound","apply","concat","dev","on","e","startTime","Date","endTime","totalTime","log","window","console","length","deprecated","name","info","warn","render","step","active","render_start","renderLoop","chart","graph","i","queue","generate","callback","splice","setTimeout","render_end","addGraph","obj","push","exports","write","undefined","fastdom","mutate","read","measure","interactiveGuideline","margin","left","top","width","height","xScale","scale","linear","showGuideLine","svgContainer","isMSIE","ActiveXObject","layer","selection","each","data","container","select","availableWidth","availableHeight","wrap","selectAll","mouseHandler","mouseX","event","clientX","getBoundingClientRect","mouseY","clientY","subtractMargin","mouseOutAnyReason","offsetX","offsetY","target","tagName","className","baseVal","match","type","relatedTarget","ownerSVGElement","nvPointerEventsClass","elementMouseout","renderGuideLine","hidden","pointXValue","rangeBands","elementIndex","bisect","range","rangeBand","domain","invert","elementMousemove","elementDblclick","elementClick","elementMouseDown","elementMouseUp","enter","append","attr","guideLine","x","line","NaNtoZero","String","d","exit","remove","duration","hideDelay","_","interactiveBisect","values","searchVal","xAccessor","_xAccessor","bisector","v","index","max","currentValue","nextIndex","min","nextValue","Math","abs","nearestValueIndex","threshold","yDistMax","Infinity","indexToHighlight","forEach","delta","id","floor","random","gravity","distance","snapDistance","classes","lastPosition","enabled","headerEnabled","valueFormatter","p","headerFormatter","keyFormatter","contentGenerator","elem","table","document","createElement","classed","html","value","trowEnter","series","highlight","style","color","total","key","filter","percent","format","opacityScale","node","outerHTML","footer","position","pos","getComputedStyle","body","transform","client","positionTooltip","gravityOffset","tmp","offsetHeight","offsetWidth","clientWidth","documentElement","clientHeight","calcGravityOffset","interrupt","transition","delay","old_translate","new_translate","round","translateInterpolator","interpolateString","is_hidden","styleTween","nvtooltip","isArray","isObject","dataSeriesExists","newContent","innerHTML","options","optionsFunc","_options","Object","create","get","set","chartContainer","fixedTop","offset","point","y","initOptions","windowSize","size","innerWidth","innerHeight","compatMode","a","isFunction","isDate","toString","isNumber","isNaN","windowResize","handler","addEventListener","clear","removeEventListener","getColor","defaultColor","color_scale","ordinal","category20","customTheme","dictionary","getKey","defaultColors","defIndex","pjax","links","content","load","href","fragment","parentNode","replaceChild","history","pushState","textContent","preventDefault","state","calcApproxTextWidth","svgTextElem","text","fontSize","parseInt","replace","textLength","n","watchTransition","renderWatch","args","_duration","renderStack","self","model","m","__rendered","arg","renderEnd","indexOf","reset","pop","every","deepExtend","dst","sources","source","srcObj","_setState","_getState","init","getter","fn","setter","update","_set","settings","JSON","stringify","change","map","calcTicksX","numTicks","numValues","stream_len","calcTicksY","initOption","_calls","_overrides","ops","getOwnPropertyNames","calls","inheritOptionsD3","d3_source","oplist","_d3options","item","ar","unshift","rebind","arrayUnique","sort","symbolMap","symbol","t","s","svg","symbolTypes","functor","inheritOptions","inherited","_inherited","d3ops","initSVG","sanitizeHeight","sanitizeWidth","bottom","right","noData","opt","noDataText","wrapTicks","word","words","split","reverse","lineNumber","dy","parseFloat","tspan","join","getComputedTextLength","arrayEquals","array1","array2","l","pointIsInArc","pt","ptData","d3Arc","r1","innerRadius","r2","outerRadius","theta1","startAngle","theta2","endAngle","dist","angle","atan2","PI","axis","tickFormatMaxMin","scale0","axisLabelText","showMaxMin","rotateLabels","rotateYLabel","staggerLabels","isOrdinal","ticks","axisLabelDistance","orient","tickFormat","g","fmt","xLabelMargin","axisMaxMin","w","axisLabel","tickPadding","maxTextWidth","textHeight","xTicks","rotateLabelsRule","box","sin","maxMinRange","err","copy","boxPlot","xDomain","xRange","yDomain","yRange","xScale0","yScale0","yScale","getX","label","getQ1","Q1","getQ2","Q2","getQ3","Q3","getWl","whisker_low","getWh","whisker_high","getOlItems","outliers","getOlValue","j","getOlLabel","getOlColor","maxBoxWidth","yData","q1","q3","wl","wh","olItems","boxplots","boxEnter","hover","f","box_width","box_left","box_right","endpoint","elementMouseover","q2","itemColor","outlierValue","outlierLabel","outlierColor","boxPlotChart","boxplot","xAxis","yAxis","showXAxis","showYAxis","rightAlignYAxis","beforeUpdate","clamp","gEnter","defsEnter","datum","disabled","tickSize","evt","tooltipContent","bullet","ranges","markers","markerLines","measures","rangeLabels","markerLabels","markerLineLabels","measureLabels","forceX","defaultRangeLabels","legacyRangeClassNames","sortLabels","labels","lz","b","iA","iB","descending","rangez","markerz","markerLinez","measurez","rangeLabelz","markerLabelz","markerLineLabelz","measureLabelz","x1","extent","merge","__chart__","il","rangeClassNames","w1","xp1","h3","markerData","marker","markerLinesData","bulletChart","x0","title","subtitle","bulletWrap","tick","tickEnter","tickUpdate","timer","flush","candlestickBar","getY","getOpen","open","getClose","close","getHigh","high","getLow","low","forceY","padData","clipEdge","interactive","barWidth","wrapEnter","chartClick","tickGroups","highlightPoint","pointIndex","isHoverOver","clearHighlights","cumulativeLineChart","lines","legend","controls","interactiveLayer","marginTop","showLegend","showControls","useInteractiveGuideline","rescaleY","defaultState","average","noErrorCheck","updateState","currentYDomain","dx","stateSetter","stateGetter","indexDrag","behavior","drag","updateZero","stateChange","idx","indexifyYGetter","indexValue","tempDisabled","display","indexify","getCurrentYDomain","interactivePointerEvents","controlsData","rightAlign","linesWrap","seriesIndex","avgLineData","avgLines","getAvgLineY","yVal","indexLine","oldDuration","_ticks","mouse","newState","singlePoint","pointXLocation","allData","yValue","xValue","seriesDomains","useVoronoi","discreteBar","y0","showValues","valueFormat","rectClass","seriesData","groups","bars","barsEnter","element","stopPropagation","elementDblClick","discreteBarChart","discretebar","wrapLabels","distribution","getData","naxis","distWrap","focus","brush","brushExtent","syncBrushing","pointActive","contentWrap","onBrush","empty","brushBG","brushBGenter","gBrush","shouldDispatch","leftWidth","rightWidth","interpolate","xTickFormat","yTickFormat","forceDirectedGraph","linkStrength","friction","linkDist","charge","theta","alpha","radius","nodeExtras","nodes","linkExtras","nodeFieldSet","Set","keys","add","force","layout","linkDistance","start","link","sqrt","py","px","nodeColor","field","furiousLegend","maxKeyLength","align","padding","radioButtonMode","expanded","vers","setTextColor","disengaged","setBGColor","seriesShape","seriesEnter","property","versPadding","seriesText","legendMouseover","legendMouseout","legendClick","userDisabled","legendDblclick","seriesWidths","legendText","nodeTextLength","trimmedKey","substring","Error","seriesPerRow","legendWidth","columnWidths","k","reduce","prev","cur","array","xPositions","curX","ceil","xpos","ypos","newxpos","maxwidth","historicalBar","rval","historicalBarChart","bar_model","transitionDuration","tooltipHide","ohlcBarChart","ohlcBar","candlestickBarChart","enableDoubleClick","setBGOpacity","insert","scatter","defined","isArea","area","pointSize","pointDomain","scatterWrap","strokeWidth","fillOpacity","areaPaths","y1","linePaths","lineChart","legendPosition","focusEnable","focusEnter","updateXAxis","updateYAxis","disableTooltip","currentValues","pointYValue","yPos","x2Axis","y2Axis","focusHeight","focusShowAxisX","focusShowAxisY","focusMargin","lineWithFocusChart","linePlusBarChart","x2","y2","y3","y4","lines2","bars2","y1Axis","y3Axis","y4Axis","margin2","legendLeftAxisHint","legendRightAxisHint","switchYAxisOrder","allDisabled","availableHeight1","availableHeight2","dataBars","bar","dataLines","series1","series2","contextEnter","legendXPosition","originalKey","bars2Wrap","lines2Wrap","dataLine","focusBarsWrap","focusLinesWrap","barsOpacity","linesOpacity","y1Opacity","y2Opacity","main","getLinesAxis","getBarsAxis","multiBar","stacked","stackOffset","hideable","barColor","groupSpacing","last_datalength","nonStackableCount","parsed","stack","nonStackable","nonStackableSeries","posBase","negBase","exitTransition","rgb","darker","barSelection","multiBarChart","multibar","controlLabels","reduceXTicks","controlWidth","grouped","getTranslate","totalInBetweenTicks","multiBarHorizontal","getYerr","yErr","valuePadding","xerr","mid","path","yerr","multiBarHorizontalChart","controlsPosition","multiChart","yDomain1","yDomain2","yScale1","yScale2","lines1","scatters1","scatters2","bars1","stack1","stackedArea","stack2","yAxis1","yAxis2","dataLines1","dataLines2","dataScatters1","dataScatters2","dataBars1","dataBars2","dataStack1","dataStack2","color_array","lines1Wrap","scatters1Wrap","bars1Wrap","stack1Wrap","scatters2Wrap","stack2Wrap","extraValue1BarStacked","aVal","extraValue2BarStacked","mouseover_line","yaxis","mouseover_scatter","mouseover_stack","mouseover_bar","serieIndex","parallelCoordinates","foreground","background","dimensions","undefinedValuesLabel","dimensionData","enabledDimensions","dimensionNames","displayBrush","filters","dragging","axisWithUndefinedValues","lineTension","newData","val","dataValues","currentPosition","rangePoints","oldDomainMaxValue","displayMissingValuesline","currentTicks","onlyUndefinedValues","dimension","hasOnlyNaN","hasNaN","brushstart","brushend","tension","missingValuesline","missingValueslineText","axisDrag","__origin__","dimensionPosition","dimensionsOrder","lineData","dimensionsEnter","restoreBrush","actives","extents","formerActive","newscale","visible","brushDomain","updateTicks","isActive","hasActiveBrush","brushEnd","tickValues","activeChanged","dimensionFormats","parallelCoordinatesChart","nanValue","originalPosition","isSorted","str","tp","dim","dd","pie","showLabels","labelsOutside","labelType","labelThreshold","hideOverlapLabels","donut","growOnHover","titleOffset","labelSunbeamLayout","padAngle","cornerRadius","donutRatio","arcsRadius","arcs","arcsOver","arcsRadiusOuter","arcsRadiusInner","outer","inner","g_pie","arc","arcOver","slices","pieLabels","ae","_current","attrTween","labelsArc","group","rotateAngle","centroid","labelLocationHash","createHashKey","coordinates","getSlicePercentage","center","hashKey","getBBox","bb","topLeft","topRight","bottomLeft","bottomRight","pieLabelsOutside","donutLabelsOutside","labelFormat","pieChart","showTooltipPercent","pieWrap","sankey","nodeWidth","nodePadding","sinksRight","iterations","sourceLinks","targetLinks","sum","nextNodes","kx","remainingNodes","moveSinksRight","computeNodeBreadths","ky","nodesByBreadth","nest","sortKeys","ascending","entries","resolveCollisions","computeLinkDepths","relaxRightToLeft","relaxLeftToRight","weightedSource","sy","breadth","weightedTarget","ty","ascendingDepth","computeNodeDepths","curvature","xi","interpolateNumber","x3","ascendingSourceDepth","ascendingTargetDepth","relayout","sankeyChart","units","formatNumber","linkTitle","nodeFillColor","nodeStrokeColor","nodeTitle","showError","message","testData","isDataValid","dataAvailable","error","origin","appendChild","nodeStyle","fillColor","strokeColor","z0","xDom","yDom","width0","height0","timeoutID","pointBorderColor","z","getSize","getShape","shape","forceSize","notActive","padDataOuter","clipVoronoi","showVoronoi","clipRadius","sizeDomain","sizeRange","interactiveUpdateDelay","needsUpdate","_sizeRange_def","_cache","getCache","delCache","getDiffs","cache","diffs","hasOwnProperty","logScale","scaleDiff","sizeDiff","domainDiff","updateInteractiveLayer","vertices","groupIndex","pX","pY","pointArray","bounds","geom","polygon","voronoi","clip","pointPaths","vPointPaths","mouseEventCallback","el","mDispatch","scrollTop","pageYOffset","scrollLeft","pageXOffset","relativePos","points","titles","clearTimeout","pointScale","pointRange","forcePoint","pointShape","scatterChart","distX","distY","showDistX","showDistY","regWrap","regLine","intercept","slope","sparkline","animate","showMinMaxPoints","showCurrentPoint","paths","yValues","result","maxPoint","lastIndexOf","minPoint","currentPoint","sparklinePlus","paused","showLastValue","alignValue","rightAlignValue","sparklineWrap","updateValueLine","hoverValue","hoverEnter","closestIndex","getClosestIndex","order","dataRaw","aseries","dataFiltered","out","zeroArea","areaMouseover","pageX","pageY","areaMouseout","areaClick","d3_stackedOffset_stackPercent","stackData","o","stackedAreaChart","showTotalInTooltip","totalLabel","controlOptions","oldYTickFormat","oldValueFormatter","percentFormatter","xAxisHeight","legendTop","metaKey","stream","stack_percent","requiredTop","stackedWrap","currentFormat","valueSum","allNullValues","atleastOnePoint","tooltipValue","stackedY0","stackedY","stackedAreaWithFocusChart","sunburst","mode","modes","count","d1","d2","parent","groupColorByParent","partition","prevPositions","rotationToAvoidUpsideDown","computeCenterAngle","computeNodePercentage","labelThresholdMatched","arcTweenZoom","xd","yd","yr","arcTweenUpdate","ipo","dx0","dy0","storeRetrievePrevPositions","pP","updatePrevPosition","zoomClick","depth","centerAngle","rotation","cG","children","sunburstChart","version","ChartData","translateService","disableRangeUpdate","disableOldDataRemoval","initialChartSetup","resetData","chartOptions","getDefaultChartOptions","chartSetup","dataHolder","createDataHolder","firstLoad","translateLabels","updateRange","keyValues","enable","subTitleElements","keyValue","subTitleElement","timestamp","removeOldData","addNewData","isFirstLoad","shift","multiplier","domainUpperBound","calculateMaxChartValueAndDivisions","instant","time","COLORS","flatMap","getMaxValueForDataSeries","dataSeries","maxDataValue","getMaxValueFromDataHolder","maxChartValue","DEFAULT_MULTIPLIER","MAXIMUM_DIVISIONS","divisions","pow","toFixed","Notifications","toastr","$translate","showToastMessageWithDelay","Promise","r","success","factory","$inject","HeapMemoryChart","super","committed","used","memoryData","parseData","setMaxHeapSize","heapMemoryUsage","subTitleKeyValues","formatBytesValue","setSubTitle","setScale","ClusterRestService","$http","getClusterConfig","createCluster","groupConfiguration","post","updateCluster","patch","deleteCluster","forceDelete","$","param","delete","addNodesToCluster","nodesArray","removeNodesFromCluster","headers","getClusterStatus","getNodeStatus","sparqlTabDirective","$rootScope","LocalStorageAdapter","LSKeys","ModalService","restrict","template","controller","$scope","$element","getQueryID","selectTab","tab","$broadcast","deleteTab","tabs","warning","shiftKey","selectedTabId","openSimpleModal","then","TABS_STATE","idForDelete","isUndefined","findTabIndexByID","currentQuery","deleteTabByID","find","editCurrentTab","editCurrentlySelectedOnly","$show","$editableButtons","addClass","$el","currentTarget","$$currentValue","removeClass","selectThisTab","isTabChangeOk","directive","FileDescriptorsChart","openFileDescriptors","maxFileDescriptors","NonHeapMemoryChart","nonHeapMemoryUsage","CpuLoadChart","formatValue","cpuLoad","DiskStorageChart","assign","free","storageData","storageMemory","dataDirUsed","dataDirFree","workDirUsed","workDirFree","logsDirUsed","logsDirFree","totalData","totalWork","totalLogs","QueriesChart","getIntegerRangeForValues","activeQueryData","performanceData","slowQueries","queries","slow","suboptimal","GlobalCacheChart","hit","miss","cacheHit","cacheMiss","ConnectionsChart","activeTransactions","openConnections","ClusterHealthChart","nodesCount","clusterHealthChartOptions","blue","orange","green","grey","nodesStatus","nodesStats","nodesInCluster","nodesInSync","nodesSyncing","nodesOutOfSync","nodesDisconnected","term","failureRecoveriesCount","failedTransactionsCount","EpoolChart","customChartOptions","y1Domain","y2Domain","readsData","writesData","readsDiff","writesDiff","currentReads","entityPool","epoolReads","currentWrites","epoolWrites","getAxisDomain","$timeout","MonitoringRestService","$repositories","$q","$filter","AVAILABLE_TABS","freeze","urlFragment","location","hash","foundTab","activeTab","RESOURCE_MONITOR","$on","resourceMonitorData","performanceMonitorData","structuresMonitorData","clusterHealthData","chartHolder","refresh","hasError","retries","fileDescriptors","heapMemory","offHeapMemory","diskStorage","connectionsChart","epoolChart","queriesChart","globalCacheChart","clusterHealthChart","hasCluster","loader","switchTab","getActiveRepository","getPerformanceMonitorData","activeRepository","monitorQueryTransactionStatistics","response","getActiveQueryMonitor","monitorQuery","getClusterMonitorData","monitorCluster","monitor","chartsHolder","poll","cancel","resolve","fetchFn","processResponse","clearMonitorError","catch","setMonitorError","finally","dataSetter","setChartData","addData","getError","monitors","monitorResources","monitorStructures","all","clusterMonitor","loaderTimer","JdbcListCtrl","JdbcRestService","getSqlConfigurations","isActiveRepoOntopType","isActiveRepoFedXType","jdbcConfigurations","getJdbcConfigurations","msg","$watch","deleteConfiguration","deleteJdbcConfiguration","JdbcCreateCtrl","$location","$window","RDF4JRepositoriesRestService","SparqlRestService","search","getNamespaces","setLoader","getRepositoryNamespaces","usedPrefixes","results","bindings","prefix","namespace","namespaces","repositoryError","loadTab","addKnownPrefixes","page","noPadding","paddingRight","paddingLeft","sqlTypes","currentTabConfig","orientationViewMode","newValue","oldValue","goBack","back","locationChangeListener","isPristine","confirm","showBeforeunloadMessage","confirmExit","returnValue","defaultTabConfig","query","inference","sameAs","isNewConfiguration","isRunning","progressMessage","extraMessage","yasrInnerContainer","getElementById","queryIsRunning","queryStartTime","now","countTimeouted","$$phase","$apply","tabsData","editor","setValue","queryType","resultsCount","allResultsCount","pageSize","timeFinished","timeTook","sizeDelta","canWriteActiveRepo","readOnly","setQueryFromTabConfig","resetYasqeYasr","setQuery","setDirty","getValue","isDefined","getSuggestions","validateQuery","getColumnNames","columns","getColumnsTypeSuggestion","columnTypes","suggestedColumns","columnName","column_name","column_type","nullable","sparql_type","viewMode","getCellContentSQL","yasr","plugin","sparqlVar","context","hasValidQuery","getQueryType","validateDefinition","containsUnknownColumns","validateColumns","resetCurrentTabConfig","saveTab","getJdbcConfiguration","config","goToPage","getColumnsSuggestions","save","createNewJdbcConfiguration","updateJdbcConfiguration","hasPrecision","columnType","containsColumnsWithPrecision","some","hasScale","containsColumnsWithScale","isLiteral","containsNonLiteralColumnsOnly","selectColumnType","prevColumnType","column","columnSuggestion","allowHtml","deleteColumn","getPreview","executedQueryTab","outputType","successCallback","textStatus","jqXhr","plugins","getCellContent","setResponse","setPreviewResult","failCallback","sqlView","getNewSqlTablePreview","done","fail","getExistingSqlTablePreview","getTypeLabel","toUpperCase","configuration","createConfiguration","method","url","column_names","limit","ajax","params","contentType","dataType","Accept","noCancelOnRouteChange"],"mappings":"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","file":"12.f348b65d06b0213c492e.bundle.js","sourcesContent":["import 'angular/core/services';\nimport 'angular/core/directives';\nimport 'angular/resources/controllers';\nimport 'angular/core/services/repositories.service';\nimport 'angular/jdbc/controllers';\nimport 'angular/rest/jdbc.rest.service';\nimport 'angular/core/directives/queryeditor/sparql-tab.directive';\nimport 'angular/core/directives/queryeditor/query-editor.controller';\nimport 'angular/core/directives/queryeditor/query-editor.directive';\n\nconst modules = [\n 'toastr',\n 'ui.bootstrap',\n 'graphdb.framework.jdbc.controllers',\n 'graphdb.framework.core.services.repositories',\n 'graphdb.framework.core.directives',\n 'graphdb.framework.rest.jdbc.service',\n 'graphdb.framework.core.directives.queryeditor.controllers',\n 'graphdb.framework.core.directives.queryeditor.sparqltab',\n 'graphdb.framework.core.directives.queryeditor.queryeditor'\n\n];\n\nangular.module('graphdb.framework.jdbc', modules);\n\n","define(['lib/d3-ONTO-chord-patch'],\n function() {\n /* nvd3 version 1.8.6 (https://github.com/novus/nvd3) 2017-08-23 */\n (function() {\n\n// set up main nv object\n var nv = {};\n\n// the major global objects under the nv namespace\n nv.dev = false; //set false when in production\n nv.tooltip = nv.tooltip || {}; // For the tooltip system\n nv.utils = nv.utils || {}; // Utility subsystem\n nv.models = nv.models || {}; //stores all the possible models/components\n nv.charts = {}; //stores all the ready to use charts\n nv.logs = {}; //stores some statistics and potential error messages\n nv.dom = {}; //DOM manipulation functions\n\n// Node/CommonJS - require D3\n if (typeof (module) !== 'undefined' && typeof (exports) !== 'undefined' && typeof (d3) == 'undefined') {\n d3 = require('d3');\n }\n\n nv.dispatch = d3.dispatch('render_start', 'render_end');\n\n// Function bind polyfill\n// Needed ONLY for phantomJS as it's missing until version 2.0 which is unreleased as of this comment\n// https://github.com/ariya/phantomjs/issues/10522\n// http://kangax.github.io/compat-table/es5/#Function.prototype.bind\n// phantomJS is used for running the test suite\n if (!Function.prototype.bind) {\n Function.prototype.bind = function(oThis) {\n if (typeof this !== 'function') {\n // closest thing possible to the ECMAScript 5 internal IsCallable function\n throw new TypeError('Function.prototype.bind - what is trying to be bound is not callable');\n }\n\n var aArgs = Array.prototype.slice.call(arguments, 1),\n fToBind = this,\n fNOP = function() {\n },\n fBound = function() {\n return fToBind.apply(this instanceof fNOP && oThis\n ? this\n : oThis,\n aArgs.concat(Array.prototype.slice.call(arguments)));\n };\n\n fNOP.prototype = this.prototype;\n fBound.prototype = new fNOP();\n return fBound;\n };\n }\n\n// Development render timers - disabled if dev = false\n if (nv.dev) {\n nv.dispatch.on('render_start', function(e) {\n nv.logs.startTime = +new Date();\n });\n\n nv.dispatch.on('render_end', function(e) {\n nv.logs.endTime = +new Date();\n nv.logs.totalTime = nv.logs.endTime - nv.logs.startTime;\n nv.log('total', nv.logs.totalTime); // used for development, to keep track of graph generation times\n });\n }\n\n// Logs all arguments, and returns the last so you can test things in place\n// Note: in IE8 console.log is an object not a function, and if modernizr is used\n// then calling Function.prototype.bind with with anything other than a function\n// causes a TypeError to be thrown.\n nv.log = function() {\n if (nv.dev && window.console && console.log && console.log.apply) {\n console.log.apply(console, arguments);\n } else if (nv.dev && window.console && typeof console.log == 'function' && Function.prototype.bind) {\n var log = Function.prototype.bind.call(console.log, console);\n log.apply(console, arguments);\n }\n return arguments[arguments.length - 1];\n };\n\n// print console warning, should be used by deprecated functions\n nv.deprecated = function(name, info) {\n if (console && console.warn) {\n console.warn('nvd3 warning: `' + name + '` has been deprecated. ', info || '');\n }\n };\n\n// The nv.render function is used to queue up chart rendering\n// in non-blocking async functions.\n// When all queued charts are done rendering, nv.dispatch.render_end is invoked.\n nv.render = function render(step) {\n // number of graphs to generate in each timeout loop\n step = step || 1;\n\n nv.render.active = true;\n nv.dispatch.render_start();\n\n var renderLoop = function() {\n var chart, graph;\n\n for (var i = 0; i < step && (graph = nv.render.queue[i]); i++) {\n chart = graph.generate();\n if (typeof graph.callback == typeof (Function)) graph.callback(chart);\n }\n\n nv.render.queue.splice(0, i);\n\n if (nv.render.queue.length) {\n setTimeout(renderLoop);\n } else {\n nv.dispatch.render_end();\n nv.render.active = false;\n }\n };\n\n setTimeout(renderLoop);\n };\n\n nv.render.active = false;\n nv.render.queue = [];\n\n /*\n Adds a chart to the async rendering queue. This method can take arguments in two forms:\n nv.addGraph({\n generate: <Function>\n callback: <Function>\n })\n\n or\n\n nv.addGraph(<generate Function>, <callback Function>)\n\n The generate function should contain code that creates the NVD3 model, sets options\n on it, adds data to an SVG element, and invokes the chart model. The generate function\n should return the chart model. See examples/lineChart.html for a usage example.\n\n The callback function is optional, and it is called when the generate function completes.\n */\n nv.addGraph = function(obj) {\n if (typeof arguments[0] === typeof (Function)) {\n obj = {generate: arguments[0], callback: arguments[1]};\n }\n\n nv.render.queue.push(obj);\n\n if (!nv.render.active) {\n nv.render();\n }\n };\n\n// Node/CommonJS exports\n if (typeof (module) !== 'undefined' && typeof (exports) !== 'undefined') {\n module.exports = nv;\n }\n\n if (typeof (window) !== 'undefined') {\n window.nv = nv;\n }\n /* Facade for queueing DOM write operations\n * with Fastdom (https://github.com/wilsonpage/fastdom)\n * if available.\n * This could easily be extended to support alternate\n * implementations in the future.\n */\n nv.dom.write = function(callback) {\n if (window.fastdom !== undefined) {\n return fastdom.mutate(callback);\n }\n return callback();\n };\n\n /* Facade for queueing DOM read operations\n * with Fastdom (https://github.com/wilsonpage/fastdom)\n * if available.\n * This could easily be extended to support alternate\n * implementations in the future.\n */\n nv.dom.read = function(callback) {\n if (window.fastdom !== undefined) {\n return fastdom.measure(callback);\n }\n return callback();\n };\n /* Utility class to handle creation of an interactive layer.\n This places a rectangle on top of the chart. When you mouse move over it, it sends a dispatch\n containing the X-coordinate. It can also render a vertical line where the mouse is located.\n\n dispatch.elementMousemove is the important event to latch onto. It is fired whenever the mouse moves over\n the rectangle. The dispatch is given one object which contains the mouseX/Y location.\n It also has 'pointXValue', which is the conversion of mouseX to the x-axis scale.\n */\n nv.interactiveGuideline = function() {\n 'use strict';\n\n var margin = {left: 0, top: 0} //Pass the chart's top and left magins. Used to calculate the mouseX/Y.\n ,\n width = null\n ,\n height = null\n ,\n xScale = d3.scale.linear()\n ,\n dispatch = d3.dispatch('elementMousemove', 'elementMouseout', 'elementClick', 'elementDblclick', 'elementMouseDown',\n 'elementMouseUp')\n ,\n showGuideLine = true\n ,\n svgContainer = null // Must pass the chart's svg, we'll use its mousemove event.\n ,\n tooltip = nv.models.tooltip()\n ,\n isMSIE = window.ActiveXObject// Checkt if IE by looking for activeX. (excludes IE11)\n ;\n\n tooltip\n .duration(0)\n .hideDelay(0)\n .hidden(false);\n\n function layer(selection) {\n selection.each(function(data) {\n var container = d3.select(this);\n var availableWidth = (width || 960), availableHeight = (height || 400);\n var wrap = container.selectAll('g.nv-wrap.nv-interactiveLineLayer')\n .data([data]);\n var wrapEnter = wrap.enter()\n .append('g').attr('class', ' nv-wrap nv-interactiveLineLayer');\n wrapEnter.append('g').attr('class', 'nv-interactiveGuideLine');\n\n if (!svgContainer) {\n return;\n }\n\n function mouseHandler() {\n var mouseX = d3.event.clientX - this.getBoundingClientRect().left;\n var mouseY = d3.event.clientY - this.getBoundingClientRect().top;\n\n var subtractMargin = true;\n var mouseOutAnyReason = false;\n if (isMSIE) {\n /*\n D3.js (or maybe SVG.getScreenCTM) has a nasty bug in Internet Explorer 10.\n d3.mouse() returns incorrect X,Y mouse coordinates when mouse moving\n over a rect in IE 10.\n However, d3.event.offsetX/Y also returns the mouse coordinates\n relative to the triggering <rect>. So we use offsetX/Y on IE.\n */\n mouseX = d3.event.offsetX;\n mouseY = d3.event.offsetY;\n\n /*\n On IE, if you attach a mouse event listener to the <svg> container,\n it will actually trigger it for all the child elements (like <path>, <circle>, etc).\n When this happens on IE, the offsetX/Y is set to where ever the child element\n is located.\n As a result, we do NOT need to subtract margins to figure out the mouse X/Y\n position under this scenario. Removing the line below *will* cause\n the interactive layer to not work right on IE.\n */\n if (d3.event.target.tagName !== 'svg') {\n subtractMargin = false;\n }\n\n if (d3.event.target.className.baseVal.match('nv-legend')) {\n mouseOutAnyReason = true;\n }\n\n }\n\n if (subtractMargin) {\n mouseX -= margin.left;\n mouseY -= margin.top;\n }\n\n /* If mouseX/Y is outside of the chart's bounds,\n trigger a mouseOut event.\n */\n if (d3.event.type === 'mouseout'\n || mouseX < 0 || mouseY < 0\n || mouseX > availableWidth || mouseY > availableHeight\n || (d3.event.relatedTarget && d3.event.relatedTarget.ownerSVGElement === undefined)\n || mouseOutAnyReason\n ) {\n\n if (isMSIE) {\n if (d3.event.relatedTarget\n && d3.event.relatedTarget.ownerSVGElement === undefined\n && (d3.event.relatedTarget.className === undefined\n || d3.event.relatedTarget.className.match(tooltip.nvPointerEventsClass))) {\n\n return;\n }\n }\n dispatch.elementMouseout({\n mouseX: mouseX,\n mouseY: mouseY\n });\n layer.renderGuideLine(null); //hide the guideline\n tooltip.hidden(true);\n return;\n } else {\n tooltip.hidden(false);\n }\n\n\n var scaleIsOrdinal = typeof xScale.rangeBands === 'function';\n var pointXValue = undefined;\n\n // Ordinal scale has no invert method\n if (scaleIsOrdinal) {\n var elementIndex = d3.bisect(xScale.range(), mouseX) - 1;\n // Check if mouseX is in the range band\n if (xScale.range()[elementIndex] + xScale.rangeBand() >= mouseX) {\n pointXValue = xScale.domain()[d3.bisect(xScale.range(), mouseX) - 1];\n } else {\n dispatch.elementMouseout({\n mouseX: mouseX,\n mouseY: mouseY\n });\n layer.renderGuideLine(null); //hide the guideline\n tooltip.hidden(true);\n return;\n }\n } else {\n pointXValue = xScale.invert(mouseX);\n }\n\n dispatch.elementMousemove({\n mouseX: mouseX,\n mouseY: mouseY,\n pointXValue: pointXValue\n });\n\n //If user double clicks the layer, fire a elementDblclick\n if (d3.event.type === 'dblclick') {\n dispatch.elementDblclick({\n mouseX: mouseX,\n mouseY: mouseY,\n pointXValue: pointXValue\n });\n }\n\n // if user single clicks the layer, fire elementClick\n if (d3.event.type === 'click') {\n dispatch.elementClick({\n mouseX: mouseX,\n mouseY: mouseY,\n pointXValue: pointXValue\n });\n }\n\n // if user presses mouse down the layer, fire elementMouseDown\n if (d3.event.type === 'mousedown') {\n dispatch.elementMouseDown({\n mouseX: mouseX,\n mouseY: mouseY,\n pointXValue: pointXValue\n });\n }\n\n // if user presses mouse down the layer, fire elementMouseUp\n if (d3.event.type === 'mouseup') {\n dispatch.elementMouseUp({\n mouseX: mouseX,\n mouseY: mouseY,\n pointXValue: pointXValue\n });\n }\n }\n\n svgContainer\n .on('touchmove', mouseHandler)\n .on('mousemove', mouseHandler, true)\n .on('mouseout', mouseHandler, true)\n .on('mousedown', mouseHandler, true)\n .on('mouseup', mouseHandler, true)\n .on('dblclick', mouseHandler)\n .on('click', mouseHandler)\n ;\n\n layer.guideLine = null;\n //Draws a vertical guideline at the given X postion.\n layer.renderGuideLine = function(x) {\n if (!showGuideLine) return;\n if (layer.guideLine && layer.guideLine.attr('x1') === x) return;\n nv.dom.write(function() {\n var line = wrap.select('.nv-interactiveGuideLine')\n .selectAll('line')\n .data((x != null) ? [nv.utils.NaNtoZero(x)] : [], String);\n line.enter()\n .append('line')\n .attr('class', 'nv-guideline')\n .attr('x1', function(d) {\n return d;\n })\n .attr('x2', function(d) {\n return d;\n })\n .attr('y1', availableHeight)\n .attr('y2', 0);\n line.exit().remove();\n });\n };\n });\n }\n\n layer.dispatch = dispatch;\n layer.tooltip = tooltip;\n\n layer.margin = function(_) {\n if (!arguments.length) return margin;\n margin.top = typeof _.top != 'undefined' ? _.top : margin.top;\n margin.left = typeof _.left != 'undefined' ? _.left : margin.left;\n return layer;\n };\n\n layer.width = function(_) {\n if (!arguments.length) return width;\n width = _;\n return layer;\n };\n\n layer.height = function(_) {\n if (!arguments.length) return height;\n height = _;\n return layer;\n };\n\n layer.xScale = function(_) {\n if (!arguments.length) return xScale;\n xScale = _;\n return layer;\n };\n\n layer.showGuideLine = function(_) {\n if (!arguments.length) return showGuideLine;\n showGuideLine = _;\n return layer;\n };\n\n layer.svgContainer = function(_) {\n if (!arguments.length) return svgContainer;\n svgContainer = _;\n return layer;\n };\n\n return layer;\n };\n\n /* Utility class that uses d3.bisect to find the index in a given array, where a search value can be inserted.\n This is different from normal bisectLeft; this function finds the nearest index to insert the search value.\n\n For instance, lets say your array is [1,2,3,5,10,30], and you search for 28.\n Normal d3.bisectLeft will return 4, because 28 is inserted after the number 10. But interactiveBisect will return 5\n because 28 is closer to 30 than 10.\n\n Unit tests can be found in: interactiveBisectTest.html\n\n Has the following known issues:\n * Will not work if the data points move backwards (ie, 10,9,8,7, etc) or if the data points are in random order.\n * Won't work if there are duplicate x coordinate values.\n */\n nv.interactiveBisect = function(values, searchVal, xAccessor) {\n 'use strict';\n if (!(values instanceof Array)) {\n return null;\n }\n var _xAccessor;\n if (typeof xAccessor !== 'function') {\n _xAccessor = function(d) {\n return d.x;\n };\n } else {\n _xAccessor = xAccessor;\n }\n var _cmp = function(d, v) {\n // Accessors are no longer passed the index of the element along with\n // the element itself when invoked by d3.bisector.\n //\n // Starting at D3 v3.4.4, d3.bisector() started inspecting the\n // function passed to determine if it should consider it an accessor\n // or a comparator. This meant that accessors that take two arguments\n // (expecting an index as the second parameter) are treated as\n // comparators where the second argument is the search value against\n // which the first argument is compared.\n return _xAccessor(d) - v;\n };\n\n var bisect = d3.bisector(_cmp).left;\n var index = d3.max([0, bisect(values, searchVal) - 1]);\n var currentValue = _xAccessor(values[index]);\n\n if (typeof currentValue === 'undefined') {\n currentValue = index;\n }\n\n if (currentValue === searchVal) {\n return index; //found exact match\n }\n\n var nextIndex = d3.min([index + 1, values.length - 1]);\n var nextValue = _xAccessor(values[nextIndex]);\n\n if (typeof nextValue === 'undefined') {\n nextValue = nextIndex;\n }\n\n if (Math.abs(nextValue - searchVal) >= Math.abs(currentValue - searchVal)) {\n return index;\n } else {\n return nextIndex;\n }\n };\n\n /*\n Returns the index in the array \"values\" that is closest to searchVal.\n Only returns an index if searchVal is within some \"threshold\".\n Otherwise, returns null.\n */\n nv.nearestValueIndex = function(values, searchVal, threshold) {\n 'use strict';\n var yDistMax = Infinity, indexToHighlight = null;\n values.forEach(function(d, i) {\n var delta = Math.abs(searchVal - d);\n if (d != null && delta <= yDistMax && delta < threshold) {\n yDistMax = delta;\n indexToHighlight = i;\n }\n });\n return indexToHighlight;\n };\n\n /* Model which can be instantiated to handle tooltip rendering.\n Example usage:\n var tip = nv.models.tooltip().gravity('w').distance(23)\n .data(myDataObject);\n\n tip(); //just invoke the returned function to render tooltip.\n */\n nv.models.tooltip = function() {\n 'use strict';\n\n /*\n Tooltip data. If data is given in the proper format, a consistent tooltip is generated.\n Example Format of data:\n {\n key: \"Date\",\n value: \"August 2009\",\n series: [\n {key: \"Series 1\", value: \"Value 1\", color: \"#000\"},\n {key: \"Series 2\", value: \"Value 2\", color: \"#00f\"}\n ]\n }\n */\n var id = 'nvtooltip-' + Math.floor(Math.random() * 100000) // Generates a unique id when you create a new tooltip() object.\n , data = null\n , gravity = 'w' // Can be 'n','s','e','w'. Determines how tooltip is positioned.\n , distance = 25 // Distance to offset tooltip from the mouse location.\n , snapDistance = 0 // Tolerance allowed before tooltip is moved from its current position (creates 'snapping' effect)\n , classes = null // Attaches additional CSS classes to the tooltip DIV that is created.\n , hidden = true // Start off hidden, toggle with hide/show functions below.\n , hideDelay = 200 // Delay (in ms) before the tooltip hides after calling hide().\n , tooltip = null // d3 select of the tooltip div.\n , lastPosition = {left: null, top: null} // Last position the tooltip was in.\n , enabled = true // True -> tooltips are rendered. False -> don't render tooltips.\n , duration = 100 // Tooltip movement duration, in ms.\n , headerEnabled = true // If is to show the tooltip header.\n , nvPointerEventsClass = 'nv-pointer-events-none' // CSS class to specify whether element should not have mouse events.\n ;\n\n // Format function for the tooltip values column.\n // d is value,\n // i is series index\n // p is point containing the value\n var valueFormatter = function(d, i, p) {\n return d;\n };\n\n // Format function for the tooltip header value.\n var headerFormatter = function(d) {\n return d;\n };\n\n var keyFormatter = function(d, i) {\n return d;\n };\n\n // By default, the tooltip model renders a beautiful table inside a DIV, returned as HTML\n // You can override this function if a custom tooltip is desired. For instance, you could directly manipulate\n // the DOM by accessing elem and returning false.\n var contentGenerator = function(d, elem) {\n if (d === null) {\n return '';\n }\n\n var table = d3.select(document.createElement('table'));\n if (headerEnabled) {\n var theadEnter = table.selectAll('thead')\n .data([d])\n .enter().append('thead');\n\n theadEnter.append('tr')\n .append('td')\n .attr('colspan', 3)\n .append('strong')\n .classed('x-value', true)\n .html(headerFormatter(d.value));\n }\n\n var tbodyEnter = table.selectAll('tbody')\n .data([d])\n .enter().append('tbody');\n\n var trowEnter = tbodyEnter.selectAll('tr')\n .data(function(p) {\n return p.series;\n })\n .enter()\n .append('tr')\n .classed('highlight', function(p) {\n return p.highlight;\n });\n\n trowEnter.append('td')\n .classed('legend-color-guide', true)\n .append('div')\n .style('background-color', function(p) {\n return p.color;\n });\n\n trowEnter.append('td')\n .classed('key', true)\n .classed('total', function(p) {\n return !!p.total;\n })\n .html(function(p, i) {\n return keyFormatter(p.key, i);\n });\n\n trowEnter.append('td')\n .classed('value', true)\n .html(function(p, i) {\n return valueFormatter(p.value, i, p);\n });\n\n trowEnter.filter(function(p, i) {\n return p.percent !== undefined;\n }).append('td')\n .classed('percent', true)\n .html(function(p, i) {\n return '(' + d3.format('%')(p.percent) + ')';\n });\n\n trowEnter.selectAll('td').each(function(p) {\n if (p.highlight) {\n var opacityScale = d3.scale.linear().domain([0, 1]).range(['#fff', p.color]);\n var opacity = 0.6;\n d3.select(this)\n .style('border-bottom-color', opacityScale(opacity))\n .style('border-top-color', opacityScale(opacity))\n ;\n }\n });\n\n var html = table.node().outerHTML;\n if (d.footer !== undefined) {\n html += '<div class=\\'footer\\'>' + d.footer + '</div>';\n }\n return html;\n\n };\n\n /*\n Function that returns the position (relative to the viewport/document.body)\n the tooltip should be placed in.\n Should return: {\n left: <leftPos>,\n top: <topPos>\n }\n */\n var position = function() {\n var pos = {\n left: d3.event !== null ? d3.event.clientX : 0,\n top: d3.event !== null ? d3.event.clientY : 0\n };\n\n if (getComputedStyle(document.body).transform != 'none') {\n // Take the offset into account, as now the tooltip is relative\n // to document.body.\n var client = document.body.getBoundingClientRect();\n pos.left -= client.left;\n pos.top -= client.top;\n }\n\n return pos;\n };\n\n var dataSeriesExists = function(d) {\n if (d && d.series) {\n if (nv.utils.isArray(d.series)) {\n return true;\n }\n // if object, it's okay just convert to array of the object\n if (nv.utils.isObject(d.series)) {\n d.series = [d.series];\n return true;\n }\n }\n return false;\n };\n\n // Calculates the gravity offset of the tooltip. Parameter is position of tooltip\n // relative to the viewport.\n var calcGravityOffset = function(pos) {\n var height = tooltip.node().offsetHeight,\n width = tooltip.node().offsetWidth,\n clientWidth = document.documentElement.clientWidth, // Don't want scrollbars.\n clientHeight = document.documentElement.clientHeight, // Don't want scrollbars.\n left, top, tmp;\n\n // calculate position based on gravity\n switch (gravity) {\n case 'e':\n left = -width - distance;\n top = -(height / 2);\n if (pos.left + left < 0) left = distance;\n if ((tmp = pos.top + top) < 0) top -= tmp;\n if ((tmp = pos.top + top + height) > clientHeight) top -= tmp - clientHeight;\n break;\n case 'w':\n left = distance;\n top = -(height / 2);\n if (pos.left + left + width > clientWidth) left = -width - distance;\n if ((tmp = pos.top + top) < 0) top -= tmp;\n if ((tmp = pos.top + top + height) > clientHeight) top -= tmp - clientHeight;\n break;\n case 'n':\n left = -(width / 2) - 5; // - 5 is an approximation of the mouse's height.\n top = distance;\n if (pos.top + top + height > clientHeight) top = -height - distance;\n if ((tmp = pos.left + left) < 0) left -= tmp;\n if ((tmp = pos.left + left + width) > clientWidth) left -= tmp - clientWidth;\n break;\n case 's':\n left = -(width / 2);\n top = -height - distance;\n if (pos.top + top < 0) top = distance;\n if ((tmp = pos.left + left) < 0) left -= tmp;\n if ((tmp = pos.left + left + width) > clientWidth) left -= tmp - clientWidth;\n break;\n case 'center':\n left = -(width / 2);\n top = -(height / 2);\n break;\n default:\n left = 0;\n top = 0;\n break;\n }\n\n return {'left': left, 'top': top};\n };\n\n /*\n Positions the tooltip in the correct place, as given by the position() function.\n */\n var positionTooltip = function() {\n nv.dom.read(function() {\n var pos = position(),\n gravityOffset = calcGravityOffset(pos),\n left = pos.left + gravityOffset.left,\n top = pos.top + gravityOffset.top;\n\n // delay hiding a bit to avoid flickering\n if (hidden) {\n tooltip\n .interrupt()\n .transition()\n .delay(hideDelay)\n .duration(0)\n .style('opacity', 0);\n } else {\n // using tooltip.style('transform') returns values un-usable for tween\n var old_translate = 'translate(' + lastPosition.left + 'px, ' + lastPosition.top + 'px)';\n var new_translate = 'translate(' + Math.round(left) + 'px, ' + Math.round(top) + 'px)';\n var translateInterpolator = d3.interpolateString(old_translate, new_translate);\n var is_hidden = tooltip.style('opacity') < 0.1;\n\n tooltip\n .interrupt() // cancel running transitions\n .transition()\n .duration(is_hidden ? 0 : duration)\n // using tween since some versions of d3 can't auto-tween a translate on a div\n .styleTween('transform', function(d) {\n return translateInterpolator;\n }, 'important')\n // Safari has its own `-webkit-transform` and does not support `transform`\n .styleTween('-webkit-transform', function(d) {\n return translateInterpolator;\n })\n .style('-ms-transform', new_translate)\n .style('opacity', 1);\n }\n\n lastPosition.left = left;\n lastPosition.top = top;\n });\n };\n\n // Creates new tooltip container, or uses existing one on DOM.\n function initTooltip() {\n if (!tooltip || !tooltip.node()) {\n // Create new tooltip div if it doesn't exist on DOM.\n\n var data = [1];\n tooltip = d3.select(document.body).select('#' + id).data(data);\n\n tooltip.enter().append('div')\n .attr('class', 'nvtooltip ' + (classes ? classes : 'xy-tooltip'))\n .attr('id', id)\n .style('top', 0).style('left', 0)\n .style('opacity', 0)\n .style('position', 'fixed')\n .selectAll('div, table, td, tr').classed(nvPointerEventsClass, true)\n .classed(nvPointerEventsClass, true);\n\n tooltip.exit().remove();\n }\n }\n\n // Draw the tooltip onto the DOM.\n function nvtooltip() {\n if (!enabled) return;\n if (!dataSeriesExists(data)) return;\n\n nv.dom.write(function() {\n initTooltip();\n // Generate data and set it into tooltip.\n // Bonus - If you override contentGenerator and return false, you can use something like\n // Angular, React or Knockout to bind the data for your tooltip directly to the DOM.\n var newContent = contentGenerator(data, tooltip.node());\n if (newContent) {\n tooltip.node().innerHTML = newContent;\n }\n\n positionTooltip();\n });\n\n return nvtooltip;\n }\n\n nvtooltip.nvPointerEventsClass = nvPointerEventsClass;\n nvtooltip.options = nv.utils.optionsFunc.bind(nvtooltip);\n\n nvtooltip._options = Object.create({}, {\n // simple read/write options\n duration: {\n get: function() {\n return duration;\n }, set: function(_) {\n duration = _;\n }\n },\n gravity: {\n get: function() {\n return gravity;\n }, set: function(_) {\n gravity = _;\n }\n },\n distance: {\n get: function() {\n return distance;\n }, set: function(_) {\n distance = _;\n }\n },\n snapDistance: {\n get: function() {\n return snapDistance;\n }, set: function(_) {\n snapDistance = _;\n }\n },\n classes: {\n get: function() {\n return classes;\n }, set: function(_) {\n classes = _;\n }\n },\n enabled: {\n get: function() {\n return enabled;\n }, set: function(_) {\n enabled = _;\n }\n },\n hideDelay: {\n get: function() {\n return hideDelay;\n }, set: function(_) {\n hideDelay = _;\n }\n },\n contentGenerator: {\n get: function() {\n return contentGenerator;\n }, set: function(_) {\n contentGenerator = _;\n }\n },\n valueFormatter: {\n get: function() {\n return valueFormatter;\n }, set: function(_) {\n valueFormatter = _;\n }\n },\n headerFormatter: {\n get: function() {\n return headerFormatter;\n }, set: function(_) {\n headerFormatter = _;\n }\n },\n keyFormatter: {\n get: function() {\n return keyFormatter;\n }, set: function(_) {\n keyFormatter = _;\n }\n },\n headerEnabled: {\n get: function() {\n return headerEnabled;\n }, set: function(_) {\n headerEnabled = _;\n }\n },\n position: {\n get: function() {\n return position;\n }, set: function(_) {\n position = _;\n }\n },\n\n // Deprecated options\n chartContainer: {\n get: function() {\n return document.body;\n }, set: function(_) {\n // deprecated after 1.8.3\n nv.deprecated('chartContainer', 'feature removed after 1.8.3');\n }\n },\n fixedTop: {\n get: function() {\n return null;\n }, set: function(_) {\n // deprecated after 1.8.1\n nv.deprecated('fixedTop', 'feature removed after 1.8.1');\n }\n },\n offset: {\n get: function() {\n return {left: 0, top: 0};\n }, set: function(_) {\n // deprecated after 1.8.1\n nv.deprecated('offset', 'use chart.tooltip.distance() instead');\n }\n },\n\n // options with extra logic\n hidden: {\n get: function() {\n return hidden;\n }, set: function(_) {\n if (hidden != _) {\n hidden = !!_;\n nvtooltip();\n }\n }\n },\n data: {\n get: function() {\n return data;\n }, set: function(_) {\n // if showing a single data point, adjust data format with that\n if (_.point) {\n _.value = _.point.x;\n _.series = _.series || {};\n _.series.value = _.point.y;\n _.series.color = _.point.color || _.series.color;\n }\n data = _;\n }\n },\n\n // read only properties\n node: {\n get: function() {\n return tooltip.node();\n }, set: function(_) {\n }\n },\n id: {\n get: function() {\n return id;\n }, set: function(_) {\n }\n }\n });\n\n nv.utils.initOptions(nvtooltip);\n return nvtooltip;\n };\n\n\n /*\n Gets the browser window size\n\n Returns object with height and width properties\n */\n nv.utils.windowSize = function() {\n // Sane defaults\n var size = {width: 640, height: 480};\n\n // Most recent browsers use\n if (window.innerWidth && window.innerHeight) {\n size.width = window.innerWidth;\n size.height = window.innerHeight;\n return (size);\n }\n\n // IE can use depending on mode it is in\n if (document.compatMode == 'CSS1Compat' &&\n document.documentElement &&\n document.documentElement.offsetWidth) {\n\n size.width = document.documentElement.offsetWidth;\n size.height = document.documentElement.offsetHeight;\n return (size);\n }\n\n // Earlier IE uses Doc.body\n if (document.body && document.body.offsetWidth) {\n size.width = document.body.offsetWidth;\n size.height = document.body.offsetHeight;\n return (size);\n }\n\n return (size);\n };\n\n\n /* handle dumb browser quirks... isinstance breaks if you use frames\n typeof returns 'object' for null, NaN is a number, etc.\n */\n nv.utils.isArray = Array.isArray;\n nv.utils.isObject = function(a) {\n return a !== null && typeof a === 'object';\n };\n nv.utils.isFunction = function(a) {\n return typeof a === 'function';\n };\n nv.utils.isDate = function(a) {\n return toString.call(a) === '[object Date]';\n };\n nv.utils.isNumber = function(a) {\n return !isNaN(a) && typeof a === 'number';\n };\n\n\n /*\n Binds callback function to run when window is resized\n */\n nv.utils.windowResize = function(handler) {\n if (window.addEventListener) {\n window.addEventListener('resize', handler);\n } else {\n nv.log('ERROR: Failed to bind to window.resize with: ', handler);\n }\n // return object with clear function to remove the single added callback.\n return {\n callback: handler,\n clear: function() {\n window.removeEventListener('resize', handler);\n }\n };\n };\n\n\n /*\n Backwards compatible way to implement more d3-like coloring of graphs.\n Can take in nothing, an array, or a function/scale\n To use a normal scale, get the range and pass that because we must be able\n to take two arguments and use the index to keep backward compatibility\n */\n nv.utils.getColor = function(color) {\n //if you pass in nothing, get default colors back\n if (color === undefined) {\n return nv.utils.defaultColor();\n\n //if passed an array, turn it into a color scale\n } else if (nv.utils.isArray(color)) {\n var color_scale = d3.scale.ordinal().range(color);\n return function(d, i) {\n var key = i === undefined ? d : i;\n return d.color || color_scale(key);\n };\n\n //if passed a function or scale, return it, or whatever it may be\n //external libs, such as angularjs-nvd3-directives use this\n } else {\n //can't really help it if someone passes rubbish as color\n return color;\n }\n };\n\n\n /*\n Default color chooser uses a color scale of 20 colors from D3\n https://github.com/mbostock/d3/wiki/Ordinal-Scales#categorical-colors\n */\n nv.utils.defaultColor = function() {\n // get range of the scale so we'll turn it into our own function.\n return nv.utils.getColor(d3.scale.category20().range());\n };\n\n\n /*\n Returns a color function that takes the result of 'getKey' for each series and\n looks for a corresponding color from the dictionary\n */\n nv.utils.customTheme = function(dictionary, getKey, defaultColors) {\n // use default series.key if getKey is undefined\n getKey = getKey || function(series) {\n return series.key;\n };\n defaultColors = defaultColors || d3.scale.category20().range();\n\n // start at end of default color list and walk back to index 0\n var defIndex = defaultColors.length;\n\n return function(series, index) {\n var key = getKey(series);\n if (nv.utils.isFunction(dictionary[key])) {\n return dictionary[key]();\n } else if (dictionary[key] !== undefined) {\n return dictionary[key];\n } else {\n // no match in dictionary, use a default color\n if (!defIndex) {\n // used all the default colors, start over\n defIndex = defaultColors.length;\n }\n defIndex = defIndex - 1;\n return defaultColors[defIndex];\n }\n };\n };\n\n\n /*\n From the PJAX example on d3js.org, while this is not really directly needed\n it's a very cool method for doing pjax, I may expand upon it a little bit,\n open to suggestions on anything that may be useful\n */\n nv.utils.pjax = function(links, content) {\n\n var load = function(href) {\n d3.html(href, function(fragment) {\n var target = d3.select(content).node();\n target.parentNode.replaceChild(\n d3.select(fragment).select(content).node(),\n target);\n nv.utils.pjax(links, content);\n });\n };\n\n d3.selectAll(links).on('click', function() {\n history.pushState(this.href, this.textContent, this.href);\n load(this.href);\n d3.event.preventDefault();\n });\n\n d3.select(window).on('popstate', function() {\n if (d3.event.state) {\n load(d3.event.state);\n }\n });\n };\n\n\n /*\n For when we want to approximate the width in pixels for an SVG:text element.\n Most common instance is when the element is in a display:none; container.\n Forumla is : text.length * font-size * constant_factor\n */\n nv.utils.calcApproxTextWidth = function(svgTextElem) {\n if (nv.utils.isFunction(svgTextElem.style) && nv.utils.isFunction(svgTextElem.text)) {\n var fontSize = parseInt(svgTextElem.style('font-size').replace('px', ''), 10);\n var textLength = svgTextElem.text().length;\n return nv.utils.NaNtoZero(textLength * fontSize * 0.5);\n }\n return 0;\n };\n\n\n /*\n Numbers that are undefined, null or NaN, convert them to zeros.\n */\n nv.utils.NaNtoZero = function(n) {\n if (!nv.utils.isNumber(n)\n || isNaN(n)\n || n === null\n || n === Infinity\n || n === -Infinity) {\n\n return 0;\n }\n return n;\n };\n\n /*\n Add a way to watch for d3 transition ends to d3\n */\n d3.selection.prototype.watchTransition = function(renderWatch) {\n var args = [this].concat([].slice.call(arguments, 1));\n return renderWatch.transition.apply(renderWatch, args);\n };\n\n\n /*\n Helper object to watch when d3 has rendered something\n */\n nv.utils.renderWatch = function(dispatch, duration) {\n if (!(this instanceof nv.utils.renderWatch)) {\n return new nv.utils.renderWatch(dispatch, duration);\n }\n\n var _duration = duration !== undefined ? duration : 250;\n var renderStack = [];\n var self = this;\n\n this.models = function(models) {\n models = [].slice.call(arguments, 0);\n models.forEach(function(model) {\n model.__rendered = false;\n (function(m) {\n m.dispatch.on('renderEnd', function(arg) {\n m.__rendered = true;\n self.renderEnd('model');\n });\n })(model);\n\n if (renderStack.indexOf(model) < 0) {\n renderStack.push(model);\n }\n });\n return this;\n };\n\n this.reset = function(duration) {\n if (duration !== undefined) {\n _duration = duration;\n }\n renderStack = [];\n };\n\n this.transition = function(selection, args, duration) {\n args = arguments.length > 1 ? [].slice.call(arguments, 1) : [];\n\n if (args.length > 1) {\n duration = args.pop();\n } else {\n duration = _duration !== undefined ? _duration : 250;\n }\n selection.__rendered = false;\n\n if (renderStack.indexOf(selection) < 0) {\n renderStack.push(selection);\n }\n\n if (duration === 0) {\n selection.__rendered = true;\n selection.delay = function() {\n return this;\n };\n selection.duration = function() {\n return this;\n };\n return selection;\n } else {\n if (selection.length === 0) {\n selection.__rendered = true;\n } else if (selection.every(function(d) {\n return !d.length;\n })) {\n selection.__rendered = true;\n } else {\n selection.__rendered = false;\n }\n\n var n = 0;\n return selection\n .transition()\n .duration(duration)\n .each(function() {\n ++n;\n })\n .each('end', function(d, i) {\n if (--n === 0) {\n selection.__rendered = true;\n self.renderEnd.apply(this, args);\n }\n });\n }\n };\n\n this.renderEnd = function() {\n if (renderStack.every(function(d) {\n return d.__rendered;\n })) {\n renderStack.forEach(function(d) {\n d.__rendered = false;\n });\n dispatch.renderEnd.apply(this, arguments);\n }\n };\n\n };\n\n\n /*\n Takes multiple objects and combines them into the first one (dst)\n example: nv.utils.deepExtend({a: 1}, {a: 2, b: 3}, {c: 4});\n gives: {a: 2, b: 3, c: 4}\n */\n nv.utils.deepExtend = function(dst) {\n var sources = arguments.length > 1 ? [].slice.call(arguments, 1) : [];\n sources.forEach(function(source) {\n for (var key in source) {\n var isArray = nv.utils.isArray(dst[key]);\n var isObject = nv.utils.isObject(dst[key]);\n var srcObj = nv.utils.isObject(source[key]);\n\n if (isObject && !isArray && srcObj) {\n nv.utils.deepExtend(dst[key], source[key]);\n } else {\n dst[key] = source[key];\n }\n }\n });\n };\n\n\n /*\n state utility object, used to track d3 states in the models\n */\n nv.utils.state = function() {\n if (!(this instanceof nv.utils.state)) {\n return new nv.utils.state();\n }\n var state = {};\n var _self = this;\n var _setState = function() {\n };\n var _getState = function() {\n return {};\n };\n var init = null;\n var changed = null;\n\n this.dispatch = d3.dispatch('change', 'set');\n\n this.dispatch.on('set', function(state) {\n _setState(state, true);\n });\n\n this.getter = function(fn) {\n _getState = fn;\n return this;\n };\n\n this.setter = function(fn, callback) {\n if (!callback) {\n callback = function() {\n };\n }\n _setState = function(state, update) {\n fn(state);\n if (update) {\n callback();\n }\n };\n return this;\n };\n\n this.init = function(state) {\n init = init || {};\n nv.utils.deepExtend(init, state);\n };\n\n var _set = function() {\n var settings = _getState();\n\n if (JSON.stringify(settings) === JSON.stringify(state)) {\n return false;\n }\n\n for (var key in settings) {\n if (state[key] === undefined) {\n state[key] = {};\n }\n state[key] = settings[key];\n changed = true;\n }\n return true;\n };\n\n this.update = function() {\n if (init) {\n _setState(init, false);\n init = null;\n }\n if (_set.call(this)) {\n this.dispatch.change(state);\n }\n };\n\n };\n\n\n /*\n Snippet of code you can insert into each nv.models.* to give you the ability to\n do things like:\n chart.options({\n showXAxis: true,\n tooltips: true\n });\n\n To enable in the chart:\n chart.options = nv.utils.optionsFunc.bind(chart);\n */\n nv.utils.optionsFunc = function(args) {\n if (args) {\n d3.map(args).forEach((function(key, value) {\n if (nv.utils.isFunction(this[key])) {\n this[key](value);\n }\n }).bind(this));\n }\n return this;\n };\n\n\n /*\n numTicks: requested number of ticks\n data: the chart data\n\n returns the number of ticks to actually use on X axis, based on chart data\n to avoid duplicate ticks with the same value\n */\n nv.utils.calcTicksX = function(numTicks, data) {\n // find max number of values from all data streams\n var numValues = 1;\n var i = 0;\n for (i; i < data.length; i += 1) {\n var stream_len = data[i] && data[i].values ? data[i].values.length : 0;\n numValues = stream_len > numValues ? stream_len : numValues;\n }\n nv.log('Requested number of ticks: ', numTicks);\n nv.log('Calculated max values to be: ', numValues);\n // make sure we don't have more ticks than values to avoid duplicates\n numTicks = numTicks > numValues ? numTicks = numValues - 1 : numTicks;\n // make sure we have at least one tick\n numTicks = numTicks < 1 ? 1 : numTicks;\n // make sure it's an integer\n numTicks = Math.floor(numTicks);\n nv.log('Calculating tick count as: ', numTicks);\n return numTicks;\n };\n\n\n /*\n returns number of ticks to actually use on Y axis, based on chart data\n */\n nv.utils.calcTicksY = function(numTicks, data) {\n // currently uses the same logic but we can adjust here if needed later\n return nv.utils.calcTicksX(numTicks, data);\n };\n\n\n /*\n Add a particular option from an options object onto chart\n Options exposed on a chart are a getter/setter function that returns chart\n on set to mimic typical d3 option chaining, e.g. svg.option1('a').option2('b');\n\n option objects should be generated via Object.create() to provide\n the option of manipulating data via get/set functions.\n */\n nv.utils.initOption = function(chart, name) {\n // if it's a call option, just call it directly, otherwise do get/set\n if (chart._calls && chart._calls[name]) {\n chart[name] = chart._calls[name];\n } else {\n chart[name] = function(_) {\n if (!arguments.length) return chart._options[name];\n chart._overrides[name] = true;\n chart._options[name] = _;\n return chart;\n };\n // calling the option as _option will ignore if set by option already\n // so nvd3 can set options internally but the stop if set manually\n chart['_' + name] = function(_) {\n if (!arguments.length) return chart._options[name];\n if (!chart._overrides[name]) {\n chart._options[name] = _;\n }\n return chart;\n };\n }\n };\n\n\n /*\n Add all options in an options object to the chart\n */\n nv.utils.initOptions = function(chart) {\n chart._overrides = chart._overrides || {};\n var ops = Object.getOwnPropertyNames(chart._options || {});\n var calls = Object.getOwnPropertyNames(chart._calls || {});\n ops = ops.concat(calls);\n for (var i in ops) {\n nv.utils.initOption(chart, ops[i]);\n }\n };\n\n\n /*\n Inherit options from a D3 object\n d3.rebind makes calling the function on target actually call it on source\n Also use _d3options so we can track what we inherit for documentation and chained inheritance\n */\n nv.utils.inheritOptionsD3 = function(target, d3_source, oplist) {\n target._d3options = oplist.concat(target._d3options || []);\n // Find unique d3 options (string) and update d3options\n target._d3options = (target._d3options || []).filter(function(item, i, ar) {\n return ar.indexOf(item) === i;\n });\n oplist.unshift(d3_source);\n oplist.unshift(target);\n d3.rebind.apply(this, oplist);\n };\n\n\n /*\n Remove duplicates from an array\n */\n nv.utils.arrayUnique = function(a) {\n return a.sort().filter(function(item, pos) {\n return !pos || item != a[pos - 1];\n });\n };\n\n\n /*\n Keeps a list of custom symbols to draw from in addition to d3.svg.symbol\n Necessary since d3 doesn't let you extend its list -_-\n Add new symbols by doing nv.utils.symbols.set('name', function(size){...});\n */\n nv.utils.symbolMap = d3.map();\n\n\n /*\n Replaces d3.svg.symbol so that we can look both there and our own map\n */\n nv.utils.symbol = function() {\n var type,\n size = 64;\n\n function symbol(d, i) {\n var t = type.call(this, d, i);\n var s = size.call(this, d, i);\n if (d3.svg.symbolTypes.indexOf(t) !== -1) {\n return d3.svg.symbol().type(t).size(s)();\n } else {\n return nv.utils.symbolMap.get(t)(s);\n }\n }\n\n symbol.type = function(_) {\n if (!arguments.length) return type;\n type = d3.functor(_);\n return symbol;\n };\n symbol.size = function(_) {\n if (!arguments.length) return size;\n size = d3.functor(_);\n return symbol;\n };\n return symbol;\n };\n\n\n /*\n Inherit option getter/setter functions from source to target\n d3.rebind makes calling the function on target actually call it on source\n Also track via _inherited and _d3options so we can track what we inherit\n for documentation generation purposes and chained inheritance\n */\n nv.utils.inheritOptions = function(target, source) {\n // inherit all the things\n var ops = Object.getOwnPropertyNames(source._options || {});\n var calls = Object.getOwnPropertyNames(source._calls || {});\n var inherited = source._inherited || [];\n var d3ops = source._d3options || [];\n var args = ops.concat(calls).concat(inherited).concat(d3ops);\n args.unshift(source);\n args.unshift(target);\n d3.rebind.apply(this, args);\n // pass along the lists to keep track of them, don't allow duplicates\n target._inherited = nv.utils.arrayUnique(ops.concat(calls).concat(inherited).concat(ops).concat(target._inherited || []));\n target._d3options = nv.utils.arrayUnique(d3ops.concat(target._d3options || []));\n };\n\n\n /*\n Runs common initialize code on the svg before the chart builds\n */\n nv.utils.initSVG = function(svg) {\n svg.classed({'nvd3-svg': true});\n };\n\n\n /*\n Sanitize and provide default for the container height.\n */\n nv.utils.sanitizeHeight = function(height, container) {\n return (height || parseInt(container.style('height'), 10) || 400);\n };\n\n\n /*\n Sanitize and provide default for the container width.\n */\n nv.utils.sanitizeWidth = function(width, container) {\n return (width || parseInt(container.style('width'), 10) || 960);\n };\n\n\n /*\n Calculate the available height for a chart.\n */\n nv.utils.availableHeight = function(height, container, margin) {\n return Math.max(0, nv.utils.sanitizeHeight(height, container) - margin.top - margin.bottom);\n };\n\n /*\n Calculate the available width for a chart.\n */\n nv.utils.availableWidth = function(width, container, margin) {\n return Math.max(0, nv.utils.sanitizeWidth(width, container) - margin.left - margin.right);\n };\n\n /*\n Clear any rendered chart components and display a chart's 'noData' message\n */\n nv.utils.noData = function(chart, container) {\n var opt = chart.options(),\n margin = opt.margin(),\n noData = opt.noData(),\n data = (noData == null) ? ['No Data Available.'] : [noData],\n height = nv.utils.availableHeight(null, container, margin),\n width = nv.utils.availableWidth(null, container, margin),\n x = margin.left + width / 2,\n y = margin.top + height / 2;\n\n //Remove any previously created chart components\n container.selectAll('g').remove();\n\n var noDataText = container.selectAll('.nv-noData').data(data);\n\n noDataText.enter().append('text')\n .attr('class', 'nvd3 nv-noData')\n .attr('dy', '-.7em')\n .style('text-anchor', 'middle');\n\n noDataText\n .attr('x', x)\n .attr('y', y)\n .text(function(t) {\n return t;\n });\n };\n\n /*\n Wrap long labels.\n */\n nv.utils.wrapTicks = function(text, width) {\n text.each(function() {\n var text = d3.select(this),\n words = text.text().split(/\\s+/).reverse(),\n word,\n line = [],\n lineNumber = 0,\n lineHeight = 1.1,\n y = text.attr('y'),\n dy = parseFloat(text.attr('dy')),\n tspan = text.text(null).append('tspan').attr('x', 0).attr('y', y).attr('dy', dy + 'em');\n while (word = words.pop()) {\n line.push(word);\n tspan.text(line.join(' '));\n if (tspan.node().getComputedTextLength() > width) {\n line.pop();\n tspan.text(line.join(' '));\n line = [word];\n tspan = text.append('tspan').attr('x', 0).attr('y', y).attr('dy', ++lineNumber * lineHeight + dy + 'em').text(\n word);\n }\n }\n });\n };\n\n /*\n Check equality of 2 array\n */\n nv.utils.arrayEquals = function(array1, array2) {\n if (array1 === array2) {\n return true;\n }\n\n if (!array1 || !array2) {\n return false;\n }\n\n // compare lengths - can save a lot of time\n if (array1.length != array2.length) {\n return false;\n }\n\n for (var i = 0,\n l = array1.length; i < l; i++) {\n // Check if we have nested arrays\n if (array1[i] instanceof Array && array2[i] instanceof Array) {\n // recurse into the nested arrays\n if (!nv.arrayEquals(array1[i], array2[i])) {\n return false;\n }\n } else if (array1[i] != array2[i]) {\n // Warning - two different object instances will never be equal: {x:20} != {x:20}\n return false;\n }\n }\n return true;\n };\n\n /*\n Check if a point within an arc\n */\n nv.utils.pointIsInArc = function(pt, ptData, d3Arc) {\n // Center of the arc is assumed to be 0,0\n // (pt.x, pt.y) are assumed to be relative to the center\n var r1 = d3Arc.innerRadius()(ptData), // Note: Using the innerRadius\n r2 = d3Arc.outerRadius()(ptData),\n theta1 = d3Arc.startAngle()(ptData),\n theta2 = d3Arc.endAngle()(ptData);\n\n var dist = pt.x * pt.x + pt.y * pt.y,\n angle = Math.atan2(pt.x, -pt.y); // Note: different coordinate system.\n\n angle = (angle < 0) ? (angle + Math.PI * 2) : angle;\n\n return (r1 * r1 <= dist) && (dist <= r2 * r2) &&\n (theta1 <= angle) && (angle <= theta2);\n };\n\n nv.models.axis = function() {\n 'use strict';\n\n //============================================================\n // Public Variables with Default Settings\n //------------------------------------------------------------\n\n var axis = d3.svg.axis();\n var scale = d3.scale.linear();\n\n var margin = {top: 0, right: 0, bottom: 0, left: 0}\n , width = 75 //only used for tickLabel currently\n , height = 60 //only used for tickLabel currently\n , axisLabelText = null\n , showMaxMin = true //TODO: showMaxMin should be disabled on all ordinal scaled axes\n , rotateLabels = 0\n , rotateYLabel = true\n , staggerLabels = false\n , isOrdinal = false\n , ticks = null\n , axisLabelDistance = 0\n , fontSize = undefined\n , duration = 250\n , dispatch = d3.dispatch('renderEnd')\n , tickFormatMaxMin\n ;\n axis\n .scale(scale)\n .orient('bottom')\n .tickFormat(function(d) {\n return d;\n })\n ;\n\n //============================================================\n // Private Variables\n //------------------------------------------------------------\n\n var scale0;\n var renderWatch = nv.utils.renderWatch(dispatch, duration);\n\n function chart(selection) {\n renderWatch.reset();\n selection.each(function(data) {\n var container = d3.select(this);\n nv.utils.initSVG(container);\n\n // Setup containers and skeleton of chart\n var wrap = container.selectAll('g.nv-wrap.nv-axis').data([data]);\n var wrapEnter = wrap.enter().append('g').attr('class', 'nvd3 nv-wrap nv-axis');\n var gEnter = wrapEnter.append('g');\n var g = wrap.select('g');\n\n if (ticks !== null) {\n axis.ticks(ticks);\n } else if (axis.orient() == 'top' || axis.orient() == 'bottom') {\n axis.ticks(Math.abs(scale.range()[1] - scale.range()[0]) / 100);\n }\n\n //TODO: consider calculating width/height based on whether or not label is added, for reference in charts using\n // this component\n g.watchTransition(renderWatch, 'axis').call(axis);\n\n scale0 = scale0 || axis.scale();\n\n var fmt = axis.tickFormat();\n if (fmt == null) {\n fmt = scale0.tickFormat();\n }\n\n var axisLabel = g.selectAll('text.nv-axislabel')\n .data([axisLabelText || null]);\n axisLabel.exit().remove();\n\n //only skip when fontSize is undefined so it can be cleared with a null or blank string\n if (fontSize !== undefined) {\n g.selectAll('g').select('text').style('font-size', fontSize);\n }\n\n var xLabelMargin;\n var axisMaxMin;\n var w;\n switch (axis.orient()) {\n case 'top':\n axisLabel.enter().append('text').attr('class', 'nv-axislabel');\n w = 0;\n if (scale.range().length === 1) {\n w = isOrdinal ? scale.range()[0] * 2 + scale.rangeBand() : 0;\n } else if (scale.range().length === 2) {\n w = isOrdinal ? scale.range()[0] + scale.range()[1] + scale.rangeBand() : scale.range()[1];\n } else if (scale.range().length > 2) {\n w = scale.range()[scale.range().length - 1] + (scale.range()[1] - scale.range()[0]);\n }\n ;\n axisLabel\n .attr('text-anchor', 'middle')\n .attr('y', 0)\n .attr('x', w / 2);\n if (showMaxMin) {\n axisMaxMin = wrap.selectAll('g.nv-axisMaxMin')\n .data(scale.domain());\n axisMaxMin.enter().append('g').attr('class', function(d, i) {\n return ['nv-axisMaxMin', 'nv-axisMaxMin-x', (i == 0 ? 'nv-axisMin-x' : 'nv-axisMax-x')].join(' ');\n }).append('text');\n axisMaxMin.exit().remove();\n axisMaxMin\n .attr('transform', function(d, i) {\n return 'translate(' + nv.utils.NaNtoZero(scale(d)) + ',0)';\n })\n .select('text')\n .attr('dy', '-0.5em')\n .attr('y', -axis.tickPadding())\n .attr('text-anchor', 'middle')\n .text(function(d, i) {\n var formatter = tickFormatMaxMin || fmt;\n var v = formatter(d);\n return ('' + v).match('NaN') ? '' : v;\n });\n axisMaxMin.watchTransition(renderWatch, 'min-max top')\n .attr('transform', function(d, i) {\n return 'translate(' + nv.utils.NaNtoZero(scale.range()[i]) + ',0)';\n });\n }\n break;\n case 'bottom':\n xLabelMargin = axisLabelDistance + 36;\n var maxTextWidth = 30;\n var textHeight = 0;\n var xTicks = g.selectAll('g').select('text');\n var rotateLabelsRule = '';\n if (rotateLabels % 360) {\n //Reset transform on ticks so textHeight can be calculated correctly\n xTicks.attr('transform', '');\n //Calculate the longest xTick width\n xTicks.each(function(d, i) {\n var box = this.getBoundingClientRect();\n var width = box.width;\n textHeight = box.height;\n if (width > maxTextWidth) maxTextWidth = width;\n });\n rotateLabelsRule = 'rotate(' + rotateLabels + ' 0,' + (textHeight / 2 + axis.tickPadding()) + ')';\n //Convert to radians before calculating sin. Add 30 to margin for healthy padding.\n var sin = Math.abs(Math.sin(rotateLabels * Math.PI / 180));\n xLabelMargin = (sin ? sin * maxTextWidth : maxTextWidth) + 30;\n //Rotate all xTicks\n xTicks\n .attr('transform', rotateLabelsRule)\n .style('text-anchor', rotateLabels % 360 > 0 ? 'start' : 'end');\n } else {\n if (staggerLabels) {\n xTicks\n .attr('transform', function(d, i) {\n return 'translate(0,' + (i % 2 == 0 ? '0' : '12') + ')';\n });\n } else {\n xTicks.attr('transform', 'translate(0,0)');\n }\n }\n axisLabel.enter().append('text').attr('class', 'nv-axislabel');\n w = 0;\n if (scale.range().length === 1) {\n w = isOrdinal ? scale.range()[0] * 2 + scale.rangeBand() : 0;\n } else if (scale.range().length === 2) {\n w = isOrdinal ? scale.range()[0] + scale.range()[1] + scale.rangeBand() : scale.range()[1];\n } else if (scale.range().length > 2) {\n w = scale.range()[scale.range().length - 1] + (scale.range()[1] - scale.range()[0]);\n }\n ;\n axisLabel\n .attr('text-anchor', 'middle')\n .attr('y', xLabelMargin)\n .attr('x', w / 2);\n if (showMaxMin) {\n //if (showMaxMin && !isOrdinal) {\n axisMaxMin = wrap.selectAll('g.nv-axisMaxMin')\n //.data(scale.domain())\n .data([scale.domain()[0], scale.domain()[scale.domain().length - 1]]);\n axisMaxMin.enter().append('g').attr('class', function(d, i) {\n return ['nv-axisMaxMin', 'nv-axisMaxMin-x', (i == 0 ? 'nv-axisMin-x' : 'nv-axisMax-x')].join(' ');\n }).append('text');\n axisMaxMin.exit().remove();\n axisMaxMin\n .attr('transform', function(d, i) {\n return 'translate(' + nv.utils.NaNtoZero((scale(d) + (isOrdinal ? scale.rangeBand() / 2 : 0)))\n + ',0)';\n })\n .select('text')\n .attr('dy', '.71em')\n .attr('y', axis.tickPadding())\n .attr('transform', rotateLabelsRule)\n .style('text-anchor', rotateLabels ? (rotateLabels % 360 > 0 ? 'start' : 'end') : 'middle')\n .text(function(d, i) {\n var formatter = tickFormatMaxMin || fmt;\n var v = formatter(d);\n return ('' + v).match('NaN') ? '' : v;\n });\n axisMaxMin.watchTransition(renderWatch, 'min-max bottom')\n .attr('transform', function(d, i) {\n return 'translate(' + nv.utils.NaNtoZero((scale(d) + (isOrdinal ? scale.rangeBand() / 2 : 0)))\n + ',0)';\n });\n }\n\n break;\n case 'right':\n axisLabel.enter().append('text').attr('class', 'nv-axislabel');\n axisLabel\n .style('text-anchor', rotateYLabel ? 'middle' : 'begin')\n .attr('transform', rotateYLabel ? 'rotate(90)' : '')\n .attr('y', rotateYLabel ? (-Math.max(margin.right, width) + 12 - (axisLabelDistance || 0))\n : -10) //TODO: consider calculating this based on largest tick width... OR at least expose this on\n // chart\n .attr('x', rotateYLabel ? (d3.max(scale.range()) / 2) : axis.tickPadding());\n if (showMaxMin) {\n axisMaxMin = wrap.selectAll('g.nv-axisMaxMin')\n .data(scale.domain());\n axisMaxMin.enter().append('g').attr('class', function(d, i) {\n return ['nv-axisMaxMin', 'nv-axisMaxMin-y', (i == 0 ? 'nv-axisMin-y' : 'nv-axisMax-y')].join(' ');\n }).append('text')\n .style('opacity', 0);\n axisMaxMin.exit().remove();\n axisMaxMin\n .attr('transform', function(d, i) {\n return 'translate(0,' + nv.utils.NaNtoZero(scale(d)) + ')';\n })\n .select('text')\n .attr('dy', '.32em')\n .attr('y', 0)\n .attr('x', axis.tickPadding())\n .style('text-anchor', 'start')\n .text(function(d, i) {\n var formatter = tickFormatMaxMin || fmt;\n var v = formatter(d);\n return ('' + v).match('NaN') ? '' : v;\n });\n axisMaxMin.watchTransition(renderWatch, 'min-max right')\n .attr('transform', function(d, i) {\n return 'translate(0,' + nv.utils.NaNtoZero(scale.range()[i]) + ')';\n })\n .select('text')\n .style('opacity', 1);\n }\n break;\n case 'left':\n /*\n //For dynamically placing the label. Can be used with dynamically-sized chart axis margins\n var yTicks = g.selectAll('g').select(\"text\");\n yTicks.each(function(d,i){\n var labelPadding = this.getBoundingClientRect().width + axis.tickPadding() + 16;\n if(labelPadding > width) width = labelPadding;\n });\n */\n axisLabel.enter().append('text').attr('class', 'nv-axislabel');\n axisLabel\n .style('text-anchor', rotateYLabel ? 'middle' : 'end')\n .attr('transform', rotateYLabel ? 'rotate(-90)' : '')\n .attr('y', rotateYLabel ? (-Math.max(margin.left, width) + 25 - (axisLabelDistance || 0)) : -10)\n .attr('x', rotateYLabel ? (-d3.max(scale.range()) / 2) : -axis.tickPadding());\n if (showMaxMin) {\n axisMaxMin = wrap.selectAll('g.nv-axisMaxMin')\n .data(scale.domain());\n axisMaxMin.enter().append('g').attr('class', function(d, i) {\n return ['nv-axisMaxMin', 'nv-axisMaxMin-y', (i == 0 ? 'nv-axisMin-y' : 'nv-axisMax-y')].join(' ');\n }).append('text')\n .style('opacity', 0);\n axisMaxMin.exit().remove();\n axisMaxMin\n .attr('transform', function(d, i) {\n return 'translate(0,' + nv.utils.NaNtoZero(scale0(d)) + ')';\n })\n .select('text')\n .attr('dy', '.32em')\n .attr('y', 0)\n .attr('x', -axis.tickPadding())\n .attr('text-anchor', 'end')\n .text(function(d, i) {\n var formatter = tickFormatMaxMin || fmt;\n var v = formatter(d);\n return ('' + v).match('NaN') ? '' : v;\n });\n axisMaxMin.watchTransition(renderWatch, 'min-max right')\n .attr('transform', function(d, i) {\n return 'translate(0,' + nv.utils.NaNtoZero(scale.range()[i]) + ')';\n })\n .select('text')\n .style('opacity', 1);\n }\n break;\n }\n axisLabel.text(function(d) {\n return d;\n });\n\n if (showMaxMin && (axis.orient() === 'left' || axis.orient() === 'right')) {\n //check if max and min overlap other values, if so, hide the values that overlap\n g.selectAll('g') // the g's wrapping each tick\n .each(function(d, i) {\n d3.select(this).select('text').attr('opacity', 1);\n if (scale(d) < scale.range()[1] + 10 || scale(d) > scale.range()[0] - 10) { // 10 is assuming text height is 16... if d is 0, leave it!\n if (d > 1e-10 || d < -1e-10) // accounts for minor floating point errors... though could be problematic if the scale is EXTREMELY SMALL\n {\n d3.select(this).attr('opacity', 0);\n }\n\n d3.select(this).select('text').attr('opacity', 0); // Don't remove the ZERO line!!\n }\n });\n\n //if Max and Min = 0 only show min, Issue #281\n if (scale.domain()[0] == scale.domain()[1] && scale.domain()[0] == 0) {\n wrap.selectAll('g.nv-axisMaxMin').style('opacity', function(d, i) {\n return !i ? 1 : 0;\n });\n }\n }\n\n if (showMaxMin && (axis.orient() === 'top' || axis.orient() === 'bottom')) {\n var maxMinRange = [];\n wrap.selectAll('g.nv-axisMaxMin')\n .each(function(d, i) {\n try {\n if (i) // i== 1, max position\n {\n maxMinRange.push(scale(d) - this.getBoundingClientRect().width - 4);\n }//assuming the max and min labels are as wide as the next tick (with an extra 4 pixels just in\n // case)\n else // i==0, min position\n {\n maxMinRange.push(scale(d) + this.getBoundingClientRect().width + 4);\n }\n } catch (err) {\n if (i) // i== 1, max position\n {\n maxMinRange.push(scale(d) - 4);\n }//assuming the max and min labels are as wide as the next tick (with an extra 4 pixels just in\n // case)\n else // i==0, min position\n {\n maxMinRange.push(scale(d) + 4);\n }\n }\n });\n // the g's wrapping each tick\n g.selectAll('g').each(function(d, i) {\n if (scale(d) < maxMinRange[0] || scale(d) > maxMinRange[1]) {\n if (d > 1e-10 || d < -1e-10) // accounts for minor floating point errors... though could be problematic if the scale is EXTREMELY SMALL\n {\n d3.select(this).remove();\n } else {\n d3.select(this).select('text').remove();\n } // Don't remove the ZERO line!!\n }\n });\n }\n\n //Highlight zero tick line\n g.selectAll('.tick')\n .filter(function(d) {\n /*\n The filter needs to return only ticks at or near zero.\n Numbers like 0.00001 need to count as zero as well,\n and the arithmetic trick below solves that.\n */\n return !parseFloat(Math.round(d * 100000) / 1000000) && (d !== undefined);\n })\n .classed('zero', true);\n\n //store old scales for use in transitions on update\n scale0 = scale.copy();\n\n });\n\n renderWatch.renderEnd('axis immediate');\n return chart;\n }\n\n //============================================================\n // Expose Public Variables\n //------------------------------------------------------------\n\n // expose chart's sub-components\n chart.axis = axis;\n chart.dispatch = dispatch;\n\n chart.options = nv.utils.optionsFunc.bind(chart);\n chart._options = Object.create({}, {\n // simple options, just get/set the necessary values\n axisLabelDistance: {\n get: function() {\n return axisLabelDistance;\n }, set: function(_) {\n axisLabelDistance = _;\n }\n },\n staggerLabels: {\n get: function() {\n return staggerLabels;\n }, set: function(_) {\n staggerLabels = _;\n }\n },\n rotateLabels: {\n get: function() {\n return rotateLabels;\n }, set: function(_) {\n rotateLabels = _;\n }\n },\n rotateYLabel: {\n get: function() {\n return rotateYLabel;\n }, set: function(_) {\n rotateYLabel = _;\n }\n },\n showMaxMin: {\n get: function() {\n return showMaxMin;\n }, set: function(_) {\n showMaxMin = _;\n }\n },\n axisLabel: {\n get: function() {\n return axisLabelText;\n }, set: function(_) {\n axisLabelText = _;\n }\n },\n height: {\n get: function() {\n return height;\n }, set: function(_) {\n height = _;\n }\n },\n ticks: {\n get: function() {\n return ticks;\n }, set: function(_) {\n ticks = _;\n }\n },\n width: {\n get: function() {\n return width;\n }, set: function(_) {\n width = _;\n }\n },\n fontSize: {\n get: function() {\n return fontSize;\n }, set: function(_) {\n fontSize = _;\n }\n },\n tickFormatMaxMin: {\n get: function() {\n return tickFormatMaxMin;\n }, set: function(_) {\n tickFormatMaxMin = _;\n }\n },\n\n // options that require extra logic in the setter\n margin: {\n get: function() {\n return margin;\n }, set: function(_) {\n margin.top = _.top !== undefined ? _.top : margin.top;\n margin.right = _.right !== undefined ? _.right : margin.right;\n margin.bottom = _.bottom !== undefined ? _.bottom : margin.bottom;\n margin.left = _.left !== undefined ? _.left : margin.left;\n }\n },\n duration: {\n get: function() {\n return duration;\n }, set: function(_) {\n duration = _;\n renderWatch.reset(duration);\n }\n },\n scale: {\n get: function() {\n return scale;\n }, set: function(_) {\n scale = _;\n axis.scale(scale);\n isOrdinal = typeof scale.rangeBands === 'function';\n nv.utils.inheritOptionsD3(chart, scale, ['domain', 'range', 'rangeBand', 'rangeBands']);\n }\n }\n });\n\n nv.utils.initOptions(chart);\n nv.utils.inheritOptionsD3(chart, axis, ['orient', 'tickValues', 'tickSubdivide', 'tickSize', 'tickPadding', 'tickFormat']);\n nv.utils.inheritOptionsD3(chart, scale, ['domain', 'range', 'rangeBand', 'rangeBands']);\n\n return chart;\n };\n nv.models.boxPlot = function() {\n 'use strict';\n\n //============================================================\n // Public Variables with Default Settings\n //------------------------------------------------------------\n\n var margin = {top: 0, right: 0, bottom: 0, left: 0},\n width = 960,\n height = 500,\n id = Math.floor(Math.random() * 10000), // Create semi-unique ID in case user doesn't select one\n xScale = d3.scale.ordinal(),\n yScale = d3.scale.linear(),\n getX = function(d) {\n return d.label;\n }, // Default data model selectors.\n getQ1 = function(d) {\n return d.values.Q1;\n },\n getQ2 = function(d) {\n return d.values.Q2;\n },\n getQ3 = function(d) {\n return d.values.Q3;\n },\n getWl = function(d) {\n return d.values.whisker_low;\n },\n getWh = function(d) {\n return d.values.whisker_high;\n },\n getColor = function(d) {\n return d.color;\n },\n getOlItems = function(d) {\n return d.values.outliers;\n },\n getOlValue = function(d, i, j) {\n return d;\n },\n getOlLabel = function(d, i, j) {\n return d;\n },\n getOlColor = function(d, i, j) {\n return undefined;\n },\n color = nv.utils.defaultColor(),\n container = null,\n xDomain, xRange,\n yDomain, yRange,\n dispatch = d3.dispatch('elementMouseover', 'elementMouseout', 'elementMousemove', 'renderEnd'),\n duration = 250,\n maxBoxWidth = null;\n\n //============================================================\n // Private Variables\n //------------------------------------------------------------\n\n var xScale0, yScale0;\n var renderWatch = nv.utils.renderWatch(dispatch, duration);\n\n function chart(selection) {\n renderWatch.reset();\n selection.each(function(data) {\n var availableWidth = width - margin.left - margin.right,\n availableHeight = height - margin.top - margin.bottom;\n\n container = d3.select(this);\n nv.utils.initSVG(container);\n\n // Setup Scales\n xScale.domain(xDomain || data.map(function(d, i) {\n return getX(d, i);\n }))\n .rangeBands(xRange || [0, availableWidth], 0.1);\n\n // if we know yDomain, no need to calculate\n var yData = [];\n if (!yDomain) {\n // (y-range is based on quartiles, whiskers and outliers)\n var values = [], yMin, yMax;\n data.forEach(function(d, i) {\n var q1 = getQ1(d), q3 = getQ3(d), wl = getWl(d), wh = getWh(d);\n var olItems = getOlItems(d);\n if (olItems) {\n olItems.forEach(function(e, i) {\n values.push(getOlValue(e, i, undefined));\n });\n }\n if (wl) {\n values.push(wl);\n }\n if (q1) {\n values.push(q1);\n }\n if (q3) {\n values.push(q3);\n }\n if (wh) {\n values.push(wh);\n }\n });\n yMin = d3.min(values);\n yMax = d3.max(values);\n yData = [yMin, yMax];\n }\n\n yScale.domain(yDomain || yData);\n yScale.range(yRange || [availableHeight, 0]);\n\n //store old scales if they exist\n xScale0 = xScale0 || xScale;\n yScale0 = yScale0 || yScale.copy().range([yScale(0), yScale(0)]);\n\n // Setup containers and skeleton of chart\n var wrap = container.selectAll('g.nv-wrap').data([data]);\n var wrapEnter = wrap.enter().append('g').attr('class', 'nvd3 nv-wrap');\n wrap.attr('transform', 'translate(' + margin.left + ',' + margin.top + ')');\n\n var boxplots = wrap.selectAll('.nv-boxplot').data(function(d) {\n return d;\n });\n var boxEnter = boxplots.enter().append('g').style('stroke-opacity', 1e-6).style('fill-opacity', 1e-6);\n boxplots\n .attr('class', 'nv-boxplot')\n .attr('transform', function(d, i, j) {\n return 'translate(' + (xScale(getX(d, i)) + xScale.rangeBand() * 0.05) + ', 0)';\n })\n .classed('hover', function(d) {\n return d.hover;\n });\n boxplots\n .watchTransition(renderWatch, 'nv-boxplot: boxplots')\n .style('stroke-opacity', 1)\n .style('fill-opacity', 0.75)\n .delay(function(d, i) {\n return i * duration / data.length;\n })\n .attr('transform', function(d, i) {\n return 'translate(' + (xScale(getX(d, i)) + xScale.rangeBand() * 0.05) + ', 0)';\n });\n boxplots.exit().remove();\n\n // ----- add the SVG elements for each boxPlot -----\n\n // conditionally append whisker lines\n boxEnter.each(function(d, i) {\n var box = d3.select(this);\n [getWl, getWh].forEach(function(f) {\n if (f(d) !== undefined && f(d) !== null) {\n var key = (f === getWl) ? 'low' : 'high';\n box.append('line')\n .style('stroke', getColor(d) || color(d, i))\n .attr('class', 'nv-boxplot-whisker nv-boxplot-' + key);\n box.append('line')\n .style('stroke', getColor(d) || color(d, i))\n .attr('class', 'nv-boxplot-tick nv-boxplot-' + key);\n }\n });\n });\n\n var box_width = function() {\n return (maxBoxWidth === null ? xScale.rangeBand() * 0.9 : Math.min(75, xScale.rangeBand() * 0.9));\n };\n var box_left = function() {\n return xScale.rangeBand() * 0.45 - box_width() / 2;\n };\n var box_right = function() {\n return xScale.rangeBand() * 0.45 + box_width() / 2;\n };\n\n // update whisker lines and ticks\n [getWl, getWh].forEach(function(f) {\n var key = (f === getWl) ? 'low' : 'high';\n var endpoint = (f === getWl) ? getQ1 : getQ3;\n boxplots.select('line.nv-boxplot-whisker.nv-boxplot-' + key)\n .watchTransition(renderWatch, 'nv-boxplot: boxplots')\n .attr('x1', xScale.rangeBand() * 0.45)\n .attr('y1', function(d, i) {\n return yScale(f(d));\n })\n .attr('x2', xScale.rangeBand() * 0.45)\n .attr('y2', function(d, i) {\n return yScale(endpoint(d));\n });\n boxplots.select('line.nv-boxplot-tick.nv-boxplot-' + key)\n .watchTransition(renderWatch, 'nv-boxplot: boxplots')\n .attr('x1', box_left)\n .attr('y1', function(d, i) {\n return yScale(f(d));\n })\n .attr('x2', box_right)\n .attr('y2', function(d, i) {\n return yScale(f(d));\n });\n });\n\n [getWl, getWh].forEach(function(f) {\n var key = (f === getWl) ? 'low' : 'high';\n boxEnter.selectAll('.nv-boxplot-' + key)\n .on('mouseover', function(d, i, j) {\n d3.select(this).classed('hover', true);\n dispatch.elementMouseover({\n series: {key: f(d), color: getColor(d) || color(d, j)},\n e: d3.event\n });\n })\n .on('mouseout', function(d, i, j) {\n d3.select(this).classed('hover', false);\n dispatch.elementMouseout({\n series: {key: f(d), color: getColor(d) || color(d, j)},\n e: d3.event\n });\n })\n .on('mousemove', function(d, i) {\n dispatch.elementMousemove({e: d3.event});\n });\n });\n\n // boxes\n boxEnter.append('rect')\n .attr('class', 'nv-boxplot-box')\n // tooltip events\n .on('mouseover', function(d, i) {\n d3.select(this).classed('hover', true);\n dispatch.elementMouseover({\n key: getX(d),\n value: getX(d),\n series: [\n {key: 'Q3', value: getQ3(d), color: getColor(d) || color(d, i)},\n {key: 'Q2', value: getQ2(d), color: getColor(d) || color(d, i)},\n {key: 'Q1', value: getQ1(d), color: getColor(d) || color(d, i)}\n ],\n data: d,\n index: i,\n e: d3.event\n });\n })\n .on('mouseout', function(d, i) {\n d3.select(this).classed('hover', false);\n dispatch.elementMouseout({\n key: getX(d),\n value: getX(d),\n series: [\n {key: 'Q3', value: getQ3(d), color: getColor(d) || color(d, i)},\n {key: 'Q2', value: getQ2(d), color: getColor(d) || color(d, i)},\n {key: 'Q1', value: getQ1(d), color: getColor(d) || color(d, i)}\n ],\n data: d,\n index: i,\n e: d3.event\n });\n })\n .on('mousemove', function(d, i) {\n dispatch.elementMousemove({e: d3.event});\n });\n\n // box transitions\n boxplots.select('rect.nv-boxplot-box')\n .watchTransition(renderWatch, 'nv-boxplot: boxes')\n .attr('y', function(d, i) {\n return yScale(getQ3(d));\n })\n .attr('width', box_width)\n .attr('x', box_left)\n .attr('height', function(d, i) {\n return Math.abs(yScale(getQ3(d)) - yScale(getQ1(d))) || 1;\n })\n .style('fill', function(d, i) {\n return getColor(d) || color(d, i);\n })\n .style('stroke', function(d, i) {\n return getColor(d) || color(d, i);\n });\n\n // median line\n boxEnter.append('line').attr('class', 'nv-boxplot-median');\n\n boxplots.select('line.nv-boxplot-median')\n .watchTransition(renderWatch, 'nv-boxplot: boxplots line')\n .attr('x1', box_left)\n .attr('y1', function(d, i) {\n return yScale(getQ2(d));\n })\n .attr('x2', box_right)\n .attr('y2', function(d, i) {\n return yScale(getQ2(d));\n });\n\n // outliers\n var outliers = boxplots.selectAll('.nv-boxplot-outlier').data(function(d) {\n return getOlItems(d) || [];\n });\n outliers.enter().append('circle')\n .style('fill', function(d, i, j) {\n return getOlColor(d, i, j) || color(d, j);\n })\n .style('stroke', function(d, i, j) {\n return getOlColor(d, i, j) || color(d, j);\n })\n .style('z-index', 9000)\n .on('mouseover', function(d, i, j) {\n d3.select(this).classed('hover', true);\n dispatch.elementMouseover({\n series: {key: getOlLabel(d, i, j), color: getOlColor(d, i, j) || color(d, j)},\n e: d3.event\n });\n })\n .on('mouseout', function(d, i, j) {\n d3.select(this).classed('hover', false);\n dispatch.elementMouseout({\n series: {key: getOlLabel(d, i, j), color: getOlColor(d, i, j) || color(d, j)},\n e: d3.event\n });\n })\n .on('mousemove', function(d, i) {\n dispatch.elementMousemove({e: d3.event});\n });\n outliers.attr('class', 'nv-boxplot-outlier');\n outliers\n .watchTransition(renderWatch, 'nv-boxplot: nv-boxplot-outlier')\n .attr('cx', xScale.rangeBand() * 0.45)\n .attr('cy', function(d, i, j) {\n return yScale(getOlValue(d, i, j));\n })\n .attr('r', '3');\n outliers.exit().remove();\n\n //store old scales for use in transitions on update\n xScale0 = xScale.copy();\n yScale0 = yScale.copy();\n });\n\n renderWatch.renderEnd('nv-boxplot immediate');\n return chart;\n }\n\n //============================================================\n // Expose Public Variables\n //------------------------------------------------------------\n\n chart.dispatch = dispatch;\n chart.options = nv.utils.optionsFunc.bind(chart);\n\n chart._options = Object.create({}, {\n // simple options, just get/set the necessary values\n width: {\n get: function() {\n return width;\n }, set: function(_) {\n width = _;\n }\n },\n height: {\n get: function() {\n return height;\n }, set: function(_) {\n height = _;\n }\n },\n maxBoxWidth: {\n get: function() {\n return maxBoxWidth;\n }, set: function(_) {\n maxBoxWidth = _;\n }\n },\n x: {\n get: function() {\n return getX;\n }, set: function(_) {\n getX = _;\n }\n },\n q1: {\n get: function() {\n return getQ1;\n }, set: function(_) {\n getQ1 = _;\n }\n },\n q2: {\n get: function() {\n return getQ2;\n }, set: function(_) {\n getQ2 = _;\n }\n },\n q3: {\n get: function() {\n return getQ3;\n }, set: function(_) {\n getQ3 = _;\n }\n },\n wl: {\n get: function() {\n return getWl;\n }, set: function(_) {\n getWl = _;\n }\n },\n wh: {\n get: function() {\n return getWh;\n }, set: function(_) {\n getWh = _;\n }\n },\n itemColor: {\n get: function() {\n return getColor;\n }, set: function(_) {\n getColor = _;\n }\n },\n outliers: {\n get: function() {\n return getOlItems;\n }, set: function(_) {\n getOlItems = _;\n }\n },\n outlierValue: {\n get: function() {\n return getOlValue;\n }, set: function(_) {\n getOlValue = _;\n }\n },\n outlierLabel: {\n get: function() {\n return getOlLabel;\n }, set: function(_) {\n getOlLabel = _;\n }\n },\n outlierColor: {\n get: function() {\n return getOlColor;\n }, set: function(_) {\n getOlColor = _;\n }\n },\n xScale: {\n get: function() {\n return xScale;\n }, set: function(_) {\n xScale = _;\n }\n },\n yScale: {\n get: function() {\n return yScale;\n }, set: function(_) {\n yScale = _;\n }\n },\n xDomain: {\n get: function() {\n return xDomain;\n }, set: function(_) {\n xDomain = _;\n }\n },\n yDomain: {\n get: function() {\n return yDomain;\n }, set: function(_) {\n yDomain = _;\n }\n },\n xRange: {\n get: function() {\n return xRange;\n }, set: function(_) {\n xRange = _;\n }\n },\n yRange: {\n get: function() {\n return yRange;\n }, set: function(_) {\n yRange = _;\n }\n },\n id: {\n get: function() {\n return id;\n }, set: function(_) {\n id = _;\n }\n },\n // rectClass: {get: function(){return rectClass;}, set: function(_){rectClass=_;}},\n y: {\n get: function() {\n console.warn('BoxPlot \\'y\\' chart option is deprecated. Please use model overrides instead.');\n return {};\n },\n set: function(_) {\n console.warn('BoxPlot \\'y\\' chart option is deprecated. Please use model overrides instead.');\n }\n },\n // options that require extra logic in the setter\n margin: {\n get: function() {\n return margin;\n }, set: function(_) {\n margin.top = _.top !== undefined ? _.top : margin.top;\n margin.right = _.right !== undefined ? _.right : margin.right;\n margin.bottom = _.bottom !== undefined ? _.bottom : margin.bottom;\n margin.left = _.left !== undefined ? _.left : margin.left;\n }\n },\n color: {\n get: function() {\n return color;\n }, set: function(_) {\n color = nv.utils.getColor(_);\n }\n },\n duration: {\n get: function() {\n return duration;\n }, set: function(_) {\n duration = _;\n renderWatch.reset(duration);\n }\n }\n });\n\n nv.utils.initOptions(chart);\n\n return chart;\n };\n nv.models.boxPlotChart = function() {\n 'use strict';\n\n //============================================================\n // Public Variables with Default Settings\n //------------------------------------------------------------\n\n var boxplot = nv.models.boxPlot(),\n xAxis = nv.models.axis(),\n yAxis = nv.models.axis();\n\n var margin = {top: 15, right: 10, bottom: 50, left: 60},\n width = null,\n height = null,\n color = nv.utils.getColor(),\n showXAxis = true,\n showYAxis = true,\n rightAlignYAxis = false,\n staggerLabels = false,\n tooltip = nv.models.tooltip(),\n x, y,\n noData = 'No Data Available.',\n dispatch = d3.dispatch('beforeUpdate', 'renderEnd'),\n duration = 250;\n\n xAxis\n .orient('bottom')\n .showMaxMin(false)\n .tickFormat(function(d) {\n return d;\n })\n ;\n yAxis\n .orient((rightAlignYAxis) ? 'right' : 'left')\n .tickFormat(d3.format(',.1f'))\n ;\n\n tooltip.duration(0);\n\n //============================================================\n // Private Variables\n //------------------------------------------------------------\n\n var renderWatch = nv.utils.renderWatch(dispatch, duration);\n\n function chart(selection) {\n renderWatch.reset();\n renderWatch.models(boxplot);\n if (showXAxis) renderWatch.models(xAxis);\n if (showYAxis) renderWatch.models(yAxis);\n\n selection.each(function(data) {\n var container = d3.select(this), that = this;\n nv.utils.initSVG(container);\n var availableWidth = (width || parseInt(container.style('width')) || 960) - margin.left - margin.right;\n var availableHeight = (height || parseInt(container.style('height')) || 400) - margin.top - margin.bottom;\n\n chart.update = function() {\n dispatch.beforeUpdate();\n container.transition().duration(duration).call(chart);\n };\n chart.container = this;\n\n // TODO still need to find a way to validate quartile data presence using boxPlot callbacks.\n // Display No Data message if there's nothing to show. (quartiles required at minimum).\n if (!data || !data.length) {\n var noDataText = container.selectAll('.nv-noData').data([noData]);\n\n noDataText.enter().append('text')\n .attr('class', 'nvd3 nv-noData')\n .attr('dy', '-.7em')\n .style('text-anchor', 'middle');\n\n noDataText\n .attr('x', margin.left + availableWidth / 2)\n .attr('y', margin.top + availableHeight / 2)\n .text(function(d) {\n return d;\n });\n\n return chart;\n } else {\n container.selectAll('.nv-noData').remove();\n }\n\n // Setup Scales\n x = boxplot.xScale();\n y = boxplot.yScale().clamp(true);\n\n // Setup containers and skeleton of chart\n var wrap = container.selectAll('g.nv-wrap.nv-boxPlotWithAxes').data([data]);\n var gEnter = wrap.enter().append('g').attr('class', 'nvd3 nv-wrap nv-boxPlotWithAxes').append('g');\n var defsEnter = gEnter.append('defs');\n var g = wrap.select('g');\n\n gEnter.append('g').attr('class', 'nv-x nv-axis');\n gEnter.append('g').attr('class', 'nv-y nv-axis')\n .append('g').attr('class', 'nv-zeroLine')\n .append('line');\n\n gEnter.append('g').attr('class', 'nv-barsWrap');\n g.attr('transform', 'translate(' + margin.left + ',' + margin.top + ')');\n\n if (rightAlignYAxis) {\n g.select('.nv-y.nv-axis')\n .attr('transform', 'translate(' + availableWidth + ',0)');\n }\n\n // Main Chart Component(s)\n boxplot.width(availableWidth).height(availableHeight);\n\n var barsWrap = g.select('.nv-barsWrap')\n .datum(data.filter(function(d) {\n return !d.disabled;\n }));\n\n barsWrap.transition().call(boxplot);\n\n defsEnter.append('clipPath')\n .attr('id', 'nv-x-label-clip-' + boxplot.id())\n .append('rect');\n\n g.select('#nv-x-label-clip-' + boxplot.id() + ' rect')\n .attr('width', x.rangeBand() * (staggerLabels ? 2 : 1))\n .attr('height', 16)\n .attr('x', -x.rangeBand() / (staggerLabels ? 1 : 2));\n\n // Setup Axes\n if (showXAxis) {\n xAxis\n .scale(x)\n .ticks(nv.utils.calcTicksX(availableWidth / 100, data))\n .tickSize(-availableHeight, 0);\n\n g.select('.nv-x.nv-axis').attr('transform', 'translate(0,' + y.range()[0] + ')');\n g.select('.nv-x.nv-axis').call(xAxis);\n\n var xTicks = g.select('.nv-x.nv-axis').selectAll('g');\n if (staggerLabels) {\n xTicks\n .selectAll('text')\n .attr('transform', function(d, i, j) {\n return 'translate(0,' + (j % 2 === 0 ? '5' : '17') + ')';\n });\n }\n }\n\n if (showYAxis) {\n yAxis\n .scale(y)\n .ticks(Math.floor(availableHeight / 36)) // can't use nv.utils.calcTicksY with Object data\n .tickSize(-availableWidth, 0);\n\n g.select('.nv-y.nv-axis').call(yAxis);\n }\n\n // Zero line\n g.select('.nv-zeroLine line')\n .attr('x1', 0)\n .attr('x2', availableWidth)\n .attr('y1', y(0))\n .attr('y2', y(0))\n ;\n\n //============================================================\n // Event Handling/Dispatching (in chart's scope)\n //------------------------------------------------------------\n });\n\n renderWatch.renderEnd('nv-boxplot chart immediate');\n return chart;\n }\n\n //============================================================\n // Event Handling/Dispatching (out of chart's scope)\n //------------------------------------------------------------\n\n boxplot.dispatch.on('elementMouseover.tooltip', function(evt) {\n tooltip.data(evt).hidden(false);\n });\n\n boxplot.dispatch.on('elementMouseout.tooltip', function(evt) {\n tooltip.data(evt).hidden(true);\n });\n\n boxplot.dispatch.on('elementMousemove.tooltip', function(evt) {\n tooltip();\n });\n\n //============================================================\n // Expose Public Variables\n //------------------------------------------------------------\n\n chart.dispatch = dispatch;\n chart.boxplot = boxplot;\n chart.xAxis = xAxis;\n chart.yAxis = yAxis;\n chart.tooltip = tooltip;\n\n chart.options = nv.utils.optionsFunc.bind(chart);\n\n chart._options = Object.create({}, {\n // simple options, just get/set the necessary values\n width: {\n get: function() {\n return width;\n }, set: function(_) {\n width = _;\n }\n },\n height: {\n get: function() {\n return height;\n }, set: function(_) {\n height = _;\n }\n },\n staggerLabels: {\n get: function() {\n return staggerLabels;\n }, set: function(_) {\n staggerLabels = _;\n }\n },\n showXAxis: {\n get: function() {\n return showXAxis;\n }, set: function(_) {\n showXAxis = _;\n }\n },\n showYAxis: {\n get: function() {\n return showYAxis;\n }, set: function(_) {\n showYAxis = _;\n }\n },\n tooltipContent: {\n get: function() {\n return tooltip;\n }, set: function(_) {\n tooltip = _;\n }\n },\n noData: {\n get: function() {\n return noData;\n }, set: function(_) {\n noData = _;\n }\n },\n\n // options that require extra logic in the setter\n margin: {\n get: function() {\n return margin;\n }, set: function(_) {\n margin.top = _.top !== undefined ? _.top : margin.top;\n margin.right = _.right !== undefined ? _.right : margin.right;\n margin.bottom = _.bottom !== undefined ? _.bottom : margin.bottom;\n margin.left = _.left !== undefined ? _.left : margin.left;\n }\n },\n duration: {\n get: function() {\n return duration;\n }, set: function(_) {\n duration = _;\n renderWatch.reset(duration);\n boxplot.duration(duration);\n xAxis.duration(duration);\n yAxis.duration(duration);\n }\n },\n color: {\n get: function() {\n return color;\n }, set: function(_) {\n color = nv.utils.getColor(_);\n boxplot.color(color);\n }\n },\n rightAlignYAxis: {\n get: function() {\n return rightAlignYAxis;\n }, set: function(_) {\n rightAlignYAxis = _;\n yAxis.orient((_) ? 'right' : 'left');\n }\n }\n });\n\n nv.utils.inheritOptions(chart, boxplot);\n nv.utils.initOptions(chart);\n\n return chart;\n };\n\n// Chart design based on the recommendations of Stephen Few. Implementation\n// based on the work of Clint Ivy, Jamie Love, and Jason Davies.\n// http://projects.instantcognition.com/protovis/bulletchart/\n\n nv.models.bullet = function() {\n 'use strict';\n\n //============================================================\n // Public Variables with Default Settings\n //------------------------------------------------------------\n\n var margin = {top: 0, right: 0, bottom: 0, left: 0}\n , orient = 'left' // TODO top & bottom\n , reverse = false\n , ranges = function(d) {\n return d.ranges;\n }\n , markers = function(d) {\n return d.markers ? d.markers : [];\n }\n , markerLines = function(d) {\n return d.markerLines ? d.markerLines : [0];\n }\n , measures = function(d) {\n return d.measures;\n }\n , rangeLabels = function(d) {\n return d.rangeLabels ? d.rangeLabels : [];\n }\n , markerLabels = function(d) {\n return d.markerLabels ? d.markerLabels : [];\n }\n , markerLineLabels = function(d) {\n return d.markerLineLabels ? d.markerLineLabels : [];\n }\n , measureLabels = function(d) {\n return d.measureLabels ? d.measureLabels : [];\n }\n , forceX = [0] // List of numbers to Force into the X scale (ie. 0, or a max / min, etc.)\n , width = 380\n , height = 30\n , container = null\n , tickFormat = null\n , color = nv.utils.getColor(['#1f77b4'])\n , dispatch = d3.dispatch('elementMouseover', 'elementMouseout', 'elementMousemove')\n , defaultRangeLabels = ['Maximum', 'Mean', 'Minimum']\n , legacyRangeClassNames = ['Max', 'Avg', 'Min']\n , duration = 1000\n ;\n\n function sortLabels(labels, values) {\n var lz = labels.slice();\n labels.sort(function(a, b) {\n var iA = lz.indexOf(a);\n var iB = lz.indexOf(b);\n return d3.descending(values[iA], values[iB]);\n });\n };\n\n function chart(selection) {\n selection.each(function(d, i) {\n var availableWidth = width - margin.left - margin.right,\n availableHeight = height - margin.top - margin.bottom;\n\n container = d3.select(this);\n nv.utils.initSVG(container);\n\n var rangez = ranges.call(this, d, i).slice(),\n markerz = markers.call(this, d, i).slice(),\n markerLinez = markerLines.call(this, d, i).slice(),\n measurez = measures.call(this, d, i).slice(),\n rangeLabelz = rangeLabels.call(this, d, i).slice(),\n markerLabelz = markerLabels.call(this, d, i).slice(),\n markerLineLabelz = markerLineLabels.call(this, d, i).slice(),\n measureLabelz = measureLabels.call(this, d, i).slice();\n\n // Sort labels according to their sorted values\n sortLabels(rangeLabelz, rangez);\n sortLabels(markerLabelz, markerz);\n sortLabels(markerLineLabelz, markerLinez);\n sortLabels(measureLabelz, measurez);\n\n // sort values descending\n rangez.sort(d3.descending);\n markerz.sort(d3.descending);\n markerLinez.sort(d3.descending);\n measurez.sort(d3.descending);\n\n // Setup Scales\n // Compute the new x-scale.\n var x1 = d3.scale.linear()\n .domain(d3.extent(d3.merge([forceX, rangez])))\n .range(reverse ? [availableWidth, 0] : [0, availableWidth]);\n\n // Retrieve the old x-scale, if this is an update.\n var x0 = this.__chart__ || d3.scale.linear()\n .domain([0, Infinity])\n .range(x1.range());\n\n // Stash the new scale.\n this.__chart__ = x1;\n\n var rangeMin = d3.min(rangez), //rangez[2]\n rangeMax = d3.max(rangez), //rangez[0]\n rangeAvg = rangez[1];\n\n // Setup containers and skeleton of chart\n var wrap = container.selectAll('g.nv-wrap.nv-bullet').data([d]);\n var wrapEnter = wrap.enter().append('g').attr('class', 'nvd3 nv-wrap nv-bullet');\n var gEnter = wrapEnter.append('g');\n var g = wrap.select('g');\n\n for (var i = 0, il = rangez.length; i < il; i++) {\n var rangeClassNames = 'nv-range nv-range' + i;\n if (i <= 2) {\n rangeClassNames = rangeClassNames + ' nv-range' + legacyRangeClassNames[i];\n }\n gEnter.append('rect').attr('class', rangeClassNames);\n }\n\n gEnter.append('rect').attr('class', 'nv-measure');\n\n wrap.attr('transform', 'translate(' + margin.left + ',' + margin.top + ')');\n\n var w0 = function(d) {\n return Math.abs(x0(d) - x0(0));\n }, // TODO: could optimize by precalculating x0(0) and x1(0)\n w1 = function(d) {\n return Math.abs(x1(d) - x1(0));\n };\n var xp0 = function(d) {\n return d < 0 ? x0(d) : x0(0);\n },\n xp1 = function(d) {\n return d < 0 ? x1(d) : x1(0);\n };\n\n for (var i = 0, il = rangez.length; i < il; i++) {\n var range = rangez[i];\n g.select('rect.nv-range' + i)\n .datum(range)\n .attr('height', availableHeight)\n .transition()\n .duration(duration)\n .attr('width', w1(range))\n .attr('x', xp1(range));\n }\n\n g.select('rect.nv-measure')\n .style('fill', color)\n .attr('height', availableHeight / 3)\n .attr('y', availableHeight / 3)\n .on('mouseover', function() {\n dispatch.elementMouseover({\n value: measurez[0],\n label: measureLabelz[0] || 'Current',\n color: d3.select(this).style('fill')\n });\n })\n .on('mousemove', function() {\n dispatch.elementMousemove({\n value: measurez[0],\n label: measureLabelz[0] || 'Current',\n color: d3.select(this).style('fill')\n });\n })\n .on('mouseout', function() {\n dispatch.elementMouseout({\n value: measurez[0],\n label: measureLabelz[0] || 'Current',\n color: d3.select(this).style('fill')\n });\n })\n .transition()\n .duration(duration)\n .attr('width', measurez < 0 ?\n x1(0) - x1(measurez[0])\n : x1(measurez[0]) - x1(0))\n .attr('x', xp1(measurez));\n\n var h3 = availableHeight / 6;\n\n var markerData = markerz.map(function(marker, index) {\n return {value: marker, label: markerLabelz[index]};\n });\n gEnter\n .selectAll('path.nv-markerTriangle')\n .data(markerData)\n .enter()\n .append('path')\n .attr('class', 'nv-markerTriangle')\n .attr('d', 'M0,' + h3 + 'L' + h3 + ',' + (-h3) + ' ' + (-h3) + ',' + (-h3) + 'Z')\n .on('mouseover', function(d) {\n dispatch.elementMouseover({\n value: d.value,\n label: d.label || 'Previous',\n color: d3.select(this).style('fill'),\n pos: [x1(d.value), availableHeight / 2]\n });\n\n })\n .on('mousemove', function(d) {\n dispatch.elementMousemove({\n value: d.value,\n label: d.label || 'Previous',\n color: d3.select(this).style('fill')\n });\n })\n .on('mouseout', function(d, i) {\n dispatch.elementMouseout({\n value: d.value,\n label: d.label || 'Previous',\n color: d3.select(this).style('fill')\n });\n });\n\n g.selectAll('path.nv-markerTriangle')\n .data(markerData)\n .transition()\n .duration(duration)\n .attr('transform', function(d) {\n return 'translate(' + x1(d.value) + ',' + (availableHeight / 2) + ')';\n });\n\n var markerLinesData = markerLinez.map(function(marker, index) {\n return {value: marker, label: markerLineLabelz[index]};\n });\n gEnter\n .selectAll('line.nv-markerLine')\n .data(markerLinesData)\n .enter()\n .append('line')\n .attr('cursor', '')\n .attr('class', 'nv-markerLine')\n .attr('x1', function(d) {\n return x1(d.value);\n })\n .attr('y1', '2')\n .attr('x2', function(d) {\n return x1(d.value);\n })\n .attr('y2', availableHeight - 2)\n .on('mouseover', function(d) {\n dispatch.elementMouseover({\n value: d.value,\n label: d.label || 'Previous',\n color: d3.select(this).style('fill'),\n pos: [x1(d.value), availableHeight / 2]\n });\n\n })\n .on('mousemove', function(d) {\n dispatch.elementMousemove({\n value: d.value,\n label: d.label || 'Previous',\n color: d3.select(this).style('fill')\n });\n })\n .on('mouseout', function(d, i) {\n dispatch.elementMouseout({\n value: d.value,\n label: d.label || 'Previous',\n color: d3.select(this).style('fill')\n });\n });\n\n g.selectAll('line.nv-markerLine')\n .data(markerLinesData)\n .transition()\n .duration(duration)\n .attr('x1', function(d) {\n return x1(d.value);\n })\n .attr('x2', function(d) {\n return x1(d.value);\n });\n\n wrap.selectAll('.nv-range')\n .on('mouseover', function(d, i) {\n var label = rangeLabelz[i] || defaultRangeLabels[i];\n dispatch.elementMouseover({\n value: d,\n label: label,\n color: d3.select(this).style('fill')\n });\n })\n .on('mousemove', function() {\n dispatch.elementMousemove({\n value: measurez[0],\n label: measureLabelz[0] || 'Previous',\n color: d3.select(this).style('fill')\n });\n })\n .on('mouseout', function(d, i) {\n var label = rangeLabelz[i] || defaultRangeLabels[i];\n dispatch.elementMouseout({\n value: d,\n label: label,\n color: d3.select(this).style('fill')\n });\n });\n });\n\n return chart;\n }\n\n //============================================================\n // Expose Public Variables\n //------------------------------------------------------------\n\n chart.dispatch = dispatch;\n chart.options = nv.utils.optionsFunc.bind(chart);\n\n chart._options = Object.create({}, {\n // simple options, just get/set the necessary values\n ranges: {\n get: function() {\n return ranges;\n }, set: function(_) {\n ranges = _;\n }\n }, // ranges (bad, satisfactory, good)\n markers: {\n get: function() {\n return markers;\n }, set: function(_) {\n markers = _;\n }\n }, // markers (previous, goal)\n measures: {\n get: function() {\n return measures;\n }, set: function(_) {\n measures = _;\n }\n }, // measures (actual, forecast)\n forceX: {\n get: function() {\n return forceX;\n }, set: function(_) {\n forceX = _;\n }\n },\n width: {\n get: function() {\n return width;\n }, set: function(_) {\n width = _;\n }\n },\n height: {\n get: function() {\n return height;\n }, set: function(_) {\n height = _;\n }\n },\n tickFormat: {\n get: function() {\n return tickFormat;\n }, set: function(_) {\n tickFormat = _;\n }\n },\n duration: {\n get: function() {\n return duration;\n }, set: function(_) {\n duration = _;\n }\n },\n\n // options that require extra logic in the setter\n margin: {\n get: function() {\n return margin;\n }, set: function(_) {\n margin.top = _.top !== undefined ? _.top : margin.top;\n margin.right = _.right !== undefined ? _.right : margin.right;\n margin.bottom = _.bottom !== undefined ? _.bottom : margin.bottom;\n margin.left = _.left !== undefined ? _.left : margin.left;\n }\n },\n orient: {\n get: function() {\n return orient;\n }, set: function(_) { // left, right, top, bottom\n orient = _;\n reverse = orient == 'right' || orient == 'bottom';\n }\n },\n color: {\n get: function() {\n return color;\n }, set: function(_) {\n color = nv.utils.getColor(_);\n }\n }\n });\n\n nv.utils.initOptions(chart);\n return chart;\n };\n\n\n// Chart design based on the recommendations of Stephen Few. Implementation\n// based on the work of Clint Ivy, Jamie Love, and Jason Davies.\n// http://projects.instantcognition.com/protovis/bulletchart/\n nv.models.bulletChart = function() {\n 'use strict';\n\n //============================================================\n // Public Variables with Default Settings\n //------------------------------------------------------------\n\n var bullet = nv.models.bullet();\n var tooltip = nv.models.tooltip();\n\n var orient = 'left' // TODO top & bottom\n , reverse = false\n , margin = {top: 5, right: 40, bottom: 20, left: 120}\n , ranges = function(d) {\n return d.ranges;\n }\n , markers = function(d) {\n return d.markers ? d.markers : [];\n }\n , measures = function(d) {\n return d.measures;\n }\n , width = null\n , height = 55\n , tickFormat = null\n , ticks = null\n , noData = null\n , dispatch = d3.dispatch()\n ;\n\n tooltip\n .duration(0)\n .headerEnabled(false);\n\n function chart(selection) {\n selection.each(function(d, i) {\n var container = d3.select(this);\n nv.utils.initSVG(container);\n\n var availableWidth = nv.utils.availableWidth(width, container, margin),\n availableHeight = height - margin.top - margin.bottom,\n that = this;\n\n chart.update = function() {\n chart(selection);\n };\n chart.container = this;\n\n // Display No Data message if there's nothing to show.\n if (!d || !ranges.call(this, d, i)) {\n nv.utils.noData(chart, container);\n return chart;\n } else {\n container.selectAll('.nv-noData').remove();\n }\n\n var rangez = ranges.call(this, d, i).slice().sort(d3.descending),\n markerz = markers.call(this, d, i).slice().sort(d3.descending),\n measurez = measures.call(this, d, i).slice().sort(d3.descending);\n\n // Setup containers and skeleton of chart\n var wrap = container.selectAll('g.nv-wrap.nv-bulletChart').data([d]);\n var wrapEnter = wrap.enter().append('g').attr('class', 'nvd3 nv-wrap nv-bulletChart');\n var gEnter = wrapEnter.append('g');\n var g = wrap.select('g');\n\n gEnter.append('g').attr('class', 'nv-bulletWrap');\n gEnter.append('g').attr('class', 'nv-titles');\n\n wrap.attr('transform', 'translate(' + margin.left + ',' + margin.top + ')');\n\n // Compute the new x-scale.\n var x1 = d3.scale.linear()\n .domain([0, Math.max(rangez[0], (markerz[0] || 0),\n measurez[0])]) // TODO: need to allow forceX and forceY, and xDomain, yDomain\n .range(reverse ? [availableWidth, 0] : [0, availableWidth]);\n\n // Retrieve the old x-scale, if this is an update.\n var x0 = this.__chart__ || d3.scale.linear()\n .domain([0, Infinity])\n .range(x1.range());\n\n // Stash the new scale.\n this.__chart__ = x1;\n\n var w0 = function(d) {\n return Math.abs(x0(d) - x0(0));\n }, // TODO: could optimize by precalculating x0(0) and x1(0)\n w1 = function(d) {\n return Math.abs(x1(d) - x1(0));\n };\n\n var title = gEnter.select('.nv-titles').append('g')\n .attr('text-anchor', 'end')\n .attr('transform', 'translate(-6,' + (height - margin.top - margin.bottom) / 2 + ')');\n title.append('text')\n .attr('class', 'nv-title')\n .text(function(d) {\n return d.title;\n });\n\n title.append('text')\n .attr('class', 'nv-subtitle')\n .attr('dy', '1em')\n .text(function(d) {\n return d.subtitle;\n });\n\n bullet\n .width(availableWidth)\n .height(availableHeight);\n\n var bulletWrap = g.select('.nv-bulletWrap');\n d3.transition(bulletWrap).call(bullet);\n\n // Compute the tick format.\n var format = tickFormat || x1.tickFormat(availableWidth / 100);\n\n // Update the tick groups.\n var tick = g.selectAll('g.nv-tick')\n .data(x1.ticks(ticks ? ticks : (availableWidth / 50)), function(d) {\n return this.textContent || format(d);\n });\n\n // Initialize the ticks with the old scale, x0.\n var tickEnter = tick.enter().append('g')\n .attr('class', 'nv-tick')\n .attr('transform', function(d) {\n return 'translate(' + x0(d) + ',0)';\n })\n .style('opacity', 1e-6);\n\n tickEnter.append('line')\n .attr('y1', availableHeight)\n .attr('y2', availableHeight * 7 / 6);\n\n tickEnter.append('text')\n .attr('text-anchor', 'middle')\n .attr('dy', '1em')\n .attr('y', availableHeight * 7 / 6)\n .text(format);\n\n // Transition the updating ticks to the new scale, x1.\n var tickUpdate = d3.transition(tick)\n .transition()\n .duration(bullet.duration())\n .attr('transform', function(d) {\n return 'translate(' + x1(d) + ',0)';\n })\n .style('opacity', 1);\n\n tickUpdate.select('line')\n .attr('y1', availableHeight)\n .attr('y2', availableHeight * 7 / 6);\n\n tickUpdate.select('text')\n .attr('y', availableHeight * 7 / 6);\n\n // Transition the exiting ticks to the new scale, x1.\n d3.transition(tick.exit())\n .transition()\n .duration(bullet.duration())\n .attr('transform', function(d) {\n return 'translate(' + x1(d) + ',0)';\n })\n .style('opacity', 1e-6)\n .remove();\n });\n\n d3.timer.flush();\n return chart;\n }\n\n //============================================================\n // Event Handling/Dispatching (out of chart's scope)\n //------------------------------------------------------------\n\n bullet.dispatch.on('elementMouseover.tooltip', function(evt) {\n evt['series'] = {\n key: evt.label,\n value: evt.value,\n color: evt.color\n };\n tooltip.data(evt).hidden(false);\n });\n\n bullet.dispatch.on('elementMouseout.tooltip', function(evt) {\n tooltip.hidden(true);\n });\n\n bullet.dispatch.on('elementMousemove.tooltip', function(evt) {\n tooltip();\n });\n\n //============================================================\n // Expose Public Variables\n //------------------------------------------------------------\n\n chart.bullet = bullet;\n chart.dispatch = dispatch;\n chart.tooltip = tooltip;\n\n chart.options = nv.utils.optionsFunc.bind(chart);\n\n chart._options = Object.create({}, {\n // simple options, just get/set the necessary values\n ranges: {\n get: function() {\n return ranges;\n }, set: function(_) {\n ranges = _;\n }\n }, // ranges (bad, satisfactory, good)\n markers: {\n get: function() {\n return markers;\n }, set: function(_) {\n markers = _;\n }\n }, // markers (previous, goal)\n measures: {\n get: function() {\n return measures;\n }, set: function(_) {\n measures = _;\n }\n }, // measures (actual, forecast)\n width: {\n get: function() {\n return width;\n }, set: function(_) {\n width = _;\n }\n },\n height: {\n get: function() {\n return height;\n }, set: function(_) {\n height = _;\n }\n },\n tickFormat: {\n get: function() {\n return tickFormat;\n }, set: function(_) {\n tickFormat = _;\n }\n },\n ticks: {\n get: function() {\n return ticks;\n }, set: function(_) {\n ticks = _;\n }\n },\n noData: {\n get: function() {\n return noData;\n }, set: function(_) {\n noData = _;\n }\n },\n\n // options that require extra logic in the setter\n margin: {\n get: function() {\n return margin;\n }, set: function(_) {\n margin.top = _.top !== undefined ? _.top : margin.top;\n margin.right = _.right !== undefined ? _.right : margin.right;\n margin.bottom = _.bottom !== undefined ? _.bottom : margin.bottom;\n margin.left = _.left !== undefined ? _.left : margin.left;\n }\n },\n orient: {\n get: function() {\n return orient;\n }, set: function(_) { // left, right, top, bottom\n orient = _;\n reverse = orient == 'right' || orient == 'bottom';\n }\n }\n });\n\n nv.utils.inheritOptions(chart, bullet);\n nv.utils.initOptions(chart);\n\n return chart;\n };\n\n\n nv.models.candlestickBar = function() {\n 'use strict';\n\n //============================================================\n // Public Variables with Default Settings\n //------------------------------------------------------------\n\n var margin = {top: 0, right: 0, bottom: 0, left: 0}\n ,\n width = null\n ,\n height = null\n ,\n id = Math.floor(Math.random() * 10000) //Create semi-unique ID in case user doesn't select one\n ,\n container\n ,\n x = d3.scale.linear()\n ,\n y = d3.scale.linear()\n ,\n getX = function(d) {\n return d.x;\n }\n ,\n getY = function(d) {\n return d.y;\n }\n ,\n getOpen = function(d) {\n return d.open;\n }\n ,\n getClose = function(d) {\n return d.close;\n }\n ,\n getHigh = function(d) {\n return d.high;\n }\n ,\n getLow = function(d) {\n return d.low;\n }\n ,\n forceX = []\n ,\n forceY = []\n ,\n padData = false // If true, adds half a data points width to front and back, for lining up a line chart with a bar chart\n ,\n clipEdge = true\n ,\n color = nv.utils.defaultColor()\n ,\n interactive = false\n ,\n xDomain\n ,\n yDomain\n ,\n xRange\n ,\n yRange\n ,\n dispatch = d3.dispatch('stateChange', 'changeState', 'renderEnd', 'chartClick', 'elementClick', 'elementDblClick',\n 'elementMouseover', 'elementMouseout', 'elementMousemove')\n ;\n\n //============================================================\n // Private Variables\n //------------------------------------------------------------\n\n function chart(selection) {\n selection.each(function(data) {\n container = d3.select(this);\n var availableWidth = nv.utils.availableWidth(width, container, margin),\n availableHeight = nv.utils.availableHeight(height, container, margin);\n\n nv.utils.initSVG(container);\n\n // Width of the candlestick bars.\n var barWidth = (availableWidth / data[0].values.length) * .45;\n\n // Setup Scales\n x.domain(xDomain || d3.extent(data[0].values.map(getX).concat(forceX)));\n\n if (padData) {\n x.range(xRange || [availableWidth * .5 / data[0].values.length,\n availableWidth * (data[0].values.length - .5) / data[0].values.length]);\n } else {\n x.range(xRange || [5 + barWidth / 2, availableWidth - barWidth / 2 - 5]);\n }\n\n y.domain(yDomain || [\n d3.min(data[0].values.map(getLow).concat(forceY)),\n d3.max(data[0].values.map(getHigh).concat(forceY))\n ]\n ).range(yRange || [availableHeight, 0]);\n\n // If scale's domain don't have a range, slightly adjust to make one... so a chart can show a single data point\n if (x.domain()[0] === x.domain()[1]) {\n x.domain()[0] ?\n x.domain([x.domain()[0] - x.domain()[0] * 0.01, x.domain()[1] + x.domain()[1] * 0.01])\n : x.domain([-1, 1]);\n }\n\n if (y.domain()[0] === y.domain()[1]) {\n y.domain()[0] ?\n y.domain([y.domain()[0] + y.domain()[0] * 0.01, y.domain()[1] - y.domain()[1] * 0.01])\n : y.domain([-1, 1]);\n }\n\n // Setup containers and skeleton of chart\n var wrap = d3.select(this).selectAll('g.nv-wrap.nv-candlestickBar').data([data[0].values]);\n var wrapEnter = wrap.enter().append('g').attr('class', 'nvd3 nv-wrap nv-candlestickBar');\n var defsEnter = wrapEnter.append('defs');\n var gEnter = wrapEnter.append('g');\n var g = wrap.select('g');\n\n gEnter.append('g').attr('class', 'nv-ticks');\n\n wrap.attr('transform', 'translate(' + margin.left + ',' + margin.top + ')');\n\n container\n .on('click', function(d, i) {\n dispatch.chartClick({\n data: d,\n index: i,\n pos: d3.event,\n id: id\n });\n });\n\n defsEnter.append('clipPath')\n .attr('id', 'nv-chart-clip-path-' + id)\n .append('rect');\n\n wrap.select('#nv-chart-clip-path-' + id + ' rect')\n .attr('width', availableWidth)\n .attr('height', availableHeight);\n\n g.attr('clip-path', clipEdge ? 'url(#nv-chart-clip-path-' + id + ')' : '');\n\n var ticks = wrap.select('.nv-ticks').selectAll('.nv-tick')\n .data(function(d) {\n return d;\n });\n ticks.exit().remove();\n\n var tickGroups = ticks.enter().append('g');\n\n // The colors are currently controlled by CSS.\n ticks\n .attr('class', function(d, i, j) {\n return (getOpen(d, i) > getClose(d, i) ? 'nv-tick negative' : 'nv-tick positive') + ' nv-tick-' + j + '-'\n + i;\n });\n\n var lines = tickGroups.append('line')\n .attr('class', 'nv-candlestick-lines')\n .attr('transform', function(d, i) {\n return 'translate(' + x(getX(d, i)) + ',0)';\n })\n .attr('x1', 0)\n .attr('y1', function(d, i) {\n return y(getHigh(d, i));\n })\n .attr('x2', 0)\n .attr('y2', function(d, i) {\n return y(getLow(d, i));\n });\n\n var rects = tickGroups.append('rect')\n .attr('class', 'nv-candlestick-rects nv-bars')\n .attr('transform', function(d, i) {\n return 'translate(' + (x(getX(d, i)) - barWidth / 2) + ','\n + (y(getY(d, i)) - (getOpen(d, i) > getClose(d, i) ? (y(getClose(d, i)) - y(getOpen(d, i))) : 0))\n + ')';\n })\n .attr('x', 0)\n .attr('y', 0)\n .attr('width', barWidth)\n .attr('height', function(d, i) {\n var open = getOpen(d, i);\n var close = getClose(d, i);\n return open > close ? y(close) - y(open) : y(open) - y(close);\n });\n\n ticks.select('.nv-candlestick-lines').transition()\n .attr('transform', function(d, i) {\n return 'translate(' + x(getX(d, i)) + ',0)';\n })\n .attr('x1', 0)\n .attr('y1', function(d, i) {\n return y(getHigh(d, i));\n })\n .attr('x2', 0)\n .attr('y2', function(d, i) {\n return y(getLow(d, i));\n });\n\n ticks.select('.nv-candlestick-rects').transition()\n .attr('transform', function(d, i) {\n return 'translate(' + (x(getX(d, i)) - barWidth / 2) + ','\n + (y(getY(d, i)) - (getOpen(d, i) > getClose(d, i) ? (y(getClose(d, i)) - y(getOpen(d, i))) : 0))\n + ')';\n })\n .attr('x', 0)\n .attr('y', 0)\n .attr('width', barWidth)\n .attr('height', function(d, i) {\n var open = getOpen(d, i);\n var close = getClose(d, i);\n return open > close ? y(close) - y(open) : y(open) - y(close);\n });\n });\n\n return chart;\n }\n\n\n //Create methods to allow outside functions to highlight a specific bar.\n chart.highlightPoint = function(pointIndex, isHoverOver) {\n chart.clearHighlights();\n container.select('.nv-candlestickBar .nv-tick-0-' + pointIndex)\n .classed('hover', isHoverOver)\n ;\n };\n\n chart.clearHighlights = function() {\n container.select('.nv-candlestickBar .nv-tick.hover')\n .classed('hover', false)\n ;\n };\n\n //============================================================\n // Expose Public Variables\n //------------------------------------------------------------\n\n chart.dispatch = dispatch;\n chart.options = nv.utils.optionsFunc.bind(chart);\n\n chart._options = Object.create({}, {\n // simple options, just get/set the necessary values\n width: {\n get: function() {\n return width;\n }, set: function(_) {\n width = _;\n }\n },\n height: {\n get: function() {\n return height;\n }, set: function(_) {\n height = _;\n }\n },\n xScale: {\n get: function() {\n return x;\n }, set: function(_) {\n x = _;\n }\n },\n yScale: {\n get: function() {\n return y;\n }, set: function(_) {\n y = _;\n }\n },\n xDomain: {\n get: function() {\n return xDomain;\n }, set: function(_) {\n xDomain = _;\n }\n },\n yDomain: {\n get: function() {\n return yDomain;\n }, set: function(_) {\n yDomain = _;\n }\n },\n xRange: {\n get: function() {\n return xRange;\n }, set: function(_) {\n xRange = _;\n }\n },\n yRange: {\n get: function() {\n return yRange;\n }, set: function(_) {\n yRange = _;\n }\n },\n forceX: {\n get: function() {\n return forceX;\n }, set: function(_) {\n forceX = _;\n }\n },\n forceY: {\n get: function() {\n return forceY;\n }, set: function(_) {\n forceY = _;\n }\n },\n padData: {\n get: function() {\n return padData;\n }, set: function(_) {\n padData = _;\n }\n },\n clipEdge: {\n get: function() {\n return clipEdge;\n }, set: function(_) {\n clipEdge = _;\n }\n },\n id: {\n get: function() {\n return id;\n }, set: function(_) {\n id = _;\n }\n },\n interactive: {\n get: function() {\n return interactive;\n }, set: function(_) {\n interactive = _;\n }\n },\n\n x: {\n get: function() {\n return getX;\n }, set: function(_) {\n getX = _;\n }\n },\n y: {\n get: function() {\n return getY;\n }, set: function(_) {\n getY = _;\n }\n },\n open: {\n get: function() {\n return getOpen();\n }, set: function(_) {\n getOpen = _;\n }\n },\n close: {\n get: function() {\n return getClose();\n }, set: function(_) {\n getClose = _;\n }\n },\n high: {\n get: function() {\n return getHigh;\n }, set: function(_) {\n getHigh = _;\n }\n },\n low: {\n get: function() {\n return getLow;\n }, set: function(_) {\n getLow = _;\n }\n },\n\n // options that require extra logic in the setter\n margin: {\n get: function() {\n return margin;\n }, set: function(_) {\n margin.top = _.top != undefined ? _.top : margin.top;\n margin.right = _.right != undefined ? _.right : margin.right;\n margin.bottom = _.bottom != undefined ? _.bottom : margin.bottom;\n margin.left = _.left != undefined ? _.left : margin.left;\n }\n },\n color: {\n get: function() {\n return color;\n }, set: function(_) {\n color = nv.utils.getColor(_);\n }\n }\n });\n\n nv.utils.initOptions(chart);\n return chart;\n };\n\n nv.models.cumulativeLineChart = function() {\n 'use strict';\n\n //============================================================\n // Public Variables with Default Settings\n //------------------------------------------------------------\n\n var lines = nv.models.line()\n , xAxis = nv.models.axis()\n , yAxis = nv.models.axis()\n , legend = nv.models.legend()\n , controls = nv.models.legend()\n , interactiveLayer = nv.interactiveGuideline()\n , tooltip = nv.models.tooltip()\n ;\n\n var margin = {top: 30, right: 30, bottom: 50, left: 60}\n , marginTop = null\n , color = nv.utils.defaultColor()\n , width = null\n , height = null\n , showLegend = true\n , showXAxis = true\n , showYAxis = true\n , rightAlignYAxis = false\n , showControls = true\n , useInteractiveGuideline = false\n , rescaleY = true\n , x //can be accessed via chart.xScale()\n , y //can be accessed via chart.yScale()\n , id = lines.id()\n , state = nv.utils.state()\n , defaultState = null\n , noData = null\n , average = function(d) {\n return d.average;\n }\n , dispatch = d3.dispatch('stateChange', 'changeState', 'renderEnd')\n , transitionDuration = 250\n , duration = 250\n , noErrorCheck = false //if set to TRUE, will bypass an error check in the indexify function.\n ;\n\n state.index = 0;\n state.rescaleY = rescaleY;\n\n xAxis.orient('bottom').tickPadding(7);\n yAxis.orient((rightAlignYAxis) ? 'right' : 'left');\n\n tooltip.valueFormatter(function(d, i) {\n return yAxis.tickFormat()(d, i);\n }).headerFormatter(function(d, i) {\n return xAxis.tickFormat()(d, i);\n });\n\n controls.updateState(false);\n\n //============================================================\n // Private Variables\n //------------------------------------------------------------\n\n var dx = d3.scale.linear()\n , index = {i: 0, x: 0}\n , renderWatch = nv.utils.renderWatch(dispatch, duration)\n , currentYDomain\n ;\n\n var stateGetter = function(data) {\n return function() {\n return {\n active: data.map(function(d) {\n return !d.disabled;\n }),\n index: index.i,\n rescaleY: rescaleY\n };\n };\n };\n\n var stateSetter = function(data) {\n return function(state) {\n if (state.index !== undefined) {\n index.i = state.index;\n }\n if (state.rescaleY !== undefined) {\n rescaleY = state.rescaleY;\n }\n if (state.active !== undefined) {\n data.forEach(function(series, i) {\n series.disabled = !state.active[i];\n });\n }\n };\n };\n\n function chart(selection) {\n renderWatch.reset();\n renderWatch.models(lines);\n if (showXAxis) renderWatch.models(xAxis);\n if (showYAxis) renderWatch.models(yAxis);\n selection.each(function(data) {\n var container = d3.select(this);\n nv.utils.initSVG(container);\n container.classed('nv-chart-' + id, true);\n var that = this;\n\n var availableWidth = nv.utils.availableWidth(width, container, margin),\n availableHeight = nv.utils.availableHeight(height, container, margin);\n\n chart.update = function() {\n if (duration === 0) {\n container.call(chart);\n } else {\n container.transition().duration(duration).call(chart);\n }\n };\n chart.container = this;\n\n state\n .setter(stateSetter(data), chart.update)\n .getter(stateGetter(data))\n .update();\n\n // DEPRECATED set state.disableddisabled\n state.disabled = data.map(function(d) {\n return !!d.disabled;\n });\n\n if (!defaultState) {\n var key;\n defaultState = {};\n for (key in state) {\n if (state[key] instanceof Array) {\n defaultState[key] = state[key].slice(0);\n } else {\n defaultState[key] = state[key];\n }\n }\n }\n\n var indexDrag = d3.behavior.drag()\n .on('dragstart', dragStart)\n .on('drag', dragMove)\n .on('dragend', dragEnd);\n\n\n function dragStart(d, i) {\n d3.select(chart.container)\n .style('cursor', 'ew-resize');\n }\n\n function dragMove(d, i) {\n index.x = d3.event.x;\n index.i = Math.round(dx.invert(index.x));\n updateZero();\n }\n\n function dragEnd(d, i) {\n d3.select(chart.container)\n .style('cursor', 'auto');\n\n // update state and send stateChange with new index\n state.index = index.i;\n dispatch.stateChange(state);\n }\n\n // Display No Data message if there's nothing to show.\n if (!data || !data.length || !data.filter(function(d) {\n return d.values.length;\n }).length) {\n nv.utils.noData(chart, container);\n return chart;\n } else {\n container.selectAll('.nv-noData').remove();\n }\n\n // Setup Scales\n x = lines.xScale();\n y = lines.yScale();\n\n\n dx.domain([0, data[0].values.length - 1]) //Assumes all series have same length\n .range([0, availableWidth])\n .clamp(true);\n\n var data = indexify(index.i, data);\n\n // initialize the starting yDomain for the not-rescale case after indexify (to have calculated point.display)\n if (typeof (currentYDomain) === 'undefined') {\n currentYDomain = getCurrentYDomain(data);\n }\n\n if (!rescaleY) {\n lines.yDomain(currentYDomain);\n lines.clipEdge(true);\n } else {\n lines.yDomain(null);\n }\n\n // Setup containers and skeleton of chart\n var interactivePointerEvents = (useInteractiveGuideline) ? 'none' : 'all';\n var wrap = container.selectAll('g.nv-wrap.nv-cumulativeLine').data([data]);\n var gEnter = wrap.enter().append('g').attr('class', 'nvd3 nv-wrap nv-cumulativeLine').append('g');\n var g = wrap.select('g');\n\n gEnter.append('g').attr('class', 'nv-interactive');\n gEnter.append('g').attr('class', 'nv-x nv-axis').style('pointer-events', 'none');\n gEnter.append('g').attr('class', 'nv-y nv-axis');\n gEnter.append('g').attr('class', 'nv-background');\n gEnter.append('g').attr('class', 'nv-linesWrap').style('pointer-events', interactivePointerEvents);\n gEnter.append('g').attr('class', 'nv-avgLinesWrap').style('pointer-events', 'none');\n gEnter.append('g').attr('class', 'nv-legendWrap');\n gEnter.append('g').attr('class', 'nv-controlsWrap');\n\n // Legend\n if (!showLegend) {\n g.select('.nv-legendWrap').selectAll('*').remove();\n } else {\n legend.width(availableWidth);\n\n g.select('.nv-legendWrap')\n .datum(data)\n .call(legend);\n\n if (!marginTop && legend.height() !== margin.top) {\n margin.top = legend.height();\n availableHeight = nv.utils.availableHeight(height, container, margin);\n }\n\n g.select('.nv-legendWrap')\n .attr('transform', 'translate(0,' + (-margin.top) + ')');\n }\n\n // Controls\n if (!showControls) {\n g.select('.nv-controlsWrap').selectAll('*').remove();\n } else {\n var controlsData = [\n {key: 'Re-scale y-axis', disabled: !rescaleY}\n ];\n\n controls\n .width(140)\n .color(['#444', '#444', '#444'])\n .rightAlign(false)\n .margin({top: 5, right: 0, bottom: 5, left: 20})\n ;\n\n g.select('.nv-controlsWrap')\n .datum(controlsData)\n .attr('transform', 'translate(0,' + (-margin.top) + ')')\n .call(controls);\n }\n\n wrap.attr('transform', 'translate(' + margin.left + ',' + margin.top + ')');\n\n if (rightAlignYAxis) {\n g.select('.nv-y.nv-axis')\n .attr('transform', 'translate(' + availableWidth + ',0)');\n }\n\n // Show error if index point value is 0 (division by zero avoided)\n var tempDisabled = data.filter(function(d) {\n return d.tempDisabled;\n });\n\n wrap.select('.tempDisabled').remove(); //clean-up and prevent duplicates\n if (tempDisabled.length) {\n wrap.append('text').attr('class', 'tempDisabled')\n .attr('x', availableWidth / 2)\n .attr('y', '-.71em')\n .style('text-anchor', 'end')\n .text(tempDisabled.map(function(d) {\n return d.key;\n }).join(', ') + ' values cannot be calculated for this time period.');\n }\n\n //Set up interactive layer\n if (useInteractiveGuideline) {\n interactiveLayer\n .width(availableWidth)\n .height(availableHeight)\n .margin({left: margin.left, top: margin.top})\n .svgContainer(container)\n .xScale(x);\n wrap.select('.nv-interactive').call(interactiveLayer);\n }\n\n gEnter.select('.nv-background')\n .append('rect');\n\n g.select('.nv-background rect')\n .attr('width', availableWidth)\n .attr('height', availableHeight);\n\n lines\n //.x(function(d) { return d.x })\n .y(function(d) {\n return d.display.y;\n })\n .width(availableWidth)\n .height(availableHeight)\n .color(data.map(function(d, i) {\n return d.color || color(d, i);\n }).filter(function(d, i) {\n return !data[i].disabled && !data[i].tempDisabled;\n }));\n\n var linesWrap = g.select('.nv-linesWrap')\n .datum(data.filter(function(d) {\n return !d.disabled && !d.tempDisabled;\n }));\n\n linesWrap.call(lines);\n\n //Store a series index number in the data array.\n data.forEach(function(d, i) {\n d.seriesIndex = i;\n });\n\n var avgLineData = data.filter(function(d) {\n return !d.disabled && !!average(d);\n });\n\n var avgLines = g.select('.nv-avgLinesWrap').selectAll('line')\n .data(avgLineData, function(d) {\n return d.key;\n });\n\n var getAvgLineY = function(d) {\n //If average lines go off the svg element, clamp them to the svg bounds.\n var yVal = y(average(d));\n if (yVal < 0) return 0;\n if (yVal > availableHeight) return availableHeight;\n return yVal;\n };\n\n avgLines.enter()\n .append('line')\n .style('stroke-width', 2)\n .style('stroke-dasharray', '10,10')\n .style('stroke', function(d, i) {\n return lines.color()(d, d.seriesIndex);\n })\n .attr('x1', 0)\n .attr('x2', availableWidth)\n .attr('y1', getAvgLineY)\n .attr('y2', getAvgLineY);\n\n avgLines\n .style('stroke-opacity', function(d) {\n //If average lines go offscreen, make them transparent\n var yVal = y(average(d));\n if (yVal < 0 || yVal > availableHeight) return 0;\n return 1;\n })\n .attr('x1', 0)\n .attr('x2', availableWidth)\n .attr('y1', getAvgLineY)\n .attr('y2', getAvgLineY);\n\n avgLines.exit().remove();\n\n //Create index line\n var indexLine = linesWrap.selectAll('.nv-indexLine')\n .data([index]);\n indexLine.enter().append('rect').attr('class', 'nv-indexLine')\n .attr('width', 3)\n .attr('x', -2)\n .attr('fill', 'red')\n .attr('fill-opacity', .5)\n .style('pointer-events', 'all')\n .call(indexDrag);\n\n indexLine\n .attr('transform', function(d) {\n return 'translate(' + dx(d.i) + ',0)';\n })\n .attr('height', availableHeight);\n\n // Setup Axes\n if (showXAxis) {\n xAxis\n .scale(x)\n ._ticks(nv.utils.calcTicksX(availableWidth / 70, data))\n .tickSize(-availableHeight, 0);\n\n g.select('.nv-x.nv-axis')\n .attr('transform', 'translate(0,' + y.range()[0] + ')');\n g.select('.nv-x.nv-axis')\n .call(xAxis);\n }\n\n if (showYAxis) {\n yAxis\n .scale(y)\n ._ticks(nv.utils.calcTicksY(availableHeight / 36, data))\n .tickSize(-availableWidth, 0);\n\n g.select('.nv-y.nv-axis')\n .call(yAxis);\n }\n\n //============================================================\n // Event Handling/Dispatching (in chart's scope)\n //------------------------------------------------------------\n\n function updateZero() {\n indexLine\n .data([index]);\n\n //When dragging the index line, turn off line transitions.\n // Then turn them back on when done dragging.\n var oldDuration = chart.duration();\n chart.duration(0);\n chart.update();\n chart.duration(oldDuration);\n }\n\n g.select('.nv-background rect')\n .on('click', function() {\n index.x = d3.mouse(this)[0];\n index.i = Math.round(dx.invert(index.x));\n\n // update state and send stateChange with new index\n state.index = index.i;\n dispatch.stateChange(state);\n\n updateZero();\n });\n\n lines.dispatch.on('elementClick', function(e) {\n index.i = e.pointIndex;\n index.x = dx(index.i);\n\n // update state and send stateChange with new index\n state.index = index.i;\n dispatch.stateChange(state);\n\n updateZero();\n });\n\n controls.dispatch.on('legendClick', function(d, i) {\n d.disabled = !d.disabled;\n rescaleY = !d.disabled;\n state.rescaleY = rescaleY;\n if (!rescaleY) {\n currentYDomain = getCurrentYDomain(data); // rescale is turned off, so set the currentYDomain\n }\n dispatch.stateChange(state);\n chart.update();\n });\n\n legend.dispatch.on('stateChange', function(newState) {\n for (var key in newState) {\n state[key] = newState[key];\n }\n dispatch.stateChange(state);\n chart.update();\n });\n\n interactiveLayer.dispatch.on('elementMousemove', function(e) {\n lines.clearHighlights();\n var singlePoint, pointIndex, pointXLocation, allData = [];\n\n data\n .filter(function(series, i) {\n series.seriesIndex = i;\n return !(series.disabled || series.tempDisabled);\n })\n .forEach(function(series, i) {\n pointIndex = nv.interactiveBisect(series.values, e.pointXValue, chart.x());\n lines.highlightPoint(i, pointIndex, true);\n var point = series.values[pointIndex];\n if (typeof point === 'undefined') return;\n if (typeof singlePoint === 'undefined') singlePoint = point;\n if (typeof pointXLocation === 'undefined') {\n pointXLocation = chart.xScale()(\n chart.x()(point, pointIndex));\n }\n allData.push({\n key: series.key,\n value: chart.y()(point, pointIndex),\n color: color(series, series.seriesIndex)\n });\n });\n\n //Highlight the tooltip entry based on which point the mouse is closest to.\n if (allData.length > 2) {\n var yValue = chart.yScale().invert(e.mouseY);\n var domainExtent = Math.abs(chart.yScale().domain()[0] - chart.yScale().domain()[1]);\n var threshold = 0.03 * domainExtent;\n var indexToHighlight = nv.nearestValueIndex(allData.map(function(d) {\n return d.value;\n }), yValue, threshold);\n if (indexToHighlight !== null) {\n allData[indexToHighlight].highlight = true;\n }\n }\n\n var xValue = xAxis.tickFormat()(chart.x()(singlePoint, pointIndex), pointIndex);\n interactiveLayer.tooltip\n .valueFormatter(function(d, i) {\n return yAxis.tickFormat()(d);\n })\n .data(\n {\n value: xValue,\n series: allData\n }\n )();\n\n interactiveLayer.renderGuideLine(pointXLocation);\n });\n\n interactiveLayer.dispatch.on('elementMouseout', function(e) {\n lines.clearHighlights();\n });\n\n // Update chart from a state object passed to event handler\n dispatch.on('changeState', function(e) {\n if (typeof e.disabled !== 'undefined') {\n data.forEach(function(series, i) {\n series.disabled = e.disabled[i];\n });\n\n state.disabled = e.disabled;\n }\n\n if (typeof e.index !== 'undefined') {\n index.i = e.index;\n index.x = dx(index.i);\n\n state.index = e.index;\n\n indexLine\n .data([index]);\n }\n\n if (typeof e.rescaleY !== 'undefined') {\n rescaleY = e.rescaleY;\n }\n\n chart.update();\n });\n\n });\n\n renderWatch.renderEnd('cumulativeLineChart immediate');\n\n return chart;\n }\n\n //============================================================\n // Event Handling/Dispatching (out of chart's scope)\n //------------------------------------------------------------\n\n lines.dispatch.on('elementMouseover.tooltip', function(evt) {\n var point = {\n x: chart.x()(evt.point),\n y: chart.y()(evt.point),\n color: evt.point.color\n };\n evt.point = point;\n tooltip.data(evt).hidden(false);\n });\n\n lines.dispatch.on('elementMouseout.tooltip', function(evt) {\n tooltip.hidden(true);\n });\n\n //============================================================\n // Functions\n //------------------------------------------------------------\n\n var indexifyYGetter = null;\n\n /* Normalize the data according to an index point. */\n function indexify(idx, data) {\n if (!indexifyYGetter) indexifyYGetter = lines.y();\n return data.map(function(line, i) {\n if (!line.values) {\n return line;\n }\n var indexValue = line.values[idx];\n if (indexValue == null) {\n return line;\n }\n var v = indexifyYGetter(indexValue, idx);\n\n // avoid divide by zero\n if (Math.abs(v) < 0.00001 && !noErrorCheck) {\n line.tempDisabled = true;\n return line;\n }\n\n line.tempDisabled = false;\n\n line.values = line.values.map(function(point, pointIndex) {\n point.display = {'y': (indexifyYGetter(point, pointIndex) - v) / v};\n return point;\n });\n\n return line;\n });\n }\n\n function getCurrentYDomain(data) {\n var seriesDomains = data\n .filter(function(series) {\n return !(series.disabled || series.tempDisabled);\n })\n .map(function(series, i) {\n return d3.extent(series.values, function(d) {\n return d.display.y;\n });\n });\n\n return [\n d3.min(seriesDomains, function(d) {\n return d[0];\n }),\n d3.max(seriesDomains, function(d) {\n return d[1];\n })\n ];\n }\n\n //============================================================\n // Expose Public Variables\n //------------------------------------------------------------\n\n // expose chart's sub-components\n chart.dispatch = dispatch;\n chart.lines = lines;\n chart.legend = legend;\n chart.controls = controls;\n chart.xAxis = xAxis;\n chart.yAxis = yAxis;\n chart.interactiveLayer = interactiveLayer;\n chart.state = state;\n chart.tooltip = tooltip;\n\n chart.options = nv.utils.optionsFunc.bind(chart);\n\n chart._options = Object.create({}, {\n // simple options, just get/set the necessary values\n width: {\n get: function() {\n return width;\n }, set: function(_) {\n width = _;\n }\n },\n height: {\n get: function() {\n return height;\n }, set: function(_) {\n height = _;\n }\n },\n showControls: {\n get: function() {\n return showControls;\n }, set: function(_) {\n showControls = _;\n }\n },\n showLegend: {\n get: function() {\n return showLegend;\n }, set: function(_) {\n showLegend = _;\n }\n },\n average: {\n get: function() {\n return average;\n }, set: function(_) {\n average = _;\n }\n },\n defaultState: {\n get: function() {\n return defaultState;\n }, set: function(_) {\n defaultState = _;\n }\n },\n noData: {\n get: function() {\n return noData;\n }, set: function(_) {\n noData = _;\n }\n },\n showXAxis: {\n get: function() {\n return showXAxis;\n }, set: function(_) {\n showXAxis = _;\n }\n },\n showYAxis: {\n get: function() {\n return showYAxis;\n }, set: function(_) {\n showYAxis = _;\n }\n },\n noErrorCheck: {\n get: function() {\n return noErrorCheck;\n }, set: function(_) {\n noErrorCheck = _;\n }\n },\n\n // options that require extra logic in the setter\n rescaleY: {\n get: function() {\n return rescaleY;\n }, set: function(_) {\n rescaleY = _;\n chart.state.rescaleY = _; // also update state\n }\n },\n margin: {\n get: function() {\n return margin;\n }, set: function(_) {\n if (_.top !== undefined) {\n margin.top = _.top;\n marginTop = _.top;\n }\n margin.right = _.right !== undefined ? _.right : margin.right;\n margin.bottom = _.bottom !== undefined ? _.bottom : margin.bottom;\n margin.left = _.left !== undefined ? _.left : margin.left;\n }\n },\n color: {\n get: function() {\n return color;\n }, set: function(_) {\n color = nv.utils.getColor(_);\n legend.color(color);\n }\n },\n useInteractiveGuideline: {\n get: function() {\n return useInteractiveGuideline;\n }, set: function(_) {\n useInteractiveGuideline = _;\n if (_ === true) {\n chart.interactive(false);\n chart.useVoronoi(false);\n }\n }\n },\n rightAlignYAxis: {\n get: function() {\n return rightAlignYAxis;\n }, set: function(_) {\n rightAlignYAxis = _;\n yAxis.orient((_) ? 'right' : 'left');\n }\n },\n duration: {\n get: function() {\n return duration;\n }, set: function(_) {\n duration = _;\n lines.duration(duration);\n xAxis.duration(duration);\n yAxis.duration(duration);\n renderWatch.reset(duration);\n }\n }\n });\n\n nv.utils.inheritOptions(chart, lines);\n nv.utils.initOptions(chart);\n\n return chart;\n };\n//TODO: consider deprecating by adding necessary features to multiBar model\n nv.models.discreteBar = function() {\n 'use strict';\n\n //============================================================\n // Public Variables with Default Settings\n //------------------------------------------------------------\n\n var margin = {top: 0, right: 0, bottom: 0, left: 0}\n ,\n width = 960\n ,\n height = 500\n ,\n id = Math.floor(Math.random() * 10000) //Create semi-unique ID in case user doesn't select one\n ,\n container\n ,\n x = d3.scale.ordinal()\n ,\n y = d3.scale.linear()\n ,\n getX = function(d) {\n return d.x;\n }\n ,\n getY = function(d) {\n return d.y;\n }\n ,\n forceY = [0] // 0 is forced by default.. this makes sense for the majority of bar graphs... user can always do\n // chart.forceY([]) to remove\n ,\n color = nv.utils.defaultColor()\n ,\n showValues = false\n ,\n valueFormat = d3.format(',.2f')\n ,\n xDomain\n ,\n yDomain\n ,\n xRange\n ,\n yRange\n ,\n dispatch = d3.dispatch('chartClick', 'elementClick', 'elementDblClick', 'elementMouseover', 'elementMouseout',\n 'elementMousemove', 'renderEnd')\n ,\n rectClass = 'discreteBar'\n ,\n duration = 250\n ;\n\n //============================================================\n // Private Variables\n //------------------------------------------------------------\n\n var x0, y0;\n var renderWatch = nv.utils.renderWatch(dispatch, duration);\n\n function chart(selection) {\n renderWatch.reset();\n selection.each(function(data) {\n var availableWidth = width - margin.left - margin.right,\n availableHeight = height - margin.top - margin.bottom;\n\n container = d3.select(this);\n nv.utils.initSVG(container);\n\n //add series index to each data point for reference\n data.forEach(function(series, i) {\n series.values.forEach(function(point) {\n point.series = i;\n });\n });\n\n // Setup Scales\n // remap and flatten the data for use in calculating the scales' domains\n var seriesData = (xDomain && yDomain) ? [] : // if we know xDomain and yDomain, no need to calculate\n data.map(function(d) {\n return d.values.map(function(d, i) {\n return {x: getX(d, i), y: getY(d, i), y0: d.y0};\n });\n });\n\n x.domain(xDomain || d3.merge(seriesData).map(function(d) {\n return d.x;\n }))\n .rangeBands(xRange || [0, availableWidth], .1);\n y.domain(yDomain || d3.extent(d3.merge(seriesData).map(function(d) {\n return d.y;\n }).concat(forceY)));\n\n // If showValues, pad the Y axis range to account for label height\n if (showValues) {\n y.range(yRange || [availableHeight - (y.domain()[0] < 0 ? 12 : 0), y.domain()[1] > 0 ? 12 : 0]);\n } else {\n y.range(yRange || [availableHeight, 0]);\n }\n\n //store old scales if they exist\n x0 = x0 || x;\n y0 = y0 || y.copy().range([y(0), y(0)]);\n\n // Setup containers and skeleton of chart\n var wrap = container.selectAll('g.nv-wrap.nv-discretebar').data([data]);\n var wrapEnter = wrap.enter().append('g').attr('class', 'nvd3 nv-wrap nv-discretebar');\n var gEnter = wrapEnter.append('g');\n var g = wrap.select('g');\n\n gEnter.append('g').attr('class', 'nv-groups');\n wrap.attr('transform', 'translate(' + margin.left + ',' + margin.top + ')');\n\n //TODO: by definition, the discrete bar should not have multiple groups, will modify/remove later\n var groups = wrap.select('.nv-groups').selectAll('.nv-group')\n .data(function(d) {\n return d;\n }, function(d) {\n return d.key;\n });\n groups.enter().append('g')\n .style('stroke-opacity', 1e-6)\n .style('fill-opacity', 1e-6);\n groups.exit()\n .watchTransition(renderWatch, 'discreteBar: exit groups')\n .style('stroke-opacity', 1e-6)\n .style('fill-opacity', 1e-6)\n .remove();\n groups\n .attr('class', function(d, i) {\n return 'nv-group nv-series-' + i;\n })\n .classed('hover', function(d) {\n return d.hover;\n });\n groups\n .watchTransition(renderWatch, 'discreteBar: groups')\n .style('stroke-opacity', 1)\n .style('fill-opacity', .75);\n\n var bars = groups.selectAll('g.nv-bar')\n .data(function(d) {\n return d.values;\n });\n bars.exit().remove();\n\n var barsEnter = bars.enter().append('g')\n .attr('transform', function(d, i, j) {\n return 'translate(' + (x(getX(d, i)) + x.rangeBand() * .05) + ', ' + y(0) + ')';\n })\n .on('mouseover', function(d, i) { //TODO: figure out why j works above, but not here\n d3.select(this).classed('hover', true);\n dispatch.elementMouseover({\n data: d,\n index: i,\n color: d3.select(this).style('fill')\n });\n })\n .on('mouseout', function(d, i) {\n d3.select(this).classed('hover', false);\n dispatch.elementMouseout({\n data: d,\n index: i,\n color: d3.select(this).style('fill')\n });\n })\n .on('mousemove', function(d, i) {\n dispatch.elementMousemove({\n data: d,\n index: i,\n color: d3.select(this).style('fill')\n });\n })\n .on('click', function(d, i) {\n var element = this;\n dispatch.elementClick({\n data: d,\n index: i,\n color: d3.select(this).style('fill'),\n event: d3.event,\n element: element\n });\n d3.event.stopPropagation();\n })\n .on('dblclick', function(d, i) {\n dispatch.elementDblClick({\n data: d,\n index: i,\n color: d3.select(this).style('fill')\n });\n d3.event.stopPropagation();\n });\n\n barsEnter.append('rect')\n .attr('height', 0)\n .attr('width', x.rangeBand() * .9 / data.length);\n\n if (showValues) {\n barsEnter.append('text')\n .attr('text-anchor', 'middle')\n ;\n\n bars.select('text')\n .text(function(d, i) {\n return valueFormat(getY(d, i));\n })\n .watchTransition(renderWatch, 'discreteBar: bars text')\n .attr('x', x.rangeBand() * .9 / 2)\n .attr('y', function(d, i) {\n return getY(d, i) < 0 ? y(getY(d, i)) - y(0) + 12 : -4;\n })\n\n ;\n } else {\n bars.selectAll('text').remove();\n }\n\n bars\n .attr('class', function(d, i) {\n return getY(d, i) < 0 ? 'nv-bar negative' : 'nv-bar positive';\n })\n .style('fill', function(d, i) {\n return d.color || color(d, i);\n })\n .style('stroke', function(d, i) {\n return d.color || color(d, i);\n })\n .select('rect')\n .attr('class', rectClass)\n .watchTransition(renderWatch, 'discreteBar: bars rect')\n .attr('width', x.rangeBand() * .9 / data.length);\n bars.watchTransition(renderWatch, 'discreteBar: bars')\n //.delay(function(d,i) { return i * 1200 / data[0].values.length })\n .attr('transform', function(d, i) {\n var left = x(getX(d, i)) + x.rangeBand() * .05,\n top = getY(d, i) < 0 ?\n y(0) :\n y(0) - y(getY(d, i)) < 1 ?\n y(0) - 1 : //make 1 px positive bars show up above y=0\n y(getY(d, i));\n\n return 'translate(' + left + ', ' + top + ')';\n })\n .select('rect')\n .attr('height', function(d, i) {\n return Math.max(Math.abs(y(getY(d, i)) - y(0)), 1);\n });\n\n\n //store old scales for use in transitions on update\n x0 = x.copy();\n y0 = y.copy();\n\n });\n\n renderWatch.renderEnd('discreteBar immediate');\n return chart;\n }\n\n //============================================================\n // Expose Public Variables\n //------------------------------------------------------------\n\n chart.dispatch = dispatch;\n chart.options = nv.utils.optionsFunc.bind(chart);\n\n chart._options = Object.create({}, {\n // simple options, just get/set the necessary values\n width: {\n get: function() {\n return width;\n }, set: function(_) {\n width = _;\n }\n },\n height: {\n get: function() {\n return height;\n }, set: function(_) {\n height = _;\n }\n },\n forceY: {\n get: function() {\n return forceY;\n }, set: function(_) {\n forceY = _;\n }\n },\n showValues: {\n get: function() {\n return showValues;\n }, set: function(_) {\n showValues = _;\n }\n },\n x: {\n get: function() {\n return getX;\n }, set: function(_) {\n getX = _;\n }\n },\n y: {\n get: function() {\n return getY;\n }, set: function(_) {\n getY = _;\n }\n },\n xScale: {\n get: function() {\n return x;\n }, set: function(_) {\n x = _;\n }\n },\n yScale: {\n get: function() {\n return y;\n }, set: function(_) {\n y = _;\n }\n },\n xDomain: {\n get: function() {\n return xDomain;\n }, set: function(_) {\n xDomain = _;\n }\n },\n yDomain: {\n get: function() {\n return yDomain;\n }, set: function(_) {\n yDomain = _;\n }\n },\n xRange: {\n get: function() {\n return xRange;\n }, set: function(_) {\n xRange = _;\n }\n },\n yRange: {\n get: function() {\n return yRange;\n }, set: function(_) {\n yRange = _;\n }\n },\n valueFormat: {\n get: function() {\n return valueFormat;\n }, set: function(_) {\n valueFormat = _;\n }\n },\n id: {\n get: function() {\n return id;\n }, set: function(_) {\n id = _;\n }\n },\n rectClass: {\n get: function() {\n return rectClass;\n }, set: function(_) {\n rectClass = _;\n }\n },\n\n // options that require extra logic in the setter\n margin: {\n get: function() {\n return margin;\n }, set: function(_) {\n margin.top = _.top !== undefined ? _.top : margin.top;\n margin.right = _.right !== undefined ? _.right : margin.right;\n margin.bottom = _.bottom !== undefined ? _.bottom : margin.bottom;\n margin.left = _.left !== undefined ? _.left : margin.left;\n }\n },\n color: {\n get: function() {\n return color;\n }, set: function(_) {\n color = nv.utils.getColor(_);\n }\n },\n duration: {\n get: function() {\n return duration;\n }, set: function(_) {\n duration = _;\n renderWatch.reset(duration);\n }\n }\n });\n\n nv.utils.initOptions(chart);\n\n return chart;\n };\n\n nv.models.discreteBarChart = function() {\n 'use strict';\n\n //============================================================\n // Public Variables with Default Settings\n //------------------------------------------------------------\n\n var discretebar = nv.models.discreteBar()\n , xAxis = nv.models.axis()\n , yAxis = nv.models.axis()\n , legend = nv.models.legend()\n , tooltip = nv.models.tooltip()\n ;\n\n var margin = {top: 15, right: 10, bottom: 50, left: 60}\n , marginTop = null\n , width = null\n , height = null\n , color = nv.utils.getColor()\n , showLegend = false\n , showXAxis = true\n , showYAxis = true\n , rightAlignYAxis = false\n , staggerLabels = false\n , wrapLabels = false\n , rotateLabels = 0\n , x\n , y\n , noData = null\n , dispatch = d3.dispatch('beforeUpdate', 'renderEnd')\n , duration = 250\n ;\n\n xAxis\n .orient('bottom')\n .showMaxMin(false)\n .tickFormat(function(d) {\n return d;\n })\n ;\n yAxis\n .orient((rightAlignYAxis) ? 'right' : 'left')\n .tickFormat(d3.format(',.1f'))\n ;\n\n tooltip\n .duration(0)\n .headerEnabled(false)\n .valueFormatter(function(d, i) {\n return yAxis.tickFormat()(d, i);\n })\n .keyFormatter(function(d, i) {\n return xAxis.tickFormat()(d, i);\n });\n\n //============================================================\n // Private Variables\n //------------------------------------------------------------\n\n var renderWatch = nv.utils.renderWatch(dispatch, duration);\n\n function chart(selection) {\n renderWatch.reset();\n renderWatch.models(discretebar);\n if (showXAxis) renderWatch.models(xAxis);\n if (showYAxis) renderWatch.models(yAxis);\n\n selection.each(function(data) {\n var container = d3.select(this),\n that = this;\n nv.utils.initSVG(container);\n var availableWidth = nv.utils.availableWidth(width, container, margin),\n availableHeight = nv.utils.availableHeight(height, container, margin);\n\n chart.update = function() {\n dispatch.beforeUpdate();\n container.transition().duration(duration).call(chart);\n };\n chart.container = this;\n\n // Display No Data message if there's nothing to show.\n if (!data || !data.length || !data.filter(function(d) {\n return d.values.length;\n }).length) {\n nv.utils.noData(chart, container);\n return chart;\n } else {\n container.selectAll('.nv-noData').remove();\n }\n\n // Setup Scales\n x = discretebar.xScale();\n y = discretebar.yScale().clamp(true);\n\n // Setup containers and skeleton of chart\n var wrap = container.selectAll('g.nv-wrap.nv-discreteBarWithAxes').data([data]);\n var gEnter = wrap.enter().append('g').attr('class', 'nvd3 nv-wrap nv-discreteBarWithAxes').append('g');\n var defsEnter = gEnter.append('defs');\n var g = wrap.select('g');\n\n gEnter.append('g').attr('class', 'nv-x nv-axis');\n gEnter.append('g').attr('class', 'nv-y nv-axis')\n .append('g').attr('class', 'nv-zeroLine')\n .append('line');\n\n gEnter.append('g').attr('class', 'nv-barsWrap');\n gEnter.append('g').attr('class', 'nv-legendWrap');\n\n g.attr('transform', 'translate(' + margin.left + ',' + margin.top + ')');\n\n // Legend\n if (!showLegend) {\n g.select('.nv-legendWrap').selectAll('*').remove();\n } else {\n legend.width(availableWidth);\n\n g.select('.nv-legendWrap')\n .datum(data)\n .call(legend);\n\n if (!marginTop && legend.height() !== margin.top) {\n margin.top = legend.height();\n availableHeight = nv.utils.availableHeight(height, container, margin);\n }\n\n wrap.select('.nv-legendWrap')\n .attr('transform', 'translate(0,' + (-margin.top) + ')');\n }\n\n if (rightAlignYAxis) {\n g.select('.nv-y.nv-axis')\n .attr('transform', 'translate(' + availableWidth + ',0)');\n }\n\n // Main Chart Component(s)\n discretebar\n .width(availableWidth)\n .height(availableHeight);\n\n var barsWrap = g.select('.nv-barsWrap')\n .datum(data.filter(function(d) {\n return !d.disabled;\n }));\n\n barsWrap.transition().call(discretebar);\n\n\n defsEnter.append('clipPath')\n .attr('id', 'nv-x-label-clip-' + discretebar.id())\n .append('rect');\n\n g.select('#nv-x-label-clip-' + discretebar.id() + ' rect')\n .attr('width', x.rangeBand() * (staggerLabels ? 2 : 1))\n .attr('height', 16)\n .attr('x', -x.rangeBand() / (staggerLabels ? 1 : 2));\n\n // Setup Axes\n if (showXAxis) {\n xAxis\n .scale(x)\n ._ticks(nv.utils.calcTicksX(availableWidth / 100, data))\n .tickSize(-availableHeight, 0);\n\n g.select('.nv-x.nv-axis')\n .attr('transform',\n 'translate(0,' + (y.range()[0] + ((discretebar.showValues() && y.domain()[0] < 0) ? 16 : 0)) + ')');\n g.select('.nv-x.nv-axis').call(xAxis);\n\n var xTicks = g.select('.nv-x.nv-axis').selectAll('g');\n if (staggerLabels) {\n xTicks\n .selectAll('text')\n .attr('transform', function(d, i, j) {\n return 'translate(0,' + (j % 2 == 0 ? '5' : '17') + ')';\n });\n }\n\n if (rotateLabels) {\n xTicks\n .selectAll('.tick text')\n .attr('transform', 'rotate(' + rotateLabels + ' 0,0)')\n .style('text-anchor', rotateLabels > 0 ? 'start' : 'end');\n }\n\n if (wrapLabels) {\n g.selectAll('.tick text')\n .call(nv.utils.wrapTicks, chart.xAxis.rangeBand());\n }\n }\n\n if (showYAxis) {\n yAxis\n .scale(y)\n ._ticks(nv.utils.calcTicksY(availableHeight / 36, data))\n .tickSize(-availableWidth, 0);\n\n g.select('.nv-y.nv-axis').call(yAxis);\n }\n\n // Zero line\n g.select('.nv-zeroLine line')\n .attr('x1', 0)\n .attr('x2', (rightAlignYAxis) ? -availableWidth : availableWidth)\n .attr('y1', y(0))\n .attr('y2', y(0))\n ;\n });\n\n renderWatch.renderEnd('discreteBar chart immediate');\n return chart;\n }\n\n //============================================================\n // Event Handling/Dispatching (out of chart's scope)\n //------------------------------------------------------------\n\n discretebar.dispatch.on('elementMouseover.tooltip', function(evt) {\n evt['series'] = {\n key: chart.x()(evt.data),\n value: chart.y()(evt.data),\n color: evt.color\n };\n tooltip.data(evt).hidden(false);\n });\n\n discretebar.dispatch.on('elementMouseout.tooltip', function(evt) {\n tooltip.hidden(true);\n });\n\n discretebar.dispatch.on('elementMousemove.tooltip', function(evt) {\n tooltip();\n });\n\n //============================================================\n // Expose Public Variables\n //------------------------------------------------------------\n\n chart.dispatch = dispatch;\n chart.discretebar = discretebar;\n chart.legend = legend;\n chart.xAxis = xAxis;\n chart.yAxis = yAxis;\n chart.tooltip = tooltip;\n\n chart.options = nv.utils.optionsFunc.bind(chart);\n\n chart._options = Object.create({}, {\n // simple options, just get/set the necessary values\n width: {\n get: function() {\n return width;\n }, set: function(_) {\n width = _;\n }\n },\n height: {\n get: function() {\n return height;\n }, set: function(_) {\n height = _;\n }\n },\n showLegend: {\n get: function() {\n return showLegend;\n }, set: function(_) {\n showLegend = _;\n }\n },\n staggerLabels: {\n get: function() {\n return staggerLabels;\n }, set: function(_) {\n staggerLabels = _;\n }\n },\n rotateLabels: {\n get: function() {\n return rotateLabels;\n }, set: function(_) {\n rotateLabels = _;\n }\n },\n wrapLabels: {\n get: function() {\n return wrapLabels;\n }, set: function(_) {\n wrapLabels = !!_;\n }\n },\n showXAxis: {\n get: function() {\n return showXAxis;\n }, set: function(_) {\n showXAxis = _;\n }\n },\n showYAxis: {\n get: function() {\n return showYAxis;\n }, set: function(_) {\n showYAxis = _;\n }\n },\n noData: {\n get: function() {\n return noData;\n }, set: function(_) {\n noData = _;\n }\n },\n\n // options that require extra logic in the setter\n margin: {\n get: function() {\n return margin;\n }, set: function(_) {\n if (_.top !== undefined) {\n margin.top = _.top;\n marginTop = _.top;\n }\n margin.right = _.right !== undefined ? _.right : margin.right;\n margin.bottom = _.bottom !== undefined ? _.bottom : margin.bottom;\n margin.left = _.left !== undefined ? _.left : margin.left;\n }\n },\n duration: {\n get: function() {\n return duration;\n }, set: function(_) {\n duration = _;\n renderWatch.reset(duration);\n discretebar.duration(duration);\n xAxis.duration(duration);\n yAxis.duration(duration);\n }\n },\n color: {\n get: function() {\n return color;\n }, set: function(_) {\n color = nv.utils.getColor(_);\n discretebar.color(color);\n legend.color(color);\n }\n },\n rightAlignYAxis: {\n get: function() {\n return rightAlignYAxis;\n }, set: function(_) {\n rightAlignYAxis = _;\n yAxis.orient((_) ? 'right' : 'left');\n }\n }\n });\n\n nv.utils.inheritOptions(chart, discretebar);\n nv.utils.initOptions(chart);\n\n return chart;\n };\n\n nv.models.distribution = function() {\n 'use strict';\n //============================================================\n // Public Variables with Default Settings\n //------------------------------------------------------------\n\n var margin = {top: 0, right: 0, bottom: 0, left: 0}\n , width = 400 //technically width or height depending on x or y....\n , size = 8\n , axis = 'x' // 'x' or 'y'... horizontal or vertical\n , getData = function(d) {\n return d[axis];\n } // defaults d.x or d.y\n , color = nv.utils.defaultColor()\n , scale = d3.scale.linear()\n , domain\n , duration = 250\n , dispatch = d3.dispatch('renderEnd')\n ;\n\n //============================================================\n\n\n //============================================================\n // Private Variables\n //------------------------------------------------------------\n\n var scale0;\n var renderWatch = nv.utils.renderWatch(dispatch, duration);\n\n //============================================================\n\n\n function chart(selection) {\n renderWatch.reset();\n selection.each(function(data) {\n var availableLength = width - (axis === 'x' ? margin.left + margin.right : margin.top + margin.bottom),\n naxis = axis == 'x' ? 'y' : 'x',\n container = d3.select(this);\n nv.utils.initSVG(container);\n\n //------------------------------------------------------------\n // Setup Scales\n\n scale0 = scale0 || scale;\n\n //------------------------------------------------------------\n\n\n //------------------------------------------------------------\n // Setup containers and skeleton of chart\n\n var wrap = container.selectAll('g.nv-distribution').data([data]);\n var wrapEnter = wrap.enter().append('g').attr('class', 'nvd3 nv-distribution');\n var gEnter = wrapEnter.append('g');\n var g = wrap.select('g');\n\n wrap.attr('transform', 'translate(' + margin.left + ',' + margin.top + ')');\n\n //------------------------------------------------------------\n\n\n var distWrap = g.selectAll('g.nv-dist')\n .data(function(d) {\n return d;\n }, function(d) {\n return d.key;\n });\n\n distWrap.enter().append('g');\n distWrap\n .attr('class', function(d, i) {\n return 'nv-dist nv-series-' + i;\n })\n .style('stroke', function(d, i) {\n return color(d, i);\n });\n\n var dist = distWrap.selectAll('line.nv-dist' + axis)\n .data(function(d) {\n return d.values;\n });\n dist.enter().append('line')\n .attr(axis + '1', function(d, i) {\n return scale0(getData(d, i));\n })\n .attr(axis + '2', function(d, i) {\n return scale0(getData(d, i));\n });\n renderWatch.transition(distWrap.exit().selectAll('line.nv-dist' + axis), 'dist exit')\n // .transition()\n .attr(axis + '1', function(d, i) {\n return scale(getData(d, i));\n })\n .attr(axis + '2', function(d, i) {\n return scale(getData(d, i));\n })\n .style('stroke-opacity', 0)\n .remove();\n dist\n .attr('class', function(d, i) {\n return 'nv-dist' + axis + ' nv-dist' + axis + '-' + i;\n })\n .attr(naxis + '1', 0)\n .attr(naxis + '2', size);\n renderWatch.transition(dist, 'dist')\n // .transition()\n .attr(axis + '1', function(d, i) {\n return scale(getData(d, i));\n })\n .attr(axis + '2', function(d, i) {\n return scale(getData(d, i));\n });\n\n\n scale0 = scale.copy();\n\n });\n renderWatch.renderEnd('distribution immediate');\n return chart;\n }\n\n\n //============================================================\n // Expose Public Variables\n //------------------------------------------------------------\n chart.options = nv.utils.optionsFunc.bind(chart);\n chart.dispatch = dispatch;\n\n chart.margin = function(_) {\n if (!arguments.length) return margin;\n margin.top = typeof _.top != 'undefined' ? _.top : margin.top;\n margin.right = typeof _.right != 'undefined' ? _.right : margin.right;\n margin.bottom = typeof _.bottom != 'undefined' ? _.bottom : margin.bottom;\n margin.left = typeof _.left != 'undefined' ? _.left : margin.left;\n return chart;\n };\n\n chart.width = function(_) {\n if (!arguments.length) return width;\n width = _;\n return chart;\n };\n\n chart.axis = function(_) {\n if (!arguments.length) return axis;\n axis = _;\n return chart;\n };\n\n chart.size = function(_) {\n if (!arguments.length) return size;\n size = _;\n return chart;\n };\n\n chart.getData = function(_) {\n if (!arguments.length) return getData;\n getData = d3.functor(_);\n return chart;\n };\n\n chart.scale = function(_) {\n if (!arguments.length) return scale;\n scale = _;\n return chart;\n };\n\n chart.color = function(_) {\n if (!arguments.length) return color;\n color = nv.utils.getColor(_);\n return chart;\n };\n\n chart.duration = function(_) {\n if (!arguments.length) return duration;\n duration = _;\n renderWatch.reset(duration);\n return chart;\n };\n //============================================================\n\n\n return chart;\n };\n nv.models.focus = function(content) {\n 'use strict';\n\n //============================================================\n // Public Variables with Default Settings\n //------------------------------------------------------------\n\n var content = content || nv.models.line()\n , xAxis = nv.models.axis()\n , yAxis = nv.models.axis()\n , brush = d3.svg.brush()\n ;\n\n var margin = {top: 10, right: 0, bottom: 30, left: 0}\n , color = nv.utils.defaultColor()\n , width = null\n , height = 70\n , showXAxis = true\n , showYAxis = false\n , rightAlignYAxis = false\n , ticks = null\n , x\n , y\n , brushExtent = null\n , duration = 250\n , dispatch = d3.dispatch('brush', 'onBrush', 'renderEnd')\n , syncBrushing = true\n ;\n\n content.interactive(false);\n content.pointActive(function(d) {\n return false;\n });\n\n //============================================================\n // Private Variables\n //------------------------------------------------------------\n\n var renderWatch = nv.utils.renderWatch(dispatch, duration);\n\n function chart(selection) {\n renderWatch.reset();\n renderWatch.models(content);\n if (showXAxis) renderWatch.models(xAxis);\n if (showYAxis) renderWatch.models(yAxis);\n\n selection.each(function(data) {\n var container = d3.select(this);\n nv.utils.initSVG(container);\n var availableWidth = nv.utils.availableWidth(width, container, margin),\n availableHeight = height - margin.top - margin.bottom;\n\n chart.update = function() {\n if (duration === 0) {\n container.call(chart);\n } else {\n container.transition().duration(duration).call(chart);\n }\n };\n chart.container = this;\n\n // Setup Scales\n x = content.xScale();\n y = content.yScale();\n\n // Setup containers and skeleton of chart\n var wrap = container.selectAll('g.nv-focus').data([data]);\n var gEnter = wrap.enter().append('g').attr('class', 'nvd3 nv-focus').append('g');\n var g = wrap.select('g');\n\n wrap.attr('transform', 'translate(' + margin.left + ',' + margin.top + ')');\n\n gEnter.append('g').attr('class', 'nv-background').append('rect');\n gEnter.append('g').attr('class', 'nv-x nv-axis');\n gEnter.append('g').attr('class', 'nv-y nv-axis');\n gEnter.append('g').attr('class', 'nv-contentWrap');\n gEnter.append('g').attr('class', 'nv-brushBackground');\n gEnter.append('g').attr('class', 'nv-x nv-brush');\n\n if (rightAlignYAxis) {\n g.select('.nv-y.nv-axis')\n .attr('transform', 'translate(' + availableWidth + ',0)');\n }\n\n g.select('.nv-background rect')\n .attr('width', availableWidth)\n .attr('height', availableHeight);\n\n content\n .width(availableWidth)\n .height(availableHeight)\n .color(data.map(function(d, i) {\n return d.color || color(d, i);\n }).filter(function(d, i) {\n return !data[i].disabled;\n }));\n\n var contentWrap = g.select('.nv-contentWrap')\n .datum(data.filter(function(d) {\n return !d.disabled;\n }));\n\n d3.transition(contentWrap).call(content);\n\n // Setup Brush\n brush\n .x(x)\n .on('brush', function() {\n onBrush(syncBrushing);\n });\n\n brush.on('brushend', function() {\n if (!syncBrushing) {\n dispatch.onBrush(brush.empty() ? x.domain() : brush.extent());\n }\n });\n\n if (brushExtent) brush.extent(brushExtent);\n\n var brushBG = g.select('.nv-brushBackground').selectAll('g')\n .data([brushExtent || brush.extent()]);\n\n var brushBGenter = brushBG.enter()\n .append('g');\n\n brushBGenter.append('rect')\n .attr('class', 'left')\n .attr('x', 0)\n .attr('y', 0)\n .attr('height', availableHeight);\n\n brushBGenter.append('rect')\n .attr('class', 'right')\n .attr('x', 0)\n .attr('y', 0)\n .attr('height', availableHeight);\n\n var gBrush = g.select('.nv-x.nv-brush')\n .call(brush);\n gBrush.selectAll('rect')\n .attr('height', availableHeight);\n gBrush.selectAll('.resize').append('path').attr('d', resizePath);\n\n onBrush(true);\n\n g.select('.nv-background rect')\n .attr('width', availableWidth)\n .attr('height', availableHeight);\n\n if (showXAxis) {\n xAxis.scale(x)\n ._ticks(nv.utils.calcTicksX(availableWidth / 100, data))\n .tickSize(-availableHeight, 0);\n\n g.select('.nv-x.nv-axis')\n .attr('transform', 'translate(0,' + y.range()[0] + ')');\n d3.transition(g.select('.nv-x.nv-axis'))\n .call(xAxis);\n }\n\n if (showYAxis) {\n yAxis\n .scale(y)\n ._ticks(nv.utils.calcTicksY(availableHeight / 36, data))\n .tickSize(-availableWidth, 0);\n\n d3.transition(g.select('.nv-y.nv-axis'))\n .call(yAxis);\n }\n\n g.select('.nv-x.nv-axis')\n .attr('transform', 'translate(0,' + y.range()[0] + ')');\n\n //============================================================\n // Event Handling/Dispatching (in chart's scope)\n //------------------------------------------------------------\n\n //============================================================\n // Functions\n //------------------------------------------------------------\n\n // Taken from crossfilter (http://square.github.com/crossfilter/)\n function resizePath(d) {\n var e = +(d == 'e'),\n x = e ? 1 : -1,\n y = availableHeight / 3;\n return 'M' + (0.5 * x) + ',' + y\n + 'A6,6 0 0 ' + e + ' ' + (6.5 * x) + ',' + (y + 6)\n + 'V' + (2 * y - 6)\n + 'A6,6 0 0 ' + e + ' ' + (0.5 * x) + ',' + (2 * y)\n + 'Z'\n + 'M' + (2.5 * x) + ',' + (y + 8)\n + 'V' + (2 * y - 8)\n + 'M' + (4.5 * x) + ',' + (y + 8)\n + 'V' + (2 * y - 8);\n }\n\n\n function updateBrushBG() {\n if (!brush.empty()) brush.extent(brushExtent);\n brushBG\n .data([brush.empty() ? x.domain() : brushExtent])\n .each(function(d, i) {\n var leftWidth = x(d[0]) - x.range()[0],\n rightWidth = availableWidth - x(d[1]);\n d3.select(this).select('.left')\n .attr('width', leftWidth < 0 ? 0 : leftWidth);\n\n d3.select(this).select('.right')\n .attr('x', x(d[1]))\n .attr('width', rightWidth < 0 ? 0 : rightWidth);\n });\n }\n\n\n function onBrush(shouldDispatch) {\n brushExtent = brush.empty() ? null : brush.extent();\n var extent = brush.empty() ? x.domain() : brush.extent();\n dispatch.brush({extent: extent, brush: brush});\n updateBrushBG();\n if (shouldDispatch) {\n dispatch.onBrush(extent);\n }\n }\n });\n\n renderWatch.renderEnd('focus immediate');\n return chart;\n }\n\n\n //============================================================\n // Event Handling/Dispatching (out of chart's scope)\n //------------------------------------------------------------\n\n //============================================================\n // Expose Public Variables\n //------------------------------------------------------------\n\n // expose chart's sub-components\n chart.dispatch = dispatch;\n chart.content = content;\n chart.brush = brush;\n chart.xAxis = xAxis;\n chart.yAxis = yAxis;\n chart.options = nv.utils.optionsFunc.bind(chart);\n\n chart._options = Object.create({}, {\n // simple options, just get/set the necessary values\n width: {\n get: function() {\n return width;\n }, set: function(_) {\n width = _;\n }\n },\n height: {\n get: function() {\n return height;\n }, set: function(_) {\n height = _;\n }\n },\n showXAxis: {\n get: function() {\n return showXAxis;\n }, set: function(_) {\n showXAxis = _;\n }\n },\n showYAxis: {\n get: function() {\n return showYAxis;\n }, set: function(_) {\n showYAxis = _;\n }\n },\n brushExtent: {\n get: function() {\n return brushExtent;\n }, set: function(_) {\n brushExtent = _;\n }\n },\n syncBrushing: {\n get: function() {\n return syncBrushing;\n }, set: function(_) {\n syncBrushing = _;\n }\n },\n\n // options that require extra logic in the setter\n margin: {\n get: function() {\n return margin;\n }, set: function(_) {\n margin.top = _.top !== undefined ? _.top : margin.top;\n margin.right = _.right !== undefined ? _.right : margin.right;\n margin.bottom = _.bottom !== undefined ? _.bottom : margin.bottom;\n margin.left = _.left !== undefined ? _.left : margin.left;\n }\n },\n duration: {\n get: function() {\n return duration;\n }, set: function(_) {\n duration = _;\n renderWatch.reset(duration);\n content.duration(duration);\n xAxis.duration(duration);\n yAxis.duration(duration);\n }\n },\n color: {\n get: function() {\n return color;\n }, set: function(_) {\n color = nv.utils.getColor(_);\n content.color(color);\n }\n },\n interpolate: {\n get: function() {\n return content.interpolate();\n }, set: function(_) {\n content.interpolate(_);\n }\n },\n xTickFormat: {\n get: function() {\n return xAxis.tickFormat();\n }, set: function(_) {\n xAxis.tickFormat(_);\n }\n },\n yTickFormat: {\n get: function() {\n return yAxis.tickFormat();\n }, set: function(_) {\n yAxis.tickFormat(_);\n }\n },\n x: {\n get: function() {\n return content.x();\n }, set: function(_) {\n content.x(_);\n }\n },\n y: {\n get: function() {\n return content.y();\n }, set: function(_) {\n content.y(_);\n }\n },\n rightAlignYAxis: {\n get: function() {\n return rightAlignYAxis;\n }, set: function(_) {\n rightAlignYAxis = _;\n yAxis.orient(rightAlignYAxis ? 'right' : 'left');\n }\n }\n });\n\n nv.utils.inheritOptions(chart, content);\n nv.utils.initOptions(chart);\n\n return chart;\n };\n nv.models.forceDirectedGraph = function() {\n 'use strict';\n\n //============================================================\n // Public Variables with Default Settings\n //------------------------------------------------------------\n var margin = {top: 2, right: 0, bottom: 2, left: 0}\n , width = 400\n , height = 32\n , container = null\n , dispatch = d3.dispatch('renderEnd')\n , color = nv.utils.getColor(['#000'])\n , tooltip = nv.models.tooltip()\n , noData = null\n // Force directed graph specific parameters [default values]\n , linkStrength = 0.1\n , friction = 0.9\n , linkDist = 30\n , charge = -120\n , gravity = 0.1\n , theta = 0.8\n , alpha = 0.1\n , radius = 5\n // These functions allow to add extra attributes to ndes and links\n , nodeExtras = function(nodes) { /* Do nothing */\n }\n , linkExtras = function(links) { /* Do nothing */\n }\n , getX = d3.functor(0.0)\n , getY = d3.functor(0.0)\n ;\n\n\n //============================================================\n // Private Variables\n //------------------------------------------------------------\n\n var renderWatch = nv.utils.renderWatch(dispatch);\n\n function chart(selection) {\n renderWatch.reset();\n\n selection.each(function(data) {\n container = d3.select(this);\n nv.utils.initSVG(container);\n\n var availableWidth = nv.utils.availableWidth(width, container, margin),\n availableHeight = nv.utils.availableHeight(height, container, margin);\n\n container\n .attr('width', availableWidth)\n .attr('height', availableHeight);\n\n // Display No Data message if there's nothing to show.\n if (!data || !data.links || !data.nodes) {\n nv.utils.noData(chart, container);\n return chart;\n } else {\n container.selectAll('.nv-noData').remove();\n }\n container.selectAll('*').remove();\n\n // Collect names of all fields in the nodes\n var nodeFieldSet = new Set();\n data.nodes.forEach(function(node) {\n var keys = Object.keys(node);\n keys.forEach(function(key) {\n nodeFieldSet.add(key);\n });\n });\n\n var force = d3.layout.force()\n .nodes(data.nodes)\n .links(data.links)\n .size([availableWidth, availableHeight])\n .linkStrength(linkStrength)\n .friction(friction)\n .linkDistance(linkDist)\n .charge(charge)\n .gravity(gravity)\n .theta(theta)\n .alpha(alpha)\n .start();\n\n var link = container.selectAll('.link')\n .data(data.links)\n .enter().append('line')\n .attr('class', 'nv-force-link')\n .style('stroke-width', function(d) {\n return Math.sqrt(d.value);\n });\n\n var node = container.selectAll('.node')\n .data(data.nodes)\n .enter()\n .append('g')\n .attr('class', 'nv-force-node')\n .call(force.drag);\n\n node\n .append('circle')\n .attr('r', radius)\n .style('fill', function(d) {\n return color(d);\n })\n .on('mouseover', function(evt) {\n container.select('.nv-series-' + evt.seriesIndex + ' .nv-distx-' + evt.pointIndex)\n .attr('y1', evt.py);\n container.select('.nv-series-' + evt.seriesIndex + ' .nv-disty-' + evt.pointIndex)\n .attr('x2', evt.px);\n\n // Add 'series' object to\n var nodeColor = color(evt);\n evt.series = [];\n nodeFieldSet.forEach(function(field) {\n evt.series.push({\n color: nodeColor,\n key: field,\n value: evt[field]\n });\n });\n tooltip.data(evt).hidden(false);\n })\n .on('mouseout', function(d) {\n tooltip.hidden(true);\n });\n\n tooltip.headerFormatter(function(d) {\n return 'Node';\n });\n\n // Apply extra attributes to nodes and links (if any)\n linkExtras(link);\n nodeExtras(node);\n\n force.on('tick', function() {\n link.attr('x1', function(d) {\n return d.source.x;\n })\n .attr('y1', function(d) {\n return d.source.y;\n })\n .attr('x2', function(d) {\n return d.target.x;\n })\n .attr('y2', function(d) {\n return d.target.y;\n });\n\n node.attr('transform', function(d) {\n return 'translate(' + d.x + ', ' + d.y + ')';\n });\n });\n });\n\n return chart;\n }\n\n //============================================================\n // Expose Public Variables\n //------------------------------------------------------------\n\n chart.options = nv.utils.optionsFunc.bind(chart);\n\n chart._options = Object.create({}, {\n // simple options, just get/set the necessary values\n width: {\n get: function() {\n return width;\n }, set: function(_) {\n width = _;\n }\n },\n height: {\n get: function() {\n return height;\n }, set: function(_) {\n height = _;\n }\n },\n\n // Force directed graph specific parameters\n linkStrength: {\n get: function() {\n return linkStrength;\n }, set: function(_) {\n linkStrength = _;\n }\n },\n friction: {\n get: function() {\n return friction;\n }, set: function(_) {\n friction = _;\n }\n },\n linkDist: {\n get: function() {\n return linkDist;\n }, set: function(_) {\n linkDist = _;\n }\n },\n charge: {\n get: function() {\n return charge;\n }, set: function(_) {\n charge = _;\n }\n },\n gravity: {\n get: function() {\n return gravity;\n }, set: function(_) {\n gravity = _;\n }\n },\n theta: {\n get: function() {\n return theta;\n }, set: function(_) {\n theta = _;\n }\n },\n alpha: {\n get: function() {\n return alpha;\n }, set: function(_) {\n alpha = _;\n }\n },\n radius: {\n get: function() {\n return radius;\n }, set: function(_) {\n radius = _;\n }\n },\n\n //functor options\n x: {\n get: function() {\n return getX;\n }, set: function(_) {\n getX = d3.functor(_);\n }\n },\n y: {\n get: function() {\n return getY;\n }, set: function(_) {\n getY = d3.functor(_);\n }\n },\n\n // options that require extra logic in the setter\n margin: {\n get: function() {\n return margin;\n }, set: function(_) {\n margin.top = _.top !== undefined ? _.top : margin.top;\n margin.right = _.right !== undefined ? _.right : margin.right;\n margin.bottom = _.bottom !== undefined ? _.bottom : margin.bottom;\n margin.left = _.left !== undefined ? _.left : margin.left;\n }\n },\n color: {\n get: function() {\n return color;\n }, set: function(_) {\n color = nv.utils.getColor(_);\n }\n },\n noData: {\n get: function() {\n return noData;\n }, set: function(_) {\n noData = _;\n }\n },\n nodeExtras: {\n get: function() {\n return nodeExtras;\n }, set: function(_) {\n nodeExtras = _;\n }\n },\n linkExtras: {\n get: function() {\n return linkExtras;\n }, set: function(_) {\n linkExtras = _;\n }\n }\n });\n\n chart.dispatch = dispatch;\n chart.tooltip = tooltip;\n nv.utils.initOptions(chart);\n return chart;\n };\n nv.models.furiousLegend = function() {\n 'use strict';\n\n //============================================================\n // Public Variables with Default Settings\n //------------------------------------------------------------\n\n var margin = {top: 5, right: 0, bottom: 5, left: 0}\n , width = 400\n , height = 20\n , getKey = function(d) {\n return d.key;\n }\n , keyFormatter = function(d) {\n return d;\n }\n , color = nv.utils.getColor()\n , maxKeyLength = 20 //default value for key lengths\n , align = true\n , padding = 28 //define how much space between legend items. - recommend 32 for furious version\n , rightAlign = true\n , updateState = true //If true, legend will update data.disabled and trigger a 'stateChange' dispatch.\n , radioButtonMode = false //If true, clicking legend items will cause it to behave like a radio button. (only one can\n // be selected at a time)\n , expanded = false\n , dispatch = d3.dispatch('legendClick', 'legendDblclick', 'legendMouseover', 'legendMouseout', 'stateChange')\n , vers = 'classic' //Options are \"classic\" and \"furious\"\n ;\n\n function chart(selection) {\n selection.each(function(data) {\n var availableWidth = width - margin.left - margin.right,\n container = d3.select(this);\n nv.utils.initSVG(container);\n\n // Setup containers and skeleton of chart\n var wrap = container.selectAll('g.nv-legend').data([data]);\n var gEnter = wrap.enter().append('g').attr('class', 'nvd3 nv-legend').append('g');\n var g = wrap.select('g');\n\n wrap.attr('transform', 'translate(' + margin.left + ',' + margin.top + ')');\n\n var series = g.selectAll('.nv-series')\n .data(function(d) {\n if (vers != 'furious') return d;\n\n return d.filter(function(n) {\n return expanded ? true : !n.disengaged;\n });\n });\n var seriesEnter = series.enter().append('g').attr('class', 'nv-series');\n\n var seriesShape;\n\n if (vers == 'classic') {\n seriesEnter.append('circle')\n .style('stroke-width', 2)\n .attr('class', 'nv-legend-symbol')\n .attr('r', 5);\n\n seriesShape = series.select('circle');\n } else if (vers == 'furious') {\n seriesEnter.append('rect')\n .style('stroke-width', 2)\n .attr('class', 'nv-legend-symbol')\n .attr('rx', 3)\n .attr('ry', 3);\n\n seriesShape = series.select('rect');\n\n seriesEnter.append('g')\n .attr('class', 'nv-check-box')\n .property('innerHTML',\n '<path d=\"M0.5,5 L22.5,5 L22.5,26.5 L0.5,26.5 L0.5,5 Z\" class=\"nv-box\"></path><path d=\"M5.5,12.8618467 L11.9185089,19.2803556 L31,0.198864511\" class=\"nv-check\"></path>')\n .attr('transform', 'translate(-10,-8)scale(0.5)');\n\n var seriesCheckbox = series.select('.nv-check-box');\n\n seriesCheckbox.each(function(d, i) {\n d3.select(this).selectAll('path')\n .attr('stroke', setTextColor(d, i));\n });\n }\n\n seriesEnter.append('text')\n .attr('text-anchor', 'start')\n .attr('class', 'nv-legend-text')\n .attr('dy', '.32em')\n .attr('dx', '8');\n\n var seriesText = series.select('text.nv-legend-text');\n\n series\n .on('mouseover', function(d, i) {\n dispatch.legendMouseover(d, i); //TODO: Make consistent with other event objects\n })\n .on('mouseout', function(d, i) {\n dispatch.legendMouseout(d, i);\n })\n .on('click', function(d, i) {\n dispatch.legendClick(d, i);\n // make sure we re-get data in case it was modified\n var data = series.data();\n if (updateState) {\n if (vers == 'classic') {\n if (radioButtonMode) {\n //Radio button mode: set every series to disabled,\n // and enable the clicked series.\n data.forEach(function(series) {\n series.disabled = true;\n });\n d.disabled = false;\n } else {\n d.disabled = !d.disabled;\n if (data.every(function(series) {\n return series.disabled;\n })) {\n //the default behavior of NVD3 legends is, if every single series\n // is disabled, turn all series' back on.\n data.forEach(function(series) {\n series.disabled = false;\n });\n }\n }\n } else if (vers == 'furious') {\n if (expanded) {\n d.disengaged = !d.disengaged;\n d.userDisabled = d.userDisabled == undefined ? !!d.disabled : d.userDisabled;\n d.disabled = d.disengaged || d.userDisabled;\n } else if (!expanded) {\n d.disabled = !d.disabled;\n d.userDisabled = d.disabled;\n var engaged = data.filter(function(d) {\n return !d.disengaged;\n });\n if (engaged.every(function(series) {\n return series.userDisabled;\n })) {\n //the default behavior of NVD3 legends is, if every single series\n // is disabled, turn all series' back on.\n data.forEach(function(series) {\n series.disabled = series.userDisabled = false;\n });\n }\n }\n }\n dispatch.stateChange({\n disabled: data.map(function(d) {\n return !!d.disabled;\n }),\n disengaged: data.map(function(d) {\n return !!d.disengaged;\n })\n });\n\n }\n })\n .on('dblclick', function(d, i) {\n if (vers == 'furious' && expanded) return;\n dispatch.legendDblclick(d, i);\n if (updateState) {\n // make sure we re-get data in case it was modified\n var data = series.data();\n //the default behavior of NVD3 legends, when double clicking one,\n // is to set all other series' to false, and make the double clicked series enabled.\n data.forEach(function(series) {\n series.disabled = true;\n if (vers == 'furious') series.userDisabled = series.disabled;\n });\n d.disabled = false;\n if (vers == 'furious') d.userDisabled = d.disabled;\n dispatch.stateChange({\n disabled: data.map(function(d) {\n return !!d.disabled;\n })\n });\n }\n });\n\n series.classed('nv-disabled', function(d) {\n return d.userDisabled;\n });\n series.exit().remove();\n\n seriesText\n .attr('fill', setTextColor)\n .text(function(d) {\n return keyFormatter(getKey(d));\n });\n\n //TODO: implement fixed-width and max-width options (max-width is especially useful with the align option)\n // NEW ALIGNING CODE, TODO: clean up\n\n var versPadding;\n switch (vers) {\n case 'furious' :\n versPadding = 23;\n break;\n case 'classic' :\n versPadding = 20;\n }\n\n if (align) {\n\n var seriesWidths = [];\n series.each(function(d, i) {\n var legendText;\n if (keyFormatter(getKey(d)) && keyFormatter(getKey(d)).length > maxKeyLength) {\n var trimmedKey = keyFormatter(getKey(d)).substring(0, maxKeyLength);\n legendText = d3.select(this).select('text').text(trimmedKey + '...');\n d3.select(this).append('svg:title').text(keyFormatter(getKey(d)));\n } else {\n legendText = d3.select(this).select('text');\n }\n var nodeTextLength;\n try {\n nodeTextLength = legendText.node().getComputedTextLength();\n // If the legendText is display:none'd (nodeTextLength == 0), simulate an error so we approximate,\n // instead\n if (nodeTextLength <= 0) throw Error();\n } catch (e) {\n nodeTextLength = nv.utils.calcApproxTextWidth(legendText);\n }\n\n seriesWidths.push(nodeTextLength + padding);\n });\n\n var seriesPerRow = 0;\n var legendWidth = 0;\n var columnWidths = [];\n\n while (legendWidth < availableWidth && seriesPerRow < seriesWidths.length) {\n columnWidths[seriesPerRow] = seriesWidths[seriesPerRow];\n legendWidth += seriesWidths[seriesPerRow++];\n }\n if (seriesPerRow === 0) seriesPerRow = 1; //minimum of one series per row\n\n while (legendWidth > availableWidth && seriesPerRow > 1) {\n columnWidths = [];\n seriesPerRow--;\n\n for (var k = 0; k < seriesWidths.length; k++) {\n if (seriesWidths[k] > (columnWidths[k % seriesPerRow] || 0)) {\n columnWidths[k % seriesPerRow] = seriesWidths[k];\n }\n }\n\n legendWidth = columnWidths.reduce(function(prev, cur, index, array) {\n return prev + cur;\n });\n }\n\n var xPositions = [];\n for (var i = 0, curX = 0; i < seriesPerRow; i++) {\n xPositions[i] = curX;\n curX += columnWidths[i];\n }\n\n series\n .attr('transform', function(d, i) {\n return 'translate(' + xPositions[i % seriesPerRow] + ',' + (5 + Math.floor(i / seriesPerRow)\n * versPadding) + ')';\n });\n\n //position legend as far right as possible within the total width\n if (rightAlign) {\n g.attr('transform', 'translate(' + (width - margin.right - legendWidth) + ',' + margin.top + ')');\n } else {\n g.attr('transform', 'translate(0' + ',' + margin.top + ')');\n }\n\n height = margin.top + margin.bottom + (Math.ceil(seriesWidths.length / seriesPerRow) * versPadding);\n\n } else {\n\n var ypos = 5,\n newxpos = 5,\n maxwidth = 0,\n xpos;\n series\n .attr('transform', function(d, i) {\n var length = d3.select(this).select('text').node().getComputedTextLength() + padding;\n xpos = newxpos;\n\n if (width < margin.left + margin.right + xpos + length) {\n newxpos = xpos = 5;\n ypos += versPadding;\n }\n\n newxpos += length;\n if (newxpos > maxwidth) maxwidth = newxpos;\n\n return 'translate(' + xpos + ',' + ypos + ')';\n });\n\n //position legend as far right as possible within the total width\n g.attr('transform', 'translate(' + (width - margin.right - maxwidth) + ',' + margin.top + ')');\n\n height = margin.top + margin.bottom + ypos + 15;\n }\n\n if (vers == 'furious') {\n // Size rectangles after text is placed\n seriesShape\n .attr('width', function(d, i) {\n return seriesText[0][i].getComputedTextLength() + 27;\n })\n .attr('height', 18)\n .attr('y', -9)\n .attr('x', -15);\n }\n\n seriesShape\n .style('fill', setBGColor)\n .style('stroke', function(d, i) {\n return d.color || color(d, i);\n });\n });\n\n function setTextColor(d, i) {\n if (vers != 'furious') return '#000';\n if (expanded) {\n return d.disengaged ? color(d, i) : '#fff';\n } else if (!expanded) {\n return !!d.disabled ? color(d, i) : '#fff';\n }\n }\n\n function setBGColor(d, i) {\n if (expanded && vers == 'furious') {\n return d.disengaged ? '#fff' : color(d, i);\n } else {\n return !!d.disabled ? '#fff' : color(d, i);\n }\n }\n\n return chart;\n }\n\n //============================================================\n // Expose Public Variables\n //------------------------------------------------------------\n\n chart.dispatch = dispatch;\n chart.options = nv.utils.optionsFunc.bind(chart);\n\n chart._options = Object.create({}, {\n // simple options, just get/set the necessary values\n width: {\n get: function() {\n return width;\n }, set: function(_) {\n width = _;\n }\n },\n height: {\n get: function() {\n return height;\n }, set: function(_) {\n height = _;\n }\n },\n key: {\n get: function() {\n return getKey;\n }, set: function(_) {\n getKey = _;\n }\n },\n keyFormatter: {\n get: function() {\n return keyFormatter;\n }, set: function(_) {\n keyFormatter = _;\n }\n },\n align: {\n get: function() {\n return align;\n }, set: function(_) {\n align = _;\n }\n },\n rightAlign: {\n get: function() {\n return rightAlign;\n }, set: function(_) {\n rightAlign = _;\n }\n },\n maxKeyLength: {\n get: function() {\n return maxKeyLength;\n }, set: function(_) {\n maxKeyLength = _;\n }\n },\n padding: {\n get: function() {\n return padding;\n }, set: function(_) {\n padding = _;\n }\n },\n updateState: {\n get: function() {\n return updateState;\n }, set: function(_) {\n updateState = _;\n }\n },\n radioButtonMode: {\n get: function() {\n return radioButtonMode;\n }, set: function(_) {\n radioButtonMode = _;\n }\n },\n expanded: {\n get: function() {\n return expanded;\n }, set: function(_) {\n expanded = _;\n }\n },\n vers: {\n get: function() {\n return vers;\n }, set: function(_) {\n vers = _;\n }\n },\n\n // options that require extra logic in the setter\n margin: {\n get: function() {\n return margin;\n }, set: function(_) {\n margin.top = _.top !== undefined ? _.top : margin.top;\n margin.right = _.right !== undefined ? _.right : margin.right;\n margin.bottom = _.bottom !== undefined ? _.bottom : margin.bottom;\n margin.left = _.left !== undefined ? _.left : margin.left;\n }\n },\n color: {\n get: function() {\n return color;\n }, set: function(_) {\n color = nv.utils.getColor(_);\n }\n }\n });\n\n nv.utils.initOptions(chart);\n\n return chart;\n };\n//TODO: consider deprecating and using multibar with single series for this\n nv.models.historicalBar = function() {\n 'use strict';\n\n //============================================================\n // Public Variables with Default Settings\n //------------------------------------------------------------\n\n var margin = {top: 0, right: 0, bottom: 0, left: 0}\n ,\n width = null\n ,\n height = null\n ,\n id = Math.floor(Math.random() * 10000) //Create semi-unique ID in case user doesn't select one\n ,\n container = null\n ,\n x = d3.scale.linear()\n ,\n y = d3.scale.linear()\n ,\n getX = function(d) {\n return d.x;\n }\n ,\n getY = function(d) {\n return d.y;\n }\n ,\n forceX = []\n ,\n forceY = [0]\n ,\n padData = false\n ,\n clipEdge = true\n ,\n color = nv.utils.defaultColor()\n ,\n xDomain\n ,\n yDomain\n ,\n xRange\n ,\n yRange\n ,\n dispatch = d3.dispatch('chartClick', 'elementClick', 'elementDblClick', 'elementMouseover', 'elementMouseout',\n 'elementMousemove', 'renderEnd')\n ,\n interactive = true\n ;\n\n var renderWatch = nv.utils.renderWatch(dispatch, 0);\n\n function chart(selection) {\n selection.each(function(data) {\n renderWatch.reset();\n\n container = d3.select(this);\n var availableWidth = nv.utils.availableWidth(width, container, margin),\n availableHeight = nv.utils.availableHeight(height, container, margin);\n\n nv.utils.initSVG(container);\n\n // Setup Scales\n x.domain(xDomain || d3.extent(data[0].values.map(getX).concat(forceX)));\n\n if (padData) {\n x.range(xRange || [availableWidth * .5 / data[0].values.length,\n availableWidth * (data[0].values.length - .5) / data[0].values.length]);\n } else {\n x.range(xRange || [0, availableWidth]);\n }\n\n y.domain(yDomain || d3.extent(data[0].values.map(getY).concat(forceY)))\n .range(yRange || [availableHeight, 0]);\n\n // If scale's domain don't have a range, slightly adjust to make one... so a chart can show a single data point\n if (x.domain()[0] === x.domain()[1]) {\n x.domain()[0] ?\n x.domain([x.domain()[0] - x.domain()[0] * 0.01, x.domain()[1] + x.domain()[1] * 0.01])\n : x.domain([-1, 1]);\n }\n\n if (y.domain()[0] === y.domain()[1]) {\n y.domain()[0] ?\n y.domain([y.domain()[0] + y.domain()[0] * 0.01, y.domain()[1] - y.domain()[1] * 0.01])\n : y.domain([-1, 1]);\n }\n\n // Setup containers and skeleton of chart\n var wrap = container.selectAll('g.nv-wrap.nv-historicalBar-' + id).data([data[0].values]);\n var wrapEnter = wrap.enter().append('g').attr('class', 'nvd3 nv-wrap nv-historicalBar-' + id);\n var defsEnter = wrapEnter.append('defs');\n var gEnter = wrapEnter.append('g');\n var g = wrap.select('g');\n\n gEnter.append('g').attr('class', 'nv-bars');\n wrap.attr('transform', 'translate(' + margin.left + ',' + margin.top + ')');\n\n container\n .on('click', function(d, i) {\n dispatch.chartClick({\n data: d,\n index: i,\n pos: d3.event,\n id: id\n });\n });\n\n defsEnter.append('clipPath')\n .attr('id', 'nv-chart-clip-path-' + id)\n .append('rect');\n\n wrap.select('#nv-chart-clip-path-' + id + ' rect')\n .attr('width', availableWidth)\n .attr('height', availableHeight);\n\n g.attr('clip-path', clipEdge ? 'url(#nv-chart-clip-path-' + id + ')' : '');\n\n var bars = wrap.select('.nv-bars').selectAll('.nv-bar')\n .data(function(d) {\n return d;\n }, function(d, i) {\n return getX(d, i);\n });\n bars.exit().remove();\n\n bars.enter().append('rect')\n .attr('x', 0)\n .attr('y', function(d, i) {\n return nv.utils.NaNtoZero(y(Math.max(0, getY(d, i))));\n })\n .attr('height', function(d, i) {\n return nv.utils.NaNtoZero(Math.abs(y(getY(d, i)) - y(0)));\n })\n .attr('transform', function(d, i) {\n return 'translate(' + (x(getX(d, i)) - availableWidth / data[0].values.length * .45) + ',0)';\n })\n .on('mouseover', function(d, i) {\n if (!interactive) return;\n d3.select(this).classed('hover', true);\n dispatch.elementMouseover({\n data: d,\n index: i,\n color: d3.select(this).style('fill')\n });\n\n })\n .on('mouseout', function(d, i) {\n if (!interactive) return;\n d3.select(this).classed('hover', false);\n dispatch.elementMouseout({\n data: d,\n index: i,\n color: d3.select(this).style('fill')\n });\n })\n .on('mousemove', function(d, i) {\n if (!interactive) return;\n dispatch.elementMousemove({\n data: d,\n index: i,\n color: d3.select(this).style('fill')\n });\n })\n .on('click', function(d, i) {\n if (!interactive) return;\n var element = this;\n dispatch.elementClick({\n data: d,\n index: i,\n color: d3.select(this).style('fill'),\n event: d3.event,\n element: element\n });\n d3.event.stopPropagation();\n })\n .on('dblclick', function(d, i) {\n if (!interactive) return;\n dispatch.elementDblClick({\n data: d,\n index: i,\n color: d3.select(this).style('fill')\n });\n d3.event.stopPropagation();\n });\n\n bars\n .attr('fill', function(d, i) {\n return color(d, i);\n })\n .attr('class', function(d, i, j) {\n return (getY(d, i) < 0 ? 'nv-bar negative' : 'nv-bar positive') + ' nv-bar-' + j + '-' + i;\n })\n .watchTransition(renderWatch, 'bars')\n .attr('transform', function(d, i) {\n return 'translate(' + (x(getX(d, i)) - availableWidth / data[0].values.length * .45) + ',0)';\n })\n //TODO: better width calculations that don't assume always uniform data spacing;w\n .attr('width', (availableWidth / data[0].values.length) * .9);\n\n bars.watchTransition(renderWatch, 'bars')\n .attr('y', function(d, i) {\n var rval = getY(d, i) < 0 ?\n y(0) :\n y(0) - y(getY(d, i)) < 1 ?\n y(0) - 1 :\n y(getY(d, i));\n return nv.utils.NaNtoZero(rval);\n })\n .attr('height', function(d, i) {\n return nv.utils.NaNtoZero(Math.max(Math.abs(y(getY(d, i)) - y(0)), 1));\n });\n\n });\n\n renderWatch.renderEnd('historicalBar immediate');\n return chart;\n }\n\n //Create methods to allow outside functions to highlight a specific bar.\n chart.highlightPoint = function(pointIndex, isHoverOver) {\n container\n .select('.nv-bars .nv-bar-0-' + pointIndex)\n .classed('hover', isHoverOver)\n ;\n };\n\n chart.clearHighlights = function() {\n container\n .select('.nv-bars .nv-bar.hover')\n .classed('hover', false)\n ;\n };\n\n //============================================================\n // Expose Public Variables\n //------------------------------------------------------------\n\n chart.dispatch = dispatch;\n chart.options = nv.utils.optionsFunc.bind(chart);\n\n chart._options = Object.create({}, {\n // simple options, just get/set the necessary values\n width: {\n get: function() {\n return width;\n }, set: function(_) {\n width = _;\n }\n },\n height: {\n get: function() {\n return height;\n }, set: function(_) {\n height = _;\n }\n },\n forceX: {\n get: function() {\n return forceX;\n }, set: function(_) {\n forceX = _;\n }\n },\n forceY: {\n get: function() {\n return forceY;\n }, set: function(_) {\n forceY = _;\n }\n },\n padData: {\n get: function() {\n return padData;\n }, set: function(_) {\n padData = _;\n }\n },\n x: {\n get: function() {\n return getX;\n }, set: function(_) {\n getX = _;\n }\n },\n y: {\n get: function() {\n return getY;\n }, set: function(_) {\n getY = _;\n }\n },\n xScale: {\n get: function() {\n return x;\n }, set: function(_) {\n x = _;\n }\n },\n yScale: {\n get: function() {\n return y;\n }, set: function(_) {\n y = _;\n }\n },\n xDomain: {\n get: function() {\n return xDomain;\n }, set: function(_) {\n xDomain = _;\n }\n },\n yDomain: {\n get: function() {\n return yDomain;\n }, set: function(_) {\n yDomain = _;\n }\n },\n xRange: {\n get: function() {\n return xRange;\n }, set: function(_) {\n xRange = _;\n }\n },\n yRange: {\n get: function() {\n return yRange;\n }, set: function(_) {\n yRange = _;\n }\n },\n clipEdge: {\n get: function() {\n return clipEdge;\n }, set: function(_) {\n clipEdge = _;\n }\n },\n id: {\n get: function() {\n return id;\n }, set: function(_) {\n id = _;\n }\n },\n interactive: {\n get: function() {\n return interactive;\n }, set: function(_) {\n interactive = _;\n }\n },\n\n // options that require extra logic in the setter\n margin: {\n get: function() {\n return margin;\n }, set: function(_) {\n margin.top = _.top !== undefined ? _.top : margin.top;\n margin.right = _.right !== undefined ? _.right : margin.right;\n margin.bottom = _.bottom !== undefined ? _.bottom : margin.bottom;\n margin.left = _.left !== undefined ? _.left : margin.left;\n }\n },\n color: {\n get: function() {\n return color;\n }, set: function(_) {\n color = nv.utils.getColor(_);\n }\n }\n });\n\n nv.utils.initOptions(chart);\n\n return chart;\n };\n\n nv.models.historicalBarChart = function(bar_model) {\n 'use strict';\n\n //============================================================\n // Public Variables with Default Settings\n //------------------------------------------------------------\n\n var bars = bar_model || nv.models.historicalBar()\n , xAxis = nv.models.axis()\n , yAxis = nv.models.axis()\n , legend = nv.models.legend()\n , interactiveLayer = nv.interactiveGuideline()\n , tooltip = nv.models.tooltip()\n ;\n\n\n var margin = {top: 30, right: 90, bottom: 50, left: 90}\n , marginTop = null\n , color = nv.utils.defaultColor()\n , width = null\n , height = null\n , showLegend = false\n , showXAxis = true\n , showYAxis = true\n , rightAlignYAxis = false\n , useInteractiveGuideline = false\n , x\n , y\n , state = {}\n , defaultState = null\n , noData = null\n , dispatch = d3.dispatch('tooltipHide', 'stateChange', 'changeState', 'renderEnd')\n , transitionDuration = 250\n ;\n\n xAxis.orient('bottom').tickPadding(7);\n yAxis.orient((rightAlignYAxis) ? 'right' : 'left');\n tooltip\n .duration(0)\n .headerEnabled(false)\n .valueFormatter(function(d, i) {\n return yAxis.tickFormat()(d, i);\n })\n .headerFormatter(function(d, i) {\n return xAxis.tickFormat()(d, i);\n });\n\n\n //============================================================\n // Private Variables\n //------------------------------------------------------------\n\n var renderWatch = nv.utils.renderWatch(dispatch, 0);\n\n function chart(selection) {\n selection.each(function(data) {\n renderWatch.reset();\n renderWatch.models(bars);\n if (showXAxis) renderWatch.models(xAxis);\n if (showYAxis) renderWatch.models(yAxis);\n\n var container = d3.select(this),\n that = this;\n nv.utils.initSVG(container);\n var availableWidth = nv.utils.availableWidth(width, container, margin),\n availableHeight = nv.utils.availableHeight(height, container, margin);\n\n chart.update = function() {\n container.transition().duration(transitionDuration).call(chart);\n };\n chart.container = this;\n\n //set state.disabled\n state.disabled = data.map(function(d) {\n return !!d.disabled;\n });\n\n if (!defaultState) {\n var key;\n defaultState = {};\n for (key in state) {\n if (state[key] instanceof Array) {\n defaultState[key] = state[key].slice(0);\n } else {\n defaultState[key] = state[key];\n }\n }\n }\n\n // Display noData message if there's nothing to show.\n if (!data || !data.length || !data.filter(function(d) {\n return d.values.length;\n }).length) {\n nv.utils.noData(chart, container);\n return chart;\n } else {\n container.selectAll('.nv-noData').remove();\n }\n\n // Setup Scales\n x = bars.xScale();\n y = bars.yScale();\n\n // Setup containers and skeleton of chart\n var wrap = container.selectAll('g.nv-wrap.nv-historicalBarChart').data([data]);\n var gEnter = wrap.enter().append('g').attr('class', 'nvd3 nv-wrap nv-historicalBarChart').append('g');\n var g = wrap.select('g');\n\n gEnter.append('g').attr('class', 'nv-x nv-axis');\n gEnter.append('g').attr('class', 'nv-y nv-axis');\n gEnter.append('g').attr('class', 'nv-barsWrap');\n gEnter.append('g').attr('class', 'nv-legendWrap');\n gEnter.append('g').attr('class', 'nv-interactive');\n\n // Legend\n if (!showLegend) {\n g.select('.nv-legendWrap').selectAll('*').remove();\n } else {\n legend.width(availableWidth);\n\n g.select('.nv-legendWrap')\n .datum(data)\n .call(legend);\n\n if (!marginTop && legend.height() !== margin.top) {\n margin.top = legend.height();\n availableHeight = nv.utils.availableHeight(height, container, margin);\n }\n\n wrap.select('.nv-legendWrap')\n .attr('transform', 'translate(0,' + (-margin.top) + ')');\n }\n wrap.attr('transform', 'translate(' + margin.left + ',' + margin.top + ')');\n\n if (rightAlignYAxis) {\n g.select('.nv-y.nv-axis')\n .attr('transform', 'translate(' + availableWidth + ',0)');\n }\n\n //Set up interactive layer\n if (useInteractiveGuideline) {\n interactiveLayer\n .width(availableWidth)\n .height(availableHeight)\n .margin({left: margin.left, top: margin.top})\n .svgContainer(container)\n .xScale(x);\n wrap.select('.nv-interactive').call(interactiveLayer);\n }\n bars\n .width(availableWidth)\n .height(availableHeight)\n .color(data.map(function(d, i) {\n return d.color || color(d, i);\n }).filter(function(d, i) {\n return !data[i].disabled;\n }));\n\n var barsWrap = g.select('.nv-barsWrap')\n .datum(data.filter(function(d) {\n return !d.disabled;\n }));\n barsWrap.transition().call(bars);\n\n // Setup Axes\n if (showXAxis) {\n xAxis\n .scale(x)\n ._ticks(nv.utils.calcTicksX(availableWidth / 100, data))\n .tickSize(-availableHeight, 0);\n\n g.select('.nv-x.nv-axis')\n .attr('transform', 'translate(0,' + y.range()[0] + ')');\n g.select('.nv-x.nv-axis')\n .transition()\n .call(xAxis);\n }\n\n if (showYAxis) {\n yAxis\n .scale(y)\n ._ticks(nv.utils.calcTicksY(availableHeight / 36, data))\n .tickSize(-availableWidth, 0);\n\n g.select('.nv-y.nv-axis')\n .transition()\n .call(yAxis);\n }\n\n //============================================================\n // Event Handling/Dispatching (in chart's scope)\n //------------------------------------------------------------\n\n interactiveLayer.dispatch.on('elementMousemove', function(e) {\n bars.clearHighlights();\n\n var singlePoint, pointIndex, pointXLocation, allData = [];\n data\n .filter(function(series, i) {\n series.seriesIndex = i;\n return !series.disabled;\n })\n .forEach(function(series, i) {\n pointIndex = nv.interactiveBisect(series.values, e.pointXValue, chart.x());\n bars.highlightPoint(pointIndex, true);\n var point = series.values[pointIndex];\n if (point === undefined) return;\n if (singlePoint === undefined) singlePoint = point;\n if (pointXLocation === undefined) pointXLocation = chart.xScale()(chart.x()(point, pointIndex));\n allData.push({\n key: series.key,\n value: chart.y()(point, pointIndex),\n color: color(series, series.seriesIndex),\n data: series.values[pointIndex]\n });\n });\n\n var xValue = xAxis.tickFormat()(chart.x()(singlePoint, pointIndex));\n interactiveLayer.tooltip\n .valueFormatter(function(d, i) {\n return yAxis.tickFormat()(d);\n })\n .data({\n value: xValue,\n index: pointIndex,\n series: allData\n })();\n\n interactiveLayer.renderGuideLine(pointXLocation);\n\n });\n\n interactiveLayer.dispatch.on('elementMouseout', function(e) {\n dispatch.tooltipHide();\n bars.clearHighlights();\n });\n\n legend.dispatch.on('legendClick', function(d, i) {\n d.disabled = !d.disabled;\n\n if (!data.filter(function(d) {\n return !d.disabled;\n }).length) {\n data.map(function(d) {\n d.disabled = false;\n wrap.selectAll('.nv-series').classed('disabled', false);\n return d;\n });\n }\n\n state.disabled = data.map(function(d) {\n return !!d.disabled;\n });\n dispatch.stateChange(state);\n\n selection.transition().call(chart);\n });\n\n legend.dispatch.on('legendDblclick', function(d) {\n //Double clicking should always enable current series, and disabled all others.\n data.forEach(function(d) {\n d.disabled = true;\n });\n d.disabled = false;\n\n state.disabled = data.map(function(d) {\n return !!d.disabled;\n });\n dispatch.stateChange(state);\n chart.update();\n });\n\n dispatch.on('changeState', function(e) {\n if (typeof e.disabled !== 'undefined') {\n data.forEach(function(series, i) {\n series.disabled = e.disabled[i];\n });\n\n state.disabled = e.disabled;\n }\n\n chart.update();\n });\n });\n\n renderWatch.renderEnd('historicalBarChart immediate');\n return chart;\n }\n\n //============================================================\n // Event Handling/Dispatching (out of chart's scope)\n //------------------------------------------------------------\n\n bars.dispatch.on('elementMouseover.tooltip', function(evt) {\n evt['series'] = {\n key: chart.x()(evt.data),\n value: chart.y()(evt.data),\n color: evt.color\n };\n tooltip.data(evt).hidden(false);\n });\n\n bars.dispatch.on('elementMouseout.tooltip', function(evt) {\n tooltip.hidden(true);\n });\n\n bars.dispatch.on('elementMousemove.tooltip', function(evt) {\n tooltip();\n });\n\n //============================================================\n // Expose Public Variables\n //------------------------------------------------------------\n\n // expose chart's sub-components\n chart.dispatch = dispatch;\n chart.bars = bars;\n chart.legend = legend;\n chart.xAxis = xAxis;\n chart.yAxis = yAxis;\n chart.interactiveLayer = interactiveLayer;\n chart.tooltip = tooltip;\n\n chart.options = nv.utils.optionsFunc.bind(chart);\n\n chart._options = Object.create({}, {\n // simple options, just get/set the necessary values\n width: {\n get: function() {\n return width;\n }, set: function(_) {\n width = _;\n }\n },\n height: {\n get: function() {\n return height;\n }, set: function(_) {\n height = _;\n }\n },\n showLegend: {\n get: function() {\n return showLegend;\n }, set: function(_) {\n showLegend = _;\n }\n },\n showXAxis: {\n get: function() {\n return showXAxis;\n }, set: function(_) {\n showXAxis = _;\n }\n },\n showYAxis: {\n get: function() {\n return showYAxis;\n }, set: function(_) {\n showYAxis = _;\n }\n },\n defaultState: {\n get: function() {\n return defaultState;\n }, set: function(_) {\n defaultState = _;\n }\n },\n noData: {\n get: function() {\n return noData;\n }, set: function(_) {\n noData = _;\n }\n },\n\n // options that require extra logic in the setter\n margin: {\n get: function() {\n return margin;\n }, set: function(_) {\n if (_.top !== undefined) {\n margin.top = _.top;\n marginTop = _.top;\n }\n margin.right = _.right !== undefined ? _.right : margin.right;\n margin.bottom = _.bottom !== undefined ? _.bottom : margin.bottom;\n margin.left = _.left !== undefined ? _.left : margin.left;\n }\n },\n color: {\n get: function() {\n return color;\n }, set: function(_) {\n color = nv.utils.getColor(_);\n legend.color(color);\n bars.color(color);\n }\n },\n duration: {\n get: function() {\n return transitionDuration;\n }, set: function(_) {\n transitionDuration = _;\n renderWatch.reset(transitionDuration);\n yAxis.duration(transitionDuration);\n xAxis.duration(transitionDuration);\n }\n },\n rightAlignYAxis: {\n get: function() {\n return rightAlignYAxis;\n }, set: function(_) {\n rightAlignYAxis = _;\n yAxis.orient((_) ? 'right' : 'left');\n }\n },\n useInteractiveGuideline: {\n get: function() {\n return useInteractiveGuideline;\n }, set: function(_) {\n useInteractiveGuideline = _;\n if (_ === true) {\n chart.interactive(false);\n }\n }\n }\n });\n\n nv.utils.inheritOptions(chart, bars);\n nv.utils.initOptions(chart);\n\n return chart;\n };\n\n\n// ohlcChart is just a historical chart with ohlc bars and some tweaks\n nv.models.ohlcBarChart = function() {\n var chart = nv.models.historicalBarChart(nv.models.ohlcBar());\n\n // special default tooltip since we show multiple values per x\n chart.useInteractiveGuideline(true);\n chart.interactiveLayer.tooltip.contentGenerator(function(data) {\n // we assume only one series exists for this chart\n var d = data.series[0].data;\n // match line colors as defined in nv.d3.css\n var color = d.open < d.close ? '2ca02c' : 'd62728';\n return '' +\n '<h3 style=\"color: #' + color + '\">' + data.value + '</h3>' +\n '<table>' +\n '<tr><td>open:</td><td>' + chart.yAxis.tickFormat()(d.open) + '</td></tr>' +\n '<tr><td>close:</td><td>' + chart.yAxis.tickFormat()(d.close) + '</td></tr>' +\n '<tr><td>high</td><td>' + chart.yAxis.tickFormat()(d.high) + '</td></tr>' +\n '<tr><td>low:</td><td>' + chart.yAxis.tickFormat()(d.low) + '</td></tr>' +\n '</table>';\n });\n return chart;\n };\n\n// candlestickChart is just a historical chart with candlestick bars and some tweaks\n nv.models.candlestickBarChart = function() {\n var chart = nv.models.historicalBarChart(nv.models.candlestickBar());\n\n // special default tooltip since we show multiple values per x\n chart.useInteractiveGuideline(true);\n chart.interactiveLayer.tooltip.contentGenerator(function(data) {\n // we assume only one series exists for this chart\n var d = data.series[0].data;\n // match line colors as defined in nv.d3.css\n var color = d.open < d.close ? '2ca02c' : 'd62728';\n return '' +\n '<h3 style=\"color: #' + color + '\">' + data.value + '</h3>' +\n '<table>' +\n '<tr><td>open:</td><td>' + chart.yAxis.tickFormat()(d.open) + '</td></tr>' +\n '<tr><td>close:</td><td>' + chart.yAxis.tickFormat()(d.close) + '</td></tr>' +\n '<tr><td>high</td><td>' + chart.yAxis.tickFormat()(d.high) + '</td></tr>' +\n '<tr><td>low:</td><td>' + chart.yAxis.tickFormat()(d.low) + '</td></tr>' +\n '</table>';\n });\n return chart;\n };\n nv.models.legend = function() {\n 'use strict';\n\n //============================================================\n // Public Variables with Default Settings\n //------------------------------------------------------------\n\n var margin = {top: 5, right: 0, bottom: 5, left: 0}\n , width = 400\n , height = 20\n , getKey = function(d) {\n return d.key;\n }\n , keyFormatter = function(d) {\n return d;\n }\n , color = nv.utils.getColor()\n , maxKeyLength = 20 //default value for key lengths\n , align = true\n , padding = 32 //define how much space between legend items. - recommend 32 for furious version\n , rightAlign = true\n , updateState = true //If true, legend will update data.disabled and trigger a 'stateChange' dispatch.\n , enableDoubleClick = true //If true, legend will enable double click handling\n , radioButtonMode = false //If true, clicking legend items will cause it to behave like a radio button. (only one can\n // be selected at a time)\n , expanded = false\n , dispatch = d3.dispatch('legendClick', 'legendDblclick', 'legendMouseover', 'legendMouseout', 'stateChange')\n , vers = 'classic' //Options are \"classic\" and \"furious\"\n ;\n\n function chart(selection) {\n selection.each(function(data) {\n var availableWidth = width - margin.left - margin.right,\n container = d3.select(this);\n nv.utils.initSVG(container);\n\n // Setup containers and skeleton of chart\n var wrap = container.selectAll('g.nv-legend').data([data]);\n var gEnter = wrap.enter().append('g').attr('class', 'nvd3 nv-legend').append('g');\n var g = wrap.select('g');\n\n if (rightAlign) {\n wrap.attr('transform', 'translate(' + (-margin.right) + ',' + margin.top + ')');\n } else {\n wrap.attr('transform', 'translate(' + margin.left + ',' + margin.top + ')');\n }\n\n var series = g.selectAll('.nv-series')\n .data(function(d) {\n if (vers != 'furious') return d;\n\n return d.filter(function(n) {\n return expanded ? true : !n.disengaged;\n });\n });\n\n var seriesEnter = series.enter().append('g').attr('class', 'nv-series');\n var seriesShape;\n\n var versPadding;\n switch (vers) {\n case 'furious' :\n versPadding = 23;\n break;\n case 'classic' :\n versPadding = 20;\n }\n\n if (vers == 'classic') {\n seriesEnter.append('circle')\n .style('stroke-width', 2)\n .attr('class', 'nv-legend-symbol')\n .attr('r', 5);\n\n seriesShape = series.select('.nv-legend-symbol');\n } else if (vers == 'furious') {\n seriesEnter.append('rect')\n .style('stroke-width', 2)\n .attr('class', 'nv-legend-symbol')\n .attr('rx', 3)\n .attr('ry', 3);\n seriesShape = series.select('.nv-legend-symbol');\n\n seriesEnter.append('g')\n .attr('class', 'nv-check-box')\n .property('innerHTML',\n '<path d=\"M0.5,5 L22.5,5 L22.5,26.5 L0.5,26.5 L0.5,5 Z\" class=\"nv-box\"></path><path d=\"M5.5,12.8618467 L11.9185089,19.2803556 L31,0.198864511\" class=\"nv-check\"></path>')\n .attr('transform', 'translate(-10,-8)scale(0.5)');\n\n var seriesCheckbox = series.select('.nv-check-box');\n\n seriesCheckbox.each(function(d, i) {\n d3.select(this).selectAll('path')\n .attr('stroke', setTextColor(d, i));\n });\n }\n\n seriesEnter.append('text')\n .attr('text-anchor', 'start')\n .attr('class', 'nv-legend-text')\n .attr('dy', '.32em')\n .attr('dx', '8');\n\n var seriesText = series.select('text.nv-legend-text');\n\n series\n .on('mouseover', function(d, i) {\n dispatch.legendMouseover(d, i); //TODO: Make consistent with other event objects\n })\n .on('mouseout', function(d, i) {\n dispatch.legendMouseout(d, i);\n })\n .on('click', function(d, i) {\n dispatch.legendClick(d, i);\n // make sure we re-get data in case it was modified\n var data = series.data();\n if (updateState) {\n if (vers == 'classic') {\n if (radioButtonMode) {\n //Radio button mode: set every series to disabled,\n // and enable the clicked series.\n data.forEach(function(series) {\n series.disabled = true;\n });\n d.disabled = false;\n } else {\n d.disabled = !d.disabled;\n if (data.every(function(series) {\n return series.disabled;\n })) {\n //the default behavior of NVD3 legends is, if every single series\n // is disabled, turn all series' back on.\n data.forEach(function(series) {\n series.disabled = false;\n });\n }\n }\n } else if (vers == 'furious') {\n if (expanded) {\n d.disengaged = !d.disengaged;\n d.userDisabled = d.userDisabled == undefined ? !!d.disabled : d.userDisabled;\n d.disabled = d.disengaged || d.userDisabled;\n } else if (!expanded) {\n d.disabled = !d.disabled;\n d.userDisabled = d.disabled;\n var engaged = data.filter(function(d) {\n return !d.disengaged;\n });\n if (engaged.every(function(series) {\n return series.userDisabled;\n })) {\n //the default behavior of NVD3 legends is, if every single series\n // is disabled, turn all series' back on.\n data.forEach(function(series) {\n series.disabled = series.userDisabled = false;\n });\n }\n }\n }\n dispatch.stateChange({\n disabled: data.map(function(d) {\n return !!d.disabled;\n }),\n disengaged: data.map(function(d) {\n return !!d.disengaged;\n })\n });\n\n }\n })\n .on('dblclick', function(d, i) {\n if (enableDoubleClick) {\n if (vers == 'furious' && expanded) return;\n dispatch.legendDblclick(d, i);\n if (updateState) {\n // make sure we re-get data in case it was modified\n var data = series.data();\n //the default behavior of NVD3 legends, when double clicking one,\n // is to set all other series' to false, and make the double clicked series enabled.\n data.forEach(function(series) {\n series.disabled = true;\n if (vers == 'furious') series.userDisabled = series.disabled;\n });\n d.disabled = false;\n if (vers == 'furious') d.userDisabled = d.disabled;\n dispatch.stateChange({\n disabled: data.map(function(d) {\n return !!d.disabled;\n })\n });\n }\n }\n });\n\n series.classed('nv-disabled', function(d) {\n return d.userDisabled;\n });\n series.exit().remove();\n\n seriesText\n .attr('fill', setTextColor)\n .text(function(d) {\n return keyFormatter(getKey(d));\n });\n\n //TODO: implement fixed-width and max-width options (max-width is especially useful with the align option)\n // NEW ALIGNING CODE, TODO: clean up\n var legendWidth = 0;\n if (align) {\n\n var seriesWidths = [];\n series.each(function(d, i) {\n var legendText;\n if (keyFormatter(getKey(d)) && keyFormatter(getKey(d)).length > maxKeyLength) {\n var trimmedKey = keyFormatter(getKey(d)).substring(0, maxKeyLength);\n legendText = d3.select(this).select('text').text(trimmedKey + '...');\n d3.select(this).append('svg:title').text(keyFormatter(getKey(d)));\n } else {\n legendText = d3.select(this).select('text');\n }\n var nodeTextLength;\n try {\n nodeTextLength = legendText.node().getComputedTextLength();\n // If the legendText is display:none'd (nodeTextLength == 0), simulate an error so we approximate,\n // instead\n if (nodeTextLength <= 0) throw Error();\n } catch (e) {\n nodeTextLength = nv.utils.calcApproxTextWidth(legendText);\n }\n\n seriesWidths.push(nodeTextLength + padding);\n });\n\n var seriesPerRow = 0;\n var columnWidths = [];\n legendWidth = 0;\n\n while (legendWidth < availableWidth && seriesPerRow < seriesWidths.length) {\n columnWidths[seriesPerRow] = seriesWidths[seriesPerRow];\n legendWidth += seriesWidths[seriesPerRow++];\n }\n if (seriesPerRow === 0) seriesPerRow = 1; //minimum of one series per row\n\n while (legendWidth > availableWidth && seriesPerRow > 1) {\n columnWidths = [];\n seriesPerRow--;\n\n for (var k = 0; k < seriesWidths.length; k++) {\n if (seriesWidths[k] > (columnWidths[k % seriesPerRow] || 0)) {\n columnWidths[k % seriesPerRow] = seriesWidths[k];\n }\n }\n\n legendWidth = columnWidths.reduce(function(prev, cur, index, array) {\n return prev + cur;\n });\n }\n\n var xPositions = [];\n for (var i = 0, curX = 0; i < seriesPerRow; i++) {\n xPositions[i] = curX;\n curX += columnWidths[i];\n }\n\n series\n .attr('transform', function(d, i) {\n return 'translate(' + xPositions[i % seriesPerRow] + ',' + (5 + Math.floor(i / seriesPerRow)\n * versPadding) + ')';\n });\n\n //position legend as far right as possible within the total width\n if (rightAlign) {\n g.attr('transform', 'translate(' + (width - margin.right - legendWidth) + ',' + margin.top + ')');\n } else {\n g.attr('transform', 'translate(0' + ',' + margin.top + ')');\n }\n\n height = margin.top + margin.bottom + (Math.ceil(seriesWidths.length / seriesPerRow) * versPadding);\n\n } else {\n\n var ypos = 5,\n newxpos = 5,\n maxwidth = 0,\n xpos;\n series\n .attr('transform', function(d, i) {\n var length = d3.select(this).select('text').node().getComputedTextLength() + padding;\n xpos = newxpos;\n\n if (width < margin.left + margin.right + xpos + length) {\n newxpos = xpos = 5;\n ypos += versPadding;\n }\n\n newxpos += length;\n if (newxpos > maxwidth) maxwidth = newxpos;\n\n if (legendWidth < xpos + maxwidth) {\n legendWidth = xpos + maxwidth;\n }\n return 'translate(' + xpos + ',' + ypos + ')';\n });\n\n //position legend as far right as possible within the total width\n g.attr('transform', 'translate(' + (width - margin.right - maxwidth) + ',' + margin.top + ')');\n\n height = margin.top + margin.bottom + ypos + 15;\n }\n\n if (vers == 'furious') {\n // Size rectangles after text is placed\n seriesShape\n .attr('width', function(d, i) {\n return seriesText[0][i].getComputedTextLength() + 27;\n })\n .attr('height', 18)\n .attr('y', -9)\n .attr('x', -15);\n\n // The background for the expanded legend (UI)\n gEnter.insert('rect', ':first-child')\n .attr('class', 'nv-legend-bg')\n .attr('fill', '#eee')\n // .attr('stroke', '#444')\n .attr('opacity', 0);\n\n var seriesBG = g.select('.nv-legend-bg');\n\n seriesBG\n .transition().duration(300)\n .attr('x', -versPadding)\n .attr('width', legendWidth + versPadding - 12)\n .attr('height', height + 10)\n .attr('y', -margin.top - 10)\n .attr('opacity', expanded ? 1 : 0);\n\n\n }\n\n seriesShape\n .style('fill', setBGColor)\n .style('fill-opacity', setBGOpacity)\n .style('stroke', setBGColor);\n });\n\n function setTextColor(d, i) {\n if (vers != 'furious') return '#000';\n if (expanded) {\n return d.disengaged ? '#000' : '#fff';\n } else if (!expanded) {\n if (!d.color) d.color = color(d, i);\n return !!d.disabled ? d.color : '#fff';\n }\n }\n\n function setBGColor(d, i) {\n if (expanded && vers == 'furious') {\n return d.disengaged ? '#eee' : d.color || color(d, i);\n } else {\n return d.color || color(d, i);\n }\n }\n\n\n function setBGOpacity(d, i) {\n if (expanded && vers == 'furious') {\n return 1;\n } else {\n return !!d.disabled ? 0 : 1;\n }\n }\n\n return chart;\n }\n\n //============================================================\n // Expose Public Variables\n //------------------------------------------------------------\n\n chart.dispatch = dispatch;\n chart.options = nv.utils.optionsFunc.bind(chart);\n\n chart._options = Object.create({}, {\n // simple options, just get/set the necessary values\n width: {\n get: function() {\n return width;\n }, set: function(_) {\n width = _;\n }\n },\n height: {\n get: function() {\n return height;\n }, set: function(_) {\n height = _;\n }\n },\n key: {\n get: function() {\n return getKey;\n }, set: function(_) {\n getKey = _;\n }\n },\n keyFormatter: {\n get: function() {\n return keyFormatter;\n }, set: function(_) {\n keyFormatter = _;\n }\n },\n align: {\n get: function() {\n return align;\n }, set: function(_) {\n align = _;\n }\n },\n maxKeyLength: {\n get: function() {\n return maxKeyLength;\n }, set: function(_) {\n maxKeyLength = _;\n }\n },\n rightAlign: {\n get: function() {\n return rightAlign;\n }, set: function(_) {\n rightAlign = _;\n }\n },\n padding: {\n get: function() {\n return padding;\n }, set: function(_) {\n padding = _;\n }\n },\n updateState: {\n get: function() {\n return updateState;\n }, set: function(_) {\n updateState = _;\n }\n },\n enableDoubleClick: {\n get: function() {\n return enableDoubleClick;\n }, set: function(_) {\n enableDoubleClick = _;\n }\n },\n radioButtonMode: {\n get: function() {\n return radioButtonMode;\n }, set: function(_) {\n radioButtonMode = _;\n }\n },\n expanded: {\n get: function() {\n return expanded;\n }, set: function(_) {\n expanded = _;\n }\n },\n vers: {\n get: function() {\n return vers;\n }, set: function(_) {\n vers = _;\n }\n },\n\n // options that require extra logic in the setter\n margin: {\n get: function() {\n return margin;\n }, set: function(_) {\n margin.top = _.top !== undefined ? _.top : margin.top;\n margin.right = _.right !== undefined ? _.right : margin.right;\n margin.bottom = _.bottom !== undefined ? _.bottom : margin.bottom;\n margin.left = _.left !== undefined ? _.left : margin.left;\n }\n },\n color: {\n get: function() {\n return color;\n }, set: function(_) {\n color = nv.utils.getColor(_);\n }\n }\n });\n\n nv.utils.initOptions(chart);\n\n return chart;\n };\n\n nv.models.line = function() {\n 'use strict';\n //============================================================\n // Public Variables with Default Settings\n //------------------------------------------------------------\n\n var scatter = nv.models.scatter()\n ;\n\n var margin = {top: 0, right: 0, bottom: 0, left: 0}\n , width = 960\n , height = 500\n , container = null\n , strokeWidth = 1.5\n , color = nv.utils.defaultColor() // a function that returns a color\n , getX = function(d) {\n return d.x;\n } // accessor to get the x value from a data point\n , getY = function(d) {\n return d.y;\n } // accessor to get the y value from a data point\n , defined = function(d, i) {\n return !isNaN(getY(d, i)) && getY(d, i) !== null;\n } // allows a line to be not continuous when it is not defined\n , isArea = function(d) {\n return d.area;\n } // decides if a line is an area or just a line\n , clipEdge = false // if true, masks lines within x and y scale\n , x //can be accessed via chart.xScale()\n , y //can be accessed via chart.yScale()\n , interpolate = 'linear' // controls the line interpolation\n , duration = 250\n , dispatch = d3.dispatch('elementClick', 'elementMouseover', 'elementMouseout', 'renderEnd')\n ;\n\n scatter\n .pointSize(16) // default size\n .pointDomain([16, 256]) //set to speed up calculation, needs to be unset if there is a custom size accessor\n ;\n\n //============================================================\n\n\n //============================================================\n // Private Variables\n //------------------------------------------------------------\n\n var x0, y0 //used to store previous scales\n , renderWatch = nv.utils.renderWatch(dispatch, duration)\n ;\n\n //============================================================\n\n\n function chart(selection) {\n renderWatch.reset();\n renderWatch.models(scatter);\n selection.each(function(data) {\n container = d3.select(this);\n var availableWidth = nv.utils.availableWidth(width, container, margin),\n availableHeight = nv.utils.availableHeight(height, container, margin);\n nv.utils.initSVG(container);\n\n // Setup Scales\n x = scatter.xScale();\n y = scatter.yScale();\n\n x0 = x0 || x;\n y0 = y0 || y;\n\n // Setup containers and skeleton of chart\n var wrap = container.selectAll('g.nv-wrap.nv-line').data([data]);\n var wrapEnter = wrap.enter().append('g').attr('class', 'nvd3 nv-wrap nv-line');\n var defsEnter = wrapEnter.append('defs');\n var gEnter = wrapEnter.append('g');\n var g = wrap.select('g');\n\n gEnter.append('g').attr('class', 'nv-groups');\n gEnter.append('g').attr('class', 'nv-scatterWrap');\n\n wrap.attr('transform', 'translate(' + margin.left + ',' + margin.top + ')');\n\n scatter\n .width(availableWidth)\n .height(availableHeight);\n\n var scatterWrap = wrap.select('.nv-scatterWrap');\n scatterWrap.call(scatter);\n\n defsEnter.append('clipPath')\n .attr('id', 'nv-edge-clip-' + scatter.id())\n .append('rect');\n\n wrap.select('#nv-edge-clip-' + scatter.id() + ' rect')\n .attr('width', availableWidth)\n .attr('height', (availableHeight > 0) ? availableHeight : 0);\n\n g.attr('clip-path', clipEdge ? 'url(#nv-edge-clip-' + scatter.id() + ')' : '');\n scatterWrap\n .attr('clip-path', clipEdge ? 'url(#nv-edge-clip-' + scatter.id() + ')' : '');\n\n var groups = wrap.select('.nv-groups').selectAll('.nv-group')\n .data(function(d) {\n return d;\n }, function(d) {\n return d.key;\n });\n groups.enter().append('g')\n .style('stroke-opacity', 1e-6)\n .style('stroke-width', function(d) {\n return d.strokeWidth || strokeWidth;\n })\n .style('fill-opacity', 1e-6);\n\n groups.exit().remove();\n\n groups\n .attr('class', function(d, i) {\n return (d.classed || '') + ' nv-group nv-series-' + i;\n })\n .classed('hover', function(d) {\n return d.hover;\n })\n .style('fill', function(d, i) {\n return color(d, i);\n })\n .style('stroke', function(d, i) {\n return color(d, i);\n });\n groups.watchTransition(renderWatch, 'line: groups')\n .style('stroke-opacity', 1)\n .style('fill-opacity', function(d) {\n return d.fillOpacity || .5;\n });\n\n var areaPaths = groups.selectAll('path.nv-area')\n .data(function(d) {\n return isArea(d) ? [d] : [];\n }); // this is done differently than lines because I need to check if series is an area\n areaPaths.enter().append('path')\n .attr('class', 'nv-area')\n .attr('d', function(d) {\n return d3.svg.area()\n .interpolate(interpolate)\n .defined(defined)\n .x(function(d, i) {\n return nv.utils.NaNtoZero(x0(getX(d, i)));\n })\n .y0(function(d, i) {\n return nv.utils.NaNtoZero(y0(getY(d, i)));\n })\n .y1(function(d, i) {\n return y0(y.domain()[0] <= 0 ? y.domain()[1] >= 0 ? 0 : y.domain()[1] : y.domain()[0]);\n })\n //.y1(function(d,i) { return y0(0) }) //assuming 0 is within y domain.. may need to tweak this\n .apply(this, [d.values]);\n });\n groups.exit().selectAll('path.nv-area')\n .remove();\n\n areaPaths.watchTransition(renderWatch, 'line: areaPaths')\n .attr('d', function(d) {\n return d3.svg.area()\n .interpolate(interpolate)\n .defined(defined)\n .x(function(d, i) {\n return nv.utils.NaNtoZero(x(getX(d, i)));\n })\n .y0(function(d, i) {\n return nv.utils.NaNtoZero(y(getY(d, i)));\n })\n .y1(function(d, i) {\n return y(y.domain()[0] <= 0 ? y.domain()[1] >= 0 ? 0 : y.domain()[1] : y.domain()[0]);\n })\n //.y1(function(d,i) { return y0(0) }) //assuming 0 is within y domain.. may need to tweak this\n .apply(this, [d.values]);\n });\n\n var linePaths = groups.selectAll('path.nv-line')\n .data(function(d) {\n return [d.values];\n });\n\n linePaths.enter().append('path')\n .attr('class', 'nv-line')\n .attr('d',\n d3.svg.line()\n .interpolate(interpolate)\n .defined(defined)\n .x(function(d, i) {\n return nv.utils.NaNtoZero(x0(getX(d, i)));\n })\n .y(function(d, i) {\n return nv.utils.NaNtoZero(y0(getY(d, i)));\n })\n );\n\n linePaths.watchTransition(renderWatch, 'line: linePaths')\n .attr('d',\n d3.svg.line()\n .interpolate(interpolate)\n .defined(defined)\n .x(function(d, i) {\n return nv.utils.NaNtoZero(x(getX(d, i)));\n })\n .y(function(d, i) {\n return nv.utils.NaNtoZero(y(getY(d, i)));\n })\n );\n\n //store old scales for use in transitions on update\n x0 = x.copy();\n y0 = y.copy();\n });\n renderWatch.renderEnd('line immediate');\n return chart;\n }\n\n\n //============================================================\n // Expose Public Variables\n //------------------------------------------------------------\n\n chart.dispatch = dispatch;\n chart.scatter = scatter;\n // Pass through events\n scatter.dispatch.on('elementClick', function() {\n dispatch.elementClick.apply(this, arguments);\n });\n scatter.dispatch.on('elementMouseover', function() {\n dispatch.elementMouseover.apply(this, arguments);\n });\n scatter.dispatch.on('elementMouseout', function() {\n dispatch.elementMouseout.apply(this, arguments);\n });\n\n chart.options = nv.utils.optionsFunc.bind(chart);\n\n chart._options = Object.create({}, {\n // simple options, just get/set the necessary values\n width: {\n get: function() {\n return width;\n }, set: function(_) {\n width = _;\n }\n },\n height: {\n get: function() {\n return height;\n }, set: function(_) {\n height = _;\n }\n },\n defined: {\n get: function() {\n return defined;\n }, set: function(_) {\n defined = _;\n }\n },\n interpolate: {\n get: function() {\n return interpolate;\n }, set: function(_) {\n interpolate = _;\n }\n },\n clipEdge: {\n get: function() {\n return clipEdge;\n }, set: function(_) {\n clipEdge = _;\n }\n },\n\n // options that require extra logic in the setter\n margin: {\n get: function() {\n return margin;\n }, set: function(_) {\n margin.top = _.top !== undefined ? _.top : margin.top;\n margin.right = _.right !== undefined ? _.right : margin.right;\n margin.bottom = _.bottom !== undefined ? _.bottom : margin.bottom;\n margin.left = _.left !== undefined ? _.left : margin.left;\n }\n },\n duration: {\n get: function() {\n return duration;\n }, set: function(_) {\n duration = _;\n renderWatch.reset(duration);\n scatter.duration(duration);\n }\n },\n isArea: {\n get: function() {\n return isArea;\n }, set: function(_) {\n isArea = d3.functor(_);\n }\n },\n x: {\n get: function() {\n return getX;\n }, set: function(_) {\n getX = _;\n scatter.x(_);\n }\n },\n y: {\n get: function() {\n return getY;\n }, set: function(_) {\n getY = _;\n scatter.y(_);\n }\n },\n color: {\n get: function() {\n return color;\n }, set: function(_) {\n color = nv.utils.getColor(_);\n scatter.color(color);\n }\n }\n });\n\n nv.utils.inheritOptions(chart, scatter);\n nv.utils.initOptions(chart);\n\n return chart;\n };\n nv.models.lineChart = function() {\n 'use strict';\n\n //============================================================\n // Public Variables with Default Settings\n //------------------------------------------------------------\n\n var lines = nv.models.line()\n , xAxis = nv.models.axis()\n , yAxis = nv.models.axis()\n , legend = nv.models.legend()\n , interactiveLayer = nv.interactiveGuideline()\n , tooltip = nv.models.tooltip()\n , focus = nv.models.focus(nv.models.line())\n ;\n\n var margin = {top: 30, right: 20, bottom: 50, left: 60}\n , marginTop = null\n , color = nv.utils.defaultColor()\n , width = null\n , height = null\n , showLegend = true\n , legendPosition = 'top'\n , showXAxis = true\n , showYAxis = true\n , rightAlignYAxis = false\n , useInteractiveGuideline = false\n , x\n , y\n , focusEnable = false\n , state = nv.utils.state()\n , defaultState = null\n , noData = null\n , dispatch = d3.dispatch('stateChange', 'changeState', 'renderEnd')\n , duration = 250\n ;\n\n // set options on sub-objects for this chart\n xAxis.orient('bottom').tickPadding(7);\n yAxis.orient(rightAlignYAxis ? 'right' : 'left');\n\n lines.clipEdge(true).duration(0);\n\n tooltip.valueFormatter(function(d, i) {\n return yAxis.tickFormat()(d, i);\n }).headerFormatter(function(d, i) {\n return xAxis.tickFormat()(d, i);\n });\n\n interactiveLayer.tooltip.valueFormatter(function(d, i) {\n return yAxis.tickFormat()(d, i);\n }).headerFormatter(function(d, i) {\n return xAxis.tickFormat()(d, i);\n });\n\n\n //============================================================\n // Private Variables\n //------------------------------------------------------------\n\n var renderWatch = nv.utils.renderWatch(dispatch, duration);\n\n var stateGetter = function(data) {\n return function() {\n return {\n active: data.map(function(d) {\n return !d.disabled;\n })\n };\n };\n };\n\n var stateSetter = function(data) {\n return function(state) {\n if (state.active !== undefined) {\n data.forEach(function(series, i) {\n series.disabled = !state.active[i];\n });\n }\n };\n };\n\n function chart(selection) {\n renderWatch.reset();\n renderWatch.models(lines);\n if (showXAxis) renderWatch.models(xAxis);\n if (showYAxis) renderWatch.models(yAxis);\n\n selection.each(function(data) {\n var container = d3.select(this);\n nv.utils.initSVG(container);\n var availableWidth = nv.utils.availableWidth(width, container, margin),\n availableHeight = nv.utils.availableHeight(height, container, margin) - (focusEnable ? focus.height() : 0);\n chart.update = function() {\n if (duration === 0) {\n container.call(chart);\n } else {\n container.transition().duration(duration).call(chart);\n }\n };\n chart.container = this;\n\n state\n .setter(stateSetter(data), chart.update)\n .getter(stateGetter(data))\n .update();\n\n // DEPRECATED set state.disabled\n state.disabled = data.map(function(d) {\n return !!d.disabled;\n });\n\n if (!defaultState) {\n var key;\n defaultState = {};\n for (key in state) {\n if (state[key] instanceof Array) {\n defaultState[key] = state[key].slice(0);\n } else {\n defaultState[key] = state[key];\n }\n }\n }\n\n // Display noData message if there's nothing to show.\n if (!data || !data.length || !data.filter(function(d) {\n return d.values.length;\n }).length) {\n nv.utils.noData(chart, container);\n return chart;\n } else {\n container.selectAll('.nv-noData').remove();\n }\n\n /* Update `main' graph on brush update. */\n focus.dispatch.on('onBrush', function(extent) {\n onBrush(extent);\n });\n\n // Setup Scales\n x = lines.xScale();\n y = lines.yScale();\n\n // Setup containers and skeleton of chart\n var wrap = container.selectAll('g.nv-wrap.nv-lineChart').data([data]);\n var gEnter = wrap.enter().append('g').attr('class', 'nvd3 nv-wrap nv-lineChart').append('g');\n var g = wrap.select('g');\n\n gEnter.append('g').attr('class', 'nv-legendWrap');\n\n var focusEnter = gEnter.append('g').attr('class', 'nv-focus');\n focusEnter.append('g').attr('class', 'nv-background').append('rect');\n focusEnter.append('g').attr('class', 'nv-x nv-axis');\n focusEnter.append('g').attr('class', 'nv-y nv-axis');\n focusEnter.append('g').attr('class', 'nv-linesWrap');\n focusEnter.append('g').attr('class', 'nv-interactive');\n\n var contextEnter = gEnter.append('g').attr('class', 'nv-focusWrap');\n\n // Legend\n if (!showLegend) {\n g.select('.nv-legendWrap').selectAll('*').remove();\n } else {\n legend.width(availableWidth);\n\n g.select('.nv-legendWrap')\n .datum(data)\n .call(legend);\n\n if (legendPosition === 'bottom') {\n margin.bottom = xAxis.height() + legend.height();\n availableHeight = nv.utils.availableHeight(height, container, margin);\n g.select('.nv-legendWrap')\n .attr('transform', 'translate(0,' + (availableHeight + xAxis.height()) + ')');\n } else if (legendPosition === 'top') {\n if (!marginTop && legend.height() !== margin.top) {\n margin.top = legend.height();\n availableHeight = nv.utils.availableHeight(height, container, margin) - (focusEnable ? focus.height()\n : 0);\n }\n\n wrap.select('.nv-legendWrap')\n .attr('transform', 'translate(0,' + (-margin.top) + ')');\n }\n }\n\n wrap.attr('transform', 'translate(' + margin.left + ',' + margin.top + ')');\n\n if (rightAlignYAxis) {\n g.select('.nv-y.nv-axis')\n .attr('transform', 'translate(' + availableWidth + ',0)');\n }\n\n //Set up interactive layer\n if (useInteractiveGuideline) {\n interactiveLayer\n .width(availableWidth)\n .height(availableHeight)\n .margin({left: margin.left, top: margin.top})\n .svgContainer(container)\n .xScale(x);\n wrap.select('.nv-interactive').call(interactiveLayer);\n }\n\n g.select('.nv-focus .nv-background rect')\n .attr('width', availableWidth)\n .attr('height', availableHeight);\n\n lines\n .width(availableWidth)\n .height(availableHeight)\n .color(data.map(function(d, i) {\n return d.color || color(d, i);\n }).filter(function(d, i) {\n return !data[i].disabled;\n }));\n\n var linesWrap = g.select('.nv-linesWrap')\n .datum(data.filter(function(d) {\n return !d.disabled;\n }));\n\n\n // Setup Main (Focus) Axes\n if (showXAxis) {\n xAxis\n .scale(x)\n ._ticks(nv.utils.calcTicksX(availableWidth / 100, data))\n .tickSize(-availableHeight, 0);\n }\n\n if (showYAxis) {\n yAxis\n .scale(y)\n ._ticks(nv.utils.calcTicksY(availableHeight / 36, data))\n .tickSize(-availableWidth, 0);\n }\n\n //============================================================\n // Update Axes\n //============================================================\n function updateXAxis() {\n if (showXAxis) {\n g.select('.nv-focus .nv-x.nv-axis')\n .transition()\n .duration(duration)\n .call(xAxis)\n ;\n }\n }\n\n function updateYAxis() {\n if (showYAxis) {\n g.select('.nv-focus .nv-y.nv-axis')\n .transition()\n .duration(duration)\n .call(yAxis)\n ;\n }\n }\n\n g.select('.nv-focus .nv-x.nv-axis')\n .attr('transform', 'translate(0,' + availableHeight + ')');\n\n //============================================================\n // Update Focus\n //============================================================\n if (!focusEnable && focus.brush.extent() === null) {\n linesWrap.call(lines);\n updateXAxis();\n updateYAxis();\n } else {\n focus.width(availableWidth);\n g.select('.nv-focusWrap')\n .style('display', focusEnable ? 'initial' : 'none')\n .attr('transform', 'translate(0,' + (availableHeight + margin.bottom + focus.margin().top) + ')')\n .call(focus);\n var extent = focus.brush.empty() ? focus.xDomain() : focus.brush.extent();\n if (extent !== null) {\n onBrush(extent);\n }\n }\n //============================================================\n // Event Handling/Dispatching (in chart's scope)\n //------------------------------------------------------------\n\n legend.dispatch.on('stateChange', function(newState) {\n for (var key in newState) {\n state[key] = newState[key];\n }\n dispatch.stateChange(state);\n chart.update();\n });\n\n interactiveLayer.dispatch.on('elementMousemove', function(e) {\n lines.clearHighlights();\n var singlePoint, pointIndex, pointXLocation, allData = [];\n data\n .filter(function(series, i) {\n series.seriesIndex = i;\n return !series.disabled && !series.disableTooltip;\n })\n .forEach(function(series, i) {\n var extent = focus.brush.extent() !== null ? (focus.brush.empty() ? focus.xScale().domain()\n : focus.brush.extent()) : x.domain();\n var currentValues = series.values.filter(function(d, i) {\n // Checks if the x point is between the extents, handling case where extent[0] is greater than\n // extent[1] (e.g. x domain is manually set to reverse the x-axis)\n if (extent[0] <= extent[1]) {\n return lines.x()(d, i) >= extent[0] && lines.x()(d, i) <= extent[1];\n } else {\n return lines.x()(d, i) >= extent[1] && lines.x()(d, i) <= extent[0];\n }\n });\n\n pointIndex = nv.interactiveBisect(currentValues, e.pointXValue, lines.x());\n var point = currentValues[pointIndex];\n var pointYValue = chart.y()(point, pointIndex);\n if (pointYValue !== null) {\n lines.highlightPoint(i, pointIndex, true);\n }\n if (point === undefined) return;\n if (singlePoint === undefined) singlePoint = point;\n if (pointXLocation === undefined) pointXLocation = chart.xScale()(chart.x()(point, pointIndex));\n allData.push({\n key: series.key,\n value: pointYValue,\n color: color(series, series.seriesIndex),\n data: point\n });\n });\n //Highlight the tooltip entry based on which point the mouse is closest to.\n if (allData.length > 2) {\n var yValue = chart.yScale().invert(e.mouseY);\n var domainExtent = Math.abs(chart.yScale().domain()[0] - chart.yScale().domain()[1]);\n var threshold = 0.03 * domainExtent;\n var indexToHighlight = nv.nearestValueIndex(allData.map(function(d) {\n return d.value;\n }), yValue, threshold);\n if (indexToHighlight !== null) {\n allData[indexToHighlight].highlight = true;\n }\n }\n\n var defaultValueFormatter = function(d, i) {\n return d == null ? 'N/A' : yAxis.tickFormat()(d);\n };\n\n interactiveLayer.tooltip\n .valueFormatter(interactiveLayer.tooltip.valueFormatter() || defaultValueFormatter)\n .data({\n value: chart.x()(singlePoint, pointIndex),\n index: pointIndex,\n series: allData\n })();\n\n interactiveLayer.renderGuideLine(pointXLocation);\n\n });\n\n interactiveLayer.dispatch.on('elementClick', function(e) {\n var pointXLocation, allData = [];\n\n data.filter(function(series, i) {\n series.seriesIndex = i;\n return !series.disabled;\n }).forEach(function(series) {\n var pointIndex = nv.interactiveBisect(series.values, e.pointXValue, chart.x());\n var point = series.values[pointIndex];\n if (typeof point === 'undefined') return;\n if (typeof pointXLocation === 'undefined') pointXLocation = chart.xScale()(chart.x()(point, pointIndex));\n var yPos = chart.yScale()(chart.y()(point, pointIndex));\n allData.push({\n point: point,\n pointIndex: pointIndex,\n pos: [pointXLocation, yPos],\n seriesIndex: series.seriesIndex,\n series: series\n });\n });\n\n lines.dispatch.elementClick(allData);\n });\n\n interactiveLayer.dispatch.on('elementMouseout', function(e) {\n lines.clearHighlights();\n });\n\n dispatch.on('changeState', function(e) {\n if (typeof e.disabled !== 'undefined' && data.length === e.disabled.length) {\n data.forEach(function(series, i) {\n series.disabled = e.disabled[i];\n });\n\n state.disabled = e.disabled;\n }\n chart.update();\n });\n\n //============================================================\n // Functions\n //------------------------------------------------------------\n\n // Taken from crossfilter (http://square.github.com/crossfilter/)\n function resizePath(d) {\n var e = +(d == 'e'),\n x = e ? 1 : -1,\n y = availableHeight / 3;\n return 'M' + (0.5 * x) + ',' + y\n + 'A6,6 0 0 ' + e + ' ' + (6.5 * x) + ',' + (y + 6)\n + 'V' + (2 * y - 6)\n + 'A6,6 0 0 ' + e + ' ' + (0.5 * x) + ',' + (2 * y)\n + 'Z'\n + 'M' + (2.5 * x) + ',' + (y + 8)\n + 'V' + (2 * y - 8)\n + 'M' + (4.5 * x) + ',' + (y + 8)\n + 'V' + (2 * y - 8);\n }\n\n function onBrush(extent) {\n // Update Main (Focus)\n var focusLinesWrap = g.select('.nv-focus .nv-linesWrap')\n .datum(\n data.filter(function(d) {\n return !d.disabled;\n })\n .map(function(d, i) {\n return {\n key: d.key,\n area: d.area,\n classed: d.classed,\n values: d.values.filter(function(d, i) {\n return lines.x()(d, i) >= extent[0] && lines.x()(d, i) <= extent[1];\n }),\n disableTooltip: d.disableTooltip\n };\n })\n );\n focusLinesWrap.transition().duration(duration).call(lines);\n\n // Update Main (Focus) Axes\n updateXAxis();\n updateYAxis();\n }\n });\n\n renderWatch.renderEnd('lineChart immediate');\n return chart;\n }\n\n\n //============================================================\n // Event Handling/Dispatching (out of chart's scope)\n //------------------------------------------------------------\n\n lines.dispatch.on('elementMouseover.tooltip', function(evt) {\n if (!evt.series.disableTooltip) {\n tooltip.data(evt).hidden(false);\n }\n });\n\n lines.dispatch.on('elementMouseout.tooltip', function(evt) {\n tooltip.hidden(true);\n });\n\n //============================================================\n // Expose Public Variables\n //------------------------------------------------------------\n\n // expose chart's sub-components\n chart.dispatch = dispatch;\n chart.lines = lines;\n chart.legend = legend;\n chart.focus = focus;\n chart.xAxis = xAxis;\n chart.x2Axis = focus.xAxis;\n chart.yAxis = yAxis;\n chart.y2Axis = focus.yAxis;\n chart.interactiveLayer = interactiveLayer;\n chart.tooltip = tooltip;\n chart.state = state;\n chart.dispatch = dispatch;\n chart.options = nv.utils.optionsFunc.bind(chart);\n\n chart._options = Object.create({}, {\n // simple options, just get/set the necessary values\n width: {\n get: function() {\n return width;\n }, set: function(_) {\n width = _;\n }\n },\n height: {\n get: function() {\n return height;\n }, set: function(_) {\n height = _;\n }\n },\n showLegend: {\n get: function() {\n return showLegend;\n }, set: function(_) {\n showLegend = _;\n }\n },\n legendPosition: {\n get: function() {\n return legendPosition;\n }, set: function(_) {\n legendPosition = _;\n }\n },\n showXAxis: {\n get: function() {\n return showXAxis;\n }, set: function(_) {\n showXAxis = _;\n }\n },\n showYAxis: {\n get: function() {\n return showYAxis;\n }, set: function(_) {\n showYAxis = _;\n }\n },\n defaultState: {\n get: function() {\n return defaultState;\n }, set: function(_) {\n defaultState = _;\n }\n },\n noData: {\n get: function() {\n return noData;\n }, set: function(_) {\n noData = _;\n }\n },\n // Focus options, mostly passed onto focus model.\n focusEnable: {\n get: function() {\n return focusEnable;\n }, set: function(_) {\n focusEnable = _;\n }\n },\n focusHeight: {\n get: function() {\n return focus.height();\n }, set: function(_) {\n focus.height(_);\n }\n },\n focusShowAxisX: {\n get: function() {\n return focus.showXAxis();\n }, set: function(_) {\n focus.showXAxis(_);\n }\n },\n focusShowAxisY: {\n get: function() {\n return focus.showYAxis();\n }, set: function(_) {\n focus.showYAxis(_);\n }\n },\n brushExtent: {\n get: function() {\n return focus.brushExtent();\n }, set: function(_) {\n focus.brushExtent(_);\n }\n },\n\n // options that require extra logic in the setter\n focusMargin: {\n get: function() {\n return focus.margin;\n }, set: function(_) {\n if (_.top !== undefined) {\n margin.top = _.top;\n marginTop = _.top;\n }\n focus.margin.right = _.right !== undefined ? _.right : focus.margin.right;\n focus.margin.bottom = _.bottom !== undefined ? _.bottom : focus.margin.bottom;\n focus.margin.left = _.left !== undefined ? _.left : focus.margin.left;\n }\n },\n margin: {\n get: function() {\n return margin;\n }, set: function(_) {\n margin.top = _.top !== undefined ? _.top : margin.top;\n margin.right = _.right !== undefined ? _.right : margin.right;\n margin.bottom = _.bottom !== undefined ? _.bottom : margin.bottom;\n margin.left = _.left !== undefined ? _.left : margin.left;\n }\n },\n duration: {\n get: function() {\n return duration;\n }, set: function(_) {\n duration = _;\n renderWatch.reset(duration);\n lines.duration(duration);\n focus.duration(duration);\n xAxis.duration(duration);\n yAxis.duration(duration);\n }\n },\n color: {\n get: function() {\n return color;\n }, set: function(_) {\n color = nv.utils.getColor(_);\n legend.color(color);\n lines.color(color);\n focus.color(color);\n }\n },\n interpolate: {\n get: function() {\n return lines.interpolate();\n }, set: function(_) {\n lines.interpolate(_);\n focus.interpolate(_);\n }\n },\n xTickFormat: {\n get: function() {\n return xAxis.tickFormat();\n }, set: function(_) {\n xAxis.tickFormat(_);\n focus.xTickFormat(_);\n }\n },\n yTickFormat: {\n get: function() {\n return yAxis.tickFormat();\n }, set: function(_) {\n yAxis.tickFormat(_);\n focus.yTickFormat(_);\n }\n },\n x: {\n get: function() {\n return lines.x();\n }, set: function(_) {\n lines.x(_);\n focus.x(_);\n }\n },\n y: {\n get: function() {\n return lines.y();\n }, set: function(_) {\n lines.y(_);\n focus.y(_);\n }\n },\n rightAlignYAxis: {\n get: function() {\n return rightAlignYAxis;\n }, set: function(_) {\n rightAlignYAxis = _;\n yAxis.orient(rightAlignYAxis ? 'right' : 'left');\n }\n },\n useInteractiveGuideline: {\n get: function() {\n return useInteractiveGuideline;\n }, set: function(_) {\n useInteractiveGuideline = _;\n if (useInteractiveGuideline) {\n lines.interactive(false);\n lines.useVoronoi(false);\n }\n }\n }\n });\n\n nv.utils.inheritOptions(chart, lines);\n nv.utils.initOptions(chart);\n\n return chart;\n };\n\n nv.models.lineWithFocusChart = function() {\n return nv.models.lineChart()\n .margin({bottom: 30})\n .focusEnable(true);\n };\n nv.models.linePlusBarChart = function() {\n 'use strict';\n\n //============================================================\n // Public Variables with Default Settings\n //------------------------------------------------------------\n\n var lines = nv.models.line()\n , lines2 = nv.models.line()\n , bars = nv.models.historicalBar()\n , bars2 = nv.models.historicalBar()\n , xAxis = nv.models.axis()\n , x2Axis = nv.models.axis()\n , y1Axis = nv.models.axis()\n , y2Axis = nv.models.axis()\n , y3Axis = nv.models.axis()\n , y4Axis = nv.models.axis()\n , legend = nv.models.legend()\n , brush = d3.svg.brush()\n , tooltip = nv.models.tooltip()\n ;\n\n var margin = {top: 30, right: 30, bottom: 30, left: 60}\n , marginTop = null\n , margin2 = {top: 0, right: 30, bottom: 20, left: 60}\n , width = null\n , height = null\n , getX = function(d) {\n return d.x;\n }\n , getY = function(d) {\n return d.y;\n }\n , color = nv.utils.defaultColor()\n , showLegend = true\n , focusEnable = true\n , focusShowAxisY = false\n , focusShowAxisX = true\n , focusHeight = 50\n , extent\n , brushExtent = null\n , x\n , x2\n , y1\n , y2\n , y3\n , y4\n , noData = null\n , dispatch = d3.dispatch('brush', 'stateChange', 'changeState')\n , transitionDuration = 0\n , state = nv.utils.state()\n , defaultState = null\n , legendLeftAxisHint = ' (left axis)'\n , legendRightAxisHint = ' (right axis)'\n , switchYAxisOrder = false\n ;\n\n lines.clipEdge(true);\n lines2.interactive(false);\n // We don't want any points emitted for the focus chart's scatter graph.\n lines2.pointActive(function(d) {\n return false;\n });\n xAxis.orient('bottom').tickPadding(5);\n y1Axis.orient('left');\n y2Axis.orient('right');\n x2Axis.orient('bottom').tickPadding(5);\n y3Axis.orient('left');\n y4Axis.orient('right');\n\n tooltip.headerEnabled(true).headerFormatter(function(d, i) {\n return xAxis.tickFormat()(d, i);\n });\n\n //============================================================\n // Private Variables\n //------------------------------------------------------------\n\n var getBarsAxis = function() {\n return switchYAxisOrder\n ? {main: y2Axis, focus: y4Axis}\n : {main: y1Axis, focus: y3Axis};\n };\n\n var getLinesAxis = function() {\n return switchYAxisOrder\n ? {main: y1Axis, focus: y3Axis}\n : {main: y2Axis, focus: y4Axis};\n };\n\n var stateGetter = function(data) {\n return function() {\n return {\n active: data.map(function(d) {\n return !d.disabled;\n })\n };\n };\n };\n\n var stateSetter = function(data) {\n return function(state) {\n if (state.active !== undefined) {\n data.forEach(function(series, i) {\n series.disabled = !state.active[i];\n });\n }\n };\n };\n\n var allDisabled = function(data) {\n return data.every(function(series) {\n return series.disabled;\n });\n };\n\n function chart(selection) {\n selection.each(function(data) {\n var container = d3.select(this),\n that = this;\n nv.utils.initSVG(container);\n var availableWidth = nv.utils.availableWidth(width, container, margin),\n availableHeight1 = nv.utils.availableHeight(height, container, margin)\n - (focusEnable ? focusHeight : 0),\n availableHeight2 = focusHeight - margin2.top - margin2.bottom;\n\n chart.update = function() {\n container.transition().duration(transitionDuration).call(chart);\n };\n chart.container = this;\n\n state\n .setter(stateSetter(data), chart.update)\n .getter(stateGetter(data))\n .update();\n\n // DEPRECATED set state.disableddisabled\n state.disabled = data.map(function(d) {\n return !!d.disabled;\n });\n\n if (!defaultState) {\n var key;\n defaultState = {};\n for (key in state) {\n if (state[key] instanceof Array) {\n defaultState[key] = state[key].slice(0);\n } else {\n defaultState[key] = state[key];\n }\n }\n }\n\n // Display No Data message if there's nothing to show.\n if (!data || !data.length || !data.filter(function(d) {\n return d.values.length;\n }).length) {\n nv.utils.noData(chart, container);\n return chart;\n } else {\n container.selectAll('.nv-noData').remove();\n }\n\n // Setup Scales\n var dataBars = data.filter(function(d) {\n return !d.disabled && d.bar;\n });\n var dataLines = data.filter(function(d) {\n return !d.bar;\n }); // removed the !d.disabled clause here to fix Issue #240\n\n if (dataBars.length && !switchYAxisOrder) {\n x = bars.xScale();\n } else {\n x = lines.xScale();\n }\n\n x2 = x2Axis.scale();\n\n // select the scales and series based on the position of the yAxis\n y1 = switchYAxisOrder ? lines.yScale() : bars.yScale();\n y2 = switchYAxisOrder ? bars.yScale() : lines.yScale();\n y3 = switchYAxisOrder ? lines2.yScale() : bars2.yScale();\n y4 = switchYAxisOrder ? bars2.yScale() : lines2.yScale();\n\n var series1 = data\n .filter(function(d) {\n return !d.disabled && (switchYAxisOrder ? !d.bar : d.bar);\n })\n .map(function(d) {\n return d.values.map(function(d, i) {\n return {x: getX(d, i), y: getY(d, i)};\n });\n });\n\n var series2 = data\n .filter(function(d) {\n return !d.disabled && (switchYAxisOrder ? d.bar : !d.bar);\n })\n .map(function(d) {\n return d.values.map(function(d, i) {\n return {x: getX(d, i), y: getY(d, i)};\n });\n });\n\n x.range([0, availableWidth]);\n\n x2.domain(d3.extent(d3.merge(series1.concat(series2)), function(d) {\n return d.x;\n }))\n .range([0, availableWidth]);\n\n // Setup containers and skeleton of chart\n var wrap = container.selectAll('g.nv-wrap.nv-linePlusBar').data([data]);\n var gEnter = wrap.enter().append('g').attr('class', 'nvd3 nv-wrap nv-linePlusBar').append('g');\n var g = wrap.select('g');\n\n gEnter.append('g').attr('class', 'nv-legendWrap');\n\n // this is the main chart\n var focusEnter = gEnter.append('g').attr('class', 'nv-focus');\n focusEnter.append('g').attr('class', 'nv-x nv-axis');\n focusEnter.append('g').attr('class', 'nv-y1 nv-axis');\n focusEnter.append('g').attr('class', 'nv-y2 nv-axis');\n focusEnter.append('g').attr('class', 'nv-barsWrap');\n focusEnter.append('g').attr('class', 'nv-linesWrap');\n\n // context chart is where you can focus in\n var contextEnter = gEnter.append('g').attr('class', 'nv-context');\n contextEnter.append('g').attr('class', 'nv-x nv-axis');\n contextEnter.append('g').attr('class', 'nv-y1 nv-axis');\n contextEnter.append('g').attr('class', 'nv-y2 nv-axis');\n contextEnter.append('g').attr('class', 'nv-barsWrap');\n contextEnter.append('g').attr('class', 'nv-linesWrap');\n contextEnter.append('g').attr('class', 'nv-brushBackground');\n contextEnter.append('g').attr('class', 'nv-x nv-brush');\n\n //============================================================\n // Legend\n //------------------------------------------------------------\n\n if (!showLegend) {\n g.select('.nv-legendWrap').selectAll('*').remove();\n } else {\n var legendWidth = legend.align() ? availableWidth / 2 : availableWidth;\n var legendXPosition = legend.align() ? legendWidth : 0;\n\n legend.width(legendWidth);\n\n g.select('.nv-legendWrap')\n .datum(data.map(function(series) {\n series.originalKey = series.originalKey === undefined ? series.key : series.originalKey;\n if (switchYAxisOrder) {\n series.key = series.originalKey + (series.bar ? legendRightAxisHint : legendLeftAxisHint);\n } else {\n series.key = series.originalKey + (series.bar ? legendLeftAxisHint : legendRightAxisHint);\n }\n return series;\n }))\n .call(legend);\n\n if (!marginTop && legend.height() !== margin.top) {\n margin.top = legend.height();\n // FIXME: shouldn't this be \"- (focusEnabled ? focusHeight : 0)\"?\n availableHeight1 = nv.utils.availableHeight(height, container, margin) - focusHeight;\n }\n\n g.select('.nv-legendWrap')\n .attr('transform', 'translate(' + legendXPosition + ',' + (-margin.top) + ')');\n }\n\n wrap.attr('transform', 'translate(' + margin.left + ',' + margin.top + ')');\n\n //============================================================\n // Context chart (focus chart) components\n //------------------------------------------------------------\n\n // hide or show the focus context chart\n g.select('.nv-context').style('display', focusEnable ? 'initial' : 'none');\n\n bars2\n .width(availableWidth)\n .height(availableHeight2)\n .color(data.map(function(d, i) {\n return d.color || color(d, i);\n }).filter(function(d, i) {\n return !data[i].disabled && data[i].bar;\n }));\n lines2\n .width(availableWidth)\n .height(availableHeight2)\n .color(data.map(function(d, i) {\n return d.color || color(d, i);\n }).filter(function(d, i) {\n return !data[i].disabled && !data[i].bar;\n }));\n\n var bars2Wrap = g.select('.nv-context .nv-barsWrap')\n .datum(dataBars.length ? dataBars : [\n {values: []}\n ]);\n var lines2Wrap = g.select('.nv-context .nv-linesWrap')\n .datum(allDisabled(dataLines) ?\n [{values: []}] :\n dataLines.filter(function(dataLine) {\n return !dataLine.disabled;\n }));\n\n g.select('.nv-context')\n .attr('transform', 'translate(0,' + (availableHeight1 + margin.bottom + margin2.top) + ')');\n\n bars2Wrap.transition().call(bars2);\n lines2Wrap.transition().call(lines2);\n\n // context (focus chart) axis controls\n if (focusShowAxisX) {\n x2Axis\n ._ticks(nv.utils.calcTicksX(availableWidth / 100, data))\n .tickSize(-availableHeight2, 0);\n g.select('.nv-context .nv-x.nv-axis')\n .attr('transform', 'translate(0,' + y3.range()[0] + ')');\n g.select('.nv-context .nv-x.nv-axis').transition()\n .call(x2Axis);\n }\n\n if (focusShowAxisY) {\n y3Axis\n .scale(y3)\n ._ticks(availableHeight2 / 36)\n .tickSize(-availableWidth, 0);\n y4Axis\n .scale(y4)\n ._ticks(availableHeight2 / 36)\n .tickSize(dataBars.length ? 0 : -availableWidth, 0); // Show the y2 rules only if y1 has none\n\n g.select('.nv-context .nv-y3.nv-axis')\n .style('opacity', dataBars.length ? 1 : 0)\n .attr('transform', 'translate(0,' + x2.range()[0] + ')');\n g.select('.nv-context .nv-y2.nv-axis')\n .style('opacity', dataLines.length ? 1 : 0)\n .attr('transform', 'translate(' + x2.range()[1] + ',0)');\n\n g.select('.nv-context .nv-y1.nv-axis').transition()\n .call(y3Axis);\n g.select('.nv-context .nv-y2.nv-axis').transition()\n .call(y4Axis);\n }\n\n // Setup Brush\n brush.x(x2).on('brush', onBrush);\n\n if (brushExtent) brush.extent(brushExtent);\n\n var brushBG = g.select('.nv-brushBackground').selectAll('g')\n .data([brushExtent || brush.extent()]);\n\n var brushBGenter = brushBG.enter()\n .append('g');\n\n brushBGenter.append('rect')\n .attr('class', 'left')\n .attr('x', 0)\n .attr('y', 0)\n .attr('height', availableHeight2);\n\n brushBGenter.append('rect')\n .attr('class', 'right')\n .attr('x', 0)\n .attr('y', 0)\n .attr('height', availableHeight2);\n\n var gBrush = g.select('.nv-x.nv-brush')\n .call(brush);\n gBrush.selectAll('rect')\n //.attr('y', -5)\n .attr('height', availableHeight2);\n gBrush.selectAll('.resize').append('path').attr('d', resizePath);\n\n //============================================================\n // Event Handling/Dispatching (in chart's scope)\n //------------------------------------------------------------\n\n legend.dispatch.on('stateChange', function(newState) {\n for (var key in newState) {\n state[key] = newState[key];\n }\n dispatch.stateChange(state);\n chart.update();\n });\n\n // Update chart from a state object passed to event handler\n dispatch.on('changeState', function(e) {\n if (typeof e.disabled !== 'undefined') {\n data.forEach(function(series, i) {\n series.disabled = e.disabled[i];\n });\n state.disabled = e.disabled;\n }\n chart.update();\n });\n\n //============================================================\n // Functions\n //------------------------------------------------------------\n\n // Taken from crossfilter (http://square.github.com/crossfilter/)\n function resizePath(d) {\n var e = +(d == 'e'),\n x = e ? 1 : -1,\n y = availableHeight2 / 3;\n return 'M' + (.5 * x) + ',' + y\n + 'A6,6 0 0 ' + e + ' ' + (6.5 * x) + ',' + (y + 6)\n + 'V' + (2 * y - 6)\n + 'A6,6 0 0 ' + e + ' ' + (.5 * x) + ',' + (2 * y)\n + 'Z'\n + 'M' + (2.5 * x) + ',' + (y + 8)\n + 'V' + (2 * y - 8)\n + 'M' + (4.5 * x) + ',' + (y + 8)\n + 'V' + (2 * y - 8);\n }\n\n\n function updateBrushBG() {\n if (!brush.empty()) brush.extent(brushExtent);\n brushBG\n .data([brush.empty() ? x2.domain() : brushExtent])\n .each(function(d, i) {\n var leftWidth = x2(d[0]) - x2.range()[0],\n rightWidth = x2.range()[1] - x2(d[1]);\n d3.select(this).select('.left')\n .attr('width', leftWidth < 0 ? 0 : leftWidth);\n\n d3.select(this).select('.right')\n .attr('x', x2(d[1]))\n .attr('width', rightWidth < 0 ? 0 : rightWidth);\n });\n }\n\n function onBrush() {\n brushExtent = brush.empty() ? null : brush.extent();\n extent = brush.empty() ? x2.domain() : brush.extent();\n dispatch.brush({extent: extent, brush: brush});\n updateBrushBG();\n\n // Prepare Main (Focus) Bars and Lines\n bars\n .width(availableWidth)\n .height(availableHeight1)\n .color(data.map(function(d, i) {\n return d.color || color(d, i);\n }).filter(function(d, i) {\n return !data[i].disabled && data[i].bar;\n }));\n\n lines\n .width(availableWidth)\n .height(availableHeight1)\n .color(data.map(function(d, i) {\n return d.color || color(d, i);\n }).filter(function(d, i) {\n return !data[i].disabled && !data[i].bar;\n }));\n\n var focusBarsWrap = g.select('.nv-focus .nv-barsWrap')\n .datum(!dataBars.length ? [{values: []}] :\n dataBars\n .map(function(d, i) {\n return {\n key: d.key,\n values: d.values.filter(function(d, i) {\n return bars.x()(d, i) >= extent[0] && bars.x()(d, i) <= extent[1];\n })\n };\n })\n );\n\n var focusLinesWrap = g.select('.nv-focus .nv-linesWrap')\n .datum(allDisabled(dataLines) ? [{values: []}] :\n dataLines\n .filter(function(dataLine) {\n return !dataLine.disabled;\n })\n .map(function(d, i) {\n return {\n area: d.area,\n fillOpacity: d.fillOpacity,\n strokeWidth: d.strokeWidth,\n key: d.key,\n values: d.values.filter(function(d, i) {\n return lines.x()(d, i) >= extent[0] && lines.x()(d, i) <= extent[1];\n })\n };\n })\n );\n\n // Update Main (Focus) X Axis\n if (dataBars.length && !switchYAxisOrder) {\n x = bars.xScale();\n } else {\n x = lines.xScale();\n }\n\n xAxis\n .scale(x)\n ._ticks(nv.utils.calcTicksX(availableWidth / 100, data))\n .tickSize(-availableHeight1, 0);\n\n xAxis.domain([Math.ceil(extent[0]), Math.floor(extent[1])]);\n\n g.select('.nv-x.nv-axis').transition().duration(transitionDuration)\n .call(xAxis);\n\n // Update Main (Focus) Bars and Lines\n focusBarsWrap.transition().duration(transitionDuration).call(bars);\n focusLinesWrap.transition().duration(transitionDuration).call(lines);\n\n // Setup and Update Main (Focus) Y Axes\n g.select('.nv-focus .nv-x.nv-axis')\n .attr('transform', 'translate(0,' + y1.range()[0] + ')');\n\n y1Axis\n .scale(y1)\n ._ticks(nv.utils.calcTicksY(availableHeight1 / 36, data))\n .tickSize(-availableWidth, 0);\n y2Axis\n .scale(y2)\n ._ticks(nv.utils.calcTicksY(availableHeight1 / 36, data));\n\n // Show the y2 rules only if y1 has none\n if (!switchYAxisOrder) {\n y2Axis.tickSize(dataBars.length ? 0 : -availableWidth, 0);\n } else {\n y2Axis.tickSize(dataLines.length ? 0 : -availableWidth, 0);\n }\n\n // Calculate opacity of the axis\n var barsOpacity = dataBars.length ? 1 : 0;\n var linesOpacity = dataLines.length && !allDisabled(dataLines) ? 1 : 0;\n\n var y1Opacity = switchYAxisOrder ? linesOpacity : barsOpacity;\n var y2Opacity = switchYAxisOrder ? barsOpacity : linesOpacity;\n\n g.select('.nv-focus .nv-y1.nv-axis')\n .style('opacity', y1Opacity);\n g.select('.nv-focus .nv-y2.nv-axis')\n .style('opacity', y2Opacity)\n .attr('transform', 'translate(' + x.range()[1] + ',0)');\n\n g.select('.nv-focus .nv-y1.nv-axis').transition().duration(transitionDuration)\n .call(y1Axis);\n g.select('.nv-focus .nv-y2.nv-axis').transition().duration(transitionDuration)\n .call(y2Axis);\n }\n\n onBrush();\n\n });\n\n return chart;\n }\n\n //============================================================\n // Event Handling/Dispatching (out of chart's scope)\n //------------------------------------------------------------\n\n lines.dispatch.on('elementMouseover.tooltip', function(evt) {\n tooltip\n .duration(100)\n .valueFormatter(function(d, i) {\n return getLinesAxis().main.tickFormat()(d, i);\n })\n .data(evt)\n .hidden(false);\n });\n\n lines.dispatch.on('elementMouseout.tooltip', function(evt) {\n tooltip.hidden(true);\n });\n\n bars.dispatch.on('elementMouseover.tooltip', function(evt) {\n evt.value = chart.x()(evt.data);\n evt['series'] = {\n value: chart.y()(evt.data),\n color: evt.color\n };\n tooltip\n .duration(0)\n .valueFormatter(function(d, i) {\n return getBarsAxis().main.tickFormat()(d, i);\n })\n .data(evt)\n .hidden(false);\n });\n\n bars.dispatch.on('elementMouseout.tooltip', function(evt) {\n tooltip.hidden(true);\n });\n\n bars.dispatch.on('elementMousemove.tooltip', function(evt) {\n tooltip();\n });\n\n //============================================================\n\n\n //============================================================\n // Expose Public Variables\n //------------------------------------------------------------\n\n // expose chart's sub-components\n chart.dispatch = dispatch;\n chart.legend = legend;\n chart.lines = lines;\n chart.lines2 = lines2;\n chart.bars = bars;\n chart.bars2 = bars2;\n chart.xAxis = xAxis;\n chart.x2Axis = x2Axis;\n chart.y1Axis = y1Axis;\n chart.y2Axis = y2Axis;\n chart.y3Axis = y3Axis;\n chart.y4Axis = y4Axis;\n chart.tooltip = tooltip;\n\n chart.options = nv.utils.optionsFunc.bind(chart);\n\n chart._options = Object.create({}, {\n // simple options, just get/set the necessary values\n width: {\n get: function() {\n return width;\n }, set: function(_) {\n width = _;\n }\n },\n height: {\n get: function() {\n return height;\n }, set: function(_) {\n height = _;\n }\n },\n showLegend: {\n get: function() {\n return showLegend;\n }, set: function(_) {\n showLegend = _;\n }\n },\n brushExtent: {\n get: function() {\n return brushExtent;\n }, set: function(_) {\n brushExtent = _;\n }\n },\n noData: {\n get: function() {\n return noData;\n }, set: function(_) {\n noData = _;\n }\n },\n focusEnable: {\n get: function() {\n return focusEnable;\n }, set: function(_) {\n focusEnable = _;\n }\n },\n focusHeight: {\n get: function() {\n return focusHeight;\n }, set: function(_) {\n focusHeight = _;\n }\n },\n focusShowAxisX: {\n get: function() {\n return focusShowAxisX;\n }, set: function(_) {\n focusShowAxisX = _;\n }\n },\n focusShowAxisY: {\n get: function() {\n return focusShowAxisY;\n }, set: function(_) {\n focusShowAxisY = _;\n }\n },\n legendLeftAxisHint: {\n get: function() {\n return legendLeftAxisHint;\n }, set: function(_) {\n legendLeftAxisHint = _;\n }\n },\n legendRightAxisHint: {\n get: function() {\n return legendRightAxisHint;\n }, set: function(_) {\n legendRightAxisHint = _;\n }\n },\n\n // options that require extra logic in the setter\n margin: {\n get: function() {\n return margin;\n }, set: function(_) {\n if (_.top !== undefined) {\n margin.top = _.top;\n marginTop = _.top;\n }\n margin.right = _.right !== undefined ? _.right : margin.right;\n margin.bottom = _.bottom !== undefined ? _.bottom : margin.bottom;\n margin.left = _.left !== undefined ? _.left : margin.left;\n }\n },\n focusMargin: {\n get: function() {\n return margin2;\n }, set: function(_) {\n margin2.top = _.top !== undefined ? _.top : margin2.top;\n margin2.right = _.right !== undefined ? _.right : margin2.right;\n margin2.bottom = _.bottom !== undefined ? _.bottom : margin2.bottom;\n margin2.left = _.left !== undefined ? _.left : margin2.left;\n }\n },\n duration: {\n get: function() {\n return transitionDuration;\n }, set: function(_) {\n transitionDuration = _;\n }\n },\n color: {\n get: function() {\n return color;\n }, set: function(_) {\n color = nv.utils.getColor(_);\n legend.color(color);\n }\n },\n x: {\n get: function() {\n return getX;\n }, set: function(_) {\n getX = _;\n lines.x(_);\n lines2.x(_);\n bars.x(_);\n bars2.x(_);\n }\n },\n y: {\n get: function() {\n return getY;\n }, set: function(_) {\n getY = _;\n lines.y(_);\n lines2.y(_);\n bars.y(_);\n bars2.y(_);\n }\n },\n switchYAxisOrder: {\n get: function() {\n return switchYAxisOrder;\n }, set: function(_) {\n // Switch the tick format for the yAxis\n if (switchYAxisOrder !== _) {\n var y1 = y1Axis;\n y1Axis = y2Axis;\n y2Axis = y1;\n\n var y3 = y3Axis;\n y3Axis = y4Axis;\n y4Axis = y3;\n }\n switchYAxisOrder = _;\n\n y1Axis.orient('left');\n y2Axis.orient('right');\n y3Axis.orient('left');\n y4Axis.orient('right');\n }\n }\n });\n\n nv.utils.inheritOptions(chart, lines);\n nv.utils.initOptions(chart);\n\n return chart;\n };\n\n nv.models.multiBar = function() {\n 'use strict';\n\n //============================================================\n // Public Variables with Default Settings\n //------------------------------------------------------------\n\n var margin = {top: 0, right: 0, bottom: 0, left: 0}\n ,\n width = 960\n ,\n height = 500\n ,\n x = d3.scale.ordinal()\n ,\n y = d3.scale.linear()\n ,\n id = Math.floor(Math.random() * 10000) //Create semi-unique ID in case user doesn't select one\n ,\n container = null\n ,\n getX = function(d) {\n return d.x;\n }\n ,\n getY = function(d) {\n return d.y;\n }\n ,\n forceY = [0] // 0 is forced by default.. this makes sense for the majority of bar graphs... user can always do\n // chart.forceY([]) to remove\n ,\n clipEdge = true\n ,\n stacked = false\n ,\n stackOffset = 'zero' // options include 'silhouette', 'wiggle', 'expand', 'zero', or a custom function\n ,\n color = nv.utils.defaultColor()\n ,\n hideable = false\n ,\n barColor = null // adding the ability to set the color for each rather than the whole group\n ,\n disabled // used in conjunction with barColor to communicate from multiBarHorizontalChart what series are disabled\n ,\n duration = 500\n ,\n xDomain\n ,\n yDomain\n ,\n xRange\n ,\n yRange\n ,\n groupSpacing = 0.1\n ,\n fillOpacity = 0.75\n ,\n dispatch = d3.dispatch('chartClick', 'elementClick', 'elementDblClick', 'elementMouseover', 'elementMouseout',\n 'elementMousemove', 'renderEnd')\n ;\n\n //============================================================\n // Private Variables\n //------------------------------------------------------------\n\n var x0, y0 //used to store previous scales\n , renderWatch = nv.utils.renderWatch(dispatch, duration)\n ;\n\n var last_datalength = 0;\n\n function chart(selection) {\n renderWatch.reset();\n selection.each(function(data) {\n var availableWidth = width - margin.left - margin.right,\n availableHeight = height - margin.top - margin.bottom;\n\n container = d3.select(this);\n nv.utils.initSVG(container);\n var nonStackableCount = 0;\n // This function defines the requirements for render complete\n var endFn = function(d, i) {\n if (d.series === data.length - 1 && i === data[0].values.length - 1) {\n return true;\n }\n return false;\n };\n\n if (hideable && data.length) {\n hideable = [{\n values: data[0].values.map(function(d) {\n return {\n x: d.x,\n y: 0,\n series: d.series,\n size: 0.01\n };\n }\n )\n }];\n }\n\n if (stacked) {\n var parsed = d3.layout.stack()\n .offset(stackOffset)\n .values(function(d) {\n return d.values;\n })\n .y(getY)\n (!data.length && hideable ? hideable : data);\n\n parsed.forEach(function(series, i) {\n // if series is non-stackable, use un-parsed data\n if (series.nonStackable) {\n data[i].nonStackableSeries = nonStackableCount++;\n parsed[i] = data[i];\n } else {\n // don't stack this seires on top of the nonStackable seriees\n if (i > 0 && parsed[i - 1].nonStackable) {\n parsed[i].values.map(function(d, j) {\n d.y0 -= parsed[i - 1].values[j].y;\n d.y1 = d.y0 + d.y;\n });\n }\n }\n });\n data = parsed;\n }\n //add series index and key to each data point for reference\n data.forEach(function(series, i) {\n series.values.forEach(function(point) {\n point.series = i;\n point.key = series.key;\n });\n });\n\n // HACK for negative value stacking\n if (stacked && data.length > 0) {\n data[0].values.map(function(d, i) {\n var posBase = 0, negBase = 0;\n data.map(function(d, idx) {\n if (!data[idx].nonStackable) {\n var f = d.values[i];\n f.size = Math.abs(f.y);\n if (f.y < 0) {\n f.y1 = negBase;\n negBase = negBase - f.size;\n } else {\n f.y1 = f.size + posBase;\n posBase = posBase + f.size;\n }\n }\n\n });\n });\n }\n // Setup Scales\n // remap and flatten the data for use in calculating the scales' domains\n var seriesData = (xDomain && yDomain) ? [] : // if we know xDomain and yDomain, no need to calculate\n data.map(function(d, idx) {\n return d.values.map(function(d, i) {\n return {x: getX(d, i), y: getY(d, i), y0: d.y0, y1: d.y1, idx: idx};\n });\n });\n\n x.domain(xDomain || d3.merge(seriesData).map(function(d) {\n return d.x;\n }))\n .rangeBands(xRange || [0, availableWidth], groupSpacing);\n\n y.domain(yDomain || d3.extent(d3.merge(seriesData).map(function(d) {\n var domain = d.y;\n // increase the domain range if this series is stackable\n if (stacked && !data[d.idx].nonStackable) {\n if (d.y > 0) {\n domain = d.y1;\n } else {\n domain = d.y1 + d.y;\n }\n }\n return domain;\n }).concat(forceY)))\n .range(yRange || [availableHeight, 0]);\n\n // If scale's domain don't have a range, slightly adjust to make one... so a chart can show a single data point\n if (x.domain()[0] === x.domain()[1]) {\n x.domain()[0] ?\n x.domain([x.domain()[0] - x.domain()[0] * 0.01, x.domain()[1] + x.domain()[1] * 0.01])\n : x.domain([-1, 1]);\n }\n\n if (y.domain()[0] === y.domain()[1]) {\n y.domain()[0] ?\n y.domain([y.domain()[0] + y.domain()[0] * 0.01, y.domain()[1] - y.domain()[1] * 0.01])\n : y.domain([-1, 1]);\n }\n\n x0 = x0 || x;\n y0 = y0 || y;\n\n // Setup containers and skeleton of chart\n var wrap = container.selectAll('g.nv-wrap.nv-multibar').data([data]);\n var wrapEnter = wrap.enter().append('g').attr('class', 'nvd3 nv-wrap nv-multibar');\n var defsEnter = wrapEnter.append('defs');\n var gEnter = wrapEnter.append('g');\n var g = wrap.select('g');\n\n gEnter.append('g').attr('class', 'nv-groups');\n wrap.attr('transform', 'translate(' + margin.left + ',' + margin.top + ')');\n\n defsEnter.append('clipPath')\n .attr('id', 'nv-edge-clip-' + id)\n .append('rect');\n wrap.select('#nv-edge-clip-' + id + ' rect')\n .attr('width', availableWidth)\n .attr('height', availableHeight);\n\n g.attr('clip-path', clipEdge ? 'url(#nv-edge-clip-' + id + ')' : '');\n\n var groups = wrap.select('.nv-groups').selectAll('.nv-group')\n .data(function(d) {\n return d;\n }, function(d, i) {\n return i;\n });\n groups.enter().append('g')\n .style('stroke-opacity', 1e-6)\n .style('fill-opacity', 1e-6);\n\n var exitTransition = renderWatch\n .transition(groups.exit().selectAll('rect.nv-bar'), 'multibarExit', Math.min(100, duration))\n .attr('y', function(d, i, j) {\n var yVal = y0(0) || 0;\n if (stacked) {\n if (data[d.series] && !data[d.series].nonStackable) {\n yVal = y0(d.y0);\n }\n }\n return yVal;\n })\n .attr('height', 0)\n .remove();\n if (exitTransition.delay) {\n exitTransition.delay(function(d, i) {\n var delay = i * (duration / (last_datalength + 1)) - i;\n return delay;\n });\n }\n groups\n .attr('class', function(d, i) {\n return 'nv-group nv-series-' + i;\n })\n .classed('hover', function(d) {\n return d.hover;\n })\n .style('fill', function(d, i) {\n return color(d, i);\n })\n .style('stroke', function(d, i) {\n return color(d, i);\n });\n groups\n .style('stroke-opacity', 1)\n .style('fill-opacity', fillOpacity);\n\n var bars = groups.selectAll('rect.nv-bar')\n .data(function(d) {\n return (hideable && !data.length) ? hideable.values : d.values;\n });\n bars.exit().remove();\n\n var barsEnter = bars.enter().append('rect')\n .attr('class', function(d, i) {\n return getY(d, i) < 0 ? 'nv-bar negative' : 'nv-bar positive';\n })\n .attr('x', function(d, i, j) {\n return stacked && !data[j].nonStackable ? 0 : (j * x.rangeBand() / data.length);\n })\n .attr('y', function(d, i, j) {\n return y0(stacked && !data[j].nonStackable ? d.y0 : 0) || 0;\n })\n .attr('height', 0)\n .attr('width', function(d, i, j) {\n return x.rangeBand() / (stacked && !data[j].nonStackable ? 1 : data.length);\n })\n .attr('transform', function(d, i) {\n return 'translate(' + x(getX(d, i)) + ',0)';\n })\n ;\n bars\n .style('fill', function(d, i, j) {\n return color(d, j, i);\n })\n .style('stroke', function(d, i, j) {\n return color(d, j, i);\n })\n .on('mouseover', function(d, i, j) {\n d3.select(this).classed('hover', true);\n dispatch.elementMouseover({\n data: d,\n index: i,\n series: data[j],\n color: d3.select(this).style('fill')\n });\n })\n .on('mouseout', function(d, i, j) {\n d3.select(this).classed('hover', false);\n dispatch.elementMouseout({\n data: d,\n index: i,\n series: data[j],\n color: d3.select(this).style('fill')\n });\n })\n .on('mousemove', function(d, i, j) {\n dispatch.elementMousemove({\n data: d,\n index: i,\n series: data[j],\n color: d3.select(this).style('fill')\n });\n })\n .on('click', function(d, i, j) {\n var element = this;\n dispatch.elementClick({\n data: d,\n index: i,\n series: data[j],\n color: d3.select(this).style('fill'),\n event: d3.event,\n element: element\n });\n d3.event.stopPropagation();\n })\n .on('dblclick', function(d, i, j) {\n dispatch.elementDblClick({\n data: d,\n index: i,\n series: data[j],\n color: d3.select(this).style('fill')\n });\n d3.event.stopPropagation();\n });\n bars\n .attr('class', function(d, i) {\n return getY(d, i) < 0 ? 'nv-bar negative' : 'nv-bar positive';\n })\n .attr('transform', function(d, i) {\n return 'translate(' + x(getX(d, i)) + ',0)';\n });\n\n if (barColor) {\n if (!disabled) {\n disabled = data.map(function() {\n return true;\n });\n }\n bars\n .style('fill', function(d, i, j) {\n return d3.rgb(barColor(d, i)).darker(disabled.map(function(d, i) {\n return i;\n }).filter(function(d, i) {\n return !disabled[i];\n })[j]).toString();\n })\n .style('stroke', function(d, i, j) {\n return d3.rgb(barColor(d, i)).darker(disabled.map(function(d, i) {\n return i;\n }).filter(function(d, i) {\n return !disabled[i];\n })[j]).toString();\n });\n }\n\n var barSelection =\n bars.watchTransition(renderWatch, 'multibar', Math.min(250, duration))\n .delay(function(d, i) {\n return i * duration / data[0].values.length;\n });\n if (stacked) {\n barSelection\n .attr('y', function(d, i, j) {\n var yVal = 0;\n // if stackable, stack it on top of the previous series\n if (!data[j].nonStackable) {\n yVal = y(d.y1);\n } else {\n if (getY(d, i) < 0) {\n yVal = y(0);\n } else {\n if (y(0) - y(getY(d, i)) < -1) {\n yVal = y(0) - 1;\n } else {\n yVal = y(getY(d, i)) || 0;\n }\n }\n }\n return yVal;\n })\n .attr('height', function(d, i, j) {\n if (!data[j].nonStackable) {\n return Math.max(Math.abs(y(d.y + d.y0) - y(d.y0)), 0);\n } else {\n return Math.max(Math.abs(y(getY(d, i)) - y(0)), 0) || 0;\n }\n })\n .attr('x', function(d, i, j) {\n var width = 0;\n if (data[j].nonStackable) {\n width = d.series * x.rangeBand() / data.length;\n if (data.length !== nonStackableCount) {\n width = data[j].nonStackableSeries * x.rangeBand() / (nonStackableCount * 2);\n }\n }\n return width;\n })\n .attr('width', function(d, i, j) {\n if (!data[j].nonStackable) {\n return x.rangeBand();\n } else {\n // if all series are nonStacable, take the full width\n var width = (x.rangeBand() / nonStackableCount);\n // otherwise, nonStackable graph will be only taking the half-width\n // of the x rangeBand\n if (data.length !== nonStackableCount) {\n width = x.rangeBand() / (nonStackableCount * 2);\n }\n return width;\n }\n });\n } else {\n barSelection\n .attr('x', function(d, i) {\n return d.series * x.rangeBand() / data.length;\n })\n .attr('width', x.rangeBand() / data.length)\n .attr('y', function(d, i) {\n return getY(d, i) < 0 ?\n y(0) :\n y(0) - y(getY(d, i)) < 1 ?\n y(0) - 1 :\n y(getY(d, i)) || 0;\n })\n .attr('height', function(d, i) {\n return Math.max(Math.abs(y(getY(d, i)) - y(0)), 1) || 0;\n });\n }\n\n //store old scales for use in transitions on update\n x0 = x.copy();\n y0 = y.copy();\n\n // keep track of the last data value length for transition calculations\n if (data[0] && data[0].values) {\n last_datalength = data[0].values.length;\n }\n\n });\n\n renderWatch.renderEnd('multibar immediate');\n\n return chart;\n }\n\n //============================================================\n // Expose Public Variables\n //------------------------------------------------------------\n\n chart.dispatch = dispatch;\n\n chart.options = nv.utils.optionsFunc.bind(chart);\n\n chart._options = Object.create({}, {\n // simple options, just get/set the necessary values\n width: {\n get: function() {\n return width;\n }, set: function(_) {\n width = _;\n }\n },\n height: {\n get: function() {\n return height;\n }, set: function(_) {\n height = _;\n }\n },\n x: {\n get: function() {\n return getX;\n }, set: function(_) {\n getX = _;\n }\n },\n y: {\n get: function() {\n return getY;\n }, set: function(_) {\n getY = _;\n }\n },\n xScale: {\n get: function() {\n return x;\n }, set: function(_) {\n x = _;\n }\n },\n yScale: {\n get: function() {\n return y;\n }, set: function(_) {\n y = _;\n }\n },\n xDomain: {\n get: function() {\n return xDomain;\n }, set: function(_) {\n xDomain = _;\n }\n },\n yDomain: {\n get: function() {\n return yDomain;\n }, set: function(_) {\n yDomain = _;\n }\n },\n xRange: {\n get: function() {\n return xRange;\n }, set: function(_) {\n xRange = _;\n }\n },\n yRange: {\n get: function() {\n return yRange;\n }, set: function(_) {\n yRange = _;\n }\n },\n forceY: {\n get: function() {\n return forceY;\n }, set: function(_) {\n forceY = _;\n }\n },\n stacked: {\n get: function() {\n return stacked;\n }, set: function(_) {\n stacked = _;\n }\n },\n stackOffset: {\n get: function() {\n return stackOffset;\n }, set: function(_) {\n stackOffset = _;\n }\n },\n clipEdge: {\n get: function() {\n return clipEdge;\n }, set: function(_) {\n clipEdge = _;\n }\n },\n disabled: {\n get: function() {\n return disabled;\n }, set: function(_) {\n disabled = _;\n }\n },\n id: {\n get: function() {\n return id;\n }, set: function(_) {\n id = _;\n }\n },\n hideable: {\n get: function() {\n return hideable;\n }, set: function(_) {\n hideable = _;\n }\n },\n groupSpacing: {\n get: function() {\n return groupSpacing;\n }, set: function(_) {\n groupSpacing = _;\n }\n },\n fillOpacity: {\n get: function() {\n return fillOpacity;\n }, set: function(_) {\n fillOpacity = _;\n }\n },\n\n // options that require extra logic in the setter\n margin: {\n get: function() {\n return margin;\n }, set: function(_) {\n margin.top = _.top !== undefined ? _.top : margin.top;\n margin.right = _.right !== undefined ? _.right : margin.right;\n margin.bottom = _.bottom !== undefined ? _.bottom : margin.bottom;\n margin.left = _.left !== undefined ? _.left : margin.left;\n }\n },\n duration: {\n get: function() {\n return duration;\n }, set: function(_) {\n duration = _;\n renderWatch.reset(duration);\n }\n },\n color: {\n get: function() {\n return color;\n }, set: function(_) {\n color = nv.utils.getColor(_);\n }\n },\n barColor: {\n get: function() {\n return barColor;\n }, set: function(_) {\n barColor = _ ? nv.utils.getColor(_) : null;\n }\n }\n });\n\n nv.utils.initOptions(chart);\n\n return chart;\n };\n nv.models.multiBarChart = function() {\n 'use strict';\n\n //============================================================\n // Public Variables with Default Settings\n //------------------------------------------------------------\n\n var multibar = nv.models.multiBar()\n , xAxis = nv.models.axis()\n , yAxis = nv.models.axis()\n , interactiveLayer = nv.interactiveGuideline()\n , legend = nv.models.legend()\n , controls = nv.models.legend()\n , tooltip = nv.models.tooltip()\n ;\n\n var margin = {top: 30, right: 20, bottom: 50, left: 60}\n , marginTop = null\n , width = null\n , height = null\n , color = nv.utils.defaultColor()\n , showControls = true\n , controlLabels = {}\n , showLegend = true\n , legendPosition = null\n , showXAxis = true\n , showYAxis = true\n , rightAlignYAxis = false\n , reduceXTicks = true // if false a tick will show for every data point\n , staggerLabels = false\n , wrapLabels = false\n , rotateLabels = 0\n , x //can be accessed via chart.xScale()\n , y //can be accessed via chart.yScale()\n , state = nv.utils.state()\n , defaultState = null\n , noData = null\n , dispatch = d3.dispatch('stateChange', 'changeState', 'renderEnd')\n , controlWidth = function() {\n return showControls ? 180 : 0;\n }\n , duration = 250\n , useInteractiveGuideline = false\n ;\n\n state.stacked = false; // DEPRECATED Maintained for backward compatibility\n\n multibar.stacked(false);\n xAxis\n .orient('bottom')\n .tickPadding(7)\n .showMaxMin(false)\n .tickFormat(function(d) {\n return d;\n })\n ;\n yAxis\n .orient((rightAlignYAxis) ? 'right' : 'left')\n .tickFormat(d3.format(',.1f'))\n ;\n\n tooltip\n .duration(0)\n .valueFormatter(function(d, i) {\n return yAxis.tickFormat()(d, i);\n })\n .headerFormatter(function(d, i) {\n return xAxis.tickFormat()(d, i);\n });\n\n interactiveLayer.tooltip\n .valueFormatter(function(d, i) {\n return d == null ? 'N/A' : yAxis.tickFormat()(d, i);\n })\n .headerFormatter(function(d, i) {\n return xAxis.tickFormat()(d, i);\n });\n\n interactiveLayer.tooltip\n .valueFormatter(function(d, i) {\n return d == null ? 'N/A' : yAxis.tickFormat()(d, i);\n })\n .headerFormatter(function(d, i) {\n return xAxis.tickFormat()(d, i);\n });\n\n interactiveLayer.tooltip\n .duration(0)\n .valueFormatter(function(d, i) {\n return yAxis.tickFormat()(d, i);\n })\n .headerFormatter(function(d, i) {\n return xAxis.tickFormat()(d, i);\n });\n\n controls.updateState(false);\n\n //============================================================\n // Private Variables\n //------------------------------------------------------------\n\n var renderWatch = nv.utils.renderWatch(dispatch);\n var stacked = false;\n\n var stateGetter = function(data) {\n return function() {\n return {\n active: data.map(function(d) {\n return !d.disabled;\n }),\n stacked: stacked\n };\n };\n };\n\n var stateSetter = function(data) {\n return function(state) {\n if (state.stacked !== undefined) {\n stacked = state.stacked;\n }\n if (state.active !== undefined) {\n data.forEach(function(series, i) {\n series.disabled = !state.active[i];\n });\n }\n };\n };\n\n function chart(selection) {\n renderWatch.reset();\n renderWatch.models(multibar);\n if (showXAxis) renderWatch.models(xAxis);\n if (showYAxis) renderWatch.models(yAxis);\n\n selection.each(function(data) {\n var container = d3.select(this),\n that = this;\n nv.utils.initSVG(container);\n var availableWidth = nv.utils.availableWidth(width, container, margin),\n availableHeight = nv.utils.availableHeight(height, container, margin);\n\n chart.update = function() {\n if (duration === 0) {\n container.call(chart);\n } else {\n container.transition()\n .duration(duration)\n .call(chart);\n }\n };\n chart.container = this;\n\n state\n .setter(stateSetter(data), chart.update)\n .getter(stateGetter(data))\n .update();\n\n // DEPRECATED set state.disableddisabled\n state.disabled = data.map(function(d) {\n return !!d.disabled;\n });\n\n if (!defaultState) {\n var key;\n defaultState = {};\n for (key in state) {\n if (state[key] instanceof Array) {\n defaultState[key] = state[key].slice(0);\n } else {\n defaultState[key] = state[key];\n }\n }\n }\n\n // Display noData message if there's nothing to show.\n if (!data || !data.length || !data.filter(function(d) {\n return d.values.length;\n }).length) {\n nv.utils.noData(chart, container);\n return chart;\n } else {\n container.selectAll('.nv-noData').remove();\n }\n\n // Setup Scales\n x = multibar.xScale();\n y = multibar.yScale();\n\n // Setup containers and skeleton of chart\n var wrap = container.selectAll('g.nv-wrap.nv-multiBarWithLegend').data([data]);\n var gEnter = wrap.enter().append('g').attr('class', 'nvd3 nv-wrap nv-multiBarWithLegend').append('g');\n var g = wrap.select('g');\n\n gEnter.append('g').attr('class', 'nv-x nv-axis');\n gEnter.append('g').attr('class', 'nv-y nv-axis');\n gEnter.append('g').attr('class', 'nv-barsWrap');\n gEnter.append('g').attr('class', 'nv-legendWrap');\n gEnter.append('g').attr('class', 'nv-controlsWrap');\n gEnter.append('g').attr('class', 'nv-interactive');\n\n // Legend\n if (!showLegend) {\n g.select('.nv-legendWrap').selectAll('*').remove();\n } else {\n if (legendPosition === 'bottom') {\n legend.width(availableWidth - margin.right);\n\n g.select('.nv-legendWrap')\n .datum(data)\n .call(legend);\n\n margin.bottom = xAxis.height() + legend.height();\n availableHeight = nv.utils.availableHeight(height, container, margin);\n g.select('.nv-legendWrap')\n .attr('transform', 'translate(0,' + (availableHeight + xAxis.height()) + ')');\n } else {\n legend.width(availableWidth - controlWidth());\n\n g.select('.nv-legendWrap')\n .datum(data)\n .call(legend);\n\n if (!marginTop && legend.height() !== margin.top) {\n margin.top = legend.height();\n availableHeight = nv.utils.availableHeight(height, container, margin);\n }\n\n g.select('.nv-legendWrap')\n .attr('transform', 'translate(' + controlWidth() + ',' + (-margin.top) + ')');\n }\n }\n\n // Controls\n if (!showControls) {\n g.select('.nv-controlsWrap').selectAll('*').remove();\n } else {\n var controlsData = [\n {key: controlLabels.grouped || 'Grouped', disabled: multibar.stacked()},\n {key: controlLabels.stacked || 'Stacked', disabled: !multibar.stacked()}\n ];\n\n controls.width(controlWidth()).color(['#444', '#444', '#444']);\n g.select('.nv-controlsWrap')\n .datum(controlsData)\n .attr('transform', 'translate(0,' + (-margin.top) + ')')\n .call(controls);\n }\n\n wrap.attr('transform', 'translate(' + margin.left + ',' + margin.top + ')');\n if (rightAlignYAxis) {\n g.select('.nv-y.nv-axis')\n .attr('transform', 'translate(' + availableWidth + ',0)');\n }\n\n // Main Chart Component(s)\n multibar\n .disabled(data.map(function(series) {\n return series.disabled;\n }))\n .width(availableWidth)\n .height(availableHeight)\n .color(data.map(function(d, i) {\n return d.color || color(d, i);\n }).filter(function(d, i) {\n return !data[i].disabled;\n }));\n\n\n var barsWrap = g.select('.nv-barsWrap')\n .datum(data.filter(function(d) {\n return !d.disabled;\n }));\n\n barsWrap.call(multibar);\n\n // Setup Axes\n if (showXAxis) {\n xAxis\n .scale(x)\n ._ticks(nv.utils.calcTicksX(availableWidth / 100, data))\n .tickSize(-availableHeight, 0);\n\n g.select('.nv-x.nv-axis')\n .attr('transform', 'translate(0,' + y.range()[0] + ')');\n g.select('.nv-x.nv-axis')\n .call(xAxis);\n\n var xTicks = g.select('.nv-x.nv-axis > g').selectAll('g');\n\n xTicks\n .selectAll('line, text')\n .style('opacity', 1);\n\n if (staggerLabels) {\n var getTranslate = function(x, y) {\n return 'translate(' + x + ',' + y + ')';\n };\n\n var staggerUp = 5, staggerDown = 17; //pixels to stagger by\n // Issue #140\n xTicks\n .selectAll('text')\n .attr('transform', function(d, i, j) {\n return getTranslate(0, (j % 2 == 0 ? staggerUp : staggerDown));\n });\n\n var totalInBetweenTicks = d3.selectAll('.nv-x.nv-axis .nv-wrap g g text')[0].length;\n g.selectAll('.nv-x.nv-axis .nv-axisMaxMin text')\n .attr('transform', function(d, i) {\n return getTranslate(0, (i === 0 || totalInBetweenTicks % 2 !== 0) ? staggerDown : staggerUp);\n });\n }\n\n if (wrapLabels) {\n g.selectAll('.tick text')\n .call(nv.utils.wrapTicks, chart.xAxis.rangeBand());\n }\n\n if (reduceXTicks) {\n xTicks\n .filter(function(d, i) {\n return i % Math.ceil(data[0].values.length / (availableWidth / 100)) !== 0;\n })\n .selectAll('text, line')\n .style('opacity', 0);\n }\n\n if (rotateLabels) {\n xTicks\n .selectAll('.tick text')\n .attr('transform', 'rotate(' + rotateLabels + ' 0,0)')\n .style('text-anchor', rotateLabels > 0 ? 'start' : 'end');\n }\n\n g.select('.nv-x.nv-axis').selectAll('g.nv-axisMaxMin text')\n .style('opacity', 1);\n }\n\n if (showYAxis) {\n yAxis\n .scale(y)\n ._ticks(nv.utils.calcTicksY(availableHeight / 36, data))\n .tickSize(-availableWidth, 0);\n\n g.select('.nv-y.nv-axis')\n .call(yAxis);\n }\n\n //Set up interactive layer\n if (useInteractiveGuideline) {\n interactiveLayer\n .width(availableWidth)\n .height(availableHeight)\n .margin({left: margin.left, top: margin.top})\n .svgContainer(container)\n .xScale(x);\n wrap.select('.nv-interactive').call(interactiveLayer);\n }\n\n //============================================================\n // Event Handling/Dispatching (in chart's scope)\n //------------------------------------------------------------\n\n legend.dispatch.on('stateChange', function(newState) {\n for (var key in newState) {\n state[key] = newState[key];\n }\n dispatch.stateChange(state);\n chart.update();\n });\n\n controls.dispatch.on('legendClick', function(d, i) {\n if (!d.disabled) return;\n controlsData = controlsData.map(function(s) {\n s.disabled = true;\n return s;\n });\n d.disabled = false;\n\n switch (d.key) {\n case 'Grouped':\n case controlLabels.grouped:\n multibar.stacked(false);\n break;\n case 'Stacked':\n case controlLabels.stacked:\n multibar.stacked(true);\n break;\n }\n\n state.stacked = multibar.stacked();\n dispatch.stateChange(state);\n chart.update();\n });\n\n // Update chart from a state object passed to event handler\n dispatch.on('changeState', function(e) {\n if (typeof e.disabled !== 'undefined') {\n data.forEach(function(series, i) {\n series.disabled = e.disabled[i];\n });\n state.disabled = e.disabled;\n }\n if (typeof e.stacked !== 'undefined') {\n multibar.stacked(e.stacked);\n state.stacked = e.stacked;\n stacked = e.stacked;\n }\n chart.update();\n });\n\n if (useInteractiveGuideline) {\n interactiveLayer.dispatch.on('elementMousemove', function(e) {\n if (e.pointXValue == undefined) return;\n\n var singlePoint, pointIndex, pointXLocation, xValue, allData = [];\n data\n .filter(function(series, i) {\n series.seriesIndex = i;\n return !series.disabled;\n })\n .forEach(function(series, i) {\n pointIndex = x.domain().indexOf(e.pointXValue);\n\n var point = series.values[pointIndex];\n if (point === undefined) return;\n\n xValue = point.x;\n if (singlePoint === undefined) singlePoint = point;\n if (pointXLocation === undefined) pointXLocation = e.mouseX;\n allData.push({\n key: series.key,\n value: chart.y()(point, pointIndex),\n color: color(series, series.seriesIndex),\n data: series.values[pointIndex]\n });\n });\n\n interactiveLayer.tooltip\n .data({\n value: xValue,\n index: pointIndex,\n series: allData\n })();\n\n interactiveLayer.renderGuideLine(pointXLocation);\n });\n\n interactiveLayer.dispatch.on('elementMouseout', function(e) {\n interactiveLayer.tooltip.hidden(true);\n });\n } else {\n multibar.dispatch.on('elementMouseover.tooltip', function(evt) {\n evt.value = chart.x()(evt.data);\n evt['series'] = {\n key: evt.data.key,\n value: chart.y()(evt.data),\n color: evt.color\n };\n tooltip.data(evt).hidden(false);\n });\n\n multibar.dispatch.on('elementMouseout.tooltip', function(evt) {\n tooltip.hidden(true);\n });\n\n multibar.dispatch.on('elementMousemove.tooltip', function(evt) {\n tooltip();\n });\n }\n });\n\n renderWatch.renderEnd('multibarchart immediate');\n return chart;\n }\n\n //============================================================\n // Expose Public Variables\n //------------------------------------------------------------\n\n // expose chart's sub-components\n chart.dispatch = dispatch;\n chart.multibar = multibar;\n chart.legend = legend;\n chart.controls = controls;\n chart.xAxis = xAxis;\n chart.yAxis = yAxis;\n chart.state = state;\n chart.tooltip = tooltip;\n chart.interactiveLayer = interactiveLayer;\n\n chart.options = nv.utils.optionsFunc.bind(chart);\n\n chart._options = Object.create({}, {\n // simple options, just get/set the necessary values\n width: {\n get: function() {\n return width;\n }, set: function(_) {\n width = _;\n }\n },\n height: {\n get: function() {\n return height;\n }, set: function(_) {\n height = _;\n }\n },\n showLegend: {\n get: function() {\n return showLegend;\n }, set: function(_) {\n showLegend = _;\n }\n },\n legendPosition: {\n get: function() {\n return legendPosition;\n }, set: function(_) {\n legendPosition = _;\n }\n },\n showControls: {\n get: function() {\n return showControls;\n }, set: function(_) {\n showControls = _;\n }\n },\n controlLabels: {\n get: function() {\n return controlLabels;\n }, set: function(_) {\n controlLabels = _;\n }\n },\n showXAxis: {\n get: function() {\n return showXAxis;\n }, set: function(_) {\n showXAxis = _;\n }\n },\n showYAxis: {\n get: function() {\n return showYAxis;\n }, set: function(_) {\n showYAxis = _;\n }\n },\n defaultState: {\n get: function() {\n return defaultState;\n }, set: function(_) {\n defaultState = _;\n }\n },\n noData: {\n get: function() {\n return noData;\n }, set: function(_) {\n noData = _;\n }\n },\n reduceXTicks: {\n get: function() {\n return reduceXTicks;\n }, set: function(_) {\n reduceXTicks = _;\n }\n },\n rotateLabels: {\n get: function() {\n return rotateLabels;\n }, set: function(_) {\n rotateLabels = _;\n }\n },\n staggerLabels: {\n get: function() {\n return staggerLabels;\n }, set: function(_) {\n staggerLabels = _;\n }\n },\n wrapLabels: {\n get: function() {\n return wrapLabels;\n }, set: function(_) {\n wrapLabels = !!_;\n }\n },\n\n // options that require extra logic in the setter\n margin: {\n get: function() {\n return margin;\n }, set: function(_) {\n if (_.top !== undefined) {\n margin.top = _.top;\n marginTop = _.top;\n }\n margin.right = _.right !== undefined ? _.right : margin.right;\n margin.bottom = _.bottom !== undefined ? _.bottom : margin.bottom;\n margin.left = _.left !== undefined ? _.left : margin.left;\n }\n },\n duration: {\n get: function() {\n return duration;\n }, set: function(_) {\n duration = _;\n multibar.duration(duration);\n xAxis.duration(duration);\n yAxis.duration(duration);\n renderWatch.reset(duration);\n }\n },\n color: {\n get: function() {\n return color;\n }, set: function(_) {\n color = nv.utils.getColor(_);\n legend.color(color);\n }\n },\n rightAlignYAxis: {\n get: function() {\n return rightAlignYAxis;\n }, set: function(_) {\n rightAlignYAxis = _;\n yAxis.orient(rightAlignYAxis ? 'right' : 'left');\n }\n },\n useInteractiveGuideline: {\n get: function() {\n return useInteractiveGuideline;\n }, set: function(_) {\n useInteractiveGuideline = _;\n }\n },\n barColor: {\n get: function() {\n return multibar.barColor;\n }, set: function(_) {\n multibar.barColor(_);\n legend.color(function(d, i) {\n return d3.rgb('#ccc').darker(i * 1.5).toString();\n });\n }\n }\n });\n\n nv.utils.inheritOptions(chart, multibar);\n nv.utils.initOptions(chart);\n\n return chart;\n };\n\n nv.models.multiBarHorizontal = function() {\n 'use strict';\n\n //============================================================\n // Public Variables with Default Settings\n //------------------------------------------------------------\n\n var margin = {top: 0, right: 0, bottom: 0, left: 0}\n ,\n width = 960\n ,\n height = 500\n ,\n id = Math.floor(Math.random() * 10000) //Create semi-unique ID in case user doesn't select one\n ,\n container = null\n ,\n x = d3.scale.ordinal()\n ,\n y = d3.scale.linear()\n ,\n getX = function(d) {\n return d.x;\n }\n ,\n getY = function(d) {\n return d.y;\n }\n ,\n getYerr = function(d) {\n return d.yErr;\n }\n ,\n forceY = [0] // 0 is forced by default.. this makes sense for the majority of bar graphs... user can always do\n // chart.forceY([]) to remove\n ,\n color = nv.utils.defaultColor()\n ,\n barColor = null // adding the ability to set the color for each rather than the whole group\n ,\n disabled // used in conjunction with barColor to communicate from multiBarHorizontalChart what series are disabled\n ,\n stacked = false\n ,\n showValues = false\n ,\n showBarLabels = false\n ,\n valuePadding = 60\n ,\n groupSpacing = 0.1\n ,\n fillOpacity = 0.75\n ,\n valueFormat = d3.format(',.2f')\n ,\n delay = 1200\n ,\n xDomain\n ,\n yDomain\n ,\n xRange\n ,\n yRange\n ,\n duration = 250\n ,\n dispatch = d3.dispatch('chartClick', 'elementClick', 'elementDblClick', 'elementMouseover', 'elementMouseout',\n 'elementMousemove', 'renderEnd')\n ;\n\n //============================================================\n // Private Variables\n //------------------------------------------------------------\n\n var x0, y0; //used to store previous scales\n var renderWatch = nv.utils.renderWatch(dispatch, duration);\n\n function chart(selection) {\n renderWatch.reset();\n selection.each(function(data) {\n var availableWidth = width - margin.left - margin.right,\n availableHeight = height - margin.top - margin.bottom;\n\n container = d3.select(this);\n nv.utils.initSVG(container);\n\n if (stacked) {\n data = d3.layout.stack()\n .offset('zero')\n .values(function(d) {\n return d.values;\n })\n .y(getY)\n (data);\n }\n\n //add series index and key to each data point for reference\n data.forEach(function(series, i) {\n series.values.forEach(function(point) {\n point.series = i;\n point.key = series.key;\n });\n });\n\n // HACK for negative value stacking\n if (stacked) {\n data[0].values.map(function(d, i) {\n var posBase = 0, negBase = 0;\n data.map(function(d) {\n var f = d.values[i];\n f.size = Math.abs(f.y);\n if (f.y < 0) {\n f.y1 = negBase - f.size;\n negBase = negBase - f.size;\n } else {\n f.y1 = posBase;\n posBase = posBase + f.size;\n }\n });\n });\n }\n\n // Setup Scales\n // remap and flatten the data for use in calculating the scales' domains\n var seriesData = (xDomain && yDomain) ? [] : // if we know xDomain and yDomain, no need to calculate\n data.map(function(d) {\n return d.values.map(function(d, i) {\n return {x: getX(d, i), y: getY(d, i), y0: d.y0, y1: d.y1};\n });\n });\n\n x.domain(xDomain || d3.merge(seriesData).map(function(d) {\n return d.x;\n }))\n .rangeBands(xRange || [0, availableHeight], groupSpacing);\n\n y.domain(yDomain || d3.extent(d3.merge(seriesData).map(function(d) {\n return stacked ? (d.y > 0 ? d.y1 + d.y : d.y1) : d.y;\n }).concat(forceY)));\n\n if (showValues && !stacked) {\n y.range(yRange || [(y.domain()[0] < 0 ? valuePadding : 0),\n availableWidth - (y.domain()[1] > 0 ? valuePadding : 0)]);\n } else {\n y.range(yRange || [0, availableWidth]);\n }\n\n x0 = x0 || x;\n y0 = y0 || d3.scale.linear().domain(y.domain()).range([y(0), y(0)]);\n\n // Setup containers and skeleton of chart\n var wrap = d3.select(this).selectAll('g.nv-wrap.nv-multibarHorizontal').data([data]);\n var wrapEnter = wrap.enter().append('g').attr('class', 'nvd3 nv-wrap nv-multibarHorizontal');\n var defsEnter = wrapEnter.append('defs');\n var gEnter = wrapEnter.append('g');\n var g = wrap.select('g');\n\n gEnter.append('g').attr('class', 'nv-groups');\n wrap.attr('transform', 'translate(' + margin.left + ',' + margin.top + ')');\n\n var groups = wrap.select('.nv-groups').selectAll('.nv-group')\n .data(function(d) {\n return d;\n }, function(d, i) {\n return i;\n });\n groups.enter().append('g')\n .style('stroke-opacity', 1e-6)\n .style('fill-opacity', 1e-6);\n groups.exit().watchTransition(renderWatch, 'multibarhorizontal: exit groups')\n .style('stroke-opacity', 1e-6)\n .style('fill-opacity', 1e-6)\n .remove();\n groups\n .attr('class', function(d, i) {\n return 'nv-group nv-series-' + i;\n })\n .classed('hover', function(d) {\n return d.hover;\n })\n .style('fill', function(d, i) {\n return color(d, i);\n })\n .style('stroke', function(d, i) {\n return color(d, i);\n });\n groups.watchTransition(renderWatch, 'multibarhorizontal: groups')\n .style('stroke-opacity', 1)\n .style('fill-opacity', fillOpacity);\n\n var bars = groups.selectAll('g.nv-bar')\n .data(function(d) {\n return d.values;\n });\n bars.exit().remove();\n\n var barsEnter = bars.enter().append('g')\n .attr('transform', function(d, i, j) {\n return 'translate(' + y0(stacked ? d.y0 : 0) + ',' + (stacked ? 0 : (j * x.rangeBand() / data.length) + x(\n getX(d, i))) + ')';\n });\n\n barsEnter.append('rect')\n .attr('width', 0)\n .attr('height', x.rangeBand() / (stacked ? 1 : data.length));\n\n bars\n .on('mouseover', function(d, i) { //TODO: figure out why j works above, but not here\n d3.select(this).classed('hover', true);\n dispatch.elementMouseover({\n data: d,\n index: i,\n color: d3.select(this).style('fill')\n });\n })\n .on('mouseout', function(d, i) {\n d3.select(this).classed('hover', false);\n dispatch.elementMouseout({\n data: d,\n index: i,\n color: d3.select(this).style('fill')\n });\n })\n .on('mouseout', function(d, i) {\n dispatch.elementMouseout({\n data: d,\n index: i,\n color: d3.select(this).style('fill')\n });\n })\n .on('mousemove', function(d, i) {\n dispatch.elementMousemove({\n data: d,\n index: i,\n color: d3.select(this).style('fill')\n });\n })\n .on('click', function(d, i) {\n var element = this;\n dispatch.elementClick({\n data: d,\n index: i,\n color: d3.select(this).style('fill'),\n event: d3.event,\n element: element\n });\n d3.event.stopPropagation();\n })\n .on('dblclick', function(d, i) {\n dispatch.elementDblClick({\n data: d,\n index: i,\n color: d3.select(this).style('fill')\n });\n d3.event.stopPropagation();\n });\n\n if (getYerr(data[0], 0)) {\n barsEnter.append('polyline');\n\n bars.select('polyline')\n .attr('fill', 'none')\n .attr('points', function(d, i) {\n var xerr = getYerr(d, i)\n , mid = 0.8 * x.rangeBand() / ((stacked ? 1 : data.length) * 2);\n xerr = xerr.length ? xerr : [-Math.abs(xerr), Math.abs(xerr)];\n xerr = xerr.map(function(e) {\n return y(e + ((getY(d, i) < 0) ? 0 : getY(d, i))) - y(0);\n });\n var a = [[xerr[0], -mid], [xerr[0], mid], [xerr[0], 0], [xerr[1], 0], [xerr[1], -mid], [xerr[1], mid]];\n return a.map(function(path) {\n return path.join(',');\n }).join(' ');\n })\n .attr('transform', function(d, i) {\n var mid = x.rangeBand() / ((stacked ? 1 : data.length) * 2);\n return 'translate(0, ' + mid + ')';\n });\n }\n\n barsEnter.append('text');\n\n if (showValues && !stacked) {\n bars.select('text')\n .attr('text-anchor', function(d, i) {\n return getY(d, i) < 0 ? 'end' : 'start';\n })\n .attr('y', x.rangeBand() / (data.length * 2))\n .attr('dy', '.32em')\n .text(function(d, i) {\n var t = valueFormat(getY(d, i))\n , yerr = getYerr(d, i);\n if (yerr === undefined) {\n return t;\n }\n if (!yerr.length) {\n return t + '±' + valueFormat(Math.abs(yerr));\n }\n return t + '+' + valueFormat(Math.abs(yerr[1])) + '-' + valueFormat(Math.abs(yerr[0]));\n });\n bars.watchTransition(renderWatch, 'multibarhorizontal: bars')\n .select('text')\n .attr('x', function(d, i) {\n return getY(d, i) < 0 ? -4 : y(getY(d, i)) - y(0) + 4;\n });\n } else {\n bars.selectAll('text').text('');\n }\n\n if (showBarLabels && !stacked) {\n barsEnter.append('text').classed('nv-bar-label', true);\n bars.select('text.nv-bar-label')\n .attr('text-anchor', function(d, i) {\n return getY(d, i) < 0 ? 'start' : 'end';\n })\n .attr('y', x.rangeBand() / (data.length * 2))\n .attr('dy', '.32em')\n .text(function(d, i) {\n return getX(d, i);\n });\n bars.watchTransition(renderWatch, 'multibarhorizontal: bars')\n .select('text.nv-bar-label')\n .attr('x', function(d, i) {\n return getY(d, i) < 0 ? y(0) - y(getY(d, i)) + 4 : -4;\n });\n } else {\n bars.selectAll('text.nv-bar-label').text('');\n }\n\n bars\n .attr('class', function(d, i) {\n return getY(d, i) < 0 ? 'nv-bar negative' : 'nv-bar positive';\n });\n\n if (barColor) {\n if (!disabled) {\n disabled = data.map(function() {\n return true;\n });\n }\n bars\n .style('fill', function(d, i, j) {\n return d3.rgb(barColor(d, i)).darker(disabled.map(function(d, i) {\n return i;\n }).filter(function(d, i) {\n return !disabled[i];\n })[j]).toString();\n })\n .style('stroke', function(d, i, j) {\n return d3.rgb(barColor(d, i)).darker(disabled.map(function(d, i) {\n return i;\n }).filter(function(d, i) {\n return !disabled[i];\n })[j]).toString();\n });\n }\n\n if (stacked) {\n bars.watchTransition(renderWatch, 'multibarhorizontal: bars')\n .attr('transform', function(d, i) {\n return 'translate(' + y(d.y1) + ',' + x(getX(d, i)) + ')';\n })\n .select('rect')\n .attr('width', function(d, i) {\n return Math.abs(y(getY(d, i) + d.y0) - y(d.y0)) || 0;\n })\n .attr('height', x.rangeBand());\n } else {\n bars.watchTransition(renderWatch, 'multibarhorizontal: bars')\n .attr('transform', function(d, i) {\n //TODO: stacked must be all positive or all negative, not both?\n return 'translate(' +\n (getY(d, i) < 0 ? y(getY(d, i)) : y(0))\n + ',' +\n (d.series * x.rangeBand() / data.length\n +\n x(getX(d, i)))\n + ')';\n })\n .select('rect')\n .attr('height', x.rangeBand() / data.length)\n .attr('width', function(d, i) {\n return Math.max(Math.abs(y(getY(d, i)) - y(0)), 1) || 0;\n });\n }\n\n //store old scales for use in transitions on update\n x0 = x.copy();\n y0 = y.copy();\n\n });\n\n renderWatch.renderEnd('multibarHorizontal immediate');\n return chart;\n }\n\n //============================================================\n // Expose Public Variables\n //------------------------------------------------------------\n\n chart.dispatch = dispatch;\n\n chart.options = nv.utils.optionsFunc.bind(chart);\n\n chart._options = Object.create({}, {\n // simple options, just get/set the necessary values\n width: {\n get: function() {\n return width;\n }, set: function(_) {\n width = _;\n }\n },\n height: {\n get: function() {\n return height;\n }, set: function(_) {\n height = _;\n }\n },\n x: {\n get: function() {\n return getX;\n }, set: function(_) {\n getX = _;\n }\n },\n y: {\n get: function() {\n return getY;\n }, set: function(_) {\n getY = _;\n }\n },\n yErr: {\n get: function() {\n return getYerr;\n }, set: function(_) {\n getYerr = _;\n }\n },\n xScale: {\n get: function() {\n return x;\n }, set: function(_) {\n x = _;\n }\n },\n yScale: {\n get: function() {\n return y;\n }, set: function(_) {\n y = _;\n }\n },\n xDomain: {\n get: function() {\n return xDomain;\n }, set: function(_) {\n xDomain = _;\n }\n },\n yDomain: {\n get: function() {\n return yDomain;\n }, set: function(_) {\n yDomain = _;\n }\n },\n xRange: {\n get: function() {\n return xRange;\n }, set: function(_) {\n xRange = _;\n }\n },\n yRange: {\n get: function() {\n return yRange;\n }, set: function(_) {\n yRange = _;\n }\n },\n forceY: {\n get: function() {\n return forceY;\n }, set: function(_) {\n forceY = _;\n }\n },\n stacked: {\n get: function() {\n return stacked;\n }, set: function(_) {\n stacked = _;\n }\n },\n showValues: {\n get: function() {\n return showValues;\n }, set: function(_) {\n showValues = _;\n }\n },\n // this shows the group name, seems pointless?\n //showBarLabels: {get: function(){return showBarLabels;}, set: function(_){showBarLabels=_;}},\n disabled: {\n get: function() {\n return disabled;\n }, set: function(_) {\n disabled = _;\n }\n },\n id: {\n get: function() {\n return id;\n }, set: function(_) {\n id = _;\n }\n },\n valueFormat: {\n get: function() {\n return valueFormat;\n }, set: function(_) {\n valueFormat = _;\n }\n },\n valuePadding: {\n get: function() {\n return valuePadding;\n }, set: function(_) {\n valuePadding = _;\n }\n },\n groupSpacing: {\n get: function() {\n return groupSpacing;\n }, set: function(_) {\n groupSpacing = _;\n }\n },\n fillOpacity: {\n get: function() {\n return fillOpacity;\n }, set: function(_) {\n fillOpacity = _;\n }\n },\n\n // options that require extra logic in the setter\n margin: {\n get: function() {\n return margin;\n }, set: function(_) {\n margin.top = _.top !== undefined ? _.top : margin.top;\n margin.right = _.right !== undefined ? _.right : margin.right;\n margin.bottom = _.bottom !== undefined ? _.bottom : margin.bottom;\n margin.left = _.left !== undefined ? _.left : margin.left;\n }\n },\n duration: {\n get: function() {\n return duration;\n }, set: function(_) {\n duration = _;\n renderWatch.reset(duration);\n }\n },\n color: {\n get: function() {\n return color;\n }, set: function(_) {\n color = nv.utils.getColor(_);\n }\n },\n barColor: {\n get: function() {\n return barColor;\n }, set: function(_) {\n barColor = _ ? nv.utils.getColor(_) : null;\n }\n }\n });\n\n nv.utils.initOptions(chart);\n\n return chart;\n };\n\n nv.models.multiBarHorizontalChart = function() {\n 'use strict';\n\n //============================================================\n // Public Variables with Default Settings\n //------------------------------------------------------------\n\n var multibar = nv.models.multiBarHorizontal()\n , xAxis = nv.models.axis()\n , yAxis = nv.models.axis()\n , legend = nv.models.legend().height(30)\n , controls = nv.models.legend().height(30)\n , tooltip = nv.models.tooltip()\n ;\n\n var margin = {top: 30, right: 20, bottom: 50, left: 60}\n , marginTop = null\n , width = null\n , height = null\n , color = nv.utils.defaultColor()\n , showControls = true\n , controlsPosition = 'top'\n , controlLabels = {}\n , showLegend = true\n , legendPosition = 'top'\n , showXAxis = true\n , showYAxis = true\n , stacked = false\n , x //can be accessed via chart.xScale()\n , y //can be accessed via chart.yScale()\n , state = nv.utils.state()\n , defaultState = null\n , noData = null\n , dispatch = d3.dispatch('stateChange', 'changeState', 'renderEnd')\n , controlWidth = function() {\n return showControls ? 180 : 0;\n }\n , duration = 250\n ;\n\n state.stacked = false; // DEPRECATED Maintained for backward compatibility\n\n multibar.stacked(stacked);\n\n xAxis\n .orient('left')\n .tickPadding(5)\n .showMaxMin(false)\n .tickFormat(function(d) {\n return d;\n })\n ;\n yAxis\n .orient('bottom')\n .tickFormat(d3.format(',.1f'))\n ;\n\n tooltip\n .duration(0)\n .valueFormatter(function(d, i) {\n return yAxis.tickFormat()(d, i);\n })\n .headerFormatter(function(d, i) {\n return xAxis.tickFormat()(d, i);\n });\n\n controls.updateState(false);\n\n //============================================================\n // Private Variables\n //------------------------------------------------------------\n\n var stateGetter = function(data) {\n return function() {\n return {\n active: data.map(function(d) {\n return !d.disabled;\n }),\n stacked: stacked\n };\n };\n };\n\n var stateSetter = function(data) {\n return function(state) {\n if (state.stacked !== undefined) {\n stacked = state.stacked;\n }\n if (state.active !== undefined) {\n data.forEach(function(series, i) {\n series.disabled = !state.active[i];\n });\n }\n };\n };\n\n var renderWatch = nv.utils.renderWatch(dispatch, duration);\n\n function chart(selection) {\n renderWatch.reset();\n renderWatch.models(multibar);\n if (showXAxis) renderWatch.models(xAxis);\n if (showYAxis) renderWatch.models(yAxis);\n\n selection.each(function(data) {\n var container = d3.select(this),\n that = this;\n nv.utils.initSVG(container);\n var availableWidth = nv.utils.availableWidth(width, container, margin),\n availableHeight = nv.utils.availableHeight(height, container, margin);\n\n chart.update = function() {\n container.transition().duration(duration).call(chart);\n };\n chart.container = this;\n\n stacked = multibar.stacked();\n\n state\n .setter(stateSetter(data), chart.update)\n .getter(stateGetter(data))\n .update();\n\n // DEPRECATED set state.disableddisabled\n state.disabled = data.map(function(d) {\n return !!d.disabled;\n });\n\n if (!defaultState) {\n var key;\n defaultState = {};\n for (key in state) {\n if (state[key] instanceof Array) {\n defaultState[key] = state[key].slice(0);\n } else {\n defaultState[key] = state[key];\n }\n }\n }\n\n // Display No Data message if there's nothing to show.\n if (!data || !data.length || !data.filter(function(d) {\n return d.values.length;\n }).length) {\n nv.utils.noData(chart, container);\n return chart;\n } else {\n container.selectAll('.nv-noData').remove();\n }\n\n // Setup Scales\n x = multibar.xScale();\n y = multibar.yScale().clamp(true);\n\n // Setup containers and skeleton of chart\n var wrap = container.selectAll('g.nv-wrap.nv-multiBarHorizontalChart').data([data]);\n var gEnter = wrap.enter().append('g').attr('class', 'nvd3 nv-wrap nv-multiBarHorizontalChart').append('g');\n var g = wrap.select('g');\n\n gEnter.append('g').attr('class', 'nv-x nv-axis');\n gEnter.append('g').attr('class', 'nv-y nv-axis')\n .append('g').attr('class', 'nv-zeroLine')\n .append('line');\n gEnter.append('g').attr('class', 'nv-barsWrap');\n gEnter.append('g').attr('class', 'nv-legendWrap');\n gEnter.append('g').attr('class', 'nv-controlsWrap');\n\n // Legend\n if (!showLegend) {\n g.select('.nv-legendWrap').selectAll('*').remove();\n } else {\n legend.width(availableWidth - controlWidth());\n\n g.select('.nv-legendWrap')\n .datum(data)\n .call(legend);\n if (legendPosition === 'bottom') {\n margin.bottom = xAxis.height() + legend.height();\n availableHeight = nv.utils.availableHeight(height, container, margin);\n g.select('.nv-legendWrap')\n .attr('transform', 'translate(' + controlWidth() + ',' + (availableHeight + xAxis.height()) + ')');\n } else if (legendPosition === 'top') {\n\n if (!marginTop && legend.height() !== margin.top) {\n margin.top = legend.height();\n availableHeight = nv.utils.availableHeight(height, container, margin);\n }\n\n g.select('.nv-legendWrap')\n .attr('transform', 'translate(' + controlWidth() + ',' + (-margin.top) + ')');\n }\n }\n\n // Controls\n if (!showControls) {\n g.select('.nv-controlsWrap').selectAll('*').remove();\n } else {\n var controlsData = [\n {key: controlLabels.grouped || 'Grouped', disabled: multibar.stacked()},\n {key: controlLabels.stacked || 'Stacked', disabled: !multibar.stacked()}\n ];\n\n controls.width(controlWidth()).color(['#444', '#444', '#444']);\n\n if (controlsPosition === 'bottom') {\n margin.bottom = xAxis.height() + legend.height();\n availableHeight = nv.utils.availableHeight(height, container, margin);\n g.select('.nv-controlsWrap')\n .datum(controlsData)\n .attr('transform', 'translate(0,' + (availableHeight + xAxis.height()) + ')')\n .call(controls);\n\n } else if (controlsPosition === 'top') {\n g.select('.nv-controlsWrap')\n .datum(controlsData)\n .attr('transform', 'translate(0,' + (-margin.top) + ')')\n .call(controls);\n }\n }\n\n wrap.attr('transform', 'translate(' + margin.left + ',' + margin.top + ')');\n\n // Main Chart Component(s)\n multibar\n .disabled(data.map(function(series) {\n return series.disabled;\n }))\n .width(availableWidth)\n .height(availableHeight)\n .color(data.map(function(d, i) {\n return d.color || color(d, i);\n }).filter(function(d, i) {\n return !data[i].disabled;\n }));\n\n var barsWrap = g.select('.nv-barsWrap')\n .datum(data.filter(function(d) {\n return !d.disabled;\n }));\n\n barsWrap.transition().call(multibar);\n\n // Setup Axes\n if (showXAxis) {\n xAxis\n .scale(x)\n ._ticks(nv.utils.calcTicksY(availableHeight / 24, data))\n .tickSize(-availableWidth, 0);\n\n g.select('.nv-x.nv-axis').call(xAxis);\n\n var xTicks = g.select('.nv-x.nv-axis').selectAll('g');\n\n xTicks\n .selectAll('line, text');\n }\n\n if (showYAxis) {\n yAxis\n .scale(y)\n ._ticks(nv.utils.calcTicksX(availableWidth / 100, data))\n .tickSize(-availableHeight, 0);\n\n g.select('.nv-y.nv-axis')\n .attr('transform', 'translate(0,' + availableHeight + ')');\n g.select('.nv-y.nv-axis').call(yAxis);\n }\n\n // Zero line\n g.select('.nv-zeroLine line')\n .attr('x1', y(0))\n .attr('x2', y(0))\n .attr('y1', 0)\n .attr('y2', -availableHeight)\n ;\n\n //============================================================\n // Event Handling/Dispatching (in chart's scope)\n //------------------------------------------------------------\n\n legend.dispatch.on('stateChange', function(newState) {\n for (var key in newState) {\n state[key] = newState[key];\n }\n dispatch.stateChange(state);\n chart.update();\n });\n\n controls.dispatch.on('legendClick', function(d, i) {\n if (!d.disabled) return;\n controlsData = controlsData.map(function(s) {\n s.disabled = true;\n return s;\n });\n d.disabled = false;\n\n switch (d.key) {\n case 'Grouped':\n case controlLabels.grouped:\n multibar.stacked(false);\n break;\n case 'Stacked':\n case controlLabels.stacked:\n multibar.stacked(true);\n break;\n }\n\n state.stacked = multibar.stacked();\n dispatch.stateChange(state);\n stacked = multibar.stacked();\n\n chart.update();\n });\n\n // Update chart from a state object passed to event handler\n dispatch.on('changeState', function(e) {\n\n if (typeof e.disabled !== 'undefined') {\n data.forEach(function(series, i) {\n series.disabled = e.disabled[i];\n });\n\n state.disabled = e.disabled;\n }\n\n if (typeof e.stacked !== 'undefined') {\n multibar.stacked(e.stacked);\n state.stacked = e.stacked;\n stacked = e.stacked;\n }\n\n chart.update();\n });\n });\n renderWatch.renderEnd('multibar horizontal chart immediate');\n return chart;\n }\n\n //============================================================\n // Event Handling/Dispatching (out of chart's scope)\n //------------------------------------------------------------\n\n multibar.dispatch.on('elementMouseover.tooltip', function(evt) {\n evt.value = chart.x()(evt.data);\n evt['series'] = {\n key: evt.data.key,\n value: chart.y()(evt.data),\n color: evt.color\n };\n tooltip.data(evt).hidden(false);\n });\n\n multibar.dispatch.on('elementMouseout.tooltip', function(evt) {\n tooltip.hidden(true);\n });\n\n multibar.dispatch.on('elementMousemove.tooltip', function(evt) {\n tooltip();\n });\n\n //============================================================\n // Expose Public Variables\n //------------------------------------------------------------\n\n // expose chart's sub-components\n chart.dispatch = dispatch;\n chart.multibar = multibar;\n chart.legend = legend;\n chart.controls = controls;\n chart.xAxis = xAxis;\n chart.yAxis = yAxis;\n chart.state = state;\n chart.tooltip = tooltip;\n\n chart.options = nv.utils.optionsFunc.bind(chart);\n\n chart._options = Object.create({}, {\n // simple options, just get/set the necessary values\n width: {\n get: function() {\n return width;\n }, set: function(_) {\n width = _;\n }\n },\n height: {\n get: function() {\n return height;\n }, set: function(_) {\n height = _;\n }\n },\n showLegend: {\n get: function() {\n return showLegend;\n }, set: function(_) {\n showLegend = _;\n }\n },\n legendPosition: {\n get: function() {\n return legendPosition;\n }, set: function(_) {\n legendPosition = _;\n }\n },\n controlsPosition: {\n get: function() {\n return controlsPosition;\n }, set: function(_) {\n controlsPosition = _;\n }\n },\n showControls: {\n get: function() {\n return showControls;\n }, set: function(_) {\n showControls = _;\n }\n },\n controlLabels: {\n get: function() {\n return controlLabels;\n }, set: function(_) {\n controlLabels = _;\n }\n },\n showXAxis: {\n get: function() {\n return showXAxis;\n }, set: function(_) {\n showXAxis = _;\n }\n },\n showYAxis: {\n get: function() {\n return showYAxis;\n }, set: function(_) {\n showYAxis = _;\n }\n },\n defaultState: {\n get: function() {\n return defaultState;\n }, set: function(_) {\n defaultState = _;\n }\n },\n noData: {\n get: function() {\n return noData;\n }, set: function(_) {\n noData = _;\n }\n },\n\n // options that require extra logic in the setter\n margin: {\n get: function() {\n return margin;\n }, set: function(_) {\n if (_.top !== undefined) {\n margin.top = _.top;\n marginTop = _.top;\n }\n margin.right = _.right !== undefined ? _.right : margin.right;\n margin.bottom = _.bottom !== undefined ? _.bottom : margin.bottom;\n margin.left = _.left !== undefined ? _.left : margin.left;\n }\n },\n duration: {\n get: function() {\n return duration;\n }, set: function(_) {\n duration = _;\n renderWatch.reset(duration);\n multibar.duration(duration);\n xAxis.duration(duration);\n yAxis.duration(duration);\n }\n },\n color: {\n get: function() {\n return color;\n }, set: function(_) {\n color = nv.utils.getColor(_);\n legend.color(color);\n }\n },\n barColor: {\n get: function() {\n return multibar.barColor;\n }, set: function(_) {\n multibar.barColor(_);\n legend.color(function(d, i) {\n return d3.rgb('#ccc').darker(i * 1.5).toString();\n });\n }\n }\n });\n\n nv.utils.inheritOptions(chart, multibar);\n nv.utils.initOptions(chart);\n\n return chart;\n };\n nv.models.multiChart = function() {\n 'use strict';\n\n //============================================================\n // Public Variables with Default Settings\n //------------------------------------------------------------\n\n var margin = {top: 30, right: 20, bottom: 50, left: 60},\n marginTop = null,\n color = nv.utils.defaultColor(),\n width = null,\n height = null,\n showLegend = true,\n noData = null,\n yDomain1,\n yDomain2,\n getX = function(d) {\n return d.x;\n },\n getY = function(d) {\n return d.y;\n },\n interpolate = 'linear',\n useVoronoi = true,\n interactiveLayer = nv.interactiveGuideline(),\n useInteractiveGuideline = false,\n legendRightAxisHint = ' (right axis)',\n duration = 250\n ;\n\n //============================================================\n // Private Variables\n //------------------------------------------------------------\n\n var x = d3.scale.linear(),\n yScale1 = d3.scale.linear(),\n yScale2 = d3.scale.linear(),\n\n lines1 = nv.models.line().yScale(yScale1).duration(duration),\n lines2 = nv.models.line().yScale(yScale2).duration(duration),\n\n scatters1 = nv.models.scatter().yScale(yScale1).duration(duration),\n scatters2 = nv.models.scatter().yScale(yScale2).duration(duration),\n\n bars1 = nv.models.multiBar().stacked(false).yScale(yScale1).duration(duration),\n bars2 = nv.models.multiBar().stacked(false).yScale(yScale2).duration(duration),\n\n stack1 = nv.models.stackedArea().yScale(yScale1).duration(duration),\n stack2 = nv.models.stackedArea().yScale(yScale2).duration(duration),\n\n xAxis = nv.models.axis().scale(x).orient('bottom').tickPadding(5).duration(duration),\n yAxis1 = nv.models.axis().scale(yScale1).orient('left').duration(duration),\n yAxis2 = nv.models.axis().scale(yScale2).orient('right').duration(duration),\n\n legend = nv.models.legend().height(30),\n tooltip = nv.models.tooltip(),\n dispatch = d3.dispatch();\n\n var charts = [lines1, lines2, scatters1, scatters2, bars1, bars2, stack1, stack2];\n\n function chart(selection) {\n selection.each(function(data) {\n var container = d3.select(this),\n that = this;\n nv.utils.initSVG(container);\n\n chart.update = function() {\n container.transition().call(chart);\n };\n chart.container = this;\n\n var availableWidth = nv.utils.availableWidth(width, container, margin),\n availableHeight = nv.utils.availableHeight(height, container, margin);\n\n var dataLines1 = data.filter(function(d) {\n return d.type == 'line' && d.yAxis == 1;\n });\n var dataLines2 = data.filter(function(d) {\n return d.type == 'line' && d.yAxis == 2;\n });\n var dataScatters1 = data.filter(function(d) {\n return d.type == 'scatter' && d.yAxis == 1;\n });\n var dataScatters2 = data.filter(function(d) {\n return d.type == 'scatter' && d.yAxis == 2;\n });\n var dataBars1 = data.filter(function(d) {\n return d.type == 'bar' && d.yAxis == 1;\n });\n var dataBars2 = data.filter(function(d) {\n return d.type == 'bar' && d.yAxis == 2;\n });\n var dataStack1 = data.filter(function(d) {\n return d.type == 'area' && d.yAxis == 1;\n });\n var dataStack2 = data.filter(function(d) {\n return d.type == 'area' && d.yAxis == 2;\n });\n\n // Display noData message if there's nothing to show.\n if (!data || !data.length || !data.filter(function(d) {\n return d.values.length;\n }).length) {\n nv.utils.noData(chart, container);\n return chart;\n } else {\n container.selectAll('.nv-noData').remove();\n }\n\n var series1 = data.filter(function(d) {\n return !d.disabled && d.yAxis == 1;\n })\n .map(function(d) {\n return d.values.map(function(d, i) {\n return {x: getX(d), y: getY(d)};\n });\n });\n\n var series2 = data.filter(function(d) {\n return !d.disabled && d.yAxis == 2;\n })\n .map(function(d) {\n return d.values.map(function(d, i) {\n return {x: getX(d), y: getY(d)};\n });\n });\n\n x.domain(d3.extent(d3.merge(series1.concat(series2)), function(d) {\n return d.x;\n }))\n .range([0, availableWidth]);\n\n var wrap = container.selectAll('g.wrap.multiChart').data([data]);\n var gEnter = wrap.enter().append('g').attr('class', 'wrap nvd3 multiChart').append('g');\n\n gEnter.append('g').attr('class', 'nv-x nv-axis');\n gEnter.append('g').attr('class', 'nv-y1 nv-axis');\n gEnter.append('g').attr('class', 'nv-y2 nv-axis');\n gEnter.append('g').attr('class', 'stack1Wrap');\n gEnter.append('g').attr('class', 'stack2Wrap');\n gEnter.append('g').attr('class', 'bars1Wrap');\n gEnter.append('g').attr('class', 'bars2Wrap');\n gEnter.append('g').attr('class', 'scatters1Wrap');\n gEnter.append('g').attr('class', 'scatters2Wrap');\n gEnter.append('g').attr('class', 'lines1Wrap');\n gEnter.append('g').attr('class', 'lines2Wrap');\n gEnter.append('g').attr('class', 'legendWrap');\n gEnter.append('g').attr('class', 'nv-interactive');\n\n var g = wrap.select('g');\n\n var color_array = data.map(function(d, i) {\n return data[i].color || color(d, i);\n });\n\n // Legend\n if (!showLegend) {\n g.select('.legendWrap').selectAll('*').remove();\n } else {\n var legendWidth = legend.align() ? availableWidth / 2 : availableWidth;\n var legendXPosition = legend.align() ? legendWidth : 0;\n\n legend.width(legendWidth);\n legend.color(color_array);\n\n g.select('.legendWrap')\n .datum(data.map(function(series) {\n series.originalKey = series.originalKey === undefined ? series.key : series.originalKey;\n series.key = series.originalKey + (series.yAxis == 1 ? '' : legendRightAxisHint);\n return series;\n }))\n .call(legend);\n\n if (!marginTop && legend.height() !== margin.top) {\n margin.top = legend.height();\n availableHeight = nv.utils.availableHeight(height, container, margin);\n }\n\n g.select('.legendWrap')\n .attr('transform', 'translate(' + legendXPosition + ',' + (-margin.top) + ')');\n }\n\n lines1\n .width(availableWidth)\n .height(availableHeight)\n .interpolate(interpolate)\n .color(color_array.filter(function(d, i) {\n return !data[i].disabled && data[i].yAxis == 1 && data[i].type == 'line';\n }));\n lines2\n .width(availableWidth)\n .height(availableHeight)\n .interpolate(interpolate)\n .color(color_array.filter(function(d, i) {\n return !data[i].disabled && data[i].yAxis == 2 && data[i].type == 'line';\n }));\n scatters1\n .width(availableWidth)\n .height(availableHeight)\n .color(color_array.filter(function(d, i) {\n return !data[i].disabled && data[i].yAxis == 1 && data[i].type == 'scatter';\n }));\n scatters2\n .width(availableWidth)\n .height(availableHeight)\n .color(color_array.filter(function(d, i) {\n return !data[i].disabled && data[i].yAxis == 2 && data[i].type == 'scatter';\n }));\n bars1\n .width(availableWidth)\n .height(availableHeight)\n .color(color_array.filter(function(d, i) {\n return !data[i].disabled && data[i].yAxis == 1 && data[i].type == 'bar';\n }));\n bars2\n .width(availableWidth)\n .height(availableHeight)\n .color(color_array.filter(function(d, i) {\n return !data[i].disabled && data[i].yAxis == 2 && data[i].type == 'bar';\n }));\n stack1\n .width(availableWidth)\n .height(availableHeight)\n .interpolate(interpolate)\n .color(color_array.filter(function(d, i) {\n return !data[i].disabled && data[i].yAxis == 1 && data[i].type == 'area';\n }));\n stack2\n .width(availableWidth)\n .height(availableHeight)\n .interpolate(interpolate)\n .color(color_array.filter(function(d, i) {\n return !data[i].disabled && data[i].yAxis == 2 && data[i].type == 'area';\n }));\n\n g.attr('transform', 'translate(' + margin.left + ',' + margin.top + ')');\n\n var lines1Wrap = g.select('.lines1Wrap')\n .datum(dataLines1.filter(function(d) {\n return !d.disabled;\n }));\n var scatters1Wrap = g.select('.scatters1Wrap')\n .datum(dataScatters1.filter(function(d) {\n return !d.disabled;\n }));\n var bars1Wrap = g.select('.bars1Wrap')\n .datum(dataBars1.filter(function(d) {\n return !d.disabled;\n }));\n var stack1Wrap = g.select('.stack1Wrap')\n .datum(dataStack1.filter(function(d) {\n return !d.disabled;\n }));\n var lines2Wrap = g.select('.lines2Wrap')\n .datum(dataLines2.filter(function(d) {\n return !d.disabled;\n }));\n var scatters2Wrap = g.select('.scatters2Wrap')\n .datum(dataScatters2.filter(function(d) {\n return !d.disabled;\n }));\n var bars2Wrap = g.select('.bars2Wrap')\n .datum(dataBars2.filter(function(d) {\n return !d.disabled;\n }));\n var stack2Wrap = g.select('.stack2Wrap')\n .datum(dataStack2.filter(function(d) {\n return !d.disabled;\n }));\n\n var extraValue1BarStacked = [];\n if (bars1.stacked() && dataBars1.length) {\n var extraValue1BarStacked = dataBars1.filter(function(d) {\n return !d.disabled;\n }).map(function(a) {\n return a.values;\n });\n\n if (extraValue1BarStacked.length > 0) {\n extraValue1BarStacked = extraValue1BarStacked.reduce(function(a, b) {\n return a.map(function(aVal, i) {\n return {x: aVal.x, y: aVal.y + b[i].y};\n });\n });\n }\n }\n if (dataBars1.length) {\n extraValue1BarStacked.push({x: 0, y: 0});\n }\n\n var extraValue2BarStacked = [];\n if (bars2.stacked() && dataBars2.length) {\n var extraValue2BarStacked = dataBars2.filter(function(d) {\n return !d.disabled;\n }).map(function(a) {\n return a.values;\n });\n\n if (extraValue2BarStacked.length > 0) {\n extraValue2BarStacked = extraValue2BarStacked.reduce(function(a, b) {\n return a.map(function(aVal, i) {\n return {x: aVal.x, y: aVal.y + b[i].y};\n });\n });\n }\n }\n if (dataBars2.length) {\n extraValue2BarStacked.push({x: 0, y: 0});\n }\n\n yScale1.domain(yDomain1 || d3.extent(d3.merge(series1).concat(extraValue1BarStacked), function(d) {\n return d.y;\n }))\n .range([0, availableHeight]);\n\n yScale2.domain(yDomain2 || d3.extent(d3.merge(series2).concat(extraValue2BarStacked), function(d) {\n return d.y;\n }))\n .range([0, availableHeight]);\n\n lines1.yDomain(yScale1.domain());\n scatters1.yDomain(yScale1.domain());\n bars1.yDomain(yScale1.domain());\n stack1.yDomain(yScale1.domain());\n\n lines2.yDomain(yScale2.domain());\n scatters2.yDomain(yScale2.domain());\n bars2.yDomain(yScale2.domain());\n stack2.yDomain(yScale2.domain());\n\n if (dataStack1.length) {\n d3.transition(stack1Wrap).call(stack1);\n }\n if (dataStack2.length) {\n d3.transition(stack2Wrap).call(stack2);\n }\n\n if (dataBars1.length) {\n d3.transition(bars1Wrap).call(bars1);\n }\n if (dataBars2.length) {\n d3.transition(bars2Wrap).call(bars2);\n }\n\n if (dataLines1.length) {\n d3.transition(lines1Wrap).call(lines1);\n }\n if (dataLines2.length) {\n d3.transition(lines2Wrap).call(lines2);\n }\n\n if (dataScatters1.length) {\n d3.transition(scatters1Wrap).call(scatters1);\n }\n if (dataScatters2.length) {\n d3.transition(scatters2Wrap).call(scatters2);\n }\n\n xAxis\n ._ticks(nv.utils.calcTicksX(availableWidth / 100, data))\n .tickSize(-availableHeight, 0);\n\n g.select('.nv-x.nv-axis')\n .attr('transform', 'translate(0,' + availableHeight + ')');\n d3.transition(g.select('.nv-x.nv-axis'))\n .call(xAxis);\n\n yAxis1\n ._ticks(nv.utils.calcTicksY(availableHeight / 36, data))\n .tickSize(-availableWidth, 0);\n\n\n d3.transition(g.select('.nv-y1.nv-axis'))\n .call(yAxis1);\n\n yAxis2\n ._ticks(nv.utils.calcTicksY(availableHeight / 36, data))\n .tickSize(-availableWidth, 0);\n\n d3.transition(g.select('.nv-y2.nv-axis'))\n .call(yAxis2);\n\n g.select('.nv-y1.nv-axis')\n .classed('nv-disabled', series1.length ? false : true)\n .attr('transform', 'translate(' + x.range()[0] + ',0)');\n\n g.select('.nv-y2.nv-axis')\n .classed('nv-disabled', series2.length ? false : true)\n .attr('transform', 'translate(' + x.range()[1] + ',0)');\n\n legend.dispatch.on('stateChange', function(newState) {\n chart.update();\n });\n\n if (useInteractiveGuideline) {\n interactiveLayer\n .width(availableWidth)\n .height(availableHeight)\n .margin({left: margin.left, top: margin.top})\n .svgContainer(container)\n .xScale(x);\n wrap.select('.nv-interactive').call(interactiveLayer);\n }\n\n //============================================================\n // Event Handling/Dispatching\n //------------------------------------------------------------\n\n function mouseover_line(evt) {\n var yaxis = evt.series.yAxis === 2 ? yAxis2 : yAxis1;\n evt.value = evt.point.x;\n evt.series = {\n value: evt.point.y,\n color: evt.point.color,\n key: evt.series.key\n };\n tooltip\n .duration(0)\n .headerFormatter(function(d, i) {\n return xAxis.tickFormat()(d, i);\n })\n .valueFormatter(function(d, i) {\n return yaxis.tickFormat()(d, i);\n })\n .data(evt)\n .hidden(false);\n }\n\n function mouseover_scatter(evt) {\n var yaxis = evt.series.yAxis === 2 ? yAxis2 : yAxis1;\n evt.value = evt.point.x;\n evt.series = {\n value: evt.point.y,\n color: evt.point.color,\n key: evt.series.key\n };\n tooltip\n .duration(100)\n .headerFormatter(function(d, i) {\n return xAxis.tickFormat()(d, i);\n })\n .valueFormatter(function(d, i) {\n return yaxis.tickFormat()(d, i);\n })\n .data(evt)\n .hidden(false);\n }\n\n function mouseover_stack(evt) {\n var yaxis = evt.series.yAxis === 2 ? yAxis2 : yAxis1;\n evt.point['x'] = stack1.x()(evt.point);\n evt.point['y'] = stack1.y()(evt.point);\n tooltip\n .duration(0)\n .headerFormatter(function(d, i) {\n return xAxis.tickFormat()(d, i);\n })\n .valueFormatter(function(d, i) {\n return yaxis.tickFormat()(d, i);\n })\n .data(evt)\n .hidden(false);\n }\n\n function mouseover_bar(evt) {\n var yaxis = evt.series.yAxis === 2 ? yAxis2 : yAxis1;\n\n evt.value = bars1.x()(evt.data);\n evt['series'] = {\n value: bars1.y()(evt.data),\n color: evt.color,\n key: evt.data.key\n };\n tooltip\n .duration(0)\n .headerFormatter(function(d, i) {\n return xAxis.tickFormat()(d, i);\n })\n .valueFormatter(function(d, i) {\n return yaxis.tickFormat()(d, i);\n })\n .data(evt)\n .hidden(false);\n }\n\n\n function clearHighlights() {\n for (var i = 0, il = charts.length; i < il; i++) {\n var chart = charts[i];\n try {\n chart.clearHighlights();\n } catch (e) {\n }\n }\n }\n\n function highlightPoint(serieIndex, pointIndex, b) {\n for (var i = 0, il = charts.length; i < il; i++) {\n var chart = charts[i];\n try {\n chart.highlightPoint(serieIndex, pointIndex, b);\n } catch (e) {\n }\n }\n }\n\n if (useInteractiveGuideline) {\n interactiveLayer.dispatch.on('elementMousemove', function(e) {\n clearHighlights();\n var singlePoint, pointIndex, pointXLocation, allData = [];\n data\n .filter(function(series, i) {\n series.seriesIndex = i;\n return !series.disabled;\n })\n .forEach(function(series, i) {\n var extent = x.domain();\n var currentValues = series.values.filter(function(d, i) {\n return chart.x()(d, i) >= extent[0] && chart.x()(d, i) <= extent[1];\n });\n\n pointIndex = nv.interactiveBisect(currentValues, e.pointXValue, chart.x());\n var point = currentValues[pointIndex];\n var pointYValue = chart.y()(point, pointIndex);\n if (pointYValue !== null) {\n highlightPoint(i, pointIndex, true);\n }\n if (point === undefined) return;\n if (singlePoint === undefined) singlePoint = point;\n if (pointXLocation === undefined) pointXLocation = x(chart.x()(point, pointIndex));\n allData.push({\n key: series.key,\n value: pointYValue,\n color: color(series, series.seriesIndex),\n data: point,\n yAxis: series.yAxis == 2 ? yAxis2 : yAxis1\n });\n });\n\n var defaultValueFormatter = function(d, i) {\n var yAxis = allData[i].yAxis;\n return d == null ? 'N/A' : yAxis.tickFormat()(d);\n };\n\n interactiveLayer.tooltip\n .headerFormatter(function(d, i) {\n return xAxis.tickFormat()(d, i);\n })\n .valueFormatter(interactiveLayer.tooltip.valueFormatter() || defaultValueFormatter)\n .data({\n value: chart.x()(singlePoint, pointIndex),\n index: pointIndex,\n series: allData\n })();\n\n interactiveLayer.renderGuideLine(pointXLocation);\n });\n\n interactiveLayer.dispatch.on('elementMouseout', function(e) {\n clearHighlights();\n });\n } else {\n lines1.dispatch.on('elementMouseover.tooltip', mouseover_line);\n lines2.dispatch.on('elementMouseover.tooltip', mouseover_line);\n lines1.dispatch.on('elementMouseout.tooltip', function(evt) {\n tooltip.hidden(true);\n });\n lines2.dispatch.on('elementMouseout.tooltip', function(evt) {\n tooltip.hidden(true);\n });\n\n scatters1.dispatch.on('elementMouseover.tooltip', mouseover_scatter);\n scatters2.dispatch.on('elementMouseover.tooltip', mouseover_scatter);\n scatters1.dispatch.on('elementMouseout.tooltip', function(evt) {\n tooltip.hidden(true);\n });\n scatters2.dispatch.on('elementMouseout.tooltip', function(evt) {\n tooltip.hidden(true);\n });\n\n stack1.dispatch.on('elementMouseover.tooltip', mouseover_stack);\n stack2.dispatch.on('elementMouseover.tooltip', mouseover_stack);\n stack1.dispatch.on('elementMouseout.tooltip', function(evt) {\n tooltip.hidden(true);\n });\n stack2.dispatch.on('elementMouseout.tooltip', function(evt) {\n tooltip.hidden(true);\n });\n\n bars1.dispatch.on('elementMouseover.tooltip', mouseover_bar);\n bars2.dispatch.on('elementMouseover.tooltip', mouseover_bar);\n\n bars1.dispatch.on('elementMouseout.tooltip', function(evt) {\n tooltip.hidden(true);\n });\n bars2.dispatch.on('elementMouseout.tooltip', function(evt) {\n tooltip.hidden(true);\n });\n bars1.dispatch.on('elementMousemove.tooltip', function(evt) {\n tooltip();\n });\n bars2.dispatch.on('elementMousemove.tooltip', function(evt) {\n tooltip();\n });\n }\n });\n\n return chart;\n }\n\n //============================================================\n // Global getters and setters\n //------------------------------------------------------------\n\n chart.dispatch = dispatch;\n chart.legend = legend;\n chart.lines1 = lines1;\n chart.lines2 = lines2;\n chart.scatters1 = scatters1;\n chart.scatters2 = scatters2;\n chart.bars1 = bars1;\n chart.bars2 = bars2;\n chart.stack1 = stack1;\n chart.stack2 = stack2;\n chart.xAxis = xAxis;\n chart.yAxis1 = yAxis1;\n chart.yAxis2 = yAxis2;\n chart.tooltip = tooltip;\n chart.interactiveLayer = interactiveLayer;\n\n chart.options = nv.utils.optionsFunc.bind(chart);\n\n chart._options = Object.create({}, {\n // simple options, just get/set the necessary values\n width: {\n get: function() {\n return width;\n }, set: function(_) {\n width = _;\n }\n },\n height: {\n get: function() {\n return height;\n }, set: function(_) {\n height = _;\n }\n },\n showLegend: {\n get: function() {\n return showLegend;\n }, set: function(_) {\n showLegend = _;\n }\n },\n yDomain1: {\n get: function() {\n return yDomain1;\n }, set: function(_) {\n yDomain1 = _;\n }\n },\n yDomain2: {\n get: function() {\n return yDomain2;\n }, set: function(_) {\n yDomain2 = _;\n }\n },\n noData: {\n get: function() {\n return noData;\n }, set: function(_) {\n noData = _;\n }\n },\n interpolate: {\n get: function() {\n return interpolate;\n }, set: function(_) {\n interpolate = _;\n }\n },\n legendRightAxisHint: {\n get: function() {\n return legendRightAxisHint;\n }, set: function(_) {\n legendRightAxisHint = _;\n }\n },\n\n // options that require extra logic in the setter\n margin: {\n get: function() {\n return margin;\n }, set: function(_) {\n if (_.top !== undefined) {\n margin.top = _.top;\n marginTop = _.top;\n }\n margin.right = _.right !== undefined ? _.right : margin.right;\n margin.bottom = _.bottom !== undefined ? _.bottom : margin.bottom;\n margin.left = _.left !== undefined ? _.left : margin.left;\n }\n },\n color: {\n get: function() {\n return color;\n }, set: function(_) {\n color = nv.utils.getColor(_);\n }\n },\n x: {\n get: function() {\n return getX;\n }, set: function(_) {\n getX = _;\n lines1.x(_);\n lines2.x(_);\n scatters1.x(_);\n scatters2.x(_);\n bars1.x(_);\n bars2.x(_);\n stack1.x(_);\n stack2.x(_);\n }\n },\n y: {\n get: function() {\n return getY;\n }, set: function(_) {\n getY = _;\n lines1.y(_);\n lines2.y(_);\n scatters1.y(_);\n scatters2.y(_);\n stack1.y(_);\n stack2.y(_);\n bars1.y(_);\n bars2.y(_);\n }\n },\n useVoronoi: {\n get: function() {\n return useVoronoi;\n }, set: function(_) {\n useVoronoi = _;\n lines1.useVoronoi(_);\n lines2.useVoronoi(_);\n stack1.useVoronoi(_);\n stack2.useVoronoi(_);\n }\n },\n\n useInteractiveGuideline: {\n get: function() {\n return useInteractiveGuideline;\n }, set: function(_) {\n useInteractiveGuideline = _;\n if (useInteractiveGuideline) {\n lines1.interactive(false);\n lines1.useVoronoi(false);\n lines2.interactive(false);\n lines2.useVoronoi(false);\n stack1.interactive(false);\n stack1.useVoronoi(false);\n stack2.interactive(false);\n stack2.useVoronoi(false);\n scatters1.interactive(false);\n scatters2.interactive(false);\n }\n }\n },\n\n duration: {\n get: function() {\n return duration;\n }, set: function(_) {\n duration = _;\n [lines1, lines2, stack1, stack2, scatters1, scatters2, xAxis, yAxis1, yAxis2].forEach(function(model) {\n model.duration(duration);\n });\n }\n }\n });\n\n nv.utils.initOptions(chart);\n\n return chart;\n };\n\n nv.models.ohlcBar = function() {\n 'use strict';\n\n //============================================================\n // Public Variables with Default Settings\n //------------------------------------------------------------\n\n var margin = {top: 0, right: 0, bottom: 0, left: 0}\n ,\n width = null\n ,\n height = null\n ,\n id = Math.floor(Math.random() * 10000) //Create semi-unique ID in case user doesn't select one\n ,\n container = null\n ,\n x = d3.scale.linear()\n ,\n y = d3.scale.linear()\n ,\n getX = function(d) {\n return d.x;\n }\n ,\n getY = function(d) {\n return d.y;\n }\n ,\n getOpen = function(d) {\n return d.open;\n }\n ,\n getClose = function(d) {\n return d.close;\n }\n ,\n getHigh = function(d) {\n return d.high;\n }\n ,\n getLow = function(d) {\n return d.low;\n }\n ,\n forceX = []\n ,\n forceY = []\n ,\n padData = false // If true, adds half a data points width to front and back, for lining up a line chart with a bar chart\n ,\n clipEdge = true\n ,\n color = nv.utils.defaultColor()\n ,\n interactive = false\n ,\n xDomain\n ,\n yDomain\n ,\n xRange\n ,\n yRange\n ,\n dispatch = d3.dispatch('stateChange', 'changeState', 'renderEnd', 'chartClick', 'elementClick', 'elementDblClick',\n 'elementMouseover', 'elementMouseout', 'elementMousemove')\n ;\n\n //============================================================\n // Private Variables\n //------------------------------------------------------------\n\n function chart(selection) {\n selection.each(function(data) {\n container = d3.select(this);\n var availableWidth = nv.utils.availableWidth(width, container, margin),\n availableHeight = nv.utils.availableHeight(height, container, margin);\n\n nv.utils.initSVG(container);\n\n // ohlc bar width.\n var w = (availableWidth / data[0].values.length) * .9;\n\n // Setup Scales\n x.domain(xDomain || d3.extent(data[0].values.map(getX).concat(forceX)));\n\n if (padData) {\n x.range(xRange || [availableWidth * .5 / data[0].values.length,\n availableWidth * (data[0].values.length - .5) / data[0].values.length]);\n } else {\n x.range(xRange || [5 + w / 2, availableWidth - w / 2 - 5]);\n }\n\n y.domain(yDomain || [\n d3.min(data[0].values.map(getLow).concat(forceY)),\n d3.max(data[0].values.map(getHigh).concat(forceY))\n ]\n ).range(yRange || [availableHeight, 0]);\n\n // If scale's domain don't have a range, slightly adjust to make one... so a chart can show a single data point\n if (x.domain()[0] === x.domain()[1]) {\n x.domain()[0] ?\n x.domain([x.domain()[0] - x.domain()[0] * 0.01, x.domain()[1] + x.domain()[1] * 0.01])\n : x.domain([-1, 1]);\n }\n\n if (y.domain()[0] === y.domain()[1]) {\n y.domain()[0] ?\n y.domain([y.domain()[0] + y.domain()[0] * 0.01, y.domain()[1] - y.domain()[1] * 0.01])\n : y.domain([-1, 1]);\n }\n\n // Setup containers and skeleton of chart\n var wrap = d3.select(this).selectAll('g.nv-wrap.nv-ohlcBar').data([data[0].values]);\n var wrapEnter = wrap.enter().append('g').attr('class', 'nvd3 nv-wrap nv-ohlcBar');\n var defsEnter = wrapEnter.append('defs');\n var gEnter = wrapEnter.append('g');\n var g = wrap.select('g');\n\n gEnter.append('g').attr('class', 'nv-ticks');\n\n wrap.attr('transform', 'translate(' + margin.left + ',' + margin.top + ')');\n\n container\n .on('click', function(d, i) {\n dispatch.chartClick({\n data: d,\n index: i,\n pos: d3.event,\n id: id\n });\n });\n\n defsEnter.append('clipPath')\n .attr('id', 'nv-chart-clip-path-' + id)\n .append('rect');\n\n wrap.select('#nv-chart-clip-path-' + id + ' rect')\n .attr('width', availableWidth)\n .attr('height', availableHeight);\n\n g.attr('clip-path', clipEdge ? 'url(#nv-chart-clip-path-' + id + ')' : '');\n\n var ticks = wrap.select('.nv-ticks').selectAll('.nv-tick')\n .data(function(d) {\n return d;\n });\n ticks.exit().remove();\n\n ticks.enter().append('path')\n .attr('class', function(d, i, j) {\n return (getOpen(d, i) > getClose(d, i) ? 'nv-tick negative' : 'nv-tick positive') + ' nv-tick-' + j + '-'\n + i;\n })\n .attr('d', function(d, i) {\n return 'm0,0l0,'\n + (y(getOpen(d, i))\n - y(getHigh(d, i)))\n + 'l'\n + (-w / 2)\n + ',0l'\n + (w / 2)\n + ',0l0,'\n + (y(getLow(d, i)) - y(getOpen(d, i)))\n + 'l0,'\n + (y(getClose(d, i))\n - y(getLow(d, i)))\n + 'l'\n + (w / 2)\n + ',0l'\n + (-w / 2)\n + ',0z';\n })\n .attr('transform', function(d, i) {\n return 'translate(' + x(getX(d, i)) + ',' + y(getHigh(d, i)) + ')';\n })\n .attr('fill', function(d, i) {\n return color[0];\n })\n .attr('stroke', function(d, i) {\n return color[0];\n })\n .attr('x', 0)\n .attr('y', function(d, i) {\n return y(Math.max(0, getY(d, i)));\n })\n .attr('height', function(d, i) {\n return Math.abs(y(getY(d, i)) - y(0));\n });\n\n // the bar colors are controlled by CSS currently\n ticks.attr('class', function(d, i, j) {\n return (getOpen(d, i) > getClose(d, i) ? 'nv-tick negative' : 'nv-tick positive') + ' nv-tick-' + j + '-' + i;\n });\n\n d3.transition(ticks)\n .attr('transform', function(d, i) {\n return 'translate(' + x(getX(d, i)) + ',' + y(getHigh(d, i)) + ')';\n })\n .attr('d', function(d, i) {\n var w = (availableWidth / data[0].values.length) * .9;\n return 'm0,0l0,'\n + (y(getOpen(d, i))\n - y(getHigh(d, i)))\n + 'l'\n + (-w / 2)\n + ',0l'\n + (w / 2)\n + ',0l0,'\n + (y(getLow(d, i))\n - y(getOpen(d, i)))\n + 'l0,'\n + (y(getClose(d, i))\n - y(getLow(d, i)))\n + 'l'\n + (w / 2)\n + ',0l'\n + (-w / 2)\n + ',0z';\n });\n });\n\n return chart;\n }\n\n\n //Create methods to allow outside functions to highlight a specific bar.\n chart.highlightPoint = function(pointIndex, isHoverOver) {\n chart.clearHighlights();\n container.select('.nv-ohlcBar .nv-tick-0-' + pointIndex)\n .classed('hover', isHoverOver)\n ;\n };\n\n chart.clearHighlights = function() {\n container.select('.nv-ohlcBar .nv-tick.hover')\n .classed('hover', false)\n ;\n };\n\n //============================================================\n // Expose Public Variables\n //------------------------------------------------------------\n\n chart.dispatch = dispatch;\n chart.options = nv.utils.optionsFunc.bind(chart);\n\n chart._options = Object.create({}, {\n // simple options, just get/set the necessary values\n width: {\n get: function() {\n return width;\n }, set: function(_) {\n width = _;\n }\n },\n height: {\n get: function() {\n return height;\n }, set: function(_) {\n height = _;\n }\n },\n xScale: {\n get: function() {\n return x;\n }, set: function(_) {\n x = _;\n }\n },\n yScale: {\n get: function() {\n return y;\n }, set: function(_) {\n y = _;\n }\n },\n xDomain: {\n get: function() {\n return xDomain;\n }, set: function(_) {\n xDomain = _;\n }\n },\n yDomain: {\n get: function() {\n return yDomain;\n }, set: function(_) {\n yDomain = _;\n }\n },\n xRange: {\n get: function() {\n return xRange;\n }, set: function(_) {\n xRange = _;\n }\n },\n yRange: {\n get: function() {\n return yRange;\n }, set: function(_) {\n yRange = _;\n }\n },\n forceX: {\n get: function() {\n return forceX;\n }, set: function(_) {\n forceX = _;\n }\n },\n forceY: {\n get: function() {\n return forceY;\n }, set: function(_) {\n forceY = _;\n }\n },\n padData: {\n get: function() {\n return padData;\n }, set: function(_) {\n padData = _;\n }\n },\n clipEdge: {\n get: function() {\n return clipEdge;\n }, set: function(_) {\n clipEdge = _;\n }\n },\n id: {\n get: function() {\n return id;\n }, set: function(_) {\n id = _;\n }\n },\n interactive: {\n get: function() {\n return interactive;\n }, set: function(_) {\n interactive = _;\n }\n },\n\n x: {\n get: function() {\n return getX;\n }, set: function(_) {\n getX = _;\n }\n },\n y: {\n get: function() {\n return getY;\n }, set: function(_) {\n getY = _;\n }\n },\n open: {\n get: function() {\n return getOpen();\n }, set: function(_) {\n getOpen = _;\n }\n },\n close: {\n get: function() {\n return getClose();\n }, set: function(_) {\n getClose = _;\n }\n },\n high: {\n get: function() {\n return getHigh;\n }, set: function(_) {\n getHigh = _;\n }\n },\n low: {\n get: function() {\n return getLow;\n }, set: function(_) {\n getLow = _;\n }\n },\n\n // options that require extra logic in the setter\n margin: {\n get: function() {\n return margin;\n }, set: function(_) {\n margin.top = _.top != undefined ? _.top : margin.top;\n margin.right = _.right != undefined ? _.right : margin.right;\n margin.bottom = _.bottom != undefined ? _.bottom : margin.bottom;\n margin.left = _.left != undefined ? _.left : margin.left;\n }\n },\n color: {\n get: function() {\n return color;\n }, set: function(_) {\n color = nv.utils.getColor(_);\n }\n }\n });\n\n nv.utils.initOptions(chart);\n return chart;\n };\n// Code adapted from Jason Davies' \"Parallel Coordinates\"\n// http://bl.ocks.org/jasondavies/1341281\n nv.models.parallelCoordinates = function() {\n 'use strict';\n\n //============================================================\n // Public Variables with Default Settings\n //------------------------------------------------------------\n\n var margin = {top: 30, right: 0, bottom: 10, left: 0}\n ,\n width = null\n ,\n height = null\n ,\n availableWidth = null\n ,\n availableHeight = null\n ,\n x = d3.scale.ordinal()\n ,\n y = {}\n ,\n undefinedValuesLabel = 'undefined values'\n ,\n dimensionData = []\n ,\n enabledDimensions = []\n ,\n dimensionNames = []\n ,\n displayBrush = true\n ,\n color = nv.utils.defaultColor()\n ,\n filters = []\n ,\n active = []\n ,\n dragging = []\n ,\n axisWithUndefinedValues = []\n ,\n lineTension = 1\n ,\n foreground\n ,\n background\n ,\n dimensions\n ,\n line = d3.svg.line()\n ,\n axis = d3.svg.axis()\n ,\n dispatch = d3.dispatch('brushstart', 'brush', 'brushEnd', 'dimensionsOrder', 'stateChange', 'elementClick',\n 'elementMouseover', 'elementMouseout', 'elementMousemove', 'renderEnd', 'activeChanged')\n ;\n\n //============================================================\n // Private Variables\n //------------------------------------------------------------\n\n var renderWatch = nv.utils.renderWatch(dispatch);\n\n function chart(selection) {\n renderWatch.reset();\n selection.each(function(data) {\n var container = d3.select(this);\n availableWidth = nv.utils.availableWidth(width, container, margin);\n availableHeight = nv.utils.availableHeight(height, container, margin);\n\n nv.utils.initSVG(container);\n\n //Convert old data to new format (name, values)\n if (data[0].values === undefined) {\n var newData = [];\n data.forEach(function(d) {\n var val = {};\n var key = Object.keys(d);\n key.forEach(function(k) {\n if (k !== 'name') val[k] = d[k];\n });\n newData.push({key: d.name, values: val});\n });\n data = newData;\n }\n\n var dataValues = data.map(function(d) {\n return d.values;\n });\n if (active.length === 0) {\n active = data;\n }\n ; //set all active before first brush call\n\n dimensionNames = dimensionData.sort(function(a, b) {\n return a.currentPosition - b.currentPosition;\n }).map(function(d) {\n return d.key;\n });\n enabledDimensions = dimensionData.filter(function(d) {\n return !d.disabled;\n });\n\n // Setup Scales\n x.rangePoints([0, availableWidth], 1).domain(enabledDimensions.map(function(d) {\n return d.key;\n }));\n\n //Set as true if all values on an axis are missing.\n // Extract the list of dimensions and create a scale for each.\n var oldDomainMaxValue = {};\n var displayMissingValuesline = false;\n var currentTicks = [];\n\n dimensionNames.forEach(function(d) {\n var extent = d3.extent(dataValues, function(p) {\n return +p[d];\n });\n var min = extent[0];\n var max = extent[1];\n var onlyUndefinedValues = false;\n //If there is no values to display on an axis, set the extent to 0\n if (isNaN(min) || isNaN(max)) {\n onlyUndefinedValues = true;\n min = 0;\n max = 0;\n }\n //Scale axis if there is only one value\n if (min === max) {\n min = min - 1;\n max = max + 1;\n }\n var f = filters.filter(function(k) {\n return k.dimension == d;\n });\n if (f.length !== 0) {\n //If there is only NaN values, keep the existing domain.\n if (onlyUndefinedValues) {\n min = y[d].domain()[0];\n max = y[d].domain()[1];\n }\n //If the brush extent is > max (< min), keep the extent value.\n else if (!f[0].hasOnlyNaN && displayBrush) {\n min = min > f[0].extent[0] ? f[0].extent[0] : min;\n max = max < f[0].extent[1] ? f[0].extent[1] : max;\n }\n //If there is NaN values brushed be sure the brush extent is on the domain.\n else if (f[0].hasNaN) {\n max = max < f[0].extent[1] ? f[0].extent[1] : max;\n oldDomainMaxValue[d] = y[d].domain()[1];\n displayMissingValuesline = true;\n }\n }\n //Use 90% of (availableHeight - 12) for the axis range, 12 reprensenting the space necessary to display\n // \"undefined values\" text. The remaining 10% are used to display the missingValue line.\n y[d] = d3.scale.linear()\n .domain([min, max])\n .range([(availableHeight - 12) * 0.9, 0]);\n\n axisWithUndefinedValues = [];\n y[d].brush = d3.svg.brush().y(y[d]).on('brushstart', brushstart).on('brush', brush).on('brushend', brushend);\n });\n\n // Setup containers and skeleton of chart\n var wrap = container.selectAll('g.nv-wrap.nv-parallelCoordinates').data([data]);\n var wrapEnter = wrap.enter().append('g').attr('class', 'nvd3 nv-wrap nv-parallelCoordinates');\n var gEnter = wrapEnter.append('g');\n var g = wrap.select('g');\n\n gEnter.append('g').attr('class', 'nv-parallelCoordinates background');\n gEnter.append('g').attr('class', 'nv-parallelCoordinates foreground');\n gEnter.append('g').attr('class', 'nv-parallelCoordinates missingValuesline');\n\n wrap.attr('transform', 'translate(' + margin.left + ',' + margin.top + ')');\n\n line.interpolate('cardinal').tension(lineTension);\n axis.orient('left');\n var axisDrag = d3.behavior.drag()\n .on('dragstart', dragStart)\n .on('drag', dragMove)\n .on('dragend', dragEnd);\n\n //Add missing value line at the bottom of the chart\n var missingValuesline, missingValueslineText;\n var step = x.range()[1] - x.range()[0];\n step = isNaN(step) ? x.range()[0] : step;\n if (!isNaN(step)) {\n var lineData = [0 + step / 2, availableHeight - 12, availableWidth - step / 2, availableHeight - 12];\n missingValuesline = wrap.select('.missingValuesline').selectAll('line').data([lineData]);\n missingValuesline.enter().append('line');\n missingValuesline.exit().remove();\n missingValuesline.attr('x1', function(d) {\n return d[0];\n })\n .attr('y1', function(d) {\n return d[1];\n })\n .attr('x2', function(d) {\n return d[2];\n })\n .attr('y2', function(d) {\n return d[3];\n });\n\n //Add the text \"undefined values\" under the missing value line\n missingValueslineText = wrap.select('.missingValuesline').selectAll('text').data([undefinedValuesLabel]);\n missingValueslineText.append('text').data([undefinedValuesLabel]);\n missingValueslineText.enter().append('text');\n missingValueslineText.exit().remove();\n missingValueslineText.attr('y', availableHeight)\n //To have the text right align with the missingValues line, substract 92 representing the text size.\n .attr('x', availableWidth - 92 - step / 2)\n .text(function(d) {\n return d;\n });\n }\n // Add grey background lines for context.\n background = wrap.select('.background').selectAll('path').data(data);\n background.enter().append('path');\n background.exit().remove();\n background.attr('d', path);\n\n // Add blue foreground lines for focus.\n foreground = wrap.select('.foreground').selectAll('path').data(data);\n foreground.enter().append('path');\n foreground.exit().remove();\n foreground.attr('d', path)\n .style('stroke-width', function(d, i) {\n if (isNaN(d.strokeWidth)) {\n d.strokeWidth = 1;\n }\n return d.strokeWidth;\n })\n .attr('stroke', function(d, i) {\n return d.color || color(d, i);\n });\n foreground.on('mouseover', function(d, i) {\n d3.select(this).classed('hover', true).style('stroke-width', d.strokeWidth + 2 + 'px').style('stroke-opacity',\n 1);\n dispatch.elementMouseover({\n label: d.name,\n color: d.color || color(d, i),\n values: d.values,\n dimensions: enabledDimensions\n });\n\n });\n foreground.on('mouseout', function(d, i) {\n d3.select(this).classed('hover', false).style('stroke-width', d.strokeWidth + 'px').style('stroke-opacity',\n 0.7);\n dispatch.elementMouseout({\n label: d.name,\n index: i\n });\n });\n foreground.on('mousemove', function(d, i) {\n dispatch.elementMousemove();\n });\n foreground.on('click', function(d) {\n dispatch.elementClick({\n id: d.id\n });\n });\n // Add a group element for each dimension.\n dimensions = g.selectAll('.dimension').data(enabledDimensions);\n var dimensionsEnter = dimensions.enter().append('g').attr('class', 'nv-parallelCoordinates dimension');\n\n dimensions.attr('transform', function(d) {\n return 'translate(' + x(d.key) + ',0)';\n });\n dimensionsEnter.append('g').attr('class', 'nv-axis');\n\n // Add an axis and title.\n dimensionsEnter.append('text')\n .attr('class', 'nv-label')\n .style('cursor', 'move')\n .attr('dy', '-1em')\n .attr('text-anchor', 'middle')\n .on('mouseover', function(d, i) {\n dispatch.elementMouseover({\n label: d.tooltip || d.key,\n color: d.color\n });\n })\n .on('mouseout', function(d, i) {\n dispatch.elementMouseout({\n label: d.tooltip\n });\n })\n .on('mousemove', function(d, i) {\n dispatch.elementMousemove();\n })\n .call(axisDrag);\n\n dimensionsEnter.append('g').attr('class', 'nv-brushBackground');\n dimensions.exit().remove();\n dimensions.select('.nv-label').text(function(d) {\n return d.key;\n });\n\n // Add and store a brush for each axis.\n restoreBrush(displayBrush);\n\n var actives = dimensionNames.filter(function(p) {\n return !y[p].brush.empty();\n }),\n extents = actives.map(function(p) {\n return y[p].brush.extent();\n });\n var formerActive = active.slice(0);\n\n //Restore active values\n active = [];\n foreground.style('display', function(d) {\n var isActive = actives.every(function(p, i) {\n if ((isNaN(d.values[p]) || isNaN(parseFloat(d.values[p]))) && extents[i][0] == y[p].brush.y().domain()[0]) {\n return true;\n }\n return (extents[i][0] <= d.values[p] && d.values[p] <= extents[i][1]) && !isNaN(parseFloat(d.values[p]));\n });\n if (isActive) {\n active.push(d);\n }\n return !isActive ? 'none' : null;\n\n });\n\n if (filters.length > 0 || !nv.utils.arrayEquals(active, formerActive)) {\n dispatch.activeChanged(active);\n }\n\n // Returns the path for a given data point.\n function path(d) {\n return line(enabledDimensions.map(function(p) {\n //If value if missing, put the value on the missing value line\n if (isNaN(d.values[p.key]) || isNaN(parseFloat(d.values[p.key])) || displayMissingValuesline) {\n var domain = y[p.key].domain();\n var range = y[p.key].range();\n var min = domain[0] - (domain[1] - domain[0]) / 9;\n\n //If it's not already the case, allow brush to select undefined values\n if (axisWithUndefinedValues.indexOf(p.key) < 0) {\n\n var newscale = d3.scale.linear().domain([min, domain[1]]).range([availableHeight - 12, range[1]]);\n y[p.key].brush.y(newscale);\n axisWithUndefinedValues.push(p.key);\n }\n if (isNaN(d.values[p.key]) || isNaN(parseFloat(d.values[p.key]))) {\n return [x(p.key), y[p.key](min)];\n }\n }\n\n //If parallelCoordinate contain missing values show the missing values line otherwise, hide it.\n if (missingValuesline !== undefined) {\n if (axisWithUndefinedValues.length > 0 || displayMissingValuesline) {\n missingValuesline.style('display', 'inline');\n missingValueslineText.style('display', 'inline');\n } else {\n missingValuesline.style('display', 'none');\n missingValueslineText.style('display', 'none');\n }\n }\n return [x(p.key), y[p.key](d.values[p.key])];\n }));\n }\n\n function restoreBrush(visible) {\n filters.forEach(function(f) {\n //If filter brushed NaN values, keep the brush on the bottom of the axis.\n var brushDomain = y[f.dimension].brush.y().domain();\n if (f.hasOnlyNaN) {\n f.extent[1] = (y[f.dimension].domain()[1] - brushDomain[0]) * (f.extent[1] - f.extent[0])\n / (oldDomainMaxValue[f.dimension] - f.extent[0]) + brushDomain[0];\n }\n if (f.hasNaN) {\n f.extent[0] = brushDomain[0];\n }\n if (visible) {\n y[f.dimension].brush.extent(f.extent);\n }\n });\n\n dimensions.select('.nv-brushBackground')\n .each(function(d) {\n d3.select(this).call(y[d.key].brush);\n\n })\n .selectAll('rect')\n .attr('x', -8)\n .attr('width', 16);\n\n updateTicks();\n }\n\n // Handles a brush event, toggling the display of foreground lines.\n function brushstart() {\n //If brush aren't visible, show it before brushing again.\n if (displayBrush === false) {\n displayBrush = true;\n restoreBrush(true);\n }\n }\n\n // Handles a brush event, toggling the display of foreground lines.\n function brush() {\n actives = dimensionNames.filter(function(p) {\n return !y[p].brush.empty();\n });\n extents = actives.map(function(p) {\n return y[p].brush.extent();\n });\n\n filters = []; //erase current filters\n actives.forEach(function(d, i) {\n filters[i] = {\n dimension: d,\n extent: extents[i],\n hasNaN: false,\n hasOnlyNaN: false\n };\n });\n\n active = []; //erase current active list\n foreground.style('display', function(d) {\n var isActive = actives.every(function(p, i) {\n if ((isNaN(d.values[p]) || isNaN(parseFloat(d.values[p]))) && extents[i][0]\n == y[p].brush.y().domain()[0]) {\n return true;\n }\n return (extents[i][0] <= d.values[p] && d.values[p] <= extents[i][1]) && !isNaN(\n parseFloat(d.values[p]));\n });\n if (isActive) active.push(d);\n return isActive ? null : 'none';\n });\n\n updateTicks();\n\n dispatch.brush({\n filters: filters,\n active: active\n });\n }\n\n function brushend() {\n var hasActiveBrush = actives.length > 0 ? true : false;\n filters.forEach(function(f) {\n if (f.extent[0] === y[f.dimension].brush.y().domain()[0] && axisWithUndefinedValues.indexOf(f.dimension)\n >= 0) {\n f.hasNaN = true;\n }\n if (f.extent[1] < y[f.dimension].domain()[0]) {\n f.hasOnlyNaN = true;\n }\n });\n dispatch.brushEnd(active, hasActiveBrush);\n }\n\n function updateTicks() {\n dimensions.select('.nv-axis')\n .each(function(d, i) {\n var f = filters.filter(function(k) {\n return k.dimension == d.key;\n });\n currentTicks[d.key] = y[d.key].domain();\n\n //If brush are available, display brush extent\n if (f.length != 0 && displayBrush) {\n currentTicks[d.key] = [];\n if (f[0].extent[1] > y[d.key].domain()[0]) {\n currentTicks[d.key] = [f[0].extent[1]];\n }\n if (f[0].extent[0] >= y[d.key].domain()[0]) {\n currentTicks[d.key].push(f[0].extent[0]);\n }\n }\n\n d3.select(this).call(axis.scale(y[d.key]).tickFormat(d.format).tickValues(currentTicks[d.key]));\n });\n }\n\n function dragStart(d) {\n dragging[d.key] = this.parentNode.__origin__ = x(d.key);\n background.attr('visibility', 'hidden');\n }\n\n function dragMove(d) {\n dragging[d.key] = Math.min(availableWidth, Math.max(0, this.parentNode.__origin__ += d3.event.x));\n foreground.attr('d', path);\n enabledDimensions.sort(function(a, b) {\n return dimensionPosition(a.key) - dimensionPosition(b.key);\n });\n enabledDimensions.forEach(function(d, i) {\n return d.currentPosition = i;\n });\n x.domain(enabledDimensions.map(function(d) {\n return d.key;\n }));\n dimensions.attr('transform', function(d) {\n return 'translate(' + dimensionPosition(d.key) + ')';\n });\n }\n\n function dragEnd(d, i) {\n delete this.parentNode.__origin__;\n delete dragging[d.key];\n d3.select(this.parentNode).attr('transform', 'translate(' + x(d.key) + ')');\n foreground\n .attr('d', path);\n background\n .attr('d', path)\n .attr('visibility', null);\n\n dispatch.dimensionsOrder(enabledDimensions);\n }\n\n function dimensionPosition(d) {\n var v = dragging[d];\n return v == null ? x(d) : v;\n }\n });\n return chart;\n }\n\n //============================================================\n // Expose Public Variables\n //------------------------------------------------------------\n\n chart.dispatch = dispatch;\n chart.options = nv.utils.optionsFunc.bind(chart);\n\n chart._options = Object.create({}, {\n // simple options, just get/set the necessary values\n width: {\n get: function() {\n return width;\n }, set: function(_) {\n width = _;\n }\n },\n height: {\n get: function() {\n return height;\n }, set: function(_) {\n height = _;\n }\n },\n dimensionData: {\n get: function() {\n return dimensionData;\n }, set: function(_) {\n dimensionData = _;\n }\n },\n displayBrush: {\n get: function() {\n return displayBrush;\n }, set: function(_) {\n displayBrush = _;\n }\n },\n filters: {\n get: function() {\n return filters;\n }, set: function(_) {\n filters = _;\n }\n },\n active: {\n get: function() {\n return active;\n }, set: function(_) {\n active = _;\n }\n },\n lineTension: {\n get: function() {\n return lineTension;\n }, set: function(_) {\n lineTension = _;\n }\n },\n undefinedValuesLabel: {\n get: function() {\n return undefinedValuesLabel;\n }, set: function(_) {\n undefinedValuesLabel = _;\n }\n },\n\n // deprecated options\n dimensions: {\n get: function() {\n return dimensionData.map(function(d) {\n return d.key;\n });\n }, set: function(_) {\n // deprecated after 1.8.1\n nv.deprecated('dimensions', 'use dimensionData instead');\n if (dimensionData.length === 0) {\n _.forEach(function(k) {\n dimensionData.push({key: k});\n });\n } else {\n _.forEach(function(k, i) {\n dimensionData[i].key = k;\n });\n }\n }\n },\n dimensionNames: {\n get: function() {\n return dimensionData.map(function(d) {\n return d.key;\n });\n }, set: function(_) {\n // deprecated after 1.8.1\n nv.deprecated('dimensionNames', 'use dimensionData instead');\n dimensionNames = [];\n if (dimensionData.length === 0) {\n _.forEach(function(k) {\n dimensionData.push({key: k});\n });\n } else {\n _.forEach(function(k, i) {\n dimensionData[i].key = k;\n });\n }\n\n }\n },\n dimensionFormats: {\n get: function() {\n return dimensionData.map(function(d) {\n return d.format;\n });\n }, set: function(_) {\n // deprecated after 1.8.1\n nv.deprecated('dimensionFormats', 'use dimensionData instead');\n if (dimensionData.length === 0) {\n _.forEach(function(f) {\n dimensionData.push({format: f});\n });\n } else {\n _.forEach(function(f, i) {\n dimensionData[i].format = f;\n });\n }\n\n }\n },\n // options that require extra logic in the setter\n margin: {\n get: function() {\n return margin;\n }, set: function(_) {\n margin.top = _.top !== undefined ? _.top : margin.top;\n margin.right = _.right !== undefined ? _.right : margin.right;\n margin.bottom = _.bottom !== undefined ? _.bottom : margin.bottom;\n margin.left = _.left !== undefined ? _.left : margin.left;\n }\n },\n color: {\n get: function() {\n return color;\n }, set: function(_) {\n color = nv.utils.getColor(_);\n }\n }\n });\n nv.utils.initOptions(chart);\n return chart;\n };\n nv.models.parallelCoordinatesChart = function() {\n 'use strict';\n //============================================================\n // Public Variables with Default Settings\n //------------------------------------------------------------\n\n var parallelCoordinates = nv.models.parallelCoordinates();\n var legend = nv.models.legend();\n var tooltip = nv.models.tooltip();\n var dimensionTooltip = nv.models.tooltip();\n\n var margin = {top: 0, right: 0, bottom: 0, left: 0}\n , marginTop = null\n , width = null\n , height = null\n , showLegend = true\n , color = nv.utils.defaultColor()\n , state = nv.utils.state()\n , dimensionData = []\n , displayBrush = true\n , defaultState = null\n , noData = null\n , nanValue = 'undefined'\n , dispatch = d3.dispatch('dimensionsOrder', 'brushEnd', 'stateChange', 'changeState', 'renderEnd')\n , controlWidth = function() {\n return showControls ? 180 : 0;\n }\n ;\n\n //============================================================\n\n //============================================================\n // Private Variables\n //------------------------------------------------------------\n\n var renderWatch = nv.utils.renderWatch(dispatch);\n\n var stateGetter = function(data) {\n return function() {\n return {\n active: data.map(function(d) {\n return !d.disabled;\n })\n };\n };\n };\n\n var stateSetter = function(data) {\n return function(state) {\n if (state.active !== undefined) {\n data.forEach(function(series, i) {\n series.disabled = !state.active[i];\n });\n }\n };\n };\n\n tooltip.contentGenerator(function(data) {\n var str = '<table><thead><tr><td class=\"legend-color-guide\"><div style=\"background-color:' + data.color\n + '\"></div></td><td><strong>' + data.key + '</strong></td></tr></thead>';\n if (data.series.length !== 0) {\n str = str + '<tbody><tr><td height =\"10px\"></td></tr>';\n data.series.forEach(function(d) {\n str = str + '<tr><td class=\"legend-color-guide\"><div style=\"background-color:' + d.color\n + '\"></div></td><td class=\"key\">' + d.key + '</td><td class=\"value\">' + d.value + '</td></tr>';\n });\n str = str + '</tbody>';\n }\n str = str + '</table>';\n return str;\n });\n\n //============================================================\n // Chart function\n //------------------------------------------------------------\n\n function chart(selection) {\n renderWatch.reset();\n renderWatch.models(parallelCoordinates);\n\n selection.each(function(data) {\n var container = d3.select(this);\n nv.utils.initSVG(container);\n\n var that = this;\n\n var availableWidth = nv.utils.availableWidth(width, container, margin),\n availableHeight = nv.utils.availableHeight(height, container, margin);\n\n chart.update = function() {\n container.call(chart);\n };\n chart.container = this;\n\n state.setter(stateSetter(dimensionData), chart.update)\n .getter(stateGetter(dimensionData))\n .update();\n\n //set state.disabled\n state.disabled = dimensionData.map(function(d) {\n return !!d.disabled;\n });\n\n //Keep dimensions position in memory\n dimensionData = dimensionData.map(function(d) {\n d.disabled = !!d.disabled;\n return d;\n });\n dimensionData.forEach(function(d, i) {\n d.originalPosition = isNaN(d.originalPosition) ? i : d.originalPosition;\n d.currentPosition = isNaN(d.currentPosition) ? i : d.currentPosition;\n });\n\n if (!defaultState) {\n var key;\n defaultState = {};\n for (key in state) {\n if (state[key] instanceof Array) {\n defaultState[key] = state[key].slice(0);\n } else {\n defaultState[key] = state[key];\n }\n }\n }\n\n // Display No Data message if there's nothing to show.\n if (!data || !data.length) {\n nv.utils.noData(chart, container);\n return chart;\n } else {\n container.selectAll('.nv-noData').remove();\n }\n\n //------------------------------------------------------------\n // Setup containers and skeleton of chart\n\n var wrap = container.selectAll('g.nv-wrap.nv-parallelCoordinatesChart').data([data]);\n var gEnter = wrap.enter().append('g').attr('class', 'nvd3 nv-wrap nv-parallelCoordinatesChart').append('g');\n\n var g = wrap.select('g');\n\n gEnter.append('g').attr('class', 'nv-parallelCoordinatesWrap');\n gEnter.append('g').attr('class', 'nv-legendWrap');\n\n g.select('rect')\n .attr('width', availableWidth)\n .attr('height', (availableHeight > 0) ? availableHeight : 0);\n\n // Legend\n if (!showLegend) {\n g.select('.nv-legendWrap').selectAll('*').remove();\n } else {\n legend.width(availableWidth)\n .color(function(d) {\n return 'rgb(188,190,192)';\n });\n\n g.select('.nv-legendWrap')\n .datum(dimensionData.sort(function(a, b) {\n return a.originalPosition - b.originalPosition;\n }))\n .call(legend);\n\n if (!marginTop && legend.height() !== margin.top) {\n margin.top = legend.height();\n availableHeight = nv.utils.availableHeight(height, container, margin);\n }\n wrap.select('.nv-legendWrap')\n .attr('transform', 'translate( 0 ,' + (-margin.top) + ')');\n }\n wrap.attr('transform', 'translate(' + margin.left + ',' + margin.top + ')');\n\n // Main Chart Component(s)\n parallelCoordinates\n .width(availableWidth)\n .height(availableHeight)\n .dimensionData(dimensionData)\n .displayBrush(displayBrush);\n\n var parallelCoordinatesWrap = g.select('.nv-parallelCoordinatesWrap ')\n .datum(data);\n\n parallelCoordinatesWrap.transition().call(parallelCoordinates);\n\n //============================================================\n // Event Handling/Dispatching (in chart's scope)\n //------------------------------------------------------------\n //Display reset brush button\n parallelCoordinates.dispatch.on('brushEnd', function(active, hasActiveBrush) {\n if (hasActiveBrush) {\n displayBrush = true;\n dispatch.brushEnd(active);\n } else {\n\n displayBrush = false;\n }\n });\n\n legend.dispatch.on('stateChange', function(newState) {\n for (var key in newState) {\n state[key] = newState[key];\n }\n dispatch.stateChange(state);\n chart.update();\n });\n\n //Update dimensions order and display reset sorting button\n parallelCoordinates.dispatch.on('dimensionsOrder', function(e) {\n dimensionData.sort(function(a, b) {\n return a.currentPosition - b.currentPosition;\n });\n var isSorted = false;\n dimensionData.forEach(function(d, i) {\n d.currentPosition = i;\n if (d.currentPosition !== d.originalPosition) {\n isSorted = true;\n }\n });\n dispatch.dimensionsOrder(dimensionData, isSorted);\n });\n\n // Update chart from a state object passed to event handler\n dispatch.on('changeState', function(e) {\n\n if (typeof e.disabled !== 'undefined') {\n dimensionData.forEach(function(series, i) {\n series.disabled = e.disabled[i];\n });\n state.disabled = e.disabled;\n }\n chart.update();\n });\n });\n\n renderWatch.renderEnd('parraleleCoordinateChart immediate');\n return chart;\n }\n\n //============================================================\n // Event Handling/Dispatching (out of chart's scope)\n //------------------------------------------------------------\n\n parallelCoordinates.dispatch.on('elementMouseover.tooltip', function(evt) {\n var tp = {\n key: evt.label,\n color: evt.color,\n series: []\n };\n if (evt.values) {\n Object.keys(evt.values).forEach(function(d) {\n var dim = evt.dimensions.filter(function(dd) {\n return dd.key === d;\n })[0];\n if (dim) {\n var v;\n if (isNaN(evt.values[d]) || isNaN(parseFloat(evt.values[d]))) {\n v = nanValue;\n } else {\n v = dim.format(evt.values[d]);\n }\n tp.series.push({idx: dim.currentPosition, key: d, value: v, color: dim.color});\n }\n });\n tp.series.sort(function(a, b) {\n return a.idx - b.idx;\n });\n }\n tooltip.data(tp).hidden(false);\n });\n\n parallelCoordinates.dispatch.on('elementMouseout.tooltip', function(evt) {\n tooltip.hidden(true);\n });\n\n parallelCoordinates.dispatch.on('elementMousemove.tooltip', function() {\n tooltip();\n });\n //============================================================\n // Expose Public Variables\n //------------------------------------------------------------\n\n // expose chart's sub-components\n chart.dispatch = dispatch;\n chart.parallelCoordinates = parallelCoordinates;\n chart.legend = legend;\n chart.tooltip = tooltip;\n chart.options = nv.utils.optionsFunc.bind(chart);\n\n chart._options = Object.create({}, {\n // simple options, just get/set the necessary values\n width: {\n get: function() {\n return width;\n }, set: function(_) {\n width = _;\n }\n },\n height: {\n get: function() {\n return height;\n }, set: function(_) {\n height = _;\n }\n },\n showLegend: {\n get: function() {\n return showLegend;\n }, set: function(_) {\n showLegend = _;\n }\n },\n defaultState: {\n get: function() {\n return defaultState;\n }, set: function(_) {\n defaultState = _;\n }\n },\n dimensionData: {\n get: function() {\n return dimensionData;\n }, set: function(_) {\n dimensionData = _;\n }\n },\n displayBrush: {\n get: function() {\n return displayBrush;\n }, set: function(_) {\n displayBrush = _;\n }\n },\n noData: {\n get: function() {\n return noData;\n }, set: function(_) {\n noData = _;\n }\n },\n nanValue: {\n get: function() {\n return nanValue;\n }, set: function(_) {\n nanValue = _;\n }\n },\n\n // options that require extra logic in the setter\n margin: {\n get: function() {\n return margin;\n },\n set: function(_) {\n if (_.top !== undefined) {\n margin.top = _.top;\n marginTop = _.top;\n }\n margin.right = _.right !== undefined ? _.right : margin.right;\n margin.bottom = _.bottom !== undefined ? _.bottom : margin.bottom;\n margin.left = _.left !== undefined ? _.left : margin.left;\n }\n },\n color: {\n get: function() {\n return color;\n }, set: function(_) {\n color = nv.utils.getColor(_);\n legend.color(color);\n parallelCoordinates.color(color);\n }\n }\n });\n\n nv.utils.inheritOptions(chart, parallelCoordinates);\n nv.utils.initOptions(chart);\n\n return chart;\n };\n nv.models.pie = function() {\n 'use strict';\n\n //============================================================\n // Public Variables with Default Settings\n //------------------------------------------------------------\n\n var margin = {top: 0, right: 0, bottom: 0, left: 0}\n ,\n width = 500\n ,\n height = 500\n ,\n getX = function(d) {\n return d.x;\n }\n ,\n getY = function(d) {\n return d.y;\n }\n ,\n id = Math.floor(Math.random() * 10000) //Create semi-unique ID in case user doesn't select one\n ,\n container = null\n ,\n color = nv.utils.defaultColor()\n ,\n valueFormat = d3.format(',.2f')\n ,\n showLabels = true\n ,\n labelsOutside = false\n ,\n labelType = 'key'\n ,\n labelThreshold = .02 //if slice percentage is under this, don't show label\n ,\n hideOverlapLabels = false //Hide labels that don't fit in slice\n ,\n donut = false\n ,\n title = false\n ,\n growOnHover = true\n ,\n titleOffset = 0\n ,\n labelSunbeamLayout = false\n ,\n startAngle = false\n ,\n padAngle = false\n ,\n endAngle = false\n ,\n cornerRadius = 0\n ,\n donutRatio = 0.5\n ,\n duration = 250\n ,\n arcsRadius = []\n ,\n dispatch = d3.dispatch('chartClick', 'elementClick', 'elementDblClick', 'elementMouseover', 'elementMouseout',\n 'elementMousemove', 'renderEnd')\n ;\n\n var arcs = [];\n var arcsOver = [];\n\n //============================================================\n // chart function\n //------------------------------------------------------------\n\n var renderWatch = nv.utils.renderWatch(dispatch);\n\n function chart(selection) {\n renderWatch.reset();\n selection.each(function(data) {\n var availableWidth = width - margin.left - margin.right\n , availableHeight = height - margin.top - margin.bottom\n , radius = Math.min(availableWidth, availableHeight) / 2\n , arcsRadiusOuter = []\n , arcsRadiusInner = []\n ;\n\n container = d3.select(this);\n if (arcsRadius.length === 0) {\n var outer = radius - radius / 10;\n var inner = donutRatio * radius;\n for (var i = 0; i < data[0].length; i++) {\n arcsRadiusOuter.push(outer);\n arcsRadiusInner.push(inner);\n }\n } else {\n if (growOnHover) {\n arcsRadiusOuter = arcsRadius.map(function(d) {\n return (d.outer - d.outer / 10) * radius;\n });\n arcsRadiusInner = arcsRadius.map(function(d) {\n return (d.inner - d.inner / 10) * radius;\n });\n donutRatio = d3.min(arcsRadius.map(function(d) {\n return (d.inner - d.inner / 10);\n }));\n } else {\n arcsRadiusOuter = arcsRadius.map(function(d) {\n return d.outer * radius;\n });\n arcsRadiusInner = arcsRadius.map(function(d) {\n return d.inner * radius;\n });\n donutRatio = d3.min(arcsRadius.map(function(d) {\n return d.inner;\n }));\n }\n }\n nv.utils.initSVG(container);\n\n // Setup containers and skeleton of chart\n var wrap = container.selectAll('.nv-wrap.nv-pie').data(data);\n var wrapEnter = wrap.enter().append('g').attr('class', 'nvd3 nv-wrap nv-pie nv-chart-' + id);\n var gEnter = wrapEnter.append('g');\n var g = wrap.select('g');\n var g_pie = gEnter.append('g').attr('class', 'nv-pie');\n gEnter.append('g').attr('class', 'nv-pieLabels');\n\n wrap.attr('transform', 'translate(' + margin.left + ',' + margin.top + ')');\n g.select('.nv-pie').attr('transform', 'translate(' + availableWidth / 2 + ',' + availableHeight / 2 + ')');\n g.select('.nv-pieLabels').attr('transform', 'translate(' + availableWidth / 2 + ',' + availableHeight / 2 + ')');\n\n //\n container.on('click', function(d, i) {\n dispatch.chartClick({\n data: d,\n index: i,\n pos: d3.event,\n id: id\n });\n });\n\n arcs = [];\n arcsOver = [];\n for (var i = 0; i < data[0].length; i++) {\n\n var arc = d3.svg.arc().outerRadius(arcsRadiusOuter[i]);\n var arcOver = d3.svg.arc().outerRadius(arcsRadiusOuter[i] + 5);\n\n if (startAngle !== false) {\n arc.startAngle(startAngle);\n arcOver.startAngle(startAngle);\n }\n if (endAngle !== false) {\n arc.endAngle(endAngle);\n arcOver.endAngle(endAngle);\n }\n if (donut) {\n arc.innerRadius(arcsRadiusInner[i]);\n arcOver.innerRadius(arcsRadiusInner[i]);\n }\n\n if (arc.cornerRadius && cornerRadius) {\n arc.cornerRadius(cornerRadius);\n arcOver.cornerRadius(cornerRadius);\n }\n\n arcs.push(arc);\n arcsOver.push(arcOver);\n }\n\n // Setup the Pie chart and choose the data element\n var pie = d3.layout.pie()\n .sort(null)\n .value(function(d) {\n return d.disabled ? 0 : getY(d);\n });\n\n // padAngle added in d3 3.5\n if (pie.padAngle && padAngle) {\n pie.padAngle(padAngle);\n }\n\n // if title is specified and donut, put it in the middle\n if (donut && title) {\n g_pie.append('text').attr('class', 'nv-pie-title');\n\n wrap.select('.nv-pie-title')\n .style('text-anchor', 'middle')\n .text(function(d) {\n return title;\n })\n .style('font-size',\n (Math.min(availableWidth, availableHeight)) * donutRatio * 2 / (title.length + 2) + 'px')\n .attr('dy', '0.35em') // trick to vertically center text\n .attr('transform', function(d, i) {\n return 'translate(0, ' + titleOffset + ')';\n });\n }\n\n var slices = wrap.select('.nv-pie').selectAll('.nv-slice').data(pie);\n var pieLabels = wrap.select('.nv-pieLabels').selectAll('.nv-label').data(pie);\n\n slices.exit().remove();\n pieLabels.exit().remove();\n\n var ae = slices.enter().append('g');\n ae.attr('class', 'nv-slice');\n ae.on('mouseover', function(d, i) {\n d3.select(this).classed('hover', true);\n if (growOnHover) {\n d3.select(this).select('path').transition()\n .duration(70)\n .attr('d', arcsOver[i]);\n }\n dispatch.elementMouseover({\n data: d.data,\n index: i,\n color: d3.select(this).style('fill'),\n percent: (d.endAngle - d.startAngle) / (2 * Math.PI)\n });\n });\n ae.on('mouseout', function(d, i) {\n d3.select(this).classed('hover', false);\n if (growOnHover) {\n d3.select(this).select('path').transition()\n .duration(50)\n .attr('d', arcs[i]);\n }\n dispatch.elementMouseout({data: d.data, index: i});\n });\n ae.on('mousemove', function(d, i) {\n dispatch.elementMousemove({data: d.data, index: i});\n });\n ae.on('click', function(d, i) {\n var element = this;\n dispatch.elementClick({\n data: d.data,\n index: i,\n color: d3.select(this).style('fill'),\n event: d3.event,\n element: element\n });\n });\n ae.on('dblclick', function(d, i) {\n dispatch.elementDblClick({\n data: d.data,\n index: i,\n color: d3.select(this).style('fill')\n });\n });\n\n slices.attr('fill', function(d, i) {\n return color(d.data, i);\n });\n slices.attr('stroke', function(d, i) {\n return color(d.data, i);\n });\n\n var paths = ae.append('path').each(function(d) {\n this._current = d;\n });\n\n slices.select('path')\n .transition()\n .duration(duration)\n .attr('d', function(d, i) {\n return arcs[i](d);\n })\n .attrTween('d', arcTween);\n\n if (showLabels) {\n // This does the normal label\n var labelsArc = [];\n for (var i = 0; i < data[0].length; i++) {\n labelsArc.push(arcs[i]);\n\n if (labelsOutside) {\n if (donut) {\n labelsArc[i] = d3.svg.arc().outerRadius(arcs[i].outerRadius());\n if (startAngle !== false) labelsArc[i].startAngle(startAngle);\n if (endAngle !== false) labelsArc[i].endAngle(endAngle);\n }\n } else if (!donut) {\n labelsArc[i].innerRadius(0);\n }\n }\n\n pieLabels.enter().append('g').classed('nv-label', true).each(function(d, i) {\n var group = d3.select(this);\n\n group.attr('transform', function(d, i) {\n if (labelSunbeamLayout) {\n d.outerRadius = arcsRadiusOuter[i] + 10; // Set Outer Coordinate\n d.innerRadius = arcsRadiusOuter[i] + 15; // Set Inner Coordinate\n var rotateAngle = (d.startAngle + d.endAngle) / 2 * (180 / Math.PI);\n if ((d.startAngle + d.endAngle) / 2 < Math.PI) {\n rotateAngle -= 90;\n } else {\n rotateAngle += 90;\n }\n return 'translate(' + labelsArc[i].centroid(d) + ') rotate(' + rotateAngle + ')';\n } else {\n d.outerRadius = radius + 10; // Set Outer Coordinate\n d.innerRadius = radius + 15; // Set Inner Coordinate\n return 'translate(' + labelsArc[i].centroid(d) + ')';\n }\n });\n\n group.append('rect')\n .style('stroke', '#fff')\n .style('fill', '#fff')\n .attr('rx', 3)\n .attr('ry', 3);\n\n group.append('text')\n .style('text-anchor', labelSunbeamLayout ? ((d.startAngle + d.endAngle) / 2 < Math.PI ? 'start' : 'end')\n : 'middle') //center the text on it's origin or begin/end if orthogonal aligned\n .style('fill', '#000');\n });\n\n var labelLocationHash = {};\n var avgHeight = 14;\n var avgWidth = 140;\n var createHashKey = function(coordinates) {\n return Math.floor(coordinates[0] / avgWidth) * avgWidth + ',' + Math.floor(coordinates[1] / avgHeight)\n * avgHeight;\n };\n var getSlicePercentage = function(d) {\n return (d.endAngle - d.startAngle) / (2 * Math.PI);\n };\n\n pieLabels.watchTransition(renderWatch, 'pie labels').attr('transform', function(d, i) {\n if (labelSunbeamLayout) {\n d.outerRadius = arcsRadiusOuter[i] + 10; // Set Outer Coordinate\n d.innerRadius = arcsRadiusOuter[i] + 15; // Set Inner Coordinate\n var rotateAngle = (d.startAngle + d.endAngle) / 2 * (180 / Math.PI);\n if ((d.startAngle + d.endAngle) / 2 < Math.PI) {\n rotateAngle -= 90;\n } else {\n rotateAngle += 90;\n }\n return 'translate(' + labelsArc[i].centroid(d) + ') rotate(' + rotateAngle + ')';\n } else {\n d.outerRadius = radius + 10; // Set Outer Coordinate\n d.innerRadius = radius + 15; // Set Inner Coordinate\n\n /*\n Overlapping pie labels are not good. What this attempts to do is, prevent overlapping.\n Each label location is hashed, and if a hash collision occurs, we assume an overlap.\n Adjust the label's y-position to remove the overlap.\n */\n var center = labelsArc[i].centroid(d);\n var percent = getSlicePercentage(d);\n if (d.value && percent >= labelThreshold) {\n var hashKey = createHashKey(center);\n if (labelLocationHash[hashKey]) {\n center[1] -= avgHeight;\n }\n labelLocationHash[createHashKey(center)] = true;\n }\n return 'translate(' + center + ')';\n }\n });\n\n pieLabels.select('.nv-label text')\n .style('text-anchor', function(d, i) {\n //center the text on it's origin or begin/end if orthogonal aligned\n return labelSunbeamLayout ? ((d.startAngle + d.endAngle) / 2 < Math.PI ? 'start' : 'end') : 'middle';\n })\n .text(function(d, i) {\n var percent = getSlicePercentage(d);\n var label = '';\n if (!d.value || percent < labelThreshold) return '';\n\n if (typeof labelType === 'function') {\n label = labelType(d, i, {\n 'key': getX(d.data),\n 'value': getY(d.data),\n 'percent': valueFormat(percent)\n });\n } else {\n switch (labelType) {\n case 'key':\n label = getX(d.data);\n break;\n case 'value':\n label = valueFormat(getY(d.data));\n break;\n case 'percent':\n label = d3.format('%')(percent);\n break;\n }\n }\n return label;\n })\n ;\n\n if (hideOverlapLabels) {\n pieLabels\n .each(function(d, i) {\n if (!this.getBBox) return;\n var bb = this.getBBox(),\n center = labelsArc[i].centroid(d);\n var topLeft = {\n x: center[0] + bb.x,\n y: center[1] + bb.y\n };\n\n var topRight = {\n x: topLeft.x + bb.width,\n y: topLeft.y\n };\n\n var bottomLeft = {\n x: topLeft.x,\n y: topLeft.y + bb.height\n };\n\n var bottomRight = {\n x: topLeft.x + bb.width,\n y: topLeft.y + bb.height\n };\n\n d.visible = nv.utils.pointIsInArc(topLeft, d, arc) &&\n nv.utils.pointIsInArc(topRight, d, arc) &&\n nv.utils.pointIsInArc(bottomLeft, d, arc) &&\n nv.utils.pointIsInArc(bottomRight, d, arc);\n })\n .style('display', function(d) {\n return d.visible ? null : 'none';\n })\n ;\n }\n\n }\n\n\n // Computes the angle of an arc, converting from radians to degrees.\n function angle(d) {\n var a = (d.startAngle + d.endAngle) * 90 / Math.PI - 90;\n return a > 90 ? a - 180 : a;\n }\n\n function arcTween(a, idx) {\n a.endAngle = isNaN(a.endAngle) ? 0 : a.endAngle;\n a.startAngle = isNaN(a.startAngle) ? 0 : a.startAngle;\n if (!donut) a.innerRadius = 0;\n var i = d3.interpolate(this._current, a);\n this._current = i(0);\n return function(t) {\n return arcs[idx](i(t));\n };\n }\n });\n\n renderWatch.renderEnd('pie immediate');\n return chart;\n }\n\n //============================================================\n // Expose Public Variables\n //------------------------------------------------------------\n\n chart.dispatch = dispatch;\n chart.options = nv.utils.optionsFunc.bind(chart);\n\n chart._options = Object.create({}, {\n // simple options, just get/set the necessary values\n arcsRadius: {\n get: function() {\n return arcsRadius;\n }, set: function(_) {\n arcsRadius = _;\n }\n },\n width: {\n get: function() {\n return width;\n }, set: function(_) {\n width = _;\n }\n },\n height: {\n get: function() {\n return height;\n }, set: function(_) {\n height = _;\n }\n },\n showLabels: {\n get: function() {\n return showLabels;\n }, set: function(_) {\n showLabels = _;\n }\n },\n title: {\n get: function() {\n return title;\n }, set: function(_) {\n title = _;\n }\n },\n titleOffset: {\n get: function() {\n return titleOffset;\n }, set: function(_) {\n titleOffset = _;\n }\n },\n labelThreshold: {\n get: function() {\n return labelThreshold;\n }, set: function(_) {\n labelThreshold = _;\n }\n },\n hideOverlapLabels: {\n get: function() {\n return hideOverlapLabels;\n }, set: function(_) {\n hideOverlapLabels = _;\n }\n },\n valueFormat: {\n get: function() {\n return valueFormat;\n }, set: function(_) {\n valueFormat = _;\n }\n },\n x: {\n get: function() {\n return getX;\n }, set: function(_) {\n getX = _;\n }\n },\n id: {\n get: function() {\n return id;\n }, set: function(_) {\n id = _;\n }\n },\n endAngle: {\n get: function() {\n return endAngle;\n }, set: function(_) {\n endAngle = _;\n }\n },\n startAngle: {\n get: function() {\n return startAngle;\n }, set: function(_) {\n startAngle = _;\n }\n },\n padAngle: {\n get: function() {\n return padAngle;\n }, set: function(_) {\n padAngle = _;\n }\n },\n cornerRadius: {\n get: function() {\n return cornerRadius;\n }, set: function(_) {\n cornerRadius = _;\n }\n },\n donutRatio: {\n get: function() {\n return donutRatio;\n }, set: function(_) {\n donutRatio = _;\n }\n },\n labelsOutside: {\n get: function() {\n return labelsOutside;\n }, set: function(_) {\n labelsOutside = _;\n }\n },\n labelSunbeamLayout: {\n get: function() {\n return labelSunbeamLayout;\n }, set: function(_) {\n labelSunbeamLayout = _;\n }\n },\n donut: {\n get: function() {\n return donut;\n }, set: function(_) {\n donut = _;\n }\n },\n growOnHover: {\n get: function() {\n return growOnHover;\n }, set: function(_) {\n growOnHover = _;\n }\n },\n\n // depreciated after 1.7.1\n pieLabelsOutside: {\n get: function() {\n return labelsOutside;\n }, set: function(_) {\n labelsOutside = _;\n nv.deprecated('pieLabelsOutside', 'use labelsOutside instead');\n }\n },\n // depreciated after 1.7.1\n donutLabelsOutside: {\n get: function() {\n return labelsOutside;\n }, set: function(_) {\n labelsOutside = _;\n nv.deprecated('donutLabelsOutside', 'use labelsOutside instead');\n }\n },\n // deprecated after 1.7.1\n labelFormat: {\n get: function() {\n return valueFormat;\n }, set: function(_) {\n valueFormat = _;\n nv.deprecated('labelFormat', 'use valueFormat instead');\n }\n },\n\n // options that require extra logic in the setter\n margin: {\n get: function() {\n return margin;\n }, set: function(_) {\n margin.top = typeof _.top != 'undefined' ? _.top : margin.top;\n margin.right = typeof _.right != 'undefined' ? _.right : margin.right;\n margin.bottom = typeof _.bottom != 'undefined' ? _.bottom : margin.bottom;\n margin.left = typeof _.left != 'undefined' ? _.left : margin.left;\n }\n },\n duration: {\n get: function() {\n return duration;\n }, set: function(_) {\n duration = _;\n renderWatch.reset(duration);\n }\n },\n y: {\n get: function() {\n return getY;\n }, set: function(_) {\n getY = d3.functor(_);\n }\n },\n color: {\n get: function() {\n return color;\n }, set: function(_) {\n color = nv.utils.getColor(_);\n }\n },\n labelType: {\n get: function() {\n return labelType;\n }, set: function(_) {\n labelType = _ || 'key';\n }\n }\n });\n\n nv.utils.initOptions(chart);\n return chart;\n };\n nv.models.pieChart = function() {\n 'use strict';\n\n //============================================================\n // Public Variables with Default Settings\n //------------------------------------------------------------\n\n var pie = nv.models.pie();\n var legend = nv.models.legend();\n var tooltip = nv.models.tooltip();\n\n var margin = {top: 30, right: 20, bottom: 20, left: 20}\n , marginTop = null\n , width = null\n , height = null\n , showTooltipPercent = false\n , showLegend = true\n , legendPosition = 'top'\n , color = nv.utils.defaultColor()\n , state = nv.utils.state()\n , defaultState = null\n , noData = null\n , duration = 250\n , dispatch = d3.dispatch('stateChange', 'changeState', 'renderEnd')\n ;\n\n tooltip\n .duration(0)\n .headerEnabled(false)\n .valueFormatter(function(d, i) {\n return pie.valueFormat()(d, i);\n });\n\n //============================================================\n // Private Variables\n //------------------------------------------------------------\n\n var renderWatch = nv.utils.renderWatch(dispatch);\n\n var stateGetter = function(data) {\n return function() {\n return {\n active: data.map(function(d) {\n return !d.disabled;\n })\n };\n };\n };\n\n var stateSetter = function(data) {\n return function(state) {\n if (state.active !== undefined) {\n data.forEach(function(series, i) {\n series.disabled = !state.active[i];\n });\n }\n };\n };\n\n //============================================================\n // Chart function\n //------------------------------------------------------------\n\n function chart(selection) {\n renderWatch.reset();\n renderWatch.models(pie);\n\n selection.each(function(data) {\n var container = d3.select(this);\n nv.utils.initSVG(container);\n\n var that = this;\n var availableWidth = nv.utils.availableWidth(width, container, margin),\n availableHeight = nv.utils.availableHeight(height, container, margin);\n\n chart.update = function() {\n container.transition().call(chart);\n };\n chart.container = this;\n\n state.setter(stateSetter(data), chart.update)\n .getter(stateGetter(data))\n .update();\n\n //set state.disabled\n state.disabled = data.map(function(d) {\n return !!d.disabled;\n });\n\n if (!defaultState) {\n var key;\n defaultState = {};\n for (key in state) {\n if (state[key] instanceof Array) {\n defaultState[key] = state[key].slice(0);\n } else {\n defaultState[key] = state[key];\n }\n }\n }\n\n // Display No Data message if there's nothing to show.\n if (!data || !data.length) {\n nv.utils.noData(chart, container);\n return chart;\n } else {\n container.selectAll('.nv-noData').remove();\n }\n\n // Setup containers and skeleton of chart\n var wrap = container.selectAll('g.nv-wrap.nv-pieChart').data([data]);\n var gEnter = wrap.enter().append('g').attr('class', 'nvd3 nv-wrap nv-pieChart').append('g');\n var g = wrap.select('g');\n\n gEnter.append('g').attr('class', 'nv-pieWrap');\n gEnter.append('g').attr('class', 'nv-legendWrap');\n\n // Legend\n if (!showLegend) {\n g.select('.nv-legendWrap').selectAll('*').remove();\n } else {\n if (legendPosition === 'top') {\n legend.width(availableWidth).key(pie.x());\n\n wrap.select('.nv-legendWrap')\n .datum(data)\n .call(legend);\n\n if (!marginTop && legend.height() !== margin.top) {\n margin.top = legend.height();\n availableHeight = nv.utils.availableHeight(height, container, margin);\n }\n\n wrap.select('.nv-legendWrap')\n .attr('transform', 'translate(0,' + (-margin.top) + ')');\n } else if (legendPosition === 'right') {\n var legendWidth = nv.models.legend().width();\n if (availableWidth / 2 < legendWidth) {\n legendWidth = (availableWidth / 2);\n }\n legend.height(availableHeight).key(pie.x());\n legend.width(legendWidth);\n availableWidth -= legend.width();\n\n wrap.select('.nv-legendWrap')\n .datum(data)\n .call(legend)\n .attr('transform', 'translate(' + (availableWidth) + ',0)');\n } else if (legendPosition === 'bottom') {\n legend.width(availableWidth).key(pie.x());\n wrap.select('.nv-legendWrap')\n .datum(data)\n .call(legend);\n\n margin.bottom = legend.height();\n availableHeight = nv.utils.availableHeight(height, container, margin);\n wrap.select('.nv-legendWrap')\n .attr('transform', 'translate(0,' + availableHeight + ')');\n }\n }\n wrap.attr('transform', 'translate(' + margin.left + ',' + margin.top + ')');\n\n // Main Chart Component(s)\n pie.width(availableWidth).height(availableHeight);\n var pieWrap = g.select('.nv-pieWrap').datum([data]);\n d3.transition(pieWrap).call(pie);\n\n //============================================================\n // Event Handling/Dispatching (in chart's scope)\n //------------------------------------------------------------\n\n legend.dispatch.on('stateChange', function(newState) {\n for (var key in newState) {\n state[key] = newState[key];\n }\n dispatch.stateChange(state);\n chart.update();\n });\n\n // Update chart from a state object passed to event handler\n dispatch.on('changeState', function(e) {\n if (typeof e.disabled !== 'undefined') {\n data.forEach(function(series, i) {\n series.disabled = e.disabled[i];\n });\n state.disabled = e.disabled;\n }\n chart.update();\n });\n });\n\n renderWatch.renderEnd('pieChart immediate');\n return chart;\n }\n\n //============================================================\n // Event Handling/Dispatching (out of chart's scope)\n //------------------------------------------------------------\n\n pie.dispatch.on('elementMouseover.tooltip', function(evt) {\n evt['series'] = {\n key: chart.x()(evt.data),\n value: chart.y()(evt.data),\n color: evt.color,\n percent: evt.percent\n };\n if (!showTooltipPercent) {\n delete evt.percent;\n delete evt.series.percent;\n }\n tooltip.data(evt).hidden(false);\n });\n\n pie.dispatch.on('elementMouseout.tooltip', function(evt) {\n tooltip.hidden(true);\n });\n\n pie.dispatch.on('elementMousemove.tooltip', function(evt) {\n tooltip();\n });\n\n //============================================================\n // Expose Public Variables\n //------------------------------------------------------------\n\n // expose chart's sub-components\n chart.legend = legend;\n chart.dispatch = dispatch;\n chart.pie = pie;\n chart.tooltip = tooltip;\n chart.options = nv.utils.optionsFunc.bind(chart);\n\n // use Object get/set functionality to map between vars and chart functions\n chart._options = Object.create({}, {\n // simple options, just get/set the necessary values\n width: {\n get: function() {\n return width;\n }, set: function(_) {\n width = _;\n }\n },\n height: {\n get: function() {\n return height;\n }, set: function(_) {\n height = _;\n }\n },\n noData: {\n get: function() {\n return noData;\n }, set: function(_) {\n noData = _;\n }\n },\n showTooltipPercent: {\n get: function() {\n return showTooltipPercent;\n }, set: function(_) {\n showTooltipPercent = _;\n }\n },\n showLegend: {\n get: function() {\n return showLegend;\n }, set: function(_) {\n showLegend = _;\n }\n },\n legendPosition: {\n get: function() {\n return legendPosition;\n }, set: function(_) {\n legendPosition = _;\n }\n },\n defaultState: {\n get: function() {\n return defaultState;\n }, set: function(_) {\n defaultState = _;\n }\n },\n\n // options that require extra logic in the setter\n color: {\n get: function() {\n return color;\n }, set: function(_) {\n color = _;\n legend.color(color);\n pie.color(color);\n }\n },\n duration: {\n get: function() {\n return duration;\n }, set: function(_) {\n duration = _;\n renderWatch.reset(duration);\n pie.duration(duration);\n }\n },\n margin: {\n get: function() {\n return margin;\n }, set: function(_) {\n if (_.top !== undefined) {\n margin.top = _.top;\n marginTop = _.top;\n }\n margin.right = _.right !== undefined ? _.right : margin.right;\n margin.bottom = _.bottom !== undefined ? _.bottom : margin.bottom;\n margin.left = _.left !== undefined ? _.left : margin.left;\n }\n }\n });\n nv.utils.inheritOptions(chart, pie);\n nv.utils.initOptions(chart);\n return chart;\n };\n nv.models.sankey = function() {\n 'use strict';\n\n // Sources:\n // - https://bost.ocks.org/mike/sankey/\n // - https://github.com/soxofaan/d3-plugin-captain-sankey\n\n //============================================================\n // Public Variables with Default Settings\n //------------------------------------------------------------\n\n var sankey = {},\n nodeWidth = 24,\n nodePadding = 8,\n size = [1, 1],\n nodes = [],\n links = [],\n sinksRight = true;\n\n var layout = function(iterations) {\n computeNodeLinks();\n computeNodeValues();\n computeNodeBreadths();\n computeNodeDepths(iterations);\n };\n\n var relayout = function() {\n computeLinkDepths();\n };\n\n // SVG path data generator, to be used as 'd' attribute on 'path' element selection.\n var link = function() {\n var curvature = .5;\n\n function link(d) {\n\n var x0 = d.source.x + d.source.dx,\n x1 = d.target.x,\n xi = d3.interpolateNumber(x0, x1),\n x2 = xi(curvature),\n x3 = xi(1 - curvature),\n y0 = d.source.y + d.sy + d.dy / 2,\n y1 = d.target.y + d.ty + d.dy / 2;\n var linkPath = 'M' + x0 + ',' + y0\n + 'C' + x2 + ',' + y0\n + ' ' + x3 + ',' + y1\n + ' ' + x1 + ',' + y1;\n return linkPath;\n }\n\n link.curvature = function(_) {\n if (!arguments.length) return curvature;\n curvature = +_;\n return link;\n };\n\n return link;\n };\n\n // Y-position of the middle of a node.\n var center = function(node) {\n return node.y + node.dy / 2;\n };\n\n //============================================================\n // Private Variables\n //------------------------------------------------------------\n\n // Populate the sourceLinks and targetLinks for each node.\n // Also, if the source and target are not objects, assume they are indices.\n function computeNodeLinks() {\n nodes.forEach(function(node) {\n // Links that have this node as source.\n node.sourceLinks = [];\n // Links that have this node as target.\n node.targetLinks = [];\n });\n links.forEach(function(link) {\n var source = link.source,\n target = link.target;\n if (typeof source === 'number') source = link.source = nodes[link.source];\n if (typeof target === 'number') target = link.target = nodes[link.target];\n source.sourceLinks.push(link);\n target.targetLinks.push(link);\n });\n }\n\n // Compute the value (size) of each node by summing the associated links.\n function computeNodeValues() {\n nodes.forEach(function(node) {\n node.value = Math.max(\n d3.sum(node.sourceLinks, value),\n d3.sum(node.targetLinks, value)\n );\n });\n }\n\n // Iteratively assign the breadth (x-position) for each node.\n // Nodes are assigned the maximum breadth of incoming neighbors plus one;\n // nodes with no incoming links are assigned breadth zero, while\n // nodes with no outgoing links are assigned the maximum breadth.\n function computeNodeBreadths() {\n //\n var remainingNodes = nodes,\n nextNodes,\n x = 0;\n\n // Work from left to right.\n // Keep updating the breath (x-position) of nodes that are target of recently updated nodes.\n //\n while (remainingNodes.length && x < nodes.length) {\n nextNodes = [];\n remainingNodes.forEach(function(node) {\n node.x = x;\n node.dx = nodeWidth;\n node.sourceLinks.forEach(function(link) {\n if (nextNodes.indexOf(link.target) < 0) {\n nextNodes.push(link.target);\n }\n });\n });\n remainingNodes = nextNodes;\n ++x;\n //\n }\n\n // Optionally move pure sinks always to the right.\n if (sinksRight) {\n moveSinksRight(x);\n }\n\n scaleNodeBreadths((size[0] - nodeWidth) / (x - 1));\n }\n\n function moveSourcesRight() {\n nodes.forEach(function(node) {\n if (!node.targetLinks.length) {\n node.x = d3.min(node.sourceLinks, function(d) {\n return d.target.x;\n }) - 1;\n }\n });\n }\n\n function moveSinksRight(x) {\n nodes.forEach(function(node) {\n if (!node.sourceLinks.length) {\n node.x = x - 1;\n }\n });\n }\n\n function scaleNodeBreadths(kx) {\n nodes.forEach(function(node) {\n node.x *= kx;\n });\n }\n\n // Compute the depth (y-position) for each node.\n function computeNodeDepths(iterations) {\n // Group nodes by breath.\n var nodesByBreadth = d3.nest()\n .key(function(d) {\n return d.x;\n })\n .sortKeys(d3.ascending)\n .entries(nodes)\n .map(function(d) {\n return d.values;\n });\n\n //\n initializeNodeDepth();\n resolveCollisions();\n computeLinkDepths();\n for (var alpha = 1; iterations > 0; --iterations) {\n relaxRightToLeft(alpha *= .99);\n resolveCollisions();\n computeLinkDepths();\n relaxLeftToRight(alpha);\n resolveCollisions();\n computeLinkDepths();\n }\n\n function initializeNodeDepth() {\n // Calculate vertical scaling factor.\n var ky = d3.min(nodesByBreadth, function(nodes) {\n return (size[1] - (nodes.length - 1) * nodePadding) / d3.sum(nodes, value);\n });\n\n nodesByBreadth.forEach(function(nodes) {\n nodes.forEach(function(node, i) {\n node.y = i;\n node.dy = node.value * ky;\n });\n });\n\n links.forEach(function(link) {\n link.dy = link.value * ky;\n });\n }\n\n function relaxLeftToRight(alpha) {\n nodesByBreadth.forEach(function(nodes, breadth) {\n nodes.forEach(function(node) {\n if (node.targetLinks.length) {\n // Value-weighted average of the y-position of source node centers linked to this node.\n var y = d3.sum(node.targetLinks, weightedSource) / d3.sum(node.targetLinks, value);\n node.y += (y - center(node)) * alpha;\n }\n });\n });\n\n function weightedSource(link) {\n return (link.source.y + link.sy + link.dy / 2) * link.value;\n }\n }\n\n function relaxRightToLeft(alpha) {\n nodesByBreadth.slice().reverse().forEach(function(nodes) {\n nodes.forEach(function(node) {\n if (node.sourceLinks.length) {\n // Value-weighted average of the y-positions of target nodes linked to this node.\n var y = d3.sum(node.sourceLinks, weightedTarget) / d3.sum(node.sourceLinks, value);\n node.y += (y - center(node)) * alpha;\n }\n });\n });\n\n function weightedTarget(link) {\n return (link.target.y + link.ty + link.dy / 2) * link.value;\n }\n }\n\n function resolveCollisions() {\n nodesByBreadth.forEach(function(nodes) {\n var node,\n dy,\n y0 = 0,\n n = nodes.length,\n i;\n\n // Push any overlapping nodes down.\n nodes.sort(ascendingDepth);\n for (i = 0; i < n; ++i) {\n node = nodes[i];\n dy = y0 - node.y;\n if (dy > 0) node.y += dy;\n y0 = node.y + node.dy + nodePadding;\n }\n\n // If the bottommost node goes outside the bounds, push it back up.\n dy = y0 - nodePadding - size[1];\n if (dy > 0) {\n y0 = node.y -= dy;\n\n // Push any overlapping nodes back up.\n for (i = n - 2; i >= 0; --i) {\n node = nodes[i];\n dy = node.y + node.dy + nodePadding - y0;\n if (dy > 0) node.y -= dy;\n y0 = node.y;\n }\n }\n });\n }\n\n function ascendingDepth(a, b) {\n return a.y - b.y;\n }\n }\n\n // Compute y-offset of the source endpoint (sy) and target endpoints (ty) of links,\n // relative to the source/target node's y-position.\n function computeLinkDepths() {\n nodes.forEach(function(node) {\n node.sourceLinks.sort(ascendingTargetDepth);\n node.targetLinks.sort(ascendingSourceDepth);\n });\n nodes.forEach(function(node) {\n var sy = 0, ty = 0;\n node.sourceLinks.forEach(function(link) {\n link.sy = sy;\n sy += link.dy;\n });\n node.targetLinks.forEach(function(link) {\n link.ty = ty;\n ty += link.dy;\n });\n });\n\n function ascendingSourceDepth(a, b) {\n return a.source.y - b.source.y;\n }\n\n function ascendingTargetDepth(a, b) {\n return a.target.y - b.target.y;\n }\n }\n\n // Value property accessor.\n function value(x) {\n return x.value;\n }\n\n sankey.options = nv.utils.optionsFunc.bind(sankey);\n sankey._options = Object.create({}, {\n nodeWidth: {\n get: function() {\n return nodeWidth;\n }, set: function(_) {\n nodeWidth = +_;\n }\n },\n nodePadding: {\n get: function() {\n return nodePadding;\n }, set: function(_) {\n nodePadding = _;\n }\n },\n nodes: {\n get: function() {\n return nodes;\n }, set: function(_) {\n nodes = _;\n }\n },\n links: {\n get: function() {\n return links;\n }, set: function(_) {\n links = _;\n }\n },\n size: {\n get: function() {\n return size;\n }, set: function(_) {\n size = _;\n }\n },\n sinksRight: {\n get: function() {\n return sinksRight;\n }, set: function(_) {\n sinksRight = _;\n }\n },\n\n layout: {\n get: function() {\n layout(32);\n }, set: function(_) {\n layout(_);\n }\n },\n relayout: {\n get: function() {\n relayout();\n }, set: function(_) {\n }\n },\n center: {\n get: function() {\n return center();\n }, set: function(_) {\n if (typeof _ === 'function') {\n center = _;\n }\n }\n },\n link: {\n get: function() {\n return link();\n }, set: function(_) {\n if (typeof _ === 'function') {\n link = _;\n }\n return link();\n }\n }\n });\n\n nv.utils.initOptions(sankey);\n\n return sankey;\n };\n nv.models.sankeyChart = function() {\n 'use strict';\n\n // Sources:\n // - https://bost.ocks.org/mike/sankey/\n // - https://github.com/soxofaan/d3-plugin-captain-sankey\n\n //============================================================\n // Public Variables with Default Settings\n //------------------------------------------------------------\n\n var margin = {top: 5, right: 0, bottom: 5, left: 0}\n , sankey = nv.models.sankey()\n , width = 600\n , height = 400\n , nodeWidth = 36\n , nodePadding = 40\n , units = 'units'\n , center = undefined\n ;\n\n //============================================================\n // Private Variables\n //------------------------------------------------------------\n\n var formatNumber = d3.format(',.0f'); // zero decimal places\n var format = function(d) {\n return formatNumber(d) + ' ' + units;\n };\n var color = d3.scale.category20();\n var linkTitle = function(d) {\n return d.source.name + ' → ' + d.target.name + '\\n' + format(d.value);\n };\n var nodeFillColor = function(d) {\n return d.color = color(d.name.replace(/ .*/, ''));\n };\n var nodeStrokeColor = function(d) {\n return d3.rgb(d.color).darker(2);\n };\n var nodeTitle = function(d) {\n return d.name + '\\n' + format(d.value);\n };\n\n var showError = function(element, message) {\n element.append('text')\n .attr('x', 0)\n .attr('y', 0)\n .attr('class', 'nvd3-sankey-chart-error')\n .attr('text-anchor', 'middle')\n .text(message);\n };\n\n function chart(selection) {\n selection.each(function(data) {\n\n var testData = {\n nodes:\n [\n {'node': 1, 'name': 'Test 1'},\n {'node': 2, 'name': 'Test 2'},\n {'node': 3, 'name': 'Test 3'},\n {'node': 4, 'name': 'Test 4'},\n {'node': 5, 'name': 'Test 5'},\n {'node': 6, 'name': 'Test 6'}\n ],\n links:\n [\n {'source': 0, 'target': 1, 'value': 2295},\n {'source': 0, 'target': 5, 'value': 1199},\n {'source': 1, 'target': 2, 'value': 1119},\n {'source': 1, 'target': 5, 'value': 1176},\n {'source': 2, 'target': 3, 'value': 487},\n {'source': 2, 'target': 5, 'value': 632},\n {'source': 3, 'target': 4, 'value': 301},\n {'source': 3, 'target': 5, 'value': 186}\n ]\n };\n\n // Error handling\n var isDataValid = false;\n var dataAvailable = false;\n\n // check if data is valid\n if (\n (typeof data['nodes'] === 'object' && data['nodes'].length) >= 0 &&\n (typeof data['links'] === 'object' && data['links'].length) >= 0\n ) {\n isDataValid = true;\n }\n\n // check if data is available\n if (\n data['nodes'] && data['nodes'].length > 0 &&\n data['links'] && data['links'].length > 0\n ) {\n dataAvailable = true;\n }\n\n // show error\n if (!isDataValid) {\n console.error('NVD3 Sankey chart error:', 'invalid data format for', data);\n console.info('Valid data format is: ', testData, JSON.stringify(testData));\n showError(selection, 'Error loading chart, data is invalid');\n return false;\n }\n\n // TODO use nv.utils.noData\n if (!dataAvailable) {\n showError(selection, 'No data available');\n return false;\n }\n\n // No errors, continue\n\n // append the svg canvas to the page\n var svg = selection.append('svg')\n .attr('width', width)\n .attr('height', height)\n .append('g')\n .attr('class', 'nvd3 nv-wrap nv-sankeyChart');\n\n // Set the sankey diagram properties\n sankey\n .nodeWidth(nodeWidth)\n .nodePadding(nodePadding)\n .size([width, height]);\n\n var path = sankey.link();\n\n sankey\n .nodes(data.nodes)\n .links(data.links)\n .layout(32)\n .center(center);\n\n // add in the links\n var link = svg.append('g').selectAll('.link')\n .data(data.links)\n .enter().append('path')\n .attr('class', 'link')\n .attr('d', path)\n .style('stroke-width', function(d) {\n return Math.max(1, d.dy);\n })\n .sort(function(a, b) {\n return b.dy - a.dy;\n });\n\n // add the link titles\n link.append('title')\n .text(linkTitle);\n\n // add in the nodes\n var node = svg.append('g').selectAll('.node')\n .data(data.nodes)\n .enter().append('g')\n .attr('class', 'node')\n .attr('transform', function(d) {\n return 'translate(' + d.x + ',' + d.y + ')';\n })\n .call(\n d3.behavior\n .drag()\n .origin(function(d) {\n return d;\n })\n .on('dragstart', function() {\n this.parentNode.appendChild(this);\n })\n .on('drag', dragmove)\n );\n\n // add the rectangles for the nodes\n node.append('rect')\n .attr('height', function(d) {\n return d.dy;\n })\n .attr('width', sankey.nodeWidth())\n .style('fill', nodeFillColor)\n .style('stroke', nodeStrokeColor)\n .append('title')\n .text(nodeTitle);\n\n // add in the title for the nodes\n node.append('text')\n .attr('x', -6)\n .attr('y', function(d) {\n return d.dy / 2;\n })\n .attr('dy', '.35em')\n .attr('text-anchor', 'end')\n .attr('transform', null)\n .text(function(d) {\n return d.name;\n })\n .filter(function(d) {\n return d.x < width / 2;\n })\n .attr('x', 6 + sankey.nodeWidth())\n .attr('text-anchor', 'start');\n\n // the function for moving the nodes\n function dragmove(d) {\n d3.select(this).attr('transform',\n 'translate(' + d.x + ',' + (\n d.y = Math.max(0, Math.min(height - d.dy, d3.event.y))\n ) + ')');\n sankey.relayout();\n link.attr('d', path);\n }\n });\n\n return chart;\n }\n\n //============================================================\n // Expose Public Variables\n //------------------------------------------------------------\n\n chart.options = nv.utils.optionsFunc.bind(chart);\n\n chart._options = Object.create({}, {\n // simple options, just get/set the necessary values\n units: {\n get: function() {\n return units;\n }, set: function(_) {\n units = _;\n }\n },\n width: {\n get: function() {\n return width;\n }, set: function(_) {\n width = _;\n }\n },\n height: {\n get: function() {\n return height;\n }, set: function(_) {\n height = _;\n }\n },\n format: {\n get: function() {\n return format;\n }, set: function(_) {\n format = _;\n }\n },\n linkTitle: {\n get: function() {\n return linkTitle;\n }, set: function(_) {\n linkTitle = _;\n }\n },\n nodeWidth: {\n get: function() {\n return nodeWidth;\n }, set: function(_) {\n nodeWidth = _;\n }\n },\n nodePadding: {\n get: function() {\n return nodePadding;\n }, set: function(_) {\n nodePadding = _;\n }\n },\n center: {\n get: function() {\n return center;\n }, set: function(_) {\n center = _;\n }\n },\n\n // options that require extra logic in the setter\n margin: {\n get: function() {\n return margin;\n }, set: function(_) {\n margin.top = _.top !== undefined ? _.top : margin.top;\n margin.right = _.right !== undefined ? _.right : margin.right;\n margin.bottom = _.bottom !== undefined ? _.bottom : margin.bottom;\n margin.left = _.left !== undefined ? _.left : margin.left;\n }\n },\n nodeStyle: {\n get: function() {\n return {};\n }, set: function(_) {\n nodeFillColor = _.fillColor !== undefined ? _.fillColor : nodeFillColor;\n nodeStrokeColor = _.strokeColor !== undefined ? _.strokeColor : nodeStrokeColor;\n nodeTitle = _.title !== undefined ? _.title : nodeTitle;\n }\n }\n\n });\n\n nv.utils.initOptions(chart);\n\n return chart;\n };\n\n nv.models.scatter = function() {\n 'use strict';\n\n //============================================================\n // Public Variables with Default Settings\n //------------------------------------------------------------\n\n var margin = {top: 0, right: 0, bottom: 0, left: 0}\n , width = null\n , height = null\n , color = nv.utils.defaultColor() // chooses color\n , pointBorderColor = null\n , id = Math.floor(Math.random() * 100000) //Create semi-unique ID incase user doesn't select one\n , container = null\n , x = d3.scale.linear()\n , y = d3.scale.linear()\n , z = d3.scale.linear() //linear because d3.svg.shape.size is treated as area\n , getX = function(d) {\n return d.x;\n } // accessor to get the x value\n , getY = function(d) {\n return d.y;\n } // accessor to get the y value\n , getSize = function(d) {\n return d.size || 1;\n } // accessor to get the point size\n , getShape = function(d) {\n return d.shape || 'circle';\n } // accessor to get point shape\n , forceX = [] // List of numbers to Force into the X scale (ie. 0, or a max / min, etc.)\n , forceY = [] // List of numbers to Force into the Y scale\n , forceSize = [] // List of numbers to Force into the Size scale\n , interactive = true // If true, plots a voronoi overlay for advanced point intersection\n , pointActive = function(d) {\n return !d.notActive;\n } // any points that return false will be filtered out\n , padData = false // If true, adds half a data points width to front and back, for lining up a line chart with a bar\n // chart\n , padDataOuter = .1 //outerPadding to imitate ordinal scale outer padding\n , clipEdge = false // if true, masks points within x and y scale\n , clipVoronoi = true // if true, masks each point with a circle... can turn off to slightly increase performance\n , showVoronoi = false // display the voronoi areas\n , clipRadius = function() {\n return 25;\n } // function to get the radius for voronoi point clips\n , xDomain = null // Override x domain (skips the calculation from data)\n , yDomain = null // Override y domain\n , xRange = null // Override x range\n , yRange = null // Override y range\n , sizeDomain = null // Override point size domain\n , sizeRange = null\n , singlePoint = false\n , dispatch = d3.dispatch('elementClick', 'elementDblClick', 'elementMouseover', 'elementMouseout', 'renderEnd')\n , useVoronoi = true\n , duration = 250\n , interactiveUpdateDelay = 300\n , showLabels = false\n ;\n\n\n //============================================================\n // Private Variables\n //------------------------------------------------------------\n\n var x0, y0, z0 // used to store previous scales\n , xDom, yDom // used to store previous domains\n , width0\n , height0\n , timeoutID\n , needsUpdate = false // Flag for when the points are visually updating, but the interactive layer is behind, to\n // disable tooltips\n , renderWatch = nv.utils.renderWatch(dispatch, duration)\n , _sizeRange_def = [16, 256]\n , _cache = {}\n ;\n\n //============================================================\n // Diff and Cache Utilities\n //------------------------------------------------------------\n // getDiffs is used to filter unchanged points from the update\n // selection. It implicitly updates it's cache when called and\n // therefor the diff is based upon the previous invocation NOT\n // the previous update.\n //\n // getDiffs takes a point as its first argument followed by n\n // key getter pairs (d, [key, get... key, get]) this approach\n // was chosen for efficiency. (The filter will call it a LOT).\n //\n // It is important to call delCache on point exit to prevent a\n // memory leak. It is also needed to prevent invalid caches if\n // a new point uses the same series and point id key.\n //\n // Argument Performance Concerns:\n // - Object property lists for key getter pairs would be very\n // expensive (points * objects for the GC every update).\n // - ES6 function names for implicit keys would be nice but\n // they are not guaranteed to be unique.\n // - function.toString to obtain implicit keys is possible\n // but long object keys are not free (internal hash).\n // - Explicit key without objects are the most efficient.\n\n function getCache(d) {\n var key, val;\n key = d[0].series + ':' + d[1];\n val = _cache[key] = _cache[key] || {};\n return val;\n }\n\n function delCache(d) {\n var key, val;\n key = d[0].series + ':' + d[1];\n delete _cache[key];\n }\n\n function getDiffs(d) {\n var i, key, val,\n cache = getCache(d),\n diffs = false;\n for (i = 1; i < arguments.length; i += 2) {\n key = arguments[i];\n val = arguments[i + 1](d[0], d[1]);\n if (cache[key] !== val || !cache.hasOwnProperty(key)) {\n cache[key] = val;\n diffs = true;\n }\n }\n return diffs;\n }\n\n function chart(selection) {\n renderWatch.reset();\n selection.each(function(data) {\n container = d3.select(this);\n var availableWidth = nv.utils.availableWidth(width, container, margin),\n availableHeight = nv.utils.availableHeight(height, container, margin);\n\n nv.utils.initSVG(container);\n\n //add series index to each data point for reference\n data.forEach(function(series, i) {\n series.values.forEach(function(point) {\n point.series = i;\n });\n });\n\n // Setup Scales\n var logScale = (typeof (chart.yScale().base) === 'function'); // Only log scale has a method \"base()\"\n // remap and flatten the data for use in calculating the scales' domains\n var seriesData = (xDomain && yDomain && sizeDomain) ? [] : // if we know xDomain and yDomain and sizeDomain, no need to calculate.... if Size is constant\n // remember to set sizeDomain to speed up performance\n d3.merge(\n data.map(function(d) {\n return d.values.map(function(d, i) {\n return {x: getX(d, i), y: getY(d, i), size: getSize(d, i)};\n });\n })\n );\n\n x.domain(xDomain || d3.extent(seriesData.map(function(d) {\n return d.x;\n }).concat(forceX)));\n\n if (padData && data[0]) {\n x.range(xRange || [(availableWidth * padDataOuter + availableWidth) / (2 * data[0].values.length),\n availableWidth - availableWidth * (1 + padDataOuter) / (2 * data[0].values.length)]);\n }//x.range([availableWidth * .5 / data[0].values.length, availableWidth * (data[0].values.length - .5) /\n // data[0].values.length ]);\n else {\n x.range(xRange || [0, availableWidth]);\n }\n\n if (logScale) {\n var min = d3.min(seriesData.map(function(d) {\n if (d.y !== 0) return d.y;\n }));\n y.clamp(true)\n .domain(yDomain || d3.extent(seriesData.map(function(d) {\n if (d.y !== 0) {\n return d.y;\n } else {\n return min * 0.1;\n }\n }).concat(forceY)))\n .range(yRange || [availableHeight, 0]);\n } else {\n y.domain(yDomain || d3.extent(seriesData.map(function(d) {\n return d.y;\n }).concat(forceY)))\n .range(yRange || [availableHeight, 0]);\n }\n\n z.domain(sizeDomain || d3.extent(seriesData.map(function(d) {\n return d.size;\n }).concat(forceSize)))\n .range(sizeRange || _sizeRange_def);\n\n // If scale's domain don't have a range, slightly adjust to make one... so a chart can show a single data point\n singlePoint = x.domain()[0] === x.domain()[1] || y.domain()[0] === y.domain()[1];\n\n if (x.domain()[0] === x.domain()[1]) {\n x.domain()[0] ?\n x.domain([x.domain()[0] - x.domain()[0] * 0.01, x.domain()[1] + x.domain()[1] * 0.01])\n : x.domain([-1, 1]);\n }\n\n if (y.domain()[0] === y.domain()[1]) {\n y.domain()[0] ?\n y.domain([y.domain()[0] - y.domain()[0] * 0.01, y.domain()[1] + y.domain()[1] * 0.01])\n : y.domain([-1, 1]);\n }\n\n if (isNaN(x.domain()[0])) {\n x.domain([-1, 1]);\n }\n\n if (isNaN(y.domain()[0])) {\n y.domain([-1, 1]);\n }\n\n x0 = x0 || x;\n y0 = y0 || y;\n z0 = z0 || z;\n\n var scaleDiff = x(1) !== x0(1) || y(1) !== y0(1) || z(1) !== z0(1);\n\n width0 = width0 || width;\n height0 = height0 || height;\n\n var sizeDiff = width0 !== width || height0 !== height;\n\n // Domain Diffs\n\n xDom = xDom || [];\n var domainDiff = xDom[0] !== x.domain()[0] || xDom[1] !== x.domain()[1];\n xDom = x.domain();\n\n yDom = yDom || [];\n domainDiff = domainDiff || yDom[0] !== y.domain()[0] || yDom[1] !== y.domain()[1];\n yDom = y.domain();\n\n // Setup containers and skeleton of chart\n var wrap = container.selectAll('g.nv-wrap.nv-scatter').data([data]);\n var wrapEnter = wrap.enter().append('g').attr('class', 'nvd3 nv-wrap nv-scatter nv-chart-' + id);\n var defsEnter = wrapEnter.append('defs');\n var gEnter = wrapEnter.append('g');\n var g = wrap.select('g');\n\n wrap.classed('nv-single-point', singlePoint);\n gEnter.append('g').attr('class', 'nv-groups');\n gEnter.append('g').attr('class', 'nv-point-paths');\n wrapEnter.append('g').attr('class', 'nv-point-clips');\n\n wrap.attr('transform', 'translate(' + margin.left + ',' + margin.top + ')');\n\n defsEnter.append('clipPath')\n .attr('id', 'nv-edge-clip-' + id)\n .append('rect')\n .attr('transform', 'translate( -10, -10)');\n\n wrap.select('#nv-edge-clip-' + id + ' rect')\n .attr('width', availableWidth + 20)\n .attr('height', (availableHeight > 0) ? availableHeight + 20 : 0);\n\n g.attr('clip-path', clipEdge ? 'url(#nv-edge-clip-' + id + ')' : '');\n\n function updateInteractiveLayer() {\n // Always clear needs-update flag regardless of whether or not\n // we will actually do anything (avoids needless invocations).\n needsUpdate = false;\n\n if (!interactive) return false;\n\n // inject series and point index for reference into voronoi\n if (useVoronoi === true) {\n\n // nuke all voronoi paths on reload and recreate them\n wrap.select('.nv-point-paths').selectAll('path').remove();\n\n var vertices = d3.merge(data.map(function(group, groupIndex) {\n return group.values\n .map(function(point, pointIndex) {\n // *Adding noise to make duplicates very unlikely\n // *Injecting series and point index for reference\n // *Adding a 'jitter' to the points, because there's an issue in d3.geom.voronoi.\n var pX = getX(point, pointIndex);\n var pY = getY(point, pointIndex);\n\n return [nv.utils.NaNtoZero(x(pX)) + Math.random() * 1e-4,\n nv.utils.NaNtoZero(y(pY)) + Math.random() * 1e-4,\n groupIndex,\n pointIndex, point];\n })\n .filter(function(pointArray, pointIndex) {\n return pointActive(pointArray[4], pointIndex); // Issue #237.. move filter to after map, so\n // pointIndex is correct!\n });\n })\n );\n\n if (vertices.length == 0) return false; // No active points, we're done\n if (vertices.length < 3) {\n // Issue #283 - Adding 2 dummy points to the voronoi b/c voronoi requires min 3 points to work\n vertices.push([x.range()[0] - 20, y.range()[0] - 20, null, null]);\n vertices.push([x.range()[1] + 20, y.range()[1] + 20, null, null]);\n vertices.push([x.range()[0] - 20, y.range()[0] + 20, null, null]);\n vertices.push([x.range()[1] + 20, y.range()[1] - 20, null, null]);\n }\n\n // keep voronoi sections from going more than 10 outside of graph\n // to avoid overlap with other things like legend etc\n var bounds = d3.geom.polygon([\n [-10, -10],\n [-10, height + 10],\n [width + 10, height + 10],\n [width + 10, -10]\n ]);\n\n // delete duplicates from vertices - essential assumption for d3.geom.voronoi\n var epsilon = 1e-4; // Uses 1e-4 to determine equivalence.\n vertices = vertices.sort(function(a, b) {\n return ((a[0] - b[0]) || (a[1] - b[1]));\n });\n for (var i = 0; i < vertices.length - 1;) {\n if ((Math.abs(vertices[i][0] - vertices[i + 1][0]) < epsilon) &&\n (Math.abs(vertices[i][1] - vertices[i + 1][1]) < epsilon)) {\n vertices.splice(i + 1, 1);\n } else {\n i++;\n }\n }\n\n var voronoi = d3.geom.voronoi(vertices).map(function(d, i) {\n return {\n 'data': bounds.clip(d),\n 'series': vertices[i][2],\n 'point': vertices[i][3]\n };\n });\n\n var pointPaths = wrap.select('.nv-point-paths').selectAll('path').data(voronoi);\n var vPointPaths = pointPaths\n .enter().append('svg:path')\n .attr('d', function(d) {\n if (!d || !d.data || d.data.length === 0) {\n return 'M 0 0';\n } else {\n return 'M' + d.data.join(',') + 'Z';\n }\n })\n .attr('id', function(d, i) {\n return 'nv-path-' + i;\n })\n .attr('clip-path', function(d, i) {\n return 'url(#nv-clip-' + id + '-' + i + ')';\n })\n ;\n\n // good for debugging point hover issues\n if (showVoronoi) {\n vPointPaths.style('fill', d3.rgb(230, 230, 230))\n .style('fill-opacity', 0.4)\n .style('stroke-opacity', 1)\n .style('stroke', d3.rgb(200, 200, 200));\n }\n\n if (clipVoronoi) {\n // voronoi sections are already set to clip,\n // just create the circles with the IDs they expect\n wrap.select('.nv-point-clips').selectAll('*').remove(); // must do * since it has sub-dom\n var pointClips = wrap.select('.nv-point-clips').selectAll('clipPath').data(vertices);\n var vPointClips = pointClips\n .enter().append('svg:clipPath')\n .attr('id', function(d, i) {\n return 'nv-clip-' + id + '-' + i;\n })\n .append('svg:circle')\n .attr('cx', function(d) {\n return d[0];\n })\n .attr('cy', function(d) {\n return d[1];\n })\n .attr('r', clipRadius);\n }\n\n var mouseEventCallback = function(el, d, mDispatch) {\n if (needsUpdate) return 0;\n var series = data[d.series];\n if (series === undefined) return;\n var point = series.values[d.point];\n point['color'] = color(series, d.series);\n\n // standardize attributes for tooltip.\n point['x'] = getX(point);\n point['y'] = getY(point);\n\n // can't just get box of event node since it's actually a voronoi polygon\n var box = container.node().getBoundingClientRect();\n var scrollTop = window.pageYOffset || document.documentElement.scrollTop;\n var scrollLeft = window.pageXOffset || document.documentElement.scrollLeft;\n\n var pos = {\n left: x(getX(point, d.point)) + box.left + scrollLeft + margin.left + 10,\n top: y(getY(point, d.point)) + box.top + scrollTop + margin.top + 10\n };\n\n mDispatch({\n point: point,\n series: series,\n pos: pos,\n relativePos: [x(getX(point, d.point)) + margin.left, y(getY(point, d.point)) + margin.top],\n seriesIndex: d.series,\n pointIndex: d.point,\n event: d3.event,\n element: el\n });\n };\n\n pointPaths\n .on('click', function(d) {\n mouseEventCallback(this, d, dispatch.elementClick);\n })\n .on('dblclick', function(d) {\n mouseEventCallback(this, d, dispatch.elementDblClick);\n })\n .on('mouseover', function(d) {\n mouseEventCallback(this, d, dispatch.elementMouseover);\n })\n .on('mouseout', function(d, i) {\n mouseEventCallback(this, d, dispatch.elementMouseout);\n });\n\n } else {\n // add event handlers to points instead voronoi paths\n wrap.select('.nv-groups').selectAll('.nv-group')\n .selectAll('.nv-point')\n //.data(dataWithPoints)\n //.style('pointer-events', 'auto') // recativate events, disabled by css\n .on('click', function(d, i) {\n //nv.log('test', d, i);\n if (needsUpdate || !data[d.series]) return 0; //check if this is a dummy point\n var series = data[d.series],\n point = series.values[i];\n var element = this;\n dispatch.elementClick({\n point: point,\n series: series,\n pos: [x(getX(point, i)) + margin.left, y(getY(point, i)) + margin.top], //TODO: make this pos\n // base on the page\n relativePos: [x(getX(point, i)) + margin.left, y(getY(point, i)) + margin.top],\n seriesIndex: d.series,\n pointIndex: i,\n event: d3.event,\n element: element\n });\n })\n .on('dblclick', function(d, i) {\n if (needsUpdate || !data[d.series]) return 0; //check if this is a dummy point\n var series = data[d.series],\n point = series.values[i];\n\n dispatch.elementDblClick({\n point: point,\n series: series,\n pos: [x(getX(point, i)) + margin.left, y(getY(point, i)) + margin.top],//TODO: make this pos\n // base on the page\n relativePos: [x(getX(point, i)) + margin.left, y(getY(point, i)) + margin.top],\n seriesIndex: d.series,\n pointIndex: i\n });\n })\n .on('mouseover', function(d, i) {\n if (needsUpdate || !data[d.series]) return 0; //check if this is a dummy point\n var series = data[d.series],\n point = series.values[i];\n\n dispatch.elementMouseover({\n point: point,\n series: series,\n pos: [x(getX(point, i)) + margin.left, y(getY(point, i)) + margin.top],//TODO: make this pos\n // base on the page\n relativePos: [x(getX(point, i)) + margin.left, y(getY(point, i)) + margin.top],\n seriesIndex: d.series,\n pointIndex: i,\n color: color(d, i)\n });\n })\n .on('mouseout', function(d, i) {\n if (needsUpdate || !data[d.series]) return 0; //check if this is a dummy point\n var series = data[d.series],\n point = series.values[i];\n\n dispatch.elementMouseout({\n point: point,\n series: series,\n pos: [x(getX(point, i)) + margin.left, y(getY(point, i)) + margin.top],//TODO: make this pos\n // base on the page\n relativePos: [x(getX(point, i)) + margin.left, y(getY(point, i)) + margin.top],\n seriesIndex: d.series,\n pointIndex: i,\n color: color(d, i)\n });\n });\n }\n }\n\n needsUpdate = true;\n var groups = wrap.select('.nv-groups').selectAll('.nv-group')\n .data(function(d) {\n return d;\n }, function(d) {\n return d.key;\n });\n groups.enter().append('g')\n .style('stroke-opacity', 1e-6)\n .style('fill-opacity', 1e-6);\n groups.exit()\n .remove();\n groups\n .attr('class', function(d, i) {\n return (d.classed || '') + ' nv-group nv-series-' + i;\n })\n .classed('nv-noninteractive', !interactive)\n .classed('hover', function(d) {\n return d.hover;\n });\n groups.watchTransition(renderWatch, 'scatter: groups')\n .style('fill', function(d, i) {\n return color(d, i);\n })\n .style('stroke', function(d, i) {\n return d.pointBorderColor || pointBorderColor || color(d, i);\n })\n .style('stroke-opacity', 1)\n .style('fill-opacity', .5);\n\n // create the points, maintaining their IDs from the original data set\n var points = groups.selectAll('path.nv-point')\n .data(function(d) {\n return d.values.map(\n function(point, pointIndex) {\n return [point, pointIndex];\n }).filter(\n function(pointArray, pointIndex) {\n return pointActive(pointArray[0], pointIndex);\n });\n });\n points.enter().append('path')\n .attr('class', function(d) {\n return 'nv-point nv-point-' + d[1];\n })\n .style('fill', function(d) {\n return d.color;\n })\n .style('stroke', function(d) {\n return d.color;\n })\n .attr('transform', function(d) {\n return 'translate(' + nv.utils.NaNtoZero(x0(getX(d[0], d[1]))) + ',' + nv.utils.NaNtoZero(\n y0(getY(d[0], d[1]))) + ')';\n })\n .attr('d',\n nv.utils.symbol()\n .type(function(d) {\n return getShape(d[0]);\n })\n .size(function(d) {\n return z(getSize(d[0], d[1]));\n })\n );\n points.exit().each(delCache).remove();\n groups.exit().selectAll('path.nv-point')\n .watchTransition(renderWatch, 'scatter exit')\n .attr('transform', function(d) {\n return 'translate(' + nv.utils.NaNtoZero(x(getX(d[0], d[1]))) + ',' + nv.utils.NaNtoZero(\n y(getY(d[0], d[1]))) + ')';\n })\n .remove();\n\n //============================================================\n // Point Update Optimisation Notes\n //------------------------------------------------------------\n // The following update selections are filtered with getDiffs\n // (defined at the top of this file) this brings a performance\n // benefit for charts with large data sets that accumulate a\n // subset of changes or additions over time.\n //\n // Uneccesary and expensive DOM calls are avoided by culling\n // unchanged points from the selection in exchange for the\n // cheaper overhead of caching and diffing each point first.\n //\n // Due to the way D3 and NVD3 work, other global changes need\n // to be considered in addition to local point properties.\n // This is a potential source of bugs (if any of the global\n // changes that possibly affect points are missed).\n\n // Update Point Positions [x, y]\n points.filter(function(d) {\n // getDiffs must always be called to update cache\n return getDiffs(d, 'x', getX, 'y', getY) ||\n scaleDiff || sizeDiff || domainDiff;\n })\n .watchTransition(renderWatch, 'scatter points')\n .attr('transform', function(d) {\n return 'translate(' +\n nv.utils.NaNtoZero(x(getX(d[0], d[1]))) + ',' +\n nv.utils.NaNtoZero(y(getY(d[0], d[1]))) + ')';\n });\n\n // Update Point Appearance [shape, size]\n points.filter(function(d) {\n // getDiffs must always be called to update cache\n return getDiffs(d, 'shape', getShape, 'size', getSize) ||\n scaleDiff || sizeDiff || domainDiff;\n })\n .watchTransition(renderWatch, 'scatter points')\n .attr('d', nv.utils.symbol()\n .type(function(d) {\n return getShape(d[0]);\n })\n .size(function(d) {\n return z(getSize(d[0], d[1]));\n })\n );\n\n // add label a label to scatter chart\n if (showLabels) {\n var titles = groups.selectAll('.nv-label')\n .data(function(d) {\n return d.values.map(\n function(point, pointIndex) {\n return [point, pointIndex];\n }).filter(\n function(pointArray, pointIndex) {\n return pointActive(pointArray[0], pointIndex);\n });\n });\n\n titles.enter().append('text')\n .style('fill', function(d, i) {\n return d.color;\n })\n .style('stroke-opacity', 0)\n .style('fill-opacity', 1)\n .attr('transform', function(d) {\n var dx = nv.utils.NaNtoZero(x0(getX(d[0], d[1]))) + Math.sqrt(z(getSize(d[0], d[1])) / Math.PI) + 2;\n return 'translate(' + dx + ',' + nv.utils.NaNtoZero(y0(getY(d[0], d[1]))) + ')';\n })\n .text(function(d, i) {\n return d[0].label;\n });\n\n titles.exit().remove();\n groups.exit().selectAll('path.nv-label')\n .watchTransition(renderWatch, 'scatter exit')\n .attr('transform', function(d) {\n var dx = nv.utils.NaNtoZero(x(getX(d[0], d[1]))) + Math.sqrt(z(getSize(d[0], d[1])) / Math.PI) + 2;\n return 'translate(' + dx + ',' + nv.utils.NaNtoZero(y(getY(d[0], d[1]))) + ')';\n })\n .remove();\n titles.each(function(d) {\n d3.select(this)\n .classed('nv-label', true)\n .classed('nv-label-' + d[1], false)\n .classed('hover', false);\n });\n titles.watchTransition(renderWatch, 'scatter labels')\n .attr('transform', function(d) {\n var dx = nv.utils.NaNtoZero(x(getX(d[0], d[1]))) + Math.sqrt(z(getSize(d[0], d[1])) / Math.PI) + 2;\n return 'translate(' + dx + ',' + nv.utils.NaNtoZero(y(getY(d[0], d[1]))) + ')';\n });\n }\n\n // Delay updating the invisible interactive layer for smoother animation\n if (interactiveUpdateDelay) {\n clearTimeout(timeoutID); // stop repeat calls to updateInteractiveLayer\n timeoutID = setTimeout(updateInteractiveLayer, interactiveUpdateDelay);\n } else {\n updateInteractiveLayer();\n }\n\n //store old scales for use in transitions on update\n x0 = x.copy();\n y0 = y.copy();\n z0 = z.copy();\n\n width0 = width;\n height0 = height;\n\n });\n renderWatch.renderEnd('scatter immediate');\n return chart;\n }\n\n //============================================================\n // Expose Public Variables\n //------------------------------------------------------------\n\n chart.dispatch = dispatch;\n chart.options = nv.utils.optionsFunc.bind(chart);\n\n // utility function calls provided by this chart\n chart._calls = new function() {\n this.clearHighlights = function() {\n nv.dom.write(function() {\n container.selectAll('.nv-point.hover').classed('hover', false);\n });\n return null;\n };\n this.highlightPoint = function(seriesIndex, pointIndex, isHoverOver) {\n nv.dom.write(function() {\n container.select('.nv-groups')\n .selectAll('.nv-series-' + seriesIndex)\n .selectAll('.nv-point-' + pointIndex)\n .classed('hover', isHoverOver);\n });\n };\n };\n\n // trigger calls from events too\n dispatch.on('elementMouseover.point', function(d) {\n if (interactive) chart._calls.highlightPoint(d.seriesIndex, d.pointIndex, true);\n });\n\n dispatch.on('elementMouseout.point', function(d) {\n if (interactive) chart._calls.highlightPoint(d.seriesIndex, d.pointIndex, false);\n });\n\n chart._options = Object.create({}, {\n // simple options, just get/set the necessary values\n width: {\n get: function() {\n return width;\n }, set: function(_) {\n width = _;\n }\n },\n height: {\n get: function() {\n return height;\n }, set: function(_) {\n height = _;\n }\n },\n xScale: {\n get: function() {\n return x;\n }, set: function(_) {\n x = _;\n }\n },\n yScale: {\n get: function() {\n return y;\n }, set: function(_) {\n y = _;\n }\n },\n pointScale: {\n get: function() {\n return z;\n }, set: function(_) {\n z = _;\n }\n },\n xDomain: {\n get: function() {\n return xDomain;\n }, set: function(_) {\n xDomain = _;\n }\n },\n yDomain: {\n get: function() {\n return yDomain;\n }, set: function(_) {\n yDomain = _;\n }\n },\n pointDomain: {\n get: function() {\n return sizeDomain;\n }, set: function(_) {\n sizeDomain = _;\n }\n },\n xRange: {\n get: function() {\n return xRange;\n }, set: function(_) {\n xRange = _;\n }\n },\n yRange: {\n get: function() {\n return yRange;\n }, set: function(_) {\n yRange = _;\n }\n },\n pointRange: {\n get: function() {\n return sizeRange;\n }, set: function(_) {\n sizeRange = _;\n }\n },\n forceX: {\n get: function() {\n return forceX;\n }, set: function(_) {\n forceX = _;\n }\n },\n forceY: {\n get: function() {\n return forceY;\n }, set: function(_) {\n forceY = _;\n }\n },\n forcePoint: {\n get: function() {\n return forceSize;\n }, set: function(_) {\n forceSize = _;\n }\n },\n interactive: {\n get: function() {\n return interactive;\n }, set: function(_) {\n interactive = _;\n }\n },\n pointActive: {\n get: function() {\n return pointActive;\n }, set: function(_) {\n pointActive = _;\n }\n },\n padDataOuter: {\n get: function() {\n return padDataOuter;\n }, set: function(_) {\n padDataOuter = _;\n }\n },\n padData: {\n get: function() {\n return padData;\n }, set: function(_) {\n padData = _;\n }\n },\n clipEdge: {\n get: function() {\n return clipEdge;\n }, set: function(_) {\n clipEdge = _;\n }\n },\n clipVoronoi: {\n get: function() {\n return clipVoronoi;\n }, set: function(_) {\n clipVoronoi = _;\n }\n },\n clipRadius: {\n get: function() {\n return clipRadius;\n }, set: function(_) {\n clipRadius = _;\n }\n },\n showVoronoi: {\n get: function() {\n return showVoronoi;\n }, set: function(_) {\n showVoronoi = _;\n }\n },\n id: {\n get: function() {\n return id;\n }, set: function(_) {\n id = _;\n }\n },\n interactiveUpdateDelay: {\n get: function() {\n return interactiveUpdateDelay;\n }, set: function(_) {\n interactiveUpdateDelay = _;\n }\n },\n showLabels: {\n get: function() {\n return showLabels;\n }, set: function(_) {\n showLabels = _;\n }\n },\n pointBorderColor: {\n get: function() {\n return pointBorderColor;\n }, set: function(_) {\n pointBorderColor = _;\n }\n },\n\n // simple functor options\n x: {\n get: function() {\n return getX;\n }, set: function(_) {\n getX = d3.functor(_);\n }\n },\n y: {\n get: function() {\n return getY;\n }, set: function(_) {\n getY = d3.functor(_);\n }\n },\n pointSize: {\n get: function() {\n return getSize;\n }, set: function(_) {\n getSize = d3.functor(_);\n }\n },\n pointShape: {\n get: function() {\n return getShape;\n }, set: function(_) {\n getShape = d3.functor(_);\n }\n },\n\n // options that require extra logic in the setter\n margin: {\n get: function() {\n return margin;\n }, set: function(_) {\n margin.top = _.top !== undefined ? _.top : margin.top;\n margin.right = _.right !== undefined ? _.right : margin.right;\n margin.bottom = _.bottom !== undefined ? _.bottom : margin.bottom;\n margin.left = _.left !== undefined ? _.left : margin.left;\n }\n },\n duration: {\n get: function() {\n return duration;\n }, set: function(_) {\n duration = _;\n renderWatch.reset(duration);\n }\n },\n color: {\n get: function() {\n return color;\n }, set: function(_) {\n color = nv.utils.getColor(_);\n }\n },\n useVoronoi: {\n get: function() {\n return useVoronoi;\n }, set: function(_) {\n useVoronoi = _;\n if (useVoronoi === false) {\n clipVoronoi = false;\n }\n }\n }\n });\n\n nv.utils.initOptions(chart);\n return chart;\n };\n\n nv.models.scatterChart = function() {\n 'use strict';\n\n //============================================================\n // Public Variables with Default Settings\n //------------------------------------------------------------\n\n var scatter = nv.models.scatter()\n , xAxis = nv.models.axis()\n , yAxis = nv.models.axis()\n , legend = nv.models.legend()\n , distX = nv.models.distribution()\n , distY = nv.models.distribution()\n , tooltip = nv.models.tooltip()\n ;\n\n var margin = {top: 30, right: 20, bottom: 50, left: 75}\n , marginTop = null\n , width = null\n , height = null\n , container = null\n , color = nv.utils.defaultColor()\n , x = scatter.xScale()\n , y = scatter.yScale()\n , showDistX = false\n , showDistY = false\n , showLegend = true\n , showXAxis = true\n , showYAxis = true\n , rightAlignYAxis = false\n , state = nv.utils.state()\n , defaultState = null\n , dispatch = d3.dispatch('stateChange', 'changeState', 'renderEnd')\n , noData = null\n , duration = 250\n , showLabels = false\n ;\n\n scatter.xScale(x).yScale(y);\n xAxis.orient('bottom').tickPadding(10);\n yAxis\n .orient((rightAlignYAxis) ? 'right' : 'left')\n .tickPadding(10)\n ;\n distX.axis('x');\n distY.axis('y');\n tooltip\n .headerFormatter(function(d, i) {\n return xAxis.tickFormat()(d, i);\n })\n .valueFormatter(function(d, i) {\n return yAxis.tickFormat()(d, i);\n });\n\n //============================================================\n // Private Variables\n //------------------------------------------------------------\n\n var x0, y0\n , renderWatch = nv.utils.renderWatch(dispatch, duration);\n\n var stateGetter = function(data) {\n return function() {\n return {\n active: data.map(function(d) {\n return !d.disabled;\n })\n };\n };\n };\n\n var stateSetter = function(data) {\n return function(state) {\n if (state.active !== undefined) {\n data.forEach(function(series, i) {\n series.disabled = !state.active[i];\n });\n }\n };\n };\n\n function chart(selection) {\n renderWatch.reset();\n renderWatch.models(scatter);\n if (showXAxis) renderWatch.models(xAxis);\n if (showYAxis) renderWatch.models(yAxis);\n if (showDistX) renderWatch.models(distX);\n if (showDistY) renderWatch.models(distY);\n\n selection.each(function(data) {\n var that = this;\n\n container = d3.select(this);\n nv.utils.initSVG(container);\n\n var availableWidth = nv.utils.availableWidth(width, container, margin),\n availableHeight = nv.utils.availableHeight(height, container, margin);\n\n chart.update = function() {\n if (duration === 0) {\n container.call(chart);\n } else {\n container.transition().duration(duration).call(chart);\n }\n };\n chart.container = this;\n\n state\n .setter(stateSetter(data), chart.update)\n .getter(stateGetter(data))\n .update();\n\n // DEPRECATED set state.disableddisabled\n state.disabled = data.map(function(d) {\n return !!d.disabled;\n });\n\n if (!defaultState) {\n var key;\n defaultState = {};\n for (key in state) {\n if (state[key] instanceof Array) {\n defaultState[key] = state[key].slice(0);\n } else {\n defaultState[key] = state[key];\n }\n }\n }\n\n // Display noData message if there's nothing to show.\n if (!data || !data.length || !data.filter(function(d) {\n return d.values.length;\n }).length) {\n nv.utils.noData(chart, container);\n renderWatch.renderEnd('scatter immediate');\n return chart;\n } else {\n container.selectAll('.nv-noData').remove();\n }\n\n // Setup Scales\n x = scatter.xScale();\n y = scatter.yScale();\n\n // Setup containers and skeleton of chart\n var wrap = container.selectAll('g.nv-wrap.nv-scatterChart').data([data]);\n var wrapEnter = wrap.enter().append('g').attr('class', 'nvd3 nv-wrap nv-scatterChart nv-chart-' + scatter.id());\n var gEnter = wrapEnter.append('g');\n var g = wrap.select('g');\n\n // background for pointer events\n gEnter.append('rect').attr('class', 'nvd3 nv-background').style('pointer-events', 'none');\n\n gEnter.append('g').attr('class', 'nv-x nv-axis');\n gEnter.append('g').attr('class', 'nv-y nv-axis');\n gEnter.append('g').attr('class', 'nv-scatterWrap');\n gEnter.append('g').attr('class', 'nv-regressionLinesWrap');\n gEnter.append('g').attr('class', 'nv-distWrap');\n gEnter.append('g').attr('class', 'nv-legendWrap');\n\n if (rightAlignYAxis) {\n g.select('.nv-y.nv-axis')\n .attr('transform', 'translate(' + availableWidth + ',0)');\n }\n\n // Legend\n if (!showLegend) {\n g.select('.nv-legendWrap').selectAll('*').remove();\n } else {\n var legendWidth = availableWidth;\n legend.width(legendWidth);\n\n wrap.select('.nv-legendWrap')\n .datum(data)\n .call(legend);\n\n if (!marginTop && legend.height() !== margin.top) {\n margin.top = legend.height();\n availableHeight = nv.utils.availableHeight(height, container, margin);\n }\n\n wrap.select('.nv-legendWrap')\n .attr('transform', 'translate(0' + ',' + (-margin.top) + ')');\n }\n\n wrap.attr('transform', 'translate(' + margin.left + ',' + margin.top + ')');\n\n // Main Chart Component(s)\n scatter\n .width(availableWidth)\n .height(availableHeight)\n .color(data.map(function(d, i) {\n d.color = d.color || color(d, i);\n return d.color;\n }).filter(function(d, i) {\n return !data[i].disabled;\n }))\n .showLabels(showLabels);\n\n wrap.select('.nv-scatterWrap')\n .datum(data.filter(function(d) {\n return !d.disabled;\n }))\n .call(scatter);\n\n\n wrap.select('.nv-regressionLinesWrap')\n .attr('clip-path', 'url(#nv-edge-clip-' + scatter.id() + ')');\n\n var regWrap = wrap.select('.nv-regressionLinesWrap').selectAll('.nv-regLines')\n .data(function(d) {\n return d;\n });\n\n regWrap.enter().append('g').attr('class', 'nv-regLines');\n\n var regLine = regWrap.selectAll('.nv-regLine')\n .data(function(d) {\n return [d];\n });\n\n regLine.enter()\n .append('line').attr('class', 'nv-regLine')\n .style('stroke-opacity', 0);\n\n // don't add lines unless we have slope and intercept to use\n regLine.filter(function(d) {\n return d.intercept && d.slope;\n })\n .watchTransition(renderWatch, 'scatterPlusLineChart: regline')\n .attr('x1', x.range()[0])\n .attr('x2', x.range()[1])\n .attr('y1', function(d, i) {\n return y(x.domain()[0] * d.slope + d.intercept);\n })\n .attr('y2', function(d, i) {\n return y(x.domain()[1] * d.slope + d.intercept);\n })\n .style('stroke', function(d, i, j) {\n return color(d, j);\n })\n .style('stroke-opacity', function(d, i) {\n return (d.disabled || typeof d.slope === 'undefined' || typeof d.intercept === 'undefined') ? 0 : 1;\n });\n\n // Setup Axes\n if (showXAxis) {\n xAxis\n .scale(x)\n ._ticks(nv.utils.calcTicksX(availableWidth / 100, data))\n .tickSize(-availableHeight, 0);\n\n g.select('.nv-x.nv-axis')\n .attr('transform', 'translate(0,' + y.range()[0] + ')')\n .call(xAxis);\n }\n\n if (showYAxis) {\n yAxis\n .scale(y)\n ._ticks(nv.utils.calcTicksY(availableHeight / 36, data))\n .tickSize(-availableWidth, 0);\n\n g.select('.nv-y.nv-axis')\n .call(yAxis);\n }\n\n // Setup Distribution\n if (showDistX) {\n distX\n .getData(scatter.x())\n .scale(x)\n .width(availableWidth)\n .color(data.map(function(d, i) {\n return d.color || color(d, i);\n }).filter(function(d, i) {\n return !data[i].disabled;\n }));\n gEnter.select('.nv-distWrap').append('g')\n .attr('class', 'nv-distributionX');\n g.select('.nv-distributionX')\n .attr('transform', 'translate(0,' + y.range()[0] + ')')\n .datum(data.filter(function(d) {\n return !d.disabled;\n }))\n .call(distX);\n }\n\n if (showDistY) {\n distY\n .getData(scatter.y())\n .scale(y)\n .width(availableHeight)\n .color(data.map(function(d, i) {\n return d.color || color(d, i);\n }).filter(function(d, i) {\n return !data[i].disabled;\n }));\n gEnter.select('.nv-distWrap').append('g')\n .attr('class', 'nv-distributionY');\n g.select('.nv-distributionY')\n .attr('transform', 'translate(' + (rightAlignYAxis ? availableWidth : -distY.size()) + ',0)')\n .datum(data.filter(function(d) {\n return !d.disabled;\n }))\n .call(distY);\n }\n\n //============================================================\n // Event Handling/Dispatching (in chart's scope)\n //------------------------------------------------------------\n\n legend.dispatch.on('stateChange', function(newState) {\n for (var key in newState) {\n state[key] = newState[key];\n }\n dispatch.stateChange(state);\n chart.update();\n });\n\n // Update chart from a state object passed to event handler\n dispatch.on('changeState', function(e) {\n if (typeof e.disabled !== 'undefined') {\n data.forEach(function(series, i) {\n series.disabled = e.disabled[i];\n });\n state.disabled = e.disabled;\n }\n chart.update();\n });\n\n // mouseover needs availableHeight so we just keep scatter mouse events inside the chart block\n scatter.dispatch.on('elementMouseout.tooltip', function(evt) {\n tooltip.hidden(true);\n container.select(\n '.nv-chart-' + scatter.id() + ' .nv-series-' + evt.seriesIndex + ' .nv-distx-' + evt.pointIndex)\n .attr('y1', 0);\n container.select(\n '.nv-chart-' + scatter.id() + ' .nv-series-' + evt.seriesIndex + ' .nv-disty-' + evt.pointIndex)\n .attr('x2', distY.size());\n });\n\n scatter.dispatch.on('elementMouseover.tooltip', function(evt) {\n container.select('.nv-series-' + evt.seriesIndex + ' .nv-distx-' + evt.pointIndex)\n .attr('y1', evt.relativePos[1] - availableHeight);\n container.select('.nv-series-' + evt.seriesIndex + ' .nv-disty-' + evt.pointIndex)\n .attr('x2', evt.relativePos[0] + distX.size());\n tooltip.data(evt).hidden(false);\n });\n\n //store old scales for use in transitions on update\n x0 = x.copy();\n y0 = y.copy();\n\n });\n\n renderWatch.renderEnd('scatter with line immediate');\n return chart;\n }\n\n //============================================================\n // Expose Public Variables\n //------------------------------------------------------------\n\n // expose chart's sub-components\n chart.dispatch = dispatch;\n chart.scatter = scatter;\n chart.legend = legend;\n chart.xAxis = xAxis;\n chart.yAxis = yAxis;\n chart.distX = distX;\n chart.distY = distY;\n chart.tooltip = tooltip;\n\n chart.options = nv.utils.optionsFunc.bind(chart);\n chart._options = Object.create({}, {\n // simple options, just get/set the necessary values\n width: {\n get: function() {\n return width;\n }, set: function(_) {\n width = _;\n }\n },\n height: {\n get: function() {\n return height;\n }, set: function(_) {\n height = _;\n }\n },\n container: {\n get: function() {\n return container;\n }, set: function(_) {\n container = _;\n }\n },\n showDistX: {\n get: function() {\n return showDistX;\n }, set: function(_) {\n showDistX = _;\n }\n },\n showDistY: {\n get: function() {\n return showDistY;\n }, set: function(_) {\n showDistY = _;\n }\n },\n showLegend: {\n get: function() {\n return showLegend;\n }, set: function(_) {\n showLegend = _;\n }\n },\n showXAxis: {\n get: function() {\n return showXAxis;\n }, set: function(_) {\n showXAxis = _;\n }\n },\n showYAxis: {\n get: function() {\n return showYAxis;\n }, set: function(_) {\n showYAxis = _;\n }\n },\n defaultState: {\n get: function() {\n return defaultState;\n }, set: function(_) {\n defaultState = _;\n }\n },\n noData: {\n get: function() {\n return noData;\n }, set: function(_) {\n noData = _;\n }\n },\n duration: {\n get: function() {\n return duration;\n }, set: function(_) {\n duration = _;\n }\n },\n showLabels: {\n get: function() {\n return showLabels;\n }, set: function(_) {\n showLabels = _;\n }\n },\n\n // options that require extra logic in the setter\n margin: {\n get: function() {\n return margin;\n }, set: function(_) {\n if (_.top !== undefined) {\n margin.top = _.top;\n marginTop = _.top;\n }\n margin.right = _.right !== undefined ? _.right : margin.right;\n margin.bottom = _.bottom !== undefined ? _.bottom : margin.bottom;\n margin.left = _.left !== undefined ? _.left : margin.left;\n }\n },\n rightAlignYAxis: {\n get: function() {\n return rightAlignYAxis;\n }, set: function(_) {\n rightAlignYAxis = _;\n yAxis.orient((_) ? 'right' : 'left');\n }\n },\n color: {\n get: function() {\n return color;\n }, set: function(_) {\n color = nv.utils.getColor(_);\n legend.color(color);\n distX.color(color);\n distY.color(color);\n }\n }\n });\n\n nv.utils.inheritOptions(chart, scatter);\n nv.utils.initOptions(chart);\n return chart;\n };\n\n nv.models.sparkline = function() {\n 'use strict';\n\n //============================================================\n // Public Variables with Default Settings\n //------------------------------------------------------------\n\n var margin = {top: 2, right: 0, bottom: 2, left: 0}\n , width = 400\n , height = 32\n , container = null\n , animate = true\n , x = d3.scale.linear()\n , y = d3.scale.linear()\n , getX = function(d) {\n return d.x;\n }\n , getY = function(d) {\n return d.y;\n }\n , color = nv.utils.getColor(['#000'])\n , xDomain\n , yDomain\n , xRange\n , yRange\n , showMinMaxPoints = true\n , showCurrentPoint = true\n , dispatch = d3.dispatch('renderEnd')\n ;\n\n //============================================================\n // Private Variables\n //------------------------------------------------------------\n\n var renderWatch = nv.utils.renderWatch(dispatch);\n\n function chart(selection) {\n renderWatch.reset();\n selection.each(function(data) {\n var availableWidth = width - margin.left - margin.right,\n availableHeight = height - margin.top - margin.bottom;\n\n container = d3.select(this);\n nv.utils.initSVG(container);\n\n // Setup Scales\n x.domain(xDomain || d3.extent(data, getX))\n .range(xRange || [0, availableWidth]);\n\n y.domain(yDomain || d3.extent(data, getY))\n .range(yRange || [availableHeight, 0]);\n\n // Setup containers and skeleton of chart\n var wrap = container.selectAll('g.nv-wrap.nv-sparkline').data([data]);\n var wrapEnter = wrap.enter().append('g').attr('class', 'nvd3 nv-wrap nv-sparkline');\n var gEnter = wrapEnter.append('g');\n var g = wrap.select('g');\n\n wrap.attr('transform', 'translate(' + margin.left + ',' + margin.top + ')');\n\n var paths = wrap.selectAll('path')\n .data(function(d) {\n return [d];\n });\n paths.enter().append('path');\n paths.exit().remove();\n paths\n .style('stroke', function(d, i) {\n return d.color || color(d, i);\n })\n .attr('d', d3.svg.line()\n .x(function(d, i) {\n return x(getX(d, i));\n })\n .y(function(d, i) {\n return y(getY(d, i));\n })\n );\n\n // TODO: Add CURRENT data point (Need Min, Mac, Current / Most recent)\n var points = wrap.selectAll('circle.nv-point')\n .data(function(data) {\n var yValues = data.map(function(d, i) {\n return getY(d, i);\n });\n\n function pointIndex(index) {\n if (index != -1) {\n var result = data[index];\n result.pointIndex = index;\n return result;\n } else {\n return null;\n }\n }\n\n var maxPoint = pointIndex(yValues.lastIndexOf(y.domain()[1])),\n minPoint = pointIndex(yValues.indexOf(y.domain()[0])),\n currentPoint = pointIndex(yValues.length - 1);\n return [(showMinMaxPoints ? minPoint : null), (showMinMaxPoints ? maxPoint : null),\n (showCurrentPoint ? currentPoint : null)].filter(function(d) {\n return d != null;\n });\n });\n points.enter().append('circle');\n points.exit().remove();\n points\n .attr('cx', function(d, i) {\n return x(getX(d, d.pointIndex));\n })\n .attr('cy', function(d, i) {\n return y(getY(d, d.pointIndex));\n })\n .attr('r', 2)\n .attr('class', function(d, i) {\n return getX(d, d.pointIndex) == x.domain()[1] ? 'nv-point nv-currentValue' :\n getY(d, d.pointIndex) == y.domain()[0] ? 'nv-point nv-minValue' : 'nv-point nv-maxValue';\n });\n });\n\n renderWatch.renderEnd('sparkline immediate');\n return chart;\n }\n\n //============================================================\n // Expose Public Variables\n //------------------------------------------------------------\n\n chart.options = nv.utils.optionsFunc.bind(chart);\n\n chart._options = Object.create({}, {\n // simple options, just get/set the necessary values\n width: {\n get: function() {\n return width;\n }, set: function(_) {\n width = _;\n }\n },\n height: {\n get: function() {\n return height;\n }, set: function(_) {\n height = _;\n }\n },\n xDomain: {\n get: function() {\n return xDomain;\n }, set: function(_) {\n xDomain = _;\n }\n },\n yDomain: {\n get: function() {\n return yDomain;\n }, set: function(_) {\n yDomain = _;\n }\n },\n xRange: {\n get: function() {\n return xRange;\n }, set: function(_) {\n xRange = _;\n }\n },\n yRange: {\n get: function() {\n return yRange;\n }, set: function(_) {\n yRange = _;\n }\n },\n xScale: {\n get: function() {\n return x;\n }, set: function(_) {\n x = _;\n }\n },\n yScale: {\n get: function() {\n return y;\n }, set: function(_) {\n y = _;\n }\n },\n animate: {\n get: function() {\n return animate;\n }, set: function(_) {\n animate = _;\n }\n },\n showMinMaxPoints: {\n get: function() {\n return showMinMaxPoints;\n }, set: function(_) {\n showMinMaxPoints = _;\n }\n },\n showCurrentPoint: {\n get: function() {\n return showCurrentPoint;\n }, set: function(_) {\n showCurrentPoint = _;\n }\n },\n\n //functor options\n x: {\n get: function() {\n return getX;\n }, set: function(_) {\n getX = d3.functor(_);\n }\n },\n y: {\n get: function() {\n return getY;\n }, set: function(_) {\n getY = d3.functor(_);\n }\n },\n\n // options that require extra logic in the setter\n margin: {\n get: function() {\n return margin;\n }, set: function(_) {\n margin.top = _.top !== undefined ? _.top : margin.top;\n margin.right = _.right !== undefined ? _.right : margin.right;\n margin.bottom = _.bottom !== undefined ? _.bottom : margin.bottom;\n margin.left = _.left !== undefined ? _.left : margin.left;\n }\n },\n color: {\n get: function() {\n return color;\n }, set: function(_) {\n color = nv.utils.getColor(_);\n }\n }\n });\n\n chart.dispatch = dispatch;\n nv.utils.initOptions(chart);\n return chart;\n };\n\n nv.models.sparklinePlus = function() {\n 'use strict';\n\n //============================================================\n // Public Variables with Default Settings\n //------------------------------------------------------------\n\n var sparkline = nv.models.sparkline();\n\n var margin = {top: 15, right: 100, bottom: 10, left: 50}\n , width = null\n , height = null\n , x\n , y\n , index = []\n , paused = false\n , xTickFormat = d3.format(',r')\n , yTickFormat = d3.format(',.2f')\n , showLastValue = true\n , alignValue = true\n , rightAlignValue = false\n , noData = null\n , dispatch = d3.dispatch('renderEnd')\n ;\n\n //============================================================\n // Private Variables\n //------------------------------------------------------------\n\n var renderWatch = nv.utils.renderWatch(dispatch);\n\n function chart(selection) {\n renderWatch.reset();\n renderWatch.models(sparkline);\n selection.each(function(data) {\n var container = d3.select(this);\n nv.utils.initSVG(container);\n\n var availableWidth = nv.utils.availableWidth(width, container, margin),\n availableHeight = nv.utils.availableHeight(height, container, margin);\n\n chart.update = function() {\n container.call(chart);\n };\n chart.container = this;\n\n // Display No Data message if there's nothing to show.\n if (!data || !data.length) {\n nv.utils.noData(chart, container);\n return chart;\n } else {\n container.selectAll('.nv-noData').remove();\n }\n\n var currentValue = sparkline.y()(data[data.length - 1], data.length - 1);\n\n // Setup Scales\n x = sparkline.xScale();\n y = sparkline.yScale();\n\n // Setup containers and skeleton of chart\n var wrap = container.selectAll('g.nv-wrap.nv-sparklineplus').data([data]);\n var wrapEnter = wrap.enter().append('g').attr('class', 'nvd3 nv-wrap nv-sparklineplus');\n var gEnter = wrapEnter.append('g');\n var g = wrap.select('g');\n\n gEnter.append('g').attr('class', 'nv-sparklineWrap');\n gEnter.append('g').attr('class', 'nv-valueWrap');\n gEnter.append('g').attr('class', 'nv-hoverArea');\n\n wrap.attr('transform', 'translate(' + margin.left + ',' + margin.top + ')');\n\n // Main Chart Component(s)\n var sparklineWrap = g.select('.nv-sparklineWrap');\n\n sparkline.width(availableWidth).height(availableHeight);\n sparklineWrap.call(sparkline);\n\n if (showLastValue) {\n var valueWrap = g.select('.nv-valueWrap');\n var value = valueWrap.selectAll('.nv-currentValue')\n .data([currentValue]);\n\n value.enter().append('text').attr('class', 'nv-currentValue')\n .attr('dx', rightAlignValue ? -8 : 8)\n .attr('dy', '.9em')\n .style('text-anchor', rightAlignValue ? 'end' : 'start');\n\n value\n .attr('x', availableWidth + (rightAlignValue ? margin.right : 0))\n .attr('y', alignValue ? function(d) {\n return y(d);\n } : 0)\n .style('fill', sparkline.color()(data[data.length - 1], data.length - 1))\n .text(yTickFormat(currentValue));\n }\n\n gEnter.select('.nv-hoverArea').append('rect')\n .on('mousemove', sparklineHover)\n .on('click', function() {\n paused = !paused;\n })\n .on('mouseout', function() {\n index = [];\n updateValueLine();\n });\n\n g.select('.nv-hoverArea rect')\n .attr('transform', function(d) {\n return 'translate(' + -margin.left + ',' + -margin.top + ')';\n })\n .attr('width', availableWidth + margin.left + margin.right)\n .attr('height', availableHeight + margin.top);\n\n //index is currently global (within the chart), may or may not keep it that way\n function updateValueLine() {\n if (paused) return;\n\n var hoverValue = g.selectAll('.nv-hoverValue').data(index);\n\n var hoverEnter = hoverValue.enter()\n .append('g').attr('class', 'nv-hoverValue')\n .style('stroke-opacity', 0)\n .style('fill-opacity', 0);\n\n hoverValue.exit()\n .transition().duration(250)\n .style('stroke-opacity', 0)\n .style('fill-opacity', 0)\n .remove();\n\n hoverValue\n .attr('transform', function(d) {\n return 'translate(' + x(sparkline.x()(data[d], d)) + ',0)';\n })\n .transition().duration(250)\n .style('stroke-opacity', 1)\n .style('fill-opacity', 1);\n\n if (!index.length) return;\n\n hoverEnter.append('line')\n .attr('x1', 0)\n .attr('y1', -margin.top)\n .attr('x2', 0)\n .attr('y2', availableHeight);\n\n hoverEnter.append('text').attr('class', 'nv-xValue')\n .attr('x', -6)\n .attr('y', -margin.top)\n .attr('text-anchor', 'end')\n .attr('dy', '.9em');\n\n g.select('.nv-hoverValue .nv-xValue')\n .text(xTickFormat(sparkline.x()(data[index[0]], index[0])));\n\n hoverEnter.append('text').attr('class', 'nv-yValue')\n .attr('x', 6)\n .attr('y', -margin.top)\n .attr('text-anchor', 'start')\n .attr('dy', '.9em');\n\n g.select('.nv-hoverValue .nv-yValue')\n .text(yTickFormat(sparkline.y()(data[index[0]], index[0])));\n }\n\n function sparklineHover() {\n if (paused) return;\n\n var pos = d3.mouse(this)[0] - margin.left;\n\n function getClosestIndex(data, x) {\n var distance = Math.abs(sparkline.x()(data[0], 0) - x);\n var closestIndex = 0;\n for (var i = 0; i < data.length; i++) {\n if (Math.abs(sparkline.x()(data[i], i) - x) < distance) {\n distance = Math.abs(sparkline.x()(data[i], i) - x);\n closestIndex = i;\n }\n }\n return closestIndex;\n }\n\n index = [getClosestIndex(data, Math.round(x.invert(pos)))];\n updateValueLine();\n }\n\n });\n renderWatch.renderEnd('sparklinePlus immediate');\n return chart;\n }\n\n //============================================================\n // Expose Public Variables\n //------------------------------------------------------------\n\n // expose chart's sub-components\n chart.dispatch = dispatch;\n chart.sparkline = sparkline;\n\n chart.options = nv.utils.optionsFunc.bind(chart);\n\n chart._options = Object.create({}, {\n // simple options, just get/set the necessary values\n width: {\n get: function() {\n return width;\n }, set: function(_) {\n width = _;\n }\n },\n height: {\n get: function() {\n return height;\n }, set: function(_) {\n height = _;\n }\n },\n xTickFormat: {\n get: function() {\n return xTickFormat;\n }, set: function(_) {\n xTickFormat = _;\n }\n },\n yTickFormat: {\n get: function() {\n return yTickFormat;\n }, set: function(_) {\n yTickFormat = _;\n }\n },\n showLastValue: {\n get: function() {\n return showLastValue;\n }, set: function(_) {\n showLastValue = _;\n }\n },\n alignValue: {\n get: function() {\n return alignValue;\n }, set: function(_) {\n alignValue = _;\n }\n },\n rightAlignValue: {\n get: function() {\n return rightAlignValue;\n }, set: function(_) {\n rightAlignValue = _;\n }\n },\n noData: {\n get: function() {\n return noData;\n }, set: function(_) {\n noData = _;\n }\n },\n\n // options that require extra logic in the setter\n margin: {\n get: function() {\n return margin;\n }, set: function(_) {\n margin.top = _.top !== undefined ? _.top : margin.top;\n margin.right = _.right !== undefined ? _.right : margin.right;\n margin.bottom = _.bottom !== undefined ? _.bottom : margin.bottom;\n margin.left = _.left !== undefined ? _.left : margin.left;\n }\n }\n });\n\n nv.utils.inheritOptions(chart, sparkline);\n nv.utils.initOptions(chart);\n\n return chart;\n };\n\n nv.models.stackedArea = function() {\n 'use strict';\n\n //============================================================\n // Public Variables with Default Settings\n //------------------------------------------------------------\n\n var margin = {top: 0, right: 0, bottom: 0, left: 0}\n ,\n width = 960\n ,\n height = 500\n ,\n color = nv.utils.defaultColor() // a function that computes the color\n ,\n id = Math.floor(Math.random() * 100000) //Create semi-unique ID incase user doesn't selet one\n ,\n container = null\n ,\n getX = function(d) {\n return d.x;\n } // accessor to get the x value from a data point\n ,\n getY = function(d) {\n return d.y;\n } // accessor to get the y value from a data point\n ,\n defined = function(d, i) {\n return !isNaN(getY(d, i)) && getY(d, i) !== null;\n } // allows a line to be not continuous when it is not defined\n ,\n style = 'stack'\n ,\n offset = 'zero'\n ,\n order = 'default'\n ,\n interpolate = 'linear' // controls the line interpolation\n ,\n clipEdge = false // if true, masks lines within x and y scale\n ,\n x //can be accessed via chart.xScale()\n ,\n y //can be accessed via chart.yScale()\n ,\n scatter = nv.models.scatter()\n ,\n duration = 250\n ,\n dispatch = d3.dispatch('areaClick', 'areaMouseover', 'areaMouseout', 'renderEnd', 'elementClick', 'elementMouseover',\n 'elementMouseout')\n ;\n\n scatter\n .pointSize(2.2) // default size\n .pointDomain([2.2, 2.2]) // all the same size by default\n ;\n\n /************************************\n * offset:\n * 'wiggle' (stream)\n * 'zero' (stacked)\n * 'expand' (normalize to 100%)\n * 'silhouette' (simple centered)\n *\n * order:\n * 'inside-out' (stream)\n * 'default' (input order)\n ************************************/\n\n var renderWatch = nv.utils.renderWatch(dispatch, duration);\n\n function chart(selection) {\n renderWatch.reset();\n renderWatch.models(scatter);\n selection.each(function(data) {\n var availableWidth = width - margin.left - margin.right,\n availableHeight = height - margin.top - margin.bottom;\n\n container = d3.select(this);\n nv.utils.initSVG(container);\n\n // Setup Scales\n x = scatter.xScale();\n y = scatter.yScale();\n\n var dataRaw = data;\n // Injecting point index into each point because d3.layout.stack().out does not give index\n data.forEach(function(aseries, i) {\n aseries.seriesIndex = i;\n aseries.values = aseries.values.map(function(d, j) {\n d.index = j;\n d.seriesIndex = i;\n return d;\n });\n });\n\n var dataFiltered = data.filter(function(series) {\n return !series.disabled;\n });\n\n data = d3.layout.stack()\n .order(order)\n .offset(offset)\n .values(function(d) {\n return d.values;\n }) //TODO: make values customizeable in EVERY model in this fashion\n .x(getX)\n .y(getY)\n .out(function(d, y0, y) {\n d.display = {\n y: y,\n y0: y0\n };\n })\n (dataFiltered);\n\n // Setup containers and skeleton of chart\n var wrap = container.selectAll('g.nv-wrap.nv-stackedarea').data([data]);\n var wrapEnter = wrap.enter().append('g').attr('class', 'nvd3 nv-wrap nv-stackedarea');\n var defsEnter = wrapEnter.append('defs');\n var gEnter = wrapEnter.append('g');\n var g = wrap.select('g');\n\n gEnter.append('g').attr('class', 'nv-areaWrap');\n gEnter.append('g').attr('class', 'nv-scatterWrap');\n\n wrap.attr('transform', 'translate(' + margin.left + ',' + margin.top + ')');\n\n // If the user has not specified forceY, make sure 0 is included in the domain\n // Otherwise, use user-specified values for forceY\n if (scatter.forceY().length == 0) {\n scatter.forceY().push(0);\n }\n\n scatter\n .width(availableWidth)\n .height(availableHeight)\n .x(getX)\n .y(function(d) {\n if (d.display !== undefined) {\n return d.display.y + d.display.y0;\n }\n })\n .color(data.map(function(d, i) {\n d.color = d.color || color(d, d.seriesIndex);\n return d.color;\n }));\n\n var scatterWrap = g.select('.nv-scatterWrap')\n .datum(data);\n\n scatterWrap.call(scatter);\n\n defsEnter.append('clipPath')\n .attr('id', 'nv-edge-clip-' + id)\n .append('rect');\n\n wrap.select('#nv-edge-clip-' + id + ' rect')\n .attr('width', availableWidth)\n .attr('height', availableHeight);\n\n g.attr('clip-path', clipEdge ? 'url(#nv-edge-clip-' + id + ')' : '');\n\n var area = d3.svg.area()\n .defined(defined)\n .x(function(d, i) {\n return x(getX(d, i));\n })\n .y0(function(d) {\n return y(d.display.y0);\n })\n .y1(function(d) {\n return y(d.display.y + d.display.y0);\n })\n .interpolate(interpolate);\n\n var zeroArea = d3.svg.area()\n .defined(defined)\n .x(function(d, i) {\n return x(getX(d, i));\n })\n .y0(function(d) {\n return y(d.display.y0);\n })\n .y1(function(d) {\n return y(d.display.y0);\n });\n\n var path = g.select('.nv-areaWrap').selectAll('path.nv-area')\n .data(function(d) {\n return d;\n });\n\n path.enter().append('path').attr('class', function(d, i) {\n return 'nv-area nv-area-' + i;\n })\n .attr('d', function(d, i) {\n return zeroArea(d.values, d.seriesIndex);\n })\n .on('mouseover', function(d, i) {\n d3.select(this).classed('hover', true);\n dispatch.areaMouseover({\n point: d,\n series: d.key,\n pos: [d3.event.pageX, d3.event.pageY],\n seriesIndex: d.seriesIndex\n });\n })\n .on('mouseout', function(d, i) {\n d3.select(this).classed('hover', false);\n dispatch.areaMouseout({\n point: d,\n series: d.key,\n pos: [d3.event.pageX, d3.event.pageY],\n seriesIndex: d.seriesIndex\n });\n })\n .on('click', function(d, i) {\n d3.select(this).classed('hover', false);\n dispatch.areaClick({\n point: d,\n series: d.key,\n pos: [d3.event.pageX, d3.event.pageY],\n seriesIndex: d.seriesIndex\n });\n });\n\n path.exit().remove();\n path.style('fill', function(d, i) {\n return d.color || color(d, d.seriesIndex);\n })\n .style('stroke', function(d, i) {\n return d.color || color(d, d.seriesIndex);\n });\n path.watchTransition(renderWatch, 'stackedArea path')\n .attr('d', function(d, i) {\n return area(d.values, i);\n });\n\n //============================================================\n // Event Handling/Dispatching (in chart's scope)\n //------------------------------------------------------------\n\n scatter.dispatch.on('elementMouseover.area', function(e) {\n g.select('.nv-chart-' + id + ' .nv-area-' + e.seriesIndex).classed('hover', true);\n });\n scatter.dispatch.on('elementMouseout.area', function(e) {\n g.select('.nv-chart-' + id + ' .nv-area-' + e.seriesIndex).classed('hover', false);\n });\n\n //Special offset functions\n chart.d3_stackedOffset_stackPercent = function(stackData) {\n var n = stackData.length, //How many series\n m = stackData[0].length, //how many points per series\n i,\n j,\n o,\n y0 = [];\n\n for (j = 0; j < m; ++j) { //Looping through all points\n for (i = 0, o = 0; i < dataRaw.length; i++) { //looping through all series\n o += getY(dataRaw[i].values[j]); //total y value of all series at a certian point in time.\n }\n\n if (o) {\n for (i = 0; i < n; i++) { //(total y value of all series at point in time i) != 0\n stackData[i][j][1] /= o;\n }\n } else { //(total y value of all series at point in time i) == 0\n for (i = 0; i < n; i++) {\n stackData[i][j][1] = 0;\n }\n }\n }\n for (j = 0; j < m; ++j) y0[j] = 0;\n return y0;\n };\n\n });\n\n renderWatch.renderEnd('stackedArea immediate');\n return chart;\n }\n\n //============================================================\n // Global getters and setters\n //------------------------------------------------------------\n\n chart.dispatch = dispatch;\n chart.scatter = scatter;\n\n scatter.dispatch.on('elementClick', function() {\n dispatch.elementClick.apply(this, arguments);\n });\n scatter.dispatch.on('elementMouseover', function() {\n dispatch.elementMouseover.apply(this, arguments);\n });\n scatter.dispatch.on('elementMouseout', function() {\n dispatch.elementMouseout.apply(this, arguments);\n });\n\n chart.interpolate = function(_) {\n if (!arguments.length) return interpolate;\n interpolate = _;\n return chart;\n };\n\n chart.duration = function(_) {\n if (!arguments.length) return duration;\n duration = _;\n renderWatch.reset(duration);\n scatter.duration(duration);\n return chart;\n };\n\n chart.dispatch = dispatch;\n chart.scatter = scatter;\n chart.options = nv.utils.optionsFunc.bind(chart);\n\n chart._options = Object.create({}, {\n // simple options, just get/set the necessary values\n width: {\n get: function() {\n return width;\n }, set: function(_) {\n width = _;\n }\n },\n height: {\n get: function() {\n return height;\n }, set: function(_) {\n height = _;\n }\n },\n defined: {\n get: function() {\n return defined;\n }, set: function(_) {\n defined = _;\n }\n },\n clipEdge: {\n get: function() {\n return clipEdge;\n }, set: function(_) {\n clipEdge = _;\n }\n },\n offset: {\n get: function() {\n return offset;\n }, set: function(_) {\n offset = _;\n }\n },\n order: {\n get: function() {\n return order;\n }, set: function(_) {\n order = _;\n }\n },\n interpolate: {\n get: function() {\n return interpolate;\n }, set: function(_) {\n interpolate = _;\n }\n },\n\n // simple functor options\n x: {\n get: function() {\n return getX;\n }, set: function(_) {\n getX = d3.functor(_);\n }\n },\n y: {\n get: function() {\n return getY;\n }, set: function(_) {\n getY = d3.functor(_);\n }\n },\n\n // options that require extra logic in the setter\n margin: {\n get: function() {\n return margin;\n }, set: function(_) {\n margin.top = _.top !== undefined ? _.top : margin.top;\n margin.right = _.right !== undefined ? _.right : margin.right;\n margin.bottom = _.bottom !== undefined ? _.bottom : margin.bottom;\n margin.left = _.left !== undefined ? _.left : margin.left;\n }\n },\n color: {\n get: function() {\n return color;\n }, set: function(_) {\n color = nv.utils.getColor(_);\n }\n },\n style: {\n get: function() {\n return style;\n }, set: function(_) {\n style = _;\n switch (style) {\n case 'stack':\n chart.offset('zero');\n chart.order('default');\n break;\n case 'stream':\n chart.offset('wiggle');\n chart.order('inside-out');\n break;\n case 'stream-center':\n chart.offset('silhouette');\n chart.order('inside-out');\n break;\n case 'expand':\n chart.offset('expand');\n chart.order('default');\n break;\n case 'stack_percent':\n chart.offset(chart.d3_stackedOffset_stackPercent);\n chart.order('default');\n break;\n }\n }\n },\n duration: {\n get: function() {\n return duration;\n }, set: function(_) {\n duration = _;\n renderWatch.reset(duration);\n scatter.duration(duration);\n }\n }\n });\n\n nv.utils.inheritOptions(chart, scatter);\n nv.utils.initOptions(chart);\n\n return chart;\n };\n\n nv.models.stackedAreaChart = function() {\n 'use strict';\n\n //============================================================\n // Public Variables with Default Settings\n //------------------------------------------------------------\n\n var stacked = nv.models.stackedArea()\n , xAxis = nv.models.axis()\n , yAxis = nv.models.axis()\n , legend = nv.models.legend()\n , controls = nv.models.legend()\n , interactiveLayer = nv.interactiveGuideline()\n , tooltip = nv.models.tooltip()\n , focus = nv.models.focus(nv.models.stackedArea())\n ;\n\n var margin = {top: 10, right: 25, bottom: 50, left: 60}\n , marginTop = null\n , width = null\n , height = null\n , color = nv.utils.defaultColor()\n , showControls = true\n , showLegend = true\n , legendPosition = 'top'\n , showXAxis = true\n , showYAxis = true\n , rightAlignYAxis = false\n , focusEnable = false\n , useInteractiveGuideline = false\n , showTotalInTooltip = true\n , totalLabel = 'TOTAL'\n , x //can be accessed via chart.xScale()\n , y //can be accessed via chart.yScale()\n , state = nv.utils.state()\n , defaultState = null\n , noData = null\n , dispatch = d3.dispatch('stateChange', 'changeState', 'renderEnd')\n , controlWidth = 250\n , controlOptions = ['Stacked', 'Stream', 'Expanded']\n , controlLabels = {}\n , duration = 250\n ;\n\n state.style = stacked.style();\n xAxis.orient('bottom').tickPadding(7);\n yAxis.orient((rightAlignYAxis) ? 'right' : 'left');\n\n tooltip\n .headerFormatter(function(d, i) {\n return xAxis.tickFormat()(d, i);\n })\n .valueFormatter(function(d, i) {\n return yAxis.tickFormat()(d, i);\n });\n\n interactiveLayer.tooltip\n .headerFormatter(function(d, i) {\n return xAxis.tickFormat()(d, i);\n })\n .valueFormatter(function(d, i) {\n return d == null ? 'N/A' : yAxis.tickFormat()(d, i);\n });\n\n var oldYTickFormat = null,\n oldValueFormatter = null;\n\n controls.updateState(false);\n\n //============================================================\n // Private Variables\n //------------------------------------------------------------\n\n var renderWatch = nv.utils.renderWatch(dispatch);\n var style = stacked.style();\n\n var stateGetter = function(data) {\n return function() {\n return {\n active: data.map(function(d) {\n return !d.disabled;\n }),\n style: stacked.style()\n };\n };\n };\n\n var stateSetter = function(data) {\n return function(state) {\n if (state.style !== undefined) {\n style = state.style;\n }\n if (state.active !== undefined) {\n data.forEach(function(series, i) {\n series.disabled = !state.active[i];\n });\n }\n };\n };\n\n var percentFormatter = d3.format('%');\n\n function chart(selection) {\n renderWatch.reset();\n renderWatch.models(stacked);\n if (showXAxis) renderWatch.models(xAxis);\n if (showYAxis) renderWatch.models(yAxis);\n\n selection.each(function(data) {\n var container = d3.select(this),\n that = this;\n nv.utils.initSVG(container);\n\n var availableWidth = nv.utils.availableWidth(width, container, margin),\n availableHeight = nv.utils.availableHeight(height, container, margin) - (focusEnable ? focus.height() : 0);\n\n chart.update = function() {\n container.transition().duration(duration).call(chart);\n };\n chart.container = this;\n\n state\n .setter(stateSetter(data), chart.update)\n .getter(stateGetter(data))\n .update();\n\n // DEPRECATED set state.disabled\n state.disabled = data.map(function(d) {\n return !!d.disabled;\n });\n\n if (!defaultState) {\n var key;\n defaultState = {};\n for (key in state) {\n if (state[key] instanceof Array) {\n defaultState[key] = state[key].slice(0);\n } else {\n defaultState[key] = state[key];\n }\n }\n }\n\n // Display No Data message if there's nothing to show.\n if (!data || !data.length || !data.filter(function(d) {\n return d.values.length;\n }).length) {\n nv.utils.noData(chart, container);\n return chart;\n } else {\n container.selectAll('.nv-noData').remove();\n }\n // Setup Scales\n x = stacked.xScale();\n y = stacked.yScale();\n\n // Setup containers and skeleton of chart\n var wrap = container.selectAll('g.nv-wrap.nv-stackedAreaChart').data([data]);\n var gEnter = wrap.enter().append('g').attr('class', 'nvd3 nv-wrap nv-stackedAreaChart').append('g');\n var g = wrap.select('g');\n\n gEnter.append('g').attr('class', 'nv-legendWrap');\n gEnter.append('g').attr('class', 'nv-controlsWrap');\n\n var focusEnter = gEnter.append('g').attr('class', 'nv-focus');\n focusEnter.append('g').attr('class', 'nv-background').append('rect');\n focusEnter.append('g').attr('class', 'nv-x nv-axis');\n focusEnter.append('g').attr('class', 'nv-y nv-axis');\n focusEnter.append('g').attr('class', 'nv-stackedWrap');\n focusEnter.append('g').attr('class', 'nv-interactive');\n\n // g.select(\"rect\").attr(\"width\",availableWidth).attr(\"height\",availableHeight);\n\n var contextEnter = gEnter.append('g').attr('class', 'nv-focusWrap');\n\n // Legend\n if (!showLegend) {\n g.select('.nv-legendWrap').selectAll('*').remove();\n } else {\n var legendWidth = (showControls && legendPosition === 'top') ? availableWidth - controlWidth : availableWidth;\n\n legend.width(legendWidth);\n g.select('.nv-legendWrap').datum(data).call(legend);\n\n if (legendPosition === 'bottom') {\n // constant from axis.js, plus some margin for better layout\n var xAxisHeight = (showXAxis ? 12 : 0) + 10;\n margin.bottom = Math.max(legend.height() + xAxisHeight, margin.bottom);\n availableHeight = nv.utils.availableHeight(height, container, margin) - (focusEnable ? focus.height() : 0);\n var legendTop = availableHeight + xAxisHeight;\n g.select('.nv-legendWrap')\n .attr('transform', 'translate(0,' + legendTop + ')');\n } else if (legendPosition === 'top') {\n if (!marginTop && margin.top != legend.height()) {\n margin.top = legend.height();\n availableHeight = nv.utils.availableHeight(height, container, margin) - (focusEnable ? focus.height()\n : 0);\n }\n\n g.select('.nv-legendWrap')\n .attr('transform', 'translate(' + (availableWidth - legendWidth) + ',' + (-margin.top) + ')');\n }\n }\n\n // Controls\n if (!showControls) {\n g.select('.nv-controlsWrap').selectAll('*').remove();\n } else {\n var controlsData = [\n {\n key: controlLabels.stacked || 'Stacked',\n metaKey: 'Stacked',\n disabled: stacked.style() != 'stack',\n style: 'stack'\n },\n {\n key: controlLabels.stream || 'Stream',\n metaKey: 'Stream',\n disabled: stacked.style() != 'stream',\n style: 'stream'\n },\n {\n key: controlLabels.expanded || 'Expanded',\n metaKey: 'Expanded',\n disabled: stacked.style() != 'expand',\n style: 'expand'\n },\n {\n key: controlLabels.stack_percent || 'Stack %',\n metaKey: 'Stack_Percent',\n disabled: stacked.style() != 'stack_percent',\n style: 'stack_percent'\n }\n ];\n\n controlWidth = (controlOptions.length / 3) * 260;\n controlsData = controlsData.filter(function(d) {\n return controlOptions.indexOf(d.metaKey) !== -1;\n });\n\n controls\n .width(controlWidth)\n .color(['#444', '#444', '#444']);\n\n g.select('.nv-controlsWrap')\n .datum(controlsData)\n .call(controls);\n\n var requiredTop = Math.max(controls.height(), showLegend && (legendPosition === 'top') ? legend.height() : 0);\n\n if (margin.top != requiredTop) {\n margin.top = requiredTop;\n availableHeight = nv.utils.availableHeight(height, container, margin) - (focusEnable ? focus.height() : 0);\n }\n\n g.select('.nv-controlsWrap')\n .attr('transform', 'translate(0,' + (-margin.top) + ')');\n }\n\n wrap.attr('transform', 'translate(' + margin.left + ',' + margin.top + ')');\n\n if (rightAlignYAxis) {\n g.select('.nv-y.nv-axis')\n .attr('transform', 'translate(' + availableWidth + ',0)');\n }\n\n //Set up interactive layer\n if (useInteractiveGuideline) {\n interactiveLayer\n .width(availableWidth)\n .height(availableHeight)\n .margin({left: margin.left, top: margin.top})\n .svgContainer(container)\n .xScale(x);\n wrap.select('.nv-interactive').call(interactiveLayer);\n }\n\n g.select('.nv-focus .nv-background rect')\n .attr('width', availableWidth)\n .attr('height', availableHeight);\n\n stacked\n .width(availableWidth)\n .height(availableHeight)\n .color(data.map(function(d, i) {\n return d.color || color(d, i);\n }).filter(function(d, i) {\n return !data[i].disabled;\n }));\n\n var stackedWrap = g.select('.nv-focus .nv-stackedWrap')\n .datum(data.filter(function(d) {\n return !d.disabled;\n }));\n\n // Setup Axes\n if (showXAxis) {\n xAxis.scale(x)\n ._ticks(nv.utils.calcTicksX(availableWidth / 100, data))\n .tickSize(-availableHeight, 0);\n }\n\n if (showYAxis) {\n var ticks;\n if (stacked.offset() === 'wiggle') {\n ticks = 0;\n } else {\n ticks = nv.utils.calcTicksY(availableHeight / 36, data);\n }\n yAxis.scale(y)\n ._ticks(ticks)\n .tickSize(-availableWidth, 0);\n }\n\n //============================================================\n // Update Axes\n //============================================================\n function updateXAxis() {\n if (showXAxis) {\n g.select('.nv-focus .nv-x.nv-axis')\n .attr('transform', 'translate(0,' + availableHeight + ')')\n .transition()\n .duration(duration)\n .call(xAxis)\n ;\n }\n }\n\n function updateYAxis() {\n if (showYAxis) {\n if (stacked.style() === 'expand' || stacked.style() === 'stack_percent') {\n var currentFormat = yAxis.tickFormat();\n\n if (!oldYTickFormat || currentFormat !== percentFormatter) {\n oldYTickFormat = currentFormat;\n }\n\n //Forces the yAxis to use percentage in 'expand' mode.\n yAxis.tickFormat(percentFormatter);\n } else {\n if (oldYTickFormat) {\n yAxis.tickFormat(oldYTickFormat);\n oldYTickFormat = null;\n }\n }\n\n g.select('.nv-focus .nv-y.nv-axis')\n .transition().duration(0)\n .call(yAxis);\n }\n }\n\n //============================================================\n // Update Focus\n //============================================================\n if (!focusEnable) {\n stackedWrap.transition().call(stacked);\n updateXAxis();\n updateYAxis();\n } else {\n focus.width(availableWidth);\n g.select('.nv-focusWrap')\n .attr('transform', 'translate(0,' + (availableHeight + margin.bottom + focus.margin().top) + ')')\n .datum(data.filter(function(d) {\n return !d.disabled;\n }))\n .call(focus);\n var extent = focus.brush.empty() ? focus.xDomain() : focus.brush.extent();\n if (extent !== null) {\n onBrush(extent);\n }\n }\n\n //============================================================\n // Event Handling/Dispatching (in chart's scope)\n //------------------------------------------------------------\n\n stacked.dispatch.on('areaClick.toggle', function(e) {\n if (data.filter(function(d) {\n return !d.disabled;\n }).length === 1) {\n data.forEach(function(d) {\n d.disabled = false;\n });\n } else {\n data.forEach(function(d, i) {\n d.disabled = (i != e.seriesIndex);\n });\n }\n\n state.disabled = data.map(function(d) {\n return !!d.disabled;\n });\n dispatch.stateChange(state);\n\n chart.update();\n });\n\n legend.dispatch.on('stateChange', function(newState) {\n for (var key in newState) {\n state[key] = newState[key];\n }\n dispatch.stateChange(state);\n chart.update();\n });\n\n controls.dispatch.on('legendClick', function(d, i) {\n if (!d.disabled) return;\n\n controlsData = controlsData.map(function(s) {\n s.disabled = true;\n return s;\n });\n d.disabled = false;\n\n stacked.style(d.style);\n\n\n state.style = stacked.style();\n dispatch.stateChange(state);\n\n chart.update();\n });\n\n interactiveLayer.dispatch.on('elementMousemove', function(e) {\n stacked.clearHighlights();\n var singlePoint,\n pointIndex,\n pointXLocation,\n allData = [],\n valueSum = 0,\n allNullValues = true,\n atleastOnePoint = false;\n data\n .filter(function(series, i) {\n series.seriesIndex = i;\n return !series.disabled;\n })\n .forEach(function(series, i) {\n pointIndex = nv.interactiveBisect(series.values, e.pointXValue, chart.x());\n var point = series.values[pointIndex];\n var pointYValue = chart.y()(point, pointIndex);\n if (pointYValue != null && pointYValue > 0) {\n stacked.highlightPoint(i, pointIndex, true);\n atleastOnePoint = true;\n }\n\n // Draw at least one point if all values are zero.\n if (i === (data.length - 1) && !atleastOnePoint) {\n stacked.highlightPoint(i, pointIndex, true);\n }\n if (typeof point === 'undefined') return;\n if (typeof singlePoint === 'undefined') singlePoint = point;\n if (typeof pointXLocation === 'undefined') {\n pointXLocation = chart.xScale()(\n chart.x()(point, pointIndex));\n }\n\n //If we are in 'expand' mode, use the stacked percent value instead of raw value.\n var tooltipValue = (stacked.style() == 'expand') ? point.display.y : chart.y()(point, pointIndex);\n allData.push({\n key: series.key,\n value: tooltipValue,\n color: color(series, series.seriesIndex),\n point: point\n });\n\n if (showTotalInTooltip && stacked.style() != 'expand' && tooltipValue != null) {\n valueSum += tooltipValue;\n allNullValues = false;\n }\n ;\n });\n\n allData.reverse();\n\n //Highlight the tooltip entry based on which stack the mouse is closest to.\n if (allData.length > 2) {\n var yValue = chart.yScale().invert(e.mouseY);\n var yDistMax = Infinity, indexToHighlight = null;\n allData.forEach(function(series, i) {\n\n //To handle situation where the stacked area chart is negative, we need to use absolute values\n //when checking if the mouse Y value is within the stack area.\n yValue = Math.abs(yValue);\n var stackedY0 = Math.abs(series.point.display.y0);\n var stackedY = Math.abs(series.point.display.y);\n if (yValue >= stackedY0 && yValue <= (stackedY + stackedY0)) {\n indexToHighlight = i;\n return;\n }\n });\n if (indexToHighlight != null) {\n allData[indexToHighlight].highlight = true;\n }\n }\n\n //If we are not in 'expand' mode, add a 'Total' row to the tooltip.\n if (showTotalInTooltip && stacked.style() != 'expand' && allData.length >= 2 && !allNullValues) {\n allData.push({\n key: totalLabel,\n value: valueSum,\n total: true\n });\n }\n\n var xValue = chart.x()(singlePoint, pointIndex);\n\n var valueFormatter = interactiveLayer.tooltip.valueFormatter();\n // Keeps track of the tooltip valueFormatter if the chart changes to expanded view\n if (stacked.style() === 'expand' || stacked.style() === 'stack_percent') {\n if (!oldValueFormatter) {\n oldValueFormatter = valueFormatter;\n }\n //Forces the tooltip to use percentage in 'expand' mode.\n valueFormatter = d3.format('.1%');\n } else {\n if (oldValueFormatter) {\n valueFormatter = oldValueFormatter;\n oldValueFormatter = null;\n }\n }\n\n interactiveLayer.tooltip\n .valueFormatter(valueFormatter)\n .data(\n {\n value: xValue,\n series: allData\n }\n )();\n\n interactiveLayer.renderGuideLine(pointXLocation);\n\n });\n\n interactiveLayer.dispatch.on('elementMouseout', function(e) {\n stacked.clearHighlights();\n });\n\n /* Update `main' graph on brush update. */\n focus.dispatch.on('onBrush', function(extent) {\n onBrush(extent);\n });\n\n // Update chart from a state object passed to event handler\n dispatch.on('changeState', function(e) {\n\n if (typeof e.disabled !== 'undefined' && data.length === e.disabled.length) {\n data.forEach(function(series, i) {\n series.disabled = e.disabled[i];\n });\n\n state.disabled = e.disabled;\n }\n\n if (typeof e.style !== 'undefined') {\n stacked.style(e.style);\n style = e.style;\n }\n\n chart.update();\n });\n\n //============================================================\n // Functions\n //------------------------------------------------------------\n\n function onBrush(extent) {\n // Update Main (Focus)\n var stackedWrap = g.select('.nv-focus .nv-stackedWrap')\n .datum(\n data.filter(function(d) {\n return !d.disabled;\n })\n .map(function(d, i) {\n return {\n key: d.key,\n area: d.area,\n classed: d.classed,\n values: d.values.filter(function(d, i) {\n return stacked.x()(d, i) >= extent[0] && stacked.x()(d, i) <= extent[1];\n }),\n disableTooltip: d.disableTooltip\n };\n })\n );\n stackedWrap.transition().duration(duration).call(stacked);\n\n // Update Main (Focus) Axes\n updateXAxis();\n updateYAxis();\n }\n\n });\n\n renderWatch.renderEnd('stacked Area chart immediate');\n return chart;\n }\n\n //============================================================\n // Event Handling/Dispatching (out of chart's scope)\n //------------------------------------------------------------\n\n stacked.dispatch.on('elementMouseover.tooltip', function(evt) {\n evt.point['x'] = stacked.x()(evt.point);\n evt.point['y'] = stacked.y()(evt.point);\n tooltip.data(evt).hidden(false);\n });\n\n stacked.dispatch.on('elementMouseout.tooltip', function(evt) {\n tooltip.hidden(true);\n });\n //============================================================\n // Expose Public Variables\n //------------------------------------------------------------\n\n // expose chart's sub-components\n chart.dispatch = dispatch;\n chart.stacked = stacked;\n chart.legend = legend;\n chart.controls = controls;\n chart.xAxis = xAxis;\n chart.x2Axis = focus.xAxis;\n chart.yAxis = yAxis;\n chart.y2Axis = focus.yAxis;\n chart.interactiveLayer = interactiveLayer;\n chart.tooltip = tooltip;\n chart.focus = focus;\n\n chart.dispatch = dispatch;\n chart.options = nv.utils.optionsFunc.bind(chart);\n\n chart._options = Object.create({}, {\n // simple options, just get/set the necessary values\n width: {\n get: function() {\n return width;\n }, set: function(_) {\n width = _;\n }\n },\n height: {\n get: function() {\n return height;\n }, set: function(_) {\n height = _;\n }\n },\n showLegend: {\n get: function() {\n return showLegend;\n }, set: function(_) {\n showLegend = _;\n }\n },\n legendPosition: {\n get: function() {\n return legendPosition;\n }, set: function(_) {\n legendPosition = _;\n }\n },\n showXAxis: {\n get: function() {\n return showXAxis;\n }, set: function(_) {\n showXAxis = _;\n }\n },\n showYAxis: {\n get: function() {\n return showYAxis;\n }, set: function(_) {\n showYAxis = _;\n }\n },\n defaultState: {\n get: function() {\n return defaultState;\n }, set: function(_) {\n defaultState = _;\n }\n },\n noData: {\n get: function() {\n return noData;\n }, set: function(_) {\n noData = _;\n }\n },\n showControls: {\n get: function() {\n return showControls;\n }, set: function(_) {\n showControls = _;\n }\n },\n controlLabels: {\n get: function() {\n return controlLabels;\n }, set: function(_) {\n controlLabels = _;\n }\n },\n controlOptions: {\n get: function() {\n return controlOptions;\n }, set: function(_) {\n controlOptions = _;\n }\n },\n showTotalInTooltip: {\n get: function() {\n return showTotalInTooltip;\n }, set: function(_) {\n showTotalInTooltip = _;\n }\n },\n totalLabel: {\n get: function() {\n return totalLabel;\n }, set: function(_) {\n totalLabel = _;\n }\n },\n focusEnable: {\n get: function() {\n return focusEnable;\n }, set: function(_) {\n focusEnable = _;\n }\n },\n focusHeight: {\n get: function() {\n return focus.height();\n }, set: function(_) {\n focus.height(_);\n }\n },\n brushExtent: {\n get: function() {\n return focus.brushExtent();\n }, set: function(_) {\n focus.brushExtent(_);\n }\n },\n\n // options that require extra logic in the setter\n margin: {\n get: function() {\n return margin;\n }, set: function(_) {\n if (_.top !== undefined) {\n margin.top = _.top;\n marginTop = _.top;\n }\n margin.right = _.right !== undefined ? _.right : margin.right;\n margin.bottom = _.bottom !== undefined ? _.bottom : margin.bottom;\n margin.left = _.left !== undefined ? _.left : margin.left;\n }\n },\n focusMargin: {\n get: function() {\n return focus.margin;\n }, set: function(_) {\n focus.margin.top = _.top !== undefined ? _.top : focus.margin.top;\n focus.margin.right = _.right !== undefined ? _.right : focus.margin.right;\n focus.margin.bottom = _.bottom !== undefined ? _.bottom : focus.margin.bottom;\n focus.margin.left = _.left !== undefined ? _.left : focus.margin.left;\n }\n },\n duration: {\n get: function() {\n return duration;\n }, set: function(_) {\n duration = _;\n renderWatch.reset(duration);\n stacked.duration(duration);\n xAxis.duration(duration);\n yAxis.duration(duration);\n }\n },\n color: {\n get: function() {\n return color;\n }, set: function(_) {\n color = nv.utils.getColor(_);\n legend.color(color);\n stacked.color(color);\n focus.color(color);\n }\n },\n x: {\n get: function() {\n return stacked.x();\n }, set: function(_) {\n stacked.x(_);\n focus.x(_);\n }\n },\n y: {\n get: function() {\n return stacked.y();\n }, set: function(_) {\n stacked.y(_);\n focus.y(_);\n }\n },\n rightAlignYAxis: {\n get: function() {\n return rightAlignYAxis;\n }, set: function(_) {\n rightAlignYAxis = _;\n yAxis.orient(rightAlignYAxis ? 'right' : 'left');\n }\n },\n useInteractiveGuideline: {\n get: function() {\n return useInteractiveGuideline;\n }, set: function(_) {\n useInteractiveGuideline = !!_;\n chart.interactive(!_);\n chart.useVoronoi(!_);\n stacked.scatter.interactive(!_);\n }\n }\n });\n\n nv.utils.inheritOptions(chart, stacked);\n nv.utils.initOptions(chart);\n\n return chart;\n };\n\n nv.models.stackedAreaWithFocusChart = function() {\n return nv.models.stackedAreaChart()\n .margin({bottom: 30})\n .focusEnable(true);\n };\n// based on http://bl.ocks.org/kerryrodden/477c1bfb081b783f80ad\n nv.models.sunburst = function() {\n 'use strict';\n\n //============================================================\n // Public Variables with Default Settings\n //------------------------------------------------------------\n\n var margin = {top: 0, right: 0, bottom: 0, left: 0}\n ,\n width = 600\n ,\n height = 600\n ,\n mode = 'count'\n ,\n modes = {\n count: function(d) {\n return 1;\n }, value: function(d) {\n return d.value || d.size;\n }, size: function(d) {\n return d.value || d.size;\n }\n }\n ,\n id = Math.floor(Math.random() * 10000) //Create semi-unique ID in case user doesn't select one\n ,\n container = null\n ,\n color = nv.utils.defaultColor()\n ,\n showLabels = false\n ,\n labelFormat = function(d) {\n if (mode === 'count') {\n return d.name + ' #' + d.value;\n } else {\n return d.name + ' ' + (d.value || d.size);\n }\n }\n ,\n labelThreshold = 0.02\n ,\n sort = function(d1, d2) {\n return d1.name > d2.name;\n }\n ,\n key = function(d, i) {\n if (d.parent !== undefined) {\n return d.name + '-' + d.parent.name + '-' + i;\n } else {\n return d.name;\n }\n }\n ,\n groupColorByParent = true\n ,\n duration = 500\n ,\n dispatch = d3.dispatch('chartClick', 'elementClick', 'elementDblClick', 'elementMousemove', 'elementMouseover',\n 'elementMouseout', 'renderEnd');\n\n //============================================================\n // aux functions and setup\n //------------------------------------------------------------\n\n var x = d3.scale.linear().range([0, 2 * Math.PI]);\n var y = d3.scale.sqrt();\n\n var partition = d3.layout.partition().sort(sort);\n\n var node, availableWidth, availableHeight, radius;\n var prevPositions = {};\n\n var arc = d3.svg.arc()\n .startAngle(function(d) {\n return Math.max(0, Math.min(2 * Math.PI, x(d.x)));\n })\n .endAngle(function(d) {\n return Math.max(0, Math.min(2 * Math.PI, x(d.x + d.dx)));\n })\n .innerRadius(function(d) {\n return Math.max(0, y(d.y));\n })\n .outerRadius(function(d) {\n return Math.max(0, y(d.y + d.dy));\n });\n\n function rotationToAvoidUpsideDown(d) {\n var centerAngle = computeCenterAngle(d);\n if (centerAngle > 90) {\n return 180;\n } else {\n return 0;\n }\n }\n\n function computeCenterAngle(d) {\n var startAngle = Math.max(0, Math.min(2 * Math.PI, x(d.x)));\n var endAngle = Math.max(0, Math.min(2 * Math.PI, x(d.x + d.dx)));\n var centerAngle = (((startAngle + endAngle) / 2) * (180 / Math.PI)) - 90;\n return centerAngle;\n }\n\n function computeNodePercentage(d) {\n var startAngle = Math.max(0, Math.min(2 * Math.PI, x(d.x)));\n var endAngle = Math.max(0, Math.min(2 * Math.PI, x(d.x + d.dx)));\n return (endAngle - startAngle) / (2 * Math.PI);\n }\n\n function labelThresholdMatched(d) {\n var startAngle = Math.max(0, Math.min(2 * Math.PI, x(d.x)));\n var endAngle = Math.max(0, Math.min(2 * Math.PI, x(d.x + d.dx)));\n\n var size = endAngle - startAngle;\n return size > labelThreshold;\n }\n\n // When zooming: interpolate the scales.\n function arcTweenZoom(e, i) {\n var xd = d3.interpolate(x.domain(), [node.x, node.x + node.dx]),\n yd = d3.interpolate(y.domain(), [node.y, 1]),\n yr = d3.interpolate(y.range(), [node.y ? 20 : 0, radius]);\n\n if (i === 0) {\n return function() {\n return arc(e);\n };\n } else {\n return function(t) {\n x.domain(xd(t));\n y.domain(yd(t)).range(yr(t));\n return arc(e);\n };\n }\n ;\n }\n\n function arcTweenUpdate(d) {\n var ipo = d3.interpolate({x: d.x0, dx: d.dx0, y: d.y0, dy: d.dy0}, d);\n\n return function(t) {\n var b = ipo(t);\n\n d.x0 = b.x;\n d.dx0 = b.dx;\n d.y0 = b.y;\n d.dy0 = b.dy;\n\n return arc(b);\n };\n }\n\n function updatePrevPosition(node) {\n var k = key(node);\n if (!prevPositions[k]) prevPositions[k] = {};\n var pP = prevPositions[k];\n pP.dx = node.dx;\n pP.x = node.x;\n pP.dy = node.dy;\n pP.y = node.y;\n }\n\n function storeRetrievePrevPositions(nodes) {\n nodes.forEach(function(n) {\n var k = key(n);\n var pP = prevPositions[k];\n //console.log(k,n,pP);\n if (pP) {\n n.dx0 = pP.dx;\n n.x0 = pP.x;\n n.dy0 = pP.dy;\n n.y0 = pP.y;\n } else {\n n.dx0 = n.dx;\n n.x0 = n.x;\n n.dy0 = n.dy;\n n.y0 = n.y;\n }\n updatePrevPosition(n);\n });\n }\n\n function zoomClick(d) {\n var labels = container.selectAll('text');\n var path = container.selectAll('path');\n\n // fade out all text elements\n labels.transition().attr('opacity', 0);\n\n // to allow reference to the new center node\n node = d;\n\n path.transition()\n .duration(duration)\n .attrTween('d', arcTweenZoom)\n .each('end', function(e) {\n // partially taken from here: http://bl.ocks.org/metmajer/5480307\n // check if the animated element's data e lies within the visible angle span given in d\n if (e.x >= d.x && e.x < (d.x + d.dx)) {\n if (e.depth >= d.depth) {\n // get a selection of the associated text element\n var parentNode = d3.select(this.parentNode);\n var arcText = parentNode.select('text');\n\n // fade in the text element and recalculate positions\n arcText.transition().duration(duration)\n .text(function(e) {\n return labelFormat(e);\n })\n .attr('opacity', function(d) {\n if (labelThresholdMatched(d)) {\n return 1;\n } else {\n return 0;\n }\n })\n .attr('transform', function() {\n var width = this.getBBox().width;\n if (e.depth === 0) {\n return 'translate(' + (width / 2 * -1) + ',0)';\n } else if (e.depth === d.depth) {\n return 'translate(' + (y(e.y) + 5) + ',0)';\n } else {\n var centerAngle = computeCenterAngle(e);\n var rotation = rotationToAvoidUpsideDown(e);\n if (rotation === 0) {\n return 'rotate(' + centerAngle + ')translate(' + (y(e.y) + 5) + ',0)';\n } else {\n return 'rotate(' + centerAngle + ')translate(' + (y(e.y) + width + 5) + ',0)rotate('\n + rotation + ')';\n }\n }\n });\n }\n }\n });\n }\n\n //============================================================\n // chart function\n //------------------------------------------------------------\n var renderWatch = nv.utils.renderWatch(dispatch);\n\n function chart(selection) {\n renderWatch.reset();\n\n selection.each(function(data) {\n container = d3.select(this);\n availableWidth = nv.utils.availableWidth(width, container, margin);\n availableHeight = nv.utils.availableHeight(height, container, margin);\n radius = Math.min(availableWidth, availableHeight) / 2;\n\n y.range([0, radius]);\n\n // Setup containers and skeleton of chart\n var wrap = container.select('g.nvd3.nv-wrap.nv-sunburst');\n if (!wrap[0][0]) {\n wrap = container.append('g')\n .attr('class', 'nvd3 nv-wrap nv-sunburst nv-chart-' + id)\n .attr('transform',\n 'translate(' + ((availableWidth / 2) + margin.left + margin.right) + ',' + ((availableHeight / 2)\n + margin.top + margin.bottom) + ')');\n } else {\n wrap.attr('transform',\n 'translate(' + ((availableWidth / 2) + margin.left + margin.right) + ',' + ((availableHeight / 2)\n + margin.top + margin.bottom) + ')');\n }\n\n container.on('click', function(d, i) {\n dispatch.chartClick({\n data: d,\n index: i,\n pos: d3.event,\n id: id\n });\n });\n\n partition.value(modes[mode] || modes['count']);\n\n //reverse the drawing order so that the labels of inner\n //arcs are drawn on top of the outer arcs.\n var nodes = partition.nodes(data[0]).reverse();\n\n storeRetrievePrevPositions(nodes);\n var cG = wrap.selectAll('.arc-container').data(nodes, key);\n\n //handle new datapoints\n var cGE = cG.enter()\n .append('g')\n .attr('class', 'arc-container');\n\n cGE.append('path')\n .attr('d', arc)\n .style('fill', function(d) {\n if (d.color) {\n return d.color;\n } else if (groupColorByParent) {\n return color((d.children ? d : d.parent).name);\n } else {\n return color(d.name);\n }\n })\n .style('stroke', '#FFF')\n .on('click', function(d, i) {\n zoomClick(d);\n dispatch.elementClick({\n data: d,\n index: i\n });\n })\n .on('mouseover', function(d, i) {\n d3.select(this).classed('hover', true).style('opacity', 0.8);\n dispatch.elementMouseover({\n data: d,\n color: d3.select(this).style('fill'),\n percent: computeNodePercentage(d)\n });\n })\n .on('mouseout', function(d, i) {\n d3.select(this).classed('hover', false).style('opacity', 1);\n dispatch.elementMouseout({\n data: d\n });\n })\n .on('mousemove', function(d, i) {\n dispatch.elementMousemove({\n data: d\n });\n });\n\n ///Iterating via each and selecting based on the this\n ///makes it work ... a cG.selectAll('path') doesn't.\n ///Without iteration the data (in the element) didn't update.\n cG.each(function(d) {\n d3.select(this).select('path')\n .transition()\n .duration(duration)\n .attrTween('d', arcTweenUpdate);\n });\n\n if (showLabels) {\n //remove labels first and add them back\n cG.selectAll('text').remove();\n\n //this way labels are on top of newly added arcs\n cG.append('text')\n .text(function(e) {\n return labelFormat(e);\n })\n .transition()\n .duration(duration)\n .attr('opacity', function(d) {\n if (labelThresholdMatched(d)) {\n return 1;\n } else {\n return 0;\n }\n })\n .attr('transform', function(d) {\n var width = this.getBBox().width;\n if (d.depth === 0) {\n return 'rotate(0)translate(' + (width / 2 * -1) + ',0)';\n } else {\n var centerAngle = computeCenterAngle(d);\n var rotation = rotationToAvoidUpsideDown(d);\n if (rotation === 0) {\n return 'rotate(' + centerAngle + ')translate(' + (y(d.y) + 5) + ',0)';\n } else {\n return 'rotate(' + centerAngle + ')translate(' + (y(d.y) + width + 5) + ',0)rotate(' + rotation\n + ')';\n }\n }\n });\n }\n\n //zoom out to the center when the data is updated.\n zoomClick(nodes[nodes.length - 1]);\n\n\n //remove unmatched elements ...\n cG.exit()\n .transition()\n .duration(duration)\n .attr('opacity', 0)\n .each('end', function(d) {\n var k = key(d);\n prevPositions[k] = undefined;\n })\n .remove();\n });\n\n\n renderWatch.renderEnd('sunburst immediate');\n return chart;\n }\n\n //============================================================\n // Expose Public Variables\n //------------------------------------------------------------\n\n chart.dispatch = dispatch;\n chart.options = nv.utils.optionsFunc.bind(chart);\n\n chart._options = Object.create({}, {\n // simple options, just get/set the necessary values\n width: {\n get: function() {\n return width;\n }, set: function(_) {\n width = _;\n }\n },\n height: {\n get: function() {\n return height;\n }, set: function(_) {\n height = _;\n }\n },\n mode: {\n get: function() {\n return mode;\n }, set: function(_) {\n mode = _;\n }\n },\n id: {\n get: function() {\n return id;\n }, set: function(_) {\n id = _;\n }\n },\n duration: {\n get: function() {\n return duration;\n }, set: function(_) {\n duration = _;\n }\n },\n groupColorByParent: {\n get: function() {\n return groupColorByParent;\n }, set: function(_) {\n groupColorByParent = !!_;\n }\n },\n showLabels: {\n get: function() {\n return showLabels;\n }, set: function(_) {\n showLabels = !!_;\n }\n },\n labelFormat: {\n get: function() {\n return labelFormat;\n }, set: function(_) {\n labelFormat = _;\n }\n },\n labelThreshold: {\n get: function() {\n return labelThreshold;\n }, set: function(_) {\n labelThreshold = _;\n }\n },\n sort: {\n get: function() {\n return sort;\n }, set: function(_) {\n sort = _;\n }\n },\n key: {\n get: function() {\n return key;\n }, set: function(_) {\n key = _;\n }\n },\n // options that require extra logic in the setter\n margin: {\n get: function() {\n return margin;\n }, set: function(_) {\n margin.top = _.top != undefined ? _.top : margin.top;\n margin.right = _.right != undefined ? _.right : margin.right;\n margin.bottom = _.bottom != undefined ? _.bottom : margin.bottom;\n margin.left = _.left != undefined ? _.left : margin.left;\n }\n },\n color: {\n get: function() {\n return color;\n }, set: function(_) {\n color = nv.utils.getColor(_);\n }\n }\n });\n\n nv.utils.initOptions(chart);\n return chart;\n };\n nv.models.sunburstChart = function() {\n \"use strict\";\n\n //============================================================\n // Public Variables with Default Settings\n //------------------------------------------------------------\n\n var sunburst = nv.models.sunburst();\n var tooltip = nv.models.tooltip();\n\n var margin = {top: 30, right: 20, bottom: 20, left: 20}\n , width = null\n , height = null\n , color = nv.utils.defaultColor()\n , showTooltipPercent = false\n , id = Math.round(Math.random() * 100000)\n , defaultState = null\n , noData = null\n , duration = 250\n , dispatch = d3.dispatch('stateChange', 'changeState', 'renderEnd');\n\n\n //============================================================\n // Private Variables\n //------------------------------------------------------------\n\n var renderWatch = nv.utils.renderWatch(dispatch);\n\n tooltip\n .duration(0)\n .headerEnabled(false)\n .valueFormatter(function(d) {\n return d;\n });\n\n //============================================================\n // Chart function\n //------------------------------------------------------------\n\n function chart(selection) {\n renderWatch.reset();\n renderWatch.models(sunburst);\n\n selection.each(function(data) {\n var container = d3.select(this);\n\n nv.utils.initSVG(container);\n\n var availableWidth = nv.utils.availableWidth(width, container, margin);\n var availableHeight = nv.utils.availableHeight(height, container, margin);\n\n chart.update = function() {\n if (duration === 0) {\n container.call(chart);\n } else {\n container.transition().duration(duration).call(chart);\n }\n };\n chart.container = container;\n\n // Display No Data message if there's nothing to show.\n if (!data || !data.length) {\n nv.utils.noData(chart, container);\n return chart;\n } else {\n container.selectAll('.nv-noData').remove();\n }\n\n sunburst.width(availableWidth).height(availableHeight).margin(margin);\n container.call(sunburst);\n });\n\n renderWatch.renderEnd('sunburstChart immediate');\n return chart;\n }\n\n //============================================================\n // Event Handling/Dispatching (out of chart's scope)\n //------------------------------------------------------------\n\n sunburst.dispatch.on('elementMouseover.tooltip', function(evt) {\n evt.series = {\n key: evt.data.name,\n value: (evt.data.value || evt.data.size),\n color: evt.color,\n percent: evt.percent\n };\n if (!showTooltipPercent) {\n delete evt.percent;\n delete evt.series.percent;\n }\n tooltip.data(evt).hidden(false);\n });\n\n sunburst.dispatch.on('elementMouseout.tooltip', function(evt) {\n tooltip.hidden(true);\n });\n\n sunburst.dispatch.on('elementMousemove.tooltip', function(evt) {\n tooltip();\n });\n\n //============================================================\n // Expose Public Variables\n //------------------------------------------------------------\n\n // expose chart's sub-components\n chart.dispatch = dispatch;\n chart.sunburst = sunburst;\n chart.tooltip = tooltip;\n chart.options = nv.utils.optionsFunc.bind(chart);\n\n // use Object get/set functionality to map between vars and chart functions\n chart._options = Object.create({}, {\n // simple options, just get/set the necessary values\n noData: {\n get: function() {\n return noData;\n }, set: function(_) {\n noData = _;\n }\n },\n defaultState: {\n get: function() {\n return defaultState;\n }, set: function(_) {\n defaultState = _;\n }\n },\n showTooltipPercent: {\n get: function() {\n return showTooltipPercent;\n }, set: function(_) {\n showTooltipPercent = _;\n }\n },\n\n // options that require extra logic in the setter\n color: {\n get: function() {\n return color;\n }, set: function(_) {\n color = _;\n sunburst.color(color);\n }\n },\n duration: {\n get: function() {\n return duration;\n }, set: function(_) {\n duration = _;\n renderWatch.reset(duration);\n sunburst.duration(duration);\n }\n },\n margin: {\n get: function() {\n return margin;\n }, set: function(_) {\n margin.top = _.top !== undefined ? _.top : margin.top;\n margin.right = _.right !== undefined ? _.right : margin.right;\n margin.bottom = _.bottom !== undefined ? _.bottom : margin.bottom;\n margin.left = _.left !== undefined ? _.left : margin.left;\n sunburst.margin(margin);\n }\n }\n });\n nv.utils.inheritOptions(chart, sunburst);\n nv.utils.initOptions(chart);\n return chart;\n\n };\n\n nv.version = \"1.8.6\";\n })();\n\n return d3;\n\n });\n","export class ChartData {\n /**\n * Defines the default multiplier for chart overhead. The space above the maximum value.\n */\n static get DEFAULT_MULTIPLIER() {\n return 1.2;\n }\n\n /**\n * Defines the default divisions for chart. Used to calculate chart ticks.\n */\n static get MAXIMUM_DIVISIONS() {\n return 10;\n }\n\n static get COLORS() {\n return ['#003663', '#E84E0F', '#02A99A', '#999999'];\n }\n\n constructor(translateService, disableRangeUpdate, disableOldDataRemoval, filter) {\n this.filter = filter;\n this.initialChartSetup(translateService, disableRangeUpdate, disableOldDataRemoval);\n }\n\n initialChartSetup(translateService, disableRangeUpdate, disableOldDataRemoval, resetData = true) {\n this.disableRangeUpdate = disableRangeUpdate;\n this.disableOldDataRemoval = disableOldDataRemoval;\n this.translateService = translateService;\n this.range = 150;\n this.chartOptions = this.getDefaultChartOptions(translateService);\n this.chartSetup(this.chartOptions);\n if (resetData) {\n this.dataHolder = this.createDataHolder();\n this.firstLoad = true;\n }\n }\n\n refresh() {\n this.initialChartSetup(this.translateService, this.disableRangeUpdate, this.disableOldDataRemoval, false);\n this.translateLabels(this.dataHolder);\n this.updateRange(this.dataHolder);\n }\n\n\n /**\n * Hook used to translate all labels. Default implementation translates dataHolder series keys\n * @param dataHolder\n */\n translateLabels(dataHolder) {\n this.createDataHolder().forEach((series, index) => {\n if (dataHolder[index].originalKey) {\n dataHolder[index].originalKey = series.key;\n } else {\n dataHolder[index].key = series.key;\n }\n });\n }\n\n setSubTitle(keyValues) {\n this.chartOptions.title.enable = true;\n const subTitleElements = keyValues.map((keyValue) => {\n if (Array.isArray(keyValue.value) && !keyValue.value.length) {\n return;\n }\n const values = Array.isArray(keyValue.value) ? keyValue.value.join('/') : keyValue.value;\n return keyValue.label + (values !== undefined ? `<span class=\"data-value\">${values}</span>` : '');\n });\n this.chartOptions.title.html = subTitleElements.map((subTitleElement) => `<span class=\"info-element\">${subTitleElement}</span>`);\n }\n\n /**\n * Provides chart options if custom setup needs to be done\n * @param chartOptions\n */\n chartSetup(chartOptions) {\n }\n\n /**\n * Returns the data holder array for the chart data.\n * Must be implemented.\n */\n createDataHolder() {\n throw new Error('Must implement data holder creation');\n }\n\n /**\n * Adds data to the data holder\n * @param timestamp time of the data\n * @param newData the new data\n */\n addData(timestamp, newData) {\n this.removeOldData(this.dataHolder, this.range);\n this.addNewData(this.dataHolder, timestamp, newData, this.isFirstLoad());\n this.updateRange(this.dataHolder);\n if (this.firstLoad) {\n this.firstLoad = false;\n }\n }\n\n /**\n * Removes data from the data holder that is obsolete based on range property\n * @param dataHolder data holder\n * @param range the number of entries to keep\n */\n removeOldData(dataHolder, range) {\n if (this.disableOldDataRemoval) {\n return;\n }\n if (dataHolder[0].values.length > range) {\n dataHolder.forEach((data) => data.values.shift());\n }\n }\n\n /**\n * Adds data to data holder\n * Must be implemented.\n * @param dataHolder\n * @param timestamp\n * @param data\n * @param isFirstLoad\n */\n addNewData(dataHolder, timestamp, data, isFirstLoad) {\n }\n\n /**\n * Updates the chart axis range, based on maximum value in data holder\n * @param dataHolder\n * @param multiplier\n */\n updateRange(dataHolder, multiplier) {\n if (this.disableRangeUpdate) {\n return;\n }\n const [domainUpperBound] = ChartData.calculateMaxChartValueAndDivisions(dataHolder, multiplier);\n this.chartOptions.chart.yDomain = [0, domainUpperBound];\n }\n\n isFirstLoad() {\n return this.firstLoad;\n }\n\n getDefaultChartOptions(translateService) {\n return {\n chart: {\n interpolate: 'monotone',\n type: 'lineChart',\n height: 500,\n margin: {\n left: 80,\n right: 80\n },\n x: function (d) {\n return d[0];\n },\n y: function (d) {\n return d[1];\n },\n clipEdge: true,\n noData: translateService.instant('resource.no_data'),\n showControls: false,\n duration: 0,\n rightAlignYAxis: false,\n useInteractiveGuideline: true,\n xAxis: {\n showMaxMin: false,\n tickFormat: function (d) {\n return d3.time.format('%X')(new Date(d));\n }\n },\n yAxis: {\n showMaxMin: false,\n tickFormat: function (d) {\n return d;\n }\n },\n legend: {\n maxKeyLength: 100\n },\n color: ChartData.COLORS\n },\n title: {\n enable: true,\n className: 'chart-additional-info',\n html: ' '\n }\n };\n }\n\n /**\n * Returns the maximum value in data holder\n * @param dataHolder\n * @return {number}\n */\n static getMaxValueFromDataHolder(dataHolder) {\n return Math.max(...dataHolder.filter((data) => !data.disabled).flatMap((data) => ChartData.getMaxValueForDataSeries(data)));\n }\n\n /**\n * Returns the maximum value in specific data series\n * @param dataSeries\n * @return {number}\n */\n static getMaxValueForDataSeries(dataSeries) {\n return Math.max(...dataSeries.values.map((data) => data[1]));\n }\n\n /**\n * Calculated maximum value for chart axis and divisions width\n * @param dataHolder\n * @param multiplier\n * @return {(number|number)[]}\n */\n static calculateMaxChartValueAndDivisions(dataHolder, multiplier) {\n let maxDataValue;\n\n if (Array.isArray(dataHolder)) {\n maxDataValue = ChartData.getMaxValueFromDataHolder(dataHolder);\n } else {\n maxDataValue = ChartData.getMaxValueForDataSeries(dataHolder);\n }\n\n const maxChartValue = Math.round(maxDataValue * (multiplier || ChartData.DEFAULT_MULTIPLIER)) || 1;\n const div = Math.ceil(maxChartValue / ChartData.MAXIMUM_DIVISIONS);\n return [maxChartValue, div];\n }\n\n /**\n * Returnes a D3 range for chart axis based on maximum value and divisions width\n * @param dataHolder\n * @param multiplier\n * @return {*}\n */\n static getIntegerRangeForValues(dataHolder, multiplier) {\n const [maxChartValue, divisions] = ChartData.calculateMaxChartValueAndDivisions(dataHolder, multiplier);\n return d3.range(0, maxChartValue + 1, divisions);\n }\n\n static formatBytesValue(value, dataHolder) {\n let maxChartValue = value;\n if (dataHolder) {\n maxChartValue = Math.max(...dataHolder.filter((data)=> !data.disabled).flatMap((data) => data.values).flatMap((data) => data[1]));\n }\n\n const k = 1024;\n const i = Math.floor(Math.log(maxChartValue) / Math.log(k));\n const sizes = ['Bytes', 'KB', 'MB', 'GB', 'TB', 'PB', 'EB', 'ZB', 'YB'];\n\n const relativeValue = parseFloat(value) / Math.pow(k, i);\n return `${relativeValue.toFixed(2)} ${sizes[i]}`;\n }\n\n formatNumber(value) {\n if (!value || !this.filter) {\n return;\n }\n // This may look strange, but I made it like this for consistency. When/if fixing it will be easier to find.\n return this.filter('currency')(value, '', 0);\n }\n}\n","angular\n .module('graphdb.framework.utils.notifications', [])\n .factory('Notifications', Notifications);\n\nNotifications.$inject = ['toastr', '$translate'];\n\nfunction Notifications(toastr, $translate) {\n return {\n showToastMessageWithDelay\n };\n\n /**\n * This method will show message with tiny delay and only after completion\n * of latter redirection to \"graphs-visualizations\" page will happen.\n * @param {string} message The message to be displayed.\n * @return {Promise<any>}\n */\n function showToastMessageWithDelay(message) {\n return new Promise((r) => {\n toastr.success($translate.instant(message));\n setTimeout(r, 200);\n });\n }\n}\n","import {ChartData} from \"../chart-data\";\n\nexport class HeapMemoryChart extends ChartData {\n constructor(translateService) {\n super(translateService, false, false);\n }\n\n createDataHolder() {\n return [{\n key: this.translateService.instant('resource.memory.committed'),\n values: []\n }, {\n key: this.translateService.instant('resource.memory.used'),\n area: 'true',\n values: []\n }];\n }\n addNewData(dataHolder, timestamp, data) {\n const [committed, used] = dataHolder;\n const memoryData = this.parseData(data);\n committed.values.push([timestamp, memoryData.committed]);\n used.values.push([timestamp, memoryData.used]);\n this.setMaxHeapSize(memoryData.max);\n }\n\n parseData(data) {\n return data.heapMemoryUsage;\n }\n\n setMaxHeapSize(max) {\n if (max > 0) {\n const subTitleKeyValues = [{\n label: this.translateService.instant('resource.memory.heap.max'),\n value: HeapMemoryChart.formatBytesValue(max)\n }];\n this.setSubTitle(subTitleKeyValues);\n }\n }\n\n updateRange(dataHolder) {\n this.setScale(dataHolder);\n super.updateRange(dataHolder);\n }\n setScale(dataHolder) {\n this.chartOptions.chart.yAxis.tickFormat = (d) => {\n return HeapMemoryChart.formatBytesValue(d, dataHolder);\n };\n }\n}\n","angular\n .module('graphdb.framework.rest.cluster.service', [])\n .factory('ClusterRestService', ClusterRestService);\n\nClusterRestService.$inject = ['$http'];\n\nconst CLUSTER_GROUP_ENDPOINT = 'rest/cluster';\n\nfunction ClusterRestService($http) {\n return {\n getClusterConfig,\n createCluster,\n updateCluster,\n deleteCluster,\n addNodesToCluster,\n removeNodesFromCluster,\n getClusterStatus,\n getNodeStatus\n };\n\n function getClusterConfig() {\n return $http.get(`${CLUSTER_GROUP_ENDPOINT}/config`);\n }\n\n function createCluster(groupConfiguration) {\n return $http.post(`${CLUSTER_GROUP_ENDPOINT}/config`, groupConfiguration);\n }\n\n function updateCluster(groupConfiguration) {\n if (groupConfiguration.nodes) {\n delete groupConfiguration.nodes;\n }\n return $http.patch(`${CLUSTER_GROUP_ENDPOINT}/config`, groupConfiguration);\n }\n\n function deleteCluster(forceDelete) {\n const data = $.param({\n force: forceDelete\n });\n return $http.delete(`${CLUSTER_GROUP_ENDPOINT}/config?${data}`);\n }\n\n function addNodesToCluster(nodesArray) {\n return $http.post(`${CLUSTER_GROUP_ENDPOINT}/config/node`, {nodes: nodesArray});\n }\n\n function removeNodesFromCluster(nodesArray) {\n return $http.delete(`${CLUSTER_GROUP_ENDPOINT}/config/node`, {data: {nodes: nodesArray}, headers: {'Content-Type': 'application/json'}});\n }\n\n function getClusterStatus() {\n return $http.get(`${CLUSTER_GROUP_ENDPOINT}/group/status`);\n }\n\n function getNodeStatus() {\n return $http.get(`${CLUSTER_GROUP_ENDPOINT}/node/status`);\n }\n}\n","import 'angular/utils/local-storage-adapter';\n\nangular\n .module('graphdb.framework.core.directives.queryeditor.sparqltab', [\n 'graphdb.framework.core',\n 'graphdb.framework.utils.localstorageadapter'\n ])\n .directive('sparqlTab', sparqlTabDirective);\n\nsparqlTabDirective.$inject = ['$rootScope', 'LocalStorageAdapter', 'LSKeys', 'ModalService'];\n\nfunction sparqlTabDirective($rootScope, LocalStorageAdapter, LSKeys, ModalService) {\n const SparqlTabCtrl = ['$scope', '$element', '$rootScope', 'ModalService', 'toastr', '$translate', function ($scope, $element, $rootScope, ModalService, toastr, $translate) {\n $scope.state = {};\n\n function getQueryID(element) {\n return $(element).attr('data-id');\n }\n\n function findTabIndexByID(id) {\n for (let i = 0; i < $scope.tabs.length; i++) {\n const tab = $scope.tabs[i];\n if (tab.id === id) {\n return i;\n }\n }\n }\n\n $($element).on('shown.bs.tab', function (e) {\n $rootScope.$broadcast('tabAction', e);\n });\n\n $scope.deleteTab = deleteTab;\n $scope.editCurrentTab = editCurrentTab;\n $scope.selectThisTab = selectThisTab;\n\n function selectThisTab(e) {\n e.preventDefault();\n e.stopPropagation();\n if ($scope.isTabChangeOk(false)) {\n $($element).tab('show');\n }\n }\n\n function selectTab(id) {\n $('a[data-id = \"' + id + '\"]').tab('show');\n }\n\n function deleteTab(e) {\n e.preventDefault();\n e.stopPropagation();\n\n if ($scope.tabs.length < 2) {\n toastr.warning($translate.instant('sparql.tab.directive.close.last.warning'));\n return;\n }\n\n if (e.shiftKey) {\n $scope.state.selectedTabId = getQueryID($element);\n\n ModalService.openSimpleModal({\n title: $translate.instant('common.confirm'),\n message: $translate.instant('sparql.tab.directive.delete.all.tabs.warning'),\n warning: true\n }).result.then(function () {\n deleteAllTabsExceptSelected($scope.state.selectedTabId);\n });\n } else {\n $scope.state.idForDelete = getQueryID($element);\n\n ModalService.openSimpleModal({\n title: $translate.instant('common.confirm'),\n message: $translate.instant('sparql.tab.directive.close.tab.warning'),\n warning: true\n }).result.then(function () {\n deleteTabByID($scope.state.idForDelete);\n });\n }\n angular.element(document).find('.CodeMirror textarea:first-child').focus();\n }\n\n function editCurrentTab() {\n if (getQueryID($element) !== $scope.currentQuery.id) {\n return;\n }\n $scope.editCurrentlySelectedOnly.$show();\n //fix for buttons for edit\n const $editableButtons = $(\".editable-buttons\");\n $editableButtons.children(\".btn.btn-primary\").addClass('btn-sm');\n $editableButtons.children(\".btn.btn-default\").addClass('btn-sm');\n $('.editable-controls .editable-input').addClass('form-control-sm').on('change', function ($el) {\n $scope.currentQuery.name = $el.currentTarget.$$currentValue;\n });\n //$('.editable-buttons').css('margin-top', '5px');\n //$('.editable-input.editable-has-buttons').css('width', '50%');\n $('.editable-buttons .glyphicon.glyphicon-ok')\n .removeClass('glyphicon glyphicon-ok')\n .addClass('fa fa-check');\n $('.editable-buttons .glyphicon.glyphicon-remove')\n .removeClass('glyphicon glyphicon-remove')\n .addClass('fa fa-close');\n }\n\n function deleteTabByID(id) {\n if (angular.isUndefined(id)) {\n throw 'Delete by id was called with undefined id';\n }\n const idx = findTabIndexByID(id);\n $scope.tabs.splice(idx, 1);\n\n if (id === $scope.currentQuery.id) {\n if ($scope.tabs.length > 0) {\n if (idx > 0) {\n // select previous tab if we deleted any but the first tab\n selectTab($scope.tabs[idx - 1].id);\n } else {\n // select first tab if we deleted the first tab\n selectTab($scope.tabs[0].id);\n }\n }\n }\n }\n\n function deleteAllTabsExceptSelected(id) {\n $scope.tabs = $scope.tabs.filter(function (obj) {\n if (obj.id === id) {\n return obj;\n }\n });\n selectTab($scope.tabs[0].id);\n LocalStorageAdapter.set(LSKeys.TABS_STATE, $scope.tabs);\n $rootScope.$broadcast('deleteAllexeptSelected', $scope.tabs);\n }\n }];\n\n return {\n restrict: 'AE',\n // for some reason when you extract this template in a file and use templateUrl it selects all tabs when editing the tab name, not only the currently selected one\n template: '<a class=\"nav-link\" role=\"tab\" data-toggle=\"tab\" blur=\"submit\" editable-text=\"tab.name\" e-form=\"editCurrentlySelectedOnly\" ng-click=\"selectThisTab($event)\" ng-dblclick=\"editCurrentTab()\" ><span ng-class=\"{\\'text-muted\\': !tab.name}\">{{ tab.name || (\\'sparql.tab.directive.unnamed.tab.title\\' | translate)}}</span><button type=\"button\" ng-click=\"deleteTab($event)\" class=\"btn btn-link btn-sm secondary delete-sparql-tab-btn\" title=\"Delete tab\"><i class=\"icon-close\"></i></button></a>',\n replace: true,\n controller: SparqlTabCtrl\n };\n}\n","import {ChartData} from \"../chart-data\";\n\nexport class FileDescriptorsChart extends ChartData {\n constructor(translateService, filter) {\n super(translateService, false, false, filter);\n }\n\n chartSetup(chartOptions) {\n chartOptions.chart.yAxis.tickFormat = (d) => this.formatNumber(d);\n chartOptions.chart.color = [chartOptions.chart.color[1]];\n }\n\n createDataHolder() {\n return [{\n key: this.translateService.instant('resource.system.file_descriptors.open'),\n area: 'true',\n values: []\n }];\n }\n addNewData(dataHolder, timestamp, data) {\n if (!data.openFileDescriptors) {\n const subTitleKeyValues = [{\n label: this.translateService.instant('resource.system.file_descriptors.only_unix')\n }];\n this.setSubTitle(subTitleKeyValues);\n return;\n }\n dataHolder[0].values.push([timestamp, data.openFileDescriptors]);\n const subTitleKeyValues = [{\n label: this.translateService.instant('resource.system.file_descriptors.max'),\n value: this.formatNumber(data.maxFileDescriptors)\n }];\n this.setSubTitle(subTitleKeyValues);\n }\n updateRange(dataHolder) {\n super.updateRange(dataHolder, 2);\n }\n}\n","import {HeapMemoryChart} from \"./heap-memory-chart\";\n\nexport class NonHeapMemoryChart extends HeapMemoryChart {\n constructor(translateService) {\n super(translateService, false, false);\n }\n\n parseData(data) {\n return data.nonHeapMemoryUsage;\n }\n}\n","import {ChartData} from \"../chart-data\";\n\nexport class CpuLoadChart extends ChartData {\n constructor(translateService) {\n super(translateService, false, false);\n }\n chartSetup(chartOptions) {\n chartOptions.chart.yAxis.tickFormat = function (d) {\n return d + '%';\n };\n }\n\n createDataHolder() {\n return [{\n key: this.translateService.instant('resource.system.cpu_load.label'),\n values: []\n }];\n }\n addNewData(dataHolder, timestamp, data) {\n dataHolder[0].values.push([timestamp, this.formatValue(data.cpuLoad)]);\n }\n formatValue(cpuLoad) {\n return parseFloat(cpuLoad).toFixed(4);\n }\n updateRange(dataHolder) {\n const maxChartValue = Math.max(...dataHolder[0].values.flatMap((data) => data[1]));\n const domainUpperBound = maxChartValue > 50 ? 100 : maxChartValue * 2;\n this.chartOptions.chart.yDomain = [0, domainUpperBound];\n }\n}\n","import {ChartData} from \"../chart-data\";\n\nexport class DiskStorageChart extends ChartData {\n constructor(translateService) {\n super(translateService, true, true);\n }\n chartSetup(chartOptions) {\n const diskStorageChartOptions = {\n type: 'multiBarHorizontalChart',\n height: 250,\n stacked: true,\n showControls: false,\n xAxis: {\n showMaxMin: false,\n tickFormat: function (d) {\n return d;\n }\n },\n yAxis: {\n showMaxMin: false,\n tickFormat: function (d) {\n return (d * 100).toFixed(2) + '%';\n }\n },\n yDomain: [0, 1]\n };\n Object.assign(chartOptions.chart, diskStorageChartOptions);\n }\n\n translateLabels(dataHolder) {\n if (!dataHolder) {\n return;\n }\n super.translateLabels(dataHolder);\n const [used, free] = dataHolder;\n if (!used.values.length || !free.values.length) {\n return;\n }\n used.values[0][0] = this.translateService.instant('resource.storage.data');\n used.values[1][0] = this.translateService.instant('resource.storage.work');\n used.values[2][0] = this.translateService.instant('resource.storage.logs');\n free.values[0][0] = this.translateService.instant('resource.storage.data');\n free.values[1][0] = this.translateService.instant('resource.storage.work');\n free.values[2][0] = this.translateService.instant('resource.storage.logs');\n }\n\n createDataHolder() {\n return [{\n key: this.translateService.instant('resource.storage.used'),\n color: this.chartOptions.chart.color[1],\n values: []\n }, {\n key: this.translateService.instant('resource.storage.free'),\n color: this.chartOptions.chart.color[0],\n values: []\n }];\n }\n\n addNewData(dataHolder, timestamp, data, isFirstLoad) {\n const storageData = data.storageMemory;\n const [used, free] = dataHolder;\n\n if (isFirstLoad) {\n used.values.push([this.translateService.instant('resource.storage.data'), 0]);\n used.values.push([this.translateService.instant('resource.storage.work'), 0]);\n used.values.push([this.translateService.instant('resource.storage.logs'), 0]);\n free.values.push([this.translateService.instant('resource.storage.data'), 1]);\n free.values.push([this.translateService.instant('resource.storage.work'), 1]);\n free.values.push([this.translateService.instant('resource.storage.logs'), 1]);\n }\n\n const subTitleKeyValues = [{\n label: this.translateService.instant('resource.storage.subtitle.data'),\n value: [DiskStorageChart.formatBytesValue(storageData.dataDirUsed), DiskStorageChart.formatBytesValue(storageData.dataDirFree)]\n }, {\n label: this.translateService.instant('resource.storage.subtitle.work'),\n value: [DiskStorageChart.formatBytesValue(storageData.workDirUsed), DiskStorageChart.formatBytesValue(storageData.workDirFree)]\n }, {\n label: this.translateService.instant('resource.storage.subtitle.logs'),\n value: [DiskStorageChart.formatBytesValue(storageData.logsDirUsed), DiskStorageChart.formatBytesValue(storageData.logsDirFree)]\n }];\n this.setSubTitle(subTitleKeyValues);\n\n const totalData = storageData.dataDirUsed + storageData.dataDirFree;\n const totalWork = storageData.workDirUsed + storageData.workDirFree;\n const totalLogs = storageData.logsDirUsed + storageData.logsDirFree;\n\n used.values[0][1] = storageData.dataDirUsed / totalData;\n used.values[1][1] = storageData.workDirUsed / totalWork;\n used.values[2][1] = storageData.logsDirUsed / totalLogs;\n free.values[0][1] = storageData.dataDirFree / totalData;\n free.values[1][1] = storageData.workDirFree / totalWork;\n free.values[2][1] = storageData.logsDirFree / totalLogs;\n }\n}\n","import {ChartData} from \"../chart-data\";\n\nexport class QueriesChart extends ChartData {\n constructor(translateService) {\n super(translateService, false, false);\n }\n\n chartSetup(chartOptions) {\n chartOptions.chart.yAxis.tickValues = () => {\n return QueriesChart.getIntegerRangeForValues(this.dataHolder);\n };\n }\n\n createDataHolder() {\n return [{\n key: this.translateService.instant('resource.queries.running'),\n values: []\n }];\n }\n addNewData(dataHolder, timestamp, data) {\n const {activeQueryData, performanceData} = data;\n dataHolder[0].values.push([timestamp, activeQueryData.length]);\n\n const slowQueries = performanceData.queries.slow;\n const suboptimal = performanceData.queries.suboptimal;\n const subTitleKeyValues = [{\n label: this.translateService.instant('resource.queries.slow'),\n value: slowQueries\n }, {\n label: this.translateService.instant('resource.queries.suboptimal'),\n value: suboptimal\n }];\n this.setSubTitle(subTitleKeyValues);\n }\n}\n","import {ChartData} from '../chart-data';\n\nexport class GlobalCacheChart extends ChartData {\n constructor(translateService, filter) {\n super(translateService, false, false, filter);\n }\n\n chartSetup(chartOptions) {\n chartOptions.chart.yAxis.tickFormat = (d) => this.formatNumber(d);\n }\n\n getTitle() {\n return this.translateService.instant('resources.global_cache.label');\n }\n\n createDataHolder() {\n return [{\n key: this.translateService.instant('resources.global_cache.hits'),\n values: []\n }, {\n key: this.translateService.instant('resources.global_cache.miss'),\n values: []\n }];\n }\n addNewData(dataHolder, timestamp, data) {\n const [hit, miss] = dataHolder;\n hit.values.push([timestamp, data.cacheHit]);\n miss.values.push([timestamp, data.cacheMiss]);\n }\n}\n","import {ChartData} from \"../chart-data\";\n\nexport class ConnectionsChart extends ChartData {\n constructor(translateService) {\n super(translateService, false, false);\n }\n chartSetup(chartOptions) {\n chartOptions.chart.yAxis.tickValues = () => {\n return ConnectionsChart.getIntegerRangeForValues(this.dataHolder);\n };\n }\n\n createDataHolder() {\n return [{\n key: this.translateService.instant('resource.connections.active'),\n values: []\n }, {\n key: this.translateService.instant('resource.connections.open'),\n values: []\n }];\n }\n addNewData(dataHolder, timestamp, data) {\n const performanceData = data.performanceData;\n dataHolder[0].values.push([timestamp, performanceData.activeTransactions]);\n dataHolder[1].values.push([timestamp, performanceData.openConnections]);\n }\n}\n","import {ChartData} from '../chart-data';\n\nexport class ClusterHealthChart extends ChartData {\n constructor(translateService) {\n super(translateService, true, false);\n this.nodesCount = 0;\n }\n chartSetup(chartOptions) {\n const clusterHealthChartOptions = {\n type: 'stackedAreaChart',\n interpolate: 'step-after',\n stacked: true,\n yAxis: {\n showMaxMin: false,\n tickFormat: function (d) {\n return d;\n },\n tickValues: () => {\n return d3.range(0, this.nodesCount + 1, 1);\n }\n }\n };\n Object.assign(chartOptions.chart, clusterHealthChartOptions);\n }\n\n getTitle() {\n return this.translateService.instant('resources.cluster_health.label');\n }\n\n createDataHolder() {\n const [blue, orange, green, grey] = ClusterHealthChart.COLORS;\n return [{\n key: this.translateService.instant('resources.cluster_health.in_sync'),\n color: blue,\n values: []\n }, {\n key: this.translateService.instant('resources.cluster_health.syncing'),\n color: green,\n values: []\n }, {\n key: this.translateService.instant('resources.cluster_health.out_sync'),\n color: orange,\n values: []\n }, {\n key: this.translateService.instant('resources.cluster_health.disconnected'),\n color: grey,\n values: []\n }];\n }\n addNewData(dataHolder, timestamp, data) {\n const nodesStatus = data.nodesStats;\n this.nodesCount = nodesStatus.nodesInCluster;\n const [nodesInSync, nodesSyncing, nodesOutOfSync, nodesDisconnected] = dataHolder;\n\n nodesInSync.values.push([timestamp, nodesStatus.nodesInSync]);\n nodesOutOfSync.values.push([timestamp, nodesStatus.nodesOutOfSync]);\n nodesDisconnected.values.push([timestamp, nodesStatus.nodesDisconnected]);\n nodesSyncing.values.push([timestamp, nodesStatus.nodesSyncing]);\n\n const subTitleKeyValues = [{\n label: this.translateService.instant('resource.cluster_health.leader_elections'),\n value: data.term\n }, {\n label: this.translateService.instant('resource.cluster_health.recoveries'),\n value: data.failureRecoveriesCount\n }, {\n label: this.translateService.instant('resource.cluster_health.failed_transactions'),\n value: data.failedTransactionsCount\n }];\n\n this.setSubTitle(subTitleKeyValues);\n }\n}\n","import {ChartData} from \"../chart-data\";\n\nexport class EpoolChart extends ChartData {\n constructor(translateService) {\n super(translateService, false, false);\n }\n chartSetup(chartOptions) {\n const customChartOptions = {\n type: 'multiChart',\n yAxis1: {\n showMaxMin: false,\n axisLabel: this.translateService.instant('resource.epool.reads'),\n axisLabelDistance: -10,\n rotateYLabel: true,\n tickFormat: function(d) {\n return d;\n },\n tickValues: () => {\n return EpoolChart.getIntegerRangeForValues(this.dataHolder[0]);\n }\n },\n yAxis2: {\n showMaxMin: false,\n axisLabel: this.translateService.instant('resource.epool.writes'),\n axisLabelDistance: -10,\n rotateYLabel: true,\n tickFormat: function(d) {\n return d;\n },\n tickValues: () => {\n return EpoolChart.getIntegerRangeForValues(this.dataHolder[1]);\n }\n },\n y1Domain: [0, 1],\n y2Domain: [0, 1]\n };\n Object.assign(chartOptions.chart, customChartOptions);\n }\n\n getTitle() {\n return this.translateService.instant('resource.epool.label');\n }\n\n createDataHolder() {\n return [{\n key: this.translateService.instant('resource.epool.reads'),\n type: 'line',\n yAxis: 1,\n values: []\n }, {\n key: this.translateService.instant('resource.epool.writes'),\n type: 'line',\n yAxis: 2,\n values: []\n }];\n }\n addNewData(dataHolder, timestamp, data, isFirstLoad) {\n const performanceData = data.performanceData;\n const [readsData, writesData] = dataHolder;\n let readsDiff = 0;\n let writesDiff = 0;\n const currentReads = performanceData.entityPool.epoolReads;\n const currentWrites = performanceData.entityPool.epoolWrites;\n\n if (!isFirstLoad) {\n const lastReadsEntry = readsData.values[readsData.values.length - 1][2];\n const lastWritesEntry = writesData.values[readsData.values.length - 1][2];\n readsDiff = currentReads - lastReadsEntry;\n writesDiff = currentWrites - lastWritesEntry;\n }\n\n readsData.values.push([timestamp, readsDiff, currentReads]);\n writesData.values.push([timestamp, writesDiff, currentWrites]);\n }\n updateRange(dataHolder) {\n this.chartOptions.chart.yDomain1 = this.getAxisDomain(dataHolder[0]);\n this.chartOptions.chart.yDomain2 = this.getAxisDomain(dataHolder[1]);\n }\n getAxisDomain(dataHolder) {\n const [domainUpperBound] = EpoolChart.calculateMaxChartValueAndDivisions(dataHolder);\n return [0, domainUpperBound];\n }\n}\n","import 'angular/core/services';\nimport 'angular/core/services/repositories.service';\nimport 'angular/rest/monitoring.rest.service';\nimport 'lib/nvd3/nv.d3';\nimport 'angular/rest/cluster.rest.service';\nimport {FileDescriptorsChart} from './chart-models/resource/file-descriptors-chart';\nimport {HeapMemoryChart} from './chart-models/resource/heap-memory-chart';\nimport {NonHeapMemoryChart} from './chart-models/resource/non-heap-memory-chart';\nimport {CpuLoadChart} from './chart-models/resource/cpu-load-chart';\nimport {DiskStorageChart} from './chart-models/resource/disk-storage-chart';\nimport {QueriesChart} from './chart-models/performance/queries-chart';\nimport {GlobalCacheChart} from './chart-models/resource/global-cache-chart';\nimport {ConnectionsChart} from './chart-models/performance/connections-chart';\nimport {ClusterHealthChart} from './chart-models/cluster-health/cluster-health-chart';\nimport {EpoolChart} from './chart-models/performance/epool-chart';\n\nconst modules = [\n 'ui.bootstrap',\n 'graphdb.framework.core.services.repositories',\n 'graphdb.framework.rest.monitoring.service',\n 'graphdb.framework.rest.cluster.service'\n];\n\nconst resourcesCtrl = angular.module('graphdb.framework.jmx.resources.controllers', modules);\n\nresourcesCtrl.controller('ResourcesCtrl', ['$scope', '$rootScope', '$timeout', 'MonitoringRestService', '$translate', '$repositories', '$q', 'ClusterRestService', '$filter',\n function($scope, $rootScope, $timeout, MonitoringRestService, $translate, $repositories, $q, ClusterRestService, $filter) {\n const POLLING_INTERVAL = 2000;\n const MAX_RETRIES = 3;\n\n $scope.AVAILABLE_TABS = Object.freeze({\n 'RESOURCE_MONITOR': 'resource',\n 'PERFORMANCE_MONITOR': 'performance',\n 'CLUSTER_HEALTH': 'cluster'\n });\n\n const urlFragment = window.location.hash.slice(1);\n const foundTab = Object.keys($scope.AVAILABLE_TABS).find((key) => $scope.AVAILABLE_TABS[key] === urlFragment);\n $scope.activeTab = $scope.AVAILABLE_TABS[foundTab] || $scope.AVAILABLE_TABS.RESOURCE_MONITOR;\n\n $rootScope.$on('$translateChangeSuccess', function (event, args) {\n const allDataHolders = [$scope.resourceMonitorData, $scope.performanceMonitorData, $scope.structuresMonitorData, $scope.clusterHealthData];\n allDataHolders.forEach((chartHolder) => {\n Object.values(chartHolder.charts).forEach((chart) => chart.refresh());\n });\n });\n\n $scope.resourceMonitorData = {\n error: {\n hasError: false,\n message: '',\n retries: 0\n },\n charts: {\n cpuLoad: new CpuLoadChart($translate),\n fileDescriptors: new FileDescriptorsChart($translate, $filter),\n heapMemory: new HeapMemoryChart($translate),\n offHeapMemory: new NonHeapMemoryChart($translate),\n diskStorage: new DiskStorageChart($translate)\n }\n };\n $scope.performanceMonitorData = {\n error: {\n hasError: false,\n message: '',\n retries: 0\n },\n charts: {\n connectionsChart: new ConnectionsChart($translate),\n epoolChart: new EpoolChart($translate),\n queriesChart: new QueriesChart($translate)\n }\n };\n $scope.structuresMonitorData = {\n error: {\n hasError: false,\n message: '',\n retries: 0\n },\n charts: {\n globalCacheChart: new GlobalCacheChart($translate, $filter)\n }\n };\n $scope.clusterHealthData = {\n error: {\n hasError: false,\n message: '',\n retries: 0\n },\n charts: {\n clusterHealthChart: new ClusterHealthChart($translate)\n }\n };\n\n $scope.hasCluster = false;\n\n const hasMonitorError = (errorHolder) => {\n return errorHolder.hasError;\n };\n\n $scope.loader = true;\n\n $scope.switchTab = (tab) => {\n $scope.activeTab = tab;\n window.location.hash = tab;\n };\n\n $scope.getActiveRepository = function() {\n return $repositories.getActiveRepository();\n };\n\n const getResourceMonitorData = function() {\n return MonitoringRestService.monitorResources();\n };\n const getQueryMonitor = function() {\n const activeRepository = $scope.getActiveRepository();\n if (!activeRepository) {\n return Promise.resolve();\n }\n return $q.all([getPerformanceMonitorData(activeRepository), getActiveQueryMonitor(activeRepository)])\n .then((response) => {\n const [performanceData, activeQueryData] = response;\n return {data: {performanceData, activeQueryData}};\n });\n };\n const getPerformanceMonitorData = function(activeRepository) {\n return MonitoringRestService.monitorQueryTransactionStatistics(activeRepository)\n .then(function(response) {\n return response.data;\n });\n };\n const getActiveQueryMonitor = function(activeRepository) {\n return MonitoringRestService.monitorQuery(activeRepository)\n .then(function(response) {\n return response.data;\n });\n };\n const getStructuresMonitorData = function() {\n const activeRepository = $scope.getActiveRepository();\n if (!activeRepository) {\n return Promise.resolve();\n }\n\n return MonitoringRestService.monitorStructures(activeRepository);\n };\n const getClusterMonitorData = function() {\n return MonitoringRestService.monitorCluster();\n };\n\n const getData = (monitor) => {\n if (hasMonitorError(monitor.chartsHolder.error)) {\n if (monitor.chartsHolder.error.retries === MAX_RETRIES) {\n if (monitor.poll) {\n $timeout.cancel(monitor.poll);\n }\n return Promise.resolve();\n }\n monitor.chartsHolder.error.retries++;\n }\n return monitor.fetchFn()\n .then(function(response) {\n processResponse(response, monitor);\n })\n .then(() => {\n clearMonitorError(monitor);\n })\n .catch((error) => {\n setMonitorError(monitor, error);\n })\n .finally(() => {\n if (monitor.poll) {\n $timeout.cancel(monitor.poll);\n }\n monitor.poll = $timeout(() => getData(monitor), POLLING_INTERVAL);\n });\n };\n const processResponse = (response, monitor, dataSetter) => {\n const data = response.data;\n if (data) {\n setChartData(data, monitor, dataSetter);\n }\n };\n const setChartData = (data, monitor, dataSetter) => {\n const timestamp = new Date();\n if (dataSetter) {\n dataSetter(timestamp, data);\n } else {\n Object.values(monitor.chartsHolder.charts).forEach((chart) => {\n chart.addData(timestamp, data);\n });\n }\n };\n const setMonitorError = (monitor, error) => {\n monitor.chartsHolder.error.hasError = !!error;\n if (monitor.chartsHolder.error.hasError) {\n monitor.chartsHolder.error.message = getError(error);\n }\n };\n const clearMonitorError = (monitor) => {\n monitor.chartsHolder.error.hasError = false;\n monitor.chartsHolder.error.message = '';\n };\n\n $scope.monitors = [];\n $scope.monitors.push({\n chartsHolder: $scope.resourceMonitorData,\n error: {\n hasError: false,\n message: '',\n retries: 0\n },\n fetchFn: getResourceMonitorData,\n poll: null\n });\n $scope.monitors.push({\n chartsHolder: $scope.structuresMonitorData,\n error: {\n hasError: false,\n message: '',\n retries: 0\n },\n fetchFn: getStructuresMonitorData,\n poll: null\n });\n\n $scope.monitors.push({\n chartsHolder: $scope.performanceMonitorData,\n error: {\n hasError: false,\n message: '',\n retries: 0\n },\n fetchFn: getQueryMonitor,\n poll: null\n });\n\n ClusterRestService.getNodeStatus()\n .then(() => {\n $scope.hasCluster = true;\n const clusterMonitor = {\n chartsHolder: $scope.clusterHealthData,\n\n fetchFn: getClusterMonitorData,\n poll: null\n };\n $scope.monitors.push(clusterMonitor);\n getData(clusterMonitor);\n })\n .catch(() => {\n $scope.hasCluster = false;\n });\n\n let loaderTimer = null;\n $q.all($scope.monitors.map((monitor) => getData(monitor)))\n .finally(() => {\n if ($scope.loader) {\n if (loaderTimer) {\n $timeout.cancel(loaderTimer);\n }\n loaderTimer = $timeout(function() {\n $scope.loader = false;\n }, 500);\n }\n });\n\n $scope.$on('$destroy', function() {\n if (loaderTimer) {\n $timeout.cancel(loaderTimer);\n }\n for (const monitor of $scope.monitors) {\n if (monitor.poll) {\n $timeout.cancel(monitor.poll);\n }\n }\n });\n }]);\n","import 'angular/core/services';\nimport 'angular/core/services/repositories.service';\nimport 'angular/rest/monitoring.rest.service';\nimport 'angular/utils/notifications';\n\n\nconst modules = [\n 'ui.bootstrap',\n 'graphdb.framework.core.services.repositories',\n 'graphdb.framework.rest.monitoring.service',\n 'toastr'\n];\n\nangular.module('graphdb.framework.jdbc.controllers', modules, [\n 'graphdb.framework.utils.notifications'\n])\n .controller('JdbcListCtrl', JdbcListCtrl)\n .controller('JdbcCreateCtrl', JdbcCreateCtrl);\n\nJdbcListCtrl.$inject = ['$scope', '$repositories', 'JdbcRestService', 'toastr', 'ModalService', '$translate'];\n\nfunction JdbcListCtrl($scope, $repositories, JdbcRestService, toastr, ModalService, $translate) {\n\n $scope.getSqlConfigurations = function () {\n // Only do this if there is an active repo that isn't an Ontop or FedX repo.\n // Ontop and FedX repos don't support JDBC.\n if ($repositories.getActiveRepository()\n && !$repositories.isActiveRepoOntopType()\n && !$repositories.isActiveRepoFedXType()) {\n JdbcRestService.getJdbcConfigurations().success(function (data) {\n $scope.jdbcConfigurations = data;\n }).error(function (data) {\n const msg = getError(data);\n toastr.error(msg, $translate.instant('jdbc.not.get.SQL.msg'));\n });\n } else {\n $scope.jdbcConfigurations = [];\n }\n };\n\n $scope.$watch(function () {\n return $repositories.getActiveRepository();\n }, function () {\n $scope.getSqlConfigurations();\n });\n\n $scope.deleteConfiguration = function (name) {\n ModalService.openSimpleModal({\n title: $translate.instant('common.warning'),\n message: $translate.instant('jdbc.delete.sql.table.warning.msg', {name: name}),\n warning: true\n }).result\n .then(function () {\n JdbcRestService.deleteJdbcConfiguration(name).success(function () {\n $scope.getSqlConfigurations();\n }).error(function(e) {\n toastr.error(getError(e), $translate.instant('jdbc.not.delete.sql.msg'));\n });\n });\n };\n}\n\nJdbcCreateCtrl.$inject = ['$scope', '$location', 'toastr', '$repositories', '$window', '$timeout', 'JdbcRestService', 'RDF4JRepositoriesRestService', 'SparqlRestService', 'ModalService', '$translate'];\n\nfunction JdbcCreateCtrl($scope, $location, toastr, $repositories, $window, $timeout, JdbcRestService, RDF4JRepositoriesRestService, SparqlRestService, ModalService, $translate) {\n\n $scope.name = $location.search().name || '';\n $scope.getNamespaces = getNamespaces;\n $scope.setLoader = setLoader;\n $scope.addKnownPrefixes = addKnownPrefixes;\n $scope.page = 1;\n $scope.noPadding = {paddingRight: 0, paddingLeft: 0};\n $scope.sqlTypes = ['string', 'iri', 'boolean', 'byte', 'short', 'int', 'long', 'float', 'double', 'decimal', 'date', 'time', 'timestamp', 'Get suggestion...'];\n $scope.currentTabConfig = {};\n // This property is obligatory in order to show YASQUE and YASR properly\n $scope.orientationViewMode = true;\n $scope.currentQuery = {};\n\n\n $scope.$watch(function () {\n return $repositories.getActiveRepository();\n }, function (newValue, oldValue) {\n if (newValue !== oldValue) {\n $location.path('jdbc');\n }\n });\n\n let timer = null;\n $scope.goBack = function () {\n timer = $timeout(function () {\n $window.history.back();\n }, 1000);\n };\n\n const locationChangeListener = $scope.$on('$locationChangeStart', function (event) {\n confirmExit(event);\n });\n\n window.addEventListener('beforeunload', showBeforeunloadMessage);\n\n function showBeforeunloadMessage(event) {\n if (!$scope.currentQuery.isPristine) {\n event.returnValue = true;\n }\n }\n\n function confirmExit(event) {\n if (!$scope.currentQuery.isPristine) {\n if (!confirm($translate.instant('jdbc.warning.unsaved.changes'))) {\n event.preventDefault();\n } else {\n window.removeEventListener('beforeunload', showBeforeunloadMessage);\n locationChangeListener();\n $timeout.cancel(timer);\n }\n }\n }\n\n $scope.$on('$destroy', function (event) {\n window.removeEventListener('beforeunload', showBeforeunloadMessage);\n locationChangeListener();\n $timeout.cancel(timer);\n });\n\n const defaultTabConfig = {\n id: '1',\n name: '',\n query: 'PREFIX rdfs: <http://www.w3.org/2000/01/rdf-schema#>\\n' +\n '\\n' +\n '# Selects two variables to use as columns\\n' +\n 'SELECT ?id ?label {\\n' +\n ' ?id rdfs:label ?label\\n' +\n ' # The following placeholder must be present in the query\\n' +\n ' #!filter\\n' +\n '}',\n inference: true,\n sameAs: true,\n isNewConfiguration: true,\n isPristine: true\n };\n\n $scope.resetCurrentTabConfig = function () {\n $scope.currentTabConfig = {\n pageSize: 100, // page limit 100 as this is only used for preview\n page: 1,\n allResultsCount: 0,\n resultsCount: 0,\n // Hide YASR by default, show on success in callback when needed\n queryType: ''\n };\n };\n\n $scope.saveTab = function () {\n };\n\n // Called when user clicks on a sample query\n $scope.setQuery = function (query) {\n // Hack for YASQE bug\n window.editor.setValue(query ? query : ' ');\n };\n\n if ($scope.name) {\n getJdbcConfiguration($scope.name);\n } else {\n setQueryFromTabConfig();\n }\n\n // FIXME: this is copy-pasted in graphs-config.controller.js and query-editor.controller.js. Find a way to avoid duplications\n function getNamespaces() {\n // Signals the namespaces are to be fetched => loader will be shown\n setLoader(true, $translate.instant('common.refreshing.namespaces'), $translate.instant('common.extra.message'));\n RDF4JRepositoriesRestService.getRepositoryNamespaces()\n .success(function (data) {\n const usedPrefixes = {};\n data.results.bindings.forEach(function (e) {\n usedPrefixes[e.prefix.value] = e.namespace.value;\n });\n $scope.namespaces = usedPrefixes;\n })\n .error(function (data) {\n $scope.repositoryError = getError(data);\n })\n .finally(function () {\n // Signals namespaces were fetched => loader will be hidden\n setLoader(false);\n loadTab();\n });\n }\n\n function setLoader(isRunning, progressMessage, extraMessage) {\n const yasrInnerContainer = angular.element(document.getElementById('yasr-inner'));\n $scope.queryIsRunning = isRunning;\n if (isRunning) {\n $scope.queryStartTime = Date.now();\n $scope.countTimeouted = false;\n $scope.progressMessage = progressMessage;\n $scope.extraMessage = extraMessage;\n yasrInnerContainer.addClass('hide');\n } else {\n $scope.progressMessage = '';\n $scope.extraMessage = '';\n yasrInnerContainer.removeClass('hide');\n }\n\n // We might call this from angular or outside angular so take care of applying the scope.\n if ($scope.$$phase === null) {\n $scope.$apply();\n }\n }\n\n function loadTab() {\n $scope.tabsData = [$scope.currentQuery];\n\n const tab = $scope.currentQuery;\n\n if (!$scope.currentQuery.query) {\n // hack for YASQE bug\n window.editor.setValue(' ');\n } else {\n window.editor.setValue($scope.currentQuery.query);\n }\n\n $timeout(function () {\n $scope.currentTabConfig = {};\n $scope.currentTabConfig.queryType = tab.queryType;\n $scope.currentTabConfig.resultsCount = tab.resultsCount;\n\n $scope.currentTabConfig.offset = tab.offset;\n $scope.currentTabConfig.allResultsCount = tab.allResultsCount;\n $scope.currentTabConfig.page = tab.page;\n $scope.currentTabConfig.pageSize = tab.pageSize;\n\n $scope.currentTabConfig.timeFinished = tab.timeFinished;\n $scope.currentTabConfig.timeTook = tab.timeTook;\n $scope.currentTabConfig.sizeDelta = tab.sizeDelta;\n $scope.$apply();\n }, 0);\n\n if (!$scope.canWriteActiveRepo()) {\n window.editor.options.readOnly = true;\n }\n }\n\n $scope.goToPage = function (page) {\n $scope.page = page;\n const columns = $scope.currentQuery.columns;\n if (page === 2 && (!columns || columns.length === 0) && hasValidQuery()) {\n $scope.getColumnsSuggestions();\n }\n resetYasqeYasr();\n };\n\n function getJdbcConfiguration(name) {\n JdbcRestService.getJdbcConfiguration(name).success(function (config) {\n defaultTabConfig.query = config.query;\n defaultTabConfig.name = config.name;\n defaultTabConfig.columns = config.columns;\n\n defaultTabConfig.isNewConfiguration = !config.name;\n\n setQueryFromTabConfig();\n }).error(function (data) {\n const msg = getError(data);\n toastr.error(msg, $translate.instant('jdbc.not.get.sql.msg2'));\n });\n }\n\n function setQueryFromTabConfig() {\n $scope.tabsData = $scope.tabs = [defaultTabConfig];\n $scope.currentQuery = angular.copy(defaultTabConfig);\n\n resetYasqeYasr();\n\n if (window.editor) {\n $scope.setQuery($scope.currentQuery.query);\n loadTab();\n }\n\n $scope.$watch(function () {\n return $scope.currentQuery.query;\n }, function (newValue, oldValue) {\n if (newValue !== oldValue) {\n $scope.setDirty();\n }\n });\n }\n\n $scope.save = function () {\n if (!validateDefinition()) {\n return;\n }\n\n if (!$scope.currentQuery.name) {\n toastr.error($translate.instant('jdbc.required.configuration.name'));\n return;\n }\n\n if ($scope.currentQuery.isNewConfiguration) {\n JdbcRestService.createNewJdbcConfiguration($scope.currentQuery).success(function () {\n $scope.currentQuery.isPristine = true;\n $scope.currentQuery.isNewConfiguration = false;\n toastr.success($translate.instant('jdbc.saved.configuration'));\n $scope.goBack();\n }).error(function (data) {\n const msg = getError(data);\n toastr.error(msg, $translate.instant('jdbc.not.saved.configuration'));\n });\n } else {\n JdbcRestService.updateJdbcConfiguration($scope.currentQuery).success(function () {\n $scope.currentQuery.isPristine = true;\n $scope.currentQuery.isNewConfiguration = false;\n toastr.success($translate.instant('jdbc.configuration.updated'));\n $scope.goBack();\n }).error(function (data) {\n const msg = getError(data);\n toastr.error(msg, $translate.instant('jdbc.not.saved.configuration'));\n });\n }\n };\n\n $scope.hasPrecision = function (columnType) {\n return columnType === 'iri' || columnType === 'string' || columnType === 'decimal';\n };\n\n $scope.containsColumnsWithPrecision = function (columns) {\n return columns && columns.some((el) => $scope.hasPrecision(el.column_type));\n };\n\n $scope.hasScale = function (columnType) {\n return columnType === 'decimal';\n };\n\n $scope.containsColumnsWithScale = function (columns) {\n return columns && columns.some((el) => $scope.hasScale(el.column_type));\n };\n\n $scope.isLiteral = function (columnType) {\n return columnType !== 'iri' && columnType !== 'unknown';\n };\n\n $scope.containsNonLiteralColumnsOnly = function (columns) {\n return columns && columns.every((el) => !$scope.isLiteral(el.column_type));\n };\n\n $scope.containsUnknownColumns = function () {\n return $scope.currentQuery.columns && $scope.currentQuery.columns\n .find((el) => el.column_type === 'unknown');\n };\n\n // Add known prefixes\n function addKnownPrefixes() {\n SparqlRestService.addKnownPrefixes(JSON.stringify(window.editor.getValue()))\n .success(function (data) {\n if (angular.isDefined(window.editor) && angular.isDefined(data) && data !== window.editor.getValue()) {\n window.editor.setValue(data);\n }\n })\n .error(function (data) {\n const msg = getError(data);\n toastr.error(msg, $translate.instant('common.add.known.prefixes.error'));\n return true;\n });\n }\n\n $('textarea').on('paste', function () {\n $timeout(function () {\n addKnownPrefixes();\n }, 0);\n });\n\n $scope.selectColumnType = function (columnName, prevColumnType) {\n const column = _.find($scope.currentQuery.columns, function (column) {\n return column.column_name === columnName;\n });\n\n if (column.column_type === 'Get suggestion...') {\n JdbcRestService.getColumnsTypeSuggestion($scope.currentQuery.query, [columnName]).success(function (columnSuggestion) {\n column.column_type = columnSuggestion[columnName].column_type;\n if (column.column_type === prevColumnType) {\n toastr.info($translate.instant('jdbc.same.suggested.sql.type', {type: column.column_type}),\n $translate.instant('jdbc.suggest.sql.type'), {allowHtml: true});\n } else {\n toastr.success($translate.instant('jdbc.suggested.sql.type', {type: column.column_type}),\n $translate.instant('jdbc.suggest.sql.type'), {allowHtml: true});\n }\n column.sparql_type = columnSuggestion[columnName].sparql_type;\n }).error(function(e) {\n toastr.error(getError(e), $translate.instant('jdbc.not.suggest.column.type'));\n });\n }\n $scope.setDirty();\n };\n\n $scope.getColumnsSuggestions = function () {\n if ($scope.currentQuery.columns && $scope.currentQuery.columns.length > 0) {\n ModalService.openSimpleModal({\n title: $translate.instant('common.warning'),\n message: $translate.instant('jdbc.warning.column.type.msg'),\n warning: true\n }).result\n .then(function () {\n getSuggestions();\n });\n } else {\n getSuggestions();\n }\n };\n\n function getSuggestions() {\n if (!validateQuery()) {\n return;\n }\n\n JdbcRestService.getColumnNames($scope.currentQuery.query).success(function (columns) {\n JdbcRestService.getColumnsTypeSuggestion($scope.currentQuery.query, columns).success(function (columnTypes) {\n const suggestedColumns = [];\n _.forEach(columns, function (columnName) {\n suggestedColumns.push({\n column_name: columnName,\n column_type: columnTypes[columnName].column_type,\n nullable: true,\n sparql_type: columnTypes[columnName].sparql_type\n });\n });\n $scope.currentQuery.columns = suggestedColumns;\n $scope.setDirty();\n }).error(function (e) {\n toastr.error(getError(e), $translate.instant('jdbc.not.suggest.column.types'));\n });\n }).error(function (e) {\n toastr.error(getError(e), $translate.instant('jdbc.not.suggest.column.names'));\n });\n }\n\n $scope.deleteColumn = function (columnName, index) {\n ModalService.openSimpleModal({\n title: $translate.instant('common.warning'),\n message: $translate.instant('jdbc.warning.delete.column.msg', {columnName: columnName}),\n warning: true\n }).result\n .then(function () {\n $scope.currentQuery.columns.splice(index, 1);\n $scope.setDirty();\n });\n };\n\n $scope.getPreview = function () {\n if (!validateDefinition()) {\n return;\n }\n\n $scope.executedQueryTab = $scope.currentQuery;\n\n if (!$scope.queryIsRunning) {\n $scope.currentQuery.outputType = 'table';\n $scope.resetCurrentTabConfig();\n\n setLoader(true, $translate.instant('jdbc.preview.first.rows', {name: $scope.name}),\n $translate.instant('common.extra.message'));\n\n const successCallback = function (data, textStatus, jqXhr) {\n setPreviewResult(data, jqXhr, textStatus);\n setLoader(false);\n };\n\n const failCallback = function (data) {\n setLoader(false);\n toastr.error(getError(data, 0, 100), $translate.instant('jdbc.not.show.preview'));\n };\n\n if ($scope.canWriteActiveRepo()) {\n const sqlView = JSON.stringify({\n name: $scope.currentQuery.name,\n query: $scope.currentQuery.query,\n columns: $scope.currentQuery.columns || []\n });\n JdbcRestService.getNewSqlTablePreview(sqlView)\n .done(successCallback).fail(failCallback);\n } else {\n JdbcRestService.getExistingSqlTablePreview($scope.currentQuery.name)\n .done(successCallback).fail(failCallback);\n }\n }\n };\n\n $scope.setDirty = function () {\n $scope.currentQuery.isPristine = false;\n };\n\n $scope.getTypeLabel = function (type) {\n switch (type) {\n case 'iri':\n return 'VARCHAR: IRI';\n case 'string':\n return 'VARCHAR: String';\n default:\n return type.indexOf(' ') > 0 ? type : type.toUpperCase();\n }\n };\n\n function resetYasqeYasr() {\n if ($scope.page === 2) {\n $scope.viewMode = 'editor';\n } else {\n $scope.viewMode = 'none';\n }\n }\n\n function getCellContentSQL(yasr, plugin, bindings, sparqlVar, context) {\n let value = bindings[sparqlVar].value;\n value = value.replace(/&/g, \"&amp;\").replace(/</g, \"&lt;\").replace(/>/g, \"&gt;\");\n const entityHtml = \"<p class='nonUri' style='border: none; background-color: transparent; padding: 0; margin: 0'>\"\n + value + \"</p>\";\n return \"<div class = 'literal-cell'>\" + entityHtml + \"</div>\";\n }\n\n\n function setPreviewResult(data, jqXhr, textStatus) {\n if (!data.results || !data.results.bindings || !data.results.bindings.length) {\n // Hides YASR as it may contain previous results\n toastr.info($translate.instant('jdbc.table.definition'), $translate.instant('jdbc.preview.sql'));\n } else {\n // Custom content extractor that won't insert \" in SQL values (since we treat them as fake literals)\n window.yasr.plugins.table.options.getCellContent = getCellContentSQL;\n\n // Set query type so YASR shows the results\n $scope.currentTabConfig.queryType = 'SELECT';\n window.yasr.setResponse(jqXhr, textStatus, null);\n }\n }\n\n function hasValidQuery() {\n return window.editor && window.editor.getQueryType() === 'SELECT';\n }\n\n function validateDefinition() {\n return validateQuery() && validateColumns();\n }\n\n function validateQuery() {\n if (!hasValidQuery()) {\n toastr.error($translate.instant('jdbc.warning.invalid.query'), $translate.instant('jdbc.invalid.query)'));\n return false;\n }\n\n return true;\n }\n\n function validateColumns() {\n if (!$scope.currentQuery.columns || !$scope.currentQuery.columns.length) {\n toastr.error($translate.instant('jdbc.warning.one.column.msg'), $translate.instant('jdbc.invalid.columns'));\n return false;\n }\n\n if ($scope.containsUnknownColumns()) {\n toastr.error($translate.instant('jdbc.warning.all.column.msg'), $translate.instant('jdbc.invalid.columns'));\n return false;\n }\n\n return true;\n }\n}\n","angular\n .module('graphdb.framework.rest.jdbc.service', [])\n .factory('JdbcRestService', JdbcRestService);\n\nJdbcRestService.$inject = ['$http', '$repositories', '$translate'];\n\nconst JDBC_ENDPOINT = 'rest/sql-views';\n\nfunction JdbcRestService($http, $translate) {\n\n return {\n getJdbcConfigurations,\n getJdbcConfiguration,\n createNewJdbcConfiguration,\n updateJdbcConfiguration,\n deleteJdbcConfiguration,\n getColumnNames,\n getColumnsTypeSuggestion,\n getExistingSqlTablePreview,\n getNewSqlTablePreview\n };\n\n function getJdbcConfigurations() {\n return $http.get(`${JDBC_ENDPOINT}/tables`);\n }\n\n function getJdbcConfiguration(configuration) {\n return $http.get(`${JDBC_ENDPOINT}/tables/${configuration}`);\n }\n\n function createConfiguration(method, table, configuration) {\n return $http({\n method,\n url: `${JDBC_ENDPOINT}/tables/${table}`,\n noCancelOnRouteChange: true,\n data: {\n name: configuration.name,\n query: configuration.query,\n columns: configuration.columns || []\n }\n }\n );\n }\n\n function createNewJdbcConfiguration(configuration) {\n return createConfiguration('POST', '', configuration);\n }\n\n function updateJdbcConfiguration(configuration) {\n return createConfiguration('PUT', configuration.name, configuration);\n }\n\n function deleteJdbcConfiguration(name) {\n return $http.delete(`${JDBC_ENDPOINT}/tables/${name}`);\n }\n\n function getColumnNames(query) {\n const headers = {\n headers: {\n 'Accept': 'application/json',\n 'Content-Type': 'text/plain'\n }\n };\n\n return $http.post(`${JDBC_ENDPOINT}/columns`, query, headers);\n }\n\n function getColumnsTypeSuggestion(query, columns) {\n if (!Array.isArray(columns)) {\n throw new Error($translate.instant('jdbc.column.names.constraint'));\n }\n\n return $http({\n method: 'POST',\n url: `${JDBC_ENDPOINT}/types`,\n data: {\n query: query,\n column_names: columns\n }\n }\n );\n }\n function getExistingSqlTablePreview(name, limit) {\n // Limit in preview is optional. On backend default value is set to 100\n return $.ajax({\n method: 'GET',\n url: `rest/sql-views/preview/${name}`,\n params: {\n limit\n }\n })\n }\n\n function getNewSqlTablePreview(sqlView, limit) {\n // Limit in preview is optional. On backend default value is set to 100\n return $.ajax({\n method: 'POST',\n url: \"rest/sql-views/preview\",\n contentType: \"application/json; charset=utf-8\",\n dataType: 'json',\n data: sqlView,\n params: {\n limit\n },\n headers: {Accept: 'application/sparql-results+json'}\n })\n }\n}\n"],"sourceRoot":""}