From 6ab186ad85a78b8925c84a44e322b759901cd2be Mon Sep 17 00:00:00 2001 From: Jianfeng Li Date: Mon, 20 Apr 2020 12:00:07 +0800 Subject: [PATCH] rename annovarR to anor --- .vscode/tasks.json | 24 + ChangeLog | 2 +- DESCRIPTION | 10 +- Dockerfile | 6 +- Makefile | 2 +- NEWS.md | 4 +- R/annotation.R | 20 +- R/annotation.utils.R | 2 +- R/{annovarR.R => anor.R} | 20 +- R/auto.R | 40 +- R/build.R | 28 +- R/download.R | 8 +- R/external_function.R | 2 +- R/external_tools.R | 4 +- R/get.R | 26 +- R/utils.R | 2 +- README.md | 62 +- _pkgdown.yml | 12 +- annovarR.Rproj => anor.Rproj | 0 docs/404.html | 133 + docs/LICENSE-text.html | 135 + docs/apple-touch-icon-120x120.png | Bin 0 -> 15975 bytes docs/apple-touch-icon-152x152.png | Bin 0 -> 22281 bytes docs/apple-touch-icon-180x180.png | Bin 0 -> 27495 bytes docs/apple-touch-icon-60x60.png | Bin 0 -> 5353 bytes docs/apple-touch-icon-76x76.png | Bin 0 -> 8093 bytes docs/apple-touch-icon.png | Bin 0 -> 27495 bytes docs/articles/database_of_anor.html | 180 + .../crosstalk-1.1.0.1/css/crosstalk.css | 27 + .../crosstalk-1.1.0.1/js/crosstalk.js | 1474 ++++ .../crosstalk-1.1.0.1/js/crosstalk.js.map | 37 + .../crosstalk-1.1.0.1/js/crosstalk.min.js | 2 + .../crosstalk-1.1.0.1/js/crosstalk.min.js.map | 1 + .../datatables-binding-0.13/datatables.js | 1320 ++++ .../datatables-crosstalk.css | 23 + .../css/jquery.dataTables.extra.css | 28 + .../css/jquery.dataTables.min.css | 1 + .../js/jquery.dataTables.min.js | 180 + .../css/buttons.dataTables.min.css | 1 + .../js/buttons.colVis.min.js | 10 + .../js/buttons.flash.min.js | 39 + .../js/buttons.html5.min.js | 35 + .../js/buttons.print.min.js | 9 + .../js/dataTables.buttons.min.js | 42 + .../css/fixedColumns.dataTables.min.css | 1 + .../js/dataTables.fixedColumns.min.js | 48 + .../css/responsive.dataTables.min.css | 1 + .../js/dataTables.responsive.min.js | 30 + .../htmlwidgets-1.5.1/htmlwidgets.js | 903 +++ .../jquery-1.12.4/LICENSE.txt | 37 + .../jquery-1.12.4/jquery.min.js | 5 + docs/articles/index.html | 134 + docs/articles/introduction_to_anor.html | 447 ++ .../crosstalk-1.1.0.1/css/crosstalk.css | 27 + .../crosstalk-1.1.0.1/js/crosstalk.js | 1474 ++++ .../crosstalk-1.1.0.1/js/crosstalk.js.map | 37 + .../crosstalk-1.1.0.1/js/crosstalk.min.js | 2 + .../crosstalk-1.1.0.1/js/crosstalk.min.js.map | 1 + .../datatables-binding-0.13/datatables.js | 1320 ++++ .../datatables-crosstalk.css | 23 + .../css/jquery.dataTables.extra.css | 28 + .../css/jquery.dataTables.min.css | 1 + .../js/jquery.dataTables.min.js | 180 + .../htmlwidgets-1.5.1/htmlwidgets.js | 903 +++ .../jquery-1.12.4/LICENSE.txt | 37 + .../jquery-1.12.4/jquery.min.js | 5 + docs/authors.html | 132 + docs/favicon-16x16.png | Bin 0 -> 1339 bytes docs/favicon-32x32.png | Bin 0 -> 2287 bytes docs/favicon.ico | Bin 0 -> 15086 bytes docs/index.html | 378 + docs/jquery.sticky-kit.min.js | 9 + docs/life.css | 6496 +++++++++++++++++ docs/life.css.map | 7 + docs/link.svg | 12 + docs/logo.svg | 94 + docs/news/index.html | 165 + docs/pkgdown.css | 243 + docs/pkgdown.js | 49 + docs/pkgdown.yml | 6 + docs/reference/annotation.cols.match.html | 268 + docs/reference/annotation.html | 215 + docs/reference/annotation.merge.html | 162 + docs/reference/annotation.region.match.html | 280 + docs/reference/annovar.html | 281 + docs/reference/anor.html | 159 + docs/reference/del.html | 189 + docs/reference/download.database.html | 201 + docs/reference/drop.mysql.index.html | 170 + docs/reference/drop.sqlite.index.html | 173 + docs/reference/figures/BRVar_databases-1.jpg | Bin 0 -> 44058 bytes docs/reference/figures/annovarR_package-1.jpg | Bin 0 -> 76128 bytes docs/reference/figures/logo.png | Bin 0 -> 9397 bytes docs/reference/figures/logo.svg | 94 + docs/reference/figures/opencpu.jpg | Bin 0 -> 54660 bytes docs/reference/figures/shiny_app.jpg | Bin 0 -> 86840 bytes docs/reference/figures/shiny_gui_1.jpg | Bin 0 -> 107662 bytes docs/reference/figures/shiny_gui_10.jpg | Bin 0 -> 80851 bytes docs/reference/figures/shiny_gui_11.jpg | Bin 0 -> 40863 bytes docs/reference/figures/shiny_gui_12.jpg | Bin 0 -> 41423 bytes docs/reference/figures/shiny_gui_2.jpg | Bin 0 -> 56786 bytes docs/reference/figures/shiny_gui_3.jpg | Bin 0 -> 45007 bytes docs/reference/figures/shiny_gui_4.jpg | Bin 0 -> 81138 bytes docs/reference/figures/shiny_gui_5.jpg | Bin 0 -> 70861 bytes docs/reference/figures/shiny_gui_6.jpg | Bin 0 -> 96826 bytes docs/reference/figures/shiny_gui_7.jpg | Bin 0 -> 106900 bytes docs/reference/figures/shiny_gui_8.jpg | Bin 0 -> 52558 bytes docs/reference/figures/shiny_gui_9.jpg | Bin 0 -> 78769 bytes docs/reference/get.annotation.dbtype.html | 155 + docs/reference/get.annotation.names.html | 151 + docs/reference/get.annotation.needcols.html | 155 + docs/reference/get.download.name.html | 158 + docs/reference/index.html | 354 + docs/reference/mysql.auto.build.html | 230 + docs/reference/mysql.auto.index.html | 192 + docs/reference/mysql.build.html | 185 + docs/reference/mysql.head.html | 171 + docs/reference/mysql.index.html | 175 + docs/reference/mysql.tb.colnames.html | 159 + docs/reference/mysql.tb.indexes.html | 148 + docs/reference/sql2sqlite.html | 177 + docs/reference/sqlite.auto.build.html | 237 + docs/reference/sqlite.auto.index.html | 209 + docs/reference/sqlite.build.html | 190 + docs/reference/sqlite.head.html | 184 + docs/reference/sqlite.index.html | 177 + docs/reference/sqlite.tb.colnames.html | 152 + docs/reference/sqlite.tb.indexes.html | 156 + docs/reference/sqlite2sql.html | 175 + docs/reference/vcfanno.html | 198 + docs/reference/vep.html | 225 + docs/tocBullet.svg | 11 + inst/extdata/config/databases.toml | 12 +- .../config/shiny.CEMiTool.parameters.toml | 60 - .../config/shiny.annovar.parameters.toml | 64 - .../config/shiny.annovarR.parameters.toml | 63 - .../shiny.clusterProfiler.parameters.toml | 261 - inst/extdata/config/shiny.config.toml | 74 - .../config/shiny.gvmap.parameters.toml | 142 - .../config/shiny.maftools.parameters.toml | 353 - .../config/shiny.vcfanno.parameters.toml | 48 - inst/extdata/config/shiny.vep.parameters.toml | 34 - inst/extdata/demo/DARNED.R | 2 +- inst/extdata/demo/RADAR2.R | 2 +- inst/extdata/demo/clinvar.R | 2 +- inst/extdata/demo/interval.R | 2 +- inst/scripts/start.R | 2 +- man/annotation.Rd | 25 +- man/annotation.cols.match.Rd | 35 +- man/annotation.merge.Rd | 2 +- man/annotation.region.match.Rd | 39 +- man/annovar.Rd | 61 +- man/annovarR.Rd | 38 - man/anor.Rd | 25 + man/del.Rd | 14 +- man/download.database.Rd | 25 +- man/drop.mysql.index.Rd | 16 +- man/drop.sqlite.index.Rd | 14 +- man/get.annotation.dbtype.Rd | 13 +- man/get.annotation.names.Rd | 13 +- man/get.annotation.needcols.Rd | 13 +- man/get.download.name.Rd | 8 +- man/mysql.auto.build.Rd | 37 +- man/mysql.auto.index.Rd | 27 +- man/mysql.build.Rd | 20 +- man/mysql.head.Rd | 11 +- man/mysql.index.Rd | 17 +- man/mysql.tb.colnames.Rd | 7 +- man/mysql.tb.indexes.Rd | 3 +- man/sql2sqlite.Rd | 7 +- man/sqlite.auto.build.Rd | 32 +- man/sqlite.auto.index.Rd | 21 +- man/sqlite.build.Rd | 19 +- man/sqlite.head.Rd | 11 +- man/sqlite.index.Rd | 15 +- man/sqlite.tb.colnames.Rd | 5 +- man/sqlite.tb.indexes.Rd | 5 +- man/sqlite2sql.Rd | 10 +- man/vcfanno.Rd | 21 +- man/vep.Rd | 19 +- pkgdown/favicon/apple-touch-icon-120x120.png | Bin 0 -> 15975 bytes pkgdown/favicon/apple-touch-icon-152x152.png | Bin 0 -> 22281 bytes pkgdown/favicon/apple-touch-icon-180x180.png | Bin 0 -> 27495 bytes pkgdown/favicon/apple-touch-icon-60x60.png | Bin 0 -> 5353 bytes pkgdown/favicon/apple-touch-icon-76x76.png | Bin 0 -> 8093 bytes pkgdown/favicon/apple-touch-icon.png | Bin 0 -> 27495 bytes pkgdown/favicon/favicon-16x16.png | Bin 0 -> 1339 bytes pkgdown/favicon/favicon-32x32.png | Bin 0 -> 2287 bytes pkgdown/favicon/favicon.ico | Bin 0 -> 15086 bytes tests/testthat.R | 4 +- tests/testthat/avoid_32_error/test_region.R | 6 +- tests/testthat/redundent/test_annotation.R | 6 +- tests/testthat/test_annotation.reduce.R | 6 +- tests/testthat/test_auto.R | 2 +- tests/testthat/test_build.R | 12 +- tests/testthat/test_custom.R | 2 +- tests/testthat/test_download.R | 22 - tests/testthat/test_external_function.R | 2 +- tests/testthat/test_get.R | 4 +- tests/testthat/test_return_colnames.R | 2 +- tests/testthat/test_utils.R | 6 +- ...e_in_annovarR.Rmd => database_of_anor.Rmd} | 16 +- ..._annovarR.Rmd => introduction_to_anor.Rmd} | 46 +- 203 files changed, 24024 insertions(+), 1563 deletions(-) create mode 100644 .vscode/tasks.json rename R/{annovarR.R => anor.R} (69%) rename annovarR.Rproj => anor.Rproj (100%) create mode 100644 docs/404.html create mode 100644 docs/LICENSE-text.html create mode 100644 docs/apple-touch-icon-120x120.png create mode 100644 docs/apple-touch-icon-152x152.png create mode 100644 docs/apple-touch-icon-180x180.png create mode 100644 docs/apple-touch-icon-60x60.png create mode 100644 docs/apple-touch-icon-76x76.png create mode 100644 docs/apple-touch-icon.png create mode 100644 docs/articles/database_of_anor.html create mode 100644 docs/articles/database_of_anor_files/crosstalk-1.1.0.1/css/crosstalk.css create mode 100644 docs/articles/database_of_anor_files/crosstalk-1.1.0.1/js/crosstalk.js create mode 100644 docs/articles/database_of_anor_files/crosstalk-1.1.0.1/js/crosstalk.js.map create mode 100644 docs/articles/database_of_anor_files/crosstalk-1.1.0.1/js/crosstalk.min.js create mode 100644 docs/articles/database_of_anor_files/crosstalk-1.1.0.1/js/crosstalk.min.js.map create mode 100644 docs/articles/database_of_anor_files/datatables-binding-0.13/datatables.js create mode 100644 docs/articles/database_of_anor_files/datatables-css-0.0.0/datatables-crosstalk.css create mode 100644 docs/articles/database_of_anor_files/dt-core-1.10.20/css/jquery.dataTables.extra.css create mode 100644 docs/articles/database_of_anor_files/dt-core-1.10.20/css/jquery.dataTables.min.css create mode 100644 docs/articles/database_of_anor_files/dt-core-1.10.20/js/jquery.dataTables.min.js create mode 100644 docs/articles/database_of_anor_files/dt-ext-buttons-1.10.20/css/buttons.dataTables.min.css create mode 100644 docs/articles/database_of_anor_files/dt-ext-buttons-1.10.20/js/buttons.colVis.min.js create mode 100644 docs/articles/database_of_anor_files/dt-ext-buttons-1.10.20/js/buttons.flash.min.js create mode 100644 docs/articles/database_of_anor_files/dt-ext-buttons-1.10.20/js/buttons.html5.min.js create mode 100644 docs/articles/database_of_anor_files/dt-ext-buttons-1.10.20/js/buttons.print.min.js create mode 100644 docs/articles/database_of_anor_files/dt-ext-buttons-1.10.20/js/dataTables.buttons.min.js create mode 100644 docs/articles/database_of_anor_files/dt-ext-fixedcolumns-1.10.20/css/fixedColumns.dataTables.min.css create mode 100644 docs/articles/database_of_anor_files/dt-ext-fixedcolumns-1.10.20/js/dataTables.fixedColumns.min.js create mode 100644 docs/articles/database_of_anor_files/dt-ext-responsive-1.10.20/css/responsive.dataTables.min.css create mode 100644 docs/articles/database_of_anor_files/dt-ext-responsive-1.10.20/js/dataTables.responsive.min.js create mode 100644 docs/articles/database_of_anor_files/htmlwidgets-1.5.1/htmlwidgets.js create mode 100644 docs/articles/database_of_anor_files/jquery-1.12.4/LICENSE.txt create mode 100644 docs/articles/database_of_anor_files/jquery-1.12.4/jquery.min.js create mode 100644 docs/articles/index.html create mode 100644 docs/articles/introduction_to_anor.html create mode 100644 docs/articles/introduction_to_anor_files/crosstalk-1.1.0.1/css/crosstalk.css create mode 100644 docs/articles/introduction_to_anor_files/crosstalk-1.1.0.1/js/crosstalk.js create mode 100644 docs/articles/introduction_to_anor_files/crosstalk-1.1.0.1/js/crosstalk.js.map create mode 100644 docs/articles/introduction_to_anor_files/crosstalk-1.1.0.1/js/crosstalk.min.js create mode 100644 docs/articles/introduction_to_anor_files/crosstalk-1.1.0.1/js/crosstalk.min.js.map create mode 100644 docs/articles/introduction_to_anor_files/datatables-binding-0.13/datatables.js create mode 100644 docs/articles/introduction_to_anor_files/datatables-css-0.0.0/datatables-crosstalk.css create mode 100644 docs/articles/introduction_to_anor_files/dt-core-1.10.20/css/jquery.dataTables.extra.css create mode 100644 docs/articles/introduction_to_anor_files/dt-core-1.10.20/css/jquery.dataTables.min.css create mode 100644 docs/articles/introduction_to_anor_files/dt-core-1.10.20/js/jquery.dataTables.min.js create mode 100644 docs/articles/introduction_to_anor_files/htmlwidgets-1.5.1/htmlwidgets.js create mode 100644 docs/articles/introduction_to_anor_files/jquery-1.12.4/LICENSE.txt create mode 100644 docs/articles/introduction_to_anor_files/jquery-1.12.4/jquery.min.js create mode 100644 docs/authors.html create mode 100644 docs/favicon-16x16.png create mode 100644 docs/favicon-32x32.png create mode 100644 docs/favicon.ico create mode 100644 docs/index.html create mode 100644 docs/jquery.sticky-kit.min.js create mode 100644 docs/life.css create mode 100644 docs/life.css.map create mode 100644 docs/link.svg create mode 100644 docs/logo.svg create mode 100644 docs/news/index.html create mode 100644 docs/pkgdown.css create mode 100644 docs/pkgdown.js create mode 100644 docs/pkgdown.yml create mode 100644 docs/reference/annotation.cols.match.html create mode 100644 docs/reference/annotation.html create mode 100644 docs/reference/annotation.merge.html create mode 100644 docs/reference/annotation.region.match.html create mode 100644 docs/reference/annovar.html create mode 100644 docs/reference/anor.html create mode 100644 docs/reference/del.html create mode 100644 docs/reference/download.database.html create mode 100644 docs/reference/drop.mysql.index.html create mode 100644 docs/reference/drop.sqlite.index.html create mode 100644 docs/reference/figures/BRVar_databases-1.jpg create mode 100644 docs/reference/figures/annovarR_package-1.jpg create mode 100644 docs/reference/figures/logo.png create mode 100644 docs/reference/figures/logo.svg create mode 100644 docs/reference/figures/opencpu.jpg create mode 100644 docs/reference/figures/shiny_app.jpg create mode 100644 docs/reference/figures/shiny_gui_1.jpg create mode 100644 docs/reference/figures/shiny_gui_10.jpg create mode 100644 docs/reference/figures/shiny_gui_11.jpg create mode 100644 docs/reference/figures/shiny_gui_12.jpg create mode 100644 docs/reference/figures/shiny_gui_2.jpg create mode 100644 docs/reference/figures/shiny_gui_3.jpg create mode 100644 docs/reference/figures/shiny_gui_4.jpg create mode 100644 docs/reference/figures/shiny_gui_5.jpg create mode 100644 docs/reference/figures/shiny_gui_6.jpg create mode 100644 docs/reference/figures/shiny_gui_7.jpg create mode 100644 docs/reference/figures/shiny_gui_8.jpg create mode 100644 docs/reference/figures/shiny_gui_9.jpg create mode 100644 docs/reference/get.annotation.dbtype.html create mode 100644 docs/reference/get.annotation.names.html create mode 100644 docs/reference/get.annotation.needcols.html create mode 100644 docs/reference/get.download.name.html create mode 100644 docs/reference/index.html create mode 100644 docs/reference/mysql.auto.build.html create mode 100644 docs/reference/mysql.auto.index.html create mode 100644 docs/reference/mysql.build.html create mode 100644 docs/reference/mysql.head.html create mode 100644 docs/reference/mysql.index.html create mode 100644 docs/reference/mysql.tb.colnames.html create mode 100644 docs/reference/mysql.tb.indexes.html create mode 100644 docs/reference/sql2sqlite.html create mode 100644 docs/reference/sqlite.auto.build.html create mode 100644 docs/reference/sqlite.auto.index.html create mode 100644 docs/reference/sqlite.build.html create mode 100644 docs/reference/sqlite.head.html create mode 100644 docs/reference/sqlite.index.html create mode 100644 docs/reference/sqlite.tb.colnames.html create mode 100644 docs/reference/sqlite.tb.indexes.html create mode 100644 docs/reference/sqlite2sql.html create mode 100644 docs/reference/vcfanno.html create mode 100644 docs/reference/vep.html create mode 100644 docs/tocBullet.svg delete mode 100644 inst/extdata/config/shiny.CEMiTool.parameters.toml delete mode 100644 inst/extdata/config/shiny.annovar.parameters.toml delete mode 100644 inst/extdata/config/shiny.annovarR.parameters.toml delete mode 100644 inst/extdata/config/shiny.clusterProfiler.parameters.toml delete mode 100644 inst/extdata/config/shiny.config.toml delete mode 100644 inst/extdata/config/shiny.gvmap.parameters.toml delete mode 100644 inst/extdata/config/shiny.maftools.parameters.toml delete mode 100644 inst/extdata/config/shiny.vcfanno.parameters.toml delete mode 100644 inst/extdata/config/shiny.vep.parameters.toml delete mode 100644 man/annovarR.Rd create mode 100644 man/anor.Rd create mode 100644 pkgdown/favicon/apple-touch-icon-120x120.png create mode 100644 pkgdown/favicon/apple-touch-icon-152x152.png create mode 100644 pkgdown/favicon/apple-touch-icon-180x180.png create mode 100644 pkgdown/favicon/apple-touch-icon-60x60.png create mode 100644 pkgdown/favicon/apple-touch-icon-76x76.png create mode 100644 pkgdown/favicon/apple-touch-icon.png create mode 100644 pkgdown/favicon/favicon-16x16.png create mode 100644 pkgdown/favicon/favicon-32x32.png create mode 100644 pkgdown/favicon/favicon.ico delete mode 100644 tests/testthat/test_download.R rename vignettes/{database_in_annovarR.Rmd => database_of_anor.Rmd} (83%) rename vignettes/{introduction_to_annovarR.Rmd => introduction_to_anor.Rmd} (80%) diff --git a/.vscode/tasks.json b/.vscode/tasks.json new file mode 100644 index 0000000..067492e --- /dev/null +++ b/.vscode/tasks.json @@ -0,0 +1,24 @@ +{ + // See https://go.microsoft.com/fwlink/?LinkId=733558 + // for the documentation about the tasks.json format + "version": "2.0.0", + "tasks": [ + { + "label": "build", + "type": "shell", + "command": "make build" + }, + { + "label": "test", + "type": "shell", + "command": "make test", + "problemMatcher": [] + }, + { + "label": "pkgdown_build", + "type": "shell", + "command": "Rscript -e 'pkgdown::build_site()'", + "problemMatcher": [] + }, + ] +} \ No newline at end of file diff --git a/ChangeLog b/ChangeLog index ad6b6ee..245f8b8 100644 --- a/ChangeLog +++ b/ChangeLog @@ -74,7 +74,7 @@ 2018-02-26 Li Jianfeng - * initial annovarR shiny App (inst/extdata/tools/shiny) + * initial anor shiny App (inst/extdata/tools/shiny) 2018-01-19 Li Jianfeng diff --git a/DESCRIPTION b/DESCRIPTION index b8c871a..98e0f22 100644 --- a/DESCRIPTION +++ b/DESCRIPTION @@ -1,14 +1,14 @@ -Package: annovarR +Package: anor Type: Package Title: Integrated Framework to Annotate Genetic Variants Version: 1.3 Authors@R: person("Jianfeng", "Li", email = "lee_jianfeng@sjtu.edu.cn", role = c("aut", "cre"), comment = c(ORCID = "0000-0003-2349-208X")) Description: - The 'annovarR' package provides R functions as well as database resources which offer an integrated framework to annotate genetic variants from genome and transcriptome data. The wrapper functions of 'annovarR' unified the interface of many published annotation tools, such as 'VEP' (), 'ANNOVAR' (), 'vcfanno' () and 'AnnotationDbi' (). It also simplified the use of some of the external annotation tools in R. Besides, massive published genetic variants annotation databases were integrated into 'annovarR'. For example, 'annovarR' provides a newly RNA-seq allele frequency database, BRVar, which built from total 1,285 cases public B-progenitor acute lymphoblastic leukemia (B-ALL) transcriptome data. + The 'anor' package provides R functions as well as database resources which offer an integrated framework to annotate genetic variants from genome and transcriptome data. The wrapper functions of 'anor' unified the interface of many published annotation tools, such as 'VEP' (), 'ANNOVAR' (), 'vcfanno' () and 'AnnotationDbi' (). It also simplified the use of some of the external annotation tools in R. Besides, massive published genetic variants annotation databases were integrated into 'anor'. For example, 'anor' provides a newly RNA-seq allele frequency database, BRVar, which built from total 1,285 cases public B-progenitor acute lymphoblastic leukemia (B-ALL) transcriptome data. Depends: R (>= 3.3.0) -URL: https://github.com/JhuangLab/annovarR -BugReports: https://github.com/JhuangLab/annovarR/issues +URL: https://github.com/JhuangLab/anor +BugReports: https://github.com/JhuangLab/anor/issues License: MIT + file LICENSE Encoding: UTF-8 LazyData: true @@ -29,7 +29,7 @@ Imports: devtools, AnnotationDbi, liteq -RoxygenNote: 6.1.1 +RoxygenNote: 7.1.0 Suggests: testthat, knitr, rmarkdown, diff --git a/Dockerfile b/Dockerfile index b2a7981..3e7d304 100644 --- a/Dockerfile +++ b/Dockerfile @@ -3,10 +3,10 @@ FROM bioinstaller/ngsjs:latest ## This handle reaches Jianfeng MAINTAINER "Jianfeng Li" lee_jianfeng@openbiox.org -ADD . /tmp/annovarR +ADD . /tmp/anor Run runuser -s /bin/bash -l opencpu -c "Rscript -e 'pacman::p_load(maftools, clusterProfiler, CEMiTool, org.Hs.eg.db, DT)'" \ - && runuser -s /bin/bash -l opencpu -c "Rscript -e 'devtools::install(\"/tmp/annovarR\", dependences = T)'" \ - && rm -rf /tmp/annovarR \ + && runuser -s /bin/bash -l opencpu -c "Rscript -e 'devtools::install(\"/tmp/anor\", dependences = T)'" \ + && rm -rf /tmp/anor \ && rm -rf /var/lib/apt/lists/* \ && rm -rf /tmp/downloaded_packages/ /tmp/*.rds diff --git a/Makefile b/Makefile index 4b6006b..e58c0c1 100644 --- a/Makefile +++ b/Makefile @@ -2,7 +2,7 @@ PKGNAME := $(shell sed -n "s/Package: *\([^ ]*\)/\1/p" DESCRIPTION) PKGVERS := $(shell sed -n "s/Version: *\([^ ]*\)/\1/p" DESCRIPTION) PKGSRC := $(shell basename `pwd`) -all: doc build check_cran +all: doc build check doc: Rscript -e "devtools::document()" diff --git a/NEWS.md b/NEWS.md index 2a72b6f..8706cce 100644 --- a/NEWS.md +++ b/NEWS.md @@ -1,10 +1,10 @@ -# annovarR 1.1.0 +# anor 1.1.0 ## New features * Shiny app for maftools and gvmap -# annovarR 1.0.0 +# anor 1.0.0 ## New features diff --git a/R/annotation.R b/R/annotation.R index a4068c1..a801346 100644 --- a/R/annotation.R +++ b/R/annotation.R @@ -33,13 +33,13 @@ #' end <- c('10020', '10020', '10020') #' ref <- c('A', 'A', 'A') #' alt <- c('-', '-', '-') -#' database <- system.file('extdata', 'demo/hg19_avsnp147.txt', package = 'annovarR') +#' database <- system.file('extdata', 'demo/hg19_avsnp147.txt', package = 'anor') #' database.dir <- dirname(database) #' dat <- data.table(chr = chr, start = start, end = end, ref = ref, alt = alt) #' x <- annotation.cols.match(dat, 'avsnp147', database.dir = database.dir, #' return_col_names = 'avSNP147', db.type = 'txt') annotation.cols.match <- function(dat = data.table(), anno.name = "", buildver = "hg19", - database.dir = Sys.getenv("annovarR_DB_DIR", ""), db_col_order = 1:5, index_cols = c("chr", + database.dir = Sys.getenv("anor_DB_DIR", ""), db_col_order = 1:5, index_cols = c("chr", "start"), matched_cols = c("chr", "start", "end", "ref", "alt"), return_col_index = 6, return_col_names = "", return_col_names_profix = "", format_dat_fun = format.cols, dbname_fixed = NULL, table_name_fixed = NULL, setdb_fun = set.db, set_table_fun = set.table, @@ -108,7 +108,7 @@ annotation.cols.match <- function(dat = data.table(), anno.name = "", buildver = #' @export #' @examples #' library(data.table) -#' bed.file <- system.file('extdata', 'demo/example.bed', package = 'annovarR') +#' bed.file <- system.file('extdata', 'demo/example.bed', package = 'anor') #' bed.sqlite <- sprintf('%s/%s.sqlite', tempdir(), basename(bed.file)) #' connect.params <- list(dbname = bed.sqlite, table.name = 'bed') #' sqlite.build(bed.file, connect.params) @@ -122,7 +122,7 @@ annotation.cols.match <- function(dat = data.table(), anno.name = "", buildver = #' params = list(...);return(params[[1]])}) #' file.remove(bed.sqlite) annotation.region.match <- function(dat = data.table(), anno.name = "", buildver = "hg19", - database.dir = Sys.getenv("annovarR_DB_DIR", ""), db_col_order = 1:3, index_cols = c("chr", + database.dir = Sys.getenv("anor_DB_DIR", ""), db_col_order = 1:3, index_cols = c("chr", "start", "end"), full.matched_cols = "chr", inferior_col = "start", superior_col = "end", return_col_index = 4, return_col_names = "", return_col_names_profix = "", format_dat_fun = format.cols, dbname_fixed = NULL, table_name_fixed = NULL, setdb_fun = set.db, set_table_fun = set.table, @@ -184,7 +184,7 @@ annotation.region.match <- function(dat = data.table(), anno.name = "", buildver #' the names can be found on the http://annovar.openbioinformatics.org/en/latest/user-guide/download/ #' @param database.dir Dir of the databases #' @param db.type Setting the database type (sqlite or txt) -#' @param database.cfg Configuration file of annovarR databases infomation +#' @param database.cfg Configuration file of anor databases infomation #' @param func Function to anntate the dat data, default is to search the function in extdata/database.toml #' @param mysql.connect.params Connect MySQL database other parameters, #' e.g. list(host='11.11.11.1', port = '3306', user = '', password = '123456') @@ -199,14 +199,14 @@ annotation.region.match <- function(dat = data.table(), anno.name = "", buildver #' end <- c('10020', '10020', '10020') #' ref <- c('A', 'A', 'A') #' alt <- c('-', '-', '-') -#' database <- system.file('extdata', 'demo/hg19_avsnp147.txt', package = 'annovarR') +#' database <- system.file('extdata', 'demo/hg19_avsnp147.txt', package = 'anor') #' database.dir <- dirname(database) #' dat <- data.table(chr = chr, start = start, end = end, ref = ref, alt = alt) #' x <- annotation(dat, 'avsnp147', database.dir = database.dir, #' return_col_names = 'avSNP147', db.type = 'txt') annotation <- function(dat = data.table(), anno.name = "", buildver = "hg19", annovar.anno.names = "", - database.dir = Sys.getenv("annovarR_DB_DIR", ""), db.type = NULL, database.cfg = system.file("extdata", - "config/databases.toml", package = "annovarR"), func = NULL, mysql.connect.params = list(host = "", + database.dir = Sys.getenv("anor_DB_DIR", ""), db.type = NULL, database.cfg = system.file("extdata", + "config/databases.toml", package = "anor"), func = NULL, mysql.connect.params = list(host = "", dbname = "", table.name = "", user = "", password = ""), sqlite.connect.params = list(dbname = ""), ...) { if (length(anno.name) > 1) { @@ -244,7 +244,7 @@ annotation <- function(dat = data.table(), anno.name = "", buildver = "hg19", an #' end <- c('10020', '10020', '10020') #' ref <- c('A', 'A', 'A') #' alt <- c('-', '-', '-') -#' database <- system.file('extdata', 'demo/hg19_avsnp147.txt', package = 'annovarR') +#' database <- system.file('extdata', 'demo/hg19_avsnp147.txt', package = 'anor') #' database.dir <- dirname(database) #' dat <- data.table(chr = chr, start = start, end = end, ref = ref, alt = alt) #' x <- annotation.merge(dat = dat, anno.names = c('avsnp147'), @@ -262,7 +262,7 @@ annotation.merge <- function(anno.names, ...) { }) names(result.list.2) <- perl_annovar_names if (length(result.list.1) != 0) { - return(list(annovarR = as.data.table(result.list.1), annovar = result.list.2)) + return(list(anor = as.data.table(result.list.1), annovar = result.list.2)) } else { return(list(annovar = result.list.2)) } diff --git a/R/annotation.utils.R b/R/annotation.utils.R index b7ddf9b..f25ebac 100644 --- a/R/annotation.utils.R +++ b/R/annotation.utils.R @@ -1,6 +1,6 @@ # preprocess before to query with database before.query.steps <- function(dat = data.table(), anno.name = "", buildver = "hg19", - database.dir = Sys.getenv("annovarR_DB_DIR", ""), db_col_order = 1:5, index_cols = c("chr", + database.dir = Sys.getenv("anor_DB_DIR", ""), db_col_order = 1:5, index_cols = c("chr", "start"), matched_cols = c("chr", "start", "end", "ref", "alt"), format_dat_fun = format.cols, dbname_fixed = NULL, table_name_fixed = NULL, setdb_fun = set.db, set_table_fun = set.table, db.type = NULL, db.file.prefix = NULL, mysql.connect.params = list(), sqlite.connect.params = list(), diff --git a/R/annovarR.R b/R/anor.R similarity index 69% rename from R/annovarR.R rename to R/anor.R index 6956d5c..ac60cbb 100644 --- a/R/annovarR.R +++ b/R/anor.R @@ -1,12 +1,12 @@ -#' The 'annovarR' package provides R functions as well as database resources which offer an +#' The 'anor' package provides R functions as well as database resources which offer an #' integrated framework to annotate genetic variants from genome and transcriptome data. -#' The wrapper functions of 'annovarR' unified the interface of many published annotation tools, +#' The wrapper functions of 'anor' unified the interface of many published annotation tools, #' such as 'VEP' (\url{http://asia.ensembl.org/info/docs/tools/vep/index.html}), #' 'ANNOVAR' (\url{http://annovar.openbioinformatics.org/}), 'vcfanno' (\url{https://github.com/brentp/vcfanno}) #' and 'AnnotationDbi' (\url{http://www.bioconductor.org/packages/release/bioc/html/AnnotationDbi.html}). #' It also simplified the use of some of the external annotation tools in R. -#' Besides, massive published genetic variants annotation databases were integrated into 'annovarR'. -#' For example, 'annovarR' provides a newly RNA-seq allele frequency database, BRVar, +#' Besides, massive published genetic variants annotation databases were integrated into 'anor'. +#' For example, 'anor' provides a newly RNA-seq allele frequency database, BRVar, #' which built from total 1,285 cases public B-progenitor acute lymphoblastic leukemia (B-ALL) transcriptome data. #' #' @author @@ -14,12 +14,12 @@ #' @seealso #' Useful links: #' -#' \url{https://github.com/JhuangLab/annovarR} +#' \url{https://github.com/JhuangLab/anor} #' -#' Report bugs at \url{https://github.com/JhuangLab/annovarR/issues} +#' Report bugs at \url{https://github.com/JhuangLab/anor/issues} #' #' @docType package -#' @name annovarR +#' @name anor #' @import stringr DBI data.table futile.logger configr BioInstaller glue liteq #' @importFrom stringi stri_rand_strings #' @importFrom utils packageVersion head installed.packages compareVersion install.packages @@ -35,9 +35,9 @@ NULL .onAttach <- function(libname, pkgname) { op <- options() - # msg <- sprintf('annovarR %s \n', packageVersion('annovarR')) msg <- - # sprintf('%s Documentation: ?annovarR, example(annovarR) and - # browseVignettes(\'annovarR\')', msg) packageStartupMessage(msg) + # msg <- sprintf('anor %s \n', packageVersion('anor')) msg <- + # sprintf('%s Documentation: ?anor, example(anor) and + # browseVignettes(\'anor\')', msg) packageStartupMessage(msg) Sys.setenv(R_TESTS = "") invisible() } diff --git a/R/auto.R b/R/auto.R index 1739c01..ade84b9 100644 --- a/R/auto.R +++ b/R/auto.R @@ -1,4 +1,4 @@ -#' Build annovarR database in sqlite (auto from extdata/config/database.toml) +#' Build anor database in sqlite (auto from extdata/config/database.toml) #' #' @param anno.name Annotation name, eg. avsnp138, avsnp147, 1000g2015aug_all #' @param buildver Genome version, hg19, hg38, mm10 and others @@ -8,7 +8,7 @@ #' default is FALSE #' @param index Index name in sqlite #' @param db.type Setting the database type (sqlite, txt or mysql) -#' @param database.cfg Configuration file of annovarR databases infomation +#' @param database.cfg Configuration file of anor databases infomation #' @param extra_fread_params Pass to \code{\link[ngstk]{batch_file}}, #' default is to get value from database.cfg #' @param sqlite.build.params Extra params pass to \code{\link{sqlite.build}} @@ -20,14 +20,14 @@ #' @export #' @examples #' i <- 'hg19_avsnp147' -#' database <- system.file('extdata', sprintf('demo/%s.txt', i), package = 'annovarR') +#' database <- system.file('extdata', sprintf('demo/%s.txt', i), package = 'anor') #' file.copy(database, sprintf('%s/%s.txt', tempdir(), i)) #' sqlite.auto.build('avsnp147', 'hg19', database.dir = tempdir(), verbose = TRUE) #' unlink(sprintf('%s/%s.txt', tempdir(), i)) #' unlink(sprintf('%s/%s.sqlite', tempdir(), i)) sqlite.auto.build <- function(anno.name = "", buildver = "hg19", database.dir = "/path/", overwrite = FALSE, append = FALSE, index = "chr_start_index", db.type = "sqlite", - database.cfg = system.file("extdata", "config/databases.toml", package = "annovarR"), + database.cfg = system.file("extdata", "config/databases.toml", package = "anor"), extra_fread_params = list(sep = "\t", header = TRUE, return_1L = FALSE), sqlite.build.params = list(fread.params = list(sep = "\t")), batch_lines = 1e+07, start_index = 1, new.colnames = NULL, verbose = TRUE) { info.msg(sprintf("Auto build database %s %s in %s", buildver, anno.name, database.dir), @@ -99,18 +99,18 @@ sqlite.auto.build <- function(anno.name = "", buildver = "hg19", database.dir = } } -#' Index annovarR database in sqlite (auto from extdata/config/database.toml) +#' Index anor database in sqlite (auto from extdata/config/database.toml) #' @param anno.name Annotation name, eg. avsnp138, avsnp147, 1000g2015aug_all #' @param buildver Genome version, hg19, hg38, mm10 and others #' @param database.dir Dir of the databases #' @param index Index name in sqlite #' @param db.type Setting the database type (sqlite, txt or mysql) -#' @param database.cfg Configuration file of annovarR databases infomation +#' @param database.cfg Configuration file of anor databases infomation #' @param verbose Logical indicating wheather print the extra log infomation #' @export #' @examples #' i <- 'hg19_avsnp147' -#' database <- system.file('extdata', sprintf('demo/%s.txt', i), package = 'annovarR') +#' database <- system.file('extdata', sprintf('demo/%s.txt', i), package = 'anor') #' file.copy(database, sprintf('%s/%s.txt', tempdir(), i)) #' sqlite.auto.build('avsnp147', 'hg19', database.dir = tempdir(), verbose = TRUE) #' sqlite.auto.index('avsnp147', 'hg19', database.dir = tempdir(), index = 'chr_start_index2', @@ -119,7 +119,7 @@ sqlite.auto.build <- function(anno.name = "", buildver = "hg19", database.dir = #' unlink(sprintf('%s/%s.sqlite', tempdir(), i)) sqlite.auto.index <- function(anno.name = "", buildver = "hg19", database.dir = "/path/", index = "chr_start_index", db.type = "sqlite", database.cfg = system.file("extdata", - "config/databases.toml", package = "annovarR"), verbose = TRUE) { + "config/databases.toml", package = "anor"), verbose = TRUE) { info.msg(sprintf("Auto build database %s %s in %s", buildver, anno.name, database.dir), verbose = verbose) auto.parameters <- c("need_cols", "db_col_order", "setdb_fun", "set_table_fun", @@ -160,7 +160,7 @@ sqlite.auto.index <- function(anno.name = "", buildver = "hg19", database.dir = } } -#' Build annovarR database in mysql (auto from extdata/config/database.toml) +#' Build anor database in mysql (auto from extdata/config/database.toml) #' #' @param anno.name Annotation name, eg. avsnp138, avsnp147, 1000g2015aug_all #' @param buildver Genome version, hg19, hg38, mm10 and others @@ -171,7 +171,7 @@ sqlite.auto.index <- function(anno.name = "", buildver = "hg19", database.dir = #' default is FALSE #' @param index Index name in sqlite #' @param db.type Setting the database type (sqlite, txt or mysql) -#' @param database.cfg Configuration file of annovarR databases infomation +#' @param database.cfg Configuration file of anor databases infomation #' @param extra_fread_params Pass to \code{\link[ngstk]{batch_file}}, #' default is to get value from database.cfg #' @param mysql.build.params Extra params pass to \code{\link{mysql.build}} @@ -183,17 +183,17 @@ sqlite.auto.index <- function(anno.name = "", buildver = "hg19", database.dir = #' @export #' @examples #' i <- 'hg19_avsnp147' -#' database <- system.file('extdata', sprintf('demo/%s.txt', i), package = 'annovarR') +#' database <- system.file('extdata', sprintf('demo/%s.txt', i), package = 'anor') #' file.copy(database, sprintf('%s/%s.txt', tempdir(), i)) #' \dontrun{ #' mysql.auto.build(anno.name = 'avsnp147', database.dir = tempdir(), #' mysql.connect.params = list(user = 'username', password = 'password', -#' host = 'localhost', port = 3306, dbname = 'annovarR')) +#' host = 'localhost', port = 3306, dbname = 'anor')) #' } mysql.auto.build <- function(anno.name = "", buildver = "hg19", database.dir = "/path/", mysql.connect.params = list(user = "", password = "", host = "localhost", port = "3306"), overwrite = FALSE, append = FALSE, index = "chr_start_index", db.type = "mysql", - database.cfg = system.file("extdata", "config/databases.toml", package = "annovarR"), + database.cfg = system.file("extdata", "config/databases.toml", package = "anor"), extra_fread_params = list(sep = "\t", header = TRUE, return_1L = FALSE), mysql.build.params = list(fread.params = list(sep = "\t")), batch_lines = 1e+07, start_index = 1, new.colnames = NULL, verbose = TRUE) { info.msg(sprintf("Auto build database %s %s in mysql database [host:%s, port:%s]", @@ -270,29 +270,29 @@ mysql.auto.build <- function(anno.name = "", buildver = "hg19", database.dir = " } } -#' Index annovarR database in mysql (auto from extdata/config/database.toml) +#' Index anor database in mysql (auto from extdata/config/database.toml) #' @param anno.name Annotation name, eg. avsnp138, avsnp147, 1000g2015aug_all #' @param buildver Genome version, hg19, hg38, mm10 and others #' @param database.dir Dir of the databases (mysql no need) #' @param mysql.connect.params Mysql parameters, [host, dbname, table.name, user, password etc.] #' @param index Index name in sqlite #' @param db.type Setting the database type (sqlite, txt or mysql) -#' @param database.cfg Configuration file of annovarR databases infomation +#' @param database.cfg Configuration file of anor databases infomation #' @param verbose Logical indicating wheather print the extra log infomation #' @export #' @examples #' i <- 'hg19_avsnp147' -#' database <- system.file('extdata', sprintf('demo/%s.txt', i), package = 'annovarR') +#' database <- system.file('extdata', sprintf('demo/%s.txt', i), package = 'anor') #' file.copy(database, sprintf('%s/%s.txt', tempdir(), i)) #' \dontrun{ #' mysql.auto.index(anno.name = 'avsnp147', database.dir = tempdir(), #' mysql.connect.params = list(user = 'username', password = 'password', -#' host = 'localhost', port = 3306, dbname = 'annovarR')) +#' host = 'localhost', port = 3306, dbname = 'anor')) #' } mysql.auto.index <- function(anno.name = "", buildver = "hg19", database.dir = "/path/", mysql.connect.params = list(user = "", password = "", host = "localhost", port = "3306"), index = "chr_start_index", db.type = "mysql", database.cfg = system.file("extdata", - "config/databases.toml", package = "annovarR"), verbose = TRUE) { + "config/databases.toml", package = "anor"), verbose = TRUE) { info.msg(sprintf("Auto index database %s %s in mysql database [host:%s, port:%s]", buildver, anno.name, mysql.connect.params$host, mysql.connect.params$port), verbose = verbose) @@ -336,7 +336,7 @@ mysql.auto.index <- function(anno.name = "", buildver = "hg19", database.dir = " } } -# Auto to annotation accodring the database.cfg annovarR supported anno.names +# Auto to annotation accodring the database.cfg anor supported anno.names annotation.auto <- function(dat = NULL, anno.name = NULL, return_col_names = NULL, return_col_names_profix = NULL, return_col_index = NULL, db_col_order = NULL, index_cols = NULL, matched_cols = NULL, full.matched_cols = NULL, inferior_col = NULL, @@ -391,7 +391,7 @@ annotation.auto <- function(dat = NULL, anno.name = NULL, return_col_names = NUL # A auto recognition function to get the annotation function from database.cfg get.annotation.func <- function(anno.name = "", database.cfg = system.file("extdata", - "config/databases.toml", package = "annovarR")) { + "config/databases.toml", package = "anor")) { all.supported.db <- get.annotation.names(database.cfg) if (!(anno.name %in% all.supported.db)) { stop(sprintf("%s not be supported.", anno.name)) diff --git a/R/build.R b/R/build.R index a2664b8..f3f97b9 100644 --- a/R/build.R +++ b/R/build.R @@ -1,4 +1,4 @@ -#' Build annovarR database in sqlite +#' Build anor database in sqlite #' #' @param filename Path of raw data, will be read by fread #' @param sqlite.connect.params Connect to sqlite database params [dbname, table.name] @@ -10,7 +10,7 @@ #' @param ... Other parameters be used in dbWriteTable #' @export #' @examples -#' test.dat <- system.file('extdata', 'demo/sqlite.dat.txt', package = 'annovarR') +#' test.dat <- system.file('extdata', 'demo/sqlite.dat.txt', package = 'anor') #' test.sqlite <- sprintf('%s/snp.test.sqlite', tempdir()) #' x <- sqlite.build(filename = test.dat, list(dbname = test.sqlite, #' table.name = 'snp_test')) @@ -64,7 +64,7 @@ sqlite.build <- function(filename = NULL, sqlite.connect.params = list(dbname = return(status) } -#' Generate search index of annovarR database table in sqlite +#' Generate search index of anor database table in sqlite #' #' @param sqlite.connect.params Connect to sqlite database params [dbname, table.name] #' @param index Index name in sqlite @@ -74,7 +74,7 @@ sqlite.build <- function(filename = NULL, sqlite.connect.params = list(dbname = #' @export #' @examples #' test.sqlite <- sprintf('%s/snp.test.sqlite', tempdir()) -#' test.dat <- system.file('extdata', 'demo/sqlite.dat.txt', package = 'annovarR') +#' test.dat <- system.file('extdata', 'demo/sqlite.dat.txt', package = 'anor') #' x <- sqlite.build(filename = test.dat, list(dbname = test.sqlite, #' table.name = 'snp_test')) #' x <- sqlite.index(list(dbname = test.sqlite, table.name = 'snp_test'), @@ -111,7 +111,7 @@ sqlite.index <- function(sqlite.connect.params = list(dbname = "", table.name = return(status) } -#' Drop search index of annovarR database table in sqlite +#' Drop search index of anor database table in sqlite #' #' @param sqlite.connect.params Connect to sqlite database params [dbname] #' @param index Index name in sqlite @@ -120,7 +120,7 @@ sqlite.index <- function(sqlite.connect.params = list(dbname = "", table.name = #' @export #' @examples #' test.sqlite <- sprintf('%s/snp.test.sqlite', tempdir()) -#' test.dat <- system.file('extdata', 'demo/sqlite.dat.txt', package = 'annovarR') +#' test.dat <- system.file('extdata', 'demo/sqlite.dat.txt', package = 'anor') #' x <- sqlite.build(filename = test.dat, list(dbname = test.sqlite, #' table.name = 'snp_test')) #' x <- sqlite.index(list(dbname = test.sqlite, table.name = 'snp_test'), @@ -157,7 +157,7 @@ drop.sqlite.index <- function(sqlite.connect.params = list(dbname = "", table.na } -#' Build annovarR database in mysql +#' Build anor database in mysql #' #' @param filename Path of raw data, will be read by fread #' @param mysql.connect.params Mysql parameters, [host, dbname, table.name, user, password etc.] @@ -168,7 +168,7 @@ drop.sqlite.index <- function(sqlite.connect.params = list(dbname = "", table.na #' @param ... Other parameters be used in dbWriteTable #' @export #' @examples -#' test.dat <- system.file('extdata', 'demo/sqlite.dat.txt', package = 'annovarR') +#' test.dat <- system.file('extdata', 'demo/sqlite.dat.txt', package = 'anor') #' \dontrun{ #' mysql.build(test.dat, list(host = 'host', dbname = 'db', #' table.name = 'table', user = 'user', password = 'password')) @@ -211,7 +211,7 @@ mysql.build <- function(filename = "", mysql.connect.params = list(host = "", db return(status) } -#' Generate search index of annovarR database table in mysql +#' Generate search index of anor database table in mysql #' #' @param mysql.connect.params Mysql parameters, [host, dbname, table.name, user, password etc.] #' @param index Index name in mysql @@ -220,7 +220,7 @@ mysql.build <- function(filename = "", mysql.connect.params = list(host = "", db #' @param ... Other parameters be used in dbSendQuery #' @export #' @examples -#' test.dat <- system.file('extdata', 'demo/sqlite.dat.txt', package = 'annovarR') +#' test.dat <- system.file('extdata', 'demo/sqlite.dat.txt', package = 'anor') #' \dontrun{ #' mysql.index(list(host = 'host', dbname = 'db', table.name = 'table', #' user = 'user', password = 'password'), index = 'index_name', cols = c('V1', 'V2')) @@ -257,7 +257,7 @@ mysql.index <- function(mysql.connect.params = list(host = "", dbname = "", tabl return(status) } -#' Drop search index of annovarR database table in mysql +#' Drop search index of anor database table in mysql #' #' @param mysql.connect.params Mysql parameters, [host, dbname, table.name, user, password etc.] #' @param index Index name in mysql @@ -265,7 +265,7 @@ mysql.index <- function(mysql.connect.params = list(host = "", dbname = "", tabl #' @param ... Other parameters be used in dbSendQuery #' @export #' @examples -#' test.dat <- system.file('extdata', 'demo/sqlite.dat.txt', package = 'annovarR') +#' test.dat <- system.file('extdata', 'demo/sqlite.dat.txt', package = 'anor') #' \dontrun{ #' drop.mysql.index(list(host = 'host', dbname = 'db', user = 'user', password = 'password'), #' index = 'index_name') @@ -316,7 +316,7 @@ drop.mysql.index <- function(mysql.connect.params = list(host = "", dbname = "", #' db <- tempfile() #' file.create(db) #' del(db, del.type = 'file') -#' test.dat <- system.file('extdata', 'demo/sqlite.dat.txt', package = 'annovarR') +#' test.dat <- system.file('extdata', 'demo/sqlite.dat.txt', package = 'anor') #' test.sqlite <- sprintf('%s/snp.test.sqlite', tempdir()) #' x <- sqlite.build(filename = test.dat, list(dbname = test.sqlite, #' table.name = 'snp_test')) @@ -375,7 +375,7 @@ del <- function(filename = "", sqlite.connect.params = list(), mysql.connect.par #' @param ... Other parameters be used in dbSendQuery #' @export #' @examples -#' sql.file <- system.file('extdata', 'demo/hg19_avsnp147.sqlite.sql', package = 'annovarR') +#' sql.file <- system.file('extdata', 'demo/hg19_avsnp147.sqlite.sql', package = 'anor') #' out.sqlite <- tempfile() #' sqlite <- Sys.which(c('sqlite3', 'sqlite')) #' sqlite <- sqlite[sqlite != ''][1] diff --git a/R/download.R b/R/download.R index 8b36545..873f9e5 100644 --- a/R/download.R +++ b/R/download.R @@ -1,4 +1,4 @@ -#' Download annovarR databases +#' Download anor databases #' #' @param download.name Download name, default is NULL and get value from database.cfg #' dependence_db @@ -6,7 +6,7 @@ #' @param version Version of download database, supported version can be get by #' download.database('db_annovar_avsnp', show.all.versions = TRUE) #' @param buildver Genome version, e.g hg19, hg38, mm10 -#' @param download.cfg Configuration file for download, most of annovarR database +#' @param download.cfg Configuration file for download, most of anor database #' resources can be found in system.file('extdata', #' 'config/db/db_annovar.toml', package = 'BioInstaller') #' @param show.all.versions Logical indicating wheather show all avaliable versions @@ -155,12 +155,12 @@ download.database <- function(download.name = NULL, database.dir = tempdir(), ve #' Use annotation name to get download.name that can be used #' to download the database use \code{download.database} #' @param anno.name Annotation name, eg. avsnp138, avsnp147, 1000g2015aug_all -#' @param database.cfg Configuration file of annovarR databases infomation +#' @param database.cfg Configuration file of anor databases infomation #' @export #' @examples #' get.download.name('avsnp147') get.download.name <- function(anno.name = "", database.cfg = system.file("extdata", - "config/databases.toml", package = "annovarR")) { + "config/databases.toml", package = "anor")) { download.name <- get.cfg.value.by.name(anno.name, database.cfg, key = "dependence_db") if (is.null(download.name) || is.na(download.name)) { download.name <- get.cfg.value.by.name(anno.name, database.cfg, key = "dependence_db", diff --git a/R/external_function.R b/R/external_function.R index 3a01588..6a86235 100644 --- a/R/external_function.R +++ b/R/external_function.R @@ -1,4 +1,4 @@ -# annovarR default function: setdb_fun, set_table_fun, format_db_tb_fun You can +# anor default function: setdb_fun, set_table_fun, format_db_tb_fun You can # re-write this R source file format.cols <- function(dat.input = "") { dat.input <- dat.input diff --git a/R/external_tools.R b/R/external_tools.R index de42056..556e9a6 100644 --- a/R/external_tools.R +++ b/R/external_tools.R @@ -234,7 +234,7 @@ vep <- function(vep = Sys.which("vep"), cache = TRUE, cache_version = 91, offlin #' #' @param vcfanno Executable file of vcfanno (Download from https://github.com/brentp/vcfanno/releases) #' @param vcfanno_database_cfg vcfanno required database configuration file -#' (Not the annovarR database.cfg) +#' (Not the anor database.cfg) #' @param base_path Optional base_path to prepend to annotation files in the config #' @param lua Optional path to a file containing custom javascript functions to be used as ops #' @param ends Annotate the start and end as well as the interval itself. @@ -249,7 +249,7 @@ vep <- function(vep = Sys.which("vep"), cache = TRUE, cache_version = 91, offlin #' vcfanno(debug = TRUE) vcfanno <- function(vcfanno = Sys.which(c("vcfanno", "vcfanno_osx", "vcfanno_linux64")), vcfanno_database_cfg = system.file("extdata", "demo/vcfanno_demo/conf.toml", - package = "annovarR"), base_path = "", lua = "", ends = FALSE, input.file = "input.vcf", + package = "anor"), base_path = "", lua = "", ends = FALSE, input.file = "input.vcf", out = "output.vcf", thread = 2, permissive_overlap = FALSE, debug = FALSE) { vcfanno <- vcfanno[vcfanno != ""][1] if (!file.exists(vcfanno) && !debug) { diff --git a/R/get.R b/R/get.R index 5e045fc..9916f22 100644 --- a/R/get.R +++ b/R/get.R @@ -8,7 +8,7 @@ #' @export #' @examples #' test.sqlite <- sprintf('%s/snp.test.sqlite', tempdir()) -#' test.dat <- system.file('extdata', 'demo/sqlite.dat.txt', package = 'annovarR') +#' test.dat <- system.file('extdata', 'demo/sqlite.dat.txt', package = 'anor') #' x <- sqlite.build(filename = test.dat, list(dbname = test.sqlite, #' table.name = 'snp_test')) #' sqlite.head(list(dbname = test.sqlite, table.name = 'snp_test')) @@ -48,29 +48,29 @@ mysql.head <- function(mysql.connect.params = list(host = "", dbname = "", table return(nlines) } -#' Get all annovarR supported databases +#' Get all anor supported databases #' -#' @param database.cfg Configuration file of annovarR databases infomation +#' @param database.cfg Configuration file of anor databases infomation #' @export #' @examples -#' cfg <- system.file('extdata', 'config/config.toml', package = 'annovarR') +#' cfg <- system.file('extdata', 'config/config.toml', package = 'anor') #' get.annotation.names(cfg) get.annotation.names <- function(database.cfg = system.file("extdata", "config/databases.toml", - package = "annovarR")) { + package = "anor")) { config <- configr::read.config(file = database.cfg, rcmd.parse = TRUE, glue.parse = TRUE) config <- config[names(config) != "Title"] return(unname(unlist(lapply(config, function(x) x["versions"])))) } -#' Get annovarR default databases type [sqlite, txt] +#' Get anor default databases type [sqlite, txt] #' #' @param anno.name Annotation name, eg. avsnp138, avsnp147, 1000g2015aug_all -#' @param database.cfg Configuration file of annovarR databases infomation +#' @param database.cfg Configuration file of anor databases infomation #' @export #' @examples #' get.annotation.dbtype('avsnp147') get.annotation.dbtype <- function(anno.name = "", database.cfg = system.file("extdata", - "config/databases.toml", package = "annovarR")) { + "config/databases.toml", package = "anor")) { dbtype <- tryCatch(get.cfg.value.by.name(name = anno.name, database.cfg = database.cfg, key = "default_dbtype"), error = function(e) { return("txt") @@ -86,15 +86,15 @@ get.annotation.dbtype <- function(anno.name = "", database.cfg = system.file("ex return(dbtype) } -#' Get annovarR annotation needed colnames according the anno.name +#' Get anor annotation needed colnames according the anno.name #' #' @param anno.name Annotation name, eg. avsnp138, avsnp147, 1000g2015aug_all -#' @param database.cfg Configuration file of annovarR databases infomation +#' @param database.cfg Configuration file of anor databases infomation #' @export #' @examples #' get.annotation.dbtype('avsnp147') get.annotation.needcols <- function(anno.name = "", database.cfg = system.file("extdata", - "config/databases.toml", package = "annovarR")) { + "config/databases.toml", package = "anor")) { need_cols <- get.cfg.value.by.name(anno.name, database.cfg, key = "need_cols", coincident = TRUE) return(need_cols) @@ -106,7 +106,7 @@ get.annotation.needcols <- function(anno.name = "", database.cfg = system.file(" #' @export #' @examples #' test.sqlite <- sprintf('%s/snp.test.sqlite', tempdir()) -#' test.dat <- system.file('extdata', 'demo/sqlite.dat.txt', package = 'annovarR') +#' test.dat <- system.file('extdata', 'demo/sqlite.dat.txt', package = 'anor') #' x <- sqlite.build(filename = test.dat, list(dbname = test.sqlite, #' table.name = 'snp_test')) #' sqlite.tb.colnames(list(dbname = test.sqlite, table.name = 'snp_test')) @@ -147,7 +147,7 @@ mysql.tb.colnames <- function(mysql.connect.params = list(host = "", dbname = "" #' @export #' @examples #' test.sqlite <- sprintf('%s/snp.test.sqlite', tempdir()) -#' test.dat <- system.file('extdata', 'demo/sqlite.dat.txt', package = 'annovarR') +#' test.dat <- system.file('extdata', 'demo/sqlite.dat.txt', package = 'anor') #' params <- list(dbname = test.sqlite, #' table.name = 'snp_test') #' x <- sqlite.build(filename = test.dat, params) diff --git a/R/utils.R b/R/utils.R index 52a73fb..2a33f3f 100644 --- a/R/utils.R +++ b/R/utils.R @@ -48,7 +48,7 @@ disconnect.db <- function(database = "", db.type = "sqlite") { # level name of database.cfg, `key` is the key of first level name, `coincident` # decide wheather using one value to reprenst all of version get.cfg.value.by.name <- function(name = "", database.cfg = system.file("extdata", - "config/databases.toml", package = "annovarR"), key = "", coincident = FALSE, + "config/databases.toml", package = "anor"), key = "", coincident = FALSE, extra.list = list(), rcmd.parse = TRUE, glue.parse = TRUE) { config <- configr::read.config(database.cfg, extra.list = extra.list, rcmd.parse = rcmd.parse, glue.parse = glue.parse) diff --git a/README.md b/README.md index e5116a0..d91ad9f 100644 --- a/README.md +++ b/README.md @@ -1,37 +1,37 @@ -# annovarR +# anor [![Build -Status](https://img.shields.io/circleci/project/github/JhuangLab/annovarR/master.svg)](https://circleci.com/gh/JhuangLab/annovarR/tree/master) -[![CRAN](http://www.r-pkg.org/badges/version/annovarR)](https://cran.r-project.org/package=annovarR) [![Downloads](http://cranlogs.r-pkg.org/badges/annovarR?color=brightgreen)](http://www.r-pkg.org/pkg/annovarR) [![License](https://img.shields.io/badge/license-MIT-brightgreen.svg?style=flat)](https://en.wikipedia.org/wiki/MIT_License) [![codecov](https://codecov.io/github/JhuangLab/annovarR/branch/master/graphs/badge.svg)](https://codecov.io/github/JhuangLab/annovarR) +Status](https://img.shields.io/circleci/project/github/JhuangLab/anor/master.svg)](https://circleci.com/gh/JhuangLab/anor/tree/master) +[![CRAN](http://www.r-pkg.org/badges/version/anor)](https://cran.r-project.org/package=anor) [![Downloads](http://cranlogs.r-pkg.org/badges/anor?color=brightgreen)](http://www.r-pkg.org/pkg/anor) [![License](https://img.shields.io/badge/license-MIT-brightgreen.svg?style=flat)](https://en.wikipedia.org/wiki/MIT_License) [![codecov](https://codecov.io/github/JhuangLab/anor/branch/master/graphs/badge.svg)](https://codecov.io/github/JhuangLab/anor) ## Introduction -The [annovarR](https://life2cloud.com/tools/annovarR) package provides R functions as well as database resources which offer an integrated framework to annotate genetic variants from genome and transcriptome data. The wrapper functions of annovarR unified the interface of many published annotation tools, such as [VEP](http://asia.ensembl.org/info/docs/tools/vep/index.html), [ANNOVAR](http://annovar.openbioinformatics.org/), [vcfanno](https://github.com/brentp/vcfanno) and [AnnotationDbi](http://www.bioconductor.org/packages/release/bioc/html/AnnotationDbi.html). +The [anor](https://life2cloud.com/tools/anor) package provides R functions as well as database resources which offer an integrated framework to annotate genetic variants from genome and transcriptome data. The wrapper functions of anor unified the interface of many published annotation tools, such as [VEP](http://asia.ensembl.org/info/docs/tools/vep/index.html), [ANNOVAR](http://annovar.openbioinformatics.org/), [vcfanno](https://github.com/brentp/vcfanno) and [AnnotationDbi](http://www.bioconductor.org/packages/release/bioc/html/AnnotationDbi.html). -It also simplified the use of some of the external annotation tools in R. Besides, massive published genetic variants annotation databases were integrated into annovarR. +It also simplified the use of some of the external annotation tools in R. Besides, massive published genetic variants annotation databases were integrated into anor. -The main development motivation of annovarR is to increase the supported database and facilitate the variants annotation work. There are already too many tools and databases available and the usage is quite different. annovarR will integrate these annotation tools and get the merged annotation result in R. +The main development motivation of anor is to increase the supported database and facilitate the variants annotation work. There are already too many tools and databases available and the usage is quite different. anor will integrate these annotation tools and get the merged annotation result in R. - + -annovarR will not only provides annotation functions (both internal and external) but also hope to establish a shared annotation database resources. In fact, we have made some efforts in the relevant direction that massive scattered databases can easily to be download via using [BioInstaller](https://github.com/JhuangLab/BioInstaller) R package. +anor will not only provides annotation functions (both internal and external) but also hope to establish a shared annotation database resources. In fact, we have made some efforts in the relevant direction that massive scattered databases can easily to be download via using [BioInstaller](https://github.com/JhuangLab/BioInstaller) R package. Besides, we collected total 1,285 cases public B-progenitor acute lymphoblastic leukemia (B-ALL) transcriptome data from five different published datasets and built a novel large-scale transcript level sequencing variant database. [The Genome Analysis Toolkit (GATK)](https://software.broadinstitute.org/gatk/), [VarScan2](http://massgenomics.org/varscan) and [LoFreq](http://csb5.github.io/lofreq/) be used to call variants from the RNA-seq data (Database called BRVar). This work can help us to screen candidate systematic sequencing bias and evaluate variant calling trait from B-ALL RNA-seq. - + If you want to download the 1,285 RNA-seq variants frequency database, you need click [here](http://bioinfo.rjh.com.cn/labs/jhuang/contact.php) and send us a short application message (Whether it is for commercial use?). If the application is applied, we will reply you within 24 hours with a download required license code. ```r # Download BRVar database # You must input the applied license code -library(annovarR) +library(anor) download.database("db_annovar_brvar", "/path/annovar.dir", license = "licence_code") ``` ## Requirements -annovarR annotation system: +anor annotation system: - [R](https://cran.r-project.org/) >= 3.3.0 - [perl](http://strawberryperl.com/) @@ -56,13 +56,13 @@ vcfanno annotationo system ### Core softwares ``` r -# CRAN to install annovarR (The R package BioInstaller will be installed) +# CRAN to install anor (The R package BioInstaller will be installed) setRepositories(ind=1:2) -install.packages('annovarR') +install.packages('anor') -# Github to install annovarR (The R package BioInstaller will be installed) +# Github to install anor (The R package BioInstaller will be installed) # install.packages("devtools") -devtools::install_github("JhuangLab/annovarR") +devtools::install_github("JhuangLab/anor") # Set needed directory annovar.dir <- "/opt/bin/annovar" @@ -81,9 +81,9 @@ install.bioinfo('vcfanno', vcfanno.dir) ### Annotation Database ``` r -# Use download.database to download databases supported by annovarR and ANNOVAR +# Use download.database to download databases supported by anor and ANNOVAR # Some of examples as shown as below -library(annovarR) +library(anor) download.database('db_annovar_refgene', database.dir = database.dir, buildver = "hg19") download.database('db_ucsc_cytoband', database.dir = database.dir, buildver = "hg19") download.database('db_annovar_avsnp147', database.dir = database.dir, buildver = "hg19") @@ -91,7 +91,7 @@ download.database('db_annovar_avsnp147', database.dir = database.dir, buildver = download.database(c("db_annovar_refgene", "db_ucsc_cytoband"), database.dir = database.dir, buildver = "hg19") -# All annovarR supported big annotation database required SQLite format +# All anor supported big annotation database required SQLite format download.database('db_annovar_avsnp147_sqlite', database.dir = database.dir, buildver = "hg19") ``` @@ -105,10 +105,10 @@ download.database('db_annovar_avsnp147_sqlite', database.dir = database.dir, bui ## Basic Usage ```r -# View the vignettes in annovarR package -browseVignettes("annovarR") +# View the vignettes in anor package +browseVignettes("anor") -# Get all annovarR supported annotation name +# Get all anor supported annotation name get.annotation.names() # Get annotation name needed download.name and @@ -122,7 +122,7 @@ download.database(download.name = download.name, show.all.versions = TRUE) download.database(download.name = download.name, version = "avsnp147", buildver = "hg19", database.dir = database.dir) -# Annotate variants from avsnp147 database use annovarR +# Annotate variants from avsnp147 database use anor library(data.table) chr <- c("chr1", "chr2", "chr1") start <- c("10020", "10020", "10020") @@ -136,7 +136,7 @@ x <- annotation(dat = dat, anno.name = "avsnp147", database.dir = database.dir) x <- annotation.merge(dat = dat, anno.names = c("cosmic81", "avsnp147"), database.dir = database.dir) # Database configuration file -database.cfg <- system.file('extdata', 'config/databases.toml', package = "annovarR") +database.cfg <- system.file('extdata', 'config/databases.toml', package = "anor") # Get anno.name needed input cols get.annotation.needcols('avsnp147') @@ -155,9 +155,9 @@ x <- annotation(dat, anno.name = "perl_annovar_refGene", annovar.dir = annovar.d x <- annotation(input.file = tmpfn, anno.name = "perl_annovar_refGene", annovar.dir = annovar.dir, database.dir = database.dir) -# Annotate avinput format R data using annovarR and ANNOVAR +# Annotate avinput format R data using anor and ANNOVAR # It will return a list contatin two data.table object that -# one is annovarR annotation system and the another is ANNOVAR output +# one is anor annotation system and the another is ANNOVAR output x <-annotation.merge(dat = dat, anno.names = c('avsnp147', 'perl_annovar_refGene'), annovar.dir = annovar.dir, database.dir = database.dir) x <- annotation.merge(dat = dat, anno.names = c('avsnp147', '1000g2015aug_all', @@ -168,7 +168,7 @@ x <- annotation.merge(dat = dat, anno.names = c('avsnp147', '1000g2015aug_all', 'perl_annovar_merge'), annovar.anno.names = c('refGene', 'ensGene'), annovar.dir = annovar.dir, database.dir = database.dir) # Annotate VCF file using ANNOVAR -test.vcf.raw <- system.file("extdata", "demo/example.vcf", package = "annovarR") +test.vcf.raw <- system.file("extdata", "demo/example.vcf", package = "anor") test.vcf <- tempfile() file.copy(test.vcf.raw, test.vcf) x <- annotation(anno.name = "perl_annovar_ensGene", input.file = test.vcf, @@ -236,17 +236,9 @@ bioshiny_start ``` -## Docker - -You can use the annovarR in Docker. - -```bash -docker run -it -v /tmp/db:/tmp/db -v /tmp/input:/tmp/input -v /home/user/.annovarR:/home/opencpu/.annovarR -p 80:80 bioinstaller/annovarr -``` - ## How to contribute? -Please fork the [GitHub annovarR repository](https://github.com/JhuangLab/annovarR), modify it, and submit a pull request to us. +Please fork the [GitHub anor repository](https://github.com/JhuangLab/anor), modify it, and submit a pull request to us. ## Maintainer diff --git a/_pkgdown.yml b/_pkgdown.yml index e5eca58..5044d87 100644 --- a/_pkgdown.yml +++ b/_pkgdown.yml @@ -10,17 +10,17 @@ navbar: type: default left: - text: Get started - href: articles/introduction_to_annovarR.html + href: articles/introduction_to_anor.html - text: Reference href: reference/index.html - text: Articles menu: - - text: Database in annovarR - href: articles/database_in_annovarR.html - - text: Shiny app of annovarR - href: articles/shiny_of_annovarR.html + - text: Database in anor + href: articles/database_in_anor.html + - text: Shiny app of anor + href: articles/shiny_of_anor.html - text: News href: news/index.html right: - icon: fa-github fa-lg - href: https://github.com/JhuangLab/annovarR + href: https://github.com/JhuangLab/anor diff --git a/annovarR.Rproj b/anor.Rproj similarity index 100% rename from annovarR.Rproj rename to anor.Rproj diff --git a/docs/404.html b/docs/404.html new file mode 100644 index 0000000..a46a1d9 --- /dev/null +++ b/docs/404.html @@ -0,0 +1,133 @@ + + + + + + + + +Page not found (404) • anor + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + +
+ +
+
+ + +Content not found. Please use links in the navbar. + +
+ + + +
+ + + +
+
+

anor was developed by Jianfeng.

+
+ +
+

Developed by Jianfeng Li.

+

Site built by pkgdown.

+
+ +
+
+ + + + + + + + diff --git a/docs/LICENSE-text.html b/docs/LICENSE-text.html new file mode 100644 index 0000000..c425601 --- /dev/null +++ b/docs/LICENSE-text.html @@ -0,0 +1,135 @@ + + + + + + + + +License • anor + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + +
+ +
+
+ + +
YEAR: 2017
+COPYRIGHT HOLDER: Li Jianfeng
+
+ +
+ + + +
+ + + +
+
+

anor was developed by Jianfeng.

+
+ +
+

Developed by Jianfeng Li.

+

Site built by pkgdown.

+
+ +
+
+ + + + + + + + diff --git a/docs/apple-touch-icon-120x120.png b/docs/apple-touch-icon-120x120.png new file mode 100644 index 0000000000000000000000000000000000000000..5b491cdd6d13c82500c8deb674f1fc36f6bc0f86 GIT binary patch literal 15975 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 Q-(LYxkWrPcl`;?cKUL!fX8-^I literal 0 HcmV?d00001 diff --git a/docs/apple-touch-icon-152x152.png b/docs/apple-touch-icon-152x152.png new file mode 100644 index 0000000000000000000000000000000000000000..c61da391ad99e98b72ef18902acf2abf14df34c7 GIT binary patch literal 22281 zcmW)n1yCGK6NV2bI0Scx;1=A2LvVL@cMpdN<|GvnG&|ktqN-AgrZzJ(l0sv@ALVYnq zfF4s?$fIlA=60(ILoXnjE6Pd%-v9d) z{;WuaodQI_OIkXtsQGmhxeL1ckBA+j*W zfxR#@*d` z1?W@g&3(}m?Z?8AEyw`hhw_4VfnA7*$pwbX9xy-n1)~BVOyn#4T|TcFzL&seaa&?e zbr3XmEjxkV0A~y*OvG4PUj;`o#tF^@UI3>oG35{yBgpEJjM0S&2$k}FBZ|WH;y<97 zgL!liG-1YXVNf^#SMd+zNv6{u0F{7q*sXY1z9&%YEV(M0c0M>Jma^I)qyRCP{D(rG zIWVj;NXUE(p2e;vvJi3K9zr>nonNJzPYSmhPQCw(z|*x|zxax~n$$A8g^(MGlmWhB zd&AceO|S6g;Nn4>W4I7D^xcWz?_n;|0OhE@;(^IW9psx@+=_3-b$KVZt#NKae+(`!8!3jwPyO%aiZ$ zOK-HWw3H04IG)#K3;W*U!I+y_;yIx#$nb@gO$=&o^?a~hNL0%~lL+whf&Gr=auOV$ zmGHIGc65?Oc=$1>nKM7CW$pXfEPG3DXElGrb%$Hxpb$_;oVr%-ZQbnnh$hOct+ zW8M3epr!9VQ(&9s+;2ZH$(M8+sTacdmV=;id4AgXT|BtGVKJ#fkWw_VNwH#KNnoQ9| zScH3QsJ`2ttrg!K9#OJ3Sg2MHHXri^aDfThPOI=H4|(q3=`rEbjcq~ax$1Q~LvThJF5Hnm)v!R7`y@+D!x!;l*%$51vJ>$^5%O9%t6u8*O*7}7 z1TpTk_GY*r(^t^JtsLt?_<~#a+1>GG=}4nOXYrxhyi`~q|FTwEGw1b-1uLmXx_Z)& zkICLnUh`=TV-^$6C%R5W3V!Codp6B;)08lYAF}eRG_~k7rGBOE5#dVNsmyBH1KO6P z`?o6p_}9BsgO`fWw=sHAG9BOfmI+0|CX?RaE_^^1zchr-b?(;iW=;Q88O1CTk0G$X zBV;}+en*Sxd3T6@A)G$0gHM13exwhj#+cP=H{Wncj6A~Voarz?XEu)vA;YpEmlhwU z{AXm$zd1=+R9#R1Nda40m0~pxV)siPE7?hnP&uXjS<`9G+389c6PzGr)CXwm4+}$F zdzcc1Ab_IWE_*jGk$k!`56O>WtvUFB`hffd?%(fd1pHqaf$U;%m&USl*|PiaY^2HM zf{i9UM2_Lk2FITCsc=iuxHkV7?%d>%|B zjbPM^dwv~JH-&6|`8#2$;0Wtmj_LH^VgPoGt4SZ!2vGn`=?WVrY+b3=P9Cw;A$d?@ zYKgr;FmDuL$wEsyvUvOvgZ4n#ThTaS>IkQ`K#FH%7^cG_R0+=pFByiie{sUr0XFqj{+ z9Alj2EtkOBMXO1p$86=n-AlIlXLF+{s&NfOr3TdWhnP1T4eYniuycunfLvmeXM?%$ zN_2@mN?w0DW$9p?LqExml52d3noe<$x3tuiMk-hIko8aEs3nDO09iNSc>fpvL}T4R z#zZS%Du8d~yheX$1WFuIl> z!lpI&F)n6;)}m&IikvBabBi&!4S+i!Se-gjFaMgy{`1DWSjheHVeO@GS(BB)Fl{d1 z2j?nU+p2jS09jZ25BP?v3+3i2sr-1|X@VI@yk@tR)zs9H&L5Tm8IHJW`J@ye`IJ;x z-L?=pFDp02s&B4R!?aVtYWtcdaMTZCPjeg5M)W_7rWH1ugw@Qb79)KFMx(xKi??n1 zUVb%&40lS27HYz1_?wB>$|nolc)EfJ$~gE~TaxWJ@`kF96~Ma7({?~V@Va&zzPCfT z%>#ywy~KzYFAGJ;FiNrK<>Lj<@(*TEk;1o>##eRlE&I_`6%W(mE^X4?MmLd3PC27! zCckxh5sAvV<0lvgCxfNsL5{*XzQ37IQO}A&VILnQ?bN0E;?Cw|mS*>#P)7QG-v-?I zR^vO+)GXKQli1ZhZJ5?M#r}X%x1$9TwW&=<#~q;J)c78EHY#Sr783QJVncj@HoK+E zzrd`1$ZQRd#<`k(wRdYl_0$^dLO@00eo~#X)bFs*AvqG;=v+vYr%cJ8qiq>F++E8h z{miF+M#1qoj6Q^i#}F;+HA$sxJcJ)!)ES6<4j&%_lI+=R0f&~O_!}Whpf>HbvcJ|5 zRB0*LM|^{}TrS#rt<|zXX)mVZLXaqpdj+y=$cU^_K;7$eQgGUd_c`K&7G!qM2K?~4 zt>qzqh4E__q7<=t_7h72UM&R90cR~Qhn0!iFL$v&=JqoJGr!OsI{*68*2?dHq8iDc zMwxaEFLGSlqJHw<`M|pTJ~)>DUZ+MlRh2Nlk3v{d_z%X~75kZ%Mg$%$&Xt22mLSBv z>}`-r9s7y>+tcgEHN#*7`WzLKZJN%8H+$14@o%Fa7YZ&3C;Z|Mf<~`ID^937x;sAs zl5+l$Yzh4!F}9aw;rViqO?6$zq3 z%bzfhZ0eouC)eA}P^e2S4hAO%=QlYZJ5XubhW|2WzDisH(>!Mo({!-%kT(}m*<1ZDzP?8~>}1$Ez|v7x7rNPuMoCx*@!sQFA28VsA^?ih zDmNP)S59Ka;HslO{)ER2x*){ z>9QyqAh50u+*xF*0e+=_Ev+b~dxXgV=n(Ize@|GuLDZ_|z#Y!`={OZWy34f^m zE(W2MKy|d$Jgqn1p7W62SK;gQLPhHL>(_s7k}0uwBHTbQ$JD}4iCC4$wPd?P$7#(b zoL!F@Z}885_l?*IOEmR_b{Ht*E~=;U zFx+INybL=g)krFRmo(_Tw-8j4)32Q;Byage__ERdBR6Hj6ya!u8-_z^G!i8u0hfSM z1=x<%6n61Dg|7H%s+<1a^WXN_3?SytzZMtQn13w+c?0TZQ53@wWWgb4fPEac(`*0T z!1bHtp?}$gJ9GbF`3$}AmciTbZx1Xj%5cx=F?0!oa6g*6ztf^~@Pz&FP z!?*;nFH*-W!j@QPIvror*4`Ud!Q}e|{x%y&t<~pKoMiITEajVM@33qlOI|(CQ2%H9 zcl{m9(d$aBOwdFX#)}|bk<9L+l42(d2aCN8UQ9m@jOWKjC9l4bzlocj;OR`rznO3r zSCR`E$m?)pQNWjCqt@gC^{AXZ;5%%6ClwXK8T?i__JD}FF0?!VQq7k=xw_Ltm(k3ZD! zJ$P~>7h3B$ayhGgx%)P|ZSUi3@0~-^dqo3wgj0;jgz-cB>=S<$%!}uii1rB) zXpRr1-u2jP`6mYspE-k4{CT$OA_q!w%&yl%F3Rg{8AsP*3&7nzH+ zy2yf`Okb!pENl6v+#%QPJqHgLJ0oy4z}M+s28!6UzmA_u;|zOXFNXMeE-dt13W5MO z1wnCfjk9dg|6i#G*7Q`$dZM(+Y$$$WBpcXj`#{VMNd{w5RgBeW%F!4@ zMa_H1lbmOpTUHCVb)-l&5Rx0gSGsn@#6YU(Wx``adTIan0>SV6@O?HDHY|^h;hY&6 zTJ}`6h`)S|SJw{NuHwgB&7vi}L!ke!!R_E4E-?+vH%fmt&o@(p}QCmKVeKX&z3Yvq*+H)pPG$hYJ67!^@gWjbBKfJAs z3U4l6p73s4AMuL7>BIbI2S+FwECD7vh3>c~pH;%bDInG=y&N@ql! zmiN*NG5VlyGrV0+6VN$fik4sXU9J9f+8=;1)n@d1e%KSshcFd!u zsw-jFqDV+vX{#2Y70c}DL0%@-uhE-`Bp62QnKRc&#~OW!GkOwR42Bkfk%)%gHdCSc zkW0v-MJH0sHt-~vtFQD$1!D&Q?2k!sF4}CA0%A)*Rs3mkUkZX{X+s)JQzxMcmP&LI z^5gH21NR7I0&u5uSP}f?e%^Hy)h@qZ{fBLR%{K>S0d0h^I47&KFvnW0A|hh#Z1T4D zI4>*V)3zF0S*L8X)S9U0F7HnEfHCvE0H$fxmOdXv`W%-{uba*scDHtI8)rp2=o9(5=EJO@RU(8G&8F9jw`{p)? z3n|jS=hmapNe;S2{L-}~GoLde2jKeU#}7AQzD)B+ihK7=A5>L7*_RghWqF(~L6G6z zS$fcZp#+b(xi96i+v7Glp|a!TA1R~z>A3hod&H>4LADu<#Z+C6jEv))Gw}L*P)Y{k zD;?GtZuJzMaw!C^n}DGUT;)X=yJCawx)Q}22L2g-Ds<`b9*RokG++gz^wRs2fBFih zFqjR^TXfq+tlppDQrMsqHsY}4&gS&t%;neb2_CQ+VkQ7l@VEs1-r4V(4ovMg<#Gu`pw1=n;1KCQmkI*r(Kr~H|aY1 zlIo3fnOqCOtcOdIa2be9dxd2{*XZWXvLBD9+Lk7sx2lQ0iHSIeoEn-)cLokZh4Qn$ zkSB{9Z5h^`&=xjLW|U(5P6KH$d>!J2gyHg@j@y=vr1T8UldGsl7B8pxt%%f)Voa!t zd2hLZn^5-o{UkKtTlTNSi!;Y&R7u1{v5X*8{O4tY4q<2z{#Fj$m+Y!S?i;Dt>dY_cA%VEX!Y>6@UUnN8{>6@L5{TveJ4IF;k? zO4%89&+uMkm7pQvG^o3{P}@o0ZnJacICL zMRArR|0Y=ThTYZ%4IjoT)(PnHGrd;stC>MBe_-StpQ}cX7)r$>MTR&LJmnugH3>o9RC#J`ll@ugrPoQY*wB$3s+ z3Sn~+do8*POsWFT-t+sjb4rvfMwQ5k63dS}E7N#EZDa~dC2HdvrgOANRyvLp$;BWP zTH{u9?js6ZKD))?{^C}7VEK>K?T<(58PkvOZiSRR4;@{&Uoft(`63D`YeATw9SIX5 zAnyPzvtG#c@1JzMhYs=aM7+-e&g_F^H89T(RFl9{6yN-W6c3!+u73PRfkQW=Z;>@m zTxd3Ek!||T0jbqaLro(r28io7hs*g`QZS0Q0>--J7TfCAqwM+BZ;=e{8cp9C{nmkS z3LQ@h2j0$M76U{xB3%Pbh_3ugRezNk7xnYINK*|ISEWK3{ zX+GrsAXM)4KC><)M?C$rIzF3sWXDhVYXL+>9_(lnvss3iK)Ji9kg*gwHUsO({vh1# zw5EgJ*+T5vjfcH@`{9IpI)C{1+Ln9QmwUHH(W(A;(iJ*{iCo#`S_G4GbeuvWl(Eca zM=~_R@rHr^Y_qu9j;UD_?q4?wClL%fIor-l+Hdv30>-Bi5j9ICG06?PRQ5fPmCLTz z%USsmYGS0=@OrOOEd&zulyee~&{FP2k8;$Gfo=*-o7bpKdW0KAD-QcwlT3Q7Xa|Me zmOep-A_v#okUp(WGup9_^y$`wuJ&|8lA9+|>j;FC#NoQgtkq3kv)3@w&0EHbf1iOyC^uGUvm41&46N2V+$@VL zsC)Zyf3L%%Ff4s%GGJ%7_4n1j=tb@VR=c?L!Oy)GpCLmP$GwM^2@Ndmx}5|+XA>{` zbIZ1PjW&<9i6@1<0`kv^KV>ZWiY4C%t$h|{s^UfPAOuBMQZjLfXk;Ndg{f}|p8*bw z6OOWeh3>KL1I<-(2|MI6m?k9L{cUxk`!%9~x>$HSP{>?aXkEbiy{ z$e%?io-m+`I!KQFl)Bm$O*7wpP1n~@uZy&QouGYXI){k3aLvzwYue=cae2W@0? zu;+h5g6NO0_7x(vTfHklk^7Zb|BS-aFQyd@v>OO$0Sh~!ev#_jcY@ZTSB)Vj9 z**C}0%oI#L(W^_NZ9kZukK0$^o`h44*6z5`2pBik4Rh1S8g3q@ z_7E%{Mp++k__0^2z#Kab{j)ERdvrJzOd|hC&Skht^hwMvUckEURLx9KWrIsZ8Y8&Q zKEU{b*1;$U#~vW7#TP$h!u0{s$b(&?b)l`5NhOhBFJSE`OJVXrgvX*;9D||Upc6L< zI(-!xLvcpNBzThK=wl`0FaNELmZ7X*l9b2(s=_M(8L#4$FCC(X5#_gZjVHN$x*8u~ z344>SoJ|kG967$uD2vl6P(*J~d^OM#uDcvsSKJrA&JA=km96?F2h#wZfw;`k3V>FL zls5TY%V}My$3GL7w784fJesXOWI6WKKg7(=3Dy+H+VGITgmgm@MNPd-kteV_@0A+Pfbt{CG`DpI(OT z2zp;N%O;voH4Ca$tDbm5+kBiNS;zLZZN)xp9@t4Q&o}(RT zEKhCryjT+A3&A~!nM$E`0dmZh`Xgs>>o`q$(i&zm^Qm^jA=QZ08)XVoEPlAs(n-4W zem46BSp&6$%PAaM7e5*{pUGD1>Z@kY<9^OosNi-TQ!gF{nm)Sk29+-!KB@}gFliO+ zbJZwJIJobX!%|^+v0z3pVjo>Am&j^1nuNPgf5F~?+V&*p!`k2BB24UlUh{ZU0J z5avHx-Ka9JjZy;>0TdX{{cCjZQ5GkMx29$v*JW6q6vllWBC%u%_0xO#9o`mu!#ADL z`_kcIEqDa#my8(xD!|0u5;Z=C4UhI5W;wd-y{8r5}-*7jX{9M%)iKa8+wc)g|Cw|KE{gYw}Z|S*<7o zyJ`?3ipObXP3)Z^qxz4A=kUuYJpIXK$#G4Sc1x`S$0JGj0FtSq#>=P^7uR|iuI8qD zPh*+4$MRTpE3N~ckpccj9eH&$R)2L&PN%fQ%HOGf`ukjv_a5UMFGh4Dl52~$AHp-K zbv!WBDrdjy4V5R8Vv>xzHz4#WNRO^wW&@Ib8zQ4gnKynxE^eZ8?tuAi87}N|?f>b7VkG0xtC^FBwZQQhc zPSZFs?fC_xDkLJ5S#MRVPr^#LhsPggNjB?md9&5=b0#V!%lnvn@^cW8G7rs}E;_#| zs$NW&$&C9?2IcI$^XfHzPSNj48@I&nx2B1?3<2wAH;pn*kD&aRrXj$wyELW#s6>T5 zRJsnsU?uXimUIeaLj9c{97)3W^BgH9!GmuT?#U!&u{^=Rtwi2Q5;WSuKi&R^-sH%J zI&@c#AX93N35>a*&|4K4J_RvJmv6O=%_UexcV-{m-y z{MY9ST6DGAanpeDMAcGv-Hd4cmVv1uy(!=jy=9--v(hAWdwHu8FEnE2{bzzM(D$v8 zRa4Qhk0F0=l&sR*+SB{6QO$D-(L!7@b*gUK@c%H?~gxSIdQ@+ zipf!!)@qFR#XXJqxqi)=w}`La-On?jL#d~U z%Qx#;;u!aG1kPbZ9%%zHbk!ejK8l-jt*-viar`TGMRzbNs3x-WHl4;u=}M zVa>YhTkwZkql#Lun13-vChTgs6RU)-+=l78kH9P*?l9ICZQYB#H^4o0SX$>lDMpP_ z&6K_umHKuYYthFRc|&S`ClM>}#)vvH5Vjj}8P6#t(HPro-gF5@=6tK)g)qzcnHx$C zM0STO7->P{KZYPf@B(*w*Bqgt9BZC-Uu(z^PZvOn$_1-lf_CMja4s!d{8u&YIS28d z$|sm(ks4)1$@3(A_n%Ud}uH3l+U+cz7FI-l;V7#{3reQ z#9osgjq0Cz%;VTVDSExpm-?DXRVO<%2R;v=`oG}l=xZylue0E^_%gMqj3AGiq-eeW#m6P~!^A!2&AzicC`0)Ku!}=U zV0D&Ib_176_NPAY(sBLUGb_2s(geDLT`mL84Nx2y(UlRpK#9uvFEG6R=MQ*6SFaksNegCmIAJ-FgS2pOsCf)z+jtH zhQ?L(0|QD`)X)rU>{{%_klR40w8*&_Hw!;n@L>C4TdE5c7#>TZc@4(@X^!ZJ39v3V z?Cl?Fd!#PR_`sPftd2VA+2>RRp>eR-A zrh0V$ClHy<`Me+}uw|5lP7XR=8RA)TWw z*`t&}uisV0WUcmL(Rzr#KSj##xyj+xYM~)Y`|Op@j~bQNjc!L178*9NQLy4Z8<vlJm-)GR;m;?9D{AgqFYqH%Rhq0pdRW^jsC9J)X0X<28E=`rS(C^*1@Cd??19>OVdP^d;3kkO)wB0HDYaS2y z%Y7EU&mMeEfk&?W9iIk4qt@0PYBNd``Q$q0F2xED?9ue{_ww8Fse`lK1r;2%HC=90 zHzVpG9an?3mu|Xt{*xEENHpt(IVx;b1ZzS%l=%Zrh;!@xkYdvw28?YzN8V~bNX8A^ zAsAbhcn6QD-nA{s*>qkHtufAu0|tLR!-dVO_jq<$n_xZvFtbM=sq-6OXbmRL(9%i> zBJIg4`h)P}shcCu1Ohb^8#qq0Ljtr}tAaP(+$Y0@uzp%x!q2brL`K~3`n>Ku=A;R> zE5z6B4EkIcgm5e`{~Iq?pe`L3GB{G!2bES+ysW!i2>4V@;OaZyKBii)t?b2x5t_m$xrk$#gtFE+`)KiN=^0xXT2|WEew=Zy+qeUyS{@ zkT*SNlxY{;qtuhYW%M8bJjK8s^8R*$mxR!f3f|0vK_#tSuv^N+I^88|^qQ`!)U*ZFdF|H4`^VbX>#Rn+2E(*Ba2B_VZK0{9-eHKy{3psO$Xmk}s|cx`B!;vENpHUK z*GlHPPA+chB50PkHBKve+t@2d4q3P6?xRNqMg#A0&5;IgXblPP8J7siAI%t%P(ka+ zu#v!T#|(wDV*Gy0MN2+2*JY8eyXN{v&$Q}KZqB$y1D?z4dW3qK^U5YYo8NuTFS)(4 zL}69W&JWH1?!whg9}9S8orRt<$p+{nIl`|`!{zj~eS4peI@^3k&&7T2+TUTV3AAdO zZVy!{@Uen7rb9RpHBe_hMWz*M$vc4!4CZAv7shnNX_F1$r4@0= zJkmS?z(6%WP|o?Xb$?e_+DpRIdk2nEcpJqzmMf)jX;I=jU?OS^kl zx+3=Hm*p1#G43+VtLIn*dlY_vnSDLnAQ6#kLKo^aK1Msu`bKsAZN zZd+U@{*0iAMip&m@6~>1{0u=M&xVxcAJRy_Q2_y+V<&MwX(zWIjbtjJlycamjvji# zsWCY{$ej-gvRPwX-pH$TAtS?#*l4ckk~&uQeX1K9l{#Y*&Z9wHdC!Z~f4Duq;==~4 zg*8w^L1;1_|9m{ZI;O=%=(GHyKb>`>$EMCF&4=ISlOyjNMYC|{-KQWJseR&QlB18X z20d!OEnT0{Zbm69{@Qyng`|c2^njCpj`iYfg!=Ca8;{7sKBf9eWJlPsc+N_#f7x{I zX}9M75uMkq^)a{HgALN~4nrEFzV8Gb9iF0o>wDADvr~M2;Br_$kH>$UTB~XoSyKU| z4pJ}cM~K{YEHrvwMAYwe;FQ~_+wp`Gc}ZCmX9tjpbl2Xrmx#X zFfUh`k@G6xYgQ@=sRKZkCO`(Ui`|jKZlQl-w2FEqPuD2(h$B9_b~;vWrVZoo5!cTQ zZTAq#7_*)^)P6SlC4~gA0;M@JxbEAi)901jcAr}KK(``kUm~-m`pcM$@Fw9L_sFjH zKN?VCCZ=~-(t@tcOG7S}eF*MDtG*{i`e=DZ&F#uW+k5T*erJ+ z*i??+)1%Zd!i);22GhSi1oS993&5ohA^sFLD&NyguJvL#GhR#RRNw)b!|aSW?Nhq2bATXRoTMMrcZS?UpX9K&+; z;}A(nBqG98JudWF$z~?xvg8sa>X))zj|vnEtA4|GrWl&ZPc9lHI50qV-E+k-VN)rp z-xbtKO4=8Ubns`cDoyt*b@(~rpOAaxKR#wn!cw=E;RD-WRqatpMP?aySQF{)V_gZ# z^P#X<8OG{z1X9M|`P^Q)!Rg^x%4=OBN!lV;o0rV3+c;HkETiBe9jJ;7AOyD%Xxwlr zc(hgC(v_=d=T2KWwL{fceR821>7))+uDe`~93(I(;5LWtH;+irtQ9e$@cY^)7H*cVRlY^F&6}i#W+P+hzdk zH<0}G8ckfJKP~rqKg~TdSC_`SdL=t@bMeedJnzRY?MAi3{t{XOO#>Eye=*7ZdFN0n ztXOlAkj@(i{DU-h<;d=PqB;Mk*i+I_O)C5k=xQVae_PkN;zTUdm10&1wG8+dnv~6Z z9NjV>cnexOgur$y!KGC^r5u(Xi6U#zE_R2oEu5J32)RyWM4sY@)K&Wfa4a+df)^+2 z7^INnQv;I9x3+?5C(h9T(NF(U0kXtY6#QC;qdP3yB0tIq@0ETUmL7Loy@PD?i_g1x z&l(~FgNr6EWfqC}IHHcvKik(7d>9npV>;yq<&FV9!5aL&#&ePLFK1gA0+~gL;_q$} zFE?0Nc%>P-;dDf4`rFUOu=R=ksHS%BGb#^Q@$GwlD*di$J@N^BQ`Zeyk*JB$5~{eU z=?c8e={(I4+Ny~QHF&eApD6MlhZ2Bt6wyAzeCMUub;jFE3xR|6jM>?ahXaKinfnh>^fM1~dj zbU{X0*u7KTYzsi^m_?o@aI^su?VUbSdz?eX5i_N>L*c3KScB5bFSU(iVz;+;B>sms zoMO%wurDF|$Nj4jI_xf@C7m5w%P5?5KOffp*NWr77tgT0>B@zztG?pleiNt|$aT3q z`{?{-f&Ad9y86wq#W;xKgQuQq`eNWGubSVnLc5l#*qVdT__^AV$HZ18)9%zW3;!sx zhS^+eqf5YP2vUxf{Dj!x-oUNPSGCEu)`#u55~T_7epJIcC-@|P60(_FG}-#ykr*QE zOIj+pevR?5bZ5o6j0bP`xaX}%d4^N*(PbhFT=XG^>1u;#E&md|%Y&{dr8Y%I_i zxa2t<$7z#JSl$RC;6p3tJ(U^6L6A4{aqRvN=*6X&JSe&DUU}yImwzMrhl2s}as(FbC^7AT+LsEs zVuy^n?&h|1Re>c>)=3v5`|ASKnNh)|)>g00U>QY_5HQESMzO%DBOCtI+SS!tS@tQ; z;rdT$4z$?){%CJjt%%4rk(@zoeh+L_Lu(9!zgeTgsJApu7c6tv#DtnOZ!QO8vI z;seM*eMPebPr^EKIiEudeob}kakc4})<$O7mo9!Os{?ZuE<})XY5~6?y%9ec)~Gqe zjOz-EeF~68Qx2-TnR=DEPKSxq@)XEow~)xQN1x#^VHPRMxjp%76ot{6S!zS;2GP( z=$^02Nl1%NmazjFW#^Ao`Hf&fn=lg_SHE!!PoJ;(!$E6`6HPKsbeN8V$MfdzkO1sQ z#tT=6Q|9<&*$_vIp!ep_{Vyy9I|86Q9iUKc+qTqgP%!;9f`e0!v61qD!$SVVWeJ4i zi5#(qbIK2JpIq>JoZ5H{EF{+X^u)H1%HOuKZso7Eu7>mD=WP7T&0_m1;lTy~mFZ~w zQ4cEiRfEC^>|2aER=INnWF9_?2YC@Ow`WYI_hG@;30*&`&--qD2{}h1M=(T)Z&B+w z37}6X@E~4+y5h6^BF_LR{}!nko9p6S^( ziAuWmx!xu$(-$cgQ^$e&VZ{h3`iOk-zO2u$^$7NQa>TGWAQ=`daC^A5X7SSlnSKql z6(?cD3*%)WVuiVVz-y9Pro^D`xvP!g+-;M1sF)z+bFkjTszTF>+H;>$ZxA)(Yu+<$INgZYGtUMWjM$1MrhDoS9!#N zyyJeZHzk^qHk=Mbuxh8`f!5TAs7d3a4UdOJo|$Mx*g#eAR5MA?eX}f4;XKa4Gk>o~ zK;t+6^5%YFfj1XW8mDoODzUD1n*b$=^o}?#;(Bw}VBT;9EA{W{I+inazIyxPAtD$= zC`OE0CU#5q^bnP+4x?dPKK$6B8mnPJWSZ1HxOWqH3X(7BS`17NsRQzyD<=}&d!5E) z{mk}X#+oS((eo2Eat^ z?z!Fck=0dQelcX+O;4;IuluL%Vo@z`Xv94zmySqB*yN1vDhsVE{u_0(cEB+k2}o@u z1y?jqk=vQagjsxZS`#U=iPyv~JFmb-*2E?A$fNvPEg1n~62dT|af_jUTQKH3a5Is$ zA9ov4i|y1oNEzLN72yj}OPbGuAvR~V7o`94DZjRrDm!5;Te&>PSIJATx_Hl4%2VhA z`S*{CWVm1Nxbb5<8$KVqkp~uHv#WBcjBv-J3L@SSHvRhq>xKKZ>VP|GGVjEFMtR96 zfjM}EVzkOphhZ67Jy0d zu$Y>iTB|fCB)Ci3;^#0$aSii#+C4Bb{?_OE#Xu)59GNr1 zdV{}_0?#03pcs5U>I?sc5NM23Adg(f@t=`j2CG%)TWCpK3AE_POHn)OMHMU=L z_~l4*-tF=g;qw^{e&%KsGuKyU^Y<5OjXfG)Jqa3-xzibDP%%@Sj49ri`9BtQHdB3G zhbY`fI>P)yQT%~hZdzmmRSV#zE`&`{UQf@!%7TUsuT{VnP$ONHQc72~OsclIxlfie zGsn1|FHq|<0LrF=#ku=@ru6BW9Ux}8m&PDYe-CJ~Nssl(u-z=-8Nc^0I7?`5mFPir zo`hAGzfQc~M^Hh2l@ypWb&zE%H~L9tc2E1wM7d)eEvs4#K}_s zX-bjYmK8uT>W2kzk=VE5(T3;z$iGhiFJ_%k{j$P;>yJ{|SG2fe$6YK~ zLK=&)L;PprQwSbt$Tg)AArOUtNCgy=1QU!%K>EfB5j3US^E=<*6@1z0S~|Y6FM(=$ z7*}RCs`oGaM~`lhwg5htD_k&=avp}O`kplZUT3TZ(Rnn{UCia+J2_beVu&nk1MHj1 zR3SS|eoQJc4n@GLYt_ST(?H)_#1i=8#r~8Y;+?zr4aF4+L+Q~umnq;be>w+o6zR#{ zWXtEGBBUQa|EX10c%S)Mc`7jmyq3QVljABd)!NN6D&{eR_O}&7w?9!$w{-3uZMc{9 z0B8lN0%fvG7ka@R{IfhhhiP9Icr=6pJrBCaN>ZZXq*{9WqtnjutEEdxeBe7#l9xyC z-xa`nJZh6LU-KQib%r*EH1CtJGM+HD&2}KXFYAR-C)$Xe#Z-U<`h_G!CBz4&U|?i2 z80jAS^%L9KttBLmbAj&W;(j)KD94Auj}Imydy#GNztQ>s zfjxHjEI>}6{&^#s(jPEv^>f;kjsE$oYDK6Wq}`(I2r z6`O>jcEC{B$l$GxQ~4H8CJsA7CumoX3+Lqm2kg4v;I;8 zV0!bT#XeWoAauU0oAHy1*>E?u{Fr=ub_l+S*+J@i@j4R~aB!PAF5smOs5@56eY{}E z=Ug%QX=Q%4&R|VmQvC%a8`s5RAQRc1r?0!E=g^iP?=YPoLu3(urd^Uf`@p^3X5kRf zwG06%A#u6v`2zIgI`JKg+rTaGaR1WTZJ)-aGP7vquU;n- z%l+AS1RUitfmJ6$nkXN}x?0An$GSrayPaksF z1v+tSUx{-2o;eHi8!fcV;GROEyD38aVdFeVb3J-$)T!;FML5R+WokF1;yTdQL;y*Xv zm~;JK(dxNpp52_kJ$+fBY>s+A0qt0;=sBD3i=o=&h>(o4t&oU4*3pb{M|B76HOy%} z6n&4Z@d;3aB7{vSrQmv$di{n)P%g)&(5;sLF%K!s4)DTIWi;n%GH(KVKIS`1uk$N~ zSu25p`hNij7WnB#J-~}MB<=1p?Z(=ko~hJgXUBKY6mjrtx80wVC&n{zDSQ*9aeQu( zv4Ork&PKTv_#e4U<{iKXMC35wwSurFYZW2_@Z0bDpx%9QwhAe}2dd51syb$t|M=aT zBjzc>s~MtI0cDwPhk>))*oL>JQnmwF!I) zcx`0ulj^PZV_Sji_ASYLK_hM*kcnYG>)`6RFQm>)rA@0zdAMZAxpdgmy zHa5^VCa`-=z$)VWrroS>r#VR6Wf}o?OhNx}fxh9_fP5I|>|B?cr$yk+IM~i#04wJT z(K=@vZ2HJyc1`VU8y60^6(>brjWbjYEz?*%`4*GvEE9d83(2fTN+(L5Ya;t9Hgrpm^R1})tp-dff6z7w+tuGuz` zG;Om0bF0;3tsqb1T({RhEx_>e?;W&~ksnGaiwR4zOOOEdeWJ@`&+_TSNIJ#5|Yo+KCoUD!&$I z0<_N;`*%Sur}H2zV7382i}TcW^epbTac=f|Xs)(#UGjpIahZ#MVpL@(7BhsiA)+3m zQ;6eafG;AC_l!I{T^%ec3}VRi7~RipFMnf{>EkyWP#86#)MaGosgrIg@@N#?Z>L> zR$Nm1-*#;pJ7QcGp*}rRVW?DOx!!n8#xsu&BKry8ZdGN^8+`~Hy&IU5Ocrg{z^S+a;J8CyTX!#!o$go{fNne< z>*?v43RiEPK$VQDZZ*an^^LK296Onuy9JjsTgXcY) z-+k|gh)V``8e>ifwC_GSn>;IlU(fbS< z7ll~9SAu3Sqvdcx!kcig>U2rU3NBIp2H_jSAl^bklAKRaWWX>~Cs zmKGP8+_s&Sh54<$kIp$y{OM2n!6CJF@FSo8>}))V-sVqo4-F5ufk;GxkNxYv6jzp(^e0~YQx%-;7=8LvpXAT~ z_a9FF>?>Y*k2+PM8R}vN2HD4m}HW)^?fy|RDZO0|dUqp8z zJj8`RUW-eSHQ?T>v$)qkt@6}P4jewro}D{)ux6iaOP!)PH}_4zKM}SUh=L(pEUG>| zQ(aDN80{*TJ!@@IL~fSB zs;XFPQB_@BSSb3w9~Fwlma2-XYS3=`tE;Q|;gOMAf*KJK78e#uef|Bdd_Er-W5gJv z&1N$jwA-1{v9X#l24f6HL>3n2OJif>wQMeDjWOzZo?TvE%A=~|n{h7e4#hT%lN4e&nMcQ;8X(`TdW47zg(6??1Itn+GWGh=CJP zcn!Y)bdaCJWirxhegNmZypy;I%Dt^wE}863*=IN4q}h+r4OeO7a(A!AMa7#MR6#`! zo~o$22<-&0!&*DW8f4jvqR5M)$V6c%t_6~+jUsKg+Y$r;VHgrck%nPNyWLKHBn(3h zf`E3rO{>+S-EK>}-PRxo2!cRct(GL`20@_lPjXL*qDT|w!$~4noxtUA`-}mu7PcqpozVDOGW;JG5@jMUD^E8vm zSl39J2-UXnyqbtC;xxpuKmW5oYy8d4e_g=kM{mNZ#dHpM9+w__Bg#Gmy;LU4B{dHA zPVK-t4Vl9wm2bku%+k5DRa`vh4Mf2=2wUY^t#+As_W!%z<%I56sGGVQ^kq19HaB|#9dw78f(b@IgU_{8LF ztJNa;IezrWrfe?1f=IK`XwYi4bZK$1R9#&ydYNpc*=$I&*`(QQN_AyMJd>+3H9MQd$7ilSV- zR?Fw|d8?{ot(7Q>q+YA}s;Xj46h#rS#4`1I-Sa#zh@vQwSW>H1eUQjnYr`-k2m)HI zmT9+IMvMugC?ff3Hk%pG^Fm1Wpi->0o)ICF%|@Q*VT{4^Jh3+N3x#5s$z(KLmkT`r;Q~Xs!KeTnHi|i%Yz}9+&!AA%N+VmzKHiGX_gD znh9H2KR1Poy}WdTiMSnj6KX$T>&w+cbIYxihi88MreEs+@fZChk9gFh4NfxVXHK2! ztFEq=cJJLAszV$60ateKN^w|SS;-ZOg&>p3T4Rig2(4Dj z3xc*cI5^aZk14>y++2QSbhMVqW+P)vBqGuB(voMbjm9@^ssf>iw1aj#ICOB@-?R6s zB|npCibxY^edxXaWLm9O<0oGHQ*{xE#)gLb`%0xBGoJSv5lI5y37x=YSl%k=F-7jv zLg~xmKd0=ohvA~(&!QWi(gOW2Z1g^i_cuT@s;^=^gIX=C>S=-1LzM-#j|_tIT!%8A zcX;~rJb=9R&;Hc=$G5-zsvmjQvyS}UAOC4Uj5mAD%U`xFo6UNE{`xo0#K&a+zJ0lW zc-vcdzUJ3{{mAIpn5wD~5#Dn1o3>4E-rRipvwv(cKBl*Q^P9yle(p1yUiPY2A2r4# zUZlS9wf}d=BOm?f%8ieGT-CKqljwu*eb3|C>yF+Uaw8JQxTdlEc(7TzD*Wq?c?jU4A> zI~}~syLLjm1xO#pe=bg9-AMP^&EeqOH-qd4y<}mB^QFr!!Fnl{XdduzoPG98x?Sxy z4zTw+#C#gH=bhodzffu}9)ZgnKD}oy8n_SgwK%mHUTJf2#W5Iksm%he(&r{zyQOrn za2faj@OoOcqo92t$3!EvqXVUkgJic;1+Zu8em#W))TIk+x8qV+^F1nbiwFlG$zd8m z&k73{O_%7ihq#J5b?zn{Go2z^V*1Eo$~$-N!l}X+(~YgOxUF>l3TMby;qt4)jp(wg z$c-qaHXFDE?3ZvALa)T(*#)<7KLb38TGF=~*5`!sc zS)aV#pqn!-VAhDBn%Lor$Qfbb4*o42aCia>-)Q$a!Owy)RNlGsxvb@L(}LhA@K)e$ zik^`BIP7q~bVW+AUUCvmh^55KaQ4|`>Xamq_y*K|nC00eaz&j!y_hcN_r($_EQNx6`2hay3mMk!-lKz!nM;3>)Jv)1}EUC!?tmB8kU;Eetsz@Z(U zzxY@f|D^^HiYBwYD&kRmHi{emr zjWH<#Wo505B1X{cVm+LAh!{MXY8{a3e%(c5#BB!RyAm_kM%|pZvA+F55!h{WdBJ(k zugB#GpTZh*1-Pz=F9cqJE6uxKFc+L-6W}X_7MGV885&kxboyhsFL^UA8{pxJN2U<@ zVO&w_5&Ue0pcx>tXq8UUvk`+j=x_^Qv05i?rrV^`6SY(Et0F8Q5+cdDMO0}BR1wkC z^%hvr7#6-*>l{xy0J(Dq29V}zKyfIKm{;J6XP(4bPYT7MT>k*Kxx}|rhz=e(%(*n* zy;A6Yp&~b;lp`>PbKPHwt8z-e(-B;ntMu^lmIJ(#5Pyz+#F8oty)#wmRur0AGs2Uc`D9bT+PO8k#0w0aEbV&tSg~@ zV!T!ASOyqUWSO{EqbG_*2HCiqb3aM5yj&ls^--RVnCIa<-%7AvO2v#Gjf)xmDBX+K#Mv^hMdb59Fn##Yc|PUB#}?-&cjG>SpQ77IiGcsY zRZ9IUP*dRG{ZwkD={ttO0LnXdCT~>4b%1#d4pWwv)Qh;H*Ei9sE}}XQ(nzIr25_qJ zq^gZ~jP7hV+}r(nB%Z_h9u*pQa~4ak2u?aaA6FQYt~Uf15Bpmjl>8Ljf7RhebiXq4 z?}-+dmtsd?D8QA?eFPT^+lBMs1ZPA)5_l?}KZKvX6OpBnkx_^OSo5r#vKG4nryAFc zbZ59H^@{DqYMtS}Qqn5lCkpEn`g1r`>0jakrkhhYT*CFs|7Bc4e|7qPX272deMd>K zUUF(v1!ONyHT@*rrSKsR%JK$WM0^!hrjH(pyH|IbA?ft&9Oa2kNfTztM1flMv7Qha z57EeVgU%K}i~)TJF4gs1)-~woqZurrRLRz3a9-O}S#O_x3TFd- z0SMx1rzzrY&M6gG0=8)+`$RyE;;CXq_M&=PwL8`(BKB6=I%9SIUS87sq-nF5^aeQA(*u^l5=z-; z--ENyo||4}Es_+ox)8|~gDSn8^dN(!D3#xw#HE~G#(La)NH=4(NHPSj zW8rsn*x`KXK?d7^Quf(3xFq^duzu$Zi|e8FdK^w`*`gdea^!Lk|B9jq8SE?+Gg=0> z4f9R7mPZ9#%IIytTUA;|L~{>lJL_!pAcNflm3M3b$%4yIJ`-n~y$gqlf53$u&X*o! zuydsH&Yj@u%7n$5Ww5~Xv7?uJSXVs#|0$Cb242Y4wEzGBC3HntbYx+4WjbSWWnpw> z05UK#FfA}NEiy1vFgH3eFgh|hD=;!TFfj0esA>QJ03~!qSaf7zbY(hiZ)9m^c>ppn zGB7PLG%YePR4_L>F)%tZIV&(SIxsMS+z{3P0038dR9JLUVRs;Ka&Km7Y-J#Hd2nSQ zX>fF7004NLJr5 literal 0 HcmV?d00001 diff --git a/docs/apple-touch-icon-180x180.png b/docs/apple-touch-icon-180x180.png new file mode 100644 index 0000000000000000000000000000000000000000..1a6eba107ab5ac9bf2f48e30e6abfcba2a2e65c6 GIT binary patch literal 27495 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

2>2wsrTk%2zLGN>hZDv5YAEt8w$+;mFj?AO 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 afVM|N=5h8`BpLMzG$jRf`O3GSLjMn`3_;ug literal 0 HcmV?d00001 diff --git a/docs/apple-touch-icon-60x60.png b/docs/apple-touch-icon-60x60.png new file mode 100644 index 0000000000000000000000000000000000000000..cb43ee5dddc99cece5d9b19f7d0addc43774238c GIT binary patch literal 5353 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 literal 0 HcmV?d00001 diff --git a/docs/apple-touch-icon-76x76.png b/docs/apple-touch-icon-76x76.png new file mode 100644 index 0000000000000000000000000000000000000000..0f3a331de956269e4e2a1d6f9d82aa52c1a7ab6a GIT binary patch literal 8093 zcmV;OA7bE%P)004R>004l5008;`004mK004C`008P>0026e000+ooVrmw00006 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%0AyjYB^Ukhp? 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 literal 0 HcmV?d00001 diff --git a/docs/articles/database_of_anor.html b/docs/articles/database_of_anor.html new file mode 100644 index 0000000..ae57e78 --- /dev/null +++ b/docs/articles/database_of_anor.html @@ -0,0 +1,180 @@ + + + + + + + +Database of anor • anor + + + + + + +

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

+Introduction

+

In this reference manual, we arranged the databases in anor and provide several meta information about the anor supported databases and other BioInstaller supported (download only) databases. Some of description or comments have been described in the download configuration file (BioInstaller package) and the annotation configuration file (anor).

+

anor supported databases will firstly be supported to download from original sites (exclude the authentication part) in BioInstaller. A portion of BioInstaller supported databases will be introduced in anor to as the candidate annotation databases (process method: remain unchanged, re-formate, re-analysis).

+
+
+

+Overview of supported database

+

The followed table shows all annotation names with its required download name.

+
+

The followed table shows all database names with its versions and description.

+
+

Besides, you can use the function download.database with parameter show.all.buildvers = TRUE get all available buildver.

+
x <- anor::download.database(download.name = "db_annovar_cosmic", show.all.buildvers = TRUE)
+as.data.frame(x)
+#>          db_annovar_cosmic
+#> cosmic70        hg38, hg19
+#> other                 hg19
+
+
+

+Gene and clincal annotation

+

Gene annotation databases contain the gene classification, gene function and phenotype correlation, such as HGNC, OMIM DoCM, CIVic, DisGeNET, ClinVar, and Gene Ontology (GO), .etc.

+
+
+

+Variant effect prediction

+

Variant effect prediction databases contain the various databases generated by the algorithms for prediction of variants effect on protein or RNA structural, such as SIFT, PolyPhen2, PROVEAN, MutationTaster, MutationAssessor, FATHMM, .etc.

+
+
+

+Population allele frequency

+

Population allele frequency databases contain the databases based on the population cohort genome sequencing data (mainly include whole genome sequencing and whole exome sequencing), such as 1000 Genome Project, NHLBI GO Exome Sequencing Project (ESP), gnomAD and ExAC, .etc.

+
+
+

+Cancer somatic mutation

+

Cancer somatic mutation databases generated by the cancer patients case-control paired genomic sequence data, such as COSMIC, Cancer Hotspots, intogen and Cancer Biomarkers database, .etc.

+
+
+

+RNA-seq variants

+

RNA-seq variants databases contributed by variants called from RNA-seq including expressed allele and RNA-editing. anor built an RNA-seq variants database, BRVar, based on 1285 cases B-cell lymphoblastic leukemia (B-ALL) patients RNA-seq data (Four different variants detection method be applied).

+
+
+

+Expression quantitative trait locus (eQTL)

+

eQTL databases contain the candidate locus of genome that have an candidate impact on gene expression level, such as Genotype-Tissue Expression (GTEx) QTL, seeQTL and PancanQTL, .etc.

+
+
+

+Non-coding RNA

+

Non-coding RNA databases contain the candidate biomarkers or non-coding RNA targeted transcriptional regulation region, such as Cancer-Specific CirRNA Database and (LNCediting)[http://bioinfo.life.hust.edu.cn/LNCediting/], .etc.

+
+
+ + + +
+ + + +
+

anor was developed by Jianfeng.

+
+ +
+

Developed by Jianfeng Li.

+

Site built by pkgdown.

+
+ +
+
+ + + + + + diff --git a/docs/articles/database_of_anor_files/crosstalk-1.1.0.1/css/crosstalk.css b/docs/articles/database_of_anor_files/crosstalk-1.1.0.1/css/crosstalk.css new file mode 100644 index 0000000..46befd2 --- /dev/null +++ b/docs/articles/database_of_anor_files/crosstalk-1.1.0.1/css/crosstalk.css @@ -0,0 +1,27 @@ +/* Adjust margins outwards, so column contents line up with the edges of the + parent of container-fluid. */ +.container-fluid.crosstalk-bscols { + margin-left: -30px; + margin-right: -30px; + white-space: normal; +} + +/* But don't adjust the margins outwards if we're directly under the body, + i.e. we were the top-level of something at the console. */ +body > .container-fluid.crosstalk-bscols { + margin-left: auto; + margin-right: auto; +} + +.crosstalk-input-checkboxgroup .crosstalk-options-group .crosstalk-options-column { + display: inline-block; + padding-right: 12px; + vertical-align: top; +} + +@media only screen and (max-width:480px) { + .crosstalk-input-checkboxgroup .crosstalk-options-group .crosstalk-options-column { + display: block; + padding-right: inherit; + } +} diff --git a/docs/articles/database_of_anor_files/crosstalk-1.1.0.1/js/crosstalk.js b/docs/articles/database_of_anor_files/crosstalk-1.1.0.1/js/crosstalk.js new file mode 100644 index 0000000..fd9eb53 --- /dev/null +++ b/docs/articles/database_of_anor_files/crosstalk-1.1.0.1/js/crosstalk.js @@ -0,0 +1,1474 @@ +(function(){function e(t,n,r){function s(o,u){if(!n[o]){if(!t[o]){var a=typeof require=="function"&&require;if(!u&&a)return a(o,!0);if(i)return i(o,!0);var f=new Error("Cannot find module '"+o+"'");throw f.code="MODULE_NOT_FOUND",f}var l=n[o]={exports:{}};t[o][0].call(l.exports,function(e){var n=t[o][1][e];return s(n?n:e)},l,l.exports,e,t,n,r)}return n[o].exports}var i=typeof require=="function"&&require;for(var o=0;o b) { + return 1; + } +} + +/** + * @private + */ + +var FilterSet = function () { + function FilterSet() { + _classCallCheck(this, FilterSet); + + this.reset(); + } + + _createClass(FilterSet, [{ + key: "reset", + value: function reset() { + // Key: handle ID, Value: array of selected keys, or null + this._handles = {}; + // Key: key string, Value: count of handles that include it + this._keys = {}; + this._value = null; + this._activeHandles = 0; + } + }, { + key: "update", + value: function update(handleId, keys) { + if (keys !== null) { + keys = keys.slice(0); // clone before sorting + keys.sort(naturalComparator); + } + + var _diffSortedLists = (0, _util.diffSortedLists)(this._handles[handleId], keys), + added = _diffSortedLists.added, + removed = _diffSortedLists.removed; + + this._handles[handleId] = keys; + + for (var i = 0; i < added.length; i++) { + this._keys[added[i]] = (this._keys[added[i]] || 0) + 1; + } + for (var _i = 0; _i < removed.length; _i++) { + this._keys[removed[_i]]--; + } + + this._updateValue(keys); + } + + /** + * @param {string[]} keys Sorted array of strings that indicate + * a superset of possible keys. + * @private + */ + + }, { + key: "_updateValue", + value: function _updateValue() { + var keys = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : this._allKeys; + + var handleCount = Object.keys(this._handles).length; + if (handleCount === 0) { + this._value = null; + } else { + this._value = []; + for (var i = 0; i < keys.length; i++) { + var count = this._keys[keys[i]]; + if (count === handleCount) { + this._value.push(keys[i]); + } + } + } + } + }, { + key: "clear", + value: function clear(handleId) { + if (typeof this._handles[handleId] === "undefined") { + return; + } + + var keys = this._handles[handleId]; + if (!keys) { + keys = []; + } + + for (var i = 0; i < keys.length; i++) { + this._keys[keys[i]]--; + } + delete this._handles[handleId]; + + this._updateValue(); + } + }, { + key: "value", + get: function get() { + return this._value; + } + }, { + key: "_allKeys", + get: function get() { + var allKeys = Object.keys(this._keys); + allKeys.sort(naturalComparator); + return allKeys; + } + }]); + + return FilterSet; +}(); + +exports.default = FilterSet; + +},{"./util":11}],4:[function(require,module,exports){ +(function (global){ +"use strict"; + +Object.defineProperty(exports, "__esModule", { + value: true +}); + +var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }(); + +var _typeof = typeof Symbol === "function" && typeof Symbol.iterator === "symbol" ? function (obj) { return typeof obj; } : function (obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }; + +exports.default = group; + +var _var2 = require("./var"); + +var _var3 = _interopRequireDefault(_var2); + +function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } + +function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } + +// Use a global so that multiple copies of crosstalk.js can be loaded and still +// have groups behave as singletons across all copies. +global.__crosstalk_groups = global.__crosstalk_groups || {}; +var groups = global.__crosstalk_groups; + +function group(groupName) { + if (groupName && typeof groupName === "string") { + if (!groups.hasOwnProperty(groupName)) { + groups[groupName] = new Group(groupName); + } + return groups[groupName]; + } else if ((typeof groupName === "undefined" ? "undefined" : _typeof(groupName)) === "object" && groupName._vars && groupName.var) { + // Appears to already be a group object + return groupName; + } else if (Array.isArray(groupName) && groupName.length == 1 && typeof groupName[0] === "string") { + return group(groupName[0]); + } else { + throw new Error("Invalid groupName argument"); + } +} + +var Group = function () { + function Group(name) { + _classCallCheck(this, Group); + + this.name = name; + this._vars = {}; + } + + _createClass(Group, [{ + key: "var", + value: function _var(name) { + if (!name || typeof name !== "string") { + throw new Error("Invalid var name"); + } + + if (!this._vars.hasOwnProperty(name)) this._vars[name] = new _var3.default(this, name); + return this._vars[name]; + } + }, { + key: "has", + value: function has(name) { + if (!name || typeof name !== "string") { + throw new Error("Invalid var name"); + } + + return this._vars.hasOwnProperty(name); + } + }]); + + return Group; +}(); + +}).call(this,typeof global !== "undefined" ? global : typeof self !== "undefined" ? self : typeof window !== "undefined" ? window : {}) + +},{"./var":12}],5:[function(require,module,exports){ +(function (global){ +"use strict"; + +Object.defineProperty(exports, "__esModule", { + value: true +}); + +var _group = require("./group"); + +var _group2 = _interopRequireDefault(_group); + +var _selection = require("./selection"); + +var _filter = require("./filter"); + +var _input = require("./input"); + +require("./input_selectize"); + +require("./input_checkboxgroup"); + +require("./input_slider"); + +function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } + +var defaultGroup = (0, _group2.default)("default"); + +function var_(name) { + return defaultGroup.var(name); +} + +function has(name) { + return defaultGroup.has(name); +} + +if (global.Shiny) { + global.Shiny.addCustomMessageHandler("update-client-value", function (message) { + if (typeof message.group === "string") { + (0, _group2.default)(message.group).var(message.name).set(message.value); + } else { + var_(message.name).set(message.value); + } + }); +} + +var crosstalk = { + group: _group2.default, + var: var_, + has: has, + SelectionHandle: _selection.SelectionHandle, + FilterHandle: _filter.FilterHandle, + bind: _input.bind +}; + +/** + * @namespace crosstalk + */ +exports.default = crosstalk; + +global.crosstalk = crosstalk; + +}).call(this,typeof global !== "undefined" ? global : typeof self !== "undefined" ? self : typeof window !== "undefined" ? window : {}) + +},{"./filter":2,"./group":4,"./input":6,"./input_checkboxgroup":7,"./input_selectize":8,"./input_slider":9,"./selection":10}],6:[function(require,module,exports){ +(function (global){ +"use strict"; + +Object.defineProperty(exports, "__esModule", { + value: true +}); +exports.register = register; +exports.bind = bind; +var $ = global.jQuery; + +var bindings = {}; + +function register(reg) { + bindings[reg.className] = reg; + if (global.document && global.document.readyState !== "complete") { + $(function () { + bind(); + }); + } else if (global.document) { + setTimeout(bind, 100); + } +} + +function bind() { + Object.keys(bindings).forEach(function (className) { + var binding = bindings[className]; + $("." + binding.className).not(".crosstalk-input-bound").each(function (i, el) { + bindInstance(binding, el); + }); + }); +} + +// Escape jQuery identifier +function $escape(val) { + return val.replace(/([!"#$%&'()*+,./:;<=>?@[\\\]^`{|}~])/g, "\\$1"); +} + +function bindEl(el) { + var $el = $(el); + Object.keys(bindings).forEach(function (className) { + if ($el.hasClass(className) && !$el.hasClass("crosstalk-input-bound")) { + var binding = bindings[className]; + bindInstance(binding, el); + } + }); +} + +function bindInstance(binding, el) { + var jsonEl = $(el).find("script[type='application/json'][data-for='" + $escape(el.id) + "']"); + var data = JSON.parse(jsonEl[0].innerText); + + var instance = binding.factory(el, data); + $(el).data("crosstalk-instance", instance); + $(el).addClass("crosstalk-input-bound"); +} + +if (global.Shiny) { + var inputBinding = new global.Shiny.InputBinding(); + var _$ = global.jQuery; + _$.extend(inputBinding, { + find: function find(scope) { + return _$(scope).find(".crosstalk-input"); + }, + initialize: function initialize(el) { + if (!_$(el).hasClass("crosstalk-input-bound")) { + bindEl(el); + } + }, + getId: function getId(el) { + return el.id; + }, + getValue: function getValue(el) {}, + setValue: function setValue(el, value) {}, + receiveMessage: function receiveMessage(el, data) {}, + subscribe: function subscribe(el, callback) { + _$(el).data("crosstalk-instance").resume(); + }, + unsubscribe: function unsubscribe(el) { + _$(el).data("crosstalk-instance").suspend(); + } + }); + global.Shiny.inputBindings.register(inputBinding, "crosstalk.inputBinding"); +} + +}).call(this,typeof global !== "undefined" ? global : typeof self !== "undefined" ? self : typeof window !== "undefined" ? window : {}) + +},{}],7:[function(require,module,exports){ +(function (global){ +"use strict"; + +var _input = require("./input"); + +var input = _interopRequireWildcard(_input); + +var _filter = require("./filter"); + +function _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) newObj[key] = obj[key]; } } newObj.default = obj; return newObj; } } + +var $ = global.jQuery; + +input.register({ + className: "crosstalk-input-checkboxgroup", + + factory: function factory(el, data) { + /* + * map: {"groupA": ["keyA", "keyB", ...], ...} + * group: "ct-groupname" + */ + var ctHandle = new _filter.FilterHandle(data.group); + + var lastKnownKeys = void 0; + var $el = $(el); + $el.on("change", "input[type='checkbox']", function () { + var checked = $el.find("input[type='checkbox']:checked"); + if (checked.length === 0) { + lastKnownKeys = null; + ctHandle.clear(); + } else { + var keys = {}; + checked.each(function () { + data.map[this.value].forEach(function (key) { + keys[key] = true; + }); + }); + var keyArray = Object.keys(keys); + keyArray.sort(); + lastKnownKeys = keyArray; + ctHandle.set(keyArray); + } + }); + + return { + suspend: function suspend() { + ctHandle.clear(); + }, + resume: function resume() { + if (lastKnownKeys) ctHandle.set(lastKnownKeys); + } + }; + } +}); + +}).call(this,typeof global !== "undefined" ? global : typeof self !== "undefined" ? self : typeof window !== "undefined" ? window : {}) + +},{"./filter":2,"./input":6}],8:[function(require,module,exports){ +(function (global){ +"use strict"; + +var _input = require("./input"); + +var input = _interopRequireWildcard(_input); + +var _util = require("./util"); + +var util = _interopRequireWildcard(_util); + +var _filter = require("./filter"); + +function _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) newObj[key] = obj[key]; } } newObj.default = obj; return newObj; } } + +var $ = global.jQuery; + +input.register({ + className: "crosstalk-input-select", + + factory: function factory(el, data) { + /* + * items: {value: [...], label: [...]} + * map: {"groupA": ["keyA", "keyB", ...], ...} + * group: "ct-groupname" + */ + + var first = [{ value: "", label: "(All)" }]; + var items = util.dataframeToD3(data.items); + var opts = { + options: first.concat(items), + valueField: "value", + labelField: "label", + searchField: "label" + }; + + var select = $(el).find("select")[0]; + + var selectize = $(select).selectize(opts)[0].selectize; + + var ctHandle = new _filter.FilterHandle(data.group); + + var lastKnownKeys = void 0; + selectize.on("change", function () { + if (selectize.items.length === 0) { + lastKnownKeys = null; + ctHandle.clear(); + } else { + var keys = {}; + selectize.items.forEach(function (group) { + data.map[group].forEach(function (key) { + keys[key] = true; + }); + }); + var keyArray = Object.keys(keys); + keyArray.sort(); + lastKnownKeys = keyArray; + ctHandle.set(keyArray); + } + }); + + return { + suspend: function suspend() { + ctHandle.clear(); + }, + resume: function resume() { + if (lastKnownKeys) ctHandle.set(lastKnownKeys); + } + }; + } +}); + +}).call(this,typeof global !== "undefined" ? global : typeof self !== "undefined" ? self : typeof window !== "undefined" ? window : {}) + +},{"./filter":2,"./input":6,"./util":11}],9:[function(require,module,exports){ +(function (global){ +"use strict"; + +var _slicedToArray = function () { function sliceIterator(arr, i) { var _arr = []; var _n = true; var _d = false; var _e = undefined; try { for (var _i = arr[Symbol.iterator](), _s; !(_n = (_s = _i.next()).done); _n = true) { _arr.push(_s.value); if (i && _arr.length === i) break; } } catch (err) { _d = true; _e = err; } finally { try { if (!_n && _i["return"]) _i["return"](); } finally { if (_d) throw _e; } } return _arr; } return function (arr, i) { if (Array.isArray(arr)) { return arr; } else if (Symbol.iterator in Object(arr)) { return sliceIterator(arr, i); } else { throw new TypeError("Invalid attempt to destructure non-iterable instance"); } }; }(); + +var _input = require("./input"); + +var input = _interopRequireWildcard(_input); + +var _filter = require("./filter"); + +function _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) newObj[key] = obj[key]; } } newObj.default = obj; return newObj; } } + +var $ = global.jQuery; +var strftime = global.strftime; + +input.register({ + className: "crosstalk-input-slider", + + factory: function factory(el, data) { + /* + * map: {"groupA": ["keyA", "keyB", ...], ...} + * group: "ct-groupname" + */ + var ctHandle = new _filter.FilterHandle(data.group); + + var opts = {}; + var $el = $(el).find("input"); + var dataType = $el.data("data-type"); + var timeFormat = $el.data("time-format"); + var round = $el.data("round"); + var timeFormatter = void 0; + + // Set up formatting functions + if (dataType === "date") { + timeFormatter = strftime.utc(); + opts.prettify = function (num) { + return timeFormatter(timeFormat, new Date(num)); + }; + } else if (dataType === "datetime") { + var timezone = $el.data("timezone"); + if (timezone) timeFormatter = strftime.timezone(timezone);else timeFormatter = strftime; + + opts.prettify = function (num) { + return timeFormatter(timeFormat, new Date(num)); + }; + } else if (dataType === "number") { + if (typeof round !== "undefined") opts.prettify = function (num) { + var factor = Math.pow(10, round); + return Math.round(num * factor) / factor; + }; + } + + $el.ionRangeSlider(opts); + + function getValue() { + var result = $el.data("ionRangeSlider").result; + + // Function for converting numeric value from slider to appropriate type. + var convert = void 0; + var dataType = $el.data("data-type"); + if (dataType === "date") { + convert = function convert(val) { + return formatDateUTC(new Date(+val)); + }; + } else if (dataType === "datetime") { + convert = function convert(val) { + // Convert ms to s + return +val / 1000; + }; + } else { + convert = function convert(val) { + return +val; + }; + } + + if ($el.data("ionRangeSlider").options.type === "double") { + return [convert(result.from), convert(result.to)]; + } else { + return convert(result.from); + } + } + + var lastKnownKeys = null; + + $el.on("change.crosstalkSliderInput", function (event) { + if (!$el.data("updating") && !$el.data("animating")) { + var _getValue = getValue(), + _getValue2 = _slicedToArray(_getValue, 2), + from = _getValue2[0], + to = _getValue2[1]; + + var keys = []; + for (var i = 0; i < data.values.length; i++) { + var val = data.values[i]; + if (val >= from && val <= to) { + keys.push(data.keys[i]); + } + } + keys.sort(); + ctHandle.set(keys); + lastKnownKeys = keys; + } + }); + + // let $el = $(el); + // $el.on("change", "input[type="checkbox"]", function() { + // let checked = $el.find("input[type="checkbox"]:checked"); + // if (checked.length === 0) { + // ctHandle.clear(); + // } else { + // let keys = {}; + // checked.each(function() { + // data.map[this.value].forEach(function(key) { + // keys[key] = true; + // }); + // }); + // let keyArray = Object.keys(keys); + // keyArray.sort(); + // ctHandle.set(keyArray); + // } + // }); + + return { + suspend: function suspend() { + ctHandle.clear(); + }, + resume: function resume() { + if (lastKnownKeys) ctHandle.set(lastKnownKeys); + } + }; + } +}); + +// Convert a number to a string with leading zeros +function padZeros(n, digits) { + var str = n.toString(); + while (str.length < digits) { + str = "0" + str; + }return str; +} + +// Given a Date object, return a string in yyyy-mm-dd format, using the +// UTC date. This may be a day off from the date in the local time zone. +function formatDateUTC(date) { + if (date instanceof Date) { + return date.getUTCFullYear() + "-" + padZeros(date.getUTCMonth() + 1, 2) + "-" + padZeros(date.getUTCDate(), 2); + } else { + return null; + } +} + +}).call(this,typeof global !== "undefined" ? global : typeof self !== "undefined" ? self : typeof window !== "undefined" ? window : {}) + +},{"./filter":2,"./input":6}],10:[function(require,module,exports){ +"use strict"; + +Object.defineProperty(exports, "__esModule", { + value: true +}); +exports.SelectionHandle = undefined; + +var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }(); + +var _events = require("./events"); + +var _events2 = _interopRequireDefault(_events); + +var _group = require("./group"); + +var _group2 = _interopRequireDefault(_group); + +var _util = require("./util"); + +var util = _interopRequireWildcard(_util); + +function _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) newObj[key] = obj[key]; } } newObj.default = obj; return newObj; } } + +function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } + +function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } + +/** + * Use this class to read and write (and listen for changes to) the selection + * for a Crosstalk group. This is intended to be used for linked brushing. + * + * If two (or more) `SelectionHandle` instances in the same webpage share the + * same group name, they will share the same state. Setting the selection using + * one `SelectionHandle` instance will result in the `value` property instantly + * changing across the others, and `"change"` event listeners on all instances + * (including the one that initiated the sending) will fire. + * + * @param {string} [group] - The name of the Crosstalk group, or if none, + * null or undefined (or any other falsy value). This can be changed later + * via the [SelectionHandle#setGroup](#setGroup) method. + * @param {Object} [extraInfo] - An object whose properties will be copied to + * the event object whenever an event is emitted. + */ +var SelectionHandle = exports.SelectionHandle = function () { + function SelectionHandle() { + var group = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : null; + var extraInfo = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : null; + + _classCallCheck(this, SelectionHandle); + + this._eventRelay = new _events2.default(); + this._emitter = new util.SubscriptionTracker(this._eventRelay); + + // Name of the group we're currently tracking, if any. Can change over time. + this._group = null; + // The Var we're currently tracking, if any. Can change over time. + this._var = null; + // The event handler subscription we currently have on var.on("change"). + this._varOnChangeSub = null; + + this._extraInfo = util.extend({ sender: this }, extraInfo); + + this.setGroup(group); + } + + /** + * Changes the Crosstalk group membership of this SelectionHandle. The group + * being switched away from (if any) will not have its selection value + * modified as a result of calling `setGroup`, even if this handle was the + * most recent handle to set the selection of the group. + * + * The group being switched to (if any) will also not have its selection value + * modified as a result of calling `setGroup`. If you want to set the + * selection value of the new group, call `set` explicitly. + * + * @param {string} group - The name of the Crosstalk group, or null (or + * undefined) to clear the group. + */ + + + _createClass(SelectionHandle, [{ + key: "setGroup", + value: function setGroup(group) { + var _this = this; + + // If group is unchanged, do nothing + if (this._group === group) return; + // Treat null, undefined, and other falsy values the same + if (!this._group && !group) return; + + if (this._var) { + this._var.off("change", this._varOnChangeSub); + this._var = null; + this._varOnChangeSub = null; + } + + this._group = group; + + if (group) { + this._var = (0, _group2.default)(group).var("selection"); + var sub = this._var.on("change", function (e) { + _this._eventRelay.trigger("change", e, _this); + }); + this._varOnChangeSub = sub; + } + } + + /** + * Retrieves the current selection for the group represented by this + * `SelectionHandle`. + * + * - If no selection is active, then this value will be falsy. + * - If a selection is active, but no data points are selected, then this + * value will be an empty array. + * - If a selection is active, and data points are selected, then the keys + * of the selected data points will be present in the array. + */ + + }, { + key: "_mergeExtraInfo", + + + /** + * Combines the given `extraInfo` (if any) with the handle's default + * `_extraInfo` (if any). + * @private + */ + value: function _mergeExtraInfo(extraInfo) { + // Important incidental effect: shallow clone is returned + return util.extend({}, this._extraInfo ? this._extraInfo : null, extraInfo ? extraInfo : null); + } + + /** + * Overwrites the current selection for the group, and raises the `"change"` + * event among all of the group's '`SelectionHandle` instances (including + * this one). + * + * @fires SelectionHandle#change + * @param {string[]} selectedKeys - Falsy, empty array, or array of keys (see + * {@link SelectionHandle#value}). + * @param {Object} [extraInfo] - Extra properties to be included on the event + * object that's passed to listeners (in addition to any options that were + * passed into the `SelectionHandle` constructor). + */ + + }, { + key: "set", + value: function set(selectedKeys, extraInfo) { + if (this._var) this._var.set(selectedKeys, this._mergeExtraInfo(extraInfo)); + } + + /** + * Overwrites the current selection for the group, and raises the `"change"` + * event among all of the group's '`SelectionHandle` instances (including + * this one). + * + * @fires SelectionHandle#change + * @param {Object} [extraInfo] - Extra properties to be included on the event + * object that's passed to listeners (in addition to any that were passed + * into the `SelectionHandle` constructor). + */ + + }, { + key: "clear", + value: function clear(extraInfo) { + if (this._var) this.set(void 0, this._mergeExtraInfo(extraInfo)); + } + + /** + * Subscribes to events on this `SelectionHandle`. + * + * @param {string} eventType - Indicates the type of events to listen to. + * Currently, only `"change"` is supported. + * @param {SelectionHandle~listener} listener - The callback function that + * will be invoked when the event occurs. + * @return {string} - A token to pass to {@link SelectionHandle#off} to cancel + * this subscription. + */ + + }, { + key: "on", + value: function on(eventType, listener) { + return this._emitter.on(eventType, listener); + } + + /** + * Cancels event subscriptions created by {@link SelectionHandle#on}. + * + * @param {string} eventType - The type of event to unsubscribe. + * @param {string|SelectionHandle~listener} listener - Either the callback + * function previously passed into {@link SelectionHandle#on}, or the + * string that was returned from {@link SelectionHandle#on}. + */ + + }, { + key: "off", + value: function off(eventType, listener) { + return this._emitter.off(eventType, listener); + } + + /** + * Shuts down the `SelectionHandle` object. + * + * Removes all event listeners that were added through this handle. + */ + + }, { + key: "close", + value: function close() { + this._emitter.removeAllListeners(); + this.setGroup(null); + } + }, { + key: "value", + get: function get() { + return this._var ? this._var.get() : null; + } + }]); + + return SelectionHandle; +}(); + +/** + * @callback SelectionHandle~listener + * @param {Object} event - An object containing details of the event. For + * `"change"` events, this includes the properties `value` (the new + * value of the selection, or `undefined` if no selection is active), + * `oldValue` (the previous value of the selection), and `sender` (the + * `SelectionHandle` instance that made the change). + */ + +/** + * @event SelectionHandle#change + * @type {object} + * @property {object} value - The new value of the selection, or `undefined` + * if no selection is active. + * @property {object} oldValue - The previous value of the selection. + * @property {SelectionHandle} sender - The `SelectionHandle` instance that + * changed the value. + */ + +},{"./events":1,"./group":4,"./util":11}],11:[function(require,module,exports){ +"use strict"; + +Object.defineProperty(exports, "__esModule", { + value: true +}); + +var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }(); + +var _typeof = typeof Symbol === "function" && typeof Symbol.iterator === "symbol" ? function (obj) { return typeof obj; } : function (obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }; + +exports.extend = extend; +exports.checkSorted = checkSorted; +exports.diffSortedLists = diffSortedLists; +exports.dataframeToD3 = dataframeToD3; + +function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } + +function extend(target) { + for (var _len = arguments.length, sources = Array(_len > 1 ? _len - 1 : 0), _key = 1; _key < _len; _key++) { + sources[_key - 1] = arguments[_key]; + } + + for (var i = 0; i < sources.length; i++) { + var src = sources[i]; + if (typeof src === "undefined" || src === null) continue; + + for (var key in src) { + if (src.hasOwnProperty(key)) { + target[key] = src[key]; + } + } + } + return target; +} + +function checkSorted(list) { + for (var i = 1; i < list.length; i++) { + if (list[i] <= list[i - 1]) { + throw new Error("List is not sorted or contains duplicate"); + } + } +} + +function diffSortedLists(a, b) { + var i_a = 0; + var i_b = 0; + + if (!a) a = []; + if (!b) b = []; + + var a_only = []; + var b_only = []; + + checkSorted(a); + checkSorted(b); + + while (i_a < a.length && i_b < b.length) { + if (a[i_a] === b[i_b]) { + i_a++; + i_b++; + } else if (a[i_a] < b[i_b]) { + a_only.push(a[i_a++]); + } else { + b_only.push(b[i_b++]); + } + } + + if (i_a < a.length) a_only = a_only.concat(a.slice(i_a)); + if (i_b < b.length) b_only = b_only.concat(b.slice(i_b)); + return { + removed: a_only, + added: b_only + }; +} + +// Convert from wide: { colA: [1,2,3], colB: [4,5,6], ... } +// to long: [ {colA: 1, colB: 4}, {colA: 2, colB: 5}, ... ] +function dataframeToD3(df) { + var names = []; + var length = void 0; + 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 = void 0; + 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; +} + +/** + * Keeps track of all event listener additions/removals and lets all active + * listeners be removed with a single operation. + * + * @private + */ + +var SubscriptionTracker = exports.SubscriptionTracker = function () { + function SubscriptionTracker(emitter) { + _classCallCheck(this, SubscriptionTracker); + + this._emitter = emitter; + this._subs = {}; + } + + _createClass(SubscriptionTracker, [{ + key: "on", + value: function on(eventType, listener) { + var sub = this._emitter.on(eventType, listener); + this._subs[sub] = eventType; + return sub; + } + }, { + key: "off", + value: function off(eventType, listener) { + var sub = this._emitter.off(eventType, listener); + if (sub) { + delete this._subs[sub]; + } + return sub; + } + }, { + key: "removeAllListeners", + value: function removeAllListeners() { + var _this = this; + + var current_subs = this._subs; + this._subs = {}; + Object.keys(current_subs).forEach(function (sub) { + _this._emitter.off(current_subs[sub], sub); + }); + } + }]); + + return SubscriptionTracker; +}(); + +},{}],12:[function(require,module,exports){ +(function (global){ +"use strict"; + +Object.defineProperty(exports, "__esModule", { + value: true +}); + +var _typeof = typeof Symbol === "function" && typeof Symbol.iterator === "symbol" ? function (obj) { return typeof obj; } : function (obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }; + +var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }(); + +var _events = require("./events"); + +var _events2 = _interopRequireDefault(_events); + +function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } + +function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } + +var Var = function () { + function Var(group, name, /*optional*/value) { + _classCallCheck(this, Var); + + this._group = group; + this._name = name; + this._value = value; + this._events = new _events2.default(); + } + + _createClass(Var, [{ + key: "get", + value: function get() { + return this._value; + } + }, { + key: "set", + value: function set(value, /*optional*/event) { + if (this._value === value) { + // Do nothing; the value hasn't changed + return; + } + var oldValue = this._value; + this._value = value; + // Alert JavaScript listeners that the value has changed + var evt = {}; + if (event && (typeof event === "undefined" ? "undefined" : _typeof(event)) === "object") { + for (var k in event) { + if (event.hasOwnProperty(k)) evt[k] = event[k]; + } + } + evt.oldValue = oldValue; + evt.value = value; + this._events.trigger("change", evt, this); + + // TODO: Make this extensible, to let arbitrary back-ends know that + // something has changed + if (global.Shiny && global.Shiny.onInputChange) { + global.Shiny.onInputChange(".clientValue-" + (this._group.name !== null ? this._group.name + "-" : "") + this._name, typeof value === "undefined" ? null : value); + } + } + }, { + key: "on", + value: function on(eventType, listener) { + return this._events.on(eventType, listener); + } + }, { + key: "off", + value: function off(eventType, listener) { + return this._events.off(eventType, listener); + } + }]); + + return Var; +}(); + +exports.default = Var; + +}).call(this,typeof global !== "undefined" ? global : typeof self !== "undefined" ? self : typeof window !== "undefined" ? window : {}) + +},{"./events":1}]},{},[5]) +//# sourceMappingURL=crosstalk.js.map diff --git a/docs/articles/database_of_anor_files/crosstalk-1.1.0.1/js/crosstalk.js.map b/docs/articles/database_of_anor_files/crosstalk-1.1.0.1/js/crosstalk.js.map new file mode 100644 index 0000000..cff94f0 --- /dev/null +++ b/docs/articles/database_of_anor_files/crosstalk-1.1.0.1/js/crosstalk.js.map @@ -0,0 +1,37 @@ +{ + "version": 3, + "sources": [ + "node_modules/browser-pack/_prelude.js", + "javascript/src/events.js", + "javascript/src/filter.js", + "javascript/src/filterset.js", + "javascript/src/group.js", + "javascript/src/index.js", + "javascript/src/input.js", + "javascript/src/input_checkboxgroup.js", + "javascript/src/input_selectize.js", + "javascript/src/input_slider.js", + "javascript/src/selection.js", + "javascript/src/util.js", + "javascript/src/var.js" + ], + "names": [], + "mappings": "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", + "file": "generated.js", + "sourceRoot": "", + "sourcesContent": [ + "(function(){function e(t,n,r){function s(o,u){if(!n[o]){if(!t[o]){var a=typeof require==\"function\"&&require;if(!u&&a)return a(o,!0);if(i)return i(o,!0);var f=new Error(\"Cannot find module '\"+o+\"'\");throw f.code=\"MODULE_NOT_FOUND\",f}var l=n[o]={exports:{}};t[o][0].call(l.exports,function(e){var n=t[o][1][e];return s(n?n:e)},l,l.exports,e,t,n,r)}return n[o].exports}var i=typeof require==\"function\"&&require;for(var o=0;o {\n this._eventRelay.trigger(\"change\", e, this);\n });\n this._varOnChangeSub = sub;\n }\n }\n\n /**\n * Combine the given `extraInfo` (if any) with the handle's default\n * `_extraInfo` (if any).\n * @private\n */\n _mergeExtraInfo(extraInfo) {\n return util.extend({},\n this._extraInfo ? this._extraInfo : null,\n extraInfo ? extraInfo : null);\n }\n\n /**\n * Close the handle. This clears this handle's contribution to the filter set,\n * and unsubscribes all event listeners.\n */\n close() {\n this._emitter.removeAllListeners();\n this.clear();\n this.setGroup(null);\n }\n\n /**\n * Clear this handle's contribution to the filter set.\n *\n * @param {Object} [extraInfo] - Extra properties to be included on the event\n * object that's passed to listeners (in addition to any options that were\n * passed into the `FilterHandle` constructor).\n * \n * @fires FilterHandle#change\n */\n clear(extraInfo) {\n if (!this._filterSet)\n return;\n this._filterSet.clear(this._id);\n this._onChange(extraInfo);\n }\n\n /**\n * Set this handle's contribution to the filter set. This array should consist\n * of the keys of the rows that _should_ be displayed; any keys that are not\n * present in the array will be considered _filtered out_. Note that multiple\n * `FilterHandle` instances in the group may each contribute an array of keys,\n * and only those keys that appear in _all_ of the arrays make it through the\n * filter.\n *\n * @param {string[]} keys - Empty array, or array of keys. To clear the\n * filter, don't pass an empty array; instead, use the\n * {@link FilterHandle#clear} method.\n * @param {Object} [extraInfo] - Extra properties to be included on the event\n * object that's passed to listeners (in addition to any options that were\n * passed into the `FilterHandle` constructor).\n * \n * @fires FilterHandle#change\n */\n set(keys, extraInfo) {\n if (!this._filterSet)\n return;\n this._filterSet.update(this._id, keys);\n this._onChange(extraInfo);\n }\n\n /**\n * @return {string[]|null} - Either: 1) an array of keys that made it through\n * all of the `FilterHandle` instances, or, 2) `null`, which means no filter\n * is being applied (all data should be displayed).\n */\n get filteredKeys() {\n return this._filterSet ? this._filterSet.value : null;\n }\n\n /**\n * Subscribe to events on this `FilterHandle`.\n *\n * @param {string} eventType - Indicates the type of events to listen to.\n * Currently, only `\"change\"` is supported.\n * @param {FilterHandle~listener} listener - The callback function that\n * will be invoked when the event occurs.\n * @return {string} - A token to pass to {@link FilterHandle#off} to cancel\n * this subscription.\n */\n on(eventType, listener) {\n return this._emitter.on(eventType, listener);\n }\n\n /**\n * Cancel event subscriptions created by {@link FilterHandle#on}.\n *\n * @param {string} eventType - The type of event to unsubscribe.\n * @param {string|FilterHandle~listener} listener - Either the callback\n * function previously passed into {@link FilterHandle#on}, or the\n * string that was returned from {@link FilterHandle#on}.\n */\n off(eventType, listener) {\n return this._emitter.off(eventType, listener);\n }\n\n _onChange(extraInfo) {\n if (!this._filterSet)\n return;\n this._filterVar.set(this._filterSet.value, this._mergeExtraInfo(extraInfo));\n }\n\n /**\n * @callback FilterHandle~listener\n * @param {Object} event - An object containing details of the event. For\n * `\"change\"` events, this includes the properties `value` (the new\n * value of the filter set, or `null` if no filter set is active),\n * `oldValue` (the previous value of the filter set), and `sender` (the\n * `FilterHandle` instance that made the change).\n */\n\n}\n\n/**\n * @event FilterHandle#change\n * @type {object}\n * @property {object} value - The new value of the filter set, or `null`\n * if no filter set is active.\n * @property {object} oldValue - The previous value of the filter set.\n * @property {FilterHandle} sender - The `FilterHandle` instance that\n * changed the value.\n */\n", + "import { diffSortedLists } from \"./util\";\n\nfunction naturalComparator(a, b) {\n if (a === b) {\n return 0;\n } else if (a < b) {\n return -1;\n } else if (a > b) {\n return 1;\n }\n}\n\n/**\n * @private\n */\nexport default class FilterSet {\n constructor() {\n this.reset();\n }\n\n reset() {\n // Key: handle ID, Value: array of selected keys, or null\n this._handles = {};\n // Key: key string, Value: count of handles that include it\n this._keys = {};\n this._value = null;\n this._activeHandles = 0;\n }\n\n get value() {\n return this._value;\n }\n\n update(handleId, keys) {\n if (keys !== null) {\n keys = keys.slice(0); // clone before sorting\n keys.sort(naturalComparator);\n }\n\n let {added, removed} = diffSortedLists(this._handles[handleId], keys);\n this._handles[handleId] = keys;\n\n for (let i = 0; i < added.length; i++) {\n this._keys[added[i]] = (this._keys[added[i]] || 0) + 1;\n }\n for (let i = 0; i < removed.length; i++) {\n this._keys[removed[i]]--;\n }\n\n this._updateValue(keys);\n }\n\n /**\n * @param {string[]} keys Sorted array of strings that indicate\n * a superset of possible keys.\n * @private\n */\n _updateValue(keys = this._allKeys) {\n let handleCount = Object.keys(this._handles).length;\n if (handleCount === 0) {\n this._value = null;\n } else {\n this._value = [];\n for (let i = 0; i < keys.length; i++) {\n let count = this._keys[keys[i]];\n if (count === handleCount) {\n this._value.push(keys[i]);\n }\n }\n }\n }\n\n clear(handleId) {\n if (typeof(this._handles[handleId]) === \"undefined\") {\n return;\n }\n\n let keys = this._handles[handleId];\n if (!keys) {\n keys = [];\n }\n\n for (let i = 0; i < keys.length; i++) {\n this._keys[keys[i]]--;\n }\n delete this._handles[handleId];\n\n this._updateValue();\n }\n\n get _allKeys() {\n let allKeys = Object.keys(this._keys);\n allKeys.sort(naturalComparator);\n return allKeys;\n }\n}\n", + "import Var from \"./var\";\n\n// Use a global so that multiple copies of crosstalk.js can be loaded and still\n// have groups behave as singletons across all copies.\nglobal.__crosstalk_groups = global.__crosstalk_groups || {};\nlet groups = global.__crosstalk_groups;\n\nexport default function group(groupName) {\n if (groupName && typeof(groupName) === \"string\") {\n if (!groups.hasOwnProperty(groupName)) {\n groups[groupName] = new Group(groupName);\n }\n return groups[groupName];\n } else if (typeof(groupName) === \"object\" && groupName._vars && groupName.var) {\n // Appears to already be a group object\n return groupName;\n } else if (Array.isArray(groupName) &&\n groupName.length == 1 &&\n typeof(groupName[0]) === \"string\") {\n return group(groupName[0]);\n } else {\n throw new Error(\"Invalid groupName argument\");\n }\n}\n\nclass Group {\n constructor(name) {\n this.name = name;\n this._vars = {};\n }\n\n var(name) {\n if (!name || typeof(name) !== \"string\") {\n throw new Error(\"Invalid var name\");\n }\n\n if (!this._vars.hasOwnProperty(name))\n this._vars[name] = new Var(this, name);\n return this._vars[name];\n }\n\n has(name) {\n if (!name || typeof(name) !== \"string\") {\n throw new Error(\"Invalid var name\");\n }\n\n return this._vars.hasOwnProperty(name);\n }\n}\n", + "import group from \"./group\";\nimport { SelectionHandle } from \"./selection\";\nimport { FilterHandle } from \"./filter\";\nimport { bind } from \"./input\";\nimport \"./input_selectize\";\nimport \"./input_checkboxgroup\";\nimport \"./input_slider\";\n\nconst defaultGroup = group(\"default\");\n\nfunction var_(name) {\n return defaultGroup.var(name);\n}\n\nfunction has(name) {\n return defaultGroup.has(name);\n}\n\nif (global.Shiny) {\n global.Shiny.addCustomMessageHandler(\"update-client-value\", function(message) {\n if (typeof(message.group) === \"string\") {\n group(message.group).var(message.name).set(message.value);\n } else {\n var_(message.name).set(message.value);\n }\n });\n}\n\nconst crosstalk = {\n group: group,\n var: var_,\n has: has,\n SelectionHandle: SelectionHandle,\n FilterHandle: FilterHandle,\n bind: bind\n};\n\n/**\n * @namespace crosstalk\n */\nexport default crosstalk;\nglobal.crosstalk = crosstalk;\n", + "let $ = global.jQuery;\n\nlet bindings = {};\n\nexport function register(reg) {\n bindings[reg.className] = reg;\n if (global.document && global.document.readyState !== \"complete\") {\n $(() => {\n bind();\n });\n } else if (global.document) {\n setTimeout(bind, 100);\n }\n}\n\nexport function bind() {\n Object.keys(bindings).forEach(function(className) {\n let binding = bindings[className];\n $(\".\" + binding.className).not(\".crosstalk-input-bound\").each(function(i, el) {\n bindInstance(binding, el);\n });\n });\n}\n\n// Escape jQuery identifier\nfunction $escape(val) {\n return val.replace(/([!\"#$%&'()*+,./:;<=>?@[\\\\\\]^`{|}~])/g, \"\\\\$1\");\n}\n\nfunction bindEl(el) {\n let $el = $(el);\n Object.keys(bindings).forEach(function(className) {\n if ($el.hasClass(className) && !$el.hasClass(\"crosstalk-input-bound\")) {\n let binding = bindings[className];\n bindInstance(binding, el);\n }\n });\n}\n\nfunction bindInstance(binding, el) {\n let jsonEl = $(el).find(\"script[type='application/json'][data-for='\" + $escape(el.id) + \"']\");\n let data = JSON.parse(jsonEl[0].innerText);\n\n let instance = binding.factory(el, data);\n $(el).data(\"crosstalk-instance\", instance);\n $(el).addClass(\"crosstalk-input-bound\");\n}\n\nif (global.Shiny) {\n let inputBinding = new global.Shiny.InputBinding();\n let $ = global.jQuery;\n $.extend(inputBinding, {\n find: function(scope) {\n return $(scope).find(\".crosstalk-input\");\n },\n initialize: function(el) {\n if (!$(el).hasClass(\"crosstalk-input-bound\")) {\n bindEl(el);\n }\n },\n getId: function(el) {\n return el.id;\n },\n getValue: function(el) {\n\n },\n setValue: function(el, value) {\n\n },\n receiveMessage: function(el, data) {\n\n },\n subscribe: function(el, callback) {\n $(el).data(\"crosstalk-instance\").resume();\n },\n unsubscribe: function(el) {\n $(el).data(\"crosstalk-instance\").suspend();\n }\n });\n global.Shiny.inputBindings.register(inputBinding, \"crosstalk.inputBinding\");\n}\n", + "import * as input from \"./input\";\nimport { FilterHandle } from \"./filter\";\n\nlet $ = global.jQuery;\n\ninput.register({\n className: \"crosstalk-input-checkboxgroup\",\n\n factory: function(el, data) {\n /*\n * map: {\"groupA\": [\"keyA\", \"keyB\", ...], ...}\n * group: \"ct-groupname\"\n */\n let ctHandle = new FilterHandle(data.group);\n\n let lastKnownKeys;\n let $el = $(el);\n $el.on(\"change\", \"input[type='checkbox']\", function() {\n let checked = $el.find(\"input[type='checkbox']:checked\");\n if (checked.length === 0) {\n lastKnownKeys = null;\n ctHandle.clear();\n } else {\n let keys = {};\n checked.each(function() {\n data.map[this.value].forEach(function(key) {\n keys[key] = true;\n });\n });\n let keyArray = Object.keys(keys);\n keyArray.sort();\n lastKnownKeys = keyArray;\n ctHandle.set(keyArray);\n }\n });\n\n return {\n suspend: function() {\n ctHandle.clear();\n },\n resume: function() {\n if (lastKnownKeys)\n ctHandle.set(lastKnownKeys);\n }\n };\n }\n});\n", + "import * as input from \"./input\";\nimport * as util from \"./util\";\nimport { FilterHandle } from \"./filter\";\n\nlet $ = global.jQuery;\n\ninput.register({\n className: \"crosstalk-input-select\",\n\n factory: function(el, data) {\n /*\n * items: {value: [...], label: [...]}\n * map: {\"groupA\": [\"keyA\", \"keyB\", ...], ...}\n * group: \"ct-groupname\"\n */\n\n let first = [{value: \"\", label: \"(All)\"}];\n let items = util.dataframeToD3(data.items);\n let opts = {\n options: first.concat(items),\n valueField: \"value\",\n labelField: \"label\",\n searchField: \"label\"\n };\n\n let select = $(el).find(\"select\")[0];\n\n let selectize = $(select).selectize(opts)[0].selectize;\n\n let ctHandle = new FilterHandle(data.group);\n\n let lastKnownKeys;\n selectize.on(\"change\", function() {\n if (selectize.items.length === 0) {\n lastKnownKeys = null;\n ctHandle.clear();\n } else {\n let keys = {};\n selectize.items.forEach(function(group) {\n data.map[group].forEach(function(key) {\n keys[key] = true;\n });\n });\n let keyArray = Object.keys(keys);\n keyArray.sort();\n lastKnownKeys = keyArray;\n ctHandle.set(keyArray);\n }\n });\n\n return {\n suspend: function() {\n ctHandle.clear();\n },\n resume: function() {\n if (lastKnownKeys)\n ctHandle.set(lastKnownKeys);\n }\n };\n }\n});\n", + "import * as input from \"./input\";\nimport { FilterHandle } from \"./filter\";\n\nlet $ = global.jQuery;\nlet strftime = global.strftime;\n\ninput.register({\n className: \"crosstalk-input-slider\",\n\n factory: function(el, data) {\n /*\n * map: {\"groupA\": [\"keyA\", \"keyB\", ...], ...}\n * group: \"ct-groupname\"\n */\n let ctHandle = new FilterHandle(data.group);\n\n let opts = {};\n let $el = $(el).find(\"input\");\n let dataType = $el.data(\"data-type\");\n let timeFormat = $el.data(\"time-format\");\n let round = $el.data(\"round\");\n let timeFormatter;\n\n // Set up formatting functions\n if (dataType === \"date\") {\n timeFormatter = strftime.utc();\n opts.prettify = function(num) {\n return timeFormatter(timeFormat, new Date(num));\n };\n\n } else if (dataType === \"datetime\") {\n let timezone = $el.data(\"timezone\");\n if (timezone)\n timeFormatter = strftime.timezone(timezone);\n else\n timeFormatter = strftime;\n\n opts.prettify = function(num) {\n return timeFormatter(timeFormat, new Date(num));\n };\n } else if (dataType === \"number\") {\n if (typeof round !== \"undefined\")\n opts.prettify = function(num) {\n let factor = Math.pow(10, round);\n return Math.round(num * factor) / factor;\n };\n }\n\n $el.ionRangeSlider(opts);\n\n function getValue() {\n let result = $el.data(\"ionRangeSlider\").result;\n\n // Function for converting numeric value from slider to appropriate type.\n let convert;\n let dataType = $el.data(\"data-type\");\n if (dataType === \"date\") {\n convert = function(val) {\n return formatDateUTC(new Date(+val));\n };\n } else if (dataType === \"datetime\") {\n convert = function(val) {\n // Convert ms to s\n return +val / 1000;\n };\n } else {\n convert = function(val) { return +val; };\n }\n\n if ($el.data(\"ionRangeSlider\").options.type === \"double\") {\n return [convert(result.from), convert(result.to)];\n } else {\n return convert(result.from);\n }\n }\n\n let lastKnownKeys = null;\n\n $el.on(\"change.crosstalkSliderInput\", function(event) {\n if (!$el.data(\"updating\") && !$el.data(\"animating\")) {\n let [from, to] = getValue();\n let keys = [];\n for (let i = 0; i < data.values.length; i++) {\n let val = data.values[i];\n if (val >= from && val <= to) {\n keys.push(data.keys[i]);\n }\n }\n keys.sort();\n ctHandle.set(keys);\n lastKnownKeys = keys;\n }\n });\n\n\n // let $el = $(el);\n // $el.on(\"change\", \"input[type=\"checkbox\"]\", function() {\n // let checked = $el.find(\"input[type=\"checkbox\"]:checked\");\n // if (checked.length === 0) {\n // ctHandle.clear();\n // } else {\n // let keys = {};\n // checked.each(function() {\n // data.map[this.value].forEach(function(key) {\n // keys[key] = true;\n // });\n // });\n // let keyArray = Object.keys(keys);\n // keyArray.sort();\n // ctHandle.set(keyArray);\n // }\n // });\n\n return {\n suspend: function() {\n ctHandle.clear();\n },\n resume: function() {\n if (lastKnownKeys)\n ctHandle.set(lastKnownKeys);\n }\n };\n }\n});\n\n\n// Convert a number to a string with leading zeros\nfunction padZeros(n, digits) {\n let str = n.toString();\n while (str.length < digits)\n str = \"0\" + str;\n return str;\n}\n\n// Given a Date object, return a string in yyyy-mm-dd format, using the\n// UTC date. This may be a day off from the date in the local time zone.\nfunction formatDateUTC(date) {\n if (date instanceof Date) {\n return date.getUTCFullYear() + \"-\" +\n padZeros(date.getUTCMonth()+1, 2) + \"-\" +\n padZeros(date.getUTCDate(), 2);\n\n } else {\n return null;\n }\n}\n", + "import Events from \"./events\";\nimport grp from \"./group\";\nimport * as util from \"./util\";\n\n/**\n * Use this class to read and write (and listen for changes to) the selection\n * for a Crosstalk group. This is intended to be used for linked brushing.\n *\n * If two (or more) `SelectionHandle` instances in the same webpage share the\n * same group name, they will share the same state. Setting the selection using\n * one `SelectionHandle` instance will result in the `value` property instantly\n * changing across the others, and `\"change\"` event listeners on all instances\n * (including the one that initiated the sending) will fire.\n *\n * @param {string} [group] - The name of the Crosstalk group, or if none,\n * null or undefined (or any other falsy value). This can be changed later\n * via the [SelectionHandle#setGroup](#setGroup) method.\n * @param {Object} [extraInfo] - An object whose properties will be copied to\n * the event object whenever an event is emitted.\n */\nexport class SelectionHandle {\n\n constructor(group = null, extraInfo = null) {\n this._eventRelay = new Events();\n this._emitter = new util.SubscriptionTracker(this._eventRelay);\n\n // Name of the group we're currently tracking, if any. Can change over time.\n this._group = null;\n // The Var we're currently tracking, if any. Can change over time.\n this._var = null;\n // The event handler subscription we currently have on var.on(\"change\").\n this._varOnChangeSub = null;\n\n this._extraInfo = util.extend({ sender: this }, extraInfo);\n\n this.setGroup(group);\n }\n\n /**\n * Changes the Crosstalk group membership of this SelectionHandle. The group\n * being switched away from (if any) will not have its selection value\n * modified as a result of calling `setGroup`, even if this handle was the\n * most recent handle to set the selection of the group.\n *\n * The group being switched to (if any) will also not have its selection value\n * modified as a result of calling `setGroup`. If you want to set the\n * selection value of the new group, call `set` explicitly.\n *\n * @param {string} group - The name of the Crosstalk group, or null (or\n * undefined) to clear the group.\n */\n setGroup(group) {\n // If group is unchanged, do nothing\n if (this._group === group)\n return;\n // Treat null, undefined, and other falsy values the same\n if (!this._group && !group)\n return;\n\n if (this._var) {\n this._var.off(\"change\", this._varOnChangeSub);\n this._var = null;\n this._varOnChangeSub = null;\n }\n\n this._group = group;\n\n if (group) {\n this._var = grp(group).var(\"selection\");\n let sub = this._var.on(\"change\", (e) => {\n this._eventRelay.trigger(\"change\", e, this);\n });\n this._varOnChangeSub = sub;\n }\n }\n\n /**\n * Retrieves the current selection for the group represented by this\n * `SelectionHandle`.\n *\n * - If no selection is active, then this value will be falsy.\n * - If a selection is active, but no data points are selected, then this\n * value will be an empty array.\n * - If a selection is active, and data points are selected, then the keys\n * of the selected data points will be present in the array.\n */\n get value() {\n return this._var ? this._var.get() : null;\n }\n\n /**\n * Combines the given `extraInfo` (if any) with the handle's default\n * `_extraInfo` (if any).\n * @private\n */\n _mergeExtraInfo(extraInfo) {\n // Important incidental effect: shallow clone is returned\n return util.extend({},\n this._extraInfo ? this._extraInfo : null,\n extraInfo ? extraInfo : null);\n }\n\n /**\n * Overwrites the current selection for the group, and raises the `\"change\"`\n * event among all of the group's '`SelectionHandle` instances (including\n * this one).\n *\n * @fires SelectionHandle#change\n * @param {string[]} selectedKeys - Falsy, empty array, or array of keys (see\n * {@link SelectionHandle#value}).\n * @param {Object} [extraInfo] - Extra properties to be included on the event\n * object that's passed to listeners (in addition to any options that were\n * passed into the `SelectionHandle` constructor).\n */\n set(selectedKeys, extraInfo) {\n if (this._var)\n this._var.set(selectedKeys, this._mergeExtraInfo(extraInfo));\n }\n\n /**\n * Overwrites the current selection for the group, and raises the `\"change\"`\n * event among all of the group's '`SelectionHandle` instances (including\n * this one).\n *\n * @fires SelectionHandle#change\n * @param {Object} [extraInfo] - Extra properties to be included on the event\n * object that's passed to listeners (in addition to any that were passed\n * into the `SelectionHandle` constructor).\n */\n clear(extraInfo) {\n if (this._var)\n this.set(void 0, this._mergeExtraInfo(extraInfo));\n }\n\n /**\n * Subscribes to events on this `SelectionHandle`.\n *\n * @param {string} eventType - Indicates the type of events to listen to.\n * Currently, only `\"change\"` is supported.\n * @param {SelectionHandle~listener} listener - The callback function that\n * will be invoked when the event occurs.\n * @return {string} - A token to pass to {@link SelectionHandle#off} to cancel\n * this subscription.\n */\n on(eventType, listener) {\n return this._emitter.on(eventType, listener);\n }\n\n /**\n * Cancels event subscriptions created by {@link SelectionHandle#on}.\n *\n * @param {string} eventType - The type of event to unsubscribe.\n * @param {string|SelectionHandle~listener} listener - Either the callback\n * function previously passed into {@link SelectionHandle#on}, or the\n * string that was returned from {@link SelectionHandle#on}.\n */\n off(eventType, listener) {\n return this._emitter.off(eventType, listener);\n }\n\n /**\n * Shuts down the `SelectionHandle` object.\n *\n * Removes all event listeners that were added through this handle.\n */\n close() {\n this._emitter.removeAllListeners();\n this.setGroup(null);\n }\n}\n\n/**\n * @callback SelectionHandle~listener\n * @param {Object} event - An object containing details of the event. For\n * `\"change\"` events, this includes the properties `value` (the new\n * value of the selection, or `undefined` if no selection is active),\n * `oldValue` (the previous value of the selection), and `sender` (the\n * `SelectionHandle` instance that made the change).\n */\n\n/**\n * @event SelectionHandle#change\n * @type {object}\n * @property {object} value - The new value of the selection, or `undefined`\n * if no selection is active.\n * @property {object} oldValue - The previous value of the selection.\n * @property {SelectionHandle} sender - The `SelectionHandle` instance that\n * changed the value.\n */\n", + "export function extend(target, ...sources) {\n for (let i = 0; i < sources.length; i++) {\n let src = sources[i];\n if (typeof(src) === \"undefined\" || src === null)\n continue;\n\n for (let key in src) {\n if (src.hasOwnProperty(key)) {\n target[key] = src[key];\n }\n }\n }\n return target;\n}\n\nexport function checkSorted(list) {\n for (let i = 1; i < list.length; i++) {\n if (list[i] <= list[i-1]) {\n throw new Error(\"List is not sorted or contains duplicate\");\n }\n }\n}\n\nexport function diffSortedLists(a, b) {\n let i_a = 0;\n let i_b = 0;\n\n if (!a) a = [];\n if (!b) b = [];\n\n let a_only = [];\n let b_only = [];\n\n checkSorted(a);\n checkSorted(b);\n\n while (i_a < a.length && i_b < b.length) {\n if (a[i_a] === b[i_b]) {\n i_a++;\n i_b++;\n } else if (a[i_a] < b[i_b]) {\n a_only.push(a[i_a++]);\n } else {\n b_only.push(b[i_b++]);\n }\n }\n\n if (i_a < a.length)\n a_only = a_only.concat(a.slice(i_a));\n if (i_b < b.length)\n b_only = b_only.concat(b.slice(i_b));\n return {\n removed: a_only,\n added: b_only\n };\n}\n\n// Convert from wide: { colA: [1,2,3], colB: [4,5,6], ... }\n// to long: [ {colA: 1, colB: 4}, {colA: 2, colB: 5}, ... ]\nexport function dataframeToD3(df) {\n let names = [];\n let length;\n for (let name in df) {\n if (df.hasOwnProperty(name))\n names.push(name);\n if (typeof(df[name]) !== \"object\" || typeof(df[name].length) === \"undefined\") {\n throw new Error(\"All fields must be arrays\");\n } else if (typeof(length) !== \"undefined\" && length !== df[name].length) {\n throw new Error(\"All fields must be arrays of the same length\");\n }\n length = df[name].length;\n }\n let results = [];\n let item;\n for (let row = 0; row < length; row++) {\n item = {};\n for (let col = 0; col < names.length; col++) {\n item[names[col]] = df[names[col]][row];\n }\n results.push(item);\n }\n return results;\n}\n\n/**\n * Keeps track of all event listener additions/removals and lets all active\n * listeners be removed with a single operation.\n *\n * @private\n */\nexport class SubscriptionTracker {\n constructor(emitter) {\n this._emitter = emitter;\n this._subs = {};\n }\n\n on(eventType, listener) {\n let sub = this._emitter.on(eventType, listener);\n this._subs[sub] = eventType;\n return sub;\n }\n\n off(eventType, listener) {\n let sub = this._emitter.off(eventType, listener);\n if (sub) {\n delete this._subs[sub];\n }\n return sub;\n }\n\n removeAllListeners() {\n let current_subs = this._subs;\n this._subs = {};\n Object.keys(current_subs).forEach((sub) => {\n this._emitter.off(current_subs[sub], sub);\n });\n }\n}\n", + "import Events from \"./events\";\n\nexport default class Var {\n constructor(group, name, /*optional*/ value) {\n this._group = group;\n this._name = name;\n this._value = value;\n this._events = new Events();\n }\n\n get() {\n return this._value;\n }\n\n set(value, /*optional*/ event) {\n if (this._value === value) {\n // Do nothing; the value hasn't changed\n return;\n }\n let oldValue = this._value;\n this._value = value;\n // Alert JavaScript listeners that the value has changed\n let evt = {};\n if (event && typeof(event) === \"object\") {\n for (let k in event) {\n if (event.hasOwnProperty(k))\n evt[k] = event[k];\n }\n }\n evt.oldValue = oldValue;\n evt.value = value;\n this._events.trigger(\"change\", evt, this);\n\n // TODO: Make this extensible, to let arbitrary back-ends know that\n // something has changed\n if (global.Shiny && global.Shiny.onInputChange) {\n global.Shiny.onInputChange(\n \".clientValue-\" +\n (this._group.name !== null ? this._group.name + \"-\" : \"\") +\n this._name,\n typeof(value) === \"undefined\" ? null : value\n );\n }\n }\n\n on(eventType, listener) {\n return this._events.on(eventType, listener);\n }\n\n off(eventType, listener) {\n return this._events.off(eventType, listener);\n }\n}\n" + ] +} \ No newline at end of file diff --git a/docs/articles/database_of_anor_files/crosstalk-1.1.0.1/js/crosstalk.min.js b/docs/articles/database_of_anor_files/crosstalk-1.1.0.1/js/crosstalk.min.js new file mode 100644 index 0000000..b7ec0ac --- /dev/null +++ b/docs/articles/database_of_anor_files/crosstalk-1.1.0.1/js/crosstalk.min.js @@ -0,0 +1,2 @@ +!function o(u,a,l){function s(n,e){if(!a[n]){if(!u[n]){var t="function"==typeof require&&require;if(!e&&t)return t(n,!0);if(f)return f(n,!0);var r=new Error("Cannot find module '"+n+"'");throw r.code="MODULE_NOT_FOUND",r}var i=a[n]={exports:{}};u[n][0].call(i.exports,function(e){var t=u[n][1][e];return s(t||e)},i,i.exports,o,u,a,l)}return a[n].exports}for(var f="function"==typeof require&&require,e=0;e?@[\\\]^`{|}~])/g,"\\$1")+"']"),r=JSON.parse(n[0].innerText),i=e.factory(t,r);o(t).data("crosstalk-instance",i),o(t).addClass("crosstalk-input-bound")}if(t.Shiny){var e=new t.Shiny.InputBinding,u=t.jQuery;u.extend(e,{find:function(e){return u(e).find(".crosstalk-input")},initialize:function(e){var t,n;u(e).hasClass("crosstalk-input-bound")||(n=o(t=e),Object.keys(r).forEach(function(e){n.hasClass(e)&&!n.hasClass("crosstalk-input-bound")&&i(r[e],t)}))},getId:function(e){return e.id},getValue:function(e){},setValue:function(e,t){},receiveMessage:function(e,t){},subscribe:function(e,t){u(e).data("crosstalk-instance").resume()},unsubscribe:function(e){u(e).data("crosstalk-instance").suspend()}}),t.Shiny.inputBindings.register(e,"crosstalk.inputBinding")}}).call(this,"undefined"!=typeof global?global:"undefined"!=typeof self?self:"undefined"!=typeof window?window:{})},{}],7:[function(r,e,t){(function(e){"use strict";var t=function(e){{if(e&&e.__esModule)return e;var t={};if(null!=e)for(var n in e)Object.prototype.hasOwnProperty.call(e,n)&&(t[n]=e[n]);return t.default=e,t}}(r("./input")),n=r("./filter");var a=e.jQuery;t.register({className:"crosstalk-input-checkboxgroup",factory:function(e,r){var i=new n.FilterHandle(r.group),o=void 0,u=a(e);return u.on("change","input[type='checkbox']",function(){var e=u.find("input[type='checkbox']:checked");if(0===e.length)o=null,i.clear();else{var t={};e.each(function(){r.map[this.value].forEach(function(e){t[e]=!0})});var n=Object.keys(t);n.sort(),o=n,i.set(n)}}),{suspend:function(){i.clear()},resume:function(){o&&i.set(o)}}}})}).call(this,"undefined"!=typeof global?global:"undefined"!=typeof self?self:"undefined"!=typeof window?window:{})},{"./filter":2,"./input":6}],8:[function(r,e,t){(function(e){"use strict";var t=n(r("./input")),l=n(r("./util")),s=r("./filter");function n(e){if(e&&e.__esModule)return e;var t={};if(null!=e)for(var n in e)Object.prototype.hasOwnProperty.call(e,n)&&(t[n]=e[n]);return t.default=e,t}var f=e.jQuery;t.register({className:"crosstalk-input-select",factory:function(e,n){var t=l.dataframeToD3(n.items),r={options:[{value:"",label:"(All)"}].concat(t),valueField:"value",labelField:"label",searchField:"label"},i=f(e).find("select")[0],o=f(i).selectize(r)[0].selectize,u=new s.FilterHandle(n.group),a=void 0;return o.on("change",function(){if(0===o.items.length)a=null,u.clear();else{var t={};o.items.forEach(function(e){n.map[e].forEach(function(e){t[e]=!0})});var e=Object.keys(t);e.sort(),a=e,u.set(e)}}),{suspend:function(){u.clear()},resume:function(){a&&u.set(a)}}}})}).call(this,"undefined"!=typeof global?global:"undefined"!=typeof self?self:"undefined"!=typeof window?window:{})},{"./filter":2,"./input":6,"./util":11}],9:[function(n,e,t){(function(e){"use strict";var d=function(e,t){if(Array.isArray(e))return e;if(Symbol.iterator in Object(e))return function(e,t){var n=[],r=!0,i=!1,o=void 0;try{for(var u,a=e[Symbol.iterator]();!(r=(u=a.next()).done)&&(n.push(u.value),!t||n.length!==t);r=!0);}catch(e){i=!0,o=e}finally{try{!r&&a.return&&a.return()}finally{if(i)throw o}}return n}(e,t);throw new TypeError("Invalid attempt to destructure non-iterable instance")},t=function(e){{if(e&&e.__esModule)return e;var t={};if(null!=e)for(var n in e)Object.prototype.hasOwnProperty.call(e,n)&&(t[n]=e[n]);return t.default=e,t}}(n("./input")),a=n("./filter");var v=e.jQuery,p=e.strftime;function y(e,t){for(var n=e.toString();n.length {\n this._eventRelay.trigger(\"change\", e, this);\n });\n this._varOnChangeSub = sub;\n }\n }\n\n /**\n * Combine the given `extraInfo` (if any) with the handle's default\n * `_extraInfo` (if any).\n * @private\n */\n _mergeExtraInfo(extraInfo) {\n return util.extend({},\n this._extraInfo ? this._extraInfo : null,\n extraInfo ? extraInfo : null);\n }\n\n /**\n * Close the handle. This clears this handle's contribution to the filter set,\n * and unsubscribes all event listeners.\n */\n close() {\n this._emitter.removeAllListeners();\n this.clear();\n this.setGroup(null);\n }\n\n /**\n * Clear this handle's contribution to the filter set.\n *\n * @param {Object} [extraInfo] - Extra properties to be included on the event\n * object that's passed to listeners (in addition to any options that were\n * passed into the `FilterHandle` constructor).\n * \n * @fires FilterHandle#change\n */\n clear(extraInfo) {\n if (!this._filterSet)\n return;\n this._filterSet.clear(this._id);\n this._onChange(extraInfo);\n }\n\n /**\n * Set this handle's contribution to the filter set. This array should consist\n * of the keys of the rows that _should_ be displayed; any keys that are not\n * present in the array will be considered _filtered out_. Note that multiple\n * `FilterHandle` instances in the group may each contribute an array of keys,\n * and only those keys that appear in _all_ of the arrays make it through the\n * filter.\n *\n * @param {string[]} keys - Empty array, or array of keys. To clear the\n * filter, don't pass an empty array; instead, use the\n * {@link FilterHandle#clear} method.\n * @param {Object} [extraInfo] - Extra properties to be included on the event\n * object that's passed to listeners (in addition to any options that were\n * passed into the `FilterHandle` constructor).\n * \n * @fires FilterHandle#change\n */\n set(keys, extraInfo) {\n if (!this._filterSet)\n return;\n this._filterSet.update(this._id, keys);\n this._onChange(extraInfo);\n }\n\n /**\n * @return {string[]|null} - Either: 1) an array of keys that made it through\n * all of the `FilterHandle` instances, or, 2) `null`, which means no filter\n * is being applied (all data should be displayed).\n */\n get filteredKeys() {\n return this._filterSet ? this._filterSet.value : null;\n }\n\n /**\n * Subscribe to events on this `FilterHandle`.\n *\n * @param {string} eventType - Indicates the type of events to listen to.\n * Currently, only `\"change\"` is supported.\n * @param {FilterHandle~listener} listener - The callback function that\n * will be invoked when the event occurs.\n * @return {string} - A token to pass to {@link FilterHandle#off} to cancel\n * this subscription.\n */\n on(eventType, listener) {\n return this._emitter.on(eventType, listener);\n }\n\n /**\n * Cancel event subscriptions created by {@link FilterHandle#on}.\n *\n * @param {string} eventType - The type of event to unsubscribe.\n * @param {string|FilterHandle~listener} listener - Either the callback\n * function previously passed into {@link FilterHandle#on}, or the\n * string that was returned from {@link FilterHandle#on}.\n */\n off(eventType, listener) {\n return this._emitter.off(eventType, listener);\n }\n\n _onChange(extraInfo) {\n if (!this._filterSet)\n return;\n this._filterVar.set(this._filterSet.value, this._mergeExtraInfo(extraInfo));\n }\n\n /**\n * @callback FilterHandle~listener\n * @param {Object} event - An object containing details of the event. For\n * `\"change\"` events, this includes the properties `value` (the new\n * value of the filter set, or `null` if no filter set is active),\n * `oldValue` (the previous value of the filter set), and `sender` (the\n * `FilterHandle` instance that made the change).\n */\n\n}\n\n/**\n * @event FilterHandle#change\n * @type {object}\n * @property {object} value - The new value of the filter set, or `null`\n * if no filter set is active.\n * @property {object} oldValue - The previous value of the filter set.\n * @property {FilterHandle} sender - The `FilterHandle` instance that\n * changed the value.\n */\n","import { diffSortedLists } from \"./util\";\n\nfunction naturalComparator(a, b) {\n if (a === b) {\n return 0;\n } else if (a < b) {\n return -1;\n } else if (a > b) {\n return 1;\n }\n}\n\n/**\n * @private\n */\nexport default class FilterSet {\n constructor() {\n this.reset();\n }\n\n reset() {\n // Key: handle ID, Value: array of selected keys, or null\n this._handles = {};\n // Key: key string, Value: count of handles that include it\n this._keys = {};\n this._value = null;\n this._activeHandles = 0;\n }\n\n get value() {\n return this._value;\n }\n\n update(handleId, keys) {\n if (keys !== null) {\n keys = keys.slice(0); // clone before sorting\n keys.sort(naturalComparator);\n }\n\n let {added, removed} = diffSortedLists(this._handles[handleId], keys);\n this._handles[handleId] = keys;\n\n for (let i = 0; i < added.length; i++) {\n this._keys[added[i]] = (this._keys[added[i]] || 0) + 1;\n }\n for (let i = 0; i < removed.length; i++) {\n this._keys[removed[i]]--;\n }\n\n this._updateValue(keys);\n }\n\n /**\n * @param {string[]} keys Sorted array of strings that indicate\n * a superset of possible keys.\n * @private\n */\n _updateValue(keys = this._allKeys) {\n let handleCount = Object.keys(this._handles).length;\n if (handleCount === 0) {\n this._value = null;\n } else {\n this._value = [];\n for (let i = 0; i < keys.length; i++) {\n let count = this._keys[keys[i]];\n if (count === handleCount) {\n this._value.push(keys[i]);\n }\n }\n }\n }\n\n clear(handleId) {\n if (typeof(this._handles[handleId]) === \"undefined\") {\n return;\n }\n\n let keys = this._handles[handleId];\n if (!keys) {\n keys = [];\n }\n\n for (let i = 0; i < keys.length; i++) {\n this._keys[keys[i]]--;\n }\n delete this._handles[handleId];\n\n this._updateValue();\n }\n\n get _allKeys() {\n let allKeys = Object.keys(this._keys);\n allKeys.sort(naturalComparator);\n return allKeys;\n }\n}\n","import Var from \"./var\";\n\n// Use a global so that multiple copies of crosstalk.js can be loaded and still\n// have groups behave as singletons across all copies.\nglobal.__crosstalk_groups = global.__crosstalk_groups || {};\nlet groups = global.__crosstalk_groups;\n\nexport default function group(groupName) {\n if (groupName && typeof(groupName) === \"string\") {\n if (!groups.hasOwnProperty(groupName)) {\n groups[groupName] = new Group(groupName);\n }\n return groups[groupName];\n } else if (typeof(groupName) === \"object\" && groupName._vars && groupName.var) {\n // Appears to already be a group object\n return groupName;\n } else if (Array.isArray(groupName) &&\n groupName.length == 1 &&\n typeof(groupName[0]) === \"string\") {\n return group(groupName[0]);\n } else {\n throw new Error(\"Invalid groupName argument\");\n }\n}\n\nclass Group {\n constructor(name) {\n this.name = name;\n this._vars = {};\n }\n\n var(name) {\n if (!name || typeof(name) !== \"string\") {\n throw new Error(\"Invalid var name\");\n }\n\n if (!this._vars.hasOwnProperty(name))\n this._vars[name] = new Var(this, name);\n return this._vars[name];\n }\n\n has(name) {\n if (!name || typeof(name) !== \"string\") {\n throw new Error(\"Invalid var name\");\n }\n\n return this._vars.hasOwnProperty(name);\n }\n}\n","import group from \"./group\";\nimport { SelectionHandle } from \"./selection\";\nimport { FilterHandle } from \"./filter\";\nimport { bind } from \"./input\";\nimport \"./input_selectize\";\nimport \"./input_checkboxgroup\";\nimport \"./input_slider\";\n\nconst defaultGroup = group(\"default\");\n\nfunction var_(name) {\n return defaultGroup.var(name);\n}\n\nfunction has(name) {\n return defaultGroup.has(name);\n}\n\nif (global.Shiny) {\n global.Shiny.addCustomMessageHandler(\"update-client-value\", function(message) {\n if (typeof(message.group) === \"string\") {\n group(message.group).var(message.name).set(message.value);\n } else {\n var_(message.name).set(message.value);\n }\n });\n}\n\nconst crosstalk = {\n group: group,\n var: var_,\n has: has,\n SelectionHandle: SelectionHandle,\n FilterHandle: FilterHandle,\n bind: bind\n};\n\n/**\n * @namespace crosstalk\n */\nexport default crosstalk;\nglobal.crosstalk = crosstalk;\n","let $ = global.jQuery;\n\nlet bindings = {};\n\nexport function register(reg) {\n bindings[reg.className] = reg;\n if (global.document && global.document.readyState !== \"complete\") {\n $(() => {\n bind();\n });\n } else if (global.document) {\n setTimeout(bind, 100);\n }\n}\n\nexport function bind() {\n Object.keys(bindings).forEach(function(className) {\n let binding = bindings[className];\n $(\".\" + binding.className).not(\".crosstalk-input-bound\").each(function(i, el) {\n bindInstance(binding, el);\n });\n });\n}\n\n// Escape jQuery identifier\nfunction $escape(val) {\n return val.replace(/([!\"#$%&'()*+,./:;<=>?@[\\\\\\]^`{|}~])/g, \"\\\\$1\");\n}\n\nfunction bindEl(el) {\n let $el = $(el);\n Object.keys(bindings).forEach(function(className) {\n if ($el.hasClass(className) && !$el.hasClass(\"crosstalk-input-bound\")) {\n let binding = bindings[className];\n bindInstance(binding, el);\n }\n });\n}\n\nfunction bindInstance(binding, el) {\n let jsonEl = $(el).find(\"script[type='application/json'][data-for='\" + $escape(el.id) + \"']\");\n let data = JSON.parse(jsonEl[0].innerText);\n\n let instance = binding.factory(el, data);\n $(el).data(\"crosstalk-instance\", instance);\n $(el).addClass(\"crosstalk-input-bound\");\n}\n\nif (global.Shiny) {\n let inputBinding = new global.Shiny.InputBinding();\n let $ = global.jQuery;\n $.extend(inputBinding, {\n find: function(scope) {\n return $(scope).find(\".crosstalk-input\");\n },\n initialize: function(el) {\n if (!$(el).hasClass(\"crosstalk-input-bound\")) {\n bindEl(el);\n }\n },\n getId: function(el) {\n return el.id;\n },\n getValue: function(el) {\n\n },\n setValue: function(el, value) {\n\n },\n receiveMessage: function(el, data) {\n\n },\n subscribe: function(el, callback) {\n $(el).data(\"crosstalk-instance\").resume();\n },\n unsubscribe: function(el) {\n $(el).data(\"crosstalk-instance\").suspend();\n }\n });\n global.Shiny.inputBindings.register(inputBinding, \"crosstalk.inputBinding\");\n}\n","import * as input from \"./input\";\nimport { FilterHandle } from \"./filter\";\n\nlet $ = global.jQuery;\n\ninput.register({\n className: \"crosstalk-input-checkboxgroup\",\n\n factory: function(el, data) {\n /*\n * map: {\"groupA\": [\"keyA\", \"keyB\", ...], ...}\n * group: \"ct-groupname\"\n */\n let ctHandle = new FilterHandle(data.group);\n\n let lastKnownKeys;\n let $el = $(el);\n $el.on(\"change\", \"input[type='checkbox']\", function() {\n let checked = $el.find(\"input[type='checkbox']:checked\");\n if (checked.length === 0) {\n lastKnownKeys = null;\n ctHandle.clear();\n } else {\n let keys = {};\n checked.each(function() {\n data.map[this.value].forEach(function(key) {\n keys[key] = true;\n });\n });\n let keyArray = Object.keys(keys);\n keyArray.sort();\n lastKnownKeys = keyArray;\n ctHandle.set(keyArray);\n }\n });\n\n return {\n suspend: function() {\n ctHandle.clear();\n },\n resume: function() {\n if (lastKnownKeys)\n ctHandle.set(lastKnownKeys);\n }\n };\n }\n});\n","import * as input from \"./input\";\nimport * as util from \"./util\";\nimport { FilterHandle } from \"./filter\";\n\nlet $ = global.jQuery;\n\ninput.register({\n className: \"crosstalk-input-select\",\n\n factory: function(el, data) {\n /*\n * items: {value: [...], label: [...]}\n * map: {\"groupA\": [\"keyA\", \"keyB\", ...], ...}\n * group: \"ct-groupname\"\n */\n\n let first = [{value: \"\", label: \"(All)\"}];\n let items = util.dataframeToD3(data.items);\n let opts = {\n options: first.concat(items),\n valueField: \"value\",\n labelField: \"label\",\n searchField: \"label\"\n };\n\n let select = $(el).find(\"select\")[0];\n\n let selectize = $(select).selectize(opts)[0].selectize;\n\n let ctHandle = new FilterHandle(data.group);\n\n let lastKnownKeys;\n selectize.on(\"change\", function() {\n if (selectize.items.length === 0) {\n lastKnownKeys = null;\n ctHandle.clear();\n } else {\n let keys = {};\n selectize.items.forEach(function(group) {\n data.map[group].forEach(function(key) {\n keys[key] = true;\n });\n });\n let keyArray = Object.keys(keys);\n keyArray.sort();\n lastKnownKeys = keyArray;\n ctHandle.set(keyArray);\n }\n });\n\n return {\n suspend: function() {\n ctHandle.clear();\n },\n resume: function() {\n if (lastKnownKeys)\n ctHandle.set(lastKnownKeys);\n }\n };\n }\n});\n","import * as input from \"./input\";\nimport { FilterHandle } from \"./filter\";\n\nlet $ = global.jQuery;\nlet strftime = global.strftime;\n\ninput.register({\n className: \"crosstalk-input-slider\",\n\n factory: function(el, data) {\n /*\n * map: {\"groupA\": [\"keyA\", \"keyB\", ...], ...}\n * group: \"ct-groupname\"\n */\n let ctHandle = new FilterHandle(data.group);\n\n let opts = {};\n let $el = $(el).find(\"input\");\n let dataType = $el.data(\"data-type\");\n let timeFormat = $el.data(\"time-format\");\n let round = $el.data(\"round\");\n let timeFormatter;\n\n // Set up formatting functions\n if (dataType === \"date\") {\n timeFormatter = strftime.utc();\n opts.prettify = function(num) {\n return timeFormatter(timeFormat, new Date(num));\n };\n\n } else if (dataType === \"datetime\") {\n let timezone = $el.data(\"timezone\");\n if (timezone)\n timeFormatter = strftime.timezone(timezone);\n else\n timeFormatter = strftime;\n\n opts.prettify = function(num) {\n return timeFormatter(timeFormat, new Date(num));\n };\n } else if (dataType === \"number\") {\n if (typeof round !== \"undefined\")\n opts.prettify = function(num) {\n let factor = Math.pow(10, round);\n return Math.round(num * factor) / factor;\n };\n }\n\n $el.ionRangeSlider(opts);\n\n function getValue() {\n let result = $el.data(\"ionRangeSlider\").result;\n\n // Function for converting numeric value from slider to appropriate type.\n let convert;\n let dataType = $el.data(\"data-type\");\n if (dataType === \"date\") {\n convert = function(val) {\n return formatDateUTC(new Date(+val));\n };\n } else if (dataType === \"datetime\") {\n convert = function(val) {\n // Convert ms to s\n return +val / 1000;\n };\n } else {\n convert = function(val) { return +val; };\n }\n\n if ($el.data(\"ionRangeSlider\").options.type === \"double\") {\n return [convert(result.from), convert(result.to)];\n } else {\n return convert(result.from);\n }\n }\n\n let lastKnownKeys = null;\n\n $el.on(\"change.crosstalkSliderInput\", function(event) {\n if (!$el.data(\"updating\") && !$el.data(\"animating\")) {\n let [from, to] = getValue();\n let keys = [];\n for (let i = 0; i < data.values.length; i++) {\n let val = data.values[i];\n if (val >= from && val <= to) {\n keys.push(data.keys[i]);\n }\n }\n keys.sort();\n ctHandle.set(keys);\n lastKnownKeys = keys;\n }\n });\n\n\n // let $el = $(el);\n // $el.on(\"change\", \"input[type=\"checkbox\"]\", function() {\n // let checked = $el.find(\"input[type=\"checkbox\"]:checked\");\n // if (checked.length === 0) {\n // ctHandle.clear();\n // } else {\n // let keys = {};\n // checked.each(function() {\n // data.map[this.value].forEach(function(key) {\n // keys[key] = true;\n // });\n // });\n // let keyArray = Object.keys(keys);\n // keyArray.sort();\n // ctHandle.set(keyArray);\n // }\n // });\n\n return {\n suspend: function() {\n ctHandle.clear();\n },\n resume: function() {\n if (lastKnownKeys)\n ctHandle.set(lastKnownKeys);\n }\n };\n }\n});\n\n\n// Convert a number to a string with leading zeros\nfunction padZeros(n, digits) {\n let str = n.toString();\n while (str.length < digits)\n str = \"0\" + str;\n return str;\n}\n\n// Given a Date object, return a string in yyyy-mm-dd format, using the\n// UTC date. This may be a day off from the date in the local time zone.\nfunction formatDateUTC(date) {\n if (date instanceof Date) {\n return date.getUTCFullYear() + \"-\" +\n padZeros(date.getUTCMonth()+1, 2) + \"-\" +\n padZeros(date.getUTCDate(), 2);\n\n } else {\n return null;\n }\n}\n","import Events from \"./events\";\nimport grp from \"./group\";\nimport * as util from \"./util\";\n\n/**\n * Use this class to read and write (and listen for changes to) the selection\n * for a Crosstalk group. This is intended to be used for linked brushing.\n *\n * If two (or more) `SelectionHandle` instances in the same webpage share the\n * same group name, they will share the same state. Setting the selection using\n * one `SelectionHandle` instance will result in the `value` property instantly\n * changing across the others, and `\"change\"` event listeners on all instances\n * (including the one that initiated the sending) will fire.\n *\n * @param {string} [group] - The name of the Crosstalk group, or if none,\n * null or undefined (or any other falsy value). This can be changed later\n * via the [SelectionHandle#setGroup](#setGroup) method.\n * @param {Object} [extraInfo] - An object whose properties will be copied to\n * the event object whenever an event is emitted.\n */\nexport class SelectionHandle {\n\n constructor(group = null, extraInfo = null) {\n this._eventRelay = new Events();\n this._emitter = new util.SubscriptionTracker(this._eventRelay);\n\n // Name of the group we're currently tracking, if any. Can change over time.\n this._group = null;\n // The Var we're currently tracking, if any. Can change over time.\n this._var = null;\n // The event handler subscription we currently have on var.on(\"change\").\n this._varOnChangeSub = null;\n\n this._extraInfo = util.extend({ sender: this }, extraInfo);\n\n this.setGroup(group);\n }\n\n /**\n * Changes the Crosstalk group membership of this SelectionHandle. The group\n * being switched away from (if any) will not have its selection value\n * modified as a result of calling `setGroup`, even if this handle was the\n * most recent handle to set the selection of the group.\n *\n * The group being switched to (if any) will also not have its selection value\n * modified as a result of calling `setGroup`. If you want to set the\n * selection value of the new group, call `set` explicitly.\n *\n * @param {string} group - The name of the Crosstalk group, or null (or\n * undefined) to clear the group.\n */\n setGroup(group) {\n // If group is unchanged, do nothing\n if (this._group === group)\n return;\n // Treat null, undefined, and other falsy values the same\n if (!this._group && !group)\n return;\n\n if (this._var) {\n this._var.off(\"change\", this._varOnChangeSub);\n this._var = null;\n this._varOnChangeSub = null;\n }\n\n this._group = group;\n\n if (group) {\n this._var = grp(group).var(\"selection\");\n let sub = this._var.on(\"change\", (e) => {\n this._eventRelay.trigger(\"change\", e, this);\n });\n this._varOnChangeSub = sub;\n }\n }\n\n /**\n * Retrieves the current selection for the group represented by this\n * `SelectionHandle`.\n *\n * - If no selection is active, then this value will be falsy.\n * - If a selection is active, but no data points are selected, then this\n * value will be an empty array.\n * - If a selection is active, and data points are selected, then the keys\n * of the selected data points will be present in the array.\n */\n get value() {\n return this._var ? this._var.get() : null;\n }\n\n /**\n * Combines the given `extraInfo` (if any) with the handle's default\n * `_extraInfo` (if any).\n * @private\n */\n _mergeExtraInfo(extraInfo) {\n // Important incidental effect: shallow clone is returned\n return util.extend({},\n this._extraInfo ? this._extraInfo : null,\n extraInfo ? extraInfo : null);\n }\n\n /**\n * Overwrites the current selection for the group, and raises the `\"change\"`\n * event among all of the group's '`SelectionHandle` instances (including\n * this one).\n *\n * @fires SelectionHandle#change\n * @param {string[]} selectedKeys - Falsy, empty array, or array of keys (see\n * {@link SelectionHandle#value}).\n * @param {Object} [extraInfo] - Extra properties to be included on the event\n * object that's passed to listeners (in addition to any options that were\n * passed into the `SelectionHandle` constructor).\n */\n set(selectedKeys, extraInfo) {\n if (this._var)\n this._var.set(selectedKeys, this._mergeExtraInfo(extraInfo));\n }\n\n /**\n * Overwrites the current selection for the group, and raises the `\"change\"`\n * event among all of the group's '`SelectionHandle` instances (including\n * this one).\n *\n * @fires SelectionHandle#change\n * @param {Object} [extraInfo] - Extra properties to be included on the event\n * object that's passed to listeners (in addition to any that were passed\n * into the `SelectionHandle` constructor).\n */\n clear(extraInfo) {\n if (this._var)\n this.set(void 0, this._mergeExtraInfo(extraInfo));\n }\n\n /**\n * Subscribes to events on this `SelectionHandle`.\n *\n * @param {string} eventType - Indicates the type of events to listen to.\n * Currently, only `\"change\"` is supported.\n * @param {SelectionHandle~listener} listener - The callback function that\n * will be invoked when the event occurs.\n * @return {string} - A token to pass to {@link SelectionHandle#off} to cancel\n * this subscription.\n */\n on(eventType, listener) {\n return this._emitter.on(eventType, listener);\n }\n\n /**\n * Cancels event subscriptions created by {@link SelectionHandle#on}.\n *\n * @param {string} eventType - The type of event to unsubscribe.\n * @param {string|SelectionHandle~listener} listener - Either the callback\n * function previously passed into {@link SelectionHandle#on}, or the\n * string that was returned from {@link SelectionHandle#on}.\n */\n off(eventType, listener) {\n return this._emitter.off(eventType, listener);\n }\n\n /**\n * Shuts down the `SelectionHandle` object.\n *\n * Removes all event listeners that were added through this handle.\n */\n close() {\n this._emitter.removeAllListeners();\n this.setGroup(null);\n }\n}\n\n/**\n * @callback SelectionHandle~listener\n * @param {Object} event - An object containing details of the event. For\n * `\"change\"` events, this includes the properties `value` (the new\n * value of the selection, or `undefined` if no selection is active),\n * `oldValue` (the previous value of the selection), and `sender` (the\n * `SelectionHandle` instance that made the change).\n */\n\n/**\n * @event SelectionHandle#change\n * @type {object}\n * @property {object} value - The new value of the selection, or `undefined`\n * if no selection is active.\n * @property {object} oldValue - The previous value of the selection.\n * @property {SelectionHandle} sender - The `SelectionHandle` instance that\n * changed the value.\n */\n","export function extend(target, ...sources) {\n for (let i = 0; i < sources.length; i++) {\n let src = sources[i];\n if (typeof(src) === \"undefined\" || src === null)\n continue;\n\n for (let key in src) {\n if (src.hasOwnProperty(key)) {\n target[key] = src[key];\n }\n }\n }\n return target;\n}\n\nexport function checkSorted(list) {\n for (let i = 1; i < list.length; i++) {\n if (list[i] <= list[i-1]) {\n throw new Error(\"List is not sorted or contains duplicate\");\n }\n }\n}\n\nexport function diffSortedLists(a, b) {\n let i_a = 0;\n let i_b = 0;\n\n if (!a) a = [];\n if (!b) b = [];\n\n let a_only = [];\n let b_only = [];\n\n checkSorted(a);\n checkSorted(b);\n\n while (i_a < a.length && i_b < b.length) {\n if (a[i_a] === b[i_b]) {\n i_a++;\n i_b++;\n } else if (a[i_a] < b[i_b]) {\n a_only.push(a[i_a++]);\n } else {\n b_only.push(b[i_b++]);\n }\n }\n\n if (i_a < a.length)\n a_only = a_only.concat(a.slice(i_a));\n if (i_b < b.length)\n b_only = b_only.concat(b.slice(i_b));\n return {\n removed: a_only,\n added: b_only\n };\n}\n\n// Convert from wide: { colA: [1,2,3], colB: [4,5,6], ... }\n// to long: [ {colA: 1, colB: 4}, {colA: 2, colB: 5}, ... ]\nexport function dataframeToD3(df) {\n let names = [];\n let length;\n for (let name in df) {\n if (df.hasOwnProperty(name))\n names.push(name);\n if (typeof(df[name]) !== \"object\" || typeof(df[name].length) === \"undefined\") {\n throw new Error(\"All fields must be arrays\");\n } else if (typeof(length) !== \"undefined\" && length !== df[name].length) {\n throw new Error(\"All fields must be arrays of the same length\");\n }\n length = df[name].length;\n }\n let results = [];\n let item;\n for (let row = 0; row < length; row++) {\n item = {};\n for (let col = 0; col < names.length; col++) {\n item[names[col]] = df[names[col]][row];\n }\n results.push(item);\n }\n return results;\n}\n\n/**\n * Keeps track of all event listener additions/removals and lets all active\n * listeners be removed with a single operation.\n *\n * @private\n */\nexport class SubscriptionTracker {\n constructor(emitter) {\n this._emitter = emitter;\n this._subs = {};\n }\n\n on(eventType, listener) {\n let sub = this._emitter.on(eventType, listener);\n this._subs[sub] = eventType;\n return sub;\n }\n\n off(eventType, listener) {\n let sub = this._emitter.off(eventType, listener);\n if (sub) {\n delete this._subs[sub];\n }\n return sub;\n }\n\n removeAllListeners() {\n let current_subs = this._subs;\n this._subs = {};\n Object.keys(current_subs).forEach((sub) => {\n this._emitter.off(current_subs[sub], sub);\n });\n }\n}\n","import Events from \"./events\";\n\nexport default class Var {\n constructor(group, name, /*optional*/ value) {\n this._group = group;\n this._name = name;\n this._value = value;\n this._events = new Events();\n }\n\n get() {\n return this._value;\n }\n\n set(value, /*optional*/ event) {\n if (this._value === value) {\n // Do nothing; the value hasn't changed\n return;\n }\n let oldValue = this._value;\n this._value = value;\n // Alert JavaScript listeners that the value has changed\n let evt = {};\n if (event && typeof(event) === \"object\") {\n for (let k in event) {\n if (event.hasOwnProperty(k))\n evt[k] = event[k];\n }\n }\n evt.oldValue = oldValue;\n evt.value = value;\n this._events.trigger(\"change\", evt, this);\n\n // TODO: Make this extensible, to let arbitrary back-ends know that\n // something has changed\n if (global.Shiny && global.Shiny.onInputChange) {\n global.Shiny.onInputChange(\n \".clientValue-\" +\n (this._group.name !== null ? this._group.name + \"-\" : \"\") +\n this._name,\n typeof(value) === \"undefined\" ? null : value\n );\n }\n }\n\n on(eventType, listener) {\n return this._events.on(eventType, listener);\n }\n\n off(eventType, listener) {\n return this._events.off(eventType, listener);\n }\n}\n"]} \ No newline at end of file diff --git a/docs/articles/database_of_anor_files/datatables-binding-0.13/datatables.js b/docs/articles/database_of_anor_files/datatables-binding-0.13/datatables.js new file mode 100644 index 0000000..1053375 --- /dev/null +++ b/docs/articles/database_of_anor_files/datatables-binding-0.13/datatables.js @@ -0,0 +1,1320 @@ +(function() { + +// some helper functions: using a global object DTWidget so that it can be used +// in JS() code, e.g. datatable(options = list(foo = JS('code'))); unlike R's +// dynamic scoping, when 'code' is eval()'ed, JavaScript does not know objects +// from the "parent frame", e.g. JS('DTWidget') will not work unless it was made +// a global object +var DTWidget = {}; + +// 123456666.7890 -> 123,456,666.7890 +var markInterval = function(d, digits, interval, mark, decMark, precision) { + x = precision ? d.toPrecision(digits) : d.toFixed(digits); + if (!/^-?[\d.]+$/.test(x)) return x; + var xv = x.split('.'); + if (xv.length > 2) return x; // should have at most one decimal point + xv[0] = xv[0].replace(new RegExp('\\B(?=(\\d{' + interval + '})+(?!\\d))', 'g'), mark); + return xv.join(decMark); +}; + +DTWidget.formatCurrency = function(data, currency, digits, interval, mark, decMark, before) { + var d = parseFloat(data); + if (isNaN(d)) return ''; + var res = markInterval(d, digits, interval, mark, decMark); + res = before ? (/^-/.test(res) ? '-' + currency + res.replace(/^-/, '') : currency + res) : + res + currency; + return res; +}; + +DTWidget.formatString = function(data, prefix, suffix) { + var d = data; + if (d === null) return ''; + return prefix + d + suffix; +}; + +DTWidget.formatPercentage = function(data, digits, interval, mark, decMark) { + var d = parseFloat(data); + if (isNaN(d)) return ''; + return markInterval(d * 100, digits, interval, mark, decMark) + '%'; +}; + +DTWidget.formatRound = function(data, digits, interval, mark, decMark) { + var d = parseFloat(data); + if (isNaN(d)) return ''; + return markInterval(d, digits, interval, mark, decMark); +}; + +DTWidget.formatSignif = function(data, digits, interval, mark, decMark) { + var d = parseFloat(data); + if (isNaN(d)) return ''; + return markInterval(d, digits, interval, mark, decMark, true); +}; + +DTWidget.formatDate = function(data, method, params) { + var d = data; + if (d === null) return ''; + // (new Date('2015-10-28')).toDateString() may return 2015-10-27 because the + // actual time created could be like 'Tue Oct 27 2015 19:00:00 GMT-0500 (CDT)', + // i.e. the date-only string is treated as UTC time instead of local time + if ((method === 'toDateString' || method === 'toLocaleDateString') && /^\d{4,}\D\d{2}\D\d{2}$/.test(d)) { + d = d.split(/\D/); + d = new Date(d[0], d[1] - 1, d[2]); + } else { + d = new Date(d); + } + return d[method].apply(d, params); +}; + +window.DTWidget = DTWidget; + +var transposeArray2D = function(a) { + return a.length === 0 ? a : HTMLWidgets.transposeArray2D(a); +}; + +var crosstalkPluginsInstalled = false; + +function maybeInstallCrosstalkPlugins() { + if (crosstalkPluginsInstalled) + return; + crosstalkPluginsInstalled = true; + + $.fn.dataTable.ext.afnFiltering.push( + function(oSettings, aData, iDataIndex) { + var ctfilter = oSettings.nTable.ctfilter; + if (ctfilter && !ctfilter[iDataIndex]) + return false; + + var ctselect = oSettings.nTable.ctselect; + if (ctselect && !ctselect[iDataIndex]) + return false; + + return true; + } + ); +} + +HTMLWidgets.widget({ + name: "datatables", + type: "output", + renderOnNullValue: true, + initialize: function(el, width, height) { + $(el).html(' '); + return { + data: null, + ctfilterHandle: new crosstalk.FilterHandle(), + ctfilterSubscription: null, + ctselectHandle: new crosstalk.SelectionHandle(), + ctselectSubscription: null + }; + }, + renderValue: function(el, data, instance) { + if (el.offsetWidth === 0 || el.offsetHeight === 0) { + instance.data = data; + return; + } + instance.data = null; + var $el = $(el); + $el.empty(); + + if (data === null) { + $el.append(' '); + // clear previous Shiny inputs (if any) + for (var i in instance.clearInputs) instance.clearInputs[i](); + instance.clearInputs = {}; + return; + } + + var crosstalkOptions = data.crosstalkOptions; + if (!crosstalkOptions) crosstalkOptions = { + 'key': null, 'group': null + }; + if (crosstalkOptions.group) { + maybeInstallCrosstalkPlugins(); + instance.ctfilterHandle.setGroup(crosstalkOptions.group); + instance.ctselectHandle.setGroup(crosstalkOptions.group); + } + + // If we are in a flexdashboard scroll layout then we: + // (a) Always want to use pagination (otherwise we'll have + // a "double scroll bar" effect on the phone); and + // (b) Never want to fill the container (we want the pagination + // level to determine the size of the container) + if (window.FlexDashboard && !window.FlexDashboard.isFillPage()) { + data.options.bPaginate = true; + data.fillContainer = false; + } + + // if we are in the viewer then we always want to fillContainer and + // and autoHideNavigation (unless the user has explicitly set these) + if (window.HTMLWidgets.viewerMode) { + if (!data.hasOwnProperty("fillContainer")) + data.fillContainer = true; + if (!data.hasOwnProperty("autoHideNavigation")) + data.autoHideNavigation = true; + } + + // propagate fillContainer to instance (so we have it in resize) + instance.fillContainer = data.fillContainer; + + var cells = data.data; + + if (cells instanceof Array) cells = transposeArray2D(cells); + + $el.append(data.container); + var $table = $el.find('table'); + if (data.class) $table.addClass(data.class); + if (data.caption) $table.prepend(data.caption); + + if (!data.selection) data.selection = { + mode: 'none', selected: null, target: 'row' + }; + if (HTMLWidgets.shinyMode && data.selection.mode !== 'none' && + data.selection.target === 'row+column') { + if ($table.children('tfoot').length === 0) { + $table.append($('')); + $table.find('thead tr').clone().appendTo($table.find('tfoot')); + } + } + + // column filters + var filterRow; + switch (data.filter) { + case 'top': + $table.children('thead').append(data.filterHTML); + filterRow = $table.find('thead tr:last td'); + break; + case 'bottom': + if ($table.children('tfoot').length === 0) { + $table.append($('')); + } + $table.children('tfoot').prepend(data.filterHTML); + filterRow = $table.find('tfoot tr:first td'); + break; + } + + var options = { searchDelay: 1000 }; + if (cells !== null) $.extend(options, { + data: cells + }); + + // options for fillContainer + var bootstrapActive = typeof($.fn.popover) != 'undefined'; + if (instance.fillContainer) { + + // force scrollX/scrollY and turn off autoWidth + options.scrollX = true; + options.scrollY = "100px"; // can be any value, we'll adjust below + + // if we aren't paginating then move around the info/filter controls + // to save space at the bottom and rephrase the info callback + if (data.options.bPaginate === false) { + + // we know how to do this cleanly for bootstrap, not so much + // for other themes/layouts + if (bootstrapActive) { + options.dom = "<'row'<'col-sm-4'i><'col-sm-8'f>>" + + "<'row'<'col-sm-12'tr>>"; + } + + options.fnInfoCallback = function(oSettings, iStart, iEnd, + iMax, iTotal, sPre) { + return Number(iTotal).toLocaleString() + " records"; + }; + } + } + + // auto hide navigation if requested + if (data.autoHideNavigation === true) { + if (bootstrapActive && data.options.bPaginate !== false) { + // strip all nav if length >= cells + if ((cells instanceof Array) && data.options.iDisplayLength >= cells.length) + options.dom = "<'row'<'col-sm-12'tr>>"; + // alternatively lean things out for flexdashboard mobile portrait + else if (window.FlexDashboard && window.FlexDashboard.isMobilePhone()) + options.dom = "<'row'<'col-sm-12'f>>" + + "<'row'<'col-sm-12'tr>>" + + "<'row'<'col-sm-12'p>>"; + } + } + + $.extend(true, options, data.options || {}); + + var searchCols = options.searchCols; + if (searchCols) { + searchCols = searchCols.map(function(x) { + return x === null ? '' : x.search; + }); + // FIXME: this means I don't respect the escapeRegex setting + delete options.searchCols; + } + + // server-side processing? + var server = options.serverSide === true; + + // use the dataSrc function to pre-process JSON data returned from R + var DT_rows_all = [], DT_rows_current = []; + if (server && HTMLWidgets.shinyMode && typeof options.ajax === 'object' && + /^session\/[\da-z]+\/dataobj/.test(options.ajax.url) && !options.ajax.dataSrc) { + options.ajax.dataSrc = function(json) { + DT_rows_all = $.makeArray(json.DT_rows_all); + DT_rows_current = $.makeArray(json.DT_rows_current); + var data = json.data; + if (!colReorderEnabled()) return data; + var table = $table.DataTable(), order = table.colReorder.order(), flag = true, i, j, row; + for (i = 0; i < order.length; ++i) if (order[i] !== i) flag = false; + if (flag) return data; + for (i = 0; i < data.length; ++i) { + row = data[i].slice(); + for (j = 0; j < order.length; ++j) data[i][j] = row[order[j]]; + } + return data; + }; + } + + var thiz = this; + if (instance.fillContainer) $table.on('init.dt', function(e) { + thiz.fillAvailableHeight(el, $(el).innerHeight()); + }); + // If the page contains serveral datatables and one of which enables colReorder, + // the table.colReorder.order() function will exist but throws error when called. + // So it seems like the only way to know if colReorder is enabled or not is to + // check the options. + var colReorderEnabled = function() { return "colReorder" in options; }; + var table = $table.DataTable(options); + $el.data('datatable', table); + + // Unregister previous Crosstalk event subscriptions, if they exist + if (instance.ctfilterSubscription) { + instance.ctfilterHandle.off("change", instance.ctfilterSubscription); + instance.ctfilterSubscription = null; + } + if (instance.ctselectSubscription) { + instance.ctselectHandle.off("change", instance.ctselectSubscription); + instance.ctselectSubscription = null; + } + + if (!crosstalkOptions.group) { + $table[0].ctfilter = null; + $table[0].ctselect = null; + } else { + var key = crosstalkOptions.key; + function keysToMatches(keys) { + if (!keys) { + return null; + } else { + var selectedKeys = {}; + for (var i = 0; i < keys.length; i++) { + selectedKeys[keys[i]] = true; + } + var matches = {}; + for (var j = 0; j < key.length; j++) { + if (selectedKeys[key[j]]) + matches[j] = true; + } + return matches; + } + } + + function applyCrosstalkFilter(e) { + $table[0].ctfilter = keysToMatches(e.value); + table.draw(); + } + instance.ctfilterSubscription = instance.ctfilterHandle.on("change", applyCrosstalkFilter); + applyCrosstalkFilter({value: instance.ctfilterHandle.filteredKeys}); + + function applyCrosstalkSelection(e) { + if (e.sender !== instance.ctselectHandle) { + table + .rows('.' + selClass, {search: 'applied'}) + .nodes() + .to$() + .removeClass(selClass); + if (selectedRows) + changeInput('rows_selected', selectedRows(), void 0, true); + } + + if (e.sender !== instance.ctselectHandle && e.value && e.value.length) { + var matches = keysToMatches(e.value); + + // persistent selection with plotly (& leaflet) + var ctOpts = crosstalk.var("plotlyCrosstalkOpts").get() || {}; + if (ctOpts.persistent === true) { + var matches = $.extend(matches, $table[0].ctselect); + } + + $table[0].ctselect = matches; + table.draw(); + } else { + if ($table[0].ctselect) { + $table[0].ctselect = null; + table.draw(); + } + } + } + instance.ctselectSubscription = instance.ctselectHandle.on("change", applyCrosstalkSelection); + // TODO: This next line doesn't seem to work when renderDataTable is used + applyCrosstalkSelection({value: instance.ctselectHandle.value}); + } + + var inArray = function(val, array) { + return $.inArray(val, $.makeArray(array)) > -1; + }; + + // encode + to %2B when searching in the table on server side, because + // shiny::parseQueryString() treats + as spaces, and DataTables does not + // encode + to %2B (or % to %25) when sending the request + var encode_plus = function(x) { + return server ? x.replace(/%/g, '%25').replace(/\+/g, '%2B') : x; + }; + + // search the i-th column + var searchColumn = function(i, value) { + var regex = false, ci = true; + if (options.search) { + regex = options.search.regex, + ci = options.search.caseInsensitive !== false; + } + return table.column(i).search(encode_plus(value), regex, !regex, ci); + }; + + if (data.filter !== 'none') { + + filterRow.each(function(i, td) { + + var $td = $(td), type = $td.data('type'), filter; + var $input = $td.children('div').first().children('input'); + $input.prop('disabled', !table.settings()[0].aoColumns[i].bSearchable || type === 'disabled'); + $input.on('input blur', function() { + $input.next('span').toggle(Boolean($input.val())); + }); + // Bootstrap sets pointer-events to none and we won't be able to click + // the clear button + $input.next('span').css('pointer-events', 'auto').hide().click(function() { + $(this).hide().prev('input').val('').trigger('input').focus(); + }); + var searchCol; // search string for this column + if (searchCols && searchCols[i]) { + searchCol = searchCols[i]; + $input.val(searchCol).trigger('input'); + } + var $x = $td.children('div').last(); + + // remove the overflow: hidden attribute of the scrollHead + // (otherwise the scrolling table body obscures the filters) + // The workaround and the discussion from + // https://github.com/rstudio/DT/issues/554#issuecomment-518007347 + // Otherwise the filter selection will not be anchored to the values + // when the columns number is many and scrollX is enabled. + var scrollHead = $(el).find('.dataTables_scrollHead,.dataTables_scrollFoot'); + var cssOverflowHead = scrollHead.css('overflow'); + var scrollBody = $(el).find('.dataTables_scrollBody'); + var cssOverflowBody = scrollBody.css('overflow'); + var scrollTable = $(el).find('.dataTables_scroll'); + var cssOverflowTable = scrollTable.css('overflow'); + if (cssOverflowHead === 'hidden') { + $x.on('show hide', function(e) { + if (e.type === 'show') { + scrollHead.css('overflow', 'visible'); + scrollBody.css('overflow', 'visible'); + scrollTable.css('overflow-x', 'scroll'); + } else { + scrollHead.css('overflow', cssOverflowHead); + scrollBody.css('overflow', cssOverflowBody); + scrollTable.css('overflow-x', cssOverflowTable); + } + }); + $x.css('z-index', 25); + } + + if (inArray(type, ['factor', 'logical'])) { + $input.on({ + click: function() { + $input.parent().hide(); $x.show().trigger('show'); filter[0].selectize.focus(); + }, + input: function() { + if ($input.val() === '') filter[0].selectize.setValue([]); + } + }); + var $input2 = $x.children('select'); + filter = $input2.selectize({ + options: $input2.data('options').map(function(v, i) { + return ({text: v, value: v}); + }), + plugins: ['remove_button'], + hideSelected: true, + onChange: function(value) { + if (value === null) value = []; // compatibility with jQuery 3.0 + $input.val(value.length ? JSON.stringify(value) : ''); + if (value.length) $input.trigger('input'); + $input.attr('title', $input.val()); + if (server) { + table.column(i).search(value.length ? encode_plus(JSON.stringify(value)) : '').draw(); + return; + } + // turn off filter if nothing selected + $td.data('filter', value.length > 0); + table.draw(); // redraw table, and filters will be applied + } + }); + if (searchCol) filter[0].selectize.setValue(JSON.parse(searchCol)); + filter[0].selectize.on('blur', function() { + $x.hide().trigger('hide'); $input.parent().show(); $input.trigger('blur'); + }); + filter.next('div').css('margin-bottom', 'auto'); + } else if (type === 'character') { + var fun = function() { + searchColumn(i, $input.val()).draw(); + }; + if (server) { + fun = $.fn.dataTable.util.throttle(fun, options.searchDelay); + } + $input.on('input', fun); + } else if (inArray(type, ['number', 'integer', 'date', 'time'])) { + var $x0 = $x; + $x = $x0.children('div').first(); + $x0.css({ + 'background-color': '#fff', + 'border': '1px #ddd solid', + 'border-radius': '4px', + 'padding': '20px 20px 10px 20px' + }); + var $spans = $x0.children('span').css({ + 'margin-top': '10px', + 'white-space': 'nowrap' + }); + var $span1 = $spans.first(), $span2 = $spans.last(); + var r1 = +$x.data('min'), r2 = +$x.data('max'); + // when the numbers are too small or have many decimal places, the + // slider may have numeric precision problems (#150) + var scale = Math.pow(10, Math.max(0, +$x.data('scale') || 0)); + r1 = Math.round(r1 * scale); r2 = Math.round(r2 * scale); + var scaleBack = function(x, scale) { + if (scale === 1) return x; + var d = Math.round(Math.log(scale) / Math.log(10)); + // to avoid problems like 3.423/100 -> 0.034230000000000003 + return (x / scale).toFixed(d); + }; + $input.on({ + focus: function() { + $x0.show().trigger('show'); + // first, make sure the slider div leaves at least 20px between + // the two (slider value) span's + $x0.width(Math.max(160, $span1.outerWidth() + $span2.outerWidth() + 20)); + // then, if the input is really wide, make the slider the same + // width as the input + if ($x0.outerWidth() < $input.outerWidth()) { + $x0.outerWidth($input.outerWidth()); + } + // make sure the slider div does not reach beyond the right margin + if ($(window).width() < $x0.offset().left + $x0.width()) { + $x0.offset({ + 'left': $input.offset().left + $input.outerWidth() - $x0.outerWidth() + }); + } + }, + blur: function() { + $x0.hide().trigger('hide'); + }, + input: function() { + if ($input.val() === '') filter.val([r1, r2]); + }, + change: function() { + var v = $input.val().replace(/\s/g, ''); + if (v === '') return; + v = v.split('...'); + if (v.length !== 2) { + $input.parent().addClass('has-error'); + return; + } + if (v[0] === '') v[0] = r1; + if (v[1] === '') v[1] = r2; + $input.parent().removeClass('has-error'); + // treat date as UTC time at midnight + var strTime = function(x) { + var s = type === 'date' ? 'T00:00:00Z' : ''; + var t = new Date(x + s).getTime(); + // add 10 minutes to date since it does not hurt the date, and + // it helps avoid the tricky floating point arithmetic problems, + // e.g. sometimes the date may be a few milliseconds earlier + // than the midnight due to precision problems in noUiSlider + return type === 'date' ? t + 3600000 : t; + }; + if (inArray(type, ['date', 'time'])) { + v[0] = strTime(v[0]); + v[1] = strTime(v[1]); + } + if (v[0] != r1) v[0] *= scale; + if (v[1] != r2) v[1] *= scale; + filter.val(v); + } + }); + var formatDate = function(d, isoFmt) { + d = scaleBack(d, scale); + if (type === 'number') return d; + if (type === 'integer') return parseInt(d); + var x = new Date(+d); + var fmt = ('filterDateFmt' in data) ? data.filterDateFmt[i] : undefined; + if (fmt !== undefined && isoFmt === false) return x[fmt.method].apply(x, fmt.params); + if (type === 'date') { + var pad0 = function(x) { + return ('0' + x).substr(-2, 2); + }; + return x.getUTCFullYear() + '-' + pad0(1 + x.getUTCMonth()) + + '-' + pad0(x.getUTCDate()); + } else { + return x.toISOString(); + } + }; + var opts = type === 'date' ? { step: 60 * 60 * 1000 } : + type === 'integer' ? { step: 1 } : {}; + filter = $x.noUiSlider($.extend({ + start: [r1, r2], + range: {min: r1, max: r2}, + connect: true + }, opts)); + if (scale > 1) (function() { + var t1 = r1, t2 = r2; + var val = filter.val(); + while (val[0] > r1 || val[1] < r2) { + if (val[0] > r1) { + t1 -= val[0] - r1; + } + if (val[1] < r2) { + t2 += r2 - val[1]; + } + filter = $x.noUiSlider($.extend({ + start: [t1, t2], + range: {min: t1, max: t2}, + connect: true + }, opts), true); + val = filter.val(); + } + r1 = t1; r2 = t2; + })(); + var updateSliderText = function(v1, v2) { + $span1.text(formatDate(v1, false)); $span2.text(formatDate(v2, false)); + }; + updateSliderText(r1, r2); + var updateSlider = function(e) { + var val = filter.val(); + // turn off filter if in full range + $td.data('filter', val[0] > r1 || val[1] < r2); + var v1 = formatDate(val[0]), v2 = formatDate(val[1]), ival; + if ($td.data('filter')) { + ival = v1 + ' ... ' + v2; + $input.attr('title', ival).val(ival).trigger('input'); + } else { + $input.attr('title', '').val(''); + } + updateSliderText(val[0], val[1]); + if (e.type === 'slide') return; // no searching when sliding only + if (server) { + table.column(i).search($td.data('filter') ? ival : '').draw(); + return; + } + table.draw(); + }; + filter.on({ + set: updateSlider, + slide: updateSlider + }); + } + + // server-side processing will be handled by R (or whatever server + // language you use); the following code is only needed for client-side + // processing + if (server) { + // if a search string has been pre-set, search now + if (searchCol) searchColumn(i, searchCol).draw(); + return; + } + + var customFilter = function(settings, data, dataIndex) { + // there is no way to attach a search function to a specific table, + // and we need to make sure a global search function is not applied to + // all tables (i.e. a range filter in a previous table should not be + // applied to the current table); we use the settings object to + // determine if we want to perform searching on the current table, + // since settings.sTableId will be different to different tables + if (table.settings()[0] !== settings) return true; + // no filter on this column or no need to filter this column + if (typeof filter === 'undefined' || !$td.data('filter')) return true; + + var r = filter.val(), v, r0, r1; + var i_data = function(i) { + if (!colReorderEnabled()) return i; + var order = table.colReorder.order(), k; + for (k = 0; k < order.length; ++k) if (order[k] === i) return k; + return i; // in theory it will never be here... + } + v = data[i_data(i)]; + if (type === 'number' || type === 'integer') { + v = parseFloat(v); + // how to handle NaN? currently exclude these rows + if (isNaN(v)) return(false); + r0 = parseFloat(scaleBack(r[0], scale)) + r1 = parseFloat(scaleBack(r[1], scale)); + if (v >= r0 && v <= r1) return true; + } else if (type === 'date' || type === 'time') { + v = new Date(v); + r0 = new Date(r[0] / scale); r1 = new Date(r[1] / scale); + if (v >= r0 && v <= r1) return true; + } else if (type === 'factor') { + if (r.length === 0 || inArray(v, r)) return true; + } else if (type === 'logical') { + if (r.length === 0) return true; + if (inArray(v === '' ? 'na' : v, r)) return true; + } + return false; + }; + + $.fn.dataTable.ext.search.push(customFilter); + + // search for the preset search strings if it is non-empty + if (searchCol) { + if (inArray(type, ['factor', 'logical'])) { + filter[0].selectize.setValue(JSON.parse(searchCol)); + } else if (type === 'character') { + $input.trigger('input'); + } else if (inArray(type, ['number', 'integer', 'date', 'time'])) { + $input.trigger('change'); + } + } + + }); + + } + + // highlight search keywords + var highlight = function() { + var body = $(table.table().body()); + // removing the old highlighting first + body.unhighlight(); + + // don't highlight the "not found" row, so we get the rows using the api + if (table.rows({ filter: 'applied' }).data().length === 0) return; + // highlight global search keywords + body.highlight($.trim(table.search()).split(/\s+/)); + // then highlight keywords from individual column filters + if (filterRow) filterRow.each(function(i, td) { + var $td = $(td), type = $td.data('type'); + if (type !== 'character') return; + var $input = $td.children('div').first().children('input'); + var column = table.column(i).nodes().to$(), + val = $.trim($input.val()); + if (type !== 'character' || val === '') return; + column.highlight(val.split(/\s+/)); + }); + }; + + if (options.searchHighlight) { + table + .on('draw.dt.dth column-visibility.dt.dth column-reorder.dt.dth', highlight) + .on('destroy', function() { + // remove event handler + table.off('draw.dt.dth column-visibility.dt.dth column-reorder.dt.dth'); + }); + + // Set the option for escaping regex characters in our search string. This will be used + // for all future matching. + jQuery.fn.highlight.options.escapeRegex = (!options.search || !options.search.regex); + + // initial highlight for state saved conditions and initial states + highlight(); + } + + // run the callback function on the table instance + if (typeof data.callback === 'function') data.callback(table); + + // double click to edit the cell, row, column, or all cells + if (data.editable) table.on('dblclick.dt', 'tbody td', function(e) { + // only bring up the editor when the cell itself is dbclicked, and ignore + // other dbclick events bubbled up (e.g. from the ) + if (e.target !== this) return; + var target = [], immediate = false; + switch (data.editable.target) { + case 'cell': + target = [this]; + immediate = true; // edit will take effect immediately + break; + case 'row': + target = table.cells(table.cell(this).index().row, '*').nodes(); + break; + case 'column': + target = table.cells('*', table.cell(this).index().column).nodes(); + break; + case 'all': + target = table.cells().nodes(); + break; + default: + throw 'The editable parameter must be "cell", "row", "column", or "all"'; + } + var disableCols = data.editable.disable ? data.editable.disable.columns : null; + for (var i = 0; i < target.length; i++) { + (function(cell, current) { + var $cell = $(cell), html = $cell.html(); + var _cell = table.cell(cell), value = _cell.data(); + var $input = $(''), changed = false; + if (!immediate) { + $cell.data('input', $input).data('html', html); + $input.attr('title', 'Hit Ctrl+Enter to finish editing, or Esc to cancel'); + } + $input.val(value); + if (inArray(_cell.index().column, disableCols)) { + $input.attr('readonly', '').css('filter', 'invert(25%)'); + } + $cell.empty().append($input); + if (cell === current) $input.focus(); + $input.css('width', '100%'); + + if (immediate) $input.on('change', function() { + changed = true; + var valueNew = $input.val(); + if (valueNew != value) { + _cell.data(valueNew); + if (HTMLWidgets.shinyMode) { + changeInput('cell_edit', [cellInfo(cell)], 'DT.cellInfo', null, {priority: "event"}); + } + // for server-side processing, users have to call replaceData() to update the table + if (!server) table.draw(false); + } else { + $cell.html(html); + } + $input.remove(); + }).on('blur', function() { + if (!changed) $input.trigger('change'); + }).on('keyup', function(e) { + // hit Escape to cancel editing + if (e.keyCode === 27) $input.trigger('blur'); + }); + + // bulk edit (row, column, or all) + if (!immediate) $input.on('keyup', function(e) { + var removeInput = function($cell, restore) { + $cell.data('input').remove(); + if (restore) $cell.html($cell.data('html')); + } + if (e.keyCode === 27) { + for (var i = 0; i < target.length; i++) { + removeInput($(target[i]), true); + } + } else if (e.keyCode === 13 && e.ctrlKey) { + // Ctrl + Enter + var cell, $cell, _cell, cellData = []; + for (var i = 0; i < target.length; i++) { + cell = target[i]; $cell = $(cell); _cell = table.cell(cell); + _cell.data($cell.data('input').val()); + HTMLWidgets.shinyMode && cellData.push(cellInfo(cell)); + removeInput($cell, false); + } + if (HTMLWidgets.shinyMode) { + changeInput('cell_edit', cellData, 'DT.cellInfo', null, {priority: "event"}); + } + if (!server) table.draw(false); + } + }); + })(target[i], this); + } + }); + + // interaction with shiny + if (!HTMLWidgets.shinyMode && !crosstalkOptions.group) return; + + var methods = {}; + var shinyData = {}; + + methods.updateCaption = function(caption) { + if (!caption) return; + $table.children('caption').replaceWith(caption); + } + + // register clear functions to remove input values when the table is removed + instance.clearInputs = {}; + + var changeInput = function(id, value, type, noCrosstalk, opts) { + var event = id; + id = el.id + '_' + id; + if (type) id = id + ':' + type; + // do not update if the new value is the same as old value + if (event !== 'cell_edit' && shinyData.hasOwnProperty(id) && shinyData[id] === JSON.stringify(value)) + return; + shinyData[id] = JSON.stringify(value); + if (HTMLWidgets.shinyMode && Shiny.setInputValue) { + Shiny.setInputValue(id, value, opts); + if (!instance.clearInputs[id]) instance.clearInputs[id] = function() { + Shiny.setInputValue(id, null); + } + } + + // HACK + if (event === "rows_selected" && !noCrosstalk) { + if (crosstalkOptions.group) { + var keys = crosstalkOptions.key; + var selectedKeys = null; + if (value) { + selectedKeys = []; + for (var i = 0; i < value.length; i++) { + // The value array's contents use 1-based row numbers, so we must + // convert to 0-based before indexing into the keys array. + selectedKeys.push(keys[value[i] - 1]); + } + } + instance.ctselectHandle.set(selectedKeys); + } + } + }; + + var addOne = function(x) { + return x.map(function(i) { return 1 + i; }); + }; + + var unique = function(x) { + var ux = []; + $.each(x, function(i, el){ + if ($.inArray(el, ux) === -1) ux.push(el); + }); + return ux; + } + + // change the row index of a cell + var tweakCellIndex = function(cell) { + var info = cell.index(); + // some cell may not be valid. e.g, #759 + // when using the RowGroup extension, datatables will + // generate the row label and the cells are not part of + // the data thus contain no row/col info + if (info === undefined) + return {row: null, col: null}; + if (server) { + info.row = DT_rows_current[info.row]; + } else { + info.row += 1; + } + return {row: info.row, col: info.column}; + } + + // a flag to indicates if select extension is initialized or not + var flagSelectExt = table.settings()[0]._select !== undefined; + // the Select extension should only be used in the client mode and + // when the selection.mode is set to none + if (data.selection.mode === 'none' && !server && flagSelectExt) { + var updateRowsSelected = function() { + var rows = table.rows({selected: true}); + var selected = []; + $.each(rows.indexes().toArray(), function(i, v) { + selected.push(v + 1); + }); + changeInput('rows_selected', selected); + } + var updateColsSelected = function() { + var columns = table.columns({selected: true}); + changeInput('columns_selected', columns.indexes().toArray()); + } + var updateCellsSelected = function() { + var cells = table.cells({selected: true}); + var selected = []; + cells.every(function() { + var row = this.index().row; + var col = this.index().column; + selected = selected.concat([[row + 1, col]]); + }); + changeInput('cells_selected', transposeArray2D(selected), 'shiny.matrix'); + } + table.on('select deselect', function(e, dt, type, indexes) { + updateRowsSelected(); + updateColsSelected(); + updateCellsSelected(); + }) + } + + var selMode = data.selection.mode, selTarget = data.selection.target; + if (inArray(selMode, ['single', 'multiple'])) { + var selClass = inArray(data.style, ['bootstrap', 'bootstrap4']) ? 'active' : 'selected'; + var selected = data.selection.selected, selected1, selected2; + // selected1: row indices; selected2: column indices + if (selected === null) { + selected1 = selected2 = []; + } else if (selTarget === 'row') { + selected1 = $.makeArray(selected); + } else if (selTarget === 'column') { + selected2 = $.makeArray(selected); + } else if (selTarget === 'row+column') { + selected1 = $.makeArray(selected.rows); + selected2 = $.makeArray(selected.cols); + } + + // After users reorder the rows or filter the table, we cannot use the table index + // directly. Instead, we need this function to find out the rows between the two clicks. + // If user filter the table again between the start click and the end click, the behavior + // would be undefined, but it should not be a problem. + var shiftSelRowsIndex = function(start, end) { + var indexes = server ? DT_rows_all : table.rows({ search: 'applied' }).indexes().toArray(); + start = indexes.indexOf(start); end = indexes.indexOf(end); + // if start is larger than end, we need to swap + if (start > end) { + var tmp = end; end = start; start = tmp; + } + return indexes.slice(start, end + 1); + } + + var serverRowIndex = function(clientRowIndex) { + return server ? DT_rows_current[clientRowIndex] : clientRowIndex + 1; + } + + // row, column, or cell selection + var lastClickedRow; + if (inArray(selTarget, ['row', 'row+column'])) { + var selectedRows = function() { + var rows = table.rows('.' + selClass); + var idx = rows.indexes().toArray(); + if (!server) return addOne(idx); + idx = idx.map(function(i) { + return DT_rows_current[i]; + }); + selected1 = selMode === 'multiple' ? unique(selected1.concat(idx)) : idx; + return selected1; + } + table.on('mousedown.dt', 'tbody tr', function(e) { + var $this = $(this), thisRow = table.row(this); + if (selMode === 'multiple') { + if (e.shiftKey && lastClickedRow !== undefined) { + // select or de-select depends on the last clicked row's status + var flagSel = !$this.hasClass(selClass); + var crtClickedRow = serverRowIndex(thisRow.index()); + if (server) { + var rowsIndex = shiftSelRowsIndex(lastClickedRow, crtClickedRow); + // update current page's selClass + rowsIndex.map(function(i) { + var rowIndex = DT_rows_current.indexOf(i); + if (rowIndex >= 0) { + var row = table.row(rowIndex).nodes().to$(); + var flagRowSel = !row.hasClass(selClass); + if (flagSel === flagRowSel) row.toggleClass(selClass); + } + }); + // update selected1 + if (flagSel) { + selected1 = unique(selected1.concat(rowsIndex)); + } else { + selected1 = selected1.filter(function(index) { + return !inArray(index, rowsIndex); + }); + } + } else { + // js starts from 0 + shiftSelRowsIndex(lastClickedRow - 1, crtClickedRow - 1).map(function(value) { + var row = table.row(value).nodes().to$(); + var flagRowSel = !row.hasClass(selClass); + if (flagSel === flagRowSel) row.toggleClass(selClass); + }); + } + e.preventDefault(); + } else { + $this.toggleClass(selClass); + } + } else { + if ($this.hasClass(selClass)) { + $this.removeClass(selClass); + } else { + table.$('tr.' + selClass).removeClass(selClass); + $this.addClass(selClass); + } + } + if (server && !$this.hasClass(selClass)) { + var id = DT_rows_current[thisRow.index()]; + // remove id from selected1 since its class .selected has been removed + if (inArray(id, selected1)) selected1.splice($.inArray(id, selected1), 1); + } + changeInput('rows_selected', selectedRows()); + changeInput('row_last_clicked', serverRowIndex(thisRow.index())); + lastClickedRow = serverRowIndex(thisRow.index()); + }); + changeInput('rows_selected', selected1); + var selectRows = function() { + table.$('tr.' + selClass).removeClass(selClass); + if (selected1.length === 0) return; + if (server) { + table.rows({page: 'current'}).every(function() { + if (inArray(DT_rows_current[this.index()], selected1)) { + $(this.node()).addClass(selClass); + } + }); + } else { + var selected0 = selected1.map(function(i) { return i - 1; }); + $(table.rows(selected0).nodes()).addClass(selClass); + } + } + selectRows(); // in case users have specified pre-selected rows + // restore selected rows after the table is redrawn (e.g. sort/search/page); + // client-side tables will preserve the selections automatically; for + // server-side tables, we have to *real* row indices are in `selected1` + if (server) table.on('draw.dt', selectRows); + methods.selectRows = function(selected) { + selected1 = $.makeArray(selected); + selectRows(); + changeInput('rows_selected', selected1); + } + } + + if (inArray(selTarget, ['column', 'row+column'])) { + if (selTarget === 'row+column') { + $(table.columns().footer()).css('cursor', 'pointer'); + } + var callback = function() { + var colIdx = selTarget === 'column' ? table.cell(this).index().column : + $.inArray(this, table.columns().footer()), + thisCol = $(table.column(colIdx).nodes()); + if (colIdx === -1) return; + if (thisCol.hasClass(selClass)) { + thisCol.removeClass(selClass); + selected2.splice($.inArray(colIdx, selected2), 1); + } else { + if (selMode === 'single') $(table.cells().nodes()).removeClass(selClass); + thisCol.addClass(selClass); + selected2 = selMode === 'single' ? [colIdx] : unique(selected2.concat([colIdx])); + } + changeInput('columns_selected', selected2); + } + if (selTarget === 'column') { + $(table.table().body()).on('click.dt', 'td', callback); + } else { + $(table.table().footer()).on('click.dt', 'tr th', callback); + } + changeInput('columns_selected', selected2); + var selectCols = function() { + table.columns().nodes().flatten().to$().removeClass(selClass); + if (selected2.length > 0) + table.columns(selected2).nodes().flatten().to$().addClass(selClass); + } + selectCols(); // in case users have specified pre-selected columns + if (server) table.on('draw.dt', selectCols); + methods.selectColumns = function(selected) { + selected2 = $.makeArray(selected); + selectCols(); + changeInput('columns_selected', selected2); + } + } + + if (selTarget === 'cell') { + var selected3; + if (selected === null) { + selected3 = []; + } else { + selected3 = selected; + } + var findIndex = function(ij) { + for (var i = 0; i < selected3.length; i++) { + if (ij[0] === selected3[i][0] && ij[1] === selected3[i][1]) return i; + } + return -1; + } + table.on('click.dt', 'tbody td', function() { + var $this = $(this), info = tweakCellIndex(table.cell(this)); + if ($this.hasClass(selClass)) { + $this.removeClass(selClass); + selected3.splice(findIndex([info.row, info.col]), 1); + } else { + if (selMode === 'single') $(table.cells().nodes()).removeClass(selClass); + $this.addClass(selClass); + selected3 = selMode === 'single' ? [[info.row, info.col]] : + unique(selected3.concat([[info.row, info.col]])); + } + changeInput('cells_selected', transposeArray2D(selected3), 'shiny.matrix'); + }); + changeInput('cells_selected', transposeArray2D(selected3), 'shiny.matrix'); + var selectCells = function() { + table.$('td.' + selClass).removeClass(selClass); + if (selected3.length === 0) return; + if (server) { + table.cells({page: 'current'}).every(function() { + var info = tweakCellIndex(this); + if (findIndex([info.row, info.col], selected3) > -1) + $(this.node()).addClass(selClass); + }); + } else { + selected3.map(function(ij) { + $(table.cell(ij[0] - 1, ij[1]).node()).addClass(selClass); + }); + } + }; + selectCells(); // in case users have specified pre-selected columns + if (server) table.on('draw.dt', selectCells); + methods.selectCells = function(selected) { + selected3 = selected ? selected : []; + selectCells(); + changeInput('cells_selected', transposeArray2D(selected3), 'shiny.matrix'); + } + } + } + + // expose some table info to Shiny + var updateTableInfo = function(e, settings) { + // TODO: is anyone interested in the page info? + // changeInput('page_info', table.page.info()); + var updateRowInfo = function(id, modifier) { + var idx; + if (server) { + idx = modifier.page === 'current' ? DT_rows_current : DT_rows_all; + } else { + var rows = table.rows($.extend({ + search: 'applied', + page: 'all' + }, modifier)); + idx = addOne(rows.indexes().toArray()); + } + changeInput('rows' + '_' + id, idx); + }; + updateRowInfo('current', {page: 'current'}); + updateRowInfo('all', {}); + } + table.on('draw.dt', updateTableInfo); + updateTableInfo(); + + // state info + table.on('draw.dt column-visibility.dt', function() { + changeInput('state', table.state()); + }); + changeInput('state', table.state()); + + // search info + var updateSearchInfo = function() { + changeInput('search', table.search()); + if (filterRow) changeInput('search_columns', filterRow.toArray().map(function(td) { + return $(td).find('input').first().val(); + })); + } + table.on('draw.dt', updateSearchInfo); + updateSearchInfo(); + + var cellInfo = function(thiz) { + var info = tweakCellIndex(table.cell(thiz)); + info.value = table.cell(thiz).data(); + return info; + } + // the current cell clicked on + table.on('click.dt', 'tbody td', function() { + changeInput('cell_clicked', cellInfo(this)); + }) + changeInput('cell_clicked', {}); + + // do not trigger table selection when clicking on links unless they have classes + table.on('click.dt', 'tbody td a', function(e) { + if (this.className === '') e.stopPropagation(); + }); + + methods.addRow = function(data, rowname) { + var data0 = table.row(0).data(), n = data0.length, d = n - data.length; + if (d === 1) { + data = rowname.concat(data) + } else if (d !== 0) { + console.log(data); + console.log(data0); + throw 'New data must be of the same length as current data (' + n + ')'; + }; + table.row.add(data).draw(); + } + + methods.updateSearch = function(keywords) { + if (keywords.global !== null) + $(table.table().container()).find('input[type=search]').first() + .val(keywords.global).trigger('input'); + var columns = keywords.columns; + if (!filterRow || columns === null) return; + filterRow.toArray().map(function(td, i) { + var v = typeof columns === 'string' ? columns : columns[i]; + if (typeof v === 'undefined') { + console.log('The search keyword for column ' + i + ' is undefined') + return; + } + $(td).find('input').first().val(v); + searchColumn(i, v); + }); + table.draw(); + } + + methods.hideCols = function(hide, reset) { + if (reset) table.columns().visible(true, false); + table.columns(hide).visible(false); + } + + methods.showCols = function(show, reset) { + if (reset) table.columns().visible(false, false); + table.columns(show).visible(true); + } + + methods.colReorder = function(order, origOrder) { + table.colReorder.order(order, origOrder); + } + + methods.selectPage = function(page) { + if (table.page.info().pages < page || page < 1) { + throw 'Selected page is out of range'; + }; + table.page(page - 1).draw(false); + } + + methods.reloadData = function(resetPaging, clearSelection) { + // empty selections first if necessary + if (methods.selectRows && inArray('row', clearSelection)) methods.selectRows([]); + if (methods.selectColumns && inArray('column', clearSelection)) methods.selectColumns([]); + if (methods.selectCells && inArray('cell', clearSelection)) methods.selectCells([]); + table.ajax.reload(null, resetPaging); + } + + table.shinyMethods = methods; + }, + resize: function(el, width, height, instance) { + if (instance.data) this.renderValue(el, instance.data, instance); + + // dynamically adjust height if fillContainer = TRUE + if (instance.fillContainer) + this.fillAvailableHeight(el, height); + + this.adjustWidth(el); + }, + + // dynamically set the scroll body to fill available height + // (used with fillContainer = TRUE) + fillAvailableHeight: function(el, availableHeight) { + + // see how much of the table is occupied by header/footer elements + // and use that to compute a target scroll body height + var dtWrapper = $(el).find('div.dataTables_wrapper'); + var dtScrollBody = $(el).find($('div.dataTables_scrollBody')); + var framingHeight = dtWrapper.innerHeight() - dtScrollBody.innerHeight(); + var scrollBodyHeight = availableHeight - framingHeight; + + // set the height + dtScrollBody.height(scrollBodyHeight + 'px'); + }, + + // adjust the width of columns; remove the hard-coded widths on table and the + // scroll header when scrollX/Y are enabled + adjustWidth: function(el) { + var $el = $(el), table = $el.data('datatable'); + if (table) table.columns.adjust(); + $el.find('.dataTables_scrollHeadInner').css('width', '') + .children('table').css('margin-left', ''); + } +}); + + if (!HTMLWidgets.shinyMode) return; + + Shiny.addCustomMessageHandler('datatable-calls', function(data) { + var id = data.id; + var el = document.getElementById(id); + var table = el ? $(el).data('datatable') : null; + if (!table) { + console.log("Couldn't find table with id " + id); + return; + } + + var methods = table.shinyMethods, call = data.call; + if (methods[call.method]) { + methods[call.method].apply(table, call.args); + } else { + console.log("Unknown method " + call.method); + } + }); + +})(); diff --git a/docs/articles/database_of_anor_files/datatables-css-0.0.0/datatables-crosstalk.css b/docs/articles/database_of_anor_files/datatables-css-0.0.0/datatables-crosstalk.css new file mode 100644 index 0000000..fb5bae8 --- /dev/null +++ b/docs/articles/database_of_anor_files/datatables-css-0.0.0/datatables-crosstalk.css @@ -0,0 +1,23 @@ +.dt-crosstalk-fade { + opacity: 0.2; +} + +html body div.DTS div.dataTables_scrollBody { + background: none; +} + + +/* +Fix https://github.com/rstudio/DT/issues/563 +If the `table.display` is set to "block" (e.g., pkgdown), the browser will display +datatable objects strangely. The search panel and the page buttons will still be +in full-width but the table body will be "compact" and shorter. +In therory, having this attributes will affect `dom="t"` +with `display: block` users. But in reality, there should be no one. +We may remove the below lines in the future if the upstream agree to have this there. +See https://github.com/DataTables/DataTablesSrc/issues/160 +*/ + +table.dataTable { + display: table; +} diff --git a/docs/articles/database_of_anor_files/dt-core-1.10.20/css/jquery.dataTables.extra.css b/docs/articles/database_of_anor_files/dt-core-1.10.20/css/jquery.dataTables.extra.css new file mode 100644 index 0000000..b2dd141 --- /dev/null +++ b/docs/articles/database_of_anor_files/dt-core-1.10.20/css/jquery.dataTables.extra.css @@ -0,0 +1,28 @@ +/* Selected rows/cells */ +table.dataTable tr.selected td, table.dataTable td.selected { + background-color: #b0bed9 !important; +} +/* In case of scrollX/Y or FixedHeader */ +.dataTables_scrollBody .dataTables_sizing { + visibility: hidden; +} + +/* The datatables' theme CSS file doesn't define +the color but with white background. It leads to an issue that +when the HTML's body color is set to 'white', the user can't +see the text since the background is white. One case happens in the +RStudio's IDE when inline viewing the DT table inside an Rmd file, +if the IDE theme is set to "Cobalt". + +See https://github.com/rstudio/DT/issues/447 for more info + +This fixes should have little side-effects because all the other elements +of the default theme use the #333 font color. + +TODO: The upstream may use relative colors for both the table background +and the color. It means the table can display well without this patch +then. At that time, we need to remove the below CSS attributes. +*/ +div.datatables { + color: #333; +} diff --git a/docs/articles/database_of_anor_files/dt-core-1.10.20/css/jquery.dataTables.min.css b/docs/articles/database_of_anor_files/dt-core-1.10.20/css/jquery.dataTables.min.css new file mode 100644 index 0000000..71ae98a --- /dev/null +++ b/docs/articles/database_of_anor_files/dt-core-1.10.20/css/jquery.dataTables.min.css @@ -0,0 +1 @@ +table.dataTable{width:100%;margin:0 auto;clear:both;border-collapse:separate;border-spacing:0}table.dataTable thead th,table.dataTable tfoot th{font-weight:bold}table.dataTable thead th,table.dataTable thead td{padding:10px 18px;border-bottom:1px solid #111}table.dataTable thead th:active,table.dataTable thead td:active{outline:none}table.dataTable tfoot th,table.dataTable tfoot td{padding:10px 18px 6px 18px;border-top:1px solid #111}table.dataTable thead .sorting,table.dataTable thead .sorting_asc,table.dataTable thead .sorting_desc,table.dataTable thead .sorting_asc_disabled,table.dataTable thead .sorting_desc_disabled{cursor:pointer;*cursor:hand;background-repeat:no-repeat;background-position:center right}table.dataTable thead .sorting{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABMAAAATCAQAAADYWf5HAAAAkElEQVQoz7XQMQ5AQBCF4dWQSJxC5wwax1Cq1e7BAdxD5SL+Tq/QCM1oNiJidwox0355mXnG/DrEtIQ6azioNZQxI0ykPhTQIwhCR+BmBYtlK7kLJYwWCcJA9M4qdrZrd8pPjZWPtOqdRQy320YSV17OatFC4euts6z39GYMKRPCTKY9UnPQ6P+GtMRfGtPnBCiqhAeJPmkqAAAAAElFTkSuQmCC)}table.dataTable thead .sorting_asc{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABMAAAATCAYAAAByUDbMAAAAZ0lEQVQ4y2NgGLKgquEuFxBPAGI2ahhWCsS/gDibUoO0gPgxEP8H4ttArEyuQYxAPBdqEAxPBImTY5gjEL9DM+wTENuQahAvEO9DMwiGdwAxOymGJQLxTyD+jgWDxCMZRsEoGAVoAADeemwtPcZI2wAAAABJRU5ErkJggg==)}table.dataTable thead .sorting_desc{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABMAAAATCAYAAAByUDbMAAAAZUlEQVQ4y2NgGAWjYBSggaqGu5FA/BOIv2PBIPFEUgxjB+IdQPwfC94HxLykus4GiD+hGfQOiB3J8SojEE9EM2wuSJzcsFMG4ttQgx4DsRalkZENxL+AuJQaMcsGxBOAmGvopk8AVz1sLZgg0bsAAAAASUVORK5CYII=)}table.dataTable thead .sorting_asc_disabled{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABMAAAATCAQAAADYWf5HAAAAW0lEQVQoz2NgoCm4w3Vnwh02wspK7/y6k01Ikdadx3f+37l9RxmfIsY7c4GKQHDiHUbcyhzvvIMq+3THBpci3jv7oIpAcMcdduzKEu/8vPMdDn/eiWQYBYMKAAC3ykIEuYQJUgAAAABJRU5ErkJggg==)}table.dataTable thead .sorting_desc_disabled{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABMAAAATCAQAAADYWf5HAAAAWUlEQVQoz2NgGAWDCtyJvPPzznc4/HknEbsy9js77vyHw313eHGZZ3PnE1TRuzuOuK1lvDMRqmzuHUZ87lO+cxuo6PEdLUIeyb7z604pYf+y3Zlwh4u2YQoAc7ZCBHH4jigAAAAASUVORK5CYII=)}table.dataTable tbody tr{background-color:#ffffff}table.dataTable tbody tr.selected{background-color:#B0BED9}table.dataTable tbody th,table.dataTable tbody td{padding:8px 10px}table.dataTable.row-border tbody th,table.dataTable.row-border tbody td,table.dataTable.display tbody th,table.dataTable.display tbody td{border-top:1px solid #ddd}table.dataTable.row-border tbody tr:first-child th,table.dataTable.row-border tbody tr:first-child td,table.dataTable.display tbody tr:first-child th,table.dataTable.display tbody tr:first-child td{border-top:none}table.dataTable.cell-border tbody th,table.dataTable.cell-border tbody td{border-top:1px solid #ddd;border-right:1px solid #ddd}table.dataTable.cell-border tbody tr th:first-child,table.dataTable.cell-border tbody tr td:first-child{border-left:1px solid #ddd}table.dataTable.cell-border tbody tr:first-child th,table.dataTable.cell-border tbody tr:first-child td{border-top:none}table.dataTable.stripe tbody tr.odd,table.dataTable.display tbody tr.odd{background-color:#f9f9f9}table.dataTable.stripe tbody tr.odd.selected,table.dataTable.display tbody tr.odd.selected{background-color:#acbad4}table.dataTable.hover tbody tr:hover,table.dataTable.display tbody tr:hover{background-color:#f6f6f6}table.dataTable.hover tbody tr:hover.selected,table.dataTable.display tbody tr:hover.selected{background-color:#aab7d1}table.dataTable.order-column tbody tr>.sorting_1,table.dataTable.order-column tbody tr>.sorting_2,table.dataTable.order-column tbody tr>.sorting_3,table.dataTable.display tbody tr>.sorting_1,table.dataTable.display tbody tr>.sorting_2,table.dataTable.display tbody tr>.sorting_3{background-color:#fafafa}table.dataTable.order-column tbody tr.selected>.sorting_1,table.dataTable.order-column tbody tr.selected>.sorting_2,table.dataTable.order-column tbody tr.selected>.sorting_3,table.dataTable.display tbody tr.selected>.sorting_1,table.dataTable.display tbody tr.selected>.sorting_2,table.dataTable.display tbody tr.selected>.sorting_3{background-color:#acbad5}table.dataTable.display tbody tr.odd>.sorting_1,table.dataTable.order-column.stripe tbody tr.odd>.sorting_1{background-color:#f1f1f1}table.dataTable.display tbody tr.odd>.sorting_2,table.dataTable.order-column.stripe tbody tr.odd>.sorting_2{background-color:#f3f3f3}table.dataTable.display tbody tr.odd>.sorting_3,table.dataTable.order-column.stripe tbody tr.odd>.sorting_3{background-color:whitesmoke}table.dataTable.display tbody tr.odd.selected>.sorting_1,table.dataTable.order-column.stripe tbody tr.odd.selected>.sorting_1{background-color:#a6b4cd}table.dataTable.display tbody tr.odd.selected>.sorting_2,table.dataTable.order-column.stripe tbody tr.odd.selected>.sorting_2{background-color:#a8b5cf}table.dataTable.display tbody tr.odd.selected>.sorting_3,table.dataTable.order-column.stripe tbody tr.odd.selected>.sorting_3{background-color:#a9b7d1}table.dataTable.display tbody tr.even>.sorting_1,table.dataTable.order-column.stripe tbody tr.even>.sorting_1{background-color:#fafafa}table.dataTable.display tbody tr.even>.sorting_2,table.dataTable.order-column.stripe tbody tr.even>.sorting_2{background-color:#fcfcfc}table.dataTable.display tbody tr.even>.sorting_3,table.dataTable.order-column.stripe tbody tr.even>.sorting_3{background-color:#fefefe}table.dataTable.display tbody tr.even.selected>.sorting_1,table.dataTable.order-column.stripe tbody tr.even.selected>.sorting_1{background-color:#acbad5}table.dataTable.display tbody tr.even.selected>.sorting_2,table.dataTable.order-column.stripe tbody tr.even.selected>.sorting_2{background-color:#aebcd6}table.dataTable.display tbody tr.even.selected>.sorting_3,table.dataTable.order-column.stripe tbody tr.even.selected>.sorting_3{background-color:#afbdd8}table.dataTable.display tbody tr:hover>.sorting_1,table.dataTable.order-column.hover tbody tr:hover>.sorting_1{background-color:#eaeaea}table.dataTable.display tbody tr:hover>.sorting_2,table.dataTable.order-column.hover tbody tr:hover>.sorting_2{background-color:#ececec}table.dataTable.display tbody tr:hover>.sorting_3,table.dataTable.order-column.hover tbody tr:hover>.sorting_3{background-color:#efefef}table.dataTable.display tbody tr:hover.selected>.sorting_1,table.dataTable.order-column.hover tbody tr:hover.selected>.sorting_1{background-color:#a2aec7}table.dataTable.display tbody tr:hover.selected>.sorting_2,table.dataTable.order-column.hover tbody tr:hover.selected>.sorting_2{background-color:#a3b0c9}table.dataTable.display tbody tr:hover.selected>.sorting_3,table.dataTable.order-column.hover tbody tr:hover.selected>.sorting_3{background-color:#a5b2cb}table.dataTable.no-footer{border-bottom:1px solid #111}table.dataTable.nowrap th,table.dataTable.nowrap td{white-space:nowrap}table.dataTable.compact thead th,table.dataTable.compact thead td{padding:4px 17px 4px 4px}table.dataTable.compact tfoot th,table.dataTable.compact tfoot td{padding:4px}table.dataTable.compact tbody th,table.dataTable.compact tbody td{padding:4px}table.dataTable th.dt-left,table.dataTable td.dt-left{text-align:left}table.dataTable th.dt-center,table.dataTable td.dt-center,table.dataTable td.dataTables_empty{text-align:center}table.dataTable th.dt-right,table.dataTable td.dt-right{text-align:right}table.dataTable th.dt-justify,table.dataTable td.dt-justify{text-align:justify}table.dataTable th.dt-nowrap,table.dataTable td.dt-nowrap{white-space:nowrap}table.dataTable thead th.dt-head-left,table.dataTable thead td.dt-head-left,table.dataTable tfoot th.dt-head-left,table.dataTable tfoot td.dt-head-left{text-align:left}table.dataTable thead th.dt-head-center,table.dataTable thead td.dt-head-center,table.dataTable tfoot th.dt-head-center,table.dataTable tfoot td.dt-head-center{text-align:center}table.dataTable thead th.dt-head-right,table.dataTable thead td.dt-head-right,table.dataTable tfoot th.dt-head-right,table.dataTable tfoot td.dt-head-right{text-align:right}table.dataTable thead th.dt-head-justify,table.dataTable thead td.dt-head-justify,table.dataTable tfoot th.dt-head-justify,table.dataTable tfoot td.dt-head-justify{text-align:justify}table.dataTable thead th.dt-head-nowrap,table.dataTable thead td.dt-head-nowrap,table.dataTable tfoot th.dt-head-nowrap,table.dataTable tfoot td.dt-head-nowrap{white-space:nowrap}table.dataTable tbody th.dt-body-left,table.dataTable tbody td.dt-body-left{text-align:left}table.dataTable tbody th.dt-body-center,table.dataTable tbody td.dt-body-center{text-align:center}table.dataTable tbody th.dt-body-right,table.dataTable tbody td.dt-body-right{text-align:right}table.dataTable tbody th.dt-body-justify,table.dataTable tbody td.dt-body-justify{text-align:justify}table.dataTable tbody th.dt-body-nowrap,table.dataTable tbody td.dt-body-nowrap{white-space:nowrap}table.dataTable,table.dataTable th,table.dataTable td{box-sizing:content-box}.dataTables_wrapper{position:relative;clear:both;*zoom:1;zoom:1}.dataTables_wrapper .dataTables_length{float:left}.dataTables_wrapper .dataTables_filter{float:right;text-align:right}.dataTables_wrapper .dataTables_filter input{margin-left:0.5em}.dataTables_wrapper .dataTables_info{clear:both;float:left;padding-top:0.755em}.dataTables_wrapper .dataTables_paginate{float:right;text-align:right;padding-top:0.25em}.dataTables_wrapper .dataTables_paginate .paginate_button{box-sizing:border-box;display:inline-block;min-width:1.5em;padding:0.5em 1em;margin-left:2px;text-align:center;text-decoration:none !important;cursor:pointer;*cursor:hand;color:#333 !important;border:1px solid transparent;border-radius:2px}.dataTables_wrapper .dataTables_paginate .paginate_button.current,.dataTables_wrapper .dataTables_paginate .paginate_button.current:hover{color:#333 !important;border:1px solid #979797;background-color:white;background:-webkit-gradient(linear, left top, left bottom, color-stop(0%, #fff), color-stop(100%, #dcdcdc));background:-webkit-linear-gradient(top, #fff 0%, #dcdcdc 100%);background:-moz-linear-gradient(top, #fff 0%, #dcdcdc 100%);background:-ms-linear-gradient(top, #fff 0%, #dcdcdc 100%);background:-o-linear-gradient(top, #fff 0%, #dcdcdc 100%);background:linear-gradient(to bottom, #fff 0%, #dcdcdc 100%)}.dataTables_wrapper .dataTables_paginate .paginate_button.disabled,.dataTables_wrapper .dataTables_paginate .paginate_button.disabled:hover,.dataTables_wrapper .dataTables_paginate .paginate_button.disabled:active{cursor:default;color:#666 !important;border:1px solid transparent;background:transparent;box-shadow:none}.dataTables_wrapper .dataTables_paginate .paginate_button:hover{color:white !important;border:1px solid #111;background-color:#585858;background:-webkit-gradient(linear, left top, left bottom, color-stop(0%, #585858), color-stop(100%, #111));background:-webkit-linear-gradient(top, #585858 0%, #111 100%);background:-moz-linear-gradient(top, #585858 0%, #111 100%);background:-ms-linear-gradient(top, #585858 0%, #111 100%);background:-o-linear-gradient(top, #585858 0%, #111 100%);background:linear-gradient(to bottom, #585858 0%, #111 100%)}.dataTables_wrapper .dataTables_paginate .paginate_button:active{outline:none;background-color:#2b2b2b;background:-webkit-gradient(linear, left top, left bottom, color-stop(0%, #2b2b2b), color-stop(100%, #0c0c0c));background:-webkit-linear-gradient(top, #2b2b2b 0%, #0c0c0c 100%);background:-moz-linear-gradient(top, #2b2b2b 0%, #0c0c0c 100%);background:-ms-linear-gradient(top, #2b2b2b 0%, #0c0c0c 100%);background:-o-linear-gradient(top, #2b2b2b 0%, #0c0c0c 100%);background:linear-gradient(to bottom, #2b2b2b 0%, #0c0c0c 100%);box-shadow:inset 0 0 3px #111}.dataTables_wrapper .dataTables_paginate .ellipsis{padding:0 1em}.dataTables_wrapper .dataTables_processing{position:absolute;top:50%;left:50%;width:100%;height:40px;margin-left:-50%;margin-top:-25px;padding-top:20px;text-align:center;font-size:1.2em;background-color:white;background:-webkit-gradient(linear, left top, right top, color-stop(0%, rgba(255,255,255,0)), color-stop(25%, rgba(255,255,255,0.9)), color-stop(75%, rgba(255,255,255,0.9)), color-stop(100%, rgba(255,255,255,0)));background:-webkit-linear-gradient(left, rgba(255,255,255,0) 0%, rgba(255,255,255,0.9) 25%, rgba(255,255,255,0.9) 75%, rgba(255,255,255,0) 100%);background:-moz-linear-gradient(left, rgba(255,255,255,0) 0%, rgba(255,255,255,0.9) 25%, rgba(255,255,255,0.9) 75%, rgba(255,255,255,0) 100%);background:-ms-linear-gradient(left, rgba(255,255,255,0) 0%, rgba(255,255,255,0.9) 25%, rgba(255,255,255,0.9) 75%, rgba(255,255,255,0) 100%);background:-o-linear-gradient(left, rgba(255,255,255,0) 0%, rgba(255,255,255,0.9) 25%, rgba(255,255,255,0.9) 75%, rgba(255,255,255,0) 100%);background:linear-gradient(to right, rgba(255,255,255,0) 0%, rgba(255,255,255,0.9) 25%, rgba(255,255,255,0.9) 75%, rgba(255,255,255,0) 100%)}.dataTables_wrapper .dataTables_length,.dataTables_wrapper .dataTables_filter,.dataTables_wrapper .dataTables_info,.dataTables_wrapper .dataTables_processing,.dataTables_wrapper .dataTables_paginate{color:#333}.dataTables_wrapper .dataTables_scroll{clear:both}.dataTables_wrapper .dataTables_scroll div.dataTables_scrollBody{*margin-top:-1px;-webkit-overflow-scrolling:touch}.dataTables_wrapper .dataTables_scroll div.dataTables_scrollBody>table>thead>tr>th,.dataTables_wrapper .dataTables_scroll div.dataTables_scrollBody>table>thead>tr>td,.dataTables_wrapper .dataTables_scroll div.dataTables_scrollBody>table>tbody>tr>th,.dataTables_wrapper .dataTables_scroll div.dataTables_scrollBody>table>tbody>tr>td{vertical-align:middle}.dataTables_wrapper .dataTables_scroll div.dataTables_scrollBody>table>thead>tr>th>div.dataTables_sizing,.dataTables_wrapper .dataTables_scroll div.dataTables_scrollBody>table>thead>tr>td>div.dataTables_sizing,.dataTables_wrapper .dataTables_scroll div.dataTables_scrollBody>table>tbody>tr>th>div.dataTables_sizing,.dataTables_wrapper .dataTables_scroll div.dataTables_scrollBody>table>tbody>tr>td>div.dataTables_sizing{height:0;overflow:hidden;margin:0 !important;padding:0 !important}.dataTables_wrapper.no-footer .dataTables_scrollBody{border-bottom:1px solid #111}.dataTables_wrapper.no-footer div.dataTables_scrollHead table.dataTable,.dataTables_wrapper.no-footer div.dataTables_scrollBody>table{border-bottom:none}.dataTables_wrapper:after{visibility:hidden;display:block;content:"";clear:both;height:0}@media screen and (max-width: 767px){.dataTables_wrapper .dataTables_info,.dataTables_wrapper .dataTables_paginate{float:none;text-align:center}.dataTables_wrapper .dataTables_paginate{margin-top:0.5em}}@media screen and (max-width: 640px){.dataTables_wrapper .dataTables_length,.dataTables_wrapper .dataTables_filter{float:none;text-align:center}.dataTables_wrapper .dataTables_filter{margin-top:0.5em}} diff --git a/docs/articles/database_of_anor_files/dt-core-1.10.20/js/jquery.dataTables.min.js b/docs/articles/database_of_anor_files/dt-core-1.10.20/js/jquery.dataTables.min.js new file mode 100644 index 0000000..d297f25 --- /dev/null +++ b/docs/articles/database_of_anor_files/dt-core-1.10.20/js/jquery.dataTables.min.js @@ -0,0 +1,180 @@ +/*! + Copyright 2008-2019 SpryMedia Ltd. + + This source file is free software, available under the following license: + MIT license - http://datatables.net/license + + This source file is distributed in the hope that it will be useful, but + WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY + or FITNESS FOR A PARTICULAR PURPOSE. See the license files for details. + + For details please refer to: http://www.datatables.net + DataTables 1.10.20 + ©2008-2019 SpryMedia Ltd - datatables.net/license +*/ +var $jscomp=$jscomp||{};$jscomp.scope={};$jscomp.findInternal=function(f,z,y){f instanceof String&&(f=String(f));for(var p=f.length,H=0;H").css({position:"fixed",top:0,left:-1*f(z).scrollLeft(),height:1,width:1, +overflow:"hidden"}).append(f("
").css({position:"absolute",top:1,left:1,width:100,overflow:"scroll"}).append(f("
").css({width:"100%",height:10}))).appendTo("body"),d=c.children(),e=d.children();b.barWidth=d[0].offsetWidth-d[0].clientWidth;b.bScrollOversize=100===e[0].offsetWidth&&100!==d[0].clientWidth;b.bScrollbarLeft=1!==Math.round(e.offset().left);b.bBounding=c[0].getBoundingClientRect().width?!0:!1;c.remove()}f.extend(a.oBrowser,q.__browser);a.oScroll.iBarWidth=q.__browser.barWidth} +function mb(a,b,c,d,e,h){var g=!1;if(c!==p){var k=c;g=!0}for(;d!==e;)a.hasOwnProperty(d)&&(k=g?b(k,a[d],d,a):a[d],g=!0,d+=h);return k}function Ia(a,b){var c=q.defaults.column,d=a.aoColumns.length;c=f.extend({},q.models.oColumn,c,{nTh:b?b:y.createElement("th"),sTitle:c.sTitle?c.sTitle:b?b.innerHTML:"",aDataSort:c.aDataSort?c.aDataSort:[d],mData:c.mData?c.mData:d,idx:d});a.aoColumns.push(c);c=a.aoPreSearchCols;c[d]=f.extend({},q.models.oSearch,c[d]);ma(a,d,f(b).data())}function ma(a,b,c){b=a.aoColumns[b]; +var d=a.oClasses,e=f(b.nTh);if(!b.sWidthOrig){b.sWidthOrig=e.attr("width")||null;var h=(e.attr("style")||"").match(/width:\s*(\d+[pxem%]+)/);h&&(b.sWidthOrig=h[1])}c!==p&&null!==c&&(kb(c),L(q.defaults.column,c,!0),c.mDataProp===p||c.mData||(c.mData=c.mDataProp),c.sType&&(b._sManualType=c.sType),c.className&&!c.sClass&&(c.sClass=c.className),c.sClass&&e.addClass(c.sClass),f.extend(b,c),M(b,c,"sWidth","sWidthOrig"),c.iDataSort!==p&&(b.aDataSort=[c.iDataSort]),M(b,c,"aDataSort"));var g=b.mData,k=U(g), +l=b.mRender?U(b.mRender):null;c=function(a){return"string"===typeof a&&-1!==a.indexOf("@")};b._bAttrSrc=f.isPlainObject(g)&&(c(g.sort)||c(g.type)||c(g.filter));b._setter=null;b.fnGetData=function(a,b,c){var d=k(a,b,p,c);return l&&b?l(d,b,a,c):d};b.fnSetData=function(a,b,c){return Q(g)(a,b,c)};"number"!==typeof g&&(a._rowReadObject=!0);a.oFeatures.bSort||(b.bSortable=!1,e.addClass(d.sSortableNone));a=-1!==f.inArray("asc",b.asSorting);c=-1!==f.inArray("desc",b.asSorting);b.bSortable&&(a||c)?a&&!c?(b.sSortingClass= +d.sSortableAsc,b.sSortingClassJUI=d.sSortJUIAscAllowed):!a&&c?(b.sSortingClass=d.sSortableDesc,b.sSortingClassJUI=d.sSortJUIDescAllowed):(b.sSortingClass=d.sSortable,b.sSortingClassJUI=d.sSortJUI):(b.sSortingClass=d.sSortableNone,b.sSortingClassJUI="")}function aa(a){if(!1!==a.oFeatures.bAutoWidth){var b=a.aoColumns;Ja(a);for(var c=0,d=b.length;cn[m])d(k.length+ +n[m],l);else if("string"===typeof n[m]){var w=0;for(g=k.length;wb&&a[e]--; -1!=d&&c===p&&a.splice(d,1)}function ea(a,b,c,d){var e=a.aoData[b],h,g=function(c,d){for(;c.childNodes.length;)c.removeChild(c.firstChild);c.innerHTML=I(a,b,d,"display")};if("dom"!==c&&(c&&"auto"!==c||"dom"!==e.src)){var k=e.anCells;if(k)if(d!==p)g(k[d],d);else for(c=0,h=k.length;c").appendTo(d));var l=0;for(b=k.length;ltr").attr("role","row");f(d).find(">tr>th, >tr>td").addClass(g.sHeaderTH);f(e).find(">tr>th, >tr>td").addClass(g.sFooterTH);if(null!==e)for(a=a.aoFooter[0],l=0,b=a.length;l=a.fnRecordsDisplay()?0:g,a.iInitDisplayStart=-1);g=a._iDisplayStart;var n=a.fnDisplayEnd();if(a.bDeferLoading)a.bDeferLoading=!1,a.iDraw++,K(a,!1);else if(!k)a.iDraw++;else if(!a.bDestroying&&!qb(a))return;if(0!==l.length)for(h=k?a.aoData.length:n,k=k?0:g;k",{"class":e?d[0]:""}).append(f("",{valign:"top",colSpan:W(a),"class":a.oClasses.sRowEmpty}).html(c))[0];A(a,"aoHeaderCallback","header",[f(a.nTHead).children("tr")[0], +Oa(a),g,n,l]);A(a,"aoFooterCallback","footer",[f(a.nTFoot).children("tr")[0],Oa(a),g,n,l]);d=f(a.nTBody);d.children().detach();d.append(f(b));A(a,"aoDrawCallback","draw",[a]);a.bSorted=!1;a.bFiltered=!1;a.bDrawing=!1}}function V(a,b){var c=a.oFeatures,d=c.bFilter;c.bSort&&rb(a);d?ia(a,a.oPreviousSearch):a.aiDisplay=a.aiDisplayMaster.slice();!0!==b&&(a._iDisplayStart=0);a._drawHold=b;S(a);a._drawHold=!1}function sb(a){var b=a.oClasses,c=f(a.nTable);c=f("
").insertBefore(c);var d=a.oFeatures,e= +f("
",{id:a.sTableId+"_wrapper","class":b.sWrapper+(a.nTFoot?"":" "+b.sNoFooter)});a.nHolding=c[0];a.nTableWrapper=e[0];a.nTableReinsertBefore=a.nTable.nextSibling;for(var h=a.sDom.split(""),g,k,l,n,m,p,u=0;u")[0];n=h[u+1];if("'"==n||'"'==n){m="";for(p=2;h[u+p]!=n;)m+=h[u+p],p++;"H"==m?m=b.sJUIHeader:"F"==m&&(m=b.sJUIFooter);-1!=m.indexOf(".")?(n=m.split("."),l.id=n[0].substr(1,n[0].length-1),l.className=n[1]):"#"==m.charAt(0)?l.id=m.substr(1, +m.length-1):l.className=m;u+=p}e.append(l);e=f(l)}else if(">"==k)e=e.parent();else if("l"==k&&d.bPaginate&&d.bLengthChange)g=tb(a);else if("f"==k&&d.bFilter)g=ub(a);else if("r"==k&&d.bProcessing)g=vb(a);else if("t"==k)g=wb(a);else if("i"==k&&d.bInfo)g=xb(a);else if("p"==k&&d.bPaginate)g=yb(a);else if(0!==q.ext.feature.length)for(l=q.ext.feature,p=0,n=l.length;p',k=d.sSearch;k=k.match(/_INPUT_/)?k.replace("_INPUT_",g):k+g;b=f("
",{id:h.f?null:c+"_filter","class":b.sFilter}).append(f("
").addClass(b.sLength);a.aanFeatures.l||(l[0].id=c+"_length");l.children().append(a.oLanguage.sLengthMenu.replace("_MENU_", +e[0].outerHTML));f("select",l).val(a._iDisplayLength).on("change.DT",function(b){Va(a,f(this).val());S(a)});f(a.nTable).on("length.dt.DT",function(b,c,d){a===c&&f("select",l).val(d)});return l[0]}function yb(a){var b=a.sPaginationType,c=q.ext.pager[b],d="function"===typeof c,e=function(a){S(a)};b=f("
").addClass(a.oClasses.sPaging+b)[0];var h=a.aanFeatures;d||c.fnInit(a,b,e);h.p||(b.id=a.sTableId+"_paginate",a.aoDrawCallback.push({fn:function(a){if(d){var b=a._iDisplayStart,g=a._iDisplayLength, +f=a.fnRecordsDisplay(),m=-1===g;b=m?0:Math.ceil(b/g);g=m?1:Math.ceil(f/g);f=c(b,g);var p;m=0;for(p=h.p.length;mh&&(d=0)):"first"==b?d=0:"previous"==b?(d=0<=e?d-e:0,0>d&&(d=0)):"next"==b?d+e",{id:a.aanFeatures.r?null:a.sTableId+"_processing","class":a.oClasses.sProcessing}).html(a.oLanguage.sProcessing).insertBefore(a.nTable)[0]}function K(a,b){a.oFeatures.bProcessing&&f(a.aanFeatures.r).css("display",b?"block":"none");A(a,null,"processing",[a,b])}function wb(a){var b=f(a.nTable);b.attr("role","grid");var c=a.oScroll;if(""===c.sX&&""===c.sY)return a.nTable;var d=c.sX,e=c.sY, +h=a.oClasses,g=b.children("caption"),k=g.length?g[0]._captionSide:null,l=f(b[0].cloneNode(!1)),n=f(b[0].cloneNode(!1)),m=b.children("tfoot");m.length||(m=null);l=f("
",{"class":h.sScrollWrapper}).append(f("
",{"class":h.sScrollHead}).css({overflow:"hidden",position:"relative",border:0,width:d?d?B(d):null:"100%"}).append(f("
",{"class":h.sScrollHeadInner}).css({"box-sizing":"content-box",width:c.sXInner||"100%"}).append(l.removeAttr("id").css("margin-left",0).append("top"===k?g:null).append(b.children("thead"))))).append(f("
", +{"class":h.sScrollBody}).css({position:"relative",overflow:"auto",width:d?B(d):null}).append(b));m&&l.append(f("
",{"class":h.sScrollFoot}).css({overflow:"hidden",border:0,width:d?d?B(d):null:"100%"}).append(f("
",{"class":h.sScrollFootInner}).append(n.removeAttr("id").css("margin-left",0).append("bottom"===k?g:null).append(b.children("tfoot")))));b=l.children();var p=b[0];h=b[1];var u=m?b[2]:null;if(d)f(h).on("scroll.DT",function(a){a=this.scrollLeft;p.scrollLeft=a;m&&(u.scrollLeft=a)}); +f(h).css(e&&c.bCollapse?"max-height":"height",e);a.nScrollHead=p;a.nScrollBody=h;a.nScrollFoot=u;a.aoDrawCallback.push({fn:na,sName:"scrolling"});return l[0]}function na(a){var b=a.oScroll,c=b.sX,d=b.sXInner,e=b.sY;b=b.iBarWidth;var h=f(a.nScrollHead),g=h[0].style,k=h.children("div"),l=k[0].style,n=k.children("table");k=a.nScrollBody;var m=f(k),w=k.style,u=f(a.nScrollFoot).children("div"),q=u.children("table"),t=f(a.nTHead),r=f(a.nTable),v=r[0],za=v.style,T=a.nTFoot?f(a.nTFoot):null,A=a.oBrowser, +x=A.bScrollOversize,ac=J(a.aoColumns,"nTh"),Ya=[],y=[],z=[],C=[],G,H=function(a){a=a.style;a.paddingTop="0";a.paddingBottom="0";a.borderTopWidth="0";a.borderBottomWidth="0";a.height=0};var D=k.scrollHeight>k.clientHeight;if(a.scrollBarVis!==D&&a.scrollBarVis!==p)a.scrollBarVis=D,aa(a);else{a.scrollBarVis=D;r.children("thead, tfoot").remove();if(T){var E=T.clone().prependTo(r);var F=T.find("tr");E=E.find("tr")}var I=t.clone().prependTo(r);t=t.find("tr");D=I.find("tr");I.find("th, td").removeAttr("tabindex"); +c||(w.width="100%",h[0].style.width="100%");f.each(ua(a,I),function(b,c){G=ba(a,b);c.style.width=a.aoColumns[G].sWidth});T&&N(function(a){a.style.width=""},E);h=r.outerWidth();""===c?(za.width="100%",x&&(r.find("tbody").height()>k.offsetHeight||"scroll"==m.css("overflow-y"))&&(za.width=B(r.outerWidth()-b)),h=r.outerWidth()):""!==d&&(za.width=B(d),h=r.outerWidth());N(H,D);N(function(a){z.push(a.innerHTML);Ya.push(B(f(a).css("width")))},D);N(function(a,b){-1!==f.inArray(a,ac)&&(a.style.width=Ya[b])}, +t);f(D).height(0);T&&(N(H,E),N(function(a){C.push(a.innerHTML);y.push(B(f(a).css("width")))},E),N(function(a,b){a.style.width=y[b]},F),f(E).height(0));N(function(a,b){a.innerHTML='
'+z[b]+"
";a.childNodes[0].style.height="0";a.childNodes[0].style.overflow="hidden";a.style.width=Ya[b]},D);T&&N(function(a,b){a.innerHTML='
'+C[b]+"
";a.childNodes[0].style.height="0";a.childNodes[0].style.overflow="hidden";a.style.width=y[b]},E);r.outerWidth()< +h?(F=k.scrollHeight>k.offsetHeight||"scroll"==m.css("overflow-y")?h+b:h,x&&(k.scrollHeight>k.offsetHeight||"scroll"==m.css("overflow-y"))&&(za.width=B(F-b)),""!==c&&""===d||O(a,1,"Possible column misalignment",6)):F="100%";w.width=B(F);g.width=B(F);T&&(a.nScrollFoot.style.width=B(F));!e&&x&&(w.height=B(v.offsetHeight+b));c=r.outerWidth();n[0].style.width=B(c);l.width=B(c);d=r.height()>k.clientHeight||"scroll"==m.css("overflow-y");e="padding"+(A.bScrollbarLeft?"Left":"Right");l[e]=d?b+"px":"0px";T&& +(q[0].style.width=B(c),u[0].style.width=B(c),u[0].style[e]=d?b+"px":"0px");r.children("colgroup").insertBefore(r.children("thead"));m.trigger("scroll");!a.bSorted&&!a.bFiltered||a._drawHold||(k.scrollTop=0)}}function N(a,b,c){for(var d=0,e=0,h=b.length,g,k;e").appendTo(k.find("tbody"));k.find("thead, tfoot").remove(); +k.append(f(a.nTHead).clone()).append(f(a.nTFoot).clone());k.find("tfoot th, tfoot td").css("width","");n=ua(a,k.find("thead")[0]);for(q=0;q").css({width:r.sWidthOrig,margin:0,padding:0,border:0,height:1}));if(a.aoData.length)for(q=0;q").css(h|| +e?{position:"absolute",top:0,left:0,height:1,right:0,overflow:"hidden"}:{}).append(k).appendTo(p);h&&g?k.width(g):h?(k.css("width","auto"),k.removeAttr("width"),k.width()").css("width",B(a)).appendTo(b||y.body);b=a[0].offsetWidth;a.remove();return b}function Kb(a,b){var c=Lb(a,b);if(0>c)return null;var d=a.aoData[c];return d.nTr?d.anCells[b]:f("").html(I(a,c,b,"display"))[0]}function Lb(a,b){for(var c,d=-1,e=-1,h=0,g=a.aoData.length;hd&&(d=c.length,e=h);return e} +function B(a){return null===a?"0px":"number"==typeof a?0>a?"0px":a+"px":a.match(/\d$/)?a+"px":a}function Y(a){var b=[],c=a.aoColumns;var d=a.aaSortingFixed;var e=f.isPlainObject(d);var h=[];var g=function(a){a.length&&!f.isArray(a[0])?h.push(a):f.merge(h,a)};f.isArray(d)&&g(d);e&&d.pre&&g(d.pre);g(a.aaSorting);e&&d.post&&g(d.post);for(a=0;an?1:0; +if(0!==m)return"asc"===l.dir?m:-m}m=c[a];n=c[b];return mn?1:0}):g.sort(function(a,b){var h,g=k.length,f=e[a]._aSortData,l=e[b]._aSortData;for(h=0;hp?1:0})}a.bSorted=!0}function Nb(a){var b=a.aoColumns,c=Y(a);a=a.oLanguage.oAria;for(var d=0,e=b.length;d/g,"");var f=h.nTh;f.removeAttribute("aria-sort"); +h.bSortable&&(0e?e+1:3))}e=0;for(h=d.length;ee?e+1:3))}a.aLastSort=d}function Mb(a,b){var c=a.aoColumns[b],d=q.ext.order[c.sSortDataType],e;d&&(e=d.call(a.oInstance,a,b,ca(a,b)));for(var h,g=q.ext.type.order[c.sType+"-pre"],k=0,f=a.aoData.length;k=h.length?[0,c[1]]:c)}));b.search!==p&&f.extend(a.oPreviousSearch, +Gb(b.search));if(b.columns)for(d=0,e=b.columns.length;d=c&&(b=c-d);b-=b%d;if(-1===d||0>b)b=0;a._iDisplayStart=b}function Ra(a,b){a=a.renderer;var c=q.ext.renderer[b];return f.isPlainObject(a)&&a[b]?c[a[b]]||c._:"string"===typeof a?c[a]||c._:c._}function D(a){return a.oFeatures.bServerSide?"ssp":a.ajax||a.sAjaxSource?"ajax":"dom"}function ka(a,b){var c=Pb.numbers_length,d=Math.floor(c/2);b<=c?a=Z(0,b):a<=d?(a=Z(0,c-2),a.push("ellipsis"),a.push(b-1)):(a>=b-1-d?a=Z(b-(c-2),b):(a=Z(a-d+2,a+d-1),a.push("ellipsis"), +a.push(b-1)),a.splice(0,0,"ellipsis"),a.splice(0,0,0));a.DT_el="span";return a}function Ha(a){f.each({num:function(b){return Da(b,a)},"num-fmt":function(b){return Da(b,a,bb)},"html-num":function(b){return Da(b,a,Ea)},"html-num-fmt":function(b){return Da(b,a,Ea,bb)}},function(b,c){C.type.order[b+a+"-pre"]=c;b.match(/^html\-/)&&(C.type.search[b+a]=C.type.search.html)})}function Qb(a){return function(){var b=[Ca(this[q.ext.iApiIndex])].concat(Array.prototype.slice.call(arguments));return q.ext.internal[a].apply(this, +b)}}var q=function(a){this.$=function(a,b){return this.api(!0).$(a,b)};this._=function(a,b){return this.api(!0).rows(a,b).data()};this.api=function(a){return a?new v(Ca(this[C.iApiIndex])):new v(this)};this.fnAddData=function(a,b){var c=this.api(!0);a=f.isArray(a)&&(f.isArray(a[0])||f.isPlainObject(a[0]))?c.rows.add(a):c.row.add(a);(b===p||b)&&c.draw();return a.flatten().toArray()};this.fnAdjustColumnSizing=function(a){var b=this.api(!0).columns.adjust(),c=b.settings()[0],d=c.oScroll;a===p||a?b.draw(!1): +(""!==d.sX||""!==d.sY)&&na(c)};this.fnClearTable=function(a){var b=this.api(!0).clear();(a===p||a)&&b.draw()};this.fnClose=function(a){this.api(!0).row(a).child.hide()};this.fnDeleteRow=function(a,b,c){var d=this.api(!0);a=d.rows(a);var e=a.settings()[0],h=e.aoData[a[0][0]];a.remove();b&&b.call(this,e,h);(c===p||c)&&d.draw();return h};this.fnDestroy=function(a){this.api(!0).destroy(a)};this.fnDraw=function(a){this.api(!0).draw(a)};this.fnFilter=function(a,b,c,d,e,f){e=this.api(!0);null===b||b===p? +e.search(a,c,d,f):e.column(b).search(a,c,d,f);e.draw()};this.fnGetData=function(a,b){var c=this.api(!0);if(a!==p){var d=a.nodeName?a.nodeName.toLowerCase():"";return b!==p||"td"==d||"th"==d?c.cell(a,b).data():c.row(a).data()||null}return c.data().toArray()};this.fnGetNodes=function(a){var b=this.api(!0);return a!==p?b.row(a).node():b.rows().nodes().flatten().toArray()};this.fnGetPosition=function(a){var b=this.api(!0),c=a.nodeName.toUpperCase();return"TR"==c?b.row(a).index():"TD"==c||"TH"==c?(a=b.cell(a).index(), +[a.row,a.columnVisible,a.column]):null};this.fnIsOpen=function(a){return this.api(!0).row(a).child.isShown()};this.fnOpen=function(a,b,c){return this.api(!0).row(a).child(b,c).show().child()[0]};this.fnPageChange=function(a,b){a=this.api(!0).page(a);(b===p||b)&&a.draw(!1)};this.fnSetColumnVis=function(a,b,c){a=this.api(!0).column(a).visible(b);(c===p||c)&&a.columns.adjust().draw()};this.fnSettings=function(){return Ca(this[C.iApiIndex])};this.fnSort=function(a){this.api(!0).order(a).draw()};this.fnSortListener= +function(a,b,c){this.api(!0).order.listener(a,b,c)};this.fnUpdate=function(a,b,c,d,e){var h=this.api(!0);c===p||null===c?h.row(b).data(a):h.cell(b,c).data(a);(e===p||e)&&h.columns.adjust();(d===p||d)&&h.draw();return 0};this.fnVersionCheck=C.fnVersionCheck;var b=this,c=a===p,d=this.length;c&&(a={});this.oApi=this.internal=C.internal;for(var e in q.ext.internal)e&&(this[e]=Qb(e));this.each(function(){var e={},g=1").appendTo(w));r.nTHead=b[0];b=w.children("tbody");0===b.length&&(b=f("").appendTo(w));r.nTBody=b[0];b=w.children("tfoot");0===b.length&&0").appendTo(w));0===b.length||0===b.children().length?w.addClass(x.sNoFooter):0/g,cc=/^\d{2,4}[\.\/\-]\d{1,2}[\.\/\-]\d{1,2}([T ]{1}\d{1,2}[:\.]\d{2}([\.:]\d{2})?)?$/,dc=/(\/|\.|\*|\+|\?|\||\(|\)|\[|\]|\{|\}|\\|\$|\^|\-)/g,bb=/[',$£€¥%\u2009\u202F\u20BD\u20a9\u20BArfkɃΞ]/gi,P=function(a){return a&&!0!==a&&"-"!==a?!1: +!0},Sb=function(a){var b=parseInt(a,10);return!isNaN(b)&&isFinite(a)?b:null},Tb=function(a,b){cb[b]||(cb[b]=new RegExp(Ua(b),"g"));return"string"===typeof a&&"."!==b?a.replace(/\./g,"").replace(cb[b],"."):a},db=function(a,b,c){var d="string"===typeof a;if(P(a))return!0;b&&d&&(a=Tb(a,b));c&&d&&(a=a.replace(bb,""));return!isNaN(parseFloat(a))&&isFinite(a)},Ub=function(a,b,c){return P(a)?!0:P(a)||"string"===typeof a?db(a.replace(Ea,""),b,c)?!0:null:null},J=function(a,b,c){var d=[],e=0,h=a.length;if(c!== +p)for(;ea.length)){var b=a.slice().sort();for(var c=b[0],d=1, +e=b.length;d")[0],$b=ya.textContent!==p,bc=/<.*?>/g,Sa=q.util.throttle,Wb=[],G=Array.prototype,ec=function(a){var b,c=q.settings,d=f.map(c,function(a,b){return a.nTable});if(a){if(a.nTable&&a.oApi)return[a];if(a.nodeName&&"table"===a.nodeName.toLowerCase()){var e=f.inArray(a,d);return-1!==e?[c[e]]:null}if(a&&"function"===typeof a.settings)return a.settings().toArray();"string"===typeof a?b=f(a):a instanceof f&&(b=a)}else return[];if(b)return b.map(function(a){e=f.inArray(this, +d);return-1!==e?c[e]:null}).toArray()};var v=function(a,b){if(!(this instanceof v))return new v(a,b);var c=[],d=function(a){(a=ec(a))&&c.push.apply(c,a)};if(f.isArray(a))for(var e=0,h=a.length;ea?new v(b[a],this[a]):null},filter:function(a){var b=[];if(G.filter)b=G.filter.call(this,a,this);else for(var c=0,d=this.length;c").addClass(c),f("td",d).addClass(c).html(b)[0].colSpan=W(a),e.push(d[0]))};h(c,d);b._details&&b._details.detach();b._details=f(e);b._detailsShow&&b._details.insertAfter(b.nTr)},hb=function(a,b){var c=a.context;c.length&&(a=c[0].aoData[b!==p?b:a[0]])&&a._details&&(a._details.remove(),a._detailsShow=p,a._details=p)},Yb=function(a,b){var c=a.context;c.length&&a.length&&(a=c[0].aoData[a[0]],a._details&&((a._detailsShow=b)?a._details.insertAfter(a.nTr): +a._details.detach(),ic(c[0])))},ic=function(a){var b=new v(a),c=a.aoData;b.off("draw.dt.DT_details column-visibility.dt.DT_details destroy.dt.DT_details");0g){var m=f.map(d,function(a,b){return a.bVisible?b:null});return[m[m.length+g]]}return[ba(a,g)];case "name":return f.map(e,function(a,b){return a===n[1]?b:null});default:return[]}if(b.nodeName&&b._DT_CellIndex)return[b._DT_CellIndex.column];g=f(h).filter(b).map(function(){return f.inArray(this, +h)}).toArray();if(g.length||!b.nodeName)return g;g=f(b).closest("*[data-dt-column]");return g.length?[g.data("dt-column")]:[]},a,c)};t("columns()",function(a,b){a===p?a="":f.isPlainObject(a)&&(b=a,a="");b=fb(b);var c=this.iterator("table",function(c){return kc(c,a,b)},1);c.selector.cols=a;c.selector.opts=b;return c});x("columns().header()","column().header()",function(a,b){return this.iterator("column",function(a,b){return a.aoColumns[b].nTh},1)});x("columns().footer()","column().footer()",function(a, +b){return this.iterator("column",function(a,b){return a.aoColumns[b].nTf},1)});x("columns().data()","column().data()",function(){return this.iterator("column-rows",Zb,1)});x("columns().dataSrc()","column().dataSrc()",function(){return this.iterator("column",function(a,b){return a.aoColumns[b].mData},1)});x("columns().cache()","column().cache()",function(a){return this.iterator("column-rows",function(b,c,d,e,f){return la(b.aoData,f,"search"===a?"_aFilterData":"_aSortData",c)},1)});x("columns().nodes()", +"column().nodes()",function(){return this.iterator("column-rows",function(a,b,c,d,e){return la(a.aoData,e,"anCells",b)},1)});x("columns().visible()","column().visible()",function(a,b){var c=this,d=this.iterator("column",function(b,c){if(a===p)return b.aoColumns[c].bVisible;var d=b.aoColumns,e=d[c],h=b.aoData,n;if(a!==p&&e.bVisible!==a){if(a){var m=f.inArray(!0,J(d,"bVisible"),c+1);d=0;for(n=h.length;dd;return!0};q.isDataTable=q.fnIsDataTable=function(a){var b=f(a).get(0),c=!1;if(a instanceof +q.Api)return!0;f.each(q.settings,function(a,e){a=e.nScrollHead?f("table",e.nScrollHead)[0]:null;var d=e.nScrollFoot?f("table",e.nScrollFoot)[0]:null;if(e.nTable===b||a===b||d===b)c=!0});return c};q.tables=q.fnTables=function(a){var b=!1;f.isPlainObject(a)&&(b=a.api,a=a.visible);var c=f.map(q.settings,function(b){if(!a||a&&f(b.nTable).is(":visible"))return b.nTable});return b?new v(c):c};q.camelToHungarian=L;t("$()",function(a,b){b=this.rows(b).nodes();b=f(b);return f([].concat(b.filter(a).toArray(), +b.find(a).toArray()))});f.each(["on","one","off"],function(a,b){t(b+"()",function(){var a=Array.prototype.slice.call(arguments);a[0]=f.map(a[0].split(/\s/),function(a){return a.match(/\.dt\b/)?a:a+".dt"}).join(" ");var d=f(this.tables().nodes());d[b].apply(d,a);return this})});t("clear()",function(){return this.iterator("table",function(a){qa(a)})});t("settings()",function(){return new v(this.context,this.context)});t("init()",function(){var a=this.context;return a.length?a[0].oInit:null});t("data()", +function(){return this.iterator("table",function(a){return J(a.aoData,"_aData")}).flatten()});t("destroy()",function(a){a=a||!1;return this.iterator("table",function(b){var c=b.nTableWrapper.parentNode,d=b.oClasses,e=b.nTable,h=b.nTBody,g=b.nTHead,k=b.nTFoot,l=f(e);h=f(h);var n=f(b.nTableWrapper),m=f.map(b.aoData,function(a){return a.nTr}),p;b.bDestroying=!0;A(b,"aoDestroyCallback","destroy",[b]);a||(new v(b)).columns().visible(!0);n.off(".DT").find(":not(tbody *)").off(".DT");f(z).off(".DT-"+b.sInstance); +e!=g.parentNode&&(l.children("thead").detach(),l.append(g));k&&e!=k.parentNode&&(l.children("tfoot").detach(),l.append(k));b.aaSorting=[];b.aaSortingFixed=[];Aa(b);f(m).removeClass(b.asStripeClasses.join(" "));f("th, td",g).removeClass(d.sSortable+" "+d.sSortableAsc+" "+d.sSortableDesc+" "+d.sSortableNone);h.children().detach();h.append(m);g=a?"remove":"detach";l[g]();n[g]();!a&&c&&(c.insertBefore(e,b.nTableReinsertBefore),l.css("width",b.sDestroyWidth).removeClass(d.sTable),(p=b.asDestroyStripes.length)&& +h.children().each(function(a){f(this).addClass(b.asDestroyStripes[a%p])}));c=f.inArray(b,q.settings);-1!==c&&q.settings.splice(c,1)})});f.each(["column","row","cell"],function(a,b){t(b+"s().every()",function(a){var c=this.selector.opts,e=this;return this.iterator(b,function(d,f,k,l,n){a.call(e[b](f,"cell"===b?k:c,"cell"===b?c:p),f,k,l,n)})})});t("i18n()",function(a,b,c){var d=this.context[0];a=U(a)(d.oLanguage);a===p&&(a=b);c!==p&&f.isPlainObject(a)&&(a=a[c]!==p?a[c]:a._);return a.replace("%d",c)}); +q.version="1.10.20";q.settings=[];q.models={};q.models.oSearch={bCaseInsensitive:!0,sSearch:"",bRegex:!1,bSmart:!0};q.models.oRow={nTr:null,anCells:null,_aData:[],_aSortData:null,_aFilterData:null,_sFilterRow:null,_sRowStripe:"",src:null,idx:-1};q.models.oColumn={idx:null,aDataSort:null,asSorting:null,bSearchable:null,bSortable:null,bVisible:null,_sManualType:null,_bAttrSrc:!1,fnCreatedCell:null,fnGetData:null,fnSetData:null,mData:null,mRender:null,nTh:null,nTf:null,sClass:null,sContentPadding:null, +sDefaultContent:null,sName:null,sSortDataType:"std",sSortingClass:null,sSortingClassJUI:null,sTitle:null,sType:null,sWidth:null,sWidthOrig:null};q.defaults={aaData:null,aaSorting:[[0,"asc"]],aaSortingFixed:[],ajax:null,aLengthMenu:[10,25,50,100],aoColumns:null,aoColumnDefs:null,aoSearchCols:[],asStripeClasses:null,bAutoWidth:!0,bDeferRender:!1,bDestroy:!1,bFilter:!0,bInfo:!0,bLengthChange:!0,bPaginate:!0,bProcessing:!1,bRetrieve:!1,bScrollCollapse:!1,bServerSide:!1,bSort:!0,bSortMulti:!0,bSortCellsTop:!1, +bSortClasses:!0,bStateSave:!1,fnCreatedRow:null,fnDrawCallback:null,fnFooterCallback:null,fnFormatNumber:function(a){return a.toString().replace(/\B(?=(\d{3})+(?!\d))/g,this.oLanguage.sThousands)},fnHeaderCallback:null,fnInfoCallback:null,fnInitComplete:null,fnPreDrawCallback:null,fnRowCallback:null,fnServerData:null,fnServerParams:null,fnStateLoadCallback:function(a){try{return JSON.parse((-1===a.iStateDuration?sessionStorage:localStorage).getItem("DataTables_"+a.sInstance+"_"+location.pathname))}catch(b){}}, +fnStateLoadParams:null,fnStateLoaded:null,fnStateSaveCallback:function(a,b){try{(-1===a.iStateDuration?sessionStorage:localStorage).setItem("DataTables_"+a.sInstance+"_"+location.pathname,JSON.stringify(b))}catch(c){}},fnStateSaveParams:null,iStateDuration:7200,iDeferLoading:null,iDisplayLength:10,iDisplayStart:0,iTabIndex:0,oClasses:{},oLanguage:{oAria:{sSortAscending:": activate to sort column ascending",sSortDescending:": activate to sort column descending"},oPaginate:{sFirst:"First",sLast:"Last", +sNext:"Next",sPrevious:"Previous"},sEmptyTable:"No data available in table",sInfo:"Showing _START_ to _END_ of _TOTAL_ entries",sInfoEmpty:"Showing 0 to 0 of 0 entries",sInfoFiltered:"(filtered from _MAX_ total entries)",sInfoPostFix:"",sDecimal:"",sThousands:",",sLengthMenu:"Show _MENU_ entries",sLoadingRecords:"Loading...",sProcessing:"Processing...",sSearch:"Search:",sSearchPlaceholder:"",sUrl:"",sZeroRecords:"No matching records found"},oSearch:f.extend({},q.models.oSearch),sAjaxDataProp:"data", +sAjaxSource:null,sDom:"lfrtip",searchDelay:null,sPaginationType:"simple_numbers",sScrollX:"",sScrollXInner:"",sScrollY:"",sServerMethod:"GET",renderer:null,rowId:"DT_RowId"};H(q.defaults);q.defaults.column={aDataSort:null,iDataSort:-1,asSorting:["asc","desc"],bSearchable:!0,bSortable:!0,bVisible:!0,fnCreatedCell:null,mData:null,mRender:null,sCellType:"td",sClass:"",sContentPadding:"",sDefaultContent:null,sName:"",sSortDataType:"std",sTitle:null,sType:null,sWidth:null};H(q.defaults.column);q.models.oSettings= +{oFeatures:{bAutoWidth:null,bDeferRender:null,bFilter:null,bInfo:null,bLengthChange:null,bPaginate:null,bProcessing:null,bServerSide:null,bSort:null,bSortMulti:null,bSortClasses:null,bStateSave:null},oScroll:{bCollapse:null,iBarWidth:0,sX:null,sXInner:null,sY:null},oLanguage:{fnInfoCallback:null},oBrowser:{bScrollOversize:!1,bScrollbarLeft:!1,bBounding:!1,barWidth:0},ajax:null,aanFeatures:[],aoData:[],aiDisplay:[],aiDisplayMaster:[],aIds:{},aoColumns:[],aoHeader:[],aoFooter:[],oPreviousSearch:{}, +aoPreSearchCols:[],aaSorting:null,aaSortingFixed:[],asStripeClasses:null,asDestroyStripes:[],sDestroyWidth:0,aoRowCallback:[],aoHeaderCallback:[],aoFooterCallback:[],aoDrawCallback:[],aoRowCreatedCallback:[],aoPreDrawCallback:[],aoInitComplete:[],aoStateSaveParams:[],aoStateLoadParams:[],aoStateLoaded:[],sTableId:"",nTable:null,nTHead:null,nTFoot:null,nTBody:null,nTableWrapper:null,bDeferLoading:!1,bInitialised:!1,aoOpenRows:[],sDom:null,searchDelay:null,sPaginationType:"two_button",iStateDuration:0, +aoStateSave:[],aoStateLoad:[],oSavedState:null,oLoadedState:null,sAjaxSource:null,sAjaxDataProp:null,bAjaxDataGet:!0,jqXHR:null,json:p,oAjaxData:p,fnServerData:null,aoServerParams:[],sServerMethod:null,fnFormatNumber:null,aLengthMenu:null,iDraw:0,bDrawing:!1,iDrawError:-1,_iDisplayLength:10,_iDisplayStart:0,_iRecordsTotal:0,_iRecordsDisplay:0,oClasses:{},bFiltered:!1,bSorted:!1,bSortCellsTop:null,oInit:null,aoDestroyCallback:[],fnRecordsTotal:function(){return"ssp"==D(this)?1*this._iRecordsTotal: +this.aiDisplayMaster.length},fnRecordsDisplay:function(){return"ssp"==D(this)?1*this._iRecordsDisplay:this.aiDisplay.length},fnDisplayEnd:function(){var a=this._iDisplayLength,b=this._iDisplayStart,c=b+a,d=this.aiDisplay.length,e=this.oFeatures,f=e.bPaginate;return e.bServerSide?!1===f||-1===a?b+d:Math.min(b+a,this._iRecordsDisplay):!f||c>d||-1===a?d:c},oInstance:null,sInstance:null,iTabIndex:0,nScrollHead:null,nScrollFoot:null,aLastSort:[],oPlugins:{},rowIdFn:null,rowId:null};q.ext=C={buttons:{}, +classes:{},builder:"-source-",errMode:"alert",feature:[],search:[],selector:{cell:[],column:[],row:[]},internal:{},legacy:{ajax:null},pager:{},renderer:{pageButton:{},header:{}},order:{},type:{detect:[],search:{},order:{}},_unique:0,fnVersionCheck:q.fnVersionCheck,iApiIndex:0,oJUIClasses:{},sVersion:q.version};f.extend(C,{afnFiltering:C.search,aTypes:C.type.detect,ofnSearch:C.type.search,oSort:C.type.order,afnSortData:C.order,aoFeatures:C.feature,oApi:C.internal,oStdClasses:C.classes,oPagination:C.pager}); +f.extend(q.ext.classes,{sTable:"dataTable",sNoFooter:"no-footer",sPageButton:"paginate_button",sPageButtonActive:"current",sPageButtonDisabled:"disabled",sStripeOdd:"odd",sStripeEven:"even",sRowEmpty:"dataTables_empty",sWrapper:"dataTables_wrapper",sFilter:"dataTables_filter",sInfo:"dataTables_info",sPaging:"dataTables_paginate paging_",sLength:"dataTables_length",sProcessing:"dataTables_processing",sSortAsc:"sorting_asc",sSortDesc:"sorting_desc",sSortable:"sorting",sSortableAsc:"sorting_asc_disabled", +sSortableDesc:"sorting_desc_disabled",sSortableNone:"sorting_disabled",sSortColumn:"sorting_",sFilterInput:"",sLengthSelect:"",sScrollWrapper:"dataTables_scroll",sScrollHead:"dataTables_scrollHead",sScrollHeadInner:"dataTables_scrollHeadInner",sScrollBody:"dataTables_scrollBody",sScrollFoot:"dataTables_scrollFoot",sScrollFootInner:"dataTables_scrollFootInner",sHeaderTH:"",sFooterTH:"",sSortJUIAsc:"",sSortJUIDesc:"",sSortJUI:"",sSortJUIAscAllowed:"",sSortJUIDescAllowed:"",sSortJUIWrapper:"",sSortIcon:"", +sJUIHeader:"",sJUIFooter:""});var Pb=q.ext.pager;f.extend(Pb,{simple:function(a,b){return["previous","next"]},full:function(a,b){return["first","previous","next","last"]},numbers:function(a,b){return[ka(a,b)]},simple_numbers:function(a,b){return["previous",ka(a,b),"next"]},full_numbers:function(a,b){return["first","previous",ka(a,b),"next","last"]},first_last_numbers:function(a,b){return["first",ka(a,b),"last"]},_numbers:ka,numbers_length:7});f.extend(!0,q.ext.renderer,{pageButton:{_:function(a,b, +c,d,e,h){var g=a.oClasses,k=a.oLanguage.oPaginate,l=a.oLanguage.oAria.paginate||{},n,m,q=0,t=function(b,d){var p,r=g.sPageButtonDisabled,u=function(b){Xa(a,b.data.action,!0)};var w=0;for(p=d.length;w").appendTo(b);t(x,v)}else{n=null;m=v;x=a.iTabIndex;switch(v){case "ellipsis":b.append('');break;case "first":n=k.sFirst;0===e&&(x=-1,m+=" "+r);break;case "previous":n=k.sPrevious;0===e&&(x=-1,m+= +" "+r);break;case "next":n=k.sNext;e===h-1&&(x=-1,m+=" "+r);break;case "last":n=k.sLast;e===h-1&&(x=-1,m+=" "+r);break;default:n=v+1,m=e===v?g.sPageButtonActive:""}null!==n&&(x=f("",{"class":g.sPageButton+" "+m,"aria-controls":a.sTableId,"aria-label":l[v],"data-dt-idx":q,tabindex:x,id:0===c&&"string"===typeof v?a.sTableId+"_"+v:null}).html(n).appendTo(b),$a(x,{action:v},u),q++)}}};try{var v=f(b).find(y.activeElement).data("dt-idx")}catch(mc){}t(f(b).empty(),d);v!==p&&f(b).find("[data-dt-idx="+ +v+"]").focus()}}});f.extend(q.ext.type.detect,[function(a,b){b=b.oLanguage.sDecimal;return db(a,b)?"num"+b:null},function(a,b){if(a&&!(a instanceof Date)&&!cc.test(a))return null;b=Date.parse(a);return null!==b&&!isNaN(b)||P(a)?"date":null},function(a,b){b=b.oLanguage.sDecimal;return db(a,b,!0)?"num-fmt"+b:null},function(a,b){b=b.oLanguage.sDecimal;return Ub(a,b)?"html-num"+b:null},function(a,b){b=b.oLanguage.sDecimal;return Ub(a,b,!0)?"html-num-fmt"+b:null},function(a,b){return P(a)||"string"=== +typeof a&&-1!==a.indexOf("<")?"html":null}]);f.extend(q.ext.type.search,{html:function(a){return P(a)?a:"string"===typeof a?a.replace(Rb," ").replace(Ea,""):""},string:function(a){return P(a)?a:"string"===typeof a?a.replace(Rb," "):a}});var Da=function(a,b,c,d){if(0!==a&&(!a||"-"===a))return-Infinity;b&&(a=Tb(a,b));a.replace&&(c&&(a=a.replace(c,"")),d&&(a=a.replace(d,"")));return 1*a};f.extend(C.type.order,{"date-pre":function(a){a=Date.parse(a);return isNaN(a)?-Infinity:a},"html-pre":function(a){return P(a)? +"":a.replace?a.replace(/<.*?>/g,"").toLowerCase():a+""},"string-pre":function(a){return P(a)?"":"string"===typeof a?a.toLowerCase():a.toString?a.toString():""},"string-asc":function(a,b){return ab?1:0},"string-desc":function(a,b){return ab?-1:0}});Ha("");f.extend(!0,q.ext.renderer,{header:{_:function(a,b,c,d){f(a.nTable).on("order.dt.DT",function(e,f,g,k){a===f&&(e=c.idx,b.removeClass(c.sSortingClass+" "+d.sSortAsc+" "+d.sSortDesc).addClass("asc"==k[e]?d.sSortAsc:"desc"==k[e]?d.sSortDesc: +c.sSortingClass))})},jqueryui:function(a,b,c,d){f("
").addClass(d.sSortJUIWrapper).append(b.contents()).append(f("").addClass(d.sSortIcon+" "+c.sSortingClassJUI)).appendTo(b);f(a.nTable).on("order.dt.DT",function(e,f,g,k){a===f&&(e=c.idx,b.removeClass(d.sSortAsc+" "+d.sSortDesc).addClass("asc"==k[e]?d.sSortAsc:"desc"==k[e]?d.sSortDesc:c.sSortingClass),b.find("span."+d.sSortIcon).removeClass(d.sSortJUIAsc+" "+d.sSortJUIDesc+" "+d.sSortJUI+" "+d.sSortJUIAscAllowed+" "+d.sSortJUIDescAllowed).addClass("asc"== +k[e]?d.sSortJUIAsc:"desc"==k[e]?d.sSortJUIDesc:c.sSortingClassJUI))})}}});var ib=function(a){return"string"===typeof a?a.replace(//g,">").replace(/"/g,"""):a};q.render={number:function(a,b,c,d,e){return{display:function(f){if("number"!==typeof f&&"string"!==typeof f)return f;var g=0>f?"-":"",h=parseFloat(f);if(isNaN(h))return ib(f);h=h.toFixed(c);f=Math.abs(h);h=parseInt(f,10);f=c?b+(f-h).toFixed(c).substring(2):"";return g+(d||"")+h.toString().replace(/\B(?=(\d{3})+(?!\d))/g, +a)+f+(e||"")}}},text:function(){return{display:ib,filter:ib}}};f.extend(q.ext.internal,{_fnExternApiFunc:Qb,_fnBuildAjax:va,_fnAjaxUpdate:qb,_fnAjaxParameters:zb,_fnAjaxUpdateDraw:Ab,_fnAjaxDataSrc:wa,_fnAddColumn:Ia,_fnColumnOptions:ma,_fnAdjustColumnSizing:aa,_fnVisibleToColumnIndex:ba,_fnColumnIndexToVisible:ca,_fnVisbleColumns:W,_fnGetColumns:oa,_fnColumnTypes:Ka,_fnApplyColumnDefs:nb,_fnHungarianMap:H,_fnCamelToHungarian:L,_fnLanguageCompat:Ga,_fnBrowserDetect:lb,_fnAddData:R,_fnAddTr:pa,_fnNodeToDataIndex:function(a, +b){return b._DT_RowIndex!==p?b._DT_RowIndex:null},_fnNodeToColumnIndex:function(a,b,c){return f.inArray(c,a.aoData[b].anCells)},_fnGetCellData:I,_fnSetCellData:ob,_fnSplitObjNotation:Na,_fnGetObjectDataFn:U,_fnSetObjectDataFn:Q,_fnGetDataMaster:Oa,_fnClearTable:qa,_fnDeleteIndex:ra,_fnInvalidate:ea,_fnGetRowElements:Ma,_fnCreateTr:La,_fnBuildHead:pb,_fnDrawHead:ha,_fnDraw:S,_fnReDraw:V,_fnAddOptionsHtml:sb,_fnDetectHeader:fa,_fnGetUniqueThs:ua,_fnFeatureHtmlFilter:ub,_fnFilterComplete:ia,_fnFilterCustom:Db, +_fnFilterColumn:Cb,_fnFilter:Bb,_fnFilterCreateSearch:Ta,_fnEscapeRegex:Ua,_fnFilterData:Eb,_fnFeatureHtmlInfo:xb,_fnUpdateInfo:Hb,_fnInfoMacros:Ib,_fnInitialise:ja,_fnInitComplete:xa,_fnLengthChange:Va,_fnFeatureHtmlLength:tb,_fnFeatureHtmlPaginate:yb,_fnPageChange:Xa,_fnFeatureHtmlProcessing:vb,_fnProcessingDisplay:K,_fnFeatureHtmlTable:wb,_fnScrollDraw:na,_fnApplyToChildren:N,_fnCalculateColumnWidths:Ja,_fnThrottle:Sa,_fnConvertToWidth:Jb,_fnGetWidestNode:Kb,_fnGetMaxLenString:Lb,_fnStringToCss:B, +_fnSortFlatten:Y,_fnSort:rb,_fnSortAria:Nb,_fnSortListener:Za,_fnSortAttachListener:Qa,_fnSortingClasses:Aa,_fnSortData:Mb,_fnSaveState:Ba,_fnLoadState:Ob,_fnSettingsFromNode:Ca,_fnLog:O,_fnMap:M,_fnBindAction:$a,_fnCallbackReg:E,_fnCallbackFire:A,_fnLengthOverflow:Wa,_fnRenderer:Ra,_fnDataSource:D,_fnRowAttributes:Pa,_fnExtend:ab,_fnCalculateEnd:function(){}});f.fn.dataTable=q;q.$=f;f.fn.dataTableSettings=q.settings;f.fn.dataTableExt=q.ext;f.fn.DataTable=function(a){return f(this).dataTable(a).api()}; +f.each(q,function(a,b){f.fn.DataTable[a]=b});return f.fn.dataTable}); diff --git a/docs/articles/database_of_anor_files/dt-ext-buttons-1.10.20/css/buttons.dataTables.min.css b/docs/articles/database_of_anor_files/dt-ext-buttons-1.10.20/css/buttons.dataTables.min.css new file mode 100644 index 0000000..19a1f1d --- /dev/null +++ b/docs/articles/database_of_anor_files/dt-ext-buttons-1.10.20/css/buttons.dataTables.min.css @@ -0,0 +1 @@ +@keyframes dtb-spinner{100%{transform:rotate(360deg)}}@-o-keyframes dtb-spinner{100%{-o-transform:rotate(360deg);transform:rotate(360deg)}}@-ms-keyframes dtb-spinner{100%{-ms-transform:rotate(360deg);transform:rotate(360deg)}}@-webkit-keyframes dtb-spinner{100%{-webkit-transform:rotate(360deg);transform:rotate(360deg)}}@-moz-keyframes dtb-spinner{100%{-moz-transform:rotate(360deg);transform:rotate(360deg)}}div.dt-button-info{position:fixed;top:50%;left:50%;width:400px;margin-top:-100px;margin-left:-200px;background-color:white;border:2px solid #111;box-shadow:3px 3px 8px rgba(0,0,0,0.3);border-radius:3px;text-align:center;z-index:21}div.dt-button-info h2{padding:0.5em;margin:0;font-weight:normal;border-bottom:1px solid #ddd;background-color:#f3f3f3}div.dt-button-info>div{padding:1em}div.dt-button-collection-title{text-align:center;padding:0.3em 0 0.5em;font-size:0.9em}div.dt-button-collection-title:empty{display:none}button.dt-button,div.dt-button,a.dt-button{position:relative;display:inline-block;box-sizing:border-box;margin-right:0.333em;margin-bottom:0.333em;padding:0.5em 1em;border:1px solid #999;border-radius:2px;cursor:pointer;font-size:0.88em;line-height:1.6em;color:black;white-space:nowrap;overflow:hidden;background-color:#e9e9e9;background-image:-webkit-linear-gradient(top, #fff 0%, #e9e9e9 100%);background-image:-moz-linear-gradient(top, #fff 0%, #e9e9e9 100%);background-image:-ms-linear-gradient(top, #fff 0%, #e9e9e9 100%);background-image:-o-linear-gradient(top, #fff 0%, #e9e9e9 100%);background-image:linear-gradient(to bottom, #fff 0%, #e9e9e9 100%);filter:progid:DXImageTransform.Microsoft.gradient(GradientType=0,StartColorStr='white', EndColorStr='#e9e9e9');-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;text-decoration:none;outline:none;text-overflow:ellipsis}button.dt-button.disabled,div.dt-button.disabled,a.dt-button.disabled{color:#999;border:1px solid #d0d0d0;cursor:default;background-color:#f9f9f9;background-image:-webkit-linear-gradient(top, #fff 0%, #f9f9f9 100%);background-image:-moz-linear-gradient(top, #fff 0%, #f9f9f9 100%);background-image:-ms-linear-gradient(top, #fff 0%, #f9f9f9 100%);background-image:-o-linear-gradient(top, #fff 0%, #f9f9f9 100%);background-image:linear-gradient(to bottom, #fff 0%, #f9f9f9 100%);filter:progid:DXImageTransform.Microsoft.gradient(GradientType=0,StartColorStr='#ffffff', EndColorStr='#f9f9f9')}button.dt-button:active:not(.disabled),button.dt-button.active:not(.disabled),div.dt-button:active:not(.disabled),div.dt-button.active:not(.disabled),a.dt-button:active:not(.disabled),a.dt-button.active:not(.disabled){background-color:#e2e2e2;background-image:-webkit-linear-gradient(top, #f3f3f3 0%, #e2e2e2 100%);background-image:-moz-linear-gradient(top, #f3f3f3 0%, #e2e2e2 100%);background-image:-ms-linear-gradient(top, #f3f3f3 0%, #e2e2e2 100%);background-image:-o-linear-gradient(top, #f3f3f3 0%, #e2e2e2 100%);background-image:linear-gradient(to bottom, #f3f3f3 0%, #e2e2e2 100%);filter:progid:DXImageTransform.Microsoft.gradient(GradientType=0,StartColorStr='#f3f3f3', EndColorStr='#e2e2e2');box-shadow:inset 1px 1px 3px #999999}button.dt-button:active:not(.disabled):hover:not(.disabled),button.dt-button.active:not(.disabled):hover:not(.disabled),div.dt-button:active:not(.disabled):hover:not(.disabled),div.dt-button.active:not(.disabled):hover:not(.disabled),a.dt-button:active:not(.disabled):hover:not(.disabled),a.dt-button.active:not(.disabled):hover:not(.disabled){box-shadow:inset 1px 1px 3px #999999;background-color:#cccccc;background-image:-webkit-linear-gradient(top, #eaeaea 0%, #ccc 100%);background-image:-moz-linear-gradient(top, #eaeaea 0%, #ccc 100%);background-image:-ms-linear-gradient(top, #eaeaea 0%, #ccc 100%);background-image:-o-linear-gradient(top, #eaeaea 0%, #ccc 100%);background-image:linear-gradient(to bottom, #eaeaea 0%, #ccc 100%);filter:progid:DXImageTransform.Microsoft.gradient(GradientType=0,StartColorStr='#eaeaea', EndColorStr='#cccccc')}button.dt-button:hover,div.dt-button:hover,a.dt-button:hover{text-decoration:none}button.dt-button:hover:not(.disabled),div.dt-button:hover:not(.disabled),a.dt-button:hover:not(.disabled){border:1px solid #666;background-color:#e0e0e0;background-image:-webkit-linear-gradient(top, #f9f9f9 0%, #e0e0e0 100%);background-image:-moz-linear-gradient(top, #f9f9f9 0%, #e0e0e0 100%);background-image:-ms-linear-gradient(top, #f9f9f9 0%, #e0e0e0 100%);background-image:-o-linear-gradient(top, #f9f9f9 0%, #e0e0e0 100%);background-image:linear-gradient(to bottom, #f9f9f9 0%, #e0e0e0 100%);filter:progid:DXImageTransform.Microsoft.gradient(GradientType=0,StartColorStr='#f9f9f9', EndColorStr='#e0e0e0')}button.dt-button:focus:not(.disabled),div.dt-button:focus:not(.disabled),a.dt-button:focus:not(.disabled){border:1px solid #426c9e;text-shadow:0 1px 0 #c4def1;outline:none;background-color:#79ace9;background-image:-webkit-linear-gradient(top, #bddef4 0%, #79ace9 100%);background-image:-moz-linear-gradient(top, #bddef4 0%, #79ace9 100%);background-image:-ms-linear-gradient(top, #bddef4 0%, #79ace9 100%);background-image:-o-linear-gradient(top, #bddef4 0%, #79ace9 100%);background-image:linear-gradient(to bottom, #bddef4 0%, #79ace9 100%);filter:progid:DXImageTransform.Microsoft.gradient(GradientType=0,StartColorStr='#bddef4', EndColorStr='#79ace9')}.dt-button embed{outline:none}div.dt-buttons{position:relative;float:left}div.dt-buttons.buttons-right{float:right}div.dt-button-collection{position:absolute;top:0;left:0;width:150px;margin-top:3px;padding:8px 8px 4px 8px;border:1px solid #ccc;border:1px solid rgba(0,0,0,0.4);background-color:white;overflow:hidden;z-index:2002;border-radius:5px;box-shadow:3px 3px 5px rgba(0,0,0,0.3);box-sizing:border-box}div.dt-button-collection button.dt-button,div.dt-button-collection div.dt-button,div.dt-button-collection a.dt-button{position:relative;left:0;right:0;width:100%;display:block;float:none;margin-bottom:4px;margin-right:0}div.dt-button-collection button.dt-button:active:not(.disabled),div.dt-button-collection button.dt-button.active:not(.disabled),div.dt-button-collection div.dt-button:active:not(.disabled),div.dt-button-collection div.dt-button.active:not(.disabled),div.dt-button-collection a.dt-button:active:not(.disabled),div.dt-button-collection a.dt-button.active:not(.disabled){background-color:#dadada;background-image:-webkit-linear-gradient(top, #f0f0f0 0%, #dadada 100%);background-image:-moz-linear-gradient(top, #f0f0f0 0%, #dadada 100%);background-image:-ms-linear-gradient(top, #f0f0f0 0%, #dadada 100%);background-image:-o-linear-gradient(top, #f0f0f0 0%, #dadada 100%);background-image:linear-gradient(to bottom, #f0f0f0 0%, #dadada 100%);filter:progid:DXImageTransform.Microsoft.gradient(GradientType=0,StartColorStr='#f0f0f0', EndColorStr='#dadada');box-shadow:inset 1px 1px 3px #666}div.dt-button-collection.fixed{position:fixed;top:50%;left:50%;margin-left:-75px;border-radius:0}div.dt-button-collection.fixed.two-column{margin-left:-200px}div.dt-button-collection.fixed.three-column{margin-left:-225px}div.dt-button-collection.fixed.four-column{margin-left:-300px}div.dt-button-collection>:last-child{display:block !important;-webkit-column-gap:8px;-moz-column-gap:8px;-ms-column-gap:8px;-o-column-gap:8px;column-gap:8px}div.dt-button-collection>:last-child>*{-webkit-column-break-inside:avoid;break-inside:avoid}div.dt-button-collection.two-column{width:400px}div.dt-button-collection.two-column>:last-child{padding-bottom:1px;-webkit-column-count:2;-moz-column-count:2;-ms-column-count:2;-o-column-count:2;column-count:2}div.dt-button-collection.three-column{width:450px}div.dt-button-collection.three-column>:last-child{padding-bottom:1px;-webkit-column-count:3;-moz-column-count:3;-ms-column-count:3;-o-column-count:3;column-count:3}div.dt-button-collection.four-column{width:600px}div.dt-button-collection.four-column>:last-child{padding-bottom:1px;-webkit-column-count:4;-moz-column-count:4;-ms-column-count:4;-o-column-count:4;column-count:4}div.dt-button-collection .dt-button{border-radius:0}div.dt-button-background{position:fixed;top:0;left:0;width:100%;height:100%;background:rgba(0,0,0,0.7);background:-ms-radial-gradient(center, ellipse farthest-corner, rgba(0,0,0,0.3) 0%, rgba(0,0,0,0.7) 100%);background:-moz-radial-gradient(center, ellipse farthest-corner, rgba(0,0,0,0.3) 0%, rgba(0,0,0,0.7) 100%);background:-o-radial-gradient(center, ellipse farthest-corner, rgba(0,0,0,0.3) 0%, rgba(0,0,0,0.7) 100%);background:-webkit-gradient(radial, center center, 0, center center, 497, color-stop(0, rgba(0,0,0,0.3)), color-stop(1, rgba(0,0,0,0.7)));background:-webkit-radial-gradient(center, ellipse farthest-corner, rgba(0,0,0,0.3) 0%, rgba(0,0,0,0.7) 100%);background:radial-gradient(ellipse farthest-corner at center, rgba(0,0,0,0.3) 0%, rgba(0,0,0,0.7) 100%);z-index:2001}@media screen and (max-width: 640px){div.dt-buttons{float:none !important;text-align:center}}button.dt-button.processing,div.dt-button.processing,a.dt-button.processing{color:rgba(0,0,0,0.2)}button.dt-button.processing:after,div.dt-button.processing:after,a.dt-button.processing:after{position:absolute;top:50%;left:50%;width:16px;height:16px;margin:-8px 0 0 -8px;box-sizing:border-box;display:block;content:' ';border:2px solid #282828;border-radius:50%;border-left-color:transparent;border-right-color:transparent;animation:dtb-spinner 1500ms infinite linear;-o-animation:dtb-spinner 1500ms infinite linear;-ms-animation:dtb-spinner 1500ms infinite linear;-webkit-animation:dtb-spinner 1500ms infinite linear;-moz-animation:dtb-spinner 1500ms infinite linear} diff --git a/docs/articles/database_of_anor_files/dt-ext-buttons-1.10.20/js/buttons.colVis.min.js b/docs/articles/database_of_anor_files/dt-ext-buttons-1.10.20/js/buttons.colVis.min.js new file mode 100644 index 0000000..679e3d7 --- /dev/null +++ b/docs/articles/database_of_anor_files/dt-ext-buttons-1.10.20/js/buttons.colVis.min.js @@ -0,0 +1,10 @@ +/*! + Column visibility buttons for Buttons and DataTables. + 2016 SpryMedia Ltd - datatables.net/license +*/ +(function(f){"function"===typeof define&&define.amd?define(["jquery","datatables.net","datatables.net-buttons"],function(c){return f(c,window,document)}):"object"===typeof exports?module.exports=function(c,e){c||(c=window);e&&e.fn.dataTable||(e=require("datatables.net")(c,e).$);e.fn.dataTable.Buttons||require("datatables.net-buttons")(c,e);return f(e,c,c.document)}:f(jQuery,window,document)})(function(f,c,e,h){c=f.fn.dataTable;f.extend(c.ext.buttons,{colvis:function(a,b){return{extend:"collection", +text:function(b){return b.i18n("buttons.colvis","Column visibility")},className:"buttons-colvis",buttons:[{extend:"columnsToggle",columns:b.columns,columnText:b.columnText}]}},columnsToggle:function(a,b){return a.columns(b.columns).indexes().map(function(a){return{extend:"columnToggle",columns:a,columnText:b.columnText}}).toArray()},columnToggle:function(a,b){return{extend:"columnVisibility",columns:b.columns,columnText:b.columnText}},columnsVisibility:function(a,b){return a.columns(b.columns).indexes().map(function(a){return{extend:"columnVisibility", +columns:a,visibility:b.visibility,columnText:b.columnText}}).toArray()},columnVisibility:{columns:h,text:function(a,b,d){return d._columnText(a,d)},className:"buttons-columnVisibility",action:function(a,b,d,g){a=b.columns(g.columns);b=a.visible();a.visible(g.visibility!==h?g.visibility:!(b.length&&b[0]))},init:function(a,b,d){var g=this;b.attr("data-cv-idx",d.columns);a.on("column-visibility.dt"+d.namespace,function(b,c){c.bDestroying||c.nTable!=a.settings()[0].nTable||g.active(a.column(d.columns).visible())}).on("column-reorder.dt"+ +d.namespace,function(c,e,f){1===a.columns(d.columns).count()&&(b.text(d._columnText(a,d)),g.active(a.column(d.columns).visible()))});this.active(a.column(d.columns).visible())},destroy:function(a,b,d){a.off("column-visibility.dt"+d.namespace).off("column-reorder.dt"+d.namespace)},_columnText:function(a,b){var d=a.column(b.columns).index(),c=a.settings()[0].aoColumns[d].sTitle.replace(/\n/g," ").replace(//gi," ").replace(//g,"").replace(//g,"").replace(/<.*?>/g, +"").replace(/^\s+|\s+$/g,"");return b.columnText?b.columnText(a,d,c):c}},colvisRestore:{className:"buttons-colvisRestore",text:function(a){return a.i18n("buttons.colvisRestore","Restore visibility")},init:function(a,b,d){d._visOriginal=a.columns().indexes().map(function(b){return a.column(b).visible()}).toArray()},action:function(a,b,d,c){b.columns().every(function(a){a=b.colReorder&&b.colReorder.transpose?b.colReorder.transpose(a,"toOriginal"):a;this.visible(c._visOriginal[a])})}},colvisGroup:{className:"buttons-colvisGroup", +action:function(a,b,d,c){b.columns(c.show).visible(!0,!1);b.columns(c.hide).visible(!1,!1);b.columns.adjust()},show:[],hide:[]}});return c.Buttons}); diff --git a/docs/articles/database_of_anor_files/dt-ext-buttons-1.10.20/js/buttons.flash.min.js b/docs/articles/database_of_anor_files/dt-ext-buttons-1.10.20/js/buttons.flash.min.js new file mode 100644 index 0000000..e273635 --- /dev/null +++ b/docs/articles/database_of_anor_files/dt-ext-buttons-1.10.20/js/buttons.flash.min.js @@ -0,0 +1,39 @@ +/*! + Flash export buttons for Buttons and DataTables. + 2015-2017 SpryMedia Ltd - datatables.net/license + + ZeroClipbaord - MIT license + Copyright (c) 2012 Joseph Huckaby +*/ +(function(g){"function"===typeof define&&define.amd?define(["jquery","datatables.net","datatables.net-buttons"],function(n){return g(n,window,document)}):"object"===typeof exports?module.exports=function(n,m){n||(n=window);m&&m.fn.dataTable||(m=require("datatables.net")(n,m).$);m.fn.dataTable.Buttons||require("datatables.net-buttons")(n,m);return g(m,n,n.document)}:g(jQuery,window,document)})(function(g,n,m,u){function A(a){for(var b="";0<=a;)b=String.fromCharCode(a%26+65)+b,a=Math.floor(a/26)-1; +return b}function r(a,b,c){var d=a.createElement(b);c&&(c.attr&&g(d).attr(c.attr),c.children&&g.each(c.children,function(a,b){d.appendChild(b)}),null!==c.text&&c.text!==u&&d.appendChild(a.createTextNode(c.text)));return d}function G(a,b){var c=a.header[b].length;a.footer&&a.footer[b].length>c&&(c=a.footer[b].length);for(var d=0,f=a.body.length;dc&&(c=e);if(40'+c),c=c.replace(/_dt_b_namespace_token_/g,":"));c=c.replace(/<([^<>]*?) xmlns=""([^<>]*?)>/g,"<$1 $2>");a[b]=c}})}var l=g.fn.dataTable,h={version:"1.0.4-TableTools2",clients:{},moviePath:"",nextId:1,$:function(a){"string"==typeof a&&(a=m.getElementById(a));a.addClass||(a.hide=function(){this.style.display="none"},a.show= +function(){this.style.display=""},a.addClass=function(a){this.removeClass(a);this.className+=" "+a},a.removeClass=function(a){this.className=this.className.replace(new RegExp("\\s*"+a+"\\s*")," ").replace(/^\s+/,"").replace(/\s+$/,"")},a.hasClass=function(a){return!!this.className.match(new RegExp("\\s*"+a+"\\s*"))});return a},setMoviePath:function(a){this.moviePath=a},dispatch:function(a,b,c){(a=this.clients[a])&&a.receiveEvent(b,c)},log:function(a){console.log("Flash: "+a)},register:function(a, +b){this.clients[a]=b},getDOMObjectPosition:function(a){var b={left:0,top:0,width:a.width?a.width:a.offsetWidth,height:a.height?a.height:a.offsetHeight};""!==a.style.width&&(b.width=a.style.width.replace("px",""));""!==a.style.height&&(b.height=a.style.height.replace("px",""));for(;a;)b.left+=a.offsetLeft,b.top+=a.offsetTop,a=a.offsetParent;return b},Client:function(a){this.handlers={};this.id=h.nextId++;this.movieId="ZeroClipboard_TableToolsMovie_"+this.id;h.register(this.id,this);a&&this.glue(a)}}; +h.Client.prototype={id:0,ready:!1,movie:null,clipText:"",fileName:"",action:"copy",handCursorEnabled:!0,cssEffects:!0,handlers:null,sized:!1,sheetName:"",glue:function(a,b){this.domElement=h.$(a);a=99;this.domElement.style.zIndex&&(a=parseInt(this.domElement.style.zIndex,10)+1);var c=h.getDOMObjectPosition(this.domElement);this.div=m.createElement("div");var d=this.div.style;d.position="absolute";d.left="0px";d.top="0px";d.width=c.width+"px";d.height=c.height+"px";d.zIndex=a;"undefined"!=typeof b&& +""!==b&&(this.div.title=b);0!==c.width&&0!==c.height&&(this.sized=!0);this.domElement&&(this.domElement.appendChild(this.div),this.div.innerHTML=this.getHTML(c.width,c.height).replace(/&/g,"&"))},positionElement:function(){var a=h.getDOMObjectPosition(this.domElement),b=this.div.style;b.position="absolute";b.width=a.width+"px";b.height=a.height+"px";0!==a.width&&0!==a.height&&(this.sized=!0,b=this.div.childNodes[0],b.width=a.width,b.height=a.height)},getHTML:function(a,b){var c="",d="id="+this.id+ +"&width="+a+"&height="+b;if(navigator.userAgent.match(/MSIE/)){var f=location.href.match(/^https/i)?"https://":"http://";c+=''}else c+='';return c},hide:function(){this.div&&(this.div.style.left="-2000px")}, +show:function(){this.reposition()},destroy:function(){var a=this;this.domElement&&this.div&&(g(this.div).remove(),this.div=this.domElement=null,g.each(h.clients,function(b,c){c===a&&delete h.clients[b]}))},reposition:function(a){a&&((this.domElement=h.$(a))||this.hide());if(this.domElement&&this.div){a=h.getDOMObjectPosition(this.domElement);var b=this.div.style;b.left=""+a.left+"px";b.top=""+a.top+"px"}},clearText:function(){this.clipText="";this.ready&&this.movie.clearText()},appendText:function(a){this.clipText+= +a;this.ready&&this.movie.appendText(a)},setText:function(a){this.clipText=a;this.ready&&this.movie.setText(a)},setFileName:function(a){this.fileName=a;this.ready&&this.movie.setFileName(a)},setSheetData:function(a){this.ready&&this.movie.setSheetData(JSON.stringify(a))},setAction:function(a){this.action=a;this.ready&&this.movie.setAction(a)},addEventListener:function(a,b){a=a.toString().toLowerCase().replace(/^on/,"");this.handlers[a]||(this.handlers[a]=[]);this.handlers[a].push(b)},setHandCursor:function(a){this.handCursorEnabled= +a;this.ready&&this.movie.setHandCursor(a)},setCSSEffects:function(a){this.cssEffects=!!a},receiveEvent:function(a,b){a=a.toString().toLowerCase().replace(/^on/,"");switch(a){case "load":this.movie=m.getElementById(this.movieId);if(!this.movie){var c=this;setTimeout(function(){c.receiveEvent("load",null)},1);return}if(!this.ready&&navigator.userAgent.match(/Firefox/)&&navigator.userAgent.match(/Windows/)){c=this;setTimeout(function(){c.receiveEvent("load",null)},100);this.ready=!0;return}this.ready= +!0;this.movie.clearText();this.movie.appendText(this.clipText);this.movie.setFileName(this.fileName);this.movie.setAction(this.action);this.movie.setHandCursor(this.handCursorEnabled);break;case "mouseover":this.domElement&&this.cssEffects&&this.recoverActive&&this.domElement.addClass("active");break;case "mouseout":this.domElement&&this.cssEffects&&(this.recoverActive=!1,this.domElement.hasClass("active")&&(this.domElement.removeClass("active"),this.recoverActive=!0));break;case "mousedown":this.domElement&& +this.cssEffects&&this.domElement.addClass("active");break;case "mouseup":this.domElement&&this.cssEffects&&(this.domElement.removeClass("active"),this.recoverActive=!1)}if(this.handlers[a])for(var d=0,f=this.handlers[a].length;d',"xl/_rels/workbook.xml.rels":'', +"[Content_Types].xml":'', +"xl/workbook.xml":'', +"xl/worksheets/sheet1.xml":'',"xl/styles.xml":''}, +F=[{match:/^\-?\d+\.\d%$/,style:60,fmt:function(a){return a/100}},{match:/^\-?\d+\.?\d*%$/,style:56,fmt:function(a){return a/100}},{match:/^\-?\$[\d,]+.?\d*$/,style:57},{match:/^\-?£[\d,]+.?\d*$/,style:58},{match:/^\-?€[\d,]+.?\d*$/,style:59},{match:/^\([\d,]+\)$/,style:61,fmt:function(a){return-1*a.replace(/[\(\)]/g,"")}},{match:/^\([\d,]+\.\d{2}\)$/,style:62,fmt:function(a){return-1*a.replace(/[\(\)]/g,"")}},{match:/^[\d,]+$/,style:63},{match:/^[\d,]+\.\d{2}$/,style:64}];l.Buttons.swfPath="//cdn.datatables.net/buttons/"+ +l.Buttons.version+"/swf/flashExport.swf";l.Api.register("buttons.resize()",function(){g.each(h.clients,function(a,b){b.domElement!==u&&b.domElement.parentNode&&b.positionElement()})});l.ext.buttons.copyFlash=g.extend({},y,{className:"buttons-copy buttons-flash",text:function(a){return a.i18n("buttons.copy","Copy")},action:function(a,b,c,d){if(d._fromFlash){this.processing(!0);a=d._flash;var f=E(b,d);c=b.buttons.exportInfo(d);var e=D(d);f=f.str;c.title&&(f=c.title+e+e+f);c.messageTop&&(f=c.messageTop+ +e+e+f);c.messageBottom&&(f=f+e+e+c.messageBottom);d.customize&&(f=d.customize(f,d,b));a.setAction("copy");x(a,f);this.processing(!1);b.buttons.info(b.i18n("buttons.copyTitle","Copy to clipboard"),b.i18n("buttons.copySuccess",{_:"Copied %d rows to clipboard",1:"Copied 1 row to clipboard"},data.rows),3E3)}},fieldSeparator:"\t",fieldBoundary:""});l.ext.buttons.csvFlash=g.extend({},y,{className:"buttons-csv buttons-flash",text:function(a){return a.i18n("buttons.csv","CSV")},action:function(a,b,c,d){a= +d._flash;var f=E(b,d);c=b.buttons.exportInfo(d);b=d.customize?d.customize(f.str,d,b):f.str;a.setAction("csv");a.setFileName(c.filename);x(a,b)},escapeChar:'"'});l.ext.buttons.excelFlash=g.extend({},y,{className:"buttons-excel buttons-flash",text:function(a){return a.i18n("buttons.excel","Excel")},action:function(a,b,c,d){this.processing(!0);a=d._flash;var f=0,e=g.parseXML(t["xl/worksheets/sheet1.xml"]),h=e.getElementsByTagName("sheetData")[0];c={_rels:{".rels":g.parseXML(t["_rels/.rels"])},xl:{_rels:{"workbook.xml.rels":g.parseXML(t["xl/_rels/workbook.xml.rels"])}, +"workbook.xml":g.parseXML(t["xl/workbook.xml"]),"styles.xml":g.parseXML(t["xl/styles.xml"]),worksheets:{"sheet1.xml":e}},"[Content_Types].xml":g.parseXML(t["[Content_Types].xml"])};var k=b.buttons.exportData(d.exportOptions),m,n,p=function(a){m=f+1;n=r(e,"row",{attr:{r:m}});for(var b=0,c=a.length;b'+c),c=c.replace(/_dt_b_namespace_token_/g,":"),c=c.replace(/xmlns:NS[\d]+="" NS[\d]+:/g,""));c=c.replace(/<([^<>]*?) xmlns=""([^<>]*?)>/g,"<$1 $2>");a.file(b,c)}})}function r(a,b,d){var c=a.createElement(b);d&&(d.attr&&f(c).attr(d.attr),d.children&&f.each(d.children,function(a,b){c.appendChild(b)}),null!==d.text&&d.text!==w&&c.appendChild(a.createTextNode(d.text))); +return c}function L(a,b){var d=a.header[b].length;a.footer&&a.footer[b].length>d&&(d=a.footer[b].length);for(var c=0,f=a.body.length;cd&&(d=e);if(401*a[1]?!0:!1};try{var C=new XMLSerializer,y}catch(a){}var F={"_rels/.rels":'', +"xl/_rels/workbook.xml.rels":'',"[Content_Types].xml":'', +"xl/workbook.xml":'', +"xl/worksheets/sheet1.xml":'',"xl/styles.xml":''}, +K=[{match:/^\-?\d+\.\d%$/,style:60,fmt:function(a){return a/100}},{match:/^\-?\d+\.?\d*%$/,style:56,fmt:function(a){return a/100}},{match:/^\-?\$[\d,]+.?\d*$/,style:57},{match:/^\-?£[\d,]+.?\d*$/,style:58},{match:/^\-?€[\d,]+.?\d*$/,style:59},{match:/^\-?\d+$/,style:65},{match:/^\-?\d+\.\d{2}$/,style:66},{match:/^\([\d,]+\)$/,style:61,fmt:function(a){return-1*a.replace(/[\(\)]/g,"")}},{match:/^\([\d,]+\.\d{2}\)$/,style:62,fmt:function(a){return-1*a.replace(/[\(\)]/g,"")}},{match:/^\-?[\d,]+$/,style:63}, +{match:/^\-?[\d,]+\.\d{2}$/,style:64}];v.ext.buttons.copyHtml5={className:"buttons-copy buttons-html5",text:function(a){return a.i18n("buttons.copy","Copy")},action:function(a,b,d,c){this.processing(!0);var g=this;a=I(b,c);var e=b.buttons.exportInfo(c),h=H(c),m=a.str;d=f("
").css({height:1,width:1,overflow:"hidden",position:"fixed",top:0,left:0});e.title&&(m=e.title+h+h+m);e.messageTop&&(m=e.messageTop+h+h+m);e.messageBottom&&(m=m+h+h+e.messageBottom);c.customize&&(m=c.customize(m,c,b));c=f("",l.noCloneChecked=!!a.cloneNode(!0).lastChild.defaultValue,b.appendChild(a),c=d.createElement("input"),c.setAttribute("type","radio"),c.setAttribute("checked","checked"),c.setAttribute("name","t"),a.appendChild(c),l.checkClone=a.cloneNode(!0).cloneNode(!0).lastChild.checked,l.noCloneEvent=!!a.addEventListener,a[n.expando]=1,l.attributes=!a.getAttribute(n.expando)}();var da={option:[1,""],legend:[1,"
","
"],area:[1,"",""],param:[1,"",""],thead:[1,"","
"],tr:[2,"","
"],col:[2,"","
"],td:[3,"","
"],_default:l.htmlSerialize?[0,"",""]:[1,"X
","
"]};da.optgroup=da.option,da.tbody=da.tfoot=da.colgroup=da.caption=da.thead,da.th=da.td;function ea(a,b){var c,d,e=0,f="undefined"!=typeof a.getElementsByTagName?a.getElementsByTagName(b||"*"):"undefined"!=typeof a.querySelectorAll?a.querySelectorAll(b||"*"):void 0;if(!f)for(f=[],c=a.childNodes||a;null!=(d=c[e]);e++)!b||n.nodeName(d,b)?f.push(d):n.merge(f,ea(d,b));return void 0===b||b&&n.nodeName(a,b)?n.merge([a],f):f}function fa(a,b){for(var c,d=0;null!=(c=a[d]);d++)n._data(c,"globalEval",!b||n._data(b[d],"globalEval"))}var ga=/<|&#?\w+;/,ha=/r;r++)if(g=a[r],g||0===g)if("object"===n.type(g))n.merge(q,g.nodeType?[g]:g);else if(ga.test(g)){i=i||p.appendChild(b.createElement("div")),j=($.exec(g)||["",""])[1].toLowerCase(),m=da[j]||da._default,i.innerHTML=m[1]+n.htmlPrefilter(g)+m[2],f=m[0];while(f--)i=i.lastChild;if(!l.leadingWhitespace&&aa.test(g)&&q.push(b.createTextNode(aa.exec(g)[0])),!l.tbody){g="table"!==j||ha.test(g)?""!==m[1]||ha.test(g)?0:i:i.firstChild,f=g&&g.childNodes.length;while(f--)n.nodeName(k=g.childNodes[f],"tbody")&&!k.childNodes.length&&g.removeChild(k)}n.merge(q,i.childNodes),i.textContent="";while(i.firstChild)i.removeChild(i.firstChild);i=p.lastChild}else q.push(b.createTextNode(g));i&&p.removeChild(i),l.appendChecked||n.grep(ea(q,"input"),ia),r=0;while(g=q[r++])if(d&&n.inArray(g,d)>-1)e&&e.push(g);else if(h=n.contains(g.ownerDocument,g),i=ea(p.appendChild(g),"script"),h&&fa(i),c){f=0;while(g=i[f++])_.test(g.type||"")&&c.push(g)}return i=null,p}!function(){var b,c,e=d.createElement("div");for(b in{submit:!0,change:!0,focusin:!0})c="on"+b,(l[b]=c in a)||(e.setAttribute(c,"t"),l[b]=e.attributes[c].expando===!1);e=null}();var ka=/^(?:input|select|textarea)$/i,la=/^key/,ma=/^(?:mouse|pointer|contextmenu|drag|drop)|click/,na=/^(?:focusinfocus|focusoutblur)$/,oa=/^([^.]*)(?:\.(.+)|)/;function pa(){return!0}function qa(){return!1}function ra(){try{return d.activeElement}catch(a){}}function sa(a,b,c,d,e,f){var g,h;if("object"==typeof b){"string"!=typeof c&&(d=d||c,c=void 0);for(h in b)sa(a,h,c,d,b[h],f);return a}if(null==d&&null==e?(e=c,d=c=void 0):null==e&&("string"==typeof c?(e=d,d=void 0):(e=d,d=c,c=void 0)),e===!1)e=qa;else if(!e)return a;return 1===f&&(g=e,e=function(a){return n().off(a),g.apply(this,arguments)},e.guid=g.guid||(g.guid=n.guid++)),a.each(function(){n.event.add(this,b,e,d,c)})}n.event={global:{},add:function(a,b,c,d,e){var f,g,h,i,j,k,l,m,o,p,q,r=n._data(a);if(r){c.handler&&(i=c,c=i.handler,e=i.selector),c.guid||(c.guid=n.guid++),(g=r.events)||(g=r.events={}),(k=r.handle)||(k=r.handle=function(a){return"undefined"==typeof n||a&&n.event.triggered===a.type?void 0:n.event.dispatch.apply(k.elem,arguments)},k.elem=a),b=(b||"").match(G)||[""],h=b.length;while(h--)f=oa.exec(b[h])||[],o=q=f[1],p=(f[2]||"").split(".").sort(),o&&(j=n.event.special[o]||{},o=(e?j.delegateType:j.bindType)||o,j=n.event.special[o]||{},l=n.extend({type:o,origType:q,data:d,handler:c,guid:c.guid,selector:e,needsContext:e&&n.expr.match.needsContext.test(e),namespace:p.join(".")},i),(m=g[o])||(m=g[o]=[],m.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?m.splice(m.delegateCount++,0,l):m.push(l),n.event.global[o]=!0);a=null}},remove:function(a,b,c,d,e){var f,g,h,i,j,k,l,m,o,p,q,r=n.hasData(a)&&n._data(a);if(r&&(k=r.events)){b=(b||"").match(G)||[""],j=b.length;while(j--)if(h=oa.exec(b[j])||[],o=q=h[1],p=(h[2]||"").split(".").sort(),o){l=n.event.special[o]||{},o=(d?l.delegateType:l.bindType)||o,m=k[o]||[],h=h[2]&&new RegExp("(^|\\.)"+p.join("\\.(?:.*\\.|)")+"(\\.|$)"),i=f=m.length;while(f--)g=m[f],!e&&q!==g.origType||c&&c.guid!==g.guid||h&&!h.test(g.namespace)||d&&d!==g.selector&&("**"!==d||!g.selector)||(m.splice(f,1),g.selector&&m.delegateCount--,l.remove&&l.remove.call(a,g));i&&!m.length&&(l.teardown&&l.teardown.call(a,p,r.handle)!==!1||n.removeEvent(a,o,r.handle),delete k[o])}else for(o in k)n.event.remove(a,o+b[j],c,d,!0);n.isEmptyObject(k)&&(delete r.handle,n._removeData(a,"events"))}},trigger:function(b,c,e,f){var g,h,i,j,l,m,o,p=[e||d],q=k.call(b,"type")?b.type:b,r=k.call(b,"namespace")?b.namespace.split("."):[];if(i=m=e=e||d,3!==e.nodeType&&8!==e.nodeType&&!na.test(q+n.event.triggered)&&(q.indexOf(".")>-1&&(r=q.split("."),q=r.shift(),r.sort()),h=q.indexOf(":")<0&&"on"+q,b=b[n.expando]?b:new n.Event(q,"object"==typeof b&&b),b.isTrigger=f?2:3,b.namespace=r.join("."),b.rnamespace=b.namespace?new RegExp("(^|\\.)"+r.join("\\.(?:.*\\.|)")+"(\\.|$)"):null,b.result=void 0,b.target||(b.target=e),c=null==c?[b]:n.makeArray(c,[b]),l=n.event.special[q]||{},f||!l.trigger||l.trigger.apply(e,c)!==!1)){if(!f&&!l.noBubble&&!n.isWindow(e)){for(j=l.delegateType||q,na.test(j+q)||(i=i.parentNode);i;i=i.parentNode)p.push(i),m=i;m===(e.ownerDocument||d)&&p.push(m.defaultView||m.parentWindow||a)}o=0;while((i=p[o++])&&!b.isPropagationStopped())b.type=o>1?j:l.bindType||q,g=(n._data(i,"events")||{})[b.type]&&n._data(i,"handle"),g&&g.apply(i,c),g=h&&i[h],g&&g.apply&&M(i)&&(b.result=g.apply(i,c),b.result===!1&&b.preventDefault());if(b.type=q,!f&&!b.isDefaultPrevented()&&(!l._default||l._default.apply(p.pop(),c)===!1)&&M(e)&&h&&e[q]&&!n.isWindow(e)){m=e[h],m&&(e[h]=null),n.event.triggered=q;try{e[q]()}catch(s){}n.event.triggered=void 0,m&&(e[h]=m)}return b.result}},dispatch:function(a){a=n.event.fix(a);var b,c,d,f,g,h=[],i=e.call(arguments),j=(n._data(this,"events")||{})[a.type]||[],k=n.event.special[a.type]||{};if(i[0]=a,a.delegateTarget=this,!k.preDispatch||k.preDispatch.call(this,a)!==!1){h=n.event.handlers.call(this,a,j),b=0;while((f=h[b++])&&!a.isPropagationStopped()){a.currentTarget=f.elem,c=0;while((g=f.handlers[c++])&&!a.isImmediatePropagationStopped())a.rnamespace&&!a.rnamespace.test(g.namespace)||(a.handleObj=g,a.data=g.data,d=((n.event.special[g.origType]||{}).handle||g.handler).apply(f.elem,i),void 0!==d&&(a.result=d)===!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&&("click"!==a.type||isNaN(a.button)||a.button<1))for(;i!=this;i=i.parentNode||this)if(1===i.nodeType&&(i.disabled!==!0||"click"!==a.type)){for(d=[],c=0;h>c;c++)f=b[c],e=f.selector+" ",void 0===d[e]&&(d[e]=f.needsContext?n(e,this).index(i)>-1:n.find(e,this,null,[i]).length),d[e]&&d.push(f);d.length&&g.push({elem:i,handlers:d})}return h]","i"),va=/<(?!area|br|col|embed|hr|img|input|link|meta|param)(([\w:-]+)[^>]*)\/>/gi,wa=/\s*$/g,Aa=ca(d),Ba=Aa.appendChild(d.createElement("div"));function Ca(a,b){return n.nodeName(a,"table")&&n.nodeName(11!==b.nodeType?b:b.firstChild,"tr")?a.getElementsByTagName("tbody")[0]||a.appendChild(a.ownerDocument.createElement("tbody")):a}function Da(a){return a.type=(null!==n.find.attr(a,"type"))+"/"+a.type,a}function Ea(a){var b=ya.exec(a.type);return b?a.type=b[1]:a.removeAttribute("type"),a}function Fa(a,b){if(1===b.nodeType&&n.hasData(a)){var c,d,e,f=n._data(a),g=n._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++)n.event.add(b,c,h[c][d])}g.data&&(g.data=n.extend({},g.data))}}function Ga(a,b){var c,d,e;if(1===b.nodeType){if(c=b.nodeName.toLowerCase(),!l.noCloneEvent&&b[n.expando]){e=n._data(b);for(d in e.events)n.removeEvent(b,d,e.handle);b.removeAttribute(n.expando)}"script"===c&&b.text!==a.text?(Da(b).text=a.text,Ea(b)):"object"===c?(b.parentNode&&(b.outerHTML=a.outerHTML),l.html5Clone&&a.innerHTML&&!n.trim(b.innerHTML)&&(b.innerHTML=a.innerHTML)):"input"===c&&Z.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)}}function Ha(a,b,c,d){b=f.apply([],b);var e,g,h,i,j,k,m=0,o=a.length,p=o-1,q=b[0],r=n.isFunction(q);if(r||o>1&&"string"==typeof q&&!l.checkClone&&xa.test(q))return a.each(function(e){var f=a.eq(e);r&&(b[0]=q.call(this,e,f.html())),Ha(f,b,c,d)});if(o&&(k=ja(b,a[0].ownerDocument,!1,a,d),e=k.firstChild,1===k.childNodes.length&&(k=e),e||d)){for(i=n.map(ea(k,"script"),Da),h=i.length;o>m;m++)g=k,m!==p&&(g=n.clone(g,!0,!0),h&&n.merge(i,ea(g,"script"))),c.call(a[m],g,m);if(h)for(j=i[i.length-1].ownerDocument,n.map(i,Ea),m=0;h>m;m++)g=i[m],_.test(g.type||"")&&!n._data(g,"globalEval")&&n.contains(j,g)&&(g.src?n._evalUrl&&n._evalUrl(g.src):n.globalEval((g.text||g.textContent||g.innerHTML||"").replace(za,"")));k=e=null}return a}function Ia(a,b,c){for(var d,e=b?n.filter(b,a):a,f=0;null!=(d=e[f]);f++)c||1!==d.nodeType||n.cleanData(ea(d)),d.parentNode&&(c&&n.contains(d.ownerDocument,d)&&fa(ea(d,"script")),d.parentNode.removeChild(d));return a}n.extend({htmlPrefilter:function(a){return a.replace(va,"<$1>")},clone:function(a,b,c){var d,e,f,g,h,i=n.contains(a.ownerDocument,a);if(l.html5Clone||n.isXMLDoc(a)||!ua.test("<"+a.nodeName+">")?f=a.cloneNode(!0):(Ba.innerHTML=a.outerHTML,Ba.removeChild(f=Ba.firstChild)),!(l.noCloneEvent&&l.noCloneChecked||1!==a.nodeType&&11!==a.nodeType||n.isXMLDoc(a)))for(d=ea(f),h=ea(a),g=0;null!=(e=h[g]);++g)d[g]&&Ga(e,d[g]);if(b)if(c)for(h=h||ea(a),d=d||ea(f),g=0;null!=(e=h[g]);g++)Fa(e,d[g]);else Fa(a,f);return d=ea(f,"script"),d.length>0&&fa(d,!i&&ea(a,"script")),d=h=e=null,f},cleanData:function(a,b){for(var d,e,f,g,h=0,i=n.expando,j=n.cache,k=l.attributes,m=n.event.special;null!=(d=a[h]);h++)if((b||M(d))&&(f=d[i],g=f&&j[f])){if(g.events)for(e in g.events)m[e]?n.event.remove(d,e):n.removeEvent(d,e,g.handle);j[f]&&(delete j[f],k||"undefined"==typeof d.removeAttribute?d[i]=void 0:d.removeAttribute(i),c.push(f))}}}),n.fn.extend({domManip:Ha,detach:function(a){return Ia(this,a,!0)},remove:function(a){return Ia(this,a)},text:function(a){return Y(this,function(a){return void 0===a?n.text(this):this.empty().append((this[0]&&this[0].ownerDocument||d).createTextNode(a))},null,a,arguments.length)},append:function(){return Ha(this,arguments,function(a){if(1===this.nodeType||11===this.nodeType||9===this.nodeType){var b=Ca(this,a);b.appendChild(a)}})},prepend:function(){return Ha(this,arguments,function(a){if(1===this.nodeType||11===this.nodeType||9===this.nodeType){var b=Ca(this,a);b.insertBefore(a,b.firstChild)}})},before:function(){return Ha(this,arguments,function(a){this.parentNode&&this.parentNode.insertBefore(a,this)})},after:function(){return Ha(this,arguments,function(a){this.parentNode&&this.parentNode.insertBefore(a,this.nextSibling)})},empty:function(){for(var a,b=0;null!=(a=this[b]);b++){1===a.nodeType&&n.cleanData(ea(a,!1));while(a.firstChild)a.removeChild(a.firstChild);a.options&&n.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 n.clone(this,a,b)})},html:function(a){return Y(this,function(a){var b=this[0]||{},c=0,d=this.length;if(void 0===a)return 1===b.nodeType?b.innerHTML.replace(ta,""):void 0;if("string"==typeof a&&!wa.test(a)&&(l.htmlSerialize||!ua.test(a))&&(l.leadingWhitespace||!aa.test(a))&&!da[($.exec(a)||["",""])[1].toLowerCase()]){a=n.htmlPrefilter(a);try{for(;d>c;c++)b=this[c]||{},1===b.nodeType&&(n.cleanData(ea(b,!1)),b.innerHTML=a);b=0}catch(e){}}b&&this.empty().append(a)},null,a,arguments.length)},replaceWith:function(){var a=[];return Ha(this,arguments,function(b){var c=this.parentNode;n.inArray(this,a)<0&&(n.cleanData(ea(this)),c&&c.replaceChild(b,this))},a)}}),n.each({appendTo:"append",prependTo:"prepend",insertBefore:"before",insertAfter:"after",replaceAll:"replaceWith"},function(a,b){n.fn[a]=function(a){for(var c,d=0,e=[],f=n(a),h=f.length-1;h>=d;d++)c=d===h?this:this.clone(!0),n(f[d])[b](c),g.apply(e,c.get());return this.pushStack(e)}});var Ja,Ka={HTML:"block",BODY:"block"};function La(a,b){var c=n(b.createElement(a)).appendTo(b.body),d=n.css(c[0],"display");return c.detach(),d}function Ma(a){var b=d,c=Ka[a];return c||(c=La(a,b),"none"!==c&&c||(Ja=(Ja||n("