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.
- package/dist/{108.19b6e7d30df333e42876.bundle.js → 108.3c3f9c242e6a3e18fff5.bundle.js} +2 -2
- package/dist/108.3c3f9c242e6a3e18fff5.bundle.js.map +1 -0
- package/dist/11.f4c5533cd200c8568ff6.bundle.js +1 -1
- package/dist/11.f4c5533cd200c8568ff6.bundle.js.map +1 -1
- package/dist/111.a12fdfab1d11ab373ecf.bundle.js +2 -0
- package/dist/111.a12fdfab1d11ab373ecf.bundle.js.map +1 -0
- package/dist/112.8cd13d27736494201244.bundle.js +2 -0
- package/dist/112.8cd13d27736494201244.bundle.js.map +1 -0
- package/dist/{12.d9d71e44fdefd12ffbd9.bundle.js → 12.f348b65d06b0213c492e.bundle.js} +2 -2
- package/dist/12.f348b65d06b0213c492e.bundle.js.map +1 -0
- package/dist/{13.c983d32d3e92f49cd670.bundle.js → 13.fc8afecbe1a39b84c1db.bundle.js} +2 -2
- package/dist/13.fc8afecbe1a39b84c1db.bundle.js.map +1 -0
- package/dist/{14.8661d578dfadafbcdf84.bundle.js → 14.457cf038826e0d9e033e.bundle.js} +2 -2
- package/dist/14.457cf038826e0d9e033e.bundle.js.map +1 -0
- package/dist/148.dd250d3cc5aafade33c6.bundle.js +1 -1
- package/dist/148.dd250d3cc5aafade33c6.bundle.js.map +1 -1
- package/dist/{15.6eada6724367dcd05007.bundle.js → 15.874aa7b7f7972283a629.bundle.js} +2 -2
- package/dist/15.874aa7b7f7972283a629.bundle.js.map +1 -0
- package/dist/20.fbcb31706f03a07e8827.bundle.js +1 -1
- package/dist/20.fbcb31706f03a07e8827.bundle.js.map +1 -1
- package/dist/{21.7f0a59ea2ad9340dcb2f.bundle.js → 21.ea150df1291050bc1c4a.bundle.js} +2 -2
- package/dist/21.ea150df1291050bc1c4a.bundle.js.map +1 -0
- package/dist/27.83b24ef9ec0fd6964d92.bundle.js +1 -1
- package/dist/27.83b24ef9ec0fd6964d92.bundle.js.map +1 -1
- package/dist/33.4d23fa109c9184727386.bundle.js +1 -1
- package/dist/33.4d23fa109c9184727386.bundle.js.map +1 -1
- package/dist/34.f019d485e103b291488a.bundle.js +2 -0
- package/dist/34.f019d485e103b291488a.bundle.js.map +1 -0
- package/dist/40.50b40301c8cc69a70457.bundle.js +1 -1
- package/dist/40.50b40301c8cc69a70457.bundle.js.map +1 -1
- package/dist/44.568afd25b8a568b1c18d.bundle.js +2 -0
- package/dist/44.568afd25b8a568b1c18d.bundle.js.map +1 -0
- package/dist/45.ff1425adb8765ead76fa.bundle.js +2 -0
- package/dist/45.ff1425adb8765ead76fa.bundle.js.map +1 -0
- package/dist/46.e92017f79bee05197e4a.bundle.js +2 -0
- package/dist/46.e92017f79bee05197e4a.bundle.js.map +1 -0
- package/dist/47.099bba66b99e58961fd9.bundle.js +2 -0
- package/dist/47.099bba66b99e58961fd9.bundle.js.map +1 -0
- package/dist/48.5a84d14ed4cb41f91fca.bundle.js +2 -0
- package/dist/48.5a84d14ed4cb41f91fca.bundle.js.map +1 -0
- package/dist/49.ad3b75a5d0c8679165b9.bundle.js +2 -0
- package/dist/49.ad3b75a5d0c8679165b9.bundle.js.map +1 -0
- package/dist/50.5114c92299726180a264.bundle.js +2 -0
- package/dist/50.5114c92299726180a264.bundle.js.map +1 -0
- package/dist/51.f884748db1436a79a134.bundle.js +2 -0
- package/dist/51.f884748db1436a79a134.bundle.js.map +1 -0
- package/dist/52.351e9098a43e13a6f2da.bundle.js +2 -0
- package/dist/52.351e9098a43e13a6f2da.bundle.js.map +1 -0
- package/dist/94.38349f52df66313fbcc0.bundle.js +1 -1
- package/dist/94.38349f52df66313fbcc0.bundle.js.map +1 -1
- package/dist/{bundle.119af3621ec41f8cbf04.bundle.js → bundle.f540ee201846422b1cb9.bundle.js} +3 -3
- package/dist/bundle.f540ee201846422b1cb9.bundle.js.map +1 -0
- package/dist/css/jmx.css +11 -1
- package/dist/i18n/locale-en.json +22 -6
- package/dist/i18n/locale-fr.json +61 -15
- package/dist/index.html +3 -3
- package/dist/js/angular/core/directives/rdfresourcesearch/templates/rdfResourceSearchTemplate.html +1 -1
- package/dist/pages/autocomplete.html +1 -1
- package/dist/pages/choose-repository-type.html +1 -1
- package/dist/pages/cluster-management/clusterInfo.html +3 -3
- package/dist/pages/create-index.html +4 -4
- package/dist/pages/dependencies.html +1 -1
- package/dist/pages/domainRangeInfo.html +2 -2
- package/dist/pages/edit.html +1 -1
- package/dist/pages/explore.html +1 -1
- package/dist/pages/export.html +1 -1
- package/dist/pages/find.html +1 -1
- package/dist/pages/graph-config/saveGraphConfig.html +11 -11
- package/dist/pages/graphs-visualizations.html +7 -7
- package/dist/pages/guides.html +1 -1
- package/dist/pages/import.html +1 -1
- package/dist/pages/jdbc-create.html +5 -5
- package/dist/pages/monitor/queries.html +1 -1
- package/dist/pages/monitor/resources.html +121 -31
- package/dist/pages/namespaces.html +2 -2
- package/dist/pages/plugins.html +1 -1
- package/dist/pages/rdfClassHierarchyInfo.html +7 -7
- package/dist/pages/rdfrank.html +2 -2
- package/dist/pages/repositories.html +2 -2
- package/dist/pages/repository.html +2 -2
- package/dist/pages/similarity-indexes.html +1 -1
- package/dist/pages/sparql-template-create.html +5 -5
- package/dist/pages/sparql.html +3 -3
- package/dist/pages/webapi.html +2 -2
- package/dist/plugins.js +4 -3
- package/dist/res/swagger/index.html +27 -27
- package/package.json +1 -1
- package/dist/108.19b6e7d30df333e42876.bundle.js.map +0 -1
- package/dist/111.4845cf402b3a4c3c006c.bundle.js +0 -2
- package/dist/111.4845cf402b3a4c3c006c.bundle.js.map +0 -1
- package/dist/112.99c50f08e6724346dc3a.bundle.js +0 -2
- package/dist/112.99c50f08e6724346dc3a.bundle.js.map +0 -1
- package/dist/12.d9d71e44fdefd12ffbd9.bundle.js.map +0 -1
- package/dist/13.c983d32d3e92f49cd670.bundle.js.map +0 -1
- package/dist/14.8661d578dfadafbcdf84.bundle.js.map +0 -1
- package/dist/15.6eada6724367dcd05007.bundle.js.map +0 -1
- package/dist/21.7f0a59ea2ad9340dcb2f.bundle.js.map +0 -1
- package/dist/34.01b159cdf635ac9d0dd7.bundle.js +0 -2
- package/dist/34.01b159cdf635ac9d0dd7.bundle.js.map +0 -1
- package/dist/44.4d7cb09cdd1413d5f879.bundle.js +0 -2
- package/dist/44.4d7cb09cdd1413d5f879.bundle.js.map +0 -1
- package/dist/45.8c6f6eba4736e953c2bc.bundle.js +0 -2
- package/dist/45.8c6f6eba4736e953c2bc.bundle.js.map +0 -1
- package/dist/46.3a0da10162409588560c.bundle.js +0 -2
- package/dist/46.3a0da10162409588560c.bundle.js.map +0 -1
- package/dist/47.049aedaa6cfccef06f69.bundle.js +0 -2
- package/dist/47.049aedaa6cfccef06f69.bundle.js.map +0 -1
- package/dist/48.d7b02a85dfa52084b1c4.bundle.js +0 -2
- package/dist/48.d7b02a85dfa52084b1c4.bundle.js.map +0 -1
- package/dist/49.2e7858348448fdde1332.bundle.js +0 -2
- package/dist/49.2e7858348448fdde1332.bundle.js.map +0 -1
- package/dist/50.1650ec02515a7dce98a5.bundle.js +0 -2
- package/dist/50.1650ec02515a7dce98a5.bundle.js.map +0 -1
- package/dist/51.c597233d286f68e37481.bundle.js +0 -2
- package/dist/51.c597233d286f68e37481.bundle.js.map +0 -1
- package/dist/52.0ea1cd862aeb2461a9c4.bundle.js +0 -2
- package/dist/52.0ea1cd862aeb2461a9c4.bundle.js.map +0 -1
- package/dist/bundle.119af3621ec41f8cbf04.bundle.js.map +0 -1
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["webpack:///./src/js/angular/rest/sparql-templates.rest.service.js","webpack:///./src/js/angular/sparql-template/controllers.js","webpack:///./src/js/angular/sparql-template/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"],"names":["angular","module","factory","SparqlTemplatesRestService","$inject","$http","getSparqlTemplates","repositoryID","get","getSparqlTemplate","templateID","params","createSparqlTemplate","template","post","query","updateSparqlTemplate","put","headers","deleteSparqlTemplate","delete","SparqlTemplatesCtrl","$scope","$repositories","toastr","ModalService","$licenseService","$translate","pluginName","setPluginIsActive","isPluginActive","pluginIsActive","isLicenseValid","getActiveRepository","isActiveRepoOntopType","isActiveRepoFedXType","success","data","sparqlTemplateIds","error","msg","getError","instant","$watch","deleteTemplate","openSimpleModal","title","message","warning","result","then","e","SparqlTemplateCreateCtrl","$location","$window","$timeout","RDF4JRepositoriesRestService","SparqlRestService","UriUtils","hash","search","getNamespaces","setLoader","getRepositoryNamespaces","usedPrefixes","results","bindings","forEach","prefix","value","namespace","namespaces","repositoryError","finally","loadTab","addKnownPrefixes","noPadding","paddingRight","paddingLeft","currentTabConfig","orientationViewMode","currentQuery","templateExist","newValue","oldValue","path","timer","goBack","history","back","locationChangeListener","$on","event","isPristine","confirm","window","removeEventListener","showBeforeunloadMessage","cancel","preventDefault","confirmExit","returnValue","addEventListener","defaultTabConfig","inference","sameAs","isNewTemplate","isRunning","progressMessage","extraMessage","yasrInnerContainer","element","document","getElementById","queryIsRunning","queryStartTime","Date","now","countTimeouted","addClass","removeClass","$$phase","$apply","tabsData","tab","editor","setValue","queryType","resultsCount","offset","allResultsCount","page","pageSize","timeFinished","timeTook","sizeDelta","canWriteActiveRepo","options","readOnly","setQueryFromTabConfig","tabs","copy","setQuery","setDirty","JSON","stringify","getValue","isDefined","saveNewTemplate","saveTab","templateContent","saveTemplate","getQueryMode","validateQuery","isInvalidTemplateId","isValidIri","find","templateId","modalMsg","$","on","controller","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","startTime","endTime","totalTime","log","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","container","select","availableWidth","availableHeight","wrap","selectAll","mouseHandler","mouseX","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","delta","id","floor","random","gravity","distance","snapDistance","classes","lastPosition","enabled","headerEnabled","valueFormatter","p","headerFormatter","keyFormatter","contentGenerator","elem","table","createElement","classed","html","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","optionsFunc","_options","Object","create","set","chartContainer","fixedTop","point","y","initOptions","windowSize","size","innerWidth","innerHeight","compatMode","a","isFunction","isDate","toString","isNumber","isNaN","windowResize","handler","clear","getColor","defaultColor","color_scale","ordinal","category20","customTheme","dictionary","getKey","defaultColors","defIndex","pjax","links","content","load","href","fragment","parentNode","replaceChild","pushState","textContent","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","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","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","subtitle","bulletWrap","tick","tickEnter","tickUpdate","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","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","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","testData","isDataValid","dataAvailable","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","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","time","COLORS","flatMap","getMaxValueForDataSeries","dataSeries","maxDataValue","getMaxValueFromDataHolder","maxChartValue","DEFAULT_MULTIPLIER","MAXIMUM_DIVISIONS","divisions","pow","toFixed","Notifications","showToastMessageWithDelay","Promise","r","HeapMemoryChart","super","committed","used","memoryData","parseData","setMaxHeapSize","heapMemoryUsage","subTitleKeyValues","formatBytesValue","setSubTitle","setScale","ClusterRestService","getClusterConfig","createCluster","groupConfiguration","updateCluster","patch","deleteCluster","forceDelete","param","addNodesToCluster","nodesArray","removeNodesFromCluster","getClusterStatus","getNodeStatus","sparqlTabDirective","$rootScope","LocalStorageAdapter","LSKeys","restrict","$element","getQueryID","selectTab","$broadcast","deleteTab","shiftKey","selectedTabId","TABS_STATE","idForDelete","isUndefined","findTabIndexByID","deleteTabByID","editCurrentTab","editCurrentlySelectedOnly","$show","$editableButtons","$el","currentTarget","$$currentValue","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","MonitoringRestService","$q","$filter","AVAILABLE_TABS","freeze","urlFragment","location","foundTab","activeTab","RESOURCE_MONITOR","resourceMonitorData","performanceMonitorData","structuresMonitorData","clusterHealthData","chartHolder","refresh","hasError","retries","fileDescriptors","heapMemory","offHeapMemory","diskStorage","connectionsChart","epoolChart","queriesChart","globalCacheChart","clusterHealthChart","hasCluster","loader","switchTab","getPerformanceMonitorData","activeRepository","monitorQueryTransactionStatistics","response","getActiveQueryMonitor","monitorQuery","getClusterMonitorData","monitorCluster","monitor","chartsHolder","poll","resolve","fetchFn","processResponse","clearMonitorError","catch","setMonitorError","dataSetter","setChartData","addData","monitors","monitorResources","monitorStructures","all","clusterMonitor","loaderTimer"],"mappings":"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","file":"13.fc8afecbe1a39b84c1db.bundle.js","sourcesContent":["angular\n .module('graphdb.framework.rest.sparql-templates.service', [])\n .factory('SparqlTemplatesRestService', SparqlTemplatesRestService);\n\nSparqlTemplatesRestService.$inject = ['$http'];\n\nconst REPOSITORIES_BASE_URL = 'rest/repositories/';\nconst SPARQL_TEMPLATES_URL = '/sparql-templates';\n\nfunction SparqlTemplatesRestService($http) {\n return {\n getSparqlTemplates,\n getSparqlTemplate,\n createSparqlTemplate,\n updateSparqlTemplate,\n deleteSparqlTemplate\n };\n\n function getSparqlTemplates(repositoryID) {\n return $http.get(`${REPOSITORIES_BASE_URL}${repositoryID}${SPARQL_TEMPLATES_URL}`);\n }\n\n function getSparqlTemplate(templateID, repositoryID) {\n return $http.get(`${REPOSITORIES_BASE_URL}${repositoryID}${SPARQL_TEMPLATES_URL}/configuration`,\n {\n params : {\n 'templateID': templateID\n }\n });\n }\n\n function createSparqlTemplate(template, repositoryID) {\n return $http.post(`${REPOSITORIES_BASE_URL}${repositoryID}${SPARQL_TEMPLATES_URL}`, {\n templateID: template.templateID,\n query: template.query\n });\n }\n\n function updateSparqlTemplate(template, repositoryID) {\n return $http.put(`${REPOSITORIES_BASE_URL}${repositoryID}${SPARQL_TEMPLATES_URL}`,\n template.query,\n {\n params : {\n 'templateID': template.templateID\n },\n headers: {\n 'Content-Type': 'text/plain'\n }\n });\n }\n\n function deleteSparqlTemplate(templateID, repositoryID) {\n return $http.delete(`${REPOSITORIES_BASE_URL}${repositoryID}${SPARQL_TEMPLATES_URL}`,\n {\n params : {\n 'templateID': templateID\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';\nimport 'angular/utils/uri-utils';\nimport {decodeHTML} from \"../../../app\";\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.sparql-template.controllers', modules, [\n 'graphdb.framework.utils.notifications'\n])\n .controller('SparqlTemplatesCtrl', SparqlTemplatesCtrl)\n .controller('SparqlTemplateCreateCtrl', SparqlTemplateCreateCtrl);\n\nSparqlTemplatesCtrl.$inject = ['$scope', '$repositories', 'SparqlTemplatesRestService', 'toastr', 'ModalService', '$licenseService', '$translate'];\n\nfunction SparqlTemplatesCtrl($scope, $repositories, SparqlTemplatesRestService, toastr, ModalService, $licenseService, $translate) {\n\n $scope.pluginName = 'sparql-template';\n\n $scope.setPluginIsActive = function (isPluginActive) {\n $scope.pluginIsActive = isPluginActive;\n }\n\n $scope.getSparqlTemplates = function () {\n // Only do this if there is an active repo that isn't an Ontop repo.\n // Ontop repos doesn't support update operations.\n if ($licenseService.isLicenseValid() &&\n $repositories.getActiveRepository()\n && !$repositories.isActiveRepoOntopType()\n && !$repositories.isActiveRepoFedXType()) {\n SparqlTemplatesRestService.getSparqlTemplates($repositories.getActiveRepository()).success(function (data) {\n $scope.sparqlTemplateIds = data;\n }).error(function (data) {\n const msg = getError(data);\n toastr.error(msg, $translate.instant('sparql.template.get.templates.error'));\n });\n } else {\n $scope.sparqlTemplateIds = [];\n }\n };\n\n $scope.$watch(function () {\n return $repositories.getActiveRepository();\n }, function () {\n $scope.getSparqlTemplates();\n });\n\n $scope.deleteTemplate = function (templateID) {\n ModalService.openSimpleModal({\n title: $translate.instant('common.warning'),\n message: $translate.instant('sparql.template.delete.template.warning', {templateID: templateID}),\n warning: true\n }).result\n .then(function () {\n SparqlTemplatesRestService.deleteSparqlTemplate(templateID, $repositories.getActiveRepository())\n .success(function () {\n toastr.success(templateID, $translate.instant('sparql.template.delete.template.success'));\n $scope.getSparqlTemplates();\n }).error(function (e) {\n toastr.error(getError(e), $translate.instant('sparql.template.delete.template.failure', {templateID: templateID}));\n });\n });\n };\n}\n\nSparqlTemplateCreateCtrl.$inject = ['$scope', '$location', 'toastr', '$repositories', '$window', '$timeout', 'SparqlTemplatesRestService', 'RDF4JRepositoriesRestService', 'SparqlRestService', 'UriUtils', 'ModalService', '$translate'];\n\nfunction SparqlTemplateCreateCtrl($scope, $location, toastr, $repositories, $window, $timeout, SparqlTemplatesRestService, RDF4JRepositoriesRestService, SparqlRestService, UriUtils, ModalService, $translate) {\n\n const hash = $location.hash() || '';\n $scope.templateID = ($location.search().templateID || '') + (hash ? (`#${hash}`) : '');\n $scope.title = ($scope.templateID ? $translate.instant('edit') : $translate.instant('common.create.btn')) + ' SPARQL Template';\n $scope.getNamespaces = getNamespaces;\n $scope.setLoader = setLoader;\n $scope.addKnownPrefixes = addKnownPrefixes;\n $scope.noPadding = {paddingRight: 0, paddingLeft: 0};\n $scope.currentTabConfig = {};\n // This property is obligatory in order to show YASQUE and YASR properly\n $scope.orientationViewMode = true;\n $scope.currentQuery = {};\n let templateExist = false;\n\n\n $scope.$watch(function () {\n return $repositories.getActiveRepository();\n }, function (newValue, oldValue) {\n if (newValue !== oldValue) {\n $location.path('/sparql-templates');\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 templateID: '',\n query: 'PREFIX rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#>\\n' +\n 'PREFIX ex: <http://example.com#>\\n' +\n 'DELETE {\\n' +\n ' ?subject ex:myPredicate ?oldValue .\\n' +\n '} INSERT {\\n' +\n ' ?subject ex:myPredicate ?newValue .\\n' +\n '} WHERE {\\n' +\n ' ?id rdf:type ex:MyType .\\n' +\n ' ?subject ex:isRelatedTo ?id .\\n' +\n '}\\n',\n inference: true,\n sameAs: true,\n isNewTemplate: true,\n isPristine: true\n };\n\n $scope.saveTab = function () {\n // Should have this empty function in this view\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.templateID) {\n getSparqlTemplate($scope.templateID);\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 function getSparqlTemplate(templateID) {\n SparqlTemplatesRestService.getSparqlTemplate(templateID, $repositories.getActiveRepository() ).success(function (templateContent) {\n defaultTabConfig.query = templateContent;\n defaultTabConfig.templateID = templateID;\n\n defaultTabConfig.isNewTemplate = !templateID;\n\n setQueryFromTabConfig();\n }).error(function (data) {\n const msg = getError(data);\n toastr.error(msg, $translate.instant('sparql.template.get.template.error', {templateID: $scope.currentQuery.templateID}));\n $scope.repositoryError = msg;\n });\n }\n\n function setQueryFromTabConfig() {\n $scope.tabsData = $scope.tabs = [defaultTabConfig];\n $scope.currentQuery = angular.copy(defaultTabConfig);\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.saveTemplate = function () {\n if (!validateQuery()) {\n return;\n }\n\n if (!$scope.currentQuery.templateID) {\n toastr.error($translate.instant('sparql.template.iri.constraint'));\n return;\n } else {\n validateTemplateID();\n if ($scope.isInvalidTemplateId) {\n return;\n }\n }\n\n if ($scope.currentQuery.isNewTemplate) {\n checkIfTemplateExists()\n .then(() => {\n if (templateExist) {\n const modalMsg = decodeHTML($translate.instant('sparql.template.existing.template.error', {templateID: $scope.currentQuery.templateID}));\n ModalService.openSimpleModal({\n title: $translate.instant('common.confirm.save'),\n message: modalMsg,\n warning: true\n }).result\n .then(function () {\n saveNewTemplate();\n });\n } else {\n saveNewTemplate();\n }\n });\n } else {\n if (!$scope.currentQuery.isPristine) {\n SparqlTemplatesRestService.updateSparqlTemplate($scope.currentQuery, $repositories.getActiveRepository()).success(function () {\n $scope.currentQuery.isPristine = true;\n $scope.currentQuery.isNewTemplate = false;\n toastr.success($scope.currentQuery.templateID, $translate.instant('update.sparql.template.success.msg'));\n $scope.goBack();\n }).error(function (data) {\n const msg = getError(data);\n toastr.error(msg, $translate.instant('save.sparql.template.failure.msg', {templateID: $scope.currentQuery.templateID}));\n });\n } else {\n // No changes to template query, go back to\n $scope.goBack();\n }\n }\n };\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.setDirty = function () {\n $scope.currentQuery.isPristine = false;\n };\n\n function hasValidQuery() {\n return window.editor && window.editor.getQueryMode() === 'update';\n }\n\n function validateQuery() {\n if (!hasValidQuery()) {\n toastr.error($translate.instant('sparql.template.query.constraint'), $translate.instant('jdbc.invalid.query'));\n return false;\n }\n\n return true;\n }\n\n function validateTemplateID() {\n $scope.isInvalidTemplateId = !UriUtils.isValidIri($scope.currentQuery.templateID);\n }\n\n function saveNewTemplate() {\n SparqlTemplatesRestService.createSparqlTemplate($scope.currentQuery, $repositories.getActiveRepository()).success(function () {\n $scope.currentQuery.isPristine = true;\n $scope.currentQuery.isNewTemplate = false;\n toastr.success($scope.currentQuery.templateID, $translate.instant('save.sparql.template.success.msg'));\n $scope.goBack();\n }).error(function (data) {\n const msg = getError(data);\n toastr.error(msg, $translate.instant('save.sparql.template.failure.msg', {templateID: $scope.currentQuery.templateID}));\n });\n }\n\n function checkIfTemplateExists() {\n return SparqlTemplatesRestService\n .getSparqlTemplates($repositories.getActiveRepository())\n .success(function (data) {\n templateExist = data.find((templateId) => templateId === $scope.currentQuery.templateID);\n }).error(function (data) {\n const msg = getError(data);\n toastr.error(msg, $translate.instant('sparql.template.get.templates.error'));\n });\n }\n}\n","import 'angular/core/services';\nimport 'angular/core/directives';\nimport 'angular/resources/controllers';\nimport 'angular/core/services/repositories.service';\nimport 'angular/sparql-template/controllers';\nimport 'angular/rest/sparql-templates.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';\nimport 'angular/utils/uri-utils';\n\nconst modules = [\n 'toastr',\n 'ui.bootstrap',\n 'graphdb.framework.sparql-template.controllers',\n 'graphdb.framework.core.services.repositories',\n 'graphdb.framework.core.directives',\n 'graphdb.framework.rest.sparql-templates.service',\n 'graphdb.framework.core.directives.queryeditor.controllers',\n 'graphdb.framework.core.directives.queryeditor.sparqltab',\n 'graphdb.framework.core.directives.queryeditor.queryeditor',\n 'graphdb.framework.utils.uriutils'\n];\n\nangular.module('graphdb.framework.sparql-template', 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"],"sourceRoot":""}
|