From e0ef372da4be9a03729d139159cbb490149cf8a4 Mon Sep 17 00:00:00 2001 From: Anthony Dresser Date: Mon, 1 Aug 2016 18:18:36 -0700 Subject: [PATCH] Slick gridwith angular2 (#7) * Refactored the project to run the front end code as a separate npm package * Added Slickgrid as UI component rather than Backgrid * Added Gulp scripts for building --- .gitignore | 6 +- .vscode/launch.json | 6 +- .vscode/settings.json | 8 +- .vscode/tasks.json | 45 +- README.md | 6 + gulpfile.js | 76 + install.js | 7 + package.json | 13 +- src/controllers/localWebService.ts | 2 +- src/controllers/queryRunner.ts | 24 +- src/languageservice/serviceclient.ts | 2 +- src/models/sqlOutputContentProvider.ts | 10 +- src/views/connectionUI.ts | 4 +- src/views/htmlcontent/css/backgrid-filter.css | 201 - .../htmlcontent/css/backgrid-paginator.css | 58 - src/views/htmlcontent/css/backgrid.css | 245 - src/views/htmlcontent/gulpfile.js | 1 + src/views/htmlcontent/package.json | 28 + src/views/htmlcontent/scripts/backbone.js | 1894 ------ .../htmlcontent/scripts/backbone.paginator.js | 1368 ---- .../htmlcontent/scripts/backgrid-filter.js | 518 -- .../htmlcontent/scripts/backgrid-paginator.js | 449 -- src/views/htmlcontent/scripts/backgrid.js | 2930 -------- src/views/htmlcontent/scripts/bootstrap.js | 2363 ------- src/views/htmlcontent/scripts/lunr.js | 2054 ------ src/views/htmlcontent/scripts/sqlOutput.js | 339 - .../htmlcontent/scripts/test_sqlGrids.js | 90 - src/views/htmlcontent/sqlOutput.ejs | 46 - .../htmlcontent/src/app/app.component.ts | 100 + src/views/htmlcontent/src/app/app.html | 4 + src/views/htmlcontent/src/app/dataService.ts | 77 + .../src/app/libs/SlickGrid/.gitignore | 3 + .../src/app/libs/SlickGrid/MIT-LICENSE.txt | 20 + .../src/app/libs/SlickGrid/README.md | 25 + .../SlickGrid/controls/slick.columnpicker.css | 31 + .../SlickGrid/controls/slick.columnpicker.js | 152 + .../libs/SlickGrid/controls/slick.pager.css | 41 + .../libs/SlickGrid/controls/slick.pager.js | 154 + .../images/ui-bg_flat_0_aaaaaa_40x100.png | Bin 0 -> 180 bytes .../images/ui-bg_flat_75_ffffff_40x100.png | Bin 0 -> 178 bytes .../images/ui-bg_glass_55_fbf9ee_1x400.png | Bin 0 -> 120 bytes .../images/ui-bg_glass_65_ffffff_1x400.png | Bin 0 -> 105 bytes .../images/ui-bg_glass_75_dadada_1x400.png | Bin 0 -> 111 bytes .../images/ui-bg_glass_75_e6e6e6_1x400.png | Bin 0 -> 110 bytes .../images/ui-bg_glass_95_fef1ec_1x400.png | Bin 0 -> 119 bytes .../ui-bg_highlight-soft_75_cccccc_1x100.png | Bin 0 -> 101 bytes .../images/ui-icons_222222_256x240.png | Bin 0 -> 4369 bytes .../images/ui-icons_2e83ff_256x240.png | Bin 0 -> 4369 bytes .../images/ui-icons_454545_256x240.png | Bin 0 -> 4369 bytes .../images/ui-icons_888888_256x240.png | Bin 0 -> 4369 bytes .../images/ui-icons_cd0a0a_256x240.png | Bin 0 -> 4369 bytes .../smoothness/jquery-ui-1.8.16.custom.css | 409 ++ .../src/app/libs/SlickGrid/images/actions.gif | Bin 0 -> 170 bytes .../SlickGrid/images/ajax-loader-small.gif | Bin 0 -> 1849 bytes .../app/libs/SlickGrid/images/arrow_redo.png | Bin 0 -> 572 bytes .../images/arrow_right_peppermint.png | Bin 0 -> 128 bytes .../images/arrow_right_spearmint.png | Bin 0 -> 128 bytes .../app/libs/SlickGrid/images/arrow_undo.png | Bin 0 -> 578 bytes .../app/libs/SlickGrid/images/bullet_blue.png | Bin 0 -> 241 bytes .../app/libs/SlickGrid/images/bullet_star.png | Bin 0 -> 279 bytes .../SlickGrid/images/bullet_toggle_minus.png | Bin 0 -> 154 bytes .../SlickGrid/images/bullet_toggle_plus.png | Bin 0 -> 156 bytes .../app/libs/SlickGrid/images/calendar.gif | Bin 0 -> 1035 bytes .../app/libs/SlickGrid/images/collapse.gif | Bin 0 -> 846 bytes .../libs/SlickGrid/images/comment_yellow.gif | Bin 0 -> 257 bytes .../src/app/libs/SlickGrid/images/down.gif | Bin 0 -> 59 bytes .../app/libs/SlickGrid/images/drag-handle.png | Bin 0 -> 1130 bytes .../SlickGrid/images/editor-helper-bg.gif | Bin 0 -> 1164 bytes .../src/app/libs/SlickGrid/images/expand.gif | Bin 0 -> 851 bytes .../app/libs/SlickGrid/images/header-bg.gif | Bin 0 -> 872 bytes .../SlickGrid/images/header-columns-bg.gif | Bin 0 -> 836 bytes .../images/header-columns-over-bg.gif | Bin 0 -> 823 bytes .../src/app/libs/SlickGrid/images/help.png | Bin 0 -> 345 bytes .../src/app/libs/SlickGrid/images/info.gif | Bin 0 -> 80 bytes .../app/libs/SlickGrid/images/listview.gif | Bin 0 -> 2380 bytes .../src/app/libs/SlickGrid/images/pencil.gif | Bin 0 -> 914 bytes .../app/libs/SlickGrid/images/row-over-bg.gif | Bin 0 -> 823 bytes .../app/libs/SlickGrid/images/sort-asc.gif | Bin 0 -> 830 bytes .../app/libs/SlickGrid/images/sort-asc.png | Bin 0 -> 105 bytes .../app/libs/SlickGrid/images/sort-desc.gif | Bin 0 -> 833 bytes .../app/libs/SlickGrid/images/sort-desc.png | Bin 0 -> 107 bytes .../src/app/libs/SlickGrid/images/stripes.png | Bin 0 -> 1125 bytes .../src/app/libs/SlickGrid/images/tag_red.png | Bin 0 -> 537 bytes .../src/app/libs/SlickGrid/images/tick.png | Bin 0 -> 484 bytes .../libs/SlickGrid/images/user_identity.gif | Bin 0 -> 905 bytes .../SlickGrid/images/user_identity_plus.gif | Bin 0 -> 546 bytes .../src/app/libs/SlickGrid/lib/firebugx.js | 9 + .../app/libs/SlickGrid/lib/jquery-1.7.min.js | 4 + .../lib/jquery-ui-1.8.16.custom.min.js | 611 ++ .../SlickGrid/lib/jquery.event.drag-2.2.js | 402 ++ .../SlickGrid/lib/jquery.event.drop-2.2.js | 302 + .../SlickGrid/lib/jquery.jsonp-2.4.min.js | 3 + .../SlickGrid/lib/jquery.sparkline.min.js | 79 + .../src/app/libs/SlickGrid/lib/qunit.css | 119 + .../src/app/libs/SlickGrid/lib/qunit.js | 1069 +++ .../SlickGrid/plugins/slick.autotooltips.js | 83 + .../plugins/slick.cellcopymanager.js | 86 + .../plugins/slick.cellrangedecorator.js | 66 + .../plugins/slick.cellrangeselector.js | 113 + .../plugins/slick.cellselectionmodel.js | 154 + .../plugins/slick.checkboxselectcolumn.js | 153 + .../SlickGrid/plugins/slick.headerbuttons.css | 39 + .../SlickGrid/plugins/slick.headerbuttons.js | 177 + .../SlickGrid/plugins/slick.headermenu.css | 59 + .../SlickGrid/plugins/slick.headermenu.js | 275 + .../SlickGrid/plugins/slick.rowmovemanager.js | 138 + .../plugins/slick.rowselectionmodel.js | 187 + .../libs/SlickGrid/slick-default-theme.css | 118 + .../src/app/libs/SlickGrid/slick.core.js | 467 ++ .../src/app/libs/SlickGrid/slick.dataview.js | 1126 ++++ .../src/app/libs/SlickGrid/slick.editors.js | 512 ++ .../app/libs/SlickGrid/slick.formatters.js | 59 + .../src/app/libs/SlickGrid/slick.grid.css | 183 + .../src/app/libs/SlickGrid/slick.grid.js | 3751 +++++++++++ .../slick.groupitemmetadataprovider.js | 158 + .../app/libs/SlickGrid/slick.remotemodel.js | 173 + .../libs/SlickGrid/tests/dataview/dataview.js | 843 +++ .../libs/SlickGrid/tests/dataview/index.html | 24 + .../src/app/libs/SlickGrid/tests/grid/grid.js | 68 + .../app/libs/SlickGrid/tests/grid/index.html | 34 + .../src/app/libs/SlickGrid/tests/index.html | 40 + .../libs/SlickGrid/tests/init benchmark.html | 57 + .../SlickGrid/tests/model benchmarks.html | 110 + .../SlickGrid/tests/plugins/autotooltips.html | 34 + .../SlickGrid/tests/plugins/autotooltips.js | 133 + .../tests/scrolling benchmark raf.html | 154 + .../SlickGrid/tests/scrolling benchmarks.html | 135 + .../src/app/libs/jquery.event.drag.js | 402 ++ .../{scripts => src/app/libs}/jquery.js | 111 +- .../src/app/libs/underscore-min.js | 6 + src/views/htmlcontent/src/app/main.ts | 7 + .../htmlcontent/src/app/slickgrid/API.ts | 6 + .../src/app/slickgrid/BackingModel.ts | 6 + .../src/app/slickgrid/BaseLibrary.ts | 30 + .../src/app/slickgrid/EngineAPI.ts | 14 + .../src/app/slickgrid/GridSyncService.ts | 118 + .../src/app/slickgrid/Localization.ts | 412 ++ .../src/app/slickgrid/LocalizationService.ts | 18 + .../src/app/slickgrid/ModelInterfaces.ts | 4 + .../src/app/slickgrid/SelectionModel.ts | 202 + .../app/slickgrid/SharedControlInterfaces.ts | 8 + .../src/app/slickgrid/SlickGrid.html | 1 + .../src/app/slickgrid/SlickGrid.less | 127 + .../src/app/slickgrid/SlickGrid.ts | 556 ++ .../src/app/slickgrid/ViewModel.ts | 5 + .../src/app/slickgrid/slickgrid.css | 120 + .../htmlcontent/{css => src}/bootstrap.css | 0 .../htmlcontent/src/color-theme-light.css | 49 + src/views/htmlcontent/src/config.js | 15 + .../htmlcontent/src/resources/add-all.svg | 11 + .../htmlcontent/src/resources/app_Icon.icns | Bin 0 -> 75871 bytes .../htmlcontent/src/resources/app_Icon.ico | Bin 0 -> 370070 bytes .../htmlcontent/src/resources/app_Icon.png | Bin 0 -> 9696 bytes .../htmlcontent/src/resources/app_Icon.svg | 1 + .../htmlcontent/src/resources/arrow-down.svg | 6 + .../src/resources/arrow-left-white.svg | 6 + .../src/resources/arrow-up-white.svg | 6 + .../htmlcontent/src/resources/arrow-up.svg | 6 + .../src/resources/chevron-down.svg | 8 + .../htmlcontent/src/resources/circle.svg | 6 + .../htmlcontent/src/resources/close-red.svg | 10 + .../htmlcontent/src/resources/close-white.svg | 10 + src/views/htmlcontent/src/resources/close.svg | 10 + .../src/resources/col-type-boolean.svg | 11 + .../src/resources/col-type-number.svg | 9 + .../src/resources/col-type-string.svg | 31 + .../src/resources/col-type-timedate.svg | 6 + .../src/resources/create-project.svg | 2 + .../src/resources/data-profile.svg | 8 + .../htmlcontent/src/resources/delete.svg | 14 + .../htmlcontent/src/resources/edit-white.svg | 13 + src/views/htmlcontent/src/resources/edit.svg | 13 + .../src/resources/filter-white.svg | 6 + .../htmlcontent/src/resources/filter.svg | 6 + .../htmlcontent/src/resources/filteradd.svg | 1 + .../src/resources/filtersubtract.svg | 1 + src/views/htmlcontent/src/resources/input.svg | 7 + .../htmlcontent/src/resources/maximize.svg | 11 + .../src/resources/minus-all-objects.svg | 11 + .../src/resources/open-datasource.svg | 1 + .../src/resources/open-project.svg | 1 + .../htmlcontent/src/resources/output.svg | 7 + src/views/htmlcontent/src/resources/query.svg | 10 + .../src/resources/recent-project.svg | 1 + .../htmlcontent/src/resources/refine.svg | 17 + .../src/resources/robot-cowboy.svg | 274 + src/views/htmlcontent/src/resources/sad.svg | 19 + .../htmlcontent/src/resources/shift-left.svg | 6 + .../htmlcontent/src/resources/smiley.svg | 20 + .../src/resources/sort-ascending.svg | 6 + .../htmlcontent/src/resources/status-fail.svg | 14 + .../htmlcontent/src/resources/status-none.svg | 7 + .../src/resources/status-success.svg | 13 + .../src/resources/status_inprogress.svg | 24 + src/views/htmlcontent/src/resources/table.svg | 8 + .../htmlcontent/src/resources/tutorial.json | 43 + src/views/htmlcontent/src/sqlOutput.ejs | 50 + src/views/htmlcontent/tsconfig.json | 14 + src/views/htmlcontent/tslint.json | 127 + src/views/htmlcontent/typings/typings.d.ts | 3 + src/views/htmlcontent/typings/underscore.d.ts | 5920 +++++++++++++++++ tasks/config.js | 22 + tasks/htmltasks.js | 50 + test/{ => resources}/messages.json | 0 test/{ => resources}/results.json | 0 test/{ => resources}/sqlTest.sql | 0 test/sqlOutputContentProvider.test.ts | 11 +- tools/Microsoft.SqlTools.ServiceLayer.dll | Bin 108032 -> 0 bytes tools/Microsoft.SqlTools.ServiceLayer.pdb | Bin 31764 -> 0 bytes ...t.SqlTools.ServiceLayer.runtimeconfig.json | 8 - tools/Newtonsoft.Json.dll | Bin 468480 -> 0 bytes ...ystem.Runtime.Serialization.Primitives.dll | Bin 29632 -> 0 bytes tsconfig.json | 6 +- typings/vscode-typings.d.ts | 2 +- 214 files changed, 22557 insertions(+), 12690 deletions(-) create mode 100644 gulpfile.js create mode 100644 install.js delete mode 100644 src/views/htmlcontent/css/backgrid-filter.css delete mode 100644 src/views/htmlcontent/css/backgrid-paginator.css delete mode 100644 src/views/htmlcontent/css/backgrid.css create mode 100644 src/views/htmlcontent/gulpfile.js create mode 100644 src/views/htmlcontent/package.json delete mode 100644 src/views/htmlcontent/scripts/backbone.js delete mode 100644 src/views/htmlcontent/scripts/backbone.paginator.js delete mode 100644 src/views/htmlcontent/scripts/backgrid-filter.js delete mode 100644 src/views/htmlcontent/scripts/backgrid-paginator.js delete mode 100644 src/views/htmlcontent/scripts/backgrid.js delete mode 100644 src/views/htmlcontent/scripts/bootstrap.js delete mode 100644 src/views/htmlcontent/scripts/lunr.js delete mode 100644 src/views/htmlcontent/scripts/sqlOutput.js delete mode 100644 src/views/htmlcontent/scripts/test_sqlGrids.js delete mode 100644 src/views/htmlcontent/sqlOutput.ejs create mode 100644 src/views/htmlcontent/src/app/app.component.ts create mode 100644 src/views/htmlcontent/src/app/app.html create mode 100644 src/views/htmlcontent/src/app/dataService.ts create mode 100644 src/views/htmlcontent/src/app/libs/SlickGrid/.gitignore create mode 100644 src/views/htmlcontent/src/app/libs/SlickGrid/MIT-LICENSE.txt create mode 100644 src/views/htmlcontent/src/app/libs/SlickGrid/README.md create mode 100644 src/views/htmlcontent/src/app/libs/SlickGrid/controls/slick.columnpicker.css create mode 100644 src/views/htmlcontent/src/app/libs/SlickGrid/controls/slick.columnpicker.js create mode 100644 src/views/htmlcontent/src/app/libs/SlickGrid/controls/slick.pager.css create mode 100644 src/views/htmlcontent/src/app/libs/SlickGrid/controls/slick.pager.js create mode 100644 src/views/htmlcontent/src/app/libs/SlickGrid/css/smoothness/images/ui-bg_flat_0_aaaaaa_40x100.png create mode 100644 src/views/htmlcontent/src/app/libs/SlickGrid/css/smoothness/images/ui-bg_flat_75_ffffff_40x100.png create mode 100644 src/views/htmlcontent/src/app/libs/SlickGrid/css/smoothness/images/ui-bg_glass_55_fbf9ee_1x400.png create mode 100644 src/views/htmlcontent/src/app/libs/SlickGrid/css/smoothness/images/ui-bg_glass_65_ffffff_1x400.png create mode 100644 src/views/htmlcontent/src/app/libs/SlickGrid/css/smoothness/images/ui-bg_glass_75_dadada_1x400.png create mode 100644 src/views/htmlcontent/src/app/libs/SlickGrid/css/smoothness/images/ui-bg_glass_75_e6e6e6_1x400.png create mode 100644 src/views/htmlcontent/src/app/libs/SlickGrid/css/smoothness/images/ui-bg_glass_95_fef1ec_1x400.png create mode 100644 src/views/htmlcontent/src/app/libs/SlickGrid/css/smoothness/images/ui-bg_highlight-soft_75_cccccc_1x100.png create mode 100644 src/views/htmlcontent/src/app/libs/SlickGrid/css/smoothness/images/ui-icons_222222_256x240.png create mode 100644 src/views/htmlcontent/src/app/libs/SlickGrid/css/smoothness/images/ui-icons_2e83ff_256x240.png create mode 100644 src/views/htmlcontent/src/app/libs/SlickGrid/css/smoothness/images/ui-icons_454545_256x240.png create mode 100644 src/views/htmlcontent/src/app/libs/SlickGrid/css/smoothness/images/ui-icons_888888_256x240.png create mode 100644 src/views/htmlcontent/src/app/libs/SlickGrid/css/smoothness/images/ui-icons_cd0a0a_256x240.png create mode 100644 src/views/htmlcontent/src/app/libs/SlickGrid/css/smoothness/jquery-ui-1.8.16.custom.css create mode 100644 src/views/htmlcontent/src/app/libs/SlickGrid/images/actions.gif create mode 100644 src/views/htmlcontent/src/app/libs/SlickGrid/images/ajax-loader-small.gif create mode 100644 src/views/htmlcontent/src/app/libs/SlickGrid/images/arrow_redo.png create mode 100644 src/views/htmlcontent/src/app/libs/SlickGrid/images/arrow_right_peppermint.png create mode 100644 src/views/htmlcontent/src/app/libs/SlickGrid/images/arrow_right_spearmint.png create mode 100644 src/views/htmlcontent/src/app/libs/SlickGrid/images/arrow_undo.png create mode 100644 src/views/htmlcontent/src/app/libs/SlickGrid/images/bullet_blue.png create mode 100644 src/views/htmlcontent/src/app/libs/SlickGrid/images/bullet_star.png create mode 100644 src/views/htmlcontent/src/app/libs/SlickGrid/images/bullet_toggle_minus.png create mode 100644 src/views/htmlcontent/src/app/libs/SlickGrid/images/bullet_toggle_plus.png create mode 100644 src/views/htmlcontent/src/app/libs/SlickGrid/images/calendar.gif create mode 100644 src/views/htmlcontent/src/app/libs/SlickGrid/images/collapse.gif create mode 100644 src/views/htmlcontent/src/app/libs/SlickGrid/images/comment_yellow.gif create mode 100644 src/views/htmlcontent/src/app/libs/SlickGrid/images/down.gif create mode 100644 src/views/htmlcontent/src/app/libs/SlickGrid/images/drag-handle.png create mode 100644 src/views/htmlcontent/src/app/libs/SlickGrid/images/editor-helper-bg.gif create mode 100644 src/views/htmlcontent/src/app/libs/SlickGrid/images/expand.gif create mode 100644 src/views/htmlcontent/src/app/libs/SlickGrid/images/header-bg.gif create mode 100644 src/views/htmlcontent/src/app/libs/SlickGrid/images/header-columns-bg.gif create mode 100644 src/views/htmlcontent/src/app/libs/SlickGrid/images/header-columns-over-bg.gif create mode 100644 src/views/htmlcontent/src/app/libs/SlickGrid/images/help.png create mode 100644 src/views/htmlcontent/src/app/libs/SlickGrid/images/info.gif create mode 100644 src/views/htmlcontent/src/app/libs/SlickGrid/images/listview.gif create mode 100644 src/views/htmlcontent/src/app/libs/SlickGrid/images/pencil.gif create mode 100644 src/views/htmlcontent/src/app/libs/SlickGrid/images/row-over-bg.gif create mode 100644 src/views/htmlcontent/src/app/libs/SlickGrid/images/sort-asc.gif create mode 100644 src/views/htmlcontent/src/app/libs/SlickGrid/images/sort-asc.png create mode 100644 src/views/htmlcontent/src/app/libs/SlickGrid/images/sort-desc.gif create mode 100644 src/views/htmlcontent/src/app/libs/SlickGrid/images/sort-desc.png create mode 100644 src/views/htmlcontent/src/app/libs/SlickGrid/images/stripes.png create mode 100644 src/views/htmlcontent/src/app/libs/SlickGrid/images/tag_red.png create mode 100644 src/views/htmlcontent/src/app/libs/SlickGrid/images/tick.png create mode 100644 src/views/htmlcontent/src/app/libs/SlickGrid/images/user_identity.gif create mode 100644 src/views/htmlcontent/src/app/libs/SlickGrid/images/user_identity_plus.gif create mode 100644 src/views/htmlcontent/src/app/libs/SlickGrid/lib/firebugx.js create mode 100644 src/views/htmlcontent/src/app/libs/SlickGrid/lib/jquery-1.7.min.js create mode 100644 src/views/htmlcontent/src/app/libs/SlickGrid/lib/jquery-ui-1.8.16.custom.min.js create mode 100644 src/views/htmlcontent/src/app/libs/SlickGrid/lib/jquery.event.drag-2.2.js create mode 100644 src/views/htmlcontent/src/app/libs/SlickGrid/lib/jquery.event.drop-2.2.js create mode 100644 src/views/htmlcontent/src/app/libs/SlickGrid/lib/jquery.jsonp-2.4.min.js create mode 100644 src/views/htmlcontent/src/app/libs/SlickGrid/lib/jquery.sparkline.min.js create mode 100644 src/views/htmlcontent/src/app/libs/SlickGrid/lib/qunit.css create mode 100644 src/views/htmlcontent/src/app/libs/SlickGrid/lib/qunit.js create mode 100644 src/views/htmlcontent/src/app/libs/SlickGrid/plugins/slick.autotooltips.js create mode 100644 src/views/htmlcontent/src/app/libs/SlickGrid/plugins/slick.cellcopymanager.js create mode 100644 src/views/htmlcontent/src/app/libs/SlickGrid/plugins/slick.cellrangedecorator.js create mode 100644 src/views/htmlcontent/src/app/libs/SlickGrid/plugins/slick.cellrangeselector.js create mode 100644 src/views/htmlcontent/src/app/libs/SlickGrid/plugins/slick.cellselectionmodel.js create mode 100644 src/views/htmlcontent/src/app/libs/SlickGrid/plugins/slick.checkboxselectcolumn.js create mode 100644 src/views/htmlcontent/src/app/libs/SlickGrid/plugins/slick.headerbuttons.css create mode 100644 src/views/htmlcontent/src/app/libs/SlickGrid/plugins/slick.headerbuttons.js create mode 100644 src/views/htmlcontent/src/app/libs/SlickGrid/plugins/slick.headermenu.css create mode 100644 src/views/htmlcontent/src/app/libs/SlickGrid/plugins/slick.headermenu.js create mode 100644 src/views/htmlcontent/src/app/libs/SlickGrid/plugins/slick.rowmovemanager.js create mode 100644 src/views/htmlcontent/src/app/libs/SlickGrid/plugins/slick.rowselectionmodel.js create mode 100644 src/views/htmlcontent/src/app/libs/SlickGrid/slick-default-theme.css create mode 100644 src/views/htmlcontent/src/app/libs/SlickGrid/slick.core.js create mode 100644 src/views/htmlcontent/src/app/libs/SlickGrid/slick.dataview.js create mode 100644 src/views/htmlcontent/src/app/libs/SlickGrid/slick.editors.js create mode 100644 src/views/htmlcontent/src/app/libs/SlickGrid/slick.formatters.js create mode 100644 src/views/htmlcontent/src/app/libs/SlickGrid/slick.grid.css create mode 100644 src/views/htmlcontent/src/app/libs/SlickGrid/slick.grid.js create mode 100644 src/views/htmlcontent/src/app/libs/SlickGrid/slick.groupitemmetadataprovider.js create mode 100644 src/views/htmlcontent/src/app/libs/SlickGrid/slick.remotemodel.js create mode 100644 src/views/htmlcontent/src/app/libs/SlickGrid/tests/dataview/dataview.js create mode 100644 src/views/htmlcontent/src/app/libs/SlickGrid/tests/dataview/index.html create mode 100644 src/views/htmlcontent/src/app/libs/SlickGrid/tests/grid/grid.js create mode 100644 src/views/htmlcontent/src/app/libs/SlickGrid/tests/grid/index.html create mode 100644 src/views/htmlcontent/src/app/libs/SlickGrid/tests/index.html create mode 100644 src/views/htmlcontent/src/app/libs/SlickGrid/tests/init benchmark.html create mode 100644 src/views/htmlcontent/src/app/libs/SlickGrid/tests/model benchmarks.html create mode 100644 src/views/htmlcontent/src/app/libs/SlickGrid/tests/plugins/autotooltips.html create mode 100644 src/views/htmlcontent/src/app/libs/SlickGrid/tests/plugins/autotooltips.js create mode 100644 src/views/htmlcontent/src/app/libs/SlickGrid/tests/scrolling benchmark raf.html create mode 100644 src/views/htmlcontent/src/app/libs/SlickGrid/tests/scrolling benchmarks.html create mode 100644 src/views/htmlcontent/src/app/libs/jquery.event.drag.js rename src/views/htmlcontent/{scripts => src/app/libs}/jquery.js (99%) create mode 100644 src/views/htmlcontent/src/app/libs/underscore-min.js create mode 100644 src/views/htmlcontent/src/app/main.ts create mode 100644 src/views/htmlcontent/src/app/slickgrid/API.ts create mode 100644 src/views/htmlcontent/src/app/slickgrid/BackingModel.ts create mode 100644 src/views/htmlcontent/src/app/slickgrid/BaseLibrary.ts create mode 100644 src/views/htmlcontent/src/app/slickgrid/EngineAPI.ts create mode 100644 src/views/htmlcontent/src/app/slickgrid/GridSyncService.ts create mode 100644 src/views/htmlcontent/src/app/slickgrid/Localization.ts create mode 100644 src/views/htmlcontent/src/app/slickgrid/LocalizationService.ts create mode 100644 src/views/htmlcontent/src/app/slickgrid/ModelInterfaces.ts create mode 100644 src/views/htmlcontent/src/app/slickgrid/SelectionModel.ts create mode 100644 src/views/htmlcontent/src/app/slickgrid/SharedControlInterfaces.ts create mode 100644 src/views/htmlcontent/src/app/slickgrid/SlickGrid.html create mode 100644 src/views/htmlcontent/src/app/slickgrid/SlickGrid.less create mode 100644 src/views/htmlcontent/src/app/slickgrid/SlickGrid.ts create mode 100644 src/views/htmlcontent/src/app/slickgrid/ViewModel.ts create mode 100644 src/views/htmlcontent/src/app/slickgrid/slickgrid.css rename src/views/htmlcontent/{css => src}/bootstrap.css (100%) create mode 100644 src/views/htmlcontent/src/color-theme-light.css create mode 100644 src/views/htmlcontent/src/config.js create mode 100644 src/views/htmlcontent/src/resources/add-all.svg create mode 100644 src/views/htmlcontent/src/resources/app_Icon.icns create mode 100644 src/views/htmlcontent/src/resources/app_Icon.ico create mode 100644 src/views/htmlcontent/src/resources/app_Icon.png create mode 100644 src/views/htmlcontent/src/resources/app_Icon.svg create mode 100644 src/views/htmlcontent/src/resources/arrow-down.svg create mode 100644 src/views/htmlcontent/src/resources/arrow-left-white.svg create mode 100644 src/views/htmlcontent/src/resources/arrow-up-white.svg create mode 100644 src/views/htmlcontent/src/resources/arrow-up.svg create mode 100644 src/views/htmlcontent/src/resources/chevron-down.svg create mode 100644 src/views/htmlcontent/src/resources/circle.svg create mode 100644 src/views/htmlcontent/src/resources/close-red.svg create mode 100644 src/views/htmlcontent/src/resources/close-white.svg create mode 100644 src/views/htmlcontent/src/resources/close.svg create mode 100644 src/views/htmlcontent/src/resources/col-type-boolean.svg create mode 100644 src/views/htmlcontent/src/resources/col-type-number.svg create mode 100644 src/views/htmlcontent/src/resources/col-type-string.svg create mode 100644 src/views/htmlcontent/src/resources/col-type-timedate.svg create mode 100644 src/views/htmlcontent/src/resources/create-project.svg create mode 100644 src/views/htmlcontent/src/resources/data-profile.svg create mode 100644 src/views/htmlcontent/src/resources/delete.svg create mode 100644 src/views/htmlcontent/src/resources/edit-white.svg create mode 100644 src/views/htmlcontent/src/resources/edit.svg create mode 100644 src/views/htmlcontent/src/resources/filter-white.svg create mode 100644 src/views/htmlcontent/src/resources/filter.svg create mode 100644 src/views/htmlcontent/src/resources/filteradd.svg create mode 100644 src/views/htmlcontent/src/resources/filtersubtract.svg create mode 100644 src/views/htmlcontent/src/resources/input.svg create mode 100644 src/views/htmlcontent/src/resources/maximize.svg create mode 100644 src/views/htmlcontent/src/resources/minus-all-objects.svg create mode 100644 src/views/htmlcontent/src/resources/open-datasource.svg create mode 100644 src/views/htmlcontent/src/resources/open-project.svg create mode 100644 src/views/htmlcontent/src/resources/output.svg create mode 100644 src/views/htmlcontent/src/resources/query.svg create mode 100644 src/views/htmlcontent/src/resources/recent-project.svg create mode 100644 src/views/htmlcontent/src/resources/refine.svg create mode 100644 src/views/htmlcontent/src/resources/robot-cowboy.svg create mode 100644 src/views/htmlcontent/src/resources/sad.svg create mode 100644 src/views/htmlcontent/src/resources/shift-left.svg create mode 100644 src/views/htmlcontent/src/resources/smiley.svg create mode 100644 src/views/htmlcontent/src/resources/sort-ascending.svg create mode 100644 src/views/htmlcontent/src/resources/status-fail.svg create mode 100644 src/views/htmlcontent/src/resources/status-none.svg create mode 100644 src/views/htmlcontent/src/resources/status-success.svg create mode 100644 src/views/htmlcontent/src/resources/status_inprogress.svg create mode 100644 src/views/htmlcontent/src/resources/table.svg create mode 100644 src/views/htmlcontent/src/resources/tutorial.json create mode 100644 src/views/htmlcontent/src/sqlOutput.ejs create mode 100644 src/views/htmlcontent/tsconfig.json create mode 100644 src/views/htmlcontent/tslint.json create mode 100644 src/views/htmlcontent/typings/typings.d.ts create mode 100644 src/views/htmlcontent/typings/underscore.d.ts create mode 100644 tasks/config.js create mode 100644 tasks/htmltasks.js rename test/{ => resources}/messages.json (100%) rename test/{ => resources}/results.json (100%) rename test/{ => resources}/sqlTest.sql (100%) delete mode 100644 tools/Microsoft.SqlTools.ServiceLayer.dll delete mode 100644 tools/Microsoft.SqlTools.ServiceLayer.pdb delete mode 100644 tools/Microsoft.SqlTools.ServiceLayer.runtimeconfig.json delete mode 100644 tools/Newtonsoft.Json.dll delete mode 100644 tools/System.Runtime.Serialization.Primitives.dll diff --git a/.gitignore b/.gitignore index 8e5962ee72..f7a2954ad8 100644 --- a/.gitignore +++ b/.gitignore @@ -1,2 +1,6 @@ out -node_modules \ No newline at end of file +node_modules +.DS_Store +*.log +tools +examples \ No newline at end of file diff --git a/.vscode/launch.json b/.vscode/launch.json index 148f45d8ac..5f43a5b071 100644 --- a/.vscode/launch.json +++ b/.vscode/launch.json @@ -10,8 +10,7 @@ "args": ["--extensionDevelopmentPath=${workspaceRoot}" ], "stopOnEntry": false, "sourceMaps": true, - "outDir": "${workspaceRoot}/out/src", - "preLaunchTask": "npm" + "outDir": "${workspaceRoot}/out/src" }, { "name": "Launch Tests", @@ -21,8 +20,7 @@ "args": ["--extensionDevelopmentPath=${workspaceRoot}", "--extensionTestsPath=${workspaceRoot}/out/test"], "stopOnEntry": false, "sourceMaps": true, - "outDir": "${workspaceRoot}/out/test", - "preLaunchTask": "npm" + "outDir": "${workspaceRoot}/out/test" } ] } diff --git a/.vscode/settings.json b/.vscode/settings.json index d46de65889..e48e68991f 100644 --- a/.vscode/settings.json +++ b/.vscode/settings.json @@ -1,12 +1,16 @@ // Place your settings in this file to overwrite default and user settings. { "files.trimTrailingWhitespace": true, - + "files.exclude": { "out": false // set this to true to hide the "out" folder with the compiled JS files }, "search.exclude": { "out": true // set this to false to include "out" folder in search results }, - "typescript.tsdk": "./node_modules/typescript/lib" // we want to use the TS server from our node_modules folder to control its version + "typescript.tsdk": "./node_modules/typescript/lib", // we want to use the TS server from our node_modules folder to control its version + "files.watcherExclude": { + "**/.git/objects/**": true, + "**/out/*" : true + } } \ No newline at end of file diff --git a/.vscode/tasks.json b/.vscode/tasks.json index fb7f662e14..ebe3ce86c4 100644 --- a/.vscode/tasks.json +++ b/.vscode/tasks.json @@ -1,30 +1,23 @@ -// Available variables which can be used inside of strings. -// ${workspaceRoot}: the root folder of the team -// ${file}: the current opened file -// ${fileBasename}: the current opened file's basename -// ${fileDirname}: the current opened file's dirname -// ${fileExtname}: the current opened file's extension -// ${cwd}: the current working directory of the spawned process - -// A task runner that calls a custom npm script that compiles the extension. { + // See https://go.microsoft.com/fwlink/?LinkId=733558 + // for the documentation about the tasks.json format "version": "0.1.0", - - // we want to run npm - "command": "npm", - - // the command is a shell script + "command": "gulp", "isShellCommand": true, - - // show the output window only if unrecognized errors occur. - "showOutput": "silent", - - // we run the custom script "compile" as defined in package.json - "args": ["run", "compile", "--loglevel", "silent"], - - // The tsc compiler is started in watching mode - "isWatching": true, - - // use the standard tsc in watch mode problem matcher to find compile problems in the output. - "problemMatcher": "$tsc-watch" + "args": [ + "--no-color" + ], + "tasks": [ + { + "taskName": "build-all", + "args": [], + "isBuildCommand": true, + "isWatching": false, + "problemMatcher": [ + "$lessCompile", + "$tsc", + "$jshint" + ] + } + ] } \ No newline at end of file diff --git a/README.md b/README.md index 3a1248f50c..5030586973 100644 --- a/README.md +++ b/README.md @@ -28,6 +28,12 @@ Head over to [Github](https://github.com/sanagama/vscode-mssql) for the source c ##Usage First, download and install Visual Studio Code `1.0` (or later) for your platform from here: [download Visual Studio Code](https://code.visualstudio.com/#alt-downloads) +###Building the extension +1. Requires NodeJS: +2. If you do not already have gulp CLI installed run `npm install -g gulp-cli` +3. From the root directory run `npm run install-packages` +4. From the root directory run `gulp build-all` + ###Installing the extension 1. Launch Visual Studio Code 2. Press `F1` to open the command palette diff --git a/gulpfile.js b/gulpfile.js new file mode 100644 index 0000000000..03826f330e --- /dev/null +++ b/gulpfile.js @@ -0,0 +1,76 @@ +var gulp = require('gulp'); +var install = require('gulp-install'); +var tslint = require('gulp-tslint'); +var ts = require('gulp-typescript'); +var tsProject = ts.createProject('tsconfig.json'); +var del = require('del'); +var srcmap = require('gulp-sourcemaps'); +var config = require('./tasks/config'); + +require('./tasks/htmltasks') + +gulp.task('ext:tslint', () => { + return gulp.src([ + config.paths.project.root + '/src/**/*.ts', + '!' + config.paths.project.root + '/src/views/htmlcontent/**/*' + ]) + .pipe((tslint({ + formatter: "verbose" + }))) + .pipe(tslint.report()); +}); + +gulp.task('ext:compile-src', () => { + return gulp.src([ + config.paths.project.root + '/src/**/*.ts', + config.paths.project.root + '/typings/**/*.ts', + '!' + config.paths.project.root + '/src/views/htmlcontent/**/*']) + .pipe(srcmap.init()) + .pipe(ts(tsProject)) + .pipe(srcmap.write('.')) + .pipe(gulp.dest('out/src/')); +}); + +gulp.task('ext:compile-tests', () => { + return gulp.src([ + config.paths.project.root + '/test/**/*.ts', + config.paths.project.root + '/typings/**/*.ts']) + .pipe(srcmap.init()) + .pipe(ts(tsProject)) + .pipe(srcmap.write('.')) + .pipe(gulp.dest('out/test/')); + +}) + +gulp.task('ext:compile', gulp.series('ext:compile-src', 'ext:compile-tests')); + +gulp.task('ext:copy-tests', () => { + return gulp.src(config.paths.project.root + '/test/resources/**/*') + .pipe(gulp.dest(config.paths.project.root + '/out/test/resources/')) +}) + +gulp.task('ext:copy-html', () => { + return gulp.src(config.paths.project.root + '/src/views/htmlcontent/src/**/*') + .pipe(gulp.dest(config.paths.project.root + '/out/src/views/htmlcontent/')) +}) + +gulp.task('ext:copy', gulp.series('ext:copy-tests', 'ext:copy-html')) + +gulp.task('ext:build', gulp.series('ext:compile', 'ext:copy')); + +gulp.task('ext:clean', () => { + return del('out') +}); + +gulp.task('build-extension', gulp.series('ext:tslint', 'ext:clean', 'ext:build')); + +gulp.task('build-all', gulp.series('build-html', 'build-extension')); + +gulp.task('install', function(){ + return gulp.src(['./package.json', './src/views/htmlcontent/package.json']) + .pipe(install()); +}) + +gulp.task('watch', function(){ + return gulp.watch(config.paths.project.root + '/src/**/*', gulp.series('build-all')) +}) \ No newline at end of file diff --git a/install.js b/install.js new file mode 100644 index 0000000000..d441fdfcd9 --- /dev/null +++ b/install.js @@ -0,0 +1,7 @@ +var gulp = require('gulp'); +var install = require('gulp-install'); + +gulp.task('install', function(){ + return gulp.src(['./package.json', './src/views/htmlcontent/package.json']) + .pipe(install()); +}); \ No newline at end of file diff --git a/package.json b/package.json index 71117e6440..694f3e56b3 100644 --- a/package.json +++ b/package.json @@ -40,6 +40,15 @@ "vscode.sql" ], "devDependencies": { + "del": "^2.2.1", + "gulp": "github:gulpjs/gulp#4.0", + "gulp-hub": "frankwallis/gulp-hub#registry-init", + "gulp-install": "^0.6.0", + "gulp-less": "^3.1.0", + "gulp-sourcemaps": "^1.6.0", + "gulp-tslint": "^6.0.2", + "gulp-typescript": "^2.13.6", + "tslint": "^3.14.0", "typescript": "^1.8.9", "vscode": "^0.11.0", "xunit-file": "^1.0.0" @@ -218,9 +227,7 @@ } }, "scripts": { - "compile": "npm run lint && node ./node_modules/vscode/bin/compile -p ./", - "compile_watch": "node ./node_modules/vscode/bin/compile -watch -p ./", "postinstall": "node ./node_modules/vscode/bin/install", - "lint": "tslint src/**/*.ts" + "install-packages": "npm install github:gulpjs/gulp#4.0 && npm install gulp-install && gulp --gulpfile install.js install" } } diff --git a/src/controllers/localWebService.ts b/src/controllers/localWebService.ts index 20c224802e..618ab5cee1 100644 --- a/src/controllers/localWebService.ts +++ b/src/controllers/localWebService.ts @@ -9,7 +9,7 @@ export default class LocalWebService { private app = express(); static _servicePort: string; static _vscodeExtensionPath: string; - static _htmlContentLocation = 'src/views/htmlcontent'; + static _htmlContentLocation = 'out/src/views/htmlcontent'; static _staticContentPath: string; constructor(extensionPath: string) { diff --git a/src/controllers/queryRunner.ts b/src/controllers/queryRunner.ts index 84de6f6696..02ce0c4db7 100644 --- a/src/controllers/queryRunner.ts +++ b/src/controllers/queryRunner.ts @@ -242,18 +242,20 @@ export default class QueryRunner { // return column metadata for recordset private getColumnMetadata(recordset: any): any[] { let columnMetadata = []; - for (let i = 0; i < recordset.columns.length; i++) { - let columnName = recordset.columns[i].name; - if (!columnName) { - columnName = ''; - } + for (let key in recordset.columns) { + if (recordset.columns.hasOwnProperty(key)) { + let columnName = recordset.columns[key].name; + if (!columnName) { + columnName = ''; + } - let columnMetadataRender = { - name: columnName, - label: columnName, - cell: 'string' // format all columns as string for display in backgrid - }; - columnMetadata.push(columnMetadataRender); + let columnMetadataRender = { + name: columnName, + label: columnName, + cell: 'string' // format all columns as string for display in backgrid + }; + columnMetadata.push(columnMetadataRender); + } } return columnMetadata; } diff --git a/src/languageservice/serviceclient.ts b/src/languageservice/serviceclient.ts index 42775459d4..36cbe30e19 100644 --- a/src/languageservice/serviceclient.ts +++ b/src/languageservice/serviceclient.ts @@ -35,7 +35,7 @@ export default class SqlToolsServiceClient { // run the service host using dotnet.exe from the path let serverCommand = 'dotnet'; - let serverArgs = [ context.asAbsolutePath(path.join('tools', 'Microsoft.SqlTools.ServiceLayer.dll')) ]; + let serverArgs = [ context.asAbsolutePath(path.join('tools', 'Microsoft.SqlTools.ServiceHost.dll')) ]; let serverOptions: ServerOptions = { command: serverCommand, args: serverArgs, transport: TransportKind.stdio }; // Options to control the language client diff --git a/src/models/sqlOutputContentProvider.ts b/src/models/sqlOutputContentProvider.ts index 29f3534db7..3323c41d73 100644 --- a/src/models/sqlOutputContentProvider.ts +++ b/src/models/sqlOutputContentProvider.ts @@ -41,7 +41,7 @@ export class SqlOutputContentProvider implements vscode.TextDocumentContentProvi // add http handler for '/' this._service.addHandler(Interfaces.ContentType.Root, function(req, res): void { Utils.logDebug(Constants.msgContentProviderOnRootEndpoint); - let uri: string = req.query.uri; + let uri: string = decodeURI(req.query.uri); res.render(path.join(LocalWebService.staticContentPath, Constants.msgContentProviderSqlOutputHtml), {uri: uri}); }); @@ -50,7 +50,7 @@ export class SqlOutputContentProvider implements vscode.TextDocumentContentProvi Utils.logDebug(Constants.msgContentProviderOnResultsEndpoint); let resultsetsMeta: Interfaces.ISqlResultsetMeta[] = []; - let uri: string = req.query.uri; + let uri: string = decodeURI(req.query.uri); for (let index = 0; index < self._queryResultsMap.get(uri).resultsets.length; index ++) { resultsetsMeta.push( { columnsUri: '/' + Constants.outputContentTypeColumns + '?id=' + index.toString(), @@ -65,7 +65,7 @@ export class SqlOutputContentProvider implements vscode.TextDocumentContentProvi // add http handler for '/messages' - return all messages as a JSON string this._service.addHandler(Interfaces.ContentType.Messages, function(req, res): void { Utils.logDebug(Constants.msgContentProviderOnMessagesEndpoint); - let uri: string = req.query.uri; + let uri: string = decodeURI(req.query.uri); let json = JSON.stringify(self._queryResultsMap.get(uri).messages); // Utils.logDebug(json); res.send(json); @@ -75,7 +75,7 @@ export class SqlOutputContentProvider implements vscode.TextDocumentContentProvi this._service.addHandler(Interfaces.ContentType.Columns, function(req, res): void { let id = req.query.id; Utils.logDebug(Constants.msgContentProviderOnColumnsEndpoint + id); - let uri: string = req.query.uri; + let uri: string = decodeURI(req.query.uri); let columnMetadata = self._queryResultsMap.get(uri).resultsets[id].columns; let json = JSON.stringify(columnMetadata); // Utils.logDebug(json); @@ -86,7 +86,7 @@ export class SqlOutputContentProvider implements vscode.TextDocumentContentProvi this._service.addHandler(Interfaces.ContentType.Rows, function(req, res): void { let id = req.query.id; Utils.logDebug(Constants.msgContentProviderOnRowsEndpoint + id); - let uri: string = req.query.uri; + let uri: string = decodeURI(req.query.uri); let json = JSON.stringify(self._queryResultsMap.get(uri).resultsets[id].rows); // Utils.logDebug(json); res.send(json); diff --git a/src/views/connectionUI.ts b/src/views/connectionUI.ts index 1306e9c00a..aa9c1b36ce 100644 --- a/src/views/connectionUI.ts +++ b/src/views/connectionUI.ts @@ -8,7 +8,7 @@ import { IConnectionCredentials, IConnectionProfile, IConnectionCredentialsQuick import { IQuestion, IPrompter, QuestionTypes } from '../prompts/question'; import Interfaces = require('../models/interfaces'); -let async = require('async'); +// let async = require('async'); const mssql = require('mssql'); export class ConnectionUI { @@ -63,7 +63,7 @@ export class ConnectionUI { // Helper to let the user choose a database on the current server // TODO: refactor this to use the service layer/SMO once the plumbing/conversion is complete public showDatabasesOnCurrentServer(currentCredentials: Interfaces.IConnectionCredentials): Promise { - const self = this; + // const self = this; return new Promise((resolve, reject) => { // create a new connection to the master db using the current connection as a base let masterCredentials: Interfaces.IConnectionCredentials = {}; diff --git a/src/views/htmlcontent/css/backgrid-filter.css b/src/views/htmlcontent/css/backgrid-filter.css deleted file mode 100644 index 8931b07c59..0000000000 --- a/src/views/htmlcontent/css/backgrid-filter.css +++ /dev/null @@ -1,201 +0,0 @@ -/* - backgrid-filter - http://github.com/wyuenho/backgrid - - Copyright (c) 2013 Jimmy Yuen Ho Wong and contributors - Licensed under the MIT @license. -*/ - -/* - Search Icon CSS derived from: - - PURE CSS GUI ICONS - by Nicolas Gallagher - - http://nicolasgallagher.com/pure-css-gui-icons/ - - http://nicolasgallagher.com - http://twitter.com/necolas - - Created: 29 July 2010 - Version: 1.0.1 - - Dual licensed under MIT and GNU GPLv2 (c) Nicolas Gallagher -*/ - -.backgrid-filter.form-search { - position: relative; - width: 248px; - height: 30px; - margin: 20px; -} - -/* - Search Icon -*/ - -.backgrid-filter .search { - position: absolute; - top: 50%; - left: 6px; - z-index: 1000; - width: 10px; - height: 20px; - margin-top: -10px; - -webkit-box-sizing: content-box; - -moz-box-sizing: content-box; - box-sizing: content-box; -} - -.backgrid-filter .search:before { - position: absolute; - top: 50%; - left: 0; - width: 6px; - height: 6px; - margin-top: -6px; - background: transparent; - border: 3px solid gray; - -webkit-border-radius: 12px; - -moz-border-radius: 12px; - border-radius: 12px; - content: ""; - -webkit-box-sizing: content-box; - -moz-box-sizing: content-box; - box-sizing: content-box; -} - -.backgrid-filter .search:after { - position: absolute; - top: 50%; - left: 10px; - width: 3px; - height: 7px; - margin-top: 2px; - background-color: gray; - content: ""; - -webkit-transform: rotate(-45deg); - -moz-transform: rotate(-45deg); - -ms-transform: rotate(-45deg); - -o-transform: rotate(-45deg); - transform: rotate(-45deg); - -webkit-box-sizing: content-box; - -moz-box-sizing: content-box; - box-sizing: content-box; -} - -/* - Clear button - */ - -.backgrid-filter .clear { - position: absolute; - top: 50%; - right: 8px; - z-index: 1000; - width: 10px; - height: 20px; - margin-top: -10px; - font-family: sans-serif; - font-size: 20px; - font-weight: bold; - line-height: 20px; - color: gray; - text-decoration: none; -} - -.backgrid-filter input[type="search"] { - position: absolute; - display: inline-block; - width: 206px; - height: 20px; - padding: 4px 6px; - font-weight: normal; - color: #555; - vertical-align: middle; - background-color: #fff; - border: 1px solid #ccc; - -webkit-border-radius: 4px; - -moz-border-radius: 4px; - border-radius: 4px; - -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075); - -moz-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075); - box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075); - -webkit-transition: border linear 0.2s, box-shadow linear 0.2s; - -moz-transition: border linear 0.2s, box-shadow linear 0.2s; - -o-transition: border linear 0.2s, box-shadow linear 0.2s; - transition: border linear 0.2s, box-shadow linear 0.2s; -} - -/* - Normalize the search input box, with code borrowed from normalize.css. - - https://github.com/necolas/normalize.css/ - - Copyright (c) Nicolas Gallagher and Jonathan Neal, MIT @license. - */ - -/* - * 1. Correct font family not being inherited in all browsers. - * 2. Correct font size not being inherited in all browsers. - * 3. Address margins set differently in Firefox 4+, Safari 5, and Chrome. - * 4. Address Firefox 4+ setting `line-height` on `input` using `!important` in the UA stylesheet. - */ - -.backgrid-filter input { - margin: 0; - font-family: inherit; - font-size: 100%; - line-height: normal; -} - -/* - * Re-set default cursor for disabled elements. - */ - -.backgrid-filter input[disabled] { - cursor: default; -} - -/* - * 1. Address `appearance` set to `searchfield` in Safari 5 and Chrome. - * 2. Address `box-sizing` set to `border-box` in Safari 5 and Chrome - * (include `-moz` to future-proof). - */ - -.backgrid-filter input[type="search"] { - outline: none; - -webkit-box-sizing: content-box; - -moz-box-sizing: content-box; - box-sizing: content-box; - -webkit-appearance: none; -} - -/* - * Remove the default clear button on IE - */ - -.backgrid-filter input[type="search"]::-ms-clear { - display: none; -} - -/* - * Remove the default clear button on WebKit browsers - */ - -.backgrid-filter input[type="search"]::-webkit-search-cancel-button { - -webkit-appearance: none; -} - -/* - * Remove inner padding and border in Firefox 4+. - */ - -.backgrid-filter input::-moz-focus-inner { - padding: 0; - border: 0; -} - -.backgrid-filter input[type="search"] { - padding-right: 18px; - padding-left: 22px; -} \ No newline at end of file diff --git a/src/views/htmlcontent/css/backgrid-paginator.css b/src/views/htmlcontent/css/backgrid-paginator.css deleted file mode 100644 index 20ebbd26e6..0000000000 --- a/src/views/htmlcontent/css/backgrid-paginator.css +++ /dev/null @@ -1,58 +0,0 @@ -/* - backgrid-paginator - http://github.com/wyuenho/backgrid - - Copyright (c) 2013 Jimmy Yuen Ho Wong and contributors - Licensed under the MIT license. -*/ - -.backgrid-paginator { - text-align: center; - border-top: none; - -webkit-border-radius: 0 0 4px 4px; - -moz-border-radius: 0 0 4px 4px; - border-radius: 0 0 4px 4px; - -webkit-box-sizing: border-box; - -moz-box-sizing: border-box; - box-sizing: border-box; -} - -.backgrid-paginator ul { - display: inline-block; - *display: inline; - margin: 5px 0; - *zoom: 1; -} - -.backgrid-paginator ul > li { - display: inline; -} - -.backgrid-paginator ul > li > a, -.backgrid-paginator ul > li > span { - float: left; - width: 30px; - height: 30px; - padding: 0; - line-height: 30px; - text-decoration: none; -} - -.backgrid-paginator ul > li > a:hover, -.backgrid-paginator ul > .active > a, -.backgrid-paginator ul > .active > span { - background-color: #f5f5f5; -} - -.backgrid-paginator ul > .active > a, -.backgrid-paginator ul > .active > span { - color: #999999; - cursor: default; -} - -.backgrid-paginator ul > .disabled > span, -.backgrid-paginator ul > .disabled > a, -.backgrid-paginator ul > .disabled > a:hover { - color: #999999; - cursor: default; -} \ No newline at end of file diff --git a/src/views/htmlcontent/css/backgrid.css b/src/views/htmlcontent/css/backgrid.css deleted file mode 100644 index 67de60e2f1..0000000000 --- a/src/views/htmlcontent/css/backgrid.css +++ /dev/null @@ -1,245 +0,0 @@ -/* - backgrid - http://github.com/wyuenho/backgrid - - Copyright (c) 2013 Jimmy Yuen Ho Wong and contributors - Licensed under the MIT license. -*/ - -.backgrid-container { - position: relative; - display: block; - width: 100%; - height: 465px; - padding: 0; - overflow: auto; - border: 0; -} - -.backgrid { - width: 100%; - max-width: 100%; - background-color: transparent; - border-collapse: collapse; - -webkit-border-radius: 4px; - -moz-border-radius: 4px; - border-radius: 4px; -} - -.backgrid th, -.backgrid td { - display: none; - height: 20px; - max-width: 250px; - padding: 4px 5px; - overflow: hidden; - line-height: 20px; - text-align: left; - text-overflow: ellipsis; - white-space: nowrap; - vertical-align: middle; - border-bottom: 1px solid #DDD; -} - -.backgrid th.renderable, -.backgrid td.renderable { - display: table-cell; -} - -.backgrid th { - font-weight: bold; - text-align: left; -} - -/* SaNagama changed: - text-align: center; to => - text-align: left; -*/ - -.backgrid th.sortable a { - text-decoration: none; - white-space: nowrap; - cursor: pointer; -} - -.backgrid thead th { - vertical-align: bottom; - background-color: #f9f9f9; -} - -.backgrid thead th a { - display: block; -} - -.backgrid.backgrid-striped tbody tr:nth-child(even) { - background-color: #f9f9f9; -} - -.backgrid tbody tr.empty { - font-style: italic; - color: gray; -} - -.backgrid tbody tr.empty td { - display: table-cell; - text-align: center; -} - -.backgrid td.editor { - padding: 0; -} - -.backgrid td.editor, -.backgrid tbody tr:nth-child(odd) td.editor { - background-color: rgba(82, 168, 236, 0.1); - outline: 1px solid rgba(82, 168, 236, 0.8); - outline-offset: -1px; - -webkit-box-sizing: border-box; - -moz-box-sizing: border-box; - box-sizing: border-box; - -webkit-transition-duration: 200ms; - -moz-transition-duration: 200ms; - -o-transition-duration: 200ms; - transition-duration: 200ms; - -webkit-transition-property: width, outline, background-color; - -moz-transition-property: width, outline, background-color; - -o-transition-property: width, outline, background-color; - transition-property: width, outline, background-color; - -webkit-transition-timing-function: ease-in-out; - -moz-transition-timing-function: ease-in-out; - -o-transition-timing-function: ease-in-out; - transition-timing-function: ease-in-out; -} - -.backgrid td.editor input[type=text] { - display: block; - width: 100%; - height: 100%; - padding: 0 5px; - margin: 0; - background-color: transparent; - border: 0; - outline: 0; - -webkit-box-shadow: none; - -moz-box-shadow: none; - box-shadow: none; - -webkit-box-sizing: border-box; - -moz-box-sizing: border-box; - box-sizing: border-box; - -webkit-appearance: none; - -moz-appearance: none; -} - -.backgrid td.editor input[type=text]::-ms-clear { - display: none; -} - -.backgrid td.error, -.backgrid tbody tr:nth-child(odd) td.error { - background-color: rgba(255, 210, 77, 0.1); - outline: 1px solid #ffd24d; -} - -.backgrid td.editor :focus, -.backgrid th.editor :focus { - outline: 0; -} - -.backgrid .sort-caret { - display: inline-block; - width: 0; - height: 0; - margin-left: 0.3em; - border: 0; - content: ""; -} - -.backgrid .ascending .sort-caret { - vertical-align: baseline; - border-top: none; - border-right: 4px solid transparent; - border-bottom: 4px solid #000000; - border-left: 4px solid transparent; -} - -.backgrid .descending .sort-caret { - vertical-align: super; - border-top: 4px solid #000000; - border-right: 4px solid transparent; - border-bottom: none; - border-left: 4px solid transparent; -} - -.backgrid .string-cell, -.backgrid .uri-cell, -.backgrid .email-cell, -.backgrid .string-cell.editor input[type=text], -.backgrid .uri-cell.editor input[type=text], -.backgrid .email-cell.editor input[type=text] { - text-align: left; -} - -.backgrid .date-cell, -.backgrid .time-cell, -.backgrid .datetime-cell, -.backgrid .number-cell, -.backgrid .integer-cell, -.backgrid .percent-cell, -.backgrid .date-cell.editor input[type=text], -.backgrid .time-cell.editor input[type=text], -.backgrid .datetime-cell.editor input[type=text], -.backgrid .number-cell.editor input[type=text], -.backgrid .integer-cell.editor input[type=text], -.backgrid .percent-cell.editor input[type=text] { - text-align: right; -} - -.backgrid .boolean-cell, -.backgrid .boolean-cell.editor input[type=checkbox] { - text-align: center; -} - -.backgrid .select-cell { - text-align: center; -} - -.backgrid .select-cell.editor { - padding: 0; -} - -.backgrid .select-cell.editor select { - display: block; - width: 100%; - height: 28px; - padding: 4px 5px; - margin: 0; - line-height: 28px; - vertical-align: middle; - background-color: white; - border: 0; - outline: 0; - -webkit-box-shadow: none; - -moz-box-shadow: none; - box-shadow: none; - -webkit-box-sizing: border-box; - -moz-box-sizing: border-box; - box-sizing: border-box; -} - -.backgrid .select-cell.editor select[multiple] { - height: auto; -} - -.backgrid .select-cell.editor :focus { - border: 0; - outline: 0; -} - -.backgrid .select-cell.editor select::-moz-focus-inner, -.backgrid .select-cell.editor optgroup::-moz-focus-inner, -.backgrid .select-cell.editor option::-moz-focus-inner, -.backgrid .select-cell.editor select::-o-focus-inner, -.backgrid .select-cell.editor optgroup::-o-focus-inner, -.backgrid .select-cell.editor option::-o-focus-inner { - border: 0; -} \ No newline at end of file diff --git a/src/views/htmlcontent/gulpfile.js b/src/views/htmlcontent/gulpfile.js new file mode 100644 index 0000000000..1a95a4ebfc --- /dev/null +++ b/src/views/htmlcontent/gulpfile.js @@ -0,0 +1 @@ +require('../../../gulpfile'); \ No newline at end of file diff --git a/src/views/htmlcontent/package.json b/src/views/htmlcontent/package.json new file mode 100644 index 0000000000..efc46ce5bb --- /dev/null +++ b/src/views/htmlcontent/package.json @@ -0,0 +1,28 @@ +{ + "name": "htmlcontent", + "version": "1.0.0", + "description": "", + "dependencies": { + "angular2": "2.0.0-beta.7", + "es6-shim": "0.33.3", + "es6-promise": "3.0.2", + "bootstrap": "3.3.6", + "systemjs": "0.19.6", + "reflect-metadata": "^0.1.2", + "rxjs": "5.0.0-beta.2", + "typescript": "^1.8.10", + "underscore": "^1.8.3", + "var": "0.1.3", + "zone.js": "0.5.15", + "jquery": "2.2.0", + "jquery-ui": "1.10.5", + "jquery.event.drag": "2.2.2" + }, + "devDependencies": { + "del": "^2.2.1", + "gulp": "github:gulpjs/gulp#4.0", + "gulp-sourcemaps": "^1.6.0", + "gulp-tslint": "^6.0.2", + "gulp-typescript": "^2.13.6" + } +} diff --git a/src/views/htmlcontent/scripts/backbone.js b/src/views/htmlcontent/scripts/backbone.js deleted file mode 100644 index c924965621..0000000000 --- a/src/views/htmlcontent/scripts/backbone.js +++ /dev/null @@ -1,1894 +0,0 @@ -// Backbone.js 1.2.3 - -// (c) 2010-2015 Jeremy Ashkenas, DocumentCloud and Investigative Reporters & Editors -// Backbone may be freely distributed under the MIT license. -// For all details and documentation: -// http://backbonejs.org - -(function(factory) { - - // Establish the root object, `window` (`self`) in the browser, or `global` on the server. - // We use `self` instead of `window` for `WebWorker` support. - var root = (typeof self == 'object' && self.self == self && self) || - (typeof global == 'object' && global.global == global && global); - - // Set up Backbone appropriately for the environment. Start with AMD. - if (typeof define === 'function' && define.amd) { - define(['underscore', 'jquery', 'exports'], function(_, $, exports) { - // Export global even in AMD case in case this script is loaded with - // others that may still expect a global Backbone. - root.Backbone = factory(root, exports, _, $); - }); - - // Next for Node.js or CommonJS. jQuery may not be needed as a module. - } else if (typeof exports !== 'undefined') { - var _ = require('underscore'), $; - try { $ = require('jquery'); } catch(e) {} - factory(root, exports, _, $); - - // Finally, as a browser global. - } else { - root.Backbone = factory(root, {}, root._, (root.jQuery || root.Zepto || root.ender || root.$)); - } - -}(function(root, Backbone, _, $) { - - // Initial Setup - // ------------- - - // Save the previous value of the `Backbone` variable, so that it can be - // restored later on, if `noConflict` is used. - var previousBackbone = root.Backbone; - - // Create a local reference to a common array method we'll want to use later. - var slice = Array.prototype.slice; - - // Current version of the library. Keep in sync with `package.json`. - Backbone.VERSION = '1.2.3'; - - // For Backbone's purposes, jQuery, Zepto, Ender, or My Library (kidding) owns - // the `$` variable. - Backbone.$ = $; - - // Runs Backbone.js in *noConflict* mode, returning the `Backbone` variable - // to its previous owner. Returns a reference to this Backbone object. - Backbone.noConflict = function() { - root.Backbone = previousBackbone; - return this; - }; - - // Turn on `emulateHTTP` to support legacy HTTP servers. Setting this option - // will fake `"PATCH"`, `"PUT"` and `"DELETE"` requests via the `_method` parameter and - // set a `X-Http-Method-Override` header. - Backbone.emulateHTTP = false; - - // Turn on `emulateJSON` to support legacy servers that can't deal with direct - // `application/json` requests ... this will encode the body as - // `application/x-www-form-urlencoded` instead and will send the model in a - // form param named `model`. - Backbone.emulateJSON = false; - - // Proxy Backbone class methods to Underscore functions, wrapping the model's - // `attributes` object or collection's `models` array behind the scenes. - // - // collection.filter(function(model) { return model.get('age') > 10 }); - // collection.each(this.addView); - // - // `Function#apply` can be slow so we use the method's arg count, if we know it. - var addMethod = function(length, method, attribute) { - switch (length) { - case 1: return function() { - return _[method](this[attribute]); - }; - case 2: return function(value) { - return _[method](this[attribute], value); - }; - case 3: return function(iteratee, context) { - return _[method](this[attribute], cb(iteratee, this), context); - }; - case 4: return function(iteratee, defaultVal, context) { - return _[method](this[attribute], cb(iteratee, this), defaultVal, context); - }; - default: return function() { - var args = slice.call(arguments); - args.unshift(this[attribute]); - return _[method].apply(_, args); - }; - } - }; - var addUnderscoreMethods = function(Class, methods, attribute) { - _.each(methods, function(length, method) { - if (_[method]) Class.prototype[method] = addMethod(length, method, attribute); - }); - }; - - // Support `collection.sortBy('attr')` and `collection.findWhere({id: 1})`. - var cb = function(iteratee, instance) { - if (_.isFunction(iteratee)) return iteratee; - if (_.isObject(iteratee) && !instance._isModel(iteratee)) return modelMatcher(iteratee); - if (_.isString(iteratee)) return function(model) { return model.get(iteratee); }; - return iteratee; - }; - var modelMatcher = function(attrs) { - var matcher = _.matches(attrs); - return function(model) { - return matcher(model.attributes); - }; - }; - - // Backbone.Events - // --------------- - - // A module that can be mixed in to *any object* in order to provide it with - // a custom event channel. You may bind a callback to an event with `on` or - // remove with `off`; `trigger`-ing an event fires all callbacks in - // succession. - // - // var object = {}; - // _.extend(object, Backbone.Events); - // object.on('expand', function(){ alert('expanded'); }); - // object.trigger('expand'); - // - var Events = Backbone.Events = {}; - - // Regular expression used to split event strings. - var eventSplitter = /\s+/; - - // Iterates over the standard `event, callback` (as well as the fancy multiple - // space-separated events `"change blur", callback` and jQuery-style event - // maps `{event: callback}`). - var eventsApi = function(iteratee, events, name, callback, opts) { - var i = 0, names; - if (name && typeof name === 'object') { - // Handle event maps. - if (callback !== void 0 && 'context' in opts && opts.context === void 0) opts.context = callback; - for (names = _.keys(name); i < names.length ; i++) { - events = eventsApi(iteratee, events, names[i], name[names[i]], opts); - } - } else if (name && eventSplitter.test(name)) { - // Handle space separated event names by delegating them individually. - for (names = name.split(eventSplitter); i < names.length; i++) { - events = iteratee(events, names[i], callback, opts); - } - } else { - // Finally, standard events. - events = iteratee(events, name, callback, opts); - } - return events; - }; - - // Bind an event to a `callback` function. Passing `"all"` will bind - // the callback to all events fired. - Events.on = function(name, callback, context) { - return internalOn(this, name, callback, context); - }; - - // Guard the `listening` argument from the public API. - var internalOn = function(obj, name, callback, context, listening) { - obj._events = eventsApi(onApi, obj._events || {}, name, callback, { - context: context, - ctx: obj, - listening: listening - }); - - if (listening) { - var listeners = obj._listeners || (obj._listeners = {}); - listeners[listening.id] = listening; - } - - return obj; - }; - - // Inversion-of-control versions of `on`. Tell *this* object to listen to - // an event in another object... keeping track of what it's listening to - // for easier unbinding later. - Events.listenTo = function(obj, name, callback) { - if (!obj) return this; - var id = obj._listenId || (obj._listenId = _.uniqueId('l')); - var listeningTo = this._listeningTo || (this._listeningTo = {}); - var listening = listeningTo[id]; - - // This object is not listening to any other events on `obj` yet. - // Setup the necessary references to track the listening callbacks. - if (!listening) { - var thisId = this._listenId || (this._listenId = _.uniqueId('l')); - listening = listeningTo[id] = {obj: obj, objId: id, id: thisId, listeningTo: listeningTo, count: 0}; - } - - // Bind callbacks on obj, and keep track of them on listening. - internalOn(obj, name, callback, this, listening); - return this; - }; - - // The reducing API that adds a callback to the `events` object. - var onApi = function(events, name, callback, options) { - if (callback) { - var handlers = events[name] || (events[name] = []); - var context = options.context, ctx = options.ctx, listening = options.listening; - if (listening) listening.count++; - - handlers.push({ callback: callback, context: context, ctx: context || ctx, listening: listening }); - } - return events; - }; - - // Remove one or many callbacks. If `context` is null, removes all - // callbacks with that function. If `callback` is null, removes all - // callbacks for the event. If `name` is null, removes all bound - // callbacks for all events. - Events.off = function(name, callback, context) { - if (!this._events) return this; - this._events = eventsApi(offApi, this._events, name, callback, { - context: context, - listeners: this._listeners - }); - return this; - }; - - // Tell this object to stop listening to either specific events ... or - // to every object it's currently listening to. - Events.stopListening = function(obj, name, callback) { - var listeningTo = this._listeningTo; - if (!listeningTo) return this; - - var ids = obj ? [obj._listenId] : _.keys(listeningTo); - - for (var i = 0; i < ids.length; i++) { - var listening = listeningTo[ids[i]]; - - // If listening doesn't exist, this object is not currently - // listening to obj. Break out early. - if (!listening) break; - - listening.obj.off(name, callback, this); - } - if (_.isEmpty(listeningTo)) this._listeningTo = void 0; - - return this; - }; - - // The reducing API that removes a callback from the `events` object. - var offApi = function(events, name, callback, options) { - if (!events) return; - - var i = 0, listening; - var context = options.context, listeners = options.listeners; - - // Delete all events listeners and "drop" events. - if (!name && !callback && !context) { - var ids = _.keys(listeners); - for (; i < ids.length; i++) { - listening = listeners[ids[i]]; - delete listeners[listening.id]; - delete listening.listeningTo[listening.objId]; - } - return; - } - - var names = name ? [name] : _.keys(events); - for (; i < names.length; i++) { - name = names[i]; - var handlers = events[name]; - - // Bail out if there are no events stored. - if (!handlers) break; - - // Replace events if there are any remaining. Otherwise, clean up. - var remaining = []; - for (var j = 0; j < handlers.length; j++) { - var handler = handlers[j]; - if ( - callback && callback !== handler.callback && - callback !== handler.callback._callback || - context && context !== handler.context - ) { - remaining.push(handler); - } else { - listening = handler.listening; - if (listening && --listening.count === 0) { - delete listeners[listening.id]; - delete listening.listeningTo[listening.objId]; - } - } - } - - // Update tail event if the list has any events. Otherwise, clean up. - if (remaining.length) { - events[name] = remaining; - } else { - delete events[name]; - } - } - if (_.size(events)) return events; - }; - - // Bind an event to only be triggered a single time. After the first time - // the callback is invoked, its listener will be removed. If multiple events - // are passed in using the space-separated syntax, the handler will fire - // once for each event, not once for a combination of all events. - Events.once = function(name, callback, context) { - // Map the event into a `{event: once}` object. - var events = eventsApi(onceMap, {}, name, callback, _.bind(this.off, this)); - return this.on(events, void 0, context); - }; - - // Inversion-of-control versions of `once`. - Events.listenToOnce = function(obj, name, callback) { - // Map the event into a `{event: once}` object. - var events = eventsApi(onceMap, {}, name, callback, _.bind(this.stopListening, this, obj)); - return this.listenTo(obj, events); - }; - - // Reduces the event callbacks into a map of `{event: onceWrapper}`. - // `offer` unbinds the `onceWrapper` after it has been called. - var onceMap = function(map, name, callback, offer) { - if (callback) { - var once = map[name] = _.once(function() { - offer(name, once); - callback.apply(this, arguments); - }); - once._callback = callback; - } - return map; - }; - - // Trigger one or many events, firing all bound callbacks. Callbacks are - // passed the same arguments as `trigger` is, apart from the event name - // (unless you're listening on `"all"`, which will cause your callback to - // receive the true name of the event as the first argument). - Events.trigger = function(name) { - if (!this._events) return this; - - var length = Math.max(0, arguments.length - 1); - var args = Array(length); - for (var i = 0; i < length; i++) args[i] = arguments[i + 1]; - - eventsApi(triggerApi, this._events, name, void 0, args); - return this; - }; - - // Handles triggering the appropriate event callbacks. - var triggerApi = function(objEvents, name, cb, args) { - if (objEvents) { - var events = objEvents[name]; - var allEvents = objEvents.all; - if (events && allEvents) allEvents = allEvents.slice(); - if (events) triggerEvents(events, args); - if (allEvents) triggerEvents(allEvents, [name].concat(args)); - } - return objEvents; - }; - - // A difficult-to-believe, but optimized internal dispatch function for - // triggering events. Tries to keep the usual cases speedy (most internal - // Backbone events have 3 arguments). - var triggerEvents = function(events, args) { - var ev, i = -1, l = events.length, a1 = args[0], a2 = args[1], a3 = args[2]; - switch (args.length) { - case 0: while (++i < l) (ev = events[i]).callback.call(ev.ctx); return; - case 1: while (++i < l) (ev = events[i]).callback.call(ev.ctx, a1); return; - case 2: while (++i < l) (ev = events[i]).callback.call(ev.ctx, a1, a2); return; - case 3: while (++i < l) (ev = events[i]).callback.call(ev.ctx, a1, a2, a3); return; - default: while (++i < l) (ev = events[i]).callback.apply(ev.ctx, args); return; - } - }; - - // Aliases for backwards compatibility. - Events.bind = Events.on; - Events.unbind = Events.off; - - // Allow the `Backbone` object to serve as a global event bus, for folks who - // want global "pubsub" in a convenient place. - _.extend(Backbone, Events); - - // Backbone.Model - // -------------- - - // Backbone **Models** are the basic data object in the framework -- - // frequently representing a row in a table in a database on your server. - // A discrete chunk of data and a bunch of useful, related methods for - // performing computations and transformations on that data. - - // Create a new model with the specified attributes. A client id (`cid`) - // is automatically generated and assigned for you. - var Model = Backbone.Model = function(attributes, options) { - var attrs = attributes || {}; - options || (options = {}); - this.cid = _.uniqueId(this.cidPrefix); - this.attributes = {}; - if (options.collection) this.collection = options.collection; - if (options.parse) attrs = this.parse(attrs, options) || {}; - attrs = _.defaults({}, attrs, _.result(this, 'defaults')); - this.set(attrs, options); - this.changed = {}; - this.initialize.apply(this, arguments); - }; - - // Attach all inheritable methods to the Model prototype. - _.extend(Model.prototype, Events, { - - // A hash of attributes whose current and previous value differ. - changed: null, - - // The value returned during the last failed validation. - validationError: null, - - // The default name for the JSON `id` attribute is `"id"`. MongoDB and - // CouchDB users may want to set this to `"_id"`. - idAttribute: 'id', - - // The prefix is used to create the client id which is used to identify models locally. - // You may want to override this if you're experiencing name clashes with model ids. - cidPrefix: 'c', - - // Initialize is an empty function by default. Override it with your own - // initialization logic. - initialize: function(){}, - - // Return a copy of the model's `attributes` object. - toJSON: function(options) { - return _.clone(this.attributes); - }, - - // Proxy `Backbone.sync` by default -- but override this if you need - // custom syncing semantics for *this* particular model. - sync: function() { - return Backbone.sync.apply(this, arguments); - }, - - // Get the value of an attribute. - get: function(attr) { - return this.attributes[attr]; - }, - - // Get the HTML-escaped value of an attribute. - escape: function(attr) { - return _.escape(this.get(attr)); - }, - - // Returns `true` if the attribute contains a value that is not null - // or undefined. - has: function(attr) { - return this.get(attr) != null; - }, - - // Special-cased proxy to underscore's `_.matches` method. - matches: function(attrs) { - return !!_.iteratee(attrs, this)(this.attributes); - }, - - // Set a hash of model attributes on the object, firing `"change"`. This is - // the core primitive operation of a model, updating the data and notifying - // anyone who needs to know about the change in state. The heart of the beast. - set: function(key, val, options) { - if (key == null) return this; - - // Handle both `"key", value` and `{key: value}` -style arguments. - var attrs; - if (typeof key === 'object') { - attrs = key; - options = val; - } else { - (attrs = {})[key] = val; - } - - options || (options = {}); - - // Run validation. - if (!this._validate(attrs, options)) return false; - - // Extract attributes and options. - var unset = options.unset; - var silent = options.silent; - var changes = []; - var changing = this._changing; - this._changing = true; - - if (!changing) { - this._previousAttributes = _.clone(this.attributes); - this.changed = {}; - } - - var current = this.attributes; - var changed = this.changed; - var prev = this._previousAttributes; - - // For each `set` attribute, update or delete the current value. - for (var attr in attrs) { - val = attrs[attr]; - if (!_.isEqual(current[attr], val)) changes.push(attr); - if (!_.isEqual(prev[attr], val)) { - changed[attr] = val; - } else { - delete changed[attr]; - } - unset ? delete current[attr] : current[attr] = val; - } - - // Update the `id`. - this.id = this.get(this.idAttribute); - - // Trigger all relevant attribute changes. - if (!silent) { - if (changes.length) this._pending = options; - for (var i = 0; i < changes.length; i++) { - this.trigger('change:' + changes[i], this, current[changes[i]], options); - } - } - - // You might be wondering why there's a `while` loop here. Changes can - // be recursively nested within `"change"` events. - if (changing) return this; - if (!silent) { - while (this._pending) { - options = this._pending; - this._pending = false; - this.trigger('change', this, options); - } - } - this._pending = false; - this._changing = false; - return this; - }, - - // Remove an attribute from the model, firing `"change"`. `unset` is a noop - // if the attribute doesn't exist. - unset: function(attr, options) { - return this.set(attr, void 0, _.extend({}, options, {unset: true})); - }, - - // Clear all attributes on the model, firing `"change"`. - clear: function(options) { - var attrs = {}; - for (var key in this.attributes) attrs[key] = void 0; - return this.set(attrs, _.extend({}, options, {unset: true})); - }, - - // Determine if the model has changed since the last `"change"` event. - // If you specify an attribute name, determine if that attribute has changed. - hasChanged: function(attr) { - if (attr == null) return !_.isEmpty(this.changed); - return _.has(this.changed, attr); - }, - - // Return an object containing all the attributes that have changed, or - // false if there are no changed attributes. Useful for determining what - // parts of a view need to be updated and/or what attributes need to be - // persisted to the server. Unset attributes will be set to undefined. - // You can also pass an attributes object to diff against the model, - // determining if there *would be* a change. - changedAttributes: function(diff) { - if (!diff) return this.hasChanged() ? _.clone(this.changed) : false; - var old = this._changing ? this._previousAttributes : this.attributes; - var changed = {}; - for (var attr in diff) { - var val = diff[attr]; - if (_.isEqual(old[attr], val)) continue; - changed[attr] = val; - } - return _.size(changed) ? changed : false; - }, - - // Get the previous value of an attribute, recorded at the time the last - // `"change"` event was fired. - previous: function(attr) { - if (attr == null || !this._previousAttributes) return null; - return this._previousAttributes[attr]; - }, - - // Get all of the attributes of the model at the time of the previous - // `"change"` event. - previousAttributes: function() { - return _.clone(this._previousAttributes); - }, - - // Fetch the model from the server, merging the response with the model's - // local attributes. Any changed attributes will trigger a "change" event. - fetch: function(options) { - options = _.extend({parse: true}, options); - var model = this; - var success = options.success; - options.success = function(resp) { - var serverAttrs = options.parse ? model.parse(resp, options) : resp; - if (!model.set(serverAttrs, options)) return false; - if (success) success.call(options.context, model, resp, options); - model.trigger('sync', model, resp, options); - }; - wrapError(this, options); - return this.sync('read', this, options); - }, - - // Set a hash of model attributes, and sync the model to the server. - // If the server returns an attributes hash that differs, the model's - // state will be `set` again. - save: function(key, val, options) { - // Handle both `"key", value` and `{key: value}` -style arguments. - var attrs; - if (key == null || typeof key === 'object') { - attrs = key; - options = val; - } else { - (attrs = {})[key] = val; - } - - options = _.extend({validate: true, parse: true}, options); - var wait = options.wait; - - // If we're not waiting and attributes exist, save acts as - // `set(attr).save(null, opts)` with validation. Otherwise, check if - // the model will be valid when the attributes, if any, are set. - if (attrs && !wait) { - if (!this.set(attrs, options)) return false; - } else { - if (!this._validate(attrs, options)) return false; - } - - // After a successful server-side save, the client is (optionally) - // updated with the server-side state. - var model = this; - var success = options.success; - var attributes = this.attributes; - options.success = function(resp) { - // Ensure attributes are restored during synchronous saves. - model.attributes = attributes; - var serverAttrs = options.parse ? model.parse(resp, options) : resp; - if (wait) serverAttrs = _.extend({}, attrs, serverAttrs); - if (serverAttrs && !model.set(serverAttrs, options)) return false; - if (success) success.call(options.context, model, resp, options); - model.trigger('sync', model, resp, options); - }; - wrapError(this, options); - - // Set temporary attributes if `{wait: true}` to properly find new ids. - if (attrs && wait) this.attributes = _.extend({}, attributes, attrs); - - var method = this.isNew() ? 'create' : (options.patch ? 'patch' : 'update'); - if (method === 'patch' && !options.attrs) options.attrs = attrs; - var xhr = this.sync(method, this, options); - - // Restore attributes. - this.attributes = attributes; - - return xhr; - }, - - // Destroy this model on the server if it was already persisted. - // Optimistically removes the model from its collection, if it has one. - // If `wait: true` is passed, waits for the server to respond before removal. - destroy: function(options) { - options = options ? _.clone(options) : {}; - var model = this; - var success = options.success; - var wait = options.wait; - - var destroy = function() { - model.stopListening(); - model.trigger('destroy', model, model.collection, options); - }; - - options.success = function(resp) { - if (wait) destroy(); - if (success) success.call(options.context, model, resp, options); - if (!model.isNew()) model.trigger('sync', model, resp, options); - }; - - var xhr = false; - if (this.isNew()) { - _.defer(options.success); - } else { - wrapError(this, options); - xhr = this.sync('delete', this, options); - } - if (!wait) destroy(); - return xhr; - }, - - // Default URL for the model's representation on the server -- if you're - // using Backbone's restful methods, override this to change the endpoint - // that will be called. - url: function() { - var base = - _.result(this, 'urlRoot') || - _.result(this.collection, 'url') || - urlError(); - if (this.isNew()) return base; - var id = this.get(this.idAttribute); - return base.replace(/[^\/]$/, '$&/') + encodeURIComponent(id); - }, - - // **parse** converts a response into the hash of attributes to be `set` on - // the model. The default implementation is just to pass the response along. - parse: function(resp, options) { - return resp; - }, - - // Create a new model with identical attributes to this one. - clone: function() { - return new this.constructor(this.attributes); - }, - - // A model is new if it has never been saved to the server, and lacks an id. - isNew: function() { - return !this.has(this.idAttribute); - }, - - // Check if the model is currently in a valid state. - isValid: function(options) { - return this._validate({}, _.defaults({validate: true}, options)); - }, - - // Run validation against the next complete set of model attributes, - // returning `true` if all is well. Otherwise, fire an `"invalid"` event. - _validate: function(attrs, options) { - if (!options.validate || !this.validate) return true; - attrs = _.extend({}, this.attributes, attrs); - var error = this.validationError = this.validate(attrs, options) || null; - if (!error) return true; - this.trigger('invalid', this, error, _.extend(options, {validationError: error})); - return false; - } - - }); - - // Underscore methods that we want to implement on the Model, mapped to the - // number of arguments they take. - var modelMethods = { keys: 1, values: 1, pairs: 1, invert: 1, pick: 0, - omit: 0, chain: 1, isEmpty: 1 }; - - // Mix in each Underscore method as a proxy to `Model#attributes`. - addUnderscoreMethods(Model, modelMethods, 'attributes'); - - // Backbone.Collection - // ------------------- - - // If models tend to represent a single row of data, a Backbone Collection is - // more analogous to a table full of data ... or a small slice or page of that - // table, or a collection of rows that belong together for a particular reason - // -- all of the messages in this particular folder, all of the documents - // belonging to this particular author, and so on. Collections maintain - // indexes of their models, both in order, and for lookup by `id`. - - // Create a new **Collection**, perhaps to contain a specific type of `model`. - // If a `comparator` is specified, the Collection will maintain - // its models in sort order, as they're added and removed. - var Collection = Backbone.Collection = function(models, options) { - options || (options = {}); - if (options.model) this.model = options.model; - if (options.comparator !== void 0) this.comparator = options.comparator; - this._reset(); - this.initialize.apply(this, arguments); - if (models) this.reset(models, _.extend({silent: true}, options)); - }; - - // Default options for `Collection#set`. - var setOptions = {add: true, remove: true, merge: true}; - var addOptions = {add: true, remove: false}; - - // Splices `insert` into `array` at index `at`. - var splice = function(array, insert, at) { - at = Math.min(Math.max(at, 0), array.length); - var tail = Array(array.length - at); - var length = insert.length; - for (var i = 0; i < tail.length; i++) tail[i] = array[i + at]; - for (i = 0; i < length; i++) array[i + at] = insert[i]; - for (i = 0; i < tail.length; i++) array[i + length + at] = tail[i]; - }; - - // Define the Collection's inheritable methods. - _.extend(Collection.prototype, Events, { - - // The default model for a collection is just a **Backbone.Model**. - // This should be overridden in most cases. - model: Model, - - // Initialize is an empty function by default. Override it with your own - // initialization logic. - initialize: function(){}, - - // The JSON representation of a Collection is an array of the - // models' attributes. - toJSON: function(options) { - return this.map(function(model) { return model.toJSON(options); }); - }, - - // Proxy `Backbone.sync` by default. - sync: function() { - return Backbone.sync.apply(this, arguments); - }, - - // Add a model, or list of models to the set. `models` may be Backbone - // Models or raw JavaScript objects to be converted to Models, or any - // combination of the two. - add: function(models, options) { - return this.set(models, _.extend({merge: false}, options, addOptions)); - }, - - // Remove a model, or a list of models from the set. - remove: function(models, options) { - options = _.extend({}, options); - var singular = !_.isArray(models); - models = singular ? [models] : _.clone(models); - var removed = this._removeModels(models, options); - if (!options.silent && removed) this.trigger('update', this, options); - return singular ? removed[0] : removed; - }, - - // Update a collection by `set`-ing a new list of models, adding new ones, - // removing models that are no longer present, and merging models that - // already exist in the collection, as necessary. Similar to **Model#set**, - // the core operation for updating the data contained by the collection. - set: function(models, options) { - if (models == null) return; - - options = _.defaults({}, options, setOptions); - if (options.parse && !this._isModel(models)) models = this.parse(models, options); - - var singular = !_.isArray(models); - models = singular ? [models] : models.slice(); - - var at = options.at; - if (at != null) at = +at; - if (at < 0) at += this.length + 1; - - var set = []; - var toAdd = []; - var toRemove = []; - var modelMap = {}; - - var add = options.add; - var merge = options.merge; - var remove = options.remove; - - var sort = false; - var sortable = this.comparator && (at == null) && options.sort !== false; - var sortAttr = _.isString(this.comparator) ? this.comparator : null; - - // Turn bare objects into model references, and prevent invalid models - // from being added. - var model; - for (var i = 0; i < models.length; i++) { - model = models[i]; - - // If a duplicate is found, prevent it from being added and - // optionally merge it into the existing model. - var existing = this.get(model); - if (existing) { - if (merge && model !== existing) { - var attrs = this._isModel(model) ? model.attributes : model; - if (options.parse) attrs = existing.parse(attrs, options); - existing.set(attrs, options); - if (sortable && !sort) sort = existing.hasChanged(sortAttr); - } - if (!modelMap[existing.cid]) { - modelMap[existing.cid] = true; - set.push(existing); - } - models[i] = existing; - - // If this is a new, valid model, push it to the `toAdd` list. - } else if (add) { - model = models[i] = this._prepareModel(model, options); - if (model) { - toAdd.push(model); - this._addReference(model, options); - modelMap[model.cid] = true; - set.push(model); - } - } - } - - // Remove stale models. - if (remove) { - for (i = 0; i < this.length; i++) { - model = this.models[i]; - if (!modelMap[model.cid]) toRemove.push(model); - } - if (toRemove.length) this._removeModels(toRemove, options); - } - - // See if sorting is needed, update `length` and splice in new models. - var orderChanged = false; - var replace = !sortable && add && remove; - if (set.length && replace) { - orderChanged = this.length != set.length || _.some(this.models, function(model, index) { - return model !== set[index]; - }); - this.models.length = 0; - splice(this.models, set, 0); - this.length = this.models.length; - } else if (toAdd.length) { - if (sortable) sort = true; - splice(this.models, toAdd, at == null ? this.length : at); - this.length = this.models.length; - } - - // Silently sort the collection if appropriate. - if (sort) this.sort({silent: true}); - - // Unless silenced, it's time to fire all appropriate add/sort events. - if (!options.silent) { - for (i = 0; i < toAdd.length; i++) { - if (at != null) options.index = at + i; - model = toAdd[i]; - model.trigger('add', model, this, options); - } - if (sort || orderChanged) this.trigger('sort', this, options); - if (toAdd.length || toRemove.length) this.trigger('update', this, options); - } - - // Return the added (or merged) model (or models). - return singular ? models[0] : models; - }, - - // When you have more items than you want to add or remove individually, - // you can reset the entire set with a new list of models, without firing - // any granular `add` or `remove` events. Fires `reset` when finished. - // Useful for bulk operations and optimizations. - reset: function(models, options) { - options = options ? _.clone(options) : {}; - for (var i = 0; i < this.models.length; i++) { - this._removeReference(this.models[i], options); - } - options.previousModels = this.models; - this._reset(); - models = this.add(models, _.extend({silent: true}, options)); - if (!options.silent) this.trigger('reset', this, options); - return models; - }, - - // Add a model to the end of the collection. - push: function(model, options) { - return this.add(model, _.extend({at: this.length}, options)); - }, - - // Remove a model from the end of the collection. - pop: function(options) { - var model = this.at(this.length - 1); - return this.remove(model, options); - }, - - // Add a model to the beginning of the collection. - unshift: function(model, options) { - return this.add(model, _.extend({at: 0}, options)); - }, - - // Remove a model from the beginning of the collection. - shift: function(options) { - var model = this.at(0); - return this.remove(model, options); - }, - - // Slice out a sub-array of models from the collection. - slice: function() { - return slice.apply(this.models, arguments); - }, - - // Get a model from the set by id. - get: function(obj) { - if (obj == null) return void 0; - var id = this.modelId(this._isModel(obj) ? obj.attributes : obj); - return this._byId[obj] || this._byId[id] || this._byId[obj.cid]; - }, - - // Get the model at the given index. - at: function(index) { - if (index < 0) index += this.length; - return this.models[index]; - }, - - // Return models with matching attributes. Useful for simple cases of - // `filter`. - where: function(attrs, first) { - return this[first ? 'find' : 'filter'](attrs); - }, - - // Return the first model with matching attributes. Useful for simple cases - // of `find`. - findWhere: function(attrs) { - return this.where(attrs, true); - }, - - // Force the collection to re-sort itself. You don't need to call this under - // normal circumstances, as the set will maintain sort order as each item - // is added. - sort: function(options) { - var comparator = this.comparator; - if (!comparator) throw new Error('Cannot sort a set without a comparator'); - options || (options = {}); - - var length = comparator.length; - if (_.isFunction(comparator)) comparator = _.bind(comparator, this); - - // Run sort based on type of `comparator`. - if (length === 1 || _.isString(comparator)) { - this.models = this.sortBy(comparator); - } else { - this.models.sort(comparator); - } - if (!options.silent) this.trigger('sort', this, options); - return this; - }, - - // Pluck an attribute from each model in the collection. - pluck: function(attr) { - return _.invoke(this.models, 'get', attr); - }, - - // Fetch the default set of models for this collection, resetting the - // collection when they arrive. If `reset: true` is passed, the response - // data will be passed through the `reset` method instead of `set`. - fetch: function(options) { - options = _.extend({parse: true}, options); - var success = options.success; - var collection = this; - options.success = function(resp) { - var method = options.reset ? 'reset' : 'set'; - collection[method](resp, options); - if (success) success.call(options.context, collection, resp, options); - collection.trigger('sync', collection, resp, options); - }; - wrapError(this, options); - return this.sync('read', this, options); - }, - - // Create a new instance of a model in this collection. Add the model to the - // collection immediately, unless `wait: true` is passed, in which case we - // wait for the server to agree. - create: function(model, options) { - options = options ? _.clone(options) : {}; - var wait = options.wait; - model = this._prepareModel(model, options); - if (!model) return false; - if (!wait) this.add(model, options); - var collection = this; - var success = options.success; - options.success = function(model, resp, callbackOpts) { - if (wait) collection.add(model, callbackOpts); - if (success) success.call(callbackOpts.context, model, resp, callbackOpts); - }; - model.save(null, options); - return model; - }, - - // **parse** converts a response into a list of models to be added to the - // collection. The default implementation is just to pass it through. - parse: function(resp, options) { - return resp; - }, - - // Create a new collection with an identical list of models as this one. - clone: function() { - return new this.constructor(this.models, { - model: this.model, - comparator: this.comparator - }); - }, - - // Define how to uniquely identify models in the collection. - modelId: function (attrs) { - return attrs[this.model.prototype.idAttribute || 'id']; - }, - - // Private method to reset all internal state. Called when the collection - // is first initialized or reset. - _reset: function() { - this.length = 0; - this.models = []; - this._byId = {}; - }, - - // Prepare a hash of attributes (or other model) to be added to this - // collection. - _prepareModel: function(attrs, options) { - if (this._isModel(attrs)) { - if (!attrs.collection) attrs.collection = this; - return attrs; - } - options = options ? _.clone(options) : {}; - options.collection = this; - var model = new this.model(attrs, options); - if (!model.validationError) return model; - this.trigger('invalid', this, model.validationError, options); - return false; - }, - - // Internal method called by both remove and set. - _removeModels: function(models, options) { - var removed = []; - for (var i = 0; i < models.length; i++) { - var model = this.get(models[i]); - if (!model) continue; - - var index = this.indexOf(model); - this.models.splice(index, 1); - this.length--; - - if (!options.silent) { - options.index = index; - model.trigger('remove', model, this, options); - } - - removed.push(model); - this._removeReference(model, options); - } - return removed.length ? removed : false; - }, - - // Method for checking whether an object should be considered a model for - // the purposes of adding to the collection. - _isModel: function (model) { - return model instanceof Model; - }, - - // Internal method to create a model's ties to a collection. - _addReference: function(model, options) { - this._byId[model.cid] = model; - var id = this.modelId(model.attributes); - if (id != null) this._byId[id] = model; - model.on('all', this._onModelEvent, this); - }, - - // Internal method to sever a model's ties to a collection. - _removeReference: function(model, options) { - delete this._byId[model.cid]; - var id = this.modelId(model.attributes); - if (id != null) delete this._byId[id]; - if (this === model.collection) delete model.collection; - model.off('all', this._onModelEvent, this); - }, - - // Internal method called every time a model in the set fires an event. - // Sets need to update their indexes when models change ids. All other - // events simply proxy through. "add" and "remove" events that originate - // in other collections are ignored. - _onModelEvent: function(event, model, collection, options) { - if ((event === 'add' || event === 'remove') && collection !== this) return; - if (event === 'destroy') this.remove(model, options); - if (event === 'change') { - var prevId = this.modelId(model.previousAttributes()); - var id = this.modelId(model.attributes); - if (prevId !== id) { - if (prevId != null) delete this._byId[prevId]; - if (id != null) this._byId[id] = model; - } - } - this.trigger.apply(this, arguments); - } - - }); - - // Underscore methods that we want to implement on the Collection. - // 90% of the core usefulness of Backbone Collections is actually implemented - // right here: - var collectionMethods = { forEach: 3, each: 3, map: 3, collect: 3, reduce: 4, - foldl: 4, inject: 4, reduceRight: 4, foldr: 4, find: 3, detect: 3, filter: 3, - select: 3, reject: 3, every: 3, all: 3, some: 3, any: 3, include: 3, includes: 3, - contains: 3, invoke: 0, max: 3, min: 3, toArray: 1, size: 1, first: 3, - head: 3, take: 3, initial: 3, rest: 3, tail: 3, drop: 3, last: 3, - without: 0, difference: 0, indexOf: 3, shuffle: 1, lastIndexOf: 3, - isEmpty: 1, chain: 1, sample: 3, partition: 3, groupBy: 3, countBy: 3, - sortBy: 3, indexBy: 3}; - - // Mix in each Underscore method as a proxy to `Collection#models`. - addUnderscoreMethods(Collection, collectionMethods, 'models'); - - // Backbone.View - // ------------- - - // Backbone Views are almost more convention than they are actual code. A View - // is simply a JavaScript object that represents a logical chunk of UI in the - // DOM. This might be a single item, an entire list, a sidebar or panel, or - // even the surrounding frame which wraps your whole app. Defining a chunk of - // UI as a **View** allows you to define your DOM events declaratively, without - // having to worry about render order ... and makes it easy for the view to - // react to specific changes in the state of your models. - - // Creating a Backbone.View creates its initial element outside of the DOM, - // if an existing element is not provided... - var View = Backbone.View = function(options) { - this.cid = _.uniqueId('view'); - _.extend(this, _.pick(options, viewOptions)); - this._ensureElement(); - this.initialize.apply(this, arguments); - }; - - // Cached regex to split keys for `delegate`. - var delegateEventSplitter = /^(\S+)\s*(.*)$/; - - // List of view options to be set as properties. - var viewOptions = ['model', 'collection', 'el', 'id', 'attributes', 'className', 'tagName', 'events']; - - // Set up all inheritable **Backbone.View** properties and methods. - _.extend(View.prototype, Events, { - - // The default `tagName` of a View's element is `"div"`. - tagName: 'div', - - // jQuery delegate for element lookup, scoped to DOM elements within the - // current view. This should be preferred to global lookups where possible. - $: function(selector) { - return this.$el.find(selector); - }, - - // Initialize is an empty function by default. Override it with your own - // initialization logic. - initialize: function(){}, - - // **render** is the core function that your view should override, in order - // to populate its element (`this.el`), with the appropriate HTML. The - // convention is for **render** to always return `this`. - render: function() { - return this; - }, - - // Remove this view by taking the element out of the DOM, and removing any - // applicable Backbone.Events listeners. - remove: function() { - this._removeElement(); - this.stopListening(); - return this; - }, - - // Remove this view's element from the document and all event listeners - // attached to it. Exposed for subclasses using an alternative DOM - // manipulation API. - _removeElement: function() { - this.$el.remove(); - }, - - // Change the view's element (`this.el` property) and re-delegate the - // view's events on the new element. - setElement: function(element) { - this.undelegateEvents(); - this._setElement(element); - this.delegateEvents(); - return this; - }, - - // Creates the `this.el` and `this.$el` references for this view using the - // given `el`. `el` can be a CSS selector or an HTML string, a jQuery - // context or an element. Subclasses can override this to utilize an - // alternative DOM manipulation API and are only required to set the - // `this.el` property. - _setElement: function(el) { - this.$el = el instanceof Backbone.$ ? el : Backbone.$(el); - this.el = this.$el[0]; - }, - - // Set callbacks, where `this.events` is a hash of - // - // *{"event selector": "callback"}* - // - // { - // 'mousedown .title': 'edit', - // 'click .button': 'save', - // 'click .open': function(e) { ... } - // } - // - // pairs. Callbacks will be bound to the view, with `this` set properly. - // Uses event delegation for efficiency. - // Omitting the selector binds the event to `this.el`. - delegateEvents: function(events) { - events || (events = _.result(this, 'events')); - if (!events) return this; - this.undelegateEvents(); - for (var key in events) { - var method = events[key]; - if (!_.isFunction(method)) method = this[method]; - if (!method) continue; - var match = key.match(delegateEventSplitter); - this.delegate(match[1], match[2], _.bind(method, this)); - } - return this; - }, - - // Add a single event listener to the view's element (or a child element - // using `selector`). This only works for delegate-able events: not `focus`, - // `blur`, and not `change`, `submit`, and `reset` in Internet Explorer. - delegate: function(eventName, selector, listener) { - this.$el.on(eventName + '.delegateEvents' + this.cid, selector, listener); - return this; - }, - - // Clears all callbacks previously bound to the view by `delegateEvents`. - // You usually don't need to use this, but may wish to if you have multiple - // Backbone views attached to the same DOM element. - undelegateEvents: function() { - if (this.$el) this.$el.off('.delegateEvents' + this.cid); - return this; - }, - - // A finer-grained `undelegateEvents` for removing a single delegated event. - // `selector` and `listener` are both optional. - undelegate: function(eventName, selector, listener) { - this.$el.off(eventName + '.delegateEvents' + this.cid, selector, listener); - return this; - }, - - // Produces a DOM element to be assigned to your view. Exposed for - // subclasses using an alternative DOM manipulation API. - _createElement: function(tagName) { - return document.createElement(tagName); - }, - - // Ensure that the View has a DOM element to render into. - // If `this.el` is a string, pass it through `$()`, take the first - // matching element, and re-assign it to `el`. Otherwise, create - // an element from the `id`, `className` and `tagName` properties. - _ensureElement: function() { - if (!this.el) { - var attrs = _.extend({}, _.result(this, 'attributes')); - if (this.id) attrs.id = _.result(this, 'id'); - if (this.className) attrs['class'] = _.result(this, 'className'); - this.setElement(this._createElement(_.result(this, 'tagName'))); - this._setAttributes(attrs); - } else { - this.setElement(_.result(this, 'el')); - } - }, - - // Set attributes from a hash on this view's element. Exposed for - // subclasses using an alternative DOM manipulation API. - _setAttributes: function(attributes) { - this.$el.attr(attributes); - } - - }); - - // Backbone.sync - // ------------- - - // Override this function to change the manner in which Backbone persists - // models to the server. You will be passed the type of request, and the - // model in question. By default, makes a RESTful Ajax request - // to the model's `url()`. Some possible customizations could be: - // - // * Use `setTimeout` to batch rapid-fire updates into a single request. - // * Send up the models as XML instead of JSON. - // * Persist models via WebSockets instead of Ajax. - // - // Turn on `Backbone.emulateHTTP` in order to send `PUT` and `DELETE` requests - // as `POST`, with a `_method` parameter containing the true HTTP method, - // as well as all requests with the body as `application/x-www-form-urlencoded` - // instead of `application/json` with the model in a param named `model`. - // Useful when interfacing with server-side languages like **PHP** that make - // it difficult to read the body of `PUT` requests. - Backbone.sync = function(method, model, options) { - var type = methodMap[method]; - - // Default options, unless specified. - _.defaults(options || (options = {}), { - emulateHTTP: Backbone.emulateHTTP, - emulateJSON: Backbone.emulateJSON - }); - - // Default JSON-request options. - var params = {type: type, dataType: 'json'}; - - // Ensure that we have a URL. - if (!options.url) { - params.url = _.result(model, 'url') || urlError(); - } - - // Ensure that we have the appropriate request data. - if (options.data == null && model && (method === 'create' || method === 'update' || method === 'patch')) { - params.contentType = 'application/json'; - params.data = JSON.stringify(options.attrs || model.toJSON(options)); - } - - // For older servers, emulate JSON by encoding the request into an HTML-form. - if (options.emulateJSON) { - params.contentType = 'application/x-www-form-urlencoded'; - params.data = params.data ? {model: params.data} : {}; - } - - // For older servers, emulate HTTP by mimicking the HTTP method with `_method` - // And an `X-HTTP-Method-Override` header. - if (options.emulateHTTP && (type === 'PUT' || type === 'DELETE' || type === 'PATCH')) { - params.type = 'POST'; - if (options.emulateJSON) params.data._method = type; - var beforeSend = options.beforeSend; - options.beforeSend = function(xhr) { - xhr.setRequestHeader('X-HTTP-Method-Override', type); - if (beforeSend) return beforeSend.apply(this, arguments); - }; - } - - // Don't process data on a non-GET request. - if (params.type !== 'GET' && !options.emulateJSON) { - params.processData = false; - } - - // Pass along `textStatus` and `errorThrown` from jQuery. - var error = options.error; - options.error = function(xhr, textStatus, errorThrown) { - options.textStatus = textStatus; - options.errorThrown = errorThrown; - if (error) error.call(options.context, xhr, textStatus, errorThrown); - }; - - // Make the request, allowing the user to override any Ajax options. - var xhr = options.xhr = Backbone.ajax(_.extend(params, options)); - model.trigger('request', model, xhr, options); - return xhr; - }; - - // Map from CRUD to HTTP for our default `Backbone.sync` implementation. - var methodMap = { - 'create': 'POST', - 'update': 'PUT', - 'patch': 'PATCH', - 'delete': 'DELETE', - 'read': 'GET' - }; - - // Set the default implementation of `Backbone.ajax` to proxy through to `$`. - // Override this if you'd like to use a different library. - Backbone.ajax = function() { - return Backbone.$.ajax.apply(Backbone.$, arguments); - }; - - // Backbone.Router - // --------------- - - // Routers map faux-URLs to actions, and fire events when routes are - // matched. Creating a new one sets its `routes` hash, if not set statically. - var Router = Backbone.Router = function(options) { - options || (options = {}); - if (options.routes) this.routes = options.routes; - this._bindRoutes(); - this.initialize.apply(this, arguments); - }; - - // Cached regular expressions for matching named param parts and splatted - // parts of route strings. - var optionalParam = /\((.*?)\)/g; - var namedParam = /(\(\?)?:\w+/g; - var splatParam = /\*\w+/g; - var escapeRegExp = /[\-{}\[\]+?.,\\\^$|#\s]/g; - - // Set up all inheritable **Backbone.Router** properties and methods. - _.extend(Router.prototype, Events, { - - // Initialize is an empty function by default. Override it with your own - // initialization logic. - initialize: function(){}, - - // Manually bind a single named route to a callback. For example: - // - // this.route('search/:query/p:num', 'search', function(query, num) { - // ... - // }); - // - route: function(route, name, callback) { - if (!_.isRegExp(route)) route = this._routeToRegExp(route); - if (_.isFunction(name)) { - callback = name; - name = ''; - } - if (!callback) callback = this[name]; - var router = this; - Backbone.history.route(route, function(fragment) { - var args = router._extractParameters(route, fragment); - if (router.execute(callback, args, name) !== false) { - router.trigger.apply(router, ['route:' + name].concat(args)); - router.trigger('route', name, args); - Backbone.history.trigger('route', router, name, args); - } - }); - return this; - }, - - // Execute a route handler with the provided parameters. This is an - // excellent place to do pre-route setup or post-route cleanup. - execute: function(callback, args, name) { - if (callback) callback.apply(this, args); - }, - - // Simple proxy to `Backbone.history` to save a fragment into the history. - navigate: function(fragment, options) { - Backbone.history.navigate(fragment, options); - return this; - }, - - // Bind all defined routes to `Backbone.history`. We have to reverse the - // order of the routes here to support behavior where the most general - // routes can be defined at the bottom of the route map. - _bindRoutes: function() { - if (!this.routes) return; - this.routes = _.result(this, 'routes'); - var route, routes = _.keys(this.routes); - while ((route = routes.pop()) != null) { - this.route(route, this.routes[route]); - } - }, - - // Convert a route string into a regular expression, suitable for matching - // against the current location hash. - _routeToRegExp: function(route) { - route = route.replace(escapeRegExp, '\\$&') - .replace(optionalParam, '(?:$1)?') - .replace(namedParam, function(match, optional) { - return optional ? match : '([^/?]+)'; - }) - .replace(splatParam, '([^?]*?)'); - return new RegExp('^' + route + '(?:\\?([\\s\\S]*))?$'); - }, - - // Given a route, and a URL fragment that it matches, return the array of - // extracted decoded parameters. Empty or unmatched parameters will be - // treated as `null` to normalize cross-browser behavior. - _extractParameters: function(route, fragment) { - var params = route.exec(fragment).slice(1); - return _.map(params, function(param, i) { - // Don't decode the search params. - if (i === params.length - 1) return param || null; - return param ? decodeURIComponent(param) : null; - }); - } - - }); - - // Backbone.History - // ---------------- - - // Handles cross-browser history management, based on either - // [pushState](http://diveintohtml5.info/history.html) and real URLs, or - // [onhashchange](https://developer.mozilla.org/en-US/docs/DOM/window.onhashchange) - // and URL fragments. If the browser supports neither (old IE, natch), - // falls back to polling. - var History = Backbone.History = function() { - this.handlers = []; - this.checkUrl = _.bind(this.checkUrl, this); - - // Ensure that `History` can be used outside of the browser. - if (typeof window !== 'undefined') { - this.location = window.location; - this.history = window.history; - } - }; - - // Cached regex for stripping a leading hash/slash and trailing space. - var routeStripper = /^[#\/]|\s+$/g; - - // Cached regex for stripping leading and trailing slashes. - var rootStripper = /^\/+|\/+$/g; - - // Cached regex for stripping urls of hash. - var pathStripper = /#.*$/; - - // Has the history handling already been started? - History.started = false; - - // Set up all inheritable **Backbone.History** properties and methods. - _.extend(History.prototype, Events, { - - // The default interval to poll for hash changes, if necessary, is - // twenty times a second. - interval: 50, - - // Are we at the app root? - atRoot: function() { - var path = this.location.pathname.replace(/[^\/]$/, '$&/'); - return path === this.root && !this.getSearch(); - }, - - // Does the pathname match the root? - matchRoot: function() { - var path = this.decodeFragment(this.location.pathname); - var root = path.slice(0, this.root.length - 1) + '/'; - return root === this.root; - }, - - // Unicode characters in `location.pathname` are percent encoded so they're - // decoded for comparison. `%25` should not be decoded since it may be part - // of an encoded parameter. - decodeFragment: function(fragment) { - return decodeURI(fragment.replace(/%25/g, '%2525')); - }, - - // In IE6, the hash fragment and search params are incorrect if the - // fragment contains `?`. - getSearch: function() { - var match = this.location.href.replace(/#.*/, '').match(/\?.+/); - return match ? match[0] : ''; - }, - - // Gets the true hash value. Cannot use location.hash directly due to bug - // in Firefox where location.hash will always be decoded. - getHash: function(window) { - var match = (window || this).location.href.match(/#(.*)$/); - return match ? match[1] : ''; - }, - - // Get the pathname and search params, without the root. - getPath: function() { - var path = this.decodeFragment( - this.location.pathname + this.getSearch() - ).slice(this.root.length - 1); - return path.charAt(0) === '/' ? path.slice(1) : path; - }, - - // Get the cross-browser normalized URL fragment from the path or hash. - getFragment: function(fragment) { - if (fragment == null) { - if (this._usePushState || !this._wantsHashChange) { - fragment = this.getPath(); - } else { - fragment = this.getHash(); - } - } - return fragment.replace(routeStripper, ''); - }, - - // Start the hash change handling, returning `true` if the current URL matches - // an existing route, and `false` otherwise. - start: function(options) { - if (History.started) throw new Error('Backbone.history has already been started'); - History.started = true; - - // Figure out the initial configuration. Do we need an iframe? - // Is pushState desired ... is it available? - this.options = _.extend({root: '/'}, this.options, options); - this.root = this.options.root; - this._wantsHashChange = this.options.hashChange !== false; - this._hasHashChange = 'onhashchange' in window && (document.documentMode === void 0 || document.documentMode > 7); - this._useHashChange = this._wantsHashChange && this._hasHashChange; - this._wantsPushState = !!this.options.pushState; - this._hasPushState = !!(this.history && this.history.pushState); - this._usePushState = this._wantsPushState && this._hasPushState; - this.fragment = this.getFragment(); - - // Normalize root to always include a leading and trailing slash. - this.root = ('/' + this.root + '/').replace(rootStripper, '/'); - - // Transition from hashChange to pushState or vice versa if both are - // requested. - if (this._wantsHashChange && this._wantsPushState) { - - // If we've started off with a route from a `pushState`-enabled - // browser, but we're currently in a browser that doesn't support it... - if (!this._hasPushState && !this.atRoot()) { - var root = this.root.slice(0, -1) || '/'; - this.location.replace(root + '#' + this.getPath()); - // Return immediately as browser will do redirect to new url - return true; - - // Or if we've started out with a hash-based route, but we're currently - // in a browser where it could be `pushState`-based instead... - } else if (this._hasPushState && this.atRoot()) { - this.navigate(this.getHash(), {replace: true}); - } - - } - - // Proxy an iframe to handle location events if the browser doesn't - // support the `hashchange` event, HTML5 history, or the user wants - // `hashChange` but not `pushState`. - if (!this._hasHashChange && this._wantsHashChange && !this._usePushState) { - this.iframe = document.createElement('iframe'); - this.iframe.src = 'javascript:0'; - this.iframe.style.display = 'none'; - this.iframe.tabIndex = -1; - var body = document.body; - // Using `appendChild` will throw on IE < 9 if the document is not ready. - var iWindow = body.insertBefore(this.iframe, body.firstChild).contentWindow; - iWindow.document.open(); - iWindow.document.close(); - iWindow.location.hash = '#' + this.fragment; - } - - // Add a cross-platform `addEventListener` shim for older browsers. - var addEventListener = window.addEventListener || function (eventName, listener) { - return attachEvent('on' + eventName, listener); - }; - - // Depending on whether we're using pushState or hashes, and whether - // 'onhashchange' is supported, determine how we check the URL state. - if (this._usePushState) { - addEventListener('popstate', this.checkUrl, false); - } else if (this._useHashChange && !this.iframe) { - addEventListener('hashchange', this.checkUrl, false); - } else if (this._wantsHashChange) { - this._checkUrlInterval = setInterval(this.checkUrl, this.interval); - } - - if (!this.options.silent) return this.loadUrl(); - }, - - // Disable Backbone.history, perhaps temporarily. Not useful in a real app, - // but possibly useful for unit testing Routers. - stop: function() { - // Add a cross-platform `removeEventListener` shim for older browsers. - var removeEventListener = window.removeEventListener || function (eventName, listener) { - return detachEvent('on' + eventName, listener); - }; - - // Remove window listeners. - if (this._usePushState) { - removeEventListener('popstate', this.checkUrl, false); - } else if (this._useHashChange && !this.iframe) { - removeEventListener('hashchange', this.checkUrl, false); - } - - // Clean up the iframe if necessary. - if (this.iframe) { - document.body.removeChild(this.iframe); - this.iframe = null; - } - - // Some environments will throw when clearing an undefined interval. - if (this._checkUrlInterval) clearInterval(this._checkUrlInterval); - History.started = false; - }, - - // Add a route to be tested when the fragment changes. Routes added later - // may override previous routes. - route: function(route, callback) { - this.handlers.unshift({route: route, callback: callback}); - }, - - // Checks the current URL to see if it has changed, and if it has, - // calls `loadUrl`, normalizing across the hidden iframe. - checkUrl: function(e) { - var current = this.getFragment(); - - // If the user pressed the back button, the iframe's hash will have - // changed and we should use that for comparison. - if (current === this.fragment && this.iframe) { - current = this.getHash(this.iframe.contentWindow); - } - - if (current === this.fragment) return false; - if (this.iframe) this.navigate(current); - this.loadUrl(); - }, - - // Attempt to load the current URL fragment. If a route succeeds with a - // match, returns `true`. If no defined routes matches the fragment, - // returns `false`. - loadUrl: function(fragment) { - // If the root doesn't match, no routes can match either. - if (!this.matchRoot()) return false; - fragment = this.fragment = this.getFragment(fragment); - return _.some(this.handlers, function(handler) { - if (handler.route.test(fragment)) { - handler.callback(fragment); - return true; - } - }); - }, - - // Save a fragment into the hash history, or replace the URL state if the - // 'replace' option is passed. You are responsible for properly URL-encoding - // the fragment in advance. - // - // The options object can contain `trigger: true` if you wish to have the - // route callback be fired (not usually desirable), or `replace: true`, if - // you wish to modify the current URL without adding an entry to the history. - navigate: function(fragment, options) { - if (!History.started) return false; - if (!options || options === true) options = {trigger: !!options}; - - // Normalize the fragment. - fragment = this.getFragment(fragment || ''); - - // Don't include a trailing slash on the root. - var root = this.root; - if (fragment === '' || fragment.charAt(0) === '?') { - root = root.slice(0, -1) || '/'; - } - var url = root + fragment; - - // Strip the hash and decode for matching. - fragment = this.decodeFragment(fragment.replace(pathStripper, '')); - - if (this.fragment === fragment) return; - this.fragment = fragment; - - // If pushState is available, we use it to set the fragment as a real URL. - if (this._usePushState) { - this.history[options.replace ? 'replaceState' : 'pushState']({}, document.title, url); - - // If hash changes haven't been explicitly disabled, update the hash - // fragment to store history. - } else if (this._wantsHashChange) { - this._updateHash(this.location, fragment, options.replace); - if (this.iframe && (fragment !== this.getHash(this.iframe.contentWindow))) { - var iWindow = this.iframe.contentWindow; - - // Opening and closing the iframe tricks IE7 and earlier to push a - // history entry on hash-tag change. When replace is true, we don't - // want this. - if (!options.replace) { - iWindow.document.open(); - iWindow.document.close(); - } - - this._updateHash(iWindow.location, fragment, options.replace); - } - - // If you've told us that you explicitly don't want fallback hashchange- - // based history, then `navigate` becomes a page refresh. - } else { - return this.location.assign(url); - } - if (options.trigger) return this.loadUrl(fragment); - }, - - // Update the hash location, either replacing the current entry, or adding - // a new one to the browser history. - _updateHash: function(location, fragment, replace) { - if (replace) { - var href = location.href.replace(/(javascript:|#).*$/, ''); - location.replace(href + '#' + fragment); - } else { - // Some browsers require that `hash` contains a leading #. - location.hash = '#' + fragment; - } - } - - }); - - // Create the default Backbone.history. - Backbone.history = new History; - - // Helpers - // ------- - - // Helper function to correctly set up the prototype chain for subclasses. - // Similar to `goog.inherits`, but uses a hash of prototype properties and - // class properties to be extended. - var extend = function(protoProps, staticProps) { - var parent = this; - var child; - - // The constructor function for the new subclass is either defined by you - // (the "constructor" property in your `extend` definition), or defaulted - // by us to simply call the parent constructor. - if (protoProps && _.has(protoProps, 'constructor')) { - child = protoProps.constructor; - } else { - child = function(){ return parent.apply(this, arguments); }; - } - - // Add static properties to the constructor function, if supplied. - _.extend(child, parent, staticProps); - - // Set the prototype chain to inherit from `parent`, without calling - // `parent` constructor function. - var Surrogate = function(){ this.constructor = child; }; - Surrogate.prototype = parent.prototype; - child.prototype = new Surrogate; - - // Add prototype properties (instance properties) to the subclass, - // if supplied. - if (protoProps) _.extend(child.prototype, protoProps); - - // Set a convenience property in case the parent's prototype is needed - // later. - child.__super__ = parent.prototype; - - return child; - }; - - // Set up inheritance for the model, collection, router, view and history. - Model.extend = Collection.extend = Router.extend = View.extend = History.extend = extend; - - // Throw an error when a URL is needed, and none is supplied. - var urlError = function() { - throw new Error('A "url" property or function must be specified'); - }; - - // Wrap an optional error callback with a fallback error event. - var wrapError = function(model, options) { - var error = options.error; - options.error = function(resp) { - if (error) error.call(options.context, model, resp, options); - model.trigger('error', model, resp, options); - }; - }; - - return Backbone; - -})); diff --git a/src/views/htmlcontent/scripts/backbone.paginator.js b/src/views/htmlcontent/scripts/backbone.paginator.js deleted file mode 100644 index d682c16a27..0000000000 --- a/src/views/htmlcontent/scripts/backbone.paginator.js +++ /dev/null @@ -1,1368 +0,0 @@ -/* - backbone.paginator - http://github.com/backbone-paginator/backbone.paginator - - Copyright (c) 2016 Jimmy Yuen Ho Wong and contributors - - @module - @license MIT -*/ - -(function (factory) { - - // CommonJS - if (typeof exports == "object" && typeof require == "function") { - module.exports = factory(require("underscore"), require("backbone")); - } - // AMD - else if (typeof define == "function" && define.amd) { - define(["underscore", "backbone"], factory); - } - // Browser - else if (typeof _ !== "undefined" && typeof Backbone !== "undefined") { - var oldPageableCollection = Backbone.PageableCollection; - var PageableCollection = factory(_, Backbone); - - /** - __BROWSER ONLY__ - - If you already have an object named `PageableCollection` attached to the - `Backbone` module, you can use this to return a local reference to this - PageableCollection class and reset the name PageableCollection to its - previous definition. - - // The left hand side gives you a reference to this - // PageableCollection implementation, the right hand side - // resets PageableCollection to your other PageableCollection. - var PageableCollection = PageableCollection.noConflict(); - - @static - @return {PageableCollection} - */ - Backbone.PageableCollection.noConflict = function () { - Backbone.PageableCollection = oldPageableCollection; - return PageableCollection; - }; - } - -}(function (_, Backbone) { - - "use strict"; - - var _extend = _.extend; - var _omit = _.omit; - var _clone = _.clone; - var _each = _.each; - var _pick = _.pick; - var _contains = _.contains; - var _isEmpty = _.isEmpty; - var _pairs = _.pairs; - var _invert = _.invert; - var _isArray = _.isArray; - var _isFunction = _.isFunction; - var _isObject = _.isObject; - var _keys = _.keys; - var _isUndefined = _.isUndefined; - var ceil = Math.ceil; - var floor = Math.floor; - var max = Math.max; - - var BBColProto = Backbone.Collection.prototype; - - function finiteInt (val, name) { - if (!_.isNumber(val) || _.isNaN(val) || !_.isFinite(val) || ~~val !== val) { - throw new TypeError("`" + name + "` must be a finite integer"); - } - return val; - } - - function queryStringToParams (qs) { - var kvp, k, v, ls, params = {}, decode = decodeURIComponent; - var kvps = qs.split('&'); - for (var i = 0, l = kvps.length; i < l; i++) { - var param = kvps[i]; - kvp = param.split('='), k = kvp[0], v = kvp[1]; - if (v == null) v = true; - k = decode(k), v = decode(v), ls = params[k]; - if (_isArray(ls)) ls.push(v); - else if (ls) params[k] = [ls, v]; - else params[k] = v; - } - return params; - } - - // hack to make sure the whatever event handlers for this event is run - // before func is, and the event handlers that func will trigger. - function runOnceAtLastHandler (col, event, func) { - var eventHandlers = col._events[event]; - if (eventHandlers && eventHandlers.length) { - var lastHandler = eventHandlers[eventHandlers.length - 1]; - var oldCallback = lastHandler.callback; - lastHandler.callback = function () { - try { - oldCallback.apply(this, arguments); - func(); - } - catch (e) { - throw e; - } - finally { - lastHandler.callback = oldCallback; - } - }; - } - else func(); - } - - var PARAM_TRIM_RE = /[\s'"]/g; - var URL_TRIM_RE = /[<>\s'"]/g; - - - /** - * State change event. Fired when PageableCollection#state gets updated - * - * @event pageable:state:change - * @type {object} The PageableCollection#state object of this - * PageableCollection instance - */ - - - /** - Drop-in replacement for Backbone.Collection. Supports server-side and - client-side pagination and sorting. Client-side mode also support fully - multi-directional synchronization of changes between pages. - - @class PageableCollection - @extends Backbone.Collection - */ - var PageableCollection = Backbone.PageableCollection = Backbone.Collection.extend({ - - /** - The container object to store all pagination states. - - You can override the default state by extending this class or specifying - them in an `options` hash to the constructor. - - @property {number} firstPage = 1 - The first page index. Set to 0 if - your server API uses 0-based indices. You should only override this value - during extension, initialization or reset by the server after - fetching. This value should be read only at other times. - - @property {number} lastPage = null - The last page index. This value - is __read only__ and it's calculated based on whether `firstPage` is 0 or - 1, during bootstrapping, fetching and resetting. Please don't change this - value under any circumstances. - - @property {number} currentPage = null - The current page index. You - should only override this value during extension, initialization or reset - by the server after fetching. This value should be read only at other - times. Can be a 0-based or 1-based index, depending on whether - `firstPage` is 0 or 1. If left as default, it will be set to `firstPage` - on initialization. - - @property {number} pageSize = 25 - How many records to show per - page. This value is __read only__ after initialization, if you want to - change the page size after initialization, you must call - PageableCollection#setPageSize. - - @property {number} totalPages = null - How many pages there are. This - value is __read only__ and it is calculated from `totalRecords`. - - @property {number} totalRecords = null - How many records there - are. This value is __required__ under server mode. This value is optional - for client mode as the number will be the same as the number of models - during bootstrapping and during fetching, either supplied by the server - in the metadata, or calculated from the size of the response. - - @property {string} sortKey = null - The model attribute to use for - sorting. - - @property {number} order = -1 - The order to use for sorting. Specify - -1 for ascending order or 1 for descending order. If 0, no client side - sorting will be done and the order query parameter will not be sent to - the server during a fetch. - */ - state: { - firstPage: 1, - lastPage: null, - currentPage: null, - pageSize: 25, - totalPages: null, - totalRecords: null, - sortKey: null, - order: -1 - }, - - /** - @property {string} mode = "server" The mode of operations for this - collection. `"server"` paginates on the server-side, `"client"` paginates - on the client-side and `"infinite"` paginates on the server-side for APIs - that do not support `totalRecords`. - */ - mode: "server", - - /** - A translation map to convert PageableCollection state attributes - to the query parameters accepted by your server API. - - You can override the default state by extending this class or specifying - them in `options.queryParams` object hash to the constructor. - - @property {string} currentPage = "page" - @property {string} pageSize = "per_page" - @property {string} totalPages = "total_pages" - @property {string} totalRecords = "total_entries" - @property {string} sortKey = "sort_by" - @property {string} order = "order" - @property {string} directions = {"-1": "asc", "1": "desc"} - A map for - translating a PageableCollection#state.order constant to the ones your - server API accepts. - */ - queryParams: { - currentPage: "page", - pageSize: "per_page", - totalPages: "total_pages", - totalRecords: "total_entries", - sortKey: "sort_by", - order: "order", - directions: { - "-1": "asc", - "1": "desc" - } - }, - - /** - Given a list of models or model attributues, bootstraps the full - collection in client mode or infinite mode, or just the page you want in - server mode. - - If you want to initialize a collection to a different state than the - default, you can specify them in `options.state`. Any state parameters - supplied will be merged with the default. If you want to change the - default mapping from PageableCollection#state keys to your server API's - query parameter names, you can specifiy an object hash in - `option.queryParams`. Likewise, any mapping provided will be merged with - the default. Lastly, all Backbone.Collection constructor options are also - accepted. - - See: - - - PageableCollection#state - - PageableCollection#queryParams - - [Backbone.Collection#initialize](http://backbonejs.org/#Collection-constructor) - - @constructor - - @property {Backbone.Collection} fullCollection - __CLIENT MODE ONLY__ - This collection is the internal storage for the bootstrapped or fetched - models. You can use this if you want to operate on all the pages. - - @param {Array.} models - - @param {Object} options - - @param {function(*, *): number} options.comparator - If specified, this - comparator is set to the current page under server mode, or the - PageableCollection#fullCollection otherwise. - - @param {boolean} options.full 0 If `false` and either a - `options.comparator` or `sortKey` is defined, the comparator is attached - to the current page. Default is `true` under client or infinite mode and - the comparator will be attached to the PageableCollection#fullCollection. - - @param {Object} options.state - The state attributes overriding the defaults. - - @param {string} options.state.sortKey - The model attribute to use for - sorting. If specified instead of `options.comparator`, a comparator will - be automatically created using this value, and optionally a sorting order - specified in `options.state.order`. The comparator is then attached to - the new collection instance. - - @param {number} options.state.order - The order to use for sorting. Specify - -1 for ascending order and 1 for descending order. - - @param {Object} options.queryParam - */ - constructor: function (models, options) { - - BBColProto.constructor.apply(this, arguments); - - options = options || {}; - - var mode = this.mode = options.mode || this.mode || PageableProto.mode; - - var queryParams = _extend({}, PageableProto.queryParams, this.queryParams, - options.queryParams || {}); - - queryParams.directions = _extend({}, - PageableProto.queryParams.directions, - this.queryParams.directions, - queryParams.directions); - - this.queryParams = queryParams; - - var state = this.state = _extend({}, PageableProto.state, this.state, - options.state); - - state.currentPage = state.currentPage == null ? - state.firstPage : - state.currentPage; - - if (!_isArray(models)) models = models ? [models] : []; - models = models.slice(); - - if (mode != "server" && state.totalRecords == null && !_isEmpty(models)) { - state.totalRecords = models.length; - } - - this.switchMode(mode, _extend({fetch: false, - resetState: false, - models: models}, options)); - - var comparator = options.comparator; - - if (state.sortKey && !comparator) { - this.setSorting(state.sortKey, state.order, options); - } - - if (mode != "server") { - var fullCollection = this.fullCollection; - - if (comparator && options.full) { - this.comparator = null; - fullCollection.comparator = comparator; - } - - if (options.full) fullCollection.sort(); - - // make sure the models in the current page and full collection have the - // same references - if (!_isEmpty(models)) { - this.reset(models, _extend({silent: true}, options)); - this.getPage(state.currentPage); - models.splice.apply(models, [0, models.length].concat(this.models)); - } - } - - this._initState = _clone(this.state); - }, - - /** - Makes a Backbone.Collection that contains all the pages. - - @private - @param {Array.} models - @param {Object} options Options for Backbone.Collection constructor. - @return {Backbone.Collection} - */ - _makeFullCollection: function (models, options) { - - var properties = ["url", "model", "sync", "comparator"]; - var thisProto = this.constructor.prototype; - var i, length, prop; - - var proto = {}; - for (i = 0, length = properties.length; i < length; i++) { - prop = properties[i]; - if (!_isUndefined(thisProto[prop])) { - proto[prop] = thisProto[prop]; - } - } - - var fullCollection = new (Backbone.Collection.extend(proto))(models, options); - - for (i = 0, length = properties.length; i < length; i++) { - prop = properties[i]; - if (this[prop] !== thisProto[prop]) { - fullCollection[prop] = this[prop]; - } - } - - return fullCollection; - }, - - /** - Factory method that returns a Backbone event handler that responses to - the `add`, `remove`, `reset`, and the `sort` events. The returned event - handler will synchronize the current page collection and the full - collection's models. - - @private - - @fires PageableCollection#pageable:state:change when handling an - `add`, `remove`, or `reset` event - - @param {PageableCollection} pageCol - @param {Backbone.Collection} fullCol - - @return {function(string, Backbone.Model, Backbone.Collection, Object)} - Collection event handler - */ - _makeCollectionEventHandler: function (pageCol, fullCol) { - - return function collectionEventHandler (event, model, collection, options) { - - var handlers = pageCol._handlers; - _each(_keys(handlers), function (event) { - var handler = handlers[event]; - pageCol.off(event, handler); - fullCol.off(event, handler); - }); - - var state = _clone(pageCol.state); - var firstPage = state.firstPage; - var currentPage = firstPage === 0 ? - state.currentPage : - state.currentPage - 1; - var pageSize = state.pageSize; - var pageStart = currentPage * pageSize, pageEnd = pageStart + pageSize; - - if (event == "add") { - var pageIndex, fullIndex, addAt, colToAdd, options = options || {}; - if (collection == fullCol) { - fullIndex = fullCol.indexOf(model); - if (fullIndex >= pageStart && fullIndex < pageEnd) { - colToAdd = pageCol; - pageIndex = addAt = fullIndex - pageStart; - } - } - else { - pageIndex = pageCol.indexOf(model); - fullIndex = pageStart + pageIndex; - colToAdd = fullCol; - var addAt = !_isUndefined(options.at) ? - options.at + pageStart : - fullIndex; - } - - if (!options.onRemove) { - ++state.totalRecords; - delete options.onRemove; - } - - pageCol.state = pageCol._checkState(state); - - if (colToAdd) { - colToAdd.add(model, _extend({}, options, {at: addAt})); - var modelToRemove = pageIndex >= pageSize ? - model : - !_isUndefined(options.at) && addAt < pageEnd && pageCol.length > pageSize ? - pageCol.at(pageSize) : - null; - if (modelToRemove) { - runOnceAtLastHandler(collection, event, function () { - pageCol.remove(modelToRemove, {onAdd: true}); - }); - } - } - - if (!options.silent) pageCol.trigger("pageable:state:change", pageCol.state); - } - - // remove the model from the other collection as well - if (event == "remove") { - if (!options.onAdd) { - // decrement totalRecords and update totalPages and lastPage - if (!--state.totalRecords) { - state.totalRecords = null; - state.totalPages = null; - } - else { - var totalPages = state.totalPages = ceil(state.totalRecords / pageSize); - state.lastPage = firstPage === 0 ? totalPages - 1 : totalPages || firstPage; - if (state.currentPage > totalPages) state.currentPage = state.lastPage; - } - pageCol.state = pageCol._checkState(state); - - var nextModel, removedIndex = options.index; - if (collection == pageCol) { - if (nextModel = fullCol.at(pageEnd)) { - runOnceAtLastHandler(pageCol, event, function () { - pageCol.push(nextModel, {onRemove: true}); - }); - } - else if (!pageCol.length && state.totalRecords) { - pageCol.reset(fullCol.models.slice(pageStart - pageSize, pageEnd - pageSize), - _extend({}, options, {parse: false})); - } - fullCol.remove(model); - } - else if (removedIndex >= pageStart && removedIndex < pageEnd) { - if (nextModel = fullCol.at(pageEnd - 1)) { - runOnceAtLastHandler(pageCol, event, function() { - pageCol.push(nextModel, {onRemove: true}); - }); - } - pageCol.remove(model); - if (!pageCol.length && state.totalRecords) { - pageCol.reset(fullCol.models.slice(pageStart - pageSize, pageEnd - pageSize), - _extend({}, options, {parse: false})); - } - } - } - else delete options.onAdd; - - if (!options.silent) pageCol.trigger("pageable:state:change", pageCol.state); - } - - if (event == "reset") { - options = collection; - collection = model; - - // Reset that's not a result of getPage - if (collection == pageCol && options.from == null && - options.to == null) { - var head = fullCol.models.slice(0, pageStart); - var tail = fullCol.models.slice(pageStart + pageCol.models.length); - fullCol.reset(head.concat(pageCol.models).concat(tail), options); - } - else if (collection == fullCol) { - if (!(state.totalRecords = fullCol.models.length)) { - state.totalRecords = null; - state.totalPages = null; - } - if (pageCol.mode == "client") { - firstPage = state.lastPage = state.currentPage = state.firstPage; - currentPage = firstPage === 0 ? state.currentPage : state.currentPage - 1; - pageStart = currentPage * pageSize; - pageEnd = pageStart + pageSize; - } - pageCol.state = pageCol._checkState(state); - pageCol.reset(fullCol.models.slice(pageStart, pageEnd), - _extend({}, options, {parse: false})); - } - - if (!options.silent) pageCol.trigger("pageable:state:change", pageCol.state); - } - - if (event == "sort") { - options = collection; - collection = model; - if (collection === fullCol) { - pageCol.reset(fullCol.models.slice(pageStart, pageEnd), - _extend({}, options, {parse: false})); - } - } - - _each(_keys(handlers), function (event) { - var handler = handlers[event]; - _each([pageCol, fullCol], function (col) { - col.on(event, handler); - var callbacks = col._events[event] || []; - callbacks.unshift(callbacks.pop()); - }); - }); - }; - }, - - /** - Sanity check this collection's pagination states. Only perform checks - when all the required pagination state values are defined and not null. - If `totalPages` is undefined or null, it is set to `totalRecords` / - `pageSize`. `lastPage` is set according to whether `firstPage` is 0 or 1 - when no error occurs. - - @private - - @throws {TypeError} If `totalRecords`, `pageSize`, `currentPage` or - `firstPage` is not a finite integer. - - @throws {RangeError} If `pageSize`, `currentPage` or `firstPage` is out - of bounds. - - @return {Object} Returns the `state` object if no error was found. - */ - _checkState: function (state) { - var mode = this.mode; - var links = this.links; - var totalRecords = state.totalRecords; - var pageSize = state.pageSize; - var currentPage = state.currentPage; - var firstPage = state.firstPage; - var totalPages = state.totalPages; - - if (totalRecords != null && pageSize != null && currentPage != null && - firstPage != null && (mode == "infinite" ? links : true)) { - - totalRecords = finiteInt(totalRecords, "totalRecords"); - pageSize = finiteInt(pageSize, "pageSize"); - currentPage = finiteInt(currentPage, "currentPage"); - firstPage = finiteInt(firstPage, "firstPage"); - - if (pageSize < 1) { - throw new RangeError("`pageSize` must be >= 1"); - } - - totalPages = state.totalPages = ceil(totalRecords / pageSize); - - if (firstPage < 0 || firstPage > 1) { - throw new RangeError("`firstPage must be 0 or 1`"); - } - - state.lastPage = firstPage === 0 ? max(0, totalPages - 1) : totalPages || firstPage; - - if (mode == "infinite") { - if (!links[currentPage + '']) { - throw new RangeError("No link found for page " + currentPage); - } - } - else if (currentPage < firstPage || - (totalPages > 0 && - (firstPage ? currentPage > totalPages : currentPage >= totalPages))) { - throw new RangeError("`currentPage` must be firstPage <= currentPage " + - (firstPage ? "<" : "<=") + - " totalPages if " + firstPage + "-based. Got " + - currentPage + '.'); - } - } - - return state; - }, - - /** - Change the page size of this collection. - - Under most if not all circumstances, you should call this method to - change the page size of a pageable collection because it will keep the - pagination state sane. By default, the method will recalculate the - current page number to one that will retain the current page's models - when increasing the page size. When decreasing the page size, this method - will retain the last models to the current page that will fit into the - smaller page size. - - If `options.first` is true, changing the page size will also reset the - current page back to the first page instead of trying to be smart. - - For server mode operations, changing the page size will trigger a - PageableCollection#fetch and subsequently a `reset` event. - - For client mode operations, changing the page size will `reset` the - current page by recalculating the current page boundary on the client - side. - - If `options.fetch` is true, a fetch can be forced if the collection is in - client mode. - - @param {number} pageSize - The new page size to set to PageableCollection#state. - @param {Object} options - {@link PageableCollection#fetch} options. - @param {boolean} options.first = false 0 Reset the current page number to - the first page if `true`. - @param {boolean} options.fetch - If `true`, force a fetch in client mode. - - @throws {TypeError} If `pageSize` is not a finite integer. - @throws {RangeError} If `pageSize` is less than 1. - - @chainable - @return {XMLHttpRequest|PageableCollection} The XMLHttpRequest - from fetch or this. - */ - setPageSize: function (pageSize, options) { - pageSize = finiteInt(pageSize, "pageSize"); - - options = options || {first: false}; - - var state = this.state; - var totalPages = ceil(state.totalRecords / pageSize); - var currentPage = totalPages ? - max(state.firstPage, floor(totalPages * state.currentPage / state.totalPages)) : - state.firstPage; - - state = this.state = this._checkState(_extend({}, state, { - pageSize: pageSize, - currentPage: options.first ? state.firstPage : currentPage, - totalPages: totalPages - })); - - return this.getPage(state.currentPage, _omit(options, ["first"])); - }, - - /** - Switching between client, server and infinite mode. - - If switching from client to server mode, the #fullCollection is emptied - first and then deleted and a fetch is immediately issued for the current - page from the server. Pass `false` to `options.fetch` to skip fetching. - - If switching to infinite mode, and if `options.models` is given for an - array of models,PageableCollection#links will be populated with a URL per - page, using the default URL for this collection. - - If switching from server to client mode, all of the pages are immediately - refetched. If you have too many pages, you can pass `false` to - `options.fetch` to skip fetching. - - If switching to any mode from infinite mode, thePageableCollection#links - will be deleted. - - @fires PageableCollection#pageable:state:change - - @param {"server"|"client"|"infinite"} mode - The mode to switch to. - - @param {Object} options - - @param {boolean} options.fetch = true - If `false`, no fetching is done. - - @param {boolean} options.resetState = true - If 'false', the state is not - reset, but checked for sanity instead. - - @chainable - @return {XMLHttpRequest|PageableCollection} The XMLHttpRequest - from fetch or this if `options.fetch` is `false`. - */ - switchMode: function (mode, options) { - - if (!_contains(["server", "client", "infinite"], mode)) { - throw new TypeError('`mode` must be one of "server", "client" or "infinite"'); - } - - options = options || {fetch: true, resetState: true}; - - var state = this.state = options.resetState ? - _clone(this._initState) : - this._checkState(_extend({}, this.state)); - - this.mode = mode; - - var self = this; - var fullCollection = this.fullCollection; - var handlers = this._handlers = this._handlers || {}, handler; - if (mode != "server" && !fullCollection) { - fullCollection = this._makeFullCollection(options.models || [], options); - fullCollection.pageableCollection = this; - this.fullCollection = fullCollection; - var allHandler = this._makeCollectionEventHandler(this, fullCollection); - _each(["add", "remove", "reset", "sort"], function (event) { - handlers[event] = handler = _.bind(allHandler, {}, event); - self.on(event, handler); - fullCollection.on(event, handler); - }); - fullCollection.comparator = this._fullComparator; - } - else if (mode == "server" && fullCollection) { - _each(_keys(handlers), function (event) { - handler = handlers[event]; - self.off(event, handler); - fullCollection.off(event, handler); - }); - delete this._handlers; - this._fullComparator = fullCollection.comparator; - delete this.fullCollection; - } - - if (mode == "infinite") { - var links = this.links = {}; - var firstPage = state.firstPage; - var totalPages = ceil(state.totalRecords / state.pageSize); - var lastPage = firstPage === 0 ? max(0, totalPages - 1) : totalPages || firstPage; - for (var i = state.firstPage; i <= lastPage; i++) { - links[i] = this.url; - } - } - else if (this.links) delete this.links; - - if (!options.silent) this.trigger("pageable:state:change", state); - - return options.fetch ? - this.fetch(_omit(options, "fetch", "resetState")) : - this; - }, - - /** - @return {boolean} `true` if this collection can page backward, `false` - otherwise. - */ - hasPreviousPage: function () { - var state = this.state; - var currentPage = state.currentPage; - if (this.mode != "infinite") return currentPage > state.firstPage; - return !!this.links[currentPage - 1]; - }, - - /** - @return {boolean} `true` if this collection can page forward, `false` - otherwise. - */ - hasNextPage: function () { - var state = this.state; - var currentPage = this.state.currentPage; - if (this.mode != "infinite") return currentPage < state.lastPage; - return !!this.links[currentPage + 1]; - }, - - /** - Fetch the first page in server mode, or reset the current page of this - collection to the first page in client or infinite mode. - - @param {Object} options {@linkPageableCollection#getPage} options. - - @chainable - @return {XMLHttpRequest|PageableCollection} The XMLHttpRequest - from fetch or this. - */ - getFirstPage: function (options) { - return this.getPage("first", options); - }, - - /** - Fetch the previous page in server mode, or reset the current page of this - collection to the previous page in client or infinite mode. - - @param {Object} options {@linkPageableCollection#getPage} options. - - @chainable - @return {XMLHttpRequest|PageableCollection} The XMLHttpRequest - from fetch or this. - */ - getPreviousPage: function (options) { - return this.getPage("prev", options); - }, - - /** - Fetch the next page in server mode, or reset the current page of this - collection to the next page in client mode. - - @param {Object} options {@linkPageableCollection#getPage} options. - - @chainable - @return {XMLHttpRequest|PageableCollection} The XMLHttpRequest - from fetch or this. - */ - getNextPage: function (options) { - return this.getPage("next", options); - }, - - /** - Fetch the last page in server mode, or reset the current page of this - collection to the last page in client mode. - - @param {Object} options {@linkPageableCollection#getPage} options. - - @chainable - @return {XMLHttpRequest|PageableCollection} The XMLHttpRequest - from fetch or this. - */ - getLastPage: function (options) { - return this.getPage("last", options); - }, - - /** - Given a page index, set PageableCollection#state.currentPage to that - index. If this collection is in server mode, fetch the page using the - updated state, otherwise, reset the current page of this collection to - the page specified by `index` in client mode. If `options.fetch` is true, - a fetch can be forced in client mode before resetting the current - page. Under infinite mode, if the index is less than the current page, a - reset is done as in client mode. If the index is greater than the current - page number, a fetch is made with the results **appended** - toPageableCollection#fullCollection. The current page will then be reset - after fetching. - - @fires PageableCollection#pageable:state:change - - @param {number|string} index - The page index to go to, or the page name to - look up fromPageableCollection#links in infinite mode. - @param {Object} options - {@linkPageableCollection#fetch} options or - [reset](http://backbonejs.org/#Collection-reset) options for client mode - when `options.fetch` is `false`. - @param {boolean} options.fetch = false - If true, force a - {@linkPageableCollection#fetch} in client mode. - - @throws {TypeError} If `index` is not a finite integer under server or - client mode, or does not yield a URL fromPageableCollection#links under - infinite mode. - - @throws {RangeError} If `index` is out of bounds. - - @chainable - @return {XMLHttpRequest|PageableCollection} The XMLHttpRequest - from fetch or this. - */ - getPage: function (index, options) { - - var mode = this.mode, fullCollection = this.fullCollection; - - options = options || {fetch: false}; - - var state = this.state, - firstPage = state.firstPage, - currentPage = state.currentPage, - lastPage = state.lastPage, - pageSize = state.pageSize; - - var pageNum = index; - switch (index) { - case "first": pageNum = firstPage; break; - case "prev": pageNum = currentPage - 1; break; - case "next": pageNum = currentPage + 1; break; - case "last": pageNum = lastPage; break; - default: pageNum = finiteInt(index, "index"); - } - - this.state = this._checkState(_extend({}, state, {currentPage: pageNum})); - if (!options.silent) this.trigger("pageable:state:change", this.state); - - options.from = currentPage, options.to = pageNum; - - var pageStart = (firstPage === 0 ? pageNum : pageNum - 1) * pageSize; - var pageModels = fullCollection && fullCollection.length ? - fullCollection.models.slice(pageStart, pageStart + pageSize) : - []; - if ((mode == "client" || (mode == "infinite" && !_isEmpty(pageModels))) && - !options.fetch) { - this.reset(pageModels, _omit(options, "fetch")); - return this; - } - - if (mode == "infinite") options.url = this.links[pageNum]; - - return this.fetch(_omit(options, "fetch")); - }, - - /** - Fetch the page for the provided item offset in server mode, or reset the - current page of this collection to the page for the provided item offset - in client mode. - - @param {Object} options {@linkPageableCollection#getPage} options. - - @chainable - @return {XMLHttpRequest|PageableCollection} The XMLHttpRequest - from fetch or this. - */ - getPageByOffset: function (offset, options) { - if (offset < 0) { - throw new RangeError("`offset must be > 0`"); - } - offset = finiteInt(offset); - - var page = floor(offset / this.state.pageSize); - if (this.state.firstPage !== 0) page++; - if (page > this.state.lastPage) page = this.state.lastPage; - return this.getPage(page, options); - }, - - /** - Overidden to make `getPage` compatible with Zepto. - - @param {string} method - @param {Backbone.Model|Backbone.Collection} model - @param {Object} options - - @return {XMLHttpRequest} - */ - sync: function (method, model, options) { - var self = this; - if (self.mode == "infinite") { - var success = options.success; - var currentPage = self.state.currentPage; - options.success = function (resp, status, xhr) { - var links = self.links; - var newLinks = self.parseLinks(resp, _extend({xhr: xhr}, options)); - if (newLinks.first) links[self.state.firstPage] = newLinks.first; - if (newLinks.prev) links[currentPage - 1] = newLinks.prev; - if (newLinks.next) links[currentPage + 1] = newLinks.next; - if (success) success(resp, status, xhr); - }; - } - - return (BBColProto.sync || Backbone.sync).call(self, method, model, options); - }, - - /** - Parse pagination links from the server response. Only valid under - infinite mode. - - Given a response body and a XMLHttpRequest object, extract pagination - links from them for infinite paging. - - This default implementation parses the RFC 5988 `Link` header and extract - 3 links from it - `first`, `prev`, `next`. Any subclasses overriding this - method __must__ return an object hash having only the keys - above. However, simply returning a `next` link or an empty hash if there - are no more links should be enough for most implementations. - - @param {*} resp The deserialized response body. - @param {Object} options - @param {XMLHttpRequest} options.xhr - The XMLHttpRequest object for this - response. - @return {Object} - */ - parseLinks: function (resp, options) { - var links = {}; - var linkHeader = options.xhr.getResponseHeader("Link"); - if (linkHeader) { - var relations = ["first", "prev", "next"]; - _each(linkHeader.split(","), function (linkValue) { - var linkParts = linkValue.split(";"); - var url = linkParts[0].replace(URL_TRIM_RE, ''); - var params = linkParts.slice(1); - _each(params, function (param) { - var paramParts = param.split("="); - var key = paramParts[0].replace(PARAM_TRIM_RE, ''); - var value = paramParts[1].replace(PARAM_TRIM_RE, ''); - if (key == "rel" && _contains(relations, value)) links[value] = url; - }); - }); - } - - return links; - }, - - /** - Parse server response data. - - This default implementation assumes the response data is in one of two - structures: - - [ - {}, // Your new pagination state - [{}, ...] // An array of JSON objects - ] - - Or, - - [{}] // An array of JSON objects - - The first structure is the preferred form because the pagination states - may have been updated on the server side, sending them down again allows - this collection to update its states. If the response has a pagination - state object, it is checked for errors. - - The second structure is the - [Backbone.Collection#parse](http://backbonejs.org/#Collection-parse) - default. - - **Note:** this method has been further simplified since 1.1.7. While - existingPageableCollection#parse implementations will continue to work, - new code is encouraged to overridePageableCollection#parseState - andPageableCollection#parseRecords instead. - - @param {Object} resp The deserialized response data from the server. - @param {Object} the options for the ajax request - - @return {Array.} An array of model objects - */ - parse: function (resp, options) { - var newState = this.parseState(resp, _clone(this.queryParams), _clone(this.state), options); - if (newState) this.state = this._checkState(_extend({}, this.state, newState)); - return this.parseRecords(resp, options); - }, - - /** - Parse server response for server pagination state updates. Not applicable - under infinite mode. - - This default implementation first checks whether the response has any - state object as documented inPageableCollection#parse. If it exists, a - state object is returned by mapping the server state keys to this - pageable collection instance's query parameter keys using `queryParams`. - - It is __NOT__ neccessary to return a full state object complete with all - the mappings defined inPageableCollection#queryParams. Any state object - resulted is merged with a copy of the current pageable collection state - and checked for sanity before actually updating. Most of the time, simply - providing a new `totalRecords` value is enough to trigger a full - pagination state recalculation. - - parseState: function (resp, queryParams, state, options) { - return {totalRecords: resp.total_entries}; - } - - If you want to use header fields use: - - parseState: function (resp, queryParams, state, options) { - return {totalRecords: options.xhr.getResponseHeader("X-total")}; - } - - This method __MUST__ return a new state object instead of directly - modifying the PageableCollection#state object. The behavior of directly - modifying PageableCollection#state is undefined. - - @param {Object} resp - The deserialized response data from the server. - @param {Object} queryParams - A copy of PageableCollection#queryParams. - @param {Object} state - A copy of PageableCollection#state. - @param {Object} options - The options passed through from - `parse`. (backbone >= 0.9.10 only) - - @return {Object} A new (partial) state object. - */ - parseState: function (resp, queryParams, state, options) { - if (resp && resp.length === 2 && _isObject(resp[0]) && _isArray(resp[1])) { - - var newState = _clone(state); - var serverState = resp[0]; - - _each(_pairs(_omit(queryParams, "directions")), function (kvp) { - var k = kvp[0], v = kvp[1]; - var serverVal = serverState[v]; - if (!_isUndefined(serverVal) && !_.isNull(serverVal)) newState[k] = serverState[v]; - }); - - if (serverState.order) { - newState.order = _invert(queryParams.directions)[serverState.order] * 1; - } - - return newState; - } - }, - - /** - Parse server response for an array of model objects. - - This default implementation first checks whether the response has any - state object as documented inPageableCollection#parse. If it exists, the - array of model objects is assumed to be the second element, otherwise the - entire response is returned directly. - - @param {Object} resp - The deserialized response data from the server. - @param {Object} options - The options passed through from the - `parse`. (backbone >= 0.9.10 only) - - @return {Array.} An array of model objects - */ - parseRecords: function (resp, options) { - if (resp && resp.length === 2 && _isObject(resp[0]) && _isArray(resp[1])) { - return resp[1]; - } - - return resp; - }, - - /** - Fetch a page from the server in server mode, or all the pages in client - mode. Under infinite mode, the current page is refetched by default and - then reset. - - The query string is constructed by translating the current pagination - state to your server API query parameter - usingPageableCollection#queryParams. The current page will reset after - fetch. - - @param {Object} options - Accepts all - [Backbone.Collection#fetch](http://backbonejs.org/#Collection-fetch) - options. - - @return {XMLHttpRequest} - */ - fetch: function (options) { - - options = options || {}; - - var state = this._checkState(this.state); - - var mode = this.mode; - - if (mode == "infinite" && !options.url) { - options.url = this.links[state.currentPage]; - } - - var data = options.data || {}; - - // dedup query params - var url = options.url || this.url || ""; - if (_isFunction(url)) url = url.call(this); - var qsi = url.indexOf('?'); - if (qsi != -1) { - _extend(data, queryStringToParams(url.slice(qsi + 1))); - url = url.slice(0, qsi); - } - - options.url = url; - options.data = data; - - // map params except directions - var queryParams = this.mode == "client" ? - _pick(this.queryParams, "sortKey", "order") : - _omit(_pick(this.queryParams, _keys(PageableProto.queryParams)), - "directions"); - - var thisCopy = _.clone(this); - _.each(queryParams, function (v, k) { - v = _isFunction(v) ? v.call(thisCopy) : v; - if (state[k] != null && v != null && _.isUndefined(data[v])) { - data[v] = state[k]; - } - }, this); - - // fix up sorting parameters - var i; - if (state.sortKey && state.order) { - var o = _isFunction(queryParams.order) ? - queryParams.order.call(thisCopy) : - queryParams.order; - if (!_isArray(state.order)) { - data[o] = this.queryParams.directions[state.order + ""]; - } - else { - data[o] = []; - for (i = 0; i < state.order.length; i += 1) { - data[o].push(this.queryParams.directions[state.order[i]]); - } - } - } - else if (!state.sortKey) delete data[queryParams.order]; - - // map extra query parameters - var extraKvps = _pairs(_omit(this.queryParams, - _keys(PageableProto.queryParams))), - kvp, - v; - for (i = 0; i < extraKvps.length; i++) { - kvp = extraKvps[i]; - v = kvp[1]; - v = _isFunction(v) ? v.call(thisCopy) : v; - if (v != null) data[kvp[0]] = v; - } - - if (mode != "server") { - var self = this, fullCol = this.fullCollection; - var success = options.success; - options.success = function (col, resp, opts) { - - // make sure the caller's intent is obeyed - opts = opts || {}; - if (_isUndefined(options.silent)) delete opts.silent; - else opts.silent = options.silent; - - var models = col.models; - if (mode == "client") fullCol.reset(models, opts); - else { - fullCol.add(models, _extend({at: fullCol.length}, - _extend(opts, {parse: false}))); - self.trigger("reset", self, opts); - } - - if (success) success(col, resp, opts); - }; - - // silent the first reset from backbone - return BBColProto.fetch.call(this, _extend({}, options, {silent: true})); - } - - return BBColProto.fetch.call(this, options); - }, - - /** - Convenient method for making a `comparator` sorted by a model attribute - identified by `sortKey` and ordered by `order`. - - Like a Backbone.Collection, a PageableCollection will maintain the - __current page__ in sorted order on the client side if a `comparator` is - attached to it. If the collection is in client mode, you can attach a - comparator toPageableCollection#fullCollection to have all the pages - reflect the global sorting order by specifying an option `full` to - `true`. You __must__ call `sort` manually - orPageableCollection#fullCollection.sort after calling this method to - force a resort. - - While you can use this method to sort the current page in server mode, - the sorting order may not reflect the global sorting order due to the - additions or removals of the records on the server since the last - fetch. If you want the most updated page in a global sorting order, it is - recommended that you set PageableCollection#state.sortKey and optionally - PageableCollection#state.order, and then callPageableCollection#fetch. - - @protected - - @param {string} sortKey = this.state.sortKey - See `state.sortKey`. - @param {number} order = this.state.order - See `state.order`. - @param {(function(Backbone.Model, string): Object) | string} sortValue - - See PageableCollection#setSorting. - - See [Backbone.Collection.comparator](http://backbonejs.org/#Collection-comparator). - */ - _makeComparator: function (sortKey, order, sortValue) { - var state = this.state; - - sortKey = sortKey || state.sortKey; - order = order || state.order; - - if (!sortKey || !order) return; - - if (!sortValue) sortValue = function (model, attr) { - return model.get(attr); - }; - - return function (left, right) { - var l = sortValue(left, sortKey), r = sortValue(right, sortKey), t; - if (order === 1) t = l, l = r, r = t; - if (l === r) return 0; - else if (l < r) return -1; - return 1; - }; - }, - - /** - Adjusts the sorting for this pageable collection. - - Given a `sortKey` and an `order`, sets `state.sortKey` and - `state.order`. A comparator can be applied on the client side to sort in - the order defined if `options.side` is `"client"`. By default the - comparator is applied to thePageableCollection#fullCollection. Set - `options.full` to `false` to apply a comparator to the current page under - any mode. Setting `sortKey` to `null` removes the comparator from both - the current page and the full collection. - - If a `sortValue` function is given, it will be passed the `(model, - sortKey)` arguments and is used to extract a value from the model during - comparison sorts. If `sortValue` is not given, `model.get(sortKey)` is - used for sorting. - - @chainable - - @param {string} sortKey - See `state.sortKey`. - @param {number} order=this.state.order - See `state.order`. - @param {Object} options - @param {string} options.side - By default, `"client"` if `mode` is - `"client"`, `"server"` otherwise. - @param {boolean} options.full = true - @param {(function(Backbone.Model, string): Object) | string} options.sortValue - */ - setSorting: function (sortKey, order, options) { - - var state = this.state; - - state.sortKey = sortKey; - state.order = order = order || state.order; - - var fullCollection = this.fullCollection; - - var delComp = false, delFullComp = false; - - if (!sortKey) delComp = delFullComp = true; - - var mode = this.mode; - options = _extend({side: mode == "client" ? mode : "server", full: true}, - options); - - var comparator = this._makeComparator(sortKey, order, options.sortValue); - - var full = options.full, side = options.side; - - if (side == "client") { - if (full) { - if (fullCollection) fullCollection.comparator = comparator; - delComp = true; - } - else { - this.comparator = comparator; - delFullComp = true; - } - } - else if (side == "server" && !full) { - this.comparator = comparator; - } - - if (delComp) this.comparator = null; - if (delFullComp && fullCollection) fullCollection.comparator = null; - - return this; - } - - }); - - var PageableProto = PageableCollection.prototype; - - return PageableCollection; - -})); diff --git a/src/views/htmlcontent/scripts/backgrid-filter.js b/src/views/htmlcontent/scripts/backgrid-filter.js deleted file mode 100644 index f5c2649da1..0000000000 --- a/src/views/htmlcontent/scripts/backgrid-filter.js +++ /dev/null @@ -1,518 +0,0 @@ -/* - backgrid-filter - http://github.com/wyuenho/backgrid - - Copyright (c) 2013 Jimmy Yuen Ho Wong and contributors - Licensed under the MIT @license. -*/ -(function (root, factory) { - - if (typeof define === 'function' && define.amd) { - // AMD. Register as an anonymous module. - define(["underscore", "backbone", "backgrid"], factory); - } else if (typeof exports == "object") { - // CommonJS - var lunr; - try { - lunr = require("lunr"); - } catch (e) {} - - module.exports = factory( - require("underscore"), - require("backbone"), - require("backgrid"), - lunr - ); - } else { - // Browser - factory(root._, root.Backbone, root.Backgrid, root.lunr); - } - -}(this, function (_, Backbone, Backgrid, lunr) { - - "use strict"; - - var exports = {}; - - /** - ServerSideFilter is a search form widget that submits a query to the server - for filtering the current collection. - - @class Backgrid.Extension.ServerSideFilter - */ - var ServerSideFilter = exports.ServerSideFilter = Backgrid.Extension.ServerSideFilter = Backbone.View.extend({ - - /** @property */ - tagName: "form", - - /** @property */ - className: "backgrid-filter form-search", - - /** @property {function(Object, ?Object=): string} template */ - template: function (data) { - return ' ×'; - }, - - /** @property */ - events: { - "keyup input[type=search]": "showClearButtonMaybe", - "click a[data-backgrid-action=clear]": "clear", - "submit": "search" - }, - - /** @property {string} [name='q'] Query key */ - name: "q", - - /** @property {string} [value] The search box value. */ - value: null, - - /** - @property {string} [placeholder] The HTML5 placeholder to appear beneath - the search box. - */ - placeholder: null, - - /** - @param {Object} options - @param {Backbone.Collection} options.collection - @param {string} [options.name] - @param {string} [options.value] - @param {string} [options.placeholder] - @param {function(Object): string} [options.template] - */ - initialize: function (options) { - ServerSideFilter.__super__.initialize.apply(this, arguments); - this.name = options.name || this.name; - this.value = options.value || this.value; - this.placeholder = options.placeholder || this.placeholder; - this.template = options.template || this.template; - - // Persist the query on pagination - var collection = this.collection, self = this; - if (Backbone.PageableCollection && - collection instanceof Backbone.PageableCollection && - collection.mode == "server") { - collection.queryParams[this.name] = function () { - return self.query() || null; - }; - } - }, - - /** - Event handler. Clear the search box and reset the internal search value. - */ - clearSearchBox: function() { - this.value = null; - this.searchBox().val(null); - this.showClearButtonMaybe(); - }, - - /** - Event handler. Show the clear button when the search box has text, hide - it otherwise. - */ - showClearButtonMaybe: function () { - var $clearButton = this.clearButton(); - var searchTerms = this.query(); - if (searchTerms) $clearButton.show(); - else $clearButton.hide(); - }, - - /** - Returns the search input box. - */ - searchBox: function () { - return this.$el.find("input[type=search]"); - }, - - /** - Returns the clear button. - */ - clearButton: function () { - return this.$el.find("a[data-backgrid-action=clear]"); - }, - - /** - Returns the current search query. - */ - query: function() { - this.value = this.searchBox().val(); - return this.value; - }, - - /** - Upon search form submission, this event handler constructs a query - parameter object and pass it to Collection#fetch for server-side - filtering. - - If the collection is a PageableCollection, searching will go back to the - first page. - */ - search: function (e) { - if (e) e.preventDefault(); - - var data = {}; - var query = this.query(); - if (query) data[this.name] = query; - - var collection = this.collection; - - // go back to the first page on search - if (Backbone.PageableCollection && - collection instanceof Backbone.PageableCollection) { - collection.getFirstPage({data: data, reset: true, fetch: true}); - } - else collection.fetch({data: data, reset: true}); - }, - - /** - Event handler for the clear button. Clears the search box and refetch the - collection. - - If the collection is a PageableCollection, clearing will go back to the - first page. - */ - clear: function (e) { - if (e) e.preventDefault(); - this.clearSearchBox(); - - var collection = this.collection; - - // go back to the first page on clear - if (Backbone.PageableCollection && - collection instanceof Backbone.PageableCollection) { - collection.getFirstPage({reset: true, fetch: true}); - } - else collection.fetch({reset: true}); - }, - - /** - Renders a search form with a text box, optionally with a placeholder and - a preset value if supplied during initialization. - */ - render: function () { - this.$el.empty().append(this.template({ - name: this.name, - placeholder: this.placeholder, - value: this.value - })); - this.showClearButtonMaybe(); - this.delegateEvents(); - return this; - } - - }); - - /** - ClientSideFilter is a search form widget that searches a collection for - model matches against a query on the client side. The exact matching - algorithm can be overriden by subclasses. - - @class Backgrid.Extension.ClientSideFilter - @extends Backgrid.Extension.ServerSideFilter - */ - var ClientSideFilter = exports.ClientSideFilter = Backgrid.Extension.ClientSideFilter = ServerSideFilter.extend({ - - /** @property */ - events: _.extend({}, ServerSideFilter.prototype.events, { - "click a[data-backgrid-action=clear]": function (e) { - e.preventDefault(); - this.clear(); - }, - "keydown input[type=search]": "search", - "submit": function (e) { - e.preventDefault(); - this.search(); - } - }), - - /** - @property {?Array.} [fields] A list of model field names to - search for matches. If null, all of the fields will be searched. - */ - fields: null, - - /** - @property [wait=149] The time in milliseconds to wait since the last - change to the search box's value before searching. This value can be - adjusted depending on how often the search box is used and how large the - search index is. - */ - wait: 149, - - /** - Debounces the #search and #clear methods and makes a copy of the given - collection for searching. - - @param {Object} options - @param {Backbone.Collection} options.collection - @param {string} [options.placeholder] - @param {string} [options.fields] - @param {string} [options.wait=149] - */ - initialize: function (options) { - ClientSideFilter.__super__.initialize.apply(this, arguments); - - this.fields = options.fields || this.fields; - this.wait = options.wait || this.wait; - - this._debounceMethods(["search", "clear"]); - - var collection = this.collection = this.collection.fullCollection || this.collection; - var shadowCollection = this.shadowCollection = collection.clone(); - - this.listenTo(collection, "add", function (model, collection, options) { - shadowCollection.add(model, options); - }); - this.listenTo(collection, "remove", function (model, collection, options) { - shadowCollection.remove(model, options); - }); - this.listenTo(collection, "sort", function (col) { - if (!this.query()) shadowCollection.reset(col.models); - }); - this.listenTo(collection, "reset", function (col, options) { - options = _.extend({reindex: true}, options || {}); - if (options.reindex && options.from == null && options.to == null) { - shadowCollection.reset(col.models); - } - }); - }, - - _debounceMethods: function (methodNames) { - if (_.isString(methodNames)) methodNames = [methodNames]; - - this.undelegateEvents(); - - for (var i = 0, l = methodNames.length; i < l; i++) { - var methodName = methodNames[i]; - var method = this[methodName]; - this[methodName] = _.debounce(method, this.wait); - } - - this.delegateEvents(); - }, - - /** - Constructs a Javascript regular expression object for #makeMatcher. - - This default implementation takes a query string and returns a Javascript - RegExp object that matches any of the words contained in the query string - case-insensitively. Override this method to return a different regular - expression matcher if this behavior is not desired. - - @param {string} query The search query in the search box. - @return {RegExp} A RegExp object to match against model #fields. - */ - makeRegExp: function (query) { - return new RegExp(query.trim().split(/\s+/).join("|"), "i"); - }, - - /** - This default implementation takes a query string and returns a matcher - function that looks for matches in the model's #fields or all of its - fields if #fields is null, for any of the words in the query - case-insensitively using the regular expression object returned from - #makeRegExp. - - Most of time, you'd want to override the regular expression used for - matching. If so, please refer to the #makeRegExp documentation, - otherwise, you can override this method to return a custom matching - function. - - Subclasses overriding this method must take care to conform to the - signature of the matcher function. The matcher function is a function - that takes a model as paramter and returns true if the model matches a - search, or false otherwise. - - In addition, when the matcher function is called, its context will be - bound to this ClientSideFilter object so it has access to the filter's - attributes and methods. - - @param {string} query The search query in the search box. - @return {function(Backbone.Model):boolean} A matching function. - */ - makeMatcher: function (query) { - var regexp = this.makeRegExp(query); - return function (model) { - var keys = this.fields || model.keys(); - for (var i = 0, l = keys.length; i < l; i++) { - if (regexp.test(model.get(keys[i]) + "")) return true; - } - return false; - }; - }, - - /** - Takes the query from the search box, constructs a matcher with it and - loops through collection looking for matches. Reset the given collection - when all the matches have been found. - - If the collection is a PageableCollection, searching will go back to the - first page. - */ - search: function () { - var matcher = _.bind(this.makeMatcher(this.query()), this); - var col = this.collection; - if (col.pageableCollection) col.pageableCollection.getFirstPage({silent: true}); - col.reset(this.shadowCollection.filter(matcher), {reindex: false}); - }, - - /** - Clears the search box and reset the collection to its original. - - If the collection is a PageableCollection, clearing will go back to the - first page. - */ - clear: function () { - this.clearSearchBox(); - var col = this.collection; - if (col.pageableCollection) col.pageableCollection.getFirstPage({silent: true}); - col.reset(this.shadowCollection.models, {reindex: false}); - } - - }); - - /** - LunrFilter is a ClientSideFilter that uses [lunrjs](http://lunrjs.com/) to - index the text fields of each model for a collection, and performs - full-text searching. - - @class Backgrid.Extension.LunrFilter - @extends Backgrid.Extension.ClientSideFilter - */ - var LunrFilter = exports.LunrFilter = Backgrid.Extension.LunrFilter = ClientSideFilter.extend({ - - /** - @property {string} [ref="id"]`lunrjs` document reference attribute name. - */ - ref: "id", - - /** - @property {Object} fields A hash of `lunrjs` index field names and boost - value. Unlike ClientSideFilter#fields, LunrFilter#fields is _required_ to - initialize the index. - */ - fields: null, - - /** - Indexes the underlying collection on construction. The index will refresh - when the underlying collection is reset. If any model is added, removed - or if any indexed fields of any models has changed, the index will be - updated. - - @param {Object} options - @param {Backbone.Collection} options.collection - @param {string} [options.placeholder] - @param {string} [options.ref] `lunrjs` document reference attribute name. - @param {Object} [options.fields] A hash of `lunrjs` index field names and - boost value. - @param {number} [options.wait] - */ - initialize: function (options) { - LunrFilter.__super__.initialize.apply(this, arguments); - - this.ref = options.ref || this.ref; - - var collection = this.collection = this.collection.fullCollection || this.collection; - this.listenTo(collection, "add", this.addToIndex); - this.listenTo(collection, "remove", this.removeFromIndex); - this.listenTo(collection, "reset", this.resetIndex); - this.listenTo(collection, "change", this.updateIndex); - - this.resetIndex(collection); - }, - - /** - Reindex the collection. If `options.reindex` is `false`, this method is a - no-op. - - @param {Backbone.Collection} collection - @param {Object} [options] - @param {boolean} [options.reindex=true] - */ - resetIndex: function (collection, options) { - options = _.extend({reindex: true}, options || {}); - - if (options.reindex) { - var self = this; - this.index = lunr(function () { - _.each(self.fields, function (boost, fieldName) { - this.field(fieldName, boost); - this.ref(self.ref); - }, this); - }); - - collection.each(function (model) { - this.addToIndex(model); - }, this); - } - }, - - /** - Adds the given model to the index. - - @param {Backbone.Model} model - */ - addToIndex: function (model) { - var index = this.index; - var doc = model.toJSON(); - if (index.documentStore.has(doc[this.ref])) index.update(doc); - else index.add(doc); - }, - - /** - Removes the given model from the index. - - @param {Backbone.Model} model - */ - removeFromIndex: function (model) { - var index = this.index; - var doc = model.toJSON(); - if (index.documentStore.has(doc[this.ref])) index.remove(doc); - }, - - /** - Updates the index for the given model. - - @param {Backbone.Model} model - */ - updateIndex: function (model) { - var changed = model.changedAttributes(); - if (changed && !_.isEmpty(_.intersection(_.keys(this.fields), - _.keys(changed)))) { - this.index.update(model.toJSON()); - } - }, - - /** - Takes the query from the search box and performs a full-text search on - the client-side. The search result is returned by resetting the - underlying collection to the models after interrogating the index for the - query answer. - - If the collection is a PageableCollection, searching will go back to the - first page. - */ - search: function () { - var col = this.collection; - if (!this.query()) { - col.reset(this.shadowCollection.models, {reindex: false}); - return; - } - - var searchResults = this.index.search(this.query()); - var models = []; - for (var i = 0; i < searchResults.length; i++) { - var result = searchResults[i]; - models.push(this.shadowCollection.get(result.ref)); - } - - if (col.pageableCollection) col.pageableCollection.getFirstPage({silent: true}); - col.reset(models, {reindex: false}); - } - - }); - - return exports; - -})); diff --git a/src/views/htmlcontent/scripts/backgrid-paginator.js b/src/views/htmlcontent/scripts/backgrid-paginator.js deleted file mode 100644 index cb14e33599..0000000000 --- a/src/views/htmlcontent/scripts/backgrid-paginator.js +++ /dev/null @@ -1,449 +0,0 @@ -/* - backgrid-paginator - http://github.com/wyuenho/backgrid - - Copyright (c) 2013 Jimmy Yuen Ho Wong and contributors - Licensed under the MIT @license. -*/ -(function (root, factory) { - - // CommonJS - if (typeof exports == "object") { - module.exports = factory(require("underscore"), - require("backbone"), - require("backgrid"), - require("backbone.paginator")); - } - // AMD. Register as an anonymous module. - else if (typeof define == "function" && define.amd) { - define(["underscore", "backbone", "backgrid", "backbone.paginator"], factory); - } - // Browser - else { - factory(root._, root.Backbone, root.Backgrid); - } - -}(this, function (_, Backbone, Backgrid) { - - "use strict"; - - /** - PageHandle is a class that renders the actual page handles and reacts to - click events for pagination. - - This class acts in two modes - control or discrete page handle modes. If - one of the `is*` flags is `true`, an instance of this class is under - control page handle mode. Setting a `pageIndex` to an instance of this - class under control mode has no effect and the correct page index will - always be inferred from the `is*` flag. Only one of the `is*` flags should - be set to `true` at a time. For example, an instance of this class cannot - simultaneously be a rewind control and a fast forward control. A `label` - and a `title` function or a string are required to be passed to the - constuctor under this mode. If a `title` function is provided, it __MUST__ - accept a hash parameter `data`, which contains a key `label`. Its result - will be used to render the generated anchor's title attribute. - - If all of the `is*` flags is set to `false`, which is the default, an - instance of this class will be in discrete page handle mode. An instance - under this mode requires the `pageIndex` to be passed from the constructor - as an option and it __MUST__ be a 0-based index of the list of page numbers - to render. The constuctor will normalize the base to the same base the - underlying PageableCollection collection instance uses. A `label` is not - required under this mode, which will default to the equivalent 1-based page - index calculated from `pageIndex` and the underlying PageableCollection - instance. A provided `label` will still be honored however. The `title` - parameter is also not required under this mode, in which case the default - `title` function will be used. You are encouraged to provide your own - `title` function however if you wish to localize the title strings. - - If this page handle represents the current page, an `active` class will be - placed on the root list element. - - If this page handle is at the border of the list of pages, a `disabled` - class will be placed on the root list element. - - Only page handles that are neither `active` nor `disabled` will respond to - click events and triggers pagination. - - @class Backgrid.Extension.PageHandle - */ - var PageHandle = Backgrid.Extension.PageHandle = Backbone.View.extend({ - - /** @property */ - tagName: "li", - - /** @property */ - events: { - "click a": "changePage" - }, - - /** - @property {string|function(Object.): string} title - The title to use for the `title` attribute of the generated page handle - anchor elements. It can be a string or a function that takes a `data` - parameter, which contains a mandatory `label` key which provides the - label value to be displayed. - */ - title: function (data) { - return 'Page ' + data.label; - }, - - /** - @property {boolean} isRewind Whether this handle represents a rewind - control - */ - isRewind: false, - - /** - @property {boolean} isBack Whether this handle represents a back - control - */ - isBack: false, - - /** - @property {boolean} isForward Whether this handle represents a forward - control - */ - isForward: false, - - /** - @property {boolean} isFastForward Whether this handle represents a fast - forward control - */ - isFastForward: false, - - /** - Initializer. - - @param {Object} options - @param {Backbone.Collection} options.collection - @param {number} pageIndex 0-based index of the page number this handle - handles. This parameter will be normalized to the base the underlying - PageableCollection uses. - @param {string} [options.label] If provided it is used to render the - anchor text, otherwise the normalized pageIndex will be used - instead. Required if any of the `is*` flags is set to `true`. - @param {string} [options.title] - @param {boolean} [options.isRewind=false] - @param {boolean} [options.isBack=false] - @param {boolean} [options.isForward=false] - @param {boolean} [options.isFastForward=false] - */ - initialize: function (options) { - var collection = this.collection; - var state = collection.state; - var currentPage = state.currentPage; - var firstPage = state.firstPage; - var lastPage = state.lastPage; - - _.extend(this, _.pick(options, - ["isRewind", "isBack", "isForward", "isFastForward"])); - - var pageIndex; - if (this.isRewind) pageIndex = firstPage; - else if (this.isBack) pageIndex = Math.max(firstPage, currentPage - 1); - else if (this.isForward) pageIndex = Math.min(lastPage, currentPage + 1); - else if (this.isFastForward) pageIndex = lastPage; - else { - pageIndex = +options.pageIndex; - pageIndex = (firstPage ? pageIndex + 1 : pageIndex); - } - this.pageIndex = pageIndex; - - this.label = (options.label || (firstPage ? pageIndex : pageIndex + 1)) + ''; - var title = options.title || this.title; - this.title = _.isFunction(title) ? title({label: this.label}) : title; - }, - - /** - Renders a clickable anchor element under a list item. - */ - render: function () { - this.$el.empty(); - var anchor = document.createElement("a"); - anchor.href = '#'; - if (this.title) anchor.title = this.title; - anchor.innerHTML = this.label; - this.el.appendChild(anchor); - - var collection = this.collection; - var state = collection.state; - var currentPage = state.currentPage; - var pageIndex = this.pageIndex; - - if (this.isRewind && currentPage == state.firstPage || - this.isBack && !collection.hasPreviousPage() || - this.isForward && !collection.hasNextPage() || - this.isFastForward && (currentPage == state.lastPage || state.totalPages < 1)) { - this.$el.addClass("disabled"); - } - else if (!(this.isRewind || - this.isBack || - this.isForward || - this.isFastForward) && - state.currentPage == pageIndex) { - this.$el.addClass("active"); - } - - this.delegateEvents(); - return this; - }, - - /** - jQuery click event handler. Goes to the page this PageHandle instance - represents. No-op if this page handle is currently active or disabled. - */ - changePage: function (e) { - e.preventDefault(); - var $el = this.$el, col = this.collection; - if (!$el.hasClass("active") && !$el.hasClass("disabled")) { - if (this.isRewind) col.getFirstPage({reset: true}); - else if (this.isBack) col.getPreviousPage({reset: true}); - else if (this.isForward) col.getNextPage({reset: true}); - else if (this.isFastForward) col.getLastPage({reset: true}); - else col.getPage(this.pageIndex, {reset: true}); - } - return this; - } - - }); - - /** - Paginator is a Backgrid extension that renders a series of configurable - pagination handles. This extension is best used for splitting a large data - set across multiple pages. If the number of pages is larger then a - threshold, which is set to 10 by default, the page handles are rendered - within a sliding window, plus the rewind, back, forward and fast forward - control handles. The individual control handles can be turned off. - - @class Backgrid.Extension.Paginator - */ - var Paginator = Backgrid.Extension.Paginator = Backbone.View.extend({ - - /** @property */ - className: "backgrid-paginator", - - /** @property */ - windowSize: 10, - - /** - @property {number} slideScale the number used by #slideHowMuch to scale - `windowSize` to yield the number of pages to slide. For example, the - default windowSize(10) * slideScale(0.5) yields 5, which means the window - will slide forward 5 pages as soon as you've reached page 6. The smaller - the scale factor the less pages to slide, and vice versa. - - Also See: - - - #slideMaybe - - #slideHowMuch - */ - slideScale: 0.5, - - /** - @property {Object.>} controls You can - disable specific control handles by setting the keys in question to - null. The defaults will be merged with your controls object, with your - changes taking precedent. - */ - controls: { - rewind: { - label: "《", - title: "First" - }, - back: { - label: "〈", - title: "Previous" - }, - forward: { - label: "〉", - title: "Next" - }, - fastForward: { - label: "》", - title: "Last" - } - }, - - /** @property */ - renderIndexedPageHandles: true, - - /** - @property renderMultiplePagesOnly. Determines if the paginator - should show in cases where the collection has more than one page. - Default is false for backwards compatibility. - */ - renderMultiplePagesOnly: false, - - /** - @property {Backgrid.Extension.PageHandle} pageHandle. The PageHandle - class to use for rendering individual handles - */ - pageHandle: PageHandle, - - /** @property */ - goBackFirstOnSort: true, - - /** - Initializer. - - @param {Object} options - @param {Backbone.Collection} options.collection - @param {boolean} [options.controls] - @param {boolean} [options.pageHandle=Backgrid.Extension.PageHandle] - @param {boolean} [options.goBackFirstOnSort=true] - @param {boolean} [options.renderMultiplePagesOnly=false] - */ - initialize: function (options) { - var self = this; - self.controls = _.defaults(options.controls || {}, self.controls, - Paginator.prototype.controls); - - _.extend(self, _.pick(options || {}, "windowSize", "pageHandle", - "slideScale", "goBackFirstOnSort", - "renderIndexedPageHandles", - "renderMultiplePagesOnly")); - - var col = self.collection; - self.listenTo(col, "add", self.render); - self.listenTo(col, "remove", self.render); - self.listenTo(col, "reset", self.render); - self.listenTo(col, "backgrid:sorted", function () { - if (self.goBackFirstOnSort && col.state.currentPage !== col.state.firstPage) col.getFirstPage({reset: true}); - }); - }, - - /** - Decides whether the window should slide. This method should return 1 if - sliding should occur and 0 otherwise. The default is sliding should occur - if half of the pages in a window has been reached. - - __Note__: All the parameters have been normalized to be 0-based. - - @param {number} firstPage - @param {number} lastPage - @param {number} currentPage - @param {number} windowSize - @param {number} slideScale - - @return {0|1} - */ - slideMaybe: function (firstPage, lastPage, currentPage, windowSize, slideScale) { - return Math.round(currentPage % windowSize / windowSize); - }, - - /** - Decides how many pages to slide when sliding should occur. The default - simply scales the `windowSize` to arrive at a fraction of the `windowSize` - to increment. - - __Note__: All the parameters have been normalized to be 0-based. - - @param {number} firstPage - @param {number} lastPage - @param {number} currentPage - @param {number} windowSize - @param {number} slideScale - - @return {number} - */ - slideThisMuch: function (firstPage, lastPage, currentPage, windowSize, slideScale) { - return ~~(windowSize * slideScale); - }, - - _calculateWindow: function () { - var collection = this.collection; - var state = collection.state; - - // convert all indices to 0-based here - var firstPage = state.firstPage; - var lastPage = +state.lastPage; - lastPage = Math.max(0, firstPage ? lastPage - 1 : lastPage); - var currentPage = Math.max(state.currentPage, state.firstPage); - currentPage = firstPage ? currentPage - 1 : currentPage; - var windowSize = this.windowSize; - var slideScale = this.slideScale; - var windowStart = Math.floor(currentPage / windowSize) * windowSize; - if (currentPage <= lastPage - this.slideThisMuch()) { - windowStart += (this.slideMaybe(firstPage, lastPage, currentPage, windowSize, slideScale) * - this.slideThisMuch(firstPage, lastPage, currentPage, windowSize, slideScale)); - } - var windowEnd = Math.min(lastPage + 1, windowStart + windowSize); - return [windowStart, windowEnd]; - }, - - /** - Creates a list of page handle objects for rendering. - - @return {Array.} an array of page handle objects hashes - */ - makeHandles: function () { - - var handles = []; - var collection = this.collection; - - var window = this._calculateWindow(); - var winStart = window[0], winEnd = window[1]; - - if (this.renderIndexedPageHandles) { - for (var i = winStart; i < winEnd; i++) { - handles.push(new this.pageHandle({ - collection: collection, - pageIndex: i - })); - } - } - - var controls = this.controls; - _.each(["back", "rewind", "forward", "fastForward"], function (key) { - var value = controls[key]; - if (value) { - var handleCtorOpts = { - collection: collection, - title: value.title, - label: value.label - }; - handleCtorOpts["is" + key.slice(0, 1).toUpperCase() + key.slice(1)] = true; - var handle = new this.pageHandle(handleCtorOpts); - if (key == "rewind" || key == "back") handles.unshift(handle); - else handles.push(handle); - } - }, this); - - return handles; - }, - - /** - Render the paginator handles inside an unordered list. - */ - render: function () { - this.$el.empty(); - - var totalPages = this.collection.state.totalPages; - - // Don't render if collection is empty - if(this.renderMultiplePagesOnly && totalPages <= 1) { - return this; - } - - if (this.handles) { - for (var i = 0, l = this.handles.length; i < l; i++) { - this.handles[i].remove(); - } - } - - var handles = this.handles = this.makeHandles(); - - var ul = document.createElement("ul"); - for (var i = 0; i < handles.length; i++) { - ul.appendChild(handles[i].render().el); - } - - this.el.appendChild(ul); - - return this; - } - - }); - -})); diff --git a/src/views/htmlcontent/scripts/backgrid.js b/src/views/htmlcontent/scripts/backgrid.js deleted file mode 100644 index c730fb6cf9..0000000000 --- a/src/views/htmlcontent/scripts/backgrid.js +++ /dev/null @@ -1,2930 +0,0 @@ -/*! - backgrid 0.3.7 - http://github.com/wyuenho/backgrid - - Copyright (c) 2016 Jimmy Yuen Ho Wong and contributors - Licensed under the MIT license. -*/ - -(function (root, factory) { - - if (typeof define === "function" && define.amd) { - // AMD (+ global for extensions) - define(["underscore", "backbone"], function (_, Backbone) { - return (root.Backgrid = factory(_, Backbone)); - }); - } else if (typeof exports === "object") { - // CommonJS - var Backbone = require("backbone"); - Backbone.$ = Backbone.$ || require("jquery"); - module.exports = factory(require("underscore"), Backbone); - } else { - // Browser - root.Backgrid = factory(root._, root.Backbone); - }}(this, function (_, Backbone) { - - "use strict"; - -/* - backgrid - http://github.com/wyuenho/backgrid - - Copyright (c) 2013 Jimmy Yuen Ho Wong and contributors - Licensed under the MIT license. -*/ - -// Copyright 2009, 2010 Kristopher Michael Kowal -// https://github.com/kriskowal/es5-shim -// ES5 15.5.4.20 -// http://es5.github.com/#x15.5.4.20 -var ws = "\x09\x0A\x0B\x0C\x0D\x20\xA0\u1680\u180E\u2000\u2001\u2002\u2003" + - "\u2004\u2005\u2006\u2007\u2008\u2009\u200A\u202F\u205F\u3000\u2028" + - "\u2029\uFEFF"; -if (!String.prototype.trim || ws.trim()) { - // http://blog.stevenlevithan.com/archives/faster-trim-javascript - // http://perfectionkills.com/whitespace-deviations/ - ws = "[" + ws + "]"; - var trimBeginRegexp = new RegExp("^" + ws + ws + "*"), - trimEndRegexp = new RegExp(ws + ws + "*$"); - String.prototype.trim = function trim() { - if (this === undefined || this === null) { - throw new TypeError("can't convert " + this + " to object"); - } - return String(this) - .replace(trimBeginRegexp, "") - .replace(trimEndRegexp, ""); - }; -} - -function lpad(str, length, padstr) { - var paddingLen = length - (str + '').length; - paddingLen = paddingLen < 0 ? 0 : paddingLen; - var padding = ''; - for (var i = 0; i < paddingLen; i++) { - padding = padding + padstr; - } - return padding + str; -} - -var $ = Backbone.$; - -var Backgrid = { - - Extension: {}, - - resolveNameToClass: function (name, suffix) { - if (_.isString(name)) { - var key = _.map(name.split('-'), function (e) { - return e.slice(0, 1).toUpperCase() + e.slice(1); - }).join('') + suffix; - var klass = Backgrid[key] || Backgrid.Extension[key]; - if (_.isUndefined(klass)) { - throw new ReferenceError("Class '" + key + "' not found"); - } - return klass; - } - - return name; - }, - - callByNeed: function () { - var value = arguments[0]; - if (!_.isFunction(value)) return value; - - var context = arguments[1]; - var args = [].slice.call(arguments, 2); - return value.apply(context, !!(args + '') ? args : []); - } - -}; -_.extend(Backgrid, Backbone.Events); - -/** - Command translates a DOM Event into commands that Backgrid - recognizes. Interested parties can listen on selected Backgrid events that - come with an instance of this class and act on the commands. - - It is also possible to globally rebind the keyboard shortcuts by replacing - the methods in this class' prototype. - - @class Backgrid.Command - @constructor - */ -var Command = Backgrid.Command = function (evt) { - _.extend(this, { - altKey: !!evt.altKey, - "char": evt["char"], - charCode: evt.charCode, - ctrlKey: !!evt.ctrlKey, - key: evt.key, - keyCode: evt.keyCode, - locale: evt.locale, - location: evt.location, - metaKey: !!evt.metaKey, - repeat: !!evt.repeat, - shiftKey: !!evt.shiftKey, - which: evt.which - }); -}; -_.extend(Command.prototype, { - /** - Up Arrow - - @member Backgrid.Command - */ - moveUp: function () { return this.keyCode == 38; }, - /** - Down Arrow - - @member Backgrid.Command - */ - moveDown: function () { return this.keyCode === 40; }, - /** - Shift Tab - - @member Backgrid.Command - */ - moveLeft: function () { return this.shiftKey && this.keyCode === 9; }, - /** - Tab - - @member Backgrid.Command - */ - moveRight: function () { return !this.shiftKey && this.keyCode === 9; }, - /** - Enter - - @member Backgrid.Command - */ - save: function () { return this.keyCode === 13; }, - /** - Esc - - @member Backgrid.Command - */ - cancel: function () { return this.keyCode === 27; }, - /** - None of the above. - - @member Backgrid.Command - */ - passThru: function () { - return !(this.moveUp() || this.moveDown() || this.moveLeft() || - this.moveRight() || this.save() || this.cancel()); - } -}); - -/* - backgrid - http://github.com/wyuenho/backgrid - - Copyright (c) 2013 Jimmy Yuen Ho Wong and contributors - Licensed under the MIT license. -*/ - -/** - Just a convenient class for interested parties to subclass. - - The default Cell classes don't require the formatter to be a subclass of - Formatter as long as the fromRaw(rawData) and toRaw(formattedData) methods - are defined. - - @abstract - @class Backgrid.CellFormatter - @constructor -*/ -var CellFormatter = Backgrid.CellFormatter = function () {}; -_.extend(CellFormatter.prototype, { - - /** - Takes a raw value from a model and returns an optionally formatted string - for display. The default implementation simply returns the supplied value - as is without any type conversion. - - @member Backgrid.CellFormatter - @param {*} rawData - @param {Backbone.Model} model Used for more complicated formatting - @return {*} - */ - fromRaw: function (rawData, model) { - return rawData; - }, - - /** - Takes a formatted string, usually from user input, and returns a - appropriately typed value for persistence in the model. - - If the user input is invalid or unable to be converted to a raw value - suitable for persistence in the model, toRaw must return `undefined`. - - @member Backgrid.CellFormatter - @param {string} formattedData - @param {Backbone.Model} model Used for more complicated formatting - @return {*|undefined} - */ - toRaw: function (formattedData, model) { - return formattedData; - } - -}); - -/** - A floating point number formatter. Doesn't understand scientific notation at - the moment. - - @class Backgrid.NumberFormatter - @extends Backgrid.CellFormatter - @constructor - @throws {RangeError} If decimals < 0 or > 20. -*/ -var NumberFormatter = Backgrid.NumberFormatter = function (options) { - _.extend(this, this.defaults, options || {}); - - if (this.decimals < 0 || this.decimals > 20) { - throw new RangeError("decimals must be between 0 and 20"); - } -}; -NumberFormatter.prototype = new CellFormatter(); -_.extend(NumberFormatter.prototype, { - - /** - @member Backgrid.NumberFormatter - @cfg {Object} options - - @cfg {number} [options.decimals=2] Number of decimals to display. Must be an integer. - - @cfg {string} [options.decimalSeparator='.'] The separator to use when - displaying decimals. - - @cfg {string} [options.orderSeparator=','] The separator to use to - separator thousands. May be an empty string. - */ - defaults: { - decimals: 2, - decimalSeparator: '.', - orderSeparator: ',' - }, - - HUMANIZED_NUM_RE: /(\d)(?=(?:\d{3})+$)/g, - - /** - Takes a floating point number and convert it to a formatted string where - every thousand is separated by `orderSeparator`, with a `decimal` number of - decimals separated by `decimalSeparator`. The number returned is rounded - the usual way. - - @member Backgrid.NumberFormatter - @param {number} number - @param {Backbone.Model} model Used for more complicated formatting - @return {string} - */ - fromRaw: function (number, model) { - if (_.isNull(number) || _.isUndefined(number)) return ''; - - number = parseFloat(number).toFixed(~~this.decimals); - - var parts = number.split('.'); - var integerPart = parts[0]; - var decimalPart = parts[1] ? (this.decimalSeparator || '.') + parts[1] : ''; - - return integerPart.replace(this.HUMANIZED_NUM_RE, '$1' + this.orderSeparator) + decimalPart; - }, - - /** - Takes a string, possibly formatted with `orderSeparator` and/or - `decimalSeparator`, and convert it back to a number. - - @member Backgrid.NumberFormatter - @param {string} formattedData - @param {Backbone.Model} model Used for more complicated formatting - @return {number|undefined} Undefined if the string cannot be converted to - a number. - */ - toRaw: function (formattedData, model) { - formattedData = formattedData.trim(); - - if (formattedData === '') return null; - - var rawData = ''; - - var thousands = formattedData.split(this.orderSeparator); - for (var i = 0; i < thousands.length; i++) { - rawData += thousands[i]; - } - - var decimalParts = rawData.split(this.decimalSeparator); - rawData = ''; - for (var i = 0; i < decimalParts.length; i++) { - rawData = rawData + decimalParts[i] + '.'; - } - - if (rawData[rawData.length - 1] === '.') { - rawData = rawData.slice(0, rawData.length - 1); - } - - var result = (rawData * 1).toFixed(~~this.decimals) * 1; - if (_.isNumber(result) && !_.isNaN(result)) return result; - } - -}); - -/** - A number formatter that converts a floating point number, optionally - multiplied by a multiplier, to a percentage string and vice versa. - - @class Backgrid.PercentFormatter - @extends Backgrid.NumberFormatter - @constructor - @throws {RangeError} If decimals < 0 or > 20. - */ -var PercentFormatter = Backgrid.PercentFormatter = function () { - Backgrid.NumberFormatter.apply(this, arguments); -}; - -PercentFormatter.prototype = new Backgrid.NumberFormatter(), - -_.extend(PercentFormatter.prototype, { - - /** - @member Backgrid.PercentFormatter - @cfg {Object} options - - @cfg {number} [options.multiplier=1] The number used to multiply the model - value for display. - - @cfg {string} [options.symbol='%'] The symbol to append to the percentage - string. - */ - defaults: _.extend({}, NumberFormatter.prototype.defaults, { - multiplier: 1, - symbol: "%" - }), - - /** - Takes a floating point number, where the number is first multiplied by - `multiplier`, then converted to a formatted string like - NumberFormatter#fromRaw, then finally append `symbol` to the end. - - @member Backgrid.PercentFormatter - @param {number} rawValue - @param {Backbone.Model} model Used for more complicated formatting - @return {string} - */ - fromRaw: function (number, model) { - var args = [].slice.call(arguments, 1); - args.unshift(number * this.multiplier); - return (NumberFormatter.prototype.fromRaw.apply(this, args) || "0") + this.symbol; - }, - - /** - Takes a string, possibly appended with `symbol` and/or `decimalSeparator`, - and convert it back to a number for the model like NumberFormatter#toRaw, - and then dividing it by `multiplier`. - - @member Backgrid.PercentFormatter - @param {string} formattedData - @param {Backbone.Model} model Used for more complicated formatting - @return {number|undefined} Undefined if the string cannot be converted to - a number. - */ - toRaw: function (formattedValue, model) { - var tokens = formattedValue.split(this.symbol); - if (tokens && tokens[0] && tokens[1] === "" || tokens[1] == null) { - var rawValue = NumberFormatter.prototype.toRaw.call(this, tokens[0]); - if (_.isUndefined(rawValue)) return rawValue; - return rawValue / this.multiplier; - } - } - -}); - -/** - Formatter to converts between various datetime formats. - - This class only understands ISO-8601 formatted datetime strings and UNIX - offset (number of milliseconds since UNIX Epoch). See - Backgrid.Extension.MomentFormatter if you need a much more flexible datetime - formatter. - - @class Backgrid.DatetimeFormatter - @extends Backgrid.CellFormatter - @constructor - @throws {Error} If both `includeDate` and `includeTime` are false. -*/ -var DatetimeFormatter = Backgrid.DatetimeFormatter = function (options) { - _.extend(this, this.defaults, options || {}); - - if (!this.includeDate && !this.includeTime) { - throw new Error("Either includeDate or includeTime must be true"); - } -}; -DatetimeFormatter.prototype = new CellFormatter(); -_.extend(DatetimeFormatter.prototype, { - - /** - @member Backgrid.DatetimeFormatter - - @cfg {Object} options - - @cfg {boolean} [options.includeDate=true] Whether the values include the - date part. - - @cfg {boolean} [options.includeTime=true] Whether the values include the - time part. - - @cfg {boolean} [options.includeMilli=false] If `includeTime` is true, - whether to include the millisecond part, if it exists. - */ - defaults: { - includeDate: true, - includeTime: true, - includeMilli: false - }, - - DATE_RE: /^([+\-]?\d{4})-(\d{2})-(\d{2})$/, - TIME_RE: /^(\d{2}):(\d{2}):(\d{2})(\.(\d{3}))?$/, - ISO_SPLITTER_RE: /T|Z| +/, - - _convert: function (data, validate) { - if ((data + '').trim() === '') return null; - - var date, time = null; - if (_.isNumber(data)) { - var jsDate = new Date(data); - date = lpad(jsDate.getUTCFullYear(), 4, 0) + '-' + lpad(jsDate.getUTCMonth() + 1, 2, 0) + '-' + lpad(jsDate.getUTCDate(), 2, 0); - time = lpad(jsDate.getUTCHours(), 2, 0) + ':' + lpad(jsDate.getUTCMinutes(), 2, 0) + ':' + lpad(jsDate.getUTCSeconds(), 2, 0); - } - else { - data = data.trim(); - var parts = data.split(this.ISO_SPLITTER_RE) || []; - date = this.DATE_RE.test(parts[0]) ? parts[0] : ''; - time = date && parts[1] ? parts[1] : this.TIME_RE.test(parts[0]) ? parts[0] : ''; - } - - var YYYYMMDD = this.DATE_RE.exec(date) || []; - var HHmmssSSS = this.TIME_RE.exec(time) || []; - - if (validate) { - if (this.includeDate && _.isUndefined(YYYYMMDD[0])) return; - if (this.includeTime && _.isUndefined(HHmmssSSS[0])) return; - if (!this.includeDate && date) return; - if (!this.includeTime && time) return; - } - - var jsDate = new Date(Date.UTC(YYYYMMDD[1] * 1 || 0, - YYYYMMDD[2] * 1 - 1 || 0, - YYYYMMDD[3] * 1 || 0, - HHmmssSSS[1] * 1 || null, - HHmmssSSS[2] * 1 || null, - HHmmssSSS[3] * 1 || null, - HHmmssSSS[5] * 1 || null)); - - var result = ''; - - if (this.includeDate) { - result = lpad(jsDate.getUTCFullYear(), 4, 0) + '-' + lpad(jsDate.getUTCMonth() + 1, 2, 0) + '-' + lpad(jsDate.getUTCDate(), 2, 0); - } - - if (this.includeTime) { - result = result + (this.includeDate ? 'T' : '') + lpad(jsDate.getUTCHours(), 2, 0) + ':' + lpad(jsDate.getUTCMinutes(), 2, 0) + ':' + lpad(jsDate.getUTCSeconds(), 2, 0); - - if (this.includeMilli) { - result = result + '.' + lpad(jsDate.getUTCMilliseconds(), 3, 0); - } - } - - if (this.includeDate && this.includeTime) { - result += "Z"; - } - - return result; - }, - - /** - Converts an ISO-8601 formatted datetime string to a datetime string, date - string or a time string. The timezone is ignored if supplied. - - @member Backgrid.DatetimeFormatter - @param {string} rawData - @param {Backbone.Model} model Used for more complicated formatting - @return {string|null|undefined} ISO-8601 string in UTC. Null and undefined - values are returned as is. - */ - fromRaw: function (rawData, model) { - if (_.isNull(rawData) || _.isUndefined(rawData)) return ''; - return this._convert(rawData); - }, - - /** - Converts an ISO-8601 formatted datetime string to a datetime string, date - string or a time string. The timezone is ignored if supplied. This method - parses the input values exactly the same way as - Backgrid.Extension.MomentFormatter#fromRaw(), in addition to doing some - sanity checks. - - @member Backgrid.DatetimeFormatter - @param {string} formattedData - @param {Backbone.Model} model Used for more complicated formatting - @return {string|undefined} ISO-8601 string in UTC. Undefined if a date is - found when `includeDate` is false, or a time is found when `includeTime` is - false, or if `includeDate` is true and a date is not found, or if - `includeTime` is true and a time is not found. - */ - toRaw: function (formattedData, model) { - return this._convert(formattedData, true); - } - -}); - -/** - Formatter to convert any value to string. - - @class Backgrid.StringFormatter - @extends Backgrid.CellFormatter - @constructor - */ -var StringFormatter = Backgrid.StringFormatter = function () {}; -StringFormatter.prototype = new CellFormatter(); -_.extend(StringFormatter.prototype, { - /** - Converts any value to a string using Ecmascript's implicit type - conversion. If the given value is `null` or `undefined`, an empty string is - returned instead. - - @member Backgrid.StringFormatter - @param {*} rawValue - @param {Backbone.Model} model Used for more complicated formatting - @return {string} - */ - fromRaw: function (rawValue, model) { - if (_.isUndefined(rawValue) || _.isNull(rawValue)) return ''; - return rawValue + ''; - } -}); - -/** - Simple email validation formatter. - - @class Backgrid.EmailFormatter - @extends Backgrid.CellFormatter - @constructor - */ -var EmailFormatter = Backgrid.EmailFormatter = function () {}; -EmailFormatter.prototype = new CellFormatter(); -_.extend(EmailFormatter.prototype, { - /** - Return the input if it is a string that contains an '@' character and if - the strings before and after '@' are non-empty. If the input does not - validate, `undefined` is returned. - - @member Backgrid.EmailFormatter - @param {*} formattedData - @param {Backbone.Model} model Used for more complicated formatting - @return {string|undefined} - */ - toRaw: function (formattedData, model) { - var parts = formattedData.trim().split("@"); - if (parts.length === 2 && _.all(parts)) { - return formattedData; - } - } -}); - -/** - Formatter for SelectCell. - - If the type of a model value is not a string, it is expected that a subclass - of this formatter is provided to the SelectCell, with #toRaw overridden to - convert the string value returned from the DOM back to whatever value is - expected in the model. - - @class Backgrid.SelectFormatter - @extends Backgrid.CellFormatter - @constructor -*/ -var SelectFormatter = Backgrid.SelectFormatter = function () {}; -SelectFormatter.prototype = new CellFormatter(); -_.extend(SelectFormatter.prototype, { - - /** - Normalizes raw scalar or array values to an array. - - @member Backgrid.SelectFormatter - @param {*} rawValue - @param {Backbone.Model} model Used for more complicated formatting - @return {Array.<*>} - */ - fromRaw: function (rawValue, model) { - return _.isArray(rawValue) ? rawValue : rawValue != null ? [rawValue] : []; - } -}); - -/* - backgrid - http://github.com/wyuenho/backgrid - - Copyright (c) 2013 Jimmy Yuen Ho Wong and contributors - Licensed under the MIT license. -*/ - -/** - Generic cell editor base class. Only defines an initializer for a number of - required parameters. - - @abstract - @class Backgrid.CellEditor - @extends Backbone.View -*/ -var CellEditor = Backgrid.CellEditor = Backbone.View.extend({ - - /** - Initializer. - - @param {Object} options - @param {Backgrid.CellFormatter} options.formatter - @param {Backgrid.Column} options.column - @param {Backbone.Model} options.model - - @throws {TypeError} If `formatter` is not a formatter instance, or when - `model` or `column` are undefined. - */ - initialize: function (options) { - this.formatter = options.formatter; - this.column = options.column; - if (!(this.column instanceof Column)) { - this.column = new Column(this.column); - } - - this.listenTo(this.model, "backgrid:editing", this.postRender); - }, - - /** - Post-rendering setup and initialization. Focuses the cell editor's `el` in - this default implementation. **Should** be called by Cell classes after - calling Backgrid.CellEditor#render. - */ - postRender: function (model, column) { - if (column == null || column.get("name") == this.column.get("name")) { - this.$el.focus(); - } - return this; - } - -}); - -/** - InputCellEditor the cell editor type used by most core cell types. This cell - editor renders a text input box as its editor. The input will render a - placeholder if the value is empty on supported browsers. - - @class Backgrid.InputCellEditor - @extends Backgrid.CellEditor -*/ -var InputCellEditor = Backgrid.InputCellEditor = CellEditor.extend({ - - /** @property */ - tagName: "input", - - /** @property */ - attributes: { - type: "text" - }, - - /** @property */ - events: { - "blur": "saveOrCancel", - "keydown": "saveOrCancel" - }, - - /** - Initializer. Removes this `el` from the DOM when a `done` event is - triggered. - - @param {Object} options - @param {Backgrid.CellFormatter} options.formatter - @param {Backgrid.Column} options.column - @param {Backbone.Model} options.model - @param {string} [options.placeholder] - */ - initialize: function (options) { - InputCellEditor.__super__.initialize.apply(this, arguments); - - if (options.placeholder) { - this.$el.attr("placeholder", options.placeholder); - } - }, - - /** - Renders a text input with the cell value formatted for display, if it - exists. - */ - render: function () { - var model = this.model; - this.$el.val(this.formatter.fromRaw(model.get(this.column.get("name")), model)); - return this; - }, - - /** - If the key pressed is `enter`, `tab`, `up`, or `down`, converts the value - in the editor to a raw value for saving into the model using the formatter. - - If the key pressed is `esc` the changes are undone. - - If the editor goes out of focus (`blur`) but the value is invalid, the - event is intercepted and cancelled so the cell remains in focus pending for - further action. The changes are saved otherwise. - - Triggers a Backbone `backgrid:edited` event from the model when successful, - and `backgrid:error` if the value cannot be converted. Classes listening to - the `error` event, usually the Cell classes, should respond appropriately, - usually by rendering some kind of error feedback. - - @param {Event} e - */ - saveOrCancel: function (e) { - - var formatter = this.formatter; - var model = this.model; - var column = this.column; - - var command = new Command(e); - var blurred = e.type === "blur"; - - if (command.moveUp() || command.moveDown() || command.moveLeft() || command.moveRight() || - command.save() || blurred) { - - e.preventDefault(); - e.stopPropagation(); - - var val = this.$el.val(); - var newValue = formatter.toRaw(val, model); - if (_.isUndefined(newValue)) { - model.trigger("backgrid:error", model, column, val); - } - else { - model.set(column.get("name"), newValue); - model.trigger("backgrid:edited", model, column, command); - } - } - // esc - else if (command.cancel()) { - // undo - e.stopPropagation(); - model.trigger("backgrid:edited", model, column, command); - } - }, - - postRender: function (model, column) { - if (column == null || column.get("name") == this.column.get("name")) { - // move the cursor to the end on firefox if text is right aligned - if (this.$el.css("text-align") === "right") { - var val = this.$el.val(); - this.$el.focus().val(null).val(val); - } - else this.$el.focus(); - } - return this; - } - -}); - -/** - The super-class for all Cell types. By default, this class renders a plain - table cell with the model value converted to a string using the - formatter. The table cell is clickable, upon which the cell will go into - editor mode, which is rendered by a Backgrid.InputCellEditor instance by - default. Upon encountering any formatting errors, this class will add an - `error` CSS class to the table cell. - - @abstract - @class Backgrid.Cell - @extends Backbone.View -*/ -var Cell = Backgrid.Cell = Backbone.View.extend({ - - /** @property */ - tagName: "td", - - /** - @property {Backgrid.CellFormatter|Object|string} [formatter=CellFormatter] - */ - formatter: CellFormatter, - - /** - @property {Backgrid.CellEditor} [editor=Backgrid.InputCellEditor] The - default editor for all cell instances of this class. This value must be a - class, it will be automatically instantiated upon entering edit mode. - - See Backgrid.CellEditor - */ - editor: InputCellEditor, - - /** @property */ - events: { - "click": "enterEditMode" - }, - - /** - Initializer. - - @param {Object} options - @param {Backbone.Model} options.model - @param {Backgrid.Column} options.column - - @throws {ReferenceError} If formatter is a string but a formatter class of - said name cannot be found in the Backgrid module. - */ - initialize: function (options) { - this.column = options.column; - if (!(this.column instanceof Column)) { - this.column = new Column(this.column); - } - - var column = this.column, model = this.model, $el = this.$el; - - var formatter = Backgrid.resolveNameToClass(column.get("formatter") || - this.formatter, "Formatter"); - - if (!_.isFunction(formatter.fromRaw) && !_.isFunction(formatter.toRaw)) { - formatter = new formatter(); - } - - this.formatter = formatter; - - this.editor = Backgrid.resolveNameToClass(this.editor, "CellEditor"); - - this.listenTo(model, "change:" + column.get("name"), function () { - if (!$el.hasClass("editor")) this.render(); - }); - - this.listenTo(model, "backgrid:error", this.renderError); - - this.listenTo(column, "change:editable change:sortable change:renderable", - function (column) { - var changed = column.changedAttributes(); - for (var key in changed) { - if (changed.hasOwnProperty(key)) { - $el.toggleClass(key, changed[key]); - } - } - }); - - this.updateStateClassesMaybe(); - }, - - updateStateClassesMaybe: function () { - var model = this.model; - var column = this.column; - var $el = this.$el; - $el.toggleClass("editable", Backgrid.callByNeed(column.editable(), column, model)); - $el.toggleClass("sortable", Backgrid.callByNeed(column.sortable(), column, model)); - $el.toggleClass("renderable", Backgrid.callByNeed(column.renderable(), column, model)); - }, - - /** - Render a text string in a table cell. The text is converted from the - model's raw value for this cell's column. - */ - render: function () { - var $el = this.$el; - $el.empty(); - var model = this.model; - var columnName = this.column.get("name"); - $el.text(this.formatter.fromRaw(model.get(columnName), model)); - $el.addClass(columnName); - this.updateStateClassesMaybe(); - this.delegateEvents(); - return this; - }, - - /** - If this column is editable, a new CellEditor instance is instantiated with - its required parameters. An `editor` CSS class is added to the cell upon - entering edit mode. - - This method triggers a Backbone `backgrid:edit` event from the model when - the cell is entering edit mode and an editor instance has been constructed, - but before it is rendered and inserted into the DOM. The cell and the - constructed cell editor instance are sent as event parameters when this - event is triggered. - - When this cell has finished switching to edit mode, a Backbone - `backgrid:editing` event is triggered from the model. The cell and the - constructed cell instance are also sent as parameters in the event. - - When the model triggers a `backgrid:error` event, it means the editor is - unable to convert the current user input to an apprpriate value for the - model's column, and an `error` CSS class is added to the cell accordingly. - */ - enterEditMode: function () { - var model = this.model; - var column = this.column; - - var editable = Backgrid.callByNeed(column.editable(), column, model); - if (editable) { - - this.currentEditor = new this.editor({ - column: this.column, - model: this.model, - formatter: this.formatter - }); - - model.trigger("backgrid:edit", model, column, this, this.currentEditor); - - // Need to redundantly undelegate events for Firefox - this.undelegateEvents(); - this.$el.empty(); - this.$el.append(this.currentEditor.$el); - this.currentEditor.render(); - this.$el.addClass("editor"); - - model.trigger("backgrid:editing", model, column, this, this.currentEditor); - } - }, - - /** - Put an `error` CSS class on the table cell. - */ - renderError: function (model, column) { - if (column == null || column.get("name") == this.column.get("name")) { - this.$el.addClass("error"); - } - }, - - /** - Removes the editor and re-render in display mode. - */ - exitEditMode: function () { - this.$el.removeClass("error"); - this.currentEditor.remove(); - this.stopListening(this.currentEditor); - delete this.currentEditor; - this.$el.removeClass("editor"); - this.render(); - }, - - /** - Clean up this cell. - - @chainable - */ - remove: function () { - if (this.currentEditor) { - this.currentEditor.remove.apply(this.currentEditor, arguments); - delete this.currentEditor; - } - return Cell.__super__.remove.apply(this, arguments); - } - -}); - -/** - StringCell displays HTML escaped strings and accepts anything typed in. - - @class Backgrid.StringCell - @extends Backgrid.Cell -*/ -var StringCell = Backgrid.StringCell = Cell.extend({ - - /** @property */ - className: "string-cell", - - formatter: StringFormatter - -}); - -/** - UriCell renders an HTML `` anchor for the value and accepts URIs as user - input values. No type conversion or URL validation is done by the formatter - of this cell. Users who need URL validation are encourage to subclass UriCell - to take advantage of the parsing capabilities of the HTMLAnchorElement - available on HTML5-capable browsers or using a third-party library like - [URI.js](https://github.com/medialize/URI.js). - - @class Backgrid.UriCell - @extends Backgrid.Cell -*/ -var UriCell = Backgrid.UriCell = Cell.extend({ - - /** @property */ - className: "uri-cell", - - /** - @property {string} [title] The title attribute of the generated anchor. It - uses the display value formatted by the `formatter.fromRaw` by default. - */ - title: null, - - /** - @property {string} [target="_blank"] The target attribute of the generated - anchor. - */ - target: "_blank", - - initialize: function (options) { - UriCell.__super__.initialize.apply(this, arguments); - this.title = options.title || this.title; - this.target = options.target || this.target; - }, - - render: function () { - this.$el.empty(); - var rawValue = this.model.get(this.column.get("name")); - var formattedValue = this.formatter.fromRaw(rawValue, this.model); - this.$el.append($("", { - tabIndex: -1, - href: rawValue, - title: this.title || formattedValue, - target: this.target - }).text(formattedValue)); - this.delegateEvents(); - return this; - } - -}); - -/** - Like Backgrid.UriCell, EmailCell renders an HTML `` anchor for the - value. The `href` in the anchor is prefixed with `mailto:`. EmailCell will - complain if the user enters a string that doesn't contain the `@` sign. - - @class Backgrid.EmailCell - @extends Backgrid.StringCell -*/ -var EmailCell = Backgrid.EmailCell = StringCell.extend({ - - /** @property */ - className: "email-cell", - - formatter: EmailFormatter, - - render: function () { - this.$el.empty(); - var model = this.model; - var formattedValue = this.formatter.fromRaw(model.get(this.column.get("name")), model); - this.$el.append($("", { - tabIndex: -1, - href: "mailto:" + formattedValue, - title: formattedValue - }).text(formattedValue)); - this.delegateEvents(); - return this; - } - -}); - -/** - NumberCell is a generic cell that renders all numbers. Numbers are formatted - using a Backgrid.NumberFormatter. - - @class Backgrid.NumberCell - @extends Backgrid.Cell -*/ -var NumberCell = Backgrid.NumberCell = Cell.extend({ - - /** @property */ - className: "number-cell", - - /** - @property {number} [decimals=2] Must be an integer. - */ - decimals: NumberFormatter.prototype.defaults.decimals, - - /** @property {string} [decimalSeparator='.'] */ - decimalSeparator: NumberFormatter.prototype.defaults.decimalSeparator, - - /** @property {string} [orderSeparator=','] */ - orderSeparator: NumberFormatter.prototype.defaults.orderSeparator, - - /** @property {Backgrid.CellFormatter} [formatter=Backgrid.NumberFormatter] */ - formatter: NumberFormatter, - - /** - Initializes this cell and the number formatter. - - @param {Object} options - @param {Backbone.Model} options.model - @param {Backgrid.Column} options.column - */ - initialize: function (options) { - NumberCell.__super__.initialize.apply(this, arguments); - var formatter = this.formatter; - formatter.decimals = this.decimals; - formatter.decimalSeparator = this.decimalSeparator; - formatter.orderSeparator = this.orderSeparator; - } - -}); - -/** - An IntegerCell is just a Backgrid.NumberCell with 0 decimals. If a floating - point number is supplied, the number is simply rounded the usual way when - displayed. - - @class Backgrid.IntegerCell - @extends Backgrid.NumberCell -*/ -var IntegerCell = Backgrid.IntegerCell = NumberCell.extend({ - - /** @property */ - className: "integer-cell", - - /** - @property {number} decimals Must be an integer. - */ - decimals: 0 -}); - -/** - A PercentCell is another Backgrid.NumberCell that takes a floating number, - optionally multiplied by a multiplier and display it as a percentage. - - @class Backgrid.PercentCell - @extends Backgrid.NumberCell - */ -var PercentCell = Backgrid.PercentCell = NumberCell.extend({ - - /** @property */ - className: "percent-cell", - - /** @property {number} [multiplier=1] */ - multiplier: PercentFormatter.prototype.defaults.multiplier, - - /** @property {string} [symbol='%'] */ - symbol: PercentFormatter.prototype.defaults.symbol, - - /** @property {Backgrid.CellFormatter} [formatter=Backgrid.PercentFormatter] */ - formatter: PercentFormatter, - - /** - Initializes this cell and the percent formatter. - - @param {Object} options - @param {Backbone.Model} options.model - @param {Backgrid.Column} options.column - */ - initialize: function () { - PercentCell.__super__.initialize.apply(this, arguments); - var formatter = this.formatter; - formatter.multiplier = this.multiplier; - formatter.symbol = this.symbol; - } - -}); - -/** - DatetimeCell is a basic cell that accepts datetime string values in RFC-2822 - or W3C's subset of ISO-8601 and displays them in ISO-8601 format. For a much - more sophisticated date time cell with better datetime formatting, take a - look at the Backgrid.Extension.MomentCell extension. - - @class Backgrid.DatetimeCell - @extends Backgrid.Cell - - See: - - - Backgrid.Extension.MomentCell - - Backgrid.DatetimeFormatter -*/ -var DatetimeCell = Backgrid.DatetimeCell = Cell.extend({ - - /** @property */ - className: "datetime-cell", - - /** - @property {boolean} [includeDate=true] - */ - includeDate: DatetimeFormatter.prototype.defaults.includeDate, - - /** - @property {boolean} [includeTime=true] - */ - includeTime: DatetimeFormatter.prototype.defaults.includeTime, - - /** - @property {boolean} [includeMilli=false] - */ - includeMilli: DatetimeFormatter.prototype.defaults.includeMilli, - - /** @property {Backgrid.CellFormatter} [formatter=Backgrid.DatetimeFormatter] */ - formatter: DatetimeFormatter, - - /** - Initializes this cell and the datetime formatter. - - @param {Object} options - @param {Backbone.Model} options.model - @param {Backgrid.Column} options.column - */ - initialize: function (options) { - DatetimeCell.__super__.initialize.apply(this, arguments); - var formatter = this.formatter; - formatter.includeDate = this.includeDate; - formatter.includeTime = this.includeTime; - formatter.includeMilli = this.includeMilli; - - var placeholder = this.includeDate ? "YYYY-MM-DD" : ""; - placeholder += (this.includeDate && this.includeTime) ? "T" : ""; - placeholder += this.includeTime ? "HH:mm:ss" : ""; - placeholder += (this.includeTime && this.includeMilli) ? ".SSS" : ""; - - this.editor = this.editor.extend({ - attributes: _.extend({}, this.editor.prototype.attributes, this.editor.attributes, { - placeholder: placeholder - }) - }); - } - -}); - -/** - DateCell is a Backgrid.DatetimeCell without the time part. - - @class Backgrid.DateCell - @extends Backgrid.DatetimeCell -*/ -var DateCell = Backgrid.DateCell = DatetimeCell.extend({ - - /** @property */ - className: "date-cell", - - /** @property */ - includeTime: false - -}); - -/** - TimeCell is a Backgrid.DatetimeCell without the date part. - - @class Backgrid.TimeCell - @extends Backgrid.DatetimeCell -*/ -var TimeCell = Backgrid.TimeCell = DatetimeCell.extend({ - - /** @property */ - className: "time-cell", - - /** @property */ - includeDate: false - -}); - -/** - BooleanCellEditor renders a checkbox as its editor. - - @class Backgrid.BooleanCellEditor - @extends Backgrid.CellEditor -*/ -var BooleanCellEditor = Backgrid.BooleanCellEditor = CellEditor.extend({ - - /** @property */ - tagName: "input", - - /** @property */ - attributes: { - tabIndex: -1, - type: "checkbox" - }, - - /** @property */ - events: { - "mousedown": function () { - this.mouseDown = true; - }, - "blur": "enterOrExitEditMode", - "mouseup": function () { - this.mouseDown = false; - }, - "change": "saveOrCancel", - "keydown": "saveOrCancel" - }, - - /** - Renders a checkbox and check it if the model value of this column is true, - uncheck otherwise. - */ - render: function () { - var model = this.model; - var val = this.formatter.fromRaw(model.get(this.column.get("name")), model); - this.$el.prop("checked", val); - return this; - }, - - /** - Event handler. Hack to deal with the case where `blur` is fired before - `change` and `click` on a checkbox. - */ - enterOrExitEditMode: function (e) { - if (!this.mouseDown) { - var model = this.model; - model.trigger("backgrid:edited", model, this.column, new Command(e)); - } - }, - - /** - Event handler. Save the value into the model if the event is `change` or - one of the keyboard navigation key presses. Exit edit mode without saving - if `escape` was pressed. - */ - saveOrCancel: function (e) { - var model = this.model; - var column = this.column; - var formatter = this.formatter; - var command = new Command(e); - // skip ahead to `change` when space is pressed - if (command.passThru() && e.type != "change") return true; - if (command.cancel()) { - e.stopPropagation(); - model.trigger("backgrid:edited", model, column, command); - } - - var $el = this.$el; - if (command.save() || command.moveLeft() || command.moveRight() || command.moveUp() || - command.moveDown()) { - e.preventDefault(); - e.stopPropagation(); - var val = formatter.toRaw($el.prop("checked"), model); - model.set(column.get("name"), val); - model.trigger("backgrid:edited", model, column, command); - } - else if (e.type == "change") { - var val = formatter.toRaw($el.prop("checked"), model); - model.set(column.get("name"), val); - $el.focus(); - } - } - -}); - -/** - BooleanCell renders a checkbox both during display mode and edit mode. The - checkbox is checked if the model value is true, unchecked otherwise. - - @class Backgrid.BooleanCell - @extends Backgrid.Cell -*/ -var BooleanCell = Backgrid.BooleanCell = Cell.extend({ - - /** @property */ - className: "boolean-cell", - - /** @property */ - editor: BooleanCellEditor, - - /** @property */ - events: { - "click": "enterEditMode" - }, - - /** - Renders a checkbox and check it if the model value of this column is true, - uncheck otherwise. - */ - render: function () { - this.$el.empty(); - var model = this.model, column = this.column; - var editable = Backgrid.callByNeed(column.editable(), column, model); - this.$el.append($("", { - tabIndex: -1, - type: "checkbox", - checked: this.formatter.fromRaw(model.get(column.get("name")), model), - disabled: !editable - })); - this.delegateEvents(); - return this; - } - -}); - -/** - SelectCellEditor renders an HTML `").data("column-id", columns[i].id); + columnCheckboxes.push($input); + + if (grid.getColumnIndex(columns[i].id) != null) { + $input.attr("checked", "checked"); + } + + $("
  • ").appendTo($menu); + $input = $("").data("option", "syncresize"); + $("AllAuto2550100"); + + $settings.find("a[data]").click(function (e) { + var pagesize = $(e.target).attr("data"); + if (pagesize != undefined) { + if (pagesize == -1) { + var vp = grid.getViewport(); + setPageSize(vp.bottom - vp.top); + } else { + setPageSize(parseInt(pagesize)); + } + } + }); + + var icon_prefix = ""; + + $(icon_prefix + "ui-icon-lightbulb" + icon_suffix) + .click(function () { + $(".slick-pager-settings-expanded").toggle() + }) + .appendTo($settings); + + $(icon_prefix + "ui-icon-seek-first" + icon_suffix) + .click(gotoFirst) + .appendTo($nav); + + $(icon_prefix + "ui-icon-seek-prev" + icon_suffix) + .click(gotoPrev) + .appendTo($nav); + + $(icon_prefix + "ui-icon-seek-next" + icon_suffix) + .click(gotoNext) + .appendTo($nav); + + $(icon_prefix + "ui-icon-seek-end" + icon_suffix) + .click(gotoLast) + .appendTo($nav); + + $container.find(".ui-icon-container") + .hover(function () { + $(this).toggleClass("ui-state-hover"); + }); + + $container.children().wrapAll("
    "); + } + + + function updatePager(pagingInfo) { + var state = getNavState(); + + $container.find(".slick-pager-nav span").removeClass("ui-state-disabled"); + if (!state.canGotoFirst) { + $container.find(".ui-icon-seek-first").addClass("ui-state-disabled"); + } + if (!state.canGotoLast) { + $container.find(".ui-icon-seek-end").addClass("ui-state-disabled"); + } + if (!state.canGotoNext) { + $container.find(".ui-icon-seek-next").addClass("ui-state-disabled"); + } + if (!state.canGotoPrev) { + $container.find(".ui-icon-seek-prev").addClass("ui-state-disabled"); + } + + if (pagingInfo.pageSize == 0) { + var totalRowsCount = dataView.getItems().length; + var visibleRowsCount = pagingInfo.totalRows; + if (visibleRowsCount < totalRowsCount) { + $status.text("Showing " + visibleRowsCount + " of " + totalRowsCount + " rows"); + } else { + $status.text("Showing all " + totalRowsCount + " rows"); + } + $status.text("Showing all " + pagingInfo.totalRows + " rows"); + } else { + $status.text("Showing page " + (pagingInfo.pageNum + 1) + " of " + pagingInfo.totalPages); + } + } + + init(); + } + + // Slick.Controls.Pager + $.extend(true, window, { Slick:{ Controls:{ Pager:SlickGridPager }}}); +})(jQuery); diff --git a/src/views/htmlcontent/src/app/libs/SlickGrid/css/smoothness/images/ui-bg_flat_0_aaaaaa_40x100.png b/src/views/htmlcontent/src/app/libs/SlickGrid/css/smoothness/images/ui-bg_flat_0_aaaaaa_40x100.png new file mode 100644 index 0000000000000000000000000000000000000000..5b5dab2ab7b1c50dea9cfe73dc5a269a92d2d4b4 GIT binary patch literal 180 zcmeAS@N?(olHy`uVBq!ia0vp^8bF-F!3HG1q!d*FscKIb$B>N1x91EQ4=4yQ7#`R^ z$vje}bP0l+XkK DSH>_4 literal 0 HcmV?d00001 diff --git a/src/views/htmlcontent/src/app/libs/SlickGrid/css/smoothness/images/ui-bg_flat_75_ffffff_40x100.png b/src/views/htmlcontent/src/app/libs/SlickGrid/css/smoothness/images/ui-bg_flat_75_ffffff_40x100.png new file mode 100644 index 0000000000000000000000000000000000000000..ac8b229af950c29356abf64a6c4aa894575445f0 GIT binary patch literal 178 zcmeAS@N?(olHy`uVBq!ia0vp^8bF-F!3HG1q!d*FsY*{5$B>N1x91EQ4=4yQYz+E8 zPo9&<{J;c_6SHRil>2s{Zw^OT)6@jj2u|u!(plXsM>LJD`vD!n;OXk;vd$@?2>^GI BH@yG= literal 0 HcmV?d00001 diff --git a/src/views/htmlcontent/src/app/libs/SlickGrid/css/smoothness/images/ui-bg_glass_55_fbf9ee_1x400.png b/src/views/htmlcontent/src/app/libs/SlickGrid/css/smoothness/images/ui-bg_glass_55_fbf9ee_1x400.png new file mode 100644 index 0000000000000000000000000000000000000000..ad3d6346e00f246102f72f2e026ed0491988b394 GIT binary patch literal 120 zcmeAS@N?(olHy`uVBq!ia0vp^j6gJjgAK^akKnour0hLi978O6-<~(*I$*%ybaDOn z{W;e!B}_MSUQoPXhYd^Y6RUoS1yepnPx`2Kz)7OXQG!!=-jY=F+d2OOy?#DnJ32>z UEim$g7SJdLPgg&ebxsLQ09~*s;{X5v literal 0 HcmV?d00001 diff --git a/src/views/htmlcontent/src/app/libs/SlickGrid/css/smoothness/images/ui-bg_glass_65_ffffff_1x400.png b/src/views/htmlcontent/src/app/libs/SlickGrid/css/smoothness/images/ui-bg_glass_65_ffffff_1x400.png new file mode 100644 index 0000000000000000000000000000000000000000..42ccba269b6e91bef12ad0fa18be651b5ef0ee68 GIT binary patch literal 105 zcmeAS@N?(olHy`uVBq!ia0vp^j6gJjgAK^akKnouqzpV=978O6-=0?FV^9z|eBtf= z|7WztIJ;WT>{+tN>ySr~=F{k$>;_x^_y?afmf9pRKH0)6?eSP?3s5hEr>mdKI;Vst E0O;M1& literal 0 HcmV?d00001 diff --git a/src/views/htmlcontent/src/app/libs/SlickGrid/css/smoothness/images/ui-bg_glass_75_dadada_1x400.png b/src/views/htmlcontent/src/app/libs/SlickGrid/css/smoothness/images/ui-bg_glass_75_dadada_1x400.png new file mode 100644 index 0000000000000000000000000000000000000000..5a46b47cb16631068aee9e0bd61269fc4e95e5cd GIT binary patch literal 111 zcmeAS@N?(olHy`uVBq!ia0vp^j6gJjgAK^akKnouq|7{B978O6lPf+wIa#m9#>Unb zm^4K~wN3Zq+uP{vDV26o)#~38k_!`W=^oo1w6ixmPC4R1b Tyd6G3lNdZ*{an^LB{Ts5`idse literal 0 HcmV?d00001 diff --git a/src/views/htmlcontent/src/app/libs/SlickGrid/css/smoothness/images/ui-bg_highlight-soft_75_cccccc_1x100.png b/src/views/htmlcontent/src/app/libs/SlickGrid/css/smoothness/images/ui-bg_highlight-soft_75_cccccc_1x100.png new file mode 100644 index 0000000000000000000000000000000000000000..7c9fa6c6edcfcdd3e5b77e6f547b719e6fc66e30 GIT binary patch literal 101 zcmeAS@N?(olHy`uVBq!ia0vp^j6j^i!3HGVb)pi0l#Zv1V~E7mPmYTG^FX}c% zlGE{DS1Q;~I7-6ze&TN@+F-xsI6sd%SwK#*O5K|pDRZqEy< zJg0Nd8F@!OxqElm`~U#piM22@u@8B<moyKE%ct`B(jysxK+1m?G)UyIFs1t0}L zemGR&?jGaM1YQblj?v&@0iXS#fi-VbR9zLEnHLP?xQ|=%Ihrc7^yPWR!tW$yH!zrw z#I2}_!JnT^(qk)VgJr`NGdPtT^dmQIZc%=6nTAyJDXk+^3}wUOilJuwq>s=T_!9V) zr1)DT6VQ2~rgd@!Jlrte3}}m~j}juCS`J4(d-5+e-3@EzzTJNCE2z)w(kJ90z*QE) zBtnV@4mM>jTrZZ*$01SnGov0&=A-JrX5Ge%Pce1Vj}=5YQqBD^W@n4KmFxxpFK`uH zP;(xKV+6VJ2|g+?_Lct7`uElL<&jzGS8Gfva2+=8A@#V+xsAj9|Dkg)vL5yhX@~B= zN2KZSAUD%QH`x>H+@Ou(D1~Pyv#0nc&$!1kI?IO01yw3jD0@80qvc?T*Nr8?-%rC8 z@5$|WY?Hqp`ixmEkzeJTz_`_wsSRi1%Zivd`#+T{Aib6-rf$}M8sz6v zb6ERbr-SniO2wbOv!M4)nb}6UVzoVZEh5kQWh_5x4rYy3c!871NeaM(_p=4(kbS6U#x<*k8Wg^KHs2ttCz<+pBxQ$Z zQMv;kVm5_fF_vH`Mzrq$Y&6u?j6~ftIV0Yg)Nw7JysIN_ z-_n*K_v1c&D}-1{NbBwS2h#m1y0a5RiEcYil+58$8IDh49bPnzE7R8In6P%V{2IZU z7#clr=V4yyrRe@oXNqbqo^^LvlLE?%8XaI&N(Np90-psU}7kqmbWk zZ;YBwJNnNs$~d!mx9oMGyT( znaBoj0d}gpQ^aRr?6nW)$4god*`@Uh2e+YpS@0(Mw{|z|6ko3NbTvDiCu3YO+)egL z>uW(^ahKFj>iJ-JF!^KhKQyPTznJa;xyHYwxJgr16&Wid_9)-%*mEwo{B_|M9t@S1 zf@T@q?b2Qgl!~_(Roe;fdK)y|XG0;ls;ZbT)w-aOVttk#daQcY7$cpY496H*`m@+L zeP#$&yRbBjFWv}B)|5-1v=(66M_;V1SWv6MHnO}}1=vby&9l+gaP?|pXwp0AFDe#L z&MRJ^*qX6wgxhA_`*o=LGZ>G_NTX%AKHPz4bO^R72ZYK}ale3lffDgM8H!Wrw{B7A z{?c_|dh2J*y8b04c37OmqUw;#;G<* z@nz@dV`;7&^$)e!B}cd5tl0{g(Q>5_7H^@bEJi7;fQ4B$NGZerH#Ae1#8WDTH`iB&) zC6Et3BYY#mcJxh&)b2C^{aLq~psFN)Q1SucCaBaBUr%5PYX{~-q{KGEh)*;n;?75k z=hq%i^I}rd;z-#YyI`8-OfMpWz5kgJE3I!3ean6=UZi!BxG7i(YBk? z02HM7wS0)Wni{dWbQMRtd-A)_Az!t>F;IwWf~!*)-Az4}yryNkz&9)w>ElA80Oc`6 zHo#9H!Y3*Qx9n@Jn)!w6G^hb;e_n8zpIyXCN`JFkPc)^Q?2MsLNFhMgrcZI-<#1ne zjH;KFf?4eAT9mQZ}ZfHLGA#d%s;SZK4p0FwZT2S^{ zQ2BG1xJsbK6?yrHTjJi|5C0u=!|r!?*4FL%y%3q#(d+e>b_2I9!*iI!30}42Ia0bq zUf`Z?LGSEvtz8s``Tg5o_CP(FbR0X$FlE0yCnB7suDPmI2=yOg^*2#cY9o`X z;NY-3VBHZjnVcGS){GZ98{e+lq~O$u6pEcgd0CrnIsWffN1MbCZDH<7c^hv+Z0Ucf0{w zSzi^qKuUHD9Dgp0EAGg@@$zr32dQx>N=ws`MESEsmzgT2&L;?MSTo&ky&!-JR3g~1 zPGTt515X)wr+Bx(G9lWd;@Y3^Vl}50Wb&6-Tiy;HPS0drF`rC}qYq22K4)G#AoD0X zYw$E+Bz@Zr^50MAwu@$?%f9$r4WHH?*2|67&FXFhXBrVFGmg)6?h3^-1?t;UzH0*I zNVf9wQLNLnG2@q>6CGm>&y|lC`iCFfYd}9i%+xkl^5oBJ?<;aneCfcHqJh7Yl5uLS z9Fx-(kMdcNyZejXh22N{mCw_rX1O!cOE&3>e(ZH81PR95wQC37En4O{w;{3q9n1t&;p)D%&Z%Nw$gSPa!nz8Slh7=ko2am)XARwOWw zpsz0~K!s{(dM$NB=(A=kkp>T(*yU6<_dwIx>cH4+LWl282hXa6-EUq>R3t?G2623< z*RwTN%-fgBmD{fu*ejNn)1@KG?Sg*8z3hYtkQJQjB6 zQ|x>wA=o$=O)+nLmgTXW3_6diA;b4EY{*i*R%6dO2EMg z@6g?M3rpbnfB@hOdUeb96=~I?OIA3@BWAGmTwiQ{x5Cqq<8c10L!P zd@Qk^BseTX%$Q7^s}5n%HB|)gKx}H$d8Sb$bBnq9-AglT2dGR2(+I;_fL|R4p$odJ zllfb0NqI)7=^z~qAm1V{(PkpxXsQ#4*NH9yYZ`Vf@)?#ueGgtCmGGY|9U#v|hRdg- zQ%0#cGIfXCd{Y)JB~qykO;KPvHu|5Ck&(Hn%DF~cct@}j+87xhs2ew;fLm5#2+mb| z8{9e*YI(u|gt|{x1G+U=DA3y)9s2w7@cvQ($ZJIA)x$e~5_3LKFV~ASci8W}jF&VeJoPDUy(BB>ExJpck;%;!`0AAo zAcHgcnT8%OX&UW_n|%{2B|<6Wp2MMGvd5`T2KKv;ltt_~H+w00x6+SlAD`{K4!9zx z*1?EpQ%Lwiik){3n{-+YNrT;fH_niD_Ng9|58@m8RsKFVF!6pk@qxa{BH-&8tsim0 zdAQ(GyC^9ane7_KW*#^vMIoeQdpJqmPp%%px3GIftbwESu#+vPyI*YTuJ6+4`z{s? zpkv~0x4c_PFH`-tqafw5)>4AuQ78SkZ!$8}INLK;Egr;2tS18hEO5=t;QDmZ-qu?I zG+=DN`nR72Xto{{bJp||`k}-2G;5#xg8E~xgz22)^_Z;=K|4@(E&5J)SY2of=olcw z5)@L)_Ntcm!*5nEy0M9v0`S33;pO4TN;>4(Z+19p_0>u#e-vE zXCU(6gAvu~I7Cw(xd%0e59MNLw^U37ZDbsBrj%eDCexw8a3G`nTcXVNL6{B7Hj@i& zbVB{;ApEtHk76q08DJ48dSxd$C(;$K6=FpU<~l9pVoT9arW^Vu{%Bcn4`eIpkOVC| z$)AKYG_`ypM{0@BUb3^9lqi_c?ONH|4UJMJWDowMVjacycX7}9g={O7swOB+{;+?; zjBo!9?+nd)ie#x5IbFW-zBOo0c4q@9wGVt5;pNt`=-~Zgcw#*`m($6ibxtZ`H=e=} zF#GZ~5$%AUn};8U#tRem0J(JTR}d4vR(dgK2ML~lZsPhayJ2h1%sD4FVst| zKF)+@`iNzLRjg4=K8@**0=5cE>%?FDc({I^+g9USk<8$&^qD~@%W0i4b|yMG*p4`N zh}I!ltTRI8Ex$+@V{02Br%xq#O?UlhO{r8WsaZnZCZq0MK9%AXU%MDLT;3=0A9(BV z9VxxxJd7jo$hw3q;3o?yBLmA=azBUrd9>-<_ANs0n3?-Ic*6&ytb@H~?0E(*d>T5n z-HiH2jsDf6uWhID%#n>SzOqrFCPDfUcu5QPd?<(=w6pv1BE#nsxS{n!UnC9qAha1< z;3cpZ9A-e$+Y)%b;w@!!YRA9p%Kf9IHGGg^{+p`mh;q8i7}&e@V3EQaMsItEMS&=X plT@$;k0WcB_jb;cn%_Idz4HO$QU*abf4}+wi?e96N>fbq{{i|W0@(ln literal 0 HcmV?d00001 diff --git a/src/views/htmlcontent/src/app/libs/SlickGrid/css/smoothness/images/ui-icons_2e83ff_256x240.png b/src/views/htmlcontent/src/app/libs/SlickGrid/css/smoothness/images/ui-icons_2e83ff_256x240.png new file mode 100644 index 0000000000000000000000000000000000000000..09d1cdc856c292c4ab6dd818c7543ac0828bd616 GIT binary patch literal 4369 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 literal 0 HcmV?d00001 diff --git a/src/views/htmlcontent/src/app/libs/SlickGrid/css/smoothness/images/ui-icons_454545_256x240.png b/src/views/htmlcontent/src/app/libs/SlickGrid/css/smoothness/images/ui-icons_454545_256x240.png new file mode 100644 index 0000000000000000000000000000000000000000..59bd45b907c4fd965697774ce8c5fc6b2fd9c105 GIT binary patch literal 4369 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 oBo%DI*Kv;w;*%(i9W@f3_WCF#rGn literal 0 HcmV?d00001 diff --git a/src/views/htmlcontent/src/app/libs/SlickGrid/css/smoothness/images/ui-icons_cd0a0a_256x240.png b/src/views/htmlcontent/src/app/libs/SlickGrid/css/smoothness/images/ui-icons_cd0a0a_256x240.png new file mode 100644 index 0000000000000000000000000000000000000000..2ab019b73ec11a485fa09378f3a0e155194f6a5d GIT binary patch literal 4369 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 Yaq4(_7$y}LDRLkb2QUy25)=slJ8Q{ByZ`_I literal 0 HcmV?d00001 diff --git a/src/views/htmlcontent/src/app/libs/SlickGrid/images/ajax-loader-small.gif b/src/views/htmlcontent/src/app/libs/SlickGrid/images/ajax-loader-small.gif new file mode 100644 index 0000000000000000000000000000000000000000..5b33f7e54f4e55b6b8774d86d96895db9af044b4 GIT binary patch literal 1849 zcma*odr(tX9tZI2z31lM+(&YVk%mZ}5P~KlG2s=WSbGzm0!x7^P##Mnh7t-jP!X0Q zk_SQ}Po-L1tlDK;6l?(>v)e5ZBQx4|Y-Q?nr@Px3?9h(3ZWr3^tj=`TP57gKr87N$ zp2wWee1GRRCwo_xahnw)5cxNPJbCg2L6DV|6`#+yw6v6!mDS$f9-JvFD^n;GQ&UrZ zzh5jCkByB101O60U0q#p_1BM>Cv-vP?&s4@g_((4_1L=L$(a91)0=J91Gas#R{McE znYG^9*0A5YZ>#;~+Wkn(W5B0^yELIYLP!K}mB~<)AM@1&nqekynuaEGqPrzoH|KodRXJy)%+w_fu3nE5>@Bd_b zqC$EQ;{c`T&?EsNO|igL9gC7Ygxv?aQUEXMq?~>wg{EyW;VcJ37CUF#HjrT=KQO_* zS>M9yydXk18D(+QDJ1>r);Lav_uYKp$T?4vr{Q$lTo&pKv^?(>L-)G2*lwH!Ah7k? z7oH<8h-(KTKt5V6$8gF)C7Io&P5=SjTh)=zV=E2EUhQZP##L8S{d%UK>>+y82>+FV+#^BzW7u3F)Bb>=lYQ%%j`F>ASe zo*cw@V#u6T`A2He;70mR(V&iV&-7{qP~=SRf&jm9-T{*ZeZ}$rd0#6c&fLG^xJcf5 z+p<`wJYgW+_s*V{uI$nMB;%8`S_3>PfGOj3Rq}@Cx^+j?rk92fANSFDBYnOqQ>Vdj z)(|$AhP4t&Lb=Gvo2#3Gl%9<=Gv`Mz?Po@P4iLF!x}GUWJICDlFk-hS^Whyh7x~VH z@0vD1>HYD4&e+~yzS*-sFR{9`{QEEZO1zg7>R&7cHts-6j!xHVdA8eI+ZlVzd%`es zJT@$#GX(gvCJ1oJN%yLBK}{V=V;seo;!w|Yte!W1%5qLNFWqvZW>h&IiH+oPT=b@E zPhGzv5=(Un*X>v`>%8h_nj^NdYcE6NHS_ifkCV$*D)Tqrbu`s;<=t<4 zAHNqNV?6(g<1PY-w@#I-WYFViz?9TrkMr)u0g`O`u|>T;k|2sV*YF^punvT;$SuTy{j3Gv)yqD!R_CF>yR)MzmmYS5v+~R zXAdD%ng9?df;wd8GxR#%3O+gz};Vo;)sK%Bj-q>Oq%R7JU-KD?vYu>#2UjaDo z&8$>5xW~?KPD_#XFToU1hIb*VOMidUr6iYiO0N|i-7s`T8!cFT`rN!^1Pt78J93i6 z5HI1wIM$94m{3SLDvISDe6$ZG1;eq_D9RTaaC>=cO{@Bs>$IlPCPJJ$h$)-3vzNUQ6OsN#_zWxey!_9%hxwH2_dEJi=yY|1c7nDm2_Lm!Cof8-R_+9UkS zcBE(o47yE)oMR(Q=dp1a2wTX5KvvGyLqlWTa7V&!A*|w|)ax~1_~aJ0=_Lilg*0iQk7#ZD EAHN$8j{pDw literal 0 HcmV?d00001 diff --git a/src/views/htmlcontent/src/app/libs/SlickGrid/images/arrow_redo.png b/src/views/htmlcontent/src/app/libs/SlickGrid/images/arrow_redo.png new file mode 100644 index 0000000000000000000000000000000000000000..4f7f55d6f2f41754d868fe3ffb85212b57d939ce GIT binary patch literal 572 zcmV-C0>k}@P)NJfvOJ_l;h3;paDW_*7b%<&cRZj{sffO2Rl5h%hh1`v?3y*u&33Na0JSeF* zS=E%TtxTZ0yc+RX9Et?F!(Ct`n20yoX=Fdn4LrH@qCXA*UE}9cF7Mr+IFN3r-h*Wp z5ev#d7qogj(pqmu&{zQgaR3mNNp5dS*H`TZod`)}Kfgo%Qyyy;jA-1Ige1((=Y}V) zyu4g0(6Mt{4T`n|$ua(Rd_mOc$l0-rr3-5xJUlJq)I|Se*SZu)wN;i^AwUd;F9p!J z;qyugylckurL#By&vbP0_981efn4O!8Em+9GSMOgxn90uI+t=?X{w%KSLxQ=W zNZ=|^qBcjl{o0`vO&O9MGPRMalPM+&lH>R7a^!B!2O9*oQojI+$7t(~S^v8L0000< KMNUMnLSTZd%K~Ho literal 0 HcmV?d00001 diff --git a/src/views/htmlcontent/src/app/libs/SlickGrid/images/arrow_right_peppermint.png b/src/views/htmlcontent/src/app/libs/SlickGrid/images/arrow_right_peppermint.png new file mode 100644 index 0000000000000000000000000000000000000000..87225678667a823d75f5e3212c373ae39f909386 GIT binary patch literal 128 zcmeAS@N?(olHy`uVBq!ia0vp^+#t-s1|(OmDOUqh?w&4=ArhC9fBgS%&%9B>c|ld3 zfw*RuJ)53N+g?6V%;4+AGwtA31YGgH1C<`IzMQjhaW6&S-tHKv^^B bLn6cdCt=3@AFg}=8p+`4>gTe~DWM4f6ACMK literal 0 HcmV?d00001 diff --git a/src/views/htmlcontent/src/app/libs/SlickGrid/images/arrow_right_spearmint.png b/src/views/htmlcontent/src/app/libs/SlickGrid/images/arrow_right_spearmint.png new file mode 100644 index 0000000000000000000000000000000000000000..277ddde3848ebd8322c3d1d047314faee841078e GIT binary patch literal 128 zcmeAS@N?(olHy`uVBq!ia0vp^+#t-s1|(OmDOUqh?w&4=ArhC9fBgS%&%9B>IpO@` zD!m|)dZr|~B+>uukMeJrJP6{se88{gQN6<-zK)rlfjmJc+h%=f|9dwf(9%g4aS)WM)q*I}2pNLl&_yaJNO5p*5tmXOS`@)TClx^? zLr~D*BBB<=EKauh#M)qKk?`3{Am-k4pF>GBRXIdnXwgxf;#;tS zH}7Viy}J7L_=a4_pDT=tXs*0eMhG6Zb#y>P_pYHDXy{EbBG3MHYY5F=D{ zeGXJ~T12ydf(OP9Oh{cbU6C$SrHV>WfeMQ)OU&LIx)tk;533RC=7@m1pT$}?%3r<-J$Ez&e(l@%_gtJbL)NP)2Fa&r_Le z5{PJBRUsxY2hb5_gc@OvsMTs%305(;?8Be+^HdxEFy)t9l6d0g(aBgOdQoYZU-$%- zUpY|aS1OBC7D(o1r#?2L4Ch?42gdeK_g~xh{`c9xy2S;l>xhaz_@CeS6BGG`lIj)Z Q?EnA(07*qoM6N<$f+QpeF#rGn literal 0 HcmV?d00001 diff --git a/src/views/htmlcontent/src/app/libs/SlickGrid/images/bullet_blue.png b/src/views/htmlcontent/src/app/libs/SlickGrid/images/bullet_blue.png new file mode 100644 index 0000000000000000000000000000000000000000..79d978c36a5bd95d9a255d96a06970f2ca7e98d7 GIT binary patch literal 241 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`J3L(+Lo80eowS?tPymB#f0Bd1 zl|x=GF$dzpPjn??PjdhN%8Sz+w@DVg~unR@e6pyL@H@@U)!y% p@iLf0V7f$QuN~L__?>nSc&BIwO{&S)mjU{L!PC{xWt~$(695MMT*?3d literal 0 HcmV?d00001 diff --git a/src/views/htmlcontent/src/app/libs/SlickGrid/images/bullet_star.png b/src/views/htmlcontent/src/app/libs/SlickGrid/images/bullet_star.png new file mode 100644 index 0000000000000000000000000000000000000000..142ea482a527acce8042adbb0e42f19a083b677f GIT binary patch literal 279 zcmV+y0qFjTP)!4VR90UF@T9gOGS^q(7QZ-)!X?pU+0f>#k27ttf(%9D4@PEOAqW^~u zMg9N(KNyJZ{~tNx3=~WL-_}-(-yo1pXU`@AHAMn(CJ@g8;&vc50b&uLoH>5)fJ|?0 zZv21ah7V9fHW1GN;!Ys80E%h=lp=GiDS6HR(Y$mjf|BP%MYIzyvB;KaSZ z|G)pW|LOl<|F!??-|Kcgc<+DvgMw@II$YZrRIfEXT=-vjgJuNtl!gZ9|F<`4M)agO z*_yF#o^U6i&G%qSY3%>#hAQp<)Bl{0H#bo9+{VOkVzPWyu<80%pk)l6u6{1-oD!M< D81X<* literal 0 HcmV?d00001 diff --git a/src/views/htmlcontent/src/app/libs/SlickGrid/images/bullet_toggle_plus.png b/src/views/htmlcontent/src/app/libs/SlickGrid/images/bullet_toggle_plus.png new file mode 100644 index 0000000000000000000000000000000000000000..a96505342397eca5b40c767dfaba1422f5fc8cce GIT binary patch literal 156 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!60wlNoGJgf6l097;KaSZ z|G)pW|LOl<|F!??-|Kcgc<+DvgMw@II$YZrRImN}&wr%-pZ|en3A_PJOniUyk1tCw zoW%L{hR7MGB4)@S9f&o11MQ?xO!cw>Iaru@>)1r=M0E4P+ZZ7mII zIULeKgDU;7-PP>>t`%1~&E2Rss zmoK_ev+zRIlAE$=f(b?AOC-O$p6(*{}&|uUzqrRQPTg#DgT!MQR@E+qCNbq%HSb);wrm_poFAqn?eAdp14k-|}?A)@PHqKcBko;gs#qr|o(M^svF)$&Z_>+Z^f#E-c4#;{?o?zg3!SJ6`#$&^S1A0Mo zOd^|}cuZ7utZDF2x^QZKw}f%r8-))i=S!QW?1-3n$c0l#`Co>>jVJxRayDfzPBbdB z@d(x%aio0O$kr>VAGIN%@zD`^9;T^(W-@hfEzoLM$MA{iMIURU+pmy=lUPqr(`R8} zQ7}$#a!{(>!NA06dGg`n cVfH2m1!<$04Gs?(n;)OBm5A{(P++hI0EaJh%K!iX literal 0 HcmV?d00001 diff --git a/src/views/htmlcontent/src/app/libs/SlickGrid/images/collapse.gif b/src/views/htmlcontent/src/app/libs/SlickGrid/images/collapse.gif new file mode 100644 index 0000000000000000000000000000000000000000..01e691450c48632dc92a40a8c2b509bf99987225 GIT binary patch literal 846 zcmZ?wbhEHb$FyaIl$)g-gQVfI}k_i-?$k!^A~S3=)P?0Tm31hZvXy UI%HM~I5JIC=Ul}jAi!V^09i~Z*8l(j literal 0 HcmV?d00001 diff --git a/src/views/htmlcontent/src/app/libs/SlickGrid/images/comment_yellow.gif b/src/views/htmlcontent/src/app/libs/SlickGrid/images/comment_yellow.gif new file mode 100644 index 0000000000000000000000000000000000000000..df7158a47713eaba957b506048235a44ea204b7e GIT binary patch literal 257 zcmV+c0sj6+Nk%w1VGsZi0K@S*iEN$I#V?9xjA@}>Xoga7rz|MtxP@t*(f zd;jyT|Ma^5_}BT?cIUw`|L>9O(^dcLa{u(R|L~Uo`Rwb_Gym_4@6JNjmm=$!66@0} z+@UAy$58+O|NsC0A^8LW0018VEC2ui01yBW000Gk;3tk`NqT6imL3tk1c6!B=8c}C zdO&j^2-_#;K`Hn@mvv4FO#mmc9hm?C literal 0 HcmV?d00001 diff --git a/src/views/htmlcontent/src/app/libs/SlickGrid/images/editor-helper-bg.gif b/src/views/htmlcontent/src/app/libs/SlickGrid/images/editor-helper-bg.gif new file mode 100644 index 0000000000000000000000000000000000000000..2daa973bc525c83872e4a0357b756727ca7eaa49 GIT binary patch literal 1164 zcmZ?wbhEHbYF9fS*UcPPtW$y zAC1e8&dfF|PCBwPc)8m=``RLrQxnq8EOwjBBztRfX25cv`Ch$VTVDjNcFA@+x-0Z` z$h!EwVWQk+I+s?bT%LD!*S7528}iR;rCMLljonfHbWv~gw)MC6)cyQ-m%G9s_D~1E z_O{tGJ|^wyRkXimZCQ|baE5+%pU=&W=_lt~H_Pen+LC&1xwbUl+*x0Syf|Ke-=FW_A3xmP?_a;~@8`E4XYbdGudo02^{2Q(!*@ZAgvM7- z(;qZ(zPtXQo}W)bvFVLvgkp=h*9^s0F29Ng?L2uLi`o^-G?F^SX01r-(n;F!s9yG{ Q#^WB7YZ;4s85tR@0d|1E6951J literal 0 HcmV?d00001 diff --git a/src/views/htmlcontent/src/app/libs/SlickGrid/images/expand.gif b/src/views/htmlcontent/src/app/libs/SlickGrid/images/expand.gif new file mode 100644 index 0000000000000000000000000000000000000000..1b24ef1248de55c6140895f6760758a1579f14cf GIT binary patch literal 851 zcmZ?wbhEHb$FyaIl$)g-gPK!J(0fMMMlpH!w1DF=kxpFl=aGX3~-h X>0od?I!Q%XL14k81*aJp85yhr3QsCm literal 0 HcmV?d00001 diff --git a/src/views/htmlcontent/src/app/libs/SlickGrid/images/header-bg.gif b/src/views/htmlcontent/src/app/libs/SlickGrid/images/header-bg.gif new file mode 100644 index 0000000000000000000000000000000000000000..fe7dd1c1ebedc02d4e1aabf91fe43e1bcae824e7 GIT binary patch literal 872 zcmZ?wbhEHbWMt4`Y-eC-S#V_a@i#lpzuR@;-JVPD_g;R#|H_AhS3exO_Tk8lkH>C) zJaOyO$=jb!-~D{{-ski8KVNw8<p u#Ky(P`xTtKWIQ)5IXPLwHYwudrlqH+8zi5a#gWNI1yM!7mYUVnf4WCKe8!85Rx=4Ga>@3=9GS G4Auam1ttan literal 0 HcmV?d00001 diff --git a/src/views/htmlcontent/src/app/libs/SlickGrid/images/header-columns-over-bg.gif b/src/views/htmlcontent/src/app/libs/SlickGrid/images/header-columns-over-bg.gif new file mode 100644 index 0000000000000000000000000000000000000000..f9c07af1347fc44dcabb1a9d22458deb195fd92b GIT binary patch literal 823 zcmZ?wbhEHbWMU9wXlGzpb>`d67r$SB{>v~5Mnhoag@EEu7NDp9Gw6W44$2b@93l*? Z95Nmo7Bnz$2y4ZhC{SczU}R*l1^^j55kLR{ literal 0 HcmV?d00001 diff --git a/src/views/htmlcontent/src/app/libs/SlickGrid/images/help.png b/src/views/htmlcontent/src/app/libs/SlickGrid/images/help.png new file mode 100644 index 0000000000000000000000000000000000000000..85eca0950fbe19e870f7701b0bfac6b9a96b317b GIT binary patch literal 345 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 Jk&%(X8US2;)^z{? literal 0 HcmV?d00001 diff --git a/src/views/htmlcontent/src/app/libs/SlickGrid/images/row-over-bg.gif b/src/views/htmlcontent/src/app/libs/SlickGrid/images/row-over-bg.gif new file mode 100644 index 0000000000000000000000000000000000000000..b288e38739ad9914b73eb32837303a11a37f354a GIT binary patch literal 823 zcmV-71IYYGNk%w1VF3Ug0EYko000010RaL60s{jB1Ox;H1qB8M1_uWR2nYxX2?+`c z3JVJh3=9kn4Gj(s4i66x5D*X%5fKs+5)%^>6ciK{6%`g178e&67#J8C85tTH8XFrM z92^`S9UUGX9v>ecARr(iAt53nA|oRsBqSsyB_$>%CMPE+C@3f?DJd!{Dl021EG#T7 zEiEoCE-x=HFfcGNF)=bSGBYzXG&D3dH8nOiHa9mnI5;>tIXOByIy*Z%JUl!-Jv}}? zK0iM{KtMo2K|w-7LPJACL_|bIMMXwNMn^|SNJvOYNl8jdN=r*iOiWBoO-)WtPESuy zP*6}&QBhJ-Qd3h?R8&+|RaI72R##V7SXfwDSy@_IT3cINTwGjTU0q&YUSD5dU|?Wj zVPRroVq;@tWMpJzWo2e&W@l$-XlQ6@X=!R|YHMq2Y;0_8ZEbFDZf|dIaBy&OadC2T za&vQYbaZreb#-=jc6WDoczAeud3kzzdV70&e0+R;eSLm@et&;|fPjF3fq{a8f`fyD zgoK2Jg@uNOhKGlTh=_=ZiHVAeii?YjjEszpjg5|uj*pLzkdTm(k&%*;l9Q8@l$4Z} zm6ev3mY0{8n3$NEnVFiJnwy)OoSdAUot>VZo}ZteprD|kp`oIpqNAguq@<*!rKP5( zrl+T;sHmu^si~@}s;jH3tgNi9t*x%EuCK4Ju&}VPv9YqUva_?Zw6wIfwY9dkwzs#p zxVX5vxw*Q!y1To(yu7@dCU$jHda z$;ryf%FD~k%*@Qq&CSlv&d<-!(9qD)(b3Y<($mw^)YR0~)z#M4*4Nk9*x1lt)=I7_<=;-L_>FMg~>g((4 z?Ck9A?d|UF?(gsK@bK{Q@$vHV^7Hfa^z`)g_4W4l_V@Sq`1ttw`T6?#`uqF){QUg= z{r&#_{{R2~A^8LV00930EC2ui0096U000OS0Po$iSC8I2dGX-ATgb4XLx%wY06VC` Bj$r@* literal 0 HcmV?d00001 diff --git a/src/views/htmlcontent/src/app/libs/SlickGrid/images/sort-asc.gif b/src/views/htmlcontent/src/app/libs/SlickGrid/images/sort-asc.gif new file mode 100644 index 0000000000000000000000000000000000000000..67a2a4c669fc5821a07fc486228d626e16d6ad9e GIT binary patch literal 830 zcmZ?wbhEHbj$14`E{N%eP R51)aOh^MQc%Q~loCIDZo7(W02 literal 0 HcmV?d00001 diff --git a/src/views/htmlcontent/src/app/libs/SlickGrid/images/tag_red.png b/src/views/htmlcontent/src/app/libs/SlickGrid/images/tag_red.png new file mode 100644 index 0000000000000000000000000000000000000000..d290fcd791ec801429fc32f166878c1f22c7e8ae GIT binary patch literal 537 zcmV+!0_OdRP)9$ZJdfg>dNa3k@+gXb+5WI?DVQXrenz6(((GBwjQDwIm4il%AcoXa`^^Z7hdsnkJ; zLQ~B~VP1>KfzLPemr z1_MfgSS+>!QN)h=QW&U-F$O*tlO1;O+i&0xcVJhS7NpIU!??8IJ9;JZa@0Sos$>nmY*ioO0=@QcIVtsi5e!m5AT!1AL z^1RdOPzrdx-Vgr+2wLc^FaV991g3& zU{I%@Xg)ESMSaKoE`SsW1Z?7_b^2gkvC1LyQ2@#3^VvKek4|Q%)46BgXv&DUBPdr>$12LrM(Cr5I|C#1xbu5|>)lhG!5j zp}PE)Xu^dU5*Pp7zt-OS+iME|2>$W}|8AgOYvNm$>YcwbP^~udrei(&4_HX}D(*)H z%3uROc+`d2dpEo{R_M0WsPGioz9m+yNO|L-4%2ZLrs7U?ZnvV+TZ|HikV=0tUa~cY zGp6UWSiUUfQ!P)%oCw4mZqj-Bh8>RhTHU=Tm8j{pZ@+-cb9aFU(;&HV(~}EJ0um$rdG3hCK$ps2$#04jmf` zl#YuMVp|^dVU0Z}noRv+8_ZV&n0xTR8@9rDq=V^1kBP7a?pq6(bva6$!k0qpM{#-t zW=Bqw$}olWZ*%&iHn<{YxWZ;=)>=}qk|Hjb`Z7oa7A;$lpnJC+?#L({H^XQP%0OTx zMV1`uTS=76SJQPfm84|_)GN&(u#&>jZ0bi*Ci|t!C&VDIo(s&`8Na#(0*lTc$;$Yb aYkUR1qNzMm3Ij+00000phCpI>2{dBys(sIwpFWDz^b5`?95CI)&S&yhXMcq literal 0 HcmV?d00001 diff --git a/src/views/htmlcontent/src/app/libs/SlickGrid/images/user_identity_plus.gif b/src/views/htmlcontent/src/app/libs/SlickGrid/images/user_identity_plus.gif new file mode 100644 index 0000000000000000000000000000000000000000..b276a81c786561a82422555b598bbc07e63bf82b GIT binary patch literal 546 zcmZ?wbhEHb!lchi~8b7yvx zhlk4?-L>w+!;3T8%cr#zy}WUJPJ8K&IgO7`ZD`I3>n%>ZR_fBqWElN7JYt`JY zvd_2nAK0?|(~Z5KA6>k%Ywn`{iZiJ$v>W7x^ZI1k2m*@ZCy08t@!iZBj>ivKDus3QITpr{ordpS$wvCCZh^f8h0exu+Lk$Bh>jMgM zY_{C4H(guY@7{B9dwAQ^-Q(GF_Xm%jK7af2_1kx^T;F{3c<=V*+cWo;Mh0sD^HazS literal 0 HcmV?d00001 diff --git a/src/views/htmlcontent/src/app/libs/SlickGrid/lib/firebugx.js b/src/views/htmlcontent/src/app/libs/SlickGrid/lib/firebugx.js new file mode 100644 index 0000000000..a0848e1de9 --- /dev/null +++ b/src/views/htmlcontent/src/app/libs/SlickGrid/lib/firebugx.js @@ -0,0 +1,9 @@ +if (typeof console === "undefined" || typeof console.log === "undefined") { + var names = ["log", "debug", "info", "warn", "error", "assert", "dir", "dirxml", + "group", "groupEnd", "time", "timeEnd", "count", "trace", "profile", "profileEnd"]; + + window.console = {}; + for (var i = 0; i < names.length; ++i) { + window.console[names[i]] = function() {} + } +} \ No newline at end of file diff --git a/src/views/htmlcontent/src/app/libs/SlickGrid/lib/jquery-1.7.min.js b/src/views/htmlcontent/src/app/libs/SlickGrid/lib/jquery-1.7.min.js new file mode 100644 index 0000000000..3ca5e0f5de --- /dev/null +++ b/src/views/htmlcontent/src/app/libs/SlickGrid/lib/jquery-1.7.min.js @@ -0,0 +1,4 @@ +/*! jQuery v1.7 jquery.com | jquery.org/license */ +(function(a,b){function cA(a){return f.isWindow(a)?a:a.nodeType===9?a.defaultView||a.parentWindow:!1}function cx(a){if(!cm[a]){var b=c.body,d=f("<"+a+">").appendTo(b),e=d.css("display");d.remove();if(e==="none"||e===""){cn||(cn=c.createElement("iframe"),cn.frameBorder=cn.width=cn.height=0),b.appendChild(cn);if(!co||!cn.createElement)co=(cn.contentWindow||cn.contentDocument).document,co.write((c.compatMode==="CSS1Compat"?"":"")+""),co.close();d=co.createElement(a),co.body.appendChild(d),e=f.css(d,"display"),b.removeChild(cn)}cm[a]=e}return cm[a]}function cw(a,b){var c={};f.each(cs.concat.apply([],cs.slice(0,b)),function(){c[this]=a});return c}function cv(){ct=b}function cu(){setTimeout(cv,0);return ct=f.now()}function cl(){try{return new a.ActiveXObject("Microsoft.XMLHTTP")}catch(b){}}function ck(){try{return new a.XMLHttpRequest}catch(b){}}function ce(a,c){a.dataFilter&&(c=a.dataFilter(c,a.dataType));var d=a.dataTypes,e={},g,h,i=d.length,j,k=d[0],l,m,n,o,p;for(g=1;g0){c!=="border"&&f.each(e,function(){c||(d-=parseFloat(f.css(a,"padding"+this))||0),c==="margin"?d+=parseFloat(f.css(a,c+this))||0:d-=parseFloat(f.css(a,"border"+this+"Width"))||0});return d+"px"}d=bB(a,b,b);if(d<0||d==null)d=a.style[b]||0;d=parseFloat(d)||0,c&&f.each(e,function(){d+=parseFloat(f.css(a,"padding"+this))||0,c!=="padding"&&(d+=parseFloat(f.css(a,"border"+this+"Width"))||0),c==="margin"&&(d+=parseFloat(f.css(a,c+this))||0)});return d+"px"}function br(a,b){b.src?f.ajax({url:b.src,async:!1,dataType:"script"}):f.globalEval((b.text||b.textContent||b.innerHTML||"").replace(bi,"/*$0*/")),b.parentNode&&b.parentNode.removeChild(b)}function bq(a){var b=(a.nodeName||"").toLowerCase();b==="input"?bp(a):b!=="script"&&typeof a.getElementsByTagName!="undefined"&&f.grep(a.getElementsByTagName("input"),bp)}function bp(a){if(a.type==="checkbox"||a.type==="radio")a.defaultChecked=a.checked}function bo(a){return typeof a.getElementsByTagName!="undefined"?a.getElementsByTagName("*"):typeof a.querySelectorAll!="undefined"?a.querySelectorAll("*"):[]}function bn(a,b){var c;if(b.nodeType===1){b.clearAttributes&&b.clearAttributes(),b.mergeAttributes&&b.mergeAttributes(a),c=b.nodeName.toLowerCase();if(c==="object")b.outerHTML=a.outerHTML;else if(c!=="input"||a.type!=="checkbox"&&a.type!=="radio"){if(c==="option")b.selected=a.defaultSelected;else if(c==="input"||c==="textarea")b.defaultValue=a.defaultValue}else a.checked&&(b.defaultChecked=b.checked=a.checked),b.value!==a.value&&(b.value=a.value);b.removeAttribute(f.expando)}}function bm(a,b){if(b.nodeType===1&&!!f.hasData(a)){var c,d,e,g=f._data(a),h=f._data(b,g),i=g.events;if(i){delete h.handle,h.events={};for(c in i)for(d=0,e=i[c].length;d=0===c})}function V(a){return!a||!a.parentNode||a.parentNode.nodeType===11}function N(){return!0}function M(){return!1}function n(a,b,c){var d=b+"defer",e=b+"queue",g=b+"mark",h=f._data(a,d);h&&(c==="queue"||!f._data(a,e))&&(c==="mark"||!f._data(a,g))&&setTimeout(function(){!f._data(a,e)&&!f._data(a,g)&&(f.removeData(a,d,!0),h.fire())},0)}function m(a){for(var b in a){if(b==="data"&&f.isEmptyObject(a[b]))continue;if(b!=="toJSON")return!1}return!0}function l(a,c,d){if(d===b&&a.nodeType===1){var e="data-"+c.replace(k,"-$1").toLowerCase();d=a.getAttribute(e);if(typeof d=="string"){try{d=d==="true"?!0:d==="false"?!1:d==="null"?null:f.isNumeric(d)?parseFloat(d):j.test(d)?f.parseJSON(d):d}catch(g){}f.data(a,c,d)}else d=b}return d}function h(a){var b=g[a]={},c,d;a=a.split(/\s+/);for(c=0,d=a.length;c)[^>]*$|#([\w\-]*)$)/,j=/\S/,k=/^\s+/,l=/\s+$/,m=/\d/,n=/^<(\w+)\s*\/?>(?:<\/\1>)?$/,o=/^[\],:{}\s]*$/,p=/\\(?:["\\\/bfnrt]|u[0-9a-fA-F]{4})/g,q=/"[^"\\\n\r]*"|true|false|null|-?\d+(?:\.\d*)?(?:[eE][+\-]?\d+)?/g,r=/(?:^|:|,)(?:\s*\[)+/g,s=/(webkit)[ \/]([\w.]+)/,t=/(opera)(?:.*version)?[ \/]([\w.]+)/,u=/(msie) ([\w.]+)/,v=/(mozilla)(?:.*? rv:([\w.]+))?/,w=/-([a-z]|[0-9])/ig,x=/^-ms-/,y=function(a,b){return(b+"").toUpperCase()},z=d.userAgent,A,B,C,D=Object.prototype.toString,E=Object.prototype.hasOwnProperty,F=Array.prototype.push,G=Array.prototype.slice,H=String.prototype.trim,I=Array.prototype.indexOf,J={};e.fn=e.prototype={constructor:e,init:function(a,d,f){var g,h,j,k;if(!a)return this;if(a.nodeType){this.context=this[0]=a,this.length=1;return this}if(a==="body"&&!d&&c.body){this.context=c,this[0]=c.body,this.selector=a,this.length=1;return this}if(typeof a=="string"){a.charAt(0)!=="<"||a.charAt(a.length-1)!==">"||a.length<3?g=i.exec(a):g=[null,a,null];if(g&&(g[1]||!d)){if(g[1]){d=d instanceof e?d[0]:d,k=d?d.ownerDocument||d:c,j=n.exec(a),j?e.isPlainObject(d)?(a=[c.createElement(j[1])],e.fn.attr.call(a,d,!0)):a=[k.createElement(j[1])]:(j=e.buildFragment([g[1]],[k]),a=(j.cacheable?e.clone(j.fragment):j.fragment).childNodes);return e.merge(this,a)}h=c.getElementById(g[2]);if(h&&h.parentNode){if(h.id!==g[2])return f.find(a);this.length=1,this[0]=h}this.context=c,this.selector=a;return this}return!d||d.jquery?(d||f).find(a):this.constructor(d).find(a)}if(e.isFunction(a))return f.ready(a);a.selector!==b&&(this.selector=a.selector,this.context=a.context);return e.makeArray(a,this)},selector:"",jquery:"1.7",length:0,size:function(){return this.length},toArray:function(){return G.call(this,0)},get:function(a){return a==null?this.toArray():a<0?this[this.length+a]:this[a]},pushStack:function(a,b,c){var d=this.constructor();e.isArray(a)?F.apply(d,a):e.merge(d,a),d.prevObject=this,d.context=this.context,b==="find"?d.selector=this.selector+(this.selector?" ":"")+c:b&&(d.selector=this.selector+"."+b+"("+c+")");return d},each:function(a,b){return e.each(this,a,b)},ready:function(a){e.bindReady(),B.add(a);return this},eq:function(a){return a===-1?this.slice(a):this.slice(a,+a+1)},first:function(){return this.eq(0)},last:function(){return this.eq(-1)},slice:function(){return this.pushStack(G.apply(this,arguments),"slice",G.call(arguments).join(","))},map:function(a){return this.pushStack(e.map(this,function(b,c){return a.call(b,c,b)}))},end:function(){return this.prevObject||this.constructor(null)},push:F,sort:[].sort,splice:[].splice},e.fn.init.prototype=e.fn,e.extend=e.fn.extend=function(){var a,c,d,f,g,h,i=arguments[0]||{},j=1,k=arguments.length,l=!1;typeof i=="boolean"&&(l=i,i=arguments[1]||{},j=2),typeof i!="object"&&!e.isFunction(i)&&(i={}),k===j&&(i=this,--j);for(;j0)return;B.fireWith(c,[e]),e.fn.trigger&&e(c).trigger("ready").unbind("ready")}},bindReady:function(){if(!B){B=e.Callbacks("once memory");if(c.readyState==="complete")return setTimeout(e.ready,1);if(c.addEventListener)c.addEventListener("DOMContentLoaded",C,!1),a.addEventListener("load",e.ready,!1);else if(c.attachEvent){c.attachEvent("onreadystatechange",C),a.attachEvent("onload",e.ready);var b=!1;try{b=a.frameElement==null}catch(d){}c.documentElement.doScroll&&b&&K()}}},isFunction:function(a){return e.type(a)==="function"},isArray:Array.isArray||function(a){return e.type(a)==="array"},isWindow:function(a){return a&&typeof a=="object"&&"setInterval"in a},isNumeric:function(a){return a!=null&&m.test(a)&&!isNaN(a)},type:function(a){return a==null?String(a):J[D.call(a)]||"object"},isPlainObject:function(a){if(!a||e.type(a)!=="object"||a.nodeType||e.isWindow(a))return!1;try{if(a.constructor&&!E.call(a,"constructor")&&!E.call(a.constructor.prototype,"isPrototypeOf"))return!1}catch(c){return!1}var d;for(d in a);return d===b||E.call(a,d)},isEmptyObject:function(a){for(var b in a)return!1;return!0},error:function(a){throw a},parseJSON:function(b){if(typeof b!="string"||!b)return null;b=e.trim(b);if(a.JSON&&a.JSON.parse)return a.JSON.parse(b);if(o.test(b.replace(p,"@").replace(q,"]").replace(r,"")))return(new Function("return "+b))();e.error("Invalid JSON: "+b)},parseXML:function(c){var d,f;try{a.DOMParser?(f=new DOMParser,d=f.parseFromString(c,"text/xml")):(d=new ActiveXObject("Microsoft.XMLDOM"),d.async="false",d.loadXML(c))}catch(g){d=b}(!d||!d.documentElement||d.getElementsByTagName("parsererror").length)&&e.error("Invalid XML: "+c);return d},noop:function(){},globalEval:function(b){b&&j.test(b)&&(a.execScript||function(b){a.eval.call(a,b)})(b)},camelCase:function(a){return a.replace(x,"ms-").replace(w,y)},nodeName:function(a,b){return a.nodeName&&a.nodeName.toUpperCase()===b.toUpperCase()},each:function(a,c,d){var f,g=0,h=a.length,i=h===b||e.isFunction(a);if(d){if(i){for(f in a)if(c.apply(a[f],d)===!1)break}else for(;g0&&a[0]&&a[j-1]||j===0||e.isArray(a));if(k)for(;i1?i.call(arguments,0):b,j.notifyWith(k,e)}}function l(a){return function(c){b[a]=arguments.length>1?i.call(arguments,0):c,--g||j.resolveWith(j,b)}}var b=i.call(arguments,0),c=0,d=b.length,e=Array(d),g=d,h=d,j=d<=1&&a&&f.isFunction(a.promise)?a:f.Deferred(),k=j.promise();if(d>1){for(;c
    a

    ",d=a.getElementsByTagName("*"),e=a.getElementsByTagName("a")[0];if(!d||!d.length||!e)return{};g=c.createElement("select"),h=g.appendChild(c.createElement("option")),i=a.getElementsByTagName("input")[0],k={leadingWhitespace:a.firstChild.nodeType===3,tbody:!a.getElementsByTagName("tbody").length,htmlSerialize:!!a.getElementsByTagName("link").length,style:/top/.test(e.getAttribute("style")),hrefNormalized:e.getAttribute("href")==="/a",opacity:/^0.55/.test(e.style.opacity),cssFloat:!!e.style.cssFloat,unknownElems:!!a.getElementsByTagName("nav").length,checkOn:i.value==="on",optSelected:h.selected,getSetAttribute:a.className!=="t",enctype:!!c.createElement("form").enctype,submitBubbles:!0,changeBubbles:!0,focusinBubbles:!1,deleteExpando:!0,noCloneEvent:!0,inlineBlockNeedsLayout:!1,shrinkWrapBlocks:!1,reliableMarginRight:!0},i.checked=!0,k.noCloneChecked=i.cloneNode(!0).checked,g.disabled=!0,k.optDisabled=!h.disabled;try{delete a.test}catch(v){k.deleteExpando=!1}!a.addEventListener&&a.attachEvent&&a.fireEvent&&(a.attachEvent("onclick",function(){k.noCloneEvent=!1}),a.cloneNode(!0).fireEvent("onclick")),i=c.createElement("input"),i.value="t",i.setAttribute("type","radio"),k.radioValue=i.value==="t",i.setAttribute("checked","checked"),a.appendChild(i),l=c.createDocumentFragment(),l.appendChild(a.lastChild),k.checkClone=l.cloneNode(!0).cloneNode(!0).lastChild.checked,a.innerHTML="",a.style.width=a.style.paddingLeft="1px",m=c.getElementsByTagName("body")[0],o=c.createElement(m?"div":"body"),p={visibility:"hidden",width:0,height:0,border:0,margin:0,background:"none"},m&&f.extend(p,{position:"absolute",left:"-999px",top:"-999px"});for(t in p)o.style[t]=p[t];o.appendChild(a),n=m||b,n.insertBefore(o,n.firstChild),k.appendChecked=i.checked,k.boxModel=a.offsetWidth===2,"zoom"in a.style&&(a.style.display="inline",a.style.zoom=1,k.inlineBlockNeedsLayout=a.offsetWidth===2,a.style.display="",a.innerHTML="
    ",k.shrinkWrapBlocks=a.offsetWidth!==2),a.innerHTML="
    t
    ",q=a.getElementsByTagName("td"),u=q[0].offsetHeight===0,q[0].style.display="",q[1].style.display="none",k.reliableHiddenOffsets=u&&q[0].offsetHeight===0,a.innerHTML="",c.defaultView&&c.defaultView.getComputedStyle&&(j=c.createElement("div"),j.style.width="0",j.style.marginRight="0",a.appendChild(j),k.reliableMarginRight=(parseInt((c.defaultView.getComputedStyle(j,null)||{marginRight:0}).marginRight,10)||0)===0);if(a.attachEvent)for(t in{submit:1,change:1,focusin:1})s="on"+t,u=s in a,u||(a.setAttribute(s,"return;"),u=typeof a[s]=="function"),k[t+"Bubbles"]=u;f(function(){var a,b,d,e,g,h,i=1,j="position:absolute;top:0;left:0;width:1px;height:1px;margin:0;",l="visibility:hidden;border:0;",n="style='"+j+"border:5px solid #000;padding:0;'",p="
    "+""+"
    ";m=c.getElementsByTagName("body")[0];!m||(a=c.createElement("div"),a.style.cssText=l+"width:0;height:0;position:static;top:0;margin-top:"+i+"px",m.insertBefore(a,m.firstChild),o=c.createElement("div"),o.style.cssText=j+l,o.innerHTML=p,a.appendChild(o),b=o.firstChild,d=b.firstChild,g=b.nextSibling.firstChild.firstChild,h={doesNotAddBorder:d.offsetTop!==5,doesAddBorderForTableAndCells:g.offsetTop===5},d.style.position="fixed",d.style.top="20px",h.fixedPosition=d.offsetTop===20||d.offsetTop===15,d.style.position=d.style.top="",b.style.overflow="hidden",b.style.position="relative",h.subtractsBorderForOverflowNotVisible=d.offsetTop===-5,h.doesNotIncludeMarginInBodyOffset=m.offsetTop!==i,m.removeChild(a),o=a=null,f.extend(k,h))}),o.innerHTML="",n.removeChild(o),o=l=g=h=m=j=a=i=null;return k}(),f.boxModel=f.support.boxModel;var j=/^(?:\{.*\}|\[.*\])$/,k=/([A-Z])/g;f.extend({cache:{},uuid:0,expando:"jQuery"+(f.fn.jquery+Math.random()).replace(/\D/g,""),noData:{embed:!0,object:"clsid:D27CDB6E-AE6D-11cf-96B8-444553540000",applet:!0},hasData:function(a){a=a.nodeType?f.cache[a[f.expando]]:a[f.expando];return!!a&&!m(a)},data:function(a,c,d,e){if(!!f.acceptData(a)){var g,h,i,j=f.expando,k=typeof c=="string",l=a.nodeType,m=l?f.cache:a,n=l?a[f.expando]:a[f.expando]&&f.expando,o=c==="events";if((!n||!m[n]||!o&&!e&&!m[n].data)&&k&&d===b)return;n||(l?a[f.expando]=n=++f.uuid:n=f.expando),m[n]||(m[n]={},l||(m[n].toJSON=f.noop));if(typeof c=="object"||typeof c=="function")e?m[n]=f.extend(m[n],c):m[n].data=f.extend(m[n].data,c);g=h=m[n],e||(h.data||(h.data={}),h=h.data),d!==b&&(h[f.camelCase(c)]=d);if(o&&!h[c])return g.events;k?(i=h[c],i==null&&(i=h[f.camelCase(c)])):i=h;return i}},removeData:function(a,b,c){if(!!f.acceptData(a)){var d,e,g,h=f.expando,i=a.nodeType,j=i?f.cache:a,k=i?a[f.expando]:f.expando;if(!j[k])return;if(b){d=c?j[k]:j[k].data;if(d){f.isArray(b)?b=b:b in d?b=[b]:(b=f.camelCase(b),b in d?b=[b]:b=b.split(" "));for(e=0,g=b.length;e-1)return!0;return!1},val:function(a){var c,d,e,g=this[0];if(!arguments.length){if(g){c=f.valHooks[g.nodeName.toLowerCase()]||f.valHooks[g.type];if(c&&"get"in c&&(d=c.get(g,"value"))!==b)return d;d=g.value;return typeof d=="string"?d.replace(q,""):d==null?"":d}return b}e=f.isFunction(a);return this.each(function(d){var g=f(this),h;if(this.nodeType===1){e?h=a.call(this,d,g.val()):h=a,h==null?h="":typeof h=="number"?h+="":f.isArray(h)&&(h=f.map(h,function(a){return a==null?"":a+""})),c=f.valHooks[this.nodeName.toLowerCase()]||f.valHooks[this.type];if(!c||!("set"in c)||c.set(this,h,"value")===b)this.value=h}})}}),f.extend({valHooks:{option:{get:function(a){var b=a.attributes.value;return!b||b.specified?a.value:a.text}},select:{get:function(a){var b,c,d,e,g=a.selectedIndex,h=[],i=a.options,j=a.type==="select-one";if(g<0)return null;c=j?g:0,d=j?g+1:i.length;for(;c=0}),c.length||(a.selectedIndex=-1);return c}}},attrFn:{val:!0,css:!0,html:!0,text:!0,data:!0,width:!0,height:!0,offset:!0},attr:function(a,c,d,e){var g,h,i,j=a.nodeType;if(!a||j===3||j===8||j===2)return b;if(e&&c in f.attrFn)return f(a)[c](d);if(!("getAttribute"in a))return f.prop(a,c,d);i=j!==1||!f.isXMLDoc(a),i&&(c=c.toLowerCase(),h=f.attrHooks[c]||(u.test(c)?x:w));if(d!==b){if(d===null){f.removeAttr(a,c);return b}if(h&&"set"in h&&i&&(g=h.set(a,d,c))!==b)return g;a.setAttribute(c,""+d);return d}if(h&&"get"in h&&i&&(g=h.get(a,c))!==null)return g;g=a.getAttribute(c);return g===null?b:g},removeAttr:function(a,b){var c,d,e,g,h=0;if(a.nodeType===1){d=(b||"").split(p),g=d.length;for(;h=0}})});var z=/\.(.*)$/,A=/^(?:textarea|input|select)$/i,B=/\./g,C=/ /g,D=/[^\w\s.|`]/g,E=/^([^\.]*)?(?:\.(.+))?$/,F=/\bhover(\.\S+)?/,G=/^key/,H=/^(?:mouse|contextmenu)|click/,I=/^(\w*)(?:#([\w\-]+))?(?:\.([\w\-]+))?$/,J=function(a){var b=I.exec(a);b&& +(b[1]=(b[1]||"").toLowerCase(),b[3]=b[3]&&new RegExp("(?:^|\\s)"+b[3]+"(?:\\s|$)"));return b},K=function(a,b){return(!b[1]||a.nodeName.toLowerCase()===b[1])&&(!b[2]||a.id===b[2])&&(!b[3]||b[3].test(a.className))},L=function(a){return f.event.special.hover?a:a.replace(F,"mouseenter$1 mouseleave$1")};f.event={add:function(a,c,d,e,g){var h,i,j,k,l,m,n,o,p,q,r,s;if(!(a.nodeType===3||a.nodeType===8||!c||!d||!(h=f._data(a)))){d.handler&&(p=d,d=p.handler),d.guid||(d.guid=f.guid++),j=h.events,j||(h.events=j={}),i=h.handle,i||(h.handle=i=function(a){return typeof f!="undefined"&&(!a||f.event.triggered!==a.type)?f.event.dispatch.apply(i.elem,arguments):b},i.elem=a),c=L(c).split(" ");for(k=0;k=0&&(h=h.slice(0,-1),k=!0),h.indexOf(".")>=0&&(i=h.split("."),h=i.shift(),i.sort());if((!e||f.event.customEvent[h])&&!f.event.global[h])return;c=typeof c=="object"?c[f.expando]?c:new f.Event(h,c):new f.Event(h),c.type=h,c.isTrigger=!0,c.exclusive=k,c.namespace=i.join("."),c.namespace_re=c.namespace?new RegExp("(^|\\.)"+i.join("\\.(?:.*\\.)?")+"(\\.|$)"):null,o=h.indexOf(":")<0?"on"+h:"",(g||!e)&&c.preventDefault();if(!e){j=f.cache;for(l in j)j[l].events&&j[l].events[h]&&f.event.trigger(c,d,j[l].handle.elem,!0);return}c.result=b,c.target||(c.target=e),d=d!=null?f.makeArray(d):[],d.unshift(c),p=f.event.special[h]||{};if(p.trigger&&p.trigger.apply(e,d)===!1)return;r=[[e,p.bindType||h]];if(!g&&!p.noBubble&&!f.isWindow(e)){s=p.delegateType||h,n=null;for(m=e.parentNode;m;m=m.parentNode)r.push([m,s]),n=m;n&&n===e.ownerDocument&&r.push([n.defaultView||n.parentWindow||a,s])}for(l=0;l=0:t===b&&(t=o[s]=r.quick?K(m,r.quick):f(m).is(s)),t&&q.push(r);q.length&&j.push({elem:m,matches:q})}d.length>e&&j.push({elem:this,matches:d.slice(e)});for(k=0;k0?this.bind(b,a,c):this.trigger(b)},f.attrFn&&(f.attrFn[b]=!0),G.test(b)&&(f.event.fixHooks[b]=f.event.keyHooks),H.test(b)&&(f.event.fixHooks[b]=f.event.mouseHooks)}),function(){function x(a,b,c,e,f,g){for(var h=0,i=e.length;h0){k=j;break}}j=j[a]}e[h]=k}}}function w(a,b,c,e,f,g){for(var h=0,i=e.length;h+~,(\[\\]+)+|[>+~])(\s*,\s*)?((?:.|\r|\n)*)/g,d="sizcache"+(Math.random()+"").replace(".",""),e=0,g=Object.prototype.toString,h=!1,i=!0,j=/\\/g,k=/\r\n/g,l=/\W/;[0,0].sort(function(){i=!1;return 0});var m=function(b,d,e,f){e=e||[],d=d||c;var h=d;if(d.nodeType!==1&&d.nodeType!==9)return[];if(!b||typeof b!="string")return e;var i,j,k,l,n,q,r,t,u=!0,v=m.isXML(d),w=[],x=b;do{a.exec(""),i=a.exec(x);if(i){x=i[3],w.push(i[1]);if(i[2]){l=i[3];break}}}while(i);if(w.length>1&&p.exec(b))if(w.length===2&&o.relative[w[0]])j=y(w[0]+w[1],d,f);else{j=o.relative[w[0]]?[d]:m(w.shift(),d);while(w.length)b=w.shift(),o.relative[b]&&(b+=w.shift()),j=y(b,j,f)}else{!f&&w.length>1&&d.nodeType===9&&!v&&o.match.ID.test(w[0])&&!o.match.ID.test(w[w.length-1])&&(n=m.find(w.shift(),d,v),d=n.expr?m.filter(n.expr,n.set)[0]:n.set[0]);if(d){n=f?{expr:w.pop(),set:s(f)}:m.find(w.pop(),w.length===1&&(w[0]==="~"||w[0]==="+")&&d.parentNode?d.parentNode:d,v),j=n.expr?m.filter(n.expr,n.set):n.set,w.length>0?k=s(j):u=!1;while(w.length)q=w.pop(),r=q,o.relative[q]?r=w.pop():q="",r==null&&(r=d),o.relative[q](k,r,v)}else k=w=[]}k||(k=j),k||m.error(q||b);if(g.call(k)==="[object Array]")if(!u)e.push.apply(e,k);else if(d&&d.nodeType===1)for(t=0;k[t]!=null;t++)k[t]&&(k[t]===!0||k[t].nodeType===1&&m.contains(d,k[t]))&&e.push(j[t]);else for(t=0;k[t]!=null;t++)k[t]&&k[t].nodeType===1&&e.push(j[t]);else s(k,e);l&&(m(l,h,e,f),m.uniqueSort(e));return e};m.uniqueSort=function(a){if(u){h=i,a.sort(u);if(h)for(var b=1;b0},m.find=function(a,b,c){var d,e,f,g,h,i;if(!a)return[];for(e=0,f=o.order.length;e":function(a,b){var c,d=typeof b=="string",e=0,f=a.length;if(d&&!l.test(b)){b=b.toLowerCase();for(;e=0)?c||d.push(h):c&&(b[g]=!1));return!1},ID:function(a){return a[1].replace(j,"")},TAG:function(a,b){return a[1].replace(j,"").toLowerCase()},CHILD:function(a){if(a[1]==="nth"){a[2]||m.error(a[0]),a[2]=a[2].replace(/^\+|\s*/g,"");var b=/(-?)(\d*)(?:n([+\-]?\d*))?/.exec(a[2]==="even"&&"2n"||a[2]==="odd"&&"2n+1"||!/\D/.test(a[2])&&"0n+"+a[2]||a[2]);a[2]=b[1]+(b[2]||1)-0,a[3]=b[3]-0}else a[2]&&m.error(a[0]);a[0]=e++;return a},ATTR:function(a,b,c,d,e,f){var g=a[1]=a[1].replace(j,"");!f&&o.attrMap[g]&&(a[1]=o.attrMap[g]),a[4]=(a[4]||a[5]||"").replace(j,""),a[2]==="~="&&(a[4]=" "+a[4]+" ");return a},PSEUDO:function(b,c,d,e,f){if(b[1]==="not")if((a.exec(b[3])||"").length>1||/^\w/.test(b[3]))b[3]=m(b[3],null,null,c);else{var g=m.filter(b[3],c,d,!0^f);d||e.push.apply(e,g);return!1}else if(o.match.POS.test(b[0])||o.match.CHILD.test(b[0]))return!0;return b},POS:function(a){a.unshift(!0);return a}},filters:{enabled:function(a){return a.disabled===!1&&a.type!=="hidden"},disabled:function(a){return a.disabled===!0},checked:function(a){return a.checked===!0},selected:function(a){a.parentNode&&a.parentNode.selectedIndex;return a.selected===!0},parent:function(a){return!!a.firstChild},empty:function(a){return!a.firstChild},has:function(a,b,c){return!!m(c[3],a).length},header:function(a){return/h\d/i.test(a.nodeName)},text:function(a){var b=a.getAttribute("type"),c=a.type;return a.nodeName.toLowerCase()==="input"&&"text"===c&&(b===c||b===null)},radio:function(a){return a.nodeName.toLowerCase()==="input"&&"radio"===a.type},checkbox:function(a){return a.nodeName.toLowerCase()==="input"&&"checkbox"===a.type},file:function(a){return a.nodeName.toLowerCase()==="input"&&"file"===a.type},password:function(a){return a.nodeName.toLowerCase()==="input"&&"password"===a.type},submit:function(a){var b=a.nodeName.toLowerCase();return(b==="input"||b==="button")&&"submit"===a.type},image:function(a){return a.nodeName.toLowerCase()==="input"&&"image"===a.type},reset:function(a){var b=a.nodeName.toLowerCase();return(b==="input"||b==="button")&&"reset"===a.type},button:function(a){var b=a.nodeName.toLowerCase();return b==="input"&&"button"===a.type||b==="button"},input:function(a){return/input|select|textarea|button/i.test(a.nodeName)},focus:function(a){return a===a.ownerDocument.activeElement}},setFilters:{first:function(a,b){return b===0},last:function(a,b,c,d){return b===d.length-1},even:function(a,b){return b%2===0},odd:function(a,b){return b%2===1},lt:function(a,b,c){return bc[3]-0},nth:function(a,b,c){return c[3]-0===b},eq:function(a,b,c){return c[3]-0===b}},filter:{PSEUDO:function(a,b,c,d){var e=b[1],f=o.filters[e];if(f)return f(a,c,b,d);if(e==="contains")return(a.textContent||a.innerText||n([a])||"").indexOf(b[3])>=0;if(e==="not"){var g=b[3];for(var h=0,i=g.length;h=0}},ID:function(a,b){return a.nodeType===1&&a.getAttribute("id")===b},TAG:function(a,b){return b==="*"&&a.nodeType===1||!!a.nodeName&&a.nodeName.toLowerCase()===b},CLASS:function(a,b){return(" "+(a.className||a.getAttribute("class"))+" ").indexOf(b)>-1},ATTR:function(a,b){var c=b[1],d=m.attr?m.attr(a,c):o.attrHandle[c]?o.attrHandle[c](a):a[c]!=null?a[c]:a.getAttribute(c),e=d+"",f=b[2],g=b[4];return d==null?f==="!=":!f&&m.attr?d!=null:f==="="?e===g:f==="*="?e.indexOf(g)>=0:f==="~="?(" "+e+" ").indexOf(g)>=0:g?f==="!="?e!==g:f==="^="?e.indexOf(g)===0:f==="$="?e.substr(e.length-g.length)===g:f==="|="?e===g||e.substr(0,g.length+1)===g+"-":!1:e&&d!==!1},POS:function(a,b,c,d){var e=b[2],f=o.setFilters[e];if(f)return f(a,c,b,d)}}},p=o.match.POS,q=function(a,b){return"\\"+(b-0+1)};for(var r in o.match)o.match[r]=new RegExp(o.match[r].source+/(?![^\[]*\])(?![^\(]*\))/.source),o.leftMatch[r]=new RegExp(/(^(?:.|\r|\n)*?)/.source+o.match[r].source.replace(/\\(\d+)/g,q));var s=function(a,b){a=Array.prototype.slice.call(a,0);if(b){b.push.apply(b,a);return b}return a};try{Array.prototype.slice.call(c.documentElement.childNodes,0)[0].nodeType}catch(t){s=function(a,b){var c=0,d=b||[];if(g.call(a)==="[object Array]")Array.prototype.push.apply(d,a);else if(typeof a.length=="number")for(var e=a.length;c",e.insertBefore(a,e.firstChild),c.getElementById(d)&&(o.find.ID=function(a,c,d){if(typeof c.getElementById!="undefined"&&!d){var e=c.getElementById(a[1]);return e?e.id===a[1]||typeof e.getAttributeNode!="undefined"&&e.getAttributeNode("id").nodeValue===a[1]?[e]:b:[]}},o.filter.ID=function(a,b){var c=typeof a.getAttributeNode!="undefined"&&a.getAttributeNode("id");return a.nodeType===1&&c&&c.nodeValue===b}),e.removeChild(a),e=a=null}(),function(){var a=c.createElement("div");a.appendChild(c.createComment("")),a.getElementsByTagName("*").length>0&&(o.find.TAG=function(a,b){var c=b.getElementsByTagName(a[1]);if(a[1]==="*"){var d=[];for(var e=0;c[e];e++)c[e].nodeType===1&&d.push(c[e]);c=d}return c}),a.innerHTML="",a.firstChild&&typeof a.firstChild.getAttribute!="undefined"&&a.firstChild.getAttribute("href")!=="#"&&(o.attrHandle.href=function(a){return a.getAttribute("href",2)}),a=null}(),c.querySelectorAll&&function(){var a=m,b=c.createElement("div"),d="__sizzle__";b.innerHTML="

    ";if(!b.querySelectorAll||b.querySelectorAll(".TEST").length!==0){m=function(b,e,f,g){e=e||c;if(!g&&!m.isXML(e)){var h=/^(\w+$)|^\.([\w\-]+$)|^#([\w\-]+$)/.exec(b);if(h&&(e.nodeType===1||e.nodeType===9)){if(h[1])return s(e.getElementsByTagName(b),f);if(h[2]&&o.find.CLASS&&e.getElementsByClassName)return s(e.getElementsByClassName(h[2]),f)}if(e.nodeType===9){if(b==="body"&&e.body)return s([e.body],f);if(h&&h[3]){var i=e.getElementById(h[3]);if(!i||!i.parentNode)return s([],f);if(i.id===h[3])return s([i],f)}try{return s(e.querySelectorAll(b),f)}catch(j){}}else if(e.nodeType===1&&e.nodeName.toLowerCase()!=="object"){var k=e,l=e.getAttribute("id"),n=l||d,p=e.parentNode,q=/^\s*[+~]/.test(b);l?n=n.replace(/'/g,"\\$&"):e.setAttribute("id",n),q&&p&&(e=e.parentNode);try{if(!q||p)return s(e.querySelectorAll("[id='"+n+"'] "+b),f)}catch(r){}finally{l||k.removeAttribute("id")}}}return a(b,e,f,g)};for(var e in a)m[e]=a[e];b=null}}(),function(){var a=c.documentElement,b=a.matchesSelector||a.mozMatchesSelector||a.webkitMatchesSelector||a.msMatchesSelector;if(b){var d=!b.call(c.createElement("div"),"div"),e=!1;try{b.call(c.documentElement,"[test!='']:sizzle")}catch(f){e=!0}m.matchesSelector=function(a,c){c=c.replace(/\=\s*([^'"\]]*)\s*\]/g,"='$1']");if(!m.isXML(a))try{if(e||!o.match.PSEUDO.test(c)&&!/!=/.test(c)){var f=b.call(a,c);if(f||!d||a.document&&a.document.nodeType!==11)return f}}catch(g){}return m(c,null,null,[a]).length>0}}}(),function(){var a=c.createElement("div");a.innerHTML="
    ";if(!!a.getElementsByClassName&&a.getElementsByClassName("e").length!==0){a.lastChild.className="e";if(a.getElementsByClassName("e").length===1)return;o.order.splice(1,0,"CLASS"),o.find.CLASS=function(a,b,c){if(typeof b.getElementsByClassName!="undefined"&&!c)return b.getElementsByClassName(a[1])},a=null}}(),c.documentElement.contains?m.contains=function(a,b){return a!==b&&(a.contains?a.contains(b):!0)}:c.documentElement.compareDocumentPosition?m.contains=function(a,b){return!!(a.compareDocumentPosition(b)&16)}:m.contains=function(){return!1},m.isXML=function(a){var b=(a?a.ownerDocument||a:0).documentElement;return b?b.nodeName!=="HTML":!1};var y=function(a,b,c){var d,e=[],f="",g=b.nodeType?[b]:b;while(d=o.match.PSEUDO.exec(a))f+=d[0],a=a.replace(o.match.PSEUDO,"");a=o.relative[a]?a+"*":a;for(var h=0,i=g.length;h0)for(h=g;h=0:f.filter(a,this).length>0:this.filter(a).length>0)},closest:function(a,b){var c=[],d,e,g=this[0];if(f.isArray(a)){var h=1;while(g&&g.ownerDocument&&g!==b){for(d=0;d-1:f.find.matchesSelector(g,a)){c.push(g);break}g=g.parentNode;if(!g||!g.ownerDocument||g===b||g.nodeType===11)break}}c=c.length>1?f.unique(c):c;return this.pushStack(c,"closest",a)},index:function(a){if(!a)return this[0]&&this[0].parentNode?this.prevAll().length:-1;if(typeof a=="string")return f.inArray(this[0],f(a));return f.inArray(a.jquery?a[0]:a,this)},add:function(a,b){var c=typeof a=="string"?f(a,b):f.makeArray(a&&a.nodeType?[a]:a),d=f.merge(this.get(),c);return this.pushStack(V(c[0])||V(d[0])?d:f.unique(d))},andSelf:function(){return this.add(this.prevObject)}}),f.each({parent:function(a){var b=a.parentNode;return b&&b.nodeType!==11?b:null},parents:function(a){return f.dir(a,"parentNode")},parentsUntil:function(a,b,c){return f.dir(a,"parentNode",c)},next:function(a){return f.nth(a,2,"nextSibling")},prev:function(a){return f.nth(a,2,"previousSibling")},nextAll:function(a){return f.dir(a,"nextSibling")},prevAll:function(a){return f.dir(a,"previousSibling")},nextUntil:function(a,b,c){return f.dir(a,"nextSibling",c)},prevUntil:function(a,b,c){return f.dir(a,"previousSibling",c)},siblings:function(a){return f.sibling(a.parentNode.firstChild,a)},children:function(a){return f.sibling(a.firstChild)},contents:function(a){return f.nodeName(a,"iframe")?a.contentDocument||a.contentWindow.document:f.makeArray(a.childNodes)}},function(a,b){f.fn[a]=function(c,d){var e=f.map(this,b,c),g=S.call(arguments);O.test(a)||(d=c),d&&typeof d=="string"&&(e=f.filter(d,e)),e=this.length>1&&!U[a]?f.unique(e):e,(this.length>1||Q.test(d))&&P.test(a)&&(e=e.reverse());return this.pushStack(e,a,g.join(","))}}),f.extend({filter:function(a,b,c){c&&(a=":not("+a+")");return b.length===1?f.find.matchesSelector(b[0],a)?[b[0]]:[]:f.find.matches(a,b)},dir:function(a,c,d){var e=[],g=a[c];while(g&&g.nodeType!==9&&(d===b||g.nodeType!==1||!f(g).is(d)))g.nodeType===1&&e.push(g),g=g[c];return e},nth:function(a,b,c,d){b=b||1;var e=0;for(;a;a=a[c])if(a.nodeType===1&&++e===b)break;return a},sibling:function(a,b){var c=[];for(;a;a=a.nextSibling)a.nodeType===1&&a!==b&&c.push(a);return c}});var Y="abbr article aside audio canvas datalist details figcaption figure footer header hgroup mark meter nav output progress section summary time video",Z=/ jQuery\d+="(?:\d+|null)"/g,$=/^\s+/,_=/<(?!area|br|col|embed|hr|img|input|link|meta|param)(([\w:]+)[^>]*)\/>/ig,ba=/<([\w:]+)/,bb=/",""],legend:[1,"
    ","
    "],thead:[1,"","
    "],tr:[2,"","
    "],td:[3,"","
    "],col:[2,"","
    "],area:[1,"",""],_default:[0,"",""]},bk=X(c);bj.optgroup=bj.option,bj.tbody=bj.tfoot=bj.colgroup=bj.caption=bj.thead,bj.th=bj.td,f.support.htmlSerialize||(bj._default=[1,"div
    ","
    "]),f.fn.extend({text:function(a){if(f.isFunction(a))return this.each(function(b){var c=f(this);c.text(a.call(this,b,c.text()))});if(typeof a!="object"&&a!==b)return this.empty().append((this[0]&&this[0].ownerDocument||c).createTextNode(a));return f.text(this)},wrapAll:function(a){if(f.isFunction(a))return this.each(function(b){f(this).wrapAll(a.call(this,b))});if(this[0]){var b=f(a,this[0].ownerDocument).eq(0).clone(!0);this[0].parentNode&&b.insertBefore(this[0]),b.map(function(){var a=this;while(a.firstChild&&a.firstChild.nodeType===1)a=a.firstChild;return a}).append(this)}return this},wrapInner:function(a){if(f.isFunction(a))return this.each(function(b){f(this).wrapInner(a.call(this,b))});return this.each(function(){var b=f(this),c=b.contents();c.length?c.wrapAll(a):b.append(a)})},wrap:function(a){return this.each(function(){f(this).wrapAll(a)})},unwrap:function(){return this.parent().each(function(){f.nodeName(this,"body")||f(this).replaceWith(this.childNodes)}).end()},append:function(){return this.domManip(arguments,!0,function(a){this.nodeType===1&&this.appendChild(a)})},prepend:function(){return this.domManip(arguments,!0,function(a){this.nodeType===1&&this.insertBefore(a,this.firstChild)})},before:function(){if(this[0]&&this[0].parentNode)return this.domManip(arguments,!1,function(a){this.parentNode.insertBefore(a,this)});if(arguments.length){var a=f(arguments[0]);a.push.apply(a,this.toArray());return this.pushStack(a,"before",arguments)}},after:function(){if(this[0]&&this[0].parentNode)return this.domManip(arguments,!1,function(a){this.parentNode.insertBefore(a,this.nextSibling)});if(arguments.length){var a=this.pushStack(this,"after" +,arguments);a.push.apply(a,f(arguments[0]).toArray());return a}},remove:function(a,b){for(var c=0,d;(d=this[c])!=null;c++)if(!a||f.filter(a,[d]).length)!b&&d.nodeType===1&&(f.cleanData(d.getElementsByTagName("*")),f.cleanData([d])),d.parentNode&&d.parentNode.removeChild(d);return this},empty:function(){for(var a=0,b;(b=this[a])!=null;a++){b.nodeType===1&&f.cleanData(b.getElementsByTagName("*"));while(b.firstChild)b.removeChild(b.firstChild)}return this},clone:function(a,b){a=a==null?!1:a,b=b==null?a:b;return this.map(function(){return f.clone(this,a,b)})},html:function(a){if(a===b)return this[0]&&this[0].nodeType===1?this[0].innerHTML.replace(Z,""):null;if(typeof a=="string"&&!bd.test(a)&&(f.support.leadingWhitespace||!$.test(a))&&!bj[(ba.exec(a)||["",""])[1].toLowerCase()]){a=a.replace(_,"<$1>");try{for(var c=0,d=this.length;c1&&l0?this.clone(!0):this).get();f(e[h])[b](j),d=d.concat(j)}return this.pushStack(d,a,e.selector)}}),f.extend({clone:function(a,b,c){var d=a.cloneNode(!0),e,g,h;if((!f.support.noCloneEvent||!f.support.noCloneChecked)&&(a.nodeType===1||a.nodeType===11)&&!f.isXMLDoc(a)){bn(a,d),e=bo(a),g=bo(d);for(h=0;e[h];++h)g[h]&&bn(e[h],g[h])}if(b){bm(a,d);if(c){e=bo(a),g=bo(d);for(h=0;e[h];++h)bm(e[h],g[h])}}e=g=null;return d},clean:function(a,b,d,e){var g;b=b||c,typeof b.createElement=="undefined"&&(b=b.ownerDocument||b[0]&&b[0].ownerDocument||c);var h=[],i;for(var j=0,k;(k=a[j])!=null;j++){typeof k=="number"&&(k+="");if(!k)continue;if(typeof k=="string")if(!bc.test(k))k=b.createTextNode(k);else{k=k.replace(_,"<$1>");var l=(ba.exec(k)||["",""])[1].toLowerCase(),m=bj[l]||bj._default,n=m[0],o=b.createElement("div");b===c?bk.appendChild(o):X(b).appendChild(o),o.innerHTML=m[1]+k+m[2];while(n--)o=o.lastChild;if(!f.support.tbody){var p=bb.test(k),q=l==="table"&&!p?o.firstChild&&o.firstChild.childNodes:m[1]===""&&!p?o.childNodes:[];for(i=q.length-1;i>=0;--i)f.nodeName(q[i],"tbody")&&!q[i].childNodes.length&&q[i].parentNode.removeChild(q[i])}!f.support.leadingWhitespace&&$.test(k)&&o.insertBefore(b.createTextNode($.exec(k)[0]),o.firstChild),k=o.childNodes}var r;if(!f.support.appendChecked)if(k[0]&&typeof (r=k.length)=="number")for(i=0;i=0)return b+"px"}}}),f.support.opacity||(f.cssHooks.opacity={get:function(a,b){return bt.test((b&&a.currentStyle?a.currentStyle.filter:a.style.filter)||"")?parseFloat(RegExp.$1)/100+"":b?"1":""},set:function(a,b){var c=a.style,d=a.currentStyle,e=f.isNumeric(b)?"alpha(opacity="+b*100+")":"",g=d&&d.filter||c.filter||"";c.zoom=1;if(b>=1&&f.trim(g.replace(bs,""))===""){c.removeAttribute("filter");if(d&&!d.filter)return}c.filter=bs.test(g)?g.replace(bs,e):g+" "+e}}),f(function(){f.support.reliableMarginRight||(f.cssHooks.marginRight={get:function(a,b){var c;f.swap(a,{display:"inline-block"},function(){b?c=bB(a,"margin-right","marginRight"):c=a.style.marginRight});return c}})}),c.defaultView&&c.defaultView.getComputedStyle&&(bC=function(a,c){var d,e,g;c=c.replace(bu,"-$1").toLowerCase();if(!(e=a.ownerDocument.defaultView))return b;if(g=e.getComputedStyle(a,null))d=g.getPropertyValue(c),d===""&&!f.contains(a.ownerDocument.documentElement,a)&&(d=f.style(a,c));return d}),c.documentElement.currentStyle&&(bD=function(a,b){var c,d,e,f=a.currentStyle&&a.currentStyle[b],g=a.style;f===null&&g&&(e=g[b])&&(f=e),!bv.test(f)&&bw.test(f)&&(c=g.left,d=a.runtimeStyle&&a.runtimeStyle.left,d&&(a.runtimeStyle.left=a.currentStyle.left),g.left=b==="fontSize"?"1em":f||0,f=g.pixelLeft+"px",g.left=c,d&&(a.runtimeStyle.left=d));return f===""?"auto":f}),bB=bC||bD,f.expr&&f.expr.filters&&(f.expr.filters.hidden=function(a){var b=a.offsetWidth,c=a.offsetHeight;return b===0&&c===0||!f.support.reliableHiddenOffsets&&(a.style&&a.style.display||f.css(a,"display"))==="none"},f.expr.filters.visible=function(a){return!f.expr.filters.hidden(a)});var bF=/%20/g,bG=/\[\]$/,bH=/\r?\n/g,bI=/#.*$/,bJ=/^(.*?):[ \t]*([^\r\n]*)\r?$/mg,bK=/^(?:color|date|datetime|datetime-local|email|hidden|month|number|password|range|search|tel|text|time|url|week)$/i,bL=/^(?:about|app|app\-storage|.+\-extension|file|res|widget):$/,bM=/^(?:GET|HEAD)$/,bN=/^\/\//,bO=/\?/,bP=/)<[^<]*)*<\/script>/gi,bQ=/^(?:select|textarea)/i,bR=/\s+/,bS=/([?&])_=[^&]*/,bT=/^([\w\+\.\-]+:)(?:\/\/([^\/?#:]*)(?::(\d+))?)?/,bU=f.fn.load,bV={},bW={},bX,bY,bZ=["*/"]+["*"];try{bX=e.href}catch(b$){bX=c.createElement("a"),bX.href="",bX=bX.href}bY=bT.exec(bX.toLowerCase())||[],f.fn.extend({load:function(a,c,d){if(typeof a!="string"&&bU)return bU.apply(this,arguments);if(!this.length)return this;var e=a.indexOf(" ");if(e>=0){var g=a.slice(e,a.length);a=a.slice(0,e)}var h="GET";c&&(f.isFunction(c)?(d=c,c=b):typeof c=="object"&&(c=f.param(c,f.ajaxSettings.traditional),h="POST"));var i=this;f.ajax({url:a,type:h,dataType:"html",data:c,complete:function(a,b,c){c=a.responseText,a.isResolved()&&(a.done(function(a){c=a}),i.html(g?f("
    ").append(c.replace(bP,"")).find(g):c)),d&&i.each(d,[c,b,a])}});return this},serialize:function(){return f.param(this.serializeArray())},serializeArray:function(){return this.map(function(){return this.elements?f.makeArray(this.elements):this}).filter(function(){return this.name&&!this.disabled&&(this.checked||bQ.test(this.nodeName)||bK.test(this.type))}).map(function(a,b){var c=f(this).val();return c==null?null:f.isArray(c)?f.map(c,function(a,c){return{name:b.name,value:a.replace(bH,"\r\n")}}):{name:b.name,value:c.replace(bH,"\r\n")}}).get()}}),f.each("ajaxStart ajaxStop ajaxComplete ajaxError ajaxSuccess ajaxSend".split(" "),function(a,b){f.fn[b]=function(a){return this.bind(b,a)}}),f.each(["get","post"],function(a,c){f[c]=function(a,d,e,g){f.isFunction(d)&&(g=g||e,e=d,d=b);return f.ajax({type:c,url:a,data:d,success:e,dataType:g})}}),f.extend({getScript:function(a,c){return f.get(a,b,c,"script")},getJSON:function(a,b,c){return f.get(a,b,c,"json")},ajaxSetup:function(a,b){b?cb(a,f.ajaxSettings):(b=a,a=f.ajaxSettings),cb(a,b);return a},ajaxSettings:{url:bX,isLocal:bL.test(bY[1]),global:!0,type:"GET",contentType:"application/x-www-form-urlencoded",processData:!0,async:!0,accepts:{xml:"application/xml, text/xml",html:"text/html",text:"text/plain",json:"application/json, text/javascript","*":bZ},contents:{xml:/xml/,html:/html/,json:/json/},responseFields:{xml:"responseXML",text:"responseText"},converters:{"* text":a.String,"text html":!0,"text json":f.parseJSON,"text xml":f.parseXML},flatOptions:{context:!0,url:!0}},ajaxPrefilter:b_(bV),ajaxTransport:b_(bW),ajax:function(a,c){function w(a,c,l,m){if(s!==2){s=2,q&&clearTimeout(q),p=b,n=m||"",v.readyState=a>0?4:0;var o,r,u,w=c,x=l?cd(d,v,l):b,y,z;if(a>=200&&a<300||a===304){if(d.ifModified){if(y=v.getResponseHeader("Last-Modified"))f.lastModified[k]=y;if(z=v.getResponseHeader("Etag"))f.etag[k]=z}if(a===304)w="notmodified",o=!0;else try{r=ce(d,x),w="success",o=!0}catch(A){w="parsererror",u=A}}else{u=w;if(!w||a)w="error",a<0&&(a=0)}v.status=a,v.statusText=""+(c||w),o?h.resolveWith(e,[r,w,v]):h.rejectWith(e,[v,w,u]),v.statusCode(j),j=b,t&&g.trigger("ajax"+(o?"Success":"Error"),[v,d,o?r:u]),i.fireWith(e,[v,w]),t&&(g.trigger("ajaxComplete",[v,d]),--f.active||f.event.trigger("ajaxStop"))}}typeof a=="object"&&(c=a,a=b),c=c||{};var d=f.ajaxSetup({},c),e=d.context||d,g=e!==d&&(e.nodeType||e instanceof f)?f(e):f.event,h=f.Deferred(),i=f.Callbacks("once memory"),j=d.statusCode||{},k,l={},m={},n,o,p,q,r,s=0,t,u,v={readyState:0,setRequestHeader:function(a,b){if(!s){var c=a.toLowerCase();a=m[c]=m[c]||a,l[a]=b}return this},getAllResponseHeaders:function(){return s===2?n:null},getResponseHeader:function(a){var c;if(s===2){if(!o){o={};while(c=bJ.exec(n))o[c[1].toLowerCase()]=c[2]}c=o[a.toLowerCase()]}return c===b?null:c},overrideMimeType:function(a){s||(d.mimeType=a);return this},abort:function(a){a=a||"abort",p&&p.abort(a),w(0,a);return this}};h.promise(v),v.success=v.done,v.error=v.fail,v.complete=i.add,v.statusCode=function(a){if(a){var b;if(s<2)for(b in a)j[b]=[j[b],a[b]];else b=a[v.status],v.then(b,b)}return this},d.url=((a||d.url)+"").replace(bI,"").replace(bN,bY[1]+"//"),d.dataTypes=f.trim(d.dataType||"*").toLowerCase().split(bR),d.crossDomain==null&&(r=bT.exec(d.url.toLowerCase()),d.crossDomain=!(!r||r[1]==bY[1]&&r[2]==bY[2]&&(r[3]||(r[1]==="http:"?80:443))==(bY[3]||(bY[1]==="http:"?80:443)))),d.data&&d.processData&&typeof d.data!="string"&&(d.data=f.param(d.data,d.traditional)),ca(bV,d,c,v);if(s===2)return!1;t=d.global,d.type=d.type.toUpperCase(),d.hasContent=!bM.test(d.type),t&&f.active++===0&&f.event.trigger("ajaxStart");if(!d.hasContent){d.data&&(d.url+=(bO.test(d.url)?"&":"?")+d.data,delete d.data),k=d.url;if(d.cache===!1){var x=f.now(),y=d.url.replace(bS,"$1_="+x);d.url=y+(y===d.url?(bO.test(d.url)?"&":"?")+"_="+x:"")}}(d.data&&d.hasContent&&d.contentType!==!1||c.contentType)&&v.setRequestHeader("Content-Type",d.contentType),d.ifModified&&(k=k||d.url,f.lastModified[k]&&v.setRequestHeader("If-Modified-Since",f.lastModified[k]),f.etag[k]&&v.setRequestHeader("If-None-Match",f.etag[k])),v.setRequestHeader("Accept",d.dataTypes[0]&&d.accepts[d.dataTypes[0]]?d.accepts[d.dataTypes[0]]+(d.dataTypes[0]!=="*"?", "+bZ+"; q=0.01":""):d.accepts["*"]);for(u in d.headers)v.setRequestHeader(u,d.headers[u]);if(d.beforeSend&&(d.beforeSend.call(e,v,d)===!1||s===2)){v.abort();return!1}for(u in{success:1,error:1,complete:1})v[u](d[u]);p=ca(bW,d,c,v);if(!p)w(-1,"No Transport");else{v.readyState=1,t&&g.trigger("ajaxSend",[v,d]),d.async&&d.timeout>0&&(q=setTimeout(function(){v.abort("timeout")},d.timeout));try{s=1,p.send(l,w)}catch(z){s<2?w(-1,z):f.error(z)}}return v},param:function(a,c){var d=[],e=function(a,b){b=f.isFunction(b)?b():b,d[d.length]=encodeURIComponent(a)+"="+encodeURIComponent(b)};c===b&&(c=f.ajaxSettings.traditional);if(f.isArray(a)||a.jquery&&!f.isPlainObject(a))f.each(a,function(){e(this.name,this.value)});else for(var g in a)cc(g,a[g],c,e);return d.join("&").replace(bF,"+")}}),f.extend({active:0,lastModified:{},etag:{}});var cf=f.now(),cg=/(\=)\?(&|$)|\?\?/i;f.ajaxSetup({jsonp:"callback",jsonpCallback:function(){return f.expando+"_"+cf++}}),f.ajaxPrefilter("json jsonp",function(b,c,d){var e=b.contentType==="application/x-www-form-urlencoded"&&typeof b.data=="string";if(b.dataTypes[0]==="jsonp"||b.jsonp!==!1&&(cg.test(b.url)||e&&cg.test(b.data))){var g,h=b.jsonpCallback=f.isFunction(b.jsonpCallback)?b.jsonpCallback():b.jsonpCallback,i=a[h],j=b.url,k=b.data,l="$1"+h+"$2";b.jsonp!==!1&&(j=j.replace(cg,l),b.url===j&&(e&&(k=k.replace(cg,l)),b.data===k&&(j+=(/\?/.test(j)?"&":"?")+b.jsonp+"="+h))),b.url=j,b.data=k,a[h]=function(a){g=[a]},d.always(function(){a[h]=i,g&&f.isFunction(i)&&a[h](g[0])}),b.converters["script json"]=function(){g||f.error(h+" was not called");return g[0]},b.dataTypes[0]="json";return"script"}}),f.ajaxSetup({accepts:{script:"text/javascript, application/javascript, application/ecmascript, application/x-ecmascript"},contents:{script:/javascript|ecmascript/},converters:{"text script":function(a){f.globalEval(a);return a}}}),f.ajaxPrefilter("script",function(a){a.cache===b&&(a.cache=!1),a.crossDomain&&(a.type="GET",a.global=!1)}),f.ajaxTransport("script",function(a){if(a.crossDomain){var d,e=c.head||c.getElementsByTagName("head")[0]||c.documentElement;return{send:function(f,g){d=c.createElement("script"),d.async="async",a.scriptCharset&&(d.charset=a.scriptCharset),d.src=a.url,d.onload=d.onreadystatechange=function(a,c){if(c||!d.readyState||/loaded|complete/.test(d.readyState))d.onload=d.onreadystatechange=null,e&&d.parentNode&&e.removeChild(d),d=b,c||g(200,"success")},e.insertBefore(d,e.firstChild)},abort:function(){d&&d.onload(0,1)}}}});var ch=a.ActiveXObject?function(){for(var a in cj)cj[a](0,1)}:!1,ci=0,cj;f.ajaxSettings.xhr=a.ActiveXObject?function(){return!this.isLocal&&ck()||cl()}:ck,function(a){f.extend(f.support,{ajax:!!a,cors:!!a&&"withCredentials"in a})}(f.ajaxSettings.xhr()),f.support.ajax&&f.ajaxTransport(function(c){if(!c.crossDomain||f.support.cors){var d;return{send:function(e,g){var h=c.xhr(),i,j;c.username?h.open(c.type,c.url,c.async,c.username,c.password):h.open(c.type,c.url,c.async);if(c.xhrFields)for(j in c.xhrFields)h[j]=c.xhrFields[j];c.mimeType&&h.overrideMimeType&&h.overrideMimeType(c.mimeType),!c.crossDomain&&!e["X-Requested-With"]&&(e["X-Requested-With"]="XMLHttpRequest");try{for(j in e)h.setRequestHeader(j,e[j])}catch(k){}h.send(c.hasContent&&c.data||null),d=function(a,e){var j,k,l,m,n;try{if(d&&(e||h.readyState===4)){d=b,i&&(h.onreadystatechange=f.noop,ch&&delete cj[i]);if(e)h.readyState!==4&&h.abort();else{j=h.status,l=h.getAllResponseHeaders(),m={},n=h.responseXML,n&&n.documentElement&&(m.xml=n),m.text=h.responseText;try{k=h.statusText}catch(o){k=""}!j&&c.isLocal&&!c.crossDomain?j=m.text?200:404:j===1223&&(j=204)}}}catch(p){e||g(-1,p)}m&&g(j,k,m,l)},!c.async||h.readyState===4?d():(i=++ci,ch&&(cj||(cj={},f(a).unload(ch)),cj[i]=d),h.onreadystatechange=d)},abort:function(){d&&d(0,1)}}}});var cm={},cn,co,cp=/^(?:toggle|show|hide)$/,cq=/^([+\-]=)?([\d+.\-]+)([a-z%]*)$/i,cr,cs=[["height","marginTop","marginBottom","paddingTop","paddingBottom"],["width","marginLeft","marginRight","paddingLeft","paddingRight"],["opacity"]],ct;f.fn.extend({show:function(a,b,c){var d,e;if(a||a===0)return this.animate(cw("show",3),a,b,c);for(var g=0,h=this.length;g=i.duration+this.startTime){this.now=this.end,this.pos=this.state=1,this.update(),i.animatedProperties[this.prop]=!0;for(b in i.animatedProperties)i.animatedProperties[b]!==!0&&(g=!1);if(g){i.overflow!=null&&!f.support.shrinkWrapBlocks&&f.each(["","X","Y"],function(a,b){h.style["overflow"+b]=i.overflow[a]}),i.hide&&f(h).hide();if(i.hide||i.show)for(b in i.animatedProperties)f.style(h,b,i.orig[b]),f.removeData(h,"fxshow"+b,!0),f.removeData(h,"toggle"+b,!0);d=i.complete,d&&(i.complete=!1,d.call(h))}return!1}i.duration==Infinity?this.now=e:(c=e-this.startTime,this.state=c/i.duration,this.pos=f.easing[i.animatedProperties[this.prop]](this.state,c,0,1,i.duration),this.now=this.start+(this.end-this.start)*this.pos),this.update();return!0}},f.extend(f.fx,{tick:function(){var a,b=f.timers,c=0;for(;c-1,k={},l={},m,n;j?(l=e.position(),m=l.top,n=l.left):(m=parseFloat(h)||0,n=parseFloat(i)||0),f.isFunction(b)&&(b=b.call(a,c,g)),b.top!=null&&(k.top=b.top-g.top+m),b.left!=null&&(k.left=b.left-g.left+n),"using"in b?b.using.call(a,k):e.css(k)}},f.fn.extend({position:function(){if(!this[0])return null;var a=this[0],b=this.offsetParent(),c=this.offset(),d=cz.test(b[0].nodeName)?{top:0,left:0}:b.offset();c.top-=parseFloat(f.css(a,"marginTop"))||0,c.left-=parseFloat(f.css(a,"marginLeft"))||0,d.top+=parseFloat(f.css(b[0],"borderTopWidth"))||0,d.left+=parseFloat(f.css(b[0],"borderLeftWidth"))||0;return{top:c.top-d.top,left:c.left-d.left}},offsetParent:function(){return this.map(function(){var a=this.offsetParent||c.body;while(a&&!cz.test(a.nodeName)&&f.css(a,"position")==="static")a=a.offsetParent;return a})}}),f.each(["Left","Top"],function(a,c){var d="scroll"+c;f.fn[d]=function(c){var e,g;if(c===b){e=this[0];if(!e)return null;g=cA(e);return g?"pageXOffset"in g?g[a?"pageYOffset":"pageXOffset"]:f.support.boxModel&&g.document.documentElement[d]||g.document.body[d]:e[d]}return this.each(function(){g=cA(this),g?g.scrollTo(a?f(g).scrollLeft():c,a?c:f(g).scrollTop()):this[d]=c})}}),f.each(["Height","Width"],function(a,c){var d=c.toLowerCase();f.fn["inner"+c]=function(){var a=this[0];return a?a.style?parseFloat(f.css(a,d,"padding")):this[d]():null},f.fn["outer"+c]=function(a){var b=this[0];return b?b.style?parseFloat(f.css(b,d,a?"margin":"border")):this[d]():null},f.fn[d]=function(a){var e=this[0];if(!e)return a==null?null:this;if(f.isFunction(a))return this.each(function(b){var c=f(this);c[d](a.call(this,b,c[d]()))});if(f.isWindow(e)){var g=e.document.documentElement["client"+c],h=e.document.body;return e.document.compatMode==="CSS1Compat"&&g||h&&h["client"+c]||g}if(e.nodeType===9)return Math.max(e.documentElement["client"+c],e.body["scroll"+c],e.documentElement["scroll"+c],e.body["offset"+c],e.documentElement["offset"+c]);if(a===b){var i=f.css(e,d),j=parseFloat(i);return f.isNumeric(j)?j:i}return this.css(d,typeof a=="string"?a:a+"px")}}),a.jQuery=a.$=f})(window); \ No newline at end of file diff --git a/src/views/htmlcontent/src/app/libs/SlickGrid/lib/jquery-ui-1.8.16.custom.min.js b/src/views/htmlcontent/src/app/libs/SlickGrid/lib/jquery-ui-1.8.16.custom.min.js new file mode 100644 index 0000000000..7e3093a59f --- /dev/null +++ b/src/views/htmlcontent/src/app/libs/SlickGrid/lib/jquery-ui-1.8.16.custom.min.js @@ -0,0 +1,611 @@ +/*! + * jQuery UI 1.8.16 + * + * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about) + * Dual licensed under the MIT or GPL Version 2 licenses. + * http://jquery.org/license + * + * http://docs.jquery.com/UI + */ +(function(c,j){function k(a,b){var d=a.nodeName.toLowerCase();if("area"===d){b=a.parentNode;d=b.name;if(!a.href||!d||b.nodeName.toLowerCase()!=="map")return false;a=c("img[usemap=#"+d+"]")[0];return!!a&&l(a)}return(/input|select|textarea|button|object/.test(d)?!a.disabled:"a"==d?a.href||b:b)&&l(a)}function l(a){return!c(a).parents().andSelf().filter(function(){return c.curCSS(this,"visibility")==="hidden"||c.expr.filters.hidden(this)}).length}c.ui=c.ui||{};if(!c.ui.version){c.extend(c.ui,{version:"1.8.16", +keyCode:{ALT:18,BACKSPACE:8,CAPS_LOCK:20,COMMA:188,COMMAND:91,COMMAND_LEFT:91,COMMAND_RIGHT:93,CONTROL:17,DELETE:46,DOWN:40,END:35,ENTER:13,ESCAPE:27,HOME:36,INSERT:45,LEFT:37,MENU:93,NUMPAD_ADD:107,NUMPAD_DECIMAL:110,NUMPAD_DIVIDE:111,NUMPAD_ENTER:108,NUMPAD_MULTIPLY:106,NUMPAD_SUBTRACT:109,PAGE_DOWN:34,PAGE_UP:33,PERIOD:190,RIGHT:39,SHIFT:16,SPACE:32,TAB:9,UP:38,WINDOWS:91}});c.fn.extend({propAttr:c.fn.prop||c.fn.attr,_focus:c.fn.focus,focus:function(a,b){return typeof a==="number"?this.each(function(){var d= +this;setTimeout(function(){c(d).focus();b&&b.call(d)},a)}):this._focus.apply(this,arguments)},scrollParent:function(){var a;a=c.browser.msie&&/(static|relative)/.test(this.css("position"))||/absolute/.test(this.css("position"))?this.parents().filter(function(){return/(relative|absolute|fixed)/.test(c.curCSS(this,"position",1))&&/(auto|scroll)/.test(c.curCSS(this,"overflow",1)+c.curCSS(this,"overflow-y",1)+c.curCSS(this,"overflow-x",1))}).eq(0):this.parents().filter(function(){return/(auto|scroll)/.test(c.curCSS(this, +"overflow",1)+c.curCSS(this,"overflow-y",1)+c.curCSS(this,"overflow-x",1))}).eq(0);return/fixed/.test(this.css("position"))||!a.length?c(document):a},zIndex:function(a){if(a!==j)return this.css("zIndex",a);if(this.length){a=c(this[0]);for(var b;a.length&&a[0]!==document;){b=a.css("position");if(b==="absolute"||b==="relative"||b==="fixed"){b=parseInt(a.css("zIndex"),10);if(!isNaN(b)&&b!==0)return b}a=a.parent()}}return 0},disableSelection:function(){return this.bind((c.support.selectstart?"selectstart": +"mousedown")+".ui-disableSelection",function(a){a.preventDefault()})},enableSelection:function(){return this.unbind(".ui-disableSelection")}});c.each(["Width","Height"],function(a,b){function d(f,g,m,n){c.each(e,function(){g-=parseFloat(c.curCSS(f,"padding"+this,true))||0;if(m)g-=parseFloat(c.curCSS(f,"border"+this+"Width",true))||0;if(n)g-=parseFloat(c.curCSS(f,"margin"+this,true))||0});return g}var e=b==="Width"?["Left","Right"]:["Top","Bottom"],h=b.toLowerCase(),i={innerWidth:c.fn.innerWidth,innerHeight:c.fn.innerHeight, +outerWidth:c.fn.outerWidth,outerHeight:c.fn.outerHeight};c.fn["inner"+b]=function(f){if(f===j)return i["inner"+b].call(this);return this.each(function(){c(this).css(h,d(this,f)+"px")})};c.fn["outer"+b]=function(f,g){if(typeof f!=="number")return i["outer"+b].call(this,f);return this.each(function(){c(this).css(h,d(this,f,true,g)+"px")})}});c.extend(c.expr[":"],{data:function(a,b,d){return!!c.data(a,d[3])},focusable:function(a){return k(a,!isNaN(c.attr(a,"tabindex")))},tabbable:function(a){var b=c.attr(a, +"tabindex"),d=isNaN(b);return(d||b>=0)&&k(a,!d)}});c(function(){var a=document.body,b=a.appendChild(b=document.createElement("div"));c.extend(b.style,{minHeight:"100px",height:"auto",padding:0,borderWidth:0});c.support.minHeight=b.offsetHeight===100;c.support.selectstart="onselectstart"in b;a.removeChild(b).style.display="none"});c.extend(c.ui,{plugin:{add:function(a,b,d){a=c.ui[a].prototype;for(var e in d){a.plugins[e]=a.plugins[e]||[];a.plugins[e].push([b,d[e]])}},call:function(a,b,d){if((b=a.plugins[b])&& +a.element[0].parentNode)for(var e=0;e0)return true;a[b]=1;d=a[b]>0;a[b]=0;return d},isOverAxis:function(a,b,d){return a>b&&a=9)&&!a.button)return this._mouseUp(a);if(this._mouseStarted){this._mouseDrag(a);return a.preventDefault()}if(this._mouseDistanceMet(a)&&this._mouseDelayMet(a))(this._mouseStarted=this._mouseStart(this._mouseDownEvent,a)!==false)?this._mouseDrag(a):this._mouseUp(a);return!this._mouseStarted},_mouseUp:function(a){b(document).unbind("mousemove."+this.widgetName,this._mouseMoveDelegate).unbind("mouseup."+this.widgetName,this._mouseUpDelegate);if(this._mouseStarted){this._mouseStarted= +false;a.target==this._mouseDownEvent.target&&b.data(a.target,this.widgetName+".preventClickEvent",true);this._mouseStop(a)}return false},_mouseDistanceMet:function(a){return Math.max(Math.abs(this._mouseDownEvent.pageX-a.pageX),Math.abs(this._mouseDownEvent.pageY-a.pageY))>=this.options.distance},_mouseDelayMet:function(){return this.mouseDelayMet},_mouseStart:function(){},_mouseDrag:function(){},_mouseStop:function(){},_mouseCapture:function(){return true}})})(jQuery); +;/* + * jQuery UI Position 1.8.16 + * + * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about) + * Dual licensed under the MIT or GPL Version 2 licenses. + * http://jquery.org/license + * + * http://docs.jquery.com/UI/Position + */ +(function(c){c.ui=c.ui||{};var n=/left|center|right/,o=/top|center|bottom/,t=c.fn.position,u=c.fn.offset;c.fn.position=function(b){if(!b||!b.of)return t.apply(this,arguments);b=c.extend({},b);var a=c(b.of),d=a[0],g=(b.collision||"flip").split(" "),e=b.offset?b.offset.split(" "):[0,0],h,k,j;if(d.nodeType===9){h=a.width();k=a.height();j={top:0,left:0}}else if(d.setTimeout){h=a.width();k=a.height();j={top:a.scrollTop(),left:a.scrollLeft()}}else if(d.preventDefault){b.at="left top";h=k=0;j={top:b.of.pageY, +left:b.of.pageX}}else{h=a.outerWidth();k=a.outerHeight();j=a.offset()}c.each(["my","at"],function(){var f=(b[this]||"").split(" ");if(f.length===1)f=n.test(f[0])?f.concat(["center"]):o.test(f[0])?["center"].concat(f):["center","center"];f[0]=n.test(f[0])?f[0]:"center";f[1]=o.test(f[1])?f[1]:"center";b[this]=f});if(g.length===1)g[1]=g[0];e[0]=parseInt(e[0],10)||0;if(e.length===1)e[1]=e[0];e[1]=parseInt(e[1],10)||0;if(b.at[0]==="right")j.left+=h;else if(b.at[0]==="center")j.left+=h/2;if(b.at[1]==="bottom")j.top+= +k;else if(b.at[1]==="center")j.top+=k/2;j.left+=e[0];j.top+=e[1];return this.each(function(){var f=c(this),l=f.outerWidth(),m=f.outerHeight(),p=parseInt(c.curCSS(this,"marginLeft",true))||0,q=parseInt(c.curCSS(this,"marginTop",true))||0,v=l+p+(parseInt(c.curCSS(this,"marginRight",true))||0),w=m+q+(parseInt(c.curCSS(this,"marginBottom",true))||0),i=c.extend({},j),r;if(b.my[0]==="right")i.left-=l;else if(b.my[0]==="center")i.left-=l/2;if(b.my[1]==="bottom")i.top-=m;else if(b.my[1]==="center")i.top-= +m/2;i.left=Math.round(i.left);i.top=Math.round(i.top);r={left:i.left-p,top:i.top-q};c.each(["left","top"],function(s,x){c.ui.position[g[s]]&&c.ui.position[g[s]][x](i,{targetWidth:h,targetHeight:k,elemWidth:l,elemHeight:m,collisionPosition:r,collisionWidth:v,collisionHeight:w,offset:e,my:b.my,at:b.at})});c.fn.bgiframe&&f.bgiframe();f.offset(c.extend(i,{using:b.using}))})};c.ui.position={fit:{left:function(b,a){var d=c(window);d=a.collisionPosition.left+a.collisionWidth-d.width()-d.scrollLeft();b.left= +d>0?b.left-d:Math.max(b.left-a.collisionPosition.left,b.left)},top:function(b,a){var d=c(window);d=a.collisionPosition.top+a.collisionHeight-d.height()-d.scrollTop();b.top=d>0?b.top-d:Math.max(b.top-a.collisionPosition.top,b.top)}},flip:{left:function(b,a){if(a.at[0]!=="center"){var d=c(window);d=a.collisionPosition.left+a.collisionWidth-d.width()-d.scrollLeft();var g=a.my[0]==="left"?-a.elemWidth:a.my[0]==="right"?a.elemWidth:0,e=a.at[0]==="left"?a.targetWidth:-a.targetWidth,h=-2*a.offset[0];b.left+= +a.collisionPosition.left<0?g+e+h:d>0?g+e+h:0}},top:function(b,a){if(a.at[1]!=="center"){var d=c(window);d=a.collisionPosition.top+a.collisionHeight-d.height()-d.scrollTop();var g=a.my[1]==="top"?-a.elemHeight:a.my[1]==="bottom"?a.elemHeight:0,e=a.at[1]==="top"?a.targetHeight:-a.targetHeight,h=-2*a.offset[1];b.top+=a.collisionPosition.top<0?g+e+h:d>0?g+e+h:0}}}};if(!c.offset.setOffset){c.offset.setOffset=function(b,a){if(/static/.test(c.curCSS(b,"position")))b.style.position="relative";var d=c(b), +g=d.offset(),e=parseInt(c.curCSS(b,"top",true),10)||0,h=parseInt(c.curCSS(b,"left",true),10)||0;g={top:a.top-g.top+e,left:a.left-g.left+h};"using"in a?a.using.call(b,g):d.css(g)};c.fn.offset=function(b){var a=this[0];if(!a||!a.ownerDocument)return null;if(b)return this.each(function(){c.offset.setOffset(this,b)});return u.call(this)}}})(jQuery); +;/* + * jQuery UI Draggable 1.8.16 + * + * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about) + * Dual licensed under the MIT or GPL Version 2 licenses. + * http://jquery.org/license + * + * http://docs.jquery.com/UI/Draggables + * + * Depends: + * jquery.ui.core.js + * jquery.ui.mouse.js + * jquery.ui.widget.js + */ +(function(d){d.widget("ui.draggable",d.ui.mouse,{widgetEventPrefix:"drag",options:{addClasses:true,appendTo:"parent",axis:false,connectToSortable:false,containment:false,cursor:"auto",cursorAt:false,grid:false,handle:false,helper:"original",iframeFix:false,opacity:false,refreshPositions:false,revert:false,revertDuration:500,scope:"default",scroll:true,scrollSensitivity:20,scrollSpeed:20,snap:false,snapMode:"both",snapTolerance:20,stack:false,zIndex:false},_create:function(){if(this.options.helper== +"original"&&!/^(?:r|a|f)/.test(this.element.css("position")))this.element[0].style.position="relative";this.options.addClasses&&this.element.addClass("ui-draggable");this.options.disabled&&this.element.addClass("ui-draggable-disabled");this._mouseInit()},destroy:function(){if(this.element.data("draggable")){this.element.removeData("draggable").unbind(".draggable").removeClass("ui-draggable ui-draggable-dragging ui-draggable-disabled");this._mouseDestroy();return this}},_mouseCapture:function(a){var b= +this.options;if(this.helper||b.disabled||d(a.target).is(".ui-resizable-handle"))return false;this.handle=this._getHandle(a);if(!this.handle)return false;if(b.iframeFix)d(b.iframeFix===true?"iframe":b.iframeFix).each(function(){d('
    ').css({width:this.offsetWidth+"px",height:this.offsetHeight+"px",position:"absolute",opacity:"0.001",zIndex:1E3}).css(d(this).offset()).appendTo("body")});return true},_mouseStart:function(a){var b=this.options; +this.helper=this._createHelper(a);this._cacheHelperProportions();if(d.ui.ddmanager)d.ui.ddmanager.current=this;this._cacheMargins();this.cssPosition=this.helper.css("position");this.scrollParent=this.helper.scrollParent();this.offset=this.positionAbs=this.element.offset();this.offset={top:this.offset.top-this.margins.top,left:this.offset.left-this.margins.left};d.extend(this.offset,{click:{left:a.pageX-this.offset.left,top:a.pageY-this.offset.top},parent:this._getParentOffset(),relative:this._getRelativeOffset()}); +this.originalPosition=this.position=this._generatePosition(a);this.originalPageX=a.pageX;this.originalPageY=a.pageY;b.cursorAt&&this._adjustOffsetFromHelper(b.cursorAt);b.containment&&this._setContainment();if(this._trigger("start",a)===false){this._clear();return false}this._cacheHelperProportions();d.ui.ddmanager&&!b.dropBehaviour&&d.ui.ddmanager.prepareOffsets(this,a);this.helper.addClass("ui-draggable-dragging");this._mouseDrag(a,true);d.ui.ddmanager&&d.ui.ddmanager.dragStart(this,a);return true}, +_mouseDrag:function(a,b){this.position=this._generatePosition(a);this.positionAbs=this._convertPositionTo("absolute");if(!b){b=this._uiHash();if(this._trigger("drag",a,b)===false){this._mouseUp({});return false}this.position=b.position}if(!this.options.axis||this.options.axis!="y")this.helper[0].style.left=this.position.left+"px";if(!this.options.axis||this.options.axis!="x")this.helper[0].style.top=this.position.top+"px";d.ui.ddmanager&&d.ui.ddmanager.drag(this,a);return false},_mouseStop:function(a){var b= +false;if(d.ui.ddmanager&&!this.options.dropBehaviour)b=d.ui.ddmanager.drop(this,a);if(this.dropped){b=this.dropped;this.dropped=false}if((!this.element[0]||!this.element[0].parentNode)&&this.options.helper=="original")return false;if(this.options.revert=="invalid"&&!b||this.options.revert=="valid"&&b||this.options.revert===true||d.isFunction(this.options.revert)&&this.options.revert.call(this.element,b)){var c=this;d(this.helper).animate(this.originalPosition,parseInt(this.options.revertDuration, +10),function(){c._trigger("stop",a)!==false&&c._clear()})}else this._trigger("stop",a)!==false&&this._clear();return false},_mouseUp:function(a){this.options.iframeFix===true&&d("div.ui-draggable-iframeFix").each(function(){this.parentNode.removeChild(this)});d.ui.ddmanager&&d.ui.ddmanager.dragStop(this,a);return d.ui.mouse.prototype._mouseUp.call(this,a)},cancel:function(){this.helper.is(".ui-draggable-dragging")?this._mouseUp({}):this._clear();return this},_getHandle:function(a){var b=!this.options.handle|| +!d(this.options.handle,this.element).length?true:false;d(this.options.handle,this.element).find("*").andSelf().each(function(){if(this==a.target)b=true});return b},_createHelper:function(a){var b=this.options;a=d.isFunction(b.helper)?d(b.helper.apply(this.element[0],[a])):b.helper=="clone"?this.element.clone().removeAttr("id"):this.element;a.parents("body").length||a.appendTo(b.appendTo=="parent"?this.element[0].parentNode:b.appendTo);a[0]!=this.element[0]&&!/(fixed|absolute)/.test(a.css("position"))&& +a.css("position","absolute");return a},_adjustOffsetFromHelper:function(a){if(typeof a=="string")a=a.split(" ");if(d.isArray(a))a={left:+a[0],top:+a[1]||0};if("left"in a)this.offset.click.left=a.left+this.margins.left;if("right"in a)this.offset.click.left=this.helperProportions.width-a.right+this.margins.left;if("top"in a)this.offset.click.top=a.top+this.margins.top;if("bottom"in a)this.offset.click.top=this.helperProportions.height-a.bottom+this.margins.top},_getParentOffset:function(){this.offsetParent= +this.helper.offsetParent();var a=this.offsetParent.offset();if(this.cssPosition=="absolute"&&this.scrollParent[0]!=document&&d.ui.contains(this.scrollParent[0],this.offsetParent[0])){a.left+=this.scrollParent.scrollLeft();a.top+=this.scrollParent.scrollTop()}if(this.offsetParent[0]==document.body||this.offsetParent[0].tagName&&this.offsetParent[0].tagName.toLowerCase()=="html"&&d.browser.msie)a={top:0,left:0};return{top:a.top+(parseInt(this.offsetParent.css("borderTopWidth"),10)||0),left:a.left+(parseInt(this.offsetParent.css("borderLeftWidth"), +10)||0)}},_getRelativeOffset:function(){if(this.cssPosition=="relative"){var a=this.element.position();return{top:a.top-(parseInt(this.helper.css("top"),10)||0)+this.scrollParent.scrollTop(),left:a.left-(parseInt(this.helper.css("left"),10)||0)+this.scrollParent.scrollLeft()}}else return{top:0,left:0}},_cacheMargins:function(){this.margins={left:parseInt(this.element.css("marginLeft"),10)||0,top:parseInt(this.element.css("marginTop"),10)||0,right:parseInt(this.element.css("marginRight"),10)||0,bottom:parseInt(this.element.css("marginBottom"), +10)||0}},_cacheHelperProportions:function(){this.helperProportions={width:this.helper.outerWidth(),height:this.helper.outerHeight()}},_setContainment:function(){var a=this.options;if(a.containment=="parent")a.containment=this.helper[0].parentNode;if(a.containment=="document"||a.containment=="window")this.containment=[a.containment=="document"?0:d(window).scrollLeft()-this.offset.relative.left-this.offset.parent.left,a.containment=="document"?0:d(window).scrollTop()-this.offset.relative.top-this.offset.parent.top, +(a.containment=="document"?0:d(window).scrollLeft())+d(a.containment=="document"?document:window).width()-this.helperProportions.width-this.margins.left,(a.containment=="document"?0:d(window).scrollTop())+(d(a.containment=="document"?document:window).height()||document.body.parentNode.scrollHeight)-this.helperProportions.height-this.margins.top];if(!/^(document|window|parent)$/.test(a.containment)&&a.containment.constructor!=Array){a=d(a.containment);var b=a[0];if(b){a.offset();var c=d(b).css("overflow")!= +"hidden";this.containment=[(parseInt(d(b).css("borderLeftWidth"),10)||0)+(parseInt(d(b).css("paddingLeft"),10)||0),(parseInt(d(b).css("borderTopWidth"),10)||0)+(parseInt(d(b).css("paddingTop"),10)||0),(c?Math.max(b.scrollWidth,b.offsetWidth):b.offsetWidth)-(parseInt(d(b).css("borderLeftWidth"),10)||0)-(parseInt(d(b).css("paddingRight"),10)||0)-this.helperProportions.width-this.margins.left-this.margins.right,(c?Math.max(b.scrollHeight,b.offsetHeight):b.offsetHeight)-(parseInt(d(b).css("borderTopWidth"), +10)||0)-(parseInt(d(b).css("paddingBottom"),10)||0)-this.helperProportions.height-this.margins.top-this.margins.bottom];this.relative_container=a}}else if(a.containment.constructor==Array)this.containment=a.containment},_convertPositionTo:function(a,b){if(!b)b=this.position;a=a=="absolute"?1:-1;var c=this.cssPosition=="absolute"&&!(this.scrollParent[0]!=document&&d.ui.contains(this.scrollParent[0],this.offsetParent[0]))?this.offsetParent:this.scrollParent,f=/(html|body)/i.test(c[0].tagName);return{top:b.top+ +this.offset.relative.top*a+this.offset.parent.top*a-(d.browser.safari&&d.browser.version<526&&this.cssPosition=="fixed"?0:(this.cssPosition=="fixed"?-this.scrollParent.scrollTop():f?0:c.scrollTop())*a),left:b.left+this.offset.relative.left*a+this.offset.parent.left*a-(d.browser.safari&&d.browser.version<526&&this.cssPosition=="fixed"?0:(this.cssPosition=="fixed"?-this.scrollParent.scrollLeft():f?0:c.scrollLeft())*a)}},_generatePosition:function(a){var b=this.options,c=this.cssPosition=="absolute"&& +!(this.scrollParent[0]!=document&&d.ui.contains(this.scrollParent[0],this.offsetParent[0]))?this.offsetParent:this.scrollParent,f=/(html|body)/i.test(c[0].tagName),e=a.pageX,h=a.pageY;if(this.originalPosition){var g;if(this.containment){if(this.relative_container){g=this.relative_container.offset();g=[this.containment[0]+g.left,this.containment[1]+g.top,this.containment[2]+g.left,this.containment[3]+g.top]}else g=this.containment;if(a.pageX-this.offset.click.leftg[2])e=g[2]+this.offset.click.left;if(a.pageY-this.offset.click.top>g[3])h=g[3]+this.offset.click.top}if(b.grid){h=b.grid[1]?this.originalPageY+Math.round((h-this.originalPageY)/b.grid[1])*b.grid[1]:this.originalPageY;h=g?!(h-this.offset.click.topg[3])?h:!(h-this.offset.click.topg[2])?e:!(e-this.offset.click.left=0;i--){var j=c.snapElements[i].left,l=j+c.snapElements[i].width,k=c.snapElements[i].top,m=k+c.snapElements[i].height;if(j-e=j&&f<=l||h>=j&&h<=l||fl)&&(e>= +i&&e<=k||g>=i&&g<=k||ek);default:return false}};d.ui.ddmanager={current:null,droppables:{"default":[]},prepareOffsets:function(a,b){var c=d.ui.ddmanager.droppables[a.options.scope]||[],e=b?b.type:null,g=(a.currentItem||a.element).find(":data(droppable)").andSelf(),f=0;a:for(;f
    ').css({position:this.element.css("position"),width:this.element.outerWidth(),height:this.element.outerHeight(), +top:this.element.css("top"),left:this.element.css("left")}));this.element=this.element.parent().data("resizable",this.element.data("resizable"));this.elementIsWrapper=true;this.element.css({marginLeft:this.originalElement.css("marginLeft"),marginTop:this.originalElement.css("marginTop"),marginRight:this.originalElement.css("marginRight"),marginBottom:this.originalElement.css("marginBottom")});this.originalElement.css({marginLeft:0,marginTop:0,marginRight:0,marginBottom:0});this.originalResizeStyle= +this.originalElement.css("resize");this.originalElement.css("resize","none");this._proportionallyResizeElements.push(this.originalElement.css({position:"static",zoom:1,display:"block"}));this.originalElement.css({margin:this.originalElement.css("margin")});this._proportionallyResize()}this.handles=a.handles||(!e(".ui-resizable-handle",this.element).length?"e,s,se":{n:".ui-resizable-n",e:".ui-resizable-e",s:".ui-resizable-s",w:".ui-resizable-w",se:".ui-resizable-se",sw:".ui-resizable-sw",ne:".ui-resizable-ne", +nw:".ui-resizable-nw"});if(this.handles.constructor==String){if(this.handles=="all")this.handles="n,e,s,w,se,sw,ne,nw";var c=this.handles.split(",");this.handles={};for(var d=0;d');/sw|se|ne|nw/.test(f)&&g.css({zIndex:++a.zIndex});"se"==f&&g.addClass("ui-icon ui-icon-gripsmall-diagonal-se");this.handles[f]=".ui-resizable-"+f;this.element.append(g)}}this._renderAxis=function(h){h=h||this.element;for(var i in this.handles){if(this.handles[i].constructor== +String)this.handles[i]=e(this.handles[i],this.element).show();if(this.elementIsWrapper&&this.originalElement[0].nodeName.match(/textarea|input|select|button/i)){var j=e(this.handles[i],this.element),l=0;l=/sw|ne|nw|se|n|s/.test(i)?j.outerHeight():j.outerWidth();j=["padding",/ne|nw|n/.test(i)?"Top":/se|sw|s/.test(i)?"Bottom":/^e$/.test(i)?"Right":"Left"].join("");h.css(j,l);this._proportionallyResize()}e(this.handles[i])}};this._renderAxis(this.element);this._handles=e(".ui-resizable-handle",this.element).disableSelection(); +this._handles.mouseover(function(){if(!b.resizing){if(this.className)var h=this.className.match(/ui-resizable-(se|sw|ne|nw|n|e|s|w)/i);b.axis=h&&h[1]?h[1]:"se"}});if(a.autoHide){this._handles.hide();e(this.element).addClass("ui-resizable-autohide").hover(function(){if(!a.disabled){e(this).removeClass("ui-resizable-autohide");b._handles.show()}},function(){if(!a.disabled)if(!b.resizing){e(this).addClass("ui-resizable-autohide");b._handles.hide()}})}this._mouseInit()},destroy:function(){this._mouseDestroy(); +var b=function(c){e(c).removeClass("ui-resizable ui-resizable-disabled ui-resizable-resizing").removeData("resizable").unbind(".resizable").find(".ui-resizable-handle").remove()};if(this.elementIsWrapper){b(this.element);var a=this.element;a.after(this.originalElement.css({position:a.css("position"),width:a.outerWidth(),height:a.outerHeight(),top:a.css("top"),left:a.css("left")})).remove()}this.originalElement.css("resize",this.originalResizeStyle);b(this.originalElement);return this},_mouseCapture:function(b){var a= +false;for(var c in this.handles)if(e(this.handles[c])[0]==b.target)a=true;return!this.options.disabled&&a},_mouseStart:function(b){var a=this.options,c=this.element.position(),d=this.element;this.resizing=true;this.documentScroll={top:e(document).scrollTop(),left:e(document).scrollLeft()};if(d.is(".ui-draggable")||/absolute/.test(d.css("position")))d.css({position:"absolute",top:c.top,left:c.left});e.browser.opera&&/relative/.test(d.css("position"))&&d.css({position:"relative",top:"auto",left:"auto"}); +this._renderProxy();c=m(this.helper.css("left"));var f=m(this.helper.css("top"));if(a.containment){c+=e(a.containment).scrollLeft()||0;f+=e(a.containment).scrollTop()||0}this.offset=this.helper.offset();this.position={left:c,top:f};this.size=this._helper?{width:d.outerWidth(),height:d.outerHeight()}:{width:d.width(),height:d.height()};this.originalSize=this._helper?{width:d.outerWidth(),height:d.outerHeight()}:{width:d.width(),height:d.height()};this.originalPosition={left:c,top:f};this.sizeDiff= +{width:d.outerWidth()-d.width(),height:d.outerHeight()-d.height()};this.originalMousePosition={left:b.pageX,top:b.pageY};this.aspectRatio=typeof a.aspectRatio=="number"?a.aspectRatio:this.originalSize.width/this.originalSize.height||1;a=e(".ui-resizable-"+this.axis).css("cursor");e("body").css("cursor",a=="auto"?this.axis+"-resize":a);d.addClass("ui-resizable-resizing");this._propagate("start",b);return true},_mouseDrag:function(b){var a=this.helper,c=this.originalMousePosition,d=this._change[this.axis]; +if(!d)return false;c=d.apply(this,[b,b.pageX-c.left||0,b.pageY-c.top||0]);this._updateVirtualBoundaries(b.shiftKey);if(this._aspectRatio||b.shiftKey)c=this._updateRatio(c,b);c=this._respectSize(c,b);this._propagate("resize",b);a.css({top:this.position.top+"px",left:this.position.left+"px",width:this.size.width+"px",height:this.size.height+"px"});!this._helper&&this._proportionallyResizeElements.length&&this._proportionallyResize();this._updateCache(c);this._trigger("resize",b,this.ui());return false}, +_mouseStop:function(b){this.resizing=false;var a=this.options,c=this;if(this._helper){var d=this._proportionallyResizeElements,f=d.length&&/textarea/i.test(d[0].nodeName);d=f&&e.ui.hasScroll(d[0],"left")?0:c.sizeDiff.height;f=f?0:c.sizeDiff.width;f={width:c.helper.width()-f,height:c.helper.height()-d};d=parseInt(c.element.css("left"),10)+(c.position.left-c.originalPosition.left)||null;var g=parseInt(c.element.css("top"),10)+(c.position.top-c.originalPosition.top)||null;a.animate||this.element.css(e.extend(f, +{top:g,left:d}));c.helper.height(c.size.height);c.helper.width(c.size.width);this._helper&&!a.animate&&this._proportionallyResize()}e("body").css("cursor","auto");this.element.removeClass("ui-resizable-resizing");this._propagate("stop",b);this._helper&&this.helper.remove();return false},_updateVirtualBoundaries:function(b){var a=this.options,c,d,f;a={minWidth:k(a.minWidth)?a.minWidth:0,maxWidth:k(a.maxWidth)?a.maxWidth:Infinity,minHeight:k(a.minHeight)?a.minHeight:0,maxHeight:k(a.maxHeight)?a.maxHeight: +Infinity};if(this._aspectRatio||b){b=a.minHeight*this.aspectRatio;d=a.minWidth/this.aspectRatio;c=a.maxHeight*this.aspectRatio;f=a.maxWidth/this.aspectRatio;if(b>a.minWidth)a.minWidth=b;if(d>a.minHeight)a.minHeight=d;if(cb.width,h=k(b.height)&&a.minHeight&&a.minHeight>b.height;if(g)b.width=a.minWidth;if(h)b.height=a.minHeight;if(d)b.width=a.maxWidth;if(f)b.height=a.maxHeight;var i=this.originalPosition.left+this.originalSize.width,j=this.position.top+this.size.height,l=/sw|nw|w/.test(c);c=/nw|ne|n/.test(c);if(g&&l)b.left=i-a.minWidth;if(d&&l)b.left=i-a.maxWidth;if(h&&c)b.top=j-a.minHeight;if(f&&c)b.top=j-a.maxHeight;if((a=!b.width&&!b.height)&&!b.left&&b.top)b.top=null;else if(a&&!b.top&&b.left)b.left= +null;return b},_proportionallyResize:function(){if(this._proportionallyResizeElements.length)for(var b=this.helper||this.element,a=0;a');var a=e.browser.msie&&e.browser.version<7,c=a?1:0;a=a?2:-1;this.helper.addClass(this._helper).css({width:this.element.outerWidth()+ +a,height:this.element.outerHeight()+a,position:"absolute",left:this.elementOffset.left-c+"px",top:this.elementOffset.top-c+"px",zIndex:++b.zIndex});this.helper.appendTo("body").disableSelection()}else this.helper=this.element},_change:{e:function(b,a){return{width:this.originalSize.width+a}},w:function(b,a){return{left:this.originalPosition.left+a,width:this.originalSize.width-a}},n:function(b,a,c){return{top:this.originalPosition.top+c,height:this.originalSize.height-c}},s:function(b,a,c){return{height:this.originalSize.height+ +c}},se:function(b,a,c){return e.extend(this._change.s.apply(this,arguments),this._change.e.apply(this,[b,a,c]))},sw:function(b,a,c){return e.extend(this._change.s.apply(this,arguments),this._change.w.apply(this,[b,a,c]))},ne:function(b,a,c){return e.extend(this._change.n.apply(this,arguments),this._change.e.apply(this,[b,a,c]))},nw:function(b,a,c){return e.extend(this._change.n.apply(this,arguments),this._change.w.apply(this,[b,a,c]))}},_propagate:function(b,a){e.ui.plugin.call(this,b,[a,this.ui()]); +b!="resize"&&this._trigger(b,a,this.ui())},plugins:{},ui:function(){return{originalElement:this.originalElement,element:this.element,helper:this.helper,position:this.position,size:this.size,originalSize:this.originalSize,originalPosition:this.originalPosition}}});e.extend(e.ui.resizable,{version:"1.8.16"});e.ui.plugin.add("resizable","alsoResize",{start:function(){var b=e(this).data("resizable").options,a=function(c){e(c).each(function(){var d=e(this);d.data("resizable-alsoresize",{width:parseInt(d.width(), +10),height:parseInt(d.height(),10),left:parseInt(d.css("left"),10),top:parseInt(d.css("top"),10),position:d.css("position")})})};if(typeof b.alsoResize=="object"&&!b.alsoResize.parentNode)if(b.alsoResize.length){b.alsoResize=b.alsoResize[0];a(b.alsoResize)}else e.each(b.alsoResize,function(c){a(c)});else a(b.alsoResize)},resize:function(b,a){var c=e(this).data("resizable");b=c.options;var d=c.originalSize,f=c.originalPosition,g={height:c.size.height-d.height||0,width:c.size.width-d.width||0,top:c.position.top- +f.top||0,left:c.position.left-f.left||0},h=function(i,j){e(i).each(function(){var l=e(this),q=e(this).data("resizable-alsoresize"),p={},r=j&&j.length?j:l.parents(a.originalElement[0]).length?["width","height"]:["width","height","top","left"];e.each(r,function(n,o){if((n=(q[o]||0)+(g[o]||0))&&n>=0)p[o]=n||null});if(e.browser.opera&&/relative/.test(l.css("position"))){c._revertToRelativePosition=true;l.css({position:"absolute",top:"auto",left:"auto"})}l.css(p)})};typeof b.alsoResize=="object"&&!b.alsoResize.nodeType? +e.each(b.alsoResize,function(i,j){h(i,j)}):h(b.alsoResize)},stop:function(){var b=e(this).data("resizable"),a=b.options,c=function(d){e(d).each(function(){var f=e(this);f.css({position:f.data("resizable-alsoresize").position})})};if(b._revertToRelativePosition){b._revertToRelativePosition=false;typeof a.alsoResize=="object"&&!a.alsoResize.nodeType?e.each(a.alsoResize,function(d){c(d)}):c(a.alsoResize)}e(this).removeData("resizable-alsoresize")}});e.ui.plugin.add("resizable","animate",{stop:function(b){var a= +e(this).data("resizable"),c=a.options,d=a._proportionallyResizeElements,f=d.length&&/textarea/i.test(d[0].nodeName),g=f&&e.ui.hasScroll(d[0],"left")?0:a.sizeDiff.height;f={width:a.size.width-(f?0:a.sizeDiff.width),height:a.size.height-g};g=parseInt(a.element.css("left"),10)+(a.position.left-a.originalPosition.left)||null;var h=parseInt(a.element.css("top"),10)+(a.position.top-a.originalPosition.top)||null;a.element.animate(e.extend(f,h&&g?{top:h,left:g}:{}),{duration:c.animateDuration,easing:c.animateEasing, +step:function(){var i={width:parseInt(a.element.css("width"),10),height:parseInt(a.element.css("height"),10),top:parseInt(a.element.css("top"),10),left:parseInt(a.element.css("left"),10)};d&&d.length&&e(d[0]).css({width:i.width,height:i.height});a._updateCache(i);a._propagate("resize",b)}})}});e.ui.plugin.add("resizable","containment",{start:function(){var b=e(this).data("resizable"),a=b.element,c=b.options.containment;if(a=c instanceof e?c.get(0):/parent/.test(c)?a.parent().get(0):c){b.containerElement= +e(a);if(/document/.test(c)||c==document){b.containerOffset={left:0,top:0};b.containerPosition={left:0,top:0};b.parentData={element:e(document),left:0,top:0,width:e(document).width(),height:e(document).height()||document.body.parentNode.scrollHeight}}else{var d=e(a),f=[];e(["Top","Right","Left","Bottom"]).each(function(i,j){f[i]=m(d.css("padding"+j))});b.containerOffset=d.offset();b.containerPosition=d.position();b.containerSize={height:d.innerHeight()-f[3],width:d.innerWidth()-f[1]};c=b.containerOffset; +var g=b.containerSize.height,h=b.containerSize.width;h=e.ui.hasScroll(a,"left")?a.scrollWidth:h;g=e.ui.hasScroll(a)?a.scrollHeight:g;b.parentData={element:a,left:c.left,top:c.top,width:h,height:g}}}},resize:function(b){var a=e(this).data("resizable"),c=a.options,d=a.containerOffset,f=a.position;b=a._aspectRatio||b.shiftKey;var g={top:0,left:0},h=a.containerElement;if(h[0]!=document&&/static/.test(h.css("position")))g=d;if(f.left<(a._helper?d.left:0)){a.size.width+=a._helper?a.position.left-d.left: +a.position.left-g.left;if(b)a.size.height=a.size.width/c.aspectRatio;a.position.left=c.helper?d.left:0}if(f.top<(a._helper?d.top:0)){a.size.height+=a._helper?a.position.top-d.top:a.position.top;if(b)a.size.width=a.size.height*c.aspectRatio;a.position.top=a._helper?d.top:0}a.offset.left=a.parentData.left+a.position.left;a.offset.top=a.parentData.top+a.position.top;c=Math.abs((a._helper?a.offset.left-g.left:a.offset.left-g.left)+a.sizeDiff.width);d=Math.abs((a._helper?a.offset.top-g.top:a.offset.top- +d.top)+a.sizeDiff.height);f=a.containerElement.get(0)==a.element.parent().get(0);g=/relative|absolute/.test(a.containerElement.css("position"));if(f&&g)c-=a.parentData.left;if(c+a.size.width>=a.parentData.width){a.size.width=a.parentData.width-c;if(b)a.size.height=a.size.width/a.aspectRatio}if(d+a.size.height>=a.parentData.height){a.size.height=a.parentData.height-d;if(b)a.size.width=a.size.height*a.aspectRatio}},stop:function(){var b=e(this).data("resizable"),a=b.options,c=b.containerOffset,d=b.containerPosition, +f=b.containerElement,g=e(b.helper),h=g.offset(),i=g.outerWidth()-b.sizeDiff.width;g=g.outerHeight()-b.sizeDiff.height;b._helper&&!a.animate&&/relative/.test(f.css("position"))&&e(this).css({left:h.left-d.left-c.left,width:i,height:g});b._helper&&!a.animate&&/static/.test(f.css("position"))&&e(this).css({left:h.left-d.left-c.left,width:i,height:g})}});e.ui.plugin.add("resizable","ghost",{start:function(){var b=e(this).data("resizable"),a=b.options,c=b.size;b.ghost=b.originalElement.clone();b.ghost.css({opacity:0.25, +display:"block",position:"relative",height:c.height,width:c.width,margin:0,left:0,top:0}).addClass("ui-resizable-ghost").addClass(typeof a.ghost=="string"?a.ghost:"");b.ghost.appendTo(b.helper)},resize:function(){var b=e(this).data("resizable");b.ghost&&b.ghost.css({position:"relative",height:b.size.height,width:b.size.width})},stop:function(){var b=e(this).data("resizable");b.ghost&&b.helper&&b.helper.get(0).removeChild(b.ghost.get(0))}});e.ui.plugin.add("resizable","grid",{resize:function(){var b= +e(this).data("resizable"),a=b.options,c=b.size,d=b.originalSize,f=b.originalPosition,g=b.axis;a.grid=typeof a.grid=="number"?[a.grid,a.grid]:a.grid;var h=Math.round((c.width-d.width)/(a.grid[0]||1))*(a.grid[0]||1);a=Math.round((c.height-d.height)/(a.grid[1]||1))*(a.grid[1]||1);if(/^(se|s|e)$/.test(g)){b.size.width=d.width+h;b.size.height=d.height+a}else if(/^(ne)$/.test(g)){b.size.width=d.width+h;b.size.height=d.height+a;b.position.top=f.top-a}else{if(/^(sw)$/.test(g)){b.size.width=d.width+h;b.size.height= +d.height+a}else{b.size.width=d.width+h;b.size.height=d.height+a;b.position.top=f.top-a}b.position.left=f.left-h}}});var m=function(b){return parseInt(b,10)||0},k=function(b){return!isNaN(parseInt(b,10))}})(jQuery); +;/* + * jQuery UI Selectable 1.8.16 + * + * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about) + * Dual licensed under the MIT or GPL Version 2 licenses. + * http://jquery.org/license + * + * http://docs.jquery.com/UI/Selectables + * + * Depends: + * jquery.ui.core.js + * jquery.ui.mouse.js + * jquery.ui.widget.js + */ +(function(e){e.widget("ui.selectable",e.ui.mouse,{options:{appendTo:"body",autoRefresh:true,distance:0,filter:"*",tolerance:"touch"},_create:function(){var c=this;this.element.addClass("ui-selectable");this.dragged=false;var f;this.refresh=function(){f=e(c.options.filter,c.element[0]);f.each(function(){var d=e(this),b=d.offset();e.data(this,"selectable-item",{element:this,$element:d,left:b.left,top:b.top,right:b.left+d.outerWidth(),bottom:b.top+d.outerHeight(),startselected:false,selected:d.hasClass("ui-selected"), +selecting:d.hasClass("ui-selecting"),unselecting:d.hasClass("ui-unselecting")})})};this.refresh();this.selectees=f.addClass("ui-selectee");this._mouseInit();this.helper=e("
    ")},destroy:function(){this.selectees.removeClass("ui-selectee").removeData("selectable-item");this.element.removeClass("ui-selectable ui-selectable-disabled").removeData("selectable").unbind(".selectable");this._mouseDestroy();return this},_mouseStart:function(c){var f=this;this.opos=[c.pageX, +c.pageY];if(!this.options.disabled){var d=this.options;this.selectees=e(d.filter,this.element[0]);this._trigger("start",c);e(d.appendTo).append(this.helper);this.helper.css({left:c.clientX,top:c.clientY,width:0,height:0});d.autoRefresh&&this.refresh();this.selectees.filter(".ui-selected").each(function(){var b=e.data(this,"selectable-item");b.startselected=true;if(!c.metaKey){b.$element.removeClass("ui-selected");b.selected=false;b.$element.addClass("ui-unselecting");b.unselecting=true;f._trigger("unselecting", +c,{unselecting:b.element})}});e(c.target).parents().andSelf().each(function(){var b=e.data(this,"selectable-item");if(b){var g=!c.metaKey||!b.$element.hasClass("ui-selected");b.$element.removeClass(g?"ui-unselecting":"ui-selected").addClass(g?"ui-selecting":"ui-unselecting");b.unselecting=!g;b.selecting=g;(b.selected=g)?f._trigger("selecting",c,{selecting:b.element}):f._trigger("unselecting",c,{unselecting:b.element});return false}})}},_mouseDrag:function(c){var f=this;this.dragged=true;if(!this.options.disabled){var d= +this.options,b=this.opos[0],g=this.opos[1],h=c.pageX,i=c.pageY;if(b>h){var j=h;h=b;b=j}if(g>i){j=i;i=g;g=j}this.helper.css({left:b,top:g,width:h-b,height:i-g});this.selectees.each(function(){var a=e.data(this,"selectable-item");if(!(!a||a.element==f.element[0])){var k=false;if(d.tolerance=="touch")k=!(a.left>h||a.righti||a.bottomb&&a.rightg&&a.bottom *",opacity:false,placeholder:false,revert:false,scroll:true,scrollSensitivity:20,scrollSpeed:20,scope:"default",tolerance:"intersect",zIndex:1E3},_create:function(){var a=this.options;this.containerCache={};this.element.addClass("ui-sortable"); +this.refresh();this.floating=this.items.length?a.axis==="x"||/left|right/.test(this.items[0].item.css("float"))||/inline|table-cell/.test(this.items[0].item.css("display")):false;this.offset=this.element.offset();this._mouseInit()},destroy:function(){this.element.removeClass("ui-sortable ui-sortable-disabled").removeData("sortable").unbind(".sortable");this._mouseDestroy();for(var a=this.items.length-1;a>=0;a--)this.items[a].item.removeData("sortable-item");return this},_setOption:function(a,b){if(a=== +"disabled"){this.options[a]=b;this.widget()[b?"addClass":"removeClass"]("ui-sortable-disabled")}else d.Widget.prototype._setOption.apply(this,arguments)},_mouseCapture:function(a,b){if(this.reverting)return false;if(this.options.disabled||this.options.type=="static")return false;this._refreshItems(a);var c=null,e=this;d(a.target).parents().each(function(){if(d.data(this,"sortable-item")==e){c=d(this);return false}});if(d.data(a.target,"sortable-item")==e)c=d(a.target);if(!c)return false;if(this.options.handle&& +!b){var f=false;d(this.options.handle,c).find("*").andSelf().each(function(){if(this==a.target)f=true});if(!f)return false}this.currentItem=c;this._removeCurrentsFromItems();return true},_mouseStart:function(a,b,c){b=this.options;var e=this;this.currentContainer=this;this.refreshPositions();this.helper=this._createHelper(a);this._cacheHelperProportions();this._cacheMargins();this.scrollParent=this.helper.scrollParent();this.offset=this.currentItem.offset();this.offset={top:this.offset.top-this.margins.top, +left:this.offset.left-this.margins.left};this.helper.css("position","absolute");this.cssPosition=this.helper.css("position");d.extend(this.offset,{click:{left:a.pageX-this.offset.left,top:a.pageY-this.offset.top},parent:this._getParentOffset(),relative:this._getRelativeOffset()});this.originalPosition=this._generatePosition(a);this.originalPageX=a.pageX;this.originalPageY=a.pageY;b.cursorAt&&this._adjustOffsetFromHelper(b.cursorAt);this.domPosition={prev:this.currentItem.prev()[0],parent:this.currentItem.parent()[0]}; +this.helper[0]!=this.currentItem[0]&&this.currentItem.hide();this._createPlaceholder();b.containment&&this._setContainment();if(b.cursor){if(d("body").css("cursor"))this._storedCursor=d("body").css("cursor");d("body").css("cursor",b.cursor)}if(b.opacity){if(this.helper.css("opacity"))this._storedOpacity=this.helper.css("opacity");this.helper.css("opacity",b.opacity)}if(b.zIndex){if(this.helper.css("zIndex"))this._storedZIndex=this.helper.css("zIndex");this.helper.css("zIndex",b.zIndex)}if(this.scrollParent[0]!= +document&&this.scrollParent[0].tagName!="HTML")this.overflowOffset=this.scrollParent.offset();this._trigger("start",a,this._uiHash());this._preserveHelperProportions||this._cacheHelperProportions();if(!c)for(c=this.containers.length-1;c>=0;c--)this.containers[c]._trigger("activate",a,e._uiHash(this));if(d.ui.ddmanager)d.ui.ddmanager.current=this;d.ui.ddmanager&&!b.dropBehaviour&&d.ui.ddmanager.prepareOffsets(this,a);this.dragging=true;this.helper.addClass("ui-sortable-helper");this._mouseDrag(a); +return true},_mouseDrag:function(a){this.position=this._generatePosition(a);this.positionAbs=this._convertPositionTo("absolute");if(!this.lastPositionAbs)this.lastPositionAbs=this.positionAbs;if(this.options.scroll){var b=this.options,c=false;if(this.scrollParent[0]!=document&&this.scrollParent[0].tagName!="HTML"){if(this.overflowOffset.top+this.scrollParent[0].offsetHeight-a.pageY=0;b--){c=this.items[b];var e=c.item[0],f=this._intersectsWithPointer(c);if(f)if(e!=this.currentItem[0]&&this.placeholder[f==1?"next":"prev"]()[0]!=e&&!d.ui.contains(this.placeholder[0],e)&&(this.options.type=="semi-dynamic"?!d.ui.contains(this.element[0], +e):true)){this.direction=f==1?"down":"up";if(this.options.tolerance=="pointer"||this._intersectsWithSides(c))this._rearrange(a,c);else break;this._trigger("change",a,this._uiHash());break}}this._contactContainers(a);d.ui.ddmanager&&d.ui.ddmanager.drag(this,a);this._trigger("sort",a,this._uiHash());this.lastPositionAbs=this.positionAbs;return false},_mouseStop:function(a,b){if(a){d.ui.ddmanager&&!this.options.dropBehaviour&&d.ui.ddmanager.drop(this,a);if(this.options.revert){var c=this;b=c.placeholder.offset(); +c.reverting=true;d(this.helper).animate({left:b.left-this.offset.parent.left-c.margins.left+(this.offsetParent[0]==document.body?0:this.offsetParent[0].scrollLeft),top:b.top-this.offset.parent.top-c.margins.top+(this.offsetParent[0]==document.body?0:this.offsetParent[0].scrollTop)},parseInt(this.options.revert,10)||500,function(){c._clear(a)})}else this._clear(a,b);return false}},cancel:function(){var a=this;if(this.dragging){this._mouseUp({target:null});this.options.helper=="original"?this.currentItem.css(this._storedCSS).removeClass("ui-sortable-helper"): +this.currentItem.show();for(var b=this.containers.length-1;b>=0;b--){this.containers[b]._trigger("deactivate",null,a._uiHash(this));if(this.containers[b].containerCache.over){this.containers[b]._trigger("out",null,a._uiHash(this));this.containers[b].containerCache.over=0}}}if(this.placeholder){this.placeholder[0].parentNode&&this.placeholder[0].parentNode.removeChild(this.placeholder[0]);this.options.helper!="original"&&this.helper&&this.helper[0].parentNode&&this.helper.remove();d.extend(this,{helper:null, +dragging:false,reverting:false,_noFinalSort:null});this.domPosition.prev?d(this.domPosition.prev).after(this.currentItem):d(this.domPosition.parent).prepend(this.currentItem)}return this},serialize:function(a){var b=this._getItemsAsjQuery(a&&a.connected),c=[];a=a||{};d(b).each(function(){var e=(d(a.item||this).attr(a.attribute||"id")||"").match(a.expression||/(.+)[-=_](.+)/);if(e)c.push((a.key||e[1]+"[]")+"="+(a.key&&a.expression?e[1]:e[2]))});!c.length&&a.key&&c.push(a.key+"=");return c.join("&")}, +toArray:function(a){var b=this._getItemsAsjQuery(a&&a.connected),c=[];a=a||{};b.each(function(){c.push(d(a.item||this).attr(a.attribute||"id")||"")});return c},_intersectsWith:function(a){var b=this.positionAbs.left,c=b+this.helperProportions.width,e=this.positionAbs.top,f=e+this.helperProportions.height,g=a.left,h=g+a.width,i=a.top,k=i+a.height,j=this.offset.click.top,l=this.offset.click.left;j=e+j>i&&e+jg&&b+la[this.floating?"width":"height"]?j:g0?"down":"up")},_getDragHorizontalDirection:function(){var a=this.positionAbs.left-this.lastPositionAbs.left;return a!=0&&(a>0?"right":"left")},refresh:function(a){this._refreshItems(a);this.refreshPositions();return this},_connectWith:function(){var a=this.options;return a.connectWith.constructor==String?[a.connectWith]:a.connectWith},_getItemsAsjQuery:function(a){var b=[],c=[],e=this._connectWith(); +if(e&&a)for(a=e.length-1;a>=0;a--)for(var f=d(e[a]),g=f.length-1;g>=0;g--){var h=d.data(f[g],"sortable");if(h&&h!=this&&!h.options.disabled)c.push([d.isFunction(h.options.items)?h.options.items.call(h.element):d(h.options.items,h.element).not(".ui-sortable-helper").not(".ui-sortable-placeholder"),h])}c.push([d.isFunction(this.options.items)?this.options.items.call(this.element,null,{options:this.options,item:this.currentItem}):d(this.options.items,this.element).not(".ui-sortable-helper").not(".ui-sortable-placeholder"), +this]);for(a=c.length-1;a>=0;a--)c[a][0].each(function(){b.push(this)});return d(b)},_removeCurrentsFromItems:function(){for(var a=this.currentItem.find(":data(sortable-item)"),b=0;b=0;f--)for(var g=d(e[f]),h=g.length-1;h>=0;h--){var i=d.data(g[h],"sortable");if(i&&i!=this&&!i.options.disabled){c.push([d.isFunction(i.options.items)?i.options.items.call(i.element[0],a,{item:this.currentItem}):d(i.options.items,i.element),i]);this.containers.push(i)}}for(f=c.length-1;f>=0;f--){a=c[f][1];e=c[f][0];h=0;for(g=e.length;h=0;b--){var c=this.items[b];if(!(c.instance!=this.currentContainer&&this.currentContainer&&c.item[0]!=this.currentItem[0])){var e=this.options.toleranceElement?d(this.options.toleranceElement,c.item):c.item;if(!a){c.width=e.outerWidth();c.height=e.outerHeight()}e=e.offset();c.left=e.left;c.top=e.top}}if(this.options.custom&&this.options.custom.refreshContainers)this.options.custom.refreshContainers.call(this);else for(b= +this.containers.length-1;b>=0;b--){e=this.containers[b].element.offset();this.containers[b].containerCache.left=e.left;this.containers[b].containerCache.top=e.top;this.containers[b].containerCache.width=this.containers[b].element.outerWidth();this.containers[b].containerCache.height=this.containers[b].element.outerHeight()}return this},_createPlaceholder:function(a){var b=a||this,c=b.options;if(!c.placeholder||c.placeholder.constructor==String){var e=c.placeholder;c.placeholder={element:function(){var f= +d(document.createElement(b.currentItem[0].nodeName)).addClass(e||b.currentItem[0].className+" ui-sortable-placeholder").removeClass("ui-sortable-helper")[0];if(!e)f.style.visibility="hidden";return f},update:function(f,g){if(!(e&&!c.forcePlaceholderSize)){g.height()||g.height(b.currentItem.innerHeight()-parseInt(b.currentItem.css("paddingTop")||0,10)-parseInt(b.currentItem.css("paddingBottom")||0,10));g.width()||g.width(b.currentItem.innerWidth()-parseInt(b.currentItem.css("paddingLeft")||0,10)-parseInt(b.currentItem.css("paddingRight")|| +0,10))}}}}b.placeholder=d(c.placeholder.element.call(b.element,b.currentItem));b.currentItem.after(b.placeholder);c.placeholder.update(b,b.placeholder)},_contactContainers:function(a){for(var b=null,c=null,e=this.containers.length-1;e>=0;e--)if(!d.ui.contains(this.currentItem[0],this.containers[e].element[0]))if(this._intersectsWith(this.containers[e].containerCache)){if(!(b&&d.ui.contains(this.containers[e].element[0],b.element[0]))){b=this.containers[e];c=e}}else if(this.containers[e].containerCache.over){this.containers[e]._trigger("out", +a,this._uiHash(this));this.containers[e].containerCache.over=0}if(b)if(this.containers.length===1){this.containers[c]._trigger("over",a,this._uiHash(this));this.containers[c].containerCache.over=1}else if(this.currentContainer!=this.containers[c]){b=1E4;e=null;for(var f=this.positionAbs[this.containers[c].floating?"left":"top"],g=this.items.length-1;g>=0;g--)if(d.ui.contains(this.containers[c].element[0],this.items[g].item[0])){var h=this.items[g][this.containers[c].floating?"left":"top"];if(Math.abs(h- +f)this.containment[2])f=this.containment[2]+this.offset.click.left;if(a.pageY-this.offset.click.top>this.containment[3])g=this.containment[3]+this.offset.click.top}if(b.grid){g=this.originalPageY+Math.round((g- +this.originalPageY)/b.grid[1])*b.grid[1];g=this.containment?!(g-this.offset.click.topthis.containment[3])?g:!(g-this.offset.click.topthis.containment[2])?f:!(f-this.offset.click.left=0;e--)if(d.ui.contains(this.containers[e].element[0],this.currentItem[0])&&!b){c.push(function(f){return function(g){f._trigger("receive",g,this._uiHash(this))}}.call(this,this.containers[e]));c.push(function(f){return function(g){f._trigger("update",g,this._uiHash(this))}}.call(this,this.containers[e]))}}for(e=this.containers.length-1;e>=0;e--){b||c.push(function(f){return function(g){f._trigger("deactivate",g,this._uiHash(this))}}.call(this, +this.containers[e]));if(this.containers[e].containerCache.over){c.push(function(f){return function(g){f._trigger("out",g,this._uiHash(this))}}.call(this,this.containers[e]));this.containers[e].containerCache.over=0}}this._storedCursor&&d("body").css("cursor",this._storedCursor);this._storedOpacity&&this.helper.css("opacity",this._storedOpacity);if(this._storedZIndex)this.helper.css("zIndex",this._storedZIndex=="auto"?"":this._storedZIndex);this.dragging=false;if(this.cancelHelperRemoval){if(!b){this._trigger("beforeStop", +a,this._uiHash());for(e=0;e").appendTo(this.element).addClass("ui-slider-range ui-widget-header"+(b.range==="min"||b.range==="max"?" ui-slider-range-"+b.range:""))}for(var j=c.length;j"); +this.handles=c.add(d(e.join("")).appendTo(a.element));this.handle=this.handles.eq(0);this.handles.add(this.range).filter("a").click(function(g){g.preventDefault()}).hover(function(){b.disabled||d(this).addClass("ui-state-hover")},function(){d(this).removeClass("ui-state-hover")}).focus(function(){if(b.disabled)d(this).blur();else{d(".ui-slider .ui-state-focus").removeClass("ui-state-focus");d(this).addClass("ui-state-focus")}}).blur(function(){d(this).removeClass("ui-state-focus")});this.handles.each(function(g){d(this).data("index.ui-slider-handle", +g)});this.handles.keydown(function(g){var k=true,l=d(this).data("index.ui-slider-handle"),i,h,m;if(!a.options.disabled){switch(g.keyCode){case d.ui.keyCode.HOME:case d.ui.keyCode.END:case d.ui.keyCode.PAGE_UP:case d.ui.keyCode.PAGE_DOWN:case d.ui.keyCode.UP:case d.ui.keyCode.RIGHT:case d.ui.keyCode.DOWN:case d.ui.keyCode.LEFT:k=false;if(!a._keySliding){a._keySliding=true;d(this).addClass("ui-state-active");i=a._start(g,l);if(i===false)return}break}m=a.options.step;i=a.options.values&&a.options.values.length? +(h=a.values(l)):(h=a.value());switch(g.keyCode){case d.ui.keyCode.HOME:h=a._valueMin();break;case d.ui.keyCode.END:h=a._valueMax();break;case d.ui.keyCode.PAGE_UP:h=a._trimAlignValue(i+(a._valueMax()-a._valueMin())/5);break;case d.ui.keyCode.PAGE_DOWN:h=a._trimAlignValue(i-(a._valueMax()-a._valueMin())/5);break;case d.ui.keyCode.UP:case d.ui.keyCode.RIGHT:if(i===a._valueMax())return;h=a._trimAlignValue(i+m);break;case d.ui.keyCode.DOWN:case d.ui.keyCode.LEFT:if(i===a._valueMin())return;h=a._trimAlignValue(i- +m);break}a._slide(g,l,h);return k}}).keyup(function(g){var k=d(this).data("index.ui-slider-handle");if(a._keySliding){a._keySliding=false;a._stop(g,k);a._change(g,k);d(this).removeClass("ui-state-active")}});this._refreshValue();this._animateOff=false},destroy:function(){this.handles.remove();this.range.remove();this.element.removeClass("ui-slider ui-slider-horizontal ui-slider-vertical ui-slider-disabled ui-widget ui-widget-content ui-corner-all").removeData("slider").unbind(".slider");this._mouseDestroy(); +return this},_mouseCapture:function(a){var b=this.options,c,f,e,j,g;if(b.disabled)return false;this.elementSize={width:this.element.outerWidth(),height:this.element.outerHeight()};this.elementOffset=this.element.offset();c=this._normValueFromMouse({x:a.pageX,y:a.pageY});f=this._valueMax()-this._valueMin()+1;j=this;this.handles.each(function(k){var l=Math.abs(c-j.values(k));if(f>l){f=l;e=d(this);g=k}});if(b.range===true&&this.values(1)===b.min){g+=1;e=d(this.handles[g])}if(this._start(a,g)===false)return false; +this._mouseSliding=true;j._handleIndex=g;e.addClass("ui-state-active").focus();b=e.offset();this._clickOffset=!d(a.target).parents().andSelf().is(".ui-slider-handle")?{left:0,top:0}:{left:a.pageX-b.left-e.width()/2,top:a.pageY-b.top-e.height()/2-(parseInt(e.css("borderTopWidth"),10)||0)-(parseInt(e.css("borderBottomWidth"),10)||0)+(parseInt(e.css("marginTop"),10)||0)};this.handles.hasClass("ui-state-hover")||this._slide(a,g,c);return this._animateOff=true},_mouseStart:function(){return true},_mouseDrag:function(a){var b= +this._normValueFromMouse({x:a.pageX,y:a.pageY});this._slide(a,this._handleIndex,b);return false},_mouseStop:function(a){this.handles.removeClass("ui-state-active");this._mouseSliding=false;this._stop(a,this._handleIndex);this._change(a,this._handleIndex);this._clickOffset=this._handleIndex=null;return this._animateOff=false},_detectOrientation:function(){this.orientation=this.options.orientation==="vertical"?"vertical":"horizontal"},_normValueFromMouse:function(a){var b;if(this.orientation==="horizontal"){b= +this.elementSize.width;a=a.x-this.elementOffset.left-(this._clickOffset?this._clickOffset.left:0)}else{b=this.elementSize.height;a=a.y-this.elementOffset.top-(this._clickOffset?this._clickOffset.top:0)}b=a/b;if(b>1)b=1;if(b<0)b=0;if(this.orientation==="vertical")b=1-b;a=this._valueMax()-this._valueMin();return this._trimAlignValue(this._valueMin()+b*a)},_start:function(a,b){var c={handle:this.handles[b],value:this.value()};if(this.options.values&&this.options.values.length){c.value=this.values(b); +c.values=this.values()}return this._trigger("start",a,c)},_slide:function(a,b,c){var f;if(this.options.values&&this.options.values.length){f=this.values(b?0:1);if(this.options.values.length===2&&this.options.range===true&&(b===0&&c>f||b===1&&c1){this.options.values[a]=this._trimAlignValue(b);this._refreshValue();this._change(null,a)}else if(arguments.length)if(d.isArray(arguments[0])){c=this.options.values;f=arguments[0];for(e=0;e=this._valueMax())return this._valueMax();var b=this.options.step>0?this.options.step:1,c=(a-this._valueMin())%b;a=a-c;if(Math.abs(c)*2>=b)a+=c>0?b:-b;return parseFloat(a.toFixed(5))},_valueMin:function(){return this.options.min},_valueMax:function(){return this.options.max},_refreshValue:function(){var a= +this.options.range,b=this.options,c=this,f=!this._animateOff?b.animate:false,e,j={},g,k,l,i;if(this.options.values&&this.options.values.length)this.handles.each(function(h){e=(c.values(h)-c._valueMin())/(c._valueMax()-c._valueMin())*100;j[c.orientation==="horizontal"?"left":"bottom"]=e+"%";d(this).stop(1,1)[f?"animate":"css"](j,b.animate);if(c.options.range===true)if(c.orientation==="horizontal"){if(h===0)c.range.stop(1,1)[f?"animate":"css"]({left:e+"%"},b.animate);if(h===1)c.range[f?"animate":"css"]({width:e- +g+"%"},{queue:false,duration:b.animate})}else{if(h===0)c.range.stop(1,1)[f?"animate":"css"]({bottom:e+"%"},b.animate);if(h===1)c.range[f?"animate":"css"]({height:e-g+"%"},{queue:false,duration:b.animate})}g=e});else{k=this.value();l=this._valueMin();i=this._valueMax();e=i!==l?(k-l)/(i-l)*100:0;j[c.orientation==="horizontal"?"left":"bottom"]=e+"%";this.handle.stop(1,1)[f?"animate":"css"](j,b.animate);if(a==="min"&&this.orientation==="horizontal")this.range.stop(1,1)[f?"animate":"css"]({width:e+"%"}, +b.animate);if(a==="max"&&this.orientation==="horizontal")this.range[f?"animate":"css"]({width:100-e+"%"},{queue:false,duration:b.animate});if(a==="min"&&this.orientation==="vertical")this.range.stop(1,1)[f?"animate":"css"]({height:e+"%"},b.animate);if(a==="max"&&this.orientation==="vertical")this.range[f?"animate":"css"]({height:100-e+"%"},{queue:false,duration:b.animate})}}});d.extend(d.ui.slider,{version:"1.8.16"})})(jQuery); +;/* + * jQuery UI Datepicker 1.8.16 + * + * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about) + * Dual licensed under the MIT or GPL Version 2 licenses. + * http://jquery.org/license + * + * http://docs.jquery.com/UI/Datepicker + * + * Depends: + * jquery.ui.core.js + */ +(function(d,C){function M(){this.debug=false;this._curInst=null;this._keyEvent=false;this._disabledInputs=[];this._inDialog=this._datepickerShowing=false;this._mainDivId="ui-datepicker-div";this._inlineClass="ui-datepicker-inline";this._appendClass="ui-datepicker-append";this._triggerClass="ui-datepicker-trigger";this._dialogClass="ui-datepicker-dialog";this._disableClass="ui-datepicker-disabled";this._unselectableClass="ui-datepicker-unselectable";this._currentClass="ui-datepicker-current-day";this._dayOverClass= +"ui-datepicker-days-cell-over";this.regional=[];this.regional[""]={closeText:"Done",prevText:"Prev",nextText:"Next",currentText:"Today",monthNames:["January","February","March","April","May","June","July","August","September","October","November","December"],monthNamesShort:["Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov","Dec"],dayNames:["Sunday","Monday","Tuesday","Wednesday","Thursday","Friday","Saturday"],dayNamesShort:["Sun","Mon","Tue","Wed","Thu","Fri","Sat"],dayNamesMin:["Su", +"Mo","Tu","We","Th","Fr","Sa"],weekHeader:"Wk",dateFormat:"mm/dd/yy",firstDay:0,isRTL:false,showMonthAfterYear:false,yearSuffix:""};this._defaults={showOn:"focus",showAnim:"fadeIn",showOptions:{},defaultDate:null,appendText:"",buttonText:"...",buttonImage:"",buttonImageOnly:false,hideIfNoPrevNext:false,navigationAsDateFormat:false,gotoCurrent:false,changeMonth:false,changeYear:false,yearRange:"c-10:c+10",showOtherMonths:false,selectOtherMonths:false,showWeek:false,calculateWeek:this.iso8601Week,shortYearCutoff:"+10", +minDate:null,maxDate:null,duration:"fast",beforeShowDay:null,beforeShow:null,onSelect:null,onChangeMonthYear:null,onClose:null,numberOfMonths:1,showCurrentAtPos:0,stepMonths:1,stepBigMonths:12,altField:"",altFormat:"",constrainInput:true,showButtonPanel:false,autoSize:false,disabled:false};d.extend(this._defaults,this.regional[""]);this.dpDiv=N(d('
    '))}function N(a){return a.bind("mouseout", +function(b){b=d(b.target).closest("button, .ui-datepicker-prev, .ui-datepicker-next, .ui-datepicker-calendar td a");b.length&&b.removeClass("ui-state-hover ui-datepicker-prev-hover ui-datepicker-next-hover")}).bind("mouseover",function(b){b=d(b.target).closest("button, .ui-datepicker-prev, .ui-datepicker-next, .ui-datepicker-calendar td a");if(!(d.datepicker._isDisabledDatepicker(J.inline?a.parent()[0]:J.input[0])||!b.length)){b.parents(".ui-datepicker-calendar").find("a").removeClass("ui-state-hover"); +b.addClass("ui-state-hover");b.hasClass("ui-datepicker-prev")&&b.addClass("ui-datepicker-prev-hover");b.hasClass("ui-datepicker-next")&&b.addClass("ui-datepicker-next-hover")}})}function H(a,b){d.extend(a,b);for(var c in b)if(b[c]==null||b[c]==C)a[c]=b[c];return a}d.extend(d.ui,{datepicker:{version:"1.8.16"}});var B=(new Date).getTime(),J;d.extend(M.prototype,{markerClassName:"hasDatepicker",maxRows:4,log:function(){this.debug&&console.log.apply("",arguments)},_widgetDatepicker:function(){return this.dpDiv}, +setDefaults:function(a){H(this._defaults,a||{});return this},_attachDatepicker:function(a,b){var c=null;for(var e in this._defaults){var f=a.getAttribute("date:"+e);if(f){c=c||{};try{c[e]=eval(f)}catch(h){c[e]=f}}}e=a.nodeName.toLowerCase();f=e=="div"||e=="span";if(!a.id){this.uuid+=1;a.id="dp"+this.uuid}var i=this._newInst(d(a),f);i.settings=d.extend({},b||{},c||{});if(e=="input")this._connectDatepicker(a,i);else f&&this._inlineDatepicker(a,i)},_newInst:function(a,b){return{id:a[0].id.replace(/([^A-Za-z0-9_-])/g, +"\\\\$1"),input:a,selectedDay:0,selectedMonth:0,selectedYear:0,drawMonth:0,drawYear:0,inline:b,dpDiv:!b?this.dpDiv:N(d('
    '))}},_connectDatepicker:function(a,b){var c=d(a);b.append=d([]);b.trigger=d([]);if(!c.hasClass(this.markerClassName)){this._attachments(c,b);c.addClass(this.markerClassName).keydown(this._doKeyDown).keypress(this._doKeyPress).keyup(this._doKeyUp).bind("setData.datepicker", +function(e,f,h){b.settings[f]=h}).bind("getData.datepicker",function(e,f){return this._get(b,f)});this._autoSize(b);d.data(a,"datepicker",b);b.settings.disabled&&this._disableDatepicker(a)}},_attachments:function(a,b){var c=this._get(b,"appendText"),e=this._get(b,"isRTL");b.append&&b.append.remove();if(c){b.append=d(''+c+"");a[e?"before":"after"](b.append)}a.unbind("focus",this._showDatepicker);b.trigger&&b.trigger.remove();c=this._get(b,"showOn");if(c== +"focus"||c=="both")a.focus(this._showDatepicker);if(c=="button"||c=="both"){c=this._get(b,"buttonText");var f=this._get(b,"buttonImage");b.trigger=d(this._get(b,"buttonImageOnly")?d("").addClass(this._triggerClass).attr({src:f,alt:c,title:c}):d('').addClass(this._triggerClass).html(f==""?c:d("").attr({src:f,alt:c,title:c})));a[e?"before":"after"](b.trigger);b.trigger.click(function(){d.datepicker._datepickerShowing&&d.datepicker._lastInput==a[0]?d.datepicker._hideDatepicker(): +d.datepicker._showDatepicker(a[0]);return false})}},_autoSize:function(a){if(this._get(a,"autoSize")&&!a.inline){var b=new Date(2009,11,20),c=this._get(a,"dateFormat");if(c.match(/[DM]/)){var e=function(f){for(var h=0,i=0,g=0;gh){h=f[g].length;i=g}return i};b.setMonth(e(this._get(a,c.match(/MM/)?"monthNames":"monthNamesShort")));b.setDate(e(this._get(a,c.match(/DD/)?"dayNames":"dayNamesShort"))+20-b.getDay())}a.input.attr("size",this._formatDate(a,b).length)}},_inlineDatepicker:function(a, +b){var c=d(a);if(!c.hasClass(this.markerClassName)){c.addClass(this.markerClassName).append(b.dpDiv).bind("setData.datepicker",function(e,f,h){b.settings[f]=h}).bind("getData.datepicker",function(e,f){return this._get(b,f)});d.data(a,"datepicker",b);this._setDate(b,this._getDefaultDate(b),true);this._updateDatepicker(b);this._updateAlternate(b);b.settings.disabled&&this._disableDatepicker(a);b.dpDiv.css("display","block")}},_dialogDatepicker:function(a,b,c,e,f){a=this._dialogInst;if(!a){this.uuid+= +1;this._dialogInput=d('');this._dialogInput.keydown(this._doKeyDown);d("body").append(this._dialogInput);a=this._dialogInst=this._newInst(this._dialogInput,false);a.settings={};d.data(this._dialogInput[0],"datepicker",a)}H(a.settings,e||{});b=b&&b.constructor==Date?this._formatDate(a,b):b;this._dialogInput.val(b);this._pos=f?f.length?f:[f.pageX,f.pageY]:null;if(!this._pos)this._pos=[document.documentElement.clientWidth/ +2-100+(document.documentElement.scrollLeft||document.body.scrollLeft),document.documentElement.clientHeight/2-150+(document.documentElement.scrollTop||document.body.scrollTop)];this._dialogInput.css("left",this._pos[0]+20+"px").css("top",this._pos[1]+"px");a.settings.onSelect=c;this._inDialog=true;this.dpDiv.addClass(this._dialogClass);this._showDatepicker(this._dialogInput[0]);d.blockUI&&d.blockUI(this.dpDiv);d.data(this._dialogInput[0],"datepicker",a);return this},_destroyDatepicker:function(a){var b= +d(a),c=d.data(a,"datepicker");if(b.hasClass(this.markerClassName)){var e=a.nodeName.toLowerCase();d.removeData(a,"datepicker");if(e=="input"){c.append.remove();c.trigger.remove();b.removeClass(this.markerClassName).unbind("focus",this._showDatepicker).unbind("keydown",this._doKeyDown).unbind("keypress",this._doKeyPress).unbind("keyup",this._doKeyUp)}else if(e=="div"||e=="span")b.removeClass(this.markerClassName).empty()}},_enableDatepicker:function(a){var b=d(a),c=d.data(a,"datepicker");if(b.hasClass(this.markerClassName)){var e= +a.nodeName.toLowerCase();if(e=="input"){a.disabled=false;c.trigger.filter("button").each(function(){this.disabled=false}).end().filter("img").css({opacity:"1.0",cursor:""})}else if(e=="div"||e=="span"){b=b.children("."+this._inlineClass);b.children().removeClass("ui-state-disabled");b.find("select.ui-datepicker-month, select.ui-datepicker-year").removeAttr("disabled")}this._disabledInputs=d.map(this._disabledInputs,function(f){return f==a?null:f})}},_disableDatepicker:function(a){var b=d(a),c=d.data(a, +"datepicker");if(b.hasClass(this.markerClassName)){var e=a.nodeName.toLowerCase();if(e=="input"){a.disabled=true;c.trigger.filter("button").each(function(){this.disabled=true}).end().filter("img").css({opacity:"0.5",cursor:"default"})}else if(e=="div"||e=="span"){b=b.children("."+this._inlineClass);b.children().addClass("ui-state-disabled");b.find("select.ui-datepicker-month, select.ui-datepicker-year").attr("disabled","disabled")}this._disabledInputs=d.map(this._disabledInputs,function(f){return f== +a?null:f});this._disabledInputs[this._disabledInputs.length]=a}},_isDisabledDatepicker:function(a){if(!a)return false;for(var b=0;b-1}},_doKeyUp:function(a){a=d.datepicker._getInst(a.target);if(a.input.val()!=a.lastVal)try{if(d.datepicker.parseDate(d.datepicker._get(a,"dateFormat"),a.input?a.input.val():null,d.datepicker._getFormatConfig(a))){d.datepicker._setDateFromField(a);d.datepicker._updateAlternate(a);d.datepicker._updateDatepicker(a)}}catch(b){d.datepicker.log(b)}return true},_showDatepicker:function(a){a=a.target||a;if(a.nodeName.toLowerCase()!="input")a=d("input", +a.parentNode)[0];if(!(d.datepicker._isDisabledDatepicker(a)||d.datepicker._lastInput==a)){var b=d.datepicker._getInst(a);if(d.datepicker._curInst&&d.datepicker._curInst!=b){d.datepicker._datepickerShowing&&d.datepicker._triggerOnClose(d.datepicker._curInst);d.datepicker._curInst.dpDiv.stop(true,true)}var c=d.datepicker._get(b,"beforeShow");c=c?c.apply(a,[a,b]):{};if(c!==false){H(b.settings,c);b.lastVal=null;d.datepicker._lastInput=a;d.datepicker._setDateFromField(b);if(d.datepicker._inDialog)a.value= +"";if(!d.datepicker._pos){d.datepicker._pos=d.datepicker._findPos(a);d.datepicker._pos[1]+=a.offsetHeight}var e=false;d(a).parents().each(function(){e|=d(this).css("position")=="fixed";return!e});if(e&&d.browser.opera){d.datepicker._pos[0]-=document.documentElement.scrollLeft;d.datepicker._pos[1]-=document.documentElement.scrollTop}c={left:d.datepicker._pos[0],top:d.datepicker._pos[1]};d.datepicker._pos=null;b.dpDiv.empty();b.dpDiv.css({position:"absolute",display:"block",top:"-1000px"});d.datepicker._updateDatepicker(b); +c=d.datepicker._checkOffset(b,c,e);b.dpDiv.css({position:d.datepicker._inDialog&&d.blockUI?"static":e?"fixed":"absolute",display:"none",left:c.left+"px",top:c.top+"px"});if(!b.inline){c=d.datepicker._get(b,"showAnim");var f=d.datepicker._get(b,"duration"),h=function(){var i=b.dpDiv.find("iframe.ui-datepicker-cover");if(i.length){var g=d.datepicker._getBorders(b.dpDiv);i.css({left:-g[0],top:-g[1],width:b.dpDiv.outerWidth(),height:b.dpDiv.outerHeight()})}};b.dpDiv.zIndex(d(a).zIndex()+1);d.datepicker._datepickerShowing= +true;d.effects&&d.effects[c]?b.dpDiv.show(c,d.datepicker._get(b,"showOptions"),f,h):b.dpDiv[c||"show"](c?f:null,h);if(!c||!f)h();b.input.is(":visible")&&!b.input.is(":disabled")&&b.input.focus();d.datepicker._curInst=b}}}},_updateDatepicker:function(a){this.maxRows=4;var b=d.datepicker._getBorders(a.dpDiv);J=a;a.dpDiv.empty().append(this._generateHTML(a));var c=a.dpDiv.find("iframe.ui-datepicker-cover");c.length&&c.css({left:-b[0],top:-b[1],width:a.dpDiv.outerWidth(),height:a.dpDiv.outerHeight()}); +a.dpDiv.find("."+this._dayOverClass+" a").mouseover();b=this._getNumberOfMonths(a);c=b[1];a.dpDiv.removeClass("ui-datepicker-multi-2 ui-datepicker-multi-3 ui-datepicker-multi-4").width("");c>1&&a.dpDiv.addClass("ui-datepicker-multi-"+c).css("width",17*c+"em");a.dpDiv[(b[0]!=1||b[1]!=1?"add":"remove")+"Class"]("ui-datepicker-multi");a.dpDiv[(this._get(a,"isRTL")?"add":"remove")+"Class"]("ui-datepicker-rtl");a==d.datepicker._curInst&&d.datepicker._datepickerShowing&&a.input&&a.input.is(":visible")&& +!a.input.is(":disabled")&&a.input[0]!=document.activeElement&&a.input.focus();if(a.yearshtml){var e=a.yearshtml;setTimeout(function(){e===a.yearshtml&&a.yearshtml&&a.dpDiv.find("select.ui-datepicker-year:first").replaceWith(a.yearshtml);e=a.yearshtml=null},0)}},_getBorders:function(a){var b=function(c){return{thin:1,medium:2,thick:3}[c]||c};return[parseFloat(b(a.css("border-left-width"))),parseFloat(b(a.css("border-top-width")))]},_checkOffset:function(a,b,c){var e=a.dpDiv.outerWidth(),f=a.dpDiv.outerHeight(), +h=a.input?a.input.outerWidth():0,i=a.input?a.input.outerHeight():0,g=document.documentElement.clientWidth+d(document).scrollLeft(),j=document.documentElement.clientHeight+d(document).scrollTop();b.left-=this._get(a,"isRTL")?e-h:0;b.left-=c&&b.left==a.input.offset().left?d(document).scrollLeft():0;b.top-=c&&b.top==a.input.offset().top+i?d(document).scrollTop():0;b.left-=Math.min(b.left,b.left+e>g&&g>e?Math.abs(b.left+e-g):0);b.top-=Math.min(b.top,b.top+f>j&&j>f?Math.abs(f+i):0);return b},_findPos:function(a){for(var b= +this._get(this._getInst(a),"isRTL");a&&(a.type=="hidden"||a.nodeType!=1||d.expr.filters.hidden(a));)a=a[b?"previousSibling":"nextSibling"];a=d(a).offset();return[a.left,a.top]},_triggerOnClose:function(a){var b=this._get(a,"onClose");if(b)b.apply(a.input?a.input[0]:null,[a.input?a.input.val():"",a])},_hideDatepicker:function(a){var b=this._curInst;if(!(!b||a&&b!=d.data(a,"datepicker")))if(this._datepickerShowing){a=this._get(b,"showAnim");var c=this._get(b,"duration"),e=function(){d.datepicker._tidyDialog(b); +this._curInst=null};d.effects&&d.effects[a]?b.dpDiv.hide(a,d.datepicker._get(b,"showOptions"),c,e):b.dpDiv[a=="slideDown"?"slideUp":a=="fadeIn"?"fadeOut":"hide"](a?c:null,e);a||e();d.datepicker._triggerOnClose(b);this._datepickerShowing=false;this._lastInput=null;if(this._inDialog){this._dialogInput.css({position:"absolute",left:"0",top:"-100px"});if(d.blockUI){d.unblockUI();d("body").append(this.dpDiv)}}this._inDialog=false}},_tidyDialog:function(a){a.dpDiv.removeClass(this._dialogClass).unbind(".ui-datepicker-calendar")}, +_checkExternalClick:function(a){if(d.datepicker._curInst){a=d(a.target);a[0].id!=d.datepicker._mainDivId&&a.parents("#"+d.datepicker._mainDivId).length==0&&!a.hasClass(d.datepicker.markerClassName)&&!a.hasClass(d.datepicker._triggerClass)&&d.datepicker._datepickerShowing&&!(d.datepicker._inDialog&&d.blockUI)&&d.datepicker._hideDatepicker()}},_adjustDate:function(a,b,c){a=d(a);var e=this._getInst(a[0]);if(!this._isDisabledDatepicker(a[0])){this._adjustInstDate(e,b+(c=="M"?this._get(e,"showCurrentAtPos"): +0),c);this._updateDatepicker(e)}},_gotoToday:function(a){a=d(a);var b=this._getInst(a[0]);if(this._get(b,"gotoCurrent")&&b.currentDay){b.selectedDay=b.currentDay;b.drawMonth=b.selectedMonth=b.currentMonth;b.drawYear=b.selectedYear=b.currentYear}else{var c=new Date;b.selectedDay=c.getDate();b.drawMonth=b.selectedMonth=c.getMonth();b.drawYear=b.selectedYear=c.getFullYear()}this._notifyChange(b);this._adjustDate(a)},_selectMonthYear:function(a,b,c){a=d(a);var e=this._getInst(a[0]);e["selected"+(c=="M"? +"Month":"Year")]=e["draw"+(c=="M"?"Month":"Year")]=parseInt(b.options[b.selectedIndex].value,10);this._notifyChange(e);this._adjustDate(a)},_selectDay:function(a,b,c,e){var f=d(a);if(!(d(e).hasClass(this._unselectableClass)||this._isDisabledDatepicker(f[0]))){f=this._getInst(f[0]);f.selectedDay=f.currentDay=d("a",e).html();f.selectedMonth=f.currentMonth=b;f.selectedYear=f.currentYear=c;this._selectDate(a,this._formatDate(f,f.currentDay,f.currentMonth,f.currentYear))}},_clearDate:function(a){a=d(a); +this._getInst(a[0]);this._selectDate(a,"")},_selectDate:function(a,b){a=this._getInst(d(a)[0]);b=b!=null?b:this._formatDate(a);a.input&&a.input.val(b);this._updateAlternate(a);var c=this._get(a,"onSelect");if(c)c.apply(a.input?a.input[0]:null,[b,a]);else a.input&&a.input.trigger("change");if(a.inline)this._updateDatepicker(a);else{this._hideDatepicker();this._lastInput=a.input[0];typeof a.input[0]!="object"&&a.input.focus();this._lastInput=null}},_updateAlternate:function(a){var b=this._get(a,"altField"); +if(b){var c=this._get(a,"altFormat")||this._get(a,"dateFormat"),e=this._getDate(a),f=this.formatDate(c,e,this._getFormatConfig(a));d(b).each(function(){d(this).val(f)})}},noWeekends:function(a){a=a.getDay();return[a>0&&a<6,""]},iso8601Week:function(a){a=new Date(a.getTime());a.setDate(a.getDate()+4-(a.getDay()||7));var b=a.getTime();a.setMonth(0);a.setDate(1);return Math.floor(Math.round((b-a)/864E5)/7)+1},parseDate:function(a,b,c){if(a==null||b==null)throw"Invalid arguments";b=typeof b=="object"? +b.toString():b+"";if(b=="")return null;var e=(c?c.shortYearCutoff:null)||this._defaults.shortYearCutoff;e=typeof e!="string"?e:(new Date).getFullYear()%100+parseInt(e,10);for(var f=(c?c.dayNamesShort:null)||this._defaults.dayNamesShort,h=(c?c.dayNames:null)||this._defaults.dayNames,i=(c?c.monthNamesShort:null)||this._defaults.monthNamesShort,g=(c?c.monthNames:null)||this._defaults.monthNames,j=c=-1,l=-1,u=-1,k=false,o=function(p){(p=A+1-1){j=1;l=u;do{e=this._getDaysInMonth(c,j-1);if(l<=e)break;j++;l-=e}while(1)}v=this._daylightSavingAdjust(new Date(c,j-1,l));if(v.getFullYear()!=c||v.getMonth()+1!=j||v.getDate()!=l)throw"Invalid date";return v},ATOM:"yy-mm-dd", +COOKIE:"D, dd M yy",ISO_8601:"yy-mm-dd",RFC_822:"D, d M y",RFC_850:"DD, dd-M-y",RFC_1036:"D, d M y",RFC_1123:"D, d M yy",RFC_2822:"D, d M yy",RSS:"D, d M y",TICKS:"!",TIMESTAMP:"@",W3C:"yy-mm-dd",_ticksTo1970:(718685+Math.floor(492.5)-Math.floor(19.7)+Math.floor(4.925))*24*60*60*1E7,formatDate:function(a,b,c){if(!b)return"";var e=(c?c.dayNamesShort:null)||this._defaults.dayNamesShort,f=(c?c.dayNames:null)||this._defaults.dayNames,h=(c?c.monthNamesShort:null)||this._defaults.monthNamesShort;c=(c?c.monthNames: +null)||this._defaults.monthNames;var i=function(o){(o=k+1 +12?a.getHours()+2:0);return a},_setDate:function(a,b,c){var e=!b,f=a.selectedMonth,h=a.selectedYear;b=this._restrictMinMax(a,this._determineDate(a,b,new Date));a.selectedDay=a.currentDay=b.getDate();a.drawMonth=a.selectedMonth=a.currentMonth=b.getMonth();a.drawYear=a.selectedYear=a.currentYear=b.getFullYear();if((f!=a.selectedMonth||h!=a.selectedYear)&&!c)this._notifyChange(a);this._adjustInstDate(a);if(a.input)a.input.val(e?"":this._formatDate(a))},_getDate:function(a){return!a.currentYear||a.input&& +a.input.val()==""?null:this._daylightSavingAdjust(new Date(a.currentYear,a.currentMonth,a.currentDay))},_generateHTML:function(a){var b=new Date;b=this._daylightSavingAdjust(new Date(b.getFullYear(),b.getMonth(),b.getDate()));var c=this._get(a,"isRTL"),e=this._get(a,"showButtonPanel"),f=this._get(a,"hideIfNoPrevNext"),h=this._get(a,"navigationAsDateFormat"),i=this._getNumberOfMonths(a),g=this._get(a,"showCurrentAtPos"),j=this._get(a,"stepMonths"),l=i[0]!=1||i[1]!=1,u=this._daylightSavingAdjust(!a.currentDay? +new Date(9999,9,9):new Date(a.currentYear,a.currentMonth,a.currentDay)),k=this._getMinMaxDate(a,"min"),o=this._getMinMaxDate(a,"max");g=a.drawMonth-g;var m=a.drawYear;if(g<0){g+=12;m--}if(o){var n=this._daylightSavingAdjust(new Date(o.getFullYear(),o.getMonth()-i[0]*i[1]+1,o.getDate()));for(n=k&&nn;){g--;if(g<0){g=11;m--}}}a.drawMonth=g;a.drawYear=m;n=this._get(a,"prevText");n=!h?n:this.formatDate(n,this._daylightSavingAdjust(new Date(m,g-j,1)),this._getFormatConfig(a)); +n=this._canAdjustMonth(a,-1,m,g)?''+n+"":f?"":''+n+"";var s=this._get(a,"nextText");s=!h?s:this.formatDate(s,this._daylightSavingAdjust(new Date(m, +g+j,1)),this._getFormatConfig(a));f=this._canAdjustMonth(a,+1,m,g)?''+s+"":f?"":''+s+"";j=this._get(a,"currentText");s=this._get(a,"gotoCurrent")&& +a.currentDay?u:b;j=!h?j:this.formatDate(j,s,this._getFormatConfig(a));h=!a.inline?'":"";e=e?'
    '+(c?h:"")+(this._isInRange(a,s)?'":"")+(c?"":h)+"
    ":"";h=parseInt(this._get(a,"firstDay"),10);h=isNaN(h)?0:h;j=this._get(a,"showWeek");s=this._get(a,"dayNames");this._get(a,"dayNamesShort");var q=this._get(a,"dayNamesMin"),A=this._get(a,"monthNames"),v=this._get(a,"monthNamesShort"),p=this._get(a,"beforeShowDay"),D=this._get(a,"showOtherMonths"),K=this._get(a,"selectOtherMonths");this._get(a,"calculateWeek");for(var E=this._getDefaultDate(a),w="",x=0;x1)switch(G){case 0:y+=" ui-datepicker-group-first";t=" ui-corner-"+(c?"right":"left");break;case i[1]-1:y+=" ui-datepicker-group-last";t=" ui-corner-"+(c?"left":"right");break;default:y+=" ui-datepicker-group-middle";t="";break}y+='">'}y+='
    '+(/all|left/.test(t)&& +x==0?c?f:n:"")+(/all|right/.test(t)&&x==0?c?n:f:"")+this._generateMonthYearHeader(a,g,m,k,o,x>0||G>0,A,v)+'
    ';var z=j?'":"";for(t=0;t<7;t++){var r=(t+h)%7;z+="=5?' class="ui-datepicker-week-end"':"")+'>'+q[r]+""}y+=z+"";z=this._getDaysInMonth(m,g);if(m==a.selectedYear&&g==a.selectedMonth)a.selectedDay=Math.min(a.selectedDay, +z);t=(this._getFirstDayOfMonth(m,g)-h+7)%7;z=Math.ceil((t+z)/7);this.maxRows=z=l?this.maxRows>z?this.maxRows:z:z;r=this._daylightSavingAdjust(new Date(m,g,1-t));for(var Q=0;Q";var R=!j?"":'";for(t=0;t<7;t++){var I=p?p.apply(a.input?a.input[0]:null,[r]):[true,""],F=r.getMonth()!=g,L=F&&!K||!I[0]||k&&ro;R+='";r.setDate(r.getDate()+1);r=this._daylightSavingAdjust(r)}y+=R+""}g++;if(g>11){g=0;m++}y+="
    '+this._get(a,"weekHeader")+"
    '+this._get(a,"calculateWeek")(r)+""+(F&&!D?" ":L?''+ +r.getDate()+"":''+r.getDate()+"")+"
    "+(l?"
    "+(i[0]>0&&G==i[1]-1?'
    ':""):"");O+=y}w+=O}w+=e+(d.browser.msie&&parseInt(d.browser.version,10)<7&&!a.inline?'': +"");a._keyEvent=false;return w},_generateMonthYearHeader:function(a,b,c,e,f,h,i,g){var j=this._get(a,"changeMonth"),l=this._get(a,"changeYear"),u=this._get(a,"showMonthAfterYear"),k='
    ',o="";if(h||!j)o+=''+i[b]+"";else{i=e&&e.getFullYear()==c;var m=f&&f.getFullYear()==c;o+='"}u||(k+=o+(h||!(j&&l)?" ":""));if(!a.yearshtml){a.yearshtml="";if(h||!l)k+=''+c+"";else{g=this._get(a,"yearRange").split(":");var s=(new Date).getFullYear();i=function(q){q=q.match(/c[+-].*/)?c+parseInt(q.substring(1),10):q.match(/[+-].*/)?s+parseInt(q,10):parseInt(q,10);return isNaN(q)?s:q};b=i(g[0]);g=Math.max(b,i(g[1]||""));b=e?Math.max(b, +e.getFullYear()):b;g=f?Math.min(g,f.getFullYear()):g;for(a.yearshtml+='";k+=a.yearshtml;a.yearshtml=null}}k+=this._get(a,"yearSuffix");if(u)k+=(h||!(j&&l)?" ":"")+o;k+="
    ";return k},_adjustInstDate:function(a,b,c){var e=a.drawYear+(c=="Y"?b:0),f=a.drawMonth+ +(c=="M"?b:0);b=Math.min(a.selectedDay,this._getDaysInMonth(e,f))+(c=="D"?b:0);e=this._restrictMinMax(a,this._daylightSavingAdjust(new Date(e,f,b)));a.selectedDay=e.getDate();a.drawMonth=a.selectedMonth=e.getMonth();a.drawYear=a.selectedYear=e.getFullYear();if(c=="M"||c=="Y")this._notifyChange(a)},_restrictMinMax:function(a,b){var c=this._getMinMaxDate(a,"min");a=this._getMinMaxDate(a,"max");b=c&&ba?a:b},_notifyChange:function(a){var b=this._get(a,"onChangeMonthYear");if(b)b.apply(a.input? +a.input[0]:null,[a.selectedYear,a.selectedMonth+1,a])},_getNumberOfMonths:function(a){a=this._get(a,"numberOfMonths");return a==null?[1,1]:typeof a=="number"?[1,a]:a},_getMinMaxDate:function(a,b){return this._determineDate(a,this._get(a,b+"Date"),null)},_getDaysInMonth:function(a,b){return 32-this._daylightSavingAdjust(new Date(a,b,32)).getDate()},_getFirstDayOfMonth:function(a,b){return(new Date(a,b,1)).getDay()},_canAdjustMonth:function(a,b,c,e){var f=this._getNumberOfMonths(a);c=this._daylightSavingAdjust(new Date(c, +e+(b<0?b:f[0]*f[1]),1));b<0&&c.setDate(this._getDaysInMonth(c.getFullYear(),c.getMonth()));return this._isInRange(a,c)},_isInRange:function(a,b){var c=this._getMinMaxDate(a,"min");a=this._getMinMaxDate(a,"max");return(!c||b.getTime()>=c.getTime())&&(!a||b.getTime()<=a.getTime())},_getFormatConfig:function(a){var b=this._get(a,"shortYearCutoff");b=typeof b!="string"?b:(new Date).getFullYear()%100+parseInt(b,10);return{shortYearCutoff:b,dayNamesShort:this._get(a,"dayNamesShort"),dayNames:this._get(a, +"dayNames"),monthNamesShort:this._get(a,"monthNamesShort"),monthNames:this._get(a,"monthNames")}},_formatDate:function(a,b,c,e){if(!b){a.currentDay=a.selectedDay;a.currentMonth=a.selectedMonth;a.currentYear=a.selectedYear}b=b?typeof b=="object"?b:this._daylightSavingAdjust(new Date(e,c,b)):this._daylightSavingAdjust(new Date(a.currentYear,a.currentMonth,a.currentDay));return this.formatDate(this._get(a,"dateFormat"),b,this._getFormatConfig(a))}});d.fn.datepicker=function(a){if(!this.length)return this; +if(!d.datepicker.initialized){d(document).mousedown(d.datepicker._checkExternalClick).find("body").append(d.datepicker.dpDiv);d.datepicker.initialized=true}var b=Array.prototype.slice.call(arguments,1);if(typeof a=="string"&&(a=="isDisabled"||a=="getDate"||a=="widget"))return d.datepicker["_"+a+"Datepicker"].apply(d.datepicker,[this[0]].concat(b));if(a=="option"&&arguments.length==2&&typeof arguments[1]=="string")return d.datepicker["_"+a+"Datepicker"].apply(d.datepicker,[this[0]].concat(b));return this.each(function(){typeof a== +"string"?d.datepicker["_"+a+"Datepicker"].apply(d.datepicker,[this].concat(b)):d.datepicker._attachDatepicker(this,a)})};d.datepicker=new M;d.datepicker.initialized=false;d.datepicker.uuid=(new Date).getTime();d.datepicker.version="1.8.16";window["DP_jQuery_"+B]=d})(jQuery); +;/* + * jQuery UI Effects 1.8.16 + * + * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about) + * Dual licensed under the MIT or GPL Version 2 licenses. + * http://jquery.org/license + * + * http://docs.jquery.com/UI/Effects/ + */ +jQuery.effects||function(f,j){function m(c){var a;if(c&&c.constructor==Array&&c.length==3)return c;if(a=/rgb\(\s*([0-9]{1,3})\s*,\s*([0-9]{1,3})\s*,\s*([0-9]{1,3})\s*\)/.exec(c))return[parseInt(a[1],10),parseInt(a[2],10),parseInt(a[3],10)];if(a=/rgb\(\s*([0-9]+(?:\.[0-9]+)?)\%\s*,\s*([0-9]+(?:\.[0-9]+)?)\%\s*,\s*([0-9]+(?:\.[0-9]+)?)\%\s*\)/.exec(c))return[parseFloat(a[1])*2.55,parseFloat(a[2])*2.55,parseFloat(a[3])*2.55];if(a=/#([a-fA-F0-9]{2})([a-fA-F0-9]{2})([a-fA-F0-9]{2})/.exec(c))return[parseInt(a[1], +16),parseInt(a[2],16),parseInt(a[3],16)];if(a=/#([a-fA-F0-9])([a-fA-F0-9])([a-fA-F0-9])/.exec(c))return[parseInt(a[1]+a[1],16),parseInt(a[2]+a[2],16),parseInt(a[3]+a[3],16)];if(/rgba\(0, 0, 0, 0\)/.exec(c))return n.transparent;return n[f.trim(c).toLowerCase()]}function s(c,a){var b;do{b=f.curCSS(c,a);if(b!=""&&b!="transparent"||f.nodeName(c,"body"))break;a="backgroundColor"}while(c=c.parentNode);return m(b)}function o(){var c=document.defaultView?document.defaultView.getComputedStyle(this,null):this.currentStyle, +a={},b,d;if(c&&c.length&&c[0]&&c[c[0]])for(var e=c.length;e--;){b=c[e];if(typeof c[b]=="string"){d=b.replace(/\-(\w)/g,function(g,h){return h.toUpperCase()});a[d]=c[b]}}else for(b in c)if(typeof c[b]==="string")a[b]=c[b];return a}function p(c){var a,b;for(a in c){b=c[a];if(b==null||f.isFunction(b)||a in t||/scrollbar/.test(a)||!/color/i.test(a)&&isNaN(parseFloat(b)))delete c[a]}return c}function u(c,a){var b={_:0},d;for(d in a)if(c[d]!=a[d])b[d]=a[d];return b}function k(c,a,b,d){if(typeof c=="object"){d= +a;b=null;a=c;c=a.effect}if(f.isFunction(a)){d=a;b=null;a={}}if(typeof a=="number"||f.fx.speeds[a]){d=b;b=a;a={}}if(f.isFunction(b)){d=b;b=null}a=a||{};b=b||a.duration;b=f.fx.off?0:typeof b=="number"?b:b in f.fx.speeds?f.fx.speeds[b]:f.fx.speeds._default;d=d||a.complete;return[c,a,b,d]}function l(c){if(!c||typeof c==="number"||f.fx.speeds[c])return true;if(typeof c==="string"&&!f.effects[c])return true;return false}f.effects={};f.each(["backgroundColor","borderBottomColor","borderLeftColor","borderRightColor", +"borderTopColor","borderColor","color","outlineColor"],function(c,a){f.fx.step[a]=function(b){if(!b.colorInit){b.start=s(b.elem,a);b.end=m(b.end);b.colorInit=true}b.elem.style[a]="rgb("+Math.max(Math.min(parseInt(b.pos*(b.end[0]-b.start[0])+b.start[0],10),255),0)+","+Math.max(Math.min(parseInt(b.pos*(b.end[1]-b.start[1])+b.start[1],10),255),0)+","+Math.max(Math.min(parseInt(b.pos*(b.end[2]-b.start[2])+b.start[2],10),255),0)+")"}});var n={aqua:[0,255,255],azure:[240,255,255],beige:[245,245,220],black:[0, +0,0],blue:[0,0,255],brown:[165,42,42],cyan:[0,255,255],darkblue:[0,0,139],darkcyan:[0,139,139],darkgrey:[169,169,169],darkgreen:[0,100,0],darkkhaki:[189,183,107],darkmagenta:[139,0,139],darkolivegreen:[85,107,47],darkorange:[255,140,0],darkorchid:[153,50,204],darkred:[139,0,0],darksalmon:[233,150,122],darkviolet:[148,0,211],fuchsia:[255,0,255],gold:[255,215,0],green:[0,128,0],indigo:[75,0,130],khaki:[240,230,140],lightblue:[173,216,230],lightcyan:[224,255,255],lightgreen:[144,238,144],lightgrey:[211, +211,211],lightpink:[255,182,193],lightyellow:[255,255,224],lime:[0,255,0],magenta:[255,0,255],maroon:[128,0,0],navy:[0,0,128],olive:[128,128,0],orange:[255,165,0],pink:[255,192,203],purple:[128,0,128],violet:[128,0,128],red:[255,0,0],silver:[192,192,192],white:[255,255,255],yellow:[255,255,0],transparent:[255,255,255]},q=["add","remove","toggle"],t={border:1,borderBottom:1,borderColor:1,borderLeft:1,borderRight:1,borderTop:1,borderWidth:1,margin:1,padding:1};f.effects.animateClass=function(c,a,b, +d){if(f.isFunction(b)){d=b;b=null}return this.queue(function(){var e=f(this),g=e.attr("style")||" ",h=p(o.call(this)),r,v=e.attr("class");f.each(q,function(w,i){c[i]&&e[i+"Class"](c[i])});r=p(o.call(this));e.attr("class",v);e.animate(u(h,r),{queue:false,duration:a,easing:b,complete:function(){f.each(q,function(w,i){c[i]&&e[i+"Class"](c[i])});if(typeof e.attr("style")=="object"){e.attr("style").cssText="";e.attr("style").cssText=g}else e.attr("style",g);d&&d.apply(this,arguments);f.dequeue(this)}})})}; +f.fn.extend({_addClass:f.fn.addClass,addClass:function(c,a,b,d){return a?f.effects.animateClass.apply(this,[{add:c},a,b,d]):this._addClass(c)},_removeClass:f.fn.removeClass,removeClass:function(c,a,b,d){return a?f.effects.animateClass.apply(this,[{remove:c},a,b,d]):this._removeClass(c)},_toggleClass:f.fn.toggleClass,toggleClass:function(c,a,b,d,e){return typeof a=="boolean"||a===j?b?f.effects.animateClass.apply(this,[a?{add:c}:{remove:c},b,d,e]):this._toggleClass(c,a):f.effects.animateClass.apply(this, +[{toggle:c},a,b,d])},switchClass:function(c,a,b,d,e){return f.effects.animateClass.apply(this,[{add:a,remove:c},b,d,e])}});f.extend(f.effects,{version:"1.8.16",save:function(c,a){for(var b=0;b").addClass("ui-effects-wrapper").css({fontSize:"100%",background:"transparent",border:"none",margin:0,padding:0}), +d=document.activeElement;c.wrap(b);if(c[0]===d||f.contains(c[0],d))f(d).focus();b=c.parent();if(c.css("position")=="static"){b.css({position:"relative"});c.css({position:"relative"})}else{f.extend(a,{position:c.css("position"),zIndex:c.css("z-index")});f.each(["top","left","bottom","right"],function(e,g){a[g]=c.css(g);if(isNaN(parseInt(a[g],10)))a[g]="auto"});c.css({position:"relative",top:0,left:0,right:"auto",bottom:"auto"})}return b.css(a).show()},removeWrapper:function(c){var a,b=document.activeElement; +if(c.parent().is(".ui-effects-wrapper")){a=c.parent().replaceWith(c);if(c[0]===b||f.contains(c[0],b))f(b).focus();return a}return c},setTransition:function(c,a,b,d){d=d||{};f.each(a,function(e,g){unit=c.cssUnit(g);if(unit[0]>0)d[g]=unit[0]*b+unit[1]});return d}});f.fn.extend({effect:function(c){var a=k.apply(this,arguments),b={options:a[1],duration:a[2],callback:a[3]};a=b.options.mode;var d=f.effects[c];if(f.fx.off||!d)return a?this[a](b.duration,b.callback):this.each(function(){b.callback&&b.callback.call(this)}); +return d.call(this,b)},_show:f.fn.show,show:function(c){if(l(c))return this._show.apply(this,arguments);else{var a=k.apply(this,arguments);a[1].mode="show";return this.effect.apply(this,a)}},_hide:f.fn.hide,hide:function(c){if(l(c))return this._hide.apply(this,arguments);else{var a=k.apply(this,arguments);a[1].mode="hide";return this.effect.apply(this,a)}},__toggle:f.fn.toggle,toggle:function(c){if(l(c)||typeof c==="boolean"||f.isFunction(c))return this.__toggle.apply(this,arguments);else{var a=k.apply(this, +arguments);a[1].mode="toggle";return this.effect.apply(this,a)}},cssUnit:function(c){var a=this.css(c),b=[];f.each(["em","px","%","pt"],function(d,e){if(a.indexOf(e)>0)b=[parseFloat(a),e]});return b}});f.easing.jswing=f.easing.swing;f.extend(f.easing,{def:"easeOutQuad",swing:function(c,a,b,d,e){return f.easing[f.easing.def](c,a,b,d,e)},easeInQuad:function(c,a,b,d,e){return d*(a/=e)*a+b},easeOutQuad:function(c,a,b,d,e){return-d*(a/=e)*(a-2)+b},easeInOutQuad:function(c,a,b,d,e){if((a/=e/2)<1)return d/ +2*a*a+b;return-d/2*(--a*(a-2)-1)+b},easeInCubic:function(c,a,b,d,e){return d*(a/=e)*a*a+b},easeOutCubic:function(c,a,b,d,e){return d*((a=a/e-1)*a*a+1)+b},easeInOutCubic:function(c,a,b,d,e){if((a/=e/2)<1)return d/2*a*a*a+b;return d/2*((a-=2)*a*a+2)+b},easeInQuart:function(c,a,b,d,e){return d*(a/=e)*a*a*a+b},easeOutQuart:function(c,a,b,d,e){return-d*((a=a/e-1)*a*a*a-1)+b},easeInOutQuart:function(c,a,b,d,e){if((a/=e/2)<1)return d/2*a*a*a*a+b;return-d/2*((a-=2)*a*a*a-2)+b},easeInQuint:function(c,a,b, +d,e){return d*(a/=e)*a*a*a*a+b},easeOutQuint:function(c,a,b,d,e){return d*((a=a/e-1)*a*a*a*a+1)+b},easeInOutQuint:function(c,a,b,d,e){if((a/=e/2)<1)return d/2*a*a*a*a*a+b;return d/2*((a-=2)*a*a*a*a+2)+b},easeInSine:function(c,a,b,d,e){return-d*Math.cos(a/e*(Math.PI/2))+d+b},easeOutSine:function(c,a,b,d,e){return d*Math.sin(a/e*(Math.PI/2))+b},easeInOutSine:function(c,a,b,d,e){return-d/2*(Math.cos(Math.PI*a/e)-1)+b},easeInExpo:function(c,a,b,d,e){return a==0?b:d*Math.pow(2,10*(a/e-1))+b},easeOutExpo:function(c, +a,b,d,e){return a==e?b+d:d*(-Math.pow(2,-10*a/e)+1)+b},easeInOutExpo:function(c,a,b,d,e){if(a==0)return b;if(a==e)return b+d;if((a/=e/2)<1)return d/2*Math.pow(2,10*(a-1))+b;return d/2*(-Math.pow(2,-10*--a)+2)+b},easeInCirc:function(c,a,b,d,e){return-d*(Math.sqrt(1-(a/=e)*a)-1)+b},easeOutCirc:function(c,a,b,d,e){return d*Math.sqrt(1-(a=a/e-1)*a)+b},easeInOutCirc:function(c,a,b,d,e){if((a/=e/2)<1)return-d/2*(Math.sqrt(1-a*a)-1)+b;return d/2*(Math.sqrt(1-(a-=2)*a)+1)+b},easeInElastic:function(c,a,b, +d,e){c=1.70158;var g=0,h=d;if(a==0)return b;if((a/=e)==1)return b+d;g||(g=e*0.3);if(h").css({position:"absolute",visibility:"visible",left:-f*(h/d),top:-e*(i/c)}).parent().addClass("ui-effects-explode").css({position:"absolute",overflow:"hidden",width:h/d,height:i/c,left:g.left+f*(h/d)+(a.options.mode=="show"?(f-Math.floor(d/2))*(h/d):0),top:g.top+e*(i/c)+(a.options.mode=="show"?(e-Math.floor(c/2))*(i/c):0),opacity:a.options.mode=="show"?0:1}).animate({left:g.left+f*(h/d)+(a.options.mode=="show"?0:(f-Math.floor(d/2))*(h/d)),top:g.top+ +e*(i/c)+(a.options.mode=="show"?0:(e-Math.floor(c/2))*(i/c)),opacity:a.options.mode=="show"?1:0},a.duration||500);setTimeout(function(){a.options.mode=="show"?b.css({visibility:"visible"}):b.css({visibility:"visible"}).hide();a.callback&&a.callback.apply(b[0]);b.dequeue();j("div.ui-effects-explode").remove()},a.duration||500)})}})(jQuery); +;/* + * jQuery UI Effects Fade 1.8.16 + * + * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about) + * Dual licensed under the MIT or GPL Version 2 licenses. + * http://jquery.org/license + * + * http://docs.jquery.com/UI/Effects/Fade + * + * Depends: + * jquery.effects.core.js + */ +(function(b){b.effects.fade=function(a){return this.queue(function(){var c=b(this),d=b.effects.setMode(c,a.options.mode||"hide");c.animate({opacity:d},{queue:false,duration:a.duration,easing:a.options.easing,complete:function(){a.callback&&a.callback.apply(this,arguments);c.dequeue()}})})}})(jQuery); +;/* + * jQuery UI Effects Fold 1.8.16 + * + * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about) + * Dual licensed under the MIT or GPL Version 2 licenses. + * http://jquery.org/license + * + * http://docs.jquery.com/UI/Effects/Fold + * + * Depends: + * jquery.effects.core.js + */ +(function(c){c.effects.fold=function(a){return this.queue(function(){var b=c(this),j=["position","top","bottom","left","right"],d=c.effects.setMode(b,a.options.mode||"hide"),g=a.options.size||15,h=!!a.options.horizFirst,k=a.duration?a.duration/2:c.fx.speeds._default/2;c.effects.save(b,j);b.show();var e=c.effects.createWrapper(b).css({overflow:"hidden"}),f=d=="show"!=h,l=f?["width","height"]:["height","width"];f=f?[e.width(),e.height()]:[e.height(),e.width()];var i=/([0-9]+)%/.exec(g);if(i)g=parseInt(i[1], +10)/100*f[d=="hide"?0:1];if(d=="show")e.css(h?{height:0,width:g}:{height:g,width:0});h={};i={};h[l[0]]=d=="show"?f[0]:g;i[l[1]]=d=="show"?f[1]:0;e.animate(h,k,a.options.easing).animate(i,k,a.options.easing,function(){d=="hide"&&b.hide();c.effects.restore(b,j);c.effects.removeWrapper(b);a.callback&&a.callback.apply(b[0],arguments);b.dequeue()})})}})(jQuery); +;/* + * jQuery UI Effects Highlight 1.8.16 + * + * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about) + * Dual licensed under the MIT or GPL Version 2 licenses. + * http://jquery.org/license + * + * http://docs.jquery.com/UI/Effects/Highlight + * + * Depends: + * jquery.effects.core.js + */ +(function(b){b.effects.highlight=function(c){return this.queue(function(){var a=b(this),e=["backgroundImage","backgroundColor","opacity"],d=b.effects.setMode(a,c.options.mode||"show"),f={backgroundColor:a.css("backgroundColor")};if(d=="hide")f.opacity=0;b.effects.save(a,e);a.show().css({backgroundImage:"none",backgroundColor:c.options.color||"#ffff99"}).animate(f,{queue:false,duration:c.duration,easing:c.options.easing,complete:function(){d=="hide"&&a.hide();b.effects.restore(a,e);d=="show"&&!b.support.opacity&& +this.style.removeAttribute("filter");c.callback&&c.callback.apply(this,arguments);a.dequeue()}})})}})(jQuery); +;/* + * jQuery UI Effects Pulsate 1.8.16 + * + * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about) + * Dual licensed under the MIT or GPL Version 2 licenses. + * http://jquery.org/license + * + * http://docs.jquery.com/UI/Effects/Pulsate + * + * Depends: + * jquery.effects.core.js + */ +(function(d){d.effects.pulsate=function(a){return this.queue(function(){var b=d(this),c=d.effects.setMode(b,a.options.mode||"show");times=(a.options.times||5)*2-1;duration=a.duration?a.duration/2:d.fx.speeds._default/2;isVisible=b.is(":visible");animateTo=0;if(!isVisible){b.css("opacity",0).show();animateTo=1}if(c=="hide"&&isVisible||c=="show"&&!isVisible)times--;for(c=0;c').appendTo(document.body).addClass(a.options.className).css({top:d.top,left:d.left,height:b.innerHeight(),width:b.innerWidth(),position:"absolute"}).animate(c,a.duration,a.options.easing,function(){f.remove();a.callback&&a.callback.apply(b[0],arguments); +b.dequeue()})})}})(jQuery); +; \ No newline at end of file diff --git a/src/views/htmlcontent/src/app/libs/SlickGrid/lib/jquery.event.drag-2.2.js b/src/views/htmlcontent/src/app/libs/SlickGrid/lib/jquery.event.drag-2.2.js new file mode 100644 index 0000000000..f2c1d57e6d --- /dev/null +++ b/src/views/htmlcontent/src/app/libs/SlickGrid/lib/jquery.event.drag-2.2.js @@ -0,0 +1,402 @@ +/*! + * jquery.event.drag - v 2.2 + * Copyright (c) 2010 Three Dub Media - http://threedubmedia.com + * Open Source MIT License - http://threedubmedia.com/code/license + */ +// Created: 2008-06-04 +// Updated: 2012-05-21 +// REQUIRES: jquery 1.7.x + +;(function( $ ){ + +// add the jquery instance method +$.fn.drag = function( str, arg, opts ){ + // figure out the event type + var type = typeof str == "string" ? str : "", + // figure out the event handler... + fn = $.isFunction( str ) ? str : $.isFunction( arg ) ? arg : null; + // fix the event type + if ( type.indexOf("drag") !== 0 ) + type = "drag"+ type; + // were options passed + opts = ( str == fn ? arg : opts ) || {}; + // trigger or bind event handler + return fn ? this.bind( type, opts, fn ) : this.trigger( type ); +}; + +// local refs (increase compression) +var $event = $.event, +$special = $event.special, +// configure the drag special event +drag = $special.drag = { + + // these are the default settings + defaults: { + which: 1, // mouse button pressed to start drag sequence + distance: 0, // distance dragged before dragstart + not: ':input', // selector to suppress dragging on target elements + handle: null, // selector to match handle target elements + relative: false, // true to use "position", false to use "offset" + drop: true, // false to suppress drop events, true or selector to allow + click: false // false to suppress click events after dragend (no proxy) + }, + + // the key name for stored drag data + datakey: "dragdata", + + // prevent bubbling for better performance + noBubble: true, + + // count bound related events + add: function( obj ){ + // read the interaction data + var data = $.data( this, drag.datakey ), + // read any passed options + opts = obj.data || {}; + // count another realted event + data.related += 1; + // extend data options bound with this event + // don't iterate "opts" in case it is a node + $.each( drag.defaults, function( key, def ){ + if ( opts[ key ] !== undefined ) + data[ key ] = opts[ key ]; + }); + }, + + // forget unbound related events + remove: function(){ + $.data( this, drag.datakey ).related -= 1; + }, + + // configure interaction, capture settings + setup: function(){ + // check for related events + if ( $.data( this, drag.datakey ) ) + return; + // initialize the drag data with copied defaults + var data = $.extend({ related:0 }, drag.defaults ); + // store the interaction data + $.data( this, drag.datakey, data ); + // bind the mousedown event, which starts drag interactions + $event.add( this, "touchstart mousedown", drag.init, data ); + // prevent image dragging in IE... + if ( this.attachEvent ) + this.attachEvent("ondragstart", drag.dontstart ); + }, + + // destroy configured interaction + teardown: function(){ + var data = $.data( this, drag.datakey ) || {}; + // check for related events + if ( data.related ) + return; + // remove the stored data + $.removeData( this, drag.datakey ); + // remove the mousedown event + $event.remove( this, "touchstart mousedown", drag.init ); + // enable text selection + drag.textselect( true ); + // un-prevent image dragging in IE... + if ( this.detachEvent ) + this.detachEvent("ondragstart", drag.dontstart ); + }, + + // initialize the interaction + init: function( event ){ + // sorry, only one touch at a time + if ( drag.touched ) + return; + // the drag/drop interaction data + var dd = event.data, results; + // check the which directive + if ( event.which != 0 && dd.which > 0 && event.which != dd.which ) + return; + // check for suppressed selector + if ( $( event.target ).is( dd.not ) ) + return; + // check for handle selector + if ( dd.handle && !$( event.target ).closest( dd.handle, event.currentTarget ).length ) + return; + + drag.touched = event.type == 'touchstart' ? this : null; + dd.propagates = 1; + dd.mousedown = this; + dd.interactions = [ drag.interaction( this, dd ) ]; + dd.target = event.target; + dd.pageX = event.pageX; + dd.pageY = event.pageY; + dd.dragging = null; + // handle draginit event... + results = drag.hijack( event, "draginit", dd ); + // early cancel + if ( !dd.propagates ) + return; + // flatten the result set + results = drag.flatten( results ); + // insert new interaction elements + if ( results && results.length ){ + dd.interactions = []; + $.each( results, function(){ + dd.interactions.push( drag.interaction( this, dd ) ); + }); + } + // remember how many interactions are propagating + dd.propagates = dd.interactions.length; + // locate and init the drop targets + if ( dd.drop !== false && $special.drop ) + $special.drop.handler( event, dd ); + // disable text selection + drag.textselect( false ); + // bind additional events... + if ( drag.touched ) + $event.add( drag.touched, "touchmove touchend", drag.handler, dd ); + else + $event.add( document, "mousemove mouseup", drag.handler, dd ); + // helps prevent text selection or scrolling + if ( !drag.touched || dd.live ) + return false; + }, + + // returns an interaction object + interaction: function( elem, dd ){ + var offset = $( elem )[ dd.relative ? "position" : "offset" ]() || { top:0, left:0 }; + return { + drag: elem, + callback: new drag.callback(), + droppable: [], + offset: offset + }; + }, + + // handle drag-releatd DOM events + handler: function( event ){ + // read the data before hijacking anything + var dd = event.data; + // handle various events + switch ( event.type ){ + // mousemove, check distance, start dragging + case !dd.dragging && 'touchmove': + event.preventDefault(); + case !dd.dragging && 'mousemove': + // drag tolerance, x≤ + y≤ = distance≤ + if ( Math.pow( event.pageX-dd.pageX, 2 ) + Math.pow( event.pageY-dd.pageY, 2 ) < Math.pow( dd.distance, 2 ) ) + break; // distance tolerance not reached + event.target = dd.target; // force target from "mousedown" event (fix distance issue) + drag.hijack( event, "dragstart", dd ); // trigger "dragstart" + if ( dd.propagates ) // "dragstart" not rejected + dd.dragging = true; // activate interaction + // mousemove, dragging + case 'touchmove': + event.preventDefault(); + case 'mousemove': + if ( dd.dragging ){ + // trigger "drag" + drag.hijack( event, "drag", dd ); + if ( dd.propagates ){ + // manage drop events + if ( dd.drop !== false && $special.drop ) + $special.drop.handler( event, dd ); // "dropstart", "dropend" + break; // "drag" not rejected, stop + } + event.type = "mouseup"; // helps "drop" handler behave + } + // mouseup, stop dragging + case 'touchend': + case 'mouseup': + default: + if ( drag.touched ) + $event.remove( drag.touched, "touchmove touchend", drag.handler ); // remove touch events + else + $event.remove( document, "mousemove mouseup", drag.handler ); // remove page events + if ( dd.dragging ){ + if ( dd.drop !== false && $special.drop ) + $special.drop.handler( event, dd ); // "drop" + drag.hijack( event, "dragend", dd ); // trigger "dragend" + } + drag.textselect( true ); // enable text selection + // if suppressing click events... + if ( dd.click === false && dd.dragging ) + $.data( dd.mousedown, "suppress.click", new Date().getTime() + 5 ); + dd.dragging = drag.touched = false; // deactivate element + break; + } + }, + + // re-use event object for custom events + hijack: function( event, type, dd, x, elem ){ + // not configured + if ( !dd ) + return; + // remember the original event and type + var orig = { event:event.originalEvent, type:event.type }, + // is the event drag related or drog related? + mode = type.indexOf("drop") ? "drag" : "drop", + // iteration vars + result, i = x || 0, ia, $elems, callback, + len = !isNaN( x ) ? x : dd.interactions.length; + // modify the event type + event.type = type; + // remove the original event + event.originalEvent = null; + // initialize the results + dd.results = []; + // handle each interacted element + do if ( ia = dd.interactions[ i ] ){ + // validate the interaction + if ( type !== "dragend" && ia.cancelled ) + continue; + // set the dragdrop properties on the event object + callback = drag.properties( event, dd, ia ); + // prepare for more results + ia.results = []; + // handle each element + $( elem || ia[ mode ] || dd.droppable ).each(function( p, subject ){ + // identify drag or drop targets individually + callback.target = subject; + // force propagtion of the custom event + event.isPropagationStopped = function(){ return false; }; + // handle the event + result = subject ? $event.dispatch.call( subject, event, callback ) : null; + // stop the drag interaction for this element + if ( result === false ){ + if ( mode == "drag" ){ + ia.cancelled = true; + dd.propagates -= 1; + } + if ( type == "drop" ){ + ia[ mode ][p] = null; + } + } + // assign any dropinit elements + else if ( type == "dropinit" ) + ia.droppable.push( drag.element( result ) || subject ); + // accept a returned proxy element + if ( type == "dragstart" ) + ia.proxy = $( drag.element( result ) || ia.drag )[0]; + // remember this result + ia.results.push( result ); + // forget the event result, for recycling + delete event.result; + // break on cancelled handler + if ( type !== "dropinit" ) + return result; + }); + // flatten the results + dd.results[ i ] = drag.flatten( ia.results ); + // accept a set of valid drop targets + if ( type == "dropinit" ) + ia.droppable = drag.flatten( ia.droppable ); + // locate drop targets + if ( type == "dragstart" && !ia.cancelled ) + callback.update(); + } + while ( ++i < len ) + // restore the original event & type + event.type = orig.type; + event.originalEvent = orig.event; + // return all handler results + return drag.flatten( dd.results ); + }, + + // extend the callback object with drag/drop properties... + properties: function( event, dd, ia ){ + var obj = ia.callback; + // elements + obj.drag = ia.drag; + obj.proxy = ia.proxy || ia.drag; + // starting mouse position + obj.startX = dd.pageX; + obj.startY = dd.pageY; + // current distance dragged + obj.deltaX = event.pageX - dd.pageX; + obj.deltaY = event.pageY - dd.pageY; + // original element position + obj.originalX = ia.offset.left; + obj.originalY = ia.offset.top; + // adjusted element position + obj.offsetX = obj.originalX + obj.deltaX; + obj.offsetY = obj.originalY + obj.deltaY; + // assign the drop targets information + obj.drop = drag.flatten( ( ia.drop || [] ).slice() ); + obj.available = drag.flatten( ( ia.droppable || [] ).slice() ); + return obj; + }, + + // determine is the argument is an element or jquery instance + element: function( arg ){ + if ( arg && ( arg.jquery || arg.nodeType == 1 ) ) + return arg; + }, + + // flatten nested jquery objects and arrays into a single dimension array + flatten: function( arr ){ + return $.map( arr, function( member ){ + return member && member.jquery ? $.makeArray( member ) : + member && member.length ? drag.flatten( member ) : member; + }); + }, + + // toggles text selection attributes ON (true) or OFF (false) + textselect: function( bool ){ + $( document )[ bool ? "unbind" : "bind" ]("selectstart", drag.dontstart ) + .css("MozUserSelect", bool ? "" : "none" ); + // .attr("unselectable", bool ? "off" : "on" ) + document.unselectable = bool ? "off" : "on"; + }, + + // suppress "selectstart" and "ondragstart" events + dontstart: function(){ + return false; + }, + + // a callback instance contructor + callback: function(){} + +}; + +// callback methods +drag.callback.prototype = { + update: function(){ + if ( $special.drop && this.available.length ) + $.each( this.available, function( i ){ + $special.drop.locate( this, i ); + }); + } +}; + +// patch $.event.$dispatch to allow suppressing clicks +var $dispatch = $event.dispatch; +$event.dispatch = function( event ){ + if ( $.data( this, "suppress."+ event.type ) - new Date().getTime() > 0 ){ + $.removeData( this, "suppress."+ event.type ); + return; + } + return $dispatch.apply( this, arguments ); +}; + +// event fix hooks for touch events... +var touchHooks = +$event.fixHooks.touchstart = +$event.fixHooks.touchmove = +$event.fixHooks.touchend = +$event.fixHooks.touchcancel = { + props: "clientX clientY pageX pageY screenX screenY".split( " " ), + filter: function( event, orig ) { + if ( orig ){ + var touched = ( orig.touches && orig.touches[0] ) + || ( orig.changedTouches && orig.changedTouches[0] ) + || null; + // iOS webkit: touchstart, touchmove, touchend + if ( touched ) + $.each( touchHooks.props, function( i, prop ){ + event[ prop ] = touched[ prop ]; + }); + } + return event; + } +}; + +// share the same special event configuration with related events... +$special.draginit = $special.dragstart = $special.dragend = drag; + +})( jQuery ); \ No newline at end of file diff --git a/src/views/htmlcontent/src/app/libs/SlickGrid/lib/jquery.event.drop-2.2.js b/src/views/htmlcontent/src/app/libs/SlickGrid/lib/jquery.event.drop-2.2.js new file mode 100644 index 0000000000..7599ef91e7 --- /dev/null +++ b/src/views/htmlcontent/src/app/libs/SlickGrid/lib/jquery.event.drop-2.2.js @@ -0,0 +1,302 @@ +/*! + * jquery.event.drop - v 2.2 + * Copyright (c) 2010 Three Dub Media - http://threedubmedia.com + * Open Source MIT License - http://threedubmedia.com/code/license + */ +// Created: 2008-06-04 +// Updated: 2012-05-21 +// REQUIRES: jquery 1.7.x, event.drag 2.2 + +;(function($){ // secure $ jQuery alias + +// Events: drop, dropstart, dropend + +// add the jquery instance method +$.fn.drop = function( str, arg, opts ){ + // figure out the event type + var type = typeof str == "string" ? str : "", + // figure out the event handler... + fn = $.isFunction( str ) ? str : $.isFunction( arg ) ? arg : null; + // fix the event type + if ( type.indexOf("drop") !== 0 ) + type = "drop"+ type; + // were options passed + opts = ( str == fn ? arg : opts ) || {}; + // trigger or bind event handler + return fn ? this.bind( type, opts, fn ) : this.trigger( type ); +}; + +// DROP MANAGEMENT UTILITY +// returns filtered drop target elements, caches their positions +$.drop = function( opts ){ + opts = opts || {}; + // safely set new options... + drop.multi = opts.multi === true ? Infinity : + opts.multi === false ? 1 : !isNaN( opts.multi ) ? opts.multi : drop.multi; + drop.delay = opts.delay || drop.delay; + drop.tolerance = $.isFunction( opts.tolerance ) ? opts.tolerance : + opts.tolerance === null ? null : drop.tolerance; + drop.mode = opts.mode || drop.mode || 'intersect'; +}; + +// local refs (increase compression) +var $event = $.event, +$special = $event.special, +// configure the drop special event +drop = $.event.special.drop = { + + // these are the default settings + multi: 1, // allow multiple drop winners per dragged element + delay: 20, // async timeout delay + mode: 'overlap', // drop tolerance mode + + // internal cache + targets: [], + + // the key name for stored drop data + datakey: "dropdata", + + // prevent bubbling for better performance + noBubble: true, + + // count bound related events + add: function( obj ){ + // read the interaction data + var data = $.data( this, drop.datakey ); + // count another realted event + data.related += 1; + }, + + // forget unbound related events + remove: function(){ + $.data( this, drop.datakey ).related -= 1; + }, + + // configure the interactions + setup: function(){ + // check for related events + if ( $.data( this, drop.datakey ) ) + return; + // initialize the drop element data + var data = { + related: 0, + active: [], + anyactive: 0, + winner: 0, + location: {} + }; + // store the drop data on the element + $.data( this, drop.datakey, data ); + // store the drop target in internal cache + drop.targets.push( this ); + }, + + // destroy the configure interaction + teardown: function(){ + var data = $.data( this, drop.datakey ) || {}; + // check for related events + if ( data.related ) + return; + // remove the stored data + $.removeData( this, drop.datakey ); + // reference the targeted element + var element = this; + // remove from the internal cache + drop.targets = $.grep( drop.targets, function( target ){ + return ( target !== element ); + }); + }, + + // shared event handler + handler: function( event, dd ){ + // local vars + var results, $targets; + // make sure the right data is available + if ( !dd ) + return; + // handle various events + switch ( event.type ){ + // draginit, from $.event.special.drag + case 'mousedown': // DROPINIT >> + case 'touchstart': // DROPINIT >> + // collect and assign the drop targets + $targets = $( drop.targets ); + if ( typeof dd.drop == "string" ) + $targets = $targets.filter( dd.drop ); + // reset drop data winner properties + $targets.each(function(){ + var data = $.data( this, drop.datakey ); + data.active = []; + data.anyactive = 0; + data.winner = 0; + }); + // set available target elements + dd.droppable = $targets; + // activate drop targets for the initial element being dragged + $special.drag.hijack( event, "dropinit", dd ); + break; + // drag, from $.event.special.drag + case 'mousemove': // TOLERATE >> + case 'touchmove': // TOLERATE >> + drop.event = event; // store the mousemove event + if ( !drop.timer ) + // monitor drop targets + drop.tolerate( dd ); + break; + // dragend, from $.event.special.drag + case 'mouseup': // DROP >> DROPEND >> + case 'touchend': // DROP >> DROPEND >> + drop.timer = clearTimeout( drop.timer ); // delete timer + if ( dd.propagates ){ + $special.drag.hijack( event, "drop", dd ); + $special.drag.hijack( event, "dropend", dd ); + } + break; + + } + }, + + // returns the location positions of an element + locate: function( elem, index ){ + var data = $.data( elem, drop.datakey ), + $elem = $( elem ), + posi = $elem.offset() || {}, + height = $elem.outerHeight(), + width = $elem.outerWidth(), + location = { + elem: elem, + width: width, + height: height, + top: posi.top, + left: posi.left, + right: posi.left + width, + bottom: posi.top + height + }; + // drag elements might not have dropdata + if ( data ){ + data.location = location; + data.index = index; + data.elem = elem; + } + return location; + }, + + // test the location positions of an element against another OR an X,Y coord + contains: function( target, test ){ // target { location } contains test [x,y] or { location } + return ( ( test[0] || test.left ) >= target.left && ( test[0] || test.right ) <= target.right + && ( test[1] || test.top ) >= target.top && ( test[1] || test.bottom ) <= target.bottom ); + }, + + // stored tolerance modes + modes: { // fn scope: "$.event.special.drop" object + // target with mouse wins, else target with most overlap wins + 'intersect': function( event, proxy, target ){ + return this.contains( target, [ event.pageX, event.pageY ] ) ? // check cursor + 1e9 : this.modes.overlap.apply( this, arguments ); // check overlap + }, + // target with most overlap wins + 'overlap': function( event, proxy, target ){ + // calculate the area of overlap... + return Math.max( 0, Math.min( target.bottom, proxy.bottom ) - Math.max( target.top, proxy.top ) ) + * Math.max( 0, Math.min( target.right, proxy.right ) - Math.max( target.left, proxy.left ) ); + }, + // proxy is completely contained within target bounds + 'fit': function( event, proxy, target ){ + return this.contains( target, proxy ) ? 1 : 0; + }, + // center of the proxy is contained within target bounds + 'middle': function( event, proxy, target ){ + return this.contains( target, [ proxy.left + proxy.width * .5, proxy.top + proxy.height * .5 ] ) ? 1 : 0; + } + }, + + // sort drop target cache by by winner (dsc), then index (asc) + sort: function( a, b ){ + return ( b.winner - a.winner ) || ( a.index - b.index ); + }, + + // async, recursive tolerance execution + tolerate: function( dd ){ + // declare local refs + var i, drp, drg, data, arr, len, elem, + // interaction iteration variables + x = 0, ia, end = dd.interactions.length, + // determine the mouse coords + xy = [ drop.event.pageX, drop.event.pageY ], + // custom or stored tolerance fn + tolerance = drop.tolerance || drop.modes[ drop.mode ]; + // go through each passed interaction... + do if ( ia = dd.interactions[x] ){ + // check valid interaction + if ( !ia ) + return; + // initialize or clear the drop data + ia.drop = []; + // holds the drop elements + arr = []; + len = ia.droppable.length; + // determine the proxy location, if needed + if ( tolerance ) + drg = drop.locate( ia.proxy ); + // reset the loop + i = 0; + // loop each stored drop target + do if ( elem = ia.droppable[i] ){ + data = $.data( elem, drop.datakey ); + drp = data.location; + if ( !drp ) continue; + // find a winner: tolerance function is defined, call it + data.winner = tolerance ? tolerance.call( drop, drop.event, drg, drp ) + // mouse position is always the fallback + : drop.contains( drp, xy ) ? 1 : 0; + arr.push( data ); + } while ( ++i < len ); // loop + // sort the drop targets + arr.sort( drop.sort ); + // reset the loop + i = 0; + // loop through all of the targets again + do if ( data = arr[ i ] ){ + // winners... + if ( data.winner && ia.drop.length < drop.multi ){ + // new winner... dropstart + if ( !data.active[x] && !data.anyactive ){ + // check to make sure that this is not prevented + if ( $special.drag.hijack( drop.event, "dropstart", dd, x, data.elem )[0] !== false ){ + data.active[x] = 1; + data.anyactive += 1; + } + // if false, it is not a winner + else + data.winner = 0; + } + // if it is still a winner + if ( data.winner ) + ia.drop.push( data.elem ); + } + // losers... + else if ( data.active[x] && data.anyactive == 1 ){ + // former winner... dropend + $special.drag.hijack( drop.event, "dropend", dd, x, data.elem ); + data.active[x] = 0; + data.anyactive -= 1; + } + } while ( ++i < len ); // loop + } while ( ++x < end ) // loop + // check if the mouse is still moving or is idle + if ( drop.last && xy[0] == drop.last.pageX && xy[1] == drop.last.pageY ) + delete drop.timer; // idle, don't recurse + else // recurse + drop.timer = setTimeout(function(){ + drop.tolerate( dd ); + }, drop.delay ); + // remember event, to compare idleness + drop.last = drop.event; + } + +}; + +// share the same special event configuration with related events... +$special.dropinit = $special.dropstart = $special.dropend = drop; + +})(jQuery); // confine scope \ No newline at end of file diff --git a/src/views/htmlcontent/src/app/libs/SlickGrid/lib/jquery.jsonp-2.4.min.js b/src/views/htmlcontent/src/app/libs/SlickGrid/lib/jquery.jsonp-2.4.min.js new file mode 100644 index 0000000000..e7c6f57346 --- /dev/null +++ b/src/views/htmlcontent/src/app/libs/SlickGrid/lib/jquery.jsonp-2.4.min.js @@ -0,0 +1,3 @@ +// jquery.jsonp 2.4.0 (c)2012 Julian Aubourg | MIT License +// https://github.com/jaubourg/jquery-jsonp +(function(e){function t(){}function n(e){C=[e]}function r(e,t,n){return e&&e.apply&&e.apply(t.context||t,n)}function i(e){return/\?/.test(e)?"&":"?"}function O(c){function Y(e){z++||(W(),j&&(T[I]={s:[e]}),D&&(e=D.apply(c,[e])),r(O,c,[e,b,c]),r(_,c,[c,b]))}function Z(e){z++||(W(),j&&e!=w&&(T[I]=e),r(M,c,[c,e]),r(_,c,[c,e]))}c=e.extend({},k,c);var O=c.success,M=c.error,_=c.complete,D=c.dataFilter,P=c.callbackParameter,H=c.callback,B=c.cache,j=c.pageCache,F=c.charset,I=c.url,q=c.data,R=c.timeout,U,z=0,W=t,X,V,J,K,Q,G;return S&&S(function(e){e.done(O).fail(M),O=e.resolve,M=e.reject}).promise(c),c.abort=function(){!(z++)&&W()},r(c.beforeSend,c,[c])===!1||z?c:(I=I||u,q=q?typeof q=="string"?q:e.param(q,c.traditional):u,I+=q?i(I)+q:u,P&&(I+=i(I)+encodeURIComponent(P)+"=?"),!B&&!j&&(I+=i(I)+"_"+(new Date).getTime()+"="),I=I.replace(/=\?(&|$)/,"="+H+"$1"),j&&(U=T[I])?U.s?Y(U.s[0]):Z(U):(E[H]=n,K=e(y)[0],K.id=l+N++,F&&(K[o]=F),L&&L.version()<11.6?(Q=e(y)[0]).text="document.getElementById('"+K.id+"')."+p+"()":K[s]=s,A&&(K.htmlFor=K.id,K.event=h),K[d]=K[p]=K[v]=function(e){if(!K[m]||!/i/.test(K[m])){try{K[h]&&K[h]()}catch(t){}e=C,C=0,e?Y(e[0]):Z(a)}},K.src=I,W=function(e){G&&clearTimeout(G),K[v]=K[d]=K[p]=null,x[g](K),Q&&x[g](Q)},x[f](K,J=x.firstChild),Q&&x[f](Q,J),G=R>0&&setTimeout(function(){Z(w)},R)),c)}var s="async",o="charset",u="",a="error",f="insertBefore",l="_jqjsp",c="on",h=c+"click",p=c+a,d=c+"load",v=c+"readystatechange",m="readyState",g="removeChild",y=" + + + + + + + + \ No newline at end of file diff --git a/src/views/htmlcontent/src/app/libs/SlickGrid/tests/grid/grid.js b/src/views/htmlcontent/src/app/libs/SlickGrid/tests/grid/grid.js new file mode 100644 index 0000000000..8441137509 --- /dev/null +++ b/src/views/htmlcontent/src/app/libs/SlickGrid/tests/grid/grid.js @@ -0,0 +1,68 @@ +(function ($) { + + var grid; + var el, offsetBefore, offsetAfter, dragged; + + var drag = function(handle, dx, dy) { + offsetBefore = el.offset(); + $(handle).simulate("drag", { + dx: dx || 0, + dy: dy || 0 + }); + dragged = { dx: dx, dy: dy }; + offsetAfter = el.offset(); + } + + var moved = function (dx, dy, msg) { + msg = msg ? msg + "." : ""; + var actual = { left: offsetAfter.left, top: offsetAfter.top }; + var expected = { left: offsetBefore.left + dx, top: offsetBefore.top + dy }; + same(actual, expected, 'dragged[' + dragged.dx + ', ' + dragged.dy + '] ' + msg); + } + + var ROWS = 500, COLS = 10; + var data = [], row; + for (var i = 0; i < ROWS; i++) { + row = { id: "id_" + i }; + for (var j = 0; j < COLS; j++) { + row["col_" + j] = i + "." + j; + } + data.push(row); + } + + var cols = [], col; + for (var i = 0; i < COLS; i++) { + cols.push({ + id: "col" + i, + field: "col_" + i, + name: "col_" + i + }); + } + + cols[0].minWidth = 70; + + grid = new Slick.Grid("#container", data, cols); + grid.render(); + + module("grid - column resizing"); + + test("minWidth is respected", function () { + var firstCol = $("#container .slick-header-column:first"); + firstCol.find(".slick-resizable-handle:first").simulate("drag", { dx: 100, dy: 0 }); + firstCol.find(".slick-resizable-handle:first").simulate("drag", { dx: -200, dy: 0 }); + equal(firstCol.outerWidth(), 70, "width set to minWidth"); + }); + + test("onColumnsResized is fired on column resize", function () { + expect(2); + grid.onColumnsResized.subscribe(function() { ok(true,"onColumnsResized called") }); + var oldWidth = cols[0].width; + $("#container .slick-resizable-handle:first").simulate("drag", { dx: 100, dy: 0 }); + equal(cols[0].width, oldWidth+100-1, "columns array is updated"); + }); + + test("getData should return data", function () { + equal(grid.getData(), data); + }); + +})(jQuery); \ No newline at end of file diff --git a/src/views/htmlcontent/src/app/libs/SlickGrid/tests/grid/index.html b/src/views/htmlcontent/src/app/libs/SlickGrid/tests/grid/index.html new file mode 100644 index 0000000000..cc089a463c --- /dev/null +++ b/src/views/htmlcontent/src/app/libs/SlickGrid/tests/grid/index.html @@ -0,0 +1,34 @@ + + + + SlickGrid - Grid tests + + + + + +

    SlickGrid - Grid Test Suite

    +

    +
    +

    +
      + +


      +
      + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/src/views/htmlcontent/src/app/libs/SlickGrid/tests/index.html b/src/views/htmlcontent/src/app/libs/SlickGrid/tests/index.html new file mode 100644 index 0000000000..a0a9f89e65 --- /dev/null +++ b/src/views/htmlcontent/src/app/libs/SlickGrid/tests/index.html @@ -0,0 +1,40 @@ + + + + SlickGrid tests + + + + + +

      SlickGrid tests

      +

      + +

      Slick.Data

      + + +

      Slick

      + + +

      Plugins

      + + + + \ No newline at end of file diff --git a/src/views/htmlcontent/src/app/libs/SlickGrid/tests/init benchmark.html b/src/views/htmlcontent/src/app/libs/SlickGrid/tests/init benchmark.html new file mode 100644 index 0000000000..8b41c84461 --- /dev/null +++ b/src/views/htmlcontent/src/app/libs/SlickGrid/tests/init benchmark.html @@ -0,0 +1,57 @@ + + + + + SlickGrid Initialization Benchmark + + + + + + + + + + + + + + + + +
      + +
      + + + + diff --git a/src/views/htmlcontent/src/app/libs/SlickGrid/tests/model benchmarks.html b/src/views/htmlcontent/src/app/libs/SlickGrid/tests/model benchmarks.html new file mode 100644 index 0000000000..155f79a9a1 --- /dev/null +++ b/src/views/htmlcontent/src/app/libs/SlickGrid/tests/model benchmarks.html @@ -0,0 +1,110 @@ + + + + + SlickGrid Model Benchmark + + + + + + + + + + diff --git a/src/views/htmlcontent/src/app/libs/SlickGrid/tests/plugins/autotooltips.html b/src/views/htmlcontent/src/app/libs/SlickGrid/tests/plugins/autotooltips.html new file mode 100644 index 0000000000..98af998c01 --- /dev/null +++ b/src/views/htmlcontent/src/app/libs/SlickGrid/tests/plugins/autotooltips.html @@ -0,0 +1,34 @@ + + + + SlickGrid - AutoTooltips plugin tests + + + + + +

      SlickGrid - AutoTooltips Test Suite

      +

      +
      +

      +
        + +


        +
        + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/src/views/htmlcontent/src/app/libs/SlickGrid/tests/plugins/autotooltips.js b/src/views/htmlcontent/src/app/libs/SlickGrid/tests/plugins/autotooltips.js new file mode 100644 index 0000000000..4d8db6f880 --- /dev/null +++ b/src/views/htmlcontent/src/app/libs/SlickGrid/tests/plugins/autotooltips.js @@ -0,0 +1,133 @@ +(function($) { + + var grid, // The SlickGrid instance + cols = [ // The column definitions + { name: "Short", field: "short", width: 100 }, + { name: "Medium", field: "medium", width: 100 }, + { name: "Long", field: "long", width: 100 }, + { name: "Mixed", field: "mixed", width: 100 }, + { name: "Long header creates tooltip", field: "header", width: 50 }, + { name: "Long header with predefined tooltip", field: "tooltipHeader", width: 50, tooltip: "Already have a tooltip!" } + ], + data = [], // The grid data + LONG_VALUE = "looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong", + MEDIUM_VALUE = "mediummmmmmm" + SHORT_VALUE = "short", + TOOLTIP = "tooltip", + TRUNCATED_VALUE = LONG_VALUE.substr(0, 17) + "...", + $container = $("#container"); + + // Create data + for (var i = 0; i < 10; i++) { + data.push({ + "id": "row" + i, + "short": SHORT_VALUE, + "medium": MEDIUM_VALUE, + "long": LONG_VALUE, + "mixed": ( i % 2 == 0 ? SHORT_VALUE : LONG_VALUE ), + "header": i, + "tooltipHeader": i + }); + } + + function setupGrid(pluginOptions) { + $('
        ').appendTo($container); + grid = new Slick.Grid("#grid", data, cols); + grid.registerPlugin(new Slick.AutoTooltips(pluginOptions)); + grid.render(); + } + + function teardownGrid() { + $container.empty(); + } + + function getCell(columnIndex) { + return $("#grid .slick-cell.l" + columnIndex).eq(0); + } + + function getHeaderCell(columnIndex) { + return $("#grid .slick-header-column").eq(columnIndex); + } + + module("plugins - autotooltips - defaults", { + setup: function () { + setupGrid({}); + }, + teardown: teardownGrid + }); + + test("title is empty when cell text has enough room", function () { + var $cell = getCell(0); // Grab a cell + $cell.trigger("mouseenter"); // Trigger hover on a cell in grid + + strictEqual($cell.attr("title"), "", "title is not present"); + }); + + test("title is present when cell text is cut off", function () { + var $cell = getCell(2); // Grab a cell + $cell.trigger("mouseenter"); // Trigger hover on a cell in grid + + strictEqual($cell.attr("title"), LONG_VALUE, "title equals cell text"); + }); + + module("plugins - autotooltips - header", { + setup: function () { + setupGrid({ enableForHeaderCells: true }); + }, + teardown: teardownGrid + }); + + test("title is empty when header column has enough width", function () { + var $headerCell = getHeaderCell(0); // Grab the requested header cell + $headerCell.trigger("mouseenter"); // Trigger hover on a header cell + + strictEqual($headerCell.attr("title"), "", "title is not present"); + }); + + test("title is present when header column is cut off", function () { + var $headerCell = getHeaderCell(4); // Grab the requested header cell + $headerCell.trigger("mouseenter"); // Trigger hover on a header cell + + strictEqual($headerCell.attr("title"), "Long header creates tooltip", "title equals column name"); + }); + + test("title is not overridden when header column has pre-defined tooltip", function() { + var $headerCell = getHeaderCell(5); // Grab the requested header cell + $headerCell.trigger("mouseenter"); // Trigger hover on a header cell + + strictEqual($headerCell.attr("title"), "Long header with predefined tooltip", "title is not overridden"); + }); + + // ******************************** // + // Tests for maximum tooltip length // + // ******************************** // + + module("plugins - autotooltips - max tooltip", { + setup: function () { + setupGrid({ maxToolTipLength: 20 }); + }, + teardown: teardownGrid + }); + + test("title is empty when cell text has enough room", function () { + var $cell = getCell(0); // Grab a cell + $cell.trigger("mouseenter"); // Trigger hover on a cell in grid + + strictEqual($cell.attr("title"), "", "title is not present"); + }); + + test("title is present and not truncated when cell text is cut off but not too long", function () { + var $cell = getCell(1); // Grab a cell + $cell.trigger("mouseenter"); // Trigger hover on a cell in grid + + strictEqual($cell.attr("title"), MEDIUM_VALUE, "title equals truncated text"); + }); + + test("title is present and truncated when cell text is cut off and too long", function () { + var $cell = getCell(2); // Grab a cell + $cell.trigger("mouseenter"); // Trigger hover on a cell in grid + + strictEqual($cell.attr("title"), TRUNCATED_VALUE, "title equals truncated text"); + }); + +})(jQuery); \ No newline at end of file diff --git a/src/views/htmlcontent/src/app/libs/SlickGrid/tests/scrolling benchmark raf.html b/src/views/htmlcontent/src/app/libs/SlickGrid/tests/scrolling benchmark raf.html new file mode 100644 index 0000000000..01ca0c57c1 --- /dev/null +++ b/src/views/htmlcontent/src/app/libs/SlickGrid/tests/scrolling benchmark raf.html @@ -0,0 +1,154 @@ + + + + + SlickGrid Scrolling Benchmark + + + + + + + + + + + + + + + + + + + + + +
        + +
        + + + + diff --git a/src/views/htmlcontent/src/app/libs/SlickGrid/tests/scrolling benchmarks.html b/src/views/htmlcontent/src/app/libs/SlickGrid/tests/scrolling benchmarks.html new file mode 100644 index 0000000000..0a2a885f2e --- /dev/null +++ b/src/views/htmlcontent/src/app/libs/SlickGrid/tests/scrolling benchmarks.html @@ -0,0 +1,135 @@ + + + + + SlickGrid Scrolling Benchmark + + + + + + + + + + + + + + + + + + + + + +
        + +
        + + + + diff --git a/src/views/htmlcontent/src/app/libs/jquery.event.drag.js b/src/views/htmlcontent/src/app/libs/jquery.event.drag.js new file mode 100644 index 0000000000..e459407bcb --- /dev/null +++ b/src/views/htmlcontent/src/app/libs/jquery.event.drag.js @@ -0,0 +1,402 @@ +/*! + * jquery.event.drag - v 2.2 + * Copyright (c) 2010 Three Dub Media - http://threedubmedia.com + * Open Source MIT License - http://threedubmedia.com/code/license + */ +// Created: 2008-06-04 +// Updated: 2012-05-21 +// REQUIRES: jquery 1.7.x + +;(function( $ ){ + +// add the jquery instance method +$.fn.drag = function( str, arg, opts ){ + // figure out the event type + var type = typeof str == "string" ? str : "", + // figure out the event handler... + fn = $.isFunction( str ) ? str : $.isFunction( arg ) ? arg : null; + // fix the event type + if ( type.indexOf("drag") !== 0 ) + type = "drag"+ type; + // were options passed + opts = ( str == fn ? arg : opts ) || {}; + // trigger or bind event handler + return fn ? this.bind( type, opts, fn ) : this.trigger( type ); +}; + +// local refs (increase compression) +var $event = $.event, +$special = $event.special, +// configure the drag special event +drag = $special.drag = { + + // these are the default settings + defaults: { + which: 1, // mouse button pressed to start drag sequence + distance: 0, // distance dragged before dragstart + not: ':input', // selector to suppress dragging on target elements + handle: null, // selector to match handle target elements + relative: false, // true to use "position", false to use "offset" + drop: true, // false to suppress drop events, true or selector to allow + click: false // false to suppress click events after dragend (no proxy) + }, + + // the key name for stored drag data + datakey: "dragdata", + + // prevent bubbling for better performance + noBubble: true, + + // count bound related events + add: function( obj ){ + // read the interaction data + var data = $.data( this, drag.datakey ), + // read any passed options + opts = obj.data || {}; + // count another realted event + data.related += 1; + // extend data options bound with this event + // don't iterate "opts" in case it is a node + $.each( drag.defaults, function( key, def ){ + if ( opts[ key ] !== undefined ) + data[ key ] = opts[ key ]; + }); + }, + + // forget unbound related events + remove: function(){ + $.data( this, drag.datakey ).related -= 1; + }, + + // configure interaction, capture settings + setup: function(){ + // check for related events + if ( $.data( this, drag.datakey ) ) + return; + // initialize the drag data with copied defaults + var data = $.extend({ related:0 }, drag.defaults ); + // store the interaction data + $.data( this, drag.datakey, data ); + // bind the mousedown event, which starts drag interactions + $event.add( this, "touchstart mousedown", drag.init, data ); + // prevent image dragging in IE... + if ( this.attachEvent ) + this.attachEvent("ondragstart", drag.dontstart ); + }, + + // destroy configured interaction + teardown: function(){ + var data = $.data( this, drag.datakey ) || {}; + // check for related events + if ( data.related ) + return; + // remove the stored data + $.removeData( this, drag.datakey ); + // remove the mousedown event + $event.remove( this, "touchstart mousedown", drag.init ); + // enable text selection + drag.textselect( true ); + // un-prevent image dragging in IE... + if ( this.detachEvent ) + this.detachEvent("ondragstart", drag.dontstart ); + }, + + // initialize the interaction + init: function( event ){ + // sorry, only one touch at a time + if ( drag.touched ) + return; + // the drag/drop interaction data + var dd = event.data, results; + // check the which directive + if ( event.which != 0 && dd.which > 0 && event.which != dd.which ) + return; + // check for suppressed selector + if ( $( event.target ).is( dd.not ) ) + return; + // check for handle selector + if ( dd.handle && !$( event.target ).closest( dd.handle, event.currentTarget ).length ) + return; + + drag.touched = event.type == 'touchstart' ? this : null; + dd.propagates = 1; + dd.mousedown = this; + dd.interactions = [ drag.interaction( this, dd ) ]; + dd.target = event.target; + dd.pageX = event.pageX; + dd.pageY = event.pageY; + dd.dragging = null; + // handle draginit event... + results = drag.hijack( event, "draginit", dd ); + // early cancel + if ( !dd.propagates ) + return; + // flatten the result set + results = drag.flatten( results ); + // insert new interaction elements + if ( results && results.length ){ + dd.interactions = []; + $.each( results, function(){ + dd.interactions.push( drag.interaction( this, dd ) ); + }); + } + // remember how many interactions are propagating + dd.propagates = dd.interactions.length; + // locate and init the drop targets + if ( dd.drop !== false && $special.drop ) + $special.drop.handler( event, dd ); + // disable text selection + drag.textselect( false ); + // bind additional events... + if ( drag.touched ) + $event.add( drag.touched, "touchmove touchend", drag.handler, dd ); + else + $event.add( document, "mousemove mouseup", drag.handler, dd ); + // helps prevent text selection or scrolling + if ( !drag.touched || dd.live ) + return false; + }, + + // returns an interaction object + interaction: function( elem, dd ){ + var offset = $( elem )[ dd.relative ? "position" : "offset" ]() || { top:0, left:0 }; + return { + drag: elem, + callback: new drag.callback(), + droppable: [], + offset: offset + }; + }, + + // handle drag-releatd DOM events + handler: function( event ){ + // read the data before hijacking anything + var dd = event.data; + // handle various events + switch ( event.type ){ + // mousemove, check distance, start dragging + case !dd.dragging && 'touchmove': + event.preventDefault(); + case !dd.dragging && 'mousemove': + // drag tolerance, x≤ + y≤ = distance≤ + if ( Math.pow( event.pageX-dd.pageX, 2 ) + Math.pow( event.pageY-dd.pageY, 2 ) < Math.pow( dd.distance, 2 ) ) + break; // distance tolerance not reached + event.target = dd.target; // force target from "mousedown" event (fix distance issue) + drag.hijack( event, "dragstart", dd ); // trigger "dragstart" + if ( dd.propagates ) // "dragstart" not rejected + dd.dragging = true; // activate interaction + // mousemove, dragging + case 'touchmove': + event.preventDefault(); + case 'mousemove': + if ( dd.dragging ){ + // trigger "drag" + drag.hijack( event, "drag", dd ); + if ( dd.propagates ){ + // manage drop events + if ( dd.drop !== false && $special.drop ) + $special.drop.handler( event, dd ); // "dropstart", "dropend" + break; // "drag" not rejected, stop + } + event.type = "mouseup"; // helps "drop" handler behave + } + // mouseup, stop dragging + case 'touchend': + case 'mouseup': + default: + if ( drag.touched ) + $event.remove( drag.touched, "touchmove touchend", drag.handler ); // remove touch events + else + $event.remove( document, "mousemove mouseup", drag.handler ); // remove page events + if ( dd.dragging ){ + if ( dd.drop !== false && $special.drop ) + $special.drop.handler( event, dd ); // "drop" + drag.hijack( event, "dragend", dd ); // trigger "dragend" + } + drag.textselect( true ); // enable text selection + // if suppressing click events... + if ( dd.click === false && dd.dragging ) + $.data( dd.mousedown, "suppress.click", new Date().getTime() + 5 ); + dd.dragging = drag.touched = false; // deactivate element + break; + } + }, + + // re-use event object for custom events + hijack: function( event, type, dd, x, elem ){ + // not configured + if ( !dd ) + return; + // remember the original event and type + var orig = { event:event.originalEvent, type:event.type }, + // is the event drag related or drog related? + mode = type.indexOf("drop") ? "drag" : "drop", + // iteration vars + result, i = x || 0, ia, $elems, callback, + len = !isNaN( x ) ? x : dd.interactions.length; + // modify the event type + event.type = type; + // remove the original event + event.originalEvent = null; + // initialize the results + dd.results = []; + // handle each interacted element + do if ( ia = dd.interactions[ i ] ){ + // validate the interaction + if ( type !== "dragend" && ia.cancelled ) + continue; + // set the dragdrop properties on the event object + callback = drag.properties( event, dd, ia ); + // prepare for more results + ia.results = []; + // handle each element + $( elem || ia[ mode ] || dd.droppable ).each(function( p, subject ){ + // identify drag or drop targets individually + callback.target = subject; + // force propagtion of the custom event + event.isPropagationStopped = function(){ return false; }; + // handle the event + result = subject ? $event.dispatch.call( subject, event, callback ) : null; + // stop the drag interaction for this element + if ( result === false ){ + if ( mode == "drag" ){ + ia.cancelled = true; + dd.propagates -= 1; + } + if ( type == "drop" ){ + ia[ mode ][p] = null; + } + } + // assign any dropinit elements + else if ( type == "dropinit" ) + ia.droppable.push( drag.element( result ) || subject ); + // accept a returned proxy element + if ( type == "dragstart" ) + ia.proxy = $( drag.element( result ) || ia.drag )[0]; + // remember this result + ia.results.push( result ); + // forget the event result, for recycling + delete event.result; + // break on cancelled handler + if ( type !== "dropinit" ) + return result; + }); + // flatten the results + dd.results[ i ] = drag.flatten( ia.results ); + // accept a set of valid drop targets + if ( type == "dropinit" ) + ia.droppable = drag.flatten( ia.droppable ); + // locate drop targets + if ( type == "dragstart" && !ia.cancelled ) + callback.update(); + } + while ( ++i < len ) + // restore the original event & type + event.type = orig.type; + event.originalEvent = orig.event; + // return all handler results + return drag.flatten( dd.results ); + }, + + // extend the callback object with drag/drop properties... + properties: function( event, dd, ia ){ + var obj = ia.callback; + // elements + obj.drag = ia.drag; + obj.proxy = ia.proxy || ia.drag; + // starting mouse position + obj.startX = dd.pageX; + obj.startY = dd.pageY; + // current distance dragged + obj.deltaX = event.pageX - dd.pageX; + obj.deltaY = event.pageY - dd.pageY; + // original element position + obj.originalX = ia.offset.left; + obj.originalY = ia.offset.top; + // adjusted element position + obj.offsetX = obj.originalX + obj.deltaX; + obj.offsetY = obj.originalY + obj.deltaY; + // assign the drop targets information + obj.drop = drag.flatten( ( ia.drop || [] ).slice() ); + obj.available = drag.flatten( ( ia.droppable || [] ).slice() ); + return obj; + }, + + // determine is the argument is an element or jquery instance + element: function( arg ){ + if ( arg && ( arg.jquery || arg.nodeType == 1 ) ) + return arg; + }, + + // flatten nested jquery objects and arrays into a single dimension array + flatten: function( arr ){ + return $.map( arr, function( member ){ + return member && member.jquery ? $.makeArray( member ) : + member && member.length ? drag.flatten( member ) : member; + }); + }, + + // toggles text selection attributes ON (true) or OFF (false) + textselect: function( bool ){ + $( document )[ bool ? "unbind" : "bind" ]("selectstart", drag.dontstart ) + .css("MozUserSelect", bool ? "" : "none" ); + // .attr("unselectable", bool ? "off" : "on" ) + document.unselectable = bool ? "off" : "on"; + }, + + // suppress "selectstart" and "ondragstart" events + dontstart: function(){ + return false; + }, + + // a callback instance contructor + callback: function(){} + +}; + +// callback methods +drag.callback.prototype = { + update: function(){ + if ( $special.drop && this.available.length ) + $.each( this.available, function( i ){ + $special.drop.locate( this, i ); + }); + } +}; + +// patch $.event.$dispatch to allow suppressing clicks +var $dispatch = $event.dispatch; +$event.dispatch = function( event ){ + if ( $.data( this, "suppress."+ event.type ) - new Date().getTime() > 0 ){ + $.removeData( this, "suppress."+ event.type ); + return; + } + return $dispatch.apply( this, arguments ); +}; + +// event fix hooks for touch events... +var touchHooks = +$event.fixHooks.touchstart = +$event.fixHooks.touchmove = +$event.fixHooks.touchend = +$event.fixHooks.touchcancel = { + props: "clientX clientY pageX pageY screenX screenY".split( " " ), + filter: function( event, orig ) { + if ( orig ){ + var touched = ( orig.touches && orig.touches[0] ) + || ( orig.changedTouches && orig.changedTouches[0] ) + || null; + // iOS webkit: touchstart, touchmove, touchend + if ( touched ) + $.each( touchHooks.props, function( i, prop ){ + event[ prop ] = touched[ prop ]; + }); + } + return event; + } +}; + +// share the same special event configuration with related events... +$special.draginit = $special.dragstart = $special.dragend = drag; + +})( jQuery ); \ No newline at end of file diff --git a/src/views/htmlcontent/scripts/jquery.js b/src/views/htmlcontent/src/app/libs/jquery.js similarity index 99% rename from src/views/htmlcontent/scripts/jquery.js rename to src/views/htmlcontent/src/app/libs/jquery.js index 385474756f..1e0ba99740 100644 --- a/src/views/htmlcontent/scripts/jquery.js +++ b/src/views/htmlcontent/src/app/libs/jquery.js @@ -1,5 +1,5 @@ /*! - * jQuery JavaScript Library v2.2.3 + * jQuery JavaScript Library v2.2.0 * http://jquery.com/ * * Includes Sizzle.js @@ -9,7 +9,7 @@ * Released under the MIT license * http://jquery.org/license * - * Date: 2016-04-05T19:26Z + * Date: 2016-01-08T20:02Z */ (function( global, factory ) { @@ -65,7 +65,7 @@ var support = {}; var - version = "2.2.3", + version = "2.2.0", // Define a local copy of jQuery jQuery = function( selector, context ) { @@ -276,7 +276,6 @@ jQuery.extend( { }, isPlainObject: function( obj ) { - var key; // Not plain objects: // - Any object or value whose internal [[Class]] property is not "[object Object]" @@ -286,18 +285,14 @@ jQuery.extend( { return false; } - // Not own constructor property must be Object if ( obj.constructor && - !hasOwn.call( obj, "constructor" ) && - !hasOwn.call( obj.constructor.prototype || {}, "isPrototypeOf" ) ) { + !hasOwn.call( obj.constructor.prototype, "isPrototypeOf" ) ) { return false; } - // Own properties are enumerated firstly, so to speed up, - // if last one is own, then all properties are own - for ( key in obj ) {} - - return key === undefined || hasOwn.call( obj, key ); + // If the function hasn't returned already, we're confident that + // |obj| is a plain object, created by {} or constructed with new Object + return true; }, isEmptyObject: function( obj ) { @@ -4484,7 +4479,7 @@ function on( elem, types, selector, data, fn, one ) { if ( fn === false ) { fn = returnFalse; } else if ( !fn ) { - return elem; + return this; } if ( one === 1 ) { @@ -5133,14 +5128,14 @@ var rscriptTypeMasked = /^true\/(.*)/, rcleanScript = /^\s*\s*$/g; -// Manipulating tables requires a tbody function manipulationTarget( elem, content ) { - return jQuery.nodeName( elem, "table" ) && - jQuery.nodeName( content.nodeType !== 11 ? content : content.firstChild, "tr" ) ? + if ( jQuery.nodeName( elem, "table" ) && + jQuery.nodeName( content.nodeType !== 11 ? content : content.firstChild, "tr" ) ) { + + return elem.getElementsByTagName( "tbody" )[ 0 ] || elem; + } - elem.getElementsByTagName( "tbody" )[ 0 ] || - elem.appendChild( elem.ownerDocument.createElement( "tbody" ) ) : - elem; + return elem; } // Replace/restore the type attribute of script elements for safe DOM manipulation @@ -5647,7 +5642,7 @@ var getStyles = function( elem ) { // FF meanwhile throws on frame elements through "defaultView.getComputedStyle" var view = elem.ownerDocument.defaultView; - if ( !view || !view.opener ) { + if ( !view.opener ) { view = window; } @@ -5796,18 +5791,15 @@ function curCSS( elem, name, computed ) { style = elem.style; computed = computed || getStyles( elem ); - ret = computed ? computed.getPropertyValue( name ) || computed[ name ] : undefined; - - // Support: Opera 12.1x only - // Fall back to style even without computed - // computed is undefined for elems on document fragments - if ( ( ret === "" || ret === undefined ) && !jQuery.contains( elem.ownerDocument, elem ) ) { - ret = jQuery.style( elem, name ); - } // Support: IE9 // getPropertyValue is only needed for .css('filter') (#12537) if ( computed ) { + ret = computed.getPropertyValue( name ) || computed[ name ]; + + if ( ret === "" && !jQuery.contains( elem.ownerDocument, elem ) ) { + ret = jQuery.style( elem, name ); + } // A tribute to the "awesome hack by Dean Edwards" // Android Browser returns percentage for some values, @@ -7330,12 +7322,6 @@ jQuery.extend( { } } ); -// Support: IE <=11 only -// Accessing the selectedIndex property -// forces the browser to respect setting selected -// on the option -// The getter ensures a default option is selected -// when in an optgroup if ( !support.optSelected ) { jQuery.propHooks.selected = { get: function( elem ) { @@ -7344,16 +7330,6 @@ if ( !support.optSelected ) { parent.parentNode.selectedIndex; } return null; - }, - set: function( elem ) { - var parent = elem.parentNode; - if ( parent ) { - parent.selectedIndex; - - if ( parent.parentNode ) { - parent.parentNode.selectedIndex; - } - } } }; } @@ -7548,8 +7524,7 @@ jQuery.fn.extend( { -var rreturn = /\r/g, - rspaces = /[\x20\t\r\n\f]+/g; +var rreturn = /\r/g; jQuery.fn.extend( { val: function( value ) { @@ -7625,15 +7600,9 @@ jQuery.extend( { option: { get: function( elem ) { - var val = jQuery.find.attr( elem, "value" ); - return val != null ? - val : - - // Support: IE10-11+ - // option.text throws exceptions (#14686, #14858) - // Strip and collapse whitespace - // https://html.spec.whatwg.org/#strip-and-collapse-whitespace - jQuery.trim( jQuery.text( elem ) ).replace( rspaces, " " ); + // Support: IE<11 + // option.value not trimmed (#14858) + return jQuery.trim( elem.value ); } }, select: { @@ -7686,7 +7655,7 @@ jQuery.extend( { while ( i-- ) { option = options[ i ]; if ( option.selected = - jQuery.inArray( jQuery.valHooks.option.get( option ), values ) > -1 + jQuery.inArray( jQuery.valHooks.option.get( option ), values ) > -1 ) { optionSet = true; } @@ -7880,7 +7849,7 @@ jQuery.extend( jQuery.event, { // But now, this "simulate" function is used only for events // for which stopPropagation() is noop, so there is no need for that anymore. // - // For the 1.x branch though, guard for "click" and "submit" + // For the compat branch though, guard for "click" and "submit" // events is still used, but was moved to jQuery.event.stopPropagation function // because `originalEvent` should point to the original event for the constancy // with other events and for more focused logic @@ -9381,6 +9350,18 @@ jQuery.ajaxPrefilter( "json jsonp", function( s, originalSettings, jqXHR ) { +// Support: Safari 8+ +// In Safari 8 documents created via document.implementation.createHTMLDocument +// collapse sibling forms: the second one becomes a child of the first one. +// Because of that, this security measure has to be disabled in Safari 8. +// https://bugs.webkit.org/show_bug.cgi?id=137337 +support.createHTMLDocument = ( function() { + var body = document.implementation.createHTMLDocument( "" ).body; + body.innerHTML = "
        "; + return body.childNodes.length === 2; +} )(); + + // Argument "data" should be string of html // context (optional): If specified, the fragment will be created in this context, // defaults to document @@ -9393,7 +9374,12 @@ jQuery.parseHTML = function( data, context, keepScripts ) { keepScripts = context; context = false; } - context = context || document; + + // Stop scripts or inline event handlers from being executed immediately + // by using document.implementation + context = context || ( support.createHTMLDocument ? + document.implementation.createHTMLDocument( "" ) : + document ); var parsed = rsingleTag.exec( data ), scripts = !keepScripts && []; @@ -9475,7 +9461,7 @@ jQuery.fn.load = function( url, params, callback ) { // If it fails, this function gets "jqXHR", "status", "error" } ).always( callback && function( jqXHR, status ) { self.each( function() { - callback.apply( this, response || [ jqXHR.responseText, status, jqXHR ] ); + callback.apply( self, response || [ jqXHR.responseText, status, jqXHR ] ); } ); } ); } @@ -9633,8 +9619,11 @@ jQuery.fn.extend( { } // Add offsetParent borders - parentOffset.top += jQuery.css( offsetParent[ 0 ], "borderTopWidth", true ); - parentOffset.left += jQuery.css( offsetParent[ 0 ], "borderLeftWidth", true ); + // Subtract offsetParent scroll positions + parentOffset.top += jQuery.css( offsetParent[ 0 ], "borderTopWidth", true ) - + offsetParent.scrollTop(); + parentOffset.left += jQuery.css( offsetParent[ 0 ], "borderLeftWidth", true ) - + offsetParent.scrollLeft(); } // Subtract parent offsets and element margins diff --git a/src/views/htmlcontent/src/app/libs/underscore-min.js b/src/views/htmlcontent/src/app/libs/underscore-min.js new file mode 100644 index 0000000000..f01025b7bc --- /dev/null +++ b/src/views/htmlcontent/src/app/libs/underscore-min.js @@ -0,0 +1,6 @@ +// Underscore.js 1.8.3 +// http://underscorejs.org +// (c) 2009-2015 Jeremy Ashkenas, DocumentCloud and Investigative Reporters & Editors +// Underscore may be freely distributed under the MIT license. +(function(){function n(n){function t(t,r,e,u,i,o){for(;i>=0&&o>i;i+=n){var a=u?u[i]:i;e=r(e,t[a],a,t)}return e}return function(r,e,u,i){e=b(e,i,4);var o=!k(r)&&m.keys(r),a=(o||r).length,c=n>0?0:a-1;return arguments.length<3&&(u=r[o?o[c]:c],c+=n),t(r,e,u,o,c,a)}}function t(n){return function(t,r,e){r=x(r,e);for(var u=O(t),i=n>0?0:u-1;i>=0&&u>i;i+=n)if(r(t[i],i,t))return i;return-1}}function r(n,t,r){return function(e,u,i){var o=0,a=O(e);if("number"==typeof i)n>0?o=i>=0?i:Math.max(i+a,o):a=i>=0?Math.min(i+1,a):i+a+1;else if(r&&i&&a)return i=r(e,u),e[i]===u?i:-1;if(u!==u)return i=t(l.call(e,o,a),m.isNaN),i>=0?i+o:-1;for(i=n>0?o:a-1;i>=0&&a>i;i+=n)if(e[i]===u)return i;return-1}}function e(n,t){var r=I.length,e=n.constructor,u=m.isFunction(e)&&e.prototype||a,i="constructor";for(m.has(n,i)&&!m.contains(t,i)&&t.push(i);r--;)i=I[r],i in n&&n[i]!==u[i]&&!m.contains(t,i)&&t.push(i)}var u=this,i=u._,o=Array.prototype,a=Object.prototype,c=Function.prototype,f=o.push,l=o.slice,s=a.toString,p=a.hasOwnProperty,h=Array.isArray,v=Object.keys,g=c.bind,y=Object.create,d=function(){},m=function(n){return n instanceof m?n:this instanceof m?void(this._wrapped=n):new m(n)};"undefined"!=typeof exports?("undefined"!=typeof module&&module.exports&&(exports=module.exports=m),exports._=m):u._=m,m.VERSION="1.8.3";var b=function(n,t,r){if(t===void 0)return n;switch(null==r?3:r){case 1:return function(r){return n.call(t,r)};case 2:return function(r,e){return n.call(t,r,e)};case 3:return function(r,e,u){return n.call(t,r,e,u)};case 4:return function(r,e,u,i){return n.call(t,r,e,u,i)}}return function(){return n.apply(t,arguments)}},x=function(n,t,r){return null==n?m.identity:m.isFunction(n)?b(n,t,r):m.isObject(n)?m.matcher(n):m.property(n)};m.iteratee=function(n,t){return x(n,t,1/0)};var _=function(n,t){return function(r){var e=arguments.length;if(2>e||null==r)return r;for(var u=1;e>u;u++)for(var i=arguments[u],o=n(i),a=o.length,c=0;a>c;c++){var f=o[c];t&&r[f]!==void 0||(r[f]=i[f])}return r}},j=function(n){if(!m.isObject(n))return{};if(y)return y(n);d.prototype=n;var t=new d;return d.prototype=null,t},w=function(n){return function(t){return null==t?void 0:t[n]}},A=Math.pow(2,53)-1,O=w("length"),k=function(n){var t=O(n);return"number"==typeof t&&t>=0&&A>=t};m.each=m.forEach=function(n,t,r){t=b(t,r);var e,u;if(k(n))for(e=0,u=n.length;u>e;e++)t(n[e],e,n);else{var i=m.keys(n);for(e=0,u=i.length;u>e;e++)t(n[i[e]],i[e],n)}return n},m.map=m.collect=function(n,t,r){t=x(t,r);for(var e=!k(n)&&m.keys(n),u=(e||n).length,i=Array(u),o=0;u>o;o++){var a=e?e[o]:o;i[o]=t(n[a],a,n)}return i},m.reduce=m.foldl=m.inject=n(1),m.reduceRight=m.foldr=n(-1),m.find=m.detect=function(n,t,r){var e;return e=k(n)?m.findIndex(n,t,r):m.findKey(n,t,r),e!==void 0&&e!==-1?n[e]:void 0},m.filter=m.select=function(n,t,r){var e=[];return t=x(t,r),m.each(n,function(n,r,u){t(n,r,u)&&e.push(n)}),e},m.reject=function(n,t,r){return m.filter(n,m.negate(x(t)),r)},m.every=m.all=function(n,t,r){t=x(t,r);for(var e=!k(n)&&m.keys(n),u=(e||n).length,i=0;u>i;i++){var o=e?e[i]:i;if(!t(n[o],o,n))return!1}return!0},m.some=m.any=function(n,t,r){t=x(t,r);for(var e=!k(n)&&m.keys(n),u=(e||n).length,i=0;u>i;i++){var o=e?e[i]:i;if(t(n[o],o,n))return!0}return!1},m.contains=m.includes=m.include=function(n,t,r,e){return k(n)||(n=m.values(n)),("number"!=typeof r||e)&&(r=0),m.indexOf(n,t,r)>=0},m.invoke=function(n,t){var r=l.call(arguments,2),e=m.isFunction(t);return m.map(n,function(n){var u=e?t:n[t];return null==u?u:u.apply(n,r)})},m.pluck=function(n,t){return m.map(n,m.property(t))},m.where=function(n,t){return m.filter(n,m.matcher(t))},m.findWhere=function(n,t){return m.find(n,m.matcher(t))},m.max=function(n,t,r){var e,u,i=-1/0,o=-1/0;if(null==t&&null!=n){n=k(n)?n:m.values(n);for(var a=0,c=n.length;c>a;a++)e=n[a],e>i&&(i=e)}else t=x(t,r),m.each(n,function(n,r,e){u=t(n,r,e),(u>o||u===-1/0&&i===-1/0)&&(i=n,o=u)});return i},m.min=function(n,t,r){var e,u,i=1/0,o=1/0;if(null==t&&null!=n){n=k(n)?n:m.values(n);for(var a=0,c=n.length;c>a;a++)e=n[a],i>e&&(i=e)}else t=x(t,r),m.each(n,function(n,r,e){u=t(n,r,e),(o>u||1/0===u&&1/0===i)&&(i=n,o=u)});return i},m.shuffle=function(n){for(var t,r=k(n)?n:m.values(n),e=r.length,u=Array(e),i=0;e>i;i++)t=m.random(0,i),t!==i&&(u[i]=u[t]),u[t]=r[i];return u},m.sample=function(n,t,r){return null==t||r?(k(n)||(n=m.values(n)),n[m.random(n.length-1)]):m.shuffle(n).slice(0,Math.max(0,t))},m.sortBy=function(n,t,r){return t=x(t,r),m.pluck(m.map(n,function(n,r,e){return{value:n,index:r,criteria:t(n,r,e)}}).sort(function(n,t){var r=n.criteria,e=t.criteria;if(r!==e){if(r>e||r===void 0)return 1;if(e>r||e===void 0)return-1}return n.index-t.index}),"value")};var F=function(n){return function(t,r,e){var u={};return r=x(r,e),m.each(t,function(e,i){var o=r(e,i,t);n(u,e,o)}),u}};m.groupBy=F(function(n,t,r){m.has(n,r)?n[r].push(t):n[r]=[t]}),m.indexBy=F(function(n,t,r){n[r]=t}),m.countBy=F(function(n,t,r){m.has(n,r)?n[r]++:n[r]=1}),m.toArray=function(n){return n?m.isArray(n)?l.call(n):k(n)?m.map(n,m.identity):m.values(n):[]},m.size=function(n){return null==n?0:k(n)?n.length:m.keys(n).length},m.partition=function(n,t,r){t=x(t,r);var e=[],u=[];return m.each(n,function(n,r,i){(t(n,r,i)?e:u).push(n)}),[e,u]},m.first=m.head=m.take=function(n,t,r){return null==n?void 0:null==t||r?n[0]:m.initial(n,n.length-t)},m.initial=function(n,t,r){return l.call(n,0,Math.max(0,n.length-(null==t||r?1:t)))},m.last=function(n,t,r){return null==n?void 0:null==t||r?n[n.length-1]:m.rest(n,Math.max(0,n.length-t))},m.rest=m.tail=m.drop=function(n,t,r){return l.call(n,null==t||r?1:t)},m.compact=function(n){return m.filter(n,m.identity)};var S=function(n,t,r,e){for(var u=[],i=0,o=e||0,a=O(n);a>o;o++){var c=n[o];if(k(c)&&(m.isArray(c)||m.isArguments(c))){t||(c=S(c,t,r));var f=0,l=c.length;for(u.length+=l;l>f;)u[i++]=c[f++]}else r||(u[i++]=c)}return u};m.flatten=function(n,t){return S(n,t,!1)},m.without=function(n){return m.difference(n,l.call(arguments,1))},m.uniq=m.unique=function(n,t,r,e){m.isBoolean(t)||(e=r,r=t,t=!1),null!=r&&(r=x(r,e));for(var u=[],i=[],o=0,a=O(n);a>o;o++){var c=n[o],f=r?r(c,o,n):c;t?(o&&i===f||u.push(c),i=f):r?m.contains(i,f)||(i.push(f),u.push(c)):m.contains(u,c)||u.push(c)}return u},m.union=function(){return m.uniq(S(arguments,!0,!0))},m.intersection=function(n){for(var t=[],r=arguments.length,e=0,u=O(n);u>e;e++){var i=n[e];if(!m.contains(t,i)){for(var o=1;r>o&&m.contains(arguments[o],i);o++);o===r&&t.push(i)}}return t},m.difference=function(n){var t=S(arguments,!0,!0,1);return m.filter(n,function(n){return!m.contains(t,n)})},m.zip=function(){return m.unzip(arguments)},m.unzip=function(n){for(var t=n&&m.max(n,O).length||0,r=Array(t),e=0;t>e;e++)r[e]=m.pluck(n,e);return r},m.object=function(n,t){for(var r={},e=0,u=O(n);u>e;e++)t?r[n[e]]=t[e]:r[n[e][0]]=n[e][1];return r},m.findIndex=t(1),m.findLastIndex=t(-1),m.sortedIndex=function(n,t,r,e){r=x(r,e,1);for(var u=r(t),i=0,o=O(n);o>i;){var a=Math.floor((i+o)/2);r(n[a])i;i++,n+=r)u[i]=n;return u};var E=function(n,t,r,e,u){if(!(e instanceof t))return n.apply(r,u);var i=j(n.prototype),o=n.apply(i,u);return m.isObject(o)?o:i};m.bind=function(n,t){if(g&&n.bind===g)return g.apply(n,l.call(arguments,1));if(!m.isFunction(n))throw new TypeError("Bind must be called on a function");var r=l.call(arguments,2),e=function(){return E(n,e,t,this,r.concat(l.call(arguments)))};return e},m.partial=function(n){var t=l.call(arguments,1),r=function(){for(var e=0,u=t.length,i=Array(u),o=0;u>o;o++)i[o]=t[o]===m?arguments[e++]:t[o];for(;e=e)throw new Error("bindAll must be passed function names");for(t=1;e>t;t++)r=arguments[t],n[r]=m.bind(n[r],n);return n},m.memoize=function(n,t){var r=function(e){var u=r.cache,i=""+(t?t.apply(this,arguments):e);return m.has(u,i)||(u[i]=n.apply(this,arguments)),u[i]};return r.cache={},r},m.delay=function(n,t){var r=l.call(arguments,2);return setTimeout(function(){return n.apply(null,r)},t)},m.defer=m.partial(m.delay,m,1),m.throttle=function(n,t,r){var e,u,i,o=null,a=0;r||(r={});var c=function(){a=r.leading===!1?0:m.now(),o=null,i=n.apply(e,u),o||(e=u=null)};return function(){var f=m.now();a||r.leading!==!1||(a=f);var l=t-(f-a);return e=this,u=arguments,0>=l||l>t?(o&&(clearTimeout(o),o=null),a=f,i=n.apply(e,u),o||(e=u=null)):o||r.trailing===!1||(o=setTimeout(c,l)),i}},m.debounce=function(n,t,r){var e,u,i,o,a,c=function(){var f=m.now()-o;t>f&&f>=0?e=setTimeout(c,t-f):(e=null,r||(a=n.apply(i,u),e||(i=u=null)))};return function(){i=this,u=arguments,o=m.now();var f=r&&!e;return e||(e=setTimeout(c,t)),f&&(a=n.apply(i,u),i=u=null),a}},m.wrap=function(n,t){return m.partial(t,n)},m.negate=function(n){return function(){return!n.apply(this,arguments)}},m.compose=function(){var n=arguments,t=n.length-1;return function(){for(var r=t,e=n[t].apply(this,arguments);r--;)e=n[r].call(this,e);return e}},m.after=function(n,t){return function(){return--n<1?t.apply(this,arguments):void 0}},m.before=function(n,t){var r;return function(){return--n>0&&(r=t.apply(this,arguments)),1>=n&&(t=null),r}},m.once=m.partial(m.before,2);var M=!{toString:null}.propertyIsEnumerable("toString"),I=["valueOf","isPrototypeOf","toString","propertyIsEnumerable","hasOwnProperty","toLocaleString"];m.keys=function(n){if(!m.isObject(n))return[];if(v)return v(n);var t=[];for(var r in n)m.has(n,r)&&t.push(r);return M&&e(n,t),t},m.allKeys=function(n){if(!m.isObject(n))return[];var t=[];for(var r in n)t.push(r);return M&&e(n,t),t},m.values=function(n){for(var t=m.keys(n),r=t.length,e=Array(r),u=0;r>u;u++)e[u]=n[t[u]];return e},m.mapObject=function(n,t,r){t=x(t,r);for(var e,u=m.keys(n),i=u.length,o={},a=0;i>a;a++)e=u[a],o[e]=t(n[e],e,n);return o},m.pairs=function(n){for(var t=m.keys(n),r=t.length,e=Array(r),u=0;r>u;u++)e[u]=[t[u],n[t[u]]];return e},m.invert=function(n){for(var t={},r=m.keys(n),e=0,u=r.length;u>e;e++)t[n[r[e]]]=r[e];return t},m.functions=m.methods=function(n){var t=[];for(var r in n)m.isFunction(n[r])&&t.push(r);return t.sort()},m.extend=_(m.allKeys),m.extendOwn=m.assign=_(m.keys),m.findKey=function(n,t,r){t=x(t,r);for(var e,u=m.keys(n),i=0,o=u.length;o>i;i++)if(e=u[i],t(n[e],e,n))return e},m.pick=function(n,t,r){var e,u,i={},o=n;if(null==o)return i;m.isFunction(t)?(u=m.allKeys(o),e=b(t,r)):(u=S(arguments,!1,!1,1),e=function(n,t,r){return t in r},o=Object(o));for(var a=0,c=u.length;c>a;a++){var f=u[a],l=o[f];e(l,f,o)&&(i[f]=l)}return i},m.omit=function(n,t,r){if(m.isFunction(t))t=m.negate(t);else{var e=m.map(S(arguments,!1,!1,1),String);t=function(n,t){return!m.contains(e,t)}}return m.pick(n,t,r)},m.defaults=_(m.allKeys,!0),m.create=function(n,t){var r=j(n);return t&&m.extendOwn(r,t),r},m.clone=function(n){return m.isObject(n)?m.isArray(n)?n.slice():m.extend({},n):n},m.tap=function(n,t){return t(n),n},m.isMatch=function(n,t){var r=m.keys(t),e=r.length;if(null==n)return!e;for(var u=Object(n),i=0;e>i;i++){var o=r[i];if(t[o]!==u[o]||!(o in u))return!1}return!0};var N=function(n,t,r,e){if(n===t)return 0!==n||1/n===1/t;if(null==n||null==t)return n===t;n instanceof m&&(n=n._wrapped),t instanceof m&&(t=t._wrapped);var u=s.call(n);if(u!==s.call(t))return!1;switch(u){case"[object RegExp]":case"[object String]":return""+n==""+t;case"[object Number]":return+n!==+n?+t!==+t:0===+n?1/+n===1/t:+n===+t;case"[object Date]":case"[object Boolean]":return+n===+t}var i="[object Array]"===u;if(!i){if("object"!=typeof n||"object"!=typeof t)return!1;var o=n.constructor,a=t.constructor;if(o!==a&&!(m.isFunction(o)&&o instanceof o&&m.isFunction(a)&&a instanceof a)&&"constructor"in n&&"constructor"in t)return!1}r=r||[],e=e||[];for(var c=r.length;c--;)if(r[c]===n)return e[c]===t;if(r.push(n),e.push(t),i){if(c=n.length,c!==t.length)return!1;for(;c--;)if(!N(n[c],t[c],r,e))return!1}else{var f,l=m.keys(n);if(c=l.length,m.keys(t).length!==c)return!1;for(;c--;)if(f=l[c],!m.has(t,f)||!N(n[f],t[f],r,e))return!1}return r.pop(),e.pop(),!0};m.isEqual=function(n,t){return N(n,t)},m.isEmpty=function(n){return null==n?!0:k(n)&&(m.isArray(n)||m.isString(n)||m.isArguments(n))?0===n.length:0===m.keys(n).length},m.isElement=function(n){return!(!n||1!==n.nodeType)},m.isArray=h||function(n){return"[object Array]"===s.call(n)},m.isObject=function(n){var t=typeof n;return"function"===t||"object"===t&&!!n},m.each(["Arguments","Function","String","Number","Date","RegExp","Error"],function(n){m["is"+n]=function(t){return s.call(t)==="[object "+n+"]"}}),m.isArguments(arguments)||(m.isArguments=function(n){return m.has(n,"callee")}),"function"!=typeof/./&&"object"!=typeof Int8Array&&(m.isFunction=function(n){return"function"==typeof n||!1}),m.isFinite=function(n){return isFinite(n)&&!isNaN(parseFloat(n))},m.isNaN=function(n){return m.isNumber(n)&&n!==+n},m.isBoolean=function(n){return n===!0||n===!1||"[object Boolean]"===s.call(n)},m.isNull=function(n){return null===n},m.isUndefined=function(n){return n===void 0},m.has=function(n,t){return null!=n&&p.call(n,t)},m.noConflict=function(){return u._=i,this},m.identity=function(n){return n},m.constant=function(n){return function(){return n}},m.noop=function(){},m.property=w,m.propertyOf=function(n){return null==n?function(){}:function(t){return n[t]}},m.matcher=m.matches=function(n){return n=m.extendOwn({},n),function(t){return m.isMatch(t,n)}},m.times=function(n,t,r){var e=Array(Math.max(0,n));t=b(t,r,1);for(var u=0;n>u;u++)e[u]=t(u);return e},m.random=function(n,t){return null==t&&(t=n,n=0),n+Math.floor(Math.random()*(t-n+1))},m.now=Date.now||function(){return(new Date).getTime()};var B={"&":"&","<":"<",">":">",'"':""","'":"'","`":"`"},T=m.invert(B),R=function(n){var t=function(t){return n[t]},r="(?:"+m.keys(n).join("|")+")",e=RegExp(r),u=RegExp(r,"g");return function(n){return n=null==n?"":""+n,e.test(n)?n.replace(u,t):n}};m.escape=R(B),m.unescape=R(T),m.result=function(n,t,r){var e=null==n?void 0:n[t];return e===void 0&&(e=r),m.isFunction(e)?e.call(n):e};var q=0;m.uniqueId=function(n){var t=++q+"";return n?n+t:t},m.templateSettings={evaluate:/<%([\s\S]+?)%>/g,interpolate:/<%=([\s\S]+?)%>/g,escape:/<%-([\s\S]+?)%>/g};var K=/(.)^/,z={"'":"'","\\":"\\","\r":"r","\n":"n","\u2028":"u2028","\u2029":"u2029"},D=/\\|'|\r|\n|\u2028|\u2029/g,L=function(n){return"\\"+z[n]};m.template=function(n,t,r){!t&&r&&(t=r),t=m.defaults({},t,m.templateSettings);var e=RegExp([(t.escape||K).source,(t.interpolate||K).source,(t.evaluate||K).source].join("|")+"|$","g"),u=0,i="__p+='";n.replace(e,function(t,r,e,o,a){return i+=n.slice(u,a).replace(D,L),u=a+t.length,r?i+="'+\n((__t=("+r+"))==null?'':_.escape(__t))+\n'":e?i+="'+\n((__t=("+e+"))==null?'':__t)+\n'":o&&(i+="';\n"+o+"\n__p+='"),t}),i+="';\n",t.variable||(i="with(obj||{}){\n"+i+"}\n"),i="var __t,__p='',__j=Array.prototype.join,"+"print=function(){__p+=__j.call(arguments,'');};\n"+i+"return __p;\n";try{var o=new Function(t.variable||"obj","_",i)}catch(a){throw a.source=i,a}var c=function(n){return o.call(this,n,m)},f=t.variable||"obj";return c.source="function("+f+"){\n"+i+"}",c},m.chain=function(n){var t=m(n);return t._chain=!0,t};var P=function(n,t){return n._chain?m(t).chain():t};m.mixin=function(n){m.each(m.functions(n),function(t){var r=m[t]=n[t];m.prototype[t]=function(){var n=[this._wrapped];return f.apply(n,arguments),P(this,r.apply(m,n))}})},m.mixin(m),m.each(["pop","push","reverse","shift","sort","splice","unshift"],function(n){var t=o[n];m.prototype[n]=function(){var r=this._wrapped;return t.apply(r,arguments),"shift"!==n&&"splice"!==n||0!==r.length||delete r[0],P(this,r)}}),m.each(["concat","join","slice"],function(n){var t=o[n];m.prototype[n]=function(){return P(this,t.apply(this._wrapped,arguments))}}),m.prototype.value=function(){return this._wrapped},m.prototype.valueOf=m.prototype.toJSON=m.prototype.value,m.prototype.toString=function(){return""+this._wrapped},"function"==typeof define&&define.amd&&define("underscore",[],function(){return m})}).call(this); +//# sourceMappingURL=underscore-min.map \ No newline at end of file diff --git a/src/views/htmlcontent/src/app/main.ts b/src/views/htmlcontent/src/app/main.ts new file mode 100644 index 0000000000..db75652d41 --- /dev/null +++ b/src/views/htmlcontent/src/app/main.ts @@ -0,0 +1,7 @@ +import {bootstrap} from 'angular2/platform/browser'; +import {AppComponent} from './app.component'; +import {HTTP_PROVIDERS} from 'angular2/http'; + +bootstrap(AppComponent, [ + HTTP_PROVIDERS +]); diff --git a/src/views/htmlcontent/src/app/slickgrid/API.ts b/src/views/htmlcontent/src/app/slickgrid/API.ts new file mode 100644 index 0000000000..85115c505c --- /dev/null +++ b/src/views/htmlcontent/src/app/slickgrid/API.ts @@ -0,0 +1,6 @@ + +export enum NotificationType { + Error, + UpdateAvailable, + UpdateDownloaded +} diff --git a/src/views/htmlcontent/src/app/slickgrid/BackingModel.ts b/src/views/htmlcontent/src/app/slickgrid/BackingModel.ts new file mode 100644 index 0000000000..145b7d2225 --- /dev/null +++ b/src/views/htmlcontent/src/app/slickgrid/BackingModel.ts @@ -0,0 +1,6 @@ +export interface ISelectionRange { + startRow: number; + endRow: number; + startColumn: number; + endColumn: number; +} diff --git a/src/views/htmlcontent/src/app/slickgrid/BaseLibrary.ts b/src/views/htmlcontent/src/app/slickgrid/BaseLibrary.ts new file mode 100644 index 0000000000..6e9014c1df --- /dev/null +++ b/src/views/htmlcontent/src/app/slickgrid/BaseLibrary.ts @@ -0,0 +1,30 @@ +import {Observable, Subject} from 'rxjs/Rx'; + +export enum CollectionChange { + ItemsReplaced +} + +export interface IObservableCollection { + getLength(): number; + at(index: number): T; + getRange(start: number, end: number): T[]; + setCollectionChangedCallback(callback: (change: CollectionChange, startIndex: number, count: number) => void): void; +} + +export class CancellationToken { + private _isCanceled: boolean = false; + private _canceled: Subject = new Subject(); + + cancel(): void { + this._isCanceled = true; + this._canceled.next(undefined); + } + + get isCanceled(): boolean { + return this._isCanceled; + } + + get canceled(): Observable { + return this._canceled; + } +} diff --git a/src/views/htmlcontent/src/app/slickgrid/EngineAPI.ts b/src/views/htmlcontent/src/app/slickgrid/EngineAPI.ts new file mode 100644 index 0000000000..9233a3ef93 --- /dev/null +++ b/src/views/htmlcontent/src/app/slickgrid/EngineAPI.ts @@ -0,0 +1,14 @@ + +enum FieldType { + String = 0, + Boolean = 1, + Integer = 2, + Decimal = 3, + Date = 4, + Unknown = 5, +} + +export interface IColumnDefinition { + id: string; + type: FieldType; +} diff --git a/src/views/htmlcontent/src/app/slickgrid/GridSyncService.ts b/src/views/htmlcontent/src/app/slickgrid/GridSyncService.ts new file mode 100644 index 0000000000..f0baf073b1 --- /dev/null +++ b/src/views/htmlcontent/src/app/slickgrid/GridSyncService.ts @@ -0,0 +1,118 @@ +import {Injectable} from 'angular2/core'; +import {Subject, Observable} from 'rxjs/Rx'; +import {SelectionModel, ISlickRange} from './SelectionModel'; + +declare let Slick; + +@Injectable() +export class GridSyncService { + columnMinWidthPX: number = 30; + + private _scrollLeftPX: number = 0; + private _scrollBarWidthPX: number = 0; + private _columnWidthPXs: number[] = []; + private _rowNumberColumnWidthPX: number; + private _updated = new Subject(); + private _typeDropdownOffset = new Subject<[number, number]>(); + private _selectionModel = new SelectionModel( + new Slick.RowSelectionModel(), + new Slick.EventHandler(), + new Slick.Event(), + (fromRow: number, fromCell: number, toRow: number, toCell: number): ISlickRange => new Slick.Range(fromRow, fromCell, toRow, toCell)); + private _initialColumnWidthPXsOnResize: number[] = []; + private _isGridReadOnly: boolean = false; + + initialColumnResize(): void { + this._initialColumnWidthPXsOnResize = this._columnWidthPXs.slice(0); + } + + resizeColumn(index: number, deltaWidthPX: number): void { + this._columnWidthPXs = this._initialColumnWidthPXsOnResize.slice(0); + let newWidthPX = this._columnWidthPXs[index] + deltaWidthPX; + this.setColumnWidthPX(index, newWidthPX); + this.notifyUpdates('columnWidthPXs'); + } + + openTypeDropdown(columnIndex: number): void { + let offset = this._rowNumberColumnWidthPX + this._columnWidthPXs.slice(0, columnIndex).reduce((x, y) => x + y, 0) - this.scrollLeftPX; + this._typeDropdownOffset.next([columnIndex, offset]); + } + + private setColumnWidthPX(index: number, widthPX: number): void { + if (index < 0 || index >= this._columnWidthPXs.length) { + return; + } + + if (widthPX >= this.columnMinWidthPX) { + this._columnWidthPXs[index] = widthPX; + } else { + this._columnWidthPXs[index] = this.columnMinWidthPX; + + if (index > 0) { + let leftShrink = this.columnMinWidthPX - widthPX; + this.setColumnWidthPX(index - 1, this._columnWidthPXs[index - 1] - leftShrink); + } + } + } + + get updated(): Observable { + return this._updated; + } + + get typeDropdownOffset(): Observable<[number, number]> { + return this._typeDropdownOffset; + } + + set scrollLeftPX(value: number) { + this._scrollLeftPX = value; + this.notifyUpdates('scrollLeftPX'); + } + + get scrollLeftPX(): number { + return this._scrollLeftPX; + } + + set scrollBarWidthPX(value: number) { + this._scrollBarWidthPX = value; + this.notifyUpdates('scrollBarWidthPX'); + } + + get scrollBarWidthPX(): number { + return this._scrollBarWidthPX; + } + + set columnWidthPXs(value: number[]) { + this._columnWidthPXs = value; + this.notifyUpdates('columnWidthPXs'); + } + + get columnWidthPXs(): number[] { + return this._columnWidthPXs; + } + + set rowNumberColumnWidthPX(value: number) { + this._rowNumberColumnWidthPX = value; + this.notifyUpdates('rowNumberColumnWidthPX'); + } + + get rowNumberColumnWidthPX(): number { + return this._rowNumberColumnWidthPX; + } + + get selectionModel(): SelectionModel { + return this._selectionModel; + } + + set isGridReadOnly(value: boolean) { + this._isGridReadOnly = value; + this.notifyUpdates('isGridReadOnly'); + } + + get isGridReadOnly(): boolean { + return this._isGridReadOnly; + } + + private notifyUpdates(propertyName: string): void { + this._updated.next(propertyName); + } +} diff --git a/src/views/htmlcontent/src/app/slickgrid/Localization.ts b/src/views/htmlcontent/src/app/slickgrid/Localization.ts new file mode 100644 index 0000000000..ac3247f8dc --- /dev/null +++ b/src/views/htmlcontent/src/app/slickgrid/Localization.ts @@ -0,0 +1,412 @@ +import {NotificationType} from './ViewModel'; + +enum Dependency { + Python = 0, + Python_Conda = 1, + Python_Pandas = 2, + Python_Dill = 3, + Python_Numexpr = 4, + Python_Regex = 5, + Python_PyODBC = 6, + Python_SciPy = 7, + Python_CondaConfig = 8, + Python_CondaClean = 9, +} + +enum Runtime { + Python = 0, +} + +enum RunStatus { + Unknown = 0, + Created = 1, + Translated = 2, + Submitted = 3, + WaitingForInput = 4, + Running = 5, + Completed = 6, + InError = 7, +} + +class Localization { + strings = { + addDataSource: 'Add Data Source', + dataSourcePreviewFailed: 'Unable to load preview.', + addBlock: 'Add Step', + blockHistory: 'Steps', + configure: 'Configure', + editPropertiesSubmit: 'Commit Changes', + projectExtension: 'dprep', + projectExtensionName: 'Pendleton Packages', + projectDefaultName: 'Package', + projectsFolderName: 'Pendleton Packages', + createProjectDialogTitle: 'Choose where to create your new Pendleton Package', + saveProjectDialogTitle: 'Choose where to save your Pendleton Package', + sendFeedback: 'Send Feedback', + openProjectDialogTitle: 'Choose a Pendleton Package to open', + appTitle: 'Microsoft Codename Project "Pendleton"', + appTitleWithProject: ' - Microsoft Codename Project "Pendleton"', + appTitleShort: 'Pendleton', + contactUs: 'Contact Us', + submit: 'Submit', + renameActivity: 'Rename Dataflow', + profiling: 'PROFILING', + startPageRecent: 'Recent Packages', + startPageWelcome: 'Welcome to Pendleton', + startPageWhatsNew: 'What\'s New', + startPageTutorial: 'Tutorial', + deriveColumnByExample: 'New Derived Column', + editColumns: 'Select Columns', + loadingCell: 'Loading...', + updateAvailable: 'An update is available. Please restart the app to apply it.', + deleteActivityPromptTitle: 'Delete Dataflow', + deleteActivityPromptMessage: 'Are you sure you wish to delete this Dataflow?', + deleteBlockPromptTitle: 'Delete Step', + deleteBlockPromptMessage: 'Are you sure you wish to delete this Step?', + loadingData: 'Loading Data', + statsSummaryHeader: 'SUMMARY', + statsNumRows: '# Rows', + statsMissingRows: '# Missing Rows', + statsHeader: 'STATISTICS', + statsMinimum: 'Minimum', + statsLowerQuartile: 'Lower Quartile', + statsMedian: 'Median', + statsUpperQuartile: 'Upper Quartile', + statsMaximum: 'Maximum', + statsAverage: 'Average', + statsStandardDeviation: 'Standard Deviation', + histogram: 'Histogram', + boxPlot: 'Box Plot', + numericStats: 'Column Statistics', + valueCount: 'Value Count', + dataStats: 'Data Statistics', + scatterPlot: 'Scatter Plot', + missingInspectorData: 'Data Not Applicable', + filePickerLabel: 'Choose File...', + defaultOpenFileDialogTitle: 'Open file', + allFiles: 'All Files', + learnMore: 'Learn more...', + activityDefaultName: 'New Dataflow' + }; + + blocks = { + 'CSVFile': 'Load from CSV Data Source', + 'JSONFile': 'Load from JSON Data Source', + 'RDBMS': 'Load from RDBMS', + 'TwoWayJoin': 'Join', + 'Microsoft.DPrep.AdjustColumnPrecisionBlock': 'Adjust Precision', + 'Microsoft.DPrep.RemoveRowOnColumnMissingValuesBlock': 'Remove Rows with Missing Values', + 'Microsoft.DPrep.ConvertColumnFieldTypeBlock': 'Convert Field Type to Numeric', + 'Microsoft.DPrep.SelectRowsOnDistinctValuesInColumnBlock': 'Distinct Rows', + 'Microsoft.DPrep.ColumnRenameBlock': 'Rename Column', + 'Microsoft.DPrep.WriteToCsvBlock': 'Write to CSV', + 'Microsoft.DPrep.SummarizeBlock': 'Summarize', + 'Microsoft.DPrep.FilterBlock': 'Filter', + 'Microsoft.DPrep.DeleteColumnBlock': 'Remove Column', + 'Microsoft.DPrep.SortBlock': 'Sort', + 'Microsoft.DPrep.ConvertColumnFieldTypeToDateBlock': 'Convert Field Type to Date', + 'Microsoft.DPrep.DeriveColumnByExample': 'Add Column by Example', + 'Microsoft.DPrep.AddCustomColumnBlock': 'Add Column', + 'Microsoft.DPrep.CustomBlock': 'Transform Frame', + 'Microsoft.DPrep.AutoSplitColumnBlock': 'Auto-split Column', + 'Microsoft.DPrep.ConvertColumnFieldTypeToStringBlock': 'Convert Field Type to String' + }; + + inspectors = { + 'Microsoft.DPrep.NumericColumnStatsInspector': 'Column Statistics', + 'Microsoft.DPrep.HistogramInspector': 'Histogram', + 'Microsoft.DPrep.ValueCountInspector': 'Value Counts', + 'Microsoft.DPrep.BoxAndWhiskerInspector': 'Box Plot', + 'Microsoft.DPrep.ScatterPlotInspector': 'Scatter Plot' + }; + + dataSources = { + CSVFile: 'CSV File', + JSONFile: 'JSON File', + RDBMS: 'Database' + }; + + properties = { + addGroup: 'Add to Existing Groups', + columnId: 'Column Name', + commentLineCharacter: 'Comment Line Character', + customBlock: 'Code to Transform Frame', + customExpression: 'New Column Expression', + database: 'Database', + databaseType: 'Database System', + decimalPlaces: 'Decimal Places', + decimalPoint: 'Decimal Symbol', + defaultBucketing: 'Default Number of Buckets (Scott\'s Rule)', + densityPlot: 'Kernel Density Plot Overlay (Gaussian Kernel)', + descending: 'Descending', + emailAddress: 'Contact Email Address (optional)', + eol: 'Line Ending', + examples: 'Examples used', + fileEncoding: 'File Encoding', + filePath: 'File Path', + filterExpression: 'Filter Expression', + groupByColumn: 'Group by Column', + groupByColumns: 'Group by Columns', + haloEffect: 'Display Halo', + localPath: 'Local Path', + login: 'Login', + message: 'Message', + na: 'Missing Value Replacement', + newColumnId: 'New Column Name', + newColumnsBaseName: 'Base name for new columns', + numberOfBreaks: 'Minimum Number of Buckets (Applies even when default bucketing is checked)', + sampleSize: 'Sample Size', + numberOfTopValues: 'Number of Top Values', + path: 'Path', + password: 'Password', + query: 'Query', + quote: 'Values in Quotes?', + remotePath: 'Remote Path', + sampleType: 'Sample', + sasUrl: 'Blob connection string with SAS token', + separator: 'Separator', + server: 'Server', + subject: 'Subject', + summaryFunction: 'Summary Function', + summarizedColumnId: 'Summarized Column Name', + trustCert: 'Trust server CA', + useColumnHeaders: 'Use Column Headers?', + userId: 'Login to Azure', + skipRows: 'Lines to Skip' + }; + + dependencies = { + [Dependency.Python]: 'Python', + [Dependency.Python_Conda]: 'conda', + [Dependency.Python_Pandas]: 'pandas', + [Dependency.Python_Dill]: 'dill', + [Dependency.Python_Numexpr]: 'numexpr', + [Dependency.Python_Regex]: 'regex', + [Dependency.Python_PyODBC]: 'pyOdbc', + [Dependency.Python_SciPy]: 'SciPy', + [Dependency.Python_CondaConfig]: 'conda config', + [Dependency.Python_CondaClean]: 'conda clean' + }; + + dependenciesSetup = { + installed: 'installed', + required: 'required', + error: { + missingDependency: 'Following dependencies must be installed for Microsoft Codename Project "Pendleton" to run.' + } + }; + + /* tslint:disable:max-line-length */ + clusterCredentialsDialog = { + preface: 'Enter the details of an HDInsight Spark Cluster where the package will run. You can browse or create an HDInsight Spark Cluster in the Windows Azure Management portal.', + url: 'Cluster URL', + userName: 'Cluster Login Username', + password: 'Cluster Login Password', + storageAccount: 'Cluster Storage Account', + storageAccessKey: 'Cluster Storage Access Key', + storageContainer: 'Cluster Storage Container' + }; + + projectRunsColumns = { + projectName: 'Package Name', + clusterName: 'Cluster Name', + submitTime: 'Submit Time', + status: 'Status', + startedTime: 'Started Time', + completedTime: 'Completed Time', + logsLink: 'Logs', + livyLink: 'Livy details', + errorRecordLink: 'Error Records' + }; + + projectRunsLabels = { + livyApplication: 'Spark/Livy application' + }; + + projectRunStatus = { + [RunStatus.Unknown]: 'Unknown', + [RunStatus.Created]: 'Created', + [RunStatus.Translated]: 'Translated', + [RunStatus.Submitted]: 'Submitted', + [RunStatus.WaitingForInput]: 'Waiting for Input', + [RunStatus.Running]: 'Running', + [RunStatus.Completed]: 'Completed', + [RunStatus.InError]: 'InError' + }; + + projectExportsDialog = { + [Runtime.Python]: { + extensionDescription: 'Python Script', + extension: 'py' + } + }; + + commands = { + AppQuit: 'Quit', + CreateProject: 'New Package...', + OpenProject: 'Open Package...', + SaveProject: 'Save Package As...', + FileOpen: 'Open Data Source...', + ExportScript: 'Export Script...', + RenameActivity: 'Rename Dataflow...', + DeleteActivity: 'Delete Dataflow', + CloseProject: 'Close Package', + TRACE: 'Trace', + DEBUG: 'Debug', + ERROR: 'Error', + ToggleDevTools: 'Toggle Dev Tools', + RunProjectOnSparkCluster: 'Spark Cluster...', + ViewProjectRuns: 'View Package Runs...' + }; + + menuItems = { + File: 'File', + Edit: 'Edit', + DPrep: 'Pendleton', + Activities: 'Dataflows', + Transformations: 'Transforms', + Inspectors: 'Inspectors', + Options: 'Options', + LogLevel: 'Set Log Level', + RunProjectOn: 'Run Package On', + Help: 'Help' + }; + + blockMenuItems = { + Edit: 'Edit', + Delete: 'Delete', + MoveUp: 'Move Up' + }; + + confirmDialog = { + Ok: 'Ok', + Cancel: 'Cancel' + }; + + roles = { + about: 'About Pendleton', + services: 'Services', + hide: 'Hide Pendleton', + hideothers: 'Hide Others', + unhide: 'Show All', + copy: 'Copy', + paste: 'Paste' + }; + + dialogTitles = { + addDataSource: 'Add Data Source', + editProperties: 'Edit', + sendASmile: 'Enter Feedback', + confirmDelete: 'Confirm Deletion', + clusterCredentials: 'Run Package', + projectRuns: 'Package Runs', + join: 'Join' + }; + + enums = { + DecimalMark: { + 0: 'Dot "."', + 1: 'Comma ","' + }, + EndOfLineConvention: { + 0: 'Unix', + 1: 'Windows' + }, + SummaryFunction: { + 0: 'Min', + 1: 'Max', + 2: 'Mean', + 3: 'Median', + 4: 'Variance', + 5: 'Standard Deviation', + 6: 'First', + 7: 'Last', + 8: 'Count', + 9: 'Count Distinct', + 10: 'Interquartile Range', + 11: 'Sum' + }, + SampleType: { + 0: 'Full file', + 1: 'Top 1,000 Rows', + 2: 'Top 10,000 Rows' + }, + DatabaseType: { + 0: 'Microsoft SQL Server', + 1: 'MySQL' + }, + FileEncoding: { + 0: 'utf-8', + 1: 'iso-8859-1', + 2: 'latin-1', + 3: 'mbcs', + 4: 'ASCII', + 5: 'uft-16', + 6: 'utf-32' + }, + DatabaseAuthType: { + 0: 'Server Authentication', + 1: 'Windows Authentication' + } + }; + + dataQuality = { + missing: 'missing', + valid: 'valid' + }; + + notifications = { + [NotificationType.Error]: 'Error encountered', + [NotificationType.UpdateAvailable]: 'Downloading update...', + [NotificationType.UpdateDownloaded]: 'An update is available. Restart to install.' + }; + + dataTypes = { + string: 'String', + numeric: 'Numeric', + datetime: 'Date time', + boolean: 'Boolean' + }; + + interactiveEditor = { + commit: 'Commit', + cancel: 'Cancel', + columnDragGroupByHint: 'Drag columns here to group data', + columnDragSummaryHint: 'Drag columns here to summarize data', + groupBy: 'Group By', + aggregate: 'Aggregate', + column: 'Column', + newColumn: 'New Column Name', + previewDataHint: 'Preview data will appear here.', + invalidInteractionArgsError: 'Preview data not available. Please change the arguments and try again.', + previousBlockError: 'Preview data not available. Please make sure all preceding Steps succeeded.' + }; + + validationMessages0 = { + 'Validation.ColumnNameBlank': 'You must provide a name for the new column.' + }; + + validationMessages1 = { + 'Validation.MissingRequiredProperties': 'Please provide values for the following required properties: %1.', + 'Validation.NotValidUnknownReason': 'Validation of the property \'%1\' failed for an unknown reason.', + 'Validation.MissingRequiredProperty': 'Please provide a value for the \'%1\' property before proceeding.', + 'Validation.ColumnExists': 'There is already a column named \'%1\'. Please choose another name.', + 'Validation.ColumnNameNotValidNoSuggestion': 'The name you provided, \'%1\', is not a valid name.' + }; + + validationMessages2 = { + 'Validation.ColumnNameNotValid': 'The name you provided, \'%1\', is not a valid name. Consider using the name \'%2\' instead.' + }; + + activationPage = { + eulaHeading: 'End User License Agreement', + eulaContent: '', + eulaCheckbox: 'I have read and agreed to the End User License Agreement', + privacyHeading: 'Privacy Notice', + privacyContent: '', + privacyCheckbox: 'I have read and agreed to the Privacy Notice', + activate: 'Activate' + }; +} + +export = Localization; diff --git a/src/views/htmlcontent/src/app/slickgrid/LocalizationService.ts b/src/views/htmlcontent/src/app/slickgrid/LocalizationService.ts new file mode 100644 index 0000000000..fa3e548d71 --- /dev/null +++ b/src/views/htmlcontent/src/app/slickgrid/LocalizationService.ts @@ -0,0 +1,18 @@ +import {Injectable} from 'angular2/core'; +import Localization = require('./Localization'); + +@Injectable() +export class LocalizationService { + locale: Localization; + + setLocale(locale: Localization): void { + this.locale = locale; + + // fold the top level string collections up into this class + for (let p in locale) { + if (locale.hasOwnProperty(p)) { + this[p] = locale[p]; + } + } + } +} diff --git a/src/views/htmlcontent/src/app/slickgrid/ModelInterfaces.ts b/src/views/htmlcontent/src/app/slickgrid/ModelInterfaces.ts new file mode 100644 index 0000000000..c9e5d9c57a --- /dev/null +++ b/src/views/htmlcontent/src/app/slickgrid/ModelInterfaces.ts @@ -0,0 +1,4 @@ + +/* tslint:disable:no-unused-variable */ +import EngineAPI = require('./EngineAPI'); +export import IColumnDefinition = EngineAPI.IColumnDefinition; diff --git a/src/views/htmlcontent/src/app/slickgrid/SelectionModel.ts b/src/views/htmlcontent/src/app/slickgrid/SelectionModel.ts new file mode 100644 index 0000000000..8de85aaac5 --- /dev/null +++ b/src/views/htmlcontent/src/app/slickgrid/SelectionModel.ts @@ -0,0 +1,202 @@ +import {ISelectionRange} from './BackingModel'; + +export class SelectionModel implements ISlickSelectionModel { + + constructor(private _rowSelectionModel: ISlickSelectionModel, + private _handler: ISlickEventHandler, + private _onSelectedRangesChanged: ISlickEvent, + private _slickRangeFactory: (fromRow: number, fromCell: number, toRow: number, toCell: number) => ISlickRange) { } + + get range(): ISlickRange[] { + return this._ranges; + } + + get onSelectedRangesChanged(): ISlickEvent { + return this._onSelectedRangesChanged; + } + + init(grid: ISlickGrid): void { + this._grid = grid; + this._rowSelectionModel.init(grid); + this._handler.subscribe(this._rowSelectionModel.onSelectedRangesChanged, (e, ranges) => { + this.updateSelectedRanges(ranges); + }); + } + + destroy(): void { + this._handler.unsubscribeAll(); + this._rowSelectionModel.destroy(); + } + + setSelectedRanges(ranges: ISlickRange[]): void { + this.updateSelectedRanges(ranges); + } + + changeSelectedRanges(selections: ISelectionRange[]): void { + let slickRange = (selections || []).map(s => + this._slickRangeFactory(s.startRow, s.startColumn, s.endRow - 1, s.endColumn - 1) + ); + this.updateSelectedRanges(slickRange); + } + + toggleSingleColumnSelection(columnId: string): void { + let newRanges = [this.getColumnRange(columnId)]; + if (SelectionModel.areRangesIdentical(newRanges, this._ranges)) { + this.clearSelection(); + } else { + this.setSingleColumnSelection(columnId); + } + } + + setSingleColumnSelection(columnId: string): void { + this._lastSelectedColumnIndexSequence = [this._grid.getColumnIndex(columnId)]; + this._grid.resetActiveCell(); + this.updateSelectedRanges([this.getColumnRange(columnId)]); + } + + toggleMultiColumnSelection(columnId: string): void { + if (this.isColumnSelectionCurrently === false) { + return this.toggleSingleColumnSelection(columnId); + } + let columnIndex = this._grid.getColumnIndex(columnId); + let columnRange = this.getColumnRangeByIndex(columnIndex); + let columnInRange = false; + let newRanges = this._ranges.filter((value, index) => { + if (value.fromCell === columnRange.fromCell && value.toCell === columnRange.toCell) { + columnInRange = true; + return false; + } + return true; + }); + this._lastSelectedColumnIndexSequence = this._lastSelectedColumnIndexSequence.filter(value => value !== columnIndex); + + if (columnInRange === false) { + newRanges.push(columnRange); + this._lastSelectedColumnIndexSequence.push(this._grid.getColumnIndex(columnId)); + } + + this._grid.resetActiveCell(); + this.updateSelectedRanges(newRanges); + } + + extendMultiColumnSelection(columnId: string): void { + if (this.isColumnSelectionCurrently === false + || !this._lastSelectedColumnIndexSequence + || this._lastSelectedColumnIndexSequence.length === 0) { + return this.toggleSingleColumnSelection(columnId); + } + + let columnIndex = this._grid.getColumnIndex(columnId); + let lastSelectedColumnIndex = this._lastSelectedColumnIndexSequence[this._lastSelectedColumnIndexSequence.length - 1]; + + let start = Math.min(columnIndex, lastSelectedColumnIndex); + let end = Math.max(columnIndex, lastSelectedColumnIndex); + + let newRanges = []; + this._lastSelectedColumnIndexSequence = []; + for (let i = start; i <= end; i++) { + newRanges.push(this.getColumnRangeByIndex(i)); + if (i !== lastSelectedColumnIndex) { + this._lastSelectedColumnIndexSequence.push(i); + } + } + this._lastSelectedColumnIndexSequence.push(lastSelectedColumnIndex); + + this._grid.resetActiveCell(); + this.updateSelectedRanges(newRanges); + } + + clearSelection(): void { + this._lastSelectedColumnIndexSequence = []; + this._grid.resetActiveCell(); + this.updateSelectedRanges([]); + } + + private _grid: ISlickGrid; + private _ranges: ISlickRange[] = []; + private _lastSelectedColumnIndexSequence: number[] = []; + + private static areRangesIdentical(lhs: ISlickRange[], rhs: ISlickRange[]): boolean { + if (lhs && rhs && (lhs !== rhs) && lhs.length === rhs.length) { + for (let i = 0; i < lhs.length; ++i) { + if (lhs[i].fromRow !== rhs[i].fromRow + || lhs[i].toRow !== rhs[i].toRow + || lhs[i].fromCell !== rhs[i].fromCell + || lhs[i].toCell !== rhs[i].toCell) { + return false; + } + } + return true; + } + return false; + } + + private getColumnRange(columnId: string): ISlickRange { + let columnIndex = this._grid.getColumnIndex(columnId); + return this.getColumnRangeByIndex(columnIndex); + } + + private getColumnRangeByIndex(columnIndex: number): ISlickRange { + let rowCount = this._grid.getDataLength(); + let lastRowToSelect = rowCount === 0 ? 0 : rowCount - 1 ; + return this._slickRangeFactory(0, columnIndex, lastRowToSelect, columnIndex); + } + + private get isColumnSelectionCurrently(): boolean { + return this._ranges + && this._ranges.length > 0 + && this._ranges.find(r => { + let startAtFirstRow = r.fromRow === 0; + let endAtLastRow = r.toRow === Math.max(0, this._grid.getDataLength() - 1); + return !startAtFirstRow || !endAtLastRow || r.fromCell !== r.toCell; + }) === undefined; + } + + private updateSelectedRanges(ranges: ISlickRange[]): void { + // Set focus to this grid if it's not already somewhere inside it. + if (ranges && ranges.length !== 0 && this._grid && this._grid.getCanvasNode() && !this._grid.getCanvasNode().contains(document.activeElement)) { + this._grid.focus(); + } + + if (SelectionModel.areRangesIdentical(ranges, this._ranges)) { + return; + } + + this._ranges = ranges; + this.onSelectedRangesChanged.notify(this._ranges); + } +} + +export interface ISlickSelectionModel { + range: ISlickRange[]; + onSelectedRangesChanged: any; + init(grid: any): void; + destroy(): void; + setSelectedRanges(ranges: ISlickRange[]): void; +} + +export interface ISlickEventHandler { + subscribe(event: any, handler: any): void; + unsubscribeAll(): void; +} + +export interface ISlickEvent { + notify(eventData: ISlickRange[]): void; + subscribe(handler: (e: any, args: any) => void): void; +} + +export interface ISlickRange { + fromCell: number; + fromRow: number; + toCell: number; + toRow: number; +} + +export interface ISlickGrid { + getActiveCellNode(): any; + getCanvasNode(): any; + resetActiveCell(): void; + focus(): void; + getColumnIndex(columnId: string): number; + getDataLength(): number; +} diff --git a/src/views/htmlcontent/src/app/slickgrid/SharedControlInterfaces.ts b/src/views/htmlcontent/src/app/slickgrid/SharedControlInterfaces.ts new file mode 100644 index 0000000000..6aebcfbb18 --- /dev/null +++ b/src/views/htmlcontent/src/app/slickgrid/SharedControlInterfaces.ts @@ -0,0 +1,8 @@ +export interface IGridColumnDefinition { + id: string; + type: number; +} + +export interface IGridDataRow { + values: any[]; +} diff --git a/src/views/htmlcontent/src/app/slickgrid/SlickGrid.html b/src/views/htmlcontent/src/app/slickgrid/SlickGrid.html new file mode 100644 index 0000000000..beb3bf442f --- /dev/null +++ b/src/views/htmlcontent/src/app/slickgrid/SlickGrid.html @@ -0,0 +1 @@ +
        \ No newline at end of file diff --git a/src/views/htmlcontent/src/app/slickgrid/SlickGrid.less b/src/views/htmlcontent/src/app/slickgrid/SlickGrid.less new file mode 100644 index 0000000000..f7aa5e47fb --- /dev/null +++ b/src/views/htmlcontent/src/app/slickgrid/SlickGrid.less @@ -0,0 +1,127 @@ +@grid-content-letter-spacing: 0.03em; + +.grid-cell-padding { + padding: 0.5em 0.8em 0.4em; +} + +.grid-cell { + border-top-style: none; + color: #101010; + letter-spacing: @grid-content-letter-spacing; + border-color: #EBECEC; + font-size: 0.95em; + border-bottom-width: 1px; + border-left-style: none; + border-right-color: #ACACAC; + border-right-style: dotted; + .grid-cell-padding; +} + +.grid { + width: 100%; + height: 100%; + + .slick-header-column { + .grid-cell; + background-color: #F7F7F7; + border-bottom-color: #ACACAC; + } + + .slick-cell { + .grid-cell; + background-color: var(--grid-cell-color, #FFFFFF); + + &.selected { + background-color: ~"var(--color-grid-selected)"; + color: black; + + .grid-cell-value-container.missing-value { + color: black; + } + } + + &.editable { + padding: 0; + input { + .grid-cell-padding; + height: 100%; + padding: 0.4em 0.65em 0.1em; + letter-spacing: @grid-content-letter-spacing; + + &:focus { + outline-offset: 0; + } + } + } + + .grid-cell-value-container { + display: block; + white-space: pre; + width: 100%; + overflow-x: hidden; + text-overflow: ellipsis; + + &.override-cell { + color: black; + } + + &.highlighted { + color: black; + } + + &.blurred { + color: #ABABAB; + } + + &.missing-value { + color: lightgray; + } + + &.context { + color: darkblue; // need actual color and sign off on a way we want to distinguish source columns + font-style: italic; + } + + &.loading-cell { + font-style: italic; + } + + &.right-justified { + text-align: right; + } + + + } + + } + + input.editor-text { + width: 100%; + color: #000000; + } +} + +.contextMenu { + position: absolute; + background: #007ACC; + color: white; + border: 1px solid gray; + padding: 2px; + display: inline-block; + min-width: 100px; + -moz-box-shadow: 2px 2px 2px silver; + -webkit-box-shadow: 2px 2px 2px silver; + z-index: 99999; + + li { + padding: 4px 4px 4px 14px; + list-style: none; + cursor: pointer; + } + + li:hover { + background-color: white; + color: #007ACC; + text-decoration: underline; + } +} diff --git a/src/views/htmlcontent/src/app/slickgrid/SlickGrid.ts b/src/views/htmlcontent/src/app/slickgrid/SlickGrid.ts new file mode 100644 index 0000000000..2b7a143282 --- /dev/null +++ b/src/views/htmlcontent/src/app/slickgrid/SlickGrid.ts @@ -0,0 +1,556 @@ +/* +* SlickGrid Angular2 implementation obtained from Pendelton team +* at Microsoft. +* +*/ + +/// +import {Component, Input, Output, OnChanges, OnInit, OnDestroy, ElementRef, SimpleChange, EventEmitter, + ViewEncapsulation, Optional, HostListener} from 'angular2/core'; +import {Observable, Subscription} from 'rxjs/Rx'; +import {IObservableCollection, CollectionChange} from './BaseLibrary'; +import {IGridDataRow} from './SharedControlInterfaces'; +import {IColumnDefinition} from './ModelInterfaces'; +import {LocalizationService} from './LocalizationService'; +import {GridSyncService} from './GridSyncService'; + +enum FieldType { + String = 0, + Boolean = 1, + Integer = 2, + Decimal = 3, + Date = 4, + Unknown = 5, +} + +declare let System; +// noinspection JSUnusedAssignment + +declare let jQuery; +declare let Slick; + +function getDisabledEditorClass(loadingString: string): any { + class DisabledEditor { + constructor(args: any) { + jQuery('') + .appendTo(args.container); + } + + destroy(): any { + return undefined; + }; + + focus(): any { + return undefined; + }; + + isValueChanged(): boolean { + return false; + }; + + serializeValue(): string { + return ''; + }; + + loadValue(item: any): any { + return undefined; + }; + + applyValue(item: any, state: any): any { + return undefined; + }; + + validate(): any { + return true; + }; + } + + return DisabledEditor; +} + +function getOverridableTextEditorClass(grid: SlickGrid): any { + class OverridableTextEditor { + private _textEditor: any; + + constructor(private _args: any) { + this._textEditor = new Slick.Editors.Text(_args); + } + + destroy(): void { + this._textEditor.destroy(); + }; + + focus(): void { + this._textEditor.focus(); + }; + + getValue(): string { + return this._textEditor.getValue(); + }; + + setValue(val): void { + this._textEditor.setValue(val); + }; + + loadValue(item, rowNumber): void { + let overrideValue = grid.overrideCellFn(rowNumber, this._args.column.id); + if (overrideValue !== undefined) { + item[this._args.column.id] = overrideValue; + } + + this._textEditor.loadValue(item); + }; + + serializeValue(): string { + return this._textEditor.serializeValue(); + }; + + applyValue(item, state): void { + this._textEditor.applyValue(item, state); + }; + + isValueChanged(): boolean { + return this._textEditor.isValueChanged(); + }; + + validate(): any { + return this._textEditor.validate(); + }; + } + + return OverridableTextEditor; +} + +@Component({ + selector: 'slick-grid', + templateUrl: 'app/slickgrid/SlickGrid.html', + styleUrls: ['app/libs/SlickGrid/slick.grid.css', 'app/slickgrid/SlickGrid.css'], + providers: [LocalizationService, GridSyncService], + encapsulation: ViewEncapsulation.None +}) +export class SlickGrid implements OnChanges, OnInit, OnDestroy { + @Input() columnDefinitions: IColumnDefinition[]; + @Input() dataRows: IObservableCollection; + @Input() resized: Observable; + @Input() editableColumnIds: string[] = []; + @Input() highlightedCells: {row: number, column: number}[] = []; + @Input() blurredColumns: string[] = []; + @Input() contextColumns: string[] = []; + @Input() columnsLoading: string[] = []; + @Input() overrideCellFn: (rowNumber, columnId, value?, data?) => string; + @Input() showHeader: boolean = false; + + @Output() cellChanged: EventEmitter<{column: string, row: number, newValue: any}> = new EventEmitter<{column: string, row: number, newValue: any}>(); + @Output() editingFinished: EventEmitter = new EventEmitter(); + + @Input() topRowNumber: number; + @Output() topRowNumberChange: EventEmitter = new EventEmitter(); + + @HostListener('focus') + onFocus(): void { + if (this._grid) { + this._grid.focus(); + } + } + + private _grid: any; + private _gridColumns: ISlickGridColumn[]; + private _gridData: ISlickGridData; + private _rowHeight = 29; + private _resizeSubscription: Subscription; + private _gridSyncSubscription: Subscription; + private _topRow: number = 0; + private _leftPx: number = 0; + private _finishGridEditingFn: (e: any, args: any) => void; + + private static getDataWithSchema(data: IGridDataRow, columns: ISlickGridColumn[]): any { + let dataWithSchema = {}; + for (let i = 0; i < columns.length; i++) { + dataWithSchema[columns[i].field] = data.values[i]; + } + + return dataWithSchema; + } + + constructor(private _el: ElementRef, + @Optional() private _gridSyncService: GridSyncService, + private _localizationService: LocalizationService) { + this._gridData = { + getLength: (): number => { + return this.dataRows && this._gridColumns ? this.dataRows.getLength() : 0; + }, + getItem: (index): any => { + return SlickGrid.getDataWithSchema(this.dataRows.at(index), this._gridColumns); + }, + getRange: (start, end): any => { + return !this.dataRows ? undefined : this.dataRows.getRange(start, end).map(d => { + return SlickGrid.getDataWithSchema(d, this._gridColumns); + }); + }, + getItemMetadata: undefined + }; + } + + ngOnChanges(changes: {[propName: string]: SimpleChange}): void { + let columnDefinitionChanges = changes['columnDefinitions']; + let activeCell = this._grid ? this._grid.getActiveCell() : undefined; + let hasGridStructureChanges = false; + let wasEditing = this._grid ? !!this._grid.getCellEditor() : false; + + if (columnDefinitionChanges + && !_.isEqual(columnDefinitionChanges.previousValue, columnDefinitionChanges.currentValue)) { + this.updateSchema(); + if (!this._grid) { + this.initGrid(); + } else { + this._grid.resetActiveCell(); + this._grid.setColumns(this._gridColumns); + } + if (this._gridSyncService) { + let gridColumnWidths: number[] = this._grid.getColumnWidths(); + this._gridSyncService.rowNumberColumnWidthPX = gridColumnWidths[0]; + this._gridSyncService.columnWidthPXs = gridColumnWidths.slice(1); + } + hasGridStructureChanges = true; + + if (!columnDefinitionChanges.currentValue || columnDefinitionChanges.currentValue.length === 0) { + activeCell = undefined; + } + if (activeCell) { + let columnThatContainedActiveCell = columnDefinitionChanges.previousValue[Math.max(activeCell.cell - 1, 0)]; + let newActiveColumnIndex = columnThatContainedActiveCell + ? columnDefinitionChanges.currentValue.findIndex(c => c.id === columnThatContainedActiveCell.id) + : -1; + activeCell.cell = newActiveColumnIndex !== -1 ? newActiveColumnIndex + 1 : 0; + } + } + + if (changes['dataRows'] + || (changes['highlightedCells'] && !_.isEqual(changes['highlightedCells'].currentValue, changes['highlightedCells'].previousValue)) + || (changes['blurredColumns'] && !_.isEqual(changes['blurredColumns'].currentValue, changes['blurredColumns'].previousValue)) + || (changes['columnsLoading'] && !_.isEqual(changes['columnsLoading'].currentValue, changes['columnsLoading'].previousValue))) { + this.setCallbackOnDataRowsChanged(); + this._grid.updateRowCount(); + this._grid.invalidateAllRows(); + this._grid.render(); + if (this._gridSyncService) { + this._gridSyncService.rowNumberColumnWidthPX = this._grid.getColumnWidths()[0]; + } + hasGridStructureChanges = true; + } + + if (hasGridStructureChanges) { + if (activeCell) { + this._grid.setActiveCell(activeCell.row, activeCell.cell); + } else { + this._grid.resetActiveCell(); + } + } + + if (wasEditing && hasGridStructureChanges) { + this._grid.editActiveCell(); + } + + if (changes['editableColumnIds']) { + let newValue = changes['editableColumnIds'].currentValue; + if (!_.isEqual(newValue, changes['editableColumnIds'].previousValue)) { + this._grid.onKeyDown.unsubscribe(this.finishGridEditingFn); + if (newValue && newValue.length > 0) { + this._grid.onKeyDown.subscribe(this.finishGridEditingFn); + let firstEditableColumn = this._grid.getColumnIndex(newValue[0]) + 1; + let rowToFocus = activeCell ? activeCell.row : this._grid.getViewport().top; + this._grid.gotoCell(rowToFocus, firstEditableColumn, true); + } + } + } + } + + private invalidateRange(start: number, end: number): void { + let refreshedRows = _.range(start, end); + this._grid.invalidateRows(refreshedRows, true); + this._grid.render(); + } + + ngOnInit(): void { + // ngOnInit() will be called *after* the first time ngOnChanges() is called + // so, grid must be there already + if (this.topRowNumber === undefined) { + this.topRowNumber = 0; + } + this._grid.scrollRowToTop(this.topRowNumber); + + if (this.resized) { + // Re-rendering the grid is expensive. Throttle so we only do so every 100ms. + this.resized.throttleTime(100) + .subscribe(() => this.onResize()); + } + + // subscribe to slick events + // https://github.com/mleibman/SlickGrid/wiki/Grid-Events + this.subscribeToScroll(); + this.subscribeToCellChanged(); + } + + ngOnDestroy(): void { + if (this._resizeSubscription !== undefined) { + this._resizeSubscription.unsubscribe(); + } + if (this._gridSyncSubscription !== undefined) { + this._gridSyncSubscription.unsubscribe(); + } + } + + onResize(): void { + if (this._grid !== undefined) { + // this will make sure the grid header and body to be re-rendered + this._grid.resizeCanvas(); + } + } + + /* tslint:disable:member-ordering */ + private getColumnEditor = (column: any): any => { + let columnId = column.id; + let isEditable = this.editableColumnIds && this.editableColumnIds.indexOf(columnId) !== -1; + let isColumnLoading = this.columnsLoading && this.columnsLoading.indexOf(columnId) !== -1; + if (isEditable) { + return isColumnLoading + ? getDisabledEditorClass(this._localizationService['strings']['loadingCell']) + : getOverridableTextEditorClass(this); + } + + return undefined; + }; + + private getFormatter = (column: any): any => { + if (column.isRowNumber === true) { + return undefined; // use default formatter for row number cell + } + return (row, cell, value, columnDef, dataContext) => { + let columnId = cell > 0 && this.columnDefinitions.length > cell - 1 ? this.columnDefinitions[cell - 1].id : undefined; + if (columnId) { + let columnType = this.columnDefinitions[cell - 1].type; + let isHighlighted = this.highlightedCells && !!this.highlightedCells.find(c => c.row === row && c.column + 1 === cell); + let isColumnLoading = this.columnsLoading && this.columnsLoading.indexOf(columnId) !== -1; + let isShadowed = this.blurredColumns && !!this.blurredColumns.find(c => c === columnId); + let isContext = this.contextColumns && !!this.contextColumns.find(c => c === columnId); + let overrideValue = this.overrideCellFn && this.overrideCellFn(row, columnId, value, dataContext); + + let valueToDisplay = (value + '').replace(/&/g, '&').replace(//g, '>'); + let cellClasses = 'grid-cell-value-container'; + if (columnType !== FieldType.String) { + cellClasses += ' right-justified'; + } + + /* tslint:disable:no-null-keyword */ + let valueMissing = value === undefined || value === null; + /* tslint:disable:no-null-keyword */ + let isOverridden = overrideValue !== undefined && overrideValue !== null; + + if (valueMissing && !isOverridden) { + cellClasses += ' missing-value'; + } + + if (isColumnLoading === true && !isOverridden) { + cellClasses += ' loading-cell'; + valueToDisplay = this._localizationService['strings']['loadingCell']; + } + + if (isOverridden) { + cellClasses += ' override-cell'; + valueToDisplay = overrideValue; + } + + if (isContext) { + cellClasses += ' context'; + } + + if (isHighlighted === true) { + cellClasses += ' highlighted'; + } + + if (isShadowed && !isHighlighted && !isOverridden) { + cellClasses += ' blurred'; + } + + return '' + valueToDisplay + ''; + } + + }; + }; + + private initGrid(): void { + // https://github.com/mleibman/SlickGrid/wiki/Grid-Options + let options = { + enableCellNavigation: true, + enableColumnReorder: false, + renderRowWithRange: true, + showRowNumber: true, + showDataTypeIcon: true, + showHeader: this.showHeader, + rowHeight: this._rowHeight, + defaultColumnWidth: 120, + editable: true, + editorFactory: { + getEditor: this.getColumnEditor + }, + formatterFactory: { + getFormatter: this.getFormatter + } + }; + + this._grid = new Slick.Grid( + this._el.nativeElement.getElementsByClassName('grid')[0], + this._gridData, + this._gridColumns, + options); + if (this._gridSyncService) { + this._grid.setSelectionModel(this._gridSyncService.selectionModel); + this._gridSyncService.scrollBarWidthPX = this._grid.getScrollbarDimensions().width; + this._gridSyncSubscription = this._gridSyncService.updated + .filter(p => p === 'columnWidthPXs') + .debounceTime(10) + .subscribe(p => { + this.updateColumnWidths(); + }); + } + this.onResize(); + } + + private subscribeToScroll(): void { + this._grid.onScroll.subscribe((e, args) => { + let scrollTop = args.scrollTop; + let scrollRow = Math.floor(scrollTop / this._rowHeight); + scrollRow = scrollRow < 0 ? 0 : scrollRow; + if (scrollRow !== this._topRow) { + this._topRow = scrollRow; + this.topRowNumberChange.emit(scrollRow); + } + + if (this._gridSyncService && args.scrollLeft !== this._leftPx) { + this._leftPx = args.scrollLeft; + this._gridSyncService.scrollLeftPX = this._leftPx; + } + }); + } + + private subscribeToCellChanged(): void { + this._grid.onCellChange.subscribe((e, args) => { + let modifiedColumn = this.columnDefinitions[args.cell - 1]; + let oldValue = this.dataRows.at(args.row).values[args.cell - 1]; + let newValue = args.item[modifiedColumn.id]; + if (oldValue && oldValue.toString() === newValue) { + return; + } + this.cellChanged.emit({ + column: modifiedColumn.id, + row: args.row, + newValue: args.item[modifiedColumn.id] + }); + }); + } + + private updateColumnWidths(): void { + for (let i = 0; i < this._gridColumns.length; i++) { + this._gridColumns[i].width = this._gridSyncService.columnWidthPXs[i]; + } + this._grid.setColumnWidths(this._gridColumns, true); + } + + private updateSchema(): void { + if (!this.columnDefinitions) { + return; + } + + this._gridColumns = this.columnDefinitions.map((c, i) => { + let column: ISlickGridColumn = { + name: c.id, + field: c.id, + id: c.id, + icon: this.getImagePathForDataType(c.type), + resizable: true + }; + + if (this._gridSyncService) { + let columnWidth = this._gridSyncService.columnWidthPXs[i]; + column.width = columnWidth ? columnWidth : undefined; + column.minWidth = this._gridSyncService.columnMinWidthPX; + } + + return column; + }); + } + + private getImagePathForDataType(type: FieldType): string { + const resourcePath = './resources/'; + switch (type) { + case FieldType.String: + return resourcePath + 'col-type-string.svg'; + case FieldType.Boolean: + return resourcePath + 'col-type-boolean.svg'; + case FieldType.Integer: + case FieldType.Decimal: + return resourcePath + 'col-type-number.svg'; + case FieldType.Date: + return resourcePath + 'col-type-timedate.svg'; + case FieldType.Unknown: + default: + return resourcePath + 'circle.svg'; + } + } + + private setCallbackOnDataRowsChanged(): void { + if (this.dataRows) { + this.dataRows.setCollectionChangedCallback((change: CollectionChange, startIndex: number, count: number) => { + this.renderGridDataRowsRange(startIndex, count); + }); + } + } + + private renderGridDataRowsRange(startIndex: number, count: number): void { + let editor = this._grid.getCellEditor(); + let oldValue = editor ? editor.getValue() : undefined; + let wasValueChanged = editor ? editor.isValueChanged() : false; + this.invalidateRange(startIndex, startIndex + count); + let activeCell = this._grid.getActiveCell(); + if (editor && activeCell.row >= startIndex && activeCell.row < startIndex + count) { + if (oldValue && wasValueChanged) { + editor.setValue(oldValue); + } + } + } + + private get finishGridEditingFn(): (e: any, args: any) => void { + if (this._finishGridEditingFn === undefined) { + this._finishGridEditingFn = ((e: any, args: any) => { + if (e.ctrlKey === true + && e.keyCode === 13 + && this.editableColumnIds + && this.editableColumnIds.find(id => id === args.columnDef.id)) { + // pressed [Ctrl + Enter] in the editing area + this.editingFinished.next(undefined); + } + }).bind(this); + } + + return this._finishGridEditingFn; + } +} + +interface ISlickGridData { + // https://github.com/mleibman/SlickGrid/wiki/DataView + getLength(): number; + getItem(index: number): any; + getRange(start: number, end: number): any; // only available in the forked SlickGrid + getItemMetadata(index: number): any; +} + +interface ISlickGridColumn { + // https://github.com/mleibman/SlickGrid/wiki/Column-Options + name: string; + field: string; + id: string; + icon: string; + resizable: boolean; + minWidth?: number; + width?: number; +} diff --git a/src/views/htmlcontent/src/app/slickgrid/ViewModel.ts b/src/views/htmlcontent/src/app/slickgrid/ViewModel.ts new file mode 100644 index 0000000000..692dcf51a6 --- /dev/null +++ b/src/views/htmlcontent/src/app/slickgrid/ViewModel.ts @@ -0,0 +1,5 @@ + +/* tslint:disable:no-unused-variable */ +// Notifications exports +import NotificationsAPI = require('./API'); +export import NotificationType = NotificationsAPI.NotificationType; diff --git a/src/views/htmlcontent/src/app/slickgrid/slickgrid.css b/src/views/htmlcontent/src/app/slickgrid/slickgrid.css new file mode 100644 index 0000000000..fdbaf2170e --- /dev/null +++ b/src/views/htmlcontent/src/app/slickgrid/slickgrid.css @@ -0,0 +1,120 @@ +.grid-cell-padding { + padding: 0.5em 0.8em 0.4em; +} +.grid-cell { + border-top-style: none; + color: #101010; + letter-spacing: 0.03em; + border-color: #EBECEC; + font-size: 0.95em; + border-bottom-width: 1px; + border-left-style: none; + border-right-color: #ACACAC; + border-right-style: dotted; + padding: 0.5em 0.8em 0.4em; +} +.grid { + width: 100%; + height: 100%; +} +.grid .slick-header-column { + border-top-style: none; + color: #101010; + letter-spacing: 0.03em; + border-color: #EBECEC; + font-size: 0.95em; + border-bottom-width: 1px; + border-left-style: none; + border-right-color: #ACACAC; + border-right-style: dotted; + padding: 0.5em 0.8em 0.4em; + background-color: #F7F7F7; + border-bottom-color: #ACACAC; +} +.grid .slick-cell { + border-top-style: none; + color: #101010; + letter-spacing: 0.03em; + border-color: #EBECEC; + font-size: 0.95em; + border-bottom-width: 1px; + border-left-style: none; + border-right-color: #ACACAC; + border-right-style: dotted; + padding: 0.5em 0.8em 0.4em; + background-color: var(--grid-cell-color, #FFFFFF); +} +.grid .slick-cell.selected { + background-color: var(--color-grid-selected); + color: black; +} +.grid .slick-cell.selected .grid-cell-value-container.missing-value { + color: black; +} +.grid .slick-cell.editable { + padding: 0; +} +.grid .slick-cell.editable input { + padding: 0.5em 0.8em 0.4em; + height: 100%; + padding: 0.4em 0.65em 0.1em; + letter-spacing: 0.03em; +} +.grid .slick-cell.editable input:focus { + outline-offset: 0; +} +.grid .slick-cell .grid-cell-value-container { + display: block; + white-space: pre; + width: 100%; + overflow-x: hidden; + text-overflow: ellipsis; +} +.grid .slick-cell .grid-cell-value-container.override-cell { + color: black; +} +.grid .slick-cell .grid-cell-value-container.highlighted { + color: black; +} +.grid .slick-cell .grid-cell-value-container.blurred { + color: #ABABAB; +} +.grid .slick-cell .grid-cell-value-container.missing-value { + color: lightgray; +} +.grid .slick-cell .grid-cell-value-container.context { + color: darkblue; + font-style: italic; +} +.grid .slick-cell .grid-cell-value-container.loading-cell { + font-style: italic; +} +.grid .slick-cell .grid-cell-value-container.right-justified { + text-align: right; +} +.grid input.editor-text { + width: 100%; + color: #000000; +} +.contextMenu { + position: absolute; + background: #007ACC; + color: white; + border: 1px solid gray; + padding: 2px; + display: inline-block; + min-width: 100px; + -moz-box-shadow: 2px 2px 2px silver; + -webkit-box-shadow: 2px 2px 2px silver; + z-index: 99999; +} +.contextMenu li { + padding: 4px 4px 4px 14px; + list-style: none; + cursor: pointer; +} +.contextMenu li:hover { + background-color: white; + color: #007ACC; + text-decoration: underline; +} diff --git a/src/views/htmlcontent/css/bootstrap.css b/src/views/htmlcontent/src/bootstrap.css similarity index 100% rename from src/views/htmlcontent/css/bootstrap.css rename to src/views/htmlcontent/src/bootstrap.css diff --git a/src/views/htmlcontent/src/color-theme-light.css b/src/views/htmlcontent/src/color-theme-light.css new file mode 100644 index 0000000000..88b3c727ff --- /dev/null +++ b/src/views/htmlcontent/src/color-theme-light.css @@ -0,0 +1,49 @@ +* { + --color-h1: #5C2E91; + --color-h2: #48525D; + --color-content: #101010; + --color-content-disabled: #a9a9a9; + --color-content-light: #2a2a2a; + --color-active: #0078D7; + --color-blank: #FFFFFF; + --color-inactive: #808387; + --color-error: #E81123; + --color-success: #7CD300; + --color-bg-content: #E9E9E9; + --color-bg-content-light: #ffffff; + --color-bg-content-dark: #d0d0d0; + --color-toolbar: #000000; + --color-bg-toolbar: #F4F4F4; + --color-toolbar-border: #C8C8C8; + --color-icon-default: #363636; + --color-icon-hover: #101010; + --color-border-default: #767676; + --color-border-light: #838383; + --color-border-active: #0078D7; + --color-chart-bar: #8ad4eb; + --color-chart-bar-hover: #aae0f0; + --color-chart-bar-selected: #6eaabc; + --color-chart-bar-selected-hover: #7cbfd3; + --color-chart-axis-dark: #888888; + --color-chart-axis-light: #EAEAEA; + --color-chart-old-data: #C8C8C8; + --color-chart-label: #000000; + --color-chart-tooltip-border: #000000; + --color-chart-bg-tooltip: #FFFFFF; + --color-chart-line: #000000; + --color-chart-bar-border: #404040; + --color-grid-selected: rgba(0, 111, 148, 0.2); + --color-start-page-primary-bg: #E7E8E8; + --color-start-page-primary-text: #101010; + --color-start-page-primary-text-light: #505050; + --color-start-page-secondary-bg: #596675; + --color-start-page-secondary-text: #FFFFFF; + --color-start-page-secondary-text-dark: #bfbfbf; + --color-grid-cell-preview-bg: #f3f3f3; +} +a { + color: #0078D7; +} +a:hover { + color: #0b93ff; +} diff --git a/src/views/htmlcontent/src/config.js b/src/views/htmlcontent/src/config.js new file mode 100644 index 0000000000..f6b13118e0 --- /dev/null +++ b/src/views/htmlcontent/src/config.js @@ -0,0 +1,15 @@ +System.config({ + transpiler: 'typescript', + typescriptOptions: { + emitDecoratorMetadata: true + }, + map: { + app: './app' + }, + packages: { + app: { + main: './main.ts', + defaultExtension: 'ts' + } + } +}); \ No newline at end of file diff --git a/src/views/htmlcontent/src/resources/add-all.svg b/src/views/htmlcontent/src/resources/add-all.svg new file mode 100644 index 0000000000..8217bdaa8a --- /dev/null +++ b/src/views/htmlcontent/src/resources/add-all.svg @@ -0,0 +1,11 @@ + + + + + + + + + + diff --git a/src/views/htmlcontent/src/resources/app_Icon.icns b/src/views/htmlcontent/src/resources/app_Icon.icns new file mode 100644 index 0000000000000000000000000000000000000000..cab3d0b7f04c85087b0471c60fbc63e6919259ec GIT binary patch literal 75871 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 literal 0 HcmV?d00001 diff --git a/src/views/htmlcontent/src/resources/app_Icon.ico b/src/views/htmlcontent/src/resources/app_Icon.ico new file mode 100644 index 0000000000000000000000000000000000000000..4e0111799f3ef852d654dfd33206299338c6e410 GIT binary patch literal 370070 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 literal 0 HcmV?d00001 diff --git a/src/views/htmlcontent/src/resources/app_Icon.svg b/src/views/htmlcontent/src/resources/app_Icon.svg new file mode 100644 index 0000000000..350727768f --- /dev/null +++ b/src/views/htmlcontent/src/resources/app_Icon.svg @@ -0,0 +1 @@ +logo \ No newline at end of file diff --git a/src/views/htmlcontent/src/resources/arrow-down.svg b/src/views/htmlcontent/src/resources/arrow-down.svg new file mode 100644 index 0000000000..5c13270963 --- /dev/null +++ b/src/views/htmlcontent/src/resources/arrow-down.svg @@ -0,0 +1,6 @@ + + + + + diff --git a/src/views/htmlcontent/src/resources/arrow-left-white.svg b/src/views/htmlcontent/src/resources/arrow-left-white.svg new file mode 100644 index 0000000000..5d81e0eb1b --- /dev/null +++ b/src/views/htmlcontent/src/resources/arrow-left-white.svg @@ -0,0 +1,6 @@ + + + + + diff --git a/src/views/htmlcontent/src/resources/arrow-up-white.svg b/src/views/htmlcontent/src/resources/arrow-up-white.svg new file mode 100644 index 0000000000..11ed32db4d --- /dev/null +++ b/src/views/htmlcontent/src/resources/arrow-up-white.svg @@ -0,0 +1,6 @@ + + + + + diff --git a/src/views/htmlcontent/src/resources/arrow-up.svg b/src/views/htmlcontent/src/resources/arrow-up.svg new file mode 100644 index 0000000000..5957167804 --- /dev/null +++ b/src/views/htmlcontent/src/resources/arrow-up.svg @@ -0,0 +1,6 @@ + + + + + diff --git a/src/views/htmlcontent/src/resources/chevron-down.svg b/src/views/htmlcontent/src/resources/chevron-down.svg new file mode 100644 index 0000000000..9fbf4e1c53 --- /dev/null +++ b/src/views/htmlcontent/src/resources/chevron-down.svg @@ -0,0 +1,8 @@ + + + + + + + diff --git a/src/views/htmlcontent/src/resources/circle.svg b/src/views/htmlcontent/src/resources/circle.svg new file mode 100644 index 0000000000..37e58d8c53 --- /dev/null +++ b/src/views/htmlcontent/src/resources/circle.svg @@ -0,0 +1,6 @@ + + + + + diff --git a/src/views/htmlcontent/src/resources/close-red.svg b/src/views/htmlcontent/src/resources/close-red.svg new file mode 100644 index 0000000000..a58b96ea0e --- /dev/null +++ b/src/views/htmlcontent/src/resources/close-red.svg @@ -0,0 +1,10 @@ + + + + + + + + + diff --git a/src/views/htmlcontent/src/resources/close-white.svg b/src/views/htmlcontent/src/resources/close-white.svg new file mode 100644 index 0000000000..8dd3097b5c --- /dev/null +++ b/src/views/htmlcontent/src/resources/close-white.svg @@ -0,0 +1,10 @@ + + + + + + + + + diff --git a/src/views/htmlcontent/src/resources/close.svg b/src/views/htmlcontent/src/resources/close.svg new file mode 100644 index 0000000000..493341ffda --- /dev/null +++ b/src/views/htmlcontent/src/resources/close.svg @@ -0,0 +1,10 @@ + + + + + + + + + diff --git a/src/views/htmlcontent/src/resources/col-type-boolean.svg b/src/views/htmlcontent/src/resources/col-type-boolean.svg new file mode 100644 index 0000000000..850e5ad976 --- /dev/null +++ b/src/views/htmlcontent/src/resources/col-type-boolean.svg @@ -0,0 +1,11 @@ + + + + + + + + + + diff --git a/src/views/htmlcontent/src/resources/col-type-number.svg b/src/views/htmlcontent/src/resources/col-type-number.svg new file mode 100644 index 0000000000..74ed900b1e --- /dev/null +++ b/src/views/htmlcontent/src/resources/col-type-number.svg @@ -0,0 +1,9 @@ + + + + + + + + diff --git a/src/views/htmlcontent/src/resources/col-type-string.svg b/src/views/htmlcontent/src/resources/col-type-string.svg new file mode 100644 index 0000000000..31a4468633 --- /dev/null +++ b/src/views/htmlcontent/src/resources/col-type-string.svg @@ -0,0 +1,31 @@ + + + + + + + diff --git a/src/views/htmlcontent/src/resources/col-type-timedate.svg b/src/views/htmlcontent/src/resources/col-type-timedate.svg new file mode 100644 index 0000000000..25e1446385 --- /dev/null +++ b/src/views/htmlcontent/src/resources/col-type-timedate.svg @@ -0,0 +1,6 @@ + + + + + diff --git a/src/views/htmlcontent/src/resources/create-project.svg b/src/views/htmlcontent/src/resources/create-project.svg new file mode 100644 index 0000000000..44108682da --- /dev/null +++ b/src/views/htmlcontent/src/resources/create-project.svg @@ -0,0 +1,2 @@ + +new_project \ No newline at end of file diff --git a/src/views/htmlcontent/src/resources/data-profile.svg b/src/views/htmlcontent/src/resources/data-profile.svg new file mode 100644 index 0000000000..ddd082da39 --- /dev/null +++ b/src/views/htmlcontent/src/resources/data-profile.svg @@ -0,0 +1,8 @@ + + + + + + + diff --git a/src/views/htmlcontent/src/resources/delete.svg b/src/views/htmlcontent/src/resources/delete.svg new file mode 100644 index 0000000000..8e3969cc31 --- /dev/null +++ b/src/views/htmlcontent/src/resources/delete.svg @@ -0,0 +1,14 @@ + + + + + + + + diff --git a/src/views/htmlcontent/src/resources/edit-white.svg b/src/views/htmlcontent/src/resources/edit-white.svg new file mode 100644 index 0000000000..c4b5b0244d --- /dev/null +++ b/src/views/htmlcontent/src/resources/edit-white.svg @@ -0,0 +1,13 @@ + + + + + diff --git a/src/views/htmlcontent/src/resources/edit.svg b/src/views/htmlcontent/src/resources/edit.svg new file mode 100644 index 0000000000..72678cdc46 --- /dev/null +++ b/src/views/htmlcontent/src/resources/edit.svg @@ -0,0 +1,13 @@ + + + + + diff --git a/src/views/htmlcontent/src/resources/filter-white.svg b/src/views/htmlcontent/src/resources/filter-white.svg new file mode 100644 index 0000000000..002638d1c8 --- /dev/null +++ b/src/views/htmlcontent/src/resources/filter-white.svg @@ -0,0 +1,6 @@ + + + + + diff --git a/src/views/htmlcontent/src/resources/filter.svg b/src/views/htmlcontent/src/resources/filter.svg new file mode 100644 index 0000000000..b66d72cb45 --- /dev/null +++ b/src/views/htmlcontent/src/resources/filter.svg @@ -0,0 +1,6 @@ + + + + + diff --git a/src/views/htmlcontent/src/resources/filteradd.svg b/src/views/htmlcontent/src/resources/filteradd.svg new file mode 100644 index 0000000000..cd75275835 --- /dev/null +++ b/src/views/htmlcontent/src/resources/filteradd.svg @@ -0,0 +1 @@ +icon_new \ No newline at end of file diff --git a/src/views/htmlcontent/src/resources/filtersubtract.svg b/src/views/htmlcontent/src/resources/filtersubtract.svg new file mode 100644 index 0000000000..f757319be5 --- /dev/null +++ b/src/views/htmlcontent/src/resources/filtersubtract.svg @@ -0,0 +1 @@ +icon_new \ No newline at end of file diff --git a/src/views/htmlcontent/src/resources/input.svg b/src/views/htmlcontent/src/resources/input.svg new file mode 100644 index 0000000000..304a2f37ed --- /dev/null +++ b/src/views/htmlcontent/src/resources/input.svg @@ -0,0 +1,7 @@ + + + + + + diff --git a/src/views/htmlcontent/src/resources/maximize.svg b/src/views/htmlcontent/src/resources/maximize.svg new file mode 100644 index 0000000000..3b31ac6028 --- /dev/null +++ b/src/views/htmlcontent/src/resources/maximize.svg @@ -0,0 +1,11 @@ + + + + + + + diff --git a/src/views/htmlcontent/src/resources/minus-all-objects.svg b/src/views/htmlcontent/src/resources/minus-all-objects.svg new file mode 100644 index 0000000000..711f919c39 --- /dev/null +++ b/src/views/htmlcontent/src/resources/minus-all-objects.svg @@ -0,0 +1,11 @@ + + + + + + + + + + diff --git a/src/views/htmlcontent/src/resources/open-datasource.svg b/src/views/htmlcontent/src/resources/open-datasource.svg new file mode 100644 index 0000000000..069e7f94fa --- /dev/null +++ b/src/views/htmlcontent/src/resources/open-datasource.svg @@ -0,0 +1 @@ +open_datasource \ No newline at end of file diff --git a/src/views/htmlcontent/src/resources/open-project.svg b/src/views/htmlcontent/src/resources/open-project.svg new file mode 100644 index 0000000000..798a9b741c --- /dev/null +++ b/src/views/htmlcontent/src/resources/open-project.svg @@ -0,0 +1 @@ +open_project \ No newline at end of file diff --git a/src/views/htmlcontent/src/resources/output.svg b/src/views/htmlcontent/src/resources/output.svg new file mode 100644 index 0000000000..e0a255e97d --- /dev/null +++ b/src/views/htmlcontent/src/resources/output.svg @@ -0,0 +1,7 @@ + + + + + + diff --git a/src/views/htmlcontent/src/resources/query.svg b/src/views/htmlcontent/src/resources/query.svg new file mode 100644 index 0000000000..03e3bee5b3 --- /dev/null +++ b/src/views/htmlcontent/src/resources/query.svg @@ -0,0 +1,10 @@ + + + + + + + + + diff --git a/src/views/htmlcontent/src/resources/recent-project.svg b/src/views/htmlcontent/src/resources/recent-project.svg new file mode 100644 index 0000000000..ffff601846 --- /dev/null +++ b/src/views/htmlcontent/src/resources/recent-project.svg @@ -0,0 +1 @@ +recent_project \ No newline at end of file diff --git a/src/views/htmlcontent/src/resources/refine.svg b/src/views/htmlcontent/src/resources/refine.svg new file mode 100644 index 0000000000..4ea4af3266 --- /dev/null +++ b/src/views/htmlcontent/src/resources/refine.svg @@ -0,0 +1,17 @@ + + + + + + + + + + + + + diff --git a/src/views/htmlcontent/src/resources/robot-cowboy.svg b/src/views/htmlcontent/src/resources/robot-cowboy.svg new file mode 100644 index 0000000000..37d9367d2c --- /dev/null +++ b/src/views/htmlcontent/src/resources/robot-cowboy.svg @@ -0,0 +1,274 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/views/htmlcontent/src/resources/sad.svg b/src/views/htmlcontent/src/resources/sad.svg new file mode 100644 index 0000000000..4325de3881 --- /dev/null +++ b/src/views/htmlcontent/src/resources/sad.svg @@ -0,0 +1,19 @@ + + + + + + + diff --git a/src/views/htmlcontent/src/resources/shift-left.svg b/src/views/htmlcontent/src/resources/shift-left.svg new file mode 100644 index 0000000000..e27e130317 --- /dev/null +++ b/src/views/htmlcontent/src/resources/shift-left.svg @@ -0,0 +1,6 @@ + + + + + diff --git a/src/views/htmlcontent/src/resources/smiley.svg b/src/views/htmlcontent/src/resources/smiley.svg new file mode 100644 index 0000000000..fbd8b4db29 --- /dev/null +++ b/src/views/htmlcontent/src/resources/smiley.svg @@ -0,0 +1,20 @@ + + + + + + + diff --git a/src/views/htmlcontent/src/resources/sort-ascending.svg b/src/views/htmlcontent/src/resources/sort-ascending.svg new file mode 100644 index 0000000000..20f556ac0f --- /dev/null +++ b/src/views/htmlcontent/src/resources/sort-ascending.svg @@ -0,0 +1,6 @@ + + + + + diff --git a/src/views/htmlcontent/src/resources/status-fail.svg b/src/views/htmlcontent/src/resources/status-fail.svg new file mode 100644 index 0000000000..ed638defec --- /dev/null +++ b/src/views/htmlcontent/src/resources/status-fail.svg @@ -0,0 +1,14 @@ + + + + + diff --git a/src/views/htmlcontent/src/resources/status-none.svg b/src/views/htmlcontent/src/resources/status-none.svg new file mode 100644 index 0000000000..6c65a44bcd --- /dev/null +++ b/src/views/htmlcontent/src/resources/status-none.svg @@ -0,0 +1,7 @@ + + + + + diff --git a/src/views/htmlcontent/src/resources/status-success.svg b/src/views/htmlcontent/src/resources/status-success.svg new file mode 100644 index 0000000000..273f771296 --- /dev/null +++ b/src/views/htmlcontent/src/resources/status-success.svg @@ -0,0 +1,13 @@ + + + + + diff --git a/src/views/htmlcontent/src/resources/status_inprogress.svg b/src/views/htmlcontent/src/resources/status_inprogress.svg new file mode 100644 index 0000000000..2e0406cb2b --- /dev/null +++ b/src/views/htmlcontent/src/resources/status_inprogress.svg @@ -0,0 +1,24 @@ + + + + + + + + + + + + + + + diff --git a/src/views/htmlcontent/src/resources/table.svg b/src/views/htmlcontent/src/resources/table.svg new file mode 100644 index 0000000000..a65beafc0b --- /dev/null +++ b/src/views/htmlcontent/src/resources/table.svg @@ -0,0 +1,8 @@ + + + + + + + diff --git a/src/views/htmlcontent/src/resources/tutorial.json b/src/views/htmlcontent/src/resources/tutorial.json new file mode 100644 index 0000000000..78d4b58e78 --- /dev/null +++ b/src/views/htmlcontent/src/resources/tutorial.json @@ -0,0 +1,43 @@ +{ + "welcomeText": "We've put together a short tutorial video that will get you started faster. You can also take a quick tour of general interface to see what's new and essential feature of this product.", + "mainVideo": { + "title": "Overview", + "url": "https://onedrive.live.com/embed?cid=A72B50246D328C43&resid=A72B50246D328C43%21118687&authkey=AJ8guXj9wIItsrI", + "ratio": "16:9" + }, + "videos": [{ + "title": "Demo 1", + "url": "https://onedrive.live.com/embed?cid=A72B50246D328C43&resid=A72B50246D328C43%21118687&authkey=AJ8guXj9wIItsrI", + "ratio": "16:9" + }, { + "title": "Demo 2", + "url": "https://onedrive.live.com/embed?cid=A72B50246D328C43&resid=A72B50246D328C43%21118687&authkey=AJ8guXj9wIItsrI", + "ratio": "16:9" + }], + "newFeatures": [{ + "title": "Data quality bar", + "description": "Displaying overview quality for each data column.", + "url": "https://onedrive.live.com/embed?cid=A72B50246D328C43&resid=A72B50246D328C43%21118687&authkey=AJ8guXj9wIItsrI" + }, { + "title": "Inspector", + "description": "Profiling data from different angles.", + "url": "https://onedrive.live.com/embed?cid=A72B50246D328C43&resid=A72B50246D328C43%21118687&authkey=AJ8guXj9wIItsrI" + }, { + "title": "Summarize editor", + "description": "An interactive way to perform summarize transformation.", + "url": "https://onedrive.live.com/embed?cid=A72B50246D328C43&resid=A72B50246D328C43%21118687&authkey=AJ8guXj9wIItsrI" + }], + "tutorials": [{ + "label": "Tutorial 1", + "url": "https://onedrive.live.com/embed?cid=A72B50246D328C43&resid=A72B50246D328C43%21118687&authkey=AJ8guXj9wIItsrI" + }, { + "label": "Tutorial 2", + "url": "https://onedrive.live.com/embed?cid=A72B50246D328C43&resid=A72B50246D328C43%21118687&authkey=AJ8guXj9wIItsrI" + },{ + "label": "Tutorial 3", + "url": "https://onedrive.live.com/embed?cid=A72B50246D328C43&resid=A72B50246D328C43%21118687&authkey=AJ8guXj9wIItsrI" + }, { + "label": "Tutorial 4", + "url": "https://onedrive.live.com/embed?cid=A72B50246D328C43&resid=A72B50246D328C43%21118687&authkey=AJ8guXj9wIItsrI" + }] +} \ No newline at end of file diff --git a/src/views/htmlcontent/src/sqlOutput.ejs b/src/views/htmlcontent/src/sqlOutput.ejs new file mode 100644 index 0000000000..0849893aad --- /dev/null +++ b/src/views/htmlcontent/src/sqlOutput.ejs @@ -0,0 +1,50 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Loading... + + + \ No newline at end of file diff --git a/src/views/htmlcontent/tsconfig.json b/src/views/htmlcontent/tsconfig.json new file mode 100644 index 0000000000..b1005215f6 --- /dev/null +++ b/src/views/htmlcontent/tsconfig.json @@ -0,0 +1,14 @@ +{ + "compileOnSave": true, + "compilerOptions": { + "module": "commonjs", + "target": "es6", + "watch": false, + "sourceMap": true, + "rootDir": ".", + "experimentalDecorators": true + }, + "exclude": [ + "node_modules" + ] +} diff --git a/src/views/htmlcontent/tslint.json b/src/views/htmlcontent/tslint.json new file mode 100644 index 0000000000..06a17fbd31 --- /dev/null +++ b/src/views/htmlcontent/tslint.json @@ -0,0 +1,127 @@ +{ + "rules": { + "align": [ + true, + "parameters", + "statements" + ], + "ban": false, + "class-name": true, + "comment-format": [ + true, + "check-space" + ], + "curly": true, + "eofline": true, + "forin": true, + "indent": [ + true, + "spaces" + ], + "interface-name": true, + "jsdoc-format": true, + "label-position": true, + "label-undefined": true, + "max-line-length": [ + true, + 160 + ], + "member-access": false, + "member-ordering": [ + false, + "static-before-instance", + "variables-before-functions" + ], + "no-any": false, + "no-arg": true, + "no-bitwise": true, + "no-conditional-assignment": true, + "no-consecutive-blank-lines": false, + "no-console": [ + true, + "debug", + "info", + "time", + "timeEnd", + "trace" + ], + "no-construct": true, + "no-constructor-vars": false, + "no-debugger": true, + "no-duplicate-key": true, + "no-duplicate-variable": true, + "no-empty": true, + "no-eval": true, + "no-inferrable-types": false, + "no-internal-module": true, + "no-null-keyword": true, + "no-require-imports": false, + "no-shadowed-variable": true, + "no-string-literal": false, + "no-switch-case-fall-through": false, + "no-trailing-whitespace": true, + "no-unreachable": true, + "no-unused-expression": false, + "no-unused-variable": true, + "no-use-before-declare": true, + "no-var-keyword": true, + "no-var-requires": false, + "object-literal-sort-keys": false, + "one-line": [ + true, + "check-open-brace", + "check-catch", + "check-else", + "check-finally", + "check-whitespace" + ], + "quotemark": [ + true, + "single", + "avoid-escape" + ], + "radix": true, + "semicolon": true, + "switch-default": true, + "trailing-comma": [ + true, + { + "multiline": "never", + "singleline": "never" + } + ], + "triple-equals": [ + true, + "allow-null-check" + ], + "typedef": [ + true, + "call-signature", + "property-declaration" + ], + "typedef-whitespace": [ + true, + { + "call-signature": "nospace", + "index-signature": "nospace", + "parameter": "nospace", + "property-declaration": "nospace", + "variable-declaration": "nospace" + } + ], + "use-strict": false, + "variable-name": [ + true, + "allow-leading-underscore", + "ban-keywords" + ], + "whitespace": [ + true, + "check-branch", + "check-decl", + "check-operator", + "check-separator", + "check-type" + ] + } +} \ No newline at end of file diff --git a/src/views/htmlcontent/typings/typings.d.ts b/src/views/htmlcontent/typings/typings.d.ts new file mode 100644 index 0000000000..a8e74b6744 --- /dev/null +++ b/src/views/htmlcontent/typings/typings.d.ts @@ -0,0 +1,3 @@ +/// +/// +/// \ No newline at end of file diff --git a/src/views/htmlcontent/typings/underscore.d.ts b/src/views/htmlcontent/typings/underscore.d.ts new file mode 100644 index 0000000000..e1ee6e709b --- /dev/null +++ b/src/views/htmlcontent/typings/underscore.d.ts @@ -0,0 +1,5920 @@ +// Compiled using typings@0.6.2 +// Source: https://raw.githubusercontent.com/DefinitelyTyped/DefinitelyTyped/master/underscore/underscore.d.ts +// Type definitions for Underscore 1.7.0 +// Project: http://underscorejs.org/ +// Definitions by: Boris Yankov , Josh Baldwin , Christopher Currens +// Definitions: https://github.com/borisyankov/DefinitelyTyped + +declare module _ { + /** + * underscore.js _.throttle options. + **/ + interface ThrottleSettings { + + /** + * If you'd like to disable the leading-edge call, pass this as false. + **/ + leading?: boolean; + + /** + * If you'd like to disable the execution on the trailing-edge, pass false. + **/ + trailing?: boolean; + } + + /** + * underscore.js template settings, set templateSettings or pass as an argument + * to 'template()' to override defaults. + **/ + interface TemplateSettings { + /** + * Default value is '/<%([\s\S]+?)%>/g'. + **/ + evaluate?: RegExp; + + /** + * Default value is '/<%=([\s\S]+?)%>/g'. + **/ + interpolate?: RegExp; + + /** + * Default value is '/<%-([\s\S]+?)%>/g'. + **/ + escape?: RegExp; + + /** + * By default, 'template()' places the values from your data in the local scope via the 'with' statement. + * However, you can specify a single variable name with this setting. + **/ + variable?: string; + } + + interface Collection { } + + // Common interface between Arrays and jQuery objects + interface List extends Collection { + [index: number]: T; + length: number; + } + + interface Dictionary extends Collection { + [index: string]: T; + } + + interface ListIterator { + (value: T, index: number, list: List): TResult; + } + + interface ObjectIterator { + (element: T, key: string, list: Dictionary): TResult; + } + + interface MemoIterator { + (prev: TResult, curr: T, index: number, list: List): TResult; + } + + interface MemoObjectIterator { + (prev: TResult, curr: T, key: string, list: Dictionary): TResult; + } +} + +interface UnderscoreStatic { + /** + * Underscore OOP Wrapper, all Underscore functions that take an object + * as the first parameter can be invoked through this function. + * @param key First argument to Underscore object functions. + **/ + (value: _.Dictionary): Underscore; + (value: Array): Underscore; + (value: T): Underscore; + + /* ************* + * Collections * + ************* */ + + /** + * Iterates over a list of elements, yielding each in turn to an iterator function. The iterator is + * bound to the context object, if one is passed. Each invocation of iterator is called with three + * arguments: (element, index, list). If list is a JavaScript object, iterator's arguments will be + * (value, key, object). Delegates to the native forEach function if it exists. + * @param list Iterates over this list of elements. + * @param iterator Iterator function for each element `list`. + * @param context 'this' object in `iterator`, optional. + **/ + each( + list: _.List, + iterator: _.ListIterator, + context?: any): _.List; + + /** + * @see _.each + * @param object Iterates over properties of this object. + * @param iterator Iterator function for each property on `object`. + * @param context 'this' object in `iterator`, optional. + **/ + each( + object: _.Dictionary, + iterator: _.ObjectIterator, + context?: any): _.Dictionary; + + /** + * @see _.each + **/ + forEach( + list: _.List, + iterator: _.ListIterator, + context?: any): _.List; + + /** + * @see _.each + **/ + forEach( + object: _.Dictionary, + iterator: _.ObjectIterator, + context?: any): _.Dictionary; + + /** + * Produces a new array of values by mapping each value in list through a transformation function + * (iterator). If the native map method exists, it will be used instead. If list is a JavaScript + * object, iterator's arguments will be (value, key, object). + * @param list Maps the elements of this array. + * @param iterator Map iterator function for each element in `list`. + * @param context `this` object in `iterator`, optional. + * @return The mapped array result. + **/ + map( + list: _.List, + iterator: _.ListIterator, + context?: any): TResult[]; + + /** + * @see _.map + * @param object Maps the properties of this object. + * @param iterator Map iterator function for each property on `object`. + * @param context `this` object in `iterator`, optional. + * @return The mapped object result. + **/ + map( + object: _.Dictionary, + iterator: _.ObjectIterator, + context?: any): TResult[]; + + /** + * @see _.map + **/ + collect( + list: _.List, + iterator: _.ListIterator, + context?: any): TResult[]; + + /** + * @see _.map + **/ + collect( + object: _.Dictionary, + iterator: _.ObjectIterator, + context?: any): TResult[]; + + /** + * Also known as inject and foldl, reduce boils down a list of values into a single value. + * Memo is the initial state of the reduction, and each successive step of it should be + * returned by iterator. The iterator is passed four arguments: the memo, then the value + * and index (or key) of the iteration, and finally a reference to the entire list. + * @param list Reduces the elements of this array. + * @param iterator Reduce iterator function for each element in `list`. + * @param memo Initial reduce state. + * @param context `this` object in `iterator`, optional. + * @return Reduced object result. + **/ + reduce( + list: _.Collection, + iterator: _.MemoIterator, + memo?: TResult, + context?: any): TResult; + + reduce( + list: _.Dictionary, + iterator: _.MemoObjectIterator, + memo?: TResult, + context?: any): TResult; + + /** + * @see _.reduce + **/ + inject( + list: _.Collection, + iterator: _.MemoIterator, + memo?: TResult, + context?: any): TResult; + + /** + * @see _.reduce + **/ + foldl( + list: _.Collection, + iterator: _.MemoIterator, + memo?: TResult, + context?: any): TResult; + + /** + * The right-associative version of reduce. Delegates to the JavaScript 1.8 version of + * reduceRight, if it exists. `foldr` is not as useful in JavaScript as it would be in a + * language with lazy evaluation. + * @param list Reduces the elements of this array. + * @param iterator Reduce iterator function for each element in `list`. + * @param memo Initial reduce state. + * @param context `this` object in `iterator`, optional. + * @return Reduced object result. + **/ + reduceRight( + list: _.Collection, + iterator: _.MemoIterator, + memo?: TResult, + context?: any): TResult; + + /** + * @see _.reduceRight + **/ + foldr( + list: _.Collection, + iterator: _.MemoIterator, + memo?: TResult, + context?: any): TResult; + + /** + * Looks through each value in the list, returning the first one that passes a truth + * test (iterator). The function returns as soon as it finds an acceptable element, + * and doesn't traverse the entire list. + * @param list Searches for a value in this list. + * @param iterator Search iterator function for each element in `list`. + * @param context `this` object in `iterator`, optional. + * @return The first acceptable found element in `list`, if nothing is found undefined/null is returned. + **/ + find( + list: _.List, + iterator: _.ListIterator, + context?: any): T; + + /** + * @see _.find + **/ + find( + object: _.Dictionary, + iterator: _.ObjectIterator, + context?: any): T; + + /** + * @see _.find + **/ + find( + object: _.List|_.Dictionary, + iterator: U): T; + + /** + * @see _.find + **/ + find( + object: _.List|_.Dictionary, + iterator: string): T; + + /** + * @see _.find + **/ + detect( + list: _.List, + iterator: _.ListIterator, + context?: any): T; + + /** + * @see _.find + **/ + detect( + object: _.Dictionary, + iterator: _.ObjectIterator, + context?: any): T; + + /** + * @see _.find + **/ + detect( + object: _.List|_.Dictionary, + iterator: U): T; + + /** + * @see _.find + **/ + detect( + object: _.List|_.Dictionary, + iterator: string): T; + + /** + * Looks through each value in the list, returning the index of the first one that passes a truth + * test (iterator). The function returns as soon as it finds an acceptable element, + * and doesn't traverse the entire list. + * @param list Searches for a value in this list. + * @param iterator Search iterator function for each element in `list`. + * @param context `this` object in `iterator`, optional. + * @return The index of the first acceptable found element in `list`, if nothing is found -1 is returned. + **/ + findIndex( + list: _.List, + iterator: _.ListIterator, + context?: any): number; + + + /** + * Looks through each value in the list, returning an array of all the values that pass a truth + * test (iterator). Delegates to the native filter method, if it exists. + * @param list Filter elements out of this list. + * @param iterator Filter iterator function for each element in `list`. + * @param context `this` object in `iterator`, optional. + * @return The filtered list of elements. + **/ + filter( + list: _.List, + iterator: _.ListIterator, + context?: any): T[]; + + /** + * @see _.filter + **/ + filter( + object: _.Dictionary, + iterator: _.ObjectIterator, + context?: any): T[]; + + /** + * @see _.filter + **/ + select( + list: _.List, + iterator: _.ListIterator, + context?: any): T[]; + + /** + * @see _.filter + **/ + select( + object: _.Dictionary, + iterator: _.ObjectIterator, + context?: any): T[]; + + /** + * Looks through each value in the list, returning an array of all the values that contain all + * of the key-value pairs listed in properties. + * @param list List to match elements again `properties`. + * @param properties The properties to check for on each element within `list`. + * @return The elements within `list` that contain the required `properties`. + **/ + where( + list: _.List, + properties: U): T[]; + + /** + * Looks through the list and returns the first value that matches all of the key-value pairs listed in properties. + * @param list Search through this list's elements for the first object with all `properties`. + * @param properties Properties to look for on the elements within `list`. + * @return The first element in `list` that has all `properties`. + **/ + findWhere( + list: _.List, + properties: U): T; + + /** + * Returns the values in list without the elements that the truth test (iterator) passes. + * The opposite of filter. + * Return all the elements for which a truth test fails. + * @param list Reject elements within this list. + * @param iterator Reject iterator function for each element in `list`. + * @param context `this` object in `iterator`, optional. + * @return The rejected list of elements. + **/ + reject( + list: _.List, + iterator: _.ListIterator, + context?: any): T[]; + + /** + * @see _.reject + **/ + reject( + object: _.Dictionary, + iterator: _.ObjectIterator, + context?: any): T[]; + + /** + * Returns true if all of the values in the list pass the iterator truth test. Delegates to the + * native method every, if present. + * @param list Truth test against all elements within this list. + * @param iterator Trust test iterator function for each element in `list`. + * @param context `this` object in `iterator`, optional. + * @return True if all elements passed the truth test, otherwise false. + **/ + every( + list: _.List, + iterator?: _.ListIterator, + context?: any): boolean; + + /** + * @see _.every + **/ + every( + list: _.Dictionary, + iterator?: _.ObjectIterator, + context?: any): boolean; + + /** + * @see _.every + **/ + all( + list: _.List, + iterator?: _.ListIterator, + context?: any): boolean; + + /** + * @see _.every + **/ + all( + list: _.Dictionary, + iterator?: _.ObjectIterator, + context?: any): boolean; + + /** + * Returns true if any of the values in the list pass the iterator truth test. Short-circuits and + * stops traversing the list if a true element is found. Delegates to the native method some, if present. + * @param list Truth test against all elements within this list. + * @param iterator Trust test iterator function for each element in `list`. + * @param context `this` object in `iterator`, optional. + * @return True if any elements passed the truth test, otherwise false. + **/ + some( + list: _.List, + iterator?: _.ListIterator, + context?: any): boolean; + + /** + * @see _.some + **/ + some( + object: _.Dictionary, + iterator?: _.ObjectIterator, + context?: any): boolean; + + /** + * @see _.some + **/ + any( + list: _.List, + iterator?: _.ListIterator, + context?: any): boolean; + + /** + * @see _.some + **/ + any( + object: _.Dictionary, + iterator?: _.ObjectIterator, + context?: any): boolean; + + /** + * Returns true if the value is present in the list. Uses indexOf internally, + * if list is an Array. + * @param list Checks each element to see if `value` is present. + * @param value The value to check for within `list`. + * @return True if `value` is present in `list`, otherwise false. + **/ + contains( + list: _.List, + value: T): boolean; + + /** + * @see _.contains + **/ + contains( + object: _.Dictionary, + value: T): boolean; + + /** + * @see _.contains + **/ + include( + list: _.Collection, + value: T): boolean; + + /** + * @see _.contains + **/ + include( + object: _.Dictionary, + value: T): boolean; + + /** + * Calls the method named by methodName on each value in the list. Any extra arguments passed to + * invoke will be forwarded on to the method invocation. + * @param list The element's in this list will each have the method `methodName` invoked. + * @param methodName The method's name to call on each element within `list`. + * @param arguments Additional arguments to pass to the method `methodName`. + **/ + invoke( + list: _.List, + methodName: string, + ...arguments: any[]): any; + + /** + * A convenient version of what is perhaps the most common use-case for map: extracting a list of + * property values. + * @param list The list to pluck elements out of that have the property `propertyName`. + * @param propertyName The property to look for on each element within `list`. + * @return The list of elements within `list` that have the property `propertyName`. + **/ + pluck( + list: _.List, + propertyName: string): any[]; + + /** + * Returns the maximum value in list. + * @param list Finds the maximum value in this list. + * @return Maximum value in `list`. + **/ + max(list: _.List): number; + + /** + * Returns the maximum value in list. If iterator is passed, it will be used on each value to generate + * the criterion by which the value is ranked. + * @param list Finds the maximum value in this list. + * @param iterator Compares each element in `list` to find the maximum value. + * @param context `this` object in `iterator`, optional. + * @return The maximum element within `list`. + **/ + max( + list: _.List, + iterator?: _.ListIterator, + context?: any): T; + + /** + * Returns the minimum value in list. + * @param list Finds the minimum value in this list. + * @return Minimum value in `list`. + **/ + min(list: _.List): number; + + /** + * Returns the minimum value in list. If iterator is passed, it will be used on each value to generate + * the criterion by which the value is ranked. + * @param list Finds the minimum value in this list. + * @param iterator Compares each element in `list` to find the minimum value. + * @param context `this` object in `iterator`, optional. + * @return The minimum element within `list`. + **/ + min( + list: _.List, + iterator?: _.ListIterator, + context?: any): T; + + /** + * Returns a sorted copy of list, ranked in ascending order by the results of running each value + * through iterator. Iterator may also be the string name of the property to sort by (eg. length). + * @param list Sorts this list. + * @param iterator Sort iterator for each element within `list`. + * @param context `this` object in `iterator`, optional. + * @return A sorted copy of `list`. + **/ + sortBy( + list: _.List, + iterator?: _.ListIterator, + context?: any): T[]; + + /** + * @see _.sortBy + * @param iterator Sort iterator for each element within `list`. + **/ + sortBy( + list: _.List, + iterator: string, + context?: any): T[]; + + /** + * Splits a collection into sets, grouped by the result of running each value through iterator. + * If iterator is a string instead of a function, groups by the property named by iterator on + * each of the values. + * @param list Groups this list. + * @param iterator Group iterator for each element within `list`, return the key to group the element by. + * @param context `this` object in `iterator`, optional. + * @return An object with the group names as properties where each property contains the grouped elements from `list`. + **/ + groupBy( + list: _.List, + iterator?: _.ListIterator, + context?: any): _.Dictionary; + + /** + * @see _.groupBy + * @param iterator Property on each object to group them by. + **/ + groupBy( + list: _.List, + iterator: string, + context?: any): _.Dictionary; + + /** + * Given a `list`, and an `iterator` function that returns a key for each element in the list (or a property name), + * returns an object with an index of each item. Just like _.groupBy, but for when you know your keys are unique. + **/ + indexBy( + list: _.List, + iterator: _.ListIterator, + context?: any): _.Dictionary; + + /** + * @see _.indexBy + * @param iterator Property on each object to index them by. + **/ + indexBy( + list: _.List, + iterator: string, + context?: any): _.Dictionary; + + /** + * Sorts a list into groups and returns a count for the number of objects in each group. Similar + * to groupBy, but instead of returning a list of values, returns a count for the number of values + * in that group. + * @param list Group elements in this list and then count the number of elements in each group. + * @param iterator Group iterator for each element within `list`, return the key to group the element by. + * @param context `this` object in `iterator`, optional. + * @return An object with the group names as properties where each property contains the number of elements in that group. + **/ + countBy( + list: _.List, + iterator?: _.ListIterator, + context?: any): _.Dictionary; + + /** + * @see _.countBy + * @param iterator Function name + **/ + countBy( + list: _.List, + iterator: string, + context?: any): _.Dictionary; + + /** + * Returns a shuffled copy of the list, using a version of the Fisher-Yates shuffle. + * @param list List to shuffle. + * @return Shuffled copy of `list`. + **/ + shuffle(list: _.Collection): T[]; + + /** + * Produce a random sample from the `list`. Pass a number to return `n` random elements from the list. Otherwise a single random item will be returned. + * @param list List to sample. + * @return Random sample of `n` elements in `list`. + **/ + sample(list: _.Collection, n: number): T[]; + + /** + * @see _.sample + **/ + sample(list: _.Collection): T; + + /** + * Converts the list (anything that can be iterated over), into a real Array. Useful for transmuting + * the arguments object. + * @param list object to transform into an array. + * @return `list` as an array. + **/ + toArray(list: _.Collection): T[]; + + /** + * Return the number of values in the list. + * @param list Count the number of values/elements in this list. + * @return Number of values in `list`. + **/ + size(list: _.Collection): number; + + /** + * Split array into two arrays: + * one whose elements all satisfy predicate and one whose elements all do not satisfy predicate. + * @param array Array to split in two. + * @param iterator Filter iterator function for each element in `array`. + * @param context `this` object in `iterator`, optional. + * @return Array where Array[0] are the elements in `array` that satisfies the predicate, and Array[1] the elements that did not. + **/ + partition( + array: Array, + iterator: _.ListIterator, + context?: any): T[][]; + + /********* + * Arrays * + **********/ + + /** + * Returns the first element of an array. Passing n will return the first n elements of the array. + * @param array Retrieves the first element of this array. + * @return Returns the first element of `array`. + **/ + first(array: _.List): T; + + /** + * @see _.first + * @param n Return more than one element from `array`. + **/ + first( + array: _.List, + n: number): T[]; + + /** + * @see _.first + **/ + head(array: _.List): T; + + /** + * @see _.first + **/ + head( + array: _.List, + n: number): T[]; + + /** + * @see _.first + **/ + take(array: _.List): T; + + /** + * @see _.first + **/ + take( + array: _.List, + n: number): T[]; + + /** + * Returns everything but the last entry of the array. Especially useful on the arguments object. + * Pass n to exclude the last n elements from the result. + * @param array Retrieve all elements except the last `n`. + * @param n Leaves this many elements behind, optional. + * @return Returns everything but the last `n` elements of `array`. + **/ + initial( + array: _.List, + n?: number): T[]; + + /** + * Returns the last element of an array. Passing n will return the last n elements of the array. + * @param array Retrieves the last element of this array. + * @return Returns the last element of `array`. + **/ + last(array: _.List): T; + + /** + * @see _.last + * @param n Return more than one element from `array`. + **/ + last( + array: _.List, + n: number): T[]; + + /** + * Returns the rest of the elements in an array. Pass an index to return the values of the array + * from that index onward. + * @param array The array to retrieve all but the first `index` elements. + * @param n The index to start retrieving elements forward from, optional, default = 1. + * @return Returns the elements of `array` from `index` to the end of `array`. + **/ + rest( + array: _.List, + n?: number): T[]; + + /** + * @see _.rest + **/ + tail( + array: _.List, + n?: number): T[]; + + /** + * @see _.rest + **/ + drop( + array: _.List, + n?: number): T[]; + + /** + * Returns a copy of the array with all falsy values removed. In JavaScript, false, null, 0, "", + * undefined and NaN are all falsy. + * @param array Array to compact. + * @return Copy of `array` without false values. + **/ + compact(array: _.List): T[]; + + /** + * Flattens a nested array (the nesting can be to any depth). If you pass shallow, the array will + * only be flattened a single level. + * @param array The array to flatten. + * @param shallow If true then only flatten one level, optional, default = false. + * @return `array` flattened. + **/ + flatten( + array: _.List, + shallow?: boolean): any[]; + + /** + * Returns a copy of the array with all instances of the values removed. + * @param array The array to remove `values` from. + * @param values The values to remove from `array`. + * @return Copy of `array` without `values`. + **/ + without( + array: _.List, + ...values: T[]): T[]; + + /** + * Computes the union of the passed-in arrays: the list of unique items, in order, that are + * present in one or more of the arrays. + * @param arrays Array of arrays to compute the union of. + * @return The union of elements within `arrays`. + **/ + union(...arrays: _.List[]): T[]; + + /** + * Computes the list of values that are the intersection of all the arrays. Each value in the result + * is present in each of the arrays. + * @param arrays Array of arrays to compute the intersection of. + * @return The intersection of elements within `arrays`. + **/ + intersection(...arrays: _.List[]): T[]; + + /** + * Similar to without, but returns the values from array that are not present in the other arrays. + * @param array Keeps values that are within `others`. + * @param others The values to keep within `array`. + * @return Copy of `array` with only `others` values. + **/ + difference( + array: _.List, + ...others: _.List[]): T[]; + + /** + * Produces a duplicate-free version of the array, using === to test object equality. If you know in + * advance that the array is sorted, passing true for isSorted will run a much faster algorithm. If + * you want to compute unique items based on a transformation, pass an iterator function. + * @param array Array to remove duplicates from. + * @param isSorted True if `array` is already sorted, optional, default = false. + * @param iterator Transform the elements of `array` before comparisons for uniqueness. + * @param context 'this' object in `iterator`, optional. + * @return Copy of `array` where all elements are unique. + **/ + uniq( + array: _.List, + isSorted?: boolean, + iterator?: _.ListIterator, + context?: any): T[]; + + /** + * @see _.uniq + **/ + uniq( + array: _.List, + iterator?: _.ListIterator, + context?: any): T[]; + + /** + * @see _.uniq + **/ + unique( + array: _.List, + iterator?: _.ListIterator, + context?: any): T[]; + + /** + * @see _.uniq + **/ + unique( + array: _.List, + isSorted?: boolean, + iterator?: _.ListIterator, + context?: any): T[]; + + + /** + * Merges together the values of each of the arrays with the values at the corresponding position. + * Useful when you have separate data sources that are coordinated through matching array indexes. + * If you're working with a matrix of nested arrays, zip.apply can transpose the matrix in a similar fashion. + * @param arrays The arrays to merge/zip. + * @return Zipped version of `arrays`. + **/ + zip(...arrays: any[][]): any[][]; + + /** + * @see _.zip + **/ + zip(...arrays: any[]): any[]; + + /** + * The opposite of zip. Given a number of arrays, returns a series of new arrays, the first + * of which contains all of the first elements in the input arrays, the second of which + * contains all of the second elements, and so on. Use with apply to pass in an array + * of arrays + * @param arrays The arrays to unzip. + * @return Unzipped version of `arrays`. + **/ + unzip(...arrays: any[][]): any[][]; + + /** + * Converts arrays into objects. Pass either a single list of [key, value] pairs, or a + * list of keys, and a list of values. + * @param keys Key array. + * @param values Value array. + * @return An object containing the `keys` as properties and `values` as the property values. + **/ + object( + keys: _.List, + values: _.List): TResult; + + /** + * Converts arrays into objects. Pass either a single list of [key, value] pairs, or a + * list of keys, and a list of values. + * @param keyValuePairs Array of [key, value] pairs. + * @return An object containing the `keys` as properties and `values` as the property values. + **/ + object(...keyValuePairs: any[][]): TResult; + + /** + * @see _.object + **/ + object( + list: _.List, + values?: any): TResult; + + /** + * Returns the index at which value can be found in the array, or -1 if value is not present in the array. + * Uses the native indexOf function unless it's missing. If you're working with a large array, and you know + * that the array is already sorted, pass true for isSorted to use a faster binary search ... or, pass a number + * as the third argument in order to look for the first matching value in the array after the given index. + * @param array The array to search for the index of `value`. + * @param value The value to search for within `array`. + * @param isSorted True if the array is already sorted, optional, default = false. + * @return The index of `value` within `array`. + **/ + indexOf( + array: _.List, + value: T, + isSorted?: boolean): number; + + /** + * @see _indexof + **/ + indexOf( + array: _.List, + value: T, + startFrom: number): number; + + /** + * Returns the index of the last occurrence of value in the array, or -1 if value is not present. Uses the + * native lastIndexOf function if possible. Pass fromIndex to start your search at a given index. + * @param array The array to search for the last index of `value`. + * @param value The value to search for within `array`. + * @param from The starting index for the search, optional. + * @return The index of the last occurrence of `value` within `array`. + **/ + lastIndexOf( + array: _.List, + value: T, + from?: number): number; + + /** + * Returns the first index of an element in `array` where the predicate truth test passes + * @param array The array to search for the index of the first element where the predicate truth test passes. + * @param predicate Predicate function. + * @param context `this` object in `predicate`, optional. + * @return Returns the index of an element in `array` where the predicate truth test passes or -1.` + **/ + findIndex( + array: _.List, + predicate: _.ListIterator, + context?: any): number; + + /** + * Returns the last index of an element in `array` where the predicate truth test passes + * @param array The array to search for the index of the last element where the predicate truth test passes. + * @param predicate Predicate function. + * @param context `this` object in `predicate`, optional. + * @return Returns the index of an element in `array` where the predicate truth test passes or -1.` + **/ + findLastIndex( + array: _.List, + predicate: _.ListIterator, + context?: any): number; + + /** + * Uses a binary search to determine the index at which the value should be inserted into the list in order + * to maintain the list's sorted order. If an iterator is passed, it will be used to compute the sort ranking + * of each value, including the value you pass. + * @param list The sorted list. + * @param value The value to determine its index within `list`. + * @param iterator Iterator to compute the sort ranking of each value, optional. + * @return The index where `value` should be inserted into `list`. + **/ + sortedIndex( + list: _.List, + value: T, + iterator?: (x: T) => TSort, context?: any): number; + + /** + * A function to create flexibly-numbered lists of integers, handy for each and map loops. start, if omitted, + * defaults to 0; step defaults to 1. Returns a list of integers from start to stop, incremented (or decremented) + * by step, exclusive. + * @param start Start here. + * @param stop Stop here. + * @param step The number to count up by each iteration, optional, default = 1. + * @return Array of numbers from `start` to `stop` with increments of `step`. + **/ + + range( + start: number, + stop: number, + step?: number): number[]; + + /** + * @see _.range + * @param stop Stop here. + * @return Array of numbers from 0 to `stop` with increments of 1. + * @note If start is not specified the implementation will never pull the step (step = arguments[2] || 0) + **/ + range(stop: number): number[]; + + /************* + * Functions * + *************/ + + /** + * Bind a function to an object, meaning that whenever the function is called, the value of this will + * be the object. Optionally, bind arguments to the function to pre-fill them, also known as partial application. + * @param func The function to bind `this` to `object`. + * @param context The `this` pointer whenever `fn` is called. + * @param arguments Additional arguments to pass to `fn` when called. + * @return `fn` with `this` bound to `object`. + **/ + bind( + func: Function, + context: any, + ...arguments: any[]): () => any; + + /** + * Binds a number of methods on the object, specified by methodNames, to be run in the context of that object + * whenever they are invoked. Very handy for binding functions that are going to be used as event handlers, + * which would otherwise be invoked with a fairly useless this. If no methodNames are provided, all of the + * object's function properties will be bound to it. + * @param object The object to bind the methods `methodName` to. + * @param methodNames The methods to bind to `object`, optional and if not provided all of `object`'s + * methods are bound. + **/ + bindAll( + object: any, + ...methodNames: string[]): any; + + /** + * Partially apply a function by filling in any number of its arguments, without changing its dynamic this value. + * A close cousin of bind. You may pass _ in your list of arguments to specify an argument that should not be + * pre-filled, but left open to supply at call-time. + * @param fn Function to partially fill in arguments. + * @param arguments The partial arguments. + * @return `fn` with partially filled in arguments. + **/ + + partial( + fn: { (p1: T1):T2 }, + p1: T1 + ): { (): T2 }; + + partial( + fn: { (p1: T1, p2: T2):T3 }, + p1: T1 + ): { (p2: T2): T3 }; + + partial( + fn: { (p1: T1, p2: T2):T3 }, + p1: T1, + p2: T2 + ): { (): T3 }; + + partial( + fn: { (p1: T1, p2: T2):T3 }, + stub1: UnderscoreStatic, + p2: T2 + ): { (p1: T1): T3 }; + + partial( + fn: { (p1: T1, p2: T2, p3: T3):T4 }, + p1: T1 + ): { (p2: T2, p3: T3): T4 }; + + partial( + fn: { (p1: T1, p2: T2, p3: T3):T4 }, + p1: T1, + p2: T2 + ): { (p3: T3): T4 }; + + partial( + fn: { (p1: T1, p2: T2, p3: T3):T4 }, + stub1: UnderscoreStatic, + p2: T2 + ): { (p1: T1, p3: T3): T4 }; + + partial( + fn: { (p1: T1, p2: T2, p3: T3):T4 }, + p1: T1, + p2: T2, + p3: T3 + ): { (): T4 }; + + partial( + fn: { (p1: T1, p2: T2, p3: T3):T4 }, + stub1: UnderscoreStatic, + p2: T2, + p3: T3 + ): { (p1: T1): T4 }; + + partial( + fn: { (p1: T1, p2: T2, p3: T3):T4 }, + p1: T1, + stub2: UnderscoreStatic, + p3: T3 + ): { (p2: T2): T4 }; + + partial( + fn: { (p1: T1, p2: T2, p3: T3):T4 }, + stub1: UnderscoreStatic, + stub2: UnderscoreStatic, + p3: T3 + ): { (p1: T1, p2: T2): T4 }; + + partial( + fn: { (p1: T1, p2: T2, p3: T3, p4: T4):T5 }, + p1: T1 + ): { (p2: T2, p3: T3, p4: T4): T5 }; + + partial( + fn: { (p1: T1, p2: T2, p3: T3, p4: T4):T5 }, + p1: T1, + p2: T2 + ): { (p3: T3, p4: T4): T5 }; + + partial( + fn: { (p1: T1, p2: T2, p3: T3, p4: T4):T5 }, + stub1: UnderscoreStatic, + p2: T2 + ): { (p1: T1, p3: T3, p4: T4): T5 }; + + partial( + fn: { (p1: T1, p2: T2, p3: T3, p4: T4):T5 }, + p1: T1, + p2: T2, + p3: T3 + ): { (p4: T4): T5 }; + + partial( + fn: { (p1: T1, p2: T2, p3: T3, p4: T4):T5 }, + stub1: UnderscoreStatic, + p2: T2, + p3: T3 + ): { (p1: T1, p4: T4): T5 }; + + partial( + fn: { (p1: T1, p2: T2, p3: T3, p4: T4):T5 }, + p1: T1, + stub2: UnderscoreStatic, + p3: T3 + ): { (p2: T2, p4: T4): T5 }; + + partial( + fn: { (p1: T1, p2: T2, p3: T3, p4: T4):T5 }, + stub1: UnderscoreStatic, + stub2: UnderscoreStatic, + p3: T3 + ): { (p1: T1, p2: T2, p4: T4): T5 }; + + partial( + fn: { (p1: T1, p2: T2, p3: T3, p4: T4):T5 }, + p1: T1, + p2: T2, + p3: T3, + p4: T4 + ): { (): T5 }; + + partial( + fn: { (p1: T1, p2: T2, p3: T3, p4: T4):T5 }, + stub1: UnderscoreStatic, + p2: T2, + p3: T3, + p4: T4 + ): { (p1: T1): T5 }; + + partial( + fn: { (p1: T1, p2: T2, p3: T3, p4: T4):T5 }, + p1: T1, + stub2: UnderscoreStatic, + p3: T3, + p4: T4 + ): { (p2: T2): T5 }; + + partial( + fn: { (p1: T1, p2: T2, p3: T3, p4: T4):T5 }, + stub1: UnderscoreStatic, + stub2: UnderscoreStatic, + p3: T3, + p4: T4 + ): { (p1: T1, p2: T2): T5 }; + + partial( + fn: { (p1: T1, p2: T2, p3: T3, p4: T4):T5 }, + p1: T1, + p2: T2, + stub3: UnderscoreStatic, + p4: T4 + ): { (p3: T3): T5 }; + + partial( + fn: { (p1: T1, p2: T2, p3: T3, p4: T4):T5 }, + stub1: UnderscoreStatic, + p2: T2, + stub3: UnderscoreStatic, + p4: T4 + ): { (p1: T1, p3: T3): T5 }; + + partial( + fn: { (p1: T1, p2: T2, p3: T3, p4: T4):T5 }, + p1: T1, + stub2: UnderscoreStatic, + stub3: UnderscoreStatic, + p4: T4 + ): { (p2: T2, p3: T3): T5 }; + + partial( + fn: { (p1: T1, p2: T2, p3: T3, p4: T4):T5 }, + stub1: UnderscoreStatic, + stub2: UnderscoreStatic, + stub3: UnderscoreStatic, + p4: T4 + ): { (p1: T1, p2: T2, p3: T3): T5 }; + + partial( + fn: { (p1: T1, p2: T2, p3: T3, p4: T4, p5: T5):T6 }, + p1: T1 + ): { (p2: T2, p3: T3, p4: T4, p5: T5): T6 }; + + partial( + fn: { (p1: T1, p2: T2, p3: T3, p4: T4, p5: T5):T6 }, + p1: T1, + p2: T2 + ): { (p3: T3, p4: T4, p5: T5): T6 }; + + partial( + fn: { (p1: T1, p2: T2, p3: T3, p4: T4, p5: T5):T6 }, + stub1: UnderscoreStatic, + p2: T2 + ): { (p1: T1, p3: T3, p4: T4, p5: T5): T6 }; + + partial( + fn: { (p1: T1, p2: T2, p3: T3, p4: T4, p5: T5):T6 }, + p1: T1, + p2: T2, + p3: T3 + ): { (p4: T4, p5: T5): T6 }; + + partial( + fn: { (p1: T1, p2: T2, p3: T3, p4: T4, p5: T5):T6 }, + stub1: UnderscoreStatic, + p2: T2, + p3: T3 + ): { (p1: T1, p4: T4, p5: T5): T6 }; + + partial( + fn: { (p1: T1, p2: T2, p3: T3, p4: T4, p5: T5):T6 }, + p1: T1, + stub2: UnderscoreStatic, + p3: T3 + ): { (p2: T2, p4: T4, p5: T5): T6 }; + + partial( + fn: { (p1: T1, p2: T2, p3: T3, p4: T4, p5: T5):T6 }, + stub1: UnderscoreStatic, + stub2: UnderscoreStatic, + p3: T3 + ): { (p1: T1, p2: T2, p4: T4, p5: T5): T6 }; + + partial( + fn: { (p1: T1, p2: T2, p3: T3, p4: T4, p5: T5):T6 }, + p1: T1, + p2: T2, + p3: T3, + p4: T4 + ): { (p5: T5): T6 }; + + partial( + fn: { (p1: T1, p2: T2, p3: T3, p4: T4, p5: T5):T6 }, + stub1: UnderscoreStatic, + p2: T2, + p3: T3, + p4: T4 + ): { (p1: T1, p5: T5): T6 }; + + partial( + fn: { (p1: T1, p2: T2, p3: T3, p4: T4, p5: T5):T6 }, + p1: T1, + stub2: UnderscoreStatic, + p3: T3, + p4: T4 + ): { (p2: T2, p5: T5): T6 }; + + partial( + fn: { (p1: T1, p2: T2, p3: T3, p4: T4, p5: T5):T6 }, + stub1: UnderscoreStatic, + stub2: UnderscoreStatic, + p3: T3, + p4: T4 + ): { (p1: T1, p2: T2, p5: T5): T6 }; + + partial( + fn: { (p1: T1, p2: T2, p3: T3, p4: T4, p5: T5):T6 }, + p1: T1, + p2: T2, + stub3: UnderscoreStatic, + p4: T4 + ): { (p3: T3, p5: T5): T6 }; + + partial( + fn: { (p1: T1, p2: T2, p3: T3, p4: T4, p5: T5):T6 }, + stub1: UnderscoreStatic, + p2: T2, + stub3: UnderscoreStatic, + p4: T4 + ): { (p1: T1, p3: T3, p5: T5): T6 }; + + partial( + fn: { (p1: T1, p2: T2, p3: T3, p4: T4, p5: T5):T6 }, + p1: T1, + stub2: UnderscoreStatic, + stub3: UnderscoreStatic, + p4: T4 + ): { (p2: T2, p3: T3, p5: T5): T6 }; + + partial( + fn: { (p1: T1, p2: T2, p3: T3, p4: T4, p5: T5):T6 }, + stub1: UnderscoreStatic, + stub2: UnderscoreStatic, + stub3: UnderscoreStatic, + p4: T4 + ): { (p1: T1, p2: T2, p3: T3, p5: T5): T6 }; + + partial( + fn: { (p1: T1, p2: T2, p3: T3, p4: T4, p5: T5):T6 }, + p1: T1, + p2: T2, + p3: T3, + p4: T4, + p5: T5 + ): { (): T6 }; + + partial( + fn: { (p1: T1, p2: T2, p3: T3, p4: T4, p5: T5):T6 }, + stub1: UnderscoreStatic, + p2: T2, + p3: T3, + p4: T4, + p5: T5 + ): { (p1: T1): T6 }; + + partial( + fn: { (p1: T1, p2: T2, p3: T3, p4: T4, p5: T5):T6 }, + p1: T1, + stub2: UnderscoreStatic, + p3: T3, + p4: T4, + p5: T5 + ): { (p2: T2): T6 }; + + partial( + fn: { (p1: T1, p2: T2, p3: T3, p4: T4, p5: T5):T6 }, + stub1: UnderscoreStatic, + stub2: UnderscoreStatic, + p3: T3, + p4: T4, + p5: T5 + ): { (p1: T1, p2: T2): T6 }; + + partial( + fn: { (p1: T1, p2: T2, p3: T3, p4: T4, p5: T5):T6 }, + p1: T1, + p2: T2, + stub3: UnderscoreStatic, + p4: T4, + p5: T5 + ): { (p3: T3): T6 }; + + partial( + fn: { (p1: T1, p2: T2, p3: T3, p4: T4, p5: T5):T6 }, + stub1: UnderscoreStatic, + p2: T2, + stub3: UnderscoreStatic, + p4: T4, + p5: T5 + ): { (p1: T1, p3: T3): T6 }; + + partial( + fn: { (p1: T1, p2: T2, p3: T3, p4: T4, p5: T5):T6 }, + p1: T1, + stub2: UnderscoreStatic, + stub3: UnderscoreStatic, + p4: T4, + p5: T5 + ): { (p2: T2, p3: T3): T6 }; + + partial( + fn: { (p1: T1, p2: T2, p3: T3, p4: T4, p5: T5):T6 }, + stub1: UnderscoreStatic, + stub2: UnderscoreStatic, + stub3: UnderscoreStatic, + p4: T4, + p5: T5 + ): { (p1: T1, p2: T2, p3: T3): T6 }; + + partial( + fn: { (p1: T1, p2: T2, p3: T3, p4: T4, p5: T5):T6 }, + p1: T1, + p2: T2, + p3: T3, + stub4: UnderscoreStatic, + p5: T5 + ): { (p4: T4): T6 }; + + partial( + fn: { (p1: T1, p2: T2, p3: T3, p4: T4, p5: T5):T6 }, + stub1: UnderscoreStatic, + p2: T2, + p3: T3, + stub4: UnderscoreStatic, + p5: T5 + ): { (p1: T1, p4: T4): T6 }; + + partial( + fn: { (p1: T1, p2: T2, p3: T3, p4: T4, p5: T5):T6 }, + p1: T1, + stub2: UnderscoreStatic, + p3: T3, + stub4: UnderscoreStatic, + p5: T5 + ): { (p2: T2, p4: T4): T6 }; + + partial( + fn: { (p1: T1, p2: T2, p3: T3, p4: T4, p5: T5):T6 }, + stub1: UnderscoreStatic, + stub2: UnderscoreStatic, + p3: T3, + stub4: UnderscoreStatic, + p5: T5 + ): { (p1: T1, p2: T2, p4: T4): T6 }; + + partial( + fn: { (p1: T1, p2: T2, p3: T3, p4: T4, p5: T5):T6 }, + p1: T1, + p2: T2, + stub3: UnderscoreStatic, + stub4: UnderscoreStatic, + p5: T5 + ): { (p3: T3, p4: T4): T6 }; + + partial( + fn: { (p1: T1, p2: T2, p3: T3, p4: T4, p5: T5):T6 }, + stub1: UnderscoreStatic, + p2: T2, + stub3: UnderscoreStatic, + stub4: UnderscoreStatic, + p5: T5 + ): { (p1: T1, p3: T3, p4: T4): T6 }; + + partial( + fn: { (p1: T1, p2: T2, p3: T3, p4: T4, p5: T5):T6 }, + p1: T1, + stub2: UnderscoreStatic, + stub3: UnderscoreStatic, + stub4: UnderscoreStatic, + p5: T5 + ): { (p2: T2, p3: T3, p4: T4): T6 }; + + partial( + fn: { (p1: T1, p2: T2, p3: T3, p4: T4, p5: T5):T6 }, + stub1: UnderscoreStatic, + stub2: UnderscoreStatic, + stub3: UnderscoreStatic, + stub4: UnderscoreStatic, + p5: T5 + ): { (p1: T1, p2: T2, p3: T3, p4: T4): T6 }; + + partial( + fn: { (p1: T1, p2: T2, p3: T3, p4: T4, p5: T5, p6: T6):T7 }, + p1: T1 + ): { (p2: T2, p3: T3, p4: T4, p5: T5, p6: T6): T7 }; + + partial( + fn: { (p1: T1, p2: T2, p3: T3, p4: T4, p5: T5, p6: T6):T7 }, + p1: T1, + p2: T2 + ): { (p3: T3, p4: T4, p5: T5, p6: T6): T7 }; + + partial( + fn: { (p1: T1, p2: T2, p3: T3, p4: T4, p5: T5, p6: T6):T7 }, + stub1: UnderscoreStatic, + p2: T2 + ): { (p1: T1, p3: T3, p4: T4, p5: T5, p6: T6): T7 }; + + partial( + fn: { (p1: T1, p2: T2, p3: T3, p4: T4, p5: T5, p6: T6):T7 }, + p1: T1, + p2: T2, + p3: T3 + ): { (p4: T4, p5: T5, p6: T6): T7 }; + + partial( + fn: { (p1: T1, p2: T2, p3: T3, p4: T4, p5: T5, p6: T6):T7 }, + stub1: UnderscoreStatic, + p2: T2, + p3: T3 + ): { (p1: T1, p4: T4, p5: T5, p6: T6): T7 }; + + partial( + fn: { (p1: T1, p2: T2, p3: T3, p4: T4, p5: T5, p6: T6):T7 }, + p1: T1, + stub2: UnderscoreStatic, + p3: T3 + ): { (p2: T2, p4: T4, p5: T5, p6: T6): T7 }; + + partial( + fn: { (p1: T1, p2: T2, p3: T3, p4: T4, p5: T5, p6: T6):T7 }, + stub1: UnderscoreStatic, + stub2: UnderscoreStatic, + p3: T3 + ): { (p1: T1, p2: T2, p4: T4, p5: T5, p6: T6): T7 }; + + partial( + fn: { (p1: T1, p2: T2, p3: T3, p4: T4, p5: T5, p6: T6):T7 }, + p1: T1, + p2: T2, + p3: T3, + p4: T4 + ): { (p5: T5, p6: T6): T7 }; + + partial( + fn: { (p1: T1, p2: T2, p3: T3, p4: T4, p5: T5, p6: T6):T7 }, + stub1: UnderscoreStatic, + p2: T2, + p3: T3, + p4: T4 + ): { (p1: T1, p5: T5, p6: T6): T7 }; + + partial( + fn: { (p1: T1, p2: T2, p3: T3, p4: T4, p5: T5, p6: T6):T7 }, + p1: T1, + stub2: UnderscoreStatic, + p3: T3, + p4: T4 + ): { (p2: T2, p5: T5, p6: T6): T7 }; + + partial( + fn: { (p1: T1, p2: T2, p3: T3, p4: T4, p5: T5, p6: T6):T7 }, + stub1: UnderscoreStatic, + stub2: UnderscoreStatic, + p3: T3, + p4: T4 + ): { (p1: T1, p2: T2, p5: T5, p6: T6): T7 }; + + partial( + fn: { (p1: T1, p2: T2, p3: T3, p4: T4, p5: T5, p6: T6):T7 }, + p1: T1, + p2: T2, + stub3: UnderscoreStatic, + p4: T4 + ): { (p3: T3, p5: T5, p6: T6): T7 }; + + partial( + fn: { (p1: T1, p2: T2, p3: T3, p4: T4, p5: T5, p6: T6):T7 }, + stub1: UnderscoreStatic, + p2: T2, + stub3: UnderscoreStatic, + p4: T4 + ): { (p1: T1, p3: T3, p5: T5, p6: T6): T7 }; + + partial( + fn: { (p1: T1, p2: T2, p3: T3, p4: T4, p5: T5, p6: T6):T7 }, + p1: T1, + stub2: UnderscoreStatic, + stub3: UnderscoreStatic, + p4: T4 + ): { (p2: T2, p3: T3, p5: T5, p6: T6): T7 }; + + partial( + fn: { (p1: T1, p2: T2, p3: T3, p4: T4, p5: T5, p6: T6):T7 }, + stub1: UnderscoreStatic, + stub2: UnderscoreStatic, + stub3: UnderscoreStatic, + p4: T4 + ): { (p1: T1, p2: T2, p3: T3, p5: T5, p6: T6): T7 }; + + partial( + fn: { (p1: T1, p2: T2, p3: T3, p4: T4, p5: T5, p6: T6):T7 }, + p1: T1, + p2: T2, + p3: T3, + p4: T4, + p5: T5 + ): { (p6: T6): T7 }; + + partial( + fn: { (p1: T1, p2: T2, p3: T3, p4: T4, p5: T5, p6: T6):T7 }, + stub1: UnderscoreStatic, + p2: T2, + p3: T3, + p4: T4, + p5: T5 + ): { (p1: T1, p6: T6): T7 }; + + partial( + fn: { (p1: T1, p2: T2, p3: T3, p4: T4, p5: T5, p6: T6):T7 }, + p1: T1, + stub2: UnderscoreStatic, + p3: T3, + p4: T4, + p5: T5 + ): { (p2: T2, p6: T6): T7 }; + + partial( + fn: { (p1: T1, p2: T2, p3: T3, p4: T4, p5: T5, p6: T6):T7 }, + stub1: UnderscoreStatic, + stub2: UnderscoreStatic, + p3: T3, + p4: T4, + p5: T5 + ): { (p1: T1, p2: T2, p6: T6): T7 }; + + partial( + fn: { (p1: T1, p2: T2, p3: T3, p4: T4, p5: T5, p6: T6):T7 }, + p1: T1, + p2: T2, + stub3: UnderscoreStatic, + p4: T4, + p5: T5 + ): { (p3: T3, p6: T6): T7 }; + + partial( + fn: { (p1: T1, p2: T2, p3: T3, p4: T4, p5: T5, p6: T6):T7 }, + stub1: UnderscoreStatic, + p2: T2, + stub3: UnderscoreStatic, + p4: T4, + p5: T5 + ): { (p1: T1, p3: T3, p6: T6): T7 }; + + partial( + fn: { (p1: T1, p2: T2, p3: T3, p4: T4, p5: T5, p6: T6):T7 }, + p1: T1, + stub2: UnderscoreStatic, + stub3: UnderscoreStatic, + p4: T4, + p5: T5 + ): { (p2: T2, p3: T3, p6: T6): T7 }; + + partial( + fn: { (p1: T1, p2: T2, p3: T3, p4: T4, p5: T5, p6: T6):T7 }, + stub1: UnderscoreStatic, + stub2: UnderscoreStatic, + stub3: UnderscoreStatic, + p4: T4, + p5: T5 + ): { (p1: T1, p2: T2, p3: T3, p6: T6): T7 }; + + partial( + fn: { (p1: T1, p2: T2, p3: T3, p4: T4, p5: T5, p6: T6):T7 }, + p1: T1, + p2: T2, + p3: T3, + stub4: UnderscoreStatic, + p5: T5 + ): { (p4: T4, p6: T6): T7 }; + + partial( + fn: { (p1: T1, p2: T2, p3: T3, p4: T4, p5: T5, p6: T6):T7 }, + stub1: UnderscoreStatic, + p2: T2, + p3: T3, + stub4: UnderscoreStatic, + p5: T5 + ): { (p1: T1, p4: T4, p6: T6): T7 }; + + partial( + fn: { (p1: T1, p2: T2, p3: T3, p4: T4, p5: T5, p6: T6):T7 }, + p1: T1, + stub2: UnderscoreStatic, + p3: T3, + stub4: UnderscoreStatic, + p5: T5 + ): { (p2: T2, p4: T4, p6: T6): T7 }; + + partial( + fn: { (p1: T1, p2: T2, p3: T3, p4: T4, p5: T5, p6: T6):T7 }, + stub1: UnderscoreStatic, + stub2: UnderscoreStatic, + p3: T3, + stub4: UnderscoreStatic, + p5: T5 + ): { (p1: T1, p2: T2, p4: T4, p6: T6): T7 }; + + partial( + fn: { (p1: T1, p2: T2, p3: T3, p4: T4, p5: T5, p6: T6):T7 }, + p1: T1, + p2: T2, + stub3: UnderscoreStatic, + stub4: UnderscoreStatic, + p5: T5 + ): { (p3: T3, p4: T4, p6: T6): T7 }; + + partial( + fn: { (p1: T1, p2: T2, p3: T3, p4: T4, p5: T5, p6: T6):T7 }, + stub1: UnderscoreStatic, + p2: T2, + stub3: UnderscoreStatic, + stub4: UnderscoreStatic, + p5: T5 + ): { (p1: T1, p3: T3, p4: T4, p6: T6): T7 }; + + partial( + fn: { (p1: T1, p2: T2, p3: T3, p4: T4, p5: T5, p6: T6):T7 }, + p1: T1, + stub2: UnderscoreStatic, + stub3: UnderscoreStatic, + stub4: UnderscoreStatic, + p5: T5 + ): { (p2: T2, p3: T3, p4: T4, p6: T6): T7 }; + + partial( + fn: { (p1: T1, p2: T2, p3: T3, p4: T4, p5: T5, p6: T6):T7 }, + stub1: UnderscoreStatic, + stub2: UnderscoreStatic, + stub3: UnderscoreStatic, + stub4: UnderscoreStatic, + p5: T5 + ): { (p1: T1, p2: T2, p3: T3, p4: T4, p6: T6): T7 }; + + partial( + fn: { (p1: T1, p2: T2, p3: T3, p4: T4, p5: T5, p6: T6):T7 }, + p1: T1, + p2: T2, + p3: T3, + p4: T4, + p5: T5, + p6: T6 + ): { (): T7 }; + + partial( + fn: { (p1: T1, p2: T2, p3: T3, p4: T4, p5: T5, p6: T6):T7 }, + stub1: UnderscoreStatic, + p2: T2, + p3: T3, + p4: T4, + p5: T5, + p6: T6 + ): { (p1: T1): T7 }; + + partial( + fn: { (p1: T1, p2: T2, p3: T3, p4: T4, p5: T5, p6: T6):T7 }, + p1: T1, + stub2: UnderscoreStatic, + p3: T3, + p4: T4, + p5: T5, + p6: T6 + ): { (p2: T2): T7 }; + + partial( + fn: { (p1: T1, p2: T2, p3: T3, p4: T4, p5: T5, p6: T6):T7 }, + stub1: UnderscoreStatic, + stub2: UnderscoreStatic, + p3: T3, + p4: T4, + p5: T5, + p6: T6 + ): { (p1: T1, p2: T2): T7 }; + + partial( + fn: { (p1: T1, p2: T2, p3: T3, p4: T4, p5: T5, p6: T6):T7 }, + p1: T1, + p2: T2, + stub3: UnderscoreStatic, + p4: T4, + p5: T5, + p6: T6 + ): { (p3: T3): T7 }; + + partial( + fn: { (p1: T1, p2: T2, p3: T3, p4: T4, p5: T5, p6: T6):T7 }, + stub1: UnderscoreStatic, + p2: T2, + stub3: UnderscoreStatic, + p4: T4, + p5: T5, + p6: T6 + ): { (p1: T1, p3: T3): T7 }; + + partial( + fn: { (p1: T1, p2: T2, p3: T3, p4: T4, p5: T5, p6: T6):T7 }, + p1: T1, + stub2: UnderscoreStatic, + stub3: UnderscoreStatic, + p4: T4, + p5: T5, + p6: T6 + ): { (p2: T2, p3: T3): T7 }; + + partial( + fn: { (p1: T1, p2: T2, p3: T3, p4: T4, p5: T5, p6: T6):T7 }, + stub1: UnderscoreStatic, + stub2: UnderscoreStatic, + stub3: UnderscoreStatic, + p4: T4, + p5: T5, + p6: T6 + ): { (p1: T1, p2: T2, p3: T3): T7 }; + + partial( + fn: { (p1: T1, p2: T2, p3: T3, p4: T4, p5: T5, p6: T6):T7 }, + p1: T1, + p2: T2, + p3: T3, + stub4: UnderscoreStatic, + p5: T5, + p6: T6 + ): { (p4: T4): T7 }; + + partial( + fn: { (p1: T1, p2: T2, p3: T3, p4: T4, p5: T5, p6: T6):T7 }, + stub1: UnderscoreStatic, + p2: T2, + p3: T3, + stub4: UnderscoreStatic, + p5: T5, + p6: T6 + ): { (p1: T1, p4: T4): T7 }; + + partial( + fn: { (p1: T1, p2: T2, p3: T3, p4: T4, p5: T5, p6: T6):T7 }, + p1: T1, + stub2: UnderscoreStatic, + p3: T3, + stub4: UnderscoreStatic, + p5: T5, + p6: T6 + ): { (p2: T2, p4: T4): T7 }; + + partial( + fn: { (p1: T1, p2: T2, p3: T3, p4: T4, p5: T5, p6: T6):T7 }, + stub1: UnderscoreStatic, + stub2: UnderscoreStatic, + p3: T3, + stub4: UnderscoreStatic, + p5: T5, + p6: T6 + ): { (p1: T1, p2: T2, p4: T4): T7 }; + + partial( + fn: { (p1: T1, p2: T2, p3: T3, p4: T4, p5: T5, p6: T6):T7 }, + p1: T1, + p2: T2, + stub3: UnderscoreStatic, + stub4: UnderscoreStatic, + p5: T5, + p6: T6 + ): { (p3: T3, p4: T4): T7 }; + + partial( + fn: { (p1: T1, p2: T2, p3: T3, p4: T4, p5: T5, p6: T6):T7 }, + stub1: UnderscoreStatic, + p2: T2, + stub3: UnderscoreStatic, + stub4: UnderscoreStatic, + p5: T5, + p6: T6 + ): { (p1: T1, p3: T3, p4: T4): T7 }; + + partial( + fn: { (p1: T1, p2: T2, p3: T3, p4: T4, p5: T5, p6: T6):T7 }, + p1: T1, + stub2: UnderscoreStatic, + stub3: UnderscoreStatic, + stub4: UnderscoreStatic, + p5: T5, + p6: T6 + ): { (p2: T2, p3: T3, p4: T4): T7 }; + + partial( + fn: { (p1: T1, p2: T2, p3: T3, p4: T4, p5: T5, p6: T6):T7 }, + stub1: UnderscoreStatic, + stub2: UnderscoreStatic, + stub3: UnderscoreStatic, + stub4: UnderscoreStatic, + p5: T5, + p6: T6 + ): { (p1: T1, p2: T2, p3: T3, p4: T4): T7 }; + + partial( + fn: { (p1: T1, p2: T2, p3: T3, p4: T4, p5: T5, p6: T6):T7 }, + p1: T1, + p2: T2, + p3: T3, + p4: T4, + stub5: UnderscoreStatic, + p6: T6 + ): { (p5: T5): T7 }; + + partial( + fn: { (p1: T1, p2: T2, p3: T3, p4: T4, p5: T5, p6: T6):T7 }, + stub1: UnderscoreStatic, + p2: T2, + p3: T3, + p4: T4, + stub5: UnderscoreStatic, + p6: T6 + ): { (p1: T1, p5: T5): T7 }; + + partial( + fn: { (p1: T1, p2: T2, p3: T3, p4: T4, p5: T5, p6: T6):T7 }, + p1: T1, + stub2: UnderscoreStatic, + p3: T3, + p4: T4, + stub5: UnderscoreStatic, + p6: T6 + ): { (p2: T2, p5: T5): T7 }; + + partial( + fn: { (p1: T1, p2: T2, p3: T3, p4: T4, p5: T5, p6: T6):T7 }, + stub1: UnderscoreStatic, + stub2: UnderscoreStatic, + p3: T3, + p4: T4, + stub5: UnderscoreStatic, + p6: T6 + ): { (p1: T1, p2: T2, p5: T5): T7 }; + + partial( + fn: { (p1: T1, p2: T2, p3: T3, p4: T4, p5: T5, p6: T6):T7 }, + p1: T1, + p2: T2, + stub3: UnderscoreStatic, + p4: T4, + stub5: UnderscoreStatic, + p6: T6 + ): { (p3: T3, p5: T5): T7 }; + + partial( + fn: { (p1: T1, p2: T2, p3: T3, p4: T4, p5: T5, p6: T6):T7 }, + stub1: UnderscoreStatic, + p2: T2, + stub3: UnderscoreStatic, + p4: T4, + stub5: UnderscoreStatic, + p6: T6 + ): { (p1: T1, p3: T3, p5: T5): T7 }; + + partial( + fn: { (p1: T1, p2: T2, p3: T3, p4: T4, p5: T5, p6: T6):T7 }, + p1: T1, + stub2: UnderscoreStatic, + stub3: UnderscoreStatic, + p4: T4, + stub5: UnderscoreStatic, + p6: T6 + ): { (p2: T2, p3: T3, p5: T5): T7 }; + + partial( + fn: { (p1: T1, p2: T2, p3: T3, p4: T4, p5: T5, p6: T6):T7 }, + stub1: UnderscoreStatic, + stub2: UnderscoreStatic, + stub3: UnderscoreStatic, + p4: T4, + stub5: UnderscoreStatic, + p6: T6 + ): { (p1: T1, p2: T2, p3: T3, p5: T5): T7 }; + + partial( + fn: { (p1: T1, p2: T2, p3: T3, p4: T4, p5: T5, p6: T6):T7 }, + p1: T1, + p2: T2, + p3: T3, + stub4: UnderscoreStatic, + stub5: UnderscoreStatic, + p6: T6 + ): { (p4: T4, p5: T5): T7 }; + + partial( + fn: { (p1: T1, p2: T2, p3: T3, p4: T4, p5: T5, p6: T6):T7 }, + stub1: UnderscoreStatic, + p2: T2, + p3: T3, + stub4: UnderscoreStatic, + stub5: UnderscoreStatic, + p6: T6 + ): { (p1: T1, p4: T4, p5: T5): T7 }; + + partial( + fn: { (p1: T1, p2: T2, p3: T3, p4: T4, p5: T5, p6: T6):T7 }, + p1: T1, + stub2: UnderscoreStatic, + p3: T3, + stub4: UnderscoreStatic, + stub5: UnderscoreStatic, + p6: T6 + ): { (p2: T2, p4: T4, p5: T5): T7 }; + + partial( + fn: { (p1: T1, p2: T2, p3: T3, p4: T4, p5: T5, p6: T6):T7 }, + stub1: UnderscoreStatic, + stub2: UnderscoreStatic, + p3: T3, + stub4: UnderscoreStatic, + stub5: UnderscoreStatic, + p6: T6 + ): { (p1: T1, p2: T2, p4: T4, p5: T5): T7 }; + + partial( + fn: { (p1: T1, p2: T2, p3: T3, p4: T4, p5: T5, p6: T6):T7 }, + p1: T1, + p2: T2, + stub3: UnderscoreStatic, + stub4: UnderscoreStatic, + stub5: UnderscoreStatic, + p6: T6 + ): { (p3: T3, p4: T4, p5: T5): T7 }; + + partial( + fn: { (p1: T1, p2: T2, p3: T3, p4: T4, p5: T5, p6: T6):T7 }, + stub1: UnderscoreStatic, + p2: T2, + stub3: UnderscoreStatic, + stub4: UnderscoreStatic, + stub5: UnderscoreStatic, + p6: T6 + ): { (p1: T1, p3: T3, p4: T4, p5: T5): T7 }; + + partial( + fn: { (p1: T1, p2: T2, p3: T3, p4: T4, p5: T5, p6: T6):T7 }, + p1: T1, + stub2: UnderscoreStatic, + stub3: UnderscoreStatic, + stub4: UnderscoreStatic, + stub5: UnderscoreStatic, + p6: T6 + ): { (p2: T2, p3: T3, p4: T4, p5: T5): T7 }; + + partial( + fn: { (p1: T1, p2: T2, p3: T3, p4: T4, p5: T5, p6: T6):T7 }, + stub1: UnderscoreStatic, + stub2: UnderscoreStatic, + stub3: UnderscoreStatic, + stub4: UnderscoreStatic, + stub5: UnderscoreStatic, + p6: T6 + ): { (p1: T1, p2: T2, p3: T3, p4: T4, p5: T5): T7 }; + + partial( + fn: { (p1: T1, p2: T2, p3: T3, p4: T4, p5: T5, p6: T6, p7: T7):T8 }, + p1: T1 + ): { (p2: T2, p3: T3, p4: T4, p5: T5, p6: T6, p7: T7): T8 }; + + partial( + fn: { (p1: T1, p2: T2, p3: T3, p4: T4, p5: T5, p6: T6, p7: T7):T8 }, + p1: T1, + p2: T2 + ): { (p3: T3, p4: T4, p5: T5, p6: T6, p7: T7): T8 }; + + partial( + fn: { (p1: T1, p2: T2, p3: T3, p4: T4, p5: T5, p6: T6, p7: T7):T8 }, + stub1: UnderscoreStatic, + p2: T2 + ): { (p1: T1, p3: T3, p4: T4, p5: T5, p6: T6, p7: T7): T8 }; + + partial( + fn: { (p1: T1, p2: T2, p3: T3, p4: T4, p5: T5, p6: T6, p7: T7):T8 }, + p1: T1, + p2: T2, + p3: T3 + ): { (p4: T4, p5: T5, p6: T6, p7: T7): T8 }; + + partial( + fn: { (p1: T1, p2: T2, p3: T3, p4: T4, p5: T5, p6: T6, p7: T7):T8 }, + stub1: UnderscoreStatic, + p2: T2, + p3: T3 + ): { (p1: T1, p4: T4, p5: T5, p6: T6, p7: T7): T8 }; + + partial( + fn: { (p1: T1, p2: T2, p3: T3, p4: T4, p5: T5, p6: T6, p7: T7):T8 }, + p1: T1, + stub2: UnderscoreStatic, + p3: T3 + ): { (p2: T2, p4: T4, p5: T5, p6: T6, p7: T7): T8 }; + + partial( + fn: { (p1: T1, p2: T2, p3: T3, p4: T4, p5: T5, p6: T6, p7: T7):T8 }, + stub1: UnderscoreStatic, + stub2: UnderscoreStatic, + p3: T3 + ): { (p1: T1, p2: T2, p4: T4, p5: T5, p6: T6, p7: T7): T8 }; + + partial( + fn: { (p1: T1, p2: T2, p3: T3, p4: T4, p5: T5, p6: T6, p7: T7):T8 }, + p1: T1, + p2: T2, + p3: T3, + p4: T4 + ): { (p5: T5, p6: T6, p7: T7): T8 }; + + partial( + fn: { (p1: T1, p2: T2, p3: T3, p4: T4, p5: T5, p6: T6, p7: T7):T8 }, + stub1: UnderscoreStatic, + p2: T2, + p3: T3, + p4: T4 + ): { (p1: T1, p5: T5, p6: T6, p7: T7): T8 }; + + partial( + fn: { (p1: T1, p2: T2, p3: T3, p4: T4, p5: T5, p6: T6, p7: T7):T8 }, + p1: T1, + stub2: UnderscoreStatic, + p3: T3, + p4: T4 + ): { (p2: T2, p5: T5, p6: T6, p7: T7): T8 }; + + partial( + fn: { (p1: T1, p2: T2, p3: T3, p4: T4, p5: T5, p6: T6, p7: T7):T8 }, + stub1: UnderscoreStatic, + stub2: UnderscoreStatic, + p3: T3, + p4: T4 + ): { (p1: T1, p2: T2, p5: T5, p6: T6, p7: T7): T8 }; + + partial( + fn: { (p1: T1, p2: T2, p3: T3, p4: T4, p5: T5, p6: T6, p7: T7):T8 }, + p1: T1, + p2: T2, + stub3: UnderscoreStatic, + p4: T4 + ): { (p3: T3, p5: T5, p6: T6, p7: T7): T8 }; + + partial( + fn: { (p1: T1, p2: T2, p3: T3, p4: T4, p5: T5, p6: T6, p7: T7):T8 }, + stub1: UnderscoreStatic, + p2: T2, + stub3: UnderscoreStatic, + p4: T4 + ): { (p1: T1, p3: T3, p5: T5, p6: T6, p7: T7): T8 }; + + partial( + fn: { (p1: T1, p2: T2, p3: T3, p4: T4, p5: T5, p6: T6, p7: T7):T8 }, + p1: T1, + stub2: UnderscoreStatic, + stub3: UnderscoreStatic, + p4: T4 + ): { (p2: T2, p3: T3, p5: T5, p6: T6, p7: T7): T8 }; + + partial( + fn: { (p1: T1, p2: T2, p3: T3, p4: T4, p5: T5, p6: T6, p7: T7):T8 }, + stub1: UnderscoreStatic, + stub2: UnderscoreStatic, + stub3: UnderscoreStatic, + p4: T4 + ): { (p1: T1, p2: T2, p3: T3, p5: T5, p6: T6, p7: T7): T8 }; + + partial( + fn: { (p1: T1, p2: T2, p3: T3, p4: T4, p5: T5, p6: T6, p7: T7):T8 }, + p1: T1, + p2: T2, + p3: T3, + p4: T4, + p5: T5 + ): { (p6: T6, p7: T7): T8 }; + + partial( + fn: { (p1: T1, p2: T2, p3: T3, p4: T4, p5: T5, p6: T6, p7: T7):T8 }, + stub1: UnderscoreStatic, + p2: T2, + p3: T3, + p4: T4, + p5: T5 + ): { (p1: T1, p6: T6, p7: T7): T8 }; + + partial( + fn: { (p1: T1, p2: T2, p3: T3, p4: T4, p5: T5, p6: T6, p7: T7):T8 }, + p1: T1, + stub2: UnderscoreStatic, + p3: T3, + p4: T4, + p5: T5 + ): { (p2: T2, p6: T6, p7: T7): T8 }; + + partial( + fn: { (p1: T1, p2: T2, p3: T3, p4: T4, p5: T5, p6: T6, p7: T7):T8 }, + stub1: UnderscoreStatic, + stub2: UnderscoreStatic, + p3: T3, + p4: T4, + p5: T5 + ): { (p1: T1, p2: T2, p6: T6, p7: T7): T8 }; + + partial( + fn: { (p1: T1, p2: T2, p3: T3, p4: T4, p5: T5, p6: T6, p7: T7):T8 }, + p1: T1, + p2: T2, + stub3: UnderscoreStatic, + p4: T4, + p5: T5 + ): { (p3: T3, p6: T6, p7: T7): T8 }; + + partial( + fn: { (p1: T1, p2: T2, p3: T3, p4: T4, p5: T5, p6: T6, p7: T7):T8 }, + stub1: UnderscoreStatic, + p2: T2, + stub3: UnderscoreStatic, + p4: T4, + p5: T5 + ): { (p1: T1, p3: T3, p6: T6, p7: T7): T8 }; + + partial( + fn: { (p1: T1, p2: T2, p3: T3, p4: T4, p5: T5, p6: T6, p7: T7):T8 }, + p1: T1, + stub2: UnderscoreStatic, + stub3: UnderscoreStatic, + p4: T4, + p5: T5 + ): { (p2: T2, p3: T3, p6: T6, p7: T7): T8 }; + + partial( + fn: { (p1: T1, p2: T2, p3: T3, p4: T4, p5: T5, p6: T6, p7: T7):T8 }, + stub1: UnderscoreStatic, + stub2: UnderscoreStatic, + stub3: UnderscoreStatic, + p4: T4, + p5: T5 + ): { (p1: T1, p2: T2, p3: T3, p6: T6, p7: T7): T8 }; + + partial( + fn: { (p1: T1, p2: T2, p3: T3, p4: T4, p5: T5, p6: T6, p7: T7):T8 }, + p1: T1, + p2: T2, + p3: T3, + stub4: UnderscoreStatic, + p5: T5 + ): { (p4: T4, p6: T6, p7: T7): T8 }; + + partial( + fn: { (p1: T1, p2: T2, p3: T3, p4: T4, p5: T5, p6: T6, p7: T7):T8 }, + stub1: UnderscoreStatic, + p2: T2, + p3: T3, + stub4: UnderscoreStatic, + p5: T5 + ): { (p1: T1, p4: T4, p6: T6, p7: T7): T8 }; + + partial( + fn: { (p1: T1, p2: T2, p3: T3, p4: T4, p5: T5, p6: T6, p7: T7):T8 }, + p1: T1, + stub2: UnderscoreStatic, + p3: T3, + stub4: UnderscoreStatic, + p5: T5 + ): { (p2: T2, p4: T4, p6: T6, p7: T7): T8 }; + + partial( + fn: { (p1: T1, p2: T2, p3: T3, p4: T4, p5: T5, p6: T6, p7: T7):T8 }, + stub1: UnderscoreStatic, + stub2: UnderscoreStatic, + p3: T3, + stub4: UnderscoreStatic, + p5: T5 + ): { (p1: T1, p2: T2, p4: T4, p6: T6, p7: T7): T8 }; + + partial( + fn: { (p1: T1, p2: T2, p3: T3, p4: T4, p5: T5, p6: T6, p7: T7):T8 }, + p1: T1, + p2: T2, + stub3: UnderscoreStatic, + stub4: UnderscoreStatic, + p5: T5 + ): { (p3: T3, p4: T4, p6: T6, p7: T7): T8 }; + + partial( + fn: { (p1: T1, p2: T2, p3: T3, p4: T4, p5: T5, p6: T6, p7: T7):T8 }, + stub1: UnderscoreStatic, + p2: T2, + stub3: UnderscoreStatic, + stub4: UnderscoreStatic, + p5: T5 + ): { (p1: T1, p3: T3, p4: T4, p6: T6, p7: T7): T8 }; + + partial( + fn: { (p1: T1, p2: T2, p3: T3, p4: T4, p5: T5, p6: T6, p7: T7):T8 }, + p1: T1, + stub2: UnderscoreStatic, + stub3: UnderscoreStatic, + stub4: UnderscoreStatic, + p5: T5 + ): { (p2: T2, p3: T3, p4: T4, p6: T6, p7: T7): T8 }; + + partial( + fn: { (p1: T1, p2: T2, p3: T3, p4: T4, p5: T5, p6: T6, p7: T7):T8 }, + stub1: UnderscoreStatic, + stub2: UnderscoreStatic, + stub3: UnderscoreStatic, + stub4: UnderscoreStatic, + p5: T5 + ): { (p1: T1, p2: T2, p3: T3, p4: T4, p6: T6, p7: T7): T8 }; + + partial( + fn: { (p1: T1, p2: T2, p3: T3, p4: T4, p5: T5, p6: T6, p7: T7):T8 }, + p1: T1, + p2: T2, + p3: T3, + p4: T4, + p5: T5, + p6: T6 + ): { (p7: T7): T8 }; + + partial( + fn: { (p1: T1, p2: T2, p3: T3, p4: T4, p5: T5, p6: T6, p7: T7):T8 }, + stub1: UnderscoreStatic, + p2: T2, + p3: T3, + p4: T4, + p5: T5, + p6: T6 + ): { (p1: T1, p7: T7): T8 }; + + partial( + fn: { (p1: T1, p2: T2, p3: T3, p4: T4, p5: T5, p6: T6, p7: T7):T8 }, + p1: T1, + stub2: UnderscoreStatic, + p3: T3, + p4: T4, + p5: T5, + p6: T6 + ): { (p2: T2, p7: T7): T8 }; + + partial( + fn: { (p1: T1, p2: T2, p3: T3, p4: T4, p5: T5, p6: T6, p7: T7):T8 }, + stub1: UnderscoreStatic, + stub2: UnderscoreStatic, + p3: T3, + p4: T4, + p5: T5, + p6: T6 + ): { (p1: T1, p2: T2, p7: T7): T8 }; + + partial( + fn: { (p1: T1, p2: T2, p3: T3, p4: T4, p5: T5, p6: T6, p7: T7):T8 }, + p1: T1, + p2: T2, + stub3: UnderscoreStatic, + p4: T4, + p5: T5, + p6: T6 + ): { (p3: T3, p7: T7): T8 }; + + partial( + fn: { (p1: T1, p2: T2, p3: T3, p4: T4, p5: T5, p6: T6, p7: T7):T8 }, + stub1: UnderscoreStatic, + p2: T2, + stub3: UnderscoreStatic, + p4: T4, + p5: T5, + p6: T6 + ): { (p1: T1, p3: T3, p7: T7): T8 }; + + partial( + fn: { (p1: T1, p2: T2, p3: T3, p4: T4, p5: T5, p6: T6, p7: T7):T8 }, + p1: T1, + stub2: UnderscoreStatic, + stub3: UnderscoreStatic, + p4: T4, + p5: T5, + p6: T6 + ): { (p2: T2, p3: T3, p7: T7): T8 }; + + partial( + fn: { (p1: T1, p2: T2, p3: T3, p4: T4, p5: T5, p6: T6, p7: T7):T8 }, + stub1: UnderscoreStatic, + stub2: UnderscoreStatic, + stub3: UnderscoreStatic, + p4: T4, + p5: T5, + p6: T6 + ): { (p1: T1, p2: T2, p3: T3, p7: T7): T8 }; + + partial( + fn: { (p1: T1, p2: T2, p3: T3, p4: T4, p5: T5, p6: T6, p7: T7):T8 }, + p1: T1, + p2: T2, + p3: T3, + stub4: UnderscoreStatic, + p5: T5, + p6: T6 + ): { (p4: T4, p7: T7): T8 }; + + partial( + fn: { (p1: T1, p2: T2, p3: T3, p4: T4, p5: T5, p6: T6, p7: T7):T8 }, + stub1: UnderscoreStatic, + p2: T2, + p3: T3, + stub4: UnderscoreStatic, + p5: T5, + p6: T6 + ): { (p1: T1, p4: T4, p7: T7): T8 }; + + partial( + fn: { (p1: T1, p2: T2, p3: T3, p4: T4, p5: T5, p6: T6, p7: T7):T8 }, + p1: T1, + stub2: UnderscoreStatic, + p3: T3, + stub4: UnderscoreStatic, + p5: T5, + p6: T6 + ): { (p2: T2, p4: T4, p7: T7): T8 }; + + partial( + fn: { (p1: T1, p2: T2, p3: T3, p4: T4, p5: T5, p6: T6, p7: T7):T8 }, + stub1: UnderscoreStatic, + stub2: UnderscoreStatic, + p3: T3, + stub4: UnderscoreStatic, + p5: T5, + p6: T6 + ): { (p1: T1, p2: T2, p4: T4, p7: T7): T8 }; + + partial( + fn: { (p1: T1, p2: T2, p3: T3, p4: T4, p5: T5, p6: T6, p7: T7):T8 }, + p1: T1, + p2: T2, + stub3: UnderscoreStatic, + stub4: UnderscoreStatic, + p5: T5, + p6: T6 + ): { (p3: T3, p4: T4, p7: T7): T8 }; + + partial( + fn: { (p1: T1, p2: T2, p3: T3, p4: T4, p5: T5, p6: T6, p7: T7):T8 }, + stub1: UnderscoreStatic, + p2: T2, + stub3: UnderscoreStatic, + stub4: UnderscoreStatic, + p5: T5, + p6: T6 + ): { (p1: T1, p3: T3, p4: T4, p7: T7): T8 }; + + partial( + fn: { (p1: T1, p2: T2, p3: T3, p4: T4, p5: T5, p6: T6, p7: T7):T8 }, + p1: T1, + stub2: UnderscoreStatic, + stub3: UnderscoreStatic, + stub4: UnderscoreStatic, + p5: T5, + p6: T6 + ): { (p2: T2, p3: T3, p4: T4, p7: T7): T8 }; + + partial( + fn: { (p1: T1, p2: T2, p3: T3, p4: T4, p5: T5, p6: T6, p7: T7):T8 }, + stub1: UnderscoreStatic, + stub2: UnderscoreStatic, + stub3: UnderscoreStatic, + stub4: UnderscoreStatic, + p5: T5, + p6: T6 + ): { (p1: T1, p2: T2, p3: T3, p4: T4, p7: T7): T8 }; + + partial( + fn: { (p1: T1, p2: T2, p3: T3, p4: T4, p5: T5, p6: T6, p7: T7):T8 }, + p1: T1, + p2: T2, + p3: T3, + p4: T4, + stub5: UnderscoreStatic, + p6: T6 + ): { (p5: T5, p7: T7): T8 }; + + partial( + fn: { (p1: T1, p2: T2, p3: T3, p4: T4, p5: T5, p6: T6, p7: T7):T8 }, + stub1: UnderscoreStatic, + p2: T2, + p3: T3, + p4: T4, + stub5: UnderscoreStatic, + p6: T6 + ): { (p1: T1, p5: T5, p7: T7): T8 }; + + partial( + fn: { (p1: T1, p2: T2, p3: T3, p4: T4, p5: T5, p6: T6, p7: T7):T8 }, + p1: T1, + stub2: UnderscoreStatic, + p3: T3, + p4: T4, + stub5: UnderscoreStatic, + p6: T6 + ): { (p2: T2, p5: T5, p7: T7): T8 }; + + partial( + fn: { (p1: T1, p2: T2, p3: T3, p4: T4, p5: T5, p6: T6, p7: T7):T8 }, + stub1: UnderscoreStatic, + stub2: UnderscoreStatic, + p3: T3, + p4: T4, + stub5: UnderscoreStatic, + p6: T6 + ): { (p1: T1, p2: T2, p5: T5, p7: T7): T8 }; + + partial( + fn: { (p1: T1, p2: T2, p3: T3, p4: T4, p5: T5, p6: T6, p7: T7):T8 }, + p1: T1, + p2: T2, + stub3: UnderscoreStatic, + p4: T4, + stub5: UnderscoreStatic, + p6: T6 + ): { (p3: T3, p5: T5, p7: T7): T8 }; + + partial( + fn: { (p1: T1, p2: T2, p3: T3, p4: T4, p5: T5, p6: T6, p7: T7):T8 }, + stub1: UnderscoreStatic, + p2: T2, + stub3: UnderscoreStatic, + p4: T4, + stub5: UnderscoreStatic, + p6: T6 + ): { (p1: T1, p3: T3, p5: T5, p7: T7): T8 }; + + partial( + fn: { (p1: T1, p2: T2, p3: T3, p4: T4, p5: T5, p6: T6, p7: T7):T8 }, + p1: T1, + stub2: UnderscoreStatic, + stub3: UnderscoreStatic, + p4: T4, + stub5: UnderscoreStatic, + p6: T6 + ): { (p2: T2, p3: T3, p5: T5, p7: T7): T8 }; + + partial( + fn: { (p1: T1, p2: T2, p3: T3, p4: T4, p5: T5, p6: T6, p7: T7):T8 }, + stub1: UnderscoreStatic, + stub2: UnderscoreStatic, + stub3: UnderscoreStatic, + p4: T4, + stub5: UnderscoreStatic, + p6: T6 + ): { (p1: T1, p2: T2, p3: T3, p5: T5, p7: T7): T8 }; + + partial( + fn: { (p1: T1, p2: T2, p3: T3, p4: T4, p5: T5, p6: T6, p7: T7):T8 }, + p1: T1, + p2: T2, + p3: T3, + stub4: UnderscoreStatic, + stub5: UnderscoreStatic, + p6: T6 + ): { (p4: T4, p5: T5, p7: T7): T8 }; + + partial( + fn: { (p1: T1, p2: T2, p3: T3, p4: T4, p5: T5, p6: T6, p7: T7):T8 }, + stub1: UnderscoreStatic, + p2: T2, + p3: T3, + stub4: UnderscoreStatic, + stub5: UnderscoreStatic, + p6: T6 + ): { (p1: T1, p4: T4, p5: T5, p7: T7): T8 }; + + partial( + fn: { (p1: T1, p2: T2, p3: T3, p4: T4, p5: T5, p6: T6, p7: T7):T8 }, + p1: T1, + stub2: UnderscoreStatic, + p3: T3, + stub4: UnderscoreStatic, + stub5: UnderscoreStatic, + p6: T6 + ): { (p2: T2, p4: T4, p5: T5, p7: T7): T8 }; + + partial( + fn: { (p1: T1, p2: T2, p3: T3, p4: T4, p5: T5, p6: T6, p7: T7):T8 }, + stub1: UnderscoreStatic, + stub2: UnderscoreStatic, + p3: T3, + stub4: UnderscoreStatic, + stub5: UnderscoreStatic, + p6: T6 + ): { (p1: T1, p2: T2, p4: T4, p5: T5, p7: T7): T8 }; + + partial( + fn: { (p1: T1, p2: T2, p3: T3, p4: T4, p5: T5, p6: T6, p7: T7):T8 }, + p1: T1, + p2: T2, + stub3: UnderscoreStatic, + stub4: UnderscoreStatic, + stub5: UnderscoreStatic, + p6: T6 + ): { (p3: T3, p4: T4, p5: T5, p7: T7): T8 }; + + partial( + fn: { (p1: T1, p2: T2, p3: T3, p4: T4, p5: T5, p6: T6, p7: T7):T8 }, + stub1: UnderscoreStatic, + p2: T2, + stub3: UnderscoreStatic, + stub4: UnderscoreStatic, + stub5: UnderscoreStatic, + p6: T6 + ): { (p1: T1, p3: T3, p4: T4, p5: T5, p7: T7): T8 }; + + partial( + fn: { (p1: T1, p2: T2, p3: T3, p4: T4, p5: T5, p6: T6, p7: T7):T8 }, + p1: T1, + stub2: UnderscoreStatic, + stub3: UnderscoreStatic, + stub4: UnderscoreStatic, + stub5: UnderscoreStatic, + p6: T6 + ): { (p2: T2, p3: T3, p4: T4, p5: T5, p7: T7): T8 }; + + partial( + fn: { (p1: T1, p2: T2, p3: T3, p4: T4, p5: T5, p6: T6, p7: T7):T8 }, + stub1: UnderscoreStatic, + stub2: UnderscoreStatic, + stub3: UnderscoreStatic, + stub4: UnderscoreStatic, + stub5: UnderscoreStatic, + p6: T6 + ): { (p1: T1, p2: T2, p3: T3, p4: T4, p5: T5, p7: T7): T8 }; + + partial( + fn: { (p1: T1, p2: T2, p3: T3, p4: T4, p5: T5, p6: T6, p7: T7):T8 }, + p1: T1, + p2: T2, + p3: T3, + p4: T4, + p5: T5, + p6: T6, + p7: T7 + ): { (): T8 }; + + partial( + fn: { (p1: T1, p2: T2, p3: T3, p4: T4, p5: T5, p6: T6, p7: T7):T8 }, + stub1: UnderscoreStatic, + p2: T2, + p3: T3, + p4: T4, + p5: T5, + p6: T6, + p7: T7 + ): { (p1: T1): T8 }; + + partial( + fn: { (p1: T1, p2: T2, p3: T3, p4: T4, p5: T5, p6: T6, p7: T7):T8 }, + p1: T1, + stub2: UnderscoreStatic, + p3: T3, + p4: T4, + p5: T5, + p6: T6, + p7: T7 + ): { (p2: T2): T8 }; + + partial( + fn: { (p1: T1, p2: T2, p3: T3, p4: T4, p5: T5, p6: T6, p7: T7):T8 }, + stub1: UnderscoreStatic, + stub2: UnderscoreStatic, + p3: T3, + p4: T4, + p5: T5, + p6: T6, + p7: T7 + ): { (p1: T1, p2: T2): T8 }; + + partial( + fn: { (p1: T1, p2: T2, p3: T3, p4: T4, p5: T5, p6: T6, p7: T7):T8 }, + p1: T1, + p2: T2, + stub3: UnderscoreStatic, + p4: T4, + p5: T5, + p6: T6, + p7: T7 + ): { (p3: T3): T8 }; + + partial( + fn: { (p1: T1, p2: T2, p3: T3, p4: T4, p5: T5, p6: T6, p7: T7):T8 }, + stub1: UnderscoreStatic, + p2: T2, + stub3: UnderscoreStatic, + p4: T4, + p5: T5, + p6: T6, + p7: T7 + ): { (p1: T1, p3: T3): T8 }; + + partial( + fn: { (p1: T1, p2: T2, p3: T3, p4: T4, p5: T5, p6: T6, p7: T7):T8 }, + p1: T1, + stub2: UnderscoreStatic, + stub3: UnderscoreStatic, + p4: T4, + p5: T5, + p6: T6, + p7: T7 + ): { (p2: T2, p3: T3): T8 }; + + partial( + fn: { (p1: T1, p2: T2, p3: T3, p4: T4, p5: T5, p6: T6, p7: T7):T8 }, + stub1: UnderscoreStatic, + stub2: UnderscoreStatic, + stub3: UnderscoreStatic, + p4: T4, + p5: T5, + p6: T6, + p7: T7 + ): { (p1: T1, p2: T2, p3: T3): T8 }; + + partial( + fn: { (p1: T1, p2: T2, p3: T3, p4: T4, p5: T5, p6: T6, p7: T7):T8 }, + p1: T1, + p2: T2, + p3: T3, + stub4: UnderscoreStatic, + p5: T5, + p6: T6, + p7: T7 + ): { (p4: T4): T8 }; + + partial( + fn: { (p1: T1, p2: T2, p3: T3, p4: T4, p5: T5, p6: T6, p7: T7):T8 }, + stub1: UnderscoreStatic, + p2: T2, + p3: T3, + stub4: UnderscoreStatic, + p5: T5, + p6: T6, + p7: T7 + ): { (p1: T1, p4: T4): T8 }; + + partial( + fn: { (p1: T1, p2: T2, p3: T3, p4: T4, p5: T5, p6: T6, p7: T7):T8 }, + p1: T1, + stub2: UnderscoreStatic, + p3: T3, + stub4: UnderscoreStatic, + p5: T5, + p6: T6, + p7: T7 + ): { (p2: T2, p4: T4): T8 }; + + partial( + fn: { (p1: T1, p2: T2, p3: T3, p4: T4, p5: T5, p6: T6, p7: T7):T8 }, + stub1: UnderscoreStatic, + stub2: UnderscoreStatic, + p3: T3, + stub4: UnderscoreStatic, + p5: T5, + p6: T6, + p7: T7 + ): { (p1: T1, p2: T2, p4: T4): T8 }; + + partial( + fn: { (p1: T1, p2: T2, p3: T3, p4: T4, p5: T5, p6: T6, p7: T7):T8 }, + p1: T1, + p2: T2, + stub3: UnderscoreStatic, + stub4: UnderscoreStatic, + p5: T5, + p6: T6, + p7: T7 + ): { (p3: T3, p4: T4): T8 }; + + partial( + fn: { (p1: T1, p2: T2, p3: T3, p4: T4, p5: T5, p6: T6, p7: T7):T8 }, + stub1: UnderscoreStatic, + p2: T2, + stub3: UnderscoreStatic, + stub4: UnderscoreStatic, + p5: T5, + p6: T6, + p7: T7 + ): { (p1: T1, p3: T3, p4: T4): T8 }; + + partial( + fn: { (p1: T1, p2: T2, p3: T3, p4: T4, p5: T5, p6: T6, p7: T7):T8 }, + p1: T1, + stub2: UnderscoreStatic, + stub3: UnderscoreStatic, + stub4: UnderscoreStatic, + p5: T5, + p6: T6, + p7: T7 + ): { (p2: T2, p3: T3, p4: T4): T8 }; + + partial( + fn: { (p1: T1, p2: T2, p3: T3, p4: T4, p5: T5, p6: T6, p7: T7):T8 }, + stub1: UnderscoreStatic, + stub2: UnderscoreStatic, + stub3: UnderscoreStatic, + stub4: UnderscoreStatic, + p5: T5, + p6: T6, + p7: T7 + ): { (p1: T1, p2: T2, p3: T3, p4: T4): T8 }; + + partial( + fn: { (p1: T1, p2: T2, p3: T3, p4: T4, p5: T5, p6: T6, p7: T7):T8 }, + p1: T1, + p2: T2, + p3: T3, + p4: T4, + stub5: UnderscoreStatic, + p6: T6, + p7: T7 + ): { (p5: T5): T8 }; + + partial( + fn: { (p1: T1, p2: T2, p3: T3, p4: T4, p5: T5, p6: T6, p7: T7):T8 }, + stub1: UnderscoreStatic, + p2: T2, + p3: T3, + p4: T4, + stub5: UnderscoreStatic, + p6: T6, + p7: T7 + ): { (p1: T1, p5: T5): T8 }; + + partial( + fn: { (p1: T1, p2: T2, p3: T3, p4: T4, p5: T5, p6: T6, p7: T7):T8 }, + p1: T1, + stub2: UnderscoreStatic, + p3: T3, + p4: T4, + stub5: UnderscoreStatic, + p6: T6, + p7: T7 + ): { (p2: T2, p5: T5): T8 }; + + partial( + fn: { (p1: T1, p2: T2, p3: T3, p4: T4, p5: T5, p6: T6, p7: T7):T8 }, + stub1: UnderscoreStatic, + stub2: UnderscoreStatic, + p3: T3, + p4: T4, + stub5: UnderscoreStatic, + p6: T6, + p7: T7 + ): { (p1: T1, p2: T2, p5: T5): T8 }; + + partial( + fn: { (p1: T1, p2: T2, p3: T3, p4: T4, p5: T5, p6: T6, p7: T7):T8 }, + p1: T1, + p2: T2, + stub3: UnderscoreStatic, + p4: T4, + stub5: UnderscoreStatic, + p6: T6, + p7: T7 + ): { (p3: T3, p5: T5): T8 }; + + partial( + fn: { (p1: T1, p2: T2, p3: T3, p4: T4, p5: T5, p6: T6, p7: T7):T8 }, + stub1: UnderscoreStatic, + p2: T2, + stub3: UnderscoreStatic, + p4: T4, + stub5: UnderscoreStatic, + p6: T6, + p7: T7 + ): { (p1: T1, p3: T3, p5: T5): T8 }; + + partial( + fn: { (p1: T1, p2: T2, p3: T3, p4: T4, p5: T5, p6: T6, p7: T7):T8 }, + p1: T1, + stub2: UnderscoreStatic, + stub3: UnderscoreStatic, + p4: T4, + stub5: UnderscoreStatic, + p6: T6, + p7: T7 + ): { (p2: T2, p3: T3, p5: T5): T8 }; + + partial( + fn: { (p1: T1, p2: T2, p3: T3, p4: T4, p5: T5, p6: T6, p7: T7):T8 }, + stub1: UnderscoreStatic, + stub2: UnderscoreStatic, + stub3: UnderscoreStatic, + p4: T4, + stub5: UnderscoreStatic, + p6: T6, + p7: T7 + ): { (p1: T1, p2: T2, p3: T3, p5: T5): T8 }; + + partial( + fn: { (p1: T1, p2: T2, p3: T3, p4: T4, p5: T5, p6: T6, p7: T7):T8 }, + p1: T1, + p2: T2, + p3: T3, + stub4: UnderscoreStatic, + stub5: UnderscoreStatic, + p6: T6, + p7: T7 + ): { (p4: T4, p5: T5): T8 }; + + partial( + fn: { (p1: T1, p2: T2, p3: T3, p4: T4, p5: T5, p6: T6, p7: T7):T8 }, + stub1: UnderscoreStatic, + p2: T2, + p3: T3, + stub4: UnderscoreStatic, + stub5: UnderscoreStatic, + p6: T6, + p7: T7 + ): { (p1: T1, p4: T4, p5: T5): T8 }; + + partial( + fn: { (p1: T1, p2: T2, p3: T3, p4: T4, p5: T5, p6: T6, p7: T7):T8 }, + p1: T1, + stub2: UnderscoreStatic, + p3: T3, + stub4: UnderscoreStatic, + stub5: UnderscoreStatic, + p6: T6, + p7: T7 + ): { (p2: T2, p4: T4, p5: T5): T8 }; + + partial( + fn: { (p1: T1, p2: T2, p3: T3, p4: T4, p5: T5, p6: T6, p7: T7):T8 }, + stub1: UnderscoreStatic, + stub2: UnderscoreStatic, + p3: T3, + stub4: UnderscoreStatic, + stub5: UnderscoreStatic, + p6: T6, + p7: T7 + ): { (p1: T1, p2: T2, p4: T4, p5: T5): T8 }; + + partial( + fn: { (p1: T1, p2: T2, p3: T3, p4: T4, p5: T5, p6: T6, p7: T7):T8 }, + p1: T1, + p2: T2, + stub3: UnderscoreStatic, + stub4: UnderscoreStatic, + stub5: UnderscoreStatic, + p6: T6, + p7: T7 + ): { (p3: T3, p4: T4, p5: T5): T8 }; + + partial( + fn: { (p1: T1, p2: T2, p3: T3, p4: T4, p5: T5, p6: T6, p7: T7):T8 }, + stub1: UnderscoreStatic, + p2: T2, + stub3: UnderscoreStatic, + stub4: UnderscoreStatic, + stub5: UnderscoreStatic, + p6: T6, + p7: T7 + ): { (p1: T1, p3: T3, p4: T4, p5: T5): T8 }; + + partial( + fn: { (p1: T1, p2: T2, p3: T3, p4: T4, p5: T5, p6: T6, p7: T7):T8 }, + p1: T1, + stub2: UnderscoreStatic, + stub3: UnderscoreStatic, + stub4: UnderscoreStatic, + stub5: UnderscoreStatic, + p6: T6, + p7: T7 + ): { (p2: T2, p3: T3, p4: T4, p5: T5): T8 }; + + partial( + fn: { (p1: T1, p2: T2, p3: T3, p4: T4, p5: T5, p6: T6, p7: T7):T8 }, + stub1: UnderscoreStatic, + stub2: UnderscoreStatic, + stub3: UnderscoreStatic, + stub4: UnderscoreStatic, + stub5: UnderscoreStatic, + p6: T6, + p7: T7 + ): { (p1: T1, p2: T2, p3: T3, p4: T4, p5: T5): T8 }; + + partial( + fn: { (p1: T1, p2: T2, p3: T3, p4: T4, p5: T5, p6: T6, p7: T7):T8 }, + p1: T1, + p2: T2, + p3: T3, + p4: T4, + p5: T5, + stub6: UnderscoreStatic, + p7: T7 + ): { (p6: T6): T8 }; + + partial( + fn: { (p1: T1, p2: T2, p3: T3, p4: T4, p5: T5, p6: T6, p7: T7):T8 }, + stub1: UnderscoreStatic, + p2: T2, + p3: T3, + p4: T4, + p5: T5, + stub6: UnderscoreStatic, + p7: T7 + ): { (p1: T1, p6: T6): T8 }; + + partial( + fn: { (p1: T1, p2: T2, p3: T3, p4: T4, p5: T5, p6: T6, p7: T7):T8 }, + p1: T1, + stub2: UnderscoreStatic, + p3: T3, + p4: T4, + p5: T5, + stub6: UnderscoreStatic, + p7: T7 + ): { (p2: T2, p6: T6): T8 }; + + partial( + fn: { (p1: T1, p2: T2, p3: T3, p4: T4, p5: T5, p6: T6, p7: T7):T8 }, + stub1: UnderscoreStatic, + stub2: UnderscoreStatic, + p3: T3, + p4: T4, + p5: T5, + stub6: UnderscoreStatic, + p7: T7 + ): { (p1: T1, p2: T2, p6: T6): T8 }; + + partial( + fn: { (p1: T1, p2: T2, p3: T3, p4: T4, p5: T5, p6: T6, p7: T7):T8 }, + p1: T1, + p2: T2, + stub3: UnderscoreStatic, + p4: T4, + p5: T5, + stub6: UnderscoreStatic, + p7: T7 + ): { (p3: T3, p6: T6): T8 }; + + partial( + fn: { (p1: T1, p2: T2, p3: T3, p4: T4, p5: T5, p6: T6, p7: T7):T8 }, + stub1: UnderscoreStatic, + p2: T2, + stub3: UnderscoreStatic, + p4: T4, + p5: T5, + stub6: UnderscoreStatic, + p7: T7 + ): { (p1: T1, p3: T3, p6: T6): T8 }; + + partial( + fn: { (p1: T1, p2: T2, p3: T3, p4: T4, p5: T5, p6: T6, p7: T7):T8 }, + p1: T1, + stub2: UnderscoreStatic, + stub3: UnderscoreStatic, + p4: T4, + p5: T5, + stub6: UnderscoreStatic, + p7: T7 + ): { (p2: T2, p3: T3, p6: T6): T8 }; + + partial( + fn: { (p1: T1, p2: T2, p3: T3, p4: T4, p5: T5, p6: T6, p7: T7):T8 }, + stub1: UnderscoreStatic, + stub2: UnderscoreStatic, + stub3: UnderscoreStatic, + p4: T4, + p5: T5, + stub6: UnderscoreStatic, + p7: T7 + ): { (p1: T1, p2: T2, p3: T3, p6: T6): T8 }; + + partial( + fn: { (p1: T1, p2: T2, p3: T3, p4: T4, p5: T5, p6: T6, p7: T7):T8 }, + p1: T1, + p2: T2, + p3: T3, + stub4: UnderscoreStatic, + p5: T5, + stub6: UnderscoreStatic, + p7: T7 + ): { (p4: T4, p6: T6): T8 }; + + partial( + fn: { (p1: T1, p2: T2, p3: T3, p4: T4, p5: T5, p6: T6, p7: T7):T8 }, + stub1: UnderscoreStatic, + p2: T2, + p3: T3, + stub4: UnderscoreStatic, + p5: T5, + stub6: UnderscoreStatic, + p7: T7 + ): { (p1: T1, p4: T4, p6: T6): T8 }; + + partial( + fn: { (p1: T1, p2: T2, p3: T3, p4: T4, p5: T5, p6: T6, p7: T7):T8 }, + p1: T1, + stub2: UnderscoreStatic, + p3: T3, + stub4: UnderscoreStatic, + p5: T5, + stub6: UnderscoreStatic, + p7: T7 + ): { (p2: T2, p4: T4, p6: T6): T8 }; + + partial( + fn: { (p1: T1, p2: T2, p3: T3, p4: T4, p5: T5, p6: T6, p7: T7):T8 }, + stub1: UnderscoreStatic, + stub2: UnderscoreStatic, + p3: T3, + stub4: UnderscoreStatic, + p5: T5, + stub6: UnderscoreStatic, + p7: T7 + ): { (p1: T1, p2: T2, p4: T4, p6: T6): T8 }; + + partial( + fn: { (p1: T1, p2: T2, p3: T3, p4: T4, p5: T5, p6: T6, p7: T7):T8 }, + p1: T1, + p2: T2, + stub3: UnderscoreStatic, + stub4: UnderscoreStatic, + p5: T5, + stub6: UnderscoreStatic, + p7: T7 + ): { (p3: T3, p4: T4, p6: T6): T8 }; + + partial( + fn: { (p1: T1, p2: T2, p3: T3, p4: T4, p5: T5, p6: T6, p7: T7):T8 }, + stub1: UnderscoreStatic, + p2: T2, + stub3: UnderscoreStatic, + stub4: UnderscoreStatic, + p5: T5, + stub6: UnderscoreStatic, + p7: T7 + ): { (p1: T1, p3: T3, p4: T4, p6: T6): T8 }; + + partial( + fn: { (p1: T1, p2: T2, p3: T3, p4: T4, p5: T5, p6: T6, p7: T7):T8 }, + p1: T1, + stub2: UnderscoreStatic, + stub3: UnderscoreStatic, + stub4: UnderscoreStatic, + p5: T5, + stub6: UnderscoreStatic, + p7: T7 + ): { (p2: T2, p3: T3, p4: T4, p6: T6): T8 }; + + partial( + fn: { (p1: T1, p2: T2, p3: T3, p4: T4, p5: T5, p6: T6, p7: T7):T8 }, + stub1: UnderscoreStatic, + stub2: UnderscoreStatic, + stub3: UnderscoreStatic, + stub4: UnderscoreStatic, + p5: T5, + stub6: UnderscoreStatic, + p7: T7 + ): { (p1: T1, p2: T2, p3: T3, p4: T4, p6: T6): T8 }; + + partial( + fn: { (p1: T1, p2: T2, p3: T3, p4: T4, p5: T5, p6: T6, p7: T7):T8 }, + p1: T1, + p2: T2, + p3: T3, + p4: T4, + stub5: UnderscoreStatic, + stub6: UnderscoreStatic, + p7: T7 + ): { (p5: T5, p6: T6): T8 }; + + partial( + fn: { (p1: T1, p2: T2, p3: T3, p4: T4, p5: T5, p6: T6, p7: T7):T8 }, + stub1: UnderscoreStatic, + p2: T2, + p3: T3, + p4: T4, + stub5: UnderscoreStatic, + stub6: UnderscoreStatic, + p7: T7 + ): { (p1: T1, p5: T5, p6: T6): T8 }; + + partial( + fn: { (p1: T1, p2: T2, p3: T3, p4: T4, p5: T5, p6: T6, p7: T7):T8 }, + p1: T1, + stub2: UnderscoreStatic, + p3: T3, + p4: T4, + stub5: UnderscoreStatic, + stub6: UnderscoreStatic, + p7: T7 + ): { (p2: T2, p5: T5, p6: T6): T8 }; + + partial( + fn: { (p1: T1, p2: T2, p3: T3, p4: T4, p5: T5, p6: T6, p7: T7):T8 }, + stub1: UnderscoreStatic, + stub2: UnderscoreStatic, + p3: T3, + p4: T4, + stub5: UnderscoreStatic, + stub6: UnderscoreStatic, + p7: T7 + ): { (p1: T1, p2: T2, p5: T5, p6: T6): T8 }; + + partial( + fn: { (p1: T1, p2: T2, p3: T3, p4: T4, p5: T5, p6: T6, p7: T7):T8 }, + p1: T1, + p2: T2, + stub3: UnderscoreStatic, + p4: T4, + stub5: UnderscoreStatic, + stub6: UnderscoreStatic, + p7: T7 + ): { (p3: T3, p5: T5, p6: T6): T8 }; + + partial( + fn: { (p1: T1, p2: T2, p3: T3, p4: T4, p5: T5, p6: T6, p7: T7):T8 }, + stub1: UnderscoreStatic, + p2: T2, + stub3: UnderscoreStatic, + p4: T4, + stub5: UnderscoreStatic, + stub6: UnderscoreStatic, + p7: T7 + ): { (p1: T1, p3: T3, p5: T5, p6: T6): T8 }; + + partial( + fn: { (p1: T1, p2: T2, p3: T3, p4: T4, p5: T5, p6: T6, p7: T7):T8 }, + p1: T1, + stub2: UnderscoreStatic, + stub3: UnderscoreStatic, + p4: T4, + stub5: UnderscoreStatic, + stub6: UnderscoreStatic, + p7: T7 + ): { (p2: T2, p3: T3, p5: T5, p6: T6): T8 }; + + partial( + fn: { (p1: T1, p2: T2, p3: T3, p4: T4, p5: T5, p6: T6, p7: T7):T8 }, + stub1: UnderscoreStatic, + stub2: UnderscoreStatic, + stub3: UnderscoreStatic, + p4: T4, + stub5: UnderscoreStatic, + stub6: UnderscoreStatic, + p7: T7 + ): { (p1: T1, p2: T2, p3: T3, p5: T5, p6: T6): T8 }; + + partial( + fn: { (p1: T1, p2: T2, p3: T3, p4: T4, p5: T5, p6: T6, p7: T7):T8 }, + p1: T1, + p2: T2, + p3: T3, + stub4: UnderscoreStatic, + stub5: UnderscoreStatic, + stub6: UnderscoreStatic, + p7: T7 + ): { (p4: T4, p5: T5, p6: T6): T8 }; + + partial( + fn: { (p1: T1, p2: T2, p3: T3, p4: T4, p5: T5, p6: T6, p7: T7):T8 }, + stub1: UnderscoreStatic, + p2: T2, + p3: T3, + stub4: UnderscoreStatic, + stub5: UnderscoreStatic, + stub6: UnderscoreStatic, + p7: T7 + ): { (p1: T1, p4: T4, p5: T5, p6: T6): T8 }; + + partial( + fn: { (p1: T1, p2: T2, p3: T3, p4: T4, p5: T5, p6: T6, p7: T7):T8 }, + p1: T1, + stub2: UnderscoreStatic, + p3: T3, + stub4: UnderscoreStatic, + stub5: UnderscoreStatic, + stub6: UnderscoreStatic, + p7: T7 + ): { (p2: T2, p4: T4, p5: T5, p6: T6): T8 }; + + partial( + fn: { (p1: T1, p2: T2, p3: T3, p4: T4, p5: T5, p6: T6, p7: T7):T8 }, + stub1: UnderscoreStatic, + stub2: UnderscoreStatic, + p3: T3, + stub4: UnderscoreStatic, + stub5: UnderscoreStatic, + stub6: UnderscoreStatic, + p7: T7 + ): { (p1: T1, p2: T2, p4: T4, p5: T5, p6: T6): T8 }; + + partial( + fn: { (p1: T1, p2: T2, p3: T3, p4: T4, p5: T5, p6: T6, p7: T7):T8 }, + p1: T1, + p2: T2, + stub3: UnderscoreStatic, + stub4: UnderscoreStatic, + stub5: UnderscoreStatic, + stub6: UnderscoreStatic, + p7: T7 + ): { (p3: T3, p4: T4, p5: T5, p6: T6): T8 }; + + partial( + fn: { (p1: T1, p2: T2, p3: T3, p4: T4, p5: T5, p6: T6, p7: T7):T8 }, + stub1: UnderscoreStatic, + p2: T2, + stub3: UnderscoreStatic, + stub4: UnderscoreStatic, + stub5: UnderscoreStatic, + stub6: UnderscoreStatic, + p7: T7 + ): { (p1: T1, p3: T3, p4: T4, p5: T5, p6: T6): T8 }; + + partial( + fn: { (p1: T1, p2: T2, p3: T3, p4: T4, p5: T5, p6: T6, p7: T7):T8 }, + p1: T1, + stub2: UnderscoreStatic, + stub3: UnderscoreStatic, + stub4: UnderscoreStatic, + stub5: UnderscoreStatic, + stub6: UnderscoreStatic, + p7: T7 + ): { (p2: T2, p3: T3, p4: T4, p5: T5, p6: T6): T8 }; + + partial( + fn: { (p1: T1, p2: T2, p3: T3, p4: T4, p5: T5, p6: T6, p7: T7):T8 }, + stub1: UnderscoreStatic, + stub2: UnderscoreStatic, + stub3: UnderscoreStatic, + stub4: UnderscoreStatic, + stub5: UnderscoreStatic, + stub6: UnderscoreStatic, + p7: T7 + ): { (p1: T1, p2: T2, p3: T3, p4: T4, p5: T5, p6: T6): T8 }; + + /** + * Memoizes a given function by caching the computed result. Useful for speeding up slow-running computations. + * If passed an optional hashFunction, it will be used to compute the hash key for storing the result, based + * on the arguments to the original function. The default hashFunction just uses the first argument to the + * memoized function as the key. + * @param fn Computationally expensive function that will now memoized results. + * @param hashFn Hash function for storing the result of `fn`. + * @return Memoized version of `fn`. + **/ + memoize( + fn: Function, + hashFn?: (...args: any[]) => string): Function; + + /** + * Much like setTimeout, invokes function after wait milliseconds. If you pass the optional arguments, + * they will be forwarded on to the function when it is invoked. + * @param func Function to delay `waitMS` amount of ms. + * @param wait The amount of milliseconds to delay `fn`. + * @arguments Additional arguments to pass to `fn`. + **/ + delay( + func: Function, + wait: number, + ...arguments: any[]): any; + + /** + * @see _delay + **/ + delay( + func: Function, + ...arguments: any[]): any; + + /** + * Defers invoking the function until the current call stack has cleared, similar to using setTimeout + * with a delay of 0. Useful for performing expensive computations or HTML rendering in chunks without + * blocking the UI thread from updating. If you pass the optional arguments, they will be forwarded on + * to the function when it is invoked. + * @param fn The function to defer. + * @param arguments Additional arguments to pass to `fn`. + **/ + defer( + fn: Function, + ...arguments: any[]): void; + + /** + * Creates and returns a new, throttled version of the passed function, that, when invoked repeatedly, + * will only actually call the original function at most once per every wait milliseconds. Useful for + * rate-limiting events that occur faster than you can keep up with. + * By default, throttle will execute the function as soon as you call it for the first time, and, + * if you call it again any number of times during the wait period, as soon as that period is over. + * If you'd like to disable the leading-edge call, pass {leading: false}, and if you'd like to disable + * the execution on the trailing-edge, pass {trailing: false}. + * @param func Function to throttle `waitMS` ms. + * @param wait The number of milliseconds to wait before `fn` can be invoked again. + * @param options Allows for disabling execution of the throttled function on either the leading or trailing edge. + * @return `fn` with a throttle of `wait`. + **/ + throttle( + func: T, + wait: number, + options?: _.ThrottleSettings): T; + + /** + * Creates and returns a new debounced version of the passed function that will postpone its execution + * until after wait milliseconds have elapsed since the last time it was invoked. Useful for implementing + * behavior that should only happen after the input has stopped arriving. For example: rendering a preview + * of a Markdown comment, recalculating a layout after the window has stopped being resized, and so on. + * + * Pass true for the immediate parameter to cause debounce to trigger the function on the leading instead + * of the trailing edge of the wait interval. Useful in circumstances like preventing accidental double + *-clicks on a "submit" button from firing a second time. + * @param fn Function to debounce `waitMS` ms. + * @param wait The number of milliseconds to wait before `fn` can be invoked again. + * @param immediate True if `fn` should be invoked on the leading edge of `waitMS` instead of the trailing edge. + * @return Debounced version of `fn` that waits `wait` ms when invoked. + **/ + debounce( + fn: T, + wait: number, + immediate?: boolean): T; + + /** + * Creates a version of the function that can only be called one time. Repeated calls to the modified + * function will have no effect, returning the value from the original call. Useful for initialization + * functions, instead of having to set a boolean flag and then check it later. + * @param fn Function to only execute once. + * @return Copy of `fn` that can only be invoked once. + **/ + once(fn: T): T; + + /** + * Creates a version of the function that will only be run after first being called count times. Useful + * for grouping asynchronous responses, where you want to be sure that all the async calls have finished, + * before proceeding. + * @param number count Number of times to be called before actually executing. + * @param Function fn The function to defer execution `count` times. + * @return Copy of `fn` that will not execute until it is invoked `count` times. + **/ + after( + count: number, + fn: Function): Function; + + /** + * Creates a version of the function that can be called no more than count times. The result of + * the last function call is memoized and returned when count has been reached. + * @param number count The maxmimum number of times the function can be called. + * @param Function fn The function to limit the number of times it can be called. + * @return Copy of `fn` that can only be called `count` times. + **/ + before( + count: number, + fn: Function): Function; + + /** + * Wraps the first function inside of the wrapper function, passing it as the first argument. This allows + * the wrapper to execute code before and after the function runs, adjust the arguments, and execute it + * conditionally. + * @param fn Function to wrap. + * @param wrapper The function that will wrap `fn`. + * @return Wrapped version of `fn. + **/ + wrap( + fn: Function, + wrapper: (fn: Function, ...args: any[]) => any): Function; + + /** + * Returns a negated version of the pass-in predicate. + * @param Function predicate + * @return boolean + **/ + negate(predicate: Function): boolean; + + /** + * Returns the composition of a list of functions, where each function consumes the return value of the + * function that follows. In math terms, composing the functions f(), g(), and h() produces f(g(h())). + * @param functions List of functions to compose. + * @return Composition of `functions`. + **/ + compose(...functions: Function[]): Function; + + /********** + * Objects * + ***********/ + + /** + * Retrieve all the names of the object's properties. + * @param object Retrieve the key or property names from this object. + * @return List of all the property names on `object`. + **/ + keys(object: any): string[]; + + /** + * Retrieve all the names of object's own and inherited properties. + * @param object Retrieve the key or property names from this object. + * @return List of all the property names on `object`. + **/ + allKeys(object: any): string[]; + + /** + * Return all of the values of the object's properties. + * @param object Retrieve the values of all the properties on this object. + * @return List of all the values on `object`. + **/ + values(object: _.Dictionary): T[]; + + /** + * Return all of the values of the object's properties. + * @param object Retrieve the values of all the properties on this object. + * @return List of all the values on `object`. + **/ + values(object: any): any[]; + + /** + * Like map, but for objects. Transform the value of each property in turn. + * @param object The object to transform + * @param iteratee The function that transforms property values + * @param context The optional context (value of `this`) to bind to + * @return a new _.Dictionary of property values + */ + mapObject(object: _.Dictionary, iteratee: (val: T, key: string, object: _.Dictionary) => U, context?: any): _.Dictionary; + + /** + * Like map, but for objects. Transform the value of each property in turn. + * @param object The object to transform + * @param iteratee The function that tranforms property values + * @param context The optional context (value of `this`) to bind to + */ + mapObject(object: any, iteratee: (val: any, key: string, object: any) => T, context?: any): _.Dictionary; + + /** + * Like map, but for objects. Retrieves a property from each entry in the object, as if by _.property + * @param object The object to transform + * @param iteratee The property name to retrieve + * @param context The optional context (value of `this`) to bind to + */ + mapObject(object: any, iteratee: string, context?: any): _.Dictionary; + + /** + * Convert an object into a list of [key, value] pairs. + * @param object Convert this object to a list of [key, value] pairs. + * @return List of [key, value] pairs on `object`. + **/ + pairs(object: any): any[][]; + + /** + * Returns a copy of the object where the keys have become the values and the values the keys. + * For this to work, all of your object's values should be unique and string serializable. + * @param object Object to invert key/value pairs. + * @return An inverted key/value paired version of `object`. + **/ + invert(object: any): any; + + /** + * Returns a sorted list of the names of every method in an object - that is to say, + * the name of every function property of the object. + * @param object Object to pluck all function property names from. + * @return List of all the function names on `object`. + **/ + functions(object: any): string[]; + + /** + * @see _functions + **/ + methods(object: any): string[]; + + /** + * Copy all of the properties in the source objects over to the destination object, and return + * the destination object. It's in-order, so the last source will override properties of the + * same name in previous arguments. + * @param destination Object to extend all the properties from `sources`. + * @param sources Extends `destination` with all properties from these source objects. + * @return `destination` extended with all the properties from the `sources` objects. + **/ + extend( + destination: any, + ...sources: any[]): any; + + /** + * Like extend, but only copies own properties over to the destination object. (alias: assign) + */ + extendOwn( + destination: any, + ...source: any[]): any; + + /** + * Like extend, but only copies own properties over to the destination object. (alias: extendOwn) + */ + assign( + destination: any, + ...source: any[]): any; + + /** + * Return a copy of the object, filtered to only have values for the whitelisted keys + * (or array of valid keys). + * @param object Object to strip unwanted key/value pairs. + * @keys The key/value pairs to keep on `object`. + * @return Copy of `object` with only the `keys` properties. + **/ + pick( + object: any, + ...keys: any[]): any; + + /** + * @see _.pick + **/ + pick( + object: any, + fn: (value: any, key: any, object: any) => any): any; + + /** + * Return a copy of the object, filtered to omit the blacklisted keys (or array of keys). + * @param object Object to strip unwanted key/value pairs. + * @param keys The key/value pairs to remove on `object`. + * @return Copy of `object` without the `keys` properties. + **/ + omit( + object: any, + ...keys: string[]): any; + + /** + * @see _.omit + **/ + omit( + object: any, + keys: string[]): any; + + /** + * @see _.omit + **/ + omit( + object: any, + iteratee: Function): any; + + /** + * Fill in null and undefined properties in object with values from the defaults objects, + * and return the object. As soon as the property is filled, further defaults will have no effect. + * @param object Fill this object with default values. + * @param defaults The default values to add to `object`. + * @return `object` with added `defaults` values. + **/ + defaults( + object: any, + ...defaults: any[]): any; + + /** + * Create a shallow-copied clone of the object. + * Any nested objects or arrays will be copied by reference, not duplicated. + * @param object Object to clone. + * @return Copy of `object`. + **/ + clone(object: T): T; + + /** + * Invokes interceptor with the object, and then returns object. The primary purpose of this method + * is to "tap into" a method chain, in order to perform operations on intermediate results within the chain. + * @param object Argument to `interceptor`. + * @param intercepter The function to modify `object` before continuing the method chain. + * @return Modified `object`. + **/ + tap(object: T, intercepter: Function): T; + + /** + * Does the object contain the given key? Identical to object.hasOwnProperty(key), but uses a safe + * reference to the hasOwnProperty function, in case it's been overridden accidentally. + * @param object Object to check for `key`. + * @param key The key to check for on `object`. + * @return True if `key` is a property on `object`, otherwise false. + **/ + has(object: any, key: string): boolean; + + /** + * Returns a predicate function that will tell you if a passed in object contains all of the key/value properties present in attrs. + * @param attrs Object with key values pair + * @return Predicate function + **/ + matches(attrs: T): _.ListIterator; + + /** + * Returns a function that will itself return the key property of any passed-in object. + * @param key Property of the object. + * @return Function which accept an object an returns the value of key in that object. + **/ + property(key: string): (object: Object) => any; + + /** + * Returns a function that will itself return the value of a object key property. + * @param key The object to get the property value from. + * @return Function which accept a key property in `object` and returns its value. + **/ + propertyOf(object: Object): (key: string) => any; + + /** + * Performs an optimized deep comparison between the two objects, + * to determine if they should be considered equal. + * @param object Compare to `other`. + * @param other Compare to `object`. + * @return True if `object` is equal to `other`. + **/ + isEqual(object: any, other: any): boolean; + + /** + * Returns true if object contains no values. + * @param object Check if this object has no properties or values. + * @return True if `object` is empty. + **/ + isEmpty(object: any): boolean; + + /** + * Returns true if the keys and values in `properties` matches with the `object` properties. + * @param object Object to be compared with `properties`. + * @param properties Properties be compared with `object` + * @return True if `object` has matching keys and values, otherwise false. + **/ + isMatch(object:any, properties:any): boolean; + + /** + * Returns true if object is a DOM element. + * @param object Check if this object is a DOM element. + * @return True if `object` is a DOM element, otherwise false. + **/ + isElement(object: any): object is Element; + + /** + * Returns true if object is an Array. + * @param object Check if this object is an Array. + * @return True if `object` is an Array, otherwise false. + **/ + isArray(object: any): object is []; + + /** + * Returns true if object is an Array. + * @param object Check if this object is an Array. + * @return True if `object` is an Array, otherwise false. + **/ + isArray(object: any): object is T[]; + + /** + * Returns true if value is an Object. Note that JavaScript arrays and functions are objects, + * while (normal) strings and numbers are not. + * @param object Check if this object is an Object. + * @return True of `object` is an Object, otherwise false. + **/ + isObject(object: any): boolean; + + /** + * Returns true if object is an Arguments object. + * @param object Check if this object is an Arguments object. + * @return True if `object` is an Arguments object, otherwise false. + **/ + isArguments(object: any): object is IArguments; + + /** + * Returns true if object is a Function. + * @param object Check if this object is a Function. + * @return True if `object` is a Function, otherwise false. + **/ + isFunction(object: any): object is Function; + + /** + * Returns true if object inherits from an Error. + * @param object Check if this object is an Error. + * @return True if `object` is a Error, otherwise false. + **/ + isError(object:any): object is Error; + + /** + * Returns true if object is a String. + * @param object Check if this object is a String. + * @return True if `object` is a String, otherwise false. + **/ + isString(object: any): object is string; + + /** + * Returns true if object is a Number (including NaN). + * @param object Check if this object is a Number. + * @return True if `object` is a Number, otherwise false. + **/ + isNumber(object: any): object is number; + + /** + * Returns true if object is a finite Number. + * @param object Check if this object is a finite Number. + * @return True if `object` is a finite Number. + **/ + isFinite(object: any): boolean; + + /** + * Returns true if object is either true or false. + * @param object Check if this object is a bool. + * @return True if `object` is a bool, otherwise false. + **/ + isBoolean(object: any): object is boolean; + + /** + * Returns true if object is a Date. + * @param object Check if this object is a Date. + * @return True if `object` is a Date, otherwise false. + **/ + isDate(object: any): object is Date; + + /** + * Returns true if object is a RegExp. + * @param object Check if this object is a RegExp. + * @return True if `object` is a RegExp, otherwise false. + **/ + isRegExp(object: any): object is RegExp; + + /** + * Returns true if object is NaN. + * Note: this is not the same as the native isNaN function, + * which will also return true if the variable is undefined. + * @param object Check if this object is NaN. + * @return True if `object` is NaN, otherwise false. + **/ + isNaN(object: any): boolean; + + /** + * Returns true if the value of object is null. + * @param object Check if this object is null. + * @return True if `object` is null, otherwise false. + **/ + isNull(object: any): boolean; + + /** + * Returns true if value is undefined. + * @param object Check if this object is undefined. + * @return True if `object` is undefined, otherwise false. + **/ + isUndefined(value: any): boolean; + + /* ********* + * Utility * + ********** */ + + /** + * Give control of the "_" variable back to its previous owner. + * Returns a reference to the Underscore object. + * @return Underscore object reference. + **/ + noConflict(): any; + + /** + * Returns the same value that is used as the argument. In math: f(x) = x + * This function looks useless, but is used throughout Underscore as a default iterator. + * @param value Identity of this object. + * @return `value`. + **/ + identity(value: T): T; + + /** + * Creates a function that returns the same value that is used as the argument of _.constant + * @param value Identity of this object. + * @return Function that return value. + **/ + constant(value: T): () => T; + + /** + * Returns undefined irrespective of the arguments passed to it. Useful as the default + * for optional callback arguments. + * Note there is no way to indicate a 'undefined' return, so it is currently typed as void. + * @return undefined + **/ + noop(): void; + + /** + * Invokes the given iterator function n times. + * Each invocation of iterator is called with an index argument + * @param n Number of times to invoke `iterator`. + * @param iterator Function iterator to invoke `n` times. + * @param context `this` object in `iterator`, optional. + **/ + times(n: number, iterator: (n: number) => TResult, context?: any): TResult[]; + + /** + * Returns a random integer between min and max, inclusive. If you only pass one argument, + * it will return a number between 0 and that number. + * @param max The maximum random number. + * @return A random number between 0 and `max`. + **/ + random(max: number): number; + + /** + * @see _.random + * @param min The minimum random number. + * @return A random number between `min` and `max`. + **/ + random(min: number, max: number): number; + + /** + * Allows you to extend Underscore with your own utility functions. Pass a hash of + * {name: function} definitions to have your functions added to the Underscore object, + * as well as the OOP wrapper. + * @param object Mixin object containing key/function pairs to add to the Underscore object. + **/ + mixin(object: any): void; + + /** + * A mostly-internal function to generate callbacks that can be applied to each element + * in a collection, returning the desired result -- either identity, an arbitrary callback, + * a property matcher, or a propetery accessor. + * @param string|Function|Object value The value to iterate over, usually the key. + * @param any context + * @param number argCount + * @return Callback that can be applied to each element in a collection. + **/ + iteratee(value: string): Function; + iteratee(value: Function, context?: any, argCount?: number): Function; + iteratee(value: Object): Function; + + /** + * Generate a globally-unique id for client-side models or DOM elements that need one. + * If prefix is passed, the id will be appended to it. Without prefix, returns an integer. + * @param prefix A prefix string to start the unique ID with. + * @return Unique string ID beginning with `prefix`. + **/ + uniqueId(prefix?: string): string; + + /** + * Escapes a string for insertion into HTML, replacing &, <, >, ", ', and / characters. + * @param str Raw string to escape. + * @return `str` HTML escaped. + **/ + escape(str: string): string; + + /** + * The opposite of escape, replaces &, <, >, ", and ' with their unescaped counterparts. + * @param str HTML escaped string. + * @return `str` Raw string. + **/ + unescape(str: string): string; + + /** + * If the value of the named property is a function then invoke it; otherwise, return it. + * @param object Object to maybe invoke function `property` on. + * @param property The function by name to invoke on `object`. + * @param defaultValue The value to be returned in case `property` doesn't exist or is undefined. + * @return The result of invoking the function `property` on `object. + **/ + result(object: any, property: string, defaultValue?:any): any; + + /** + * Compiles JavaScript templates into functions that can be evaluated for rendering. Useful + * for rendering complicated bits of HTML from JSON data sources. Template functions can both + * interpolate variables, using <%= ... %>, as well as execute arbitrary JavaScript code, with + * <% ... %>. If you wish to interpolate a value, and have it be HTML-escaped, use <%- ... %> When + * you evaluate a template function, pass in a data object that has properties corresponding to + * the template's free variables. If you're writing a one-off, you can pass the data object as + * the second parameter to template in order to render immediately instead of returning a template + * function. The settings argument should be a hash containing any _.templateSettings that should + * be overridden. + * @param templateString Underscore HTML template. + * @param data Data to use when compiling `templateString`. + * @param settings Settings to use while compiling. + * @return Returns the compiled Underscore HTML template. + **/ + template(templateString: string, settings?: _.TemplateSettings): (...data: any[]) => string; + + /** + * By default, Underscore uses ERB-style template delimiters, change the + * following template settings to use alternative delimiters. + **/ + templateSettings: _.TemplateSettings; + + /** + * Returns an integer timestamp for the current time, using the fastest method available in the runtime. Useful for implementing timing/animation functions. + **/ + now(): number; + + /* ********** + * Chaining * + *********** */ + + /** + * Returns a wrapped object. Calling methods on this object will continue to return wrapped objects + * until value() is used. + * @param obj Object to chain. + * @return Wrapped `obj`. + **/ + chain(obj: T[]): _Chain; + chain(obj: _.Dictionary): _Chain; + chain(obj: T): _Chain; +} + +interface Underscore { + + /* ************* + * Collections * + ************* */ + + /** + * Wrapped type `any[]`. + * @see _.each + **/ + each(iterator: _.ListIterator, context?: any): T[]; + + /** + * @see _.each + **/ + each(iterator: _.ObjectIterator, context?: any): T[]; + + /** + * @see _.each + **/ + forEach(iterator: _.ListIterator, context?: any): T[]; + + /** + * @see _.each + **/ + forEach(iterator: _.ObjectIterator, context?: any): T[]; + + /** + * Wrapped type `any[]`. + * @see _.map + **/ + map(iterator: _.ListIterator, context?: any): TResult[]; + + /** + * Wrapped type `any[]`. + * @see _.map + **/ + map(iterator: _.ObjectIterator, context?: any): TResult[]; + + /** + * @see _.map + **/ + collect(iterator: _.ListIterator, context?: any): TResult[]; + + /** + * @see _.map + **/ + collect(iterator: _.ObjectIterator, context?: any): TResult[]; + + /** + * Wrapped type `any[]`. + * @see _.reduce + **/ + reduce(iterator: _.MemoIterator, memo?: TResult, context?: any): TResult; + + /** + * @see _.reduce + **/ + inject(iterator: _.MemoIterator, memo?: TResult, context?: any): TResult; + + /** + * @see _.reduce + **/ + foldl(iterator: _.MemoIterator, memo?: TResult, context?: any): TResult; + + /** + * Wrapped type `any[]`. + * @see _.reduceRight + **/ + reduceRight(iterator: _.MemoIterator, memo?: TResult, context?: any): TResult; + + /** + * @see _.reduceRight + **/ + foldr(iterator: _.MemoIterator, memo?: TResult, context?: any): TResult; + + /** + * Wrapped type `any[]`. + * @see _.find + **/ + find(iterator: _.ListIterator|_.ObjectIterator, context?: any): T; + + /** + * @see _.find + **/ + find(interator: U): T; + + /** + * @see _.find + **/ + find(interator: string): T; + + /** + * @see _.find + **/ + detect(iterator: _.ListIterator|_.ObjectIterator, context?: any): T; + + /** + * @see _.find + **/ + detect(interator?: U): T; + + /** + * @see _.find + **/ + detect(interator?: string): T; + + /** + * Wrapped type `any[]`. + * @see _.filter + **/ + filter(iterator: _.ListIterator, context?: any): T[]; + + /** + * @see _.filter + **/ + select(iterator: _.ListIterator, context?: any): T[]; + + /** + * Wrapped type `any[]`. + * @see _.where + **/ + where(properties: U): T[]; + + /** + * Wrapped type `any[]`. + * @see _.findWhere + **/ + findWhere(properties: U): T; + + /** + * Wrapped type `any[]`. + * @see _.reject + **/ + reject(iterator: _.ListIterator, context?: any): T[]; + + /** + * Wrapped type `any[]`. + * @see _.all + **/ + all(iterator?: _.ListIterator, context?: any): boolean; + + /** + * @see _.all + **/ + every(iterator?: _.ListIterator, context?: any): boolean; + + /** + * Wrapped type `any[]`. + * @see _.any + **/ + any(iterator?: _.ListIterator, context?: any): boolean; + + /** + * @see _.any + **/ + some(iterator?: _.ListIterator, context?: any): boolean; + + /** + * Wrapped type `any[]`. + * @see _.contains + **/ + contains(value: T): boolean; + + /** + * Alias for 'contains'. + * @see contains + **/ + include(value: T): boolean; + + /** + * Wrapped type `any[]`. + * @see _.invoke + **/ + invoke(methodName: string, ...arguments: any[]): any; + + /** + * Wrapped type `any[]`. + * @see _.pluck + **/ + pluck(propertyName: string): any[]; + + /** + * Wrapped type `number[]`. + * @see _.max + **/ + max(): number; + + /** + * Wrapped type `any[]`. + * @see _.max + **/ + max(iterator: _.ListIterator, context?: any): T; + + /** + * Wrapped type `any[]`. + * @see _.max + **/ + max(iterator?: _.ListIterator, context?: any): T; + + /** + * Wrapped type `number[]`. + * @see _.min + **/ + min(): number; + + /** + * Wrapped type `any[]`. + * @see _.min + **/ + min(iterator: _.ListIterator, context?: any): T; + + /** + * Wrapped type `any[]`. + * @see _.min + **/ + min(iterator?: _.ListIterator, context?: any): T; + + /** + * Wrapped type `any[]`. + * @see _.sortBy + **/ + sortBy(iterator?: _.ListIterator, context?: any): T[]; + + /** + * Wrapped type `any[]`. + * @see _.sortBy + **/ + sortBy(iterator: string, context?: any): T[]; + + /** + * Wrapped type `any[]`. + * @see _.groupBy + **/ + groupBy(iterator?: _.ListIterator, context?: any): _.Dictionary<_.List>; + + /** + * Wrapped type `any[]`. + * @see _.groupBy + **/ + groupBy(iterator: string, context?: any): _.Dictionary; + + /** + * Wrapped type `any[]`. + * @see _.indexBy + **/ + indexBy(iterator: _.ListIterator, context?: any): _.Dictionary; + + /** + * Wrapped type `any[]`. + * @see _.indexBy + **/ + indexBy(iterator: string, context?: any): _.Dictionary; + + /** + * Wrapped type `any[]`. + * @see _.countBy + **/ + countBy(iterator?: _.ListIterator, context?: any): _.Dictionary; + + /** + * Wrapped type `any[]`. + * @see _.countBy + **/ + countBy(iterator: string, context?: any): _.Dictionary; + + /** + * Wrapped type `any[]`. + * @see _.shuffle + **/ + shuffle(): T[]; + + /** + * Wrapped type `any[]`. + * @see _.sample + **/ + sample(n: number): T[]; + + /** + * @see _.sample + **/ + sample(): T; + + /** + * Wrapped type `any`. + * @see _.toArray + **/ + toArray(): T[]; + + /** + * Wrapped type `any`. + * @see _.size + **/ + size(): number; + + /********* + * Arrays * + **********/ + + /** + * Wrapped type `any[]`. + * @see _.first + **/ + first(): T; + + /** + * Wrapped type `any[]`. + * @see _.first + **/ + first(n: number): T[]; + + /** + * @see _.first + **/ + head(): T; + + /** + * @see _.first + **/ + head(n: number): T[]; + + /** + * @see _.first + **/ + take(): T; + + /** + * @see _.first + **/ + take(n: number): T[]; + + /** + * Wrapped type `any[]`. + * @see _.initial + **/ + initial(n?: number): T[]; + + /** + * Wrapped type `any[]`. + * @see _.last + **/ + last(): T; + + /** + * Wrapped type `any[]`. + * @see _.last + **/ + last(n: number): T[]; + + /** + * Wrapped type `any[]`. + * @see _.rest + **/ + rest(n?: number): T[]; + + /** + * @see _.rest + **/ + tail(n?: number): T[]; + + /** + * @see _.rest + **/ + drop(n?: number): T[]; + + /** + * Wrapped type `any[]`. + * @see _.compact + **/ + compact(): T[]; + + /** + * Wrapped type `any`. + * @see _.flatten + **/ + flatten(shallow?: boolean): any[]; + + /** + * Wrapped type `any[]`. + * @see _.without + **/ + without(...values: T[]): T[]; + + /** + * Wrapped type `any[]`. + * @see _.partition + **/ + partition(iterator: _.ListIterator, context?: any): T[][]; + + /** + * Wrapped type `any[][]`. + * @see _.union + **/ + union(...arrays: _.List[]): T[]; + + /** + * Wrapped type `any[][]`. + * @see _.intersection + **/ + intersection(...arrays: _.List[]): T[]; + + /** + * Wrapped type `any[]`. + * @see _.difference + **/ + difference(...others: _.List[]): T[]; + + /** + * Wrapped type `any[]`. + * @see _.uniq + **/ + uniq(isSorted?: boolean, iterator?: _.ListIterator): T[]; + + /** + * Wrapped type `any[]`. + * @see _.uniq + **/ + uniq(iterator?: _.ListIterator, context?: any): T[]; + + /** + * @see _.uniq + **/ + unique(isSorted?: boolean, iterator?: _.ListIterator): T[]; + + /** + * @see _.uniq + **/ + unique(iterator?: _.ListIterator, context?: any): T[]; + + /** + * Wrapped type `any[][]`. + * @see _.zip + **/ + zip(...arrays: any[][]): any[][]; + + /** + * Wrapped type `any[][]`. + * @see _.unzip + **/ + unzip(...arrays: any[][]): any[][]; + + /** + * Wrapped type `any[][]`. + * @see _.object + **/ + object(...keyValuePairs: any[][]): any; + + /** + * @see _.object + **/ + object(values?: any): any; + + /** + * Wrapped type `any[]`. + * @see _.indexOf + **/ + indexOf(value: T, isSorted?: boolean): number; + + /** + * @see _.indexOf + **/ + indexOf(value: T, startFrom: number): number; + + /** + * Wrapped type `any[]`. + * @see _.lastIndexOf + **/ + lastIndexOf(value: T, from?: number): number; + + /** + * @see _.findIndex + **/ + findIndex(array: _.List, predicate: _.ListIterator, context?: any): number; + + /** + * @see _.findLastIndex + **/ + findLastIndex(array: _.List, predicate: _.ListIterator, context?: any): number; + + /** + * Wrapped type `any[]`. + * @see _.sortedIndex + **/ + sortedIndex(value: T, iterator?: (x: T) => any, context?: any): number; + + /** + * Wrapped type `number`. + * @see _.range + **/ + range(stop: number, step?: number): number[]; + + /** + * Wrapped type `number`. + * @see _.range + **/ + range(): number[]; + + /* *********** + * Functions * + ************ */ + + /** + * Wrapped type `Function`. + * @see _.bind + **/ + bind(object: any, ...arguments: any[]): Function; + + /** + * Wrapped type `object`. + * @see _.bindAll + **/ + bindAll(...methodNames: string[]): any; + + /** + * Wrapped type `Function`. + * @see _.partial + **/ + partial(...arguments: any[]): Function; + + /** + * Wrapped type `Function`. + * @see _.memoize + **/ + memoize(hashFn?: (n: any) => string): Function; + + /** + * Wrapped type `Function`. + * @see _.defer + **/ + defer(...arguments: any[]): void; + + /** + * Wrapped type `Function`. + * @see _.delay + **/ + delay(wait: number, ...arguments: any[]): any; + + /** + * @see _.delay + **/ + delay(...arguments: any[]): any; + + /** + * Wrapped type `Function`. + * @see _.throttle + **/ + throttle(wait: number, options?: _.ThrottleSettings): Function; + + /** + * Wrapped type `Function`. + * @see _.debounce + **/ + debounce(wait: number, immediate?: boolean): Function; + + /** + * Wrapped type `Function`. + * @see _.once + **/ + once(): Function; + + /** + * Wrapped type `number`. + * @see _.after + **/ + after(fn: Function): Function; + + /** + * Wrapped type `number`. + * @see _.before + **/ + before(fn: Function): Function; + + /** + * Wrapped type `Function`. + * @see _.wrap + **/ + wrap(wrapper: Function): () => Function; + + /** + * Wrapped type `Function`. + * @see _.negate + **/ + negate(): boolean; + + /** + * Wrapped type `Function[]`. + * @see _.compose + **/ + compose(...functions: Function[]): Function; + + /********* * + * Objects * + ********** */ + + /** + * Wrapped type `object`. + * @see _.keys + **/ + keys(): string[]; + + /** + * Wrapped type `object`. + * @see _.allKeys + **/ + allKeys(): string[]; + + /** + * Wrapped type `object`. + * @see _.values + **/ + values(): T[]; + + /** + * Wrapped type `object`. + * @see _.pairs + **/ + pairs(): any[][]; + + /** + * Wrapped type `object`. + * @see _.invert + **/ + invert(): any; + + /** + * Wrapped type `object`. + * @see _.functions + **/ + functions(): string[]; + + /** + * @see _.functions + **/ + methods(): string[]; + + /** + * Wrapped type `object`. + * @see _.extend + **/ + extend(...sources: any[]): any; + + /** + * Wrapped type `object`. + * @see _.pick + **/ + pick(...keys: any[]): any; + pick(keys: any[]): any; + pick(fn: (value: any, key: any, object: any) => any): any; + + /** + * Wrapped type `object`. + * @see _.omit + **/ + omit(...keys: string[]): any; + omit(keys: string[]): any; + omit(fn: Function): any; + + /** + * Wrapped type `object`. + * @see _.defaults + **/ + defaults(...defaults: any[]): any; + + /** + * Wrapped type `any[]`. + * @see _.clone + **/ + clone(): T; + + /** + * Wrapped type `object`. + * @see _.tap + **/ + tap(interceptor: (...as: any[]) => any): any; + + /** + * Wrapped type `object`. + * @see _.has + **/ + has(key: string): boolean; + + /** + * Wrapped type `any[]`. + * @see _.matches + **/ + matches(): _.ListIterator; + + /** + * Wrapped type `string`. + * @see _.property + **/ + property(): (object: Object) => any; + + /** + * Wrapped type `object`. + * @see _.propertyOf + **/ + propertyOf(): (key: string) => any; + + /** + * Wrapped type `object`. + * @see _.isEqual + **/ + isEqual(other: any): boolean; + + /** + * Wrapped type `object`. + * @see _.isEmpty + **/ + isEmpty(): boolean; + + /** + * Wrapped type `object`. + * @see _.isMatch + **/ + isMatch(): boolean; + + /** + * Wrapped type `object`. + * @see _.isElement + **/ + isElement(): boolean; + + /** + * Wrapped type `object`. + * @see _.isArray + **/ + isArray(): boolean; + + /** + * Wrapped type `object`. + * @see _.isObject + **/ + isObject(): boolean; + + /** + * Wrapped type `object`. + * @see _.isArguments + **/ + isArguments(): boolean; + + /** + * Wrapped type `object`. + * @see _.isFunction + **/ + isFunction(): boolean; + + /** + * Wrapped type `object`. + * @see _.isError + **/ + isError(): boolean; + + /** + * Wrapped type `object`. + * @see _.isString + **/ + isString(): boolean; + + /** + * Wrapped type `object`. + * @see _.isNumber + **/ + isNumber(): boolean; + + /** + * Wrapped type `object`. + * @see _.isFinite + **/ + isFinite(): boolean; + + /** + * Wrapped type `object`. + * @see _.isBoolean + **/ + isBoolean(): boolean; + + /** + * Wrapped type `object`. + * @see _.isDate + **/ + isDate(): boolean; + + /** + * Wrapped type `object`. + * @see _.isRegExp + **/ + isRegExp(): boolean; + + /** + * Wrapped type `object`. + * @see _.isNaN + **/ + isNaN(): boolean; + + /** + * Wrapped type `object`. + * @see _.isNull + **/ + isNull(): boolean; + + /** + * Wrapped type `object`. + * @see _.isUndefined + **/ + isUndefined(): boolean; + + /********* * + * Utility * + ********** */ + + /** + * Wrapped type `any`. + * @see _.identity + **/ + identity(): any; + + /** + * Wrapped type `any`. + * @see _.constant + **/ + constant(): () => T; + + /** + * Wrapped type `any`. + * @see _.noop + **/ + noop(): void; + + /** + * Wrapped type `number`. + * @see _.times + **/ + times(iterator: (n: number) => TResult, context?: any): TResult[]; + + /** + * Wrapped type `number`. + * @see _.random + **/ + random(): number; + /** + * Wrapped type `number`. + * @see _.random + **/ + random(max: number): number; + + /** + * Wrapped type `object`. + * @see _.mixin + **/ + mixin(): void; + + /** + * Wrapped type `string|Function|Object`. + * @see _.iteratee + **/ + iteratee(context?: any, argCount?: number): Function; + + /** + * Wrapped type `string`. + * @see _.uniqueId + **/ + uniqueId(): string; + + /** + * Wrapped type `string`. + * @see _.escape + **/ + escape(): string; + + /** + * Wrapped type `string`. + * @see _.unescape + **/ + unescape(): string; + + /** + * Wrapped type `object`. + * @see _.result + **/ + result(property: string, defaultValue?:any): any; + + /** + * Wrapped type `string`. + * @see _.template + **/ + template(settings?: _.TemplateSettings): (...data: any[]) => string; + + /********** * + * Chaining * + *********** */ + + /** + * Wrapped type `any`. + * @see _.chain + **/ + chain(): _Chain; + + /** + * Wrapped type `any`. + * Extracts the value of a wrapped object. + * @return Value of the wrapped object. + **/ + value(): TResult; +} + +interface _Chain { + + /* ************* + * Collections * + ************* */ + + /** + * Wrapped type `any[]`. + * @see _.each + **/ + each(iterator: _.ListIterator, context?: any): _Chain; + + /** + * @see _.each + **/ + each(iterator: _.ObjectIterator, context?: any): _Chain; + + /** + * @see _.each + **/ + forEach(iterator: _.ListIterator, context?: any): _Chain; + + /** + * @see _.each + **/ + forEach(iterator: _.ObjectIterator, context?: any): _Chain; + + /** + * Wrapped type `any[]`. + * @see _.map + **/ + map(iterator: _.ListIterator, context?: any): _ChainOfArrays; + + /** + * Wrapped type `any[]`. + * @see _.map + **/ + map(iterator: _.ListIterator, context?: any): _Chain; + + /** + * Wrapped type `any[]`. + * @see _.map + **/ + map(iterator: _.ObjectIterator, context?: any): _ChainOfArrays; + + /** + * Wrapped type `any[]`. + * @see _.map + **/ + map(iterator: _.ObjectIterator, context?: any): _Chain; + + /** + * @see _.map + **/ + collect(iterator: _.ListIterator, context?: any): _Chain; + + /** + * @see _.map + **/ + collect(iterator: _.ObjectIterator, context?: any): _Chain; + + /** + * Wrapped type `any[]`. + * @see _.reduce + **/ + reduce(iterator: _.MemoIterator, memo?: TResult, context?: any): _ChainSingle; + + /** + * @see _.reduce + **/ + inject(iterator: _.MemoIterator, memo?: TResult, context?: any): _ChainSingle; + + /** + * @see _.reduce + **/ + foldl(iterator: _.MemoIterator, memo?: TResult, context?: any): _ChainSingle; + + /** + * Wrapped type `any[]`. + * @see _.reduceRight + **/ + reduceRight(iterator: _.MemoIterator, memo?: TResult, context?: any): _ChainSingle; + + /** + * @see _.reduceRight + **/ + foldr(iterator: _.MemoIterator, memo?: TResult, context?: any): _ChainSingle; + + /** + * Wrapped type `any[]`. + * @see _.find + **/ + find(iterator: _.ListIterator|_.ObjectIterator, context?: any): _ChainSingle; + + /** + * @see _.find + **/ + find(interator: U): _ChainSingle; + + /** + * @see _.find + **/ + find(interator: string): _ChainSingle; + + /** + * @see _.find + **/ + detect(iterator: _.ListIterator|_.ObjectIterator, context?: any): _ChainSingle; + + /** + * @see _.find + **/ + detect(interator: U): _ChainSingle; + + /** + * @see _.find + **/ + detect(interator: string): _ChainSingle; + + /** + * Wrapped type `any[]`. + * @see _.filter + **/ + filter(iterator: _.ListIterator, context?: any): _Chain; + + /** + * @see _.filter + **/ + select(iterator: _.ListIterator, context?: any): _Chain; + + /** + * Wrapped type `any[]`. + * @see _.where + **/ + where(properties: U): _Chain; + + /** + * Wrapped type `any[]`. + * @see _.findWhere + **/ + findWhere(properties: U): _ChainSingle; + + /** + * Wrapped type `any[]`. + * @see _.reject + **/ + reject(iterator: _.ListIterator, context?: any): _Chain; + + /** + * Wrapped type `any[]`. + * @see _.all + **/ + all(iterator?: _.ListIterator, context?: any): _Chain; + + /** + * @see _.all + **/ + every(iterator?: _.ListIterator, context?: any): _Chain; + + /** + * Wrapped type `any[]`. + * @see _.any + **/ + any(iterator?: _.ListIterator, context?: any): _Chain; + + /** + * @see _.any + **/ + some(iterator?: _.ListIterator, context?: any): _Chain; + + /** + * Wrapped type `any[]`. + * @see _.contains + **/ + contains(value: T): _Chain; + + /** + * Alias for 'contains'. + * @see contains + **/ + include(value: T): _Chain; + + /** + * Wrapped type `any[]`. + * @see _.invoke + **/ + invoke(methodName: string, ...arguments: any[]): _Chain; + + /** + * Wrapped type `any[]`. + * @see _.pluck + **/ + pluck(propertyName: string): _Chain; + + /** + * Wrapped type `number[]`. + * @see _.max + **/ + max(): _ChainSingle; + + /** + * Wrapped type `any[]`. + * @see _.max + **/ + max(iterator: _.ListIterator, context?: any): _ChainSingle; + + /** + * Wrapped type `any[]`. + * @see _.max + **/ + max(iterator?: _.ListIterator, context?: any): _ChainSingle; + + /** + * Wrapped type `number[]`. + * @see _.min + **/ + min(): _ChainSingle; + + /** + * Wrapped type `any[]`. + * @see _.min + **/ + min(iterator: _.ListIterator, context?: any): _ChainSingle; + + /** + * Wrapped type `any[]`. + * @see _.min + **/ + min(iterator?: _.ListIterator, context?: any): _ChainSingle; + + /** + * Wrapped type `any[]`. + * @see _.sortBy + **/ + sortBy(iterator?: _.ListIterator, context?: any): _Chain; + + /** + * Wrapped type `any[]`. + * @see _.sortBy + **/ + sortBy(iterator: string, context?: any): _Chain; + + /** + * Wrapped type `any[]`. + * @see _.groupBy + **/ + groupBy(iterator?: _.ListIterator, context?: any): _ChainOfArrays; + + /** + * Wrapped type `any[]`. + * @see _.groupBy + **/ + groupBy(iterator: string, context?: any): _ChainOfArrays; + + /** + * Wrapped type `any[]`. + * @see _.indexBy + **/ + indexBy(iterator: _.ListIterator, context?: any): _Chain; + + /** + * Wrapped type `any[]`. + * @see _.indexBy + **/ + indexBy(iterator: string, context?: any): _Chain; + + /** + * Wrapped type `any[]`. + * @see _.countBy + **/ + countBy(iterator?: _.ListIterator, context?: any): _Chain; + + /** + * Wrapped type `any[]`. + * @see _.countBy + **/ + countBy(iterator: string, context?: any): _Chain; + + /** + * Wrapped type `any[]`. + * @see _.shuffle + **/ + shuffle(): _Chain; + + /** + * Wrapped type `any[]`. + * @see _.sample + **/ + sample(n: number): _Chain; + + /** + * @see _.sample + **/ + sample(): _Chain; + + /** + * Wrapped type `any`. + * @see _.toArray + **/ + toArray(): _Chain; + + /** + * Wrapped type `any`. + * @see _.size + **/ + size(): _ChainSingle; + + /********* + * Arrays * + **********/ + + /** + * Wrapped type `any[]`. + * @see _.first + **/ + first(): _ChainSingle; + + /** + * Wrapped type `any[]`. + * @see _.first + **/ + first(n: number): _Chain; + + /** + * @see _.first + **/ + head(): _Chain; + + /** + * @see _.first + **/ + head(n: number): _Chain; + + /** + * @see _.first + **/ + take(): _Chain; + + /** + * @see _.first + **/ + take(n: number): _Chain; + + /** + * Wrapped type `any[]`. + * @see _.initial + **/ + initial(n?: number): _Chain; + + /** + * Wrapped type `any[]`. + * @see _.last + **/ + last(): _ChainSingle; + + /** + * Wrapped type `any[]`. + * @see _.last + **/ + last(n: number): _Chain; + + /** + * Wrapped type `any[]`. + * @see _.rest + **/ + rest(n?: number): _Chain; + + /** + * @see _.rest + **/ + tail(n?: number): _Chain; + + /** + * @see _.rest + **/ + drop(n?: number): _Chain; + + /** + * Wrapped type `any[]`. + * @see _.compact + **/ + compact(): _Chain; + + /** + * Wrapped type `any`. + * @see _.flatten + **/ + flatten(shallow?: boolean): _Chain; + + /** + * Wrapped type `any[]`. + * @see _.without + **/ + without(...values: T[]): _Chain; + + /** + * Wrapped type `any[]`. + * @see _.partition + **/ + partition(iterator: _.ListIterator, context?: any): _Chain; + + /** + * Wrapped type `any[][]`. + * @see _.union + **/ + union(...arrays: _.List[]): _Chain; + + /** + * Wrapped type `any[][]`. + * @see _.intersection + **/ + intersection(...arrays: _.List[]): _Chain; + + /** + * Wrapped type `any[]`. + * @see _.difference + **/ + difference(...others: _.List[]): _Chain; + + /** + * Wrapped type `any[]`. + * @see _.uniq + **/ + uniq(isSorted?: boolean, iterator?: _.ListIterator): _Chain; + + /** + * Wrapped type `any[]`. + * @see _.uniq + **/ + uniq(iterator?: _.ListIterator, context?: any): _Chain; + + /** + * @see _.uniq + **/ + unique(isSorted?: boolean, iterator?: _.ListIterator): _Chain; + + /** + * @see _.uniq + **/ + unique(iterator?: _.ListIterator, context?: any): _Chain; + + /** + * Wrapped type `any[][]`. + * @see _.zip + **/ + zip(...arrays: any[][]): _Chain; + + /** + * Wrapped type `any[][]`. + * @see _.unzip + **/ + unzip(...arrays: any[][]): _Chain; + + /** + * Wrapped type `any[][]`. + * @see _.object + **/ + object(...keyValuePairs: any[][]): _Chain; + + /** + * @see _.object + **/ + object(values?: any): _Chain; + + /** + * Wrapped type `any[]`. + * @see _.indexOf + **/ + indexOf(value: T, isSorted?: boolean): _ChainSingle; + + /** + * @see _.indexOf + **/ + indexOf(value: T, startFrom: number): _ChainSingle; + + /** + * Wrapped type `any[]`. + * @see _.lastIndexOf + **/ + lastIndexOf(value: T, from?: number): _ChainSingle; + + /** + * @see _.findIndex + **/ + findIndex(predicate: _.ListIterator, context?: any): _Chain; + + /** + * @see _.findLastIndex + **/ + findLastIndex(predicate: _.ListIterator, context?: any): _Chain; + + /** + * Wrapped type `any[]`. + * @see _.sortedIndex + **/ + sortedIndex(value: T, iterator?: (x: T) => any, context?: any): _Chain; + + /** + * Wrapped type `number`. + * @see _.range + **/ + range(stop: number, step?: number): _Chain; + + /** + * Wrapped type `number`. + * @see _.range + **/ + range(): _Chain; + + /* *********** + * Functions * + ************ */ + + /** + * Wrapped type `Function`. + * @see _.bind + **/ + bind(object: any, ...arguments: any[]): _Chain; + + /** + * Wrapped type `object`. + * @see _.bindAll + **/ + bindAll(...methodNames: string[]): _Chain; + + /** + * Wrapped type `Function`. + * @see _.partial + **/ + partial(...arguments: any[]): _Chain; + + /** + * Wrapped type `Function`. + * @see _.memoize + **/ + memoize(hashFn?: (n: any) => string): _Chain; + + /** + * Wrapped type `Function`. + * @see _.defer + **/ + defer(...arguments: any[]): _Chain; + + /** + * Wrapped type `Function`. + * @see _.delay + **/ + delay(wait: number, ...arguments: any[]): _Chain; + + /** + * @see _.delay + **/ + delay(...arguments: any[]): _Chain; + + /** + * Wrapped type `Function`. + * @see _.throttle + **/ + throttle(wait: number, options?: _.ThrottleSettings): _Chain; + + /** + * Wrapped type `Function`. + * @see _.debounce + **/ + debounce(wait: number, immediate?: boolean): _Chain; + + /** + * Wrapped type `Function`. + * @see _.once + **/ + once(): _Chain; + + /** + * Wrapped type `number`. + * @see _.after + **/ + after(func: Function): _Chain; + + /** + * Wrapped type `number`. + * @see _.before + **/ + before(fn: Function): _Chain; + + /** + * Wrapped type `Function`. + * @see _.wrap + **/ + wrap(wrapper: Function): () => _Chain; + + /** + * Wrapped type `Function`. + * @see _.negate + **/ + negate(): _Chain; + + /** + * Wrapped type `Function[]`. + * @see _.compose + **/ + compose(...functions: Function[]): _Chain; + + /********* * + * Objects * + ********** */ + + /** + * Wrapped type `object`. + * @see _.keys + **/ + keys(): _Chain; + + /** + * Wrapped type `object`. + * @see _.allKeys + **/ + allKeys(): _Chain; + + /** + * Wrapped type `object`. + * @see _.values + **/ + values(): _Chain; + + /** + * Wrapped type `object`. + * @see _.pairs + **/ + pairs(): _Chain; + + /** + * Wrapped type `object`. + * @see _.invert + **/ + invert(): _Chain; + + /** + * Wrapped type `object`. + * @see _.functions + **/ + functions(): _Chain; + + /** + * @see _.functions + **/ + methods(): _Chain; + + /** + * Wrapped type `object`. + * @see _.extend + **/ + extend(...sources: any[]): _Chain; + + /** + * Wrapped type `object`. + * @see _.pick + **/ + pick(...keys: any[]): _Chain; + pick(keys: any[]): _Chain; + pick(fn: (value: any, key: any, object: any) => any): _Chain; + + /** + * Wrapped type `object`. + * @see _.omit + **/ + omit(...keys: string[]): _Chain; + omit(keys: string[]): _Chain; + omit(iteratee: Function): _Chain; + + /** + * Wrapped type `object`. + * @see _.defaults + **/ + defaults(...defaults: any[]): _Chain; + + /** + * Wrapped type `any[]`. + * @see _.clone + **/ + clone(): _Chain; + + /** + * Wrapped type `object`. + * @see _.tap + **/ + tap(interceptor: (...as: any[]) => any): _Chain; + + /** + * Wrapped type `object`. + * @see _.has + **/ + has(key: string): _Chain; + + /** + * Wrapped type `any[]`. + * @see _.matches + **/ + matches(): _Chain; + + /** + * Wrapped type `string`. + * @see _.property + **/ + property(): _Chain; + + /** + * Wrapped type `object`. + * @see _.propertyOf + **/ + propertyOf(): _Chain; + + /** + * Wrapped type `object`. + * @see _.isEqual + **/ + isEqual(other: any): _Chain; + + /** + * Wrapped type `object`. + * @see _.isEmpty + **/ + isEmpty(): _Chain; + + /** + * Wrapped type `object`. + * @see _.isMatch + **/ + isMatch(): _Chain; + + /** + * Wrapped type `object`. + * @see _.isElement + **/ + isElement(): _Chain; + + /** + * Wrapped type `object`. + * @see _.isArray + **/ + isArray(): _Chain; + + /** + * Wrapped type `object`. + * @see _.isObject + **/ + isObject(): _Chain; + + /** + * Wrapped type `object`. + * @see _.isArguments + **/ + isArguments(): _Chain; + + /** + * Wrapped type `object`. + * @see _.isFunction + **/ + isFunction(): _Chain; + + /** + * Wrapped type `object`. + * @see _.isError + **/ + isError(): _Chain; + + /** + * Wrapped type `object`. + * @see _.isString + **/ + isString(): _Chain; + + /** + * Wrapped type `object`. + * @see _.isNumber + **/ + isNumber(): _Chain; + + /** + * Wrapped type `object`. + * @see _.isFinite + **/ + isFinite(): _Chain; + + /** + * Wrapped type `object`. + * @see _.isBoolean + **/ + isBoolean(): _Chain; + + /** + * Wrapped type `object`. + * @see _.isDate + **/ + isDate(): _Chain; + + /** + * Wrapped type `object`. + * @see _.isRegExp + **/ + isRegExp(): _Chain; + + /** + * Wrapped type `object`. + * @see _.isNaN + **/ + isNaN(): _Chain; + + /** + * Wrapped type `object`. + * @see _.isNull + **/ + isNull(): _Chain; + + /** + * Wrapped type `object`. + * @see _.isUndefined + **/ + isUndefined(): _Chain; + + /********* * + * Utility * + ********** */ + + /** + * Wrapped type `any`. + * @see _.identity + **/ + identity(): _Chain; + + /** + * Wrapped type `any`. + * @see _.constant + **/ + constant(): _Chain; + + /** + * Wrapped type `any`. + * @see _.noop + **/ + noop(): _Chain; + + /** + * Wrapped type `number`. + * @see _.times + **/ + times(iterator: (n: number) => TResult, context?: any): _Chain; + + /** + * Wrapped type `number`. + * @see _.random + **/ + random(): _Chain; + /** + * Wrapped type `number`. + * @see _.random + **/ + random(max: number): _Chain; + + /** + * Wrapped type `object`. + * @see _.mixin + **/ + mixin(): _Chain; + + /** + * Wrapped type `string|Function|Object`. + * @see _.iteratee + **/ + iteratee(context?: any, argCount?: number): _Chain; + + /** + * Wrapped type `string`. + * @see _.uniqueId + **/ + uniqueId(): _Chain; + + /** + * Wrapped type `string`. + * @see _.escape + **/ + escape(): _Chain; + + /** + * Wrapped type `string`. + * @see _.unescape + **/ + unescape(): _Chain; + + /** + * Wrapped type `object`. + * @see _.result + **/ + result(property: string, defaultValue?:any): _Chain; + + /** + * Wrapped type `string`. + * @see _.template + **/ + template(settings?: _.TemplateSettings): (...data: any[]) => _Chain; + + /************* * + * Array proxy * + ************** */ + + /** + * Returns a new array comprised of the array on which it is called + * joined with the array(s) and/or value(s) provided as arguments. + * @param arr Arrays and/or values to concatenate into a new array. See the discussion below for details. + * @return A new array comprised of the array on which it is called + **/ + concat(...arr: Array): _Chain; + + /** + * Join all elements of an array into a string. + * @param separator Optional. Specifies a string to separate each element of the array. The separator is converted to a string if necessary. If omitted, the array elements are separated with a comma. + * @return The string conversions of all array elements joined into one string. + **/ + join(separator?: any): _ChainSingle; + + /** + * Removes the last element from an array and returns that element. + * @return Returns the popped element. + **/ + pop(): _ChainSingle; + + /** + * Adds one or more elements to the end of an array and returns the new length of the array. + * @param item The elements to add to the end of the array. + * @return The array with the element added to the end. + **/ + push(...item: Array): _Chain; + + /** + * Reverses an array in place. The first array element becomes the last and the last becomes the first. + * @return The reversed array. + **/ + reverse(): _Chain; + + /** + * Removes the first element from an array and returns that element. This method changes the length of the array. + * @return The shifted element. + **/ + shift(): _ChainSingle; + + /** + * Returns a shallow copy of a portion of an array into a new array object. + * @param start Zero-based index at which to begin extraction. + * @param end Optional. Zero-based index at which to end extraction. slice extracts up to but not including end. + * @return A shallow copy of a portion of an array into a new array object. + **/ + slice(start: number, end?: number): _Chain; + + /** + * Sorts the elements of an array in place and returns the array. The sort is not necessarily stable. The default sort order is according to string Unicode code points. + * @param compareFn Optional. Specifies a function that defines the sort order. If omitted, the array is sorted according to each character's Unicode code point value, according to the string conversion of each element. + * @return The sorted array. + **/ + sort(compareFn: (a: T, b: T) => boolean): _Chain; + + /** + * Changes the content of an array by removing existing elements and/or adding new elements. + * @param index Index at which to start changing the array. If greater than the length of the array, actual starting index will be set to the length of the array. If negative, will begin that many elements from the end. + * @param quantity An integer indicating the number of old array elements to remove. If deleteCount is 0, no elements are removed. In this case, you should specify at least one new element. If deleteCount is greater than the number of elements left in the array starting at index, then all of the elements through the end of the array will be deleted. + * @param items The element to add to the array. If you don't specify any elements, splice will only remove elements from the array. + * @return An array containing the deleted elements. If only one element is removed, an array of one element is returned. If no elements are removed, an empty array is returned. + **/ + splice(index: number, quantity: number, ...items: Array): _Chain; + + /** + * A string representing the specified array and its elements. + * @return A string representing the specified array and its elements. + **/ + toString(): _ChainSingle; + + /** + * Adds one or more elements to the beginning of an array and returns the new length of the array. + * @param items The elements to add to the front of the array. + * @return The array with the element added to the beginning. + **/ + unshift(...items: Array): _Chain; + + /********** * + * Chaining * + *********** */ + + /** + * Wrapped type `any`. + * @see _.chain + **/ + chain(): _Chain; + + /** + * Wrapped type `any`. + * @see _.value + **/ + value(): T[]; +} +interface _ChainSingle { + value(): T; +} +interface _ChainOfArrays extends _Chain { + flatten(): _Chain; +} + +declare var _: UnderscoreStatic; + +declare module "underscore" { + export = _; +} \ No newline at end of file diff --git a/tasks/config.js b/tasks/config.js new file mode 100644 index 0000000000..46238f4eb7 --- /dev/null +++ b/tasks/config.js @@ -0,0 +1,22 @@ +var path = require('path'); + +var projectRoot = path.resolve(path.dirname(__dirname)); +var srcRoot = path.resolve(projectRoot, 'src'); +var viewsRoot = path.resolve(srcRoot, 'views'); +var htmlcontentRoot = path.resolve(viewsRoot, 'htmlcontent'); + +var config = { + paths: { + project: { + root: projectRoot + }, + extension: { + root: srcRoot + }, + html: { + root: htmlcontentRoot + } + } +} + +module.exports = config; \ No newline at end of file diff --git a/tasks/htmltasks.js b/tasks/htmltasks.js new file mode 100644 index 0000000000..df37994a20 --- /dev/null +++ b/tasks/htmltasks.js @@ -0,0 +1,50 @@ +var gulp = require('gulp'); +var tslint = require('gulp-tslint'); +var ts = require('gulp-typescript'); +var del = require('del'); +var srcmap = require('gulp-sourcemaps'); +var config = require('./config') +var less = require('gulp-less'); +var tsProject = ts.createProject(config.paths.html.root + '/tsconfig.json'); + +gulp.task('html:tslint', () => { + return gulp.src([ + config.paths.html.root + '/src/**/*.ts' + ]) + .pipe((tslint({ + formatter: "verbose" + }))) + .pipe(tslint.report()); +}); + +gulp.task('html:compile-ts', () => { + return gulp.src([ + config.paths.html.root + '/src/**/*.ts', + config.paths.html.root + '/typings/**/*.d.ts']) + .pipe(ts(tsProject)) +}); + +gulp.task('html:compile-css', () => { + return gulp.src(config.paths.html.root + 'src/**/*.less') + .pipe(less()) + .pipe(gulp.dest(config.paths.html.root) + '/out/') +}) + +gulp.task('html:compile', gulp.series('html:compile-ts')) + +gulp.task('html:copy', () => { + return gulp.src(config.paths.html.root + '/src/**/*') + .pipe(gulp.dest('/out/views/htmlcontent/')) +}) + +gulp.task('html:build', gulp.series('html:compile')); + +gulp.task('html:clean', () => { + return del(config.paths.html.root + '/out'); +}); + +gulp.task('build-html', gulp.series('html:tslint', 'html:build')); + +gulp.task('html:watch', function(){ + return gulp.watch(config.paths.html.root + '/src/**/*', gulp.series('html:tslint')) +}) \ No newline at end of file diff --git a/test/messages.json b/test/resources/messages.json similarity index 100% rename from test/messages.json rename to test/resources/messages.json diff --git a/test/results.json b/test/resources/results.json similarity index 100% rename from test/results.json rename to test/resources/results.json diff --git a/test/sqlTest.sql b/test/resources/sqlTest.sql similarity index 100% rename from test/sqlTest.sql rename to test/resources/sqlTest.sql diff --git a/test/sqlOutputContentProvider.test.ts b/test/sqlOutputContentProvider.test.ts index 28082e8f57..ccf4b3dd47 100644 --- a/test/sqlOutputContentProvider.test.ts +++ b/test/sqlOutputContentProvider.test.ts @@ -8,8 +8,8 @@ import { SqlOutputContentProvider } from '../src/models/sqlOutputContentProvider import LocalWebService from '../src/controllers/localWebService'; import Interfaces = require('../src/models/interfaces'); import Constants = require('../src/models/constants'); -var results = require('../../test/results.json'); -var messages = require('../../test/messages.json'); +var results = require('./resources/results.json'); +var messages = require('./resources/messages.json'); var metadata = [ { "columnsUri":"/" + Constants.outputContentTypeColumns+ "?id=0", @@ -40,12 +40,11 @@ suite("SqlOutputProvider Tests", () => { var contentProvider: SqlOutputContentProvider; var path : string; var port: string; - var file = "/test/sqlTest.sql" + var file = "out/test/resources/sqlTest.sql" function openSQLFile(){ return vscode.workspace.openTextDocument(vscode.Uri.parse("file:"+path+file)).then( document => { - vscode.window.showTextDocument(document).then(editor => { - }); + vscode.window.showTextDocument(document); }) } @@ -59,7 +58,7 @@ suite("SqlOutputProvider Tests", () => { test("Initial Server Responses", () => { let uri = contentProvider.updateContent(messages, results); let url = 'http://localhost:' + port + '/' + Interfaces.ContentTypes[Interfaces.ContentType.Root] + '?uri=' + uri; - var htmlbuf = fs.readFileSync(path +'/src/views/htmlcontent/sqlOutput.ejs') + var htmlbuf = fs.readFileSync(path +'/src/views/htmlcontent/src/sqlOutput.ejs') htmlbuf = htmlbuf.toString(); htmlbuf = htmlbuf.replace('<%=uri%>', uri); return request.get(url, function(err, res, body){ diff --git a/tools/Microsoft.SqlTools.ServiceLayer.dll b/tools/Microsoft.SqlTools.ServiceLayer.dll deleted file mode 100644 index e27401fcb3df3483dc972e75d2db389e5dfa80b2..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 108032 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%0ADJBLO7f7$(lMIvhC#YAVo0c_#8}e5j@tYiX3}2 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 diff --git a/tools/Microsoft.SqlTools.ServiceLayer.pdb b/tools/Microsoft.SqlTools.ServiceLayer.pdb deleted file mode 100644 index e0c69a625252dbe86004afd8003607e79cbd63a6..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 31764 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 z z=Gy|*JKensQD*(lP9QA0>Zt?gBW~EY(9}Gxu%6B5k}a{XPYLK z9o>GjuJKItE6vkW!pk=8uOq3+6{e5B=BaEs#CX|Z59_>=^Kb6d>AmLd8n7gmIa|5q z5H~gOm0VO{+%YHT#=!|@F;iH>au-TYSA0qu?8NU1*t93nfK6`Mqe=O&O)8$pbtG)4k&7VqBrT|zp{7Fj_77v)!bb$%1Y1l zumS5&MpOWt20$488#%K2a5CIuhkYZ2b&7=vq{dFd6FBtBPG-RAdG~cCV)I%lgGu4p zDC+k{Rf)rrRrDX4Oni$nw4tTnA=mfI7e&0f6ykMol%8y!VJvp>?kM$o=7r)*$4;$s z_3?i^3!Oc1mi$4PA3xE}-T1}Vxtk|Gzms%)Y}ct#C(Zj(4-B@fs#4>Z~1KC@Ox4^w=$bwcz%6xE%I#6$xU)!Ml@WD_D|t1 zOHn!A-#0nOeENf9HP1h<{rvgSTK@U+Q8VY5Y388u9Jfmy{^PaPD+@N}zqx*Ycf}LA zxF%b(!EUh+CpR@79KfS_+%@00YR@vg%(>fV91L8L5^hxI+&m^fVb-I)K`WH)N&0`7 zDzo2~IrF=m)?J@+3=+kRo$eD7{!Vp`oE z54guB_nl7z`_X+i`)IVww%l(Ij`&PgyuNhaN2g`sN=w{69!q;0P;?_E6t1nc^(uf2 z_tu)R;`3PX8LYUDs`{(x3-@cW;-XcB|2HxV?&jT48FOUoJFTmm-d7x3dR@O=iuA;~ zx8%dJgI`X{bF>>a^Jq%P$RWE1Ub*&si#HbAJm_dPllN$wlXvjgnEEQTeE<4g2}1+C zzujlI-Az8W{LG{A52N=r?70ye)6)8Gg@i_+#;t9d83n#8nzz1N&OaWLo%{I1#IVFM z9~a-hzNXCPanz7KbGp`tGbe3Oc}bUExKP1&q`}#~Ur7CrED3Bz2hY9aoOW@gqe3)OE%%aihR&)yb$;c|GXmG3OUumG{_)y! ZnBCod$zyawHqy&oA`f-t-vPV%{{YCGP_F<0 diff --git a/tsconfig.json b/tsconfig.json index cf12c456bc..943bb94b0a 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -4,12 +4,12 @@ "module": "commonjs", "target": "es6", "watch": false, - "outDir": "out", "noLib": true, "sourceMap": true, "rootDir": "." }, "exclude": [ - "node_modules" + "node_modules", + "src/views/htmlcontent" ] -} +} \ No newline at end of file diff --git a/typings/vscode-typings.d.ts b/typings/vscode-typings.d.ts index 5590dc8ce8..b9b54de1eb 100644 --- a/typings/vscode-typings.d.ts +++ b/typings/vscode-typings.d.ts @@ -1 +1 @@ -/// +/// \ No newline at end of file