From 1d7bdff0ebdadaa1fbc8d5c149a57ced61ce5792 Mon Sep 17 00:00:00 2001 From: Christophe Dervieux Date: Sat, 4 Mar 2017 12:13:07 +0100 Subject: [PATCH 1/4] yaml for site with url --- _pkgdown.yml | 49 +++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 49 insertions(+) create mode 100644 _pkgdown.yml diff --git a/_pkgdown.yml b/_pkgdown.yml new file mode 100644 index 0000000..7018a73 --- /dev/null +++ b/_pkgdown.yml @@ -0,0 +1,49 @@ +templates: + params: + bootswatch: flatly + +authors: + RTE: + href: http://www.rte-france.com + html: + +reference: +- title: ManipulateGadget + desc: > + Main description and help content of this package. + What is a manipultateWidget and how to create it ? + contents: + - manipulateWidget-package + - manipulateWidget + +- title: combining widget + desc: > + These function are the one for combining widget alltogether + contents: + - combineWidgets-shiny + - combineWidgets + +- title: Add interactive component a manipulateGagdet + desc: > + These fonction are the way to add interactive content to + complement your initial htmlwidget + contents: + - starts_with("mw") + +navbar: + title: ~ + type: default + left: + - text: Home + href: index.html + - text: Reference + href: reference/index.html + - text: Getting Started + href: articles/manipulateWidgets.html + - text: News + menu: + - text: "Change Log" + href: news/index.html + right: + - icon: fa-github + href: https://github.com/rte-antares-rpackage/manipulateWidget From 927366a6835321c230fae8b6441c324777821a8e Mon Sep 17 00:00:00 2001 From: Christophe Dervieux Date: Sat, 4 Mar 2017 12:21:39 +0100 Subject: [PATCH 2/4] need always_allow_html for github markodwn --- README.Rmd | 1 + README.md | 4 +++- 2 files changed, 4 insertions(+), 1 deletion(-) diff --git a/README.Rmd b/README.Rmd index 6651bac..0b5cae4 100644 --- a/README.Rmd +++ b/README.Rmd @@ -1,6 +1,7 @@ --- title: "Add more interactivity to interactive charts" output: github_document +always_allow_html: yes --- ```{r setup, include=FALSE} diff --git a/README.md b/README.md index e5383a8..7e2edc6 100644 --- a/README.md +++ b/README.md @@ -54,8 +54,10 @@ plotClusters <- function(xvar, yvar, nclusters) { plotClusters("Sepal.Width", "Sepal.Length", 3) ``` -![](README_files/figure-markdown_github/kmeans-1.png) + + + Once this code has been written, it is very easy to produce a UI that lets the user change the values of the three parameters of the function `plotClusters`: ``` r From 53f81e834ff5c5bf102a69cf9e13544d73abd56d Mon Sep 17 00:00:00 2001 From: Christophe Dervieux Date: Sat, 4 Mar 2017 12:26:28 +0100 Subject: [PATCH 3/4] add RTE as funder --- DESCRIPTION | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/DESCRIPTION b/DESCRIPTION index 5edbe1d..91cfa54 100644 --- a/DESCRIPTION +++ b/DESCRIPTION @@ -5,7 +5,7 @@ Version: 0.5.1 Date: 2017-01-23 Authors@R: c( person("Francois", "Guillem", email = "francois.guillem@rte-france.com", role = c("aut", "cre")), - person("RTE", role = "cph"), + person("RTE", role = c("cph", "fnd")), person("JJ", "Allaire", role = "ctb") ) Description: Like package 'manipulate' does for static graphics, this package From 653869db25feb2bd5fea114564392d7dedb06e94 Mon Sep 17 00:00:00 2001 From: Christophe Dervieux Date: Sat, 4 Mar 2017 12:26:56 +0100 Subject: [PATCH 4/4] build site --- docs/LICENSE | 1 + docs/articles/comparison.gif | Bin 0 -> 169145 bytes docs/articles/conditional-inputs.gif | Bin 0 -> 132452 bytes docs/articles/dynamic_inputs.gif | Bin 0 -> 166361 bytes docs/articles/example-kmeans.gif | Bin 0 -> 211271 bytes docs/articles/fancy-example.gif | Bin 0 -> 228476 bytes docs/articles/groups-inputs.gif | Bin 0 -> 63997 bytes docs/articles/index.html | 119 + docs/articles/manipulateWidgets.html | 321 + .../combineWidgetStyle-0.1/combineWidgets.css | 67 + .../combineWidgetStyle-0.1/combineWidgets.js | 68 + .../combineWidgets.yaml | 7 + .../combineWidgets.js | 68 + .../dygraphs-1.1.1/dygraph-combined-dev.js | 12172 ++++++++++++++++ .../dygraphs-1.1.1/dygraph-combined.js | 6 + .../dygraphs-1.1.1/dygraph.css | 8 + .../dygraphs-binding-1.1.1.4/dygraphs.js | 769 + .../htmlwidgets-0.8/htmlwidgets.js | 836 ++ .../jquery-1.11.1/AUTHORS.txt | 217 + .../jquery-1.11.1/jquery.min.js | 4 + .../moment-2.8.4/moment-timezone-with-data.js | 990 ++ .../moment-2.8.4/moment.js | 2936 ++++ .../moment-fquarter.min.js | 1 + .../moment-timezone-with-data.js | 990 ++ .../moment-timezone-0.2.5/moment.js | 2936 ++++ docs/articles/update-widget.gif | Bin 0 -> 663652 bytes docs/authors.html | 128 + docs/index.html | 208 + .../htmlwidgets-0.8/htmlwidgets.js | 836 ++ .../plotly-binding-4.5.6/plotly.js | 103 + docs/index_files/plotlyjs-1.16.3/LICENSE | 21 + .../plotlyjs-1.16.3/plotly-htmlwidgets.css | 9 + .../plotlyjs-1.16.3/plotly-latest.min.js | 61 + docs/jquery.sticky-kit.min.js | 9 + docs/link.svg | 12 + docs/news/index.html | 219 + docs/pkgdown.css | 113 + docs/pkgdown.js | 8 + docs/reference/combineWidgets-shiny.html | 145 + docs/reference/combineWidgets.html | 279 + docs/reference/index.html | 213 + docs/reference/manipulateWidget-package.html | 188 + docs/reference/manipulateWidget.html | 345 + docs/reference/mwCheckbox.html | 166 + docs/reference/mwCheckboxGroup.html | 170 + docs/reference/mwControlsUI.html | 148 + docs/reference/mwDate.html | 164 + docs/reference/mwDateRange.html | 165 + docs/reference/mwNumeric.html | 165 + docs/reference/mwPassword.html | 169 + docs/reference/mwRadio.html | 169 + docs/reference/mwSelect.html | 186 + docs/reference/mwSlider.html | 180 + docs/reference/mwText.html | 164 + docs/reference/mwUI.html | 201 + docs/reference/staticPlot.html | 173 + 56 files changed, 27633 insertions(+) create mode 100644 docs/LICENSE create mode 100644 docs/articles/comparison.gif create mode 100644 docs/articles/conditional-inputs.gif create mode 100644 docs/articles/dynamic_inputs.gif create mode 100644 docs/articles/example-kmeans.gif create mode 100644 docs/articles/fancy-example.gif create mode 100644 docs/articles/groups-inputs.gif create mode 100644 docs/articles/index.html create mode 100644 docs/articles/manipulateWidgets.html create mode 100644 docs/articles/manipulateWidgets_files/combineWidgetStyle-0.1/combineWidgets.css create mode 100644 docs/articles/manipulateWidgets_files/combineWidgetStyle-0.1/combineWidgets.js create mode 100644 docs/articles/manipulateWidgets_files/combineWidgetStyle-0.1/combineWidgets.yaml create mode 100644 docs/articles/manipulateWidgets_files/combineWidgets-binding-0.5.1/combineWidgets.js create mode 100644 docs/articles/manipulateWidgets_files/dygraphs-1.1.1/dygraph-combined-dev.js create mode 100644 docs/articles/manipulateWidgets_files/dygraphs-1.1.1/dygraph-combined.js create mode 100644 docs/articles/manipulateWidgets_files/dygraphs-1.1.1/dygraph.css create mode 100644 docs/articles/manipulateWidgets_files/dygraphs-binding-1.1.1.4/dygraphs.js create mode 100644 docs/articles/manipulateWidgets_files/htmlwidgets-0.8/htmlwidgets.js create mode 100644 docs/articles/manipulateWidgets_files/jquery-1.11.1/AUTHORS.txt create mode 100644 docs/articles/manipulateWidgets_files/jquery-1.11.1/jquery.min.js create mode 100644 docs/articles/manipulateWidgets_files/moment-2.8.4/moment-timezone-with-data.js create mode 100644 docs/articles/manipulateWidgets_files/moment-2.8.4/moment.js create mode 100644 docs/articles/manipulateWidgets_files/moment-fquarter-1.0.0/moment-fquarter.min.js create mode 100644 docs/articles/manipulateWidgets_files/moment-timezone-0.2.5/moment-timezone-with-data.js create mode 100644 docs/articles/manipulateWidgets_files/moment-timezone-0.2.5/moment.js create mode 100644 docs/articles/update-widget.gif create mode 100644 docs/authors.html create mode 100644 docs/index.html create mode 100644 docs/index_files/htmlwidgets-0.8/htmlwidgets.js create mode 100644 docs/index_files/plotly-binding-4.5.6/plotly.js create mode 100644 docs/index_files/plotlyjs-1.16.3/LICENSE create mode 100644 docs/index_files/plotlyjs-1.16.3/plotly-htmlwidgets.css create mode 100644 docs/index_files/plotlyjs-1.16.3/plotly-latest.min.js create mode 100644 docs/jquery.sticky-kit.min.js create mode 100644 docs/link.svg create mode 100644 docs/news/index.html create mode 100644 docs/pkgdown.css create mode 100644 docs/pkgdown.js create mode 100644 docs/reference/combineWidgets-shiny.html create mode 100644 docs/reference/combineWidgets.html create mode 100644 docs/reference/index.html create mode 100644 docs/reference/manipulateWidget-package.html create mode 100644 docs/reference/manipulateWidget.html create mode 100644 docs/reference/mwCheckbox.html create mode 100644 docs/reference/mwCheckboxGroup.html create mode 100644 docs/reference/mwControlsUI.html create mode 100644 docs/reference/mwDate.html create mode 100644 docs/reference/mwDateRange.html create mode 100644 docs/reference/mwNumeric.html create mode 100644 docs/reference/mwPassword.html create mode 100644 docs/reference/mwRadio.html create mode 100644 docs/reference/mwSelect.html create mode 100644 docs/reference/mwSlider.html create mode 100644 docs/reference/mwText.html create mode 100644 docs/reference/mwUI.html create mode 100644 docs/reference/staticPlot.html diff --git a/docs/LICENSE b/docs/LICENSE new file mode 100644 index 0000000..a7d6e13 --- /dev/null +++ b/docs/LICENSE @@ -0,0 +1 @@ +COPYRIGHT HOLDER: RTE Réseau de transport d’électricité diff --git a/docs/articles/comparison.gif b/docs/articles/comparison.gif new file mode 100644 index 0000000000000000000000000000000000000000..2f6c701a7b1e7f547894928bd0a9a09f19bf3cc7 GIT binary patch literal 169145 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

    7mB8`4LJs|RCK*IjJu?s>I~+^D&9l_*frY4&Sd z30Y*Rac?1snR;)jr;f}dCN=T`; zm85CoTJ(tpa0rZDTNLTJmlm{9NKu-=Z+`nCVmeAcxc4&tq{Xx8sc})zo*#~2Lflff zX%U*@b;n|fX?qEblKLp(!)25hIyO|9bXh6)=@|)OWNsmhyiL5@xunBNq{6hs)gJfSWleKda(zkOe8kCi@ zQ=Oui)dcFyh%93Kk6>*Gi@~OBK^Ot$L~$}IR*SerJe4F1vEnh~*&Ib$q){WDU0BDW zk6DTjK|-yAxp@WQ6cv|M`jkVQz^L3r2u4b>GSt$`=l3YhS3~mu*#uB z@0X;bvld^Yr0$rKxfXrhe4*yBFf#7iemi1!Z=%|Z-s(dO~0&> z>+S8`>5K9GX-&d%K$uokxmn9g`K0Y2Cx)+GXM9OjloX*;BJS+Vv#m6KRSb!6Od`XR zkREnLIUrds(9t6ljl-C>sIYS8cpStfF_KCSS z-Uz=^R-k>4V#-025DNDt@|!g$RXzh1eNJ@^cv z%4%%xK4`CWeu8 z`@>N-Nf^368_j=JD4`eu1s$Flq4q(!fkFx86^l$9z|4ae;NBM96QYcB4p74d^p->W?_>F+&#IW;4 zg}eVMl$MwG5U@AvZ4`Z~50jfyBW@s6DUm4AEo-%QOb8YIX?Y_|fu*h&Ck5YyQicRS zq%2vCOITi-GB-!w&F-(&2}nMz%T@))!@Rs`nT}uVqm2{vNo78#g~2i_lag3d(c@_2 zh}1}L6YZ0X!sJ}`J4jhajN$Z9N+ToVbhLK&{2WSzI51>tji8PN1Zg1&EhnVS2RKa1^o>Z+YH~fDYg$jvekuto0|C^wbfj<4l?;=OJYlC@Y!6GLoWj zQN~e7_h?$?ZDBL_14uREZt49QVb}u84#swVP7{m=`inucc?luG-y2Ob!i2a=Hv85C z#ejR_Wj#mEd5)3;JAM$+M6QH4+AsGEkLaLNx?o4cy5Npt(SPKDCSw)$bY$Se<8Nd# zS`h9}lU&1*2^EvExiB1q(E&yehuS}Ee3gluONy58kmT)acanV!?igDnABK*Ea+LQR zDIL89lEmOR{%NSj&!?9WhfU1zNExG(FYL*xSdZRerov#6#~uGCA6}f>LZjm_W=zouojH465yQ+{fqs z3cKyjg+b^O>klXUBE{qQkhby`*sHu>Z{SGK=(_VL&Z={%@tvtny7ET6>XD_I_W(NBE%#w5|i zLGK}VngT}aGeknCgs|ttQ+YzkZs4Dq9X4AyVT@2Jy-loRg!IOE7`wPr?z0*=ixjd5 zL)xGyb+fUI+l+lgoVHSJzF+Aq5c)^~{Dm}xsa6}F=ZUkmGB;mY4(6EDmasA#j<&Ol zjFXl}O#r8>To|!E=}CNu2+w?%g5}4QGI3H^1(KN)#7u?z-XHrJ+UsVUCAdj3k+EV_ z)_5&jA_PkJ9=!oln}u(%pHybvs2zFGj8mHQ;FIGWbP8RZ1ZvZ}TW_hcb;1~uq-Q$c z(dW+E5}2%gQk)lg&P}w7k&?Z7k>5&2>y?9_x$~J{{0I42Va3d%hYcSEDqp6yKCgs z+;=gs#OjC%td`jbWLl4Hp<9a~u(q{Y|_YvHeVFxJX!7=wL5q7cJ0v+;U}m@2=6VJa+7r%}fF+O?=Q zZVzutS9&8HesXH~wZlHEpqMvRBuLS1r{qBWuU!Lg?>d*4%5OFgz4thOaK=_dJMd0F zf2&|bipHxu68ifMM+i?}*jHUmGEvY`*AsadgE908SVJzi+K&6;5}JiXu6mFRVV-J zCJ4A(|ATMFzd!8nSKy!Q75K~j`fnm(ZH?|-QSv!>NT&duH(ud+1gl}?*pa9ia7@ug zU{fzn>*?{+$=*_W*R`TfA45$^=N@i~XSvd$^rm34DOTvzkkxU~sir{jcy9fG&g8Rk zC+|uAlvzu!dZF8X=P=t-&hALXV8hJR?sS8=dtb6H$P@|my`x0lBGxKOH7+vUS)$T1 z{HFh2OL-zQedG3*Lak$Wd956|Cf>&!eLj1u_nvv~8O2M6fg9pu?Gl2_Yc9pB<~2qJ zdWA0H-)8E08)GJ14eeC=xq_dSACxXO8}*yxZWj0?eQ(4y^7^?`l8&pN<&A}euFD_1 zvpisaA=LLmr;I^eZhLL>Pt*6>Pv@2$S`TrY+R5A@=`+2BVzM-Is`$-?C5JbG02<|i zM8UA$H$5XqSKsWP?0xa~xAXTa@E?2y&?E>V1p1eU`!8bDul15JV*^zLrfYl8FR-*? z8$K&c*FYWG#c{0f4#;5S208%D*kGk0Oszl&+MSkdZh|}lk329}gBe;>R1^%-c2_HX z-_5MT91dn?u%-x}gLd~eZEu5S0#mNtjY>bZC+C0cj@f?v1myu{X`7o{Fpz_J8)y-` zLp4yAc6LBN0eu4|YOv`M26&6B|6hCO8Prt2uKfU^N=u*$sIa7J9l??16ws0URKNa{_x^vs_V0WL{`u#s7t0TC zaLt*YC(<(=)k_9SFfehkx=5k^K}=>IlR@Ts4q}*M6pGHD(T^)+)VUZ7*fZ(JL@qfG zIyRDG?jvIb?YUZNiS)wm{8EU8%E?q$9n&(6X+RJgh3jZ9=p{3zibsKAow$by%I3DU zR*mi;BYGBk<*i!RC+|C%c;?Ez})d5@;A36W+q^k_AFdE!gvH5{G4 zUU#;nkmqqE(SeUn1BB|Z?}Of_6Gi)Gmnsp#@`{I7$1HP9VsI>iKAeykd6rYwgUA3B z*)NTYNhKK{10os@r0 zMVwI-L;e#tEm%A%5n`P@D!q-k4-Flo^WT6F^0gx!mgai;c+0%1@tG$ zfMS(}O|uz8_VzDF>#91Ut{jiL2IBHqo-UOSB)ewS3yN z7(DD)-mUX$lleF5z&4q)ie(GAGfa0j+oWc_F-!VDQcO=` zP%ok~JMjsN1dnVsz2SULb~=GBo72oxu<01{VC4~ckpXrV%*#?GBO3rxNVm;TR~eMB z3(vmL)Ff7aXBp`(YXKtL7PQ@|;_pJea`_)Wg_iJNJB20&sWUY(f1O+Wty0FS&fH=6 zbwS6sD&>qiOK#e5yiluh!J+k!|7dRJF!l9V+9I zeNFMO&>Sf0pNl`)|C^9G^>2SPUJ0*sy7IJqp1dqZRytT(%3Dg}vV@q8n23?carkk5 zMSh->JRBk%?0oEOTx{%I>|A_Y0)hgvNSWcGB>uiFtM>T zMFC@FW{vA!`?NX4ZbFlZ-;Oid2w{8aA4hjf~@C%K)5gO+m zn&1|a;uw-;6M{7g!D)om$fN5e(M{rE&0=9KKvEib6+=H4M?aScZT3+IBKt5||t5y7W~ z;9o`vx!-g5;fv&&uG}YGz_GvwP2IK6yX)J!8{2!D+lkLR`dT{&S~~|@yM~^3y=v(m zYwn(Cd@=p3=iSqu*+)GeYI_!|dX_5*pB@s{fT<)NO%-vix_7mP^r^OQ<9-v<^tfLRg3zgKQyI`Rzp@V z#IE^mEIQ=4sND!4n%$-OzmxYu7q!o*wYhfrO;5%0GPeb|-DH|Q?y_$Gz9)2pGIo=> z<+EPY^57Z+P#>rplxAQjkKa5sHd%Z1QcKcl=k^iG${t@)=qmH zMO_K3=(zYM^ZN7Z3ljZ7$;<*5O*RAECjvMQf0#TiA%#vqI()4#IPTHCPy{C-wDc$VET2=MqMt{z*=p2#F*^;^~}X=4T0B5 zd3SjONmg2>agv!9-c{KJm%-eQoX#J%CUJ;edyJJj@7;6a*8Hs!HtF;BlUA7bArD7w zc)6;_v=4s<*@R4RRl?xkmx{b21@?BW)HW-Xoiyi4cllM}Hzto8t?$vw_4WrP*DCY) z)w#4cj#op|y|vpd@)^0oh4AT+HV$WJ>ptl15ryV-^~1|+JP+X%g&~NlMJOrbiMVZ0 zrq=nPU8rgZw34E3dg|3DgTwV*i29fOV3g*nC!2%nI@tXD^GyEGY|T&c^7V)%w$KT9 z+BM0nD$ob|DrInW(3pk&UsQIg>8=(jzU?JP*r?xPN~cE4NjF6W$=n^f^!xGLD|hI#_$D)MK=QlgvVFmgZ%4ZO&(9B4~tKy8fjHeF!qfZ0l^-eR8tego9#?+xTNSp z?Mv;Z#;hn_Nil}&Mqc@G*~ylb5&}bm#u|Tc(9&i@=9hPJu_ONwCDsu;c{uhe856T% zTL1@LYgr}dFf@FzW9ME&dX<8=*{jPlI|cZWD#fs&e-R~ejVFFsRG%#z8o8!3jumfA zlB_lxy>WTBc&ZevgOlZsbWYx7f6?RU?U`tTVJ38)~C)x z$8N=`56h*koIG`zT*B?iUxti_^Gr-e>yT>V#U7o{F}LxeHP=~-BY0u zSBjODKIO!U=PnT2ajo&{M^Iix1U2I}6x=q5$*+t5frGw&a(e>lC!P31`7rSh4mz}T zcI&<9)yQ`T+pTTeKTZd{l%89#euf{=K6X3LDQ5!?;GjbkgOs@6e>M;6m}#sJX%xy` zzWw%`#`mudz49(mIc;6R2&D**$`5;AYrDVxzc}dc`#m6NLkzR!JiQQ&z+&AHConS4 zq)8)kW;Osg=mj<>S}$y@AyIu~0UAjoi9s8aO)M9=OK5#E){UtSBa8f%y#*4Y`Q$f9c+3<>`mU-jARO{IP%8+(qvNXh;J_aK@EcGe7p2UxR^g zZ+3z^DVE%&=2zD|pJKP_CK|+&D5B%Wtd!jgtqCBBT0UUD5Kny5xU$k>M)bWpLI>-= zh&f?@p85QUIPdM%;FhG$uc5CN-r|(|yEa{!)#sf)t|hLt=<4}JP>8UQ)p*%nRB8mt zZ7v+uFGL=_VdqW95zdk*Y&sW{q=}6^=1(vX>Dvm_S}LL9)l?re&!-iB5nSmmKnOJ9 znAPTlXIRx&s-}_ODujNmntoId__YA>h5uSZWpzxw6dRhQTUtlk+Xh{}aMQ)X%gw>f{gSJvlj}8SSFbCs z-Y#xFm)&n&^tf$%E!@&4&e%5t>0hW5SgI9-(+I9W1V4laR~}7BB_gC!BcxI*d-i>N?)|oWTx(%P zTk*rTvg$Tm4gTRHeDz~|?bG&0_3d@_9d-4cb@g43o^?NJc=4#Ar>>Du*VJ3r+*j8! zQ2TtSwr!*aKVF5OtZbjI?4;CmP1kk5dHmu{eb00QVXB2N)kd6b@0|p=9e?HzqNF@(5*ZY<7M8{a5n* z*6aDL$;GeJiyLnj*WUrCMe6Fp@(OijWqD=g(<*gsZGQdB`_1*4&94ian=6|;>)Siq zfN2Z(*MLv`2N(^AXTZNc^01FmH~(@0qWVwA3K7G?BL^IOa|7v39XWlCe`pOyys4L2 zG2rRN{l?0nJQ=%3&O^D9xX3Jt*1x;a&eJcN*m&w>?2iS0sU8#84o5IA8YDr1gKyip zQC%j_t znWhg!e912D5&LX!9>0b7#&|xKuqY@^6Ysh8=B!g^!G1-%W%*}>=xLOKZg|X%_XbI9 z^_9*k0yF2{uod0%tZfLlf+@|O3xc*IgsktNRWNI*@=Cs$S382g(f3&-wQTD}EOiZ0 z6UP?1Zx53WHRVk=v0rxUFP%vj$Z%@E{o#qxC=C$|@-I!!Dd@<%uN|?)(rYZ2TdI$f zdfY6r#faiEKth88dj-Y6S%s7911))-t_82vXAzxbKaOEb5))d z;w`(k6@pUAu#}O?9hR+iufS>)}c*eJDP1kEsQ4u_1yC@7;!7E*SND*SbXs#7N zEJkV6mgV&u-G zyWSf1;n$a+EFY5-7E*<<2>7R;E{J0ieKzXDMx<-iUvIOG}_~e%oB$mv6wYFYHt2_7vv1eA!h|g0)J7tOmwHexUxQFhbXUBNq?NRE6L3ji5oFaIru5oIG%iP>`DY`ir$%8=e6F7X5j^>Pge7;3e5@oP1`)xzxS`!Yk?&?CQ^ zbvAbgNd+O`^GRwg6FqeNRpK-d#}11v$8{|>Teh4eMCd^CK4K}{M02L|EWUg1%9BXx z95Kc)ugv=>L(x`30wY7VblS9!kaD^kJA|9#_zc;1r=b-2h8bDsNaa67vb%GRs^@J4 z24KpD!RlI!y(Lotl3(nSYYDw4Ma-o|<-1sQTL=3UUoQzQWWQ7&PGluN@emhi9}E|h^vzDM zl=`Qr_B<&bYihXofG>BdpZU0%c|*WMXxYDtY7Yc6A%Caf{LFyD-=g~I6DGwZgy0qW zUF@Lcsj~@YBVMQavBT-rDm8WHUK+c_s)Gw&^0m~Z^ zll>IWm2TM&!QTa>L@!C6XgI_gD19Vk7!7j6Hk_-Js&mXO2qez0`OE6mA#&!(F84ZT zpHPe*L~Sk>Mn*}?F>NP0f_k~@Yx_=T(m{;3g1G$W8C6_~iHKEtK{8TC$X+fp=EVYk zy`!uU(+raxAs<>-40UBMC;7EBLqo)jbePV( z)nFl2FJg^FUJ#RGFZK$D(2O+MQ(5f4pMl2g-IU9`%wE()*Br@dBJtBFC0dwII1yy5 z`FWl-xZwdToqTAZ`&jnPj92^<`UnQNJspRB9}$+qX`~rSOuK%^gR4xLS?mMK&QICB zwGwMAWEz<6foI^}*^);78g!2SPS4Mfp(v!#2sIUM$@8c5pXnm9*rKQ~8>1!B;K1~d z^w6#?I9Mo=n7nbSkellG)wk!yEWHD`&3DyMQ)*)NxO;tV5+#8)vX5{N7+xY+hd3Zpvs3`*ORL4XpI;8#O;Omo-n)w*heN~j)0 z9~L3>nw)TV!4oe}Jw=$*$N zR!k1Fu@E!?b7^nuo%R&*?JbJIiSP3!Zu@Q=z5$qq{eUk#=PEeD8*1x!m3?(>ODJ<9 zt^H7v~y9ldvkQl0kGyc_q{;5rCVsFt_4Umx=;Oug&R<}QuhKraJcz2 zFtg<6Jy8?*Amj<-ne@_yle+CAc16s7QU@#W-?U+BT|)VfpP!H%8tOQcKcd>E<8|TK zw`!g%B7Y6GPlZ|Up}%x}b}ZbVZXVk^>EHduRp858l65FLvwPhqY~|hL*k4Zd-5UW) zOS4q#{f^mRU(w^8ANI%gU;OyB8N<;v&ul~M6*}BXw&_|F7^e+r9&Tr6buCHT91J@h z?qJ8eR@BE2#v%`QaU9*NCN|$+mmGepwdwxsF#i2b=iy#MR`HhcamczZqLk{Z=|NB2~ z?7#R%JQ1~Ra{uQjIPqXSE6TmT=U~Hs%^XAL zXwCo+W5mX=;bYh-F;H3zCoGm59?R<(%a4wQVPggHvBH#CQCh4REKUL*C*>G-3LPhd zjg!O2DNy1RX>rOh%vm@_#Sx>1#=x-{4LnARg3+O2kg#}tc)X!wyfHf76dP}jkGG`6 zThroEumoFpg1uwHMRbBAHsLZp!I_faLQ8OkCAz~CJslIh(1||S#2ffTUrM4MEinL= zbQ_)&?3fgaPC{doBJfFfC`nPYq!?Io96UMRF*y;Pe3*<)PQ@puQ<5`j$=R@!TzE>p zV@d%!1&d87#;250Qp#y5I9O^0Jhjp>wHlpTi%ormPklm3t*50nz|xxFX)TUvt>`p7 zHmw7n)`lt?d5al3N88qI%pCHHU}~8kf9^AW53Bz6EgTSbA~xCiX}PT zto8CF1x&?(=W!gL5%YaP-|E4 zOzmy%l%Nez=AuagqL4$nDc25uJVqfU{ft?jtxTS3d-S=wJVbc3=2{+wmlGs@$Y7@! literal 0 HcmV?d00001 diff --git a/docs/articles/example-kmeans.gif b/docs/articles/example-kmeans.gif new file mode 100644 index 0000000000000000000000000000000000000000..76a43417e570a8742064cf68fca64bddb0aaa4a5 GIT binary patch literal 211271 zcmZs?2Urt9*Y~|?5PAsGTR^0j2vP-1=-q&bNR5C>6A@4mK~v~OKsthiqI8Hfk!FBU zq>F%b5fl&`B29$&ao^ATe&zb!|NeF|d*_aQX%_Y}6ORjZ2yWaKOk6w1GyXsC??ZelNF|{2rrS#aM0dny$q3msR z^>|9%+qCAfEZSJ^o53ez{duD!l%c8Tz3;1f$Ln9eX?@+**3sEP>*}KS_YaN^4v!5D zkB*Fv4ULcY%)O`0&3Dg#e6#RrYH?|1esOkw@qg0kx#P^j?A-k9-0a-k%>3NM(#)Gr zqp#M6s#XWezYJFX7;V^@>)2iF+glpiS)Tayd2Vxc>F3&~we>ImH>>L#|6%QzFaKqI zb@e}dUR^t8_1N#r#@GMo+yA5Q|IyE%KQ}iwfBhe|we{=w_W$BI|3Cb1&*Qaz9#8+( z&tF?>KX*TT+nd_h8{XLM{j%5fWw+ox%-@iU=Z+_a@+}Qo~bLaQg_RcZC z{$Ko$<@e6c&hGAi+1uUw|FXNcd(3~0d;9yx?Em@m=ipd>|A*uJ{-0z1>>iiy?f=*F zKW=-+relx)=q47wZl)Vn_O(Xa#S~zo{=BEx?dj zMJ*c2Z1dTkSV=k=kH3`j_H_6I(+R4@V#`lAaN=GWSE?4PEQf`5)I{N3AJj^(h$ z4!6Dfy*5^Cn)t4yWoLuJp&?=S>~^Q3lm#OjZr2qPD<T>S@2uWo@h9qgv1*u(vrrT@I0wHV|ED|K1PaU^|)UOLE5Lp zpzdhBA(KL6;mGmE_2mR~FWg>4G6lbqq!EvZx?_m?D2f%(LKz^8V$qRMXvx|H7Nv{t zg0V$z(uhpNF#?He;Sz$6Tb9t7&K0o)gkd<$5PUoU-Xu*|U>lUpt=)em=CMBr%i)0o zFnsz;sr|7s`m%2dQ1PM51tLNHMTv0#E7_y-8Zae3j9OJWzLDi=h{+PHX!gbK4fT{2JQnk$bwWPfMicGhHBwcXhQBf zR70q`)>lI)6aFi{ zM?Shd)>;zR39|0R`12u$5M3GkXE2{@w~T3+VXbU#0~km6WwPK+lQBU0S}XLooDG1*U2Oad4Pz@6;ksEY zcsF%;XEvfl&2q_KuS*hM<3Ve>{1yl;BVnNdG&#AqG)FPI0b&Xjz2I8p%((P7GdDL9 zqL(BAUwsS!O*EDI#vE=_g5-|Rd!pOz)bT*HI(*O}lpm^gMTJXjYn zl&i-Og+e^p;&nUuP7vZ`EP|5)6H9g1zVM9jQVAi9Gh|V2lIeFNn+y8dIetcec!K0r znS3^5U!qA-p;#!3Q(=@*+%Mj0+(Z%oGjC({__uLxXNvqwO3h3y?9>toT(Z_a7QbJO zlDB`~`sX!p@}B{&fJS7s4>d606*5X}{>UF8_S) z##qiTGn!b+F0OdL6X@-$nApGxh?L(0662PWK0~jhqa_R@B zv-_QhN7P6etB?GBPuaYPzcjSW*Sg<>e)J;o zy48x%+r(E0i{?t$zh9=cwP%v}>11o6u$9}EoWQLpdG{;q zaqwGd8F^kxmNSE{Oln!hBC8ktFAsT|)H8C253eE$W`=J(Pu0kBN5eCJKY>N8Vfl4NVi@&>yh+|BXLCmhKh$z$+E>k-55^OoHb4{2G`t~o;mYe!8&&yTfW*E(`~LEnc-8H8FDLTo zP;Ee6&Gn>D4kz!=&>hsDq*>qaR(mp8Gj+QzLGQ+m`}e2cXIeECBwhEsaDRT#t+Dw{ z#5d_D&U5RJZr8UC2L!wqn){Zi+2rSX)91teh3`{)RbLhY?#Il{fG#z*&$Zw1s}%nD zMr^mMGT$!(qPzT7OzXAakIj4atsjNfLOU3|k8Y;6K3PKi41FW_U@NIqWS-0PUhjvb z_%miixKRp8bQv9~)!)jIS{a;`S`{sExU_C6LlVnW46#Q^h*)c?oeZlcR`{VH$YxSq zvDl9G&4^LA>pJhF7T0QTzWVCPe1CS-W|wOEpTQXYb+wVz_4y4X|sOM zbp5XHCd6lq<0b)WMrDe|uyDz;++Gb+FoXJxK{@sz8JOtwP2vdw(g`z?G#o6xWNq6V z6FwdDU_XW+5KGdEjdYBS4vl5RX2-@i$0kn4KH85>+1E3|K^MlLrxDPT6sABp5h0vE^$J+rAj%FrwAbb|X{`&Zjq4BoR_yr7f0B{A{WPF)F2eJ`6Tq5XIn4)LXM zoWns4X;3dmmJEPFeC^GYYWQe;f;Ej0{7e8+HpbD5;y8y-_~Dh%B%5GVZc;@tK_bFw zdwx8D>9{wnhB@ixe~irI(#MSwHOgxuw1X&u>1kAYIzdCWoS{e$NT7G;kQ%E$wy(eh4nu~x>1RVG~5~%EzZhzuynde^osdynaNIj`gC&5-H{-lm0p-$>PqfUPC zh00)^bY)o$E%T_OZw$AKtoqlUQ=4^w(lX_F< z2L09s3(E#AzXsfs1{>kVOJ^I6S{u#h8a4hlC=WJXc5b?Izv)b6qwn8(N54k5Cv|D? zm~2I=5CPv@{L2R)1|RU~4O#YkhgYZJ@QSzp}OIYuo78)=uZPVMaphlylpR zaBE3r+pKWw)Li@A*|w#@_G#yiPxm|CDs-$nw|{Hx*br`Ow`^Pe+q&4=`cvWc!%AkY zJ}CMP)YO!@8Pyhw(0+5=v(KZkw$a$zSO;jdH=8fJFl@=491S>RJJ2cA)+sXIDR$V2 z66uoE?UHiok`C{Z&FhkH>r$NWQa@%NCL3E@tto|F|F9b)LO0N* z8@bR;!s%vtbc;5+)jZwikd71SvD59bcj<8m?{UoQacb*vneVw!#YROZH51qk+n7^% zsNQ+KzHPn!^SuFwy@4WqLAre*E`4{x`$F^j!rJ=6=ldQU_Av+|{UqJ~NSFTT@P6+^ zH&Y68;(Y(3!~PVJH;;ASq`SPy41bfI_a?XPP2T*Qr-yGSA_GOb10^m4&%+1G@&+o} z2C9bo!6DE%#9*E7V1vtGQ}|$W-e61HVB7p)$KfDNWT;Dbi0(4f8$Q&ZH#E>TG&Dan zayT?5GW_CjVBBSRDtvf4Z+NzCcz%9(@o;!aWaPEg@UqLuYWT={-pEGV$hY~CAG*V- zzel!oN4H%@cf&{b^G4}bBaJT16SqVG(J`>z7&J+gL>YzWkFmCou_uj^Xi!bWTcqCG z6RvOhBHrp#nVN=1>l2yJqu?t%_1?^=uF3n$B&Xj9-{e zR2qE5F;jG7;&H^xw{W8@{GcNhT9*iuL`zw1%3P++wpuZnQJA|EVK1u3uAq+}9D|oB z8Ra z0W_qo3I?aV?PO=-UxKi;!{8~iE#Vv|2n*deK)RTP?}_sR?K49hqgSfmk0~t_yUrd& zj7;75P(N=t{~dOS9GuMutZ|EN>>oBbhQtvNv7)g}r4O$TVegfO!~=n+flC`hAC8iy z|K-C)IA$Sk6BASzA9_U-&sqE(#zJE;yRjtQF|20~=B27yr7T?`fOFuhjv4Qt}sBqIKbJ? zkQZ$>Mu8x;8sNu`RXzg1$iWQ?;DL-3I35FHB>j;PM}v#Z_d>x za=h>YHJ+GL4FH`OgQNi;tTCX~d^leq!~_3{t_I~tYg(kh)NDYfDNJ#JAkP4>MBplw zlQk}og9ir@UR?Q{xa?pJ$)`dsDbUj?%Z}~KN{o54@32#NmII7c4vs@|b0K{bcJla* zK858VkV60vKcK>vv7A~pE2hIMv`52w=|Co$>ER-7$7B6d5?~z&Iz!;#2Y?p+L0kRL z7i)k#0!T=V3A@C?*8#IvhD)TZtfzl)r2!EgFnu(O5Pm&w%n*$-jQU4mR4ox!)iRk4{s;UF3{TvUKl0uPBpfc2JO{hvTE45t9aSjq-$l>$-^ z{Bd?R`_BsV2Cmx7-zic)vTZV-p3@Tqnn z;wgOAdO27b1VXcLjzC!4n8Q+F&S@)B?#oT=JAd33!!etW5nGRO%w7!Y#w8N0B>A`D zxvv^yFdo|M@V_s+Zb#1+VF1s1?1Keo)GwbjkPMoI4-ZKjGu$>96sG`U%6}FWzkz^V z2PGf}2Zmyx5CQ~{@Fe64Kog;Xpvc|~fJ0ORnqsz0H@Za(>+}&h*NECA~W3PCQtPu7*HYmbzG5gk{C>W)qo>TjE_Av(6gMb zj0|(35S0u`HatD-KBOzrS*(`G8@4n#+gMf}1bT*qw~l7w{pPSlbhsh;j8}3fg$bLFy6$_OZV{e)c$j4lB~^(b?w&y(GWQfM39Zz*1LVr0>Kfb+O0s`-kMD z#Cgn1SDtcePK75#HEDI2(S8*YNv)@)KT78{lc11HsiO8s`-6~;$!d4;cnHlf=F9`F zPuQa9L|~Cw>U3ZS=DGM8Rlz0B7p2CDx|*vKFO7SfAE8vQ3Sy!2c24D|p!jjq=Ria= zOK0kxE@cB2nUYP}XWl7hs)|J|ghr#t3*gFnp`|O52mwa}#kwJ|M0K1^u|$nJ219#= zHt9F2P1Mgu8ADrUArQ8zgA@|0FT5Mf-kAH1Fc41q9*Jz(B7u>JW;z6xZ6=iPnVqe*NZd4*%vzxz39Udp2C)KUwIahe-zu=%lB82-eYZAoez1zMArYQPzCOe%M5 zb+F+9X;y)oZ-0+ldgzJ!Qwss(lXX9f{%8%Dv$JK6#Uwxs*FWYXJWwgm&MPl{%tdCR zI*~_0bgnMLyPq517o>Zj(ki?+!Oc8sEJ_46o>VC^Y-p>FNtKQygT?k~c#w?|`o|d& zFFJ`dZ-5~nMOz&)OZQE5-aM7+q<~hwl~e*2EqHuA zAq!AbpF`f_K(ez_KGoSQw|IG+*Y#dvO6182H58G0wFFqUWiMHMO7Hqu#bN=S!Mk67 z{_0vBGHJ9m+E<{cO#;fGVNu)CpCw{JDFhXL8?~aJ7Y?^U-C)*5l9Mmgf0GoMVS!o` zdK)?>6Ireaf`Ed88ntgU)?Q!*vC^%jHjvoRv(am^=t9*OayTHyydTjSUB9T&8EJE; z^8RDAvKc;2Q9e6&Q1SWD<_(w^#BkmmjkZa={9YB4Y}B8dJ8!vu^r=eeUeG0t3R$h+ zHeHrWALEhDhs$R1NKe*JV$!z08|w|Sok&|b6edzlEmU~WNC!t@)_&Dq++jkOH^gjDETt%w5` zn+@_q$D%YYu!7yQQ+@7v>xfZ71y9w8kSeUsar1IYM*z%Y?-6b4GPiHmY=l%!lC+)^ zXM0v=0Frzge~IqF*Vx*RgFz+mKU3h%3v#zTmh zYqF}z^JNB7#@ZHknd9;L2+S#^%fM+yC5uCuf#OwdOQ)&v%$HTCc-Qe3ZoA`IuRmo7 z^)n!V2j9EwKBH@@X_pDZ*@*1X$ZKbwX~T(pQ&X zEsRSYyOXu&C%?MG&N_DS@jWN1`+M-VI`%&0evuUA?{%tjy3b~+F004i?Q-trkvmiM z-qqi(8=rL=mu#$itxc0b(+J!~1VHr76jB!e!Ox(0CLODx{?1N|yHhWpvMa%*(Iln` zRIt2UCJ1v2#O8RoiO>Jr@ipYs~b;xPdz>1`py}8hCiR&4Z7pscr(@Ew@eNVCcjeiVx8s zr*uginz$mNPz1BaCjJp0|4jegh@Yt$ZJ+4UId9HKZ@J}*T$R7{s`^4xP-f%dMa7#l zgYHj#vpRLJsq(8gY~iAnC)%!Qyqp=n86BMWS@$^FH#2g#w>~emkp13?rctY--*%9E z`+Mw8)Qk*f(OjyxiRSFvK3$~$)F+wCvbht(e?Kophp;A+!O6PBkM%Wd-~-1wX7 z&iC&S8bQpSD^4?QZjJR1kIs0zht7&08L(*lO7(N0Ku@8uw^PIXycniu%Uf-3H@UXm zI1HKV`tZYB-30L@Ih5Ek5O~*irh3BbYuJq0jor4pv*+$xKA9C=Ai-r*;vSsD!;Q)U zo~n2J(hi33i7?;mpBv(EiJkw1(uAUII)ZfT4TNto&Y1U6nL-Y?XFxYqIy47h0)#^F zi9IuQ5+aiG7c;-9Y1nv1N62%{g)iqHwn#XFZdY7d*tlfcGV!A0cFj#aZt8m2bk9i0 zjg+=8%*=A?zCi&&Rq_2tmC^9tVS~m|(dO+D^X?d5_?7z?*92i?i*U~ERI1Se_?$-P zEgSn#HRna4Mko)d(7-pg2N4ZmIp%+y^K&F@0!Ejqs$stw-xm-@egaD@s8*1Oj3st=%bnDE ziBJSd0;sunWu4CG4ap*A7x`sF`IY;c4JRuiyUWgpg4Qm8?EVxe1GEj#49FWUo)kT+ zv6zzx-uUinF|8Os6lfH9l8QUGJ9u)uo9j<2gZKym^(Z?hPJpn}hzB}Et))CavmE6! z0OT9j`@v)$0{M+Z49{iK@pzQ=80n=Jx7a4hR>Dvq7Q!Z=Qn1X#Mp2rr0|I0_W4_8> zn}!H?Gl_OHsi7gFew}oMjvit8PYUuv+fuk@?3y1KSnlku*GCQM-*n_>EhCN;YpL1; zgK`{liCu4lUndh@C+~wjbsKSCEkQ0Wwj(ne+?* z@gSHlLP5e>%>D%4=`_7rHjv+;oIb(`P9^B!BzQh4@GHs-7|C1ZVL$(tIu!`w9|Q4v z7>LrNEvWizggEbcrnB(VtPDJ9=Ut5BM2rsxD|^B$vB;pACq--wfC&&|4?#1+FUx$u z+*&W$FeX#M?FS0PSP_tTY_HFD8@oX5!3yX`UOV+yZ^4EkTP&GZwXfa4w8*Zn$fK|D zI1UPioljxnwTp(un<3YU7dw@B1c+>Ckbk0?AP~i+Mc}4JDx-+8Cy4Lxul-V*c^tv8 z3nfvCx*s8N0-M0bR;*ukGxPRQXdnX`zn3&VvL-pm+GO^@Nv2GGq9AKmqo-9Z^6mS5|vEVmCT}Y{+j^j5pGD+biM>%?lAhkna%_tItRS3Z~uwx$g=ni~%0L3KSU12dLLA+2W}L|MEr zBt3%N2RkO6GVpn8TZ?dP@J=~qryQGK{w*L?!qdTL&oB zH*H+VJ9u}S;}SN*PAxZD31=sLRN(on<9_}ON{Sf`Cn3;)_NFe9Oe_=zpEm1F#xY42 z=|!D+SFB!H(q8`TdwKfj@{EikpM9_jW%ggWuF!g{(pVdN1Ayoz@H9trujgv#4L({Y zM4lQQ!=K~Q0&%%qe0l1!pPH6`Lb>mfK3n#@(k3w&Ag+>#43A;LYLQkB2C)0$!jl3) zjzNPwYgSc3I7i1p*LRN_-=y`(we-lfRx6zDUZ^BFKY8q&eq;7dgi{-G@ndzxa&`I2 z_k~XvXFeO(HQjcrCAsB3UVO5(@C5AE;=A}QqvCsh`H#l(pN-|4lZwTs+^MSWIR+nc z?LOpsxHk)Z*t=1&pH%+mS^2@U^1q^Tig=RA_wvKZ59ajwmEy&gMz_@X)>WMhqtCiX z;BBd(D;tib>GlWcsyrh~?q9wf@Kg@8Tj1plmezs}bOW!4lW7@D0cEdzyrW2;Ajfg# znH8cr_4JJ;vN<~DE&}SXbY+T8xW(oerR2o*z`!6EDlWdz8@mDi4!dGyyq~QL10`!TLJ=#~R{}F{r4yB4Zh@AUg;Iuf4q=8=S zI}h)ZR#}}3MR;AF%ejihsia)uL_qM2=;iGUkIiQud>c%LxJ$V9QDi@~_{8JjclzwI zAT}y7fWmzZMkX?5-rBDtW!a4L4b+Z%K1(2kH{ldsB#0W#iU+Kl30R|Ac1rbK;#$t* zwPYI8Jy*N%nn|l~*Hi46yr$J60%LMLneqde3Z}l~-e>kQi_RVVqL&s^EEZRwv0-*p za3Bx#twWQ04Oupo4|qtd-hfR%0Uk)ryyIiBTcXl`G3?owq3R1azAinQj%Skv%5n(h zP1W$#+M4GHYME*~ zvvV7heo%4)9#{NGYx$8j@Plfw^s`Cs@m|w5J zRX(!3R{h(wSrCTf`#jEc&Yf$`3o+`+eO=qp z{w)caEiqG)%zA659mDo?|3yEX6CeLI{yi^&^OXb3ObSa({}|QR%%D;QlNME9?lipn z7Y8wHM(b0^D(By$&kvp66F)O~!RWAZQ>^@#M){UT`EMo#dDmLK+X_1Ta%WZKbXDZ^ z)>PG^et+ExF1h`^02%UFGUTypNbU0PGa13J!P_Ze+o|!}skz%V728^ue&^Ul`%;*c ze#Tn!m)r1{pI@uMiC>X@_|j6me5;}LwqHnk5tFjk*MGJnFOr_SDNpY7N&qh3Hv0KM?M4IajW-ewAzU_T>-$ax&NCO}{lQ zz8&C+8{x6@r~X=G6i3TbNhk4O$@*wv)6x1yCelbU5=}U&&pb_aJ*@>kx!LyC6|77J zB(+G=v~@}mL{z2e-^{M=EQuR;N9i#XYerEnTchmnpLra41{s;Q#}fQfUSGzLdXE|W zoQWF+N^~J@p8)-}Wamj~7Q`4fekJBGlM36JVC#`PY%jS{#1QT$!b>C;%s`=1g?t$S z8ws$MkqpnssR)1+aJwY~A#zAE>;oz2dN9ZB;OJmGr4#}SdQfQ^uY@poutHLnhD1dS z*2CfiW6xSrQ3zSWfx^0wR*cjesNdavi!$97kqQ~v7nLtbK_xrM9tJiTFIZFgU0SsA zak!)Y(pT%NU;mkhG_c!ocoSY00uaZw_`G%n1d#>L*}VO7OIJXUit6kmq&48_eY-v9 z<)yL-EEsT3UU;(IxmMs@yT+}+hd=9+#~b?Im4YDmT{G(JUy2QPD>?!Kl*l$2-I+m< zAUXyufU%|>DI^*!mO?+AuTT(puxwgB_-_~X2s_Mir1{dQp$Zg?XJSW>jRNopl!r?i zs@Nr3z(pVhq6Q+CvgT~tPGn)RToIG#6X;9d4W278Ke%xv<&7nag^QhCH?3H5C|mXV zc$Lp@X`9^HrBB~-(q@E%^ka}p6d%5$Zq<&6n#8qc&YT$L+no#@U z&kd_m+u~k!^*h_>mxHzI?fO4A)m>M9-rR0`SYBRwLftu#hUNd6&L{q0`{P}ALj4z0 zo`>8{-aG{UAPtJGoB!rVCQn5zH*)6=b76FWwbq3wxfXBX^C|(^C+uAa%^(5BNt1Pa zgzSL#OuTAOYJalw7S=R1_m<;?fN1!7=NTQQ{^D?b>GF#yr+qF&No=`%aaW7Ofd;c& zl`f|XxQ7!t!lkB6PlY*TvRuqO{n4(6+hqNfOhLrK9~lafRY$fkN+?XWh$x1Ip@V~N zU%SWN;j>J>tle@kKg+kp=lYogneydm670(PT#LCv=EX2yomqRM58Z%#Q z+^x>s+qnB;)`F+{HS1r=n)xplVzu*sbQG;RRsZ@Edam95cK6M-mx>J|2CdcM8>e|p z1j^dU9O@>vgZYh5V82;(G>H(4*4@hkH>_vJ@7La*lw0Xc`y6D#@meJGxbEZDu4UC+ z{fB-_V%3Q>;L)+5Qc0Z9ujKFbyUVRFZcSbeUg0kwc4A)}3Hpn6xt{(_VwI;-q1F`Y zd=Sr8kYZY|=2w>|eW(QXBIe2LZ`aDwpGyx9$;)Ej$tX8efq683e&cn#;H>0&`<>P+ zBJ)(ZLlQG{5VpZu=6sgwCGMBBF17+pRrjolW8&$0ZTE=1s~cC|!T8-09ESPv`_AZ@ zR-uT7QSoEzn0j&2;n_uJXwrU!Nge^|KMYSt7&dfCbq&>^n;$#5>5$?!So6Nt+xFNrd zwqS~k$d_NyVRdzv)TLr0K~LU37s-a&~Bg+PK6V}?DPa?2^4VJg+OGd z5;2k}BGV^Iy7H;{$xGD$g%_{hhe27CrU5M^5dCVw!L8--D6LlFhm4fy+>6c$%>Cn}}; zO9Ow$_(J<@IX>B1FeD@c5@Y41o)Sb{rzy;QfpPIx3|pm(hh0#CSb`<`Wc+GB01=!f zSP}4P2UHW-nexaWT59yuBBod!L`_a2yV2)^uB2%xA&D)fltyl^@)QAbkVp{AsV^Wk z13Xzyh#-P@0UsElNDcONCoOe}s^q0On}Jm!ECLHd;^XWVH`1l%2=YGT0~~=A7kqQ- z*tN@AUZTo2zh`rl@4dpJs{*6C(+R(n#{d>1JlQ1$zz7GDEi?##TQ-0>MF2d*?2>>a z8t9;JSn6V*sK&Bq`ZZM!od62kiJA8?Ela0v|0v5Z4l5lwekl|P>jc~S`M|6&aej^z z=CytUm^=Z(7JC}1txm*Y#*BmfB^agf>1(!ESEBNy@jN_7k6%_@NlG23i%!v)5VaPQ zsG52w=_p={n;LDU%bbMX!m9!P=E5#PzExgV^Difm9p=k!YxpmuJAYtpX=c4%(^&53 z`=g?~Z6hNn{3yxY2jVyZ-?fWW`nJG1_=G-k?Zq>ns$wy=%a!IDn(5X_SB=Rt+CF#c z-HUqp+m1x-x`zrU}Vrjo7(KfpZ%R2!B9AccCV#+&@^ny^PdM|p3J(N^PE%IE0(s1RN?UgJ! z3AYBw>6coH9~5IzoZ{EwANbKC#n-dwxw$vt4}h5CHW6eQt0H!0CyILON}$%2XnvhB zqH>$5*cGv0lN(lx0zomuC-(Q8{2z~zT1&$qZ4!i#E6II#W6PBJCp2MzAesVZdI`oxhqrS~b!*M4>) zWv}d%UZX)Jn;8J7*LoCGHtpelVegatWttyX-crwwC7UB&O}SJy8sK8iIui7O^z z{nRc*+nSzaGl+k{@xI(I^f?uy21z&BYxPnR2XE6lwx6Fn9&xBWcy}LeLV|jH!$B}#B`}8* z>0ijY3`actj{D6-%Idd*knMtm!w=T|h9dAzK!^ge>*R)mMApHq2VB;-NLHaBFd*@u z8KQwF2U!`aqpldE4evKYY_%lRx0mcbeQ-dDU24Y1(Qjiq zB_D-`lC2#fEd4}bw2-zJ0TfAsdy#}A-5b#2mDz>gs7t}#h0%c@AHcB!V#`N#Y_a1o zpCiDcy9`GZTKj{fSbO-kF-&@rtlvM@{VDtjEa$l<^*S1GC}zn$m6U%j$&Tujh`z!b zI?8QNR2-31nkrISlvG|VQvM;SvMZ@1zm!0v*As+qI2JnKKRUpdqoyrS4dpS^^ot+7 z!R$0Hb1;E8da**+iZudGYThZ)Oxr$$#Nk4UHFBGmfXhg!snzd-RtRI!6> zanv*$2j--HSROmhQ^4sY?-*7TT7uz}!t#}1#iR_ROAM5y3^~0-Cai422^?*y)Mig# zn&-v-;)`RRk<*^~54;|{0eClyK~5_?OW3VvB^EVOmQ5v=9a2`kB~~M!ET%xbWh*d8 z0!)@*feq{$M^*40+ZG$WVx}Y~qzV30I=z{kWpv3v{{pVmkv*5IgaLJ_s2LaCCvRA4q#g zKlgs@DbiqOU3Jpfz8g+mx!d0@cAMrj02QAmuunXf7&B6*XX|e+q*3FR?g1Y!8VTq+ z2Hr82p<)K@*{vPH-BmQsHfA1FDeFE)NqaRJEA6*UmqT|VL$2T5C2)nVafGfRBd_0m zRC@P-z!ffGZioHU<00~m7=Azq|3TEAl0i<$h$&(tespqAlnU!&Bjkw>9Iy`=rQtOo zo~7##h04NJL823-f;eo18}{K=X}AM6a-dYu5gXxA7S7lrqRd2mA0Sz%(su=>V=&WJ zM%WuutGr`SMPjV!#cpyG+fj9yTNm9pA~xYhG?#7?TYrv~Z0Eam44Pt?(lo?of1M!k z>>+#dseOK90j#kANzfiTWN#!o2HH)OQg_251VEzAAaQ%6tLqR=daS-Z);O;_)6VFQ ziD}+IHxJF|PIQ-~ZR8WX$b1JV&ms6W9c#QTXG|}bbbu-&HVTD$&JqC3X+nuAMq;ur zzS=vfhc4V!#tsJu=sWgX86Mr^IMjSI)0d}B zKE{V~#?TFlNhQ_JsK}09^r+I-o($Kz7#RzKhhcNy81a^s7LL%F!vOw$IRU~FzbstM zKZltBIx$Y?YxDDw?POag%#B5A$`Uzc6^%p5T)K*>jEvjh^ED2mHAv%HJ0sC)W(CSu zTY#)OhTY}vUV01}slD3^HVN|H6~={a`LyspTXZxvexAgT8B?l0u04v|u{ z$kGRuln3_1VK6JYoMv{cD#EdNmi7J;R5{R)OYDjj&ae$>@_yF#mRs*RE3g(FkH!t0 z3+?U^Tbbp<^@@%4avJx|GUyEsP}NN$uUE3FaoUkCQOd|EcgkpF*=S*$KDG#LMh4iN z2(WR1IO!@oQQUD`S875%wi|A6w}0pEsXjk+!x~+)atk6Vg5o};@!Df~#)ujz&#a)z z*6cryi>yRytfd0JDJx&_qFJVVfaA)m;LpT&VoV%h>AQWKkp}1`X#d+t-F2`c^t}+A zB!Pmha_3r6$UkT4TZ=|oUMki&u(9t=8~>ZO>1Dn}>(2odb8D7WrpK$C$hGIux(3nhH!#QojkyOW#gZDxYh#lo`*!_VRmf_QD8_WxbAJ48|)&Md)c zguNnGg=u~@hOAjhsHE1ufIVvUA#~HpIMCS|ZG$K8bV1dP7LllYD>#u$>Zi41_ra$z z#_{KzA<10*fmQ_U;e2FvZ=f}=P(K`I7XMS`SbJDW0%5r=`osv!AKW4t&p-{z)O zKSVIpfb%p_3r|FL8wq$BsGq^^_Zso-V+>uueBXXr`FFzY0hqrk%q*ay;X`~_(vVA~dJ1-8>G*Iu_lJ$tPhj~+p=vJ2gJd9t!WM(; z1eQ%aiu(kJ+iP>mpi^s_e#WKXgc07#k<5i6a?vV8Z4G!+4EaL4)NwMO!-wLd6O%lA z#W`VW-?9fWQDIU>7qsTnKoSfAO_z++Wa z>Xgo@T3K~#l0iK7TR8ttuonp>Lb_PYI_=MI>gf=(K@yh@hQ+6k3|YJ z=%dMk=@50#MqUKnRO+D^+MpqND#LR!Q3i9MnCWw zJNkxm?^zT?)dj%3H9ouh)2aSvTJJ7?c=skhti*!ggdX(0Y2s%Y#d1CS=D9tGkWuy2 zJM5x+0ScNm0h)J%qf`M1I-GXt>mB;9JIUymp4xl&_MjRf*xj8^EP(1wC|Sek*6|&5 znnFr0?3TiTHUH9^@rK@OOggBWRzn$D;ay-gL)mmCTSly*Ec&^=w^q#geO)z0S*d+b zCk~0+DLyNj&)h<=y}^tUh;S(~VGrPmBK@*ByCBZ670F3uyn$4z`OtTf1$wK21^R zJQrCM_f9k0xnGL*%K8#iC(w5oM|%F3E8dj6;qn34iz8uu7LDk1Pm4ElD zXg#|2f3f$LL2)%~wl>~4jk{YD+^r#vy95$Eq;YrG;4Y1Of?IIc1PksKEI{KH0t5&a zp3~3!&O6_HHFHj#I=|+}>{>sXrsyg*wW)jUd+lqrhxG=;f@#8to*-01z8bIP$USA2 z+@isOVMKh$QM!+R=|u?fg_@=ENqB}4359ZQp$Qs<5gEw3S_V3QRU3W`abAiLgMA;B z>)Pvh?A}uM3RfK5dV%)-ew-ju_^fs+9_hV@>cqQYFS+PiL9%X(-0>N(nL+3reJ`oJ z4D=N2ZZSPku{85eZ}xC)miUiM9`dq9Q1vI(g%Y7a{jo(Q<0a!ifNXj@t<(S|3cr!( zz*3uvCE`e7gFd2!5H^EBOg=9fFR7p4APb)M$uB{>Mi90QGvRzt@MySD1Zv--oft^E z{I3CC?eS>`+AYCwF_^FBQ@EIKxER-GXH#+mSJQa1z3AvA0Zin zvkv~*2!Xv0yp1LSE@USj83FC+&6hI^?;DLPytO=0CORO*P*Y;QNgR;4LeK4+^x(dN z=XHzzJJ`MF=wNR9y?W1myk?m6YuO6jp*R!J^$O9T>A@CpA3Vr-~B3Nn-lSMp3jN{nE-1I8Lo=uCIquYeyvMuXl;xt#uh@786?$jlRwranNaULHOBJ|FC=CBMAA zdpzq!A;eWDlBRHk5ttKgjD5L7iqPu2!%WbY`6zS-tmmvoip&+e{dG}}1^?90ivypS zm2bokd^Ma8VSuC14H!5o=4d-=Dcl%1&U~efjY}CtJU4^U0ramtkX#$!mv4&-ma!5j zWGk{9kBFH&7>{7%m#=i{s;bPp)Z2a5yW1>B{o-qgP3aonTg`(9Trk;FDkJN*su&S z*ua{G`$>6xetW{Wsb+WvXEA`s=ZM}oa5>gmO7c)6b zZ_QTAy^bm~<%6O>AoV#?;pBbmebr2)Ds$+(VPKVx6glLuZCsN61%?AE_o0| zoj>>{yEx*{a5^q$jjgPCAw-P9!ivIW!)=6vKL^X|SyjaLYJ`8L=h8qy55qcqSv!g- zPnh@5Wr50ryhp_wpivH+vV@UG)tePX%H<+GMSF5E|92m&2A;9o`tCWYTj%`!H6LeB zyC(;`7S=IeObR(?p|)6xC&Mz&U*^22i&I$u#TcX|k#wC|Q?Phm)0e<>wQTtRO3 zRVyw(x=Bv&0Q9F!i+>(b)2p&&#IYfUL-OnOqrux^> z5Pd%~3ELf#@x$E+d**B`XF&lo-?g!0&^~2ip%ex!)pUgujn{r()x~ ztn$HoxS8>S#WtV^isBy9hj9Q5e@=2;ow;}tltjjxfe_fwhF1g7h#*K+($J6ug+)R1 zVvsjiE^PwQ>k?`&4nLOMf;3b1vK2!+unj+HnVbD3L5hX zGl}}qP$mTax>CR_eWBQ1p*UByaPgY4B$n0L`D8l(JiP|kNdJsNtXsslYX}5ufYz{i zvO@;Zh1Fwj&#(u{7hMHzRT+ti1nNjI8k4=OkfH5evavN*=-S;H2KD00O`3YtscM|s zm-DeJQ=hQF0ihoZl!?e&qP#vX0ZzF<1dD8zKE(G%j2;6^QJ!-48IHJ?RUE5hsjW?! z-HuQRxM3h+Ei-RJn&PvoemSeFhF0ZGl)c}rY*jCmNqU>gv7p2thNYgljTP6~r)vHC z$+f=0z0}veuy0-$#skjBKa_kemt5^43PgcTOER$oD9`56ld4g%YQx0v-a%+zH zqSWlu-8mlHC(nV0l82P+g$5`NL{~{lFZwg1EoBqgn`k^;cajUG_U-M#RIES&#v|=1 zqPm)7B@uXUK(Qx#5><+{s60*e+zaI%xV?_v-b^q~OW`;5qnwrYu#}c89Nr@=KrW1F z;!?hK_Ey?VPOUC;h0};=UKW!L&6N7uS;2M1U`W$)=>Zl^5WJ!q&qo-k+G7>rl6cB{ zYQ)wMu-22gPDoZ-6qUi0MQ4;8JY;cRR^Fm&P*P2+ZYmclnQ z@8r+ao>ODgB5JQTMU?Gp8{&+gMk%7P1p9u3vF2M-&%}`hc+G~9KY^JhLLKnlq3AQY zn+s5~?BM^w9*XFDb5h?n$}Uui>h|g3fEYf6V+57Sek#GjUqp@#xAk#M@* z$a7v${F%QKu;udfdj{=;X!u|1a8WPcAxVSFM6)Mnn)mCmKlQHCww(5{Jp48+pS$xu zIvz?P1~&r5>vqOJP=;iV#fspHPvq*ScE9}lhv-zAEB>fC(Nk=^SNt6c|C18<*JI-C zFZ#kei&9VbF;%sObNh;z5;Jg$pwmPArwyV0N1dn7G#{16^rdAU{k&SN=vltU$Sk^Q33+03!PIP+Y^o2Is{0u4X%C$GoH zQD4GJL1C2X5P)Y0mhA;&ZV}+U>oQb1+yr`v@fBbS0c5H$%bEdl`7*Z00mRx|LO@}tIw~PO40AtLa;C|L6te!Wjo*!+F<7!qO_Yz3JMtE;dh*d(Ew?in!Ld5#)rVDc8 z<#OZWYXk{3%84}+r|c15GLby;VooIheNISTr6|9C#bw}zL0C#6EKg?Rrbxse?%jt@ zKak?t2T1xv>Z;JC1uX$;t2pHdamu%9XJ**~a>%N&PO4x_eG8%mrD>ypKq|CHIppAK$!eZHwkC zt=%r%vkrPTS9ZZqFU)c$jm*G`5|O#jf@TesuVWMob%-Dw-E?F3uj8(qX7c2hr6Xb@ zW+BY#101_)#kfZM&H|`ixn!L%?TB(^-Pyr1h;xm#mcpbdAfuzh`iv7n^c5M%yhGoE z{6vI8qf>i=L`d6X#_o10lFdlbz)$T`14>NId78~hpO>wAB)uFCiP;Asejc z60Ya;Q0M-`!!>8erH{s=rp1FC&XbtHT`<6XZ%z_x4kBdX{v!ZJYUV&&z`r57ofarL z5a9R1riEF_&LZP^pwPDI=rbVxuza*GC^WKyY{f(@m>wY9W(ZL522zOf0?C2~1(yp+ zgp?f&dj-H$V+^S#@-GCSg}rlkkIn7__}F4rxUvl=wB=r4zY53t>CC313(`w_Y2~lZA8crki3c4^ z0vyd8eG8Jk49N1^07X@5Z6Sp>o(hI73U99!%wAK+eCpN_BE)4>xa?zageIDkC>ko+ zTE1>s24Tso5%_y5podZ?2`OmF*c(7q-d#JeA*;R;QmMLDZA@3iVDclaNp``y{KvBfzpl!zJWrX@c0?H1D=qWRV?;(`dXHsLagAo{=$pWY?BC z*~$e$)q>J>3%_dMd@KVvz-`u|66~*2FF|lX;B$zkM=?8A)LNi+CUjpngP7Mx8(>nX z>mf_!4+NDhs3r0W7-Fjrda@6Mp!q{z_CPsm7%bW#BKH>j@x}a?JK7GYdTy$EHl*yh z7RX$EX3~tP^3|xhq{yl|QXv_j2vVH4UQY>cYGA^KSu;F;Vqbd+kar6=eI_-T(=uU? zGbx)hxz~C7GWo65_*-OqP*U|$z7e`Rmp+F%}gX3kHh%QV7pBy?xcK#!_x zX%}aCIg5zUTIt>@ODkDQ405y$ADWBEJY(pwW4B4+i`e9aQTT^&uEdBIn46#o*)}Fv z1Nco-$g+$=v9clR{hRE1QZ^4tdj_+T{EVps2 z-Lh?Ff_L zm+#?jCaSGJed8!f>_$FS{q5O5{DpP(8+OGJ25()^U8C32rOO0tuW}-=B5P+kE9iG| z$aym;y(q*Vi8OBD&kGRfYy0hHeLJGz z;Zb?y-eb7YIJ(iuwK0h+M(^(=!hG3HD30=1mJ7w=%Re2l$RrfL5rBw<-_r>*cM|gyY+=X_*rZIipU@vT6Qb`he%vKhFel5H`{WbL z0uGp!v=XY)lJM$bc+cYEKttxza`fVFoteHcoRn0~PEnrwGi}>7T)UMAg9`@ASFGY! z5b<;$i*)V*Vh~3P(?Bv;sP{gFoRQ(JDP^XMTqbvMoYzj=DWON`s(geWbH#F+#bs7n zCx51)P+m?%KfNNpx|slfVZ-swj=M=;PZGdcTjfO{Ki0iQlqRF3D6xWfJ`T5H!_vjr9^zu5gFHN{<pYXv~%>(bmzP@>a8PbTFm@tC_nN%qxH9J12J$3u6_1ol&1V8okOZG;aq&qx` zIB#e}Y2qWnV^}4lgSTVJlw)Q2BbhW8>fkWI(?GMy*i`rUsiYo1cyeZns`1rMCzt{b_3nyJ+tLJpd3y_>`e0#%z~k`!R#1Ed>d<{F== zr7MwfNP;k7h4PEcI3&GaKCaFZNP!sMe2Ly}h0DE$GGNA3NmZJC;V(p@`UCdoz?5ge z5G(j7^=F|U1jb=O^$qcB45#9QejEsw{QOI#9}%Dp6XAv+XVxv|wTieQEv$#*Sckmq zf*=P%(Cm>WQlz*#`t+AjaYv6OGh$!Xn4u{v%(p|)CXI?Ld)6-p8VaPuf=lvum~kw( zmu672g=FZ1W<$ueLlzg<#5V%!O*qWX+2+qc4gw~TJe z*40-NfF#ofL37@QukTVR_Cl%|(X6HXQG<8iK7W5Feelw7*Xr}ZQr3Z!^x^X<#i7^d z!*4lhfUqpe7=b$w>63`Jwv1gUQ)To;`+Q~eNqreZ5ppCUP> zjUsMK-todGc<-2gZzv}0m)|x!DukM zyXn^rLq!{kMHcA)9r}{74T3WHu9RzhXHqqG)MH)!yv8(it_ZP&7QI*P|C@D~*;Dxn7{uz13F7 zbp)jb@k}_5^ziXQScone4tS7jZcI0R4k$A1R|Q$L&7$8+^($A}jVY zH(=;3XXBWIY!D9huvDT%>sU**ad$ADf5k#7!M1sB>qM6_op}7dE@>iJV z@9ogh{wBvFBWNi|Tu5EP|e!Ur_ev&!5dL`2POE z+WO}7%p3xgi+}mjL}YSaL1{x{ zD|~0y%-s2(I9*98jm=H?*7nZg(#p`#SVCgP&dyGI$LF~CjG5WR_=HR|bC)lDUu|qX z5Qtv*&R$M#aX?Tsg8JLrJ8*S%H9j%DxwR7=le!JxeXVEF-#@&tu=Li{Av!j7Y<#l0 zx#Nw#6#_oo+S(Zy95XpNb$onUQc~63)Bjq}lA8}=3UxyKw*Pbd&l&jNodL{HBu)f_ z7m=YyQUy|QQ9xz!32~6ofKbNput;L8gpSbuZFwX#SB6)<+DI}eSWzbFwpWl)WMTgm z=&?IeB963g1SUghXaWNs83ahgh!l$~7|epS)7KY^B;j4-3oS;&3BwR#ffo*pVvx`y zmBw76KnQ{IMjbJ}rKq?BNGON|7vieKL?T1t;zrg%qDHnx{`;y#h<}p*pZbrl|NYJX z^SAyVe&qk~f&ct8p%DR*0Riz|LCH=*saBzvjY5!GA=xTn`C<{pd{O00F_jc?wM23C zI0=nt3C##etuRTg5J~M|uyznw!&_3-RYJ)@LIx@dHV_hhB_N>8%M0P=lH__J!U+<5 z!Or)BjfaDogOib!i-C!ong&Ec!AwW{f|W&pgI$nc2rMS6D5j(VR@au+(vf}hM&+%M zmJL+f-CD!X=~bY^t6)c+_fD@vob^K8jKe+6B7AM5f?Q%keB&b{lj5Ub3DGHuQK?Dc zX>q|B5k8qAZdrj&*?#ufJ~laCR=J)Qxt?aZp3qz`(>$NI1^&h#f($=~=oLo3DT;bs z68pL={!K-aUKLCqv8=1lHfhd*cI2CPf3WENXz``UqOaJzuf)8+^gqg?ztpn7)aoAu zc?3lMpF*JI?FXt{2kQNXI)cCUMvn|9j!veH&t^@`=S(gYOsy16ua{13R!nYJPr&OZ zx0|Q7+o!iXr+2!h;XTvapQktbrq=r>R|Y1&4Nfc%jx7u!G_f!;@oj8sbz*jXYJP2I zX?pT2! zZSI_G?VN1yp2GJ|clJ+r4^H>r&U9REB#`FV8u^Z4xICfXIgr1-N{7pmu8;Je~ z@d}}bKTp5^JYN5KyhQNKxiM*!8wzE@?{2@ZNB=C8!?~l9j>sk`9*QBmQVFCW+#O10 zkRv;bnJpPj1L;RTx!_wpv|ZLjsjX(!7f>5ZYy->haJn)W$BX?*yV7l{u%nw* z=km_W1Bb|%HQrR&dxOY>x&5c5glPwp(rqh#DcE(st}HJ*>FsyV>x8CezBgx^PVmJ} zkBaF$5ie5q>NLgfwjUkn$E%y%cn$pyw7ll((d$LsK4i;&isHP+4G5mO9Qh|6>Yv}4 zwhX(YYP*FUL$RLmc^qZvM9qKT@BFfUq`HD#`rdSr(~vj#F~&xTX5$<)STaOWtm;z(wqnQmhz^nUc% z6$>#=4QhyNvz#OfpC$a-Gub6%#^o2@R0hK4ZGR=bbvHtt4xzUTpGZ;JF`uvod_~n% zl2=&7uYN}7M&Es9ym}9k*$gy)jBH?u28X~(9)YBqA8(O!ZjYF~qW$4EsJjtJyyLMn7Rk=dBjTKpYOVtw; zPMPb#v{hkOE@qus+F_eXa;|_Z2A@(+=fuoC2a565D^xg%=>jti(Pjy^pM0@98O)G4I_S@j} zX`bE$)XAl@gtau8-wBBPGl~uBt%xbrHGV6~lt(?}#H2a#jd8dM=^EOU^;Efza~$+J zr^V^ywk@-eEx{8 zn5C)C`Duk2)=iWL0H3Ge`-t<3jsR1*voC=~@?$Im_J9P{g-j32O#jFi!9g42ito&rMqseuI$-ZxyX=w8?McCRu*VdFoT|6qskM@r$#>vHV zHbzU0H)89LhQ&M>e|@ocnd+6m`wGDwvDFJpcG(*W1{95mmCAgHO^~BCcPEiHwF_0$ za19?vAr9a1WdrP|iUAtq)|JZzvZ~Y@JF1NNCTUponQ+ZqOH#8~Xy^6Z zhTJhrD0EIJXWX#{T`b+09(`HGjlI%Kxym?PC78MNWeI#&eto!m7Q&PMjg@SNEl)Kj z6eG%oIsDj&Mvt<`E{&H*RIROrm8f3#uq+3TvtHws=b+X16 z%O!5Av=ggeBY5W3MmN<4Q`LIy<4bk^H=m$*pA1G+mz#3`$us{pzTAf3nY$)_Lh#JL zb*KF+ztMVXP$RA1p2?>nMbSdF;U--Dr+{SW=-y~N#2iXCpD#4sPDfp zz8^Q3Zpv(*+~*0npMc^wXOE~K2;|*Q+G-+r=HDg{M7r;%I#`uNSh%7%XIG~Q>wXpd z&bI-}8O#LfU65jE9LZAW&URq(k&{gwDG+qcnH~)k2c~OJKz7m~O4}nL0In%>DN64&BYBm);){ z4a`?=Ys#8BvzB~Zox(sZ8*^~9lzUuT8E$KtIK}4!F|BXow>Py*nfki+1GBf~nHG_- zAVQ4T5e98^#lT1zv2H@;m;thyf-|WjNx}r^?+%Ws1#$fxfxDMRus(z zE+C$N9s$u!cX}L|&<-{zy_`Q!e)qIP^XKC0%CE+xccno;`XEYLx5wgHX3yy31P59P>)JaS4Q6yLgVhrCiO zy5Hji4s_3)^e^Do7uP&6-)m-ag%KyF4w$pmBNQj&sGk%wB|1a!aTn$y!WO3;xi_)C zpRX-D*?*2x5dKVZ0t`Bvdxqn@-Ya2}ZjY9*e@@XYd9sR$}QBxu*({-R{@@6 zu;9*U<40E$-G<8w*^9oEeZL9=WFQ!BEXHnnF-vEOPPmNi>&#nP`BiQw> z-tz3BM;ACp+XS^C_8~eirR#gbWvJKt`Aodyn`$L1rPY8Bp z1HmK`wmf+NMP=yE&- zkuW0pT=&ajllw4>#A3Iju;PJndzrCje3)_C@om2G9og|+9r2wM@jI;qPCyKEzJwuz zgkj%=(d>i~F$_4=^rVntmLhRpEOAjeak3E45XEM#BXMITaq}*5n<8mPENRam>A*MX zC_Cw-Bk61<>HIF~f+G1!Ecx0X`PMi2E<5?5Bf01%i0C$`@e+ze3BwbCp>;wr{9srI z$*6{~#yJ?KAt4rJ3f6Hlj$sN}ER-TA1rU{j+m=F-LkK*EG9T+BBmbN8L;siaBmeK} z{1E<6VDkS~f`fuWT|y#_BBE8IVnt%&IpPv265v>{REU(czqF*ir1)DgQ5_Kx6=7kB zkcfn^h^Vlrh=`b|n52Y+w3M{0tgNzDUcY|*=FJ;@eSJei zLla|TQ&UqjGc!v|ODiiYYiny88yj0&TRS^DdwY8a2M0$-M<*vIXJ=;@7Z+DoS2s5| zcXxLW4-ZdIPY-V|4~#K!5L`0NK_O$HylmBqSy#CM6{$Cnv*Tu++5ljI5mO+z)vl zNcrFIKe15c{iO{m#VtUXMwJ4$IdN^3kyZ#vFwInHZ8 z`OtY%(sNw(<*0t}uw{6^b9A?F68?31Yh-3?Y;JR6{%=kGM=fklEo@CMZqF?Jt=VPx z+%kOr+s?wu&f@Cs^7{Vj_k;BG`j-^It!HUY}oF|Gd1pxVpLg^$$CEb9a4vcZ1OH``>qn=B!7A9sEZL z7vhHF-wqH_!i8{tIREDSp6`C_9{wyGj7I+>oDPC9DZ~&_%WjM|G7rR~3HsBhG?k9Q zD1|?OkF@AtCO==n^E&G-C9UcWdUMINSmgt^7Vm{X8XI3cm(MPnt?M8Xc5u;Pznx#ng9F0(83qC>B8hD-^2MBN^~d**wCE7d&#X>uBWBMrwx~sSDdSv3s*$01A_xIiMmgWi81li(K{Q!?RC*g-E9#PbRsLphxYx)PQPuQJ z%oF0W&hN+7{=Ln+XSY|sUgtqKvgShZ{ru=yW_*jss4LM#o!dPB1&iP*4(=r(4&#xJoJ#B9w_<>YNOSq9S zA~BO72a^=sL75H>{X)Bkr>p-tEl~)#Z!s-$1S^>mqVbQIiDt&2+R?tW^o&_CX(4FKLI}w|O&07i*NL{RmCyK7L{MHtc;KwRXt0~-tSv^y|GK7Gg zh%BeXjjJrCwEb08fufcYmIpOfSL!OA4b^H&I0Ih6N`5hSnDN?6gEdehK~sL;MG; zA>~OH=A?g}2Hvo>$ZbOz3r`Af*I-T(Cv^5q$=IVXGC&j;;tmWdkQ`& z4i4+qIJ3)wff9ACa$2HCuD@U}cfxc%KGN)aXtWok*#ad!lDY|Vd;0YP=W9g^a0Gfr zBc;)F>K(V4>2GJ1Bu=b^!?{s|8O^^6Op5{yLn9dS-D1G%7C;Z%aLMHrMUj@Gq=bxP zk)fu<&7>vjpIAfG3lJqaN2Q9`*iUp9M}&{6K8bf@$qdi#lCSX?i}Brt&SQQVjC|W8 zO17{qq38_BI)$a+AY-GswRU1iEWT=veEU=S2r|r{-mfstjq3iUDO%`rk!aYH9J7A4 zGV&AQNSJ{ljgjXFcuhEuxV9kxw|Z7&Ik2^b=dn3Mo{--90rP!_(11^ zfqsM%BAqH8F%}{2bJ5b%De>=cnd8(42}wOdlV@8{X%gegxaN>m(_D8+s~JY*t{9V= zSnC-SuSX;&=R`ahe$eg!C%|otBx%`IqVHeBet+Ht;wTL9oNq@<_cSS`9x=aN!>kY+ zp_~ryVfMj3iIF~$N%n4Q&gA4!wK8z4Rgb#Q><(>-z!x#bQJot zi86F+ibdQR6EgnC`Td6`tN+f}VSEDWE!apMUBH-9LnFHkG4CWdp@Wo1L zFOnucMDg9jqASHv9IcbB@?iFId)rOCTd%|0?(A=0%CBL(cRSwG*(*GX-tiez=GOHq zt1qIwN?+qlGRS8vM>Vtkb>aGuNiMVyBft`u60)`IB+`8KFwB6dN`~Gc?1t1|K zagiW47(&SG|NZ7z{vm$;Za$t0F3t=PdoVMzBLjmeEu9uMwKO?}APE^KF)=fch@Oy` zj+~5{oPw2-nw^&J1rz-X7Di4sCN2;gKlck^0d5Hq0f>Z= z(EB~VcLbkzoPbZVpnsZhV3x@HJc-Z}NL0CEY>jeKnR;rGR(76ley)B|j(%~rL1~sj zS*BrSrcqUxwtj8xIO(1KDWNN zu)e>vez3f8xbppQb@Om-3$fNf=wJiB{~f;feP?%bcW?V(AAWcMKRVnwIodrv**`to zKl`!&<9z?e&;9d@f9x)P9bH_XTwb4D-JJiry}Z7?y1D&z`x~*oKuoH4h?>`bw8bJ8 z7k?MUBF0t3wEC|DQTFxUr>qIOM$8Z3E*Lu=hY<K zr_8-JyAWiTK{enTD#dfmWD@-vw?-RD1sxpLD))WuEl`uOB95L&* z{=y<5h((wBmFR^Mi^?E#*k?|yT8CQ(3+tL=)^x#;!Yqow;3g*3Nti2!NzRa5yb$$JvbZmtNu+=FMb=PeHpXNA>j`GfZxNXI%U!W?@>eaYf~$?11u> zWqPW%4xa4u8Awn&6FFb*5Yhk%FM-e-DSb;tWi4TI?m70r&;N3~{FaN5&2vh8+=O|W ze~m9qTXJF%6Ni5iq?@ID2DG=0>t^e6^kK@tiWfZN(VY~Z+|WBVlM*QAfFXOnNa~uX z+_mMZV3WsX{iMgX&-#t#I!T})_FIE*BlH(tHpEEaUbT}G!@Wf%+8HyHNF}UJdKvCF7V;QkIEI4vW27`)Xp?bMYJGPHU1G6 z5Bz8KpN?MzWjd#n=)sKzG>1!#tkQe67T^5U`M(XxapcVL5u0#Lfy2$@`w)@WPNJ%` zyQ7kcQjkldWtzIBuegQ_)ugT5)FjVwKoVyQpM@~D0XV=N5G%0u zkWUIODEkgI-s@7VIx!nBwmCrn%4%@dh)cK0w2P|HtRb*fnuaSh$|5v#Jjpd!Q%KT@ zIyv*vxb0N5gI6_0Ol)0)zo)3Dym#8v&OjlV%_mE<6NUXKWJJhySu!$qLLhxM^3htj zye9U5;ZQkS28oqUiF6mlWJb)L5Lwg69T$kwm?ng#!zRVJ7u2Pqgm=tN4BgXu|BOzk zRPmI>VB@$Oqm+)fZlaU)x}}%|a5nd19)^LjW*O4}ixSzZpf>R2Wx9?T=8-SLSu&F) z>S`#4926xP@a?)7?I?rU1PJ_LH5Mp{RvADZOdrklvZp}=7hs)|Rq)$+C6w`< zm2PbGt0V~u0k4b)gQ{7aZXpwCwKf;+W+AQ2lFVG35lJrM4z@17d678<3uRIm^Jl$z z{6uTdQl_Hf7bhGFFWPqaK>xGB_|J{3|DEU9f8SvIJ;#>e;2NUm0F;3OA8zswC4WG#;}TKHhpJ%ShS3 znz{eC4aUOzS-jCYGWVKru!F&uhmqD{uZ%Dne0j_q%Fxlv4HFGV{eVG&P)szAwMznP z2Fc;CNp0W+nK&Ka!KJGhbdKS*%&P-`hN*3N_F;{4_vAd{9iDc!d8c#l?r!3u4p!AI zx7qVxV+QRIS+d)ypTR$=ah~xz`T)}|%t(XfHyvKSKWRhQTNqb?$sI%NnwN39V64xO zj)DFO*J$IXT?PX2;b-CVABmzHc#K+|~MzE0)WK! z2A*f3FRiO{Ow85>o;xst_Pp;Z0f0oePoZRfl9CkI0ic_Vx`%8MV)H;Y@U<%CsFNLD&^>+W~0OxX?FsAWhtgL-6ToO z@WDzb)CbSdXviKiRuBQ&@KRCCDslG(TuecFoAJ>ThC&$cs>u6P80-O)CEO1IypSyl z*8jvzzt(_#pzrcM1E9p<<~EC}DvG8ti)IQ53WWj`f&L^)02RKVF>iq4Y={X1rXLcz zHOx_E7H5y008u^Aeu!7WK=2cWeKm_)0mQE_!Y}U&tI)<5I>IY~;IsRNA=`$LS(uhK z;HUxJoEXr;ToF$%VERGP;8~7(7a^od0OgR-u_%C3U&J;!W;J`*XGm~LbnwYY@O=n= zmA2FVcEJ5CehdWrH#vS~h!Qe|-=Q$>D{UW7Bs4l(0G$Dv76oR$zMEemn%<~K;9byj zkUpx#cI01$*n8XdhpyO1P;A$ZU>G?;7ddWaVN_%m!NV-D5)zHf7kyerP+W*UrUw{P z0?5J8UtffHgt%)^1RJabjftR2A-S4D0Zt46uMo7l6?D2vG`Ohy@d);yHuj#j?>-Q> zf&nqS5FBUW_A=lj)+p;FxHa1e$G|uYnYhz81U*1>Ul>3H80J2U4h;c>LICdDL5A6( zdLcpH-_UP6FuaifGD?8A7wBF9U>yMvzd>3U|Lg z4A{;iL#Vr7mhU}*=W!-> zW>&CxmXo2`d+}`R&MXqe>=+ftC`u<}h~qvy`!pjvwKL1U3J9~y$%-{i70+=x&dwXl zPRz+Uc!T{hHak7Xp^O9gwcIpTJ2%2Fx1B7jC?^x0G526UHykUkxihELFl#q5?>$yt z$7){Sm|I_LRyI!07isHIz z;(8ilM%rR;btKGROWW(qxEsoQ87cW1sRkIU1sZDv8*7D_Xos3=hd{MLEi}Td)xzym z!yQz@-Ic?A6(d4qBcfkMCP{~9Ln1!PM|@I?YkUQ3(=Ti=s;x3Y9(W4TX(uAKQ8g5KNDb;qvy0iuS4M z_UYP=>H5y;rtYcc?&-hPGu_fN^Y3cyoo)Xz_qRRnpYI-+?-^Y9{B`m3$kLbbDXt#z)hwXLspd|&JSzWRA%t#5s8V0~k7ZDVNl``GIC^xDomA_us>_wD=s z+UDWL*3l;Xcx&f)d-nu>aJqANwtIB8cl=}jx--F%YVlC{!aAWUL!(%|8T{(f3I*5xxR<{`}>E7yT^y$Pmc)QJwDw(Jv|~E@_)9( z|9t2FXN+H%j5ZVvhW|c8Z}9n9^fexX(;TtjDH%y-Ks}=t7hvi4q0*=}@k=S_%DUh& z4_M+zV}H9zQ-^?Yn$_C;E2RSDw&@SU%M+<9>T)t@wvViAJr(f; zxJdc>Mdh?% z?OQ2g)pfFMYGI$>mHSU@c;>C|rW=ADy}7gNyKw54jHbGTCBrX_ChFe&*yf3xpJ#g_ z0lLHa(NKV%6QPGq`A46)y(@9*i7{6!eBdyC1Lp$S)ioGKmPyD4K)VSeeZ`*#mpLM$}23X_6P}JnP_Q7UdUBJC*T# z-*Xf_bWn4WLR8H!a-I8_4?{PAQMatHyn#COhC6 zI~%PU#LO1*NlM=$2lLghM7{+_Vs+sZx)$A{?(3ZdzAsOevjzSqezT%|n2#oMn}~R# z0oyZ^W;1=&kvR)Y^WJ*+0mRj#`}h#OHgLlF`-Fj zb?*v?uYZNSPjaCy&4{}*0@WV86H{`T-I`$iTNFU-tNpCLl`W!y6i;=nA(Yh0Mka*K zvpB&f;KXDiv$wX0L+Thzbg*f8Lb&tShTmaL2YmRb)c9du>;g92U}OXH z*;bLu4N;Ku&Vtz~Pcgvn@?`d27rcEcCjVTBkxnwed3+!3yevq}Q_Ki+tvL?(L)VuTPZ-Y!TgqEo8Q8l4!XBlx1{wH`bbZb!;A74{lqQC8IVR3~#1aeiiX)81}l-dwlTh|E`#?QXbE?c!+1bZ^L zX4K74UZP-MLF@+1eE)npQ2TMujmofcW=<&l1kq;*R%QD^fZnWYVI6P}yWjl9j`B2; zN)j%UnK#ciSl7Wz+C6jo37bhIx`U)`u#fgqS>Sn8gUBZf*W~&Ezgw!o+NT$$+%((g zXm-k<9ZRXe^@G;w3I&TE{hq%>E1?sLP>j#pkMGl9Uoxwd?IC!fPeN#&fZ@R5M52a- zHC+U+yQ|U3t)5=Z^?>=j5`R z!W?@iG5k`O8l5fDmZKaG^X{YzKs>=&GaMMg@V>}Q1Q>;KzfYv}b%);MgMLV0BI%IjEsJt|LLLQQ(;dS0Z0D}PuF26Tt4EV$+y9D1QDY{l)ST8(~fS^C;fuS{FC@^%_R|qvw2w{u# z*9ZBMU?)_@I1C4rYD6BYg$pJfGxWK`P6+g+1i4yApjxJjfjr(PJ_+_^SV6*eQS_be zz9)FsCtb)K1eo0nnqC4iMml(ufDyh9E>d7ql)I+8LyQ<@t}pa94ig60hWmO_M|xlH z^q#;%Ix1<7BD}vR0%U;qFcwlqq(3h4)QZ4RgTaa?kh`c*c3pzLoiK!B5W#={%az9J<$M3 z!ws<=gVW?ECUMj!aZM%hd`;qJr(v*T_yu(l@lO_0bYe+EiiNng)X*REkzBu{*d_0# zw1}MBsC1)rNNEPAsC-Rn7ZFrkM!w{k2bX7e72jjfC_@@&rD=bq|4v9IL#4Afr!hOi-?F4r%cbl4r}~z}5wK}g&Gen1 zxOGArEu*XZ17ukxy}fZJP^^ZP(eI%$V;^J&K5#F^XC_BwcDcJhmCuSTqh~hK0vAI* z6Pd8=+4eKt6QW|@#(ayJ`$E;BSD&5JrUp)5{L7vAOL zJzAGWMV5a3>wQn%v=bz3T8G|T(e)SwD|Ls}m!;#_Ga>0YgSz!;GrBnw{yAN`8I4oV z)uz&xro21Y(^PcRSEtgQL!Nt_OIw`EeNxLxj6&+^zEEQqJjr^#U-m-&Tq=PY`IQ=b z^xy@>wAtSkH8qGAB=G{MsLRMs{*ti%DPsQv0o#B4(7%59pJ)E#`agIGc+S83=$|`* z>;LtU$=}cHm6q-SPKe8LwF>eT%8G?ol%F9~6E&_zYN?@gH2kh#bJy2)x~Y5rmY&HS z{aYpmH%)IEngL;Gbl2$C@3?i_{I;>V@g0jhCKjfqmS%VFnOoemv;<})?*qe@gLi_?T{=rd!s5rmSbnnRAN6CecB1_%Subt6vozU-X zLmTghe6mEf-hJ9(`n1b9xX&nf@Mh4Ee$a?P&@gbrFbIDuxZm_?_q~ud8%&!crr}|D zwRc2CKvdb2=#rr5;^63_r_qH^V}1wfuLy}L2#GBSjV(aO6@gpZp?j7#w8|mpE z?He2$z>njHCx%8Q$0z4z=H>xS^up5G^4jLc*6#N1-roMf!Qs*I$q7&c|J5G;-5CC7 zb?^Uk_X8F6)qk{_|5Vfwa6zpmk*fUm7&aN_zbk5uXs)lsJEaB%o@&M`uKce<>R=x! zsb3fOKZ8Enz-VprRoGJpCUIR)oj5+-{8HDPV2rR`<-mfs*r+{JwUHfPTkU~KA10j z##;JjVL*~k__@({;c;pks-?6Xt(8MUX9_LvTEAt8=RdYd=l0eeA>1T!&Zd3a)Tri7 zf21{%#7=V;kob-QQw8Snr{?m`QL!K{-IZwjN1DRhk)_?G06 z|0@1`4yJ@({R3i+-x2PyIvKLbKFo7#x4k4ESyv^3m#p(n$6tKDCePvV;#3|fc`)B% z8_Shs#(3c*2%cxg#3XxP;{$V+A*Q;^$yk)*p%{~leNfwHh}b~QLWbUZF~f(p4StC- zSibb0Y+mH8X!SZSLD35hT~o9ntn)3j>MY`#OORoxP@JqbhbB7~P2aGjJ_HvOQtwF= zURHl$%xTgi$wD(Av*p^IG?U3_*xjt)S zHZ-{rE4xMqbW}9L>Rbx@g;q(;qM`-%!W;e$JjOuDlHFx5w0j{mvTRnob_4N6W4{^r_darO`_AU9G-R^h-cU z%1uPeQ>rFhsL8z*VPWSgt;woi9na$S!_tdC#kI5xGT&`{(b&}O@fb7-@)%h@n|v_v z_AA%nq@As{xSdqDaZQpjr?=k4qt_QQ`Bk3=2@GBdoXaK6J~`Pw`GSH-o)R#u4^QVK zMJrAhV&!*E7ZbH5zb>VkKK#0z=~(e~CC7K?>nb)v^4nTr#=~#xr6m>LHeS{4eA}$- zl>EL`J@N4ScHL^l_noGbo$tFi$i*MTHr7W!_PRvh{Mhf4-~Dlb*S`4kaMbkC&!b7l zH$RVOeRqGJ5F##;PM0zsk-n~#ydizts@)}hCw5-^_2Y2j(XXGUt8adhew^(7`UQev zK@c4rIR_C1)x(mrcHzKE#1MEamQqxwnZ}$L%GQSk%Xc-?2N2PGuso=?P76~u5hJFT z2Po58SQ?07Qn7h3N1axVX=1oSUmpGMy$;`q5hMgGA0DC8Ccv>5spD-Wn;P;`NclD*H-{T9njwO8~D6otx~PI2SzF4Y=zQ~g$#oJb7Hy2>9T)`Uj?j6MuWfEHS0XGD3ztWvs1`dG7Zll_hb(nKF4u-eaW&IP||4NHKUSsGUwf0 z$*ZiZyeL$>N7nA3!E!vdbJg7X{%OU;^AV_4^5vzbQGWNElZ2In2GT)FDrJFhkLE#N$#j(akMFW5D^-o2EO z-j{q?hCz2I$6@fwai6QztL&?6@W1plG$24vlLUanTCzv~r-8$ZI4Ozu7sbmZ#a>(x zPL&XhKF{ZWj>}n;-BN_rNcgO_(3vZOO!9(^mjvMF1sFsG7zFw0`S|I%`58C`899W` zu#22!7h~ZN=j4{;6_6GbmJ>avC@!G_IH6pU(U6tXl2g!DP|{UWxdGU+s9rU=g1CuL zH&WBMrKxpC=epT-y}Nn_76yj*3~$}PWo&)N)Xwy-{ap)3ODkt9q$|?)k*$NLy_2`& z10N?BzXz`V&TfHj?m_O}q2B%xenByTsKj7&Dk>rq6Z1SQ4jZ0O5Rq6MnOqi?QXZZ9 z3W%uGSCJ{N!&BabrBtF*s!=KR!6_e}q%`}cba|x=x+YIJCC=I>&eMMbz|TAroQ(d`f5J(*L>`+{WwtjX|N852ihus%^v=lK>U3TbXopo zGV$*b#fFvvFlDEKe?;f{kEt#gJW;*S^fTeg9+M`CS?_VU(TD>*KO1HVdjUR_J*@kwJ&X( zpB~}upUJ(Rt`DHwt)J<6zp3_gt0kH{aF&pL#>!XAI~zBv74KjE@qU~4hF5#6Nupdw zR|ej-X)K&mtwC7l*&|A_i2jTHlecklV`up+)z?6RFlD^n?b{k}5DxiK;G#vsL;9q5 zz4xdH1^RMkVY0c%JtR}N{Pxk>;*BMc2B-9-t6-c|hW)38DjohAVX_2;=3tgf!{0q5L{CS6#)|MBFBS?(;<) zn4L|KUAIfYt4`>c_g$JY9_dS-S@15+gA9%6RZm`KzUe#D78oaeK#h{_RUdI-TvFB+g8t@8TJ4Oq}#-V(c z)dKQPhL=8Eup5-Yy*fy!wBbmhyF9$J-+TFhKEp6-HUB%4LX*80{ac=&X}celNt=fw zR8&tGlr*LnVQw&9=4G*&)P*DEq&++Ql^Kvm|5PKFmz+#H-#vt?0E4lh+9vc}tn6^1 zXd>y#q*y)P702vr{8plyrm%jpm>d zglT!aHV)h!HG+5Y^jl&+bnG5C~jMkBfPevXZm~eQmds%XnSx) zYN8jk%QHm=s*r93vt@2&?=S=_X{8oVV+QXoS{Qw;AcJ{|G2GlO&{tjJ7y5R2iH&p` z7^^lNBBZtafPZ~5Tq(UyGoTbL!y5&;kjh9y(IUx&i_{ca=)g&S6!xuF1S<|($K{Z< z213_66>h0Tn_vq#6ho+3Y4Hq!Kgc<+$Uv_u=-Af`o%h8W@%LOe?CF|N zIk+as8LFr)o1d4bGQ6kL!glWx#v=|vl8Qu2bt#)Uw2eFvZDLp$l-v~ zpxSPnkz>X(w-YY9HyWbUO4V_ngeyZBw=Af<^5~0B!#=Y;v7mY>z-`Ay$)TsFM>9Cy za)NBVl8NGt3^04|2u1Uh6B%wx3GxQ8T~gkt95_=jPQ8TypKUoz2qK^v4xG@FuCvqP zkn=@)*DR-o*}^lnJllxQl!C2klSwshlMYX%WHm^-=iT=|i0J%t z$4Lo89|XBq#i)4A{2WFf7SJ8lc`EPQ(5q(V54`@V&2yc9#Vb>T(~}K?wfG)?X=@5U zT^i20*0eT~%TJRzAj>QMce`cawXS;qbXHc@Xh|6Oa^H}(amKh%fzQ#)pJ!a|CL9Y< zmA-$i7UN=O>pk&IHR{b%x~)EX&hhr0t*Xb*UHc?CC;H`%0i&EL$J-X~3XYH7tHx}( ziOTW)g;ycJ$;>DKuYMxC_kS8*{ih7)Uu33qx3qMpv`m|fEKc@v<7K&ba)4E{VG+6R}r@PzKcnV!Mv-odFp{A3>+aLe0KT>Z1oBoYX{|zPj2e1A+Wajmp(`Md}F(khI#oEOCT2FbdVkqn3OIp!l z%DEDCNwz&1QrzF3Dax!Mf=~CSX1m{&48DN;9OAsraKFu`J$U=u5zI;}{IKQqNLJ!q z#o$eBe=CG;4)VCqlI2h|VXp4s?8mZ{iNxH-TKC215A3xS$^noUY3CiK?$x{ch2$@> z4nDk>wKZO5@oHdhz_tW6bw;oL?Q$>qyxUCEh37^Qo2fe-A85^#OTT2QS(F&gDYtBH zS%;nQ=Qfm3eywU{iRW(e+iJLHD}TbL?9i2R{)HtmcYn2Sk{hFSaIXJN2xCXg>aN>f z*x@S@9p}xDDqnZEUa39Zk@_s-G`?{4<*~xPUBFm=du!jPPrt&yx)*TCe!na`coA1! zJtWy8Rg!qM4~u@LzoDnWsYZ&m)eoWOuI2Hhr(c?l7}8(8={(tYpr+9EwZOm!{JOPI zX4`e7-;w^T#&o<&yh%=kkiaV3Y-iGT$?D*VJfmH55a{OllEQ;8sm8}8^s-%d&lo7q zBB|-*rFfVPF5;XtIFxVbMkJycX;K;PP~|PgClj%^b5!t^GI@v}W{a8X2hdCfy?;WHMnZm;aXV&RkN3VqPn!*pxg+iz*!#Ogf@sI ziK(sh$hK-y6s6u-DSvs>OxjCdWgn+;Q)v)mOJ_l2eLFj=Ag?<{2|6@Fr_VS*$>0K3 zONmdud)D{dD~iVljuAa{=1yK}A{>G$&L3L)mF6|Y;i_LsY3?h20gbarH$B-{_uaG8 zaMmEsHcrS-cAa^o_qKs)>UE=*gva#{4T1@m@lP}uiu>Fn@p4V6{wtCnkTaIf_(B!i zo^vnH!>?SA#w;S{Eo~W8+mF5usCTM)CH0-6oWwj?&-UMmqUkTt&lTd9WssdO47aR; zM)<=&kw}4X11(=w8Ff-2#dG7ukE6s^BZF7R({xA92@w;0g6^HPuNP^hRw)ZkNXkX` z%-~m+RYv*=eP%L#a`@B>i7LlkE(t1uH5B@Cv)+rTh-1u1+!)nS(;Vc~RaCZt`;ntk zy5t!@iH9>?W%QSff~fjw1fM7Z}NS^IRL@zb@*p|2=-NY|4)l?2l0 zUE4}HW-2?}4V}1tJ&)ld$Iz2e?Z-K~zLZO}AcG*ss$*Mv@|@&e;Kkz_H{y0no}^`&lxR~nqt?nz^(L&C4^ z7&r)Bg6b7j%Cs!2+#`H<=vh4zJf$2i1rOP4NG8YMt|n*m(tO5!(>ft%YcHGRA5mV@ z-S1wikwrbYk12iQzALE1@s%vWi=bz~>(_Y)rk?Hw*A@sNh0=@bY9cm-maZM9 zb}C!hCWNTd3v8f^)L9$wyOGYwwv-4>(QjQ5P+PV!cM)0b)27>cGTdzK#X6T3FBhaG z^Z!@_%ZSr7c=ze@n>0t8)GeH?6nnsPk_x@D()`=`OPNG0GpzN5JJ<( zPTH2L7Y&~?W~7VLdRH*gS9)IS|I5x_7ieMnD6dZ&?=j3OWXNyk_?H-CUwtti0UoGgI9H}YTQn^T@y}+HJqj~8SBFc=I-?j8!Qz)1}OtDX$DV|N| zF?Q>oeq{*FV5ugb!hFO-=#t?6!rQ>dpNy#8o?y96QSH1KkCo`cyZuu^;mllB@1iH! z2Uo5gq?6HEshO@0U@9u|7@n_f4J-`3!*%3A=A1UK&kx@}ZO;x!?xL0>~51gEQJ3RSeanE^rdUkVj ztEX>pd3m{}_CrBoIp9oPTv9PPHG9{>>0Nbwdq>Yzb)%0TTLwv)5(;pxxl*tDSF$eOwjn|t5)0QvA&l9rC?@$pG0 zI+j2nJPnD_(7N5z(*syq1GFmOe4U>80x-GW+1YvfuEEz2-P1eR+|rqv_PoB~!_Lm` z{{DfPxf5V!?dvk)>cB_BoMJfg(x-b{x61e0u%s6tVMG(?^`Z{_Mqh3SN= zaQUp^I#9hCZfr;$f*OdLmsz^YJwuI*j79Dd(*0N?l#O1_wGPhTJQT)4zV^BQnPfA0 z6B^>~o*3%%1tJ6ErZuq+q2%~2;O2hiGT+S2gMW@~+-VMDAn{InVkj36)nh`xr8Hyj>#FORXM42%md+LI#>ewVs8b9O){Tn|+Igy+a;?g+R@A^!=!* za4su{G&1P^3jB_co)j6`LpOYmCWal1qv4jog$BruI|*tsct((c-%}+b(6r}JP#QYq z3JxS-mYDeHYshGhQNKMZN-vk`=J9qgn}soPeCnKX%t2#rip;U+r|(e zRwiMM2=4$hJk6ujphlaTuYM{Kc%*of0_2xKJ5`DR_7P)1iMF_-dNs8?Izzw_>Ra1Sa z4ul^L0uS#Lry0Wf*Cn3!3;!T?hYJWH;+xJ9)xeUEzrT)M9Cv-E-^fS+`9i$=B-QCb zXUSojoKh%yDNaogc+GQJ&~)yeCH^*4AB9r8C_9HUBtHvs>H!Z0Ab^zhL8^i*_VqCt zlTaky8Ye*Tt8XAnw$JY&g&U6LuPBYMEtHVU_GzGDB_zs@G7(g| zK{fR4`D;g3N)aC>24*u#uv0IBlA0Ryje@(g+mQj~1--BamG+i=R8uujw=3vOu^w~Bo;XHPYwalStk%!x)Mi0VrgD;TP5S+>Y|hr08RU2qD^E!Q}D=g zoKO?Koui$IXMdf;q}Z}H8hJwzA9sIhR`U}PhS8nc@`+ERq{E8-vuBk!(j zW|b&HR`BDHR4gR6;EJ4Y`b^Elg7gAj?)Zk~(z0!4o z5KcR(MoY8TU4P*lcuFWWSvWUfCcQI4ZV zf!2okE|Hu-@-FF8{vT7cXm!Zg)1!18)ki34yFxFs_Ta;n4)fq~rJADG0Ri`aNefz4 z=SWG|aV0-hGe-+*vcr>^(veMr(TXtHW6n$|>V#p#A*TkeGrt45W7v7-r-tR2t3gC^ zrgX&Jk%sh$(z#_6Qx7)s;m6~eMe=Q0%S5!$lMwnkx}AQhMzYV6q0rdO*0Y%2S@#eE zwPa!|H`s$hlsFIR@85|-R6>+zvGjTbwKIoss_kr3RlZ8{vxPVc`BMCC7$7!mjOtkB7Da*COmqX2<1^M5s^SBG2k%i)hDQ z!W}L<7KXdc*R=MM`k&beU#zb`$GD$z4z_qs{%`UT3M5AfYXI}DlBxcM`2fHN0JuMM zYyi#xkRJf}0Qd#0>;RzE%E}6W+W?w|NFKMz2efq~)4shP>iNnjZW zFc}AQmw~k&r>Ccfhli`H>vMB+&tDV*Lvnrr7@*~>dQ~6jI!{c_0FCDlA6tb)EME5diRwj7+?G{cdS#1z0fR?Slef+34>J@b*(Sw(fE9831nU?imP+NK8t8 z77!SwfAik*%35q(y6z2g)vGt-5;DRg5_flZ0R)zjg%v%gWMt+6 zP44OG&%nx&oZO8HK?M=Q*HRZd`UGRypcsfD1PCXlou$*74}40?c>9!Bsw;+;GBBkbO<}k97t2Y%H!n7K9=DcH0S%}+T5LE0%E~! z{NAHUMY%lN_aWNzA;jhJ*(bDb?O#MNESuuUI`W`|7^!R_kxENN$yd#N*_?mJLb|0=c2kkQA z6Mbfnq8-e1@>e)Z_N~_@?ysM#vnsZoZz#F@TrxfV1qYQo$U2lMVD{x(pUn$udn1$g6v(Z%IZ4^mQ_RNMB^^1Zn8HW&|SN8O^CfSKX@8!xK{o}q$wx$ zR+Uh3K+XOU%ZD?fii~MXdo$B&!XmXvG83XMonfB#q^_l?A*+0{=}UroF#`{rWbX;;*!to2s#7#@rQlaxneW{$6q#w~rf zk0y{27mg?GGTe@*oJw9FPrKG`AJ4dVUO1Wco^U&v^ILs=LYm;-f>VJ5e@{}L)g=p~ zSA_qbq+~rrkyA_IPnS}6fBG$@IabuqX1pX|*q#BClv5cpz>ws5q9GZ1LG4b%co7Ak zChIwv2l?ik)r!Dc1Qw?bPrQ*!Ms9^eXu=wSNy>DKA6POb8W;u#zQR02LDdUPQhHwG zvZiFc07BpnxfDRnY?F_GNlJ@rC<+QmR5*h2jDmYJIkIpN$U`yA9dz6v+>ahe2-PHt z`s~^Za@M*euxtnoANIvp7QPT+43-84Oj7dSLZ8#a22-V?AXkuKr>?*x!*248C`86N_$a;vH8p; zI_=`-d(mcn`7E_v?UDg|F-Ta!b(nC6^jkMa2R*^r>7ov~;<&hnv4T_6>RO7^d(LX= zi`*xr?}4v;0;-UM`!-9Ly11TGxZYANysS&BB|0fSb}1bp(tX_^IXS&=>FMmgwtj&0 zgXcdA#gv);46^;5n{NZTS@>UaGmt?6CWeFSB9MkpPEIy9HVzIB02Tq@7yvS3W@ZM+ zc|c-bUtb3jHjt8+mX@}+cLCxANQx5^6F?dRvN(`~=RVH^S@z?n=8=(+$37v+sW}S^ z%URC~fOPBP=D)GAX>{8fNWi(+lKz3=*A>+OgW?|;77`juB<=&G2#}H=xcH8Yj4m!N zZf$MF>i|3A?h%xkmG|OBiQA(9ch4ZN$H9}6Gd_Ny0Kwz< zz&kT5{{^-rDLD&i^YG)RwnrX86B9H4mGjDf|7`#HPvD>DW*bxt>v;i~RHCg~0*A(} zHmAhG-z$NXWXpaJvPs$Yv}H01=%>?q^iYDNSM{?wpKffGR+ikzQ%4KDo~kSvN|eaj z$+`Z%{7$O88%LV?;kxb{m1mN7vJd$>OC5vEEorKSEGn*1hjQQbS{rNhJFvPuH7+`w z=5;}R*(GCj5_4-lotZ6j%i>J}r|*xl{WqU`Gi6G+#Ir70w524_S6G}L^h8Ae)XM$N z;(q^?{pH?V{l=Ht!^!&3#^@eb&R{>W7k^gGIo%j=x&JioUSqviKW32SMB<*3&1a4g zNfwgq<=OSzdn8t$AASzwJ$)};-oKwF^|)&N&1$TRkMfV1B8Eq>8`Um;qn#mlczjpg z(wY6XgiEoSIs7{JLP#GplhF(&PF(i;VJ!S%Dc5}R>@$Ko=0k`h%4$r{c1eY}cCgm1pi9=T>vP#~-Xd_gg7j&3$sbzWM?M z7B9V{kV@1%gBB@Y%cqr8Q==D=5??P&wORpz;mn5X#W_CH!$nyE;v1!f>V>V)%ie10 zWv^c1l1Kwq6Qg)Aih=UYhXln<~pd7f`LqjA4et5XGB#s zYO*Q9qAH|@wx)n0LCn;z;34mq(k(=2OsnBxATnN9< zOD1hN-}Zr$^_3Nf+;1=J6E#;Q0(Q{}No-?w9N%HQ>k7xf=@edpAna^LdtE{nXF*V@ zJ`{q2K?e(>u)y#+bjwaO4TE@{hN^mDX1Fj~nHh;gJg>eXrc>1yK}n@{X1ltdl}-&e zY8;3^95Kt-vKhCueSLodd4~JXkxvJFPk?gF21E~H{+A;kIC_Dj8ep^mntN?+4Jgfk zLl@wYfnyao%YkeFR7t>z4xIYHdH?0hmp^AekRLvO{yaTB4IKQy*=b^G-`Umo3D^4i zb#-f7=i=hZ4Fe02b4m$`Sz}|9VG#+y!4DkpE34~3)!B3+AcKd;|FE+1iaB$?2 zM__%!r@FdEJp;?ercb~+N6AZS4o==c_4fi>l#rASaN^C)?eA+Ev$FHX#-@NQfwXp$ zki7b?x}o}g!~6Gj_KsdaY66NfAX#;F^@@lodUyo^31MYr&Br$cKQs!|Vy2 z`1pA4i{hrHW_}?#pk({-p*6qYrJaMjf=xq&q-n3p@bWbpi5N1Pz%a7bs7V zGWxuNABYSOx`E=ONM_dc$j3yHv4bd~?np!kn4AkyxnIypPesONrq72%oPm<%7+bes zoyp!Z35XdnBFN6tJ#0+9MraR#lwJHN;on$Go*{9o(0M8}Y6Io)KzrURP+%lw^dc|C|@yCx?-+$)l&JYwF<&cRn1XZ z-C0?~?aDQGgqDYzmY2p2Z;hLeHH^KlnLXCF@X@*FqkG?1&(_b#(ckoe?|oN4d-q^h z4~&<0%#*-W3>updTa}$qogGu3g=x%0)h7qOi}8Pn_Ro6~^vo|f#VS;_+P>f$dw1-cOi+8MpSG?`x6kGpH+n^kqr+Jp4<)#tUCQ)@}G4=No8eK9zJ$l~e zmDlNC*cDXLjegl1{&p<7elDtMDeA*&)Tgx=+(tsndRqHhR_EID?)BWB4Q%gLUjJsn z;8qcSyKH2;Vr={U6tQV`zis}gd-0@q@pxciZ+L!d>dVs1=Pv-QG&4N|#MJc6DT98Yf^1J`q#$6vNi2-~L%+b2sq z$E!Ps+q*>I90usS-nRecL(yPCWj8aQfr$^vBWPJ>cJtQ2$WF0^}i(uzq)dfp+d+yB`0| z(AV#K0dV(o{XqT=_W!O@$eF~yK(K#X>7Frr^hc%e*Vd1}_B~R+wd#yJfHq({D*y?r zg4f2MsV@YYhP&rX?u|HLTI)sx{ak&CVZrt10Js}_37A3w#LM~7;`PzjwxSGH4JCcU zk`}#ygcX?j>H#FI6>|W%d#m5O^`IeOBa>ZbrL1zk^>?$audZsbGg0tHZr^0)Td%DF z`)tj!cdLU~jTj#NhU)c^(%Ubs+yat|y>rAapE>!x^`p*f^K*Y=?e3R`{#WD%O?4g~ ztz!NSnlPSTVBg~l7+Uj=%KD^HN8pL>ZDG%SJ5nU?&5uoAfo2<^Qs4>7yzgbweK7Iy zW6<%pg|i1%248;u0)hSRv+ZsPM2NEti4sCLyV0m-Vl<);x%z|Cg9vhK|_`NuBx7x%j9CV!au1V6#C2O zXV?aB+sV+daRvC<1!}M;E~o0|X4tCeUpWI4_vP~wlERIe+G9*PvWn74m_2>vW|fp^ zcF$Ss@Kho5!WcH2NSmPm$727b?3KIB9kPRyQ_*u)<|3ai>HK z3kO)rA=4To?t>*4iXDhmJ6B|@Kv5b=(#)?v7yCSYHG$hF+O~tsadyu!t{fx&%KgoN z!ui)nR4LK%Uog!yOrJQ|-Kwg1ZrHxA@#%_wmuaq?Tl_gV(yfNufK$?+kb8cFF%XXBE*r03!E=!*f`BY3__5&v4bdk1YD#lCXw}dtQ=^4F?i0fzX z`!5pK!cPN=eu2D$0Fw#ny8J^jVxv#Kd`f0GA0p{POsbJ|5E`=gvTq^Bg$DtsKb}e+* zh^-QDrNW^ctxx+X_}0pes5Des*+~n~hzl)z>T-OcEJkpQ;v^x$TxXtX-l>>I}k# zAbL(GqJ{!831V9~56wnVu_^3Dt1vH~)rxHUxj%uSh@M9&80XTfnZ{g-Y=%aOg>yus zB4skk7^=HkL|XV`q@Iv-7Al~b%j(q52gGyO5?a{@kW^ZQ%?wLy0wSZRNDqQK%(?9a z>9jLk19maK?V0Ub`8=_|6tm;mM_Nr7q7i z8GUwaQqACNaCcZ<-xpE~u*oBT-?zLF%lI%d?nb#a!_3$Nf;%`nYp1Np)gK6dNS z2Unm5eppIhE(_O4q+msoB3H!99`v}dTzod>)XHr+bY0iDAhW_9&7W8YITRLPu{3O> zIjE#Log-&H=%rA*S4C}#Qp>l-x2a_4(wgR5Q>Rq6bDrGQe_G7sQ}hf>Jy;nvFlUn- zg#=$HL`KSpwQ$Y*wX@S-qA@*fIonZsO{8*&=5DTanYt=kyv2z2PAr<^wG>#+;d+E# zmoek0JC#h!P_!}SP|+mj+;&G<^FmoOLw{mB+jPYEioML^8n)I8alSFqP9c$xxxd__ zxM8+WS5q08R$zXn*R1(r1vfGB-`n??)8Dbe1*sqYtnFEN`L*)|dU~wEMD=wLu{7=8 zy@^;W$19zP%O+LvQxzq31^Njb&>f1Ua!#=7Atd zc3J)yB`I4Lu-wH!8<$*{$y?xkL$tt;y=YN*Gs9ZxHP$vmjO1rQ7F{f}$kL53E}8si z`qD65vGYiSx_PDvCkn=)F`K2rn@Np-^YPY~E-Bl!Nmk8Dz zZJ~)e?X(CQ3Ku@}mF3{|&AJb~RMw2B`4L6kAp4DX5RqIQO~N^FZfZ}>DQtMu-(x2eOe9KaGxd0;Ke#rFOm zotFufD-@ik+-{L=IsLa+)tk}1&Tvg70gD90qgoa_cLBC5j4@ZF0#s_&LM8gJ@pn&| zIxap$3(0PW8wh5yV_A+$yKg)1b+z>Wnv~|Z8M^k=vYN#V+jiAT4Pv%M#ywF7sE}sE z6*Uz*f{la!cjBb^%X1Z*t9ODhdfM-D4~*gc z{<%N+bok840mgA~`Rc{e(H9ezuRbMj+WvYo^-`N>S7$_dLG61=Yt~I0ELxhQDO_K6 zl5S@C&3Wc#tVL!B`+F&L!uy>-abrs!7pXRt9nxOBFRqn$!mRj;`c@D7GxMMHTUSezgJ||!?X6nH#2PL|LZIO`2AR6aN%3uPm zbK(`lO6Y1v@Mej9jUl)$6uN~%+3|tdRuDdiRDG$GXenBAB*Yd4xl!ZVF@_xPy#D|R ztwKR&mTAI~bT%mJ6Fkk8W0P7`u(?mj$e7;95jX<{UYFC%!96@e&h%VZ>2b#2YE- zhYqS-9ms8HbVy{_%g2%Fr!eiKp(f2cs(KCx}#8l{7u>46hJ|)+jw| zK58vp!*Xo0FssFl2SF@*F{^&i3PW&~VOj)|j%Jz08U-Ckq>zvdE+A^F4jLq$x*A87 zN3^LzKq?Z!*9qxaAX-bj_U>5V^}CXK>kO0H==BwbDkNCRFZ^_sA#pOClnDM32?d%h z&zPYZKGgk74C3w78h2B*{U4-*vf~zg-NmS^aiVAxeIVr%bY-?RJJ_T$JaV1k9bU5u zOdC$B1mk?D-3+M-5XeW}R4sq{7Tuh9uMGVxzDHs7?se#QM5<(5&M5V>2@u!;1^tDj zbufhFCO!**275^5;vVEal**}c%*c<*a2I=VOAGpvoffG>Ygh?!o#Y?Rq$aF_LlLeS zC5 z4&f2f5aNxezT^|?kVtRk@I=HsN3i>%0DFOQYi^zUK$=y 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νG&sQUBBXx>H@xwG{P+QWW*`SBEG&es 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
    +
    + + + +
    + + + +
    +
    + +
    +
    + +
    + + +
    +

    Site built with pkgdown.

    +
    + +
    +
    + + + diff --git a/docs/articles/manipulateWidgets.html b/docs/articles/manipulateWidgets.html new file mode 100644 index 0000000..3a2582f --- /dev/null +++ b/docs/articles/manipulateWidgets.html @@ -0,0 +1,321 @@ + + + + + + + +Getting started with the manipulateWidget package • manipulateWidget + + + + + + +
    +
    + + + +
    + +
    +
    + + + + +
    +

    The manipulateWidget package is largely inspired by the manipulate package from Rstudio. It provides the function `manipulateWidget that can be used to create in a very easy and quick way a graphical interface that lets the user modify the data or the parameters of an interactive chart. Technically, the function generates a Shiny gadget, but the user does not even have to know what is Shiny.

    +

    The package also provides the combineWidgets function to easily combine multiple interactive charts in a single view. Of course both functions can be used together: here is an example that uses packages dygraphs and plot_ly (code at the end of the document).

    +
    +An example of what one can do with manipulateWidgets

    An example of what one can do with manipulateWidgets

    +
    +
    +

    + Getting started

    +

    The main function of the package is manipulateWidget. It takes as argument an expression that generates an interactive chart (and more precisely an htmlwidget object. See http://www.htmlwidgets.org/ if you have never heard about it) and a set of input controls created with functions mwSlider, mwCheckbox… which are used to dynamically change values within the expression. Each time the user modifies the value of a control, the expression is evaluated again and the chart is updated. Consider the following code:

    +
    manipulateWidget(
    +  myPlotFun(country), 
    +  country = mwSelect(c("BE", "DE", "ES", "FR"))
    +)
    +

    It generates a graphical interface with a select input on its left with options “BE”, “DE”, “ES”, “FR”. The value of this input is mapped to the variable country in the expression. By default, at the beginning the value of country will be equal to the first choice of the input. So the function will first execute myPlotFun("BE") and the result will be displayed in the main panel of the interface. If the user changes the value to “FR”, then the expression myPlotFun("FR") is evaluated and the new result is displayed.

    +

    The interface also contains a button “Done”. When the user clicks on it, the last chart is returned. It can be stored in a variable, be modified by the user, saved as a html file with saveWidget from package htmlwidgets or converted to a static image file with package webshot.

    +

    Of course, one can create as many controls as needed. The interface of the animated example in the introduction was generated with the following code:

    +
    manipulateWidget(
    +  myPlotFun(distribution, range, title),
    +  distribution = mwSelect(choices = c("gaussian", "uniform")),
    +  range = mwSlider(2000, 2100, value = c(2000, 2100), label = "period"),
    +  title = mwText()
    +)
    +

    To see all available controls that can be added to the UI, take a look at the list of the functions of the package:

    +
    help(package = "manipulateWidget")
    +
    +
    +

    + Combining widgets

    +

    The combineWidgets function gives an easy way to combine interactive charts (like par(mfrow = c(...)) or layout for static plots). To do it, one has simply to pass to the function the widgets to combine. In the next example, we visualize two random time series with dygraphs and combine them.

    +
    library(dygraphs)
    +
    +plotRandomTS <- function(id) {
    +  dygraph(data.frame(x = 1:10, y = rnorm(10)), main = paste("Random plot", id))
    +}
    +
    +combineWidgets(plotRandomTS(1), plotRandomTS(2))
    +
    +

    The functions tries to find the best number of columns and rows. But one can control them with parameters nrowand ncol. It is also possible to control their relative size with parameters rowsize and colsize. To achieve complex layouts, it is possible to use nested combined widgets. Here is an example of a complex layout.

    +
    combineWidgets(
    +  ncol = 2, colsize = c(2, 1),
    +  plotRandomTS(1),
    +  combineWidgets(
    +    ncol = 1,
    +    plotRandomTS(2),
    +    plotRandomTS(3),
    +    plotRandomTS(4)
    +  )
    +)
    +
    +

    Even if the main use of combineWidgets is to combine htmlwidgets, it can also display text or html tags. It can be useful to include comments in a chart. Moreover it has arguments to add a title and to add some html content in the sides of the chart.

    +
    combineWidgets(
    +  plotRandomTS(1),
    +  plotRandomTS(2),
    +  plotRandomTS(3),
    +  plotRandomTS(4),
    +  title = "Four random plots",
    +  header = "Here goes the header content. <span style='color:red'>It can include html code</span>.",
    +  footer = "Here goes the footer content.",
    +  leftCol = "<div style='margin-top:150px;'>left column</div>",
    +  rightCol = "<div style='margin-top:150px;'>right column</div>"
    +)
    +
    + +
    +
    +

    + Advanced usage

    +
    +

    + Grouping controls

    +

    If you have a large number of inputs, you can easily group them. To do so, simply pass to the function manipulateWidget a list of inputs instead of passing directly the inputs. Here is a toy example. Groups are by default collapsed and user can click on their title to display/collapse then.

    +
    mydata <- data.frame(x = 1:100, y = rnorm(100))
    +manipulateWidget(
    +  dygraph(mydata[range[1]:range[2], ],
    +          main = title, xlab = xlab, ylab = ylab),
    +  range = mwSlider(1, 100, c(1, 100)),
    +  "Graphical parameters" = list(
    +    title = mwText("Fictive time series"),
    +    xlab = mwText("X axis label"),
    +    ylab = mwText("Y axis label")
    +  )
    +)
    +
    +Grouping inputs

    Grouping inputs

    +
    +
    +
    +

    + Conditional inputs

    +

    Sometimes some inputs are relevant only if other inputs have some value. manipulateWidgetprovides a way to show/hide inputs conditionally to the value of the other inputs thanks to parameter .display. This parameter expects a named list of expressions. The names are the ones of the inputs to show/hide and the expressions can include any input and have to evaluate to TRUE/FALSE. Here is a toy example, using package plot_ly. User can choose points or lines to represent some data. If he chooses lines, then an input appears to let him choose the width of the lines.

    +
    mydata <- data.frame(x = 1:100, y = rnorm(100))
    +
    +myPlot <- function(type, lwd) {
    +  if (type == "points") {
    +    plot_ly(mydata, x= ~x, y = ~y, type = "scatter", mode = "markers")
    +  } else {
    +    plot_ly(mydata, x= ~x, y = ~y, type = "scatter", mode = "lines", 
    +            line = list(width = lwd))
    +  }
    +}
    +
    +manipulateWidget(
    +  myPlot(type, lwd),
    +  type = mwSelect(c("points", "lines"), "points"),
    +  lwd = mwSlider(1, 10, 1),
    +  .display = list(lwd = type == "lines")
    +)
    +
    +Conditional inputs

    Conditional inputs

    +
    +
    +
    +

    + Updating an input control

    +

    manipulateWidget provides a mecanism to dynamically update inputs through the parameter .updateInputs. For instance, one can update the choices of an input control conditionally to the value of other inputs.

    +

    This mechanism is similar to the used for conditionally displaying inputs: .updateInputs expects a named list where names are the names of the inputs to update. Values are themselves named list where names are arguments of the input generator function and values are expressions that give the new values of the arguments.

    +

    Here is an example that uses plotly to represent with a barchart a car from the mtcars dataset. User chooses the number of cylinders and then a car among the ones with this number of cylinders

    +
    colMax <- apply(mtcars, 2, max)
    +
    +plotCar <- function(carName) {
    +  carValues <- unlist(mtcars[carName, ])
    +  carValuesRel <- carValues / colMax
    +  plot_ly() %>% 
    +    add_bars(x = names(mtcars), y = carValuesRel, text = carValues, 
    +             hoverinfo = c("x+text"))
    +}
    +
    +carChoices <- split(row.names(mtcars), mtcars$cyl)
    +
    +str(carChoices)
    +## $ 4: chr [1:11] "Datsun 710" "Merc 240D" "Merc 230" "Fiat 128" ...
    +## $ 6: chr [1:7] "Mazda RX4" "Mazda RX4 Wag" "Hornet 4 Drive" "Valiant" ...
    +## $ 8: chr [1:14] "Hornet Sportabout" "Duster 360" "Merc 450SE" "Merc 450SL" ...
    +
    +manipulateWidget(
    +  plotCar(car),
    +  cylinders = mwSelect(c("4", "6", "8")),
    +  car = mwSelect(),
    +  .updateInputs = list(
    +    car = list(choices = carChoices[[cylinders]])
    +  )
    +)
    +
    +Dynamic inputs

    Dynamic inputs

    +
    +
    +
    +

    + Updating a widget

    +

    The “normal” use of manipulateWidget is to provide an expression that always return an htmlwidget. In such case, every time the user changes the value of an input, the current widget is destroyed and a new one is created and rendered. This behavior is not optimal and sometimes it can be painful for the user: consider for instance an interactive map. Each time user changes an input, the map is destroyed and created again, then zoom and location on the map are lost every time.

    +

    Some packages provide functions to update a widget that has already been rendered. This is the case for instance for package leaflet with the function leafletProxy. To use such functions, manipulateWidget evaluates the parameter .expr with two extra variables:

    +
      +
    • .initial: TRUE if the expression is evaluated for the first time and then the widget has not been rendered yet, FALSE if the widget has already been rendered.

    • +
    • .session: A shiny session object.

    • +
    +

    Moreover the ID of the rendered widget is always “output”. Then it is quite easy to write an expression that initializes a widget when it is evaluated the first time and then that updates this widget. Here is an example using package leaflet.

    +
    lon <- rnorm(10, sd = 20)
    +lat <- rnorm(10, sd = 20)
    +
    +myMapFun <- function(radius, color, initial, session) {
    +  if (initial) {
    +    # Widget has not been rendered
    +    map <- leaflet() %>% addTiles()
    +  } else {
    +    # widget has already been rendered
    +    map <- leafletProxy("output", session) %>% clearMarkers()
    +  }
    +
    +  map %>% addCircleMarkers(lon, lat, radius = radius, color = color)
    +}
    +
    +manipulateWidget(myMapFun(radius, color, .initial, .session),
    +                 radius = mwSlider(5, 30, 10),
    +                 color = mwSelect(c("red", "blue", "green")))
    +
    +Conditional inputs

    Conditional inputs

    +
    +
    +
    +

    + Comparison mode

    +

    Sometimes one wants to compare two similar charts to visualize the impact of some parameter or to compare different data sets. manipulateWidget has an argument to perform such comparison without writing much code: .compare. One just has to write the code to generate one chart and use this argument to specify which parameters should vary between the two charts. Here is a toy example that uses dygraphs.

    +
    mydata <- data.frame(
    +  timeId = 1:100,
    +  series1 = rnorm(100),
    +  series2 = rnorm(100),
    +  series3 = rnorm(100)
    +)
    +manipulateWidget(
    +  dygraph(mydata[range[1]:range[2], c("timeId", series)], main = title),
    +  range = mwSlider(1, 100, c(1, 100)),
    +  series = mwSelect(c("series1", "series2", "series3")),
    +  title = mwText(),
    +  .compare = list(
    +    title = list("First chart", "Second chart"),
    +    series = NULL
    +  )
    +)
    +
    +Comparison mode

    Comparison mode

    +
    +
    +
    +

    + Using manipulateWidget in a document

    +

    manipulateWidget uses Shiny, so it does not work in a “normal” Rmarkdown document. If one uses the function in a code chunck, the htmlwidget will be outputed with the default values of the parameters and there will be no interface to modify the parameters.

    +

    Nevertheless, it is possible to include a shiny application in a document with the runtime: shiny (see http://rmarkdown.rstudio.com/authoring_shiny.html). In such setting manipulateWidget works normally and the document can be published on a shiny server to let final users play with the parameters of the document.

    +
    +
    +
    +
    + + + +
    + + +
    + +
    +

    Site built with pkgdown.

    +
    + +
    +
    + + + diff --git a/docs/articles/manipulateWidgets_files/combineWidgetStyle-0.1/combineWidgets.css b/docs/articles/manipulateWidgets_files/combineWidgetStyle-0.1/combineWidgets.css new file mode 100644 index 0000000..c50feff --- /dev/null +++ b/docs/articles/manipulateWidgets_files/combineWidgetStyle-0.1/combineWidgets.css @@ -0,0 +1,67 @@ +/* Copyright © 2016 RTE Réseau de transport d’électricité */ + +.cw-container { + display: flex; + display: -webkit-flex; + flex-direction: column; + -webkit-flex-direction: column; + width: 100%; + height: 100%; +} + +.cw-subcontainer { + flex:1; + -webkit-flex:1; + display: flex; + display: -webkit-flex; + flex-direction: row; + -webkit-flex-direction: row; +} + +.cw-title { + text-align: center; + margin: 5px 0; + font-family: sans-serif; + font-weight: normal; +} + +.cw-content { + flex:1; + -webkit-flex:1; + display: flex; + display: -webkit-flex; + flex-direction: column; + -webkit-flex-direction: column; +} + +.cw-content.cw-by-col { + flex-direction: row; + -webkit-flex-direction: row; +} + +.cw-row { + align-items: stretch; + -webkit-align-items: stretch; + display: flex; + display: -webkit-flex; + flex-direction: row; + -webkit-flex-direction: row; +} + +.cw-row.cw-by-col { + flex-direction: column; + -webkit-flex-direction: column; +} + +.cw-col { + align-items: stretch; + -webkit-align-items: stretch; + position: relative; + margin:5px; +} + +.cw-widget { + width:100%; + height:100%; + position:absolute; +} diff --git a/docs/articles/manipulateWidgets_files/combineWidgetStyle-0.1/combineWidgets.js b/docs/articles/manipulateWidgets_files/combineWidgetStyle-0.1/combineWidgets.js new file mode 100644 index 0000000..c7cea7d --- /dev/null +++ b/docs/articles/manipulateWidgets_files/combineWidgetStyle-0.1/combineWidgets.js @@ -0,0 +1,68 @@ +//Copyright © 2016 RTE Réseau de transport d’électricité + +HTMLWidgets.widget({ + + name: 'combineWidgets', + + type: 'output', + + factory: function(el, width, height) { + + var widgets = {}; + + function toArray(x) { + if (x.constructor !== Array) x = [x]; + return x; + } + + function getWidgetFactory(name) { + return HTMLWidgets.widgets.filter(function(x) {return x.name == name})[0]; + } + + function resizeAll() { + for (var k in widgets) { + var widgetEl = document.getElementById(k); + if (!widgetEl) { + delete widgets[k]; + } else { + var x = widgets[k]; + x.factory.resize(widgetEl, widgetEl.clientWidth, widgetEl.clientHeight, x.instance); + } + } + } + + return { + + renderValue: function(x) { + x.elementId = toArray(x.elementId); + x.widgetType = toArray(x.widgetType); + + var nWidgets = x.widgetType.length; + el.innerHTML = x.html; + + for (var i = 0; i < nWidgets; i++) { + var child = document.getElementById(x.elementId[i]); + + if (x.widgetType[i] == "html") { + child.innerHTML = x.data[i]; + } else { + var widgetFactory = getWidgetFactory(x.widgetType[i]); + var w = widgetFactory.initialize(child, child.clientWidth, child.clientHeight); + widgetFactory.renderValue(child, x.data[i], w); + widgets[x.elementId[i]] = {factory:widgetFactory, instance:w}; + } + } + + // Sometimes widgets are rendered before the size of all html element has + // been computed. Adding a small delay fixes this problem. + setTimeout(resizeAll, 5); + + }, + + resize: function(width, height) { + resizeAll(); + } + + }; + } +}); diff --git a/docs/articles/manipulateWidgets_files/combineWidgetStyle-0.1/combineWidgets.yaml b/docs/articles/manipulateWidgets_files/combineWidgetStyle-0.1/combineWidgets.yaml new file mode 100644 index 0000000..40545b1 --- /dev/null +++ b/docs/articles/manipulateWidgets_files/combineWidgetStyle-0.1/combineWidgets.yaml @@ -0,0 +1,7 @@ +#Copyright © 2016 RTE Réseau de transport d’électricité +dependencies: + - name: combineWidgetStyle + version: 0.1 + src: htmlwidgets + stylesheet: combineWidgets.css + diff --git a/docs/articles/manipulateWidgets_files/combineWidgets-binding-0.5.1/combineWidgets.js b/docs/articles/manipulateWidgets_files/combineWidgets-binding-0.5.1/combineWidgets.js new file mode 100644 index 0000000..c7cea7d --- /dev/null +++ b/docs/articles/manipulateWidgets_files/combineWidgets-binding-0.5.1/combineWidgets.js @@ -0,0 +1,68 @@ +//Copyright © 2016 RTE Réseau de transport d’électricité + +HTMLWidgets.widget({ + + name: 'combineWidgets', + + type: 'output', + + factory: function(el, width, height) { + + var widgets = {}; + + function toArray(x) { + if (x.constructor !== Array) x = [x]; + return x; + } + + function getWidgetFactory(name) { + return HTMLWidgets.widgets.filter(function(x) {return x.name == name})[0]; + } + + function resizeAll() { + for (var k in widgets) { + var widgetEl = document.getElementById(k); + if (!widgetEl) { + delete widgets[k]; + } else { + var x = widgets[k]; + x.factory.resize(widgetEl, widgetEl.clientWidth, widgetEl.clientHeight, x.instance); + } + } + } + + return { + + renderValue: function(x) { + x.elementId = toArray(x.elementId); + x.widgetType = toArray(x.widgetType); + + var nWidgets = x.widgetType.length; + el.innerHTML = x.html; + + for (var i = 0; i < nWidgets; i++) { + var child = document.getElementById(x.elementId[i]); + + if (x.widgetType[i] == "html") { + child.innerHTML = x.data[i]; + } else { + var widgetFactory = getWidgetFactory(x.widgetType[i]); + var w = widgetFactory.initialize(child, child.clientWidth, child.clientHeight); + widgetFactory.renderValue(child, x.data[i], w); + widgets[x.elementId[i]] = {factory:widgetFactory, instance:w}; + } + } + + // Sometimes widgets are rendered before the size of all html element has + // been computed. Adding a small delay fixes this problem. + setTimeout(resizeAll, 5); + + }, + + resize: function(width, height) { + resizeAll(); + } + + }; + } +}); diff --git a/docs/articles/manipulateWidgets_files/dygraphs-1.1.1/dygraph-combined-dev.js b/docs/articles/manipulateWidgets_files/dygraphs-1.1.1/dygraph-combined-dev.js new file mode 100644 index 0000000..b3a0fbc --- /dev/null +++ b/docs/articles/manipulateWidgets_files/dygraphs-1.1.1/dygraph-combined-dev.js @@ -0,0 +1,12172 @@ +/*! @license Copyright 2014 Dan Vanderkam (danvdk@gmail.com) MIT-licensed (http://opensource.org/licenses/MIT) */ +// Console-polyfill. MIT license. +// https://github.com/paulmillr/console-polyfill +// Make it safe to do console.log() always. +(function(con) { + 'use strict'; + var prop, method; + var empty = {}; + var dummy = function() {}; + var properties = 'memory'.split(','); + var methods = ('assert,clear,count,debug,dir,dirxml,error,exception,group,' + + 'groupCollapsed,groupEnd,info,log,markTimeline,profile,profiles,profileEnd,' + + 'show,table,time,timeEnd,timeline,timelineEnd,timeStamp,trace,warn').split(','); + while (prop = properties.pop()) con[prop] = con[prop] || empty; + while (method = methods.pop()) con[method] = con[method] || dummy; +})(this.console = this.console || {}); // Using `this` for web workers. +/** + * @license + * Copyright 2012 Dan Vanderkam (danvdk@gmail.com) + * MIT-licensed (http://opensource.org/licenses/MIT) + */ + +(function() { +'use strict'; + +/** + * @fileoverview Adds support for dashed lines to the HTML5 canvas. + * + * Usage: + * var ctx = canvas.getContext("2d"); + * ctx.installPattern([10, 5]) // draw 10 pixels, skip 5 pixels, repeat. + * ctx.beginPath(); + * ctx.moveTo(100, 100); // start the first line segment. + * ctx.lineTo(150, 200); + * ctx.lineTo(200, 100); + * ctx.moveTo(300, 150); // start a second, unconnected line + * ctx.lineTo(400, 250); + * ... + * ctx.stroke(); // draw the dashed line. + * ctx.uninstallPattern(); + * + * This is designed to leave the canvas untouched when it's not used. + * If you never install a pattern, or call uninstallPattern(), then the canvas + * will be exactly as it would have if you'd never used this library. The only + * difference from the standard canvas will be the "installPattern" method of + * the drawing context. + */ + +/** + * Change the stroking style of the canvas drawing context from a solid line to + * a pattern (e.g. dashes, dash-dot-dash, etc.) + * + * Once you've installed the pattern, you can draw with it by using the + * beginPath(), moveTo(), lineTo() and stroke() method calls. Note that some + * more advanced methods (e.g. quadraticCurveTo() and bezierCurveTo()) are not + * supported. See file overview for a working example. + * + * Side effects of calling this method include adding an "isPatternInstalled" + * property and "uninstallPattern" method to this particular canvas context. + * You must call uninstallPattern() before calling installPattern() again. + * + * @param {Array.} pattern A description of the stroke pattern. Even + * indices indicate a draw and odd indices indicate a gap (in pixels). The + * array should have a even length as any odd lengthed array could be expressed + * as a smaller even length array. + */ +CanvasRenderingContext2D.prototype.installPattern = function(pattern) { + if (typeof(this.isPatternInstalled) !== 'undefined') { + throw "Must un-install old line pattern before installing a new one."; + } + this.isPatternInstalled = true; + + var dashedLineToHistory = [0, 0]; + + // list of connected line segements: + // [ [x1, y1], ..., [xn, yn] ], [ [x1, y1], ..., [xn, yn] ] + var segments = []; + + // Stash away copies of the unmodified line-drawing functions. + var realBeginPath = this.beginPath; + var realLineTo = this.lineTo; + var realMoveTo = this.moveTo; + var realStroke = this.stroke; + + /** @type {function()|undefined} */ + this.uninstallPattern = function() { + this.beginPath = realBeginPath; + this.lineTo = realLineTo; + this.moveTo = realMoveTo; + this.stroke = realStroke; + this.uninstallPattern = undefined; + this.isPatternInstalled = undefined; + }; + + // Keep our own copies of the line segments as they're drawn. + this.beginPath = function() { + segments = []; + realBeginPath.call(this); + }; + this.moveTo = function(x, y) { + segments.push([[x, y]]); + realMoveTo.call(this, x, y); + }; + this.lineTo = function(x, y) { + var last = segments[segments.length - 1]; + last.push([x, y]); + }; + + this.stroke = function() { + if (segments.length === 0) { + // Maybe the user is drawing something other than a line. + // TODO(danvk): test this case. + realStroke.call(this); + return; + } + + for (var i = 0; i < segments.length; i++) { + var seg = segments[i]; + var x1 = seg[0][0], y1 = seg[0][1]; + for (var j = 1; j < seg.length; j++) { + // Draw a dashed line from (x1, y1) - (x2, y2) + var x2 = seg[j][0], y2 = seg[j][1]; + this.save(); + + // Calculate transformation parameters + var dx = (x2-x1); + var dy = (y2-y1); + var len = Math.sqrt(dx*dx + dy*dy); + var rot = Math.atan2(dy, dx); + + // Set transformation + this.translate(x1, y1); + realMoveTo.call(this, 0, 0); + this.rotate(rot); + + // Set last pattern index we used for this pattern. + var patternIndex = dashedLineToHistory[0]; + var x = 0; + while (len > x) { + // Get the length of the pattern segment we are dealing with. + var segment = pattern[patternIndex]; + // If our last draw didn't complete the pattern segment all the way + // we will try to finish it. Otherwise we will try to do the whole + // segment. + if (dashedLineToHistory[1]) { + x += dashedLineToHistory[1]; + } else { + x += segment; + } + + if (x > len) { + // We were unable to complete this pattern index all the way, keep + // where we are the history so our next draw continues where we + // left off in the pattern. + dashedLineToHistory = [patternIndex, x-len]; + x = len; + } else { + // We completed this patternIndex, we put in the history that we + // are on the beginning of the next segment. + dashedLineToHistory = [(patternIndex+1)%pattern.length, 0]; + } + + // We do a line on a even pattern index and just move on a odd + // pattern index. The move is the empty space in the dash. + if (patternIndex % 2 === 0) { + realLineTo.call(this, x, 0); + } else { + realMoveTo.call(this, x, 0); + } + + // If we are not done, next loop process the next pattern segment, or + // the first segment again if we are at the end of the pattern. + patternIndex = (patternIndex+1) % pattern.length; + } + + this.restore(); + x1 = x2; + y1 = y2; + } + } + realStroke.call(this); + segments = []; + }; +}; + +/** + * Removes the previously-installed pattern. + * You must call installPattern() before calling this. You can install at most + * one pattern at a time--there is no pattern stack. + */ +CanvasRenderingContext2D.prototype.uninstallPattern = function() { + // This will be replaced by a non-error version when a pattern is installed. + throw "Must install a line pattern before uninstalling it."; +}; + +})(); +/** + * @license + * Copyright 2011 Dan Vanderkam (danvdk@gmail.com) + * MIT-licensed (http://opensource.org/licenses/MIT) + */ + +/** + * @fileoverview DygraphOptions is responsible for parsing and returning information about options. + * + * Still tightly coupled to Dygraphs, we could remove some of that, you know. + */ + +var DygraphOptions = (function() { +/*jshint strict:false */ + +// For "production" code, this gets set to false by uglifyjs. +// Need to define it outside of "use strict", hence the nested IIFEs. +if (typeof(DEBUG) === 'undefined') DEBUG=true; + +return (function() { + +// TODO: remove this jshint directive & fix the warnings. +/*jshint sub:true */ +/*global Dygraph:false */ +"use strict"; + +/* + * Interesting member variables: (REMOVING THIS LIST AS I CLOSURIZE) + * global_ - global attributes (common among all graphs, AIUI) + * user - attributes set by the user + * series_ - { seriesName -> { idx, yAxis, options }} + */ + +/** + * This parses attributes into an object that can be easily queried. + * + * It doesn't necessarily mean that all options are available, specifically + * if labels are not yet available, since those drive details of the per-series + * and per-axis options. + * + * @param {Dygraph} dygraph The chart to which these options belong. + * @constructor + */ +var DygraphOptions = function(dygraph) { + /** + * The dygraph. + * @type {!Dygraph} + */ + this.dygraph_ = dygraph; + + /** + * Array of axis index to { series : [ series names ] , options : { axis-specific options. } + * @type {Array.<{series : Array., options : Object}>} @private + */ + this.yAxes_ = []; + + /** + * Contains x-axis specific options, which are stored in the options key. + * This matches the yAxes_ object structure (by being a dictionary with an + * options element) allowing for shared code. + * @type {options: Object} @private + */ + this.xAxis_ = {}; + this.series_ = {}; + + // Once these two objects are initialized, you can call get(); + this.global_ = this.dygraph_.attrs_; + this.user_ = this.dygraph_.user_attrs_ || {}; + + /** + * A list of series in columnar order. + * @type {Array.} + */ + this.labels_ = []; + + this.highlightSeries_ = this.get("highlightSeriesOpts") || {}; + this.reparseSeries(); +}; + +/** + * Not optimal, but does the trick when you're only using two axes. + * If we move to more axes, this can just become a function. + * + * @type {Object.} + * @private + */ +DygraphOptions.AXIS_STRING_MAPPINGS_ = { + 'y' : 0, + 'Y' : 0, + 'y1' : 0, + 'Y1' : 0, + 'y2' : 1, + 'Y2' : 1 +}; + +/** + * @param {string|number} axis + * @private + */ +DygraphOptions.axisToIndex_ = function(axis) { + if (typeof(axis) == "string") { + if (DygraphOptions.AXIS_STRING_MAPPINGS_.hasOwnProperty(axis)) { + return DygraphOptions.AXIS_STRING_MAPPINGS_[axis]; + } + throw "Unknown axis : " + axis; + } + if (typeof(axis) == "number") { + if (axis === 0 || axis === 1) { + return axis; + } + throw "Dygraphs only supports two y-axes, indexed from 0-1."; + } + if (axis) { + throw "Unknown axis : " + axis; + } + // No axis specification means axis 0. + return 0; +}; + +/** + * Reparses options that are all related to series. This typically occurs when + * options are either updated, or source data has been made available. + * + * TODO(konigsberg): The method name is kind of weak; fix. + */ +DygraphOptions.prototype.reparseSeries = function() { + var labels = this.get("labels"); + if (!labels) { + return; // -- can't do more for now, will parse after getting the labels. + } + + this.labels_ = labels.slice(1); + + this.yAxes_ = [ { series : [], options : {}} ]; // Always one axis at least. + this.xAxis_ = { options : {} }; + this.series_ = {}; + + // Traditionally, per-series options were specified right up there with the options. For instance + // { + // labels: [ "X", "foo", "bar" ], + // pointSize: 3, + // foo : {}, // options for foo + // bar : {} // options for bar + // } + // + // Moving forward, series really should be specified in the series element, separating them. + // like so: + // + // { + // labels: [ "X", "foo", "bar" ], + // pointSize: 3, + // series : { + // foo : {}, // options for foo + // bar : {} // options for bar + // } + // } + // + // So, if series is found, it's expected to contain per-series data, otherwise we fall + // back. + var oldStyleSeries = !this.user_["series"]; + + if (oldStyleSeries) { + var axisId = 0; // 0-offset; there's always one. + // Go through once, add all the series, and for those with {} axis options, add a new axis. + for (var idx = 0; idx < this.labels_.length; idx++) { + var seriesName = this.labels_[idx]; + + var optionsForSeries = this.user_[seriesName] || {}; + + var yAxis = 0; + var axis = optionsForSeries["axis"]; + if (typeof(axis) == 'object') { + yAxis = ++axisId; + this.yAxes_[yAxis] = { series : [ seriesName ], options : axis }; + } + + // Associate series without axis options with axis 0. + if (!axis) { // undefined + this.yAxes_[0].series.push(seriesName); + } + + this.series_[seriesName] = { idx: idx, yAxis: yAxis, options : optionsForSeries }; + } + + // Go through one more time and assign series to an axis defined by another + // series, e.g. { 'Y1: { axis: {} }, 'Y2': { axis: 'Y1' } } + for (var idx = 0; idx < this.labels_.length; idx++) { + var seriesName = this.labels_[idx]; + var optionsForSeries = this.series_[seriesName]["options"]; + var axis = optionsForSeries["axis"]; + + if (typeof(axis) == 'string') { + if (!this.series_.hasOwnProperty(axis)) { + console.error("Series " + seriesName + " wants to share a y-axis with " + + "series " + axis + ", which does not define its own axis."); + return; + } + var yAxis = this.series_[axis].yAxis; + this.series_[seriesName].yAxis = yAxis; + this.yAxes_[yAxis].series.push(seriesName); + } + } + } else { + for (var idx = 0; idx < this.labels_.length; idx++) { + var seriesName = this.labels_[idx]; + var optionsForSeries = this.user_.series[seriesName] || {}; + var yAxis = DygraphOptions.axisToIndex_(optionsForSeries["axis"]); + + this.series_[seriesName] = { + idx: idx, + yAxis: yAxis, + options : optionsForSeries }; + + if (!this.yAxes_[yAxis]) { + this.yAxes_[yAxis] = { series : [ seriesName ], options : {} }; + } else { + this.yAxes_[yAxis].series.push(seriesName); + } + } + } + + var axis_opts = this.user_["axes"] || {}; + Dygraph.update(this.yAxes_[0].options, axis_opts["y"] || {}); + if (this.yAxes_.length > 1) { + Dygraph.update(this.yAxes_[1].options, axis_opts["y2"] || {}); + } + Dygraph.update(this.xAxis_.options, axis_opts["x"] || {}); + + if (DEBUG) this.validateOptions_(); +}; + +/** + * Get a global value. + * + * @param {string} name the name of the option. + */ +DygraphOptions.prototype.get = function(name) { + var result = this.getGlobalUser_(name); + if (result !== null) { + return result; + } + return this.getGlobalDefault_(name); +}; + +DygraphOptions.prototype.getGlobalUser_ = function(name) { + if (this.user_.hasOwnProperty(name)) { + return this.user_[name]; + } + return null; +}; + +DygraphOptions.prototype.getGlobalDefault_ = function(name) { + if (this.global_.hasOwnProperty(name)) { + return this.global_[name]; + } + if (Dygraph.DEFAULT_ATTRS.hasOwnProperty(name)) { + return Dygraph.DEFAULT_ATTRS[name]; + } + return null; +}; + +/** + * Get a value for a specific axis. If there is no specific value for the axis, + * the global value is returned. + * + * @param {string} name the name of the option. + * @param {string|number} axis the axis to search. Can be the string representation + * ("y", "y2") or the axis number (0, 1). + */ +DygraphOptions.prototype.getForAxis = function(name, axis) { + var axisIdx; + var axisString; + + // Since axis can be a number or a string, straighten everything out here. + if (typeof(axis) == 'number') { + axisIdx = axis; + axisString = axisIdx === 0 ? "y" : "y2"; + } else { + if (axis == "y1") { axis = "y"; } // Standardize on 'y'. Is this bad? I think so. + if (axis == "y") { + axisIdx = 0; + } else if (axis == "y2") { + axisIdx = 1; + } else if (axis == "x") { + axisIdx = -1; // simply a placeholder for below. + } else { + throw "Unknown axis " + axis; + } + axisString = axis; + } + + var userAxis = (axisIdx == -1) ? this.xAxis_ : this.yAxes_[axisIdx]; + + // Search the user-specified axis option first. + if (userAxis) { // This condition could be removed if we always set up this.yAxes_ for y2. + var axisOptions = userAxis.options; + if (axisOptions.hasOwnProperty(name)) { + return axisOptions[name]; + } + } + + // User-specified global options second. + // But, hack, ignore globally-specified 'logscale' for 'x' axis declaration. + if (!(axis === 'x' && name === 'logscale')) { + var result = this.getGlobalUser_(name); + if (result !== null) { + return result; + } + } + // Default axis options third. + var defaultAxisOptions = Dygraph.DEFAULT_ATTRS.axes[axisString]; + if (defaultAxisOptions.hasOwnProperty(name)) { + return defaultAxisOptions[name]; + } + + // Default global options last. + return this.getGlobalDefault_(name); +}; + +/** + * Get a value for a specific series. If there is no specific value for the series, + * the value for the axis is returned (and afterwards, the global value.) + * + * @param {string} name the name of the option. + * @param {string} series the series to search. + */ +DygraphOptions.prototype.getForSeries = function(name, series) { + // Honors indexes as series. + if (series === this.dygraph_.getHighlightSeries()) { + if (this.highlightSeries_.hasOwnProperty(name)) { + return this.highlightSeries_[name]; + } + } + + if (!this.series_.hasOwnProperty(series)) { + throw "Unknown series: " + series; + } + + var seriesObj = this.series_[series]; + var seriesOptions = seriesObj["options"]; + if (seriesOptions.hasOwnProperty(name)) { + return seriesOptions[name]; + } + + return this.getForAxis(name, seriesObj["yAxis"]); +}; + +/** + * Returns the number of y-axes on the chart. + * @return {number} the number of axes. + */ +DygraphOptions.prototype.numAxes = function() { + return this.yAxes_.length; +}; + +/** + * Return the y-axis for a given series, specified by name. + */ +DygraphOptions.prototype.axisForSeries = function(series) { + return this.series_[series].yAxis; +}; + +/** + * Returns the options for the specified axis. + */ +// TODO(konigsberg): this is y-axis specific. Support the x axis. +DygraphOptions.prototype.axisOptions = function(yAxis) { + return this.yAxes_[yAxis].options; +}; + +/** + * Return the series associated with an axis. + */ +DygraphOptions.prototype.seriesForAxis = function(yAxis) { + return this.yAxes_[yAxis].series; +}; + +/** + * Return the list of all series, in their columnar order. + */ +DygraphOptions.prototype.seriesNames = function() { + return this.labels_; +}; + +if (DEBUG) { + +/** + * Validate all options. + * This requires Dygraph.OPTIONS_REFERENCE, which is only available in debug builds. + * @private + */ +DygraphOptions.prototype.validateOptions_ = function() { + if (typeof Dygraph.OPTIONS_REFERENCE === 'undefined') { + throw 'Called validateOptions_ in prod build.'; + } + + var that = this; + var validateOption = function(optionName) { + if (!Dygraph.OPTIONS_REFERENCE[optionName]) { + that.warnInvalidOption_(optionName); + } + }; + + var optionsDicts = [this.xAxis_.options, + this.yAxes_[0].options, + this.yAxes_[1] && this.yAxes_[1].options, + this.global_, + this.user_, + this.highlightSeries_]; + var names = this.seriesNames(); + for (var i = 0; i < names.length; i++) { + var name = names[i]; + if (this.series_.hasOwnProperty(name)) { + optionsDicts.push(this.series_[name].options); + } + } + for (var i = 0; i < optionsDicts.length; i++) { + var dict = optionsDicts[i]; + if (!dict) continue; + for (var optionName in dict) { + if (dict.hasOwnProperty(optionName)) { + validateOption(optionName); + } + } + } +}; + +var WARNINGS = {}; // Only show any particular warning once. + +/** + * Logs a warning about invalid options. + * TODO: make this throw for testing + * @private + */ +DygraphOptions.prototype.warnInvalidOption_ = function(optionName) { + if (!WARNINGS[optionName]) { + WARNINGS[optionName] = true; + var isSeries = (this.labels_.indexOf(optionName) >= 0); + if (isSeries) { + console.warn('Use new-style per-series options (saw ' + optionName + ' as top-level options key). See http://bit.ly/1tceaJs'); + } else { + console.warn('Unknown option ' + optionName + ' (full list of options at dygraphs.com/options.html'); + throw "invalid option " + optionName; + } + } +}; + +// Reset list of previously-shown warnings. Used for testing. +DygraphOptions.resetWarnings_ = function() { + WARNINGS = {}; +}; + +} + +return DygraphOptions; + +})(); +})(); +/** + * @license + * Copyright 2011 Dan Vanderkam (danvdk@gmail.com) + * MIT-licensed (http://opensource.org/licenses/MIT) + */ + +/** + * @fileoverview Based on PlotKitLayout, but modified to meet the needs of + * dygraphs. + */ + +var DygraphLayout = (function() { + +/*global Dygraph:false */ +"use strict"; + +/** + * Creates a new DygraphLayout object. + * + * This class contains all the data to be charted. + * It uses data coordinates, but also records the chart range (in data + * coordinates) and hence is able to calculate percentage positions ('In this + * view, Point A lies 25% down the x-axis.') + * + * Two things that it does not do are: + * 1. Record pixel coordinates for anything. + * 2. (oddly) determine anything about the layout of chart elements. + * + * The naming is a vestige of Dygraph's original PlotKit roots. + * + * @constructor + */ +var DygraphLayout = function(dygraph) { + this.dygraph_ = dygraph; + /** + * Array of points for each series. + * + * [series index][row index in series] = |Point| structure, + * where series index refers to visible series only, and the + * point index is for the reduced set of points for the current + * zoom region (including one point just outside the window). + * All points in the same row index share the same X value. + * + * @type {Array.>} + */ + this.points = []; + this.setNames = []; + this.annotations = []; + this.yAxes_ = null; + + // TODO(danvk): it's odd that xTicks_ and yTicks_ are inputs, but xticks and + // yticks are outputs. Clean this up. + this.xTicks_ = null; + this.yTicks_ = null; +}; + +/** + * Add points for a single series. + * + * @param {string} setname Name of the series. + * @param {Array.} set_xy Points for the series. + */ +DygraphLayout.prototype.addDataset = function(setname, set_xy) { + this.points.push(set_xy); + this.setNames.push(setname); +}; + +/** + * Returns the box which the chart should be drawn in. This is the canvas's + * box, less space needed for the axis and chart labels. + * + * @return {{x: number, y: number, w: number, h: number}} + */ +DygraphLayout.prototype.getPlotArea = function() { + return this.area_; +}; + +// Compute the box which the chart should be drawn in. This is the canvas's +// box, less space needed for axis, chart labels, and other plug-ins. +// NOTE: This should only be called by Dygraph.predraw_(). +DygraphLayout.prototype.computePlotArea = function() { + var area = { + // TODO(danvk): per-axis setting. + x: 0, + y: 0 + }; + + area.w = this.dygraph_.width_ - area.x - this.dygraph_.getOption('rightGap'); + area.h = this.dygraph_.height_; + + // Let plugins reserve space. + var e = { + chart_div: this.dygraph_.graphDiv, + reserveSpaceLeft: function(px) { + var r = { + x: area.x, + y: area.y, + w: px, + h: area.h + }; + area.x += px; + area.w -= px; + return r; + }, + reserveSpaceRight: function(px) { + var r = { + x: area.x + area.w - px, + y: area.y, + w: px, + h: area.h + }; + area.w -= px; + return r; + }, + reserveSpaceTop: function(px) { + var r = { + x: area.x, + y: area.y, + w: area.w, + h: px + }; + area.y += px; + area.h -= px; + return r; + }, + reserveSpaceBottom: function(px) { + var r = { + x: area.x, + y: area.y + area.h - px, + w: area.w, + h: px + }; + area.h -= px; + return r; + }, + chartRect: function() { + return {x:area.x, y:area.y, w:area.w, h:area.h}; + } + }; + this.dygraph_.cascadeEvents_('layout', e); + + this.area_ = area; +}; + +DygraphLayout.prototype.setAnnotations = function(ann) { + // The Dygraph object's annotations aren't parsed. We parse them here and + // save a copy. If there is no parser, then the user must be using raw format. + this.annotations = []; + var parse = this.dygraph_.getOption('xValueParser') || function(x) { return x; }; + for (var i = 0; i < ann.length; i++) { + var a = {}; + if (!ann[i].xval && ann[i].x === undefined) { + console.error("Annotations must have an 'x' property"); + return; + } + if (ann[i].icon && + !(ann[i].hasOwnProperty('width') && + ann[i].hasOwnProperty('height'))) { + console.error("Must set width and height when setting " + + "annotation.icon property"); + return; + } + Dygraph.update(a, ann[i]); + if (!a.xval) a.xval = parse(a.x); + this.annotations.push(a); + } +}; + +DygraphLayout.prototype.setXTicks = function(xTicks) { + this.xTicks_ = xTicks; +}; + +// TODO(danvk): add this to the Dygraph object's API or move it into Layout. +DygraphLayout.prototype.setYAxes = function (yAxes) { + this.yAxes_ = yAxes; +}; + +DygraphLayout.prototype.evaluate = function() { + this._xAxis = {}; + this._evaluateLimits(); + this._evaluateLineCharts(); + this._evaluateLineTicks(); + this._evaluateAnnotations(); +}; + +DygraphLayout.prototype._evaluateLimits = function() { + var xlimits = this.dygraph_.xAxisRange(); + this._xAxis.minval = xlimits[0]; + this._xAxis.maxval = xlimits[1]; + var xrange = xlimits[1] - xlimits[0]; + this._xAxis.scale = (xrange !== 0 ? 1 / xrange : 1.0); + + if (this.dygraph_.getOptionForAxis("logscale", 'x')) { + this._xAxis.xlogrange = Dygraph.log10(this._xAxis.maxval) - Dygraph.log10(this._xAxis.minval); + this._xAxis.xlogscale = (this._xAxis.xlogrange !== 0 ? 1.0 / this._xAxis.xlogrange : 1.0); + } + for (var i = 0; i < this.yAxes_.length; i++) { + var axis = this.yAxes_[i]; + axis.minyval = axis.computedValueRange[0]; + axis.maxyval = axis.computedValueRange[1]; + axis.yrange = axis.maxyval - axis.minyval; + axis.yscale = (axis.yrange !== 0 ? 1.0 / axis.yrange : 1.0); + + if (this.dygraph_.getOption("logscale")) { + axis.ylogrange = Dygraph.log10(axis.maxyval) - Dygraph.log10(axis.minyval); + axis.ylogscale = (axis.ylogrange !== 0 ? 1.0 / axis.ylogrange : 1.0); + if (!isFinite(axis.ylogrange) || isNaN(axis.ylogrange)) { + console.error('axis ' + i + ' of graph at ' + axis.g + + ' can\'t be displayed in log scale for range [' + + axis.minyval + ' - ' + axis.maxyval + ']'); + } + } + } +}; + +DygraphLayout.calcXNormal_ = function(value, xAxis, logscale) { + if (logscale) { + return ((Dygraph.log10(value) - Dygraph.log10(xAxis.minval)) * xAxis.xlogscale); + } else { + return (value - xAxis.minval) * xAxis.scale; + } +}; + +/** + * @param {DygraphAxisType} axis + * @param {number} value + * @param {boolean} logscale + * @return {number} + */ +DygraphLayout.calcYNormal_ = function(axis, value, logscale) { + if (logscale) { + var x = 1.0 - ((Dygraph.log10(value) - Dygraph.log10(axis.minyval)) * axis.ylogscale); + return isFinite(x) ? x : NaN; // shim for v8 issue; see pull request 276 + } else { + return 1.0 - ((value - axis.minyval) * axis.yscale); + } +}; + +DygraphLayout.prototype._evaluateLineCharts = function() { + var isStacked = this.dygraph_.getOption("stackedGraph"); + var isLogscaleForX = this.dygraph_.getOptionForAxis("logscale", 'x'); + + for (var setIdx = 0; setIdx < this.points.length; setIdx++) { + var points = this.points[setIdx]; + var setName = this.setNames[setIdx]; + var connectSeparated = this.dygraph_.getOption('connectSeparatedPoints', setName); + var axis = this.dygraph_.axisPropertiesForSeries(setName); + // TODO (konigsberg): use optionsForAxis instead. + var logscale = this.dygraph_.attributes_.getForSeries("logscale", setName); + + for (var j = 0; j < points.length; j++) { + var point = points[j]; + + // Range from 0-1 where 0 represents left and 1 represents right. + point.x = DygraphLayout.calcXNormal_(point.xval, this._xAxis, isLogscaleForX); + // Range from 0-1 where 0 represents top and 1 represents bottom + var yval = point.yval; + if (isStacked) { + point.y_stacked = DygraphLayout.calcYNormal_( + axis, point.yval_stacked, logscale); + if (yval !== null && !isNaN(yval)) { + yval = point.yval_stacked; + } + } + if (yval === null) { + yval = NaN; + if (!connectSeparated) { + point.yval = NaN; + } + } + point.y = DygraphLayout.calcYNormal_(axis, yval, logscale); + } + + this.dygraph_.dataHandler_.onLineEvaluated(points, axis, logscale); + } +}; + +DygraphLayout.prototype._evaluateLineTicks = function() { + var i, tick, label, pos; + this.xticks = []; + for (i = 0; i < this.xTicks_.length; i++) { + tick = this.xTicks_[i]; + label = tick.label; + pos = this.dygraph_.toPercentXCoord(tick.v); + if ((pos >= 0.0) && (pos < 1.0)) { + this.xticks.push([pos, label]); + } + } + + this.yticks = []; + for (i = 0; i < this.yAxes_.length; i++ ) { + var axis = this.yAxes_[i]; + for (var j = 0; j < axis.ticks.length; j++) { + tick = axis.ticks[j]; + label = tick.label; + pos = this.dygraph_.toPercentYCoord(tick.v, i); + if ((pos > 0.0) && (pos <= 1.0)) { + this.yticks.push([i, pos, label]); + } + } + } +}; + +DygraphLayout.prototype._evaluateAnnotations = function() { + // Add the annotations to the point to which they belong. + // Make a map from (setName, xval) to annotation for quick lookups. + var i; + var annotations = {}; + for (i = 0; i < this.annotations.length; i++) { + var a = this.annotations[i]; + annotations[a.xval + "," + a.series] = a; + } + + this.annotated_points = []; + + // Exit the function early if there are no annotations. + if (!this.annotations || !this.annotations.length) { + return; + } + + // TODO(antrob): loop through annotations not points. + for (var setIdx = 0; setIdx < this.points.length; setIdx++) { + var points = this.points[setIdx]; + for (i = 0; i < points.length; i++) { + var p = points[i]; + var k = p.xval + "," + p.name; + if (k in annotations) { + p.annotation = annotations[k]; + this.annotated_points.push(p); + } + } + } +}; + +/** + * Convenience function to remove all the data sets from a graph + */ +DygraphLayout.prototype.removeAllDatasets = function() { + delete this.points; + delete this.setNames; + delete this.setPointsLengths; + delete this.setPointsOffsets; + this.points = []; + this.setNames = []; + this.setPointsLengths = []; + this.setPointsOffsets = []; +}; + +return DygraphLayout; + +})(); +/** + * @license + * Copyright 2006 Dan Vanderkam (danvdk@gmail.com) + * MIT-licensed (http://opensource.org/licenses/MIT) + */ + +/** + * @fileoverview Based on PlotKit.CanvasRenderer, but modified to meet the + * needs of dygraphs. + * + * In particular, support for: + * - grid overlays + * - error bars + * - dygraphs attribute system + */ + +/** + * The DygraphCanvasRenderer class does the actual rendering of the chart onto + * a canvas. It's based on PlotKit.CanvasRenderer. + * @param {Object} element The canvas to attach to + * @param {Object} elementContext The 2d context of the canvas (injected so it + * can be mocked for testing.) + * @param {Layout} layout The DygraphLayout object for this graph. + * @constructor + */ + +var DygraphCanvasRenderer = (function() { +/*global Dygraph:false */ +"use strict"; + + +/** + * @constructor + * + * This gets called when there are "new points" to chart. This is generally the + * case when the underlying data being charted has changed. It is _not_ called + * in the common case that the user has zoomed or is panning the view. + * + * The chart canvas has already been created by the Dygraph object. The + * renderer simply gets a drawing context. + * + * @param {Dygraph} dygraph The chart to which this renderer belongs. + * @param {HTMLCanvasElement} element The <canvas> DOM element on which to draw. + * @param {CanvasRenderingContext2D} elementContext The drawing context. + * @param {DygraphLayout} layout The chart's DygraphLayout object. + * + * TODO(danvk): remove the elementContext property. + */ +var DygraphCanvasRenderer = function(dygraph, element, elementContext, layout) { + this.dygraph_ = dygraph; + + this.layout = layout; + this.element = element; + this.elementContext = elementContext; + + this.height = dygraph.height_; + this.width = dygraph.width_; + + // --- check whether everything is ok before we return + // NOTE(konigsberg): isIE is never defined in this object. Bug of some sort. + if (!this.isIE && !(Dygraph.isCanvasSupported(this.element))) + throw "Canvas is not supported."; + + // internal state + this.area = layout.getPlotArea(); + + // Set up a clipping area for the canvas (and the interaction canvas). + // This ensures that we don't overdraw. + if (this.dygraph_.isUsingExcanvas_) { + this._createIEClipArea(); + } else { + // on Android 3 and 4, setting a clipping area on a canvas prevents it from + // displaying anything. + if (!Dygraph.isAndroid()) { + var ctx = this.dygraph_.canvas_ctx_; + ctx.beginPath(); + ctx.rect(this.area.x, this.area.y, this.area.w, this.area.h); + ctx.clip(); + + ctx = this.dygraph_.hidden_ctx_; + ctx.beginPath(); + ctx.rect(this.area.x, this.area.y, this.area.w, this.area.h); + ctx.clip(); + } + } +}; + +/** + * Clears out all chart content and DOM elements. + * This is called immediately before render() on every frame, including + * during zooms and pans. + * @private + */ +DygraphCanvasRenderer.prototype.clear = function() { + var context; + if (this.isIE) { + // VML takes a while to start up, so we just poll every this.IEDelay + try { + if (this.clearDelay) { + this.clearDelay.cancel(); + this.clearDelay = null; + } + context = this.elementContext; + } + catch (e) { + // TODO(danvk): this is broken, since MochiKit.Async is gone. + // this.clearDelay = MochiKit.Async.wait(this.IEDelay); + // this.clearDelay.addCallback(bind(this.clear, this)); + return; + } + } + + context = this.elementContext; + context.clearRect(0, 0, this.width, this.height); +}; + +/** + * This method is responsible for drawing everything on the chart, including + * lines, error bars, fills and axes. + * It is called immediately after clear() on every frame, including during pans + * and zooms. + * @private + */ +DygraphCanvasRenderer.prototype.render = function() { + // attaches point.canvas{x,y} + this._updatePoints(); + + // actually draws the chart. + this._renderLineChart(); +}; + +DygraphCanvasRenderer.prototype._createIEClipArea = function() { + var className = 'dygraph-clip-div'; + var graphDiv = this.dygraph_.graphDiv; + + // Remove old clip divs. + for (var i = graphDiv.childNodes.length-1; i >= 0; i--) { + if (graphDiv.childNodes[i].className == className) { + graphDiv.removeChild(graphDiv.childNodes[i]); + } + } + + // Determine background color to give clip divs. + var backgroundColor = document.bgColor; + var element = this.dygraph_.graphDiv; + while (element != document) { + var bgcolor = element.currentStyle.backgroundColor; + if (bgcolor && bgcolor != 'transparent') { + backgroundColor = bgcolor; + break; + } + element = element.parentNode; + } + + function createClipDiv(area) { + if (area.w === 0 || area.h === 0) { + return; + } + var elem = document.createElement('div'); + elem.className = className; + elem.style.backgroundColor = backgroundColor; + elem.style.position = 'absolute'; + elem.style.left = area.x + 'px'; + elem.style.top = area.y + 'px'; + elem.style.width = area.w + 'px'; + elem.style.height = area.h + 'px'; + graphDiv.appendChild(elem); + } + + var plotArea = this.area; + // Left side + createClipDiv({ + x:0, y:0, + w:plotArea.x, + h:this.height + }); + + // Top + createClipDiv({ + x: plotArea.x, y: 0, + w: this.width - plotArea.x, + h: plotArea.y + }); + + // Right side + createClipDiv({ + x: plotArea.x + plotArea.w, y: 0, + w: this.width - plotArea.x - plotArea.w, + h: this.height + }); + + // Bottom + createClipDiv({ + x: plotArea.x, + y: plotArea.y + plotArea.h, + w: this.width - plotArea.x, + h: this.height - plotArea.h - plotArea.y + }); +}; + + +/** + * Returns a predicate to be used with an iterator, which will + * iterate over points appropriately, depending on whether + * connectSeparatedPoints is true. When it's false, the predicate will + * skip over points with missing yVals. + */ +DygraphCanvasRenderer._getIteratorPredicate = function(connectSeparatedPoints) { + return connectSeparatedPoints ? + DygraphCanvasRenderer._predicateThatSkipsEmptyPoints : + null; +}; + +DygraphCanvasRenderer._predicateThatSkipsEmptyPoints = + function(array, idx) { + return array[idx].yval !== null; +}; + +/** + * Draws a line with the styles passed in and calls all the drawPointCallbacks. + * @param {Object} e The dictionary passed to the plotter function. + * @private + */ +DygraphCanvasRenderer._drawStyledLine = function(e, + color, strokeWidth, strokePattern, drawPoints, + drawPointCallback, pointSize) { + var g = e.dygraph; + // TODO(konigsberg): Compute attributes outside this method call. + var stepPlot = g.getBooleanOption("stepPlot", e.setName); + + if (!Dygraph.isArrayLike(strokePattern)) { + strokePattern = null; + } + + var drawGapPoints = g.getBooleanOption('drawGapEdgePoints', e.setName); + + var points = e.points; + var setName = e.setName; + var iter = Dygraph.createIterator(points, 0, points.length, + DygraphCanvasRenderer._getIteratorPredicate( + g.getBooleanOption("connectSeparatedPoints", setName))); + + var stroking = strokePattern && (strokePattern.length >= 2); + + var ctx = e.drawingContext; + ctx.save(); + if (stroking) { + ctx.installPattern(strokePattern); + } + + var pointsOnLine = DygraphCanvasRenderer._drawSeries( + e, iter, strokeWidth, pointSize, drawPoints, drawGapPoints, stepPlot, color); + DygraphCanvasRenderer._drawPointsOnLine( + e, pointsOnLine, drawPointCallback, color, pointSize); + + if (stroking) { + ctx.uninstallPattern(); + } + + ctx.restore(); +}; + +/** + * This does the actual drawing of lines on the canvas, for just one series. + * Returns a list of [canvasx, canvasy] pairs for points for which a + * drawPointCallback should be fired. These include isolated points, or all + * points if drawPoints=true. + * @param {Object} e The dictionary passed to the plotter function. + * @private + */ +DygraphCanvasRenderer._drawSeries = function(e, + iter, strokeWidth, pointSize, drawPoints, drawGapPoints, stepPlot, color) { + + var prevCanvasX = null; + var prevCanvasY = null; + var nextCanvasY = null; + var isIsolated; // true if this point is isolated (no line segments) + var point; // the point being processed in the while loop + var pointsOnLine = []; // Array of [canvasx, canvasy] pairs. + var first = true; // the first cycle through the while loop + + var ctx = e.drawingContext; + ctx.beginPath(); + ctx.strokeStyle = color; + ctx.lineWidth = strokeWidth; + + // NOTE: we break the iterator's encapsulation here for about a 25% speedup. + var arr = iter.array_; + var limit = iter.end_; + var predicate = iter.predicate_; + + for (var i = iter.start_; i < limit; i++) { + point = arr[i]; + if (predicate) { + while (i < limit && !predicate(arr, i)) { + i++; + } + if (i == limit) break; + point = arr[i]; + } + + // FIXME: The 'canvasy != canvasy' test here catches NaN values but the test + // doesn't catch Infinity values. Could change this to + // !isFinite(point.canvasy), but I assume it avoids isNaN for performance? + if (point.canvasy === null || point.canvasy != point.canvasy) { + if (stepPlot && prevCanvasX !== null) { + // Draw a horizontal line to the start of the missing data + ctx.moveTo(prevCanvasX, prevCanvasY); + ctx.lineTo(point.canvasx, prevCanvasY); + } + prevCanvasX = prevCanvasY = null; + } else { + isIsolated = false; + if (drawGapPoints || !prevCanvasX) { + iter.nextIdx_ = i; + iter.next(); + nextCanvasY = iter.hasNext ? iter.peek.canvasy : null; + + var isNextCanvasYNullOrNaN = nextCanvasY === null || + nextCanvasY != nextCanvasY; + isIsolated = (!prevCanvasX && isNextCanvasYNullOrNaN); + if (drawGapPoints) { + // Also consider a point to be "isolated" if it's adjacent to a + // null point, excluding the graph edges. + if ((!first && !prevCanvasX) || + (iter.hasNext && isNextCanvasYNullOrNaN)) { + isIsolated = true; + } + } + } + + if (prevCanvasX !== null) { + if (strokeWidth) { + if (stepPlot) { + ctx.moveTo(prevCanvasX, prevCanvasY); + ctx.lineTo(point.canvasx, prevCanvasY); + } + + ctx.lineTo(point.canvasx, point.canvasy); + } + } else { + ctx.moveTo(point.canvasx, point.canvasy); + } + if (drawPoints || isIsolated) { + pointsOnLine.push([point.canvasx, point.canvasy, point.idx]); + } + prevCanvasX = point.canvasx; + prevCanvasY = point.canvasy; + } + first = false; + } + ctx.stroke(); + return pointsOnLine; +}; + +/** + * This fires the drawPointCallback functions, which draw dots on the points by + * default. This gets used when the "drawPoints" option is set, or when there + * are isolated points. + * @param {Object} e The dictionary passed to the plotter function. + * @private + */ +DygraphCanvasRenderer._drawPointsOnLine = function( + e, pointsOnLine, drawPointCallback, color, pointSize) { + var ctx = e.drawingContext; + for (var idx = 0; idx < pointsOnLine.length; idx++) { + var cb = pointsOnLine[idx]; + ctx.save(); + drawPointCallback.call(e.dygraph, + e.dygraph, e.setName, ctx, cb[0], cb[1], color, pointSize, cb[2]); + ctx.restore(); + } +}; + +/** + * Attaches canvas coordinates to the points array. + * @private + */ +DygraphCanvasRenderer.prototype._updatePoints = function() { + // Update Points + // TODO(danvk): here + // + // TODO(bhs): this loop is a hot-spot for high-point-count charts. These + // transformations can be pushed into the canvas via linear transformation + // matrices. + // NOTE(danvk): this is trickier than it sounds at first. The transformation + // needs to be done before the .moveTo() and .lineTo() calls, but must be + // undone before the .stroke() call to ensure that the stroke width is + // unaffected. An alternative is to reduce the stroke width in the + // transformed coordinate space, but you can't specify different values for + // each dimension (as you can with .scale()). The speedup here is ~12%. + var sets = this.layout.points; + for (var i = sets.length; i--;) { + var points = sets[i]; + for (var j = points.length; j--;) { + var point = points[j]; + point.canvasx = this.area.w * point.x + this.area.x; + point.canvasy = this.area.h * point.y + this.area.y; + } + } +}; + +/** + * Add canvas Actually draw the lines chart, including error bars. + * + * This function can only be called if DygraphLayout's points array has been + * updated with canvas{x,y} attributes, i.e. by + * DygraphCanvasRenderer._updatePoints. + * + * @param {string=} opt_seriesName when specified, only that series will + * be drawn. (This is used for expedited redrawing with highlightSeriesOpts) + * @param {CanvasRenderingContext2D} opt_ctx when specified, the drawing + * context. However, lines are typically drawn on the object's + * elementContext. + * @private + */ +DygraphCanvasRenderer.prototype._renderLineChart = function(opt_seriesName, opt_ctx) { + var ctx = opt_ctx || this.elementContext; + var i; + + var sets = this.layout.points; + var setNames = this.layout.setNames; + var setName; + + this.colors = this.dygraph_.colorsMap_; + + // Determine which series have specialized plotters. + var plotter_attr = this.dygraph_.getOption("plotter"); + var plotters = plotter_attr; + if (!Dygraph.isArrayLike(plotters)) { + plotters = [plotters]; + } + + var setPlotters = {}; // series name -> plotter fn. + for (i = 0; i < setNames.length; i++) { + setName = setNames[i]; + var setPlotter = this.dygraph_.getOption("plotter", setName); + if (setPlotter == plotter_attr) continue; // not specialized. + + setPlotters[setName] = setPlotter; + } + + for (i = 0; i < plotters.length; i++) { + var plotter = plotters[i]; + var is_last = (i == plotters.length - 1); + + for (var j = 0; j < sets.length; j++) { + setName = setNames[j]; + if (opt_seriesName && setName != opt_seriesName) continue; + + var points = sets[j]; + + // Only throw in the specialized plotters on the last iteration. + var p = plotter; + if (setName in setPlotters) { + if (is_last) { + p = setPlotters[setName]; + } else { + // Don't use the standard plotters in this case. + continue; + } + } + + var color = this.colors[setName]; + var strokeWidth = this.dygraph_.getOption("strokeWidth", setName); + + ctx.save(); + ctx.strokeStyle = color; + ctx.lineWidth = strokeWidth; + p({ + points: points, + setName: setName, + drawingContext: ctx, + color: color, + strokeWidth: strokeWidth, + dygraph: this.dygraph_, + axis: this.dygraph_.axisPropertiesForSeries(setName), + plotArea: this.area, + seriesIndex: j, + seriesCount: sets.length, + singleSeriesName: opt_seriesName, + allSeriesPoints: sets + }); + ctx.restore(); + } + } +}; + +/** + * Standard plotters. These may be used by clients via Dygraph.Plotters. + * See comments there for more details. + */ +DygraphCanvasRenderer._Plotters = { + linePlotter: function(e) { + DygraphCanvasRenderer._linePlotter(e); + }, + + fillPlotter: function(e) { + DygraphCanvasRenderer._fillPlotter(e); + }, + + errorPlotter: function(e) { + DygraphCanvasRenderer._errorPlotter(e); + } +}; + +/** + * Plotter which draws the central lines for a series. + * @private + */ +DygraphCanvasRenderer._linePlotter = function(e) { + var g = e.dygraph; + var setName = e.setName; + var strokeWidth = e.strokeWidth; + + // TODO(danvk): Check if there's any performance impact of just calling + // getOption() inside of _drawStyledLine. Passing in so many parameters makes + // this code a bit nasty. + var borderWidth = g.getNumericOption("strokeBorderWidth", setName); + var drawPointCallback = g.getOption("drawPointCallback", setName) || + Dygraph.Circles.DEFAULT; + var strokePattern = g.getOption("strokePattern", setName); + var drawPoints = g.getBooleanOption("drawPoints", setName); + var pointSize = g.getNumericOption("pointSize", setName); + + if (borderWidth && strokeWidth) { + DygraphCanvasRenderer._drawStyledLine(e, + g.getOption("strokeBorderColor", setName), + strokeWidth + 2 * borderWidth, + strokePattern, + drawPoints, + drawPointCallback, + pointSize + ); + } + + DygraphCanvasRenderer._drawStyledLine(e, + e.color, + strokeWidth, + strokePattern, + drawPoints, + drawPointCallback, + pointSize + ); +}; + +/** + * Draws the shaded error bars/confidence intervals for each series. + * This happens before the center lines are drawn, since the center lines + * need to be drawn on top of the error bars for all series. + * @private + */ +DygraphCanvasRenderer._errorPlotter = function(e) { + var g = e.dygraph; + var setName = e.setName; + var errorBars = g.getBooleanOption("errorBars") || + g.getBooleanOption("customBars"); + if (!errorBars) return; + + var fillGraph = g.getBooleanOption("fillGraph", setName); + if (fillGraph) { + console.warn("Can't use fillGraph option with error bars"); + } + + var ctx = e.drawingContext; + var color = e.color; + var fillAlpha = g.getNumericOption('fillAlpha', setName); + var stepPlot = g.getBooleanOption("stepPlot", setName); + var points = e.points; + + var iter = Dygraph.createIterator(points, 0, points.length, + DygraphCanvasRenderer._getIteratorPredicate( + g.getBooleanOption("connectSeparatedPoints", setName))); + + var newYs; + + // setup graphics context + var prevX = NaN; + var prevY = NaN; + var prevYs = [-1, -1]; + // should be same color as the lines but only 15% opaque. + var rgb = Dygraph.toRGB_(color); + var err_color = + 'rgba(' + rgb.r + ',' + rgb.g + ',' + rgb.b + ',' + fillAlpha + ')'; + ctx.fillStyle = err_color; + ctx.beginPath(); + + var isNullUndefinedOrNaN = function(x) { + return (x === null || + x === undefined || + isNaN(x)); + }; + + while (iter.hasNext) { + var point = iter.next(); + if ((!stepPlot && isNullUndefinedOrNaN(point.y)) || + (stepPlot && !isNaN(prevY) && isNullUndefinedOrNaN(prevY))) { + prevX = NaN; + continue; + } + + newYs = [ point.y_bottom, point.y_top ]; + if (stepPlot) { + prevY = point.y; + } + + // The documentation specifically disallows nulls inside the point arrays, + // but in case it happens we should do something sensible. + if (isNaN(newYs[0])) newYs[0] = point.y; + if (isNaN(newYs[1])) newYs[1] = point.y; + + newYs[0] = e.plotArea.h * newYs[0] + e.plotArea.y; + newYs[1] = e.plotArea.h * newYs[1] + e.plotArea.y; + if (!isNaN(prevX)) { + if (stepPlot) { + ctx.moveTo(prevX, prevYs[0]); + ctx.lineTo(point.canvasx, prevYs[0]); + ctx.lineTo(point.canvasx, prevYs[1]); + } else { + ctx.moveTo(prevX, prevYs[0]); + ctx.lineTo(point.canvasx, newYs[0]); + ctx.lineTo(point.canvasx, newYs[1]); + } + ctx.lineTo(prevX, prevYs[1]); + ctx.closePath(); + } + prevYs = newYs; + prevX = point.canvasx; + } + ctx.fill(); +}; + + +/** + * Proxy for CanvasRenderingContext2D which drops moveTo/lineTo calls which are + * superfluous. It accumulates all movements which haven't changed the x-value + * and only applies the two with the most extreme y-values. + * + * Calls to lineTo/moveTo must have non-decreasing x-values. + */ +DygraphCanvasRenderer._fastCanvasProxy = function(context) { + var pendingActions = []; // array of [type, x, y] tuples + var lastRoundedX = null; + var lastFlushedX = null; + + var LINE_TO = 1, + MOVE_TO = 2; + + var actionCount = 0; // number of moveTos and lineTos passed to context. + + // Drop superfluous motions + // Assumes all pendingActions have the same (rounded) x-value. + var compressActions = function(opt_losslessOnly) { + if (pendingActions.length <= 1) return; + + // Lossless compression: drop inconsequential moveTos. + for (var i = pendingActions.length - 1; i > 0; i--) { + var action = pendingActions[i]; + if (action[0] == MOVE_TO) { + var prevAction = pendingActions[i - 1]; + if (prevAction[1] == action[1] && prevAction[2] == action[2]) { + pendingActions.splice(i, 1); + } + } + } + + // Lossless compression: ... drop consecutive moveTos ... + for (var i = 0; i < pendingActions.length - 1; /* incremented internally */) { + var action = pendingActions[i]; + if (action[0] == MOVE_TO && pendingActions[i + 1][0] == MOVE_TO) { + pendingActions.splice(i, 1); + } else { + i++; + } + } + + // Lossy compression: ... drop all but the extreme y-values ... + if (pendingActions.length > 2 && !opt_losslessOnly) { + // keep an initial moveTo, but drop all others. + var startIdx = 0; + if (pendingActions[0][0] == MOVE_TO) startIdx++; + var minIdx = null, maxIdx = null; + for (var i = startIdx; i < pendingActions.length; i++) { + var action = pendingActions[i]; + if (action[0] != LINE_TO) continue; + if (minIdx === null && maxIdx === null) { + minIdx = i; + maxIdx = i; + } else { + var y = action[2]; + if (y < pendingActions[minIdx][2]) { + minIdx = i; + } else if (y > pendingActions[maxIdx][2]) { + maxIdx = i; + } + } + } + var minAction = pendingActions[minIdx], + maxAction = pendingActions[maxIdx]; + pendingActions.splice(startIdx, pendingActions.length - startIdx); + if (minIdx < maxIdx) { + pendingActions.push(minAction); + pendingActions.push(maxAction); + } else if (minIdx > maxIdx) { + pendingActions.push(maxAction); + pendingActions.push(minAction); + } else { + pendingActions.push(minAction); + } + } + }; + + var flushActions = function(opt_noLossyCompression) { + compressActions(opt_noLossyCompression); + for (var i = 0, len = pendingActions.length; i < len; i++) { + var action = pendingActions[i]; + if (action[0] == LINE_TO) { + context.lineTo(action[1], action[2]); + } else if (action[0] == MOVE_TO) { + context.moveTo(action[1], action[2]); + } + } + if (pendingActions.length) { + lastFlushedX = pendingActions[pendingActions.length - 1][1]; + } + actionCount += pendingActions.length; + pendingActions = []; + }; + + var addAction = function(action, x, y) { + var rx = Math.round(x); + if (lastRoundedX === null || rx != lastRoundedX) { + // if there are large gaps on the x-axis, it's essential to keep the + // first and last point as well. + var hasGapOnLeft = (lastRoundedX - lastFlushedX > 1), + hasGapOnRight = (rx - lastRoundedX > 1), + hasGap = hasGapOnLeft || hasGapOnRight; + flushActions(hasGap); + lastRoundedX = rx; + } + pendingActions.push([action, x, y]); + }; + + return { + moveTo: function(x, y) { + addAction(MOVE_TO, x, y); + }, + lineTo: function(x, y) { + addAction(LINE_TO, x, y); + }, + + // for major operations like stroke/fill, we skip compression to ensure + // that there are no artifacts at the right edge. + stroke: function() { flushActions(true); context.stroke(); }, + fill: function() { flushActions(true); context.fill(); }, + beginPath: function() { flushActions(true); context.beginPath(); }, + closePath: function() { flushActions(true); context.closePath(); }, + + _count: function() { return actionCount; } + }; +}; + +/** + * Draws the shaded regions when "fillGraph" is set. Not to be confused with + * error bars. + * + * For stacked charts, it's more convenient to handle all the series + * simultaneously. So this plotter plots all the points on the first series + * it's asked to draw, then ignores all the other series. + * + * @private + */ +DygraphCanvasRenderer._fillPlotter = function(e) { + // Skip if we're drawing a single series for interactive highlight overlay. + if (e.singleSeriesName) return; + + // We'll handle all the series at once, not one-by-one. + if (e.seriesIndex !== 0) return; + + var g = e.dygraph; + var setNames = g.getLabels().slice(1); // remove x-axis + + // getLabels() includes names for invisible series, which are not included in + // allSeriesPoints. We remove those to make the two match. + // TODO(danvk): provide a simpler way to get this information. + for (var i = setNames.length; i >= 0; i--) { + if (!g.visibility()[i]) setNames.splice(i, 1); + } + + var anySeriesFilled = (function() { + for (var i = 0; i < setNames.length; i++) { + if (g.getBooleanOption("fillGraph", setNames[i])) return true; + } + return false; + })(); + + if (!anySeriesFilled) return; + + var area = e.plotArea; + var sets = e.allSeriesPoints; + var setCount = sets.length; + + var fillAlpha = g.getNumericOption('fillAlpha'); + var stackedGraph = g.getBooleanOption("stackedGraph"); + var colors = g.getColors(); + + // For stacked graphs, track the baseline for filling. + // + // The filled areas below graph lines are trapezoids with two + // vertical edges. The top edge is the line segment being drawn, and + // the baseline is the bottom edge. Each baseline corresponds to the + // top line segment from the previous stacked line. In the case of + // step plots, the trapezoids are rectangles. + var baseline = {}; + var currBaseline; + var prevStepPlot; // for different line drawing modes (line/step) per series + + // Helper function to trace a line back along the baseline. + var traceBackPath = function(ctx, baselineX, baselineY, pathBack) { + ctx.lineTo(baselineX, baselineY); + if (stackedGraph) { + for (var i = pathBack.length - 1; i >= 0; i--) { + var pt = pathBack[i]; + ctx.lineTo(pt[0], pt[1]); + } + } + }; + + // process sets in reverse order (needed for stacked graphs) + for (var setIdx = setCount - 1; setIdx >= 0; setIdx--) { + var ctx = e.drawingContext; + var setName = setNames[setIdx]; + if (!g.getBooleanOption('fillGraph', setName)) continue; + + var stepPlot = g.getBooleanOption('stepPlot', setName); + var color = colors[setIdx]; + var axis = g.axisPropertiesForSeries(setName); + var axisY = 1.0 + axis.minyval * axis.yscale; + if (axisY < 0.0) axisY = 0.0; + else if (axisY > 1.0) axisY = 1.0; + axisY = area.h * axisY + area.y; + + var points = sets[setIdx]; + var iter = Dygraph.createIterator(points, 0, points.length, + DygraphCanvasRenderer._getIteratorPredicate( + g.getBooleanOption("connectSeparatedPoints", setName))); + + // setup graphics context + var prevX = NaN; + var prevYs = [-1, -1]; + var newYs; + // should be same color as the lines but only 15% opaque. + var rgb = Dygraph.toRGB_(color); + var err_color = + 'rgba(' + rgb.r + ',' + rgb.g + ',' + rgb.b + ',' + fillAlpha + ')'; + ctx.fillStyle = err_color; + ctx.beginPath(); + var last_x, is_first = true; + + // If the point density is high enough, dropping segments on their way to + // the canvas justifies the overhead of doing so. + if (points.length > 2 * g.width_ || Dygraph.FORCE_FAST_PROXY) { + ctx = DygraphCanvasRenderer._fastCanvasProxy(ctx); + } + + // For filled charts, we draw points from left to right, then back along + // the x-axis to complete a shape for filling. + // For stacked plots, this "back path" is a more complex shape. This array + // stores the [x, y] values needed to trace that shape. + var pathBack = []; + + // TODO(danvk): there are a lot of options at play in this loop. + // The logic would be much clearer if some (e.g. stackGraph and + // stepPlot) were split off into separate sub-plotters. + var point; + while (iter.hasNext) { + point = iter.next(); + if (!Dygraph.isOK(point.y) && !stepPlot) { + traceBackPath(ctx, prevX, prevYs[1], pathBack); + pathBack = []; + prevX = NaN; + if (point.y_stacked !== null && !isNaN(point.y_stacked)) { + baseline[point.canvasx] = area.h * point.y_stacked + area.y; + } + continue; + } + if (stackedGraph) { + if (!is_first && last_x == point.xval) { + continue; + } else { + is_first = false; + last_x = point.xval; + } + + currBaseline = baseline[point.canvasx]; + var lastY; + if (currBaseline === undefined) { + lastY = axisY; + } else { + if(prevStepPlot) { + lastY = currBaseline[0]; + } else { + lastY = currBaseline; + } + } + newYs = [ point.canvasy, lastY ]; + + if (stepPlot) { + // Step plots must keep track of the top and bottom of + // the baseline at each point. + if (prevYs[0] === -1) { + baseline[point.canvasx] = [ point.canvasy, axisY ]; + } else { + baseline[point.canvasx] = [ point.canvasy, prevYs[0] ]; + } + } else { + baseline[point.canvasx] = point.canvasy; + } + + } else { + if (isNaN(point.canvasy) && stepPlot) { + newYs = [ area.y + area.h, axisY ]; + } else { + newYs = [ point.canvasy, axisY ]; + } + } + if (!isNaN(prevX)) { + // Move to top fill point + if (stepPlot) { + ctx.lineTo(point.canvasx, prevYs[0]); + ctx.lineTo(point.canvasx, newYs[0]); + } else { + ctx.lineTo(point.canvasx, newYs[0]); + } + + // Record the baseline for the reverse path. + if (stackedGraph) { + pathBack.push([prevX, prevYs[1]]); + if (prevStepPlot && currBaseline) { + // Draw to the bottom of the baseline + pathBack.push([point.canvasx, currBaseline[1]]); + } else { + pathBack.push([point.canvasx, newYs[1]]); + } + } + } else { + ctx.moveTo(point.canvasx, newYs[1]); + ctx.lineTo(point.canvasx, newYs[0]); + } + prevYs = newYs; + prevX = point.canvasx; + } + prevStepPlot = stepPlot; + if (newYs && point) { + traceBackPath(ctx, point.canvasx, newYs[1], pathBack); + pathBack = []; + } + ctx.fill(); + } +}; + +return DygraphCanvasRenderer; + +})(); +/** + * @license + * Copyright 2006 Dan Vanderkam (danvdk@gmail.com) + * MIT-licensed (http://opensource.org/licenses/MIT) + */ + +/** + * @fileoverview Creates an interactive, zoomable graph based on a CSV file or + * string. Dygraph can handle multiple series with or without error bars. The + * date/value ranges will be automatically set. Dygraph uses the + * <canvas> tag, so it only works in FF1.5+. + * @author danvdk@gmail.com (Dan Vanderkam) + + Usage: +
    + + + The CSV file is of the form + + Date,SeriesA,SeriesB,SeriesC + YYYYMMDD,A1,B1,C1 + YYYYMMDD,A2,B2,C2 + + If the 'errorBars' option is set in the constructor, the input should be of + the form + Date,SeriesA,SeriesB,... + YYYYMMDD,A1,sigmaA1,B1,sigmaB1,... + YYYYMMDD,A2,sigmaA2,B2,sigmaB2,... + + If the 'fractions' option is set, the input should be of the form: + + Date,SeriesA,SeriesB,... + YYYYMMDD,A1/B1,A2/B2,... + YYYYMMDD,A1/B1,A2/B2,... + + And error bars will be calculated automatically using a binomial distribution. + + For further documentation and examples, see http://dygraphs.com/ + + */ + +// For "production" code, this gets set to false by uglifyjs. +if (typeof(DEBUG) === 'undefined') DEBUG=true; + +var Dygraph = (function() { +/*global DygraphLayout:false, DygraphCanvasRenderer:false, DygraphOptions:false, G_vmlCanvasManager:false,ActiveXObject:false */ +"use strict"; + +/** + * Creates an interactive, zoomable chart. + * + * @constructor + * @param {div | String} div A div or the id of a div into which to construct + * the chart. + * @param {String | Function} file A file containing CSV data or a function + * that returns this data. The most basic expected format for each line is + * "YYYY/MM/DD,val1,val2,...". For more information, see + * http://dygraphs.com/data.html. + * @param {Object} attrs Various other attributes, e.g. errorBars determines + * whether the input data contains error ranges. For a complete list of + * options, see http://dygraphs.com/options.html. + */ +var Dygraph = function(div, data, opts, opt_fourth_param) { + // These have to go above the "Hack for IE" in __init__ since .ready() can be + // called as soon as the constructor returns. Once support for OldIE is + // dropped, this can go down with the rest of the initializers. + this.is_initial_draw_ = true; + this.readyFns_ = []; + + if (opt_fourth_param !== undefined) { + // Old versions of dygraphs took in the series labels as a constructor + // parameter. This doesn't make sense anymore, but it's easy to continue + // to support this usage. + console.warn("Using deprecated four-argument dygraph constructor"); + this.__old_init__(div, data, opts, opt_fourth_param); + } else { + this.__init__(div, data, opts); + } +}; + +Dygraph.NAME = "Dygraph"; +Dygraph.VERSION = "1.1.1"; +Dygraph.__repr__ = function() { + return "[" + Dygraph.NAME + " " + Dygraph.VERSION + "]"; +}; + +/** + * Returns information about the Dygraph class. + */ +Dygraph.toString = function() { + return Dygraph.__repr__(); +}; + +// Various default values +Dygraph.DEFAULT_ROLL_PERIOD = 1; +Dygraph.DEFAULT_WIDTH = 480; +Dygraph.DEFAULT_HEIGHT = 320; + +// For max 60 Hz. animation: +Dygraph.ANIMATION_STEPS = 12; +Dygraph.ANIMATION_DURATION = 200; + +// Label constants for the labelsKMB and labelsKMG2 options. +// (i.e. '100000' -> '100K') +Dygraph.KMB_LABELS = [ 'K', 'M', 'B', 'T', 'Q' ]; +Dygraph.KMG2_BIG_LABELS = [ 'k', 'M', 'G', 'T', 'P', 'E', 'Z', 'Y' ]; +Dygraph.KMG2_SMALL_LABELS = [ 'm', 'u', 'n', 'p', 'f', 'a', 'z', 'y' ]; + +// These are defined before DEFAULT_ATTRS so that it can refer to them. +/** + * @private + * Return a string version of a number. This respects the digitsAfterDecimal + * and maxNumberWidth options. + * @param {number} x The number to be formatted + * @param {Dygraph} opts An options view + */ +Dygraph.numberValueFormatter = function(x, opts) { + var sigFigs = opts('sigFigs'); + + if (sigFigs !== null) { + // User has opted for a fixed number of significant figures. + return Dygraph.floatFormat(x, sigFigs); + } + + var digits = opts('digitsAfterDecimal'); + var maxNumberWidth = opts('maxNumberWidth'); + + var kmb = opts('labelsKMB'); + var kmg2 = opts('labelsKMG2'); + + var label; + + // switch to scientific notation if we underflow or overflow fixed display. + if (x !== 0.0 && + (Math.abs(x) >= Math.pow(10, maxNumberWidth) || + Math.abs(x) < Math.pow(10, -digits))) { + label = x.toExponential(digits); + } else { + label = '' + Dygraph.round_(x, digits); + } + + if (kmb || kmg2) { + var k; + var k_labels = []; + var m_labels = []; + if (kmb) { + k = 1000; + k_labels = Dygraph.KMB_LABELS; + } + if (kmg2) { + if (kmb) console.warn("Setting both labelsKMB and labelsKMG2. Pick one!"); + k = 1024; + k_labels = Dygraph.KMG2_BIG_LABELS; + m_labels = Dygraph.KMG2_SMALL_LABELS; + } + + var absx = Math.abs(x); + var n = Dygraph.pow(k, k_labels.length); + for (var j = k_labels.length - 1; j >= 0; j--, n /= k) { + if (absx >= n) { + label = Dygraph.round_(x / n, digits) + k_labels[j]; + break; + } + } + if (kmg2) { + // TODO(danvk): clean up this logic. Why so different than kmb? + var x_parts = String(x.toExponential()).split('e-'); + if (x_parts.length === 2 && x_parts[1] >= 3 && x_parts[1] <= 24) { + if (x_parts[1] % 3 > 0) { + label = Dygraph.round_(x_parts[0] / + Dygraph.pow(10, (x_parts[1] % 3)), + digits); + } else { + label = Number(x_parts[0]).toFixed(2); + } + label += m_labels[Math.floor(x_parts[1] / 3) - 1]; + } + } + } + + return label; +}; + +/** + * variant for use as an axisLabelFormatter. + * @private + */ +Dygraph.numberAxisLabelFormatter = function(x, granularity, opts) { + return Dygraph.numberValueFormatter.call(this, x, opts); +}; + +/** + * @type {!Array.} + * @private + * @constant + */ +Dygraph.SHORT_MONTH_NAMES_ = ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec']; + + +/** + * Convert a JS date to a string appropriate to display on an axis that + * is displaying values at the stated granularity. This respects the + * labelsUTC option. + * @param {Date} date The date to format + * @param {number} granularity One of the Dygraph granularity constants + * @param {Dygraph} opts An options view + * @return {string} The date formatted as local time + * @private + */ +Dygraph.dateAxisLabelFormatter = function(date, granularity, opts) { + var utc = opts('labelsUTC'); + var accessors = utc ? Dygraph.DateAccessorsUTC : Dygraph.DateAccessorsLocal; + + var year = accessors.getFullYear(date), + month = accessors.getMonth(date), + day = accessors.getDate(date), + hours = accessors.getHours(date), + mins = accessors.getMinutes(date), + secs = accessors.getSeconds(date), + millis = accessors.getSeconds(date); + + if (granularity >= Dygraph.DECADAL) { + return '' + year; + } else if (granularity >= Dygraph.MONTHLY) { + return Dygraph.SHORT_MONTH_NAMES_[month] + ' ' + year; + } else { + var frac = hours * 3600 + mins * 60 + secs + 1e-3 * millis; + if (frac === 0 || granularity >= Dygraph.DAILY) { + // e.g. '21 Jan' (%d%b) + return Dygraph.zeropad(day) + ' ' + Dygraph.SHORT_MONTH_NAMES_[month]; + } else { + return Dygraph.hmsString_(hours, mins, secs); + } + } +}; +// alias in case anyone is referencing the old method. +Dygraph.dateAxisFormatter = Dygraph.dateAxisLabelFormatter; + +/** + * Return a string version of a JS date for a value label. This respects the + * labelsUTC option. + * @param {Date} date The date to be formatted + * @param {Dygraph} opts An options view + * @private + */ +Dygraph.dateValueFormatter = function(d, opts) { + return Dygraph.dateString_(d, opts('labelsUTC')); +}; + +/** + * Standard plotters. These may be used by clients. + * Available plotters are: + * - Dygraph.Plotters.linePlotter: draws central lines (most common) + * - Dygraph.Plotters.errorPlotter: draws error bars + * - Dygraph.Plotters.fillPlotter: draws fills under lines (used with fillGraph) + * + * By default, the plotter is [fillPlotter, errorPlotter, linePlotter]. + * This causes all the lines to be drawn over all the fills/error bars. + */ +Dygraph.Plotters = DygraphCanvasRenderer._Plotters; + + +// Default attribute values. +Dygraph.DEFAULT_ATTRS = { + highlightCircleSize: 3, + highlightSeriesOpts: null, + highlightSeriesBackgroundAlpha: 0.5, + + labelsDivWidth: 250, + labelsDivStyles: { + // TODO(danvk): move defaults from createStatusMessage_ here. + }, + labelsSeparateLines: false, + labelsShowZeroValues: true, + labelsKMB: false, + labelsKMG2: false, + showLabelsOnHighlight: true, + + digitsAfterDecimal: 2, + maxNumberWidth: 6, + sigFigs: null, + + strokeWidth: 1.0, + strokeBorderWidth: 0, + strokeBorderColor: "white", + + axisTickSize: 3, + axisLabelFontSize: 14, + rightGap: 5, + + showRoller: false, + xValueParser: Dygraph.dateParser, + + delimiter: ',', + + sigma: 2.0, + errorBars: false, + fractions: false, + wilsonInterval: true, // only relevant if fractions is true + customBars: false, + fillGraph: false, + fillAlpha: 0.15, + connectSeparatedPoints: false, + + stackedGraph: false, + stackedGraphNaNFill: 'all', + hideOverlayOnMouseOut: true, + + legend: 'onmouseover', + stepPlot: false, + avoidMinZero: false, + xRangePad: 0, + yRangePad: null, + drawAxesAtZero: false, + + // Sizes of the various chart labels. + titleHeight: 28, + xLabelHeight: 18, + yLabelWidth: 18, + + drawXAxis: true, + drawYAxis: true, + axisLineColor: "black", + axisLineWidth: 0.3, + gridLineWidth: 0.3, + axisLabelColor: "black", + axisLabelWidth: 50, + drawYGrid: true, + drawXGrid: true, + gridLineColor: "rgb(128,128,128)", + + interactionModel: null, // will be set to Dygraph.Interaction.defaultModel + animatedZooms: false, // (for now) + + // Range selector options + showRangeSelector: false, + rangeSelectorHeight: 40, + rangeSelectorPlotStrokeColor: "#808FAB", + rangeSelectorPlotFillColor: "#A7B1C4", + showInRangeSelector: null, + + // The ordering here ensures that central lines always appear above any + // fill bars/error bars. + plotter: [ + Dygraph.Plotters.fillPlotter, + Dygraph.Plotters.errorPlotter, + Dygraph.Plotters.linePlotter + ], + + plugins: [ ], + + // per-axis options + axes: { + x: { + pixelsPerLabel: 70, + axisLabelWidth: 60, + axisLabelFormatter: Dygraph.dateAxisLabelFormatter, + valueFormatter: Dygraph.dateValueFormatter, + drawGrid: true, + drawAxis: true, + independentTicks: true, + ticker: null // will be set in dygraph-tickers.js + }, + y: { + axisLabelWidth: 50, + pixelsPerLabel: 30, + valueFormatter: Dygraph.numberValueFormatter, + axisLabelFormatter: Dygraph.numberAxisLabelFormatter, + drawGrid: true, + drawAxis: true, + independentTicks: true, + ticker: null // will be set in dygraph-tickers.js + }, + y2: { + axisLabelWidth: 50, + pixelsPerLabel: 30, + valueFormatter: Dygraph.numberValueFormatter, + axisLabelFormatter: Dygraph.numberAxisLabelFormatter, + drawAxis: true, // only applies when there are two axes of data. + drawGrid: false, + independentTicks: false, + ticker: null // will be set in dygraph-tickers.js + } + } +}; + +// Directions for panning and zooming. Use bit operations when combined +// values are possible. +Dygraph.HORIZONTAL = 1; +Dygraph.VERTICAL = 2; + +// Installed plugins, in order of precedence (most-general to most-specific). +// Plugins are installed after they are defined, in plugins/install.js. +Dygraph.PLUGINS = [ +]; + +// Used for initializing annotation CSS rules only once. +Dygraph.addedAnnotationCSS = false; + +Dygraph.prototype.__old_init__ = function(div, file, labels, attrs) { + // Labels is no longer a constructor parameter, since it's typically set + // directly from the data source. It also conains a name for the x-axis, + // which the previous constructor form did not. + if (labels !== null) { + var new_labels = ["Date"]; + for (var i = 0; i < labels.length; i++) new_labels.push(labels[i]); + Dygraph.update(attrs, { 'labels': new_labels }); + } + this.__init__(div, file, attrs); +}; + +/** + * Initializes the Dygraph. This creates a new DIV and constructs the PlotKit + * and context <canvas> inside of it. See the constructor for details. + * on the parameters. + * @param {Element} div the Element to render the graph into. + * @param {string | Function} file Source data + * @param {Object} attrs Miscellaneous other options + * @private + */ +Dygraph.prototype.__init__ = function(div, file, attrs) { + // Hack for IE: if we're using excanvas and the document hasn't finished + // loading yet (and hence may not have initialized whatever it needs to + // initialize), then keep calling this routine periodically until it has. + if (/MSIE/.test(navigator.userAgent) && !window.opera && + typeof(G_vmlCanvasManager) != 'undefined' && + document.readyState != 'complete') { + var self = this; + setTimeout(function() { self.__init__(div, file, attrs); }, 100); + return; + } + + // Support two-argument constructor + if (attrs === null || attrs === undefined) { attrs = {}; } + + attrs = Dygraph.mapLegacyOptions_(attrs); + + if (typeof(div) == 'string') { + div = document.getElementById(div); + } + + if (!div) { + console.error("Constructing dygraph with a non-existent div!"); + return; + } + + this.isUsingExcanvas_ = typeof(G_vmlCanvasManager) != 'undefined'; + + // Copy the important bits into the object + // TODO(danvk): most of these should just stay in the attrs_ dictionary. + this.maindiv_ = div; + this.file_ = file; + this.rollPeriod_ = attrs.rollPeriod || Dygraph.DEFAULT_ROLL_PERIOD; + this.previousVerticalX_ = -1; + this.fractions_ = attrs.fractions || false; + this.dateWindow_ = attrs.dateWindow || null; + + this.annotations_ = []; + + // Zoomed indicators - These indicate when the graph has been zoomed and on what axis. + this.zoomed_x_ = false; + this.zoomed_y_ = false; + + // Clear the div. This ensure that, if multiple dygraphs are passed the same + // div, then only one will be drawn. + div.innerHTML = ""; + + // For historical reasons, the 'width' and 'height' options trump all CSS + // rules _except_ for an explicit 'width' or 'height' on the div. + // As an added convenience, if the div has zero height (like
    does + // without any styles), then we use a default height/width. + if (div.style.width === '' && attrs.width) { + div.style.width = attrs.width + "px"; + } + if (div.style.height === '' && attrs.height) { + div.style.height = attrs.height + "px"; + } + if (div.style.height === '' && div.clientHeight === 0) { + div.style.height = Dygraph.DEFAULT_HEIGHT + "px"; + if (div.style.width === '') { + div.style.width = Dygraph.DEFAULT_WIDTH + "px"; + } + } + // These will be zero if the dygraph's div is hidden. In that case, + // use the user-specified attributes if present. If not, use zero + // and assume the user will call resize to fix things later. + this.width_ = div.clientWidth || attrs.width || 0; + this.height_ = div.clientHeight || attrs.height || 0; + + // TODO(danvk): set fillGraph to be part of attrs_ here, not user_attrs_. + if (attrs.stackedGraph) { + attrs.fillGraph = true; + // TODO(nikhilk): Add any other stackedGraph checks here. + } + + // DEPRECATION WARNING: All option processing should be moved from + // attrs_ and user_attrs_ to options_, which holds all this information. + // + // Dygraphs has many options, some of which interact with one another. + // To keep track of everything, we maintain two sets of options: + // + // this.user_attrs_ only options explicitly set by the user. + // this.attrs_ defaults, options derived from user_attrs_, data. + // + // Options are then accessed this.attr_('attr'), which first looks at + // user_attrs_ and then computed attrs_. This way Dygraphs can set intelligent + // defaults without overriding behavior that the user specifically asks for. + this.user_attrs_ = {}; + Dygraph.update(this.user_attrs_, attrs); + + // This sequence ensures that Dygraph.DEFAULT_ATTRS is never modified. + this.attrs_ = {}; + Dygraph.updateDeep(this.attrs_, Dygraph.DEFAULT_ATTRS); + + this.boundaryIds_ = []; + this.setIndexByName_ = {}; + this.datasetIndex_ = []; + + this.registeredEvents_ = []; + this.eventListeners_ = {}; + + this.attributes_ = new DygraphOptions(this); + + // Create the containing DIV and other interactive elements + this.createInterface_(); + + // Activate plugins. + this.plugins_ = []; + var plugins = Dygraph.PLUGINS.concat(this.getOption('plugins')); + for (var i = 0; i < plugins.length; i++) { + // the plugins option may contain either plugin classes or instances. + // Plugin instances contain an activate method. + var Plugin = plugins[i]; // either a constructor or an instance. + var pluginInstance; + if (typeof(Plugin.activate) !== 'undefined') { + pluginInstance = Plugin; + } else { + pluginInstance = new Plugin(); + } + + var pluginDict = { + plugin: pluginInstance, + events: {}, + options: {}, + pluginOptions: {} + }; + + var handlers = pluginInstance.activate(this); + for (var eventName in handlers) { + if (!handlers.hasOwnProperty(eventName)) continue; + // TODO(danvk): validate eventName. + pluginDict.events[eventName] = handlers[eventName]; + } + + this.plugins_.push(pluginDict); + } + + // At this point, plugins can no longer register event handlers. + // Construct a map from event -> ordered list of [callback, plugin]. + for (var i = 0; i < this.plugins_.length; i++) { + var plugin_dict = this.plugins_[i]; + for (var eventName in plugin_dict.events) { + if (!plugin_dict.events.hasOwnProperty(eventName)) continue; + var callback = plugin_dict.events[eventName]; + + var pair = [plugin_dict.plugin, callback]; + if (!(eventName in this.eventListeners_)) { + this.eventListeners_[eventName] = [pair]; + } else { + this.eventListeners_[eventName].push(pair); + } + } + } + + this.createDragInterface_(); + + this.start_(); +}; + +/** + * Triggers a cascade of events to the various plugins which are interested in them. + * Returns true if the "default behavior" should be prevented, i.e. if one + * of the event listeners called event.preventDefault(). + * @private + */ +Dygraph.prototype.cascadeEvents_ = function(name, extra_props) { + if (!(name in this.eventListeners_)) return false; + + // QUESTION: can we use objects & prototypes to speed this up? + var e = { + dygraph: this, + cancelable: false, + defaultPrevented: false, + preventDefault: function() { + if (!e.cancelable) throw "Cannot call preventDefault on non-cancelable event."; + e.defaultPrevented = true; + }, + propagationStopped: false, + stopPropagation: function() { + e.propagationStopped = true; + } + }; + Dygraph.update(e, extra_props); + + var callback_plugin_pairs = this.eventListeners_[name]; + if (callback_plugin_pairs) { + for (var i = callback_plugin_pairs.length - 1; i >= 0; i--) { + var plugin = callback_plugin_pairs[i][0]; + var callback = callback_plugin_pairs[i][1]; + callback.call(plugin, e); + if (e.propagationStopped) break; + } + } + return e.defaultPrevented; +}; + +/** + * Fetch a plugin instance of a particular class. Only for testing. + * @private + * @param {!Class} type The type of the plugin. + * @return {Object} Instance of the plugin, or null if there is none. + */ +Dygraph.prototype.getPluginInstance_ = function(type) { + for (var i = 0; i < this.plugins_.length; i++) { + var p = this.plugins_[i]; + if (p.plugin instanceof type) { + return p.plugin; + } + } + return null; +}; + +/** + * Returns the zoomed status of the chart for one or both axes. + * + * Axis is an optional parameter. Can be set to 'x' or 'y'. + * + * The zoomed status for an axis is set whenever a user zooms using the mouse + * or when the dateWindow or valueRange are updated (unless the + * isZoomedIgnoreProgrammaticZoom option is also specified). + */ +Dygraph.prototype.isZoomed = function(axis) { + if (axis === null || axis === undefined) { + return this.zoomed_x_ || this.zoomed_y_; + } + if (axis === 'x') return this.zoomed_x_; + if (axis === 'y') return this.zoomed_y_; + throw "axis parameter is [" + axis + "] must be null, 'x' or 'y'."; +}; + +/** + * Returns information about the Dygraph object, including its containing ID. + */ +Dygraph.prototype.toString = function() { + var maindiv = this.maindiv_; + var id = (maindiv && maindiv.id) ? maindiv.id : maindiv; + return "[Dygraph " + id + "]"; +}; + +/** + * @private + * Returns the value of an option. This may be set by the user (either in the + * constructor or by calling updateOptions) or by dygraphs, and may be set to a + * per-series value. + * @param {string} name The name of the option, e.g. 'rollPeriod'. + * @param {string} [seriesName] The name of the series to which the option + * will be applied. If no per-series value of this option is available, then + * the global value is returned. This is optional. + * @return { ... } The value of the option. + */ +Dygraph.prototype.attr_ = function(name, seriesName) { + if (DEBUG) { + if (typeof(Dygraph.OPTIONS_REFERENCE) === 'undefined') { + console.error('Must include options reference JS for testing'); + } else if (!Dygraph.OPTIONS_REFERENCE.hasOwnProperty(name)) { + console.error('Dygraphs is using property ' + name + ', which has no ' + + 'entry in the Dygraphs.OPTIONS_REFERENCE listing.'); + // Only log this error once. + Dygraph.OPTIONS_REFERENCE[name] = true; + } + } + return seriesName ? this.attributes_.getForSeries(name, seriesName) : this.attributes_.get(name); +}; + +/** + * Returns the current value for an option, as set in the constructor or via + * updateOptions. You may pass in an (optional) series name to get per-series + * values for the option. + * + * All values returned by this method should be considered immutable. If you + * modify them, there is no guarantee that the changes will be honored or that + * dygraphs will remain in a consistent state. If you want to modify an option, + * use updateOptions() instead. + * + * @param {string} name The name of the option (e.g. 'strokeWidth') + * @param {string=} opt_seriesName Series name to get per-series values. + * @return {*} The value of the option. + */ +Dygraph.prototype.getOption = function(name, opt_seriesName) { + return this.attr_(name, opt_seriesName); +}; + +/** + * Like getOption(), but specifically returns a number. + * This is a convenience function for working with the Closure Compiler. + * @param {string} name The name of the option (e.g. 'strokeWidth') + * @param {string=} opt_seriesName Series name to get per-series values. + * @return {number} The value of the option. + * @private + */ +Dygraph.prototype.getNumericOption = function(name, opt_seriesName) { + return /** @type{number} */(this.getOption(name, opt_seriesName)); +}; + +/** + * Like getOption(), but specifically returns a string. + * This is a convenience function for working with the Closure Compiler. + * @param {string} name The name of the option (e.g. 'strokeWidth') + * @param {string=} opt_seriesName Series name to get per-series values. + * @return {string} The value of the option. + * @private + */ +Dygraph.prototype.getStringOption = function(name, opt_seriesName) { + return /** @type{string} */(this.getOption(name, opt_seriesName)); +}; + +/** + * Like getOption(), but specifically returns a boolean. + * This is a convenience function for working with the Closure Compiler. + * @param {string} name The name of the option (e.g. 'strokeWidth') + * @param {string=} opt_seriesName Series name to get per-series values. + * @return {boolean} The value of the option. + * @private + */ +Dygraph.prototype.getBooleanOption = function(name, opt_seriesName) { + return /** @type{boolean} */(this.getOption(name, opt_seriesName)); +}; + +/** + * Like getOption(), but specifically returns a function. + * This is a convenience function for working with the Closure Compiler. + * @param {string} name The name of the option (e.g. 'strokeWidth') + * @param {string=} opt_seriesName Series name to get per-series values. + * @return {function(...)} The value of the option. + * @private + */ +Dygraph.prototype.getFunctionOption = function(name, opt_seriesName) { + return /** @type{function(...)} */(this.getOption(name, opt_seriesName)); +}; + +Dygraph.prototype.getOptionForAxis = function(name, axis) { + return this.attributes_.getForAxis(name, axis); +}; + +/** + * @private + * @param {string} axis The name of the axis (i.e. 'x', 'y' or 'y2') + * @return { ... } A function mapping string -> option value + */ +Dygraph.prototype.optionsViewForAxis_ = function(axis) { + var self = this; + return function(opt) { + var axis_opts = self.user_attrs_.axes; + if (axis_opts && axis_opts[axis] && axis_opts[axis].hasOwnProperty(opt)) { + return axis_opts[axis][opt]; + } + + // I don't like that this is in a second spot. + if (axis === 'x' && opt === 'logscale') { + // return the default value. + // TODO(konigsberg): pull the default from a global default. + return false; + } + + // user-specified attributes always trump defaults, even if they're less + // specific. + if (typeof(self.user_attrs_[opt]) != 'undefined') { + return self.user_attrs_[opt]; + } + + axis_opts = self.attrs_.axes; + if (axis_opts && axis_opts[axis] && axis_opts[axis].hasOwnProperty(opt)) { + return axis_opts[axis][opt]; + } + // check old-style axis options + // TODO(danvk): add a deprecation warning if either of these match. + if (axis == 'y' && self.axes_[0].hasOwnProperty(opt)) { + return self.axes_[0][opt]; + } else if (axis == 'y2' && self.axes_[1].hasOwnProperty(opt)) { + return self.axes_[1][opt]; + } + return self.attr_(opt); + }; +}; + +/** + * Returns the current rolling period, as set by the user or an option. + * @return {number} The number of points in the rolling window + */ +Dygraph.prototype.rollPeriod = function() { + return this.rollPeriod_; +}; + +/** + * Returns the currently-visible x-range. This can be affected by zooming, + * panning or a call to updateOptions. + * Returns a two-element array: [left, right]. + * If the Dygraph has dates on the x-axis, these will be millis since epoch. + */ +Dygraph.prototype.xAxisRange = function() { + return this.dateWindow_ ? this.dateWindow_ : this.xAxisExtremes(); +}; + +/** + * Returns the lower- and upper-bound x-axis values of the + * data set. + */ +Dygraph.prototype.xAxisExtremes = function() { + var pad = this.getNumericOption('xRangePad') / this.plotter_.area.w; + if (this.numRows() === 0) { + return [0 - pad, 1 + pad]; + } + var left = this.rawData_[0][0]; + var right = this.rawData_[this.rawData_.length - 1][0]; + if (pad) { + // Must keep this in sync with dygraph-layout _evaluateLimits() + var range = right - left; + left -= range * pad; + right += range * pad; + } + return [left, right]; +}; + +/** + * Returns the currently-visible y-range for an axis. This can be affected by + * zooming, panning or a call to updateOptions. Axis indices are zero-based. If + * called with no arguments, returns the range of the first axis. + * Returns a two-element array: [bottom, top]. + */ +Dygraph.prototype.yAxisRange = function(idx) { + if (typeof(idx) == "undefined") idx = 0; + if (idx < 0 || idx >= this.axes_.length) { + return null; + } + var axis = this.axes_[idx]; + return [ axis.computedValueRange[0], axis.computedValueRange[1] ]; +}; + +/** + * Returns the currently-visible y-ranges for each axis. This can be affected by + * zooming, panning, calls to updateOptions, etc. + * Returns an array of [bottom, top] pairs, one for each y-axis. + */ +Dygraph.prototype.yAxisRanges = function() { + var ret = []; + for (var i = 0; i < this.axes_.length; i++) { + ret.push(this.yAxisRange(i)); + } + return ret; +}; + +// TODO(danvk): use these functions throughout dygraphs. +/** + * Convert from data coordinates to canvas/div X/Y coordinates. + * If specified, do this conversion for the coordinate system of a particular + * axis. Uses the first axis by default. + * Returns a two-element array: [X, Y] + * + * Note: use toDomXCoord instead of toDomCoords(x, null) and use toDomYCoord + * instead of toDomCoords(null, y, axis). + */ +Dygraph.prototype.toDomCoords = function(x, y, axis) { + return [ this.toDomXCoord(x), this.toDomYCoord(y, axis) ]; +}; + +/** + * Convert from data x coordinates to canvas/div X coordinate. + * If specified, do this conversion for the coordinate system of a particular + * axis. + * Returns a single value or null if x is null. + */ +Dygraph.prototype.toDomXCoord = function(x) { + if (x === null) { + return null; + } + + var area = this.plotter_.area; + var xRange = this.xAxisRange(); + return area.x + (x - xRange[0]) / (xRange[1] - xRange[0]) * area.w; +}; + +/** + * Convert from data x coordinates to canvas/div Y coordinate and optional + * axis. Uses the first axis by default. + * + * returns a single value or null if y is null. + */ +Dygraph.prototype.toDomYCoord = function(y, axis) { + var pct = this.toPercentYCoord(y, axis); + + if (pct === null) { + return null; + } + var area = this.plotter_.area; + return area.y + pct * area.h; +}; + +/** + * Convert from canvas/div coords to data coordinates. + * If specified, do this conversion for the coordinate system of a particular + * axis. Uses the first axis by default. + * Returns a two-element array: [X, Y]. + * + * Note: use toDataXCoord instead of toDataCoords(x, null) and use toDataYCoord + * instead of toDataCoords(null, y, axis). + */ +Dygraph.prototype.toDataCoords = function(x, y, axis) { + return [ this.toDataXCoord(x), this.toDataYCoord(y, axis) ]; +}; + +/** + * Convert from canvas/div x coordinate to data coordinate. + * + * If x is null, this returns null. + */ +Dygraph.prototype.toDataXCoord = function(x) { + if (x === null) { + return null; + } + + var area = this.plotter_.area; + var xRange = this.xAxisRange(); + + if (!this.attributes_.getForAxis("logscale", 'x')) { + return xRange[0] + (x - area.x) / area.w * (xRange[1] - xRange[0]); + } else { + // TODO: remove duplicate code? + // Computing the inverse of toDomCoord. + var pct = (x - area.x) / area.w; + + // Computing the inverse of toPercentXCoord. The function was arrived at with + // the following steps: + // + // Original calcuation: + // pct = (log(x) - log(xRange[0])) / (log(xRange[1]) - log(xRange[0]))); + // + // Multiply both sides by the right-side demoninator. + // pct * (log(xRange[1] - log(xRange[0]))) = log(x) - log(xRange[0]) + // + // add log(xRange[0]) to both sides + // log(xRange[0]) + (pct * (log(xRange[1]) - log(xRange[0])) = log(x); + // + // Swap both sides of the equation, + // log(x) = log(xRange[0]) + (pct * (log(xRange[1]) - log(xRange[0])) + // + // Use both sides as the exponent in 10^exp and we're done. + // x = 10 ^ (log(xRange[0]) + (pct * (log(xRange[1]) - log(xRange[0]))) + var logr0 = Dygraph.log10(xRange[0]); + var logr1 = Dygraph.log10(xRange[1]); + var exponent = logr0 + (pct * (logr1 - logr0)); + var value = Math.pow(Dygraph.LOG_SCALE, exponent); + return value; + } +}; + +/** + * Convert from canvas/div y coord to value. + * + * If y is null, this returns null. + * if axis is null, this uses the first axis. + */ +Dygraph.prototype.toDataYCoord = function(y, axis) { + if (y === null) { + return null; + } + + var area = this.plotter_.area; + var yRange = this.yAxisRange(axis); + + if (typeof(axis) == "undefined") axis = 0; + if (!this.attributes_.getForAxis("logscale", axis)) { + return yRange[0] + (area.y + area.h - y) / area.h * (yRange[1] - yRange[0]); + } else { + // Computing the inverse of toDomCoord. + var pct = (y - area.y) / area.h; + + // Computing the inverse of toPercentYCoord. The function was arrived at with + // the following steps: + // + // Original calcuation: + // pct = (log(yRange[1]) - log(y)) / (log(yRange[1]) - log(yRange[0])); + // + // Multiply both sides by the right-side demoninator. + // pct * (log(yRange[1]) - log(yRange[0])) = log(yRange[1]) - log(y); + // + // subtract log(yRange[1]) from both sides. + // (pct * (log(yRange[1]) - log(yRange[0]))) - log(yRange[1]) = -log(y); + // + // and multiply both sides by -1. + // log(yRange[1]) - (pct * (logr1 - log(yRange[0])) = log(y); + // + // Swap both sides of the equation, + // log(y) = log(yRange[1]) - (pct * (log(yRange[1]) - log(yRange[0]))); + // + // Use both sides as the exponent in 10^exp and we're done. + // y = 10 ^ (log(yRange[1]) - (pct * (log(yRange[1]) - log(yRange[0])))); + var logr0 = Dygraph.log10(yRange[0]); + var logr1 = Dygraph.log10(yRange[1]); + var exponent = logr1 - (pct * (logr1 - logr0)); + var value = Math.pow(Dygraph.LOG_SCALE, exponent); + return value; + } +}; + +/** + * Converts a y for an axis to a percentage from the top to the + * bottom of the drawing area. + * + * If the coordinate represents a value visible on the canvas, then + * the value will be between 0 and 1, where 0 is the top of the canvas. + * However, this method will return values outside the range, as + * values can fall outside the canvas. + * + * If y is null, this returns null. + * if axis is null, this uses the first axis. + * + * @param {number} y The data y-coordinate. + * @param {number} [axis] The axis number on which the data coordinate lives. + * @return {number} A fraction in [0, 1] where 0 = the top edge. + */ +Dygraph.prototype.toPercentYCoord = function(y, axis) { + if (y === null) { + return null; + } + if (typeof(axis) == "undefined") axis = 0; + + var yRange = this.yAxisRange(axis); + + var pct; + var logscale = this.attributes_.getForAxis("logscale", axis); + if (logscale) { + var logr0 = Dygraph.log10(yRange[0]); + var logr1 = Dygraph.log10(yRange[1]); + pct = (logr1 - Dygraph.log10(y)) / (logr1 - logr0); + } else { + // yRange[1] - y is unit distance from the bottom. + // yRange[1] - yRange[0] is the scale of the range. + // (yRange[1] - y) / (yRange[1] - yRange[0]) is the % from the bottom. + pct = (yRange[1] - y) / (yRange[1] - yRange[0]); + } + return pct; +}; + +/** + * Converts an x value to a percentage from the left to the right of + * the drawing area. + * + * If the coordinate represents a value visible on the canvas, then + * the value will be between 0 and 1, where 0 is the left of the canvas. + * However, this method will return values outside the range, as + * values can fall outside the canvas. + * + * If x is null, this returns null. + * @param {number} x The data x-coordinate. + * @return {number} A fraction in [0, 1] where 0 = the left edge. + */ +Dygraph.prototype.toPercentXCoord = function(x) { + if (x === null) { + return null; + } + + var xRange = this.xAxisRange(); + var pct; + var logscale = this.attributes_.getForAxis("logscale", 'x') ; + if (logscale === true) { // logscale can be null so we test for true explicitly. + var logr0 = Dygraph.log10(xRange[0]); + var logr1 = Dygraph.log10(xRange[1]); + pct = (Dygraph.log10(x) - logr0) / (logr1 - logr0); + } else { + // x - xRange[0] is unit distance from the left. + // xRange[1] - xRange[0] is the scale of the range. + // The full expression below is the % from the left. + pct = (x - xRange[0]) / (xRange[1] - xRange[0]); + } + return pct; +}; + +/** + * Returns the number of columns (including the independent variable). + * @return {number} The number of columns. + */ +Dygraph.prototype.numColumns = function() { + if (!this.rawData_) return 0; + return this.rawData_[0] ? this.rawData_[0].length : this.attr_("labels").length; +}; + +/** + * Returns the number of rows (excluding any header/label row). + * @return {number} The number of rows, less any header. + */ +Dygraph.prototype.numRows = function() { + if (!this.rawData_) return 0; + return this.rawData_.length; +}; + +/** + * Returns the value in the given row and column. If the row and column exceed + * the bounds on the data, returns null. Also returns null if the value is + * missing. + * @param {number} row The row number of the data (0-based). Row 0 is the + * first row of data, not a header row. + * @param {number} col The column number of the data (0-based) + * @return {number} The value in the specified cell or null if the row/col + * were out of range. + */ +Dygraph.prototype.getValue = function(row, col) { + if (row < 0 || row > this.rawData_.length) return null; + if (col < 0 || col > this.rawData_[row].length) return null; + + return this.rawData_[row][col]; +}; + +/** + * Generates interface elements for the Dygraph: a containing div, a div to + * display the current point, and a textbox to adjust the rolling average + * period. Also creates the Renderer/Layout elements. + * @private + */ +Dygraph.prototype.createInterface_ = function() { + // Create the all-enclosing graph div + var enclosing = this.maindiv_; + + this.graphDiv = document.createElement("div"); + + // TODO(danvk): any other styles that are useful to set here? + this.graphDiv.style.textAlign = 'left'; // This is a CSS "reset" + this.graphDiv.style.position = 'relative'; + enclosing.appendChild(this.graphDiv); + + // Create the canvas for interactive parts of the chart. + this.canvas_ = Dygraph.createCanvas(); + this.canvas_.style.position = "absolute"; + + // ... and for static parts of the chart. + this.hidden_ = this.createPlotKitCanvas_(this.canvas_); + + this.canvas_ctx_ = Dygraph.getContext(this.canvas_); + this.hidden_ctx_ = Dygraph.getContext(this.hidden_); + + this.resizeElements_(); + + // The interactive parts of the graph are drawn on top of the chart. + this.graphDiv.appendChild(this.hidden_); + this.graphDiv.appendChild(this.canvas_); + this.mouseEventElement_ = this.createMouseEventElement_(); + + // Create the grapher + this.layout_ = new DygraphLayout(this); + + var dygraph = this; + + this.mouseMoveHandler_ = function(e) { + dygraph.mouseMove_(e); + }; + + this.mouseOutHandler_ = function(e) { + // The mouse has left the chart if: + // 1. e.target is inside the chart + // 2. e.relatedTarget is outside the chart + var target = e.target || e.fromElement; + var relatedTarget = e.relatedTarget || e.toElement; + if (Dygraph.isNodeContainedBy(target, dygraph.graphDiv) && + !Dygraph.isNodeContainedBy(relatedTarget, dygraph.graphDiv)) { + dygraph.mouseOut_(e); + } + }; + + this.addAndTrackEvent(window, 'mouseout', this.mouseOutHandler_); + this.addAndTrackEvent(this.mouseEventElement_, 'mousemove', this.mouseMoveHandler_); + + // Don't recreate and register the resize handler on subsequent calls. + // This happens when the graph is resized. + if (!this.resizeHandler_) { + this.resizeHandler_ = function(e) { + dygraph.resize(); + }; + + // Update when the window is resized. + // TODO(danvk): drop frames depending on complexity of the chart. + this.addAndTrackEvent(window, 'resize', this.resizeHandler_); + } +}; + +Dygraph.prototype.resizeElements_ = function() { + this.graphDiv.style.width = this.width_ + "px"; + this.graphDiv.style.height = this.height_ + "px"; + + var canvasScale = Dygraph.getContextPixelRatio(this.canvas_ctx_); + this.canvas_.width = this.width_ * canvasScale; + this.canvas_.height = this.height_ * canvasScale; + this.canvas_.style.width = this.width_ + "px"; // for IE + this.canvas_.style.height = this.height_ + "px"; // for IE + if (canvasScale !== 1) { + this.canvas_ctx_.scale(canvasScale, canvasScale); + } + + var hiddenScale = Dygraph.getContextPixelRatio(this.hidden_ctx_); + this.hidden_.width = this.width_ * hiddenScale; + this.hidden_.height = this.height_ * hiddenScale; + this.hidden_.style.width = this.width_ + "px"; // for IE + this.hidden_.style.height = this.height_ + "px"; // for IE + if (hiddenScale !== 1) { + this.hidden_ctx_.scale(hiddenScale, hiddenScale); + } +}; + +/** + * Detach DOM elements in the dygraph and null out all data references. + * Calling this when you're done with a dygraph can dramatically reduce memory + * usage. See, e.g., the tests/perf.html example. + */ +Dygraph.prototype.destroy = function() { + this.canvas_ctx_.restore(); + this.hidden_ctx_.restore(); + + // Destroy any plugins, in the reverse order that they were registered. + for (var i = this.plugins_.length - 1; i >= 0; i--) { + var p = this.plugins_.pop(); + if (p.plugin.destroy) p.plugin.destroy(); + } + + var removeRecursive = function(node) { + while (node.hasChildNodes()) { + removeRecursive(node.firstChild); + node.removeChild(node.firstChild); + } + }; + + this.removeTrackedEvents_(); + + // remove mouse event handlers (This may not be necessary anymore) + Dygraph.removeEvent(window, 'mouseout', this.mouseOutHandler_); + Dygraph.removeEvent(this.mouseEventElement_, 'mousemove', this.mouseMoveHandler_); + + // remove window handlers + Dygraph.removeEvent(window,'resize', this.resizeHandler_); + this.resizeHandler_ = null; + + removeRecursive(this.maindiv_); + + var nullOut = function(obj) { + for (var n in obj) { + if (typeof(obj[n]) === 'object') { + obj[n] = null; + } + } + }; + // These may not all be necessary, but it can't hurt... + nullOut(this.layout_); + nullOut(this.plotter_); + nullOut(this); +}; + +/** + * Creates the canvas on which the chart will be drawn. Only the Renderer ever + * draws on this particular canvas. All Dygraph work (i.e. drawing hover dots + * or the zoom rectangles) is done on this.canvas_. + * @param {Object} canvas The Dygraph canvas over which to overlay the plot + * @return {Object} The newly-created canvas + * @private + */ +Dygraph.prototype.createPlotKitCanvas_ = function(canvas) { + var h = Dygraph.createCanvas(); + h.style.position = "absolute"; + // TODO(danvk): h should be offset from canvas. canvas needs to include + // some extra area to make it easier to zoom in on the far left and far + // right. h needs to be precisely the plot area, so that clipping occurs. + h.style.top = canvas.style.top; + h.style.left = canvas.style.left; + h.width = this.width_; + h.height = this.height_; + h.style.width = this.width_ + "px"; // for IE + h.style.height = this.height_ + "px"; // for IE + return h; +}; + +/** + * Creates an overlay element used to handle mouse events. + * @return {Object} The mouse event element. + * @private + */ +Dygraph.prototype.createMouseEventElement_ = function() { + if (this.isUsingExcanvas_) { + var elem = document.createElement("div"); + elem.style.position = 'absolute'; + elem.style.backgroundColor = 'white'; + elem.style.filter = 'alpha(opacity=0)'; + elem.style.width = this.width_ + "px"; + elem.style.height = this.height_ + "px"; + this.graphDiv.appendChild(elem); + return elem; + } else { + return this.canvas_; + } +}; + +/** + * Generate a set of distinct colors for the data series. This is done with a + * color wheel. Saturation/Value are customizable, and the hue is + * equally-spaced around the color wheel. If a custom set of colors is + * specified, that is used instead. + * @private + */ +Dygraph.prototype.setColors_ = function() { + var labels = this.getLabels(); + var num = labels.length - 1; + this.colors_ = []; + this.colorsMap_ = {}; + + // These are used for when no custom colors are specified. + var sat = this.getNumericOption('colorSaturation') || 1.0; + var val = this.getNumericOption('colorValue') || 0.5; + var half = Math.ceil(num / 2); + + var colors = this.getOption('colors'); + var visibility = this.visibility(); + for (var i = 0; i < num; i++) { + if (!visibility[i]) { + continue; + } + var label = labels[i + 1]; + var colorStr = this.attributes_.getForSeries('color', label); + if (!colorStr) { + if (colors) { + colorStr = colors[i % colors.length]; + } else { + // alternate colors for high contrast. + var idx = i % 2 ? (half + (i + 1)/ 2) : Math.ceil((i + 1) / 2); + var hue = (1.0 * idx / (1 + num)); + colorStr = Dygraph.hsvToRGB(hue, sat, val); + } + } + this.colors_.push(colorStr); + this.colorsMap_[label] = colorStr; + } +}; + +/** + * Return the list of colors. This is either the list of colors passed in the + * attributes or the autogenerated list of rgb(r,g,b) strings. + * This does not return colors for invisible series. + * @return {Array.} The list of colors. + */ +Dygraph.prototype.getColors = function() { + return this.colors_; +}; + +/** + * Returns a few attributes of a series, i.e. its color, its visibility, which + * axis it's assigned to, and its column in the original data. + * Returns null if the series does not exist. + * Otherwise, returns an object with column, visibility, color and axis properties. + * The "axis" property will be set to 1 for y1 and 2 for y2. + * The "column" property can be fed back into getValue(row, column) to get + * values for this series. + */ +Dygraph.prototype.getPropertiesForSeries = function(series_name) { + var idx = -1; + var labels = this.getLabels(); + for (var i = 1; i < labels.length; i++) { + if (labels[i] == series_name) { + idx = i; + break; + } + } + if (idx == -1) return null; + + return { + name: series_name, + column: idx, + visible: this.visibility()[idx - 1], + color: this.colorsMap_[series_name], + axis: 1 + this.attributes_.axisForSeries(series_name) + }; +}; + +/** + * Create the text box to adjust the averaging period + * @private + */ +Dygraph.prototype.createRollInterface_ = function() { + // Create a roller if one doesn't exist already. + if (!this.roller_) { + this.roller_ = document.createElement("input"); + this.roller_.type = "text"; + this.roller_.style.display = "none"; + this.graphDiv.appendChild(this.roller_); + } + + var display = this.getBooleanOption('showRoller') ? 'block' : 'none'; + + var area = this.plotter_.area; + var textAttr = { "position": "absolute", + "zIndex": 10, + "top": (area.y + area.h - 25) + "px", + "left": (area.x + 1) + "px", + "display": display + }; + this.roller_.size = "2"; + this.roller_.value = this.rollPeriod_; + for (var name in textAttr) { + if (textAttr.hasOwnProperty(name)) { + this.roller_.style[name] = textAttr[name]; + } + } + + var dygraph = this; + this.roller_.onchange = function() { dygraph.adjustRoll(dygraph.roller_.value); }; +}; + +/** + * Set up all the mouse handlers needed to capture dragging behavior for zoom + * events. + * @private + */ +Dygraph.prototype.createDragInterface_ = function() { + var context = { + // Tracks whether the mouse is down right now + isZooming: false, + isPanning: false, // is this drag part of a pan? + is2DPan: false, // if so, is that pan 1- or 2-dimensional? + dragStartX: null, // pixel coordinates + dragStartY: null, // pixel coordinates + dragEndX: null, // pixel coordinates + dragEndY: null, // pixel coordinates + dragDirection: null, + prevEndX: null, // pixel coordinates + prevEndY: null, // pixel coordinates + prevDragDirection: null, + cancelNextDblclick: false, // see comment in dygraph-interaction-model.js + + // The value on the left side of the graph when a pan operation starts. + initialLeftmostDate: null, + + // The number of units each pixel spans. (This won't be valid for log + // scales) + xUnitsPerPixel: null, + + // TODO(danvk): update this comment + // The range in second/value units that the viewport encompasses during a + // panning operation. + dateRange: null, + + // Top-left corner of the canvas, in DOM coords + // TODO(konigsberg): Rename topLeftCanvasX, topLeftCanvasY. + px: 0, + py: 0, + + // Values for use with panEdgeFraction, which limit how far outside the + // graph's data boundaries it can be panned. + boundedDates: null, // [minDate, maxDate] + boundedValues: null, // [[minValue, maxValue] ...] + + // We cover iframes during mouse interactions. See comments in + // dygraph-utils.js for more info on why this is a good idea. + tarp: new Dygraph.IFrameTarp(), + + // contextB is the same thing as this context object but renamed. + initializeMouseDown: function(event, g, contextB) { + // prevents mouse drags from selecting page text. + if (event.preventDefault) { + event.preventDefault(); // Firefox, Chrome, etc. + } else { + event.returnValue = false; // IE + event.cancelBubble = true; + } + + var canvasPos = Dygraph.findPos(g.canvas_); + contextB.px = canvasPos.x; + contextB.py = canvasPos.y; + contextB.dragStartX = Dygraph.dragGetX_(event, contextB); + contextB.dragStartY = Dygraph.dragGetY_(event, contextB); + contextB.cancelNextDblclick = false; + contextB.tarp.cover(); + }, + destroy: function() { + var context = this; + if (context.isZooming || context.isPanning) { + context.isZooming = false; + context.dragStartX = null; + context.dragStartY = null; + } + + if (context.isPanning) { + context.isPanning = false; + context.draggingDate = null; + context.dateRange = null; + for (var i = 0; i < self.axes_.length; i++) { + delete self.axes_[i].draggingValue; + delete self.axes_[i].dragValueRange; + } + } + + context.tarp.uncover(); + } + }; + + var interactionModel = this.getOption("interactionModel"); + + // Self is the graph. + var self = this; + + // Function that binds the graph and context to the handler. + var bindHandler = function(handler) { + return function(event) { + handler(event, self, context); + }; + }; + + for (var eventName in interactionModel) { + if (!interactionModel.hasOwnProperty(eventName)) continue; + this.addAndTrackEvent(this.mouseEventElement_, eventName, + bindHandler(interactionModel[eventName])); + } + + // If the user releases the mouse button during a drag, but not over the + // canvas, then it doesn't count as a zooming action. + if (!interactionModel.willDestroyContextMyself) { + var mouseUpHandler = function(event) { + context.destroy(); + }; + + this.addAndTrackEvent(document, 'mouseup', mouseUpHandler); + } +}; + +/** + * Draw a gray zoom rectangle over the desired area of the canvas. Also clears + * up any previous zoom rectangles that were drawn. This could be optimized to + * avoid extra redrawing, but it's tricky to avoid interactions with the status + * dots. + * + * @param {number} direction the direction of the zoom rectangle. Acceptable + * values are Dygraph.HORIZONTAL and Dygraph.VERTICAL. + * @param {number} startX The X position where the drag started, in canvas + * coordinates. + * @param {number} endX The current X position of the drag, in canvas coords. + * @param {number} startY The Y position where the drag started, in canvas + * coordinates. + * @param {number} endY The current Y position of the drag, in canvas coords. + * @param {number} prevDirection the value of direction on the previous call to + * this function. Used to avoid excess redrawing + * @param {number} prevEndX The value of endX on the previous call to this + * function. Used to avoid excess redrawing + * @param {number} prevEndY The value of endY on the previous call to this + * function. Used to avoid excess redrawing + * @private + */ +Dygraph.prototype.drawZoomRect_ = function(direction, startX, endX, startY, + endY, prevDirection, prevEndX, + prevEndY) { + var ctx = this.canvas_ctx_; + + // Clean up from the previous rect if necessary + if (prevDirection == Dygraph.HORIZONTAL) { + ctx.clearRect(Math.min(startX, prevEndX), this.layout_.getPlotArea().y, + Math.abs(startX - prevEndX), this.layout_.getPlotArea().h); + } else if (prevDirection == Dygraph.VERTICAL) { + ctx.clearRect(this.layout_.getPlotArea().x, Math.min(startY, prevEndY), + this.layout_.getPlotArea().w, Math.abs(startY - prevEndY)); + } + + // Draw a light-grey rectangle to show the new viewing area + if (direction == Dygraph.HORIZONTAL) { + if (endX && startX) { + ctx.fillStyle = "rgba(128,128,128,0.33)"; + ctx.fillRect(Math.min(startX, endX), this.layout_.getPlotArea().y, + Math.abs(endX - startX), this.layout_.getPlotArea().h); + } + } else if (direction == Dygraph.VERTICAL) { + if (endY && startY) { + ctx.fillStyle = "rgba(128,128,128,0.33)"; + ctx.fillRect(this.layout_.getPlotArea().x, Math.min(startY, endY), + this.layout_.getPlotArea().w, Math.abs(endY - startY)); + } + } + + if (this.isUsingExcanvas_) { + this.currentZoomRectArgs_ = [direction, startX, endX, startY, endY, 0, 0, 0]; + } +}; + +/** + * Clear the zoom rectangle (and perform no zoom). + * @private + */ +Dygraph.prototype.clearZoomRect_ = function() { + this.currentZoomRectArgs_ = null; + this.canvas_ctx_.clearRect(0, 0, this.width_, this.height_); +}; + +/** + * Zoom to something containing [lowX, highX]. These are pixel coordinates in + * the canvas. The exact zoom window may be slightly larger if there are no data + * points near lowX or highX. Don't confuse this function with doZoomXDates, + * which accepts dates that match the raw data. This function redraws the graph. + * + * @param {number} lowX The leftmost pixel value that should be visible. + * @param {number} highX The rightmost pixel value that should be visible. + * @private + */ +Dygraph.prototype.doZoomX_ = function(lowX, highX) { + this.currentZoomRectArgs_ = null; + // Find the earliest and latest dates contained in this canvasx range. + // Convert the call to date ranges of the raw data. + var minDate = this.toDataXCoord(lowX); + var maxDate = this.toDataXCoord(highX); + this.doZoomXDates_(minDate, maxDate); +}; + +/** + * Zoom to something containing [minDate, maxDate] values. Don't confuse this + * method with doZoomX which accepts pixel coordinates. This function redraws + * the graph. + * + * @param {number} minDate The minimum date that should be visible. + * @param {number} maxDate The maximum date that should be visible. + * @private + */ +Dygraph.prototype.doZoomXDates_ = function(minDate, maxDate) { + // TODO(danvk): when xAxisRange is null (i.e. "fit to data", the animation + // can produce strange effects. Rather than the x-axis transitioning slowly + // between values, it can jerk around.) + var old_window = this.xAxisRange(); + var new_window = [minDate, maxDate]; + this.zoomed_x_ = true; + var that = this; + this.doAnimatedZoom(old_window, new_window, null, null, function() { + if (that.getFunctionOption("zoomCallback")) { + that.getFunctionOption("zoomCallback").call(that, + minDate, maxDate, that.yAxisRanges()); + } + }); +}; + +/** + * Zoom to something containing [lowY, highY]. These are pixel coordinates in + * the canvas. This function redraws the graph. + * + * @param {number} lowY The topmost pixel value that should be visible. + * @param {number} highY The lowest pixel value that should be visible. + * @private + */ +Dygraph.prototype.doZoomY_ = function(lowY, highY) { + this.currentZoomRectArgs_ = null; + // Find the highest and lowest values in pixel range for each axis. + // Note that lowY (in pixels) corresponds to the max Value (in data coords). + // This is because pixels increase as you go down on the screen, whereas data + // coordinates increase as you go up the screen. + var oldValueRanges = this.yAxisRanges(); + var newValueRanges = []; + for (var i = 0; i < this.axes_.length; i++) { + var hi = this.toDataYCoord(lowY, i); + var low = this.toDataYCoord(highY, i); + newValueRanges.push([low, hi]); + } + + this.zoomed_y_ = true; + var that = this; + this.doAnimatedZoom(null, null, oldValueRanges, newValueRanges, function() { + if (that.getFunctionOption("zoomCallback")) { + var xRange = that.xAxisRange(); + that.getFunctionOption("zoomCallback").call(that, + xRange[0], xRange[1], that.yAxisRanges()); + } + }); +}; + +/** + * Transition function to use in animations. Returns values between 0.0 + * (totally old values) and 1.0 (totally new values) for each frame. + * @private + */ +Dygraph.zoomAnimationFunction = function(frame, numFrames) { + var k = 1.5; + return (1.0 - Math.pow(k, -frame)) / (1.0 - Math.pow(k, -numFrames)); +}; + +/** + * Reset the zoom to the original view coordinates. This is the same as + * double-clicking on the graph. + */ +Dygraph.prototype.resetZoom = function() { + var dirty = false, dirtyX = false, dirtyY = false; + if (this.dateWindow_ !== null) { + dirty = true; + dirtyX = true; + } + + for (var i = 0; i < this.axes_.length; i++) { + if (typeof(this.axes_[i].valueWindow) !== 'undefined' && this.axes_[i].valueWindow !== null) { + dirty = true; + dirtyY = true; + } + } + + // Clear any selection, since it's likely to be drawn in the wrong place. + this.clearSelection(); + + if (dirty) { + this.zoomed_x_ = false; + this.zoomed_y_ = false; + + var minDate = this.rawData_[0][0]; + var maxDate = this.rawData_[this.rawData_.length - 1][0]; + + // With only one frame, don't bother calculating extreme ranges. + // TODO(danvk): merge this block w/ the code below. + if (!this.getBooleanOption("animatedZooms")) { + this.dateWindow_ = null; + for (i = 0; i < this.axes_.length; i++) { + if (this.axes_[i].valueWindow !== null) { + delete this.axes_[i].valueWindow; + } + } + this.drawGraph_(); + if (this.getFunctionOption("zoomCallback")) { + this.getFunctionOption("zoomCallback").call(this, + minDate, maxDate, this.yAxisRanges()); + } + return; + } + + var oldWindow=null, newWindow=null, oldValueRanges=null, newValueRanges=null; + if (dirtyX) { + oldWindow = this.xAxisRange(); + newWindow = [minDate, maxDate]; + } + + if (dirtyY) { + oldValueRanges = this.yAxisRanges(); + // TODO(danvk): this is pretty inefficient + var packed = this.gatherDatasets_(this.rolledSeries_, null); + var extremes = packed.extremes; + + // this has the side-effect of modifying this.axes_. + // this doesn't make much sense in this context, but it's convenient (we + // need this.axes_[*].extremeValues) and not harmful since we'll be + // calling drawGraph_ shortly, which clobbers these values. + this.computeYAxisRanges_(extremes); + + newValueRanges = []; + for (i = 0; i < this.axes_.length; i++) { + var axis = this.axes_[i]; + newValueRanges.push((axis.valueRange !== null && + axis.valueRange !== undefined) ? + axis.valueRange : axis.extremeRange); + } + } + + var that = this; + this.doAnimatedZoom(oldWindow, newWindow, oldValueRanges, newValueRanges, + function() { + that.dateWindow_ = null; + for (var i = 0; i < that.axes_.length; i++) { + if (that.axes_[i].valueWindow !== null) { + delete that.axes_[i].valueWindow; + } + } + if (that.getFunctionOption("zoomCallback")) { + that.getFunctionOption("zoomCallback").call(that, + minDate, maxDate, that.yAxisRanges()); + } + }); + } +}; + +/** + * Combined animation logic for all zoom functions. + * either the x parameters or y parameters may be null. + * @private + */ +Dygraph.prototype.doAnimatedZoom = function(oldXRange, newXRange, oldYRanges, newYRanges, callback) { + var steps = this.getBooleanOption("animatedZooms") ? + Dygraph.ANIMATION_STEPS : 1; + + var windows = []; + var valueRanges = []; + var step, frac; + + if (oldXRange !== null && newXRange !== null) { + for (step = 1; step <= steps; step++) { + frac = Dygraph.zoomAnimationFunction(step, steps); + windows[step-1] = [oldXRange[0]*(1-frac) + frac*newXRange[0], + oldXRange[1]*(1-frac) + frac*newXRange[1]]; + } + } + + if (oldYRanges !== null && newYRanges !== null) { + for (step = 1; step <= steps; step++) { + frac = Dygraph.zoomAnimationFunction(step, steps); + var thisRange = []; + for (var j = 0; j < this.axes_.length; j++) { + thisRange.push([oldYRanges[j][0]*(1-frac) + frac*newYRanges[j][0], + oldYRanges[j][1]*(1-frac) + frac*newYRanges[j][1]]); + } + valueRanges[step-1] = thisRange; + } + } + + var that = this; + Dygraph.repeatAndCleanup(function(step) { + if (valueRanges.length) { + for (var i = 0; i < that.axes_.length; i++) { + var w = valueRanges[step][i]; + that.axes_[i].valueWindow = [w[0], w[1]]; + } + } + if (windows.length) { + that.dateWindow_ = windows[step]; + } + that.drawGraph_(); + }, steps, Dygraph.ANIMATION_DURATION / steps, callback); +}; + +/** + * Get the current graph's area object. + * + * Returns: {x, y, w, h} + */ +Dygraph.prototype.getArea = function() { + return this.plotter_.area; +}; + +/** + * Convert a mouse event to DOM coordinates relative to the graph origin. + * + * Returns a two-element array: [X, Y]. + */ +Dygraph.prototype.eventToDomCoords = function(event) { + if (event.offsetX && event.offsetY) { + return [ event.offsetX, event.offsetY ]; + } else { + var eventElementPos = Dygraph.findPos(this.mouseEventElement_); + var canvasx = Dygraph.pageX(event) - eventElementPos.x; + var canvasy = Dygraph.pageY(event) - eventElementPos.y; + return [canvasx, canvasy]; + } +}; + +/** + * Given a canvas X coordinate, find the closest row. + * @param {number} domX graph-relative DOM X coordinate + * Returns {number} row number. + * @private + */ +Dygraph.prototype.findClosestRow = function(domX) { + var minDistX = Infinity; + var closestRow = -1; + var sets = this.layout_.points; + for (var i = 0; i < sets.length; i++) { + var points = sets[i]; + var len = points.length; + for (var j = 0; j < len; j++) { + var point = points[j]; + if (!Dygraph.isValidPoint(point, true)) continue; + var dist = Math.abs(point.canvasx - domX); + if (dist < minDistX) { + minDistX = dist; + closestRow = point.idx; + } + } + } + + return closestRow; +}; + +/** + * Given canvas X,Y coordinates, find the closest point. + * + * This finds the individual data point across all visible series + * that's closest to the supplied DOM coordinates using the standard + * Euclidean X,Y distance. + * + * @param {number} domX graph-relative DOM X coordinate + * @param {number} domY graph-relative DOM Y coordinate + * Returns: {row, seriesName, point} + * @private + */ +Dygraph.prototype.findClosestPoint = function(domX, domY) { + var minDist = Infinity; + var dist, dx, dy, point, closestPoint, closestSeries, closestRow; + for ( var setIdx = this.layout_.points.length - 1 ; setIdx >= 0 ; --setIdx ) { + var points = this.layout_.points[setIdx]; + for (var i = 0; i < points.length; ++i) { + point = points[i]; + if (!Dygraph.isValidPoint(point)) continue; + dx = point.canvasx - domX; + dy = point.canvasy - domY; + dist = dx * dx + dy * dy; + if (dist < minDist) { + minDist = dist; + closestPoint = point; + closestSeries = setIdx; + closestRow = point.idx; + } + } + } + var name = this.layout_.setNames[closestSeries]; + return { + row: closestRow, + seriesName: name, + point: closestPoint + }; +}; + +/** + * Given canvas X,Y coordinates, find the touched area in a stacked graph. + * + * This first finds the X data point closest to the supplied DOM X coordinate, + * then finds the series which puts the Y coordinate on top of its filled area, + * using linear interpolation between adjacent point pairs. + * + * @param {number} domX graph-relative DOM X coordinate + * @param {number} domY graph-relative DOM Y coordinate + * Returns: {row, seriesName, point} + * @private + */ +Dygraph.prototype.findStackedPoint = function(domX, domY) { + var row = this.findClosestRow(domX); + var closestPoint, closestSeries; + for (var setIdx = 0; setIdx < this.layout_.points.length; ++setIdx) { + var boundary = this.getLeftBoundary_(setIdx); + var rowIdx = row - boundary; + var points = this.layout_.points[setIdx]; + if (rowIdx >= points.length) continue; + var p1 = points[rowIdx]; + if (!Dygraph.isValidPoint(p1)) continue; + var py = p1.canvasy; + if (domX > p1.canvasx && rowIdx + 1 < points.length) { + // interpolate series Y value using next point + var p2 = points[rowIdx + 1]; + if (Dygraph.isValidPoint(p2)) { + var dx = p2.canvasx - p1.canvasx; + if (dx > 0) { + var r = (domX - p1.canvasx) / dx; + py += r * (p2.canvasy - p1.canvasy); + } + } + } else if (domX < p1.canvasx && rowIdx > 0) { + // interpolate series Y value using previous point + var p0 = points[rowIdx - 1]; + if (Dygraph.isValidPoint(p0)) { + var dx = p1.canvasx - p0.canvasx; + if (dx > 0) { + var r = (p1.canvasx - domX) / dx; + py += r * (p0.canvasy - p1.canvasy); + } + } + } + // Stop if the point (domX, py) is above this series' upper edge + if (setIdx === 0 || py < domY) { + closestPoint = p1; + closestSeries = setIdx; + } + } + var name = this.layout_.setNames[closestSeries]; + return { + row: row, + seriesName: name, + point: closestPoint + }; +}; + +/** + * When the mouse moves in the canvas, display information about a nearby data + * point and draw dots over those points in the data series. This function + * takes care of cleanup of previously-drawn dots. + * @param {Object} event The mousemove event from the browser. + * @private + */ +Dygraph.prototype.mouseMove_ = function(event) { + // This prevents JS errors when mousing over the canvas before data loads. + var points = this.layout_.points; + if (points === undefined || points === null) return; + + var canvasCoords = this.eventToDomCoords(event); + var canvasx = canvasCoords[0]; + var canvasy = canvasCoords[1]; + + var highlightSeriesOpts = this.getOption("highlightSeriesOpts"); + var selectionChanged = false; + if (highlightSeriesOpts && !this.isSeriesLocked()) { + var closest; + if (this.getBooleanOption("stackedGraph")) { + closest = this.findStackedPoint(canvasx, canvasy); + } else { + closest = this.findClosestPoint(canvasx, canvasy); + } + selectionChanged = this.setSelection(closest.row, closest.seriesName); + } else { + var idx = this.findClosestRow(canvasx); + selectionChanged = this.setSelection(idx); + } + + var callback = this.getFunctionOption("highlightCallback"); + if (callback && selectionChanged) { + callback.call(this, event, + this.lastx_, + this.selPoints_, + this.lastRow_, + this.highlightSet_); + } +}; + +/** + * Fetch left offset from the specified set index or if not passed, the + * first defined boundaryIds record (see bug #236). + * @private + */ +Dygraph.prototype.getLeftBoundary_ = function(setIdx) { + if (this.boundaryIds_[setIdx]) { + return this.boundaryIds_[setIdx][0]; + } else { + for (var i = 0; i < this.boundaryIds_.length; i++) { + if (this.boundaryIds_[i] !== undefined) { + return this.boundaryIds_[i][0]; + } + } + return 0; + } +}; + +Dygraph.prototype.animateSelection_ = function(direction) { + var totalSteps = 10; + var millis = 30; + if (this.fadeLevel === undefined) this.fadeLevel = 0; + if (this.animateId === undefined) this.animateId = 0; + var start = this.fadeLevel; + var steps = direction < 0 ? start : totalSteps - start; + if (steps <= 0) { + if (this.fadeLevel) { + this.updateSelection_(1.0); + } + return; + } + + var thisId = ++this.animateId; + var that = this; + Dygraph.repeatAndCleanup( + function(n) { + // ignore simultaneous animations + if (that.animateId != thisId) return; + + that.fadeLevel += direction; + if (that.fadeLevel === 0) { + that.clearSelection(); + } else { + that.updateSelection_(that.fadeLevel / totalSteps); + } + }, + steps, millis, function() {}); +}; + +/** + * Draw dots over the selectied points in the data series. This function + * takes care of cleanup of previously-drawn dots. + * @private + */ +Dygraph.prototype.updateSelection_ = function(opt_animFraction) { + /*var defaultPrevented = */ + this.cascadeEvents_('select', { + selectedRow: this.lastRow_, + selectedX: this.lastx_, + selectedPoints: this.selPoints_ + }); + // TODO(danvk): use defaultPrevented here? + + // Clear the previously drawn vertical, if there is one + var i; + var ctx = this.canvas_ctx_; + if (this.getOption('highlightSeriesOpts')) { + ctx.clearRect(0, 0, this.width_, this.height_); + var alpha = 1.0 - this.getNumericOption('highlightSeriesBackgroundAlpha'); + if (alpha) { + // Activating background fade includes an animation effect for a gradual + // fade. TODO(klausw): make this independently configurable if it causes + // issues? Use a shared preference to control animations? + var animateBackgroundFade = true; + if (animateBackgroundFade) { + if (opt_animFraction === undefined) { + // start a new animation + this.animateSelection_(1); + return; + } + alpha *= opt_animFraction; + } + ctx.fillStyle = 'rgba(255,255,255,' + alpha + ')'; + ctx.fillRect(0, 0, this.width_, this.height_); + } + + // Redraw only the highlighted series in the interactive canvas (not the + // static plot canvas, which is where series are usually drawn). + this.plotter_._renderLineChart(this.highlightSet_, ctx); + } else if (this.previousVerticalX_ >= 0) { + // Determine the maximum highlight circle size. + var maxCircleSize = 0; + var labels = this.attr_('labels'); + for (i = 1; i < labels.length; i++) { + var r = this.getNumericOption('highlightCircleSize', labels[i]); + if (r > maxCircleSize) maxCircleSize = r; + } + var px = this.previousVerticalX_; + ctx.clearRect(px - maxCircleSize - 1, 0, + 2 * maxCircleSize + 2, this.height_); + } + + if (this.isUsingExcanvas_ && this.currentZoomRectArgs_) { + Dygraph.prototype.drawZoomRect_.apply(this, this.currentZoomRectArgs_); + } + + if (this.selPoints_.length > 0) { + // Draw colored circles over the center of each selected point + var canvasx = this.selPoints_[0].canvasx; + ctx.save(); + for (i = 0; i < this.selPoints_.length; i++) { + var pt = this.selPoints_[i]; + if (!Dygraph.isOK(pt.canvasy)) continue; + + var circleSize = this.getNumericOption('highlightCircleSize', pt.name); + var callback = this.getFunctionOption("drawHighlightPointCallback", pt.name); + var color = this.plotter_.colors[pt.name]; + if (!callback) { + callback = Dygraph.Circles.DEFAULT; + } + ctx.lineWidth = this.getNumericOption('strokeWidth', pt.name); + ctx.strokeStyle = color; + ctx.fillStyle = color; + callback.call(this, this, pt.name, ctx, canvasx, pt.canvasy, + color, circleSize, pt.idx); + } + ctx.restore(); + + this.previousVerticalX_ = canvasx; + } +}; + +/** + * Manually set the selected points and display information about them in the + * legend. The selection can be cleared using clearSelection() and queried + * using getSelection(). + * @param {number} row Row number that should be highlighted (i.e. appear with + * hover dots on the chart). + * @param {seriesName} optional series name to highlight that series with the + * the highlightSeriesOpts setting. + * @param { locked } optional If true, keep seriesName selected when mousing + * over the graph, disabling closest-series highlighting. Call clearSelection() + * to unlock it. + */ +Dygraph.prototype.setSelection = function(row, opt_seriesName, opt_locked) { + // Extract the points we've selected + this.selPoints_ = []; + + var changed = false; + if (row !== false && row >= 0) { + if (row != this.lastRow_) changed = true; + this.lastRow_ = row; + for (var setIdx = 0; setIdx < this.layout_.points.length; ++setIdx) { + var points = this.layout_.points[setIdx]; + // Check if the point at the appropriate index is the point we're looking + // for. If it is, just use it, otherwise search the array for a point + // in the proper place. + var setRow = row - this.getLeftBoundary_(setIdx); + if (setRow < points.length && points[setRow].idx == row) { + var point = points[setRow]; + if (point.yval !== null) this.selPoints_.push(point); + } else { + for (var pointIdx = 0; pointIdx < points.length; ++pointIdx) { + var point = points[pointIdx]; + if (point.idx == row) { + if (point.yval !== null) { + this.selPoints_.push(point); + } + break; + } + } + } + } + } else { + if (this.lastRow_ >= 0) changed = true; + this.lastRow_ = -1; + } + + if (this.selPoints_.length) { + this.lastx_ = this.selPoints_[0].xval; + } else { + this.lastx_ = -1; + } + + if (opt_seriesName !== undefined) { + if (this.highlightSet_ !== opt_seriesName) changed = true; + this.highlightSet_ = opt_seriesName; + } + + if (opt_locked !== undefined) { + this.lockedSet_ = opt_locked; + } + + if (changed) { + this.updateSelection_(undefined); + } + return changed; +}; + +/** + * The mouse has left the canvas. Clear out whatever artifacts remain + * @param {Object} event the mouseout event from the browser. + * @private + */ +Dygraph.prototype.mouseOut_ = function(event) { + if (this.getFunctionOption("unhighlightCallback")) { + this.getFunctionOption("unhighlightCallback").call(this, event); + } + + if (this.getBooleanOption("hideOverlayOnMouseOut") && !this.lockedSet_) { + this.clearSelection(); + } +}; + +/** + * Clears the current selection (i.e. points that were highlighted by moving + * the mouse over the chart). + */ +Dygraph.prototype.clearSelection = function() { + this.cascadeEvents_('deselect', {}); + + this.lockedSet_ = false; + // Get rid of the overlay data + if (this.fadeLevel) { + this.animateSelection_(-1); + return; + } + this.canvas_ctx_.clearRect(0, 0, this.width_, this.height_); + this.fadeLevel = 0; + this.selPoints_ = []; + this.lastx_ = -1; + this.lastRow_ = -1; + this.highlightSet_ = null; +}; + +/** + * Returns the number of the currently selected row. To get data for this row, + * you can use the getValue method. + * @return {number} row number, or -1 if nothing is selected + */ +Dygraph.prototype.getSelection = function() { + if (!this.selPoints_ || this.selPoints_.length < 1) { + return -1; + } + + for (var setIdx = 0; setIdx < this.layout_.points.length; setIdx++) { + var points = this.layout_.points[setIdx]; + for (var row = 0; row < points.length; row++) { + if (points[row].x == this.selPoints_[0].x) { + return points[row].idx; + } + } + } + return -1; +}; + +/** + * Returns the name of the currently-highlighted series. + * Only available when the highlightSeriesOpts option is in use. + */ +Dygraph.prototype.getHighlightSeries = function() { + return this.highlightSet_; +}; + +/** + * Returns true if the currently-highlighted series was locked + * via setSelection(..., seriesName, true). + */ +Dygraph.prototype.isSeriesLocked = function() { + return this.lockedSet_; +}; + +/** + * Fires when there's data available to be graphed. + * @param {string} data Raw CSV data to be plotted + * @private + */ +Dygraph.prototype.loadedEvent_ = function(data) { + this.rawData_ = this.parseCSV_(data); + this.cascadeDataDidUpdateEvent_(); + this.predraw_(); +}; + +/** + * Add ticks on the x-axis representing years, months, quarters, weeks, or days + * @private + */ +Dygraph.prototype.addXTicks_ = function() { + // Determine the correct ticks scale on the x-axis: quarterly, monthly, ... + var range; + if (this.dateWindow_) { + range = [this.dateWindow_[0], this.dateWindow_[1]]; + } else { + range = this.xAxisExtremes(); + } + + var xAxisOptionsView = this.optionsViewForAxis_('x'); + var xTicks = xAxisOptionsView('ticker')( + range[0], + range[1], + this.plotter_.area.w, // TODO(danvk): should be area.width + xAxisOptionsView, + this); + // var msg = 'ticker(' + range[0] + ', ' + range[1] + ', ' + this.width_ + ', ' + this.attr_('pixelsPerXLabel') + ') -> ' + JSON.stringify(xTicks); + // console.log(msg); + this.layout_.setXTicks(xTicks); +}; + +/** + * Returns the correct handler class for the currently set options. + * @private + */ +Dygraph.prototype.getHandlerClass_ = function() { + var handlerClass; + if (this.attr_('dataHandler')) { + handlerClass = this.attr_('dataHandler'); + } else if (this.fractions_) { + if (this.getBooleanOption('errorBars')) { + handlerClass = Dygraph.DataHandlers.FractionsBarsHandler; + } else { + handlerClass = Dygraph.DataHandlers.DefaultFractionHandler; + } + } else if (this.getBooleanOption('customBars')) { + handlerClass = Dygraph.DataHandlers.CustomBarsHandler; + } else if (this.getBooleanOption('errorBars')) { + handlerClass = Dygraph.DataHandlers.ErrorBarsHandler; + } else { + handlerClass = Dygraph.DataHandlers.DefaultHandler; + } + return handlerClass; +}; + +/** + * @private + * This function is called once when the chart's data is changed or the options + * dictionary is updated. It is _not_ called when the user pans or zooms. The + * idea is that values derived from the chart's data can be computed here, + * rather than every time the chart is drawn. This includes things like the + * number of axes, rolling averages, etc. + */ +Dygraph.prototype.predraw_ = function() { + var start = new Date(); + + // Create the correct dataHandler + this.dataHandler_ = new (this.getHandlerClass_())(); + + this.layout_.computePlotArea(); + + // TODO(danvk): move more computations out of drawGraph_ and into here. + this.computeYAxes_(); + + if (!this.is_initial_draw_) { + this.canvas_ctx_.restore(); + this.hidden_ctx_.restore(); + } + + this.canvas_ctx_.save(); + this.hidden_ctx_.save(); + + // Create a new plotter. + this.plotter_ = new DygraphCanvasRenderer(this, + this.hidden_, + this.hidden_ctx_, + this.layout_); + + // The roller sits in the bottom left corner of the chart. We don't know where + // this will be until the options are available, so it's positioned here. + this.createRollInterface_(); + + this.cascadeEvents_('predraw'); + + // Convert the raw data (a 2D array) into the internal format and compute + // rolling averages. + this.rolledSeries_ = [null]; // x-axis is the first series and it's special + for (var i = 1; i < this.numColumns(); i++) { + // var logScale = this.attr_('logscale', i); // TODO(klausw): this looks wrong // konigsberg thinks so too. + var series = this.dataHandler_.extractSeries(this.rawData_, i, this.attributes_); + if (this.rollPeriod_ > 1) { + series = this.dataHandler_.rollingAverage(series, this.rollPeriod_, this.attributes_); + } + + this.rolledSeries_.push(series); + } + + // If the data or options have changed, then we'd better redraw. + this.drawGraph_(); + + // This is used to determine whether to do various animations. + var end = new Date(); + this.drawingTimeMs_ = (end - start); +}; + +/** + * Point structure. + * + * xval_* and yval_* are the original unscaled data values, + * while x_* and y_* are scaled to the range (0.0-1.0) for plotting. + * yval_stacked is the cumulative Y value used for stacking graphs, + * and bottom/top/minus/plus are used for error bar graphs. + * + * @typedef {{ + * idx: number, + * name: string, + * x: ?number, + * xval: ?number, + * y_bottom: ?number, + * y: ?number, + * y_stacked: ?number, + * y_top: ?number, + * yval_minus: ?number, + * yval: ?number, + * yval_plus: ?number, + * yval_stacked + * }} + */ +Dygraph.PointType = undefined; + +/** + * Calculates point stacking for stackedGraph=true. + * + * For stacking purposes, interpolate or extend neighboring data across + * NaN values based on stackedGraphNaNFill settings. This is for display + * only, the underlying data value as shown in the legend remains NaN. + * + * @param {Array.} points Point array for a single series. + * Updates each Point's yval_stacked property. + * @param {Array.} cumulativeYval Accumulated top-of-graph stacked Y + * values for the series seen so far. Index is the row number. Updated + * based on the current series's values. + * @param {Array.} seriesExtremes Min and max values, updated + * to reflect the stacked values. + * @param {string} fillMethod Interpolation method, one of 'all', 'inside', or + * 'none'. + * @private + */ +Dygraph.stackPoints_ = function( + points, cumulativeYval, seriesExtremes, fillMethod) { + var lastXval = null; + var prevPoint = null; + var nextPoint = null; + var nextPointIdx = -1; + + // Find the next stackable point starting from the given index. + var updateNextPoint = function(idx) { + // If we've previously found a non-NaN point and haven't gone past it yet, + // just use that. + if (nextPointIdx >= idx) return; + + // We haven't found a non-NaN point yet or have moved past it, + // look towards the right to find a non-NaN point. + for (var j = idx; j < points.length; ++j) { + // Clear out a previously-found point (if any) since it's no longer + // valid, we shouldn't use it for interpolation anymore. + nextPoint = null; + if (!isNaN(points[j].yval) && points[j].yval !== null) { + nextPointIdx = j; + nextPoint = points[j]; + break; + } + } + }; + + for (var i = 0; i < points.length; ++i) { + var point = points[i]; + var xval = point.xval; + if (cumulativeYval[xval] === undefined) { + cumulativeYval[xval] = 0; + } + + var actualYval = point.yval; + if (isNaN(actualYval) || actualYval === null) { + if(fillMethod == 'none') { + actualYval = 0; + } else { + // Interpolate/extend for stacking purposes if possible. + updateNextPoint(i); + if (prevPoint && nextPoint && fillMethod != 'none') { + // Use linear interpolation between prevPoint and nextPoint. + actualYval = prevPoint.yval + (nextPoint.yval - prevPoint.yval) * + ((xval - prevPoint.xval) / (nextPoint.xval - prevPoint.xval)); + } else if (prevPoint && fillMethod == 'all') { + actualYval = prevPoint.yval; + } else if (nextPoint && fillMethod == 'all') { + actualYval = nextPoint.yval; + } else { + actualYval = 0; + } + } + } else { + prevPoint = point; + } + + var stackedYval = cumulativeYval[xval]; + if (lastXval != xval) { + // If an x-value is repeated, we ignore the duplicates. + stackedYval += actualYval; + cumulativeYval[xval] = stackedYval; + } + lastXval = xval; + + point.yval_stacked = stackedYval; + + if (stackedYval > seriesExtremes[1]) { + seriesExtremes[1] = stackedYval; + } + if (stackedYval < seriesExtremes[0]) { + seriesExtremes[0] = stackedYval; + } + } +}; + + +/** + * Loop over all fields and create datasets, calculating extreme y-values for + * each series and extreme x-indices as we go. + * + * dateWindow is passed in as an explicit parameter so that we can compute + * extreme values "speculatively", i.e. without actually setting state on the + * dygraph. + * + * @param {Array.)>>} rolledSeries, where + * rolledSeries[seriesIndex][row] = raw point, where + * seriesIndex is the column number starting with 1, and + * rawPoint is [x,y] or [x, [y, err]] or [x, [y, yminus, yplus]]. + * @param {?Array.} dateWindow [xmin, xmax] pair, or null. + * @return {{ + * points: Array.>, + * seriesExtremes: Array.>, + * boundaryIds: Array.}} + * @private + */ +Dygraph.prototype.gatherDatasets_ = function(rolledSeries, dateWindow) { + var boundaryIds = []; + var points = []; + var cumulativeYval = []; // For stacked series. + var extremes = {}; // series name -> [low, high] + var seriesIdx, sampleIdx; + var firstIdx, lastIdx; + var axisIdx; + + // Loop over the fields (series). Go from the last to the first, + // because if they're stacked that's how we accumulate the values. + var num_series = rolledSeries.length - 1; + var series; + for (seriesIdx = num_series; seriesIdx >= 1; seriesIdx--) { + if (!this.visibility()[seriesIdx - 1]) continue; + + // Prune down to the desired range, if necessary (for zooming) + // Because there can be lines going to points outside of the visible area, + // we actually prune to visible points, plus one on either side. + if (dateWindow) { + series = rolledSeries[seriesIdx]; + var low = dateWindow[0]; + var high = dateWindow[1]; + + // TODO(danvk): do binary search instead of linear search. + // TODO(danvk): pass firstIdx and lastIdx directly to the renderer. + firstIdx = null; + lastIdx = null; + for (sampleIdx = 0; sampleIdx < series.length; sampleIdx++) { + if (series[sampleIdx][0] >= low && firstIdx === null) { + firstIdx = sampleIdx; + } + if (series[sampleIdx][0] <= high) { + lastIdx = sampleIdx; + } + } + + if (firstIdx === null) firstIdx = 0; + var correctedFirstIdx = firstIdx; + var isInvalidValue = true; + while (isInvalidValue && correctedFirstIdx > 0) { + correctedFirstIdx--; + // check if the y value is null. + isInvalidValue = series[correctedFirstIdx][1] === null; + } + + if (lastIdx === null) lastIdx = series.length - 1; + var correctedLastIdx = lastIdx; + isInvalidValue = true; + while (isInvalidValue && correctedLastIdx < series.length - 1) { + correctedLastIdx++; + isInvalidValue = series[correctedLastIdx][1] === null; + } + + if (correctedFirstIdx!==firstIdx) { + firstIdx = correctedFirstIdx; + } + if (correctedLastIdx !== lastIdx) { + lastIdx = correctedLastIdx; + } + + boundaryIds[seriesIdx-1] = [firstIdx, lastIdx]; + + // .slice's end is exclusive, we want to include lastIdx. + series = series.slice(firstIdx, lastIdx + 1); + } else { + series = rolledSeries[seriesIdx]; + boundaryIds[seriesIdx-1] = [0, series.length-1]; + } + + var seriesName = this.attr_("labels")[seriesIdx]; + var seriesExtremes = this.dataHandler_.getExtremeYValues(series, + dateWindow, this.getBooleanOption("stepPlot",seriesName)); + + var seriesPoints = this.dataHandler_.seriesToPoints(series, + seriesName, boundaryIds[seriesIdx-1][0]); + + if (this.getBooleanOption("stackedGraph")) { + axisIdx = this.attributes_.axisForSeries(seriesName); + if (cumulativeYval[axisIdx] === undefined) { + cumulativeYval[axisIdx] = []; + } + Dygraph.stackPoints_(seriesPoints, cumulativeYval[axisIdx], seriesExtremes, + this.getBooleanOption("stackedGraphNaNFill")); + } + + extremes[seriesName] = seriesExtremes; + points[seriesIdx] = seriesPoints; + } + + return { points: points, extremes: extremes, boundaryIds: boundaryIds }; +}; + +/** + * Update the graph with new data. This method is called when the viewing area + * has changed. If the underlying data or options have changed, predraw_ will + * be called before drawGraph_ is called. + * + * @private + */ +Dygraph.prototype.drawGraph_ = function() { + var start = new Date(); + + // This is used to set the second parameter to drawCallback, below. + var is_initial_draw = this.is_initial_draw_; + this.is_initial_draw_ = false; + + this.layout_.removeAllDatasets(); + this.setColors_(); + this.attrs_.pointSize = 0.5 * this.getNumericOption('highlightCircleSize'); + + var packed = this.gatherDatasets_(this.rolledSeries_, this.dateWindow_); + var points = packed.points; + var extremes = packed.extremes; + this.boundaryIds_ = packed.boundaryIds; + + this.setIndexByName_ = {}; + var labels = this.attr_("labels"); + if (labels.length > 0) { + this.setIndexByName_[labels[0]] = 0; + } + var dataIdx = 0; + for (var i = 1; i < points.length; i++) { + this.setIndexByName_[labels[i]] = i; + if (!this.visibility()[i - 1]) continue; + this.layout_.addDataset(labels[i], points[i]); + this.datasetIndex_[i] = dataIdx++; + } + + this.computeYAxisRanges_(extremes); + this.layout_.setYAxes(this.axes_); + + this.addXTicks_(); + + // Save the X axis zoomed status as the updateOptions call will tend to set it erroneously + var tmp_zoomed_x = this.zoomed_x_; + // Tell PlotKit to use this new data and render itself + this.zoomed_x_ = tmp_zoomed_x; + this.layout_.evaluate(); + this.renderGraph_(is_initial_draw); + + if (this.getStringOption("timingName")) { + var end = new Date(); + console.log(this.getStringOption("timingName") + " - drawGraph: " + (end - start) + "ms"); + } +}; + +/** + * This does the work of drawing the chart. It assumes that the layout and axis + * scales have already been set (e.g. by predraw_). + * + * @private + */ +Dygraph.prototype.renderGraph_ = function(is_initial_draw) { + this.cascadeEvents_('clearChart'); + this.plotter_.clear(); + + if (this.getFunctionOption('underlayCallback')) { + // NOTE: we pass the dygraph object to this callback twice to avoid breaking + // users who expect a deprecated form of this callback. + this.getFunctionOption('underlayCallback').call(this, + this.hidden_ctx_, this.layout_.getPlotArea(), this, this); + } + + var e = { + canvas: this.hidden_, + drawingContext: this.hidden_ctx_ + }; + this.cascadeEvents_('willDrawChart', e); + this.plotter_.render(); + this.cascadeEvents_('didDrawChart', e); + this.lastRow_ = -1; // because plugins/legend.js clears the legend + + // TODO(danvk): is this a performance bottleneck when panning? + // The interaction canvas should already be empty in that situation. + this.canvas_.getContext('2d').clearRect(0, 0, this.width_, this.height_); + + if (this.getFunctionOption("drawCallback") !== null) { + this.getFunctionOption("drawCallback").call(this, this, is_initial_draw); + } + if (is_initial_draw) { + this.readyFired_ = true; + while (this.readyFns_.length > 0) { + var fn = this.readyFns_.pop(); + fn(this); + } + } +}; + +/** + * @private + * Determine properties of the y-axes which are independent of the data + * currently being displayed. This includes things like the number of axes and + * the style of the axes. It does not include the range of each axis and its + * tick marks. + * This fills in this.axes_. + * axes_ = [ { options } ] + * indices are into the axes_ array. + */ +Dygraph.prototype.computeYAxes_ = function() { + // Preserve valueWindow settings if they exist, and if the user hasn't + // specified a new valueRange. + var valueWindows, axis, index, opts, v; + if (this.axes_ !== undefined && this.user_attrs_.hasOwnProperty("valueRange") === false) { + valueWindows = []; + for (index = 0; index < this.axes_.length; index++) { + valueWindows.push(this.axes_[index].valueWindow); + } + } + + // this.axes_ doesn't match this.attributes_.axes_.options. It's used for + // data computation as well as options storage. + // Go through once and add all the axes. + this.axes_ = []; + + for (axis = 0; axis < this.attributes_.numAxes(); axis++) { + // Add a new axis, making a copy of its per-axis options. + opts = { g : this }; + Dygraph.update(opts, this.attributes_.axisOptions(axis)); + this.axes_[axis] = opts; + } + + + // Copy global valueRange option over to the first axis. + // NOTE(konigsberg): Are these two statements necessary? + // I tried removing it. The automated tests pass, and manually + // messing with tests/zoom.html showed no trouble. + v = this.attr_('valueRange'); + if (v) this.axes_[0].valueRange = v; + + if (valueWindows !== undefined) { + // Restore valueWindow settings. + + // When going from two axes back to one, we only restore + // one axis. + var idxCount = Math.min(valueWindows.length, this.axes_.length); + + for (index = 0; index < idxCount; index++) { + this.axes_[index].valueWindow = valueWindows[index]; + } + } + + for (axis = 0; axis < this.axes_.length; axis++) { + if (axis === 0) { + opts = this.optionsViewForAxis_('y' + (axis ? '2' : '')); + v = opts("valueRange"); + if (v) this.axes_[axis].valueRange = v; + } else { // To keep old behavior + var axes = this.user_attrs_.axes; + if (axes && axes.y2) { + v = axes.y2.valueRange; + if (v) this.axes_[axis].valueRange = v; + } + } + } +}; + +/** + * Returns the number of y-axes on the chart. + * @return {number} the number of axes. + */ +Dygraph.prototype.numAxes = function() { + return this.attributes_.numAxes(); +}; + +/** + * @private + * Returns axis properties for the given series. + * @param {string} setName The name of the series for which to get axis + * properties, e.g. 'Y1'. + * @return {Object} The axis properties. + */ +Dygraph.prototype.axisPropertiesForSeries = function(series) { + // TODO(danvk): handle errors. + return this.axes_[this.attributes_.axisForSeries(series)]; +}; + +/** + * @private + * Determine the value range and tick marks for each axis. + * @param {Object} extremes A mapping from seriesName -> [low, high] + * This fills in the valueRange and ticks fields in each entry of this.axes_. + */ +Dygraph.prototype.computeYAxisRanges_ = function(extremes) { + var isNullUndefinedOrNaN = function(num) { + return isNaN(parseFloat(num)); + }; + var numAxes = this.attributes_.numAxes(); + var ypadCompat, span, series, ypad; + + var p_axis; + + // Compute extreme values, a span and tick marks for each axis. + for (var i = 0; i < numAxes; i++) { + var axis = this.axes_[i]; + var logscale = this.attributes_.getForAxis("logscale", i); + var includeZero = this.attributes_.getForAxis("includeZero", i); + var independentTicks = this.attributes_.getForAxis("independentTicks", i); + series = this.attributes_.seriesForAxis(i); + + // Add some padding. This supports two Y padding operation modes: + // + // - backwards compatible (yRangePad not set): + // 10% padding for automatic Y ranges, but not for user-supplied + // ranges, and move a close-to-zero edge to zero except if + // avoidMinZero is set, since drawing at the edge results in + // invisible lines. Unfortunately lines drawn at the edge of a + // user-supplied range will still be invisible. If logscale is + // set, add a variable amount of padding at the top but + // none at the bottom. + // + // - new-style (yRangePad set by the user): + // always add the specified Y padding. + // + ypadCompat = true; + ypad = 0.1; // add 10% + if (this.getNumericOption('yRangePad') !== null) { + ypadCompat = false; + // Convert pixel padding to ratio + ypad = this.getNumericOption('yRangePad') / this.plotter_.area.h; + } + + if (series.length === 0) { + // If no series are defined or visible then use a reasonable default + axis.extremeRange = [0, 1]; + } else { + // Calculate the extremes of extremes. + var minY = Infinity; // extremes[series[0]][0]; + var maxY = -Infinity; // extremes[series[0]][1]; + var extremeMinY, extremeMaxY; + + for (var j = 0; j < series.length; j++) { + // this skips invisible series + if (!extremes.hasOwnProperty(series[j])) continue; + + // Only use valid extremes to stop null data series' from corrupting the scale. + extremeMinY = extremes[series[j]][0]; + if (extremeMinY !== null) { + minY = Math.min(extremeMinY, minY); + } + extremeMaxY = extremes[series[j]][1]; + if (extremeMaxY !== null) { + maxY = Math.max(extremeMaxY, maxY); + } + } + + // Include zero if requested by the user. + if (includeZero && !logscale) { + if (minY > 0) minY = 0; + if (maxY < 0) maxY = 0; + } + + // Ensure we have a valid scale, otherwise default to [0, 1] for safety. + if (minY == Infinity) minY = 0; + if (maxY == -Infinity) maxY = 1; + + span = maxY - minY; + // special case: if we have no sense of scale, center on the sole value. + if (span === 0) { + if (maxY !== 0) { + span = Math.abs(maxY); + } else { + // ... and if the sole value is zero, use range 0-1. + maxY = 1; + span = 1; + } + } + + var maxAxisY, minAxisY; + if (logscale) { + if (ypadCompat) { + maxAxisY = maxY + ypad * span; + minAxisY = minY; + } else { + var logpad = Math.exp(Math.log(span) * ypad); + maxAxisY = maxY * logpad; + minAxisY = minY / logpad; + } + } else { + maxAxisY = maxY + ypad * span; + minAxisY = minY - ypad * span; + + // Backwards-compatible behavior: Move the span to start or end at zero if it's + // close to zero, but not if avoidMinZero is set. + if (ypadCompat && !this.getBooleanOption("avoidMinZero")) { + if (minAxisY < 0 && minY >= 0) minAxisY = 0; + if (maxAxisY > 0 && maxY <= 0) maxAxisY = 0; + } + } + axis.extremeRange = [minAxisY, maxAxisY]; + } + if (axis.valueWindow) { + // This is only set if the user has zoomed on the y-axis. It is never set + // by a user. It takes precedence over axis.valueRange because, if you set + // valueRange, you'd still expect to be able to pan. + axis.computedValueRange = [axis.valueWindow[0], axis.valueWindow[1]]; + } else if (axis.valueRange) { + // This is a user-set value range for this axis. + var y0 = isNullUndefinedOrNaN(axis.valueRange[0]) ? axis.extremeRange[0] : axis.valueRange[0]; + var y1 = isNullUndefinedOrNaN(axis.valueRange[1]) ? axis.extremeRange[1] : axis.valueRange[1]; + if (!ypadCompat) { + if (axis.logscale) { + var logpad = Math.exp(Math.log(span) * ypad); + y0 *= logpad; + y1 /= logpad; + } else { + span = y1 - y0; + y0 -= span * ypad; + y1 += span * ypad; + } + } + axis.computedValueRange = [y0, y1]; + } else { + axis.computedValueRange = axis.extremeRange; + } + + + if (independentTicks) { + axis.independentTicks = independentTicks; + var opts = this.optionsViewForAxis_('y' + (i ? '2' : '')); + var ticker = opts('ticker'); + axis.ticks = ticker(axis.computedValueRange[0], + axis.computedValueRange[1], + this.plotter_.area.h, + opts, + this); + // Define the first independent axis as primary axis. + if (!p_axis) p_axis = axis; + } + } + if (p_axis === undefined) { + throw ("Configuration Error: At least one axis has to have the \"independentTicks\" option activated."); + } + // Add ticks. By default, all axes inherit the tick positions of the + // primary axis. However, if an axis is specifically marked as having + // independent ticks, then that is permissible as well. + for (var i = 0; i < numAxes; i++) { + var axis = this.axes_[i]; + + if (!axis.independentTicks) { + var opts = this.optionsViewForAxis_('y' + (i ? '2' : '')); + var ticker = opts('ticker'); + var p_ticks = p_axis.ticks; + var p_scale = p_axis.computedValueRange[1] - p_axis.computedValueRange[0]; + var scale = axis.computedValueRange[1] - axis.computedValueRange[0]; + var tick_values = []; + for (var k = 0; k < p_ticks.length; k++) { + var y_frac = (p_ticks[k].v - p_axis.computedValueRange[0]) / p_scale; + var y_val = axis.computedValueRange[0] + y_frac * scale; + tick_values.push(y_val); + } + + axis.ticks = ticker(axis.computedValueRange[0], + axis.computedValueRange[1], + this.plotter_.area.h, + opts, + this, + tick_values); + } + } +}; + +/** + * Detects the type of the str (date or numeric) and sets the various + * formatting attributes in this.attrs_ based on this type. + * @param {string} str An x value. + * @private + */ +Dygraph.prototype.detectTypeFromString_ = function(str) { + var isDate = false; + var dashPos = str.indexOf('-'); // could be 2006-01-01 _or_ 1.0e-2 + if ((dashPos > 0 && (str[dashPos-1] != 'e' && str[dashPos-1] != 'E')) || + str.indexOf('/') >= 0 || + isNaN(parseFloat(str))) { + isDate = true; + } else if (str.length == 8 && str > '19700101' && str < '20371231') { + // TODO(danvk): remove support for this format. + isDate = true; + } + + this.setXAxisOptions_(isDate); +}; + +Dygraph.prototype.setXAxisOptions_ = function(isDate) { + if (isDate) { + this.attrs_.xValueParser = Dygraph.dateParser; + this.attrs_.axes.x.valueFormatter = Dygraph.dateValueFormatter; + this.attrs_.axes.x.ticker = Dygraph.dateTicker; + this.attrs_.axes.x.axisLabelFormatter = Dygraph.dateAxisLabelFormatter; + } else { + /** @private (shut up, jsdoc!) */ + this.attrs_.xValueParser = function(x) { return parseFloat(x); }; + // TODO(danvk): use Dygraph.numberValueFormatter here? + /** @private (shut up, jsdoc!) */ + this.attrs_.axes.x.valueFormatter = function(x) { return x; }; + this.attrs_.axes.x.ticker = Dygraph.numericTicks; + this.attrs_.axes.x.axisLabelFormatter = this.attrs_.axes.x.valueFormatter; + } +}; + +/** + * @private + * Parses a string in a special csv format. We expect a csv file where each + * line is a date point, and the first field in each line is the date string. + * We also expect that all remaining fields represent series. + * if the errorBars attribute is set, then interpret the fields as: + * date, series1, stddev1, series2, stddev2, ... + * @param {[Object]} data See above. + * + * @return [Object] An array with one entry for each row. These entries + * are an array of cells in that row. The first entry is the parsed x-value for + * the row. The second, third, etc. are the y-values. These can take on one of + * three forms, depending on the CSV and constructor parameters: + * 1. numeric value + * 2. [ value, stddev ] + * 3. [ low value, center value, high value ] + */ +Dygraph.prototype.parseCSV_ = function(data) { + var ret = []; + var line_delimiter = Dygraph.detectLineDelimiter(data); + var lines = data.split(line_delimiter || "\n"); + var vals, j; + + // Use the default delimiter or fall back to a tab if that makes sense. + var delim = this.getStringOption('delimiter'); + if (lines[0].indexOf(delim) == -1 && lines[0].indexOf('\t') >= 0) { + delim = '\t'; + } + + var start = 0; + if (!('labels' in this.user_attrs_)) { + // User hasn't explicitly set labels, so they're (presumably) in the CSV. + start = 1; + this.attrs_.labels = lines[0].split(delim); // NOTE: _not_ user_attrs_. + this.attributes_.reparseSeries(); + } + var line_no = 0; + + var xParser; + var defaultParserSet = false; // attempt to auto-detect x value type + var expectedCols = this.attr_("labels").length; + var outOfOrder = false; + for (var i = start; i < lines.length; i++) { + var line = lines[i]; + line_no = i; + if (line.length === 0) continue; // skip blank lines + if (line[0] == '#') continue; // skip comment lines + var inFields = line.split(delim); + if (inFields.length < 2) continue; + + var fields = []; + if (!defaultParserSet) { + this.detectTypeFromString_(inFields[0]); + xParser = this.getFunctionOption("xValueParser"); + defaultParserSet = true; + } + fields[0] = xParser(inFields[0], this); + + // If fractions are expected, parse the numbers as "A/B" + if (this.fractions_) { + for (j = 1; j < inFields.length; j++) { + // TODO(danvk): figure out an appropriate way to flag parse errors. + vals = inFields[j].split("/"); + if (vals.length != 2) { + console.error('Expected fractional "num/den" values in CSV data ' + + "but found a value '" + inFields[j] + "' on line " + + (1 + i) + " ('" + line + "') which is not of this form."); + fields[j] = [0, 0]; + } else { + fields[j] = [Dygraph.parseFloat_(vals[0], i, line), + Dygraph.parseFloat_(vals[1], i, line)]; + } + } + } else if (this.getBooleanOption("errorBars")) { + // If there are error bars, values are (value, stddev) pairs + if (inFields.length % 2 != 1) { + console.error('Expected alternating (value, stdev.) pairs in CSV data ' + + 'but line ' + (1 + i) + ' has an odd number of values (' + + (inFields.length - 1) + "): '" + line + "'"); + } + for (j = 1; j < inFields.length; j += 2) { + fields[(j + 1) / 2] = [Dygraph.parseFloat_(inFields[j], i, line), + Dygraph.parseFloat_(inFields[j + 1], i, line)]; + } + } else if (this.getBooleanOption("customBars")) { + // Bars are a low;center;high tuple + for (j = 1; j < inFields.length; j++) { + var val = inFields[j]; + if (/^ *$/.test(val)) { + fields[j] = [null, null, null]; + } else { + vals = val.split(";"); + if (vals.length == 3) { + fields[j] = [ Dygraph.parseFloat_(vals[0], i, line), + Dygraph.parseFloat_(vals[1], i, line), + Dygraph.parseFloat_(vals[2], i, line) ]; + } else { + console.warn('When using customBars, values must be either blank ' + + 'or "low;center;high" tuples (got "' + val + + '" on line ' + (1+i)); + } + } + } + } else { + // Values are just numbers + for (j = 1; j < inFields.length; j++) { + fields[j] = Dygraph.parseFloat_(inFields[j], i, line); + } + } + if (ret.length > 0 && fields[0] < ret[ret.length - 1][0]) { + outOfOrder = true; + } + + if (fields.length != expectedCols) { + console.error("Number of columns in line " + i + " (" + fields.length + + ") does not agree with number of labels (" + expectedCols + + ") " + line); + } + + // If the user specified the 'labels' option and none of the cells of the + // first row parsed correctly, then they probably double-specified the + // labels. We go with the values set in the option, discard this row and + // log a warning to the JS console. + if (i === 0 && this.attr_('labels')) { + var all_null = true; + for (j = 0; all_null && j < fields.length; j++) { + if (fields[j]) all_null = false; + } + if (all_null) { + console.warn("The dygraphs 'labels' option is set, but the first row " + + "of CSV data ('" + line + "') appears to also contain " + + "labels. Will drop the CSV labels and use the option " + + "labels."); + continue; + } + } + ret.push(fields); + } + + if (outOfOrder) { + console.warn("CSV is out of order; order it correctly to speed loading."); + ret.sort(function(a,b) { return a[0] - b[0]; }); + } + + return ret; +}; + +/** + * The user has provided their data as a pre-packaged JS array. If the x values + * are numeric, this is the same as dygraphs' internal format. If the x values + * are dates, we need to convert them from Date objects to ms since epoch. + * @param {!Array} data + * @return {Object} data with numeric x values. + * @private + */ +Dygraph.prototype.parseArray_ = function(data) { + // Peek at the first x value to see if it's numeric. + if (data.length === 0) { + console.error("Can't plot empty data set"); + return null; + } + if (data[0].length === 0) { + console.error("Data set cannot contain an empty row"); + return null; + } + + var i; + if (this.attr_("labels") === null) { + console.warn("Using default labels. Set labels explicitly via 'labels' " + + "in the options parameter"); + this.attrs_.labels = [ "X" ]; + for (i = 1; i < data[0].length; i++) { + this.attrs_.labels.push("Y" + i); // Not user_attrs_. + } + this.attributes_.reparseSeries(); + } else { + var num_labels = this.attr_("labels"); + if (num_labels.length != data[0].length) { + console.error("Mismatch between number of labels (" + num_labels + ")" + + " and number of columns in array (" + data[0].length + ")"); + return null; + } + } + + if (Dygraph.isDateLike(data[0][0])) { + // Some intelligent defaults for a date x-axis. + this.attrs_.axes.x.valueFormatter = Dygraph.dateValueFormatter; + this.attrs_.axes.x.ticker = Dygraph.dateTicker; + this.attrs_.axes.x.axisLabelFormatter = Dygraph.dateAxisLabelFormatter; + + // Assume they're all dates. + var parsedData = Dygraph.clone(data); + for (i = 0; i < data.length; i++) { + if (parsedData[i].length === 0) { + console.error("Row " + (1 + i) + " of data is empty"); + return null; + } + if (parsedData[i][0] === null || + typeof(parsedData[i][0].getTime) != 'function' || + isNaN(parsedData[i][0].getTime())) { + console.error("x value in row " + (1 + i) + " is not a Date"); + return null; + } + parsedData[i][0] = parsedData[i][0].getTime(); + } + return parsedData; + } else { + // Some intelligent defaults for a numeric x-axis. + /** @private (shut up, jsdoc!) */ + this.attrs_.axes.x.valueFormatter = function(x) { return x; }; + this.attrs_.axes.x.ticker = Dygraph.numericTicks; + this.attrs_.axes.x.axisLabelFormatter = Dygraph.numberAxisLabelFormatter; + return data; + } +}; + +/** + * Parses a DataTable object from gviz. + * The data is expected to have a first column that is either a date or a + * number. All subsequent columns must be numbers. If there is a clear mismatch + * between this.xValueParser_ and the type of the first column, it will be + * fixed. Fills out rawData_. + * @param {!google.visualization.DataTable} data See above. + * @private + */ +Dygraph.prototype.parseDataTable_ = function(data) { + var shortTextForAnnotationNum = function(num) { + // converts [0-9]+ [A-Z][a-z]* + // example: 0=A, 1=B, 25=Z, 26=Aa, 27=Ab + // and continues like.. Ba Bb .. Za .. Zz..Aaa...Zzz Aaaa Zzzz + var shortText = String.fromCharCode(65 /* A */ + num % 26); + num = Math.floor(num / 26); + while ( num > 0 ) { + shortText = String.fromCharCode(65 /* A */ + (num - 1) % 26 ) + shortText.toLowerCase(); + num = Math.floor((num - 1) / 26); + } + return shortText; + }; + + var cols = data.getNumberOfColumns(); + var rows = data.getNumberOfRows(); + + var indepType = data.getColumnType(0); + if (indepType == 'date' || indepType == 'datetime') { + this.attrs_.xValueParser = Dygraph.dateParser; + this.attrs_.axes.x.valueFormatter = Dygraph.dateValueFormatter; + this.attrs_.axes.x.ticker = Dygraph.dateTicker; + this.attrs_.axes.x.axisLabelFormatter = Dygraph.dateAxisLabelFormatter; + } else if (indepType == 'number') { + this.attrs_.xValueParser = function(x) { return parseFloat(x); }; + this.attrs_.axes.x.valueFormatter = function(x) { return x; }; + this.attrs_.axes.x.ticker = Dygraph.numericTicks; + this.attrs_.axes.x.axisLabelFormatter = this.attrs_.axes.x.valueFormatter; + } else { + console.error("only 'date', 'datetime' and 'number' types are supported " + + "for column 1 of DataTable input (Got '" + indepType + "')"); + return null; + } + + // Array of the column indices which contain data (and not annotations). + var colIdx = []; + var annotationCols = {}; // data index -> [annotation cols] + var hasAnnotations = false; + var i, j; + for (i = 1; i < cols; i++) { + var type = data.getColumnType(i); + if (type == 'number') { + colIdx.push(i); + } else if (type == 'string' && this.getBooleanOption('displayAnnotations')) { + // This is OK -- it's an annotation column. + var dataIdx = colIdx[colIdx.length - 1]; + if (!annotationCols.hasOwnProperty(dataIdx)) { + annotationCols[dataIdx] = [i]; + } else { + annotationCols[dataIdx].push(i); + } + hasAnnotations = true; + } else { + console.error("Only 'number' is supported as a dependent type with Gviz." + + " 'string' is only supported if displayAnnotations is true"); + } + } + + // Read column labels + // TODO(danvk): add support back for errorBars + var labels = [data.getColumnLabel(0)]; + for (i = 0; i < colIdx.length; i++) { + labels.push(data.getColumnLabel(colIdx[i])); + if (this.getBooleanOption("errorBars")) i += 1; + } + this.attrs_.labels = labels; + cols = labels.length; + + var ret = []; + var outOfOrder = false; + var annotations = []; + for (i = 0; i < rows; i++) { + var row = []; + if (typeof(data.getValue(i, 0)) === 'undefined' || + data.getValue(i, 0) === null) { + console.warn("Ignoring row " + i + + " of DataTable because of undefined or null first column."); + continue; + } + + if (indepType == 'date' || indepType == 'datetime') { + row.push(data.getValue(i, 0).getTime()); + } else { + row.push(data.getValue(i, 0)); + } + if (!this.getBooleanOption("errorBars")) { + for (j = 0; j < colIdx.length; j++) { + var col = colIdx[j]; + row.push(data.getValue(i, col)); + if (hasAnnotations && + annotationCols.hasOwnProperty(col) && + data.getValue(i, annotationCols[col][0]) !== null) { + var ann = {}; + ann.series = data.getColumnLabel(col); + ann.xval = row[0]; + ann.shortText = shortTextForAnnotationNum(annotations.length); + ann.text = ''; + for (var k = 0; k < annotationCols[col].length; k++) { + if (k) ann.text += "\n"; + ann.text += data.getValue(i, annotationCols[col][k]); + } + annotations.push(ann); + } + } + + // Strip out infinities, which give dygraphs problems later on. + for (j = 0; j < row.length; j++) { + if (!isFinite(row[j])) row[j] = null; + } + } else { + for (j = 0; j < cols - 1; j++) { + row.push([ data.getValue(i, 1 + 2 * j), data.getValue(i, 2 + 2 * j) ]); + } + } + if (ret.length > 0 && row[0] < ret[ret.length - 1][0]) { + outOfOrder = true; + } + ret.push(row); + } + + if (outOfOrder) { + console.warn("DataTable is out of order; order it correctly to speed loading."); + ret.sort(function(a,b) { return a[0] - b[0]; }); + } + this.rawData_ = ret; + + if (annotations.length > 0) { + this.setAnnotations(annotations, true); + } + this.attributes_.reparseSeries(); +}; + +/** + * Signals to plugins that the chart data has updated. + * This happens after the data has updated but before the chart has redrawn. + */ +Dygraph.prototype.cascadeDataDidUpdateEvent_ = function() { + // TODO(danvk): there are some issues checking xAxisRange() and using + // toDomCoords from handlers of this event. The visible range should be set + // when the chart is drawn, not derived from the data. + this.cascadeEvents_('dataDidUpdate', {}); +}; + +/** + * Get the CSV data. If it's in a function, call that function. If it's in a + * file, do an XMLHttpRequest to get it. + * @private + */ +Dygraph.prototype.start_ = function() { + var data = this.file_; + + // Functions can return references of all other types. + if (typeof data == 'function') { + data = data(); + } + + if (Dygraph.isArrayLike(data)) { + this.rawData_ = this.parseArray_(data); + this.cascadeDataDidUpdateEvent_(); + this.predraw_(); + } else if (typeof data == 'object' && + typeof data.getColumnRange == 'function') { + // must be a DataTable from gviz. + this.parseDataTable_(data); + this.cascadeDataDidUpdateEvent_(); + this.predraw_(); + } else if (typeof data == 'string') { + // Heuristic: a newline means it's CSV data. Otherwise it's an URL. + var line_delimiter = Dygraph.detectLineDelimiter(data); + if (line_delimiter) { + this.loadedEvent_(data); + } else { + // REMOVE_FOR_IE + var req; + if (window.XMLHttpRequest) { + // Firefox, Opera, IE7, and other browsers will use the native object + req = new XMLHttpRequest(); + } else { + // IE 5 and 6 will use the ActiveX control + req = new ActiveXObject("Microsoft.XMLHTTP"); + } + + var caller = this; + req.onreadystatechange = function () { + if (req.readyState == 4) { + if (req.status === 200 || // Normal http + req.status === 0) { // Chrome w/ --allow-file-access-from-files + caller.loadedEvent_(req.responseText); + } + } + }; + + req.open("GET", data, true); + req.send(null); + } + } else { + console.error("Unknown data format: " + (typeof data)); + } +}; + +/** + * Changes various properties of the graph. These can include: + *
      + *
    • file: changes the source data for the graph
    • + *
    • errorBars: changes whether the data contains stddev
    • + *
    + * + * There's a huge variety of options that can be passed to this method. For a + * full list, see http://dygraphs.com/options.html. + * + * @param {Object} input_attrs The new properties and values + * @param {boolean} block_redraw Usually the chart is redrawn after every + * call to updateOptions(). If you know better, you can pass true to + * explicitly block the redraw. This can be useful for chaining + * updateOptions() calls, avoiding the occasional infinite loop and + * preventing redraws when it's not necessary (e.g. when updating a + * callback). + */ +Dygraph.prototype.updateOptions = function(input_attrs, block_redraw) { + if (typeof(block_redraw) == 'undefined') block_redraw = false; + + // mapLegacyOptions_ drops the "file" parameter as a convenience to us. + var file = input_attrs.file; + var attrs = Dygraph.mapLegacyOptions_(input_attrs); + + // TODO(danvk): this is a mess. Move these options into attr_. + if ('rollPeriod' in attrs) { + this.rollPeriod_ = attrs.rollPeriod; + } + if ('dateWindow' in attrs) { + this.dateWindow_ = attrs.dateWindow; + if (!('isZoomedIgnoreProgrammaticZoom' in attrs)) { + this.zoomed_x_ = (attrs.dateWindow !== null); + } + } + if ('valueRange' in attrs && !('isZoomedIgnoreProgrammaticZoom' in attrs)) { + this.zoomed_y_ = (attrs.valueRange !== null); + } + + // TODO(danvk): validate per-series options. + // Supported: + // strokeWidth + // pointSize + // drawPoints + // highlightCircleSize + + // Check if this set options will require new points. + var requiresNewPoints = Dygraph.isPixelChangingOptionList(this.attr_("labels"), attrs); + + Dygraph.updateDeep(this.user_attrs_, attrs); + + this.attributes_.reparseSeries(); + + if (file) { + // This event indicates that the data is about to change, but hasn't yet. + // TODO(danvk): support cancelation of the update via this event. + this.cascadeEvents_('dataWillUpdate', {}); + + this.file_ = file; + if (!block_redraw) this.start_(); + } else { + if (!block_redraw) { + if (requiresNewPoints) { + this.predraw_(); + } else { + this.renderGraph_(false); + } + } + } +}; + +/** + * Returns a copy of the options with deprecated names converted into current + * names. Also drops the (potentially-large) 'file' attribute. If the caller is + * interested in that, they should save a copy before calling this. + * @private + */ +Dygraph.mapLegacyOptions_ = function(attrs) { + var my_attrs = {}; + for (var k in attrs) { + if (!attrs.hasOwnProperty(k)) continue; + if (k == 'file') continue; + if (attrs.hasOwnProperty(k)) my_attrs[k] = attrs[k]; + } + + var set = function(axis, opt, value) { + if (!my_attrs.axes) my_attrs.axes = {}; + if (!my_attrs.axes[axis]) my_attrs.axes[axis] = {}; + my_attrs.axes[axis][opt] = value; + }; + var map = function(opt, axis, new_opt) { + if (typeof(attrs[opt]) != 'undefined') { + console.warn("Option " + opt + " is deprecated. Use the " + + new_opt + " option for the " + axis + " axis instead. " + + "(e.g. { axes : { " + axis + " : { " + new_opt + " : ... } } } " + + "(see http://dygraphs.com/per-axis.html for more information."); + set(axis, new_opt, attrs[opt]); + delete my_attrs[opt]; + } + }; + + // This maps, e.g., xValueFormater -> axes: { x: { valueFormatter: ... } } + map('xValueFormatter', 'x', 'valueFormatter'); + map('pixelsPerXLabel', 'x', 'pixelsPerLabel'); + map('xAxisLabelFormatter', 'x', 'axisLabelFormatter'); + map('xTicker', 'x', 'ticker'); + map('yValueFormatter', 'y', 'valueFormatter'); + map('pixelsPerYLabel', 'y', 'pixelsPerLabel'); + map('yAxisLabelFormatter', 'y', 'axisLabelFormatter'); + map('yTicker', 'y', 'ticker'); + map('drawXGrid', 'x', 'drawGrid'); + map('drawXAxis', 'x', 'drawAxis'); + map('drawYGrid', 'y', 'drawGrid'); + map('drawYAxis', 'y', 'drawAxis'); + map('xAxisLabelWidth', 'x', 'axisLabelWidth'); + map('yAxisLabelWidth', 'y', 'axisLabelWidth'); + return my_attrs; +}; + +/** + * Resizes the dygraph. If no parameters are specified, resizes to fill the + * containing div (which has presumably changed size since the dygraph was + * instantiated. If the width/height are specified, the div will be resized. + * + * This is far more efficient than destroying and re-instantiating a + * Dygraph, since it doesn't have to reparse the underlying data. + * + * @param {number} width Width (in pixels) + * @param {number} height Height (in pixels) + */ +Dygraph.prototype.resize = function(width, height) { + if (this.resize_lock) { + return; + } + this.resize_lock = true; + + if ((width === null) != (height === null)) { + console.warn("Dygraph.resize() should be called with zero parameters or " + + "two non-NULL parameters. Pretending it was zero."); + width = height = null; + } + + var old_width = this.width_; + var old_height = this.height_; + + if (width) { + this.maindiv_.style.width = width + "px"; + this.maindiv_.style.height = height + "px"; + this.width_ = width; + this.height_ = height; + } else { + this.width_ = this.maindiv_.clientWidth; + this.height_ = this.maindiv_.clientHeight; + } + + if (old_width != this.width_ || old_height != this.height_) { + // Resizing a canvas erases it, even when the size doesn't change, so + // any resize needs to be followed by a redraw. + this.resizeElements_(); + this.predraw_(); + } + + this.resize_lock = false; +}; + +/** + * Adjusts the number of points in the rolling average. Updates the graph to + * reflect the new averaging period. + * @param {number} length Number of points over which to average the data. + */ +Dygraph.prototype.adjustRoll = function(length) { + this.rollPeriod_ = length; + this.predraw_(); +}; + +/** + * Returns a boolean array of visibility statuses. + */ +Dygraph.prototype.visibility = function() { + // Do lazy-initialization, so that this happens after we know the number of + // data series. + if (!this.getOption("visibility")) { + this.attrs_.visibility = []; + } + // TODO(danvk): it looks like this could go into an infinite loop w/ user_attrs. + while (this.getOption("visibility").length < this.numColumns() - 1) { + this.attrs_.visibility.push(true); + } + return this.getOption("visibility"); +}; + +/** + * Changes the visiblity of a series. + * + * @param {number} num the series index + * @param {boolean} value true or false, identifying the visibility. + */ +Dygraph.prototype.setVisibility = function(num, value) { + var x = this.visibility(); + if (num < 0 || num >= x.length) { + console.warn("invalid series number in setVisibility: " + num); + } else { + x[num] = value; + this.predraw_(); + } +}; + +/** + * How large of an area will the dygraph render itself in? + * This is used for testing. + * @return A {width: w, height: h} object. + * @private + */ +Dygraph.prototype.size = function() { + return { width: this.width_, height: this.height_ }; +}; + +/** + * Update the list of annotations and redraw the chart. + * See dygraphs.com/annotations.html for more info on how to use annotations. + * @param ann {Array} An array of annotation objects. + * @param suppressDraw {Boolean} Set to "true" to block chart redraw (optional). + */ +Dygraph.prototype.setAnnotations = function(ann, suppressDraw) { + // Only add the annotation CSS rule once we know it will be used. + Dygraph.addAnnotationRule(); + this.annotations_ = ann; + if (!this.layout_) { + console.warn("Tried to setAnnotations before dygraph was ready. " + + "Try setting them in a ready() block. See " + + "dygraphs.com/tests/annotation.html"); + return; + } + + this.layout_.setAnnotations(this.annotations_); + if (!suppressDraw) { + this.predraw_(); + } +}; + +/** + * Return the list of annotations. + */ +Dygraph.prototype.annotations = function() { + return this.annotations_; +}; + +/** + * Get the list of label names for this graph. The first column is the + * x-axis, so the data series names start at index 1. + * + * Returns null when labels have not yet been defined. + */ +Dygraph.prototype.getLabels = function() { + var labels = this.attr_("labels"); + return labels ? labels.slice() : null; +}; + +/** + * Get the index of a series (column) given its name. The first column is the + * x-axis, so the data series start with index 1. + */ +Dygraph.prototype.indexFromSetName = function(name) { + return this.setIndexByName_[name]; +}; + +/** + * Trigger a callback when the dygraph has drawn itself and is ready to be + * manipulated. This is primarily useful when dygraphs has to do an XHR for the + * data (i.e. a URL is passed as the data source) and the chart is drawn + * asynchronously. If the chart has already drawn, the callback will fire + * immediately. + * + * This is a good place to call setAnnotation(). + * + * @param {function(!Dygraph)} callback The callback to trigger when the chart + * is ready. + */ +Dygraph.prototype.ready = function(callback) { + if (this.is_initial_draw_) { + this.readyFns_.push(callback); + } else { + callback.call(this, this); + } +}; + +/** + * @private + * Adds a default style for the annotation CSS classes to the document. This is + * only executed when annotations are actually used. It is designed to only be + * called once -- all calls after the first will return immediately. + */ +Dygraph.addAnnotationRule = function() { + // TODO(danvk): move this function into plugins/annotations.js? + if (Dygraph.addedAnnotationCSS) return; + + var rule = "border: 1px solid black; " + + "background-color: white; " + + "text-align: center;"; + + var styleSheetElement = document.createElement("style"); + styleSheetElement.type = "text/css"; + document.getElementsByTagName("head")[0].appendChild(styleSheetElement); + + // Find the first style sheet that we can access. + // We may not add a rule to a style sheet from another domain for security + // reasons. This sometimes comes up when using gviz, since the Google gviz JS + // adds its own style sheets from google.com. + for (var i = 0; i < document.styleSheets.length; i++) { + if (document.styleSheets[i].disabled) continue; + var mysheet = document.styleSheets[i]; + try { + if (mysheet.insertRule) { // Firefox + var idx = mysheet.cssRules ? mysheet.cssRules.length : 0; + mysheet.insertRule(".dygraphDefaultAnnotation { " + rule + " }", idx); + } else if (mysheet.addRule) { // IE + mysheet.addRule(".dygraphDefaultAnnotation", rule); + } + Dygraph.addedAnnotationCSS = true; + return; + } catch(err) { + // Was likely a security exception. + } + } + + console.warn("Unable to add default annotation CSS rule; display may be off."); +}; + +if (typeof exports === "object" && typeof module !== "undefined") { + module.exports = Dygraph; +} + +return Dygraph; + +})(); +/** + * @license + * Copyright 2011 Dan Vanderkam (danvdk@gmail.com) + * MIT-licensed (http://opensource.org/licenses/MIT) + */ + +/** + * @fileoverview This file contains utility functions used by dygraphs. These + * are typically static (i.e. not related to any particular dygraph). Examples + * include date/time formatting functions, basic algorithms (e.g. binary + * search) and generic DOM-manipulation functions. + */ + +(function() { + +/*global Dygraph:false, G_vmlCanvasManager:false, Node:false */ +"use strict"; + +Dygraph.LOG_SCALE = 10; +Dygraph.LN_TEN = Math.log(Dygraph.LOG_SCALE); + +/** + * @private + * @param {number} x + * @return {number} + */ +Dygraph.log10 = function(x) { + return Math.log(x) / Dygraph.LN_TEN; +}; + +/** A dotted line stroke pattern. */ +Dygraph.DOTTED_LINE = [2, 2]; +/** A dashed line stroke pattern. */ +Dygraph.DASHED_LINE = [7, 3]; +/** A dot dash stroke pattern. */ +Dygraph.DOT_DASH_LINE = [7, 2, 2, 2]; + +/** + * Return the 2d context for a dygraph canvas. + * + * This method is only exposed for the sake of replacing the function in + * automated tests, e.g. + * + * var oldFunc = Dygraph.getContext(); + * Dygraph.getContext = function(canvas) { + * var realContext = oldFunc(canvas); + * return new Proxy(realContext); + * }; + * @param {!HTMLCanvasElement} canvas + * @return {!CanvasRenderingContext2D} + * @private + */ +Dygraph.getContext = function(canvas) { + return /** @type{!CanvasRenderingContext2D}*/(canvas.getContext("2d")); +}; + +/** + * Add an event handler. This smooths a difference between IE and the rest of + * the world. + * @param {!Node} elem The element to add the event to. + * @param {string} type The type of the event, e.g. 'click' or 'mousemove'. + * @param {function(Event):(boolean|undefined)} fn The function to call + * on the event. The function takes one parameter: the event object. + * @private + */ +Dygraph.addEvent = function addEvent(elem, type, fn) { + if (elem.addEventListener) { + elem.addEventListener(type, fn, false); + } else { + elem[type+fn] = function(){fn(window.event);}; + elem.attachEvent('on'+type, elem[type+fn]); + } +}; + +/** + * Add an event handler. This event handler is kept until the graph is + * destroyed with a call to graph.destroy(). + * + * @param {!Node} elem The element to add the event to. + * @param {string} type The type of the event, e.g. 'click' or 'mousemove'. + * @param {function(Event):(boolean|undefined)} fn The function to call + * on the event. The function takes one parameter: the event object. + * @private + */ +Dygraph.prototype.addAndTrackEvent = function(elem, type, fn) { + Dygraph.addEvent(elem, type, fn); + this.registeredEvents_.push({ elem : elem, type : type, fn : fn }); +}; + +/** + * Remove an event handler. This smooths a difference between IE and the rest + * of the world. + * @param {!Node} elem The element to remove the event from. + * @param {string} type The type of the event, e.g. 'click' or 'mousemove'. + * @param {function(Event):(boolean|undefined)} fn The function to call + * on the event. The function takes one parameter: the event object. + * @private + */ +Dygraph.removeEvent = function(elem, type, fn) { + if (elem.removeEventListener) { + elem.removeEventListener(type, fn, false); + } else { + try { + elem.detachEvent('on'+type, elem[type+fn]); + } catch(e) { + // We only detach event listeners on a "best effort" basis in IE. See: + // http://stackoverflow.com/questions/2553632/detachevent-not-working-with-named-inline-functions + } + elem[type+fn] = null; + } +}; + +Dygraph.prototype.removeTrackedEvents_ = function() { + if (this.registeredEvents_) { + for (var idx = 0; idx < this.registeredEvents_.length; idx++) { + var reg = this.registeredEvents_[idx]; + Dygraph.removeEvent(reg.elem, reg.type, reg.fn); + } + } + + this.registeredEvents_ = []; +}; + +/** + * Cancels further processing of an event. This is useful to prevent default + * browser actions, e.g. highlighting text on a double-click. + * Based on the article at + * http://www.switchonthecode.com/tutorials/javascript-tutorial-the-scroll-wheel + * @param {!Event} e The event whose normal behavior should be canceled. + * @private + */ +Dygraph.cancelEvent = function(e) { + e = e ? e : window.event; + if (e.stopPropagation) { + e.stopPropagation(); + } + if (e.preventDefault) { + e.preventDefault(); + } + e.cancelBubble = true; + e.cancel = true; + e.returnValue = false; + return false; +}; + +/** + * Convert hsv values to an rgb(r,g,b) string. Taken from MochiKit.Color. This + * is used to generate default series colors which are evenly spaced on the + * color wheel. + * @param { number } hue Range is 0.0-1.0. + * @param { number } saturation Range is 0.0-1.0. + * @param { number } value Range is 0.0-1.0. + * @return { string } "rgb(r,g,b)" where r, g and b range from 0-255. + * @private + */ +Dygraph.hsvToRGB = function (hue, saturation, value) { + var red; + var green; + var blue; + if (saturation === 0) { + red = value; + green = value; + blue = value; + } else { + var i = Math.floor(hue * 6); + var f = (hue * 6) - i; + var p = value * (1 - saturation); + var q = value * (1 - (saturation * f)); + var t = value * (1 - (saturation * (1 - f))); + switch (i) { + case 1: red = q; green = value; blue = p; break; + case 2: red = p; green = value; blue = t; break; + case 3: red = p; green = q; blue = value; break; + case 4: red = t; green = p; blue = value; break; + case 5: red = value; green = p; blue = q; break; + case 6: // fall through + case 0: red = value; green = t; blue = p; break; + } + } + red = Math.floor(255 * red + 0.5); + green = Math.floor(255 * green + 0.5); + blue = Math.floor(255 * blue + 0.5); + return 'rgb(' + red + ',' + green + ',' + blue + ')'; +}; + +// The following functions are from quirksmode.org with a modification for Safari from +// http://blog.firetree.net/2005/07/04/javascript-find-position/ +// http://www.quirksmode.org/js/findpos.html +// ... and modifications to support scrolling divs. + +/** + * Find the coordinates of an object relative to the top left of the page. + * + * TODO(danvk): change obj type from Node -> !Node + * @param {Node} obj + * @return {{x:number,y:number}} + * @private + */ +Dygraph.findPos = function(obj) { + var curleft = 0, curtop = 0; + if (obj.offsetParent) { + var copyObj = obj; + while (1) { + // NOTE: the if statement here is for IE8. + var borderLeft = "0", borderTop = "0"; + if (window.getComputedStyle) { + var computedStyle = window.getComputedStyle(copyObj, null); + borderLeft = computedStyle.borderLeft || "0"; + borderTop = computedStyle.borderTop || "0"; + } + curleft += parseInt(borderLeft, 10) ; + curtop += parseInt(borderTop, 10) ; + curleft += copyObj.offsetLeft; + curtop += copyObj.offsetTop; + if (!copyObj.offsetParent) { + break; + } + copyObj = copyObj.offsetParent; + } + } else { + // TODO(danvk): why would obj ever have these properties? + if (obj.x) curleft += obj.x; + if (obj.y) curtop += obj.y; + } + + // This handles the case where the object is inside a scrolled div. + while (obj && obj != document.body) { + curleft -= obj.scrollLeft; + curtop -= obj.scrollTop; + obj = obj.parentNode; + } + return {x: curleft, y: curtop}; +}; + +/** + * Returns the x-coordinate of the event in a coordinate system where the + * top-left corner of the page (not the window) is (0,0). + * Taken from MochiKit.Signal + * @param {!Event} e + * @return {number} + * @private + */ +Dygraph.pageX = function(e) { + if (e.pageX) { + return (!e.pageX || e.pageX < 0) ? 0 : e.pageX; + } else { + var de = document.documentElement; + var b = document.body; + return e.clientX + + (de.scrollLeft || b.scrollLeft) - + (de.clientLeft || 0); + } +}; + +/** + * Returns the y-coordinate of the event in a coordinate system where the + * top-left corner of the page (not the window) is (0,0). + * Taken from MochiKit.Signal + * @param {!Event} e + * @return {number} + * @private + */ +Dygraph.pageY = function(e) { + if (e.pageY) { + return (!e.pageY || e.pageY < 0) ? 0 : e.pageY; + } else { + var de = document.documentElement; + var b = document.body; + return e.clientY + + (de.scrollTop || b.scrollTop) - + (de.clientTop || 0); + } +}; + +/** + * Converts page the x-coordinate of the event to pixel x-coordinates on the + * canvas (i.e. DOM Coords). + * @param {!Event} e Drag event. + * @param {!DygraphInteractionContext} context Interaction context object. + * @return {number} The amount by which the drag has moved to the right. + */ +Dygraph.dragGetX_ = function(e, context) { + return Dygraph.pageX(e) - context.px; +}; + +/** + * Converts page the y-coordinate of the event to pixel y-coordinates on the + * canvas (i.e. DOM Coords). + * @param {!Event} e Drag event. + * @param {!DygraphInteractionContext} context Interaction context object. + * @return {number} The amount by which the drag has moved down. + */ +Dygraph.dragGetY_ = function(e, context) { + return Dygraph.pageY(e) - context.py; +}; + +/** + * This returns true unless the parameter is 0, null, undefined or NaN. + * TODO(danvk): rename this function to something like 'isNonZeroNan'. + * + * @param {number} x The number to consider. + * @return {boolean} Whether the number is zero or NaN. + * @private + */ +Dygraph.isOK = function(x) { + return !!x && !isNaN(x); +}; + +/** + * @param {{x:?number,y:?number,yval:?number}} p The point to consider, valid + * points are {x, y} objects + * @param {boolean=} opt_allowNaNY Treat point with y=NaN as valid + * @return {boolean} Whether the point has numeric x and y. + * @private + */ +Dygraph.isValidPoint = function(p, opt_allowNaNY) { + if (!p) return false; // null or undefined object + if (p.yval === null) return false; // missing point + if (p.x === null || p.x === undefined) return false; + if (p.y === null || p.y === undefined) return false; + if (isNaN(p.x) || (!opt_allowNaNY && isNaN(p.y))) return false; + return true; +}; + +/** + * Number formatting function which mimicks the behavior of %g in printf, i.e. + * either exponential or fixed format (without trailing 0s) is used depending on + * the length of the generated string. The advantage of this format is that + * there is a predictable upper bound on the resulting string length, + * significant figures are not dropped, and normal numbers are not displayed in + * exponential notation. + * + * NOTE: JavaScript's native toPrecision() is NOT a drop-in replacement for %g. + * It creates strings which are too long for absolute values between 10^-4 and + * 10^-6, e.g. '0.00001' instead of '1e-5'. See tests/number-format.html for + * output examples. + * + * @param {number} x The number to format + * @param {number=} opt_precision The precision to use, default 2. + * @return {string} A string formatted like %g in printf. The max generated + * string length should be precision + 6 (e.g 1.123e+300). + */ +Dygraph.floatFormat = function(x, opt_precision) { + // Avoid invalid precision values; [1, 21] is the valid range. + var p = Math.min(Math.max(1, opt_precision || 2), 21); + + // This is deceptively simple. The actual algorithm comes from: + // + // Max allowed length = p + 4 + // where 4 comes from 'e+n' and '.'. + // + // Length of fixed format = 2 + y + p + // where 2 comes from '0.' and y = # of leading zeroes. + // + // Equating the two and solving for y yields y = 2, or 0.00xxxx which is + // 1.0e-3. + // + // Since the behavior of toPrecision() is identical for larger numbers, we + // don't have to worry about the other bound. + // + // Finally, the argument for toExponential() is the number of trailing digits, + // so we take off 1 for the value before the '.'. + return (Math.abs(x) < 1.0e-3 && x !== 0.0) ? + x.toExponential(p - 1) : x.toPrecision(p); +}; + +/** + * Converts '9' to '09' (useful for dates) + * @param {number} x + * @return {string} + * @private + */ +Dygraph.zeropad = function(x) { + if (x < 10) return "0" + x; else return "" + x; +}; + +/** + * Date accessors to get the parts of a calendar date (year, month, + * day, hour, minute, second and millisecond) according to local time, + * and factory method to call the Date constructor with an array of arguments. + */ +Dygraph.DateAccessorsLocal = { + getFullYear: function(d) {return d.getFullYear();}, + getMonth: function(d) {return d.getMonth();}, + getDate: function(d) {return d.getDate();}, + getHours: function(d) {return d.getHours();}, + getMinutes: function(d) {return d.getMinutes();}, + getSeconds: function(d) {return d.getSeconds();}, + getMilliseconds: function(d) {return d.getMilliseconds();}, + getDay: function(d) {return d.getDay();}, + makeDate: function(y, m, d, hh, mm, ss, ms) { + return new Date(y, m, d, hh, mm, ss, ms); + } +}; + +/** + * Date accessors to get the parts of a calendar date (year, month, + * day of month, hour, minute, second and millisecond) according to UTC time, + * and factory method to call the Date constructor with an array of arguments. + */ +Dygraph.DateAccessorsUTC = { + getFullYear: function(d) {return d.getUTCFullYear();}, + getMonth: function(d) {return d.getUTCMonth();}, + getDate: function(d) {return d.getUTCDate();}, + getHours: function(d) {return d.getUTCHours();}, + getMinutes: function(d) {return d.getUTCMinutes();}, + getSeconds: function(d) {return d.getUTCSeconds();}, + getMilliseconds: function(d) {return d.getUTCMilliseconds();}, + getDay: function(d) {return d.getUTCDay();}, + makeDate: function(y, m, d, hh, mm, ss, ms) { + return new Date(Date.UTC(y, m, d, hh, mm, ss, ms)); + } +}; + +/** + * Return a string version of the hours, minutes and seconds portion of a date. + * @param {number} hh The hours (from 0-23) + * @param {number} mm The minutes (from 0-59) + * @param {number} ss The seconds (from 0-59) + * @return {string} A time of the form "HH:MM" or "HH:MM:SS" + * @private + */ +Dygraph.hmsString_ = function(hh, mm, ss) { + var zeropad = Dygraph.zeropad; + var ret = zeropad(hh) + ":" + zeropad(mm); + if (ss) { + ret += ":" + zeropad(ss); + } + return ret; +}; + +/** + * Convert a JS date (millis since epoch) to a formatted string. + * @param {number} time The JavaScript time value (ms since epoch) + * @param {boolean} utc Wether output UTC or local time + * @return {string} A date of one of these forms: + * "YYYY/MM/DD", "YYYY/MM/DD HH:MM" or "YYYY/MM/DD HH:MM:SS" + * @private + */ +Dygraph.dateString_ = function(time, utc) { + var zeropad = Dygraph.zeropad; + var accessors = utc ? Dygraph.DateAccessorsUTC : Dygraph.DateAccessorsLocal; + var date = new Date(time); + var y = accessors.getFullYear(date); + var m = accessors.getMonth(date); + var d = accessors.getDate(date); + var hh = accessors.getHours(date); + var mm = accessors.getMinutes(date); + var ss = accessors.getSeconds(date); + // Get a year string: + var year = "" + y; + // Get a 0 padded month string + var month = zeropad(m + 1); //months are 0-offset, sigh + // Get a 0 padded day string + var day = zeropad(d); + var frac = hh * 3600 + mm * 60 + ss; + var ret = year + "/" + month + "/" + day; + if (frac) { + ret += " " + Dygraph.hmsString_(hh, mm, ss); + } + return ret; +}; + +/** + * Round a number to the specified number of digits past the decimal point. + * @param {number} num The number to round + * @param {number} places The number of decimals to which to round + * @return {number} The rounded number + * @private + */ +Dygraph.round_ = function(num, places) { + var shift = Math.pow(10, places); + return Math.round(num * shift)/shift; +}; + +/** + * Implementation of binary search over an array. + * Currently does not work when val is outside the range of arry's values. + * @param {number} val the value to search for + * @param {Array.} arry is the value over which to search + * @param {number} abs If abs > 0, find the lowest entry greater than val + * If abs < 0, find the highest entry less than val. + * If abs == 0, find the entry that equals val. + * @param {number=} low The first index in arry to consider (optional) + * @param {number=} high The last index in arry to consider (optional) + * @return {number} Index of the element, or -1 if it isn't found. + * @private + */ +Dygraph.binarySearch = function(val, arry, abs, low, high) { + if (low === null || low === undefined || + high === null || high === undefined) { + low = 0; + high = arry.length - 1; + } + if (low > high) { + return -1; + } + if (abs === null || abs === undefined) { + abs = 0; + } + var validIndex = function(idx) { + return idx >= 0 && idx < arry.length; + }; + var mid = parseInt((low + high) / 2, 10); + var element = arry[mid]; + var idx; + if (element == val) { + return mid; + } else if (element > val) { + if (abs > 0) { + // Accept if element > val, but also if prior element < val. + idx = mid - 1; + if (validIndex(idx) && arry[idx] < val) { + return mid; + } + } + return Dygraph.binarySearch(val, arry, abs, low, mid - 1); + } else if (element < val) { + if (abs < 0) { + // Accept if element < val, but also if prior element > val. + idx = mid + 1; + if (validIndex(idx) && arry[idx] > val) { + return mid; + } + } + return Dygraph.binarySearch(val, arry, abs, mid + 1, high); + } + return -1; // can't actually happen, but makes closure compiler happy +}; + +/** + * Parses a date, returning the number of milliseconds since epoch. This can be + * passed in as an xValueParser in the Dygraph constructor. + * TODO(danvk): enumerate formats that this understands. + * + * @param {string} dateStr A date in a variety of possible string formats. + * @return {number} Milliseconds since epoch. + * @private + */ +Dygraph.dateParser = function(dateStr) { + var dateStrSlashed; + var d; + + // Let the system try the format first, with one caveat: + // YYYY-MM-DD[ HH:MM:SS] is interpreted as UTC by a variety of browsers. + // dygraphs displays dates in local time, so this will result in surprising + // inconsistencies. But if you specify "T" or "Z" (i.e. YYYY-MM-DDTHH:MM:SS), + // then you probably know what you're doing, so we'll let you go ahead. + // Issue: http://code.google.com/p/dygraphs/issues/detail?id=255 + if (dateStr.search("-") == -1 || + dateStr.search("T") != -1 || dateStr.search("Z") != -1) { + d = Dygraph.dateStrToMillis(dateStr); + if (d && !isNaN(d)) return d; + } + + if (dateStr.search("-") != -1) { // e.g. '2009-7-12' or '2009-07-12' + dateStrSlashed = dateStr.replace("-", "/", "g"); + while (dateStrSlashed.search("-") != -1) { + dateStrSlashed = dateStrSlashed.replace("-", "/"); + } + d = Dygraph.dateStrToMillis(dateStrSlashed); + } else if (dateStr.length == 8) { // e.g. '20090712' + // TODO(danvk): remove support for this format. It's confusing. + dateStrSlashed = dateStr.substr(0,4) + "/" + dateStr.substr(4,2) + "/" + + dateStr.substr(6,2); + d = Dygraph.dateStrToMillis(dateStrSlashed); + } else { + // Any format that Date.parse will accept, e.g. "2009/07/12" or + // "2009/07/12 12:34:56" + d = Dygraph.dateStrToMillis(dateStr); + } + + if (!d || isNaN(d)) { + console.error("Couldn't parse " + dateStr + " as a date"); + } + return d; +}; + +/** + * This is identical to JavaScript's built-in Date.parse() method, except that + * it doesn't get replaced with an incompatible method by aggressive JS + * libraries like MooTools or Joomla. + * @param {string} str The date string, e.g. "2011/05/06" + * @return {number} millis since epoch + * @private + */ +Dygraph.dateStrToMillis = function(str) { + return new Date(str).getTime(); +}; + +// These functions are all based on MochiKit. +/** + * Copies all the properties from o to self. + * + * @param {!Object} self + * @param {!Object} o + * @return {!Object} + */ +Dygraph.update = function(self, o) { + if (typeof(o) != 'undefined' && o !== null) { + for (var k in o) { + if (o.hasOwnProperty(k)) { + self[k] = o[k]; + } + } + } + return self; +}; + +/** + * Copies all the properties from o to self. + * + * @param {!Object} self + * @param {!Object} o + * @return {!Object} + * @private + */ +Dygraph.updateDeep = function (self, o) { + // Taken from http://stackoverflow.com/questions/384286/javascript-isdom-how-do-you-check-if-a-javascript-object-is-a-dom-object + function isNode(o) { + return ( + typeof Node === "object" ? o instanceof Node : + typeof o === "object" && typeof o.nodeType === "number" && typeof o.nodeName==="string" + ); + } + + if (typeof(o) != 'undefined' && o !== null) { + for (var k in o) { + if (o.hasOwnProperty(k)) { + if (o[k] === null) { + self[k] = null; + } else if (Dygraph.isArrayLike(o[k])) { + self[k] = o[k].slice(); + } else if (isNode(o[k])) { + // DOM objects are shallowly-copied. + self[k] = o[k]; + } else if (typeof(o[k]) == 'object') { + if (typeof(self[k]) != 'object' || self[k] === null) { + self[k] = {}; + } + Dygraph.updateDeep(self[k], o[k]); + } else { + self[k] = o[k]; + } + } + } + } + return self; +}; + +/** + * @param {*} o + * @return {boolean} + * @private + */ +Dygraph.isArrayLike = function(o) { + var typ = typeof(o); + if ( + (typ != 'object' && !(typ == 'function' && + typeof(o.item) == 'function')) || + o === null || + typeof(o.length) != 'number' || + o.nodeType === 3 + ) { + return false; + } + return true; +}; + +/** + * @param {Object} o + * @return {boolean} + * @private + */ +Dygraph.isDateLike = function (o) { + if (typeof(o) != "object" || o === null || + typeof(o.getTime) != 'function') { + return false; + } + return true; +}; + +/** + * Note: this only seems to work for arrays. + * @param {!Array} o + * @return {!Array} + * @private + */ +Dygraph.clone = function(o) { + // TODO(danvk): figure out how MochiKit's version works + var r = []; + for (var i = 0; i < o.length; i++) { + if (Dygraph.isArrayLike(o[i])) { + r.push(Dygraph.clone(o[i])); + } else { + r.push(o[i]); + } + } + return r; +}; + +/** + * Create a new canvas element. This is more complex than a simple + * document.createElement("canvas") because of IE and excanvas. + * + * @return {!HTMLCanvasElement} + * @private + */ +Dygraph.createCanvas = function() { + var canvas = document.createElement("canvas"); + + var isIE = (/MSIE/.test(navigator.userAgent) && !window.opera); + if (isIE && (typeof(G_vmlCanvasManager) != 'undefined')) { + canvas = G_vmlCanvasManager.initElement( + /**@type{!HTMLCanvasElement}*/(canvas)); + } + + return canvas; +}; + +/** + * Returns the context's pixel ratio, which is the ratio between the device + * pixel ratio and the backing store ratio. Typically this is 1 for conventional + * displays, and > 1 for HiDPI displays (such as the Retina MBP). + * See http://www.html5rocks.com/en/tutorials/canvas/hidpi/ for more details. + * + * @param {!CanvasRenderingContext2D} context The canvas's 2d context. + * @return {number} The ratio of the device pixel ratio and the backing store + * ratio for the specified context. + */ +Dygraph.getContextPixelRatio = function(context) { + try { + var devicePixelRatio = window.devicePixelRatio; + var backingStoreRatio = context.webkitBackingStorePixelRatio || + context.mozBackingStorePixelRatio || + context.msBackingStorePixelRatio || + context.oBackingStorePixelRatio || + context.backingStorePixelRatio || 1; + if (devicePixelRatio !== undefined) { + return devicePixelRatio / backingStoreRatio; + } else { + // At least devicePixelRatio must be defined for this ratio to make sense. + // We default backingStoreRatio to 1: this does not exist on some browsers + // (i.e. desktop Chrome). + return 1; + } + } catch (e) { + return 1; + } +}; + +/** + * Checks whether the user is on an Android browser. + * Android does not fully support the tag, e.g. w/r/t/ clipping. + * @return {boolean} + * @private + */ +Dygraph.isAndroid = function() { + return (/Android/).test(navigator.userAgent); +}; + + +/** + * TODO(danvk): use @template here when it's better supported for classes. + * @param {!Array} array + * @param {number} start + * @param {number} length + * @param {function(!Array,?):boolean=} predicate + * @constructor + */ +Dygraph.Iterator = function(array, start, length, predicate) { + start = start || 0; + length = length || array.length; + this.hasNext = true; // Use to identify if there's another element. + this.peek = null; // Use for look-ahead + this.start_ = start; + this.array_ = array; + this.predicate_ = predicate; + this.end_ = Math.min(array.length, start + length); + this.nextIdx_ = start - 1; // use -1 so initial advance works. + this.next(); // ignoring result. +}; + +/** + * @return {Object} + */ +Dygraph.Iterator.prototype.next = function() { + if (!this.hasNext) { + return null; + } + var obj = this.peek; + + var nextIdx = this.nextIdx_ + 1; + var found = false; + while (nextIdx < this.end_) { + if (!this.predicate_ || this.predicate_(this.array_, nextIdx)) { + this.peek = this.array_[nextIdx]; + found = true; + break; + } + nextIdx++; + } + this.nextIdx_ = nextIdx; + if (!found) { + this.hasNext = false; + this.peek = null; + } + return obj; +}; + +/** + * Returns a new iterator over array, between indexes start and + * start + length, and only returns entries that pass the accept function + * + * @param {!Array} array the array to iterate over. + * @param {number} start the first index to iterate over, 0 if absent. + * @param {number} length the number of elements in the array to iterate over. + * This, along with start, defines a slice of the array, and so length + * doesn't imply the number of elements in the iterator when accept doesn't + * always accept all values. array.length when absent. + * @param {function(?):boolean=} opt_predicate a function that takes + * parameters array and idx, which returns true when the element should be + * returned. If omitted, all elements are accepted. + * @private + */ +Dygraph.createIterator = function(array, start, length, opt_predicate) { + return new Dygraph.Iterator(array, start, length, opt_predicate); +}; + +// Shim layer with setTimeout fallback. +// From: http://paulirish.com/2011/requestanimationframe-for-smart-animating/ +// Should be called with the window context: +// Dygraph.requestAnimFrame.call(window, function() {}) +Dygraph.requestAnimFrame = (function() { + return window.requestAnimationFrame || + window.webkitRequestAnimationFrame || + window.mozRequestAnimationFrame || + window.oRequestAnimationFrame || + window.msRequestAnimationFrame || + function (callback) { + window.setTimeout(callback, 1000 / 60); + }; +})(); + +/** + * Call a function at most maxFrames times at an attempted interval of + * framePeriodInMillis, then call a cleanup function once. repeatFn is called + * once immediately, then at most (maxFrames - 1) times asynchronously. If + * maxFrames==1, then cleanup_fn() is also called synchronously. This function + * is used to sequence animation. + * @param {function(number)} repeatFn Called repeatedly -- takes the frame + * number (from 0 to maxFrames-1) as an argument. + * @param {number} maxFrames The max number of times to call repeatFn + * @param {number} framePeriodInMillis Max requested time between frames. + * @param {function()} cleanupFn A function to call after all repeatFn calls. + * @private + */ +Dygraph.repeatAndCleanup = function(repeatFn, maxFrames, framePeriodInMillis, + cleanupFn) { + var frameNumber = 0; + var previousFrameNumber; + var startTime = new Date().getTime(); + repeatFn(frameNumber); + if (maxFrames == 1) { + cleanupFn(); + return; + } + var maxFrameArg = maxFrames - 1; + + (function loop() { + if (frameNumber >= maxFrames) return; + Dygraph.requestAnimFrame.call(window, function() { + // Determine which frame to draw based on the delay so far. Will skip + // frames if necessary. + var currentTime = new Date().getTime(); + var delayInMillis = currentTime - startTime; + previousFrameNumber = frameNumber; + frameNumber = Math.floor(delayInMillis / framePeriodInMillis); + var frameDelta = frameNumber - previousFrameNumber; + // If we predict that the subsequent repeatFn call will overshoot our + // total frame target, so our last call will cause a stutter, then jump to + // the last call immediately. If we're going to cause a stutter, better + // to do it faster than slower. + var predictOvershootStutter = (frameNumber + frameDelta) > maxFrameArg; + if (predictOvershootStutter || (frameNumber >= maxFrameArg)) { + repeatFn(maxFrameArg); // Ensure final call with maxFrameArg. + cleanupFn(); + } else { + if (frameDelta !== 0) { // Don't call repeatFn with duplicate frames. + repeatFn(frameNumber); + } + loop(); + } + }); + })(); +}; + +// A whitelist of options that do not change pixel positions. +var pixelSafeOptions = { + 'annotationClickHandler': true, + 'annotationDblClickHandler': true, + 'annotationMouseOutHandler': true, + 'annotationMouseOverHandler': true, + 'axisLabelColor': true, + 'axisLineColor': true, + 'axisLineWidth': true, + 'clickCallback': true, + 'drawCallback': true, + 'drawHighlightPointCallback': true, + 'drawPoints': true, + 'drawPointCallback': true, + 'drawXGrid': true, + 'drawYGrid': true, + 'fillAlpha': true, + 'gridLineColor': true, + 'gridLineWidth': true, + 'hideOverlayOnMouseOut': true, + 'highlightCallback': true, + 'highlightCircleSize': true, + 'interactionModel': true, + 'isZoomedIgnoreProgrammaticZoom': true, + 'labelsDiv': true, + 'labelsDivStyles': true, + 'labelsDivWidth': true, + 'labelsKMB': true, + 'labelsKMG2': true, + 'labelsSeparateLines': true, + 'labelsShowZeroValues': true, + 'legend': true, + 'panEdgeFraction': true, + 'pixelsPerYLabel': true, + 'pointClickCallback': true, + 'pointSize': true, + 'rangeSelectorPlotFillColor': true, + 'rangeSelectorPlotStrokeColor': true, + 'showLabelsOnHighlight': true, + 'showRoller': true, + 'strokeWidth': true, + 'underlayCallback': true, + 'unhighlightCallback': true, + 'zoomCallback': true +}; + +/** + * This function will scan the option list and determine if they + * require us to recalculate the pixel positions of each point. + * TODO: move this into dygraph-options.js + * @param {!Array.} labels a list of options to check. + * @param {!Object} attrs + * @return {boolean} true if the graph needs new points else false. + * @private + */ +Dygraph.isPixelChangingOptionList = function(labels, attrs) { + // Assume that we do not require new points. + // This will change to true if we actually do need new points. + + // Create a dictionary of series names for faster lookup. + // If there are no labels, then the dictionary stays empty. + var seriesNamesDictionary = { }; + if (labels) { + for (var i = 1; i < labels.length; i++) { + seriesNamesDictionary[labels[i]] = true; + } + } + + // Scan through a flat (i.e. non-nested) object of options. + // Returns true/false depending on whether new points are needed. + var scanFlatOptions = function(options) { + for (var property in options) { + if (options.hasOwnProperty(property) && + !pixelSafeOptions[property]) { + return true; + } + } + return false; + }; + + // Iterate through the list of updated options. + for (var property in attrs) { + if (!attrs.hasOwnProperty(property)) continue; + + // Find out of this field is actually a series specific options list. + if (property == 'highlightSeriesOpts' || + (seriesNamesDictionary[property] && !attrs.series)) { + // This property value is a list of options for this series. + if (scanFlatOptions(attrs[property])) return true; + } else if (property == 'series' || property == 'axes') { + // This is twice-nested options list. + var perSeries = attrs[property]; + for (var series in perSeries) { + if (perSeries.hasOwnProperty(series) && + scanFlatOptions(perSeries[series])) { + return true; + } + } + } else { + // If this was not a series specific option list, check if it's a pixel + // changing property. + if (!pixelSafeOptions[property]) return true; + } + } + + return false; +}; + +Dygraph.Circles = { + DEFAULT : function(g, name, ctx, canvasx, canvasy, color, radius) { + ctx.beginPath(); + ctx.fillStyle = color; + ctx.arc(canvasx, canvasy, radius, 0, 2 * Math.PI, false); + ctx.fill(); + } + // For more shapes, include extras/shapes.js +}; + +/** + * To create a "drag" interaction, you typically register a mousedown event + * handler on the element where the drag begins. In that handler, you register a + * mouseup handler on the window to determine when the mouse is released, + * wherever that release happens. This works well, except when the user releases + * the mouse over an off-domain iframe. In that case, the mouseup event is + * handled by the iframe and never bubbles up to the window handler. + * + * To deal with this issue, we cover iframes with high z-index divs to make sure + * they don't capture mouseup. + * + * Usage: + * element.addEventListener('mousedown', function() { + * var tarper = new Dygraph.IFrameTarp(); + * tarper.cover(); + * var mouseUpHandler = function() { + * ... + * window.removeEventListener(mouseUpHandler); + * tarper.uncover(); + * }; + * window.addEventListener('mouseup', mouseUpHandler); + * }; + * + * @constructor + */ +Dygraph.IFrameTarp = function() { + /** @type {Array.} */ + this.tarps = []; +}; + +/** + * Find all the iframes in the document and cover them with high z-index + * transparent divs. + */ +Dygraph.IFrameTarp.prototype.cover = function() { + var iframes = document.getElementsByTagName("iframe"); + for (var i = 0; i < iframes.length; i++) { + var iframe = iframes[i]; + var pos = Dygraph.findPos(iframe), + x = pos.x, + y = pos.y, + width = iframe.offsetWidth, + height = iframe.offsetHeight; + + var div = document.createElement("div"); + div.style.position = "absolute"; + div.style.left = x + 'px'; + div.style.top = y + 'px'; + div.style.width = width + 'px'; + div.style.height = height + 'px'; + div.style.zIndex = 999; + document.body.appendChild(div); + this.tarps.push(div); + } +}; + +/** + * Remove all the iframe covers. You should call this in a mouseup handler. + */ +Dygraph.IFrameTarp.prototype.uncover = function() { + for (var i = 0; i < this.tarps.length; i++) { + this.tarps[i].parentNode.removeChild(this.tarps[i]); + } + this.tarps = []; +}; + +/** + * Determine whether |data| is delimited by CR, CRLF, LF, LFCR. + * @param {string} data + * @return {?string} the delimiter that was detected (or null on failure). + */ +Dygraph.detectLineDelimiter = function(data) { + for (var i = 0; i < data.length; i++) { + var code = data.charAt(i); + if (code === '\r') { + // Might actually be "\r\n". + if (((i + 1) < data.length) && (data.charAt(i + 1) === '\n')) { + return '\r\n'; + } + return code; + } + if (code === '\n') { + // Might actually be "\n\r". + if (((i + 1) < data.length) && (data.charAt(i + 1) === '\r')) { + return '\n\r'; + } + return code; + } + } + + return null; +}; + +/** + * Is one node contained by another? + * @param {Node} containee The contained node. + * @param {Node} container The container node. + * @return {boolean} Whether containee is inside (or equal to) container. + * @private + */ +Dygraph.isNodeContainedBy = function(containee, container) { + if (container === null || containee === null) { + return false; + } + var containeeNode = /** @type {Node} */ (containee); + while (containeeNode && containeeNode !== container) { + containeeNode = containeeNode.parentNode; + } + return (containeeNode === container); +}; + + +// This masks some numeric issues in older versions of Firefox, +// where 1.0/Math.pow(10,2) != Math.pow(10,-2). +/** @type {function(number,number):number} */ +Dygraph.pow = function(base, exp) { + if (exp < 0) { + return 1.0 / Math.pow(base, -exp); + } + return Math.pow(base, exp); +}; + +var RGBA_RE = /^rgba?\((\d{1,3}),\s*(\d{1,3}),\s*(\d{1,3})(?:,\s*([01](?:\.\d+)?))?\)$/; + +/** + * Helper for Dygraph.toRGB_ which parses strings of the form: + * rgb(123, 45, 67) + * rgba(123, 45, 67, 0.5) + * @return parsed {r,g,b,a?} tuple or null. + */ +function parseRGBA(rgbStr) { + var bits = RGBA_RE.exec(rgbStr); + if (!bits) return null; + var r = parseInt(bits[1], 10), + g = parseInt(bits[2], 10), + b = parseInt(bits[3], 10); + if (bits[4]) { + return {r: r, g: g, b: b, a: parseFloat(bits[4])}; + } else { + return {r: r, g: g, b: b}; + } +} + +/** + * Converts any valid CSS color (hex, rgb(), named color) to an RGB tuple. + * + * @param {!string} colorStr Any valid CSS color string. + * @return {{r:number,g:number,b:number,a:number?}} Parsed RGB tuple. + * @private + */ +Dygraph.toRGB_ = function(colorStr) { + // Strategy: First try to parse colorStr directly. This is fast & avoids DOM + // manipulation. If that fails (e.g. for named colors like 'red'), then + // create a hidden DOM element and parse its computed color. + var rgb = parseRGBA(colorStr); + if (rgb) return rgb; + + var div = document.createElement('div'); + div.style.backgroundColor = colorStr; + div.style.visibility = 'hidden'; + document.body.appendChild(div); + var rgbStr; + if (window.getComputedStyle) { + rgbStr = window.getComputedStyle(div, null).backgroundColor; + } else { + // IE8 + rgbStr = div.currentStyle.backgroundColor; + } + document.body.removeChild(div); + return parseRGBA(rgbStr); +}; + +/** + * Checks whether the browser supports the <canvas> tag. + * @param {HTMLCanvasElement=} opt_canvasElement Pass a canvas element as an + * optimization if you have one. + * @return {boolean} Whether the browser supports canvas. + */ +Dygraph.isCanvasSupported = function(opt_canvasElement) { + var canvas; + try { + canvas = opt_canvasElement || document.createElement("canvas"); + canvas.getContext("2d"); + } + catch (e) { + var ie = navigator.appVersion.match(/MSIE (\d\.\d)/); + var opera = (navigator.userAgent.toLowerCase().indexOf("opera") != -1); + if ((!ie) || (ie[1] < 6) || (opera)) + return false; + return true; + } + return true; +}; + +/** + * Parses the value as a floating point number. This is like the parseFloat() + * built-in, but with a few differences: + * - the empty string is parsed as null, rather than NaN. + * - if the string cannot be parsed at all, an error is logged. + * If the string can't be parsed, this method returns null. + * @param {string} x The string to be parsed + * @param {number=} opt_line_no The line number from which the string comes. + * @param {string=} opt_line The text of the line from which the string comes. + */ +Dygraph.parseFloat_ = function(x, opt_line_no, opt_line) { + var val = parseFloat(x); + if (!isNaN(val)) return val; + + // Try to figure out what happeend. + // If the value is the empty string, parse it as null. + if (/^ *$/.test(x)) return null; + + // If it was actually "NaN", return it as NaN. + if (/^ *nan *$/i.test(x)) return NaN; + + // Looks like a parsing error. + var msg = "Unable to parse '" + x + "' as a number"; + if (opt_line !== undefined && opt_line_no !== undefined) { + msg += " on line " + (1+(opt_line_no||0)) + " ('" + opt_line + "') of CSV."; + } + console.error(msg); + + return null; +}; + +})(); +/** + * @license + * Copyright 2011 Dan Vanderkam (danvdk@gmail.com) + * MIT-licensed (http://opensource.org/licenses/MIT) + */ + +/** + * @fileoverview A wrapper around the Dygraph class which implements the + * interface for a GViz (aka Google Visualization API) visualization. + * It is designed to be a drop-in replacement for Google's AnnotatedTimeline, + * so the documentation at + * http://code.google.com/apis/chart/interactive/docs/gallery/annotatedtimeline.html + * translates over directly. + * + * For a full demo, see: + * - http://dygraphs.com/tests/gviz.html + * - http://dygraphs.com/tests/annotation-gviz.html + */ + +(function() { +/*global Dygraph:false */ +"use strict"; + +/** + * A wrapper around Dygraph that implements the gviz API. + * @param {!HTMLDivElement} container The DOM object the visualization should + * live in. + * @constructor + */ +Dygraph.GVizChart = function(container) { + this.container = container; +}; + +/** + * @param {GVizDataTable} data + * @param {Object.<*>} options + */ +Dygraph.GVizChart.prototype.draw = function(data, options) { + // Clear out any existing dygraph. + // TODO(danvk): would it make more sense to simply redraw using the current + // date_graph object? + this.container.innerHTML = ''; + if (typeof(this.date_graph) != 'undefined') { + this.date_graph.destroy(); + } + + this.date_graph = new Dygraph(this.container, data, options); +}; + +/** + * Google charts compatible setSelection + * Only row selection is supported, all points in the row will be highlighted + * @param {Array.<{row:number}>} selection_array array of the selected cells + * @public + */ +Dygraph.GVizChart.prototype.setSelection = function(selection_array) { + var row = false; + if (selection_array.length) { + row = selection_array[0].row; + } + this.date_graph.setSelection(row); +}; + +/** + * Google charts compatible getSelection implementation + * @return {Array.<{row:number,column:number}>} array of the selected cells + * @public + */ +Dygraph.GVizChart.prototype.getSelection = function() { + var selection = []; + + var row = this.date_graph.getSelection(); + + if (row < 0) return selection; + + var points = this.date_graph.layout_.points; + for (var setIdx = 0; setIdx < points.length; ++setIdx) { + selection.push({row: row, column: setIdx + 1}); + } + + return selection; +}; + +})(); +/** + * @license + * Copyright 2011 Robert Konigsberg (konigsberg@google.com) + * MIT-licensed (http://opensource.org/licenses/MIT) + */ + +/** + * @fileoverview The default interaction model for Dygraphs. This is kept out + * of dygraph.js for better navigability. + * @author Robert Konigsberg (konigsberg@google.com) + */ + +(function() { +/*global Dygraph:false */ +"use strict"; + +/** + * You can drag this many pixels past the edge of the chart and still have it + * be considered a zoom. This makes it easier to zoom to the exact edge of the + * chart, a fairly common operation. + */ +var DRAG_EDGE_MARGIN = 100; + +/** + * A collection of functions to facilitate build custom interaction models. + * @class + */ +Dygraph.Interaction = {}; + +/** + * Checks whether the beginning & ending of an event were close enough that it + * should be considered a click. If it should, dispatch appropriate events. + * Returns true if the event was treated as a click. + * + * @param {Event} event + * @param {Dygraph} g + * @param {Object} context + */ +Dygraph.Interaction.maybeTreatMouseOpAsClick = function(event, g, context) { + context.dragEndX = Dygraph.dragGetX_(event, context); + context.dragEndY = Dygraph.dragGetY_(event, context); + var regionWidth = Math.abs(context.dragEndX - context.dragStartX); + var regionHeight = Math.abs(context.dragEndY - context.dragStartY); + + if (regionWidth < 2 && regionHeight < 2 && + g.lastx_ !== undefined && g.lastx_ != -1) { + Dygraph.Interaction.treatMouseOpAsClick(g, event, context); + } + + context.regionWidth = regionWidth; + context.regionHeight = regionHeight; +}; + +/** + * Called in response to an interaction model operation that + * should start the default panning behavior. + * + * It's used in the default callback for "mousedown" operations. + * Custom interaction model builders can use it to provide the default + * panning behavior. + * + * @param {Event} event the event object which led to the startPan call. + * @param {Dygraph} g The dygraph on which to act. + * @param {Object} context The dragging context object (with + * dragStartX/dragStartY/etc. properties). This function modifies the + * context. + */ +Dygraph.Interaction.startPan = function(event, g, context) { + var i, axis; + context.isPanning = true; + var xRange = g.xAxisRange(); + + if (g.getOptionForAxis("logscale", "x")) { + context.initialLeftmostDate = Dygraph.log10(xRange[0]); + context.dateRange = Dygraph.log10(xRange[1]) - Dygraph.log10(xRange[0]); + } else { + context.initialLeftmostDate = xRange[0]; + context.dateRange = xRange[1] - xRange[0]; + } + context.xUnitsPerPixel = context.dateRange / (g.plotter_.area.w - 1); + + if (g.getNumericOption("panEdgeFraction")) { + var maxXPixelsToDraw = g.width_ * g.getNumericOption("panEdgeFraction"); + var xExtremes = g.xAxisExtremes(); // I REALLY WANT TO CALL THIS xTremes! + + var boundedLeftX = g.toDomXCoord(xExtremes[0]) - maxXPixelsToDraw; + var boundedRightX = g.toDomXCoord(xExtremes[1]) + maxXPixelsToDraw; + + var boundedLeftDate = g.toDataXCoord(boundedLeftX); + var boundedRightDate = g.toDataXCoord(boundedRightX); + context.boundedDates = [boundedLeftDate, boundedRightDate]; + + var boundedValues = []; + var maxYPixelsToDraw = g.height_ * g.getNumericOption("panEdgeFraction"); + + for (i = 0; i < g.axes_.length; i++) { + axis = g.axes_[i]; + var yExtremes = axis.extremeRange; + + var boundedTopY = g.toDomYCoord(yExtremes[0], i) + maxYPixelsToDraw; + var boundedBottomY = g.toDomYCoord(yExtremes[1], i) - maxYPixelsToDraw; + + var boundedTopValue = g.toDataYCoord(boundedTopY, i); + var boundedBottomValue = g.toDataYCoord(boundedBottomY, i); + + boundedValues[i] = [boundedTopValue, boundedBottomValue]; + } + context.boundedValues = boundedValues; + } + + // Record the range of each y-axis at the start of the drag. + // If any axis has a valueRange or valueWindow, then we want a 2D pan. + // We can't store data directly in g.axes_, because it does not belong to us + // and could change out from under us during a pan (say if there's a data + // update). + context.is2DPan = false; + context.axes = []; + for (i = 0; i < g.axes_.length; i++) { + axis = g.axes_[i]; + var axis_data = {}; + var yRange = g.yAxisRange(i); + // TODO(konigsberg): These values should be in |context|. + // In log scale, initialTopValue, dragValueRange and unitsPerPixel are log scale. + var logscale = g.attributes_.getForAxis("logscale", i); + if (logscale) { + axis_data.initialTopValue = Dygraph.log10(yRange[1]); + axis_data.dragValueRange = Dygraph.log10(yRange[1]) - Dygraph.log10(yRange[0]); + } else { + axis_data.initialTopValue = yRange[1]; + axis_data.dragValueRange = yRange[1] - yRange[0]; + } + axis_data.unitsPerPixel = axis_data.dragValueRange / (g.plotter_.area.h - 1); + context.axes.push(axis_data); + + // While calculating axes, set 2dpan. + if (axis.valueWindow || axis.valueRange) context.is2DPan = true; + } +}; + +/** + * Called in response to an interaction model operation that + * responds to an event that pans the view. + * + * It's used in the default callback for "mousemove" operations. + * Custom interaction model builders can use it to provide the default + * panning behavior. + * + * @param {Event} event the event object which led to the movePan call. + * @param {Dygraph} g The dygraph on which to act. + * @param {Object} context The dragging context object (with + * dragStartX/dragStartY/etc. properties). This function modifies the + * context. + */ +Dygraph.Interaction.movePan = function(event, g, context) { + context.dragEndX = Dygraph.dragGetX_(event, context); + context.dragEndY = Dygraph.dragGetY_(event, context); + + var minDate = context.initialLeftmostDate - + (context.dragEndX - context.dragStartX) * context.xUnitsPerPixel; + if (context.boundedDates) { + minDate = Math.max(minDate, context.boundedDates[0]); + } + var maxDate = minDate + context.dateRange; + if (context.boundedDates) { + if (maxDate > context.boundedDates[1]) { + // Adjust minDate, and recompute maxDate. + minDate = minDate - (maxDate - context.boundedDates[1]); + maxDate = minDate + context.dateRange; + } + } + + if (g.getOptionForAxis("logscale", "x")) { + g.dateWindow_ = [ Math.pow(Dygraph.LOG_SCALE, minDate), + Math.pow(Dygraph.LOG_SCALE, maxDate) ]; + } else { + g.dateWindow_ = [minDate, maxDate]; + } + + // y-axis scaling is automatic unless this is a full 2D pan. + if (context.is2DPan) { + + var pixelsDragged = context.dragEndY - context.dragStartY; + + // Adjust each axis appropriately. + for (var i = 0; i < g.axes_.length; i++) { + var axis = g.axes_[i]; + var axis_data = context.axes[i]; + var unitsDragged = pixelsDragged * axis_data.unitsPerPixel; + + var boundedValue = context.boundedValues ? context.boundedValues[i] : null; + + // In log scale, maxValue and minValue are the logs of those values. + var maxValue = axis_data.initialTopValue + unitsDragged; + if (boundedValue) { + maxValue = Math.min(maxValue, boundedValue[1]); + } + var minValue = maxValue - axis_data.dragValueRange; + if (boundedValue) { + if (minValue < boundedValue[0]) { + // Adjust maxValue, and recompute minValue. + maxValue = maxValue - (minValue - boundedValue[0]); + minValue = maxValue - axis_data.dragValueRange; + } + } + if (g.attributes_.getForAxis("logscale", i)) { + axis.valueWindow = [ Math.pow(Dygraph.LOG_SCALE, minValue), + Math.pow(Dygraph.LOG_SCALE, maxValue) ]; + } else { + axis.valueWindow = [ minValue, maxValue ]; + } + } + } + + g.drawGraph_(false); +}; + +/** + * Called in response to an interaction model operation that + * responds to an event that ends panning. + * + * It's used in the default callback for "mouseup" operations. + * Custom interaction model builders can use it to provide the default + * panning behavior. + * + * @param {Event} event the event object which led to the endPan call. + * @param {Dygraph} g The dygraph on which to act. + * @param {Object} context The dragging context object (with + * dragStartX/dragStartY/etc. properties). This function modifies the + * context. + */ +Dygraph.Interaction.endPan = Dygraph.Interaction.maybeTreatMouseOpAsClick; + +/** + * Called in response to an interaction model operation that + * responds to an event that starts zooming. + * + * It's used in the default callback for "mousedown" operations. + * Custom interaction model builders can use it to provide the default + * zooming behavior. + * + * @param {Event} event the event object which led to the startZoom call. + * @param {Dygraph} g The dygraph on which to act. + * @param {Object} context The dragging context object (with + * dragStartX/dragStartY/etc. properties). This function modifies the + * context. + */ +Dygraph.Interaction.startZoom = function(event, g, context) { + context.isZooming = true; + context.zoomMoved = false; +}; + +/** + * Called in response to an interaction model operation that + * responds to an event that defines zoom boundaries. + * + * It's used in the default callback for "mousemove" operations. + * Custom interaction model builders can use it to provide the default + * zooming behavior. + * + * @param {Event} event the event object which led to the moveZoom call. + * @param {Dygraph} g The dygraph on which to act. + * @param {Object} context The dragging context object (with + * dragStartX/dragStartY/etc. properties). This function modifies the + * context. + */ +Dygraph.Interaction.moveZoom = function(event, g, context) { + context.zoomMoved = true; + context.dragEndX = Dygraph.dragGetX_(event, context); + context.dragEndY = Dygraph.dragGetY_(event, context); + + var xDelta = Math.abs(context.dragStartX - context.dragEndX); + var yDelta = Math.abs(context.dragStartY - context.dragEndY); + + // drag direction threshold for y axis is twice as large as x axis + context.dragDirection = (xDelta < yDelta / 2) ? Dygraph.VERTICAL : Dygraph.HORIZONTAL; + + g.drawZoomRect_( + context.dragDirection, + context.dragStartX, + context.dragEndX, + context.dragStartY, + context.dragEndY, + context.prevDragDirection, + context.prevEndX, + context.prevEndY); + + context.prevEndX = context.dragEndX; + context.prevEndY = context.dragEndY; + context.prevDragDirection = context.dragDirection; +}; + +/** + * TODO(danvk): move this logic into dygraph.js + * @param {Dygraph} g + * @param {Event} event + * @param {Object} context + */ +Dygraph.Interaction.treatMouseOpAsClick = function(g, event, context) { + var clickCallback = g.getFunctionOption('clickCallback'); + var pointClickCallback = g.getFunctionOption('pointClickCallback'); + + var selectedPoint = null; + + // Find out if the click occurs on a point. + var closestIdx = -1; + var closestDistance = Number.MAX_VALUE; + + // check if the click was on a particular point. + for (var i = 0; i < g.selPoints_.length; i++) { + var p = g.selPoints_[i]; + var distance = Math.pow(p.canvasx - context.dragEndX, 2) + + Math.pow(p.canvasy - context.dragEndY, 2); + if (!isNaN(distance) && + (closestIdx == -1 || distance < closestDistance)) { + closestDistance = distance; + closestIdx = i; + } + } + + // Allow any click within two pixels of the dot. + var radius = g.getNumericOption('highlightCircleSize') + 2; + if (closestDistance <= radius * radius) { + selectedPoint = g.selPoints_[closestIdx]; + } + + if (selectedPoint) { + var e = { + cancelable: true, + point: selectedPoint, + canvasx: context.dragEndX, + canvasy: context.dragEndY + }; + var defaultPrevented = g.cascadeEvents_('pointClick', e); + if (defaultPrevented) { + // Note: this also prevents click / clickCallback from firing. + return; + } + if (pointClickCallback) { + pointClickCallback.call(g, event, selectedPoint); + } + } + + var e = { + cancelable: true, + xval: g.lastx_, // closest point by x value + pts: g.selPoints_, + canvasx: context.dragEndX, + canvasy: context.dragEndY + }; + if (!g.cascadeEvents_('click', e)) { + if (clickCallback) { + // TODO(danvk): pass along more info about the points, e.g. 'x' + clickCallback.call(g, event, g.lastx_, g.selPoints_); + } + } +}; + +/** + * Called in response to an interaction model operation that + * responds to an event that performs a zoom based on previously defined + * bounds.. + * + * It's used in the default callback for "mouseup" operations. + * Custom interaction model builders can use it to provide the default + * zooming behavior. + * + * @param {Event} event the event object which led to the endZoom call. + * @param {Dygraph} g The dygraph on which to end the zoom. + * @param {Object} context The dragging context object (with + * dragStartX/dragStartY/etc. properties). This function modifies the + * context. + */ +Dygraph.Interaction.endZoom = function(event, g, context) { + g.clearZoomRect_(); + context.isZooming = false; + Dygraph.Interaction.maybeTreatMouseOpAsClick(event, g, context); + + // The zoom rectangle is visibly clipped to the plot area, so its behavior + // should be as well. + // See http://code.google.com/p/dygraphs/issues/detail?id=280 + var plotArea = g.getArea(); + if (context.regionWidth >= 10 && + context.dragDirection == Dygraph.HORIZONTAL) { + var left = Math.min(context.dragStartX, context.dragEndX), + right = Math.max(context.dragStartX, context.dragEndX); + left = Math.max(left, plotArea.x); + right = Math.min(right, plotArea.x + plotArea.w); + if (left < right) { + g.doZoomX_(left, right); + } + context.cancelNextDblclick = true; + } else if (context.regionHeight >= 10 && + context.dragDirection == Dygraph.VERTICAL) { + var top = Math.min(context.dragStartY, context.dragEndY), + bottom = Math.max(context.dragStartY, context.dragEndY); + top = Math.max(top, plotArea.y); + bottom = Math.min(bottom, plotArea.y + plotArea.h); + if (top < bottom) { + g.doZoomY_(top, bottom); + } + context.cancelNextDblclick = true; + } + context.dragStartX = null; + context.dragStartY = null; +}; + +/** + * @private + */ +Dygraph.Interaction.startTouch = function(event, g, context) { + event.preventDefault(); // touch browsers are all nice. + if (event.touches.length > 1) { + // If the user ever puts two fingers down, it's not a double tap. + context.startTimeForDoubleTapMs = null; + } + + var touches = []; + for (var i = 0; i < event.touches.length; i++) { + var t = event.touches[i]; + // we dispense with 'dragGetX_' because all touchBrowsers support pageX + touches.push({ + pageX: t.pageX, + pageY: t.pageY, + dataX: g.toDataXCoord(t.pageX), + dataY: g.toDataYCoord(t.pageY) + // identifier: t.identifier + }); + } + context.initialTouches = touches; + + if (touches.length == 1) { + // This is just a swipe. + context.initialPinchCenter = touches[0]; + context.touchDirections = { x: true, y: true }; + } else if (touches.length >= 2) { + // It's become a pinch! + // In case there are 3+ touches, we ignore all but the "first" two. + + // only screen coordinates can be averaged (data coords could be log scale). + context.initialPinchCenter = { + pageX: 0.5 * (touches[0].pageX + touches[1].pageX), + pageY: 0.5 * (touches[0].pageY + touches[1].pageY), + + // TODO(danvk): remove + dataX: 0.5 * (touches[0].dataX + touches[1].dataX), + dataY: 0.5 * (touches[0].dataY + touches[1].dataY) + }; + + // Make pinches in a 45-degree swath around either axis 1-dimensional zooms. + var initialAngle = 180 / Math.PI * Math.atan2( + context.initialPinchCenter.pageY - touches[0].pageY, + touches[0].pageX - context.initialPinchCenter.pageX); + + // use symmetry to get it into the first quadrant. + initialAngle = Math.abs(initialAngle); + if (initialAngle > 90) initialAngle = 90 - initialAngle; + + context.touchDirections = { + x: (initialAngle < (90 - 45/2)), + y: (initialAngle > 45/2) + }; + } + + // save the full x & y ranges. + context.initialRange = { + x: g.xAxisRange(), + y: g.yAxisRange() + }; +}; + +/** + * @private + */ +Dygraph.Interaction.moveTouch = function(event, g, context) { + // If the tap moves, then it's definitely not part of a double-tap. + context.startTimeForDoubleTapMs = null; + + var i, touches = []; + for (i = 0; i < event.touches.length; i++) { + var t = event.touches[i]; + touches.push({ + pageX: t.pageX, + pageY: t.pageY + }); + } + var initialTouches = context.initialTouches; + + var c_now; + + // old and new centers. + var c_init = context.initialPinchCenter; + if (touches.length == 1) { + c_now = touches[0]; + } else { + c_now = { + pageX: 0.5 * (touches[0].pageX + touches[1].pageX), + pageY: 0.5 * (touches[0].pageY + touches[1].pageY) + }; + } + + // this is the "swipe" component + // we toss it out for now, but could use it in the future. + var swipe = { + pageX: c_now.pageX - c_init.pageX, + pageY: c_now.pageY - c_init.pageY + }; + var dataWidth = context.initialRange.x[1] - context.initialRange.x[0]; + var dataHeight = context.initialRange.y[0] - context.initialRange.y[1]; + swipe.dataX = (swipe.pageX / g.plotter_.area.w) * dataWidth; + swipe.dataY = (swipe.pageY / g.plotter_.area.h) * dataHeight; + var xScale, yScale; + + // The residual bits are usually split into scale & rotate bits, but we split + // them into x-scale and y-scale bits. + if (touches.length == 1) { + xScale = 1.0; + yScale = 1.0; + } else if (touches.length >= 2) { + var initHalfWidth = (initialTouches[1].pageX - c_init.pageX); + xScale = (touches[1].pageX - c_now.pageX) / initHalfWidth; + + var initHalfHeight = (initialTouches[1].pageY - c_init.pageY); + yScale = (touches[1].pageY - c_now.pageY) / initHalfHeight; + } + + // Clip scaling to [1/8, 8] to prevent too much blowup. + xScale = Math.min(8, Math.max(0.125, xScale)); + yScale = Math.min(8, Math.max(0.125, yScale)); + + var didZoom = false; + if (context.touchDirections.x) { + g.dateWindow_ = [ + c_init.dataX - swipe.dataX + (context.initialRange.x[0] - c_init.dataX) / xScale, + c_init.dataX - swipe.dataX + (context.initialRange.x[1] - c_init.dataX) / xScale + ]; + didZoom = true; + } + + if (context.touchDirections.y) { + for (i = 0; i < 1 /*g.axes_.length*/; i++) { + var axis = g.axes_[i]; + var logscale = g.attributes_.getForAxis("logscale", i); + if (logscale) { + // TODO(danvk): implement + } else { + axis.valueWindow = [ + c_init.dataY - swipe.dataY + (context.initialRange.y[0] - c_init.dataY) / yScale, + c_init.dataY - swipe.dataY + (context.initialRange.y[1] - c_init.dataY) / yScale + ]; + didZoom = true; + } + } + } + + g.drawGraph_(false); + + // We only call zoomCallback on zooms, not pans, to mirror desktop behavior. + if (didZoom && touches.length > 1 && g.getFunctionOption('zoomCallback')) { + var viewWindow = g.xAxisRange(); + g.getFunctionOption("zoomCallback").call(g, viewWindow[0], viewWindow[1], g.yAxisRanges()); + } +}; + +/** + * @private + */ +Dygraph.Interaction.endTouch = function(event, g, context) { + if (event.touches.length !== 0) { + // this is effectively a "reset" + Dygraph.Interaction.startTouch(event, g, context); + } else if (event.changedTouches.length == 1) { + // Could be part of a "double tap" + // The heuristic here is that it's a double-tap if the two touchend events + // occur within 500ms and within a 50x50 pixel box. + var now = new Date().getTime(); + var t = event.changedTouches[0]; + if (context.startTimeForDoubleTapMs && + now - context.startTimeForDoubleTapMs < 500 && + context.doubleTapX && Math.abs(context.doubleTapX - t.screenX) < 50 && + context.doubleTapY && Math.abs(context.doubleTapY - t.screenY) < 50) { + g.resetZoom(); + } else { + context.startTimeForDoubleTapMs = now; + context.doubleTapX = t.screenX; + context.doubleTapY = t.screenY; + } + } +}; + +// Determine the distance from x to [left, right]. +var distanceFromInterval = function(x, left, right) { + if (x < left) { + return left - x; + } else if (x > right) { + return x - right; + } else { + return 0; + } +}; + +/** + * Returns the number of pixels by which the event happens from the nearest + * edge of the chart. For events in the interior of the chart, this returns zero. + */ +var distanceFromChart = function(event, g) { + var chartPos = Dygraph.findPos(g.canvas_); + var box = { + left: chartPos.x, + right: chartPos.x + g.canvas_.offsetWidth, + top: chartPos.y, + bottom: chartPos.y + g.canvas_.offsetHeight + }; + + var pt = { + x: Dygraph.pageX(event), + y: Dygraph.pageY(event) + }; + + var dx = distanceFromInterval(pt.x, box.left, box.right), + dy = distanceFromInterval(pt.y, box.top, box.bottom); + return Math.max(dx, dy); +}; + +/** + * Default interation model for dygraphs. You can refer to specific elements of + * this when constructing your own interaction model, e.g.: + * g.updateOptions( { + * interactionModel: { + * mousedown: Dygraph.defaultInteractionModel.mousedown + * } + * } ); + */ +Dygraph.Interaction.defaultModel = { + // Track the beginning of drag events + mousedown: function(event, g, context) { + // Right-click should not initiate a zoom. + if (event.button && event.button == 2) return; + + context.initializeMouseDown(event, g, context); + + if (event.altKey || event.shiftKey) { + Dygraph.startPan(event, g, context); + } else { + Dygraph.startZoom(event, g, context); + } + + // Note: we register mousemove/mouseup on document to allow some leeway for + // events to move outside of the chart. Interaction model events get + // registered on the canvas, which is too small to allow this. + var mousemove = function(event) { + if (context.isZooming) { + // When the mouse moves >200px from the chart edge, cancel the zoom. + var d = distanceFromChart(event, g); + if (d < DRAG_EDGE_MARGIN) { + Dygraph.moveZoom(event, g, context); + } else { + if (context.dragEndX !== null) { + context.dragEndX = null; + context.dragEndY = null; + g.clearZoomRect_(); + } + } + } else if (context.isPanning) { + Dygraph.movePan(event, g, context); + } + }; + var mouseup = function(event) { + if (context.isZooming) { + if (context.dragEndX !== null) { + Dygraph.endZoom(event, g, context); + } else { + Dygraph.Interaction.maybeTreatMouseOpAsClick(event, g, context); + } + } else if (context.isPanning) { + Dygraph.endPan(event, g, context); + } + + Dygraph.removeEvent(document, 'mousemove', mousemove); + Dygraph.removeEvent(document, 'mouseup', mouseup); + context.destroy(); + }; + + g.addAndTrackEvent(document, 'mousemove', mousemove); + g.addAndTrackEvent(document, 'mouseup', mouseup); + }, + willDestroyContextMyself: true, + + touchstart: function(event, g, context) { + Dygraph.Interaction.startTouch(event, g, context); + }, + touchmove: function(event, g, context) { + Dygraph.Interaction.moveTouch(event, g, context); + }, + touchend: function(event, g, context) { + Dygraph.Interaction.endTouch(event, g, context); + }, + + // Disable zooming out if panning. + dblclick: function(event, g, context) { + if (context.cancelNextDblclick) { + context.cancelNextDblclick = false; + return; + } + + // Give plugins a chance to grab this event. + var e = { + canvasx: context.dragEndX, + canvasy: context.dragEndY + }; + if (g.cascadeEvents_('dblclick', e)) { + return; + } + + if (event.altKey || event.shiftKey) { + return; + } + g.resetZoom(); + } +}; + +Dygraph.DEFAULT_ATTRS.interactionModel = Dygraph.Interaction.defaultModel; + +// old ways of accessing these methods/properties +Dygraph.defaultInteractionModel = Dygraph.Interaction.defaultModel; +Dygraph.endZoom = Dygraph.Interaction.endZoom; +Dygraph.moveZoom = Dygraph.Interaction.moveZoom; +Dygraph.startZoom = Dygraph.Interaction.startZoom; +Dygraph.endPan = Dygraph.Interaction.endPan; +Dygraph.movePan = Dygraph.Interaction.movePan; +Dygraph.startPan = Dygraph.Interaction.startPan; + +Dygraph.Interaction.nonInteractiveModel_ = { + mousedown: function(event, g, context) { + context.initializeMouseDown(event, g, context); + }, + mouseup: Dygraph.Interaction.maybeTreatMouseOpAsClick +}; + +// Default interaction model when using the range selector. +Dygraph.Interaction.dragIsPanInteractionModel = { + mousedown: function(event, g, context) { + context.initializeMouseDown(event, g, context); + Dygraph.startPan(event, g, context); + }, + mousemove: function(event, g, context) { + if (context.isPanning) { + Dygraph.movePan(event, g, context); + } + }, + mouseup: function(event, g, context) { + if (context.isPanning) { + Dygraph.endPan(event, g, context); + } + } +}; + +})(); +/** + * @license + * Copyright 2011 Dan Vanderkam (danvdk@gmail.com) + * MIT-licensed (http://opensource.org/licenses/MIT) + */ + +/** + * @fileoverview Description of this file. + * @author danvk@google.com (Dan Vanderkam) + * + * A ticker is a function with the following interface: + * + * function(a, b, pixels, options_view, dygraph, forced_values); + * -> [ { v: tick1_v, label: tick1_label[, label_v: label_v1] }, + * { v: tick2_v, label: tick2_label[, label_v: label_v2] }, + * ... + * ] + * + * The returned value is called a "tick list". + * + * Arguments + * --------- + * + * [a, b] is the range of the axis for which ticks are being generated. For a + * numeric axis, these will simply be numbers. For a date axis, these will be + * millis since epoch (convertable to Date objects using "new Date(a)" and "new + * Date(b)"). + * + * opts provides access to chart- and axis-specific options. It can be used to + * access number/date formatting code/options, check for a log scale, etc. + * + * pixels is the length of the axis in pixels. opts('pixelsPerLabel') is the + * minimum amount of space to be allotted to each label. For instance, if + * pixels=400 and opts('pixelsPerLabel')=40 then the ticker should return + * between zero and ten (400/40) ticks. + * + * dygraph is the Dygraph object for which an axis is being constructed. + * + * forced_values is used for secondary y-axes. The tick positions are typically + * set by the primary y-axis, so the secondary y-axis has no choice in where to + * put these. It simply has to generate labels for these data values. + * + * Tick lists + * ---------- + * Typically a tick will have both a grid/tick line and a label at one end of + * that line (at the bottom for an x-axis, at left or right for the y-axis). + * + * A tick may be missing one of these two components: + * - If "label_v" is specified instead of "v", then there will be no tick or + * gridline, just a label. + * - Similarly, if "label" is not specified, then there will be a gridline + * without a label. + * + * This flexibility is useful in a few situations: + * - For log scales, some of the tick lines may be too close to all have labels. + * - For date scales where years are being displayed, it is desirable to display + * tick marks at the beginnings of years but labels (e.g. "2006") in the + * middle of the years. + */ + +/*jshint sub:true */ +/*global Dygraph:false */ +(function() { +"use strict"; + +/** @typedef {Array.<{v:number, label:string, label_v:(string|undefined)}>} */ +Dygraph.TickList = undefined; // the ' = undefined' keeps jshint happy. + +/** @typedef {function( + * number, + * number, + * number, + * function(string):*, + * Dygraph=, + * Array.= + * ): Dygraph.TickList} + */ +Dygraph.Ticker = undefined; // the ' = undefined' keeps jshint happy. + +/** @type {Dygraph.Ticker} */ +Dygraph.numericLinearTicks = function(a, b, pixels, opts, dygraph, vals) { + var nonLogscaleOpts = function(opt) { + if (opt === 'logscale') return false; + return opts(opt); + }; + return Dygraph.numericTicks(a, b, pixels, nonLogscaleOpts, dygraph, vals); +}; + +/** @type {Dygraph.Ticker} */ +Dygraph.numericTicks = function(a, b, pixels, opts, dygraph, vals) { + var pixels_per_tick = /** @type{number} */(opts('pixelsPerLabel')); + var ticks = []; + var i, j, tickV, nTicks; + if (vals) { + for (i = 0; i < vals.length; i++) { + ticks.push({v: vals[i]}); + } + } else { + // TODO(danvk): factor this log-scale block out into a separate function. + if (opts("logscale")) { + nTicks = Math.floor(pixels / pixels_per_tick); + var minIdx = Dygraph.binarySearch(a, Dygraph.PREFERRED_LOG_TICK_VALUES, 1); + var maxIdx = Dygraph.binarySearch(b, Dygraph.PREFERRED_LOG_TICK_VALUES, -1); + if (minIdx == -1) { + minIdx = 0; + } + if (maxIdx == -1) { + maxIdx = Dygraph.PREFERRED_LOG_TICK_VALUES.length - 1; + } + // Count the number of tick values would appear, if we can get at least + // nTicks / 4 accept them. + var lastDisplayed = null; + if (maxIdx - minIdx >= nTicks / 4) { + for (var idx = maxIdx; idx >= minIdx; idx--) { + var tickValue = Dygraph.PREFERRED_LOG_TICK_VALUES[idx]; + var pixel_coord = Math.log(tickValue / a) / Math.log(b / a) * pixels; + var tick = { v: tickValue }; + if (lastDisplayed === null) { + lastDisplayed = { + tickValue : tickValue, + pixel_coord : pixel_coord + }; + } else { + if (Math.abs(pixel_coord - lastDisplayed.pixel_coord) >= pixels_per_tick) { + lastDisplayed = { + tickValue : tickValue, + pixel_coord : pixel_coord + }; + } else { + tick.label = ""; + } + } + ticks.push(tick); + } + // Since we went in backwards order. + ticks.reverse(); + } + } + + // ticks.length won't be 0 if the log scale function finds values to insert. + if (ticks.length === 0) { + // Basic idea: + // Try labels every 1, 2, 5, 10, 20, 50, 100, etc. + // Calculate the resulting tick spacing (i.e. this.height_ / nTicks). + // The first spacing greater than pixelsPerYLabel is what we use. + // TODO(danvk): version that works on a log scale. + var kmg2 = opts("labelsKMG2"); + var mults, base; + if (kmg2) { + mults = [1, 2, 4, 8, 16, 32, 64, 128, 256]; + base = 16; + } else { + mults = [1, 2, 5, 10, 20, 50, 100]; + base = 10; + } + + // Get the maximum number of permitted ticks based on the + // graph's pixel size and pixels_per_tick setting. + var max_ticks = Math.ceil(pixels / pixels_per_tick); + + // Now calculate the data unit equivalent of this tick spacing. + // Use abs() since graphs may have a reversed Y axis. + var units_per_tick = Math.abs(b - a) / max_ticks; + + // Based on this, get a starting scale which is the largest + // integer power of the chosen base (10 or 16) that still remains + // below the requested pixels_per_tick spacing. + var base_power = Math.floor(Math.log(units_per_tick) / Math.log(base)); + var base_scale = Math.pow(base, base_power); + + // Now try multiples of the starting scale until we find one + // that results in tick marks spaced sufficiently far apart. + // The "mults" array should cover the range 1 .. base^2 to + // adjust for rounding and edge effects. + var scale, low_val, high_val, spacing; + for (j = 0; j < mults.length; j++) { + scale = base_scale * mults[j]; + low_val = Math.floor(a / scale) * scale; + high_val = Math.ceil(b / scale) * scale; + nTicks = Math.abs(high_val - low_val) / scale; + spacing = pixels / nTicks; + if (spacing > pixels_per_tick) break; + } + + // Construct the set of ticks. + // Allow reverse y-axis if it's explicitly requested. + if (low_val > high_val) scale *= -1; + for (i = 0; i <= nTicks; i++) { + tickV = low_val + i * scale; + ticks.push( {v: tickV} ); + } + } + } + + var formatter = /**@type{AxisLabelFormatter}*/(opts('axisLabelFormatter')); + + // Add labels to the ticks. + for (i = 0; i < ticks.length; i++) { + if (ticks[i].label !== undefined) continue; // Use current label. + // TODO(danvk): set granularity to something appropriate here. + ticks[i].label = formatter.call(dygraph, ticks[i].v, 0, opts, dygraph); + } + + return ticks; +}; + + +/** @type {Dygraph.Ticker} */ +Dygraph.dateTicker = function(a, b, pixels, opts, dygraph, vals) { + var chosen = Dygraph.pickDateTickGranularity(a, b, pixels, opts); + + if (chosen >= 0) { + return Dygraph.getDateAxis(a, b, chosen, opts, dygraph); + } else { + // this can happen if self.width_ is zero. + return []; + } +}; + +// Time granularity enumeration +// TODO(danvk): make this an @enum +Dygraph.SECONDLY = 0; +Dygraph.TWO_SECONDLY = 1; +Dygraph.FIVE_SECONDLY = 2; +Dygraph.TEN_SECONDLY = 3; +Dygraph.THIRTY_SECONDLY = 4; +Dygraph.MINUTELY = 5; +Dygraph.TWO_MINUTELY = 6; +Dygraph.FIVE_MINUTELY = 7; +Dygraph.TEN_MINUTELY = 8; +Dygraph.THIRTY_MINUTELY = 9; +Dygraph.HOURLY = 10; +Dygraph.TWO_HOURLY = 11; +Dygraph.SIX_HOURLY = 12; +Dygraph.DAILY = 13; +Dygraph.TWO_DAILY = 14; +Dygraph.WEEKLY = 15; +Dygraph.MONTHLY = 16; +Dygraph.QUARTERLY = 17; +Dygraph.BIANNUAL = 18; +Dygraph.ANNUAL = 19; +Dygraph.DECADAL = 20; +Dygraph.CENTENNIAL = 21; +Dygraph.NUM_GRANULARITIES = 22; + +// Date components enumeration (in the order of the arguments in Date) +// TODO: make this an @enum +Dygraph.DATEFIELD_Y = 0; +Dygraph.DATEFIELD_M = 1; +Dygraph.DATEFIELD_D = 2; +Dygraph.DATEFIELD_HH = 3; +Dygraph.DATEFIELD_MM = 4; +Dygraph.DATEFIELD_SS = 5; +Dygraph.DATEFIELD_MS = 6; +Dygraph.NUM_DATEFIELDS = 7; + + +/** + * The value of datefield will start at an even multiple of "step", i.e. + * if datefield=SS and step=5 then the first tick will be on a multiple of 5s. + * + * For granularities <= HOURLY, ticks are generated every `spacing` ms. + * + * At coarser granularities, ticks are generated by incrementing `datefield` by + * `step`. In this case, the `spacing` value is only used to estimate the + * number of ticks. It should roughly correspond to the spacing between + * adjacent ticks. + * + * @type {Array.<{datefield:number, step:number, spacing:number}>} + */ +Dygraph.TICK_PLACEMENT = []; +Dygraph.TICK_PLACEMENT[Dygraph.SECONDLY] = {datefield: Dygraph.DATEFIELD_SS, step: 1, spacing: 1000 * 1}; +Dygraph.TICK_PLACEMENT[Dygraph.TWO_SECONDLY] = {datefield: Dygraph.DATEFIELD_SS, step: 2, spacing: 1000 * 2}; +Dygraph.TICK_PLACEMENT[Dygraph.FIVE_SECONDLY] = {datefield: Dygraph.DATEFIELD_SS, step: 5, spacing: 1000 * 5}; +Dygraph.TICK_PLACEMENT[Dygraph.TEN_SECONDLY] = {datefield: Dygraph.DATEFIELD_SS, step: 10, spacing: 1000 * 10}; +Dygraph.TICK_PLACEMENT[Dygraph.THIRTY_SECONDLY] = {datefield: Dygraph.DATEFIELD_SS, step: 30, spacing: 1000 * 30}; +Dygraph.TICK_PLACEMENT[Dygraph.MINUTELY] = {datefield: Dygraph.DATEFIELD_MM, step: 1, spacing: 1000 * 60}; +Dygraph.TICK_PLACEMENT[Dygraph.TWO_MINUTELY] = {datefield: Dygraph.DATEFIELD_MM, step: 2, spacing: 1000 * 60 * 2}; +Dygraph.TICK_PLACEMENT[Dygraph.FIVE_MINUTELY] = {datefield: Dygraph.DATEFIELD_MM, step: 5, spacing: 1000 * 60 * 5}; +Dygraph.TICK_PLACEMENT[Dygraph.TEN_MINUTELY] = {datefield: Dygraph.DATEFIELD_MM, step: 10, spacing: 1000 * 60 * 10}; +Dygraph.TICK_PLACEMENT[Dygraph.THIRTY_MINUTELY] = {datefield: Dygraph.DATEFIELD_MM, step: 30, spacing: 1000 * 60 * 30}; +Dygraph.TICK_PLACEMENT[Dygraph.HOURLY] = {datefield: Dygraph.DATEFIELD_HH, step: 1, spacing: 1000 * 3600}; +Dygraph.TICK_PLACEMENT[Dygraph.TWO_HOURLY] = {datefield: Dygraph.DATEFIELD_HH, step: 2, spacing: 1000 * 3600 * 2}; +Dygraph.TICK_PLACEMENT[Dygraph.SIX_HOURLY] = {datefield: Dygraph.DATEFIELD_HH, step: 6, spacing: 1000 * 3600 * 6}; +Dygraph.TICK_PLACEMENT[Dygraph.DAILY] = {datefield: Dygraph.DATEFIELD_D, step: 1, spacing: 1000 * 86400}; +Dygraph.TICK_PLACEMENT[Dygraph.TWO_DAILY] = {datefield: Dygraph.DATEFIELD_D, step: 2, spacing: 1000 * 86400 * 2}; +Dygraph.TICK_PLACEMENT[Dygraph.WEEKLY] = {datefield: Dygraph.DATEFIELD_D, step: 7, spacing: 1000 * 604800}; +Dygraph.TICK_PLACEMENT[Dygraph.MONTHLY] = {datefield: Dygraph.DATEFIELD_M, step: 1, spacing: 1000 * 7200 * 365.2524}; // 1e3 * 60 * 60 * 24 * 365.2524 / 12 +Dygraph.TICK_PLACEMENT[Dygraph.QUARTERLY] = {datefield: Dygraph.DATEFIELD_M, step: 3, spacing: 1000 * 21600 * 365.2524}; // 1e3 * 60 * 60 * 24 * 365.2524 / 4 +Dygraph.TICK_PLACEMENT[Dygraph.BIANNUAL] = {datefield: Dygraph.DATEFIELD_M, step: 6, spacing: 1000 * 43200 * 365.2524}; // 1e3 * 60 * 60 * 24 * 365.2524 / 2 +Dygraph.TICK_PLACEMENT[Dygraph.ANNUAL] = {datefield: Dygraph.DATEFIELD_Y, step: 1, spacing: 1000 * 86400 * 365.2524}; // 1e3 * 60 * 60 * 24 * 365.2524 * 1 +Dygraph.TICK_PLACEMENT[Dygraph.DECADAL] = {datefield: Dygraph.DATEFIELD_Y, step: 10, spacing: 1000 * 864000 * 365.2524}; // 1e3 * 60 * 60 * 24 * 365.2524 * 10 +Dygraph.TICK_PLACEMENT[Dygraph.CENTENNIAL] = {datefield: Dygraph.DATEFIELD_Y, step: 100, spacing: 1000 * 8640000 * 365.2524}; // 1e3 * 60 * 60 * 24 * 365.2524 * 100 + + +/** + * This is a list of human-friendly values at which to show tick marks on a log + * scale. It is k * 10^n, where k=1..9 and n=-39..+39, so: + * ..., 1, 2, 3, 4, 5, ..., 9, 10, 20, 30, ..., 90, 100, 200, 300, ... + * NOTE: this assumes that Dygraph.LOG_SCALE = 10. + * @type {Array.} + */ +Dygraph.PREFERRED_LOG_TICK_VALUES = (function() { + var vals = []; + for (var power = -39; power <= 39; power++) { + var range = Math.pow(10, power); + for (var mult = 1; mult <= 9; mult++) { + var val = range * mult; + vals.push(val); + } + } + return vals; +})(); + +/** + * Determine the correct granularity of ticks on a date axis. + * + * @param {number} a Left edge of the chart (ms) + * @param {number} b Right edge of the chart (ms) + * @param {number} pixels Size of the chart in the relevant dimension (width). + * @param {function(string):*} opts Function mapping from option name -> value. + * @return {number} The appropriate axis granularity for this chart. See the + * enumeration of possible values in dygraph-tickers.js. + */ +Dygraph.pickDateTickGranularity = function(a, b, pixels, opts) { + var pixels_per_tick = /** @type{number} */(opts('pixelsPerLabel')); + for (var i = 0; i < Dygraph.NUM_GRANULARITIES; i++) { + var num_ticks = Dygraph.numDateTicks(a, b, i); + if (pixels / num_ticks >= pixels_per_tick) { + return i; + } + } + return -1; +}; + +/** + * Compute the number of ticks on a date axis for a given granularity. + * @param {number} start_time + * @param {number} end_time + * @param {number} granularity (one of the granularities enumerated above) + * @return {number} (Approximate) number of ticks that would result. + */ +Dygraph.numDateTicks = function(start_time, end_time, granularity) { + var spacing = Dygraph.TICK_PLACEMENT[granularity].spacing; + return Math.round(1.0 * (end_time - start_time) / spacing); +}; + +/** + * Compute the positions and labels of ticks on a date axis for a given granularity. + * @param {number} start_time + * @param {number} end_time + * @param {number} granularity (one of the granularities enumerated above) + * @param {function(string):*} opts Function mapping from option name -> value. + * @param {Dygraph=} dg + * @return {!Dygraph.TickList} + */ +Dygraph.getDateAxis = function(start_time, end_time, granularity, opts, dg) { + var formatter = /** @type{AxisLabelFormatter} */( + opts("axisLabelFormatter")); + var utc = opts("labelsUTC"); + var accessors = utc ? Dygraph.DateAccessorsUTC : Dygraph.DateAccessorsLocal; + + var datefield = Dygraph.TICK_PLACEMENT[granularity].datefield; + var step = Dygraph.TICK_PLACEMENT[granularity].step; + var spacing = Dygraph.TICK_PLACEMENT[granularity].spacing; + + // Choose a nice tick position before the initial instant. + // Currently, this code deals properly with the existent daily granularities: + // DAILY (with step of 1) and WEEKLY (with step of 7 but specially handled). + // Other daily granularities (say TWO_DAILY) should also be handled specially + // by setting the start_date_offset to 0. + var start_date = new Date(start_time); + var date_array = []; + date_array[Dygraph.DATEFIELD_Y] = accessors.getFullYear(start_date); + date_array[Dygraph.DATEFIELD_M] = accessors.getMonth(start_date); + date_array[Dygraph.DATEFIELD_D] = accessors.getDate(start_date); + date_array[Dygraph.DATEFIELD_HH] = accessors.getHours(start_date); + date_array[Dygraph.DATEFIELD_MM] = accessors.getMinutes(start_date); + date_array[Dygraph.DATEFIELD_SS] = accessors.getSeconds(start_date); + date_array[Dygraph.DATEFIELD_MS] = accessors.getMilliseconds(start_date); + + var start_date_offset = date_array[datefield] % step; + if (granularity == Dygraph.WEEKLY) { + // This will put the ticks on Sundays. + start_date_offset = accessors.getDay(start_date); + } + + date_array[datefield] -= start_date_offset; + for (var df = datefield + 1; df < Dygraph.NUM_DATEFIELDS; df++) { + // The minimum value is 1 for the day of month, and 0 for all other fields. + date_array[df] = (df === Dygraph.DATEFIELD_D) ? 1 : 0; + } + + // Generate the ticks. + // For granularities not coarser than HOURLY we use the fact that: + // the number of milliseconds between ticks is constant + // and equal to the defined spacing. + // Otherwise we rely on the 'roll over' property of the Date functions: + // when some date field is set to a value outside of its logical range, + // the excess 'rolls over' the next (more significant) field. + // However, when using local time with DST transitions, + // there are dates that do not represent any time value at all + // (those in the hour skipped at the 'spring forward'), + // and the JavaScript engines usually return an equivalent value. + // Hence we have to check that the date is properly increased at each step, + // returning a date at a nice tick position. + var ticks = []; + var tick_date = accessors.makeDate.apply(null, date_array); + var tick_time = tick_date.getTime(); + if (granularity <= Dygraph.HOURLY) { + if (tick_time < start_time) { + tick_time += spacing; + tick_date = new Date(tick_time); + } + while (tick_time <= end_time) { + ticks.push({ v: tick_time, + label: formatter.call(dg, tick_date, granularity, opts, dg) + }); + tick_time += spacing; + tick_date = new Date(tick_time); + } + } else { + if (tick_time < start_time) { + date_array[datefield] += step; + tick_date = accessors.makeDate.apply(null, date_array); + tick_time = tick_date.getTime(); + } + while (tick_time <= end_time) { + if (granularity >= Dygraph.DAILY || + accessors.getHours(tick_date) % step === 0) { + ticks.push({ v: tick_time, + label: formatter.call(dg, tick_date, granularity, opts, dg) + }); + } + date_array[datefield] += step; + tick_date = accessors.makeDate.apply(null, date_array); + tick_time = tick_date.getTime(); + } + } + return ticks; +}; + +// These are set here so that this file can be included after dygraph.js +// or independently. +if (Dygraph && + Dygraph.DEFAULT_ATTRS && + Dygraph.DEFAULT_ATTRS['axes'] && + Dygraph.DEFAULT_ATTRS['axes']['x'] && + Dygraph.DEFAULT_ATTRS['axes']['y'] && + Dygraph.DEFAULT_ATTRS['axes']['y2']) { + Dygraph.DEFAULT_ATTRS['axes']['x']['ticker'] = Dygraph.dateTicker; + Dygraph.DEFAULT_ATTRS['axes']['y']['ticker'] = Dygraph.numericTicks; + Dygraph.DEFAULT_ATTRS['axes']['y2']['ticker'] = Dygraph.numericTicks; +} + +})(); +/*global Dygraph:false */ + +// Namespace for plugins. Load this before plugins/*.js files. +Dygraph.Plugins = {}; +/** + * @license + * Copyright 2012 Dan Vanderkam (danvdk@gmail.com) + * MIT-licensed (http://opensource.org/licenses/MIT) + */ + +/*global Dygraph:false */ + +Dygraph.Plugins.Annotations = (function() { + +"use strict"; + +/** +Current bits of jankiness: +- Uses dygraph.layout_ to get the parsed annotations. +- Uses dygraph.plotter_.area + +It would be nice if the plugin didn't require so much special support inside +the core dygraphs classes, but annotations involve quite a bit of parsing and +layout. + +TODO(danvk): cache DOM elements. + +*/ + +var annotations = function() { + this.annotations_ = []; +}; + +annotations.prototype.toString = function() { + return "Annotations Plugin"; +}; + +annotations.prototype.activate = function(g) { + return { + clearChart: this.clearChart, + didDrawChart: this.didDrawChart + }; +}; + +annotations.prototype.detachLabels = function() { + for (var i = 0; i < this.annotations_.length; i++) { + var a = this.annotations_[i]; + if (a.parentNode) a.parentNode.removeChild(a); + this.annotations_[i] = null; + } + this.annotations_ = []; +}; + +annotations.prototype.clearChart = function(e) { + this.detachLabels(); +}; + +annotations.prototype.didDrawChart = function(e) { + var g = e.dygraph; + + // Early out in the (common) case of zero annotations. + var points = g.layout_.annotated_points; + if (!points || points.length === 0) return; + + var containerDiv = e.canvas.parentNode; + var annotationStyle = { + "position": "absolute", + "fontSize": g.getOption('axisLabelFontSize') + "px", + "zIndex": 10, + "overflow": "hidden" + }; + + var bindEvt = function(eventName, classEventName, pt) { + return function(annotation_event) { + var a = pt.annotation; + if (a.hasOwnProperty(eventName)) { + a[eventName](a, pt, g, annotation_event); + } else if (g.getOption(classEventName)) { + g.getOption(classEventName)(a, pt, g, annotation_event ); + } + }; + }; + + // Add the annotations one-by-one. + var area = e.dygraph.plotter_.area; + + // x-coord to sum of previous annotation's heights (used for stacking). + var xToUsedHeight = {}; + + for (var i = 0; i < points.length; i++) { + var p = points[i]; + if (p.canvasx < area.x || p.canvasx > area.x + area.w || + p.canvasy < area.y || p.canvasy > area.y + area.h) { + continue; + } + + var a = p.annotation; + var tick_height = 6; + if (a.hasOwnProperty("tickHeight")) { + tick_height = a.tickHeight; + } + + var div = document.createElement("div"); + for (var name in annotationStyle) { + if (annotationStyle.hasOwnProperty(name)) { + div.style[name] = annotationStyle[name]; + } + } + if (!a.hasOwnProperty('icon')) { + div.className = "dygraphDefaultAnnotation"; + } + if (a.hasOwnProperty('cssClass')) { + div.className += " " + a.cssClass; + } + + var width = a.hasOwnProperty('width') ? a.width : 16; + var height = a.hasOwnProperty('height') ? a.height : 16; + if (a.hasOwnProperty('icon')) { + var img = document.createElement("img"); + img.src = a.icon; + img.width = width; + img.height = height; + div.appendChild(img); + } else if (p.annotation.hasOwnProperty('shortText')) { + div.appendChild(document.createTextNode(p.annotation.shortText)); + } + var left = p.canvasx - width / 2; + div.style.left = left + "px"; + var divTop = 0; + if (a.attachAtBottom) { + var y = (area.y + area.h - height - tick_height); + if (xToUsedHeight[left]) { + y -= xToUsedHeight[left]; + } else { + xToUsedHeight[left] = 0; + } + xToUsedHeight[left] += (tick_height + height); + divTop = y; + } else { + divTop = p.canvasy - height - tick_height; + } + div.style.top = divTop + "px"; + div.style.width = width + "px"; + div.style.height = height + "px"; + div.title = p.annotation.text; + div.style.color = g.colorsMap_[p.name]; + div.style.borderColor = g.colorsMap_[p.name]; + a.div = div; + + g.addAndTrackEvent(div, 'click', + bindEvt('clickHandler', 'annotationClickHandler', p, this)); + g.addAndTrackEvent(div, 'mouseover', + bindEvt('mouseOverHandler', 'annotationMouseOverHandler', p, this)); + g.addAndTrackEvent(div, 'mouseout', + bindEvt('mouseOutHandler', 'annotationMouseOutHandler', p, this)); + g.addAndTrackEvent(div, 'dblclick', + bindEvt('dblClickHandler', 'annotationDblClickHandler', p, this)); + + containerDiv.appendChild(div); + this.annotations_.push(div); + + var ctx = e.drawingContext; + ctx.save(); + ctx.strokeStyle = g.colorsMap_[p.name]; + ctx.beginPath(); + if (!a.attachAtBottom) { + ctx.moveTo(p.canvasx, p.canvasy); + ctx.lineTo(p.canvasx, p.canvasy - 2 - tick_height); + } else { + var y = divTop + height; + ctx.moveTo(p.canvasx, y); + ctx.lineTo(p.canvasx, y + tick_height); + } + ctx.closePath(); + ctx.stroke(); + ctx.restore(); + } +}; + +annotations.prototype.destroy = function() { + this.detachLabels(); +}; + +return annotations; + +})(); +/** + * @license + * Copyright 2012 Dan Vanderkam (danvdk@gmail.com) + * MIT-licensed (http://opensource.org/licenses/MIT) + */ + +/*global Dygraph:false */ + +Dygraph.Plugins.Axes = (function() { + +'use strict'; + +/* +Bits of jankiness: +- Direct layout access +- Direct area access +- Should include calculation of ticks, not just the drawing. + +Options left to make axis-friendly. + ('drawAxesAtZero') + ('xAxisHeight') +*/ + +/** + * Draws the axes. This includes the labels on the x- and y-axes, as well + * as the tick marks on the axes. + * It does _not_ draw the grid lines which span the entire chart. + */ +var axes = function() { + this.xlabels_ = []; + this.ylabels_ = []; +}; + +axes.prototype.toString = function() { + return 'Axes Plugin'; +}; + +axes.prototype.activate = function(g) { + return { + layout: this.layout, + clearChart: this.clearChart, + willDrawChart: this.willDrawChart + }; +}; + +axes.prototype.layout = function(e) { + var g = e.dygraph; + + if (g.getOptionForAxis('drawAxis', 'y')) { + var w = g.getOptionForAxis('axisLabelWidth', 'y') + 2 * g.getOptionForAxis('axisTickSize', 'y'); + e.reserveSpaceLeft(w); + } + + if (g.getOptionForAxis('drawAxis', 'x')) { + var h; + // NOTE: I think this is probably broken now, since g.getOption() now + // hits the dictionary. (That is, g.getOption('xAxisHeight') now always + // has a value.) + if (g.getOption('xAxisHeight')) { + h = g.getOption('xAxisHeight'); + } else { + h = g.getOptionForAxis('axisLabelFontSize', 'x') + 2 * g.getOptionForAxis('axisTickSize', 'x'); + } + e.reserveSpaceBottom(h); + } + + if (g.numAxes() == 2) { + if (g.getOptionForAxis('drawAxis', 'y2')) { + var w = g.getOptionForAxis('axisLabelWidth', 'y2') + 2 * g.getOptionForAxis('axisTickSize', 'y2'); + e.reserveSpaceRight(w); + } + } else if (g.numAxes() > 2) { + g.error('Only two y-axes are supported at this time. (Trying ' + + 'to use ' + g.numAxes() + ')'); + } +}; + +axes.prototype.detachLabels = function() { + function removeArray(ary) { + for (var i = 0; i < ary.length; i++) { + var el = ary[i]; + if (el.parentNode) el.parentNode.removeChild(el); + } + } + + removeArray(this.xlabels_); + removeArray(this.ylabels_); + this.xlabels_ = []; + this.ylabels_ = []; +}; + +axes.prototype.clearChart = function(e) { + this.detachLabels(); +}; + +axes.prototype.willDrawChart = function(e) { + var g = e.dygraph; + + if (!g.getOptionForAxis('drawAxis', 'x') && + !g.getOptionForAxis('drawAxis', 'y') && + !g.getOptionForAxis('drawAxis', 'y2')) { + return; + } + + // Round pixels to half-integer boundaries for crisper drawing. + function halfUp(x) { return Math.round(x) + 0.5; } + function halfDown(y){ return Math.round(y) - 0.5; } + + var context = e.drawingContext; + var containerDiv = e.canvas.parentNode; + var canvasWidth = g.width_; // e.canvas.width is affected by pixel ratio. + var canvasHeight = g.height_; + + var label, x, y, tick, i; + + var makeLabelStyle = function(axis) { + return { + position: 'absolute', + fontSize: g.getOptionForAxis('axisLabelFontSize', axis) + 'px', + zIndex: 10, + color: g.getOptionForAxis('axisLabelColor', axis), + width: g.getOptionForAxis('axisLabelWidth', axis) + 'px', + // height: g.getOptionForAxis('axisLabelFontSize', 'x') + 2 + "px", + lineHeight: 'normal', // Something other than "normal" line-height screws up label positioning. + overflow: 'hidden' + }; + }; + + var labelStyles = { + x : makeLabelStyle('x'), + y : makeLabelStyle('y'), + y2 : makeLabelStyle('y2') + }; + + var makeDiv = function(txt, axis, prec_axis) { + /* + * This seems to be called with the following three sets of axis/prec_axis: + * x: undefined + * y: y1 + * y: y2 + */ + var div = document.createElement('div'); + var labelStyle = labelStyles[prec_axis == 'y2' ? 'y2' : axis]; + for (var name in labelStyle) { + if (labelStyle.hasOwnProperty(name)) { + div.style[name] = labelStyle[name]; + } + } + var inner_div = document.createElement('div'); + inner_div.className = 'dygraph-axis-label' + + ' dygraph-axis-label-' + axis + + (prec_axis ? ' dygraph-axis-label-' + prec_axis : ''); + inner_div.innerHTML = txt; + div.appendChild(inner_div); + return div; + }; + + // axis lines + context.save(); + + var layout = g.layout_; + var area = e.dygraph.plotter_.area; + + // Helper for repeated axis-option accesses. + var makeOptionGetter = function(axis) { + return function(option) { + return g.getOptionForAxis(option, axis); + }; + }; + + if (g.getOptionForAxis('drawAxis', 'y')) { + if (layout.yticks && layout.yticks.length > 0) { + var num_axes = g.numAxes(); + var getOptions = [makeOptionGetter('y'), makeOptionGetter('y2')]; + for (i = 0; i < layout.yticks.length; i++) { + tick = layout.yticks[i]; + if (typeof(tick) == 'function') return; // <-- when would this happen? + x = area.x; + var sgn = 1; + var prec_axis = 'y1'; + var getAxisOption = getOptions[0]; + if (tick[0] == 1) { // right-side y-axis + x = area.x + area.w; + sgn = -1; + prec_axis = 'y2'; + getAxisOption = getOptions[1]; + } + var fontSize = getAxisOption('axisLabelFontSize'); + y = area.y + tick[1] * area.h; + + /* Tick marks are currently clipped, so don't bother drawing them. + context.beginPath(); + context.moveTo(halfUp(x), halfDown(y)); + context.lineTo(halfUp(x - sgn * this.attr_('axisTickSize')), halfDown(y)); + context.closePath(); + context.stroke(); + */ + + label = makeDiv(tick[2], 'y', num_axes == 2 ? prec_axis : null); + var top = (y - fontSize / 2); + if (top < 0) top = 0; + + if (top + fontSize + 3 > canvasHeight) { + label.style.bottom = '0'; + } else { + label.style.top = top + 'px'; + } + if (tick[0] === 0) { + label.style.left = (area.x - getAxisOption('axisLabelWidth') - getAxisOption('axisTickSize')) + 'px'; + label.style.textAlign = 'right'; + } else if (tick[0] == 1) { + label.style.left = (area.x + area.w + + getAxisOption('axisTickSize')) + 'px'; + label.style.textAlign = 'left'; + } + label.style.width = getAxisOption('axisLabelWidth') + 'px'; + containerDiv.appendChild(label); + this.ylabels_.push(label); + } + + // The lowest tick on the y-axis often overlaps with the leftmost + // tick on the x-axis. Shift the bottom tick up a little bit to + // compensate if necessary. + var bottomTick = this.ylabels_[0]; + // Interested in the y2 axis also? + var fontSize = g.getOptionForAxis('axisLabelFontSize', 'y'); + var bottom = parseInt(bottomTick.style.top, 10) + fontSize; + if (bottom > canvasHeight - fontSize) { + bottomTick.style.top = (parseInt(bottomTick.style.top, 10) - + fontSize / 2) + 'px'; + } + } + + // draw a vertical line on the left to separate the chart from the labels. + var axisX; + if (g.getOption('drawAxesAtZero')) { + var r = g.toPercentXCoord(0); + if (r > 1 || r < 0 || isNaN(r)) r = 0; + axisX = halfUp(area.x + r * area.w); + } else { + axisX = halfUp(area.x); + } + + context.strokeStyle = g.getOptionForAxis('axisLineColor', 'y'); + context.lineWidth = g.getOptionForAxis('axisLineWidth', 'y'); + + context.beginPath(); + context.moveTo(axisX, halfDown(area.y)); + context.lineTo(axisX, halfDown(area.y + area.h)); + context.closePath(); + context.stroke(); + + // if there's a secondary y-axis, draw a vertical line for that, too. + if (g.numAxes() == 2) { + context.strokeStyle = g.getOptionForAxis('axisLineColor', 'y2'); + context.lineWidth = g.getOptionForAxis('axisLineWidth', 'y2'); + context.beginPath(); + context.moveTo(halfDown(area.x + area.w), halfDown(area.y)); + context.lineTo(halfDown(area.x + area.w), halfDown(area.y + area.h)); + context.closePath(); + context.stroke(); + } + } + + if (g.getOptionForAxis('drawAxis', 'x')) { + if (layout.xticks) { + var getAxisOption = makeOptionGetter('x'); + for (i = 0; i < layout.xticks.length; i++) { + tick = layout.xticks[i]; + x = area.x + tick[0] * area.w; + y = area.y + area.h; + + /* Tick marks are currently clipped, so don't bother drawing them. + context.beginPath(); + context.moveTo(halfUp(x), halfDown(y)); + context.lineTo(halfUp(x), halfDown(y + this.attr_('axisTickSize'))); + context.closePath(); + context.stroke(); + */ + + label = makeDiv(tick[1], 'x'); + label.style.textAlign = 'center'; + label.style.top = (y + getAxisOption('axisTickSize')) + 'px'; + + var left = (x - getAxisOption('axisLabelWidth')/2); + if (left + getAxisOption('axisLabelWidth') > canvasWidth) { + left = canvasWidth - getAxisOption('axisLabelWidth'); + label.style.textAlign = 'right'; + } + if (left < 0) { + left = 0; + label.style.textAlign = 'left'; + } + + label.style.left = left + 'px'; + label.style.width = getAxisOption('axisLabelWidth') + 'px'; + containerDiv.appendChild(label); + this.xlabels_.push(label); + } + } + + context.strokeStyle = g.getOptionForAxis('axisLineColor', 'x'); + context.lineWidth = g.getOptionForAxis('axisLineWidth', 'x'); + context.beginPath(); + var axisY; + if (g.getOption('drawAxesAtZero')) { + var r = g.toPercentYCoord(0, 0); + if (r > 1 || r < 0) r = 1; + axisY = halfDown(area.y + r * area.h); + } else { + axisY = halfDown(area.y + area.h); + } + context.moveTo(halfUp(area.x), axisY); + context.lineTo(halfUp(area.x + area.w), axisY); + context.closePath(); + context.stroke(); + } + + context.restore(); +}; + +return axes; +})(); +/** + * @license + * Copyright 2012 Dan Vanderkam (danvdk@gmail.com) + * MIT-licensed (http://opensource.org/licenses/MIT) + */ +/*global Dygraph:false */ + +Dygraph.Plugins.ChartLabels = (function() { + +"use strict"; + +// TODO(danvk): move chart label options out of dygraphs and into the plugin. +// TODO(danvk): only tear down & rebuild the DIVs when it's necessary. + +var chart_labels = function() { + this.title_div_ = null; + this.xlabel_div_ = null; + this.ylabel_div_ = null; + this.y2label_div_ = null; +}; + +chart_labels.prototype.toString = function() { + return "ChartLabels Plugin"; +}; + +chart_labels.prototype.activate = function(g) { + return { + layout: this.layout, + // clearChart: this.clearChart, + didDrawChart: this.didDrawChart + }; +}; + +// QUESTION: should there be a plugin-utils.js? +var createDivInRect = function(r) { + var div = document.createElement('div'); + div.style.position = 'absolute'; + div.style.left = r.x + 'px'; + div.style.top = r.y + 'px'; + div.style.width = r.w + 'px'; + div.style.height = r.h + 'px'; + return div; +}; + +// Detach and null out any existing nodes. +chart_labels.prototype.detachLabels_ = function() { + var els = [ this.title_div_, + this.xlabel_div_, + this.ylabel_div_, + this.y2label_div_ ]; + for (var i = 0; i < els.length; i++) { + var el = els[i]; + if (!el) continue; + if (el.parentNode) el.parentNode.removeChild(el); + } + + this.title_div_ = null; + this.xlabel_div_ = null; + this.ylabel_div_ = null; + this.y2label_div_ = null; +}; + +var createRotatedDiv = function(g, box, axis, classes, html) { + // TODO(danvk): is this outer div actually necessary? + var div = document.createElement("div"); + div.style.position = 'absolute'; + if (axis == 1) { + // NOTE: this is cheating. Should be positioned relative to the box. + div.style.left = '0px'; + } else { + div.style.left = box.x + 'px'; + } + div.style.top = box.y + 'px'; + div.style.width = box.w + 'px'; + div.style.height = box.h + 'px'; + div.style.fontSize = (g.getOption('yLabelWidth') - 2) + 'px'; + + var inner_div = document.createElement("div"); + inner_div.style.position = 'absolute'; + inner_div.style.width = box.h + 'px'; + inner_div.style.height = box.w + 'px'; + inner_div.style.top = (box.h / 2 - box.w / 2) + 'px'; + inner_div.style.left = (box.w / 2 - box.h / 2) + 'px'; + inner_div.style.textAlign = 'center'; + + // CSS rotation is an HTML5 feature which is not standardized. Hence every + // browser has its own name for the CSS style. + var val = 'rotate(' + (axis == 1 ? '-' : '') + '90deg)'; + inner_div.style.transform = val; // HTML5 + inner_div.style.WebkitTransform = val; // Safari/Chrome + inner_div.style.MozTransform = val; // Firefox + inner_div.style.OTransform = val; // Opera + inner_div.style.msTransform = val; // IE9 + + if (typeof(document.documentMode) !== 'undefined' && + document.documentMode < 9) { + // We're dealing w/ an old version of IE, so we have to rotate the text + // using a BasicImage transform. This uses a different origin of rotation + // than HTML5 rotation (top left of div vs. its center). + inner_div.style.filter = + 'progid:DXImageTransform.Microsoft.BasicImage(rotation=' + + (axis == 1 ? '3' : '1') + ')'; + inner_div.style.left = '0px'; + inner_div.style.top = '0px'; + } + + var class_div = document.createElement("div"); + class_div.className = classes; + class_div.innerHTML = html; + + inner_div.appendChild(class_div); + div.appendChild(inner_div); + return div; +}; + +chart_labels.prototype.layout = function(e) { + this.detachLabels_(); + + var g = e.dygraph; + var div = e.chart_div; + if (g.getOption('title')) { + // QUESTION: should this return an absolutely-positioned div instead? + var title_rect = e.reserveSpaceTop(g.getOption('titleHeight')); + this.title_div_ = createDivInRect(title_rect); + this.title_div_.style.textAlign = 'center'; + this.title_div_.style.fontSize = (g.getOption('titleHeight') - 8) + 'px'; + this.title_div_.style.fontWeight = 'bold'; + this.title_div_.style.zIndex = 10; + + var class_div = document.createElement("div"); + class_div.className = 'dygraph-label dygraph-title'; + class_div.innerHTML = g.getOption('title'); + this.title_div_.appendChild(class_div); + div.appendChild(this.title_div_); + } + + if (g.getOption('xlabel')) { + var x_rect = e.reserveSpaceBottom(g.getOption('xLabelHeight')); + this.xlabel_div_ = createDivInRect(x_rect); + this.xlabel_div_.style.textAlign = 'center'; + this.xlabel_div_.style.fontSize = (g.getOption('xLabelHeight') - 2) + 'px'; + + var class_div = document.createElement("div"); + class_div.className = 'dygraph-label dygraph-xlabel'; + class_div.innerHTML = g.getOption('xlabel'); + this.xlabel_div_.appendChild(class_div); + div.appendChild(this.xlabel_div_); + } + + if (g.getOption('ylabel')) { + // It would make sense to shift the chart here to make room for the y-axis + // label, but the default yAxisLabelWidth is large enough that this results + // in overly-padded charts. The y-axis label should fit fine. If it + // doesn't, the yAxisLabelWidth option can be increased. + var y_rect = e.reserveSpaceLeft(0); + + this.ylabel_div_ = createRotatedDiv( + g, y_rect, + 1, // primary (left) y-axis + 'dygraph-label dygraph-ylabel', + g.getOption('ylabel')); + div.appendChild(this.ylabel_div_); + } + + if (g.getOption('y2label') && g.numAxes() == 2) { + // same logic applies here as for ylabel. + var y2_rect = e.reserveSpaceRight(0); + this.y2label_div_ = createRotatedDiv( + g, y2_rect, + 2, // secondary (right) y-axis + 'dygraph-label dygraph-y2label', + g.getOption('y2label')); + div.appendChild(this.y2label_div_); + } +}; + +chart_labels.prototype.didDrawChart = function(e) { + var g = e.dygraph; + if (this.title_div_) { + this.title_div_.children[0].innerHTML = g.getOption('title'); + } + if (this.xlabel_div_) { + this.xlabel_div_.children[0].innerHTML = g.getOption('xlabel'); + } + if (this.ylabel_div_) { + this.ylabel_div_.children[0].children[0].innerHTML = g.getOption('ylabel'); + } + if (this.y2label_div_) { + this.y2label_div_.children[0].children[0].innerHTML = g.getOption('y2label'); + } +}; + +chart_labels.prototype.clearChart = function() { +}; + +chart_labels.prototype.destroy = function() { + this.detachLabels_(); +}; + + +return chart_labels; +})(); +/** + * @license + * Copyright 2012 Dan Vanderkam (danvdk@gmail.com) + * MIT-licensed (http://opensource.org/licenses/MIT) + */ +/*global Dygraph:false */ + +Dygraph.Plugins.Grid = (function() { + +/* + +Current bits of jankiness: +- Direct layout access +- Direct area access + +*/ + +"use strict"; + + +/** + * Draws the gridlines, i.e. the gray horizontal & vertical lines running the + * length of the chart. + * + * @constructor + */ +var grid = function() { +}; + +grid.prototype.toString = function() { + return "Gridline Plugin"; +}; + +grid.prototype.activate = function(g) { + return { + willDrawChart: this.willDrawChart + }; +}; + +grid.prototype.willDrawChart = function(e) { + // Draw the new X/Y grid. Lines appear crisper when pixels are rounded to + // half-integers. This prevents them from drawing in two rows/cols. + var g = e.dygraph; + var ctx = e.drawingContext; + var layout = g.layout_; + var area = e.dygraph.plotter_.area; + + function halfUp(x) { return Math.round(x) + 0.5; } + function halfDown(y){ return Math.round(y) - 0.5; } + + var x, y, i, ticks; + if (g.getOptionForAxis('drawGrid', 'y')) { + var axes = ["y", "y2"]; + var strokeStyles = [], lineWidths = [], drawGrid = [], stroking = [], strokePattern = []; + for (var i = 0; i < axes.length; i++) { + drawGrid[i] = g.getOptionForAxis('drawGrid', axes[i]); + if (drawGrid[i]) { + strokeStyles[i] = g.getOptionForAxis('gridLineColor', axes[i]); + lineWidths[i] = g.getOptionForAxis('gridLineWidth', axes[i]); + strokePattern[i] = g.getOptionForAxis('gridLinePattern', axes[i]); + stroking[i] = strokePattern[i] && (strokePattern[i].length >= 2); + } + } + ticks = layout.yticks; + ctx.save(); + // draw grids for the different y axes + for (i = 0; i < ticks.length; i++) { + var axis = ticks[i][0]; + if(drawGrid[axis]) { + if (stroking[axis]) { + ctx.installPattern(strokePattern[axis]); + } + ctx.strokeStyle = strokeStyles[axis]; + ctx.lineWidth = lineWidths[axis]; + + x = halfUp(area.x); + y = halfDown(area.y + ticks[i][1] * area.h); + ctx.beginPath(); + ctx.moveTo(x, y); + ctx.lineTo(x + area.w, y); + ctx.closePath(); + ctx.stroke(); + + if (stroking[axis]) { + ctx.uninstallPattern(); + } + } + } + ctx.restore(); + } + + // draw grid for x axis + if (g.getOptionForAxis('drawGrid', 'x')) { + ticks = layout.xticks; + ctx.save(); + var strokePattern = g.getOptionForAxis('gridLinePattern', 'x'); + var stroking = strokePattern && (strokePattern.length >= 2); + if (stroking) { + ctx.installPattern(strokePattern); + } + ctx.strokeStyle = g.getOptionForAxis('gridLineColor', 'x'); + ctx.lineWidth = g.getOptionForAxis('gridLineWidth', 'x'); + for (i = 0; i < ticks.length; i++) { + x = halfUp(area.x + ticks[i][0] * area.w); + y = halfDown(area.y + area.h); + ctx.beginPath(); + ctx.moveTo(x, y); + ctx.lineTo(x, area.y); + ctx.closePath(); + ctx.stroke(); + } + if (stroking) { + ctx.uninstallPattern(); + } + ctx.restore(); + } +}; + +grid.prototype.destroy = function() { +}; + +return grid; + +})(); +/** + * @license + * Copyright 2012 Dan Vanderkam (danvdk@gmail.com) + * MIT-licensed (http://opensource.org/licenses/MIT) + */ +/*global Dygraph:false */ + +Dygraph.Plugins.Legend = (function() { +/* +Current bits of jankiness: +- Uses two private APIs: + 1. Dygraph.optionsViewForAxis_ + 2. dygraph.plotter_.area +- Registers for a "predraw" event, which should be renamed. +- I call calculateEmWidthInDiv more often than needed. +*/ + +/*global Dygraph:false */ +"use strict"; + + +/** + * Creates the legend, which appears when the user hovers over the chart. + * The legend can be either a user-specified or generated div. + * + * @constructor + */ +var legend = function() { + this.legend_div_ = null; + this.is_generated_div_ = false; // do we own this div, or was it user-specified? +}; + +legend.prototype.toString = function() { + return "Legend Plugin"; +}; + +// (defined below) +var generateLegendDashHTML; + +/** + * This is called during the dygraph constructor, after options have been set + * but before the data is available. + * + * Proper tasks to do here include: + * - Reading your own options + * - DOM manipulation + * - Registering event listeners + * + * @param {Dygraph} g Graph instance. + * @return {object.} Mapping of event names to callbacks. + */ +legend.prototype.activate = function(g) { + var div; + var divWidth = g.getOption('labelsDivWidth'); + + var userLabelsDiv = g.getOption('labelsDiv'); + if (userLabelsDiv && null !== userLabelsDiv) { + if (typeof(userLabelsDiv) == "string" || userLabelsDiv instanceof String) { + div = document.getElementById(userLabelsDiv); + } else { + div = userLabelsDiv; + } + } else { + // Default legend styles. These can be overridden in CSS by adding + // "!important" after your rule, e.g. "left: 30px !important;" + var messagestyle = { + "position": "absolute", + "fontSize": "14px", + "zIndex": 10, + "width": divWidth + "px", + "top": "0px", + "left": (g.size().width - divWidth - 2) + "px", + "background": "white", + "lineHeight": "normal", + "textAlign": "left", + "overflow": "hidden"}; + + // TODO(danvk): get rid of labelsDivStyles? CSS is better. + Dygraph.update(messagestyle, g.getOption('labelsDivStyles')); + div = document.createElement("div"); + div.className = "dygraph-legend"; + for (var name in messagestyle) { + if (!messagestyle.hasOwnProperty(name)) continue; + + try { + div.style[name] = messagestyle[name]; + } catch (e) { + console.warn("You are using unsupported css properties for your " + + "browser in labelsDivStyles"); + } + } + + // TODO(danvk): come up with a cleaner way to expose this. + g.graphDiv.appendChild(div); + this.is_generated_div_ = true; + } + + this.legend_div_ = div; + this.one_em_width_ = 10; // just a guess, will be updated. + + return { + select: this.select, + deselect: this.deselect, + // TODO(danvk): rethink the name "predraw" before we commit to it in any API. + predraw: this.predraw, + didDrawChart: this.didDrawChart + }; +}; + +// Needed for dashed lines. +var calculateEmWidthInDiv = function(div) { + var sizeSpan = document.createElement('span'); + sizeSpan.setAttribute('style', 'margin: 0; padding: 0 0 0 1em; border: 0;'); + div.appendChild(sizeSpan); + var oneEmWidth=sizeSpan.offsetWidth; + div.removeChild(sizeSpan); + return oneEmWidth; +}; + +var escapeHTML = function(str) { + return str.replace(/&/g, "&").replace(/"/g, """).replace(//g, ">"); +}; + +legend.prototype.select = function(e) { + var xValue = e.selectedX; + var points = e.selectedPoints; + var row = e.selectedRow; + + var legendMode = e.dygraph.getOption('legend'); + if (legendMode === 'never') { + this.legend_div_.style.display = 'none'; + return; + } + + if (legendMode === 'follow') { + // create floating legend div + var area = e.dygraph.plotter_.area; + var labelsDivWidth = e.dygraph.getOption('labelsDivWidth'); + var yAxisLabelWidth = e.dygraph.getOptionForAxis('axisLabelWidth', 'y'); + // determine floating [left, top] coordinates of the legend div + // within the plotter_ area + // offset 20 px to the right and down from the first selection point + // 20 px is guess based on mouse cursor size + var leftLegend = points[0].x * area.w + 20; + var topLegend = points[0].y * area.h - 20; + + // if legend floats to end of the window area, it flips to the other + // side of the selection point + if ((leftLegend + labelsDivWidth + 1) > (window.scrollX + window.innerWidth)) { + leftLegend = leftLegend - 2 * 20 - labelsDivWidth - (yAxisLabelWidth - area.x); + } + + e.dygraph.graphDiv.appendChild(this.legend_div_); + this.legend_div_.style.left = yAxisLabelWidth + leftLegend + "px"; + this.legend_div_.style.top = topLegend + "px"; + } + + var html = legend.generateLegendHTML(e.dygraph, xValue, points, this.one_em_width_, row); + this.legend_div_.innerHTML = html; + this.legend_div_.style.display = ''; +}; + +legend.prototype.deselect = function(e) { + var legendMode = e.dygraph.getOption('legend'); + if (legendMode !== 'always') { + this.legend_div_.style.display = "none"; + } + + // Have to do this every time, since styles might have changed. + var oneEmWidth = calculateEmWidthInDiv(this.legend_div_); + this.one_em_width_ = oneEmWidth; + + var html = legend.generateLegendHTML(e.dygraph, undefined, undefined, oneEmWidth, null); + this.legend_div_.innerHTML = html; +}; + +legend.prototype.didDrawChart = function(e) { + this.deselect(e); +}; + +// Right edge should be flush with the right edge of the charting area (which +// may not be the same as the right edge of the div, if we have two y-axes. +// TODO(danvk): is any of this really necessary? Could just set "right" in "activate". +/** + * Position the labels div so that: + * - its right edge is flush with the right edge of the charting area + * - its top edge is flush with the top edge of the charting area + * @private + */ +legend.prototype.predraw = function(e) { + // Don't touch a user-specified labelsDiv. + if (!this.is_generated_div_) return; + + // TODO(danvk): only use real APIs for this. + e.dygraph.graphDiv.appendChild(this.legend_div_); + var area = e.dygraph.plotter_.area; + var labelsDivWidth = e.dygraph.getOption("labelsDivWidth"); + this.legend_div_.style.left = area.x + area.w - labelsDivWidth - 1 + "px"; + this.legend_div_.style.top = area.y + "px"; + this.legend_div_.style.width = labelsDivWidth + "px"; +}; + +/** + * Called when dygraph.destroy() is called. + * You should null out any references and detach any DOM elements. + */ +legend.prototype.destroy = function() { + this.legend_div_ = null; +}; + +/** + * @private + * Generates HTML for the legend which is displayed when hovering over the + * chart. If no selected points are specified, a default legend is returned + * (this may just be the empty string). + * @param {number} x The x-value of the selected points. + * @param {Object} sel_points List of selected points for the given + * x-value. Should have properties like 'name', 'yval' and 'canvasy'. + * @param {number} oneEmWidth The pixel width for 1em in the legend. Only + * relevant when displaying a legend with no selection (i.e. {legend: + * 'always'}) and with dashed lines. + * @param {number} row The selected row index. + */ +legend.generateLegendHTML = function(g, x, sel_points, oneEmWidth, row) { + // TODO(danvk): deprecate this option in place of {legend: 'never'} + if (g.getOption('showLabelsOnHighlight') !== true) return ''; + + // If no points are selected, we display a default legend. Traditionally, + // this has been blank. But a better default would be a conventional legend, + // which provides essential information for a non-interactive chart. + var html, sepLines, i, dash, strokePattern; + var labels = g.getLabels(); + + if (typeof(x) === 'undefined') { + if (g.getOption('legend') != 'always') { + return ''; + } + + sepLines = g.getOption('labelsSeparateLines'); + html = ''; + for (i = 1; i < labels.length; i++) { + var series = g.getPropertiesForSeries(labels[i]); + if (!series.visible) continue; + + if (html !== '') html += (sepLines ? '
    ' : ' '); + strokePattern = g.getOption("strokePattern", labels[i]); + dash = generateLegendDashHTML(strokePattern, series.color, oneEmWidth); + html += "" + + dash + " " + escapeHTML(labels[i]) + ""; + } + return html; + } + + // TODO(danvk): remove this use of a private API + var xOptView = g.optionsViewForAxis_('x'); + var xvf = xOptView('valueFormatter'); + html = xvf.call(g, x, xOptView, labels[0], g, row, 0); + if (html !== '') { + html += ':'; + } + + var yOptViews = []; + var num_axes = g.numAxes(); + for (i = 0; i < num_axes; i++) { + // TODO(danvk): remove this use of a private API + yOptViews[i] = g.optionsViewForAxis_('y' + (i ? 1 + i : '')); + } + var showZeros = g.getOption("labelsShowZeroValues"); + sepLines = g.getOption("labelsSeparateLines"); + var highlightSeries = g.getHighlightSeries(); + for (i = 0; i < sel_points.length; i++) { + var pt = sel_points[i]; + if (pt.yval === 0 && !showZeros) continue; + if (!Dygraph.isOK(pt.canvasy)) continue; + if (sepLines) html += "
    "; + + var series = g.getPropertiesForSeries(pt.name); + var yOptView = yOptViews[series.axis - 1]; + var fmtFunc = yOptView('valueFormatter'); + var yval = fmtFunc.call(g, pt.yval, yOptView, pt.name, g, row, labels.indexOf(pt.name)); + + var cls = (pt.name == highlightSeries) ? " class='highlight'" : ""; + + // TODO(danvk): use a template string here and make it an attribute. + html += "" + " " + + escapeHTML(pt.name) + ": " + yval + ""; + } + return html; +}; + + +/** + * Generates html for the "dash" displayed on the legend when using "legend: always". + * In particular, this works for dashed lines with any stroke pattern. It will + * try to scale the pattern to fit in 1em width. Or if small enough repeat the + * pattern for 1em width. + * + * @param strokePattern The pattern + * @param color The color of the series. + * @param oneEmWidth The width in pixels of 1em in the legend. + * @private + */ +generateLegendDashHTML = function(strokePattern, color, oneEmWidth) { + // IE 7,8 fail at these divs, so they get boring legend, have not tested 9. + var isIE = (/MSIE/.test(navigator.userAgent) && !window.opera); + if (isIE) return "—"; + + // Easy, common case: a solid line + if (!strokePattern || strokePattern.length <= 1) { + return "
    "; + } + + var i, j, paddingLeft, marginRight; + var strokePixelLength = 0, segmentLoop = 0; + var normalizedPattern = []; + var loop; + + // Compute the length of the pixels including the first segment twice, + // since we repeat it. + for (i = 0; i <= strokePattern.length; i++) { + strokePixelLength += strokePattern[i%strokePattern.length]; + } + + // See if we can loop the pattern by itself at least twice. + loop = Math.floor(oneEmWidth/(strokePixelLength-strokePattern[0])); + if (loop > 1) { + // This pattern fits at least two times, no scaling just convert to em; + for (i = 0; i < strokePattern.length; i++) { + normalizedPattern[i] = strokePattern[i]/oneEmWidth; + } + // Since we are repeating the pattern, we don't worry about repeating the + // first segment in one draw. + segmentLoop = normalizedPattern.length; + } else { + // If the pattern doesn't fit in the legend we scale it to fit. + loop = 1; + for (i = 0; i < strokePattern.length; i++) { + normalizedPattern[i] = strokePattern[i]/strokePixelLength; + } + // For the scaled patterns we do redraw the first segment. + segmentLoop = normalizedPattern.length+1; + } + + // Now make the pattern. + var dash = ""; + for (j = 0; j < loop; j++) { + for (i = 0; i < segmentLoop; i+=2) { + // The padding is the drawn segment. + paddingLeft = normalizedPattern[i%normalizedPattern.length]; + if (i < strokePattern.length) { + // The margin is the space segment. + marginRight = normalizedPattern[(i+1)%normalizedPattern.length]; + } else { + // The repeated first segment has no right margin. + marginRight = 0; + } + dash += "
    "; + } + } + return dash; +}; + + +return legend; +})(); +/** + * @license + * Copyright 2011 Paul Felix (paul.eric.felix@gmail.com) + * MIT-licensed (http://opensource.org/licenses/MIT) + */ +/*global Dygraph:false,TouchEvent:false */ + +/** + * @fileoverview This file contains the RangeSelector plugin used to provide + * a timeline range selector widget for dygraphs. + */ + +Dygraph.Plugins.RangeSelector = (function() { + +/*global Dygraph:false */ +"use strict"; + +var rangeSelector = function() { + this.isIE_ = /MSIE/.test(navigator.userAgent) && !window.opera; + this.hasTouchInterface_ = typeof(TouchEvent) != 'undefined'; + this.isMobileDevice_ = /mobile|android/gi.test(navigator.appVersion); + this.interfaceCreated_ = false; +}; + +rangeSelector.prototype.toString = function() { + return "RangeSelector Plugin"; +}; + +rangeSelector.prototype.activate = function(dygraph) { + this.dygraph_ = dygraph; + this.isUsingExcanvas_ = dygraph.isUsingExcanvas_; + if (this.getOption_('showRangeSelector')) { + this.createInterface_(); + } + return { + layout: this.reserveSpace_, + predraw: this.renderStaticLayer_, + didDrawChart: this.renderInteractiveLayer_ + }; +}; + +rangeSelector.prototype.destroy = function() { + this.bgcanvas_ = null; + this.fgcanvas_ = null; + this.leftZoomHandle_ = null; + this.rightZoomHandle_ = null; + this.iePanOverlay_ = null; +}; + +//------------------------------------------------------------------ +// Private methods +//------------------------------------------------------------------ + +rangeSelector.prototype.getOption_ = function(name, opt_series) { + return this.dygraph_.getOption(name, opt_series); +}; + +rangeSelector.prototype.setDefaultOption_ = function(name, value) { + this.dygraph_.attrs_[name] = value; +}; + +/** + * @private + * Creates the range selector elements and adds them to the graph. + */ +rangeSelector.prototype.createInterface_ = function() { + this.createCanvases_(); + if (this.isUsingExcanvas_) { + this.createIEPanOverlay_(); + } + this.createZoomHandles_(); + this.initInteraction_(); + + // Range selector and animatedZooms have a bad interaction. See issue 359. + if (this.getOption_('animatedZooms')) { + console.warn('Animated zooms and range selector are not compatible; disabling animatedZooms.'); + this.dygraph_.updateOptions({animatedZooms: false}, true); + } + + this.interfaceCreated_ = true; + this.addToGraph_(); +}; + +/** + * @private + * Adds the range selector to the graph. + */ +rangeSelector.prototype.addToGraph_ = function() { + var graphDiv = this.graphDiv_ = this.dygraph_.graphDiv; + graphDiv.appendChild(this.bgcanvas_); + graphDiv.appendChild(this.fgcanvas_); + graphDiv.appendChild(this.leftZoomHandle_); + graphDiv.appendChild(this.rightZoomHandle_); +}; + +/** + * @private + * Removes the range selector from the graph. + */ +rangeSelector.prototype.removeFromGraph_ = function() { + var graphDiv = this.graphDiv_; + graphDiv.removeChild(this.bgcanvas_); + graphDiv.removeChild(this.fgcanvas_); + graphDiv.removeChild(this.leftZoomHandle_); + graphDiv.removeChild(this.rightZoomHandle_); + this.graphDiv_ = null; +}; + +/** + * @private + * Called by Layout to allow range selector to reserve its space. + */ +rangeSelector.prototype.reserveSpace_ = function(e) { + if (this.getOption_('showRangeSelector')) { + e.reserveSpaceBottom(this.getOption_('rangeSelectorHeight') + 4); + } +}; + +/** + * @private + * Renders the static portion of the range selector at the predraw stage. + */ +rangeSelector.prototype.renderStaticLayer_ = function() { + if (!this.updateVisibility_()) { + return; + } + this.resize_(); + this.drawStaticLayer_(); +}; + +/** + * @private + * Renders the interactive portion of the range selector after the chart has been drawn. + */ +rangeSelector.prototype.renderInteractiveLayer_ = function() { + if (!this.updateVisibility_() || this.isChangingRange_) { + return; + } + this.placeZoomHandles_(); + this.drawInteractiveLayer_(); +}; + +/** + * @private + * Check to see if the range selector is enabled/disabled and update visibility accordingly. + */ +rangeSelector.prototype.updateVisibility_ = function() { + var enabled = this.getOption_('showRangeSelector'); + if (enabled) { + if (!this.interfaceCreated_) { + this.createInterface_(); + } else if (!this.graphDiv_ || !this.graphDiv_.parentNode) { + this.addToGraph_(); + } + } else if (this.graphDiv_) { + this.removeFromGraph_(); + var dygraph = this.dygraph_; + setTimeout(function() { dygraph.width_ = 0; dygraph.resize(); }, 1); + } + return enabled; +}; + +/** + * @private + * Resizes the range selector. + */ +rangeSelector.prototype.resize_ = function() { + function setElementRect(canvas, context, rect) { + var canvasScale = Dygraph.getContextPixelRatio(context); + + canvas.style.top = rect.y + 'px'; + canvas.style.left = rect.x + 'px'; + canvas.width = rect.w * canvasScale; + canvas.height = rect.h * canvasScale; + canvas.style.width = rect.w + 'px'; + canvas.style.height = rect.h + 'px'; + + if(canvasScale != 1) { + context.scale(canvasScale, canvasScale); + } + } + + var plotArea = this.dygraph_.layout_.getPlotArea(); + + var xAxisLabelHeight = 0; + if (this.dygraph_.getOptionForAxis('drawAxis', 'x')) { + xAxisLabelHeight = this.getOption_('xAxisHeight') || (this.getOption_('axisLabelFontSize') + 2 * this.getOption_('axisTickSize')); + } + this.canvasRect_ = { + x: plotArea.x, + y: plotArea.y + plotArea.h + xAxisLabelHeight + 4, + w: plotArea.w, + h: this.getOption_('rangeSelectorHeight') + }; + + setElementRect(this.bgcanvas_, this.bgcanvas_ctx_, this.canvasRect_); + setElementRect(this.fgcanvas_, this.fgcanvas_ctx_, this.canvasRect_); +}; + +/** + * @private + * Creates the background and foreground canvases. + */ +rangeSelector.prototype.createCanvases_ = function() { + this.bgcanvas_ = Dygraph.createCanvas(); + this.bgcanvas_.className = 'dygraph-rangesel-bgcanvas'; + this.bgcanvas_.style.position = 'absolute'; + this.bgcanvas_.style.zIndex = 9; + this.bgcanvas_ctx_ = Dygraph.getContext(this.bgcanvas_); + + this.fgcanvas_ = Dygraph.createCanvas(); + this.fgcanvas_.className = 'dygraph-rangesel-fgcanvas'; + this.fgcanvas_.style.position = 'absolute'; + this.fgcanvas_.style.zIndex = 9; + this.fgcanvas_.style.cursor = 'default'; + this.fgcanvas_ctx_ = Dygraph.getContext(this.fgcanvas_); +}; + +/** + * @private + * Creates overlay divs for IE/Excanvas so that mouse events are handled properly. + */ +rangeSelector.prototype.createIEPanOverlay_ = function() { + this.iePanOverlay_ = document.createElement("div"); + this.iePanOverlay_.style.position = 'absolute'; + this.iePanOverlay_.style.backgroundColor = 'white'; + this.iePanOverlay_.style.filter = 'alpha(opacity=0)'; + this.iePanOverlay_.style.display = 'none'; + this.iePanOverlay_.style.cursor = 'move'; + this.fgcanvas_.appendChild(this.iePanOverlay_); +}; + +/** + * @private + * Creates the zoom handle elements. + */ +rangeSelector.prototype.createZoomHandles_ = function() { + var img = new Image(); + img.className = 'dygraph-rangesel-zoomhandle'; + img.style.position = 'absolute'; + img.style.zIndex = 10; + img.style.visibility = 'hidden'; // Initially hidden so they don't show up in the wrong place. + img.style.cursor = 'col-resize'; + + if (/MSIE 7/.test(navigator.userAgent)) { // IE7 doesn't support embedded src data. + img.width = 7; + img.height = 14; + img.style.backgroundColor = 'white'; + img.style.border = '1px solid #333333'; // Just show box in IE7. + } else { + img.width = 9; + img.height = 16; + img.src = 'data:image/png;base64,' + +'iVBORw0KGgoAAAANSUhEUgAAAAkAAAAQCAYAAADESFVDAAAAAXNSR0IArs4c6QAAAAZiS0dEANAA' + +'zwDP4Z7KegAAAAlwSFlzAAAOxAAADsQBlSsOGwAAAAd0SU1FB9sHGw0cMqdt1UwAAAAZdEVYdENv' + +'bW1lbnQAQ3JlYXRlZCB3aXRoIEdJTVBXgQ4XAAAAaElEQVQoz+3SsRFAQBCF4Z9WJM8KCDVwownl' + +'6YXsTmCUsyKGkZzcl7zkz3YLkypgAnreFmDEpHkIwVOMfpdi9CEEN2nGpFdwD03yEqDtOgCaun7s' + +'qSTDH32I1pQA2Pb9sZecAxc5r3IAb21d6878xsAAAAAASUVORK5CYII='; + } + + if (this.isMobileDevice_) { + img.width *= 2; + img.height *= 2; + } + + this.leftZoomHandle_ = img; + this.rightZoomHandle_ = img.cloneNode(false); +}; + +/** + * @private + * Sets up the interaction for the range selector. + */ +rangeSelector.prototype.initInteraction_ = function() { + var self = this; + var topElem = document; + var clientXLast = 0; + var handle = null; + var isZooming = false; + var isPanning = false; + var dynamic = !this.isMobileDevice_ && !this.isUsingExcanvas_; + + // We cover iframes during mouse interactions. See comments in + // dygraph-utils.js for more info on why this is a good idea. + var tarp = new Dygraph.IFrameTarp(); + + // functions, defined below. Defining them this way (rather than with + // "function foo() {...}" makes JSHint happy. + var toXDataWindow, onZoomStart, onZoom, onZoomEnd, doZoom, isMouseInPanZone, + onPanStart, onPan, onPanEnd, doPan, onCanvasHover; + + // Touch event functions + var onZoomHandleTouchEvent, onCanvasTouchEvent, addTouchEvents; + + toXDataWindow = function(zoomHandleStatus) { + var xDataLimits = self.dygraph_.xAxisExtremes(); + var fact = (xDataLimits[1] - xDataLimits[0])/self.canvasRect_.w; + var xDataMin = xDataLimits[0] + (zoomHandleStatus.leftHandlePos - self.canvasRect_.x)*fact; + var xDataMax = xDataLimits[0] + (zoomHandleStatus.rightHandlePos - self.canvasRect_.x)*fact; + return [xDataMin, xDataMax]; + }; + + onZoomStart = function(e) { + Dygraph.cancelEvent(e); + isZooming = true; + clientXLast = e.clientX; + handle = e.target ? e.target : e.srcElement; + if (e.type === 'mousedown' || e.type === 'dragstart') { + // These events are removed manually. + Dygraph.addEvent(topElem, 'mousemove', onZoom); + Dygraph.addEvent(topElem, 'mouseup', onZoomEnd); + } + self.fgcanvas_.style.cursor = 'col-resize'; + tarp.cover(); + return true; + }; + + onZoom = function(e) { + if (!isZooming) { + return false; + } + Dygraph.cancelEvent(e); + + var delX = e.clientX - clientXLast; + if (Math.abs(delX) < 4) { + return true; + } + clientXLast = e.clientX; + + // Move handle. + var zoomHandleStatus = self.getZoomHandleStatus_(); + var newPos; + if (handle == self.leftZoomHandle_) { + newPos = zoomHandleStatus.leftHandlePos + delX; + newPos = Math.min(newPos, zoomHandleStatus.rightHandlePos - handle.width - 3); + newPos = Math.max(newPos, self.canvasRect_.x); + } else { + newPos = zoomHandleStatus.rightHandlePos + delX; + newPos = Math.min(newPos, self.canvasRect_.x + self.canvasRect_.w); + newPos = Math.max(newPos, zoomHandleStatus.leftHandlePos + handle.width + 3); + } + var halfHandleWidth = handle.width/2; + handle.style.left = (newPos - halfHandleWidth) + 'px'; + self.drawInteractiveLayer_(); + + // Zoom on the fly (if not using excanvas). + if (dynamic) { + doZoom(); + } + return true; + }; + + onZoomEnd = function(e) { + if (!isZooming) { + return false; + } + isZooming = false; + tarp.uncover(); + Dygraph.removeEvent(topElem, 'mousemove', onZoom); + Dygraph.removeEvent(topElem, 'mouseup', onZoomEnd); + self.fgcanvas_.style.cursor = 'default'; + + // If using excanvas, Zoom now. + if (!dynamic) { + doZoom(); + } + return true; + }; + + doZoom = function() { + try { + var zoomHandleStatus = self.getZoomHandleStatus_(); + self.isChangingRange_ = true; + if (!zoomHandleStatus.isZoomed) { + self.dygraph_.resetZoom(); + } else { + var xDataWindow = toXDataWindow(zoomHandleStatus); + self.dygraph_.doZoomXDates_(xDataWindow[0], xDataWindow[1]); + } + } finally { + self.isChangingRange_ = false; + } + }; + + isMouseInPanZone = function(e) { + if (self.isUsingExcanvas_) { + return e.srcElement == self.iePanOverlay_; + } else { + var rect = self.leftZoomHandle_.getBoundingClientRect(); + var leftHandleClientX = rect.left + rect.width/2; + rect = self.rightZoomHandle_.getBoundingClientRect(); + var rightHandleClientX = rect.left + rect.width/2; + return (e.clientX > leftHandleClientX && e.clientX < rightHandleClientX); + } + }; + + onPanStart = function(e) { + if (!isPanning && isMouseInPanZone(e) && self.getZoomHandleStatus_().isZoomed) { + Dygraph.cancelEvent(e); + isPanning = true; + clientXLast = e.clientX; + if (e.type === 'mousedown') { + // These events are removed manually. + Dygraph.addEvent(topElem, 'mousemove', onPan); + Dygraph.addEvent(topElem, 'mouseup', onPanEnd); + } + return true; + } + return false; + }; + + onPan = function(e) { + if (!isPanning) { + return false; + } + Dygraph.cancelEvent(e); + + var delX = e.clientX - clientXLast; + if (Math.abs(delX) < 4) { + return true; + } + clientXLast = e.clientX; + + // Move range view + var zoomHandleStatus = self.getZoomHandleStatus_(); + var leftHandlePos = zoomHandleStatus.leftHandlePos; + var rightHandlePos = zoomHandleStatus.rightHandlePos; + var rangeSize = rightHandlePos - leftHandlePos; + if (leftHandlePos + delX <= self.canvasRect_.x) { + leftHandlePos = self.canvasRect_.x; + rightHandlePos = leftHandlePos + rangeSize; + } else if (rightHandlePos + delX >= self.canvasRect_.x + self.canvasRect_.w) { + rightHandlePos = self.canvasRect_.x + self.canvasRect_.w; + leftHandlePos = rightHandlePos - rangeSize; + } else { + leftHandlePos += delX; + rightHandlePos += delX; + } + var halfHandleWidth = self.leftZoomHandle_.width/2; + self.leftZoomHandle_.style.left = (leftHandlePos - halfHandleWidth) + 'px'; + self.rightZoomHandle_.style.left = (rightHandlePos - halfHandleWidth) + 'px'; + self.drawInteractiveLayer_(); + + // Do pan on the fly (if not using excanvas). + if (dynamic) { + doPan(); + } + return true; + }; + + onPanEnd = function(e) { + if (!isPanning) { + return false; + } + isPanning = false; + Dygraph.removeEvent(topElem, 'mousemove', onPan); + Dygraph.removeEvent(topElem, 'mouseup', onPanEnd); + // If using excanvas, do pan now. + if (!dynamic) { + doPan(); + } + return true; + }; + + doPan = function() { + try { + self.isChangingRange_ = true; + self.dygraph_.dateWindow_ = toXDataWindow(self.getZoomHandleStatus_()); + self.dygraph_.drawGraph_(false); + } finally { + self.isChangingRange_ = false; + } + }; + + onCanvasHover = function(e) { + if (isZooming || isPanning) { + return; + } + var cursor = isMouseInPanZone(e) ? 'move' : 'default'; + if (cursor != self.fgcanvas_.style.cursor) { + self.fgcanvas_.style.cursor = cursor; + } + }; + + onZoomHandleTouchEvent = function(e) { + if (e.type == 'touchstart' && e.targetTouches.length == 1) { + if (onZoomStart(e.targetTouches[0])) { + Dygraph.cancelEvent(e); + } + } else if (e.type == 'touchmove' && e.targetTouches.length == 1) { + if (onZoom(e.targetTouches[0])) { + Dygraph.cancelEvent(e); + } + } else { + onZoomEnd(e); + } + }; + + onCanvasTouchEvent = function(e) { + if (e.type == 'touchstart' && e.targetTouches.length == 1) { + if (onPanStart(e.targetTouches[0])) { + Dygraph.cancelEvent(e); + } + } else if (e.type == 'touchmove' && e.targetTouches.length == 1) { + if (onPan(e.targetTouches[0])) { + Dygraph.cancelEvent(e); + } + } else { + onPanEnd(e); + } + }; + + addTouchEvents = function(elem, fn) { + var types = ['touchstart', 'touchend', 'touchmove', 'touchcancel']; + for (var i = 0; i < types.length; i++) { + self.dygraph_.addAndTrackEvent(elem, types[i], fn); + } + }; + + this.setDefaultOption_('interactionModel', Dygraph.Interaction.dragIsPanInteractionModel); + this.setDefaultOption_('panEdgeFraction', 0.0001); + + var dragStartEvent = window.opera ? 'mousedown' : 'dragstart'; + this.dygraph_.addAndTrackEvent(this.leftZoomHandle_, dragStartEvent, onZoomStart); + this.dygraph_.addAndTrackEvent(this.rightZoomHandle_, dragStartEvent, onZoomStart); + + if (this.isUsingExcanvas_) { + this.dygraph_.addAndTrackEvent(this.iePanOverlay_, 'mousedown', onPanStart); + } else { + this.dygraph_.addAndTrackEvent(this.fgcanvas_, 'mousedown', onPanStart); + this.dygraph_.addAndTrackEvent(this.fgcanvas_, 'mousemove', onCanvasHover); + } + + // Touch events + if (this.hasTouchInterface_) { + addTouchEvents(this.leftZoomHandle_, onZoomHandleTouchEvent); + addTouchEvents(this.rightZoomHandle_, onZoomHandleTouchEvent); + addTouchEvents(this.fgcanvas_, onCanvasTouchEvent); + } +}; + +/** + * @private + * Draws the static layer in the background canvas. + */ +rangeSelector.prototype.drawStaticLayer_ = function() { + var ctx = this.bgcanvas_ctx_; + ctx.clearRect(0, 0, this.canvasRect_.w, this.canvasRect_.h); + try { + this.drawMiniPlot_(); + } catch(ex) { + console.warn(ex); + } + + var margin = 0.5; + this.bgcanvas_ctx_.lineWidth = 1; + ctx.strokeStyle = 'gray'; + ctx.beginPath(); + ctx.moveTo(margin, margin); + ctx.lineTo(margin, this.canvasRect_.h-margin); + ctx.lineTo(this.canvasRect_.w-margin, this.canvasRect_.h-margin); + ctx.lineTo(this.canvasRect_.w-margin, margin); + ctx.stroke(); +}; + + +/** + * @private + * Draws the mini plot in the background canvas. + */ +rangeSelector.prototype.drawMiniPlot_ = function() { + var fillStyle = this.getOption_('rangeSelectorPlotFillColor'); + var strokeStyle = this.getOption_('rangeSelectorPlotStrokeColor'); + if (!fillStyle && !strokeStyle) { + return; + } + + var stepPlot = this.getOption_('stepPlot'); + + var combinedSeriesData = this.computeCombinedSeriesAndLimits_(); + var yRange = combinedSeriesData.yMax - combinedSeriesData.yMin; + + // Draw the mini plot. + var ctx = this.bgcanvas_ctx_; + var margin = 0.5; + + var xExtremes = this.dygraph_.xAxisExtremes(); + var xRange = Math.max(xExtremes[1] - xExtremes[0], 1.e-30); + var xFact = (this.canvasRect_.w - margin)/xRange; + var yFact = (this.canvasRect_.h - margin)/yRange; + var canvasWidth = this.canvasRect_.w - margin; + var canvasHeight = this.canvasRect_.h - margin; + + var prevX = null, prevY = null; + + ctx.beginPath(); + ctx.moveTo(margin, canvasHeight); + for (var i = 0; i < combinedSeriesData.data.length; i++) { + var dataPoint = combinedSeriesData.data[i]; + var x = ((dataPoint[0] !== null) ? ((dataPoint[0] - xExtremes[0])*xFact) : NaN); + var y = ((dataPoint[1] !== null) ? (canvasHeight - (dataPoint[1] - combinedSeriesData.yMin)*yFact) : NaN); + + // Skip points that don't change the x-value. Overly fine-grained points + // can cause major slowdowns with the ctx.fill() call below. + if (!stepPlot && prevX !== null && Math.round(x) == Math.round(prevX)) { + continue; + } + + if (isFinite(x) && isFinite(y)) { + if(prevX === null) { + ctx.lineTo(x, canvasHeight); + } + else if (stepPlot) { + ctx.lineTo(x, prevY); + } + ctx.lineTo(x, y); + prevX = x; + prevY = y; + } + else { + if(prevX !== null) { + if (stepPlot) { + ctx.lineTo(x, prevY); + ctx.lineTo(x, canvasHeight); + } + else { + ctx.lineTo(prevX, canvasHeight); + } + } + prevX = prevY = null; + } + } + ctx.lineTo(canvasWidth, canvasHeight); + ctx.closePath(); + + if (fillStyle) { + var lingrad = this.bgcanvas_ctx_.createLinearGradient(0, 0, 0, canvasHeight); + lingrad.addColorStop(0, 'white'); + lingrad.addColorStop(1, fillStyle); + this.bgcanvas_ctx_.fillStyle = lingrad; + ctx.fill(); + } + + if (strokeStyle) { + this.bgcanvas_ctx_.strokeStyle = strokeStyle; + this.bgcanvas_ctx_.lineWidth = 1.5; + ctx.stroke(); + } +}; + +/** + * @private + * Computes and returns the combined series data along with min/max for the mini plot. + * The combined series consists of averaged values for all series. + * When series have error bars, the error bars are ignored. + * @return {Object} An object containing combined series array, ymin, ymax. + */ +rangeSelector.prototype.computeCombinedSeriesAndLimits_ = function() { + var g = this.dygraph_; + var logscale = this.getOption_('logscale'); + var i; + + // Select series to combine. By default, all series are combined. + var numColumns = g.numColumns(); + var labels = g.getLabels(); + var includeSeries = new Array(numColumns); + var anySet = false; + for (i = 1; i < numColumns; i++) { + var include = this.getOption_('showInRangeSelector', labels[i]); + includeSeries[i] = include; + if (include !== null) anySet = true; // it's set explicitly for this series + } + if (!anySet) { + for (i = 0; i < includeSeries.length; i++) includeSeries[i] = true; + } + + // Create a combined series (average of selected series values). + // TODO(danvk): short-circuit if there's only one series. + var rolledSeries = []; + var dataHandler = g.dataHandler_; + var options = g.attributes_; + for (i = 1; i < g.numColumns(); i++) { + if (!includeSeries[i]) continue; + var series = dataHandler.extractSeries(g.rawData_, i, options); + if (g.rollPeriod() > 1) { + series = dataHandler.rollingAverage(series, g.rollPeriod(), options); + } + + rolledSeries.push(series); + } + + var combinedSeries = []; + for (i = 0; i < rolledSeries[0].length; i++) { + var sum = 0; + var count = 0; + for (var j = 0; j < rolledSeries.length; j++) { + var y = rolledSeries[j][i][1]; + if (y === null || isNaN(y)) continue; + count++; + sum += y; + } + combinedSeries.push([rolledSeries[0][i][0], sum / count]); + } + + // Compute the y range. + var yMin = Number.MAX_VALUE; + var yMax = -Number.MAX_VALUE; + for (i = 0; i < combinedSeries.length; i++) { + var yVal = combinedSeries[i][1]; + if (yVal !== null && isFinite(yVal) && (!logscale || yVal > 0)) { + yMin = Math.min(yMin, yVal); + yMax = Math.max(yMax, yVal); + } + } + + // Convert Y data to log scale if needed. + // Also, expand the Y range to compress the mini plot a little. + var extraPercent = 0.25; + if (logscale) { + yMax = Dygraph.log10(yMax); + yMax += yMax*extraPercent; + yMin = Dygraph.log10(yMin); + for (i = 0; i < combinedSeries.length; i++) { + combinedSeries[i][1] = Dygraph.log10(combinedSeries[i][1]); + } + } else { + var yExtra; + var yRange = yMax - yMin; + if (yRange <= Number.MIN_VALUE) { + yExtra = yMax*extraPercent; + } else { + yExtra = yRange*extraPercent; + } + yMax += yExtra; + yMin -= yExtra; + } + + return {data: combinedSeries, yMin: yMin, yMax: yMax}; +}; + +/** + * @private + * Places the zoom handles in the proper position based on the current X data window. + */ +rangeSelector.prototype.placeZoomHandles_ = function() { + var xExtremes = this.dygraph_.xAxisExtremes(); + var xWindowLimits = this.dygraph_.xAxisRange(); + var xRange = xExtremes[1] - xExtremes[0]; + var leftPercent = Math.max(0, (xWindowLimits[0] - xExtremes[0])/xRange); + var rightPercent = Math.max(0, (xExtremes[1] - xWindowLimits[1])/xRange); + var leftCoord = this.canvasRect_.x + this.canvasRect_.w*leftPercent; + var rightCoord = this.canvasRect_.x + this.canvasRect_.w*(1 - rightPercent); + var handleTop = Math.max(this.canvasRect_.y, this.canvasRect_.y + (this.canvasRect_.h - this.leftZoomHandle_.height)/2); + var halfHandleWidth = this.leftZoomHandle_.width/2; + this.leftZoomHandle_.style.left = (leftCoord - halfHandleWidth) + 'px'; + this.leftZoomHandle_.style.top = handleTop + 'px'; + this.rightZoomHandle_.style.left = (rightCoord - halfHandleWidth) + 'px'; + this.rightZoomHandle_.style.top = this.leftZoomHandle_.style.top; + + this.leftZoomHandle_.style.visibility = 'visible'; + this.rightZoomHandle_.style.visibility = 'visible'; +}; + +/** + * @private + * Draws the interactive layer in the foreground canvas. + */ +rangeSelector.prototype.drawInteractiveLayer_ = function() { + var ctx = this.fgcanvas_ctx_; + ctx.clearRect(0, 0, this.canvasRect_.w, this.canvasRect_.h); + var margin = 1; + var width = this.canvasRect_.w - margin; + var height = this.canvasRect_.h - margin; + var zoomHandleStatus = this.getZoomHandleStatus_(); + + ctx.strokeStyle = 'black'; + if (!zoomHandleStatus.isZoomed) { + ctx.beginPath(); + ctx.moveTo(margin, margin); + ctx.lineTo(margin, height); + ctx.lineTo(width, height); + ctx.lineTo(width, margin); + ctx.stroke(); + if (this.iePanOverlay_) { + this.iePanOverlay_.style.display = 'none'; + } + } else { + var leftHandleCanvasPos = Math.max(margin, zoomHandleStatus.leftHandlePos - this.canvasRect_.x); + var rightHandleCanvasPos = Math.min(width, zoomHandleStatus.rightHandlePos - this.canvasRect_.x); + + ctx.fillStyle = 'rgba(240, 240, 240, 0.6)'; + ctx.fillRect(0, 0, leftHandleCanvasPos, this.canvasRect_.h); + ctx.fillRect(rightHandleCanvasPos, 0, this.canvasRect_.w - rightHandleCanvasPos, this.canvasRect_.h); + + ctx.beginPath(); + ctx.moveTo(margin, margin); + ctx.lineTo(leftHandleCanvasPos, margin); + ctx.lineTo(leftHandleCanvasPos, height); + ctx.lineTo(rightHandleCanvasPos, height); + ctx.lineTo(rightHandleCanvasPos, margin); + ctx.lineTo(width, margin); + ctx.stroke(); + + if (this.isUsingExcanvas_) { + this.iePanOverlay_.style.width = (rightHandleCanvasPos - leftHandleCanvasPos) + 'px'; + this.iePanOverlay_.style.left = leftHandleCanvasPos + 'px'; + this.iePanOverlay_.style.height = height + 'px'; + this.iePanOverlay_.style.display = 'inline'; + } + } +}; + +/** + * @private + * Returns the current zoom handle position information. + * @return {Object} The zoom handle status. + */ +rangeSelector.prototype.getZoomHandleStatus_ = function() { + var halfHandleWidth = this.leftZoomHandle_.width/2; + var leftHandlePos = parseFloat(this.leftZoomHandle_.style.left) + halfHandleWidth; + var rightHandlePos = parseFloat(this.rightZoomHandle_.style.left) + halfHandleWidth; + return { + leftHandlePos: leftHandlePos, + rightHandlePos: rightHandlePos, + isZoomed: (leftHandlePos - 1 > this.canvasRect_.x || rightHandlePos + 1 < this.canvasRect_.x+this.canvasRect_.w) + }; +}; + +return rangeSelector; + +})(); +/*global Dygraph:false */ + +// This file defines the ordering of the plugins. +// +// The ordering is from most-general to most-specific. +// This means that, in an event cascade, plugins which have registered for that +// event will be called in reverse order. +// +// This is most relevant for plugins which register a layout event, e.g. +// Axes, Legend and ChartLabels. + +Dygraph.PLUGINS.push( + Dygraph.Plugins.Legend, + Dygraph.Plugins.Axes, + Dygraph.Plugins.RangeSelector, // Has to be before ChartLabels so that its callbacks are called after ChartLabels' callbacks. + Dygraph.Plugins.ChartLabels, + Dygraph.Plugins.Annotations, + Dygraph.Plugins.Grid +); +/** + * @license + * Copyright 2011 Dan Vanderkam (danvdk@gmail.com) + * MIT-licensed (http://opensource.org/licenses/MIT) + */ + +// NOTE: in addition to parsing as JS, this snippet is expected to be valid +// JSON. This assumption cannot be checked in JS, but it will be checked when +// documentation is generated by the generate-documentation.py script. For the +// most part, this just means that you should always use double quotes. +Dygraph.OPTIONS_REFERENCE = // +{ + "xValueParser": { + "default": "parseFloat() or Date.parse()*", + "labels": ["CSV parsing"], + "type": "function(str) -> number", + "description": "A function which parses x-values (i.e. the dependent series). Must return a number, even when the values are dates. In this case, millis since epoch are used. This is used primarily for parsing CSV data. *=Dygraphs is slightly more accepting in the dates which it will parse. See code for details." + }, + "stackedGraph": { + "default": "false", + "labels": ["Data Line display"], + "type": "boolean", + "description": "If set, stack series on top of one another rather than drawing them independently. The first series specified in the input data will wind up on top of the chart and the last will be on bottom. NaN values are drawn as white areas without a line on top, see stackedGraphNaNFill for details." + }, + "stackedGraphNaNFill": { + "default": "all", + "labels": ["Data Line display"], + "type": "string", + "description": "Controls handling of NaN values inside a stacked graph. NaN values are interpolated/extended for stacking purposes, but the actual point value remains NaN in the legend display. Valid option values are \"all\" (interpolate internally, repeat leftmost and rightmost value as needed), \"inside\" (interpolate internally only, use zero outside leftmost and rightmost value), and \"none\" (treat NaN as zero everywhere)." + }, + "pointSize": { + "default": "1", + "labels": ["Data Line display"], + "type": "integer", + "description": "The size of the dot to draw on each point in pixels (see drawPoints). A dot is always drawn when a point is \"isolated\", i.e. there is a missing point on either side of it. This also controls the size of those dots." + }, + "labelsDivStyles": { + "default": "null", + "labels": ["Legend"], + "type": "{}", + "description": "Additional styles to apply to the currently-highlighted points div. For example, { 'fontWeight': 'bold' } will make the labels bold. In general, it is better to use CSS to style the .dygraph-legend class than to use this property." + }, + "drawPoints": { + "default": "false", + "labels": ["Data Line display"], + "type": "boolean", + "description": "Draw a small dot at each point, in addition to a line going through the point. This makes the individual data points easier to see, but can increase visual clutter in the chart. The small dot can be replaced with a custom rendering by supplying a drawPointCallback." + }, + "drawGapEdgePoints": { + "default": "false", + "labels": ["Data Line display"], + "type": "boolean", + "description": "Draw points at the edges of gaps in the data. This improves visibility of small data segments or other data irregularities." + }, + "drawPointCallback": { + "default": "null", + "labels": ["Data Line display"], + "type": "function(g, seriesName, canvasContext, cx, cy, color, pointSize)", + "parameters": [ + [ "g" , "the reference graph" ], + [ "seriesName" , "the name of the series" ], + [ "canvasContext" , "the canvas to draw on" ], + [ "cx" , "center x coordinate" ], + [ "cy" , "center y coordinate" ], + [ "color" , "series color" ], + [ "pointSize" , "the radius of the image." ], + [ "idx" , "the row-index of the point in the data."] + ], + "description": "Draw a custom item when drawPoints is enabled. Default is a small dot matching the series color. This method should constrain drawing to within pointSize pixels from (cx, cy). Also see drawHighlightPointCallback" + }, + "height": { + "default": "320", + "labels": ["Overall display"], + "type": "integer", + "description": "Height, in pixels, of the chart. If the container div has been explicitly sized, this will be ignored." + }, + "zoomCallback": { + "default": "null", + "labels": ["Callbacks"], + "type": "function(minDate, maxDate, yRanges)", + "parameters": [ + [ "minDate" , "milliseconds since epoch" ], + [ "maxDate" , "milliseconds since epoch." ], + [ "yRanges" , "is an array of [bottom, top] pairs, one for each y-axis." ] + ], + "description": "A function to call when the zoom window is changed (either by zooming in or out)." + }, + "pointClickCallback": { + "snippet": "function(e, point){
      alert(point);
    }", + "default": "null", + "labels": ["Callbacks", "Interactive Elements"], + "type": "function(e, point)", + "parameters": [ + [ "e" , "the event object for the click" ], + [ "point" , "the point that was clicked See Point properties for details" ] + ], + "description": "A function to call when a data point is clicked. and the point that was clicked." + }, + "color": { + "default": "(see description)", + "labels": ["Data Series Colors"], + "type": "string", + "example": "red", + "description": "A per-series color definition. Used in conjunction with, and overrides, the colors option." + }, + "colors": { + "default": "(see description)", + "labels": ["Data Series Colors"], + "type": "array", + "example": "['red', '#00FF00']", + "description": "List of colors for the data series. These can be of the form \"#AABBCC\" or \"rgb(255,100,200)\" or \"yellow\", etc. If not specified, equally-spaced points around a color wheel are used. Overridden by the 'color' option." + }, + "connectSeparatedPoints": { + "default": "false", + "labels": ["Data Line display"], + "type": "boolean", + "description": "Usually, when Dygraphs encounters a missing value in a data series, it interprets this as a gap and draws it as such. If, instead, the missing values represents an x-value for which only a different series has data, then you'll want to connect the dots by setting this to true. To explicitly include a gap with this option set, use a value of NaN." + }, + "highlightCallback": { + "default": "null", + "labels": ["Callbacks"], + "type": "function(event, x, points, row, seriesName)", + "description": "When set, this callback gets called every time a new point is highlighted.", + "parameters": [ + ["event", "the JavaScript mousemove event"], + ["x", "the x-coordinate of the highlighted points"], + ["points", "an array of highlighted points: [ {name: 'series', yval: y-value}, … ]"], + ["row", "integer index of the highlighted row in the data table, starting from 0"], + ["seriesName", "name of the highlighted series, only present if highlightSeriesOpts is set."] + ] + }, + "drawHighlightPointCallback": { + "default": "null", + "labels": ["Data Line display"], + "type": "function(g, seriesName, canvasContext, cx, cy, color, pointSize)", + "parameters": [ + [ "g" , "the reference graph" ], + [ "seriesName" , "the name of the series" ], + [ "canvasContext" , "the canvas to draw on" ], + [ "cx" , "center x coordinate" ], + [ "cy" , "center y coordinate" ], + [ "color" , "series color" ], + [ "pointSize" , "the radius of the image." ], + [ "idx" , "the row-index of the point in the data."] + ], + "description": "Draw a custom item when a point is highlighted. Default is a small dot matching the series color. This method should constrain drawing to within pointSize pixels from (cx, cy) Also see drawPointCallback" + }, + "highlightSeriesOpts": { + "default": "null", + "labels": ["Interactive Elements"], + "type": "Object", + "description": "When set, the options from this object are applied to the timeseries closest to the mouse pointer for interactive highlighting. See also 'highlightCallback'. Example: highlightSeriesOpts: { strokeWidth: 3 }." + }, + "highlightSeriesBackgroundAlpha": { + "default": "0.5", + "labels": ["Interactive Elements"], + "type": "float", + "description": "Fade the background while highlighting series. 1=fully visible background (disable fading), 0=hiddden background (show highlighted series only)." + }, + "includeZero": { + "default": "false", + "labels": ["Axis display"], + "type": "boolean", + "description": "Usually, dygraphs will use the range of the data plus some padding to set the range of the y-axis. If this option is set, the y-axis will always include zero, typically as the lowest value. This can be used to avoid exaggerating the variance in the data" + }, + "rollPeriod": { + "default": "1", + "labels": ["Error Bars", "Rolling Averages"], + "type": "integer >= 1", + "description": "Number of days over which to average data. Discussed extensively above." + }, + "unhighlightCallback": { + "default": "null", + "labels": ["Callbacks"], + "type": "function(event)", + "parameters": [ + [ "event" , "the mouse event" ] + ], + "description": "When set, this callback gets called every time the user stops highlighting any point by mousing out of the graph." + }, + "axisTickSize": { + "default": "3.0", + "labels": ["Axis display"], + "type": "number", + "description": "The size of the line to display next to each tick mark on x- or y-axes." + }, + "labelsSeparateLines": { + "default": "false", + "labels": ["Legend"], + "type": "boolean", + "description": "Put <br/> between lines in the label string. Often used in conjunction with labelsDiv." + }, + "xValueFormatter": { + "default": "", + "labels": ["Deprecated"], + "type": "", + "description": "Prefer axes: { x: { valueFormatter } }" + }, + "valueFormatter": { + "default": "Depends on the type of your data.", + "labels": ["Legend", "Value display/formatting"], + "type": "function(num or millis, opts, seriesName, dygraph, row, col)", + "description": "Function to provide a custom display format for the values displayed on mouseover. This does not affect the values that appear on tick marks next to the axes. To format those, see axisLabelFormatter. This is usually set on a per-axis basis. .", + "parameters": [ + ["num_or_millis", "The value to be formatted. This is always a number. For date axes, it's millis since epoch. You can call new Date(millis) to get a Date object."], + ["opts", "This is a function you can call to access various options (e.g. opts('labelsKMB')). It returns per-axis values for the option when available."], + ["seriesName", "The name of the series from which the point came, e.g. 'X', 'Y', 'A', etc."], + ["dygraph", "The dygraph object for which the formatting is being done"], + ["row", "The row of the data from which this point comes. g.getValue(row, 0) will return the x-value for this point."], + ["col", "The column of the data from which this point comes. g.getValue(row, col) will return the original y-value for this point. This can be used to get the full confidence interval for the point, or access un-rolled values for the point."] + ] + }, + "pixelsPerYLabel": { + "default": "", + "labels": ["Deprecated"], + "type": "integer", + "description": "Prefer axes: { y: { pixelsPerLabel } }" + }, + "annotationMouseOverHandler": { + "default": "null", + "labels": ["Annotations"], + "type": "function(annotation, point, dygraph, event)", + "description": "If provided, this function is called whenever the user mouses over an annotation." + }, + "annotationMouseOutHandler": { + "default": "null", + "labels": ["Annotations"], + "type": "function(annotation, point, dygraph, event)", + "parameters": [ + [ "annotation" , "the annotation left" ], + [ "point" , "the point associated with the annotation" ], + [ "dygraph" , "the reference graph" ], + [ "event" , "the mouse event" ] + ], + "description": "If provided, this function is called whenever the user mouses out of an annotation." + }, + "annotationClickHandler": { + "default": "null", + "labels": ["Annotations"], + "type": "function(annotation, point, dygraph, event)", + "parameters": [ + [ "annotation" , "the annotation left" ], + [ "point" , "the point associated with the annotation" ], + [ "dygraph" , "the reference graph" ], + [ "event" , "the mouse event" ] + ], + "description": "If provided, this function is called whenever the user clicks on an annotation." + }, + "annotationDblClickHandler": { + "default": "null", + "labels": ["Annotations"], + "type": "function(annotation, point, dygraph, event)", + "parameters": [ + [ "annotation" , "the annotation left" ], + [ "point" , "the point associated with the annotation" ], + [ "dygraph" , "the reference graph" ], + [ "event" , "the mouse event" ] + ], + "description": "If provided, this function is called whenever the user double-clicks on an annotation." + }, + "drawCallback": { + "default": "null", + "labels": ["Callbacks"], + "type": "function(dygraph, is_initial)", + "parameters": [ + [ "dygraph" , "The graph being drawn" ], + [ "is_initial" , "True if this is the initial draw, false for subsequent draws." ] + ], + "description": "When set, this callback gets called every time the dygraph is drawn. This includes the initial draw, after zooming and repeatedly while panning." + }, + "labelsKMG2": { + "default": "false", + "labels": ["Value display/formatting"], + "type": "boolean", + "description": "Show k/M/G for kilo/Mega/Giga on y-axis. This is different than labelsKMB in that it uses base 2, not 10." + }, + "delimiter": { + "default": ",", + "labels": ["CSV parsing"], + "type": "string", + "description": "The delimiter to look for when separating fields of a CSV file. Setting this to a tab is not usually necessary, since tab-delimited data is auto-detected." + }, + "axisLabelFontSize": { + "default": "14", + "labels": ["Axis display"], + "type": "integer", + "description": "Size of the font (in pixels) to use in the axis labels, both x- and y-axis." + }, + "underlayCallback": { + "default": "null", + "labels": ["Callbacks"], + "type": "function(context, area, dygraph)", + "parameters": [ + [ "context" , "the canvas drawing context on which to draw" ], + [ "area" , "An object with {x,y,w,h} properties describing the drawing area." ], + [ "dygraph" , "the reference graph" ] + ], + "description": "When set, this callback gets called before the chart is drawn. It details on how to use this." + }, + "width": { + "default": "480", + "labels": ["Overall display"], + "type": "integer", + "description": "Width, in pixels, of the chart. If the container div has been explicitly sized, this will be ignored." + }, + "interactionModel": { + "default": "...", + "labels": ["Interactive Elements"], + "type": "Object", + "description": "TODO(konigsberg): document this" + }, + "ticker": { + "default": "Dygraph.dateTicker or Dygraph.numericTicks", + "labels": ["Axis display"], + "type": "function(min, max, pixels, opts, dygraph, vals) -> [{v: ..., label: ...}, ...]", + "parameters": [ + [ "min" , "" ], + [ "max" , "" ], + [ "pixels" , "" ], + [ "opts" , "" ], + [ "dygraph" , "the reference graph" ], + [ "vals" , "" ] + ], + "description": "This lets you specify an arbitrary function to generate tick marks on an axis. The tick marks are an array of (value, label) pairs. The built-in functions go to great lengths to choose good tick marks so, if you set this option, you'll most likely want to call one of them and modify the result. See dygraph-tickers.js for an extensive discussion. This is set on a per-axis basis." + }, + "xAxisLabelWidth": { + "default": "", + "labels": ["Deprecated"], + "type": "integer", + "description": "Prefer axes: { x: { axisLabelWidth } }" + }, + "xAxisHeight": { + "default": "(null)", + "labels": ["Axis display"], + "type": "integer", + "description": "Height, in pixels, of the x-axis. If not set explicitly, this is computed based on axisLabelFontSize and axisTickSize." + }, + "showLabelsOnHighlight": { + "default": "true", + "labels": ["Interactive Elements", "Legend"], + "type": "boolean", + "description": "Whether to show the legend upon mouseover." + }, + "axis": { + "default": "(none)", + "labels": ["Axis display"], + "type": "string", + "description": "Set to either 'y1' or 'y2' to assign a series to a y-axis (primary or secondary). Must be set per-series." + }, + "pixelsPerXLabel": { + "default": "", + "labels": ["Deprecated"], + "type": "integer", + "description": "Prefer axes { x: { pixelsPerLabel } }" + }, + "pixelsPerLabel": { + "default": "70 (x-axis) or 30 (y-axes)", + "labels": ["Axis display", "Grid"], + "type": "integer", + "description": "Number of pixels to require between each x- and y-label. Larger values will yield a sparser axis with fewer ticks. This is set on a per-axis basis." + }, + "labelsDiv": { + "default": "null", + "labels": ["Legend"], + "type": "DOM element or string", + "example": "document.getElementById('foo')or'foo'", + "description": "Show data labels in an external div, rather than on the graph. This value can either be a div element or a div id." + }, + "fractions": { + "default": "false", + "labels": ["CSV parsing", "Error Bars"], + "type": "boolean", + "description": "When set, attempt to parse each cell in the CSV file as \"a/b\", where a and b are integers. The ratio will be plotted. This allows computation of Wilson confidence intervals (see below)." + }, + "logscale": { + "default": "false", + "labels": ["Axis display"], + "type": "boolean", + "description": "When set for the y-axis or x-axis, the graph shows that axis in log scale. Any values less than or equal to zero are not displayed. Showing log scale with ranges that go below zero will result in an unviewable graph.\n\n Not compatible with showZero. connectSeparatedPoints is ignored. This is ignored for date-based x-axes." + }, + "strokeWidth": { + "default": "1.0", + "labels": ["Data Line display"], + "type": "float", + "example": "0.5, 2.0", + "description": "The width of the lines connecting data points. This can be used to increase the contrast or some graphs." + }, + "strokePattern": { + "default": "null", + "labels": ["Data Line display"], + "type": "array", + "example": "[10, 2, 5, 2]", + "description": "A custom pattern array where the even index is a draw and odd is a space in pixels. If null then it draws a solid line. The array should have a even length as any odd lengthed array could be expressed as a smaller even length array. This is used to create dashed lines." + }, + "strokeBorderWidth": { + "default": "null", + "labels": ["Data Line display"], + "type": "float", + "example": "1.0", + "description": "Draw a border around graph lines to make crossing lines more easily distinguishable. Useful for graphs with many lines." + }, + "strokeBorderColor": { + "default": "white", + "labels": ["Data Line display"], + "type": "string", + "example": "red, #ccffdd", + "description": "Color for the line border used if strokeBorderWidth is set." + }, + "wilsonInterval": { + "default": "true", + "labels": ["Error Bars"], + "type": "boolean", + "description": "Use in conjunction with the \"fractions\" option. Instead of plotting +/- N standard deviations, dygraphs will compute a Wilson confidence interval and plot that. This has more reasonable behavior for ratios close to 0 or 1." + }, + "fillGraph": { + "default": "false", + "labels": ["Data Line display"], + "type": "boolean", + "description": "Should the area underneath the graph be filled? This option is not compatible with error bars. This may be set on a per-series basis." + }, + "highlightCircleSize": { + "default": "3", + "labels": ["Interactive Elements"], + "type": "integer", + "description": "The size in pixels of the dot drawn over highlighted points." + }, + "gridLineColor": { + "default": "rgb(128,128,128)", + "labels": ["Grid"], + "type": "red, blue", + "description": "The color of the gridlines. This may be set on a per-axis basis to define each axis' grid separately." + }, + "gridLinePattern": { + "default": "null", + "labels": ["Grid"], + "type": "array", + "example": "[10, 2, 5, 2]", + "description": "A custom pattern array where the even index is a draw and odd is a space in pixels. If null then it draws a solid line. The array should have a even length as any odd lengthed array could be expressed as a smaller even length array. This is used to create dashed gridlines." + }, + "visibility": { + "default": "[true, true, ...]", + "labels": ["Data Line display"], + "type": "Array of booleans", + "description": "Which series should initially be visible? Once the Dygraph has been constructed, you can access and modify the visibility of each series using the visibility and setVisibility methods." + }, + "valueRange": { + "default": "Full range of the input is shown", + "labels": ["Axis display"], + "type": "Array of two numbers", + "example": "[10, 110]", + "description": "Explicitly set the vertical range of the graph to [low, high]. This may be set on a per-axis basis to define each y-axis separately. If either limit is unspecified, it will be calculated automatically (e.g. [null, 30] to automatically calculate just the lower bound)" + }, + "labelsDivWidth": { + "default": "250", + "labels": ["Legend"], + "type": "integer", + "description": "Width (in pixels) of the div which shows information on the currently-highlighted points." + }, + "colorSaturation": { + "default": "1.0", + "labels": ["Data Series Colors"], + "type": "float (0.0 - 1.0)", + "description": "If colors is not specified, saturation of the automatically-generated data series colors." + }, + "yAxisLabelWidth": { + "default": "", + "labels": ["Deprecated"], + "type": "integer", + "description": "Prefer axes { y: { axisLabelWidth } }" + }, + "hideOverlayOnMouseOut": { + "default": "true", + "labels": ["Interactive Elements", "Legend"], + "type": "boolean", + "description": "Whether to hide the legend when the mouse leaves the chart area." + }, + "yValueFormatter": { + "default": "", + "labels": ["Deprecated"], + "type": "", + "description": "Prefer axes: { y: { valueFormatter } }" + }, + "legend": { + "default": "onmouseover", + "labels": ["Legend"], + "type": "string", + "description": "When to display the legend. By default, it only appears when a user mouses over the chart. Set it to \"always\" to always display a legend of some sort. When set to \"follow\", legend follows highlighted points." + }, + "labelsShowZeroValues": { + "default": "true", + "labels": ["Legend"], + "type": "boolean", + "description": "Show zero value labels in the labelsDiv." + }, + "stepPlot": { + "default": "false", + "labels": ["Data Line display"], + "type": "boolean", + "description": "When set, display the graph as a step plot instead of a line plot. This option may either be set for the whole graph or for single series." + }, + "labelsUTC": { + "default": "false", + "labels": ["Value display/formatting", "Axis display"], + "type": "boolean", + "description": "Show date/time labels according to UTC (instead of local time)." + }, + "labelsKMB": { + "default": "false", + "labels": ["Value display/formatting"], + "type": "boolean", + "description": "Show K/M/B for thousands/millions/billions on y-axis." + }, + "rightGap": { + "default": "5", + "labels": ["Overall display"], + "type": "integer", + "description": "Number of pixels to leave blank at the right edge of the Dygraph. This makes it easier to highlight the right-most data point." + }, + "avoidMinZero": { + "default": "false", + "labels": ["Deprecated"], + "type": "boolean", + "description": "Deprecated, please use yRangePad instead. When set, the heuristic that fixes the Y axis at zero for a data set with the minimum Y value of zero is disabled. \nThis is particularly useful for data sets that contain many zero values, especially for step plots which may otherwise have lines not visible running along the bottom axis." + }, + "drawAxesAtZero": { + "default": "false", + "labels": ["Axis display"], + "type": "boolean", + "description": "When set, draw the X axis at the Y=0 position and the Y axis at the X=0 position if those positions are inside the graph's visible area. Otherwise, draw the axes at the bottom or left graph edge as usual." + }, + "xRangePad": { + "default": "0", + "labels": ["Axis display"], + "type": "float", + "description": "Add the specified amount of extra space (in pixels) around the X-axis value range to ensure points at the edges remain visible." + }, + "yRangePad": { + "default": "null", + "labels": ["Axis display"], + "type": "float", + "description": "If set, add the specified amount of extra space (in pixels) around the Y-axis value range to ensure points at the edges remain visible. If unset, use the traditional Y padding algorithm." + }, + "xAxisLabelFormatter": { + "default": "", + "labels": ["Deprecated"], + "type": "", + "description": "Prefer axes { x: { axisLabelFormatter } }" + }, + "axisLabelFormatter": { + "default": "Depends on the data type", + "labels": ["Axis display"], + "type": "function(number or Date, granularity, opts, dygraph)", + "parameters": [ + [ "number or date" , "Either a number (for a numeric axis) or a Date object (for a date axis)" ], + [ "granularity" , "specifies how fine-grained the axis is. For date axes, this is a reference to the time granularity enumeration, defined in dygraph-tickers.js, e.g. Dygraph.WEEKLY." ], + [ "opts" , "a function which provides access to various options on the dygraph, e.g. opts('labelsKMB')." ], + [ "dygraph" , "the referenced graph" ] + ], + "description": "Function to call to format the tick values that appear along an axis. This is usually set on a per-axis basis." + }, + "clickCallback": { + "snippet": "function(e, date_millis){
      alert(new Date(date_millis));
    }", + "default": "null", + "labels": ["Callbacks"], + "type": "function(e, x, points)", + "parameters": [ + [ "e" , "The event object for the click" ], + [ "x" , "The x value that was clicked (for dates, this is milliseconds since epoch)" ], + [ "points" , "The closest points along that date. See Point properties for details." ] + ], + "description": "A function to call when the canvas is clicked." + }, + "yAxisLabelFormatter": { + "default": "", + "labels": ["Deprecated"], + "type": "", + "description": "Prefer axes: { y: { axisLabelFormatter } }" + }, + "labels": { + "default": "[\"X\", \"Y1\", \"Y2\", ...]*", + "labels": ["Legend"], + "type": "array", + "description": "A name for each data series, including the independent (X) series. For CSV files and DataTable objections, this is determined by context. For raw data, this must be specified. If it is not, default values are supplied and a warning is logged." + }, + "dateWindow": { + "default": "Full range of the input is shown", + "labels": ["Axis display"], + "type": "Array of two numbers", + "example": "[
      Date.parse('2006-01-01'),
      (new Date()).valueOf()
    ]", + "description": "Initially zoom in on a section of the graph. Is of the form [earliest, latest], where earliest/latest are milliseconds since epoch. If the data for the x-axis is numeric, the values in dateWindow must also be numbers." + }, + "showRoller": { + "default": "false", + "labels": ["Interactive Elements", "Rolling Averages"], + "type": "boolean", + "description": "If the rolling average period text box should be shown." + }, + "sigma": { + "default": "2.0", + "labels": ["Error Bars"], + "type": "float", + "description": "When errorBars is set, shade this many standard deviations above/below each point." + }, + "customBars": { + "default": "false", + "labels": ["CSV parsing", "Error Bars"], + "type": "boolean", + "description": "When set, parse each CSV cell as \"low;middle;high\". Error bars will be drawn for each point between low and high, with the series itself going through middle." + }, + "colorValue": { + "default": "1.0", + "labels": ["Data Series Colors"], + "type": "float (0.0 - 1.0)", + "description": "If colors is not specified, value of the data series colors, as in hue/saturation/value. (0.0-1.0, default 0.5)" + }, + "errorBars": { + "default": "false", + "labels": ["CSV parsing", "Error Bars"], + "type": "boolean", + "description": "Does the data contain standard deviations? Setting this to true alters the input format (see above)." + }, + "displayAnnotations": { + "default": "false", + "labels": ["Annotations"], + "type": "boolean", + "description": "Only applies when Dygraphs is used as a GViz chart. Causes string columns following a data series to be interpreted as annotations on points in that series. This is the same format used by Google's AnnotatedTimeLine chart." + }, + "panEdgeFraction": { + "default": "null", + "labels": ["Axis display", "Interactive Elements"], + "type": "float", + "description": "A value representing the farthest a graph may be panned, in percent of the display. For example, a value of 0.1 means that the graph can only be panned 10% pased the edges of the displayed values. null means no bounds." + }, + "title": { + "labels": ["Chart labels"], + "type": "string", + "default": "null", + "description": "Text to display above the chart. You can supply any HTML for this value, not just text. If you wish to style it using CSS, use the 'dygraph-label' or 'dygraph-title' classes." + }, + "titleHeight": { + "default": "18", + "labels": ["Chart labels"], + "type": "integer", + "description": "Height of the chart title, in pixels. This also controls the default font size of the title. If you style the title on your own, this controls how much space is set aside above the chart for the title's div." + }, + "xlabel": { + "labels": ["Chart labels"], + "type": "string", + "default": "null", + "description": "Text to display below the chart's x-axis. You can supply any HTML for this value, not just text. If you wish to style it using CSS, use the 'dygraph-label' or 'dygraph-xlabel' classes." + }, + "xLabelHeight": { + "labels": ["Chart labels"], + "type": "integer", + "default": "18", + "description": "Height of the x-axis label, in pixels. This also controls the default font size of the x-axis label. If you style the label on your own, this controls how much space is set aside below the chart for the x-axis label's div." + }, + "ylabel": { + "labels": ["Chart labels"], + "type": "string", + "default": "null", + "description": "Text to display to the left of the chart's y-axis. You can supply any HTML for this value, not just text. If you wish to style it using CSS, use the 'dygraph-label' or 'dygraph-ylabel' classes. The text will be rotated 90 degrees by default, so CSS rules may behave in unintuitive ways. No additional space is set aside for a y-axis label. If you need more space, increase the width of the y-axis tick labels using the yAxisLabelWidth option. If you need a wider div for the y-axis label, either style it that way with CSS (but remember that it's rotated, so width is controlled by the 'height' property) or set the yLabelWidth option." + }, + "y2label": { + "labels": ["Chart labels"], + "type": "string", + "default": "null", + "description": "Text to display to the right of the chart's secondary y-axis. This label is only displayed if a secondary y-axis is present. See this test for an example of how to do this. The comments for the 'ylabel' option generally apply here as well. This label gets a 'dygraph-y2label' instead of a 'dygraph-ylabel' class." + }, + "yLabelWidth": { + "labels": ["Chart labels"], + "type": "integer", + "default": "18", + "description": "Width of the div which contains the y-axis label. Since the y-axis label appears rotated 90 degrees, this actually affects the height of its div." + }, + "isZoomedIgnoreProgrammaticZoom" : { + "default": "false", + "labels": ["Zooming"], + "type": "boolean", + "description" : "When this option is passed to updateOptions() along with either the dateWindow or valueRange options, the zoom flags are not changed to reflect a zoomed state. This is primarily useful for when the display area of a chart is changed programmatically and also where manual zooming is allowed and use is made of the isZoomed method to determine this." + }, + "drawXGrid": { + "default": "true", + "labels": ["Grid","Deprecated"], + "type": "boolean", + "description" : "Use the per-axis option drawGrid instead. Whether to display vertical gridlines under the chart." + }, + "drawYGrid": { + "default": "true", + "labels": ["Grid","Deprecated"], + "type": "boolean", + "description" : "Use the per-axis option drawGrid instead. Whether to display horizontal gridlines under the chart." + }, + "drawGrid": { + "default": "true for x and y, false for y2", + "labels": ["Grid"], + "type": "boolean", + "description" : "Whether to display gridlines in the chart. This may be set on a per-axis basis to define the visibility of each axis' grid separately." + }, + "independentTicks": { + "default": "true for y, false for y2", + "labels": ["Axis display", "Grid"], + "type": "boolean", + "description" : "Only valid for y and y2, has no effect on x: This option defines whether the y axes should align their ticks or if they should be independent. Possible combinations: 1.) y=true, y2=false (default): y is the primary axis and the y2 ticks are aligned to the the ones of y. (only 1 grid) 2.) y=false, y2=true: y2 is the primary axis and the y ticks are aligned to the the ones of y2. (only 1 grid) 3.) y=true, y2=true: Both axis are independent and have their own ticks. (2 grids) 4.) y=false, y2=false: Invalid configuration causes an error." + }, + "drawXAxis": { + "default": "true", + "labels": ["Axis display"], + "type": "boolean", + "description" : "Deprecated. Use axes : { x : { drawAxis } }." + }, + "drawYAxis": { + "default": "true", + "labels": ["Axis display"], + "type": "boolean", + "description" : "Deprecated. Use axes : { y : { drawAxis } }." + }, + "drawAxis": { + "default": "true for x and y, false for y2", + "labels": ["Axis display"], + "type": "boolean", + "description" : "Whether to draw the specified axis. This may be set on a per-axis basis to define the visibility of each axis separately. Setting this to false also prevents axis ticks from being drawn and reclaims the space for the chart grid/lines." + }, + "gridLineWidth": { + "default": "0.3", + "labels": ["Grid"], + "type": "float", + "description" : "Thickness (in pixels) of the gridlines drawn under the chart. The vertical/horizontal gridlines can be turned off entirely by using the drawXGrid and drawYGrid options. This may be set on a per-axis basis to define each axis' grid separately." + }, + "axisLineWidth": { + "default": "0.3", + "labels": ["Axis display"], + "type": "float", + "description" : "Thickness (in pixels) of the x- and y-axis lines." + }, + "axisLineColor": { + "default": "black", + "labels": ["Axis display"], + "type": "string", + "description" : "Color of the x- and y-axis lines. Accepts any value which the HTML canvas strokeStyle attribute understands, e.g. 'black' or 'rgb(0, 100, 255)'." + }, + "fillAlpha": { + "default": "0.15", + "labels": ["Error Bars", "Data Series Colors"], + "type": "float (0.0 - 1.0)", + "description" : "Error bars (or custom bars) for each series are drawn in the same color as the series, but with partial transparency. This sets the transparency. A value of 0.0 means that the error bars will not be drawn, whereas a value of 1.0 means that the error bars will be as dark as the line for the series itself. This can be used to produce chart lines whose thickness varies at each point." + }, + "axisLabelColor": { + "default": "black", + "labels": ["Axis display"], + "type": "string", + "description" : "Color for x- and y-axis labels. This is a CSS color string." + }, + "axisLabelWidth": { + "default": "50 (y-axis), 60 (x-axis)", + "labels": ["Axis display", "Chart labels"], + "type": "integer", + "description" : "Width (in pixels) of the containing divs for x- and y-axis labels. For the y-axis, this also controls the width of the y-axis. Note that for the x-axis, this is independent from pixelsPerLabel, which controls the spacing between labels." + }, + "sigFigs" : { + "default": "null", + "labels": ["Value display/formatting"], + "type": "integer", + "description": "By default, dygraphs displays numbers with a fixed number of digits after the decimal point. If you'd prefer to have a fixed number of significant figures, set this option to that number of sig figs. A value of 2, for instance, would cause 1 to be display as 1.0 and 1234 to be displayed as 1.23e+3." + }, + "digitsAfterDecimal" : { + "default": "2", + "labels": ["Value display/formatting"], + "type": "integer", + "description": "Unless it's run in scientific mode (see the sigFigs option), dygraphs displays numbers with digitsAfterDecimal digits after the decimal point. Trailing zeros are not displayed, so with a value of 2 you'll get '0', '0.1', '0.12', '123.45' but not '123.456' (it will be rounded to '123.46'). Numbers with absolute value less than 0.1^digitsAfterDecimal (i.e. those which would show up as '0.00') will be displayed in scientific notation." + }, + "maxNumberWidth" : { + "default": "6", + "labels": ["Value display/formatting"], + "type": "integer", + "description": "When displaying numbers in normal (not scientific) mode, large numbers will be displayed with many trailing zeros (e.g. 100000000 instead of 1e9). This can lead to unwieldy y-axis labels. If there are more than maxNumberWidth digits to the left of the decimal in a number, dygraphs will switch to scientific notation, even when not operating in scientific mode. If you'd like to see all those digits, set this to something large, like 20 or 30." + }, + "file": { + "default": "(set when constructed)", + "labels": ["Data"], + "type": "string (URL of CSV or CSV), GViz DataTable or 2D Array", + "description": "Sets the data being displayed in the chart. This can only be set when calling updateOptions; it cannot be set from the constructor. For a full description of valid data formats, see the Data Formats page." + }, + "timingName": { + "default": "null", + "labels": [ "Debugging" ], + "type": "string", + "description": "Set this option to log timing information. The value of the option will be logged along with the timimg, so that you can distinguish multiple dygraphs on the same page." + }, + "showRangeSelector": { + "default": "false", + "labels": ["Interactive Elements"], + "type": "boolean", + "description": "Show or hide the range selector widget." + }, + "rangeSelectorHeight": { + "default": "40", + "labels": ["Interactive Elements"], + "type": "integer", + "description": "Height, in pixels, of the range selector widget. This option can only be specified at Dygraph creation time." + }, + "rangeSelectorPlotStrokeColor": { + "default": "#808FAB", + "labels": ["Interactive Elements"], + "type": "string", + "description": "The range selector mini plot stroke color. This can be of the form \"#AABBCC\" or \"rgb(255,100,200)\" or \"yellow\". You can also specify null or \"\" to turn off stroke." + }, + "rangeSelectorPlotFillColor": { + "default": "#A7B1C4", + "labels": ["Interactive Elements"], + "type": "string", + "description": "The range selector mini plot fill color. This can be of the form \"#AABBCC\" or \"rgb(255,100,200)\" or \"yellow\". You can also specify null or \"\" to turn off fill." + }, + "showInRangeSelector": { + "default": "null", + "labels": ["Interactive Elements"], + "type": "boolean", + "description": "Mark this series for inclusion in the range selector. The mini plot curve will be an average of all such series. If this is not specified for any series, the default behavior is to average all the series. Setting it for one series will result in that series being charted alone in the range selector." + }, + "animatedZooms": { + "default": "false", + "labels": ["Interactive Elements"], + "type": "boolean", + "description": "Set this option to animate the transition between zoom windows. Applies to programmatic and interactive zooms. Note that if you also set a drawCallback, it will be called several times on each zoom. If you set a zoomCallback, it will only be called after the animation is complete." + }, + "plotter": { + "default": "[DygraphCanvasRenderer.Plotters.fillPlotter, DygraphCanvasRenderer.Plotters.errorPlotter, DygraphCanvasRenderer.Plotters.linePlotter]", + "labels": ["Data Line display"], + "type": "array or function", + "description": "A function (or array of functions) which plot each data series on the chart. TODO(danvk): more details! May be set per-series." + }, + "axes": { + "default": "null", + "labels": ["Configuration"], + "type": "Object", + "description": "Defines per-axis options. Valid keys are 'x', 'y' and 'y2'. Only some options may be set on a per-axis basis. If an option may be set in this way, it will be noted on this page. See also documentation on per-series and per-axis options." + }, + "series": { + "default": "null", + "labels": ["Series"], + "type": "Object", + "description": "Defines per-series options. Its keys match the y-axis label names, and the values are dictionaries themselves that contain options specific to that series. When this option is missing, it falls back on the old-style of per-series options comingled with global options." + }, + "plugins": { + "default": "[]", + "labels": ["Configuration"], + "type": "Array", + "description": "Defines per-graph plugins. Useful for per-graph customization" + }, + "dataHandler": { + "default": "(depends on data)", + "labels": ["Data"], + "type": "Dygraph.DataHandler", + "description": "Custom DataHandler. This is an advanced customization. See http://bit.ly/151E7Aq." + } +} +; //
    +// NOTE: in addition to parsing as JS, this snippet is expected to be valid +// JSON. This assumption cannot be checked in JS, but it will be checked when +// documentation is generated by the generate-documentation.py script. For the +// most part, this just means that you should always use double quotes. + +// Do a quick sanity check on the options reference. +(function() { + "use strict"; + var warn = function(msg) { if (window.console) window.console.warn(msg); }; + var flds = ['type', 'default', 'description']; + var valid_cats = [ + 'Annotations', + 'Axis display', + 'Chart labels', + 'CSV parsing', + 'Callbacks', + 'Data', + 'Data Line display', + 'Data Series Colors', + 'Error Bars', + 'Grid', + 'Interactive Elements', + 'Legend', + 'Overall display', + 'Rolling Averages', + 'Series', + 'Value display/formatting', + 'Zooming', + 'Debugging', + 'Configuration', + 'Deprecated' + ]; + var i; + var cats = {}; + for (i = 0; i < valid_cats.length; i++) cats[valid_cats[i]] = true; + + for (var k in Dygraph.OPTIONS_REFERENCE) { + if (!Dygraph.OPTIONS_REFERENCE.hasOwnProperty(k)) continue; + var op = Dygraph.OPTIONS_REFERENCE[k]; + for (i = 0; i < flds.length; i++) { + if (!op.hasOwnProperty(flds[i])) { + warn('Option ' + k + ' missing "' + flds[i] + '" property'); + } else if (typeof(op[flds[i]]) != 'string') { + warn(k + '.' + flds[i] + ' must be of type string'); + } + } + var labels = op.labels; + if (typeof(labels) !== 'object') { + warn('Option "' + k + '" is missing a "labels": [...] option'); + } else { + for (i = 0; i < labels.length; i++) { + if (!cats.hasOwnProperty(labels[i])) { + warn('Option "' + k + '" has label "' + labels[i] + + '", which is invalid.'); + } + } + } + } +})(); +/** + * @license + * Copyright 2013 David Eberlein (david.eberlein@ch.sauter-bc.com) + * MIT-licensed (http://opensource.org/licenses/MIT) + */ + +/** + * @fileoverview This file contains the managment of data handlers + * @author David Eberlein (david.eberlein@ch.sauter-bc.com) + * + * The idea is to define a common, generic data format that works for all data + * structures supported by dygraphs. To make this possible, the DataHandler + * interface is introduced. This makes it possible, that dygraph itself can work + * with the same logic for every data type independent of the actual format and + * the DataHandler takes care of the data format specific jobs. + * DataHandlers are implemented for all data types supported by Dygraphs and + * return Dygraphs compliant formats. + * By default the correct DataHandler is chosen based on the options set. + * Optionally the user may use his own DataHandler (similar to the plugin + * system). + * + * + * The unified data format returend by each handler is defined as so: + * series[n][point] = [x,y,(extras)] + * + * This format contains the common basis that is needed to draw a simple line + * series extended by optional extras for more complex graphing types. It + * contains a primitive x value as first array entry, a primitive y value as + * second array entry and an optional extras object for additional data needed. + * + * x must always be a number. + * y must always be a number, NaN of type number or null. + * extras is optional and must be interpreted by the DataHandler. It may be of + * any type. + * + * In practice this might look something like this: + * default: [x, yVal] + * errorBar / customBar: [x, yVal, [yTopVariance, yBottomVariance] ] + * + */ +/*global Dygraph:false */ +/*global DygraphLayout:false */ + +/** + * + * The data handler is responsible for all data specific operations. All of the + * series data it receives and returns is always in the unified data format. + * Initially the unified data is created by the extractSeries method + * @constructor + */ +Dygraph.DataHandler = function () { +}; + +/** + * A collection of functions to create and retrieve data handlers. + * @type {Object.} + */ +Dygraph.DataHandlers = {}; + +(function() { + +"use strict"; + +var handler = Dygraph.DataHandler; + +/** + * X-value array index constant for unified data samples. + * @const + * @type {number} + */ +handler.X = 0; + +/** + * Y-value array index constant for unified data samples. + * @const + * @type {number} + */ +handler.Y = 1; + +/** + * Extras-value array index constant for unified data samples. + * @const + * @type {number} + */ +handler.EXTRAS = 2; + +/** + * Extracts one series from the raw data (a 2D array) into an array of the + * unified data format. + * This is where undesirable points (i.e. negative values on log scales and + * missing values through which we wish to connect lines) are dropped. + * TODO(danvk): the "missing values" bit above doesn't seem right. + * + * @param {!Array.} rawData The raw data passed into dygraphs where + * rawData[i] = [x,ySeries1,...,ySeriesN]. + * @param {!number} seriesIndex Index of the series to extract. All other + * series should be ignored. + * @param {!DygraphOptions} options Dygraph options. + * @return {Array.<[!number,?number,?]>} The series in the unified data format + * where series[i] = [x,y,{extras}]. + */ +handler.prototype.extractSeries = function(rawData, seriesIndex, options) { +}; + +/** + * Converts a series to a Point array. The resulting point array must be + * returned in increasing order of idx property. + * + * @param {!Array.<[!number,?number,?]>} series The series in the unified + * data format where series[i] = [x,y,{extras}]. + * @param {!string} setName Name of the series. + * @param {!number} boundaryIdStart Index offset of the first point, equal to the + * number of skipped points left of the date window minimum (if any). + * @return {!Array.} List of points for this series. + */ +handler.prototype.seriesToPoints = function(series, setName, boundaryIdStart) { + // TODO(bhs): these loops are a hot-spot for high-point-count charts. In + // fact, + // on chrome+linux, they are 6 times more expensive than iterating through + // the + // points and drawing the lines. The brunt of the cost comes from allocating + // the |point| structures. + var points = []; + for ( var i = 0; i < series.length; ++i) { + var item = series[i]; + var yraw = item[1]; + var yval = yraw === null ? null : handler.parseFloat(yraw); + var point = { + x : NaN, + y : NaN, + xval : handler.parseFloat(item[0]), + yval : yval, + name : setName, // TODO(danvk): is this really necessary? + idx : i + boundaryIdStart + }; + points.push(point); + } + this.onPointsCreated_(series, points); + return points; +}; + +/** + * Callback called for each series after the series points have been generated + * which will later be used by the plotters to draw the graph. + * Here data may be added to the seriesPoints which is needed by the plotters. + * The indexes of series and points are in sync meaning the original data + * sample for series[i] is points[i]. + * + * @param {!Array.<[!number,?number,?]>} series The series in the unified + * data format where series[i] = [x,y,{extras}]. + * @param {!Array.} points The corresponding points passed + * to the plotter. + * @protected + */ +handler.prototype.onPointsCreated_ = function(series, points) { +}; + +/** + * Calculates the rolling average of a data set. + * + * @param {!Array.<[!number,?number,?]>} series The series in the unified + * data format where series[i] = [x,y,{extras}]. + * @param {!number} rollPeriod The number of points over which to average the data + * @param {!DygraphOptions} options The dygraph options. + * @return {!Array.<[!number,?number,?]>} the rolled series. + */ +handler.prototype.rollingAverage = function(series, rollPeriod, options) { +}; + +/** + * Computes the range of the data series (including confidence intervals). + * + * @param {!Array.<[!number,?number,?]>} series The series in the unified + * data format where series[i] = [x, y, {extras}]. + * @param {!Array.} dateWindow The x-value range to display with + * the format: [min, max]. + * @param {!DygraphOptions} options The dygraph options. + * @return {Array.} The low and high extremes of the series in the + * given window with the format: [low, high]. + */ +handler.prototype.getExtremeYValues = function(series, dateWindow, options) { +}; + +/** + * Callback called for each series after the layouting data has been + * calculated before the series is drawn. Here normalized positioning data + * should be calculated for the extras of each point. + * + * @param {!Array.} points The points passed to + * the plotter. + * @param {!Object} axis The axis on which the series will be plotted. + * @param {!boolean} logscale Weather or not to use a logscale. + */ +handler.prototype.onLineEvaluated = function(points, axis, logscale) { +}; + +/** + * Helper method that computes the y value of a line defined by the points p1 + * and p2 and a given x value. + * + * @param {!Array.} p1 left point ([x,y]). + * @param {!Array.} p2 right point ([x,y]). + * @param {!number} xValue The x value to compute the y-intersection for. + * @return {number} corresponding y value to x on the line defined by p1 and p2. + * @private + */ +handler.prototype.computeYInterpolation_ = function(p1, p2, xValue) { + var deltaY = p2[1] - p1[1]; + var deltaX = p2[0] - p1[0]; + var gradient = deltaY / deltaX; + var growth = (xValue - p1[0]) * gradient; + return p1[1] + growth; +}; + +/** + * Helper method that returns the first and the last index of the given series + * that lie inside the given dateWindow. + * + * @param {!Array.<[!number,?number,?]>} series The series in the unified + * data format where series[i] = [x,y,{extras}]. + * @param {!Array.} dateWindow The x-value range to display with + * the format: [min,max]. + * @return {!Array.<[!number,?number,?]>} The samples of the series that + * are in the given date window. + * @private + */ +handler.prototype.getIndexesInWindow_ = function(series, dateWindow) { + var firstIdx = 0, lastIdx = series.length - 1; + if (dateWindow) { + var idx = 0; + var low = dateWindow[0]; + var high = dateWindow[1]; + + // Start from each side of the array to minimize the performance + // needed. + while (idx < series.length - 1 && series[idx][0] < low) { + firstIdx++; + idx++; + } + idx = series.length - 1; + while (idx > 0 && series[idx][0] > high) { + lastIdx--; + idx--; + } + } + if (firstIdx <= lastIdx) { + return [ firstIdx, lastIdx ]; + } else { + return [ 0, series.length - 1 ]; + } +}; + +/** + * Optimized replacement for parseFloat, which was way too slow when almost + * all values were type number, with few edge cases, none of which were strings. + * @param {?number} val + * @return {number} + * @protected + */ +handler.parseFloat = function(val) { + // parseFloat(null) is NaN + if (val === null) { + return NaN; + } + + // Assume it's a number or NaN. If it's something else, I'll be shocked. + return val; +}; + +})(); +/** + * @license + * Copyright 2013 David Eberlein (david.eberlein@ch.sauter-bc.com) + * MIT-licensed (http://opensource.org/licenses/MIT) + */ + +/** + * @fileoverview DataHandler default implementation used for simple line charts. + * @author David Eberlein (david.eberlein@ch.sauter-bc.com) + */ + +(function() { + +/*global Dygraph:false */ +"use strict"; + +/** + * @constructor + * @extends Dygraph.DataHandler + */ +Dygraph.DataHandlers.DefaultHandler = function() { +}; + +var DefaultHandler = Dygraph.DataHandlers.DefaultHandler; +DefaultHandler.prototype = new Dygraph.DataHandler(); + +/** @inheritDoc */ +DefaultHandler.prototype.extractSeries = function(rawData, i, options) { + // TODO(danvk): pre-allocate series here. + var series = []; + var logScale = options.get('logscale'); + for ( var j = 0; j < rawData.length; j++) { + var x = rawData[j][0]; + var point = rawData[j][i]; + if (logScale) { + // On the log scale, points less than zero do not exist. + // This will create a gap in the chart. + if (point <= 0) { + point = null; + } + } + series.push([ x, point ]); + } + return series; +}; + +/** @inheritDoc */ +DefaultHandler.prototype.rollingAverage = function(originalData, rollPeriod, + options) { + rollPeriod = Math.min(rollPeriod, originalData.length); + var rollingData = []; + + var i, j, y, sum, num_ok; + // Calculate the rolling average for the first rollPeriod - 1 points + // where + // there is not enough data to roll over the full number of points + if (rollPeriod == 1) { + return originalData; + } + for (i = 0; i < originalData.length; i++) { + sum = 0; + num_ok = 0; + for (j = Math.max(0, i - rollPeriod + 1); j < i + 1; j++) { + y = originalData[j][1]; + if (y === null || isNaN(y)) + continue; + num_ok++; + sum += originalData[j][1]; + } + if (num_ok) { + rollingData[i] = [ originalData[i][0], sum / num_ok ]; + } else { + rollingData[i] = [ originalData[i][0], null ]; + } + } + + return rollingData; +}; + +/** @inheritDoc */ +DefaultHandler.prototype.getExtremeYValues = function(series, dateWindow, + options) { + var minY = null, maxY = null, y; + var firstIdx = 0, lastIdx = series.length - 1; + + for ( var j = firstIdx; j <= lastIdx; j++) { + y = series[j][1]; + if (y === null || isNaN(y)) + continue; + if (maxY === null || y > maxY) { + maxY = y; + } + if (minY === null || y < minY) { + minY = y; + } + } + return [ minY, maxY ]; +}; + +})(); +/** + * @license + * Copyright 2013 David Eberlein (david.eberlein@ch.sauter-bc.com) + * MIT-licensed (http://opensource.org/licenses/MIT) + */ + +/** + * @fileoverview DataHandler implementation for the fractions option. + * @author David Eberlein (david.eberlein@ch.sauter-bc.com) + */ + +(function() { + +/*global Dygraph:false */ +"use strict"; + +/** + * @extends Dygraph.DataHandlers.DefaultHandler + * @constructor + */ +Dygraph.DataHandlers.DefaultFractionHandler = function() { +}; + +var DefaultFractionHandler = Dygraph.DataHandlers.DefaultFractionHandler; +DefaultFractionHandler.prototype = new Dygraph.DataHandlers.DefaultHandler(); + +DefaultFractionHandler.prototype.extractSeries = function(rawData, i, options) { + // TODO(danvk): pre-allocate series here. + var series = []; + var x, y, point, num, den, value; + var mult = 100.0; + var logScale = options.get('logscale'); + for ( var j = 0; j < rawData.length; j++) { + x = rawData[j][0]; + point = rawData[j][i]; + if (logScale && point !== null) { + // On the log scale, points less than zero do not exist. + // This will create a gap in the chart. + if (point[0] <= 0 || point[1] <= 0) { + point = null; + } + } + // Extract to the unified data format. + if (point !== null) { + num = point[0]; + den = point[1]; + if (num !== null && !isNaN(num)) { + value = den ? num / den : 0.0; + y = mult * value; + // preserve original values in extras for further filtering + series.push([ x, y, [ num, den ] ]); + } else { + series.push([ x, num, [ num, den ] ]); + } + } else { + series.push([ x, null, [ null, null ] ]); + } + } + return series; +}; + +DefaultFractionHandler.prototype.rollingAverage = function(originalData, rollPeriod, + options) { + rollPeriod = Math.min(rollPeriod, originalData.length); + var rollingData = []; + + var i; + var num = 0; + var den = 0; // numerator/denominator + var mult = 100.0; + for (i = 0; i < originalData.length; i++) { + num += originalData[i][2][0]; + den += originalData[i][2][1]; + if (i - rollPeriod >= 0) { + num -= originalData[i - rollPeriod][2][0]; + den -= originalData[i - rollPeriod][2][1]; + } + + var date = originalData[i][0]; + var value = den ? num / den : 0.0; + rollingData[i] = [ date, mult * value ]; + } + + return rollingData; +}; + +})(); +/** + * @license + * Copyright 2013 David Eberlein (david.eberlein@ch.sauter-bc.com) + * MIT-licensed (http://opensource.org/licenses/MIT) + */ + +/** + * @fileoverview DataHandler base implementation for the "bar" + * data formats. This implementation must be extended and the + * extractSeries and rollingAverage must be implemented. + * @author David Eberlein (david.eberlein@ch.sauter-bc.com) + */ + +(function() { + +/*global Dygraph:false */ +/*global DygraphLayout:false */ +"use strict"; + +/** + * @constructor + * @extends {Dygraph.DataHandler} + */ +Dygraph.DataHandlers.BarsHandler = function() { + Dygraph.DataHandler.call(this); +}; +Dygraph.DataHandlers.BarsHandler.prototype = new Dygraph.DataHandler(); + +// alias for the rest of the implementation +var BarsHandler = Dygraph.DataHandlers.BarsHandler; + +// TODO(danvk): figure out why the jsdoc has to be copy/pasted from superclass. +// (I get closure compiler errors if this isn't here.) +/** + * @override + * @param {!Array.} rawData The raw data passed into dygraphs where + * rawData[i] = [x,ySeries1,...,ySeriesN]. + * @param {!number} seriesIndex Index of the series to extract. All other + * series should be ignored. + * @param {!DygraphOptions} options Dygraph options. + * @return {Array.<[!number,?number,?]>} The series in the unified data format + * where series[i] = [x,y,{extras}]. + */ +BarsHandler.prototype.extractSeries = function(rawData, seriesIndex, options) { + // Not implemented here must be extended +}; + +/** + * @override + * @param {!Array.<[!number,?number,?]>} series The series in the unified + * data format where series[i] = [x,y,{extras}]. + * @param {!number} rollPeriod The number of points over which to average the data + * @param {!DygraphOptions} options The dygraph options. + * TODO(danvk): be more specific than "Array" here. + * @return {!Array.<[!number,?number,?]>} the rolled series. + */ +BarsHandler.prototype.rollingAverage = + function(series, rollPeriod, options) { + // Not implemented here, must be extended. +}; + +/** @inheritDoc */ +BarsHandler.prototype.onPointsCreated_ = function(series, points) { + for (var i = 0; i < series.length; ++i) { + var item = series[i]; + var point = points[i]; + point.y_top = NaN; + point.y_bottom = NaN; + point.yval_minus = Dygraph.DataHandler.parseFloat(item[2][0]); + point.yval_plus = Dygraph.DataHandler.parseFloat(item[2][1]); + } +}; + +/** @inheritDoc */ +BarsHandler.prototype.getExtremeYValues = function(series, dateWindow, options) { + var minY = null, maxY = null, y; + + var firstIdx = 0; + var lastIdx = series.length - 1; + + for ( var j = firstIdx; j <= lastIdx; j++) { + y = series[j][1]; + if (y === null || isNaN(y)) continue; + + var low = series[j][2][0]; + var high = series[j][2][1]; + + if (low > y) low = y; // this can happen with custom bars, + if (high < y) high = y; // e.g. in tests/custom-bars.html + + if (maxY === null || high > maxY) maxY = high; + if (minY === null || low < minY) minY = low; + } + + return [ minY, maxY ]; +}; + +/** @inheritDoc */ +BarsHandler.prototype.onLineEvaluated = function(points, axis, logscale) { + var point; + for (var j = 0; j < points.length; j++) { + // Copy over the error terms + point = points[j]; + point.y_top = DygraphLayout.calcYNormal_(axis, point.yval_minus, logscale); + point.y_bottom = DygraphLayout.calcYNormal_(axis, point.yval_plus, logscale); + } +}; + +})(); +/** + * @license + * Copyright 2013 David Eberlein (david.eberlein@ch.sauter-bc.com) + * MIT-licensed (http://opensource.org/licenses/MIT) + */ + +/** + * @fileoverview DataHandler implementation for the custom bars option. + * @author David Eberlein (david.eberlein@ch.sauter-bc.com) + */ + +(function() { + +/*global Dygraph:false */ +"use strict"; + +/** + * @constructor + * @extends Dygraph.DataHandlers.BarsHandler + */ +Dygraph.DataHandlers.CustomBarsHandler = function() { +}; + +var CustomBarsHandler = Dygraph.DataHandlers.CustomBarsHandler; +CustomBarsHandler.prototype = new Dygraph.DataHandlers.BarsHandler(); + +/** @inheritDoc */ +CustomBarsHandler.prototype.extractSeries = function(rawData, i, options) { + // TODO(danvk): pre-allocate series here. + var series = []; + var x, y, point; + var logScale = options.get('logscale'); + for ( var j = 0; j < rawData.length; j++) { + x = rawData[j][0]; + point = rawData[j][i]; + if (logScale && point !== null) { + // On the log scale, points less than zero do not exist. + // This will create a gap in the chart. + if (point[0] <= 0 || point[1] <= 0 || point[2] <= 0) { + point = null; + } + } + // Extract to the unified data format. + if (point !== null) { + y = point[1]; + if (y !== null && !isNaN(y)) { + series.push([ x, y, [ point[0], point[2] ] ]); + } else { + series.push([ x, y, [ y, y ] ]); + } + } else { + series.push([ x, null, [ null, null ] ]); + } + } + return series; +}; + +/** @inheritDoc */ +CustomBarsHandler.prototype.rollingAverage = + function(originalData, rollPeriod, options) { + rollPeriod = Math.min(rollPeriod, originalData.length); + var rollingData = []; + var y, low, high, mid,count, i, extremes; + + low = 0; + mid = 0; + high = 0; + count = 0; + for (i = 0; i < originalData.length; i++) { + y = originalData[i][1]; + extremes = originalData[i][2]; + rollingData[i] = originalData[i]; + + if (y !== null && !isNaN(y)) { + low += extremes[0]; + mid += y; + high += extremes[1]; + count += 1; + } + if (i - rollPeriod >= 0) { + var prev = originalData[i - rollPeriod]; + if (prev[1] !== null && !isNaN(prev[1])) { + low -= prev[2][0]; + mid -= prev[1]; + high -= prev[2][1]; + count -= 1; + } + } + if (count) { + rollingData[i] = [ + originalData[i][0], + 1.0 * mid / count, + [ 1.0 * low / count, + 1.0 * high / count ] ]; + } else { + rollingData[i] = [ originalData[i][0], null, [ null, null ] ]; + } + } + + return rollingData; +}; + +})(); +/** + * @license + * Copyright 2013 David Eberlein (david.eberlein@ch.sauter-bc.com) + * MIT-licensed (http://opensource.org/licenses/MIT) + */ + +/** + * @fileoverview DataHandler implementation for the error bars option. + * @author David Eberlein (david.eberlein@ch.sauter-bc.com) + */ + +(function() { + +/*global Dygraph:false */ +"use strict"; + +/** + * @constructor + * @extends Dygraph.DataHandlers.BarsHandler + */ +Dygraph.DataHandlers.ErrorBarsHandler = function() { +}; + +var ErrorBarsHandler = Dygraph.DataHandlers.ErrorBarsHandler; +ErrorBarsHandler.prototype = new Dygraph.DataHandlers.BarsHandler(); + +/** @inheritDoc */ +ErrorBarsHandler.prototype.extractSeries = function(rawData, i, options) { + // TODO(danvk): pre-allocate series here. + var series = []; + var x, y, variance, point; + var sigma = options.get("sigma"); + var logScale = options.get('logscale'); + for ( var j = 0; j < rawData.length; j++) { + x = rawData[j][0]; + point = rawData[j][i]; + if (logScale && point !== null) { + // On the log scale, points less than zero do not exist. + // This will create a gap in the chart. + if (point[0] <= 0 || point[0] - sigma * point[1] <= 0) { + point = null; + } + } + // Extract to the unified data format. + if (point !== null) { + y = point[0]; + if (y !== null && !isNaN(y)) { + variance = sigma * point[1]; + // preserve original error value in extras for further + // filtering + series.push([ x, y, [ y - variance, y + variance, point[1] ] ]); + } else { + series.push([ x, y, [ y, y, y ] ]); + } + } else { + series.push([ x, null, [ null, null, null ] ]); + } + } + return series; +}; + +/** @inheritDoc */ +ErrorBarsHandler.prototype.rollingAverage = + function(originalData, rollPeriod, options) { + rollPeriod = Math.min(rollPeriod, originalData.length); + var rollingData = []; + var sigma = options.get("sigma"); + + var i, j, y, v, sum, num_ok, stddev, variance, value; + + // Calculate the rolling average for the first rollPeriod - 1 points + // where there is not enough data to roll over the full number of points + for (i = 0; i < originalData.length; i++) { + sum = 0; + variance = 0; + num_ok = 0; + for (j = Math.max(0, i - rollPeriod + 1); j < i + 1; j++) { + y = originalData[j][1]; + if (y === null || isNaN(y)) + continue; + num_ok++; + sum += y; + variance += Math.pow(originalData[j][2][2], 2); + } + if (num_ok) { + stddev = Math.sqrt(variance) / num_ok; + value = sum / num_ok; + rollingData[i] = [ originalData[i][0], value, + [value - sigma * stddev, value + sigma * stddev] ]; + } else { + // This explicitly preserves NaNs to aid with "independent + // series". + // See testRollingAveragePreservesNaNs. + v = (rollPeriod == 1) ? originalData[i][1] : null; + rollingData[i] = [ originalData[i][0], v, [ v, v ] ]; + } + } + + return rollingData; +}; + +})(); +/** + * @license + * Copyright 2013 David Eberlein (david.eberlein@ch.sauter-bc.com) + * MIT-licensed (http://opensource.org/licenses/MIT) + */ + +/** + * @fileoverview DataHandler implementation for the combination + * of error bars and fractions options. + * @author David Eberlein (david.eberlein@ch.sauter-bc.com) + */ + +(function() { + +/*global Dygraph:false */ +"use strict"; + +/** + * @constructor + * @extends Dygraph.DataHandlers.BarsHandler + */ +Dygraph.DataHandlers.FractionsBarsHandler = function() { +}; + +var FractionsBarsHandler = Dygraph.DataHandlers.FractionsBarsHandler; +FractionsBarsHandler.prototype = new Dygraph.DataHandlers.BarsHandler(); + +/** @inheritDoc */ +FractionsBarsHandler.prototype.extractSeries = function(rawData, i, options) { + // TODO(danvk): pre-allocate series here. + var series = []; + var x, y, point, num, den, value, stddev, variance; + var mult = 100.0; + var sigma = options.get("sigma"); + var logScale = options.get('logscale'); + for ( var j = 0; j < rawData.length; j++) { + x = rawData[j][0]; + point = rawData[j][i]; + if (logScale && point !== null) { + // On the log scale, points less than zero do not exist. + // This will create a gap in the chart. + if (point[0] <= 0 || point[1] <= 0) { + point = null; + } + } + // Extract to the unified data format. + if (point !== null) { + num = point[0]; + den = point[1]; + if (num !== null && !isNaN(num)) { + value = den ? num / den : 0.0; + stddev = den ? sigma * Math.sqrt(value * (1 - value) / den) : 1.0; + variance = mult * stddev; + y = mult * value; + // preserve original values in extras for further filtering + series.push([ x, y, [ y - variance, y + variance, num, den ] ]); + } else { + series.push([ x, num, [ num, num, num, den ] ]); + } + } else { + series.push([ x, null, [ null, null, null, null ] ]); + } + } + return series; +}; + +/** @inheritDoc */ +FractionsBarsHandler.prototype.rollingAverage = + function(originalData, rollPeriod, options) { + rollPeriod = Math.min(rollPeriod, originalData.length); + var rollingData = []; + var sigma = options.get("sigma"); + var wilsonInterval = options.get("wilsonInterval"); + + var low, high, i, stddev; + var num = 0; + var den = 0; // numerator/denominator + var mult = 100.0; + for (i = 0; i < originalData.length; i++) { + num += originalData[i][2][2]; + den += originalData[i][2][3]; + if (i - rollPeriod >= 0) { + num -= originalData[i - rollPeriod][2][2]; + den -= originalData[i - rollPeriod][2][3]; + } + + var date = originalData[i][0]; + var value = den ? num / den : 0.0; + if (wilsonInterval) { + // For more details on this confidence interval, see: + // http://en.wikipedia.org/wiki/Binomial_confidence_interval + if (den) { + var p = value < 0 ? 0 : value, n = den; + var pm = sigma * Math.sqrt(p * (1 - p) / n + sigma * sigma / (4 * n * n)); + var denom = 1 + sigma * sigma / den; + low = (p + sigma * sigma / (2 * den) - pm) / denom; + high = (p + sigma * sigma / (2 * den) + pm) / denom; + rollingData[i] = [ date, p * mult, + [ low * mult, high * mult ] ]; + } else { + rollingData[i] = [ date, 0, [ 0, 0 ] ]; + } + } else { + stddev = den ? sigma * Math.sqrt(value * (1 - value) / den) : 1.0; + rollingData[i] = [ date, mult * value, + [ mult * (value - stddev), mult * (value + stddev) ] ]; + } + } + + return rollingData; +}; + +})(); diff --git a/docs/articles/manipulateWidgets_files/dygraphs-1.1.1/dygraph-combined.js b/docs/articles/manipulateWidgets_files/dygraphs-1.1.1/dygraph-combined.js new file mode 100644 index 0000000..7d6121e --- /dev/null +++ b/docs/articles/manipulateWidgets_files/dygraphs-1.1.1/dygraph-combined.js @@ -0,0 +1,6 @@ +/*! @license Copyright 2014 Dan Vanderkam (danvdk@gmail.com) MIT-licensed (http://opensource.org/licenses/MIT) */ +!function(t){"use strict";for(var e,a,i={},r=function(){},n="memory".split(","),o="assert,clear,count,debug,dir,dirxml,error,exception,group,groupCollapsed,groupEnd,info,log,markTimeline,profile,profiles,profileEnd,show,table,time,timeEnd,timeline,timelineEnd,timeStamp,trace,warn".split(",");e=n.pop();)t[e]=t[e]||i;for(;a=o.pop();)t[a]=t[a]||r}(this.console=this.console||{}),function(){"use strict";CanvasRenderingContext2D.prototype.installPattern=function(t){if("undefined"!=typeof this.isPatternInstalled)throw"Must un-install old line pattern before installing a new one.";this.isPatternInstalled=!0;var e=[0,0],a=[],i=this.beginPath,r=this.lineTo,n=this.moveTo,o=this.stroke;this.uninstallPattern=function(){this.beginPath=i,this.lineTo=r,this.moveTo=n,this.stroke=o,this.uninstallPattern=void 0,this.isPatternInstalled=void 0},this.beginPath=function(){a=[],i.call(this)},this.moveTo=function(t,e){a.push([[t,e]]),n.call(this,t,e)},this.lineTo=function(t,e){var i=a[a.length-1];i.push([t,e])},this.stroke=function(){if(0===a.length)return void o.call(this);for(var i=0;if;){var x=t[v];f+=e[1]?e[1]:x,f>y?(e=[v,f-y],f=y):e=[(v+1)%t.length,0],v%2===0?r.call(this,f,0):n.call(this,f,0),v=(v+1)%t.length}this.restore(),l=g,h=d}o.call(this),a=[]}},CanvasRenderingContext2D.prototype.uninstallPattern=function(){throw"Must install a line pattern before uninstalling it."}}();var DygraphOptions=function(){return function(){"use strict";var t=function(t){this.dygraph_=t,this.yAxes_=[],this.xAxis_={},this.series_={},this.global_=this.dygraph_.attrs_,this.user_=this.dygraph_.user_attrs_||{},this.labels_=[],this.highlightSeries_=this.get("highlightSeriesOpts")||{},this.reparseSeries()};t.AXIS_STRING_MAPPINGS_={y:0,Y:0,y1:0,Y1:0,y2:1,Y2:1},t.axisToIndex_=function(e){if("string"==typeof e){if(t.AXIS_STRING_MAPPINGS_.hasOwnProperty(e))return t.AXIS_STRING_MAPPINGS_[e];throw"Unknown axis : "+e}if("number"==typeof e){if(0===e||1===e)return e;throw"Dygraphs only supports two y-axes, indexed from 0-1."}if(e)throw"Unknown axis : "+e;return 0},t.prototype.reparseSeries=function(){var e=this.get("labels");if(e){this.labels_=e.slice(1),this.yAxes_=[{series:[],options:{}}],this.xAxis_={options:{}},this.series_={};var a=!this.user_.series;if(a){for(var i=0,r=0;r1&&Dygraph.update(this.yAxes_[1].options,h.y2||{}),Dygraph.update(this.xAxis_.options,h.x||{})}},t.prototype.get=function(t){var e=this.getGlobalUser_(t);return null!==e?e:this.getGlobalDefault_(t)},t.prototype.getGlobalUser_=function(t){return this.user_.hasOwnProperty(t)?this.user_[t]:null},t.prototype.getGlobalDefault_=function(t){return this.global_.hasOwnProperty(t)?this.global_[t]:Dygraph.DEFAULT_ATTRS.hasOwnProperty(t)?Dygraph.DEFAULT_ATTRS[t]:null},t.prototype.getForAxis=function(t,e){var a,i;if("number"==typeof e)a=e,i=0===a?"y":"y2";else{if("y1"==e&&(e="y"),"y"==e)a=0;else if("y2"==e)a=1;else{if("x"!=e)throw"Unknown axis "+e;a=-1}i=e}var r=-1==a?this.xAxis_:this.yAxes_[a];if(r){var n=r.options;if(n.hasOwnProperty(t))return n[t]}if("x"!==e||"logscale"!==t){var o=this.getGlobalUser_(t);if(null!==o)return o}var s=Dygraph.DEFAULT_ATTRS.axes[i];return s.hasOwnProperty(t)?s[t]:this.getGlobalDefault_(t)},t.prototype.getForSeries=function(t,e){if(e===this.dygraph_.getHighlightSeries()&&this.highlightSeries_.hasOwnProperty(t))return this.highlightSeries_[t];if(!this.series_.hasOwnProperty(e))throw"Unknown series: "+e;var a=this.series_[e],i=a.options;return i.hasOwnProperty(t)?i[t]:this.getForAxis(t,a.yAxis)},t.prototype.numAxes=function(){return this.yAxes_.length},t.prototype.axisForSeries=function(t){return this.series_[t].yAxis},t.prototype.axisOptions=function(t){return this.yAxes_[t].options},t.prototype.seriesForAxis=function(t){return this.yAxes_[t].series},t.prototype.seriesNames=function(){return this.labels_};return t}()}(),DygraphLayout=function(){"use strict";var t=function(t){this.dygraph_=t,this.points=[],this.setNames=[],this.annotations=[],this.yAxes_=null,this.xTicks_=null,this.yTicks_=null};return t.prototype.addDataset=function(t,e){this.points.push(e),this.setNames.push(t)},t.prototype.getPlotArea=function(){return this.area_},t.prototype.computePlotArea=function(){var t={x:0,y:0};t.w=this.dygraph_.width_-t.x-this.dygraph_.getOption("rightGap"),t.h=this.dygraph_.height_;var e={chart_div:this.dygraph_.graphDiv,reserveSpaceLeft:function(e){var a={x:t.x,y:t.y,w:e,h:t.h};return t.x+=e,t.w-=e,a},reserveSpaceRight:function(e){var a={x:t.x+t.w-e,y:t.y,w:e,h:t.h};return t.w-=e,a},reserveSpaceTop:function(e){var a={x:t.x,y:t.y,w:t.w,h:e};return t.y+=e,t.h-=e,a},reserveSpaceBottom:function(e){var a={x:t.x,y:t.y+t.h-e,w:t.w,h:e};return t.h-=e,a},chartRect:function(){return{x:t.x,y:t.y,w:t.w,h:t.h}}};this.dygraph_.cascadeEvents_("layout",e),this.area_=t},t.prototype.setAnnotations=function(t){this.annotations=[];for(var e=this.dygraph_.getOption("xValueParser")||function(t){return t},a=0;a=0&&1>i&&this.xticks.push([i,a]);for(this.yticks=[],t=0;t0&&1>=i&&this.yticks.push([t,i,a])},t.prototype._evaluateAnnotations=function(){var t,e={};for(t=0;t=0;i--)a.childNodes[i].className==e&&a.removeChild(a.childNodes[i]);for(var r=document.bgColor,n=this.dygraph_.graphDiv;n!=document;){var o=n.currentStyle.backgroundColor;if(o&&"transparent"!=o){r=o;break}n=n.parentNode}var s=this.area;t({x:0,y:0,w:s.x,h:this.height}),t({x:s.x,y:0,w:this.width-s.x,h:s.y}),t({x:s.x+s.w,y:0,w:this.width-s.x-s.w,h:this.height}),t({x:s.x,y:s.y+s.h,w:this.width-s.x,h:this.height-s.h-s.y})},t._getIteratorPredicate=function(e){return e?t._predicateThatSkipsEmptyPoints:null},t._predicateThatSkipsEmptyPoints=function(t,e){return null!==t[e].yval},t._drawStyledLine=function(e,a,i,r,n,o,s){var l=e.dygraph,h=l.getBooleanOption("stepPlot",e.setName);Dygraph.isArrayLike(r)||(r=null);var p=l.getBooleanOption("drawGapEdgePoints",e.setName),g=e.points,d=e.setName,u=Dygraph.createIterator(g,0,g.length,t._getIteratorPredicate(l.getBooleanOption("connectSeparatedPoints",d))),c=r&&r.length>=2,y=e.drawingContext;y.save(),c&&y.installPattern(r);var _=t._drawSeries(e,u,i,s,n,p,h,a);t._drawPointsOnLine(e,_,o,a,s),c&&y.uninstallPattern(),y.restore()},t._drawSeries=function(t,e,a,i,r,n,o,s){var l,h,p=null,g=null,d=null,u=[],c=!0,y=t.drawingContext;y.beginPath(),y.strokeStyle=s,y.lineWidth=a;for(var _=e.array_,v=e.end_,f=e.predicate_,x=e.start_;v>x;x++){if(h=_[x],f){for(;v>x&&!f(_,x);)x++;if(x==v)break;h=_[x]}if(null===h.canvasy||h.canvasy!=h.canvasy)o&&null!==p&&(y.moveTo(p,g),y.lineTo(h.canvasx,g)),p=g=null;else{if(l=!1,n||!p){e.nextIdx_=x,e.next(),d=e.hasNext?e.peek.canvasy:null;var m=null===d||d!=d;l=!p&&m,n&&(!c&&!p||e.hasNext&&m)&&(l=!0)}null!==p?a&&(o&&(y.moveTo(p,g),y.lineTo(h.canvasx,g)),y.lineTo(h.canvasx,h.canvasy)):y.moveTo(h.canvasx,h.canvasy),(r||l)&&u.push([h.canvasx,h.canvasy,h.idx]),p=h.canvasx,g=h.canvasy}c=!1}return y.stroke(),u},t._drawPointsOnLine=function(t,e,a,i,r){for(var n=t.drawingContext,o=0;o0;a--){var i=e[a];if(i[0]==n){var o=e[a-1];o[1]==i[1]&&o[2]==i[2]&&e.splice(a,1)}}for(var a=0;a2&&!t){var s=0;e[0][0]==n&&s++;for(var l=null,h=null,a=s;ae[h][2]&&(h=a)}}var g=e[l],d=e[h];e.splice(s,e.length-s),h>l?(e.push(g),e.push(d)):l>h?(e.push(d),e.push(g)):e.push(g)}}},l=function(a){s(a);for(var l=0,h=e.length;h>l;l++){var p=e[l];p[0]==r?t.lineTo(p[1],p[2]):p[0]==n&&t.moveTo(p[1],p[2])}e.length&&(i=e[e.length-1][1]),o+=e.length,e=[]},h=function(t,r,n){var o=Math.round(r);if(null===a||o!=a){var s=a-i>1,h=o-a>1,p=s||h;l(p),a=o}e.push([t,r,n])};return{moveTo:function(t,e){h(n,t,e)},lineTo:function(t,e){h(r,t,e)},stroke:function(){l(!0),t.stroke()},fill:function(){l(!0),t.fill()},beginPath:function(){l(!0),t.beginPath()},closePath:function(){l(!0),t.closePath()},_count:function(){return o}}},t._fillPlotter=function(e){if(!e.singleSeriesName&&0===e.seriesIndex){for(var a=e.dygraph,i=a.getLabels().slice(1),r=i.length;r>=0;r--)a.visibility()[r]||i.splice(r,1);var n=function(){for(var t=0;t=0;r--){var n=i[r];t.lineTo(n[0],n[1])}},_=p-1;_>=0;_--){var v=e.drawingContext,f=i[_];if(a.getBooleanOption("fillGraph",f)){var x=a.getBooleanOption("stepPlot",f),m=u[_],D=a.axisPropertiesForSeries(f),w=1+D.minyval*D.yscale;0>w?w=0:w>1&&(w=1),w=l.h*w+l.y;var A,b=h[_],T=Dygraph.createIterator(b,0,b.length,t._getIteratorPredicate(a.getBooleanOption("connectSeparatedPoints",f))),E=0/0,C=[-1,-1],L=Dygraph.toRGB_(m),P="rgba("+L.r+","+L.g+","+L.b+","+g+")";v.fillStyle=P,v.beginPath();var S,O=!0;(b.length>2*a.width_||Dygraph.FORCE_FAST_PROXY)&&(v=t._fastCanvasProxy(v));for(var M,R=[];T.hasNext;)if(M=T.next(),Dygraph.isOK(M.y)||x){if(d){if(!O&&S==M.xval)continue;O=!1,S=M.xval,o=c[M.canvasx];var F;F=void 0===o?w:s?o[0]:o,A=[M.canvasy,F],x?-1===C[0]?c[M.canvasx]=[M.canvasy,w]:c[M.canvasx]=[M.canvasy,C[0]]:c[M.canvasx]=M.canvasy}else A=isNaN(M.canvasy)&&x?[l.y+l.h,w]:[M.canvasy,w];isNaN(E)?(v.moveTo(M.canvasx,A[1]),v.lineTo(M.canvasx,A[0])):(x?(v.lineTo(M.canvasx,C[0]),v.lineTo(M.canvasx,A[0])):v.lineTo(M.canvasx,A[0]),d&&(R.push([E,C[1]]),R.push(s&&o?[M.canvasx,o[1]]:[M.canvasx,A[1]]))),C=A,E=M.canvasx}else y(v,E,C[1],R),R=[],E=0/0,null===M.y_stacked||isNaN(M.y_stacked)||(c[M.canvasx]=l.h*M.y_stacked+l.y);s=x,A&&M&&(y(v,M.canvasx,A[1],R),R=[]),v.fill()}}}},t}(),Dygraph=function(){"use strict";var t=function(t,e,a,i){this.is_initial_draw_=!0,this.readyFns_=[],void 0!==i?(console.warn("Using deprecated four-argument dygraph constructor"),this.__old_init__(t,e,a,i)):this.__init__(t,e,a)};return t.NAME="Dygraph",t.VERSION="1.1.1",t.__repr__=function(){return"["+t.NAME+" "+t.VERSION+"]"},t.toString=function(){return t.__repr__()},t.DEFAULT_ROLL_PERIOD=1,t.DEFAULT_WIDTH=480,t.DEFAULT_HEIGHT=320,t.ANIMATION_STEPS=12,t.ANIMATION_DURATION=200,t.KMB_LABELS=["K","M","B","T","Q"],t.KMG2_BIG_LABELS=["k","M","G","T","P","E","Z","Y"],t.KMG2_SMALL_LABELS=["m","u","n","p","f","a","z","y"],t.numberValueFormatter=function(e,a){var i=a("sigFigs");if(null!==i)return t.floatFormat(e,i);var r,n=a("digitsAfterDecimal"),o=a("maxNumberWidth"),s=a("labelsKMB"),l=a("labelsKMG2");if(r=0!==e&&(Math.abs(e)>=Math.pow(10,o)||Math.abs(e)=0;c--,u/=h)if(d>=u){r=t.round_(e/u,n)+p[c];break}if(l){var y=String(e.toExponential()).split("e-");2===y.length&&y[1]>=3&&y[1]<=24&&(r=y[1]%3>0?t.round_(y[0]/t.pow(10,y[1]%3),n):Number(y[0]).toFixed(2),r+=g[Math.floor(y[1]/3)-1])}}return r},t.numberAxisLabelFormatter=function(e,a,i){return t.numberValueFormatter.call(this,e,i)},t.SHORT_MONTH_NAMES_=["Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov","Dec"],t.dateAxisLabelFormatter=function(e,a,i){var r=i("labelsUTC"),n=r?t.DateAccessorsUTC:t.DateAccessorsLocal,o=n.getFullYear(e),s=n.getMonth(e),l=n.getDate(e),h=n.getHours(e),p=n.getMinutes(e),g=n.getSeconds(e),d=n.getSeconds(e);if(a>=t.DECADAL)return""+o;if(a>=t.MONTHLY)return t.SHORT_MONTH_NAMES_[s]+" "+o;var u=3600*h+60*p+g+.001*d;return 0===u||a>=t.DAILY?t.zeropad(l)+" "+t.SHORT_MONTH_NAMES_[s]:t.hmsString_(h,p,g)},t.dateAxisFormatter=t.dateAxisLabelFormatter,t.dateValueFormatter=function(e,a){return t.dateString_(e,a("labelsUTC"))},t.Plotters=DygraphCanvasRenderer._Plotters,t.DEFAULT_ATTRS={highlightCircleSize:3,highlightSeriesOpts:null,highlightSeriesBackgroundAlpha:.5,labelsDivWidth:250,labelsDivStyles:{},labelsSeparateLines:!1,labelsShowZeroValues:!0,labelsKMB:!1,labelsKMG2:!1,showLabelsOnHighlight:!0,digitsAfterDecimal:2,maxNumberWidth:6,sigFigs:null,strokeWidth:1,strokeBorderWidth:0,strokeBorderColor:"white",axisTickSize:3,axisLabelFontSize:14,rightGap:5,showRoller:!1,xValueParser:t.dateParser,delimiter:",",sigma:2,errorBars:!1,fractions:!1,wilsonInterval:!0,customBars:!1,fillGraph:!1,fillAlpha:.15,connectSeparatedPoints:!1,stackedGraph:!1,stackedGraphNaNFill:"all",hideOverlayOnMouseOut:!0,legend:"onmouseover",stepPlot:!1,avoidMinZero:!1,xRangePad:0,yRangePad:null,drawAxesAtZero:!1,titleHeight:28,xLabelHeight:18,yLabelWidth:18,drawXAxis:!0,drawYAxis:!0,axisLineColor:"black",axisLineWidth:.3,gridLineWidth:.3,axisLabelColor:"black",axisLabelWidth:50,drawYGrid:!0,drawXGrid:!0,gridLineColor:"rgb(128,128,128)",interactionModel:null,animatedZooms:!1,showRangeSelector:!1,rangeSelectorHeight:40,rangeSelectorPlotStrokeColor:"#808FAB",rangeSelectorPlotFillColor:"#A7B1C4",showInRangeSelector:null,plotter:[t.Plotters.fillPlotter,t.Plotters.errorPlotter,t.Plotters.linePlotter],plugins:[],axes:{x:{pixelsPerLabel:70,axisLabelWidth:60,axisLabelFormatter:t.dateAxisLabelFormatter,valueFormatter:t.dateValueFormatter,drawGrid:!0,drawAxis:!0,independentTicks:!0,ticker:null},y:{axisLabelWidth:50,pixelsPerLabel:30,valueFormatter:t.numberValueFormatter,axisLabelFormatter:t.numberAxisLabelFormatter,drawGrid:!0,drawAxis:!0,independentTicks:!0,ticker:null},y2:{axisLabelWidth:50,pixelsPerLabel:30,valueFormatter:t.numberValueFormatter,axisLabelFormatter:t.numberAxisLabelFormatter,drawAxis:!0,drawGrid:!1,independentTicks:!1,ticker:null}}},t.HORIZONTAL=1,t.VERTICAL=2,t.PLUGINS=[],t.addedAnnotationCSS=!1,t.prototype.__old_init__=function(e,a,i,r){if(null!==i){for(var n=["Date"],o=0;o=0;n--){var o=r[n][0],s=r[n][1];if(s.call(o,i),i.propagationStopped)break}return i.defaultPrevented},t.prototype.getPluginInstance_=function(t){for(var e=0;et||t>=this.axes_.length)return null;var e=this.axes_[t];return[e.computedValueRange[0],e.computedValueRange[1]]},t.prototype.yAxisRanges=function(){for(var t=[],e=0;et||t>this.rawData_.length?null:0>e||e>this.rawData_[t].length?null:this.rawData_[t][e]},t.prototype.createInterface_=function(){var e=this.maindiv_;this.graphDiv=document.createElement("div"),this.graphDiv.style.textAlign="left",this.graphDiv.style.position="relative",e.appendChild(this.graphDiv),this.canvas_=t.createCanvas(),this.canvas_.style.position="absolute",this.hidden_=this.createPlotKitCanvas_(this.canvas_),this.canvas_ctx_=t.getContext(this.canvas_),this.hidden_ctx_=t.getContext(this.hidden_),this.resizeElements_(),this.graphDiv.appendChild(this.hidden_),this.graphDiv.appendChild(this.canvas_),this.mouseEventElement_=this.createMouseEventElement_(),this.layout_=new DygraphLayout(this);var a=this;this.mouseMoveHandler_=function(t){a.mouseMove_(t)},this.mouseOutHandler_=function(e){var i=e.target||e.fromElement,r=e.relatedTarget||e.toElement;t.isNodeContainedBy(i,a.graphDiv)&&!t.isNodeContainedBy(r,a.graphDiv)&&a.mouseOut_(e)},this.addAndTrackEvent(window,"mouseout",this.mouseOutHandler_),this.addAndTrackEvent(this.mouseEventElement_,"mousemove",this.mouseMoveHandler_),this.resizeHandler_||(this.resizeHandler_=function(t){a.resize()},this.addAndTrackEvent(window,"resize",this.resizeHandler_))},t.prototype.resizeElements_=function(){this.graphDiv.style.width=this.width_+"px",this.graphDiv.style.height=this.height_+"px";var e=t.getContextPixelRatio(this.canvas_ctx_);this.canvas_.width=this.width_*e,this.canvas_.height=this.height_*e,this.canvas_.style.width=this.width_+"px",this.canvas_.style.height=this.height_+"px",1!==e&&this.canvas_ctx_.scale(e,e);var a=t.getContextPixelRatio(this.hidden_ctx_);this.hidden_.width=this.width_*a,this.hidden_.height=this.height_*a,this.hidden_.style.width=this.width_+"px",this.hidden_.style.height=this.height_+"px",1!==a&&this.hidden_ctx_.scale(a,a)},t.prototype.destroy=function(){this.canvas_ctx_.restore(),this.hidden_ctx_.restore();for(var e=this.plugins_.length-1;e>=0;e--){var a=this.plugins_.pop();a.plugin.destroy&&a.plugin.destroy()}var i=function(t){for(;t.hasChildNodes();)i(t.firstChild),t.removeChild(t.firstChild)};this.removeTrackedEvents_(),t.removeEvent(window,"mouseout",this.mouseOutHandler_),t.removeEvent(this.mouseEventElement_,"mousemove",this.mouseMoveHandler_),t.removeEvent(window,"resize",this.resizeHandler_),this.resizeHandler_=null,i(this.maindiv_);var r=function(t){for(var e in t)"object"==typeof t[e]&&(t[e]=null)};r(this.layout_),r(this.plotter_),r(this)},t.prototype.createPlotKitCanvas_=function(e){var a=t.createCanvas();return a.style.position="absolute",a.style.top=e.style.top,a.style.left=e.style.left,a.width=this.width_,a.height=this.height_,a.style.width=this.width_+"px",a.style.height=this.height_+"px",a},t.prototype.createMouseEventElement_=function(){if(this.isUsingExcanvas_){var t=document.createElement("div");return t.style.position="absolute",t.style.backgroundColor="white",t.style.filter="alpha(opacity=0)",t.style.width=this.width_+"px",t.style.height=this.height_+"px",this.graphDiv.appendChild(t),t}return this.canvas_},t.prototype.setColors_=function(){var e=this.getLabels(),a=e.length-1;this.colors_=[],this.colorsMap_={};for(var i=this.getNumericOption("colorSaturation")||1,r=this.getNumericOption("colorValue")||.5,n=Math.ceil(a/2),o=this.getOption("colors"),s=this.visibility(),l=0;a>l;l++)if(s[l]){ +var h=e[l+1],p=this.attributes_.getForSeries("color",h);if(!p)if(o)p=o[l%o.length];else{var g=l%2?n+(l+1)/2:Math.ceil((l+1)/2),d=1*g/(1+a);p=t.hsvToRGB(d,i,r)}this.colors_.push(p),this.colorsMap_[h]=p}},t.prototype.getColors=function(){return this.colors_},t.prototype.getPropertiesForSeries=function(t){for(var e=-1,a=this.getLabels(),i=1;i=o;o++)s=t.zoomAnimationFunction(o,l),h[o-1]=[e[0]*(1-s)+s*a[0],e[1]*(1-s)+s*a[1]];if(null!==i&&null!==r)for(o=1;l>=o;o++){s=t.zoomAnimationFunction(o,l);for(var g=[],d=0;dl;l++){var h=o[l];if(t.isValidPoint(h,!0)){var p=Math.abs(h.canvasx-e);a>p&&(a=p,i=h.idx)}}return i},t.prototype.findClosestPoint=function(e,a){for(var i,r,n,o,s,l,h,p=1/0,g=this.layout_.points.length-1;g>=0;--g)for(var d=this.layout_.points[g],u=0;ui&&(p=i,s=o,l=g,h=o.idx));var c=this.layout_.setNames[l];return{row:h,seriesName:c,point:s}},t.prototype.findStackedPoint=function(e,a){for(var i,r,n=this.findClosestRow(e),o=0;o=h.length)){var p=h[l];if(t.isValidPoint(p)){var g=p.canvasy;if(e>p.canvasx&&l+10){var c=(e-p.canvasx)/u;g+=c*(d.canvasy-p.canvasy)}}}else if(e0){var y=h[l-1];if(t.isValidPoint(y)){var u=p.canvasx-y.canvasx;if(u>0){var c=(p.canvasx-e)/u;g+=c*(y.canvasy-p.canvasy)}}}(0===o||a>g)&&(i=p,r=o)}}}var _=this.layout_.setNames[r];return{row:n,seriesName:_,point:i}},t.prototype.mouseMove_=function(t){var e=this.layout_.points;if(void 0!==e&&null!==e){var a=this.eventToDomCoords(t),i=a[0],r=a[1],n=this.getOption("highlightSeriesOpts"),o=!1;if(n&&!this.isSeriesLocked()){var s;s=this.getBooleanOption("stackedGraph")?this.findStackedPoint(i,r):this.findClosestPoint(i,r),o=this.setSelection(s.row,s.seriesName)}else{var l=this.findClosestRow(i);o=this.setSelection(l)}var h=this.getFunctionOption("highlightCallback");h&&o&&h.call(this,t,this.lastx_,this.selPoints_,this.lastRow_,this.highlightSet_)}},t.prototype.getLeftBoundary_=function(t){if(this.boundaryIds_[t])return this.boundaryIds_[t][0];for(var e=0;ee?r:a-r;if(0>=n)return void(this.fadeLevel&&this.updateSelection_(1));var o=++this.animateId,s=this;t.repeatAndCleanup(function(t){s.animateId==o&&(s.fadeLevel+=e,0===s.fadeLevel?s.clearSelection():s.updateSelection_(s.fadeLevel/a))},n,i,function(){})},t.prototype.updateSelection_=function(e){this.cascadeEvents_("select",{selectedRow:this.lastRow_,selectedX:this.lastx_,selectedPoints:this.selPoints_});var a,i=this.canvas_ctx_;if(this.getOption("highlightSeriesOpts")){i.clearRect(0,0,this.width_,this.height_);var r=1-this.getNumericOption("highlightSeriesBackgroundAlpha");if(r){var n=!0;if(n){if(void 0===e)return void this.animateSelection_(1);r*=e}i.fillStyle="rgba(255,255,255,"+r+")",i.fillRect(0,0,this.width_,this.height_)}this.plotter_._renderLineChart(this.highlightSet_,i)}else if(this.previousVerticalX_>=0){var o=0,s=this.attr_("labels");for(a=1;ao&&(o=l)}var h=this.previousVerticalX_;i.clearRect(h-o-1,0,2*o+2,this.height_)}if(this.isUsingExcanvas_&&this.currentZoomRectArgs_&&t.prototype.drawZoomRect_.apply(this,this.currentZoomRectArgs_),this.selPoints_.length>0){var p=this.selPoints_[0].canvasx;for(i.save(),a=0;a=0){t!=this.lastRow_&&(i=!0),this.lastRow_=t;for(var r=0;r=0&&(i=!0),this.lastRow_=-1;return this.selPoints_.length?this.lastx_=this.selPoints_[0].xval:this.lastx_=-1,void 0!==e&&(this.highlightSet_!==e&&(i=!0),this.highlightSet_=e),void 0!==a&&(this.lockedSet_=a),i&&this.updateSelection_(void 0),i},t.prototype.mouseOut_=function(t){this.getFunctionOption("unhighlightCallback")&&this.getFunctionOption("unhighlightCallback").call(this,t),this.getBooleanOption("hideOverlayOnMouseOut")&&!this.lockedSet_&&this.clearSelection()},t.prototype.clearSelection=function(){return this.cascadeEvents_("deselect",{}),this.lockedSet_=!1,this.fadeLevel?void this.animateSelection_(-1):(this.canvas_ctx_.clearRect(0,0,this.width_,this.height_),this.fadeLevel=0,this.selPoints_=[],this.lastx_=-1,this.lastRow_=-1,void(this.highlightSet_=null))},t.prototype.getSelection=function(){if(!this.selPoints_||this.selPoints_.length<1)return-1;for(var t=0;t1&&(a=this.dataHandler_.rollingAverage(a,this.rollPeriod_,this.attributes_)),this.rolledSeries_.push(a)}this.drawGraph_();var i=new Date;this.drawingTimeMs_=i-t},t.PointType=void 0,t.stackPoints_=function(t,e,a,i){for(var r=null,n=null,o=null,s=-1,l=function(e){if(!(s>=e))for(var a=e;aa[1]&&(a[1]=u),u=1;i--)if(this.visibility()[i-1]){if(a){l=e[i];var c=a[0],y=a[1];for(n=null,o=null,r=0;r=c&&null===n&&(n=r),l[r][0]<=y&&(o=r);null===n&&(n=0);for(var _=n,v=!0;v&&_>0;)_--,v=null===l[_][1];null===o&&(o=l.length-1);var f=o;for(v=!0;v&&f0&&(this.setIndexByName_[n[0]]=0);for(var o=0,s=1;s0;){var a=this.readyFns_.pop();a(this)}},t.prototype.computeYAxes_=function(){var e,a,i,r,n;if(void 0!==this.axes_&&this.user_attrs_.hasOwnProperty("valueRange")===!1)for(e=[],i=0;ii;i++)this.axes_[i].valueWindow=e[i]}for(a=0;al;l++){var h=this.axes_[l],p=this.attributes_.getForAxis("logscale",l),g=this.attributes_.getForAxis("includeZero",l),d=this.attributes_.getForAxis("independentTicks",l);if(i=this.attributes_.seriesForAxis(l),e=!0,r=.1,null!==this.getNumericOption("yRangePad")&&(e=!1,r=this.getNumericOption("yRangePad")/this.plotter_.area.h),0===i.length)h.extremeRange=[0,1];else{for(var u,c,y=1/0,_=-(1/0),v=0;v0&&(y=0),0>_&&(_=0)),y==1/0&&(y=0),_==-(1/0)&&(_=1),a=_-y,0===a&&(0!==_?a=Math.abs(_):(_=1,a=1));var f,x;if(p)if(e)f=_+r*a,x=y;else{var m=Math.exp(Math.log(a)*r);f=_*m,x=y/m}else f=_+r*a,x=y-r*a,e&&!this.getBooleanOption("avoidMinZero")&&(0>x&&y>=0&&(x=0),f>0&&0>=_&&(f=0));h.extremeRange=[x,f]}if(h.valueWindow)h.computedValueRange=[h.valueWindow[0],h.valueWindow[1]];else if(h.valueRange){var D=o(h.valueRange[0])?h.extremeRange[0]:h.valueRange[0],w=o(h.valueRange[1])?h.extremeRange[1]:h.valueRange[1];if(!e)if(h.logscale){var m=Math.exp(Math.log(a)*r);D*=m,w/=m}else a=w-D,D-=a*r,w+=a*r;h.computedValueRange=[D,w]}else h.computedValueRange=h.extremeRange;if(d){h.independentTicks=d;var A=this.optionsViewForAxis_("y"+(l?"2":"")),b=A("ticker");h.ticks=b(h.computedValueRange[0],h.computedValueRange[1],this.plotter_.area.h,A,this),n||(n=h)}}if(void 0===n)throw'Configuration Error: At least one axis has to have the "independentTicks" option activated.';for(var l=0;s>l;l++){var h=this.axes_[l];if(!h.independentTicks){for(var A=this.optionsViewForAxis_("y"+(l?"2":"")),b=A("ticker"),T=n.ticks,E=n.computedValueRange[1]-n.computedValueRange[0],C=h.computedValueRange[1]-h.computedValueRange[0],L=[],P=0;P0&&"e"!=t[a-1]&&"E"!=t[a-1]||t.indexOf("/")>=0||isNaN(parseFloat(t))?e=!0:8==t.length&&t>"19700101"&&"20371231">t&&(e=!0),this.setXAxisOptions_(e)},t.prototype.setXAxisOptions_=function(e){e?(this.attrs_.xValueParser=t.dateParser,this.attrs_.axes.x.valueFormatter=t.dateValueFormatter,this.attrs_.axes.x.ticker=t.dateTicker,this.attrs_.axes.x.axisLabelFormatter=t.dateAxisLabelFormatter):(this.attrs_.xValueParser=function(t){return parseFloat(t)},this.attrs_.axes.x.valueFormatter=function(t){return t},this.attrs_.axes.x.ticker=t.numericTicks,this.attrs_.axes.x.axisLabelFormatter=this.attrs_.axes.x.valueFormatter)},t.prototype.parseCSV_=function(e){var a,i,r=[],n=t.detectLineDelimiter(e),o=e.split(n||"\n"),s=this.getStringOption("delimiter");-1==o[0].indexOf(s)&&o[0].indexOf(" ")>=0&&(s=" ");var l=0;"labels"in this.user_attrs_||(l=1,this.attrs_.labels=o[0].split(s),this.attributes_.reparseSeries());for(var h,p=0,g=!1,d=this.attr_("labels").length,u=!1,c=l;c0&&v[0]0;)e=String.fromCharCode(65+(t-1)%26)+e.toLowerCase(),t=Math.floor((t-1)/26);return e},i=e.getNumberOfColumns(),r=e.getNumberOfRows(),n=e.getColumnType(0);if("date"==n||"datetime"==n)this.attrs_.xValueParser=t.dateParser,this.attrs_.axes.x.valueFormatter=t.dateValueFormatter,this.attrs_.axes.x.ticker=t.dateTicker,this.attrs_.axes.x.axisLabelFormatter=t.dateAxisLabelFormatter;else{if("number"!=n)return console.error("only 'date', 'datetime' and 'number' types are supported for column 1 of DataTable input (Got '"+n+"')"),null;this.attrs_.xValueParser=function(t){return parseFloat(t)},this.attrs_.axes.x.valueFormatter=function(t){return t},this.attrs_.axes.x.ticker=t.numericTicks,this.attrs_.axes.x.axisLabelFormatter=this.attrs_.axes.x.valueFormatter}var o,s,l=[],h={},p=!1;for(o=1;i>o;o++){var g=e.getColumnType(o);if("number"==g)l.push(o);else if("string"==g&&this.getBooleanOption("displayAnnotations")){var d=l[l.length-1];h.hasOwnProperty(d)?h[d].push(o):h[d]=[o],p=!0}else console.error("Only 'number' is supported as a dependent type with Gviz. 'string' is only supported if displayAnnotations is true")}var u=[e.getColumnLabel(0)];for(o=0;oo;o++){var v=[];if("undefined"!=typeof e.getValue(o,0)&&null!==e.getValue(o,0)){if(v.push("date"==n||"datetime"==n?e.getValue(o,0).getTime():e.getValue(o,0)),this.getBooleanOption("errorBars"))for(s=0;i-1>s;s++)v.push([e.getValue(o,1+2*s),e.getValue(o,2+2*s)]);else{for(s=0;s0&&v[0]0&&this.setAnnotations(_,!0),this.attributes_.reparseSeries()},t.prototype.cascadeDataDidUpdateEvent_=function(){this.cascadeEvents_("dataDidUpdate",{})},t.prototype.start_=function(){var e=this.file_;if("function"==typeof e&&(e=e()),t.isArrayLike(e))this.rawData_=this.parseArray_(e),this.cascadeDataDidUpdateEvent_(),this.predraw_();else if("object"==typeof e&&"function"==typeof e.getColumnRange)this.parseDataTable_(e),this.cascadeDataDidUpdateEvent_(),this.predraw_();else if("string"==typeof e){var a=t.detectLineDelimiter(e);if(a)this.loadedEvent_(e);else{var i;i=window.XMLHttpRequest?new XMLHttpRequest:new ActiveXObject("Microsoft.XMLHTTP");var r=this;i.onreadystatechange=function(){4==i.readyState&&(200===i.status||0===i.status)&&r.loadedEvent_(i.responseText)},i.open("GET",e,!0),i.send(null)}}else console.error("Unknown data format: "+typeof e)},t.prototype.updateOptions=function(e,a){"undefined"==typeof a&&(a=!1);var i=e.file,r=t.mapLegacyOptions_(e);"rollPeriod"in r&&(this.rollPeriod_=r.rollPeriod),"dateWindow"in r&&(this.dateWindow_=r.dateWindow,"isZoomedIgnoreProgrammaticZoom"in r||(this.zoomed_x_=null!==r.dateWindow)),"valueRange"in r&&!("isZoomedIgnoreProgrammaticZoom"in r)&&(this.zoomed_y_=null!==r.valueRange);var n=t.isPixelChangingOptionList(this.attr_("labels"),r);t.updateDeep(this.user_attrs_,r),this.attributes_.reparseSeries(),i?(this.cascadeEvents_("dataWillUpdate",{}),this.file_=i,a||this.start_()):a||(n?this.predraw_():this.renderGraph_(!1))},t.mapLegacyOptions_=function(t){var e={};for(var a in t)t.hasOwnProperty(a)&&"file"!=a&&t.hasOwnProperty(a)&&(e[a]=t[a]);var i=function(t,a,i){e.axes||(e.axes={}),e.axes[t]||(e.axes[t]={}),e.axes[t][a]=i},r=function(a,r,n){"undefined"!=typeof t[a]&&(console.warn("Option "+a+" is deprecated. Use the "+n+" option for the "+r+" axis instead. (e.g. { axes : { "+r+" : { "+n+" : ... } } } (see http://dygraphs.com/per-axis.html for more information."),i(r,n,t[a]),delete e[a])};return r("xValueFormatter","x","valueFormatter"),r("pixelsPerXLabel","x","pixelsPerLabel"),r("xAxisLabelFormatter","x","axisLabelFormatter"),r("xTicker","x","ticker"),r("yValueFormatter","y","valueFormatter"),r("pixelsPerYLabel","y","pixelsPerLabel"),r("yAxisLabelFormatter","y","axisLabelFormatter"),r("yTicker","y","ticker"),r("drawXGrid","x","drawGrid"),r("drawXAxis","x","drawAxis"),r("drawYGrid","y","drawGrid"),r("drawYAxis","y","drawAxis"),r("xAxisLabelWidth","x","axisLabelWidth"),r("yAxisLabelWidth","y","axisLabelWidth"),e},t.prototype.resize=function(t,e){if(!this.resize_lock){this.resize_lock=!0,null===t!=(null===e)&&(console.warn("Dygraph.resize() should be called with zero parameters or two non-NULL parameters. Pretending it was zero."),t=e=null);var a=this.width_,i=this.height_;t?(this.maindiv_.style.width=t+"px",this.maindiv_.style.height=e+"px",this.width_=t,this.height_=e):(this.width_=this.maindiv_.clientWidth,this.height_=this.maindiv_.clientHeight),(a!=this.width_||i!=this.height_)&&(this.resizeElements_(),this.predraw_()),this.resize_lock=!1}},t.prototype.adjustRoll=function(t){this.rollPeriod_=t,this.predraw_()},t.prototype.visibility=function(){for(this.getOption("visibility")||(this.attrs_.visibility=[]);this.getOption("visibility").lengtht||t>=a.length?console.warn("invalid series number in setVisibility: "+t):(a[t]=e,this.predraw_())},t.prototype.size=function(){return{width:this.width_,height:this.height_}},t.prototype.setAnnotations=function(e,a){return t.addAnnotationRule(),this.annotations_=e,this.layout_?(this.layout_.setAnnotations(this.annotations_),void(a||this.predraw_())):void console.warn("Tried to setAnnotations before dygraph was ready. Try setting them in a ready() block. See dygraphs.com/tests/annotation.html")},t.prototype.annotations=function(){return this.annotations_},t.prototype.getLabels=function(){var t=this.attr_("labels");return t?t.slice():null},t.prototype.indexFromSetName=function(t){return this.setIndexByName_[t]},t.prototype.ready=function(t){this.is_initial_draw_?this.readyFns_.push(t):t.call(this,this)},t.addAnnotationRule=function(){if(!t.addedAnnotationCSS){var e="border: 1px solid black; background-color: white; text-align: center;",a=document.createElement("style");a.type="text/css",document.getElementsByTagName("head")[0].appendChild(a);for(var i=0;it?"0"+t:""+t},Dygraph.DateAccessorsLocal={getFullYear:function(t){return t.getFullYear()},getMonth:function(t){return t.getMonth()},getDate:function(t){return t.getDate()},getHours:function(t){return t.getHours()},getMinutes:function(t){return t.getMinutes()},getSeconds:function(t){return t.getSeconds()},getMilliseconds:function(t){return t.getMilliseconds()},getDay:function(t){return t.getDay()},makeDate:function(t,e,a,i,r,n,o){return new Date(t,e,a,i,r,n,o)}},Dygraph.DateAccessorsUTC={getFullYear:function(t){return t.getUTCFullYear()},getMonth:function(t){return t.getUTCMonth()},getDate:function(t){return t.getUTCDate()},getHours:function(t){return t.getUTCHours()},getMinutes:function(t){return t.getUTCMinutes()},getSeconds:function(t){return t.getUTCSeconds()},getMilliseconds:function(t){return t.getUTCMilliseconds()},getDay:function(t){return t.getUTCDay()},makeDate:function(t,e,a,i,r,n,o){return new Date(Date.UTC(t,e,a,i,r,n,o))}},Dygraph.hmsString_=function(t,e,a){var i=Dygraph.zeropad,r=i(t)+":"+i(e);return a&&(r+=":"+i(a)),r},Dygraph.dateString_=function(t,e){var a=Dygraph.zeropad,i=e?Dygraph.DateAccessorsUTC:Dygraph.DateAccessorsLocal,r=new Date(t),n=i.getFullYear(r),o=i.getMonth(r),s=i.getDate(r),l=i.getHours(r),h=i.getMinutes(r),p=i.getSeconds(r),g=""+n,d=a(o+1),u=a(s),c=3600*l+60*h+p,y=g+"/"+d+"/"+u;return c&&(y+=" "+Dygraph.hmsString_(l,h,p)),y},Dygraph.round_=function(t,e){var a=Math.pow(10,e);return Math.round(t*a)/a},Dygraph.binarySearch=function(t,e,a,i,r){if((null===i||void 0===i||null===r||void 0===r)&&(i=0,r=e.length-1),i>r)return-1;(null===a||void 0===a)&&(a=0);var n,o=function(t){return t>=0&&tt?a>0&&(n=s-1,o(n)&&e[n]l?0>a&&(n=s+1,o(n)&&e[n]>t)?s:Dygraph.binarySearch(t,e,a,s+1,r):-1},Dygraph.dateParser=function(t){var e,a;if((-1==t.search("-")||-1!=t.search("T")||-1!=t.search("Z"))&&(a=Dygraph.dateStrToMillis(t),a&&!isNaN(a)))return a;if(-1!=t.search("-")){for(e=t.replace("-","/","g");-1!=e.search("-");)e=e.replace("-","/");a=Dygraph.dateStrToMillis(e)}else 8==t.length?(e=t.substr(0,4)+"/"+t.substr(4,2)+"/"+t.substr(6,2),a=Dygraph.dateStrToMillis(e)):a=Dygraph.dateStrToMillis(t);return(!a||isNaN(a))&&console.error("Couldn't parse "+t+" as a date"),a},Dygraph.dateStrToMillis=function(t){return new Date(t).getTime()},Dygraph.update=function(t,e){if("undefined"!=typeof e&&null!==e)for(var a in e)e.hasOwnProperty(a)&&(t[a]=e[a]);return t},Dygraph.updateDeep=function(t,e){function a(t){return"object"==typeof Node?t instanceof Node:"object"==typeof t&&"number"==typeof t.nodeType&&"string"==typeof t.nodeName}if("undefined"!=typeof e&&null!==e)for(var i in e)e.hasOwnProperty(i)&&(null===e[i]?t[i]=null:Dygraph.isArrayLike(e[i])?t[i]=e[i].slice():a(e[i])?t[i]=e[i]:"object"==typeof e[i]?(("object"!=typeof t[i]||null===t[i])&&(t[i]={}),Dygraph.updateDeep(t[i],e[i])):t[i]=e[i]);return t},Dygraph.isArrayLike=function(t){var e=typeof t;return"object"!=e&&("function"!=e||"function"!=typeof t.item)||null===t||"number"!=typeof t.length||3===t.nodeType?!1:!0},Dygraph.isDateLike=function(t){return"object"!=typeof t||null===t||"function"!=typeof t.getTime?!1:!0},Dygraph.clone=function(t){for(var e=[],a=0;a=e||Dygraph.requestAnimFrame.call(window,function(){var e=(new Date).getTime(),h=e-o;r=n,n=Math.floor(h/a);var p=n-r,g=n+p>s;g||n>=s?(t(s),i()):(0!==p&&t(n),l())})}()};var e={annotationClickHandler:!0,annotationDblClickHandler:!0,annotationMouseOutHandler:!0,annotationMouseOverHandler:!0,axisLabelColor:!0,axisLineColor:!0,axisLineWidth:!0,clickCallback:!0,drawCallback:!0,drawHighlightPointCallback:!0,drawPoints:!0,drawPointCallback:!0,drawXGrid:!0,drawYGrid:!0,fillAlpha:!0,gridLineColor:!0,gridLineWidth:!0,hideOverlayOnMouseOut:!0,highlightCallback:!0,highlightCircleSize:!0,interactionModel:!0,isZoomedIgnoreProgrammaticZoom:!0,labelsDiv:!0,labelsDivStyles:!0,labelsDivWidth:!0,labelsKMB:!0,labelsKMG2:!0,labelsSeparateLines:!0,labelsShowZeroValues:!0,legend:!0,panEdgeFraction:!0,pixelsPerYLabel:!0,pointClickCallback:!0,pointSize:!0,rangeSelectorPlotFillColor:!0,rangeSelectorPlotStrokeColor:!0,showLabelsOnHighlight:!0,showRoller:!0,strokeWidth:!0,underlayCallback:!0,unhighlightCallback:!0,zoomCallback:!0};Dygraph.isPixelChangingOptionList=function(t,a){var i={};if(t)for(var r=1;re?1/Math.pow(t,-e):Math.pow(t,e)};var a=/^rgba?\((\d{1,3}),\s*(\d{1,3}),\s*(\d{1,3})(?:,\s*([01](?:\.\d+)?))?\)$/;Dygraph.toRGB_=function(e){var a=t(e);if(a)return a;var i=document.createElement("div");i.style.backgroundColor=e,i.style.visibility="hidden",document.body.appendChild(i);var r;return r=window.getComputedStyle?window.getComputedStyle(i,null).backgroundColor:i.currentStyle.backgroundColor,document.body.removeChild(i),t(r)},Dygraph.isCanvasSupported=function(t){var e;try{e=t||document.createElement("canvas"),e.getContext("2d")}catch(a){var i=navigator.appVersion.match(/MSIE (\d\.\d)/),r=-1!=navigator.userAgent.toLowerCase().indexOf("opera");return!i||i[1]<6||r?!1:!0}return!0},Dygraph.parseFloat_=function(t,e,a){var i=parseFloat(t);if(!isNaN(i))return i;if(/^ *$/.test(t))return null;if(/^ *nan *$/i.test(t))return 0/0;var r="Unable to parse '"+t+"' as a number";return void 0!==a&&void 0!==e&&(r+=" on line "+(1+(e||0))+" ('"+a+"') of CSV."),console.error(r),null}}(),function(){"use strict";Dygraph.GVizChart=function(t){this.container=t},Dygraph.GVizChart.prototype.draw=function(t,e){this.container.innerHTML="","undefined"!=typeof this.date_graph&&this.date_graph.destroy(),this.date_graph=new Dygraph(this.container,t,e)},Dygraph.GVizChart.prototype.setSelection=function(t){var e=!1;t.length&&(e=t[0].row),this.date_graph.setSelection(e)},Dygraph.GVizChart.prototype.getSelection=function(){var t=[],e=this.date_graph.getSelection();if(0>e)return t;for(var a=this.date_graph.layout_.points,i=0;ii&&2>r&&void 0!==e.lastx_&&-1!=e.lastx_&&Dygraph.Interaction.treatMouseOpAsClick(e,t,a),a.regionWidth=i,a.regionHeight=r},Dygraph.Interaction.startPan=function(t,e,a){var i,r;a.isPanning=!0;var n=e.xAxisRange();if(e.getOptionForAxis("logscale","x")?(a.initialLeftmostDate=Dygraph.log10(n[0]),a.dateRange=Dygraph.log10(n[1])-Dygraph.log10(n[0])):(a.initialLeftmostDate=n[0],a.dateRange=n[1]-n[0]),a.xUnitsPerPixel=a.dateRange/(e.plotter_.area.w-1),e.getNumericOption("panEdgeFraction")){var o=e.width_*e.getNumericOption("panEdgeFraction"),s=e.xAxisExtremes(),l=e.toDomXCoord(s[0])-o,h=e.toDomXCoord(s[1])+o,p=e.toDataXCoord(l),g=e.toDataXCoord(h);a.boundedDates=[p,g];var d=[],u=e.height_*e.getNumericOption("panEdgeFraction");for(i=0;ia.boundedDates[1]&&(i-=r-a.boundedDates[1],r=i+a.dateRange),e.getOptionForAxis("logscale","x")?e.dateWindow_=[Math.pow(Dygraph.LOG_SCALE,i),Math.pow(Dygraph.LOG_SCALE,r)]:e.dateWindow_=[i,r],a.is2DPan)for(var n=a.dragEndY-a.dragStartY,o=0;oi?Dygraph.VERTICAL:Dygraph.HORIZONTAL,e.drawZoomRect_(a.dragDirection,a.dragStartX,a.dragEndX,a.dragStartY,a.dragEndY,a.prevDragDirection,a.prevEndX,a.prevEndY),a.prevEndX=a.dragEndX,a.prevEndY=a.dragEndY,a.prevDragDirection=a.dragDirection},Dygraph.Interaction.treatMouseOpAsClick=function(t,e,a){for(var i=t.getFunctionOption("clickCallback"),r=t.getFunctionOption("pointClickCallback"),n=null,o=-1,s=Number.MAX_VALUE,l=0;lp)&&(s=p,o=l)}var g=t.getNumericOption("highlightCircleSize")+2;if(g*g>=s&&(n=t.selPoints_[o]),n){var d={cancelable:!0,point:n,canvasx:a.dragEndX,canvasy:a.dragEndY},u=t.cascadeEvents_("pointClick",d);if(u)return;r&&r.call(t,e,n)}var d={cancelable:!0,xval:t.lastx_,pts:t.selPoints_,canvasx:a.dragEndX,canvasy:a.dragEndY};t.cascadeEvents_("click",d)||i&&i.call(t,e,t.lastx_,t.selPoints_)},Dygraph.Interaction.endZoom=function(t,e,a){e.clearZoomRect_(),a.isZooming=!1,Dygraph.Interaction.maybeTreatMouseOpAsClick(t,e,a);var i=e.getArea();if(a.regionWidth>=10&&a.dragDirection==Dygraph.HORIZONTAL){var r=Math.min(a.dragStartX,a.dragEndX),n=Math.max(a.dragStartX,a.dragEndX);r=Math.max(r,i.x),n=Math.min(n,i.x+i.w),n>r&&e.doZoomX_(r,n),a.cancelNextDblclick=!0}else if(a.regionHeight>=10&&a.dragDirection==Dygraph.VERTICAL){var o=Math.min(a.dragStartY,a.dragEndY),s=Math.max(a.dragStartY,a.dragEndY);o=Math.max(o,i.y),s=Math.min(s,i.y+i.h),s>o&&e.doZoomY_(o,s),a.cancelNextDblclick=!0}a.dragStartX=null,a.dragStartY=null},Dygraph.Interaction.startTouch=function(t,e,a){t.preventDefault(),t.touches.length>1&&(a.startTimeForDoubleTapMs=null);for(var i=[],r=0;r=2){a.initialPinchCenter={pageX:.5*(i[0].pageX+i[1].pageX),pageY:.5*(i[0].pageY+i[1].pageY),dataX:.5*(i[0].dataX+i[1].dataX),dataY:.5*(i[0].dataY+i[1].dataY)};var o=180/Math.PI*Math.atan2(a.initialPinchCenter.pageY-i[0].pageY,i[0].pageX-a.initialPinchCenter.pageX);o=Math.abs(o),o>90&&(o=90-o),a.touchDirections={x:67.5>o,y:o>22.5}}a.initialRange={x:e.xAxisRange(),y:e.yAxisRange()}},Dygraph.Interaction.moveTouch=function(t,e,a){a.startTimeForDoubleTapMs=null;var i,r=[];for(i=0;i=2){var c=s[1].pageX-l.pageX;d=(r[1].pageX-o.pageX)/c;var y=s[1].pageY-l.pageY;u=(r[1].pageY-o.pageY)/y}d=Math.min(8,Math.max(.125,d)),u=Math.min(8,Math.max(.125,u));var _=!1;if(a.touchDirections.x&&(e.dateWindow_=[l.dataX-h.dataX+(a.initialRange.x[0]-l.dataX)/d,l.dataX-h.dataX+(a.initialRange.x[1]-l.dataX)/d],_=!0),a.touchDirections.y)for(i=0;1>i;i++){var v=e.axes_[i],f=e.attributes_.getForAxis("logscale",i);f||(v.valueWindow=[l.dataY-h.dataY+(a.initialRange.y[0]-l.dataY)/u,l.dataY-h.dataY+(a.initialRange.y[1]-l.dataY)/u],_=!0)}if(e.drawGraph_(!1),_&&r.length>1&&e.getFunctionOption("zoomCallback")){var x=e.xAxisRange();e.getFunctionOption("zoomCallback").call(e,x[0],x[1],e.yAxisRanges())}},Dygraph.Interaction.endTouch=function(t,e,a){if(0!==t.touches.length)Dygraph.Interaction.startTouch(t,e,a);else if(1==t.changedTouches.length){var i=(new Date).getTime(),r=t.changedTouches[0];a.startTimeForDoubleTapMs&&i-a.startTimeForDoubleTapMs<500&&a.doubleTapX&&Math.abs(a.doubleTapX-r.screenX)<50&&a.doubleTapY&&Math.abs(a.doubleTapY-r.screenY)<50?e.resetZoom():(a.startTimeForDoubleTapMs=i,a.doubleTapX=r.screenX,a.doubleTapY=r.screenY)}};var e=function(t,e,a){return e>t?e-t:t>a?t-a:0},a=function(t,a){var i=Dygraph.findPos(a.canvas_),r={left:i.x,right:i.x+a.canvas_.offsetWidth,top:i.y,bottom:i.y+a.canvas_.offsetHeight},n={x:Dygraph.pageX(t),y:Dygraph.pageY(t)},o=e(n.x,r.left,r.right),s=e(n.y,r.top,r.bottom);return Math.max(o,s)};Dygraph.Interaction.defaultModel={mousedown:function(e,i,r){if(!e.button||2!=e.button){r.initializeMouseDown(e,i,r),e.altKey||e.shiftKey?Dygraph.startPan(e,i,r):Dygraph.startZoom(e,i,r);var n=function(e){if(r.isZooming){var n=a(e,i);t>n?Dygraph.moveZoom(e,i,r):null!==r.dragEndX&&(r.dragEndX=null,r.dragEndY=null,i.clearZoomRect_())}else r.isPanning&&Dygraph.movePan(e,i,r)},o=function(t){r.isZooming?null!==r.dragEndX?Dygraph.endZoom(t,i,r):Dygraph.Interaction.maybeTreatMouseOpAsClick(t,i,r):r.isPanning&&Dygraph.endPan(t,i,r),Dygraph.removeEvent(document,"mousemove",n),Dygraph.removeEvent(document,"mouseup",o),r.destroy()};i.addAndTrackEvent(document,"mousemove",n),i.addAndTrackEvent(document,"mouseup",o)}},willDestroyContextMyself:!0,touchstart:function(t,e,a){Dygraph.Interaction.startTouch(t,e,a)},touchmove:function(t,e,a){Dygraph.Interaction.moveTouch(t,e,a)},touchend:function(t,e,a){Dygraph.Interaction.endTouch(t,e,a)},dblclick:function(t,e,a){if(a.cancelNextDblclick)return void(a.cancelNextDblclick=!1);var i={canvasx:a.dragEndX,canvasy:a.dragEndY};e.cascadeEvents_("dblclick",i)||t.altKey||t.shiftKey||e.resetZoom()}},Dygraph.DEFAULT_ATTRS.interactionModel=Dygraph.Interaction.defaultModel,Dygraph.defaultInteractionModel=Dygraph.Interaction.defaultModel,Dygraph.endZoom=Dygraph.Interaction.endZoom,Dygraph.moveZoom=Dygraph.Interaction.moveZoom,Dygraph.startZoom=Dygraph.Interaction.startZoom,Dygraph.endPan=Dygraph.Interaction.endPan,Dygraph.movePan=Dygraph.Interaction.movePan,Dygraph.startPan=Dygraph.Interaction.startPan,Dygraph.Interaction.nonInteractiveModel_={mousedown:function(t,e,a){a.initializeMouseDown(t,e,a)},mouseup:Dygraph.Interaction.maybeTreatMouseOpAsClick},Dygraph.Interaction.dragIsPanInteractionModel={mousedown:function(t,e,a){a.initializeMouseDown(t,e,a),Dygraph.startPan(t,e,a)},mousemove:function(t,e,a){a.isPanning&&Dygraph.movePan(t,e,a)},mouseup:function(t,e,a){a.isPanning&&Dygraph.endPan(t,e,a)}}}(),function(){"use strict";Dygraph.TickList=void 0,Dygraph.Ticker=void 0,Dygraph.numericLinearTicks=function(t,e,a,i,r,n){var o=function(t){return"logscale"===t?!1:i(t)};return Dygraph.numericTicks(t,e,a,o,r,n)},Dygraph.numericTicks=function(t,e,a,i,r,n){var o,s,l,h,p=i("pixelsPerLabel"),g=[];if(n)for(o=0;o=h/4){for(var y=u;y>=d;y--){var _=Dygraph.PREFERRED_LOG_TICK_VALUES[y],v=Math.log(_/t)/Math.log(e/t)*a,f={v:_};null===c?c={tickValue:_,pixel_coord:v}:Math.abs(v-c.pixel_coord)>=p?c={tickValue:_,pixel_coord:v}:f.label="",g.push(f)}g.reverse()}}if(0===g.length){var x,m,D=i("labelsKMG2");D?(x=[1,2,4,8,16,32,64,128,256],m=16):(x=[1,2,5,10,20,50,100],m=10);var w,A,b,T,E=Math.ceil(a/p),C=Math.abs(e-t)/E,L=Math.floor(Math.log(C)/Math.log(m)),P=Math.pow(m,L);for(s=0;sp));s++);for(A>b&&(w*=-1),o=0;h>=o;o++)l=A+o*w,g.push({v:l})}}var S=i("axisLabelFormatter");for(o=0;o=0?Dygraph.getDateAxis(t,e,o,i,r):[]},Dygraph.SECONDLY=0,Dygraph.TWO_SECONDLY=1,Dygraph.FIVE_SECONDLY=2,Dygraph.TEN_SECONDLY=3,Dygraph.THIRTY_SECONDLY=4,Dygraph.MINUTELY=5,Dygraph.TWO_MINUTELY=6,Dygraph.FIVE_MINUTELY=7,Dygraph.TEN_MINUTELY=8,Dygraph.THIRTY_MINUTELY=9,Dygraph.HOURLY=10,Dygraph.TWO_HOURLY=11,Dygraph.SIX_HOURLY=12,Dygraph.DAILY=13,Dygraph.TWO_DAILY=14,Dygraph.WEEKLY=15,Dygraph.MONTHLY=16,Dygraph.QUARTERLY=17,Dygraph.BIANNUAL=18,Dygraph.ANNUAL=19,Dygraph.DECADAL=20,Dygraph.CENTENNIAL=21,Dygraph.NUM_GRANULARITIES=22,Dygraph.DATEFIELD_Y=0,Dygraph.DATEFIELD_M=1,Dygraph.DATEFIELD_D=2,Dygraph.DATEFIELD_HH=3,Dygraph.DATEFIELD_MM=4,Dygraph.DATEFIELD_SS=5,Dygraph.DATEFIELD_MS=6,Dygraph.NUM_DATEFIELDS=7,Dygraph.TICK_PLACEMENT=[],Dygraph.TICK_PLACEMENT[Dygraph.SECONDLY]={datefield:Dygraph.DATEFIELD_SS,step:1,spacing:1e3},Dygraph.TICK_PLACEMENT[Dygraph.TWO_SECONDLY]={datefield:Dygraph.DATEFIELD_SS,step:2,spacing:2e3},Dygraph.TICK_PLACEMENT[Dygraph.FIVE_SECONDLY]={datefield:Dygraph.DATEFIELD_SS,step:5,spacing:5e3},Dygraph.TICK_PLACEMENT[Dygraph.TEN_SECONDLY]={datefield:Dygraph.DATEFIELD_SS,step:10,spacing:1e4},Dygraph.TICK_PLACEMENT[Dygraph.THIRTY_SECONDLY]={datefield:Dygraph.DATEFIELD_SS,step:30,spacing:3e4},Dygraph.TICK_PLACEMENT[Dygraph.MINUTELY]={datefield:Dygraph.DATEFIELD_MM,step:1,spacing:6e4},Dygraph.TICK_PLACEMENT[Dygraph.TWO_MINUTELY]={datefield:Dygraph.DATEFIELD_MM,step:2,spacing:12e4},Dygraph.TICK_PLACEMENT[Dygraph.FIVE_MINUTELY]={datefield:Dygraph.DATEFIELD_MM,step:5,spacing:3e5},Dygraph.TICK_PLACEMENT[Dygraph.TEN_MINUTELY]={datefield:Dygraph.DATEFIELD_MM,step:10,spacing:6e5},Dygraph.TICK_PLACEMENT[Dygraph.THIRTY_MINUTELY]={datefield:Dygraph.DATEFIELD_MM,step:30,spacing:18e5},Dygraph.TICK_PLACEMENT[Dygraph.HOURLY]={datefield:Dygraph.DATEFIELD_HH,step:1,spacing:36e5},Dygraph.TICK_PLACEMENT[Dygraph.TWO_HOURLY]={datefield:Dygraph.DATEFIELD_HH,step:2,spacing:72e5},Dygraph.TICK_PLACEMENT[Dygraph.SIX_HOURLY]={datefield:Dygraph.DATEFIELD_HH,step:6,spacing:216e5},Dygraph.TICK_PLACEMENT[Dygraph.DAILY]={datefield:Dygraph.DATEFIELD_D,step:1,spacing:864e5},Dygraph.TICK_PLACEMENT[Dygraph.TWO_DAILY]={datefield:Dygraph.DATEFIELD_D,step:2,spacing:1728e5},Dygraph.TICK_PLACEMENT[Dygraph.WEEKLY]={datefield:Dygraph.DATEFIELD_D,step:7,spacing:6048e5},Dygraph.TICK_PLACEMENT[Dygraph.MONTHLY]={datefield:Dygraph.DATEFIELD_M,step:1,spacing:2629817280},Dygraph.TICK_PLACEMENT[Dygraph.QUARTERLY]={datefield:Dygraph.DATEFIELD_M,step:3,spacing:216e5*365.2524},Dygraph.TICK_PLACEMENT[Dygraph.BIANNUAL]={datefield:Dygraph.DATEFIELD_M,step:6,spacing:432e5*365.2524},Dygraph.TICK_PLACEMENT[Dygraph.ANNUAL]={datefield:Dygraph.DATEFIELD_Y,step:1,spacing:864e5*365.2524},Dygraph.TICK_PLACEMENT[Dygraph.DECADAL]={datefield:Dygraph.DATEFIELD_Y,step:10,spacing:315578073600},Dygraph.TICK_PLACEMENT[Dygraph.CENTENNIAL]={datefield:Dygraph.DATEFIELD_Y,step:100,spacing:3155780736e3},Dygraph.PREFERRED_LOG_TICK_VALUES=function(){for(var t=[],e=-39;39>=e;e++)for(var a=Math.pow(10,e),i=1;9>=i;i++){var r=a*i;t.push(r)}return t}(),Dygraph.pickDateTickGranularity=function(t,e,a,i){for(var r=i("pixelsPerLabel"),n=0;n=r)return n}return-1},Dygraph.numDateTicks=function(t,e,a){var i=Dygraph.TICK_PLACEMENT[a].spacing;return Math.round(1*(e-t)/i)},Dygraph.getDateAxis=function(t,e,a,i,r){var n=i("axisLabelFormatter"),o=i("labelsUTC"),s=o?Dygraph.DateAccessorsUTC:Dygraph.DateAccessorsLocal,l=Dygraph.TICK_PLACEMENT[a].datefield,h=Dygraph.TICK_PLACEMENT[a].step,p=Dygraph.TICK_PLACEMENT[a].spacing,g=new Date(t),d=[];d[Dygraph.DATEFIELD_Y]=s.getFullYear(g),d[Dygraph.DATEFIELD_M]=s.getMonth(g),d[Dygraph.DATEFIELD_D]=s.getDate(g),d[Dygraph.DATEFIELD_HH]=s.getHours(g),d[Dygraph.DATEFIELD_MM]=s.getMinutes(g),d[Dygraph.DATEFIELD_SS]=s.getSeconds(g),d[Dygraph.DATEFIELD_MS]=s.getMilliseconds(g);var u=d[l]%h;a==Dygraph.WEEKLY&&(u=s.getDay(g)),d[l]-=u;for(var c=l+1;cv&&(v+=p,_=new Date(v));e>=v;)y.push({v:v,label:n.call(r,_,a,i,r)}),v+=p,_=new Date(v);else for(t>v&&(d[l]+=h,_=s.makeDate.apply(null,d),v=_.getTime());e>=v;)(a>=Dygraph.DAILY||s.getHours(_)%h===0)&&y.push({v:v,label:n.call(r,_,a,i,r)}),d[l]+=h,_=s.makeDate.apply(null,d),v=_.getTime();return y},Dygraph&&Dygraph.DEFAULT_ATTRS&&Dygraph.DEFAULT_ATTRS.axes&&Dygraph.DEFAULT_ATTRS.axes.x&&Dygraph.DEFAULT_ATTRS.axes.y&&Dygraph.DEFAULT_ATTRS.axes.y2&&(Dygraph.DEFAULT_ATTRS.axes.x.ticker=Dygraph.dateTicker,Dygraph.DEFAULT_ATTRS.axes.y.ticker=Dygraph.numericTicks,Dygraph.DEFAULT_ATTRS.axes.y2.ticker=Dygraph.numericTicks)}(),Dygraph.Plugins={},Dygraph.Plugins.Annotations=function(){"use strict";var t=function(){this.annotations_=[]};return t.prototype.toString=function(){return"Annotations Plugin"},t.prototype.activate=function(t){return{clearChart:this.clearChart,didDrawChart:this.didDrawChart}},t.prototype.detachLabels=function(){for(var t=0;to.x+o.w||h.canvasyo.y+o.h)){var p=h.annotation,g=6;p.hasOwnProperty("tickHeight")&&(g=p.tickHeight);var d=document.createElement("div");for(var u in r)r.hasOwnProperty(u)&&(d.style[u]=r[u]);p.hasOwnProperty("icon")||(d.className="dygraphDefaultAnnotation"),p.hasOwnProperty("cssClass")&&(d.className+=" "+p.cssClass);var c=p.hasOwnProperty("width")?p.width:16,y=p.hasOwnProperty("height")?p.height:16;if(p.hasOwnProperty("icon")){var _=document.createElement("img");_.src=p.icon,_.width=c,_.height=y,d.appendChild(_)}else h.annotation.hasOwnProperty("shortText")&&d.appendChild(document.createTextNode(h.annotation.shortText));var v=h.canvasx-c/2;d.style.left=v+"px";var f=0;if(p.attachAtBottom){var x=o.y+o.h-y-g;s[v]?x-=s[v]:s[v]=0,s[v]+=g+y,f=x}else f=h.canvasy-y-g;d.style.top=f+"px",d.style.width=c+"px",d.style.height=y+"px",d.title=h.annotation.text,d.style.color=e.colorsMap_[h.name],d.style.borderColor=e.colorsMap_[h.name],p.div=d,e.addAndTrackEvent(d,"click",n("clickHandler","annotationClickHandler",h,this)),e.addAndTrackEvent(d,"mouseover",n("mouseOverHandler","annotationMouseOverHandler",h,this)),e.addAndTrackEvent(d,"mouseout",n("mouseOutHandler","annotationMouseOutHandler",h,this)),e.addAndTrackEvent(d,"dblclick",n("dblClickHandler","annotationDblClickHandler",h,this)),i.appendChild(d),this.annotations_.push(d);var m=t.drawingContext;if(m.save(),m.strokeStyle=e.colorsMap_[h.name],m.beginPath(),p.attachAtBottom){var x=f+y;m.moveTo(h.canvasx,x),m.lineTo(h.canvasx,x+g)}else m.moveTo(h.canvasx,h.canvasy),m.lineTo(h.canvasx,h.canvasy-2-g);m.closePath(),m.stroke(),m.restore()}}},t.prototype.destroy=function(){this.detachLabels()},t}(),Dygraph.Plugins.Axes=function(){"use strict";var t=function(){this.xlabels_=[],this.ylabels_=[]};return t.prototype.toString=function(){return"Axes Plugin"},t.prototype.activate=function(t){return{layout:this.layout,clearChart:this.clearChart,willDrawChart:this.willDrawChart}},t.prototype.layout=function(t){var e=t.dygraph;if(e.getOptionForAxis("drawAxis","y")){var a=e.getOptionForAxis("axisLabelWidth","y")+2*e.getOptionForAxis("axisTickSize","y");t.reserveSpaceLeft(a)}if(e.getOptionForAxis("drawAxis","x")){var i;i=e.getOption("xAxisHeight")?e.getOption("xAxisHeight"):e.getOptionForAxis("axisLabelFontSize","x")+2*e.getOptionForAxis("axisTickSize","x"),t.reserveSpaceBottom(i)}if(2==e.numAxes()){if(e.getOptionForAxis("drawAxis","y2")){var a=e.getOptionForAxis("axisLabelWidth","y2")+2*e.getOptionForAxis("axisTickSize","y2");t.reserveSpaceRight(a)}}else e.numAxes()>2&&e.error("Only two y-axes are supported at this time. (Trying to use "+e.numAxes()+")")},t.prototype.detachLabels=function(){function t(t){for(var e=0;e0){var x=i.numAxes(),m=[f("y"),f("y2")];for(l=0;l<_.yticks.length;l++){if(s=_.yticks[l],"function"==typeof s)return;n=v.x;var D=1,w="y1",A=m[0];1==s[0]&&(n=v.x+v.w,D=-1,w="y2",A=m[1]);var b=A("axisLabelFontSize");o=v.y+s[1]*v.h,r=y(s[2],"y",2==x?w:null);var T=o-b/2;0>T&&(T=0),T+b+3>d?r.style.bottom="0":r.style.top=T+"px",0===s[0]?(r.style.left=v.x-A("axisLabelWidth")-A("axisTickSize")+"px",r.style.textAlign="right"):1==s[0]&&(r.style.left=v.x+v.w+A("axisTickSize")+"px",r.style.textAlign="left"),r.style.width=A("axisLabelWidth")+"px",p.appendChild(r),this.ylabels_.push(r)}var E=this.ylabels_[0],b=i.getOptionForAxis("axisLabelFontSize","y"),C=parseInt(E.style.top,10)+b;C>d-b&&(E.style.top=parseInt(E.style.top,10)-b/2+"px")}var L;if(i.getOption("drawAxesAtZero")){var P=i.toPercentXCoord(0);(P>1||0>P||isNaN(P))&&(P=0),L=e(v.x+P*v.w)}else L=e(v.x);h.strokeStyle=i.getOptionForAxis("axisLineColor","y"),h.lineWidth=i.getOptionForAxis("axisLineWidth","y"),h.beginPath(),h.moveTo(L,a(v.y)),h.lineTo(L,a(v.y+v.h)),h.closePath(),h.stroke(),2==i.numAxes()&&(h.strokeStyle=i.getOptionForAxis("axisLineColor","y2"),h.lineWidth=i.getOptionForAxis("axisLineWidth","y2"),h.beginPath(),h.moveTo(a(v.x+v.w),a(v.y)),h.lineTo(a(v.x+v.w),a(v.y+v.h)),h.closePath(),h.stroke())}if(i.getOptionForAxis("drawAxis","x")){if(_.xticks){var A=f("x");for(l=0;l<_.xticks.length;l++){s=_.xticks[l],n=v.x+s[0]*v.w,o=v.y+v.h,r=y(s[1],"x"),r.style.textAlign="center",r.style.top=o+A("axisTickSize")+"px";var S=n-A("axisLabelWidth")/2;S+A("axisLabelWidth")>g&&(S=g-A("axisLabelWidth"),r.style.textAlign="right"),0>S&&(S=0,r.style.textAlign="left"),r.style.left=S+"px",r.style.width=A("axisLabelWidth")+"px", +p.appendChild(r),this.xlabels_.push(r)}}h.strokeStyle=i.getOptionForAxis("axisLineColor","x"),h.lineWidth=i.getOptionForAxis("axisLineWidth","x"),h.beginPath();var O;if(i.getOption("drawAxesAtZero")){var P=i.toPercentYCoord(0,0);(P>1||0>P)&&(P=1),O=a(v.y+P*v.h)}else O=a(v.y+v.h);h.moveTo(e(v.x),O),h.lineTo(e(v.x+v.w),O),h.closePath(),h.stroke()}h.restore()}},t}(),Dygraph.Plugins.ChartLabels=function(){"use strict";var t=function(){this.title_div_=null,this.xlabel_div_=null,this.ylabel_div_=null,this.y2label_div_=null};t.prototype.toString=function(){return"ChartLabels Plugin"},t.prototype.activate=function(t){return{layout:this.layout,didDrawChart:this.didDrawChart}};var e=function(t){var e=document.createElement("div");return e.style.position="absolute",e.style.left=t.x+"px",e.style.top=t.y+"px",e.style.width=t.w+"px",e.style.height=t.h+"px",e};t.prototype.detachLabels_=function(){for(var t=[this.title_div_,this.xlabel_div_,this.ylabel_div_,this.y2label_div_],e=0;e=2);for(o=h.yticks,l.save(),n=0;n=2;for(y&&l.installPattern(_),l.strokeStyle=s.getOptionForAxis("gridLineColor","x"),l.lineWidth=s.getOptionForAxis("gridLineWidth","x"),n=0;n/g,">")};return t.prototype.select=function(e){var a=e.selectedX,i=e.selectedPoints,r=e.selectedRow,n=e.dygraph.getOption("legend");if("never"===n)return void(this.legend_div_.style.display="none");if("follow"===n){var o=e.dygraph.plotter_.area,s=e.dygraph.getOption("labelsDivWidth"),l=e.dygraph.getOptionForAxis("axisLabelWidth","y"),h=i[0].x*o.w+20,p=i[0].y*o.h-20;h+s+1>window.scrollX+window.innerWidth&&(h=h-40-s-(l-o.x)),e.dygraph.graphDiv.appendChild(this.legend_div_),this.legend_div_.style.left=l+h+"px",this.legend_div_.style.top=p+"px"}var g=t.generateLegendHTML(e.dygraph,a,i,this.one_em_width_,r);this.legend_div_.innerHTML=g,this.legend_div_.style.display=""},t.prototype.deselect=function(e){var i=e.dygraph.getOption("legend");"always"!==i&&(this.legend_div_.style.display="none");var r=a(this.legend_div_);this.one_em_width_=r;var n=t.generateLegendHTML(e.dygraph,void 0,void 0,r,null);this.legend_div_.innerHTML=n},t.prototype.didDrawChart=function(t){this.deselect(t)},t.prototype.predraw=function(t){if(this.is_generated_div_){t.dygraph.graphDiv.appendChild(this.legend_div_);var e=t.dygraph.plotter_.area,a=t.dygraph.getOption("labelsDivWidth");this.legend_div_.style.left=e.x+e.w-a-1+"px",this.legend_div_.style.top=e.y+"px",this.legend_div_.style.width=a+"px"}},t.prototype.destroy=function(){this.legend_div_=null},t.generateLegendHTML=function(t,a,r,n,o){if(t.getOption("showLabelsOnHighlight")!==!0)return"";var s,l,h,p,g,d=t.getLabels();if("undefined"==typeof a){if("always"!=t.getOption("legend"))return"";for(l=t.getOption("labelsSeparateLines"),s="",h=1;h":" "),g=t.getOption("strokePattern",d[h]),p=e(g,u.color,n),s+=""+p+" "+i(d[h])+"")}return s}var c=t.optionsViewForAxis_("x"),y=c("valueFormatter");s=y.call(t,a,c,d[0],t,o,0),""!==s&&(s+=":");var _=[],v=t.numAxes();for(h=0;v>h;h++)_[h]=t.optionsViewForAxis_("y"+(h?1+h:""));var f=t.getOption("labelsShowZeroValues");l=t.getOption("labelsSeparateLines");var x=t.getHighlightSeries();for(h=0;h");var u=t.getPropertiesForSeries(m.name),D=_[u.axis-1],w=D("valueFormatter"),A=w.call(t,m.yval,D,m.name,t,o,d.indexOf(m.name)),b=m.name==x?" class='highlight'":"";s+=" "+i(m.name)+": "+A+""}}return s},e=function(t,e,a){var i=/MSIE/.test(navigator.userAgent)&&!window.opera;if(i)return"—";if(!t||t.length<=1)return'
    ';var r,n,o,s,l,h=0,p=0,g=[];for(r=0;r<=t.length;r++)h+=t[r%t.length];if(l=Math.floor(a/(h-t[0])),l>1){for(r=0;rn;n++)for(r=0;p>r;r+=2)o=g[r%g.length],s=r';return d},t}(),Dygraph.Plugins.RangeSelector=function(){"use strict";var t=function(){this.isIE_=/MSIE/.test(navigator.userAgent)&&!window.opera,this.hasTouchInterface_="undefined"!=typeof TouchEvent,this.isMobileDevice_=/mobile|android/gi.test(navigator.appVersion),this.interfaceCreated_=!1};return t.prototype.toString=function(){return"RangeSelector Plugin"},t.prototype.activate=function(t){return this.dygraph_=t,this.isUsingExcanvas_=t.isUsingExcanvas_,this.getOption_("showRangeSelector")&&this.createInterface_(),{layout:this.reserveSpace_,predraw:this.renderStaticLayer_,didDrawChart:this.renderInteractiveLayer_}},t.prototype.destroy=function(){this.bgcanvas_=null,this.fgcanvas_=null,this.leftZoomHandle_=null,this.rightZoomHandle_=null,this.iePanOverlay_=null},t.prototype.getOption_=function(t,e){return this.dygraph_.getOption(t,e)},t.prototype.setDefaultOption_=function(t,e){this.dygraph_.attrs_[t]=e},t.prototype.createInterface_=function(){this.createCanvases_(),this.isUsingExcanvas_&&this.createIEPanOverlay_(),this.createZoomHandles_(),this.initInteraction_(),this.getOption_("animatedZooms")&&(console.warn("Animated zooms and range selector are not compatible; disabling animatedZooms."),this.dygraph_.updateOptions({animatedZooms:!1},!0)),this.interfaceCreated_=!0,this.addToGraph_()},t.prototype.addToGraph_=function(){var t=this.graphDiv_=this.dygraph_.graphDiv;t.appendChild(this.bgcanvas_),t.appendChild(this.fgcanvas_),t.appendChild(this.leftZoomHandle_),t.appendChild(this.rightZoomHandle_)},t.prototype.removeFromGraph_=function(){var t=this.graphDiv_;t.removeChild(this.bgcanvas_),t.removeChild(this.fgcanvas_),t.removeChild(this.leftZoomHandle_),t.removeChild(this.rightZoomHandle_),this.graphDiv_=null},t.prototype.reserveSpace_=function(t){this.getOption_("showRangeSelector")&&t.reserveSpaceBottom(this.getOption_("rangeSelectorHeight")+4)},t.prototype.renderStaticLayer_=function(){this.updateVisibility_()&&(this.resize_(),this.drawStaticLayer_())},t.prototype.renderInteractiveLayer_=function(){this.updateVisibility_()&&!this.isChangingRange_&&(this.placeZoomHandles_(),this.drawInteractiveLayer_())},t.prototype.updateVisibility_=function(){var t=this.getOption_("showRangeSelector");if(t)this.interfaceCreated_?this.graphDiv_&&this.graphDiv_.parentNode||this.addToGraph_():this.createInterface_();else if(this.graphDiv_){this.removeFromGraph_();var e=this.dygraph_;setTimeout(function(){e.width_=0,e.resize()},1)}return t},t.prototype.resize_=function(){function t(t,e,a){var i=Dygraph.getContextPixelRatio(e);t.style.top=a.y+"px",t.style.left=a.x+"px",t.width=a.w*i,t.height=a.h*i,t.style.width=a.w+"px",t.style.height=a.h+"px",1!=i&&e.scale(i,i)}var e=this.dygraph_.layout_.getPlotArea(),a=0;this.dygraph_.getOptionForAxis("drawAxis","x")&&(a=this.getOption_("xAxisHeight")||this.getOption_("axisLabelFontSize")+2*this.getOption_("axisTickSize")),this.canvasRect_={x:e.x,y:e.y+e.h+a+4,w:e.w,h:this.getOption_("rangeSelectorHeight")},t(this.bgcanvas_,this.bgcanvas_ctx_,this.canvasRect_),t(this.fgcanvas_,this.fgcanvas_ctx_,this.canvasRect_)},t.prototype.createCanvases_=function(){this.bgcanvas_=Dygraph.createCanvas(),this.bgcanvas_.className="dygraph-rangesel-bgcanvas",this.bgcanvas_.style.position="absolute",this.bgcanvas_.style.zIndex=9,this.bgcanvas_ctx_=Dygraph.getContext(this.bgcanvas_),this.fgcanvas_=Dygraph.createCanvas(),this.fgcanvas_.className="dygraph-rangesel-fgcanvas",this.fgcanvas_.style.position="absolute",this.fgcanvas_.style.zIndex=9,this.fgcanvas_.style.cursor="default",this.fgcanvas_ctx_=Dygraph.getContext(this.fgcanvas_)},t.prototype.createIEPanOverlay_=function(){this.iePanOverlay_=document.createElement("div"),this.iePanOverlay_.style.position="absolute",this.iePanOverlay_.style.backgroundColor="white",this.iePanOverlay_.style.filter="alpha(opacity=0)",this.iePanOverlay_.style.display="none",this.iePanOverlay_.style.cursor="move",this.fgcanvas_.appendChild(this.iePanOverlay_)},t.prototype.createZoomHandles_=function(){var t=new Image;t.className="dygraph-rangesel-zoomhandle",t.style.position="absolute",t.style.zIndex=10,t.style.visibility="hidden",t.style.cursor="col-resize",/MSIE 7/.test(navigator.userAgent)?(t.width=7,t.height=14,t.style.backgroundColor="white",t.style.border="1px solid #333333"):(t.width=9,t.height=16,t.src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAkAAAAQCAYAAADESFVDAAAAAXNSR0IArs4c6QAAAAZiS0dEANAAzwDP4Z7KegAAAAlwSFlzAAAOxAAADsQBlSsOGwAAAAd0SU1FB9sHGw0cMqdt1UwAAAAZdEVYdENvbW1lbnQAQ3JlYXRlZCB3aXRoIEdJTVBXgQ4XAAAAaElEQVQoz+3SsRFAQBCF4Z9WJM8KCDVwownl6YXsTmCUsyKGkZzcl7zkz3YLkypgAnreFmDEpHkIwVOMfpdi9CEEN2nGpFdwD03yEqDtOgCaun7sqSTDH32I1pQA2Pb9sZecAxc5r3IAb21d6878xsAAAAAASUVORK5CYII="),this.isMobileDevice_&&(t.width*=2,t.height*=2),this.leftZoomHandle_=t,this.rightZoomHandle_=t.cloneNode(!1)},t.prototype.initInteraction_=function(){var t,e,a,i,r,n,o,s,l,h,p,g,d,u,c=this,y=document,_=0,v=null,f=!1,x=!1,m=!this.isMobileDevice_&&!this.isUsingExcanvas_,D=new Dygraph.IFrameTarp;t=function(t){var e=c.dygraph_.xAxisExtremes(),a=(e[1]-e[0])/c.canvasRect_.w,i=e[0]+(t.leftHandlePos-c.canvasRect_.x)*a,r=e[0]+(t.rightHandlePos-c.canvasRect_.x)*a;return[i,r]},e=function(t){return Dygraph.cancelEvent(t),f=!0,_=t.clientX,v=t.target?t.target:t.srcElement,("mousedown"===t.type||"dragstart"===t.type)&&(Dygraph.addEvent(y,"mousemove",a),Dygraph.addEvent(y,"mouseup",i)),c.fgcanvas_.style.cursor="col-resize",D.cover(),!0},a=function(t){if(!f)return!1;Dygraph.cancelEvent(t);var e=t.clientX-_;if(Math.abs(e)<4)return!0;_=t.clientX;var a,i=c.getZoomHandleStatus_();v==c.leftZoomHandle_?(a=i.leftHandlePos+e,a=Math.min(a,i.rightHandlePos-v.width-3),a=Math.max(a,c.canvasRect_.x)):(a=i.rightHandlePos+e,a=Math.min(a,c.canvasRect_.x+c.canvasRect_.w),a=Math.max(a,i.leftHandlePos+v.width+3));var n=v.width/2;return v.style.left=a-n+"px",c.drawInteractiveLayer_(),m&&r(),!0},i=function(t){return f?(f=!1,D.uncover(),Dygraph.removeEvent(y,"mousemove",a),Dygraph.removeEvent(y,"mouseup",i),c.fgcanvas_.style.cursor="default",m||r(),!0):!1},r=function(){try{var e=c.getZoomHandleStatus_();if(c.isChangingRange_=!0,e.isZoomed){var a=t(e);c.dygraph_.doZoomXDates_(a[0],a[1])}else c.dygraph_.resetZoom()}finally{c.isChangingRange_=!1}},n=function(t){if(c.isUsingExcanvas_)return t.srcElement==c.iePanOverlay_;var e=c.leftZoomHandle_.getBoundingClientRect(),a=e.left+e.width/2;e=c.rightZoomHandle_.getBoundingClientRect();var i=e.left+e.width/2;return t.clientX>a&&t.clientX=c.canvasRect_.x+c.canvasRect_.w?(r=c.canvasRect_.x+c.canvasRect_.w,i=r-n):(i+=e,r+=e);var o=c.leftZoomHandle_.width/2;return c.leftZoomHandle_.style.left=i-o+"px",c.rightZoomHandle_.style.left=r-o+"px",c.drawInteractiveLayer_(),m&&h(),!0},l=function(t){return x?(x=!1,Dygraph.removeEvent(y,"mousemove",s),Dygraph.removeEvent(y,"mouseup",l),m||h(),!0):!1},h=function(){try{c.isChangingRange_=!0,c.dygraph_.dateWindow_=t(c.getZoomHandleStatus_()),c.dygraph_.drawGraph_(!1)}finally{c.isChangingRange_=!1}},p=function(t){if(!f&&!x){var e=n(t)?"move":"default";e!=c.fgcanvas_.style.cursor&&(c.fgcanvas_.style.cursor=e)}},g=function(t){"touchstart"==t.type&&1==t.targetTouches.length?e(t.targetTouches[0])&&Dygraph.cancelEvent(t):"touchmove"==t.type&&1==t.targetTouches.length?a(t.targetTouches[0])&&Dygraph.cancelEvent(t):i(t)},d=function(t){"touchstart"==t.type&&1==t.targetTouches.length?o(t.targetTouches[0])&&Dygraph.cancelEvent(t):"touchmove"==t.type&&1==t.targetTouches.length?s(t.targetTouches[0])&&Dygraph.cancelEvent(t):l(t)},u=function(t,e){for(var a=["touchstart","touchend","touchmove","touchcancel"],i=0;it;t++){var s=this.getOption_("showInRangeSelector",r[t]);n[t]=s,null!==s&&(o=!0)}if(!o)for(t=0;t1&&(g=h.rollingAverage(g,e.rollPeriod(),p)),l.push(g)}var d=[];for(t=0;t0)&&(v=Math.min(v,x),f=Math.max(f,x))}var m=.25;if(a)for(f=Dygraph.log10(f),f+=f*m,v=Dygraph.log10(v),t=0;tthis.canvasRect_.x||a+10&&t[r][0]>o;)i--,r--}return i>=a?[a,i]:[0,t.length-1]},t.parseFloat=function(t){return null===t?0/0:t}}(),function(){"use strict";Dygraph.DataHandlers.DefaultHandler=function(){};var t=Dygraph.DataHandlers.DefaultHandler;t.prototype=new Dygraph.DataHandler,t.prototype.extractSeries=function(t,e,a){for(var i=[],r=a.get("logscale"),n=0;n=s&&(s=null),i.push([o,s])}return i},t.prototype.rollingAverage=function(t,e,a){e=Math.min(e,t.length);var i,r,n,o,s,l=[];if(1==e)return t;for(i=0;ir;r++)n=t[r][1],null===n||isNaN(n)||(s++,o+=t[r][1]);s?l[i]=[t[i][0],o/s]:l[i]=[t[i][0],null]}return l},t.prototype.getExtremeYValues=function(t,e,a){for(var i,r=null,n=null,o=0,s=t.length-1,l=o;s>=l;l++)i=t[l][1],null===i||isNaN(i)||((null===n||i>n)&&(n=i),(null===r||r>i)&&(r=i));return[r,n]}}(),function(){"use strict";Dygraph.DataHandlers.DefaultFractionHandler=function(){};var t=Dygraph.DataHandlers.DefaultFractionHandler;t.prototype=new Dygraph.DataHandlers.DefaultHandler,t.prototype.extractSeries=function(t,e,a){for(var i,r,n,o,s,l,h=[],p=100,g=a.get("logscale"),d=0;d=0&&(n-=t[i-e][2][0],o-=t[i-e][2][1]);var l=t[i][0],h=o?n/o:0;r[i]=[l,s*h]}return r}}(),function(){"use strict";Dygraph.DataHandlers.BarsHandler=function(){Dygraph.DataHandler.call(this)},Dygraph.DataHandlers.BarsHandler.prototype=new Dygraph.DataHandler;var t=Dygraph.DataHandlers.BarsHandler;t.prototype.extractSeries=function(t,e,a){},t.prototype.rollingAverage=function(t,e,a){},t.prototype.onPointsCreated_=function(t,e){for(var a=0;a=l;l++)if(i=t[l][1],null!==i&&!isNaN(i)){var h=t[l][2][0],p=t[l][2][1];h>i&&(h=i),i>p&&(p=i),(null===n||p>n)&&(n=p),(null===r||r>h)&&(r=h)}return[r,n]},t.prototype.onLineEvaluated=function(t,e,a){for(var i,r=0;r=0){var g=t[l-e];null===g[1]||isNaN(g[1])||(r-=g[2][0],o-=g[1],n-=g[2][1],s-=1)}s?p[l]=[t[l][0],1*o/s,[1*r/s,1*n/s]]:p[l]=[t[l][0],null,[null,null]]}return p}}(),function(){"use strict";Dygraph.DataHandlers.ErrorBarsHandler=function(){};var t=Dygraph.DataHandlers.ErrorBarsHandler;t.prototype=new Dygraph.DataHandlers.BarsHandler,t.prototype.extractSeries=function(t,e,a){for(var i,r,n,o,s=[],l=a.get("sigma"),h=a.get("logscale"),p=0;pr;r++)n=t[r][1],null===n||isNaN(n)||(l++,s+=n,p+=Math.pow(t[r][2][2],2));l?(h=Math.sqrt(p)/l,g=s/l,d[i]=[t[i][0],g,[g-u*h,g+u*h]]):(o=1==e?t[i][1]:null,d[i]=[t[i][0],o,[o,o]])}return d}}(),function(){"use strict";Dygraph.DataHandlers.FractionsBarsHandler=function(){};var t=Dygraph.DataHandlers.FractionsBarsHandler;t.prototype=new Dygraph.DataHandlers.BarsHandler,t.prototype.extractSeries=function(t,e,a){for(var i,r,n,o,s,l,h,p,g=[],d=100,u=a.get("sigma"),c=a.get("logscale"),y=0;y=0&&(p-=t[n-e][2][2],g-=t[n-e][2][3]);var u=t[n][0],c=g?p/g:0;if(h)if(g){var y=0>c?0:c,_=g,v=l*Math.sqrt(y*(1-y)/_+l*l/(4*_*_)),f=1+l*l/g;i=(y+l*l/(2*g)-v)/f,r=(y+l*l/(2*g)+v)/f,s[n]=[u,y*d,[i*d,r*d]]}else s[n]=[u,0,[0,0]];else o=g?l*Math.sqrt(c*(1-c)/g):1,s[n]=[u,d*c,[d*(c-o),d*(c+o)]]}return s}}(); +//# sourceMappingURL=dygraph-combined.js.map \ No newline at end of file diff --git a/docs/articles/manipulateWidgets_files/dygraphs-1.1.1/dygraph.css b/docs/articles/manipulateWidgets_files/dygraphs-1.1.1/dygraph.css new file mode 100644 index 0000000..4745b2f --- /dev/null +++ b/docs/articles/manipulateWidgets_files/dygraphs-1.1.1/dygraph.css @@ -0,0 +1,8 @@ + +div .dygraphs input[type="text"] { + width: 25px; +} + +div .qt .dygraph-axis-label { + font-size: 11px; +} \ No newline at end of file diff --git a/docs/articles/manipulateWidgets_files/dygraphs-binding-1.1.1.4/dygraphs.js b/docs/articles/manipulateWidgets_files/dygraphs-binding-1.1.1.4/dygraphs.js new file mode 100644 index 0000000..9d7433e --- /dev/null +++ b/docs/articles/manipulateWidgets_files/dygraphs-binding-1.1.1.4/dygraphs.js @@ -0,0 +1,769 @@ + +// polyfill indexOf for IE8 +if (!Array.prototype.indexOf) { + Array.prototype.indexOf = function(elt /*, from*/) { + var len = this.length >>> 0; + + var from = Number(arguments[1]) || 0; + from = (from < 0) + ? Math.ceil(from) + : Math.floor(from); + if (from < 0) + from += len; + + for (; from < len; from++) { + if (from in this && + this[from] === elt) + return from; + } + return -1; + }; +} + +HTMLWidgets.widget({ + + name: "dygraphs", + + type: "output", + + factory: function(el, width, height) { + + // reference to dygraph + var dygraph = null; + + // reference to widget global groups + var groups = this.groups; + + // add qt style if we are running under Qt + if (window.navigator.userAgent.indexOf(" Qt/") > 0) + el.className += " qt"; + + return { + + renderValue: function(x) { + + // reference to this for closures + var thiz = this; + + // get dygraph attrs and populate file field + var attrs = x.attrs; + attrs.file = x.data; + + // convert non-arrays to arrays + for (var index = 0; index < attrs.file.length; index++) { + if (!$.isArray(attrs.file[index])) + attrs.file[index] = [].concat(attrs.file[index]); + } + + // resolve "auto" legend behavior + if (x.attrs.legend == "auto") { + if (x.data.length <= 2) + x.attrs.legend = "onmouseover"; + else + x.attrs.legend = "always"; + } + + if (x.format == "date") { + + // set appropriated function in case of fixed tz + if ((attrs.axes.x.axisLabelFormatter === undefined) && x.fixedtz) + attrs.axes.x.axisLabelFormatter = this.xAxisLabelFormatterFixedTZ(x.tzone); + + if ((attrs.axes.x.valueFormatter === undefined) && x.fixedtz) + attrs.axes.x.valueFormatter = this.xValueFormatterFixedTZ(x.scale, x.tzone); + + if ((attrs.axes.x.ticker === undefined) && x.fixedtz) + attrs.axes.x.ticker = this.customDateTickerFixedTZ(x.tzone); + + // provide an automatic x value formatter if none is already specified + if ((attrs.axes.x.valueFormatter === undefined) && (x.fixedtz != true)) + attrs.axes.x.valueFormatter = this.xValueFormatter(x.scale); + + // convert time to js time + attrs.file[0] = attrs.file[0].map(function(value) { + return thiz.normalizeDateValue(x.scale, value, x.fixedtz); + }); + if (attrs.dateWindow != null) { + attrs.dateWindow = attrs.dateWindow.map(function(value) { + var date = thiz.normalizeDateValue(x.scale, value, x.fixedtz); + return date.getTime(); + }); + } + } + + + // transpose array + attrs.file = HTMLWidgets.transposeArray2D(attrs.file); + + // add drawCallback for group + if (x.group != null) + this.addGroupDrawCallback(x); + + // add shading and event callback if necessary + this.addShadingCallback(x); + this.addEventCallback(x); + this.addZoomCallback(x); + + // disable y-axis touch events on mobile phones + if (attrs.mobileDisableYTouch !== false && this.isMobilePhone()) { + // create default interaction model if necessary + if (!attrs.interactionModel) + attrs.interactionModel = Dygraph.Interaction.defaultModel; + // disable y touch direction + attrs.interactionModel.touchstart = function(event, dygraph, context) { + Dygraph.defaultInteractionModel.touchstart(event, dygraph, context); + context.touchDirections = { x: true, y: false }; + }; + } + + // create plugins + if (x.plugins) { + attrs.plugins = []; + for (var plugin in x.plugins) { + if (x.plugins.hasOwnProperty(plugin)) { + + // get plugin options + var options = x.plugins[plugin]; + + // create plugin and add to dygraph + var p = new Dygraph.Plugins[plugin](options); + attrs.plugins.push(p); + } + } + } + + // custom plotter + if (x.plotter) { + attrs.plotter = Dygraph.Plotters[x.plotter]; + } + + // custom data handler + if (x.dataHandler) { + attrs.dataHandler = Dygraph.DataHandlers[x.dataHandler]; + } + + // if there is no existing dygraph perform initialization + if (!dygraph) { + + // subscribe to custom shown event (fired by ioslides to trigger + // shiny reactivity but we can use it as well). this is necessary + // because if a dygraph starts out as display:none it has height + // and width == 0 and this doesn't change when it becomes visible + $(el).closest('slide').on('shown', function() { + if (dygraph) + dygraph.resize(); + }); + + // do the same for reveal.js + $(el).closest('section.slide').on('shown', function() { + if (dygraph) + dygraph.resize(); + }); + + // redraw on R Markdown {.tabset} tab visibility changed + var tab = $(el).closest('div.tab-pane'); + if (tab !== null) { + var tabID = tab.attr('id'); + var tabAnchor = $('a[data-toggle="tab"][href="#' + tabID + '"]'); + if (tabAnchor !== null) { + tabAnchor.on('shown.bs.tab', function() { + if (dygraph) + dygraph.resize(); + }); + } + } + // add default font for viewer mode + if (this.queryVar("viewer_pane") === "1") + document.body.style.fontFamily = "Arial, sans-serif"; + + // inject css if necessary + if (x.css != null) { + var style = document.createElement('style'); + style.type = 'text/css'; + if (style.styleSheet) + style.styleSheet.cssText = x.css; + else + style.appendChild(document.createTextNode(x.css)); + document.getElementsByTagName("head")[0].appendChild(style); + } + + } else { + + // retain the userDateWindow if requested + if (dygraph.userDateWindow != null + && attrs.retainDateWindow == true) { + attrs.dateWindow = dygraph.xAxisRange(); + } + + // remove it from groups if it's there + if (x.group != null && groups[x.group] != null) { + var index = groups[x.group].indexOf(dygraph); + if (index != -1) + groups[x.group].splice(index, 1); + } + + // destroy the existing dygraph + dygraph.destroy(); + dygraph = null; + } + + // create the dygraph and add it to it's group (if any) + dygraph = new Dygraph(el, attrs.file, attrs); + dygraph.userDateWindow = attrs.dateWindow; + if (x.group != null) + groups[x.group].push(dygraph); + + // add shiny inputs for date window and click + if (HTMLWidgets.shinyMode) { + var isDate = x.format == "date"; + this.addClickShinyInput(el.id, isDate); + this.addDateWindowShinyInput(el.id, isDate); + } + + // set annotations + if (x.annotations != null) { + dygraph.ready(function() { + if (x.format == "date") { + x.annotations.map(function(annotation) { + var date = thiz.normalizeDateValue(x.scale, annotation.x, x.fixedtz); + annotation.x = date.getTime(); + }); + } + dygraph.setAnnotations(x.annotations); + }); + } + + }, + + customDateTickerFixedTZ : function(tz){ + return function(t,e,a,i,r) { + var a=Dygraph.pickDateTickGranularity(t,e,a,i); + if(a >= 0){ + + var n=i("axisLabelFormatter"), + o=i("labelsUTC"), + s=o?Dygraph.DateAccessorsUTC:Dygraph.DateAccessorsLocal; + l=Dygraph.TICK_PLACEMENT[a].datefield; + h=Dygraph.TICK_PLACEMENT[a].step; + p=Dygraph.TICK_PLACEMENT[a].spacing; + + var y = []; + var d = moment(t); + d.tz(tz); + d.millisecond(0); + + if(l > Dygraph.DATEFIELD_M){ + var x; + if (l === Dygraph.DATEFIELD_SS) { // seconds + x = d.second(); + d.second(x - x % h); + } else if(l === Dygraph.DATEFIELD_MM){ + d.second(0) + x = d.minute(); + d.minute(x - x % h); + } else if(l === Dygraph.DATEFIELD_HH){ + d.second(0); + d.minute(0); + x = d.hour(); + d.hour(x - x % h); + } else if(l === Dygraph.DATEFIELD_D){ + d.second(0); + d.minute(0); + d.hour(0); + if (h == 7) { // one week + d.startOf('week'); + } + } + + v = d.valueOf(); + _=moment(v).tz(tz); + + // For spacings coarser than two-hourly, we want to ignore daylight + // savings transitions to get consistent ticks. For finer-grained ticks, + // it's essential to show the DST transition in all its messiness. + var start_offset_min = moment(v).tz(tz).zone(); + var check_dst = (p >= Dygraph.TICK_PLACEMENT[Dygraph.TWO_HOURLY].spacing); + + if(a<=Dygraph.HOURLY){ + for(t>v&&(v+=p,_=moment(v).tz(tz));e>=v;){ + y.push({v:v,label:n(_,a,i,r)}); + v+=p; + _=moment(v).tz(tz); + } + }else{ + for(t>v&&(v+=p,_=moment(v).tz(tz));e>=v;){ + + // This ensures that we stay on the same hourly "rhythm" across + // daylight savings transitions. Without this, the ticks could get off + // by an hour. See tests/daylight-savings.html or issue 147. + if (check_dst && _.zone() != start_offset_min) { + var delta_min = _.zone() - start_offset_min; + v += delta_min * 60 * 1000; + _= moment(v).tz(tz); + start_offset_min = _.zone(); + + // Check whether we've backed into the previous timezone again. + // This can happen during a "spring forward" transition. In this case, + // it's best to skip this tick altogether (we may be shooting for a + // non-existent time like the 2AM that's skipped) and go to the next + // one. + if (moment(v + p).tz(tz).zone() != start_offset_min) { + v += p; + _= moment(v).tz(tz); + start_offset_min = _.zone(); + } + } + + (a>=Dygraph.DAILY||_.get('hour')%h===0)&&y.push({v:v,label:n(_,a,i,r)}); + v+=p; + _=moment(v).tz(tz); + } + } + }else{ + var start_year = moment(t).tz(tz).year(); + var end_year = moment(e).tz(tz).year(); + var start_month = moment(t).tz(tz).month(); + + if(l === Dygraph.DATEFIELD_M){ + var step_month = h; + for (var ii = start_year; ii <= end_year; ii++) { + for (var j = 0; j < 12;) { + var dt = moment(new Date(ii, j, 1)).tz(tz); + // fix some tz bug + dt.year(ii); + dt.month(j); + dt.date(1); + dt.hour(0); + v = dt.valueOf(); + y.push({v:v,label:n(moment(v).tz(tz),a,i,r)}); + j+=step_month; + } + } + }else{ + var step_year = h; + for (var ii = start_year; ii <= end_year;) { + var dt = moment(new Date(ii, 1, 1)).tz(tz); + // fix some tz bug + dt.year(ii); + dt.month(j); + dt.date(1); + dt.hour(0); + v = dt.valueOf(); + y.push({v:v,label:n(moment(v).tz(tz),a,i,r)}); + ii+=step_year; + } + } + } + return y; + }else{ + return []; + } + }; + }, + + xAxisLabelFormatterFixedTZ : function(tz){ + + return function dateAxisFormatter(date, granularity){ + var mmnt = moment(date).tz(tz); + if (granularity >= Dygraph.DECADAL){ + return mmnt.format('YYYY'); + }else{ + if(granularity >= Dygraph.MONTHLY){ + return mmnt.format('MMM YYYY'); + }else{ + var frac = mmnt.hour() * 3600 + mmnt.minute() * 60 + mmnt.second() + mmnt.millisecond(); + if (frac === 0 || granularity >= Dygraph.DAILY) { + return mmnt.format('DD MMM'); + } else { + if (mmnt.second()) { + return mmnt.format('HH:mm:ss'); + } else { + return mmnt.format('HH:mm'); + } + } + } + + } + } + }, + + xValueFormatterFixedTZ: function(scale, tz) { + + return function(millis) { + var mmnt = moment(millis).tz(tz); + if (scale == "yearly") + return mmnt.format('YYYY') + ' (' + mmnt.zoneAbbr() + ')'; + else if (scale == "quarterly") + return mmnt.fquarter(1) + ' (' + mmnt.zoneAbbr() + ')'; + else if (scale == "monthly") + return mmnt.format('MMM, YYYY')+ ' (' + mmnt.zoneAbbr() + ')'; + else if (scale == "daily" || scale == "weekly") + return mmnt.format('MMM, DD, YYYY')+ ' (' + mmnt.zoneAbbr() + ')'; + else + return mmnt.format('dddd, MMMM DD, YYYY HH:mm:ss')+ ' (' + mmnt.zoneAbbr() + ')'; + } + }, + + xValueFormatter: function(scale) { + + var monthNames = ["Jan", "Feb", "Mar", "Apr", "May", "Jun", + "Jul", "Aug", "Sep", "Oct", "Nov", "Dec"]; + + return function(millis) { + var date = new Date(millis); + if (scale == "yearly") + return date.getFullYear(); + else if (scale == "quarterly") + return moment(millis).fquarter(1); + else if (scale == "monthly") + return monthNames[date.getMonth()] + ', ' + date.getFullYear(); + else if (scale == "daily" || scale == "weekly") + return monthNames[date.getMonth()] + ', ' + + date.getDate() + ', ' + + date.getFullYear(); + else + return date.toLocaleString(); + } + }, + + addZoomCallback: function(x) { + + // alias this + var thiz = this; + + // get attrs + var attrs = x.attrs; + + // check for an existing zoomCallback + var prevZoomCallback = attrs["zoomCallback"]; + + attrs.zoomCallback = function(minDate, maxDate, yRanges) { + + // call existing + if (prevZoomCallback) + prevZoomCallback(minDate, maxDate, yRanges); + + // record user date window (or lack thereof) + if (dygraph.xAxisExtremes()[0] != minDate || + dygraph.xAxisExtremes()[1] != maxDate) { + dygraph.userDateWindow = [minDate, maxDate]; + } else { + dygraph.userDateWindow = null; + } + + // record in group if necessary + if (x.group != null && groups[x.group] != null) { + var group = groups[x.group]; + for(var i = 0; i=0.1){ + var dashLength = dashArray[dashIndex++%dashCount]; + if (dashLength > distRemaining) dashLength = distRemaining; + var xStep = Math.sqrt( dashLength*dashLength / (1 + slope*slope) ); + if (dx<0) xStep = -xStep; + x += xStep + y += slope*xStep; + canvas[draw ? 'lineTo' : 'moveTo'](x,y); + distRemaining -= dashLength; + draw = !draw; + } + canvas.stroke(); + }, + + setFontSize: function(canvas, size) { + var cFont = canvas.font; + var parts = cFont.split(' '); + if (parts.length === 2) + canvas.font = size + 'px ' + parts[1]; + else if (parts.length === 3) + canvas.font = parts[0] + ' ' + size + 'px ' + parts[2]; + }, + + // Returns the value of a GET variable + queryVar: function(name) { + return decodeURI(window.location.search.replace( + new RegExp("^(?:.*[&\\?]" + + encodeURI(name).replace(/[\.\+\*]/g, "\\$&") + + "(?:\\=([^&]*))?)?.*$", "i"), + "$1")); + }, + + // We deal exclusively in UTC dates within R, however dygraphs deals + // exclusively in the local time zone. Therefore, in order to plot date + // labels that make sense to the user when we are dealing with days, + // months or years we need to convert the UTC date value to a local time + // value that "looks like" the equivilant UTC value. To do this we add the + // timezone offset to the UTC date. + // Don't use in case of fixedtz + normalizeDateValue: function(scale, value, fixedtz) { + var date = new Date(value); + if (scale != "minute" && scale != "hourly" && scale != "seconds" && !fixedtz) { + var localAsUTC = date.getTime() + (date.getTimezoneOffset() * 60000); + date = new Date(localAsUTC); + } + return date; + }, + + // safely detect rendering on a mobile phone + isMobilePhone: function() { + try + { + return ! window.matchMedia("only screen and (min-width: 768px)").matches; + } + catch(e) { + return false; + } + }, + + + resize: function(width, height) { + if (dygraph) + dygraph.resize(); + }, + + // export dygraph so other code can get a hold of it + dygraph: dygraph + + }; + }, + + // track groups globally + groups: {} + +}); + diff --git a/docs/articles/manipulateWidgets_files/htmlwidgets-0.8/htmlwidgets.js b/docs/articles/manipulateWidgets_files/htmlwidgets-0.8/htmlwidgets.js new file mode 100644 index 0000000..7193c78 --- /dev/null +++ b/docs/articles/manipulateWidgets_files/htmlwidgets-0.8/htmlwidgets.js @@ -0,0 +1,836 @@ +(function() { + // If window.HTMLWidgets is already defined, then use it; otherwise create a + // new object. This allows preceding code to set options that affect the + // initialization process (though none currently exist). + window.HTMLWidgets = window.HTMLWidgets || {}; + + // See if we're running in a viewer pane. If not, we're in a web browser. + var viewerMode = window.HTMLWidgets.viewerMode = + /\bviewer_pane=1\b/.test(window.location); + + // See if we're running in Shiny mode. If not, it's a static document. + // Note that static widgets can appear in both Shiny and static modes, but + // obviously, Shiny widgets can only appear in Shiny apps/documents. + var shinyMode = window.HTMLWidgets.shinyMode = + typeof(window.Shiny) !== "undefined" && !!window.Shiny.outputBindings; + + // We can't count on jQuery being available, so we implement our own + // version if necessary. + function querySelectorAll(scope, selector) { + if (typeof(jQuery) !== "undefined" && scope instanceof jQuery) { + return scope.find(selector); + } + if (scope.querySelectorAll) { + return scope.querySelectorAll(selector); + } + } + + function asArray(value) { + if (value === null) + return []; + if ($.isArray(value)) + return value; + return [value]; + } + + // Implement jQuery's extend + function extend(target /*, ... */) { + if (arguments.length == 1) { + return target; + } + for (var i = 1; i < arguments.length; i++) { + var source = arguments[i]; + for (var prop in source) { + if (source.hasOwnProperty(prop)) { + target[prop] = source[prop]; + } + } + } + return target; + } + + // IE8 doesn't support Array.forEach. + function forEach(values, callback, thisArg) { + if (values.forEach) { + values.forEach(callback, thisArg); + } else { + for (var i = 0; i < values.length; i++) { + callback.call(thisArg, values[i], i, values); + } + } + } + + // Replaces the specified method with the return value of funcSource. + // + // Note that funcSource should not BE the new method, it should be a function + // that RETURNS the new method. funcSource receives a single argument that is + // the overridden method, it can be called from the new method. The overridden + // method can be called like a regular function, it has the target permanently + // bound to it so "this" will work correctly. + function overrideMethod(target, methodName, funcSource) { + var superFunc = target[methodName] || function() {}; + var superFuncBound = function() { + return superFunc.apply(target, arguments); + }; + target[methodName] = funcSource(superFuncBound); + } + + // Add a method to delegator that, when invoked, calls + // delegatee.methodName. If there is no such method on + // the delegatee, but there was one on delegator before + // delegateMethod was called, then the original version + // is invoked instead. + // For example: + // + // var a = { + // method1: function() { console.log('a1'); } + // method2: function() { console.log('a2'); } + // }; + // var b = { + // method1: function() { console.log('b1'); } + // }; + // delegateMethod(a, b, "method1"); + // delegateMethod(a, b, "method2"); + // a.method1(); + // a.method2(); + // + // The output would be "b1", "a2". + function delegateMethod(delegator, delegatee, methodName) { + var inherited = delegator[methodName]; + delegator[methodName] = function() { + var target = delegatee; + var method = delegatee[methodName]; + + // The method doesn't exist on the delegatee. Instead, + // call the method on the delegator, if it exists. + if (!method) { + target = delegator; + method = inherited; + } + + if (method) { + return method.apply(target, arguments); + } + }; + } + + // Implement a vague facsimilie of jQuery's data method + function elementData(el, name, value) { + if (arguments.length == 2) { + return el["htmlwidget_data_" + name]; + } else if (arguments.length == 3) { + el["htmlwidget_data_" + name] = value; + return el; + } else { + throw new Error("Wrong number of arguments for elementData: " + + arguments.length); + } + } + + // http://stackoverflow.com/questions/3446170/escape-string-for-use-in-javascript-regex + function escapeRegExp(str) { + return str.replace(/[\-\[\]\/\{\}\(\)\*\+\?\.\\\^\$\|]/g, "\\$&"); + } + + function hasClass(el, className) { + var re = new RegExp("\\b" + escapeRegExp(className) + "\\b"); + return re.test(el.className); + } + + // elements - array (or array-like object) of HTML elements + // className - class name to test for + // include - if true, only return elements with given className; + // if false, only return elements *without* given className + function filterByClass(elements, className, include) { + var results = []; + for (var i = 0; i < elements.length; i++) { + if (hasClass(elements[i], className) == include) + results.push(elements[i]); + } + return results; + } + + function on(obj, eventName, func) { + if (obj.addEventListener) { + obj.addEventListener(eventName, func, false); + } else if (obj.attachEvent) { + obj.attachEvent(eventName, func); + } + } + + function off(obj, eventName, func) { + if (obj.removeEventListener) + obj.removeEventListener(eventName, func, false); + else if (obj.detachEvent) { + obj.detachEvent(eventName, func); + } + } + + // Translate array of values to top/right/bottom/left, as usual with + // the "padding" CSS property + // https://developer.mozilla.org/en-US/docs/Web/CSS/padding + function unpackPadding(value) { + if (typeof(value) === "number") + value = [value]; + if (value.length === 1) { + return {top: value[0], right: value[0], bottom: value[0], left: value[0]}; + } + if (value.length === 2) { + return {top: value[0], right: value[1], bottom: value[0], left: value[1]}; + } + if (value.length === 3) { + return {top: value[0], right: value[1], bottom: value[2], left: value[1]}; + } + if (value.length === 4) { + return {top: value[0], right: value[1], bottom: value[2], left: value[3]}; + } + } + + // Convert an unpacked padding object to a CSS value + function paddingToCss(paddingObj) { + return paddingObj.top + "px " + paddingObj.right + "px " + paddingObj.bottom + "px " + paddingObj.left + "px"; + } + + // Makes a number suitable for CSS + function px(x) { + if (typeof(x) === "number") + return x + "px"; + else + return x; + } + + // Retrieves runtime widget sizing information for an element. + // The return value is either null, or an object with fill, padding, + // defaultWidth, defaultHeight fields. + function sizingPolicy(el) { + var sizingEl = document.querySelector("script[data-for='" + el.id + "'][type='application/htmlwidget-sizing']"); + if (!sizingEl) + return null; + var sp = JSON.parse(sizingEl.textContent || sizingEl.text || "{}"); + if (viewerMode) { + return sp.viewer; + } else { + return sp.browser; + } + } + + // @param tasks Array of strings (or falsy value, in which case no-op). + // Each element must be a valid JavaScript expression that yields a + // function. Or, can be an array of objects with "code" and "data" + // properties; in this case, the "code" property should be a string + // of JS that's an expr that yields a function, and "data" should be + // an object that will be added as an additional argument when that + // function is called. + // @param target The object that will be "this" for each function + // execution. + // @param args Array of arguments to be passed to the functions. (The + // same arguments will be passed to all functions.) + function evalAndRun(tasks, target, args) { + if (tasks) { + forEach(tasks, function(task) { + var theseArgs = args; + if (typeof(task) === "object") { + theseArgs = theseArgs.concat([task.data]); + task = task.code; + } + var taskFunc = eval("(" + task + ")"); + if (typeof(taskFunc) !== "function") { + throw new Error("Task must be a function! Source:\n" + task); + } + taskFunc.apply(target, theseArgs); + }); + } + } + + function initSizing(el) { + var sizing = sizingPolicy(el); + if (!sizing) + return; + + var cel = document.getElementById("htmlwidget_container"); + if (!cel) + return; + + if (typeof(sizing.padding) !== "undefined") { + document.body.style.margin = "0"; + document.body.style.padding = paddingToCss(unpackPadding(sizing.padding)); + } + + if (sizing.fill) { + document.body.style.overflow = "hidden"; + document.body.style.width = "100%"; + document.body.style.height = "100%"; + document.documentElement.style.width = "100%"; + document.documentElement.style.height = "100%"; + if (cel) { + cel.style.position = "absolute"; + var pad = unpackPadding(sizing.padding); + cel.style.top = pad.top + "px"; + cel.style.right = pad.right + "px"; + cel.style.bottom = pad.bottom + "px"; + cel.style.left = pad.left + "px"; + el.style.width = "100%"; + el.style.height = "100%"; + } + + return { + getWidth: function() { return cel.offsetWidth; }, + getHeight: function() { return cel.offsetHeight; } + }; + + } else { + el.style.width = px(sizing.width); + el.style.height = px(sizing.height); + + return { + getWidth: function() { return el.offsetWidth; }, + getHeight: function() { return el.offsetHeight; } + }; + } + } + + // Default implementations for methods + var defaults = { + find: function(scope) { + return querySelectorAll(scope, "." + this.name); + }, + renderError: function(el, err) { + var $el = $(el); + + this.clearError(el); + + // Add all these error classes, as Shiny does + var errClass = "shiny-output-error"; + if (err.type !== null) { + // use the classes of the error condition as CSS class names + errClass = errClass + " " + $.map(asArray(err.type), function(type) { + return errClass + "-" + type; + }).join(" "); + } + errClass = errClass + " htmlwidgets-error"; + + // Is el inline or block? If inline or inline-block, just display:none it + // and add an inline error. + var display = $el.css("display"); + $el.data("restore-display-mode", display); + + if (display === "inline" || display === "inline-block") { + $el.hide(); + if (err.message !== "") { + var errorSpan = $("").addClass(errClass); + errorSpan.text(err.message); + $el.after(errorSpan); + } + } else if (display === "block") { + // If block, add an error just after the el, set visibility:none on the + // el, and position the error to be on top of the el. + // Mark it with a unique ID and CSS class so we can remove it later. + $el.css("visibility", "hidden"); + if (err.message !== "") { + var errorDiv = $("
    ").addClass(errClass).css("position", "absolute") + .css("top", el.offsetTop) + .css("left", el.offsetLeft) + // setting width can push out the page size, forcing otherwise + // unnecessary scrollbars to appear and making it impossible for + // the element to shrink; so use max-width instead + .css("maxWidth", el.offsetWidth) + .css("height", el.offsetHeight); + errorDiv.text(err.message); + $el.after(errorDiv); + + // Really dumb way to keep the size/position of the error in sync with + // the parent element as the window is resized or whatever. + var intId = setInterval(function() { + if (!errorDiv[0].parentElement) { + clearInterval(intId); + return; + } + errorDiv + .css("top", el.offsetTop) + .css("left", el.offsetLeft) + .css("maxWidth", el.offsetWidth) + .css("height", el.offsetHeight); + }, 500); + } + } + }, + clearError: function(el) { + var $el = $(el); + var display = $el.data("restore-display-mode"); + $el.data("restore-display-mode", null); + + if (display === "inline" || display === "inline-block") { + if (display) + $el.css("display", display); + $(el.nextSibling).filter(".htmlwidgets-error").remove(); + } else if (display === "block"){ + $el.css("visibility", "inherit"); + $(el.nextSibling).filter(".htmlwidgets-error").remove(); + } + }, + sizing: {} + }; + + // Called by widget bindings to register a new type of widget. The definition + // object can contain the following properties: + // - name (required) - A string indicating the binding name, which will be + // used by default as the CSS classname to look for. + // - initialize (optional) - A function(el) that will be called once per + // widget element; if a value is returned, it will be passed as the third + // value to renderValue. + // - renderValue (required) - A function(el, data, initValue) that will be + // called with data. Static contexts will cause this to be called once per + // element; Shiny apps will cause this to be called multiple times per + // element, as the data changes. + window.HTMLWidgets.widget = function(definition) { + if (!definition.name) { + throw new Error("Widget must have a name"); + } + if (!definition.type) { + throw new Error("Widget must have a type"); + } + // Currently we only support output widgets + if (definition.type !== "output") { + throw new Error("Unrecognized widget type '" + definition.type + "'"); + } + // TODO: Verify that .name is a valid CSS classname + + // Support new-style instance-bound definitions. Old-style class-bound + // definitions have one widget "object" per widget per type/class of + // widget; the renderValue and resize methods on such widget objects + // take el and instance arguments, because the widget object can't + // store them. New-style instance-bound definitions have one widget + // object per widget instance; the definition that's passed in doesn't + // provide renderValue or resize methods at all, just the single method + // factory(el, width, height) + // which returns an object that has renderValue(x) and resize(w, h). + // This enables a far more natural programming style for the widget + // author, who can store per-instance state using either OO-style + // instance fields or functional-style closure variables (I guess this + // is in contrast to what can only be called C-style pseudo-OO which is + // what we required before). + if (definition.factory) { + definition = createLegacyDefinitionAdapter(definition); + } + + if (!definition.renderValue) { + throw new Error("Widget must have a renderValue function"); + } + + // For static rendering (non-Shiny), use a simple widget registration + // scheme. We also use this scheme for Shiny apps/documents that also + // contain static widgets. + window.HTMLWidgets.widgets = window.HTMLWidgets.widgets || []; + // Merge defaults into the definition; don't mutate the original definition. + var staticBinding = extend({}, defaults, definition); + overrideMethod(staticBinding, "find", function(superfunc) { + return function(scope) { + var results = superfunc(scope); + // Filter out Shiny outputs, we only want the static kind + return filterByClass(results, "html-widget-output", false); + }; + }); + window.HTMLWidgets.widgets.push(staticBinding); + + if (shinyMode) { + // Shiny is running. Register the definition with an output binding. + // The definition itself will not be the output binding, instead + // we will make an output binding object that delegates to the + // definition. This is because we foolishly used the same method + // name (renderValue) for htmlwidgets definition and Shiny bindings + // but they actually have quite different semantics (the Shiny + // bindings receive data that includes lots of metadata that it + // strips off before calling htmlwidgets renderValue). We can't + // just ignore the difference because in some widgets it's helpful + // to call this.renderValue() from inside of resize(), and if + // we're not delegating, then that call will go to the Shiny + // version instead of the htmlwidgets version. + + // Merge defaults with definition, without mutating either. + var bindingDef = extend({}, defaults, definition); + + // This object will be our actual Shiny binding. + var shinyBinding = new Shiny.OutputBinding(); + + // With a few exceptions, we'll want to simply use the bindingDef's + // version of methods if they are available, otherwise fall back to + // Shiny's defaults. NOTE: If Shiny's output bindings gain additional + // methods in the future, and we want them to be overrideable by + // HTMLWidget binding definitions, then we'll need to add them to this + // list. + delegateMethod(shinyBinding, bindingDef, "getId"); + delegateMethod(shinyBinding, bindingDef, "onValueChange"); + delegateMethod(shinyBinding, bindingDef, "onValueError"); + delegateMethod(shinyBinding, bindingDef, "renderError"); + delegateMethod(shinyBinding, bindingDef, "clearError"); + delegateMethod(shinyBinding, bindingDef, "showProgress"); + + // The find, renderValue, and resize are handled differently, because we + // want to actually decorate the behavior of the bindingDef methods. + + shinyBinding.find = function(scope) { + var results = bindingDef.find(scope); + + // Only return elements that are Shiny outputs, not static ones + var dynamicResults = results.filter(".html-widget-output"); + + // It's possible that whatever caused Shiny to think there might be + // new dynamic outputs, also caused there to be new static outputs. + // Since there might be lots of different htmlwidgets bindings, we + // schedule execution for later--no need to staticRender multiple + // times. + if (results.length !== dynamicResults.length) + scheduleStaticRender(); + + return dynamicResults; + }; + + // Wrap renderValue to handle initialization, which unfortunately isn't + // supported natively by Shiny at the time of this writing. + + shinyBinding.renderValue = function(el, data) { + // Resolve strings marked as javascript literals to objects + if (!(data.evals instanceof Array)) data.evals = [data.evals]; + for (var i = 0; data.evals && i < data.evals.length; i++) { + window.HTMLWidgets.evaluateStringMember(data.x, data.evals[i]); + } + if (!bindingDef.renderOnNullValue) { + if (data.x === null) { + el.style.visibility = "hidden"; + return; + } else { + el.style.visibility = "inherit"; + } + } + if (!elementData(el, "initialized")) { + initSizing(el); + + elementData(el, "initialized", true); + if (bindingDef.initialize) { + var result = bindingDef.initialize(el, el.offsetWidth, + el.offsetHeight); + elementData(el, "init_result", result); + } + } + Shiny.renderDependencies(data.deps); + bindingDef.renderValue(el, data.x, elementData(el, "init_result")); + evalAndRun(data.jsHooks.render, elementData(el, "init_result"), [el, data.x]); + }; + + // Only override resize if bindingDef implements it + if (bindingDef.resize) { + shinyBinding.resize = function(el, width, height) { + // Shiny can call resize before initialize/renderValue have been + // called, which doesn't make sense for widgets. + if (elementData(el, "initialized")) { + bindingDef.resize(el, width, height, elementData(el, "init_result")); + } + }; + } + + Shiny.outputBindings.register(shinyBinding, bindingDef.name); + } + }; + + var scheduleStaticRenderTimerId = null; + function scheduleStaticRender() { + if (!scheduleStaticRenderTimerId) { + scheduleStaticRenderTimerId = setTimeout(function() { + scheduleStaticRenderTimerId = null; + window.HTMLWidgets.staticRender(); + }, 1); + } + } + + // Render static widgets after the document finishes loading + // Statically render all elements that are of this widget's class + window.HTMLWidgets.staticRender = function() { + var bindings = window.HTMLWidgets.widgets || []; + forEach(bindings, function(binding) { + var matches = binding.find(document.documentElement); + forEach(matches, function(el) { + var sizeObj = initSizing(el, binding); + + if (hasClass(el, "html-widget-static-bound")) + return; + el.className = el.className + " html-widget-static-bound"; + + var initResult; + if (binding.initialize) { + initResult = binding.initialize(el, + sizeObj ? sizeObj.getWidth() : el.offsetWidth, + sizeObj ? sizeObj.getHeight() : el.offsetHeight + ); + elementData(el, "init_result", initResult); + } + + if (binding.resize) { + var lastSize = {}; + var resizeHandler = function(e) { + var size = { + w: sizeObj ? sizeObj.getWidth() : el.offsetWidth, + h: sizeObj ? sizeObj.getHeight() : el.offsetHeight + }; + if (size.w === 0 && size.h === 0) + return; + if (size.w === lastSize.w && size.h === lastSize.h) + return; + lastSize = size; + binding.resize(el, size.w, size.h, initResult); + }; + + on(window, "resize", resizeHandler); + + // This is needed for cases where we're running in a Shiny + // app, but the widget itself is not a Shiny output, but + // rather a simple static widget. One example of this is + // an rmarkdown document that has runtime:shiny and widget + // that isn't in a render function. Shiny only knows to + // call resize handlers for Shiny outputs, not for static + // widgets, so we do it ourselves. + if (window.jQuery) { + window.jQuery(document).on( + "shown.htmlwidgets shown.bs.tab.htmlwidgets shown.bs.collapse.htmlwidgets", + resizeHandler + ); + window.jQuery(document).on( + "hidden.htmlwidgets hidden.bs.tab.htmlwidgets hidden.bs.collapse.htmlwidgets", + resizeHandler + ); + } + + // This is needed for the specific case of ioslides, which + // flips slides between display:none and display:block. + // Ideally we would not have to have ioslide-specific code + // here, but rather have ioslides raise a generic event, + // but the rmarkdown package just went to CRAN so the + // window to getting that fixed may be long. + if (window.addEventListener) { + // It's OK to limit this to window.addEventListener + // browsers because ioslides itself only supports + // such browsers. + on(document, "slideenter", resizeHandler); + on(document, "slideleave", resizeHandler); + } + } + + var scriptData = document.querySelector("script[data-for='" + el.id + "'][type='application/json']"); + if (scriptData) { + var data = JSON.parse(scriptData.textContent || scriptData.text); + // Resolve strings marked as javascript literals to objects + if (!(data.evals instanceof Array)) data.evals = [data.evals]; + for (var k = 0; data.evals && k < data.evals.length; k++) { + window.HTMLWidgets.evaluateStringMember(data.x, data.evals[k]); + } + binding.renderValue(el, data.x, initResult); + evalAndRun(data.jsHooks.render, initResult, [el, data.x]); + } + }); + }); + + invokePostRenderHandlers(); + } + + // Wait until after the document has loaded to render the widgets. + if (document.addEventListener) { + document.addEventListener("DOMContentLoaded", function() { + document.removeEventListener("DOMContentLoaded", arguments.callee, false); + window.HTMLWidgets.staticRender(); + }, false); + } else if (document.attachEvent) { + document.attachEvent("onreadystatechange", function() { + if (document.readyState === "complete") { + document.detachEvent("onreadystatechange", arguments.callee); + window.HTMLWidgets.staticRender(); + } + }); + } + + + window.HTMLWidgets.getAttachmentUrl = function(depname, key) { + // If no key, default to the first item + if (typeof(key) === "undefined") + key = 1; + + var link = document.getElementById(depname + "-" + key + "-attachment"); + if (!link) { + throw new Error("Attachment " + depname + "/" + key + " not found in document"); + } + return link.getAttribute("href"); + }; + + window.HTMLWidgets.dataframeToD3 = function(df) { + var names = []; + var length; + for (var name in df) { + if (df.hasOwnProperty(name)) + names.push(name); + if (typeof(df[name]) !== "object" || typeof(df[name].length) === "undefined") { + throw new Error("All fields must be arrays"); + } else if (typeof(length) !== "undefined" && length !== df[name].length) { + throw new Error("All fields must be arrays of the same length"); + } + length = df[name].length; + } + var results = []; + var item; + for (var row = 0; row < length; row++) { + item = {}; + for (var col = 0; col < names.length; col++) { + item[names[col]] = df[names[col]][row]; + } + results.push(item); + } + return results; + }; + + window.HTMLWidgets.transposeArray2D = function(array) { + if (array.length === 0) return array; + var newArray = array[0].map(function(col, i) { + return array.map(function(row) { + return row[i] + }) + }); + return newArray; + }; + // Split value at splitChar, but allow splitChar to be escaped + // using escapeChar. Any other characters escaped by escapeChar + // will be included as usual (including escapeChar itself). + function splitWithEscape(value, splitChar, escapeChar) { + var results = []; + var escapeMode = false; + var currentResult = ""; + for (var pos = 0; pos < value.length; pos++) { + if (!escapeMode) { + if (value[pos] === splitChar) { + results.push(currentResult); + currentResult = ""; + } else if (value[pos] === escapeChar) { + escapeMode = true; + } else { + currentResult += value[pos]; + } + } else { + currentResult += value[pos]; + escapeMode = false; + } + } + if (currentResult !== "") { + results.push(currentResult); + } + return results; + } + // Function authored by Yihui/JJ Allaire + window.HTMLWidgets.evaluateStringMember = function(o, member) { + var parts = splitWithEscape(member, '.', '\\'); + for (var i = 0, l = parts.length; i < l; i++) { + var part = parts[i]; + // part may be a character or 'numeric' member name + if (o !== null && typeof o === "object" && part in o) { + if (i == (l - 1)) { // if we are at the end of the line then evalulate + if (typeof o[part] === "string") + o[part] = eval("(" + o[part] + ")"); + } else { // otherwise continue to next embedded object + o = o[part]; + } + } + } + }; + + // Retrieve the HTMLWidget instance (i.e. the return value of an + // HTMLWidget binding's initialize() or factory() function) + // associated with an element, or null if none. + window.HTMLWidgets.getInstance = function(el) { + return elementData(el, "init_result"); + }; + + // Finds the first element in the scope that matches the selector, + // and returns the HTMLWidget instance (i.e. the return value of + // an HTMLWidget binding's initialize() or factory() function) + // associated with that element, if any. If no element matches the + // selector, or the first matching element has no HTMLWidget + // instance associated with it, then null is returned. + // + // The scope argument is optional, and defaults to window.document. + window.HTMLWidgets.find = function(scope, selector) { + if (arguments.length == 1) { + selector = scope; + scope = document; + } + + var el = scope.querySelector(selector); + if (el === null) { + return null; + } else { + return window.HTMLWidgets.getInstance(el); + } + }; + + // Finds all elements in the scope that match the selector, and + // returns the HTMLWidget instances (i.e. the return values of + // an HTMLWidget binding's initialize() or factory() function) + // associated with the elements, in an array. If elements that + // match the selector don't have an associated HTMLWidget + // instance, the returned array will contain nulls. + // + // The scope argument is optional, and defaults to window.document. + window.HTMLWidgets.findAll = function(scope, selector) { + if (arguments.length == 1) { + selector = scope; + scope = document; + } + + var nodes = scope.querySelectorAll(selector); + var results = []; + for (var i = 0; i < nodes.length; i++) { + results.push(window.HTMLWidgets.getInstance(nodes[i])); + } + return results; + }; + + var postRenderHandlers = []; + function invokePostRenderHandlers() { + while (postRenderHandlers.length) { + var handler = postRenderHandlers.shift(); + if (handler) { + handler(); + } + } + } + + // Register the given callback function to be invoked after the + // next time static widgets are rendered. + window.HTMLWidgets.addPostRenderHandler = function(callback) { + postRenderHandlers.push(callback); + }; + + // Takes a new-style instance-bound definition, and returns an + // old-style class-bound definition. This saves us from having + // to rewrite all the logic in this file to accomodate both + // types of definitions. + function createLegacyDefinitionAdapter(defn) { + var result = { + name: defn.name, + type: defn.type, + initialize: function(el, width, height) { + return defn.factory(el, width, height); + }, + renderValue: function(el, x, instance) { + return instance.renderValue(x); + }, + resize: function(el, width, height, instance) { + return instance.resize(width, height); + } + }; + + if (defn.find) + result.find = defn.find; + if (defn.renderError) + result.renderError = defn.renderError; + if (defn.clearError) + result.clearError = defn.clearError; + + return result; + } +})(); + diff --git a/docs/articles/manipulateWidgets_files/jquery-1.11.1/AUTHORS.txt b/docs/articles/manipulateWidgets_files/jquery-1.11.1/AUTHORS.txt new file mode 100644 index 0000000..14a0e68 --- /dev/null +++ b/docs/articles/manipulateWidgets_files/jquery-1.11.1/AUTHORS.txt @@ -0,0 +1,217 @@ +Authors ordered by first contribution. + +John Resig +Gilles van den Hoven +Michael Geary +Stefan Petre +Yehuda Katz +Corey Jewett +Klaus Hartl +Franck Marcia +Jörn Zaefferer +Paul Bakaus +Brandon Aaron +Mike Alsup +Dave Methvin +Ed Engelhardt +Sean Catchpole +Paul Mclanahan +David Serduke +Richard D. Worth +Scott González +Ariel Flesler +Jon Evans +TJ Holowaychuk +Michael Bensoussan +Robert Katić +Louis-Rémi Babé +Earle Castledine +Damian Janowski +Rich Dougherty +Kim Dalsgaard +Andrea Giammarchi +Mark Gibson +Karl Swedberg +Justin Meyer +Ben Alman +James Padolsey +David Petersen +Batiste Bieler +Alexander Farkas +Rick Waldron +Filipe Fortes +Neeraj Singh +Paul Irish +Iraê Carvalho +Matt Curry +Michael Monteleone +Noah Sloan +Tom Viner +Douglas Neiner +Adam J. Sontag +Dave Reed +Ralph Whitbeck +Carl Fürstenberg +Jacob Wright +J. Ryan Stinnett +unknown +temp01 +Heungsub Lee +Colin Snover +Ryan W Tenney +Pinhook +Ron Otten +Jephte Clain +Anton Matzneller +Alex Sexton +Dan Heberden +Henri Wiechers +Russell Holbrook +Julian Aubourg +Gianni Alessandro Chiappetta +Scott Jehl +James Burke +Jonas Pfenniger +Xavi Ramirez +Jared Grippe +Sylvester Keil +Brandon Sterne +Mathias Bynens +Timmy Willison +Corey Frang +Digitalxero +Anton Kovalyov +David Murdoch +Josh Varner +Charles McNulty +Jordan Boesch +Jess Thrysoee +Michael Murray +Lee Carpenter +Alexis Abril +Rob Morgan +John Firebaugh +Sam Bisbee +Gilmore Davidson +Brian Brennan +Xavier Montillet +Daniel Pihlstrom +Sahab Yazdani +avaly +Scott Hughes +Mike Sherov +Greg Hazel +Schalk Neethling +Denis Knauf +Timo Tijhof +Steen Nielsen +Anton Ryzhov +Shi Chuan +Berker Peksag +Toby Brain +Matt Mueller +Justin +Daniel Herman +Oleg Gaidarenko +Richard Gibson +Rafaël Blais Masson +cmc3cn <59194618@qq.com> +Joe Presbrey +Sindre Sorhus +Arne de Bree +Vladislav Zarakovsky +Andrew E Monat +Oskari +Joao Henrique de Andrade Bruni +tsinha +Matt Farmer +Trey Hunner +Jason Moon +Jeffery To +Kris Borchers +Vladimir Zhuravlev +Jacob Thornton +Chad Killingsworth +Nowres Rafid +David Benjamin +Uri Gilad +Chris Faulkner +Elijah Manor +Daniel Chatfield +Nikita Govorov +Wesley Walser +Mike Pennisi +Markus Staab +Dave Riddle +Callum Macrae +Benjamin Truyman +James Huston +Erick Ruiz de Chávez +David Bonner +Akintayo Akinwunmi +MORGAN +Ismail Khair +Carl Danley +Mike Petrovich +Greg Lavallee +Daniel Gálvez +Sai Lung Wong +Tom H Fuertes +Roland Eckl +Jay Merrifield +Allen J Schmidt Jr +Jonathan Sampson +Marcel Greter +Matthias Jäggli +David Fox +Yiming He +Devin Cooper +Paul Ramos +Rod Vagg +Bennett Sorbo +Sebastian Burkhard +nanto +Danil Somsikov +Ryunosuke SATO +Jean Boussier +Adam Coulombe +Andrew Plummer +Mark Raddatz +Dmitry Gusev +Michał Gołębiowski +Nguyen Phuc Lam +Tom H Fuertes +Brandon Johnson +Jason Bedard +Kyle Robinson Young +Renato Oliveira dos Santos +Chris Talkington +Eddie Monge +Terry Jones +Jason Merino +Jeremy Dunck +Chris Price +Amey Sakhadeo +Anthony Ryan +Dominik D. Geyer +George Kats +Lihan Li +Ronny Springer +Marian Sollmann +Corey Frang +Chris Antaki +Noah Hamann +David Hong +Jakob Stoeck +Christopher Jones +Forbes Lindesay +John Paul +S. Andrew Sheppard +Leonardo Balter +Roman Reiß +Benjy Cui +Rodrigo Rosenfeld Rosas +John Hoven +Christian Kosmowski +Liang Peng +TJ VanToll diff --git a/docs/articles/manipulateWidgets_files/jquery-1.11.1/jquery.min.js b/docs/articles/manipulateWidgets_files/jquery-1.11.1/jquery.min.js new file mode 100644 index 0000000..ab28a24 --- /dev/null +++ b/docs/articles/manipulateWidgets_files/jquery-1.11.1/jquery.min.js @@ -0,0 +1,4 @@ +/*! jQuery v1.11.1 | (c) 2005, 2014 jQuery Foundation, Inc. | jquery.org/license */ +!function(a,b){"object"==typeof module&&"object"==typeof module.exports?module.exports=a.document?b(a,!0):function(a){if(!a.document)throw new Error("jQuery requires a window with a document");return b(a)}:b(a)}("undefined"!=typeof window?window:this,function(a,b){var c=[],d=c.slice,e=c.concat,f=c.push,g=c.indexOf,h={},i=h.toString,j=h.hasOwnProperty,k={},l="1.11.1",m=function(a,b){return new m.fn.init(a,b)},n=/^[\s\uFEFF\xA0]+|[\s\uFEFF\xA0]+$/g,o=/^-ms-/,p=/-([\da-z])/gi,q=function(a,b){return b.toUpperCase()};m.fn=m.prototype={jquery:l,constructor:m,selector:"",length:0,toArray:function(){return d.call(this)},get:function(a){return null!=a?0>a?this[a+this.length]:this[a]:d.call(this)},pushStack:function(a){var b=m.merge(this.constructor(),a);return b.prevObject=this,b.context=this.context,b},each:function(a,b){return m.each(this,a,b)},map:function(a){return this.pushStack(m.map(this,function(b,c){return a.call(b,c,b)}))},slice:function(){return this.pushStack(d.apply(this,arguments))},first:function(){return this.eq(0)},last:function(){return this.eq(-1)},eq:function(a){var b=this.length,c=+a+(0>a?b:0);return this.pushStack(c>=0&&b>c?[this[c]]:[])},end:function(){return this.prevObject||this.constructor(null)},push:f,sort:c.sort,splice:c.splice},m.extend=m.fn.extend=function(){var a,b,c,d,e,f,g=arguments[0]||{},h=1,i=arguments.length,j=!1;for("boolean"==typeof g&&(j=g,g=arguments[h]||{},h++),"object"==typeof g||m.isFunction(g)||(g={}),h===i&&(g=this,h--);i>h;h++)if(null!=(e=arguments[h]))for(d in e)a=g[d],c=e[d],g!==c&&(j&&c&&(m.isPlainObject(c)||(b=m.isArray(c)))?(b?(b=!1,f=a&&m.isArray(a)?a:[]):f=a&&m.isPlainObject(a)?a:{},g[d]=m.extend(j,f,c)):void 0!==c&&(g[d]=c));return g},m.extend({expando:"jQuery"+(l+Math.random()).replace(/\D/g,""),isReady:!0,error:function(a){throw new Error(a)},noop:function(){},isFunction:function(a){return"function"===m.type(a)},isArray:Array.isArray||function(a){return"array"===m.type(a)},isWindow:function(a){return null!=a&&a==a.window},isNumeric:function(a){return!m.isArray(a)&&a-parseFloat(a)>=0},isEmptyObject:function(a){var b;for(b in a)return!1;return!0},isPlainObject:function(a){var b;if(!a||"object"!==m.type(a)||a.nodeType||m.isWindow(a))return!1;try{if(a.constructor&&!j.call(a,"constructor")&&!j.call(a.constructor.prototype,"isPrototypeOf"))return!1}catch(c){return!1}if(k.ownLast)for(b in a)return j.call(a,b);for(b in a);return void 0===b||j.call(a,b)},type:function(a){return null==a?a+"":"object"==typeof a||"function"==typeof a?h[i.call(a)]||"object":typeof a},globalEval:function(b){b&&m.trim(b)&&(a.execScript||function(b){a.eval.call(a,b)})(b)},camelCase:function(a){return a.replace(o,"ms-").replace(p,q)},nodeName:function(a,b){return a.nodeName&&a.nodeName.toLowerCase()===b.toLowerCase()},each:function(a,b,c){var d,e=0,f=a.length,g=r(a);if(c){if(g){for(;f>e;e++)if(d=b.apply(a[e],c),d===!1)break}else for(e in a)if(d=b.apply(a[e],c),d===!1)break}else if(g){for(;f>e;e++)if(d=b.call(a[e],e,a[e]),d===!1)break}else for(e in a)if(d=b.call(a[e],e,a[e]),d===!1)break;return a},trim:function(a){return null==a?"":(a+"").replace(n,"")},makeArray:function(a,b){var c=b||[];return null!=a&&(r(Object(a))?m.merge(c,"string"==typeof a?[a]:a):f.call(c,a)),c},inArray:function(a,b,c){var d;if(b){if(g)return g.call(b,a,c);for(d=b.length,c=c?0>c?Math.max(0,d+c):c:0;d>c;c++)if(c in b&&b[c]===a)return c}return-1},merge:function(a,b){var c=+b.length,d=0,e=a.length;while(c>d)a[e++]=b[d++];if(c!==c)while(void 0!==b[d])a[e++]=b[d++];return a.length=e,a},grep:function(a,b,c){for(var d,e=[],f=0,g=a.length,h=!c;g>f;f++)d=!b(a[f],f),d!==h&&e.push(a[f]);return e},map:function(a,b,c){var d,f=0,g=a.length,h=r(a),i=[];if(h)for(;g>f;f++)d=b(a[f],f,c),null!=d&&i.push(d);else for(f in a)d=b(a[f],f,c),null!=d&&i.push(d);return e.apply([],i)},guid:1,proxy:function(a,b){var c,e,f;return"string"==typeof b&&(f=a[b],b=a,a=f),m.isFunction(a)?(c=d.call(arguments,2),e=function(){return a.apply(b||this,c.concat(d.call(arguments)))},e.guid=a.guid=a.guid||m.guid++,e):void 0},now:function(){return+new Date},support:k}),m.each("Boolean Number String Function Array Date RegExp Object Error".split(" "),function(a,b){h["[object "+b+"]"]=b.toLowerCase()});function r(a){var b=a.length,c=m.type(a);return"function"===c||m.isWindow(a)?!1:1===a.nodeType&&b?!0:"array"===c||0===b||"number"==typeof b&&b>0&&b-1 in a}var s=function(a){var b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t,u="sizzle"+-new Date,v=a.document,w=0,x=0,y=gb(),z=gb(),A=gb(),B=function(a,b){return a===b&&(l=!0),0},C="undefined",D=1<<31,E={}.hasOwnProperty,F=[],G=F.pop,H=F.push,I=F.push,J=F.slice,K=F.indexOf||function(a){for(var b=0,c=this.length;c>b;b++)if(this[b]===a)return b;return-1},L="checked|selected|async|autofocus|autoplay|controls|defer|disabled|hidden|ismap|loop|multiple|open|readonly|required|scoped",M="[\\x20\\t\\r\\n\\f]",N="(?:\\\\.|[\\w-]|[^\\x00-\\xa0])+",O=N.replace("w","w#"),P="\\["+M+"*("+N+")(?:"+M+"*([*^$|!~]?=)"+M+"*(?:'((?:\\\\.|[^\\\\'])*)'|\"((?:\\\\.|[^\\\\\"])*)\"|("+O+"))|)"+M+"*\\]",Q=":("+N+")(?:\\((('((?:\\\\.|[^\\\\'])*)'|\"((?:\\\\.|[^\\\\\"])*)\")|((?:\\\\.|[^\\\\()[\\]]|"+P+")*)|.*)\\)|)",R=new RegExp("^"+M+"+|((?:^|[^\\\\])(?:\\\\.)*)"+M+"+$","g"),S=new RegExp("^"+M+"*,"+M+"*"),T=new RegExp("^"+M+"*([>+~]|"+M+")"+M+"*"),U=new RegExp("="+M+"*([^\\]'\"]*?)"+M+"*\\]","g"),V=new RegExp(Q),W=new RegExp("^"+O+"$"),X={ID:new RegExp("^#("+N+")"),CLASS:new RegExp("^\\.("+N+")"),TAG:new RegExp("^("+N.replace("w","w*")+")"),ATTR:new RegExp("^"+P),PSEUDO:new RegExp("^"+Q),CHILD:new RegExp("^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\("+M+"*(even|odd|(([+-]|)(\\d*)n|)"+M+"*(?:([+-]|)"+M+"*(\\d+)|))"+M+"*\\)|)","i"),bool:new RegExp("^(?:"+L+")$","i"),needsContext:new RegExp("^"+M+"*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\("+M+"*((?:-\\d)?\\d*)"+M+"*\\)|)(?=[^-]|$)","i")},Y=/^(?:input|select|textarea|button)$/i,Z=/^h\d$/i,$=/^[^{]+\{\s*\[native \w/,_=/^(?:#([\w-]+)|(\w+)|\.([\w-]+))$/,ab=/[+~]/,bb=/'|\\/g,cb=new RegExp("\\\\([\\da-f]{1,6}"+M+"?|("+M+")|.)","ig"),db=function(a,b,c){var d="0x"+b-65536;return d!==d||c?b:0>d?String.fromCharCode(d+65536):String.fromCharCode(d>>10|55296,1023&d|56320)};try{I.apply(F=J.call(v.childNodes),v.childNodes),F[v.childNodes.length].nodeType}catch(eb){I={apply:F.length?function(a,b){H.apply(a,J.call(b))}:function(a,b){var c=a.length,d=0;while(a[c++]=b[d++]);a.length=c-1}}}function fb(a,b,d,e){var f,h,j,k,l,o,r,s,w,x;if((b?b.ownerDocument||b:v)!==n&&m(b),b=b||n,d=d||[],!a||"string"!=typeof a)return d;if(1!==(k=b.nodeType)&&9!==k)return[];if(p&&!e){if(f=_.exec(a))if(j=f[1]){if(9===k){if(h=b.getElementById(j),!h||!h.parentNode)return d;if(h.id===j)return d.push(h),d}else if(b.ownerDocument&&(h=b.ownerDocument.getElementById(j))&&t(b,h)&&h.id===j)return d.push(h),d}else{if(f[2])return I.apply(d,b.getElementsByTagName(a)),d;if((j=f[3])&&c.getElementsByClassName&&b.getElementsByClassName)return I.apply(d,b.getElementsByClassName(j)),d}if(c.qsa&&(!q||!q.test(a))){if(s=r=u,w=b,x=9===k&&a,1===k&&"object"!==b.nodeName.toLowerCase()){o=g(a),(r=b.getAttribute("id"))?s=r.replace(bb,"\\$&"):b.setAttribute("id",s),s="[id='"+s+"'] ",l=o.length;while(l--)o[l]=s+qb(o[l]);w=ab.test(a)&&ob(b.parentNode)||b,x=o.join(",")}if(x)try{return I.apply(d,w.querySelectorAll(x)),d}catch(y){}finally{r||b.removeAttribute("id")}}}return i(a.replace(R,"$1"),b,d,e)}function gb(){var a=[];function b(c,e){return a.push(c+" ")>d.cacheLength&&delete b[a.shift()],b[c+" "]=e}return b}function hb(a){return a[u]=!0,a}function ib(a){var b=n.createElement("div");try{return!!a(b)}catch(c){return!1}finally{b.parentNode&&b.parentNode.removeChild(b),b=null}}function jb(a,b){var c=a.split("|"),e=a.length;while(e--)d.attrHandle[c[e]]=b}function kb(a,b){var c=b&&a,d=c&&1===a.nodeType&&1===b.nodeType&&(~b.sourceIndex||D)-(~a.sourceIndex||D);if(d)return d;if(c)while(c=c.nextSibling)if(c===b)return-1;return a?1:-1}function lb(a){return function(b){var c=b.nodeName.toLowerCase();return"input"===c&&b.type===a}}function mb(a){return function(b){var c=b.nodeName.toLowerCase();return("input"===c||"button"===c)&&b.type===a}}function nb(a){return hb(function(b){return b=+b,hb(function(c,d){var e,f=a([],c.length,b),g=f.length;while(g--)c[e=f[g]]&&(c[e]=!(d[e]=c[e]))})})}function ob(a){return a&&typeof a.getElementsByTagName!==C&&a}c=fb.support={},f=fb.isXML=function(a){var b=a&&(a.ownerDocument||a).documentElement;return b?"HTML"!==b.nodeName:!1},m=fb.setDocument=function(a){var b,e=a?a.ownerDocument||a:v,g=e.defaultView;return e!==n&&9===e.nodeType&&e.documentElement?(n=e,o=e.documentElement,p=!f(e),g&&g!==g.top&&(g.addEventListener?g.addEventListener("unload",function(){m()},!1):g.attachEvent&&g.attachEvent("onunload",function(){m()})),c.attributes=ib(function(a){return a.className="i",!a.getAttribute("className")}),c.getElementsByTagName=ib(function(a){return a.appendChild(e.createComment("")),!a.getElementsByTagName("*").length}),c.getElementsByClassName=$.test(e.getElementsByClassName)&&ib(function(a){return a.innerHTML="
    ",a.firstChild.className="i",2===a.getElementsByClassName("i").length}),c.getById=ib(function(a){return o.appendChild(a).id=u,!e.getElementsByName||!e.getElementsByName(u).length}),c.getById?(d.find.ID=function(a,b){if(typeof b.getElementById!==C&&p){var c=b.getElementById(a);return c&&c.parentNode?[c]:[]}},d.filter.ID=function(a){var b=a.replace(cb,db);return function(a){return a.getAttribute("id")===b}}):(delete d.find.ID,d.filter.ID=function(a){var b=a.replace(cb,db);return function(a){var c=typeof a.getAttributeNode!==C&&a.getAttributeNode("id");return c&&c.value===b}}),d.find.TAG=c.getElementsByTagName?function(a,b){return typeof b.getElementsByTagName!==C?b.getElementsByTagName(a):void 0}:function(a,b){var c,d=[],e=0,f=b.getElementsByTagName(a);if("*"===a){while(c=f[e++])1===c.nodeType&&d.push(c);return d}return f},d.find.CLASS=c.getElementsByClassName&&function(a,b){return typeof b.getElementsByClassName!==C&&p?b.getElementsByClassName(a):void 0},r=[],q=[],(c.qsa=$.test(e.querySelectorAll))&&(ib(function(a){a.innerHTML="",a.querySelectorAll("[msallowclip^='']").length&&q.push("[*^$]="+M+"*(?:''|\"\")"),a.querySelectorAll("[selected]").length||q.push("\\["+M+"*(?:value|"+L+")"),a.querySelectorAll(":checked").length||q.push(":checked")}),ib(function(a){var b=e.createElement("input");b.setAttribute("type","hidden"),a.appendChild(b).setAttribute("name","D"),a.querySelectorAll("[name=d]").length&&q.push("name"+M+"*[*^$|!~]?="),a.querySelectorAll(":enabled").length||q.push(":enabled",":disabled"),a.querySelectorAll("*,:x"),q.push(",.*:")})),(c.matchesSelector=$.test(s=o.matches||o.webkitMatchesSelector||o.mozMatchesSelector||o.oMatchesSelector||o.msMatchesSelector))&&ib(function(a){c.disconnectedMatch=s.call(a,"div"),s.call(a,"[s!='']:x"),r.push("!=",Q)}),q=q.length&&new RegExp(q.join("|")),r=r.length&&new RegExp(r.join("|")),b=$.test(o.compareDocumentPosition),t=b||$.test(o.contains)?function(a,b){var c=9===a.nodeType?a.documentElement:a,d=b&&b.parentNode;return a===d||!(!d||1!==d.nodeType||!(c.contains?c.contains(d):a.compareDocumentPosition&&16&a.compareDocumentPosition(d)))}:function(a,b){if(b)while(b=b.parentNode)if(b===a)return!0;return!1},B=b?function(a,b){if(a===b)return l=!0,0;var d=!a.compareDocumentPosition-!b.compareDocumentPosition;return d?d:(d=(a.ownerDocument||a)===(b.ownerDocument||b)?a.compareDocumentPosition(b):1,1&d||!c.sortDetached&&b.compareDocumentPosition(a)===d?a===e||a.ownerDocument===v&&t(v,a)?-1:b===e||b.ownerDocument===v&&t(v,b)?1:k?K.call(k,a)-K.call(k,b):0:4&d?-1:1)}:function(a,b){if(a===b)return l=!0,0;var c,d=0,f=a.parentNode,g=b.parentNode,h=[a],i=[b];if(!f||!g)return a===e?-1:b===e?1:f?-1:g?1:k?K.call(k,a)-K.call(k,b):0;if(f===g)return kb(a,b);c=a;while(c=c.parentNode)h.unshift(c);c=b;while(c=c.parentNode)i.unshift(c);while(h[d]===i[d])d++;return d?kb(h[d],i[d]):h[d]===v?-1:i[d]===v?1:0},e):n},fb.matches=function(a,b){return fb(a,null,null,b)},fb.matchesSelector=function(a,b){if((a.ownerDocument||a)!==n&&m(a),b=b.replace(U,"='$1']"),!(!c.matchesSelector||!p||r&&r.test(b)||q&&q.test(b)))try{var d=s.call(a,b);if(d||c.disconnectedMatch||a.document&&11!==a.document.nodeType)return d}catch(e){}return fb(b,n,null,[a]).length>0},fb.contains=function(a,b){return(a.ownerDocument||a)!==n&&m(a),t(a,b)},fb.attr=function(a,b){(a.ownerDocument||a)!==n&&m(a);var e=d.attrHandle[b.toLowerCase()],f=e&&E.call(d.attrHandle,b.toLowerCase())?e(a,b,!p):void 0;return void 0!==f?f:c.attributes||!p?a.getAttribute(b):(f=a.getAttributeNode(b))&&f.specified?f.value:null},fb.error=function(a){throw new Error("Syntax error, unrecognized expression: "+a)},fb.uniqueSort=function(a){var b,d=[],e=0,f=0;if(l=!c.detectDuplicates,k=!c.sortStable&&a.slice(0),a.sort(B),l){while(b=a[f++])b===a[f]&&(e=d.push(f));while(e--)a.splice(d[e],1)}return k=null,a},e=fb.getText=function(a){var b,c="",d=0,f=a.nodeType;if(f){if(1===f||9===f||11===f){if("string"==typeof a.textContent)return a.textContent;for(a=a.firstChild;a;a=a.nextSibling)c+=e(a)}else if(3===f||4===f)return a.nodeValue}else while(b=a[d++])c+=e(b);return c},d=fb.selectors={cacheLength:50,createPseudo:hb,match:X,attrHandle:{},find:{},relative:{">":{dir:"parentNode",first:!0}," ":{dir:"parentNode"},"+":{dir:"previousSibling",first:!0},"~":{dir:"previousSibling"}},preFilter:{ATTR:function(a){return a[1]=a[1].replace(cb,db),a[3]=(a[3]||a[4]||a[5]||"").replace(cb,db),"~="===a[2]&&(a[3]=" "+a[3]+" "),a.slice(0,4)},CHILD:function(a){return a[1]=a[1].toLowerCase(),"nth"===a[1].slice(0,3)?(a[3]||fb.error(a[0]),a[4]=+(a[4]?a[5]+(a[6]||1):2*("even"===a[3]||"odd"===a[3])),a[5]=+(a[7]+a[8]||"odd"===a[3])):a[3]&&fb.error(a[0]),a},PSEUDO:function(a){var b,c=!a[6]&&a[2];return X.CHILD.test(a[0])?null:(a[3]?a[2]=a[4]||a[5]||"":c&&V.test(c)&&(b=g(c,!0))&&(b=c.indexOf(")",c.length-b)-c.length)&&(a[0]=a[0].slice(0,b),a[2]=c.slice(0,b)),a.slice(0,3))}},filter:{TAG:function(a){var b=a.replace(cb,db).toLowerCase();return"*"===a?function(){return!0}:function(a){return a.nodeName&&a.nodeName.toLowerCase()===b}},CLASS:function(a){var b=y[a+" "];return b||(b=new RegExp("(^|"+M+")"+a+"("+M+"|$)"))&&y(a,function(a){return b.test("string"==typeof a.className&&a.className||typeof a.getAttribute!==C&&a.getAttribute("class")||"")})},ATTR:function(a,b,c){return function(d){var e=fb.attr(d,a);return null==e?"!="===b:b?(e+="","="===b?e===c:"!="===b?e!==c:"^="===b?c&&0===e.indexOf(c):"*="===b?c&&e.indexOf(c)>-1:"$="===b?c&&e.slice(-c.length)===c:"~="===b?(" "+e+" ").indexOf(c)>-1:"|="===b?e===c||e.slice(0,c.length+1)===c+"-":!1):!0}},CHILD:function(a,b,c,d,e){var f="nth"!==a.slice(0,3),g="last"!==a.slice(-4),h="of-type"===b;return 1===d&&0===e?function(a){return!!a.parentNode}:function(b,c,i){var j,k,l,m,n,o,p=f!==g?"nextSibling":"previousSibling",q=b.parentNode,r=h&&b.nodeName.toLowerCase(),s=!i&&!h;if(q){if(f){while(p){l=b;while(l=l[p])if(h?l.nodeName.toLowerCase()===r:1===l.nodeType)return!1;o=p="only"===a&&!o&&"nextSibling"}return!0}if(o=[g?q.firstChild:q.lastChild],g&&s){k=q[u]||(q[u]={}),j=k[a]||[],n=j[0]===w&&j[1],m=j[0]===w&&j[2],l=n&&q.childNodes[n];while(l=++n&&l&&l[p]||(m=n=0)||o.pop())if(1===l.nodeType&&++m&&l===b){k[a]=[w,n,m];break}}else if(s&&(j=(b[u]||(b[u]={}))[a])&&j[0]===w)m=j[1];else while(l=++n&&l&&l[p]||(m=n=0)||o.pop())if((h?l.nodeName.toLowerCase()===r:1===l.nodeType)&&++m&&(s&&((l[u]||(l[u]={}))[a]=[w,m]),l===b))break;return m-=e,m===d||m%d===0&&m/d>=0}}},PSEUDO:function(a,b){var c,e=d.pseudos[a]||d.setFilters[a.toLowerCase()]||fb.error("unsupported pseudo: "+a);return e[u]?e(b):e.length>1?(c=[a,a,"",b],d.setFilters.hasOwnProperty(a.toLowerCase())?hb(function(a,c){var d,f=e(a,b),g=f.length;while(g--)d=K.call(a,f[g]),a[d]=!(c[d]=f[g])}):function(a){return e(a,0,c)}):e}},pseudos:{not:hb(function(a){var b=[],c=[],d=h(a.replace(R,"$1"));return d[u]?hb(function(a,b,c,e){var f,g=d(a,null,e,[]),h=a.length;while(h--)(f=g[h])&&(a[h]=!(b[h]=f))}):function(a,e,f){return b[0]=a,d(b,null,f,c),!c.pop()}}),has:hb(function(a){return function(b){return fb(a,b).length>0}}),contains:hb(function(a){return function(b){return(b.textContent||b.innerText||e(b)).indexOf(a)>-1}}),lang:hb(function(a){return W.test(a||"")||fb.error("unsupported lang: "+a),a=a.replace(cb,db).toLowerCase(),function(b){var c;do if(c=p?b.lang:b.getAttribute("xml:lang")||b.getAttribute("lang"))return c=c.toLowerCase(),c===a||0===c.indexOf(a+"-");while((b=b.parentNode)&&1===b.nodeType);return!1}}),target:function(b){var c=a.location&&a.location.hash;return c&&c.slice(1)===b.id},root:function(a){return a===o},focus:function(a){return a===n.activeElement&&(!n.hasFocus||n.hasFocus())&&!!(a.type||a.href||~a.tabIndex)},enabled:function(a){return a.disabled===!1},disabled:function(a){return a.disabled===!0},checked:function(a){var b=a.nodeName.toLowerCase();return"input"===b&&!!a.checked||"option"===b&&!!a.selected},selected:function(a){return a.parentNode&&a.parentNode.selectedIndex,a.selected===!0},empty:function(a){for(a=a.firstChild;a;a=a.nextSibling)if(a.nodeType<6)return!1;return!0},parent:function(a){return!d.pseudos.empty(a)},header:function(a){return Z.test(a.nodeName)},input:function(a){return Y.test(a.nodeName)},button:function(a){var b=a.nodeName.toLowerCase();return"input"===b&&"button"===a.type||"button"===b},text:function(a){var b;return"input"===a.nodeName.toLowerCase()&&"text"===a.type&&(null==(b=a.getAttribute("type"))||"text"===b.toLowerCase())},first:nb(function(){return[0]}),last:nb(function(a,b){return[b-1]}),eq:nb(function(a,b,c){return[0>c?c+b:c]}),even:nb(function(a,b){for(var c=0;b>c;c+=2)a.push(c);return a}),odd:nb(function(a,b){for(var c=1;b>c;c+=2)a.push(c);return a}),lt:nb(function(a,b,c){for(var d=0>c?c+b:c;--d>=0;)a.push(d);return a}),gt:nb(function(a,b,c){for(var d=0>c?c+b:c;++db;b++)d+=a[b].value;return d}function rb(a,b,c){var d=b.dir,e=c&&"parentNode"===d,f=x++;return b.first?function(b,c,f){while(b=b[d])if(1===b.nodeType||e)return a(b,c,f)}:function(b,c,g){var h,i,j=[w,f];if(g){while(b=b[d])if((1===b.nodeType||e)&&a(b,c,g))return!0}else while(b=b[d])if(1===b.nodeType||e){if(i=b[u]||(b[u]={}),(h=i[d])&&h[0]===w&&h[1]===f)return j[2]=h[2];if(i[d]=j,j[2]=a(b,c,g))return!0}}}function sb(a){return a.length>1?function(b,c,d){var e=a.length;while(e--)if(!a[e](b,c,d))return!1;return!0}:a[0]}function tb(a,b,c){for(var d=0,e=b.length;e>d;d++)fb(a,b[d],c);return c}function ub(a,b,c,d,e){for(var f,g=[],h=0,i=a.length,j=null!=b;i>h;h++)(f=a[h])&&(!c||c(f,d,e))&&(g.push(f),j&&b.push(h));return g}function vb(a,b,c,d,e,f){return d&&!d[u]&&(d=vb(d)),e&&!e[u]&&(e=vb(e,f)),hb(function(f,g,h,i){var j,k,l,m=[],n=[],o=g.length,p=f||tb(b||"*",h.nodeType?[h]:h,[]),q=!a||!f&&b?p:ub(p,m,a,h,i),r=c?e||(f?a:o||d)?[]:g:q;if(c&&c(q,r,h,i),d){j=ub(r,n),d(j,[],h,i),k=j.length;while(k--)(l=j[k])&&(r[n[k]]=!(q[n[k]]=l))}if(f){if(e||a){if(e){j=[],k=r.length;while(k--)(l=r[k])&&j.push(q[k]=l);e(null,r=[],j,i)}k=r.length;while(k--)(l=r[k])&&(j=e?K.call(f,l):m[k])>-1&&(f[j]=!(g[j]=l))}}else r=ub(r===g?r.splice(o,r.length):r),e?e(null,g,r,i):I.apply(g,r)})}function wb(a){for(var b,c,e,f=a.length,g=d.relative[a[0].type],h=g||d.relative[" "],i=g?1:0,k=rb(function(a){return a===b},h,!0),l=rb(function(a){return K.call(b,a)>-1},h,!0),m=[function(a,c,d){return!g&&(d||c!==j)||((b=c).nodeType?k(a,c,d):l(a,c,d))}];f>i;i++)if(c=d.relative[a[i].type])m=[rb(sb(m),c)];else{if(c=d.filter[a[i].type].apply(null,a[i].matches),c[u]){for(e=++i;f>e;e++)if(d.relative[a[e].type])break;return vb(i>1&&sb(m),i>1&&qb(a.slice(0,i-1).concat({value:" "===a[i-2].type?"*":""})).replace(R,"$1"),c,e>i&&wb(a.slice(i,e)),f>e&&wb(a=a.slice(e)),f>e&&qb(a))}m.push(c)}return sb(m)}function xb(a,b){var c=b.length>0,e=a.length>0,f=function(f,g,h,i,k){var l,m,o,p=0,q="0",r=f&&[],s=[],t=j,u=f||e&&d.find.TAG("*",k),v=w+=null==t?1:Math.random()||.1,x=u.length;for(k&&(j=g!==n&&g);q!==x&&null!=(l=u[q]);q++){if(e&&l){m=0;while(o=a[m++])if(o(l,g,h)){i.push(l);break}k&&(w=v)}c&&((l=!o&&l)&&p--,f&&r.push(l))}if(p+=q,c&&q!==p){m=0;while(o=b[m++])o(r,s,g,h);if(f){if(p>0)while(q--)r[q]||s[q]||(s[q]=G.call(i));s=ub(s)}I.apply(i,s),k&&!f&&s.length>0&&p+b.length>1&&fb.uniqueSort(i)}return k&&(w=v,j=t),r};return c?hb(f):f}return h=fb.compile=function(a,b){var c,d=[],e=[],f=A[a+" "];if(!f){b||(b=g(a)),c=b.length;while(c--)f=wb(b[c]),f[u]?d.push(f):e.push(f);f=A(a,xb(e,d)),f.selector=a}return f},i=fb.select=function(a,b,e,f){var i,j,k,l,m,n="function"==typeof a&&a,o=!f&&g(a=n.selector||a);if(e=e||[],1===o.length){if(j=o[0]=o[0].slice(0),j.length>2&&"ID"===(k=j[0]).type&&c.getById&&9===b.nodeType&&p&&d.relative[j[1].type]){if(b=(d.find.ID(k.matches[0].replace(cb,db),b)||[])[0],!b)return e;n&&(b=b.parentNode),a=a.slice(j.shift().value.length)}i=X.needsContext.test(a)?0:j.length;while(i--){if(k=j[i],d.relative[l=k.type])break;if((m=d.find[l])&&(f=m(k.matches[0].replace(cb,db),ab.test(j[0].type)&&ob(b.parentNode)||b))){if(j.splice(i,1),a=f.length&&qb(j),!a)return I.apply(e,f),e;break}}}return(n||h(a,o))(f,b,!p,e,ab.test(a)&&ob(b.parentNode)||b),e},c.sortStable=u.split("").sort(B).join("")===u,c.detectDuplicates=!!l,m(),c.sortDetached=ib(function(a){return 1&a.compareDocumentPosition(n.createElement("div"))}),ib(function(a){return a.innerHTML="","#"===a.firstChild.getAttribute("href")})||jb("type|href|height|width",function(a,b,c){return c?void 0:a.getAttribute(b,"type"===b.toLowerCase()?1:2)}),c.attributes&&ib(function(a){return a.innerHTML="",a.firstChild.setAttribute("value",""),""===a.firstChild.getAttribute("value")})||jb("value",function(a,b,c){return c||"input"!==a.nodeName.toLowerCase()?void 0:a.defaultValue}),ib(function(a){return null==a.getAttribute("disabled")})||jb(L,function(a,b,c){var d;return c?void 0:a[b]===!0?b.toLowerCase():(d=a.getAttributeNode(b))&&d.specified?d.value:null}),fb}(a);m.find=s,m.expr=s.selectors,m.expr[":"]=m.expr.pseudos,m.unique=s.uniqueSort,m.text=s.getText,m.isXMLDoc=s.isXML,m.contains=s.contains;var t=m.expr.match.needsContext,u=/^<(\w+)\s*\/?>(?:<\/\1>|)$/,v=/^.[^:#\[\.,]*$/;function w(a,b,c){if(m.isFunction(b))return m.grep(a,function(a,d){return!!b.call(a,d,a)!==c});if(b.nodeType)return m.grep(a,function(a){return a===b!==c});if("string"==typeof b){if(v.test(b))return m.filter(b,a,c);b=m.filter(b,a)}return m.grep(a,function(a){return m.inArray(a,b)>=0!==c})}m.filter=function(a,b,c){var d=b[0];return c&&(a=":not("+a+")"),1===b.length&&1===d.nodeType?m.find.matchesSelector(d,a)?[d]:[]:m.find.matches(a,m.grep(b,function(a){return 1===a.nodeType}))},m.fn.extend({find:function(a){var b,c=[],d=this,e=d.length;if("string"!=typeof a)return this.pushStack(m(a).filter(function(){for(b=0;e>b;b++)if(m.contains(d[b],this))return!0}));for(b=0;e>b;b++)m.find(a,d[b],c);return c=this.pushStack(e>1?m.unique(c):c),c.selector=this.selector?this.selector+" "+a:a,c},filter:function(a){return this.pushStack(w(this,a||[],!1))},not:function(a){return this.pushStack(w(this,a||[],!0))},is:function(a){return!!w(this,"string"==typeof a&&t.test(a)?m(a):a||[],!1).length}});var x,y=a.document,z=/^(?:\s*(<[\w\W]+>)[^>]*|#([\w-]*))$/,A=m.fn.init=function(a,b){var c,d;if(!a)return this;if("string"==typeof a){if(c="<"===a.charAt(0)&&">"===a.charAt(a.length-1)&&a.length>=3?[null,a,null]:z.exec(a),!c||!c[1]&&b)return!b||b.jquery?(b||x).find(a):this.constructor(b).find(a);if(c[1]){if(b=b instanceof m?b[0]:b,m.merge(this,m.parseHTML(c[1],b&&b.nodeType?b.ownerDocument||b:y,!0)),u.test(c[1])&&m.isPlainObject(b))for(c in b)m.isFunction(this[c])?this[c](b[c]):this.attr(c,b[c]);return this}if(d=y.getElementById(c[2]),d&&d.parentNode){if(d.id!==c[2])return x.find(a);this.length=1,this[0]=d}return this.context=y,this.selector=a,this}return a.nodeType?(this.context=this[0]=a,this.length=1,this):m.isFunction(a)?"undefined"!=typeof x.ready?x.ready(a):a(m):(void 0!==a.selector&&(this.selector=a.selector,this.context=a.context),m.makeArray(a,this))};A.prototype=m.fn,x=m(y);var B=/^(?:parents|prev(?:Until|All))/,C={children:!0,contents:!0,next:!0,prev:!0};m.extend({dir:function(a,b,c){var d=[],e=a[b];while(e&&9!==e.nodeType&&(void 0===c||1!==e.nodeType||!m(e).is(c)))1===e.nodeType&&d.push(e),e=e[b];return d},sibling:function(a,b){for(var c=[];a;a=a.nextSibling)1===a.nodeType&&a!==b&&c.push(a);return c}}),m.fn.extend({has:function(a){var b,c=m(a,this),d=c.length;return this.filter(function(){for(b=0;d>b;b++)if(m.contains(this,c[b]))return!0})},closest:function(a,b){for(var c,d=0,e=this.length,f=[],g=t.test(a)||"string"!=typeof a?m(a,b||this.context):0;e>d;d++)for(c=this[d];c&&c!==b;c=c.parentNode)if(c.nodeType<11&&(g?g.index(c)>-1:1===c.nodeType&&m.find.matchesSelector(c,a))){f.push(c);break}return this.pushStack(f.length>1?m.unique(f):f)},index:function(a){return a?"string"==typeof a?m.inArray(this[0],m(a)):m.inArray(a.jquery?a[0]:a,this):this[0]&&this[0].parentNode?this.first().prevAll().length:-1},add:function(a,b){return this.pushStack(m.unique(m.merge(this.get(),m(a,b))))},addBack:function(a){return this.add(null==a?this.prevObject:this.prevObject.filter(a))}});function D(a,b){do a=a[b];while(a&&1!==a.nodeType);return a}m.each({parent:function(a){var b=a.parentNode;return b&&11!==b.nodeType?b:null},parents:function(a){return m.dir(a,"parentNode")},parentsUntil:function(a,b,c){return m.dir(a,"parentNode",c)},next:function(a){return D(a,"nextSibling")},prev:function(a){return D(a,"previousSibling")},nextAll:function(a){return m.dir(a,"nextSibling")},prevAll:function(a){return m.dir(a,"previousSibling")},nextUntil:function(a,b,c){return m.dir(a,"nextSibling",c)},prevUntil:function(a,b,c){return m.dir(a,"previousSibling",c)},siblings:function(a){return m.sibling((a.parentNode||{}).firstChild,a)},children:function(a){return m.sibling(a.firstChild)},contents:function(a){return m.nodeName(a,"iframe")?a.contentDocument||a.contentWindow.document:m.merge([],a.childNodes)}},function(a,b){m.fn[a]=function(c,d){var e=m.map(this,b,c);return"Until"!==a.slice(-5)&&(d=c),d&&"string"==typeof d&&(e=m.filter(d,e)),this.length>1&&(C[a]||(e=m.unique(e)),B.test(a)&&(e=e.reverse())),this.pushStack(e)}});var E=/\S+/g,F={};function G(a){var b=F[a]={};return m.each(a.match(E)||[],function(a,c){b[c]=!0}),b}m.Callbacks=function(a){a="string"==typeof a?F[a]||G(a):m.extend({},a);var b,c,d,e,f,g,h=[],i=!a.once&&[],j=function(l){for(c=a.memory&&l,d=!0,f=g||0,g=0,e=h.length,b=!0;h&&e>f;f++)if(h[f].apply(l[0],l[1])===!1&&a.stopOnFalse){c=!1;break}b=!1,h&&(i?i.length&&j(i.shift()):c?h=[]:k.disable())},k={add:function(){if(h){var d=h.length;!function f(b){m.each(b,function(b,c){var d=m.type(c);"function"===d?a.unique&&k.has(c)||h.push(c):c&&c.length&&"string"!==d&&f(c)})}(arguments),b?e=h.length:c&&(g=d,j(c))}return this},remove:function(){return h&&m.each(arguments,function(a,c){var d;while((d=m.inArray(c,h,d))>-1)h.splice(d,1),b&&(e>=d&&e--,f>=d&&f--)}),this},has:function(a){return a?m.inArray(a,h)>-1:!(!h||!h.length)},empty:function(){return h=[],e=0,this},disable:function(){return h=i=c=void 0,this},disabled:function(){return!h},lock:function(){return i=void 0,c||k.disable(),this},locked:function(){return!i},fireWith:function(a,c){return!h||d&&!i||(c=c||[],c=[a,c.slice?c.slice():c],b?i.push(c):j(c)),this},fire:function(){return k.fireWith(this,arguments),this},fired:function(){return!!d}};return k},m.extend({Deferred:function(a){var b=[["resolve","done",m.Callbacks("once memory"),"resolved"],["reject","fail",m.Callbacks("once memory"),"rejected"],["notify","progress",m.Callbacks("memory")]],c="pending",d={state:function(){return c},always:function(){return e.done(arguments).fail(arguments),this},then:function(){var a=arguments;return m.Deferred(function(c){m.each(b,function(b,f){var g=m.isFunction(a[b])&&a[b];e[f[1]](function(){var a=g&&g.apply(this,arguments);a&&m.isFunction(a.promise)?a.promise().done(c.resolve).fail(c.reject).progress(c.notify):c[f[0]+"With"](this===d?c.promise():this,g?[a]:arguments)})}),a=null}).promise()},promise:function(a){return null!=a?m.extend(a,d):d}},e={};return d.pipe=d.then,m.each(b,function(a,f){var g=f[2],h=f[3];d[f[1]]=g.add,h&&g.add(function(){c=h},b[1^a][2].disable,b[2][2].lock),e[f[0]]=function(){return e[f[0]+"With"](this===e?d:this,arguments),this},e[f[0]+"With"]=g.fireWith}),d.promise(e),a&&a.call(e,e),e},when:function(a){var b=0,c=d.call(arguments),e=c.length,f=1!==e||a&&m.isFunction(a.promise)?e:0,g=1===f?a:m.Deferred(),h=function(a,b,c){return function(e){b[a]=this,c[a]=arguments.length>1?d.call(arguments):e,c===i?g.notifyWith(b,c):--f||g.resolveWith(b,c)}},i,j,k;if(e>1)for(i=new Array(e),j=new Array(e),k=new Array(e);e>b;b++)c[b]&&m.isFunction(c[b].promise)?c[b].promise().done(h(b,k,c)).fail(g.reject).progress(h(b,j,i)):--f;return f||g.resolveWith(k,c),g.promise()}});var H;m.fn.ready=function(a){return m.ready.promise().done(a),this},m.extend({isReady:!1,readyWait:1,holdReady:function(a){a?m.readyWait++:m.ready(!0)},ready:function(a){if(a===!0?!--m.readyWait:!m.isReady){if(!y.body)return setTimeout(m.ready);m.isReady=!0,a!==!0&&--m.readyWait>0||(H.resolveWith(y,[m]),m.fn.triggerHandler&&(m(y).triggerHandler("ready"),m(y).off("ready")))}}});function I(){y.addEventListener?(y.removeEventListener("DOMContentLoaded",J,!1),a.removeEventListener("load",J,!1)):(y.detachEvent("onreadystatechange",J),a.detachEvent("onload",J))}function J(){(y.addEventListener||"load"===event.type||"complete"===y.readyState)&&(I(),m.ready())}m.ready.promise=function(b){if(!H)if(H=m.Deferred(),"complete"===y.readyState)setTimeout(m.ready);else if(y.addEventListener)y.addEventListener("DOMContentLoaded",J,!1),a.addEventListener("load",J,!1);else{y.attachEvent("onreadystatechange",J),a.attachEvent("onload",J);var c=!1;try{c=null==a.frameElement&&y.documentElement}catch(d){}c&&c.doScroll&&!function e(){if(!m.isReady){try{c.doScroll("left")}catch(a){return setTimeout(e,50)}I(),m.ready()}}()}return H.promise(b)};var K="undefined",L;for(L in m(k))break;k.ownLast="0"!==L,k.inlineBlockNeedsLayout=!1,m(function(){var a,b,c,d;c=y.getElementsByTagName("body")[0],c&&c.style&&(b=y.createElement("div"),d=y.createElement("div"),d.style.cssText="position:absolute;border:0;width:0;height:0;top:0;left:-9999px",c.appendChild(d).appendChild(b),typeof b.style.zoom!==K&&(b.style.cssText="display:inline;margin:0;border:0;padding:1px;width:1px;zoom:1",k.inlineBlockNeedsLayout=a=3===b.offsetWidth,a&&(c.style.zoom=1)),c.removeChild(d))}),function(){var a=y.createElement("div");if(null==k.deleteExpando){k.deleteExpando=!0;try{delete a.test}catch(b){k.deleteExpando=!1}}a=null}(),m.acceptData=function(a){var b=m.noData[(a.nodeName+" ").toLowerCase()],c=+a.nodeType||1;return 1!==c&&9!==c?!1:!b||b!==!0&&a.getAttribute("classid")===b};var M=/^(?:\{[\w\W]*\}|\[[\w\W]*\])$/,N=/([A-Z])/g;function O(a,b,c){if(void 0===c&&1===a.nodeType){var d="data-"+b.replace(N,"-$1").toLowerCase();if(c=a.getAttribute(d),"string"==typeof c){try{c="true"===c?!0:"false"===c?!1:"null"===c?null:+c+""===c?+c:M.test(c)?m.parseJSON(c):c}catch(e){}m.data(a,b,c)}else c=void 0}return c}function P(a){var b;for(b in a)if(("data"!==b||!m.isEmptyObject(a[b]))&&"toJSON"!==b)return!1;return!0}function Q(a,b,d,e){if(m.acceptData(a)){var f,g,h=m.expando,i=a.nodeType,j=i?m.cache:a,k=i?a[h]:a[h]&&h; +if(k&&j[k]&&(e||j[k].data)||void 0!==d||"string"!=typeof b)return k||(k=i?a[h]=c.pop()||m.guid++:h),j[k]||(j[k]=i?{}:{toJSON:m.noop}),("object"==typeof b||"function"==typeof b)&&(e?j[k]=m.extend(j[k],b):j[k].data=m.extend(j[k].data,b)),g=j[k],e||(g.data||(g.data={}),g=g.data),void 0!==d&&(g[m.camelCase(b)]=d),"string"==typeof b?(f=g[b],null==f&&(f=g[m.camelCase(b)])):f=g,f}}function R(a,b,c){if(m.acceptData(a)){var d,e,f=a.nodeType,g=f?m.cache:a,h=f?a[m.expando]:m.expando;if(g[h]){if(b&&(d=c?g[h]:g[h].data)){m.isArray(b)?b=b.concat(m.map(b,m.camelCase)):b in d?b=[b]:(b=m.camelCase(b),b=b in d?[b]:b.split(" ")),e=b.length;while(e--)delete d[b[e]];if(c?!P(d):!m.isEmptyObject(d))return}(c||(delete g[h].data,P(g[h])))&&(f?m.cleanData([a],!0):k.deleteExpando||g!=g.window?delete g[h]:g[h]=null)}}}m.extend({cache:{},noData:{"applet ":!0,"embed ":!0,"object ":"clsid:D27CDB6E-AE6D-11cf-96B8-444553540000"},hasData:function(a){return a=a.nodeType?m.cache[a[m.expando]]:a[m.expando],!!a&&!P(a)},data:function(a,b,c){return Q(a,b,c)},removeData:function(a,b){return R(a,b)},_data:function(a,b,c){return Q(a,b,c,!0)},_removeData:function(a,b){return R(a,b,!0)}}),m.fn.extend({data:function(a,b){var c,d,e,f=this[0],g=f&&f.attributes;if(void 0===a){if(this.length&&(e=m.data(f),1===f.nodeType&&!m._data(f,"parsedAttrs"))){c=g.length;while(c--)g[c]&&(d=g[c].name,0===d.indexOf("data-")&&(d=m.camelCase(d.slice(5)),O(f,d,e[d])));m._data(f,"parsedAttrs",!0)}return e}return"object"==typeof a?this.each(function(){m.data(this,a)}):arguments.length>1?this.each(function(){m.data(this,a,b)}):f?O(f,a,m.data(f,a)):void 0},removeData:function(a){return this.each(function(){m.removeData(this,a)})}}),m.extend({queue:function(a,b,c){var d;return a?(b=(b||"fx")+"queue",d=m._data(a,b),c&&(!d||m.isArray(c)?d=m._data(a,b,m.makeArray(c)):d.push(c)),d||[]):void 0},dequeue:function(a,b){b=b||"fx";var c=m.queue(a,b),d=c.length,e=c.shift(),f=m._queueHooks(a,b),g=function(){m.dequeue(a,b)};"inprogress"===e&&(e=c.shift(),d--),e&&("fx"===b&&c.unshift("inprogress"),delete f.stop,e.call(a,g,f)),!d&&f&&f.empty.fire()},_queueHooks:function(a,b){var c=b+"queueHooks";return m._data(a,c)||m._data(a,c,{empty:m.Callbacks("once memory").add(function(){m._removeData(a,b+"queue"),m._removeData(a,c)})})}}),m.fn.extend({queue:function(a,b){var c=2;return"string"!=typeof a&&(b=a,a="fx",c--),arguments.lengthh;h++)b(a[h],c,g?d:d.call(a[h],h,b(a[h],c)));return e?a:j?b.call(a):i?b(a[0],c):f},W=/^(?:checkbox|radio)$/i;!function(){var a=y.createElement("input"),b=y.createElement("div"),c=y.createDocumentFragment();if(b.innerHTML="
    a",k.leadingWhitespace=3===b.firstChild.nodeType,k.tbody=!b.getElementsByTagName("tbody").length,k.htmlSerialize=!!b.getElementsByTagName("link").length,k.html5Clone="<:nav>"!==y.createElement("nav").cloneNode(!0).outerHTML,a.type="checkbox",a.checked=!0,c.appendChild(a),k.appendChecked=a.checked,b.innerHTML="",k.noCloneChecked=!!b.cloneNode(!0).lastChild.defaultValue,c.appendChild(b),b.innerHTML="",k.checkClone=b.cloneNode(!0).cloneNode(!0).lastChild.checked,k.noCloneEvent=!0,b.attachEvent&&(b.attachEvent("onclick",function(){k.noCloneEvent=!1}),b.cloneNode(!0).click()),null==k.deleteExpando){k.deleteExpando=!0;try{delete b.test}catch(d){k.deleteExpando=!1}}}(),function(){var b,c,d=y.createElement("div");for(b in{submit:!0,change:!0,focusin:!0})c="on"+b,(k[b+"Bubbles"]=c in a)||(d.setAttribute(c,"t"),k[b+"Bubbles"]=d.attributes[c].expando===!1);d=null}();var X=/^(?:input|select|textarea)$/i,Y=/^key/,Z=/^(?:mouse|pointer|contextmenu)|click/,$=/^(?:focusinfocus|focusoutblur)$/,_=/^([^.]*)(?:\.(.+)|)$/;function ab(){return!0}function bb(){return!1}function cb(){try{return y.activeElement}catch(a){}}m.event={global:{},add:function(a,b,c,d,e){var f,g,h,i,j,k,l,n,o,p,q,r=m._data(a);if(r){c.handler&&(i=c,c=i.handler,e=i.selector),c.guid||(c.guid=m.guid++),(g=r.events)||(g=r.events={}),(k=r.handle)||(k=r.handle=function(a){return typeof m===K||a&&m.event.triggered===a.type?void 0:m.event.dispatch.apply(k.elem,arguments)},k.elem=a),b=(b||"").match(E)||[""],h=b.length;while(h--)f=_.exec(b[h])||[],o=q=f[1],p=(f[2]||"").split(".").sort(),o&&(j=m.event.special[o]||{},o=(e?j.delegateType:j.bindType)||o,j=m.event.special[o]||{},l=m.extend({type:o,origType:q,data:d,handler:c,guid:c.guid,selector:e,needsContext:e&&m.expr.match.needsContext.test(e),namespace:p.join(".")},i),(n=g[o])||(n=g[o]=[],n.delegateCount=0,j.setup&&j.setup.call(a,d,p,k)!==!1||(a.addEventListener?a.addEventListener(o,k,!1):a.attachEvent&&a.attachEvent("on"+o,k))),j.add&&(j.add.call(a,l),l.handler.guid||(l.handler.guid=c.guid)),e?n.splice(n.delegateCount++,0,l):n.push(l),m.event.global[o]=!0);a=null}},remove:function(a,b,c,d,e){var f,g,h,i,j,k,l,n,o,p,q,r=m.hasData(a)&&m._data(a);if(r&&(k=r.events)){b=(b||"").match(E)||[""],j=b.length;while(j--)if(h=_.exec(b[j])||[],o=q=h[1],p=(h[2]||"").split(".").sort(),o){l=m.event.special[o]||{},o=(d?l.delegateType:l.bindType)||o,n=k[o]||[],h=h[2]&&new RegExp("(^|\\.)"+p.join("\\.(?:.*\\.|)")+"(\\.|$)"),i=f=n.length;while(f--)g=n[f],!e&&q!==g.origType||c&&c.guid!==g.guid||h&&!h.test(g.namespace)||d&&d!==g.selector&&("**"!==d||!g.selector)||(n.splice(f,1),g.selector&&n.delegateCount--,l.remove&&l.remove.call(a,g));i&&!n.length&&(l.teardown&&l.teardown.call(a,p,r.handle)!==!1||m.removeEvent(a,o,r.handle),delete k[o])}else for(o in k)m.event.remove(a,o+b[j],c,d,!0);m.isEmptyObject(k)&&(delete r.handle,m._removeData(a,"events"))}},trigger:function(b,c,d,e){var f,g,h,i,k,l,n,o=[d||y],p=j.call(b,"type")?b.type:b,q=j.call(b,"namespace")?b.namespace.split("."):[];if(h=l=d=d||y,3!==d.nodeType&&8!==d.nodeType&&!$.test(p+m.event.triggered)&&(p.indexOf(".")>=0&&(q=p.split("."),p=q.shift(),q.sort()),g=p.indexOf(":")<0&&"on"+p,b=b[m.expando]?b:new m.Event(p,"object"==typeof b&&b),b.isTrigger=e?2:3,b.namespace=q.join("."),b.namespace_re=b.namespace?new RegExp("(^|\\.)"+q.join("\\.(?:.*\\.|)")+"(\\.|$)"):null,b.result=void 0,b.target||(b.target=d),c=null==c?[b]:m.makeArray(c,[b]),k=m.event.special[p]||{},e||!k.trigger||k.trigger.apply(d,c)!==!1)){if(!e&&!k.noBubble&&!m.isWindow(d)){for(i=k.delegateType||p,$.test(i+p)||(h=h.parentNode);h;h=h.parentNode)o.push(h),l=h;l===(d.ownerDocument||y)&&o.push(l.defaultView||l.parentWindow||a)}n=0;while((h=o[n++])&&!b.isPropagationStopped())b.type=n>1?i:k.bindType||p,f=(m._data(h,"events")||{})[b.type]&&m._data(h,"handle"),f&&f.apply(h,c),f=g&&h[g],f&&f.apply&&m.acceptData(h)&&(b.result=f.apply(h,c),b.result===!1&&b.preventDefault());if(b.type=p,!e&&!b.isDefaultPrevented()&&(!k._default||k._default.apply(o.pop(),c)===!1)&&m.acceptData(d)&&g&&d[p]&&!m.isWindow(d)){l=d[g],l&&(d[g]=null),m.event.triggered=p;try{d[p]()}catch(r){}m.event.triggered=void 0,l&&(d[g]=l)}return b.result}},dispatch:function(a){a=m.event.fix(a);var b,c,e,f,g,h=[],i=d.call(arguments),j=(m._data(this,"events")||{})[a.type]||[],k=m.event.special[a.type]||{};if(i[0]=a,a.delegateTarget=this,!k.preDispatch||k.preDispatch.call(this,a)!==!1){h=m.event.handlers.call(this,a,j),b=0;while((f=h[b++])&&!a.isPropagationStopped()){a.currentTarget=f.elem,g=0;while((e=f.handlers[g++])&&!a.isImmediatePropagationStopped())(!a.namespace_re||a.namespace_re.test(e.namespace))&&(a.handleObj=e,a.data=e.data,c=((m.event.special[e.origType]||{}).handle||e.handler).apply(f.elem,i),void 0!==c&&(a.result=c)===!1&&(a.preventDefault(),a.stopPropagation()))}return k.postDispatch&&k.postDispatch.call(this,a),a.result}},handlers:function(a,b){var c,d,e,f,g=[],h=b.delegateCount,i=a.target;if(h&&i.nodeType&&(!a.button||"click"!==a.type))for(;i!=this;i=i.parentNode||this)if(1===i.nodeType&&(i.disabled!==!0||"click"!==a.type)){for(e=[],f=0;h>f;f++)d=b[f],c=d.selector+" ",void 0===e[c]&&(e[c]=d.needsContext?m(c,this).index(i)>=0:m.find(c,this,null,[i]).length),e[c]&&e.push(d);e.length&&g.push({elem:i,handlers:e})}return h]","i"),hb=/^\s+/,ib=/<(?!area|br|col|embed|hr|img|input|link|meta|param)(([\w:]+)[^>]*)\/>/gi,jb=/<([\w:]+)/,kb=/\s*$/g,rb={option:[1,""],legend:[1,"
    ","
    "],area:[1,"",""],param:[1,"",""],thead:[1,"","
    "],tr:[2,"","
    "],col:[2,"","
    "],td:[3,"","
    "],_default:k.htmlSerialize?[0,"",""]:[1,"X
    ","
    "]},sb=db(y),tb=sb.appendChild(y.createElement("div"));rb.optgroup=rb.option,rb.tbody=rb.tfoot=rb.colgroup=rb.caption=rb.thead,rb.th=rb.td;function ub(a,b){var c,d,e=0,f=typeof a.getElementsByTagName!==K?a.getElementsByTagName(b||"*"):typeof a.querySelectorAll!==K?a.querySelectorAll(b||"*"):void 0;if(!f)for(f=[],c=a.childNodes||a;null!=(d=c[e]);e++)!b||m.nodeName(d,b)?f.push(d):m.merge(f,ub(d,b));return void 0===b||b&&m.nodeName(a,b)?m.merge([a],f):f}function vb(a){W.test(a.type)&&(a.defaultChecked=a.checked)}function wb(a,b){return m.nodeName(a,"table")&&m.nodeName(11!==b.nodeType?b:b.firstChild,"tr")?a.getElementsByTagName("tbody")[0]||a.appendChild(a.ownerDocument.createElement("tbody")):a}function xb(a){return a.type=(null!==m.find.attr(a,"type"))+"/"+a.type,a}function yb(a){var b=pb.exec(a.type);return b?a.type=b[1]:a.removeAttribute("type"),a}function zb(a,b){for(var c,d=0;null!=(c=a[d]);d++)m._data(c,"globalEval",!b||m._data(b[d],"globalEval"))}function Ab(a,b){if(1===b.nodeType&&m.hasData(a)){var c,d,e,f=m._data(a),g=m._data(b,f),h=f.events;if(h){delete g.handle,g.events={};for(c in h)for(d=0,e=h[c].length;e>d;d++)m.event.add(b,c,h[c][d])}g.data&&(g.data=m.extend({},g.data))}}function Bb(a,b){var c,d,e;if(1===b.nodeType){if(c=b.nodeName.toLowerCase(),!k.noCloneEvent&&b[m.expando]){e=m._data(b);for(d in e.events)m.removeEvent(b,d,e.handle);b.removeAttribute(m.expando)}"script"===c&&b.text!==a.text?(xb(b).text=a.text,yb(b)):"object"===c?(b.parentNode&&(b.outerHTML=a.outerHTML),k.html5Clone&&a.innerHTML&&!m.trim(b.innerHTML)&&(b.innerHTML=a.innerHTML)):"input"===c&&W.test(a.type)?(b.defaultChecked=b.checked=a.checked,b.value!==a.value&&(b.value=a.value)):"option"===c?b.defaultSelected=b.selected=a.defaultSelected:("input"===c||"textarea"===c)&&(b.defaultValue=a.defaultValue)}}m.extend({clone:function(a,b,c){var d,e,f,g,h,i=m.contains(a.ownerDocument,a);if(k.html5Clone||m.isXMLDoc(a)||!gb.test("<"+a.nodeName+">")?f=a.cloneNode(!0):(tb.innerHTML=a.outerHTML,tb.removeChild(f=tb.firstChild)),!(k.noCloneEvent&&k.noCloneChecked||1!==a.nodeType&&11!==a.nodeType||m.isXMLDoc(a)))for(d=ub(f),h=ub(a),g=0;null!=(e=h[g]);++g)d[g]&&Bb(e,d[g]);if(b)if(c)for(h=h||ub(a),d=d||ub(f),g=0;null!=(e=h[g]);g++)Ab(e,d[g]);else Ab(a,f);return d=ub(f,"script"),d.length>0&&zb(d,!i&&ub(a,"script")),d=h=e=null,f},buildFragment:function(a,b,c,d){for(var e,f,g,h,i,j,l,n=a.length,o=db(b),p=[],q=0;n>q;q++)if(f=a[q],f||0===f)if("object"===m.type(f))m.merge(p,f.nodeType?[f]:f);else if(lb.test(f)){h=h||o.appendChild(b.createElement("div")),i=(jb.exec(f)||["",""])[1].toLowerCase(),l=rb[i]||rb._default,h.innerHTML=l[1]+f.replace(ib,"<$1>")+l[2],e=l[0];while(e--)h=h.lastChild;if(!k.leadingWhitespace&&hb.test(f)&&p.push(b.createTextNode(hb.exec(f)[0])),!k.tbody){f="table"!==i||kb.test(f)?""!==l[1]||kb.test(f)?0:h:h.firstChild,e=f&&f.childNodes.length;while(e--)m.nodeName(j=f.childNodes[e],"tbody")&&!j.childNodes.length&&f.removeChild(j)}m.merge(p,h.childNodes),h.textContent="";while(h.firstChild)h.removeChild(h.firstChild);h=o.lastChild}else p.push(b.createTextNode(f));h&&o.removeChild(h),k.appendChecked||m.grep(ub(p,"input"),vb),q=0;while(f=p[q++])if((!d||-1===m.inArray(f,d))&&(g=m.contains(f.ownerDocument,f),h=ub(o.appendChild(f),"script"),g&&zb(h),c)){e=0;while(f=h[e++])ob.test(f.type||"")&&c.push(f)}return h=null,o},cleanData:function(a,b){for(var d,e,f,g,h=0,i=m.expando,j=m.cache,l=k.deleteExpando,n=m.event.special;null!=(d=a[h]);h++)if((b||m.acceptData(d))&&(f=d[i],g=f&&j[f])){if(g.events)for(e in g.events)n[e]?m.event.remove(d,e):m.removeEvent(d,e,g.handle);j[f]&&(delete j[f],l?delete d[i]:typeof d.removeAttribute!==K?d.removeAttribute(i):d[i]=null,c.push(f))}}}),m.fn.extend({text:function(a){return V(this,function(a){return void 0===a?m.text(this):this.empty().append((this[0]&&this[0].ownerDocument||y).createTextNode(a))},null,a,arguments.length)},append:function(){return this.domManip(arguments,function(a){if(1===this.nodeType||11===this.nodeType||9===this.nodeType){var b=wb(this,a);b.appendChild(a)}})},prepend:function(){return this.domManip(arguments,function(a){if(1===this.nodeType||11===this.nodeType||9===this.nodeType){var b=wb(this,a);b.insertBefore(a,b.firstChild)}})},before:function(){return this.domManip(arguments,function(a){this.parentNode&&this.parentNode.insertBefore(a,this)})},after:function(){return this.domManip(arguments,function(a){this.parentNode&&this.parentNode.insertBefore(a,this.nextSibling)})},remove:function(a,b){for(var c,d=a?m.filter(a,this):this,e=0;null!=(c=d[e]);e++)b||1!==c.nodeType||m.cleanData(ub(c)),c.parentNode&&(b&&m.contains(c.ownerDocument,c)&&zb(ub(c,"script")),c.parentNode.removeChild(c));return this},empty:function(){for(var a,b=0;null!=(a=this[b]);b++){1===a.nodeType&&m.cleanData(ub(a,!1));while(a.firstChild)a.removeChild(a.firstChild);a.options&&m.nodeName(a,"select")&&(a.options.length=0)}return this},clone:function(a,b){return a=null==a?!1:a,b=null==b?a:b,this.map(function(){return m.clone(this,a,b)})},html:function(a){return V(this,function(a){var b=this[0]||{},c=0,d=this.length;if(void 0===a)return 1===b.nodeType?b.innerHTML.replace(fb,""):void 0;if(!("string"!=typeof a||mb.test(a)||!k.htmlSerialize&&gb.test(a)||!k.leadingWhitespace&&hb.test(a)||rb[(jb.exec(a)||["",""])[1].toLowerCase()])){a=a.replace(ib,"<$1>");try{for(;d>c;c++)b=this[c]||{},1===b.nodeType&&(m.cleanData(ub(b,!1)),b.innerHTML=a);b=0}catch(e){}}b&&this.empty().append(a)},null,a,arguments.length)},replaceWith:function(){var a=arguments[0];return this.domManip(arguments,function(b){a=this.parentNode,m.cleanData(ub(this)),a&&a.replaceChild(b,this)}),a&&(a.length||a.nodeType)?this:this.remove()},detach:function(a){return this.remove(a,!0)},domManip:function(a,b){a=e.apply([],a);var c,d,f,g,h,i,j=0,l=this.length,n=this,o=l-1,p=a[0],q=m.isFunction(p);if(q||l>1&&"string"==typeof p&&!k.checkClone&&nb.test(p))return this.each(function(c){var d=n.eq(c);q&&(a[0]=p.call(this,c,d.html())),d.domManip(a,b)});if(l&&(i=m.buildFragment(a,this[0].ownerDocument,!1,this),c=i.firstChild,1===i.childNodes.length&&(i=c),c)){for(g=m.map(ub(i,"script"),xb),f=g.length;l>j;j++)d=i,j!==o&&(d=m.clone(d,!0,!0),f&&m.merge(g,ub(d,"script"))),b.call(this[j],d,j);if(f)for(h=g[g.length-1].ownerDocument,m.map(g,yb),j=0;f>j;j++)d=g[j],ob.test(d.type||"")&&!m._data(d,"globalEval")&&m.contains(h,d)&&(d.src?m._evalUrl&&m._evalUrl(d.src):m.globalEval((d.text||d.textContent||d.innerHTML||"").replace(qb,"")));i=c=null}return this}}),m.each({appendTo:"append",prependTo:"prepend",insertBefore:"before",insertAfter:"after",replaceAll:"replaceWith"},function(a,b){m.fn[a]=function(a){for(var c,d=0,e=[],g=m(a),h=g.length-1;h>=d;d++)c=d===h?this:this.clone(!0),m(g[d])[b](c),f.apply(e,c.get());return this.pushStack(e)}});var Cb,Db={};function Eb(b,c){var d,e=m(c.createElement(b)).appendTo(c.body),f=a.getDefaultComputedStyle&&(d=a.getDefaultComputedStyle(e[0]))?d.display:m.css(e[0],"display");return e.detach(),f}function Fb(a){var b=y,c=Db[a];return c||(c=Eb(a,b),"none"!==c&&c||(Cb=(Cb||m("

    9{AsZJ!>jWLmSMaJk`L;Rln(SsTiTGu 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 literal 0 HcmV?d00001 diff --git a/docs/articles/fancy-example.gif b/docs/articles/fancy-example.gif new file mode 100644 index 0000000000000000000000000000000000000000..c07259b96077fee7db08d593f6c03645aeda8411 GIT binary patch literal 228476 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 z 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 literal 0 HcmV?d00001 diff --git a/docs/articles/groups-inputs.gif b/docs/articles/groups-inputs.gif new file mode 100644 index 0000000000000000000000000000000000000000..099d8bcde28c5872fa3e64111ed1b352b47ba65e GIT binary patch literal 63997 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 P-8+4017U3q$b + + + + + + + +Articles • manipulateWidget + + + + + + + + + + + + + + + + + + + + + + + + +

Q@?OD1! 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�ukW#okn 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