From 809d1e7db87d35df1ac6ba36f9d7af1b1f4a1985 Mon Sep 17 00:00:00 2001 From: imedina Date: Tue, 24 Sep 2013 14:20:27 +0200 Subject: [PATCH 01/61] Incorrect submodules deleted --- .gitmodules | 0 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 .gitmodules diff --git a/.gitmodules b/.gitmodules new file mode 100644 index 0000000..e69de29 From a3ac73fbd909e3dd34f394463374c7db8a3b1db7 Mon Sep 17 00:00:00 2001 From: imedina Date: Tue, 24 Sep 2013 14:23:26 +0200 Subject: [PATCH 02/61] JSorolla submodules added --- .gitmodules | 3 +++ lib/jsorolla | 1 + 2 files changed, 4 insertions(+) create mode 160000 lib/jsorolla diff --git a/.gitmodules b/.gitmodules index e69de29..23ecb8c 100644 --- a/.gitmodules +++ b/.gitmodules @@ -0,0 +1,3 @@ +[submodule "lib/jsorolla"] + path = lib/jsorolla + url = git@github.com:opencb/jsorolla.git diff --git a/lib/jsorolla b/lib/jsorolla new file mode 160000 index 0000000..50c39de --- /dev/null +++ b/lib/jsorolla @@ -0,0 +1 @@ +Subproject commit 50c39debcd6977417fcd2ee80cb60b4a42e5c79b From 0915e66913da6fb167217ac39e108b893b217ce8 Mon Sep 17 00:00:00 2001 From: Francisco Salavert Torres Date: Tue, 24 Sep 2013 17:15:38 +0200 Subject: [PATCH 03/61] jsorolla update --- lib/jsorolla | 2 +- src/genome-maps.html | 46 ++++++++++++++++++++++++-------------------- 2 files changed, 26 insertions(+), 22 deletions(-) diff --git a/lib/jsorolla b/lib/jsorolla index 50c39de..eb80b4c 160000 --- a/lib/jsorolla +++ b/lib/jsorolla @@ -1 +1 @@ -Subproject commit 50c39debcd6977417fcd2ee80cb60b4a42e5c79b +Subproject commit eb80b4cc48ab1d66a605c582a10c76487bc3036b diff --git a/src/genome-maps.html b/src/genome-maps.html index e5d20cb..6d66ca6 100755 --- a/src/genome-maps.html +++ b/src/genome-maps.html @@ -8,14 +8,14 @@ - - - + + + - + @@ -31,23 +31,27 @@ - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + From 352684d2497a18ec434add79687f4dbb4a7fc0b9 Mon Sep 17 00:00:00 2001 From: Francisco Salavert Torres Date: Wed, 25 Sep 2013 00:45:35 +0200 Subject: [PATCH 04/61] jsorolla update --- lib/jsorolla | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/jsorolla b/lib/jsorolla index eb80b4c..38f66fc 160000 --- a/lib/jsorolla +++ b/lib/jsorolla @@ -1 +1 @@ -Subproject commit eb80b4cc48ab1d66a605c582a10c76487bc3036b +Subproject commit 38f66fc05f4c626715d7d019e0e0b1bec6b34546 From 8d5d868018844177b4c947eafa6d3fb3b0562469 Mon Sep 17 00:00:00 2001 From: Francisco Salavert Torres Date: Wed, 25 Sep 2013 00:48:00 +0200 Subject: [PATCH 05/61] jsorolla updated --- lib/jsorolla | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/jsorolla b/lib/jsorolla index 38f66fc..3f335d9 160000 --- a/lib/jsorolla +++ b/lib/jsorolla @@ -1 +1 @@ -Subproject commit 38f66fc05f4c626715d7d019e0e0b1bec6b34546 +Subproject commit 3f335d9d01a1305ed27350b371e4d14e2f974d16 From 4c32f7f72e47dd30f058de87311dd42b1202bf77 Mon Sep 17 00:00:00 2001 From: Francisco Salavert Torres Date: Fri, 27 Sep 2013 16:21:16 +0200 Subject: [PATCH 06/61] OpencgaManager fixes, and Gruntfile now calls jsorolla Grunfile --- Gruntfile.js | 98 +- genome-maps.html | 88 - lib/jsorolla | 2 +- package.json | 5 +- src/genome-maps.html | 91 +- src/genome-maps.js | 15 +- src/gm-config.js | 1 + src/gm-status-bar.js | 3 +- src/old.html | 257 - styles/css/style.css | 1166 -- styles/fonts/lato.woff | Bin 50112 -> 0 bytes styles/fonts/oxygen.woff | Bin 23336 -> 0 bytes styles/fonts/sourcesanspro.woff | Bin 29448 -> 0 bytes styles/fonts/ubuntu.woff | Bin 42892 -> 0 bytes styles/fonts/ubuntumono.woff | Bin 27392 -> 0 bytes styles/img/edgetype.png | Bin 176 -> 0 bytes styles/img/equals.png | Bin 217 -> 0 bytes styles/img/find.png | Bin 611 -> 0 bytes styles/img/go.gif | Bin 998 -> 0 bytes styles/img/greater_than.png | Bin 359 -> 0 bytes styles/img/grid.png | Bin 513 -> 0 bytes styles/img/hidetrack.png | Bin 273 -> 0 bytes styles/img/icon-auto-select.png | Bin 246 -> 0 bytes styles/img/icon-background.png | Bin 219 -> 0 bytes styles/img/icon-collapse.png | Bin 265 -> 0 bytes styles/img/icon-layout.png | Bin 207 -> 0 bytes styles/img/icon-order-asc.png | Bin 172 -> 0 bytes styles/img/icon-order-desc.png | Bin 175 -> 0 bytes styles/img/icon-order.png | Bin 196 -> 0 bytes styles/img/icon-project-all.png | Bin 243 -> 0 bytes styles/img/icon-project-delete.png | Bin 240 -> 0 bytes styles/img/icons.png | Bin 12349 -> 0 bytes styles/img/jfk_sprite22.png | Bin 14012 -> 0 bytes styles/img/jfk_sprite40.png | Bin 18837 -> 0 bytes styles/img/label-size.png | Bin 259 -> 0 bytes styles/img/less_than.png | Bin 354 -> 0 bytes styles/img/local.png | Bin 240 -> 0 bytes styles/img/loginhelp.png | Bin 18170 -> 0 bytes styles/img/loginhelpbutton.png | Bin 7109 -> 0 bytes styles/img/movetrackdown.png | Bin 192 -> 0 bytes styles/img/movetrackup.png | Bin 190 -> 0 bytes styles/img/ocb-grab-track-resize.png | Bin 173 -> 0 bytes styles/img/ocb-icon-arrow-e-bold.png | Bin 562 -> 0 bytes styles/img/ocb-icon-arrow-e.png | Bin 612 -> 0 bytes styles/img/ocb-icon-arrow-n-bold.png | Bin 617 -> 0 bytes styles/img/ocb-icon-arrow-w-bold.png | Bin 557 -> 0 bytes styles/img/ocb-icon-arrow-w.png | Bin 556 -> 0 bytes styles/img/ocb-icon-chromosome.png | Bin 287 -> 0 bytes styles/img/ocb-icon-clock.png | Bin 3180 -> 0 bytes styles/img/ocb-icon-collapse.png | Bin 516 -> 0 bytes styles/img/ocb-icon-expand.png | Bin 492 -> 0 bytes styles/img/ocb-icon-find.png | Bin 611 -> 0 bytes styles/img/ocb-icon-gear.png | Bin 370 -> 0 bytes styles/img/ocb-icon-karyotype.png | Bin 231 -> 0 bytes styles/img/ocb-icon-minus.png | Bin 151 -> 0 bytes styles/img/ocb-icon-plus.png | Bin 184 -> 0 bytes styles/img/ocb-icon-region.png | Bin 167 -> 0 bytes styles/img/ocb-icon-repeat.png | Bin 3117 -> 0 bytes styles/img/ocb-icon-track-autoheight.png | Bin 371 -> 0 bytes styles/img/opacity.png | Bin 174 -> 0 bytes styles/img/resize.png | Bin 242 -> 0 bytes styles/img/save.png | Bin 282 -> 0 bytes styles/img/sbgn-logo.png | Bin 1478 -> 0 bytes styles/img/sbgn.png | Bin 1309 -> 0 bytes styles/img/sprite_black2.png | Bin 2763 -> 0 bytes styles/img/tools-sprites-trans.gif | Bin 2843 -> 0 bytes styles/img/wordle_tuned_white_crop.jpg | Bin 122709 -> 0 bytes vendor/ChemDoodleWeb.css | 3 - vendor/ChemDoodleWeb.js | 450 - vendor/backbone-min.js | 4 - vendor/backbone-min.map | 1 - vendor/genome-viewer-1.0.2.js | 12699 ---------------- vendor/genome-viewer-1.0.2.min.js | 11 - vendor/gl-matrix-min.js | 28 - vendor/glyphicons-halflings-white.png | Bin 8777 -> 0 bytes vendor/glyphicons-halflings.png | Bin 12799 -> 0 bytes .../smoothgray/images/animated-overlay.gif | Bin 1738 -> 0 bytes .../images/ui-bg_flat_0_aaaaaa_40x100.png | Bin 212 -> 0 bytes .../images/ui-bg_flat_100_ffffff_40x100.png | Bin 208 -> 0 bytes .../images/ui-bg_glass_55_fbf9ee_1x400.png | Bin 335 -> 0 bytes .../images/ui-bg_glass_95_fef1ec_1x400.png | Bin 332 -> 0 bytes .../ui-bg_highlight-hard_100_E5E5E5_1x100.png | Bin 252 -> 0 bytes .../ui-bg_highlight-hard_100_e9e9e9_1x100.png | Bin 252 -> 0 bytes .../ui-bg_highlight-hard_100_eeeeee_1x100.png | Bin 252 -> 0 bytes .../ui-bg_inset-hard_80_dadada_1x100.png | Bin 253 -> 0 bytes .../images/ui-icons_222222_256x240.png | Bin 6922 -> 0 bytes .../images/ui-icons_2e83ff_256x240.png | Bin 4549 -> 0 bytes .../images/ui-icons_454545_256x240.png | Bin 6992 -> 0 bytes .../images/ui-icons_888888_256x240.png | Bin 6999 -> 0 bytes .../images/ui-icons_cd0a0a_256x240.png | Bin 4549 -> 0 bytes .../smoothgray/jquery-ui-1.10.3.custom.css | 1172 -- .../jquery-ui-1.10.3.custom.min.css | 5 - .../development-bundle/AUTHORS.txt | 245 - .../development-bundle/Gruntfile.js | 378 - .../development-bundle/MIT-LICENSE.txt | 26 - .../development-bundle/README.md | 99 - .../demos/accordion/collapsible.html | 50 - .../demos/accordion/custom-icons.html | 64 - .../demos/accordion/default.html | 80 - .../demos/accordion/fillspace.html | 72 - .../demos/accordion/hoverintent.html | 148 - .../demos/accordion/index.html | 20 - .../demos/accordion/no-auto-height.html | 50 - .../demos/accordion/sortable.html | 74 - .../demos/autocomplete/categories.html | 67 - .../demos/autocomplete/combobox.html | 213 - .../demos/autocomplete/custom-data.html | 90 - .../demos/autocomplete/default.html | 58 - .../demos/autocomplete/folding.html | 56 - .../autocomplete/images/jquery_32x32.png | Bin 1417 -> 0 bytes .../autocomplete/images/jqueryui_32x32.png | Bin 1193 -> 0 bytes .../autocomplete/images/sizzlejs_32x32.png | Bin 999 -> 0 bytes .../autocomplete/images/transparent_1x1.png | Bin 95 -> 0 bytes .../images/ui-anim_basic_16x16.gif | Bin 1459 -> 0 bytes .../demos/autocomplete/index.html | 25 - .../demos/autocomplete/london.xml | 114 - .../demos/autocomplete/maxheight.html | 71 - .../demos/autocomplete/multiple-remote.html | 80 - .../demos/autocomplete/multiple.html | 93 - .../demos/autocomplete/remote-jsonp.html | 82 - .../demos/autocomplete/remote-with-cache.html | 52 - .../demos/autocomplete/remote.html | 55 - .../demos/autocomplete/search.php | 590 - .../demos/autocomplete/xml.html | 66 - .../demos/button/checkbox.html | 37 - .../demos/button/default.html | 34 - .../demos/button/icons.html | 49 - .../demos/button/index.html | 19 - .../demos/button/radio.html | 32 - .../demos/button/splitbutton.html | 69 - .../demos/button/toolbar.html | 118 - .../demos/datepicker/alt-field.html | 29 - .../demos/datepicker/animation.html | 51 - .../demos/datepicker/buttonbar.html | 28 - .../demos/datepicker/date-formats.html | 40 - .../demos/datepicker/date-range.html | 44 - .../demos/datepicker/default.html | 26 - .../demos/datepicker/dropdown-month-year.html | 29 - .../demos/datepicker/icon-trigger.html | 30 - .../demos/datepicker/images/calendar.gif | Bin 269 -> 0 bytes .../demos/datepicker/index.html | 27 - .../demos/datepicker/inline.html | 26 - .../datepicker/jquery.ui.datepicker-ar.js | 23 - .../datepicker/jquery.ui.datepicker-fr.js | 25 - .../datepicker/jquery.ui.datepicker-he.js | 23 - .../datepicker/jquery.ui.datepicker-zh-TW.js | 23 - .../demos/datepicker/localization.html | 41 - .../demos/datepicker/min-max.html | 26 - .../demos/datepicker/multiple-calendars.html | 29 - .../demos/datepicker/other-months.html | 30 - .../demos/datepicker/show-week.html | 32 - .../development-bundle/demos/demos.css | 19 - .../demos/dialog/animated.html | 52 - .../demos/dialog/default.html | 33 - .../demos/dialog/index.html | 19 - .../demos/dialog/modal-confirmation.html | 47 - .../demos/dialog/modal-form.html | 157 - .../demos/dialog/modal-message.html | 49 - .../demos/dialog/modal.html | 38 - .../demos/draggable/constrain-movement.html | 58 - .../demos/draggable/cursor-style.html | 42 - .../demos/draggable/default.html | 32 - .../demos/draggable/delay-start.html | 38 - .../demos/draggable/events.html | 70 - .../demos/draggable/handle.html | 41 - .../demos/draggable/index.html | 24 - .../demos/draggable/revert.html | 37 - .../demos/draggable/scroll.html | 44 - .../demos/draggable/snap-to.html | 61 - .../demos/draggable/sortable.html | 50 - .../demos/draggable/visual-feedback.html | 70 - .../demos/images/calendar.gif | Bin 269 -> 0 bytes .../demos/images/demo-config-on-tile.gif | Bin 172 -> 0 bytes .../demos/images/demo-config-on.gif | Bin 335 -> 0 bytes .../demos/images/demo-spindown-closed.gif | Bin 103 -> 0 bytes .../demos/images/demo-spindown-open.gif | Bin 105 -> 0 bytes .../demos/images/icon-docs-info.gif | Bin 206 -> 0 bytes .../demos/images/pbar-ani.gif | Bin 7970 -> 0 bytes .../demos/menu/default.html | 67 - .../development-bundle/demos/menu/icons.html | 44 - .../development-bundle/demos/menu/index.html | 15 - .../demos/position/cycler.html | 107 - .../demos/position/default.html | 137 - .../demos/position/images/earth.jpg | Bin 29850 -> 0 bytes .../demos/position/images/flight.jpg | Bin 33637 -> 0 bytes .../demos/position/images/rocket.jpg | Bin 32986 -> 0 bytes .../demos/position/index.html | 15 - .../demos/progressbar/default.html | 28 - .../demos/progressbar/images/pbar-ani.gif | Bin 7970 -> 0 bytes .../demos/progressbar/indeterminate.html | 53 - .../demos/progressbar/index.html | 16 - .../demos/progressbar/label.html | 61 - .../demos/resizable/animate.html | 36 - .../demos/resizable/aspect-ratio.html | 35 - .../demos/resizable/constrain-area.html | 40 - .../demos/resizable/default.html | 33 - .../demos/resizable/delay-start.html | 45 - .../demos/resizable/helper.html | 36 - .../demos/resizable/index.html | 24 - .../demos/resizable/max-min.html | 38 - .../demos/resizable/snap-to-grid.html | 35 - .../demos/resizable/synchronous-resize.html | 42 - .../demos/resizable/textarea.html | 34 - .../demos/resizable/visual-feedback.html | 36 - .../demos/slider/colorpicker.html | 87 - .../demos/slider/default.html | 27 - .../demos/slider/hotelrooms.html | 49 - .../demos/slider/index.html | 24 - .../demos/slider/multiple-vertical.html | 69 - .../demos/slider/range-vertical.html | 41 - .../demos/slider/range.html | 42 - .../demos/slider/rangemax.html | 40 - .../demos/slider/rangemin.html | 41 - .../demos/slider/side-scroll.html | 131 - .../demos/slider/slider-vertical.html | 42 - .../demos/slider/steps.html | 41 - .../demos/spinner/currency.html | 52 - .../demos/spinner/decimal.html | 56 - .../demos/spinner/default.html | 64 - .../demos/spinner/index.html | 19 - .../demos/spinner/latlong.html | 57 - .../demos/spinner/overflow.html | 44 - .../demos/spinner/time.html | 74 - .../development-bundle/demos/tabs/ajax.html | 46 - .../demos/tabs/ajax/content1.html | 4 - .../demos/tabs/ajax/content2.html | 4 - .../demos/tabs/ajax/content3-slow.php | 7 - .../demos/tabs/ajax/content4-broken.php | 3 - .../development-bundle/demos/tabs/bottom.html | 58 - .../demos/tabs/collapsible.html | 48 - .../demos/tabs/default.html | 42 - .../development-bundle/demos/tabs/index.html | 20 - .../demos/tabs/manipulation.html | 122 - .../demos/tabs/mouseover.html | 44 - .../demos/tabs/sortable.html | 51 - .../demos/tabs/vertical.html | 54 - .../demos/tooltip/ajax/content1.html | 1 - .../demos/tooltip/ajax/content2.html | 1 - .../demos/tooltip/custom-animation.html | 54 - .../demos/tooltip/custom-content.html | 83 - .../demos/tooltip/custom-style.html | 95 - .../demos/tooltip/default.html | 40 - .../demos/tooltip/forms.html | 65 - .../demos/tooltip/images/st-stephens.jpg | Bin 17724 -> 0 bytes .../demos/tooltip/images/tower-bridge.jpg | Bin 15764 -> 0 bytes .../demos/tooltip/index.html | 20 - .../demos/tooltip/tracking.html | 42 - .../demos/tooltip/video-player.html | 117 - .../demos/widget/default.html | 178 - .../demos/widget/index.html | 14 - .../development-bundle/docs/accordion.html | 488 - .../development-bundle/docs/autocomplete.html | 577 - .../development-bundle/docs/button.html | 272 - .../development-bundle/docs/datepicker.html | 946 -- .../development-bundle/docs/dialog.html | 892 -- .../development-bundle/docs/draggable.html | 741 - .../docs/jQuery.widget.html | 611 - .../development-bundle/docs/menu.html | 644 - .../development-bundle/docs/mouse.html | 216 - .../development-bundle/docs/position.html | 116 - .../development-bundle/docs/progressbar.html | 337 - .../development-bundle/docs/resizable.html | 685 - .../development-bundle/docs/slider.html | 586 - .../development-bundle/docs/spinner.html | 572 - .../development-bundle/docs/tabs.html | 635 - .../development-bundle/docs/tooltip.html | 465 - .../external/globalize.culture.de-DE.js | 81 - .../external/globalize.culture.ja-JP.js | 100 - .../development-bundle/external/globalize.js | 1573 -- .../external/jquery.mousewheel.js | 101 - .../development-bundle/external/jshint.js | 4835 ------ .../development-bundle/external/qunit.css | 244 - .../development-bundle/external/qunit.js | 2152 --- .../development-bundle/jquery-1.9.1.js | 9597 ------------ .../development-bundle/package.json | 70 - .../themes/base/images/animated-overlay.gif | Bin 1738 -> 0 bytes .../images/ui-bg_flat_0_aaaaaa_40x100.png | Bin 180 -> 0 bytes .../images/ui-bg_flat_75_ffffff_40x100.png | Bin 178 -> 0 bytes .../images/ui-bg_glass_55_fbf9ee_1x400.png | Bin 120 -> 0 bytes .../images/ui-bg_glass_65_ffffff_1x400.png | Bin 105 -> 0 bytes .../images/ui-bg_glass_75_dadada_1x400.png | Bin 111 -> 0 bytes .../images/ui-bg_glass_75_e6e6e6_1x400.png | Bin 110 -> 0 bytes .../images/ui-bg_glass_95_fef1ec_1x400.png | Bin 119 -> 0 bytes .../ui-bg_highlight-soft_75_cccccc_1x100.png | Bin 101 -> 0 bytes .../base/images/ui-icons_222222_256x240.png | Bin 4369 -> 0 bytes .../base/images/ui-icons_2e83ff_256x240.png | Bin 4369 -> 0 bytes .../base/images/ui-icons_454545_256x240.png | Bin 4369 -> 0 bytes .../base/images/ui-icons_888888_256x240.png | Bin 4369 -> 0 bytes .../base/images/ui-icons_cd0a0a_256x240.png | Bin 4369 -> 0 bytes .../themes/base/jquery-ui.css | 1171 -- .../themes/base/jquery.ui.accordion.css | 38 - .../themes/base/jquery.ui.all.css | 12 - .../themes/base/jquery.ui.autocomplete.css | 16 - .../themes/base/jquery.ui.base.css | 25 - .../themes/base/jquery.ui.button.css | 114 - .../themes/base/jquery.ui.core.css | 93 - .../themes/base/jquery.ui.datepicker.css | 178 - .../themes/base/jquery.ui.dialog.css | 69 - .../themes/base/jquery.ui.menu.css | 79 - .../themes/base/jquery.ui.progressbar.css | 28 - .../themes/base/jquery.ui.resizable.css | 78 - .../themes/base/jquery.ui.slider.css | 73 - .../themes/base/jquery.ui.spinner.css | 65 - .../themes/base/jquery.ui.tabs.css | 52 - .../themes/base/jquery.ui.theme.css | 406 - .../themes/base/jquery.ui.tooltip.css | 19 - .../base/minified/images/animated-overlay.gif | Bin 1738 -> 0 bytes .../images/ui-bg_flat_0_aaaaaa_40x100.png | Bin 180 -> 0 bytes .../images/ui-bg_flat_75_ffffff_40x100.png | Bin 178 -> 0 bytes .../images/ui-bg_glass_55_fbf9ee_1x400.png | Bin 120 -> 0 bytes .../images/ui-bg_glass_65_ffffff_1x400.png | Bin 105 -> 0 bytes .../images/ui-bg_glass_75_dadada_1x400.png | Bin 111 -> 0 bytes .../images/ui-bg_glass_75_e6e6e6_1x400.png | Bin 110 -> 0 bytes .../images/ui-bg_glass_95_fef1ec_1x400.png | Bin 119 -> 0 bytes .../ui-bg_highlight-soft_75_cccccc_1x100.png | Bin 101 -> 0 bytes .../images/ui-icons_222222_256x240.png | Bin 4369 -> 0 bytes .../images/ui-icons_2e83ff_256x240.png | Bin 4369 -> 0 bytes .../images/ui-icons_454545_256x240.png | Bin 4369 -> 0 bytes .../images/ui-icons_888888_256x240.png | Bin 4369 -> 0 bytes .../images/ui-icons_cd0a0a_256x240.png | Bin 4369 -> 0 bytes .../themes/base/minified/jquery-ui.min.css | 10 - .../base/minified/jquery.ui.accordion.min.css | 5 - .../minified/jquery.ui.autocomplete.min.css | 5 - .../base/minified/jquery.ui.button.min.css | 5 - .../base/minified/jquery.ui.core.min.css | 5 - .../minified/jquery.ui.datepicker.min.css | 5 - .../base/minified/jquery.ui.dialog.min.css | 5 - .../base/minified/jquery.ui.menu.min.css | 5 - .../minified/jquery.ui.progressbar.min.css | 5 - .../base/minified/jquery.ui.resizable.min.css | 5 - .../base/minified/jquery.ui.slider.min.css | 5 - .../base/minified/jquery.ui.spinner.min.css | 5 - .../base/minified/jquery.ui.tabs.min.css | 5 - .../base/minified/jquery.ui.theme.min.css | 5 - .../base/minified/jquery.ui.tooltip.min.css | 5 - .../smoothgray/images/animated-overlay.gif | Bin 1738 -> 0 bytes .../images/ui-bg_flat_0_aaaaaa_40x100.png | Bin 212 -> 0 bytes .../images/ui-bg_flat_100_ffffff_40x100.png | Bin 208 -> 0 bytes .../images/ui-bg_glass_55_fbf9ee_1x400.png | Bin 335 -> 0 bytes .../images/ui-bg_glass_95_fef1ec_1x400.png | Bin 332 -> 0 bytes .../ui-bg_highlight-hard_100_E5E5E5_1x100.png | Bin 252 -> 0 bytes .../ui-bg_highlight-hard_100_e9e9e9_1x100.png | Bin 252 -> 0 bytes .../ui-bg_highlight-hard_100_eeeeee_1x100.png | Bin 252 -> 0 bytes .../ui-bg_inset-hard_80_dadada_1x100.png | Bin 253 -> 0 bytes .../images/ui-icons_222222_256x240.png | Bin 6922 -> 0 bytes .../images/ui-icons_2e83ff_256x240.png | Bin 4549 -> 0 bytes .../images/ui-icons_454545_256x240.png | Bin 6992 -> 0 bytes .../images/ui-icons_888888_256x240.png | Bin 6999 -> 0 bytes .../images/ui-icons_cd0a0a_256x240.png | Bin 4549 -> 0 bytes .../themes/smoothgray/jquery-ui.css | 1172 -- .../themes/smoothgray/jquery.ui.accordion.css | 38 - .../themes/smoothgray/jquery.ui.all.css | 12 - .../smoothgray/jquery.ui.autocomplete.css | 16 - .../themes/smoothgray/jquery.ui.base.css | 25 - .../themes/smoothgray/jquery.ui.button.css | 114 - .../themes/smoothgray/jquery.ui.core.css | 93 - .../smoothgray/jquery.ui.datepicker.css | 178 - .../themes/smoothgray/jquery.ui.dialog.css | 69 - .../themes/smoothgray/jquery.ui.menu.css | 79 - .../smoothgray/jquery.ui.progressbar.css | 28 - .../themes/smoothgray/jquery.ui.resizable.css | 78 - .../themes/smoothgray/jquery.ui.slider.css | 73 - .../themes/smoothgray/jquery.ui.spinner.css | 65 - .../themes/smoothgray/jquery.ui.tabs.css | 52 - .../themes/smoothgray/jquery.ui.theme.css | 406 - .../themes/smoothgray/jquery.ui.tooltip.css | 19 - .../minified/images/animated-overlay.gif | Bin 1738 -> 0 bytes .../images/ui-bg_flat_0_aaaaaa_40x100.png | Bin 212 -> 0 bytes .../images/ui-bg_flat_100_ffffff_40x100.png | Bin 208 -> 0 bytes .../images/ui-bg_glass_55_fbf9ee_1x400.png | Bin 335 -> 0 bytes .../images/ui-bg_glass_95_fef1ec_1x400.png | Bin 332 -> 0 bytes .../ui-bg_highlight-hard_100_E5E5E5_1x100.png | Bin 252 -> 0 bytes .../ui-bg_highlight-hard_100_e9e9e9_1x100.png | Bin 252 -> 0 bytes .../ui-bg_highlight-hard_100_eeeeee_1x100.png | Bin 252 -> 0 bytes .../ui-bg_inset-hard_80_dadada_1x100.png | Bin 253 -> 0 bytes .../images/ui-icons_222222_256x240.png | Bin 6922 -> 0 bytes .../images/ui-icons_2e83ff_256x240.png | Bin 4549 -> 0 bytes .../images/ui-icons_454545_256x240.png | Bin 6992 -> 0 bytes .../images/ui-icons_888888_256x240.png | Bin 6999 -> 0 bytes .../images/ui-icons_cd0a0a_256x240.png | Bin 4549 -> 0 bytes .../smoothgray/minified/jquery-ui.min.css | 5 - .../minified/jquery.ui.accordion.min.css | 5 - .../minified/jquery.ui.autocomplete.min.css | 5 - .../minified/jquery.ui.button.min.css | 5 - .../minified/jquery.ui.core.min.css | 5 - .../minified/jquery.ui.datepicker.min.css | 5 - .../minified/jquery.ui.dialog.min.css | 5 - .../minified/jquery.ui.menu.min.css | 5 - .../minified/jquery.ui.progressbar.min.css | 5 - .../minified/jquery.ui.resizable.min.css | 5 - .../minified/jquery.ui.slider.min.css | 5 - .../minified/jquery.ui.spinner.min.css | 5 - .../minified/jquery.ui.tabs.min.css | 5 - .../minified/jquery.ui.theme.min.css | 5 - .../minified/jquery.ui.tooltip.min.css | 5 - .../ui.accordion.jquery.json | 67 - .../ui.autocomplete.jquery.json | 69 - .../development-bundle/ui.button.jquery.json | 66 - .../development-bundle/ui.core.jquery.json | 61 - .../ui.datepicker.jquery.json | 66 - .../development-bundle/ui.dialog.jquery.json | 70 - .../ui.draggable.jquery.json | 66 - .../development-bundle/ui.menu.jquery.json | 66 - .../development-bundle/ui.mouse.jquery.json | 64 - .../ui.position.jquery.json | 66 - .../ui.progressbar.jquery.json | 65 - .../ui.resizable.jquery.json | 65 - .../development-bundle/ui.slider.jquery.json | 67 - .../development-bundle/ui.spinner.jquery.json | 68 - .../development-bundle/ui.tabs.jquery.json | 67 - .../development-bundle/ui.tooltip.jquery.json | 64 - .../development-bundle/ui.widget.jquery.json | 64 - .../ui/i18n/jquery-ui-i18n.js | 1793 --- .../ui/i18n/jquery.ui.datepicker-af.js | 23 - .../ui/i18n/jquery.ui.datepicker-ar-DZ.js | 23 - .../ui/i18n/jquery.ui.datepicker-ar.js | 23 - .../ui/i18n/jquery.ui.datepicker-az.js | 23 - .../ui/i18n/jquery.ui.datepicker-be.js | 23 - .../ui/i18n/jquery.ui.datepicker-bg.js | 24 - .../ui/i18n/jquery.ui.datepicker-bs.js | 23 - .../ui/i18n/jquery.ui.datepicker-ca.js | 23 - .../ui/i18n/jquery.ui.datepicker-cs.js | 23 - .../ui/i18n/jquery.ui.datepicker-cy-GB.js | 23 - .../ui/i18n/jquery.ui.datepicker-da.js | 23 - .../ui/i18n/jquery.ui.datepicker-de.js | 23 - .../ui/i18n/jquery.ui.datepicker-el.js | 23 - .../ui/i18n/jquery.ui.datepicker-en-AU.js | 23 - .../ui/i18n/jquery.ui.datepicker-en-GB.js | 23 - .../ui/i18n/jquery.ui.datepicker-en-NZ.js | 23 - .../ui/i18n/jquery.ui.datepicker-eo.js | 23 - .../ui/i18n/jquery.ui.datepicker-es.js | 23 - .../ui/i18n/jquery.ui.datepicker-et.js | 23 - .../ui/i18n/jquery.ui.datepicker-eu.js | 23 - .../ui/i18n/jquery.ui.datepicker-fa.js | 59 - .../ui/i18n/jquery.ui.datepicker-fi.js | 23 - .../ui/i18n/jquery.ui.datepicker-fo.js | 23 - .../ui/i18n/jquery.ui.datepicker-fr-CA.js | 23 - .../ui/i18n/jquery.ui.datepicker-fr-CH.js | 23 - .../ui/i18n/jquery.ui.datepicker-fr.js | 25 - .../ui/i18n/jquery.ui.datepicker-gl.js | 23 - .../ui/i18n/jquery.ui.datepicker-he.js | 23 - .../ui/i18n/jquery.ui.datepicker-hi.js | 23 - .../ui/i18n/jquery.ui.datepicker-hr.js | 23 - .../ui/i18n/jquery.ui.datepicker-hu.js | 23 - .../ui/i18n/jquery.ui.datepicker-hy.js | 23 - .../ui/i18n/jquery.ui.datepicker-id.js | 23 - .../ui/i18n/jquery.ui.datepicker-is.js | 23 - .../ui/i18n/jquery.ui.datepicker-it.js | 23 - .../ui/i18n/jquery.ui.datepicker-ja.js | 23 - .../ui/i18n/jquery.ui.datepicker-ka.js | 21 - .../ui/i18n/jquery.ui.datepicker-kk.js | 23 - .../ui/i18n/jquery.ui.datepicker-km.js | 23 - .../ui/i18n/jquery.ui.datepicker-ko.js | 23 - .../ui/i18n/jquery.ui.datepicker-ky.js | 24 - .../ui/i18n/jquery.ui.datepicker-lb.js | 23 - .../ui/i18n/jquery.ui.datepicker-lt.js | 23 - .../ui/i18n/jquery.ui.datepicker-lv.js | 23 - .../ui/i18n/jquery.ui.datepicker-mk.js | 23 - .../ui/i18n/jquery.ui.datepicker-ml.js | 23 - .../ui/i18n/jquery.ui.datepicker-ms.js | 23 - .../ui/i18n/jquery.ui.datepicker-nb.js | 22 - .../ui/i18n/jquery.ui.datepicker-nl-BE.js | 23 - .../ui/i18n/jquery.ui.datepicker-nl.js | 23 - .../ui/i18n/jquery.ui.datepicker-nn.js | 22 - .../ui/i18n/jquery.ui.datepicker-no.js | 23 - .../ui/i18n/jquery.ui.datepicker-pl.js | 23 - .../ui/i18n/jquery.ui.datepicker-pt-BR.js | 23 - .../ui/i18n/jquery.ui.datepicker-pt.js | 22 - .../ui/i18n/jquery.ui.datepicker-rm.js | 21 - .../ui/i18n/jquery.ui.datepicker-ro.js | 26 - .../ui/i18n/jquery.ui.datepicker-ru.js | 23 - .../ui/i18n/jquery.ui.datepicker-sk.js | 23 - .../ui/i18n/jquery.ui.datepicker-sl.js | 24 - .../ui/i18n/jquery.ui.datepicker-sq.js | 23 - .../ui/i18n/jquery.ui.datepicker-sr-SR.js | 23 - .../ui/i18n/jquery.ui.datepicker-sr.js | 23 - .../ui/i18n/jquery.ui.datepicker-sv.js | 23 - .../ui/i18n/jquery.ui.datepicker-ta.js | 23 - .../ui/i18n/jquery.ui.datepicker-th.js | 23 - .../ui/i18n/jquery.ui.datepicker-tj.js | 23 - .../ui/i18n/jquery.ui.datepicker-tr.js | 23 - .../ui/i18n/jquery.ui.datepicker-uk.js | 24 - .../ui/i18n/jquery.ui.datepicker-vi.js | 23 - .../ui/i18n/jquery.ui.datepicker-zh-CN.js | 23 - .../ui/i18n/jquery.ui.datepicker-zh-HK.js | 23 - .../ui/i18n/jquery.ui.datepicker-zh-TW.js | 23 - .../development-bundle/ui/jquery-ui.custom.js | 10827 ------------- .../ui/jquery.ui.accordion.js | 572 - .../ui/jquery.ui.autocomplete.js | 610 - .../development-bundle/ui/jquery.ui.button.js | 419 - .../development-bundle/ui/jquery.ui.core.js | 320 - .../ui/jquery.ui.datepicker.js | 2038 --- .../development-bundle/ui/jquery.ui.dialog.js | 808 - .../ui/jquery.ui.draggable.js | 958 -- .../development-bundle/ui/jquery.ui.menu.js | 621 - .../development-bundle/ui/jquery.ui.mouse.js | 169 - .../ui/jquery.ui.position.js | 497 - .../ui/jquery.ui.progressbar.js | 145 - .../ui/jquery.ui.resizable.js | 968 -- .../development-bundle/ui/jquery.ui.slider.js | 672 - .../ui/jquery.ui.spinner.js | 493 - .../development-bundle/ui/jquery.ui.tabs.js | 846 - .../ui/jquery.ui.tooltip.js | 402 - .../development-bundle/ui/jquery.ui.widget.js | 521 - .../ui/minified/i18n/jquery-ui-i18n.min.js | 6 - .../i18n/jquery.ui.datepicker-af.min.js | 4 - .../i18n/jquery.ui.datepicker-ar-DZ.min.js | 4 - .../i18n/jquery.ui.datepicker-ar.min.js | 4 - .../i18n/jquery.ui.datepicker-az.min.js | 4 - .../i18n/jquery.ui.datepicker-be.min.js | 4 - .../i18n/jquery.ui.datepicker-bg.min.js | 4 - .../i18n/jquery.ui.datepicker-bs.min.js | 4 - .../i18n/jquery.ui.datepicker-ca.min.js | 4 - .../i18n/jquery.ui.datepicker-cs.min.js | 4 - .../i18n/jquery.ui.datepicker-cy-GB.min.js | 4 - .../i18n/jquery.ui.datepicker-da.min.js | 4 - .../i18n/jquery.ui.datepicker-de.min.js | 4 - .../i18n/jquery.ui.datepicker-el.min.js | 4 - .../i18n/jquery.ui.datepicker-en-AU.min.js | 4 - .../i18n/jquery.ui.datepicker-en-GB.min.js | 4 - .../i18n/jquery.ui.datepicker-en-NZ.min.js | 4 - .../i18n/jquery.ui.datepicker-eo.min.js | 4 - .../i18n/jquery.ui.datepicker-es.min.js | 4 - .../i18n/jquery.ui.datepicker-et.min.js | 4 - .../i18n/jquery.ui.datepicker-eu.min.js | 4 - .../i18n/jquery.ui.datepicker-fa.min.js | 4 - .../i18n/jquery.ui.datepicker-fi.min.js | 4 - .../i18n/jquery.ui.datepicker-fo.min.js | 4 - .../i18n/jquery.ui.datepicker-fr-CA.min.js | 4 - .../i18n/jquery.ui.datepicker-fr-CH.min.js | 4 - .../i18n/jquery.ui.datepicker-fr.min.js | 4 - .../i18n/jquery.ui.datepicker-gl.min.js | 4 - .../i18n/jquery.ui.datepicker-he.min.js | 4 - .../i18n/jquery.ui.datepicker-hi.min.js | 4 - .../i18n/jquery.ui.datepicker-hr.min.js | 4 - .../i18n/jquery.ui.datepicker-hu.min.js | 4 - .../i18n/jquery.ui.datepicker-hy.min.js | 4 - .../i18n/jquery.ui.datepicker-id.min.js | 4 - .../i18n/jquery.ui.datepicker-is.min.js | 4 - .../i18n/jquery.ui.datepicker-it.min.js | 4 - .../i18n/jquery.ui.datepicker-ja.min.js | 4 - .../i18n/jquery.ui.datepicker-ka.min.js | 4 - .../i18n/jquery.ui.datepicker-kk.min.js | 4 - .../i18n/jquery.ui.datepicker-km.min.js | 4 - .../i18n/jquery.ui.datepicker-ko.min.js | 4 - .../i18n/jquery.ui.datepicker-ky.min.js | 4 - .../i18n/jquery.ui.datepicker-lb.min.js | 4 - .../i18n/jquery.ui.datepicker-lt.min.js | 4 - .../i18n/jquery.ui.datepicker-lv.min.js | 4 - .../i18n/jquery.ui.datepicker-mk.min.js | 4 - .../i18n/jquery.ui.datepicker-ml.min.js | 4 - .../i18n/jquery.ui.datepicker-ms.min.js | 4 - .../i18n/jquery.ui.datepicker-nb.min.js | 4 - .../i18n/jquery.ui.datepicker-nl-BE.min.js | 4 - .../i18n/jquery.ui.datepicker-nl.min.js | 4 - .../i18n/jquery.ui.datepicker-nn.min.js | 4 - .../i18n/jquery.ui.datepicker-no.min.js | 4 - .../i18n/jquery.ui.datepicker-pl.min.js | 4 - .../i18n/jquery.ui.datepicker-pt-BR.min.js | 4 - .../i18n/jquery.ui.datepicker-pt.min.js | 4 - .../i18n/jquery.ui.datepicker-rm.min.js | 4 - .../i18n/jquery.ui.datepicker-ro.min.js | 4 - .../i18n/jquery.ui.datepicker-ru.min.js | 4 - .../i18n/jquery.ui.datepicker-sk.min.js | 4 - .../i18n/jquery.ui.datepicker-sl.min.js | 4 - .../i18n/jquery.ui.datepicker-sq.min.js | 4 - .../i18n/jquery.ui.datepicker-sr-SR.min.js | 4 - .../i18n/jquery.ui.datepicker-sr.min.js | 4 - .../i18n/jquery.ui.datepicker-sv.min.js | 4 - .../i18n/jquery.ui.datepicker-ta.min.js | 4 - .../i18n/jquery.ui.datepicker-th.min.js | 4 - .../i18n/jquery.ui.datepicker-tj.min.js | 4 - .../i18n/jquery.ui.datepicker-tr.min.js | 4 - .../i18n/jquery.ui.datepicker-uk.min.js | 4 - .../i18n/jquery.ui.datepicker-vi.min.js | 4 - .../i18n/jquery.ui.datepicker-zh-CN.min.js | 4 - .../i18n/jquery.ui.datepicker-zh-HK.min.js | 4 - .../i18n/jquery.ui.datepicker-zh-TW.min.js | 4 - .../ui/minified/jquery-ui.custom.min.js | 7 - .../ui/minified/jquery.ui.accordion.min.js | 4 - .../ui/minified/jquery.ui.autocomplete.min.js | 4 - .../ui/minified/jquery.ui.button.min.js | 4 - .../ui/minified/jquery.ui.core.min.js | 4 - .../ui/minified/jquery.ui.datepicker.min.js | 5 - .../ui/minified/jquery.ui.dialog.min.js | 4 - .../ui/minified/jquery.ui.draggable.min.js | 4 - .../ui/minified/jquery.ui.menu.min.js | 4 - .../ui/minified/jquery.ui.mouse.min.js | 4 - .../ui/minified/jquery.ui.position.min.js | 4 - .../ui/minified/jquery.ui.progressbar.min.js | 4 - .../ui/minified/jquery.ui.resizable.min.js | 4 - .../ui/minified/jquery.ui.slider.min.js | 4 - .../ui/minified/jquery.ui.spinner.min.js | 4 - .../ui/minified/jquery.ui.tabs.min.js | 4 - .../ui/minified/jquery.ui.tooltip.min.js | 4 - .../ui/minified/jquery.ui.widget.min.js | 4 - vendor/jquery-ui-1.10.3.custom/index.html | 450 - .../js/jquery-1.9.1.js | 9597 ------------ .../js/jquery-ui-1.10.3.custom.js | 10827 ------------- .../js/jquery-ui-1.10.3.custom.min.js | 7 - vendor/jquery.cookie.js | 90 - vendor/jquery.min.js | 6 - vendor/jquery.min.map | 1 - vendor/jquery.mousewheel.min.js | 12 - vendor/jquery.qtip.min.css | 2 - vendor/jquery.qtip.min.js | 7 - vendor/jquery.sha1.js | 170 - vendor/opencga-1.0.0.js | 5841 ------- vendor/opencga-1.0.0.min.js | 7 - vendor/purl.min.js | 1 - vendor/rawdeflate.js | 2425 --- vendor/underscore-min.js | 1 - vendor/worker-fileupload.js | 359 - 613 files changed, 122 insertions(+), 113524 deletions(-) delete mode 100644 genome-maps.html delete mode 100755 src/old.html delete mode 100644 styles/css/style.css delete mode 100644 styles/fonts/lato.woff delete mode 100644 styles/fonts/oxygen.woff delete mode 100644 styles/fonts/sourcesanspro.woff delete mode 100644 styles/fonts/ubuntu.woff delete mode 100644 styles/fonts/ubuntumono.woff delete mode 100644 styles/img/edgetype.png delete mode 100644 styles/img/equals.png delete mode 100644 styles/img/find.png delete mode 100644 styles/img/go.gif delete mode 100644 styles/img/greater_than.png delete mode 100644 styles/img/grid.png delete mode 100755 styles/img/hidetrack.png delete mode 100644 styles/img/icon-auto-select.png delete mode 100644 styles/img/icon-background.png delete mode 100644 styles/img/icon-collapse.png delete mode 100644 styles/img/icon-layout.png delete mode 100644 styles/img/icon-order-asc.png delete mode 100644 styles/img/icon-order-desc.png delete mode 100644 styles/img/icon-order.png delete mode 100644 styles/img/icon-project-all.png delete mode 100644 styles/img/icon-project-delete.png delete mode 100644 styles/img/icons.png delete mode 100644 styles/img/jfk_sprite22.png delete mode 100644 styles/img/jfk_sprite40.png delete mode 100644 styles/img/label-size.png delete mode 100644 styles/img/less_than.png delete mode 100644 styles/img/local.png delete mode 100644 styles/img/loginhelp.png delete mode 100644 styles/img/loginhelpbutton.png delete mode 100755 styles/img/movetrackdown.png delete mode 100755 styles/img/movetrackup.png delete mode 100644 styles/img/ocb-grab-track-resize.png delete mode 100644 styles/img/ocb-icon-arrow-e-bold.png delete mode 100644 styles/img/ocb-icon-arrow-e.png delete mode 100644 styles/img/ocb-icon-arrow-n-bold.png delete mode 100644 styles/img/ocb-icon-arrow-w-bold.png delete mode 100644 styles/img/ocb-icon-arrow-w.png delete mode 100644 styles/img/ocb-icon-chromosome.png delete mode 100644 styles/img/ocb-icon-clock.png delete mode 100644 styles/img/ocb-icon-collapse.png delete mode 100644 styles/img/ocb-icon-expand.png delete mode 100644 styles/img/ocb-icon-find.png delete mode 100644 styles/img/ocb-icon-gear.png delete mode 100644 styles/img/ocb-icon-karyotype.png delete mode 100644 styles/img/ocb-icon-minus.png delete mode 100644 styles/img/ocb-icon-plus.png delete mode 100644 styles/img/ocb-icon-region.png delete mode 100644 styles/img/ocb-icon-repeat.png delete mode 100644 styles/img/ocb-icon-track-autoheight.png delete mode 100644 styles/img/opacity.png delete mode 100644 styles/img/resize.png delete mode 100644 styles/img/save.png delete mode 100644 styles/img/sbgn-logo.png delete mode 100644 styles/img/sbgn.png delete mode 100644 styles/img/sprite_black2.png delete mode 100644 styles/img/tools-sprites-trans.gif delete mode 100644 styles/img/wordle_tuned_white_crop.jpg delete mode 100644 vendor/ChemDoodleWeb.css delete mode 100644 vendor/ChemDoodleWeb.js delete mode 100644 vendor/backbone-min.js delete mode 100644 vendor/backbone-min.map delete mode 100644 vendor/genome-viewer-1.0.2.js delete mode 100644 vendor/genome-viewer-1.0.2.min.js delete mode 100644 vendor/gl-matrix-min.js delete mode 100644 vendor/glyphicons-halflings-white.png delete mode 100644 vendor/glyphicons-halflings.png delete mode 100644 vendor/jquery-ui-1.10.3.custom/css/smoothgray/images/animated-overlay.gif delete mode 100644 vendor/jquery-ui-1.10.3.custom/css/smoothgray/images/ui-bg_flat_0_aaaaaa_40x100.png delete mode 100644 vendor/jquery-ui-1.10.3.custom/css/smoothgray/images/ui-bg_flat_100_ffffff_40x100.png delete mode 100644 vendor/jquery-ui-1.10.3.custom/css/smoothgray/images/ui-bg_glass_55_fbf9ee_1x400.png delete mode 100644 vendor/jquery-ui-1.10.3.custom/css/smoothgray/images/ui-bg_glass_95_fef1ec_1x400.png delete mode 100644 vendor/jquery-ui-1.10.3.custom/css/smoothgray/images/ui-bg_highlight-hard_100_E5E5E5_1x100.png delete mode 100644 vendor/jquery-ui-1.10.3.custom/css/smoothgray/images/ui-bg_highlight-hard_100_e9e9e9_1x100.png delete mode 100644 vendor/jquery-ui-1.10.3.custom/css/smoothgray/images/ui-bg_highlight-hard_100_eeeeee_1x100.png delete mode 100644 vendor/jquery-ui-1.10.3.custom/css/smoothgray/images/ui-bg_inset-hard_80_dadada_1x100.png delete mode 100644 vendor/jquery-ui-1.10.3.custom/css/smoothgray/images/ui-icons_222222_256x240.png delete mode 100644 vendor/jquery-ui-1.10.3.custom/css/smoothgray/images/ui-icons_2e83ff_256x240.png delete mode 100644 vendor/jquery-ui-1.10.3.custom/css/smoothgray/images/ui-icons_454545_256x240.png delete mode 100644 vendor/jquery-ui-1.10.3.custom/css/smoothgray/images/ui-icons_888888_256x240.png delete mode 100644 vendor/jquery-ui-1.10.3.custom/css/smoothgray/images/ui-icons_cd0a0a_256x240.png delete mode 100644 vendor/jquery-ui-1.10.3.custom/css/smoothgray/jquery-ui-1.10.3.custom.css delete mode 100644 vendor/jquery-ui-1.10.3.custom/css/smoothgray/jquery-ui-1.10.3.custom.min.css delete mode 100644 vendor/jquery-ui-1.10.3.custom/development-bundle/AUTHORS.txt delete mode 100644 vendor/jquery-ui-1.10.3.custom/development-bundle/Gruntfile.js delete mode 100644 vendor/jquery-ui-1.10.3.custom/development-bundle/MIT-LICENSE.txt delete mode 100644 vendor/jquery-ui-1.10.3.custom/development-bundle/README.md delete mode 100644 vendor/jquery-ui-1.10.3.custom/development-bundle/demos/accordion/collapsible.html delete mode 100644 vendor/jquery-ui-1.10.3.custom/development-bundle/demos/accordion/custom-icons.html delete mode 100644 vendor/jquery-ui-1.10.3.custom/development-bundle/demos/accordion/default.html delete mode 100644 vendor/jquery-ui-1.10.3.custom/development-bundle/demos/accordion/fillspace.html delete mode 100644 vendor/jquery-ui-1.10.3.custom/development-bundle/demos/accordion/hoverintent.html delete mode 100644 vendor/jquery-ui-1.10.3.custom/development-bundle/demos/accordion/index.html delete mode 100644 vendor/jquery-ui-1.10.3.custom/development-bundle/demos/accordion/no-auto-height.html delete mode 100644 vendor/jquery-ui-1.10.3.custom/development-bundle/demos/accordion/sortable.html delete mode 100644 vendor/jquery-ui-1.10.3.custom/development-bundle/demos/autocomplete/categories.html delete mode 100644 vendor/jquery-ui-1.10.3.custom/development-bundle/demos/autocomplete/combobox.html delete mode 100644 vendor/jquery-ui-1.10.3.custom/development-bundle/demos/autocomplete/custom-data.html delete mode 100644 vendor/jquery-ui-1.10.3.custom/development-bundle/demos/autocomplete/default.html delete mode 100644 vendor/jquery-ui-1.10.3.custom/development-bundle/demos/autocomplete/folding.html delete mode 100644 vendor/jquery-ui-1.10.3.custom/development-bundle/demos/autocomplete/images/jquery_32x32.png delete mode 100644 vendor/jquery-ui-1.10.3.custom/development-bundle/demos/autocomplete/images/jqueryui_32x32.png delete mode 100644 vendor/jquery-ui-1.10.3.custom/development-bundle/demos/autocomplete/images/sizzlejs_32x32.png delete mode 100644 vendor/jquery-ui-1.10.3.custom/development-bundle/demos/autocomplete/images/transparent_1x1.png delete mode 100644 vendor/jquery-ui-1.10.3.custom/development-bundle/demos/autocomplete/images/ui-anim_basic_16x16.gif delete mode 100644 vendor/jquery-ui-1.10.3.custom/development-bundle/demos/autocomplete/index.html delete mode 100644 vendor/jquery-ui-1.10.3.custom/development-bundle/demos/autocomplete/london.xml delete mode 100644 vendor/jquery-ui-1.10.3.custom/development-bundle/demos/autocomplete/maxheight.html delete mode 100644 vendor/jquery-ui-1.10.3.custom/development-bundle/demos/autocomplete/multiple-remote.html delete mode 100644 vendor/jquery-ui-1.10.3.custom/development-bundle/demos/autocomplete/multiple.html delete mode 100644 vendor/jquery-ui-1.10.3.custom/development-bundle/demos/autocomplete/remote-jsonp.html delete mode 100644 vendor/jquery-ui-1.10.3.custom/development-bundle/demos/autocomplete/remote-with-cache.html delete mode 100644 vendor/jquery-ui-1.10.3.custom/development-bundle/demos/autocomplete/remote.html delete mode 100644 vendor/jquery-ui-1.10.3.custom/development-bundle/demos/autocomplete/search.php delete mode 100644 vendor/jquery-ui-1.10.3.custom/development-bundle/demos/autocomplete/xml.html delete mode 100644 vendor/jquery-ui-1.10.3.custom/development-bundle/demos/button/checkbox.html delete mode 100644 vendor/jquery-ui-1.10.3.custom/development-bundle/demos/button/default.html delete mode 100644 vendor/jquery-ui-1.10.3.custom/development-bundle/demos/button/icons.html delete mode 100644 vendor/jquery-ui-1.10.3.custom/development-bundle/demos/button/index.html delete mode 100644 vendor/jquery-ui-1.10.3.custom/development-bundle/demos/button/radio.html delete mode 100644 vendor/jquery-ui-1.10.3.custom/development-bundle/demos/button/splitbutton.html delete mode 100644 vendor/jquery-ui-1.10.3.custom/development-bundle/demos/button/toolbar.html delete mode 100644 vendor/jquery-ui-1.10.3.custom/development-bundle/demos/datepicker/alt-field.html delete mode 100644 vendor/jquery-ui-1.10.3.custom/development-bundle/demos/datepicker/animation.html delete mode 100644 vendor/jquery-ui-1.10.3.custom/development-bundle/demos/datepicker/buttonbar.html delete mode 100644 vendor/jquery-ui-1.10.3.custom/development-bundle/demos/datepicker/date-formats.html delete mode 100644 vendor/jquery-ui-1.10.3.custom/development-bundle/demos/datepicker/date-range.html delete mode 100644 vendor/jquery-ui-1.10.3.custom/development-bundle/demos/datepicker/default.html delete mode 100644 vendor/jquery-ui-1.10.3.custom/development-bundle/demos/datepicker/dropdown-month-year.html delete mode 100644 vendor/jquery-ui-1.10.3.custom/development-bundle/demos/datepicker/icon-trigger.html delete mode 100644 vendor/jquery-ui-1.10.3.custom/development-bundle/demos/datepicker/images/calendar.gif delete mode 100644 vendor/jquery-ui-1.10.3.custom/development-bundle/demos/datepicker/index.html delete mode 100644 vendor/jquery-ui-1.10.3.custom/development-bundle/demos/datepicker/inline.html delete mode 100644 vendor/jquery-ui-1.10.3.custom/development-bundle/demos/datepicker/jquery.ui.datepicker-ar.js delete mode 100644 vendor/jquery-ui-1.10.3.custom/development-bundle/demos/datepicker/jquery.ui.datepicker-fr.js delete mode 100644 vendor/jquery-ui-1.10.3.custom/development-bundle/demos/datepicker/jquery.ui.datepicker-he.js delete mode 100644 vendor/jquery-ui-1.10.3.custom/development-bundle/demos/datepicker/jquery.ui.datepicker-zh-TW.js delete mode 100644 vendor/jquery-ui-1.10.3.custom/development-bundle/demos/datepicker/localization.html delete mode 100644 vendor/jquery-ui-1.10.3.custom/development-bundle/demos/datepicker/min-max.html delete mode 100644 vendor/jquery-ui-1.10.3.custom/development-bundle/demos/datepicker/multiple-calendars.html delete mode 100644 vendor/jquery-ui-1.10.3.custom/development-bundle/demos/datepicker/other-months.html delete mode 100644 vendor/jquery-ui-1.10.3.custom/development-bundle/demos/datepicker/show-week.html delete mode 100644 vendor/jquery-ui-1.10.3.custom/development-bundle/demos/demos.css delete mode 100644 vendor/jquery-ui-1.10.3.custom/development-bundle/demos/dialog/animated.html delete mode 100644 vendor/jquery-ui-1.10.3.custom/development-bundle/demos/dialog/default.html delete mode 100644 vendor/jquery-ui-1.10.3.custom/development-bundle/demos/dialog/index.html delete mode 100644 vendor/jquery-ui-1.10.3.custom/development-bundle/demos/dialog/modal-confirmation.html delete mode 100644 vendor/jquery-ui-1.10.3.custom/development-bundle/demos/dialog/modal-form.html delete mode 100644 vendor/jquery-ui-1.10.3.custom/development-bundle/demos/dialog/modal-message.html delete mode 100644 vendor/jquery-ui-1.10.3.custom/development-bundle/demos/dialog/modal.html delete mode 100644 vendor/jquery-ui-1.10.3.custom/development-bundle/demos/draggable/constrain-movement.html delete mode 100644 vendor/jquery-ui-1.10.3.custom/development-bundle/demos/draggable/cursor-style.html delete mode 100644 vendor/jquery-ui-1.10.3.custom/development-bundle/demos/draggable/default.html delete mode 100644 vendor/jquery-ui-1.10.3.custom/development-bundle/demos/draggable/delay-start.html delete mode 100644 vendor/jquery-ui-1.10.3.custom/development-bundle/demos/draggable/events.html delete mode 100644 vendor/jquery-ui-1.10.3.custom/development-bundle/demos/draggable/handle.html delete mode 100644 vendor/jquery-ui-1.10.3.custom/development-bundle/demos/draggable/index.html delete mode 100644 vendor/jquery-ui-1.10.3.custom/development-bundle/demos/draggable/revert.html delete mode 100644 vendor/jquery-ui-1.10.3.custom/development-bundle/demos/draggable/scroll.html delete mode 100644 vendor/jquery-ui-1.10.3.custom/development-bundle/demos/draggable/snap-to.html delete mode 100644 vendor/jquery-ui-1.10.3.custom/development-bundle/demos/draggable/sortable.html delete mode 100644 vendor/jquery-ui-1.10.3.custom/development-bundle/demos/draggable/visual-feedback.html delete mode 100644 vendor/jquery-ui-1.10.3.custom/development-bundle/demos/images/calendar.gif delete mode 100644 vendor/jquery-ui-1.10.3.custom/development-bundle/demos/images/demo-config-on-tile.gif delete mode 100644 vendor/jquery-ui-1.10.3.custom/development-bundle/demos/images/demo-config-on.gif delete mode 100644 vendor/jquery-ui-1.10.3.custom/development-bundle/demos/images/demo-spindown-closed.gif delete mode 100644 vendor/jquery-ui-1.10.3.custom/development-bundle/demos/images/demo-spindown-open.gif delete mode 100644 vendor/jquery-ui-1.10.3.custom/development-bundle/demos/images/icon-docs-info.gif delete mode 100644 vendor/jquery-ui-1.10.3.custom/development-bundle/demos/images/pbar-ani.gif delete mode 100644 vendor/jquery-ui-1.10.3.custom/development-bundle/demos/menu/default.html delete mode 100644 vendor/jquery-ui-1.10.3.custom/development-bundle/demos/menu/icons.html delete mode 100644 vendor/jquery-ui-1.10.3.custom/development-bundle/demos/menu/index.html delete mode 100644 vendor/jquery-ui-1.10.3.custom/development-bundle/demos/position/cycler.html delete mode 100644 vendor/jquery-ui-1.10.3.custom/development-bundle/demos/position/default.html delete mode 100644 vendor/jquery-ui-1.10.3.custom/development-bundle/demos/position/images/earth.jpg delete mode 100644 vendor/jquery-ui-1.10.3.custom/development-bundle/demos/position/images/flight.jpg delete mode 100644 vendor/jquery-ui-1.10.3.custom/development-bundle/demos/position/images/rocket.jpg delete mode 100644 vendor/jquery-ui-1.10.3.custom/development-bundle/demos/position/index.html delete mode 100644 vendor/jquery-ui-1.10.3.custom/development-bundle/demos/progressbar/default.html delete mode 100644 vendor/jquery-ui-1.10.3.custom/development-bundle/demos/progressbar/images/pbar-ani.gif delete mode 100644 vendor/jquery-ui-1.10.3.custom/development-bundle/demos/progressbar/indeterminate.html delete mode 100644 vendor/jquery-ui-1.10.3.custom/development-bundle/demos/progressbar/index.html delete mode 100644 vendor/jquery-ui-1.10.3.custom/development-bundle/demos/progressbar/label.html delete mode 100644 vendor/jquery-ui-1.10.3.custom/development-bundle/demos/resizable/animate.html delete mode 100644 vendor/jquery-ui-1.10.3.custom/development-bundle/demos/resizable/aspect-ratio.html delete mode 100644 vendor/jquery-ui-1.10.3.custom/development-bundle/demos/resizable/constrain-area.html delete mode 100644 vendor/jquery-ui-1.10.3.custom/development-bundle/demos/resizable/default.html delete mode 100644 vendor/jquery-ui-1.10.3.custom/development-bundle/demos/resizable/delay-start.html delete mode 100644 vendor/jquery-ui-1.10.3.custom/development-bundle/demos/resizable/helper.html delete mode 100644 vendor/jquery-ui-1.10.3.custom/development-bundle/demos/resizable/index.html delete mode 100644 vendor/jquery-ui-1.10.3.custom/development-bundle/demos/resizable/max-min.html delete mode 100644 vendor/jquery-ui-1.10.3.custom/development-bundle/demos/resizable/snap-to-grid.html delete mode 100644 vendor/jquery-ui-1.10.3.custom/development-bundle/demos/resizable/synchronous-resize.html delete mode 100644 vendor/jquery-ui-1.10.3.custom/development-bundle/demos/resizable/textarea.html delete mode 100644 vendor/jquery-ui-1.10.3.custom/development-bundle/demos/resizable/visual-feedback.html delete mode 100644 vendor/jquery-ui-1.10.3.custom/development-bundle/demos/slider/colorpicker.html delete mode 100644 vendor/jquery-ui-1.10.3.custom/development-bundle/demos/slider/default.html delete mode 100644 vendor/jquery-ui-1.10.3.custom/development-bundle/demos/slider/hotelrooms.html delete mode 100644 vendor/jquery-ui-1.10.3.custom/development-bundle/demos/slider/index.html delete mode 100644 vendor/jquery-ui-1.10.3.custom/development-bundle/demos/slider/multiple-vertical.html delete mode 100644 vendor/jquery-ui-1.10.3.custom/development-bundle/demos/slider/range-vertical.html delete mode 100644 vendor/jquery-ui-1.10.3.custom/development-bundle/demos/slider/range.html delete mode 100644 vendor/jquery-ui-1.10.3.custom/development-bundle/demos/slider/rangemax.html delete mode 100644 vendor/jquery-ui-1.10.3.custom/development-bundle/demos/slider/rangemin.html delete mode 100644 vendor/jquery-ui-1.10.3.custom/development-bundle/demos/slider/side-scroll.html delete mode 100644 vendor/jquery-ui-1.10.3.custom/development-bundle/demos/slider/slider-vertical.html delete mode 100644 vendor/jquery-ui-1.10.3.custom/development-bundle/demos/slider/steps.html delete mode 100644 vendor/jquery-ui-1.10.3.custom/development-bundle/demos/spinner/currency.html delete mode 100644 vendor/jquery-ui-1.10.3.custom/development-bundle/demos/spinner/decimal.html delete mode 100644 vendor/jquery-ui-1.10.3.custom/development-bundle/demos/spinner/default.html delete mode 100644 vendor/jquery-ui-1.10.3.custom/development-bundle/demos/spinner/index.html delete mode 100644 vendor/jquery-ui-1.10.3.custom/development-bundle/demos/spinner/latlong.html delete mode 100644 vendor/jquery-ui-1.10.3.custom/development-bundle/demos/spinner/overflow.html delete mode 100644 vendor/jquery-ui-1.10.3.custom/development-bundle/demos/spinner/time.html delete mode 100644 vendor/jquery-ui-1.10.3.custom/development-bundle/demos/tabs/ajax.html delete mode 100644 vendor/jquery-ui-1.10.3.custom/development-bundle/demos/tabs/ajax/content1.html delete mode 100644 vendor/jquery-ui-1.10.3.custom/development-bundle/demos/tabs/ajax/content2.html delete mode 100644 vendor/jquery-ui-1.10.3.custom/development-bundle/demos/tabs/ajax/content3-slow.php delete mode 100644 vendor/jquery-ui-1.10.3.custom/development-bundle/demos/tabs/ajax/content4-broken.php delete mode 100644 vendor/jquery-ui-1.10.3.custom/development-bundle/demos/tabs/bottom.html delete mode 100644 vendor/jquery-ui-1.10.3.custom/development-bundle/demos/tabs/collapsible.html delete mode 100644 vendor/jquery-ui-1.10.3.custom/development-bundle/demos/tabs/default.html delete mode 100644 vendor/jquery-ui-1.10.3.custom/development-bundle/demos/tabs/index.html delete mode 100644 vendor/jquery-ui-1.10.3.custom/development-bundle/demos/tabs/manipulation.html delete mode 100644 vendor/jquery-ui-1.10.3.custom/development-bundle/demos/tabs/mouseover.html delete mode 100644 vendor/jquery-ui-1.10.3.custom/development-bundle/demos/tabs/sortable.html delete mode 100644 vendor/jquery-ui-1.10.3.custom/development-bundle/demos/tabs/vertical.html delete mode 100644 vendor/jquery-ui-1.10.3.custom/development-bundle/demos/tooltip/ajax/content1.html delete mode 100644 vendor/jquery-ui-1.10.3.custom/development-bundle/demos/tooltip/ajax/content2.html delete mode 100644 vendor/jquery-ui-1.10.3.custom/development-bundle/demos/tooltip/custom-animation.html delete mode 100644 vendor/jquery-ui-1.10.3.custom/development-bundle/demos/tooltip/custom-content.html delete mode 100644 vendor/jquery-ui-1.10.3.custom/development-bundle/demos/tooltip/custom-style.html delete mode 100644 vendor/jquery-ui-1.10.3.custom/development-bundle/demos/tooltip/default.html delete mode 100644 vendor/jquery-ui-1.10.3.custom/development-bundle/demos/tooltip/forms.html delete mode 100644 vendor/jquery-ui-1.10.3.custom/development-bundle/demos/tooltip/images/st-stephens.jpg delete mode 100644 vendor/jquery-ui-1.10.3.custom/development-bundle/demos/tooltip/images/tower-bridge.jpg delete mode 100644 vendor/jquery-ui-1.10.3.custom/development-bundle/demos/tooltip/index.html delete mode 100644 vendor/jquery-ui-1.10.3.custom/development-bundle/demos/tooltip/tracking.html delete mode 100644 vendor/jquery-ui-1.10.3.custom/development-bundle/demos/tooltip/video-player.html delete mode 100644 vendor/jquery-ui-1.10.3.custom/development-bundle/demos/widget/default.html delete mode 100644 vendor/jquery-ui-1.10.3.custom/development-bundle/demos/widget/index.html delete mode 100644 vendor/jquery-ui-1.10.3.custom/development-bundle/docs/accordion.html delete mode 100644 vendor/jquery-ui-1.10.3.custom/development-bundle/docs/autocomplete.html delete mode 100644 vendor/jquery-ui-1.10.3.custom/development-bundle/docs/button.html delete mode 100644 vendor/jquery-ui-1.10.3.custom/development-bundle/docs/datepicker.html delete mode 100644 vendor/jquery-ui-1.10.3.custom/development-bundle/docs/dialog.html delete mode 100644 vendor/jquery-ui-1.10.3.custom/development-bundle/docs/draggable.html delete mode 100644 vendor/jquery-ui-1.10.3.custom/development-bundle/docs/jQuery.widget.html delete mode 100644 vendor/jquery-ui-1.10.3.custom/development-bundle/docs/menu.html delete mode 100644 vendor/jquery-ui-1.10.3.custom/development-bundle/docs/mouse.html delete mode 100644 vendor/jquery-ui-1.10.3.custom/development-bundle/docs/position.html delete mode 100644 vendor/jquery-ui-1.10.3.custom/development-bundle/docs/progressbar.html delete mode 100644 vendor/jquery-ui-1.10.3.custom/development-bundle/docs/resizable.html delete mode 100644 vendor/jquery-ui-1.10.3.custom/development-bundle/docs/slider.html delete mode 100644 vendor/jquery-ui-1.10.3.custom/development-bundle/docs/spinner.html delete mode 100644 vendor/jquery-ui-1.10.3.custom/development-bundle/docs/tabs.html delete mode 100644 vendor/jquery-ui-1.10.3.custom/development-bundle/docs/tooltip.html delete mode 100644 vendor/jquery-ui-1.10.3.custom/development-bundle/external/globalize.culture.de-DE.js delete mode 100644 vendor/jquery-ui-1.10.3.custom/development-bundle/external/globalize.culture.ja-JP.js delete mode 100644 vendor/jquery-ui-1.10.3.custom/development-bundle/external/globalize.js delete mode 100644 vendor/jquery-ui-1.10.3.custom/development-bundle/external/jquery.mousewheel.js delete mode 100644 vendor/jquery-ui-1.10.3.custom/development-bundle/external/jshint.js delete mode 100644 vendor/jquery-ui-1.10.3.custom/development-bundle/external/qunit.css delete mode 100644 vendor/jquery-ui-1.10.3.custom/development-bundle/external/qunit.js delete mode 100644 vendor/jquery-ui-1.10.3.custom/development-bundle/jquery-1.9.1.js delete mode 100644 vendor/jquery-ui-1.10.3.custom/development-bundle/package.json delete mode 100644 vendor/jquery-ui-1.10.3.custom/development-bundle/themes/base/images/animated-overlay.gif delete mode 100644 vendor/jquery-ui-1.10.3.custom/development-bundle/themes/base/images/ui-bg_flat_0_aaaaaa_40x100.png delete mode 100644 vendor/jquery-ui-1.10.3.custom/development-bundle/themes/base/images/ui-bg_flat_75_ffffff_40x100.png delete mode 100644 vendor/jquery-ui-1.10.3.custom/development-bundle/themes/base/images/ui-bg_glass_55_fbf9ee_1x400.png delete mode 100644 vendor/jquery-ui-1.10.3.custom/development-bundle/themes/base/images/ui-bg_glass_65_ffffff_1x400.png delete mode 100644 vendor/jquery-ui-1.10.3.custom/development-bundle/themes/base/images/ui-bg_glass_75_dadada_1x400.png delete mode 100644 vendor/jquery-ui-1.10.3.custom/development-bundle/themes/base/images/ui-bg_glass_75_e6e6e6_1x400.png delete mode 100644 vendor/jquery-ui-1.10.3.custom/development-bundle/themes/base/images/ui-bg_glass_95_fef1ec_1x400.png delete mode 100644 vendor/jquery-ui-1.10.3.custom/development-bundle/themes/base/images/ui-bg_highlight-soft_75_cccccc_1x100.png delete mode 100644 vendor/jquery-ui-1.10.3.custom/development-bundle/themes/base/images/ui-icons_222222_256x240.png delete mode 100644 vendor/jquery-ui-1.10.3.custom/development-bundle/themes/base/images/ui-icons_2e83ff_256x240.png delete mode 100644 vendor/jquery-ui-1.10.3.custom/development-bundle/themes/base/images/ui-icons_454545_256x240.png delete mode 100644 vendor/jquery-ui-1.10.3.custom/development-bundle/themes/base/images/ui-icons_888888_256x240.png delete mode 100644 vendor/jquery-ui-1.10.3.custom/development-bundle/themes/base/images/ui-icons_cd0a0a_256x240.png delete mode 100644 vendor/jquery-ui-1.10.3.custom/development-bundle/themes/base/jquery-ui.css delete mode 100644 vendor/jquery-ui-1.10.3.custom/development-bundle/themes/base/jquery.ui.accordion.css delete mode 100644 vendor/jquery-ui-1.10.3.custom/development-bundle/themes/base/jquery.ui.all.css delete mode 100644 vendor/jquery-ui-1.10.3.custom/development-bundle/themes/base/jquery.ui.autocomplete.css delete mode 100644 vendor/jquery-ui-1.10.3.custom/development-bundle/themes/base/jquery.ui.base.css delete mode 100644 vendor/jquery-ui-1.10.3.custom/development-bundle/themes/base/jquery.ui.button.css delete mode 100644 vendor/jquery-ui-1.10.3.custom/development-bundle/themes/base/jquery.ui.core.css delete mode 100644 vendor/jquery-ui-1.10.3.custom/development-bundle/themes/base/jquery.ui.datepicker.css delete mode 100644 vendor/jquery-ui-1.10.3.custom/development-bundle/themes/base/jquery.ui.dialog.css delete mode 100644 vendor/jquery-ui-1.10.3.custom/development-bundle/themes/base/jquery.ui.menu.css delete mode 100644 vendor/jquery-ui-1.10.3.custom/development-bundle/themes/base/jquery.ui.progressbar.css delete mode 100644 vendor/jquery-ui-1.10.3.custom/development-bundle/themes/base/jquery.ui.resizable.css delete mode 100644 vendor/jquery-ui-1.10.3.custom/development-bundle/themes/base/jquery.ui.slider.css delete mode 100644 vendor/jquery-ui-1.10.3.custom/development-bundle/themes/base/jquery.ui.spinner.css delete mode 100644 vendor/jquery-ui-1.10.3.custom/development-bundle/themes/base/jquery.ui.tabs.css delete mode 100644 vendor/jquery-ui-1.10.3.custom/development-bundle/themes/base/jquery.ui.theme.css delete mode 100644 vendor/jquery-ui-1.10.3.custom/development-bundle/themes/base/jquery.ui.tooltip.css delete mode 100644 vendor/jquery-ui-1.10.3.custom/development-bundle/themes/base/minified/images/animated-overlay.gif delete mode 100644 vendor/jquery-ui-1.10.3.custom/development-bundle/themes/base/minified/images/ui-bg_flat_0_aaaaaa_40x100.png delete mode 100644 vendor/jquery-ui-1.10.3.custom/development-bundle/themes/base/minified/images/ui-bg_flat_75_ffffff_40x100.png delete mode 100644 vendor/jquery-ui-1.10.3.custom/development-bundle/themes/base/minified/images/ui-bg_glass_55_fbf9ee_1x400.png delete mode 100644 vendor/jquery-ui-1.10.3.custom/development-bundle/themes/base/minified/images/ui-bg_glass_65_ffffff_1x400.png delete mode 100644 vendor/jquery-ui-1.10.3.custom/development-bundle/themes/base/minified/images/ui-bg_glass_75_dadada_1x400.png delete mode 100644 vendor/jquery-ui-1.10.3.custom/development-bundle/themes/base/minified/images/ui-bg_glass_75_e6e6e6_1x400.png delete mode 100644 vendor/jquery-ui-1.10.3.custom/development-bundle/themes/base/minified/images/ui-bg_glass_95_fef1ec_1x400.png delete mode 100644 vendor/jquery-ui-1.10.3.custom/development-bundle/themes/base/minified/images/ui-bg_highlight-soft_75_cccccc_1x100.png delete mode 100644 vendor/jquery-ui-1.10.3.custom/development-bundle/themes/base/minified/images/ui-icons_222222_256x240.png delete mode 100644 vendor/jquery-ui-1.10.3.custom/development-bundle/themes/base/minified/images/ui-icons_2e83ff_256x240.png delete mode 100644 vendor/jquery-ui-1.10.3.custom/development-bundle/themes/base/minified/images/ui-icons_454545_256x240.png delete mode 100644 vendor/jquery-ui-1.10.3.custom/development-bundle/themes/base/minified/images/ui-icons_888888_256x240.png delete mode 100644 vendor/jquery-ui-1.10.3.custom/development-bundle/themes/base/minified/images/ui-icons_cd0a0a_256x240.png delete mode 100644 vendor/jquery-ui-1.10.3.custom/development-bundle/themes/base/minified/jquery-ui.min.css delete mode 100644 vendor/jquery-ui-1.10.3.custom/development-bundle/themes/base/minified/jquery.ui.accordion.min.css delete mode 100644 vendor/jquery-ui-1.10.3.custom/development-bundle/themes/base/minified/jquery.ui.autocomplete.min.css delete mode 100644 vendor/jquery-ui-1.10.3.custom/development-bundle/themes/base/minified/jquery.ui.button.min.css delete mode 100644 vendor/jquery-ui-1.10.3.custom/development-bundle/themes/base/minified/jquery.ui.core.min.css delete mode 100644 vendor/jquery-ui-1.10.3.custom/development-bundle/themes/base/minified/jquery.ui.datepicker.min.css delete mode 100644 vendor/jquery-ui-1.10.3.custom/development-bundle/themes/base/minified/jquery.ui.dialog.min.css delete mode 100644 vendor/jquery-ui-1.10.3.custom/development-bundle/themes/base/minified/jquery.ui.menu.min.css delete mode 100644 vendor/jquery-ui-1.10.3.custom/development-bundle/themes/base/minified/jquery.ui.progressbar.min.css delete mode 100644 vendor/jquery-ui-1.10.3.custom/development-bundle/themes/base/minified/jquery.ui.resizable.min.css delete mode 100644 vendor/jquery-ui-1.10.3.custom/development-bundle/themes/base/minified/jquery.ui.slider.min.css delete mode 100644 vendor/jquery-ui-1.10.3.custom/development-bundle/themes/base/minified/jquery.ui.spinner.min.css delete mode 100644 vendor/jquery-ui-1.10.3.custom/development-bundle/themes/base/minified/jquery.ui.tabs.min.css delete mode 100644 vendor/jquery-ui-1.10.3.custom/development-bundle/themes/base/minified/jquery.ui.theme.min.css delete mode 100644 vendor/jquery-ui-1.10.3.custom/development-bundle/themes/base/minified/jquery.ui.tooltip.min.css delete mode 100644 vendor/jquery-ui-1.10.3.custom/development-bundle/themes/smoothgray/images/animated-overlay.gif delete mode 100644 vendor/jquery-ui-1.10.3.custom/development-bundle/themes/smoothgray/images/ui-bg_flat_0_aaaaaa_40x100.png delete mode 100644 vendor/jquery-ui-1.10.3.custom/development-bundle/themes/smoothgray/images/ui-bg_flat_100_ffffff_40x100.png delete mode 100644 vendor/jquery-ui-1.10.3.custom/development-bundle/themes/smoothgray/images/ui-bg_glass_55_fbf9ee_1x400.png delete mode 100644 vendor/jquery-ui-1.10.3.custom/development-bundle/themes/smoothgray/images/ui-bg_glass_95_fef1ec_1x400.png delete mode 100644 vendor/jquery-ui-1.10.3.custom/development-bundle/themes/smoothgray/images/ui-bg_highlight-hard_100_E5E5E5_1x100.png delete mode 100644 vendor/jquery-ui-1.10.3.custom/development-bundle/themes/smoothgray/images/ui-bg_highlight-hard_100_e9e9e9_1x100.png delete mode 100644 vendor/jquery-ui-1.10.3.custom/development-bundle/themes/smoothgray/images/ui-bg_highlight-hard_100_eeeeee_1x100.png delete mode 100644 vendor/jquery-ui-1.10.3.custom/development-bundle/themes/smoothgray/images/ui-bg_inset-hard_80_dadada_1x100.png delete mode 100644 vendor/jquery-ui-1.10.3.custom/development-bundle/themes/smoothgray/images/ui-icons_222222_256x240.png delete mode 100644 vendor/jquery-ui-1.10.3.custom/development-bundle/themes/smoothgray/images/ui-icons_2e83ff_256x240.png delete mode 100644 vendor/jquery-ui-1.10.3.custom/development-bundle/themes/smoothgray/images/ui-icons_454545_256x240.png delete mode 100644 vendor/jquery-ui-1.10.3.custom/development-bundle/themes/smoothgray/images/ui-icons_888888_256x240.png delete mode 100644 vendor/jquery-ui-1.10.3.custom/development-bundle/themes/smoothgray/images/ui-icons_cd0a0a_256x240.png delete mode 100644 vendor/jquery-ui-1.10.3.custom/development-bundle/themes/smoothgray/jquery-ui.css delete mode 100644 vendor/jquery-ui-1.10.3.custom/development-bundle/themes/smoothgray/jquery.ui.accordion.css delete mode 100644 vendor/jquery-ui-1.10.3.custom/development-bundle/themes/smoothgray/jquery.ui.all.css delete mode 100644 vendor/jquery-ui-1.10.3.custom/development-bundle/themes/smoothgray/jquery.ui.autocomplete.css delete mode 100644 vendor/jquery-ui-1.10.3.custom/development-bundle/themes/smoothgray/jquery.ui.base.css delete mode 100644 vendor/jquery-ui-1.10.3.custom/development-bundle/themes/smoothgray/jquery.ui.button.css delete mode 100644 vendor/jquery-ui-1.10.3.custom/development-bundle/themes/smoothgray/jquery.ui.core.css delete mode 100644 vendor/jquery-ui-1.10.3.custom/development-bundle/themes/smoothgray/jquery.ui.datepicker.css delete mode 100644 vendor/jquery-ui-1.10.3.custom/development-bundle/themes/smoothgray/jquery.ui.dialog.css delete mode 100644 vendor/jquery-ui-1.10.3.custom/development-bundle/themes/smoothgray/jquery.ui.menu.css delete mode 100644 vendor/jquery-ui-1.10.3.custom/development-bundle/themes/smoothgray/jquery.ui.progressbar.css delete mode 100644 vendor/jquery-ui-1.10.3.custom/development-bundle/themes/smoothgray/jquery.ui.resizable.css delete mode 100644 vendor/jquery-ui-1.10.3.custom/development-bundle/themes/smoothgray/jquery.ui.slider.css delete mode 100644 vendor/jquery-ui-1.10.3.custom/development-bundle/themes/smoothgray/jquery.ui.spinner.css delete mode 100644 vendor/jquery-ui-1.10.3.custom/development-bundle/themes/smoothgray/jquery.ui.tabs.css delete mode 100644 vendor/jquery-ui-1.10.3.custom/development-bundle/themes/smoothgray/jquery.ui.theme.css delete mode 100644 vendor/jquery-ui-1.10.3.custom/development-bundle/themes/smoothgray/jquery.ui.tooltip.css delete mode 100644 vendor/jquery-ui-1.10.3.custom/development-bundle/themes/smoothgray/minified/images/animated-overlay.gif delete mode 100644 vendor/jquery-ui-1.10.3.custom/development-bundle/themes/smoothgray/minified/images/ui-bg_flat_0_aaaaaa_40x100.png delete mode 100644 vendor/jquery-ui-1.10.3.custom/development-bundle/themes/smoothgray/minified/images/ui-bg_flat_100_ffffff_40x100.png delete mode 100644 vendor/jquery-ui-1.10.3.custom/development-bundle/themes/smoothgray/minified/images/ui-bg_glass_55_fbf9ee_1x400.png delete mode 100644 vendor/jquery-ui-1.10.3.custom/development-bundle/themes/smoothgray/minified/images/ui-bg_glass_95_fef1ec_1x400.png delete mode 100644 vendor/jquery-ui-1.10.3.custom/development-bundle/themes/smoothgray/minified/images/ui-bg_highlight-hard_100_E5E5E5_1x100.png delete mode 100644 vendor/jquery-ui-1.10.3.custom/development-bundle/themes/smoothgray/minified/images/ui-bg_highlight-hard_100_e9e9e9_1x100.png delete mode 100644 vendor/jquery-ui-1.10.3.custom/development-bundle/themes/smoothgray/minified/images/ui-bg_highlight-hard_100_eeeeee_1x100.png delete mode 100644 vendor/jquery-ui-1.10.3.custom/development-bundle/themes/smoothgray/minified/images/ui-bg_inset-hard_80_dadada_1x100.png delete mode 100644 vendor/jquery-ui-1.10.3.custom/development-bundle/themes/smoothgray/minified/images/ui-icons_222222_256x240.png delete mode 100644 vendor/jquery-ui-1.10.3.custom/development-bundle/themes/smoothgray/minified/images/ui-icons_2e83ff_256x240.png delete mode 100644 vendor/jquery-ui-1.10.3.custom/development-bundle/themes/smoothgray/minified/images/ui-icons_454545_256x240.png delete mode 100644 vendor/jquery-ui-1.10.3.custom/development-bundle/themes/smoothgray/minified/images/ui-icons_888888_256x240.png delete mode 100644 vendor/jquery-ui-1.10.3.custom/development-bundle/themes/smoothgray/minified/images/ui-icons_cd0a0a_256x240.png delete mode 100644 vendor/jquery-ui-1.10.3.custom/development-bundle/themes/smoothgray/minified/jquery-ui.min.css delete mode 100644 vendor/jquery-ui-1.10.3.custom/development-bundle/themes/smoothgray/minified/jquery.ui.accordion.min.css delete mode 100644 vendor/jquery-ui-1.10.3.custom/development-bundle/themes/smoothgray/minified/jquery.ui.autocomplete.min.css delete mode 100644 vendor/jquery-ui-1.10.3.custom/development-bundle/themes/smoothgray/minified/jquery.ui.button.min.css delete mode 100644 vendor/jquery-ui-1.10.3.custom/development-bundle/themes/smoothgray/minified/jquery.ui.core.min.css delete mode 100644 vendor/jquery-ui-1.10.3.custom/development-bundle/themes/smoothgray/minified/jquery.ui.datepicker.min.css delete mode 100644 vendor/jquery-ui-1.10.3.custom/development-bundle/themes/smoothgray/minified/jquery.ui.dialog.min.css delete mode 100644 vendor/jquery-ui-1.10.3.custom/development-bundle/themes/smoothgray/minified/jquery.ui.menu.min.css delete mode 100644 vendor/jquery-ui-1.10.3.custom/development-bundle/themes/smoothgray/minified/jquery.ui.progressbar.min.css delete mode 100644 vendor/jquery-ui-1.10.3.custom/development-bundle/themes/smoothgray/minified/jquery.ui.resizable.min.css delete mode 100644 vendor/jquery-ui-1.10.3.custom/development-bundle/themes/smoothgray/minified/jquery.ui.slider.min.css delete mode 100644 vendor/jquery-ui-1.10.3.custom/development-bundle/themes/smoothgray/minified/jquery.ui.spinner.min.css delete mode 100644 vendor/jquery-ui-1.10.3.custom/development-bundle/themes/smoothgray/minified/jquery.ui.tabs.min.css delete mode 100644 vendor/jquery-ui-1.10.3.custom/development-bundle/themes/smoothgray/minified/jquery.ui.theme.min.css delete mode 100644 vendor/jquery-ui-1.10.3.custom/development-bundle/themes/smoothgray/minified/jquery.ui.tooltip.min.css delete mode 100644 vendor/jquery-ui-1.10.3.custom/development-bundle/ui.accordion.jquery.json delete mode 100644 vendor/jquery-ui-1.10.3.custom/development-bundle/ui.autocomplete.jquery.json delete mode 100644 vendor/jquery-ui-1.10.3.custom/development-bundle/ui.button.jquery.json delete mode 100644 vendor/jquery-ui-1.10.3.custom/development-bundle/ui.core.jquery.json delete mode 100644 vendor/jquery-ui-1.10.3.custom/development-bundle/ui.datepicker.jquery.json delete mode 100644 vendor/jquery-ui-1.10.3.custom/development-bundle/ui.dialog.jquery.json delete mode 100644 vendor/jquery-ui-1.10.3.custom/development-bundle/ui.draggable.jquery.json delete mode 100644 vendor/jquery-ui-1.10.3.custom/development-bundle/ui.menu.jquery.json delete mode 100644 vendor/jquery-ui-1.10.3.custom/development-bundle/ui.mouse.jquery.json delete mode 100644 vendor/jquery-ui-1.10.3.custom/development-bundle/ui.position.jquery.json delete mode 100644 vendor/jquery-ui-1.10.3.custom/development-bundle/ui.progressbar.jquery.json delete mode 100644 vendor/jquery-ui-1.10.3.custom/development-bundle/ui.resizable.jquery.json delete mode 100644 vendor/jquery-ui-1.10.3.custom/development-bundle/ui.slider.jquery.json delete mode 100644 vendor/jquery-ui-1.10.3.custom/development-bundle/ui.spinner.jquery.json delete mode 100644 vendor/jquery-ui-1.10.3.custom/development-bundle/ui.tabs.jquery.json delete mode 100644 vendor/jquery-ui-1.10.3.custom/development-bundle/ui.tooltip.jquery.json delete mode 100644 vendor/jquery-ui-1.10.3.custom/development-bundle/ui.widget.jquery.json delete mode 100644 vendor/jquery-ui-1.10.3.custom/development-bundle/ui/i18n/jquery-ui-i18n.js delete mode 100644 vendor/jquery-ui-1.10.3.custom/development-bundle/ui/i18n/jquery.ui.datepicker-af.js delete mode 100644 vendor/jquery-ui-1.10.3.custom/development-bundle/ui/i18n/jquery.ui.datepicker-ar-DZ.js delete mode 100644 vendor/jquery-ui-1.10.3.custom/development-bundle/ui/i18n/jquery.ui.datepicker-ar.js delete mode 100644 vendor/jquery-ui-1.10.3.custom/development-bundle/ui/i18n/jquery.ui.datepicker-az.js delete mode 100644 vendor/jquery-ui-1.10.3.custom/development-bundle/ui/i18n/jquery.ui.datepicker-be.js delete mode 100644 vendor/jquery-ui-1.10.3.custom/development-bundle/ui/i18n/jquery.ui.datepicker-bg.js delete mode 100644 vendor/jquery-ui-1.10.3.custom/development-bundle/ui/i18n/jquery.ui.datepicker-bs.js delete mode 100644 vendor/jquery-ui-1.10.3.custom/development-bundle/ui/i18n/jquery.ui.datepicker-ca.js delete mode 100644 vendor/jquery-ui-1.10.3.custom/development-bundle/ui/i18n/jquery.ui.datepicker-cs.js delete mode 100644 vendor/jquery-ui-1.10.3.custom/development-bundle/ui/i18n/jquery.ui.datepicker-cy-GB.js delete mode 100644 vendor/jquery-ui-1.10.3.custom/development-bundle/ui/i18n/jquery.ui.datepicker-da.js delete mode 100644 vendor/jquery-ui-1.10.3.custom/development-bundle/ui/i18n/jquery.ui.datepicker-de.js delete mode 100644 vendor/jquery-ui-1.10.3.custom/development-bundle/ui/i18n/jquery.ui.datepicker-el.js delete mode 100644 vendor/jquery-ui-1.10.3.custom/development-bundle/ui/i18n/jquery.ui.datepicker-en-AU.js delete mode 100644 vendor/jquery-ui-1.10.3.custom/development-bundle/ui/i18n/jquery.ui.datepicker-en-GB.js delete mode 100644 vendor/jquery-ui-1.10.3.custom/development-bundle/ui/i18n/jquery.ui.datepicker-en-NZ.js delete mode 100644 vendor/jquery-ui-1.10.3.custom/development-bundle/ui/i18n/jquery.ui.datepicker-eo.js delete mode 100644 vendor/jquery-ui-1.10.3.custom/development-bundle/ui/i18n/jquery.ui.datepicker-es.js delete mode 100644 vendor/jquery-ui-1.10.3.custom/development-bundle/ui/i18n/jquery.ui.datepicker-et.js delete mode 100644 vendor/jquery-ui-1.10.3.custom/development-bundle/ui/i18n/jquery.ui.datepicker-eu.js delete mode 100644 vendor/jquery-ui-1.10.3.custom/development-bundle/ui/i18n/jquery.ui.datepicker-fa.js delete mode 100644 vendor/jquery-ui-1.10.3.custom/development-bundle/ui/i18n/jquery.ui.datepicker-fi.js delete mode 100644 vendor/jquery-ui-1.10.3.custom/development-bundle/ui/i18n/jquery.ui.datepicker-fo.js delete mode 100644 vendor/jquery-ui-1.10.3.custom/development-bundle/ui/i18n/jquery.ui.datepicker-fr-CA.js delete mode 100644 vendor/jquery-ui-1.10.3.custom/development-bundle/ui/i18n/jquery.ui.datepicker-fr-CH.js delete mode 100644 vendor/jquery-ui-1.10.3.custom/development-bundle/ui/i18n/jquery.ui.datepicker-fr.js delete mode 100644 vendor/jquery-ui-1.10.3.custom/development-bundle/ui/i18n/jquery.ui.datepicker-gl.js delete mode 100644 vendor/jquery-ui-1.10.3.custom/development-bundle/ui/i18n/jquery.ui.datepicker-he.js delete mode 100644 vendor/jquery-ui-1.10.3.custom/development-bundle/ui/i18n/jquery.ui.datepicker-hi.js delete mode 100644 vendor/jquery-ui-1.10.3.custom/development-bundle/ui/i18n/jquery.ui.datepicker-hr.js delete mode 100644 vendor/jquery-ui-1.10.3.custom/development-bundle/ui/i18n/jquery.ui.datepicker-hu.js delete mode 100644 vendor/jquery-ui-1.10.3.custom/development-bundle/ui/i18n/jquery.ui.datepicker-hy.js delete mode 100644 vendor/jquery-ui-1.10.3.custom/development-bundle/ui/i18n/jquery.ui.datepicker-id.js delete mode 100644 vendor/jquery-ui-1.10.3.custom/development-bundle/ui/i18n/jquery.ui.datepicker-is.js delete mode 100644 vendor/jquery-ui-1.10.3.custom/development-bundle/ui/i18n/jquery.ui.datepicker-it.js delete mode 100644 vendor/jquery-ui-1.10.3.custom/development-bundle/ui/i18n/jquery.ui.datepicker-ja.js delete mode 100644 vendor/jquery-ui-1.10.3.custom/development-bundle/ui/i18n/jquery.ui.datepicker-ka.js delete mode 100644 vendor/jquery-ui-1.10.3.custom/development-bundle/ui/i18n/jquery.ui.datepicker-kk.js delete mode 100644 vendor/jquery-ui-1.10.3.custom/development-bundle/ui/i18n/jquery.ui.datepicker-km.js delete mode 100644 vendor/jquery-ui-1.10.3.custom/development-bundle/ui/i18n/jquery.ui.datepicker-ko.js delete mode 100644 vendor/jquery-ui-1.10.3.custom/development-bundle/ui/i18n/jquery.ui.datepicker-ky.js delete mode 100644 vendor/jquery-ui-1.10.3.custom/development-bundle/ui/i18n/jquery.ui.datepicker-lb.js delete mode 100644 vendor/jquery-ui-1.10.3.custom/development-bundle/ui/i18n/jquery.ui.datepicker-lt.js delete mode 100644 vendor/jquery-ui-1.10.3.custom/development-bundle/ui/i18n/jquery.ui.datepicker-lv.js delete mode 100644 vendor/jquery-ui-1.10.3.custom/development-bundle/ui/i18n/jquery.ui.datepicker-mk.js delete mode 100644 vendor/jquery-ui-1.10.3.custom/development-bundle/ui/i18n/jquery.ui.datepicker-ml.js delete mode 100644 vendor/jquery-ui-1.10.3.custom/development-bundle/ui/i18n/jquery.ui.datepicker-ms.js delete mode 100644 vendor/jquery-ui-1.10.3.custom/development-bundle/ui/i18n/jquery.ui.datepicker-nb.js delete mode 100644 vendor/jquery-ui-1.10.3.custom/development-bundle/ui/i18n/jquery.ui.datepicker-nl-BE.js delete mode 100644 vendor/jquery-ui-1.10.3.custom/development-bundle/ui/i18n/jquery.ui.datepicker-nl.js delete mode 100644 vendor/jquery-ui-1.10.3.custom/development-bundle/ui/i18n/jquery.ui.datepicker-nn.js delete mode 100644 vendor/jquery-ui-1.10.3.custom/development-bundle/ui/i18n/jquery.ui.datepicker-no.js delete mode 100644 vendor/jquery-ui-1.10.3.custom/development-bundle/ui/i18n/jquery.ui.datepicker-pl.js delete mode 100644 vendor/jquery-ui-1.10.3.custom/development-bundle/ui/i18n/jquery.ui.datepicker-pt-BR.js delete mode 100644 vendor/jquery-ui-1.10.3.custom/development-bundle/ui/i18n/jquery.ui.datepicker-pt.js delete mode 100644 vendor/jquery-ui-1.10.3.custom/development-bundle/ui/i18n/jquery.ui.datepicker-rm.js delete mode 100644 vendor/jquery-ui-1.10.3.custom/development-bundle/ui/i18n/jquery.ui.datepicker-ro.js delete mode 100644 vendor/jquery-ui-1.10.3.custom/development-bundle/ui/i18n/jquery.ui.datepicker-ru.js delete mode 100644 vendor/jquery-ui-1.10.3.custom/development-bundle/ui/i18n/jquery.ui.datepicker-sk.js delete mode 100644 vendor/jquery-ui-1.10.3.custom/development-bundle/ui/i18n/jquery.ui.datepicker-sl.js delete mode 100644 vendor/jquery-ui-1.10.3.custom/development-bundle/ui/i18n/jquery.ui.datepicker-sq.js delete mode 100644 vendor/jquery-ui-1.10.3.custom/development-bundle/ui/i18n/jquery.ui.datepicker-sr-SR.js delete mode 100644 vendor/jquery-ui-1.10.3.custom/development-bundle/ui/i18n/jquery.ui.datepicker-sr.js delete mode 100644 vendor/jquery-ui-1.10.3.custom/development-bundle/ui/i18n/jquery.ui.datepicker-sv.js delete mode 100644 vendor/jquery-ui-1.10.3.custom/development-bundle/ui/i18n/jquery.ui.datepicker-ta.js delete mode 100644 vendor/jquery-ui-1.10.3.custom/development-bundle/ui/i18n/jquery.ui.datepicker-th.js delete mode 100644 vendor/jquery-ui-1.10.3.custom/development-bundle/ui/i18n/jquery.ui.datepicker-tj.js delete mode 100644 vendor/jquery-ui-1.10.3.custom/development-bundle/ui/i18n/jquery.ui.datepicker-tr.js delete mode 100644 vendor/jquery-ui-1.10.3.custom/development-bundle/ui/i18n/jquery.ui.datepicker-uk.js delete mode 100644 vendor/jquery-ui-1.10.3.custom/development-bundle/ui/i18n/jquery.ui.datepicker-vi.js delete mode 100644 vendor/jquery-ui-1.10.3.custom/development-bundle/ui/i18n/jquery.ui.datepicker-zh-CN.js delete mode 100644 vendor/jquery-ui-1.10.3.custom/development-bundle/ui/i18n/jquery.ui.datepicker-zh-HK.js delete mode 100644 vendor/jquery-ui-1.10.3.custom/development-bundle/ui/i18n/jquery.ui.datepicker-zh-TW.js delete mode 100644 vendor/jquery-ui-1.10.3.custom/development-bundle/ui/jquery-ui.custom.js delete mode 100644 vendor/jquery-ui-1.10.3.custom/development-bundle/ui/jquery.ui.accordion.js delete mode 100644 vendor/jquery-ui-1.10.3.custom/development-bundle/ui/jquery.ui.autocomplete.js delete mode 100644 vendor/jquery-ui-1.10.3.custom/development-bundle/ui/jquery.ui.button.js delete mode 100644 vendor/jquery-ui-1.10.3.custom/development-bundle/ui/jquery.ui.core.js delete mode 100644 vendor/jquery-ui-1.10.3.custom/development-bundle/ui/jquery.ui.datepicker.js delete mode 100644 vendor/jquery-ui-1.10.3.custom/development-bundle/ui/jquery.ui.dialog.js delete mode 100644 vendor/jquery-ui-1.10.3.custom/development-bundle/ui/jquery.ui.draggable.js delete mode 100644 vendor/jquery-ui-1.10.3.custom/development-bundle/ui/jquery.ui.menu.js delete mode 100644 vendor/jquery-ui-1.10.3.custom/development-bundle/ui/jquery.ui.mouse.js delete mode 100644 vendor/jquery-ui-1.10.3.custom/development-bundle/ui/jquery.ui.position.js delete mode 100644 vendor/jquery-ui-1.10.3.custom/development-bundle/ui/jquery.ui.progressbar.js delete mode 100644 vendor/jquery-ui-1.10.3.custom/development-bundle/ui/jquery.ui.resizable.js delete mode 100644 vendor/jquery-ui-1.10.3.custom/development-bundle/ui/jquery.ui.slider.js delete mode 100644 vendor/jquery-ui-1.10.3.custom/development-bundle/ui/jquery.ui.spinner.js delete mode 100644 vendor/jquery-ui-1.10.3.custom/development-bundle/ui/jquery.ui.tabs.js delete mode 100644 vendor/jquery-ui-1.10.3.custom/development-bundle/ui/jquery.ui.tooltip.js delete mode 100644 vendor/jquery-ui-1.10.3.custom/development-bundle/ui/jquery.ui.widget.js delete mode 100644 vendor/jquery-ui-1.10.3.custom/development-bundle/ui/minified/i18n/jquery-ui-i18n.min.js delete mode 100644 vendor/jquery-ui-1.10.3.custom/development-bundle/ui/minified/i18n/jquery.ui.datepicker-af.min.js delete mode 100644 vendor/jquery-ui-1.10.3.custom/development-bundle/ui/minified/i18n/jquery.ui.datepicker-ar-DZ.min.js delete mode 100644 vendor/jquery-ui-1.10.3.custom/development-bundle/ui/minified/i18n/jquery.ui.datepicker-ar.min.js delete mode 100644 vendor/jquery-ui-1.10.3.custom/development-bundle/ui/minified/i18n/jquery.ui.datepicker-az.min.js delete mode 100644 vendor/jquery-ui-1.10.3.custom/development-bundle/ui/minified/i18n/jquery.ui.datepicker-be.min.js delete mode 100644 vendor/jquery-ui-1.10.3.custom/development-bundle/ui/minified/i18n/jquery.ui.datepicker-bg.min.js delete mode 100644 vendor/jquery-ui-1.10.3.custom/development-bundle/ui/minified/i18n/jquery.ui.datepicker-bs.min.js delete mode 100644 vendor/jquery-ui-1.10.3.custom/development-bundle/ui/minified/i18n/jquery.ui.datepicker-ca.min.js delete mode 100644 vendor/jquery-ui-1.10.3.custom/development-bundle/ui/minified/i18n/jquery.ui.datepicker-cs.min.js delete mode 100644 vendor/jquery-ui-1.10.3.custom/development-bundle/ui/minified/i18n/jquery.ui.datepicker-cy-GB.min.js delete mode 100644 vendor/jquery-ui-1.10.3.custom/development-bundle/ui/minified/i18n/jquery.ui.datepicker-da.min.js delete mode 100644 vendor/jquery-ui-1.10.3.custom/development-bundle/ui/minified/i18n/jquery.ui.datepicker-de.min.js delete mode 100644 vendor/jquery-ui-1.10.3.custom/development-bundle/ui/minified/i18n/jquery.ui.datepicker-el.min.js delete mode 100644 vendor/jquery-ui-1.10.3.custom/development-bundle/ui/minified/i18n/jquery.ui.datepicker-en-AU.min.js delete mode 100644 vendor/jquery-ui-1.10.3.custom/development-bundle/ui/minified/i18n/jquery.ui.datepicker-en-GB.min.js delete mode 100644 vendor/jquery-ui-1.10.3.custom/development-bundle/ui/minified/i18n/jquery.ui.datepicker-en-NZ.min.js delete mode 100644 vendor/jquery-ui-1.10.3.custom/development-bundle/ui/minified/i18n/jquery.ui.datepicker-eo.min.js delete mode 100644 vendor/jquery-ui-1.10.3.custom/development-bundle/ui/minified/i18n/jquery.ui.datepicker-es.min.js delete mode 100644 vendor/jquery-ui-1.10.3.custom/development-bundle/ui/minified/i18n/jquery.ui.datepicker-et.min.js delete mode 100644 vendor/jquery-ui-1.10.3.custom/development-bundle/ui/minified/i18n/jquery.ui.datepicker-eu.min.js delete mode 100644 vendor/jquery-ui-1.10.3.custom/development-bundle/ui/minified/i18n/jquery.ui.datepicker-fa.min.js delete mode 100644 vendor/jquery-ui-1.10.3.custom/development-bundle/ui/minified/i18n/jquery.ui.datepicker-fi.min.js delete mode 100644 vendor/jquery-ui-1.10.3.custom/development-bundle/ui/minified/i18n/jquery.ui.datepicker-fo.min.js delete mode 100644 vendor/jquery-ui-1.10.3.custom/development-bundle/ui/minified/i18n/jquery.ui.datepicker-fr-CA.min.js delete mode 100644 vendor/jquery-ui-1.10.3.custom/development-bundle/ui/minified/i18n/jquery.ui.datepicker-fr-CH.min.js delete mode 100644 vendor/jquery-ui-1.10.3.custom/development-bundle/ui/minified/i18n/jquery.ui.datepicker-fr.min.js delete mode 100644 vendor/jquery-ui-1.10.3.custom/development-bundle/ui/minified/i18n/jquery.ui.datepicker-gl.min.js delete mode 100644 vendor/jquery-ui-1.10.3.custom/development-bundle/ui/minified/i18n/jquery.ui.datepicker-he.min.js delete mode 100644 vendor/jquery-ui-1.10.3.custom/development-bundle/ui/minified/i18n/jquery.ui.datepicker-hi.min.js delete mode 100644 vendor/jquery-ui-1.10.3.custom/development-bundle/ui/minified/i18n/jquery.ui.datepicker-hr.min.js delete mode 100644 vendor/jquery-ui-1.10.3.custom/development-bundle/ui/minified/i18n/jquery.ui.datepicker-hu.min.js delete mode 100644 vendor/jquery-ui-1.10.3.custom/development-bundle/ui/minified/i18n/jquery.ui.datepicker-hy.min.js delete mode 100644 vendor/jquery-ui-1.10.3.custom/development-bundle/ui/minified/i18n/jquery.ui.datepicker-id.min.js delete mode 100644 vendor/jquery-ui-1.10.3.custom/development-bundle/ui/minified/i18n/jquery.ui.datepicker-is.min.js delete mode 100644 vendor/jquery-ui-1.10.3.custom/development-bundle/ui/minified/i18n/jquery.ui.datepicker-it.min.js delete mode 100644 vendor/jquery-ui-1.10.3.custom/development-bundle/ui/minified/i18n/jquery.ui.datepicker-ja.min.js delete mode 100644 vendor/jquery-ui-1.10.3.custom/development-bundle/ui/minified/i18n/jquery.ui.datepicker-ka.min.js delete mode 100644 vendor/jquery-ui-1.10.3.custom/development-bundle/ui/minified/i18n/jquery.ui.datepicker-kk.min.js delete mode 100644 vendor/jquery-ui-1.10.3.custom/development-bundle/ui/minified/i18n/jquery.ui.datepicker-km.min.js delete mode 100644 vendor/jquery-ui-1.10.3.custom/development-bundle/ui/minified/i18n/jquery.ui.datepicker-ko.min.js delete mode 100644 vendor/jquery-ui-1.10.3.custom/development-bundle/ui/minified/i18n/jquery.ui.datepicker-ky.min.js delete mode 100644 vendor/jquery-ui-1.10.3.custom/development-bundle/ui/minified/i18n/jquery.ui.datepicker-lb.min.js delete mode 100644 vendor/jquery-ui-1.10.3.custom/development-bundle/ui/minified/i18n/jquery.ui.datepicker-lt.min.js delete mode 100644 vendor/jquery-ui-1.10.3.custom/development-bundle/ui/minified/i18n/jquery.ui.datepicker-lv.min.js delete mode 100644 vendor/jquery-ui-1.10.3.custom/development-bundle/ui/minified/i18n/jquery.ui.datepicker-mk.min.js delete mode 100644 vendor/jquery-ui-1.10.3.custom/development-bundle/ui/minified/i18n/jquery.ui.datepicker-ml.min.js delete mode 100644 vendor/jquery-ui-1.10.3.custom/development-bundle/ui/minified/i18n/jquery.ui.datepicker-ms.min.js delete mode 100644 vendor/jquery-ui-1.10.3.custom/development-bundle/ui/minified/i18n/jquery.ui.datepicker-nb.min.js delete mode 100644 vendor/jquery-ui-1.10.3.custom/development-bundle/ui/minified/i18n/jquery.ui.datepicker-nl-BE.min.js delete mode 100644 vendor/jquery-ui-1.10.3.custom/development-bundle/ui/minified/i18n/jquery.ui.datepicker-nl.min.js delete mode 100644 vendor/jquery-ui-1.10.3.custom/development-bundle/ui/minified/i18n/jquery.ui.datepicker-nn.min.js delete mode 100644 vendor/jquery-ui-1.10.3.custom/development-bundle/ui/minified/i18n/jquery.ui.datepicker-no.min.js delete mode 100644 vendor/jquery-ui-1.10.3.custom/development-bundle/ui/minified/i18n/jquery.ui.datepicker-pl.min.js delete mode 100644 vendor/jquery-ui-1.10.3.custom/development-bundle/ui/minified/i18n/jquery.ui.datepicker-pt-BR.min.js delete mode 100644 vendor/jquery-ui-1.10.3.custom/development-bundle/ui/minified/i18n/jquery.ui.datepicker-pt.min.js delete mode 100644 vendor/jquery-ui-1.10.3.custom/development-bundle/ui/minified/i18n/jquery.ui.datepicker-rm.min.js delete mode 100644 vendor/jquery-ui-1.10.3.custom/development-bundle/ui/minified/i18n/jquery.ui.datepicker-ro.min.js delete mode 100644 vendor/jquery-ui-1.10.3.custom/development-bundle/ui/minified/i18n/jquery.ui.datepicker-ru.min.js delete mode 100644 vendor/jquery-ui-1.10.3.custom/development-bundle/ui/minified/i18n/jquery.ui.datepicker-sk.min.js delete mode 100644 vendor/jquery-ui-1.10.3.custom/development-bundle/ui/minified/i18n/jquery.ui.datepicker-sl.min.js delete mode 100644 vendor/jquery-ui-1.10.3.custom/development-bundle/ui/minified/i18n/jquery.ui.datepicker-sq.min.js delete mode 100644 vendor/jquery-ui-1.10.3.custom/development-bundle/ui/minified/i18n/jquery.ui.datepicker-sr-SR.min.js delete mode 100644 vendor/jquery-ui-1.10.3.custom/development-bundle/ui/minified/i18n/jquery.ui.datepicker-sr.min.js delete mode 100644 vendor/jquery-ui-1.10.3.custom/development-bundle/ui/minified/i18n/jquery.ui.datepicker-sv.min.js delete mode 100644 vendor/jquery-ui-1.10.3.custom/development-bundle/ui/minified/i18n/jquery.ui.datepicker-ta.min.js delete mode 100644 vendor/jquery-ui-1.10.3.custom/development-bundle/ui/minified/i18n/jquery.ui.datepicker-th.min.js delete mode 100644 vendor/jquery-ui-1.10.3.custom/development-bundle/ui/minified/i18n/jquery.ui.datepicker-tj.min.js delete mode 100644 vendor/jquery-ui-1.10.3.custom/development-bundle/ui/minified/i18n/jquery.ui.datepicker-tr.min.js delete mode 100644 vendor/jquery-ui-1.10.3.custom/development-bundle/ui/minified/i18n/jquery.ui.datepicker-uk.min.js delete mode 100644 vendor/jquery-ui-1.10.3.custom/development-bundle/ui/minified/i18n/jquery.ui.datepicker-vi.min.js delete mode 100644 vendor/jquery-ui-1.10.3.custom/development-bundle/ui/minified/i18n/jquery.ui.datepicker-zh-CN.min.js delete mode 100644 vendor/jquery-ui-1.10.3.custom/development-bundle/ui/minified/i18n/jquery.ui.datepicker-zh-HK.min.js delete mode 100644 vendor/jquery-ui-1.10.3.custom/development-bundle/ui/minified/i18n/jquery.ui.datepicker-zh-TW.min.js delete mode 100644 vendor/jquery-ui-1.10.3.custom/development-bundle/ui/minified/jquery-ui.custom.min.js delete mode 100644 vendor/jquery-ui-1.10.3.custom/development-bundle/ui/minified/jquery.ui.accordion.min.js delete mode 100644 vendor/jquery-ui-1.10.3.custom/development-bundle/ui/minified/jquery.ui.autocomplete.min.js delete mode 100644 vendor/jquery-ui-1.10.3.custom/development-bundle/ui/minified/jquery.ui.button.min.js delete mode 100644 vendor/jquery-ui-1.10.3.custom/development-bundle/ui/minified/jquery.ui.core.min.js delete mode 100644 vendor/jquery-ui-1.10.3.custom/development-bundle/ui/minified/jquery.ui.datepicker.min.js delete mode 100644 vendor/jquery-ui-1.10.3.custom/development-bundle/ui/minified/jquery.ui.dialog.min.js delete mode 100644 vendor/jquery-ui-1.10.3.custom/development-bundle/ui/minified/jquery.ui.draggable.min.js delete mode 100644 vendor/jquery-ui-1.10.3.custom/development-bundle/ui/minified/jquery.ui.menu.min.js delete mode 100644 vendor/jquery-ui-1.10.3.custom/development-bundle/ui/minified/jquery.ui.mouse.min.js delete mode 100644 vendor/jquery-ui-1.10.3.custom/development-bundle/ui/minified/jquery.ui.position.min.js delete mode 100644 vendor/jquery-ui-1.10.3.custom/development-bundle/ui/minified/jquery.ui.progressbar.min.js delete mode 100644 vendor/jquery-ui-1.10.3.custom/development-bundle/ui/minified/jquery.ui.resizable.min.js delete mode 100644 vendor/jquery-ui-1.10.3.custom/development-bundle/ui/minified/jquery.ui.slider.min.js delete mode 100644 vendor/jquery-ui-1.10.3.custom/development-bundle/ui/minified/jquery.ui.spinner.min.js delete mode 100644 vendor/jquery-ui-1.10.3.custom/development-bundle/ui/minified/jquery.ui.tabs.min.js delete mode 100644 vendor/jquery-ui-1.10.3.custom/development-bundle/ui/minified/jquery.ui.tooltip.min.js delete mode 100644 vendor/jquery-ui-1.10.3.custom/development-bundle/ui/minified/jquery.ui.widget.min.js delete mode 100644 vendor/jquery-ui-1.10.3.custom/index.html delete mode 100644 vendor/jquery-ui-1.10.3.custom/js/jquery-1.9.1.js delete mode 100644 vendor/jquery-ui-1.10.3.custom/js/jquery-ui-1.10.3.custom.js delete mode 100644 vendor/jquery-ui-1.10.3.custom/js/jquery-ui-1.10.3.custom.min.js delete mode 100644 vendor/jquery.cookie.js delete mode 100644 vendor/jquery.min.js delete mode 100644 vendor/jquery.min.map delete mode 100644 vendor/jquery.mousewheel.min.js delete mode 100644 vendor/jquery.qtip.min.css delete mode 100644 vendor/jquery.qtip.min.js delete mode 100644 vendor/jquery.sha1.js delete mode 100644 vendor/opencga-1.0.0.js delete mode 100644 vendor/opencga-1.0.0.min.js delete mode 100644 vendor/purl.min.js delete mode 100644 vendor/rawdeflate.js delete mode 100644 vendor/underscore-min.js delete mode 100644 vendor/worker-fileupload.js diff --git a/Gruntfile.js b/Gruntfile.js index 5192994..dab924f 100644 --- a/Gruntfile.js +++ b/Gruntfile.js @@ -6,17 +6,17 @@ module.exports = function (grunt) { // Metadata. meta: { version: '3.1.2', - commons: { - dir: '../js-common-libs/', + jsorolla: { + dir: '/lib/jsorolla/', //genome viewer contains cellbse and utils 'genomeviewer': { version: '1.0.2', - dir: '<%= meta.commons.dir %>build/genome-viewer/<%= meta.commons.genomeviewer.version %>/' + dir: '<%= meta.jsorolla.dir %>build/genome-viewer/<%= meta.jsorolla.genomeviewer.version %>/' }, //opencga does not contains utils opencga: { version: '1.0.0', - dir: '<%= meta.commons.dir %>build/opencga/<%= meta.commons.opencga.version %>/' + dir: '<%= meta.jsorolla.dir %>build/opencga/<%= meta.jsorolla.opencga.version %>/' } } }, @@ -51,63 +51,14 @@ module.exports = function (grunt) { dest: 'build/<%= meta.version %>/genome-maps-<%= meta.version %>.min.js' } }, - jshint: { - options: { - curly: true, - eqeqeq: true, - immed: true, - latedef: true, - newcap: true, - noarg: true, - sub: true, - undef: true, - unused: true, - boss: true, - eqnull: true, - browser: true, - globals: { - jQuery: true - } - }, - gruntfile: { - src: 'Gruntfile.js' - }, - lib_test: { - src: ['lib/**/*.js', 'test/**/*.js'] - } - }, - qunit: { - files: ['test/**/*.html'] - }, - copy: { build: { files: [ - { expand: true, cwd: './', src: ['vendor/**'], dest: 'build/<%= meta.version %>/' }, - { expand: true, cwd: './', src: ['styles/**'], dest: 'build/<%= meta.version %>/' }, // includes files in path and its subdirs - { expand: true, cwd: './src', src: ['gm-config.js'], dest: 'build/<%= meta.version %>/' } - ] - }, - genomeviewer: { - files: [ - { expand: true, cwd: '<%= meta.commons.genomeviewer.dir %>', src: ['genome-viewer*.js'], dest: 'vendor' } - ] - }, - opencga: { - files: [ - { expand: true, cwd: '<%= meta.commons.opencga.dir %>', src: ['opencga*.js', 'worker*'], dest: 'vendor' } - ] - }, - styles: { - files: [ - { expand: true, cwd: '<%= meta.commons.dir %>styles/', src: ['**'], dest: 'styles' }, - { expand: true, cwd: '<%= meta.commons.dir %>vendor/', src: ['jquery-ui-*custom/**'], dest: 'vendor' } - ] - }, - map: { - files: [ - { expand: true, cwd: '<%= meta.commons.dir %>vendor/', src: ['jquery.min.map'], dest: 'vendor' }, - { expand: true, cwd: '<%= meta.commons.dir %>vendor/', src: ['backbone-min.map'], dest: 'vendor' } + { expand: true, cwd: './src', src: ['gm-config.js'], dest: 'build/<%= meta.version %>/' }, + { expand: true, cwd: './<%= meta.jsorolla.dir %>', src: ['vendor/**'], dest: 'build/<%= meta.version %>/' }, + { expand: true, cwd: './<%= meta.jsorolla.dir %>', src: ['styles/**'], dest: 'build/<%= meta.version %>/' }, // includes files in path and its subdirs + { expand: true, cwd: './<%= meta.jsorolla.genomeviewer.dir %>', src: ['genome-viewer*.js', 'gv-config.js'], dest: 'build/<%= meta.version %>/' }, + { expand: true, cwd: './<%= meta.jsorolla.opencga.dir %>', src: ['opencga*.js', 'worker*'], dest: 'build/<%= meta.version %>/' } ] } }, @@ -137,10 +88,15 @@ module.exports = function (grunt) { 'build/<%= meta.version %>/vendor/jquery.sha1*.js', 'build/<%= meta.version %>/vendor/jquery.qtip*.js', 'build/<%= meta.version %>/vendor/rawdeflate*.js', - 'build/<%= meta.version %>/vendor/jquery-ui-1.10.3*/js/jquery-ui*min.js', + 'build/<%= meta.version %>/vendor/jquery-ui-1.10.3*/js/jquery-ui*min.js' - 'build/<%= meta.version %>/vendor/genome-viewer*.min.js', - 'build/<%= meta.version %>/vendor/opencga*.min.js' + ], + gv: [ + 'build/<%= meta.version %>/opencga*.min.js', + 'build/<%= meta.version %>/genome-viewer*.min.js' + ], + gvconfig: [ + 'build/<%= meta.version %>/gv-config.js' ] }, styles: { @@ -164,13 +120,10 @@ module.exports = function (grunt) { ] } }, - watch: { - commons: { - files: ['<%= meta.commons.genomeviewer.dir %>**','<%= meta.commons.opencga.dir %>**'], - tasks: ['commons'], - options: { - spawn: false - } + hub: { + all: { + src: ['lib/jsorolla/Gruntfile.js'], + tasks: ['opencga', 'gv'] } } }); @@ -178,20 +131,15 @@ module.exports = function (grunt) { // These plugins provide necessary tasks. grunt.loadNpmTasks('grunt-contrib-concat'); grunt.loadNpmTasks('grunt-contrib-uglify'); -// grunt.loadNpmTasks('grunt-contrib-qunit'); -// grunt.loadNpmTasks('grunt-contrib-jshint'); grunt.loadNpmTasks('grunt-contrib-watch'); grunt.loadNpmTasks('grunt-contrib-copy'); grunt.loadNpmTasks('grunt-contrib-clean'); grunt.loadNpmTasks('grunt-contrib-rename'); grunt.loadNpmTasks('grunt-html-build'); grunt.loadNpmTasks('grunt-curl'); + grunt.loadNpmTasks('grunt-hub'); // Default task. - grunt.registerTask('default', ['clean', 'concat', 'uglify', 'copy', 'htmlbuild', 'rename:html']); - grunt.registerTask('vendor', ['curl-dir']); - - // dependencies from js-common-libs - grunt.registerTask('commons', ['copy:genomeviewer', 'copy:opencga', 'copy:styles']); + grunt.registerTask('default', ['clean', 'concat', 'uglify', 'hub:all', 'copy', 'htmlbuild', 'rename:html']); }; diff --git a/genome-maps.html b/genome-maps.html deleted file mode 100644 index 28175f2..0000000 --- a/genome-maps.html +++ /dev/null @@ -1,88 +0,0 @@ - - - - - - Genome Maps - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
-
- - - \ No newline at end of file diff --git a/lib/jsorolla b/lib/jsorolla index 3f335d9..48d7dbe 160000 --- a/lib/jsorolla +++ b/lib/jsorolla @@ -1 +1 @@ -Subproject commit 3f335d9d01a1305ed27350b371e4d14e2f974d16 +Subproject commit 48d7dbe91019fd6f5027417a93cb99066fe40a2a diff --git a/package.json b/package.json index 3e1ece2..a3e0082 100644 --- a/package.json +++ b/package.json @@ -7,12 +7,11 @@ "grunt-contrib-uglify": "~0.2.2", "grunt-contrib-copy": "~0.4.1", "grunt-contrib-clean": "~0.4.1", - "grunt-contrib-qunit": "~0.2.2", - "grunt-contrib-jshint": "~0.6.0", "grunt-contrib-watch": "~0.5.3", "js-beautify": "~1.3.4", "grunt-html-build": "0.2.0", "grunt-curl": "~1.1.1", - "grunt-contrib-rename": "0.0.3" + "grunt-contrib-rename": "0.0.3", + "grunt-hub": "~0.5.0" } } diff --git a/src/genome-maps.html b/src/genome-maps.html index 6d66ca6..1d46932 100755 --- a/src/genome-maps.html +++ b/src/genome-maps.html @@ -10,7 +10,7 @@ - + @@ -25,7 +25,7 @@ @@ -50,16 +50,95 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - - @@ -98,7 +177,7 @@ left:4px; right:4px; bottom: 0px; - height: 28px; + height: 26px; border:1px solid lightgrey; z-index:50; } diff --git a/src/genome-maps.js b/src/genome-maps.js index d26e6c9..9a5ce46 100644 --- a/src/genome-maps.js +++ b/src/genome-maps.js @@ -209,11 +209,14 @@ GenomeMaps.prototype = { /*Load example account info*/ - var opencgaManager = new OpencgaManager(); - opencgaManager.onGetAccountInfo.addEventListener(function (evt, response) { - _this._loadOpencgaTracks(response, 'example'); + OpencgaManager.getAccountInfo({ + accountId:'example', + sessionId:'example', + lastActivity:'example', + success:function(data){ + _this._loadOpencgaTracks(data, 'example'); + } }); - opencgaManager.getAccountInfo('example', 'example', 'example'); /**/ /*****************************************/ @@ -259,7 +262,7 @@ GenomeMaps.prototype = { version: this.version, suiteId: this.suiteId, accountData: this.accountData, - chunkedUpload:true, + chunkedUpload:false, handlers: { 'login': function (event) { Ext.example.msg('Welcome', 'You logged in'); @@ -530,7 +533,7 @@ GenomeMaps.prototype.getRegionByFeature = function (name, feature) { async: false }); var f = data.response[0].result[0]; - if (!_.isNull(f)) { + if (_.isObject(f)) { return {chromosome: f.chromosome, start: f.start, end: f.end} } return {}; diff --git a/src/gm-config.js b/src/gm-config.js index c26add0..5d2056c 100755 --- a/src/gm-config.js +++ b/src/gm-config.js @@ -35,6 +35,7 @@ if ( //CELLBASE_HOST = "http://ralonso:8080/naranjoma-ws/rest"; OPENCGA_HOST = "http://ws-beta.bioinfo.cipf.es/opencgabeta/rest"; + OPENCGA_HOST = "http://ws-beta.bioinfo.cipf.es/opencga-server-0.2.0/rest"; // OPENCGA_HOST = "http://rsanchez:8080/dqs/rest"; // OPENCGA_HOST = "http://imedina:8080/dqs/rest"; } diff --git a/src/gm-status-bar.js b/src/gm-status-bar.js index faf058d..e2d4b9d 100644 --- a/src/gm-status-bar.js +++ b/src/gm-status-bar.js @@ -50,7 +50,7 @@ GmStatusBar.prototype = { this.targetDiv = $('#' + this.targetId)[0]; this.div = $('
')[0]; $(this.targetDiv).append(this.div); - + $(this.div).css({height:'26px'}); var geneLegendPanel = new LegendPanel({title: 'Gene legend'}); var snpLegendPanel = new LegendPanel({title: 'SNP legend'}); @@ -100,7 +100,6 @@ GmStatusBar.prototype = { layout: 'hbox', region: "south", cls: "gm-navigation-bar unselectable", -// height: 30, border: true, items: [taskbar, toolbar] }); diff --git a/src/old.html b/src/old.html deleted file mode 100755 index bd7ab10..0000000 --- a/src/old.html +++ /dev/null @@ -1,257 +0,0 @@ - - - - - Genome Maps - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - diff --git a/styles/css/style.css b/styles/css/style.css deleted file mode 100644 index e005cc8..0000000 --- a/styles/css/style.css +++ /dev/null @@ -1,1166 +0,0 @@ -.ocb-font-default{ - font-family: tahoma, arial, verdana, sans-serif; -} -.ocb-font-sourcesanspro { - font-family: 'Source Sans Pro'; -} -.ocb-font-ubuntu { - font-family: 'Ubuntu'; -} -.ocb-font-ubuntumono { - font-family: 'Ubuntu Mono'; -} -.ocb-font-lato { - font-family: 'Lato'; -} - -.ocb-font-size-16{ font-size: 16px;} -.ocb-font-size-15{ font-size: 15px;} -.ocb-font-size-14{ font-size: 14px;} -.ocb-font-size-13{ font-size: 13px;} -.ocb-font-size-12{ font-size: 12px;} -.ocb-font-size-11{ font-size: 11px;} -.ocb-font-size-10{ font-size: 10px;} -.ocb-font-size-9{ font-size: 9px;} -.ocb-font-size-8{ font-size: 8px;} - - - -.ocb-border-bot-lightgrey { - border-bottom: 1px solid lightgrey; -} - -.ocb-border-top-lightgrey { - border-top: 1px solid lightgrey; -} - -.ocb-border-left-lightgrey { - border-left: 1px solid lightgrey; -} - -.ocb-border-right-lightgrey { - border-right: 1px solid lightgrey; -} - -.ocb-border-all-lightgrey { - border: 1px solid lightgrey; -} - -.ocb-scroll-x { - overflow-x: auto; -} - -.ocb-scroll-y { - overflow-y: auto; -} - -.ocb-input-text { - vertical-align: middle; - padding: 1px 3px; - border: 1px solid; - background-color: white; - color: black; - border-color: #b5b8c8; -} - -.ocb-text { - vertical-align: middle; - font-family: tahoma, arial, verdana, sans-serif; - font-size: 1.1em; -} - -.ocb-zoom-slider { - vertical-align: middle; - margin: 0 10px; - display: inline-block !important; - width: 120px; -} - -/*Google-like scrollbars webkit only*/ -/*::-webkit-scrollbar {*/ -/*width: 10px;*/ -/*}*/ -/*::-webkit-scrollbar-track {*/ -/*background: #FFF;*/ -/*-webkit-box-shadow: inset 1px 1px 2px rgba(0,0,0,0.1);*/ -/*}*/ -/*::-webkit-scrollbar-thumb {*/ -/*background: #CCC;*/ -/*-webkit-box-shadow: inset 1px 1px 2px rgba(0,0,0,0.2);*/ -/*}*/ -/*::-webkit-scrollbar-thumb:hover {*/ -/*background: #AAA;*/ -/*}*/ -/*::-webkit-scrollbar-thumb:active {*/ -/*background: #888;*/ -/*-webkit-box-shadow: inset 1px 1px 2px rgba(0,0,0,0.3);*/ -/*}*/ - -/*Genome viewer Layout*/ -/*.ocb-box-vertical{*/ -/*display : box;*/ -/*display : -moz-box;*/ -/*display : -webkit-box;*/ - -/*box-orient : vertical;*/ -/*-moz-box-orient : vertical;*/ -/*-webkit-box-orient : vertical;*/ -/*}*/ -.ocb-gv { - position: relative; - background-color: white; -} - -/*.ocb-gv-navigation{*/ -/*height:37px;*/ -/*}*/ -/*.ocb-gv-center{*/ -/*position:relative;*/ -/*height:100%*/ - -/*box-flex:1;*/ -/*-moz-box-flex:1;*/ -/*-webkit-box-flex:1;*/ -/*overflow-y: scroll;*/ -/*overflow-x: hidden;*/ -/*}*/ -/*.ocb-gv-status{*/ -/*height:25px;*/ -/*}*/ - -/*.ocb-tlp-tracks{*/ -/*position: relative;*/ -/*z-index: 3;*/ -/*box-flex:1;*/ -/*-moz-box-flex:1;*/ -/*-webkit-box-flex:1;*/ -/*overflow-y: scroll;*/ -/*overflow-x: hidden;*/ -/*}*/ - -/*END Genome viewer Layout*/ - -.ocb-track-resize { - background-color: lightgray; - background-image: url(../img/ocb-grab-track-resize.png) !important; - background-repeat: no-repeat; - background-position: center; - height: 7px; - opacity: 0.3; - border-top: 1px solid gray; - border-bottom: 1px solid gray; - box-sizing:border-box; -} - - -.feature-emph { - fill: yellow; -} - -/*.x-custom-button-over{*/ -/*background-color: lightgray;*/ -/*background-image: none;*/ -/*border-color: green;*/ -/*}*/ - -/*.x-custom-button-pressed{*/ -/*background-color: lightgray;*/ -/*background-image: none;*/ -/*border-color: red;*/ -/*}*/ - -.gv-navigation-bar { - font-size: 10px; - background-image: linear-gradient(to bottom, #ffffff, #f2f2f2); - background-image: -webkit-linear-gradient(top, #ffffff, #f2f2f2); - background-repeat: repeat-x; - padding: 5px; -} - -.gm-navigation-bar { - background-image: linear-gradient(to bottom, #ffffff, #eeeeee); - background-image: -webkit-linear-gradient(top, #ffffff, #eeeeee); - background-repeat: repeat-x; -} - -.gm-login-bar { - background: white; - /*background-image: linear-gradient(to top, #ffffff, #f2f2f2);*/ - /*background-image: -webkit-linear-gradient(bottom, white, #f2f2f2);*/ - /*background-repeat: repeat-x;*/ -} - -.gv-status-bar { - font-family: tahoma, arial, verdana, sans-serif; - font-size: 11px; - color: #333; - padding: 3px 0 5px 5px; - border-top: 1px solid #d4d4d4; - background-image: linear-gradient(to bottom, #ffffff, #f2f2f2); - background-image: -webkit-linear-gradient(top, white, #f2f2f2); - background-repeat: repeat-x; - line-height: normal; -} - -.gv-panel-title { - font-family: tahoma, arial, verdana, sans-serif; - font-weight: bold; - color: #333; - font-size: 11px; - padding: 5px 0 6px 5px; - background-image: linear-gradient(to bottom, #ffffff, #d0d0d0); - background-image: -webkit-linear-gradient(top, white, #d0d0d0); - background-repeat: repeat-x; - border-top: 1px solid #d4d4d4; - border-bottom: 1px solid #d4d4d4; - line-height: normal; -} - -.gv-nav { - font-family: 'Lato'; - color: #333; - font-size: 11px; - padding: 3px 0 5px 5px; - background: whitesmoke; - background-color: whitesmoke; - border-bottom: 1px solid #d4d4d4; -} - -.nv-toolbar { - background-image: linear-gradient(to bottom, #ffffff, #f2f2f2); - background-image: -webkit-linear-gradient(top, white, #f2f2f2); - background-repeat: repeat-x; - padding: 5px; -} - -.app-header { - background-color: darkred; -} - -/* .x-toolbar-default { */ -/* border-color: #99BCE8; */ -/* background-image: none; */ -/* background-color: #D3E1F1; */ -/* background-image: -webkit-gradient(linear, 50% 0%, 50% 100%, color-stop(0%, #dfe9f5), color-stop(100%, #d3e1f1)); */ -/* background-image: -moz-linear-gradient(top, #dfe9f5,#d3e1f1); */ -/* background-image: linear-gradient(top, #dfe9f5,#d3e1f1); */ -/* } */ -a:link { - text-decoration: none; - color: #15428B; -} - -a:visited { - text-decoration: none; - color: #15428B; -} - -a:active { - text-decoration: none; - color: #15428B; -} - -a:hover { - text-decoration: underline; - color: #15428B; -} - -.unselectable { - user-select: none; - -o-user-select: none; - -ms-user-select: none; - -moz-user-select: -moz-none; - -webkit-user-select: none; - cursor: default -} - -.u { - text-decoration: underline; -} - -.background-black { - background: #000000; -} - -.bio-hiddenbar { - background: transparent; - border: 0px; -} - -.bio-border-false { - border: 0px; -} - -.bio-userbar { - background: #e0e0e0; - border-top: 1px solid #c5c5c5; - border-bottom: 1px solid #c5c5c5; - border-left: 1px solid #e0e0e0; - border-right: 1px solid #e0e0e0; -} - -.bio-linkbar { - background-image: none; - background: white; - border-top: 1px solid white; - border-bottom: 1px solid white; - border-left: 0px solid white; - border-right: 0px solid white; -} - -.bio-menubar { - background: white; - border-top: 1px solid white; - border-bottom: 1px solid white; - border-left: 0px; - border-right: 0px; -} - -.bio-toolbar { - background: whiteSmoke; - border-top: 1px solid #E5E5E5; - border-bottom: 1px solid #E5E5E5; - border-left: 1px solid whiteSmoke; - border-right: 1px solid whiteSmoke; -} - -.bio-botbar { - background: whiteSmoke; - border-top: 1px solid #ccc; - border-bottom: 1px solid #ccc; - border-left: 0px; - border-right: 0px; -} - -.bio-toolbar-bot { - background: whiteSmoke; - border-top: 0px; - border-bottom: 1px solid #E5E5E5; - border-left: 0px; - border-right: 0px; -} - -.appName { - font-family: 'Oxygen'; - text-decoration: none; - color: #596F8F; - font-size: 28px; - text-shadow: 0 1px 0 white; -} - -.appDesc { - margin-left: 10px; - margin-right: 20px; - font-family: 'Oxygen'; - text-decoration: none; - /*color: #637c9f;*/ - color: #6599FF; - font-size: 20px; - text-shadow: 0 1px 0 white; -} - -.appVersion { - margin-left: 10px; - margin-right: 20px; - font-family: 'Oxygen'; - text-decoration: none; - color: orange; - font-size: 18px; - text-shadow: 0 1px 0 white; -} - -.top-links { - text-decoration: none; - color: #596F8F; - font-size: 14px; - text-align: right; - margin: 5px 10px 0 0; -} - -.top-links:hover { - text-decoration: none; - color: #596F8F; -} - -.top-links:visited { - text-decoration: none; - color: #596F8F; -} - -.file { - color: blue; - background-color: AliceBlue; - padding: 0 3px 0 3px; - text-decoration: underline; -} - -.message { - color: green; - background-color: honeydew; - padding: 0 3px 0 3px; -} - -.group { - background-color: LightCyan; - padding: 5px; -} - -.groups { - background-color: bisque; - padding: 5px; -} - -.none { - text-decoration: none; -} - -.whiteborder { - border: 1px solid #ffffff; -} - -.greyborder { - border: 1px solid #BBBBBB; -} - -.encima { - cursor: pointer; - border-color: deepSkyBlue; - background: honeydew; -} - -.encima2 { - cursor: pointer; - border-color: lightgray; - background: whitesmoke; -} - -.outputItem { - display: inline-block; -} - -.inlineblock { - display: inline-block; -} - -.tools-icons { - background: url('../img/tools-sprites-trans.gif'); - width: 15px; - height: 15px; -} - -.ocb-icon { - display: inline-block; - width: 16px; - height: 16px; -} - -.ocb-icon-resize { - background: url(../img/resize.png) !important; -} - -.ocb-icon-plus { - background: url(../img/ocb-icon-plus.png) !important; -} - -.ocb-icon-minus { - background: url(../img/ocb-icon-minus.png) !important; -} - -.ocb-icon-arrow-e { - background: url(../img/ocb-icon-arrow-e.png) !important; -} - -.ocb-icon-arrow-w { - background: url(../img/ocb-icon-arrow-w.png) !important; -} - -.ocb-icon-arrow-e-bold { - background: url(../img/ocb-icon-arrow-e-bold.png) !important; -} - -.ocb-icon-arrow-w-bold { - background: url(../img/ocb-icon-arrow-w-bold.png) !important; -} - -.ocb-icon-arrow-n-bold { - background: url(../img/ocb-icon-arrow-n-bold.png) !important; -} - -.ocb-icon-collapse { - background: url(../img/ocb-icon-collapse.png) !important; -} - -.ocb-icon-expand { - background: url(../img/ocb-icon-expand.png) !important; -} - -.ocb-icon-clock { - background: url(../img/ocb-icon-clock.png) !important; -} - -.ocb-icon-repeat { - background: url(../img/ocb-icon-repeat.png) !important; -} - -.ocb-icon-karyotype { - background: url(../img/ocb-icon-karyotype.png) !important; -} - -.ocb-icon-chromosome { - background: url(../img/ocb-icon-chromosome.png) !important; -} - -.ocb-icon-region { - background: url(../img/ocb-icon-region.png) !important; -} - -.ocb-icon-find { - background: url(../img/ocb-icon-find.png); -} - -.ocb-icon-gear { - background: url(../img/ocb-icon-gear.png); -} -.ocb-icon-track-autoheight { - background: url(../img/ocb-icon-track-autoheight.png); -} - -.icon-save { - background: url('../img/save.png'); -} - -.icon-grid { - background: url('../img/grid.png'); -} - -.icon-box { - background: url(../img/icons.png) no-repeat -3px -57px !important; -} - -.icon-blue-box { - background: url(../img/icons.png) no-repeat -3px -84px !important; -} - -.icon-change-project { - background: url(../img/jfk_sprite22.png) no-repeat -3px -1922px !important; -} - -.icon-rename-project { - background: url(../img/jfk_sprite40.png) no-repeat -24px -2344px !important; -} - -.icon-add { - background: url(../img/jfk_sprite22.png) no-repeat -3px -844px !important; -} - -.icon-link { - background: url(../img/jfk_sprite22.png) no-repeat -3px -759px !important; -} - -.icon-delete { - background: url(../img/sprite_black2.png) no-repeat -65px -45px !important; -} - -.icon-drag { - background: url(../img/jfk_sprite22.png) no-repeat -3px -737px !important; -} - -.icon-select { - background: url(../img/jfk_sprite22.png) no-repeat -3px -1964px !important; -} - -.icon-zoom-out { - background: url(../img/jfk_sprite22.png) no-repeat -3px -2787px !important; -} - -.icon-zoom-in { - background: url(../img/jfk_sprite22.png) no-repeat -3px -2850px !important; -} - -.icon-upload { - background: url(../img/jfk_sprite22.png) no-repeat -3px -2048px !important; -} - -.icon-local { - background: url(../img/local.png) !important; -} - -.icon-node-size { - background: url(../img/resize.png) !important; -} - -.icon-fill-color { - background: url(../img/jfk_sprite40.png) no-repeat -24px -1545px !important; -} - -.icon-stroke-size { - background: url(../img/jfk_sprite40.png) no-repeat -24px -128px !important; -} - -.icon-stroke-color { - background: url(../img/jfk_sprite40.png) no-repeat -24px -2226px !important; -} - -.icon-node-shape { - background: url(../img/jfk_sprite40.png) no-repeat -1px -1565px !important; -} - -.icon-background-option { - background: url(../img/icon-background.png); -} - -.icon-node-opacity { - background: url(../img/opacity.png); -} - -.icon-edge-type { - background: url(../img/edgetype.png); -} - -.icon-find { - background: url(../img/find.png); -} - -.icon-label-size { - background: url(../img/label-size.png); -} - -.icon-layout { - background: url(../img/icon-layout.png); -} - -.icon-collapse { - background: url(../img/icon-collapse.png) !important; -} - -.icon-auto-select { - background: url(../img/icon-auto-select.png); -} - -.icon-project-delete { - background: url(../img/icon-project-delete.png); -} - -.icon-project-all { - background: url(../img/icon-project-all.png); -} - -.icon-project-manager { - background: url(../img/jfk_sprite40.png) no-repeat -1px -896px !important; -} - -.icon-mouse-select { - background: url(../img/jfk_sprite40.png) no-repeat -2px -1504px !important; -} - -.icon-order { - background: url(../img/icon-order.png); -} - -.icon-order-asc { - background: url(../img/icon-order-asc.png); -} - -.icon-order-desc { - background: url(../img/icon-order-desc.png); -} - -.icon-regular-file { - background: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAAXNSR0IArs4c6QAAAAZiS0dEAP8A/wD/oL2nkwAAAAlwSFlzAAALEwAACxMBAJqcGAAAAAd0SU1FB90CDRIvNbHTpbwAAADjSURBVDjLpZFBbsIwEEUfVRZYahcVK3qKXoauMFK5C91nkyUB+xC5BqeAA7SKq1B5ugl2EiC04UkjayzN17NnROTRWvvJFbTWL8CBHqbGWOlSlqVkWSbGWAGm3aGHZiMiAByPP6FOd1rP2W7NvhvSCvDe10E+VJPFQpPnm1ZIcsmgPgJVVZGmaejX63y/XL4/AV/JJYPTCeDcN7PZWyuwKAqA8wARqSsGKDVGqXGjV8H07AnRQPq21TK8+YSBAQMN4hb6Df7wB/5eA+4zmEyehxk451itPrhFksSxUeP+lf+z+wXwdayJk/mqtgAAAABJRU5ErkJggg==); -} - -/*SBGN icons*/ -.icon-sbgn-en1 { - background: url(../img/sbgn.png) no-repeat -0px -0px !important; -} - -.icon-sbgn-en2 { - background: url(../img/sbgn.png) no-repeat -17px -0px !important; -} - -.icon-sbgn-en3 { - background: url(../img/sbgn.png) no-repeat -34px -0px !important; -} - -.icon-sbgn-en4 { - background: url(../img/sbgn.png) no-repeat -51px -0px !important; -} - -.icon-sbgn-en5 { - background: url(../img/sbgn.png) no-repeat -68px -0px !important; -} - -.icon-sbgn-en6 { - background: url(../img/sbgn.png) no-repeat -85px -0px !important; -} - -.icon-sbgn-pn1 { - background: url(../img/sbgn.png) no-repeat -0px -17px !important; -} - -.icon-sbgn-pn2 { - background: url(../img/sbgn.png) no-repeat -17px -17px !important; -} - -.icon-sbgn-pn3 { - background: url(../img/sbgn.png) no-repeat -34px -17px !important; -} - -.icon-sbgn-pn4 { - background: url(../img/sbgn.png) no-repeat -51px -17px !important; -} - -.icon-sbgn-pn5 { - background: url(../img/sbgn.png) no-repeat -68px -17px !important; -} - -.icon-sbgn-pn6 { - background: url(../img/sbgn.png) no-repeat -85px -17px !important; -} - -.icon-sbgn-ca1 { - background: url(../img/sbgn.png) no-repeat -0px -34px !important; -} - -.icon-sbgn-ca2 { - background: url(../img/sbgn.png) no-repeat -17px -34px !important; -} - -.icon-sbgn-ca3 { - background: url(../img/sbgn.png) no-repeat -34px -34px !important; -} - -.icon-sbgn-ca4 { - background: url(../img/sbgn.png) no-repeat -51px -34px !important; -} - -.icon-sbgn-ca5 { - background: url(../img/sbgn.png) no-repeat -68px -34px !important; -} - -.icon-sbgn-ca6 { - background: url(../img/sbgn.png) no-repeat -85px -34px !important; -} - -.icon-sbgn-ca7 { - background: url(../img/sbgn.png) no-repeat -102px -34px !important; -} - -.img-sbgn-logo { - background: url(../img/sbgn-logo.png) no-repeat; -} - -.dedo { - cursor: pointer; -} - -.list-item { - margin-top: 1px; - padding-left: 20px; - font-size: 11px; - line-height: 20px; - cursor: pointer; - background: url(../img/icons.png) no-repeat -3px -296px; - border: 1px solid #fff; -} - -.joblist-item { - border: 1px solid #fff; - margin-top: 1px; - padding: 4px; - cursor: pointer; -} - -.chromosome-item { - border: 1px solid #fff; - padding: 4px; - cursor: pointer; - min-width: 25px; - height: 25px; - text-align: center; -} - -.list .x-item-selected { - font-weight: bold; - color: #15428B; - border: 1px solid deepSkyBlue; - background-color: #DFE8F6; -} - -.list-item-hover { - border: 1px solid deepSkyBlue; - background-color: honeydew; -} - -/*TEXT FORMAT*/ -.emph { - font-weight: bold; - /* color: #15428B; */ -} - -.ssel { - font-weight: bold; - color: #15428B; -} - -.dis { - font-style: italic; - font-weight: bold; - color: gray; -} - -.infokey { - font-weight: bold; - color: gray; -} - -.tip { - font-style: italic; - color: gray; -} - -.key { - color: #444444; -} - -.ok { - color: #00AA33; - font-weight: bold; -} - -.err { - color: #CC0011; - font-weight: bold; -} - -.info { - color: #0066FF; - font-weight: bold; -} - -.link { - color: #1155cc; -} - -.bgama { - color: #ffffd6; -} - -.w75 { - display: inline-block; - width: 75px; -} - -.w90 { - display: inline-block; - width: 90px; -} - -.w100 { - display: inline-block; - width: 100px; -} - -.w125 { - display: inline-block; - width: 125px; -} - -.w150 { - display: inline-block; - width: 150px; -} - -.w140 { - display: inline-block; - width: 140px; -} - -.s10 { - font-size: 10%; -} - -.s20 { - font-size: 20%; -} - -.s30 { - font-size: 30%; -} - -.s40 { - font-size: 40%; -} - -.s50 { - font-size: 50%; -} - -.s60 { - font-size: 60%; -} - -.s70 { - font-size: 70%; -} - -.s80 { - font-size: 80%; -} - -.s90 { - font-size: 90%; -} - -.s100 { - font-size: 100%; -} - -.s101 { - font-size: 101%; -} - -.s102 { - font-size: 102%; -} - -.s103 { - font-size: 103%; -} - -.s104 { - font-size: 104%; -} - -.s105 { - font-size: 105%; -} - -.s106 { - font-size: 106%; -} - -.s107 { - font-size: 107%; -} - -.s108 { - font-size: 108%; -} - -.s109 { - font-size: 109%; -} - -.s110 { - font-size: 110%; -} - -.s120 { - font-size: 120%; -} - -.s130 { - font-size: 130%; -} - -.s140 { - font-size: 140%; -} - -.s150 { - font-size: 150%; -} - -.s160 { - font-size: 160%; -} - -.s170 { - font-size: 170%; -} - -.s180 { - font-size: 180%; -} - -.s190 { - font-size: 190%; -} - -.s200 { - font-size: 200%; -} - -/*END TEXT FORMAT*/ - -.panel-border-top { - border-top: 1px solid #99bce8; -} - -.panel-border-left { - border-left: 1px solid #99bce8; -} - -.panel-border-bottom { - border-bottom: 1px solid #99bce8; -} - -.panel-border-right { - border-right: 1px solid #99bce8; -} - -.panel-border { - border: 1px solid #bbb; -} - -.border-bot { - border-bottom: 1px solid #E5E5E5; -} - -.border-top { - border-top: 1px solid #E5E5E5; -} - -.border-left { - border-left: 1px solid #E5E5E5; -} - -.border-right { - border-right: 1px solid #E5E5E5; -} - -.border-all { - border: 1px solid #E5E5E5; -} - -.msg { - border-radius: 8px; - -moz-border-radius: 8px; - background: #F6BC5D; - border: 1px solid #F6BC5D; - /* margin-top: 2px; */ - padding: 3px; - color: #222; -} - -/********************/ -/***sencha ux styles***/ -/********************/ - -/*mensaje flotante*/ -#msg-div { - position: absolute; - left: 40%; - top: 10px; - /* width:300px; */ - z-index: 20000; -} - -#msg-div .msg { - border-radius: 8px; - -moz-border-radius: 8px; - background: #F6BC5D; - border: 2px solid #F6BC5D; - margin-top: 2px; - padding: 10px 25px; - color: #222; -} - -#msg-div .msg h3 { - margin: 0 0 4px; - font-weight: bold; - font-size: 15px; -} - -/**/ - -/*GridFilters Styles*/ -.ux-filtered-column { - font-style: italic; - font-weight: bold; -} - -.ux-gridfilter-text-icon { - background-image: url(../img/find.png) !important; -} - -/*RangeMenu Styles*/ -.ux-rangemenu-icon { - margin-top: 0; -} - -.ux-rangemenu-gt { - background-image: url(../img/greater_than.png) !important; -} - -.ux-rangemenu-lt { - background-image: url(../img/less_than.png) !important; -} - -.ux-rangemenu-eq { - background-image: url(../img/equals.png) !important; -} - -/********************/ -/***Sencha rewrite***/ -/********************/ -.x-toolbar .x-toolbar-separator-horizontal { - border-left-color: #bbb; -} - -/*EXTJS 4.2 BUG FIX FOR TOOLTIPS*/ -.x-tip { - width: auto !important; -} - -.x-tip-body { - width: auto !important; -} - -.x-tip-body span { - width: auto !important; -} - - - - -/*@import url(http://fonts.googleapis.com/css?family=Ubuntu+Mono);*/ -/*@import url(http://fonts.googleapis.com/css?family=Ubuntu);*/ -/*@import url(http://fonts.googleapis.com/css?family=Source+Sans+Pro);*/ -/*@import url(http://fonts.googleapis.com/css?family=Oxygen);*/ -/*@import url(http://fonts.googleapis.com/css?family=Lato);*/ - -@font-face { - font-family: 'Ubuntu'; - font-style: normal; - font-weight: 400; - src: local('Ubuntu'), url(../fonts/ubuntu.woff) format('woff'); -} -@font-face { - font-family: 'Ubuntu Mono'; - font-style: normal; - font-weight: 400; - src: local('Ubuntu Mono'), local('UbuntuMono-Regular'), url(../fonts/ubuntumono.woff) format('woff'); -} - -@font-face { - font-family: 'Oxygen'; - font-style: normal; - font-weight: 400; - src: local('Oxygen'), local('Oxygen-Regular'), url(../fonts/oxygen.woff) format('woff'); -} - -@font-face { - font-family: 'Source Sans Pro'; - font-style: normal; - font-weight: 400; - src: local('Source Sans Pro'), local('SourceSansPro-Regular'), url(../fonts/sourcesanspro.woff) format('woff'); -} - -@font-face { - font-family: 'Lato'; - font-style: normal; - font-weight: 400; - src: local('Lato Regular'), local('Lato-Regular'), url(../fonts/lato.woff) format('woff'); -} \ No newline at end of file diff --git a/styles/fonts/lato.woff b/styles/fonts/lato.woff deleted file mode 100644 index c62bcc9929bae34948ed274f1fa2fdd3ce042870..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 50112 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

`W~&{;0g4Mp@eNVBXQh8p3Dkr^LD~Wt;IpG#Xsz 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 U)t1!+LPXleT3C(%PZZ}r03-5W3;+NC diff --git a/styles/fonts/oxygen.woff b/styles/fonts/oxygen.woff deleted file mode 100644 index 00f158e413f2bea15b2d7d1bdcf9f3f6a7b4e60d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 23336 zcmYgXV{j-+qP}nw)0}!wr$(CZEwD<{jptj>drmY7t`~jaeG{4MMMAq z0e+h%IRL_cGBfH||6k@m?f*9s5hZB=06?o>4*NeC9a0U+D$+9ia$&!^%r8{hM9UBi zt@Z7Gxz%6%C)>UD2N?}robUkvfW?0M{QU(D=qmb?iJhtSFXsdR0I~-F0BLYY0~BPc z@Azv2q4wJc;{SkPYUOV7tLgy&aPI&B80I=HM`@WE>l*<8i17XPq5lO7z}0BD*)RFa z{rUsI{{=BZ0{DQLwUgT~mk0m=r1=|5DePM=)za9(1^__p761UM761S%f01fM%*xjA z*H$t2H{Z(tK*q>xWv%b_n~Sp4|M|lQ0s?Bb(YH4K<$lKic^?3=Gb3cmxUtCV}4p;F%Am1_0nce|mZ*etH;SB47xsK!@}JZ&WahevL?hKygEZ za^Q(?GiIaclTJ}*s0%oth@gK#*+EG_DM8VKk%F0jet?%K=&1Bo!IY3el!+?w^YDR{ z3?UUCe(rt*f8f7!ZhLlbdU|Spx;<)-`i8-=a4Ws(zW8?nU%@fuSP=lCtYGYdqonu( zAhiK!C8;W{F0nJUHn}>zK7j%R`U&$5_L2T6%rn$G+(Si3j8l|boMWbItaG$`yn}^^ z43id{9HS?u@ajGu5+|R|A(nrjKkseIhfW!CVQpF)@ye*9vsP+7O`-Gp5Bq+!SV4< z_9&A!PUrrdsSX~CO=+aZrU97<2H-^O{rul}^8s37wDYGvu>k{L=%UJkh4@lb!vFLb z92kqg{@mlC0Ti1+AO3!Dx6CYMbJq=_KS`ZNvVNrYc~ErYi+Rx^Htj_=^wx0(8Oc*; zKnfFt?BaPpez9K5HSQ97*gVfA_BU?gP)FGKBhMYS$5Y-Dover>VdL4M`B$LC!H+iL5lfRQ!iat#NAsHy{tVlgh4RN|QCm!x_mA+mx7k=>1Tl_jYzQf-}K9lAU;;@w1kZ4()S)j#w z#AQ4%YIRHNofCQkHr)xmlX%m|dIb7f{J5Lp0Nnj|C)9QvemCP@@U>X!R{9LfO>;~s zio%2nhX*`d1*cSF8ppQQQ*e!GAAH|7G(TFw+gU>*tEGt|o7h+T(d}}-vCu~FvAOkv zlO^(aElPK1o#DJVD>*ibXbBO|!&yN3l*z~OwZ&JpWrErjM_!wuJP@K7Fc+7m^+8Nl0 zuq5TuUq0k)n~G%SUdi6O8!!omn2~M%`}+LyaZmNNaviY(h%2txwv}a#7lyK-)48ZX zb`LKKdzZo@%o9u~IeQOXsDgy&q5 zj#1U-Yj=@#FO50b4Ev}WlcM@X-OSUXu5rgG9aIme@DuI zgCUKs)ymPpdv1;4en9S2GkgD=)PC0xKR*EQZkbh`;CxD|&%8b}-o}_PiWub#Fmz0a z7sISj?>&Ph!QSJUm&vLc*r=AM2^t0XPiz?!N?N9goq%0ak3Ep20#cv-KYJA z!@O=5d$Q88ryrtQ;}a9!U|l+R#qbU7`$e^lo0nR$Dy`BkLz-6slA~*L9JD>k6`!3r zPmvGl@RT;Z`CX4o_v3l}??-GNO1V6N3%=_Tmi_ux1HYJl?=c?NIro#f1p2V-`Z8T z5Sr%Ak)$mWzJf;x?Yj@@U_sRfzW}LW0lT*2Y!?*-oP>+z0&^EI9!NG_!g|dHms19N zOr-fl+qqWRSJzX5c;)qP3o)6g+g!%JmK)NoznTZ6>zf=ITg$Z32 zfr{iR0sUsZa7OFpCS9x$y~_S3+hwd>)}~2&Xf=+|a4=!)vT$1XZ;@JFR%3roVO`U8 zAWyDAZi^vYHQ%o54e$KhY!tRtXyUFIs}Kyy^g5n4?Q-4xJK62!-Q@6RRCT4VzF=UPv7c zgq%f;sg#&twdfjH8^Ut@eQbz8EFQcA(yWa9o4{ zc!zpNoF&ee{9w;a{Oe8iFhDhjNB8#l598Q$#$prv}WLZ zIq4s7&184%uk?&VJO8?S%QjJ~KQ`ZI>Aro@p_|a~bbRc`G>@B>agY4@!~FL$j!ngk z+fM#%y+B&^@kRO3>_S0;gZ84%>~e%2G2{9BV1C%u@{I*1t?RxHE>1eldo!Z zhL5V7&crMdUA)({Mb0pN2?W=mSslBYm;-$>1I2i5F}gu@j^-AYN>$`5_I^(P`b4Kuv{Xq|Gr$bUmHj_0d$>Qq6onp!4gm?A`_UMCUVz5z7x{k zT`J?Ey`jlce)$^imLpbUYg8DiL?0!vYF;&@;#VnmQuN}=3s7Ma@Rb1*nLvJ{0`f3q z`zvawSavy!OG1Q40kbAad6q&#LUEA@0p#G}APG=c?j&N3AleL?pIOi06Y$q9j{Agtrj0@Ch`sgJl3|ss~5@?Yx8m zye1(_!DaP_(iOv$;CO*b@lK_hmV4>T8`-ycU3nj)iyI)`*=8r)dv?^6*Eo3~AiXL3 z^^RWI+kx{Xubl=2UMhklGv@ZPXS$##YLjf1AP{QRDOXe^A*h$;juyxUGBe*<$_qZS zphEFYaym5t1)U2OM$IOuztdyZv3hZo0?lFU1$u2`VgsU>Atihh)R+^r>uTuc6bfX}ouQP=Dp*6e60%hg7F9i`fVT7f5T zd+GD{rMf0sio%hz)`Tf@CjDe`6=-dAVG+(`f>7>g5`I6S?lS_1-?K9@h|;*15ABUc z+#qt1Q`VD`$@)cIjeu7(JXNfyyuZ5CD|M)Ed8aSl8Y#7h)>f7^uMe*=Hd})2PKIIF zM#BZqSHc3J2Q9_VSE-ej0KCwIUXwrsPs+pl7a^}M@X%H|3TW&~_l>%@9Pq+$!TWvRe&7s6CUsFN zyKLHo$?p^DF0xG@o#%zPGcW9yump149YR%@tfb-J z1*V()8GeH!Lqcnn8fig-t&@6?2Q1Ybz|QOY#{Jj+T74?ei`=bpEvA#7b}{!kzS3^? zA`{}8|6D%qYuo?T-nuWC$CkBWLQA;PB-y?kwOx zzU;)MTj@A`ptFuf(LBkAViRW{Td$}VTGb%sh;doYzyL0afsK0YzN!!=+Lc)t<{$DP&k z?LM3$rG6Mfe-~(N+vS8P zFcm_~y|am4s^F4v@;0cT5S$=xGu$HF=Oi+XGRq$w|GyI{1KVWTa$j3)_56=vBd;7r zfGhe-b-}%C{MD6zvTGjw(b@+xsU^&Gi|DHha?i=mQ+x!x9sYIkc#}K$yNjcO(-{Tw zv*em0f$i3}!XCErQHk^*6N2SU6Je?k;y=IP5q-t-Bj9AY6t(}8MoQO0144j_Y|}h$ zH~(Yi3~Q6jiDI^iD$#dWpO;XM(uxy{W%bLnYkI9Fce zI79K|9sz1j-)<4oDcdg4SxBNT??#nPz><>;)xP*A0)T}!{ihuETcesqd>&|`Qw*rQ zDCkw1rjNujB3vX8Os(X=lm6T;)Le)X!J6QWv1)FH$u>RpP(sR%jF`A~5ni_I!q6T6p0rcE!DL{~tU4y=d$DZJyly0|G-~BVg#&7%c;=t2hmv4g~(pNt51e%@c zp|n|r@EP$M13oEMtoRA@hSUKVj>{5z3py|+ zPUV!;((eo~8`I2DVp(VCzkV7?50?$LUWK19(k!-~*GqWt13qD(6{IW`whK)ei91OW zz9im#KhN_^SS8drbw+2i%A(n^cP{2z>$r~gV;8=nTR4hO(XZi;p#70rIb=}I1nYjM z$TbkJp5DJb7XYxcvCk4%w7V(HwOkKk#lWba^?~%-QlC=5-<5y{F2@ zzMOmtU`iCQ!B!QbHe{Sjz${VnyRak6K}ehXDTJj`$EZmY2O~e~ftsn(X%1Y8$^qKhPwfHkYd+LKHH=4zzdS z8R){!vbWKv1coO>i<12YPSwPk}TZ)#L^!Qo964&$Eqll>? zy6aviCnKEh%~SwLLcqTnJEw&TpnLsCtW<6Et3SC6P6Jmj@*#K~i{-~uJX;sg$X12aO7%E*z`3&dc2tx4=3 z-`4w!fzaU6fyct0tVaq37fiexrtc-Z5oDmZI18kDHCWMGzMp~6J9d_e_f`rN6(Zb5 zq>h<@PT`0oJJR>eF%tr+sYu7QD5UdLGD_Lk`&KLaC0Y#4)B2XFzhcdjCB!RPqXB?{ z8O-(?DWYu~hYfG=1)ZCRA7xjO^k$$!;-$whTA26zTX92H#`Kj7pqSk_Oa%K=l;0E3 zvDkT%Ja;!Gw9@xE{nSPC@Lz!e3=Xg(i9iZ9P+lLHgA|D2L@Mw^F<_zU6p}UD-y5Wt zo`3Ex=`Jk|P^U|e=y9Q4-5MGFPErxx@16JfNDcaPM@TaeSX!&BoH=lJG??)ZDPR+r zI=cD7D!kft6H1xRX@+5ymX&GZb-EbEHk~^B=}_KbJ0Fx`bsy}u>5>=dYQ} z2Gqy{SmI1X-e3!)A2%SMYGiAX{x^_ zB^|+d;S_p|gU#OqE0S1s5_zUio2<>&_Q!^t1yV?sZd6hqR*imk$V(#sjh`XKY)C(~ zQBy1p+=&<9%du7vgr=L+36qf0VUozVXbEC0{*k6WhnSzTLi)*gleN`p=m>xK7FPUP zf~BNgl9Lmk0(nu>hILQ8l1RFD3r)SYW%ir7Ath?4NURiT{~A8H75aBoabg6JDs0$l zlK01(&<@XR6fIBySHDG_TAu*yGS70HTR#~c0=|!gcn=O~Dl;1inu*TEi4XcQq>84} zb00w3=V}T`v=88D<=|GlB#qI-sT8fjL%*I?$|64~ES5Tr;qH0j_WF%jJhJ)Fu!_4* zz9eFKf~Lbf@>?eHNC*8wx(|I+c>SY4Za{AsRt}AZ9esKys~XCUB+^b7lk&Dp`!*>@ zLR!k6@ThBVn$5-M-)KIksR|pXgZ)q)apPbYJHt@dIi^|O(XQ}#$+&zNc>Qk1e&z8` zsoZijE^Itmj(qpmbv8QNi*_F=@Gl~F>v{UwFxq&abq%!Q!uAP6)OE%=FhtLPqd@lZUxq|D>P;o z7@JQDV+T|p4BBe@UF(0^@Q-&C6_n>7Q5wV#>)_*ULSiI6HirTYXU^+y`Mbz>;I?-+%ZwncakdF zXcfzeI3m~j8H(6@579EyX#{|V+jW(Fh>gZ02e~s$cFrn~c~r@B=BDSdO2Oy4Ay5G! z3JsYz^ZAAS02~Ukl0@vp+u#t#P4BDRTZmrK*ObvfTbx+jR08=~UkdD2)T2>?AGI}_ zhkW@sJUKxQG?puYr>$$UGg_|10@5M++Hhoi9(OPO5_Cq!u&xrTXFj%qzBK0v>1Er) z>6y=S2cLk?0)Ajf`x27$uE)zIL?zv95WHFi)N?Njh5Mh!yC1Q9*>olS@2hVWQ9?Kd z_ZsNA{R05XLFbjEtqv%HawsH&1IIg{-EtJ}D3-#>o{sx?edu>-~C&R}|*A`>4yl`MFHxU(orK+WJd2gd-M+`Q$V8`czGvcA3JyD8u?(*?dsbv! zyxi17g5}-3(&GpW&n0@u`X0&-IoI&}F6rJEhz%x?$&3gyAdW$s@T$dR^ZRI2@(;Bf zIX)8iZwYw|5y=pp1kMQ46Z3`*uo-*p>5Jgkp)0ao4!_pAsT1cRlpodQZ5>XI5A*`P z%rN#OW^r{e(=@DDEgS-7HGBayUb9s-Rm|OAS5(7bz4xWZlVN43ULs>@^IRpVH&?EM$|W}j=;|QK8>$~dP}@B)Lr^Bu;LlhWF~&}JDt{8dr-)6uCL_w zz`?&8XJ7&=lbPZ@`<&LMn?v7+xZ*Y9r%MZ6kdPwQ3+e|3neLH&oAkv-u^GucFa5T^Rvt+eDeBF?Zlb|#Y z@4#2X7r2e%F`)cq%|F!79e?c_ca0QI80hs55jQB7i`4Zo2`m^pkN;=?q8Qz8+xz$q z9QHLWRGf(OQbn?qKW1J?T?*3>GdzKL+KM1sU)eSpG%sgsECv>xGP{PbBdYN&c8Br@ z@QcjW2mYIG@3WamwBQ*MFMIvn=twdSQbPe$8sum=8X@QI(~}$Z-i;EM_2D1(IQosH z0Vv^`S_~=epJ;7l5hELfO6+up9(|+wfNF@ap~B+uS%}rX>b-efEH+t}BSAPt*FWg# z?1d1Gp&2jCiIS0|HFr`qj}W%e49gu31Xebs5(_F3I#GM|n?X`sSw}FV z5Q+QMUA@-!yH6j~$a?n){`8W##z=_+fyQXoavT-WlzDa{;u8@-vTi~y z8*^y=+f-R=?3@}aZX1g_8=|Ofn9;sA=V4jhWXy9IBnR1;-T8O5?7}#lRM^{W9gPNF z1tEr_PLubtns|HGJYHrU-P#^3ICWlvbBC<1PPAwBvFO?bWxwWA`FpShwm`*(TPLF66TwPwMRz@ZB8WwwU# zjax~;SuZy`w5XfxM5w(Hsyh0HD%@44dDJoH{4y&K#RQIXcE z@f6*KGS%~Q0ZvTue{>a6=kOWI>05`Sqv-MWeCQVZ@OSp<7)yf_8w$uKjPc`*8C0&5 zh?tD&J|h(Hs(UJ;vLl=-I@_gU<{m@hC6ax4qA|+<*kjk#pOYGYk4@$;(lySI>UH!3??TY#9S0%S#du4xAOU(2t~>ajmZd( zdNGc8goQrmT`!Upl_>55>BO1KumKkv)I~w4F&$en!<;@yjFIw^cIWSA3LK9loZG%2yk;VHKH*c_7` zK7F1uey(glPKU8c)0E_WTVVt@FMuN&W|B^0>y#$@QEV)|8tv;YECY^gf0GSYh^)E_ z5h6WuGtlw5q4v#=I8mj0J890lO$0b!BihJL>YxcZjg|styUF*4d!nO?gQ!*Jl^=+- zL(0~3uDk6wR6(1mXCP(e+}_R5sGHn=Jc>Axy#cmAZCne@e>CV@j``w!4edeJR&-s< zJp0N>d3&jN_y1PCjJjYz5S7jnjjk!bQ<#JQ$X0(>goK3TinfHV;Q>lsg`^*&&s!kL zE;G^!9#*d(rl^Dn`!d;p$?jTP3ieMPFkti@@kWC$MABEJBm(9SxZ+Thcx(G zJr>dZe78XApI^`hjSMQY9n1wex!Gn`m2;QjnVQU&%J&)Ec=trtLFcj0yX4lJk;-g& zr^S}s1VKmJ1|MZo=(Exp^^MssU&QT8*ew(Zo5MrsfSLe}609;Yd zP~RF3iuam<@L8p0t+!WL)Ee9Sm|LB*=i1OPwu~`j5XZu!qf{CnQM7# zk^4BH(hvfm<9*AIP$LrLc$xwLsUSTEJKs!$e`|7*xHP+jI6dwa4S*NpULEhfGo8aE z$dbrK54+9&HaYB(fd-egXxz+bd4u$xN5pt`cP|K<)nLe&0-y1vl%d}JPe3>F5kc|# z90TjQu4^#Y+E>9MFmm*TIa$7~3g15(hv~Qu`HFv15K5SWS-yZnDThZ*D(^F@3X`J_ zg~$x)5{3tKm-*9lh44;%>KLpbH~U_u19w_JUA)1Q4zQ0n2*B6@*& zPqNNW=wBWM6+Rl=RAFIKo!8^RK!3pRQY(YL|5-r4`ypUE4 zfAk&V^--Bf3F(F{K3J$m&VHSVhGSQo3Vg3m(d8K)_#mrI%R$h*G}UdaYBz?@E-;(x zNmMy_7={sij3tRUPs$h{Xb4f-Ch!YlA22|pgi6I)pB$3&giScP1 zOX#pSp)5rW?sxO{%Zzu5$5*aHypOwu5(<08XO|dNX=YoX&lxKZ4cD*+RR# z^U$f0Kj_kn^_W2&-T4`iId!r}z`=MFbR2{@TH+bi-ebu9Flah|L6T1Ggzu6s==9&J zC2vTH)LY%|8X;XT2ts-TK3OqfM!Kt0zjZ_z?`n|jwfcJTun_h2b_BL0)EGh5QJ(5X z2upW+QInW%AE}|Bs6SXXCXKcCG6RJJoJ|u$|LO#>cD+c#s5$q&I6{)hDT${HmmZ}9 z+_8Dcc(D)9e0WTuKpqqXM0tyzK7WL&dn7Za{%Fi(sJi>#6v(xSm=d}F!^oF9oX!M+ zM_hFz=Xc&i=TW*(Gn|5J5N<9c$-iD_ zXQy_#y*qPyRs#bVZ^FE_*lCF#Js>pqGdc9E+5@ql){RSB8wavVwK{RZ$8zjt4(p{2 z?&WNM6vG;4;8G~AwD%lANZg3b&SE_C)h-3`*iOYi)F*&s+_Apj5b(G3#DPSB3QHrR z^oozReWR_zwSVbjZ6sn3Z2QqJ&tW_gw*TzpP}Stk&+3RzwdQ-d6(TI`Y@lZ>B_bdC z&P!ptKr(BKdg>v&dyx*)6M-V2owzdG4F>1JG3*$#2M`U4fLXT#S>F-00*b;g8v8CA ze7sqs-pIhope)a^%yS@!&TOD5)`pk*+GS;%dp<=w);TLa$}Ij7eN)8OhTX%36Vf!VjSlj5E&cCgC-J9Rjte(s>I+ z(0&k5^tR;>4^X-^54S;Ip7;Dn32YYW z+hbA&Y!#_1B)c8H(~E6|XlK1~ZuLCrW8Ih2>n>|~ci7qd32}VmbCX^*S`uzQKN9F7 zR>Um1TXsx5If2O&pLUgx+=8e}#?l}*u*a&9*y56#8m?+XL$((Dx1W$LP&GEZNC6V} z$8hm;B%Uq@Aj{vta}+12JW7fN*e}T(cM-g_`N|8Wvj_Hs&`e$*gTCsa&J!p-9}e*co$r!Z)pWmq0Omnvi-$ybNY0p~C2ctU3Ao zS+S~~x>EPqe|q!*(PzRS1?)99dM0^v2x&-p?r&vIElK=Z1_mmliGRS?bXr#W>f!_g z!^96}YYo|3hOeZ72FlbMWV5OX$9W~Q%{`k9w$kfPG_$DBoZ64x>?>Ac*){E|g-+## zWwL-AG}=1tE*Gq0o-ds%ukIiplA}46pVelvMK`c(b{%lTKToN;BHVhqX+v*Q)xmR( z!9rc;{QT%kh{K9Jm>p-{>}H}#1G7$UG0rL`4%d8l^K?qt3KIpB>(SaNJ)8e-C0Xec&y_sF`mVGzPp)oc-+)?RQSK;C|1L`f;if* zwdpjOF|lT9SMwR`qsvxRsNB4@Is!ed5Q4esxWr3R53}?iY^^s@vo$yD3|IeC*JAsq z*rRl8?(MUmc?~W0$TI)Y-Kaeb;VLi>) ziti%IpqjjxuRR;r*H$q~tk!L-m^*eUvL-}2z`5Jon_8x^SeinXXJPA>ckqyMlcF6i z2;X0E;_ea5)hB~Km*(g1`bILMD{l_MYxj9DF&;0L-d|Cz*3y4x$vd}nkIf8@H=!_x z)X_~vGb;1JTpB&Yw+PsjHej~F6sH-$5GqHkfL5(~yA;uS>H5Qviw_dfkFTY-J_t%uUHrevo27CUKWtYiG5Y%zQk$xadf(^1jkd zF!6ajYSqEPKI@-!s@L6kUvaoe;=`#DIZS5Lq@2dJl6X0?8a5>;e`*W(&YQO?DX2{G)>Z_WQ}&mP#Xf%Dlc_wi>TD7c-5`;6CTiZ zCfIxM^{>#}X$9FSEyBtE=1LkHq~eIaPEcRU3SK1fR8GZ9-tAvSgCsPm_0Wm>y8adk z+)1o}MMeyk3mOEz4Hp@y-h%{$ScbgH(~>e;qac`T2)Kf9DaOES4*iJPOcC;`S6%mQvI@Ti-J`HqSe2mo4 zp;*PHY3cOi_{#C!Xp2N&W-5~x&X}xOQsKsbQf3Hs-@PUXSVkT?9v^mBMP52 zSRnO*_eRtm(J(eQXGg0gMqlL)cVm~pI(J_Qca#vsN}w2y34PBj&R@eQQ-y-jFYKIX zyoi~j%y*XKv&o0qW&ejk_wmP`$Apu?;yurKmf^zA_s7%ZLlUR_N?ghVQzP*h_QG>6 z(8##heV&`Y1L?lxDuP*V!ouY?gT?LjqyRQa9UP-|Izqa zLY!9{h6bFzE%vO>IB*p zNE{zv@Oi=mranjqqiE`>EqRJ;*0@DO(BDVLGta`(qT|ONOv?1Wl;3?-05f!l$Hcwv zVj@-v$Azt^Ee3bH_gssqUnV!VX)^H*CZ~&P@I6(S>CAN6Q)RkiRv6F?vg|>rex-#f zn9Ar(9dkQS{+_9YTw!ppJw#6m23NTO<#KSbyIYusr3uKnxatY0Ef6}cPaJaer#}it;J2*Usi!Wi=csZkOk7xQjKc2z&*K?~?ad^3 zLWV=FOncQ%DofLXsAjPVN<*>eT5+g&m3}sr3`aGL8i&jFu&jW zm@ZmqpCCJDS-FN1A~E2lbRK^sVTcCoE?5nLyiI+p&d8*tRBk2H zrC5rFkqXzRGuHI>4)WIL_ohZON0eXokUQi{);%iDikC)9ImUvRlTnhKe`$e7Y?uDc&WX7UR{xqG^&g~L-ZM>1|S_oKBK3`kClEQN29$xf@ z?^r#mzWZMHK$7Zr8Ll|~t`1nt`2sI7Z84wo-gD`XAx7loYCLYA1ra)*cH0+GJe<{N zLwEtac1&+_D1vvnKoOwFJPx~y-imMOfh1Q`|6C<*5%|A3)Sw0T7Y6C&FtUDs>H3Nu zA-{t#IZ?d#Y3l*a4|i`mQm+{4CF;0p%ap)BFJ+R4 z2%8uLYvAXI05{>yBXM;XCk$%gZPl+C8)i8f`mLH%)h|t9>vkrf2M^AJ#X==_LETAh znLP)g2a?L@tQ}~-YRiL@0?{DYdwRL4I=;>=zs!q&&V~NIzvSp6G)5C-YAaTBC-Mw% zLleg=5?pw(xGDfKP{26VBMN1Kgpu4Y>TxFhZKRs5)`%12BO7m5fZg%SR%c_5)RUXI zx8HzgAtmHNDT;A*HW2laDM`TD;J9GBC@d)|ZrvYZqpxvaSMJ&>z04IrM zLZ(dSIU6&E>4G&rPz_Y!^sc_@*HL1g!>Uf{gwDy*MDAl-Baam|*0j+UTFB&2(lR46 zNu|$}0NeAURdIqw4d-mR&coYdZr@^lfUME{ki2x3qt?T_HA9|^nwuSAIgCtrF?U_( zHYQL%7TJAjq}783Ly(rs8gzhq1+;Vy6DDxP$1m=kDBfi@n}V1H*(g*(o!~c$Zx%Ki z92CSyUtv?r&~F~m&sP9B#wxITN%SJGEo>zvEPbYJ2*Q#4@y}YNO6AXjVggcTljV>Q zN99_xRh6)%{0?;PO5K5d#@OV15Gk!BC9#TR5>C0b?d)Uwb;Gnlf^LvRN9}d^I8Q&H zF@sdbyeQ}6bRN6$nlOoUhi+*oX&ZmaJQdS2u#55}FNk2C4Y04a$kpS@N8YD5`?s^k z=+q;WNm1IJ4wr|F&v(1HCFD#S3VBMIZl@I-(VYP0-P?KQ#sk$!$jsXp!4$8w&3tBN z=$J|xF~T<3bpN5}x>t-fY5xb^Q8tSru9;)}rq3Z8PVE#Wu~xgiE7sXCxAnO}hCY6O zP&&&al~ilVl;!F%QfA!zwGB}bs6%)d3X|v|n-CJJg8h8|{02p#Q-e@cvOg4cyl|D4 zHzKLh5?fXXm{N>#CfK$7_R7Jvim;AJE+}162Z*<_P*U2 zGWWL9MTQiFKrqz;=dKkyr$DJ^~cMTw}8YgVy_iO-kcNZ0mIR;BGRo>EZr z<>wxLaGyG|ey$VjQweyvZR;XOTQ<`jhv06i3&(`+5Ag?f-EpyOy8muYB$p&yY=yOD zl?{1h-hmG?MUJVIR|Gj8o(gw*vdb-3NhP&qml{K36_vxS4VIpisCO^KdtA9k8`TmM z+~-FIr7|h9L0~)51z#x{*^G>-&?1`pD745bSR$L%YeUD(SuWJV!=SJ77$spk^ZA`f zIM#}KVF2U1N3J!v?FplHAn#Q(+GD(R-}cRqh|ECXN>`jN<0l$;zVAdmYzVgE=+AQ< zK6){ZcE~)fLWD}29>0dPwIXWi_*DPW<{~?`$}D>Fk-cgoCRNWSED&7)wwGJ8X`i{t ztW<)(YW=>fmHQ#vxySVVlhIe7hZ4@#gn5oL-WA~0$6x&*^4ztgoMiywLVwaQLTvmf z^t??4n`l3^qjS1iKjTyfl>QF^;G?DPS*Z0#6&?SOE)@)?dsPp=Orx}(IKVxL30hT3L?^ux zZ5u<9APOch_<$4H`N~x+tv5DjPo7iUmSJ{1oZ)b;-PJ3rD z*ZYKt&yMRfi@3+~54z1ESAj{;j_CENeC6LhVW06d+@@nP(`7nr$g@lh{v%G>R>{R; zs*H5OyE`N5qjLB5&rr&YueF2&v*ZnSHdEJ2*s?PgjP|TLyPgJPqo&G>3#^951*>_g z<&3ONiaLvs``a{{!E29g&RYCtC%=S=l!}>?{#VRU!Mz8~bzEb}hrW&=%?lGr{Bg9e zFhxsg^Kp*@#Y*GZko#QOd5fpU7wWEgtu#^_+f)33*bN;{wFWI*TSpSx;kA7s(Ps8c z&3jofEVt&<0=Hw=%vYu8WLrmc>VPS-SZH~TaS0oM@c=*6Uh+(Kj0y`S?3M{MktZUb zB!vRK9Uu?lTM;lSU~=7tJSI~oW;C@fp1@y}NZ33kw-N530>dmmr{Jg|-~7CzgZ(|ZgUh>xV@XWFCV$erRg>I47IERI#j!I>doaY-L61iqnQ!+TJI zcPd=4_*0`87~B>knk24Tm$|u62&SCReorgYZPe|@(-d`BJk9idQV70u%#vpx6Z9A0 zLr%C<=X|A85(DZa)K1S~wc(FUZQFg^MQ(IYch$c7u54ey(Fvt(?9Tz2pw@)n$dYZi zcd2a^Sci*|gSi7emYu1^AD=IlI&AwUqqR3!6NqMd=BT{KKZl|tl()|E{?xU5hIEXo zDzC^LYbsl=Hu>q?V%jUGc+%lmJs{vHZIrfi#auXKfIGDnPYKtTof8m&Zh$;G(XK48 zyj+;0bkN0xU+A||2E{(?10PTcNvcm@4G+HVT$|r%+D$3LWcasdmp8-Xm7K$7UKIa6 zD|Bb0-DtzVN7k2H8pyI|pd%*WJf*4snV!}~6v%LouPpbMuYA@+kiDl*)kdwnQBfwm zN2I=7l6WYk$6dz|iC(_pvj^3%S8=x!tnY;V98w*i5(i6xrLtE)vb zEN|P*v=ZpBcyRf+nwzf)jeaJ zzu?V45Z6ttWkpGIa@XzuNX?~^f?_hB+wEDAXuK6CU4$8gXwe^PKl@aBg6@R^k|A!e z;D84|+XPm{4?9fHuo7~Yp-VM2ay~lLoCLQQ!f>LCMk6<%@p^r}G`^==Q~s8YtL&oX zsckS~MiBpaJLKRMuFuD|FZuEHT7O(j6`I!Uxr6=`ceA#UFVm*|*A-Y!mKlHq@HL!p zWRA=e5R$kFm)!jt4jDOHC-fip`35}W%s^R!Ln z8>|x4Rq%aQmy$40yUP0bC7lehS*K5ZPEYBMQ(ktR^&Cw246a9W{0=<@_zW+R4(jUU zDQj1<5zR?VMUDKmAsdVnj{w)xu1_fLp3?q`Py+p*@3kMT*X{o)<~*aK$hJL>fS_an zp~<=eqGV_kBag0;dELPi-=HU2*p!Ta8vA~48u@%pNr1DUalsF zq%_?}<5KyGs!?1zoghRhy>DFUmE6<_&Y>qEHRRI}{=r1Dv)=1rg@S>x+CC(KvSP67(9bk(Jv*|O<~S&Caphua%1sPpennzt*;&MD)NdJ z$zD0c_bX#V3>zhTVK)I!AJjecdtdtEqhz=?X@Y0;KtX>eyFbj8&%~NX*Yb<f(x z-K!L;O>fr=ZJszil`fK^9?cOKZCOqzd%*8*OY$`!_-+F^NCzbz6<8Q=dD24djYe&Z z*7SXS1?I~)HzWFJrwv1iq;71FgC#30n~yV?e3-aC42gL#hG6>B-$&Q)%w*~n8)qL4 zUmV$=Izmr}XRb_clm~`#AiV@xBD*_#1PF&a+VK^kFNL4j#if&% z%9|2cDG_2-^me6p{kGIDprP%EQ69NHA~>V&T3(J&@{HDO@hzUGL3#BT(6qSiSB)E? zq5a$Bu#F4UV!gf1K9|dy@90GFr=kLz+O_1Vudx%D9Qbr zW>S(eOhz_*zi-e!Su5YP6lnwpe>ULHw#tRDQ)N3K78!N%Yl`Y1ynTAG)pk2IYLc8{z?9q*rS>8c16r1>u?NITkpp=F+(L7s~y_a!_Y0w)Sp?nKw3q;_YJ>SqJ_^$mCUU z!7!cgngB_BoJxr-J>84%)=!T46KwNxdHH^f${6=D7(Jh~lbISWvY^&ds%v0B`e0v) zGJU~5aZQHtLZ7_p0AlOg(ssLN=7r|Xv7g5i!NXe?G~#53MI zch#yZGA5DKrBsy4wRh!r5tr+;Ma$c*n6hXE!qUzrqiwd*nJIS=PwhUwQ>(9Lu6D7c z#^4E5{Ig1a%`;+4Kxnh{1BSh~c;bSP=fg{fR| zu%u}JHUGtBu9GM8Vt7#Zw{OPh%6m}$c50H$Yh*QK1d%2r5dSoncuQ?vE7o@9)qv2| z+pT5*CnpO!)7o`aXSM6%GitoOKQtpn;(JdoK zvDQR^Owp|$zk#$@2Phl!n>T(#eX-2qe+))EcG0yD%#ESy`q*+U`sA5(!PeH6ciV&$#qP_Y_&YPN|iM<6TF zcOQ4un!^YMa^DxL*LBMax6o@aWK8$oXF3Emh`+tDxSWcPo|`nwYOyO*kyJBzEG*b5 z){D~0D-Qa>bQ*rQ5t@Z6n>DizGXt7e4dk<#`?2Gy4|LP*n9{@ayw^h6hTvYOQlyiP zN^7{FsZp9c#)Y^25gh9FAA0OF(tk|pqf*7ow-oJT0=lV~;JyVxonu~iQJO?rxzAM; zrj4IAc?~f`8txlRznnT$*v5dDt6*=FR4Q`@oGK1aPxHm;SY<8c?U)@B4eaDZ<(x2| zB~0@xdZngI5{V@~lM6k1EeBY?J#_+&(&AHIW`BNBgK0T$o&l5Mtx z8!ESd(C*Fa8tL5|QBlBChsk(;VjsC9q&p$%+x!(W_jAN@)kPfi@+Wc5)}cbCJ(_zz zUQj&X=<{OtKmoyF$7`udK?BW?ZgU;c<;Oyz9m!^IvygMZ?{$6>s0kXnCyp5aOo~GBEG% z&|D~D?$@rTR^sv4e?|0A)iwgBuH$Me$~B76tm)91)H3+o4boC2^!mw}l%`ym#hKEE zi1ZpF7}cHq5Q}tcJiPC{j30$mijF{<62=j`t;+Z>Cfl;mrGAK?6WS2Zj%dHd(qMGh zayp6(r!MGr|58V#oFB@rRG>u8VWdnBlSA6Th^XWjlWW79n*>hAV9+L<@9~R`IEZC& zNIouUSNG6wVfI+WvbZuu>}jOA-2%F;DUfz9-y*`Vu!$0FqaU z_`>;y%W)=d)BOu>Y1iWrYqhi4JkHm|;WlryboZQEWRNhB2UI-knver>-- zbo*JP;-a{of0tzEALcuMS`e|qGS`MIZq++azicvK{A|Q&PoLu@x=m_qG2PhM{>A2K zw0kx#!9BtBjB~E8a*Cr3y-_(OJAqlPKeIdAauUx)zjQgduJ1eXv<-wX`ukWmy}sRJ z-%AE5E~fy0>$PblcySYKpXT+Q&k|>Bu_uk({bE?{v0~M8RKJjZoDeBqZ5d9zBs6!c~o1q?d4*MsY1DQPRCdCxoOQ^_+V1@fA0{p z5W5f>^n`t7o`T+RI()rv_>D4Nqo%G~dNw$9M_32@AumX4xG{HqZphosv94Nb*7SF> z%n*jvG{dIb%Q@h=uwLo%^(w{hA3zfrV$+N#-E_YbYj~h)7qMq-Ckhxp6uJZXuIY~g zKC2%`&4Zs_2s~5aXrq8KxOzqxGKB&p%|aTxLqOF29X#y&;c!K-i$A^z)CPBl*_S3&%R!Zg2(C^?^Gy* zs{x+rvNz!!&;RlIKd93YbjTlAY!=sFuQs@E^tV{XrvG>7^ql-Ybmk(EuML&SeqEyh zZGXHMX9I*q6zbKrizkf2iY`PIkDv=>c=EUnTOQj zy#J|Si~IN3I9j&=SXR5gFwbT>oTzn`JOo_y|ivb&z$pJQqFr>y++7d%+` zbJSPd*yYB`PJ3M?FHA~8e_HSk$_oTjIGO2O)m8Gt)Fz0g1uvk; zL6&kS&7F+82zQC*Cb*78uIGlW_(xk_E&cW;ThduO8+<0 zO?#7?hvZZ2%r2aFbYgFoj<0vUDe4-g++RlHhvb&KR7Ne#&y=|j>S(w%Dp*X~|(y%uqu;`+DiM`YS$ z$z((1gyj6>&&dnOzmacH&{IfIxKgB1EK>4QhEk4D$xs_c2D+1_EL^1jw4PW=M&CM z&Lb`wE>$jTu3)Ylt~G8d?kFBso&lbD9t?=4|% zkU=xrcIsSGK4N3huaW~ ztfX6%L(9o4*3@%E7BZa8GhOdxl0)l>Sq<@t~8 z3J=Fh@7-MGS>QXKp%)np+s}1R8B1Sn?mmd#Pb$^g)WTmYc~F1wYL^d}dGKOa;Mi}W zTMmtEzFGJ4#pC1GEz9Il!#r5d66tMe)j`SI`s!CGKbH>ioS@k)?%S*--?b+Tkn{$ zi?|D+`7#ew?`tgNKvn}h5KqF`Drb@j`p;1K7{Y$@jPsht|3wJOpC8nnK0>|pI#M>xY7vECtN(-{d z6=S$Hdo`?Y(!bse9Y!vc-CF0?_cPvf6&rC>zB?tO=7aBxZCa9Uo}CpwvPSe;^i^+c zv3(NQO%aO_cRQe>mYLWTY8wa&plI9&h>$3jR{|#1l5tdJN~J7%WgoaLN)W;q0na}@ zCmIW&DY)|%<~e1~Zw9l-f4;Ij_js#U1lWkmJ8Npxa~`B8H^NPjXxxKePrXI$_{OcB zr1q_h7;)s$GiTG6<@Fp7rY%afX+5)Q8#5O^xtJ$HiRMz1RuxUZ2ECiVG1oEn<5i=? zzOZ1aFLwRiQx{Qhq(u^iS&RNpaK{3sG3`b2!tO{8dF#h7@WRJhdbrQT)4{RB#q6ZD z61g|j*xu7SXtnSf$ZsMRmq=Zdx*o_I*4(Bm-R`qUh(PX63M4dEHLKpCCk2(IO4mO# zJ<a2$~tcHC;IRT9^H4-EK7h(Qt#20_1zP->tSydc-5fkdG@zqDBVEss3pp18UBF zR|wh`R*|9UM{_~wk{1QDknKinp75yQ$pcg8yHP)49y8JgslFkyE}5Y1^JR5covOfM zc+q>HE<84#Qy_{#m{+w(ZjY8%0Ny|*P>@qDP*9Lp#|$aRt-7^Q07sB8LvqT1sgS%{ z1`|kbrOXrr-bi(8gI7qSoId~7Cby2!dfj?)WJcinmpF-q z72udS*amP)+XE&$#CPT;LsHl6l9|F;%LaktTl<4{^;@M#akUqK>BfrhbDT0!6~l(I zA=eh!+-F3U&wVGZV`n^ugetaW+KIeoeUNn2w=ol-eMRhuBph{Y6=!5|CY-bx?N*f{ z+D}NnEa?6q>;7wcQz7eDxgSoPYj0{6eVr0WVk;kG-Ymk7`WZF&PBFPPV8@JC&AdB> zSIyn08OCSbrPZ&|+IV5KUVA2JYQ#pUU}5?LFm$r4!k}B4O`o5wZUD-@XYmmB i=o9VvUhcH0dG}N4i#_Nj$%na^A_@@#^nGA0!G8fGf%6vt diff --git a/styles/fonts/sourcesanspro.woff b/styles/fonts/sourcesanspro.woff deleted file mode 100644 index 39033e43bc986bbdd2ea85818cedc999f598b139..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 29448 zcmb??Rd6Of)1BE~v)9bb%nWO0W@ct)_L^bM%*@Qp%wDton3G>312ZfAIAM1ZrmOVfxM00s%2J00C){T-If6n41_F z0|Bvq1Bm4tY;QQ3>E_?$H<$XI$NvTigbFCGxs9{?H`n^D2iMy1K?!YmFKO>+@-6Gw`7I~)50b%N&%V=t`*qT$ zPUZU@Xfp2z;@`BTWXL_!NZ-_ZkRu=g`=ILjfsQdnkt;B>uqMZx7RyJK|UbBfk`~(26F+70DK<=2r>yq1?Zpe z>g${O>tjNQLLfea?lT6y(7+=2H~t6$i6aFuzF}Hqd^ck;hBf6Hc8)xOXNF;hWJYgj zuWYc63k(ZP49pCS4@?S-6b$djA|)i9`}*oTya9Qj2RelgJT(-UC#@vNBLH1A3D1vw z`Fi@2`@(w|p5JNKzQ>x+kMz~AR#=yKcH z;w+tzfQYh2tO;6`76=5_0R{!7#^#13M`uT%$M5majjIhSO>GS>Ol*v*%kWY+v9QQ& zyG&C%aYFvjz$|NMUSa@Y!_V{fPOjf7Ug=6O0_X3ZzY~)m)5KzR+C1<6Hl1}~!ZUC9 zxj*5_7rzeM{BG|4`=*fYo8B60SB~=75C$xfky!n22uo4 z{eFY}Vg`Z*J_LdVf%pdBH+;Vl_l;2?SochwI9}O72E>pN4w`)kakO|^Y82|4<1$5# zKl14U6g+VJ^VPzS@ZuKc+V;tL%sOWL@!ka!`Scr7O_tf4Fcd%=TM zsgPh0&6&WGrYu8d2=}Fn7G7*KVUTc`!K?QgK!58xQ8)}1fytc4UkQKVeEkg zH)2QiVFUqjx=KfZZ^eNj!;ct9)Hf^4bbnQ}w;zG9QKwd)E~`9j`#pJmedL>4+P?6f zviKxg=1M0ef+4368vnpB$!#ne8Ywk}?n;?f7nUeNa&8MuY+A334&-+Z%g)o{ z@(x@egn};-c%q|KvF*%41^Y`2g(5;rucUO$Z64sef|0LDIbIqx6AFM#56qd9JE51i z9T(eF!EN{vyDEGl6$zb-3aWVqFibfE0tpk-j6|H&>2>3%yaGJ(4Y979prh#o_bHV%hrPDuBQ+LA(9?Gu<~sQof^t z8U2Q3usvLpp_fQbnT7B7(c_jxIg&vB*amP9^<6E-&HarX&4wLePx!SKioKWw$uqW% zY7N>-QNxcHlAn>fBqlH~+KL%7s1Y7xha#};!wIn@Fn{I`6^%_Bxx0d39FWHziGZyy zu4EBfPgGmj(Gf_%`B;@PHk(e~Kj0Xf2Z)CGU}wBXO}!s=6x`ft6kxIf?u z#6OUw-H>toLg+|0zR2&5q(M^QTHf(^W&DCHL4T}Be@G<3bMjo^m?)nBMu7Zq2Y4|6 zef|l`n89M8(vP4>SWrmmK#CAVnT48wY8*l_sZ%f$E|{6$6`A|x9PgGyYAzLK1LIk} zjuj~oSf~M-p2l@+Y4Kz^FuiFvuoM~QpSwm!RQ|~gwdH};io*9V>1Be-*Rmh{c3jk!+9bC zJ(Ngk1;dD_n7QzFAKW8MzQ36keC8ZAIyjiWnM|rx71E)~SUJNJ0`>z3c-1r{kp?|Cy0!D|YGC-81wVdb#=+EDf^HzbL-O?F zfY1=t^u%bJc%1Xq&XMb%C$Ftcxu2VQSi?o>R5ncdsAOcSR59kW(O!wHAD0-=JYb^u zLWG=n2IlWziVK3&yQqD3W%#~+)PU0696Ze;^vN2n9aOln?sj0ERVLkH?9yod8Up+z zZeCciVQ^VQY#^P@BB6bLU=d%qn(nynzkAem-_ex|WY2gB9!c1r5~@P*KGPbB@j25% zxPN<{#>eB6fApMy{Qb4hB^X+DeM8|x8^t6)BpM32T=jqjhAmt>2h66);RS0N+(Qg- zXKucXml!o_VwGU?J+sM)cxoFLqjH1K&pFD#*lR0+97_d$c850aRphPcEbzr`AX(o- zMhPN?`GgfcUtl1OP!Y;UmMXPmmn?-@eZD>>-P^g$zRo2_-BQqfPvvMV8CbgXu5=_| zel7c8Hgw?VE82YtathBn!adDzBF3Oczdp1Bq7P3m+dUXIZ#}z~G!#%AmU<+lz4lUM zj8d^}0~VuxVFijqTZL8S1*hHrv2K~_Ww9&YiNynIjWG1fHNU_ql9qRs5N>EvN73Cs z8WNp5e;~eueZ*9Vt=otPkLrkMn0U*$4IuF{Wx|Z^RtycyMox16$F|NXQl-L44BFe7 z;edsMlQ|q&nqjU7)R!I9_ijle{iblzrNMf@pN$iGw&K+Wg3fAY{B;vHb9SH(JZ385 zYS11={1@Un`!58~6`=H-qdTa5;3C$>=B1)9tafwX`dft2Myt=w5p7~Rvgyu^uUR2* zXR`w(hInN6YcK$MzG(RhCL_}@*SR|^;LM}9_ljo+IHCVHs4dejCK6?zbIsg(zfh|J zX}jPB-;6Lfb;!Avq<2L0y8H{jjC6c-6q^!07Pbp-&Xo9D<3|=1wGPp5!cy%rvOOKCCre zL^xIkY1Xqb14ci&mC`w8?pVt6yF80G| zt)QQ3c&NxyM|o!TTa(-pv`RH zcFbNP*rh_I7<~L1>>32nSL5!99SLmjXyopeB4f-bYS*6x1koUWf{~SXDzSd+g9n!u zi1U=Y^c6#H%C8(s011x8pUxtZ2uFq(m#WObGQ}H5Egrd5_^zWU5ceH zq1UDMeK1`!kPWo{C64x3Y{buVFPgt zt<@s#84q@LDG#q=MKxD$yJ`*!WXV}k9bH$=MO_w zFcZ~Odw&6SBru3)Vcce|y@nFi3tfO8Ug^N8DVU8^KxD3@D9GkfS|iYh3kLBG>3C1}FX0$KI(wbw@`^=nRaSdK1g04cD1VKt#V??=9KBm*9toEkc6JMIyUM?p~B8!f> z?h0ZfB152{GqWw(9m36_+(0cr0Mh^<3h@hVR4uIKF$=lfcfB#ykVOeZo`CvzyF{cB z`W1L6Q5^Xl=FB|^lSuhUUc^ItSdH2c*r7NX-qjmp*WyUKE1WFo`zxx?{hC8IIqA%= zv9=UjiG6)fmJ0#DMGcxlUtN!8p4o*Pzx|DO-ZeN6N;#Lxh#RXr zeMbMJvJL&pVfjj|8%-381(oO&A|uDk)JQozI=3r*rD{hOR^99RwmN0cV5#u8@ggB) zMwa%6wGids6JF1N+3xK5&mDR3xSy;0?=I?U3{_47XEFk#@4pkbf`K!PXBGr&3oKPt zZblfDmBmfh9JaH>1`={M9M6wUuI-|_A6D4OYqF(aeRr61I2|v)5V67b^3@DB&@2rH z6toy}MgH(LndSvqX+qh#l$FoeC>R++*}2C%^f^Gbm)}Nif54kiEzh>V_b}XMAW7oB znF&8avf*^_VQO-^-bK_|5vPMOZC&~Cg9deRX?vuV-|~aKBm6yV`~B4vR+|0Q+3%+v zZXut~%|G_$pDW?-b`AD(${x&`` zw*hBX&g6r2ZBaVq0ms+08<^QLz5&FW_N#lGR-ju<}kk#{eV{Crml!G*6IY4QBGEEkmNq8=jGf(0mopXYG{#J_Y**}xbZ}v;t4>VgvqrQ z1^*8Zo&`xYj@Cltvd!je+KaK}Cv$>Ujh3_>eDpc}!#OrA1Z15I#t%xqehBA9q3pK0 zp-PKI3GECukifqv)mF;9zq_{13{wn#(v&YeI~a&*AbO(1s7>;8`ebLJ=nUi=2>->Vd?FJVd{U^ap3I2c!Ocx?-hYa8-|#W4nQOWD@PX6E8Yx1|Kd& zbcUX~k@qPUF5?i=B_xDetYRO(&AWRACzj2!!Z!^xon0a3E9JSe*xB($E~fV(!fP-D z#Glfz0uj%m*CnkyAnxFK2zg-v8J&22j@m4HX8Pf|1mY8iHreaV@u)l0I;rJYi}uFA z!Z4-m7VB>v#mbr=xUM)WeqLqSVy(21fTzjSsBBTV_ewO!eP1nswxOO1rDPt}4XT{j zyb6AKaWSDoO0C!_Hfx=MX}ClvPWP^Q{+WN=wXG}~B#riH`+5T0ig(sRTOPHc9z0q5 zylkI^O}O=KaAbhK-FOldin^{OhkHp8<;H0w3g~X`;NeeqTfAp?eD~anB_MMi)OK6j z2qQwA+$Aj0AnlI>2j%Ovg=0TnUMV|FJieze9KXq+E%I=mi!J$#L}+C={UM+VXoIhSe9Q;Q6E(XPF|K=6hxI_HM_`zc7&Mt^h&pSCSBH zIKaHW-gt#Sjfq28Wc9h75Dg@XEx-~ zfIPbCPre_*-t8hPzK?bY#F>~ZSg$^i(m)jX@EQ<1jUwQTvvC}mhNpG#*5Nw~3 zc~gYXJ&v3^Ex>$Rr0=R9i2d&QO%98Y&kJiHRJu~X292`8u+8O9E6}0`NADccU)|_Ln`Pzx_o0E*xMAvLLjo*`nLk@0@EoC)4vW zJCkkf`|f5IFCfPGIUr4j6m8J6;-|pWYI4%oE%#j$^j~-%%BMJ4f!p^JUUTP=HGb+O zB*z`{Qs^3=1a&9ii*k!~421zvMWh8gbr{GoJ0b6C{14Xyp~sS^A8*&{o1;OW>3q=l z_Ek&htf&Dr+#z84FEec0oNFm_rf;Gr1xZ%;?K{6i0hm=2eoq-M>NirYq$n|Xw~dOSaQf|1_ZwKogRpX-atXhKu(>9Irj(}x0hf&oOL zg6+P-F)DY8Mk|b;#<=P{ErIp0P$2n$nvi)j4p`$D>v}eME*7fBVp$$Yn^Y71T~>*w zkmDx>V$Ua)^XolJ=X9y=8bIcBeCX%f((ALv zB)J=UcTYan_Frq>@jlbhrGD?HaA1Eo9K2PJW$s0NDX+0Ub>}QrNkth%)r4|R=*u26 zcXS#qD$6ua#Yb!3pkYs&noI&UZ{FCE49Q$`>v+0{(SEX?w%KZ*Fr`xO65O8mFw(Ly z6q8S;r1wrd$q9(J+qQ>*4w^g@u47_0cljyf*meZ_`5W7Q9usV|K5S91*BtGj$N++L zBfBpMvgGY8l#Lk)*+=MXeo(-Ky}f0Tfw8$uL+msv+yuT0?wv(+tNGe@7_784hDMx(6IzU5&~U(F z)dci?D3;WWt`LW$YGmM!f2J(21e*@%BijXjKb+sz`Q{N@&lH^Whu;*w1s=wgP2r5vO-;Rcxw(=w@2}#o2UgZ`qn)wU_gOGnI6~6+rWE)6 zJn+7VY8El}8Dpz*A;7zo;c$jCQJN-CHi|hcMr%pBLGya&m1r5u5ls-ao76czrD`?O zB|iD`k4*{drjy6UoMJU~DH<_X9&b(Ei?-}9RzPR3C`Nh%N$9NC|5;qZ+TY5;$b>5w z$`!Pr{{nwq)+Lp+K*6+#46S+z9DwEj>nr_}8juBS7@c&Y4A=3R*}T?cSavlGG}JTP zcL)D`28rD{G{K?%x6d6xS$oiq?(3soe3;Q64PEUeevKnSl4aL{z==pkT;+@k^3~m; zaLrmJwr|q;$&_r?)Y7#P97iDvdf@K(!Rf2jB(E&5&|;MAct+(<`R%?7Ktg9zl2XYB zNRH2OGorjgOT&Isa&a~I#3mixZR>3%M$6TB0CQiJkvbL-GX4GxpW1ccix1 zwrT6SNnix*bs^k10d-tX?kuB;OGheUGZA`WCbMJHvQSFX#w$SaQ2Gn|#>&k%73VLI zm0~1ooy>r)ub?|^v5X7SAW1JF+Soxwg&dQ{ zMvA04DR5~IN4NXoAn@<$pJ2kzPhQ?luUGr)xoBb}`|-JB`M+>~eux+f|M&pDZUoJ? zq{)A-!pfE$R|KVa2pV=-uEhfA!XOcG`=>9xLKReNwkaz>mo}i8_yr=Pq@6c0IEX~8 zly)H8`EO%MMHe41IP}Whk+O>3CxQNXJHBf2>PIAXO`OI?>8#$;j5|Ks$B-86A*d&j zU$z;=7g0@D4b_f512f@(NFb)qES;EBXZ>XIE_{|EvQZm?+pE#dwmr?6t2df^*riXF z$xsWvrC{SyWwQ9_Bz|L)8#R zV~e(IT2(y2)Q$z&Y{k1CTeP%c<4LcweSUath);|rFi!`ObG^^l2}%*M*>y)hE# z?I1n98|Eo38<}U3kR|ul)y9BqX!5r2?*TW59z=#85QLbx-$0h+XwSOj82-K@4Qow`1pAfB!WpPr z)5)?(JUnYS#EK_-r4xU$9O0D&wA{qn$*M7j6|Jo@prrw0m9@Uq-)OFNPTSGUTZ=C0 z$IUuo2Dd8yLR!q92d#Tv4)jnnUvecJ}3%L zC`ts=;&-sK-IR2PpzdDN850lBS3mv%(Ens2 zZRcXel1Ui43TCM+Yipq1iD|{=#W}KY7K1NZBi~3fp0}`Hf8gwzDo8<#K)xt5C*!0x zDKxclqNAN6V~&$h>`2Bg<38R7qSX|q$DlnT)TeNDah>n+*d|;?RluH35pG)zKm{oJrwvm zrj?C8LzG#w}LW$a$y_9oHp4iGPa%^?|~!$#T(lVJx&X< zB?G-#cLb^A(7Yxx>nQr0!Cglr#^Lmw%QXksjsHkSM3BvEG_jIf4ELlo(y1ra!i2Wl^Hw!XTHs7{D*vrzH)t02%-eIf1o`YMRddUKF0 zq3EG4#gV5~1;)?@H$4L>7W6BV{=dPI6B={WHZUKcFg8{=(v_*Lm4#rN27%jyeAU~OsVrF`Atp1VIkxDc+UAoRdu9#HyWiL}2Ry_? z>$7=rJzMxn4m?|r_194M6r)<`M_e2(JX;9)&lko$f+M-Ybn}q~9=xmg6&yw~u1`zF zBa~7}TS<}$M|Wj;D`5@)5ULas6(lGaIU5(mlxk&3w|dH;MV7JirP4KIP3m{f7&oQA z?gmMduV-MLH`_ae5)W(8Xix6=ryf7@6)PdOr+yCF&l=*%-ZSe2&W_!a{-#NuoweGM z?lt^j+&QkGK`unUupFqvrI;0>7`RjuBXoZTCe>;Zpz>a<#5us$t=Z~AwR@!8T)~;h zW*AzR-jY5&>f%v!QEH0{>8A0gi?;Oy>dS&IouyW^Dx6h%ddqF1>uHPokpScyg}$Z{1!9JjCC;7xT*PI>+~YI1q-_GwP( z9yGU%*ccqVCOSAg297Ej-WVPR=frWic%t5LS+gp=+3`qIhDm|`48|??S)Fc!ndy?^ zdQQKPMKPjK(6fN}FDVL|w}zP+M`qZ4)T8h`VbB;+bLc$sIr1ywRqP#J1LOIg5l$q$ zmd>vfZotE^XZ#6WhlI071F%+@90!lVU*y~RxoqRkWmDJ=?K1zV89-A?#)*S74Wjz9l5)w~TzW6Bsc;l>;daN`<}BoPrrDD5o{*!VX_M+- zjb&-uorv!433R8np^3NGYW2~gT_Z>?F8HXSijmlt!T^EB2|{(^>Rkc70IBt^Y(=8Q zoQK?in~G-gg!LM%oK{c1r1T!o{I6?a7A}X@o~vtj5+>hPdbUiL8~8a(?6cDxd(C|K zEn1u8x0IkTQ3cPx8{!|dFWI@Tb4kZYMq!>I=bv67T#{vPb+d%29xgKps=7^kgtYq~ z$L@XyR>$%tFB0y*>-nLx!)0sXVRsC;?I{AC_qOb-UW!FHaK3L$PNAKB;clq z5PIeyd5tjm{R7=c``-drZ&Xom?&7yqsU-km97!L9}FIA+M`Y-pFqfCE~KA-2G07^L`K;8F->BQLgzw= z+-~aX+Fk2KfO4!gI&`8n<3MpXDd*;FlW?A7!8F5Hm?xV%)3M;!(fm4#wAu(m#!M|yIjQB_$L+|R0|mt z7qCi4`-V*BBN!`t_x`t6D@z4h&KaIORSX@hvgaP?sMc;G(Bz9m{xiM?{I zLT%3<9kjDvP~QG0xyps52%D@c`p$#ri}Y4YiQ1aM_u?a!zyp_V2>4<{;jPsN{0s{8 z7%+H{Wk9v8a)DOr9;TTc)Kf)zl&=L3AC<@Zajf^}=t^JqM!vi(ywh{1bDucp3nhAF zM!J%A2uG;qtb|nWn}bvQ-u5ZMG6`xUsq7fbwgHCGQx=d-)^D zjCNf!<%^+}qZ1+fAD4|A$E#6sV05T4E;8C#KNyd%0F{S|H7-*m(1*aWls<>I$&?5UPGh(+0K@1uanN{`-;S!R*p0V)vC+6tj!DYJKO~kq#0z zEK)@Ft8if$orOlz6GgJjr{A|XVH16vIst;I)WMkO3l=R!oNW6Jjz9WxV#wR%O%3bk zCEZ0m2ae4G*y}@m(VD7Y{A@v=Pf)M-sNP>tuOU^QBdG!OW!KCY@FKt{_u{MUA{+LTIpRi+@luL(TJtLaItoZ{3~H@fGA zrtKwp#izaP*@$ZN$9{?a4EN{~Rnh`dZFgj8f)ZBVMQj4E{-vw_VMqqZ+09_fo3{D6 zaIvjL@xAhDvpOh0o>%sc$TGkf{yxVM^ZA@}&MY_U%3#>Pl!=bl(pRPAcfa4F70 z072ssi|p1z7|N?CT@tDNq&;l}pR@}vT&}#mZhU;ihH%h zVp7@Y>nr~NaIm)o_{r?WJ%42PVs;U|+E_zBcw>yG&ZzNIdqlKUb+l+yys=7 z2Ejk#bkuu&g^fN;q8Fyo#oVR1hOmjf_G?dLx!J{xHYUEg)$&bKykf|E+-eCk8W*w_7M4+ol*C@)%I?^5*wfq}Fzib~w}E%7-AqAP z#YC~MZw)oDawAiZlM^biW~NoFUJwdLUz zs(cek#xj&R$g5e+Wt!<_i5F=h3>%?@-AqC%cy^{Bi56+bs{1hrQ>}LG=Z?daw~dHg zFxLp=5@)ygq4+Cg>D%nt*}0K6vycn^-aU)#r%tdaVw+_r;(F?@wIjCkz#3GseW1R) z$`AvO1&WSZ`@-!)*T(S=k}9)(hJ4!rnljk64uaVy_QRMD%=QdpHEk2q^V^e^$BJs{ zlA2EFXrDWbRjG{B4$s@QnFSd!ln-~gfrRcXTTB1;L`}?{#l!U&;EN`ZaBXe2(jjwv z^)c6Zc8{M-O8BHm??M12QexL3m9JH)X+e9oT=)4TRGF-NHf;9=(Wbd3g{P6f0)Nk@ zAS##ktaH7nwz~IkY0!QSSdpy0TxZd+-D9jb@>8hUjknUu;(^7 zk$XHI+ygy`ymB1-ZF@d1O1V-$R-?TqN1$e`?t|#Vh}RXj6NTxekkLb(2Gd&({DL`h zZS+h}cwYQY`zU$iju|zh;@>G}?jSt>w5NARSJsSYARGT&3$FOu<3C>Kvd2FvIdM28 zi+^Hl;!@-tjvkK;&`e53VHT~N29|I+TEDPu**v^?r+i-pWa2%oTw7cqoPFJPHKwe| z^au|(%HLK?z8Ax5cMNM(SPW&YOM z`*A`bm3=RVm+ZL_@07IYcL2+wlbY0lT{ZXqiXgpmhKjM@T0oihXFJH?$jNGGu^@tr zTC%i?-yqtbn7Pi8Lpz3X zsbDdM{{9i|)+g~jrdcmf?2pj}_gXKQ*eq?59FbV4Bko5IwvJejJza(NasXbg>>Rnj zpUwDZ5!wqEffDU$-#!m2v;|gGXUffO2+jwpnHOwZCLJ5*m2R9#AXUMYyxeR_qFEEg zTf%7hTRHk%lF%=ipy)fM%AQmqza#5d;*@~{nW2uOuKEiqdObnjUphvA73dWf+sL6{ z?L|UQkcSZ;oOY@GVz#%#YecqxrOcNAef|vSQ4XQk3#2QmW{kLH-q*Ws7;WE9Q9ypB zxkg-eWK(eTb9F!+xis$QYgk1$y_Q0r>K;vz(cZX_1>6O%;~wolU67Reo}wQk%_jx9 z7W}}4sWQVM7CAyY8p}S&_@igW_1-vewR;Q@Z-Hg}Ckn`DxT))h~T=@-nsh!Zh zydH>*vV02o8R5QFRIOR##?R{I#*{slr{7aF0bCCGYo3l&FSUd zHu1tlYg^1Qr9HSL{dFjo92{A_+P8-yGifz zblcGp_KNe1f8ku>qwN~kc*J!VMlR91hGx)^kvIPwZqWs|du9|Iq)8jjC)Js>ecDtd zNrLC4d{x`zqtLWB4>5aRO;@KjuWoD@TSu@vUtHdiKPN_Rv**m6WUy(ZFF1LD26i5X z8X8a8@orux$bZWJIC6vDoQhto3EP4Z==kBBVL5`WWYwzhHU6s&ZOU5TTn^TDosENm zmlsj8M97e9({m@_BNX9^-#)L=#nI8w(9w~)&jpWfTa-O;`F1&0y&`SGNMWgo`WEEZ zP5>vL?bJiQcH^93skX>|mSC5E2h1+PMs0m@gfiR(U%wSdfJ)n-{X7y{rh-x!CX`$B z%24N3kIEK|=qog(7sWI;m|tVd{@B5K8&Mi$u@2^NtRktT?*a~{p2sqcga_N7K+6l% zh9(*DR^j=|^RBAoGC{#^$*EU#;J=b735S)jQjf0UB7Yh}W%4V?ccq`J2*cY8f&-pfQ@#xyU zId8PbUuMVn^6_L9kMF1>OQ+M`L52vh+hBGvX$!Vcz$;bErt52xv zHq7e2H?ae_=F|-iz--o#Pwn+&K92Kdr<>&!5SWhrHfd1M3WQJKC(;9IG?*JS%CxM^ zxL1$n7<2hVY1Ka5aQ)Fh6q4nKDx$877H5l8O^a0m+>O8{=Ld1Y(y?QaCjj6|CgnJJ zkK>X+mbZVlgv;`UZ!qt)udmj&tPj#1*(#W5!QdR1H6@~*a5_yq$+wA}XZ864y9Q#kt@MGN)pl-b*d)ImIVFu70z zX%`c*{l{N_zE)FF(;5P_;UUQ4D1cJi;8FiMxAQI2eRIVd=Y7L}>&MbS1S$^(-U$L! z5d-P^{Y{&M9xEjUl#!mJjXa_yFVF|XUNh5DA$wRAR+RTLI}x^AIn!ASD1npfPuEB4X;byr#BzQ414}I z43W;*I2t+$80Puka^;6C-d(?8eHqn61)y(1T&fRJsV68CF=oa<9+})Sr4x8KrC&!0 z6~mV$3o$O;ns^F?V8EH96Ve0bU{aTvOHW-y5$lDNN1mtMFbruX z++Zc}C||;VJ)-GjBR?DPkFm$lf-wIU@QHVP1EsA!gg(mVUpU;P?&A~sE_r{WRe(MnN_Q+oUuLxaNv4%PBt8;~8{FQ?*mXSo z^3${HavJ*iLuIP4!b4j3&zrxG;8vX1KAHxZRH1}wCVpNqHbq+0f@fk>sQj`5(`D%_ zdTh5x=}vuC0Xk@2&!r#Al+TgexnAq^-PH=hW3x`9RI`QJC-5ND01ME!y^wBbS?j3z zZr>oY$fPSX2O&Mo?&mSXX={LXBt_3R8gDZB#92fjW3y3){}cfShd5D!J0YZ})6eBo z!$CO?>cw_n$JCv1VXE?gmn(yjINMhxu@RIc#HKu9k;yV<+_W?EJ$LH)kR-c%^0Vc?LryE{;)liq_hY&n+UkLO+!@=l z1Eas^gVDY6Ay0K73H6}SN0RC@(&Q)(`M*D&wGW*$U)mpc|JKI9S?`iH*G6lt^x168t>L-iddydV=R6h%g^r6U@Zn*7nO$pN$psz_ zbnWdJXm+o7A$FqB;>6yRjMzQ+Vo2}0edLW));K{zVb&a^$`fRn+(z0if7vQCkNClD8G3-$7Z4`TJF$2EmJlj)ovG~NLHy)WsrV5Sq36BQ3n zng`~a1JKNGa&n`X4+3{O)4j3D5c3z~`}kyfk#kwo?$b=_X?&-5(JQgOjPX6j1i9f( z$q6^&7;0O-ZGaq1dhabo`Tg%I!-eIx!BQ;*n>fCakn}7xN z5ZPfIsR=O!UqU4>iEmbVF97Rv8+r2OQ-3tJc5mHtJWgd^*0lLHi!ps5w zsHyf}tNOF?AH_Mp^xljv&anr8`6Bo9ethLX%2DJ*Y3luu^W}GEbM_%^ED@U)qv`&+ z)`Q-8{7l-3+vP`!@*&J{Hi>gs=PyEI@UuxbqC=f~C6wIri_yLQNiXO`KQxs;pCYv1bKWo-_OW+7u;0S8q2%SKw z0#H@&aM|jES9sPK;9{=~+70oZ7pZ^fLit)xX2i7om-lqao%}mskWbghRlIC#)tWQA zqZ5n;pB(N?)rl!n`6*R8^c{h^@FSnP3>BFJJZQCHMSzo3@*Ie_@3CaKldR0y{_$;D zfSa%(>bi(e8-}c|nn9Y^2EfEhENE&qZOx#2H@>&fi}n?L(9u%+@pG>0RzIQldJXZo zngfk#KQ*J!Jen=mKx=!8egB_zUmv|qZqesoS8hQXVveaJAZT^LCIwl8l$pbrnM0hJ z%M&1UyFbZ96l0TR^t^}?6< z4hX-`dCfjs4m!~O8-G&z_PVxVyAj{^)%K>Z-2zMckJN}`DF5*W;n*5coX9?QLm4mD z-Dmv3Bd;F3&eHd#)`c#tx%Y{G;**-;d(CkAwTAuRp9&5%P2DEX9xTR>Ab`8JMvW-T z!tL9*Thz7fd7o~ydGREc*?;+Ut@Y%8kIh{p4Sm+Qms|q#4T`l2 z?cwpU#aG`wo$&UOciDmG?EcdL`{Hff!hdeol`Hu9tFlNibM1bcJUpYdcK!Z?(`Z`+^4d3n~vFe9VtaW zH8<$t1A}6ELWDSQ8lIX`u`OPxbk(SR(A;T7Gaf(rw&vb8C;4H05xMJ@4c{%UI46yO zBh~wbttLG6`c$+BTsC^4RipEMyIAWZv)6^#Z1lt18lgW$KLRbNcnT~+2;2O>KXha9 zzPQ{w-B5VSyt)1cFIP?0oISa?MJyML+%HFtrzFzv5p;hm8b$1mYFFlhy&Y@bjrT{= zOZrKtMyzn&iSOP@mGi%*sZDKHrNkAy+w!aFvilZuRHn{ z#?2TWE~0Qx(q^Cc`kdLa>zH}4)y9pl-77=Q_9P`H$PJfx&&DpTE9-I~zC%)%AM&{x zUN5u53@>)wvn)gO&}!I_9R&T8W?!E>9Upd`IOn(7Sep?Oozz?ne_UFhw<^XwyC}bu z-?AQ@b&d2fHraAGHavy)IbZN%J4k!w*zdb)Z<-OOf04R}COdDtuqETrcgSOS*ruyB-*`BC z&9pu7Jh#J+{rJBF)$Ykdbl96)P|02-@I;P#592ov=4Q3_Q1^&Wq|~5qtkm zqwRkgGs9eez2<+WsUO*qNPMt(S05s^axcPB7ur#Gp?&w^fK2j0C&ok7T0IY-nc!-t zI!N(}ltz2bM~EXs(@%nbCqo{eoQZeAt1pNJvjC@T@adsRX+K<*?s9LL7tamgnW4;g z*K5-&Kgf}rWGAvjyAe%KxdA6(KtM4d(!uh{VmUP^H|FOg8m6x|yu3j@wKfE5@Fy3pkKBLqv zO#0yYFC=NV9(2LIr$G9>ldZ2GkJJeI?YDZhw|Wd;^sW55*YA#fcN5?<^yr4)XJ@ef zM=f6g7FUvm3j_)74vo{$I0V?(I@)3NZ?wwY`;FwJVylH@**};SCWkp&&1ddJKoF zv$tdxK+B|G1GRiu{x8#Zyxni-qt2QC=Yernb@U^sE`Gg_NYnQbiPynbfy6B&(A9s) z^<1DA-${_{y8lOY23qL8L*c;ynEz^@w;cV^AP4E3w@WWnp zMAHuCy#u!PO_OX3qCSk?*(>UEYw>-5XKc~GZXLxgzJP59tya! zt47GMAv9s%UrYDgopQflrGT%Qp;IIEWqbomqj9(QSFh`+8cFSLRC+BE z+HD<^abd>)IPKg&h0 zOGn=E>xU_hKddiBnWejA9zEOUE3*{rC>5fR(>2|>X(5FVsQ^Gh*QSdoDsB`H9E#`7 zMc~ymZwt`d%L3&g4F`l0-X(Kb0c!kiTRKg&SEQwP&;NrX?#;Qs~e-zNBazYdt< z&VRe`VSSeZlcanaJ%K_DY=fSFC}!IBfje5Pi4IkQWK?gI2hGl?$B7R|=z4B}2Rt(E zf4Jj{MS?Y&w!c`RpPp<|rD}^iVN1$g`i6gcs@-dcWZ^|48C*$+kB`uKbeUR16mLMP z!hCrr(!K?M>{Uep0q8IP_hv0`yZ_Qbq4_c3U@t2D2XvUi>ugA{s7!rJnll#&x zLvn5zQZ7qex0(&d>XzoVaffcz1g`WBD(z{;i^*VZOoi|pR(q`0?~tv)N=?Lf^-KK2 zv9js&CabvGot)a;sD=6}dYpwuj}mKwnO-mBIolHN5idUEZ>5k4FDii+U_vUgP^Xvx z5?bI;DtfkqInUZ9Lo2?!4~77-65z`%dSKut@8+fOc3)2^3srklC`xz8am3sEOpHy3 zET9OzT{Xa<2{q8hoZp4btD5ySDc}nlx>jIdQG5INq5)*T)X8;{PhcClvy=s=y-5+} zN|f!v*u!jZl0vxxux)#E{4%r*0*YAMn>angPD^UvG_B=dd;(6DxJBP_?zPMZJ9yKL zE*{-yVK@4z_I0LB*j2ZTu52k2;IhL8Y-TU+huNWY*=9M2O3hBTkDE2wXwMaRDnCnh zN9`)5=R$hX5{Vv*?Zsqi_4_axQ$vMJw$NG|{x-BF&mSV!_NCK25Bh$d9bl0|)}?6g z@IptZxo_R&;+i>ie)Y&>&~1o!k9S>gy|wHDJl;@(nUl`OP>unJ~_RIEEd+=j8lY$cNY1;2=7OMl>le-dGq zVN8e;NHUM$zXeMc9gtCd_q)ceTMtgjs~vr;20S7kCRc&MT0ElB!{DI3s>#S(iG9cI zmnBnLy6>wl9a{SiR_q5rUcaQufvGr|3{EPhWXY+4aAK*d#vzMImTulzz^mSysrYl{ zS^Xx5wD!|^bkmcRA6Y+*HdoZ&c0-p?H}v}OZQ>*7Y{)6+(A$Z^nF#@O-J{)`I_*dZ z+k0=mbJ0S?2_4P{X*6#J98uhGDuLC6T5<-3k-{~mx{NtP@AZ=IheMfj6VKL?O@}4* z%4>~%d+jTuB~Du1pNf)`R@sPMx{H!>^TMUlfx9xa)+W4ja%4R2rtVEaO#r0E54X^w z;x7?%+3g|9JKxmV_#>P%x;Gf4%(D*Jd|c=5KO$bc7&t$%d84;2hzy9>=m>o>0vtWOUjc01ESd5o#FZ@V5PTijXD#yJK2mt2 zv9rz^0mo>Fh`r7NG5Onm$-E0WBj*{+IR)AEu zMK`1B+FqyE#m6Fu?G^1)uVRERs3d*6y;|I2x*F3;s$H$C$Mpz~G1-y*Et#Ob)KUFI zzV+t?z;Za--lCC}GwHm`3RJ4nnLwp%4LnfW3p)jeR@();xE}GyqD{xCZH#-dE|Il_ zw!h$kX!!IKPR#i;ShtNmS+w|M%PCj$iB?+FN3Nn@~b z_{S|Y{Yz;15m{#0q6D}3%55qUTJ?^TuHJ+FJp~OfrCN{dt|5!}Ny&V;SxZS^+T*|jgYRM4+BYaWpX<32)++_h^^B=azo}lPzoyz#5jxae%}|U7 z4E;*F!VG@Ty1=e@wwUqvUtcjX()vg4UG(SiXtXRn-(_sFX!=ujBFo2*3Qq(q1&1_; zDopiN@vO(0DH)KtA@uzB`lmpqSS|NrPSyl0hf=HZ&3@J_TGX&~9Vbeu3NZT(#=cAZ zT~4S|s#tob@lAH#m!C>#Ky1hPlB&>t)&0@JnrqaubU2VVW#xYhQh;tLD{fKi(*Ik4 z&>z@;KCp-N z{VvYmP3l|A=k%wnOJ8%VugNBGnD}@pp8D%Ph{<&dci`Ff#okxM2D5dap~1V9Gm10M z(FP#$L5d62+4kzL+p@a?-jZOg=h@2PTy&p{0`vSYHBgf0C>Wa*DWn5 zzh(FLR16^Jm?x{7UQmA1?s>!u_oR{Kzo*Ov?fv zLjh*TJQ>}Df`c1&k`e!gI^ikk)({-rvQv$ya8DXrE(DnUJ+)~kAK~DhG`gGwSU={; z>E;z2{Cg_CnVZGOM)wxnaNX#3;c;|$wsyk5huYpSX8%A|yB#$J4P3GF{MBi7Z$JyO zcCY*96aUf%vSf|E|9`1o`M;N}`R|mBWR0=^f2Th7Xg@b*reTlAN{|We&k|o#UVYHkY?`Ba`f&_<3CX2kNPW{f_cJIFny5jc4ypr5r5<(8= zwZ|T1?65Jm?nJskt(BY)(wVJT2tNb}ZQiUejDkxL&|@Rg8yMqFr{Zf&_R`}`6d7kY znfjPC;tUmKH^S0L9~Vnh=Yk zf~r4&08L^GtK6!z@jn1um+BCfMBEAc&a1kRhL{j%&~%=wk4j{`^1U2*RTwhm*Ia@Q zl^%rq*Y?5)^=pSUBkD%FH52yR$A2si{?8x8kQ>H z$u9smsx_h(xD%_Ma1~mtsO+`ogWsyG;{OZb)i`l(+}d#;n>op^hN##~6o8A>8g)wC z<5flzZa-@E8WW&aZ&zt`n`PO8Sf~g4d=8g3^tM@ zv0PHe?*5Ik{{D9*|HAoqDkn=`COM9e$w_mo^1FH7sPcbEyp4lrLe(UyeDcct+sNmv zr!xN`A*cDN@`<_m$Vg_Ev`lmyEz^HUc*^#5zw~^)LN;UR#ptqXRLhW9F2uDt7jsf( z?)0GPAx5JW7ukgoa%VMi&$+$qCXbyBUyOHW@9{i%=FR-{iLR5|x;HYde}UsFlhKK| zAKXuehbn~;c(_a;&6kzAuat(<(V?i8eBxBWZxi2dnd zSu%n<`V%r_>#*&Fn5)Uw8&2PIADw?zdf@JxvMecQX*baGZfnY^_0mAPVkbFmG@s>$ zoSN`#_u29&LPUxlRiS<7`vZ{fPjD|qAN8@^4Q_Z3On86r{jQ@qb)VX_hYWtcjY9VB zT^MjtT@%n+aDD=|ffL^H!sxeP`t|&4!{m>z7U)_$yjt-4lSk*b3SuYCX!oyp=+-El zytr%n_QE}N9(Z^?Yx%{{*}TTcO$WbJ@pi`H#nGWA=YuA-`Ns>j8vp z->VT2V*(3;4niVA zMZ#RdIwCwG#rt1RqVL3_#MvY`B+Mi!B)O#2q>Q9Ir1GSyq?4pe002N0pbxMBI06a* zV89085O7TfONK#4N%n+Hk}QraovfIwj;xDpgbYkBN-j^XNp4DRPwq_~LLNt+PF_p_ zPk}`Npa4;DQHWB=Q&>}6Qo>VWQ35DIlw6eVl;>2iR2WnwRCH8Ns6?nvsbQ$msEMd) zsoAN8sGn1-QX5jQQ14S;(>$iZp&_SXq_LnGr&*%erMaYqr^TXmrS+%Hq`d@20h55) zz*1l@aD@(wPMywzE|cy%-7UQ`{RjF?`WkvL2o{6}A_CEZo`5t#_Mi|@HmH<=ok5a8 zo*{^#kYStg8Dj`z5@RuAKNBny57R5AsE3`7??3xcnozJ%B2aKY_Y8+Zy5C(K3Mvum z5frp*(wvr7G_ka*{7eNuzpenWcnkdYqeue7F52(*GaO)z8BFmQtugD)T$-@VFB3K| z?393vjv@m;xA2TZnxgoezHPuY0!T9KjujS~@qEm){?~?zzq% zUuc0$;q44z>10Z~o5dC8T-I6wwy`bGEWKDvI3PWEcMjyZg>|^?3-uvS((&O?7aR zY-W0$aGt^MW7H*#r?7kdmT>;6!l&VA-t@Yb$K%w+5QG#7ohZWCiDX1CN|7zG2G^%T zVa|wkzX2@^j0DOdm8p->T z4weq&nk=9$5`IRuBZHQV&~#*`T9|9H>#X4I7CuW7Smx}Vs_$v{sgx=IEK#FlbMs*d z8%ujAl#5ZnB}lN#-K`Vl@(SjhM&#Q%KV(Z+&9mKwYWo(gzkg;F)2b9EpO-a@)bddllt#>4t2DIh$}jaWH=@&UMRentE}G?zJ?LDIIolbFyuyZKIGKIvG!$o~ zf&;h12vJ8quLzznt9H{D5-zL<@#0idqibUEsbzL{Bb-?7Svwsj1o{mJenYi0X)oub zta1^(mUXRMYm>;^#+p}oF9@*Q{#^N7@{HH}OYKJ^HBojGZ%2(Q3}M6zn%#&}Z$%B; zWBv;n{)rTVj8oL9VodMBNo=nUR-NRfD;4h#AH>V99drwPRpC>y8NSeVMJQ!@SF4Up z5U_2vnXTs@J_==Y=&6uV&-AjP8fHIfN68Y%Y`pj|^*JL=A5ZBTK1fdo3%Q+gN#yZ3 zX6l+}SW^iq%ZoulcVH3n0rwNx%1E+(&)_T7f|&RFCAMQ`gHA-6F*OAhlEbA%x{!)- z&EnIdwz+p2N*PNA*#p}CPf3L-%qT#&er40#pQK(l4@&b@JXw~v%yrUJb9F5w-OMC% zi0;Klmh`h7dDT=6~-Lv=$xYAtt+P06sF=f;2_9!opW|LJfR#%SOUx7&$> z?0bSEw~Yl_vVExAwnVRhTRZX{RZvrg;>j<>#z)Hy>wqD3{Ge5eE0rZ z!^T)}sjq}aNIGOZ?C)hRY$;cb>fHUhY(<;!Q(;|^sbry958awJq8WeaD9PiR^mkoo z^+x?sj-8KrkSAVOgU2CWDOSU^Phx2cF(~AiFGd^coJsL^w$x|F`>!Fcctafq-iSds!x`2x2SqdJzdPvk7B|lJ7{RQYF(TQ8&#fL&*Xk1(e4n;xJ+h?t zrpiPto=-{>auiZkPpD$nU$>0t>N)wysc9n(l$^eXcEH&_5yZeUSL-9U?lk|ojP;^h z)6j`>2BKNMAS9kqx;Jc!)A#n~Dj^tY8Uj5o*uZuf7uYn#!BH~@GmEVw?o@51gp>VDav z-^A%*cIT^hnBP~;^=kgf30VRzwB=LaM`z(P3cwVz_!<5eg>Qv*yV{>Ud}GXVB~^O~ zFWM8%ja(-yPdrQT!2RQp0tI7tvVzp^*sMWlL=J1~^n6wqJ{4y2X5CM_x%!qn(^R`@ zGjjntDrcO*yn!22PF+@~1%boh9rF@1(VX&c>qK~owS6EesZg2Z)#KMQ2D_%6kVyl( z_`*HOXXEYzgwd)RLfnlIR%ZtA4sA;R)O1b0b$i>e4vnNHYDQyLNygg784fRl=u_teem@oDF;8QHkFD>NO8|kjL*Ul;6~gv!<-zNHMpb z)9XO?58y>HH-2uw>(te0GmIkq3(Mi41mNqN?mZ8O`JJt5ALfglq^Dbq&gVGk=f_PJ z5~%~ye4>dt$~T1uUMAgX{2MLD+9&3>wr6T*m$i|T0<~3FwY-q&mE4^Wq>3TTD|rqX zvyHR0%5U4(syMjwd8UwoMpY7It-s(V8c1+crBm_Ryu zLZvT1=*A6^t52a06R3Ri@`9q<~Vs<2B6#kr!t5I{Rd1jpnSKwdn{szvwlN zSb-ltWGho9y4m@Z=r}WQ6evk&#xQ@Bz`Ovi!*FV3_Gc#@9~&#xxpTG~9-2Sl6)Gw( zI_(Us`+lk++4t>Wem7@%OGDOTTM?noZlEW(73+Ptppm+B=9oj^bp97c$j+L^v8CjA z%Fr@t$INZxCU2P=Wn2;SZs{zGoZpQOI<)P^0K zb(>xqJkc5S?#|@o|1LLn(;hhZOw;}=rm35qO6Qmz=EocgExU?!!hzjVaNa;if%Ek@ zhl;zqp|95Vy$LEgNfZRHhd3sh_o!x_*3C~?J<08^}_e#jscL9VymLdhKw;;DhC+iV;zL@E5?Z9Jyzu> z09E%CB018oAnKuW!BsdT!NmgnbKWk28}NuhV$~P1FN-*5RZPs5p9Rx6`4(N$Y}~pS zHaLx#y853ARG6i^ox1xj#ES z_H{`v#n*n@XaqLr8XlgUK%u^IzrGzcsLw$-sT!FU;^}~{Z)f<@W+DJD;L)ovBOudVLf#~SO;b_Z24hVC~_k|;Z12eY7f;;v&Tb~!Lo z1drZ|ge&7hzCIF68$EBV?XD82NTR-wCK4IULW-6P#4&Ja6Nm&)Ba7~_za#=Er0~s4 zm$)*chSa9QnMb-Dk#EyZ9S(0eiV%}{U8j1uOa+zk$K+%z%A#EYcWt-0tUgE`ejQrP ztLuNxGSjx)J%1gb1+M2$sTsWJ^OISitCiIk0#fD|Is>j;)K_|%|*C_Vb-9)8Aj*{5M|T$by-vsv-S^E+X< z)p3V__HaU1K$ImDLVZiJwv1fZXc4>}{>T2uoSTbZC9-k!KP9 zddyTd$Y*_?a2ac#pfM4LjpZ5(gZ%D5&p6RPX2vCoY&b&I`3mqRDq_Cq3lPH4SrSFi zk3I5*S7JxU^P58UXp3X4VWbB%Bz=p=)mq5aOXBPfY* z!B+(1isJP1y92!No;Oti$^Bhk^Y5jTWnkr=h2(B153E12urz3kbQzruteFi+g(lE1 zX?SB}!sXE6%TrQGQz1R0BSFN+0ej-LQS+ROT(PS+3S%QNPtnb(bTpjr#WxlfEJ2hF zP3vrL9ry&pTR)L1D%*j#Vpd(RGX30Oip)7!nwocXeOkN<`^iT&b^=kJCg=a-GWxkFE%{)5;Mp+Qqi8 z1B6sfza_J?y0J>>UoePLe?ys=Z3*BrI|?9Gr0|W9qa7V&Rdqlq=R7+@78^x+^ZZIs zA=W0Ss5%~;&N?+!BKwtobrh{svX5+062l{Hz@eT%3F&Fm=On1y=_)8fayi4!m%S#@ z9co6oE`rrcuKE+n`@tW)o~3ZFFMy)Zb_4QT0@2FISy&>&L!y{_GN=-{Ht^Oz!E(aJ zC)6MtDQA5dsN^Sid?n_y+9`vDL@AY$O~U-5t@7pT_NR4y>QPaCI2?ul24m8YOFSk{--PP5h?9|^%FsE2!7p1WTOD^IY+tWlNpzILD?juLeIJwGYItelZJvPp> zZB21I+`p_sD5^Nj*E|#iJu}Pkr$f(sGbbhcM$Cy`VxrWV7LEE9wSdkV@n%GYQ2A$i zYucfKtfw)`N`9PD01ya9ypiSgp;l}pJ{d*rP;H-@<-X_Z6i1PNGZAAN?Ew8Qry6g4=>G;{{ ztbLVQ>4&}T94j5+&x*`rS2*WzaNSORr*u~D(t?ExkS|@npU1pHW^jIypU3_Y`Yus` z^acJ~i|4}z=jh~A0si09LY~@Ye&_E9>wjtr0bQPm6|a{m%}#pc(r$?|I)zyFTN%BD zM~{5%j%g25sFO+|gEQX61-IrAM3ZB{1Zw+y9W{<;>Z$$#W zW36otyzSEnoMGYR0P%_iZuJk=?kQ8aMO|Zsk{66i`&#=9GY)gzOup2qs(S1>w|bHT ze3av}D^GsYKPL5MbHnkpE1{-bIClB#hEwzU>57+G$j}-8p`4F1SKUYH{*OHEQ(8%Y z`yGE6ns?AWNH=e>fMuI6!)eQXgaF4n+7NUFc>KoO{aDXnr*=$Iq@gR0$H`%?d6;7^ zIn*eb0041gdB{mo-&Sv69s1YLGf@F+GWhaxWQ6{vi943$2U5& z4)~HH-@d-Ob{_F@;)3W8qu}$~bJ@A?)^c2Y5hDuMKNLTVVXpK?*=)-09OW=${Q&!n zMl2-^Ua;SLQ`7?iC|875X$Hk#zMjNiGHcEhpG}Bt0sE?z!DT}}>8X@__pWp*yl=6v zor0+Vwr%@4v}F*j(U!N1AM!`DYG3q0Z7>WU|GA6k@i#nl1B$N+VYC&`W4UkgW+DeO zg=ui*fmFFN%pFMO2QU~>%>j~n_Q*OjKv>gZ3nTp@CwL4V8qU+TH@aj;!VQ1};#ity zE6Cwx&@J(L?A;zjDK}1cQU_Ow?iNAYhIsD&JFXwpWTTY`0#Zw2^qEnTe1yhP5?s71 zQBp#1j%f^Y8}jJxBk#e-X)HIT!({y7gPy>5IBdR#&k1_S;W_-%P>gt}Y?Yo9uD)cA zQVKOiF(Q-c&bC?^uTXm+YsT3 zw@WG5nBQiqMVBooGTG3Of!meE6wNkC?|OwhkhfLG+93+=dwC+??(!nqnQQ+ez+q6t z_oGmtz$y+h|D6>&i`yVF(Rshxm$D#9ywMJ<1`=@-`hoLTtqKf%ua>d<%+25!GzLJ- zc0pBz2BeUSHg4vlkkOE6zjAUak1J>)8|cwYavcsX(bYg zHRlM0sxh~*Y<+7*n07dEV&>0jyS^G#d9SN>O$SH~iv4Rj`eoW?PljTbeDB~Cd27+2 zph}?_pvs}4VHlvxVPNicHHjcN~07y9P0l79TCB^ diff --git a/styles/fonts/ubuntu.woff b/styles/fonts/ubuntu.woff deleted file mode 100644 index 4c8f53cd515ec1d987d09237d552e927e7ec79d2..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 42892 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

+)7mnG+OP!19^5skRZBz3pl=n_m-qau8cMqT z=L(Ip0u(K0BxZ2ucT)Wov-iTch1(H>u|%CKwjOai3&}IM3-NUR75)z_#pvjZ=$_98 zqKK#Kz8@68<_UK!Tz=Ue7l&SKk7sz#t8-20#HmgoqkOtTC2mJ>dz%FsuxE&BrHpcWXD%OAtxcwos?C&DzjhGP5l??CVRJ?vXXDgYZ3Nx zvt(9SDBb0N zV;Pn64OCeDiOl?)E2JwK`!e(H2F&Xd6l#(c$`Gf|KWEn(VmU^Hnkf032@9JT3#q=R zW>Ia&ajjO`kUA)Bpt!)kquJU}+34$gZ;b~~@iD(H*dX(MMeq-Q^5X^Rx}90P~S>CZ4>2&{t*8hgYHwx`LFe? z)RpPLWun4kx-Iyx>99=rxlg|j#y|LrIv&%l!E^_f6Mlb9r#YDHKxX2=efqEIupI;hseG^Q|d4H<9>8F35gaBHy%{qd>w?8wpBB<0TRWdDwtI^D*=mthC8 zm>a=ZQztmJ2L%2bRGU*kw2ao|lN8Xnh~SL~Ga3#{zl>>whuNTxWuJ#B`aBG1)X2h@ zxrm1@l`nGX_u>DAYO@VE6R+FI^fF8W-QInysXd(9RRaGJs?B2HjHPa4O-7iX%-@7x z>O)6-?>XAu7^D85prl=D&N4{d&fq&f2-ZItDu2?M_Y27Jm3Y$>Z$|xOixtuS@SO|$ zFX86?Kg3HDzHxttw6I$*T3k3l5Q8;(K|7;nMJ*Q@xSW6Z~qrN1hFjPR;M2}oW6}oC!=z>;bIANA-+wCg*gD{}^NTTS!}eiP zJ5oAiev9uvlzJ`yRsKQe1XfZN?*0&6ez$<0f?j5Lro5f&13zEfl}m(!6x8{g+|-MFH2oUg@Pq^ zNe>+%`WDT+`osfQ`kA>1K*tyGq62ai5$X?ho)V@5Xe3p5y<-iRE@E#O>E{%{KQJ`| zjA$<6Y9;uyln7Wfmh==KQA$4llod&O#hd$2p+qE~_hrSA+Ie$lD>1NiF6pU0`ctU< zOeI_v-X%SSM}(4wpR&S9X}td&idWLGFDsVR$U7gdM8i_Bq^I)e&!MuENLU<~^pqYk zN)CR?iXs*F&i_*=$ssYHf_p251B0*fUKwZ`AfS0V;@atsP)RAK)j`<{wiN%>1r?xv z!Tx6WuL=<`rnw3BMLe*?hbo005>MABUVntr_H=#bl?Y3lo4CBl1(xWjy593gsEQ9& zDm?<8u1~!nF!Q+yz#=X9k5J6|*5v;_-Ujl*>)HQ*VMe4kyz4$~EztLU`mv9@={E-> z^xq8b2<=c;7KUt_zeSdEK^r`MQyZ#%O%G1lVwzVTB#YCQw;+b(guHqi3Nto=9?%W5 zPd`SL9BTwuGu-M=c&CF&>Pe@=jAzm|1rFtPbGxb+(<;$J&jR0vASHKV&5jM;5R0UT_%nmt(HJI=kAfB=Uke>vGySTu%@)t$z|Q*28E1ET8YMc4S# zZ@V24Z|K>Nn#(o^CNfN=b-$?y`a7xS(0;U4qFE}MVM?KUlhh{4k6g4iB4w7Pg*dRw z;i8mz6vKXI&l`N7sPw?nQyQe{Fx-JEJH`@K25PTIf%j>8-y;1Jf?K`T8q#ggzcRmW z_gdr2u(jS|cI^IHsY<_C4s=}{HJ0uboDT3k>dD@ht_fNkLoe5(0^r@HU49wCtvhSm z=?=*o(kHQtF`yrTR2~_Y^*hQiG>=6=7hNgef(sBN_jnLZq-?>C`fW-DAV}%)G#a98 zaTx`mpo^(gZ~1LXQ`rK5qNGTUu2gQh0uZF|h>89kDyCAa#SS1y<&hfQrEI~45}`=` zO{$pO<6$(PvIPf+KAnMdPB2|JF7t<>AlFEBOlp@p2d-)Q^}X1nGUblMLdtFw%EnI-r#$Vp=b8J zZ828aIbdeJ+xAYg?C`~pq}$S|gzy~U--cg|6MSm3>JJ3^PDxfs&hYl|LR;@f)K_E` zhFpOL<1#reyLiYKxaQYEP?-zFOi;FU>PJ#u@S_t$rWLt`f1I)R`k!a)wT)?0Pbts- zVdI+Z&h&7cdqQ>g8exTgWqgwh^}k0|jPBK`xJ}!P9MIO(SB&k|eJtK^@eOt>T@6gL zoE~30p0Xb~xc2)Jy2v@1{xYludro*E%p_`&_VYtQ6#z@Y1mGK6nCu2S1C=(V_EwdPN z6N?VZDXTo|F`F6N6Sg__1ojq=6pnqsUBG8fXU@#aVV8%m0ItA+P295F>pX%y&v^=Y zsd>H8&jLPrz8C!b{AK*Z0-pp41*e2Og+hd2LOEB9uXYMw6%G?r2i#-!75Ni}07F!d?6Q8?gC?PFjDB&m(E&-D$ljxL~kvImqgQ7qg zpfXS=Xa;l)Hj(@+xh-``id70Er6ZLi?J6B9og!T*-6%aOy&|(D`$D!*wo!Iac1;dT zj#iFWPEj6Do>Bg)yt2HByt90yJW8QWVM1Y35l4|(@v35mV!2|!lAhABGC(;_c|rM9 zg<8c>B~qnQrA6hF%7iMOD!;0ps<&#T+8s4#b;0YzTAS$AhKYWC#>l}S#kh%qgMo!X zjv<6$ih+U4j(3ECje+S8E4nH3m|2Cq$a35vus4btEH7|*Zm!nP0sKZ#UcH=@W2{8J zoC=;XmXW&Oqw_c~(6x>M5Kg^C1|z4We7Z$;DLR_q!y$HU!TMO5xP!U6zt5_~zHGf;A@{Xf$s9k+>NH>rR)wm0_(iG4haJ5ET%+bf{okXk|UA* zh=E?pdesfxP_0AB%?*OyJY+G;m0I13eFuVRj59(8U^4Q{a$rY~e|WkaWk!GCt{=Lt z**kKxT{Bda^@?m-^_u=a(l(Ek`G8>5mQ#Hp1V#l3Lh)rEsPd!?)>P#XDi0CMw)*B$^=w zv1hzL@8wS13v*LJPztU2FWUIU<*O-^S=1~$o8tN$EFGH2e2RB+E_T}E=3mf|DXF?w zYnoqgnxgZtGvC2iJHI)b=fn(K`Z-p_r$FMu z+cXfFBV&phVd}fR%d&}~`KvR~b~E&)CL&ig!GnFLXK5xfbbZp7XHT=Ed$kvfoTe6P zy0kTk1YKE6?OsXEx;+(ApBk;j$jJ@nduw51&7ruJps$X;!x?S1?{ZIm&+}pYfh^0c z0ix3W$$s>WI);ZVw}x(>ai}~qdRx48p5CGwEb0M5;hCN^~&L1Ha7zd(A8pOKK~!o!AO=znasHBxHx$ zn|-WyFlQ;|P&}HN(|uC4a=)KMu0XWSqQgrFW<$pJ3XsD}1AmP5*#Az^8zxDrcNQAr zU%B@QdsDR@Qdk3z_u!_6A8eBtTK#5VuKikPcqFy{t&CH{TN2vvqzYS-wAS)tT*ksc&l8-~z*${;~)ebNhD^XwXqMaSbn@+SeH zStS}er>b$$G_Gi`_B1EyuQd+7DVo473utmgpL0=b*C)-?ge9tSM36MLlfqv4jePsP5UCbIbe!+bxFxaR`-H9 zN=s3F3Ukfpax-$1cR%i-um5rBRdY_j#Aw@^9)D3#cQ7^ndjIC<-l@Re7iL9B*}yig zNOcg!s-jJAw1@l}jd{~pLU1mP+WB0^`KCpN8m!^e$|>x8i&x?SXp3?#(Hf5RjM`BB zwhFb8mdBOnh8p+mo*U@|&=?wCw=*&{()JM_G}LtQ88p%jCJ`G{x78LK(#o&8BTzP| z;p9>_q!Y;EJ$T*0(mM&BwtgcwW+@9{b$>M*8FIW>%zF39`zU(Hlv!2!d(ZpY=$&9& zTq$>NkS~Ub4_DtoR1A+fmQIp_>08F1pLo1usXuasSYE4KiAU~()(~tVV;j-tt{}$} zp7PX{1aFDS{YJ}!i36RecGmlIDfj9}*HeKR(Dex2Yfz2>towP}u_8CXC z{%%>Vw5B$xxjo|!59e>1&1d%t`ma|~S^0m>P1FIe!kl!ZzEtlC)}U;jkk1iqj#H!94Y4kCz~F57gMc5v)2#5CD%BP8PcFxH7S03blS(9w&kY zT(ZQ8dH6wislgNck99CmFd`kskoO_kzJbFhxhJDEJVv;wO_g0LiQ=(uS|z zQhgRMFSuzH)ckm66--wT)tv1*!s@}EA#$H(_Rh>YnDvs0!j^2=i|c_%`tMO8P9+yX zQUg)F_BTLEd~zQ%+JK)iVZ%$_P_@Gua)a zL7+VZ8erRmFy{M=idq1RIB^`k~Gch!A;U-;BSx diff --git a/styles/fonts/ubuntumono.woff b/styles/fonts/ubuntumono.woff deleted file mode 100644 index 0289699c05a703d05e7268ffe84c7110161dfec9..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 27392 zcmYgWV{mT2*L`Z6x3+ED)~#*Zw#{3+y|r!Iw%c3Vdi(o-dNXHDve#rM`<#=RWU`l= zyqFjO2=G&^004yl>e7Ed_Wzjwtp8uc#8hMf03h`r4(C7UVimy1E7LRmaLzxr_7C*K z{VsEjYz*vwxY-}X{opR|wC2dj)tLYQ0MQ2k00{s9FeHpU>WHbmnavOP@PkkQ0G!yh zOJvZ@!0E>q!uzKmSW8?jR1dJ6p$K1x*{fArqiQ^|`piZ(PYzAvPqo008Kl1`L|A$@NP9_@z z_n&!9Du4V4{sZ_oWR|UgjmZx;`4g`c005SZ@QyfcZ|C&$uI89Oeu+OkrWi2Nw7sLr zkFUj#FOc#NA`|)Oi+;xV-!~kKuw(pb1ICWJC;qF)E1coovyAjjKl(TV0#X73ED)42 zKtO~Mf=xRo^apQXD8{G8$0mmdCkOBR15W(_K|(AbsI44tTudAc_TKvX>u>xSeer9t z1}VTG10M`xc~>wpYXYRuu+ad$a-@*|#@5$2_1FIeE(VV14sysC_(}td;ok@p1RPHa zFm_aZ)FoBBj^jR24JGnR9au)WNB~mbb5aP2MYBQ z6&UU#Co0V|)jQrnM@o%Tm0O-+WoWK*wR^sShl&l8m6#r*r>ZWqHM>5+$I4C9Roh+qnb^Cq+1qk*L<{RuGB`D4@);ZilMZnrzW^W~#O=@+TkJT4Xs8#DWnO?rRV6)k7 zx0`IlUV6D+Z;dDjh)}A|BVya$P%1ndQIa&Qm%+M^w z=X2aYTyrXwyEf(+wSPSuk`_oGXFmC*>6zix@kTClk;xTfFrL-cfPl-ZJKAes2~7b9 z0J)E^1N`?tFwJ|D;Y@D6zF`Y6=@}S4;=m*Az@i*Kzn{LbK`=y)zU5)P1s=Tx&~hsgYf{8jQ}Dx0VHOI4Uo}gQ6{~pb^{^)UJ58!M$r-}fPx|^*UuVs&+<{3 zvfU6v)J<%zlwceOjV1ICqv1}`7gjbKlmP5l zGF*1RZbUgvz&zkO{;T6W&YGs9>|&P2 z`3S=tr>;uNs%op5%#}yF2a1DG0*|-|$1v)h^asXSabfT)XRTr9ux*p}=&o7gEZNEH zBY)G(MN(4Ki6njmx}CMc0onF^R0z?^*8v6eaw*h*-4^%8$o*<}9VU6OOl5DX(dJ>mRg`Ubf1Eyvf!D^#lM^8SAgcoR<+1b{Y zKO7^QDq+Eu(W-LP6Vn+$6VBq^#TK2(PHA4Z@CSeGik#V;v=}!QnLKTU(5B5koC3R^ zPkWbY`c*!LtaljjWo3FO1%ELprW4AKx;utPS67PDpImKae|%ofpTM;<+Gn~Yy__u! zaY*vgb7IU{%O3>{NCFG5xw3Q_y{>zdjc=Lw6!M?3U_acR7U^rlE6udxWTk*fW76A0KzX7{vMR&n?|52z_w!klSJG}+(R{0)g09Glc$W~OG}+!?Rmx;r}u-zbI(ScIEH zJhAGBf=x9BD)?XRBSSQ7J;%qo_+MNT@xl+R=yFc>Z|8XI?;CqHMjSgz3zl`orVHxs z2k$#(cs<@$8EZj^K{+~K?47Zk(H|6n^{J6~=%Sw}j(2O-CgF^7k3ltaIni5 zT8~3H;L9Y#NmX^ktwW~JK3$(xrW{3W4mo?97X;_Wf4Y{;%TQy`qFy>)=K@@b=I}75 z{BG~W@5YSrbRqk$yYT(M@J(`rfT0U!*}DWuMym;g9*>1kR_L|0|5<>JnT*->AF@~B zbX^>E@N9pdK04p(9+z1@CwP8JG<7tDor{g(eCi!~6i`IuG(Wv|1!g93oEm6EkgKO% zB!Xnvij2{lBr>x4gCIZz88FA-4OfS8$~_bXdVzQyb>05C`Yh5@M)ONH*~~>vgc80< z^2=&W z_V~njSN4GDNo{GubaMmV-I>*#+JvxPK22w&anwi)$+d*7q$YF3z{uEF>|kmzYm)c# z?V?xW_3Ot8f6rG$1buvN1o`s!AruqbU%ywV51V6+#ju>ZMLc4EQ%|M($mXYH5*B3- z+t(PU0tA~&Putfer$7uFTD}(V(_dgysCy_q!OiG7TD~Z9#-mVH>SD~6P{XgvhgtD= z1?dXUK>?mRblBi-C7ZTvNoI$>cD$)DO`89#-MUoI<3tS2K=KL7^~~wm#zZ*Z1^X4$ zUy%$bkBHU)UQOtkyfNb$xvoyhr{`6SLs-(Qm0K&&q_tONd)C9a^T^RT`T?{;Yu#9M z%_uLqPP~k{idQkB@8ieIF`3fmtgOb54+!ODQY=QS`x~y-cpK=j;_TPx!Vav7F`=Eh z#2ZNsrb8RseWM>NHL1|~>Kwa|Bhny4F5F$>I}@1u$$H}9!U0Em`?(Aw;TL1UEs=ji zuIkxzBfEYX8TS08UHP+KJfBHgk}L>o$~R0DBTAEb`X1u8HsMZBX-5@(7j@(K2daa? z^-(pE_Z6GyE6)sJKsWBjmSvgf8(mk=AA>_!6#8--I6Kk4Vh!Ir^B$t)mUlrKM7U}hv6Ii}pC?Jd`S6$E`{b_KE^d|yyr1{^ z)1_9+^t5diJlyXwt5YIgLEUL6q8=J4y6=q9H3t>JPjle+ZpIuXkl+UY5dRs-5uU>N z&&(Ob;WA(dsKdO>lQ|inZBj7)^$aF&bF$)aVzZ`v4B^%${j`5mZF+a#&bQ|1nd5DN1P{__%TYvTW8(& zS*$85{f5@5OGly( z6h7P`8=ZbU$7EVm(*6ck@IS4g@1El6s?2?eSYzt_!AXo+x`gPjWU7na@y~V2wmM54 zi`a__mR`jSo5jx$>17gX+_r2mZ#OR@Ji1sJ(Z%fAYSDj|1UeP_6{{*o$fWvbzq~E$ z<7HFo6Rz@AKJ_^}>J)IsAyS-)H9Fd|n8}rg(D&}nCVNgCj~qKSBxI0%ZkfJd=MLnN zwDNpV_%H6q5=Y|BV49!E%lR7%-W_s|Hmg%7rs_oC!XU(#Pv6=T@);ES4!OirpZAp~ z^$5VSdE$83#NGY*f@y5?w9M=lE|tP;?eVxDl1I0RXqXOIM?*o%Lm|HzDC-lzfNm@0 zMeq1@1zd=@gZVIY!9O<^1d>5LBLW|8 zvlQL+^Yu$TQeRg&83j+Ov>*+Mnl-sQU!ivi+R^Z}dey$)taD@Yx{lDAoNR;7+1=a^ zcDod&7N;rGsZnJm7a7;9(!%T|Ry%!>)UDC8MhNMcvr(RgC;C_f{7p`SghJtn;1w-k zB&9)Vl3Z;JJr7ocDy&vtSL6{xtqOKv;wow@X;TnWW#VEV3V|qiwb77YOxlXy|6F;0 zU36YHYIkCOaY}Gav}!}aox_66cs3xiBu4A!w=Ey+v(43bf$wNFqcJ;}egW z9D2T$j}LcDy>Rsqxp;i@p#z7(qbEG=4+%;2xrf2X0Dx=VtCbO-kU)pElD(}N#$aabnR?8lfxQ_NhfM5a@Z+@wjQ zQIT*hM|(XY&peY9g@QU9zcs>8XfRoO$p6|3AFWcupXbj=Fe7N)d(ctWeJ;Ni6n=Jq zRVTkg{H89#H8=Ksj%@-)0Q7 z_Jt-*lqR~X$OKl_P&QsB^t#@q6trpkyVtc5S+j=mL!C*&7Gm(QMntr2KP z%ysVD{|Ul=-dqq7V~d$dWVUq`?Lek5m38Y9SNG?$(jQEaE(dN4k)QfnFfU@MkBiYe zFEHYZ)Q&2pEo6K%VO*<;UYB{oO4c|hT$7EMF%L!)RCRaTcu=NzQo`|+Jf5-CrLE`aBH&nS^cY(N4~@kD4U@sF z74(colnjHg@BA3gxNF;g+=GAmS}c+XIf#GRatUJ?9rv`eGY|2!2myuUPU1qAVrxZ- zbh)9}rIzQRyV#76hU~tW;0wd1$oIAB)Z)X%P6DQt`wg(yL*RTZhLA13HDRYDu_BvX zPO2m$K4l5MJ#pB)4^C0eK)*qSCc}JAq3^m>+r7rvsERsy`->#Xo<#8@5{eejgjx_#QKiVK0uJ&vvf90HukQS}v_M+Qn;b!cd47r1T{KVRWM$_&`4i$bxDhz>zH7 zc;?W{MF;V$D*DEuX2qIicC8xw3Nn|3gAs?v3izG<+{p-)aRmc{lF52K-lI+ZjeFUS|duxLIA_Gvl@Vlw{Zv{0lL2*xI8y%+HeA{BZygiYg_5;mzrK9)jutHUTk+zZjsts>)9Nw)R}^m!K3-<6Mh~;VyJ>^K zn;y$o*my%dsFyxCV>O&jq6OX|$}FcGr)j5N_UwDzcE9^yd(fRyL-5;LoJpN@>#L zoGGa5cHVBbOue4t6|bd`9INe8-WKZl+$Ydm!tyvaA5kXTwO>G=uRf0~grsZ!5jDb+ zNbkw$(XH|}SQuGoma|y}H-8$(er0$dFe##a;-4tSLJGw5L|7n7Mgj)Jr4FG62$Tts z3C$vfVwnYY?%^9Tvb%N#d~-5zsH%*=)d&ory|0`uVE<5KOzH%Dh@tyx9LdaH!Y>a! z`~tHVCGu2FCaJbxZte3yUmb2H2(}3aODAT2Ruw%8hcly{JGU5nl zcznL#Z(3Mz8!(Hc#TWyq*GK`K?U`t{fiVQ0B-fm3dGg;A`s zuL<_Sy!n;CTVBV(+ zn4n)5=mbN(lnxv1^39+|kTpy74VNb`8L_;Aljm`)?{uKz{uY zby(PE^=_SwAGu(yS5-Uw`#!ksH$1^AXDcwp-+`x(Tl*nlO zR3=tM*KidgWSXr1!2ixc0$3qseV`NQbNA5ZRC5ijD%5aoT*jp0r9Jn}6pG!&T-y%m zl=;tZJ=Z2RY~s#oI^Ln7f@Z;b8;@E0(o0t_?A$sH{%qEUW&OLp)XJ9oxOAGSzy6e1 z#guxqX*4-s-g(z8w?SSj->46X%kjgLzy9=@%e}~?F=m5BoAzEH_XOGAXX$f!)ie)= zMAg)7zUA;GRS=+>`-``_|0q!>60L$CX39u!Q={T}y6P2yP!|xJvLhg6MkB`iH|AUZ zgBRFf$0hu>`9z(BxeQX%}k*|2Txtg9ma-B2pr^LSgd|=6vnYI(KUojKQB@Bq*N3@elgRmCC9eY2MvG z#B$|d8tZ48Ybpe<(&&4-mw6hay6nId6R8h1P(JzMI^Nr{A7Avf<*ln4hhge-C`}&J zE7hY#rHj9@Dx)8t&0tt1>lXDZ=dDQ2bV3}7zYeI4_KS}WUcwI3E6g!{o_PZ5nsY84 z%;ye*71{&PB^4$q@BWbvosdJ~=P(Z_8$;m{ zk2{mzh?Yo(QC_s_+iZ1-K?U%0D)V9?yyD2Coq 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 diff --git a/styles/img/edgetype.png b/styles/img/edgetype.png deleted file mode 100644 index ffe85f3fc57db7a00e1933194d088907bb63a47a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 176 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`jKx9jP7LeL$-D$|*pj^6T^Rm@ z;DWu&Cj&(|3p^r=85p>QL70(Y)*K0-AbW|YuPgf3$Ds;LXySV271H-ke%w7EcZZbf< N44$rjF6*2UngIBPG4ucc diff --git a/styles/img/equals.png b/styles/img/equals.png deleted file mode 100644 index ea1dffbbd2e38cb1c0856b38fc7b2bb0b8ec5e20..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 217 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`EX7WqAsj$Z!;#Vf4nJ za0`JjPx#24YJ`L;(K){{a7>y{D4^000SaNLh0L01FcU01FcV0GgZ_00007bV*G`2iyk* z4GApA6do@C00HAkL_t(I%cYaMYg2I)$3G`YTWU2;P%9Oc5E~3S*q|NEU=Vy1Q4R?Qm3Aybo3^BZh*%|@ylhJHwzLOrv0we&&E?%9Eug%imm%#Wwb8`-p*K^ZT=T8D8hVlg--@l9Rc>u(I zEXwHHndP!5${Dr!UdqJ92hzB&m!Kqd7F4|G88`sV2p#RS|U;e27!CCGgU;S9%vI# zeDnGh#yG8auxsBz&Rv?~(bL&r61!>tcEdLw+(So4=h6uz5@CK}k<$}btY|c9Ri8ZI z>z7Y-cQ51UsWCE{45K4^PXL3iYid9aKvb2Xd;!mOab1Hk4xZ~`90$i)#5e}mHTb@V x@B8?kS8LFGp{hCgpKlbA8jw=eq_q3azW_cL2K=OEQgJW2tS_ZpOu6;y^c~rS z+w#0BDfOO=S}mj2DYF^}&etn*?!!4vs{99o1$PznssTogidm;(u!c(6Z?6}E!gk%w zHeDs>T`kX0!!tB=7#q9aHwh6IpZ}q=6A=hZJw4-Mu}LNy7l|gtVoV}IB@(Q^ACpQk zne1>KFl?5~F@*wCDlr(w)M{*S&^0_fqtVQdj4T)oF0Iz9)A{v!zscm)>zBvI0tUkm zqj4EQRuN(4@sz4y(R7g~qNVhN(?ipBEF zY~G%n+(FTOyFKi5?mHY|hXXjBV0QMq+Z~*m0@KrAW(K%i!0kSiU~Ue0JO>^Rn4bp= z3t({(c)h^qJMj5{-w)Q-ey^;6Kme?+f{hKZxd}ocu(buYx53U1*xLi)F!;|uc_4W= z0tZ0=%76~}+XNJCfj|tIsjZ-8UKS8Z_^-A&E)XvrKe4nJ za0`Jj;u-cWcdd@1*hBfL8}uP^m|kbA(XAm>hlCiB59o=-Pd^0VBZTEj8#Q_=JK^D}2! zXUsZgXl1$Tmp;SceTO@CIJQ=%*~vayaL86p>CrEN12Wk?f$lD$Ogvt}8S(234>4^% zQ*--jt9vP*jK+QU@{Ievw`G5`|G9UAhK!5(Ei42tkL`K(N5b zXoH1F$XnnsJb3k#yXx-DH1q8y2wn8j2gApkW#4<>n;C%ruCdrrZhtW-U$hM7V~p=m z3XCs83GWOj$KMp3m|jgL>kwr!Y^=ip7(`Z&0}0#D_8U_1xHb5Ilo zGeQEusAs#dG0*z5IRc0K_5>vJE6S0hj=77&XSkH>)$ z$2lakpKO$hpO(QL70(Y)*K0-AbW|YuPgf_y+EOfo-U3d7N@sP z+RfWyz|*#W14D4Y&QomVlMSQtT1-~XXyUBlb)3NbSme9+M5UkgC;Ax#l9#lunpFJk zJ;(8Y2h4k-Cw08}ALPXprz8~e^@#UuPa`IIOR>cDx{ouqm8L!t+ul@J9s8(DDCvC7ScUDDssBhiFyT$KqXZ&DF()Q>vecJ}|Dubu1 KpUXO@geCyNTwfdj diff --git a/styles/img/icon-auto-select.png b/styles/img/icon-auto-select.png deleted file mode 100644 index e715be248d64a7a0f0d7cb8d2809b0972806f2ec..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 246 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`jKx9jP7LeL$-D$|*pj^6T^Rm@ z;DWu&Cj&(|3p^r=85p>QL70(Y)*K0-AbW|YuPgf1AZd5z~mQztg%H=mG{$S3j3^P6QL70(Y)*K0-AbW|YuPgfIVdPi#qiF9S#DKv3=BmUYGxm#1y%yBVeoYIb6Mw< G&;$T;_CpT< diff --git a/styles/img/icon-collapse.png b/styles/img/icon-collapse.png deleted file mode 100644 index 39d685b0e8e86313f52c8eac23e15a6cf20fb891..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 265 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`jKx9jP7LeL$-D$|*pj^6T^Rm@ z;DWu&Cj&(|3p^r=85p>QL70(Y)*K0-AbW|YuPgfdyI*P&5)z4*}Q$iB} DNElZ) diff --git a/styles/img/icon-layout.png b/styles/img/icon-layout.png deleted file mode 100644 index 3144a25106ba894128b198ac142d8295f55aff49..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 207 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`jKx9jP7LeL$-D$|*pj^6T^Rm@ z;DWu&Cj&(|3p^r=85p>QL70(Y)*K0-AbW|YuPgfb)b;Hr;B5V#p&dP z1wt>96B2&#FFnchf1*L8*cU;Ah6$_^U4@bj51HJQcn>b^YwWyqLB4|7gVSY`sqmE7 u%8GsegXef`SjrjnnQ^69kp1I@3=DzuRVVEc>MjQw&EVQL70(Y)*K0-AbW|YuPgfQL70(Y)*K0-AbW|YuPgfmdKI;Vst0Emk(k^lez diff --git a/styles/img/icon-order.png b/styles/img/icon-order.png deleted file mode 100644 index 1c23bac2ed21c30fa73adcc2dbd0441274390052..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 196 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`jKx9jP7LeL$-D$|*pj^6T^Rm@ z;DWu&Cj&(|3p^r=85p>QL70(Y)*K0-AbW|YuPgfar~T2-DH&=v1#)I}8o4wyq;1;k9PhA3oJE7vh0$wKV8f&q j6^FbT6V}eOV_=v)!DQ>Ts3V0y^B6o`{an^LB{Ts5ju1N< diff --git a/styles/img/icon-project-all.png b/styles/img/icon-project-all.png deleted file mode 100644 index c5345d1840cdc9706a5ec57e2705c67bee8e0e95..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 243 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`jKx9jP7LeL$-D$|*pj^6T^Rm@ z;DWu&Cj&(|3p^r=85p>QL70(Y)*K0-AbW|YuPgfmdKI;Vst0F`}ExBvhE diff --git a/styles/img/icon-project-delete.png b/styles/img/icon-project-delete.png deleted file mode 100644 index b49943442359fb11edeb957e0699c773ab25ba44..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 240 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`jKx9jP7LeL$-D$|*pj^6T^Rm@ z;DWu&Cj&(|3p^r=85p>QL70(Y)*K0-AbW|YuPgfbY~5qD?=s<@K|*ryhGS_m0U$#y6`@ euD37j&HMjC(d?YYsf|Fp89ZJ6T-G@yGywqHzEn*B diff --git a/styles/img/icons.png b/styles/img/icons.png deleted file mode 100644 index 72c75f1e986f654ea47ef35043520cad7a57b532..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 12349 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 IiJOG}FUjE2jsO4v diff --git a/styles/img/jfk_sprite22.png b/styles/img/jfk_sprite22.png deleted file mode 100644 index 7c928100367bf198e5c61613d4be0fb357c48df7..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 14012 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 diff --git a/styles/img/label-size.png b/styles/img/label-size.png deleted file mode 100644 index ec15467a2ff87eac47dbac023e21dcb4902201f1..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 259 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`jKx9jP7LeL$-D$|*pj^6T^Rm@ z;DWu&Cj&(|3p^r=85p>QL70(Y)*K0-AbW|YuPgfmI(ciOL zubp9haU?+a!i-ABw7Iqq=3U`;U~@ARk9wkQxbome-&MRHgdRI~U)mG7g(YE^;pRO_ x%<77a&54tqdogbOknr$Pmiim{=WG90=PVD`_7*#vnGAFegQu&X%Q~loCIC0;SkV9g diff --git a/styles/img/less_than.png b/styles/img/less_than.png deleted file mode 100644 index 5eda3a52f5f2d50789ce92815c861a3bd6974ca8..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 354 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`EX7WqAsj$Z!;#Vf4nJ za0`Jj4D01LU-HgoH!AK^G<%U) oBDla|TE%ge&%v|K{r~TCzehozZ(@RFFwhGOp00i_>zopr0E`)aL;wH) diff --git a/styles/img/local.png b/styles/img/local.png deleted file mode 100644 index ccc6811c0c8ef2e4d0f86ccba0847ac39e64f4e5..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 240 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`jKx9jP7LeL$-D$|*pj^6T^Rm@ z;DWu&Cj&(|3p^r=85p>QL70(Y)*K0-AbW|YuPgg)Za!Wf%Nt%HmO!BbPZ!4!i_>c- zU*v62;9*^#$C!OUEbr)|zE6JwCJUKPeB}M3VZvjtDCP-AGS2Wcw4S`fa63v)f8X4A z&jz;ePi&S6^KBJa8Rj~2GIX(DVOa1l%ISyj+dCRJ+}-WZZTYn2-~}BIqwg8!+;10e do0I#v|IO6^x#>Caksv=Yc)I$ztaD0e0sxLjQeXf8 diff --git a/styles/img/loginhelp.png b/styles/img/loginhelp.png deleted file mode 100644 index ed7384d8f5e735649d2da28d80e4d07bb2375821..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 18170 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 diff --git a/styles/img/movetrackup.png b/styles/img/movetrackup.png deleted file mode 100755 index 7e861557ef2e3aeee9262170462cfb1917501736..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 190 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`jKx9jP7LeL$-D$|*pj^6T^Rm@ z;DWu&Cj&(|3p^r=85p>QL70(Y)*K0-AbW|YuPgfKbq3`lZS`r|H2A8)mffqEVI)V@g7`0bAjTK47Hoq2D}!G!b=NnvkoK} cG$b)F1hT3ZS8^U$1T=}k)78&qol`;+0FcZz761SM diff --git a/styles/img/ocb-grab-track-resize.png b/styles/img/ocb-grab-track-resize.png deleted file mode 100644 index 14abf57882c7cf834031edc472e7827a522a0fc8..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 173 zcmeAS@N?(olHy`uVBq!ia0vp^0zk~h!3HEx)yO>uagw~QL70(Y)*K0-AbW|YuPggqP9}aC)nuoGJwPGJ64!_l=ltB<)VvY~=c3falGGH1 z^30M91$R&1fbd2>aiAhmPZ!4!iOb0e5;_m;MJDT|b^{*GxX^{O4p00i_ I>zopr0EqG}761SM diff --git a/styles/img/ocb-icon-arrow-e-bold.png b/styles/img/ocb-icon-arrow-e-bold.png deleted file mode 100644 index 855e3912855c9540612c88df31bf0e37648d40c4..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 562 zcmV-20?qx2P)Wnp7uenS40SP2qA5N&Kk{2hTH+E}R} ztioolx#YfF?yk9kg&CgRcVC7XVrKkLXklWSW~4Nq&taM-_WON;{T{^37!HSgySjOQ9hqXsZ>g^{eDlWR4VRZ zFc|Rj`Gl_P@H`LYav7fIk*@2=X0r))JRTz_6gIKn@3Zgw0D$-VjbgC~DJ20wE|*KN z^Z87%CZ0|w%49MC03ie(j|YmyA_IW$`w2E0jX35Yj9#zD>2w;*4Bz+BXf$xY--(%_ zlu9t|`(tJX5g`;6Lg4G`E2{s*Vh%c;4(qxOr4#_5*=)jfT~bOR2!aH&ZJQzo-ENmP zO^bf2)oO4YhkiOsFx$3&HL=(0acD~^g?haX*L6t8uJgw1Ay>2!*Izt6U9AnVHJvvZ^7X-wdRbAR;)9gTY|Hj^iL2jbgc6 z;_>m3-`?J!X&Q(KQp(=|n)XLYBoaZXRHEzaYX~6_4u@geHd?I~zrVkOnW5`Ce)>kI zCVHNSr>7^3$79~@b}Dyub%l1jO@%@M`~4n)K;S$80DOIY;raO)qtS?6*Hs{~SPac( zlWuQs!OS3{zf<@brfH(lXyESdj(pmtX=1%zqucHB>+7pB^9X>M)i{L^@H`Jhq%<3b zflw%<=wFoZ@$rF9r-R94!ogrrIiE_UP_NgiSS%jzfxioyronYxbUGbOr&IQ)Lqtd< z60j_ba=Dz+uK=W!&~+WF)e0{!FPP0{>{IqU56NT_4-XG?b918rkM_XVz1?oHSS(md z3Bxepx-K%A3@po1&8Lzz0MK2w-G2xPNa)M_=#=ksTqRr2%=heK4W yRi4l1U}i`uaX1{#*3zYOc3l@l1j8`?dCuQ5R~fU$ckBfK00009D9A9u=rmDl{66;JPld z*=%GNc4~r~n;ROB$2dDX0|0EdTO^Z7yuQ9N#@OizhzLZ4QmI6f$>d)L#vrA{=jSIf znG6L%5G~>E?v7m71?L<>2<-QJe0_ZZ0Hl;ytyU-$3iNww{?olytI^xr8>Ey7f&jkn zgLBS=5KJir0Eoxqm` zx3?5}#B#Yzj^jWGaky-nCV8HR*=)uDAdyJWa=FCC#RXnoUKjxI-EN0&w+ksHGfflc z=jSX40;JRF1IA=BNq=cD(=?%!V$aXd-x7!j?RFcsZDX-mFs(IGsT6&Dd_V|+SS*J5 zd=8})`M!_!dd(ciL95mJE})dc)zuX&%YxP#mSsg^jK|}&*=%4K26DMv*hmi#4|sfh zr1$rC2q8k=_%V;x8irw@TCK8ry&m?#)6>%t#(uxg27|#7#{2vGFvdosafER=93E`j z>-GK*<6tm2`TH&}FOM)DbP^G+udnI%`P9zm^P!wSzN<-9POj=200000NkvXXu0mjf DVHFC| diff --git a/styles/img/ocb-icon-arrow-w-bold.png b/styles/img/ocb-icon-arrow-w-bold.png deleted file mode 100644 index eb7bdd0ccac2a6f1b191df9b9fc6336c6b20fb2e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 557 zcmV+|0@D47P)@oZ8Eo4|zu%V(0Dip(5)s<% zHo2~gMx#MO2KUDpvs5wh7VZnqnYq6oUKOSW7t|7K9D)#!4$Kvh)$fTn460uj>=~K%00000NkvXXu0mjfq1f#^ diff --git a/styles/img/ocb-icon-arrow-w.png b/styles/img/ocb-icon-arrow-w.png deleted file mode 100644 index 1500c601a112f831db3b58cc8a3e205825ad55db..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 556 zcmV+{0@MA8P)>Od4mzZoB92pUU^B`8{1+ggZr+E`e`!ao1XQnV5T8$rQN5VW<3g_=S| zL{Lyea<_O)cB1>LHxM|7k9%isGGRo7|5^NBfn`|$fYE3K%d)7`>3n1W@aMgdh)}QB z;W!Q|l?sFq8r`!8A>5w_B!q z*no&oE|+mWpOHu;plKRO_B;=UVc>K+G1aHj=}&`Fsf6qG3Qf}>gdoWPpzAs=mkU#U zHkw~7N=6FNU;ziQY?fBivb|ESS;YWE_7W-I-MrToO1+0fcyQ3kHg`>B+C&1km|)^F?s?yXRFo1dcB6GX~<@? zB>C}pz%)(l_j{)L$G_0+c2Ou4@Or)Ac^;FT&*#x@w~!W uZJYZ2ewfRQh@vC>ww})?hzLT6U-NJD|0PIK{}=@T0000zopr07_A6*#H0l diff --git a/styles/img/ocb-icon-clock.png b/styles/img/ocb-icon-clock.png deleted file mode 100644 index f1729aaa0f18ac02461bd39e2906bf42d65e5072..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3180 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 diff --git a/styles/img/ocb-icon-karyotype.png b/styles/img/ocb-icon-karyotype.png deleted file mode 100644 index d2379ff7418817a922c489d28a626f2d042cfa6d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 231 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`Y)RhkE)4%caKYZ?lYt_f1s;*b z3=G`DAk4@xYmNj^kiEpy*OmP)I}?W%kI>|VLZDEIr;B5V#pz^?= U@8u=Sfc7(Zy85}Sb4q9e00sz00ssI2 diff --git a/styles/img/ocb-icon-minus.png b/styles/img/ocb-icon-minus.png deleted file mode 100644 index e15c1e860c564685adf31edea5573a29e09be57d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 151 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`Y)RhkE)4%caKYZ?lYt_f1s;*b z3=G`DAk4@xYmNj^kiEpy*OmP)J3oh|QtW{*AAv$Do-U3d7N?UFBv_gGB_t&zE@>Dx ouzHbP0l+XkKC&4jb diff --git a/styles/img/ocb-icon-region.png b/styles/img/ocb-icon-region.png deleted file mode 100644 index 4e8971e4db0e6609000e3dc89a891a5139593f7e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 167 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 Rp3DFM002ovPDHLkV1lbYl?ea< diff --git a/styles/img/opacity.png b/styles/img/opacity.png deleted file mode 100644 index 3a0565bc393e1133a02027ab4234c3cc1278bbbd..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 174 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`jKx9jP7LeL$-D$|*pj^6T^Rm@ z;DWu&Cj&(|3p^r=85p>QL70(Y)*K0-AbW|YuPgfmdK II;Vst0P0OFaR2}S diff --git a/styles/img/resize.png b/styles/img/resize.png deleted file mode 100644 index d55398c609d74c51c121c6cfdf345263da0cb09d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 242 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`jKx9jP7LeL$-D$|*pj^6T^Rm@ z;DWu&Cj&(|3p^r=85p>QL70(Y)*K0-AbW|YuPgfU~z5Iy5-DwtQc;*>33x|k@+#DY5G~O zl{yYideIGMYBnnFV>)fuzQL70(Y)*K0-AbW|YuPgfPx#24YJ`L;(K){{a7>y{D4^000SaNLh0L01FcU01FcV0GgZ_00007bV*G`2ipq^ z5H}Qp2Pb6!00l-#L_t(Y$K6$LY!hV|f8P7E?poTe+uAbLjjiii1{?A-rS$(_xyhE?|mMC2Z0u?fr3W_g8wpT0H6>6Fce?{U@c#5 zbGcGUNmEk*z}ellifYbkmtzqG0Kg&u0P^^x6h-~pD}>O)Ob`Hp;tku^wSQt+UJe>& zIkx*bSLMz@aJ$_`qY)vLN~LCJXYbs(0|0ir zJtrq;dU`qw+voE|A`zbF7ao;7-Q3s{*>mAfYt4FuD07*|-SE=uq4cvyzjyEXdR1HR zlSh82|2$}`eLjm(eSN(sin1(+LZOk75uWEoQPjyDJa~{0Leq4XBx7S^4Gj(Ywjuy} z{hJ>c^SN_-HwwR9Aq2#U8&&nYq&aEw<~`@C(xNrqLQerjF99XSQ1CU+eG5JLQZ|Di*NEEdbaz`$Z=y5Io7FwEh@hihwV z8yg$-U-Uc1SQmo=0E#x{&@`|#03bkw0u~{Em9NA?*KAtJ=9>y^jL&Jdn6O4s25LdW z{{H^<_I5qvBSTeHo6XkT+}zXClb4s5Vb3s3I-Op?7K5YnsigavUBzoR(wx!2nOooa zu*kifO*1Bk#b&o?szxX7O^pjkydAr782~CPD;*9;Z*T8o+>Q|9IPT)bi=(5XU0q%J zL!GyN5EuYZRryNCE89OlyY0(B`u22DfvJ3%V@gmbG)$+dd6G)V>W{q2YRa{)qk0Ov z-L5D~BofIWIi1e@{Cq`GXqt}2V$oYAqAZ(oS5|MXJDzW0WY>^rx2!`TZcSbe%Q4xr;|%~70AjHi!!X6g#Tf&4baa%JmAT#S)2C01qNw{hQ(1R+_xSku zi4!L<#(Lcg*hYJiin;K)&j0{pO`7=qyY^N^!?(jRJ}$UwD~kPPrR#l!NU}^VDOm{s zp-@N=gr=sZjDa;xQ&p7^!Z1umo5jLZS6A=ey}PESCY4G(z?SYtl*mlUroH#OEFGH+ z^KRiQ&WDwU*B&A0brnRUiiqd;t9_SM@qN9#w1j8 z*@|RTq6tYP1u;&>#3(;A$6z!w_&xv)py|2x@83T(G<4?7nNz1uNsgz0Q0PuRfnckw$5(Y>bv6e#rHm84AZh=#r{5g7UfMN{=Yj&6{o}`eBj-8K>^kMlf zK@^aOrU}ckKA(@{I6_D=nGA=+dh2kxTqct#7z}2?*VWa9!{K;5o|$F{{j*4YS8|Mt gCO4uH4gZ7q8~u7{xLr&9KmY&$07*qoM6N<$f>A%U*8l(j diff --git a/styles/img/sbgn.png b/styles/img/sbgn.png deleted file mode 100644 index e3b8caa934916806722262208216858ab019d207..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1309 zcmV+&1>*XNP)Px#24YJ`L;(K){{a7>y{D4^000SaNLh0L01FcU01FcV0GgZ_00007bV*G`2ipq^ z4-_N~4TR+Y000?uMObu0Z*6U5Zgc=ca%Ew3Wn>_CX>@2HM@dakSAh-}000DdNkl-TnVzL3d}K&CWi*JkPvc04g^rHbFmB09XK6>X&|@&-Gbm zdk~J6>J-3V{lb*~_o+wyD*(rq^T+yHm6oOZ)*VZWgT)-FY}nf4v*rBzQhN}N7U-Wo zLa#%^6q-haIEhO14XhH{NYx%x3v=Jyin7-p_nTWHN2r#Gom(YpziW?rbGl%Dx>I^d z17V$Cx~#JFIbM3)`^4yz3?iOmkZJpV5x}v22XE+(dFppyyPp%p zqz=`9mJxs~BOUxK^ZtVhtXEf83EG3oD8-_-+t(Yg8QKHLpNRV9x|bd5JNP*Az!4EH z18fqUjGZC2P67MehfBvsCq1VWE7d60)WhbKZrB}2swTvwnkDKBmFuRkkrEJ}Nx&Ih zFn^_(D3mzEj}1n$93~r6wFi}{VwalC;a+M|_e~kI)Fg$CluJ#@lYl3Vw2G0Vrz)@- zwp;)>*GHcgE7~H5*&Y5Y5v_G`i7}9kJ zNT_rB482wXa-h%u#A+l+0hj=|C$K-lY97Kh+H@rVWvI(dEY~Lb8bKi-jREpWJKzHV z`v6|)a?fh)k8pdKy6PBJz#-l2G!&Ha-GxYX9FTFv|3g!(^=7T_HP3Jj`MiZ|qmsGV zX4u~|(k^u5nUq28$L)QV>q04py5NVnv0c4#v-4)#DA^;F` zUDQQDignHui-3dxQkP~)08x;Cle3dfwFVGLnzf0U^eYcIT+7YP&0kf+ytBymB^*5k zM3QEujv&5Kq-vs2y4i^ng#@HkfUF^z2f|T?WDfUIlNq?wgn&c>vP~OsfMRY`3R$dZ z+8`J`5SP0*qaE;%#8DL0<+SU_BaQJbPf@K0n*=!O%g^&UqC=enh*7R06s!KQD-Y3J9}(8L5zckMk58_ z&~fcB5hNji5RwdX;UoCXWFJAc1U)9L3ULY*Xrq9AHrD2qQ>$0bw76eGm#9 z#o9C=grj4CgoyJXc0dS6#{h{DXVN*7-f2K``5at}MYZn5Z|idu9cfF#u?5`#=Xauk Twq6?}00000NkvXXu0mjfSl2&@ diff --git a/styles/img/sprite_black2.png b/styles/img/sprite_black2.png deleted file mode 100644 index e675952ccfb1e207bc4ef33a91708082e5819aea..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2763 zcmV;+3N-bJP)Px#24YJ`L;(K){{a7>y{D4^000SaNLh0L01FcU01FcV0GgZ_00007bV*G`2ipn( z0}TO&&dCY@018VS0wx1JM1#ysIqz)jP%}&N*v6IPUGL=fDNF)-JN+niT zS1FZBtgWpfgaFV@(>#9q^yxF!`mr|L;|GB7czobOZ^47ULMI7|$Kx~UbUL+t`*!;J z`Y0BQtgfzNnr4lJSd4PH%$6-%Qpsd;CY#Mpw%d|KM6OtbtS<_J9*V_cxlNlkkxr*E z41-Fg0>IkZ8r5nQ(=;iU%Z!bUap1rKW@l%ao14Qhj6fk`4n`J@)z>km}%= z>gMRo&1u>*rBaD_JWjD#q+BlFA*gOehGDR6+cx&?+sD`c^5kB1E zFi~e?P@yk>TNC_V3@15Q3GJl{-Ph!Gj06b?X*OOG~V- zu2L?S(X{o(ZzU-MoU)O2q}yDGgWF5_7=JRr1^K-7`nqh3bGGA@JcpD$DeGpMDKC{u zlu9M$=jQ>~vu6)0D=RE7FSC31Zu0p&$z+nz(NRp(Bp#2GOeWXq=nL35jI+u z1}GOAjH#_W!$S?)-~y2T(hUi*aQpV{Oe_|oQmJtH@?}OxM@gkpY~8w*OP4Nj^X5&e z)hZ7>@W36bGffjA#6lxWTCkb#ap`|sxx5RqXC2wV6Z7M?vM$|PGfY{mshN&C-n?<+ z2AZZ}7zST_@dfA4pJ#M*l#3THQYaJ(06zjs0d;8+$cB!IiHTE*MBCG`JR6Z{35_OWks4U$I+ulk7=6rm?hfF18+`GPoF|TK|w)5K|!HY zc)~V`eL^)!d*NpJ{5uZiUc?aa9JMUWXTUY!Pry^aNH>tS%ToR(@QKZmE(71P$m}A( zyAp|kjH24m}`I56VnP6?hfcVL7)O_?2vv&w)R7ZZT2?KmH-6lAy|?gkfn!vdNnd44a^vpm7?-k_Jdku%)@!D(pvI)|0tYPN_b)wKQlSA+<4vM! z72O30!H)o@Y}hd$?#@coc#CO|nkV^~%zmBP%5p`X|9*fmsURn;1wUhw+l+%D&-Yr! zp;=n!b4&R%;0FN%hd?2?o7~+e^6$NxyK9tSy#c%jya0SHgy=31NsaJ^t@0Zvv_0$X zgnu}c6%-T{6ciM`B2fD{IEVM^%0{`=lh1jg$vmJ{!m%4*PuUcJ@u)KQorcpU7(t2p z8MR!RUAHOExkU<(8+arJk~ASL6Y(>z!%T=I%~1Q^bSA``ZbpzFqEcS70xd{tN9Vjl zkO+~aOp9LT=cb(q@@rA;@F1b2g=X-XLvpaBOan{uLsUb878e&;TwEj|QDIn7P$(48b)8;=ouo#45(M4-Dj$HTlvk2kSW?fyZQ$T#+#1LGMuI6X{$A5G zp=nysg|rP3ICu%cy#^OJ+15$bxrOYb?VtUx4Lh9BcTd+bKnexh3dRDgUXg(-I%LPn(4&&~-r8`C$aQBO8+j2M5Kq zYu8#4wNa;~DgIJFn=|0+Y>eJ*r;&t-JyM|Wh=-KI^O!U&loCCOe}~iP~AZX`6%=&C@3f>C@3f>C@3f> zDD*a>n0a^mXCLq3Z%N_3ULt8Dbj%!ZpG*1sq`c@Fl58uIy=X~-+TP~x0}ngMJ}l+7 z^fXDCOh)8#Ig!a^x``x!B=Bcy|G%#ho|5O2wtBrqQYMoTSFT(ULI`o?%9Tb$dBv+u z?(O$JNP^ls8Lt7q;r}1nX|ntp>%Z&jJV|@^?p;Sxz3i8y!NEZ>KR++B*{l#kh-@}1 z=I7_d;NV~ok~C`nz0#`VU1}@6en_h0X=ycS`TMlXdhH`A-aeCP`~!J=f?9*zm!6h}Km*6uj@#D&FsDOA0}!f`WpAf`URD@jsryhy9Yt RJ!1d>002ovPDHLkV1n*uGNAwf diff --git a/styles/img/tools-sprites-trans.gif b/styles/img/tools-sprites-trans.gif deleted file mode 100644 index ead931ef617ac8520a24a263abb456ebc1bcd54e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2843 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

l~zuFM6E|#Q1V+0OQ8g< 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 diff --git a/vendor/ChemDoodleWeb.css b/vendor/ChemDoodleWeb.css deleted file mode 100644 index b9c91cf..0000000 --- a/vendor/ChemDoodleWeb.css +++ /dev/null @@ -1,3 +0,0 @@ -canvas.ChemDoodleWebComponent { - border: 1px solid black; -} \ No newline at end of file diff --git a/vendor/ChemDoodleWeb.js b/vendor/ChemDoodleWeb.js deleted file mode 100644 index 4a8d9f3..0000000 --- a/vendor/ChemDoodleWeb.js +++ /dev/null @@ -1,450 +0,0 @@ -// -// ChemDoodle Web Components 5.1.0 -// -// http://web.chemdoodle.com -// -// Copyright 2009-2013 iChemLabs, LLC. All rights reserved. -// -// This program is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. -// -// As a special exception to the GPL, any HTML file in a public website -// or any free web service which merely makes function calls to this -// code, and for that purpose includes it by reference, shall be deemed -// a separate work for copyright law purposes. If you modify this code, -// you may extend this exception to your version of the code, but you -// are not obligated to do so. If you do not wish to do so, delete this -// exception statement from your version. -// -// As an additional exception to the GPL, you may distribute this -// packed form of the code without the copy of the GPL license normally -// required, provided you include this license notice and a URL through -// which recipients can access the corresponding unpacked source code. -// -// This program is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. -// -// Please contact iChemLabs for -// alternate licensing options. -// -var ChemDoodle=function(){var c={structures:{}};c.structures.d2={};c.structures.d3={};c.iChemLabs={};c.informatics={};c.io={};c.getVersion=function(){return"5.1.0"};return c}(); -ChemDoodle.extensions=function(c,b,a){return{stringStartsWith:function(a,f){return a.slice(0,f.length)===f},vec3AngleFrom:function(g,f){var e=b.length(g),o=b.length(f),e=b.dot(g,f)/e/o;return a.acos(e)},contextHashTo:function(a,f,e,o,d,k,b){var l=0,h=(new c.Point(f,e)).distance(new c.Point(o,d)),j=!1,m=f,t=e;f=o-f;for(e=d-e;lh){a.moveTo(o,d);break}else{var n=b/h,m=m+n*f,t=t+n*e;a.moveTo(m,t);l+=b}else if(l+k>h){a.lineTo(o,d);break}else n=k/h,m+=n*f,t+=n*e,a.lineTo(m,t),l+=k;j=!j}}, -contextRoundRect:function(a,f,e,o,d,k){a.beginPath();a.moveTo(f+k,e);a.lineTo(f+o-k,e);a.quadraticCurveTo(f+o,e,f+o,e+k);a.lineTo(f+o,e+d-k);a.quadraticCurveTo(f+o,e+d,f+o-k,e+d);a.lineTo(f+k,e+d);a.quadraticCurveTo(f,e+d,f,e+d-k);a.lineTo(f,e+k);a.quadraticCurveTo(f,e,f+k,e);a.closePath()},contextEllipse:function(a,f,e,o,d){var k=0.5522848*(o/2),b=0.5522848*(d/2),l=f+o,h=e+d;o=f+o/2;d=e+d/2;a.beginPath();a.moveTo(f,d);a.bezierCurveTo(f,d-b,o-k,e,o,e);a.bezierCurveTo(o+k,e,l,d-b,l,d);a.bezierCurveTo(l, -d+b,o+k,h,o,h);a.bezierCurveTo(o-k,h,f,d+b,f,d);a.closePath()}}}(ChemDoodle.structures,vec3,Math); -ChemDoodle.math=function(c,b,a){var g={},f={aliceblue:"#f0f8ff",antiquewhite:"#faebd7",aqua:"#00ffff",aquamarine:"#7fffd4",azure:"#f0ffff",beige:"#f5f5dc",bisque:"#ffe4c4",black:"#000000",blanchedalmond:"#ffebcd",blue:"#0000ff",blueviolet:"#8a2be2",brown:"#a52a2a",burlywood:"#deb887",cadetblue:"#5f9ea0",chartreuse:"#7fff00",chocolate:"#d2691e",coral:"#ff7f50",cornflowerblue:"#6495ed",cornsilk:"#fff8dc",crimson:"#dc143c",cyan:"#00ffff",darkblue:"#00008b",darkcyan:"#008b8b",darkgoldenrod:"#b8860b", -darkgray:"#a9a9a9",darkgreen:"#006400",darkkhaki:"#bdb76b",darkmagenta:"#8b008b",darkolivegreen:"#556b2f",darkorange:"#ff8c00",darkorchid:"#9932cc",darkred:"#8b0000",darksalmon:"#e9967a",darkseagreen:"#8fbc8f",darkslateblue:"#483d8b",darkslategray:"#2f4f4f",darkturquoise:"#00ced1",darkviolet:"#9400d3",deeppink:"#ff1493",deepskyblue:"#00bfff",dimgray:"#696969",dodgerblue:"#1e90ff",firebrick:"#b22222",floralwhite:"#fffaf0",forestgreen:"#228b22",fuchsia:"#ff00ff",gainsboro:"#dcdcdc",ghostwhite:"#f8f8ff", -gold:"#ffd700",goldenrod:"#daa520",gray:"#808080",green:"#008000",greenyellow:"#adff2f",honeydew:"#f0fff0",hotpink:"#ff69b4","indianred ":"#cd5c5c","indigo ":"#4b0082",ivory:"#fffff0",khaki:"#f0e68c",lavender:"#e6e6fa",lavenderblush:"#fff0f5",lawngreen:"#7cfc00",lemonchiffon:"#fffacd",lightblue:"#add8e6",lightcoral:"#f08080",lightcyan:"#e0ffff",lightgoldenrodyellow:"#fafad2",lightgrey:"#d3d3d3",lightgreen:"#90ee90",lightpink:"#ffb6c1",lightsalmon:"#ffa07a",lightseagreen:"#20b2aa",lightskyblue:"#87cefa", -lightslategray:"#778899",lightsteelblue:"#b0c4de",lightyellow:"#ffffe0",lime:"#00ff00",limegreen:"#32cd32",linen:"#faf0e6",magenta:"#ff00ff",maroon:"#800000",mediumaquamarine:"#66cdaa",mediumblue:"#0000cd",mediumorchid:"#ba55d3",mediumpurple:"#9370d8",mediumseagreen:"#3cb371",mediumslateblue:"#7b68ee",mediumspringgreen:"#00fa9a",mediumturquoise:"#48d1cc",mediumvioletred:"#c71585",midnightblue:"#191970",mintcream:"#f5fffa",mistyrose:"#ffe4e1",moccasin:"#ffe4b5",navajowhite:"#ffdead",navy:"#000080", -oldlace:"#fdf5e6",olive:"#808000",olivedrab:"#6b8e23",orange:"#ffa500",orangered:"#ff4500",orchid:"#da70d6",palegoldenrod:"#eee8aa",palegreen:"#98fb98",paleturquoise:"#afeeee",palevioletred:"#d87093",papayawhip:"#ffefd5",peachpuff:"#ffdab9",peru:"#cd853f",pink:"#ffc0cb",plum:"#dda0dd",powderblue:"#b0e0e6",purple:"#800080",red:"#ff0000",rosybrown:"#bc8f8f",royalblue:"#4169e1",saddlebrown:"#8b4513",salmon:"#fa8072",sandybrown:"#f4a460",seagreen:"#2e8b57",seashell:"#fff5ee",sienna:"#a0522d",silver:"#c0c0c0", -skyblue:"#87ceeb",slateblue:"#6a5acd",slategray:"#708090",snow:"#fffafa",springgreen:"#00ff7f",steelblue:"#4682b4",tan:"#d2b48c",teal:"#008080",thistle:"#d8bfd8",tomato:"#ff6347",turquoise:"#40e0d0",violet:"#ee82ee",wheat:"#f5deb3",white:"#ffffff",whitesmoke:"#f5f5f5",yellow:"#ffff00",yellowgreen:"#9acd32"};g.angleBetweenLargest=function(e){if(0===e.length)return{angle:0,largest:2*a.PI};if(1===e.length)return{angle:e[0]+a.PI,largest:2*a.PI};for(var o=0,d=0,k=0,f=e.length-1;ko&&(o=g,d=(e[k+1]+e[k])/2)}k=e[0]+2*a.PI-e[e.length-1];k>o&&(d=e[0]-k/2,o=k,0>d&&(d+=2*a.PI));return{angle:d,largest:o}};g.isBetween=function(a,o,d){if(o>d){var k=o;o=d;d=k}return a>=o&&a<=d};g.getRGB=function(a,o){var d=[0,0,0];f[a.toLowerCase()]&&(a=f[a.toLowerCase()]);if("#"===a.charAt(0))return 4===a.length&&(a="#"+a.charAt(1)+a.charAt(1)+a.charAt(2)+a.charAt(2)+a.charAt(3)+a.charAt(3)),[parseInt(a.substring(1,3),16)/255*o,parseInt(a.substring(3,5),16)/255*o,parseInt(a.substring(5,7),16)/255* -o];if(c.stringStartsWith(a,"rgb")){var k=a.replace(/rgb\(|\)/g,"").split(",");return 3!==k.length?d:[parseInt(k[0])/255*o,parseInt(k[1])/255*o,parseInt(k[2])/255*o]}return d};g.distanceFromPointToLineInclusive=function(e,o,d){var k=o.distance(d);d=o.angle(d);d=a.PI/2-d;d=o.angle(e)+d;e=o.distance(e);e=new b.Point(e*a.cos(d),-e*a.sin(d));return g.isBetween(-e.y,0,k)?a.abs(e.x):-1};g.calculateDistanceInterior=function(e,o,d){if(this.isBetween(o.x,d.x,d.x+d.w)&&this.isBetween(o.y,d.y,d.y+d.w))return e.distance(o); -var k=[];k.push({x1:d.x,y1:d.y,x2:d.x+d.w,y2:d.y});k.push({x1:d.x,y1:d.y+d.h,x2:d.x+d.w,y2:d.y+d.h});k.push({x1:d.x,y1:d.y,x2:d.x,y2:d.y+d.h});k.push({x1:d.x+d.w,y1:d.y,x2:d.x+d.w,y2:d.y+d.h});d=[];for(var f=0;4>f;f++){var g=k[f];(g=this.intersectLines(o.x,o.y,e.x,e.y,g.x1,g.y1,g.x2,g.y2))&&d.push(g)}if(0===d.length)return 0;f=o=0;for(k=d.length;f=g&&0<=h&&1>=h?{x:a+h*d,y:f+h*k}:!1};g.hsl2rgb=function(a,f,d){var k=function(a,d,k){0>k?k+=1:1k?d:k<2/3?a+6*(d-a)*(2/3-k):a};if(0===f)d=f=a=d;else{var g=0.5>d?d*(1+f):d+f-d*f,b=2*d-g;d=k(b,g,a+1/3);f=k(b,g,a);a=k(b,g,a-1/3)}return[255*d,255*f,255*a]};g.isPointInPoly=function(a,f){for(var d=!1,k=-1,g=a.length,b=g-1;++kz?z=A:Ad.location&&(d.location=0);return v(a,d.location)},nearestPointOnCurve:function(d,k){var e=a(d,k);return{point:f(k,k.length-1,e.location,null,null),location:e.location}},pointOnCurve:o,pointAlongCurveFrom:function(a,d,e){return k(a,d,e).point},perpendicularToCurveAt:function(a,d,e,f){d=k(a,d,null==f?0:f);a=v(a,d.location);f=Math.atan(-1/a);a=e/2*Math.sin(f);e=e/2*Math.cos(f);return[{x:d.point.x+e,y:d.point.y+a},{x:d.point.x-e,y:d.point.y-a}]},locationAlongCurveFrom:function(a,d,e){return k(a, -d,e).location},getLength:function(a){for(var k=o(a,0),e=0,f=0,g=null;1>f;)f+=0.005,g=o(a,f),e+=d(g,k),k=g;return e}}})(ChemDoodle.math); -ChemDoodle.featureDetection=function(c,b,a,g){var f={supports_canvas:function(){return!!a.createElement("canvas").getContext},supports_canvas_text:function(){return!f.supports_canvas()?!1:"function"===typeof a.createElement("canvas").getContext("2d").fillText},supports_webgl:function(){var e=a.createElement("canvas");try{if(e.getContext("webgl")||e.getContext("experimental-webgl"))return!0}catch(f){}return!1},supports_xhr2:function(){return b.support.cors},supports_touch:function(){return"ontouchstart"in -g},supports_gesture:function(){return"ongesturestart"in g}};return f}(ChemDoodle.iChemLabs,jQuery,document,window);ChemDoodle.SYMBOLS="H He Li Be B C N O F Ne Na Mg Al Si P S Cl Ar K Ca Sc Ti V Cr Mn Fe Co Ni Cu Zn Ga Ge As Se Br Kr Rb Sr Y Zr Nb Mo Tc Ru Rh Pd Ag Cd In Sn Sb Te I Xe Cs Ba La Ce Pr Nd Pm Sm Eu Gd Tb Dy Ho Er Tm Yb Lu Hf Ta W Re Os Ir Pt Au Hg Tl Pb Bi Po At Rn Fr Ra Ac Th Pa U Np Pu Am Cm Bk Cf Es Fm Md No Lr Rf Db Sg Bh Hs Mt Ds Rg Cn Uut Uuq Uup Uuh Uus Uuo".split(" "); -ChemDoodle.ELEMENT=function(c){function b(a,f,d){this.symbol=a;this.name=f;this.atomicNumber=d}var a=[];a.H=new b("H","Hydrogen",1);a.He=new b("He","Helium",2);a.Li=new b("Li","Lithium",3);a.Be=new b("Be","Beryllium",4);a.B=new b("B","Boron",5);a.C=new b("C","Carbon",6);a.N=new b("N","Nitrogen",7);a.O=new b("O","Oxygen",8);a.F=new b("F","Fluorine",9);a.Ne=new b("Ne","Neon",10);a.Na=new b("Na","Sodium",11);a.Mg=new b("Mg","Magnesium",12);a.Al=new b("Al","Aluminum",13);a.Si=new b("Si","Silicon",14); -a.P=new b("P","Phosphorus",15);a.S=new b("S","Sulfur",16);a.Cl=new b("Cl","Chlorine",17);a.Ar=new b("Ar","Argon",18);a.K=new b("K","Potassium",19);a.Ca=new b("Ca","Calcium",20);a.Sc=new b("Sc","Scandium",21);a.Ti=new b("Ti","Titanium",22);a.V=new b("V","Vanadium",23);a.Cr=new b("Cr","Chromium",24);a.Mn=new b("Mn","Manganese",25);a.Fe=new b("Fe","Iron",26);a.Co=new b("Co","Cobalt",27);a.Ni=new b("Ni","Nickel",28);a.Cu=new b("Cu","Copper",29);a.Zn=new b("Zn","Zinc",30);a.Ga=new b("Ga","Gallium",31); -a.Ge=new b("Ge","Germanium",32);a.As=new b("As","Arsenic",33);a.Se=new b("Se","Selenium",34);a.Br=new b("Br","Bromine",35);a.Kr=new b("Kr","Krypton",36);a.Rb=new b("Rb","Rubidium",37);a.Sr=new b("Sr","Strontium",38);a.Y=new b("Y","Yttrium",39);a.Zr=new b("Zr","Zirconium",40);a.Nb=new b("Nb","Niobium",41);a.Mo=new b("Mo","Molybdenum",42);a.Tc=new b("Tc","Technetium",43);a.Ru=new b("Ru","Ruthenium",44);a.Rh=new b("Rh","Rhodium",45);a.Pd=new b("Pd","Palladium",46);a.Ag=new b("Ag","Silver",47);a.Cd=new b("Cd", -"Cadmium",48);a.In=new b("In","Indium",49);a.Sn=new b("Sn","Tin",50);a.Sb=new b("Sb","Antimony",51);a.Te=new b("Te","Tellurium",52);a.I=new b("I","Iodine",53);a.Xe=new b("Xe","Xenon",54);a.Cs=new b("Cs","Cesium",55);a.Ba=new b("Ba","Barium",56);a.La=new b("La","Lanthanum",57);a.Ce=new b("Ce","Cerium",58);a.Pr=new b("Pr","Praseodymium",59);a.Nd=new b("Nd","Neodymium",60);a.Pm=new b("Pm","Promethium",61);a.Sm=new b("Sm","Samarium",62);a.Eu=new b("Eu","Europium",63);a.Gd=new b("Gd","Gadolinium",64); -a.Tb=new b("Tb","Terbium",65);a.Dy=new b("Dy","Dysprosium",66);a.Ho=new b("Ho","Holmium",67);a.Er=new b("Er","Erbium",68);a.Tm=new b("Tm","Thulium",69);a.Yb=new b("Yb","Ytterbium",70);a.Lu=new b("Lu","Lutetium",71);a.Hf=new b("Hf","Hafnium",72);a.Ta=new b("Ta","Tantalum",73);a.W=new b("W","Tungsten",74);a.Re=new b("Re","Rhenium",75);a.Os=new b("Os","Osmium",76);a.Ir=new b("Ir","Iridium",77);a.Pt=new b("Pt","Platinum",78);a.Au=new b("Au","Gold",79);a.Hg=new b("Hg","Mercury",80);a.Tl=new b("Tl","Thallium", -81);a.Pb=new b("Pb","Lead",82);a.Bi=new b("Bi","Bismuth",83);a.Po=new b("Po","Polonium",84);a.At=new b("At","Astatine",85);a.Rn=new b("Rn","Radon",86);a.Fr=new b("Fr","Francium",87);a.Ra=new b("Ra","Radium",88);a.Ac=new b("Ac","Actinium",89);a.Th=new b("Th","Thorium",90);a.Pa=new b("Pa","Protactinium",91);a.U=new b("U","Uranium",92);a.Np=new b("Np","Neptunium",93);a.Pu=new b("Pu","Plutonium",94);a.Am=new b("Am","Americium",95);a.Cm=new b("Cm","Curium",96);a.Bk=new b("Bk","Berkelium",97);a.Cf=new b("Cf", -"Californium",98);a.Es=new b("Es","Einsteinium",99);a.Fm=new b("Fm","Fermium",100);a.Md=new b("Md","Mendelevium",101);a.No=new b("No","Nobelium",102);a.Lr=new b("Lr","Lawrencium",103);a.Rf=new b("Rf","Rutherfordium",104);a.Db=new b("Db","Dubnium",105);a.Sg=new b("Sg","Seaborgium",106);a.Bh=new b("Bh","Bohrium",107);a.Hs=new b("Hs","Hassium",108);a.Mt=new b("Mt","Meitnerium",109);a.Ds=new b("Ds","Darmstadtium",110);a.Rg=new b("Rg","Roentgenium",111);a.Cn=new b("Cn","Copernicium",112);a.Uut=new b("Uut", -"Ununtrium",113);a.Uuq=new b("Uuq","Ununquadium",114);a.Uup=new b("Uup","Ununpentium",115);a.Uuh=new b("Uuh","Ununhexium",116);a.Uus=new b("Uus","Ununseptium",117);a.Uuo=new b("Uuo","Ununoctium",118);a.B.addH=!0;a.C.addH=!0;a.N.addH=!0;a.O.addH=!0;a.F.addH=!0;a.Si.addH=!0;a.P.addH=!0;a.S.addH=!0;a.Cl.addH=!0;a.As.addH=!0;a.Se.addH=!0;a.Br.addH=!0;a.Te.addH=!0;a.I.addH=!0;a.At.addH=!0;a.H.jmolColor="#FFFFFF";a.He.jmolColor="#D9FFFF";a.Li.jmolColor="#CC80FF";a.Be.jmolColor="#C2FF00";a.B.jmolColor="#FFB5B5"; -a.C.jmolColor="#909090";a.N.jmolColor="#3050F8";a.O.jmolColor="#FF0D0D";a.F.jmolColor="#90E050";a.Ne.jmolColor="#B3E3F5";a.Na.jmolColor="#AB5CF2";a.Mg.jmolColor="#8AFF00";a.Al.jmolColor="#BFA6A6";a.Si.jmolColor="#F0C8A0";a.P.jmolColor="#FF8000";a.S.jmolColor="#FFFF30";a.Cl.jmolColor="#1FF01F";a.Ar.jmolColor="#80D1E3";a.K.jmolColor="#8F40D4";a.Ca.jmolColor="#3DFF00";a.Sc.jmolColor="#E6E6E6";a.Ti.jmolColor="#BFC2C7";a.V.jmolColor="#A6A6AB";a.Cr.jmolColor="#8A99C7";a.Mn.jmolColor="#9C7AC7";a.Fe.jmolColor= -"#E06633";a.Co.jmolColor="#F090A0";a.Ni.jmolColor="#50D050";a.Cu.jmolColor="#C88033";a.Zn.jmolColor="#7D80B0";a.Ga.jmolColor="#C28F8F";a.Ge.jmolColor="#668F8F";a.As.jmolColor="#BD80E3";a.Se.jmolColor="#FFA100";a.Br.jmolColor="#A62929";a.Kr.jmolColor="#5CB8D1";a.Rb.jmolColor="#702EB0";a.Sr.jmolColor="#00FF00";a.Y.jmolColor="#94FFFF";a.Zr.jmolColor="#94E0E0";a.Nb.jmolColor="#73C2C9";a.Mo.jmolColor="#54B5B5";a.Tc.jmolColor="#3B9E9E";a.Ru.jmolColor="#248F8F";a.Rh.jmolColor="#0A7D8C";a.Pd.jmolColor="#006985"; -a.Ag.jmolColor="#C0C0C0";a.Cd.jmolColor="#FFD98F";a.In.jmolColor="#A67573";a.Sn.jmolColor="#668080";a.Sb.jmolColor="#9E63B5";a.Te.jmolColor="#D47A00";a.I.jmolColor="#940094";a.Xe.jmolColor="#429EB0";a.Cs.jmolColor="#57178F";a.Ba.jmolColor="#00C900";a.La.jmolColor="#70D4FF";a.Ce.jmolColor="#FFFFC7";a.Pr.jmolColor="#D9FFC7";a.Nd.jmolColor="#C7FFC7";a.Pm.jmolColor="#A3FFC7";a.Sm.jmolColor="#8FFFC7";a.Eu.jmolColor="#61FFC7";a.Gd.jmolColor="#45FFC7";a.Tb.jmolColor="#30FFC7";a.Dy.jmolColor="#1FFFC7";a.Ho.jmolColor= -"#00FF9C";a.Er.jmolColor="#00E675";a.Tm.jmolColor="#00D452";a.Yb.jmolColor="#00BF38";a.Lu.jmolColor="#00AB24";a.Hf.jmolColor="#4DC2FF";a.Ta.jmolColor="#4DA6FF";a.W.jmolColor="#2194D6";a.Re.jmolColor="#267DAB";a.Os.jmolColor="#266696";a.Ir.jmolColor="#175487";a.Pt.jmolColor="#D0D0E0";a.Au.jmolColor="#FFD123";a.Hg.jmolColor="#B8B8D0";a.Tl.jmolColor="#A6544D";a.Pb.jmolColor="#575961";a.Bi.jmolColor="#9E4FB5";a.Po.jmolColor="#AB5C00";a.At.jmolColor="#754F45";a.Rn.jmolColor="#428296";a.Fr.jmolColor="#420066"; -a.Ra.jmolColor="#007D00";a.Ac.jmolColor="#70ABFA";a.Th.jmolColor="#00BAFF";a.Pa.jmolColor="#00A1FF";a.U.jmolColor="#008FFF";a.Np.jmolColor="#0080FF";a.Pu.jmolColor="#006BFF";a.Am.jmolColor="#545CF2";a.Cm.jmolColor="#785CE3";a.Bk.jmolColor="#8A4FE3";a.Cf.jmolColor="#A136D4";a.Es.jmolColor="#B31FD4";a.Fm.jmolColor="#B31FBA";a.Md.jmolColor="#B30DA6";a.No.jmolColor="#BD0D87";a.Lr.jmolColor="#C70066";a.Rf.jmolColor="#CC0059";a.Db.jmolColor="#D1004F";a.Sg.jmolColor="#D90045";a.Bh.jmolColor="#E00038";a.Hs.jmolColor= -"#E6002E";a.Mt.jmolColor="#EB0026";a.Ds.jmolColor="#000000";a.Rg.jmolColor="#000000";a.Cn.jmolColor="#000000";a.Uut.jmolColor="#000000";a.Uuq.jmolColor="#000000";a.Uup.jmolColor="#000000";a.Uuh.jmolColor="#000000";a.Uus.jmolColor="#000000";a.Uuo.jmolColor="#000000";for(var g=0,f=c.length;g=this.queue.length&&(this.queue=this.queue.slice(this.queueSpace),this.queueSpace=0));return b};c.getOldestElement=function(){var b;this.queue.length&&(b=this.queue[this.queueSpace]); -return b}})(ChemDoodle.structures); -(function(c,b){c.Point=function(a,f){this.x=a?a:0;this.y=f?f:0};var a=c.Point.prototype;a.sub=function(a){this.x-=a.x;this.y-=a.y};a.add=function(a){this.x+=a.x;this.y+=a.y};a.distance=function(a){var f=a.x-this.x;a=a.y-this.y;return b.sqrt(f*f+a*a)};a.angleForStupidCanvasArcs=function(a){var f=a.x-this.x;a=a.y-this.y;for(var e=0,e=0===f?0===a?0:0f?b.atan(a/f)+b.PI:0>a?b.atan(a/f)+2*b.PI:b.atan(a/f);0>e;)e+=2*b.PI;return e%=2*b.PI};a.angle=function(a){var f=a.x- -this.x;a=this.y-a.y;for(var e=0,e=0===f?0===a?0:0f?b.atan(a/f)+b.PI:0>a?b.atan(a/f)+2*b.PI:b.atan(a/f);0>e;)e+=2*b.PI;return e%=2*b.PI}})(ChemDoodle.structures,Math); -(function(c,b,a,g,f,e){g.Atom=function(a,d,k,e){this.label=a?a.replace(/\s/g,""):"C";c[this.label]||(this.label="C");this.x=d?d:0;this.y=k?k:0;this.z=e?e:0};g=g.Atom.prototype=new g.Point(0,0);g.charge=0;g.numLonePair=0;g.numRadical=0;g.mass=-1;g.coordinationNumber=0;g.bondNumber=0;g.angleOfLeastInterference=0;g.isHidden=!1;g.altLabel=void 0;g.any=!1;g.rgroup=-1;g.isLone=!1;g.isHover=!1;g.isSelected=!1;g.add3D=function(a){this.x+=a.x;this.y+=a.y;this.z+=a.z};g.sub3D=function(a){this.x-=a.x;this.y-= -a.y;this.z-=a.z};g.distance3D=function(a){var d=a.x-this.x,k=a.y-this.y;a=a.z-this.z;return f.sqrt(d*d+k*k+a*a)};g.draw=function(a,d){if(this.isLassoed){var k=a.createRadialGradient(this.x-1,this.y-1,0,this.x,this.y,7);k.addColorStop(0,"rgba(212, 99, 0, 0)");k.addColorStop(0.7,"rgba(212, 99, 0, 0.8)");a.fillStyle=k;a.beginPath();a.arc(this.x,this.y,5,0,2*f.PI,!1);a.fill()}this.textBounds=[];this.specs&&(d=this.specs);k=d.getFontString(d.atoms_font_size_2D,d.atoms_font_families_2D,d.atoms_font_bold_2D, -d.atoms_font_italic_2D);a.font=k;a.fillStyle=d.atoms_color;!this.any&&-1===this.rgroup&&(d.atoms_useJMOLColors?a.fillStyle=c[this.label].jmolColor:d.atoms_usePYMOLColors&&(a.fillStyle=c[this.label].pymolColor));if(this.isLone&&!d.atoms_displayAllCarbonLabels_2D||d.atoms_circles_2D)a.beginPath(),a.arc(this.x,this.y,d.atoms_circleDiameter_2D/2,0,2*f.PI,!1),a.fill(),0f.PI/2&&this.angleOfLeastInterference< -3*f.PI/2&&(m=-e/2-n-j/2):this.angleOfLeastInterference<=f.PI/4||(this.angleOfLeastInterference<3*f.PI/4?(m=0,t=0.9*-d.atoms_font_size_2D):this.angleOfLeastInterference<=5*f.PI/4?m=-e/2-n-j/2:this.angleOfLeastInterference<7*f.PI/4&&(m=0,t=0.9*d.atoms_font_size_2D));a.font=k;a.fillText("H",this.x+m,this.y+t);a.font=g;a.fillText(h,this.x+m+j/2+n/2,this.y+t+0.3*d.atoms_font_size_2D);this.textBounds.push({x:this.x+m-j/2,y:this.y+t-d.atoms_font_size_2D/2+1,w:j,h:d.atoms_font_size_2D-2});this.textBounds.push({x:this.x+ -m+j/2,y:this.y+t+0.3*d.atoms_font_size_2D-d.atoms_font_size_2D/2+1,w:n,h:0.8*d.atoms_font_size_2D-2})}else m=e/2+j/2,t=0,1===this.bondNumber?this.angleOfLeastInterference>f.PI/2&&this.angleOfLeastInterference<3*f.PI/2&&(m=-e/2-j/2):this.angleOfLeastInterference<=f.PI/4||(this.angleOfLeastInterference<3*f.PI/4?(m=0,t=0.9*-d.atoms_font_size_2D):this.angleOfLeastInterference<=5*f.PI/4?m=-e/2-j/2:this.angleOfLeastInterference<7*f.PI/4&&(m=0,t=0.9*d.atoms_font_size_2D)),a.fillText("H",this.x+m,this.y+ -t),this.textBounds.push({x:this.x+m-j/2,y:this.y+t-d.atoms_font_size_2D/2+1,w:j,h:d.atoms_font_size_2D-2})}}0!==this.charge&&(k=this.charge.toFixed(0),k="1"===k?"+":"-1"===k?"\u2013":b.stringStartsWith(k,"-")?k.substring(1)+"\u2013":k+"+",e=this.angleOfLeastInterference,g=d.atoms_font_size_2D,this.isLabelVisible(d)&&0d?0:f.floor(d)};g.getBounds=function(){var e=new a.Bounds;e.expand(this.x,this.y);if(this.textBounds)for(var d=0,k=this.textBounds.length;d< -k;d++){var f=this.textBounds[d];e.expand(f.x,f.y,f.x+f.w,f.y+f.h)}return e}})(ChemDoodle.ELEMENT,ChemDoodle.extensions,ChemDoodle.math,ChemDoodle.structures,Math,mat4); -(function(c,b,a,g,f,e,o){a.Bond=function(a,d,e){this.a1=a;this.a2=d;this.bondOrder=void 0!==e?e:1};a.Bond.STEREO_NONE="none";a.Bond.STEREO_PROTRUDING="protruding";a.Bond.STEREO_RECESSED="recessed";a.Bond.STEREO_AMBIGUOUS="ambiguous";var d=a.Bond.prototype;d.stereo=a.Bond.STEREO_NONE;d.isHover=!1;d.ring=void 0;d.getCenter=function(){return new a.Point((this.a1.x+this.a2.x)/2,(this.a1.y+this.a2.y)/2)};d.getLength=function(){return this.a1.distance(this.a2)};d.getLength3D=function(){return this.a1.distance3D(this.a2)}; -d.contains=function(a){return a===this.a1||a===this.a2};d.getNeighbor=function(a){if(a===this.a1)return this.a2;if(a===this.a2)return this.a1};d.draw=function(d,e){if(!(this.a1.x===this.a2.x&&this.a1.y===this.a2.y)){this.specs&&(e=this.specs);var o=this.a1.x,h=this.a2.x,j=this.a1.y,m=this.a2.y,t=this.a1.distance(this.a2),n=h-o,u=m-j;if(this.a1.isLassoed&&this.a2.isLassoed){var q=d.createLinearGradient(o,j,h,m);q.addColorStop(0,"rgba(212, 99, 0, 0)");q.addColorStop(0.5,"rgba(212, 99, 0, 0.8)");q.addColorStop(1, -"rgba(212, 99, 0, 0)");var r=2.5,w=this.a1.angle(this.a2)+f.PI/2,p=f.cos(w),w=f.sin(w),y=o-p*r,z=j+w*r,x=o+p*r,A=j-w*r,C=h+p*r,F=m-w*r,p=h-p*r,w=m+w*r;d.fillStyle=q;d.beginPath();d.moveTo(y,z);d.lineTo(x,A);d.lineTo(C,F);d.lineTo(p,w);d.closePath();d.fill()}if(e.atoms_display&&!e.atoms_circles_2D&&this.a1.isLabelVisible(e)&&this.a1.textBounds){r=p=0;for(y=this.a1.textBounds.length;rthis.ring.center.angle(this.a2)&&!(this.ring.center.angle(this.a1)-this.ring.center.angle(this.a2)> -f.PI)||this.ring.center.angle(this.a1)-this.ring.center.angle(this.a2)<-f.PI?(d.moveTo(y,z),2===this.bondOrder?d.lineTo(C,F):b.contextHashTo(d,y,z,C,F,e.bonds_hashSpacing_2D,e.bonds_hashSpacing_2D)):(d.moveTo(x,A),2===this.bondOrder?d.lineTo(p,w):b.contextHashTo(d,x,A,p,w,e.bonds_hashSpacing_2D,e.bonds_hashSpacing_2D)),d.stroke())):(r=this.a1.distance(this.a2)*e.bonds_saturationWidth_2D/2,w=this.a1.angle(this.a2)+f.PI/2,p=f.cos(w),w=f.sin(w),y=o-p*r,z=j+w*r,x=o+p*r,A=j-w*r,C=h+p*r,F=m-w*r,p=h-p*r, -w=m+w*r,d.beginPath(),d.moveTo(y,z),d.lineTo(p,w),d.moveTo(x,A),2===this.bondOrder?d.lineTo(C,F):b.contextHashTo(d,x,A,C,F,e.bonds_hashSpacing_2D,e.bonds_hashSpacing_2D),d.stroke());break;case 3:r=this.a1.distance(this.a2)*e.bonds_saturationWidth_2D,w=this.a1.angle(this.a2)+f.PI/2,p=f.cos(w),w=f.sin(w),y=o-p*r,z=j+w*r,x=o+p*r,A=j-w*r,C=h+p*r,F=m-w*r,p=h-p*r,w=m+w*r,d.beginPath(),d.moveTo(y,z),d.lineTo(p,w),d.moveTo(x,A),d.lineTo(C,F),d.moveTo(o,j),d.lineTo(h,m),d.stroke()}}};d.drawDecorations=function(a){if(this.isHover|| -this.isSelected){var d=2*f.PI,e=(this.a1.angleForStupidCanvasArcs(this.a2)+f.PI/2)%d;a.strokeStyle=this.isHover?"#885110":"#0060B2";a.lineWidth=1.2;a.beginPath();var g=(e+f.PI)%d,g=g%(2*f.PI);a.arc(this.a1.x,this.a1.y,7,e,g,!1);a.stroke();a.beginPath();e+=f.PI;g=(e+f.PI)%d;a.arc(this.a2.x,this.a2.y,7,e,g,!1);a.stroke()}};d.render=function(a,d){this.specs&&(d=this.specs);var g=(d.bonds_renderAsLines_3D?1.1:1.001)*this.a1.distance3D(this.a2)/(d.bonds_useJMOLColors||d.bonds_usePYMOLColors?2:1);if(0=== -g)return!1;var g=[d.bonds_cylinderDiameter_3D/2,g,d.bonds_cylinderDiameter_3D/2],h=e.translate(a.modelViewMatrix,[this.a1.x,this.a1.y,this.a1.z],[]),j,m=[this.a2.x-this.a1.x,this.a2.y-this.a1.y,this.a2.z-this.a1.z];if(d.bonds_useJMOLColors||d.bonds_usePYMOLColors)o.scale(m,0.5),j=e.translate(a.modelViewMatrix,[this.a2.x,this.a2.y,this.a2.z],[]);var t=[0],n;if(d.bonds_showBondOrders_3D){switch(this.bondOrder){case 2:t=[-d.bonds_cylinderDiameter_3D,d.bonds_cylinderDiameter_3D];break;case 3:t=[-1.2* -d.bonds_cylinderDiameter_3D,0,1.2*d.bonds_cylinderDiameter_3D]}if(1=h.a1.closestDistance&&d.macro_atomToLigandDistance>=h.a2.closestDistance))h.render(e,this.residueSpecs?this.residueSpecs:d)}}if(d.macro_displayAtoms){0=j.closestDistance))j.render(e,this.residueSpecs?this.residueSpecs:d)}}}if(d.bonds_display){0l;l++)r[4*d+l]+=r[4*(d-1)+l];w[p]=new c.Atom("",r[12]/ -r[15],r[13]/r[15],r[14]/r[15])}m[u]=w}if(h&&this.arrow)for(d=0;dl)if(a.strokeStyle="black",a.lineWidth=1,0===n%2){a.beginPath();a.moveTo(q,b-h);a.lineTo(q,b-h+2);a.stroke();for(m=j.toFixed(5);"0"===m.charAt(m.length-1);)m=m.substring(0,m.length-1);"."===m.charAt(m.length-1)&&(m=m.substring(0,m.length-1));var r=a.measureText(m).width;g.plots_flipXAxis&&(r*= --1);var w=q-r/2;if(g.plots_flipXAxis?wu)a.fillText(m,q,b-h+2),u=q+r/2;g.plots_showGrid&&(a.strokeStyle=g.plots_gridColor,a.lineWidth=g.plots_gridLineWidth,a.beginPath(),a.moveTo(q,b-h),a.lineTo(q,v),a.stroke())}else a.beginPath(),a.moveTo(q,b-h),a.lineTo(q,b-h+2),a.stroke();n++}if(g.plots_showYAxis||g.plots_showGrid){t=1/g.scale;a.textAlign="right";a.textBaseline="middle";for(j=0;10>=j;j++)if(m=t/10*j,n=v+(b-h-v)*(1-m*g.scale),g.plots_showGrid&&(a.strokeStyle=g.plots_gridColor,a.lineWidth=g.plots_gridLineWidth, -a.beginPath(),a.moveTo(l,n),a.lineTo(d,n),a.stroke()),g.plots_showYAxis){a.strokeStyle="black";a.lineWidth=1;a.beginPath();a.moveTo(l,n);a.lineTo(l-3,n);a.stroke();m*=100;u=f.max(0,3-f.floor(m).toString().length);m=m.toFixed(u);if(0=l&&qthis.integrationSensitivity&&j.push(new b.Point(this.data[n].x,this.data[n].y));m||(a.moveTo(q,r),m=!0);a.lineTo(q,r);t++;0===t%1E3&&(a.stroke(),a.beginPath(),a.moveTo(q,r))}else if(m)break}else{n=0;for(u=this.data.length;n=l&&qj[0].x;if(this.flipXAxis&&!n||!this.flipXAxis&&n){for(n=j.length-2;0<=n;n--)j[n].y+=j[n+1].y;m=j[0].y}else{n=1;for(u=j.length;ne){var d=f,f=e;e=d}for(var d=-1,g=-Infinity,b=!1,c=0,h=this.data.length;cg&&(b=!0,g=j.y,d=c);else if(b)break}if(-1!==d)return j=this.data[d],new ChemDoodle.structures.Point(j.x,100*j.y)};g.getClosestPeakInternalCoordinates=function(a){var g=this.getInverseTransformedX(a);a=0;for(var d=Infinity,b=0,c=this.data.length;b< -c;b++){var l=f.abs(this.data[b].x-g);if(l<=d)d=l,a=b;else break}g=highestRight=a;d=maxRight=this.data[a].y;b=a+1;for(c=this.data.length;bmaxRight)maxRight=this.data[b].y,highestRight=b;else break;for(b=a-1;0<=b;b--)if(this.data[b].y+0.05>d)d=this.data[b].y,g=b;else break;a=this.data[g-a>highestRight-a?highestRight:g];return new ChemDoodle.structures.Point(a.x,100*a.y)}})(ChemDoodle.extensions,ChemDoodle.structures,ChemDoodle.math,jQuery,Math); -(function(c,b,a){b._Shape=function(){};b=b._Shape.prototype;b.drawDecorations=function(a,f){if(this.isHover)for(var e=this.getPoints(),b=0,d=e.length;be.distance(d.molCenter)?c:e}return e};g.Pusher=function(a,d,e){this.o1=a;this.o2=d;this.numElectron=e?e:1};c=g.Pusher.prototype=new g._Shape;c.drawDecorations=function(e,d){if(this.isHover)for(var f=this.o1 instanceof a.Atom?new a.Point(this.o1.x,this.o1.y):this.o1.getCenter(),g=this.o2 instanceof a.Atom?new a.Point(this.o2.x,this.o2.y):this.o2.getCenter(),f=[f,g],g=0,b=f.length;g= -f.PI;)n-=f.PI;0.001>n&&(m+=f.PI/6,t+=f.PI/6,h.x=b.x+l*f.cos(m+f.PI),h.y=b.y-l*f.sin(m+f.PI),j.x=c.x+l*f.cos(t+f.PI),j.y=c.y-l*f.sin(t+f.PI));n=m+f.PI/2;l=f.cos(m);m=f.sin(m);if(d.pusher_showElectron_2D&&this.o1 instanceof a.Atom){var u=5;if(this.o1.isLabelVisible(d)||1l.distance(h)?q=!1:m=!1);g.beginPath();g.moveTo(t.x,t.y);q&&g.lineTo(l.x,l.y);g.lineTo(n,u);m&&g.lineTo(p.x,p.y);g.closePath();g.fill();g.stroke();g.beginPath();g.moveTo(b.x,b.y);g.bezierCurveTo(h.x,h.y,j.x,j.y,c.x,c.y);g.stroke();this.cache=[b,h,j,c]}};c.getPoints=function(){return[]};c.isOver=function(a,d){return b.distanceFromCurve(a,this.cache).distanceA;A++)w.push(x[A]);p===h-2&&oA;A++)j.indexData.push(x[A]); -if(b)for(A=0;6>A;A++)F.push(x[A])}}this.segments.push(new f(this,d[q+1].name,w,e))}if(b){p=new f(this,void 0,F,e);q=j.count-1;for(u=0;ut;t++)o.push(j.x,j.y,f/2),o.push(j.x,j.y,-f/2),o.push(h.x,h.y,f/2),o.push(h.x,h.y,-f/2);for(t=0;4>t;t++)d.push(m[0],m[1],m[2]);d.push(0,0,1);d.push(0,0,-1);d.push(0,0,1);d.push(0,0,-1);k.add(j)}k.x/=e;k.y/=e;d.push(0,0,1);o.push(k.x,k.y,f/2);d.push(0,0,-1);o.push(k.x,k.y,-f/2);k=[];j=8*e;v=0;for(l=e;vv&&(e++,k=0);var u=e*l;a.labels_font_stroke_3D&&b.strokeText(n,k,u+l/2);b.fillText(n,k,u+l/2);m.x=k;m.y=u;d+=n;k+=t}this.text=d;this.data=c;this.charHeight=l;return this}; -a.pushVertexData=function(a,b,e,c){var d=a.toString().split(""),k=this.getHeight(),v=this.getWidth();a=-this.textWidth(a)/2;for(var l=-this.charHeight/2,h=0,j=d.length;ht;t++)h=t/60*f.PI,l.push(new a.Point(2*f.cos(h),-2*f.sin(h)));l.push(new a.Point(-2,0),new a.Point(-2,4),new a.Point(2,4));var C=new a.d3.Shape(l,1);this.render= -function(d,h){this.bindBuffers(d);d.material.setDiffuseColor(h.macro_colorByChain?this.chainColor:h.nucleics_tubeColor);d.drawElements(d.TRIANGLES,this.vertexIndexBuffer.numItems,d.UNSIGNED_SHORT,0);if(this.partitions)for(var j=1,l=this.partitions.length;jj;j++)m=this.ends[j],m=e.translate(d.modelViewMatrix,[m.x,m.y,m.z],[]),l=v/2,e.scale(m,[l,l,l]),d.setMatrixUniforms(m),d.drawElements(d.TRIANGLES,d.sphereBuffer.vertexIndexBuffer.numItems,d.UNSIGNED_SHORT,0);d.cylinderBuffer.bindBuffers(d); -j=1;for(l=g.length-1;jo.dot(n,o.cross(r, -p))&&(q*=-1),e.rotateY(m,q)),h.nucleics_useShapelyColors&&!h.macro_colorByChain&&(b[u.name]?d.material.setDiffuseColor(b[u.name].shapelyColor):d.material.setDiffuseColor(b["*"].shapelyColor)),d.setMatrixUniforms(m),d.drawElements(d.TRIANGLES,C.vertexIndexBuffer.numItems,d.UNSIGNED_SHORT,0)}};g.Tube.prototype=new g._Mesh})(ChemDoodle.extensions,ChemDoodle.RESIDUE,ChemDoodle.structures,ChemDoodle.structures.d3,Math,mat4,vec3); -(function(c){c.UnitCell=function(b){var a=[],c=[],f=function(b,d,e,f){a.push(b[0],b[1],b[2]);a.push(d[0],d[1],d[2]);a.push(e[0],e[1],e[2]);a.push(f[0],f[1],f[2]);for(b=0;4>b;b++)c.push(0,0,0)};f(b.o,b.x,b.xy,b.y);f(b.o,b.y,b.yz,b.z);f(b.o,b.z,b.xz,b.x);f(b.yz,b.y,b.xy,b.xyz);f(b.xyz,b.xz,b.z,b.yz);f(b.xy,b.x,b.xz,b.xyz);b=[];for(f=0;6>f;f++){var e=4*f;b.push(e,e+1,e+1,e+2,e+2,e+3,e+3,e)}this.storeData(a,c,b)};c.UnitCell.prototype=new c._Mesh})(ChemDoodle.structures.d3,vec3); -(function(c,b,a){c.Plate=function(a){this.lanes=Array(a);i=0;for(ii=a;it[j].atoms.length)l=t[j];t=!1;j=0;for(m=this.rings.length;jB.x;)B.x++;for(;1<=B.y;)B.y--;for(;0>B.y;)B.y++;for(;1<=B.z;)B.z--;for(;0>B.z;)B.z++}G= -[];D=0;for(F=z.length;Dy.atoms[E].distance3D(B)){C=!0;break}if(!C){E=0;for(x=G.length;EG[E].distance3D(B)){C=!0;break}C||G.push(B)}}y.atoms=y.atoms.concat(G)}F=[];for(D=0;Dm&&-4=k.start&&e<=k.end){c?a.helix=!0:a.sheet=!0;e+1===k.end&&(a.arrow=!0);break}}}a.PDBInterpreter=function(){};var k=a.PDBInterpreter.prototype=new a._Interpreter;k.calculateRibbonDistances=!1;k.deduceResidueBonds=!1;k.read=function(a,h){var j=new g.Molecule;j.chains=[];if(!a)return j;var k=a.split("\n");h||(h=1);for(var t=[],n=[],u,q=[],r=[],v=[],p=0,y=k.length;px;x++){var F=new g.Residue(-1);F.cp1=A;F.cp2=A;q.push(F)}C!==Number.NaN&&q[q.length-1].resSeq!==C&&(x=new g.Residue(C),x.name=e(z.substring(17,20)),3===x.name.length?x.name=x.name.substring(0,1)+x.name.substring(1).toLowerCase():2===x.name.length&&"D"===x.name.charAt(0)&&(x.name=x.name.substring(1)),q.push(x),F=z.substring(21,22),d(x,t,F,C,!0), -d(x,n,F,C,!1));z=e(z.substring(12,16));x=q[q.length-1];if("CA"===z||"P"===z||"O5'"===z)x.cp1||(x.cp1=A);else if("N3"===z&&("C"===x.name||"U"===x.name||"T"===x.name)||"N1"===z&&("A"===x.name||"G"===x.name))x.cp3=A;else if("C2"===z)x.cp4=A;else if("C4"===z&&("C"===x.name||"U"===x.name||"T"===x.name)||"C6"===z&&("A"===x.name||"G"===x.name))x.cp5=A;else if("O"===z||"C6"===z&&("C"===x.name||"U"===x.name||"T"===x.name)||"N9"===z){if(!q[q.length-1].cp2){if("C6"===z||"N9"===z)u=A;x.cp2=A}}else"C"===z&&(u= -A)}}else if(b.stringStartsWith(z,"HETATM"))x=e(z.substring(76,78)),0===x.length&&(x=e(z.substring(12,16))),1C;C++)if(x= -e(z.substring(11+5*C,16+5*C)),0!==x.length&&(x=parseInt(x),v[x])){for(var F=v[x],D=!1,x=0,E=j.bonds.length;xe;e++)c=new g.Residue(-1),c.cp1=d,c.cp2=b[b.length-1].cp2,b.push(c);a.chains.push(b)}};k.calculateDistances=function(a,b){for(var d=[], -e=0,c=a.atoms.length;eE.length&&c.metadata.push(E),f=[D],b.stringStartsWith(E, -"##TITLE\x3d"))c.title=e(E.substring(8));else if(b.stringStartsWith(E,"##XUNITS\x3d"))c.xUnit=e(E.substring(9)),this.convertHZ2PPM&&"HZ"===c.xUnit.toUpperCase()&&(c.xUnit="PPM",A=!0);else if(b.stringStartsWith(E,"##YUNITS\x3d"))c.yUnit=e(E.substring(9));else if(!b.stringStartsWith(E,"##XYPAIRS\x3d"))if(b.stringStartsWith(E,"##FIRSTX\x3d"))t=parseFloat(e(E.substring(9)));else if(b.stringStartsWith(E,"##LASTX\x3d"))m=parseFloat(e(E.substring(8)));else if(b.stringStartsWith(E,"##FIRSTY\x3d"))n=parseFloat(e(E.substring(9))); -else if(b.stringStartsWith(E,"##NPOINTS\x3d"))u=parseFloat(e(E.substring(10)));else if(b.stringStartsWith(E,"##XFACTOR\x3d"))q=parseFloat(e(E.substring(10)));else if(b.stringStartsWith(E,"##YFACTOR\x3d"))r=parseFloat(e(E.substring(10)));else if(b.stringStartsWith(E,"##DELTAX\x3d"))p=parseFloat(e(E.substring(9)));else if(b.stringStartsWith(E,"##.OBSERVE FREQUENCY\x3d"))this.convertHZ2PPM&&(v=parseFloat(e(E.substring(21))));else if(b.stringStartsWith(E,"##.SHIFT REFERENCE\x3d"))this.convertHZ2PPM&& -(z=E.substring(19).split(","),y=parseInt(e(z[2])),z=parseFloat(e(z[3])));else if(b.stringStartsWith(E,"##XYDATA\x3d")){A||(v=1);var D=x=!1,E=E.split("\n"),I=(m-t)/(u-1);if(-1!==p)for(var G=1,L=E.length;Gv;v++)for(var l=0,h=d[v].length;lthis.width||a>this.height)this.specs.scale=0.85*d.min(this.width/b,this.height/a)};l.bondExists=function(a,b){for(var d=0,e=this.molecules.length;dd-n.lastTouch?n.dbltap?(n.prehandleEvent(a),n.dbltap(a)):n.dblclick?(n.prehandleEvent(a),n.dblclick(a)):n.touchstart?(n.prehandleEvent(a),n.touchstart(a)):n.mousedown&&(n.prehandleEvent(a),n.mousedown(a)):n.touchstart? -(n.prehandleEvent(a),n.touchstart(a),this.hold&&clearTimeout(this.hold),this.touchhold&&(this.hold=setTimeout(function(){n.touchhold(a)},1E3))):n.mousedown&&(n.prehandleEvent(a),n.mousedown(a));n.lastTouch=d}),a.bind("touchmove",function(a){this.hold&&(clearTimeout(this.hold),this.hold=void 0);if(!b.supports_gesture()&&2===a.originalEvent.touches.length&&n.gesturechange){var e=a.originalEvent.touches,c=new f.Point(e[0].pageX,e[0].pageY),g=new f.Point(e[1].pageX,e[1].pageY),e=c.distance(g),c=c.angle(g); -a.originalEvent.scale=e/n.implementedGestureDist;a.originalEvent.rotation=180*(n.implementedGestureAngle-c)/d.PI;n.prehandleEvent(a);n.gesturechange(a)}if(1(new Date).getTime()-n.lastTouch&&(n.tap?(n.prehandleEvent(a),n.tap(a)):n.click&&(n.prehandleEvent(a),n.click(a)))}), -a.bind("gesturestart",function(a){n.gesturestart&&(n.prehandleEvent(a),n.gesturestart(a))}),a.bind("gesturechange",function(a){n.gesturechange&&(n.prehandleEvent(a),n.gesturechange(a))}),a.bind("gestureend",function(a){n.gestureend&&(n.prehandleEvent(a),n.gestureend(a))})):(a.click(function(a){switch(a.which){case 1:n.click&&(n.prehandleEvent(a),n.click(a));break;case 2:n.middleclick&&(n.prehandleEvent(a),n.middleclick(a));break;case 3:n.rightclick&&(n.prehandleEvent(a),n.rightclick(a))}}),a.dblclick(function(a){n.dblclick&& -(n.prehandleEvent(a),n.dblclick(a))}),a.mousedown(function(a){switch(a.which){case 1:g.CANVAS_DRAGGING=n;n.mousedown&&(n.prehandleEvent(a),n.mousedown(a));break;case 2:n.middlemousedown&&(n.prehandleEvent(a),n.middlemousedown(a));break;case 3:n.rightmousedown&&(n.prehandleEvent(a),n.rightmousedown(a))}}),a.mousemove(function(a){!g.CANVAS_DRAGGING&&n.mousemove&&(n.prehandleEvent(a),n.mousemove(a))}),a.mouseout(function(a){g.CANVAS_OVER=void 0;n.mouseout&&(n.prehandleEvent(a),n.mouseout(a))}),a.mouseover(function(a){g.CANVAS_OVER= -n;n.mouseover&&(n.prehandleEvent(a),n.mouseover(a))}),a.mouseup(function(a){switch(a.which){case 1:n.mouseup&&(n.prehandleEvent(a),n.mouseup(a));break;case 2:n.middlemouseup&&(n.prehandleEvent(a),n.middlemouseup(a));break;case 3:n.rightmouseup&&(n.prehandleEvent(a),n.rightmouseup(a))}}),a.mousewheel(function(a,b){n.mousewheel&&(n.prehandleEvent(a),n.mousewheel(a,b))}));this.subCreate&&this.subCreate()};l.prehandleEvent=function(a){a.originalEvent.changedTouches&&(a.pageX=a.originalEvent.changedTouches[0].pageX, -a.pageY=a.originalEvent.changedTouches[0].pageY);a.preventDefault();a.offset=e("#"+this.id).offset();a.p=new f.Point(a.pageX-a.offset.left,a.pageY-a.offset.top)}})(ChemDoodle,ChemDoodle.featureDetection,ChemDoodle.math,ChemDoodle.monitor,ChemDoodle.structures,jQuery,jQuery.browser,Math,document,window); -(function(c){c._AnimatorCanvas=function(b,a,c){b&&this.create(b,a,c)};c=c._AnimatorCanvas.prototype=new c._Canvas;c.timeout=33;c.startAnimation=function(){this.stopAnimation();this.lastTime=(new Date).getTime();var b=this;this.nextFrame&&(this.handle=setInterval(function(){var a=(new Date).getTime();b.nextFrame(a-b.lastTime);b.repaint();b.lastTime=a},this.timeout))};c.stopAnimation=function(){this.handle&&(clearInterval(this.handle),this.handle=void 0)};c.isRunning=function(){return void 0!==this.handle}})(ChemDoodle); -(function(c,b){c.FileCanvas=function(a,c,f,e){a&&this.create(a,c,f);b.writeln('\x3cbr\x3e\x3cform name\x3d"FileForm" enctype\x3d"multipart/form-data" method\x3d"POST" action\x3d"'+e+'" target\x3d"HiddenFileFrame"\x3e\x3cinput type\x3d"file" name\x3d"f" /\x3e\x3cinput type\x3d"submit" name\x3d"submitbutton" value\x3d"Show File" /\x3e\x3c/form\x3e\x3ciframe id\x3d"HFF-'+a+'" name\x3d"HiddenFileFrame" height\x3d"0" width\x3d"0" style\x3d"display:none;" onLoad\x3d"GetMolFromFrame(\'HFF-'+a+"', "+a+')"\x3e\x3c/iframe\x3e'); -this.emptyMessage="Click below to load file";this.repaint()};c.FileCanvas.prototype=new c._Canvas})(ChemDoodle,document); -(function(c){c.HyperlinkCanvas=function(b,a,c,f,e,o){b&&this.create(b,a,c);this.urlOrFunction=f;this.color=e?e:"blue";this.size=o?o:2};c=c.HyperlinkCanvas.prototype=new c._Canvas;c.openInNewWindow=!0;c.hoverImage=void 0;c.drawChildExtras=function(b){this.e&&(this.hoverImage?b.drawImage(this.hoverImage,0,0):(b.strokeStyle=this.color,b.lineWidth=2*this.size,b.strokeRect(0,0,this.width,this.height)))};c.setHoverImage=function(b){this.hoverImage=new Image;this.hoverImage.src=b};c.click=function(){this.e= -void 0;this.repaint();this.urlOrFunction instanceof Function?this.urlOrFunction():this.openInNewWindow?window.open(this.urlOrFunction):location.href=this.urlOrFunction};c.mouseout=function(){this.e=void 0;this.repaint()};c.mouseover=function(b){this.e=b;this.repaint()}})(ChemDoodle); -(function(c,b,a,g){c.MolGrabberCanvas=function(b,e,c){b&&this.create(b,e,c);e=[];e.push('\x3cbr\x3e\x3cinput type\x3d"text" id\x3d"');e.push(b);e.push('_query" size\x3d"32" value\x3d"" /\x3e');e.push("\x3cbr\x3e\x3cnobr\x3e");e.push('\x3cselect id\x3d"');e.push(b);e.push('_select"\x3e');e.push('\x3coption value\x3d"chemexper"\x3eChemExper');e.push('\x3coption value\x3d"chemspider"\x3eChemSpider');e.push('\x3coption value\x3d"pubchem" selected\x3ePubChem');e.push("\x3c/select\x3e");e.push('\x3cbutton id\x3d"'); -e.push(b);e.push('_submit"\x3eShow Molecule\x3c/button\x3e');e.push("\x3c/nobr\x3e");g.getElementById(b);a("#"+b).after(e.join(""));var d=this;a("#"+b+"_submit").click(function(){d.search()});a("#"+b+"_query").keypress(function(a){13===a.which&&d.search()});this.emptyMessage="Enter search term below";this.repaint()};c=c.MolGrabberCanvas.prototype=new c._Canvas;c.setSearchTerm=function(b){a("#"+this.id+"_query").val(b);this.search()};c.search=function(){this.emptyMessage="Searching...";this.clear(); -var c=this;b.getMoleculeFromDatabase(a("#"+this.id+"_query").val(),{database:a("#"+this.id+"_select").val()},function(a){c.loadMolecule(a)})}})(ChemDoodle,ChemDoodle.iChemLabs,jQuery,document); -(function(c,b,a){var g=[],f=[1,0,0],e=[0,1,0],o=[0,0,1];c.RotatorCanvas=function(a,b,e,c){a&&this.create(a,b,e);this.rotate3D=c};c=c.RotatorCanvas.prototype=new c._AnimatorCanvas;b=b.PI/15;c.xIncrement=b;c.yIncrement=b;c.zIncrement=b;c.nextFrame=function(b){if(0===this.molecules.length&&0===this.shapes.length)this.stopAnimation();else if(b/=1E3,this.rotate3D){a.identity(g);a.rotate(g,this.xIncrement*b,f);a.rotate(g,this.yIncrement*b,e);a.rotate(g,this.zIncrement*b,o);b=0;for(var c=this.molecules.length;b< -c;b++){for(var v=this.molecules[b],l=0,h=v.atoms.length;lthis.frames.length-1&&(this.curIndex=0);this.alpha=1;var a=this.frames[this.curIndex];this.loadContent(a.mols,a.shapes);this.phase=1;var b=this,e=1;this.innerHandle=setInterval(function(){b.alpha=(15-e)/15;b.repaint();15===e&&b.breakInnerHandle();e++},33)}else 1=== -this.phase&&(this.alpha=0,this.repaint())};a.addFrame=function(a,b){0===this.frames.length&&this.loadContent(a,b);this.frames.push({mols:a,shapes:b})}})(ChemDoodle,ChemDoodle.math); -(function(c,b,a,g,f){c.TransformCanvas=function(a,b,d,c){a&&this.create(a,b,d);this.rotate3D=c};c=c.TransformCanvas.prototype=new c._Canvas;c.lastPoint=void 0;c.rotationMultMod=1.3;c.lastPinchScale=1;c.lastGestureRotate=0;c.mousedown=function(a){this.lastPoint=a.p};c.dblclick=function(){this.center();this.repaint()};c.drag=function(e){if(!this.lastPoint.multi){if(b.ALT){var c=new a.Point(e.p.x,e.p.y);c.sub(this.lastPoint);for(var d=0,k=this.molecules.length;dthis.specs.scale&&(this.specs.scale=0.01);this.repaint()};c.multitouchmove=function(b,c){if(2===c)if(this.lastPoint.multi){var d=new a.Point(b.p.x,b.p.y);d.sub(this.lastPoint);for(var f=0,g=this.molecules.length;fthis.specs.scale&&(this.specs.scale=0.01),this.lastPinchScale=b.originalEvent.scale);if(0!==this.lastGestureRotate-b.originalEvent.rotation){for(var c=(this.lastGestureRotate-b.originalEvent.rotation)/180*l.PI,d=new a.Point(this.width/2,this.height/2),f=0,g=this.molecules.length;f< -g;f++){for(var l=this.molecules[f],h=0,j=l.atoms.length;hc%10?b.lineTo(c,a.round(this.height/ -2)):b.moveTo(c,a.round(this.height/2));b.stroke()}};g.mousewheel=function(a,b){this.specs.scale+=b/10;0.01>this.specs.scale&&(this.specs.scale=0.01);this.repaint()};g.dblclick=function(){this.spectrum.setup();this.specs.scale=1;this.repaint()};g.multitouchmove=function(a,b){2===b&&(!this.dragRange||!this.dragRange.multi?(this.dragRange=new c.structures.Point(a.p.x,a.p.x),this.dragRange.multi=!0):(this.spectrum.translate(a.p.x-this.dragRange.x,this.width),this.dragRange.x=a.p.x,this.dragRange.y=a.p.x, -this.repaint()))};g.gesturechange=function(a){this.specs.scale*=a.originalEvent.scale/this.lastPinchScale;0.01>this.specs.scale&&(this.specs.scale=0.01);this.lastPinchScale=a.originalEvent.scale;this.repaint()};g.gestureend=function(){this.lastPinchScale=1}})(ChemDoodle,ChemDoodle.monitor,Math); -(function(c,b){c.SeekerCanvas=function(a,b,c,o){a&&this.create(a,b,c);this.seekType=o};var a=c.SeekerCanvas.prototype=new c._SpectrumCanvas;a.superRepaint=a.innerRepaint;a.innerRepaint=function(a){this.superRepaint(a);if(this.spectrum&&0this.width-2&&(o-=6+d);f=f.y;0>f-this.specs.text_font_size-2&&(f+=this.specs.text_font_size);a.fillRect(o,f-this.specs.text_font_size,d,this.specs.text_font_size);a.fillStyle="black";a.fillText(e,o,f)}};a.mouseout=function(){this.p=void 0;this.repaint()};a.mousemove=function(a){this.p= -{x:a.p.x-2,y:a.p.y-3};this.repaint()};a.touchstart=function(a){this.mousemove(a)};a.touchmove=function(a){this.mousemove(a)};a.touchend=function(a){this.mouseout(a)};c.SeekerCanvas.SEEK_POINTER="pointer";c.SeekerCanvas.SEEK_PLOT="plot";c.SeekerCanvas.SEEK_PEAK="peak"})(ChemDoodle,Math); -(function(c,b,a,g,f,e,o,d,k,v,l){c._Canvas3D=function(a,b,d){a&&this.create(a,b,d)};var h=c._Canvas3D.prototype=new c._Canvas;h.rotationMatrix=k.identity([]);h.translationMatrix=k.identity([]);h.lastPoint=void 0;h.emptyMessage="WebGL is Unavailable!";h.afterLoadContent=function(){for(var b=new a.Bounds,d=0,c=this.molecules.length;do.PI/2&&(q[w].guidePointsSmall.reverse(),q[w].guidePointsLarge.reverse(),l.scale(q[w].D,-1))}w=1;for(p=q.length-3;wthis.frameNumber&&(this.frameNumber=1,this.reverse=!1)):(this.frameNumber++,this.frameNumber>=this.frames.length&&(2===this.playMode?(this.frameNumber-=2,this.reverse=!0):(this.frameNumber=0,0===this.playMode&&this.stopAnimation())))};a.center=function(){for(var a=new b.Atom,c=this.frames[0],e=0,o=c.mols.length;el.atomicNumber||71l.atomicNumber||103l.atomicNumber)this.cells.push(new g(l,a,b,this.cellDimension)),a+=this.cellDimension,d++}b+=2*this.cellDimension;a=3*this.cellDimension+this.padding;for(f=57;104>f;f++)if(l=c.ELEMENT[c.SYMBOLS[f]],90===l.atomicNumber&&(b+=this.cellDimension,a=3*this.cellDimension+this.padding),58<=l.atomicNumber&&71>=l.atomicNumber||90<=l.atomicNumber&&103>=l.atomicNumber)this.cells.push(new g(l,a,b,this.cellDimension)),a+=this.cellDimension};f.drawCell=function(a,c,d){var f= -a.createRadialGradient(d.x+d.dimension/3,d.y+d.dimension/3,1.5*d.dimension,d.x+d.dimension/3,d.y+d.dimension/3,d.dimension/10);f.addColorStop(0,"#000000");f.addColorStop(0.7,d.element.jmolColor);f.addColorStop(1,"#FFFFFF");a.fillStyle=f;b.contextRoundRect(a,d.x,d.y,d.dimension,d.dimension,d.dimension/8);if(d===this.hovered||d===this.selected)a.lineWidth=2,a.strokeStyle="#c10000",a.stroke(),a.fillStyle="white";a.fill();a.font=c.getFontString(c.text_font_size,c.text_font_families);a.fillStyle=c.text_color; -a.textAlign="center";a.textBaseline="middle";a.fillText(d.element.symbol,d.x+d.dimension/2,d.y+d.dimension/2)};f.click=function(){this.hovered&&(this.selected=this.hovered,this.repaint())};f.mousemove=function(b){var c=b.p.x;b=b.p.y;this.hovered=void 0;for(var d=0,f=this.cells.length;d").attr(t);this.setElement(e,false)}else{this.setElement(h.result(this,"el"),false)}}});a.sync=function(t,e,i){var r=k[t];h.defaults(i||(i={}),{emulateHTTP:a.emulateHTTP,emulateJSON:a.emulateJSON});var s={type:r,dataType:"json"};if(!i.url){s.url=h.result(e,"url")||U()}if(i.data==null&&e&&(t==="create"||t==="update"||t==="patch")){s.contentType="application/json";s.data=JSON.stringify(i.attrs||e.toJSON(i))}if(i.emulateJSON){s.contentType="application/x-www-form-urlencoded";s.data=s.data?{model:s.data}:{}}if(i.emulateHTTP&&(r==="PUT"||r==="DELETE"||r==="PATCH")){s.type="POST";if(i.emulateJSON)s.data._method=r;var n=i.beforeSend;i.beforeSend=function(t){t.setRequestHeader("X-HTTP-Method-Override",r);if(n)return n.apply(this,arguments)}}if(s.type!=="GET"&&!i.emulateJSON){s.processData=false}if(s.type==="PATCH"&&window.ActiveXObject&&!(window.external&&window.external.msActiveXFilteringEnabled)){s.xhr=function(){return new ActiveXObject("Microsoft.XMLHTTP")}}var o=i.xhr=a.ajax(h.extend(s,i));e.trigger("request",e,o,i);return o};var k={create:"POST",update:"PUT",patch:"PATCH","delete":"DELETE",read:"GET"};a.ajax=function(){return a.$.ajax.apply(a.$,arguments)};var S=a.Router=function(t){t||(t={});if(t.routes)this.routes=t.routes;this._bindRoutes();this.initialize.apply(this,arguments)};var $=/\((.*?)\)/g;var T=/(\(\?)?:\w+/g;var H=/\*\w+/g;var A=/[\-{}\[\]+?.,\\\^$|#\s]/g;h.extend(S.prototype,o,{initialize:function(){},route:function(t,e,i){if(!h.isRegExp(t))t=this._routeToRegExp(t);if(h.isFunction(e)){i=e;e=""}if(!i)i=this[e];var r=this;a.history.route(t,function(s){var n=r._extractParameters(t,s);i&&i.apply(r,n);r.trigger.apply(r,["route:"+e].concat(n));r.trigger("route",e,n);a.history.trigger("route",r,e,n)});return this},navigate:function(t,e){a.history.navigate(t,e);return this},_bindRoutes:function(){if(!this.routes)return;this.routes=h.result(this,"routes");var t,e=h.keys(this.routes);while((t=e.pop())!=null){this.route(t,this.routes[t])}},_routeToRegExp:function(t){t=t.replace(A,"\\$&").replace($,"(?:$1)?").replace(T,function(t,e){return e?t:"([^/]+)"}).replace(H,"(.*?)");return new RegExp("^"+t+"$")},_extractParameters:function(t,e){var i=t.exec(e).slice(1);return h.map(i,function(t){return t?decodeURIComponent(t):null})}});var I=a.History=function(){this.handlers=[];h.bindAll(this,"checkUrl");if(typeof window!=="undefined"){this.location=window.location;this.history=window.history}};var N=/^[#\/]|\s+$/g;var P=/^\/+|\/+$/g;var O=/msie [\w.]+/;var C=/\/$/;I.started=false;h.extend(I.prototype,o,{interval:50,getHash:function(t){var e=(t||this).location.href.match(/#(.*)$/);return e?e[1]:""},getFragment:function(t,e){if(t==null){if(this._hasPushState||!this._wantsHashChange||e){t=this.location.pathname;var i=this.root.replace(C,"");if(!t.indexOf(i))t=t.substr(i.length)}else{t=this.getHash()}}return t.replace(N,"")},start:function(t){if(I.started)throw new Error("Backbone.history has already been started");I.started=true;this.options=h.extend({},{root:"/"},this.options,t);this.root=this.options.root;this._wantsHashChange=this.options.hashChange!==false;this._wantsPushState=!!this.options.pushState;this._hasPushState=!!(this.options.pushState&&this.history&&this.history.pushState);var e=this.getFragment();var i=document.documentMode;var r=O.exec(navigator.userAgent.toLowerCase())&&(!i||i<=7);this.root=("/"+this.root+"/").replace(P,"/");if(r&&this._wantsHashChange){this.iframe=a.$(''),r.bgiframe.appendTo(l),l.bind("tooltipmove"+h,n.adjustBGIFrame)),o=s("

",{id:"qtip-rcontainer"}).appendTo(e.body),n.redraw(),r.overlay&&!d&&(i=function(){r.overlay[0].style.top=a.scrollTop()+"px"},a.bind("scroll.qtip-ie6, resize.qtip-ie6",i),i(),r.overlay.addClass("qtipmodal-ie6fix"),d=W)},adjustBGIFrame:function(){var t,e,o={height:l.outerHeight(S),width:l.outerWidth(S)},s=i.plugins.tip,n=r.tip;e=parseInt(l.css("border-left-width"),10)||0,e={left:-e,top:-e},s&&n&&(t="x"===s.corner.precedance?["width","left"]:["height","top"],e[t[1]]-=n[t[0]]()),r.bgiframe.css(e).css(o)},redraw:function(){if(1>i.rendered||i.drawing)return n;var t,e,s,r,h=a.style,c=a.position.container;return i.drawing=1,h.height&&l.css(I,h.height),h.width?l.css(k,h.width):(l.css(k,"").appendTo(o),e=l.width(),1>e%2&&(e+=1),s=l.css("max-width")||"",r=l.css("min-width")||"",t=(s+r).indexOf("%")>-1?c.width()/100:0,s=(s.indexOf("%")>-1?t:1)*parseInt(s,10)||e,r=(r.indexOf("%")>-1?t:1)*parseInt(r,10)||0,e=s+r?Math.min(Math.max(e,r),s):e,l.css(k,Math.round(e)).appendTo(c)),i.drawing=0,n},destroy:function(){c&&r.bgiframe.remove(),l.unbind(h)}}),n.init()}var C,j,q,M,z,W=!0,S=!1,E=null,O="x",R="y",k="width",I="height",B="top",L="left",V="bottom",A="right",F="center",P="flipinvert",D="shift",N={},X="qtip",$="data-hasqtip",Y=["ui-widget","ui-tooltip"],H={},G="div."+X,U=X+"-default",Q=X+"-focus",J=X+"-hover",K="qtip-disabled",Z="_replacedByqTip",te="oldtitle";BROWSER={ie:function(){for(var t=3,i=e.createElement("div");(i.innerHTML="")&&i.getElementsByTagName("i")[0];);return t>4?t:0/0}(),iOS:parseFloat((""+(/CPU.*OS ([0-9_]{1,5})|(CPU like).*AppleWebKit.*Mobile/i.exec(navigator.userAgent)||[0,""])[1]).replace("undefined","3_2").replace("_",".").replace("_",""))||S},j=n.prototype,j.render=function(t){if(this.rendered||this.destroyed)return this;var e=this,i=this.options,o=this.cache,n=this.elements,r=i.content.text,a=i.content.title,l=i.content.button,h=i.position,c="."+this._id+" ",d=[];return s.attr(this.target[0],"aria-describedby",this._id),this.tooltip=n.tooltip=tooltip=s("
",{id:this._id,"class":[X,U,i.style.classes,X+"-pos-"+i.position.my.abbrev()].join(" "),width:i.style.width||"",height:i.style.height||"",tracking:"mouse"===h.target&&h.adjust.mouse,role:"alert","aria-live":"polite","aria-atomic":S,"aria-describedby":this._id+"-content","aria-hidden":W}).toggleClass(K,this.disabled).data(X,this).appendTo(h.container).append(n.content=s("
",{"class":X+"-content",id:this._id+"-content","aria-atomic":W})),this.rendered=-1,this.positioning=W,a&&(this._createTitle(),s.isFunction(a)||d.push(this._updateTitle(a,S))),l&&this._createButton(),s.isFunction(r)||d.push(this._updateContent(r,S)),this.rendered=W,this._setWidget(),s.each(i.events,function(t,e){s.isFunction(e)&&tooltip.bind(("toggle"===t?["tooltipshow","tooltiphide"]:["tooltip"+t]).join(c)+c,e)}),s.each(N,function(t){var i;"render"===this.initialize&&(i=this(e))&&((e.plugins[t]=i).qtip=e)}),this._assignEvents(),s.when.apply(s,d).then(function(){e._trigger("render"),e.positioning=S,e.hiddenDuringWait||!i.show.ready&&!t||e.toggle(W,o.event,S),e.hiddenDuringWait=S}),this},j.destroy=function(t){function e(){if(!this.destroyed){this.destroyed=W;var t=this.target,e=t.attr(te);this.rendered&&this.tooltip.stop(1,0).find("*").remove().end().remove(),s.each(this.plugins,function(){this.destroy&&this.destroy()}),clearTimeout(this.timers.show),clearTimeout(this.timers.hide),this._unassignEvents(),t.removeData(X).removeAttr($).removeAttr("aria-describedby"),this.options.suppress&&e&&t.attr("title",e).removeAttr(te),t.unbind("."+this._id),this.options=this.elements=this.cache=this.timers=this.plugins=this.mouse=H[this.id]=E}}return this.destroyed?this.target:(t!==W&&this.rendered?(tooltip.one("tooltiphidden",s.proxy(e,this)),!this.triggering&&this.hide()):e.call(this),this.target)},M=j.checks={builtin:{"^id$":function(t,e,i,o){var n=i===W?C.nextid:i,r=X+"-"+n;n!==S&&n.length>0&&!s("#"+r).length?(this._id=r,this.rendered&&(this.tooltip[0].id=this._id,this.elements.content[0].id=this._id+"-content",this.elements.title[0].id=this._id+"-title")):t[e]=o},"^prerender":function(t,e,i){i&&!this.rendered&&this.render(this.options.show.ready)},"^content.text$":function(t,e,i){this._updateContent(i)},"^content.attr$":function(t,e,i,o){this.options.content.text===this.target.attr(o)&&this._updateContent(this.target.attr(i))},"^content.title$":function(t,e,i){return i?(i&&!this.elements.title&&this._createTitle(),this._updateTitle(i),o):this._removeTitle()},"^content.button$":function(t,e,i){this._updateButton(i)},"^content.title.(text|button)$":function(t,e,i){this.set("content."+e,i)},"^position.(my|at)$":function(t,e,i){"string"==typeof i&&(t[e]=new q(i,"at"===e))},"^position.container$":function(t,e,i){this.tooltip.appendTo(i)},"^show.ready$":function(t,e,i){i&&(!this.rendered&&this.render(W)||this.toggle(W))},"^style.classes$":function(t,e,i){this.tooltip.attr("class",[X,U,i,X+"-pos-"+this.options.position.my.abbrev()].join(" "))},"^style.width|height":function(t,e,i){this.tooltip.css(e,i)},"^style.widget|content.title":function(){this._setWidget()},"^style.def":function(t,e,i){this.tooltip.toggleClass(U,!!i)},"^events.(render|show|move|hide|focus|blur)$":function(t,e,i){tooltip[(s.isFunction(i)?"":"un")+"bind"]("tooltip"+e,i)},"^(show|hide|position).(event|target|fixed|inactive|leave|distance|viewport|adjust)":function(){var t=this.options.position;tooltip.attr("tracking","mouse"===t.target&&t.adjust.mouse),this._unassignEvents(),this._assignEvents()}}},j.get=function(t){if(this.destroyed)return this;var e=h(this.options,t.toLowerCase()),i=e[0][e[1]];return i.precedance?i.string():i};var ee=/^position\.(my|at|adjust|target|container|viewport)|style|content|show\.ready/i,ie=/^prerender|show\.ready/i;j.set=function(t,e){if(this.destroyed)return this;var i,n=this.rendered,r=S,a=this.options;return this.checks,"string"==typeof t?(i=t,t={},t[i]=e):t=s.extend({},t),s.each(t,function(e,i){if(!n&&!ie.test(e))return delete t[e],o;var l,c=h(a,e.toLowerCase());l=c[0][c[1]],c[0][c[1]]=i&&i.nodeType?s(i):i,r=ee.test(e)||r,t[e]=[c[0],c[1],i,l]}),l(a),this.positioning=W,s.each(t,s.proxy(c,this)),this.positioning=S,this.rendered&&this.tooltip[0].offsetWidth>0&&r&&this.reposition("mouse"===a.position.target?E:this.cache.event),this},j._update=function(t,e,i){var o=this,n=this.cache;return this.rendered&&t?(s.isFunction(t)&&(t=t.call(this.elements.target,n.event,this)||""),s.isFunction(t.then)?(n.waiting=W,t.then(function(t){return n.waiting=S,o._updateContent(t,i)},E,function(t){return o._updateContent(t,i)})):t===S||!t&&""!==t?S:(t.jquery&&t.length>0?e.empty().append(t.css({display:"block"})):e.html(t),n.waiting=W,e.imagesLoaded().done(function(){n.waiting=S,i!==S&&o.rendered&&o.tooltip[0].offsetWidth>0&&o.reposition(n.event)}).promise())):S},j._updateContent=function(t,e){this._update(t,this.elements.content,e)},j._updateTitle=function(t,e){this._update(t,this.elements.title,e)===S&&this._removeTitle(S)},j._createTitle=function(){var t=this.elements,e=this._id+"-title";t.titlebar&&this._removeTitle(),t.titlebar=s("
",{"class":X+"-titlebar "+(this.options.style.widget?d("header"):"")}).append(t.title=s("
",{id:e,"class":X+"-title","aria-atomic":W})).insertBefore(t.content).delegate(".qtip-close","mousedown keydown mouseup keyup mouseout",function(t){s(this).toggleClass("ui-state-active ui-state-focus","down"===t.type.substr(-4))}).delegate(".qtip-close","mouseover mouseout",function(t){s(this).toggleClass("ui-state-hover","mouseover"===t.type)}),this.options.content.button&&this._createButton()},j._removeTitle=function(t){var e=this.elements;e.title&&(e.titlebar.remove(),e.titlebar=e.title=e.button=E,t!==S&&this.reposition())};var oe=(q=function(t,e){t=(""+t).replace(/([A-Z])/," $1").replace(/middle/gi,F).toLowerCase(),this.x=(t.match(/left|right/i)||t.match(/center/)||["inherit"])[0].toLowerCase(),this.y=(t.match(/top|bottom|center/i)||["inherit"])[0].toLowerCase(),this.forceY=!!e;var i=t.charAt(0);this.precedance="t"===i||"b"===i?R:O}).prototype;oe.invert=function(t,e){this[t]=this[t]===L?A:this[t]===A?L:e||this[t]},oe.string=function(){var t=this.x,e=this.y;return t===e?t:this.precedance===R||this.forceY&&"center"!==e?e+" "+t:t+" "+e},oe.abbrev=function(){var t=this.string().split(" ");return t[0].charAt(0)+t[1].charAt(0)},oe.clone=function(){return new q(this.string(),this.forceY)},(j.reposition=function(i,o){if(!this.rendered||this.positioning||this.destroyed)return this;this.positioning=W;var n,r,a=this.cache,l=this.tooltip,h=this.options.position,c=h.target,d=h.my,p=h.at,u=h.viewport,f=h.container,g=h.adjust,m=g.method.split(" "),v=l.outerWidth(S),y=l.outerHeight(S),b=0,w=0,x=l.css("position"),_={left:0,top:0},T=l[0].offsetWidth>0,C=i&&"scroll"===i.type,j=s(t),q=this.mouse;if(s.isArray(c)&&2===c.length)p={x:L,y:B},_={left:c[0],top:c[1]};else if("mouse"===c&&(i&&i.pageX||a.event.pageX))p={x:L,y:B},i=!q||!q.pageX||!g.mouse&&i&&i.pageX?(!i||"resize"!==i.type&&"scroll"!==i.type?i&&i.pageX&&"mousemove"===i.type?i:(!g.mouse||this.options.show.distance)&&a.origin&&a.origin.pageX?a.origin:i:a.event)||i||a.event||q||{}:{pageX:q.pageX,pageY:q.pageY},"static"!==x&&(_=f.offset()),_={left:i.pageX-_.left,top:i.pageY-_.top},g.mouse&&C&&(_.left-=q.scrollX-j.scrollLeft(),_.top-=q.scrollY-j.scrollTop());else{if("event"===c&&i&&i.target&&"scroll"!==i.type&&"resize"!==i.type?a.target=s(i.target):"event"!==c&&(a.target=s(c.jquery?c:elements.target)),c=a.target,c=s(c).eq(0),0===c.length)return this;c[0]===e||c[0]===t?(b=BROWSER.iOS?t.innerWidth:c.width(),w=BROWSER.iOS?t.innerHeight:c.height(),c[0]===t&&(_={top:(u||c).scrollTop(),left:(u||c).scrollLeft()})):N.imagemap&&c.is("area")?n=N.imagemap(this,c,p,N.viewport?m:S):N.svg&&c[0].ownerSVGElement?n=N.svg(this,c,p,N.viewport?m:S):(b=c.outerWidth(S),w=c.outerHeight(S),_=c.offset()),n&&(b=n.width,w=n.height,r=n.offset,_=n.position),_=this.reposition.offset(c,_,f),(BROWSER.iOS>3.1&&4.1>BROWSER.iOS||BROWSER.iOS>=4.3&&4.33>BROWSER.iOS||!BROWSER.iOS&&"fixed"===x)&&(_.left-=j.scrollLeft(),_.top-=j.scrollTop()),(!n||n&&n.adjustable!==S)&&(_.left+=p.x===A?b:p.x===F?b/2:0,_.top+=p.y===V?w:p.y===F?w/2:0)}return _.left+=g.x+(d.x===A?-v:d.x===F?-v/2:0),_.top+=g.y+(d.y===V?-y:d.y===F?-y/2:0),N.viewport?(_.adjusted=N.viewport(this,_,h,b,w,v,y),r&&_.adjusted.left&&(_.left+=r.left),r&&_.adjusted.top&&(_.top+=r.top)):_.adjusted={left:0,top:0},this._trigger("move",[_,u.elem||u],i)?(delete _.adjusted,o===S||!T||isNaN(_.left)||isNaN(_.top)||"mouse"===c||!s.isFunction(h.effect)?l.css(_):s.isFunction(h.effect)&&(h.effect.call(l,this,s.extend({},_)),l.queue(function(t){s(this).css({opacity:"",height:""}),BROWSER.ie&&this.style.removeAttribute("filter"),t()})),this.positioning=S,this):this}).offset=function(t,i,o){function n(t,e){i.left+=e*t.scrollLeft(),i.top+=e*t.scrollTop()}if(!o[0])return i;var r,a,l,h,c=s(t[0].ownerDocument),d=!!BROWSER.ie&&"CSS1Compat"!==e.compatMode,p=o[0];do"static"!==(a=s.css(p,"position"))&&("fixed"===a?(l=p.getBoundingClientRect(),n(c,-1)):(l=s(p).position(),l.left+=parseFloat(s.css(p,"borderLeftWidth"))||0,l.top+=parseFloat(s.css(p,"borderTopWidth"))||0),i.left-=l.left+(parseFloat(s.css(p,"marginLeft"))||0),i.top-=l.top+(parseFloat(s.css(p,"marginTop"))||0),r||"hidden"===(h=s.css(p,"overflow"))||"visible"===h||(r=p));while(p=p.offsetParent);return(r&&r!==c[0]||d)&&n(r,1),i},j.toggle=function(t,i){var o=this.cache,n=this.options,r=this.tooltip;if(i){if(/over|enter/.test(i.type)&&/out|leave/.test(o.event.type)&&n.show.target.add(i.target).length===n.show.target.length&&r.has(i.relatedTarget).length)return this;o.event=s.extend({},i)}if(this.waiting&&!t&&(this.hiddenDuringWait=W),!this.rendered)return t?this.render(1):this;if(this.destroyed)return this;var a,l,h=t?"show":"hide",c=this.options[h],d=(this.options[t?"hide":"show"],this.options.position),p=this.options.content,u=this.tooltip.css("width"),f=this.tooltip[0].offsetWidth>0,g=t||1===c.target.length,m=!i||2>c.target.length||o.target[0]===i.target;return(typeof t).search("boolean|number")&&(t=!f),a=!r.is(":animated")&&f===t&&m,l=a?E:!!this._trigger(h,[90]),l!==S&&t&&this.focus(i),!l||a?this:(s.attr(r[0],"aria-hidden",!t),t?(o.origin=s.extend({},this.mouse),s.isFunction(p.text)&&this._updateContent(p.text,S),s.isFunction(p.title)&&this._updateTitle(p.title,S),!z&&"mouse"===d.target&&d.adjust.mouse&&(s(e).bind("mousemove."+X,this._storeMouse),z=W),u||r.css("width",r.outerWidth(S)),this.reposition(i,arguments[2]),u||r.css("width",""),c.solo&&("string"==typeof c.solo?s(c.solo):s(G,c.solo)).not(r).not(c.target).qtip("hide",s.Event("tooltipsolo"))):(clearTimeout(this.timers.show),delete o.origin,z&&!s(G+'[tracking="true"]:visible',c.solo).not(r).length&&(s(e).unbind("mousemove."+X),z=S),this.blur(i)),after=s.proxy(function(){t?(BROWSER.ie&&r[0].style.removeAttribute("filter"),r.css("overflow",""),"string"==typeof c.autofocus&&s(this.options.show.autofocus,r).focus(),this.options.show.target.trigger("qtip-"+this.id+"-inactive")):r.css({display:"",visibility:"",opacity:"",left:"",top:""}),this._trigger(t?"visible":"hidden")},this),c.effect===S||g===S?(r[h](),after()):s.isFunction(c.effect)?(r.stop(1,1),c.effect.call(r,this),r.queue("fx",function(t){after(),t()})):r.fadeTo(90,t?1:0,after),t&&c.target.trigger("qtip-"+this.id+"-inactive"),this)},j.show=function(t){return this.toggle(W,t)},j.hide=function(t){return this.toggle(S,t)},j.focus=function(t){if(!this.rendered||this.destroyed)return this;var e=s(G),i=this.tooltip,o=parseInt(i[0].style.zIndex,10),n=C.zindex+e.length;return i.hasClass(Q)||this._trigger("focus",[n],t)&&(o!==n&&(e.each(function(){this.style.zIndex>o&&(this.style.zIndex=this.style.zIndex-1)}),e.filter("."+Q).qtip("blur",t)),i.addClass(Q)[0].style.zIndex=n),this},j.blur=function(t){return!this.rendered||this.destroyed?this:(this.tooltip.removeClass(Q),this._trigger("blur",[this.tooltip.css("zIndex")],t),this)},j.disable=function(t){return this.destroyed?this:("boolean"!=typeof t&&(t=!(this.tooltip.hasClass(K)||this.disabled)),this.rendered&&this.tooltip.toggleClass(K,t).attr("aria-disabled",t),this.disabled=!!t,this)},j.enable=function(){return this.disable(S)},j._createButton=function(){var t=this,e=this.elements,i=e.tooltip,o=this.options.content.button,n="string"==typeof o,r=n?o:"Close tooltip";e.button&&e.button.remove(),e.button=o.jquery?o:s("",{"class":"qtip-close "+(this.options.style.widget?"":X+"-icon"),title:r,"aria-label":r}).prepend(s("",{"class":"ui-icon ui-icon-close",html:"×"})),e.button.appendTo(e.titlebar||i).attr("role","button").click(function(e){return i.hasClass(K)||t.hide(e),S})},j._updateButton=function(t){if(!this.rendered)return S;var e=this.elements.button;t?this._createButton():e.remove()},j._setWidget=function(){var t=this.options.style.widget,e=this.elements,i=e.tooltip,o=i.hasClass(K);i.removeClass(K),K=t?"ui-state-disabled":"qtip-disabled",i.toggleClass(K,o),i.toggleClass("ui-helper-reset "+d(),t).toggleClass(U,this.options.style.def&&!t),e.content&&e.content.toggleClass(d("content"),t),e.titlebar&&e.titlebar.toggleClass(d("header"),t),e.button&&e.button.toggleClass(X+"-icon",!t)},j._storeMouse=function(i){this.mouse={pageX:i.pageX,pageY:i.pageY,type:"mousemove",scrollX:t.pageXOffset||e.body.scrollLeft||e.documentElement.scrollLeft,scrollY:t.pageYOffset||e.body.scrollTop||e.documentElement.scrollTop}},j._bind=function(t,e,i,o){var n="."+this._id+(o||"");e.length&&t.bind((e.split?e:e.join(n+" "))+n,s.proxy(i,this))},j._trigger=function(t,e,i){var o=s.Event("tooltip"+t);return o.originalEvent=i&&s.extend({},i)||this.cache.event||E,this.triggering=W,this.tooltip.trigger(o,[this].concat(e||[])),this.triggering=S,!o.isDefaultPrevented()},j._assignEvents=function(){var i=this.options,n=i.position,r=this.tooltip,a=i.show.target,l=i.hide.target,h=n.container,c=n.viewport,d=s(e),m=(s(e.body),s(t)),v=i.show.event?s.trim(""+i.show.event).split(" "):[],y=i.hide.event?s.trim(""+i.hide.event).split(" "):[],b=[];this._bind(r,["mouseenter","mouseleave"],function(t){var e="mouseenter"===t.type;e&&this.focus(t),r.toggleClass(J,e)}),/mouse(out|leave)/i.test(i.hide.event)&&"window"===i.hide.leave&&this._bind(d,["mouseout","blur"],function(t){/select|option/.test(t.target.nodeName)||t.relatedTarget||this.hide(t)}),i.hide.fixed?(l=l.add(r),this._bind(r,"mouseover",function(){!this.tooltip.hasClass(K)&&clearTimeout(this.timers.hide)})):/mouse(over|enter)/i.test(i.show.event)&&this._bind(l,"mouseleave",function(){clearTimeout(this.timers.show)}),(""+i.hide.event).indexOf("unfocus")>-1&&this._bind(h.closest("html"),["mousedown","touchstart"],function(t){var e=s(t.target),i=this.rendered&&!this.tooltip.hasClass(K)&&this.tooltip[0].offsetWidth>0,o=e.parents(G).filter(this.tooltip[0]).length>0;e[0]===this.target[0]||e[0]===this.tooltip[0]||o||this.target.has(e[0]).length||!i||this.hide(t)}),"number"==typeof i.hide.inactive&&(a.bind("qtip-"+this.id+"-inactive",s.proxy(f,this)),this._bind(l.add(r),C.inactiveEvents,f,"-inactive")),y=s.map(y,function(t){var e=s.inArray(t,v);return e>-1&&l.add(a).length===l.length?(b.push(v.splice(e,1)[0]),o):t}),this._bind(a,v,p),this._bind(l,y,u),this._bind(a,b,function(t){(this.tooltip[0].offsetWidth>0?u:p).call(this,t)}),"number"==typeof i.hide.distance&&this._bind(a.add(r),"mousemove",function(t){var e=this.cache.origin||{},i=this.options.hide.distance,o=Math.abs;(o(t.pageX-e.pageX)>=i||o(t.pageY-e.pageY)>=i)&&this.hide(t)}),"mouse"===n.target&&(this._bind(a.add(r),"mousemove",this._storeMouse),i.hide.event&&this._bind(r,"mouseleave",function(t){!s(t.relatedTarget||t.target).closest(a[0]).length&&this.hide(t)}),n.adjust.mouse&&(i.hide.event&&this._bind(a,["mouseenter","mouseleave"],function(t){this.cache.onTarget="mouseenter"===t.type}),this._bind(d,"mousemove",function(t){this.rendered&&this.cache.onTarget&&!this.tooltip.hasClass(K)&&this.tooltip[0].offsetWidth>0&&this.reposition(t||this.mouse)}))),(n.adjust.resize||c.length)&&this._bind(s.event.special.resize?c:m,"resize",g),n.adjust.scroll&&this._bind(m.add(n.container),"scroll",g)},j._unassignEvents=function(){var i=[this.options.show.target[0],this.options.hide.target[0],this.rendered&&this.tooltip[0],this.options.position.container[0],this.options.position.viewport[0],this.options.position.container.closest("html")[0],t,e];this.rendered?s([]).pushStack(s.grep(i,function(t){return"object"==typeof t})).unbind("."+this._id):s(i[0]).unbind("."+this._id+"-create")},C=s.fn.qtip=function(t,e,i){var n=(""+t).toLowerCase(),r=E,a=s.makeArray(arguments).slice(1),h=a[a.length-1],c=this[0]?s.data(this[0],X):E;return!arguments.length&&c||"api"===n?c:"string"==typeof t?(this.each(function(){var t=s.data(this,X);if(!t)return W;if(h&&h.timeStamp&&(t.cache.event=h),"option"!==n&&"options"!==n||!e)t[n]&&t[n].apply(t,a);else{if(!s.isPlainObject(e)&&i===o)return r=t.get(e),S;t.set(e,i)}}),r!==E?r:this):"object"!=typeof t&&arguments.length?o:(c=l(s.extend(W,{},t)),C.bind.call(this,c,h))},C.bind=function(t,e){return this.each(function(i){function n(t){function e(){c.render("object"==typeof t||r.show.ready),a.show.add(a.hide).unbind(h)}return c.disabled?S:(c.cache.event=s.extend({},t),c.cache.target=t?s(t.target):[o],r.show.delay>0?(clearTimeout(c.timers.show),c.timers.show=setTimeout(e,r.show.delay),l.show!==l.hide&&a.hide.bind(l.hide,function(){clearTimeout(c.timers.show)})):e(),o)}var r,a,l,h,c,d;return d=s.isArray(t.id)?t.id[i]:t.id,d=!d||d===S||1>d.length||H[d]?C.nextid++:H[d]=d,h=".qtip-"+d+"-create",c=m(s(this),d,t),c===S?W:(r=c.options,s.each(N,function(){"initialize"===this.initialize&&this(c)}),a={show:r.show.target,hide:r.hide.target},l={show:s.trim(""+r.show.event).replace(/ /g,h+" ")+h,hide:s.trim(""+r.hide.event).replace(/ /g,h+" ")+h},/mouse(over|enter)/i.test(l.show)&&!/mouse(out|leave)/i.test(l.hide)&&(l.hide+=" mouseleave"+h),a.show.bind("mousemove"+h,function(t){c._storeMouse(t),c.cache.onTarget=W}),a.show.bind(l.show,n),(r.show.ready||r.prerender)&&n(e),o)})},s.each({attr:function(t,e){if(this.length){var i=this[0],o="title",n=s.data(i,"qtip");if(t===o&&n&&"object"==typeof n&&n.options.suppress)return 2>arguments.length?s.attr(i,te):(n&&n.options.content.attr===o&&n.cache.attr&&n.set("content.text",e),this.attr(te,e)) -}return s.fn["attr"+Z].apply(this,arguments)},clone:function(t){var e=(s([]),s.fn["clone"+Z].apply(this,arguments));return t||e.filter("["+te+"]").attr("title",function(){return s.attr(this,te)}).removeAttr(te),e}},function(t,e){if(!e||s.fn[t+Z])return W;var i=s.fn[t+Z]=s.fn[t];s.fn[t]=function(){return e.apply(this,arguments)||i.apply(this,arguments)}}),s.ui||(s["cleanData"+Z]=s.cleanData,s.cleanData=function(t){for(var e,i=0;(e=s(t[i])).length&&e.attr($);i++)try{e.triggerHandler("removeqtip")}catch(o){}s["cleanData"+Z](t)}),C.version="2.0.1-83-",C.nextid=0,C.inactiveEvents="click dblclick mousedown mouseup mousemove mouseleave mouseenter".split(" "),C.zindex=15e3,C.defaults={prerender:S,id:S,overwrite:W,suppress:W,content:{text:W,attr:"title",title:S,button:S},position:{my:"top left",at:"bottom right",target:S,container:S,viewport:S,adjust:{x:0,y:0,mouse:W,scroll:W,resize:W,method:"flipinvert flipinvert"},effect:function(t,e){s(this).animate(e,{duration:200,queue:S})}},show:{target:S,event:"mouseenter",effect:W,delay:90,solo:S,ready:S,autofocus:S},hide:{target:S,event:"mouseleave",effect:W,delay:0,fixed:S,inactive:S,leave:"window",distance:S},style:{classes:"",widget:S,width:S,height:S,def:W},events:{render:E,move:E,show:E,hide:E,toggle:E,visible:E,hidden:E,focus:E,blur:E}};var se,ne,re=".qtip-tip",ae="margin",le="border",he="color",ce="background-color",de="transparent",pe=" !important",ue=!!e.createElement("canvas").getContext,fe=/rgba?\(0, 0, 0(, 0)?\)|transparent|#123456/i;if(s.curCSS){var ge={},me=["Webkit","O","Moz","ms"];ne=function(t,e){var i,s,n,r=e.charAt(0).toUpperCase()+e.slice(1),a=(e+" "+me.join(r+" ")+r).split(" ");if(ge[e])return t.css(ge[e]);for(n in a)if(i=a[n],(s=t.css(i))!==o)return ge[e]=i,s}}else ne=function(t,e){return t.css(e)};ue||(createVML=function(t,e,i){return"'}),se=N.tip=function(t){return new x(t)},se.initialize="render",se.sanitize=function(t){var e,i=t.style;i&&"tip"in i&&(e=t.style.tip,"object"!=typeof e&&(t.style.tip={corner:e}),/string|boolean/i.test(typeof e.corner)||(e.corner=W),"number"!=typeof e.width&&delete e.width,"number"!=typeof e.height&&delete e.height,"number"!=typeof e.border&&e.border!==W&&delete e.border,"number"!=typeof e.offset&&delete e.offset)},M.tip={"^position.my|style.tip.(corner|mimic|border)$":function(){!this.init()&&this.destroy(),this.qtip.reposition()},"^style.tip.(height|width)$":function(t){this.size=size=[t.width,t.height],this.create(),this.update(),this.qtip.reposition()},"^content.title|style.(classes|widget)$":function(){this.update()}},s.extend(W,C.defaults,{style:{tip:{corner:W,mimic:S,width:6,height:6,border:W,offset:0}}});var ve,ye,be="qtip-modal",we="."+be;ye=function(){function i(t){if(s.expr[":"].focusable)return s.expr[":"].focusable;var e,i,o,n=!isNaN(s.attr(t,"tabindex")),r=t.nodeName&&t.nodeName.toLowerCase();return"area"===r?(e=t.parentNode,i=e.name,t.href&&i&&"map"===e.nodeName.toLowerCase()?(o=s("img[usemap=#"+i+"]")[0],!!o&&o.is(":visible")):!1):/input|select|textarea|button|object/.test(r)?!t.disabled:"a"===r?t.href||n:n}function o(t){1>d.length&&t.length?t.not("body").blur():d.first().focus()}function n(t){if(h.is(":visible")){var e,i=s(t.target),n=r.tooltip,l=i.closest(G);e=1>l.length?S:parseInt(l[0].style.zIndex,10)>parseInt(n[0].style.zIndex,10),e||i.closest(G)[0]===n[0]||o(i),a=t.target===d[d.length-1]}}var r,a,l,h,c=this,d={};s.extend(c,{init:function(){function i(){var t=s(this);h.css({height:t.height(),width:t.width()})}return h=c.elem=s("
",{id:"qtip-overlay",html:"
",mousedown:function(){return S}}).hide(),s(t).bind("resize"+we,i),i(),s(e.body).bind("focusin"+we,n),s(e).bind("keydown"+we,function(t){r&&r.options.show.modal.escape&&27===t.keyCode&&r.hide(t)}),h.bind("click"+we,function(t){r&&r.options.show.modal.blur&&r.hide(t)}),c},update:function(t){r=t,d=t.options.show.modal.stealfocus!==S?t.tooltip.find("*").filter(function(){return i(this)}):[]},toggle:function(t,i,n){var a=(s(e.body),t.tooltip),d=t.options.show.modal,p=d.effect,u=i?"show":"hide",f=h.is(":visible"),g=s(we).filter(":visible:not(:animated)").not(a);return c.update(t),i&&d.stealfocus!==S&&o(s(":focus")),h.toggleClass("blurs",d.blur),i&&h.css({left:0,top:0}).appendTo(e.body),h.is(":animated")&&f===i&&l!==S||!i&&g.length?c:(h.stop(W,S),s.isFunction(p)?p.call(h,i):p===S?h[u]():h.fadeTo(parseInt(n,10)||90,i?1:0,function(){i||h.hide()}),i||h.queue(function(t){h.css({left:"",top:""}),s(we).length||h.detach(),t()}),l=i,r.destroyed&&(r=E),c)}}),c.init()},ye=new ye,ve=N.modal=function(t){return new _(t)},ve.sanitize=function(t){t.show&&("object"!=typeof t.show.modal?t.show.modal={on:!!t.show.modal}:t.show.modal.on===o&&(t.show.modal.on=W))},ve.zindex=C.zindex-200,ve.initialize="render",M.modal={"^show.modal.(on|blur)$":function(){this.destroy(),this.init(),this.qtip.elems.overlay.toggle(this.qtip.tooltip[0].offsetWidth>0)}},s.extend(W,C.defaults,{show:{modal:{on:S,effect:W,blur:W,stealfocus:W,escape:W}}}),N.viewport=function(i,o,s,n,r,a,l){function h(t,e,i,s,n,r,a,l,h){var c=o[n],p=g[t],u=m[t],f=i===D,v=-_.offset[n]+x.offset[n]+x["scroll"+n],y=p===n?h:p===r?-h:-h/2,b=u===n?l:u===r?-l:-l/2,w=C&&C.size?C.size[a]||0:0,T=C&&C.corner&&C.corner.precedance===t&&!f?w:0,j=v-c+T,q=c+h-x[a]-v+T,M=y-(g.precedance===t||p===g[e]?b:0)-(u===F?l/2:0);return f?(T=C&&C.corner&&C.corner.precedance===e?w:0,M=(p===n?1:-1)*y-T,o[n]+=j>0?j:q>0?-q:0,o[n]=Math.max(-_.offset[n]+x.offset[n]+(T&&C.corner[t]===F?C.offset:0),c-M,Math.min(Math.max(-_.offset[n]+x.offset[n]+x[a],c+M),o[n]))):(s*=i===P?2:0,j>0&&(p!==n||q>0)?(o[n]-=M+s,d.invert(t,n)):q>0&&(p!==r||j>0)&&(o[n]-=(p===F?-M:M)+s,d.invert(t,r)),v>o[n]&&-o[n]>q&&(o[n]=c,d=g.clone())),o[n]-c}var c,d,p,u=s.target,f=i.elements.tooltip,g=s.my,m=s.at,v=s.adjust,y=v.method.split(" "),b=y[0],w=y[1]||y[0],x=s.viewport,_=s.container,T=i.cache,C=i.plugins.tip,j={left:0,top:0};return x.jquery&&u[0]!==t&&u[0]!==e.body&&"none"!==v.method?(c="fixed"===f.css("position"),x={elem:x,width:x[0]===t?x.width():x.outerWidth(S),height:x[0]===t?x.height():x.outerHeight(S),scrollleft:c?0:x.scrollLeft(),scrolltop:c?0:x.scrollTop(),offset:x.offset()||{left:0,top:0}},_={elem:_,scrollLeft:_.scrollLeft(),scrollTop:_.scrollTop(),offset:_.offset()||{left:0,top:0}},("shift"!==b||"shift"!==w)&&(d=g.clone()),j={left:"none"!==b?h(O,R,b,v.x,L,A,k,n,a):0,top:"none"!==w?h(R,O,w,v.y,B,V,I,r,l):0},d&&T.lastClass!==(p=X+"-pos-"+d.abbrev())&&f.removeClass(i.cache.lastClass).addClass(i.cache.lastClass=p),j):j},N.polys={polygon:function(t,e){var i,o,s,n={width:0,height:0,position:{top:1e10,right:0,bottom:0,left:1e10},adjustable:S},r=0,a=[],l=1,h=1,c=0,d=0;for(r=t.length;r--;)i=[parseInt(t[--r],10),parseInt(t[r+1],10)],i[0]>n.position.right&&(n.position.right=i[0]),i[0]n.position.bottom&&(n.position.bottom=i[1]),i[1]0&&s>0&&l>0&&h>0;)for(o=Math.floor(o/2),s=Math.floor(s/2),e.x===L?l=o:e.x===A?l=n.width-o:l+=Math.floor(o/2),e.y===B?h=s:e.y===V?h=n.height-s:h+=Math.floor(s/2),r=a.length;r--&&!(2>a.length);)c=a[r][0]-n.position.left,d=a[r][1]-n.position.top,(e.x===L&&c>=l||e.x===A&&l>=c||e.x===F&&(l>c||c>n.width-l)||e.y===B&&d>=h||e.y===V&&h>=d||e.y===F&&(h>d||d>n.height-h))&&a.splice(r,1);n.position={left:a[0][0],top:a[0][1]}}return n},rect:function(t,e,i,o){return{width:Math.abs(i-t),height:Math.abs(o-e),position:{left:Math.min(t,i),top:Math.min(e,o)}}},_angles:{tc:1.5,tr:7/4,tl:5/4,bc:.5,br:.25,bl:.75,rc:2,lc:1,c:0},ellipse:function(t,e,i,o,s){var n=N.polys._angles[s.abbrev()],r=i*Math.cos(n*Math.PI),a=o*Math.sin(n*Math.PI);return{width:2*i-Math.abs(r),height:2*o-Math.abs(a),position:{left:t+r,top:e+a},adjustable:S}},circle:function(t,e,i,o){return N.polys.ellipse(t,e,i,i,o)}},N.svg=function(t,o,n){for(var r,a,l=s(e),h=o[0],c=S;!h.getBBox;)h=h.parentNode;if(!h.getBBox||!h.parentNode)return S;switch(h.nodeName){case"rect":r=N.svg.toPixel(h,h.x.baseVal.value,h.y.baseVal.value),a=N.svg.toPixel(h,h.x.baseVal.value+h.width.baseVal.value,h.y.baseVal.value+h.height.baseVal.value),c=N.polys.rect(r[0],r[1],a[0],a[1],n);break;case"ellipse":case"circle":r=N.svg.toPixel(h,h.cx.baseVal.value,h.cy.baseVal.value),c=N.polys.ellipse(r[0],r[1],(h.rx||h.r).baseVal.value,(h.ry||h.r).baseVal.value,n);break;case"line":case"polygon":case"polyline":for(points=h.points||[{x:h.x1.baseVal.value,y:h.y1.baseVal.value},{x:h.x2.baseVal.value,y:h.y2.baseVal.value}],c=[],i=-1,len=points.numberOfItems||points.length;len>++i;)next=points.getItem?points.getItem(i):points[i],c.push.apply(c,N.svg.toPixel(h,next.x,next.y));c=N.polys.polygon(c,n);break;default:return S}return c.position.left+=l.scrollLeft(),c.position.top+=l.scrollTop(),c},N.svg.toPixel=function(t,e,i){var o,s,n=t.getScreenCTM(),r=t.farthestViewportElement||t;return r.createSVGPoint?(s=r.createSVGPoint(),s.x=e,s.y=i,o=s.matrixTransform(n),[o.x,o.y]):S},N.imagemap=function(t,e,i){e.jquery||(e=s(e));var o,n,r,a=e.attr("shape").toLowerCase().replace("poly","polygon"),l=s('img[usemap="#'+e.parent("map").attr("name")+'"]'),h=e.attr("coords"),c=h.split(",");if(!l.length)return S;if("polygon"===a)result=N.polys.polygon(c,i);else{if(!N.polys[a])return S;for(r=-1,len=c.length,n=[];len>++r;)n.push(parseInt(c[r],10));result=N.polys[a].apply(this,n.concat(i))}return o=l.offset(),o.left+=Math.ceil((l.outerWidth(S)-l.width())/2),o.top+=Math.ceil((l.outerHeight(S)-l.height())/2),result.position.left+=o.left,result.position.top+=o.top,result};var xe;xe=BROWSER.ie6=function(t){return 6===BROWSER.ie?new T(t):S},xe.initialize="render",M.ie6={"^content|style$":function(){this.redraw()}}})})(window,document); - -(function(c,q){var m="data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///ywAAAAAAQABAAACAUwAOw==";c.fn.imagesLoaded=function(f){function n(){var b=c(j),a=c(h);d&&(h.length?d.reject(e,b,a):d.resolve(e));c.isFunction(f)&&f.call(g,e,b,a)}function p(b){k(b.target,"error"===b.type)}function k(b,a){b.src===m||-1!==c.inArray(b,l)||(l.push(b),a?h.push(b):j.push(b),c.data(b,"imagesLoaded",{isBroken:a,src:b.src}),r&&d.notifyWith(c(b),[a,e,c(j),c(h)]),e.length===l.length&&(setTimeout(n),e.unbind(".imagesLoaded", -p)))}var g=this,d=c.isFunction(c.Deferred)?c.Deferred():0,r=c.isFunction(d.notify),e=g.find("img").add(g.filter("img")),l=[],j=[],h=[];c.isPlainObject(f)&&c.each(f,function(b,a){if("callback"===b)f=a;else if(d)d[b](a)});e.length?e.bind("load.imagesLoaded error.imagesLoaded",p).each(function(b,a){var d=a.src,e=c.data(a,"imagesLoaded");if(e&&e.src===d)k(a,e.isBroken);else if(a.complete&&a.naturalWidth!==q)k(a,0===a.naturalWidth||0===a.naturalHeight);else if(a.readyState||a.complete)a.src=m,a.src=d}): -n();return d?d.promise(g):g}})(jQuery); diff --git a/vendor/jquery.sha1.js b/vendor/jquery.sha1.js deleted file mode 100644 index 94701bc..0000000 --- a/vendor/jquery.sha1.js +++ /dev/null @@ -1,170 +0,0 @@ - - /** - * jQuery SHA1 hash algorithm function - * - * - * Calculate the sha1 hash of a String - * String $.sha1 ( String str ) - * - * - * Calculates the sha1 hash of str using the US Secure Hash Algorithm 1. - * SHA-1 the Secure Hash Algorithm (SHA) was developed by NIST and is specified in the Secure Hash Standard (SHS, FIPS 180). - * This script is used to process variable length message into a fixed-length output using the SHA-1 algorithm. It is fully compatible with UTF-8 encoding. - * If you plan using UTF-8 encoding in your project don't forget to set the page encoding to UTF-8 (Content-Type meta tag). - * This function orginally get from the WebToolkit and rewrite for using as the jQuery plugin. - * - * Example - * Code - * - * $.sha1("I'm Persian."); - * - * Result - * - * "1d302f9dc925d62fc859055999d2052e274513ed" - * - * - * @alias Muhammad Hussein Fattahizadeh < muhammad [AT] semnanweb [DOT] com > - * @link http://www.semnanweb.com/jquery-plugin/sha1.html - * @see http://www.webtoolkit.info/ - * @license http://www.gnu.org/licenses/gpl.html [GNU General Public License] - * @param {jQuery} {sha1:function(string)) - * @return string - */ - - (function($){ - - var rotateLeft = function(lValue, iShiftBits) { - return (lValue << iShiftBits) | (lValue >>> (32 - iShiftBits)); - } - - var lsbHex = function(value) { - var string = ""; - var i; - var vh; - var vl; - for(i = 0;i <= 6;i += 2) { - vh = (value>>>(i * 4 + 4))&0x0f; - vl = (value>>>(i*4))&0x0f; - string += vh.toString(16) + vl.toString(16); - } - return string; - }; - - var cvtHex = function(value) { - var string = ""; - var i; - var v; - for(i = 7;i >= 0;i--) { - v = (value>>>(i * 4))&0x0f; - string += v.toString(16); - } - return string; - }; - - var uTF8Encode = function(string) { - string = string.replace(/\x0d\x0a/g, "\x0a"); - var output = ""; - for (var n = 0; n < string.length; n++) { - var c = string.charCodeAt(n); - if (c < 128) { - output += String.fromCharCode(c); - } else if ((c > 127) && (c < 2048)) { - output += String.fromCharCode((c >> 6) | 192); - output += String.fromCharCode((c & 63) | 128); - } else { - output += String.fromCharCode((c >> 12) | 224); - output += String.fromCharCode(((c >> 6) & 63) | 128); - output += String.fromCharCode((c & 63) | 128); - } - } - return output; - }; - - $.extend({ - sha1: function(string) { - var blockstart; - var i, j; - var W = new Array(80); - var H0 = 0x67452301; - var H1 = 0xEFCDAB89; - var H2 = 0x98BADCFE; - var H3 = 0x10325476; - var H4 = 0xC3D2E1F0; - var A, B, C, D, E; - var tempValue; - string = uTF8Encode(string); - var stringLength = string.length; - var wordArray = new Array(); - for(i = 0;i < stringLength - 3;i += 4) { - j = string.charCodeAt(i)<<24 | string.charCodeAt(i + 1)<<16 | string.charCodeAt(i + 2)<<8 | string.charCodeAt(i + 3); - wordArray.push(j); - } - switch(stringLength % 4) { - case 0: - i = 0x080000000; - break; - case 1: - i = string.charCodeAt(stringLength - 1)<<24 | 0x0800000; - break; - case 2: - i = string.charCodeAt(stringLength - 2)<<24 | string.charCodeAt(stringLength - 1)<<16 | 0x08000; - break; - case 3: - i = string.charCodeAt(stringLength - 3)<<24 | string.charCodeAt(stringLength - 2)<<16 | string.charCodeAt(stringLength - 1)<<8 | 0x80; - break; - } - wordArray.push(i); - while((wordArray.length % 16) != 14 ) wordArray.push(0); - wordArray.push(stringLength>>>29); - wordArray.push((stringLength<<3)&0x0ffffffff); - for(blockstart = 0;blockstart < wordArray.length;blockstart += 16) { - for(i = 0;i < 16;i++) W[i] = wordArray[blockstart+i]; - for(i = 16;i <= 79;i++) W[i] = rotateLeft(W[i-3] ^ W[i-8] ^ W[i-14] ^ W[i-16], 1); - A = H0; - B = H1; - C = H2; - D = H3; - E = H4; - for(i = 0;i <= 19;i++) { - tempValue = (rotateLeft(A, 5) + ((B&C) | (~B&D)) + E + W[i] + 0x5A827999) & 0x0ffffffff; - E = D; - D = C; - C = rotateLeft(B, 30); - B = A; - A = tempValue; - } - for(i = 20;i <= 39;i++) { - tempValue = (rotateLeft(A, 5) + (B ^ C ^ D) + E + W[i] + 0x6ED9EBA1) & 0x0ffffffff; - E = D; - D = C; - C = rotateLeft(B, 30); - B = A; - A = tempValue; - } - for(i = 40;i <= 59;i++) { - tempValue = (rotateLeft(A, 5) + ((B&C) | (B&D) | (C&D)) + E + W[i] + 0x8F1BBCDC) & 0x0ffffffff; - E = D; - D = C; - C = rotateLeft(B, 30); - B = A; - A = tempValue; - } - for(i = 60;i <= 79;i++) { - tempValue = (rotateLeft(A, 5) + (B ^ C ^ D) + E + W[i] + 0xCA62C1D6) & 0x0ffffffff; - E = D; - D = C; - C = rotateLeft(B, 30); - B = A; - A = tempValue; - } - H0 = (H0 + A) & 0x0ffffffff; - H1 = (H1 + B) & 0x0ffffffff; - H2 = (H2 + C) & 0x0ffffffff; - H3 = (H3 + D) & 0x0ffffffff; - H4 = (H4 + E) & 0x0ffffffff; - } - var tempValue = cvtHex(H0) + cvtHex(H1) + cvtHex(H2) + cvtHex(H3) + cvtHex(H4); - return tempValue.toLowerCase(); - } - }); - })(jQuery); \ No newline at end of file diff --git a/vendor/opencga-1.0.0.js b/vendor/opencga-1.0.0.js deleted file mode 100644 index d5b9343..0000000 --- a/vendor/opencga-1.0.0.js +++ /dev/null @@ -1,5841 +0,0 @@ -/*! Genome Viewer - v1.0.2 - 2013-09-23 -* http://https://github.com/opencb-bigdata-viz/js-common-libs/ -* Copyright (c) 2013 Licensed GPLv2 */ -function UserListWidget (args){ - var _this = this; - this.id = "UserListWidget_"+ Math.round(Math.random()*10000000); - this.data = new Array(); - - this.args = new Object(); - this.timeout = 4000; - this.pagedViewList = args.pagedViewList; - this.suiteId=-1; - this.tools = []; - - if (args != null){ - if (args.timeout != null && args.timeout > 4000){ - this.timeout = args.timeout; - } - if (args.suiteId != null){ - this.suiteId = args.suiteId; - } - if (args.tools != null){ - this.tools = args.tools; - } - } -// console.warn(this.id+' Minimum period is 4000 milliseconds, smaller values will be ignored'); -}; - -UserListWidget.prototype.draw = function (){ - var _this = this; - - this.getResponse(); - this.interval = setInterval(function () {_this.getResponse(); }, this.timeout); -}; - - -UserListWidget.prototype.getData = function (){ - return this.data; -}; - -UserListWidget.prototype.getCount = function() { - return this.data.length; -}; - -UserListWidget.prototype.getResponse = function(){ - /**Que cada clase hija llame a la funcion de WumDataAdapter que necesite**/ - throw "abstract method must be implemented in child classes"; -}; - -UserListWidget.prototype.render = function (data){ - /**Que cada clase hija renderize como quiera los datos, ya sea con sencha o con sencho**/ - throw "abstract method must be implemented in child classes"; -}; - -function GenericFormPanel(analysis) { - _.extend(this, Backbone.Events); - - this.analysis = analysis; - this.form = null; - this.paramsWS = {}; - this.opencgaManager = new OpencgaManager(); - this.panelId = this.analysis + "-FormPanel"; - this.testing = false; - - this.opencgaManager.onRunAnalysis.addEventListener(function (sender, response) { - if (response.data.indexOf("ERROR") != -1) { - Ext.Msg.show({ - title: "Error", - msg: response.data, - buttons: Ext.Msg.OK, - icon: Ext.Msg.ERROR - }); - } - else console.log(response.data); - }); - - //events attachments - this.on(this.handlers); - -} - -GenericFormPanel.prototype.draw = function (args) { - var _this = this; - if (this.panel == null) { - if (args != null && args.type == "window") { - this.panel = Ext.create('Ext.ux.Window', { - title: args.title || "", - resizable: args.resizable || false, - width: args.width || 500, - height: args.height, - overflowY: 'auto', - taskbar: args.taskbar, - closable:false, - items: this.getForm() - }).show(); - } - else { - this.panel = Ext.create('Ext.panel.Panel', { - id: this.panelId, - title: args.title, - closable: true, - defaults: {margin: 30}, - autoScroll: true, - items: this.getForm(), - border:0, - listeners:{ - beforeclose:function(){ - console.log('closing'); - args.tabpanel.remove(_this.panel,false); - return false; - } - } - }); - } - } - return this.panel; -}; - -GenericFormPanel.prototype.getForm = function () { - if (this.form == null) { - var items = this.getPanels(); - items.push(this.getJobPanel()); - items.push(this.getRunButton()); - - this.form = Ext.create('Ext.form.Panel', { - border: 0, - bodyPadding: '5', - width: '95%', - layout: 'vbox', - items: items - }); - } - - return this.form; -}; - -GenericFormPanel.prototype.getPanels = function () { - // To be implemented in inner class -}; - -GenericFormPanel.prototype.getJobPanel = function () { - var _this = this; - var jobNameField = Ext.create('Ext.form.field.Text', { - id: this.id + "jobname", - name: "jobname", - fieldLabel: 'Name', - emptyText: "Job name", - allowBlank: false, - margin: '5 0 0 5' - }); - - var jobDescriptionField = Ext.create('Ext.form.field.TextArea', { - id: this.id + "jobdescription", - name: "jobdescription", - fieldLabel: 'Description', - emptyText: "Description", - margin: '5 0 0 5' - }); - -// var bucketList= Ext.create('Ext.data.Store', { -// fields: ['value', 'name'], -// data : [ -// {"value":"default", "name":"Default"} -// ] -// }); -// var jobDestinationBucket = this.createCombobox("jobdestinationbucket", "Destination bucket", bucketList, 0, 100); - var jobFolder = this.createOpencgaBrowserCmp({ - id: Utils.genId('jobFolder'), - fieldLabel: 'Folder:', - dataParamName: 'outdir', - mode: 'folderSelection', - btnMargin: '0 0 0 66', - defaultFileLabel: 'Default job folder', - allowBlank: true - }); - - var jobPanel = Ext.create('Ext.panel.Panel', { - title: 'Job', - border: true, - bodyPadding: "5", - margin: "0 0 5 0", - width: '99%', - buttonAlign: 'center', - items: [jobNameField, jobDescriptionField, jobFolder] - }); - - return jobPanel; -}; - -GenericFormPanel.prototype.getRunButton = function () { - var _this = this; - return Ext.create('Ext.button.Button', { - text: 'Run', - width: 300, - height: 35, - disabled: true, - formBind: true, // only enabled if the form is valid - handler: function () { - var formParams = _this.getForm().getForm().getValues(); - for (var param in formParams) { - _this.paramsWS[param] = formParams[param]; - } - _this.beforeRun(); - _this.run(); - } - }); -}; - -GenericFormPanel.prototype.setAccountParams = function () { - this.paramsWS["sessionid"] = $.cookie('bioinfo_sid'); - this.paramsWS["accountid"] = $.cookie('bioinfo_account'); -}; - -GenericFormPanel.prototype.beforeRun = function () { - // To be implemented in inner class - -}; - -GenericFormPanel.prototype.run = function () { - this.setAccountParams(); - (this.paramsWS['outdir'] === '') ? delete this.paramsWS['outdir'] : console.log(this.paramsWS['outdir']); - - if (!this.testing) { - this.opencgaManager.runAnalysis(this.analysis, this.paramsWS); - } - - Ext.example.msg('Job Launched', 'It will be listed soon'); - //debug - console.log(this.paramsWS); - this.trigger('after:run', {sender: this}); -}; - - -///////////////////////////////////////// -///////////////////////////////////////// -//Functions to create sencha components// -///////////////////////////////////////// -///////////////////////////////////////// -GenericFormPanel.prototype.createCombobox = function (name, label, data, defaultValue, labelWidth, margin) { - return Ext.create('Ext.form.field.ComboBox', { - id: name, - name: name, - fieldLabel: label, - store: data, - queryMode: 'local', - displayField: 'name', - valueField: 'value', - value: data.getAt(defaultValue).get('value'), - labelWidth: labelWidth, - margin: margin, - editable: false, - allowBlank: false - }); -}; - -GenericFormPanel.prototype.createCheckBox = function (name, label, checked, margin, disabled, handler) { - return Ext.create('Ext.form.field.Checkbox', { - id: name, - name: name, - boxLabel: label, - checked: (checked || false), - disabled: disabled, - margin: (margin || '0 0 0 0') - }); -}; - -GenericFormPanel.prototype.createRadio = function (name, group, checked, hidden) { - var cb = Ext.create('Ext.form.field.Radio', { - id: name + "_" + this.id, - boxLabel: name, - inputValue: name, - checked: checked, - name: group, - hidden: hidden - }); - return cb; -}; - -GenericFormPanel.prototype.createLabel = function (text, margin) { - var label = Ext.create('Ext.form.Label', { - id: text + "_" + this.id, - margin: (margin || "15 0 0 0"), - html: '' + text + '' - }); - return label; -}; -GenericFormPanel.prototype.createTextFields = function (name) { - var tb = Ext.create('Ext.form.field.Text', { - id: name + "_" + this.id, - fieldLabel: name, - name: name -// allowBlank: false - }); - return tb; -}; - - -GenericFormPanel.prototype.createOpencgaBrowserCmp = function (args) {//fieldLabel, dataParamName, mode, btnMargin, defaultFileLabel - var _this = this; - var btnBrowse = Ext.create('Ext.button.Button', { - text: 'Browse...', - margin: args.btnMargin || '0 0 0 10', - handler: function () { - if (args.beforeClick != null) { - args.beforeClick(args); - } - var listenerIdx = _this.opencgaBrowserWidget.onSelect.addEventListener(function (sender, response) { - - var label = response.bucketId + '/' + response.id; - var value = response.bucketId + ':' + response.id.replace(/\//g, ":"); - fileSelectedLabel.setText('' + label + '', false); - hiddenField.setValue(value);//this is send to the ws - - _this.opencgaBrowserWidget.onSelect.removeEventListener(listenerIdx); - }); - _this.opencgaBrowserWidget.draw({mode: args.mode, allowedTypes: args.allowedTypes}); - } - }); - - var fileSelectedLabel = Ext.create('Ext.form.Label', { - id: args.id, - text: args.defaultFileLabel || "No file selected", - margin: '5 0 0 15' - }); - - //not shown, just for validation - var hiddenField = Ext.create('Ext.form.field.Text', { - id: args.id + 'hidden', - name: args.dataParamName, - hidden: true, - allowBlank: (args.allowBlank || false), - margin: '5 0 0 15' - }); - - return Ext.create('Ext.container.Container', { -// bodyPadding:10, -// defaults:{margin:'5 0 0 5'}, - margin: '5 0 5 0', - items: [ - {xtype: 'label', text: args.fieldLabel, margin: '5 0 0 5'}, - btnBrowse, - fileSelectedLabel, - hiddenField - ] - }); -}; - -function OpencgaManager(host){ - - this.host = OPENCGA_HOST || this.host; - this.host = host || this.host; - - //deprecated - //this.host = "http://bioinfo.cipf.es/dqs-naranjoma-ws/rest"; - //if(window.location.host.indexOf("ralonso")!=-1){ - //this.host = "http://ralonso:8080/dqs-naranjoma-ws/rest"; - //} - - /** Events **/ - /*ACCOUNT*/ - this.onGetAccountInfo = new Event(this); - this.onLogin = new Event(this); - this.onCreateAccount = new Event(this); - this.onResetPassword = new Event(this); - this.onChangePassword = new Event(this); - this.onChangeEmail = new Event(this); - this.onLogout = new Event(this); - - /*Bucket*/ - this.onCreateBucket = new Event(this); - this.onRefreshBucket = new Event(this); - this.onRenameBucket = new Event(this); - this.onUploadObjectToBucket = new Event(this); - this.onDeleteObjectFromBucket = new Event(this); - this.onCreateDirectory = new Event(this); - - /*Jobs*/ - this.onJobStatus = new Event(this); - this.onJobResult = new Event(this); - this.onTable = new Event(this); - this.onPoll = new Event(this); - this.onDeleteJob = new Event(this); - - /*ANALYSIS*/ - this.onRunAnalysis = new Event(this); - this.onIndexer = new Event(this); - this.onIndexerStatus = new Event(this); - - /*BAM*/ - this.onBamList = new Event(this); - this.onGetAccountInfo = new Event(this); - this.onRegion = new Event(this); - - - this.onLocalFileList = new Event(this); - - this.onError = new Event(this); -} - -OpencgaManager.prototype = { - host : 'http://ws.bioinfo.cipf.es/opencga/rest', - getHost : function(){ - return this.host; - }, - setHost : function(hostUrl){ - this.host = hostUrl; - }, - doGet : function (url, successCallback, errorCallback){ - $.ajax({ - type: "GET", - url: url, - cache: false, - success: successCallback, - error: errorCallback - }); - }, - doPost : function (url, formData, successCallback, errorCallback){ - $.ajax({ - type: "POST", - url: url, - data: formData, - processData: false, // tell jQuery not to process the data - contentType: false, // tell jQuery not to set contentType - success: successCallback, - error: errorCallback - }); - }, - getQuery : function(paramsWS){ - var query = ""; - for ( var key in paramsWS) { - if(paramsWS[key]!=null) - query+=key+'='+paramsWS[key]+'&'; - } - if(query!='') - query = "?"+query.slice(0,-1); - return query; - }, - - - getAccountUrl : function(accountId){ - return this.getHost()+'/account/'+accountId; - }, - getStorageUrl : function(accountId){ - return this.getAccountUrl(accountId)+'/storage'; - }, - getAdminProfileUrl : function(accountId){ - return this.getAccountUrl(accountId)+'/admin/profile'; - }, - getAdminBucketUrl : function(accountId,bucketId){ - return this.getAccountUrl(accountId)+'/admin/bucket/'+bucketId; - }, - getAdminProjectUrl : function(accountId,projectId){ - return this.getAccountUrl(accountId)+'/admin/project/'+projectId; - }, - getBucketUrl : function(accountId, bucketId){ - return this.getStorageUrl(accountId)+'/'+bucketId; - }, - getObjectUrl : function(accountId, bucketId, objectId){ - return this.getStorageUrl(accountId)+'/'+bucketId+'/'+objectId; - }, - getAnalysisUrl : function(accountId, analysis){ - return this.getAccountUrl(accountId)+'/analysis/'+analysis; - }, - getJobAnalysisUrl : function(accountId, jobId){ - return this.getAccountUrl(accountId)+'/analysis/job/'+jobId; - }, - /*ACCOUNT METHODS*/ - createAccount : function (accountId, email, name, password, suiteId){ - var _this = this; - var queryParams = { - 'name':name, - 'email':email, - 'password':password, - 'suiteid':suiteId - }; - var url = this.getAccountUrl(accountId)+'/create'+this.getQuery(queryParams); - function success(data){ - _this.onCreateAccount.notify(data); - } - function error(data){ - console.log("ERROR: " + data); - } - - this.doGet(url, success, error); - // console.log(url); - }, - login : function(accountId, password, suiteId){ - var _this=this; - var queryParams = { - 'password':password, - 'suiteid':suiteId - }; - var url = this.getAccountUrl(accountId)+'/login'+this.getQuery(queryParams); - function success(data){ - if(data.indexOf("ERROR") == -1){ - _this.onLogin.notify(JSON.parse(data)); - }else{ - _this.onLogin.notify({errorMessage:data}); - } - } - function error(data){ - console.log("ERROR: " + data); - } - this.doGet(url, success, error); - }, - logout : function(accountId, sessionId){ - var _this=this; - var queryParams = { - 'sessionid':sessionId - }; - var url = this.getAccountUrl(accountId)+'/logout'+this.getQuery(queryParams); - function success(data){ - _this.onLogout.notify(data); - } - - function error(data){ - $.cookie('bioinfo_sid', null); - $.cookie('bioinfo_sid', null, {path: '/'}); - console.log("ERROR: " + data); - } - - this.doGet(url, success, error); - // console.log(url); - }, - getAccountInfo : function(accountId, sessionId, lastActivity){ - console.log(lastActivity) - var _this=this; - var queryParams = { - 'last_activity':lastActivity, - 'sessionid':sessionId - }; - var url = this.getAccountUrl(accountId)+'/info'+this.getQuery(queryParams); - function success(data){ - if(data.indexOf("ERROR") == -1){ - _this.onGetAccountInfo.notify(JSON.parse(data)); - }else{ - $.cookie('bioinfo_sid', null); - $.cookie('bioinfo_sid', null, {path: '/'}); - $.cookie('bioinfo_account',null); - $.cookie('bioinfo_account', null, {path: '/'}); - console.log(data); - } - } - function error(data){ - console.log("ERROR: " + data); - console.log(data); - } - this.doGet(url, success, error); -// console.log(url); - }, - changePassword : function(accountId, sessionId, old_password, new_password1, new_password2){ - var _this=this; - var queryParams = { - 'old_password':old_password, - 'new_password1':new_password1, - 'new_password2':new_password2, - 'sessionid':sessionId - }; - var url = this.getAdminProfileUrl(accountId)+'/change_password'+this.getQuery(queryParams); - function success(data){ - _this.onChangePassword.notify(data); - } - - function error(data){ - console.log("ERROR: " + data); - } - - this.doGet(url, success, error); - // console.log(url); - }, - resetPassword : function(accountId, email){ - var _this=this; - var queryParams = { - 'email':email - }; - var url = this.getAdminProfileUrl(accountId)+'/reset_password'+this.getQuery(queryParams); - function success(data){ - _this.onResetPassword.notify(data); - } - - function error(data){ - console.log("ERROR: " + data); - } - - this.doGet(url, success, error); - // console.log(url); - }, - changeEmail : function(accountId, sessionId, new_email){ - var _this=this; - var queryParams = { - 'new_email':new_email, - 'sessionid':sessionId - }; - var url = this.getAdminProfileUrl(accountId)+'/change_email'+this.getQuery(queryParams); - function success(data){ - _this.onChangeEmail.notify(data); - } - - function error(data){ - console.log("ERROR: " + data); - } - - this.doGet(url, success, error); - // console.log(url); - }, - - /* BUCKET METHODS */ - getBuckets : function(){ - return 'TODO'; - }, - - createBucket : function(bucketId, description, accountId, sessionId){ - var _this=this; - var queryParams = { - 'description':description, - 'sessionid':sessionId - }; - var url = this.getAdminBucketUrl(accountId,bucketId)+'/create'+this.getQuery(queryParams); - function success(data){ - _this.onCreateBucket.notify(data); - } - - function error(data){ - console.log("ERROR: " + data); - } - - this.doGet(url, success, error); - // console.log(url); - }, - - refreshBucket : function(accountId, bucketId, sessionId){ - var _this=this; - var queryParams = { - 'sessionid':sessionId - }; - var url = this.getAdminBucketUrl(accountId,bucketId)+'/refresh'+this.getQuery(queryParams); - function success(data){ - _this.onRefreshBucket.notify(data); - } - - function error(data){ - console.log("ERROR: " + data); - } - - this.doGet(url, success, error); - console.log(url); - }, - - renameBucket : function(accountId, bucketId, newBucketId, sessionId){ - var _this=this; - var queryParams = { - 'sessionid':sessionId - }; - var url = this.getAdminBucketUrl(accountId,bucketId)+'/rename/'+newBucketId+this.getQuery(queryParams); - function success(data){ - _this.onRenameBucket.notify(data); - } - - function error(data){ - console.log("ERROR: " + data); - } - - this.doGet(url, success, error); - console.log(url); - }, - deleteBucket : 'TODO', - shareBucket : 'TODO', - - uploadObjectToBucket : function(accountId, sessionId, bucketId, objectId, formData, parents){ - var _this=this; - var queryParams = { - 'parents':(parents || false), - 'sessionid':sessionId - }; - var url = this.getObjectUrl(accountId,bucketId,objectId)+'/upload'+this.getQuery(queryParams); - - function success(data){ - console.log(data); - _this.onUploadObjectToBucket.notify({status:"done",data:data}); - } - - function error(data){ - _this.onUploadObjectToBucket.notify({status:"fail",data:data}); - } - - this.doPost(url, formData, success, error); - // console.log(url); - }, - createDirectory : function(accountId, sessionId, bucketId, objectId, parents){ - objectId = objectId.replace(new RegExp("/", "gi"),":"); - var _this=this; - var queryParams = { - 'parents':(parents || false), - 'sessionid':sessionId - }; - var url = this.getObjectUrl(accountId,bucketId,objectId)+'/create_directory'+this.getQuery(queryParams); - function success(data){ - console.log(data); - _this.onCreateDirectory.notify(data); - } - function error(data){ - console.log("ERROR: " + data); - } - this.doGet(url, success, error); - }, - deleteObjectFromBucket : function(accountId, sessionId, bucketId, objectId){ - objectId = objectId.replace(new RegExp("/", "gi"),":"); - var _this=this; - var queryParams = { - 'sessionid':sessionId - }; - var url = this.getObjectUrl(accountId,bucketId,objectId)+'/delete'+this.getQuery(queryParams); - - function success(data){ - console.log(data); - _this.onDeleteObjectFromBucket.notify(data); - } - - function error(data){ - console.log("ERROR: " + data); - } - - this.doGet(url, success, error); - // console.log(url); - }, - region : function(accountId, sessionId, bucketId, objectId, region, queryParams){ - objectId = objectId.replace(new RegExp("/", "gi"),":"); - var _this=this; - queryParams["sessionid"] = sessionId; - queryParams["region"] = region; - queryParams["cellbasehost"] = CELLBASE_HOST+'/'+CELLBASE_VERSION; - - if(this.host.indexOf("localhost")!=-1){ - queryParams["region"] = region; - queryParams["filepath"] = objectId; - var url = this.host+'/storage/fetch'+this.getQuery(queryParams); - }else{ - var url = this.getObjectUrl(accountId,bucketId,objectId)+'/fetch'+this.getQuery(queryParams); - } - - - function success(data){ - if(!(data.substr(0,5).indexOf('ERROR') != -1)){ - _this.onRegion.notify({resource:queryParams["category"],result:JSON.parse(data),filename:objectId,query:region,params:queryParams}); - } - } - - function error(data){ - console.log("ERROR: " + data); - console.log(data); - } - - this.doGet(url, success, error); - console.log(url); - }, - - /* JOB METHODS */ - jobResult : function(accountId, sessionId, jobId, format){ - var _this=this; - //@Path("/{accountid}/{bucketname}/job/{jobid}/result.{format}") - var queryParams = { - 'sessionid':sessionId - }; - var url = this.getJobAnalysisUrl(accountId,jobId)+'/result.js'+this.getQuery(queryParams); - //var url = this.getHost() + '/job/'+jobId+'/result.'+format+'?incvisites=true&sessionid='+sessionId; - function success(data){ - _this.onJobResult.notify(data); - } - - function error(data){ - console.log("ERROR: " + data); - } - - this.doGet(url, success, error); - console.log(url); - }, - jobResultUrl : function(accountId, sessionId, jobId, format){ - var queryParams = { - 'sessionid':sessionId - }; - return this.getJobAnalysisUrl(accountId,jobId)+'/result.js'+this.getQuery(queryParams); - }, - jobStatus : function(accountId, sessionId, jobId){ - var _this=this; - var queryParams = { - 'sessionid':sessionId - }; - var url = this.getJobAnalysisUrl(accountId,jobId)+'/status'+this.getQuery(queryParams); - function success(data){ - _this.onJobStatus.notify(data); - } - - function error(data){ - console.log("ERROR: " + data); - } - - this.doGet(url, success, error); - console.log(url); - }, - - table : function(accountId, sessionId, jobId, filename, colNames, colVisibility){ - var _this=this; - var queryParams = { - 'filename':filename, - 'colNames':colNames, - 'colVisibility':colVisibility, - 'sessionid':sessionId - }; - var url = this.getJobAnalysisUrl(accountId,jobId)+'/table'+this.getQuery(queryParams); - function success(data){ - _this.onTable.notify(data); - } - - function error(data){ - console.log("ERROR: " + data); - } - - this.doGet(url, success, error); - // console.log(url); - }, - - tableurl : function(accountId, sessionId, jobId, filename, colNames, colVisibility){ - var queryParams = { - 'filename':filename, - 'colNames':colNames, - 'colVisibility':colVisibility, - 'sessionid':sessionId - }; - return this.getJobAnalysisUrl(accountId,jobId)+'/table'+this.getQuery(queryParams); - }, - - poll : function(accountId, sessionId, jobId, filename, zip){ - var _this=this; - var queryParams = { - 'filename':filename, - 'sessionid':sessionId - }; - var url; - if(zip==true){ - url = this.getJobAnalysisUrl(accountId,jobId)+'/poll'+this.getQuery(queryParams); - open(url); - }else{ - queryParams['zip']=false; - url = this.getJobAnalysisUrl(accountId,jobId)+'/poll'+this.getQuery(queryParams); - function success(data){ - _this.onPoll.notify(data); - } - function error(data){ - console.log("ERROR: " + data); - } - this.doGet(url, success, error); - } - // console.log(url); - }, - - pollurl : function(accountId, sessionId, jobId, filename){ - var queryParams = { - 'filename':filename, - 'sessionid':sessionId, - 'zip':false - }; - return this.getJobAnalysisUrl(accountId,jobId)+'/poll'+this.getQuery(queryParams); - //debugger - }, - - deleteJob : function(accountId, sessionId, jobId){ - var _this=this; - var queryParams = { - 'sessionid':sessionId - }; - var url = this.getJobAnalysisUrl(accountId,jobId)+'/delete'+this.getQuery(queryParams); - function success(data){ - _this.onDeleteJob.notify(data); - } - function error(data){ - console.log("ERROR: " + data); - } - this.doGet(url, success, error); - // console.log(url); - }, - - downloadJob : function(accountId, sessionId, jobId){ - var queryParams = { - 'sessionid':sessionId - }; - open(this.getJobAnalysisUrl(accountId,jobId)+'/download'+this.getQuery(queryParams)); - }, - - - - /* ANALYSIS */ - runAnalysis : function(analysis, paramsWS){ - var _this=this; - var accountId = paramsWS.accountid; - var queryParams = { -// 'projectId':'default' - }; - var url = this.getAnalysisUrl(accountId, analysis)+'/run'+this.getQuery(queryParams); - console.log(url); - console.log(paramsWS); - - function success(data){ - _this.onRunAnalysis.notify({status:"done",data:data}); - } - - function error(data){ - _this.onRunAnalysis.notify({status:"fail",data:data}); - } - - $.ajax({type:"POST", url:url, data:paramsWS, success:success, error:error}); - }, - indexer : function(accountId, sessionId, bucketId, objectId){ - var _this=this; - var queryParams = { - 'sessionid':sessionId - }; - var url = this.getObjectUrl(accountId,bucketId,objectId)+'/index'+this.getQuery(queryParams); - console.log(url); - - function success(data){ - _this.onIndexer.notify(data); - } - - function error(data){ - _this.onIndexer.notify(data); - } - this.doGet(url, success, error); - }, - indexerStatus : function(accountId, sessionId, bucketId, objectId, indexerId){ - var _this=this; - var queryParams = { - 'sessionid':sessionId, - 'indexerid':indexerId - }; - var url = this.getObjectUrl(accountId,bucketId,objectId)+'/index_status'+this.getQuery(queryParams); - console.log(url); - - function success(data){ - _this.onIndexerStatus.notify(data); - } - function error(data){ - _this.onIndexerStatus.notify(data); - } - this.doGet(url, success, error); - }, - - localFileList : function(){ - var _this=this; - - var url = this.host+'/getdirs'; - console.log(url); - - function success(data){ - _this.onLocalFileList.notify(data); - } - - function error(data){ - _this.onLocalFileList.notify(data); - } - this.doGet(url, success, error); - } -}; - -function CheckBrowser(appName){ - - if(Ext.isIE){ - //console.time implementation for IE - if(window.console && typeof(window.console.time) == "undefined") { - console.time = function(name, reset){ - if(!name) { return; } - var time = new Date().getTime(); - if(!console.timeCounters) { console.timeCounters = {} }; - var key = "KEY" + name.toString(); - if(!reset && console.timeCounters[key]) { return; } - console.timeCounters[key] = time; - }; - - console.timeEnd = function(name){ - var time = new Date().getTime(); - if(!console.timeCounters) { return; } - var key = "KEY" + name.toString(); - var timeCounter = console.timeCounters[key]; - if(timeCounter) { - var diff = time - timeCounter; - var label = name + ": " + diff + "ms"; - console.info(label); - delete console.timeCounters[key]; - } - return diff; - }; - } - } - - var browserOk = false; - switch (appName){ - case "renato": - if(Ext.chromeVersion>=16){ - browserOk = true; - } - if(Ext.safariVersion>=5){ - browserOk = true; - } - if(Ext.firefoxVersion>=10){ - browserOk = true; - } - break; - case "variant": - if(Ext.chromeVersion>=16){ - browserOk = true; - } - if(Ext.safariVersion>=5){ - browserOk = true; - } - if(Ext.firefoxVersion>=10){ - browserOk = true; - } - break; - default: - if(Ext.chromeVersion>=14){ - browserOk = true; - } - if(Ext.safariVersion>=5){ - browserOk = true; - } - if(Ext.isIE10>=5){ - browserOk = true; - } - } -//if(Ext.operaVersion<=0){ -// browserOk = true; -//} -//if(Ext.firefoxVersion<=0){ -// browserOk = true; -//} - if(browserOk==false){ - console.log("--------------------------------------------"+browserOk) -// Ext.create("Ext.window.Window",{ -// title:'Supported browsers', -// modal:true, -// resizable:false, -// bodyStyle:"background:#ffffff;", -// bodyPadding:15, -// width:330, -// height:200, -// html:'

This release makes an intensive use of new web technologies and standards like HTML5, so the browsers that are fully supported from now on are:

'+ -// '

Chrome 14+

'+ -// '

Safari 5+

'+ -// '
Other browsers or may rise some errors.' -// }).show(); - $("#checkBrowser") -// .html('

This release makes an intensive use of new web technologies and standards like HTML5 and SVG, so the browsers that are fully supported and will provide the best user experience are:

'+ -// '

Google Chrome 14+

'+ -// '

Apple Safari 5+

'+ -// 'Other browsers may rise some errors. Firefox11+ works very slow on Linux and Windows 7 and the usage it is not recommended. Internet Explorer 9 is not supported since they not support many of the features of HTML5, Internet Explorer 10 Consumer Preview works fine.') - .html('This application provides the best user experience with Google Chrome and Apple Safari, otherwise some latencies may be experienced when browsing due to some problems in Firefox.') - .css('width','540px') - .css('height','40px') - .css('position','absolute') - .css('margin-left','300px') - .css('margin-top','26px') - .css('padding','5px') - .css('border','1px solid #F1D031') - .css('background','#FFFFA3') - .css('color','#555') - .css('position','absolute') - .css('z-index','50000') - .click(function(){ - $("#checkBrowser").fadeOut(function (){ $(this).remove(); }); - }); - } -} - -function HeaderWidget(args){ - - _.extend(this, Backbone.Events); - - var _this = this; - this.id = Utils.genId("HeaderWidget"); - - - this.targetId; - this.height = 67; - this.accountData; - - this.appname="My new App"; - this.description=''; - this.suiteId=-1; - this.news=''; - this.checkTimeInterval = 4000; - this.version = ''; - this.allowLogin = true; - this.width; - this.height; - this.chunkedUpload = false; - - //set instantiation args, must be last - _.extend(this, args); - - this.adapter = new OpencgaManager(); - - /** create widgets **/ - this.loginWidget= new LoginWidget(this.suiteId); - this.profileWidget = new ProfileWidget(); - this.opencgaBrowserWidget = new OpencgaBrowserWidget({suiteId:this.suiteId,chunkedUpload:this.chunkedUpload}); - - /**Atach events i listen**/ - this.loginWidget.onSessionInitiated.addEventListener(function(){ - _this.sessionInitiated(); - _this.trigger('login',{sender:this}); - }); - - this.adapter.onLogout.addEventListener(function(sender, data){ - console.log(data); - //Se borran todas las cookies por si acaso - $.cookie('bioinfo_sid', null); - $.cookie('bioinfo_sid', null, {path: '/'}); - $.cookie('bioinfo_account', null); - $.cookie('bioinfo_account', null, {path: '/'}); - _this.sessionFinished(); - _this.trigger('logout',{sender:this}); - }); - this.opencgaBrowserWidget.onNeedRefresh.addEventListener(function(){ - _this.getAccountInfo(); - }); - this.adapter.onGetAccountInfo.addEventListener(function (evt, response){ - if(response.accountId != null){ - _this.setAccountData(response); - _this.trigger('account:change',{sender:this,response:response}); - console.log("accountData has been modified since last call"); - } - }); - - - this.on(this.handlers); - - this.rendered = false; - if (this.autoRender) { - this.render(); - } -} - -HeaderWidget.prototype = { - setAccountData : function (data){ - this.accountData = data; - this.opencgaBrowserWidget.setAccountData(data); - Ext.getCmp(this.id+'textUser').setText(this._getAccountText()); - }, - getAccountInfo : function() { - var lastActivity = null; - if(this.accountData != null){ - lastActivity = this.accountData.lastActivity; - } - if(!$.cookie('bioinfo_account')){ - console.log('cookie: bioinfo_account, is not set, session will be finished...'); - this.sessionFinished(); - }else{ - this.adapter.getAccountInfo($.cookie('bioinfo_account'), $.cookie('bioinfo_sid'), lastActivity); - } - - }, - _getAccountText : function(){ - var nameToShow = this.accountData.accountId; - if(nameToShow.indexOf('anonymous_')!=-1){ - nameToShow='anonymous'; - } - return 'logged in as '+nameToShow+'' - }, - sessionInitiated : function(){ - var _this = this; - /**HIDE**/ - this.loginWidget.clean(); - Ext.getCmp(this.id+'btnSignin').hide(); - /**SHOW**/ - Ext.getCmp(this.id+'btnLogout').show(); - Ext.getCmp(this.id+'btnEdit').show(); - Ext.getCmp(this.id+'btnOpencga').show(); - - /**START OPENCGA CHECK**/ - if(!this.accountInfoInterval){ - this.getAccountInfo();//first call - this.accountInfoInterval = setInterval(function(){_this.getAccountInfo();}, this.checkTimeInterval); - } - }, - sessionFinished : function(){ - /**HIDE**/ - Ext.getCmp(this.id+'btnOpencga').hide(); - Ext.getCmp(this.id+'btnLogout').hide(); - Ext.getCmp(this.id+'btnEdit').hide(); - /**SHOW**/ - Ext.getCmp(this.id+'btnSignin').show(); - - Ext.getCmp(this.id+'textUser').setText(''); - /**CLEAR OPENCGA**/ - clearInterval(this.accountInfoInterval); - delete this.accountInfoInterval; - - this.profileWidget.hide(); - this.opencgaBrowserWidget.hide(); - }, - setDescription : function (text){ - $("#"+this.id+'description').html(text); - }, - draw : function(){ - if (!this.rendered) { - console.info('Header Widget is not rendered yet'); - return; - } - var _this = this; - - if($.cookie('bioinfo_sid') != null){ - this.sessionInitiated(); - }else{ - this.sessionFinished(); - } - }, - getPanel : function (){ - this.draw(); - return this.panel; - }, - setWidth : function (width){ - this.width=width; - this.getPanel().setWidth(width); - }, - render : function (targetId){ - var _this=this; - this.targetId = (targetId) ? targetId : this.targetId; - if ($('#' + this.targetId).length < 1) { - console.log('targetId not found in DOM'); - return; - } - if (this.panel==null){ -// console.log(this.args.suiteId); - switch(this.suiteId){ - case 11://Renato - this.homeLink="http://renato.bioinfo.cipf.es"; - this.helpLink="http://bioinfo.cipf.es/docs/renato/"; - this.tutorialLink="http://bioinfo.cipf.es/docs/renato/tutorial"; - this.aboutText = ''; - break; - case 6://Variant - this.homeLink="http://variant.bioinfo.cipf.es"; - this.helpLink="http://docs.bioinfo.cipf.es/projects/variant"; - this.tutorialLink="http://docs.bioinfo.cipf.es/projects/variant/wiki/Tutorial"; - this.aboutText = ''; - break; - case 9://GenomeMaps - this.homeLink="http://www.genomemaps.org"; - this.helpLink="http://wiki.opencb.org/projects/visualization/doku.php?id=genome-maps:overview"; - this.tutorialLink="http://wiki.opencb.org/projects/visualization/doku.php?id=genome-maps:tutorial"; - this.aboutText = 'Genome Maps is built with open and free technologies like HTML5 and SVG inline, ' + - 'so no plug-in is needed in modern internet browsers. We’ve focused on providing the ' + - 'best user experience possible with a modern drag navigation and many features included.

' + - 'Genome Maps project has been developed in the Computational Biology Unit led by Ignacio Medina, at Computational Genomic'+ - ' Institute led by Joaquin Dopazo at CIPF. Two people from my lab deserve special mention for their fantastic job done: '+ - '
Franscisco Salavert and Alejandro de Maria.

'+ - 'Genome Maps has been designed to be easily be embedded in any project with a couple of lines of code,' + - ' and it has been implemented as a plugin framework to extend the standard features.

' + - 'Supported browsers include: Google Chrome 14+, Apple Safari 5+, Opera 12+ and Mozilla Firefox 14+ ' + - '(works slower than in the other browsers). Internet Explorer 10 is under RC and seems to work properly.

' + - 'For more information or suggestions about Genome Maps please contact
Ignacio Medina: imedina@cipf.es' - break; - case 10://CellBrowser - this.homeLink="http://www.cellbrowser.org"; - this.helpLink="http://docs.bioinfo.cipf.es/projects/cellbrowser"; - this.tutorialLink="http://docs.bioinfo.cipf.es/projects/cellbrowser/wiki/Tutorial"; - this.aboutText = ''; - break; - case 12://UNTBgen - this.homeLink="http://bioinfo.cipf.es/apps/untbgen"; - this.helpLink="http://bioinfo.cipf.es/ecolopy/"; - this.tutorialLink="http://bioinfo.cipf.es/ecolopy/"; - this.aboutText = ''; - break; - case 22://Pathiways - this.homeLink="http://pathiways.bioinfo.cipf.es"; - this.helpLink="http://bioinfo.cipf.es/pathiways"; - this.tutorialLink="http://bioinfo.cipf.es/pathiways/tutorial"; - this.aboutText = 'PATHiWAYS is built with open and free technologies like HTML5 and SVG inline, ' + - 'so no plug-in is needed in modern internet browsers

'+ - 'PATHiWAYS project has been developed in the Computational Biology Unit, at Computational Medicine'+ - ' Institute at CIPF in Valencia, Spain.

'+ - 'For more information please visit our web page
bioinfo.cipf.es'; - break; - default: - this.homeLink="http://docs.bioinfo.cipf.es"; - this.helpLink="http://docs.bioinfo.cipf.es"; - this.tutorialLink="http://docs.bioinfo.cipf.es"; - this.aboutText = ''; - } - - var linkbar = new Ext.create('Ext.toolbar.Toolbar', { - id:this.id+'linkbar', - dock: 'top', - cls:'bio-linkbar', - height:40, - minHeight:40, - maxHeight:40, - items: [{ - xtype:'tbtext', - id:this.id+"speciesTextItem", - text:'' - },{ - xtype:'tbtext', - id:this.id+"assemblyTextItem", - text:'' - },'->',{ - id: this.id + "homeButton", - text: 'home', - handler: function () { - window.location.href = _this.homeLink; - } - },{ - id: this.id + "helpButton", - text: 'documentation', - handler: function () { - window.open(_this.helpLink); - } - },{ - id: this.id + "tutorialButton", - text: 'tutorial', - handler: function () { - window.open(_this.tutorialLink); - } - },{ - id: this.id + "aboutButton", - text: 'about', - handler: function () { - Ext.create('Ext.window.Window', { - id: _this.id + "aboutWindow", - bodyStyle: 'background:#fff; color:#333;', - bodyPadding: 10, - title: 'About', - height: 340, - width: 500, - modal: true, - layout: 'fit', - html: _this.aboutText - }).show(); - } - }] - }); - - var userbar = new Ext.create('Ext.toolbar.Toolbar', { - id : this.id+'userbar', - dock: 'top', - border:false, -// cls:'bio-userbar', - cls:'gm-login-bar', - height:27, - minHeight:27, - maxHeight:27, - layout:'hbox', - items:[{ - xtype:'tbtext', - id:this.id+'textNews', - text:this.news - },'->',{ - xtype:'tbtext', - id:this.id+'textUser', - text:'' - },{ - id:this.id+'btnOpencga', - text: 'Upload & Manage', - iconCls: 'icon-project-manager', - handler: function() { - _this.opencgaBrowserWidget.draw("manager"); - } - },{ - id: this.id+'btnSignin', - disabled:!this.allowLogin, - text: 'sign in', - handler: function (){ - _this.loginWidget.draw(); - } - },{ - id: this.id+'btnEdit', - text: 'profile', - handler: function (){ - _this.profileWidget.draw(); - } - },{ - id :this.id+'btnLogout', - text: 'logout', - handler: function (){ - _this.adapter.logout($.cookie('bioinfo_account'), $.cookie('bioinfo_sid')); - } - }] - }); - - this.panel = Ext.create('Ext.panel.Panel', { - id:this.id+"panel", - region: 'north', - border:false, - renderTo:this.targetId, - height : this.height, - minHeight: this.height, - maxHeigth: this.height, - width:this.width, - layout:'hbox', - items:[{ - xtype:'container', -// flex:1, - items:[{ - id: this.id + "appTextItem", - xtype: 'tbtext', - margin:'25 0 0 20', - // html: 'Vitis vinifera  '+this.args.appname +' '+this.args.description+'    ', - text: '' + this.appname + ' ' + - '' + this.description + '' + - '' + - '', - padding: '0 0 0 10', - listeners:{ - afterrender:function(){ - $("#"+_this.id+"appTextItem").qtip({ - content: ''+_this.version+'', - position: {my:"bottom center",at:"top center",adjust: { y: 12, x:-25 }} - - }); - } - } - }] - },{ - xtype:'container', - flex:2, - layout:{type:'vbox',align:'right'}, - items:[userbar,linkbar] - }] - }); - } - this.rendered = true; - } -}; - - - -JobListWidget.prototype.draw = UserListWidget.prototype.draw; -JobListWidget.prototype.getData = UserListWidget.prototype.getData; -JobListWidget.prototype.getCount = UserListWidget.prototype.getCount; - -function JobListWidget (args){ - var _this = this; - UserListWidget.prototype.constructor.call(this, args); - this.counter = null; - var jobstpl = [ - '', - '
', - '
green'+ - 'blue'+ - 'red'+ - 'Darkorange'+ - '">{name}
', - '
{date}
', - '
{toolName}{execution}
', - '
', -// 'finished and unvisited', -// '{visites} visites', -// '', - //'
 
', - //'{percentage}%', -// 'running, please wait...', -// '
', - '{status}', - ' - {visites} views', - '
' + -// ' - {id}' + - '
', - '
', - '
' - ]; - - var jobsfields = ['commandLine','date','description','diskUsage','status','finishTime','inputData','jobId','message','name','outputData','ownerId','percentage','projectId','toolName','visites']; - - this.pagedViewList.storeFields = jobsfields; - this.pagedViewList.template = jobstpl; - - if (args.pagedViewList != null){ - if (args.pagedViewList.storeFields != null){ - this.pagedViewList.storeFields = args.pagedViewList.storeFields; - } - if (args.pagedViewList.template != null){ - this.pagedViewList.template = args.pagedViewList.template; - } - } - - this.pagedListViewWidget = new PagedViewListWidget(this.pagedViewList); - - this.btnAllId = this.id + "_btnAll"; - this.btnActivePrjId = this.id + "_btnActivePrj"; - this.btnFinishedId =this.id + "_btnFinished"; - this.btnVisitedId = this.id + "_btnVisited"; - this.btnRunningId = this.id + "_btnRunning"; - this.btnQueuedId = this.id + "_btnQueued"; - - this.projectFilterButton = Ext.create("Ext.button.Button",{ - id : this.btnActivePrjId, - iconCls: 'icon-project-all', - tooltip:'Toggle jobs from all projects or active project', - enableToggle: true, - pressed: false, - listeners: { - toggle:function(){ - //_this.selectProjectData(); - _this.render(); - } - } - }); - - - - this.bar = new Ext.create('Ext.toolbar.Toolbar', { -// vertical : true, - id:this.id+"jobsFilterBar", - dock : 'top', - items : [ - //this.projectFilterButton, - { - id : this.btnAllId, - text: ' ', - tooltip:'Total jobs' - }, - { - id : this.btnFinishedId, - text: ' ', - tooltip:'Finished jobs' - }, - { - id : this.btnVisitedId, - text: ' ', - tooltip:'Visited jobs' - }, - { - id : this.btnRunningId, - text: ' ', - tooltip:'Running jobs' - }, - { - id : this.btnQueuedId, - text: ' ', - tooltip:'Queued jobs' - } - ] - }); - - Ext.getCmp(this.btnAllId).on('click', this.filter, this); - Ext.getCmp(this.btnFinishedId).on('click', this.filter, this); - Ext.getCmp(this.btnVisitedId).on('click', this.filter, this); - Ext.getCmp(this.btnRunningId).on('click', this.filter, this); - Ext.getCmp(this.btnQueuedId).on('click', this.filter, this); - - this.allData = []; - - -///*HARDCODED check job status*/ -// var checkJobsStatus = function(){ -// if(_this.accountData != null){ -// var opencgaManager = new OpencgaManager(); -// for ( var i = 0; i < _this.accountData.jobs.length; i++) { -// if(_this.tools.indexOf(_this.accountData.jobs[i].toolName) != -1){ -// if(_this.accountData.jobs[i].visites<0){ -// opencgaManager.jobStatus($.cookie("bioinfo_account"), $.cookie("bioinfo_sid"), _this.accountData.jobs[i].id); -// } -// } -// } -// } -// } -// -// this.accountInfoInterval = setInterval(function(){checkJobsStatus();}, 4000); -// -///*HARDCODED check job status*/ - - -}; - -JobListWidget.prototype.show = function (){ - this.pagedListViewWidget.show(); -}; -JobListWidget.prototype.hide = function (){ - this.pagedListViewWidget.hide(); -}; - -//override -JobListWidget.prototype.draw = function (){ - -}; - -JobListWidget.prototype.clean = function (){ - clearInterval(this.interval); - if(this.bar.isDescendantOf(Ext.getCmp(this.pagedListViewWidget.panelId))==true){ - Ext.getCmp(this.pagedListViewWidget.panelId).removeDocked(this.bar,false); - } - this.pagedListViewWidget.clean(); -}; - -//JobListWidget.prototype.getResponse = function (){ - //this.adapter.listProject($.cookie("bioinfo_sid"), this.suiteId); -//}; - -JobListWidget.prototype.setAccountData = function (data){ - - this.accountData = data; - console.log("joblistwidget"); - var jobs = []; - var job; - for ( var i = 0; i < this.accountData.projects.length; i++) { - for ( var j = 0; j < this.accountData.projects[i].jobs.length; j++) { - job = this.accountData.projects[i].jobs[j]; - if(this.tools.indexOf(job.toolName) != -1){ - job.date = Utils.parseDate(job.date); - jobs.push(job); - } - } - } - this.data = jobs; - this.render(); -}; - - -JobListWidget.prototype.render = function (){ - this.pagedListViewWidget.draw(this.getData()); - if(this.bar.isDescendantOf(Ext.getCmp(this.pagedListViewWidget.panelId))==false){ - Ext.getCmp(this.pagedListViewWidget.panelId).addDocked(this.bar); - } - - var jobcount = this.getJobCounter(); - - if (jobcount.all == 0) { - Ext.getCmp(this.btnAllId).hide(); - } else { - Ext.getCmp(this.btnAllId).show(); - } - if (jobcount.finished == 0) { - Ext.getCmp(this.btnFinishedId).hide(); - } else { - Ext.getCmp(this.btnFinishedId).show(); - } - if (jobcount.visited == 0) { - Ext.getCmp(this.btnVisitedId).hide(); - } else { - Ext.getCmp(this.btnVisitedId).show(); - } - if (jobcount.running == 0) { - Ext.getCmp(this.btnRunningId).hide(); - } else { - Ext.getCmp(this.btnRunningId).show(); - } - if (jobcount.queued == 0) { - Ext.getCmp(this.btnQueuedId).hide(); - } else { - Ext.getCmp(this.btnQueuedId).show(); - } - Ext.getCmp(this.btnAllId).setText(''+jobcount.all+''); - Ext.getCmp(this.btnFinishedId).setText(''+jobcount.finished+''); - Ext.getCmp(this.btnVisitedId).setText(''+jobcount.visited+''); - Ext.getCmp(this.btnRunningId).setText(''+jobcount.running+''); - Ext.getCmp(this.btnQueuedId).setText(''+jobcount.queued+''); -}; - - -JobListWidget.prototype.getJobCounter = function() { - var finished = 0; - var visited = 0; - var running = 0; - var queued = 0; - for (var i =0 ; i < this.getData().length; i++) { - if (this.getData()[i].visites > 0){ - visited++; - }else { - if (this.getData()[i].visites == 0){ - finished++; - } - if (this.getData()[i].visites == -1){ - running++; - } - if (this.getData()[i].visites == -2){ - queued++; - } - } - } - return {"all":this.getData().length,"visited": visited, "finished": finished, "running": running, "queued": queued}; -}; - -/**Filters**/ -//var functionAssertion = function(item){return item.data.visites > 2;}; - -JobListWidget.prototype.filter = function (button){ - switch (button.id) { - case this.btnFinishedId: - this.pagedListViewWidget.setFilter(function(item){return item.data.visites == 0;}); - break; - case this.btnVisitedId: - this.pagedListViewWidget.setFilter(function(item){return item.data.visites > 0;}); - break; - case this.btnRunningId: - this.pagedListViewWidget.setFilter(function(item){return item.data.visites == -1;}); - break; - case this.btnQueuedId: - this.pagedListViewWidget.setFilter(function(item){return item.data.visites == -2;}); - break; - default: - this.pagedListViewWidget.setFilter(function(item){return true;}); - break; - } - this.pagedListViewWidget.draw(this.getData()); -}; - -JobListWidget.prototype.selectProjectData = function (){ - if(!this.projectFilterButton.pressed){ - for ( var i = 0; i < this.allData.length; i++) { - if(this.allData[i].active){ - this.data=this.allData[i].jobs; - break; - } - } - }else{ - var allJobs = new Array(); - for ( var i = 0; i < this.allData.length; i++) { - if(this.allData[i].jobs!=null){ - for ( var j = 0; j < this.allData[i].jobs.length; j++) { - - //TODO care with date order - allJobs.push(this.allData[i].jobs[j]); - } - } - } - this.data=allJobs; - } - if(this.data==null){ - this.data=[]; - } - this.pagedListViewWidget.draw(this.getData()); -}; - -function LoginWidget (suiteId, args){ - var _this=this; - this.id = "LoginWidget_"; - this.targetId = null; - this.suiteId = suiteId; - if (args != null){ - if (args.targetId!= null){ - this.targetId = args.targetId; - } - } - - /**Events i send**/ - this.onSessionInitiated = new Event(this); - - this.adapter = new OpencgaManager(); - - /**Atach events i listen**/ - this.adapter.onLogin.addEventListener(function (sender, data){ - if(_this.panel != null){ - _this.panel.setLoading(false); - } - console.log(data); - if(data.errorMessage == null){ - $.cookie('bioinfo_sid', data.sessionId /*,{path: '/'}*/);//TODO ATENCION si se indica el path el 'bioinfo_sid' es comun entre dominios - $.cookie('bioinfo_account', data.accountId); - $.cookie('bioinfo_bucket', data.bucketId); - _this.onSessionInitiated.notify(); - }else{ - Ext.getCmp(_this.labelEmailId).setText(''+data.errorMessage+'', false); - //Delete all cookies - $.cookie('bioinfo_sid', null); - $.cookie('bioinfo_sid', null, {path: '/'}); - $.cookie('bioinfo_account',null); - $.cookie('bioinfo_account', null, {path: '/'}); - } - }); - this.adapter.onCreateAccount.addEventListener(function (sender, data){ - _this.panel.setLoading(false); - data = data.replace(/^\s+|\s+$/g, ''); - if(data.indexOf("OK")!=-1){ - Ext.getCmp(_this.labelEmailId).setText('Account created', false); -// console.log(_this.id+' LOGIN RESPONSE -> '+data); - //$.cookie('bioinfo_sid', data /*,{path: '/'}*/);//TODO ATENCION si se indica el path el 'bioinfo_sid' es comun entre dominios - //_this.onSessionInitiated.notify(); - }else{ - data = data.replace(/ERROR: /gi," "); - Ext.getCmp(_this.labelEmailId).setText('Account already exists', false); - //Se borran las cookies por si acaso - $.cookie('bioinfo_sid', null); - $.cookie('bioinfo_sid', null, {path: '/'}); - $.cookie('bioinfo_account',null); - $.cookie('bioinfo_account', null, {path: '/'}); - } - }); - this.adapter.onResetPassword.addEventListener(function (sender, data){ - _this.panel.setLoading(false); - Ext.getCmp(_this.labelEmailId).setText(''+data+'', false); - }); - - - - /**ID**/ - this.labelEmailId = this.id+"labelEmail"; - this.labelPassId = this.id+"labelPass"; - - this.fldEmailId = this.id+"fldEmail"; - this.fldPasswordId = this.id+"fldPassword"; - this.fldNpass1Id = this.id+"fldNpass1"; - this.fldNpass2Id = this.id+"fldNpass2"; - - this.btnSignId = this.id+"fldSign"; - this.btnAnonymousId = this.id+"btnAnonymous"; - this.btnForgotId = this.id+"btnForgot"; - this.btnNewaccId = this.id+"btnNewacc"; - - this.btnSendId = this.id+"btnSend"; - this.btnBackId = this.id+"btnBack"; - - this.btnRegisterId = this.id+"btnRegister"; - -} - -LoginWidget.prototype.sign = function (){ - if(Ext.getCmp(this.btnAnonymousId).getValue()){ - this.anonymousSign(); - this.panel.setLoading('Waiting server...'); - }else{ - if(this.checkAccountId()){ - this.adapter.login(this.getLogin(), this.getPassword(), this.suiteId ); - this.panel.setLoading('Waiting server...'); - $.cookie('bioinfo_user', null, {path: '/'}); - $.cookie('bioinfo_user', this.getLogin(), {expires: 7}); - } - } -}; - -LoginWidget.prototype.anonymousSign = function (){ - this.adapter.login("anonymous", "", this.suiteId ); -}; - -LoginWidget.prototype.register = function (){ - if(this.checkAccountId() && this.checkemail() && this.checkName() && this.checkpass()){ - this.adapter.createAccount(this.getLogin(), this.getEmail(), this.getAccountName(),this.getPasswordReg(), this.suiteId ); - }else{ - Ext.getCmp(this.labelEmailId).setText('Fill all fields', false); - } -}; - -LoginWidget.prototype.sendRecover = function (){ - if(this.checkAccountId() && this.checkemail()){ - this.adapter.resetPassword(this.getLogin(), this.getEmail()); - this.panel.setLoading('Waiting server...'); - } -}; - -LoginWidget.prototype.getLogin = function (){ - return Ext.getCmp(this.id+"accountId").getValue(); -}; -LoginWidget.prototype.getAccountName = function (){ - return Ext.getCmp(this.id+"accountName").getValue(); -}; -LoginWidget.prototype.getEmail = function (){ - return Ext.getCmp(this.fldEmailId).getValue(); -}; - -LoginWidget.prototype.getPassword = function (){ - return $.sha1(Ext.getCmp(this.fldPasswordId).getValue()); -}; - -LoginWidget.prototype.getPasswordReg = function (){ - return $.sha1(Ext.getCmp(this.fldNpass1Id).getValue()); -}; - -LoginWidget.prototype.draw = function (){ - this.render(); -}; - -LoginWidget.prototype.clean = function (){ - if (this.panel != null){ - this.panel.destroy(); - } -}; - -LoginWidget.prototype.render = function (){ - var _this=this; - if (this.panel == null){ - - var labelEmail = Ext.create('Ext.toolbar.TextItem', { - id : this.labelEmailId, - padding:3, - text: 'Type your account ID and password' - }); - this.pan = Ext.create('Ext.form.Panel', { - id : this.id+"formPanel", - bodyPadding:20, - width: 350, - height: 145, - border:false, - bbar:{items:[labelEmail]}, - items: [{ - id: this.id+"accountId", - xtype:'textfield', - value:$.cookie('bioinfo_user'), - fieldLabel: 'account ID', - hidden: false, -// enableKeyEvents: true, - listeners: { - scope: this, - change: this.checkAccountId - } - },{ - id: this.fldPasswordId, - xtype:'textfield', - fieldLabel: 'password', - inputType: 'password' , -// emptyText:'please enter your password', - listeners:{ - specialkey: function(field, e){ - if (e.getKey() == e.ENTER) { - _this.sign(); - } - } - } - },{ - id: this.fldEmailId, - xtype:'textfield', - fieldLabel: 'e-mail', - hidden: true, -// enableKeyEvents: true, -// emptyText:'please enter your email', - listeners: { - change: function(){ - _this.checkemail(); - }, - specialkey: function(field, e){ - if (e.getKey() == e.ENTER) { - _this.sign(); - } - } - } - },{ - id: this.id+"accountName", - xtype:'textfield', - fieldLabel: 'name', - hidden: true, -// enableKeyEvents: true, - listeners: { - scope: this, - change: this.checkName - } - },{ - id: this.fldNpass1Id, - xtype:'textfield', - fieldLabel: 'password', - inputType: 'password' , - hidden: true, -// enableKeyEvents: true, - listeners: { - scope: this, - change: this.checkpass - } - },{ - id: this.fldNpass2Id, - xtype:'textfield', - fieldLabel: 're-password', - inputType: 'password' , - hidden: true, -// enableKeyEvents: true, - listeners: { - scope: this, - change: this.checkpass - } - },{ - id: this.btnAnonymousId, - xtype:'checkboxfield', - padding:"10 0 0 0", - boxLabel:'Anonymous login

Your work will be lost after logout

', - margin:"0 0 0 50", - listeners:{ - change:function(me, newValue, oldValue, eOpts){ - if(newValue){ - Ext.getCmp(_this.id+"accountId").disable(); - Ext.getCmp(_this.fldPasswordId).disable(); - }else{ - Ext.getCmp(_this.id+"accountId").enable(); - Ext.getCmp(_this.fldPasswordId).enable(); - } - } - } - } - ] - }); - - this.panel = Ext.create('Ext.window.Window', { - id : this.id+"windowPanel", - title: 'Sign in', - resizable: false, - minimizable :true, - constrain:true, - closable:true, - modal:true, - items:[this.pan], - buttonAlign:'center', - buttons:[{ - id: this.btnSignId, - text:'Sign in' - },{ - id: this.btnForgotId, - text:'Forgot yout password?', - width:130, - minWidth:130 - },{ - id: this.btnNewaccId, - text:'New account', - width:100, - minWidth:100 - },{ - id : this.btnSendId, - text:'Send', - hidden: true - },{ - id : this.btnRegisterId, - text:'Register', - hidden: true - },{ - id : this.btnBackId, - text:'Back', - hidden: true - } - ], - listeners: { - scope: this, - minimize:function(){ - this.panel.hide(); - }, - destroy: function(){ - delete this.panel; - } - } - }); - - Ext.getCmp(this.btnForgotId).on('click', this.ShowForgot, this); - Ext.getCmp(this.btnBackId).on('click', this.ShowBack, this); - Ext.getCmp(this.btnNewaccId).on('click', this.ShowNewacc, this); - - Ext.getCmp(this.btnSignId).on('click', this.sign, this); - Ext.getCmp(this.btnSendId).on('click', this.sendRecover, this); - Ext.getCmp(this.btnRegisterId).on('click', this.register, this); - Ext.getCmp(this.btnAnonymousId).on('change', this.anonymousSelected, this); - } - this.panel.show(); -}; - -LoginWidget.prototype.ShowForgot = function (){ - Ext.getCmp(this.fldEmailId).reset(); - Ext.getCmp(this.fldEmailId).show(); - Ext.getCmp(this.fldPasswordId).reset(); - Ext.getCmp(this.btnAnonymousId).reset(); - Ext.getCmp(this.fldNpass1Id).reset(); - Ext.getCmp(this.fldNpass2Id).reset(); - - Ext.getCmp(this.fldPasswordId).hide(); - Ext.getCmp(this.btnAnonymousId).hide(); - Ext.getCmp(this.fldNpass1Id).hide(); - Ext.getCmp(this.fldNpass2Id).hide(); - - Ext.getCmp(this.btnSignId).hide(); - Ext.getCmp(this.btnForgotId).hide(); - Ext.getCmp(this.btnNewaccId).hide(); - - Ext.getCmp(this.btnSendId).show(); - Ext.getCmp(this.btnBackId).show(); - Ext.getCmp(this.btnRegisterId).hide(); - - Ext.getCmp(this.id+"accountId").reset(); - Ext.getCmp(this.id+"accountName").hide(); - - Ext.getCmp(this.labelEmailId).setText('Type your account ID and email to send a new password', false); - Ext.getCmp(this.id+"formPanel").setHeight(145); - - Ext.getCmp(this.id+"accountId").setFieldLabel('account ID', false); - Ext.getCmp(this.fldEmailId).setFieldLabel('e-mail', false); -}; -LoginWidget.prototype.ShowBack = function (){ - Ext.getCmp(this.fldEmailId).hide(); - Ext.getCmp(this.fldPasswordId).reset(); - Ext.getCmp(this.btnAnonymousId).reset(); - Ext.getCmp(this.fldNpass1Id).reset(); - Ext.getCmp(this.fldNpass2Id).reset(); - - Ext.getCmp(this.fldPasswordId).show(); - Ext.getCmp(this.btnAnonymousId).show(); - Ext.getCmp(this.fldNpass1Id).hide(); - Ext.getCmp(this.fldNpass2Id).hide(); - - Ext.getCmp(this.btnSignId).show(); - Ext.getCmp(this.btnForgotId).show(); - Ext.getCmp(this.btnNewaccId).show(); - - Ext.getCmp(this.btnSendId).hide(); - Ext.getCmp(this.btnBackId).hide(); - Ext.getCmp(this.btnRegisterId).hide(); - - Ext.getCmp(this.id+"accountId").reset(); - Ext.getCmp(this.id+"accountName").hide(); - - Ext.getCmp(this.labelEmailId).setText('Type your account ID and password', false); - Ext.getCmp(this.id+"formPanel").setHeight(145); - - Ext.getCmp(this.id+"accountId").setFieldLabel('account ID', false); -}; -LoginWidget.prototype.ShowNewacc = function (){ - - Ext.getCmp(this.fldEmailId).reset(); - Ext.getCmp(this.fldEmailId).show(); - Ext.getCmp(this.fldPasswordId).reset(); - Ext.getCmp(this.btnAnonymousId).reset(); - Ext.getCmp(this.fldNpass1Id).reset(); - Ext.getCmp(this.fldNpass2Id).reset(); - - Ext.getCmp(this.fldPasswordId).hide(); - Ext.getCmp(this.btnAnonymousId).hide(); - Ext.getCmp(this.fldNpass1Id).show(); - Ext.getCmp(this.fldNpass2Id).show(); - - Ext.getCmp(this.btnSignId).hide(); - Ext.getCmp(this.btnForgotId).hide(); - Ext.getCmp(this.btnNewaccId).hide(); - - Ext.getCmp(this.btnSendId).hide(); - Ext.getCmp(this.btnBackId).show(); - Ext.getCmp(this.btnRegisterId).show(); - - Ext.getCmp(this.id+"accountId").reset(); - Ext.getCmp(this.id+"accountName").reset(); - Ext.getCmp(this.id+"accountName").show(); - - Ext.getCmp(this.labelEmailId).setText(' ', false); - Ext.getCmp(this.id+"formPanel").setHeight(200); - - Ext.getCmp(this.id+"accountName").setFieldLabel('name', false); - Ext.getCmp(this.id+"accountId").setFieldLabel('account ID', false); - Ext.getCmp(this.fldEmailId).setFieldLabel('e-mail', false); - Ext.getCmp(this.fldNpass1Id).setFieldLabel('password', false); - Ext.getCmp(this.fldNpass2Id).setFieldLabel('re-password', false); - Ext.getCmp(this.id+"accountId").setValue(""); -}; - -LoginWidget.prototype.checkpass = function (){ - var passwd1 = Ext.getCmp(this.fldNpass1Id).getValue(); - var passwd2 = Ext.getCmp(this.fldNpass2Id).getValue(); - var patt = new RegExp("[ *]"); - - if(!patt.test(passwd1) && passwd1.length > 3){ - if (passwd1 == passwd2){ - Ext.getCmp(this.fldNpass1Id).setFieldLabel('password', false); - Ext.getCmp(this.fldNpass2Id).setFieldLabel('re-password', false); - Ext.getCmp(this.labelEmailId).setText(' ', false); - return true; - }else{ - Ext.getCmp(this.fldNpass1Id).setFieldLabel('password', false); - Ext.getCmp(this.fldNpass2Id).setFieldLabel('re-password', false); - Ext.getCmp(this.labelEmailId).setText('Password does not match', false); - return false; - } - }else{ - Ext.getCmp(this.fldNpass1Id).setFieldLabel('password', false); - Ext.getCmp(this.fldNpass2Id).setFieldLabel('re-password', false); - Ext.getCmp(this.labelEmailId).setText('Password minimum length is 4', false); - return false; - } -}; - -LoginWidget.prototype.anonymousSelected = function (este,value){ - if(value){ - Ext.getCmp(this.labelEmailId).setText('Anonymous selected', false); - }else{ - Ext.getCmp(this.labelEmailId).setText('Type your account ID and password', false); - } - -}; - -LoginWidget.prototype.checkemail = function (a,b,c){ - Ext.getCmp(this.btnAnonymousId).reset(); - var email = Ext.getCmp(this.fldEmailId).getValue(); - var patt = /^([a-zA-Z0-9_\.\-])+\@(([a-zA-Z0-9\-])+\.)+([a-zA-Z0-9]{2,4})+$/; - - if (patt.test(email)){ - Ext.getCmp(this.fldEmailId).setFieldLabel('e-mail', false); - return true; - }else{ - Ext.getCmp(this.fldEmailId).setFieldLabel('e-mail', false); - return false; - } -}; -LoginWidget.prototype.checkName = function (a,b,c){ - var name = Ext.getCmp(this.id+"accountName").getValue(); - if(name!="" && name!=null){ - Ext.getCmp(this.id+"accountName").setFieldLabel('name', false); - return true; - }else{ - Ext.getCmp(this.id+"accountName").setFieldLabel('name', false); - return false; - } -}; -LoginWidget.prototype.checkAccountId = function (a,b,c){ - var accountId = Ext.getCmp(this.id+"accountId").getValue(); - if(accountId!="" && accountId!=null){ - Ext.getCmp(this.id+"accountId").setFieldLabel('account ID', false); - return true; - }else{ - Ext.getCmp(this.id+"accountId").setFieldLabel('account ID', false); - return false; - } -}; - -function OpencgaBrowserWidget(args) { - var _this = this; - this.chunkedUpload=false; - if (typeof args != 'undefined') { - this.targetId = args.targetId || this.targetId; - this.title = args.title || this.title; - this.width = args.width || this.width; - this.height = args.height || this.height; - this.chunkedUpload = args.chunkedUpload || this.chunkedUpload; - } - - this.adapter = new OpencgaManager(); - this.adapter.onCreateBucket.addEventListener(function (sender, data) { - if (data.indexOf("ERROR") != -1) { - Ext.Msg.alert("Create project", "ERROR: could not create this project."); - } else { - _this.onNeedRefresh.notify(); - } - _this.panel.setLoading(false); - Ext.getBody().unmask(); - }); - - this.uploadWidget = new UploadWidget({suiteId: args.suiteId, opencgaBrowserWidget: this,chunkedUpload:this.chunkedUpload}); - - this.uploadWidget.adapter.onUploadObjectToBucket.addEventListener(function (sender, res) { - if (res.status == 'done') { - _this.onNeedRefresh.notify(); - } - }); - /**ID**/ - this.searchFieldId = this.id + "_searchField"; -} - -OpencgaBrowserWidget.prototype = { - /* Default properties */ - id: "OpencgaBrowserWidget_" + Math.round(Math.random() * 10000000), -// targetId:undefined, - title: 'Cloud data', - onSelect: new Event(this), - onNeedRefresh: new Event(this), - width: 800, - height: 575, - rendered: false, -// selectedFolderNode:undefined, -// selectedFileNode:undefined,//can be set by the tree panel or the grid panel - - /* Methods */ - hide:function(){ - this.panel.hide(); - }, - draw: function (mode) { - //Ext.getBody().mask("Loading..."); - //this.adapter.getData(sessionID, -1); - this.render(mode); - this.rendered = true; - }, - - setAccountData: function (data) { - this.accountData = data; - if (this.rendered) { - this._updateFolderTree(); - } - }, - - _updateFolderTree: function () { - var _this = this; - console.log("updating folder tree"); - var find = function (str, arr) { - for (var i = 0; i < arr.length; i++) { - if (arr[i].text == str) { - return i; - } - } - return -1; - }; - - if (this.accountData != null && this.accountData.accountId != null) { - this.folderStore.getRootNode().removeAll(); - this.allStore.getRootNode().removeAll(); - this.filesStore.removeAll(); -// this.folderTree.getSelectionModel().deselectAll(); - for (var i = 0; i < this.accountData.buckets.length; i++) { - var folders = []; - for (var j = 0; j < this.accountData.buckets[i].objects.length; j++) { - var data = this.accountData.buckets[i].objects[j]; - data["bucketId"] = this.accountData.buckets[i].id; - //sencha uses id so need to rename to oid, update: sencha can use id but dosent like char '/' on the id string - - if (data.id != null) { - data["oid"] = data.id; - delete data.id; - } - var pathArr = data.oid.split("/"); - if (data.fileType == "dir") { - data["expanded"] = true; - data["icon"] = Utils.images.dir; - } else { - data["leaf"] = true; - data["icon"] = Utils.images.r; - } - //console.log(pathArr) - - var current = folders; - for (var k = 0; k < pathArr.length; k++) { - var found = find(pathArr[k], current); - if (found != -1) { - current = current[found].children; - } else { - var children = []; - var idx = current.push({text: pathArr[k], children: children}) - 1; - if (typeof pathArr[k + 1] == 'undefined') {//isLast - for (key in data) { - if (key != "children") { - current[idx][key] = data[key]; - } - } - } - current = children; - } - } - } - folders = JSON.stringify(folders); - this.allStore.getRootNode().appendChild({text: this.accountData.buckets[i].name, bucketId: this.accountData.buckets[i].name, oid: "", icon: Utils.images.bucket, expanded: true, isBucket: true, children: JSON.parse(folders)}); - this.folderStore.getRootNode().appendChild({text: this.accountData.buckets[i].name, bucketId: this.accountData.buckets[i].name, oid: "", icon: Utils.images.bucket, expanded: true, isBucket: true, children: JSON.parse(folders)}); - } - } - - //collapse and expand to update the view after append, possible ExtJS 4.2.0 bug - this.folderStore.getRootNode().collapse(); - this.folderStore.getRootNode().expand(); - - - //reselect nodes after account update - if (this.selectedFolderNode != null) { //devuelve el value y el field porque el bucket no tiene oid - var lastNode = this.folderTree.getRootNode().findChild(this.selectedFolderNode.field, this.selectedFolderNode.value, true); - if (lastNode != null) { - this.folderTree.getSelectionModel().select(lastNode); - } - } - if (this.selectedFileNode != null) { //devuelve el value y el field porque el bucket no tiene oid - var index = this.filesGrid.getStore().findExact('oid', this.selectedFileNode.oid); - if (index != -1) { - this.filesGrid.getSelectionModel().select(index); - } - } - }, - - addUpload: function (file, fileuploadWorker) { - var pbar = Ext.create('Ext.ProgressBar', { - text: 'Ready', - width: 250, - margin: '4 6 0 6' - }); - var nameBox = Ext.create('Ext.Component', { - html: file.name.substr(0, 67), - width: 430, - margin: '7 6 0 6' - }); -// #ffffd6 amarillete - // #1155cc azulete - var btn = Ext.create('Ext.Button', { - text: 'Cancel', - margin: '3 6 0 4', - width: 50, - handler: function () { - fileuploadWorker.terminate(); - cont.destroy(); - } - }); - var cont = Ext.create('Ext.container.Container', { - padding: '3 6 0 6', - layout: 'hbox', - items: [nameBox, pbar, btn] - }); - fileuploadWorker.onmessage = function (e) { - var res = e.data; - console.log("@@@@@@@@@@@@@@@@ WORKER event message"); - console.log(res); - pbar.updateProgress((res.chunkId + 1) / res.total, 'uploading part ' + (res.chunkId + 1) + ' of ' + res.total, false); - if (res.finished == true) { - btn.setText('Done '); - } -// _this.adapter.onIndexer(function(data){ -// console.log(data); -// }); -// _this.adapter.indexer($.cookie("bioinfo_account"),objectId); - }; - this.activeUploadsCont.add(cont); - Ext.getCmp(this.id + 'activeUploadsButton').toggle(true); - }, - viewBuckets: function () { - var _this = this; - _this.panel.removeAll(false); - _this.panel.add(_this.panAccordion); - _this.panel.add(_this.filesGrid); - - }, - viewUploads: function () { - var _this = this; - _this.panel.removeAll(false); - _this.panel.add(_this.activeUploadsCont); - } - //endclass -}; - -OpencgaBrowserWidget.prototype.render = function (args) { - var _this = this; - - var args = args || {}; - var mode = args.mode; - this.allowedTypes = args.allowedTypes; - - - if (this.panel == null) { - - this.folderStore = Ext.create('Ext.data.TreeStore', { - id: this.id + 'folderStore', - fields: ['text', 'oid'], - root: { - expanded: true, - text: 'Drive', - children: [] - }, - listeners: { - beforeappend: function (este, node) { - if (node.isLeaf()) { -// console.log(node.raw.oid + " is a file"); - return false; //cancel append because is leaf - } - } - } - }); - this.allStore = Ext.create('Ext.data.TreeStore', { - id: this.id + 'allStore', - fields: ['text', 'oid'], - root: { - expanded: true, - text: 'Drive', - children: [] - } - }); - this.filesStore = Ext.create('Ext.data.Store', { - fields: ['oid', 'fileBioType', 'fileType', 'fileFormat', 'fileName', 'multiple', 'diskUsage', 'creationTime', 'responsible', 'organization', 'date', 'description', 'status', 'statusMessage', 'members'], - data: [] - }); - - var refreshBucketAction = Ext.create('Ext.Action', { - icon: Utils.images.refresh, - text: 'Refresh bucket', - handler: function (widget, event) { - var record = _this.folderTree.getSelectionModel().getSelection()[0]; - if (record) { - if (record.raw.isBucket) { - var opencgaManager = new OpencgaManager(); - opencgaManager.onRefreshBucket.addEventListener(function (sender, res) { - Ext.example.msg('Refresh Bucket', '' + res + ''); - if (res.indexOf("ERROR") != -1) { - console.log(res); - } else { - _this.onNeedRefresh.notify(); - } - }); - opencgaManager.refreshBucket($.cookie("bioinfo_account"), record.raw.text, $.cookie("bioinfo_sid")); - } - } - } - }); - - var renameBucketAction = Ext.create('Ext.Action', { -// icon: Utils.images.refresh, - text: 'Rename bucket', - handler: function (widget, event) { - var record = _this.folderTree.getSelectionModel().getSelection()[0]; - if (record) { - if (record.raw.isBucket) { - Ext.Msg.prompt('Rename bucket', 'Please enter a new name:', function (btn, text) { - if (btn == 'ok') { - text = text.replace(/[^a-z0-9-_.\/\s]/gi, '').trim(); - - var opencgaManager = new OpencgaManager(); - opencgaManager.onRenameBucket.addEventListener(function (sender, res) { - Ext.example.msg('Refresh Bucket', '' + res + ''); - if (res.indexOf("ERROR") != -1) { - console.log(res); - } else { - _this.onNeedRefresh.notify(); - } - }); -// accountId, bucketId, newBucketId, sessionId - opencgaManager.renameBucket($.cookie("bioinfo_account"), record.raw.bucketId, text, $.cookie("bioinfo_sid")); - } - }, null, null, "new name"); - } - } - } - }); - - this.folderTree = Ext.create('Ext.tree.Panel', { - //xtype:"treepanel", - id: this.id + "activeTracksTree", - title: "Upload & Manage", - bodyPadding: "5 0 0 0", - margin: "-1 0 0 0", - border: false, - autoScroll: true, - flex: 4, - useArrows: true, - rootVisible: false, - hideHeaders: true, -// selType: 'cellmodel', - //plugins: [Ext.create('Ext.grid.plugin.CellEditing', {clicksToEdit: 2,listeners:{ - //edit:function(editor, e, eOpts){ - //var record = e.record; //en la vista del cliente - /*todo, ahora q llame la servidor. y lo actualize*/ - //} - //}})], - columns: [ - { - xtype: 'treecolumn', - dataIndex: 'text', - flex: 1, - editor: {xtype: 'textfield', allowBlank: false} - } -// , -// { -// xtype: 'actioncolumn', -// menuDisabled: true, -// align: 'center', -// width: 30, -// renderer: function (value, metaData, record) { -// if (record.raw.isBucket) { -// this.icon = Utils.images.refresh; -// this.tooltip = 'Refresh bucket to find new files'; -// } else { -// this.tooltip = null; -// this.icon = null; -// } -// }, -// handler: function (grid, rowIndex, colIndex, actionItem, event, record, row) { -// if (record.raw.isBucket) { -// var opencgaManager = new OpencgaManager(); -// opencgaManager.onRefreshBucket.addEventListener(function (sender, res) { -// Ext.example.msg('Refresh Bucket', '' + res + ''); -// if (res.indexOf("ERROR") != -1) { -// console.log(res); -// } else { -// _this.onNeedRefresh.notify(); -// } -// }); -// opencgaManager.refreshBucket($.cookie("bioinfo_account"), record.raw.text, $.cookie("bioinfo_sid")); -// } -// -// } -// } - ], - viewConfig: { - markDirty: false, - plugins: { - ptype: 'treeviewdragdrop' - }, - listeners: { - drop: function (node, data, overModel, dropPosition, eOpts) { - var record = data.records[0]; - //check if is leaf and if the record has a new index - if (record.isLeaf() && record.data.index != record.removedFrom && record.data.checked) { - var id = record.data.trackId; - _this.setTrackIndex(id, record.data.index); - } - }, - itemcontextmenu: function (este, record, item, index, e) { - e.stopEvent(); - var items = []; - console.log(record) - if (record.raw.isBucket) { - items.push(refreshBucketAction); - items.push(renameBucketAction); - var contextMenu = Ext.create('Ext.menu.Menu', { - items: items - }); - contextMenu.showAt(e.getXY()); - } - return false; - } - } - }, - listeners: { - selectionchange: function (este, selected, eOpts) { - var record = selected[0]; - if (typeof record != 'undefined') {//avoid deselection - var field, deep; - if (record.raw.isBucket != null) {//is a bucket - field = 'text'; - deep = false; - } else { - field = 'oid'; - deep = true; - } - var node = _this.allStore.getRootNode().findChild(field, record.raw[field], deep); - var childs = []; - _this.selectedFolderNode = {value: node.data[field], field: field}; - node.eachChild(function (n) { - childs.push(n.raw); - }); - _this.filesGrid.setTitle(node.getPath("text", " / ")); - _this.filesStore.loadData(childs); - if (mode == "folderSelection") { - _this.selectedFileNode = node.raw; - _this.selectButton.enable(); - } - } - }, - viewready: function (este, eOpts) {//Fires when the grid view is available (use this for selecting a default row). - setTimeout(function () { // forced to do this because some ExtJS 4.2.0 event problem - var node = este.getRootNode().getChildAt(0); - if (typeof node != 'undefined') { - este.getSelectionModel().select(node); - } - }, 0); - }, - checkchange: function (node, checked) { - }, - itemmouseenter: function (este, record) { - }, - itemmouseleave: function (este, record) { - } - }, - store: this.folderStore - }); - - - /*MANAGE BUCKETS*/ - var newProjectButton = Ext.create('Ext.button.Button', { - text: 'OK', - handler: function () { - _this.createProject(); - _this.folderTree.toggleCollapse(); - //manageProjects.toggleCollapse(); - } - }); - var newProjectNameField = Ext.create('Ext.form.field.Text', { - id: this.id + "newProjectNameField", -// width: 160, - emptyText: 'name', - allowBlank: false - }); - var newProjectDescriptionField = Ext.create('Ext.form.field.TextArea', { - id: this.id + "newProjectDescriptionField", -// width: 160, - emptyText: 'description' - }); - var newProjectCont = Ext.create('Ext.container.Container', { - flex: 1, - layout: { type: 'hbox', align: 'stretch'}, - items: [newProjectNameField, newProjectDescriptionField] - }); - var manageProjects = Ext.create('Ext.panel.Panel', { - title: "Create bucket", - bodyPadding: 5, - border: false, - items: [newProjectNameField, newProjectDescriptionField, newProjectButton] - }); - /*END MANAGE PROJECTS*/ - - - /*Files grid*/ - var indexAction = Ext.create('Ext.Action', { - icon: Utils.images.info, // Use a URL in the icon config - text: 'Create index', -// disabled: true, - handler: function (widget, event) { - var record = _this.filesGrid.getSelectionModel().getSelection()[0]; - if (record) { - var opencgaManager = new OpencgaManager(); - opencgaManager.onIndexer.addEventListener(function (sender, response) { - console.log(response); - Ext.example.msg("indexer", response); - record.raw.indexerId = response; -// if (response.indexOf("ERROR:") != -1){ -// }else{ -// //delete complete -//// record.destroy(); -// _this.onNeedRefresh.notify(); -// } - }); - opencgaManager.indexer($.cookie("bioinfo_account"), $.cookie("bioinfo_sid"), record.raw.bucketId, record.data.oid); - - -// console.log(record.raw.status); -// if (record.raw.status.indexOf('indexer') == -1) { -// opencgaManager.onIndexer.addEventListener(function (sender, response) { -// console.log(response) -// Ext.example.msg("indexer", response); -// record.raw.indexerId = response; -//// if (response.indexOf("ERROR:") != -1){ -//// }else{ -//// //delete complete -////// record.destroy(); -//// _this.onNeedRefresh.notify(); -//// } -// }); -// opencgaManager.indexer($.cookie("bioinfo_account"), $.cookie("bioinfo_sid"), record.raw.bucketId, record.data.oid); -// } else { -// Ext.example.msg('Indexer', 'The file is already being indexed'); -// opencgaManager.onIndexerStatus.addEventListener(function (sender, response) { -// console.log(response) -// Ext.example.msg("indexer status", response); -//// if (response.indexOf("ERROR:") != -1){ -//// }else{ -//// //delete complete -////// record.destroy(); -//// _this.onNeedRefresh.notify(); -//// } -// }); -// opencgaManager.indexerStatus($.cookie("bioinfo_account"), $.cookie("bioinfo_sid"), record.raw.bucketId, record.data.oid, record.raw.status); -// } - } - } - }); - var showName = Ext.create('Ext.Action', { -// icon: Utils.images.info, - text: 'Show name', -// disabled: true, - handler: function (widget, event) { - var rec = _this.filesGrid.getSelectionModel().getSelection()[0]; - if (rec) { - Ext.example.msg('objectId', '' + rec.get('oid')); - } - } - }); - - var deleteAction = Ext.create('Ext.Action', { - icon: Utils.images.del, - text: 'Delete this file', -// disabled: true, - handler: function (widget, event) { - var record = _this.filesGrid.getSelectionModel().getSelection()[0]; - if (record) { - Ext.MessageBox.confirm('Confirm', 'Are you sure you want to delete this file?

' + record.data.fileName + '

', function (answer) { - if (answer == "yes") { - console.log("deleting") - var opencgaManager = new OpencgaManager(); - opencgaManager.onDeleteObjectFromBucket.addEventListener(function (sender, response) { - if (response.indexOf("ERROR:") != -1) { - Ext.example.msg("Deleting", response); - } else { - //delete complete - record.destroy(); - _this.onNeedRefresh.notify(); - } - }); - opencgaManager.deleteObjectFromBucket($.cookie("bioinfo_account"), $.cookie("bioinfo_sid"), record.raw.bucketId, record.data.oid); - } - }); - } - } - }); - - this.filesGrid = Ext.create('Ext.grid.Panel', { - title: this.allStore.getRootNode().getPath("text", " / "), - store: this.filesStore, - flex: 4, - border: false, - viewConfig: { - stripeRows: true, - listeners: { - itemcontextmenu: function (este, record, item, index, e) { - e.stopEvent(); - var items = [showName]; - console.log(record) - if (record.raw.fileFormat == 'bam' || record.raw.fileFormat == 'vcf') { - items.push(indexAction); - } - items.push(deleteAction); - var contextMenu = Ext.create('Ext.menu.Menu', { - items: items - }); - contextMenu.showAt(e.getXY()); - return false; - } - } - }, - selModel: { - mode: 'SINGLE', - //allowDeselect:true, - listeners: { - selectionchange: function (este, item) { - if (item.length > 0) {//se compr - _this.selectedFileNode = item[0].raw; - var type = item[0].raw.fileType; - var fileFormat = item[0].raw.fileFormat; - if (mode == "fileSelection" && type == "dir") { - return; - } - console.log(_this.allowedTypes) - if (typeof _this.allowedTypes != 'undefined' && _this.allowedTypes.indexOf(fileFormat) == -1) { - console.log('file format NOT allowed -' + fileFormat + '- ') - return; - } - console.log('file format allowed -' + fileFormat + '- ') - _this.selectButton.enable(); - //this.selectedLabel.setText('

The selected file '+item[0].data.fileName.substr(0,40)+' is allowed.

',false); - //TODO por defecto cojo el primero pero que pasa si el data contiene varios ficheros?? - } else { - _this.selectButton.disable(); - } - } - } - }, - columns: [ - { text: 'File type', xtype: 'actioncolumn', menuDisabled: true, align: 'center', width: 54, icon: Utils.images.bluebox, - renderer: function (value, metaData, record) { - this.icon = Utils.images[record.data.fileType]; - this.tooltip = record.data.fileType; - } - }, - { text: 'Name', dataIndex: 'fileName', flex: 2 }, - { text: 'Creation time', dataIndex: 'creationTime', flex: 1 } - ] - }); - /**/ - - this.panAccordion = Ext.create('Ext.panel.Panel', { - minWidth: 125, - minHeight: 250, - flex: 1, - cls: 'ocb-border-right-lightgrey', - border: false, - layout: 'accordion', - items: [this.folderTree, manageProjects /*, panFilter*/] - }); - - this.selectButton = Ext.create('Ext.button.Button', { - text: 'Ok', - disabled: true, - handler: function () { - _this.onSelect.notify({id: _this.selectedFileNode.oid, bucketId: _this.selectedFileNode.bucketId}); - _this.panel.close(); - } - }); - - this.activeUploadsCont = Ext.create('Ext.panel.Panel', { - title:'Active uploads', - animCollapse:false, - hidden:true, - bodyPadding:'10 0 10 0', - autoScroll: true, - height: 125, - border:0, - cls:'ocb-border-top-lightgrey', - items: [] - }); - - - /**MAIN PANEL**/ -// this.height=205+(26*suites.length);//segun el numero de suites - - var tbarObj = {items: []}; - switch (mode) { - case "folderSelection" : - var item; - item = {text: 'New folder', handler: function () { - _this.folderTree.expand(); - _this.createFolder(); - }}; - tbarObj.items.splice(0, 0, item); - item = {text: 'New bucket', handler: function () { - manageProjects.expand(); - }}; - tbarObj.items.splice(0, 0, item); - this.filesStore.filter("fileType", /dir/); - break; - case "manager" : - var item; - item = {text: 'Upload', handler: function () { - _this.drawUploadWidget(); - }}; - tbarObj.items.splice(0, 0, item); - item = {text: 'New folder', handler: function () { - _this.folderTree.expand(); - _this.createFolder(); - }}; - tbarObj.items.splice(0, 0, item); - item = {text: 'New bucket', handler: function () { - manageProjects.expand(); - }}; - tbarObj.items.splice(0, 0, item); - this.selectButton.hide(); - break; - default : - var item; - item = {text: 'Upload', handler: function () { - _this.drawUploadWidget(); - }}; - tbarObj.items.splice(0, 0, item); - item = {text: 'New folder', handler: function () { - _this.folderTree.expand(); - _this.createFolder(); - }}; - tbarObj.items.splice(0, 0, item); - item = {text: 'New bucket', handler: function () { - manageProjects.expand(); - }}; - tbarObj.items.splice(0, 0, item); - break; - } - - if(this.chunkedUpload == true){ - tbarObj.items.push({ - id: this.id + 'activeUploadsButton', - text: 'Active uploads', - enableToggle: true, - pressed: false, - toggleHandler: function () { - if (this.pressed) { - _this.activeUploadsCont.show(); - // _this.viewUploads(); - } else { - _this.activeUploadsCont.hide(); - // _this.viewBuckets(); - } - } - }); - } - this.panel = Ext.create('Ext.window.Window', { - title: 'Upload & Manage', - resizable: false, - minimizable: true, - constrain: true, - closable: false, - modal: true, - height: this.height, - minHeight: this.height, - width: this.width, - minWidth: this.width, - resizable:true, - layout: { type: 'vbox', align: 'stretch'}, - tbar: tbarObj, - items: [ - { - xtype: 'container', - flex: 3, - minWidth: 125, - layout: { type: 'hbox', align: 'stretch'}, - items: [this.panAccordion, this.filesGrid] - }, - this.activeUploadsCont - ], - buttonAlign: 'right', - buttons: [ - { - text: 'Close', handler: function () { - _this.onSelect = new Event(); - _this.panel.hide(); - }}, - this.selectButton - ], - listeners: { - scope: this, - minimize: function () { - this.panel.hide(); - }, - destroy: function () { - delete this.panel; - } - } - }); - }//if null - - this._updateFolderTree(); - this.panel.show(); -}; - -OpencgaBrowserWidget.prototype.setFilter = function () { - var _this = this; - var recordOrigin = this.viewOrigin.getSelectionModel().getSelection()[0]; - var recordSuite = this.viewSuite.getSelectionModel().getSelection()[0]; - - this.folderStore.clearFilter(); - - if (recordOrigin != null) { - switch (recordOrigin.data.suiteId) { - case "all": - break; - case "Uploaded Data": - this.folderStore.filter(function (item) { - return item.data.jobId < 0; - }); - break; - case "Job Generated": - this.folderStore.filter(function (item) { - return item.data.jobId > 0; - }); - break; - } - } - if (recordSuite != null) { - switch (recordSuite.data.suiteId) { - case 1: - break; - default : - this.folderStore.filter(function (item) { - return item.data.suiteId == recordSuite.data.suiteId; - }); - } - } - - this.folderStore.filter(function (item) { - var str = Ext.getCmp(_this.searchFieldId).getValue().toLowerCase(); - if (item.data.name.toLowerCase().indexOf(str) < 0) { - return false; - } - return true; - }); -}; - -OpencgaBrowserWidget.prototype.checkTags = function (tags) { - for (var i = 0; i < this.tags.length; i++) { - if (this.tags[i].indexOf('|') > -1) { - var orTags = this.tags[i].split('|'); - var orMatch = false; - for (var j = 0; j < orTags.length; j++) { - if (tags.indexOf(orTags[j]) > -1) { - orMatch = true; - } - } - if (!orMatch) { - return false; - } - } else { - if (tags.indexOf(this.tags[i]) == -1) { - return false; - } - } - } - return true; - -}; - - -OpencgaBrowserWidget.prototype.createProject = function () { - var _this = this; - var name = Ext.getCmp(this.id + "newProjectNameField").getValue(); - var desc = Ext.getCmp(this.id + "newProjectDescriptionField").getValue(); - if (name != "") { - Ext.getBody().mask(); - _this.panel.setLoading("Creating project"); - this.adapter.createBucket(name, desc, $.cookie("bioinfo_account"), $.cookie("bioinfo_sid")); - } -}; - -OpencgaBrowserWidget.prototype._getFolderTreeSelection = function () { - var selectedBuckets = this.folderTree.getSelectionModel().getSelection(); - if (selectedBuckets.length < 1) { - Ext.example.msg('No folder selected', 'Please select a bucket or a folder.'); - return null; - } else { - var record = selectedBuckets[0]; - var bucketName; - var parent = ''; - if (record.raw.fileType != null && record.raw.fileType == "dir") { - var path = record.getPath("text", "/").substr(1); - var pathArr = path.split("/", 2); - parent = path.replace(pathArr.join("/"), "").substr(1) + "/"; - bucketName = pathArr[1]; - } else { - bucketName = record.raw.text; - } - return {bucketId: bucketName, directory: parent}; - } -}; - -OpencgaBrowserWidget.prototype.drawUploadWidget = function () { - var _this = this; - var folderSelection = this._getFolderTreeSelection(); - if (folderSelection != null) { - _this.uploadWidget.draw(folderSelection); - } -}; - -OpencgaBrowserWidget.prototype.createFolder = function () { - var _this = this; - if (this.accountData.buckets.length < 1) { - Ext.MessageBox.alert('No buckets found', 'Please create and select a bucket.'); - } else { - var folderSelection = this._getFolderTreeSelection(); - if (folderSelection != null) { - Ext.Msg.prompt('New folder', 'Please enter a name for the new folder:', function (btn, text) { - if (btn == 'ok') { - text = text.replace(/[^a-z0-9-_.\s]/gi, ''); - text = text.trim() + "/"; - var opencgaManager = new OpencgaManager(); - opencgaManager.onCreateDirectory.addEventListener(function (sender, res) { - Ext.example.msg('Create folder', '' + res + ''); - if (res.indexOf("ERROR") != -1) { - console.log(res); - } else { - _this.onNeedRefresh.notify(); - } - }); - opencgaManager.createDirectory($.cookie("bioinfo_account"), $.cookie("bioinfo_sid"), folderSelection.bucketId, folderSelection.directory + text); - } - }, null, null, "New Folder"); - } - } -}; - -function PagedViewListWidget(args){ - var _this=this; - this._data = null; - this.id = "PagedViewListWidget_"+ Math.round(Math.random()*10000); - this.targetId = null; - - this.pageSize = 6; - this.storeFields = new Object(); - this.template = new Object(); - this.width = 280; - this.height = 550; - this.title = ""; - this.order = 0; - this.border = 0; - this.mode = "view"; - this.sort = 'DESC'; - - - if (args != null){ - if (args.pageSize != null){ - this.pageSize = args.pageSize; - } - if (args.storeFields != null){ - this.storeFields = args.storeFields; - } - if (args.template != null){ - this.template = args.template; - } - if (args.targetId != null){ - this.targetId = args.targetId; - } - if (args.width != null){ - this.width = args.width; - } - if (args.height != null){ - this.height = args.height; - } - if (args.title != null){ - this.title = args.title; - } - if (args.order != null){ - this.order = args.order; - } - if (args.border != null){ - this.border = args.border; - } - if (args.mode != null){ - this.mode = args.mode; - } - } - - this.currentPage = 1; - this.pageFieldId = this.id + '_pageField'; - this.pageLabelId = this.id + '_pageLabel'; - this.pagbarId = this.id + '_pagbar'; - this.panelId = this.id + '_panel'; - - /**Events i send**/ - this.onItemClick = new Event(this); - - - this.textFilterFunction = function(item){ - var str = Ext.getCmp(_this.id+"searchField").getValue().toLowerCase(); - if(item.data.name.toLowerCase().indexOf(str)<0){ - return false; - } - return true; - }; - -}; - -PagedViewListWidget.prototype.getData = function (){ - return this._data; -}; - -PagedViewListWidget.prototype._setData = function (data){ - this._data = data; -}; - -//PagedViewListWidget.prototype.getPageSize = function (){ -// return this.pageSize; -//}; - -//PagedViewListWidget.prototype.getItemsCount = function (){ -// return this.getData().length; -//}; - -//PagedViewListWidget.prototype.getPageCount = function (){ -// return Math.ceil(this.getItemsCount() / this.getPageSize()); -//}; - -/**FILTER **/ -PagedViewListWidget.prototype.setFilter = function(filterFunction) { - this.store.clearFilter(); - - if(filterFunction!=null){ - this.filterFunction = filterFunction; - this.store.filter([filterFunction,this.textFilterFunction]); - }else{ - this.store.filter([this.textFilterFunction]); - } - -}; - -/** DRAW **/ -PagedViewListWidget.prototype.draw = function(data) { - - this._setData(data); -// this.changeOrder(); - this.render(); - - this.store.loadData(this.getData()); - if (this.filterFunction != null ){ - this.setFilter(this.filterFunction); -// this._setData(this.store.data.items); - } -// this.changePage(this.currentPage, this.getData(), true); - -}; -/** CLEAN **/ -PagedViewListWidget.prototype.clean = function (){ - if (this.panel != null){ - this.panel.destroy(); - delete this.panel; - } -}; - - -//PagedViewListWidget.prototype.changePage = function (numberPage, data, restUpdated){ -// if((data != null) && (data.length > 0)){ -// if ((numberPage > 0) && (numberPage <= this.getPageCount())){ -// this.currentPage = numberPage; -// Ext.getCmp(this.pageLabelId).setText(numberPage+' of '+ this.getPageCount()); -// if (restUpdated != true){ -// Ext.getCmp(this.pageFieldId).setValue(numberPage); -// } -// var dataPage = new Array(); -// for ( var i = (this.getPageSize() * numberPage)- this.getPageSize(); i < this.getPageSize() * numberPage; i++) { -// if (data[i] != null){ -// dataPage.push(data[i]); -// } -// } -// this.store.loadData(dataPage, false); -// } -// } -// else{ -// this.store.removeAll(); -// this.currentPage=1; -// Ext.getCmp(this.pageFieldId).setValue(this.currentPage); -// Ext.getCmp(this.pageLabelId).setText('No data found'); -// -// } -//}; - -//PagedViewListWidget.prototype.changeOrder = function (){ -//// console.log(this.id+": "+this.sort); -// if(this.sort == "desc"){ -// var aux = new Array(); -// var data = this.getData(); -// if(data != null){ -// for ( var i = data.length-1; i >= 0; i--) { -// aux.push(data[i]); -// } -// } -// this._setData(aux); -// } -//}; - -PagedViewListWidget.prototype.render = function() { - var _this = this; - if (this.panel == null){ - this.tpl = new Ext.XTemplate(this.template); - - this.store = Ext.create('Ext.data.Store', { - fields: this.storeFields, - sorters: [{ property : 'date', direction: 'DESC'}], - autoLoad: false - }); - - var pan=null; - - if(this.mode == "view"){ - this.view = Ext.create('Ext.view.View', { - id : this.id+"view", - padding:15, - store: this.store, - tpl: this.tpl, - height:this.height, - trackOver: true, - autoScroll:true, - overItemCls: 'list-item-hover', - itemSelector: '.joblist-item', - listeners : { - scope: this, - itemclick : function (este,record){ - console.log(record.data); - this.onItemClick.notify(record); - } - // itemmouseenter : function (este, record, item){ - // item.style.cursor="pointer"; - // item.firstChild.style.cursor="pointer"; - // item.style.border = "1px solid deepSkyBlue"; - // item.style.background = "honeydew"; - // }, - // itemmouseleave : function (este, record, item){ - // item.style.background = "white"; - // item.style.border = "1px solid #ffffff"; - // } - } - }); - - pan = this.view; - } - - - if(this.mode == "grid"){ - var columns = []; - for (var j=0;j'+data+'', false); - }); - this.adapter.onChangeEmail.addEventListener(function (sender, data){ - _this.panel.setLoading(false); - if(data.indexOf("ERROR")==-1){ - Ext.getCmp(_this.id+'fldEmail').setValue(null); - Ext.getCmp(_this.id+'fldEmail').setFieldLabel('e-mail', false); - } - Ext.getCmp(_this.id+'labelPass').setText(''+data+'', false); - }); -} - -ProfileWidget.prototype = { - getOldPassword : function (){ - return $.sha1(Ext.getCmp(this.id+'fldOld').getValue()); - }, - getNewPassword : function (){ - return $.sha1(Ext.getCmp(this.id+'fldNew1').getValue()); - }, - getLogin : function (){ - return Ext.getCmp(this.id+'fldEmail').getValue(); - }, - clearAllFields:function(){ - Ext.getCmp(this.id+'fldOld').setValue(null); - Ext.getCmp(this.id+'fldNew1').setValue(null); - Ext.getCmp(this.id+'fldNew2').setValue(null); - Ext.getCmp(this.id+'fldEmail').setValue(null); - Ext.getCmp(this.id+'labelPass').setText(' ', false); - }, - changeEmail : function (){ - if(this.checkemail()){ - this.adapter.changeEmail($.cookie('bioinfo_account'), $.cookie('bioinfo_sid'), this.getLogin()); - this.panel.setLoading('Waiting for the server to respond...'); - } - }, - changePassword : function (){ - if(this.checkpass()){ - this.adapter.changePassword($.cookie('bioinfo_account'), $.cookie('bioinfo_sid'), this.getOldPassword(), this.getNewPassword(), this.getNewPassword()); - this.panel.setLoading('Waiting for the server to respond...'); - } - }, - draw : function (){ - this.render(); - }, - hide:function(){ - this.panel.hide(); - }, - clean : function (){ - if (this.panel != null){ - this.panel.destroy(); - delete this.panel; - console.log(this.id+' PANEL DELETED'); - } - }, - render : function (){ - var _this=this; - if (this.panel == null){ - console.log(this.id+' CREATING PANEL'); - - var labelPass = Ext.create('Ext.toolbar.TextItem', { - id : this.id+'labelPass', - text:'Modify your password or email.' - }); - var changePasswordForm = Ext.create('Ext.form.Panel', { - title:'Change password', - bodyPadding:15, - width: 350, - height:155, - border:false, - items: [{ - id:this.id+"fldOld", - name: 'password', - xtype:'textfield', - fieldLabel: 'Old password', - inputType: 'password' - },{ - id:this.id+"fldNew1", - name: 'new_password1', - xtype:'textfield', - fieldLabel: 'New password', - inputType: 'password' , -// enableKeyEvents: true, - listeners: { - scope: this, - change: this.checkpass - } - },{ - id:this.id+"fldNew2", - name: 'new_password2', - xtype:'textfield', - fieldLabel: 'Confirm new', - inputType: 'password' , -// enableKeyEvents: true, - listeners: { - scope: this, - change: this.checkpass - } - },{ - xtype:'button', - text:'Change',margin:'0 0 0 105', - handler:function(){ - _this.changePassword(); - } - } - ] - }); - var changeEmailForm = Ext.create('Ext.form.Panel', { - title:'Change email', - bodyPadding:15, - width: 350, - height:155, - border:false, - items: [{ - id:this.id+"fldEmail", - name: 'new_email', - xtype:'textfield', - fieldLabel: 'e-mail', -// enableKeyEvents: true, -// emptyText:'please enter your email', - listeners: { - change: function(){ - _this.checkemail(); - } - } - },{ - xtype:'button', - text:'Change',margin:'0 0 0 105', - handler:function(){ - _this.changeEmail(); - } - } - ] - }); - var profileTabPanel = Ext.create('Ext.panel.Panel', { - width: 350, - height:225, - border:false, - tbar:{items:['->',labelPass]}, - layout:'accordion', - items: [changePasswordForm,changeEmailForm], - listeners:{ - tabchange:function(){ - _this.clearAllFields(); - } - } - }); - this.panel = Ext.create('Ext.window.Window', { - title: 'Profile', - resizable: false, - minimizable :true, - constrain:true, - closable:true, - modal:true, - items:[profileTabPanel], - buttonAlign:'center', - buttons:[{ - text:'Close',handler:function(){_this.panel.close();} - }], - listeners: { - scope: this, - minimize:function(){ - this.panel.hide(); - }, - destroy: function(){ - delete this.panel; - } - } - }); - } - this.panel.show(); - }, - checkpass : function (){ - var passwd1 = Ext.getCmp(this.id+'fldNew1').getValue(); - var passwd2 = Ext.getCmp(this.id+'fldNew2').getValue(); - var oldPass = Ext.getCmp(this.id+'fldOld').getValue(); - var patt = new RegExp("[ *]"); - - if(oldPass != ''){ - if(!patt.test(passwd1) && passwd1.length > 3){ - if (passwd1 == passwd2){ - Ext.getCmp(this.id+'labelPass').setText('Passwords match', false); - return true; - }else{ - Ext.getCmp(this.id+'labelPass').setText('Passwords does not match', false); - return false; - } - }else{ - Ext.getCmp(this.id+'labelPass').setText('Password must be at least 4 characters', false); - return false; - } - }else{ - Ext.getCmp(this.id+'labelPass').setText('Old password is empty', false); - return false; - } - - }, - checkemail : function (){ - var email = Ext.getCmp(this.id+'fldEmail').getValue(); - var patt = /^([a-zA-Z0-9_\.\-])+\@(([a-zA-Z0-9\-])+\.)+([a-zA-Z0-9]{2,4})+$/; - - if (patt.test(email)){ - Ext.getCmp(this.id+'fldEmail').setFieldLabel('e-mail', false); - return true; - }else{ - Ext.getCmp(this.id+'fldEmail').setFieldLabel('e-mail', false); - if(email==''){ - Ext.getCmp(this.id+'fldEmail').setFieldLabel('e-mail', false); - } - return false; - } - } -}; - - -function ResultTable(jobId, filename, tags, args){ - var _this = this; - this.id = "ResultTable"+ Math.round(Math.random()*10000000); - this.targetId = null; - - this.jobId = jobId; - this.fileName=filename; - this.tags=tags; - this.numRows=10; - this.flex=null; - this.collapsible=true; - this.border=true; - this.cls=null; - - if(typeof args != 'undefined'){ - this.targetId = args.targetId || this.targetId; - this.numRows = args.numRows || this.numRows; - this.flex = args.flex || this.flex; - this.collapsible = args.collapsible || this.collapsible; - this.border = args.border || this.border; - this.cls = args.cls || this.cls; - this.tableLayout = args.tableLayout || this.tableLayout; - } - - this.adapter = new OpencgaManager(); - - this.table = null; - - this.onRendered = new Event(); - this.onRendered.addEventListener(function (sender, targetId){ - _this.draw(); - }); -}; - - - -ResultTable.prototype.draw = function (){ - this.render(); -}; - -ResultTable.prototype.render = function (){ - var _this = this; - - var rows=null; - - var filteredGridNames = new Array(); - var filteredColNames = new Array(); -// for( var i =0; i < tables.length; i++){ -// if (this.tags.indexOf(tables[i].name)!= -1){//me quedo con la primera que encuentro -// this.tableSkel = tables[i]; -// this.colNames = tables[i].colNames; -// this.colVisibilty = tables[i].colVisibility; -// this.colTypes = tables[i].colTypes; -// rows = tables[i].numRows; -// -// filteredGridNames = new Array(); -// filteredColNames = new Array(); -// for (var j=0;j {'+keys[i].replace(/ /g,"_")+'}      '; - } - str +="

"; - return new Ext.XTemplate( str); -}; - -function ResultWidget(args){ - var _this = this; - this.id = "ResultWidget"+ Math.round(Math.random()*10000); - this.targetId = null; - - if (args != null){ - if (args.targetId!= null){ - this.targetId = args.targetId; - } - if (args.application!= null){ - this.application = args.application; - } - if (args.app!= null){ - this.app = args.app; - } - } - - this.adapter = new OpencgaManager(); - - this.adapter.onJobResult.addEventListener(function (sender, data){ -// console.log(data); - _this.data = JSON.parse(data); - Ext.getBody().unmask(); - _this.panel.setLoading(false); - _this.render(); - }); - - this.panelId=null; - this.networkViewerId = null; - this.genomeMapsId = null; - - this.resultTables = new Object(); - this.resultHistograms = new Object(); - this.resultGCharts = new Object(); - this.variantFiles = new Object(); - -// this.onRendered = new Event(); - - this.onViewRendered = new Event(); - this.onViewRendered.addEventListener(function (sender, targetId){ - _this.drawTables(); - _this.drawHistograms(); - _this.drawGCharts(); - _this.drawApplicationItems(); - }); -}; - -ResultWidget.prototype.draw = function (sid, record){ -// console.log(record.data); - this.record = record; - this.jobId = this.record.data.id; - this.id = this.jobId+this.id; - this.panelId = "ResultWidget_"+this.jobId; - this.networkViewerId = this.panelId+"_CellBrowserId"; - this.genomeMapsId = this.panelId+"_GenomeMapsId"; - - - this.panel = Ext.getCmp(this.panelId); - if(this.panel==null){ - this.panel = Ext.create('Ext.panel.Panel', { - id :this.panelId, - border: 0, - title: this.record.data.name, - closable:true, - autoScroll:true - // html: this.tpl.applyTemplate(outputItems) - }); - - Ext.getCmp(this.targetId).add(this.panel); - Ext.getCmp(this.targetId).setActiveTab(this.panel); - this.panel.setLoading("Loading job info..."); - Ext.getBody().mask(); - - //this.adapter.jobResult(this.jobId, "json", sid); - //accountId, sessionId, bucketname, jobId, format - this.adapter.jobResult($.cookie("bioinfo_account"), sid, this.jobId, "json"); - //this.adapter.jobResult(this.jobId, "json", sid); - }else{ -// this.panel.setLoading(false); - Ext.getCmp(this.targetId).setActiveTab(this.panel); - } -}; - -ResultWidget.prototype.render = function (){ - var _this=this; - - console.log(this.application); - debugger - if(this.data.outputItems.length != 0){ - - var outputItems = this.data.inputItems.concat(this.data.outputItems); - - //obtener todos los grupos quitando los repetidos - var obj = {}; - for(var i = 0; i < outputItems.length; i++){ - var group = outputItems[i].group; - - if(group != "" ){ //no meter items con grupo distinto a "" - if(group.indexOf(".")!=-1){//comprobar si alguno tiene un subgrupo - var parent_group = group.split(".")[0]; - var sub_group = group.split(".")[1]; - if(obj[parent_group]==null) { - obj[parent_group]={}; - } - if(obj[parent_group][sub_group]==null){ - obj[parent_group][sub_group]=[]; - } - - //ESTE if quita los resultados para los pvalue = 0.005, 0.01, 0.1, deja solo los 0.05 - if(this.checkPValue(outputItems[i].title)){ - obj[parent_group][sub_group].push(outputItems[i]); - } - }else { - if(obj[group]==null){ - obj[group]={}; - obj[group]["items"]=[]; - } - - //QUITAR la cadena de texto ${pvalue} si existe y la sustituye por 0.05 - this.renamePValue(outputItems[i]); - obj[group]["items"].push(outputItems[i]); - } - - - } - } - - if(this.application == 'renato' || this.application == 'variant'){ - obj["Interactive Results"]={items:[]}; - } - console.log(obj); - - var topLink = Ext.create('Ext.container.Container', {html:''}); - var info = Ext.create('Ext.container.Container', { - margin: "15 0 5 15", - html:'

The job named '+this.record.data.name+' '+ - 'was launched on '+this.record.data.date+' '+ - //'and has been visited '+this.record.data.visites+' times

'+ - //'You can download the job results by pressing the download button.' - '
' - }); - - var result = []; - //Solo grupos juntos al principio - var i=1; - for (key in obj){ - var groupId = this.jobId+key.replace(/\s/g, '_')+"group"; - var groupBox = Ext.create('Ext.container.Container', { - padding:"0 0 2 15", - width:(key.length*14), - //html:'

'+i+'. '+key+'

' - groupId:groupId, - html:''+i+'. '+key+'', - listeners:{ - afterrender:function(){ - this.getEl().addClsOnOver("ssel u"); - this.getEl().addCls("dedo"); - var groupId = this.groupId; - //inlineblock - this.getEl().on("click",function(){ - var pos = $('#'+groupId).position().top; - $(_this.panel.getEl().dom).children().scrollTop(pos); - }); - } - } - }); - result.push(groupBox); - i++; - } - - //Grupos con resultados a continuacion - var i=1; - for (key in obj){ - //Grupo - var infoId = (this.jobId+key+"info").replace(/ /gi, ""); - var groupId = this.jobId+key.replace(/\s/g, '_')+"group"; - var groupBox = Ext.create('Ext.container.Container', { - infoId:infoId, - groupName:key, - padding:"60 15 5 15", - //html:'

'+i+'. '+key+''+ - //'

', - html:'

'+i+'. '+key+'    ↑'+ - '

', - listeners:{ - afterrender:function(){ - this.getEl().addClsOnOver("ssel"); - this.getEl().addCls("dedo"); - this.getEl().on("click",function(){ - $(_this.panel.getEl().dom).children().scrollTop(0); - }); - - var text = _this.getInfo(this.groupName); - if(text!=""){ - $("#"+this.infoId).html("+info"); - var infoTip = Ext.create('Ext.tip.Tip',{ - html:text, - listeners:{ - show:function(){ - var este = this; - this.getEl().on("mouseleave",function(){ - este.hide(); - }); - } - } - }); - $("#"+this.infoId).mouseover(function(ev){ - $(this).css({cursor:"pointer"}); - infoTip.showAt(ev.clientX,ev.clientY); - }); - $("#"+this.infoId).click(function(){ - infoTip.hide(); - }); - } - - } - } - - }); - result.push(groupBox); - - //Resultados - se le pasa el array de items - result.push(this.getResults(obj[key].items)); - - //Comprobamos si tiene subgrupos 1 - nivel solo - var c = 1; - for(clave in obj[key]){ - if (clave != "items"){ - //Grupo - var groupBox = Ext.create('Ext.container.Container', { - padding:"15 15 5 30", - cls:"inlineblock", - html:'

'+i+'.'+c+' '+clave+'

' - }); - //si la clave es Your annotation tratarlo de otra manera... para mas adelante -// console.log(clave) - result.push(groupBox); - -// debugger - //Resultados - se le pasa el array de items - result.push(this.getResults(obj[key][clave])); - c++; - } - }//subgrupos - i++; - } - - - var downloadButton = Ext.create('Ext.button.Button', { - text: 'Download', - margin: "0 0 25 15", - handler: function (){ - _this.adapter.download(_this.jobId, $.cookie('bioinfo_sid')); - } - }); - - - var deleteJobButton = Ext.create('Ext.button.Button', { - text: 'Delete', - margin: "0 0 25 30", - handler: function (){ - Ext.Msg.confirm("Delete job", "Are you sure you want to delete this job?", function (btnClicked){ -// console.log(btnClicked); - if(btnClicked == "yes") { - _this.adapter.onDeleteJob.addEventListener(function (sender, data){ - var msg = ""; - if(data.response.indexOf("OK") != -1) { - Ext.getCmp(_this.targetId).getActiveTab().close(); - msg = "The job has been succesfully deleted."; - } - else { - msg = "ERROR: could not delete job."; - } - Ext.Msg.alert("Delete job", msg); - }); -// console.log("Job id: "+_this.jobId+" Cookie: "+$.cookie('bioinfo_sid')); - _this.adapter.deleteJob(_this.jobId, $.cookie('bioinfo_sid')); - } - }); - } - }); - - - this.panel.add(topLink); - this.panel.add(info); - //this.panel.add(downloadButton); - //this.panel.add(deleteJobButton); - this.panel.add(result); - - _this.onViewRendered.notify(); - - }//else -}; - - -ResultWidget.prototype.getResults = function (items){ - //Resultados - var boxes = []; - for (var j = 0; j < items.length; j++){ - var item = items[j]; - - //Obtener el container con el resultado - var itemBox = this.showInfo(item); - boxes.push(itemBox); - - //Añadir el container para resultados adicionales segun el type y el tag si procede - var container = this.showTypeInfo(item); - if(container){ - boxes.push(container); - } - var container = this.showTagInfo(item); - if(container!=null){ - boxes.push(container); - } - } - var itemsBox = Ext.create('Ext.container.Container', { - layout: {type: 'table',columns: 1, tableAttrs: {style: {width: '100%'}}}, - items:boxes - }); - return itemsBox; -}; - - -ResultWidget.prototype.showInfo = function (item){ - var _this=this; - - - var itemTpl = new Ext.XTemplate( -// '', -// '{.} :: ', -// '', -// '{type} ', - '{title} ', - '{value}
' - , - { - // XTemplate configuration: - disableFormats: true, - // member functions: - setCSS: function(item){ - switch(item.type){ - case 'FILE': - return 'file'; - break; - case 'MESSAGE': - //Setting species code - if (item.name == "species"){ - _this.species=item.value; - } - return 'message'; - break; - } - } - - }); - //fin template - - return itemBox = Ext.create('Ext.container.Container', { - data:item, - datos:item, - margin:"0 10 0 20", - padding:5, - tpl:itemTpl, - cls:"inlineblock", - listeners:{ - afterrender:function(){ - var datos = this.datos; - if(this.datos.type == 'FILE'){ - this.getEl().addClsOnOver("encima"); - this.getEl().addCls("whiteborder"); - - if(_this.application=="variant" && datos.title.toLowerCase().indexOf("filter")!=-1){ - _this.filteredVcfFile=datos.value; - } - - this.getEl().on("click",function(){ - console.log(datos); - var value = datos.value.trim(); - _this.adapter.poll($.cookie('bioinfo_account'),$.cookie('bioinfo_sid'), _this.jobId, value, true); - }); - } - } - } - }); -}; - - -ResultWidget.prototype.showTypeInfo = function (item){ - var _this=this; - var box = Ext.create('Ext.container.Container',{ - margin:"0 10 0 10", - padding:5 - }); - switch(item.type){ - case 'IMAGE': - /*width="400" height="200" */ - var filename = item.value.trim(); - box.html = '
'; - return box; - break; - default: return null; - } -}; - -ResultWidget.prototype.showTagInfo = function (item){ - var _this=this; - var box = Ext.create('Ext.container.Container',{ - margin:"0 10 0 10", - flex:1, - padding:5, - html:"" - }); - for(var i = 0; i < item.tags.length ; i++){ - switch(item.tags[i]){ - case 'TABLE': - var value = item.value.trim(); - var id = _this.jobId+value+item.tags; - _this.resultTables[id] = new ResultTable (_this.jobId, value, item.tags,{targetId:'resultTable_'+id}); -// _this.resultTables[id].onRendered. - box.html += '
'; - return box; - break; - case 'HISTOGRAM': - var id = "histogram_"+_this.jobId+item.value+item.tags; - _this.resultHistograms[id] = item.value; - box.html = '
'; - return box; - break; - case 'GCHART': - var id = 'gchart_'+item.name; - _this.resultGCharts[id] = item.value; - box.html = '
'; - return box; - break; - case 'CONSEQUENCE_TYPE_VARIANTS': - this.variantFiles[item.name] = item.title; - break; - } - } - return null; -}; - -ResultWidget.prototype.drawTables = function (){ -// console.log(this.resultTables); - for(id in this.resultTables){ - this.resultTables[id].draw(); - } -}; - -ResultWidget.prototype.drawHistograms = function (){ - //se dibujan todas las tablas -// console.log(this.resultHistograms); - for(id in this.resultHistograms){ - - var adapterPoll = new OpencgaManager(); - adapterPoll.onPoll.addEventListener(function(sender,data){ - if(data!=""){ - var lines = data.split("\n"); - var fields=[]; - var names=[]; - var values=[]; - var normValues=[]; - var total = 0; - for ( var i = 0; i < lines.length; i++) { - fields.push(lines[i].split("\t")); - if(fields[i][0]!=""){ - names.push(fields[i][0]); - } - if(fields[i][1]!=null){ - total = total + parseFloat(fields[i][1]); - values.push(fields[i][1]); - } - } - for ( var i = 0; i < values.length; i++) { - normValues.push(Math.round(parseFloat(values[i])/total*100)); - } - names = names.toString().replace(/,/gi,"|"); - var img = ''; - document.getElementById(id).innerHTML=img; - } - }); - - //adapterPoll.poll(this.jobId,this.resultHistograms[id],false,$.cookie('bioinfo_sid')); - adapterPoll.poll($.cookie("bioinfo_account"), $.cookie('bioinfo_sid'), this.jobId, this.resultHistograms[id], false); - } -}; -ResultWidget.prototype.drawGCharts = function (){ - for(id in this.resultGCharts){ - drawChart(id, this.resultGCharts[id]); - } -}; - -ResultWidget.prototype.drawApplicationItems = function (){ - var _this=this; - var viewerContainer = Ext.create('Ext.container.Container', { - id:this.application+this.id+"Container", - border: true, - margin:"50 50 0 50", - html:'
' - }); - - switch (this.application){ - case "variant": - viewerContainer.on("afterrender",function(){ - _this.createGenomeViewer(_this.id+"Container"); - }); - break; - case "renato": - //***********bar - var pbar = Ext.create('Ext.ProgressBar', {id:this.id+'pbar',margin:"5 0 0 50",width: 500}); - // Wait for 5 seconds, then update the status el (progress bar will auto-reset) - pbar.wait({ - interval: 500, //bar will move fast! - duration: 50000, - increment: 15, - text: 'Getting database information and drawing the network, please wait...', - scope: this, - fn: function(){ - pbar.updateText('Done!'); - } - }); - //Add de bar to the main panel - this.panel.add(pbar); - /*************************/ - viewerContainer.on("afterrender",function(){ - _this.createCellBrowser(_this.id+"Container"); - }); - break; - - default: return null; - } - - this.panel.add(viewerContainer); -}; - - -ResultWidget.prototype.createGenomeViewer = function (targetId){ - var _this = this; - - var width = Ext.getCmp(this.application+targetId).getWidth(); - var height = Ext.getCmp(this.application+targetId).getHeight(); - - //var genomeViewer = new GenomeViewer(targetId, AVAILABLE_SPECIES[0],{ - //version:"", - //zoom:75, - //width:width-2, - //height:height-2 - //}); - //genomeViewer.setMenuBar(this.getGenomeViewerResultBar(genomeViewer)); - - - genomeViewer = new GenomeViewer(targetId, DEFAULT_SPECIES,{ - sidePanelCollapsed:true, - width:width-2, - height:700-2 - }); - genomeViewer.afterRender.addEventListener(function(sender,event){ - _this.app.setTracks(genomeViewer); - genomeViewer.addSidePanelItems(); - var variantFilterWidget = new VariantFilterWidget(_this.jobId,{ - width:width-2, - targetId:_this.application+targetId, - viewer:genomeViewer, - fileNames:_this.variantFiles - }); - }); - genomeViewer.draw(); - - var adapter = new OpencgaManager(); - adapter.onPoll.addEventListener(function(sender, data){ - if(data.indexOf("ERROR")!=1){ - console.error(data); - } - var vcfDataAdapter = new VCFDataAdapter(new StringDataSource(data),{async:false,species:genomeViewer.species}); - var vcfTrack = new TrackData("VCF file",{ - adapter: vcfDataAdapter - }); - genomeViewer.addTrack(vcfTrack,{ - id:"VCF file", - featuresRender:"MultiFeatureRender", - histogramZoom:50, - height:150, - visibleRange:{start:0,end:100}, - featureTypes:FEATURE_TYPES - }); - //var feature = vcfDataAdapter.featureCache.getFirstFeature(); - //genomeViewer.region.load(feature); - //genomeViewer.setRegion({sender:""}); -// genomeViewer.setZoom(75); - }); - - -// console.log(this.filteredVcfFile) - if(this.filteredVcfFile != null){ - adapter.poll($.cookie("bioinfo_account"), $.cookie('bioinfo_sid'), _this.jobId, this.filteredVcfFile, false); - //adapter.poll(_this.jobId, this.filteredVcfFile, false, $.cookie('bioinfo_sid')); - }else{ - console.log("No filtered VCF file."); - } -}; - - - -var mostSignificativesFeatures = new Array(); -ResultWidget.prototype.createCellBrowser = function (targetId){ - var _this = this; - record = this.record; - - //hide network-viewer, all nodes mut be rendered before show - Ext.getCmp(this.application+targetId).disable(); - - var width = Ext.getCmp(this.application+targetId).getWidth(); - var height = Ext.getCmp(this.application+targetId).getHeight(); - - //Pako creating cellBrowser - this.networkViewer = new NetworkViewer(targetId,this.getSpeciesItem(this.species),{ - width:width-2, - height:height-2 - }); -// this.networkViewer.setSpeciesMenu(AVAILABLE_SPECIES); - this.networkViewer.draw(); - - - - - //setting a empty data and format, nodes will be draw later using the interface - var dataset = new GraphDataset(); - var layout = new LayoutDataset(); - var formatter = new NetworkDataSetFormatter({ - "defaultFormat": {"type":"LineEdgeNetworkFormatter","opacity":1, "fill":"#000000", "radius":"5", "strokeWidth":"1", "stroke":"#000000", "size":"2", "title":{"fontSize":10, "fill":"#000000"}}, - "selected": {"opacity":0.9, "fill":"#FF0000", "radius":"5", "stroke":"#000000", "size":"2"}, - "over": {"opacity":1, "fill":"#DF0101", "radius":"5", "stroke":"#000000", "size":"2", "strokeWidth":"1"} - }, - { - "defaultFormat": { "opacity":0.8,"stroke":"#000000", "strokeWidth":"1", "strokeOpacity":0.5, "title":{"fontSize":6, "fontColor":"#000000"}}, - "selected": {"stroke":"#DF0101", "fill":"#FF0000"}, - "over": { "stroke":"#DF0101","strokeOpacity":1, "strokeWidth":"4"} - }, -// { "labeled":false, "height":height,"width":this.width,"right":this.width,"backgroundColor":"#FFFFFF", "balanceNodes":false, "nodesMaxSize":4, "nodesMinSize":2}); - { "labeled":false, "backgroundColor":"#FFFFFF", "balanceNodes":false, "nodesMaxSize":4, "nodesMinSize":2}); - formatter.dataBind(dataset); - layout.dataBind(dataset); - - formatter.setHeight(height - 140); - formatter.setWidth(width-2-13); - this.networkViewer.drawNetwork(dataset, formatter, layout); - - - - //Getting significant_your_annotation_0.05.txt - var adapter2 = new WumRestAdapter(); - adapter2.onPoll.addEventListener(function(sender, data){ - var lines = data.split("\n"); - var significativesFeatures = new Array(); - for ( var i = 1; i < lines.length; i++) { - var column = 13; - if(record.data.toolName == "fatiscan"){ - if(lines[i].split("\t").length==7){ - //we are in the case of logistic model - column = 6; - } - } - var significativeValue = lines[i].split("\t")[column]; - if(significativeValue < 1000000){ - significativesFeatures.push(lines[i].split("\t")[0]); - } - } - console.log('significativesFeatures.length: '+significativesFeatures.length); - - - /** TFBS **/ - var adapter3 = new WumRestAdapter(); - adapter3.onPoll.addEventListener(function(sender, data){ - var genes = data.split("\n"); - /** Para elminar la linea en blanco: Gorrion Rules! **/ - genes.pop(); - console.log('genes.length: '+genes.length); - _this.loadNetworkOnCellBrowser(genes, significativesFeatures, targetId); - }); - - var file = "clean_list1.txt"; - if(record.data.toolName == "fatiscan") - file = "id_list.txt"; - adapter3.poll(_this.jobId, file, false, $.cookie('bioinfo_sid')); - }); - adapter2.poll(this.jobId, "significant_your_annotation_0.05.txt", false, $.cookie('bioinfo_sid')); - //END getting significant_your_annotation_0.05.txt - - - - - // By Nacho - // getting 50 most significant genes - console.log('getting ranked_list...'); - var cleanListWumAdapater = new WumRestAdapter(); - cleanListWumAdapater.onPoll.addEventListener(function(sender, data) { - var lines = data.split("\n"); - var numGenes = lines.length; - var cont = 0; - console.log('getting top clean_list...'); - for(var i = 0; cont < 50 && i < numGenes; i++) { - if(lines[i].indexOf('#') < 0) { -// console.log('getting top ranked_list... '+lines[i]); -// console.log('getting top ranked_list... '+lines[i].split("\t")[0]); - mostSignificativesFeatures[lines[i].split("\t")[0]] = true; - cont++; - } - } - cont = 0; - console.log('getting bottom clean_list...'); - for(var i = numGenes-1; cont < 50 && i > 0; i--) { - if(lines[i].indexOf('#') < 0) { - mostSignificativesFeatures[lines[i].split("\t")[0]] = true; - cont++; - } - } - }); - cleanListWumAdapater.poll(this.jobId, "clean_list1.txt", false, $.cookie('bioinfo_sid')); - // END getting 50 most significant genes - - - - - // getting ranked_list - console.log('getting ranked_list...'); - var rankedListWumAdapater = new WumRestAdapter(); - rankedListWumAdapater.onPoll.addEventListener(function(sender, data) { - var lines = data.split("\n"); - var numGenes = lines.length; - var cont = 0; - console.log('getting top ranked_list...'); - for(var i = 0; cont < 50 && i < numGenes; i++) { - if(lines[i].indexOf('#') < 0) { - mostSignificativesFeatures[lines[i].split("\t")[0]] = true; - cont++; - } - } - cont = 0; - console.log('getting bottom ranked_list...'); - for(var i = numGenes-1; cont < 50 && i > 0; i--) { - if(lines[i].indexOf('#') < 0) { - mostSignificativesFeatures[lines[i].split("\t")[0]] = true; - cont++; - } - } - }); - rankedListWumAdapater.poll(this.jobId, "ranked_list.txt", false, $.cookie('bioinfo_sid')); - //END getting ranked_list - -}; - - -ResultWidget.prototype.loadNetworkOnCellBrowser = function (genes, tfbs, targetId){ - var _this = this; - - //tfbs and mirna nodes are rendered - //2 indicates that mirna and tfbs are done - var nodesRendered = 0; - - //Getting tfbs by gene - var cellBaseManager = new CellBaseManager(this.networkViewer.species); - cellBaseManager.success.addEventListener(function (evt, response){ - var data_tfbs = response.result; - var tfbsByGene = new Object(); - for (var i = 0; i < data_tfbs.length; i++){ - for ( var j = 0; j < data_tfbs[i].length; j++) { - if(tfbs.toString().indexOf(data_tfbs[i][j].tfName) != -1){ - if (tfbsByGene[data_tfbs[i][j].tfName] == null){ - tfbsByGene[data_tfbs[i][j].tfName] = new Object(); - } - - if(tfbsByGene[data_tfbs[i][j].tfName][genes[i]] == null){ - tfbsByGene[data_tfbs[i][j].tfName][genes[i]] = true; - } - } - } - } - console.log(tfbsByGene); - console.log(data_tfbs.length); - console.log('contando TFBSs...'); - // check the number of elemts to be rendered - // if there are more than 500 then select the most significant - var numElements = 0; - for ( var tf in tfbsByGene) { - if(numElements > 500) { - break; - } - for ( var gene in tfbsByGene[tf]) { - numElements++; - } - } - console.log('menos de 500: '+numElements); - for ( var tf in tfbsByGene) { - _this.networkViewer.networkWidget.getDataset().addNode(tf, {type:"tf"}); - var verticeId = _this.networkViewer.networkWidget.getDataset().getVerticesCount() - 1; - _this.networkViewer.networkWidget.getFormatter().getVertexById(verticeId).getDefault().setFill("#DF0101"); - -// console.log(tfbsByGene[tf]); -// console.log(_this.networkViewer.networkWidget.getFormatter().getVertexById(verticeId)); - for ( var gene in tfbsByGene[tf]) { - if(numElements < 500 || mostSignificativesFeatures[gene] == true) { -// console.log(gene); - /** Conecto los tfbs con sus genes **/ - if(_this.networkViewer.networkWidget.getDataset().getVertexByName(gene).length == 0){ - _this.networkViewer.networkWidget.getDataset().addNode(gene, {type:"gene"}); - } - -// console.log(_this.networkViewer.networkWidget.getDataset()); - // getVertexByName returns an array - - var vertexGeneId = _this.networkViewer.networkWidget.getDataset().getVertexByName(gene)[0].id; - var vertexTfbsId = _this.networkViewer.networkWidget.getDataset().getVertexByName(tf)[0].id; - _this.networkViewer.networkWidget.getDataset().addEdge("tfbs_" + vertexGeneId + "_" + vertexTfbsId, vertexTfbsId, vertexGeneId); - _this.networkViewer.networkWidget.getFormatter().getVertexById(vertexGeneId).getDefault().setFill("#0000FF"); - } - } - } - - - _this.networkViewer.networkWidget.getLayout().getLayout("neato"); - _this.networkViewer.networkWidget.getLayout().layoutDone.addEventListener(function (evt){ - nodesRendered++; - if(nodesRendered==2){ - Ext.getCmp(_this.id+'pbar').destroy(); - Ext.getCmp(_this.application+targetId).enable(); - } - }); - }); - if(genes.length>0){ - cellBaseManager.get("feature", "gene", genes, "tfbs"); - } - //getting mirna target by gene - var cellBaseManagerMirna = new CellBaseManager(this.networkViewer.species); - cellBaseManagerMirna.success.addEventListener(function (evt, response){ - var data_tfbs = response.result; - var tfbsByGene = new Object(); - for (var i = 0; i < data_tfbs.length; i++){ - for ( var j = 0; j < data_tfbs[i].length; j++) { - - if(tfbs.toString().indexOf(data_tfbs[i][j].mirbaseId) != -1){ - if (tfbsByGene[data_tfbs[i][j].mirbaseId] == null){ - tfbsByGene[data_tfbs[i][j].mirbaseId] = new Object(); - } - - if(tfbsByGene[data_tfbs[i][j].mirbaseId][genes[i]] == null){ - tfbsByGene[data_tfbs[i][j].mirbaseId][genes[i]] = true; - } - } - } - } - console.log(tfbsByGene); - console.log(data_tfbs.length); - console.log('contando miRNAs...'); - // check the number of elemts to be rendered - // if there are more than 500 then select the most significant - var numElements = 0; - for ( var tf in tfbsByGene) { - if(numElements > 500) { - break; - } - for ( var gene in tfbsByGene[tf]) { - numElements++; - } - } - console.log('menos de 500: '+numElements); - for ( var mirna in tfbsByGene) { - _this.networkViewer.networkWidget.getDataset().addNode(mirna, {type:"mirna"}); - var verticeId = _this.networkViewer.networkWidget.getDataset().getVerticesCount() - 1; - _this.networkViewer.networkWidget.getFormatter().getVertexById(verticeId).getDefault().setFill("red"); - for ( var gene in tfbsByGene[mirna]) { - if(numElements < 500 || mostSignificativesFeatures[gene] == true) { -// console.log(gene); - if(_this.networkViewer.networkWidget.getDataset().getVertexByName(gene).length == 0){ -// if(_this.networkViewer.networkWidget.getDataset().getVertexByName(gene) == null) { - _this.networkViewer.networkWidget.getDataset().addNode(gene, {type:"gene"}); - } - - var vertexGeneId = _this.networkViewer.networkWidget.getDataset().getVertexByName(gene)[0].id; - var vertexTfbsId = _this.networkViewer.networkWidget.getDataset().getVertexByName(mirna)[0].id; - _this.networkViewer.networkWidget.getDataset().addEdge("tfbs_" + vertexGeneId + "_" + vertexTfbsId, vertexTfbsId, vertexGeneId); - _this.networkViewer.networkWidget.getFormatter().getVertexById(vertexGeneId).getDefault().setFill("blue"); - - var edgeId = _this.networkViewer.networkWidget.getDataset().getEdgesCount() - 1; - - - _this.networkViewer.networkWidget.getFormatter().changeEdgeType(edgeId, "CutDirectedLineEdgeNetworkFormatter"); - } - - } - } - - - _this.networkViewer.networkWidget.getLayout().getLayout("neato"); - _this.networkViewer.networkWidget.getLayout().layoutDone.addEventListener(function (evt){ - nodesRendered++; - if(nodesRendered==2){ - Ext.getCmp(_this.id+'pbar').destroy(); - Ext.getCmp(_this.application+targetId).enable(); - } - }); - - }); - if(genes.length>0){ - cellBaseManagerMirna.get("feature", "gene", genes, "mirna_target"); - }else{ - Ext.getCmp(_this.id+'pbar').destroy(); - Ext.getCmp(_this.application+targetId).enable(); - } -}; - - - -ResultWidget.prototype.getGenomeViewerResultBar = function(genomeViewer) { - var _this=this; - - switch (this.application){ - case "variant": - var toolbarMenu = Ext.create('Ext.container.Container', { - cls:'bio-toolbar', - defaults:{margin:'1 0 0 2'}, - layout:'vbox', - height:27, - items : [ - {xtype:'button',text:'Variant filter tool...',handler:function(){ - var variantFilterWidget = new VariantFilterWidget(_this.jobId,{viewer:genomeViewer,fileNames:_this.variantFiles}); -// variantFilterWidget.draw(); -// variantFilterWidget.parseData(data); -// var wumRestAdapter = new WumRestAdapter(); -// wumRestAdapter.onPoll.addEventListener(function(sender, data){ -// }); - -// wumRestAdapter.poll(_this.jobId, "variant.txt", false, $.cookie('bioinfo_sid')); - } - } - ] - }); - return toolbarMenu; - break; - - - default: return null; - } -}; - - -ResultWidget.prototype.getSpeciesItem = function(species) { - //selecciona el objeto AVAILABLE_SPECIES segun el species code - for ( var i = 0; i < AVAILABLE_SPECIES.length; i++) { - if(AVAILABLE_SPECIES[i].species==species){ - return AVAILABLE_SPECIES[i]; - } - } -}; - -//Quita los resultados para your annotation -ResultWidget.prototype.checkPValue = function(str) { - //return false si es 0.005, 0.01 ó 0.1 - if(str.indexOf("pvalue<0.005")!= -1 || - str.indexOf("pvalue<0.01")!= -1 || - str.indexOf("pvalue<0.1")!= -1 - ){ - return false; - } - return true; -}; - -//Quita los resultados para your annotation -ResultWidget.prototype.renamePValue = function(item) { - //reemplaza la cadena ${pvalue} por 0.05 - if(item.value.indexOf("${pvalue}") != -1){ - item.value = item.value.replace(/\$\{pvalue\}/gi, "0.05"); - } -}; - -//XXX no se usa por ahora...Para mas adelante -ResultWidget.prototype.setPValue = function(value) { - console.log(this.id); - var divId="#pvalue"+this.id; - $(divId).html(value); -}; - -//Quita los resultados para your annotation -ResultWidget.prototype.getInfo = function(groupName) { - switch (this.application){ - case "renato": - switch (groupName){ - case "Input data": return "This section is a reminder of the parameters or settings you have submitted to run the analysis."; - case "Summary": return "

This section shows the number of genes annotated to each database in each list.


Gene list: contains three elements, the number of genes in your gene list annotated in the database over the total number of genes remaining in your gene list after the duplicates management, a percentage of genes in your gene list annotated in the database and the ratio of regulators per gene.
Genome: the same structure explained above but applied to the whole genome (TFBS or miRNA) or Your Annotations after the duplicates management.

"; - case "Significant Results": return "

We consider a significant enrichment after correcting the results by a multiple testing correction method. Enrichment p-values are corrected applying the False discovery rate (FDR) method (Benjamini et al., 1995; Storey andTibshirani, 2003). The threshold of signification applied to the correction has been set to 0.05.


The table provided summarizes the information about the enrichment test for each of the significant regulatory elements that have an Adjusted p-value < 0.05. The table is originally sorted by adjusted p-value and can be sorted up and down by clicking in any of the other column headings. When the number of significant results in a table is higher than five, results are split into different pages. You can move forward or backward in the page list using the arrow buttons.

"; - case "All results": return "This section contains a downloadable individual text file containing all results for all significant and not significant regulators. This file follows the same structure described above."; - case "Annotation files": return "

When significant results are obtained, we can suppose that there is one or several regulatory elements behaving different when comparing groups. The list of genes included in the analysis have pointed to a significantly over-represented set of common regulators to these genes. The interpretation of the results will be different in the case of TFs (transcription factors) and miRNAs given that (generally) the first are positive regulators and the latter are negative regulators.


TFs generally bind to the promoter region of their target genes to assist and promote the transcription. miRNAs, on the other hand, bind to transcript products preventing them from being translated. Significant TF and miRNAs can be pointed to be responsible for the differential expression of the genes observed in the list. We must take special care in the interpretation of over-expressed or under-expressed genes in a functional analysis. In the case of TFs, if we are working with the list of over-expressed genes, the significant results makes reference to active TFs in one condition with respect to the other; while significant results of under-expressed genes makes reference to inactive TFs. In miRNAs, significant results of over-expressed genes will point to inactive miRNAs, while significant results of under-expressed genes will point to active miRNAs when comparing conditions.

"; - default: return ""; - } - break; - case "variant": - switch (groupName){ - case "Variants by Consequence Type": return "Click this link: Output columns"; - default: return ""; - } - break; - - default: return ""; - } -}; - -function ResultWidget(args) { - var _this = this; - - //set default args - this.extItems = []; - - //set instantiation args, must be last - _.extend(this, args); - - this.adapter = new OpencgaManager(); - - this.panelId = null; - this.networkViewerId = null; - this.genomeMapsId = null; -} - -ResultWidget.prototype = { - id: "ResultWidget" + Math.round(Math.random() * 10000), - draw: function (sid, record) { - var _this = this; - this.job = record.raw; - - this.job['command'] = this.parseCommand(this.job); - - this.jobId = this.job.id; - this.id = this.jobId + this.id; - this.panelId = "ResultWidget_" + this.jobId; - - this.panel = Ext.getCmp(this.panelId); - if (this.panel == null) { - this.panel = Ext.create('Ext.panel.Panel', { - id: this.panelId, - border: 0, - title: this.job.name, - closable: true, - autoScroll: true - }); - - Ext.getCmp(this.targetId).add(this.panel); - Ext.getCmp(this.targetId).setActiveTab(this.panel); - this.panel.setLoading("Loading job info..."); - - - var url = this.adapter.jobResultUrl($.cookie("bioinfo_account"), sid, this.jobId, "json"); - console.log(url); - $.getScript(url, function () { - _this.panel.setLoading(false); - var layout = RESULT[_this.job.toolName].layout; - layout.outputItems = _this.job.outputData.sort(layout.sortOutputItems); - _this.render(RESULT); - }); - } else { - Ext.getCmp(this.targetId).setActiveTab(this.panel); - } - }, - render: function (resultData) { - var _this = this; - console.log(this.application); - - var getJobInfo = function (args) { - var args = args || {}; - var itemTpl = new Ext.XTemplate( - '

Information     Job Id: {id}


', - '

{name} - {toolName} - {date}

', - '

{description}

', - '

{command.html}

' - ); - var container = Ext.create('Ext.container.Container', { - margin: '15 0 15 15', - items: [ - { - xtype: 'box', - data: _this.job, - tpl: itemTpl - }, - { - xtype: 'container', layout: 'hbox', margin: '10 0 0 0', defaults: {margin: '0 5 0 5'}, - items: [ - { - xtype: 'button', - text: 'download', - handler: function () { - _this.adapter.downloadJob($.cookie('bioinfo_account'), $.cookie('bioinfo_sid'), _this.jobId); - } - }, - { - xtype: 'button', - text: 'delete', - handler: function () { - Ext.Msg.confirm("Delete job", "Are you sure you want to delete this job?", function (btnClicked) { - if (btnClicked == "yes") { - _this.adapter.onDeleteJob.addEventListener(function (sender, data) { - var msg = ""; - if (data.indexOf("OK") != -1) { - Ext.getCmp(_this.targetId).getActiveTab().close(); - msg = "The job has been succesfully deleted."; - } else { - msg = "ERROR: could not delete job."; - } - Ext.Msg.alert("Delete job", msg); - }); - _this.adapter.deleteJob($.cookie('bioinfo_account'), $.cookie('bioinfo_sid'), _this.jobId); - } - }); - } - } - ] - } - ] - }); - if (typeof args.items != 'undefined') { - container.child('container').add(args.items); - } - return container; - }; - - var getResultIndex = function (children) { - var boxes = [ - {xtype: 'box', cls: 'inlineblock ssel border-bot s120', html: 'Index', margin: 15} - ]; - for (var i = 0; i < children.length; i++) { - boxes.push(Ext.create('Ext.Component', { - margin: "0 15 0 15", - cls: 'dedo emph', - overCls: 'err', - resultId: _this.jobId + children[i].title.replace(/ /g, ''), - html: children[i].title, - listeners: { - afterrender: function (este) { - this.getEl().on("click", function () { - var pos = $('#' + este.resultId).position(); - if (typeof pos != 'undefined') { - var top = pos.top; - $(_this.panel.getEl().dom).children().scrollTop(top - 10); - } - - var tab = Ext.getCmp(este.resultId);//for tab mode - var parent = tab.up(); - if (parent.isXType('tabpanel')) { - parent.setActiveTab(tab); - } - }); - } - } - })); - } - return Ext.create('Ext.container.Container', { - margin: '0 0 20 0', - items: boxes - }); - }; - - var itemTpl = new Ext.XTemplate( - '{title}', - ' {pathi} ', - ' {date}
' - ); - - var processLeafItem = function (item) { - var boxes = []; - var itemBox; - for (var j = 0; j < item.renderers.length; j++) { - var renderer = item.renderers[j]; - switch (renderer.type) { - case 'file': - itemBox = Ext.create('Ext.Component', { - html: '' + item.title + '' + item.file + '', - item: item, - padding: 3, - overCls: 'encima', - cls: 'inlineblock whiteborder', - listeners: { - afterrender: function () { - var item = this.item; - this.getEl().on("click", function () { - console.log(item); - _this.adapter.poll($.cookie('bioinfo_account'), $.cookie('bioinfo_sid'), _this.jobId, item.file, true); - }); - } - } - }); - break; - case 'image': - itemBox = Ext.create('Ext.Component', { - html: '
' - }); - break; - case 'grid': - var id = 'resultTable_' + _this.jobId + item.file; - var resultTable = new ResultTable(_this.jobId, item.file, item.tags, {targetId: id, tableLayout: renderer.tableLayout}); - itemBox = Ext.create('Ext.Component', { - flex: 1, - resultTable: resultTable, - html: '
', - listeners: { - afterrender: function (este) { - este.resultTable.draw(); - } - } - }); - break; - case 'table': - var url = _this.adapter.pollurl($.cookie('bioinfo_account'), $.cookie('bioinfo_sid'), _this.jobId, item.file); - $.ajax({ - type: "GET", - async: false, - url: url, - success: function (data) { - var tableHtml = ''; - var lines = data.split('\n'); - var numLines = 0; - for (var i = 0; i < lines.length; i++) { - var line = lines[i]; - if (line.charAt(0) != '#' && line.trim() != '') { - numLines++; - if (renderer.header && numLines == 1) { - tableHtml += ''; - } else { - tableHtml += ''; - } - var fields = line.split('\t'); - for (var j = 0; j < fields.length; j++) { - var field = fields[j]; - tableHtml += ''; - } - tableHtml += ''; - } - } - tableHtml += '
' + field + '
'; - - itemBox = Ext.create('Ext.Component', { - flex: 1, - html: tableHtml - }); - - } - }); - break; - - } - boxes.push(itemBox); - } - return Ext.create('Ext.container.Container', { - title: item.title, - margin: '0 0 15 0', - items: boxes - }); - }; - - /* Process recursively the result structure */ - var getDetailsAsDocument = function (item, isRoot) { - var boxes; - if (typeof item.children != 'undefined') { - if (typeof item.children == 'function') { - item.children = item.children(); - } - boxes = []; - for (var i = 0; i < item.children.length; i++) { - boxes.push(getDetailsAsDocument(item.children[i])); - } - if (isRoot == true) { - var detailsItemsContainer = { - xtype: 'container', - items: boxes - }; - if (item.presentation == 'tabs') { - detailsItemsContainer = { - xtype: 'tabpanel', - padding: '0 30 15 15', - plain: true, - border: 0, - defaults: { - overflowX: 'scroll', - height: 2000, - padding: 10 - }, - items: boxes - }; - } - return Ext.create('Ext.container.Container', { - title: item.title, - items: [ - { - xtype: 'box', - cls: 'inlineblock ssel border-bot s120', margin: '15', - html: 'Details' - }, - detailsItemsContainer - ] - }); - } else { - - if(_.isUndefined(item.title)){ - - debugger - } - - return Ext.create('Ext.container.Container', { - id: _this.jobId + item.title.replace(/ /g, ''), - title: item.title, - margin: '0 0 0 10', - items: [ - { - xtype: 'box', - overCls: 'dedo', - cls: 'panel-border-bottom', margin: '0 0 10 0', - data: item, tpl: itemTpl, - listeners: { - afterrender: function () { - this.getEl().on("click", function () { - $(_this.panel.getEl().dom).children().scrollTop(0); - }); - } - } - }, - { - xtype: 'container', - items: boxes - } - ] - }); - } - } else { - return processLeafItem(item); - } - }; - - var detailedResutls = getDetailsAsDocument(resultData[this.job.toolName].layout, true); - var indexResutl = getResultIndex(resultData[this.job.toolName].layout.children); - this.panel.add(getJobInfo({items: this.extItems})); - this.panel.insert(indexResutl); - this.panel.add(detailedResutls); - - },//end render - parseCommand: function (item) { - var commandObject = {}; - var commandArray = item.commandLine.split(/ -{1,2}/g); - var tableHtml = ''; - tableHtml += ''; - tableHtml += ''; - tableHtml += ''; - tableHtml += ''; - for (var i = 1; i < commandArray.length; i++) { - //ignore first argument - var paramenter = commandArray[i]; - var paramenterArray = paramenter.split(/ {1}/g); - var name = ''; - var value = ''; - if (paramenterArray.length < 2) { - name = paramenterArray[0]; - value = 'This paramenter is a flag'; - } else { - name = paramenterArray[0]; - value = paramenterArray[1]; - } - commandObject[name] = value; - /* clean values for viz*/ - value = value.replace('/httpd/bioinfo/opencga/analysis/pathiways/examples/', ''); - value = value.replace('/httpd/bioinfo/opencga/accounts/', ''); - value = value.replace(/,/g, ", "); - - tableHtml += ''; - tableHtml += ''; - tableHtml += ''; - tableHtml += ''; - } - tableHtml += '
ParameterValue
' + name + '' + value + '
'; - return {html:tableHtml, data:commandObject}; - } -}; -function UploadWidget (args){ - var _this=this; - this.id = Utils.genId("uploadWidget"); - this.targetId = null; - this.suiteId=null; - this.chunkedUpload=false; - - if(typeof args !== 'undefined'){ - this.targetId = args.targetId || this.targetId; - this.suiteId = args.suiteId || this.suiteId; - this.opencgaBrowserWidget = args.opencgaBrowserWidget || this.opencgaBrowserWidget; - this.chunkedUpload = args.chunkedUpload || this.chunkedUpload; - } - this.adapter = new OpencgaManager(); - this.adapter.onUploadObjectToBucket.addEventListener(function(sender,res){ - if(res.status == 'done'){ - -// _this.adapter.onIndexer.addEventListener(function(sender,data){ -// console.log(data); -// _this.uploadComplete(data); -// }); -// _this.adapter.indexer($.cookie("bioinfo_account"),_this.objectID); - console.log(_this.objectID); - _this.uploadComplete(res.data); - }else if (res.status == 'fail'){ - _this.uploadFailed(res.data); - } - }); - - this.uploadButtonId = this.id+'_uploadButton'; - this.uploadFieldId = this.id+'_uploadField'; - - this.selectedDataType = null; -} - -//UploadWidget.prototype.getsdf = function(){ -// return this.id+'_uploadButton'; -//}; - -UploadWidget.prototype = { - getTypeValidation : function(types){ - return function(filename){ - var regex = new RegExp('^.*\\.('+types+')$', 'i'); - return regex.test(filename); - } - } -}; - - -UploadWidget.prototype.draw = function(opencgaLocation){ - this.opencgaLocation = opencgaLocation; - var dataTypes = {}; - dataTypes["9"]=[ - { text: "ID List", children: [ - { text: "SNP", tag:"idlist:snp"},//el tag es para introducirlo en la base de datos al subir los datos - { text: "Gene/Transcript",tag:"idlist:gene:transcript"}//si son varios van separados por -> : - ] }, - { text: "Feature", children: [ - { text: "VCF 4.0", tag:"vcf", validate:this.getTypeValidation('vcf')}, -// { text: "Tabix index", tag:"tbi"}, - { text: "GFF2", tag:"gff2"}, - { text: "GFF3", tag:"gff3"}, - { text: "GTF", tag:"gtf"}, - { text: "BED", tag:"bed"}, - { text: "BAM", tag:"bam", validate:this.getTypeValidation('bam')}, - { text: "BAI", tag:"bai", validate:this.getTypeValidation('bai')}, - { text: "Expression", tag:"expression"} - ] } - ]; - dataTypes["6"]=[ - { text: "Feature", children: [ - { text: "VCF 4.0", tag:"vcf"}, - { text: "GFF2", tag:"gff2"}, - { text: "GFF3", tag:"gff3"}, - { text: "GTF", tag:"gtf"}, - { text: "BED", tag:"bed"} - ] } - ]; - dataTypes["11"]=[ - {text : "Annotation", tag:"annotation"}, - {text : "ID List", children : [ - { text : "Gene",tag : "idlist:gene" }, - { text : "Ranked", tag : "ranked" } - ] - } ]; - dataTypes["12"]=[ - {text : "Abundances", tag:"abundances"} - ]; - dataTypes["100"]=[ - {text : "Sequence", tag:"sequence"} - ]; - dataTypes["22"]=[ - {text : "Tabbed text file", tag:"txt", validate:this.getTypeValidation('txt|text')}, - {text : "CEL compressed file", tag:"cel", validate:this.getTypeValidation('zip|tar|tar.gz|tgz')} - ]; - switch (this.suiteId){ - case 9: this.checkDataTypes(dataTypes["9"]); this.render(dataTypes["9"]); break; - case 6: this.checkDataTypes(dataTypes["6"]); this.render(dataTypes["6"]); break; - case 11: this.checkDataTypes(dataTypes["11"]); this.render(dataTypes["11"]); break; - case 12: this.checkDataTypes(dataTypes["12"]); this.render(dataTypes["12"]); break; - case 22: this.checkDataTypes(dataTypes["22"]); this.render(dataTypes["22"]); break; - case 100: this.checkDataTypes(dataTypes["100"]); this.render(dataTypes["100"]); break; - case -1: break; - default: this.render([{text: "No data types defined"}]); - } -}; - -UploadWidget.prototype.clean = function (){ - if (this.panel != null){ - this.panel.destroy(); - delete this.panel; - console.log(this.id+' PANEL DELETED'); - } -}; - -UploadWidget.prototype.checkDataTypes = function (dataTypes){ - for (var i = 0; iType: OK ',false); - }else{ - this.selectedDataType = null; - this.selectedDataTypeObj = null; - this.dataTypeLabel.setText('Select a data type !!!',false); - } - this.validate(); - } - } - }); - - this.nameField = Ext.create('Ext.form.field.Text', { - name: 'datalabel', - fieldLabel: 'Data name', - labelWidth: 110, - msgTarget: 'side', - //allowBlank: false, - enableKeyEvents: true, - listeners: { - scope: this, - change: function(el) { - if(el.getValue()!=""){ - this.dataNameLabel.setText('Name: OK ',false); - }else{ - this.dataNameLabel.setText('Enter the data name !!!',false); - } - this.validate(); - } - } - }); - this.textArea = Ext.create('Ext.form.field.TextArea', { - name: 'datadescription', - fieldLabel: 'Data description', - labelWidth: 110, - msgTarget: 'side' - }); - this.organizationField = Ext.create('Ext.form.field.Text', { - name: 'organization', - fieldLabel: 'Organization', - labelWidth: 110, - msgTarget: 'side' - }); - this.responsableField = Ext.create('Ext.form.field.Text', { - name: 'responsable', - fieldLabel: 'Responsible', - labelWidth: 110, - msgTarget: 'side' - }); - this.acquisitiondate = Ext.create('Ext.form.field.Text', { - name: 'acquisitiondate', - fieldLabel: 'Acquisition date', - labelWidth: 110, - msgTarget: 'side' - }); - - var pan2Width = 350; - var pan2 = Ext.create('Ext.panel.Panel', { - title: 'Some aditional data', - width: pan2Width, - border:false, - height : height, - bodyPadding: 15, - items: [this.nameField,this.textArea,this.organizationField,this.responsableField,this.acquisitiondate] - - }); - - this.dataTypeLabel = Ext.create('Ext.toolbar.TextItem', { - text:'Select a data type' - }); - this.dataNameLabel = Ext.create('Ext.toolbar.TextItem', { - text:'Enter the data name' - }); - this.dataFieldLabel = Ext.create('Ext.toolbar.TextItem', { - text:'Select a data file' - }); - this.originCheck = Ext.create('Ext.form.field.Checkbox', { - xtype:'checkbox', - margin:'0 0 5 5', - boxLabel : 'Text mode', - listeners: { - scope: this, - change: function(){ - if(this.originCheck.getValue()){ - this.dataFieldLabel.setText(''+this.editor.getValue().length+' chars',false); - this.uploadBar.hide(); - this.editor.show(); - this.uploadField.destroy(); - this.uploadField.setRawValue(null); - this.pan3.setHeight(153); - }else{ - this.dataFieldLabel.setText('Select a data file',false); - this.editor.hide(); - this.uploadBar.show(); - this.editor.setRawValue(null); - this.createUploadField(); - this.pan3.setHeight(82); - } - this.validate(); - } - } - }); - var uploadButton = Ext.create('Ext.button.Button', { - id:this.uploadButtonId, - text: 'Upload', - disabled:true, - handler: function() { -// _this.uploadMsg = Ext.Msg.show({ -// closable:false, -// title:'Uploading file', -// msg: 'Please wait...' -// }); - if(_this.chunkedUpload){ - _this.uploadFile2(); - }else{ - _this.uploadFile(); - } - } - }); - - - - this.editor = Ext.create('Ext.form.field.TextArea', { - xtype: 'textarea', - width: 602, - flex:1, - height: 100, - emptyText:'Paste or write your file directly', - hidden:true, - name: 'file', - margin:"-1", - enableKeyEvents:true, - listeners: { - scope: this, - change: function(){ - this.dataFieldLabel.setText(''+this.editor.getValue().length+' chars',false); - this.validate(); - } - - } - }); - - this.uploadBar = Ext.create('Ext.toolbar.Toolbar',{cls:"bio-border-false",dock:'top',height:28}); - this.createUploadField(); - - this.modebar = Ext.create('Ext.toolbar.Toolbar',{ - dock:'top', - height:28, - border:false, - items:[this.originCheck,'->',this.dataTypeLabel,'-',/*this.dataNameLabel,'-',*/this.dataFieldLabel] - }); - - var pan3 = Ext.create('Ext.panel.Panel', { - title: 'File origin', - colspan:2, - border:false, - width: pan1Width+pan2Width, - cls:'panel-border-top', - height:82, -// bodyStyle:{"background-color":"#d3e1f1"}, - items:[this.editor], - dockedItems:[this.modebar,this.uploadBar] - }); - this.pan3 = pan3; - - this.panel = Ext.create('Ext.window.Window', { - title: 'Upload a data file'+' - ZIP files will be allowed shortly', - iconCls:'icon-upload', - resizable: false, -// minimizable :true, - constrain:true, - closable:false, - modal:true, - layout: { - type: 'table', - columns: 2, - rows:2 - }, - items: [pan1,pan2,pan3], - buttonAlign:'right', - buttons : [{text:"Close",handler:function(){_this.panel.destroy();}}, uploadButton], - listeners: { - scope: this, - minimize:function(){ - this.panel.destroy(); - }, - destroy: function(){ - delete this.panel; - } - } - }); - - } - this.panel.show(); -}; - - -UploadWidget.prototype.createUploadField = function() { - this.uploadField = Ext.create('Ext.form.field.File', { - id:this.uploadFieldId, - xtype: 'filefield', - name: 'file', - flex:1, - padding:1, - msgTarget: 'side', - emptyText: 'Choose a file', - allowBlank: false, - anchor: '100%', - buttonText: 'Open file...', - listeners: { - scope: this, - change: function() { - this.fileSelected(); - this.validate(); - } - } - }); - this.uploadBar.add(this.uploadField); -}; - -UploadWidget.prototype.validate = function (){ -// console.log(this.selectedDataType != null); -// console.log(this.nameField.getValue() !=""); -// console.log((this.uploadField.getRawValue()!="" || this.editor.getValue()!="")); - - var extensionValid = true; - if(this.selectedDataTypeObj.validate != null){ - extensionValid = this.selectedDataTypeObj.validate(Ext.getCmp(this.uploadFieldId).getValue()); - } - - if (extensionValid && this.selectedDataType != null /*&& this.nameField.getValue() !=""*/ && (this.uploadField.getRawValue()!="" || this.editor.getValue()!="") ){ - Ext.getCmp(this.uploadButtonId).enable(); - this.dataTypeLabel.setText('Type: OK ',false); - }else{ - Ext.getCmp(this.uploadButtonId).disable(); - this.dataTypeLabel.setText('Type: Not valid ',false); - } -}; - - -UploadWidget.prototype.fileSelected = function (){ - var inputId=this.uploadField.fileInputEl.id; - var file = document.getElementById(inputId).files[0]; - if (file) { - var fileSize = 0; - if (file.size > 1024 * 1024) - fileSize = (Math.round(file.size * 100 / (1024 * 1024)) / 100).toString() + 'MB'; - else - fileSize = (Math.round(file.size * 100 / 1024) / 100).toString() + 'KB'; - - - this.dataFieldLabel.setText('Size: '+fileSize+'',false); -// document.getElementById('fileName').innerHTML = 'Name: ' + file.name; -// document.getElementById('fileSize').innerHTML = 'Size: ' + fileSize; -// document.getElementById('fileType').innerHTML = 'Type: ' + file.type; - } -}; - -UploadWidget.prototype.uploadFile = function() { - var _this=this; - Ext.getBody().mask('Uploading file...'); - this.panel.disable(); - - var fd = new FormData(); - var inputFileName = null; - if(this.originCheck.getValue()){ - inputFileName = this.nameField.getValue(); - fd.append("file", this.editor.getValue()); - }else{ - var inputFile = document.getElementById(Ext.getCmp(this.uploadFieldId).fileInputEl.id).files[0]; - inputFileName = inputFile.name; - fd.append("file", inputFile); - } - var sessionId = $.cookie('bioinfo_sid'); - var objectId = this.opencgaLocation.directory+inputFileName; - objectId = objectId.replace(new RegExp("/", "gi"),":"); - - fd.append("name", this.nameField.getValue()); - fd.append("fileFormat", this.selectedDataType); - fd.append("responsible", this.responsableField.getValue()); - fd.append("organization", this.organizationField.getValue()); - fd.append("date", this.acquisitiondate.getValue()); - fd.append("description", this.textArea.getValue()); - fd.append("objectid", objectId); - fd.append("sessionid", sessionId); - - - //TODO DELETE THIS - this.objectID = this.opencgaLocation.bucketId+":"+objectId; - - //accountid, sessionId, projectname, formData - this.adapter.uploadObjectToBucket($.cookie("bioinfo_account"), sessionId, this.opencgaLocation.bucketId, objectId, fd); - -}; - -UploadWidget.prototype.uploadFile2 = function() { - var _this=this; - - var inputFile = document.getElementById(Ext.getCmp(this.uploadFieldId).fileInputEl.id).files[0]; - - var objectId = this.opencgaLocation.directory+inputFile.name; - objectId = objectId.replace(new RegExp("/", "gi"),":"); - - var fileuploadWorker = new Worker(WORKERS_PATH+'worker-fileupload.js'); - this.opencgaBrowserWidget.addUpload(inputFile, fileuploadWorker); - fileuploadWorker.postMessage({ - 'host':OPENCGA_HOST, - 'accountId': $.cookie("bioinfo_account"), - 'sessionId': $.cookie("bioinfo_sid"), - 'file' : inputFile, - 'objectId':objectId, - 'fileFormat': this.selectedDataType, - 'bucketId':this.opencgaLocation.bucketId, - 'resume' : true - }); - this.panel.close(); -}; - -//UploadWidget.prototype.uploadProgress = function(evt) { -// console.log("Progress..."); -// if (evt.lengthComputable) { -// var percentComplete = Math.round(evt.loaded * 100 / evt.total); -// console.log(percentComplete); -//// document.getElementById('progressNumber').innerHTML = percentComplete.toString() + '%'; -// } -// else { -// console.log('unable to compute'); -//// document.getElementById('progressNumber').innerHTML = 'unable to compute'; -// } -//}; - -UploadWidget.prototype.uploadComplete = function(response) { - /* This event is raised when the server send back a response */ -// this.dataFieldLabel.setText('Upload finished successfully '+response,false); - var msg = "Uploaded sucessfully"; - if (response.indexOf("ERROR")!=-1){//el createErrorResponse devuelte la palabra error siempre o deberia - msg = response; - } - Ext.Msg.show({ - title:'Upload status', - msg: msg - }); - this.panel.enable(); - Ext.getBody().unmask(); - if (msg == "Uploaded sucessfully"){ - this.panel.close(); - } -}; - -UploadWidget.prototype.uploadFailed = function(response) { - console.log(response); - Ext.Msg.show({ - title:'Upload status', - msg: 'There was an error attempting to upload the file.' - }); -// alert("There was an error attempting to upload the file."); - this.panel.enable(); - Ext.getBody().unmask(); -}; - -UploadWidget.prototype.uploadCanceled = function(response) { - console.log(response); - Ext.Msg.show({ - title:'Upload status', - msg: 'The upload has been canceled by the user or the browser dropped the connection.' - }); -// alert("The upload has been canceled by the user or the browser dropped the connection."); - this.panel.enable(); - Ext.getBody().unmask(); -}; diff --git a/vendor/opencga-1.0.0.min.js b/vendor/opencga-1.0.0.min.js deleted file mode 100644 index 3199dad..0000000 --- a/vendor/opencga-1.0.0.min.js +++ /dev/null @@ -1,7 +0,0 @@ -/*! Genome Viewer - v1.0.2 - 2013-09-23 -* http://https://github.com/opencb-bigdata-viz/js-common-libs/ -* Copyright (c) 2013 Licensed GPLv2 */ -function UserListWidget(a){this.id="UserListWidget_"+Math.round(1e7*Math.random()),this.data=new Array,this.args=new Object,this.timeout=4e3,this.pagedViewList=a.pagedViewList,this.suiteId=-1,this.tools=[],null!=a&&(null!=a.timeout&&a.timeout>4e3&&(this.timeout=a.timeout),null!=a.suiteId&&(this.suiteId=a.suiteId),null!=a.tools&&(this.tools=a.tools))}function GenericFormPanel(a){_.extend(this,Backbone.Events),this.analysis=a,this.form=null,this.paramsWS={},this.opencgaManager=new OpencgaManager,this.panelId=this.analysis+"-FormPanel",this.testing=!1,this.opencgaManager.onRunAnalysis.addEventListener(function(a,b){-1!=b.data.indexOf("ERROR")?Ext.Msg.show({title:"Error",msg:b.data,buttons:Ext.Msg.OK,icon:Ext.Msg.ERROR}):console.log(b.data)}),this.on(this.handlers)}function OpencgaManager(a){this.host=OPENCGA_HOST||this.host,this.host=a||this.host,this.onGetAccountInfo=new Event(this),this.onLogin=new Event(this),this.onCreateAccount=new Event(this),this.onResetPassword=new Event(this),this.onChangePassword=new Event(this),this.onChangeEmail=new Event(this),this.onLogout=new Event(this),this.onCreateBucket=new Event(this),this.onRefreshBucket=new Event(this),this.onRenameBucket=new Event(this),this.onUploadObjectToBucket=new Event(this),this.onDeleteObjectFromBucket=new Event(this),this.onCreateDirectory=new Event(this),this.onJobStatus=new Event(this),this.onJobResult=new Event(this),this.onTable=new Event(this),this.onPoll=new Event(this),this.onDeleteJob=new Event(this),this.onRunAnalysis=new Event(this),this.onIndexer=new Event(this),this.onIndexerStatus=new Event(this),this.onBamList=new Event(this),this.onGetAccountInfo=new Event(this),this.onRegion=new Event(this),this.onLocalFileList=new Event(this),this.onError=new Event(this)}function CheckBrowser(a){Ext.isIE&&window.console&&"undefined"==typeof window.console.time&&(console.time=function(a,b){if(a){var c=(new Date).getTime();console.timeCounters||(console.timeCounters={});var d="KEY"+a.toString();(b||!console.timeCounters[d])&&(console.timeCounters[d]=c)}},console.timeEnd=function(a){var b=(new Date).getTime();if(console.timeCounters){var c="KEY"+a.toString(),d=console.timeCounters[c];if(d){var e=b-d,f=a+": "+e+"ms";console.info(f),delete console.timeCounters[c]}return e}});var b=!1;switch(a){case"renato":Ext.chromeVersion>=16&&(b=!0),Ext.safariVersion>=5&&(b=!0),Ext.firefoxVersion>=10&&(b=!0);break;case"variant":Ext.chromeVersion>=16&&(b=!0),Ext.safariVersion>=5&&(b=!0),Ext.firefoxVersion>=10&&(b=!0);break;default:Ext.chromeVersion>=14&&(b=!0),Ext.safariVersion>=5&&(b=!0),Ext.isIE10>=5&&(b=!0)}0==b&&(console.log("--------------------------------------------"+b),$("#checkBrowser").html("This application provides the best user experience with Google Chrome and Apple Safari, otherwise some latencies may be experienced when browsing due to some problems in Firefox.").css("width","540px").css("height","40px").css("position","absolute").css("margin-left","300px").css("margin-top","26px").css("padding","5px").css("border","1px solid #F1D031").css("background","#FFFFA3").css("color","#555").css("position","absolute").css("z-index","50000").click(function(){$("#checkBrowser").fadeOut(function(){$(this).remove()})}))}function HeaderWidget(a){_.extend(this,Backbone.Events);var b=this;this.id=Utils.genId("HeaderWidget"),this.targetId,this.height=67,this.accountData,this.appname="My new App",this.description="",this.suiteId=-1,this.news="",this.checkTimeInterval=4e3,this.version="",this.allowLogin=!0,this.width,this.height,this.chunkedUpload=!1,_.extend(this,a),this.adapter=new OpencgaManager,this.loginWidget=new LoginWidget(this.suiteId),this.profileWidget=new ProfileWidget,this.opencgaBrowserWidget=new OpencgaBrowserWidget({suiteId:this.suiteId,chunkedUpload:this.chunkedUpload}),this.loginWidget.onSessionInitiated.addEventListener(function(){b.sessionInitiated(),b.trigger("login",{sender:this})}),this.adapter.onLogout.addEventListener(function(a,c){console.log(c),$.cookie("bioinfo_sid",null),$.cookie("bioinfo_sid",null,{path:"/"}),$.cookie("bioinfo_account",null),$.cookie("bioinfo_account",null,{path:"/"}),b.sessionFinished(),b.trigger("logout",{sender:this})}),this.opencgaBrowserWidget.onNeedRefresh.addEventListener(function(){b.getAccountInfo()}),this.adapter.onGetAccountInfo.addEventListener(function(a,c){null!=c.accountId&&(b.setAccountData(c),b.trigger("account:change",{sender:this,response:c}),console.log("accountData has been modified since last call"))}),this.on(this.handlers),this.rendered=!1,this.autoRender&&this.render()}function JobListWidget(a){var b=this;UserListWidget.prototype.constructor.call(this,a),this.counter=null;var c=['','
','
greenblueredDarkorange">{name}
','
{date}
','
{toolName}{execution}
','
',"{status}",' - {visites} views',"
","
","
"],d=["commandLine","date","description","diskUsage","status","finishTime","inputData","jobId","message","name","outputData","ownerId","percentage","projectId","toolName","visites"];this.pagedViewList.storeFields=d,this.pagedViewList.template=c,null!=a.pagedViewList&&(null!=a.pagedViewList.storeFields&&(this.pagedViewList.storeFields=a.pagedViewList.storeFields),null!=a.pagedViewList.template&&(this.pagedViewList.template=a.pagedViewList.template)),this.pagedListViewWidget=new PagedViewListWidget(this.pagedViewList),this.btnAllId=this.id+"_btnAll",this.btnActivePrjId=this.id+"_btnActivePrj",this.btnFinishedId=this.id+"_btnFinished",this.btnVisitedId=this.id+"_btnVisited",this.btnRunningId=this.id+"_btnRunning",this.btnQueuedId=this.id+"_btnQueued",this.projectFilterButton=Ext.create("Ext.button.Button",{id:this.btnActivePrjId,iconCls:"icon-project-all",tooltip:"Toggle jobs from all projects or active project",enableToggle:!0,pressed:!1,listeners:{toggle:function(){b.render()}}}),this.bar=new Ext.create("Ext.toolbar.Toolbar",{id:this.id+"jobsFilterBar",dock:"top",items:[{id:this.btnAllId,text:" ",tooltip:"Total jobs"},{id:this.btnFinishedId,text:" ",tooltip:"Finished jobs"},{id:this.btnVisitedId,text:" ",tooltip:"Visited jobs"},{id:this.btnRunningId,text:" ",tooltip:"Running jobs"},{id:this.btnQueuedId,text:" ",tooltip:"Queued jobs"}]}),Ext.getCmp(this.btnAllId).on("click",this.filter,this),Ext.getCmp(this.btnFinishedId).on("click",this.filter,this),Ext.getCmp(this.btnVisitedId).on("click",this.filter,this),Ext.getCmp(this.btnRunningId).on("click",this.filter,this),Ext.getCmp(this.btnQueuedId).on("click",this.filter,this),this.allData=[]}function LoginWidget(a,b){var c=this;this.id="LoginWidget_",this.targetId=null,this.suiteId=a,null!=b&&null!=b.targetId&&(this.targetId=b.targetId),this.onSessionInitiated=new Event(this),this.adapter=new OpencgaManager,this.adapter.onLogin.addEventListener(function(a,b){null!=c.panel&&c.panel.setLoading(!1),console.log(b),null==b.errorMessage?($.cookie("bioinfo_sid",b.sessionId),$.cookie("bioinfo_account",b.accountId),$.cookie("bioinfo_bucket",b.bucketId),c.onSessionInitiated.notify()):(Ext.getCmp(c.labelEmailId).setText(''+b.errorMessage+"",!1),$.cookie("bioinfo_sid",null),$.cookie("bioinfo_sid",null,{path:"/"}),$.cookie("bioinfo_account",null),$.cookie("bioinfo_account",null,{path:"/"}))}),this.adapter.onCreateAccount.addEventListener(function(a,b){c.panel.setLoading(!1),b=b.replace(/^\s+|\s+$/g,""),-1!=b.indexOf("OK")?Ext.getCmp(c.labelEmailId).setText('Account created',!1):(b=b.replace(/ERROR: /gi," "),Ext.getCmp(c.labelEmailId).setText('Account already exists',!1),$.cookie("bioinfo_sid",null),$.cookie("bioinfo_sid",null,{path:"/"}),$.cookie("bioinfo_account",null),$.cookie("bioinfo_account",null,{path:"/"}))}),this.adapter.onResetPassword.addEventListener(function(a,b){c.panel.setLoading(!1),Ext.getCmp(c.labelEmailId).setText(''+b+"",!1)}),this.labelEmailId=this.id+"labelEmail",this.labelPassId=this.id+"labelPass",this.fldEmailId=this.id+"fldEmail",this.fldPasswordId=this.id+"fldPassword",this.fldNpass1Id=this.id+"fldNpass1",this.fldNpass2Id=this.id+"fldNpass2",this.btnSignId=this.id+"fldSign",this.btnAnonymousId=this.id+"btnAnonymous",this.btnForgotId=this.id+"btnForgot",this.btnNewaccId=this.id+"btnNewacc",this.btnSendId=this.id+"btnSend",this.btnBackId=this.id+"btnBack",this.btnRegisterId=this.id+"btnRegister"}function OpencgaBrowserWidget(a){var b=this;this.chunkedUpload=!1,"undefined"!=typeof a&&(this.targetId=a.targetId||this.targetId,this.title=a.title||this.title,this.width=a.width||this.width,this.height=a.height||this.height,this.chunkedUpload=a.chunkedUpload||this.chunkedUpload),this.adapter=new OpencgaManager,this.adapter.onCreateBucket.addEventListener(function(a,c){-1!=c.indexOf("ERROR")?Ext.Msg.alert("Create project","ERROR: could not create this project."):b.onNeedRefresh.notify(),b.panel.setLoading(!1),Ext.getBody().unmask()}),this.uploadWidget=new UploadWidget({suiteId:a.suiteId,opencgaBrowserWidget:this,chunkedUpload:this.chunkedUpload}),this.uploadWidget.adapter.onUploadObjectToBucket.addEventListener(function(a,c){"done"==c.status&&b.onNeedRefresh.notify()}),this.searchFieldId=this.id+"_searchField"}function PagedViewListWidget(a){var b=this;this._data=null,this.id="PagedViewListWidget_"+Math.round(1e4*Math.random()),this.targetId=null,this.pageSize=6,this.storeFields=new Object,this.template=new Object,this.width=280,this.height=550,this.title="",this.order=0,this.border=0,this.mode="view",this.sort="DESC",null!=a&&(null!=a.pageSize&&(this.pageSize=a.pageSize),null!=a.storeFields&&(this.storeFields=a.storeFields),null!=a.template&&(this.template=a.template),null!=a.targetId&&(this.targetId=a.targetId),null!=a.width&&(this.width=a.width),null!=a.height&&(this.height=a.height),null!=a.title&&(this.title=a.title),null!=a.order&&(this.order=a.order),null!=a.border&&(this.border=a.border),null!=a.mode&&(this.mode=a.mode)),this.currentPage=1,this.pageFieldId=this.id+"_pageField",this.pageLabelId=this.id+"_pageLabel",this.pagbarId=this.id+"_pagbar",this.panelId=this.id+"_panel",this.onItemClick=new Event(this),this.textFilterFunction=function(a){var c=Ext.getCmp(b.id+"searchField").getValue().toLowerCase();return a.data.name.toLowerCase().indexOf(c)<0?!1:!0}}function ProfileWidget(a){var b=this;this.id="EditUserWidget_"+Math.round(1e4*Math.random()),this.targetId=null,"undefined"!=typeof a&&(this.targetId=a.targetId||this.targetId),this.adapter=new OpencgaManager,this.adapter.onChangePassword.addEventListener(function(a,c){b.panel.setLoading(!1),-1==c.indexOf("ERROR")&&(Ext.getCmp(b.id+"fldOld").setValue(null),Ext.getCmp(b.id+"fldNew1").setValue(null),Ext.getCmp(b.id+"fldNew2").setValue(null)),Ext.getCmp(b.id+"labelPass").setText(''+c+"",!1)}),this.adapter.onChangeEmail.addEventListener(function(a,c){b.panel.setLoading(!1),-1==c.indexOf("ERROR")&&(Ext.getCmp(b.id+"fldEmail").setValue(null),Ext.getCmp(b.id+"fldEmail").setFieldLabel("e-mail",!1)),Ext.getCmp(b.id+"labelPass").setText(''+c+"",!1)})}function ResultTable(a,b,c,d){var e=this;this.id="ResultTable"+Math.round(1e7*Math.random()),this.targetId=null,this.jobId=a,this.fileName=b,this.tags=c,this.numRows=10,this.flex=null,this.collapsible=!0,this.border=!0,this.cls=null,"undefined"!=typeof d&&(this.targetId=d.targetId||this.targetId,this.numRows=d.numRows||this.numRows,this.flex=d.flex||this.flex,this.collapsible=d.collapsible||this.collapsible,this.border=d.border||this.border,this.cls=d.cls||this.cls,this.tableLayout=d.tableLayout||this.tableLayout),this.adapter=new OpencgaManager,this.table=null,this.onRendered=new Event,this.onRendered.addEventListener(function(){e.draw()})}function ResultWidget(a){var b=this;this.id="ResultWidget"+Math.round(1e4*Math.random()),this.targetId=null,null!=a&&(null!=a.targetId&&(this.targetId=a.targetId),null!=a.application&&(this.application=a.application),null!=a.app&&(this.app=a.app)),this.adapter=new OpencgaManager,this.adapter.onJobResult.addEventListener(function(a,c){b.data=JSON.parse(c),Ext.getBody().unmask(),b.panel.setLoading(!1),b.render()}),this.panelId=null,this.networkViewerId=null,this.genomeMapsId=null,this.resultTables=new Object,this.resultHistograms=new Object,this.resultGCharts=new Object,this.variantFiles=new Object,this.onViewRendered=new Event,this.onViewRendered.addEventListener(function(){b.drawTables(),b.drawHistograms(),b.drawGCharts(),b.drawApplicationItems()})}function ResultWidget(a){this.extItems=[],_.extend(this,a),this.adapter=new OpencgaManager,this.panelId=null,this.networkViewerId=null,this.genomeMapsId=null}function UploadWidget(a){var b=this;this.id=Utils.genId("uploadWidget"),this.targetId=null,this.suiteId=null,this.chunkedUpload=!1,"undefined"!=typeof a&&(this.targetId=a.targetId||this.targetId,this.suiteId=a.suiteId||this.suiteId,this.opencgaBrowserWidget=a.opencgaBrowserWidget||this.opencgaBrowserWidget,this.chunkedUpload=a.chunkedUpload||this.chunkedUpload),this.adapter=new OpencgaManager,this.adapter.onUploadObjectToBucket.addEventListener(function(a,c){"done"==c.status?(console.log(b.objectID),b.uploadComplete(c.data)):"fail"==c.status&&b.uploadFailed(c.data)}),this.uploadButtonId=this.id+"_uploadButton",this.uploadFieldId=this.id+"_uploadField",this.selectedDataType=null}UserListWidget.prototype.draw=function(){var a=this;this.getResponse(),this.interval=setInterval(function(){a.getResponse()},this.timeout)},UserListWidget.prototype.getData=function(){return this.data},UserListWidget.prototype.getCount=function(){return this.data.length},UserListWidget.prototype.getResponse=function(){throw"abstract method must be implemented in child classes"},UserListWidget.prototype.render=function(){throw"abstract method must be implemented in child classes"},GenericFormPanel.prototype.draw=function(a){var b=this;return null==this.panel&&(this.panel=null!=a&&"window"==a.type?Ext.create("Ext.ux.Window",{title:a.title||"",resizable:a.resizable||!1,width:a.width||500,height:a.height,overflowY:"auto",taskbar:a.taskbar,closable:!1,items:this.getForm()}).show():Ext.create("Ext.panel.Panel",{id:this.panelId,title:a.title,closable:!0,defaults:{margin:30},autoScroll:!0,items:this.getForm(),border:0,listeners:{beforeclose:function(){return console.log("closing"),a.tabpanel.remove(b.panel,!1),!1}}})),this.panel},GenericFormPanel.prototype.getForm=function(){if(null==this.form){var a=this.getPanels();a.push(this.getJobPanel()),a.push(this.getRunButton()),this.form=Ext.create("Ext.form.Panel",{border:0,bodyPadding:"5",width:"95%",layout:"vbox",items:a})}return this.form},GenericFormPanel.prototype.getPanels=function(){},GenericFormPanel.prototype.getJobPanel=function(){var a=Ext.create("Ext.form.field.Text",{id:this.id+"jobname",name:"jobname",fieldLabel:"Name",emptyText:"Job name",allowBlank:!1,margin:"5 0 0 5"}),b=Ext.create("Ext.form.field.TextArea",{id:this.id+"jobdescription",name:"jobdescription",fieldLabel:"Description",emptyText:"Description",margin:"5 0 0 5"}),c=this.createOpencgaBrowserCmp({id:Utils.genId("jobFolder"),fieldLabel:"Folder:",dataParamName:"outdir",mode:"folderSelection",btnMargin:"0 0 0 66",defaultFileLabel:"Default job folder",allowBlank:!0}),d=Ext.create("Ext.panel.Panel",{title:"Job",border:!0,bodyPadding:"5",margin:"0 0 5 0",width:"99%",buttonAlign:"center",items:[a,b,c]});return d},GenericFormPanel.prototype.getRunButton=function(){var a=this;return Ext.create("Ext.button.Button",{text:"Run",width:300,height:35,disabled:!0,formBind:!0,handler:function(){var b=a.getForm().getForm().getValues();for(var c in b)a.paramsWS[c]=b[c];a.beforeRun(),a.run()}})},GenericFormPanel.prototype.setAccountParams=function(){this.paramsWS.sessionid=$.cookie("bioinfo_sid"),this.paramsWS.accountid=$.cookie("bioinfo_account")},GenericFormPanel.prototype.beforeRun=function(){},GenericFormPanel.prototype.run=function(){this.setAccountParams(),""===this.paramsWS.outdir?delete this.paramsWS.outdir:console.log(this.paramsWS.outdir),this.testing||this.opencgaManager.runAnalysis(this.analysis,this.paramsWS),Ext.example.msg("Job Launched","It will be listed soon"),console.log(this.paramsWS),this.trigger("after:run",{sender:this})},GenericFormPanel.prototype.createCombobox=function(a,b,c,d,e,f){return Ext.create("Ext.form.field.ComboBox",{id:a,name:a,fieldLabel:b,store:c,queryMode:"local",displayField:"name",valueField:"value",value:c.getAt(d).get("value"),labelWidth:e,margin:f,editable:!1,allowBlank:!1})},GenericFormPanel.prototype.createCheckBox=function(a,b,c,d,e){return Ext.create("Ext.form.field.Checkbox",{id:a,name:a,boxLabel:b,checked:c||!1,disabled:e,margin:d||"0 0 0 0"})},GenericFormPanel.prototype.createRadio=function(a,b,c,d){var e=Ext.create("Ext.form.field.Radio",{id:a+"_"+this.id,boxLabel:a,inputValue:a,checked:c,name:b,hidden:d});return e},GenericFormPanel.prototype.createLabel=function(a,b){var c=Ext.create("Ext.form.Label",{id:a+"_"+this.id,margin:b||"15 0 0 0",html:''+a+""});return c},GenericFormPanel.prototype.createTextFields=function(a){var b=Ext.create("Ext.form.field.Text",{id:a+"_"+this.id,fieldLabel:a,name:a});return b},GenericFormPanel.prototype.createOpencgaBrowserCmp=function(a){var b=this,c=Ext.create("Ext.button.Button",{text:"Browse...",margin:a.btnMargin||"0 0 0 10",handler:function(){null!=a.beforeClick&&a.beforeClick(a);var c=b.opencgaBrowserWidget.onSelect.addEventListener(function(a,f){var g=f.bucketId+"/"+f.id,h=f.bucketId+":"+f.id.replace(/\//g,":");d.setText(''+g+"",!1),e.setValue(h),b.opencgaBrowserWidget.onSelect.removeEventListener(c)});b.opencgaBrowserWidget.draw({mode:a.mode,allowedTypes:a.allowedTypes})}}),d=Ext.create("Ext.form.Label",{id:a.id,text:a.defaultFileLabel||"No file selected",margin:"5 0 0 15"}),e=Ext.create("Ext.form.field.Text",{id:a.id+"hidden",name:a.dataParamName,hidden:!0,allowBlank:a.allowBlank||!1,margin:"5 0 0 15"});return Ext.create("Ext.container.Container",{margin:"5 0 5 0",items:[{xtype:"label",text:a.fieldLabel,margin:"5 0 0 5"},c,d,e]})},OpencgaManager.prototype={host:"http://ws.bioinfo.cipf.es/opencga/rest",getHost:function(){return this.host},setHost:function(a){this.host=a},doGet:function(a,b,c){$.ajax({type:"GET",url:a,cache:!1,success:b,error:c})},doPost:function(a,b,c,d){$.ajax({type:"POST",url:a,data:b,processData:!1,contentType:!1,success:c,error:d})},getQuery:function(a){var b="";for(var c in a)null!=a[c]&&(b+=c+"="+a[c]+"&");return""!=b&&(b="?"+b.slice(0,-1)),b},getAccountUrl:function(a){return this.getHost()+"/account/"+a},getStorageUrl:function(a){return this.getAccountUrl(a)+"/storage"},getAdminProfileUrl:function(a){return this.getAccountUrl(a)+"/admin/profile"},getAdminBucketUrl:function(a,b){return this.getAccountUrl(a)+"/admin/bucket/"+b},getAdminProjectUrl:function(a,b){return this.getAccountUrl(a)+"/admin/project/"+b},getBucketUrl:function(a,b){return this.getStorageUrl(a)+"/"+b},getObjectUrl:function(a,b,c){return this.getStorageUrl(a)+"/"+b+"/"+c},getAnalysisUrl:function(a,b){return this.getAccountUrl(a)+"/analysis/"+b},getJobAnalysisUrl:function(a,b){return this.getAccountUrl(a)+"/analysis/job/"+b},createAccount:function(a,b,c,d,e){function f(a){h.onCreateAccount.notify(a)}function g(a){console.log("ERROR: "+a)}var h=this,i={name:c,email:b,password:d,suiteid:e},j=this.getAccountUrl(a)+"/create"+this.getQuery(i);this.doGet(j,f,g)},login:function(a,b,c){function d(a){-1==a.indexOf("ERROR")?f.onLogin.notify(JSON.parse(a)):f.onLogin.notify({errorMessage:a})}function e(a){console.log("ERROR: "+a)}var f=this,g={password:b,suiteid:c},h=this.getAccountUrl(a)+"/login"+this.getQuery(g);this.doGet(h,d,e)},logout:function(a,b){function c(a){e.onLogout.notify(a)}function d(a){$.cookie("bioinfo_sid",null),$.cookie("bioinfo_sid",null,{path:"/"}),console.log("ERROR: "+a)}var e=this,f={sessionid:b},g=this.getAccountUrl(a)+"/logout"+this.getQuery(f);this.doGet(g,c,d)},getAccountInfo:function(a,b,c){function d(a){-1==a.indexOf("ERROR")?f.onGetAccountInfo.notify(JSON.parse(a)):($.cookie("bioinfo_sid",null),$.cookie("bioinfo_sid",null,{path:"/"}),$.cookie("bioinfo_account",null),$.cookie("bioinfo_account",null,{path:"/"}),console.log(a))}function e(a){console.log("ERROR: "+a),console.log(a)}console.log(c);var f=this,g={last_activity:c,sessionid:b},h=this.getAccountUrl(a)+"/info"+this.getQuery(g);this.doGet(h,d,e)},changePassword:function(a,b,c,d,e){function f(a){h.onChangePassword.notify(a)}function g(a){console.log("ERROR: "+a)}var h=this,i={old_password:c,new_password1:d,new_password2:e,sessionid:b},j=this.getAdminProfileUrl(a)+"/change_password"+this.getQuery(i);this.doGet(j,f,g)},resetPassword:function(a,b){function c(a){e.onResetPassword.notify(a)}function d(a){console.log("ERROR: "+a)}var e=this,f={email:b},g=this.getAdminProfileUrl(a)+"/reset_password"+this.getQuery(f);this.doGet(g,c,d)},changeEmail:function(a,b,c){function d(a){f.onChangeEmail.notify(a)}function e(a){console.log("ERROR: "+a)}var f=this,g={new_email:c,sessionid:b},h=this.getAdminProfileUrl(a)+"/change_email"+this.getQuery(g);this.doGet(h,d,e)},getBuckets:function(){return"TODO"},createBucket:function(a,b,c,d){function e(a){g.onCreateBucket.notify(a)}function f(a){console.log("ERROR: "+a)}var g=this,h={description:b,sessionid:d},i=this.getAdminBucketUrl(c,a)+"/create"+this.getQuery(h);this.doGet(i,e,f)},refreshBucket:function(a,b,c){function d(a){f.onRefreshBucket.notify(a)}function e(a){console.log("ERROR: "+a)}var f=this,g={sessionid:c},h=this.getAdminBucketUrl(a,b)+"/refresh"+this.getQuery(g);this.doGet(h,d,e),console.log(h)},renameBucket:function(a,b,c,d){function e(a){g.onRenameBucket.notify(a)}function f(a){console.log("ERROR: "+a)}var g=this,h={sessionid:d},i=this.getAdminBucketUrl(a,b)+"/rename/"+c+this.getQuery(h);this.doGet(i,e,f),console.log(i)},deleteBucket:"TODO",shareBucket:"TODO",uploadObjectToBucket:function(a,b,c,d,e,f){function g(a){console.log(a),i.onUploadObjectToBucket.notify({status:"done",data:a})}function h(a){i.onUploadObjectToBucket.notify({status:"fail",data:a})}var i=this,j={parents:f||!1,sessionid:b},k=this.getObjectUrl(a,c,d)+"/upload"+this.getQuery(j);this.doPost(k,e,g,h)},createDirectory:function(a,b,c,d,e){function f(a){console.log(a),h.onCreateDirectory.notify(a)}function g(a){console.log("ERROR: "+a)}d=d.replace(new RegExp("/","gi"),":");var h=this,i={parents:e||!1,sessionid:b},j=this.getObjectUrl(a,c,d)+"/create_directory"+this.getQuery(i);this.doGet(j,f,g)},deleteObjectFromBucket:function(a,b,c,d){function e(a){console.log(a),g.onDeleteObjectFromBucket.notify(a)}function f(a){console.log("ERROR: "+a)}d=d.replace(new RegExp("/","gi"),":");var g=this,h={sessionid:b},i=this.getObjectUrl(a,c,d)+"/delete"+this.getQuery(h);this.doGet(i,e,f)},region:function(a,b,c,d,e,f){function g(a){-1==a.substr(0,5).indexOf("ERROR")&&i.onRegion.notify({resource:f.category,result:JSON.parse(a),filename:d,query:e,params:f})}function h(a){console.log("ERROR: "+a),console.log(a)}d=d.replace(new RegExp("/","gi"),":");var i=this;if(f.sessionid=b,f.region=e,f.cellbasehost=CELLBASE_HOST+"/"+CELLBASE_VERSION,-1!=this.host.indexOf("localhost")){f.region=e,f.filepath=d;var j=this.host+"/storage/fetch"+this.getQuery(f)}else var j=this.getObjectUrl(a,c,d)+"/fetch"+this.getQuery(f);this.doGet(j,g,h),console.log(j)},jobResult:function(a,b,c){function d(a){f.onJobResult.notify(a)}function e(a){console.log("ERROR: "+a)}var f=this,g={sessionid:b},h=this.getJobAnalysisUrl(a,c)+"/result.js"+this.getQuery(g);this.doGet(h,d,e),console.log(h)},jobResultUrl:function(a,b,c){var d={sessionid:b};return this.getJobAnalysisUrl(a,c)+"/result.js"+this.getQuery(d)},jobStatus:function(a,b,c){function d(a){f.onJobStatus.notify(a)}function e(a){console.log("ERROR: "+a)}var f=this,g={sessionid:b},h=this.getJobAnalysisUrl(a,c)+"/status"+this.getQuery(g);this.doGet(h,d,e),console.log(h)},table:function(a,b,c,d,e,f){function g(a){i.onTable.notify(a)}function h(a){console.log("ERROR: "+a)}var i=this,j={filename:d,colNames:e,colVisibility:f,sessionid:b},k=this.getJobAnalysisUrl(a,c)+"/table"+this.getQuery(j);this.doGet(k,g,h)},tableurl:function(a,b,c,d,e,f){var g={filename:d,colNames:e,colVisibility:f,sessionid:b};return this.getJobAnalysisUrl(a,c)+"/table"+this.getQuery(g)},poll:function(a,b,c,d,e){function f(a){i.onPoll.notify(a)}function g(a){console.log("ERROR: "+a)}var h,i=this,j={filename:d,sessionid:b};1==e?(h=this.getJobAnalysisUrl(a,c)+"/poll"+this.getQuery(j),open(h)):(j.zip=!1,h=this.getJobAnalysisUrl(a,c)+"/poll"+this.getQuery(j),this.doGet(h,f,g))},pollurl:function(a,b,c,d){var e={filename:d,sessionid:b,zip:!1};return this.getJobAnalysisUrl(a,c)+"/poll"+this.getQuery(e)},deleteJob:function(a,b,c){function d(a){f.onDeleteJob.notify(a)}function e(a){console.log("ERROR: "+a)}var f=this,g={sessionid:b},h=this.getJobAnalysisUrl(a,c)+"/delete"+this.getQuery(g);this.doGet(h,d,e)},downloadJob:function(a,b,c){var d={sessionid:b};open(this.getJobAnalysisUrl(a,c)+"/download"+this.getQuery(d))},runAnalysis:function(a,b){function c(a){e.onRunAnalysis.notify({status:"done",data:a})}function d(a){e.onRunAnalysis.notify({status:"fail",data:a})}var e=this,f=b.accountid,g={},h=this.getAnalysisUrl(f,a)+"/run"+this.getQuery(g);console.log(h),console.log(b),$.ajax({type:"POST",url:h,data:b,success:c,error:d})},indexer:function(a,b,c,d){function e(a){g.onIndexer.notify(a)}function f(a){g.onIndexer.notify(a)}var g=this,h={sessionid:b},i=this.getObjectUrl(a,c,d)+"/index"+this.getQuery(h);console.log(i),this.doGet(i,e,f)},indexerStatus:function(a,b,c,d,e){function f(a){h.onIndexerStatus.notify(a)}function g(a){h.onIndexerStatus.notify(a)}var h=this,i={sessionid:b,indexerid:e},j=this.getObjectUrl(a,c,d)+"/index_status"+this.getQuery(i);console.log(j),this.doGet(j,f,g)},localFileList:function(){function a(a){c.onLocalFileList.notify(a)}function b(a){c.onLocalFileList.notify(a)}var c=this,d=this.host+"/getdirs";console.log(d),this.doGet(d,a,b)}},HeaderWidget.prototype={setAccountData:function(a){this.accountData=a,this.opencgaBrowserWidget.setAccountData(a),Ext.getCmp(this.id+"textUser").setText(this._getAccountText())},getAccountInfo:function(){var a=null;null!=this.accountData&&(a=this.accountData.lastActivity),$.cookie("bioinfo_account")?this.adapter.getAccountInfo($.cookie("bioinfo_account"),$.cookie("bioinfo_sid"),a):(console.log("cookie: bioinfo_account, is not set, session will be finished..."),this.sessionFinished())},_getAccountText:function(){var a=this.accountData.accountId;return-1!=a.indexOf("anonymous_")&&(a="anonymous"),'logged in as '+a+""},sessionInitiated:function(){var a=this;this.loginWidget.clean(),Ext.getCmp(this.id+"btnSignin").hide(),Ext.getCmp(this.id+"btnLogout").show(),Ext.getCmp(this.id+"btnEdit").show(),Ext.getCmp(this.id+"btnOpencga").show(),this.accountInfoInterval||(this.getAccountInfo(),this.accountInfoInterval=setInterval(function(){a.getAccountInfo()},this.checkTimeInterval))},sessionFinished:function(){Ext.getCmp(this.id+"btnOpencga").hide(),Ext.getCmp(this.id+"btnLogout").hide(),Ext.getCmp(this.id+"btnEdit").hide(),Ext.getCmp(this.id+"btnSignin").show(),Ext.getCmp(this.id+"textUser").setText(""),clearInterval(this.accountInfoInterval),delete this.accountInfoInterval,this.profileWidget.hide(),this.opencgaBrowserWidget.hide()},setDescription:function(a){$("#"+this.id+"description").html(a)},draw:function(){return this.rendered?(null!=$.cookie("bioinfo_sid")?this.sessionInitiated():this.sessionFinished(),void 0):(console.info("Header Widget is not rendered yet"),void 0)},getPanel:function(){return this.draw(),this.panel},setWidth:function(a){this.width=a,this.getPanel().setWidth(a)},render:function(a){var b=this;if(this.targetId=a?a:this.targetId,$("#"+this.targetId).length<1)return console.log("targetId not found in DOM"),void 0;if(null==this.panel){switch(this.suiteId){case 11:this.homeLink="http://renato.bioinfo.cipf.es",this.helpLink="http://bioinfo.cipf.es/docs/renato/",this.tutorialLink="http://bioinfo.cipf.es/docs/renato/tutorial",this.aboutText="";break;case 6:this.homeLink="http://variant.bioinfo.cipf.es",this.helpLink="http://docs.bioinfo.cipf.es/projects/variant",this.tutorialLink="http://docs.bioinfo.cipf.es/projects/variant/wiki/Tutorial",this.aboutText="";break;case 9:this.homeLink="http://www.genomemaps.org",this.helpLink="http://wiki.opencb.org/projects/visualization/doku.php?id=genome-maps:overview",this.tutorialLink="http://wiki.opencb.org/projects/visualization/doku.php?id=genome-maps:tutorial",this.aboutText='Genome Maps is built with open and free technologies like HTML5 and SVG inline, so no plug-in is needed in modern internet browsers. We’ve focused on providing the best user experience possible with a modern drag navigation and many features included.

Genome Maps project has been developed in the Computational Biology Unit led by Ignacio Medina, at Computational Genomic Institute led by Joaquin Dopazo at CIPF. Two people from my lab deserve special mention for their fantastic job done:
Franscisco Salavert and Alejandro de Maria.

Genome Maps has been designed to be easily be embedded in any project with a couple of lines of code, and it has been implemented as a plugin framework to extend the standard features.

Supported browsers include: Google Chrome 14+, Apple Safari 5+, Opera 12+ and Mozilla Firefox 14+ (works slower than in the other browsers). Internet Explorer 10 is under RC and seems to work properly.

For more information or suggestions about Genome Maps please contact
Ignacio Medina: imedina@cipf.es';break;case 10:this.homeLink="http://www.cellbrowser.org",this.helpLink="http://docs.bioinfo.cipf.es/projects/cellbrowser",this.tutorialLink="http://docs.bioinfo.cipf.es/projects/cellbrowser/wiki/Tutorial",this.aboutText="";break;case 12:this.homeLink="http://bioinfo.cipf.es/apps/untbgen",this.helpLink="http://bioinfo.cipf.es/ecolopy/",this.tutorialLink="http://bioinfo.cipf.es/ecolopy/",this.aboutText="";break;case 22:this.homeLink="http://pathiways.bioinfo.cipf.es",this.helpLink="http://bioinfo.cipf.es/pathiways",this.tutorialLink="http://bioinfo.cipf.es/pathiways/tutorial",this.aboutText='PATHiWAYS is built with open and free technologies like HTML5 and SVG inline, so no plug-in is needed in modern internet browsers

PATHiWAYS project has been developed in the Computational Biology Unit, at Computational Medicine Institute at CIPF in Valencia, Spain.

For more information please visit our web page bioinfo.cipf.es';break;default:this.homeLink="http://docs.bioinfo.cipf.es",this.helpLink="http://docs.bioinfo.cipf.es",this.tutorialLink="http://docs.bioinfo.cipf.es",this.aboutText=""}var c=new Ext.create("Ext.toolbar.Toolbar",{id:this.id+"linkbar",dock:"top",cls:"bio-linkbar",height:40,minHeight:40,maxHeight:40,items:[{xtype:"tbtext",id:this.id+"speciesTextItem",text:""},{xtype:"tbtext",id:this.id+"assemblyTextItem",text:""},"->",{id:this.id+"homeButton",text:"home",handler:function(){window.location.href=b.homeLink}},{id:this.id+"helpButton",text:"documentation",handler:function(){window.open(b.helpLink)}},{id:this.id+"tutorialButton",text:"tutorial",handler:function(){window.open(b.tutorialLink)}},{id:this.id+"aboutButton",text:"about",handler:function(){Ext.create("Ext.window.Window",{id:b.id+"aboutWindow",bodyStyle:"background:#fff; color:#333;",bodyPadding:10,title:"About",height:340,width:500,modal:!0,layout:"fit",html:b.aboutText}).show()}}]}),d=new Ext.create("Ext.toolbar.Toolbar",{id:this.id+"userbar",dock:"top",border:!1,cls:"gm-login-bar",height:27,minHeight:27,maxHeight:27,layout:"hbox",items:[{xtype:"tbtext",id:this.id+"textNews",text:this.news},"->",{xtype:"tbtext",id:this.id+"textUser",text:""},{id:this.id+"btnOpencga",text:'Upload & Manage',iconCls:"icon-project-manager",handler:function(){b.opencgaBrowserWidget.draw("manager") -}},{id:this.id+"btnSignin",disabled:!this.allowLogin,text:'sign in',handler:function(){b.loginWidget.draw()}},{id:this.id+"btnEdit",text:'profile',handler:function(){b.profileWidget.draw()}},{id:this.id+"btnLogout",text:'logout',handler:function(){b.adapter.logout($.cookie("bioinfo_account"),$.cookie("bioinfo_sid"))}}]});this.panel=Ext.create("Ext.panel.Panel",{id:this.id+"panel",region:"north",border:!1,renderTo:this.targetId,height:this.height,minHeight:this.height,maxHeigth:this.height,width:this.width,layout:"hbox",items:[{xtype:"container",items:[{id:this.id+"appTextItem",xtype:"tbtext",margin:"25 0 0 20",text:''+this.appname+" "+''+this.description+""+'',padding:"0 0 0 10",listeners:{afterrender:function(){$("#"+b.id+"appTextItem").qtip({content:''+b.version+"",position:{my:"bottom center",at:"top center",adjust:{y:12,x:-25}}})}}}]},{xtype:"container",flex:2,layout:{type:"vbox",align:"right"},items:[d,c]}]})}this.rendered=!0}},JobListWidget.prototype.draw=UserListWidget.prototype.draw,JobListWidget.prototype.getData=UserListWidget.prototype.getData,JobListWidget.prototype.getCount=UserListWidget.prototype.getCount,JobListWidget.prototype.show=function(){this.pagedListViewWidget.show()},JobListWidget.prototype.hide=function(){this.pagedListViewWidget.hide()},JobListWidget.prototype.draw=function(){},JobListWidget.prototype.clean=function(){clearInterval(this.interval),1==this.bar.isDescendantOf(Ext.getCmp(this.pagedListViewWidget.panelId))&&Ext.getCmp(this.pagedListViewWidget.panelId).removeDocked(this.bar,!1),this.pagedListViewWidget.clean()},JobListWidget.prototype.setAccountData=function(a){this.accountData=a,console.log("joblistwidget");for(var b,c=[],d=0;d'+a.all+"
"),Ext.getCmp(this.btnFinishedId).setText(''+a.finished+""),Ext.getCmp(this.btnVisitedId).setText(''+a.visited+""),Ext.getCmp(this.btnRunningId).setText(''+a.running+""),Ext.getCmp(this.btnQueuedId).setText(''+a.queued+"")},JobListWidget.prototype.getJobCounter=function(){for(var a=0,b=0,c=0,d=0,e=0;e0?b++:(0==this.getData()[e].visites&&a++,-1==this.getData()[e].visites&&c++,-2==this.getData()[e].visites&&d++);return{all:this.getData().length,visited:b,finished:a,running:c,queued:d}},JobListWidget.prototype.filter=function(a){switch(a.id){case this.btnFinishedId:this.pagedListViewWidget.setFilter(function(a){return 0==a.data.visites});break;case this.btnVisitedId:this.pagedListViewWidget.setFilter(function(a){return a.data.visites>0});break;case this.btnRunningId:this.pagedListViewWidget.setFilter(function(a){return-1==a.data.visites});break;case this.btnQueuedId:this.pagedListViewWidget.setFilter(function(a){return-2==a.data.visites});break;default:this.pagedListViewWidget.setFilter(function(){return!0})}this.pagedListViewWidget.draw(this.getData())},JobListWidget.prototype.selectProjectData=function(){if(this.projectFilterButton.pressed){for(var a=new Array,b=0;bFill all fields',!1)},LoginWidget.prototype.sendRecover=function(){this.checkAccountId()&&this.checkemail()&&(this.adapter.resetPassword(this.getLogin(),this.getEmail()),this.panel.setLoading("Waiting server..."))},LoginWidget.prototype.getLogin=function(){return Ext.getCmp(this.id+"accountId").getValue()},LoginWidget.prototype.getAccountName=function(){return Ext.getCmp(this.id+"accountName").getValue()},LoginWidget.prototype.getEmail=function(){return Ext.getCmp(this.fldEmailId).getValue()},LoginWidget.prototype.getPassword=function(){return $.sha1(Ext.getCmp(this.fldPasswordId).getValue())},LoginWidget.prototype.getPasswordReg=function(){return $.sha1(Ext.getCmp(this.fldNpass1Id).getValue())},LoginWidget.prototype.draw=function(){this.render()},LoginWidget.prototype.clean=function(){null!=this.panel&&this.panel.destroy()},LoginWidget.prototype.render=function(){var a=this;if(null==this.panel){var b=Ext.create("Ext.toolbar.TextItem",{id:this.labelEmailId,padding:3,text:'Type your account ID and password'});this.pan=Ext.create("Ext.form.Panel",{id:this.id+"formPanel",bodyPadding:20,width:350,height:145,border:!1,bbar:{items:[b]},items:[{id:this.id+"accountId",xtype:"textfield",value:$.cookie("bioinfo_user"),fieldLabel:"account ID",hidden:!1,listeners:{scope:this,change:this.checkAccountId}},{id:this.fldPasswordId,xtype:"textfield",fieldLabel:"password",inputType:"password",listeners:{specialkey:function(b,c){c.getKey()==c.ENTER&&a.sign()}}},{id:this.fldEmailId,xtype:"textfield",fieldLabel:"e-mail",hidden:!0,listeners:{change:function(){a.checkemail()},specialkey:function(b,c){c.getKey()==c.ENTER&&a.sign()}}},{id:this.id+"accountName",xtype:"textfield",fieldLabel:"name",hidden:!0,listeners:{scope:this,change:this.checkName}},{id:this.fldNpass1Id,xtype:"textfield",fieldLabel:"password",inputType:"password",hidden:!0,listeners:{scope:this,change:this.checkpass}},{id:this.fldNpass2Id,xtype:"textfield",fieldLabel:"re-password",inputType:"password",hidden:!0,listeners:{scope:this,change:this.checkpass}},{id:this.btnAnonymousId,xtype:"checkboxfield",padding:"10 0 0 0",boxLabel:'Anonymous login

Your work will be lost after logout

',margin:"0 0 0 50",listeners:{change:function(b,c){c?(Ext.getCmp(a.id+"accountId").disable(),Ext.getCmp(a.fldPasswordId).disable()):(Ext.getCmp(a.id+"accountId").enable(),Ext.getCmp(a.fldPasswordId).enable())}}}]}),this.panel=Ext.create("Ext.window.Window",{id:this.id+"windowPanel",title:"Sign in",resizable:!1,minimizable:!0,constrain:!0,closable:!0,modal:!0,items:[this.pan],buttonAlign:"center",buttons:[{id:this.btnSignId,text:"Sign in"},{id:this.btnForgotId,text:"Forgot yout password?",width:130,minWidth:130},{id:this.btnNewaccId,text:"New account",width:100,minWidth:100},{id:this.btnSendId,text:"Send",hidden:!0},{id:this.btnRegisterId,text:"Register",hidden:!0},{id:this.btnBackId,text:"Back",hidden:!0}],listeners:{scope:this,minimize:function(){this.panel.hide()},destroy:function(){delete this.panel}}}),Ext.getCmp(this.btnForgotId).on("click",this.ShowForgot,this),Ext.getCmp(this.btnBackId).on("click",this.ShowBack,this),Ext.getCmp(this.btnNewaccId).on("click",this.ShowNewacc,this),Ext.getCmp(this.btnSignId).on("click",this.sign,this),Ext.getCmp(this.btnSendId).on("click",this.sendRecover,this),Ext.getCmp(this.btnRegisterId).on("click",this.register,this),Ext.getCmp(this.btnAnonymousId).on("change",this.anonymousSelected,this)}this.panel.show()},LoginWidget.prototype.ShowForgot=function(){Ext.getCmp(this.fldEmailId).reset(),Ext.getCmp(this.fldEmailId).show(),Ext.getCmp(this.fldPasswordId).reset(),Ext.getCmp(this.btnAnonymousId).reset(),Ext.getCmp(this.fldNpass1Id).reset(),Ext.getCmp(this.fldNpass2Id).reset(),Ext.getCmp(this.fldPasswordId).hide(),Ext.getCmp(this.btnAnonymousId).hide(),Ext.getCmp(this.fldNpass1Id).hide(),Ext.getCmp(this.fldNpass2Id).hide(),Ext.getCmp(this.btnSignId).hide(),Ext.getCmp(this.btnForgotId).hide(),Ext.getCmp(this.btnNewaccId).hide(),Ext.getCmp(this.btnSendId).show(),Ext.getCmp(this.btnBackId).show(),Ext.getCmp(this.btnRegisterId).hide(),Ext.getCmp(this.id+"accountId").reset(),Ext.getCmp(this.id+"accountName").hide(),Ext.getCmp(this.labelEmailId).setText('Type your account ID and email to send a new password',!1),Ext.getCmp(this.id+"formPanel").setHeight(145),Ext.getCmp(this.id+"accountId").setFieldLabel("account ID",!1),Ext.getCmp(this.fldEmailId).setFieldLabel("e-mail",!1)},LoginWidget.prototype.ShowBack=function(){Ext.getCmp(this.fldEmailId).hide(),Ext.getCmp(this.fldPasswordId).reset(),Ext.getCmp(this.btnAnonymousId).reset(),Ext.getCmp(this.fldNpass1Id).reset(),Ext.getCmp(this.fldNpass2Id).reset(),Ext.getCmp(this.fldPasswordId).show(),Ext.getCmp(this.btnAnonymousId).show(),Ext.getCmp(this.fldNpass1Id).hide(),Ext.getCmp(this.fldNpass2Id).hide(),Ext.getCmp(this.btnSignId).show(),Ext.getCmp(this.btnForgotId).show(),Ext.getCmp(this.btnNewaccId).show(),Ext.getCmp(this.btnSendId).hide(),Ext.getCmp(this.btnBackId).hide(),Ext.getCmp(this.btnRegisterId).hide(),Ext.getCmp(this.id+"accountId").reset(),Ext.getCmp(this.id+"accountName").hide(),Ext.getCmp(this.labelEmailId).setText('Type your account ID and password',!1),Ext.getCmp(this.id+"formPanel").setHeight(145),Ext.getCmp(this.id+"accountId").setFieldLabel("account ID",!1)},LoginWidget.prototype.ShowNewacc=function(){Ext.getCmp(this.fldEmailId).reset(),Ext.getCmp(this.fldEmailId).show(),Ext.getCmp(this.fldPasswordId).reset(),Ext.getCmp(this.btnAnonymousId).reset(),Ext.getCmp(this.fldNpass1Id).reset(),Ext.getCmp(this.fldNpass2Id).reset(),Ext.getCmp(this.fldPasswordId).hide(),Ext.getCmp(this.btnAnonymousId).hide(),Ext.getCmp(this.fldNpass1Id).show(),Ext.getCmp(this.fldNpass2Id).show(),Ext.getCmp(this.btnSignId).hide(),Ext.getCmp(this.btnForgotId).hide(),Ext.getCmp(this.btnNewaccId).hide(),Ext.getCmp(this.btnSendId).hide(),Ext.getCmp(this.btnBackId).show(),Ext.getCmp(this.btnRegisterId).show(),Ext.getCmp(this.id+"accountId").reset(),Ext.getCmp(this.id+"accountName").reset(),Ext.getCmp(this.id+"accountName").show(),Ext.getCmp(this.labelEmailId).setText(" ",!1),Ext.getCmp(this.id+"formPanel").setHeight(200),Ext.getCmp(this.id+"accountName").setFieldLabel("name",!1),Ext.getCmp(this.id+"accountId").setFieldLabel("account ID",!1),Ext.getCmp(this.fldEmailId).setFieldLabel("e-mail",!1),Ext.getCmp(this.fldNpass1Id).setFieldLabel("password",!1),Ext.getCmp(this.fldNpass2Id).setFieldLabel("re-password",!1),Ext.getCmp(this.id+"accountId").setValue("")},LoginWidget.prototype.checkpass=function(){var a=Ext.getCmp(this.fldNpass1Id).getValue(),b=Ext.getCmp(this.fldNpass2Id).getValue(),c=new RegExp("[ *]");return!c.test(a)&&a.length>3?a==b?(Ext.getCmp(this.fldNpass1Id).setFieldLabel('password',!1),Ext.getCmp(this.fldNpass2Id).setFieldLabel('re-password',!1),Ext.getCmp(this.labelEmailId).setText(" ",!1),!0):(Ext.getCmp(this.fldNpass1Id).setFieldLabel('password',!1),Ext.getCmp(this.fldNpass2Id).setFieldLabel('re-password',!1),Ext.getCmp(this.labelEmailId).setText('Password does not match',!1),!1):(Ext.getCmp(this.fldNpass1Id).setFieldLabel('password',!1),Ext.getCmp(this.fldNpass2Id).setFieldLabel('re-password',!1),Ext.getCmp(this.labelEmailId).setText('Password minimum length is 4',!1),!1)},LoginWidget.prototype.anonymousSelected=function(a,b){b?Ext.getCmp(this.labelEmailId).setText('Anonymous selected',!1):Ext.getCmp(this.labelEmailId).setText('Type your account ID and password',!1)},LoginWidget.prototype.checkemail=function(){Ext.getCmp(this.btnAnonymousId).reset();var a=Ext.getCmp(this.fldEmailId).getValue(),b=/^([a-zA-Z0-9_\.\-])+\@(([a-zA-Z0-9\-])+\.)+([a-zA-Z0-9]{2,4})+$/;return b.test(a)?(Ext.getCmp(this.fldEmailId).setFieldLabel('e-mail',!1),!0):(Ext.getCmp(this.fldEmailId).setFieldLabel('e-mail',!1),!1)},LoginWidget.prototype.checkName=function(){var a=Ext.getCmp(this.id+"accountName").getValue();return""!=a&&null!=a?(Ext.getCmp(this.id+"accountName").setFieldLabel('name',!1),!0):(Ext.getCmp(this.id+"accountName").setFieldLabel('name',!1),!1)},LoginWidget.prototype.checkAccountId=function(){var a=Ext.getCmp(this.id+"accountId").getValue();return""!=a&&null!=a?(Ext.getCmp(this.id+"accountId").setFieldLabel('account ID',!1),!0):(Ext.getCmp(this.id+"accountId").setFieldLabel('account ID',!1),!1)},OpencgaBrowserWidget.prototype={id:"OpencgaBrowserWidget_"+Math.round(1e7*Math.random()),title:"Cloud data",onSelect:new Event(this),onNeedRefresh:new Event(this),width:800,height:575,rendered:!1,hide:function(){this.panel.hide()},draw:function(a){this.render(a),this.rendered=!0},setAccountData:function(a){this.accountData=a,this.rendered&&this._updateFolderTree()},_updateFolderTree:function(){console.log("updating folder tree");var a=function(a,b){for(var c=0;cCancel',margin:"3 6 0 4",width:50,handler:function(){b.terminate(),f.destroy()}}),f=Ext.create("Ext.container.Container",{padding:"3 6 0 6",layout:"hbox",items:[d,c,e]});b.onmessage=function(a){var b=a.data;console.log("@@@@@@@@@@@@@@@@ WORKER event message"),console.log(b),c.updateProgress((b.chunkId+1)/b.total,"uploading part "+(b.chunkId+1)+" of "+b.total,!1),1==b.finished&&e.setText('Done ')},this.activeUploadsCont.add(f),Ext.getCmp(this.id+"activeUploadsButton").toggle(!0)},viewBuckets:function(){var a=this;a.panel.removeAll(!1),a.panel.add(a.panAccordion),a.panel.add(a.filesGrid)},viewUploads:function(){var a=this;a.panel.removeAll(!1),a.panel.add(a.activeUploadsCont)}},OpencgaBrowserWidget.prototype.render=function(a){var b=this,a=a||{},c=a.mode;if(this.allowedTypes=a.allowedTypes,null==this.panel){this.folderStore=Ext.create("Ext.data.TreeStore",{id:this.id+"folderStore",fields:["text","oid"],root:{expanded:!0,text:"Drive",children:[]},listeners:{beforeappend:function(a,b){return b.isLeaf()?!1:void 0}}}),this.allStore=Ext.create("Ext.data.TreeStore",{id:this.id+"allStore",fields:["text","oid"],root:{expanded:!0,text:"Drive",children:[]}}),this.filesStore=Ext.create("Ext.data.Store",{fields:["oid","fileBioType","fileType","fileFormat","fileName","multiple","diskUsage","creationTime","responsible","organization","date","description","status","statusMessage","members"],data:[]});var d=Ext.create("Ext.Action",{icon:Utils.images.refresh,text:"Refresh bucket",handler:function(){var a=b.folderTree.getSelectionModel().getSelection()[0];if(a&&a.raw.isBucket){var c=new OpencgaManager;c.onRefreshBucket.addEventListener(function(a,c){Ext.example.msg("Refresh Bucket",''+c+""),-1!=c.indexOf("ERROR")?console.log(c):b.onNeedRefresh.notify()}),c.refreshBucket($.cookie("bioinfo_account"),a.raw.text,$.cookie("bioinfo_sid"))}}}),e=Ext.create("Ext.Action",{text:"Rename bucket",handler:function(){var a=b.folderTree.getSelectionModel().getSelection()[0];a&&a.raw.isBucket&&Ext.Msg.prompt("Rename bucket","Please enter a new name:",function(c,d){if("ok"==c){d=d.replace(/[^a-z0-9-_.\/\s]/gi,"").trim();var e=new OpencgaManager;e.onRenameBucket.addEventListener(function(a,c){Ext.example.msg("Refresh Bucket",''+c+""),-1!=c.indexOf("ERROR")?console.log(c):b.onNeedRefresh.notify()}),e.renameBucket($.cookie("bioinfo_account"),a.raw.bucketId,d,$.cookie("bioinfo_sid"))}},null,null,"new name")}});this.folderTree=Ext.create("Ext.tree.Panel",{id:this.id+"activeTracksTree",title:"Upload & Manage",bodyPadding:"5 0 0 0",margin:"-1 0 0 0",border:!1,autoScroll:!0,flex:4,useArrows:!0,rootVisible:!1,hideHeaders:!0,columns:[{xtype:"treecolumn",dataIndex:"text",flex:1,editor:{xtype:"textfield",allowBlank:!1}}],viewConfig:{markDirty:!1,plugins:{ptype:"treeviewdragdrop"},listeners:{drop:function(a,c){var d=c.records[0];if(d.isLeaf()&&d.data.index!=d.removedFrom&&d.data.checked){var e=d.data.trackId;b.setTrackIndex(e,d.data.index)}},itemcontextmenu:function(a,b,c,f,g){g.stopEvent();var h=[];if(console.log(b),b.raw.isBucket){h.push(d),h.push(e);var i=Ext.create("Ext.menu.Menu",{items:h});i.showAt(g.getXY())}return!1}}},listeners:{selectionchange:function(a,d){var e=d[0];if("undefined"!=typeof e){var f,g;null!=e.raw.isBucket?(f="text",g=!1):(f="oid",g=!0);var h=b.allStore.getRootNode().findChild(f,e.raw[f],g),i=[];b.selectedFolderNode={value:h.data[f],field:f},h.eachChild(function(a){i.push(a.raw)}),b.filesGrid.setTitle(h.getPath("text"," / ")),b.filesStore.loadData(i),"folderSelection"==c&&(b.selectedFileNode=h.raw,b.selectButton.enable())}},viewready:function(a){setTimeout(function(){var b=a.getRootNode().getChildAt(0);"undefined"!=typeof b&&a.getSelectionModel().select(b)},0)},checkchange:function(){},itemmouseenter:function(){},itemmouseleave:function(){}},store:this.folderStore});var f=Ext.create("Ext.button.Button",{text:"OK",handler:function(){b.createProject(),b.folderTree.toggleCollapse()}}),g=Ext.create("Ext.form.field.Text",{id:this.id+"newProjectNameField",emptyText:"name",allowBlank:!1}),h=Ext.create("Ext.form.field.TextArea",{id:this.id+"newProjectDescriptionField",emptyText:"description"});Ext.create("Ext.container.Container",{flex:1,layout:{type:"hbox",align:"stretch"},items:[g,h]});var i=Ext.create("Ext.panel.Panel",{title:"Create bucket",bodyPadding:5,border:!1,items:[g,h,f]}),j=Ext.create("Ext.Action",{icon:Utils.images.info,text:"Create index",handler:function(){var a=b.filesGrid.getSelectionModel().getSelection()[0];if(a){var c=new OpencgaManager;c.onIndexer.addEventListener(function(b,c){console.log(c),Ext.example.msg("indexer",c),a.raw.indexerId=c}),c.indexer($.cookie("bioinfo_account"),$.cookie("bioinfo_sid"),a.raw.bucketId,a.data.oid)}}}),k=Ext.create("Ext.Action",{text:"Show name",handler:function(){var a=b.filesGrid.getSelectionModel().getSelection()[0];a&&Ext.example.msg("objectId",""+a.get("oid"))}}),l=Ext.create("Ext.Action",{icon:Utils.images.del,text:"Delete this file",handler:function(){var a=b.filesGrid.getSelectionModel().getSelection()[0];a&&Ext.MessageBox.confirm("Confirm",'Are you sure you want to delete this file?

'+a.data.fileName+"

",function(c){if("yes"==c){console.log("deleting");var d=new OpencgaManager;d.onDeleteObjectFromBucket.addEventListener(function(c,d){-1!=d.indexOf("ERROR:")?Ext.example.msg("Deleting",d):(a.destroy(),b.onNeedRefresh.notify())}),d.deleteObjectFromBucket($.cookie("bioinfo_account"),$.cookie("bioinfo_sid"),a.raw.bucketId,a.data.oid)}})}});this.filesGrid=Ext.create("Ext.grid.Panel",{title:this.allStore.getRootNode().getPath("text"," / "),store:this.filesStore,flex:4,border:!1,viewConfig:{stripeRows:!0,listeners:{itemcontextmenu:function(a,b,c,d,e){e.stopEvent();var f=[k];console.log(b),("bam"==b.raw.fileFormat||"vcf"==b.raw.fileFormat)&&f.push(j),f.push(l);var g=Ext.create("Ext.menu.Menu",{items:f});return g.showAt(e.getXY()),!1}}},selModel:{mode:"SINGLE",listeners:{selectionchange:function(a,d){if(d.length>0){b.selectedFileNode=d[0].raw;var e=d[0].raw.fileType,f=d[0].raw.fileFormat;if("fileSelection"==c&&"dir"==e)return;if(console.log(b.allowedTypes),"undefined"!=typeof b.allowedTypes&&-1==b.allowedTypes.indexOf(f))return console.log("file format NOT allowed -"+f+"- "),void 0;console.log("file format allowed -"+f+"- "),b.selectButton.enable()}else b.selectButton.disable()}}},columns:[{text:"File type",xtype:"actioncolumn",menuDisabled:!0,align:"center",width:54,icon:Utils.images.bluebox,renderer:function(a,b,c){this.icon=Utils.images[c.data.fileType],this.tooltip=c.data.fileType}},{text:"Name",dataIndex:"fileName",flex:2},{text:"Creation time",dataIndex:"creationTime",flex:1}]}),this.panAccordion=Ext.create("Ext.panel.Panel",{minWidth:125,minHeight:250,flex:1,cls:"ocb-border-right-lightgrey",border:!1,layout:"accordion",items:[this.folderTree,i]}),this.selectButton=Ext.create("Ext.button.Button",{text:"Ok",disabled:!0,handler:function(){b.onSelect.notify({id:b.selectedFileNode.oid,bucketId:b.selectedFileNode.bucketId}),b.panel.close()}}),this.activeUploadsCont=Ext.create("Ext.panel.Panel",{title:"Active uploads",animCollapse:!1,hidden:!0,bodyPadding:"10 0 10 0",autoScroll:!0,height:125,border:0,cls:"ocb-border-top-lightgrey",items:[]});var m={items:[]};switch(c){case"folderSelection":var n;n={text:"New folder",handler:function(){b.folderTree.expand(),b.createFolder()}},m.items.splice(0,0,n),n={text:"New bucket",handler:function(){i.expand()}},m.items.splice(0,0,n),this.filesStore.filter("fileType",/dir/);break;case"manager":var n;n={text:"Upload",handler:function(){b.drawUploadWidget()}},m.items.splice(0,0,n),n={text:"New folder",handler:function(){b.folderTree.expand(),b.createFolder()}},m.items.splice(0,0,n),n={text:"New bucket",handler:function(){i.expand()}},m.items.splice(0,0,n),this.selectButton.hide();break;default:var n;n={text:"Upload",handler:function(){b.drawUploadWidget()}},m.items.splice(0,0,n),n={text:"New folder",handler:function(){b.folderTree.expand(),b.createFolder()}},m.items.splice(0,0,n),n={text:"New bucket",handler:function(){i.expand()}},m.items.splice(0,0,n)}1==this.chunkedUpload&&m.items.push({id:this.id+"activeUploadsButton",text:"Active uploads",enableToggle:!0,pressed:!1,toggleHandler:function(){this.pressed?b.activeUploadsCont.show():b.activeUploadsCont.hide()}}),this.panel=Ext.create("Ext.window.Window",{title:"Upload & Manage",resizable:!1,minimizable:!0,constrain:!0,closable:!1,modal:!0,height:this.height,minHeight:this.height,width:this.width,minWidth:this.width,resizable:!0,layout:{type:"vbox",align:"stretch"},tbar:m,items:[{xtype:"container",flex:3,minWidth:125,layout:{type:"hbox",align:"stretch"},items:[this.panAccordion,this.filesGrid]},this.activeUploadsCont],buttonAlign:"right",buttons:[{text:"Close",handler:function(){b.onSelect=new Event,b.panel.hide()}},this.selectButton],listeners:{scope:this,minimize:function(){this.panel.hide()},destroy:function(){delete this.panel}}})}this._updateFolderTree(),this.panel.show()},OpencgaBrowserWidget.prototype.setFilter=function(){var a=this,b=this.viewOrigin.getSelectionModel().getSelection()[0],c=this.viewSuite.getSelectionModel().getSelection()[0];if(this.folderStore.clearFilter(),null!=b)switch(b.data.suiteId){case"all":break;case"Uploaded Data":this.folderStore.filter(function(a){return a.data.jobId<0});break;case"Job Generated":this.folderStore.filter(function(a){return a.data.jobId>0})}if(null!=c)switch(c.data.suiteId){case 1:break;default:this.folderStore.filter(function(a){return a.data.suiteId==c.data.suiteId})}this.folderStore.filter(function(b){var c=Ext.getCmp(a.searchFieldId).getValue().toLowerCase();return b.data.name.toLowerCase().indexOf(c)<0?!1:!0})},OpencgaBrowserWidget.prototype.checkTags=function(a){for(var b=0;b-1){for(var c=this.tags[b].split("|"),d=!1,e=0;e-1&&(d=!0);if(!d)return!1}else if(-1==a.indexOf(this.tags[b]))return!1;return!0},OpencgaBrowserWidget.prototype.createProject=function(){var a=this,b=Ext.getCmp(this.id+"newProjectNameField").getValue(),c=Ext.getCmp(this.id+"newProjectDescriptionField").getValue();""!=b&&(Ext.getBody().mask(),a.panel.setLoading("Creating project"),this.adapter.createBucket(b,c,$.cookie("bioinfo_account"),$.cookie("bioinfo_sid")))},OpencgaBrowserWidget.prototype._getFolderTreeSelection=function(){var a=this.folderTree.getSelectionModel().getSelection();if(a.length<1)return Ext.example.msg("No folder selected","Please select a bucket or a folder."),null;var b,c=a[0],d="";if(null!=c.raw.fileType&&"dir"==c.raw.fileType){var e=c.getPath("text","/").substr(1),f=e.split("/",2);d=e.replace(f.join("/"),"").substr(1)+"/",b=f[1]}else b=c.raw.text;return{bucketId:b,directory:d}},OpencgaBrowserWidget.prototype.drawUploadWidget=function(){var a=this,b=this._getFolderTreeSelection();null!=b&&a.uploadWidget.draw(b)},OpencgaBrowserWidget.prototype.createFolder=function(){var a=this;if(this.accountData.buckets.length<1)Ext.MessageBox.alert("No buckets found","Please create and select a bucket.");else{var b=this._getFolderTreeSelection();null!=b&&Ext.Msg.prompt("New folder","Please enter a name for the new folder:",function(c,d){if("ok"==c){d=d.replace(/[^a-z0-9-_.\s]/gi,""),d=d.trim()+"/";var e=new OpencgaManager;e.onCreateDirectory.addEventListener(function(b,c){Ext.example.msg("Create folder",''+c+""),-1!=c.indexOf("ERROR")?console.log(c):a.onNeedRefresh.notify()}),e.createDirectory($.cookie("bioinfo_account"),$.cookie("bioinfo_sid"),b.bucketId,b.directory+d)}},null,null,"New Folder")}},PagedViewListWidget.prototype.getData=function(){return this._data},PagedViewListWidget.prototype._setData=function(a){this._data=a},PagedViewListWidget.prototype.setFilter=function(a){this.store.clearFilter(),null!=a?(this.filterFunction=a,this.store.filter([a,this.textFilterFunction])):this.store.filter([this.textFilterFunction])},PagedViewListWidget.prototype.draw=function(a){this._setData(a),this.render(),this.store.loadData(this.getData()),null!=this.filterFunction&&this.setFilter(this.filterFunction)},PagedViewListWidget.prototype.clean=function(){null!=this.panel&&(this.panel.destroy(),delete this.panel)},PagedViewListWidget.prototype.render=function(){var a=this;if(null==this.panel){this.tpl=new Ext.XTemplate(this.template),this.store=Ext.create("Ext.data.Store",{fields:this.storeFields,sorters:[{property:"date",direction:"DESC"}],autoLoad:!1});var b=null;if("view"==this.mode&&(this.view=Ext.create("Ext.view.View",{id:this.id+"view",padding:15,store:this.store,tpl:this.tpl,height:this.height,trackOver:!0,autoScroll:!0,overItemCls:"list-item-hover",itemSelector:".joblist-item",listeners:{scope:this,itemclick:function(a,b){console.log(b.data),this.onItemClick.notify(b)}}}),b=this.view),"grid"==this.mode){for(var c=[],d=0;d",b]},layout:"accordion",items:[c,d],listeners:{tabchange:function(){a.clearAllFields()}}});this.panel=Ext.create("Ext.window.Window",{title:"Profile",resizable:!1,minimizable:!0,constrain:!0,closable:!0,modal:!0,items:[e],buttonAlign:"center",buttons:[{text:"Close",handler:function(){a.panel.close()}}],listeners:{scope:this,minimize:function(){this.panel.hide()},destroy:function(){delete this.panel}}})}this.panel.show()},checkpass:function(){var a=Ext.getCmp(this.id+"fldNew1").getValue(),b=Ext.getCmp(this.id+"fldNew2").getValue(),c=Ext.getCmp(this.id+"fldOld").getValue(),d=new RegExp("[ *]");return""!=c?!d.test(a)&&a.length>3?a==b?(Ext.getCmp(this.id+"labelPass").setText('Passwords match',!1),!0):(Ext.getCmp(this.id+"labelPass").setText('Passwords does not match',!1),!1):(Ext.getCmp(this.id+"labelPass").setText('Password must be at least 4 characters',!1),!1):(Ext.getCmp(this.id+"labelPass").setText('Old password is empty',!1),!1)},checkemail:function(){var a=Ext.getCmp(this.id+"fldEmail").getValue(),b=/^([a-zA-Z0-9_\.\-])+\@(([a-zA-Z0-9\-])+\.)+([a-zA-Z0-9]{2,4})+$/;return b.test(a)?(Ext.getCmp(this.id+"fldEmail").setFieldLabel('e-mail',!1),!0):(Ext.getCmp(this.id+"fldEmail").setFieldLabel('e-mail',!1),""==a&&Ext.getCmp(this.id+"fldEmail").setFieldLabel("e-mail",!1),!1)}},ResultTable.prototype.draw=function(){this.render()},ResultTable.prototype.render=function(){var a=this,b=null,c=new Array,d=new Array;this.tableSkel=this.tableLayout,this.colNames=this.tableSkel.colNames,this.colVisibilty=this.tableSkel.colVisibility,this.colTypes=this.tableSkel.colTypes,b=this.tableSkel.numRows,c=new Array,d=new Array;for(var e=0;e'+a[c]+" {"+a[c].replace(/ /g,"_")+"}      ";return b+="

",new Ext.XTemplate(b)},ResultWidget.prototype.draw=function(a,b){this.record=b,this.jobId=this.record.data.id,this.id=this.jobId+this.id,this.panelId="ResultWidget_"+this.jobId,this.networkViewerId=this.panelId+"_CellBrowserId",this.genomeMapsId=this.panelId+"_GenomeMapsId",this.panel=Ext.getCmp(this.panelId),null==this.panel?(this.panel=Ext.create("Ext.panel.Panel",{id:this.panelId,border:0,title:this.record.data.name,closable:!0,autoScroll:!0}),Ext.getCmp(this.targetId).add(this.panel),Ext.getCmp(this.targetId).setActiveTab(this.panel),this.panel.setLoading("Loading job info..."),Ext.getBody().mask(),this.adapter.jobResult($.cookie("bioinfo_account"),a,this.jobId,"json")):Ext.getCmp(this.targetId).setActiveTab(this.panel)},ResultWidget.prototype.render=function(){var a=this;if(console.log(this.application),0!=this.data.outputItems.length){for(var b=this.data.inputItems.concat(this.data.outputItems),c={},d=0;d'}),i=Ext.create("Ext.container.Container",{margin:"15 0 5 15",html:'

The job named '+this.record.data.name+" "+'was launched on '+this.record.data.date+" "+"
"}),j=[],d=1;for(key in c){var k=this.jobId+key.replace(/\s/g,"_")+"group",l=Ext.create("Ext.container.Container",{padding:"0 0 2 15",width:14*key.length,groupId:k,html:''+d+". "+key+"",listeners:{afterrender:function(){this.getEl().addClsOnOver("ssel u"),this.getEl().addCls("dedo");var b=this.groupId;this.getEl().on("click",function(){var c=$("#"+b).position().top;$(a.panel.getEl().dom).children().scrollTop(c)})}}});j.push(l),d++}var d=1;for(key in c){var m=(this.jobId+key+"info").replace(/ /gi,""),k=this.jobId+key.replace(/\s/g,"_")+"group",l=Ext.create("Ext.container.Container",{infoId:m,groupName:key,padding:"60 15 5 15",html:'

'+d+". "+key+"    ↑"+'

',listeners:{afterrender:function(){this.getEl().addClsOnOver("ssel"),this.getEl().addCls("dedo"),this.getEl().on("click",function(){$(a.panel.getEl().dom).children().scrollTop(0)});var b=a.getInfo(this.groupName);if(""!=b){$("#"+this.infoId).html("+info");var c=Ext.create("Ext.tip.Tip",{html:b,listeners:{show:function(){var a=this;this.getEl().on("mouseleave",function(){a.hide()})}}});$("#"+this.infoId).mouseover(function(a){$(this).css({cursor:"pointer"}),c.showAt(a.clientX,a.clientY)}),$("#"+this.infoId).click(function(){c.hide()})}}}});j.push(l),j.push(this.getResults(c[key].items));var n=1;for(clave in c[key])if("items"!=clave){var l=Ext.create("Ext.container.Container",{padding:"15 15 5 30",cls:"inlineblock",html:'

'+d+"."+n+" "+clave+"

"});j.push(l),j.push(this.getResults(c[key][clave])),n++}d++}Ext.create("Ext.button.Button",{text:"Download",margin:"0 0 25 15",handler:function(){a.adapter.download(a.jobId,$.cookie("bioinfo_sid"))}}),Ext.create("Ext.button.Button",{text:"Delete",margin:"0 0 25 30",handler:function(){Ext.Msg.confirm("Delete job","Are you sure you want to delete this job?",function(b){"yes"==b&&(a.adapter.onDeleteJob.addEventListener(function(b,c){var d="";-1!=c.response.indexOf("OK")?(Ext.getCmp(a.targetId).getActiveTab().close(),d="The job has been succesfully deleted."):d="ERROR: could not delete job.",Ext.Msg.alert("Delete job",d)}),a.adapter.deleteJob(a.jobId,$.cookie("bioinfo_sid")))})}}),this.panel.add(h),this.panel.add(i),this.panel.add(j),a.onViewRendered.notify()}},ResultWidget.prototype.getResults=function(a){for(var b=[],c=0;c{title} ','{value}
',{disableFormats:!0,setCSS:function(a){switch(a.type){case"FILE":return"file";case"MESSAGE":return"species"==a.name&&(b.species=a.value),"message"}}});return itemBox=Ext.create("Ext.container.Container",{data:a,datos:a,margin:"0 10 0 20",padding:5,tpl:c,cls:"inlineblock",listeners:{afterrender:function(){var a=this.datos;"FILE"==this.datos.type&&(this.getEl().addClsOnOver("encima"),this.getEl().addCls("whiteborder"),"variant"==b.application&&-1!=a.title.toLowerCase().indexOf("filter")&&(b.filteredVcfFile=a.value),this.getEl().on("click",function(){console.log(a);var c=a.value.trim();b.adapter.poll($.cookie("bioinfo_account"),$.cookie("bioinfo_sid"),b.jobId,c,!0)}))}}})},ResultWidget.prototype.showTypeInfo=function(a){var b=this,c=Ext.create("Ext.container.Container",{margin:"0 10 0 10",padding:5});switch(a.type){case"IMAGE":var d=a.value.trim();return c.html='
',c;default:return null}},ResultWidget.prototype.showTagInfo=function(a){for(var b=this,c=Ext.create("Ext.container.Container",{margin:"0 10 0 10",flex:1,padding:5,html:""}),d=0;d
',c;case"HISTOGRAM":var f="histogram_"+b.jobId+a.value+a.tags;return b.resultHistograms[f]=a.value,c.html='
',c;case"GCHART":var f="gchart_"+a.name;return b.resultGCharts[f]=a.value,c.html='
',c;case"CONSEQUENCE_TYPE_VARIANTS":this.variantFiles[a.name]=a.title}return null},ResultWidget.prototype.drawTables=function(){for(id in this.resultTables)this.resultTables[id].draw()},ResultWidget.prototype.drawHistograms=function(){for(id in this.resultHistograms){var a=new OpencgaManager;a.onPoll.addEventListener(function(a,b){if(""!=b){for(var c=b.split("\n"),d=[],e=[],f=[],g=[],h=0,i=0;i';document.getElementById(id).innerHTML=j}}),a.poll($.cookie("bioinfo_account"),$.cookie("bioinfo_sid"),this.jobId,this.resultHistograms[id],!1)}},ResultWidget.prototype.drawGCharts=function(){for(id in this.resultGCharts)drawChart(id,this.resultGCharts[id])},ResultWidget.prototype.drawApplicationItems=function(){var a=this,b=Ext.create("Ext.container.Container",{id:this.application+this.id+"Container",border:!0,margin:"50 50 0 50",html:'
'});switch(this.application){case"variant":b.on("afterrender",function(){a.createGenomeViewer(a.id+"Container")});break;case"renato":var c=Ext.create("Ext.ProgressBar",{id:this.id+"pbar",margin:"5 0 0 50",width:500});c.wait({interval:500,duration:5e4,increment:15,text:"Getting database information and drawing the network, please wait...",scope:this,fn:function(){c.updateText("Done!")}}),this.panel.add(c),b.on("afterrender",function(){a.createCellBrowser(a.id+"Container")});break;default:return null}this.panel.add(b)},ResultWidget.prototype.createGenomeViewer=function(a){var b=this,c=Ext.getCmp(this.application+a).getWidth();Ext.getCmp(this.application+a).getHeight(),genomeViewer=new GenomeViewer(a,DEFAULT_SPECIES,{sidePanelCollapsed:!0,width:c-2,height:698}),genomeViewer.afterRender.addEventListener(function(){b.app.setTracks(genomeViewer),genomeViewer.addSidePanelItems(),new VariantFilterWidget(b.jobId,{width:c-2,targetId:b.application+a,viewer:genomeViewer,fileNames:b.variantFiles})}),genomeViewer.draw();var d=new OpencgaManager;d.onPoll.addEventListener(function(a,b){1!=b.indexOf("ERROR")&&console.error(b);var c=new VCFDataAdapter(new StringDataSource(b),{async:!1,species:genomeViewer.species}),d=new TrackData("VCF file",{adapter:c});genomeViewer.addTrack(d,{id:"VCF file",featuresRender:"MultiFeatureRender",histogramZoom:50,height:150,visibleRange:{start:0,end:100},featureTypes:FEATURE_TYPES})}),null!=this.filteredVcfFile?d.poll($.cookie("bioinfo_account"),$.cookie("bioinfo_sid"),b.jobId,this.filteredVcfFile,!1):console.log("No filtered VCF file.")};var mostSignificativesFeatures=new Array;ResultWidget.prototype.createCellBrowser=function(a){var b=this;record=this.record,Ext.getCmp(this.application+a).disable();var c=Ext.getCmp(this.application+a).getWidth(),d=Ext.getCmp(this.application+a).getHeight();this.networkViewer=new NetworkViewer(a,this.getSpeciesItem(this.species),{width:c-2,height:d-2}),this.networkViewer.draw();var e=new GraphDataset,f=new LayoutDataset,g=new NetworkDataSetFormatter({defaultFormat:{type:"LineEdgeNetworkFormatter",opacity:1,fill:"#000000",radius:"5",strokeWidth:"1",stroke:"#000000",size:"2",title:{fontSize:10,fill:"#000000"}},selected:{opacity:.9,fill:"#FF0000",radius:"5",stroke:"#000000",size:"2"},over:{opacity:1,fill:"#DF0101",radius:"5",stroke:"#000000",size:"2",strokeWidth:"1"}},{defaultFormat:{opacity:.8,stroke:"#000000",strokeWidth:"1",strokeOpacity:.5,title:{fontSize:6,fontColor:"#000000"}},selected:{stroke:"#DF0101",fill:"#FF0000"},over:{stroke:"#DF0101",strokeOpacity:1,strokeWidth:"4"}},{labeled:!1,backgroundColor:"#FFFFFF",balanceNodes:!1,nodesMaxSize:4,nodesMinSize:2});g.dataBind(e),f.dataBind(e),g.setHeight(d-140),g.setWidth(c-2-13),this.networkViewer.drawNetwork(e,g,f);var h=new WumRestAdapter;h.onPoll.addEventListener(function(c,d){for(var e=d.split("\n"),f=new Array,g=1;gi&&f.push(e[g].split(" ")[0])}console.log("significativesFeatures.length: "+f.length);var j=new WumRestAdapter;j.onPoll.addEventListener(function(c,d){var e=d.split("\n");e.pop(),console.log("genes.length: "+e.length),b.loadNetworkOnCellBrowser(e,f,a)});var k="clean_list1.txt";"fatiscan"==record.data.toolName&&(k="id_list.txt"),j.poll(b.jobId,k,!1,$.cookie("bioinfo_sid"))}),h.poll(this.jobId,"significant_your_annotation_0.05.txt",!1,$.cookie("bioinfo_sid")),console.log("getting ranked_list...");var i=new WumRestAdapter;i.onPoll.addEventListener(function(a,b){var c=b.split("\n"),d=c.length,e=0;console.log("getting top clean_list...");for(var f=0;50>e&&d>f;f++)c[f].indexOf("#")<0&&(mostSignificativesFeatures[c[f].split(" ")[0]]=!0,e++);e=0,console.log("getting bottom clean_list...");for(var f=d-1;50>e&&f>0;f--)c[f].indexOf("#")<0&&(mostSignificativesFeatures[c[f].split(" ")[0]]=!0,e++)}),i.poll(this.jobId,"clean_list1.txt",!1,$.cookie("bioinfo_sid")),console.log("getting ranked_list...");var j=new WumRestAdapter;j.onPoll.addEventListener(function(a,b){var c=b.split("\n"),d=c.length,e=0;console.log("getting top ranked_list...");for(var f=0;50>e&&d>f;f++)c[f].indexOf("#")<0&&(mostSignificativesFeatures[c[f].split(" ")[0]]=!0,e++);e=0,console.log("getting bottom ranked_list...");for(var f=d-1;50>e&&f>0;f--)c[f].indexOf("#")<0&&(mostSignificativesFeatures[c[f].split(" ")[0]]=!0,e++)}),j.poll(this.jobId,"ranked_list.txt",!1,$.cookie("bioinfo_sid"))},ResultWidget.prototype.loadNetworkOnCellBrowser=function(a,b,c){var d=this,e=0,f=new CellBaseManager(this.networkViewer.species);f.success.addEventListener(function(f,g){for(var h=g.result,i=new Object,j=0;j500)break;for(var n in i[m])l++}console.log("menos de 500: "+l);for(var m in i){d.networkViewer.networkWidget.getDataset().addNode(m,{type:"tf"});var o=d.networkViewer.networkWidget.getDataset().getVerticesCount()-1;d.networkViewer.networkWidget.getFormatter().getVertexById(o).getDefault().setFill("#DF0101");for(var n in i[m])if(500>l||1==mostSignificativesFeatures[n]){0==d.networkViewer.networkWidget.getDataset().getVertexByName(n).length&&d.networkViewer.networkWidget.getDataset().addNode(n,{type:"gene"});var p=d.networkViewer.networkWidget.getDataset().getVertexByName(n)[0].id,q=d.networkViewer.networkWidget.getDataset().getVertexByName(m)[0].id;d.networkViewer.networkWidget.getDataset().addEdge("tfbs_"+p+"_"+q,q,p),d.networkViewer.networkWidget.getFormatter().getVertexById(p).getDefault().setFill("#0000FF")}}d.networkViewer.networkWidget.getLayout().getLayout("neato"),d.networkViewer.networkWidget.getLayout().layoutDone.addEventListener(function(){e++,2==e&&(Ext.getCmp(d.id+"pbar").destroy(),Ext.getCmp(d.application+c).enable())})}),a.length>0&&f.get("feature","gene",a,"tfbs");var g=new CellBaseManager(this.networkViewer.species);g.success.addEventListener(function(f,g){for(var h=g.result,i=new Object,j=0;j500)break;for(var n in i[m])l++}console.log("menos de 500: "+l);for(var o in i){d.networkViewer.networkWidget.getDataset().addNode(o,{type:"mirna"});var p=d.networkViewer.networkWidget.getDataset().getVerticesCount()-1;d.networkViewer.networkWidget.getFormatter().getVertexById(p).getDefault().setFill("red");for(var n in i[o])if(500>l||1==mostSignificativesFeatures[n]){0==d.networkViewer.networkWidget.getDataset().getVertexByName(n).length&&d.networkViewer.networkWidget.getDataset().addNode(n,{type:"gene"});var q=d.networkViewer.networkWidget.getDataset().getVertexByName(n)[0].id,r=d.networkViewer.networkWidget.getDataset().getVertexByName(o)[0].id;d.networkViewer.networkWidget.getDataset().addEdge("tfbs_"+q+"_"+r,r,q),d.networkViewer.networkWidget.getFormatter().getVertexById(q).getDefault().setFill("blue");var s=d.networkViewer.networkWidget.getDataset().getEdgesCount()-1;d.networkViewer.networkWidget.getFormatter().changeEdgeType(s,"CutDirectedLineEdgeNetworkFormatter")}}d.networkViewer.networkWidget.getLayout().getLayout("neato"),d.networkViewer.networkWidget.getLayout().layoutDone.addEventListener(function(){e++,2==e&&(Ext.getCmp(d.id+"pbar").destroy(),Ext.getCmp(d.application+c).enable())})}),a.length>0?g.get("feature","gene",a,"mirna_target"):(Ext.getCmp(d.id+"pbar").destroy(),Ext.getCmp(d.application+c).enable())},ResultWidget.prototype.getGenomeViewerResultBar=function(a){var b=this;switch(this.application){case"variant":var c=Ext.create("Ext.container.Container",{cls:"bio-toolbar",defaults:{margin:"1 0 0 2"},layout:"vbox",height:27,items:[{xtype:"button",text:'Variant filter tool...',handler:function(){new VariantFilterWidget(b.jobId,{viewer:a,fileNames:b.variantFiles})}}]});return c;default:return null}},ResultWidget.prototype.getSpeciesItem=function(a){for(var b=0;bThis section shows the number of genes annotated to each database in each list.


Gene list: contains three elements, the number of genes in your gene list annotated in the database over the total number of genes remaining in your gene list after the duplicates management, a percentage of genes in your gene list annotated in the database and the ratio of regulators per gene.
Genome: the same structure explained above but applied to the whole genome (TFBS or miRNA) or Your Annotations after the duplicates management.

";case"Significant Results":return"

We consider a significant enrichment after correcting the results by a multiple testing correction method. Enrichment p-values are corrected applying the False discovery rate (FDR) method (Benjamini et al., 1995; Storey andTibshirani, 2003). The threshold of signification applied to the correction has been set to 0.05.


The table provided summarizes the information about the enrichment test for each of the significant regulatory elements that have an Adjusted p-value < 0.05. The table is originally sorted by adjusted p-value and can be sorted up and down by clicking in any of the other column headings. When the number of significant results in a table is higher than five, results are split into different pages. You can move forward or backward in the page list using the arrow buttons.

";case"All results":return"This section contains a downloadable individual text file containing all results for all significant and not significant regulators. This file follows the same structure described above.";case"Annotation files":return"

When significant results are obtained, we can suppose that there is one or several regulatory elements behaving different when comparing groups. The list of genes included in the analysis have pointed to a significantly over-represented set of common regulators to these genes. The interpretation of the results will be different in the case of TFs (transcription factors) and miRNAs given that (generally) the first are positive regulators and the latter are negative regulators.


TFs generally bind to the promoter region of their target genes to assist and promote the transcription. miRNAs, on the other hand, bind to transcript products preventing them from being translated. Significant TF and miRNAs can be pointed to be responsible for the differential expression of the genes observed in the list. We must take special care in the interpretation of over-expressed or under-expressed genes in a functional analysis. In the case of TFs, if we are working with the list of over-expressed genes, the significant results makes reference to active TFs in one condition with respect to the other; while significant results of under-expressed genes makes reference to inactive TFs. In miRNAs, significant results of over-expressed genes will point to inactive miRNAs, while significant results of under-expressed genes will point to active miRNAs when comparing conditions.

";default:return""}break;case"variant":switch(a){case"Variants by Consequence Type":return"Click this link: Output columns";default:return""}break;default:return""}},ResultWidget.prototype={id:"ResultWidget"+Math.round(1e4*Math.random()),draw:function(a,b){var c=this;if(this.job=b.raw,this.job.command=this.parseCommand(this.job),this.jobId=this.job.id,this.id=this.jobId+this.id,this.panelId="ResultWidget_"+this.jobId,this.panel=Ext.getCmp(this.panelId),null==this.panel){this.panel=Ext.create("Ext.panel.Panel",{id:this.panelId,border:0,title:this.job.name,closable:!0,autoScroll:!0}),Ext.getCmp(this.targetId).add(this.panel),Ext.getCmp(this.targetId).setActiveTab(this.panel),this.panel.setLoading("Loading job info...");var d=this.adapter.jobResultUrl($.cookie("bioinfo_account"),a,this.jobId,"json");console.log(d),$.getScript(d,function(){c.panel.setLoading(!1);var a=RESULT[c.job.toolName].layout;a.outputItems=c.job.outputData.sort(a.sortOutputItems),c.render(RESULT)})}else Ext.getCmp(this.targetId).setActiveTab(this.panel)},render:function(a){var b=this;console.log(this.application);var c=function(a){var a=a||{},c=new Ext.XTemplate('

Information     Job Id: {id}


','

{name} - {toolName} - {date}

','

{description}

','

{command.html}

'),d=Ext.create("Ext.container.Container",{margin:"15 0 15 15",items:[{xtype:"box",data:b.job,tpl:c},{xtype:"container",layout:"hbox",margin:"10 0 0 0",defaults:{margin:"0 5 0 5"},items:[{xtype:"button",text:"download",handler:function(){b.adapter.downloadJob($.cookie("bioinfo_account"),$.cookie("bioinfo_sid"),b.jobId)}},{xtype:"button",text:"delete",handler:function(){Ext.Msg.confirm("Delete job","Are you sure you want to delete this job?",function(a){"yes"==a&&(b.adapter.onDeleteJob.addEventListener(function(a,c){var d="";-1!=c.indexOf("OK")?(Ext.getCmp(b.targetId).getActiveTab().close(),d="The job has been succesfully deleted."):d="ERROR: could not delete job.",Ext.Msg.alert("Delete job",d)}),b.adapter.deleteJob($.cookie("bioinfo_account"),$.cookie("bioinfo_sid"),b.jobId))})}}]}]});return"undefined"!=typeof a.items&&d.child("container").add(a.items),d},d=function(a){for(var c=[{xtype:"box",cls:"inlineblock ssel border-bot s120",html:"Index",margin:15}],d=0;d{title}',' {pathi} ',' {date}
'),f=function(a){for(var c,d=[],e=0;e'+a.title+''+a.file+"",item:a,padding:3,overCls:"encima",cls:"inlineblock whiteborder",listeners:{afterrender:function(){var a=this.item;this.getEl().on("click",function(){console.log(a),b.adapter.poll($.cookie("bioinfo_account"),$.cookie("bioinfo_sid"),b.jobId,a.file,!0)})}}});break;case"image":c=Ext.create("Ext.Component",{html:'
'});break;case"grid":var g="resultTable_"+b.jobId+a.file,h=new ResultTable(b.jobId,a.file,a.tags,{targetId:g,tableLayout:f.tableLayout});c=Ext.create("Ext.Component",{flex:1,resultTable:h,html:'
',listeners:{afterrender:function(a){a.resultTable.draw()}}});break;case"table":var i=b.adapter.pollurl($.cookie("bioinfo_account"),$.cookie("bioinfo_sid"),b.jobId,a.file);$.ajax({type:"GET",async:!1,url:i,success:function(a){for(var b='',d=a.split("\n"),e=0,g=0;g':'';for(var i=h.split(" "),j=0;j'+k+""}b+=""}}b+="
",c=Ext.create("Ext.Component",{flex:1,html:b})}})}d.push(c)}return Ext.create("Ext.container.Container",{title:a.title,margin:"0 0 15 0",items:d})},g=function(a,c){var d;if("undefined"!=typeof a.children){"function"==typeof a.children&&(a.children=a.children()),d=[];for(var h=0;hThis paramenter is a flag"):(h=g[0],i=g[1]),b[h]=i,i=i.replace("/httpd/bioinfo/opencga/analysis/pathiways/examples/",""),i=i.replace("/httpd/bioinfo/opencga/accounts/",""),i=i.replace(/,/g,", "),d+='',d+=''+h+"",d+=''+i+"",d+=""}return d+="",{html:d,data:b}}},UploadWidget.prototype={getTypeValidation:function(a){return function(b){var c=new RegExp("^.*\\.("+a+")$","i");return c.test(b)}}},UploadWidget.prototype.draw=function(a){this.opencgaLocation=a;var b={};switch(b["9"]=[{text:"ID List",children:[{text:"SNP",tag:"idlist:snp"},{text:"Gene/Transcript",tag:"idlist:gene:transcript"}]},{text:"Feature",children:[{text:"VCF 4.0",tag:"vcf",validate:this.getTypeValidation("vcf")},{text:"GFF2",tag:"gff2"},{text:"GFF3",tag:"gff3"},{text:"GTF",tag:"gtf"},{text:"BED",tag:"bed"},{text:"BAM",tag:"bam",validate:this.getTypeValidation("bam")},{text:"BAI",tag:"bai",validate:this.getTypeValidation("bai")},{text:"Expression",tag:"expression"}]}],b["6"]=[{text:"Feature",children:[{text:"VCF 4.0",tag:"vcf"},{text:"GFF2",tag:"gff2"},{text:"GFF3",tag:"gff3"},{text:"GTF",tag:"gtf"},{text:"BED",tag:"bed"}]}],b["11"]=[{text:"Annotation",tag:"annotation"},{text:"ID List",children:[{text:"Gene",tag:"idlist:gene"},{text:"Ranked",tag:"ranked"}]}],b["12"]=[{text:"Abundances",tag:"abundances"}],b["100"]=[{text:"Sequence",tag:"sequence"}],b["22"]=[{text:"Tabbed text file",tag:"txt",validate:this.getTypeValidation("txt|text")},{text:"CEL compressed file",tag:"cel",validate:this.getTypeValidation("zip|tar|tar.gz|tgz")}],this.suiteId){case 9:this.checkDataTypes(b["9"]),this.render(b["9"]); -break;case 6:this.checkDataTypes(b["6"]),this.render(b["6"]);break;case 11:this.checkDataTypes(b["11"]),this.render(b["11"]);break;case 12:this.checkDataTypes(b["12"]),this.render(b["12"]);break;case 22:this.checkDataTypes(b["22"]),this.render(b["22"]);break;case 100:this.checkDataTypes(b["100"]),this.render(b["100"]);break;case-1:break;default:this.render([{text:"No data types defined"}])}},UploadWidget.prototype.clean=function(){null!=this.panel&&(this.panel.destroy(),delete this.panel,console.log(this.id+" PANEL DELETED"))},UploadWidget.prototype.checkDataTypes=function(a){for(var b=0;bd&&(d=250);var e=250,f=Ext.create("Ext.tree.Panel",{title:"Select your data type",bodyPadding:10,height:d,border:!1,cls:"panel-border-right",width:e,store:c,useArrows:!0,rootVisible:!1,listeners:{scope:this,itemclick:function(a,b){b.data.leaf?(this.selectedDataType=b.raw.tag,this.selectedDataTypeObj=b.raw,this.dataTypeLabel.setText('Type: OK ',!1)):(this.selectedDataType=null,this.selectedDataTypeObj=null,this.dataTypeLabel.setText('Select a data type !!!',!1)),this.validate()}}});this.nameField=Ext.create("Ext.form.field.Text",{name:"datalabel",fieldLabel:"Data name",labelWidth:110,msgTarget:"side",enableKeyEvents:!0,listeners:{scope:this,change:function(a){""!=a.getValue()?this.dataNameLabel.setText('Name: OK ',!1):this.dataNameLabel.setText('Enter the data name !!!',!1),this.validate()}}}),this.textArea=Ext.create("Ext.form.field.TextArea",{name:"datadescription",fieldLabel:"Data description",labelWidth:110,msgTarget:"side"}),this.organizationField=Ext.create("Ext.form.field.Text",{name:"organization",fieldLabel:"Organization",labelWidth:110,msgTarget:"side"}),this.responsableField=Ext.create("Ext.form.field.Text",{name:"responsable",fieldLabel:"Responsible",labelWidth:110,msgTarget:"side"}),this.acquisitiondate=Ext.create("Ext.form.field.Text",{name:"acquisitiondate",fieldLabel:"Acquisition date",labelWidth:110,msgTarget:"side"});var g=350,h=Ext.create("Ext.panel.Panel",{title:"Some aditional data",width:g,border:!1,height:d,bodyPadding:15,items:[this.nameField,this.textArea,this.organizationField,this.responsableField,this.acquisitiondate]});this.dataTypeLabel=Ext.create("Ext.toolbar.TextItem",{text:'Select a data type'}),this.dataNameLabel=Ext.create("Ext.toolbar.TextItem",{text:'Enter the data name'}),this.dataFieldLabel=Ext.create("Ext.toolbar.TextItem",{text:'Select a data file'}),this.originCheck=Ext.create("Ext.form.field.Checkbox",{xtype:"checkbox",margin:"0 0 5 5",boxLabel:"Text mode",listeners:{scope:this,change:function(){this.originCheck.getValue()?(this.dataFieldLabel.setText(''+this.editor.getValue().length+' chars',!1),this.uploadBar.hide(),this.editor.show(),this.uploadField.destroy(),this.uploadField.setRawValue(null),this.pan3.setHeight(153)):(this.dataFieldLabel.setText('Select a data file',!1),this.editor.hide(),this.uploadBar.show(),this.editor.setRawValue(null),this.createUploadField(),this.pan3.setHeight(82)),this.validate()}}});var i=Ext.create("Ext.button.Button",{id:this.uploadButtonId,text:"Upload",disabled:!0,handler:function(){b.chunkedUpload?b.uploadFile2():b.uploadFile()}});this.editor=Ext.create("Ext.form.field.TextArea",{xtype:"textarea",width:602,flex:1,height:100,emptyText:"Paste or write your file directly",hidden:!0,name:"file",margin:"-1",enableKeyEvents:!0,listeners:{scope:this,change:function(){this.dataFieldLabel.setText(''+this.editor.getValue().length+' chars',!1),this.validate()}}}),this.uploadBar=Ext.create("Ext.toolbar.Toolbar",{cls:"bio-border-false",dock:"top",height:28}),this.createUploadField(),this.modebar=Ext.create("Ext.toolbar.Toolbar",{dock:"top",height:28,border:!1,items:[this.originCheck,"->",this.dataTypeLabel,"-",this.dataFieldLabel]});var j=Ext.create("Ext.panel.Panel",{title:"File origin",colspan:2,border:!1,width:e+g,cls:"panel-border-top",height:82,items:[this.editor],dockedItems:[this.modebar,this.uploadBar]});this.pan3=j,this.panel=Ext.create("Ext.window.Window",{title:'Upload a data file - ZIP files will be allowed shortly',iconCls:"icon-upload",resizable:!1,constrain:!0,closable:!1,modal:!0,layout:{type:"table",columns:2,rows:2},items:[f,h,j],buttonAlign:"right",buttons:[{text:"Close",handler:function(){b.panel.destroy()}},i],listeners:{scope:this,minimize:function(){this.panel.destroy()},destroy:function(){delete this.panel}}})}this.panel.show()},UploadWidget.prototype.createUploadField=function(){this.uploadField=Ext.create("Ext.form.field.File",{id:this.uploadFieldId,xtype:"filefield",name:"file",flex:1,padding:1,msgTarget:"side",emptyText:"Choose a file",allowBlank:!1,anchor:"100%",buttonText:"Open file...",listeners:{scope:this,change:function(){this.fileSelected(),this.validate()}}}),this.uploadBar.add(this.uploadField)},UploadWidget.prototype.validate=function(){var a=!0;null!=this.selectedDataTypeObj.validate&&(a=this.selectedDataTypeObj.validate(Ext.getCmp(this.uploadFieldId).getValue())),!a||null==this.selectedDataType||""==this.uploadField.getRawValue()&&""==this.editor.getValue()?(Ext.getCmp(this.uploadButtonId).disable(),this.dataTypeLabel.setText('Type: Not valid ',!1)):(Ext.getCmp(this.uploadButtonId).enable(),this.dataTypeLabel.setText('Type: OK ',!1))},UploadWidget.prototype.fileSelected=function(){var a=this.uploadField.fileInputEl.id,b=document.getElementById(a).files[0];if(b){var c=0;c=b.size>1048576?(Math.round(100*b.size/1048576)/100).toString()+"MB":(Math.round(100*b.size/1024)/100).toString()+"KB",this.dataFieldLabel.setText('Size: '+c+"",!1)}},UploadWidget.prototype.uploadFile=function(){Ext.getBody().mask("Uploading file..."),this.panel.disable();var a=new FormData,b=null;if(this.originCheck.getValue())b=this.nameField.getValue(),a.append("file",this.editor.getValue());else{var c=document.getElementById(Ext.getCmp(this.uploadFieldId).fileInputEl.id).files[0];b=c.name,a.append("file",c)}var d=$.cookie("bioinfo_sid"),e=this.opencgaLocation.directory+b;e=e.replace(new RegExp("/","gi"),":"),a.append("name",this.nameField.getValue()),a.append("fileFormat",this.selectedDataType),a.append("responsible",this.responsableField.getValue()),a.append("organization",this.organizationField.getValue()),a.append("date",this.acquisitiondate.getValue()),a.append("description",this.textArea.getValue()),a.append("objectid",e),a.append("sessionid",d),this.objectID=this.opencgaLocation.bucketId+":"+e,this.adapter.uploadObjectToBucket($.cookie("bioinfo_account"),d,this.opencgaLocation.bucketId,e,a)},UploadWidget.prototype.uploadFile2=function(){var a=document.getElementById(Ext.getCmp(this.uploadFieldId).fileInputEl.id).files[0],b=this.opencgaLocation.directory+a.name;b=b.replace(new RegExp("/","gi"),":");var c=new Worker(WORKERS_PATH+"worker-fileupload.js");this.opencgaBrowserWidget.addUpload(a,c),c.postMessage({host:OPENCGA_HOST,accountId:$.cookie("bioinfo_account"),sessionId:$.cookie("bioinfo_sid"),file:a,objectId:b,fileFormat:this.selectedDataType,bucketId:this.opencgaLocation.bucketId,resume:!0}),this.panel.close()},UploadWidget.prototype.uploadComplete=function(a){var b="Uploaded sucessfully";-1!=a.indexOf("ERROR")&&(b=a),Ext.Msg.show({title:"Upload status",msg:b}),this.panel.enable(),Ext.getBody().unmask(),"Uploaded sucessfully"==b&&this.panel.close()},UploadWidget.prototype.uploadFailed=function(a){console.log(a),Ext.Msg.show({title:"Upload status",msg:"There was an error attempting to upload the file."}),this.panel.enable(),Ext.getBody().unmask()},UploadWidget.prototype.uploadCanceled=function(a){console.log(a),Ext.Msg.show({title:"Upload status",msg:"The upload has been canceled by the user or the browser dropped the connection."}),this.panel.enable(),Ext.getBody().unmask()}; \ No newline at end of file diff --git a/vendor/purl.min.js b/vendor/purl.min.js deleted file mode 100644 index 4664ac0..0000000 --- a/vendor/purl.min.js +++ /dev/null @@ -1 +0,0 @@ -(function(e){if(typeof define==="function"&&define.amd){if(typeof jQuery!=="undefined"){define(["jquery"],e)}else{define([],e)}}else{if(typeof jQuery!=="undefined"){e(jQuery)}else{e()}}})(function(e,t){function a(e,t){var n=decodeURI(e),i=s[t||false?"strict":"loose"].exec(n),o={attr:{},param:{},seg:{}},u=14;while(u--){o.attr[r[u]]=i[u]||""}o.param["query"]=p(o.attr["query"]);o.param["fragment"]=p(o.attr["fragment"]);o.seg["path"]=o.attr.path.replace(/^\/+|\/+$/g,"").split("/");o.seg["fragment"]=o.attr.fragment.replace(/^\/+|\/+$/g,"").split("/");o.attr["base"]=o.attr.host?(o.attr.protocol?o.attr.protocol+"://"+o.attr.host:o.attr.host)+(o.attr.port?":"+o.attr.port:""):"";return o}function f(e){var t=e.tagName;if(typeof t!=="undefined")return n[t.toLowerCase()];return t}function l(e,t){if(e[t].length==0)return e[t]={};var n={};for(var r in e[t])n[r]=e[t][r];e[t]=n;return n}function c(e,t,n,r){var i=e.shift();if(!i){if(g(t[n])){t[n].push(r)}else if("object"==typeof t[n]){t[n]=r}else if("undefined"==typeof t[n]){t[n]=r}else{t[n]=[t[n],r]}}else{var s=t[n]=t[n]||[];if("]"==i){if(g(s)){if(""!=r)s.push(r)}else if("object"==typeof s){s[y(s).length]=r}else{s=t[n]=[t[n],r]}}else if(~i.indexOf("]")){i=i.substr(0,i.length-1);if(!u.test(i)&&g(s))s=l(t,n);c(e,s,i,r)}else{if(!u.test(i)&&g(s))s=l(t,n);c(e,s,i,r)}}}function h(e,t,n){if(~t.indexOf("]")){var r=t.split("["),i=r.length,s=i-1;c(r,e,"base",n)}else{if(!u.test(t)&&g(e.base)){var o={};for(var a in e.base)o[a]=e.base[a];e.base=o}d(e.base,t,n)}return e}function p(e){return m(String(e).split(/&|;/),function(e,t){try{t=decodeURIComponent(t.replace(/\+/g," "))}catch(n){}var r=t.indexOf("="),i=v(t),s=t.substr(0,i||r),o=t.substr(i||r,t.length),o=o.substr(o.indexOf("=")+1,o.length);if(""==s)s=t,o="";return h(e,s,o)},{base:{}}).base}function d(e,n,r){var i=e[n];if(t===i){e[n]=r}else if(g(i)){i.push(r)}else{e[n]=[i,r]}}function v(e){var t=e.length,n,r;for(var i=0;i>0,s=arguments[2];while(r - * Version: 1.0.1 - * LastModified: Dec 25 1999 - */ - -/* Interface: - * data = zip_deflate(src); - */ - -/* constant parameters */ -var zip_WSIZE = 32768; // Sliding Window size -var zip_STORED_BLOCK = 0; -var zip_STATIC_TREES = 1; -var zip_DYN_TREES = 2; - -/* for deflate */ -var zip_DEFAULT_LEVEL = 6; -var zip_FULL_SEARCH = true; -var zip_INBUFSIZ = 32768; // Input buffer size -var zip_INBUF_EXTRA = 64; // Extra buffer -var zip_OUTBUFSIZ = 1024 * 8; -var zip_window_size = 2 * zip_WSIZE; -var zip_MIN_MATCH = 3; -var zip_MAX_MATCH = 258; -var zip_BITS = 16; -// for SMALL_MEM -var zip_LIT_BUFSIZE = 0x2000; -var zip_HASH_BITS = 13; -// for MEDIUM_MEM -// var zip_LIT_BUFSIZE = 0x4000; -// var zip_HASH_BITS = 14; -// for BIG_MEM -// var zip_LIT_BUFSIZE = 0x8000; -// var zip_HASH_BITS = 15; -if(zip_LIT_BUFSIZE > zip_INBUFSIZ) - alert("error: zip_INBUFSIZ is too small"); -if((zip_WSIZE<<1) > (1< zip_BITS-1) - alert("error: zip_HASH_BITS is too large"); -if(zip_HASH_BITS < 8 || zip_MAX_MATCH != 258) - alert("error: Code too clever"); -var zip_DIST_BUFSIZE = zip_LIT_BUFSIZE; -var zip_HASH_SIZE = 1 << zip_HASH_BITS; -var zip_HASH_MASK = zip_HASH_SIZE - 1; -var zip_WMASK = zip_WSIZE - 1; -var zip_NIL = 0; // Tail of hash chains -var zip_TOO_FAR = 4096; -var zip_MIN_LOOKAHEAD = zip_MAX_MATCH + zip_MIN_MATCH + 1; -var zip_MAX_DIST = zip_WSIZE - zip_MIN_LOOKAHEAD; -var zip_SMALLEST = 1; -var zip_MAX_BITS = 15; -var zip_MAX_BL_BITS = 7; -var zip_LENGTH_CODES = 29; -var zip_LITERALS =256; -var zip_END_BLOCK = 256; -var zip_L_CODES = zip_LITERALS + 1 + zip_LENGTH_CODES; -var zip_D_CODES = 30; -var zip_BL_CODES = 19; -var zip_REP_3_6 = 16; -var zip_REPZ_3_10 = 17; -var zip_REPZ_11_138 = 18; -var zip_HEAP_SIZE = 2 * zip_L_CODES + 1; -var zip_H_SHIFT = parseInt((zip_HASH_BITS + zip_MIN_MATCH - 1) / - zip_MIN_MATCH); - -/* variables */ -var zip_free_queue; -var zip_qhead, zip_qtail; -var zip_initflag; -var zip_outbuf = null; -var zip_outcnt, zip_outoff; -var zip_complete; -var zip_window; -var zip_d_buf; -var zip_l_buf; -var zip_prev; -var zip_bi_buf; -var zip_bi_valid; -var zip_block_start; -var zip_ins_h; -var zip_hash_head; -var zip_prev_match; -var zip_match_available; -var zip_match_length; -var zip_prev_length; -var zip_strstart; -var zip_match_start; -var zip_eofile; -var zip_lookahead; -var zip_max_chain_length; -var zip_max_lazy_match; -var zip_compr_level; -var zip_good_match; -var zip_nice_match; -var zip_dyn_ltree; -var zip_dyn_dtree; -var zip_static_ltree; -var zip_static_dtree; -var zip_bl_tree; -var zip_l_desc; -var zip_d_desc; -var zip_bl_desc; -var zip_bl_count; -var zip_heap; -var zip_heap_len; -var zip_heap_max; -var zip_depth; -var zip_length_code; -var zip_dist_code; -var zip_base_length; -var zip_base_dist; -var zip_flag_buf; -var zip_last_lit; -var zip_last_dist; -var zip_last_flags; -var zip_flags; -var zip_flag_bit; -var zip_opt_len; -var zip_static_len; -var zip_deflate_data; -var zip_deflate_pos; - -/* objects (deflate) */ - -var zip_DeflateCT = function() { - this.fc = 0; // frequency count or bit string - this.dl = 0; // father node in Huffman tree or length of bit string -} - -var zip_DeflateTreeDesc = function() { - this.dyn_tree = null; // the dynamic tree - this.static_tree = null; // corresponding static tree or NULL - this.extra_bits = null; // extra bits for each code or NULL - this.extra_base = 0; // base index for extra_bits - this.elems = 0; // max number of elements in the tree - this.max_length = 0; // max bit length for the codes - this.max_code = 0; // largest code with non zero frequency -} - -/* Values for max_lazy_match, good_match and max_chain_length, depending on - * the desired pack level (0..9). The values given below have been tuned to - * exclude worst case performance for pathological files. Better values may be - * found for specific files. - */ -var zip_DeflateConfiguration = function(a, b, c, d) { - this.good_length = a; // reduce lazy search above this match length - this.max_lazy = b; // do not perform lazy search above this match length - this.nice_length = c; // quit search above this match length - this.max_chain = d; -} - -var zip_DeflateBuffer = function() { - this.next = null; - this.len = 0; - this.ptr = new Array(zip_OUTBUFSIZ); - this.off = 0; -} - -/* constant tables */ -var zip_extra_lbits = new Array( - 0,0,0,0,0,0,0,0,1,1,1,1,2,2,2,2,3,3,3,3,4,4,4,4,5,5,5,5,0); -var zip_extra_dbits = new Array( - 0,0,0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7,8,8,9,9,10,10,11,11,12,12,13,13); -var zip_extra_blbits = new Array( - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,3,7); -var zip_bl_order = new Array( - 16,17,18,0,8,7,9,6,10,5,11,4,12,3,13,2,14,1,15); -var zip_configuration_table = new Array( - new zip_DeflateConfiguration(0, 0, 0, 0), - new zip_DeflateConfiguration(4, 4, 8, 4), - new zip_DeflateConfiguration(4, 5, 16, 8), - new zip_DeflateConfiguration(4, 6, 32, 32), - new zip_DeflateConfiguration(4, 4, 16, 16), - new zip_DeflateConfiguration(8, 16, 32, 32), - new zip_DeflateConfiguration(8, 16, 128, 128), - new zip_DeflateConfiguration(8, 32, 128, 256), - new zip_DeflateConfiguration(32, 128, 258, 1024), - new zip_DeflateConfiguration(32, 258, 258, 4096)); - - -/* routines (deflate) */ - -var zip_deflate_start = function(level) { - var i; - - if(!level) - level = zip_DEFAULT_LEVEL; - else if(level < 1) - level = 1; - else if(level > 9) - level = 9; - - zip_compr_level = level; - zip_initflag = false; - zip_eofile = false; - if(zip_outbuf != null) - return; - - zip_free_queue = zip_qhead = zip_qtail = null; - zip_outbuf = new Array(zip_OUTBUFSIZ); - zip_window = new Array(zip_window_size); - zip_d_buf = new Array(zip_DIST_BUFSIZE); - zip_l_buf = new Array(zip_INBUFSIZ + zip_INBUF_EXTRA); - zip_prev = new Array(1 << zip_BITS); - zip_dyn_ltree = new Array(zip_HEAP_SIZE); - for(i = 0; i < zip_HEAP_SIZE; i++) - zip_dyn_ltree[i] = new zip_DeflateCT(); - zip_dyn_dtree = new Array(2*zip_D_CODES+1); - for(i = 0; i < 2*zip_D_CODES+1; i++) - zip_dyn_dtree[i] = new zip_DeflateCT(); - zip_static_ltree = new Array(zip_L_CODES+2); - for(i = 0; i < zip_L_CODES+2; i++) - zip_static_ltree[i] = new zip_DeflateCT(); - zip_static_dtree = new Array(zip_D_CODES); - for(i = 0; i < zip_D_CODES; i++) - zip_static_dtree[i] = new zip_DeflateCT(); - zip_bl_tree = new Array(2*zip_BL_CODES+1); - for(i = 0; i < 2*zip_BL_CODES+1; i++) - zip_bl_tree[i] = new zip_DeflateCT(); - zip_l_desc = new zip_DeflateTreeDesc(); - zip_d_desc = new zip_DeflateTreeDesc(); - zip_bl_desc = new zip_DeflateTreeDesc(); - zip_bl_count = new Array(zip_MAX_BITS+1); - zip_heap = new Array(2*zip_L_CODES+1); - zip_depth = new Array(2*zip_L_CODES+1); - zip_length_code = new Array(zip_MAX_MATCH-zip_MIN_MATCH+1); - zip_dist_code = new Array(512); - zip_base_length = new Array(zip_LENGTH_CODES); - zip_base_dist = new Array(zip_D_CODES); - zip_flag_buf = new Array(parseInt(zip_LIT_BUFSIZE / 8)); -} - -var zip_deflate_end = function() { - zip_free_queue = zip_qhead = zip_qtail = null; - zip_outbuf = null; - zip_window = null; - zip_d_buf = null; - zip_l_buf = null; - zip_prev = null; - zip_dyn_ltree = null; - zip_dyn_dtree = null; - zip_static_ltree = null; - zip_static_dtree = null; - zip_bl_tree = null; - zip_l_desc = null; - zip_d_desc = null; - zip_bl_desc = null; - zip_bl_count = null; - zip_heap = null; - zip_depth = null; - zip_length_code = null; - zip_dist_code = null; - zip_base_length = null; - zip_base_dist = null; - zip_flag_buf = null; -} - -var zip_reuse_queue = function(p) { - p.next = zip_free_queue; - zip_free_queue = p; -} - -var zip_new_queue = function() { - var p; - - if(zip_free_queue != null) - { - p = zip_free_queue; - zip_free_queue = zip_free_queue.next; - } - else - p = new zip_DeflateBuffer(); - p.next = null; - p.len = p.off = 0; - - return p; -} - -var zip_head1 = function(i) { - return zip_prev[zip_WSIZE + i]; -} - -var zip_head2 = function(i, val) { - return zip_prev[zip_WSIZE + i] = val; -} - -/* put_byte is used for the compressed output, put_ubyte for the - * uncompressed output. However unlzw() uses window for its - * suffix table instead of its output buffer, so it does not use put_ubyte - * (to be cleaned up). - */ -var zip_put_byte = function(c) { - zip_outbuf[zip_outoff + zip_outcnt++] = c; - if(zip_outoff + zip_outcnt == zip_OUTBUFSIZ) - zip_qoutbuf(); -} - -/* Output a 16 bit value, lsb first */ -var zip_put_short = function(w) { - w &= 0xffff; - if(zip_outoff + zip_outcnt < zip_OUTBUFSIZ - 2) { - zip_outbuf[zip_outoff + zip_outcnt++] = (w & 0xff); - zip_outbuf[zip_outoff + zip_outcnt++] = (w >>> 8); - } else { - zip_put_byte(w & 0xff); - zip_put_byte(w >>> 8); - } -} - -/* ========================================================================== - * Insert string s in the dictionary and set match_head to the previous head - * of the hash chain (the most recent string with same hash key). Return - * the previous length of the hash chain. - * IN assertion: all calls to to INSERT_STRING are made with consecutive - * input characters and the first MIN_MATCH bytes of s are valid - * (except for the last MIN_MATCH-1 bytes of the input file). - */ -var zip_INSERT_STRING = function() { - zip_ins_h = ((zip_ins_h << zip_H_SHIFT) - ^ (zip_window[zip_strstart + zip_MIN_MATCH - 1] & 0xff)) - & zip_HASH_MASK; - zip_hash_head = zip_head1(zip_ins_h); - zip_prev[zip_strstart & zip_WMASK] = zip_hash_head; - zip_head2(zip_ins_h, zip_strstart); -} - -/* Send a code of the given tree. c and tree must not have side effects */ -var zip_SEND_CODE = function(c, tree) { - zip_send_bits(tree[c].fc, tree[c].dl); -} - -/* Mapping from a distance to a distance code. dist is the distance - 1 and - * must not have side effects. dist_code[256] and dist_code[257] are never - * used. - */ -var zip_D_CODE = function(dist) { - return (dist < 256 ? zip_dist_code[dist] - : zip_dist_code[256 + (dist>>7)]) & 0xff; -} - -/* ========================================================================== - * Compares to subtrees, using the tree depth as tie breaker when - * the subtrees have equal frequency. This minimizes the worst case length. - */ -var zip_SMALLER = function(tree, n, m) { - return tree[n].fc < tree[m].fc || - (tree[n].fc == tree[m].fc && zip_depth[n] <= zip_depth[m]); -} - -/* ========================================================================== - * read string data - */ -var zip_read_buff = function(buff, offset, n) { - var i; - for(i = 0; i < n && zip_deflate_pos < zip_deflate_data.length; i++) - buff[offset + i] = - zip_deflate_data.charCodeAt(zip_deflate_pos++) & 0xff; - return i; -} - -/* ========================================================================== - * Initialize the "longest match" routines for a new file - */ -var zip_lm_init = function() { - var j; - - /* Initialize the hash table. */ - for(j = 0; j < zip_HASH_SIZE; j++) -// zip_head2(j, zip_NIL); - zip_prev[zip_WSIZE + j] = 0; - /* prev will be initialized on the fly */ - - /* Set the default configuration parameters: - */ - zip_max_lazy_match = zip_configuration_table[zip_compr_level].max_lazy; - zip_good_match = zip_configuration_table[zip_compr_level].good_length; - if(!zip_FULL_SEARCH) - zip_nice_match = zip_configuration_table[zip_compr_level].nice_length; - zip_max_chain_length = zip_configuration_table[zip_compr_level].max_chain; - - zip_strstart = 0; - zip_block_start = 0; - - zip_lookahead = zip_read_buff(zip_window, 0, 2 * zip_WSIZE); - if(zip_lookahead <= 0) { - zip_eofile = true; - zip_lookahead = 0; - return; - } - zip_eofile = false; - /* Make sure that we always have enough lookahead. This is important - * if input comes from a device such as a tty. - */ - while(zip_lookahead < zip_MIN_LOOKAHEAD && !zip_eofile) - zip_fill_window(); - - /* If lookahead < MIN_MATCH, ins_h is garbage, but this is - * not important since only literal bytes will be emitted. - */ - zip_ins_h = 0; - for(j = 0; j < zip_MIN_MATCH - 1; j++) { -// UPDATE_HASH(ins_h, window[j]); - zip_ins_h = ((zip_ins_h << zip_H_SHIFT) ^ (zip_window[j] & 0xff)) & zip_HASH_MASK; - } -} - -/* ========================================================================== - * Set match_start to the longest match starting at the given string and - * return its length. Matches shorter or equal to prev_length are discarded, - * in which case the result is equal to prev_length and match_start is - * garbage. - * IN assertions: cur_match is the head of the hash chain for the current - * string (strstart) and its distance is <= MAX_DIST, and prev_length >= 1 - */ -var zip_longest_match = function(cur_match) { - var chain_length = zip_max_chain_length; // max hash chain length - var scanp = zip_strstart; // current string - var matchp; // matched string - var len; // length of current match - var best_len = zip_prev_length; // best match length so far - - /* Stop when cur_match becomes <= limit. To simplify the code, - * we prevent matches with the string of window index 0. - */ - var limit = (zip_strstart > zip_MAX_DIST ? zip_strstart - zip_MAX_DIST : zip_NIL); - - var strendp = zip_strstart + zip_MAX_MATCH; - var scan_end1 = zip_window[scanp + best_len - 1]; - var scan_end = zip_window[scanp + best_len]; - - /* Do not waste too much time if we already have a good match: */ - if(zip_prev_length >= zip_good_match) - chain_length >>= 2; - -// Assert(encoder->strstart <= window_size-MIN_LOOKAHEAD, "insufficient lookahead"); - - do { -// Assert(cur_match < encoder->strstart, "no future"); - matchp = cur_match; - - /* Skip to next match if the match length cannot increase - * or if the match length is less than 2: - */ - if(zip_window[matchp + best_len] != scan_end || - zip_window[matchp + best_len - 1] != scan_end1 || - zip_window[matchp] != zip_window[scanp] || - zip_window[++matchp] != zip_window[scanp + 1]) { - continue; - } - - /* The check at best_len-1 can be removed because it will be made - * again later. (This heuristic is not always a win.) - * It is not necessary to compare scan[2] and match[2] since they - * are always equal when the other bytes match, given that - * the hash keys are equal and that HASH_BITS >= 8. - */ - scanp += 2; - matchp++; - - /* We check for insufficient lookahead only every 8th comparison; - * the 256th check will be made at strstart+258. - */ - do { - } while(zip_window[++scanp] == zip_window[++matchp] && - zip_window[++scanp] == zip_window[++matchp] && - zip_window[++scanp] == zip_window[++matchp] && - zip_window[++scanp] == zip_window[++matchp] && - zip_window[++scanp] == zip_window[++matchp] && - zip_window[++scanp] == zip_window[++matchp] && - zip_window[++scanp] == zip_window[++matchp] && - zip_window[++scanp] == zip_window[++matchp] && - scanp < strendp); - - len = zip_MAX_MATCH - (strendp - scanp); - scanp = strendp - zip_MAX_MATCH; - - if(len > best_len) { - zip_match_start = cur_match; - best_len = len; - if(zip_FULL_SEARCH) { - if(len >= zip_MAX_MATCH) break; - } else { - if(len >= zip_nice_match) break; - } - - scan_end1 = zip_window[scanp + best_len-1]; - scan_end = zip_window[scanp + best_len]; - } - } while((cur_match = zip_prev[cur_match & zip_WMASK]) > limit - && --chain_length != 0); - - return best_len; -} - -/* ========================================================================== - * Fill the window when the lookahead becomes insufficient. - * Updates strstart and lookahead, and sets eofile if end of input file. - * IN assertion: lookahead < MIN_LOOKAHEAD && strstart + lookahead > 0 - * OUT assertions: at least one byte has been read, or eofile is set; - * file reads are performed for at least two bytes (required for the - * translate_eol option). - */ -var zip_fill_window = function() { - var n, m; - - // Amount of free space at the end of the window. - var more = zip_window_size - zip_lookahead - zip_strstart; - - /* If the window is almost full and there is insufficient lookahead, - * move the upper half to the lower one to make room in the upper half. - */ - if(more == -1) { - /* Very unlikely, but possible on 16 bit machine if strstart == 0 - * and lookahead == 1 (input done one byte at time) - */ - more--; - } else if(zip_strstart >= zip_WSIZE + zip_MAX_DIST) { - /* By the IN assertion, the window is not empty so we can't confuse - * more == 0 with more == 64K on a 16 bit machine. - */ -// Assert(window_size == (ulg)2*WSIZE, "no sliding with BIG_MEM"); - -// System.arraycopy(window, WSIZE, window, 0, WSIZE); - for(n = 0; n < zip_WSIZE; n++) - zip_window[n] = zip_window[n + zip_WSIZE]; - - zip_match_start -= zip_WSIZE; - zip_strstart -= zip_WSIZE; /* we now have strstart >= MAX_DIST: */ - zip_block_start -= zip_WSIZE; - - for(n = 0; n < zip_HASH_SIZE; n++) { - m = zip_head1(n); - zip_head2(n, m >= zip_WSIZE ? m - zip_WSIZE : zip_NIL); - } - for(n = 0; n < zip_WSIZE; n++) { - /* If n is not on any hash chain, prev[n] is garbage but - * its value will never be used. - */ - m = zip_prev[n]; - zip_prev[n] = (m >= zip_WSIZE ? m - zip_WSIZE : zip_NIL); - } - more += zip_WSIZE; - } - // At this point, more >= 2 - if(!zip_eofile) { - n = zip_read_buff(zip_window, zip_strstart + zip_lookahead, more); - if(n <= 0) - zip_eofile = true; - else - zip_lookahead += n; - } -} - -/* ========================================================================== - * Processes a new input file and return its compressed length. This - * function does not perform lazy evaluationof matches and inserts - * new strings in the dictionary only for unmatched strings or for short - * matches. It is used only for the fast compression options. - */ -var zip_deflate_fast = function() { - while(zip_lookahead != 0 && zip_qhead == null) { - var flush; // set if current block must be flushed - - /* Insert the string window[strstart .. strstart+2] in the - * dictionary, and set hash_head to the head of the hash chain: - */ - zip_INSERT_STRING(); - - /* Find the longest match, discarding those <= prev_length. - * At this point we have always match_length < MIN_MATCH - */ - if(zip_hash_head != zip_NIL && - zip_strstart - zip_hash_head <= zip_MAX_DIST) { - /* To simplify the code, we prevent matches with the string - * of window index 0 (in particular we have to avoid a match - * of the string with itself at the start of the input file). - */ - zip_match_length = zip_longest_match(zip_hash_head); - /* longest_match() sets match_start */ - if(zip_match_length > zip_lookahead) - zip_match_length = zip_lookahead; - } - if(zip_match_length >= zip_MIN_MATCH) { -// check_match(strstart, match_start, match_length); - - flush = zip_ct_tally(zip_strstart - zip_match_start, - zip_match_length - zip_MIN_MATCH); - zip_lookahead -= zip_match_length; - - /* Insert new strings in the hash table only if the match length - * is not too large. This saves time but degrades compression. - */ - if(zip_match_length <= zip_max_lazy_match) { - zip_match_length--; // string at strstart already in hash table - do { - zip_strstart++; - zip_INSERT_STRING(); - /* strstart never exceeds WSIZE-MAX_MATCH, so there are - * always MIN_MATCH bytes ahead. If lookahead < MIN_MATCH - * these bytes are garbage, but it does not matter since - * the next lookahead bytes will be emitted as literals. - */ - } while(--zip_match_length != 0); - zip_strstart++; - } else { - zip_strstart += zip_match_length; - zip_match_length = 0; - zip_ins_h = zip_window[zip_strstart] & 0xff; -// UPDATE_HASH(ins_h, window[strstart + 1]); - zip_ins_h = ((zip_ins_h< zip_lookahead) - zip_match_length = zip_lookahead; - - /* Ignore a length 3 match if it is too distant: */ - if(zip_match_length == zip_MIN_MATCH && - zip_strstart - zip_match_start > zip_TOO_FAR) { - /* If prev_match is also MIN_MATCH, match_start is garbage - * but we will ignore the current match anyway. - */ - zip_match_length--; - } - } - /* If there was a match at the previous step and the current - * match is not better, output the previous match: - */ - if(zip_prev_length >= zip_MIN_MATCH && - zip_match_length <= zip_prev_length) { - var flush; // set if current block must be flushed - -// check_match(strstart - 1, prev_match, prev_length); - flush = zip_ct_tally(zip_strstart - 1 - zip_prev_match, - zip_prev_length - zip_MIN_MATCH); - - /* Insert in hash table all strings up to the end of the match. - * strstart-1 and strstart are already inserted. - */ - zip_lookahead -= zip_prev_length - 1; - zip_prev_length -= 2; - do { - zip_strstart++; - zip_INSERT_STRING(); - /* strstart never exceeds WSIZE-MAX_MATCH, so there are - * always MIN_MATCH bytes ahead. If lookahead < MIN_MATCH - * these bytes are garbage, but it does not matter since the - * next lookahead bytes will always be emitted as literals. - */ - } while(--zip_prev_length != 0); - zip_match_available = 0; - zip_match_length = zip_MIN_MATCH - 1; - zip_strstart++; - if(flush) { - zip_flush_block(0); - zip_block_start = zip_strstart; - } - } else if(zip_match_available != 0) { - /* If there was no match at the previous position, output a - * single literal. If there was a match but the current match - * is longer, truncate the previous match to a single literal. - */ - if(zip_ct_tally(0, zip_window[zip_strstart - 1] & 0xff)) { - zip_flush_block(0); - zip_block_start = zip_strstart; - } - zip_strstart++; - zip_lookahead--; - } else { - /* There is no previous match to compare with, wait for - * the next step to decide. - */ - zip_match_available = 1; - zip_strstart++; - zip_lookahead--; - } - - /* Make sure that we always have enough lookahead, except - * at the end of the input file. We need MAX_MATCH bytes - * for the next match, plus MIN_MATCH bytes to insert the - * string following the next match. - */ - while(zip_lookahead < zip_MIN_LOOKAHEAD && !zip_eofile) - zip_fill_window(); - } -} - -var zip_init_deflate = function() { - if(zip_eofile) - return; - zip_bi_buf = 0; - zip_bi_valid = 0; - zip_ct_init(); - zip_lm_init(); - - zip_qhead = null; - zip_outcnt = 0; - zip_outoff = 0; - - if(zip_compr_level <= 3) - { - zip_prev_length = zip_MIN_MATCH - 1; - zip_match_length = 0; - } - else - { - zip_match_length = zip_MIN_MATCH - 1; - zip_match_available = 0; - } - - zip_complete = false; -} - -/* ========================================================================== - * Same as above, but achieves better compression. We use a lazy - * evaluation for matches: a match is finally adopted only if there is - * no better match at the next window position. - */ -var zip_deflate_internal = function(buff, off, buff_size) { - var n; - - if(!zip_initflag) - { - zip_init_deflate(); - zip_initflag = true; - if(zip_lookahead == 0) { // empty - zip_complete = true; - return 0; - } - } - - if((n = zip_qcopy(buff, off, buff_size)) == buff_size) - return buff_size; - - if(zip_complete) - return n; - - if(zip_compr_level <= 3) // optimized for speed - zip_deflate_fast(); - else - zip_deflate_better(); - if(zip_lookahead == 0) { - if(zip_match_available != 0) - zip_ct_tally(0, zip_window[zip_strstart - 1] & 0xff); - zip_flush_block(1); - zip_complete = true; - } - return n + zip_qcopy(buff, n + off, buff_size - n); -} - -var zip_qcopy = function(buff, off, buff_size) { - var n, i, j; - - n = 0; - while(zip_qhead != null && n < buff_size) - { - i = buff_size - n; - if(i > zip_qhead.len) - i = zip_qhead.len; -// System.arraycopy(qhead.ptr, qhead.off, buff, off + n, i); - for(j = 0; j < i; j++) - buff[off + n + j] = zip_qhead.ptr[zip_qhead.off + j]; - - zip_qhead.off += i; - zip_qhead.len -= i; - n += i; - if(zip_qhead.len == 0) { - var p; - p = zip_qhead; - zip_qhead = zip_qhead.next; - zip_reuse_queue(p); - } - } - - if(n == buff_size) - return n; - - if(zip_outoff < zip_outcnt) { - i = buff_size - n; - if(i > zip_outcnt - zip_outoff) - i = zip_outcnt - zip_outoff; - // System.arraycopy(outbuf, outoff, buff, off + n, i); - for(j = 0; j < i; j++) - buff[off + n + j] = zip_outbuf[zip_outoff + j]; - zip_outoff += i; - n += i; - if(zip_outcnt == zip_outoff) - zip_outcnt = zip_outoff = 0; - } - return n; -} - -/* ========================================================================== - * Allocate the match buffer, initialize the various tables and save the - * location of the internal file attribute (ascii/binary) and method - * (DEFLATE/STORE). - */ -var zip_ct_init = function() { - var n; // iterates over tree elements - var bits; // bit counter - var length; // length value - var code; // code value - var dist; // distance index - - if(zip_static_dtree[0].dl != 0) return; // ct_init already called - - zip_l_desc.dyn_tree = zip_dyn_ltree; - zip_l_desc.static_tree = zip_static_ltree; - zip_l_desc.extra_bits = zip_extra_lbits; - zip_l_desc.extra_base = zip_LITERALS + 1; - zip_l_desc.elems = zip_L_CODES; - zip_l_desc.max_length = zip_MAX_BITS; - zip_l_desc.max_code = 0; - - zip_d_desc.dyn_tree = zip_dyn_dtree; - zip_d_desc.static_tree = zip_static_dtree; - zip_d_desc.extra_bits = zip_extra_dbits; - zip_d_desc.extra_base = 0; - zip_d_desc.elems = zip_D_CODES; - zip_d_desc.max_length = zip_MAX_BITS; - zip_d_desc.max_code = 0; - - zip_bl_desc.dyn_tree = zip_bl_tree; - zip_bl_desc.static_tree = null; - zip_bl_desc.extra_bits = zip_extra_blbits; - zip_bl_desc.extra_base = 0; - zip_bl_desc.elems = zip_BL_CODES; - zip_bl_desc.max_length = zip_MAX_BL_BITS; - zip_bl_desc.max_code = 0; - - // Initialize the mapping length (0..255) -> length code (0..28) - length = 0; - for(code = 0; code < zip_LENGTH_CODES-1; code++) { - zip_base_length[code] = length; - for(n = 0; n < (1< dist code (0..29) */ - dist = 0; - for(code = 0 ; code < 16; code++) { - zip_base_dist[code] = dist; - for(n = 0; n < (1<>= 7; // from now on, all distances are divided by 128 - for( ; code < zip_D_CODES; code++) { - zip_base_dist[code] = dist << 7; - for(n = 0; n < (1<<(zip_extra_dbits[code]-7)); n++) - zip_dist_code[256 + dist++] = code; - } - // Assert (dist == 256, "ct_init: 256+dist != 512"); - - // Construct the codes of the static literal tree - for(bits = 0; bits <= zip_MAX_BITS; bits++) - zip_bl_count[bits] = 0; - n = 0; - while(n <= 143) { zip_static_ltree[n++].dl = 8; zip_bl_count[8]++; } - while(n <= 255) { zip_static_ltree[n++].dl = 9; zip_bl_count[9]++; } - while(n <= 279) { zip_static_ltree[n++].dl = 7; zip_bl_count[7]++; } - while(n <= 287) { zip_static_ltree[n++].dl = 8; zip_bl_count[8]++; } - /* Codes 286 and 287 do not exist, but we must include them in the - * tree construction to get a canonical Huffman tree (longest code - * all ones) - */ - zip_gen_codes(zip_static_ltree, zip_L_CODES + 1); - - /* The static distance tree is trivial: */ - for(n = 0; n < zip_D_CODES; n++) { - zip_static_dtree[n].dl = 5; - zip_static_dtree[n].fc = zip_bi_reverse(n, 5); - } - - // Initialize the first block of the first file: - zip_init_block(); -} - -/* ========================================================================== - * Initialize a new block. - */ -var zip_init_block = function() { - var n; // iterates over tree elements - - // Initialize the trees. - for(n = 0; n < zip_L_CODES; n++) zip_dyn_ltree[n].fc = 0; - for(n = 0; n < zip_D_CODES; n++) zip_dyn_dtree[n].fc = 0; - for(n = 0; n < zip_BL_CODES; n++) zip_bl_tree[n].fc = 0; - - zip_dyn_ltree[zip_END_BLOCK].fc = 1; - zip_opt_len = zip_static_len = 0; - zip_last_lit = zip_last_dist = zip_last_flags = 0; - zip_flags = 0; - zip_flag_bit = 1; -} - -/* ========================================================================== - * Restore the heap property by moving down the tree starting at node k, - * exchanging a node with the smallest of its two sons if necessary, stopping - * when the heap property is re-established (each father smaller than its - * two sons). - */ -var zip_pqdownheap = function( - tree, // the tree to restore - k) { // node to move down - var v = zip_heap[k]; - var j = k << 1; // left son of k - - while(j <= zip_heap_len) { - // Set j to the smallest of the two sons: - if(j < zip_heap_len && - zip_SMALLER(tree, zip_heap[j + 1], zip_heap[j])) - j++; - - // Exit if v is smaller than both sons - if(zip_SMALLER(tree, v, zip_heap[j])) - break; - - // Exchange v with the smallest son - zip_heap[k] = zip_heap[j]; - k = j; - - // And continue down the tree, setting j to the left son of k - j <<= 1; - } - zip_heap[k] = v; -} - -/* ========================================================================== - * Compute the optimal bit lengths for a tree and update the total bit length - * for the current block. - * IN assertion: the fields freq and dad are set, heap[heap_max] and - * above are the tree nodes sorted by increasing frequency. - * OUT assertions: the field len is set to the optimal bit length, the - * array bl_count contains the frequencies for each bit length. - * The length opt_len is updated; static_len is also updated if stree is - * not null. - */ -var zip_gen_bitlen = function(desc) { // the tree descriptor - var tree = desc.dyn_tree; - var extra = desc.extra_bits; - var base = desc.extra_base; - var max_code = desc.max_code; - var max_length = desc.max_length; - var stree = desc.static_tree; - var h; // heap index - var n, m; // iterate over the tree elements - var bits; // bit length - var xbits; // extra bits - var f; // frequency - var overflow = 0; // number of elements with bit length too large - - for(bits = 0; bits <= zip_MAX_BITS; bits++) - zip_bl_count[bits] = 0; - - /* In a first pass, compute the optimal bit lengths (which may - * overflow in the case of the bit length tree). - */ - tree[zip_heap[zip_heap_max]].dl = 0; // root of the heap - - for(h = zip_heap_max + 1; h < zip_HEAP_SIZE; h++) { - n = zip_heap[h]; - bits = tree[tree[n].dl].dl + 1; - if(bits > max_length) { - bits = max_length; - overflow++; - } - tree[n].dl = bits; - // We overwrite tree[n].dl which is no longer needed - - if(n > max_code) - continue; // not a leaf node - - zip_bl_count[bits]++; - xbits = 0; - if(n >= base) - xbits = extra[n - base]; - f = tree[n].fc; - zip_opt_len += f * (bits + xbits); - if(stree != null) - zip_static_len += f * (stree[n].dl + xbits); - } - if(overflow == 0) - return; - - // This happens for example on obj2 and pic of the Calgary corpus - - // Find the first bit length which could increase: - do { - bits = max_length - 1; - while(zip_bl_count[bits] == 0) - bits--; - zip_bl_count[bits]--; // move one leaf down the tree - zip_bl_count[bits + 1] += 2; // move one overflow item as its brother - zip_bl_count[max_length]--; - /* The brother of the overflow item also moves one step up, - * but this does not affect bl_count[max_length] - */ - overflow -= 2; - } while(overflow > 0); - - /* Now recompute all bit lengths, scanning in increasing frequency. - * h is still equal to HEAP_SIZE. (It is simpler to reconstruct all - * lengths instead of fixing only the wrong ones. This idea is taken - * from 'ar' written by Haruhiko Okumura.) - */ - for(bits = max_length; bits != 0; bits--) { - n = zip_bl_count[bits]; - while(n != 0) { - m = zip_heap[--h]; - if(m > max_code) - continue; - if(tree[m].dl != bits) { - zip_opt_len += (bits - tree[m].dl) * tree[m].fc; - tree[m].fc = bits; - } - n--; - } - } -} - - /* ========================================================================== - * Generate the codes for a given tree and bit counts (which need not be - * optimal). - * IN assertion: the array bl_count contains the bit length statistics for - * the given tree and the field len is set for all tree elements. - * OUT assertion: the field code is set for all tree elements of non - * zero code length. - */ -var zip_gen_codes = function(tree, // the tree to decorate - max_code) { // largest code with non zero frequency - var next_code = new Array(zip_MAX_BITS+1); // next code value for each bit length - var code = 0; // running code value - var bits; // bit index - var n; // code index - - /* The distribution counts are first used to generate the code values - * without bit reversal. - */ - for(bits = 1; bits <= zip_MAX_BITS; bits++) { - code = ((code + zip_bl_count[bits-1]) << 1); - next_code[bits] = code; - } - - /* Check that the bit counts in bl_count are consistent. The last code - * must be all ones. - */ -// Assert (code + encoder->bl_count[MAX_BITS]-1 == (1<> 1; n >= 1; n--) - zip_pqdownheap(tree, n); - - /* Construct the Huffman tree by repeatedly combining the least two - * frequent nodes. - */ - do { - n = zip_heap[zip_SMALLEST]; - zip_heap[zip_SMALLEST] = zip_heap[zip_heap_len--]; - zip_pqdownheap(tree, zip_SMALLEST); - - m = zip_heap[zip_SMALLEST]; // m = node of next least frequency - - // keep the nodes sorted by frequency - zip_heap[--zip_heap_max] = n; - zip_heap[--zip_heap_max] = m; - - // Create a new node father of n and m - tree[node].fc = tree[n].fc + tree[m].fc; -// depth[node] = (char)(MAX(depth[n], depth[m]) + 1); - if(zip_depth[n] > zip_depth[m] + 1) - zip_depth[node] = zip_depth[n]; - else - zip_depth[node] = zip_depth[m] + 1; - tree[n].dl = tree[m].dl = node; - - // and insert the new node in the heap - zip_heap[zip_SMALLEST] = node++; - zip_pqdownheap(tree, zip_SMALLEST); - - } while(zip_heap_len >= 2); - - zip_heap[--zip_heap_max] = zip_heap[zip_SMALLEST]; - - /* At this point, the fields freq and dad are set. We can now - * generate the bit lengths. - */ - zip_gen_bitlen(desc); - - // The field len is now set, we can generate the bit codes - zip_gen_codes(tree, max_code); -} - -/* ========================================================================== - * Scan a literal or distance tree to determine the frequencies of the codes - * in the bit length tree. Updates opt_len to take into account the repeat - * counts. (The contribution of the bit length codes will be added later - * during the construction of bl_tree.) - */ -var zip_scan_tree = function(tree,// the tree to be scanned - max_code) { // and its largest code of non zero frequency - var n; // iterates over all tree elements - var prevlen = -1; // last emitted length - var curlen; // length of current code - var nextlen = tree[0].dl; // length of next code - var count = 0; // repeat count of the current code - var max_count = 7; // max repeat count - var min_count = 4; // min repeat count - - if(nextlen == 0) { - max_count = 138; - min_count = 3; - } - tree[max_code + 1].dl = 0xffff; // guard - - for(n = 0; n <= max_code; n++) { - curlen = nextlen; - nextlen = tree[n + 1].dl; - if(++count < max_count && curlen == nextlen) - continue; - else if(count < min_count) - zip_bl_tree[curlen].fc += count; - else if(curlen != 0) { - if(curlen != prevlen) - zip_bl_tree[curlen].fc++; - zip_bl_tree[zip_REP_3_6].fc++; - } else if(count <= 10) - zip_bl_tree[zip_REPZ_3_10].fc++; - else - zip_bl_tree[zip_REPZ_11_138].fc++; - count = 0; prevlen = curlen; - if(nextlen == 0) { - max_count = 138; - min_count = 3; - } else if(curlen == nextlen) { - max_count = 6; - min_count = 3; - } else { - max_count = 7; - min_count = 4; - } - } -} - - /* ========================================================================== - * Send a literal or distance tree in compressed form, using the codes in - * bl_tree. - */ -var zip_send_tree = function(tree, // the tree to be scanned - max_code) { // and its largest code of non zero frequency - var n; // iterates over all tree elements - var prevlen = -1; // last emitted length - var curlen; // length of current code - var nextlen = tree[0].dl; // length of next code - var count = 0; // repeat count of the current code - var max_count = 7; // max repeat count - var min_count = 4; // min repeat count - - /* tree[max_code+1].dl = -1; */ /* guard already set */ - if(nextlen == 0) { - max_count = 138; - min_count = 3; - } - - for(n = 0; n <= max_code; n++) { - curlen = nextlen; - nextlen = tree[n+1].dl; - if(++count < max_count && curlen == nextlen) { - continue; - } else if(count < min_count) { - do { zip_SEND_CODE(curlen, zip_bl_tree); } while(--count != 0); - } else if(curlen != 0) { - if(curlen != prevlen) { - zip_SEND_CODE(curlen, zip_bl_tree); - count--; - } - // Assert(count >= 3 && count <= 6, " 3_6?"); - zip_SEND_CODE(zip_REP_3_6, zip_bl_tree); - zip_send_bits(count - 3, 2); - } else if(count <= 10) { - zip_SEND_CODE(zip_REPZ_3_10, zip_bl_tree); - zip_send_bits(count-3, 3); - } else { - zip_SEND_CODE(zip_REPZ_11_138, zip_bl_tree); - zip_send_bits(count-11, 7); - } - count = 0; - prevlen = curlen; - if(nextlen == 0) { - max_count = 138; - min_count = 3; - } else if(curlen == nextlen) { - max_count = 6; - min_count = 3; - } else { - max_count = 7; - min_count = 4; - } - } -} - -/* ========================================================================== - * Construct the Huffman tree for the bit lengths and return the index in - * bl_order of the last bit length code to send. - */ -var zip_build_bl_tree = function() { - var max_blindex; // index of last bit length code of non zero freq - - // Determine the bit length frequencies for literal and distance trees - zip_scan_tree(zip_dyn_ltree, zip_l_desc.max_code); - zip_scan_tree(zip_dyn_dtree, zip_d_desc.max_code); - - // Build the bit length tree: - zip_build_tree(zip_bl_desc); - /* opt_len now includes the length of the tree representations, except - * the lengths of the bit lengths codes and the 5+5+4 bits for the counts. - */ - - /* Determine the number of bit length codes to send. The pkzip format - * requires that at least 4 bit length codes be sent. (appnote.txt says - * 3 but the actual value used is 4.) - */ - for(max_blindex = zip_BL_CODES-1; max_blindex >= 3; max_blindex--) { - if(zip_bl_tree[zip_bl_order[max_blindex]].dl != 0) break; - } - /* Update opt_len to include the bit length tree and counts */ - zip_opt_len += 3*(max_blindex+1) + 5+5+4; -// Tracev((stderr, "\ndyn trees: dyn %ld, stat %ld", -// encoder->opt_len, encoder->static_len)); - - return max_blindex; -} - -/* ========================================================================== - * Send the header for a block using dynamic Huffman trees: the counts, the - * lengths of the bit length codes, the literal tree and the distance tree. - * IN assertion: lcodes >= 257, dcodes >= 1, blcodes >= 4. - */ -var zip_send_all_trees = function(lcodes, dcodes, blcodes) { // number of codes for each tree - var rank; // index in bl_order - -// Assert (lcodes >= 257 && dcodes >= 1 && blcodes >= 4, "not enough codes"); -// Assert (lcodes <= L_CODES && dcodes <= D_CODES && blcodes <= BL_CODES, -// "too many codes"); -// Tracev((stderr, "\nbl counts: ")); - zip_send_bits(lcodes-257, 5); // not +255 as stated in appnote.txt - zip_send_bits(dcodes-1, 5); - zip_send_bits(blcodes-4, 4); // not -3 as stated in appnote.txt - for(rank = 0; rank < blcodes; rank++) { -// Tracev((stderr, "\nbl code %2d ", bl_order[rank])); - zip_send_bits(zip_bl_tree[zip_bl_order[rank]].dl, 3); - } - - // send the literal tree - zip_send_tree(zip_dyn_ltree,lcodes-1); - - // send the distance tree - zip_send_tree(zip_dyn_dtree,dcodes-1); -} - -/* ========================================================================== - * Determine the best encoding for the current block: dynamic trees, static - * trees or store, and output the encoded block to the zip file. - */ -var zip_flush_block = function(eof) { // true if this is the last block for a file - var opt_lenb, static_lenb; // opt_len and static_len in bytes - var max_blindex; // index of last bit length code of non zero freq - var stored_len; // length of input block - - stored_len = zip_strstart - zip_block_start; - zip_flag_buf[zip_last_flags] = zip_flags; // Save the flags for the last 8 items - - // Construct the literal and distance trees - zip_build_tree(zip_l_desc); -// Tracev((stderr, "\nlit data: dyn %ld, stat %ld", -// encoder->opt_len, encoder->static_len)); - - zip_build_tree(zip_d_desc); -// Tracev((stderr, "\ndist data: dyn %ld, stat %ld", -// encoder->opt_len, encoder->static_len)); - /* At this point, opt_len and static_len are the total bit lengths of - * the compressed block data, excluding the tree representations. - */ - - /* Build the bit length tree for the above two trees, and get the index - * in bl_order of the last bit length code to send. - */ - max_blindex = zip_build_bl_tree(); - - // Determine the best encoding. Compute first the block length in bytes - opt_lenb = (zip_opt_len +3+7)>>3; - static_lenb = (zip_static_len+3+7)>>3; - -// Trace((stderr, "\nopt %lu(%lu) stat %lu(%lu) stored %lu lit %u dist %u ", -// opt_lenb, encoder->opt_len, -// static_lenb, encoder->static_len, stored_len, -// encoder->last_lit, encoder->last_dist)); - - if(static_lenb <= opt_lenb) - opt_lenb = static_lenb; - if(stored_len + 4 <= opt_lenb // 4: two words for the lengths - && zip_block_start >= 0) { - var i; - - /* The test buf != NULL is only necessary if LIT_BUFSIZE > WSIZE. - * Otherwise we can't have processed more than WSIZE input bytes since - * the last block flush, because compression would have been - * successful. If LIT_BUFSIZE <= WSIZE, it is never too late to - * transform a block into a stored block. - */ - zip_send_bits((zip_STORED_BLOCK<<1)+eof, 3); /* send block type */ - zip_bi_windup(); /* align on byte boundary */ - zip_put_short(stored_len); - zip_put_short(~stored_len); - - // copy block -/* - p = &window[block_start]; - for(i = 0; i < stored_len; i++) - put_byte(p[i]); -*/ - for(i = 0; i < stored_len; i++) - zip_put_byte(zip_window[zip_block_start + i]); - - } else if(static_lenb == opt_lenb) { - zip_send_bits((zip_STATIC_TREES<<1)+eof, 3); - zip_compress_block(zip_static_ltree, zip_static_dtree); - } else { - zip_send_bits((zip_DYN_TREES<<1)+eof, 3); - zip_send_all_trees(zip_l_desc.max_code+1, - zip_d_desc.max_code+1, - max_blindex+1); - zip_compress_block(zip_dyn_ltree, zip_dyn_dtree); - } - - zip_init_block(); - - if(eof != 0) - zip_bi_windup(); -} - -/* ========================================================================== - * Save the match info and tally the frequency counts. Return true if - * the current block must be flushed. - */ -var zip_ct_tally = function( - dist, // distance of matched string - lc) { // match length-MIN_MATCH or unmatched char (if dist==0) - zip_l_buf[zip_last_lit++] = lc; - if(dist == 0) { - // lc is the unmatched char - zip_dyn_ltree[lc].fc++; - } else { - // Here, lc is the match length - MIN_MATCH - dist--; // dist = match distance - 1 -// Assert((ush)dist < (ush)MAX_DIST && -// (ush)lc <= (ush)(MAX_MATCH-MIN_MATCH) && -// (ush)D_CODE(dist) < (ush)D_CODES, "ct_tally: bad match"); - - zip_dyn_ltree[zip_length_code[lc]+zip_LITERALS+1].fc++; - zip_dyn_dtree[zip_D_CODE(dist)].fc++; - - zip_d_buf[zip_last_dist++] = dist; - zip_flags |= zip_flag_bit; - } - zip_flag_bit <<= 1; - - // Output the flags if they fill a byte - if((zip_last_lit & 7) == 0) { - zip_flag_buf[zip_last_flags++] = zip_flags; - zip_flags = 0; - zip_flag_bit = 1; - } - // Try to guess if it is profitable to stop the current block here - if(zip_compr_level > 2 && (zip_last_lit & 0xfff) == 0) { - // Compute an upper bound for the compressed length - var out_length = zip_last_lit * 8; - var in_length = zip_strstart - zip_block_start; - var dcode; - - for(dcode = 0; dcode < zip_D_CODES; dcode++) { - out_length += zip_dyn_dtree[dcode].fc * (5 + zip_extra_dbits[dcode]); - } - out_length >>= 3; -// Trace((stderr,"\nlast_lit %u, last_dist %u, in %ld, out ~%ld(%ld%%) ", -// encoder->last_lit, encoder->last_dist, in_length, out_length, -// 100L - out_length*100L/in_length)); - if(zip_last_dist < parseInt(zip_last_lit/2) && - out_length < parseInt(in_length/2)) - return true; - } - return (zip_last_lit == zip_LIT_BUFSIZE-1 || - zip_last_dist == zip_DIST_BUFSIZE); - /* We avoid equality with LIT_BUFSIZE because of wraparound at 64K - * on 16 bit machines and because stored blocks are restricted to - * 64K-1 bytes. - */ -} - - /* ========================================================================== - * Send the block data compressed using the given Huffman trees - */ -var zip_compress_block = function( - ltree, // literal tree - dtree) { // distance tree - var dist; // distance of matched string - var lc; // match length or unmatched char (if dist == 0) - var lx = 0; // running index in l_buf - var dx = 0; // running index in d_buf - var fx = 0; // running index in flag_buf - var flag = 0; // current flags - var code; // the code to send - var extra; // number of extra bits to send - - if(zip_last_lit != 0) do { - if((lx & 7) == 0) - flag = zip_flag_buf[fx++]; - lc = zip_l_buf[lx++] & 0xff; - if((flag & 1) == 0) { - zip_SEND_CODE(lc, ltree); /* send a literal byte */ -// Tracecv(isgraph(lc), (stderr," '%c' ", lc)); - } else { - // Here, lc is the match length - MIN_MATCH - code = zip_length_code[lc]; - zip_SEND_CODE(code+zip_LITERALS+1, ltree); // send the length code - extra = zip_extra_lbits[code]; - if(extra != 0) { - lc -= zip_base_length[code]; - zip_send_bits(lc, extra); // send the extra length bits - } - dist = zip_d_buf[dx++]; - // Here, dist is the match distance - 1 - code = zip_D_CODE(dist); -// Assert (code < D_CODES, "bad d_code"); - - zip_SEND_CODE(code, dtree); // send the distance code - extra = zip_extra_dbits[code]; - if(extra != 0) { - dist -= zip_base_dist[code]; - zip_send_bits(dist, extra); // send the extra distance bits - } - } // literal or match pair ? - flag >>= 1; - } while(lx < zip_last_lit); - - zip_SEND_CODE(zip_END_BLOCK, ltree); -} - -/* ========================================================================== - * Send a value on a given number of bits. - * IN assertion: length <= 16 and value fits in length bits. - */ -var zip_Buf_size = 16; // bit size of bi_buf -var zip_send_bits = function( - value, // value to send - length) { // number of bits - /* If not enough room in bi_buf, use (valid) bits from bi_buf and - * (16 - bi_valid) bits from value, leaving (width - (16-bi_valid)) - * unused bits in value. - */ - if(zip_bi_valid > zip_Buf_size - length) { - zip_bi_buf |= (value << zip_bi_valid); - zip_put_short(zip_bi_buf); - zip_bi_buf = (value >> (zip_Buf_size - zip_bi_valid)); - zip_bi_valid += length - zip_Buf_size; - } else { - zip_bi_buf |= value << zip_bi_valid; - zip_bi_valid += length; - } -} - -/* ========================================================================== - * Reverse the first len bits of a code, using straightforward code (a faster - * method would use a table) - * IN assertion: 1 <= len <= 15 - */ -var zip_bi_reverse = function( - code, // the value to invert - len) { // its bit length - var res = 0; - do { - res |= code & 1; - code >>= 1; - res <<= 1; - } while(--len > 0); - return res >> 1; -} - -/* ========================================================================== - * Write out any remaining bits in an incomplete byte. - */ -var zip_bi_windup = function() { - if(zip_bi_valid > 8) { - zip_put_short(zip_bi_buf); - } else if(zip_bi_valid > 0) { - zip_put_byte(zip_bi_buf); - } - zip_bi_buf = 0; - zip_bi_valid = 0; -} - -var zip_qoutbuf = function() { - if(zip_outcnt != 0) { - var q, i; - q = zip_new_queue(); - if(zip_qhead == null) - zip_qhead = zip_qtail = q; - else - zip_qtail = zip_qtail.next = q; - q.len = zip_outcnt - zip_outoff; -// System.arraycopy(zip_outbuf, zip_outoff, q.ptr, 0, q.len); - for(i = 0; i < q.len; i++) - q.ptr[i] = zip_outbuf[zip_outoff + i]; - zip_outcnt = zip_outoff = 0; - } -} - -var zip_deflate = function(str, level) { - var i, j; - - zip_deflate_data = str; - zip_deflate_pos = 0; - if(typeof level == "undefined") - level = zip_DEFAULT_LEVEL; - zip_deflate_start(level); - - var buff = new Array(1024); - var aout = []; - while((i = zip_deflate_internal(buff, 0, buff.length)) > 0) { - var cbuf = new Array(i); - for(j = 0; j < i; j++){ - cbuf[j] = String.fromCharCode(buff[j]); - } - aout[aout.length] = cbuf.join(""); - } - zip_deflate_data = null; // G.C. - return aout.join(""); -} - -if (! window.RawDeflate) RawDeflate = {}; -RawDeflate.deflate = zip_deflate; - -})(); - - -/* - * $Id: rawinflate.js,v 0.2 2009/03/01 18:32:24 dankogai Exp $ - * - * original: - * http://www.onicos.com/staff/iz/amuse/javascript/expert/inflate.txt - */ - -(function(){ - -/* Copyright (C) 1999 Masanao Izumo - * Version: 1.0.0.1 - * LastModified: Dec 25 1999 - */ - -/* Interface: - * data = zip_inflate(src); - */ - -/* constant parameters */ -var zip_WSIZE = 32768; // Sliding Window size -var zip_STORED_BLOCK = 0; -var zip_STATIC_TREES = 1; -var zip_DYN_TREES = 2; - -/* for inflate */ -var zip_lbits = 9; // bits in base literal/length lookup table -var zip_dbits = 6; // bits in base distance lookup table -var zip_INBUFSIZ = 32768; // Input buffer size -var zip_INBUF_EXTRA = 64; // Extra buffer - -/* variables (inflate) */ -var zip_slide; -var zip_wp; // current position in slide -var zip_fixed_tl = null; // inflate static -var zip_fixed_td; // inflate static -var zip_fixed_bl, fixed_bd; // inflate static -var zip_bit_buf; // bit buffer -var zip_bit_len; // bits in bit buffer -var zip_method; -var zip_eof; -var zip_copy_leng; -var zip_copy_dist; -var zip_tl, zip_td; // literal/length and distance decoder tables -var zip_bl, zip_bd; // number of bits decoded by tl and td - -var zip_inflate_data; -var zip_inflate_pos; - - -/* constant tables (inflate) */ -var zip_MASK_BITS = new Array( - 0x0000, - 0x0001, 0x0003, 0x0007, 0x000f, 0x001f, 0x003f, 0x007f, 0x00ff, - 0x01ff, 0x03ff, 0x07ff, 0x0fff, 0x1fff, 0x3fff, 0x7fff, 0xffff); -// Tables for deflate from PKZIP's appnote.txt. -var zip_cplens = new Array( // Copy lengths for literal codes 257..285 - 3, 4, 5, 6, 7, 8, 9, 10, 11, 13, 15, 17, 19, 23, 27, 31, - 35, 43, 51, 59, 67, 83, 99, 115, 131, 163, 195, 227, 258, 0, 0); -/* note: see note #13 above about the 258 in this list. */ -var zip_cplext = new Array( // Extra bits for literal codes 257..285 - 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 2, 2, 2, 2, - 3, 3, 3, 3, 4, 4, 4, 4, 5, 5, 5, 5, 0, 99, 99); // 99==invalid -var zip_cpdist = new Array( // Copy offsets for distance codes 0..29 - 1, 2, 3, 4, 5, 7, 9, 13, 17, 25, 33, 49, 65, 97, 129, 193, - 257, 385, 513, 769, 1025, 1537, 2049, 3073, 4097, 6145, - 8193, 12289, 16385, 24577); -var zip_cpdext = new Array( // Extra bits for distance codes - 0, 0, 0, 0, 1, 1, 2, 2, 3, 3, 4, 4, 5, 5, 6, 6, - 7, 7, 8, 8, 9, 9, 10, 10, 11, 11, - 12, 12, 13, 13); -var zip_border = new Array( // Order of the bit length code lengths - 16, 17, 18, 0, 8, 7, 9, 6, 10, 5, 11, 4, 12, 3, 13, 2, 14, 1, 15); -/* objects (inflate) */ - -var zip_HuftList = function() { - this.next = null; - this.list = null; -} - -var zip_HuftNode = function() { - this.e = 0; // number of extra bits or operation - this.b = 0; // number of bits in this code or subcode - - // union - this.n = 0; // literal, length base, or distance base - this.t = null; // (zip_HuftNode) pointer to next level of table -} - -var zip_HuftBuild = function(b, // code lengths in bits (all assumed <= BMAX) - n, // number of codes (assumed <= N_MAX) - s, // number of simple-valued codes (0..s-1) - d, // list of base values for non-simple codes - e, // list of extra bits for non-simple codes - mm // maximum lookup bits - ) { - this.BMAX = 16; // maximum bit length of any code - this.N_MAX = 288; // maximum number of codes in any set - this.status = 0; // 0: success, 1: incomplete table, 2: bad input - this.root = null; // (zip_HuftList) starting table - this.m = 0; // maximum lookup bits, returns actual - -/* Given a list of code lengths and a maximum table size, make a set of - tables to decode that set of codes. Return zero on success, one if - the given code set is incomplete (the tables are still built in this - case), two if the input is invalid (all zero length codes or an - oversubscribed set of lengths), and three if not enough memory. - The code with value 256 is special, and the tables are constructed - so that no bits beyond that code are fetched when that code is - decoded. */ - { - var a; // counter for codes of length k - var c = new Array(this.BMAX+1); // bit length count table - var el; // length of EOB code (value 256) - var f; // i repeats in table every f entries - var g; // maximum code length - var h; // table level - var i; // counter, current code - var j; // counter - var k; // number of bits in current code - var lx = new Array(this.BMAX+1); // stack of bits per table - var p; // pointer into c[], b[], or v[] - var pidx; // index of p - var q; // (zip_HuftNode) points to current table - var r = new zip_HuftNode(); // table entry for structure assignment - var u = new Array(this.BMAX); // zip_HuftNode[BMAX][] table stack - var v = new Array(this.N_MAX); // values in order of bit length - var w; - var x = new Array(this.BMAX+1);// bit offsets, then code stack - var xp; // pointer into x or c - var y; // number of dummy codes added - var z; // number of entries in current table - var o; - var tail; // (zip_HuftList) - - tail = this.root = null; - for(i = 0; i < c.length; i++) - c[i] = 0; - for(i = 0; i < lx.length; i++) - lx[i] = 0; - for(i = 0; i < u.length; i++) - u[i] = null; - for(i = 0; i < v.length; i++) - v[i] = 0; - for(i = 0; i < x.length; i++) - x[i] = 0; - - // Generate counts for each bit length - el = n > 256 ? b[256] : this.BMAX; // set length of EOB code, if any - p = b; pidx = 0; - i = n; - do { - c[p[pidx]]++; // assume all entries <= BMAX - pidx++; - } while(--i > 0); - if(c[0] == n) { // null input--all zero length codes - this.root = null; - this.m = 0; - this.status = 0; - return; - } - - // Find minimum and maximum length, bound *m by those - for(j = 1; j <= this.BMAX; j++) - if(c[j] != 0) - break; - k = j; // minimum code length - if(mm < j) - mm = j; - for(i = this.BMAX; i != 0; i--) - if(c[i] != 0) - break; - g = i; // maximum code length - if(mm > i) - mm = i; - - // Adjust last length count to fill out codes, if needed - for(y = 1 << j; j < i; j++, y <<= 1) - if((y -= c[j]) < 0) { - this.status = 2; // bad input: more codes than bits - this.m = mm; - return; - } - if((y -= c[i]) < 0) { - this.status = 2; - this.m = mm; - return; - } - c[i] += y; - - // Generate starting offsets into the value table for each length - x[1] = j = 0; - p = c; - pidx = 1; - xp = 2; - while(--i > 0) // note that i == g from above - x[xp++] = (j += p[pidx++]); - - // Make a table of values in order of bit lengths - p = b; pidx = 0; - i = 0; - do { - if((j = p[pidx++]) != 0) - v[x[j]++] = i; - } while(++i < n); - n = x[g]; // set n to length of v - - // Generate the Huffman codes and for each, make the table entries - x[0] = i = 0; // first Huffman code is zero - p = v; pidx = 0; // grab values in bit order - h = -1; // no tables yet--level -1 - w = lx[0] = 0; // no bits decoded yet - q = null; // ditto - z = 0; // ditto - - // go through the bit lengths (k already is bits in shortest code) - for(; k <= g; k++) { - a = c[k]; - while(a-- > 0) { - // here i is the Huffman code of length k bits for value p[pidx] - // make tables up to required level - while(k > w + lx[1 + h]) { - w += lx[1 + h]; // add bits already decoded - h++; - - // compute minimum size table less than or equal to *m bits - z = (z = g - w) > mm ? mm : z; // upper limit - if((f = 1 << (j = k - w)) > a + 1) { // try a k-w bit table - // too few codes for k-w bit table - f -= a + 1; // deduct codes from patterns left - xp = k; - while(++j < z) { // try smaller tables up to z bits - if((f <<= 1) <= c[++xp]) - break; // enough codes to use up j bits - f -= c[xp]; // else deduct codes from patterns - } - } - if(w + j > el && w < el) - j = el - w; // make EOB code end at table - z = 1 << j; // table entries for j-bit table - lx[1 + h] = j; // set table size in stack - - // allocate and link in new table - q = new Array(z); - for(o = 0; o < z; o++) { - q[o] = new zip_HuftNode(); - } - - if(tail == null) - tail = this.root = new zip_HuftList(); - else - tail = tail.next = new zip_HuftList(); - tail.next = null; - tail.list = q; - u[h] = q; // table starts after link - - /* connect to last table, if there is one */ - if(h > 0) { - x[h] = i; // save pattern for backing up - r.b = lx[h]; // bits to dump before this table - r.e = 16 + j; // bits in this table - r.t = q; // pointer to this table - j = (i & ((1 << w) - 1)) >> (w - lx[h]); - u[h-1][j].e = r.e; - u[h-1][j].b = r.b; - u[h-1][j].n = r.n; - u[h-1][j].t = r.t; - } - } - - // set up table entry in r - r.b = k - w; - if(pidx >= n) - r.e = 99; // out of values--invalid code - else if(p[pidx] < s) { - r.e = (p[pidx] < 256 ? 16 : 15); // 256 is end-of-block code - r.n = p[pidx++]; // simple code is just the value - } else { - r.e = e[p[pidx] - s]; // non-simple--look up in lists - r.n = d[p[pidx++] - s]; - } - - // fill code-like entries with r // - f = 1 << (k - w); - for(j = i >> w; j < z; j += f) { - q[j].e = r.e; - q[j].b = r.b; - q[j].n = r.n; - q[j].t = r.t; - } - - // backwards increment the k-bit code i - for(j = 1 << (k - 1); (i & j) != 0; j >>= 1) - i ^= j; - i ^= j; - - // backup over finished tables - while((i & ((1 << w) - 1)) != x[h]) { - w -= lx[h]; // don't need to update q - h--; - } - } - } - - /* return actual size of base table */ - this.m = lx[1]; - - /* Return true (1) if we were given an incomplete table */ - this.status = ((y != 0 && g != 1) ? 1 : 0); - } /* end of constructor */ -} - - -/* routines (inflate) */ - -var zip_GET_BYTE = function() { - if(zip_inflate_data.length == zip_inflate_pos) - return -1; - return zip_inflate_data.charCodeAt(zip_inflate_pos++) & 0xff; -} - -var zip_NEEDBITS = function(n) { - while(zip_bit_len < n) { - zip_bit_buf |= zip_GET_BYTE() << zip_bit_len; - zip_bit_len += 8; - } -} - -var zip_GETBITS = function(n) { - return zip_bit_buf & zip_MASK_BITS[n]; -} - -var zip_DUMPBITS = function(n) { - zip_bit_buf >>= n; - zip_bit_len -= n; -} - -var zip_inflate_codes = function(buff, off, size) { - /* inflate (decompress) the codes in a deflated (compressed) block. - Return an error code or zero if it all goes ok. */ - var e; // table entry flag/number of extra bits - var t; // (zip_HuftNode) pointer to table entry - var n; - - if(size == 0) - return 0; - - // inflate the coded data - n = 0; - for(;;) { // do until end of block - zip_NEEDBITS(zip_bl); - t = zip_tl.list[zip_GETBITS(zip_bl)]; - e = t.e; - while(e > 16) { - if(e == 99) - return -1; - zip_DUMPBITS(t.b); - e -= 16; - zip_NEEDBITS(e); - t = t.t[zip_GETBITS(e)]; - e = t.e; - } - zip_DUMPBITS(t.b); - - if(e == 16) { // then it's a literal - zip_wp &= zip_WSIZE - 1; - buff[off + n++] = zip_slide[zip_wp++] = t.n; - if(n == size) - return size; - continue; - } - - // exit if end of block - if(e == 15) - break; - - // it's an EOB or a length - - // get length of block to copy - zip_NEEDBITS(e); - zip_copy_leng = t.n + zip_GETBITS(e); - zip_DUMPBITS(e); - - // decode distance of block to copy - zip_NEEDBITS(zip_bd); - t = zip_td.list[zip_GETBITS(zip_bd)]; - e = t.e; - - while(e > 16) { - if(e == 99) - return -1; - zip_DUMPBITS(t.b); - e -= 16; - zip_NEEDBITS(e); - t = t.t[zip_GETBITS(e)]; - e = t.e; - } - zip_DUMPBITS(t.b); - zip_NEEDBITS(e); - zip_copy_dist = zip_wp - t.n - zip_GETBITS(e); - zip_DUMPBITS(e); - - // do the copy - while(zip_copy_leng > 0 && n < size) { - zip_copy_leng--; - zip_copy_dist &= zip_WSIZE - 1; - zip_wp &= zip_WSIZE - 1; - buff[off + n++] = zip_slide[zip_wp++] - = zip_slide[zip_copy_dist++]; - } - - if(n == size) - return size; - } - - zip_method = -1; // done - return n; -} - -var zip_inflate_stored = function(buff, off, size) { - /* "decompress" an inflated type 0 (stored) block. */ - var n; - - // go to byte boundary - n = zip_bit_len & 7; - zip_DUMPBITS(n); - - // get the length and its complement - zip_NEEDBITS(16); - n = zip_GETBITS(16); - zip_DUMPBITS(16); - zip_NEEDBITS(16); - if(n != ((~zip_bit_buf) & 0xffff)) - return -1; // error in compressed data - zip_DUMPBITS(16); - - // read and output the compressed data - zip_copy_leng = n; - - n = 0; - while(zip_copy_leng > 0 && n < size) { - zip_copy_leng--; - zip_wp &= zip_WSIZE - 1; - zip_NEEDBITS(8); - buff[off + n++] = zip_slide[zip_wp++] = - zip_GETBITS(8); - zip_DUMPBITS(8); - } - - if(zip_copy_leng == 0) - zip_method = -1; // done - return n; -} - -var zip_inflate_fixed = function(buff, off, size) { - /* decompress an inflated type 1 (fixed Huffman codes) block. We should - either replace this with a custom decoder, or at least precompute the - Huffman tables. */ - - // if first time, set up tables for fixed blocks - if(zip_fixed_tl == null) { - var i; // temporary variable - var l = new Array(288); // length list for huft_build - var h; // zip_HuftBuild - - // literal table - for(i = 0; i < 144; i++) - l[i] = 8; - for(; i < 256; i++) - l[i] = 9; - for(; i < 280; i++) - l[i] = 7; - for(; i < 288; i++) // make a complete, but wrong code set - l[i] = 8; - zip_fixed_bl = 7; - - h = new zip_HuftBuild(l, 288, 257, zip_cplens, zip_cplext, - zip_fixed_bl); - if(h.status != 0) { - alert("HufBuild error: "+h.status); - return -1; - } - zip_fixed_tl = h.root; - zip_fixed_bl = h.m; - - // distance table - for(i = 0; i < 30; i++) // make an incomplete code set - l[i] = 5; - zip_fixed_bd = 5; - - h = new zip_HuftBuild(l, 30, 0, zip_cpdist, zip_cpdext, zip_fixed_bd); - if(h.status > 1) { - zip_fixed_tl = null; - alert("HufBuild error: "+h.status); - return -1; - } - zip_fixed_td = h.root; - zip_fixed_bd = h.m; - } - - zip_tl = zip_fixed_tl; - zip_td = zip_fixed_td; - zip_bl = zip_fixed_bl; - zip_bd = zip_fixed_bd; - return zip_inflate_codes(buff, off, size); -} - -var zip_inflate_dynamic = function(buff, off, size) { - // decompress an inflated type 2 (dynamic Huffman codes) block. - var i; // temporary variables - var j; - var l; // last length - var n; // number of lengths to get - var t; // (zip_HuftNode) literal/length code table - var nb; // number of bit length codes - var nl; // number of literal/length codes - var nd; // number of distance codes - var ll = new Array(286+30); // literal/length and distance code lengths - var h; // (zip_HuftBuild) - - for(i = 0; i < ll.length; i++) - ll[i] = 0; - - // read in table lengths - zip_NEEDBITS(5); - nl = 257 + zip_GETBITS(5); // number of literal/length codes - zip_DUMPBITS(5); - zip_NEEDBITS(5); - nd = 1 + zip_GETBITS(5); // number of distance codes - zip_DUMPBITS(5); - zip_NEEDBITS(4); - nb = 4 + zip_GETBITS(4); // number of bit length codes - zip_DUMPBITS(4); - if(nl > 286 || nd > 30) - return -1; // bad lengths - - // read in bit-length-code lengths - for(j = 0; j < nb; j++) - { - zip_NEEDBITS(3); - ll[zip_border[j]] = zip_GETBITS(3); - zip_DUMPBITS(3); - } - for(; j < 19; j++) - ll[zip_border[j]] = 0; - - // build decoding table for trees--single level, 7 bit lookup - zip_bl = 7; - h = new zip_HuftBuild(ll, 19, 19, null, null, zip_bl); - if(h.status != 0) - return -1; // incomplete code set - - zip_tl = h.root; - zip_bl = h.m; - - // read in literal and distance code lengths - n = nl + nd; - i = l = 0; - while(i < n) { - zip_NEEDBITS(zip_bl); - t = zip_tl.list[zip_GETBITS(zip_bl)]; - j = t.b; - zip_DUMPBITS(j); - j = t.n; - if(j < 16) // length of code in bits (0..15) - ll[i++] = l = j; // save last length in l - else if(j == 16) { // repeat last length 3 to 6 times - zip_NEEDBITS(2); - j = 3 + zip_GETBITS(2); - zip_DUMPBITS(2); - if(i + j > n) - return -1; - while(j-- > 0) - ll[i++] = l; - } else if(j == 17) { // 3 to 10 zero length codes - zip_NEEDBITS(3); - j = 3 + zip_GETBITS(3); - zip_DUMPBITS(3); - if(i + j > n) - return -1; - while(j-- > 0) - ll[i++] = 0; - l = 0; - } else { // j == 18: 11 to 138 zero length codes - zip_NEEDBITS(7); - j = 11 + zip_GETBITS(7); - zip_DUMPBITS(7); - if(i + j > n) - return -1; - while(j-- > 0) - ll[i++] = 0; - l = 0; - } - } - - // build the decoding tables for literal/length and distance codes - zip_bl = zip_lbits; - h = new zip_HuftBuild(ll, nl, 257, zip_cplens, zip_cplext, zip_bl); - if(zip_bl == 0) // no literals or lengths - h.status = 1; - if(h.status != 0) { - if(h.status == 1) - ;// **incomplete literal tree** - return -1; // incomplete code set - } - zip_tl = h.root; - zip_bl = h.m; - - for(i = 0; i < nd; i++) - ll[i] = ll[i + nl]; - zip_bd = zip_dbits; - h = new zip_HuftBuild(ll, nd, 0, zip_cpdist, zip_cpdext, zip_bd); - zip_td = h.root; - zip_bd = h.m; - - if(zip_bd == 0 && nl > 257) { // lengths but no distances - // **incomplete distance tree** - return -1; - } - - if(h.status == 1) { - ;// **incomplete distance tree** - } - if(h.status != 0) - return -1; - - // decompress until an end-of-block code - return zip_inflate_codes(buff, off, size); -} - -var zip_inflate_start = function() { - var i; - - if(zip_slide == null) - zip_slide = new Array(2 * zip_WSIZE); - zip_wp = 0; - zip_bit_buf = 0; - zip_bit_len = 0; - zip_method = -1; - zip_eof = false; - zip_copy_leng = zip_copy_dist = 0; - zip_tl = null; -} - -var zip_inflate_internal = function(buff, off, size) { - // decompress an inflated entry - var n, i; - - n = 0; - while(n < size) { - if(zip_eof && zip_method == -1) - return n; - - if(zip_copy_leng > 0) { - if(zip_method != zip_STORED_BLOCK) { - // STATIC_TREES or DYN_TREES - while(zip_copy_leng > 0 && n < size) { - zip_copy_leng--; - zip_copy_dist &= zip_WSIZE - 1; - zip_wp &= zip_WSIZE - 1; - buff[off + n++] = zip_slide[zip_wp++] = - zip_slide[zip_copy_dist++]; - } - } else { - while(zip_copy_leng > 0 && n < size) { - zip_copy_leng--; - zip_wp &= zip_WSIZE - 1; - zip_NEEDBITS(8); - buff[off + n++] = zip_slide[zip_wp++] = zip_GETBITS(8); - zip_DUMPBITS(8); - } - if(zip_copy_leng == 0) - zip_method = -1; // done - } - if(n == size) - return n; - } - - if(zip_method == -1) { - if(zip_eof) - break; - - // read in last block bit - zip_NEEDBITS(1); - if(zip_GETBITS(1) != 0) - zip_eof = true; - zip_DUMPBITS(1); - - // read in block type - zip_NEEDBITS(2); - zip_method = zip_GETBITS(2); - zip_DUMPBITS(2); - zip_tl = null; - zip_copy_leng = 0; - } - - switch(zip_method) { - case 0: // zip_STORED_BLOCK - i = zip_inflate_stored(buff, off + n, size - n); - break; - - case 1: // zip_STATIC_TREES - if(zip_tl != null) - i = zip_inflate_codes(buff, off + n, size - n); - else - i = zip_inflate_fixed(buff, off + n, size - n); - break; - - case 2: // zip_DYN_TREES - if(zip_tl != null) - i = zip_inflate_codes(buff, off + n, size - n); - else - i = zip_inflate_dynamic(buff, off + n, size - n); - break; - - default: // error - i = -1; - break; - } - - if(i == -1) { - if(zip_eof) - return 0; - return -1; - } - n += i; - } - return n; -} - -var zip_inflate = function(str) { - var i, j; - - zip_inflate_start(); - zip_inflate_data = str; - zip_inflate_pos = 0; - - var buff = new Array(1024); - var aout = []; - while((i = zip_inflate_internal(buff, 0, buff.length)) > 0) { - var cbuf = new Array(i); - for(j = 0; j < i; j++){ - cbuf[j] = String.fromCharCode(buff[j]); - } - aout[aout.length] = cbuf.join(""); - } - zip_inflate_data = null; // G.C. - return aout.join(""); -} - -if (! window.RawDeflate) RawDeflate = {}; -RawDeflate.inflate = zip_inflate; - -})(); diff --git a/vendor/underscore-min.js b/vendor/underscore-min.js deleted file mode 100644 index c1d9d3a..0000000 --- a/vendor/underscore-min.js +++ /dev/null @@ -1 +0,0 @@ -(function(){var n=this,t=n._,r={},e=Array.prototype,u=Object.prototype,i=Function.prototype,a=e.push,o=e.slice,c=e.concat,l=u.toString,f=u.hasOwnProperty,s=e.forEach,p=e.map,h=e.reduce,v=e.reduceRight,d=e.filter,g=e.every,m=e.some,y=e.indexOf,b=e.lastIndexOf,x=Array.isArray,_=Object.keys,j=i.bind,w=function(n){return n instanceof w?n:this instanceof w?(this._wrapped=n,void 0):new w(n)};"undefined"!=typeof exports?("undefined"!=typeof module&&module.exports&&(exports=module.exports=w),exports._=w):n._=w,w.VERSION="1.4.4";var A=w.each=w.forEach=function(n,t,e){if(null!=n)if(s&&n.forEach===s)n.forEach(t,e);else if(n.length===+n.length){for(var u=0,i=n.length;i>u;u++)if(t.call(e,n[u],u,n)===r)return}else for(var a in n)if(w.has(n,a)&&t.call(e,n[a],a,n)===r)return};w.map=w.collect=function(n,t,r){var e=[];return null==n?e:p&&n.map===p?n.map(t,r):(A(n,function(n,u,i){e[e.length]=t.call(r,n,u,i)}),e)};var O="Reduce of empty array with no initial value";w.reduce=w.foldl=w.inject=function(n,t,r,e){var u=arguments.length>2;if(null==n&&(n=[]),h&&n.reduce===h)return e&&(t=w.bind(t,e)),u?n.reduce(t,r):n.reduce(t);if(A(n,function(n,i,a){u?r=t.call(e,r,n,i,a):(r=n,u=!0)}),!u)throw new TypeError(O);return r},w.reduceRight=w.foldr=function(n,t,r,e){var u=arguments.length>2;if(null==n&&(n=[]),v&&n.reduceRight===v)return e&&(t=w.bind(t,e)),u?n.reduceRight(t,r):n.reduceRight(t);var i=n.length;if(i!==+i){var a=w.keys(n);i=a.length}if(A(n,function(o,c,l){c=a?a[--i]:--i,u?r=t.call(e,r,n[c],c,l):(r=n[c],u=!0)}),!u)throw new TypeError(O);return r},w.find=w.detect=function(n,t,r){var e;return E(n,function(n,u,i){return t.call(r,n,u,i)?(e=n,!0):void 0}),e},w.filter=w.select=function(n,t,r){var e=[];return null==n?e:d&&n.filter===d?n.filter(t,r):(A(n,function(n,u,i){t.call(r,n,u,i)&&(e[e.length]=n)}),e)},w.reject=function(n,t,r){return w.filter(n,function(n,e,u){return!t.call(r,n,e,u)},r)},w.every=w.all=function(n,t,e){t||(t=w.identity);var u=!0;return null==n?u:g&&n.every===g?n.every(t,e):(A(n,function(n,i,a){return(u=u&&t.call(e,n,i,a))?void 0:r}),!!u)};var E=w.some=w.any=function(n,t,e){t||(t=w.identity);var u=!1;return null==n?u:m&&n.some===m?n.some(t,e):(A(n,function(n,i,a){return u||(u=t.call(e,n,i,a))?r:void 0}),!!u)};w.contains=w.include=function(n,t){return null==n?!1:y&&n.indexOf===y?n.indexOf(t)!=-1:E(n,function(n){return n===t})},w.invoke=function(n,t){var r=o.call(arguments,2),e=w.isFunction(t);return w.map(n,function(n){return(e?t:n[t]).apply(n,r)})},w.pluck=function(n,t){return w.map(n,function(n){return n[t]})},w.where=function(n,t,r){return w.isEmpty(t)?r?null:[]:w[r?"find":"filter"](n,function(n){for(var r in t)if(t[r]!==n[r])return!1;return!0})},w.findWhere=function(n,t){return w.where(n,t,!0)},w.max=function(n,t,r){if(!t&&w.isArray(n)&&n[0]===+n[0]&&65535>n.length)return Math.max.apply(Math,n);if(!t&&w.isEmpty(n))return-1/0;var e={computed:-1/0,value:-1/0};return A(n,function(n,u,i){var a=t?t.call(r,n,u,i):n;a>=e.computed&&(e={value:n,computed:a})}),e.value},w.min=function(n,t,r){if(!t&&w.isArray(n)&&n[0]===+n[0]&&65535>n.length)return Math.min.apply(Math,n);if(!t&&w.isEmpty(n))return 1/0;var e={computed:1/0,value:1/0};return A(n,function(n,u,i){var a=t?t.call(r,n,u,i):n;e.computed>a&&(e={value:n,computed:a})}),e.value},w.shuffle=function(n){var t,r=0,e=[];return A(n,function(n){t=w.random(r++),e[r-1]=e[t],e[t]=n}),e};var k=function(n){return w.isFunction(n)?n:function(t){return t[n]}};w.sortBy=function(n,t,r){var e=k(t);return w.pluck(w.map(n,function(n,t,u){return{value:n,index:t,criteria:e.call(r,n,t,u)}}).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.indexi;){var o=i+a>>>1;u>r.call(e,n[o])?i=o+1:a=o}return i},w.toArray=function(n){return n?w.isArray(n)?o.call(n):n.length===+n.length?w.map(n,w.identity):w.values(n):[]},w.size=function(n){return null==n?0:n.length===+n.length?n.length:w.keys(n).length},w.first=w.head=w.take=function(n,t,r){return null==n?void 0:null==t||r?n[0]:o.call(n,0,t)},w.initial=function(n,t,r){return o.call(n,0,n.length-(null==t||r?1:t))},w.last=function(n,t,r){return null==n?void 0:null==t||r?n[n.length-1]:o.call(n,Math.max(n.length-t,0))},w.rest=w.tail=w.drop=function(n,t,r){return o.call(n,null==t||r?1:t)},w.compact=function(n){return w.filter(n,w.identity)};var R=function(n,t,r){return A(n,function(n){w.isArray(n)?t?a.apply(r,n):R(n,t,r):r.push(n)}),r};w.flatten=function(n,t){return R(n,t,[])},w.without=function(n){return w.difference(n,o.call(arguments,1))},w.uniq=w.unique=function(n,t,r,e){w.isFunction(t)&&(e=r,r=t,t=!1);var u=r?w.map(n,r,e):n,i=[],a=[];return A(u,function(r,e){(t?e&&a[a.length-1]===r:w.contains(a,r))||(a.push(r),i.push(n[e]))}),i},w.union=function(){return w.uniq(c.apply(e,arguments))},w.intersection=function(n){var t=o.call(arguments,1);return w.filter(w.uniq(n),function(n){return w.every(t,function(t){return w.indexOf(t,n)>=0})})},w.difference=function(n){var t=c.apply(e,o.call(arguments,1));return w.filter(n,function(n){return!w.contains(t,n)})},w.zip=function(){for(var n=o.call(arguments),t=w.max(w.pluck(n,"length")),r=Array(t),e=0;t>e;e++)r[e]=w.pluck(n,""+e);return r},w.object=function(n,t){if(null==n)return{};for(var r={},e=0,u=n.length;u>e;e++)t?r[n[e]]=t[e]:r[n[e][0]]=n[e][1];return r},w.indexOf=function(n,t,r){if(null==n)return-1;var e=0,u=n.length;if(r){if("number"!=typeof r)return e=w.sortedIndex(n,t),n[e]===t?e:-1;e=0>r?Math.max(0,u+r):r}if(y&&n.indexOf===y)return n.indexOf(t,r);for(;u>e;e++)if(n[e]===t)return e;return-1},w.lastIndexOf=function(n,t,r){if(null==n)return-1;var e=null!=r;if(b&&n.lastIndexOf===b)return e?n.lastIndexOf(t,r):n.lastIndexOf(t);for(var u=e?r:n.length;u--;)if(n[u]===t)return u;return-1},w.range=function(n,t,r){1>=arguments.length&&(t=n||0,n=0),r=arguments[2]||1;for(var e=Math.max(Math.ceil((t-n)/r),0),u=0,i=Array(e);e>u;)i[u++]=n,n+=r;return i},w.bind=function(n,t){if(n.bind===j&&j)return j.apply(n,o.call(arguments,1));var r=o.call(arguments,2);return function(){return n.apply(t,r.concat(o.call(arguments)))}},w.partial=function(n){var t=o.call(arguments,1);return function(){return n.apply(this,t.concat(o.call(arguments)))}},w.bindAll=function(n){var t=o.call(arguments,1);return 0===t.length&&(t=w.functions(n)),A(t,function(t){n[t]=w.bind(n[t],n)}),n},w.memoize=function(n,t){var r={};return t||(t=w.identity),function(){var e=t.apply(this,arguments);return w.has(r,e)?r[e]:r[e]=n.apply(this,arguments)}},w.delay=function(n,t){var r=o.call(arguments,2);return setTimeout(function(){return n.apply(null,r)},t)},w.defer=function(n){return w.delay.apply(w,[n,1].concat(o.call(arguments,1)))},w.throttle=function(n,t){var r,e,u,i,a=0,o=function(){a=new Date,u=null,i=n.apply(r,e)};return function(){var c=new Date,l=t-(c-a);return r=this,e=arguments,0>=l?(clearTimeout(u),u=null,a=c,i=n.apply(r,e)):u||(u=setTimeout(o,l)),i}},w.debounce=function(n,t,r){var e,u;return function(){var i=this,a=arguments,o=function(){e=null,r||(u=n.apply(i,a))},c=r&&!e;return clearTimeout(e),e=setTimeout(o,t),c&&(u=n.apply(i,a)),u}},w.once=function(n){var t,r=!1;return function(){return r?t:(r=!0,t=n.apply(this,arguments),n=null,t)}},w.wrap=function(n,t){return function(){var r=[n];return a.apply(r,arguments),t.apply(this,r)}},w.compose=function(){var n=arguments;return function(){for(var t=arguments,r=n.length-1;r>=0;r--)t=[n[r].apply(this,t)];return t[0]}},w.after=function(n,t){return 0>=n?t():function(){return 1>--n?t.apply(this,arguments):void 0}},w.keys=_||function(n){if(n!==Object(n))throw new TypeError("Invalid object");var t=[];for(var r in n)w.has(n,r)&&(t[t.length]=r);return t},w.values=function(n){var t=[];for(var r in n)w.has(n,r)&&t.push(n[r]);return t},w.pairs=function(n){var t=[];for(var r in n)w.has(n,r)&&t.push([r,n[r]]);return t},w.invert=function(n){var t={};for(var r in n)w.has(n,r)&&(t[n[r]]=r);return t},w.functions=w.methods=function(n){var t=[];for(var r in n)w.isFunction(n[r])&&t.push(r);return t.sort()},w.extend=function(n){return A(o.call(arguments,1),function(t){if(t)for(var r in t)n[r]=t[r]}),n},w.pick=function(n){var t={},r=c.apply(e,o.call(arguments,1));return A(r,function(r){r in n&&(t[r]=n[r])}),t},w.omit=function(n){var t={},r=c.apply(e,o.call(arguments,1));for(var u in n)w.contains(r,u)||(t[u]=n[u]);return t},w.defaults=function(n){return A(o.call(arguments,1),function(t){if(t)for(var r in t)null==n[r]&&(n[r]=t[r])}),n},w.clone=function(n){return w.isObject(n)?w.isArray(n)?n.slice():w.extend({},n):n},w.tap=function(n,t){return t(n),n};var I=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 w&&(n=n._wrapped),t instanceof w&&(t=t._wrapped);var u=l.call(n);if(u!=l.call(t))return!1;switch(u){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;case"[object RegExp]":return n.source==t.source&&n.global==t.global&&n.multiline==t.multiline&&n.ignoreCase==t.ignoreCase}if("object"!=typeof n||"object"!=typeof t)return!1;for(var i=r.length;i--;)if(r[i]==n)return e[i]==t;r.push(n),e.push(t);var a=0,o=!0;if("[object Array]"==u){if(a=n.length,o=a==t.length)for(;a--&&(o=I(n[a],t[a],r,e)););}else{var c=n.constructor,f=t.constructor;if(c!==f&&!(w.isFunction(c)&&c instanceof c&&w.isFunction(f)&&f instanceof f))return!1;for(var s in n)if(w.has(n,s)&&(a++,!(o=w.has(t,s)&&I(n[s],t[s],r,e))))break;if(o){for(s in t)if(w.has(t,s)&&!a--)break;o=!a}}return r.pop(),e.pop(),o};w.isEqual=function(n,t){return I(n,t,[],[])},w.isEmpty=function(n){if(null==n)return!0;if(w.isArray(n)||w.isString(n))return 0===n.length;for(var t in n)if(w.has(n,t))return!1;return!0},w.isElement=function(n){return!(!n||1!==n.nodeType)},w.isArray=x||function(n){return"[object Array]"==l.call(n)},w.isObject=function(n){return n===Object(n)},A(["Arguments","Function","String","Number","Date","RegExp"],function(n){w["is"+n]=function(t){return l.call(t)=="[object "+n+"]"}}),w.isArguments(arguments)||(w.isArguments=function(n){return!(!n||!w.has(n,"callee"))}),"function"!=typeof/./&&(w.isFunction=function(n){return"function"==typeof n}),w.isFinite=function(n){return isFinite(n)&&!isNaN(parseFloat(n))},w.isNaN=function(n){return w.isNumber(n)&&n!=+n},w.isBoolean=function(n){return n===!0||n===!1||"[object Boolean]"==l.call(n)},w.isNull=function(n){return null===n},w.isUndefined=function(n){return n===void 0},w.has=function(n,t){return f.call(n,t)},w.noConflict=function(){return n._=t,this},w.identity=function(n){return n},w.times=function(n,t,r){for(var e=Array(n),u=0;n>u;u++)e[u]=t.call(r,u);return e},w.random=function(n,t){return null==t&&(t=n,n=0),n+Math.floor(Math.random()*(t-n+1))};var M={escape:{"&":"&","<":"<",">":">",'"':""","'":"'","/":"/"}};M.unescape=w.invert(M.escape);var S={escape:RegExp("["+w.keys(M.escape).join("")+"]","g"),unescape:RegExp("("+w.keys(M.unescape).join("|")+")","g")};w.each(["escape","unescape"],function(n){w[n]=function(t){return null==t?"":(""+t).replace(S[n],function(t){return M[n][t]})}}),w.result=function(n,t){if(null==n)return null;var r=n[t];return w.isFunction(r)?r.call(n):r},w.mixin=function(n){A(w.functions(n),function(t){var r=w[t]=n[t];w.prototype[t]=function(){var n=[this._wrapped];return a.apply(n,arguments),D.call(this,r.apply(w,n))}})};var N=0;w.uniqueId=function(n){var t=++N+"";return n?n+t:t},w.templateSettings={evaluate:/<%([\s\S]+?)%>/g,interpolate:/<%=([\s\S]+?)%>/g,escape:/<%-([\s\S]+?)%>/g};var T=/(.)^/,q={"'":"'","\\":"\\","\r":"r","\n":"n"," ":"t","\u2028":"u2028","\u2029":"u2029"},B=/\\|'|\r|\n|\t|\u2028|\u2029/g;w.template=function(n,t,r){var e;r=w.defaults({},r,w.templateSettings);var u=RegExp([(r.escape||T).source,(r.interpolate||T).source,(r.evaluate||T).source].join("|")+"|$","g"),i=0,a="__p+='";n.replace(u,function(t,r,e,u,o){return a+=n.slice(i,o).replace(B,function(n){return"\\"+q[n]}),r&&(a+="'+\n((__t=("+r+"))==null?'':_.escape(__t))+\n'"),e&&(a+="'+\n((__t=("+e+"))==null?'':__t)+\n'"),u&&(a+="';\n"+u+"\n__p+='"),i=o+t.length,t}),a+="';\n",r.variable||(a="with(obj||{}){\n"+a+"}\n"),a="var __t,__p='',__j=Array.prototype.join,"+"print=function(){__p+=__j.call(arguments,'');};\n"+a+"return __p;\n";try{e=Function(r.variable||"obj","_",a)}catch(o){throw o.source=a,o}if(t)return e(t,w);var c=function(n){return e.call(this,n,w)};return c.source="function("+(r.variable||"obj")+"){\n"+a+"}",c},w.chain=function(n){return w(n).chain()};var D=function(n){return this._chain?w(n).chain():n};w.mixin(w),A(["pop","push","reverse","shift","sort","splice","unshift"],function(n){var t=e[n];w.prototype[n]=function(){var r=this._wrapped;return t.apply(r,arguments),"shift"!=n&&"splice"!=n||0!==r.length||delete r[0],D.call(this,r)}}),A(["concat","join","slice"],function(n){var t=e[n];w.prototype[n]=function(){return D.call(this,t.apply(this._wrapped,arguments))}}),w.extend(w.prototype,{chain:function(){return this._chain=!0,this},value:function(){return this._wrapped}})}).call(this); \ No newline at end of file diff --git a/vendor/worker-fileupload.js b/vendor/worker-fileupload.js deleted file mode 100644 index 8289be9..0000000 --- a/vendor/worker-fileupload.js +++ /dev/null @@ -1,359 +0,0 @@ -/* - * Copyright (c) 2013 Francisco Salavert (ICM-CIPF) - * Copyright (c) 2013 Ruben Sanchez (ICM-CIPF) - * Copyright (c) 2013 Ignacio Medina (ICM-CIPF) - * - * This file is part of JS Common Libs. - * - * JS Common Libs is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 2 of the License, or - * (at your option) any later version. - * - * JS Common Libs is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with JS Common Libs. If not, see . - */ - - -var res = {finished:false}; -var resumeInfo = {}; -var host = ''; -var accountId = ''; -var bucketId = ''; -var objectId = ''; -var sessionId = ''; - - -function getTime(){ - return Date.now()/1000; -} - -function updateProgress(evt) { - res+=" updateProgress"; - if (evt.lengthComputable) { - var percentComplete = evt.loaded / evt.total; - } else { - // Unable to compute progress information since the total size is unknown - } -} - -function transferComplete(evt) { -// res.info+=" transferComplete"; -} - -function transferFailed(evt) { -// res.info+=" transferFailed"; -} - -function transferCanceled(evt) { -// res.info+=" transferCanceled"; -} - -function getUrl(){ - return host+'/account/'+accountId+'/storage/'+bucketId+'/'+objectId+'/chunk_upload?sessionid='+sessionId; -} - -function upload(formData) { - var xhr = new XMLHttpRequest(); - //The upload events are fired on the XMLHttpRequest.upload object - xhr.upload.addEventListener("progress", updateProgress, false); - xhr.upload.addEventListener("load", transferComplete, false); - xhr.upload.addEventListener("error", transferFailed, false); - xhr.upload.addEventListener("abort", transferCanceled, false); - // retrieve data unprocessed as a binary string - -// xhr.setRequestHeader("Content-type", "application/json"); -// xhr.overrideMimeType("text/plain; charset=x-user-defined"); - - xhr.open('POST', getUrl(), false);//false indicates sync call - xhr.send(formData); -} - -function getResumeInfo(formData) { - var xhr = new XMLHttpRequest(); - xhr.open('POST', getUrl(), false);//false indicates sync call - xhr.send(formData); - return xhr.responseText; -// if (request.status === 200) { -// console.log(request.responseText); -// } -} - - -function checkChunk(id, size) { - if(typeof resumeInfo[id] == 'undefined'){ - return false; - }else if(resumeInfo[id].size != size /*|| resumeInfo[id].hash != hash*/){ - return false; - } - return true; -} - -self.onmessage = function(e) { - host = e.data.host; - accountId = e.data.accountId; - bucketId = e.data.bucketId; - sessionId = e.data.sessionId; - objectId = e.data.objectId; - - var fileFormat = e.data.fileFormat; - var file = e.data.file; - var resume = e.data.resume; - - const BYTES_PER_CHUNK = 7*1024*1024; - const SIZE = file.size; - const NUM_CHUNKS = Math.ceil(SIZE/BYTES_PER_CHUNK); - var start = 0; - var end = BYTES_PER_CHUNK; - var chunkId = 0; - res.total = NUM_CHUNKS; - - if(resume){ - var resumeFormData = new FormData(); - resumeFormData.append('filename', file.name); - resumeFormData.append('object_id', objectId); - resumeFormData.append('bucket_id', bucketId); - resumeFormData.append('resume_upload', 'true'); - var str = getResumeInfo(resumeFormData); - resumeInfo = JSON.parse(str); - } - - var t; - while (start < SIZE) { - t = getTime(); - var chunkBlob = file.slice(start, end); - res.chunkId = chunkId; - if(checkChunk(chunkId, chunkBlob.size) == false){ - var formData = new FormData(); - formData.append('chunk_content', chunkBlob); - formData.append('chunk_id', chunkId); - formData.append('chunk_size', chunkBlob.size); -// formData.append('chunk_hash', hash); - formData.append("filename", file.name); - formData.append('object_id', objectId); - formData.append('bucket_id', bucketId); -// formData.append('chunk_gzip', ); - /**/ - if(chunkId == (NUM_CHUNKS-1)){ - formData.append("last_chunk", true); - formData.append("fileFormat", fileFormat); - formData.append("total_size", SIZE); - } - upload(formData); - } - - res.start = start; - res.end = end; - res.t = getTime()-t; - self.postMessage(res); - - start = end; - end = start + BYTES_PER_CHUNK; - chunkId++; - } - - res.finished = true; - self.postMessage(res); -}; - - - - -//fr.onload = function(evt) { -// $.ajax({ -// type: "POST", -// url: "http://fsalavert:8080/opencga/rest/subir", -// data: {a:evt.target.result}, -// success: function(data){console.log(data);}, -// error: function(data){console.log(data);}, -// }); -// -//}; - -//fr = new FileReader(); -//x = f.slice(100,200) -//fr.readAsBinaryString(x) - - - - - -//var file = [], p = true; -//function upload(blobOrFile) { -// var xhr = new XMLHttpRequest(); -// xhr.open('POST', '/server', false); -// xhr.onload = function(e) { -// }; -// xhr.send(blobOrFile); -//} -// -//function process() { -// for (var j = 0; j >>2]|=(q[b>>>2]>>>24-8*(b%4)&255)<<24-8*((d+b)%4);else if(65535>>2]=q[b>>>2];else c.push.apply(c,q);this.sigBytes+=a;return this},clamp:function(){var a=this.words,c=this.sigBytes;a[c>>>2]&=4294967295<< - 32-8*(c%4);a.length=e.ceil(c/4)},clone:function(){var a=f.clone.call(this);a.words=this.words.slice(0);return a},random:function(a){for(var c=[],b=0;b>>2]>>>24-8*(d%4)&255;b.push((f>>>4).toString(16));b.push((f&15).toString(16))}return b.join("")},parse:function(a){for(var c=a.length,b=[],d=0;d>>3]|=parseInt(a.substr(d, - 2),16)<<24-4*(d%8);return new n.init(b,c/2)}},g=b.Latin1={stringify:function(a){var c=a.words;a=a.sigBytes;for(var b=[],d=0;d>>2]>>>24-8*(d%4)&255));return b.join("")},parse:function(a){for(var c=a.length,b=[],d=0;d>>2]|=(a.charCodeAt(d)&255)<<24-8*(d%4);return new n.init(b,c)}},r=b.Utf8={stringify:function(a){try{return decodeURIComponent(escape(g.stringify(a)))}catch(c){throw Error("Malformed UTF-8 data");}},parse:function(a){return g.parse(unescape(encodeURIComponent(a)))}}, - k=j.BufferedBlockAlgorithm=f.extend({reset:function(){this._data=new n.init;this._nDataBytes=0},_append:function(a){"string"==typeof a&&(a=r.parse(a));this._data.concat(a);this._nDataBytes+=a.sigBytes},_process:function(a){var c=this._data,b=c.words,d=c.sigBytes,f=this.blockSize,h=d/(4*f),h=a?e.ceil(h):e.max((h|0)-this._minBufferSize,0);a=h*f;d=e.min(4*a,d);if(a){for(var g=0;ga;a++){if(16>a)l[a]=f[n+a]|0;else{var c=l[a-3]^l[a-8]^l[a-14]^l[a-16];l[a]=c<<1|c>>>31}c=(h<<5|h>>>27)+j+l[a];c=20>a?c+((g&e|~g&k)+1518500249):40>a?c+((g^e^k)+1859775393):60>a?c+((g&e|g&k|e&k)-1894007588):c+((g^e^ - k)-899497514);j=k;k=e;e=g<<30|g>>>2;g=h;h=c}b[0]=b[0]+h|0;b[1]=b[1]+g|0;b[2]=b[2]+e|0;b[3]=b[3]+k|0;b[4]=b[4]+j|0},_doFinalize:function(){var f=this._data,e=f.words,b=8*this._nDataBytes,h=8*f.sigBytes;e[h>>>5]|=128<<24-h%32;e[(h+64>>>9<<4)+14]=Math.floor(b/4294967296);e[(h+64>>>9<<4)+15]=b;f.sigBytes=4*e.length;this._process();return this._hash},clone:function(){var e=j.clone.call(this);e._hash=this._hash.clone();return e}});e.SHA1=j._createHelper(m);e.HmacSHA1=j._createHmacHelper(m)})(); \ No newline at end of file From 227e5ecaf63b807723743b1aa86052c9e955a520 Mon Sep 17 00:00:00 2001 From: Francisco Salavert Torres Date: Fri, 27 Sep 2013 18:29:22 +0200 Subject: [PATCH 07/61] jsorolla updates --- lib/jsorolla | 2 +- package.json | 30 +++++++++++++++--------------- 2 files changed, 16 insertions(+), 16 deletions(-) diff --git a/lib/jsorolla b/lib/jsorolla index 48d7dbe..9e441cb 160000 --- a/lib/jsorolla +++ b/lib/jsorolla @@ -1 +1 @@ -Subproject commit 48d7dbe91019fd6f5027417a93cb99066fe40a2a +Subproject commit 9e441cbc12a248b8f5131324be6df6801eb2977a diff --git a/package.json b/package.json index a3e0082..aa9f5b4 100644 --- a/package.json +++ b/package.json @@ -1,17 +1,17 @@ { - "name": "GenomeMaps", - "version": "3.1.1", - "devDependencies": { - "grunt": "~0.4.1", - "grunt-contrib-concat": "~0.3.0", - "grunt-contrib-uglify": "~0.2.2", - "grunt-contrib-copy": "~0.4.1", - "grunt-contrib-clean": "~0.4.1", - "grunt-contrib-watch": "~0.5.3", - "js-beautify": "~1.3.4", - "grunt-html-build": "0.2.0", - "grunt-curl": "~1.1.1", - "grunt-contrib-rename": "0.0.3", - "grunt-hub": "~0.5.0" - } + "name": "GenomeMaps", + "version": "3.1.1", + "devDependencies": { + "grunt": "~0.4.1", + "grunt-contrib-concat": "~0.3.0", + "grunt-contrib-uglify": "~0.2.2", + "grunt-contrib-copy": "~0.4.1", + "grunt-contrib-clean": "~0.4.1", + "grunt-contrib-watch": "~0.5.3", + "js-beautify": "~1.3.4", + "grunt-html-build": "0.2.0", + "grunt-curl": "~1.1.1", + "grunt-contrib-rename": "0.0.3", + "grunt-hub": "~0.5.0" + } } From 4f9b931f5eb41ccc323b381c331eaabc6cd91363 Mon Sep 17 00:00:00 2001 From: Francisco Salavert Torres Date: Fri, 27 Sep 2013 18:35:24 +0200 Subject: [PATCH 08/61] Gruntfile fix --- Gruntfile.js | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/Gruntfile.js b/Gruntfile.js index dab924f..3b6c6d4 100644 --- a/Gruntfile.js +++ b/Gruntfile.js @@ -139,7 +139,11 @@ module.exports = function (grunt) { grunt.loadNpmTasks('grunt-curl'); grunt.loadNpmTasks('grunt-hub'); + grunt.registerTask('log-deploy', 'Deploy path info', function (version) { + grunt.log.writeln("DEPLOY COMMAND: scp -r build/{version} cafetero@mem16:/httpd/bioinfo/www-apps/genome-maps/"); + }); + // Default task. - grunt.registerTask('default', ['clean', 'concat', 'uglify', 'hub:all', 'copy', 'htmlbuild', 'rename:html']); + grunt.registerTask('default', ['clean', 'concat', 'uglify', 'hub:all', 'copy', 'htmlbuild', 'rename:html', 'log-deploy']); }; From 4da661938469e3f02daae3542695e0c044289e74 Mon Sep 17 00:00:00 2001 From: Francisco Salavert Torres Date: Sun, 29 Sep 2013 11:49:10 +0200 Subject: [PATCH 09/61] jsorolla updates --- lib/jsorolla | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/jsorolla b/lib/jsorolla index 9e441cb..027e9a3 160000 --- a/lib/jsorolla +++ b/lib/jsorolla @@ -1 +1 @@ -Subproject commit 9e441cbc12a248b8f5131324be6df6801eb2977a +Subproject commit 027e9a39788c919afc89408f9814b4e399583e19 From 5f4e0b4de8eb5d010b748db25c502720fefae058 Mon Sep 17 00:00:00 2001 From: Francisco Salavert Torres Date: Sun, 29 Sep 2013 14:19:09 +0200 Subject: [PATCH 10/61] jsorolla updated --- lib/jsorolla | 2 +- src/genome-maps.js | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/lib/jsorolla b/lib/jsorolla index 027e9a3..9f73226 160000 --- a/lib/jsorolla +++ b/lib/jsorolla @@ -1 +1 @@ -Subproject commit 027e9a39788c919afc89408f9814b4e399583e19 +Subproject commit 9f73226905f73a2126b659074054ddd4b53bdc6d diff --git a/src/genome-maps.js b/src/genome-maps.js index 9a5ce46..8fa8909 100644 --- a/src/genome-maps.js +++ b/src/genome-maps.js @@ -1400,7 +1400,7 @@ GenomeMaps.prototype.addTrack = function (trackType, trackTitle, object, host) { title: 'Gene', histogramZoom: 15, transcriptZoom: 50, - height: 160, + height: 100, visibleRange: {start: 0, end: 100}, featureTypes: FEATURE_TYPES, From aa2669402c11351b0066393522898a298f4d7c72 Mon Sep 17 00:00:00 2001 From: Francisco Salavert Torres Date: Sun, 29 Sep 2013 20:52:45 +0200 Subject: [PATCH 11/61] chromsome and karyotype starts hidden --- src/genome-maps.js | 5 ++++- src/gm-navigation-bar.js | 4 ++-- 2 files changed, 6 insertions(+), 3 deletions(-) diff --git a/src/genome-maps.js b/src/genome-maps.js index 8fa8909..e5294fd 100644 --- a/src/genome-maps.js +++ b/src/genome-maps.js @@ -317,7 +317,6 @@ GenomeMaps.prototype = { }); genomeViewer.draw(); - var renderer = new FeatureRenderer('gene'); renderer.on({ 'feature:click': function (event) { @@ -355,6 +354,10 @@ GenomeMaps.prototype = { genomeViewer.addOverviewTrack(gene); + genomeViewer.chromosomePanel.hide(); + genomeViewer.karyotypePanel.hide(); + + return genomeViewer; }, _createNavigationBar: function (targetId) { diff --git a/src/gm-navigation-bar.js b/src/gm-navigation-bar.js index f58aa26..2c87961 100644 --- a/src/gm-navigation-bar.js +++ b/src/gm-navigation-bar.js @@ -98,7 +98,7 @@ GmNavigationBar.prototype = { tooltip: 'Show karyotype', iconCls: 'ocb-icon-karyotype', enableToggle: true, - pressed: true, + pressed: false, toggleHandler: function () { _this.trigger('karyotype-button:change', {selected: this.pressed, sender: _this}); } @@ -107,7 +107,7 @@ GmNavigationBar.prototype = { tooltip: 'Show chromosome', iconCls: 'ocb-icon-chromosome', enableToggle: true, - pressed: true, + pressed: false, toggleHandler: function () { _this.trigger('chromosome-button:change', {selected: this.pressed, sender: _this}); } From 64757925ed2aee008c5968533e14dd786e08d19b Mon Sep 17 00:00:00 2001 From: Francisco Salavert Torres Date: Tue, 1 Oct 2013 10:40:46 +0200 Subject: [PATCH 12/61] updated genome-maps.html --- lib/jsorolla | 2 +- src/genome-maps.html | 5 +++++ 2 files changed, 6 insertions(+), 1 deletion(-) diff --git a/lib/jsorolla b/lib/jsorolla index 9f73226..2779581 160000 --- a/lib/jsorolla +++ b/lib/jsorolla @@ -1 +1 @@ -Subproject commit 9f73226905f73a2126b659074054ddd4b53bdc6d +Subproject commit 2779581e72c863e925067a614390ad094cd36fb0 diff --git a/src/genome-maps.html b/src/genome-maps.html index 1d46932..d93907d 100755 --- a/src/genome-maps.html +++ b/src/genome-maps.html @@ -86,6 +86,11 @@ + + + + + From e62ea217b11067897c025fe053e35f1652f73d5a Mon Sep 17 00:00:00 2001 From: Francisco Salavert Torres Date: Wed, 2 Oct 2013 18:05:43 +0200 Subject: [PATCH 13/61] jsorolla changes --- lib/jsorolla | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/jsorolla b/lib/jsorolla index 2779581..966ec8d 160000 --- a/lib/jsorolla +++ b/lib/jsorolla @@ -1 +1 @@ -Subproject commit 2779581e72c863e925067a614390ad094cd36fb0 +Subproject commit 966ec8df04a970bd8cdb49aa791c32610c821fcd From edf685e87747cb5d1d00e41e833aa2fab004ccf1 Mon Sep 17 00:00:00 2001 From: Francisco Salavert Torres Date: Thu, 10 Oct 2013 16:17:06 +0200 Subject: [PATCH 14/61] tracks work in progress, jsorolla updates --- lib/jsorolla | 2 +- src/genome-maps.html | 2 + src/genome-maps.js | 154 +++++++++++++++++++++++++++++-------------- 3 files changed, 108 insertions(+), 50 deletions(-) diff --git a/lib/jsorolla b/lib/jsorolla index 966ec8d..78e2ff6 160000 --- a/lib/jsorolla +++ b/lib/jsorolla @@ -1 +1 @@ -Subproject commit 966ec8df04a970bd8cdb49aa791c32610c821fcd +Subproject commit 78e2ff6374f28495d705e1838c9d0170829ec9a9 diff --git a/src/genome-maps.html b/src/genome-maps.html index d93907d..cf9900d 100755 --- a/src/genome-maps.html +++ b/src/genome-maps.html @@ -88,6 +88,7 @@ + @@ -120,6 +121,7 @@ + diff --git a/src/genome-maps.js b/src/genome-maps.js index e5294fd..406c8fa 100644 --- a/src/genome-maps.js +++ b/src/genome-maps.js @@ -209,14 +209,14 @@ GenomeMaps.prototype = { /*Load example account info*/ - OpencgaManager.getAccountInfo({ - accountId:'example', - sessionId:'example', - lastActivity:'example', - success:function(data){ - _this._loadOpencgaTracks(data, 'example'); - } - }); +// OpencgaManager.getAccountInfo({ +// accountId:'example', +// sessionId:'example', +// lastActivity:'example', +// success:function(data){ +// _this._loadOpencgaTracks(data, 'example'); +// } +// }); /**/ /*****************************************/ @@ -1613,32 +1613,33 @@ GenomeMaps.prototype.addTrack = function (trackType, trackTitle, object, host) { }); break; case "miRNA targets": - var miRNATrack = new TrackData(id, { - adapter: new CellBaseAdapter({ - category: "genomic", - subCategory: "region", - resource: 'regulatory', - params: { - type: 'mirna_target' - }, - species: this.genomeViewer.species, - featureCache: { - gzip: true, - chunkSize: 10000 - } - }) - }); - this.genomeViewer.addTrack(miRNATrack, { - id: id, - type: trackType, - title: trackTitle, - featuresRender: "MultiFeatureRender", - histogramZoom: 0, - height: 150, - visibleRange: {start: 0, end: 100}, - featureTypes: FEATURE_TYPES - }); - break; + console.log("TODO : miRNA targets ") +// var miRNATrack = new TrackData(id, { +// adapter: new CellBaseAdapter({ +// category: "genomic", +// subCategory: "region", +// resource: 'regulatory', +// params: { +// type: 'mirna_target' +// }, +// species: this.genomeViewer.species, +// featureCache: { +// gzip: true, +// chunkSize: 10000 +// } +// }) +// }); +// this.genomeViewer.addTrack(miRNATrack, { +// id: id, +// type: trackType, +// title: trackTitle, +// featuresRender: "MultiFeatureRender", +// histogramZoom: 0, +// height: 150, +// visibleRange: {start: 0, end: 100}, +// featureTypes: FEATURE_TYPES +// }); +// break; case "TFBS": var tfbsTrack = new FeatureTrack({ @@ -1906,7 +1907,14 @@ GenomeMaps.prototype.addTrack = function (trackType, trackTitle, object, host) { options: {}, featureConfig: FEATURE_CONFIG.vcf }); - var renderer = new FeatureRenderer('vcf'); +// var renderer = new FeatureRenderer('vcf'); +// renderer.on({ +// 'feature:click': function (event) { +// +// var vcfInfo = new VCFVariantInfoWidget(null, _this.genomeViewer.species, {adapter: adapter}).draw(event); +// } +// }); + var renderer = new VcfMultisampleRenderer('vcf'); renderer.on({ 'feature:click': function (event) { @@ -1920,7 +1928,9 @@ GenomeMaps.prototype.addTrack = function (trackType, trackTitle, object, host) { title: trackTitle, histogramZoom: 60, height: 150, + autoHeight:false, visibleRange: {start: 0, end: 100}, + labelZoom: 100, renderer: renderer, dataAdapter: adapter }); @@ -2004,8 +2014,63 @@ GenomeMaps.prototype.addFileTrack = function (text, updateActiveTracksPanel) { GenomeMaps.prototype.addDASTrack = function (sourceName, sourceUrl) { var id = this.genTrackId(); - var dasTrack = new TrackData("das", { - adapter: new DasAdapter({ +// var dasTrack = new TrackData("das", { +// adapter: new DasAdapter({ +// url: sourceUrl, +// species: this.genomeViewer.species, +// featureCache: { +// gzip: false, +// chunkSize: 10000 +// } +// }) +// }); +// this.genomeViewer.addTrack(dasTrack, { +// id: id, +// title: sourceName, +// type: "das", +// featuresRender: "MultiFeatureRender", +// height: 150, +// visibleRange: {start: 50, end: 100}, +// settings: { +// height: 10 +// } +// }); +// return id; + + + + var dasTrack = new FeatureTrack({ + targetId: null, + id: id, + title: sourceName, + histogramZoom: 0, + labelZoom: 80, + height: 120, + visibleRange: {start: 0, end: 100}, + renderer: new FeatureRenderer({ + label: function (f) { + return f.chromosome + ":" + f.start + "-" + f.end; + }, + tooltipTitle: function (f) { + return 'tooltipTitle'; + }, + tooltipText: function (f) { + return 'tooltipText'; + }, + color: 'lightblue', + infoWidgetId: "id", + height: 8, + histogramColor: "orange", + handlers: { + 'feature:mouseover': function (e) { + console.log(e) + }, + 'feature:click': function (event) { + console.log(e) + } + } + }), + dataAdapter: new DasAdapter({ url: sourceUrl, species: this.genomeViewer.species, featureCache: { @@ -2014,18 +2079,9 @@ GenomeMaps.prototype.addDASTrack = function (sourceName, sourceUrl) { } }) }); - this.genomeViewer.addTrack(dasTrack, { - id: id, - title: sourceName, - type: "das", - featuresRender: "MultiFeatureRender", - height: 150, - visibleRange: {start: 50, end: 100}, - settings: { - height: 10 - } - }); - return id; + + this.genomeViewer.addTrack(dasTrack); + }; From 715b7a0c1218d56bdd31d35490393e08a859295e Mon Sep 17 00:00:00 2001 From: Francisco Salavert Torres Date: Fri, 11 Oct 2013 10:47:03 +0200 Subject: [PATCH 15/61] Grunt config added version to deploy command --- Gruntfile.js | 2 +- lib/jsorolla | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/Gruntfile.js b/Gruntfile.js index 3b6c6d4..b23b9fc 100644 --- a/Gruntfile.js +++ b/Gruntfile.js @@ -140,7 +140,7 @@ module.exports = function (grunt) { grunt.loadNpmTasks('grunt-hub'); grunt.registerTask('log-deploy', 'Deploy path info', function (version) { - grunt.log.writeln("DEPLOY COMMAND: scp -r build/{version} cafetero@mem16:/httpd/bioinfo/www-apps/genome-maps/"); + grunt.log.writeln("DEPLOY COMMAND: scp -r build/"+grunt.config.data.meta.version+" cafetero@mem16:/httpd/bioinfo/www-apps/genome-maps/"); }); // Default task. diff --git a/lib/jsorolla b/lib/jsorolla index 78e2ff6..4160670 160000 --- a/lib/jsorolla +++ b/lib/jsorolla @@ -1 +1 @@ -Subproject commit 78e2ff6374f28495d705e1838c9d0170829ec9a9 +Subproject commit 416067069c0117eb1e04dc292d155b9d6349a02c From 4247624f1748537672a7f2b7223663bbe1c9f85e Mon Sep 17 00:00:00 2001 From: imedina Date: Mon, 14 Oct 2013 17:11:04 +0200 Subject: [PATCH 16/61] jsorolla: library updated --- lib/jsorolla | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/jsorolla b/lib/jsorolla index 9e441cb..5acbd37 160000 --- a/lib/jsorolla +++ b/lib/jsorolla @@ -1 +1 @@ -Subproject commit 9e441cbc12a248b8f5131324be6df6801eb2977a +Subproject commit 5acbd3724307da8d0775f83ecaa4620aaa284ae1 From bed43a86ebcd0a7b26a79cb5507462bfd131ca2c Mon Sep 17 00:00:00 2001 From: fsalavert Date: Tue, 15 Oct 2013 11:35:58 +0200 Subject: [PATCH 17/61] genomeViewer changes --- lib/jsorolla | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/jsorolla b/lib/jsorolla index 78e2ff6..37b4c12 160000 --- a/lib/jsorolla +++ b/lib/jsorolla @@ -1 +1 @@ -Subproject commit 78e2ff6374f28495d705e1838c9d0170829ec9a9 +Subproject commit 37b4c124405a3d2cfb53f4fc53dcc797970e5291 From 3ea39f870748815f0378b4b2d3f7d165a2a31a67 Mon Sep 17 00:00:00 2001 From: frasator Date: Tue, 15 Oct 2013 15:21:35 +0200 Subject: [PATCH 18/61] url-widget events fix, addDasTrack method fixed --- Gruntfile.js | 1 + src/genome-maps.html | 3 +++ src/genome-maps.js | 55 +++++++++++++--------------------------- src/gm-navigation-bar.js | 29 ++++++++++----------- 4 files changed, 35 insertions(+), 53 deletions(-) diff --git a/Gruntfile.js b/Gruntfile.js index b23b9fc..dc3021e 100644 --- a/Gruntfile.js +++ b/Gruntfile.js @@ -88,6 +88,7 @@ module.exports = function (grunt) { 'build/<%= meta.version %>/vendor/jquery.sha1*.js', 'build/<%= meta.version %>/vendor/jquery.qtip*.js', 'build/<%= meta.version %>/vendor/rawdeflate*.js', + 'build/<%= meta.version %>/vendor/xml2json.js', 'build/<%= meta.version %>/vendor/jquery-ui-1.10.3*/js/jquery-ui*min.js' ], diff --git a/src/genome-maps.html b/src/genome-maps.html index cf9900d..225a57f 100755 --- a/src/genome-maps.html +++ b/src/genome-maps.html @@ -34,6 +34,7 @@ + @@ -104,8 +105,10 @@ + + diff --git a/src/genome-maps.js b/src/genome-maps.js index 406c8fa..22f73d8 100644 --- a/src/genome-maps.js +++ b/src/genome-maps.js @@ -262,7 +262,7 @@ GenomeMaps.prototype = { version: this.version, suiteId: this.suiteId, accountData: this.accountData, - chunkedUpload:false, + chunkedUpload: false, handlers: { 'login': function (event) { Ext.example.msg('Welcome', 'You logged in'); @@ -341,8 +341,8 @@ GenomeMaps.prototype = { category: "genomic", subCategory: "region", resource: "gene", - params:{ - exclude:'transcripts' + params: { + exclude: 'transcripts' }, species: genomeViewer.species, featureCache: { @@ -530,8 +530,8 @@ GenomeMaps.prototype.getRegionByFeature = function (name, feature) { subCategory: feature, query: name, resource: 'info', - params:{ - include:'chromosome,start,end' + params: { + include: 'chromosome,start,end' }, async: false }); @@ -1373,10 +1373,14 @@ GenomeMaps.prototype._createTracksTreePanel = function (args) { }); } if (idText == "das") { - var urlWidget = new UrlWidget({title: 'Add a DAS track'}); - urlWidget.onAdd.addEventListener(function (sender, event) { - var id = _this.addDASTrack(event.name, event.url); - updateActiveTracksPanel('das', event.name + "-" + id, id, true); + var urlWidget = new UrlWidget({ + title: 'Add a DAS track', + handlers: { + 'addButton:click': function (event) { + var id = _this.addDASTrack(event.name, event.url); + updateActiveTracksPanel('das', event.name + "-" + id, id, true); + } + } }); urlWidget.draw(); } @@ -1613,7 +1617,7 @@ GenomeMaps.prototype.addTrack = function (trackType, trackTitle, object, host) { }); break; case "miRNA targets": - console.log("TODO : miRNA targets ") + console.log("TODO : miRNA targets ") // var miRNATrack = new TrackData(id, { // adapter: new CellBaseAdapter({ // category: "genomic", @@ -1928,7 +1932,7 @@ GenomeMaps.prototype.addTrack = function (trackType, trackTitle, object, host) { title: trackTitle, histogramZoom: 60, height: 150, - autoHeight:false, + autoHeight: false, visibleRange: {start: 0, end: 100}, labelZoom: 100, renderer: renderer, @@ -2038,38 +2042,15 @@ GenomeMaps.prototype.addDASTrack = function (sourceName, sourceUrl) { // return id; - var dasTrack = new FeatureTrack({ targetId: null, id: id, title: sourceName, histogramZoom: 0, labelZoom: 80, - height: 120, - visibleRange: {start: 0, end: 100}, - renderer: new FeatureRenderer({ - label: function (f) { - return f.chromosome + ":" + f.start + "-" + f.end; - }, - tooltipTitle: function (f) { - return 'tooltipTitle'; - }, - tooltipText: function (f) { - return 'tooltipText'; - }, - color: 'lightblue', - infoWidgetId: "id", - height: 8, - histogramColor: "orange", - handlers: { - 'feature:mouseover': function (e) { - console.log(e) - }, - 'feature:click': function (event) { - console.log(e) - } - } - }), + height: 150, + visibleRange: {start: 50, end: 100}, + renderer: new FeatureRenderer('das'), dataAdapter: new DasAdapter({ url: sourceUrl, species: this.genomeViewer.species, diff --git a/src/gm-navigation-bar.js b/src/gm-navigation-bar.js index 2c87961..6b6522f 100644 --- a/src/gm-navigation-bar.js +++ b/src/gm-navigation-bar.js @@ -482,8 +482,8 @@ GmNavigationBar.prototype = { subCategory: 'gene', query: featureName, resource: 'info', - params:{ - include:'chromosome,start,end' + params: { + include: 'chromosome,start,end' }, success: function (data) { var feat = data.response[0].result[0]; @@ -582,21 +582,23 @@ GmNavigationBar.prototype = { var searchResults = Ext.create('Ext.data.Store', { fields: ["xrefId", "displayId", "description"], - autoLoad: false + data: [ + {"xrefId": "AL", "displayId": "Alabama", "description": "Alabama"} + ] }); console.log(searchResults) - var searchCombo = Ext.create('Ext.form.field.ComboBox', { + var searchCombo = Ext.create('Ext.form.ComboBox', { id: this.id + '-quick-search', + fieldLabel: 'Search:', + store: searchResults, + queryMode: 'local', displayField: 'displayId', valueField: 'displayId', emptyText: 'gene, snp, ...', hideTrigger: true, - fieldLabel: 'Search:', labelWidth: 40, width: 150, - store: searchResults, - queryMode: 'local', typeAhead: true, minChars: 3, autoSelect: false, @@ -611,9 +613,9 @@ GmNavigationBar.prototype = { } if (value && value.length > min) { CellBaseManager.get({ - host:'http://ws.bioinfo.cipf.es/cellbase/rest', - version:'latest', - species: Utils.getSpeciesCode(_this.species.text).substring(0,3), + host: 'http://ws.bioinfo.cipf.es/cellbase/rest', + version: 'latest', + species: Utils.getSpeciesCode(_this.species.text).substring(0, 3), category: 'feature', subCategory: 'id', query: this.getValue(), @@ -632,12 +634,7 @@ GmNavigationBar.prototype = { // _this._handleGmNavigationBar('GoToGene'); // } // } - }, - tpl: Ext.create('Ext.XTemplate', - '', - '
{displayId} ({displayId})
', - '
' - ) + } }); return searchCombo; }, From ada75857cb2164b8a47885d2147450d858074531 Mon Sep 17 00:00:00 2001 From: frasator Date: Tue, 15 Oct 2013 15:23:31 +0200 Subject: [PATCH 19/61] jsorolla fixes --- lib/jsorolla | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/jsorolla b/lib/jsorolla index 37b4c12..9e73ac2 160000 --- a/lib/jsorolla +++ b/lib/jsorolla @@ -1 +1 @@ -Subproject commit 37b4c124405a3d2cfb53f4fc53dcc797970e5291 +Subproject commit 9e73ac24d51a068e1d62d51059e7155c310ee940 From b613d9b60f8a8cc0d7c23d3065a859c300c08b10 Mon Sep 17 00:00:00 2001 From: frasator Date: Tue, 15 Oct 2013 17:03:06 +0200 Subject: [PATCH 20/61] added some jsorolla dependencies --- lib/jsorolla | 2 +- src/genome-maps.html | 5 +++++ src/genome-maps.js | 4 ++-- 3 files changed, 8 insertions(+), 3 deletions(-) diff --git a/lib/jsorolla b/lib/jsorolla index 9e73ac2..09a635f 160000 --- a/lib/jsorolla +++ b/lib/jsorolla @@ -1 +1 @@ -Subproject commit 9e73ac24d51a068e1d62d51059e7155c310ee940 +Subproject commit 09a635f29ae078cb067ce5725eee62a4bcf5c883 diff --git a/src/genome-maps.html b/src/genome-maps.html index 225a57f..22f615d 100755 --- a/src/genome-maps.html +++ b/src/genome-maps.html @@ -89,10 +89,13 @@ + + + @@ -109,6 +112,8 @@ + + diff --git a/src/genome-maps.js b/src/genome-maps.js index 22f73d8..7e30147 100644 --- a/src/genome-maps.js +++ b/src/genome-maps.js @@ -1975,7 +1975,7 @@ GenomeMaps.prototype.addFileTrack = function (text, updateActiveTracksPanel) { _this.headerWidget.on('logout', function (sender) { fileWidget.sessionFinished(); }); - fileWidget.onOk.addEventListener(function (sender, event) { + fileWidget.on('okButton:click',function (event) { var id = _this.genTrackId(); var type = text; @@ -1988,7 +1988,7 @@ GenomeMaps.prototype.addFileTrack = function (text, updateActiveTracksPanel) { height: 150, visibleRange: {start: 0, end: 100}, featureTypes: FEATURE_TYPES, - renderer: new FeatureRenderer(FEATURE_TYPES.vcf), + renderer: new FeatureRenderer(text.toLowerCase()), dataAdapter: event.adapter }); From 7aed344c082784ffe6e2f6b0cda8c79cbca32c08 Mon Sep 17 00:00:00 2001 From: frasator Date: Wed, 16 Oct 2013 15:03:10 +0200 Subject: [PATCH 21/61] navigation bar combobox search fix --- lib/jsorolla | 2 +- src/genome-maps.html | 3 +++ src/genome-maps.js | 16 ++++++++-------- src/gm-navigation-bar.js | 2 +- 4 files changed, 13 insertions(+), 10 deletions(-) diff --git a/lib/jsorolla b/lib/jsorolla index 09a635f..6803df7 160000 --- a/lib/jsorolla +++ b/lib/jsorolla @@ -1 +1 @@ -Subproject commit 09a635f29ae078cb067ce5725eee62a4bcf5c883 +Subproject commit 6803df70a5f39fa07aad3142fd2b7009dc71f065 diff --git a/src/genome-maps.html b/src/genome-maps.html index 22f615d..3b0a327 100755 --- a/src/genome-maps.html +++ b/src/genome-maps.html @@ -91,6 +91,7 @@ + @@ -113,7 +114,9 @@ + + diff --git a/src/genome-maps.js b/src/genome-maps.js index 7e30147..ed6d5ca 100644 --- a/src/genome-maps.js +++ b/src/genome-maps.js @@ -209,14 +209,14 @@ GenomeMaps.prototype = { /*Load example account info*/ -// OpencgaManager.getAccountInfo({ -// accountId:'example', -// sessionId:'example', -// lastActivity:'example', -// success:function(data){ -// _this._loadOpencgaTracks(data, 'example'); -// } -// }); + OpencgaManager.getAccountInfo({ + accountId:'example', + sessionId:'example', + lastActivity:'example', + success:function(data){ + _this._loadOpencgaTracks(data, 'example'); + } + }); /**/ /*****************************************/ diff --git a/src/gm-navigation-bar.js b/src/gm-navigation-bar.js index 6b6522f..e723332 100644 --- a/src/gm-navigation-bar.js +++ b/src/gm-navigation-bar.js @@ -587,7 +587,7 @@ GmNavigationBar.prototype = { ] }); - console.log(searchResults) +// console.log(searchResults) var searchCombo = Ext.create('Ext.form.ComboBox', { id: this.id + '-quick-search', fieldLabel: 'Search:', From 66ec783fa3c2e826033ee466c5a9bb045ab99eb0 Mon Sep 17 00:00:00 2001 From: frasator Date: Thu, 17 Oct 2013 09:33:19 +0200 Subject: [PATCH 22/61] changed version number 3.1.3 --- Gruntfile.js | 2 +- src/genome-maps.js | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/Gruntfile.js b/Gruntfile.js index dc3021e..2c77a01 100644 --- a/Gruntfile.js +++ b/Gruntfile.js @@ -5,7 +5,7 @@ module.exports = function (grunt) { grunt.initConfig({ // Metadata. meta: { - version: '3.1.2', + version: '3.1.3', jsorolla: { dir: '/lib/jsorolla/', //genome viewer contains cellbse and utils diff --git a/src/genome-maps.js b/src/genome-maps.js index ed6d5ca..c474d95 100644 --- a/src/genome-maps.js +++ b/src/genome-maps.js @@ -30,7 +30,7 @@ function GenomeMaps(args) { this.suiteId = 9; this.title = 'Genome Maps'; this.description = "Genomic data visualization"; - this.version = " RC1 - 3.1.2"; + this.version = " RC1 - 3.1.3"; this.border = true; this.trackIdCounter = 1; this.resizable = true; From e6db82f1916b4e2d6f92b0c346ae63bfa6880520 Mon Sep 17 00:00:00 2001 From: frasator Date: Thu, 17 Oct 2013 11:41:30 +0200 Subject: [PATCH 23/61] navigation bar fixes --- lib/jsorolla | 2 +- src/genome-maps.js | 3 ++- src/gm-navigation-bar.js | 1 - 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/lib/jsorolla b/lib/jsorolla index 6803df7..c8bc19d 160000 --- a/lib/jsorolla +++ b/lib/jsorolla @@ -1 +1 @@ -Subproject commit 6803df70a5f39fa07aad3142fd2b7009dc71f065 +Subproject commit c8bc19daf407a33080b2ad765ff05a338e5e3c8f diff --git a/src/genome-maps.js b/src/genome-maps.js index c474d95..1a6e1ff 100644 --- a/src/genome-maps.js +++ b/src/genome-maps.js @@ -429,7 +429,8 @@ GenomeMaps.prototype = { _this.genomeViewer.trigger('region:change', event); }, 'autoHeight-button:click': function (event) { - _this.genomeViewer.enableAutoHeight(); +// _this.genomeViewer.enableAutoHeight(); + _this.genomeViewer.updateHeight(); } } }); diff --git a/src/gm-navigation-bar.js b/src/gm-navigation-bar.js index e723332..7c53feb 100644 --- a/src/gm-navigation-bar.js +++ b/src/gm-navigation-bar.js @@ -583,7 +583,6 @@ GmNavigationBar.prototype = { var searchResults = Ext.create('Ext.data.Store', { fields: ["xrefId", "displayId", "description"], data: [ - {"xrefId": "AL", "displayId": "Alabama", "description": "Alabama"} ] }); From 4677a8dafece9bd446a58b05987f3514d565f305 Mon Sep 17 00:00:00 2001 From: frasator Date: Thu, 17 Oct 2013 15:43:08 +0200 Subject: [PATCH 24/61] jsorolla updates --- lib/jsorolla | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/jsorolla b/lib/jsorolla index c8bc19d..92fd5b4 160000 --- a/lib/jsorolla +++ b/lib/jsorolla @@ -1 +1 @@ -Subproject commit c8bc19daf407a33080b2ad765ff05a338e5e3c8f +Subproject commit 92fd5b4ed59119af3ab134d159f6fd253eeade42 From cae3a90ea4d07e279ff880978acf531e7b36ec6d Mon Sep 17 00:00:00 2001 From: frasator Date: Fri, 18 Oct 2013 14:57:20 +0200 Subject: [PATCH 25/61] chunkCache test --- lib/jsorolla | 2 +- src/genome-maps.html | 2 ++ src/gm-config.js | 6 +++--- 3 files changed, 6 insertions(+), 4 deletions(-) diff --git a/lib/jsorolla b/lib/jsorolla index 92fd5b4..a5d4aa6 160000 --- a/lib/jsorolla +++ b/lib/jsorolla @@ -1 +1 @@ -Subproject commit 92fd5b4ed59119af3ab134d159f6fd253eeade42 +Subproject commit a5d4aa687ad92d63ce0488311705ec303921d211 diff --git a/src/genome-maps.html b/src/genome-maps.html index 3b0a327..71e8b68 100755 --- a/src/genome-maps.html +++ b/src/genome-maps.html @@ -103,6 +103,8 @@ + + diff --git a/src/gm-config.js b/src/gm-config.js index 5d2056c..302f1e4 100755 --- a/src/gm-config.js +++ b/src/gm-config.js @@ -236,14 +236,14 @@ var TRACKS = {"group1": [ {"category": "Core", "tracks": [ // {"id":"Cytoband", "disabled":false, "checked":true}, - {"id": "Sequence", "disabled": false, "checked": true}, - {"id": "Gene/Transcript", "disabled": false, "checked": true}, + {"id": "Sequence", "disabled": false, "checked": false}, + {"id": "Gene/Transcript", "disabled": false, "checked": false}, {"id": "CpG islands", "disabled": true, "checked": false} ] }, {"category": "Variation", "tracks": [ - {"id": "SNP", "disabled": false, "checked": true}, + {"id": "SNP", "disabled": false, "checked": false}, {"id": "Mutation", "disabled": true, "checked": false}, {"id": "Structural variation (<20Kb)", "disabled": true, "checked": false}, {"id": "Structural variation (>20Kb)", "disabled": true, "checked": false} From a964e69120b9a20229f308171ba28e71fe0e6aa0 Mon Sep 17 00:00:00 2001 From: imedina Date: Fri, 18 Oct 2013 17:33:23 +0200 Subject: [PATCH 26/61] cache: new GM uses new FeatureChunkCache --- lib/jsorolla | 2 +- src/genome-maps.html | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/lib/jsorolla b/lib/jsorolla index a5d4aa6..43f440e 160000 --- a/lib/jsorolla +++ b/lib/jsorolla @@ -1 +1 @@ -Subproject commit a5d4aa687ad92d63ce0488311705ec303921d211 +Subproject commit 43f440e9e90b0dcf69260409e6625fde000ebf97 diff --git a/src/genome-maps.html b/src/genome-maps.html index 71e8b68..d6eded2 100755 --- a/src/genome-maps.html +++ b/src/genome-maps.html @@ -104,7 +104,7 @@ - + From ae5c2769231aaf39ede56ef82e25b7d45346bb8d Mon Sep 17 00:00:00 2001 From: frasator Date: Fri, 18 Oct 2013 20:20:41 +0200 Subject: [PATCH 27/61] modified region overview track cellbase adapter config --- lib/jsorolla | 2 +- src/genome-maps.js | 3 +-- 2 files changed, 2 insertions(+), 3 deletions(-) diff --git a/lib/jsorolla b/lib/jsorolla index 43f440e..2a14c9f 160000 --- a/lib/jsorolla +++ b/lib/jsorolla @@ -1 +1 @@ -Subproject commit 43f440e9e90b0dcf69260409e6625fde000ebf97 +Subproject commit 2a14c9fdcc0c95a3ccb0334b95c218024063dfc3 diff --git a/src/genome-maps.js b/src/genome-maps.js index 1a6e1ff..243d5fc 100644 --- a/src/genome-maps.js +++ b/src/genome-maps.js @@ -345,8 +345,7 @@ GenomeMaps.prototype = { exclude: 'transcripts' }, species: genomeViewer.species, - featureCache: { - gzip: true, + cacheConfig: { chunkSize: 50000 } }) From b72a0fd6fec4ee5b5383908f9b65ae4b5acc0e1c Mon Sep 17 00:00:00 2001 From: imedina Date: Mon, 21 Oct 2013 11:46:21 +0200 Subject: [PATCH 28/61] jsorolla: update to use histogram --- lib/jsorolla | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/jsorolla b/lib/jsorolla index 2a14c9f..4abe251 160000 --- a/lib/jsorolla +++ b/lib/jsorolla @@ -1 +1 @@ -Subproject commit 2a14c9fdcc0c95a3ccb0334b95c218024063dfc3 +Subproject commit 4abe251ac2e01e3b8d0612d01e9e44e1a970daa0 From 457f0fd3eade4cfe311bced4ce01e8369abd657b Mon Sep 17 00:00:00 2001 From: frasator Date: Thu, 31 Oct 2013 18:11:24 +0100 Subject: [PATCH 29/61] modified track adapter and cache configuration for tracks --- lib/jsorolla | 2 +- src/genome-maps.html | 2 ++ src/genome-maps.js | 49 +++++++++++----------------- src/gm-config.js | 76 ++++++-------------------------------------- 4 files changed, 30 insertions(+), 99 deletions(-) diff --git a/lib/jsorolla b/lib/jsorolla index 4abe251..c9e883f 160000 --- a/lib/jsorolla +++ b/lib/jsorolla @@ -1 +1 @@ -Subproject commit 4abe251ac2e01e3b8d0612d01e9e44e1a970daa0 +Subproject commit c9e883f8999bb908619000e87b9f9166c00f4831 diff --git a/src/genome-maps.html b/src/genome-maps.html index d6eded2..93691cc 100755 --- a/src/genome-maps.html +++ b/src/genome-maps.html @@ -4,6 +4,7 @@ Genome Maps + @@ -45,6 +46,7 @@ + diff --git a/src/genome-maps.js b/src/genome-maps.js index 243d5fc..bca9399 100644 --- a/src/genome-maps.js +++ b/src/genome-maps.js @@ -327,7 +327,7 @@ GenomeMaps.prototype = { var gene = new FeatureTrack({ targetId: null, id: 2, - title: 'Gene', +// title: 'Gene', histogramZoom: 10, labelZoom: 20, height: 100, @@ -1418,8 +1418,7 @@ GenomeMaps.prototype.addTrack = function (trackType, trackTitle, object, host) { subCategory: "region", resource: "gene", species: this.genomeViewer.species, - featureCache: { - gzip: true, + cacheConfig: { chunkSize: 50000 }, filters: {}, @@ -1465,8 +1464,7 @@ GenomeMaps.prototype.addTrack = function (trackType, trackTitle, object, host) { subCategory: "region", resource: "cpg_island", species: this.genomeViewer.species, - featureCache: { - gzip: true, + cacheConfig: { chunkSize: 50000 } }) @@ -1498,7 +1496,7 @@ GenomeMaps.prototype.addTrack = function (trackType, trackTitle, object, host) { }, tooltipTitle: function (f) { var name = (f.name != null) ? f.name : f.id; - return f.featureType.toUpperCase() + ' - ' + name + ''; + return 'SNP' + ' - ' + name + ''; }, tooltipText: function (f) { return 'alleles: ' + f.alleleString + '
' + @@ -1528,8 +1526,7 @@ GenomeMaps.prototype.addTrack = function (trackType, trackTitle, object, host) { exclude: 'transcriptVariations,xrefs,samples' }, species: this.genomeViewer.species, - featureCache: { - gzip: true, + cacheConfig: { chunkSize: 10000 }, filters: {}, @@ -1549,8 +1546,7 @@ GenomeMaps.prototype.addTrack = function (trackType, trackTitle, object, host) { subCategory: "region", resource: "mutation", species: this.genomeViewer.species, - featureCache: { - gzip: true, + cacheConfig: { chunkSize: 10000 } }) @@ -1574,8 +1570,7 @@ GenomeMaps.prototype.addTrack = function (trackType, trackTitle, object, host) { resource: "structural_variation", species: this.genomeViewer.species, params: {min_length: 1, max_length: 20000}, - featureCache: { - gzip: true, + cacheConfig: { chunkSize: 50000 } }) @@ -1599,8 +1594,7 @@ GenomeMaps.prototype.addTrack = function (trackType, trackTitle, object, host) { resource: "structural_variation", species: this.genomeViewer.species, params: {min_length: 20000, max_length: 300000000}, - featureCache: { - gzip: true, + cacheConfig: { chunkSize: 5000000 } }) @@ -1627,10 +1621,9 @@ GenomeMaps.prototype.addTrack = function (trackType, trackTitle, object, host) { // type: 'mirna_target' // }, // species: this.genomeViewer.species, -// featureCache: { -// gzip: true, -// chunkSize: 10000 -// } +// cacheConfig: { +// chunkSize: 10000 +// } // }) // }); // this.genomeViewer.addTrack(miRNATrack, { @@ -1691,9 +1684,8 @@ GenomeMaps.prototype.addTrack = function (trackType, trackTitle, object, host) { params: { }, species: this.genomeViewer.species, - featureCache: { - gzip: true, - chunkSize: 10000 + cacheConfig: { + chunkSize: 50000 } }) }); @@ -1779,9 +1771,7 @@ GenomeMaps.prototype.addTrack = function (trackType, trackTitle, object, host) { resource: "conserved_region", params: { }, - species: this.genomeViewer.species, - featureCache: { - gzip: true, + cacheConfig: { chunkSize: 10000 } }) @@ -1850,14 +1840,13 @@ GenomeMaps.prototype.addTrack = function (trackType, trackTitle, object, host) { renderer: new BamRenderer('bam'), - dataAdapter: new BamAdapter({ + dataAdapter: new OpencgaAdapter({ category: "bam", host: host, resource: object, species: this.genomeViewer.species, - featureCache: { - gzip: true, - chunkSize: 5000 + cacheConfig: { + chunkSize: 50000 }, filters: {}, options: {}, @@ -1903,8 +1892,7 @@ GenomeMaps.prototype.addTrack = function (trackType, trackTitle, object, host) { host: host, resource: object, species: this.genomeViewer.species, - featureCache: { - gzip: true, + cacheConfig: { chunkSize: 5000 }, filters: {}, @@ -1921,7 +1909,6 @@ GenomeMaps.prototype.addTrack = function (trackType, trackTitle, object, host) { var renderer = new VcfMultisampleRenderer('vcf'); renderer.on({ 'feature:click': function (event) { - var vcfInfo = new VCFVariantInfoWidget(null, _this.genomeViewer.species, {adapter: adapter}).draw(event); } }); diff --git a/src/gm-config.js b/src/gm-config.js index 302f1e4..9ed7113 100755 --- a/src/gm-config.js +++ b/src/gm-config.js @@ -11,10 +11,9 @@ * WUM_HOST = "http://ws.bioinfo.cipf.es/wum/rest"; * **/ -CELLBASE_HOST = "http://ws.bioinfo.cipf.es/cellbase/rest"; CELLBASE_VERSION = "v3"; -//OPENCGA_HOST = "http://ws.bioinfo.cipf.es/opencga/rest"; -OPENCGA_HOST = "http://ws-beta.bioinfo.cipf.es/opencga/rest"; +CELLBASE_HOST = "http://ws.bioinfo.cipf.es/cellbase/rest"; +OPENCGA_HOST = "http://ws.bioinfo.cipf.es/opencga/rest"; OPENCGA_LOCALHOST = "http://localhost:61976/opencga/rest"; /** Devel only: custom URL check **/ @@ -27,21 +26,14 @@ if ( window.location.protocol === "file:" ) { - CELLBASE_HOST = "http://ws-beta.bioinfo.cipf.es/cellbasebeta2/rest"; - CELLBASE_HOST = "http://fsalavert:8080/cellbase-server-3.0.0/rest"; - CELLBASE_HOST = "http://ws-beta.bioinfo.cipf.es/cellbase-server-3.0.0/rest"; + CELLBASE_HOST = "http://ws-beta.bioinfo.cipf.es/cellbase/rest"; //CELLBASE_HOST = "http://rsanchez:8080/cellbase/rest"; //CELLBASE_HOST = "http://imedina:8080/cellbase/rest"; - //CELLBASE_HOST = "http://ralonso:8080/naranjoma-ws/rest"; - OPENCGA_HOST = "http://ws-beta.bioinfo.cipf.es/opencgabeta/rest"; - OPENCGA_HOST = "http://ws-beta.bioinfo.cipf.es/opencga-server-0.2.0/rest"; -// OPENCGA_HOST = "http://rsanchez:8080/dqs/rest"; -// OPENCGA_HOST = "http://imedina:8080/dqs/rest"; + OPENCGA_HOST = "http://ws-beta.bioinfo.cipf.es/opencga-server-beta/rest"; +// OPENCGA_HOST = "http://fsalavert:8080/opencga/rest"; } -//CELLBASE_HOST = "http://citrusgenn.bioinfo.cipf.es/cellbasecitrus/rest"; -//OPENCGA_HOST = "http://citrusgenn.bioinfo.cipf.es/opencgacitrus/rest"; /*Panel settings*/ CONFPANELHIDDEN = false; @@ -68,8 +60,8 @@ var AVAILABLE_SPECIES = { {"text": "Gallus gallus", "assembly": "Galgal4", "region": {"chromosome": "1", "start": 1000000, "end": 1000000}, "chromosomes": ["1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", "15", "16", "17", "18", "19", "20", "21", "22", "23", "24", "25", "26", "27", "28", "32", "W", "Z", "MT"], "url": "ftp://ftp.ensembl.org/pub/release-71/"}, {"text": "Gorilla gorilla", "assembly": "gorGor3.1", "region": {"chromosome": "1", "start": 1000000, "end": 1000000}, "chromosomes": ["1", "2a", "2b", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", "15", "16", "17", "18", "19", "20", "21", "22", "X", "MT"], "url": "ftp://ftp.ensembl.org/pub/release-71/"}, {"text": "Homo sapiens", "assembly": "GRCh37.p10", "region": {"chromosome": "13", "start": 32889611, "end": 32973805}, "chromosomes": ["1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", "15", "16", "17", "18", "19", "20", "21", "22", "X", "Y", "MT"], "url": "ftp://ftp.ensembl.org/pub/release-71/"}, -// {"text": "Homo sapiens", "assembly": "GRCh37.p10", "region": {"chromosome": "13", "start": 32889599, "end": 32889739}, "chromosomes": ["1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", "15", "16", "17", "18", "19", "20", "21", "22", "X", "Y", "MT"], "url": "ftp://ftp.ensembl.org/pub/release-71/"}, // {"text": "Homo sapiens", "assembly": "GRCh37.p10", "region": {"chromosome": "20", "start": 32878277, "end": 32878277}, "chromosomes": ["1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", "15", "16", "17", "18", "19", "20", "21", "22", "X", "Y", "MT"], "url": "ftp://ftp.ensembl.org/pub/release-71/"}, +// {"text": "Homo sapiens", "assembly": "GRCh37.p10", "region": {"chromosome": "13", "start": 32889599, "end": 32889739}, "chromosomes": ["1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", "15", "16", "17", "18", "19", "20", "21", "22", "X", "Y", "MT"], "url": "ftp://ftp.ensembl.org/pub/release-71/"}, // {"text": "Homo sapiens", "assembly": "GRCh37.p10", "region": {"chromosome": "1", "start": 32877109, "end": 32882337}, "chromosomes": ["1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", "15", "16", "17", "18", "19", "20", "21", "22", "X", "Y", "MT"], "url": "ftp://ftp.ensembl.org/pub/release-71/"}, {"text": "Macaca mulatta", "assembly": "MMUL_1.0", "region": {"chromosome": "1", "start": 1000000, "end": 1000000}, "chromosomes": ["1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", "15", "16", "17", "18", "19", "20", "X", "MT"], "url": "ftp://ftp.ensembl.org/pub/release-71/"}, {"text": "Mus musculus", "assembly": "GRCm38.p1", "region": {"chromosome": "1", "start": 18422009, "end": 18422009}, "chromosomes": ["1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", "15", "16", "17", "18", "19", "X", "Y", "MT"], "url": "ftp://ftp.ensembl.org/pub/release-71/"}, @@ -124,56 +116,6 @@ var AVAILABLE_SPECIES = { ] }; - -//var AVAILABLE_SPECIESOLD = [ -// { "name":"Homo sapiens 37.p7", "species":"hsa", "icon":"", -// "region":{"chromosome":"13","start":32889599,"end":32889739} -// }, -// { "name":"Mus musculus m37", "species":"mmu", "icon":"", -// "region":{"chromosome":"1","start":18422009,"end":18422009} -// }, -// { "name":"Rattus norvegicus 3.4", "species":"rno", "icon":"", -// "region":{"chromosome":"1","start":1570040,"end":1570040} -// }, -// { "name":"Danio rerio v9", "species":"dre", "icon":"", -// "region":{"chromosome":"1","start":1570040,"end":1570040} -// }, -// { "name":"Caenorhabditis elegans WS230", "species":"cel", "icon":"", -// "region":{"chromosome":"X","start":817895,"end":817895} -// }, -// { "name":"Drosophila melanogaster 5.39", "species":"dme", "icon":"", -// "region":{"chromosome":"2L","start":158597,"end":158597} -// }, -// { "name":"Saccharomyces cerevisiae 4", "species":"sce", "icon":"", -// "region":{"chromosome":"I","start":111532,"end":111532} -// }, -// { "name":"Canis familiaris 2.0", "species":"cfa", "icon":"", -// "region":{"chromosome":"1","start":109898268,"end":109898268} -// }, -// //{ "name":"Sus scrofa 9", "species":"ssc", "icon":"", -// //"region":{"chromosome":"1","start":135353160,"end":135353160} -// //}, -// { "name":"Sus scrofa 10.2", "species":"ssc", "icon":"", -// "region":{"chromosome":"1","start":135353160,"end":135353160} -// }, -// { "name":"Anopheles gambiae 3", "species":"aga", "icon":"", -// "region":{"chromosome":"2L","start":12123831,"end":12123831} -// }, -// { "name":"Plasmodium falciparum 3D7", "species":"pfa", "icon":"", -// "region":{"chromosome":"01","start":238905,"end":238905} -// } -// //{ "name":"Aspergillus fumigatus 68.2", "species":"afu", "icon":"", -// //"region":{"chromosome":"I","start":2905,"end":2905} -// //}, -// //{ "name":"Fusarium oxysporum 68.2", "species":"fox", "icon":"", -// //"region":{"chromosome":"1","start":2905,"end":2905} -// //} -// , -// { "name":"Citrus Clementina 1.0", "species":"ccl", "icon":"", -// "region":{"chromosome":"scaffold_1","start":233423,"end":236969} -// } -// ]; - /** Reference to a species from the list to be shown at start **/ var DEFAULT_SPECIES = AVAILABLE_SPECIES.items[0].items[8]; @@ -236,14 +178,14 @@ var TRACKS = {"group1": [ {"category": "Core", "tracks": [ // {"id":"Cytoband", "disabled":false, "checked":true}, - {"id": "Sequence", "disabled": false, "checked": false}, - {"id": "Gene/Transcript", "disabled": false, "checked": false}, + {"id": "Sequence", "disabled": false, "checked": true}, + {"id": "Gene/Transcript", "disabled": false, "checked": true}, {"id": "CpG islands", "disabled": true, "checked": false} ] }, {"category": "Variation", "tracks": [ - {"id": "SNP", "disabled": false, "checked": false}, + {"id": "SNP", "disabled": false, "checked": true}, {"id": "Mutation", "disabled": true, "checked": false}, {"id": "Structural variation (<20Kb)", "disabled": true, "checked": false}, {"id": "Structural variation (>20Kb)", "disabled": true, "checked": false} From 8775be84c6ddfe3b72cb983df7b4115478d65e37 Mon Sep 17 00:00:00 2001 From: frasator Date: Sat, 2 Nov 2013 12:00:34 +0100 Subject: [PATCH 30/61] added regions to history for easy test --- lib/jsorolla | 2 +- src/genome-maps.html | 2 +- src/genome-maps.js | 4 ++-- src/gm-navigation-bar.js | 5 +++++ 4 files changed, 9 insertions(+), 4 deletions(-) diff --git a/lib/jsorolla b/lib/jsorolla index c9e883f..1dd9e2e 160000 --- a/lib/jsorolla +++ b/lib/jsorolla @@ -1 +1 @@ -Subproject commit c9e883f8999bb908619000e87b9f9166c00f4831 +Subproject commit 1dd9e2ec17c8e92cdb3e89f90c7e1f54a9fc232d diff --git a/src/genome-maps.html b/src/genome-maps.html index 93691cc..1b4c885 100755 --- a/src/genome-maps.html +++ b/src/genome-maps.html @@ -101,7 +101,7 @@ - + diff --git a/src/genome-maps.js b/src/genome-maps.js index bca9399..3e577ff 100644 --- a/src/genome-maps.js +++ b/src/genome-maps.js @@ -1834,7 +1834,7 @@ GenomeMaps.prototype.addTrack = function (trackType, trackTitle, object, host) { targetId: null, id: id, title: trackTitle, - histogramZoom: 60, + histogramZoom: 0, height: 200, visibleRange: {start: 0, end: 100}, @@ -1917,7 +1917,7 @@ GenomeMaps.prototype.addTrack = function (trackType, trackTitle, object, host) { targetId: null, id: id, title: trackTitle, - histogramZoom: 60, + histogramZoom: 0, height: 150, autoHeight: false, visibleRange: {start: 0, end: 100}, diff --git a/src/gm-navigation-bar.js b/src/gm-navigation-bar.js index 7c53feb..fdf014f 100644 --- a/src/gm-navigation-bar.js +++ b/src/gm-navigation-bar.js @@ -260,6 +260,10 @@ GmNavigationBar.prototype = { ] }); this._addRegionHistoryMenuItem(this.region); + this._addRegionHistoryMenuItem(new Region("20:32878277-32878277")); + this._addRegionHistoryMenuItem(new Region("19:300018-300018")); + this._addRegionHistoryMenuItem(new Region("7:127471196-127471196")); + this._addRegionHistoryMenuItem(new Region("20:14370-14370")); this._setSpeciesMenu(); this._setChromosomeMenu(); @@ -276,6 +280,7 @@ GmNavigationBar.prototype = { handler: function () { console.log(this.text); _this.region.parse(this.text); + Ext.getCmp(_this.id + 'regionField').setValue(_this.region.toString()); _this._recalculateZoom(); _this.trigger('region:change', {region: _this.region, sender: _this}); } From 531374bc1685cc8cb4e8534dcf497510911c1b18 Mon Sep 17 00:00:00 2001 From: frasator Date: Sat, 2 Nov 2013 12:23:43 +0100 Subject: [PATCH 31/61] increased version number --- Gruntfile.js | 2 +- src/genome-maps.js | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/Gruntfile.js b/Gruntfile.js index 2c77a01..42a39de 100644 --- a/Gruntfile.js +++ b/Gruntfile.js @@ -5,7 +5,7 @@ module.exports = function (grunt) { grunt.initConfig({ // Metadata. meta: { - version: '3.1.3', + version: '3.1.4', jsorolla: { dir: '/lib/jsorolla/', //genome viewer contains cellbse and utils diff --git a/src/genome-maps.js b/src/genome-maps.js index 3e577ff..bc1f608 100644 --- a/src/genome-maps.js +++ b/src/genome-maps.js @@ -30,7 +30,7 @@ function GenomeMaps(args) { this.suiteId = 9; this.title = 'Genome Maps'; this.description = "Genomic data visualization"; - this.version = " RC1 - 3.1.3"; + this.version = " RC1 - 3.1.4"; this.border = true; this.trackIdCounter = 1; this.resizable = true; From 20a485cb9cd07ac512266ad20a36cb5a19eb2d07 Mon Sep 17 00:00:00 2001 From: frasator Date: Sat, 2 Nov 2013 12:36:22 +0100 Subject: [PATCH 32/61] modified visible region for bam and vcf --- src/genome-maps.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/genome-maps.js b/src/genome-maps.js index bc1f608..4415ca7 100644 --- a/src/genome-maps.js +++ b/src/genome-maps.js @@ -1836,7 +1836,7 @@ GenomeMaps.prototype.addTrack = function (trackType, trackTitle, object, host) { title: trackTitle, histogramZoom: 0, height: 200, - visibleRange: {start: 0, end: 100}, + visibleRange: {start: 60, end: 100}, renderer: new BamRenderer('bam'), @@ -1920,7 +1920,7 @@ GenomeMaps.prototype.addTrack = function (trackType, trackTitle, object, host) { histogramZoom: 0, height: 150, autoHeight: false, - visibleRange: {start: 0, end: 100}, + visibleRange: {start: 60, end: 100}, labelZoom: 100, renderer: renderer, dataAdapter: adapter From 907cd83b7d03fd7363cb576b4bd9c733423b3e81 Mon Sep 17 00:00:00 2001 From: frasator Date: Wed, 13 Nov 2013 10:53:07 +0100 Subject: [PATCH 33/61] added feature-cluster-renderer.js to html --- lib/jsorolla | 2 +- src/genome-maps.html | 12 ++++++++---- 2 files changed, 9 insertions(+), 5 deletions(-) diff --git a/lib/jsorolla b/lib/jsorolla index 1dd9e2e..39460b4 160000 --- a/lib/jsorolla +++ b/lib/jsorolla @@ -1 +1 @@ -Subproject commit 1dd9e2ec17c8e92cdb3e89f90c7e1f54a9fc232d +Subproject commit 39460b421bb10337bacc274003079de031eba1e7 diff --git a/src/genome-maps.html b/src/genome-maps.html index 1b4c885..2444679 100755 --- a/src/genome-maps.html +++ b/src/genome-maps.html @@ -4,14 +4,15 @@ Genome Maps - - + + + @@ -38,6 +39,9 @@ + + + @@ -45,8 +49,7 @@ - - + @@ -133,6 +136,7 @@ + From 5e9489417eec999b3560c14cc6c7f11960989373 Mon Sep 17 00:00:00 2001 From: frasator Date: Wed, 13 Nov 2013 10:54:11 +0100 Subject: [PATCH 34/61] increased version number to 3.1.5 --- Gruntfile.js | 2 +- src/genome-maps.js | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/Gruntfile.js b/Gruntfile.js index 42a39de..0f9dbfc 100644 --- a/Gruntfile.js +++ b/Gruntfile.js @@ -5,7 +5,7 @@ module.exports = function (grunt) { grunt.initConfig({ // Metadata. meta: { - version: '3.1.4', + version: '3.1.5', jsorolla: { dir: '/lib/jsorolla/', //genome viewer contains cellbse and utils diff --git a/src/genome-maps.js b/src/genome-maps.js index 4415ca7..094954b 100644 --- a/src/genome-maps.js +++ b/src/genome-maps.js @@ -30,7 +30,7 @@ function GenomeMaps(args) { this.suiteId = 9; this.title = 'Genome Maps'; this.description = "Genomic data visualization"; - this.version = " RC1 - 3.1.4"; + this.version = " RC1 - 3.1.5"; this.border = true; this.trackIdCounter = 1; this.resizable = true; From 697e2c66a4a7417acf5edf673efb34c65506d471 Mon Sep 17 00:00:00 2001 From: frasator Date: Wed, 13 Nov 2013 11:03:41 +0100 Subject: [PATCH 35/61] Gruntfile dependencies path fix --- Gruntfile.js | 12 ++++++++---- 1 file changed, 8 insertions(+), 4 deletions(-) diff --git a/Gruntfile.js b/Gruntfile.js index 0f9dbfc..5c89362 100644 --- a/Gruntfile.js +++ b/Gruntfile.js @@ -77,9 +77,11 @@ module.exports = function (grunt) { scripts: { 'js': 'build/<%= meta.version %>/genome-maps-<%= meta.version %>.min.js', 'vendor': [ - 'build/<%= meta.version %>/vendor/jquery.min.js', 'build/<%= meta.version %>/vendor/underscore*.js', 'build/<%= meta.version %>/vendor/backbone*.js', + 'build/<%= meta.version %>/vendor/jquery.min.js', + 'build/<%= meta.version %>/vendor/bootstrap-*-dist/js/bootstrap.min.js', + 'build/<%= meta.version %>/vendor/typeahead.min.js', 'build/<%= meta.version %>/vendor/jquery.mousewheel*.js', 'build/<%= meta.version %>/vendor/gl-matrix-min*.js', 'build/<%= meta.version %>/vendor/ChemDoodleWeb*.js', @@ -89,7 +91,7 @@ module.exports = function (grunt) { 'build/<%= meta.version %>/vendor/jquery.qtip*.js', 'build/<%= meta.version %>/vendor/rawdeflate*.js', 'build/<%= meta.version %>/vendor/xml2json.js', - 'build/<%= meta.version %>/vendor/jquery-ui-1.10.3*/js/jquery-ui*min.js' +// 'build/<%= meta.version %>/vendor/jquery-ui-1.10.3*/js/jquery-ui*min.js' ], gv: [ @@ -103,9 +105,11 @@ module.exports = function (grunt) { styles: { 'css': ['<%= stylesPath %>/css/style.css'], 'vendor': [ - 'build/<%= meta.version %>/vendor/ChemDoodleWeb*.css', 'build/<%= meta.version %>/vendor/jquery.qtip*.css', - 'build/<%= meta.version %>/vendor/jquery-ui-1.10.3*/css/**/jquery-ui*min.css' + 'build/<%= meta.version %>/vendor/ChemDoodleWeb*.css', + 'build/<%= meta.version %>/vendor/bootstrap-*-dist/css/bootstrap.min.css', + 'build/<%= meta.version %>/vendor/typeahead.js-bootstrap.css' +// 'build/<%= meta.version %>/vendor/jquery-ui-1.10.3*/css/**/jquery-ui*min.css' ] } } From 18eed2c84eb83c3545b78c1472c8d7218453498c Mon Sep 17 00:00:00 2001 From: frasator Date: Wed, 13 Nov 2013 11:05:45 +0100 Subject: [PATCH 36/61] jsorolla changes --- lib/jsorolla | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/jsorolla b/lib/jsorolla index 39460b4..ae2bd42 160000 --- a/lib/jsorolla +++ b/lib/jsorolla @@ -1 +1 @@ -Subproject commit 39460b421bb10337bacc274003079de031eba1e7 +Subproject commit ae2bd42a15bb5f6814ffb0dc2fbb5d38db66cb61 From b87f549a87810b73bb8983abc45cffd9aa8aecbe Mon Sep 17 00:00:00 2001 From: frasator Date: Wed, 13 Nov 2013 15:36:02 +0100 Subject: [PATCH 37/61] jsorolla updates --- lib/jsorolla | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/jsorolla b/lib/jsorolla index ae2bd42..d13886e 160000 --- a/lib/jsorolla +++ b/lib/jsorolla @@ -1 +1 @@ -Subproject commit ae2bd42a15bb5f6814ffb0dc2fbb5d38db66cb61 +Subproject commit d13886e0c57295d32d11e4c4bc8afbabcb5b4e97 From 038078ae963b7b222290b3f135dd91a4f2dadd46 Mon Sep 17 00:00:00 2001 From: frasator Date: Wed, 13 Nov 2013 16:03:53 +0100 Subject: [PATCH 38/61] jsorolla updates --- lib/jsorolla | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/jsorolla b/lib/jsorolla index d13886e..fa0a3f5 160000 --- a/lib/jsorolla +++ b/lib/jsorolla @@ -1 +1 @@ -Subproject commit d13886e0c57295d32d11e4c4bc8afbabcb5b4e97 +Subproject commit fa0a3f52b2a0aae86e01baf9a8ebf737d0e3c4fb From 2eba983a7bc727c852cf6104f0b9a5da3b23113b Mon Sep 17 00:00:00 2001 From: frasator Date: Thu, 14 Nov 2013 16:37:34 +0100 Subject: [PATCH 39/61] chromolendar css style fix --- lib/jsorolla | 2 +- src/genome-maps.html | 421 +++++++++++++++++++-------------------- src/gm-navigation-bar.js | 1 - 3 files changed, 211 insertions(+), 213 deletions(-) diff --git a/lib/jsorolla b/lib/jsorolla index fa0a3f5..5276e92 160000 --- a/lib/jsorolla +++ b/lib/jsorolla @@ -1 +1 @@ -Subproject commit fa0a3f52b2a0aae86e01baf9a8ebf737d0e3c4fb +Subproject commit 5276e92cda16eef401d9af2599eabaa17814099e diff --git a/src/genome-maps.html b/src/genome-maps.html index 2444679..816ea26 100755 --- a/src/genome-maps.html +++ b/src/genome-maps.html @@ -1,217 +1,216 @@ - - Genome Maps - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + +Genome Maps + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
diff --git a/src/gm-navigation-bar.js b/src/gm-navigation-bar.js index fdf014f..d32f928 100644 --- a/src/gm-navigation-bar.js +++ b/src/gm-navigation-bar.js @@ -325,7 +325,6 @@ GmNavigationBar.prototype = { var chrView = Ext.create('Ext.view.View', { id: this.id + "chrView", width: 125, - style: 'background-color:#fff', store: chrStore, selModel: { mode: 'SINGLE', From 5a8cac0abea3031657583f5124463250b7350eec Mon Sep 17 00:00:00 2001 From: frasator Date: Thu, 14 Nov 2013 16:38:26 +0100 Subject: [PATCH 40/61] jsorolla commits --- lib/jsorolla | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/jsorolla b/lib/jsorolla index 5276e92..2ed58d8 160000 --- a/lib/jsorolla +++ b/lib/jsorolla @@ -1 +1 @@ -Subproject commit 5276e92cda16eef401d9af2599eabaa17814099e +Subproject commit 2ed58d892bc7b8ade6e2234bc71e554f56944b71 From 7452b5fbbcedd6867c779f8ef8b6f8bdca7c366b Mon Sep 17 00:00:00 2001 From: frasator Date: Wed, 20 Nov 2013 19:00:19 +0100 Subject: [PATCH 41/61] jsorolla changes --- lib/jsorolla | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/jsorolla b/lib/jsorolla index 2ed58d8..7fcaeab 160000 --- a/lib/jsorolla +++ b/lib/jsorolla @@ -1 +1 @@ -Subproject commit 2ed58d892bc7b8ade6e2234bc71e554f56944b71 +Subproject commit 7fcaeab89ad31ef1f76a95942924f06519080a27 From aa4bcec1d13f1b3f2b31927990646909f54e49f6 Mon Sep 17 00:00:00 2001 From: frasator Date: Thu, 21 Nov 2013 11:43:47 +0100 Subject: [PATCH 42/61] added checkAccountFileIndexes flag to genome-maps --- lib/jsorolla | 2 +- src/genome-maps.js | 13 +++++++++---- 2 files changed, 10 insertions(+), 5 deletions(-) diff --git a/lib/jsorolla b/lib/jsorolla index 7fcaeab..82d8d1d 160000 --- a/lib/jsorolla +++ b/lib/jsorolla @@ -1 +1 @@ -Subproject commit 7fcaeab89ad31ef1f76a95942924f06519080a27 +Subproject commit 82d8d1da719ffffbb0972c8c87d6db1f3c720ca8 diff --git a/src/genome-maps.js b/src/genome-maps.js index 094954b..1954b28 100644 --- a/src/genome-maps.js +++ b/src/genome-maps.js @@ -38,6 +38,9 @@ function GenomeMaps(args) { this.width; this.height; + + this.checkAccountFileIndexes = true; + //set instantiation args, must be last _.extend(this, args); @@ -1282,10 +1285,12 @@ GenomeMaps.prototype._createTracksTreePanel = function (args) { this.icon = null; this.tooltip = null; } - if ((record.raw.fileFormat === 'bam' || record.raw.fileFormat === 'vcf') && record.raw.status !== 'ready') { - this.icon = null; - this.tooltip = null; - record.raw.disabled = true; + if(this.checkAccountFileIndexes){ + if ((record.raw.fileFormat === 'bam' || record.raw.fileFormat === 'vcf') && record.raw.status !== 'ready') { + this.icon = null; + this.tooltip = null; + record.raw.disabled = true; + } } } else { if (record.data.id == "cellbase") { From c3907f7c186441240da4c35591da223fd7100136 Mon Sep 17 00:00:00 2001 From: frasator Date: Thu, 28 Nov 2013 16:59:25 +0100 Subject: [PATCH 43/61] Gruntfile modified genome-viewer version, tracks config minHistogramRegionSize and maxLabelRegionSize --- Gruntfile.js | 2 +- lib/jsorolla | 2 +- src/genome-maps.js | 500 +++++++++++++++++---------------------------- 3 files changed, 194 insertions(+), 310 deletions(-) diff --git a/Gruntfile.js b/Gruntfile.js index 5c89362..01b698a 100644 --- a/Gruntfile.js +++ b/Gruntfile.js @@ -10,7 +10,7 @@ module.exports = function (grunt) { dir: '/lib/jsorolla/', //genome viewer contains cellbse and utils 'genomeviewer': { - version: '1.0.2', + version: '1.0.3', dir: '<%= meta.jsorolla.dir %>build/genome-viewer/<%= meta.jsorolla.genomeviewer.version %>/' }, //opencga does not contains utils diff --git a/lib/jsorolla b/lib/jsorolla index 82d8d1d..af27ceb 160000 --- a/lib/jsorolla +++ b/lib/jsorolla @@ -1 +1 @@ -Subproject commit 82d8d1da719ffffbb0972c8c87d6db1f3c720ca8 +Subproject commit af27ceb289ea697b7dd9cc8bc129ccdb4b8a5c85 diff --git a/src/genome-maps.js b/src/genome-maps.js index 1954b28..a4da8eb 100644 --- a/src/genome-maps.js +++ b/src/genome-maps.js @@ -40,6 +40,7 @@ function GenomeMaps(args) { this.checkAccountFileIndexes = true; + this.checkExampleAccount = true; //set instantiation args, must be last _.extend(this, args); @@ -211,15 +212,17 @@ GenomeMaps.prototype = { } - /*Load example account info*/ - OpencgaManager.getAccountInfo({ - accountId:'example', - sessionId:'example', - lastActivity:'example', - success:function(data){ - _this._loadOpencgaTracks(data, 'example'); - } - }); + if (this.checkExampleAccount) { + /*Load example account info*/ + OpencgaManager.getAccountInfo({ + accountId: 'example', + sessionId: 'example', + lastActivity: 'example', + success: function (data) { + _this._loadOpencgaTracks(data, 'example'); + } + }); + } /**/ /*****************************************/ @@ -331,11 +334,9 @@ GenomeMaps.prototype = { targetId: null, id: 2, // title: 'Gene', - histogramZoom: 10, - labelZoom: 20, + minHistogramRegionSize: 20000000, + maxLabelRegionSize: 10000000, height: 100, - visibleRange: {start: 0, end: 100}, - titleVisibility: 'hidden', featureTypes: FEATURE_TYPES, renderer: renderer, @@ -1285,12 +1286,15 @@ GenomeMaps.prototype._createTracksTreePanel = function (args) { this.icon = null; this.tooltip = null; } - if(this.checkAccountFileIndexes){ - if ((record.raw.fileFormat === 'bam' || record.raw.fileFormat === 'vcf') && record.raw.status !== 'ready') { - this.icon = null; - this.tooltip = null; - record.raw.disabled = true; - } + if ((record.raw.fileFormat === 'bam' || record.raw.fileFormat === 'vcf') && record.raw.status !== 'ready') { + this.icon = null; + this.tooltip = null; + record.raw.disabled = true; + } + if (_this.checkAccountFileIndexes == false) { + this.icon = Utils.images.add; + this.tooltip = "Add"; + record.raw.disabled = false; } } else { if (record.data.id == "cellbase") { @@ -1405,16 +1409,34 @@ GenomeMaps.prototype.addTrack = function (trackType, trackTitle, object, host) { var id = this.genTrackId(); //console.log(trackId); switch (trackType) { + case "Sequence": + var sequence = new SequenceTrack({ + targetId: null, + id: id, + title: 'Sequence', + height: 25, + visibleRange: 200, + + renderer: new SequenceRenderer(), + + dataAdapter: new SequenceAdapter({ + category: "genomic", + subCategory: "region", + resource: "sequence", + species: this.genomeViewer.species + }) + }); + this.genomeViewer.addTrack(sequence); + break; case "Gene/Transcript": var gene = new GeneTrack({ targetId: null, id: id, title: 'Gene', - histogramZoom: 15, - transcriptZoom: 50, + minHistogramRegionSize: 20000000, + maxLabelRegionSize: 10000000, + minTranscriptRegionSize: 200000, height: 100, - visibleRange: {start: 0, end: 100}, - featureTypes: FEATURE_TYPES, renderer: new GeneRenderer(), @@ -1423,105 +1445,54 @@ GenomeMaps.prototype.addTrack = function (trackType, trackTitle, object, host) { subCategory: "region", resource: "gene", species: this.genomeViewer.species, + params: { + exclude: 'transcripts.xrefs,transcripts.exons.sequence' + }, cacheConfig: { - chunkSize: 50000 + chunkSize: 100000 }, filters: {}, - options: {}, - featureConfig: FEATURE_CONFIG.gene + options: {} }) }); this.genomeViewer.addTrack(gene); break; case "Cytoband": - break; - case "Sequence": - var sequence = new SequenceTrack({ - targetId: null, - id: id, - title: 'Sequence', - histogramZoom: 20, - transcriptZoom: 50, - height: 25, - visibleRange: {start: 99, end: 100}, - featureTypes: FEATURE_TYPES, - - renderer: new SequenceRenderer(), - - dataAdapter: new SequenceAdapter({ - category: "genomic", - subCategory: "region", - resource: "sequence", - species: this.genomeViewer.species, - featureCache: { - gzip: true, - chunkSize: 1000 - } - }) - }); - this.genomeViewer.addTrack(sequence); break; case "CpG islands": - var cpgTrack = new TrackData(id, { - adapter: new CellBaseAdapter({ - category: "genomic", - subCategory: "region", - resource: "cpg_island", - species: this.genomeViewer.species, - cacheConfig: { - chunkSize: 50000 - } - }) - }); - this.genomeViewer.addTrack(cpgTrack, { - id: id, - type: trackType, - title: trackTitle, - featuresRender: "MultiFeatureRender", - histogramZoom: 10, - height: 150, - visibleRange: {start: 0, end: 100}, - featureTypes: FEATURE_TYPES - }); - break; +// var cpgTrack = new TrackData(id, { +// adapter: new CellBaseAdapter({ +// category: "genomic", +// subCategory: "region", +// resource: "cpg_island", +// species: this.genomeViewer.species, +// cacheConfig: { +// chunkSize: 50000 +// } +// }) +// }); +// this.genomeViewer.addTrack(cpgTrack, { +// id: id, +// type: trackType, +// title: trackTitle, +// featuresRender: "MultiFeatureRender", +// histogramZoom: 10, +// height: 150, +// visibleRange: {start: 0, end: 100}, +// featureTypes: FEATURE_TYPES +// }); +// break; case "SNP": this.snp = new FeatureTrack({ targetId: null, id: id, title: 'SNP', - histogramZoom: 70, - labelZoom: 80, + minHistogramRegionSize: 12000, + maxLabelRegionSize: 3000, height: 120, - visibleRange: {start: 0, end: 100}, - featureTypes: FEATURE_TYPES, - renderer: new FeatureRenderer({ - label: function (f) { - return ('name' in f) ? f.name : f.id; - }, - tooltipTitle: function (f) { - var name = (f.name != null) ? f.name : f.id; - return 'SNP' + ' - ' + name + ''; - }, - tooltipText: function (f) { - return 'alleles: ' + f.alleleString + '
' + - FEATURE_TYPES.getTipCommons(f) + - 'source: ' + f.source + '
'; - }, - color: 'lightblue', - infoWidgetId: "id", - height: 8, - histogramColor: "orange", - handlers: { - 'feature:mouseover': function (e) { - console.log(e) - }, - 'feature:click': function (event) { - new SnpInfoWidget(null, _this.genomeViewer.species).draw(event); - } - } - }), + renderer: new FeatureRenderer('snp'), dataAdapter: new CellBaseAdapter({ category: "genomic", @@ -1535,8 +1506,7 @@ GenomeMaps.prototype.addTrack = function (trackType, trackTitle, object, host) { chunkSize: 10000 }, filters: {}, - options: {}, - featureConfig: FEATURE_CONFIG.snp + options: {} }) }); @@ -1545,75 +1515,75 @@ GenomeMaps.prototype.addTrack = function (trackType, trackTitle, object, host) { break; case "Mutation": - var mutationTrack = new TrackData(id, { - adapter: new CellBaseAdapter({ - category: "genomic", - subCategory: "region", - resource: "mutation", - species: this.genomeViewer.species, - cacheConfig: { - chunkSize: 10000 - } - }) - }); - this.genomeViewer.addTrack(mutationTrack, { - id: id, - type: trackType, - title: trackTitle, - featuresRender: "MultiFeatureRender", - histogramZoom: 50, - height: 150, - visibleRange: {start: 0, end: 100}, - featureTypes: FEATURE_TYPES - }); +// var mutationTrack = new TrackData(id, { +// adapter: new CellBaseAdapter({ +// category: "genomic", +// subCategory: "region", +// resource: "mutation", +// species: this.genomeViewer.species, +// cacheConfig: { +// chunkSize: 10000 +// } +// }) +// }); +// this.genomeViewer.addTrack(mutationTrack, { +// id: id, +// type: trackType, +// title: trackTitle, +// featuresRender: "MultiFeatureRender", +// histogramZoom: 50, +// height: 150, +// visibleRange: {start: 0, end: 100}, +// featureTypes: FEATURE_TYPES +// }); break; case "Structural variation (<20Kb)": - var structuralTrack = new TrackData(id, { - adapter: new CellBaseAdapter({ - category: "genomic", - subCategory: "region", - resource: "structural_variation", - species: this.genomeViewer.species, - params: {min_length: 1, max_length: 20000}, - cacheConfig: { - chunkSize: 50000 - } - }) - }); - this.genomeViewer.addTrack(structuralTrack, { - id: id, - type: trackType, - title: trackTitle, - featuresRender: "MultiFeatureRender", - histogramZoom: 40, - height: 150, - visibleRange: {start: 0, end: 100}, - featureTypes: FEATURE_TYPES - }); +// var structuralTrack = new TrackData(id, { +// adapter: new CellBaseAdapter({ +// category: "genomic", +// subCategory: "region", +// resource: "structural_variation", +// species: this.genomeViewer.species, +// params: {min_length: 1, max_length: 20000}, +// cacheConfig: { +// chunkSize: 50000 +// } +// }) +// }); +// this.genomeViewer.addTrack(structuralTrack, { +// id: id, +// type: trackType, +// title: trackTitle, +// featuresRender: "MultiFeatureRender", +// histogramZoom: 40, +// height: 150, +// visibleRange: {start: 0, end: 100}, +// featureTypes: FEATURE_TYPES +// }); break; case "Structural variation (>20Kb)": - var structuralTrack = new TrackData(id, { - adapter: new CellBaseAdapter({ - category: "genomic", - subCategory: "region", - resource: "structural_variation", - species: this.genomeViewer.species, - params: {min_length: 20000, max_length: 300000000}, - cacheConfig: { - chunkSize: 5000000 - } - }) - }); - this.genomeViewer.addTrack(structuralTrack, { - id: id, - type: trackType, - title: trackTitle, - featuresRender: "MultiFeatureRender", - histogramZoom: 40, - height: 150, - visibleRange: {start: 0, end: 100}, - featureTypes: FEATURE_TYPES - }); +// var structuralTrack = new TrackData(id, { +// adapter: new CellBaseAdapter({ +// category: "genomic", +// subCategory: "region", +// resource: "structural_variation", +// species: this.genomeViewer.species, +// params: {min_length: 20000, max_length: 300000000}, +// cacheConfig: { +// chunkSize: 5000000 +// } +// }) +// }); +// this.genomeViewer.addTrack(structuralTrack, { +// id: id, +// type: trackType, +// title: trackTitle, +// featuresRender: "MultiFeatureRender", +// histogramZoom: 40, +// height: 150, +// visibleRange: {start: 0, end: 100}, +// featureTypes: FEATURE_TYPES +// }); break; case "miRNA targets": console.log("TODO : miRNA targets ") @@ -1648,11 +1618,7 @@ GenomeMaps.prototype.addTrack = function (trackType, trackTitle, object, host) { targetId: null, id: id, title: 'TFBS', - histogramZoom: 0, - labelZoom: 80, height: 120, - visibleRange: {start: 0, end: 100}, - featureTypes: FEATURE_TYPES, renderer: new FeatureRenderer({ label: function (f) { return ('name' in f) ? f.name : f.id; @@ -1686,9 +1652,9 @@ GenomeMaps.prototype.addTrack = function (trackType, trackTitle, object, host) { category: "genomic", subCategory: "region", resource: "tfbs", + species: this.genomeViewer.species, params: { }, - species: this.genomeViewer.species, cacheConfig: { chunkSize: 50000 } @@ -1696,33 +1662,8 @@ GenomeMaps.prototype.addTrack = function (trackType, trackTitle, object, host) { }); this.genomeViewer.addTrack(tfbsTrack); - -// var tfbsTrack = new TrackData(id, { -// adapter: new CellBaseAdapter({ -// category: "genomic", -// subCategory: "region", -// resource: "regulatory", -// params: { -// type: 'TF_binding_site_motif' -// }, -// species: this.genomeViewer.species, -// featureCache: { -// gzip: true, -// chunkSize: 10000 -// } -// }) -// }); -// this.genomeViewer.addTrack(tfbsTrack, { -// id: id, -// type: trackType, -// title: trackTitle, -// featuresRender: "MultiFeatureRender", -// histogramZoom: 0, -// height: 150, -// visibleRange: {start: 0, end: 100}, -// featureTypes: FEATURE_TYPES -// }); break; + // case "Histone": // // break; @@ -1734,52 +1675,52 @@ GenomeMaps.prototype.addTrack = function (trackType, trackTitle, object, host) { // break; case "Conserved regions": var conservedTrack = new FeatureTrack({ - targetId: null, - id: id, - title: 'Conserved Region', - histogramZoom: 0, - labelZoom: 80, - height: 120, - visibleRange: {start: 0, end: 100}, - featureTypes: FEATURE_TYPES, - renderer: new ConservedRenderer({ - label: function (f) { - return f.chromosome + ":" + f.start + "-" + f.end; - }, - tooltipTitle: function (f) { - var name = (f.name != null) ? f.name : f.id; - return f.featureType.toUpperCase() + ' - ' + name + ''; - }, - tooltipText: function (f) { - return 'alleles: ' + f.alleleString + '
' + - FEATURE_TYPES.getTipCommons(f) + - 'source: ' + f.source + '
'; - - }, - color: 'lightblue', - infoWidgetId: "id", - height: 8, - histogramColor: "orange", - handlers: { - 'feature:mouseover': function (e) { - console.log(e) - }, - 'feature:click': function (event) { - new SnpInfoWidget(null, _this.genomeViewer.species).draw(event); - } - } - }), - - dataAdapter: new CellBaseAdapter({ - category: "genomic", - subCategory: "region", - resource: "conserved_region", - params: { - }, - cacheConfig: { - chunkSize: 10000 - } - }) +// targetId: null, +// id: id, +// title: 'Conserved Region', +// histogramZoom: 0, +// labelZoom: 80, +// height: 120, +// visibleRange: {start: 0, end: 100}, +// featureTypes: FEATURE_TYPES, +// renderer: new ConservedRenderer({ +// label: function (f) { +// return f.chromosome + ":" + f.start + "-" + f.end; +// }, +// tooltipTitle: function (f) { +// var name = (f.name != null) ? f.name : f.id; +// return f.featureType.toUpperCase() + ' - ' + name + ''; +// }, +// tooltipText: function (f) { +// return 'alleles: ' + f.alleleString + '
' + +// FEATURE_TYPES.getTipCommons(f) + +// 'source: ' + f.source + '
'; +// +// }, +// color: 'lightblue', +// infoWidgetId: "id", +// height: 8, +// histogramColor: "orange", +// handlers: { +// 'feature:mouseover': function (e) { +// console.log(e) +// }, +// 'feature:click': function (event) { +// new SnpInfoWidget(null, _this.genomeViewer.species).draw(event); +// } +// } +// }), +// +// dataAdapter: new CellBaseAdapter({ +// category: "genomic", +// subCategory: "region", +// resource: "conserved_region", +// params: { +// }, +// cacheConfig: { +// chunkSize: 10000 +// } +// }) }); this.genomeViewer.addTrack(conservedTrack); @@ -1807,33 +1748,6 @@ GenomeMaps.prototype.addTrack = function (trackType, trackTitle, object, host) { // featureTypes: FEATURE_TYPES // }); case "bam": -// var bamTrack = new TrackData(id, { -// adapter: new BamAdapter({ -// category: "bam", -// host: host, -// //resource: trackTitle.substr(0,trackTitle.length-4), -// resource: object, -// species: this.genomeViewer.species, -// featureCache: { -// gzip: false, -// chunkSize: 5000 -// }, -// filters: {}, -// options: {}, -// featureConfig: FEATURE_CONFIG.bam -// }) -// }); -// this.genomeViewer.addTrack(bamTrack, { -// id: id, -// type: trackType, -// title: trackTitle, -// featuresRender: "BamRender", -// histogramZoom: 60, -// height: 24, -// visibleRange: {start: 0, end: 100}, -// featureTypes: FEATURE_TYPES -// }); -// break; var bamTrack = new BamTrack({ targetId: null, @@ -1851,7 +1765,7 @@ GenomeMaps.prototype.addTrack = function (trackType, trackTitle, object, host) { resource: object, species: this.genomeViewer.species, cacheConfig: { - chunkSize: 50000 + chunkSize: 5000 }, filters: {}, options: {}, @@ -1864,34 +1778,6 @@ GenomeMaps.prototype.addTrack = function (trackType, trackTitle, object, host) { case "vcf": -// var vcfTrack = new TrackData(id, { -// adapter: new OpencgaAdapter({ -// category: "vcf", -// //resource: trackTitle.substr(0,trackTitle.length-4), -// resource: object, -// species: this.genomeViewer.species, -// featureCache: { -// gzip: false, -// chunkSize: 5000 -// }, -// filters: {}, -// options: {}, -// featureConfig: FEATURE_CONFIG.vcf -// }) -// }); -// this.genomeViewer.addTrack(vcfTrack, { -// id: id, -// type: trackType, -// title: trackTitle, -// featuresRender: "MultiFeatureRender", -// histogramZoom: 60, -// height: 150, -// visibleRange: {start: 0, end: 100}, -// featureTypes: FEATURE_TYPES -// }); -// break; - - var adapter = new OpencgaAdapter({ category: "vcf", host: host, @@ -1967,7 +1853,7 @@ GenomeMaps.prototype.addFileTrack = function (text, updateActiveTracksPanel) { _this.headerWidget.on('logout', function (sender) { fileWidget.sessionFinished(); }); - fileWidget.on('okButton:click',function (event) { + fileWidget.on('okButton:click', function (event) { var id = _this.genTrackId(); var type = text; @@ -1978,8 +1864,6 @@ GenomeMaps.prototype.addFileTrack = function (text, updateActiveTracksPanel) { // histogramZoom: 70, // labelZoom: 80, height: 150, - visibleRange: {start: 0, end: 100}, - featureTypes: FEATURE_TYPES, renderer: new FeatureRenderer(text.toLowerCase()), dataAdapter: event.adapter }); @@ -2041,7 +1925,7 @@ GenomeMaps.prototype.addDASTrack = function (sourceName, sourceUrl) { histogramZoom: 0, labelZoom: 80, height: 150, - visibleRange: {start: 50, end: 100}, + visibleRange: 10000000, renderer: new FeatureRenderer('das'), dataAdapter: new DasAdapter({ url: sourceUrl, From acfc796c8db4d26a9b297510a96c45caea46f880 Mon Sep 17 00:00:00 2001 From: frasator Date: Sat, 30 Nov 2013 15:23:21 +0100 Subject: [PATCH 44/61] new tracks config --- Gruntfile.js | 2 +- lib/jsorolla | 2 +- src/genome-maps.js | 97 ++++++++++++++++--- src/gm-config.js | 118 +++++++++++------------ src/gm-navigation-bar.js | 196 +-------------------------------------- 5 files changed, 148 insertions(+), 267 deletions(-) diff --git a/Gruntfile.js b/Gruntfile.js index 01b698a..bf10355 100644 --- a/Gruntfile.js +++ b/Gruntfile.js @@ -5,7 +5,7 @@ module.exports = function (grunt) { grunt.initConfig({ // Metadata. meta: { - version: '3.1.5', + version: '3.1.6', jsorolla: { dir: '/lib/jsorolla/', //genome viewer contains cellbse and utils diff --git a/lib/jsorolla b/lib/jsorolla index af27ceb..b8c99ae 160000 --- a/lib/jsorolla +++ b/lib/jsorolla @@ -1 +1 @@ -Subproject commit af27ceb289ea697b7dd9cc8bc129ccdb4b8a5c85 +Subproject commit b8c99aedf4c124b1465a3b80156f438b657b235c diff --git a/src/genome-maps.js b/src/genome-maps.js index a4da8eb..c2e5ca9 100644 --- a/src/genome-maps.js +++ b/src/genome-maps.js @@ -30,7 +30,7 @@ function GenomeMaps(args) { this.suiteId = 9; this.title = 'Genome Maps'; this.description = "Genomic data visualization"; - this.version = " RC1 - 3.1.5"; + this.version = " RC1 - 3.1.6"; this.border = true; this.trackIdCounter = 1; this.resizable = true; @@ -337,7 +337,6 @@ GenomeMaps.prototype = { minHistogramRegionSize: 20000000, maxLabelRegionSize: 10000000, height: 100, - featureTypes: FEATURE_TYPES, renderer: renderer, @@ -365,6 +364,60 @@ GenomeMaps.prototype = { }, _createNavigationBar: function (targetId) { var _this = this; + + var quickSearchResultFn = function (query) { + var results = []; + var speciesCode = Utils.getSpeciesCode(this.species.text).substr(0, 3); + + CellBaseManager.get({ + host: 'http://ws.bioinfo.cipf.es/cellbase/rest', + species: speciesCode, + version: 'latest', + category: 'feature', + subCategory: 'id', + query: query, + resource: 'starts_with', + params: { + of: 'json' + }, + async: false, + success: function (data, textStatus, jqXHR) { + for (var i in data[0]) { + results.push(data[0][i].displayId); + } + } + }); + return results; + }; + + var goFeature = function (featureName) { + if (featureName != null) { + if (featureName.slice(0, "rs".length) == "rs" || featureName.slice(0, "AFFY_".length) == "AFFY_" || featureName.slice(0, "SNP_".length) == "SNP_" || featureName.slice(0, "VAR_".length) == "VAR_" || featureName.slice(0, "CRTAP_".length) == "CRTAP_" || featureName.slice(0, "FKBP10_".length) == "FKBP10_" || featureName.slice(0, "LEPRE1_".length) == "LEPRE1_" || featureName.slice(0, "PPIB_".length) == "PPIB_") { + this.openSNPListWidget(featureName); + } else { + console.log(featureName); + CellBaseManager.get({ + species: _this.species, + category: 'feature', + subCategory: 'gene', + query: featureName, + resource: 'info', + params: { + include: 'chromosome,start,end' + }, + success: function (data) { + var feat = data.response[0].result[0]; + var regionStr = feat.chromosome + ":" + feat.start + "-" + feat.end; + var region = new Region(); + region.parse(regionStr); + _this.region = region; + _this.trigger('region:change', {region: _this.region, sender: _this}); + } + }); + } + } + }; + var navigationBar = new GmNavigationBar({ targetId: targetId, availableSpecies: this.genomeViewer.availableSpecies, @@ -374,12 +427,16 @@ GenomeMaps.prototype = { width: this.genomeViewer.width, svgCanvasWidthOffset: this.genomeViewer.trackPanelScrollWidth + this.genomeViewer.sidePanelWidth, zoom: this.genomeViewer.zoom, + quickSearchResultFn: quickSearchResultFn, autoRender: true, handlers: { 'region:change': function (event) { - Utils.setMinRegion(event.region, _this.genomeViewer.getSVGCanvasWidth()) + _this.genomeViewer.setMinRegion(event.region, _this.genomeViewer.getSVGCanvasWidth()) _this.genomeViewer.trigger('region:change', event); }, + 'zoom:change': function (event) { + _this.genomeViewer.trigger('zoom:change', event); + }, 'configuration-button:change': function (event) { if (event.selected) { _this.sidePanel.show(); @@ -434,6 +491,13 @@ GenomeMaps.prototype = { 'autoHeight-button:click': function (event) { // _this.genomeViewer.enableAutoHeight(); _this.genomeViewer.updateHeight(); + }, + 'quickSearch:select': function (event) { + goFeature(event.item); + _this.genomeViewer.trigger('quickSearch:select', event); + }, + 'quickSearch:go': function (event) { + goFeature(event.item); } } }); @@ -442,6 +506,16 @@ GenomeMaps.prototype = { if (event.sender != navigationBar) { navigationBar.setRegion(event.region); } + _this.genomeViewer.zoom = _this.genomeViewer._calculateZoomByRegion(event.region); + navigationBar.setZoom(_this.genomeViewer.zoom); + }); + this.genomeViewer.on('zoom:change', function (event) { + _this.genomeViewer.region.load(_this.genomeViewer._calculateRegionByZoom(event.zoom)); + if (event.sender != navigationBar) { + navigationBar.setZoom(event.zoom); + navigationBar.setRegion(event.region); + } + _this.genomeViewer.setRegion(_this.region); }); this.genomeViewer.on('region:move', function (event) { if (event.sender != navigationBar) { @@ -1297,7 +1371,7 @@ GenomeMaps.prototype._createTracksTreePanel = function (args) { record.raw.disabled = false; } } else { - if (record.data.id == "cellbase") { + if (record.data.id == "cellbase") {24997 this.icon = Utils.images.edit; } else if (record.data.id == "das") { this.icon = Utils.images.add; @@ -1415,7 +1489,7 @@ GenomeMaps.prototype.addTrack = function (trackType, trackTitle, object, host) { id: id, title: 'Sequence', height: 25, - visibleRange: 200, + visibleRegionSize: 200, renderer: new SequenceRenderer(), @@ -1753,9 +1827,8 @@ GenomeMaps.prototype.addTrack = function (trackType, trackTitle, object, host) { targetId: null, id: id, title: trackTitle, - histogramZoom: 0, height: 200, - visibleRange: {start: 60, end: 100}, + visibleRegionSize: 1000000, renderer: new BamRenderer('bam'), @@ -1766,10 +1839,7 @@ GenomeMaps.prototype.addTrack = function (trackType, trackTitle, object, host) { species: this.genomeViewer.species, cacheConfig: { chunkSize: 5000 - }, - filters: {}, - options: {}, - featureConfig: FEATURE_CONFIG.gene + } }) }); this.genomeViewer.addTrack(bamTrack); @@ -1785,10 +1855,7 @@ GenomeMaps.prototype.addTrack = function (trackType, trackTitle, object, host) { species: this.genomeViewer.species, cacheConfig: { chunkSize: 5000 - }, - filters: {}, - options: {}, - featureConfig: FEATURE_CONFIG.vcf + } }); // var renderer = new FeatureRenderer('vcf'); // renderer.on({ diff --git a/src/gm-config.js b/src/gm-config.js index 9ed7113..912a5a3 100755 --- a/src/gm-config.js +++ b/src/gm-config.js @@ -43,7 +43,8 @@ REGIONPANELHIDDEN = true; /** List of available species in the cellbase service **/ -var POPULAR_SPECIES = ["Homo sapiens", "Mus musculus", "Danio rerio", "Drosophila melanogaster", "Saccharomyces cerevisiae", "Plasmodium falciparum", "Arabidopsis thaliana", "Citrus Clementina"]; +//var POPULAR_SPECIES = ["Homo sapiens", "Mus musculus", "Danio rerio", "Drosophila melanogaster", "Saccharomyces cerevisiae", "Plasmodium falciparum", "Arabidopsis thaliana", "Citrus Clementina"]; +var POPULAR_SPECIES = ["Homo sapiens"]; var AVAILABLE_SPECIES = { "text": "Species", @@ -51,73 +52,74 @@ var AVAILABLE_SPECIES = { { "text": "Vertebrates", "items": [ - {"text": "Bos taurus", "assembly": "UMD3.1", "region": {"chromosome": "1", "start": 1000000, "end": 1000000}, "chromosomes": ["1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", "15", "16", "17", "18", "19", "20", "21", "22", "23", "24", "25", "26", "27", "28", "29", "X", "MT"], "url": "ftp://ftp.ensembl.org/pub/release-71/"}, - {"text": "Canis familiaris", "assembly": "CanFam3.1", "region": {"chromosome": "1", "start": 1000000, "end": 1000000}, "chromosomes": ["1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", "15", "16", "17", "18", "19", "20", "21", "22", "23", "24", "25", "26", "27", "28", "29", "30", "31", "32", "33", "34", "35", "36", "37", "38", "X", "MT"], "url": "ftp://ftp.ensembl.org/pub/release-71/"}, - {"text": "Ciona intestinalis", "assembly": "KH", "region": {"chromosome": "1", "start": 1000000, "end": 1000000}, "chromosomes": ["1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", "MT"], "url": "ftp://ftp.ensembl.org/pub/release-71/"}, - {"text": "Danio rerio", "assembly": "Zv9", "region": {"chromosome": "1", "start": 1000000, "end": 1000000}, "chromosomes": ["1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", "15", "16", "17", "18", "19", "20", "21", "22", "23", "24", "25", "X", "Y", "MT"], "url": "ftp://ftp.ensembl.org/pub/release-71/"}, - {"text": "Equus caballus", "assembly": "EquCab2", "region": {"chromosome": "1", "start": 1000000, "end": 1000000}, "chromosomes": ["1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", "15", "16", "17", "18", "19", "20", "21", "22", "23", "24", "25", "26", "27", "28", "29", "30", "31", "X", "MT"], "url": "ftp://ftp.ensembl.org/pub/release-71/"}, - {"text": "Felis catus", "assembly": "Felis_catus_6.2", "region": {"chromosome": "1", "start": 1000000, "end": 1000000}, "chromosomes": ["A1", "A2", "A3", "B1", "B2", "B3", "B4", "C1", "C2", "D1", "D2", "D3", "D4", "E1", "E2", "E3", "F1", "F2", "X", "MT"], "url": "ftp://ftp.ensembl.org/pub/release-71/"}, - {"text": "Gallus gallus", "assembly": "Galgal4", "region": {"chromosome": "1", "start": 1000000, "end": 1000000}, "chromosomes": ["1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", "15", "16", "17", "18", "19", "20", "21", "22", "23", "24", "25", "26", "27", "28", "32", "W", "Z", "MT"], "url": "ftp://ftp.ensembl.org/pub/release-71/"}, - {"text": "Gorilla gorilla", "assembly": "gorGor3.1", "region": {"chromosome": "1", "start": 1000000, "end": 1000000}, "chromosomes": ["1", "2a", "2b", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", "15", "16", "17", "18", "19", "20", "21", "22", "X", "MT"], "url": "ftp://ftp.ensembl.org/pub/release-71/"}, +// {"text": "Bos taurus", "assembly": "UMD3.1", "region": {"chromosome": "1", "start": 1000000, "end": 1000000}, "chromosomes": ["1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", "15", "16", "17", "18", "19", "20", "21", "22", "23", "24", "25", "26", "27", "28", "29", "X", "MT"], "url": "ftp://ftp.ensembl.org/pub/release-71/"}, +// {"text": "Canis familiaris", "assembly": "CanFam3.1", "region": {"chromosome": "1", "start": 1000000, "end": 1000000}, "chromosomes": ["1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", "15", "16", "17", "18", "19", "20", "21", "22", "23", "24", "25", "26", "27", "28", "29", "30", "31", "32", "33", "34", "35", "36", "37", "38", "X", "MT"], "url": "ftp://ftp.ensembl.org/pub/release-71/"}, +// {"text": "Ciona intestinalis", "assembly": "KH", "region": {"chromosome": "1", "start": 1000000, "end": 1000000}, "chromosomes": ["1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", "MT"], "url": "ftp://ftp.ensembl.org/pub/release-71/"}, +// {"text": "Danio rerio", "assembly": "Zv9", "region": {"chromosome": "1", "start": 1000000, "end": 1000000}, "chromosomes": ["1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", "15", "16", "17", "18", "19", "20", "21", "22", "23", "24", "25", "X", "Y", "MT"], "url": "ftp://ftp.ensembl.org/pub/release-71/"}, +// {"text": "Equus caballus", "assembly": "EquCab2", "region": {"chromosome": "1", "start": 1000000, "end": 1000000}, "chromosomes": ["1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", "15", "16", "17", "18", "19", "20", "21", "22", "23", "24", "25", "26", "27", "28", "29", "30", "31", "X", "MT"], "url": "ftp://ftp.ensembl.org/pub/release-71/"}, +// {"text": "Felis catus", "assembly": "Felis_catus_6.2", "region": {"chromosome": "1", "start": 1000000, "end": 1000000}, "chromosomes": ["A1", "A2", "A3", "B1", "B2", "B3", "B4", "C1", "C2", "D1", "D2", "D3", "D4", "E1", "E2", "E3", "F1", "F2", "X", "MT"], "url": "ftp://ftp.ensembl.org/pub/release-71/"}, +// {"text": "Gallus gallus", "assembly": "Galgal4", "region": {"chromosome": "1", "start": 1000000, "end": 1000000}, "chromosomes": ["1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", "15", "16", "17", "18", "19", "20", "21", "22", "23", "24", "25", "26", "27", "28", "32", "W", "Z", "MT"], "url": "ftp://ftp.ensembl.org/pub/release-71/"}, +// {"text": "Gorilla gorilla", "assembly": "gorGor3.1", "region": {"chromosome": "1", "start": 1000000, "end": 1000000}, "chromosomes": ["1", "2a", "2b", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", "15", "16", "17", "18", "19", "20", "21", "22", "X", "MT"], "url": "ftp://ftp.ensembl.org/pub/release-71/"}, {"text": "Homo sapiens", "assembly": "GRCh37.p10", "region": {"chromosome": "13", "start": 32889611, "end": 32973805}, "chromosomes": ["1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", "15", "16", "17", "18", "19", "20", "21", "22", "X", "Y", "MT"], "url": "ftp://ftp.ensembl.org/pub/release-71/"}, // {"text": "Homo sapiens", "assembly": "GRCh37.p10", "region": {"chromosome": "20", "start": 32878277, "end": 32878277}, "chromosomes": ["1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", "15", "16", "17", "18", "19", "20", "21", "22", "X", "Y", "MT"], "url": "ftp://ftp.ensembl.org/pub/release-71/"}, // {"text": "Homo sapiens", "assembly": "GRCh37.p10", "region": {"chromosome": "13", "start": 32889599, "end": 32889739}, "chromosomes": ["1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", "15", "16", "17", "18", "19", "20", "21", "22", "X", "Y", "MT"], "url": "ftp://ftp.ensembl.org/pub/release-71/"}, // {"text": "Homo sapiens", "assembly": "GRCh37.p10", "region": {"chromosome": "1", "start": 32877109, "end": 32882337}, "chromosomes": ["1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", "15", "16", "17", "18", "19", "20", "21", "22", "X", "Y", "MT"], "url": "ftp://ftp.ensembl.org/pub/release-71/"}, - {"text": "Macaca mulatta", "assembly": "MMUL_1.0", "region": {"chromosome": "1", "start": 1000000, "end": 1000000}, "chromosomes": ["1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", "15", "16", "17", "18", "19", "20", "X", "MT"], "url": "ftp://ftp.ensembl.org/pub/release-71/"}, - {"text": "Mus musculus", "assembly": "GRCm38.p1", "region": {"chromosome": "1", "start": 18422009, "end": 18422009}, "chromosomes": ["1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", "15", "16", "17", "18", "19", "X", "Y", "MT"], "url": "ftp://ftp.ensembl.org/pub/release-71/"}, - {"text": "Oryctolagus cuniculus", "assembly": "oryCun2", "region": {"chromosome": "1", "start": 1000000, "end": 1000000}, "chromosomes": ["1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", "15", "16", "17", "18", "19", "20", "21", "X", "MT"], "url": "ftp://ftp.ensembl.org/pub/release-71/"}, - {"text": "Pan troglodytes", "assembly": "CHIMP2.1.4", "region": {"chromosome": "1", "start": 1000000, "end": 1000000}, "chromosomes": ["1", "2A", "2B", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", "15", "16", "17", "18", "19", "20", "21", "22", "X", "Y", "MT"], "url": "ftp://ftp.ensembl.org/pub/release-71/"}, - {"text": "Pongo abelii", "assembly": "PPYG2", "region": {"chromosome": "1", "start": 1000000, "end": 1000000}, "chromosomes": ["1", "2a", "2b", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", "15", "16", "17", "18", "19", "20", "21", "22", "X", "Un", "MT"], "url": "ftp://ftp.ensembl.org/pub/release-71/"}, - {"text": "Rattus norvegicus", "assembly": "Rnor_5.0", "region": {"chromosome": "1", "start": 1000000, "end": 1000000}, "chromosomes": ["1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", "15", "16", "17", "18", "19", "20", "X", "MT"], "url": "ftp://ftp.ensembl.org/pub/release-71/"}, - {"text": "Sus scrofa", "assembly": "Sscrofa10.2", "region": {"chromosome": "1", "start": 1000000, "end": 1000000}, "chromosomes": ["1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", "15", "16", "17", "18", "X", "Y", "MT"], "url": "ftp://ftp.ensembl.org/pub/release-71/"} +// {"text": "Macaca mulatta", "assembly": "MMUL_1.0", "region": {"chromosome": "1", "start": 1000000, "end": 1000000}, "chromosomes": ["1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", "15", "16", "17", "18", "19", "20", "X", "MT"], "url": "ftp://ftp.ensembl.org/pub/release-71/"}, +// {"text": "Mus musculus", "assembly": "GRCm38.p1", "region": {"chromosome": "1", "start": 18422009, "end": 18422009}, "chromosomes": ["1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", "15", "16", "17", "18", "19", "X", "Y", "MT"], "url": "ftp://ftp.ensembl.org/pub/release-71/"}, +// {"text": "Oryctolagus cuniculus", "assembly": "oryCun2", "region": {"chromosome": "1", "start": 1000000, "end": 1000000}, "chromosomes": ["1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", "15", "16", "17", "18", "19", "20", "21", "X", "MT"], "url": "ftp://ftp.ensembl.org/pub/release-71/"}, +// {"text": "Pan troglodytes", "assembly": "CHIMP2.1.4", "region": {"chromosome": "1", "start": 1000000, "end": 1000000}, "chromosomes": ["1", "2A", "2B", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", "15", "16", "17", "18", "19", "20", "21", "22", "X", "Y", "MT"], "url": "ftp://ftp.ensembl.org/pub/release-71/"}, +// {"text": "Pongo abelii", "assembly": "PPYG2", "region": {"chromosome": "1", "start": 1000000, "end": 1000000}, "chromosomes": ["1", "2a", "2b", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", "15", "16", "17", "18", "19", "20", "21", "22", "X", "Un", "MT"], "url": "ftp://ftp.ensembl.org/pub/release-71/"}, +// {"text": "Rattus norvegicus", "assembly": "Rnor_5.0", "region": {"chromosome": "1", "start": 1000000, "end": 1000000}, "chromosomes": ["1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", "15", "16", "17", "18", "19", "20", "X", "MT"], "url": "ftp://ftp.ensembl.org/pub/release-71/"}, +// {"text": "Sus scrofa", "assembly": "Sscrofa10.2", "region": {"chromosome": "1", "start": 1000000, "end": 1000000}, "chromosomes": ["1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", "15", "16", "17", "18", "X", "Y", "MT"], "url": "ftp://ftp.ensembl.org/pub/release-71/"} ] }, - { - "text": "Metazoa", - "items": [ - {"text": "Anopheles gambiae", "assembly": "AgamP3", "region": {"chromosome": "2L", "start": 1000000, "end": 1000000}, "chromosomes": ["2L", "2R", "3L", "3R", "X"], "url": "ftp://ftp.ensemblgenomes.org/pub/metazoa/release-18/"}, - {"text": "Caenorhabditis elegans", "assembly": "WBcel235", "region": {"chromosome": "I", "start": 1000000, "end": 1000000}, "chromosomes": ["I", "II", "III", "IV", "V", "X", "MtDNA"], "url": "ftp://ftp.ensemblgenomes.org/pub/metazoa/release-18/fasta/"}, - {"text": "Drosophila melanogaster", "assembly": "BDGP5", "region": {"chromosome": "2L", "start": 1000000, "end": 1000000}, "chromosomes": ["2L", "2LHet", "2R", "2RHet", "3L", "3LHet", "3R", "3RHet", "4", "U", "Uextra", "X", "XHet", "YHet", "dmel_mitochondrion_genome"], "url": "ftp://ftp.ensemblgenomes.org/pub/metazoa/release-18/"}, - {"text": "Drosophila simulans", "assembly": "WUGSC1", "region": {"chromosome": "2L", "start": 1000000, "end": 1000000}, "chromosomes": ["2L", "2R", "3L", "3R", "4", "X"], "url": "ftp://ftp.ensemblgenomes.org/pub/metazoa/release-18/"}, - {"text": "Drosophila yakuba", "assembly": "dyak_r1.3", "region": {"chromosome": "2L", "start": 1000000, "end": 1000000}, "chromosomes": ["2L", "2R", "3L", "3R", "4", "chr2h", "chr3h", "chrXh", "chrYh", "X"], "url": "ftp://ftp.ensemblgenomes.org/pub/metazoa/release-18/"} - ] - }, - { - "text": "Fungi", - "items": [ - {"text": "Aspergillus fumigatus", "assembly": "CADRE", "region": {"chromosome": "I", "start": 1000000, "end": 1000000}, "chromosomes": ["I", "II", "III", "IV", "V", "VI", "VII", "VIII", "MT"], "url": "ftp://ftp.ensemblgenomes.org/pub/fungi/release-18/"}, - {"text": "Aspergillus nidulans", "assembly": "ASM1142v1", "region": {"chromosome": "I", "start": 1000000, "end": 1000000}, "chromosomes": ["I", "II", "III", "IV", "V", "VI", "VII", "VIII"], "url": "ftp://ftp.ensemblgenomes.org/pub/fungi/release-18/"}, - {"text": "Aspergillus niger", "assembly": "CADRE", "region": {"chromosome": "I", "start": 1000000, "end": 1000000}, "chromosomes": ["I", "II", "III", "IV", "V", "VI", "VII", "VIII"], "url": "ftp://ftp.ensemblgenomes.org/pub/fungi/release-18/"}, - {"text": "Aspergillus oryzae", "assembly": "CADRE2", "region": {"chromosome": "I", "start": 1000000, "end": 1000000}, "chromosomes": ["I", "II", "III", "IV", "V", "VI", "VII", "VIII"], "url": "ftp://ftp.ensemblgenomes.org/pub/fungi/release-18/"}, - {"text": "Saccharomyces cerevisiae", "assembly": "SacCer_Apr2011", "region": {"chromosome": "I", "start": 1000000, "end": 1000000}, "chromosomes": ["I", "II", "III", "IV", "V", "VI", "VII", "VIII", "IX", "X", "XI", "XII", "XIII", "XIV", "XV", "XVI", "Mito"], "url": "ftp://ftp.ensemblgenomes.org/pub/fungi/release-18/"}, - {"text": "Schizosaccharomyces pombe", "assembly": "ASM294v1", "region": {"chromosome": "I", "start": 1000000, "end": 1000000}, "chromosomes": ["AB325691", "I", "II", "III", "MT", "MTR"], "url": "ftp://ftp.ensemblgenomes.org/pub/fungi/release-18/"} - ] - }, - { - "text": "Protist", - "items": [ - {"text": "Leishmania major", "assembly": "ASM272v2", "region": {"chromosome": "1", "start": 1000000, "end": 1000000}, "chromosomes": ["1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", "15", "16", "17", "18", "19", "20", "21", "22", "23", "24", "25", "26", "27", "28", "29", "30", "31", "32", "33", "34", "35", "36"], "url": "ftp://ftp.ensemblgenomes.org/pub/protists/release-18/"}, - {"text": "Plasmodium falciparum", "assembly": "ASM276v1", "region": {"chromosome": "01", "start": 1000000, "end": 1000000}, "chromosomes": ["01", "02", "03", "04", "05", "06", "07", "08", "09", "10", "11", "12", "13", "14"], "url": "ftp://ftp.ensemblgenomes.org/pub/protists/release-18/"} - ] - }, - { - "text": "Plants", - "items": [ - {"text": "Arabidopsis lyrata", "assembly": "v.1.0", "region": {"chromosome": "1", "start": 1000000, "end": 1000000}, "chromosomes": ["1", "2", "3", "4", "5", "6", "7", "8"], "url": "ftp://ftp.ensemblgenomes.org/pub/plants/release-18/"}, - {"text": "Arabidopsis thaliana", "assembly": "TAIR10", "region": {"chromosome": "1", "start": 1000000, "end": 1000000}, "chromosomes": ["1", "2", "3", "4", "5", "Mt", "Pt"], "url": "ftp://ftp.ensemblgenomes.org/pub/plants/release-18/"}, - {"text": "Brachypodium distachyon", "assembly": "v1.0", "region": {"chromosome": "1", "start": 1000000, "end": 1000000}, "chromosomes": ["1", "2", "3", "4", "5"], "url": "ftp://ftp.ensemblgenomes.org/pub/plants/release-18/"}, - {"text": "Glycine max", "assembly": "V1.0", "region": {"chromosome": "Gm01", "start": 1000000, "end": 1000000}, "chromosomes": ["Gm01", "Gm02", "Gm03", "Gm04", "Gm05", "Gm06", "Gm07", "Gm08", "Gm09", "Gm10", "Gm11", "Gm12", "Gm13", "Gm14", "Gm15", "Gm16", "Gm17", "Gm18", "Gm19", "Gm20"], "url": "ftp://ftp.ensemblgenomes.org/pub/plants/release-18/"}, - {"text": "Oryza sativa", "assembly": "MSU6", "region": {"chromosome": "1", "start": 1000000, "end": 1000000}, "chromosomes": ["1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "Mt", "Pt", "Sy", "Un"], "url": "ftp://ftp.ensemblgenomes.org/pub/plants/release-18/"}, - {"text": "Vitis vinifera", "assembly": "IGGP_12x", "region": {"chromosome": "1", "start": 1000000, "end": 1000000}, "chromosomes": ["1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", "15", "16", "17", "18", "19", "Un"], "url": "ftp://ftp.ensemblgenomes.org/pub/plants/release-18/"}, - {"text": "Zea mays", "assembly": "AGPv3", "region": {"chromosome": "1", "start": 1000000, "end": 1000000}, "chromosomes": ["1", "2", "3", "4", "5", "6", "7", "8", "9", "Mt", "Pt"], "url": "ftp://ftp.ensemblgenomes.org/pub/plants/release-18/"} -// {"text": "Citrus Clementina", "assembly": "1.0", "region":{"chromosome":"scaffold_1","start":233423,"end":236969}, "chromosomes": [], "url": ""} - ] - } +// { +// "text": "Metazoa", +// "items": [ +// {"text": "Anopheles gambiae", "assembly": "AgamP3", "region": {"chromosome": "2L", "start": 1000000, "end": 1000000}, "chromosomes": ["2L", "2R", "3L", "3R", "X"], "url": "ftp://ftp.ensemblgenomes.org/pub/metazoa/release-18/"}, +// {"text": "Caenorhabditis elegans", "assembly": "WBcel235", "region": {"chromosome": "I", "start": 1000000, "end": 1000000}, "chromosomes": ["I", "II", "III", "IV", "V", "X", "MtDNA"], "url": "ftp://ftp.ensemblgenomes.org/pub/metazoa/release-18/fasta/"}, +// {"text": "Drosophila melanogaster", "assembly": "BDGP5", "region": {"chromosome": "2L", "start": 1000000, "end": 1000000}, "chromosomes": ["2L", "2LHet", "2R", "2RHet", "3L", "3LHet", "3R", "3RHet", "4", "U", "Uextra", "X", "XHet", "YHet", "dmel_mitochondrion_genome"], "url": "ftp://ftp.ensemblgenomes.org/pub/metazoa/release-18/"}, +// {"text": "Drosophila simulans", "assembly": "WUGSC1", "region": {"chromosome": "2L", "start": 1000000, "end": 1000000}, "chromosomes": ["2L", "2R", "3L", "3R", "4", "X"], "url": "ftp://ftp.ensemblgenomes.org/pub/metazoa/release-18/"}, +// {"text": "Drosophila yakuba", "assembly": "dyak_r1.3", "region": {"chromosome": "2L", "start": 1000000, "end": 1000000}, "chromosomes": ["2L", "2R", "3L", "3R", "4", "chr2h", "chr3h", "chrXh", "chrYh", "X"], "url": "ftp://ftp.ensemblgenomes.org/pub/metazoa/release-18/"} +// ] +// }, +// { +// "text": "Fungi", +// "items": [ +// {"text": "Aspergillus fumigatus", "assembly": "CADRE", "region": {"chromosome": "I", "start": 1000000, "end": 1000000}, "chromosomes": ["I", "II", "III", "IV", "V", "VI", "VII", "VIII", "MT"], "url": "ftp://ftp.ensemblgenomes.org/pub/fungi/release-18/"}, +// {"text": "Aspergillus nidulans", "assembly": "ASM1142v1", "region": {"chromosome": "I", "start": 1000000, "end": 1000000}, "chromosomes": ["I", "II", "III", "IV", "V", "VI", "VII", "VIII"], "url": "ftp://ftp.ensemblgenomes.org/pub/fungi/release-18/"}, +// {"text": "Aspergillus niger", "assembly": "CADRE", "region": {"chromosome": "I", "start": 1000000, "end": 1000000}, "chromosomes": ["I", "II", "III", "IV", "V", "VI", "VII", "VIII"], "url": "ftp://ftp.ensemblgenomes.org/pub/fungi/release-18/"}, +// {"text": "Aspergillus oryzae", "assembly": "CADRE2", "region": {"chromosome": "I", "start": 1000000, "end": 1000000}, "chromosomes": ["I", "II", "III", "IV", "V", "VI", "VII", "VIII"], "url": "ftp://ftp.ensemblgenomes.org/pub/fungi/release-18/"}, +// {"text": "Saccharomyces cerevisiae", "assembly": "SacCer_Apr2011", "region": {"chromosome": "I", "start": 1000000, "end": 1000000}, "chromosomes": ["I", "II", "III", "IV", "V", "VI", "VII", "VIII", "IX", "X", "XI", "XII", "XIII", "XIV", "XV", "XVI", "Mito"], "url": "ftp://ftp.ensemblgenomes.org/pub/fungi/release-18/"}, +// {"text": "Schizosaccharomyces pombe", "assembly": "ASM294v1", "region": {"chromosome": "I", "start": 1000000, "end": 1000000}, "chromosomes": ["AB325691", "I", "II", "III", "MT", "MTR"], "url": "ftp://ftp.ensemblgenomes.org/pub/fungi/release-18/"} +// ] +// }, +// { +// "text": "Protist", +// "items": [ +// {"text": "Leishmania major", "assembly": "ASM272v2", "region": {"chromosome": "1", "start": 1000000, "end": 1000000}, "chromosomes": ["1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", "15", "16", "17", "18", "19", "20", "21", "22", "23", "24", "25", "26", "27", "28", "29", "30", "31", "32", "33", "34", "35", "36"], "url": "ftp://ftp.ensemblgenomes.org/pub/protists/release-18/"}, +// {"text": "Plasmodium falciparum", "assembly": "ASM276v1", "region": {"chromosome": "01", "start": 1000000, "end": 1000000}, "chromosomes": ["01", "02", "03", "04", "05", "06", "07", "08", "09", "10", "11", "12", "13", "14"], "url": "ftp://ftp.ensemblgenomes.org/pub/protists/release-18/"} +// ] +// }, +// { +// "text": "Plants", +// "items": [ +// {"text": "Arabidopsis lyrata", "assembly": "v.1.0", "region": {"chromosome": "1", "start": 1000000, "end": 1000000}, "chromosomes": ["1", "2", "3", "4", "5", "6", "7", "8"], "url": "ftp://ftp.ensemblgenomes.org/pub/plants/release-18/"}, +// {"text": "Arabidopsis thaliana", "assembly": "TAIR10", "region": {"chromosome": "1", "start": 1000000, "end": 1000000}, "chromosomes": ["1", "2", "3", "4", "5", "Mt", "Pt"], "url": "ftp://ftp.ensemblgenomes.org/pub/plants/release-18/"}, +// {"text": "Brachypodium distachyon", "assembly": "v1.0", "region": {"chromosome": "1", "start": 1000000, "end": 1000000}, "chromosomes": ["1", "2", "3", "4", "5"], "url": "ftp://ftp.ensemblgenomes.org/pub/plants/release-18/"}, +// {"text": "Glycine max", "assembly": "V1.0", "region": {"chromosome": "Gm01", "start": 1000000, "end": 1000000}, "chromosomes": ["Gm01", "Gm02", "Gm03", "Gm04", "Gm05", "Gm06", "Gm07", "Gm08", "Gm09", "Gm10", "Gm11", "Gm12", "Gm13", "Gm14", "Gm15", "Gm16", "Gm17", "Gm18", "Gm19", "Gm20"], "url": "ftp://ftp.ensemblgenomes.org/pub/plants/release-18/"}, +// {"text": "Oryza sativa", "assembly": "MSU6", "region": {"chromosome": "1", "start": 1000000, "end": 1000000}, "chromosomes": ["1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "Mt", "Pt", "Sy", "Un"], "url": "ftp://ftp.ensemblgenomes.org/pub/plants/release-18/"}, +// {"text": "Vitis vinifera", "assembly": "IGGP_12x", "region": {"chromosome": "1", "start": 1000000, "end": 1000000}, "chromosomes": ["1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", "15", "16", "17", "18", "19", "Un"], "url": "ftp://ftp.ensemblgenomes.org/pub/plants/release-18/"}, +// {"text": "Zea mays", "assembly": "AGPv3", "region": {"chromosome": "1", "start": 1000000, "end": 1000000}, "chromosomes": ["1", "2", "3", "4", "5", "6", "7", "8", "9", "Mt", "Pt"], "url": "ftp://ftp.ensemblgenomes.org/pub/plants/release-18/"} +//// {"text": "Citrus Clementina", "assembly": "1.0", "region":{"chromosome":"scaffold_1","start":233423,"end":236969}, "chromosomes": [], "url": ""} +// ] +// } ] }; /** Reference to a species from the list to be shown at start **/ -var DEFAULT_SPECIES = AVAILABLE_SPECIES.items[0].items[8]; +//var DEFAULT_SPECIES = AVAILABLE_SPECIES.items[0].items[8]; +var DEFAULT_SPECIES = AVAILABLE_SPECIES.items[0].items[0]; var SPECIES_TRACKS_GROUP = { diff --git a/src/gm-navigation-bar.js b/src/gm-navigation-bar.js index d32f928..85bfe8c 100644 --- a/src/gm-navigation-bar.js +++ b/src/gm-navigation-bar.js @@ -252,10 +252,6 @@ GmNavigationBar.prototype = { toggleHandler: function () { _this.trigger('configuration-button:change', {selected: this.pressed, sender: _this}); } -// menu: { -// id: this.id + 'configurationMenu', -// plain: true -// } } ] }); @@ -269,9 +265,6 @@ GmNavigationBar.prototype = { this.rendered = true; }, - setConfigurationMenu: function (panel) { - Ext.getCmp(this.id + 'configurationMenu').add(panel); - }, _addRegionHistoryMenuItem: function (region) { var _this = this; @@ -281,7 +274,6 @@ GmNavigationBar.prototype = { console.log(this.text); _this.region.parse(this.text); Ext.getCmp(_this.id + 'regionField').setValue(_this.region.toString()); - _this._recalculateZoom(); _this.trigger('region:change', {region: _this.region, sender: _this}); } }); @@ -336,7 +328,6 @@ GmNavigationBar.prototype = { button.setText(chr); _this.region.chromosome = chr; Ext.getCmp(_this.id + 'regionField').setValue(_this.region.toString()); - _this._recalculateZoom(); _this._addRegionHistoryMenuItem(_this.region); _this.trigger('region:change', {region: _this.region, sender: _this}); } @@ -361,7 +352,6 @@ GmNavigationBar.prototype = { // console.log(this.text); // button.setText(this.text); // _this.region.chromosome = this.text; -// _this._recalculateZoom(); // _this._addRegionHistoryMenuItem(_this.region); // _this.trigger('region:change', {region: _this.region, sender: _this}); // } @@ -440,7 +430,6 @@ GmNavigationBar.prototype = { } else { this.region.load(reg); Ext.getCmp(this.id + 'chromosomesButton').setText(this.region.chromosome); - this._recalculateZoom(); this._addRegionHistoryMenuItem(this.region); this.trigger('region:change', {region: this.region, sender: this}); } @@ -504,18 +493,13 @@ GmNavigationBar.prototype = { _handleZoomOutButton: function () { this._handleZoomSlider(Math.max(0, this.zoom - 1)); - Ext.getCmp(this.id + 'zoomSlider').setValue(this.zoom); }, _handleZoomSlider: function (value) { this.zoom = value; - this.region.load(this._calculateRegionByZoom()); - Ext.getCmp(this.id + 'regionField').setValue(this.region.toString()); - this._addRegionHistoryMenuItem(this.region); - this.trigger('region:change', {region: this.region, sender: this}); + this.trigger('zoom:change', {zoom: this.zoom, sender: this}); }, _handleZoomInButton: function () { this._handleZoomSlider(Math.min(100, this.zoom + 1)); - Ext.getCmp(this.id + 'zoomSlider').setValue(this.zoom); }, _handleMoveRegion: function (positions) { @@ -542,23 +526,20 @@ GmNavigationBar.prototype = { this.region.load(region); Ext.getCmp(this.id + 'chromosomesButton').setText(this.region.chromosome); Ext.getCmp(this.id + 'regionField').setValue(this.region.toString()); - this._recalculateZoom(); this._addRegionHistoryMenuItem(region); }, moveRegion: function (region) { this.region.load(region); Ext.getCmp(this.id + 'chromosomesButton').setText(this.region.chromosome); Ext.getCmp(this.id + 'regionField').setValue(this.region.toString()); - this._recalculateZoom(); }, setWidth: function (width) { this.width = width; - this._recalculateZoom(); }, - _recalculateZoom: function () { - this.zoom = this._calculateZoomByRegion(); + setZoom: function (zoom) { + this.zoom = zoom; Ext.getCmp(this.id + 'zoomSlider').setValue(this.zoom); }, @@ -568,19 +549,6 @@ GmNavigationBar.prototype = { return; } }, - - _calculateRegionByZoom: function () { - var zoomBaseLength = (this.width - this.svgCanvasWidthOffset) / Utils.getPixelBaseByZoom(this.zoom); - var centerPosition = this.region.center(); - var aux = Math.ceil((zoomBaseLength / 2) - 1); - var start = Math.floor(centerPosition - aux); - var end = Math.floor(centerPosition + aux); - return {start: start, end: end}; - }, - _calculateZoomByRegion: function () { - return Utils.getZoomByPixelBase((this.width - this.svgCanvasWidthOffset) / this.region.length()); - }, - _createSearchComboBox: function () { var _this = this; @@ -712,160 +680,4 @@ GmNavigationBar.prototype = { this.fullscreenButton.setVisible(bool); } -} - -// -// -////Creates the species empty menu if not exist and returns it -//GenomeViewer.prototype._getSpeciesMenu = function() { -// //items must be added by using setSpeciesMenu() -// if(this._specieMenu == null){ -// this._specieMenu = Ext.create('Ext.menu.Menu', { -// id:this.id+"_specieMenu", -// margin : '0 0 10 0', -// floating : true, -// plain:true, -// items : [] -// }); -// } -// return this._specieMenu; -//}; -////Sets the species buttons in the menu -//GenomeViewer.prototype.setSpeciesMenu = function(speciesObj, popular) { -// var _this = this; -// -// var menu = this._getSpeciesMenu(); -// //Auto generate menu items depending of AVAILABLE_SPECIES config -// menu.hide();//Hide the menu panel before remove -// menu.removeAll(); // Remove the old species -// -// var popularSpecies = []; -// -// for(var i = 0; i < speciesObj.items.length; i++){ -// var phyloSpecies = speciesObj.items[i].items; -// var pyhlo = speciesObj.items[i]; -// pyhlo.menu = {items:phyloSpecies}; -// for(var j = 0; j < phyloSpecies.length; j++){ -// var species = phyloSpecies[j]; -// var text = species.text+' ('+species.assembly+')'; -//// species.id = this.id+text; -// species.name = species.text; -// species.species = Utils.getSpeciesCode(species.text); -// species.text = text; -// species.speciesObj = species; -// species.iconCls = ''; -//// species.icon = 'http://static.ensembl.org/i/species/48/Danio_rerio.png'; -// species.handler = function(me){ -// _this.setSpecies(me.speciesObj); -// }; -// -// if(popular.indexOf(species.name) != -1){ -// popularSpecies.push(species); -// } -// } -// } -// popularSpecies.sort(function(a, b) {return a.text.localeCompare(b.text);}); -// popularSpecies.push('-'); -// var items = popularSpecies.concat(speciesObj.items); -// menu.add(items); -//}; -// -////Sets the new specie and fires an event -//GenomeViewer.prototype.setSpecies = function(data){ -// this.region.load(data.region); -// data["sender"]="setSpecies"; -// this.onRegionChange.notify(data); -//}; -// -//GenomeViewer.prototype._getChromosomeMenu = function() { -// var _this = this; -// var chrStore = Ext.create('Ext.data.Store', { -// id:this.id+"chrStore", -// fields: ["name"], -// autoLoad:false -// }); -// /*Chromolendar*/ -// var chrView = Ext.create('Ext.view.View', { -// id:this.id+"chrView", -// width:125, -// style:'background-color:#fff', -// store : chrStore, -// selModel: { -// mode: 'SINGLE', -// listeners: { -// selectionchange:function(este,selNodes){ -// if(selNodes.length>0){ -// _this.region.chromosome = selNodes[0].data.name; -// _this.onRegionChange.notify({sender:"_getChromosomeMenu"}); -//// _this.setChromosome(selNodes[0].data.name); -// } -// chromosomeMenu.hide(); -// } -// } -// }, -// cls: 'list', -// trackOver: true, -// overItemCls: 'list-item-hover', -// itemSelector: '.chromosome-item', -// tpl: '
{name}
' -//// tpl: '
chr {name}
' -// }); -// /*END chromolendar*/ -// -// var chromosomeMenu = Ext.create('Ext.menu.Menu', { -// id:this.id+"chromosomeMenu", -// almacen :chrStore, -// plain: true, -// items : [/*{xtype:'textfield', width:125},*/chrView] -//// items:[ //TODO alternative -//// { -//// xtype: 'buttongroup', -//// id:this.id+'chrButtonGroup', -////// title: 'User options', -//// columns: 5, -//// defaults: { -//// xtype: 'button', -////// scale: 'large', -//// iconAlign: 'left', -//// handler:function(){} -//// }, -////// items : [chrView] -////// items: [] -//// } -//// ] -// }); -// this._updateChrStore(); -// return chromosomeMenu; -//}; -// -//GenomeViewer.prototype._updateChrStore = function(){ -// var _this = this; -// var chrStore = Ext.getStore(this.id+"chrStore"); -// var chrView = Ext.getCmp(this.id+"chrView"); -//// var chrButtonGroup = Ext.getCmp(this.id+"chrButtonGroup"); -// var cellBaseManager = new CellBaseManager(this.species); -// cellBaseManager.success.addEventListener(function(sender,data){ -// var chromosomeData = []; -// var chrItems = []; -// var sortfunction = function(a, b) { -// var IsNumber = true; -// for (var i = 0; i < a.length && IsNumber == true; i++) { -// if (isNaN(a[i])) { -// IsNumber = false; -// } -// } -// if (!IsNumber) return 1; -// return (a - b); -// }; -// data.result.sort(sortfunction); -// for (var i = 0; i < data.result.length; i++) { -// chromosomeData.push({'name':data.result[i]}); -//// chrItems.push({text:data.result[i],iconAlign: 'left'}); -// } -// chrStore.loadData(chromosomeData); -//// chrButtonGroup.removeAll(); -//// chrButtonGroup.add(chrItems); -//// chrView.getSelectionModel().select(chrStore.find("name",_this.chromosome)); -// }); -// cellBaseManager.get('feature', 'chromosome', null, 'list'); -//}; +} \ No newline at end of file From 23f11e1c398ed7d32a52a1c31b0d691029a2106c Mon Sep 17 00:00:00 2001 From: frasator Date: Sat, 30 Nov 2013 15:26:28 +0100 Subject: [PATCH 45/61] modified some js paths --- src/genome-maps.html | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/genome-maps.html b/src/genome-maps.html index 816ea26..2ff12f4 100755 --- a/src/genome-maps.html +++ b/src/genome-maps.html @@ -99,9 +99,9 @@ - - - + + + From bbc20ed74ecada77d6aaca54ff3da24d691a8a40 Mon Sep 17 00:00:00 2001 From: frasator Date: Mon, 9 Dec 2013 14:52:19 +0100 Subject: [PATCH 46/61] configured track exclude params --- lib/jsorolla | 2 +- src/genome-maps.js | 11 ++++++----- 2 files changed, 7 insertions(+), 6 deletions(-) diff --git a/lib/jsorolla b/lib/jsorolla index b8c99ae..15143fe 160000 --- a/lib/jsorolla +++ b/lib/jsorolla @@ -1 +1 @@ -Subproject commit b8c99aedf4c124b1465a3b80156f438b657b235c +Subproject commit 15143fef73d3405f70e8fea9b87836d134e89dc2 diff --git a/src/genome-maps.js b/src/genome-maps.js index c2e5ca9..0f1f0b2 100644 --- a/src/genome-maps.js +++ b/src/genome-maps.js @@ -323,7 +323,7 @@ GenomeMaps.prototype = { }); genomeViewer.draw(); - var renderer = new FeatureRenderer('gene'); + var renderer = new FeatureRenderer(FEATURE_TYPES.gene); renderer.on({ 'feature:click': function (event) { console.log(event) @@ -1520,7 +1520,7 @@ GenomeMaps.prototype.addTrack = function (trackType, trackTitle, object, host) { resource: "gene", species: this.genomeViewer.species, params: { - exclude: 'transcripts.xrefs,transcripts.exons.sequence' + exclude: 'transcripts.tfbs,transcripts.xrefs,transcripts.exons.sequence' }, cacheConfig: { chunkSize: 100000 @@ -1562,11 +1562,12 @@ GenomeMaps.prototype.addTrack = function (trackType, trackTitle, object, host) { targetId: null, id: id, title: 'SNP', + featureType:'SNP', minHistogramRegionSize: 12000, maxLabelRegionSize: 3000, height: 120, - renderer: new FeatureRenderer('snp'), + renderer: new FeatureRenderer(FEATURE_TYPES.snp), dataAdapter: new CellBaseAdapter({ category: "genomic", @@ -1830,7 +1831,7 @@ GenomeMaps.prototype.addTrack = function (trackType, trackTitle, object, host) { height: 200, visibleRegionSize: 1000000, - renderer: new BamRenderer('bam'), + renderer: new BamRenderer(FEATURE_TYPES.bam), dataAdapter: new OpencgaAdapter({ category: "bam", @@ -1864,7 +1865,7 @@ GenomeMaps.prototype.addTrack = function (trackType, trackTitle, object, host) { // var vcfInfo = new VCFVariantInfoWidget(null, _this.genomeViewer.species, {adapter: adapter}).draw(event); // } // }); - var renderer = new VcfMultisampleRenderer('vcf'); + var renderer = new VcfMultisampleRenderer(FEATURE_TYPES.vcf); renderer.on({ 'feature:click': function (event) { var vcfInfo = new VCFVariantInfoWidget(null, _this.genomeViewer.species, {adapter: adapter}).draw(event); From 2acdbc765e9002d33b44dbfac979773bc2acee10 Mon Sep 17 00:00:00 2001 From: imedina Date: Thu, 12 Dec 2013 18:32:44 +0100 Subject: [PATCH 47/61] navigaation-bar: compactable function now minimizes vertical space --- lib/jsorolla | 2 +- src/gm-navigation-bar.js | 8 ++++++++ 2 files changed, 9 insertions(+), 1 deletion(-) diff --git a/lib/jsorolla b/lib/jsorolla index 7fcaeab..9f12bea 160000 --- a/lib/jsorolla +++ b/lib/jsorolla @@ -1 +1 @@ -Subproject commit 7fcaeab89ad31ef1f76a95942924f06519080a27 +Subproject commit 9f12beabb8861d925a2cd1ec0bfc292c614cdd5e diff --git a/src/gm-navigation-bar.js b/src/gm-navigation-bar.js index d32f928..33836fe 100644 --- a/src/gm-navigation-bar.js +++ b/src/gm-navigation-bar.js @@ -233,6 +233,14 @@ GmNavigationBar.prototype = { _this.trigger('autoHeight-button:click', {sender: _this}); } }, + /*{ + tooltip: 'Tracks will be compacted automatically', + iconCls: 'ocb-icon-compressed', + handler: function () { + $(".ocb-compactable").toggle(); + //_this.trigger('autoHeight-button:click', {sender: _this}); + } + },*/ '->', this._createSearchComboBox(), { From 233c6c1a16540eb03010f9274dc892bc43be0237 Mon Sep 17 00:00:00 2001 From: imedina Date: Fri, 21 Feb 2014 10:27:57 +0000 Subject: [PATCH 48/61] jsorolla: library updated to pull a bug fix --- lib/jsorolla | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/jsorolla b/lib/jsorolla index 15143fe..e8138a0 160000 --- a/lib/jsorolla +++ b/lib/jsorolla @@ -1 +1 @@ -Subproject commit 15143fef73d3405f70e8fea9b87836d134e89dc2 +Subproject commit e8138a0cd68ad73b0f14142747386a9fb2caf741 From af921ec67bde7b6cdeaeae708a6c861110139217 Mon Sep 17 00:00:00 2001 From: frasator Date: Mon, 12 May 2014 15:48:38 +0200 Subject: [PATCH 49/61] new jsorolla structure fixes, Gruntfile fixes, gene and snp track fixes --- Gruntfile.js | 149 +++++++++++++++++---------------------- lib/jsorolla | 2 +- package.json | 6 +- src/genome-maps.html | 140 ++++++++++++++++++------------------ src/genome-maps.js | 14 ++-- src/gm-config.js | 9 +-- src/gm-navigation-bar.js | 2 +- 7 files changed, 156 insertions(+), 166 deletions(-) diff --git a/Gruntfile.js b/Gruntfile.js index bf10355..232d2f1 100644 --- a/Gruntfile.js +++ b/Gruntfile.js @@ -1,117 +1,91 @@ -/*global module:false*/ module.exports = function (grunt) { - // Project configuration. grunt.initConfig({ - // Metadata. - meta: { - version: '3.1.6', - jsorolla: { - dir: '/lib/jsorolla/', - //genome viewer contains cellbse and utils - 'genomeviewer': { - version: '1.0.3', - dir: '<%= meta.jsorolla.dir %>build/genome-viewer/<%= meta.jsorolla.genomeviewer.version %>/' - }, - //opencga does not contains utils - opencga: { - version: '1.0.0', - dir: '<%= meta.jsorolla.dir %>build/opencga/<%= meta.jsorolla.opencga.version %>/' - } - } + pkg: grunt.file.readJSON('package.json'), + jsopkg: grunt.file.readJSON('lib/jsorolla/package.json'), + def: { + name: 'genome-maps', + build: 'build/<%= pkg.version %>', + jsorolla: 'lib/jsorolla' }, - banner: '/*! PROJECT_NAME - v<%= meta.version %> - ' + - '<%= grunt.template.today("yyyy-mm-dd") %>\n' + - '* http://PROJECT_WEBSITE/\n' + - '* Copyright (c) <%= grunt.template.today("yyyy") %> ' + - 'OpenCB; Licensed GPLv2 */\n', - // Task configuration. + concat: { - options: { - banner: '<%= banner %>', - stripBanners: true - }, - build: { + dist: { src: [ -// 'src/gm-config.js', 'src/gm-plugins-config.js', 'src/gm-navigation-bar.js', 'src/gm-status-bar.js', 'src/genome-maps.js' ], - dest: 'build/<%= meta.version %>/genome-maps-<%= meta.version %>.js' + dest: '<%= def.build %>/<%= def.name %>.js' } }, uglify: { options: { - banner: '<%= banner %>' + banner: '/*! <%= def.name %> <%= grunt.template.today("dd-mm-yyyy") %> */\n' }, - build: { - src: '<%= concat.build.dest %>', - dest: 'build/<%= meta.version %>/genome-maps-<%= meta.version %>.min.js' + dist: { + files: { + '<%= def.build %>/<%= def.name %>.min.js': ['<%= concat.dist.dest %>'] + } } }, copy: { build: { files: [ - { expand: true, cwd: './src', src: ['gm-config.js'], dest: 'build/<%= meta.version %>/' }, - { expand: true, cwd: './<%= meta.jsorolla.dir %>', src: ['vendor/**'], dest: 'build/<%= meta.version %>/' }, - { expand: true, cwd: './<%= meta.jsorolla.dir %>', src: ['styles/**'], dest: 'build/<%= meta.version %>/' }, // includes files in path and its subdirs - { expand: true, cwd: './<%= meta.jsorolla.genomeviewer.dir %>', src: ['genome-viewer*.js', 'gv-config.js'], dest: 'build/<%= meta.version %>/' }, - { expand: true, cwd: './<%= meta.jsorolla.opencga.dir %>', src: ['opencga*.js', 'worker*'], dest: 'build/<%= meta.version %>/' } + { expand: true, cwd: './src', src: ['gm-config.js'], dest: '<%= def.build %>/' }, + { expand: true, cwd: './<%= def.jsorolla %>', src: ['vendor/**'], dest: '<%= def.build %>/' }, + { expand: true, cwd: './<%= def.jsorolla %>', src: ['styles/**'], dest: '<%= def.build %>/' }, + { expand: true, cwd: './<%= def.jsorolla %>/src/lib', src: ['worker*'], dest: '<%= def.build %>/' }, + { expand: true, cwd: './<%= def.jsorolla %>/build/<%= jsopkg.version %>/genome-viewer/', src: ['genome-viewer*.js', 'gv-config.js'], dest: '<%= def.build %>/' } ] } }, clean: { - build: ["build/<%= meta.version %>/"] + dist: ['<%= def.build %>/'] }, - - vendorPath: 'build/<%= meta.version %>/vendor', - stylesPath: 'build/<%= meta.version %>/styles', htmlbuild: { build: { - src: 'src/genome-maps.html', - dest: 'build/<%= meta.version %>/', + src: 'src/<%= def.name %>.html', + dest: '<%= def.build %>/', options: { beautify: true, - scripts: { - 'js': 'build/<%= meta.version %>/genome-maps-<%= meta.version %>.min.js', + styles: { 'vendor': [ - 'build/<%= meta.version %>/vendor/underscore*.js', - 'build/<%= meta.version %>/vendor/backbone*.js', - 'build/<%= meta.version %>/vendor/jquery.min.js', - 'build/<%= meta.version %>/vendor/bootstrap-*-dist/js/bootstrap.min.js', - 'build/<%= meta.version %>/vendor/typeahead.min.js', - 'build/<%= meta.version %>/vendor/jquery.mousewheel*.js', - 'build/<%= meta.version %>/vendor/gl-matrix-min*.js', - 'build/<%= meta.version %>/vendor/ChemDoodleWeb*.js', - 'build/<%= meta.version %>/vendor/jquery.cookie*.js', - 'build/<%= meta.version %>/vendor/purl*.js', - 'build/<%= meta.version %>/vendor/jquery.sha1*.js', - 'build/<%= meta.version %>/vendor/jquery.qtip*.js', - 'build/<%= meta.version %>/vendor/rawdeflate*.js', - 'build/<%= meta.version %>/vendor/xml2json.js', -// 'build/<%= meta.version %>/vendor/jquery-ui-1.10.3*/js/jquery-ui*min.js' - - ], - gv: [ - 'build/<%= meta.version %>/opencga*.min.js', - 'build/<%= meta.version %>/genome-viewer*.min.js' + '<%= def.build %>/vendor/jquery.qtip*.css', + '<%= def.build %>/vendor/ChemDoodleWeb*.css', + '<%= def.build %>/vendor/bootstrap-*-dist/css/bootstrap.min.css', + '<%= def.build %>/vendor/typeahead.js-bootstrap.css', + '<%= def.build %>/vendor/jquery.simplecolorpicker.css' ], - gvconfig: [ - 'build/<%= meta.version %>/gv-config.js' - ] + 'css': ['<%= def.build %>/styles/css/style.css'] }, - styles: { - 'css': ['<%= stylesPath %>/css/style.css'], - 'vendor': [ - 'build/<%= meta.version %>/vendor/jquery.qtip*.css', - 'build/<%= meta.version %>/vendor/ChemDoodleWeb*.css', - 'build/<%= meta.version %>/vendor/bootstrap-*-dist/css/bootstrap.min.css', - 'build/<%= meta.version %>/vendor/typeahead.js-bootstrap.css' -// 'build/<%= meta.version %>/vendor/jquery-ui-1.10.3*/css/**/jquery-ui*min.css' - ] + scripts: { + vendor: [ + '<%= def.build %>/vendor/underscore*.js', + '<%= def.build %>/vendor/backbone*.js', + '<%= def.build %>/vendor/jquery.min.js', + '<%= def.build %>/vendor/bootstrap-*-dist/js/bootstrap.min.js', + '<%= def.build %>/vendor/typeahead.min.js', + '<%= def.build %>/vendor/jquery.mousewheel*.js', + '<%= def.build %>/vendor/gl-matrix-min*.js', + '<%= def.build %>/vendor/ChemDoodleWeb*.js', + '<%= def.build %>/vendor/jquery.cookie*.js', + '<%= def.build %>/vendor/purl*.js', + '<%= def.build %>/vendor/jquery.sha1*.js', + '<%= def.build %>/vendor/jquery.qtip*.js', + '<%= def.build %>/vendor/rawdeflate*.js', + '<%= def.build %>/vendor/xml2json.js', + ], + config: [ + '<%= def.build %>/gv-config.js' + ], + lib: [ + '<%= def.build %>/genome-viewer.min.js' + ], + js: '<%= def.build %>/<%= def.name %>.min.js' } + } } }, @@ -119,16 +93,19 @@ module.exports = function (grunt) { }, rename: { - html: { + dist: { files: [ - {src: ['build/<%= meta.version %>/genome-maps.html'], dest: 'build/<%= meta.version %>/index.html'} + { + src: ['<%= def.build %>/<%= def.name %>.html'], + dest: '<%= def.build %>/index.html' + } ] } }, hub: { - all: { + 'genome-viewer': { src: ['lib/jsorolla/Gruntfile.js'], - tasks: ['opencga', 'gv'] + tasks: ['gv'] } } }); @@ -145,10 +122,10 @@ module.exports = function (grunt) { grunt.loadNpmTasks('grunt-hub'); grunt.registerTask('log-deploy', 'Deploy path info', function (version) { - grunt.log.writeln("DEPLOY COMMAND: scp -r build/"+grunt.config.data.meta.version+" cafetero@mem16:/httpd/bioinfo/www-apps/genome-maps/"); + grunt.log.writeln("DEPLOY COMMAND: scp -r build/" + grunt.config.data.pkg.version + " cafetero@mem16:/httpd/bioinfo/www-apps/" + grunt.config.data.def.name + "/"); }); // Default task. - grunt.registerTask('default', ['clean', 'concat', 'uglify', 'hub:all', 'copy', 'htmlbuild', 'rename:html', 'log-deploy']); + grunt.registerTask('default', ['hub','clean', 'concat', 'uglify', 'copy', 'htmlbuild', 'rename', 'log-deploy']); }; diff --git a/lib/jsorolla b/lib/jsorolla index 15143fe..33676b7 160000 --- a/lib/jsorolla +++ b/lib/jsorolla @@ -1 +1 @@ -Subproject commit 15143fef73d3405f70e8fea9b87836d134e89dc2 +Subproject commit 33676b7b1dc542a1e7b7ee0b26615bb106730882 diff --git a/package.json b/package.json index aa9f5b4..86e0e59 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,10 @@ { "name": "GenomeMaps", - "version": "3.1.1", + "version": "3.1.7", + "repository": { + "type": "git", + "url": "https://github.com/opencb/genome-maps.git" + }, "devDependencies": { "grunt": "~0.4.1", "grunt-contrib-concat": "~0.3.0", diff --git a/src/genome-maps.html b/src/genome-maps.html index 2ff12f4..ab13001 100755 --- a/src/genome-maps.html +++ b/src/genome-maps.html @@ -4,33 +4,44 @@ Genome Maps + + + - - - + - - - - + + @@ -49,8 +60,6 @@ - - @@ -59,45 +68,38 @@ - - + - - - + - - - + - - + + - + - - - - - - - + + + + + + - - + - - - - - - - - - - + + + + + + + + + + @@ -105,11 +107,20 @@ - - + + + + + + + + + + + + + - - @@ -117,14 +128,6 @@ - - - - - - - - @@ -144,20 +147,19 @@ - - - - - - - - - - - - - - + + + + + + + + + + + + +