reportbuilder 1.2.5 → 1.3.0
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.
- data.tar.gz.sig +0 -0
- data/History.txt +6 -0
- data/Manifest.txt +377 -0
- data/data/flot/API.txt +1024 -0
- data/data/flot/FAQ.txt +71 -0
- data/data/flot/LICENSE.txt +22 -0
- data/data/flot/Makefile +15 -0
- data/data/flot/NEWS.txt +340 -0
- data/data/flot/PLUGINS.txt +105 -0
- data/data/flot/README.txt +81 -0
- data/data/flot/examples/ajax.html +143 -0
- data/data/flot/examples/annotating.html +75 -0
- data/data/flot/examples/arrow-down.gif +0 -0
- data/data/flot/examples/arrow-left.gif +0 -0
- data/data/flot/examples/arrow-right.gif +0 -0
- data/data/flot/examples/arrow-up.gif +0 -0
- data/data/flot/examples/basic.html +38 -0
- data/data/flot/examples/data-eu-gdp-growth-1.json +4 -0
- data/data/flot/examples/data-eu-gdp-growth-2.json +4 -0
- data/data/flot/examples/data-eu-gdp-growth-3.json +4 -0
- data/data/flot/examples/data-eu-gdp-growth-4.json +4 -0
- data/data/flot/examples/data-eu-gdp-growth-5.json +4 -0
- data/data/flot/examples/data-eu-gdp-growth.json +4 -0
- data/data/flot/examples/data-japan-gdp-growth.json +4 -0
- data/data/flot/examples/data-usa-gdp-growth.json +4 -0
- data/data/flot/examples/dual-axis.html +39 -0
- data/data/flot/examples/graph-types.html +75 -0
- data/data/flot/examples/hs-2004-27-a-large_web.jpg +0 -0
- data/data/flot/examples/image.html +45 -0
- data/data/flot/examples/index.html +43 -0
- data/data/flot/examples/interacting.html +93 -0
- data/data/flot/examples/layout.css +6 -0
- data/data/flot/examples/navigate.html +118 -0
- data/data/flot/examples/selection.html +114 -0
- data/data/flot/examples/setting-options.html +65 -0
- data/data/flot/examples/stacking.html +77 -0
- data/data/flot/examples/thresholding.html +54 -0
- data/data/flot/examples/time.html +71 -0
- data/data/flot/examples/tracking.html +95 -0
- data/data/flot/examples/turning-series.html +98 -0
- data/data/flot/examples/visitors.html +90 -0
- data/data/flot/examples/zooming.html +98 -0
- data/data/flot/excanvas.js +1427 -0
- data/data/flot/excanvas.min.js +1 -0
- data/data/flot/jquery.colorhelpers.js +174 -0
- data/data/flot/jquery.colorhelpers.min.js +1 -0
- data/data/flot/jquery.flot.crosshair.js +156 -0
- data/data/flot/jquery.flot.crosshair.min.js +1 -0
- data/data/flot/jquery.flot.image.js +237 -0
- data/data/flot/jquery.flot.image.min.js +1 -0
- data/data/flot/jquery.flot.js +2119 -0
- data/data/flot/jquery.flot.min.js +1 -0
- data/data/flot/jquery.flot.navigate.js +272 -0
- data/data/flot/jquery.flot.navigate.min.js +1 -0
- data/data/flot/jquery.flot.selection.js +299 -0
- data/data/flot/jquery.flot.selection.min.js +1 -0
- data/data/flot/jquery.flot.stack.js +152 -0
- data/data/flot/jquery.flot.stack.min.js +1 -0
- data/data/flot/jquery.flot.threshold.js +103 -0
- data/data/flot/jquery.flot.threshold.min.js +1 -0
- data/data/flot/jquery.js +4376 -0
- data/data/flot/jquery.min.js +19 -0
- data/data/jqplot/MIT-LICENSE.txt +21 -0
- data/data/jqplot/README.txt +73 -0
- data/data/jqplot/changes.txt +261 -0
- data/data/jqplot/copyright.txt +33 -0
- data/data/jqplot/docs/files/MIT-LICENSE-txt.html +39 -0
- data/data/jqplot/docs/files/changes-txt.html +39 -0
- data/data/jqplot/docs/files/gpl-2-0-txt.html +39 -0
- data/data/jqplot/docs/files/images/background.jpg +0 -0
- data/data/jqplot/docs/files/images/basicline.png +0 -0
- data/data/jqplot/docs/files/images/basiclogaxis.png +0 -0
- data/data/jqplot/docs/files/images/basiclogoptions.png +0 -0
- data/data/jqplot/docs/files/images/basicoptions.png +0 -0
- data/data/jqplot/docs/files/images/dualaxis.png +0 -0
- data/data/jqplot/docs/files/images/logo.jpg +0 -0
- data/data/jqplot/docs/files/images/navdocs.png +0 -0
- data/data/jqplot/docs/files/images/navdocsover.png +0 -0
- data/data/jqplot/docs/files/images/navdownload.png +0 -0
- data/data/jqplot/docs/files/images/navdownloadover.png +0 -0
- data/data/jqplot/docs/files/images/navexamples.png +0 -0
- data/data/jqplot/docs/files/images/navexamplesover.png +0 -0
- data/data/jqplot/docs/files/images/navhome.png +0 -0
- data/data/jqplot/docs/files/images/navhomeover.png +0 -0
- data/data/jqplot/docs/files/images/new.png +0 -0
- data/data/jqplot/docs/files/images/sample3.png +0 -0
- data/data/jqplot/docs/files/images/samplesm.png +0 -0
- data/data/jqplot/docs/files/jqPlotCssStyling-txt.html +39 -0
- data/data/jqplot/docs/files/jqPlotOptions-txt.html +292 -0
- data/data/jqplot/docs/files/jqplot-axisLabelRenderer-js.html +47 -0
- data/data/jqplot/docs/files/jqplot-axisTickRenderer-js.html +69 -0
- data/data/jqplot/docs/files/jqplot-canvasGridRenderer-js.html +39 -0
- data/data/jqplot/docs/files/jqplot-core-js.html +353 -0
- data/data/jqplot/docs/files/jqplot-divTitleRenderer-js.html +39 -0
- data/data/jqplot/docs/files/jqplot-lineRenderer-js.html +53 -0
- data/data/jqplot/docs/files/jqplot-linearAxisRenderer-js.html +39 -0
- data/data/jqplot/docs/files/jqplot-markerRenderer-js.html +65 -0
- data/data/jqplot/docs/files/jqplot-shadowRenderer-js.html +61 -0
- data/data/jqplot/docs/files/jqplot-shapeRenderer-js.html +63 -0
- data/data/jqplot/docs/files/jqplot-themeEngine-js.html +190 -0
- data/data/jqplot/docs/files/optionsTutorial-txt.html +119 -0
- data/data/jqplot/docs/files/plugins/jqplot-BezierCurveRenderer-js.html +45 -0
- data/data/jqplot/docs/files/plugins/jqplot-barRenderer-js.html +67 -0
- data/data/jqplot/docs/files/plugins/jqplot-blockRenderer-js.html +53 -0
- data/data/jqplot/docs/files/plugins/jqplot-bubbleRenderer-js.html +71 -0
- data/data/jqplot/docs/files/plugins/jqplot-canvasAxisLabelRenderer-js.html +63 -0
- data/data/jqplot/docs/files/plugins/jqplot-canvasAxisTickRenderer-js.html +79 -0
- data/data/jqplot/docs/files/plugins/jqplot-categoryAxisRenderer-js.html +46 -0
- data/data/jqplot/docs/files/plugins/jqplot-cursor-js.html +91 -0
- data/data/jqplot/docs/files/plugins/jqplot-dateAxisRenderer-js.html +93 -0
- data/data/jqplot/docs/files/plugins/jqplot-donutRenderer-js.html +98 -0
- data/data/jqplot/docs/files/plugins/jqplot-dragable-js.html +45 -0
- data/data/jqplot/docs/files/plugins/jqplot-enhancedLegendRenderer-js.html +49 -0
- data/data/jqplot/docs/files/plugins/jqplot-funnelRenderer-js.html +87 -0
- data/data/jqplot/docs/files/plugins/jqplot-highlighter-js.html +80 -0
- data/data/jqplot/docs/files/plugins/jqplot-logAxisRenderer-js.html +45 -0
- data/data/jqplot/docs/files/plugins/jqplot-mekkoAxisRenderer-js.html +49 -0
- data/data/jqplot/docs/files/plugins/jqplot-mekkoRenderer-js.html +62 -0
- data/data/jqplot/docs/files/plugins/jqplot-meterGaugeRenderer-js.html +103 -0
- data/data/jqplot/docs/files/plugins/jqplot-ohlcRenderer-js.html +65 -0
- data/data/jqplot/docs/files/plugins/jqplot-pieRenderer-js.html +93 -0
- data/data/jqplot/docs/files/plugins/jqplot-pointLabels-js.html +72 -0
- data/data/jqplot/docs/files/plugins/jqplot-trendline-js.html +67 -0
- data/data/jqplot/docs/files/usage-txt.html +58 -0
- data/data/jqplot/docs/index.html +1 -0
- data/data/jqplot/docs/index/Classes.html +58 -0
- data/data/jqplot/docs/index/Files.html +34 -0
- data/data/jqplot/docs/index/Functions.html +66 -0
- data/data/jqplot/docs/index/General.html +46 -0
- data/data/jqplot/docs/index/General2.html +46 -0
- data/data/jqplot/docs/index/General3.html +46 -0
- data/data/jqplot/docs/index/General4.html +50 -0
- data/data/jqplot/docs/index/General5.html +34 -0
- data/data/jqplot/docs/index/General6.html +58 -0
- data/data/jqplot/docs/index/Hooks.html +46 -0
- data/data/jqplot/docs/index/Properties.html +50 -0
- data/data/jqplot/docs/index/Properties2.html +50 -0
- data/data/jqplot/docs/index/Properties3.html +50 -0
- data/data/jqplot/docs/index/Properties4.html +34 -0
- data/data/jqplot/docs/index/Properties5.html +58 -0
- data/data/jqplot/docs/javascript/main.js +836 -0
- data/data/jqplot/docs/javascript/searchdata.js +182 -0
- data/data/jqplot/docs/search/ClassesA.html +20 -0
- data/data/jqplot/docs/search/ClassesG.html +20 -0
- data/data/jqplot/docs/search/ClassesJ.html +20 -0
- data/data/jqplot/docs/search/ClassesL.html +20 -0
- data/data/jqplot/docs/search/ClassesS.html +20 -0
- data/data/jqplot/docs/search/ClassesSymbols.html +20 -0
- data/data/jqplot/docs/search/ClassesT.html +20 -0
- data/data/jqplot/docs/search/FilesJ.html +20 -0
- data/data/jqplot/docs/search/FunctionsC.html +20 -0
- data/data/jqplot/docs/search/FunctionsD.html +20 -0
- data/data/jqplot/docs/search/FunctionsG.html +20 -0
- data/data/jqplot/docs/search/FunctionsI.html +20 -0
- data/data/jqplot/docs/search/FunctionsM.html +20 -0
- data/data/jqplot/docs/search/FunctionsN.html +20 -0
- data/data/jqplot/docs/search/FunctionsR.html +20 -0
- data/data/jqplot/docs/search/FunctionsS.html +20 -0
- data/data/jqplot/docs/search/FunctionsZ.html +20 -0
- data/data/jqplot/docs/search/GeneralA.html +20 -0
- data/data/jqplot/docs/search/GeneralB.html +20 -0
- data/data/jqplot/docs/search/GeneralC.html +20 -0
- data/data/jqplot/docs/search/GeneralD.html +20 -0
- data/data/jqplot/docs/search/GeneralE.html +20 -0
- data/data/jqplot/docs/search/GeneralF.html +20 -0
- data/data/jqplot/docs/search/GeneralG.html +20 -0
- data/data/jqplot/docs/search/GeneralH.html +20 -0
- data/data/jqplot/docs/search/GeneralI.html +20 -0
- data/data/jqplot/docs/search/GeneralJ.html +20 -0
- data/data/jqplot/docs/search/GeneralL.html +20 -0
- data/data/jqplot/docs/search/GeneralM.html +20 -0
- data/data/jqplot/docs/search/GeneralN.html +20 -0
- data/data/jqplot/docs/search/GeneralO.html +20 -0
- data/data/jqplot/docs/search/GeneralP.html +20 -0
- data/data/jqplot/docs/search/GeneralR.html +20 -0
- data/data/jqplot/docs/search/GeneralS.html +20 -0
- data/data/jqplot/docs/search/GeneralSymbols.html +20 -0
- data/data/jqplot/docs/search/GeneralT.html +20 -0
- data/data/jqplot/docs/search/GeneralU.html +20 -0
- data/data/jqplot/docs/search/GeneralV.html +20 -0
- data/data/jqplot/docs/search/GeneralW.html +20 -0
- data/data/jqplot/docs/search/GeneralX.html +20 -0
- data/data/jqplot/docs/search/GeneralY.html +20 -0
- data/data/jqplot/docs/search/GeneralZ.html +20 -0
- data/data/jqplot/docs/search/HooksA.html +20 -0
- data/data/jqplot/docs/search/HooksE.html +20 -0
- data/data/jqplot/docs/search/HooksJ.html +20 -0
- data/data/jqplot/docs/search/HooksP.html +20 -0
- data/data/jqplot/docs/search/NoResults.html +15 -0
- data/data/jqplot/docs/search/PropertiesA.html +20 -0
- data/data/jqplot/docs/search/PropertiesB.html +20 -0
- data/data/jqplot/docs/search/PropertiesC.html +20 -0
- data/data/jqplot/docs/search/PropertiesD.html +20 -0
- data/data/jqplot/docs/search/PropertiesE.html +20 -0
- data/data/jqplot/docs/search/PropertiesF.html +20 -0
- data/data/jqplot/docs/search/PropertiesG.html +20 -0
- data/data/jqplot/docs/search/PropertiesH.html +20 -0
- data/data/jqplot/docs/search/PropertiesI.html +20 -0
- data/data/jqplot/docs/search/PropertiesL.html +20 -0
- data/data/jqplot/docs/search/PropertiesM.html +20 -0
- data/data/jqplot/docs/search/PropertiesN.html +20 -0
- data/data/jqplot/docs/search/PropertiesO.html +20 -0
- data/data/jqplot/docs/search/PropertiesP.html +20 -0
- data/data/jqplot/docs/search/PropertiesR.html +20 -0
- data/data/jqplot/docs/search/PropertiesS.html +20 -0
- data/data/jqplot/docs/search/PropertiesT.html +20 -0
- data/data/jqplot/docs/search/PropertiesU.html +20 -0
- data/data/jqplot/docs/search/PropertiesV.html +20 -0
- data/data/jqplot/docs/search/PropertiesW.html +20 -0
- data/data/jqplot/docs/search/PropertiesX.html +20 -0
- data/data/jqplot/docs/search/PropertiesY.html +20 -0
- data/data/jqplot/docs/search/PropertiesZ.html +20 -0
- data/data/jqplot/docs/styles/1.css +767 -0
- data/data/jqplot/docs/styles/2.css +174 -0
- data/data/jqplot/docs/styles/main.css +2 -0
- data/data/jqplot/examples/.htaccess +1 -0
- data/data/jqplot/examples/OHLC.html +333 -0
- data/data/jqplot/examples/OHLC2.html +193 -0
- data/data/jqplot/examples/area.html +107 -0
- data/data/jqplot/examples/axisLabel.html +117 -0
- data/data/jqplot/examples/axisLabelsRotatedText.html +131 -0
- data/data/jqplot/examples/axisLabelsRotatedText2.html +155 -0
- data/data/jqplot/examples/barLinePieStack.html +198 -0
- data/data/jqplot/examples/barMissingValues.html +64 -0
- data/data/jqplot/examples/barTest.html +283 -0
- data/data/jqplot/examples/barTest2.html +74 -0
- data/data/jqplot/examples/bezierCurve.html +96 -0
- data/data/jqplot/examples/blockPlot.html +149 -0
- data/data/jqplot/examples/bubbleChart2.html +253 -0
- data/data/jqplot/examples/bubblechart.html +69 -0
- data/data/jqplot/examples/catchError.html +53 -0
- data/data/jqplot/examples/categoryHorizontalBar.html +81 -0
- data/data/jqplot/examples/categoryVsLinearAxes.html +74 -0
- data/data/jqplot/examples/chartInTable.html +33 -0
- data/data/jqplot/examples/customHighlighterCursorTrendline.html +72 -0
- data/data/jqplot/examples/customPieTests.html +73 -0
- data/data/jqplot/examples/dataLabels.html +192 -0
- data/data/jqplot/examples/dataTracking.html +91 -0
- data/data/jqplot/examples/donutTest.html +89 -0
- data/data/jqplot/examples/donutTest.js +96 -0
- data/data/jqplot/examples/examples.css +19 -0
- data/data/jqplot/examples/fillToZero.html +126 -0
- data/data/jqplot/examples/filledLine.html +78 -0
- data/data/jqplot/examples/filledLineCategoryAxis.html +80 -0
- data/data/jqplot/examples/funnelTest.html +82 -0
- data/data/jqplot/examples/funnelTest.js +74 -0
- data/data/jqplot/examples/gridCustomization.html +56 -0
- data/data/jqplot/examples/hiddenPlot.html +216 -0
- data/data/jqplot/examples/highlighter.html +95 -0
- data/data/jqplot/examples/highlighter2.html +63 -0
- data/data/jqplot/examples/horizontalLine.html +51 -0
- data/data/jqplot/examples/intticks.html +178 -0
- data/data/jqplot/examples/jquery-ui/css/ui-lightness/images/ui-bg_diagonals-thick_18_b81900_40x40.png +0 -0
- data/data/jqplot/examples/jquery-ui/css/ui-lightness/images/ui-bg_diagonals-thick_20_666666_40x40.png +0 -0
- data/data/jqplot/examples/jquery-ui/css/ui-lightness/images/ui-bg_flat_10_000000_40x100.png +0 -0
- data/data/jqplot/examples/jquery-ui/css/ui-lightness/images/ui-bg_glass_100_f6f6f6_1x400.png +0 -0
- data/data/jqplot/examples/jquery-ui/css/ui-lightness/images/ui-bg_glass_100_fdf5ce_1x400.png +0 -0
- data/data/jqplot/examples/jquery-ui/css/ui-lightness/images/ui-bg_glass_65_ffffff_1x400.png +0 -0
- data/data/jqplot/examples/jquery-ui/css/ui-lightness/images/ui-bg_gloss-wave_35_f6a828_500x100.png +0 -0
- data/data/jqplot/examples/jquery-ui/css/ui-lightness/images/ui-bg_highlight-soft_100_eeeeee_1x100.png +0 -0
- data/data/jqplot/examples/jquery-ui/css/ui-lightness/images/ui-bg_highlight-soft_75_ffe45c_1x100.png +0 -0
- data/data/jqplot/examples/jquery-ui/css/ui-lightness/images/ui-icons_222222_256x240.png +0 -0
- data/data/jqplot/examples/jquery-ui/css/ui-lightness/images/ui-icons_228ef1_256x240.png +0 -0
- data/data/jqplot/examples/jquery-ui/css/ui-lightness/images/ui-icons_ef8c08_256x240.png +0 -0
- data/data/jqplot/examples/jquery-ui/css/ui-lightness/images/ui-icons_ffd27a_256x240.png +0 -0
- data/data/jqplot/examples/jquery-ui/css/ui-lightness/images/ui-icons_ffffff_256x240.png +0 -0
- data/data/jqplot/examples/jquery-ui/css/ui-lightness/jquery-ui-1.8.1.custom.css +486 -0
- data/data/jqplot/examples/jquery-ui/js/jquery-1.4.2.min.js +154 -0
- data/data/jqplot/examples/jquery-ui/js/jquery-ui-1.8.1.custom.min.js +756 -0
- data/data/jqplot/examples/legendLabels.html +205 -0
- data/data/jqplot/examples/legendLabels2.html +228 -0
- data/data/jqplot/examples/liz.zip +0 -0
- data/data/jqplot/examples/markerStyles.html +44 -0
- data/data/jqplot/examples/mekkoChart.html +217 -0
- data/data/jqplot/examples/meterGauge.html +132 -0
- data/data/jqplot/examples/meterGauge2.html +158 -0
- data/data/jqplot/examples/minMaxLines.html +61 -0
- data/data/jqplot/examples/missingValues.html +119 -0
- data/data/jqplot/examples/multiAxesRotatedText.html +70 -0
- data/data/jqplot/examples/multipleBarColors.html +149 -0
- data/data/jqplot/examples/multipleLines.html +47 -0
- data/data/jqplot/examples/multipleYAxes.html +85 -0
- data/data/jqplot/examples/nav.inc +35 -0
- data/data/jqplot/examples/pieTest.html +77 -0
- data/data/jqplot/examples/pieTest2.html +87 -0
- data/data/jqplot/examples/pieTest2.js +80 -0
- data/data/jqplot/examples/pieTest3.html +100 -0
- data/data/jqplot/examples/pointLabels.html +94 -0
- data/data/jqplot/examples/pointLabels2.html +47 -0
- data/data/jqplot/examples/prefix.html +90 -0
- data/data/jqplot/examples/resizablePlot.html +150 -0
- data/data/jqplot/examples/rotatedTickLabels.html +61 -0
- data/data/jqplot/examples/rotatedTickLabelsZoom.html +68 -0
- data/data/jqplot/examples/seriesCanvasReorder.html +93 -0
- data/data/jqplot/examples/seriesUpdate.html +123 -0
- data/data/jqplot/examples/shadowTests.html +133 -0
- data/data/jqplot/examples/singlePoint.html +70 -0
- data/data/jqplot/examples/sparkLine.html +48 -0
- data/data/jqplot/examples/stackedBar2.html +104 -0
- data/data/jqplot/examples/stackedBar3.html +76 -0
- data/data/jqplot/examples/stackedBarCategoryVsLinearAxes.html +121 -0
- data/data/jqplot/examples/stackedCategoryAxis.html +89 -0
- data/data/jqplot/examples/stackedFilledLine.html +77 -0
- data/data/jqplot/examples/stackedLine.html +56 -0
- data/data/jqplot/examples/test2.html +64 -0
- data/data/jqplot/examples/theming.html +483 -0
- data/data/jqplot/examples/trendlineDragableCustomization.html +79 -0
- data/data/jqplot/examples/verticalLine.html +52 -0
- data/data/jqplot/examples/waterfall.html +135 -0
- data/data/jqplot/examples/zoom1.html +125 -0
- data/data/jqplot/examples/zoom2.html +73 -0
- data/data/jqplot/examples/zoom3.html +69 -0
- data/data/jqplot/examples/zoomOptions.html +101 -0
- data/data/jqplot/examples/zoomProxy.html +108 -0
- data/data/jqplot/excanvas.js +1416 -0
- data/data/jqplot/excanvas.min.js +35 -0
- data/data/jqplot/gpl-2.0.txt +280 -0
- data/data/jqplot/jqPlotCssStyling.txt +53 -0
- data/data/jqplot/jqPlotOptions.txt +276 -0
- data/data/jqplot/jquery-1.4.1.min.js +152 -0
- data/data/jqplot/jquery-1.4.2.min.js +154 -0
- data/data/jqplot/jquery.jqplot.css +212 -0
- data/data/jqplot/jquery.jqplot.js +7004 -0
- data/data/jqplot/jquery.jqplot.min.css +1 -0
- data/data/jqplot/jquery.jqplot.min.js +34 -0
- data/data/jqplot/optionsTutorial.txt +239 -0
- data/data/jqplot/plugins/jqplot.BezierCurveRenderer.js +300 -0
- data/data/jqplot/plugins/jqplot.BezierCurveRenderer.min.js +34 -0
- data/data/jqplot/plugins/jqplot.barRenderer.js +629 -0
- data/data/jqplot/plugins/jqplot.barRenderer.min.js +34 -0
- data/data/jqplot/plugins/jqplot.blockRenderer.js +221 -0
- data/data/jqplot/plugins/jqplot.blockRenderer.min.js +34 -0
- data/data/jqplot/plugins/jqplot.bubbleRenderer.js +724 -0
- data/data/jqplot/plugins/jqplot.bubbleRenderer.min.js +34 -0
- data/data/jqplot/plugins/jqplot.canvasAxisLabelRenderer.js +187 -0
- data/data/jqplot/plugins/jqplot.canvasAxisLabelRenderer.min.js +34 -0
- data/data/jqplot/plugins/jqplot.canvasAxisTickRenderer.js +226 -0
- data/data/jqplot/plugins/jqplot.canvasAxisTickRenderer.min.js +34 -0
- data/data/jqplot/plugins/jqplot.canvasTextRenderer.js +408 -0
- data/data/jqplot/plugins/jqplot.canvasTextRenderer.min.js +34 -0
- data/data/jqplot/plugins/jqplot.categoryAxisRenderer.js +630 -0
- data/data/jqplot/plugins/jqplot.categoryAxisRenderer.min.js +34 -0
- data/data/jqplot/plugins/jqplot.cursor.js +952 -0
- data/data/jqplot/plugins/jqplot.cursor.min.js +34 -0
- data/data/jqplot/plugins/jqplot.dateAxisRenderer.js +313 -0
- data/data/jqplot/plugins/jqplot.dateAxisRenderer.min.js +34 -0
- data/data/jqplot/plugins/jqplot.donutRenderer.js +876 -0
- data/data/jqplot/plugins/jqplot.donutRenderer.min.js +34 -0
- data/data/jqplot/plugins/jqplot.dragable.js +206 -0
- data/data/jqplot/plugins/jqplot.dragable.min.js +34 -0
- data/data/jqplot/plugins/jqplot.enhancedLegendRenderer.js +186 -0
- data/data/jqplot/plugins/jqplot.enhancedLegendRenderer.min.js +34 -0
- data/data/jqplot/plugins/jqplot.funnelRenderer.js +918 -0
- data/data/jqplot/plugins/jqplot.funnelRenderer.min.js +34 -0
- data/data/jqplot/plugins/jqplot.highlighter.js +374 -0
- data/data/jqplot/plugins/jqplot.highlighter.min.js +34 -0
- data/data/jqplot/plugins/jqplot.logAxisRenderer.js +434 -0
- data/data/jqplot/plugins/jqplot.logAxisRenderer.min.js +34 -0
- data/data/jqplot/plugins/jqplot.mekkoAxisRenderer.js +595 -0
- data/data/jqplot/plugins/jqplot.mekkoAxisRenderer.min.js +34 -0
- data/data/jqplot/plugins/jqplot.mekkoRenderer.js +419 -0
- data/data/jqplot/plugins/jqplot.mekkoRenderer.min.js +34 -0
- data/data/jqplot/plugins/jqplot.meterGaugeRenderer.js +1112 -0
- data/data/jqplot/plugins/jqplot.meterGaugeRenderer.min.js +34 -0
- data/data/jqplot/plugins/jqplot.ohlcRenderer.js +343 -0
- data/data/jqplot/plugins/jqplot.ohlcRenderer.min.js +34 -0
- data/data/jqplot/plugins/jqplot.pieRenderer.js +749 -0
- data/data/jqplot/plugins/jqplot.pieRenderer.min.js +34 -0
- data/data/jqplot/plugins/jqplot.pointLabels.js +325 -0
- data/data/jqplot/plugins/jqplot.pointLabels.min.js +34 -0
- data/data/jqplot/plugins/jqplot.trendline.js +208 -0
- data/data/jqplot/plugins/jqplot.trendline.min.js +34 -0
- data/data/jqplot/usage.txt +119 -0
- data/examples/graph.rb +17 -0
- data/lib/reportbuilder.rb +21 -2
- data/lib/reportbuilder/builder.rb +31 -3
- data/lib/reportbuilder/builder/html.rb +39 -5
- data/lib/reportbuilder/graph.rb +252 -0
- data/lib/reportbuilder/graph/html_flot.rb +149 -0
- data/lib/reportbuilder/graph/html_jqplot.rb +145 -0
- data/lib/reportbuilder/image.rb +178 -78
- data/lib/reportbuilder/table/rtfbuilder.rb +2 -2
- data/test/helper_test.rb +6 -7
- data/test/test_graph.rb +44 -0
- data/test/test_graph_html_flot.rb +36 -0
- data/test/test_graph_html_jqplot.rb +36 -0
- data/test/test_html.rb +4 -7
- data/test/test_image.rb +35 -7
- data/test/test_reportbuilder.rb +4 -6
- data/test/test_table.rb +0 -2
- metadata +402 -7
- metadata.gz.sig +4 -2
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Copyright (c) 2009 - 2010 Chris Leonello
|
|
3
|
+
* jqPlot is currently available for use in all personal or commercial projects
|
|
4
|
+
* under both the MIT (http://www.opensource.org/licenses/mit-license.php) and GPL
|
|
5
|
+
* version 2.0 (http://www.gnu.org/licenses/gpl-2.0.html) licenses. This means that you can
|
|
6
|
+
* choose the license that best suits your project and use it accordingly.
|
|
7
|
+
*
|
|
8
|
+
* Although not required, the author would appreciate an email letting him
|
|
9
|
+
* know of any substantial use of jqPlot. You can reach the author at:
|
|
10
|
+
* chris at jqplot or see http://www.jqplot.com/info.php .
|
|
11
|
+
*
|
|
12
|
+
* If you are feeling kind and generous, consider supporting the project by
|
|
13
|
+
* making a donation at: http://www.jqplot.com/donate.php .
|
|
14
|
+
*
|
|
15
|
+
* jqPlot includes date instance methods and printf/sprintf functions by other authors:
|
|
16
|
+
*
|
|
17
|
+
* Date instance methods contained in jqplot.dateMethods.js:
|
|
18
|
+
*
|
|
19
|
+
* author Ken Snyder (ken d snyder at gmail dot com)
|
|
20
|
+
* date 2008-09-10
|
|
21
|
+
* version 2.0.2 (http://kendsnyder.com/sandbox/date/)
|
|
22
|
+
* license Creative Commons Attribution License 3.0 (http://creativecommons.org/licenses/by/3.0/)
|
|
23
|
+
*
|
|
24
|
+
* JavaScript printf/sprintf functions contained in jqplot.sprintf.js:
|
|
25
|
+
*
|
|
26
|
+
* version 2007.04.27
|
|
27
|
+
* author Ash Searle
|
|
28
|
+
* http://hexmen.com/blog/2007/03/printf-sprintf/
|
|
29
|
+
* http://hexmen.com/js/sprintf.js
|
|
30
|
+
* The author (Ash Searle) has placed this code in the public domain:
|
|
31
|
+
* "This code is unrestricted: you are free to use it however you like."
|
|
32
|
+
*
|
|
33
|
+
*/
|
|
34
|
+
(function(e){e.jqplot.PieRenderer=function(){e.jqplot.LineRenderer.call(this)};e.jqplot.PieRenderer.prototype=new e.jqplot.LineRenderer();e.jqplot.PieRenderer.prototype.constructor=e.jqplot.PieRenderer;e.jqplot.PieRenderer.prototype.init=function(p,t){this.diameter=null;this.padding=20;this.sliceMargin=0;this.fill=true;this.shadowOffset=2;this.shadowAlpha=0.07;this.shadowDepth=5;this.highlightMouseOver=true;this.highlightMouseDown=false;this.highlightColors=[];this.dataLabels="percent";this.showDataLabels=false;this.dataLabelFormatString=null;this.dataLabelThreshold=3;this.dataLabelPositionFactor=0.52;this.dataLabelNudge=2;this.dataLabelCenterOn=true;this.startAngle=0;this.tickRenderer=e.jqplot.PieTickRenderer;if(p.highlightMouseDown&&p.highlightMouseOver==null){p.highlightMouseOver=false}e.extend(true,this,p);if(this.diameter!=null){this.diameter=this.diameter-this.sliceMargin}this._diameter=null;this._radius=null;this._sliceAngles=[];this._highlightedPoint=null;if(this.highlightColors.length==0){for(var r=0;r<this.seriesColors.length;r++){var q=e.jqplot.getColorComponents(this.seriesColors[r]);var n=[q[0],q[1],q[2]];var s=n[0]+n[1]+n[2];for(var o=0;o<3;o++){n[o]=(s>570)?n[o]*0.8:n[o]+0.3*(255-n[o]);n[o]=parseInt(n[o],10)}this.highlightColors.push("rgb("+n[0]+","+n[1]+","+n[2]+")")}}this.highlightColorGenerator=new e.jqplot.ColorGenerator(this.highlightColors);t.postParseOptionsHooks.addOnce(l);t.postInitHooks.addOnce(g);t.eventListenerHooks.addOnce("jqplotMouseMove",a);t.eventListenerHooks.addOnce("jqplotMouseDown",b);t.eventListenerHooks.addOnce("jqplotMouseUp",k);t.eventListenerHooks.addOnce("jqplotClick",f);t.eventListenerHooks.addOnce("jqplotRightClick",m);t.postDrawHooks.addOnce(h)};e.jqplot.PieRenderer.prototype.setGridData=function(s){var o=[];var t=[];var n=this.startAngle/180*Math.PI;var r=0;for(var q=0;q<this.data.length;q++){o.push(this.data[q][1]);t.push([this.data[q][0]]);if(q>0){o[q]+=o[q-1]}r+=this.data[q][1]}var p=Math.PI*2/o[o.length-1];for(var q=0;q<o.length;q++){t[q][1]=o[q]*p;t[q][2]=this.data[q][1]/r}this.gridData=t};e.jqplot.PieRenderer.prototype.makeGridData=function(s,t){var o=[];var u=[];var r=0;var n=this.startAngle/180*Math.PI;for(var q=0;q<s.length;q++){o.push(s[q][1]);u.push([s[q][0]]);if(q>0){o[q]+=o[q-1]}r+=s[q][1]}var p=Math.PI*2/o[o.length-1];for(var q=0;q<o.length;q++){u[q][1]=o[q]*p;u[q][2]=s[q][1]/r}return u};e.jqplot.PieRenderer.prototype.drawSlice=function(x,v,u,p,s){var n=this._diameter/2;var w=this.fill;var t=this.lineWidth;x.save();x.translate(this._center[0],this._center[1]);x.translate(this.sliceMargin*Math.cos((v+u)/2),this.sliceMargin*Math.sin((v+u)/2));if(s){for(var q=0;q<this.shadowDepth;q++){x.save();x.translate(this.shadowOffset*Math.cos(this.shadowAngle/180*Math.PI),this.shadowOffset*Math.sin(this.shadowAngle/180*Math.PI));o()}}else{o()}function o(){if(u>6.282+this.startAngle){u=6.282+this.startAngle;if(v>u){v=6.281+this.startAngle}}if(v==u){return}x.beginPath();x.fillStyle=p;x.strokeStyle=p;x.lineWidth=t;x.arc(0,0,n,v,u,false);x.lineTo(0,0);x.closePath();if(w){x.fill()}else{x.stroke()}}if(s){for(var q=0;q<this.shadowDepth;q++){x.restore()}}x.restore()};e.jqplot.PieRenderer.prototype.draw=function(N,V,u,P){var Q;var K=(u!=undefined)?u:{};var s=0;var q=0;var v=1;var n=new e.jqplot.ColorGenerator(this.seriesColors);if(u.legendInfo&&u.legendInfo.placement=="insideGrid"){var J=u.legendInfo;switch(J.location){case"nw":s=J.width+J.xoffset;break;case"w":s=J.width+J.xoffset;break;case"sw":s=J.width+J.xoffset;break;case"ne":s=J.width+J.xoffset;v=-1;break;case"e":s=J.width+J.xoffset;v=-1;break;case"se":s=J.width+J.xoffset;v=-1;break;case"n":q=J.height+J.yoffset;break;case"s":q=J.height+J.yoffset;v=-1;break;default:break}}var C=(K.shadow!=undefined)?K.shadow:this.shadow;var W=(K.showLine!=undefined)?K.showLine:this.showLine;var O=(K.fill!=undefined)?K.fill:this.fill;var t=N.canvas.width;var I=N.canvas.height;var H=t-s-2*this.padding;var R=I-q-2*this.padding;var z=Math.min(H,R);var T=z;this._diameter=this.diameter||T-this.sliceMargin;var L=this._radius=this._diameter/2;var p=this.startAngle/180*Math.PI;this._center=[(t-v*s)/2+v*s,(I-v*q)/2+v*q];if(this.shadow){var M="rgba(0,0,0,"+this.shadowAlpha+")";for(var Q=0;Q<V.length;Q++){var B=(Q==0)?p:V[Q-1][1]+p;B+=this.sliceMargin/180*Math.PI;this.renderer.drawSlice.call(this,N,B,V[Q][1]+p,M,true)}}for(var Q=0;Q<V.length;Q++){var B=(Q==0)?p:V[Q-1][1]+p;B+=this.sliceMargin/180*Math.PI;var A=V[Q][1]+p;this._sliceAngles.push([B,A]);this.renderer.drawSlice.call(this,N,B,A,n.next(),false);if(this.showDataLabels&&V[Q][2]*100>=this.dataLabelThreshold){var S,U=(B+A)/2,D;if(this.dataLabels=="label"){S=this.dataLabelFormatString||"%s";D=e.jqplot.sprintf(S,V[Q][0])}else{if(this.dataLabels=="value"){S=this.dataLabelFormatString||"%d";D=e.jqplot.sprintf(S,V[Q][1])}else{if(this.dataLabels=="percent"){S=this.dataLabelFormatString||"%d%%";D=e.jqplot.sprintf(S,V[Q][2]*100)}else{if(this.dataLabels.constructor==Array){S=this.dataLabelFormatString||"%s";D=e.jqplot.sprintf(S,this.dataLabels[Q])}}}}var o=(this._radius)*this.dataLabelPositionFactor+this.sliceMargin+this.dataLabelNudge;var G=this._center[0]+Math.cos(U)*o+this.canvas._offsets.left;var F=this._center[1]+Math.sin(U)*o+this.canvas._offsets.top;var E=e('<div class="jqplot-pie-series jqplot-data-label" style="position:absolute;">'+D+"</div>").insertBefore(P.eventCanvas._elem);if(this.dataLabelCenterOn){G-=E.width()/2;F-=E.height()/2}else{G-=E.width()*Math.sin(U/2);F-=E.height()/2}G=Math.round(G);F=Math.round(F);E.css({left:G,top:F})}}};e.jqplot.PieAxisRenderer=function(){e.jqplot.LinearAxisRenderer.call(this)};e.jqplot.PieAxisRenderer.prototype=new e.jqplot.LinearAxisRenderer();e.jqplot.PieAxisRenderer.prototype.constructor=e.jqplot.PieAxisRenderer;e.jqplot.PieAxisRenderer.prototype.init=function(n){this.tickRenderer=e.jqplot.PieTickRenderer;e.extend(true,this,n);this._dataBounds={min:0,max:100};this.min=0;this.max=100;this.showTicks=false;this.ticks=[];this.showMark=false;this.show=false};e.jqplot.PieLegendRenderer=function(){e.jqplot.TableLegendRenderer.call(this)};e.jqplot.PieLegendRenderer.prototype=new e.jqplot.TableLegendRenderer();e.jqplot.PieLegendRenderer.prototype.constructor=e.jqplot.PieLegendRenderer;e.jqplot.PieLegendRenderer.prototype.init=function(n){this.numberRows=null;this.numberColumns=null;e.extend(true,this,n)};e.jqplot.PieLegendRenderer.prototype.draw=function(){var q=this;if(this.show){var y=this._series;var B="position:absolute;";B+=(this.background)?"background:"+this.background+";":"";B+=(this.border)?"border:"+this.border+";":"";B+=(this.fontSize)?"font-size:"+this.fontSize+";":"";B+=(this.fontFamily)?"font-family:"+this.fontFamily+";":"";B+=(this.textColor)?"color:"+this.textColor+";":"";B+=(this.marginTop!=null)?"margin-top:"+this.marginTop+";":"";B+=(this.marginBottom!=null)?"margin-bottom:"+this.marginBottom+";":"";B+=(this.marginLeft!=null)?"margin-left:"+this.marginLeft+";":"";B+=(this.marginRight!=null)?"margin-right:"+this.marginRight+";":"";this._elem=e('<table class="jqplot-table-legend" style="'+B+'"></table>');var F=false,x=false,n,v;var z=y[0];var o=new e.jqplot.ColorGenerator(z.seriesColors);if(z.show){var G=z.data;if(this.numberRows){n=this.numberRows;if(!this.numberColumns){v=Math.ceil(G.length/n)}else{v=this.numberColumns}}else{if(this.numberColumns){v=this.numberColumns;n=Math.ceil(G.length/this.numberColumns)}else{n=G.length;v=1}}var E,D,p,t,r,u,w,C;var A=0;for(E=0;E<n;E++){if(x){p=e('<tr class="jqplot-table-legend"></tr>').prependTo(this._elem)}else{p=e('<tr class="jqplot-table-legend"></tr>').appendTo(this._elem)}for(D=0;D<v;D++){if(A<G.length){u=this.labels[A]||G[A][0].toString();C=o.next();if(!x){if(E>0){F=true}else{F=false}}else{if(E==n-1){F=false}else{F=true}}w=(F)?this.rowSpacing:"0";t=e('<td class="jqplot-table-legend" style="text-align:center;padding-top:'+w+';"><div><div class="jqplot-table-legend-swatch" style="border-color:'+C+';"></div></div></td>');r=e('<td class="jqplot-table-legend" style="padding-top:'+w+';"></td>');if(this.escapeHtml){r.text(u)}else{r.html(u)}if(x){r.prependTo(p);t.prependTo(p)}else{t.appendTo(p);r.appendTo(p)}F=true}A++}}}}return this._elem};e.jqplot.PieRenderer.prototype.handleMove=function(p,o,s,r,q){if(r){var n=[r.seriesIndex,r.pointIndex,r.data];q.target.trigger("jqplotDataMouseOver",n);if(q.series[n[0]].highlightMouseOver&&!(n[0]==q.plugins.pieRenderer.highlightedSeriesIndex&&n[1]==q.series[n[0]]._highlightedPoint)){q.target.trigger("jqplotDataHighlight",n);d(q,n[0],n[1])}}else{if(r==null){j(q)}}};function c(r,q,o){o=o||{};o.axesDefaults=o.axesDefaults||{};o.legend=o.legend||{};o.seriesDefaults=o.seriesDefaults||{};var n=false;if(o.seriesDefaults.renderer==e.jqplot.PieRenderer){n=true}else{if(o.series){for(var p=0;p<o.series.length;p++){if(o.series[p].renderer==e.jqplot.PieRenderer){n=true}}}}if(n){o.axesDefaults.renderer=e.jqplot.PieAxisRenderer;o.legend.renderer=e.jqplot.PieLegendRenderer;o.legend.preDraw=true}}function g(p,o,n){for(i=0;i<this.series.length;i++){if(this.series[i].renderer.constructor==e.jqplot.PieRenderer){if(this.series[i].highlightMouseOver){this.series[i].highlightMouseDown=false}}}this.target.bind("mouseout",{plot:this},function(q){j(q.data.plot)})}function l(n){for(var o=0;o<this.series.length;o++){this.series[o].seriesColors=this.seriesColors;this.series[o].colorGenerator=this.colorGenerator}}function d(r,q,p){var o=r.series[q];var n=r.plugins.pieRenderer.highlightCanvas;n._ctx.clearRect(0,0,n._ctx.canvas.width,n._ctx.canvas.height);o._highlightedPoint=p;r.plugins.pieRenderer.highlightedSeriesIndex=q;o.renderer.drawSlice.call(o,n._ctx,o._sliceAngles[p][0],o._sliceAngles[p][1],o.highlightColorGenerator.get(p),false)}function j(p){var n=p.plugins.pieRenderer.highlightCanvas;n._ctx.clearRect(0,0,n._ctx.canvas.width,n._ctx.canvas.height);for(var o=0;o<p.series.length;o++){p.series[o]._highlightedPoint=null}p.plugins.pieRenderer.highlightedSeriesIndex=null;p.target.trigger("jqplotDataUnhighlight")}function a(r,q,u,t,s){if(t){var p=[t.seriesIndex,t.pointIndex,t.data];var o=jQuery.Event("jqplotDataMouseOver");o.pageX=r.pageX;o.pageY=r.pageY;s.target.trigger(o,p);if(s.series[p[0]].highlightMouseOver&&!(p[0]==s.plugins.pieRenderer.highlightedSeriesIndex&&p[1]==s.series[p[0]]._highlightedPoint)){var n=jQuery.Event("jqplotDataHighlight");n.pageX=r.pageX;n.pageY=r.pageY;s.target.trigger(n,p);d(s,p[0],p[1])}}else{if(t==null){j(s)}}}function b(q,p,t,s,r){if(s){var o=[s.seriesIndex,s.pointIndex,s.data];if(r.series[o[0]].highlightMouseDown&&!(o[0]==r.plugins.pieRenderer.highlightedSeriesIndex&&o[1]==r.series[o[0]]._highlightedPoint)){var n=jQuery.Event("jqplotDataHighlight");n.pageX=q.pageX;n.pageY=q.pageY;r.target.trigger(n,o);d(r,o[0],o[1])}}else{if(s==null){j(r)}}}function k(p,o,s,r,q){var n=q.plugins.pieRenderer.highlightedSeriesIndex;if(n!=null&&q.series[n].highlightMouseDown){j(q)}}function f(q,p,t,s,r){if(s){var o=[s.seriesIndex,s.pointIndex,s.data];var n=jQuery.Event("jqplotDataClick");n.pageX=q.pageX;n.pageY=q.pageY;r.target.trigger(n,o)}}function m(r,q,u,t,s){if(t){var p=[t.seriesIndex,t.pointIndex,t.data];var n=s.plugins.pieRenderer.highlightedSeriesIndex;if(n!=null&&s.series[n].highlightMouseDown){j(s)}var o=jQuery.Event("jqplotDataRightClick");o.pageX=r.pageX;o.pageY=r.pageY;s.target.trigger(o,p)}}function h(){this.plugins.pieRenderer={highlightedSeriesIndex:null};this.plugins.pieRenderer.highlightCanvas=new e.jqplot.GenericCanvas();var o=e(this.targetId+" .jqplot-data-label");if(o.length){e(o[0]).before(this.plugins.pieRenderer.highlightCanvas.createElement(this._gridPadding,"jqplot-pieRenderer-highlight-canvas",this._plotDimensions))}else{this.eventCanvas._elem.before(this.plugins.pieRenderer.highlightCanvas.createElement(this._gridPadding,"jqplot-pieRenderer-highlight-canvas",this._plotDimensions))}var n=this.plugins.pieRenderer.highlightCanvas.setContext()}e.jqplot.preInitHooks.push(c);e.jqplot.PieTickRenderer=function(){e.jqplot.AxisTickRenderer.call(this)};e.jqplot.PieTickRenderer.prototype=new e.jqplot.AxisTickRenderer();e.jqplot.PieTickRenderer.prototype.constructor=e.jqplot.PieTickRenderer})(jQuery);
|
|
@@ -0,0 +1,325 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Copyright (c) 2009 - 2010 Chris Leonello
|
|
3
|
+
* jqPlot is currently available for use in all personal or commercial projects
|
|
4
|
+
* under both the MIT and GPL version 2.0 licenses. This means that you can
|
|
5
|
+
* choose the license that best suits your project and use it accordingly.
|
|
6
|
+
*
|
|
7
|
+
* The author would appreciate an email letting him know of any substantial
|
|
8
|
+
* use of jqPlot. You can reach the author at: chris at jqplot dot com
|
|
9
|
+
* or see http://www.jqplot.com/info.php . This is, of course,
|
|
10
|
+
* not required.
|
|
11
|
+
*
|
|
12
|
+
* If you are feeling kind and generous, consider supporting the project by
|
|
13
|
+
* making a donation at: http://www.jqplot.com/donate.php .
|
|
14
|
+
*
|
|
15
|
+
* Thanks for using jqPlot!
|
|
16
|
+
*
|
|
17
|
+
*/
|
|
18
|
+
(function($) {
|
|
19
|
+
|
|
20
|
+
/**
|
|
21
|
+
* Class: $.jqplot.PointLabels
|
|
22
|
+
* Plugin for putting labels at the data points.
|
|
23
|
+
*
|
|
24
|
+
* To use this plugin, include the js
|
|
25
|
+
* file in your source:
|
|
26
|
+
*
|
|
27
|
+
* > <script type="text/javascript" src="plugins/jqplot.pointLabels.js"></script>
|
|
28
|
+
*
|
|
29
|
+
* By default, the last value in the data ponit array in the data series is used
|
|
30
|
+
* for the label. For most series renderers, extra data can be added to the
|
|
31
|
+
* data point arrays and the last value will be used as the label.
|
|
32
|
+
*
|
|
33
|
+
* For instance,
|
|
34
|
+
* this series:
|
|
35
|
+
*
|
|
36
|
+
* > [[1,4], [3,5], [7,2]]
|
|
37
|
+
*
|
|
38
|
+
* Would, by default, use the y values in the labels.
|
|
39
|
+
* Extra data can be added to the series like so:
|
|
40
|
+
*
|
|
41
|
+
* > [[1,4,'mid'], [3 5,'hi'], [7,2,'low']]
|
|
42
|
+
*
|
|
43
|
+
* And now the point labels would be 'mid', 'low', and 'hi'.
|
|
44
|
+
*
|
|
45
|
+
* Options to the point labels and a custom labels array can be passed into the
|
|
46
|
+
* "pointLabels" option on the series option like so:
|
|
47
|
+
*
|
|
48
|
+
* > series:[{pointLabels:{
|
|
49
|
+
* > labels:['mid', 'hi', 'low'],
|
|
50
|
+
* > location:'se',
|
|
51
|
+
* > ypadding: 12
|
|
52
|
+
* > }
|
|
53
|
+
* > }]
|
|
54
|
+
*
|
|
55
|
+
* A custom labels array in the options takes precendence over any labels
|
|
56
|
+
* in the series data. If you have a custom labels array in the options,
|
|
57
|
+
* but still want to use values from the series array as labels, set the
|
|
58
|
+
* "labelsFromSeries" option to true.
|
|
59
|
+
*
|
|
60
|
+
* By default, html entities (<, >, etc.) are escaped in point labels.
|
|
61
|
+
* If you want to include actual html markup in the labels,
|
|
62
|
+
* set the "escapeHTML" option to false.
|
|
63
|
+
*
|
|
64
|
+
*/
|
|
65
|
+
$.jqplot.PointLabels = function(options) {
|
|
66
|
+
// Group: Properties
|
|
67
|
+
//
|
|
68
|
+
// prop: show
|
|
69
|
+
// show the labels or not.
|
|
70
|
+
this.show = $.jqplot.config.enablePlugins;
|
|
71
|
+
// prop: location
|
|
72
|
+
// compass location where to position the label around the point.
|
|
73
|
+
// 'n', 'ne', 'e', 'se', 's', 'sw', 'w', 'nw'
|
|
74
|
+
this.location = 'n';
|
|
75
|
+
// prop: labelsFromSeries
|
|
76
|
+
// true to use labels within data point arrays.
|
|
77
|
+
this.labelsFromSeries = false;
|
|
78
|
+
// prop: seriesLabelIndex
|
|
79
|
+
// array index for location of labels within data point arrays.
|
|
80
|
+
// if null, will use the last element of the data point array.
|
|
81
|
+
this.seriesLabelIndex = null;
|
|
82
|
+
// prop: labels
|
|
83
|
+
// array of arrays of labels, one array for each series.
|
|
84
|
+
this.labels = [];
|
|
85
|
+
// actual labels that will get displayed.
|
|
86
|
+
// needed to preserve user specified labels in labels array.
|
|
87
|
+
this._labels = [];
|
|
88
|
+
// prop: stackedValue
|
|
89
|
+
// true to display value as stacked in a stacked plot.
|
|
90
|
+
// no effect if labels is specified.
|
|
91
|
+
this.stackedValue = false;
|
|
92
|
+
// prop: ypadding
|
|
93
|
+
// vertical padding in pixels between point and label
|
|
94
|
+
this.ypadding = 6;
|
|
95
|
+
// prop: xpadding
|
|
96
|
+
// horizontal padding in pixels between point and label
|
|
97
|
+
this.xpadding = 6;
|
|
98
|
+
// prop: escapeHTML
|
|
99
|
+
// true to escape html entities in the labels.
|
|
100
|
+
// If you want to include markup in the labels, set to false.
|
|
101
|
+
this.escapeHTML = true;
|
|
102
|
+
// prop: edgeTolerance
|
|
103
|
+
// Number of pixels that the label must be away from an axis
|
|
104
|
+
// boundary in order to be drawn. Negative values will allow overlap
|
|
105
|
+
// with the grid boundaries.
|
|
106
|
+
this.edgeTolerance = -5;
|
|
107
|
+
// prop: formatter
|
|
108
|
+
// A class of a formatter for the tick text. sprintf by default.
|
|
109
|
+
this.formatter = $.jqplot.DefaultTickFormatter;
|
|
110
|
+
// prop: formatString
|
|
111
|
+
// string passed to the formatter.
|
|
112
|
+
this.formatString = '';
|
|
113
|
+
// prop: hideZeros
|
|
114
|
+
// true to not show a label for a value which is 0.
|
|
115
|
+
this.hideZeros = false;
|
|
116
|
+
this._elems = [];
|
|
117
|
+
|
|
118
|
+
$.extend(true, this, options);
|
|
119
|
+
};
|
|
120
|
+
|
|
121
|
+
var locations = ['nw', 'n', 'ne', 'e', 'se', 's', 'sw', 'w'];
|
|
122
|
+
var locationIndicies = {'nw':0, 'n':1, 'ne':2, 'e':3, 'se':4, 's':5, 'sw':6, 'w':7};
|
|
123
|
+
var oppositeLocations = ['se', 's', 'sw', 'w', 'nw', 'n', 'ne', 'e'];
|
|
124
|
+
|
|
125
|
+
// called with scope of a series
|
|
126
|
+
$.jqplot.PointLabels.init = function (target, data, seriesDefaults, opts){
|
|
127
|
+
var options = $.extend(true, {}, seriesDefaults, opts);
|
|
128
|
+
options.pointLabels = options.pointLabels || {};
|
|
129
|
+
if (this.renderer.constructor == $.jqplot.BarRenderer && this.barDirection == 'horizontal' && !options.pointLabels.location) {
|
|
130
|
+
options.pointLabels.location = 'e';
|
|
131
|
+
}
|
|
132
|
+
// add a pointLabels attribute to the series plugins
|
|
133
|
+
this.plugins.pointLabels = new $.jqplot.PointLabels(options.pointLabels);
|
|
134
|
+
this.plugins.pointLabels.setLabels.call(this);
|
|
135
|
+
};
|
|
136
|
+
|
|
137
|
+
// called with scope of series
|
|
138
|
+
$.jqplot.PointLabels.prototype.setLabels = function() {
|
|
139
|
+
var p = this.plugins.pointLabels;
|
|
140
|
+
var labelIdx;
|
|
141
|
+
if (p.seriesLabelIndex != null) {
|
|
142
|
+
labelIdx = p.seriesLabelIndex;
|
|
143
|
+
}
|
|
144
|
+
else if (this.renderer.constructor == $.jqplot.BarRenderer && this.barDirection == 'horizontal') {
|
|
145
|
+
labelIdx = 0;
|
|
146
|
+
}
|
|
147
|
+
else {
|
|
148
|
+
labelIdx = this._plotData[0].length -1;
|
|
149
|
+
}
|
|
150
|
+
p._labels = [];
|
|
151
|
+
if (p.labels.length == 0 || p.labelsFromSeries) {
|
|
152
|
+
if (p.stackedValue) {
|
|
153
|
+
if (this._plotData.length && this._plotData[0].length){
|
|
154
|
+
// var idx = p.seriesLabelIndex || this._plotData[0].length -1;
|
|
155
|
+
for (var i=0; i<this._plotData.length; i++) {
|
|
156
|
+
p._labels.push(this._plotData[i][labelIdx]);
|
|
157
|
+
}
|
|
158
|
+
}
|
|
159
|
+
}
|
|
160
|
+
else {
|
|
161
|
+
var d = this.data;
|
|
162
|
+
if (this.renderer.constructor == $.jqplot.BarRenderer && this.waterfall) {
|
|
163
|
+
d = this._data;
|
|
164
|
+
}
|
|
165
|
+
if (d.length && d[0].length) {
|
|
166
|
+
// var idx = p.seriesLabelIndex || d[0].length -1;
|
|
167
|
+
for (var i=0; i<d.length; i++) {
|
|
168
|
+
p._labels.push(d[i][labelIdx]);
|
|
169
|
+
}
|
|
170
|
+
}
|
|
171
|
+
}
|
|
172
|
+
}
|
|
173
|
+
else if (p.labels.length){
|
|
174
|
+
p._labels = p.labels;
|
|
175
|
+
}
|
|
176
|
+
};
|
|
177
|
+
|
|
178
|
+
$.jqplot.PointLabels.prototype.xOffset = function(elem, location, padding) {
|
|
179
|
+
location = location || this.location;
|
|
180
|
+
padding = padding || this.xpadding;
|
|
181
|
+
var offset;
|
|
182
|
+
|
|
183
|
+
switch (location) {
|
|
184
|
+
case 'nw':
|
|
185
|
+
offset = -elem.outerWidth(true) - this.xpadding;
|
|
186
|
+
break;
|
|
187
|
+
case 'n':
|
|
188
|
+
offset = -elem.outerWidth(true)/2;
|
|
189
|
+
break;
|
|
190
|
+
case 'ne':
|
|
191
|
+
offset = this.xpadding;
|
|
192
|
+
break;
|
|
193
|
+
case 'e':
|
|
194
|
+
offset = this.xpadding;
|
|
195
|
+
break;
|
|
196
|
+
case 'se':
|
|
197
|
+
offset = this.xpadding;
|
|
198
|
+
break;
|
|
199
|
+
case 's':
|
|
200
|
+
offset = -elem.outerWidth(true)/2;
|
|
201
|
+
break;
|
|
202
|
+
case 'sw':
|
|
203
|
+
offset = -elem.outerWidth(true) - this.xpadding;
|
|
204
|
+
break;
|
|
205
|
+
case 'w':
|
|
206
|
+
offset = -elem.outerWidth(true) - this.xpadding;
|
|
207
|
+
break;
|
|
208
|
+
default: // same as 'nw'
|
|
209
|
+
offset = -elem.outerWidth(true) - this.xpadding;
|
|
210
|
+
break;
|
|
211
|
+
}
|
|
212
|
+
return offset;
|
|
213
|
+
};
|
|
214
|
+
|
|
215
|
+
$.jqplot.PointLabels.prototype.yOffset = function(elem, location, padding) {
|
|
216
|
+
location = location || this.location;
|
|
217
|
+
padding = padding || this.xpadding;
|
|
218
|
+
var offset;
|
|
219
|
+
|
|
220
|
+
switch (location) {
|
|
221
|
+
case 'nw':
|
|
222
|
+
offset = -elem.outerHeight(true) - this.ypadding;
|
|
223
|
+
break;
|
|
224
|
+
case 'n':
|
|
225
|
+
offset = -elem.outerHeight(true) - this.ypadding;
|
|
226
|
+
break;
|
|
227
|
+
case 'ne':
|
|
228
|
+
offset = -elem.outerHeight(true) - this.ypadding;
|
|
229
|
+
break;
|
|
230
|
+
case 'e':
|
|
231
|
+
offset = -elem.outerHeight(true)/2;
|
|
232
|
+
break;
|
|
233
|
+
case 'se':
|
|
234
|
+
offset = this.ypadding;
|
|
235
|
+
break;
|
|
236
|
+
case 's':
|
|
237
|
+
offset = this.ypadding;
|
|
238
|
+
break;
|
|
239
|
+
case 'sw':
|
|
240
|
+
offset = this.ypadding;
|
|
241
|
+
break;
|
|
242
|
+
case 'w':
|
|
243
|
+
offset = -elem.outerHeight(true)/2;
|
|
244
|
+
break;
|
|
245
|
+
default: // same as 'nw'
|
|
246
|
+
offset = -elem.outerHeight(true) - this.ypadding;
|
|
247
|
+
break;
|
|
248
|
+
}
|
|
249
|
+
return offset;
|
|
250
|
+
};
|
|
251
|
+
|
|
252
|
+
// called with scope of series
|
|
253
|
+
$.jqplot.PointLabels.draw = function (sctx, options) {
|
|
254
|
+
var p = this.plugins.pointLabels;
|
|
255
|
+
// set labels again in case they have changed.
|
|
256
|
+
p.setLabels.call(this);
|
|
257
|
+
// remove any previous labels
|
|
258
|
+
for (var i=0; i<p._elems.length; i++) {
|
|
259
|
+
p._elems[i].remove();
|
|
260
|
+
}
|
|
261
|
+
if (p.show) {
|
|
262
|
+
var ax = '_'+this._stackAxis+'axis';
|
|
263
|
+
|
|
264
|
+
if (!p.formatString) {
|
|
265
|
+
p.formatString = this[ax]._ticks[0].formatString;
|
|
266
|
+
p.formatter = this[ax]._ticks[0].formatter;
|
|
267
|
+
}
|
|
268
|
+
|
|
269
|
+
var pd = this._plotData;
|
|
270
|
+
var xax = this._xaxis;
|
|
271
|
+
var yax = this._yaxis;
|
|
272
|
+
|
|
273
|
+
for (var i=p._labels.length-1; i>=0; i--) {
|
|
274
|
+
var label = p._labels[i];
|
|
275
|
+
|
|
276
|
+
if (p.hideZeros && parseInt(p._labels[i], 10) == 0) {
|
|
277
|
+
label = '';
|
|
278
|
+
}
|
|
279
|
+
|
|
280
|
+
if (label != null) {
|
|
281
|
+
label = p.formatter(p.formatString, label);
|
|
282
|
+
}
|
|
283
|
+
var elem = $('<div class="jqplot-point-label jqplot-series-'+this.index+' jqplot-point-'+i+'" style="position:absolute"></div>');
|
|
284
|
+
elem.insertAfter(sctx.canvas);
|
|
285
|
+
p._elems.push(elem);
|
|
286
|
+
if (p.escapeHTML) {
|
|
287
|
+
elem.text(label);
|
|
288
|
+
}
|
|
289
|
+
else {
|
|
290
|
+
elem.html(label);
|
|
291
|
+
}
|
|
292
|
+
var location = p.location;
|
|
293
|
+
if (this.waterfall && parseInt(label, 10) < 0) {
|
|
294
|
+
location = oppositeLocations[locationIndicies[location]];
|
|
295
|
+
}
|
|
296
|
+
var ell = xax.u2p(pd[i][0]) + p.xOffset(elem, location);
|
|
297
|
+
var elt = yax.u2p(pd[i][1]) + p.yOffset(elem, location);
|
|
298
|
+
if (this.renderer.constructor == $.jqplot.BarRenderer) {
|
|
299
|
+
if (this.barDirection == "vertical") {
|
|
300
|
+
ell += this._barNudge;
|
|
301
|
+
}
|
|
302
|
+
else {
|
|
303
|
+
elt -= this._barNudge;
|
|
304
|
+
}
|
|
305
|
+
}
|
|
306
|
+
elem.css('left', ell);
|
|
307
|
+
elem.css('top', elt);
|
|
308
|
+
var elr = ell + $(elem).width();
|
|
309
|
+
var elb = elt + $(elem).height();
|
|
310
|
+
var et = p.edgeTolerance;
|
|
311
|
+
var scl = $(sctx.canvas).position().left;
|
|
312
|
+
var sct = $(sctx.canvas).position().top;
|
|
313
|
+
var scr = sctx.canvas.width + scl;
|
|
314
|
+
var scb = sctx.canvas.height + sct;
|
|
315
|
+
// if label is outside of allowed area, remove it
|
|
316
|
+
if (ell - et < scl || elt - et < sct || elr + et > scr || elb + et > scb) {
|
|
317
|
+
$(elem).detach();
|
|
318
|
+
}
|
|
319
|
+
}
|
|
320
|
+
}
|
|
321
|
+
};
|
|
322
|
+
|
|
323
|
+
$.jqplot.postSeriesInitHooks.push($.jqplot.PointLabels.init);
|
|
324
|
+
$.jqplot.postDrawSeriesHooks.push($.jqplot.PointLabels.draw);
|
|
325
|
+
})(jQuery);
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Copyright (c) 2009 - 2010 Chris Leonello
|
|
3
|
+
* jqPlot is currently available for use in all personal or commercial projects
|
|
4
|
+
* under both the MIT (http://www.opensource.org/licenses/mit-license.php) and GPL
|
|
5
|
+
* version 2.0 (http://www.gnu.org/licenses/gpl-2.0.html) licenses. This means that you can
|
|
6
|
+
* choose the license that best suits your project and use it accordingly.
|
|
7
|
+
*
|
|
8
|
+
* Although not required, the author would appreciate an email letting him
|
|
9
|
+
* know of any substantial use of jqPlot. You can reach the author at:
|
|
10
|
+
* chris at jqplot or see http://www.jqplot.com/info.php .
|
|
11
|
+
*
|
|
12
|
+
* If you are feeling kind and generous, consider supporting the project by
|
|
13
|
+
* making a donation at: http://www.jqplot.com/donate.php .
|
|
14
|
+
*
|
|
15
|
+
* jqPlot includes date instance methods and printf/sprintf functions by other authors:
|
|
16
|
+
*
|
|
17
|
+
* Date instance methods contained in jqplot.dateMethods.js:
|
|
18
|
+
*
|
|
19
|
+
* author Ken Snyder (ken d snyder at gmail dot com)
|
|
20
|
+
* date 2008-09-10
|
|
21
|
+
* version 2.0.2 (http://kendsnyder.com/sandbox/date/)
|
|
22
|
+
* license Creative Commons Attribution License 3.0 (http://creativecommons.org/licenses/by/3.0/)
|
|
23
|
+
*
|
|
24
|
+
* JavaScript printf/sprintf functions contained in jqplot.sprintf.js:
|
|
25
|
+
*
|
|
26
|
+
* version 2007.04.27
|
|
27
|
+
* author Ash Searle
|
|
28
|
+
* http://hexmen.com/blog/2007/03/printf-sprintf/
|
|
29
|
+
* http://hexmen.com/js/sprintf.js
|
|
30
|
+
* The author (Ash Searle) has placed this code in the public domain:
|
|
31
|
+
* "This code is unrestricted: you are free to use it however you like."
|
|
32
|
+
*
|
|
33
|
+
*/
|
|
34
|
+
(function(c){c.jqplot.PointLabels=function(e){this.show=c.jqplot.config.enablePlugins;this.location="n";this.labelsFromSeries=false;this.seriesLabelIndex=null;this.labels=[];this._labels=[];this.stackedValue=false;this.ypadding=6;this.xpadding=6;this.escapeHTML=true;this.edgeTolerance=-5;this.formatter=c.jqplot.DefaultTickFormatter;this.formatString="";this.hideZeros=false;this._elems=[];c.extend(true,this,e)};var a=["nw","n","ne","e","se","s","sw","w"];var d={nw:0,n:1,ne:2,e:3,se:4,s:5,sw:6,w:7};var b=["se","s","sw","w","nw","n","ne","e"];c.jqplot.PointLabels.init=function(i,h,f,g){var e=c.extend(true,{},f,g);e.pointLabels=e.pointLabels||{};if(this.renderer.constructor==c.jqplot.BarRenderer&&this.barDirection=="horizontal"&&!e.pointLabels.location){e.pointLabels.location="e"}this.plugins.pointLabels=new c.jqplot.PointLabels(e.pointLabels);this.plugins.pointLabels.setLabels.call(this)};c.jqplot.PointLabels.prototype.setLabels=function(){var f=this.plugins.pointLabels;var h;if(f.seriesLabelIndex!=null){h=f.seriesLabelIndex}else{if(this.renderer.constructor==c.jqplot.BarRenderer&&this.barDirection=="horizontal"){h=0}else{h=this._plotData[0].length-1}}f._labels=[];if(f.labels.length==0||f.labelsFromSeries){if(f.stackedValue){if(this._plotData.length&&this._plotData[0].length){for(var e=0;e<this._plotData.length;e++){f._labels.push(this._plotData[e][h])}}}else{var g=this.data;if(this.renderer.constructor==c.jqplot.BarRenderer&&this.waterfall){g=this._data}if(g.length&&g[0].length){for(var e=0;e<g.length;e++){f._labels.push(g[e][h])}}}}else{if(f.labels.length){f._labels=f.labels}}};c.jqplot.PointLabels.prototype.xOffset=function(f,e,g){e=e||this.location;g=g||this.xpadding;var h;switch(e){case"nw":h=-f.outerWidth(true)-this.xpadding;break;case"n":h=-f.outerWidth(true)/2;break;case"ne":h=this.xpadding;break;case"e":h=this.xpadding;break;case"se":h=this.xpadding;break;case"s":h=-f.outerWidth(true)/2;break;case"sw":h=-f.outerWidth(true)-this.xpadding;break;case"w":h=-f.outerWidth(true)-this.xpadding;break;default:h=-f.outerWidth(true)-this.xpadding;break}return h};c.jqplot.PointLabels.prototype.yOffset=function(f,e,g){e=e||this.location;g=g||this.xpadding;var h;switch(e){case"nw":h=-f.outerHeight(true)-this.ypadding;break;case"n":h=-f.outerHeight(true)-this.ypadding;break;case"ne":h=-f.outerHeight(true)-this.ypadding;break;case"e":h=-f.outerHeight(true)/2;break;case"se":h=this.ypadding;break;case"s":h=this.ypadding;break;case"sw":h=this.ypadding;break;case"w":h=-f.outerHeight(true)/2;break;default:h=-f.outerHeight(true)-this.ypadding;break}return h};c.jqplot.PointLabels.draw=function(t,h){var r=this.plugins.pointLabels;r.setLabels.call(this);for(var s=0;s<r._elems.length;s++){r._elems[s].remove()}if(r.show){var o="_"+this._stackAxis+"axis";if(!r.formatString){r.formatString=this[o]._ticks[0].formatString;r.formatter=this[o]._ticks[0].formatter}var z=this._plotData;var w=this._xaxis;var n=this._yaxis;for(var s=r._labels.length-1;s>=0;s--){var m=r._labels[s];if(r.hideZeros&&parseInt(r._labels[s],10)==0){m=""}if(m!=null){m=r.formatter(r.formatString,m)}var v=c('<div class="jqplot-point-label jqplot-series-'+this.index+" jqplot-point-"+s+'" style="position:absolute"></div>');v.insertAfter(t.canvas);r._elems.push(v);if(r.escapeHTML){v.text(m)}else{v.html(m)}var f=r.location;if(this.waterfall&&parseInt(m,10)<0){f=b[d[f]]}var l=w.u2p(z[s][0])+r.xOffset(v,f);var g=n.u2p(z[s][1])+r.yOffset(v,f);if(this.renderer.constructor==c.jqplot.BarRenderer){if(this.barDirection=="vertical"){l+=this._barNudge}else{g-=this._barNudge}}v.css("left",l);v.css("top",g);var j=l+c(v).width();var q=g+c(v).height();var y=r.edgeTolerance;var e=c(t.canvas).position().left;var u=c(t.canvas).position().top;var x=t.canvas.width+e;var k=t.canvas.height+u;if(l-y<e||g-y<u||j+y>x||q+y>k){c(v).detach()}}}};c.jqplot.postSeriesInitHooks.push(c.jqplot.PointLabels.init);c.jqplot.postDrawSeriesHooks.push(c.jqplot.PointLabels.draw)})(jQuery);
|
|
@@ -0,0 +1,208 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Copyright (c) 2009 - 2010 Chris Leonello
|
|
3
|
+
* jqPlot is currently available for use in all personal or commercial projects
|
|
4
|
+
* under both the MIT and GPL version 2.0 licenses. This means that you can
|
|
5
|
+
* choose the license that best suits your project and use it accordingly.
|
|
6
|
+
*
|
|
7
|
+
* The author would appreciate an email letting him know of any substantial
|
|
8
|
+
* use of jqPlot. You can reach the author at: chris at jqplot dot com
|
|
9
|
+
* or see http://www.jqplot.com/info.php . This is, of course,
|
|
10
|
+
* not required.
|
|
11
|
+
*
|
|
12
|
+
* If you are feeling kind and generous, consider supporting the project by
|
|
13
|
+
* making a donation at: http://www.jqplot.com/donate.php .
|
|
14
|
+
*
|
|
15
|
+
* Thanks for using jqPlot!
|
|
16
|
+
*
|
|
17
|
+
*/
|
|
18
|
+
(function($) {
|
|
19
|
+
|
|
20
|
+
/**
|
|
21
|
+
* Class: $.jqplot.Trendline
|
|
22
|
+
* Plugin which will automatically compute and draw trendlines for plotted data.
|
|
23
|
+
*/
|
|
24
|
+
$.jqplot.Trendline = function() {
|
|
25
|
+
// Group: Properties
|
|
26
|
+
|
|
27
|
+
// prop: show
|
|
28
|
+
// Wether or not to show the trend line.
|
|
29
|
+
this.show = $.jqplot.config.enablePlugins;
|
|
30
|
+
// prop: color
|
|
31
|
+
// CSS color spec for the trend line.
|
|
32
|
+
// By default this wil be the same color as the primary line.
|
|
33
|
+
this.color = '#666666';
|
|
34
|
+
// prop: renderer
|
|
35
|
+
// Renderer to use to draw the trend line.
|
|
36
|
+
// The data series that is plotted may not be rendered as a line.
|
|
37
|
+
// Therefore, we use our own line renderer here to draw a trend line.
|
|
38
|
+
this.renderer = new $.jqplot.LineRenderer();
|
|
39
|
+
// prop: rendererOptions
|
|
40
|
+
// Options to pass to the line renderer.
|
|
41
|
+
// By default, markers are not shown on trend lines.
|
|
42
|
+
this.rendererOptions = {marker:{show:false}};
|
|
43
|
+
// prop: label
|
|
44
|
+
// Label for the trend line to use in the legend.
|
|
45
|
+
this.label = '';
|
|
46
|
+
// prop: type
|
|
47
|
+
// Either 'exponential', 'exp', or 'linear'.
|
|
48
|
+
this.type = 'linear';
|
|
49
|
+
// prop: shadow
|
|
50
|
+
// true or false, wether or not to show the shadow.
|
|
51
|
+
this.shadow = true;
|
|
52
|
+
// prop: markerRenderer
|
|
53
|
+
// Renderer to use to draw markers on the line.
|
|
54
|
+
// I think this is wrong.
|
|
55
|
+
this.markerRenderer = {show:false};
|
|
56
|
+
// prop: lineWidth
|
|
57
|
+
// Width of the trend line.
|
|
58
|
+
this.lineWidth = 1.5;
|
|
59
|
+
// prop: shadowAngle
|
|
60
|
+
// Angle of the shadow on the trend line.
|
|
61
|
+
this.shadowAngle = 45;
|
|
62
|
+
// prop: shadowOffset
|
|
63
|
+
// pixel offset for each stroke of the shadow.
|
|
64
|
+
this.shadowOffset = 1.0;
|
|
65
|
+
// prop: shadowAlpha
|
|
66
|
+
// Alpha transparency of the shadow.
|
|
67
|
+
this.shadowAlpha = 0.07;
|
|
68
|
+
// prop: shadowDepth
|
|
69
|
+
// number of strokes to make of the shadow.
|
|
70
|
+
this.shadowDepth = 3;
|
|
71
|
+
this.isTrendline = true;
|
|
72
|
+
|
|
73
|
+
};
|
|
74
|
+
|
|
75
|
+
$.jqplot.postSeriesInitHooks.push(parseTrendLineOptions);
|
|
76
|
+
$.jqplot.postDrawSeriesHooks.push(drawTrendline);
|
|
77
|
+
$.jqplot.addLegendRowHooks.push(addTrendlineLegend);
|
|
78
|
+
|
|
79
|
+
// called witin scope of the legend object
|
|
80
|
+
// current series passed in
|
|
81
|
+
// must return null or an object {label:label, color:color}
|
|
82
|
+
function addTrendlineLegend(series) {
|
|
83
|
+
var lt = series.trendline.label.toString();
|
|
84
|
+
var ret = null;
|
|
85
|
+
if (this.renderer.constructor != $.jqplot.PieRenderer && series.trendline.show && lt) {
|
|
86
|
+
ret = {label:lt, color:series.trendline.color};
|
|
87
|
+
}
|
|
88
|
+
return ret;
|
|
89
|
+
}
|
|
90
|
+
|
|
91
|
+
// called within scope of a series
|
|
92
|
+
function parseTrendLineOptions (target, data, seriesDefaults, options, plot) {
|
|
93
|
+
if (this.renderer.constructor == $.jqplot.LineRenderer) {
|
|
94
|
+
this.trendline = new $.jqplot.Trendline();
|
|
95
|
+
options = options || {};
|
|
96
|
+
$.extend(true, this.trendline, {color:this.color}, seriesDefaults.trendline, options.trendline);
|
|
97
|
+
this.trendline.renderer.init.call(this.trendline, null);
|
|
98
|
+
}
|
|
99
|
+
}
|
|
100
|
+
|
|
101
|
+
// called within scope of series object
|
|
102
|
+
function drawTrendline(sctx, options) {
|
|
103
|
+
// if we have options, merge trendline options in with precedence
|
|
104
|
+
options = $.extend(true, {}, this.trendline, options);
|
|
105
|
+
|
|
106
|
+
if (options.show && this.renderer.constructor != $.jqplot.PieRenderer) {
|
|
107
|
+
var fit;
|
|
108
|
+
// this.renderer.setGridData.call(this);
|
|
109
|
+
var data = options.data || this.data;
|
|
110
|
+
fit = fitData(data, this.trendline.type);
|
|
111
|
+
var gridData = options.gridData || this.renderer.makeGridData.call(this, fit.data);
|
|
112
|
+
this.trendline.renderer.draw.call(this.trendline, sctx, gridData, {showLine:true, shadow:this.trendline.shadow});
|
|
113
|
+
}
|
|
114
|
+
}
|
|
115
|
+
|
|
116
|
+
function regression(x, y, typ) {
|
|
117
|
+
var type = (typ == null) ? 'linear' : typ;
|
|
118
|
+
var N = x.length;
|
|
119
|
+
var slope;
|
|
120
|
+
var intercept;
|
|
121
|
+
var SX = 0;
|
|
122
|
+
var SY = 0;
|
|
123
|
+
var SXX = 0;
|
|
124
|
+
var SXY = 0;
|
|
125
|
+
var SYY = 0;
|
|
126
|
+
var Y = [];
|
|
127
|
+
var X = [];
|
|
128
|
+
|
|
129
|
+
if (type == 'linear') {
|
|
130
|
+
X = x;
|
|
131
|
+
Y = y;
|
|
132
|
+
}
|
|
133
|
+
else if (type == 'exp' || type == 'exponential') {
|
|
134
|
+
for ( var i=0; i<y.length; i++) {
|
|
135
|
+
// ignore points <= 0, log undefined.
|
|
136
|
+
if (y[i] <= 0) {
|
|
137
|
+
N--;
|
|
138
|
+
}
|
|
139
|
+
else {
|
|
140
|
+
X.push(x[i]);
|
|
141
|
+
Y.push(Math.log(y[i]));
|
|
142
|
+
}
|
|
143
|
+
}
|
|
144
|
+
}
|
|
145
|
+
|
|
146
|
+
for ( var i = 0; i < N; i++) {
|
|
147
|
+
SX = SX + X[i];
|
|
148
|
+
SY = SY + Y[i];
|
|
149
|
+
SXY = SXY + X[i]* Y[i];
|
|
150
|
+
SXX = SXX + X[i]* X[i];
|
|
151
|
+
SYY = SYY + Y[i]* Y[i];
|
|
152
|
+
}
|
|
153
|
+
|
|
154
|
+
slope = (N*SXY - SX*SY)/(N*SXX - SX*SX);
|
|
155
|
+
intercept = (SY - slope*SX)/N;
|
|
156
|
+
|
|
157
|
+
return [slope, intercept];
|
|
158
|
+
}
|
|
159
|
+
|
|
160
|
+
function linearRegression(X,Y) {
|
|
161
|
+
var ret;
|
|
162
|
+
ret = regression(X,Y,'linear');
|
|
163
|
+
return [ret[0],ret[1]];
|
|
164
|
+
}
|
|
165
|
+
|
|
166
|
+
function expRegression(X,Y) {
|
|
167
|
+
var ret;
|
|
168
|
+
var x = X;
|
|
169
|
+
var y = Y;
|
|
170
|
+
ret = regression(x, y,'exp');
|
|
171
|
+
var base = Math.exp(ret[0]);
|
|
172
|
+
var coeff = Math.exp(ret[1]);
|
|
173
|
+
return [base, coeff];
|
|
174
|
+
}
|
|
175
|
+
|
|
176
|
+
function fitData(data, typ) {
|
|
177
|
+
var type = (typ == null) ? 'linear' : typ;
|
|
178
|
+
var ret;
|
|
179
|
+
var res;
|
|
180
|
+
var x = [];
|
|
181
|
+
var y = [];
|
|
182
|
+
var ypred = [];
|
|
183
|
+
|
|
184
|
+
for (i=0; i<data.length; i++){
|
|
185
|
+
if (data[i] != null && data[i][0] != null && data[i][1] != null) {
|
|
186
|
+
x.push(data[i][0]);
|
|
187
|
+
y.push(data[i][1]);
|
|
188
|
+
}
|
|
189
|
+
}
|
|
190
|
+
|
|
191
|
+
if (type == 'linear') {
|
|
192
|
+
ret = linearRegression(x,y);
|
|
193
|
+
for ( var i=0; i<x.length; i++){
|
|
194
|
+
res = ret[0]*x[i] + ret[1];
|
|
195
|
+
ypred.push([x[i], res]);
|
|
196
|
+
}
|
|
197
|
+
}
|
|
198
|
+
else if (type == 'exp' || type == 'exponential') {
|
|
199
|
+
ret = expRegression(x,y);
|
|
200
|
+
for ( var i=0; i<x.length; i++){
|
|
201
|
+
res = ret[1]*Math.pow(ret[0],x[i]);
|
|
202
|
+
ypred.push([x[i], res]);
|
|
203
|
+
}
|
|
204
|
+
}
|
|
205
|
+
return {data: ypred, slope: ret[0], intercept: ret[1]};
|
|
206
|
+
}
|
|
207
|
+
|
|
208
|
+
})(jQuery);
|