From e5cf334eb81ab450e8cd08ac10220eda25d07658 Mon Sep 17 00:00:00 2001 From: Jim Allman Date: Fri, 9 Sep 2022 10:08:51 -0400 Subject: [PATCH 01/86] Update README to explain new vs. old viewer repos --- README.md | 51 +++++++-------------------------------------------- 1 file changed, 7 insertions(+), 44 deletions(-) diff --git a/README.md b/README.md index fc63c97f0..092192107 100644 --- a/README.md +++ b/README.md @@ -1,16 +1,16 @@ -opentree -======== +webapp-tree-viewer +================== -This is the repository for the Open Tree of Life web applications, one of many subsystems making up the Open Tree of Life project code. +This is the repository for the Open Tree of Life synthetic-tree viewer, one of many subsystems making up the Open Tree of Life project code. Previously, this was bundled in a common repo with the study-curation app, but we're breaking these apart as part of our conversion from web2py to Pyramid. -For Open Tree of Life documentation, see [the germinator repository's wiki](https://github.com/OpenTreeOfLife/germinator/wiki). The 'deployment system' and web API documentation sources that formerly resided in this repository now live in the [germinator repository](https://github.com/OpenTreeOfLife/germinator). +For Open Tree of Life documentation, see [the germinator repository's wiki](https://github.com/OpenTreeOfLife/germinator/wiki). The following instructions have not been reviewed in a long time. For local installation a better place to start might be [this wiki page](https://github.com/OpenTreeOfLife/opentree/wiki/Installing-a-local-curator-and-tree-browser-test-server). Installation ============ -See the phylografter instructions for -more details about using web2py. + +**TBD - pending changes in converting from web2py to the Pyramid framework.** We strongly recommend using a virtual environment to manage the version of Python and installed modules. We're currently running opentree with Python @@ -136,44 +136,7 @@ http://www.web2py.com/examples/default/download MTH used version 2.4.2 of web2py Subdirectories -------------- -mockup -: JAR's hand-written html that mock up the design of the site. - -smasher -: construction of synthetic taxonomy. See https://github.com/OpenTreeOfLife/opentree/wiki/Open-Tree-Taxonomy for details - -webapp/controllers -: python code executed by web2py when a URL is successfully mapped to a controller. - -webapp/modules -: python code that can be imported and used by the webpp, but is not exposed as controller - -webapp/models -: code that describes the database structure used by the web app - -webapp/views -: templates for the page content that is rendered in response to a query. The view is typically specific to a few controllers in the web app - -webapp/static -: static content to be returned by the web app. Contains css, images and js subdirectories for commonly used items. - -webapp/private -: the location to be used for storing installation-specific configuration information. - -webapp/cron -: directory that stores commands to be executed periodically by the web2py framework when the app is running. - -webapp/databases -: the location of the database files used by web2py. - -webapp/languages -: web2py code for internationalization - -webapp/cache, webapp/databases, webapp/errors, webapp/sessions, webapp/uploads -: directories used by web2py to store content associated with user's activities. Content here should not need to be committed to version control. - -curator/* -: similar subdirectories to those in webapp/* above +**TBD - pending changes in converting from web2py to the Pyramid framework.** Acknowledgements ---------------- From 586a3aa0e7145fe7e216285d376844f20c957ffc Mon Sep 17 00:00:00 2001 From: Jim Allman Date: Fri, 9 Sep 2022 14:28:31 -0400 Subject: [PATCH 02/86] Updated requirements files and tracking As usual, we capture high-level intent in requirements.in, then freeze the as-built versions in requirements.txt. See pipdeptree.out for a full explanation of module dependencies. --- .gitignore | 1 + pipdeptree.out | 51 ++++++++++++++++++++++++++++++++++++++++++++++++ requirements.in | 9 +++++++++ requirements.txt | 40 ++++++++++++++++++++++++++++++++++--- 4 files changed, 98 insertions(+), 3 deletions(-) create mode 100644 pipdeptree.out create mode 100644 requirements.in diff --git a/.gitignore b/.gitignore index c4b9d2495..45dd4bdf5 100644 --- a/.gitignore +++ b/.gitignore @@ -4,6 +4,7 @@ *.class tmp *.tmp +venv/ backup/ smasher/tax/gbif smasher/tax/ncbi diff --git a/pipdeptree.out b/pipdeptree.out new file mode 100644 index 000000000..2d8cd5118 --- /dev/null +++ b/pipdeptree.out @@ -0,0 +1,51 @@ +bleach==5.0.1 + - six [required: >=1.9.0, installed: 1.16.0] + - webencodings [required: Any, installed: 0.5.1] +cookiecutter==2.1.1 + - binaryornot [required: >=0.4.4, installed: 0.4.4] + - chardet [required: >=3.0.2, installed: 5.0.0] + - click [required: >=7.0,<9.0.0, installed: 8.1.3] + - Jinja2 [required: >=2.7,<4.0.0, installed: 3.1.2] + - MarkupSafe [required: >=2.0, installed: 2.1.1] + - jinja2-time [required: >=0.2.0, installed: 0.2.0] + - arrow [required: Any, installed: 0.15.8] + - python-dateutil [required: Any, installed: 2.2] + - six [required: Any, installed: 1.16.0] + - jinja2 [required: Any, installed: 3.1.2] + - MarkupSafe [required: >=2.0, installed: 2.1.1] + - python-slugify [required: >=4.0.0, installed: 6.1.2] + - text-unidecode [required: >=1.3, installed: 1.3] + - pyyaml [required: >=5.3.1, installed: 6.0] + - requests [required: >=2.23.0, installed: 2.28.1] + - certifi [required: >=2017.4.17, installed: 2022.6.15.1] + - charset-normalizer [required: >=2,<3, installed: 2.1.1] + - idna [required: >=2.5,<4, installed: 3.3] + - urllib3 [required: >=1.21.1,<1.27, installed: 1.26.12] +locket==0.1.1 +pip==22.2.2 +pipdeptree==2.3.1 +pyramid==2.0 + - hupper [required: >=1.5, installed: 1.10.3] + - plaster [required: Any, installed: 1.0] + - setuptools [required: Any, installed: 60.10.0] + - plaster-pastedeploy [required: Any, installed: 0.7] + - PasteDeploy [required: >=2.0, installed: 2.1.1] + - setuptools [required: Any, installed: 60.10.0] + - plaster [required: >=0.5, installed: 1.0] + - setuptools [required: Any, installed: 60.10.0] + - setuptools [required: Any, installed: 60.10.0] + - translationstring [required: >=0.4, installed: 1.4] + - venusian [required: >=1.0, installed: 3.0.0] + - webob [required: >=1.8.3, installed: 1.8.7] + - zope.deprecation [required: >=3.5.0, installed: 4.4.0] + - setuptools [required: Any, installed: 60.10.0] + - zope.interface [required: >=3.8.0, installed: 5.4.0] + - setuptools [required: Any, installed: 60.10.0] +python-jwt==3.3.0 + - jwcrypto [required: >=0.8, installed: 0.9.1] + - cryptography [required: >=2.3, installed: 38.0.1] + - cffi [required: >=1.12, installed: 1.15.1] + - pycparser [required: Any, installed: 2.21] + - deprecated [required: Any, installed: 1.2.13] + - wrapt [required: >=1.10,<2, installed: 1.14.1] + - six [required: Any, installed: 1.16.0] diff --git a/requirements.in b/requirements.in new file mode 100644 index 000000000..e0f0eded7 --- /dev/null +++ b/requirements.in @@ -0,0 +1,9 @@ +requests +python-dateutil==2.2 +locket==0.1.1 +bleach +jwcrypto==0.9.1 +python_jwt +pyramid==2.0 +pipdeptree +cookiecutter diff --git a/requirements.txt b/requirements.txt index 23a83451d..151617506 100644 --- a/requirements.txt +++ b/requirements.txt @@ -1,6 +1,40 @@ -requests +requests==2.28.1 python-dateutil==2.2 locket==0.1.1 -bleach +bleach==5.0.1 jwcrypto==0.9.1 -python_jwt +python-jwt==3.3.0 +pyramid==2.0 +pipdeptree==2.3.1 +cookiecutter==2.1.1 +## The following requirements were added by pip freeze: +arrow==0.15.8 +binaryornot==0.4.4 +certifi==2022.6.15.1 +cffi==1.15.1 +chardet==5.0.0 +charset-normalizer==2.1.1 +click==8.1.3 +cryptography==38.0.1 +Deprecated==1.2.13 +hupper==1.10.3 +idna==3.3 +Jinja2==3.1.2 +jinja2-time==0.2.0 +MarkupSafe==2.1.1 +PasteDeploy==2.1.1 +plaster==1.0 +plaster-pastedeploy==0.7 +pycparser==2.21 +python-slugify==6.1.2 +PyYAML==6.0 +six==1.16.0 +text-unidecode==1.3 +translationstring==1.4 +urllib3==1.26.12 +venusian==3.0.0 +webencodings==0.5.1 +WebOb==1.8.7 +wrapt==1.14.1 +zope.deprecation==4.4.0 +zope.interface==5.4.0 From 442c0acc1a2121e468083babf6b369a711a10afe Mon Sep 17 00:00:00 2001 From: Jim Allman Date: Fri, 9 Sep 2022 14:36:01 -0400 Subject: [PATCH 03/86] Update pip-installation instructions in README --- README.md | 17 +++++++++++++++++ 1 file changed, 17 insertions(+) diff --git a/README.md b/README.md index 092192107..ff6084631 100644 --- a/README.md +++ b/README.md @@ -36,8 +36,25 @@ The included **requirements.txt** file lists known-good versions of all the requ python modules for opentree, plus a few convenience modules. To [install these modules using pip](http://www.pip-installer.org/en/latest/cookbook.html#requirements-files), +The file **requirements.in** captures our intentions, typically following the +latest version of each module unless frozen to address bugs or incompatibilities. +
+# create a python3 venv inside the top-level folder
+cd ~/repos/webapp-tree-viewer
+export VENV="$(pwd)/venv"
+python3 -m venv $VENV
+
+# install the pinned set of known-good modules
 pip install -r requirements.txt
+
+# OR during development, try to update these using `requirements.in`
+pip install -r requirements.in
+
+# capture the resulting versions for production deploymentsl
+$VENV/bin/pip freeze -r requirements.in > requirements.txt
+# capture and save the full dependency tree for all modules
+$VENV/bin/pipdeptree > pipdeptree.out
 
The contents of the webapp subdirectory are a web2py application. Make a symbolic From 645ded743b6b5c0660c2eaa0b92c4f9b7e839fe2 Mon Sep 17 00:00:00 2001 From: Jim Allman Date: Fri, 9 Sep 2022 14:43:45 -0400 Subject: [PATCH 04/86] Initial Pyramid project from cookiecutter --- synthetic_tree_viewer/.coveragerc | 2 + synthetic_tree_viewer/.gitignore | 22 +++ synthetic_tree_viewer/CHANGES.txt | 4 + synthetic_tree_viewer/MANIFEST.in | 5 + synthetic_tree_viewer/README.txt | 30 ++++ synthetic_tree_viewer/development.ini | 59 +++++++ synthetic_tree_viewer/production.ini | 53 ++++++ synthetic_tree_viewer/pytest.ini | 6 + synthetic_tree_viewer/setup.py | 52 ++++++ .../synthetic_tree_viewer/__init__.py | 11 ++ .../synthetic_tree_viewer/routes.py | 3 + .../static/pyramid-16x16.png | Bin 0 -> 1319 bytes .../synthetic_tree_viewer/static/pyramid.png | Bin 0 -> 12901 bytes .../synthetic_tree_viewer/static/theme.css | 157 ++++++++++++++++++ .../templates/404.jinja2 | 8 + .../templates/layout.jinja2 | 64 +++++++ .../templates/mytemplate.jinja2 | 8 + .../synthetic_tree_viewer/views/__init__.py | 0 .../synthetic_tree_viewer/views/default.py | 6 + .../synthetic_tree_viewer/views/notfound.py | 7 + synthetic_tree_viewer/testing.ini | 53 ++++++ synthetic_tree_viewer/tests/__init__.py | 0 synthetic_tree_viewer/tests/conftest.py | 76 +++++++++ .../tests/test_functional.py | 7 + synthetic_tree_viewer/tests/test_views.py | 13 ++ 25 files changed, 646 insertions(+) create mode 100644 synthetic_tree_viewer/.coveragerc create mode 100644 synthetic_tree_viewer/.gitignore create mode 100644 synthetic_tree_viewer/CHANGES.txt create mode 100644 synthetic_tree_viewer/MANIFEST.in create mode 100644 synthetic_tree_viewer/README.txt create mode 100644 synthetic_tree_viewer/development.ini create mode 100644 synthetic_tree_viewer/production.ini create mode 100644 synthetic_tree_viewer/pytest.ini create mode 100644 synthetic_tree_viewer/setup.py create mode 100644 synthetic_tree_viewer/synthetic_tree_viewer/__init__.py create mode 100644 synthetic_tree_viewer/synthetic_tree_viewer/routes.py create mode 100644 synthetic_tree_viewer/synthetic_tree_viewer/static/pyramid-16x16.png create mode 100644 synthetic_tree_viewer/synthetic_tree_viewer/static/pyramid.png create mode 100644 synthetic_tree_viewer/synthetic_tree_viewer/static/theme.css create mode 100644 synthetic_tree_viewer/synthetic_tree_viewer/templates/404.jinja2 create mode 100644 synthetic_tree_viewer/synthetic_tree_viewer/templates/layout.jinja2 create mode 100644 synthetic_tree_viewer/synthetic_tree_viewer/templates/mytemplate.jinja2 create mode 100644 synthetic_tree_viewer/synthetic_tree_viewer/views/__init__.py create mode 100644 synthetic_tree_viewer/synthetic_tree_viewer/views/default.py create mode 100644 synthetic_tree_viewer/synthetic_tree_viewer/views/notfound.py create mode 100644 synthetic_tree_viewer/testing.ini create mode 100644 synthetic_tree_viewer/tests/__init__.py create mode 100644 synthetic_tree_viewer/tests/conftest.py create mode 100644 synthetic_tree_viewer/tests/test_functional.py create mode 100644 synthetic_tree_viewer/tests/test_views.py diff --git a/synthetic_tree_viewer/.coveragerc b/synthetic_tree_viewer/.coveragerc new file mode 100644 index 000000000..1264262d8 --- /dev/null +++ b/synthetic_tree_viewer/.coveragerc @@ -0,0 +1,2 @@ +[run] +source = synthetic_tree_viewer diff --git a/synthetic_tree_viewer/.gitignore b/synthetic_tree_viewer/.gitignore new file mode 100644 index 000000000..e9336274d --- /dev/null +++ b/synthetic_tree_viewer/.gitignore @@ -0,0 +1,22 @@ +*.egg +*.egg-info +*.pyc +*$py.class +*~ +.coverage +coverage.xml +build/ +dist/ +.tox/ +nosetests.xml +env*/ +tmp/ +Data*.fs* +*.sublime-project +*.sublime-workspace +.*.sw? +.sw? +.DS_Store +coverage +test +*.sqlite diff --git a/synthetic_tree_viewer/CHANGES.txt b/synthetic_tree_viewer/CHANGES.txt new file mode 100644 index 000000000..14b902fd1 --- /dev/null +++ b/synthetic_tree_viewer/CHANGES.txt @@ -0,0 +1,4 @@ +0.0 +--- + +- Initial version. diff --git a/synthetic_tree_viewer/MANIFEST.in b/synthetic_tree_viewer/MANIFEST.in new file mode 100644 index 000000000..aab2b6b3f --- /dev/null +++ b/synthetic_tree_viewer/MANIFEST.in @@ -0,0 +1,5 @@ +include *.txt *.ini *.cfg *.rst +recursive-include synthetic_tree_viewer *.ico *.png *.css *.gif *.jpg *.pt *.txt *.mak *.mako *.js *.html *.xml *.jinja2 +recursive-include tests * +recursive-exclude * __pycache__ +recursive-exclude * *.py[co] diff --git a/synthetic_tree_viewer/README.txt b/synthetic_tree_viewer/README.txt new file mode 100644 index 000000000..9cff8cef3 --- /dev/null +++ b/synthetic_tree_viewer/README.txt @@ -0,0 +1,30 @@ +synthetic tree viewer +===================== + +Getting Started +--------------- + +- Change directory into your newly created project if not already there. Your + current directory should be the same as this README.txt file and setup.py. + + cd synthetic_tree_viewer + +- Create a Python virtual environment, if not already created. + + python3 -m venv env + +- Upgrade packaging tools, if necessary. + + env/bin/pip install --upgrade pip setuptools + +- Install the project in editable mode with its testing requirements. + + env/bin/pip install -e ".[testing]" + +- Run your project's tests. + + env/bin/pytest + +- Run your project. + + env/bin/pserve development.ini diff --git a/synthetic_tree_viewer/development.ini b/synthetic_tree_viewer/development.ini new file mode 100644 index 000000000..0eae8fdbc --- /dev/null +++ b/synthetic_tree_viewer/development.ini @@ -0,0 +1,59 @@ +### +# app configuration +# https://docs.pylonsproject.org/projects/pyramid/en/latest/narr/environment.html +### + +[app:main] +use = egg:synthetic_tree_viewer + +pyramid.reload_templates = true +pyramid.debug_authorization = false +pyramid.debug_notfound = false +pyramid.debug_routematch = false +pyramid.default_locale_name = en +pyramid.includes = + pyramid_debugtoolbar + +# By default, the toolbar only appears for clients from IP addresses +# '127.0.0.1' and '::1'. +# debugtoolbar.hosts = 127.0.0.1 ::1 + +### +# wsgi server configuration +### + +[server:main] +use = egg:waitress#main +listen = localhost:6543 + +### +# logging configuration +# https://docs.pylonsproject.org/projects/pyramid/en/latest/narr/logging.html +### + +[loggers] +keys = root, synthetic_tree_viewer + +[handlers] +keys = console + +[formatters] +keys = generic + +[logger_root] +level = INFO +handlers = console + +[logger_synthetic_tree_viewer] +level = DEBUG +handlers = +qualname = synthetic_tree_viewer + +[handler_console] +class = StreamHandler +args = (sys.stderr,) +level = NOTSET +formatter = generic + +[formatter_generic] +format = %(asctime)s %(levelname)-5.5s [%(name)s:%(lineno)s][%(threadName)s] %(message)s diff --git a/synthetic_tree_viewer/production.ini b/synthetic_tree_viewer/production.ini new file mode 100644 index 000000000..8ef436853 --- /dev/null +++ b/synthetic_tree_viewer/production.ini @@ -0,0 +1,53 @@ +### +# app configuration +# https://docs.pylonsproject.org/projects/pyramid/en/latest/narr/environment.html +### + +[app:main] +use = egg:synthetic_tree_viewer + +pyramid.reload_templates = false +pyramid.debug_authorization = false +pyramid.debug_notfound = false +pyramid.debug_routematch = false +pyramid.default_locale_name = en + +### +# wsgi server configuration +### + +[server:main] +use = egg:waitress#main +listen = *:6543 + +### +# logging configuration +# https://docs.pylonsproject.org/projects/pyramid/en/latest/narr/logging.html +### + +[loggers] +keys = root, synthetic_tree_viewer + +[handlers] +keys = console + +[formatters] +keys = generic + +[logger_root] +level = WARN +handlers = console + +[logger_synthetic_tree_viewer] +level = WARN +handlers = +qualname = synthetic_tree_viewer + +[handler_console] +class = StreamHandler +args = (sys.stderr,) +level = NOTSET +formatter = generic + +[formatter_generic] +format = %(asctime)s %(levelname)-5.5s [%(name)s:%(lineno)s][%(threadName)s] %(message)s diff --git a/synthetic_tree_viewer/pytest.ini b/synthetic_tree_viewer/pytest.ini new file mode 100644 index 000000000..3cdbb5dc3 --- /dev/null +++ b/synthetic_tree_viewer/pytest.ini @@ -0,0 +1,6 @@ +[pytest] +addopts = --strict-markers + +testpaths = + synthetic_tree_viewer + tests diff --git a/synthetic_tree_viewer/setup.py b/synthetic_tree_viewer/setup.py new file mode 100644 index 000000000..486345e3e --- /dev/null +++ b/synthetic_tree_viewer/setup.py @@ -0,0 +1,52 @@ +import os + +from setuptools import setup, find_packages + +here = os.path.abspath(os.path.dirname(__file__)) +with open(os.path.join(here, 'README.txt')) as f: + README = f.read() +with open(os.path.join(here, 'CHANGES.txt')) as f: + CHANGES = f.read() + +requires = [ + 'plaster_pastedeploy', + 'pyramid', + 'pyramid_jinja2', + 'pyramid_debugtoolbar', + 'waitress', +] + +tests_require = [ + 'WebTest', + 'pytest', + 'pytest-cov', +] + +setup( + name='synthetic_tree_viewer', + version='0.0', + description='synthetic tree viewer', + long_description=README + '\n\n' + CHANGES, + classifiers=[ + 'Programming Language :: Python', + 'Framework :: Pyramid', + 'Topic :: Internet :: WWW/HTTP', + 'Topic :: Internet :: WWW/HTTP :: WSGI :: Application', + ], + author='', + author_email='', + url='', + keywords='web pyramid pylons', + packages=find_packages(exclude=['tests']), + include_package_data=True, + zip_safe=False, + extras_require={ + 'testing': tests_require, + }, + install_requires=requires, + entry_points={ + 'paste.app_factory': [ + 'main = synthetic_tree_viewer:main', + ], + }, +) diff --git a/synthetic_tree_viewer/synthetic_tree_viewer/__init__.py b/synthetic_tree_viewer/synthetic_tree_viewer/__init__.py new file mode 100644 index 000000000..a3d5a6469 --- /dev/null +++ b/synthetic_tree_viewer/synthetic_tree_viewer/__init__.py @@ -0,0 +1,11 @@ +from pyramid.config import Configurator + + +def main(global_config, **settings): + """ This function returns a Pyramid WSGI application. + """ + with Configurator(settings=settings) as config: + config.include('pyramid_jinja2') + config.include('.routes') + config.scan() + return config.make_wsgi_app() diff --git a/synthetic_tree_viewer/synthetic_tree_viewer/routes.py b/synthetic_tree_viewer/synthetic_tree_viewer/routes.py new file mode 100644 index 000000000..25504ad4d --- /dev/null +++ b/synthetic_tree_viewer/synthetic_tree_viewer/routes.py @@ -0,0 +1,3 @@ +def includeme(config): + config.add_static_view('static', 'static', cache_max_age=3600) + config.add_route('home', '/') diff --git a/synthetic_tree_viewer/synthetic_tree_viewer/static/pyramid-16x16.png b/synthetic_tree_viewer/synthetic_tree_viewer/static/pyramid-16x16.png new file mode 100644 index 0000000000000000000000000000000000000000..979203112e76ba4cfdb8cd6f108f4275e987d99a GIT binary patch literal 1319 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`k|nMYCBgY=CFO}lsSJ)O`AMk? zp1FzXsX?iUDV2pMQ*9U+n3Xd_B1$5BeXNr6bM+EIYV;~{3xK*A7;Nk-3KEmEQ%e+* zQqwc@Y?a>c-mj#PnPRIHZt82`Ti~3Uk?B!Ylp0*+7m{3+ootz+WN)WnQ(*-(AUCxn zQK2F?C$HG5!d3}vt`(3C64qBz04piUwpD^SD#ABF!8yMuRl!uxR5#hc&_u!9QqR!T z(8R(}N5ROz&{*HVSl`fC*U-qyz|zXlQ~?TIxIyg#@@$ndN=gc>^!3Zj z%k|2Q_413-^$jg8E%gnI^o@*kfhu&1EAvVcD|GXUm0>2hq!uR^WfqiV=I1GZOiWD5 zFD$Tv3bSNU;+l1ennz|zM-B0$V)JVzP|XC=H|jx7ncO3BHWAB;NpiyW)Z+ZoqGVvir744~DzI`cN=+=uFAB-e&w+(vKt_H^esM;Afr7KMf`)Hma%LWg zuL;)R>ucqiS6q^qmz?V9Vygr+LN7Bj#mdRl*wM}0&C<--)xyxw)!5S9(bdAp)YZVy zz`)Yd%><^`B|o_|H#M&WrZ)wl*Ab^)P+G_>0NU)5T9jFqn&MWJpQ`}&vsET;x0vHJ z52`l>w_7Z5>eUB2MjsTjNHGl)0wy026P|8?9C*r4%>yR)B4E1CQ{KVEz`!`m)5S5Q z;#SXOUk#T)k>lxKj4~&v95M;sSJp8lNikLV)bX~~P1`qaNLZPZ<6^QgASli8jmk<% zZdJ~1%}JBkHhu^^q;ghbe{lMjv_0X)ug#yI+xz_S{hiM(g*saf_f6Pt#!wis>2u+! z{;RjXUlmP?^Kq|yJMn}2uJ~!L3EU-*{+zn6Ya6$jYueOB4G#Lx+=R;oM4sqe*Sq0$ zQ2Nf{-BFQxlX@Dog;`l=SkyQh`W)n22F}BoCTQYYC=p8g*kiK(1`FEnD$cY`NZX8<>GJicU)2$Vj5iRl-7k*od z3K)m{Gsp@4JM)eDo7z=gtG;>hu{QvcXxLU8eD@D+$BKJ@RM`zyYKvG z-8a3ur|aAMt1Vr-yH|CEDauQLkO+_f002lzQdIf%fB4Ui0QY*V)U3(^0FZ<%L_`#& zL`1-fj&^1i)}{b}Bq%eIA9uoG!laCfFcwoR zb`OTl9xm%u?u}UK6Z+-0LfvF1uNzRlu;BSs+a-xXQEAzvn#Z125}lrEE$o@!cYog? z@lko^ANF`uyQDsu%o2*s(%P^-sbKEJ1>90;Svb?qHr@sbgo4>hFv21pO(baNe1U?G_am z$%uaYhJupCKc=2k-Lpftu1m0%A~@dHZKRf6W*s6Qm&D`7K|3 zP8#?(KABe7=AZNd-k*6CTcqHJ?f3yA6ws8mf*wHc;}7VpNW)zn=9RJ4PSI>0zxN+V zk#)jtw`7ILRrYRCqD>sB@)+LaZvtH~TpCmeT z5;T(}&;kNeCnT`+Is{plpj-ki?E!QC9#b�i5=5IxreNAbVsKKM4p@aIXvt)VjX~ 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 +

Pyramid Starter project

+

404 Page Not Found

+ +{% endblock content %} diff --git a/synthetic_tree_viewer/synthetic_tree_viewer/templates/layout.jinja2 b/synthetic_tree_viewer/synthetic_tree_viewer/templates/layout.jinja2 new file mode 100644 index 000000000..56381fbca --- /dev/null +++ b/synthetic_tree_viewer/synthetic_tree_viewer/templates/layout.jinja2 @@ -0,0 +1,64 @@ + + + + + + + + + + + Cookiecutter Starter project for the Pyramid Web Framework + + + + + + + + + + + + + +
+
+
+
+ +
+
+ {% block content %} +

No content

+ {% endblock content %} +
+
+ +
+ +
+
+
+ + + + + + + + diff --git a/synthetic_tree_viewer/synthetic_tree_viewer/templates/mytemplate.jinja2 b/synthetic_tree_viewer/synthetic_tree_viewer/templates/mytemplate.jinja2 new file mode 100644 index 000000000..f2e7283f8 --- /dev/null +++ b/synthetic_tree_viewer/synthetic_tree_viewer/templates/mytemplate.jinja2 @@ -0,0 +1,8 @@ +{% extends "layout.jinja2" %} + +{% block content %} +
+

Pyramid Starter project

+

Welcome to {{project}}, a Pyramid application generated by
Cookiecutter.

+
+{% endblock content %} diff --git a/synthetic_tree_viewer/synthetic_tree_viewer/views/__init__.py b/synthetic_tree_viewer/synthetic_tree_viewer/views/__init__.py new file mode 100644 index 000000000..e69de29bb diff --git a/synthetic_tree_viewer/synthetic_tree_viewer/views/default.py b/synthetic_tree_viewer/synthetic_tree_viewer/views/default.py new file mode 100644 index 000000000..311bed6e2 --- /dev/null +++ b/synthetic_tree_viewer/synthetic_tree_viewer/views/default.py @@ -0,0 +1,6 @@ +from pyramid.view import view_config + + +@view_config(route_name='home', renderer='synthetic_tree_viewer:templates/mytemplate.jinja2') +def my_view(request): + return {'project': 'synthetic tree viewer'} diff --git a/synthetic_tree_viewer/synthetic_tree_viewer/views/notfound.py b/synthetic_tree_viewer/synthetic_tree_viewer/views/notfound.py new file mode 100644 index 000000000..6e5c5b4c2 --- /dev/null +++ b/synthetic_tree_viewer/synthetic_tree_viewer/views/notfound.py @@ -0,0 +1,7 @@ +from pyramid.view import notfound_view_config + + +@notfound_view_config(renderer='synthetic_tree_viewer:templates/404.jinja2') +def notfound_view(request): + request.response.status = 404 + return {} diff --git a/synthetic_tree_viewer/testing.ini b/synthetic_tree_viewer/testing.ini new file mode 100644 index 000000000..7eb5572b1 --- /dev/null +++ b/synthetic_tree_viewer/testing.ini @@ -0,0 +1,53 @@ +### +# app configuration +# https://docs.pylonsproject.org/projects/pyramid/en/latest/narr/environment.html +### + +[app:main] +use = egg:synthetic_tree_viewer + +pyramid.reload_templates = false +pyramid.debug_authorization = false +pyramid.debug_notfound = false +pyramid.debug_routematch = false +pyramid.default_locale_name = en + +### +# wsgi server configuration +### + +[server:main] +use = egg:waitress#main +listen = localhost:6543 + +### +# logging configuration +# https://docs.pylonsproject.org/projects/pyramid/en/latest/narr/logging.html +### + +[loggers] +keys = root, synthetic_tree_viewer + +[handlers] +keys = console + +[formatters] +keys = generic + +[logger_root] +level = INFO +handlers = console + +[logger_synthetic_tree_viewer] +level = DEBUG +handlers = +qualname = synthetic_tree_viewer + +[handler_console] +class = StreamHandler +args = (sys.stderr,) +level = NOTSET +formatter = generic + +[formatter_generic] +format = %(asctime)s %(levelname)-5.5s [%(name)s:%(lineno)s][%(threadName)s] %(message)s diff --git a/synthetic_tree_viewer/tests/__init__.py b/synthetic_tree_viewer/tests/__init__.py new file mode 100644 index 000000000..e69de29bb diff --git a/synthetic_tree_viewer/tests/conftest.py b/synthetic_tree_viewer/tests/conftest.py new file mode 100644 index 000000000..08dcbea49 --- /dev/null +++ b/synthetic_tree_viewer/tests/conftest.py @@ -0,0 +1,76 @@ +import os +from pyramid.paster import get_appsettings +from pyramid.scripting import prepare +from pyramid.testing import DummyRequest, testConfig +import pytest +import webtest + +from synthetic_tree_viewer import main + + +def pytest_addoption(parser): + parser.addoption('--ini', action='store', metavar='INI_FILE') + +@pytest.fixture(scope='session') +def ini_file(request): + # potentially grab this path from a pytest option + return os.path.abspath(request.config.option.ini or 'testing.ini') + +@pytest.fixture(scope='session') +def app_settings(ini_file): + return get_appsettings(ini_file) + +@pytest.fixture(scope='session') +def app(app_settings): + return main({}, **app_settings) + +@pytest.fixture +def testapp(app): + testapp = webtest.TestApp(app, extra_environ={ + 'HTTP_HOST': 'example.com', + }) + + return testapp + +@pytest.fixture +def app_request(app): + """ + A real request. + + This request is almost identical to a real request but it has some + drawbacks in tests as it's harder to mock data and is heavier. + + """ + with prepare(registry=app.registry) as env: + request = env['request'] + request.host = 'example.com' + yield request + +@pytest.fixture +def dummy_request(): + """ + A lightweight dummy request. + + This request is ultra-lightweight and should be used only when the request + itself is not a large focus in the call-stack. It is much easier to mock + and control side-effects using this object, however: + + - It does not have request extensions applied. + - Threadlocals are not properly pushed. + + """ + request = DummyRequest() + request.host = 'example.com' + + return request + +@pytest.fixture +def dummy_config(dummy_request): + """ + A dummy :class:`pyramid.config.Configurator` object. This allows for + mock configuration, including configuration for ``dummy_request``, as well + as pushing the appropriate threadlocals. + + """ + with testConfig(request=dummy_request) as config: + yield config diff --git a/synthetic_tree_viewer/tests/test_functional.py b/synthetic_tree_viewer/tests/test_functional.py new file mode 100644 index 000000000..bac5d63f4 --- /dev/null +++ b/synthetic_tree_viewer/tests/test_functional.py @@ -0,0 +1,7 @@ +def test_root(testapp): + res = testapp.get('/', status=200) + assert b'Pyramid' in res.body + +def test_notfound(testapp): + res = testapp.get('/badurl', status=404) + assert res.status_code == 404 diff --git a/synthetic_tree_viewer/tests/test_views.py b/synthetic_tree_viewer/tests/test_views.py new file mode 100644 index 000000000..bb1359081 --- /dev/null +++ b/synthetic_tree_viewer/tests/test_views.py @@ -0,0 +1,13 @@ +from synthetic_tree_viewer.views.default import my_view +from synthetic_tree_viewer.views.notfound import notfound_view + + +def test_my_view(app_request): + info = my_view(app_request) + assert app_request.response.status_int == 200 + assert info['project'] == 'synthetic tree viewer' + +def test_notfound_view(app_request): + info = notfound_view(app_request) + assert app_request.response.status_int == 404 + assert info == {} From dd04efd4c0b33971c43b1b1b3c3edffe575f56bd Mon Sep 17 00:00:00 2001 From: Jim Allman Date: Fri, 9 Sep 2022 14:45:11 -0400 Subject: [PATCH 05/86] Update pinned modules after cookiecutter NB - This now includes some modules from the *internal* requirements from synthetic_tree_viewer/setup.py [testing] --- pipdeptree.out | 119 ++++++++++++++++++++++++++++++++++++++++------- requirements.txt | 21 +++++++++ 2 files changed, 123 insertions(+), 17 deletions(-) diff --git a/pipdeptree.out b/pipdeptree.out index 2d8cd5118..e97825435 100644 --- a/pipdeptree.out +++ b/pipdeptree.out @@ -24,23 +24,16 @@ cookiecutter==2.1.1 locket==0.1.1 pip==22.2.2 pipdeptree==2.3.1 -pyramid==2.0 - - hupper [required: >=1.5, installed: 1.10.3] - - plaster [required: Any, installed: 1.0] - - setuptools [required: Any, installed: 60.10.0] - - plaster-pastedeploy [required: Any, installed: 0.7] - - PasteDeploy [required: >=2.0, installed: 2.1.1] - - setuptools [required: Any, installed: 60.10.0] - - plaster [required: >=0.5, installed: 1.0] - - setuptools [required: Any, installed: 60.10.0] - - setuptools [required: Any, installed: 60.10.0] - - translationstring [required: >=0.4, installed: 1.4] - - venusian [required: >=1.0, installed: 3.0.0] - - webob [required: >=1.8.3, installed: 1.8.7] - - zope.deprecation [required: >=3.5.0, installed: 4.4.0] - - setuptools [required: Any, installed: 60.10.0] - - zope.interface [required: >=3.8.0, installed: 5.4.0] - - setuptools [required: Any, installed: 60.10.0] +pytest-cov==3.0.0 + - coverage [required: >=5.2.1, installed: 6.4.4] + - pytest [required: >=4.6, installed: 7.1.3] + - attrs [required: >=19.2.0, installed: 22.1.0] + - iniconfig [required: Any, installed: 1.1.1] + - packaging [required: Any, installed: 21.3] + - pyparsing [required: >=2.0.2,!=3.0.5, installed: 3.0.9] + - pluggy [required: >=0.12,<2.0, installed: 1.0.0] + - py [required: >=1.8.2, installed: 1.11.0] + - tomli [required: >=1.0.0, installed: 2.0.1] python-jwt==3.3.0 - jwcrypto [required: >=0.8, installed: 0.9.1] - cryptography [required: >=2.3, installed: 38.0.1] @@ -49,3 +42,95 @@ python-jwt==3.3.0 - deprecated [required: Any, installed: 1.2.13] - wrapt [required: >=1.10,<2, installed: 1.14.1] - six [required: Any, installed: 1.16.0] +synthetic-tree-viewer==0.0 + - plaster-pastedeploy [required: Any, installed: 0.7] + - PasteDeploy [required: >=2.0, installed: 2.1.1] + - setuptools [required: Any, installed: 60.10.0] + - plaster [required: >=0.5, installed: 1.0] + - setuptools [required: Any, installed: 60.10.0] + - pyramid [required: Any, installed: 2.0] + - hupper [required: >=1.5, installed: 1.10.3] + - plaster [required: Any, installed: 1.0] + - setuptools [required: Any, installed: 60.10.0] + - plaster-pastedeploy [required: Any, installed: 0.7] + - PasteDeploy [required: >=2.0, installed: 2.1.1] + - setuptools [required: Any, installed: 60.10.0] + - plaster [required: >=0.5, installed: 1.0] + - setuptools [required: Any, installed: 60.10.0] + - setuptools [required: Any, installed: 60.10.0] + - translationstring [required: >=0.4, installed: 1.4] + - venusian [required: >=1.0, installed: 3.0.0] + - webob [required: >=1.8.3, installed: 1.8.7] + - zope.deprecation [required: >=3.5.0, installed: 4.4.0] + - setuptools [required: Any, installed: 60.10.0] + - zope.interface [required: >=3.8.0, installed: 5.4.0] + - setuptools [required: Any, installed: 60.10.0] + - pyramid-debugtoolbar [required: Any, installed: 4.9] + - Pygments [required: Any, installed: 2.13.0] + - pyramid [required: >=1.4, installed: 2.0] + - hupper [required: >=1.5, installed: 1.10.3] + - plaster [required: Any, installed: 1.0] + - setuptools [required: Any, installed: 60.10.0] + - plaster-pastedeploy [required: Any, installed: 0.7] + - PasteDeploy [required: >=2.0, installed: 2.1.1] + - setuptools [required: Any, installed: 60.10.0] + - plaster [required: >=0.5, installed: 1.0] + - setuptools [required: Any, installed: 60.10.0] + - setuptools [required: Any, installed: 60.10.0] + - translationstring [required: >=0.4, installed: 1.4] + - venusian [required: >=1.0, installed: 3.0.0] + - webob [required: >=1.8.3, installed: 1.8.7] + - zope.deprecation [required: >=3.5.0, installed: 4.4.0] + - setuptools [required: Any, installed: 60.10.0] + - zope.interface [required: >=3.8.0, installed: 5.4.0] + - setuptools [required: Any, installed: 60.10.0] + - pyramid-mako [required: >=0.3.1, installed: 1.1.0] + - Mako [required: >=1.1.0, installed: 1.2.2] + - MarkupSafe [required: >=0.9.2, installed: 2.1.1] + - pyramid [required: Any, installed: 2.0] + - hupper [required: >=1.5, installed: 1.10.3] + - plaster [required: Any, installed: 1.0] + - setuptools [required: Any, installed: 60.10.0] + - plaster-pastedeploy [required: Any, installed: 0.7] + - PasteDeploy [required: >=2.0, installed: 2.1.1] + - setuptools [required: Any, installed: 60.10.0] + - plaster [required: >=0.5, installed: 1.0] + - setuptools [required: Any, installed: 60.10.0] + - setuptools [required: Any, installed: 60.10.0] + - translationstring [required: >=0.4, installed: 1.4] + - venusian [required: >=1.0, installed: 3.0.0] + - webob [required: >=1.8.3, installed: 1.8.7] + - zope.deprecation [required: >=3.5.0, installed: 4.4.0] + - setuptools [required: Any, installed: 60.10.0] + - zope.interface [required: >=3.8.0, installed: 5.4.0] + - setuptools [required: Any, installed: 60.10.0] + - repoze.lru [required: Any, installed: 0.7] + - pyramid-jinja2 [required: Any, installed: 2.10] + - jinja2 [required: >=2.5.0,!=2.11.2,!=2.11.1,!=2.11.0, installed: 3.1.2] + - MarkupSafe [required: >=2.0, installed: 2.1.1] + - markupsafe [required: Any, installed: 2.1.1] + - pyramid [required: >=1.3.0, installed: 2.0] + - hupper [required: >=1.5, installed: 1.10.3] + - plaster [required: Any, installed: 1.0] + - setuptools [required: Any, installed: 60.10.0] + - plaster-pastedeploy [required: Any, installed: 0.7] + - PasteDeploy [required: >=2.0, installed: 2.1.1] + - setuptools [required: Any, installed: 60.10.0] + - plaster [required: >=0.5, installed: 1.0] + - setuptools [required: Any, installed: 60.10.0] + - setuptools [required: Any, installed: 60.10.0] + - translationstring [required: >=0.4, installed: 1.4] + - venusian [required: >=1.0, installed: 3.0.0] + - webob [required: >=1.8.3, installed: 1.8.7] + - zope.deprecation [required: >=3.5.0, installed: 4.4.0] + - setuptools [required: Any, installed: 60.10.0] + - zope.interface [required: >=3.8.0, installed: 5.4.0] + - setuptools [required: Any, installed: 60.10.0] + - zope.deprecation [required: Any, installed: 4.4.0] + - setuptools [required: Any, installed: 60.10.0] + - waitress [required: Any, installed: 2.1.2] +WebTest==3.0.0 + - beautifulsoup4 [required: Any, installed: 4.11.1] + - soupsieve [required: >1.2, installed: 2.3.2.post1] + - waitress [required: >=0.8.5, installed: 2.1.2] + - WebOb [required: >=1.2, installed: 1.8.7] diff --git a/requirements.txt b/requirements.txt index 151617506..afa78c12a 100644 --- a/requirements.txt +++ b/requirements.txt @@ -9,32 +9,53 @@ pipdeptree==2.3.1 cookiecutter==2.1.1 ## The following requirements were added by pip freeze: arrow==0.15.8 +attrs==22.1.0 +beautifulsoup4==4.11.1 binaryornot==0.4.4 certifi==2022.6.15.1 cffi==1.15.1 chardet==5.0.0 charset-normalizer==2.1.1 click==8.1.3 +coverage==6.4.4 cryptography==38.0.1 Deprecated==1.2.13 hupper==1.10.3 idna==3.3 +iniconfig==1.1.1 Jinja2==3.1.2 jinja2-time==0.2.0 +Mako==1.2.2 MarkupSafe==2.1.1 +packaging==21.3 PasteDeploy==2.1.1 plaster==1.0 plaster-pastedeploy==0.7 +pluggy==1.0.0 +py==1.11.0 pycparser==2.21 +Pygments==2.13.0 +pyparsing==3.0.9 +pyramid-debugtoolbar==4.9 +pyramid-jinja2==2.10 +pyramid-mako==1.1.0 +pytest==7.1.3 +pytest-cov==3.0.0 python-slugify==6.1.2 PyYAML==6.0 +repoze.lru==0.7 six==1.16.0 +soupsieve==2.3.2.post1 +-e git+ssh://git@github.com/OpenTreeOfLife/webapp-tree-viewer.git@645ded743b6b5c0660c2eaa0b92c4f9b7e839fe2#egg=synthetic_tree_viewer&subdirectory=synthetic_tree_viewer text-unidecode==1.3 +tomli==2.0.1 translationstring==1.4 urllib3==1.26.12 venusian==3.0.0 +waitress==2.1.2 webencodings==0.5.1 WebOb==1.8.7 +WebTest==3.0.0 wrapt==1.14.1 zope.deprecation==4.4.0 zope.interface==5.4.0 From ee3bb6f8dac95da68880723a27683ec69164350a Mon Sep 17 00:00:00 2001 From: Jim Allman Date: Tue, 13 Sep 2022 15:16:12 -0400 Subject: [PATCH 06/86] Prepare to migrate static assets and main layout --- .../synthetic_tree_viewer/routes.py | 5 ++++- .../static/pyramid-16x16.png | Bin 1319 -> 0 bytes .../synthetic_tree_viewer/static/pyramid.png | Bin 12901 -> 0 bytes .../static/{theme.css => theme.ORIGINAL.css} | 0 .../{layout.jinja2 => layout.ORIGINAL.jinja2} | 0 .../{mytemplate.jinja2 => tree_view.jinja2} | 0 .../synthetic_tree_viewer/views/default.py | 8 ++++++-- 7 files changed, 10 insertions(+), 3 deletions(-) delete mode 100644 synthetic_tree_viewer/synthetic_tree_viewer/static/pyramid-16x16.png delete mode 100644 synthetic_tree_viewer/synthetic_tree_viewer/static/pyramid.png rename synthetic_tree_viewer/synthetic_tree_viewer/static/{theme.css => theme.ORIGINAL.css} (100%) rename synthetic_tree_viewer/synthetic_tree_viewer/templates/{layout.jinja2 => layout.ORIGINAL.jinja2} (100%) rename synthetic_tree_viewer/synthetic_tree_viewer/templates/{mytemplate.jinja2 => tree_view.jinja2} (100%) diff --git a/synthetic_tree_viewer/synthetic_tree_viewer/routes.py b/synthetic_tree_viewer/synthetic_tree_viewer/routes.py index 25504ad4d..8b7a69503 100644 --- a/synthetic_tree_viewer/synthetic_tree_viewer/routes.py +++ b/synthetic_tree_viewer/synthetic_tree_viewer/routes.py @@ -1,3 +1,6 @@ def includeme(config): config.add_static_view('static', 'static', cache_max_age=3600) - config.add_route('home', '/') + # match all explicit URLs before the default tree view + + # default synth-tree view (with catch-all path) + config.add_route('tree_view', '/{full_path:.*}') diff --git a/synthetic_tree_viewer/synthetic_tree_viewer/static/pyramid-16x16.png b/synthetic_tree_viewer/synthetic_tree_viewer/static/pyramid-16x16.png deleted file mode 100644 index 979203112e76ba4cfdb8cd6f108f4275e987d99a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1319 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`k|nMYCBgY=CFO}lsSJ)O`AMk? zp1FzXsX?iUDV2pMQ*9U+n3Xd_B1$5BeXNr6bM+EIYV;~{3xK*A7;Nk-3KEmEQ%e+* zQqwc@Y?a>c-mj#PnPRIHZt82`Ti~3Uk?B!Ylp0*+7m{3+ootz+WN)WnQ(*-(AUCxn zQK2F?C$HG5!d3}vt`(3C64qBz04piUwpD^SD#ABF!8yMuRl!uxR5#hc&_u!9QqR!T z(8R(}N5ROz&{*HVSl`fC*U-qyz|zXlQ~?TIxIyg#@@$ndN=gc>^!3Zj z%k|2Q_413-^$jg8E%gnI^o@*kfhu&1EAvVcD|GXUm0>2hq!uR^WfqiV=I1GZOiWD5 zFD$Tv3bSNU;+l1ennz|zM-B0$V)JVzP|XC=H|jx7ncO3BHWAB;NpiyW)Z+ZoqGVvir744~DzI`cN=+=uFAB-e&w+(vKt_H^esM;Afr7KMf`)Hma%LWg zuL;)R>ucqiS6q^qmz?V9Vygr+LN7Bj#mdRl*wM}0&C<--)xyxw)!5S9(bdAp)YZVy zz`)Yd%><^`B|o_|H#M&WrZ)wl*Ab^)P+G_>0NU)5T9jFqn&MWJpQ`}&vsET;x0vHJ z52`l>w_7Z5>eUB2MjsTjNHGl)0wy026P|8?9C*r4%>yR)B4E1CQ{KVEz`!`m)5S5Q z;#SXOUk#T)k>lxKj4~&v95M;sSJp8lNikLV)bX~~P1`qaNLZPZ<6^QgASli8jmk<% zZdJ~1%}JBkHhu^^q;ghbe{lMjv_0X)ug#yI+xz_S{hiM(g*saf_f6Pt#!wis>2u+! z{;RjXUlmP?^Kq|yJMn}2uJ~!L3EU-*{+zn6Ya6$jYueOB4G#Lx+=R;oM4sqe*Sq0$ zQ2Nf{-BFQxlX@Dog;`l=SkyQh`W)n22F}BoCTQYYC=p8g*kiK(1`FEnD$cY`NZX8<>GJicU)2$Vj5iRl-7k*od z3K)m{Gsp@4JM)eDo7z=gtG;>hu{QvcXxLU8eD@D+$BKJ@RM`zyYKvG z-8a3ur|aAMt1Vr-yH|CEDauQLkO+_f002lzQdIf%fB4Ui0QY*V)U3(^0FZ<%L_`#& zL`1-fj&^1i)}{b}Bq%eIA9uoG!laCfFcwoR zb`OTl9xm%u?u}UK6Z+-0LfvF1uNzRlu;BSs+a-xXQEAzvn#Z125}lrEE$o@!cYog? z@lko^ANF`uyQDsu%o2*s(%P^-sbKEJ1>90;Svb?qHr@sbgo4>hFv21pO(baNe1U?G_am z$%uaYhJupCKc=2k-Lpftu1m0%A~@dHZKRf6W*s6Qm&D`7K|3 zP8#?(KABe7=AZNd-k*6CTcqHJ?f3yA6ws8mf*wHc;}7VpNW)zn=9RJ4PSI>0zxN+V zk#)jtw`7ILRrYRCqD>sB@)+LaZvtH~TpCmeT z5;T(}&;kNeCnT`+Is{plpj-ki?E!QC9#b�i5=5IxreNAbVsKKM4p@aIXvt)VjX~ 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 Date: Tue, 13 Sep 2022 15:19:16 -0400 Subject: [PATCH 07/86] Copy all static assets and main/layout template --- .../synthetic_tree_viewer/static/403.html | 1 + .../synthetic_tree_viewer/static/404.html | 1 + .../synthetic_tree_viewer/static/500.html | 1 + .../static/css/bootstrap-responsive.css | 1088 ++++ .../static/css/bootstrap.css | 5281 +++++++++++++++++ .../static/css/calendar.css | 7 + .../static/css/jquery.splitter.css | 47 + .../static/css/web2py.css | 314 + .../static/css/web2py_bootstrap.css | 231 + .../static/css/web2py_bootstrap_nojs.css | 122 + .../synthetic_tree_viewer/static/favicon.ico | Bin 0 -> 370070 bytes .../static/images/Github.png | Bin 0 -> 2372 bytes .../static/images/Logo_Google_groups.png | Bin 0 -> 7089 bytes .../static/images/banner-dev.gif | Bin 0 -> 1519 bytes .../static/images/banner-staging.gif | Bin 0 -> 959 bytes .../static/images/facebook.png | Bin 0 -> 991 bytes .../static/images/gitter.png | Bin 0 -> 1717 bytes .../images/glyphicons-halflings-white.png | Bin 0 -> 8777 bytes .../static/images/glyphicons-halflings.png | Bin 0 -> 12799 bytes .../static/images/gplus-32.png | Bin 0 -> 1513 bytes .../static/images/logo.png | Bin 0 -> 48981 bytes .../static/images/mini-opentree-logo.png | Bin 0 -> 2252 bytes .../static/images/phylopic-vignette.png | Bin 0 -> 389 bytes .../static/images/spinner.gif | Bin 0 -> 36372 bytes .../static/images/tree-view-ancestors.png | Bin 0 -> 4652 bytes .../static/images/tree-view-dotted-paths.png | Bin 0 -> 3040 bytes .../static/images/tree-view-edge-info.png | Bin 0 -> 6976 bytes .../static/images/tree-view-node-info.png | Bin 0 -> 6824 bytes .../static/images/tree-view-node-jump.png | Bin 0 -> 7192 bytes .../static/images/tree-view-node-sizes.png | Bin 0 -> 3776 bytes .../static/images/tree-view-solid-paths.png | Bin 0 -> 3033 bytes .../static/images/tree-view-tips.png | Bin 0 -> 5925 bytes .../static/images/twitter.png | Bin 0 -> 1120 bytes .../static/img/glyphicons-halflings-white.png | Bin 0 -> 8777 bytes .../static/img/glyphicons-halflings.png | Bin 0 -> 12799 bytes .../static/js/analytics.min.js | 4 + .../static/js/argus/browser.html | 9 + .../static/js/argus/drawtree.js | 2188 +++++++ .../static/js/argus/format.css | 47 + .../static/js/argus/index.html | 30 + .../static/js/argus/jquery-1.7.2.min.js | 4 + .../static/js/argus/loadtaxdata.js | 138 + .../static/js/argus/nameresults.html | 17 + .../static/js/argus/raphael-min.js | 12 + .../static/js/bootstrap-affix.js | 117 + .../static/js/bootstrap-alert.js | 99 + .../static/js/bootstrap-button.js | 105 + .../static/js/bootstrap-carousel.js | 207 + .../static/js/bootstrap-collapse.js | 167 + .../static/js/bootstrap-dropdown.js | 176 + .../static/js/bootstrap-modal.js | 247 + .../static/js/bootstrap-popover.js | 114 + .../static/js/bootstrap-scrollspy.js | 162 + .../static/js/bootstrap-tab.js | 144 + .../static/js/bootstrap-tooltip.js | 361 ++ .../static/js/bootstrap-transition.js | 60 + .../static/js/bootstrap-typeahead.js | 335 ++ .../static/js/bootstrap.js | 2280 +++++++ .../static/js/bootstrap.min.js | 6 + .../static/js/calendar.js | 42 + .../static/js/dd_belatedpng.js | 13 + .../static/js/html5shiv.js | 8 + .../static/js/jquery-1.9.1.min.js | 5 + .../static/js/jquery.history.js | 1 + .../synthetic_tree_viewer/static/js/jquery.js | 2 + .../static/js/jquery.splitter-0.6.js | 215 + .../synthetic_tree_viewer/static/js/json2.js | 486 ++ .../static/js/modernizr.custom.js | 4 + .../static/js/moment.min.js | 7 + .../synthetic_tree_viewer/static/js/share.js | 44 + .../static/js/treeview.js | 1524 +++++ .../synthetic_tree_viewer/static/js/web2py.js | 218 + .../static/js/web2py_bootstrap.js | 28 + .../static/js/webapp-helpers.js | 194 + .../plugin_layouts/opentree/default.css | 570 ++ .../static/plugin_layouts/superfish.css | 139 + .../static/plugin_layouts/superfish.js | 121 + .../css/localcomments.css | 166 + .../synthetic_tree_viewer/static/robots.txt | 30 + .../static/statistics/ott.json | 62 + .../static/statistics/synthesis.json | 135 + .../synthetic_tree_viewer/static/temp.diff | 144 + .../templates/layout.jinja2 | 649 ++ 83 files changed, 18929 insertions(+) create mode 100644 synthetic_tree_viewer/synthetic_tree_viewer/static/403.html create mode 100644 synthetic_tree_viewer/synthetic_tree_viewer/static/404.html create mode 100644 synthetic_tree_viewer/synthetic_tree_viewer/static/500.html create mode 100644 synthetic_tree_viewer/synthetic_tree_viewer/static/css/bootstrap-responsive.css create mode 100644 synthetic_tree_viewer/synthetic_tree_viewer/static/css/bootstrap.css create mode 100644 synthetic_tree_viewer/synthetic_tree_viewer/static/css/calendar.css create mode 100644 synthetic_tree_viewer/synthetic_tree_viewer/static/css/jquery.splitter.css create mode 100644 synthetic_tree_viewer/synthetic_tree_viewer/static/css/web2py.css create mode 100644 synthetic_tree_viewer/synthetic_tree_viewer/static/css/web2py_bootstrap.css create mode 100644 synthetic_tree_viewer/synthetic_tree_viewer/static/css/web2py_bootstrap_nojs.css create mode 100644 synthetic_tree_viewer/synthetic_tree_viewer/static/favicon.ico create mode 100644 synthetic_tree_viewer/synthetic_tree_viewer/static/images/Github.png create mode 100644 synthetic_tree_viewer/synthetic_tree_viewer/static/images/Logo_Google_groups.png create mode 100644 synthetic_tree_viewer/synthetic_tree_viewer/static/images/banner-dev.gif create mode 100644 synthetic_tree_viewer/synthetic_tree_viewer/static/images/banner-staging.gif create mode 100644 synthetic_tree_viewer/synthetic_tree_viewer/static/images/facebook.png create mode 100644 synthetic_tree_viewer/synthetic_tree_viewer/static/images/gitter.png create mode 100755 synthetic_tree_viewer/synthetic_tree_viewer/static/images/glyphicons-halflings-white.png create mode 100755 synthetic_tree_viewer/synthetic_tree_viewer/static/images/glyphicons-halflings.png create mode 100644 synthetic_tree_viewer/synthetic_tree_viewer/static/images/gplus-32.png create mode 100644 synthetic_tree_viewer/synthetic_tree_viewer/static/images/logo.png create mode 100644 synthetic_tree_viewer/synthetic_tree_viewer/static/images/mini-opentree-logo.png create mode 100644 synthetic_tree_viewer/synthetic_tree_viewer/static/images/phylopic-vignette.png create mode 100644 synthetic_tree_viewer/synthetic_tree_viewer/static/images/spinner.gif create mode 100644 synthetic_tree_viewer/synthetic_tree_viewer/static/images/tree-view-ancestors.png create mode 100644 synthetic_tree_viewer/synthetic_tree_viewer/static/images/tree-view-dotted-paths.png create mode 100644 synthetic_tree_viewer/synthetic_tree_viewer/static/images/tree-view-edge-info.png create mode 100644 synthetic_tree_viewer/synthetic_tree_viewer/static/images/tree-view-node-info.png create mode 100644 synthetic_tree_viewer/synthetic_tree_viewer/static/images/tree-view-node-jump.png create mode 100644 synthetic_tree_viewer/synthetic_tree_viewer/static/images/tree-view-node-sizes.png create mode 100644 synthetic_tree_viewer/synthetic_tree_viewer/static/images/tree-view-solid-paths.png create mode 100644 synthetic_tree_viewer/synthetic_tree_viewer/static/images/tree-view-tips.png create mode 100644 synthetic_tree_viewer/synthetic_tree_viewer/static/images/twitter.png create mode 100644 synthetic_tree_viewer/synthetic_tree_viewer/static/img/glyphicons-halflings-white.png create mode 100644 synthetic_tree_viewer/synthetic_tree_viewer/static/img/glyphicons-halflings.png create mode 100644 synthetic_tree_viewer/synthetic_tree_viewer/static/js/analytics.min.js create mode 100644 synthetic_tree_viewer/synthetic_tree_viewer/static/js/argus/browser.html create mode 100644 synthetic_tree_viewer/synthetic_tree_viewer/static/js/argus/drawtree.js create mode 100644 synthetic_tree_viewer/synthetic_tree_viewer/static/js/argus/format.css create mode 100644 synthetic_tree_viewer/synthetic_tree_viewer/static/js/argus/index.html create mode 100644 synthetic_tree_viewer/synthetic_tree_viewer/static/js/argus/jquery-1.7.2.min.js create mode 100644 synthetic_tree_viewer/synthetic_tree_viewer/static/js/argus/loadtaxdata.js create mode 100644 synthetic_tree_viewer/synthetic_tree_viewer/static/js/argus/nameresults.html create mode 100644 synthetic_tree_viewer/synthetic_tree_viewer/static/js/argus/raphael-min.js create mode 100644 synthetic_tree_viewer/synthetic_tree_viewer/static/js/bootstrap-affix.js create mode 100644 synthetic_tree_viewer/synthetic_tree_viewer/static/js/bootstrap-alert.js create mode 100644 synthetic_tree_viewer/synthetic_tree_viewer/static/js/bootstrap-button.js create mode 100644 synthetic_tree_viewer/synthetic_tree_viewer/static/js/bootstrap-carousel.js create mode 100644 synthetic_tree_viewer/synthetic_tree_viewer/static/js/bootstrap-collapse.js create mode 100644 synthetic_tree_viewer/synthetic_tree_viewer/static/js/bootstrap-dropdown.js create mode 100644 synthetic_tree_viewer/synthetic_tree_viewer/static/js/bootstrap-modal.js create mode 100644 synthetic_tree_viewer/synthetic_tree_viewer/static/js/bootstrap-popover.js create mode 100644 synthetic_tree_viewer/synthetic_tree_viewer/static/js/bootstrap-scrollspy.js create mode 100644 synthetic_tree_viewer/synthetic_tree_viewer/static/js/bootstrap-tab.js create mode 100644 synthetic_tree_viewer/synthetic_tree_viewer/static/js/bootstrap-tooltip.js create mode 100644 synthetic_tree_viewer/synthetic_tree_viewer/static/js/bootstrap-transition.js create mode 100644 synthetic_tree_viewer/synthetic_tree_viewer/static/js/bootstrap-typeahead.js create mode 100644 synthetic_tree_viewer/synthetic_tree_viewer/static/js/bootstrap.js create mode 100644 synthetic_tree_viewer/synthetic_tree_viewer/static/js/bootstrap.min.js create mode 100644 synthetic_tree_viewer/synthetic_tree_viewer/static/js/calendar.js create mode 100644 synthetic_tree_viewer/synthetic_tree_viewer/static/js/dd_belatedpng.js create mode 100644 synthetic_tree_viewer/synthetic_tree_viewer/static/js/html5shiv.js create mode 100644 synthetic_tree_viewer/synthetic_tree_viewer/static/js/jquery-1.9.1.min.js create mode 100644 synthetic_tree_viewer/synthetic_tree_viewer/static/js/jquery.history.js create mode 100644 synthetic_tree_viewer/synthetic_tree_viewer/static/js/jquery.js create mode 100644 synthetic_tree_viewer/synthetic_tree_viewer/static/js/jquery.splitter-0.6.js create mode 100644 synthetic_tree_viewer/synthetic_tree_viewer/static/js/json2.js create mode 100644 synthetic_tree_viewer/synthetic_tree_viewer/static/js/modernizr.custom.js create mode 100644 synthetic_tree_viewer/synthetic_tree_viewer/static/js/moment.min.js create mode 100644 synthetic_tree_viewer/synthetic_tree_viewer/static/js/share.js create mode 100644 synthetic_tree_viewer/synthetic_tree_viewer/static/js/treeview.js create mode 100644 synthetic_tree_viewer/synthetic_tree_viewer/static/js/web2py.js create mode 100644 synthetic_tree_viewer/synthetic_tree_viewer/static/js/web2py_bootstrap.js create mode 100644 synthetic_tree_viewer/synthetic_tree_viewer/static/js/webapp-helpers.js create mode 100644 synthetic_tree_viewer/synthetic_tree_viewer/static/plugin_layouts/opentree/default.css create mode 100644 synthetic_tree_viewer/synthetic_tree_viewer/static/plugin_layouts/superfish.css create mode 100644 synthetic_tree_viewer/synthetic_tree_viewer/static/plugin_layouts/superfish.js create mode 100644 synthetic_tree_viewer/synthetic_tree_viewer/static/plugin_localcomments/css/localcomments.css create mode 100644 synthetic_tree_viewer/synthetic_tree_viewer/static/robots.txt create mode 100644 synthetic_tree_viewer/synthetic_tree_viewer/static/statistics/ott.json create mode 100644 synthetic_tree_viewer/synthetic_tree_viewer/static/statistics/synthesis.json create mode 100644 synthetic_tree_viewer/synthetic_tree_viewer/static/temp.diff create mode 100644 synthetic_tree_viewer/synthetic_tree_viewer/templates/layout.jinja2 diff --git a/synthetic_tree_viewer/synthetic_tree_viewer/static/403.html b/synthetic_tree_viewer/synthetic_tree_viewer/static/403.html new file mode 100644 index 000000000..e1a29c1fe --- /dev/null +++ b/synthetic_tree_viewer/synthetic_tree_viewer/static/403.html @@ -0,0 +1 @@ +403 diff --git a/synthetic_tree_viewer/synthetic_tree_viewer/static/404.html b/synthetic_tree_viewer/synthetic_tree_viewer/static/404.html new file mode 100644 index 000000000..f1b1cb3af --- /dev/null +++ b/synthetic_tree_viewer/synthetic_tree_viewer/static/404.html @@ -0,0 +1 @@ +404 diff --git a/synthetic_tree_viewer/synthetic_tree_viewer/static/500.html b/synthetic_tree_viewer/synthetic_tree_viewer/static/500.html new file mode 100644 index 000000000..1b79f38e2 --- /dev/null +++ b/synthetic_tree_viewer/synthetic_tree_viewer/static/500.html @@ -0,0 +1 @@ +500 diff --git a/synthetic_tree_viewer/synthetic_tree_viewer/static/css/bootstrap-responsive.css b/synthetic_tree_viewer/synthetic_tree_viewer/static/css/bootstrap-responsive.css new file mode 100644 index 000000000..d8bfaecf0 --- /dev/null +++ b/synthetic_tree_viewer/synthetic_tree_viewer/static/css/bootstrap-responsive.css @@ -0,0 +1,1088 @@ +/*! + * Bootstrap Responsive v2.3.2 + * + * Copyright 2012 Twitter, Inc + * Licensed under the Apache License v2.0 + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Designed and built with all the love in the world @twitter by @mdo and @fat. + */ +.clearfix { + *zoom: 1; +} +.clearfix:before, +.clearfix:after { + display: table; + content: ""; + line-height: 0; +} +.clearfix:after { + clear: both; +} +.hide-text { + font: 0/0 a; + color: transparent; + text-shadow: none; + background-color: transparent; + border: 0; +} +.input-block-level { + display: block; + width: 100%; + min-height: 30px; + -webkit-box-sizing: border-box; + -moz-box-sizing: border-box; + box-sizing: border-box; +} +@-ms-viewport { + width: device-width; +} +.hidden { + display: none; + visibility: hidden; +} +.visible-phone { + display: none !important; +} +.visible-tablet { + display: none !important; +} +.hidden-desktop { + display: none !important; +} +.visible-desktop { + display: inherit !important; +} +@media (min-width: 768px) and (max-width: 979px) { + .hidden-desktop { + display: inherit !important; + } + .visible-desktop { + display: none !important ; + } + .visible-tablet { + display: inherit !important; + } + .hidden-tablet { + display: none !important; + } +} +@media (max-width: 767px) { + .hidden-desktop { + display: inherit !important; + } + .visible-desktop { + display: none !important; + } + .visible-phone { + display: inherit !important; + } + .hidden-phone { + display: none !important; + } +} +.visible-print { + display: none !important; +} +@media print { + .visible-print { + display: inherit !important; + } + .hidden-print { + display: none !important; + } +} +@media (min-width: 1200px) { + .row { + margin-left: -30px; + *zoom: 1; + } + .row:before, + .row:after { + display: table; + content: ""; + line-height: 0; + } + .row:after { + clear: both; + } + [class*="span"] { + float: left; + min-height: 1px; + margin-left: 30px; + } + .container, + .navbar-static-top .container, + .navbar-fixed-top .container, + .navbar-fixed-bottom .container { + width: 1170px; + } + .span12 { + width: 1170px; + } + .span11 { + width: 1070px; + } + .span10 { + width: 970px; + } + .span9 { + width: 870px; + } + .span8 { + width: 770px; + } + .span7 { + width: 670px; + } + .span6 { + width: 570px; + } + .span5 { + width: 470px; + } + .span4 { + width: 370px; + } + .span3 { + width: 270px; + } + .span2 { + width: 170px; + } + .span1 { + width: 70px; + } + .offset12 { + margin-left: 1230px; + } + .offset11 { + margin-left: 1130px; + } + .offset10 { + margin-left: 1030px; + } + .offset9 { + margin-left: 930px; + } + .offset8 { + margin-left: 830px; + } + .offset7 { + margin-left: 730px; + } + .offset6 { + margin-left: 630px; + } + .offset5 { + margin-left: 530px; + } + .offset4 { + margin-left: 430px; + } + .offset3 { + margin-left: 330px; + } + .offset2 { + margin-left: 230px; + } + .offset1 { + margin-left: 130px; + } + .row-fluid { + width: 100%; + *zoom: 1; + } + .row-fluid:before, + .row-fluid:after { + display: table; + content: ""; + line-height: 0; + } + .row-fluid:after { + clear: both; + } + .row-fluid [class*="span"] { + display: block; + width: 100%; + min-height: 30px; + -webkit-box-sizing: border-box; + -moz-box-sizing: border-box; + box-sizing: border-box; + float: left; + margin-left: 2.564102564102564%; + *margin-left: 2.5109110747408616%; + } + .row-fluid [class*="span"]:first-child { + margin-left: 0; + } + .row-fluid .controls-row [class*="span"] + [class*="span"] { + margin-left: 2.564102564102564%; + } + .row-fluid .span12 { + width: 100%; + *width: 99.94680851063829%; + } + .row-fluid .span11 { + width: 91.45299145299145%; + *width: 91.39979996362975%; + } + .row-fluid .span10 { + width: 82.90598290598291%; + *width: 82.8527914166212%; + } + .row-fluid .span9 { + width: 74.35897435897436%; + *width: 74.30578286961266%; + } + .row-fluid .span8 { + width: 65.81196581196582%; + *width: 65.75877432260411%; + } + .row-fluid .span7 { + width: 57.26495726495726%; + *width: 57.21176577559556%; + } + .row-fluid .span6 { + width: 48.717948717948715%; + *width: 48.664757228587014%; + } + .row-fluid .span5 { + width: 40.17094017094017%; + *width: 40.11774868157847%; + } + .row-fluid .span4 { + width: 31.623931623931625%; + *width: 31.570740134569924%; + } + .row-fluid .span3 { + width: 23.076923076923077%; + *width: 23.023731587561375%; + } + .row-fluid .span2 { + width: 14.52991452991453%; + *width: 14.476723040552828%; + } + .row-fluid .span1 { + width: 5.982905982905983%; + *width: 5.929714493544281%; + } + .row-fluid .offset12 { + margin-left: 105.12820512820512%; + *margin-left: 105.02182214948171%; + } + .row-fluid .offset12:first-child { + margin-left: 102.56410256410257%; + *margin-left: 102.45771958537915%; + } + .row-fluid .offset11 { + margin-left: 96.58119658119658%; + *margin-left: 96.47481360247316%; + } + .row-fluid .offset11:first-child { + margin-left: 94.01709401709402%; + *margin-left: 93.91071103837061%; + } + .row-fluid .offset10 { + margin-left: 88.03418803418803%; + *margin-left: 87.92780505546462%; + } + .row-fluid .offset10:first-child { + margin-left: 85.47008547008548%; + *margin-left: 85.36370249136206%; + } + .row-fluid .offset9 { + margin-left: 79.48717948717949%; + *margin-left: 79.38079650845607%; + } + .row-fluid .offset9:first-child { + margin-left: 76.92307692307693%; + *margin-left: 76.81669394435352%; + } + .row-fluid .offset8 { + margin-left: 70.94017094017094%; + *margin-left: 70.83378796144753%; + } + .row-fluid .offset8:first-child { + margin-left: 68.37606837606839%; + *margin-left: 68.26968539734497%; + } + .row-fluid .offset7 { + margin-left: 62.393162393162385%; + *margin-left: 62.28677941443899%; + } + .row-fluid .offset7:first-child { + margin-left: 59.82905982905982%; + *margin-left: 59.72267685033642%; + } + .row-fluid .offset6 { + margin-left: 53.84615384615384%; + *margin-left: 53.739770867430444%; + } + .row-fluid .offset6:first-child { + margin-left: 51.28205128205128%; + *margin-left: 51.175668303327875%; + } + .row-fluid .offset5 { + margin-left: 45.299145299145295%; + *margin-left: 45.1927623204219%; + } + .row-fluid .offset5:first-child { + margin-left: 42.73504273504273%; + *margin-left: 42.62865975631933%; + } + .row-fluid .offset4 { + margin-left: 36.75213675213675%; + *margin-left: 36.645753773413354%; + } + .row-fluid .offset4:first-child { + margin-left: 34.18803418803419%; + *margin-left: 34.081651209310785%; + } + .row-fluid .offset3 { + margin-left: 28.205128205128204%; + *margin-left: 28.0987452264048%; + } + .row-fluid .offset3:first-child { + margin-left: 25.641025641025642%; + *margin-left: 25.53464266230224%; + } + .row-fluid .offset2 { + margin-left: 19.65811965811966%; + *margin-left: 19.551736679396257%; + } + .row-fluid .offset2:first-child { + margin-left: 17.094017094017094%; + *margin-left: 16.98763411529369%; + } + .row-fluid .offset1 { + margin-left: 11.11111111111111%; + *margin-left: 11.004728132387708%; + } + .row-fluid .offset1:first-child { + margin-left: 8.547008547008547%; + *margin-left: 8.440625568285142%; + } + input, + textarea, + .uneditable-input { + margin-left: 0; + } + .controls-row [class*="span"] + [class*="span"] { + margin-left: 30px; + } + input.span12, + textarea.span12, + .uneditable-input.span12 { + width: 1156px; + } + input.span11, + textarea.span11, + .uneditable-input.span11 { + width: 1056px; + } + input.span10, + textarea.span10, + .uneditable-input.span10 { + width: 956px; + } + input.span9, + textarea.span9, + .uneditable-input.span9 { + width: 856px; + } + input.span8, + textarea.span8, + .uneditable-input.span8 { + width: 756px; + } + input.span7, + textarea.span7, + .uneditable-input.span7 { + width: 656px; + } + input.span6, + textarea.span6, + .uneditable-input.span6 { + width: 556px; + } + input.span5, + textarea.span5, + .uneditable-input.span5 { + width: 456px; + } + input.span4, + textarea.span4, + .uneditable-input.span4 { + width: 356px; + } + input.span3, + textarea.span3, + .uneditable-input.span3 { + width: 256px; + } + input.span2, + textarea.span2, + .uneditable-input.span2 { + width: 156px; + } + input.span1, + textarea.span1, + .uneditable-input.span1 { + width: 56px; + } + .thumbnails { + margin-left: -30px; + } + .thumbnails > li { + margin-left: 30px; + } + .row-fluid .thumbnails { + margin-left: 0; + } +} +@media (min-width: 768px) and (max-width: 979px) { + .row { + margin-left: -20px; + *zoom: 1; + } + .row:before, + .row:after { + display: table; + content: ""; + line-height: 0; + } + .row:after { + clear: both; + } + [class*="span"] { + float: left; + min-height: 1px; + margin-left: 20px; + } + .container, + .navbar-static-top .container, + .navbar-fixed-top .container, + .navbar-fixed-bottom .container { + width: 724px; + } + .span12 { + width: 724px; + } + .span11 { + width: 662px; + } + .span10 { + width: 600px; + } + .span9 { + width: 538px; + } + .span8 { + width: 476px; + } + .span7 { + width: 414px; + } + .span6 { + width: 352px; + } + .span5 { + width: 290px; + } + .span4 { + width: 228px; + } + .span3 { + width: 166px; + } + .span2 { + width: 104px; + } + .span1 { + width: 42px; + } + .offset12 { + margin-left: 764px; + } + .offset11 { + margin-left: 702px; + } + .offset10 { + margin-left: 640px; + } + .offset9 { + margin-left: 578px; + } + .offset8 { + margin-left: 516px; + } + .offset7 { + margin-left: 454px; + } + .offset6 { + margin-left: 392px; + } + .offset5 { + margin-left: 330px; + } + .offset4 { + margin-left: 268px; + } + .offset3 { + margin-left: 206px; + } + .offset2 { + margin-left: 144px; + } + .offset1 { + margin-left: 82px; + } + .row-fluid { + width: 100%; + *zoom: 1; + } + .row-fluid:before, + .row-fluid:after { + display: table; + content: ""; + line-height: 0; + } + .row-fluid:after { + clear: both; + } + .row-fluid [class*="span"] { + display: block; + width: 100%; + min-height: 30px; + -webkit-box-sizing: border-box; + -moz-box-sizing: border-box; + box-sizing: border-box; + float: left; + margin-left: 2.7624309392265194%; + *margin-left: 2.709239449864817%; + } + .row-fluid [class*="span"]:first-child { + margin-left: 0; + } + .row-fluid .controls-row [class*="span"] + [class*="span"] { + margin-left: 2.7624309392265194%; + } + .row-fluid .span12 { + width: 100%; + *width: 99.94680851063829%; + } + .row-fluid .span11 { + width: 91.43646408839778%; + *width: 91.38327259903608%; + } + .row-fluid .span10 { + width: 82.87292817679558%; + *width: 82.81973668743387%; + } + .row-fluid .span9 { + width: 74.30939226519337%; + *width: 74.25620077583166%; + } + .row-fluid .span8 { + width: 65.74585635359117%; + *width: 65.69266486422946%; + } + .row-fluid .span7 { + width: 57.18232044198895%; + *width: 57.12912895262725%; + } + .row-fluid .span6 { + width: 48.61878453038674%; + *width: 48.56559304102504%; + } + .row-fluid .span5 { + width: 40.05524861878453%; + *width: 40.00205712942283%; + } + .row-fluid .span4 { + width: 31.491712707182323%; + *width: 31.43852121782062%; + } + .row-fluid .span3 { + width: 22.92817679558011%; + *width: 22.87498530621841%; + } + .row-fluid .span2 { + width: 14.3646408839779%; + *width: 14.311449394616199%; + } + .row-fluid .span1 { + width: 5.801104972375691%; + *width: 5.747913483013988%; + } + .row-fluid .offset12 { + margin-left: 105.52486187845304%; + *margin-left: 105.41847889972962%; + } + .row-fluid .offset12:first-child { + margin-left: 102.76243093922652%; + *margin-left: 102.6560479605031%; + } + .row-fluid .offset11 { + margin-left: 96.96132596685082%; + *margin-left: 96.8549429881274%; + } + .row-fluid .offset11:first-child { + margin-left: 94.1988950276243%; + *margin-left: 94.09251204890089%; + } + .row-fluid .offset10 { + margin-left: 88.39779005524862%; + *margin-left: 88.2914070765252%; + } + .row-fluid .offset10:first-child { + margin-left: 85.6353591160221%; + *margin-left: 85.52897613729868%; + } + .row-fluid .offset9 { + margin-left: 79.8342541436464%; + *margin-left: 79.72787116492299%; + } + .row-fluid .offset9:first-child { + margin-left: 77.07182320441989%; + *margin-left: 76.96544022569647%; + } + .row-fluid .offset8 { + margin-left: 71.2707182320442%; + *margin-left: 71.16433525332079%; + } + .row-fluid .offset8:first-child { + margin-left: 68.50828729281768%; + *margin-left: 68.40190431409427%; + } + .row-fluid .offset7 { + margin-left: 62.70718232044199%; + *margin-left: 62.600799341718584%; + } + .row-fluid .offset7:first-child { + margin-left: 59.94475138121547%; + *margin-left: 59.838368402492065%; + } + .row-fluid .offset6 { + margin-left: 54.14364640883978%; + *margin-left: 54.037263430116376%; + } + .row-fluid .offset6:first-child { + margin-left: 51.38121546961326%; + *margin-left: 51.27483249088986%; + } + .row-fluid .offset5 { + margin-left: 45.58011049723757%; + *margin-left: 45.47372751851417%; + } + .row-fluid .offset5:first-child { + margin-left: 42.81767955801105%; + *margin-left: 42.71129657928765%; + } + .row-fluid .offset4 { + margin-left: 37.01657458563536%; + *margin-left: 36.91019160691196%; + } + .row-fluid .offset4:first-child { + margin-left: 34.25414364640884%; + *margin-left: 34.14776066768544%; + } + .row-fluid .offset3 { + margin-left: 28.45303867403315%; + *margin-left: 28.346655695309746%; + } + .row-fluid .offset3:first-child { + margin-left: 25.69060773480663%; + *margin-left: 25.584224756083227%; + } + .row-fluid .offset2 { + margin-left: 19.88950276243094%; + *margin-left: 19.783119783707537%; + } + .row-fluid .offset2:first-child { + margin-left: 17.12707182320442%; + *margin-left: 17.02068884448102%; + } + .row-fluid .offset1 { + margin-left: 11.32596685082873%; + *margin-left: 11.219583872105325%; + } + .row-fluid .offset1:first-child { + margin-left: 8.56353591160221%; + *margin-left: 8.457152932878806%; + } + input, + textarea, + .uneditable-input { + margin-left: 0; + } + .controls-row [class*="span"] + [class*="span"] { + margin-left: 20px; + } + input.span12, + textarea.span12, + .uneditable-input.span12 { + width: 710px; + } + input.span11, + textarea.span11, + .uneditable-input.span11 { + width: 648px; + } + input.span10, + textarea.span10, + .uneditable-input.span10 { + width: 586px; + } + input.span9, + textarea.span9, + .uneditable-input.span9 { + width: 524px; + } + input.span8, + textarea.span8, + .uneditable-input.span8 { + width: 462px; + } + input.span7, + textarea.span7, + .uneditable-input.span7 { + width: 400px; + } + input.span6, + textarea.span6, + .uneditable-input.span6 { + width: 338px; + } + input.span5, + textarea.span5, + .uneditable-input.span5 { + width: 276px; + } + input.span4, + textarea.span4, + .uneditable-input.span4 { + width: 214px; + } + input.span3, + textarea.span3, + .uneditable-input.span3 { + width: 152px; + } + input.span2, + textarea.span2, + .uneditable-input.span2 { + width: 90px; + } + input.span1, + textarea.span1, + .uneditable-input.span1 { + width: 28px; + } +} +@media (max-width: 767px) { + body { + padding-left: 20px; + padding-right: 20px; + } + .navbar-fixed-top, + .navbar-fixed-bottom, + .navbar-static-top { + margin-left: -20px; + margin-right: -20px; + } + .container-fluid { + padding: 0; + } + .dl-horizontal dt { + float: none; + clear: none; + width: auto; + text-align: left; + } + .dl-horizontal dd { + margin-left: 0; + } + .container { + width: auto; + } + .row-fluid { + width: 100%; + } + .row, + .thumbnails { + margin-left: 0; + } + .thumbnails > li { + float: none; + margin-left: 0; + } + [class*="span"], + .uneditable-input[class*="span"], + .row-fluid [class*="span"] { + float: none; + display: block; + width: 100%; + margin-left: 0; + -webkit-box-sizing: border-box; + -moz-box-sizing: border-box; + box-sizing: border-box; + } + .span12, + .row-fluid .span12 { + width: 100%; + -webkit-box-sizing: border-box; + -moz-box-sizing: border-box; + box-sizing: border-box; + } + .row-fluid [class*="offset"]:first-child { + margin-left: 0; + } + .input-large, + .input-xlarge, + .input-xxlarge, + input[class*="span"], + select[class*="span"], + textarea[class*="span"], + .uneditable-input { + display: block; + width: 100%; + min-height: 30px; + -webkit-box-sizing: border-box; + -moz-box-sizing: border-box; + box-sizing: border-box; + } + .input-prepend input, + .input-append input, + .input-prepend input[class*="span"], + .input-append input[class*="span"] { + display: inline-block; + width: auto; + } + .controls-row [class*="span"] + [class*="span"] { + margin-left: 0; + } + .modal { + position: fixed; + top: 20px; + left: 20px; + right: 20px; + width: auto; + margin: 0; + } + .modal.fade { + top: -100px; + } + .modal.fade.in { + top: 20px; + } +} +@media (max-width: 480px) { + .nav-collapse { + -webkit-transform: translate3d(0, 0, 0); + } + .page-header h1 small { + display: block; + line-height: 20px; + } + input[type="checkbox"], + input[type="radio"] { + border: 1px solid #ccc; + } + .form-horizontal .control-label { + float: none; + width: auto; + padding-top: 0; + text-align: left; + } + .form-horizontal .controls { + margin-left: 0; + } + .form-horizontal .control-list { + padding-top: 0; + } + .form-horizontal .form-actions { + padding-left: 10px; + padding-right: 10px; + } + .media .pull-left, + .media .pull-right { + float: none; + display: block; + margin-bottom: 10px; + } + .media-object { + margin-right: 0; + margin-left: 0; + } + .modal { + top: 10px; + left: 10px; + right: 10px; + } + .modal-header .close { + padding: 10px; + margin: -10px; + } + .carousel-caption { + position: static; + } +} +@media (max-width: 979px) { + body { + padding-top: 0; + } + .navbar-fixed-top, + .navbar-fixed-bottom { + position: static; + } + .navbar-fixed-top { + margin-bottom: 20px; + } + .navbar-fixed-bottom { + margin-top: 20px; + } + .navbar-fixed-top .navbar-inner, + .navbar-fixed-bottom .navbar-inner { + padding: 5px; + } + .navbar .container { + width: auto; + padding: 0; + } + .navbar .brand { + padding-left: 10px; + padding-right: 10px; + margin: 0 0 0 -5px; + } + .nav-collapse { + clear: both; + } + .nav-collapse .nav { + float: none; + margin: 0 0 10px; + } + .nav-collapse .nav > li { + float: none; + } + .nav-collapse .nav > li > a { + margin-bottom: 2px; + } + .nav-collapse .nav > .divider-vertical { + display: none; + } + .nav-collapse .nav .nav-header { + color: #777777; + text-shadow: none; + } + .nav-collapse .nav > li > a, + .nav-collapse .dropdown-menu a { + padding: 9px 15px; + font-weight: bold; + color: #777777; + -webkit-border-radius: 3px; + -moz-border-radius: 3px; + border-radius: 3px; + } + .nav-collapse .btn { + padding: 4px 10px 4px; + font-weight: normal; + -webkit-border-radius: 4px; + -moz-border-radius: 4px; + border-radius: 4px; + } + .nav-collapse .dropdown-menu li + li a { + margin-bottom: 2px; + } + .nav-collapse .nav > li > a:hover, + .nav-collapse .nav > li > a:focus, + .nav-collapse .dropdown-menu a:hover, + .nav-collapse .dropdown-menu a:focus { + background-color: #f2f2f2; + } + .navbar-inverse .nav-collapse .nav > li > a, + .navbar-inverse .nav-collapse .dropdown-menu a { + color: #999999; + } + .navbar-inverse .nav-collapse .nav > li > a:hover, + .navbar-inverse .nav-collapse .nav > li > a:focus, + .navbar-inverse .nav-collapse .dropdown-menu a:hover, + .navbar-inverse .nav-collapse .dropdown-menu a:focus { + background-color: #111111; + } + .nav-collapse.in .btn-group { + margin-top: 5px; + padding: 0; + } + .nav-collapse .dropdown-menu { + position: static; + top: auto; + left: auto; + float: none; + display: none; + max-width: none; + margin: 0 15px; + padding: 0; + background-color: transparent; + border: none; + -webkit-border-radius: 0; + -moz-border-radius: 0; + border-radius: 0; + -webkit-box-shadow: none; + -moz-box-shadow: none; + box-shadow: none; + } + .nav-collapse .open > .dropdown-menu { + display: block; + } + .nav-collapse .dropdown-menu:before, + .nav-collapse .dropdown-menu:after { + display: none; + } + .nav-collapse .dropdown-menu .divider { + display: none; + } + .nav-collapse .nav > li > .dropdown-menu:before, + .nav-collapse .nav > li > .dropdown-menu:after { + display: none; + } + .nav-collapse .navbar-form, + .nav-collapse .navbar-search { + float: none; + padding: 10px 15px; + margin: 10px 0; + border-top: 1px solid #f2f2f2; + border-bottom: 1px solid #f2f2f2; + -webkit-box-shadow: inset 0 1px 0 rgba(255,255,255,.1), 0 1px 0 rgba(255,255,255,.1); + -moz-box-shadow: inset 0 1px 0 rgba(255,255,255,.1), 0 1px 0 rgba(255,255,255,.1); + box-shadow: inset 0 1px 0 rgba(255,255,255,.1), 0 1px 0 rgba(255,255,255,.1); + } + .navbar-inverse .nav-collapse .navbar-form, + .navbar-inverse .nav-collapse .navbar-search { + border-top-color: #111111; + border-bottom-color: #111111; + } + .navbar .nav-collapse .nav.pull-right { + float: none; + margin-left: 0; + } + .nav-collapse, + .nav-collapse.collapse { + overflow: hidden; + height: 0; + } + .navbar .btn-navbar { + display: block; + } + .navbar-static .navbar-inner { + padding-left: 10px; + padding-right: 10px; + } +} +@media (min-width: 980px) { + .nav-collapse.collapse { + height: auto !important; + overflow: visible !important; + } +} diff --git a/synthetic_tree_viewer/synthetic_tree_viewer/static/css/bootstrap.css b/synthetic_tree_viewer/synthetic_tree_viewer/static/css/bootstrap.css new file mode 100644 index 000000000..0c18c04ad --- /dev/null +++ b/synthetic_tree_viewer/synthetic_tree_viewer/static/css/bootstrap.css @@ -0,0 +1,5281 @@ +/*! + * Bootstrap v2.3.2 + * + * Copyright 2012 Twitter, Inc + * Licensed under the Apache License v2.0 + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Designed and built with all the love in the world @twitter by @mdo and @fat. + */ +.clearfix { + *zoom: 1; +} +.clearfix:before, +.clearfix:after { + display: table; + content: ""; + line-height: 0; +} +.clearfix:after { + clear: both; +} +.hide-text { + font: 0/0 a; + color: transparent; + text-shadow: none; + background-color: transparent; + border: 0; +} +.input-block-level { + display: block; + width: 100%; + min-height: 30px; + -webkit-box-sizing: border-box; + -moz-box-sizing: border-box; + box-sizing: border-box; +} +article, +aside, +details, +figcaption, +figure, +footer, +header, +hgroup, +nav, +section { + display: block; +} +audio, +canvas, +video { + display: inline-block; + *display: inline; + *zoom: 1; +} +audio:not([controls]) { + display: none; +} +html { + font-size: 100%; + -webkit-text-size-adjust: 100%; + -ms-text-size-adjust: 100%; +} +a:focus { + outline: thin dotted #333; + outline: 5px auto -webkit-focus-ring-color; + outline-offset: -2px; +} +a:hover, +a:active { + outline: 0; +} +sub, +sup { + position: relative; + font-size: 75%; + line-height: 0; + vertical-align: baseline; +} +sup { + top: -0.5em; +} +sub { + bottom: -0.25em; +} +img { + /* Responsive images (ensure images don't scale beyond their parents) */ + + max-width: 100%; + /* Part 1: Set a maxium relative to the parent */ + + width: auto\9; + /* IE7-8 need help adjusting responsive images */ + + height: auto; + /* Part 2: Scale the height according to the width, otherwise you get stretching */ + + vertical-align: middle; + border: 0; + -ms-interpolation-mode: bicubic; +} +#map_canvas img, +.google-maps img { + max-width: none; +} +button, +input, +select, +textarea { + margin: 0; + font-size: 100%; + vertical-align: middle; +} +button, +input { + *overflow: visible; + line-height: normal; +} +button::-moz-focus-inner, +input::-moz-focus-inner { + padding: 0; + border: 0; +} +button, +html input[type="button"], +input[type="reset"], +input[type="submit"] { + -webkit-appearance: button; + cursor: pointer; +} +label, +select, +button, +input[type="button"], +input[type="reset"], +input[type="submit"], +input[type="radio"], +input[type="checkbox"] { + cursor: pointer; +} +input[type="search"] { + -webkit-box-sizing: content-box; + -moz-box-sizing: content-box; + box-sizing: content-box; + -webkit-appearance: textfield; +} +input[type="search"]::-webkit-search-decoration, +input[type="search"]::-webkit-search-cancel-button { + -webkit-appearance: none; +} +textarea { + overflow: auto; + vertical-align: top; +} +@media print { + * { + text-shadow: none !important; + color: #000 !important; + background: transparent !important; + box-shadow: none !important; + } + a, + a:visited { + text-decoration: underline; + } + a[href]:after { + content: " (" attr(href) ")"; + } + abbr[title]:after { + content: " (" attr(title) ")"; + } + .ir a:after, + a[href^="javascript:"]:after, + a[href^="#"]:after { + content: ""; + } + pre, + blockquote { + border: 1px solid #999; + page-break-inside: avoid; + } + thead { + display: table-header-group; + } + tr, + img { + page-break-inside: avoid; + } + img { + max-width: 100% !important; + } + @page { + margin: 0.5cm; + } + p, + h2, + h3 { + orphans: 3; + widows: 3; + } + h2, + h3 { + page-break-after: avoid; + } +} +body { + margin: 0; + font-family: "Helvetica Neue", Helvetica, Arial, sans-serif; + font-size: 14px; + line-height: 20px; + color: #333333; + background-color: #ffffff; +} +a { + color: #0088cc; + text-decoration: none; +} +a:hover, +a:focus { + color: #005580; + text-decoration: underline; +} +.img-rounded { + -webkit-border-radius: 6px; + -moz-border-radius: 6px; + border-radius: 6px; +} +.img-polaroid { + padding: 4px; + background-color: #fff; + border: 1px solid #ccc; + border: 1px solid rgba(0, 0, 0, 0.2); + -webkit-box-shadow: 0 1px 3px rgba(0, 0, 0, 0.1); + -moz-box-shadow: 0 1px 3px rgba(0, 0, 0, 0.1); + box-shadow: 0 1px 3px rgba(0, 0, 0, 0.1); +} +.img-circle { + -webkit-border-radius: 500px; + -moz-border-radius: 500px; + border-radius: 500px; +} +.row { + margin-left: -20px; + *zoom: 1; +} +.row:before, +.row:after { + display: table; + content: ""; + line-height: 0; +} +.row:after { + clear: both; +} +[class*="span"] { + float: left; + min-height: 1px; + margin-left: 20px; +} +.container, +.navbar-static-top .container, +.navbar-fixed-top .container, +.navbar-fixed-bottom .container { + width: 940px; +} +.span12 { + width: 940px; +} +.span11 { + width: 860px; +} +.span10 { + width: 780px; +} +.span9 { + width: 700px; +} +.span8 { + width: 620px; +} +.span7 { + width: 540px; +} +.span6 { + width: 460px; +} +.span5 { + width: 380px; +} +.span4 { + width: 300px; +} +.span3 { + width: 220px; +} +.span2 { + width: 140px; +} +.span1 { + width: 60px; +} +.offset12 { + margin-left: 980px; +} +.offset11 { + margin-left: 900px; +} +.offset10 { + margin-left: 820px; +} +.offset9 { + margin-left: 740px; +} +.offset8 { + margin-left: 660px; +} +.offset7 { + margin-left: 580px; +} +.offset6 { + margin-left: 500px; +} +.offset5 { + margin-left: 420px; +} +.offset4 { + margin-left: 340px; +} +.offset3 { + margin-left: 260px; +} +.offset2 { + margin-left: 180px; +} +.offset1 { + margin-left: 100px; +} +.row-fluid { + width: 100%; + *zoom: 1; +} +.row-fluid:before, +.row-fluid:after { + display: table; + content: ""; + line-height: 0; +} +.row-fluid:after { + clear: both; +} +.row-fluid [class*="span"] { + display: block; + width: 100%; + min-height: 30px; + -webkit-box-sizing: border-box; + -moz-box-sizing: border-box; + box-sizing: border-box; + float: left; + margin-left: 2.127659574468085%; + *margin-left: 2.074468085106383%; +} +.row-fluid [class*="span"]:first-child { + margin-left: 0; +} +.row-fluid .controls-row [class*="span"] + [class*="span"] { + margin-left: 2.127659574468085%; +} +.row-fluid .span12 { + width: 100%; + *width: 99.94680851063829%; +} +.row-fluid .span11 { + width: 91.48936170212765%; + *width: 91.43617021276594%; +} +.row-fluid .span10 { + width: 82.97872340425532%; + *width: 82.92553191489361%; +} +.row-fluid .span9 { + width: 74.46808510638297%; + *width: 74.41489361702126%; +} +.row-fluid .span8 { + width: 65.95744680851064%; + *width: 65.90425531914893%; +} +.row-fluid .span7 { + width: 57.44680851063829%; + *width: 57.39361702127659%; +} +.row-fluid .span6 { + width: 48.93617021276595%; + *width: 48.88297872340425%; +} +.row-fluid .span5 { + width: 40.42553191489362%; + *width: 40.37234042553192%; +} +.row-fluid .span4 { + width: 31.914893617021278%; + *width: 31.861702127659576%; +} +.row-fluid .span3 { + width: 23.404255319148934%; + *width: 23.351063829787233%; +} +.row-fluid .span2 { + width: 14.893617021276595%; + *width: 14.840425531914894%; +} +.row-fluid .span1 { + width: 6.382978723404255%; + *width: 6.329787234042553%; +} +.row-fluid .offset12 { + margin-left: 104.25531914893617%; + *margin-left: 104.14893617021275%; +} +.row-fluid .offset12:first-child { + margin-left: 102.12765957446808%; + *margin-left: 102.02127659574467%; +} +.row-fluid .offset11 { + margin-left: 95.74468085106382%; + *margin-left: 95.6382978723404%; +} +.row-fluid .offset11:first-child { + margin-left: 93.61702127659574%; + *margin-left: 93.51063829787232%; +} +.row-fluid .offset10 { + margin-left: 87.23404255319149%; + *margin-left: 87.12765957446807%; +} +.row-fluid .offset10:first-child { + margin-left: 85.1063829787234%; + *margin-left: 84.99999999999999%; +} +.row-fluid .offset9 { + margin-left: 78.72340425531914%; + *margin-left: 78.61702127659572%; +} +.row-fluid .offset9:first-child { + margin-left: 76.59574468085106%; + *margin-left: 76.48936170212764%; +} +.row-fluid .offset8 { + margin-left: 70.2127659574468%; + *margin-left: 70.10638297872339%; +} +.row-fluid .offset8:first-child { + margin-left: 68.08510638297872%; + *margin-left: 67.9787234042553%; +} +.row-fluid .offset7 { + margin-left: 61.70212765957446%; + *margin-left: 61.59574468085106%; +} +.row-fluid .offset7:first-child { + margin-left: 59.574468085106375%; + *margin-left: 59.46808510638297%; +} +.row-fluid .offset6 { + margin-left: 53.191489361702125%; + *margin-left: 53.085106382978715%; +} +.row-fluid .offset6:first-child { + margin-left: 51.063829787234035%; + *margin-left: 50.95744680851063%; +} +.row-fluid .offset5 { + margin-left: 44.68085106382979%; + *margin-left: 44.57446808510638%; +} +.row-fluid .offset5:first-child { + margin-left: 42.5531914893617%; + *margin-left: 42.4468085106383%; +} +.row-fluid .offset4 { + margin-left: 36.170212765957444%; + *margin-left: 36.06382978723405%; +} +.row-fluid .offset4:first-child { + margin-left: 34.04255319148936%; + *margin-left: 33.93617021276596%; +} +.row-fluid .offset3 { + margin-left: 27.659574468085104%; + *margin-left: 27.5531914893617%; +} +.row-fluid .offset3:first-child { + margin-left: 25.53191489361702%; + *margin-left: 25.425531914893618%; +} +.row-fluid .offset2 { + margin-left: 19.148936170212764%; + *margin-left: 19.04255319148936%; +} +.row-fluid .offset2:first-child { + margin-left: 17.02127659574468%; + *margin-left: 16.914893617021278%; +} +.row-fluid .offset1 { + margin-left: 10.638297872340425%; + *margin-left: 10.53191489361702%; +} +.row-fluid .offset1:first-child { + margin-left: 8.51063829787234%; + *margin-left: 8.404255319148938%; +} +[class*="span"].hide, +.row-fluid [class*="span"].hide { + display: none; +} +[class*="span"].pull-right, +.row-fluid [class*="span"].pull-right { + float: right; +} +.container { + margin-right: auto; + margin-left: auto; + *zoom: 1; +} +.container:before, +.container:after { + display: table; + content: ""; + line-height: 0; +} +.container:after { + clear: both; +} +.container-fluid { + padding-right: 20px; + padding-left: 20px; + *zoom: 1; +} +.container-fluid:before, +.container-fluid:after { + display: table; + content: ""; + line-height: 0; +} +.container-fluid:after { + clear: both; +} +p { + margin: 0 0 10px; +} +.lead { + margin-bottom: 20px; + font-size: 21px; + font-weight: 200; + line-height: 30px; +} +small { + font-size: 85%; +} +strong { + font-weight: bold; +} +em { + font-style: italic; +} +cite { + font-style: normal; +} +.muted { + color: #999999; +} +a.muted:hover, +a.muted:focus { + color: #808080; +} +.text-warning { + color: #c09853; +} +a.text-warning:hover, +a.text-warning:focus { + color: #a47e3c; +} +.text-error { + color: #b94a48; +} +a.text-error:hover, +a.text-error:focus { + color: #953b39; +} +.text-info { + color: #3a87ad; +} +a.text-info:hover, +a.text-info:focus { + color: #2d6987; +} +.text-success { + color: #468847; +} +a.text-success:hover, +a.text-success:focus { + color: #356635; +} +.text-left { + text-align: left; +} +.text-right { + text-align: right; +} +.text-center { + text-align: center; +} +h1, +h2, +h3, +h4, +h5, +h6 { + margin: 10px 0; + font-family: inherit; + font-weight: bold; + line-height: 20px; + color: inherit; + text-rendering: optimizelegibility; +} +h1 small, +h2 small, +h3 small, +h4 small, +h5 small, +h6 small { + font-weight: normal; + line-height: 1; + color: #999999; +} +h1, +h2, +h3 { + line-height: 40px; +} +h1 { + font-size: 38.5px; +} +h2 { + font-size: 31.5px; +} +h3 { + font-size: 24.5px; +} +h4 { + font-size: 17.5px; +} +h5 { + font-size: 14px; +} +h6 { + font-size: 11.9px; +} +h1 small { + font-size: 24.5px; +} +h2 small { + font-size: 17.5px; +} +h3 small { + font-size: 14px; +} +h4 small { + font-size: 14px; +} +.page-header { + padding-bottom: 9px; + margin: 20px 0 30px; + border-bottom: 1px solid #eeeeee; +} +ul, +ol { + padding: 0; + margin: 0 0 10px 25px; +} +ul ul, +ul ol, +ol ol, +ol ul { + margin-bottom: 0; +} +li { + line-height: 20px; +} +ul.unstyled, +ol.unstyled { + margin-left: 0; + list-style: none; +} +ul.inline, +ol.inline { + margin-left: 0; + list-style: none; +} +ul.inline > li, +ol.inline > li { + display: inline-block; + *display: inline; + /* IE7 inline-block hack */ + + *zoom: 1; + padding-left: 5px; + padding-right: 5px; +} +dl { + margin-bottom: 20px; +} +dt, +dd { + line-height: 20px; +} +dt { + font-weight: bold; +} +dd { + margin-left: 10px; +} +.dl-horizontal { + *zoom: 1; +} +.dl-horizontal:before, +.dl-horizontal:after { + display: table; + content: ""; + line-height: 0; +} +.dl-horizontal:after { + clear: both; +} +.dl-horizontal dt { + float: left; + width: 160px; + clear: left; + text-align: right; + overflow: hidden; + text-overflow: ellipsis; + white-space: nowrap; +} +.dl-horizontal dd { + margin-left: 180px; +} +hr { + margin: 20px 0; + border: 0; + border-top: 1px solid #eeeeee; + border-bottom: 1px solid #ffffff; +} +abbr[title], +abbr[data-original-title] { + cursor: help; + border-bottom: 1px dotted #999999; +} +abbr.initialism { + font-size: 90%; + text-transform: uppercase; +} +blockquote { + padding: 0 0 0 15px; + margin: 0 0 20px; + border-left: 5px solid #eeeeee; +} +blockquote p { + margin-bottom: 0; + font-size: 17.5px; + font-weight: 300; + line-height: 1.25; +} +blockquote small { + display: block; + line-height: 20px; + color: #999999; +} +blockquote small:before { + content: '\2014 \00A0'; +} +blockquote.pull-right { + float: right; + padding-right: 15px; + padding-left: 0; + border-right: 5px solid #eeeeee; + border-left: 0; +} +blockquote.pull-right p, +blockquote.pull-right small { + text-align: right; +} +blockquote.pull-right small:before { + content: ''; +} +blockquote.pull-right small:after { + content: '\00A0 \2014'; +} +q:before, +q:after, +blockquote:before, +blockquote:after { + content: ""; +} +address { + display: block; + margin-bottom: 20px; + font-style: normal; + line-height: 20px; +} +code, +pre { + padding: 0 3px 2px; + font-family: Monaco, Menlo, Consolas, "Courier New", monospace; + font-size: 12px; + color: #333333; + -webkit-border-radius: 3px; + -moz-border-radius: 3px; + border-radius: 3px; +} +code { + padding: 2px 4px; + color: #d14; + background-color: #f7f7f9; + border: 1px solid #e1e1e8; + white-space: nowrap; +} +pre { + display: block; + padding: 9.5px; + margin: 0 0 10px; + font-size: 13px; + line-height: 20px; + word-break: break-all; + word-wrap: break-word; + white-space: pre; + white-space: pre-wrap; + background-color: #f5f5f5; + border: 1px solid #ccc; + border: 1px solid rgba(0, 0, 0, 0.15); + -webkit-border-radius: 4px; + -moz-border-radius: 4px; + border-radius: 4px; +} +pre.prettyprint { + margin-bottom: 20px; +} +pre code { + padding: 0; + color: inherit; + white-space: pre; + white-space: pre-wrap; + background-color: transparent; + border: 0; +} +.pre-scrollable { + max-height: 340px; + overflow-y: scroll; +} +form { + margin: 0 0 20px; +} +fieldset { + padding: 0; + margin: 0; + border: 0; +} +legend { + display: block; + width: 100%; + padding: 0; + margin-bottom: 20px; + font-size: 21px; + line-height: 40px; + color: #333333; + border: 0; + border-bottom: 1px solid #e5e5e5; +} +legend small { + font-size: 15px; + color: #999999; +} +label, +input, +button, +select, +textarea { + font-size: 14px; + font-weight: normal; + line-height: 20px; +} +input, +button, +select, +textarea { + font-family: "Helvetica Neue", Helvetica, Arial, sans-serif; +} +label { + display: block; + margin-bottom: 5px; +} +select, +textarea, +input[type="text"], +input[type="password"], +input[type="datetime"], +input[type="datetime-local"], +input[type="date"], +input[type="month"], +input[type="time"], +input[type="week"], +input[type="number"], +input[type="email"], +input[type="url"], +input[type="search"], +input[type="tel"], +input[type="color"], +.uneditable-input { + display: inline-block; + height: 20px; + padding: 4px 6px; + margin-bottom: 10px; + font-size: 14px; + line-height: 20px; + color: #555555; + -webkit-border-radius: 4px; + -moz-border-radius: 4px; + border-radius: 4px; + vertical-align: middle; +} +input, +textarea, +.uneditable-input { + width: 206px; +} +textarea { + height: auto; +} +textarea, +input[type="text"], +input[type="password"], +input[type="datetime"], +input[type="datetime-local"], +input[type="date"], +input[type="month"], +input[type="time"], +input[type="week"], +input[type="number"], +input[type="email"], +input[type="url"], +input[type="search"], +input[type="tel"], +input[type="color"], +.uneditable-input { + background-color: #ffffff; + border: 1px solid #cccccc; + -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075); + -moz-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075); + box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075); + -webkit-transition: border linear .2s, box-shadow linear .2s; + -moz-transition: border linear .2s, box-shadow linear .2s; + -o-transition: border linear .2s, box-shadow linear .2s; + transition: border linear .2s, box-shadow linear .2s; +} +textarea:focus, +input[type="text"]:focus, +input[type="password"]:focus, +input[type="datetime"]:focus, +input[type="datetime-local"]:focus, +input[type="date"]:focus, +input[type="month"]:focus, +input[type="time"]:focus, +input[type="week"]:focus, +input[type="number"]:focus, +input[type="email"]:focus, +input[type="url"]:focus, +input[type="search"]:focus, +input[type="tel"]:focus, +input[type="color"]:focus, +.uneditable-input:focus { + border-color: rgba(82, 168, 236, 0.8); + outline: 0; + outline: thin dotted \9; + /* IE6-9 */ + + -webkit-box-shadow: inset 0 1px 1px rgba(0,0,0,.075), 0 0 8px rgba(82,168,236,.6); + -moz-box-shadow: inset 0 1px 1px rgba(0,0,0,.075), 0 0 8px rgba(82,168,236,.6); + box-shadow: inset 0 1px 1px rgba(0,0,0,.075), 0 0 8px rgba(82,168,236,.6); +} +input[type="radio"], +input[type="checkbox"] { + margin: 4px 0 0; + *margin-top: 0; + /* IE7 */ + + margin-top: 1px \9; + /* IE8-9 */ + + line-height: normal; +} +input[type="file"], +input[type="image"], +input[type="submit"], +input[type="reset"], +input[type="button"], +input[type="radio"], +input[type="checkbox"] { + width: auto; +} +select, +input[type="file"] { + height: 30px; + /* In IE7, the height of the select element cannot be changed by height, only font-size */ + + *margin-top: 4px; + /* For IE7, add top margin to align select with labels */ + + line-height: 30px; +} +select { + width: 220px; + border: 1px solid #cccccc; + background-color: #ffffff; +} +select[multiple], +select[size] { + height: auto; +} +select:focus, +input[type="file"]:focus, +input[type="radio"]:focus, +input[type="checkbox"]:focus { + outline: thin dotted #333; + outline: 5px auto -webkit-focus-ring-color; + outline-offset: -2px; +} +.uneditable-input, +.uneditable-textarea { + color: #999999; + background-color: #fcfcfc; + border-color: #cccccc; + -webkit-box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.025); + -moz-box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.025); + box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.025); + cursor: not-allowed; +} +.uneditable-input { + overflow: hidden; + white-space: nowrap; +} +.uneditable-textarea { + width: auto; + height: auto; +} +input:-moz-placeholder, +textarea:-moz-placeholder { + color: #999999; +} +input:-ms-input-placeholder, +textarea:-ms-input-placeholder { + color: #999999; +} +input::-webkit-input-placeholder, +textarea::-webkit-input-placeholder { + color: #999999; +} +.radio, +.checkbox { + min-height: 20px; + padding-left: 20px; +} +.radio input[type="radio"], +.checkbox input[type="checkbox"] { + float: left; + margin-left: -20px; +} +.controls > .radio:first-child, +.controls > .checkbox:first-child { + padding-top: 5px; +} +.radio.inline, +.checkbox.inline { + display: inline-block; + padding-top: 5px; + margin-bottom: 0; + vertical-align: middle; +} +.radio.inline + .radio.inline, +.checkbox.inline + .checkbox.inline { + margin-left: 10px; +} +.input-mini { + width: 60px; +} +.input-small { + width: 90px; +} +.input-medium { + width: 150px; +} +.input-large { + width: 210px; +} +.input-xlarge { + width: 270px; +} +.input-xxlarge { + width: 530px; +} +input[class*="span"], +select[class*="span"], +textarea[class*="span"], +.uneditable-input[class*="span"], +.row-fluid input[class*="span"], +.row-fluid select[class*="span"], +.row-fluid textarea[class*="span"], +.row-fluid .uneditable-input[class*="span"] { + float: none; + margin-left: 0; +} +.input-append input[class*="span"], +.input-append .uneditable-input[class*="span"], +.input-prepend input[class*="span"], +.input-prepend .uneditable-input[class*="span"], +.row-fluid input[class*="span"], +.row-fluid select[class*="span"], +.row-fluid textarea[class*="span"], +.row-fluid .uneditable-input[class*="span"], +.row-fluid .input-prepend [class*="span"], +.row-fluid .input-append [class*="span"] { + display: inline-block; +} +input, +textarea, +.uneditable-input { + margin-left: 0; +} +.controls-row [class*="span"] + [class*="span"] { + margin-left: 20px; +} +input.span12, +textarea.span12, +.uneditable-input.span12 { + width: 926px; +} +input.span11, +textarea.span11, +.uneditable-input.span11 { + width: 846px; +} +input.span10, +textarea.span10, +.uneditable-input.span10 { + width: 766px; +} +input.span9, +textarea.span9, +.uneditable-input.span9 { + width: 686px; +} +input.span8, +textarea.span8, +.uneditable-input.span8 { + width: 606px; +} +input.span7, +textarea.span7, +.uneditable-input.span7 { + width: 526px; +} +input.span6, +textarea.span6, +.uneditable-input.span6 { + width: 446px; +} +input.span5, +textarea.span5, +.uneditable-input.span5 { + width: 366px; +} +input.span4, +textarea.span4, +.uneditable-input.span4 { + width: 286px; +} +input.span3, +textarea.span3, +.uneditable-input.span3 { + width: 206px; +} +input.span2, +textarea.span2, +.uneditable-input.span2 { + width: 126px; +} +input.span1, +textarea.span1, +.uneditable-input.span1 { + width: 46px; +} +.controls-row { + *zoom: 1; +} +.controls-row:before, +.controls-row:after { + display: table; + content: ""; + line-height: 0; +} +.controls-row:after { + clear: both; +} +.controls-row [class*="span"], +.row-fluid .controls-row [class*="span"] { + float: left; +} +.controls-row .checkbox[class*="span"], +.controls-row .radio[class*="span"] { + padding-top: 5px; +} +input[disabled], +select[disabled], +textarea[disabled], +input[readonly], +select[readonly], +textarea[readonly] { + cursor: not-allowed; + background-color: #eeeeee; +} +input[type="radio"][disabled], +input[type="checkbox"][disabled], +input[type="radio"][readonly], +input[type="checkbox"][readonly] { + background-color: transparent; +} +.control-group.warning .control-label, +.control-group.warning .help-block, +.control-group.warning .help-inline { + color: #c09853; +} +.control-group.warning .checkbox, +.control-group.warning .radio, +.control-group.warning input, +.control-group.warning select, +.control-group.warning textarea { + color: #c09853; +} +.control-group.warning input, +.control-group.warning select, +.control-group.warning textarea { + border-color: #c09853; + -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075); + -moz-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075); + box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075); +} +.control-group.warning input:focus, +.control-group.warning select:focus, +.control-group.warning textarea:focus { + border-color: #a47e3c; + -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #dbc59e; + -moz-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #dbc59e; + box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #dbc59e; +} +.control-group.warning .input-prepend .add-on, +.control-group.warning .input-append .add-on { + color: #c09853; + background-color: #fcf8e3; + border-color: #c09853; +} +.control-group.error .control-label, +.control-group.error .help-block, +.control-group.error .help-inline { + color: #b94a48; +} +.control-group.error .checkbox, +.control-group.error .radio, +.control-group.error input, +.control-group.error select, +.control-group.error textarea { + color: #b94a48; +} +.control-group.error input, +.control-group.error select, +.control-group.error textarea { + border-color: #b94a48; + -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075); + -moz-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075); + box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075); +} +.control-group.error input:focus, +.control-group.error select:focus, +.control-group.error textarea:focus { + border-color: #953b39; + -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #d59392; + -moz-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #d59392; + box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #d59392; +} +.control-group.error .input-prepend .add-on, +.control-group.error .input-append .add-on { + color: #b94a48; + background-color: #f2dede; + border-color: #b94a48; +} +.control-group.success .control-label, +.control-group.success .help-block, +.control-group.success .help-inline { + color: #468847; +} +.control-group.success .checkbox, +.control-group.success .radio, +.control-group.success input, +.control-group.success select, +.control-group.success textarea { + color: #468847; +} +.control-group.success input, +.control-group.success select, +.control-group.success textarea { + border-color: #468847; + -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075); + -moz-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075); + box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075); +} +.control-group.success input:focus, +.control-group.success select:focus, +.control-group.success textarea:focus { + border-color: #356635; + -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #7aba7b; + -moz-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #7aba7b; + box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #7aba7b; +} +.control-group.success .input-prepend .add-on, +.control-group.success .input-append .add-on { + color: #468847; + background-color: #dff0d8; + border-color: #468847; +} +.control-group.info .control-label, +.control-group.info .help-block, +.control-group.info .help-inline { + color: #3a87ad; +} +.control-group.info .checkbox, +.control-group.info .radio, +.control-group.info input, +.control-group.info select, +.control-group.info textarea { + color: #3a87ad; +} +.control-group.info input, +.control-group.info select, +.control-group.info textarea { + border-color: #3a87ad; + -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075); + -moz-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075); + box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075); +} +.control-group.info input:focus, +.control-group.info select:focus, +.control-group.info textarea:focus { + border-color: #2d6987; + -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #7ab5d3; + -moz-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #7ab5d3; + box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #7ab5d3; +} +.control-group.info .input-prepend .add-on, +.control-group.info .input-append .add-on { + color: #3a87ad; + background-color: #d9edf7; + border-color: #3a87ad; +} +input:focus:invalid, +textarea:focus:invalid, +select:focus:invalid { + color: #b94a48; + border-color: #ee5f5b; +} +input:focus:invalid:focus, +textarea:focus:invalid:focus, +select:focus:invalid:focus { + border-color: #e9322d; + -webkit-box-shadow: 0 0 6px #f8b9b7; + -moz-box-shadow: 0 0 6px #f8b9b7; + box-shadow: 0 0 6px #f8b9b7; +} +.form-actions { + padding: 19px 20px 20px; + margin-top: 20px; + margin-bottom: 20px; + background-color: #f5f5f5; + border-top: 1px solid #e5e5e5; + *zoom: 1; +} +.form-actions:before, +.form-actions:after { + display: table; + content: ""; + line-height: 0; +} +.form-actions:after { + clear: both; +} +.help-block, +.help-inline { + color: #595959; +} +.help-block { + display: block; + margin-bottom: 10px; +} +.help-inline { + display: inline-block; + *display: inline; + /* IE7 inline-block hack */ + + *zoom: 1; + vertical-align: middle; + padding-left: 5px; +} +.input-append, +.input-prepend { + display: inline-block; + margin-bottom: 10px; + vertical-align: middle; + font-size: 0; + white-space: nowrap; +} +.input-append input, +.input-prepend input, +.input-append select, +.input-prepend select, +.input-append .uneditable-input, +.input-prepend .uneditable-input, +.input-append .dropdown-menu, +.input-prepend .dropdown-menu, +.input-append .popover, +.input-prepend .popover { + font-size: 14px; +} +.input-append input, +.input-prepend input, +.input-append select, +.input-prepend select, +.input-append .uneditable-input, +.input-prepend .uneditable-input { + position: relative; + margin-bottom: 0; + *margin-left: 0; + vertical-align: top; + -webkit-border-radius: 0 4px 4px 0; + -moz-border-radius: 0 4px 4px 0; + border-radius: 0 4px 4px 0; +} +.input-append input:focus, +.input-prepend input:focus, +.input-append select:focus, +.input-prepend select:focus, +.input-append .uneditable-input:focus, +.input-prepend .uneditable-input:focus { + z-index: 2; +} +.input-append .add-on, +.input-prepend .add-on { + display: inline-block; + width: auto; + height: 20px; + min-width: 16px; + padding: 4px 5px; + font-size: 14px; + font-weight: normal; + line-height: 20px; + text-align: center; + text-shadow: 0 1px 0 #ffffff; + background-color: #eeeeee; + border: 1px solid #ccc; +} +.input-append .add-on, +.input-prepend .add-on, +.input-append .btn, +.input-prepend .btn, +.input-append .btn-group > .dropdown-toggle, +.input-prepend .btn-group > .dropdown-toggle { + vertical-align: top; + -webkit-border-radius: 0; + -moz-border-radius: 0; + border-radius: 0; +} +.input-append .active, +.input-prepend .active { + background-color: #a9dba9; + border-color: #46a546; +} +.input-prepend .add-on, +.input-prepend .btn { + margin-right: -1px; +} +.input-prepend .add-on:first-child, +.input-prepend .btn:first-child { + -webkit-border-radius: 4px 0 0 4px; + -moz-border-radius: 4px 0 0 4px; + border-radius: 4px 0 0 4px; +} +.input-append input, +.input-append select, +.input-append .uneditable-input { + -webkit-border-radius: 4px 0 0 4px; + -moz-border-radius: 4px 0 0 4px; + border-radius: 4px 0 0 4px; +} +.input-append input + .btn-group .btn:last-child, +.input-append select + .btn-group .btn:last-child, +.input-append .uneditable-input + .btn-group .btn:last-child { + -webkit-border-radius: 0 4px 4px 0; + -moz-border-radius: 0 4px 4px 0; + border-radius: 0 4px 4px 0; +} +.input-append .add-on, +.input-append .btn, +.input-append .btn-group { + margin-left: -1px; +} +.input-append .add-on:last-child, +.input-append .btn:last-child, +.input-append .btn-group:last-child > .dropdown-toggle { + -webkit-border-radius: 0 4px 4px 0; + -moz-border-radius: 0 4px 4px 0; + border-radius: 0 4px 4px 0; +} +.input-prepend.input-append input, +.input-prepend.input-append select, +.input-prepend.input-append .uneditable-input { + -webkit-border-radius: 0; + -moz-border-radius: 0; + border-radius: 0; +} +.input-prepend.input-append input + .btn-group .btn, +.input-prepend.input-append select + .btn-group .btn, +.input-prepend.input-append .uneditable-input + .btn-group .btn { + -webkit-border-radius: 0 4px 4px 0; + -moz-border-radius: 0 4px 4px 0; + border-radius: 0 4px 4px 0; +} +.input-prepend.input-append .add-on:first-child, +.input-prepend.input-append .btn:first-child { + margin-right: -1px; + -webkit-border-radius: 4px 0 0 4px; + -moz-border-radius: 4px 0 0 4px; + border-radius: 4px 0 0 4px; +} +.input-prepend.input-append .add-on:last-child, +.input-prepend.input-append .btn:last-child { + margin-left: -1px; + -webkit-border-radius: 0 4px 4px 0; + -moz-border-radius: 0 4px 4px 0; + border-radius: 0 4px 4px 0; +} +.input-prepend.input-append .btn-group:first-child { + margin-left: 0; +} +input.search-query { + padding-right: 14px; + padding-right: 4px \9; + padding-left: 14px; + padding-left: 4px \9; + /* IE7-8 doesn't have border-radius, so don't indent the padding */ + + margin-bottom: 0; + -webkit-border-radius: 15px; + -moz-border-radius: 15px; + border-radius: 15px; +} +/* Allow for input prepend/append in search forms */ +.form-search .input-append .search-query, +.form-search .input-prepend .search-query { + -webkit-border-radius: 0; + -moz-border-radius: 0; + border-radius: 0; +} +.form-search .input-append .search-query { + -webkit-border-radius: 14px 0 0 14px; + -moz-border-radius: 14px 0 0 14px; + border-radius: 14px 0 0 14px; +} +.form-search .input-append .btn { + -webkit-border-radius: 0 14px 14px 0; + -moz-border-radius: 0 14px 14px 0; + border-radius: 0 14px 14px 0; +} +.form-search .input-prepend .search-query { + -webkit-border-radius: 0 14px 14px 0; + -moz-border-radius: 0 14px 14px 0; + border-radius: 0 14px 14px 0; +} +.form-search .input-prepend .btn { + -webkit-border-radius: 14px 0 0 14px; + -moz-border-radius: 14px 0 0 14px; + border-radius: 14px 0 0 14px; +} +.form-search input, +.form-inline input, +.form-horizontal input, +.form-search textarea, +.form-inline textarea, +.form-horizontal textarea, +.form-search select, +.form-inline select, +.form-horizontal select, +.form-search .help-inline, +.form-inline .help-inline, +.form-horizontal .help-inline, +.form-search .uneditable-input, +.form-inline .uneditable-input, +.form-horizontal .uneditable-input, +.form-search .input-prepend, +.form-inline .input-prepend, +.form-horizontal .input-prepend, +.form-search .input-append, +.form-inline .input-append, +.form-horizontal .input-append { + display: inline-block; + *display: inline; + /* IE7 inline-block hack */ + + *zoom: 1; + margin-bottom: 0; + vertical-align: middle; +} +.form-search .hide, +.form-inline .hide, +.form-horizontal .hide { + display: none; +} +.form-search label, +.form-inline label, +.form-search .btn-group, +.form-inline .btn-group { + display: inline-block; +} +.form-search .input-append, +.form-inline .input-append, +.form-search .input-prepend, +.form-inline .input-prepend { + margin-bottom: 0; +} +.form-search .radio, +.form-search .checkbox, +.form-inline .radio, +.form-inline .checkbox { + padding-left: 0; + margin-bottom: 0; + vertical-align: middle; +} +.form-search .radio input[type="radio"], +.form-search .checkbox input[type="checkbox"], +.form-inline .radio input[type="radio"], +.form-inline .checkbox input[type="checkbox"] { + float: left; + margin-right: 3px; + margin-left: 0; +} +.control-group { + margin-bottom: 10px; +} +legend + .control-group { + margin-top: 20px; + -webkit-margin-top-collapse: separate; +} +.form-horizontal .control-group { + margin-bottom: 20px; + *zoom: 1; +} +.form-horizontal .control-group:before, +.form-horizontal .control-group:after { + display: table; + content: ""; + line-height: 0; +} +.form-horizontal .control-group:after { + clear: both; +} +.form-horizontal .control-label { + float: left; + width: 160px; + padding-top: 5px; + text-align: right; +} +.form-horizontal .controls { + *display: inline-block; + *padding-left: 20px; + margin-left: 180px; + *margin-left: 0; +} +.form-horizontal .controls:first-child { + *padding-left: 180px; +} +.form-horizontal .help-block { + margin-bottom: 0; +} +.form-horizontal input + .help-block, +.form-horizontal select + .help-block, +.form-horizontal textarea + .help-block, +.form-horizontal .uneditable-input + .help-block, +.form-horizontal .input-prepend + .help-block, +.form-horizontal .input-append + .help-block { + margin-top: 10px; +} +.form-horizontal .form-actions { + padding-left: 180px; +} +table { + max-width: 100%; + background-color: transparent; + border-collapse: collapse; + border-spacing: 0; +} +.table { + width: 100%; + margin-bottom: 20px; +} +.table th, +.table td { + padding: 8px; + line-height: 20px; + text-align: left; + vertical-align: top; + border-top: 1px solid #dddddd; +} +.table th { + font-weight: bold; +} +.table thead th { + vertical-align: bottom; +} +.table caption + thead tr:first-child th, +.table caption + thead tr:first-child td, +.table colgroup + thead tr:first-child th, +.table colgroup + thead tr:first-child td, +.table thead:first-child tr:first-child th, +.table thead:first-child tr:first-child td { + border-top: 0; +} +.table tbody + tbody { + border-top: 2px solid #dddddd; +} +.table .table { + background-color: #ffffff; +} +.table-condensed th, +.table-condensed td { + padding: 4px 5px; +} +.table-bordered { + border: 1px solid #dddddd; + border-collapse: separate; + *border-collapse: collapse; + border-left: 0; + -webkit-border-radius: 4px; + -moz-border-radius: 4px; + border-radius: 4px; +} +.table-bordered th, +.table-bordered td { + border-left: 1px solid #dddddd; +} +.table-bordered caption + thead tr:first-child th, +.table-bordered caption + tbody tr:first-child th, +.table-bordered caption + tbody tr:first-child td, +.table-bordered colgroup + thead tr:first-child th, +.table-bordered colgroup + tbody tr:first-child th, +.table-bordered colgroup + tbody tr:first-child td, +.table-bordered thead:first-child tr:first-child th, +.table-bordered tbody:first-child tr:first-child th, +.table-bordered tbody:first-child tr:first-child td { + border-top: 0; +} +.table-bordered thead:first-child tr:first-child > th:first-child, +.table-bordered tbody:first-child tr:first-child > td:first-child, +.table-bordered tbody:first-child tr:first-child > th:first-child { + -webkit-border-top-left-radius: 4px; + -moz-border-radius-topleft: 4px; + border-top-left-radius: 4px; +} +.table-bordered thead:first-child tr:first-child > th:last-child, +.table-bordered tbody:first-child tr:first-child > td:last-child, +.table-bordered tbody:first-child tr:first-child > th:last-child { + -webkit-border-top-right-radius: 4px; + -moz-border-radius-topright: 4px; + border-top-right-radius: 4px; +} +.table-bordered thead:last-child tr:last-child > th:first-child, +.table-bordered tbody:last-child tr:last-child > td:first-child, +.table-bordered tbody:last-child tr:last-child > th:first-child, +.table-bordered tfoot:last-child tr:last-child > td:first-child, +.table-bordered tfoot:last-child tr:last-child > th:first-child { + -webkit-border-bottom-left-radius: 4px; + -moz-border-radius-bottomleft: 4px; + border-bottom-left-radius: 4px; +} +.table-bordered thead:last-child tr:last-child > th:last-child, +.table-bordered tbody:last-child tr:last-child > td:last-child, +.table-bordered tbody:last-child tr:last-child > th:last-child, +.table-bordered tfoot:last-child tr:last-child > td:last-child, +.table-bordered tfoot:last-child tr:last-child > th:last-child { + -webkit-border-bottom-right-radius: 4px; + -moz-border-radius-bottomright: 4px; + border-bottom-right-radius: 4px; +} +.table-bordered tfoot + tbody:last-child tr:last-child td:first-child { + -webkit-border-bottom-left-radius: 0; + -moz-border-radius-bottomleft: 0; + border-bottom-left-radius: 0; +} +.table-bordered tfoot + tbody:last-child tr:last-child td:last-child { + -webkit-border-bottom-right-radius: 0; + -moz-border-radius-bottomright: 0; + border-bottom-right-radius: 0; +} +.table-bordered caption + thead tr:first-child th:first-child, +.table-bordered caption + tbody tr:first-child td:first-child, +.table-bordered colgroup + thead tr:first-child th:first-child, +.table-bordered colgroup + tbody tr:first-child td:first-child { + -webkit-border-top-left-radius: 4px; + -moz-border-radius-topleft: 4px; + border-top-left-radius: 4px; +} +.table-bordered caption + thead tr:first-child th:last-child, +.table-bordered caption + tbody tr:first-child td:last-child, +.table-bordered colgroup + thead tr:first-child th:last-child, +.table-bordered colgroup + tbody tr:first-child td:last-child { + -webkit-border-top-right-radius: 4px; + -moz-border-radius-topright: 4px; + border-top-right-radius: 4px; +} +.table-striped tbody > tr:nth-child(odd) > td, +.table-striped tbody > tr:nth-child(odd) > th { + background-color: #f9f9f9; +} +.table-hover tbody tr:hover > td, +.table-hover tbody tr:hover > th { + background-color: #f5f5f5; +} +table td[class*="span"], +table th[class*="span"], +.row-fluid table td[class*="span"], +.row-fluid table th[class*="span"] { + display: table-cell; + float: none; + margin-left: 0; +} +.table td.span1, +.table th.span1 { + float: none; + width: 44px; + margin-left: 0; +} +.table td.span2, +.table th.span2 { + float: none; + width: 124px; + margin-left: 0; +} +.table td.span3, +.table th.span3 { + float: none; + width: 204px; + margin-left: 0; +} +.table td.span4, +.table th.span4 { + float: none; + width: 284px; + margin-left: 0; +} +.table td.span5, +.table th.span5 { + float: none; + width: 364px; + margin-left: 0; +} +.table td.span6, +.table th.span6 { + float: none; + width: 444px; + margin-left: 0; +} +.table td.span7, +.table th.span7 { + float: none; + width: 524px; + margin-left: 0; +} +.table td.span8, +.table th.span8 { + float: none; + width: 604px; + margin-left: 0; +} +.table td.span9, +.table th.span9 { + float: none; + width: 684px; + margin-left: 0; +} +.table td.span10, +.table th.span10 { + float: none; + width: 764px; + margin-left: 0; +} +.table td.span11, +.table th.span11 { + float: none; + width: 844px; + margin-left: 0; +} +.table td.span12, +.table th.span12 { + float: none; + width: 924px; + margin-left: 0; +} +.table tbody tr.success > td { + background-color: #dff0d8; +} +.table tbody tr.error > td { + background-color: #f2dede; +} +.table tbody tr.warning > td { + background-color: #fcf8e3; +} +.table tbody tr.info > td { + background-color: #d9edf7; +} +.table-hover tbody tr.success:hover > td { + background-color: #d0e9c6; +} +.table-hover tbody tr.error:hover > td { + background-color: #ebcccc; +} +.table-hover tbody tr.warning:hover > td { + background-color: #faf2cc; +} +.table-hover tbody tr.info:hover > td { + background-color: #c4e3f3; +} +[class^="icon-"], +[class*=" icon-"] { + display: inline-block; + width: 14px; + height: 14px; + *margin-right: .3em; + line-height: 14px; + vertical-align: text-top; + background-image: url("../img/glyphicons-halflings.png"); + background-position: 14px 14px; + background-repeat: no-repeat; + margin-top: 1px; +} +/* White icons with optional class, or on hover/focus/active states of certain elements */ +.icon-white, +.nav-pills > .active > a > [class^="icon-"], +.nav-pills > .active > a > [class*=" icon-"], +.nav-list > .active > a > [class^="icon-"], +.nav-list > .active > a > [class*=" icon-"], +.navbar-inverse .nav > .active > a > [class^="icon-"], +.navbar-inverse .nav > .active > a > [class*=" icon-"], +.dropdown-menu > li > a:hover > [class^="icon-"], +.dropdown-menu > li > a:focus > [class^="icon-"], +.dropdown-menu > li > a:hover > [class*=" icon-"], +.dropdown-menu > li > a:focus > [class*=" icon-"], +.dropdown-menu > .active > a > [class^="icon-"], +.dropdown-menu > .active > a > [class*=" icon-"], +.dropdown-submenu:hover > a > [class^="icon-"], +.dropdown-submenu:focus > a > [class^="icon-"], +.dropdown-submenu:hover > a > [class*=" icon-"], +.dropdown-submenu:focus > a > [class*=" icon-"] { + background-image: url("../img/glyphicons-halflings-white.png"); +} +.icon-glass { + background-position: 0 0; +} +.icon-music { + background-position: -24px 0; +} +.icon-search { + background-position: -48px 0; +} +.icon-envelope { + background-position: -72px 0; +} +.icon-heart { + background-position: -96px 0; +} +.icon-star { + background-position: -120px 0; +} +.icon-star-empty { + background-position: -144px 0; +} +.icon-user { + background-position: -168px 0; +} +.icon-film { + background-position: -192px 0; +} +.icon-th-large { + background-position: -216px 0; +} +.icon-th { + background-position: -240px 0; +} +.icon-th-list { + background-position: -264px 0; +} +.icon-ok { + background-position: -288px 0; +} +.icon-remove { + background-position: -312px 0; +} +.icon-zoom-in { + background-position: -336px 0; +} +.icon-zoom-out { + background-position: -360px 0; +} +.icon-off { + background-position: -384px 0; +} +.icon-signal { + background-position: -408px 0; +} +.icon-cog { + background-position: -432px 0; +} +.icon-trash { + background-position: -456px 0; +} +.icon-home { + background-position: 0 -24px; +} +.icon-file { + background-position: -24px -24px; +} +.icon-time { + background-position: -48px -24px; +} +.icon-road { + background-position: -72px -24px; +} +.icon-download-alt { + background-position: -96px -24px; +} +.icon-download { + background-position: -120px -24px; +} +.icon-upload { + background-position: -144px -24px; +} +.icon-inbox { + background-position: -168px -24px; +} +.icon-play-circle { + background-position: -192px -24px; +} +.icon-repeat { + background-position: -216px -24px; +} +.icon-refresh { + background-position: -240px -24px; +} +.icon-list-alt { + background-position: -264px -24px; +} +.icon-lock { + background-position: -287px -24px; +} +.icon-flag { + background-position: -312px -24px; +} +.icon-headphones { + background-position: -336px -24px; +} +.icon-volume-off { + background-position: -360px -24px; +} +.icon-volume-down { + background-position: -384px -24px; +} +.icon-volume-up { + background-position: -408px -24px; +} +.icon-qrcode { + background-position: -432px -24px; +} +.icon-barcode { + background-position: -456px -24px; +} +.icon-tag { + background-position: 0 -48px; +} +.icon-tags { + background-position: -25px -48px; +} +.icon-book { + background-position: -48px -48px; +} +.icon-bookmark { + background-position: -72px -48px; +} +.icon-print { + background-position: -96px -48px; +} +.icon-camera { + background-position: -120px -48px; +} +.icon-font { + background-position: -144px -48px; +} +.icon-bold { + background-position: -167px -48px; +} +.icon-italic { + background-position: -192px -48px; +} +.icon-text-height { + background-position: -216px -48px; +} +.icon-text-width { + background-position: -240px -48px; +} +.icon-align-left { + background-position: -264px -48px; +} +.icon-align-center { + background-position: -288px -48px; +} +.icon-align-right { + background-position: -312px -48px; +} +.icon-align-justify { + background-position: -336px -48px; +} +.icon-list { + background-position: -360px -48px; +} +.icon-indent-left { + background-position: -384px -48px; +} +.icon-indent-right { + background-position: -408px -48px; +} +.icon-facetime-video { + background-position: -432px -48px; +} +.icon-picture { + background-position: -456px -48px; +} +.icon-pencil { + background-position: 0 -72px; +} +.icon-map-marker { + background-position: -24px -72px; +} +.icon-adjust { + background-position: -48px -72px; +} +.icon-tint { + background-position: -72px -72px; +} +.icon-edit { + background-position: -96px -72px; +} +.icon-share { + background-position: -120px -72px; +} +.icon-check { + background-position: -144px -72px; +} +.icon-move { + background-position: -168px -72px; +} +.icon-step-backward { + background-position: -192px -72px; +} +.icon-fast-backward { + background-position: -216px -72px; +} +.icon-backward { + background-position: -240px -72px; +} +.icon-play { + background-position: -264px -72px; +} +.icon-pause { + background-position: -288px -72px; +} +.icon-stop { + background-position: -312px -72px; +} +.icon-forward { + background-position: -336px -72px; +} +.icon-fast-forward { + background-position: -360px -72px; +} +.icon-step-forward { + background-position: -384px -72px; +} +.icon-eject { + background-position: -408px -72px; +} +.icon-chevron-left { + background-position: -432px -72px; +} +.icon-chevron-right { + background-position: -456px -72px; +} +.icon-plus-sign { + background-position: 0 -96px; +} +.icon-minus-sign { + background-position: -24px -96px; +} +.icon-remove-sign { + background-position: -48px -96px; +} +.icon-ok-sign { + background-position: -72px -96px; +} +.icon-question-sign { + background-position: -96px -96px; +} +.icon-info-sign { + background-position: -120px -96px; +} +.icon-screenshot { + background-position: -144px -96px; +} +.icon-remove-circle { + background-position: -168px -96px; +} +.icon-ok-circle { + background-position: -192px -96px; +} +.icon-ban-circle { + background-position: -216px -96px; +} +.icon-arrow-left { + background-position: -240px -96px; +} +.icon-arrow-right { + background-position: -264px -96px; +} +.icon-arrow-up { + background-position: -289px -96px; +} +.icon-arrow-down { + background-position: -312px -96px; +} +.icon-share-alt { + background-position: -336px -96px; +} +.icon-resize-full { + background-position: -360px -96px; +} +.icon-resize-small { + background-position: -384px -96px; +} +.icon-plus { + background-position: -408px -96px; +} +.icon-minus { + background-position: -433px -96px; +} +.icon-asterisk { + background-position: -456px -96px; +} +.icon-exclamation-sign { + background-position: 0 -120px; +} +.icon-gift { + background-position: -24px -120px; +} +.icon-leaf { + background-position: -48px -120px; +} +.icon-fire { + background-position: -72px -120px; +} +.icon-eye-open { + background-position: -96px -120px; +} +.icon-eye-close { + background-position: -120px -120px; +} +.icon-warning-sign { + background-position: -144px -120px; +} +.icon-plane { + background-position: -168px -120px; +} +.icon-calendar { + background-position: -192px -120px; +} +.icon-random { + background-position: -216px -120px; + width: 16px; +} +.icon-comment { + background-position: -240px -120px; +} +.icon-magnet { + background-position: -264px -120px; +} +.icon-chevron-up { + background-position: -288px -120px; +} +.icon-chevron-down { + background-position: -313px -119px; +} +.icon-retweet { + background-position: -336px -120px; +} +.icon-shopping-cart { + background-position: -360px -120px; +} +.icon-folder-close { + background-position: -384px -120px; + width: 16px; +} +.icon-folder-open { + background-position: -408px -120px; + width: 16px; +} +.icon-resize-vertical { + background-position: -432px -119px; +} +.icon-resize-horizontal { + background-position: -456px -118px; +} +.icon-hdd { + background-position: 0 -144px; +} +.icon-bullhorn { + background-position: -24px -144px; +} +.icon-bell { + background-position: -48px -144px; +} +.icon-certificate { + background-position: -72px -144px; +} +.icon-thumbs-up { + background-position: -96px -144px; +} +.icon-thumbs-down { + background-position: -120px -144px; +} +.icon-hand-right { + background-position: -144px -144px; +} +.icon-hand-left { + background-position: -168px -144px; +} +.icon-hand-up { + background-position: -192px -144px; +} +.icon-hand-down { + background-position: -216px -144px; +} +.icon-circle-arrow-right { + background-position: -240px -144px; +} +.icon-circle-arrow-left { + background-position: -264px -144px; +} +.icon-circle-arrow-up { + background-position: -288px -144px; +} +.icon-circle-arrow-down { + background-position: -312px -144px; +} +.icon-globe { + background-position: -336px -144px; +} +.icon-wrench { + background-position: -360px -144px; +} +.icon-tasks { + background-position: -384px -144px; +} +.icon-filter { + background-position: -408px -144px; +} +.icon-briefcase { + background-position: -432px -144px; +} +.icon-fullscreen { + background-position: -456px -144px; +} +.dropup, +.dropdown { + position: relative; +} +.dropdown-toggle { + *margin-bottom: -3px; +} +.dropdown-toggle:active, +.open .dropdown-toggle { + outline: 0; +} +.caret { + display: inline-block; + width: 0; + height: 0; + vertical-align: top; + border-top: 4px solid #000000; + border-right: 4px solid transparent; + border-left: 4px solid transparent; + content: ""; +} +.dropdown .caret { + margin-top: 8px; + margin-left: 2px; +} +.dropdown-menu { + position: absolute; + top: 100%; + left: 0; + z-index: 1000; + display: none; + float: left; + min-width: 160px; + padding: 5px 0; + margin: 2px 0 0; + list-style: none; + background-color: #ffffff; + border: 1px solid #ccc; + border: 1px solid rgba(0, 0, 0, 0.2); + *border-right-width: 2px; + *border-bottom-width: 2px; + -webkit-border-radius: 6px; + -moz-border-radius: 6px; + border-radius: 6px; + -webkit-box-shadow: 0 5px 10px rgba(0, 0, 0, 0.2); + -moz-box-shadow: 0 5px 10px rgba(0, 0, 0, 0.2); + box-shadow: 0 5px 10px rgba(0, 0, 0, 0.2); + -webkit-background-clip: padding-box; + -moz-background-clip: padding; + background-clip: padding-box; +} +.dropdown-menu.pull-right { + right: 0; + left: auto; +} +.dropdown-menu .divider { + *width: 100%; + height: 1px; + margin: 9px 1px; + *margin: -5px 0 5px; + overflow: hidden; + background-color: #e5e5e5; + border-bottom: 1px solid #ffffff; +} +.dropdown-menu > li > a { + display: block; + padding: 3px 20px; + clear: both; + font-weight: normal; + line-height: 20px; + color: #333333; + white-space: nowrap; +} +.dropdown-menu > li > a:hover, +.dropdown-menu > li > a:focus, +.dropdown-submenu:hover > a, +.dropdown-submenu:focus > a { + text-decoration: none; + color: #ffffff; + background-color: #0081c2; + background-image: -moz-linear-gradient(top, #0088cc, #0077b3); + background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#0088cc), to(#0077b3)); + background-image: -webkit-linear-gradient(top, #0088cc, #0077b3); + background-image: -o-linear-gradient(top, #0088cc, #0077b3); + background-image: linear-gradient(to bottom, #0088cc, #0077b3); + background-repeat: repeat-x; + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff0088cc', endColorstr='#ff0077b3', GradientType=0); +} +.dropdown-menu > .active > a, +.dropdown-menu > .active > a:hover, +.dropdown-menu > .active > a:focus { + color: #ffffff; + text-decoration: none; + outline: 0; + background-color: #0081c2; + background-image: -moz-linear-gradient(top, #0088cc, #0077b3); + background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#0088cc), to(#0077b3)); + background-image: -webkit-linear-gradient(top, #0088cc, #0077b3); + background-image: -o-linear-gradient(top, #0088cc, #0077b3); + background-image: linear-gradient(to bottom, #0088cc, #0077b3); + background-repeat: repeat-x; + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff0088cc', endColorstr='#ff0077b3', GradientType=0); +} +.dropdown-menu > .disabled > a, +.dropdown-menu > .disabled > a:hover, +.dropdown-menu > .disabled > a:focus { + color: #999999; +} +.dropdown-menu > .disabled > a:hover, +.dropdown-menu > .disabled > a:focus { + text-decoration: none; + background-color: transparent; + background-image: none; + filter: progid:DXImageTransform.Microsoft.gradient(enabled = false); + cursor: default; +} +.open { + *z-index: 1000; +} +.open > .dropdown-menu { + display: block; +} +.dropdown-backdrop { + position: fixed; + left: 0; + right: 0; + bottom: 0; + top: 0; + z-index: 990; +} +.pull-right > .dropdown-menu { + right: 0; + left: auto; +} +.dropup .caret, +.navbar-fixed-bottom .dropdown .caret { + border-top: 0; + border-bottom: 4px solid #000000; + content: ""; +} +.dropup .dropdown-menu, +.navbar-fixed-bottom .dropdown .dropdown-menu { + top: auto; + bottom: 100%; + margin-bottom: 1px; +} +.dropdown-submenu { + position: relative; +} +.dropdown-submenu > .dropdown-menu { + top: 0; + left: 100%; + margin-top: -6px; + margin-left: -1px; + -webkit-border-radius: 0 6px 6px 6px; + -moz-border-radius: 0 6px 6px 6px; + border-radius: 0 6px 6px 6px; +} +.dropdown-submenu:hover > .dropdown-menu { + display: block; +} +.dropup .dropdown-submenu > .dropdown-menu { + top: auto; + bottom: 0; + margin-top: 0; + margin-bottom: -2px; + -webkit-border-radius: 5px 5px 5px 0; + -moz-border-radius: 5px 5px 5px 0; + border-radius: 5px 5px 5px 0; +} +.dropdown-submenu > a:after { + display: block; + content: " "; + float: right; + width: 0; + height: 0; + border-color: transparent; + border-style: solid; + border-width: 5px 0 5px 5px; + border-left-color: #cccccc; + margin-top: 5px; + margin-right: -10px; +} +.dropdown-submenu:hover > a:after { + border-left-color: #ffffff; +} +.dropdown-submenu.pull-left { + float: none; +} +.dropdown-submenu.pull-left > .dropdown-menu { + left: -100%; + margin-left: 10px; + -webkit-border-radius: 6px 0 6px 6px; + -moz-border-radius: 6px 0 6px 6px; + border-radius: 6px 0 6px 6px; +} +.dropdown .dropdown-menu .nav-header { + padding-left: 20px; + padding-right: 20px; +} +.typeahead { + z-index: 1051; + margin-top: 2px; + -webkit-border-radius: 4px; + -moz-border-radius: 4px; + border-radius: 4px; +} +.well { + min-height: 20px; + padding: 19px; + margin-bottom: 20px; + background-color: #f5f5f5; + border: 1px solid #e3e3e3; + -webkit-border-radius: 4px; + -moz-border-radius: 4px; + border-radius: 4px; + -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.05); + -moz-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.05); + box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.05); +} +.well blockquote { + border-color: #ddd; + border-color: rgba(0, 0, 0, 0.15); +} +.well-large { + padding: 24px; + -webkit-border-radius: 6px; + -moz-border-radius: 6px; + border-radius: 6px; +} +.well-small { + padding: 9px; + -webkit-border-radius: 3px; + -moz-border-radius: 3px; + border-radius: 3px; +} +.fade { + opacity: 0; + -webkit-transition: opacity 0.15s linear; + -moz-transition: opacity 0.15s linear; + -o-transition: opacity 0.15s linear; + transition: opacity 0.15s linear; +} +.fade.in { + opacity: 1; +} +.collapse { + position: relative; + height: 0; + overflow: hidden; + -webkit-transition: height 0.35s ease; + -moz-transition: height 0.35s ease; + -o-transition: height 0.35s ease; + transition: height 0.35s ease; +} +.collapse.in { + height: auto; +} +.close { + float: right; + font-size: 20px; + font-weight: bold; + line-height: 20px; + color: #000000; + text-shadow: 0 1px 0 #ffffff; + opacity: 0.2; + filter: alpha(opacity=20); +} +.close:hover, +.close:focus { + color: #000000; + text-decoration: none; + cursor: pointer; + opacity: 0.4; + filter: alpha(opacity=40); +} +button.close { + padding: 0; + cursor: pointer; + background: transparent; + border: 0; + -webkit-appearance: none; +} +.btn { + display: inline-block; + *display: inline; + /* IE7 inline-block hack */ + + *zoom: 1; + padding: 4px 12px; + margin-bottom: 0; + font-size: 14px; + line-height: 20px; + text-align: center; + vertical-align: middle; + cursor: pointer; + color: #333333; + text-shadow: 0 1px 1px rgba(255, 255, 255, 0.75); + background-color: #f5f5f5; + background-image: -moz-linear-gradient(top, #ffffff, #e6e6e6); + background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#ffffff), to(#e6e6e6)); + background-image: -webkit-linear-gradient(top, #ffffff, #e6e6e6); + background-image: -o-linear-gradient(top, #ffffff, #e6e6e6); + background-image: linear-gradient(to bottom, #ffffff, #e6e6e6); + background-repeat: repeat-x; + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffffffff', endColorstr='#ffe6e6e6', GradientType=0); + border-color: #e6e6e6 #e6e6e6 #bfbfbf; + border-color: rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25); + *background-color: #e6e6e6; + /* Darken IE7 buttons by default so they stand out more given they won't have borders */ + + filter: progid:DXImageTransform.Microsoft.gradient(enabled = false); + border: 1px solid #cccccc; + *border: 0; + border-bottom-color: #b3b3b3; + -webkit-border-radius: 4px; + -moz-border-radius: 4px; + border-radius: 4px; + *margin-left: .3em; + -webkit-box-shadow: inset 0 1px 0 rgba(255,255,255,.2), 0 1px 2px rgba(0,0,0,.05); + -moz-box-shadow: inset 0 1px 0 rgba(255,255,255,.2), 0 1px 2px rgba(0,0,0,.05); + box-shadow: inset 0 1px 0 rgba(255,255,255,.2), 0 1px 2px rgba(0,0,0,.05); +} +.btn:hover, +.btn:focus, +.btn:active, +.btn.active, +.btn.disabled, +.btn[disabled] { + color: #333333; + background-color: #e6e6e6; + *background-color: #d9d9d9; +} +.btn:active, +.btn.active { + background-color: #cccccc \9; +} +.btn:first-child { + *margin-left: 0; +} +.btn:hover, +.btn:focus { + color: #333333; + text-decoration: none; + background-position: 0 -15px; + -webkit-transition: background-position 0.1s linear; + -moz-transition: background-position 0.1s linear; + -o-transition: background-position 0.1s linear; + transition: background-position 0.1s linear; +} +.btn:focus { + outline: thin dotted #333; + outline: 5px auto -webkit-focus-ring-color; + outline-offset: -2px; +} +.btn.active, +.btn:active { + background-image: none; + outline: 0; + -webkit-box-shadow: inset 0 2px 4px rgba(0,0,0,.15), 0 1px 2px rgba(0,0,0,.05); + -moz-box-shadow: inset 0 2px 4px rgba(0,0,0,.15), 0 1px 2px rgba(0,0,0,.05); + box-shadow: inset 0 2px 4px rgba(0,0,0,.15), 0 1px 2px rgba(0,0,0,.05); +} +.btn.disabled, +.btn[disabled] { + cursor: default; + background-image: none; + opacity: 0.65; + filter: alpha(opacity=65); + -webkit-box-shadow: none; + -moz-box-shadow: none; + box-shadow: none; +} +.btn-large { + padding: 11px 19px; + font-size: 17.5px; + -webkit-border-radius: 6px; + -moz-border-radius: 6px; + border-radius: 6px; +} +.btn-large [class^="icon-"], +.btn-large [class*=" icon-"] { + margin-top: 4px; +} +.btn-small { + padding: 2px 10px; + font-size: 11.9px; + -webkit-border-radius: 3px; + -moz-border-radius: 3px; + border-radius: 3px; +} +.btn-small [class^="icon-"], +.btn-small [class*=" icon-"] { + margin-top: 0; +} +.btn-mini [class^="icon-"], +.btn-mini [class*=" icon-"] { + margin-top: -1px; +} +.btn-mini { + padding: 0 6px; + font-size: 10.5px; + -webkit-border-radius: 3px; + -moz-border-radius: 3px; + border-radius: 3px; +} +.btn-block { + display: block; + width: 100%; + padding-left: 0; + padding-right: 0; + -webkit-box-sizing: border-box; + -moz-box-sizing: border-box; + box-sizing: border-box; +} +.btn-block + .btn-block { + margin-top: 5px; +} +input[type="submit"].btn-block, +input[type="reset"].btn-block, +input[type="button"].btn-block { + width: 100%; +} +.btn-primary.active, +.btn-warning.active, +.btn-danger.active, +.btn-success.active, +.btn-info.active, +.btn-inverse.active { + color: rgba(255, 255, 255, 0.75); +} +.btn-primary { + color: #ffffff; + text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.25); + background-color: #006dcc; + background-image: -moz-linear-gradient(top, #0088cc, #0044cc); + background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#0088cc), to(#0044cc)); + background-image: -webkit-linear-gradient(top, #0088cc, #0044cc); + background-image: -o-linear-gradient(top, #0088cc, #0044cc); + background-image: linear-gradient(to bottom, #0088cc, #0044cc); + background-repeat: repeat-x; + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff0088cc', endColorstr='#ff0044cc', GradientType=0); + border-color: #0044cc #0044cc #002a80; + border-color: rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25); + *background-color: #0044cc; + /* Darken IE7 buttons by default so they stand out more given they won't have borders */ + + filter: progid:DXImageTransform.Microsoft.gradient(enabled = false); +} +.btn-primary:hover, +.btn-primary:focus, +.btn-primary:active, +.btn-primary.active, +.btn-primary.disabled, +.btn-primary[disabled] { + color: #ffffff; + background-color: #0044cc; + *background-color: #003bb3; +} +.btn-primary:active, +.btn-primary.active { + background-color: #003399 \9; +} +.btn-warning { + color: #ffffff; + text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.25); + background-color: #faa732; + background-image: -moz-linear-gradient(top, #fbb450, #f89406); + background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#fbb450), to(#f89406)); + background-image: -webkit-linear-gradient(top, #fbb450, #f89406); + background-image: -o-linear-gradient(top, #fbb450, #f89406); + background-image: linear-gradient(to bottom, #fbb450, #f89406); + background-repeat: repeat-x; + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fffbb450', endColorstr='#fff89406', GradientType=0); + border-color: #f89406 #f89406 #ad6704; + border-color: rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25); + *background-color: #f89406; + /* Darken IE7 buttons by default so they stand out more given they won't have borders */ + + filter: progid:DXImageTransform.Microsoft.gradient(enabled = false); +} +.btn-warning:hover, +.btn-warning:focus, +.btn-warning:active, +.btn-warning.active, +.btn-warning.disabled, +.btn-warning[disabled] { + color: #ffffff; + background-color: #f89406; + *background-color: #df8505; +} +.btn-warning:active, +.btn-warning.active { + background-color: #c67605 \9; +} +.btn-danger { + color: #ffffff; + text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.25); + background-color: #da4f49; + background-image: -moz-linear-gradient(top, #ee5f5b, #bd362f); + background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#ee5f5b), to(#bd362f)); + background-image: -webkit-linear-gradient(top, #ee5f5b, #bd362f); + background-image: -o-linear-gradient(top, #ee5f5b, #bd362f); + background-image: linear-gradient(to bottom, #ee5f5b, #bd362f); + background-repeat: repeat-x; + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffee5f5b', endColorstr='#ffbd362f', GradientType=0); + border-color: #bd362f #bd362f #802420; + border-color: rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25); + *background-color: #bd362f; + /* Darken IE7 buttons by default so they stand out more given they won't have borders */ + + filter: progid:DXImageTransform.Microsoft.gradient(enabled = false); +} +.btn-danger:hover, +.btn-danger:focus, +.btn-danger:active, +.btn-danger.active, +.btn-danger.disabled, +.btn-danger[disabled] { + color: #ffffff; + background-color: #bd362f; + *background-color: #a9302a; +} +.btn-danger:active, +.btn-danger.active { + background-color: #942a25 \9; +} +.btn-success { + color: #ffffff; + text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.25); + background-color: #5bb75b; + background-image: -moz-linear-gradient(top, #62c462, #51a351); + background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#62c462), to(#51a351)); + background-image: -webkit-linear-gradient(top, #62c462, #51a351); + background-image: -o-linear-gradient(top, #62c462, #51a351); + background-image: linear-gradient(to bottom, #62c462, #51a351); + background-repeat: repeat-x; + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff62c462', endColorstr='#ff51a351', GradientType=0); + border-color: #51a351 #51a351 #387038; + border-color: rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25); + *background-color: #51a351; + /* Darken IE7 buttons by default so they stand out more given they won't have borders */ + + filter: progid:DXImageTransform.Microsoft.gradient(enabled = false); +} +.btn-success:hover, +.btn-success:focus, +.btn-success:active, +.btn-success.active, +.btn-success.disabled, +.btn-success[disabled] { + color: #ffffff; + background-color: #51a351; + *background-color: #499249; +} +.btn-success:active, +.btn-success.active { + background-color: #408140 \9; +} +.btn-info { + color: #ffffff; + text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.25); + background-color: #49afcd; + background-image: -moz-linear-gradient(top, #5bc0de, #2f96b4); + background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#5bc0de), to(#2f96b4)); + background-image: -webkit-linear-gradient(top, #5bc0de, #2f96b4); + background-image: -o-linear-gradient(top, #5bc0de, #2f96b4); + background-image: linear-gradient(to bottom, #5bc0de, #2f96b4); + background-repeat: repeat-x; + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff5bc0de', endColorstr='#ff2f96b4', GradientType=0); + border-color: #2f96b4 #2f96b4 #1f6377; + border-color: rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25); + *background-color: #2f96b4; + /* Darken IE7 buttons by default so they stand out more given they won't have borders */ + + filter: progid:DXImageTransform.Microsoft.gradient(enabled = false); +} +.btn-info:hover, +.btn-info:focus, +.btn-info:active, +.btn-info.active, +.btn-info.disabled, +.btn-info[disabled] { + color: #ffffff; + background-color: #2f96b4; + *background-color: #2a85a0; +} +.btn-info:active, +.btn-info.active { + background-color: #24748c \9; +} +.btn-inverse { + color: #ffffff; + text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.25); + background-color: #363636; + background-image: -moz-linear-gradient(top, #444444, #222222); + background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#444444), to(#222222)); + background-image: -webkit-linear-gradient(top, #444444, #222222); + background-image: -o-linear-gradient(top, #444444, #222222); + background-image: linear-gradient(to bottom, #444444, #222222); + background-repeat: repeat-x; + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff444444', endColorstr='#ff222222', GradientType=0); + border-color: #222222 #222222 #000000; + border-color: rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25); + *background-color: #222222; + /* Darken IE7 buttons by default so they stand out more given they won't have borders */ + + filter: progid:DXImageTransform.Microsoft.gradient(enabled = false); +} +.btn-inverse:hover, +.btn-inverse:focus, +.btn-inverse:active, +.btn-inverse.active, +.btn-inverse.disabled, +.btn-inverse[disabled] { + color: #ffffff; + background-color: #222222; + *background-color: #151515; +} +.btn-inverse:active, +.btn-inverse.active { + background-color: #080808 \9; +} +button.btn, +input[type="submit"].btn { + *padding-top: 3px; + *padding-bottom: 3px; +} +button.btn::-moz-focus-inner, +input[type="submit"].btn::-moz-focus-inner { + padding: 0; + border: 0; +} +button.btn.btn-large, +input[type="submit"].btn.btn-large { + *padding-top: 7px; + *padding-bottom: 7px; +} +button.btn.btn-small, +input[type="submit"].btn.btn-small { + *padding-top: 3px; + *padding-bottom: 3px; +} +button.btn.btn-mini, +input[type="submit"].btn.btn-mini { + *padding-top: 1px; + *padding-bottom: 1px; +} +.btn-link, +.btn-link:active, +.btn-link[disabled] { + background-color: transparent; + background-image: none; + -webkit-box-shadow: none; + -moz-box-shadow: none; + box-shadow: none; +} +.btn-link { + border-color: transparent; + cursor: pointer; + color: #0088cc; + -webkit-border-radius: 0; + -moz-border-radius: 0; + border-radius: 0; +} +.btn-link:hover, +.btn-link:focus { + color: #005580; + text-decoration: underline; + background-color: transparent; +} +.btn-link[disabled]:hover, +.btn-link[disabled]:focus { + color: #333333; + text-decoration: none; +} +.btn-group { + position: relative; + display: inline-block; + *display: inline; + /* IE7 inline-block hack */ + + *zoom: 1; + font-size: 0; + vertical-align: middle; + white-space: nowrap; + *margin-left: .3em; +} +.btn-group:first-child { + *margin-left: 0; +} +.btn-group + .btn-group { + margin-left: 5px; +} +.btn-toolbar { + font-size: 0; + margin-top: 10px; + margin-bottom: 10px; +} +.btn-toolbar > .btn + .btn, +.btn-toolbar > .btn-group + .btn, +.btn-toolbar > .btn + .btn-group { + margin-left: 5px; +} +.btn-group > .btn { + position: relative; + -webkit-border-radius: 0; + -moz-border-radius: 0; + border-radius: 0; +} +.btn-group > .btn + .btn { + margin-left: -1px; +} +.btn-group > .btn, +.btn-group > .dropdown-menu, +.btn-group > .popover { + font-size: 14px; +} +.btn-group > .btn-mini { + font-size: 10.5px; +} +.btn-group > .btn-small { + font-size: 11.9px; +} +.btn-group > .btn-large { + font-size: 17.5px; +} +.btn-group > .btn:first-child { + margin-left: 0; + -webkit-border-top-left-radius: 4px; + -moz-border-radius-topleft: 4px; + border-top-left-radius: 4px; + -webkit-border-bottom-left-radius: 4px; + -moz-border-radius-bottomleft: 4px; + border-bottom-left-radius: 4px; +} +.btn-group > .btn:last-child, +.btn-group > .dropdown-toggle { + -webkit-border-top-right-radius: 4px; + -moz-border-radius-topright: 4px; + border-top-right-radius: 4px; + -webkit-border-bottom-right-radius: 4px; + -moz-border-radius-bottomright: 4px; + border-bottom-right-radius: 4px; +} +.btn-group > .btn.large:first-child { + margin-left: 0; + -webkit-border-top-left-radius: 6px; + -moz-border-radius-topleft: 6px; + border-top-left-radius: 6px; + -webkit-border-bottom-left-radius: 6px; + -moz-border-radius-bottomleft: 6px; + border-bottom-left-radius: 6px; +} +.btn-group > .btn.large:last-child, +.btn-group > .large.dropdown-toggle { + -webkit-border-top-right-radius: 6px; + -moz-border-radius-topright: 6px; + border-top-right-radius: 6px; + -webkit-border-bottom-right-radius: 6px; + -moz-border-radius-bottomright: 6px; + border-bottom-right-radius: 6px; +} +.btn-group > .btn:hover, +.btn-group > .btn:focus, +.btn-group > .btn:active, +.btn-group > .btn.active { + z-index: 2; +} +.btn-group .dropdown-toggle:active, +.btn-group.open .dropdown-toggle { + outline: 0; +} +.btn-group > .btn + .dropdown-toggle { + padding-left: 8px; + padding-right: 8px; + -webkit-box-shadow: inset 1px 0 0 rgba(255,255,255,.125), inset 0 1px 0 rgba(255,255,255,.2), 0 1px 2px rgba(0,0,0,.05); + -moz-box-shadow: inset 1px 0 0 rgba(255,255,255,.125), inset 0 1px 0 rgba(255,255,255,.2), 0 1px 2px rgba(0,0,0,.05); + box-shadow: inset 1px 0 0 rgba(255,255,255,.125), inset 0 1px 0 rgba(255,255,255,.2), 0 1px 2px rgba(0,0,0,.05); + *padding-top: 5px; + *padding-bottom: 5px; +} +.btn-group > .btn-mini + .dropdown-toggle { + padding-left: 5px; + padding-right: 5px; + *padding-top: 2px; + *padding-bottom: 2px; +} +.btn-group > .btn-small + .dropdown-toggle { + *padding-top: 5px; + *padding-bottom: 4px; +} +.btn-group > .btn-large + .dropdown-toggle { + padding-left: 12px; + padding-right: 12px; + *padding-top: 7px; + *padding-bottom: 7px; +} +.btn-group.open .dropdown-toggle { + background-image: none; + -webkit-box-shadow: inset 0 2px 4px rgba(0,0,0,.15), 0 1px 2px rgba(0,0,0,.05); + -moz-box-shadow: inset 0 2px 4px rgba(0,0,0,.15), 0 1px 2px rgba(0,0,0,.05); + box-shadow: inset 0 2px 4px rgba(0,0,0,.15), 0 1px 2px rgba(0,0,0,.05); +} +.btn-group.open .btn.dropdown-toggle { + background-color: #e6e6e6; +} +.btn-group.open .btn-primary.dropdown-toggle { + background-color: #0044cc; +} +.btn-group.open .btn-warning.dropdown-toggle { + background-color: #f89406; +} +.btn-group.open .btn-danger.dropdown-toggle { + background-color: #bd362f; +} +.btn-group.open .btn-success.dropdown-toggle { + background-color: #51a351; +} +.btn-group.open .btn-info.dropdown-toggle { + background-color: #2f96b4; +} +.btn-group.open .btn-inverse.dropdown-toggle { + background-color: #222222; +} +.btn .caret { + margin-top: 8px; + margin-left: 0; +} +.btn-large .caret { + margin-top: 6px; +} +.btn-large .caret { + border-left-width: 5px; + border-right-width: 5px; + border-top-width: 5px; +} +.btn-mini .caret, +.btn-small .caret { + margin-top: 8px; +} +.dropup .btn-large .caret { + border-bottom-width: 5px; +} +.btn-primary .caret, +.btn-warning .caret, +.btn-danger .caret, +.btn-info .caret, +.btn-success .caret, +.btn-inverse .caret { + border-top-color: #ffffff; + border-bottom-color: #ffffff; +} +.btn-group-vertical { + display: inline-block; + *display: inline; + /* IE7 inline-block hack */ + + *zoom: 1; +} +.btn-group-vertical > .btn { + display: block; + float: none; + max-width: 100%; + -webkit-border-radius: 0; + -moz-border-radius: 0; + border-radius: 0; +} +.btn-group-vertical > .btn + .btn { + margin-left: 0; + margin-top: -1px; +} +.btn-group-vertical > .btn:first-child { + -webkit-border-radius: 4px 4px 0 0; + -moz-border-radius: 4px 4px 0 0; + border-radius: 4px 4px 0 0; +} +.btn-group-vertical > .btn:last-child { + -webkit-border-radius: 0 0 4px 4px; + -moz-border-radius: 0 0 4px 4px; + border-radius: 0 0 4px 4px; +} +.btn-group-vertical > .btn-large:first-child { + -webkit-border-radius: 6px 6px 0 0; + -moz-border-radius: 6px 6px 0 0; + border-radius: 6px 6px 0 0; +} +.btn-group-vertical > .btn-large:last-child { + -webkit-border-radius: 0 0 6px 6px; + -moz-border-radius: 0 0 6px 6px; + border-radius: 0 0 6px 6px; +} +.alert { + padding: 8px 35px 8px 14px; + margin-bottom: 20px; + text-shadow: 0 1px 0 rgba(255, 255, 255, 0.5); + background-color: #fcf8e3; + border: 1px solid #fbeed5; + -webkit-border-radius: 4px; + -moz-border-radius: 4px; + border-radius: 4px; +} +.alert, +.alert h4 { + color: #c09853; +} +.alert h4 { + margin: 0; +} +.alert .close { + position: relative; + top: -2px; + right: -21px; + line-height: 20px; +} +.alert-success { + background-color: #dff0d8; + border-color: #d6e9c6; + color: #468847; +} +.alert-success h4 { + color: #468847; +} +.alert-danger, +.alert-error { + background-color: #f2dede; + border-color: #eed3d7; + color: #b94a48; +} +.alert-danger h4, +.alert-error h4 { + color: #b94a48; +} +.alert-info { + background-color: #d9edf7; + border-color: #bce8f1; + color: #3a87ad; +} +.alert-info h4 { + color: #3a87ad; +} +.alert-block { + padding-top: 14px; + padding-bottom: 14px; +} +.alert-block > p, +.alert-block > ul { + margin-bottom: 0; +} +.alert-block p + p { + margin-top: 5px; +} +.nav { + margin-left: 0; + margin-bottom: 20px; + list-style: none; +} +.nav > li > a { + display: block; +} +.nav > li > a:hover, +.nav > li > a:focus { + text-decoration: none; + background-color: #eeeeee; +} +.nav > li > a > img { + max-width: none; +} +.nav > .pull-right { + float: right; +} +.nav-header { + display: block; + padding: 3px 15px; + font-size: 11px; + font-weight: bold; + line-height: 20px; + color: #999999; + text-shadow: 0 1px 0 rgba(255, 255, 255, 0.5); + text-transform: uppercase; +} +.nav li + .nav-header { + margin-top: 9px; +} +.nav-list { + padding-left: 15px; + padding-right: 15px; + margin-bottom: 0; +} +.nav-list > li > a, +.nav-list .nav-header { + margin-left: -15px; + margin-right: -15px; + text-shadow: 0 1px 0 rgba(255, 255, 255, 0.5); +} +.nav-list > li > a { + padding: 3px 15px; +} +.nav-list > .active > a, +.nav-list > .active > a:hover, +.nav-list > .active > a:focus { + color: #ffffff; + text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.2); + background-color: #0088cc; +} +.nav-list [class^="icon-"], +.nav-list [class*=" icon-"] { + margin-right: 2px; +} +.nav-list .divider { + *width: 100%; + height: 1px; + margin: 9px 1px; + *margin: -5px 0 5px; + overflow: hidden; + background-color: #e5e5e5; + border-bottom: 1px solid #ffffff; +} +.nav-tabs, +.nav-pills { + *zoom: 1; +} +.nav-tabs:before, +.nav-pills:before, +.nav-tabs:after, +.nav-pills:after { + display: table; + content: ""; + line-height: 0; +} +.nav-tabs:after, +.nav-pills:after { + clear: both; +} +.nav-tabs > li, +.nav-pills > li { + float: left; +} +.nav-tabs > li > a, +.nav-pills > li > a { + padding-right: 12px; + padding-left: 12px; + margin-right: 2px; + line-height: 14px; +} +.nav-tabs { + border-bottom: 1px solid #ddd; +} +.nav-tabs > li { + margin-bottom: -1px; +} +.nav-tabs > li > a { + padding-top: 8px; + padding-bottom: 8px; + line-height: 20px; + border: 1px solid transparent; + -webkit-border-radius: 4px 4px 0 0; + -moz-border-radius: 4px 4px 0 0; + border-radius: 4px 4px 0 0; +} +.nav-tabs > li > a:hover, +.nav-tabs > li > a:focus { + border-color: #eeeeee #eeeeee #dddddd; +} +.nav-tabs > .active > a, +.nav-tabs > .active > a:hover, +.nav-tabs > .active > a:focus { + color: #555555; + background-color: #ffffff; + border: 1px solid #ddd; + border-bottom-color: transparent; + cursor: default; +} +.nav-pills > li > a { + padding-top: 8px; + padding-bottom: 8px; + margin-top: 2px; + margin-bottom: 2px; + -webkit-border-radius: 5px; + -moz-border-radius: 5px; + border-radius: 5px; +} +.nav-pills > .active > a, +.nav-pills > .active > a:hover, +.nav-pills > .active > a:focus { + color: #ffffff; + background-color: #0088cc; +} +.nav-stacked > li { + float: none; +} +.nav-stacked > li > a { + margin-right: 0; +} +.nav-tabs.nav-stacked { + border-bottom: 0; +} +.nav-tabs.nav-stacked > li > a { + border: 1px solid #ddd; + -webkit-border-radius: 0; + -moz-border-radius: 0; + border-radius: 0; +} +.nav-tabs.nav-stacked > li:first-child > a { + -webkit-border-top-right-radius: 4px; + -moz-border-radius-topright: 4px; + border-top-right-radius: 4px; + -webkit-border-top-left-radius: 4px; + -moz-border-radius-topleft: 4px; + border-top-left-radius: 4px; +} +.nav-tabs.nav-stacked > li:last-child > a { + -webkit-border-bottom-right-radius: 4px; + -moz-border-radius-bottomright: 4px; + border-bottom-right-radius: 4px; + -webkit-border-bottom-left-radius: 4px; + -moz-border-radius-bottomleft: 4px; + border-bottom-left-radius: 4px; +} +.nav-tabs.nav-stacked > li > a:hover, +.nav-tabs.nav-stacked > li > a:focus { + border-color: #ddd; + z-index: 2; +} +.nav-pills.nav-stacked > li > a { + margin-bottom: 3px; +} +.nav-pills.nav-stacked > li:last-child > a { + margin-bottom: 1px; +} +.nav-tabs .dropdown-menu { + -webkit-border-radius: 0 0 6px 6px; + -moz-border-radius: 0 0 6px 6px; + border-radius: 0 0 6px 6px; +} +.nav-pills .dropdown-menu { + -webkit-border-radius: 6px; + -moz-border-radius: 6px; + border-radius: 6px; +} +.nav .dropdown-toggle .caret { + border-top-color: #0088cc; + border-bottom-color: #0088cc; + margin-top: 6px; +} +.nav .dropdown-toggle:hover .caret, +.nav .dropdown-toggle:focus .caret { + border-top-color: #005580; + border-bottom-color: #005580; +} +/* move down carets for tabs */ +.nav-tabs .dropdown-toggle .caret { + margin-top: 8px; +} +.nav .active .dropdown-toggle .caret { + border-top-color: #fff; + border-bottom-color: #fff; +} +.nav-tabs .active .dropdown-toggle .caret { + border-top-color: #555555; + border-bottom-color: #555555; +} +.nav > .dropdown.active > a:hover, +.nav > .dropdown.active > a:focus { + cursor: pointer; +} +.nav-tabs .open .dropdown-toggle, +.nav-pills .open .dropdown-toggle, +.nav > li.dropdown.open.active > a:hover, +.nav > li.dropdown.open.active > a:focus { + color: #ffffff; + background-color: #999999; + border-color: #999999; +} +.nav li.dropdown.open .caret, +.nav li.dropdown.open.active .caret, +.nav li.dropdown.open a:hover .caret, +.nav li.dropdown.open a:focus .caret { + border-top-color: #ffffff; + border-bottom-color: #ffffff; + opacity: 1; + filter: alpha(opacity=100); +} +.tabs-stacked .open > a:hover, +.tabs-stacked .open > a:focus { + border-color: #999999; +} +.tabbable { + *zoom: 1; +} +.tabbable:before, +.tabbable:after { + display: table; + content: ""; + line-height: 0; +} +.tabbable:after { + clear: both; +} +.tab-content { + overflow: auto; +} +.tabs-below > .nav-tabs, +.tabs-right > .nav-tabs, +.tabs-left > .nav-tabs { + border-bottom: 0; +} +.tab-content > .tab-pane, +.pill-content > .pill-pane { + display: none; +} +.tab-content > .active, +.pill-content > .active { + display: block; +} +.tabs-below > .nav-tabs { + border-top: 1px solid #ddd; +} +.tabs-below > .nav-tabs > li { + margin-top: -1px; + margin-bottom: 0; +} +.tabs-below > .nav-tabs > li > a { + -webkit-border-radius: 0 0 4px 4px; + -moz-border-radius: 0 0 4px 4px; + border-radius: 0 0 4px 4px; +} +.tabs-below > .nav-tabs > li > a:hover, +.tabs-below > .nav-tabs > li > a:focus { + border-bottom-color: transparent; + border-top-color: #ddd; +} +.tabs-below > .nav-tabs > .active > a, +.tabs-below > .nav-tabs > .active > a:hover, +.tabs-below > .nav-tabs > .active > a:focus { + border-color: transparent #ddd #ddd #ddd; +} +.tabs-left > .nav-tabs > li, +.tabs-right > .nav-tabs > li { + float: none; +} +.tabs-left > .nav-tabs > li > a, +.tabs-right > .nav-tabs > li > a { + min-width: 74px; + margin-right: 0; + margin-bottom: 3px; +} +.tabs-left > .nav-tabs { + float: left; + margin-right: 19px; + border-right: 1px solid #ddd; +} +.tabs-left > .nav-tabs > li > a { + margin-right: -1px; + -webkit-border-radius: 4px 0 0 4px; + -moz-border-radius: 4px 0 0 4px; + border-radius: 4px 0 0 4px; +} +.tabs-left > .nav-tabs > li > a:hover, +.tabs-left > .nav-tabs > li > a:focus { + border-color: #eeeeee #dddddd #eeeeee #eeeeee; +} +.tabs-left > .nav-tabs .active > a, +.tabs-left > .nav-tabs .active > a:hover, +.tabs-left > .nav-tabs .active > a:focus { + border-color: #ddd transparent #ddd #ddd; + *border-right-color: #ffffff; +} +.tabs-right > .nav-tabs { + float: right; + margin-left: 19px; + border-left: 1px solid #ddd; +} +.tabs-right > .nav-tabs > li > a { + margin-left: -1px; + -webkit-border-radius: 0 4px 4px 0; + -moz-border-radius: 0 4px 4px 0; + border-radius: 0 4px 4px 0; +} +.tabs-right > .nav-tabs > li > a:hover, +.tabs-right > .nav-tabs > li > a:focus { + border-color: #eeeeee #eeeeee #eeeeee #dddddd; +} +.tabs-right > .nav-tabs .active > a, +.tabs-right > .nav-tabs .active > a:hover, +.tabs-right > .nav-tabs .active > a:focus { + border-color: #ddd #ddd #ddd transparent; + *border-left-color: #ffffff; +} +.nav > .disabled > a { + color: #999999; +} +.nav > .disabled > a:hover, +.nav > .disabled > a:focus { + text-decoration: none; + background-color: transparent; + cursor: default; +} +.navbar { + overflow: visible; + margin-bottom: 20px; + *position: relative; + *z-index: 2; +} +.navbar-inner { + min-height: 40px; + padding-left: 20px; + padding-right: 20px; + background-color: #fafafa; + background-image: -moz-linear-gradient(top, #ffffff, #f2f2f2); + background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#ffffff), to(#f2f2f2)); + background-image: -webkit-linear-gradient(top, #ffffff, #f2f2f2); + background-image: -o-linear-gradient(top, #ffffff, #f2f2f2); + background-image: linear-gradient(to bottom, #ffffff, #f2f2f2); + background-repeat: repeat-x; + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffffffff', endColorstr='#fff2f2f2', GradientType=0); + border: 1px solid #d4d4d4; + -webkit-border-radius: 4px; + -moz-border-radius: 4px; + border-radius: 4px; + -webkit-box-shadow: 0 1px 4px rgba(0, 0, 0, 0.065); + -moz-box-shadow: 0 1px 4px rgba(0, 0, 0, 0.065); + box-shadow: 0 1px 4px rgba(0, 0, 0, 0.065); + *zoom: 1; +} +.navbar-inner:before, +.navbar-inner:after { + display: table; + content: ""; + line-height: 0; +} +.navbar-inner:after { + clear: both; +} +.navbar .container { + width: auto; +} +.nav-collapse.collapse { + height: auto; + overflow: visible; +} +.navbar .brand { + float: left; + display: block; + padding: 10px 20px 10px; + margin-left: -20px; + font-size: 20px; + font-weight: 200; + color: #777777; + text-shadow: 0 1px 0 #ffffff; +} +.navbar .brand:hover, +.navbar .brand:focus { + text-decoration: none; +} +.navbar-text { + margin-bottom: 0; + line-height: 40px; + color: #777777; +} +.navbar-link { + color: #777777; +} +.navbar-link:hover, +.navbar-link:focus { + color: #333333; +} +.navbar .divider-vertical { + height: 40px; + margin: 0 9px; + border-left: 1px solid #f2f2f2; + border-right: 1px solid #ffffff; +} +.navbar .btn, +.navbar .btn-group { + margin-top: 5px; +} +.navbar .btn-group .btn, +.navbar .input-prepend .btn, +.navbar .input-append .btn, +.navbar .input-prepend .btn-group, +.navbar .input-append .btn-group { + margin-top: 0; +} +.navbar-form { + margin-bottom: 0; + *zoom: 1; +} +.navbar-form:before, +.navbar-form:after { + display: table; + content: ""; + line-height: 0; +} +.navbar-form:after { + clear: both; +} +.navbar-form input, +.navbar-form select, +.navbar-form .radio, +.navbar-form .checkbox { + margin-top: 5px; +} +.navbar-form input, +.navbar-form select, +.navbar-form .btn { + display: inline-block; + margin-bottom: 0; +} +.navbar-form input[type="image"], +.navbar-form input[type="checkbox"], +.navbar-form input[type="radio"] { + margin-top: 3px; +} +.navbar-form .input-append, +.navbar-form .input-prepend { + margin-top: 5px; + white-space: nowrap; +} +.navbar-form .input-append input, +.navbar-form .input-prepend input { + margin-top: 0; +} +.navbar-search { + position: relative; + float: left; + margin-top: 5px; + margin-bottom: 0; +} +.navbar-search .search-query { + margin-bottom: 0; + padding: 4px 14px; + font-family: "Helvetica Neue", Helvetica, Arial, sans-serif; + font-size: 13px; + font-weight: normal; + line-height: 1; + -webkit-border-radius: 15px; + -moz-border-radius: 15px; + border-radius: 15px; +} +.navbar-static-top { + position: static; + margin-bottom: 0; +} +.navbar-static-top .navbar-inner { + -webkit-border-radius: 0; + -moz-border-radius: 0; + border-radius: 0; +} +.navbar-fixed-top, +.navbar-fixed-bottom { + position: fixed; + right: 0; + left: 0; + z-index: 1030; + margin-bottom: 0; +} +.navbar-fixed-top .navbar-inner, +.navbar-static-top .navbar-inner { + border-width: 0 0 1px; +} +.navbar-fixed-bottom .navbar-inner { + border-width: 1px 0 0; +} +.navbar-fixed-top .navbar-inner, +.navbar-fixed-bottom .navbar-inner { + padding-left: 0; + padding-right: 0; + -webkit-border-radius: 0; + -moz-border-radius: 0; + border-radius: 0; +} +.navbar-static-top .container, +.navbar-fixed-top .container, +.navbar-fixed-bottom .container { + width: 940px; +} +.navbar-fixed-top { + top: 0; +} +.navbar-fixed-top .navbar-inner, +.navbar-static-top .navbar-inner { + -webkit-box-shadow: 0 1px 10px rgba(0,0,0,.1); + -moz-box-shadow: 0 1px 10px rgba(0,0,0,.1); + box-shadow: 0 1px 10px rgba(0,0,0,.1); +} +.navbar-fixed-bottom { + bottom: 0; +} +.navbar-fixed-bottom .navbar-inner { + -webkit-box-shadow: 0 -1px 10px rgba(0,0,0,.1); + -moz-box-shadow: 0 -1px 10px rgba(0,0,0,.1); + box-shadow: 0 -1px 10px rgba(0,0,0,.1); +} +.navbar .nav { + position: relative; + left: 0; + display: block; + float: left; + margin: 0 10px 0 0; +} +.navbar .nav.pull-right { + float: right; + margin-right: 0; +} +.navbar .nav > li { + float: left; +} +.navbar .nav > li > a { + float: none; + padding: 10px 15px 10px; + color: #777777; + text-decoration: none; + text-shadow: 0 1px 0 #ffffff; +} +.navbar .nav .dropdown-toggle .caret { + margin-top: 8px; +} +.navbar .nav > li > a:focus, +.navbar .nav > li > a:hover { + background-color: transparent; + color: #333333; + text-decoration: none; +} +.navbar .nav > .active > a, +.navbar .nav > .active > a:hover, +.navbar .nav > .active > a:focus { + color: #555555; + text-decoration: none; + background-color: #e5e5e5; + -webkit-box-shadow: inset 0 3px 8px rgba(0, 0, 0, 0.125); + -moz-box-shadow: inset 0 3px 8px rgba(0, 0, 0, 0.125); + box-shadow: inset 0 3px 8px rgba(0, 0, 0, 0.125); +} +.navbar .btn-navbar { + display: none; + float: right; + padding: 7px 10px; + margin-left: 5px; + margin-right: 5px; + color: #ffffff; + text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.25); + background-color: #ededed; + background-image: -moz-linear-gradient(top, #f2f2f2, #e5e5e5); + background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#f2f2f2), to(#e5e5e5)); + background-image: -webkit-linear-gradient(top, #f2f2f2, #e5e5e5); + background-image: -o-linear-gradient(top, #f2f2f2, #e5e5e5); + background-image: linear-gradient(to bottom, #f2f2f2, #e5e5e5); + background-repeat: repeat-x; + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff2f2f2', endColorstr='#ffe5e5e5', GradientType=0); + border-color: #e5e5e5 #e5e5e5 #bfbfbf; + border-color: rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25); + *background-color: #e5e5e5; + /* Darken IE7 buttons by default so they stand out more given they won't have borders */ + + filter: progid:DXImageTransform.Microsoft.gradient(enabled = false); + -webkit-box-shadow: inset 0 1px 0 rgba(255,255,255,.1), 0 1px 0 rgba(255,255,255,.075); + -moz-box-shadow: inset 0 1px 0 rgba(255,255,255,.1), 0 1px 0 rgba(255,255,255,.075); + box-shadow: inset 0 1px 0 rgba(255,255,255,.1), 0 1px 0 rgba(255,255,255,.075); +} +.navbar .btn-navbar:hover, +.navbar .btn-navbar:focus, +.navbar .btn-navbar:active, +.navbar .btn-navbar.active, +.navbar .btn-navbar.disabled, +.navbar .btn-navbar[disabled] { + color: #ffffff; + background-color: #e5e5e5; + *background-color: #d9d9d9; +} +.navbar .btn-navbar:active, +.navbar .btn-navbar.active { + background-color: #cccccc \9; +} +.navbar .btn-navbar .icon-bar { + display: block; + width: 18px; + height: 2px; + background-color: #f5f5f5; + -webkit-border-radius: 1px; + -moz-border-radius: 1px; + border-radius: 1px; + -webkit-box-shadow: 0 1px 0 rgba(0, 0, 0, 0.25); + -moz-box-shadow: 0 1px 0 rgba(0, 0, 0, 0.25); + box-shadow: 0 1px 0 rgba(0, 0, 0, 0.25); +} +.btn-navbar .icon-bar + .icon-bar { + margin-top: 3px; +} +.navbar .nav > li > .dropdown-menu:before { + content: ''; + display: inline-block; + border-left: 7px solid transparent; + border-right: 7px solid transparent; + border-bottom: 7px solid #ccc; + border-bottom-color: rgba(0, 0, 0, 0.2); + position: absolute; + top: -7px; + left: 9px; +} +.navbar .nav > li > .dropdown-menu:after { + content: ''; + display: inline-block; + border-left: 6px solid transparent; + border-right: 6px solid transparent; + border-bottom: 6px solid #ffffff; + position: absolute; + top: -6px; + left: 10px; +} +.navbar-fixed-bottom .nav > li > .dropdown-menu:before { + border-top: 7px solid #ccc; + border-top-color: rgba(0, 0, 0, 0.2); + border-bottom: 0; + bottom: -7px; + top: auto; +} +.navbar-fixed-bottom .nav > li > .dropdown-menu:after { + border-top: 6px solid #ffffff; + border-bottom: 0; + bottom: -6px; + top: auto; +} +.navbar .nav li.dropdown > a:hover .caret, +.navbar .nav li.dropdown > a:focus .caret { + border-top-color: #333333; + border-bottom-color: #333333; +} +.navbar .nav li.dropdown.open > .dropdown-toggle, +.navbar .nav li.dropdown.active > .dropdown-toggle, +.navbar .nav li.dropdown.open.active > .dropdown-toggle { + background-color: #e5e5e5; + color: #555555; +} +.navbar .nav li.dropdown > .dropdown-toggle .caret { + border-top-color: #777777; + border-bottom-color: #777777; +} +.navbar .nav li.dropdown.open > .dropdown-toggle .caret, +.navbar .nav li.dropdown.active > .dropdown-toggle .caret, +.navbar .nav li.dropdown.open.active > .dropdown-toggle .caret { + border-top-color: #555555; + border-bottom-color: #555555; +} +.navbar .pull-right > li > .dropdown-menu, +.navbar .nav > li > .dropdown-menu.pull-right { + left: auto; + right: 0; +} +.navbar .pull-right > li > .dropdown-menu:before, +.navbar .nav > li > .dropdown-menu.pull-right:before { + left: auto; + right: 12px; +} +.navbar .pull-right > li > .dropdown-menu:after, +.navbar .nav > li > .dropdown-menu.pull-right:after { + left: auto; + right: 13px; +} +.navbar .pull-right > li > .dropdown-menu .dropdown-menu, +.navbar .nav > li > .dropdown-menu.pull-right .dropdown-menu { + left: auto; + right: 100%; + margin-left: 0; + margin-right: -1px; + -webkit-border-radius: 6px 0 6px 6px; + -moz-border-radius: 6px 0 6px 6px; + border-radius: 6px 0 6px 6px; +} +.navbar-inverse .navbar-inner { + background-color: #1b1b1b; + background-image: -moz-linear-gradient(top, #222222, #111111); + background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#222222), to(#111111)); + background-image: -webkit-linear-gradient(top, #222222, #111111); + background-image: -o-linear-gradient(top, #222222, #111111); + background-image: linear-gradient(to bottom, #222222, #111111); + background-repeat: repeat-x; + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff222222', endColorstr='#ff111111', GradientType=0); + border-color: #252525; +} +.navbar-inverse .brand, +.navbar-inverse .nav > li > a { + color: #999999; + text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.25); +} +.navbar-inverse .brand:hover, +.navbar-inverse .nav > li > a:hover, +.navbar-inverse .brand:focus, +.navbar-inverse .nav > li > a:focus { + color: #ffffff; +} +.navbar-inverse .brand { + color: #999999; +} +.navbar-inverse .navbar-text { + color: #999999; +} +.navbar-inverse .nav > li > a:focus, +.navbar-inverse .nav > li > a:hover { + background-color: transparent; + color: #ffffff; +} +.navbar-inverse .nav .active > a, +.navbar-inverse .nav .active > a:hover, +.navbar-inverse .nav .active > a:focus { + color: #ffffff; + background-color: #111111; +} +.navbar-inverse .navbar-link { + color: #999999; +} +.navbar-inverse .navbar-link:hover, +.navbar-inverse .navbar-link:focus { + color: #ffffff; +} +.navbar-inverse .divider-vertical { + border-left-color: #111111; + border-right-color: #222222; +} +.navbar-inverse .nav li.dropdown.open > .dropdown-toggle, +.navbar-inverse .nav li.dropdown.active > .dropdown-toggle, +.navbar-inverse .nav li.dropdown.open.active > .dropdown-toggle { + background-color: #111111; + color: #ffffff; +} +.navbar-inverse .nav li.dropdown > a:hover .caret, +.navbar-inverse .nav li.dropdown > a:focus .caret { + border-top-color: #ffffff; + border-bottom-color: #ffffff; +} +.navbar-inverse .nav li.dropdown > .dropdown-toggle .caret { + border-top-color: #999999; + border-bottom-color: #999999; +} +.navbar-inverse .nav li.dropdown.open > .dropdown-toggle .caret, +.navbar-inverse .nav li.dropdown.active > .dropdown-toggle .caret, +.navbar-inverse .nav li.dropdown.open.active > .dropdown-toggle .caret { + border-top-color: #ffffff; + border-bottom-color: #ffffff; +} +.navbar-inverse .navbar-search .search-query { + color: #ffffff; + background-color: #515151; + border-color: #111111; + -webkit-box-shadow: inset 0 1px 2px rgba(0,0,0,.1), 0 1px 0 rgba(255,255,255,.15); + -moz-box-shadow: inset 0 1px 2px rgba(0,0,0,.1), 0 1px 0 rgba(255,255,255,.15); + box-shadow: inset 0 1px 2px rgba(0,0,0,.1), 0 1px 0 rgba(255,255,255,.15); + -webkit-transition: none; + -moz-transition: none; + -o-transition: none; + transition: none; +} +.navbar-inverse .navbar-search .search-query:-moz-placeholder { + color: #cccccc; +} +.navbar-inverse .navbar-search .search-query:-ms-input-placeholder { + color: #cccccc; +} +.navbar-inverse .navbar-search .search-query::-webkit-input-placeholder { + color: #cccccc; +} +.navbar-inverse .navbar-search .search-query:focus, +.navbar-inverse .navbar-search .search-query.focused { + padding: 5px 15px; + color: #333333; + text-shadow: 0 1px 0 #ffffff; + background-color: #ffffff; + border: 0; + -webkit-box-shadow: 0 0 3px rgba(0, 0, 0, 0.15); + -moz-box-shadow: 0 0 3px rgba(0, 0, 0, 0.15); + box-shadow: 0 0 3px rgba(0, 0, 0, 0.15); + outline: 0; +} +.navbar-inverse .btn-navbar { + color: #ffffff; + text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.25); + background-color: #0e0e0e; + background-image: -moz-linear-gradient(top, #151515, #040404); + background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#151515), to(#040404)); + background-image: -webkit-linear-gradient(top, #151515, #040404); + background-image: -o-linear-gradient(top, #151515, #040404); + background-image: linear-gradient(to bottom, #151515, #040404); + background-repeat: repeat-x; + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff151515', endColorstr='#ff040404', GradientType=0); + border-color: #040404 #040404 #000000; + border-color: rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25); + *background-color: #040404; + /* Darken IE7 buttons by default so they stand out more given they won't have borders */ + + filter: progid:DXImageTransform.Microsoft.gradient(enabled = false); +} +.navbar-inverse .btn-navbar:hover, +.navbar-inverse .btn-navbar:focus, +.navbar-inverse .btn-navbar:active, +.navbar-inverse .btn-navbar.active, +.navbar-inverse .btn-navbar.disabled, +.navbar-inverse .btn-navbar[disabled] { + color: #ffffff; + background-color: #040404; + *background-color: #000000; +} +.navbar-inverse .btn-navbar:active, +.navbar-inverse .btn-navbar.active { + background-color: #000000 \9; +} +.breadcrumb { + padding: 8px 15px; + margin: 0 0 20px; + list-style: none; + background-color: #f5f5f5; + -webkit-border-radius: 4px; + -moz-border-radius: 4px; + border-radius: 4px; +} +.breadcrumb > li { + display: inline-block; + *display: inline; + /* IE7 inline-block hack */ + + *zoom: 1; + text-shadow: 0 1px 0 #ffffff; +} +.breadcrumb > li > .divider { + padding: 0 5px; + color: #ccc; +} +.breadcrumb > .active { + color: #999999; +} +.pagination { + margin: 20px 0; +} +.pagination ul { + display: inline-block; + *display: inline; + /* IE7 inline-block hack */ + + *zoom: 1; + margin-left: 0; + margin-bottom: 0; + -webkit-border-radius: 4px; + -moz-border-radius: 4px; + border-radius: 4px; + -webkit-box-shadow: 0 1px 2px rgba(0, 0, 0, 0.05); + -moz-box-shadow: 0 1px 2px rgba(0, 0, 0, 0.05); + box-shadow: 0 1px 2px rgba(0, 0, 0, 0.05); +} +.pagination ul > li { + display: inline; +} +.pagination ul > li > a, +.pagination ul > li > span { + float: left; + padding: 4px 12px; + line-height: 20px; + text-decoration: none; + background-color: #ffffff; + border: 1px solid #dddddd; + border-left-width: 0; +} +.pagination ul > li > a:hover, +.pagination ul > li > a:focus, +.pagination ul > .active > a, +.pagination ul > .active > span { + background-color: #f5f5f5; +} +.pagination ul > .active > a, +.pagination ul > .active > span { + color: #999999; + cursor: default; +} +.pagination ul > .disabled > span, +.pagination ul > .disabled > a, +.pagination ul > .disabled > a:hover, +.pagination ul > .disabled > a:focus { + color: #999999; + background-color: transparent; + cursor: default; +} +.pagination ul > li:first-child > a, +.pagination ul > li:first-child > span { + border-left-width: 1px; + -webkit-border-top-left-radius: 4px; + -moz-border-radius-topleft: 4px; + border-top-left-radius: 4px; + -webkit-border-bottom-left-radius: 4px; + -moz-border-radius-bottomleft: 4px; + border-bottom-left-radius: 4px; +} +.pagination ul > li:last-child > a, +.pagination ul > li:last-child > span { + -webkit-border-top-right-radius: 4px; + -moz-border-radius-topright: 4px; + border-top-right-radius: 4px; + -webkit-border-bottom-right-radius: 4px; + -moz-border-radius-bottomright: 4px; + border-bottom-right-radius: 4px; +} +.pagination-centered { + text-align: center; +} +.pagination-right { + text-align: right; +} +.pagination-large ul > li > a, +.pagination-large ul > li > span { + padding: 11px 19px; + font-size: 17.5px; +} +.pagination-large ul > li:first-child > a, +.pagination-large ul > li:first-child > span { + -webkit-border-top-left-radius: 6px; + -moz-border-radius-topleft: 6px; + border-top-left-radius: 6px; + -webkit-border-bottom-left-radius: 6px; + -moz-border-radius-bottomleft: 6px; + border-bottom-left-radius: 6px; +} +.pagination-large ul > li:last-child > a, +.pagination-large ul > li:last-child > span { + -webkit-border-top-right-radius: 6px; + -moz-border-radius-topright: 6px; + border-top-right-radius: 6px; + -webkit-border-bottom-right-radius: 6px; + -moz-border-radius-bottomright: 6px; + border-bottom-right-radius: 6px; +} +.pagination-mini ul > li:first-child > a, +.pagination-small ul > li:first-child > a, +.pagination-mini ul > li:first-child > span, +.pagination-small ul > li:first-child > span { + -webkit-border-top-left-radius: 3px; + -moz-border-radius-topleft: 3px; + border-top-left-radius: 3px; + -webkit-border-bottom-left-radius: 3px; + -moz-border-radius-bottomleft: 3px; + border-bottom-left-radius: 3px; +} +.pagination-mini ul > li:last-child > a, +.pagination-small ul > li:last-child > a, +.pagination-mini ul > li:last-child > span, +.pagination-small ul > li:last-child > span { + -webkit-border-top-right-radius: 3px; + -moz-border-radius-topright: 3px; + border-top-right-radius: 3px; + -webkit-border-bottom-right-radius: 3px; + -moz-border-radius-bottomright: 3px; + border-bottom-right-radius: 3px; +} +.pagination-small ul > li > a, +.pagination-small ul > li > span { + padding: 2px 10px; + font-size: 11.9px; +} +.pagination-mini ul > li > a, +.pagination-mini ul > li > span { + padding: 0 6px; + font-size: 10.5px; +} +.pager { + margin: 20px 0; + list-style: none; + text-align: center; + *zoom: 1; +} +.pager:before, +.pager:after { + display: table; + content: ""; + line-height: 0; +} +.pager:after { + clear: both; +} +.pager li { + display: inline; +} +.pager li > a, +.pager li > span { + display: inline-block; + padding: 5px 14px; + background-color: #fff; + border: 1px solid #ddd; + -webkit-border-radius: 15px; + -moz-border-radius: 15px; + border-radius: 15px; +} +.pager li > a:hover, +.pager li > a:focus { + text-decoration: none; + background-color: #f5f5f5; +} +.pager .next > a, +.pager .next > span { + float: right; +} +.pager .previous > a, +.pager .previous > span { + float: left; +} +.pager .disabled > a, +.pager .disabled > a:hover, +.pager .disabled > a:focus, +.pager .disabled > span { + color: #999999; + background-color: #fff; + cursor: default; +} +.modal-backdrop { + position: fixed; + top: 0; + right: 0; + bottom: 0; + left: 0; + z-index: 1040; + background-color: #000000; +} +.modal-backdrop.fade { + opacity: 0; +} +.modal-backdrop, +.modal-backdrop.fade.in { + opacity: 0.8; + filter: alpha(opacity=80); +} +.modal { + position: fixed; + top: 10%; + left: 50%; + z-index: 1050; + width: 560px; + margin-left: -280px; + background-color: #ffffff; + border: 1px solid #999; + border: 1px solid rgba(0, 0, 0, 0.3); + *border: 1px solid #999; + /* IE6-7 */ + + -webkit-border-radius: 6px; + -moz-border-radius: 6px; + border-radius: 6px; + -webkit-box-shadow: 0 3px 7px rgba(0, 0, 0, 0.3); + -moz-box-shadow: 0 3px 7px rgba(0, 0, 0, 0.3); + box-shadow: 0 3px 7px rgba(0, 0, 0, 0.3); + -webkit-background-clip: padding-box; + -moz-background-clip: padding-box; + background-clip: padding-box; + outline: none; +} +.modal.fade { + -webkit-transition: opacity .3s linear, top .3s ease-out; + -moz-transition: opacity .3s linear, top .3s ease-out; + -o-transition: opacity .3s linear, top .3s ease-out; + transition: opacity .3s linear, top .3s ease-out; + top: -25%; +} +.modal.fade.in { + top: 10%; +} +.modal-header { + padding: 9px 15px; + border-bottom: 1px solid #eee; +} +.modal-header .close { + margin-top: 2px; +} +.modal-header h3 { + margin: 0; + line-height: 30px; +} +.modal-body { + position: relative; + overflow-y: auto; + max-height: 400px; + padding: 15px; +} +.modal-form { + margin-bottom: 0; +} +.modal-footer { + padding: 14px 15px 15px; + margin-bottom: 0; + text-align: right; + background-color: #f5f5f5; + border-top: 1px solid #ddd; + -webkit-border-radius: 0 0 6px 6px; + -moz-border-radius: 0 0 6px 6px; + border-radius: 0 0 6px 6px; + -webkit-box-shadow: inset 0 1px 0 #ffffff; + -moz-box-shadow: inset 0 1px 0 #ffffff; + box-shadow: inset 0 1px 0 #ffffff; + *zoom: 1; +} +.modal-footer:before, +.modal-footer:after { + display: table; + content: ""; + line-height: 0; +} +.modal-footer:after { + clear: both; +} +.modal-footer .btn + .btn { + margin-left: 5px; + margin-bottom: 0; +} +.modal-footer .btn-group .btn + .btn { + margin-left: -1px; +} +.modal-footer .btn-block + .btn-block { + margin-left: 0; +} +.tooltip { + position: absolute; + z-index: 1030; + display: block; + visibility: visible; + font-size: 11px; + line-height: 1.4; + opacity: 0; + filter: alpha(opacity=0); +} +.tooltip.in { + opacity: 0.8; + filter: alpha(opacity=80); +} +.tooltip.top { + margin-top: -3px; + padding: 5px 0; +} +.tooltip.right { + margin-left: 3px; + padding: 0 5px; +} +.tooltip.bottom { + margin-top: 3px; + padding: 5px 0; +} +.tooltip.left { + margin-left: -3px; + padding: 0 5px; +} +.tooltip-inner { + max-width: 200px; + padding: 8px; + color: #ffffff; + text-align: center; + text-decoration: none; + background-color: #000000; + -webkit-border-radius: 4px; + -moz-border-radius: 4px; + border-radius: 4px; +} +.tooltip-arrow { + position: absolute; + width: 0; + height: 0; + border-color: transparent; + border-style: solid; +} +.tooltip.top .tooltip-arrow { + bottom: 0; + left: 50%; + margin-left: -5px; + border-width: 5px 5px 0; + border-top-color: #000000; +} +.tooltip.right .tooltip-arrow { + top: 50%; + left: 0; + margin-top: -5px; + border-width: 5px 5px 5px 0; + border-right-color: #000000; +} +.tooltip.left .tooltip-arrow { + top: 50%; + right: 0; + margin-top: -5px; + border-width: 5px 0 5px 5px; + border-left-color: #000000; +} +.tooltip.bottom .tooltip-arrow { + top: 0; + left: 50%; + margin-left: -5px; + border-width: 0 5px 5px; + border-bottom-color: #000000; +} +.popover { + position: absolute; + top: 0; + left: 0; + z-index: 1010; + display: none; + max-width: 276px; + padding: 1px; + text-align: left; + background-color: #ffffff; + -webkit-background-clip: padding-box; + -moz-background-clip: padding; + background-clip: padding-box; + border: 1px solid #ccc; + border: 1px solid rgba(0, 0, 0, 0.2); + -webkit-border-radius: 6px; + -moz-border-radius: 6px; + border-radius: 6px; + -webkit-box-shadow: 0 5px 10px rgba(0, 0, 0, 0.2); + -moz-box-shadow: 0 5px 10px rgba(0, 0, 0, 0.2); + box-shadow: 0 5px 10px rgba(0, 0, 0, 0.2); + white-space: normal; +} +.popover.top { + margin-top: -10px; +} +.popover.right { + margin-left: 10px; +} +.popover.bottom { + margin-top: 10px; +} +.popover.left { + margin-left: -10px; +} +.popover-title { + margin: 0; + padding: 8px 14px; + font-size: 14px; + font-weight: normal; + line-height: 18px; + background-color: #f7f7f7; + border-bottom: 1px solid #ebebeb; + -webkit-border-radius: 5px 5px 0 0; + -moz-border-radius: 5px 5px 0 0; + border-radius: 5px 5px 0 0; +} +.popover-title:empty { + display: none; +} +.popover-content { + padding: 9px 14px; +} +.popover .arrow, +.popover .arrow:after { + position: absolute; + display: block; + width: 0; + height: 0; + border-color: transparent; + border-style: solid; +} +.popover .arrow { + border-width: 11px; +} +.popover .arrow:after { + border-width: 10px; + content: ""; +} +.popover.top .arrow { + left: 50%; + margin-left: -11px; + border-bottom-width: 0; + border-top-color: #999; + border-top-color: rgba(0, 0, 0, 0.25); + bottom: -11px; +} +.popover.top .arrow:after { + bottom: 1px; + margin-left: -10px; + border-bottom-width: 0; + border-top-color: #ffffff; +} +.popover.right .arrow { + top: 50%; + left: -11px; + margin-top: -11px; + border-left-width: 0; + border-right-color: #999; + border-right-color: rgba(0, 0, 0, 0.25); +} +.popover.right .arrow:after { + left: 1px; + bottom: -10px; + border-left-width: 0; + border-right-color: #ffffff; +} +.popover.bottom .arrow { + left: 50%; + margin-left: -11px; + border-top-width: 0; + border-bottom-color: #999; + border-bottom-color: rgba(0, 0, 0, 0.25); + top: -11px; +} +.popover.bottom .arrow:after { + top: 1px; + margin-left: -10px; + border-top-width: 0; + border-bottom-color: #ffffff; +} +.popover.left .arrow { + top: 50%; + right: -11px; + margin-top: -11px; + border-right-width: 0; + border-left-color: #999; + border-left-color: rgba(0, 0, 0, 0.25); +} +.popover.left .arrow:after { + right: 1px; + border-right-width: 0; + border-left-color: #ffffff; + bottom: -10px; +} +.thumbnails { + margin-left: -20px; + list-style: none; + *zoom: 1; +} +.thumbnails:before, +.thumbnails:after { + display: table; + content: ""; + line-height: 0; +} +.thumbnails:after { + clear: both; +} +.row-fluid .thumbnails { + margin-left: 0; +} +.thumbnails > li { + float: left; + margin-bottom: 20px; + margin-left: 20px; +} +.thumbnail { + display: block; + padding: 4px; + line-height: 20px; + border: 1px solid #ddd; + -webkit-border-radius: 4px; + -moz-border-radius: 4px; + border-radius: 4px; + -webkit-box-shadow: 0 1px 3px rgba(0, 0, 0, 0.055); + -moz-box-shadow: 0 1px 3px rgba(0, 0, 0, 0.055); + box-shadow: 0 1px 3px rgba(0, 0, 0, 0.055); + -webkit-transition: all 0.2s ease-in-out; + -moz-transition: all 0.2s ease-in-out; + -o-transition: all 0.2s ease-in-out; + transition: all 0.2s ease-in-out; +} +a.thumbnail:hover, +a.thumbnail:focus { + border-color: #0088cc; + -webkit-box-shadow: 0 1px 4px rgba(0, 105, 214, 0.25); + -moz-box-shadow: 0 1px 4px rgba(0, 105, 214, 0.25); + box-shadow: 0 1px 4px rgba(0, 105, 214, 0.25); +} +.thumbnail > img { + display: block; + max-width: 100%; + margin-left: auto; + margin-right: auto; +} +.thumbnail .caption { + padding: 9px; + color: #555555; +} +.media, +.media-body { + overflow: hidden; + *overflow: visible; + zoom: 1; +} +.media, +.media .media { + margin-top: 15px; +} +.media:first-child { + margin-top: 0; +} +.media-object { + display: block; +} +.media-heading { + margin: 0 0 5px; +} +.media > .pull-left { + margin-right: 10px; +} +.media > .pull-right { + margin-left: 10px; +} +.media-list { + margin-left: 0; + list-style: none; +} +.label, +.badge { + display: inline-block; + padding: 2px 4px; + font-size: 11.844px; + font-weight: bold; + line-height: 14px; + color: #ffffff; + vertical-align: baseline; + white-space: nowrap; + text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.25); + background-color: #999999; +} +.label { + -webkit-border-radius: 3px; + -moz-border-radius: 3px; + border-radius: 3px; +} +.badge { + padding-left: 9px; + padding-right: 9px; + -webkit-border-radius: 9px; + -moz-border-radius: 9px; + border-radius: 9px; +} +.label:empty, +.badge:empty { + display: none; +} +a.label:hover, +a.label:focus, +a.badge:hover, +a.badge:focus { + color: #ffffff; + text-decoration: none; + cursor: pointer; +} +.label-important, +.badge-important { + background-color: #b94a48; +} +.label-important[href], +.badge-important[href] { + background-color: #953b39; +} +.label-warning, +.badge-warning { + background-color: #f89406; +} +.label-warning[href], +.badge-warning[href] { + background-color: #c67605; +} +.label-success, +.badge-success { + background-color: #468847; +} +.label-success[href], +.badge-success[href] { + background-color: #356635; +} +.label-info, +.badge-info { + background-color: #3a87ad; +} +.label-info[href], +.badge-info[href] { + background-color: #2d6987; +} +.label-inverse, +.badge-inverse { + background-color: #333333; +} +.label-inverse[href], +.badge-inverse[href] { + background-color: #1a1a1a; +} +.btn .label, +.btn .badge { + position: relative; + top: -1px; +} +.btn-mini .label, +.btn-mini .badge { + top: 0; +} +@-webkit-keyframes progress-bar-stripes { + from { + background-position: 40px 0; + } + to { + background-position: 0 0; + } +} +@-moz-keyframes progress-bar-stripes { + from { + background-position: 40px 0; + } + to { + background-position: 0 0; + } +} +@-ms-keyframes progress-bar-stripes { + from { + background-position: 40px 0; + } + to { + background-position: 0 0; + } +} +@-o-keyframes progress-bar-stripes { + from { + background-position: 0 0; + } + to { + background-position: 40px 0; + } +} +@keyframes progress-bar-stripes { + from { + background-position: 40px 0; + } + to { + background-position: 0 0; + } +} +.progress { + overflow: hidden; + height: 20px; + margin-bottom: 20px; + background-color: #f7f7f7; + background-image: -moz-linear-gradient(top, #f5f5f5, #f9f9f9); + background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#f5f5f5), to(#f9f9f9)); + background-image: -webkit-linear-gradient(top, #f5f5f5, #f9f9f9); + background-image: -o-linear-gradient(top, #f5f5f5, #f9f9f9); + background-image: linear-gradient(to bottom, #f5f5f5, #f9f9f9); + background-repeat: repeat-x; + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff5f5f5', endColorstr='#fff9f9f9', GradientType=0); + -webkit-box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.1); + -moz-box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.1); + box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.1); + -webkit-border-radius: 4px; + -moz-border-radius: 4px; + border-radius: 4px; +} +.progress .bar { + width: 0%; + height: 100%; + color: #ffffff; + float: left; + font-size: 12px; + text-align: center; + text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.25); + background-color: #0e90d2; + background-image: -moz-linear-gradient(top, #149bdf, #0480be); + background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#149bdf), to(#0480be)); + background-image: -webkit-linear-gradient(top, #149bdf, #0480be); + background-image: -o-linear-gradient(top, #149bdf, #0480be); + background-image: linear-gradient(to bottom, #149bdf, #0480be); + background-repeat: repeat-x; + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff149bdf', endColorstr='#ff0480be', GradientType=0); + -webkit-box-shadow: inset 0 -1px 0 rgba(0, 0, 0, 0.15); + -moz-box-shadow: inset 0 -1px 0 rgba(0, 0, 0, 0.15); + box-shadow: inset 0 -1px 0 rgba(0, 0, 0, 0.15); + -webkit-box-sizing: border-box; + -moz-box-sizing: border-box; + box-sizing: border-box; + -webkit-transition: width 0.6s ease; + -moz-transition: width 0.6s ease; + -o-transition: width 0.6s ease; + transition: width 0.6s ease; +} +.progress .bar + .bar { + -webkit-box-shadow: inset 1px 0 0 rgba(0,0,0,.15), inset 0 -1px 0 rgba(0,0,0,.15); + -moz-box-shadow: inset 1px 0 0 rgba(0,0,0,.15), inset 0 -1px 0 rgba(0,0,0,.15); + box-shadow: inset 1px 0 0 rgba(0,0,0,.15), inset 0 -1px 0 rgba(0,0,0,.15); +} +.progress-striped .bar { + background-color: #149bdf; + background-image: -webkit-gradient(linear, 0 100%, 100% 0, color-stop(0.25, rgba(255, 255, 255, 0.15)), color-stop(0.25, transparent), color-stop(0.5, transparent), color-stop(0.5, rgba(255, 255, 255, 0.15)), color-stop(0.75, rgba(255, 255, 255, 0.15)), color-stop(0.75, transparent), to(transparent)); + background-image: -webkit-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); + background-image: -moz-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); + background-image: -o-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); + background-image: linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); + -webkit-background-size: 40px 40px; + -moz-background-size: 40px 40px; + -o-background-size: 40px 40px; + background-size: 40px 40px; +} +.progress.active .bar { + -webkit-animation: progress-bar-stripes 2s linear infinite; + -moz-animation: progress-bar-stripes 2s linear infinite; + -ms-animation: progress-bar-stripes 2s linear infinite; + -o-animation: progress-bar-stripes 2s linear infinite; + animation: progress-bar-stripes 2s linear infinite; +} +.progress-danger .bar, +.progress .bar-danger { + background-color: #dd514c; + background-image: -moz-linear-gradient(top, #ee5f5b, #c43c35); + background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#ee5f5b), to(#c43c35)); + background-image: -webkit-linear-gradient(top, #ee5f5b, #c43c35); + background-image: -o-linear-gradient(top, #ee5f5b, #c43c35); + background-image: linear-gradient(to bottom, #ee5f5b, #c43c35); + background-repeat: repeat-x; + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffee5f5b', endColorstr='#ffc43c35', GradientType=0); +} +.progress-danger.progress-striped .bar, +.progress-striped .bar-danger { + background-color: #ee5f5b; + background-image: -webkit-gradient(linear, 0 100%, 100% 0, color-stop(0.25, rgba(255, 255, 255, 0.15)), color-stop(0.25, transparent), color-stop(0.5, transparent), color-stop(0.5, rgba(255, 255, 255, 0.15)), color-stop(0.75, rgba(255, 255, 255, 0.15)), color-stop(0.75, transparent), to(transparent)); + background-image: -webkit-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); + background-image: -moz-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); + background-image: -o-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); + background-image: linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); +} +.progress-success .bar, +.progress .bar-success { + background-color: #5eb95e; + background-image: -moz-linear-gradient(top, #62c462, #57a957); + background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#62c462), to(#57a957)); + background-image: -webkit-linear-gradient(top, #62c462, #57a957); + background-image: -o-linear-gradient(top, #62c462, #57a957); + background-image: linear-gradient(to bottom, #62c462, #57a957); + background-repeat: repeat-x; + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff62c462', endColorstr='#ff57a957', GradientType=0); +} +.progress-success.progress-striped .bar, +.progress-striped .bar-success { + background-color: #62c462; + background-image: -webkit-gradient(linear, 0 100%, 100% 0, color-stop(0.25, rgba(255, 255, 255, 0.15)), color-stop(0.25, transparent), color-stop(0.5, transparent), color-stop(0.5, rgba(255, 255, 255, 0.15)), color-stop(0.75, rgba(255, 255, 255, 0.15)), color-stop(0.75, transparent), to(transparent)); + background-image: -webkit-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); + background-image: -moz-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); + background-image: -o-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); + background-image: linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); +} +.progress-info .bar, +.progress .bar-info { + background-color: #4bb1cf; + background-image: -moz-linear-gradient(top, #5bc0de, #339bb9); + background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#5bc0de), to(#339bb9)); + background-image: -webkit-linear-gradient(top, #5bc0de, #339bb9); + background-image: -o-linear-gradient(top, #5bc0de, #339bb9); + background-image: linear-gradient(to bottom, #5bc0de, #339bb9); + background-repeat: repeat-x; + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff5bc0de', endColorstr='#ff339bb9', GradientType=0); +} +.progress-info.progress-striped .bar, +.progress-striped .bar-info { + background-color: #5bc0de; + background-image: -webkit-gradient(linear, 0 100%, 100% 0, color-stop(0.25, rgba(255, 255, 255, 0.15)), color-stop(0.25, transparent), color-stop(0.5, transparent), color-stop(0.5, rgba(255, 255, 255, 0.15)), color-stop(0.75, rgba(255, 255, 255, 0.15)), color-stop(0.75, transparent), to(transparent)); + background-image: -webkit-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); + background-image: -moz-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); + background-image: -o-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); + background-image: linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); +} +.progress-warning .bar, +.progress .bar-warning { + background-color: #faa732; + background-image: -moz-linear-gradient(top, #fbb450, #f89406); + background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#fbb450), to(#f89406)); + background-image: -webkit-linear-gradient(top, #fbb450, #f89406); + background-image: -o-linear-gradient(top, #fbb450, #f89406); + background-image: linear-gradient(to bottom, #fbb450, #f89406); + background-repeat: repeat-x; + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fffbb450', endColorstr='#fff89406', GradientType=0); +} +.progress-warning.progress-striped .bar, +.progress-striped .bar-warning { + background-color: #fbb450; + background-image: -webkit-gradient(linear, 0 100%, 100% 0, color-stop(0.25, rgba(255, 255, 255, 0.15)), color-stop(0.25, transparent), color-stop(0.5, transparent), color-stop(0.5, rgba(255, 255, 255, 0.15)), color-stop(0.75, rgba(255, 255, 255, 0.15)), color-stop(0.75, transparent), to(transparent)); + background-image: -webkit-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); + background-image: -moz-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); + background-image: -o-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); + background-image: linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); +} +.accordion { + margin-bottom: 20px; +} +.accordion-group { + margin-bottom: 2px; + border: 1px solid #e5e5e5; + -webkit-border-radius: 4px; + -moz-border-radius: 4px; + border-radius: 4px; +} +.accordion-heading { + border-bottom: 0; +} +.accordion-heading .accordion-toggle { + display: block; + padding: 8px 15px; +} +.accordion-toggle { + cursor: pointer; +} +.accordion-inner { + padding: 9px 15px; + border-top: 1px solid #e5e5e5; +} +.carousel { + position: relative; + margin-bottom: 20px; + line-height: 1; +} +.carousel-inner { + overflow: hidden; + width: 100%; + position: relative; +} +.carousel-inner > .item { + display: none; + position: relative; + -webkit-transition: 0.6s ease-in-out left; + -moz-transition: 0.6s ease-in-out left; + -o-transition: 0.6s ease-in-out left; + transition: 0.6s ease-in-out left; +} +.carousel-inner > .item > img, +.carousel-inner > .item > a > img { + display: block; + line-height: 1; +} +.carousel-inner > .active, +.carousel-inner > .next, +.carousel-inner > .prev { + display: block; +} +.carousel-inner > .active { + left: 0; +} +.carousel-inner > .next, +.carousel-inner > .prev { + position: absolute; + top: 0; + width: 100%; +} +.carousel-inner > .next { + left: 100%; +} +.carousel-inner > .prev { + left: -100%; +} +.carousel-inner > .next.left, +.carousel-inner > .prev.right { + left: 0; +} +.carousel-inner > .active.left { + left: -100%; +} +.carousel-inner > .active.right { + left: 100%; +} +.carousel-control { + position: absolute; + top: 40%; + left: 15px; + width: 40px; + height: 40px; + margin-top: -20px; + font-size: 60px; + font-weight: 100; + line-height: 30px; + color: #ffffff; + text-align: center; + background: #222222; + border: 3px solid #ffffff; + -webkit-border-radius: 23px; + -moz-border-radius: 23px; + border-radius: 23px; + opacity: 0.5; + filter: alpha(opacity=50); +} +.carousel-control.right { + left: auto; + right: 15px; +} +.carousel-control:hover, +.carousel-control:focus { + color: #ffffff; + text-decoration: none; + opacity: 0.9; + filter: alpha(opacity=90); +} +.carousel-indicators { + position: absolute; + top: 15px; + right: 15px; + z-index: 5; + margin: 0; + list-style: none; +} +.carousel-indicators li { + display: block; + float: left; + width: 10px; + height: 10px; + margin-left: 5px; + text-indent: -999px; + background-color: #ccc; + background-color: rgba(255, 255, 255, 0.25); + border-radius: 5px; +} +.carousel-indicators .active { + background-color: #fff; +} +.carousel-caption { + position: absolute; + left: 0; + right: 0; + bottom: 0; + padding: 15px; + background: #333333; + background: rgba(0, 0, 0, 0.75); +} +.carousel-caption h4, +.carousel-caption p { + color: #ffffff; + line-height: 20px; +} +.carousel-caption h4 { + margin: 0 0 5px; +} +.carousel-caption p { + margin-bottom: 0; +} +.hero-unit { + padding: 60px; + margin-bottom: 30px; + font-size: 18px; + font-weight: 200; + line-height: 30px; + color: inherit; + background-color: #eeeeee; + -webkit-border-radius: 6px; + -moz-border-radius: 6px; + border-radius: 6px; +} +.hero-unit h1 { + margin-bottom: 0; + font-size: 60px; + line-height: 1; + color: inherit; + letter-spacing: -1px; +} +.hero-unit li { + line-height: 30px; +} +.pull-right { + float: right; +} +.pull-left { + float: left; +} +.hide { + display: none; +} +.show { + display: block; +} +.invisible { + visibility: hidden; +} +.affix { + position: fixed; +} +.pull-right { + float: right; +} +.pull-left { + float: left; +} +.hide { + display: none; +} +.show { + display: block; +} +.invisible { + visibility: hidden; +} +.affix { + position: fixed; +} diff --git a/synthetic_tree_viewer/synthetic_tree_viewer/static/css/calendar.css b/synthetic_tree_viewer/synthetic_tree_viewer/static/css/calendar.css new file mode 100644 index 000000000..660fe034f --- /dev/null +++ b/synthetic_tree_viewer/synthetic_tree_viewer/static/css/calendar.css @@ -0,0 +1,7 @@ +.calendar{z-index:99;position:relative;display:none;background:#fff;border:2px solid #000;font-size:11px;color:#000;cursor:default;font-family:Arial,Helvetica,sans-serif; +border-radius: 10px; + -moz-border-radius: 10px; + -webkit-border-radius: 10px; +}.calendar table{margin:0px;font-size:11px;color:#000;cursor:default;font-family:tahoma,verdana,sans-serif;}.calendar .button{text-align:center;padding:1px;color:#fff;background:#000;}.calendar .nav{background:#000;color:#fff}.calendar thead .title{font-weight:bold;padding:1px;background:#000;color:#fff;text-align:center;}.calendar thead .name{padding:2px;text-align:center;background:#bbb;}.calendar thead .weekend{color:#f00;}.calendar thead .hilite {background-color:#666;}.calendar thead .active{padding:2px 0 0 2px;background-color:#c4c0b8;}.calendar tbody .day{width:2em;text-align:right;padding:2px 4px 2px 2px;}.calendar tbody .day.othermonth{color:#aaa;}.calendar tbody .day.othermonth.oweekend{color:#faa;}.calendar table .wn{padding:2px 3px 2px 2px;background:#bbb;}.calendar tbody .rowhilite td{background:#ddd;}.calendar tbody td.hilite{background:#bbb;}.calendar tbody td.active{background:#bbb;}.calendar tbody td.selected{font-weight:bold;background:#ddd;}.calendar tbody td.weekend{color:#f00;}.calendar tbody td.today{font-weight:bold;color:#00f;}.calendar tbody .disabled{color:#999;}.calendar tbody .emptycell{visibility:hidden;}.calendar tbody .emptyrow{display:none;}.calendar tfoot .ttip{background:#bbb;padding:1px;background:#000;color:#fff;text-align:center;}.calendar tfoot .hilite{background:#ddd;}.calendar tfoot .active{}.calendar .combo{position:absolute;display:none;width:4em;top:0;left:0;cursor:default;background:#e4e0d8;padding:1px;z-index:100;}.calendar .combo .label,.calendar .combo .label-IEfix{text-align:center;padding:1px;}.calendar .combo .label-IEfix{width:4em;}.calendar .combo .active{background:#c4c0b8;}.calendar .combo .hilite{background:#048;color:#fea;}.calendar td.time{padding:1px 0;text-align:center;background-color:#bbb;}.calendar td.time .hour,.calendar td.time .minute,.calendar td.time .ampm{padding:0 3px 0 4px;font-weight:bold;}.calendar td.time .ampm{text-align:center;}.calendar td.time .colon{padding:0 2px 0 3px;font-weight:bold;}.calendar td.time span.hilite{}.calendar td.time span.active{border-color:#f00;background-color:#000;color:#0f0;}.hour,.minute{font-size:2em;} + +#CP_hourcont{z-index:99;padding:0;position:absolute;border:1px dashed #666;background-color:#eee;display:none;}#CP_minutecont{z-index:99;background-color:#ddd;padding:1px;position:absolute;width:45px;display:none;}.floatleft{float:left;}.CP_hour{z-index:99;padding:1px;font-family:Arial,Helvetica,sans-serif;font-size:9px;white-space:nowrap;cursor:pointer;width:35px;}.CP_minute{z-index:99;padding:1px;font-family:Arial,Helvetica,sans-serif;font-size:9px;white-space:nowrap;cursor:pointer;width:auto;}.CP_over{background-color:#fff;z-index:99} diff --git a/synthetic_tree_viewer/synthetic_tree_viewer/static/css/jquery.splitter.css b/synthetic_tree_viewer/synthetic_tree_viewer/static/css/jquery.splitter.css new file mode 100644 index 000000000..dc336482a --- /dev/null +++ b/synthetic_tree_viewer/synthetic_tree_viewer/static/css/jquery.splitter.css @@ -0,0 +1,47 @@ +/*! + * StyleSheet for JQuery Spliter Plugin + * Copyright (C) 2010 Jakub Jankiewicz + * + * Same license as plugin + */ +.spliter_panel { + position: relative; +} +.spliter_panel .vspliter { + background-color: grey; + cursor: col-resize; + z-index:900; + width: 4px; + position: absolute !important; +} + +.spliter_panel .hspliter { + background-color: #5F5F5F; + cursor: row-resize; + z-index: 800; + height: 4px; + position: absolute !important; +} +.spliter_panel .vspliter, .spliter_panel .left_panel, .spliter_panel .right_panel, +.spliter_panel .hspliter, .spliter_panel .top_panel, .spliter_panel .bottom_panel { + position: relative; + overflow: auto; +} +.spliter_panel .vspliter, .spliter_panel .left_panel, .spliter_panel .right_panel { + height: 100%; +} +.spliter_panel .hspliter, .spliter_panel .top_panel, .spliter_panel .bottom_panel { + width: 100%; +} +.spliter_panel .top_panel, .spliter_panel .left_panel, .spliter_panel .vspliter { + top: 0; +} +.spliter_panel .top_panel, .spliter_panel .bottom_panel, .spliter_panel .left_panel, .spliter_panel .hspliter { + left: 0; +} +.spliter_panel .bottom_panel { + bottom: 0; +} +.spliter_panel .right_panel { + right: 0; +} diff --git a/synthetic_tree_viewer/synthetic_tree_viewer/static/css/web2py.css b/synthetic_tree_viewer/synthetic_tree_viewer/static/css/web2py.css new file mode 100644 index 000000000..7bcc151dd --- /dev/null +++ b/synthetic_tree_viewer/synthetic_tree_viewer/static/css/web2py.css @@ -0,0 +1,314 @@ +/** these MUST stay **/ +a {text-decoration:none; white-space:nowrap} +a:hover {text-decoration:underline} +a.button {text-decoration:none} +h1,h2,h3,h4,h5,h6 {margin:0.5em 0 0.25em 0; display:block; + font-family:Helvetica} +h1 {font-size:4.00em} +h2 {font-size:3.00em} +h3 {font-size:2.00em} +h4 {font-size:1.50em} +h5 {font-size:1.25em} +h6 {font-size:1.12em} +th,label {font-weight:bold; white-space:nowrap;} +td,th {text-align:left; padding:2px 5px 2px 5px} +th {vertical-align:middle; border-right:1px solid white} +td {vertical-align:top} +form table tr td label {text-align:left} +p,table,ol,ul {padding:0; margin: 0.75em 0} +p {text-align:justify} +ol, ul {list-style-position:outside; margin-left:2em} +li {margin-bottom:0.5em} +span,input,select,textarea,button,label,a {display:inline} +img {border:0} +blockquote,blockquote p,p blockquote { + font-style:italic; margin:0.5em 30px 0.5em 30px; font-size:0.9em} +i,em {font-style:italic} +strong {font-weight:bold} +small {font-size:0.8em} +code {font-family:Courier} +textarea {width:100%} +video {width:400px} +audio {width:200px} +input[type=text],input[type=password],select{width:300px; margin-right:5px} +.hidden {display:none;visibility:visible} +.right {float:right; text-align:right} +.left {float:left; text-align:left} +.center {width:100; text-align:center; vertical-align:middle} +/** end **/ + +/* Sticky footer begin */ + +.main { + padding:20px 0 50px 0; +} + +.footer,.push { + height:6em; + padding:1em 0; + clear:both; +} + +.footer-content {position:relative; bottom:-4em; width:100%} + +.auth_navbar { + white-space:nowrap; +} + +/* Sticky footer end */ + +.footer { + border-top:1px #DEDEDE solid; +} +.header { + /* background:; */ +} + + +fieldset {padding:16px; border-top:1px #DEDEDE solid} +fieldset legend {text-transform:uppercase; font-weight:bold; padding:4px 16px 4px 16px; background:#f1f1f1} + +/* fix ie problem with menu */ + +td.w2p_fw {padding-bottom:1px} +td.w2p_fl,td.w2p_fw,td.w2p_fc {vertical-align:top} +td.w2p_fl {text-align:left} +td.w2p_fl, td.w2p_fw {padding-right:7px} +td.w2p_fl,td.w2p_fc {padding-top:4px} +div.w2p_export_menu {margin:5px 0} +div.w2p_export_menu a, div.w2p_wiki_tags a, div.w2p_cloud a {margin-left:5px; padding:2px 5px; background-color:#f1f1f1; border-radius:5px; -moz-border-radius:5px; -webkit-border-radius:5px;} + +/* tr#submit_record__row {border-top:1px solid #E5E5E5} */ +#submit_record__row td {padding-top:.5em} + +/* Fix */ +#auth_user_remember__row label {display:inline} +#web2py_user_form td {vertical-align:top} + +/*********** web2py specific ***********/ +div.flash { + font-weight:bold; + display:none; + position:fixed; + padding:10px; + top:48px; + right:50px; + min-width:280px; + opacity:0.95; + margin:0px 0px 10px 10px; + vertical-align:middle; + cursor:pointer; + color:#fff; + background-color:#000; + border:2px solid #fff; + border-radius:8px; + -o-border-radius: 8px; + -moz-border-radius:8px; + -webkit-border-radius:8px; + background-image: -webkit-linear-gradient(top,#222,#000); + background-image: -o-linear-gradient(top,#222,#000); + background-image: -moz-linear-gradient(90deg, #222, #000); + background-image: linear-gradient(top,#222,#000); + background-repeat: repeat-x; + font-family: "Helvetica Neue", Helvetica, Arial, sans-serif; + -webkit-font-smoothing: antialiased; + z-index:2000; +} + +div.flash #closeflash{color:inherit; float:right; margin-left:15px;} +.ie-lte7 div.flash #closeflash +{color:expression(this.parentNode.currentStyle['color']);float:none;position:absolute;right:4px;} + +div.flash:hover { opacity:0.25; } + +div.error_wrapper {display:block} +div.error { + width: 298px; + background:red; + border: 2px solid #d00; + color:white; + padding:5px; + display:inline-block; + background-image: -webkit-linear-gradient(left,#f00,#fdd); + background-image: -o-linear-gradient(left,#f00,#fdd); + background-image: -moz-linear-gradient(0deg, #f00, #fdd); + background-image: linear-gradient(left,#f00,#fdd); + background-repeat: repeat-y; +} + +.topbar { + padding:10px 0; + width:100%; + color:#959595; + vertical-align:middle; + padding:auto; + background-image:-khtml-gradient(linear,left top,left bottom,from(#333333),to(#222222)); + background-image:-moz-linear-gradient(top,#333333,#222222); + background-image:-ms-linear-gradient(top,#333333,#222222); + background-image:-webkit-gradient(linear,left top,left bottom,color-stop(0%,#333333),color-stop(100%,#222222)); + background-image:-webkit-linear-gradient(top,#333333,#222222); + background-image:-o-linear-gradient(top,#333333,#222222); + background-image:linear-gradient(top,#333333,#222222); + filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#333333',endColorstr='#222222',GradientType=0); + -webkit-box-shadow:0 1px 3px rgba(0,0,0,0.25),inset 0 -1px 0 rgba(0,0,0,0.1); + -moz-box-shadow:0 1px 3px rgba(0,0,0,0.25),inset 0 -1px 0 rgba(0,0,0,0.1); + box-shadow:0 1px 3px rgba(0,0,0,0.25),inset 0 -1px 0 rgba(0,0,0,0.1); +} + +.topbar a { + color:#e1e1e1; +} + +#navbar {float:right; padding:5px; /* same as superfish */} + +.statusbar { + background-color:#F5F5F5; + margin-top:1em; + margin-bottom:1em; + padding:.5em 1em; + border:1px solid #ddd; + border-radius:5px; + -moz-border-radius:5px; + -webkit-border-radius:5px; +} + +.breadcrumbs {float:left} + +.copyright {float:left} +#poweredBy {float:right} + +/* #MEDIA QUERIES SECTION */ + +/* +*Grid +* +* The default style for SQLFORM.grid even using jquery-iu or another ui framework +* will look better with the declarations below +* if needed to remove base.css consider keeping these following lines in some css file. +*/ +/* .web2py_table {border:1px solid #ccc} */ +.web2py_paginator {} +.web2py_grid {width:100%} +.web2py_grid table {width:100%} +.web2py_grid tbody td {padding:2px 5px 2px 5px; vertical-align: middle;} + +.web2py_grid thead th,.web2py_grid tfoot td { + background-color:#EAEAEA; + padding:10px 5px 10px 5px; +} + +.web2py_grid tr.odd {background-color:#F9F9F9} +.web2py_grid tr:hover {background-color:#F5F5F5} + +/* +.web2py_breadcrumbs a { + line-height:20px; margin-right:5px; display:inline-block; + padding:3px 5px 3px 5px; + font-family:'lucida grande',tahoma,verdana,arial,sans-serif; + color:#3C3C3D; + text-shadow:1px 1px 0 #FFFFFF; + white-space:nowrap; overflow:visible; cursor:pointer; + background:#ECECEC; + border:1px solid #CACACA; + -webkit-border-radius:2px; -moz-border-radius:2px; + -webkit-background-clip:padding-box; border-radius:2px; + outline:none; position:relative; zoom:1; *display:inline; +} +*/ + +.web2py_console form { + width: 100%; + display: inline; + vertical-align: middle; + margin: 0 0 0 5px; +} + +.web2py_console form select { + margin:0; +} + +.web2py_search_actions { + float:left; + text-align:left; +} + +.web2py_grid .row_buttons { + min-height:25px; + vertical-align:middle; +} +.web2py_grid .row_buttons a { + margin:3px; +} + +.web2py_search_actions { + width:100%; +} + +.web2py_grid .row_buttons a, +.web2py_paginator ul li a, +.web2py_search_actions a, +.web2py_console input[type=submit], +.web2py_console input[type=button], +.web2py_console button { + line-height:20px; + margin-right:2px; display:inline-block; + padding:3px 5px 3px 5px; +} + +.web2py_counter { + margin-top:5px; + margin-right:2px; + width:35%; + float:right; + text-align:right; +} + +/*Fix firefox problem*/ +.web2py_table {clear:both; display:block} + +.web2py_paginator { + padding:5px; + text-align:right; + background-color:#f2f2f2; + +} +.web2py_paginator ul { + list-style-type:none; + margin:0px; + padding:0px; +} + +.web2py_paginator ul li { + display:inline; +} + +.web2py_paginator .current { + font-weight:bold; +} + +.web2py_breadcrumbs ul { + list-style:none; + margin-bottom:18px; +} + +li.w2p_grid_breadcrumb_elem { + display:inline-block; +} + +.web2py_console form { vertical-align: middle; } +.web2py_console input, .web2py_console select, +.web2py_console a { margin: 2px; } + + +#wiki_page_body { + width: 600px; + height: auto; + min-height: 400px; +} + +/* fix some IE problems */ + +.ie-lte7 .topbar .container {z-index:2} +.ie-lte8 div.flash{ filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#222222', endColorstr='#000000', GradientType=0 ); } +.ie-lte8 div.flash:hover {filter:alpha(opacity=25);} +.ie9 #w2p_query_panel {padding-bottom:2px} diff --git a/synthetic_tree_viewer/synthetic_tree_viewer/static/css/web2py_bootstrap.css b/synthetic_tree_viewer/synthetic_tree_viewer/static/css/web2py_bootstrap.css new file mode 100644 index 000000000..ee752b4b6 --- /dev/null +++ b/synthetic_tree_viewer/synthetic_tree_viewer/static/css/web2py_bootstrap.css @@ -0,0 +1,231 @@ +/*============================================================= + CUSTOM RULES +==============================================================*/ + +body{height:auto;} /* to avoid vertical scroll bar */ +div.flash.flash-center{left:25%;right:25%;} +div.flash.flash-top,div.flash.flash-top:hover{ + position:relative; + display:block; + margin:0; + padding:1em; + top:0; + left:0; + width:100%; + text-align:center; + text-shadow:0 1px 0 rgba(255, 255, 255, 0.5); + color:#865100; + background:#feea9a; + border:1px solid; + border-top:0px; + border-left:0px; + border-right:0px; + border-radius:0; + opacity:1; +} +#header{margin-top:60px;} +.mastheader h1 { + margin-bottom:9px; + font-size:81px; + font-weight:bold; + letter-spacing:-1px; + line-height:1; + font-size:54px; +} +.mastheader small { + font-size:20px; + font-weight:300; +} +/* auth navbar - primitive style */ +.auth_navbar,.auth_navbar a{color:inherit;} +.ie-lte7 .auth_navbar,.auth_navbar a{color:expression(this.parentNode.currentStyle['color']); /* ie7 doesn't support inherit */} +.auth_navbar a{white-space:nowrap;} /* to avoid the nav split on more lines */ +.auth_navbar a:hover{color:white;text-decoration:none;} +ul#navbar>.auth_navbar{ + display:inline-block; + padding:5px; +} +/* form errors message box customization */ +div.error_wrapper{margin-bottom:9px;} +div.error_wrapper .error{ + border-radius: 4px; + -o-border-radius: 4px; + -moz-border-radius: 4px; + -webkit-border-radius: 4px; +} +/* below rules are only for formstyle = bootstrap +trying to make errors look like bootstrap ones */ +div.controls .error_wrapper{ + display:inline-block; + margin-bottom:0; + vertical-align:middle; +} +div.controls .error{ + min-width:5px; + background:inherit; + color:#B94A48; + border:none; + padding:0; + margin:0; + /*display:inline;*/ /* uncommenting this, the animation effect is lost */ +} +div.controls .help-inline{color:#3A87AD;} +div.controls .error_wrapper +.help-inline {margin-left:-99999px;} +div.controls select +.error_wrapper {margin-left:5px;} +.ie-lte7 div.error{color:#fff;} + +/* beautify brand */ +.navbar-inverse .brand{color:#c6cecc;} +.navbar-inverse .brand b{display:inline-block;margin-top:-1px;} +.navbar-inverse .brand b>span{font-size:22px;color:white} +.navbar-inverse .brand:hover b>span{color:white} +/* beautify web2py link in navbar */ +span.highlighted{color:#d8d800;} +.open span.highlighted{color:#ffff00;} + +/*============================================================= + OVERRIDING WEB2PY.CSS RULES +==============================================================*/ + +/* reset to default */ +a{white-space:normal;} +li{margin-bottom:0;} +textarea,button{display:block;} +/*reset ul padding */ +ul#navbar{padding:0;} +/* label aligned to related input */ +td.w2p_fl,td.w2p_fc {padding:0;} +#web2py_user_form td{vertical-align:middle;} + +/*============================================================= + OVERRIDING BOOTSTRAP.CSS RULES +==============================================================*/ + +/* because web2py handles this via js */ +.hidden{visibility:visible;} +/* right folder for bootstrap black images/icons */ +[class^="icon-"],[class*=" icon-"]{ + background-image:url("../images/glyphicons-halflings.png") +} +/* right folder for bootstrap white images/icons */ +.icon-white, +.nav-tabs > .active > a > [class^="icon-"], +.nav-tabs > .active > a > [class*=" icon-"], +.nav-pills > .active > a > [class^="icon-"], +.nav-pills > .active > a > [class*=" icon-"], +.nav-list > .active > a > [class^="icon-"], +.nav-list > .active > a > [class*=" icon-"], +.navbar-inverse .nav > .active > a > [class^="icon-"], +.navbar-inverse .nav > .active > a > [class*=" icon-"], +.dropdown-menu > li > a:hover > [class^="icon-"], +.dropdown-menu > li > a:hover > [class*=" icon-"], +.dropdown-menu > .active > a > [class^="icon-"], +.dropdown-menu > .active > a > [class*=" icon-"] { + background-image:url("../images/glyphicons-halflings-white.png"); +} +/* bootstrap has a label as input's wrapper while web2py has a div */ +div>input[type="radio"],div>input[type="checkbox"]{margin:0;} +/* bootstrap has button instead of input */ +input[type="button"], input[type="submit"]{margin-right:8px;} + +/*============================================================= +RULES FOR SOLVING CONFLICTS BETWEEN WEB2PY.CSS AND BOOTSTRAP.CSS +==============================================================*/ + +/*when formstyle=table3cols*/ +tr#auth_user_remember__row>td.w2p_fw>div{padding-bottom:8px;} +td.w2p_fw div>label{vertical-align:middle;} +td.w2p_fc {padding-bottom:5px;} +/*when formstyle=divs*/ +div#auth_user_remember__row{margin-top:4px;} +div#auth_user_remember__row>.w2p_fl{display:none;} +div#auth_user_remember__row>.w2p_fw{min-height:39px;} +div.w2p_fw,div.w2p_fc{ + display:inline-block; + vertical-align:middle; + margin-bottom:0; +} +div.w2p_fc{ + padding-left:5px; + margin-top:-8px; +} +/*when formstyle=ul*/ +form>ul{ + list-style:none; + margin:0; +} +li#auth_user_remember__row{margin-top:4px;} +li#auth_user_remember__row>.w2p_fl{display:none;} +li#auth_user_remember__row>.w2p_fw{min-height:39px;} +/*when formstyle=bootstrap*/ +#auth_user_remember__row label.checkbox{display:block;} +span.inline-help{display:inline-block;} +input[type="text"].input-xlarge,input[type="password"].input-xlarge{width:270px;} +/*when recaptcha is used*/ +#recaptcha{min-height:30px;display:inline-block;margin-bottom:0;line-height:30px;vertical-align:middle;} +td>#recaptcha{margin-bottom:6px;} +div>#recaptcha{margin-bottom:9px;} +div.control-group.error{ +width:auto; +background:transparent; +border:0; +color:inherit; +padding:0; +background-repeat:repeat; +} + +/*============================================================= + OTHER RULES +==============================================================*/ + +/* Massimo Di Pierro fixed alignment in forms with list:string */ +form table tr{margin-bottom:9px;} +td.w2p_fw ul{margin-left:0px;} + +/* web2py_console in grid and smartgrid */ +.hidden{visibility:visible;} +.web2py_console input{ + display: inline-block; + margin-bottom: 0; + vertical-align: middle; +} +.web2py_console input[type="submit"], +.web2py_console input[type="button"], +.web2py_console button{ + padding-top:4px; + padding-bottom:4px; + margin:3px 0 0 2px; +} +.web2py_console a, +.web2py_console select, +.web2py_console input +{ + margin:3px 0 0 2px; +} +.web2py_grid form table{width:auto;} +/* auth_user_remember checkbox extrapadding in IE fix */ +.ie-lte9 input#auth_user_remember.checkbox {padding-left:0;} + +/*============================================================= + MEDIA QUERIES +==============================================================*/ + +@media only screen and (max-width:979px){ + body{padding-top:0px;} + #navbar{top:5px;} + div.flash{right:5px;} + .dropdown-menu ul{visibility:visible;} +} +@media only screen and (max-width:479px){ + body{ + padding-left:10px; + padding-right:10px; + } + .navbar-fixed-top,.navbar-fixed-bottom { + margin-left:-10px; + margin-right:-10px; + } + input[type="text"],input[type="password"],select{ + width:95%; + } +} diff --git a/synthetic_tree_viewer/synthetic_tree_viewer/static/css/web2py_bootstrap_nojs.css b/synthetic_tree_viewer/synthetic_tree_viewer/static/css/web2py_bootstrap_nojs.css new file mode 100644 index 000000000..0ec7312f0 --- /dev/null +++ b/synthetic_tree_viewer/synthetic_tree_viewer/static/css/web2py_bootstrap_nojs.css @@ -0,0 +1,122 @@ +/*============================================================= + BOOTSTRAP DROPDOWN MENU +==============================================================*/ + +.dropdown-menu ul{ + left:100%; + position:absolute; + top:0; + visibility:hidden; + margin-top:-1px; +} +.dropdown-menu li:hover ul{visibility:visible;} +.navbar .dropdown-menu ul:before{ + border-bottom:7px solid transparent; + border-left:none; + border-right:7px solid rgba(0, 0, 0, 0.2); + border-top:7px solid transparent; + left:-7px; + top:5px; +} +.nav > li.dropdown > a:after { + border-left: 4px solid transparent; + border-right: 4px solid transparent; + border-top: 4px solid #000000; + content: ""; + display: inline-block; + height: 0; + opacity: 0.7; + vertical-align: top; + width: 0; + + margin-left: 2px; + margin-top: 8px; + + border-bottom-color: #FFFFFF; + border-top-color: #FFFFFF; +} +.dropdown-menu span{display:inline-block;} +ul.dropdown-menu li.dropdown > a:after { + border-left: 4px solid #000; + border-right: 4px solid transparent; + border-bottom: 4px solid transparent; + border-top: 4px solid transparent; + content: ""; + display: inline-block; + height: 0; + opacity: 0.7; + vertical-align: top; + width: 0; + + margin-left: 8px; + margin-top: 6px; +} + +ul.nav li.dropdown:hover ul.dropdown-menu { + display: block; +} + +.open >.dropdown-menu ul{display:block;} /* fix menu issue when BS2.0.4 is applied */ + +/*============================================================= + BOOTSTRAP SUBMIT BUTTON +==============================================================*/ + +input[type='submit']:not(.btn) { +display: inline-block; +padding: 4px 14px; +margin-bottom: 0; +font-size: 14px; +line-height: 20px; +color: #333; +text-align: center; +text-shadow: 0 1px 1px rgba(255, 255, 255, 0.75); +vertical-align: middle; +cursor: pointer; +background-color: whiteSmoke; +background-image: -webkit-gradient(linear,0 0,0 100%,from(white),to(#E6E6E6)); +background-image: -webkit-linear-gradient(top,white,#E6E6E6); +background-image: -o-linear-gradient(top,white,#E6E6E6); +background-image: linear-gradient(to bottom,white,#E6E6E6); +background-image: -moz-linear-gradient(top,white,#E6E6E6); +background-repeat: repeat-x; +border: 1px solid #BBB; +border-color: rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25); +border-bottom-color: #A2A2A2; +-webkit-border-radius: 4px; +-moz-border-radius: 4px; +border-radius: 4px; +filter: progid:dximagetransform.microsoft.gradient(startColorstr='#ffffffff',endColorstr='#ffe6e6e6',GradientType=0); +filter: progid:dximagetransform.microsoft.gradient(enabled=false); +-webkit-box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.2),0 1px 2px rgba(0, 0, 0, 0.05); +-moz-box-shadow: inset 0 1px 0 rgba(255,255,255,0.2),0 1px 2px rgba(0,0,0,0.05); +box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.2),0 1px 2px rgba(0, 0, 0, 0.05); +} + +input[type='submit']:not(.btn):hover { +color: #333; +text-decoration: none; +background-color: #E6E6E6; +background-position: 0 -15px; +-webkit-transition: background-position .1s linear; +-moz-transition: background-position .1s linear; +-o-transition: background-position .1s linear; +transition: background-position .1s linear; +} + +input[type='submit']:not(.btn).active, input[type='submit']:not(.btn):active { +background-color: #E6E6E6; +background-color: #D9D9D9 9; +background-image: none; +outline: 0; +-webkit-box-shadow: inset 0 2px 4px rgba(0, 0, 0, 0.15),0 1px 2px rgba(0, 0, 0, 0.05); +-moz-box-shadow: inset 0 2px 4px rgba(0,0,0,0.15),0 1px 2px rgba(0,0,0,0.05); +box-shadow: inset 0 2px 4px rgba(0, 0, 0, 0.15),0 1px 2px rgba(0, 0, 0, 0.05); +} + +/*============================================================= + OTHER +==============================================================*/ + +.ie-lte8 .navbar-fixed-top {position:static;} + diff --git a/synthetic_tree_viewer/synthetic_tree_viewer/static/favicon.ico b/synthetic_tree_viewer/synthetic_tree_viewer/static/favicon.ico new file mode 100644 index 0000000000000000000000000000000000000000..55a68065d60062eb5cbfa8968d150a54fd737c7d GIT binary patch literal 370070 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 X{tM{8fc^{UzkvP==)b^S{}=eb(WPGy literal 0 HcmV?d00001 diff --git a/synthetic_tree_viewer/synthetic_tree_viewer/static/images/Github.png b/synthetic_tree_viewer/synthetic_tree_viewer/static/images/Github.png new file mode 100644 index 0000000000000000000000000000000000000000..8f9b2039adfb2dab55f99ff241a0c9332937f811 GIT binary patch literal 2372 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 bca{GG=#89t@cMDf00000NkvXXu0mjfJ&DI9 literal 0 HcmV?d00001 diff --git a/synthetic_tree_viewer/synthetic_tree_viewer/static/images/banner-dev.gif b/synthetic_tree_viewer/synthetic_tree_viewer/static/images/banner-dev.gif new file mode 100644 index 0000000000000000000000000000000000000000..36878ae11eb4a9a644622949687bfed6bc992515 GIT binary patch literal 1519 zcmVM)j$~<` zXc`K};l40j3>zEYw*gGHOKgCa&(gygb(P|e1Rw}=1p%jMbQuUc;uA)*01CJzg<6Fn zDPOKeNdcFu2C2$(6I_U)5~)?-;k6>oU5%#__7&`J>+~01!OF02 zj=_Tn6DnNDu%W|;5F<*QNU@^Diw?(~Q>GD<9cupDDo`s&s-s6!FXRO?nTKRCmYHI~ zsUQ#(OmI~~?r9Z3K!JWZuDER2YZA|wCgqKkQ1d{tok>v+>2NK8(R@%lLW_aVMUz^> zQgYNP^;=Uy*Q#0oY6V28G&i2A)j$o#)3H-S%ni^KS2+NEM(J=qh_2OLwjZdVo95 zz~u?6WsofMw65gbCUJKY3>;uzjWHw2N_BZ}b2BcRR&Pv)dj@K8yo9w|7TkDkGIQEC zqL^@DBe+X0zF^$~WlS?j^rEF({)++x1pX-CfCCJrT^p6?GRS}o5>Oz0-d)g4bQv6& zo_msX6H+BL{m|7Fjs4LefkSz-ObSvb6!H?Gk5T$}TnOi}CQXW4I%&=?75<^*doR$CB@8?8 zc;S^)9kn8xYu2^`J3_MZ+Fh^7=|wzJveaI0z|c01O7&S;+nMAHc3hr+>N$aNkSXfu zMFaG6%v}~Z0bK#DQBWy!dY~z%BQ()M6f{)^>jbjma+jvP z-HPk0m}(*ftsDTG+OfzctL(DO{x<9Ev(QE>?X=WZYwfkzVgT5P0uCTRsA#0hZG#Vn zi%bXGV!G|P43-;6s=0dJ6=-4u&cKiQ4kZZoe4(d+xpmk1_Cw?nY!> z6~6l7=cCK4)ZfEpL~={K!K@as#N&J%fN@pwRYfuw^GQLLze%w1J9)YgA5pJ~Z0I=K zOxT)*vEe*qq!*-YM9Z%MsWPq^Bbj8JGT%s;pc(;b3=`Q@EsuS&?TQzH*z$| zIR`?+wmF<6x@;EYZ3I_2<8Gf z4TP?81AKuLFg8Q%0kCjbftvEd29)06@O!dzoC#y~h7XnwhUnM@bxhZyGMVgl$XV18 zhZscmSYwJ~5Qm}WnkX{{{R9Uy6VbrpwIUzJ20&vh3mWqkDC3~a)hXZigQ6tiu7!L&Lml5jjiunjkY$CzP7bH?gPy?EpF!QEA zknuHU48VDq6A)0+Bt~BNR695(5K^8FJDLEK1jZwnP9C8GwCvO&oNk%w1Vb1_60OJS%5E2g@8V(^H3@9TCF)0Z=G6YCE0#-u+5fKp)5fKp) z5fKp)5fKp)5fKp)5fKp)A^8LW000O8EC2ui0M7s_06+x(5XecZy*TU5yZ>M)j${=W zN2;zWVFhd~uLTCj11O*~n_~r5z(R-#GQrglv+Mavpk%B-I8F#uPt3(BvH;SQ0pneD z1_P^QyLKLG6ZSQBPH%3#Wd@)65#dFX%FE0kuPOy< zv?`((nHbM8veq(H6TFS#J=`mkk=@eSDdx!Fg{&Ia6o3Nal6d~XCp*bzkU7@5A|S&kqSeMoJL70(6O1zmoQ_> zoJq5$&6_xL>inh9NykkiAK$N^F1sx<%x1mYO0Pz~8K%u(Yr@3F zaf(7VZJ}3PN5T}KO7@FYsU{ZcCSjiA1}V@3xH8pC8)$Rp(}5|3?ppR>R@P{up6Yv0bjyZ7(l!;2qJzP$PK=+moT z|J`~IyZ}}gSMgByj1QWFl1pwuA=(ve<^D$_MD^hBQr2=;iRYgKvWk0C*7 znWc1WmZKOPf?WBb1Yy?ofdF;xn5CXZ$r77vn}zvPn;!`$NH*pOS|enM-6jE^So-Fu zNb^1P2@zhZnIa@%PIBo}nIcuEkrGT(C1>dc zuBuLwu{v4YBn2Yn&TX5n_*=29Z}fJ-2{IS}>;$a(#KAS6Ts2_|qCCiztSgE-pt7eC zc$%IQfaN5*|CD)}k?K|uuY(j4^lnT6G(-ad(-xJ2FNvW5uqt+HkZ%FcP|>6WUJMNC h8`Fa0@E-a?L%_o9WvubW9Cz&T#~_C+vIh|W06VUQrI`Q# literal 0 HcmV?d00001 diff --git a/synthetic_tree_viewer/synthetic_tree_viewer/static/images/facebook.png b/synthetic_tree_viewer/synthetic_tree_viewer/static/images/facebook.png new file mode 100644 index 0000000000000000000000000000000000000000..be55deddc3fc615ccd1d49235976cecc8e8d0eab GIT binary patch literal 991 zcmV<510ei~P)q1ouJThj*#d6U`qd-LYKH#-Cc>DbrT<#4*f?uv>K$|&hnYB-yj z2|vHne?#g-er?@<_IfC=yn9E-IyBV#%gM)BB!v0=)kkv=X%JNeP_CY4S|8( zTi4@PVg{qpcv&3?)OoSE%7uqdhcNc-Yd571XLxn60k1#)z>kR}$}Q1Y5=(p@G=+kQ zjE{$@)8PtDCNqe}(^x2p{7Qg(-H>bwqF_9p0%KTEkxa>^M0{m64sbp%gKjrP=k`Xl zHP)a){4SOgm!Hhhvz$P(DPtVkJeR+$)`Q*yYvK1+qN;KcC{+z}wBiK{U9u?ypI7+Z zE)|D6o3Xsk4_|fFALo@~NVbRo1LO8R=xA@is^F5p!gW{)hGbJN!ocRS|C`nswIR3%jy1P-_^w_23N#AH22X6y@B01bo#lkpoV{_@n2aE!mW8y$Znd%D+l% zG7Tp+mRw{!Vfri~BwqzwB!?o7q>RmNa5^34C0FV>0hMe$0@4Aid2sRgCPNsD<@~XY zhOtvuUd_=JirENosNz(%ng{J|%|)feP3Pnj?&Ta^GV?jWWdw*`5>|vU&DK^G+n3CI z6^K7nVm$)PX4@>buND?fWrvcA#>(qJvHkp_3rVOd)+4a}=*_t`fAx@I&d%Ojrgn7Z zY$sHNqSQAHl6*4CPRQVOJ8UMQX84#%rHkrJovpCk@WfOc0pB9q zNm%?by&VabWJ2xab2qS`$bq3D5^Clj_eH@#;)BRDOoMjxkxOA55pr!{QN#Jbg#dM%ud*_=X96i zstjv{hGbq@&Bv1mTMc8E2HzVyACYfCq6PEZFq@eU58c0@U(bIFFaYf=<8eP8H#h(Q N002ovPDHLkV1lDZ(&+#I literal 0 HcmV?d00001 diff --git a/synthetic_tree_viewer/synthetic_tree_viewer/static/images/gitter.png b/synthetic_tree_viewer/synthetic_tree_viewer/static/images/gitter.png new file mode 100644 index 0000000000000000000000000000000000000000..12ff159ca95c58726c00cc72528955087cec613c GIT binary patch literal 1717 zcmV;m21@yfP)004R>004l5008;`004mK004C`008P>0026e000+ooVrmw00006 zVoOIv0RI600RN!9r;`8x00(qQO+^Rb0S^ox29mJa3jhEGxk*GpRCwC$Tg!?hMHD?J zBCC6>d4dCjxDZ4a<5Eyi{DM*cz@-bpjp7FgKDKTJR|50&J1S0`dr#bZql&`In39?My?}$ZO3?jY!$AX{ zmQBv3CkJ?PF+4?vr)5)Qcv>7+;{9I2!P=2aA9g!Z>BDZtT{@YM>!^oS;rVO@!v;8< zgVru$DqoCY5>kCraDiOTfeLFTiiH>^A+MRSFFwbI&tTud%YF8ZuHJyD){5tHfW6ne zn!WLYedaMZY3J_l_m}Z9kL&Kfws#j7 z-mSm-86Y2d@PQ9s;X|icS@+$g?F(<|$^vrc(R1^UU**~3+?ctqf7!n9wyrKYXFE0uHFtNNvIIh7HiX~#r(V6JK#d11@@00wTdORxrYELyk=M7 z1c?yj*&p{1QRa9nSspUCqCj%PAxW}B6dBZ;&4#Hr-nawG9pz;hW=diLwPB{KHZ5aN zLR$0$pg)fQX!-nqwKDZ^TzKB=QtH|#Ryb%T?e-yAE5mWQ)G{-oWEVPuqrh9|y?xv@ zVJHWyx9Hvhm$B?Bm7~)q8_*4C4Kr_b9i#~0GBMmESzsI)9(-zGn?UAr%UVrOW=53s zGO)`qtO$GA-dW8|6f>+q+kaSLgNnuQDAq<@4s*tJoADUi8vH{!mo8l`bzphG0D>Qe zKKLipL+ zAfZratSXX`C&^Ts8^*zuA#@(f=~H%Gp>kNO;-O1|(!t(3Tj6cf4@O`^k<)VKbxJ(q ziaSV^bhEOe6&fJPU^ll`EF0-TQ%GIQFdUf_Lf?vrWndp;+>dM`p*E5Ug~^Zv_S!HU zR@-)ALYuD5rTdW5U(#LEGMg5hhcy6UsB*3RLQOn*(cq4|{>~@n+$q!^(%uhOz?qx_ zY>SqiOe@7KLGq4vR{#3v@2`KrnT4UhzVO#~WeiL7cTntZsY#t{zxe!1AgqjL&T6K5 z4++bIUs^?D(+q(%{^rj1r(eXTt~F*3(ibAR*kxC90-4PdZG%d+6TH}K0QAn`-q8)n z!x+19diiu+7g=EdT=;glcAeMEoWiTl+aT`EHPwDekRt*fK!XNdm4wzly{j4qWdV-} zIo8P;m(F(Wn<8PT?PURvYb)l@mxn0T$oU(ZS-_)PPMn(YUf(ZQJr@T&ehl|K zG~6@xRJz*(`+qX5Ws`N-RZkl_F*8fLLgPj8xG@}>uS@k++RBWlP*e9RCLG1OIjaDV zXiWhiL&YmXkRk6+ZdM@utvmjYT^K80@*^xm~!n+a_-;1#d-k-wa+MpT|c6 zd{A)L#g4uLaMCg;*qWO!P(c3-m@9q_c^9>wtCw<$6_EsiJ0@L$M##d}Yz zG;#m{03~!qSaf7zbY(hYa%Ew3WdJfTF*YqQF)cAQR53C-Gch_aHZ3qUIxsLRvFud< z001R)MObuXVRU6WZEs|0W_bWIFfleQFflDLHB>P&Ix{gkFg7hPH99abTI^Km00000 LNkvXXu0mjf{Co~_ literal 0 HcmV?d00001 diff --git a/synthetic_tree_viewer/synthetic_tree_viewer/static/images/glyphicons-halflings-white.png b/synthetic_tree_viewer/synthetic_tree_viewer/static/images/glyphicons-halflings-white.png new file mode 100755 index 0000000000000000000000000000000000000000..3bf6484a29d8da269f9bc874b25493a45fae3bae GIT binary patch literal 8777 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 B7G?kd literal 0 HcmV?d00001 diff --git a/synthetic_tree_viewer/synthetic_tree_viewer/static/images/glyphicons-halflings.png b/synthetic_tree_viewer/synthetic_tree_viewer/static/images/glyphicons-halflings.png new file mode 100755 index 0000000000000000000000000000000000000000..a9969993201f9cee63cf9f49217646347297b643 GIT binary patch literal 12799 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 literal 0 HcmV?d00001 diff --git a/synthetic_tree_viewer/synthetic_tree_viewer/static/images/gplus-32.png b/synthetic_tree_viewer/synthetic_tree_viewer/static/images/gplus-32.png new file mode 100644 index 0000000000000000000000000000000000000000..c42eab784578bf4e827722400f125760ebab527a GIT binary patch literal 1513 zcmV~mL-d9E}6-eW&UBZZ2My_Cfm%i zR~F|3K~NBsXK5*=D3)i1wty(22(yB`TUx&RokMTe)+&h3CZC-4{C@YG-#z!-d&`WO zGS-!qz^GkB4wEK=|ACn(NH+1}^K$G@-wCy z0;G7yEEQ9(4no!1aNNo}0oZK9SWg%F&gWvdMeFGE#5OSwZT4>7=WNp!v>pB&nq6C< ze0`nBxsnntCUn;FS~TQt1(Z_(Qe0=pMhw?5W1SYR?%xf?>OeHnUTCEOc*}pQcWi=X z_`V}=;&v}o8LJ(6o;0ULd0YW0-e$*UEEaIq(NVfaeqzuTI#|+7zvZ+)8V`O1DVMud zkR$d@vpugu=KqlDG`9lW;+2HW&?e$0dT)r0#3yvukQ|26SYM17+9Bmn4-cU{F$7mA z#&Z;Ilg;85BjW5K2>{ar;8Phz&JpAg9TdRG24xRXBc2dwLg0 zaS1Dt1>wf2zhE`pb1~J|3zMc6!_8Vp-#xVw@)UZ+(o)U`-%swOSe3nHmDE`jxdIB> zV8&mL!c?ckkhWg5(}Vr6-Ww1mdpc2>5`#)Qi)W$2-ZD{Hj2}v(R*6CiBUa#i#B!8n zB*97#CrMvn9_@`)v>*JQiBfyZ`0g$vrA~Mu)$eY`^uQg5v5q!eppAGbdX-D=(_$BC zKzF==qBUWdyxxWB{@V_NiVBpZ#)`Yd({XbtacU*3ByuIV3w-Irm!lwT8P0|-Ltf}o zXg>J>)AZ_fHp*|oots5&F&+1`SRoCRPm|?_EJaaLB-H!&K>O8aF#h@@ZqdJ@$?HZ~ z`fj?Iy3vKYkM|*;iY=nT7oyPKvUBw0YdmxirrK&)dV3s3ni?=DFBSNA=a{4}doS{+ zaK0LaPw2cI8*gug^kR3*sZ}FL+C1UXT$O&4E zv$9~ARC1WR90=>T`dVjeH1J4JnS9Y<8;0P&*v_?+xtd)gw|EW3ec P00000NkvXXu0mjf1Z(LN literal 0 HcmV?d00001 diff --git a/synthetic_tree_viewer/synthetic_tree_viewer/static/images/logo.png b/synthetic_tree_viewer/synthetic_tree_viewer/static/images/logo.png new file mode 100644 index 0000000000000000000000000000000000000000..003f93ba1d788d95872352a7a19ba02d21fb83e2 GIT binary patch literal 48981 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�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%0DDD|^0xyB|ho#Z@OeMUVlhJQE3>_!BCjek#Ah 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 DWt$i? literal 0 HcmV?d00001 diff --git a/synthetic_tree_viewer/synthetic_tree_viewer/static/images/mini-opentree-logo.png b/synthetic_tree_viewer/synthetic_tree_viewer/static/images/mini-opentree-logo.png new file mode 100644 index 0000000000000000000000000000000000000000..6cc37e73f2a0ee8bc338e50e2552ed0ddc3d9cbf GIT binary patch literal 2252 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 literal 0 HcmV?d00001 diff --git a/synthetic_tree_viewer/synthetic_tree_viewer/static/images/spinner.gif b/synthetic_tree_viewer/synthetic_tree_viewer/static/images/spinner.gif new file mode 100644 index 0000000000000000000000000000000000000000..81e7c25e410821f84228b18eec911d720185714f GIT binary patch literal 36372 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 literal 0 HcmV?d00001 diff --git a/synthetic_tree_viewer/synthetic_tree_viewer/static/images/tree-view-ancestors.png b/synthetic_tree_viewer/synthetic_tree_viewer/static/images/tree-view-ancestors.png new file mode 100644 index 0000000000000000000000000000000000000000..a846ee84c743e14bb96aefb6efe36d5cfb6bd5fc GIT binary patch literal 4652 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 W6bBZ*w9)ba0000q4vm literal 0 HcmV?d00001 diff --git a/synthetic_tree_viewer/synthetic_tree_viewer/static/images/tree-view-node-jump.png b/synthetic_tree_viewer/synthetic_tree_viewer/static/images/tree-view-node-jump.png new file mode 100644 index 0000000000000000000000000000000000000000..5de5e325576df18c815f3a5dd84b8ff0d870e8d6 GIT binary patch literal 7192 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 bN*Ck@f@8Mi^oF>k00000NkvXXu0mjfP_m=- literal 0 HcmV?d00001 diff --git a/synthetic_tree_viewer/synthetic_tree_viewer/static/images/tree-view-tips.png b/synthetic_tree_viewer/synthetic_tree_viewer/static/images/tree-view-tips.png new file mode 100644 index 0000000000000000000000000000000000000000..3c1fe9ccbed0309216826e6e24ccb4abd81af790 GIT binary patch literal 5925 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 B7G?kd literal 0 HcmV?d00001 diff --git a/synthetic_tree_viewer/synthetic_tree_viewer/static/img/glyphicons-halflings.png b/synthetic_tree_viewer/synthetic_tree_viewer/static/img/glyphicons-halflings.png new file mode 100644 index 0000000000000000000000000000000000000000..a9969993201f9cee63cf9f49217646347297b643 GIT binary patch literal 12799 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 literal 0 HcmV?d00001 diff --git a/synthetic_tree_viewer/synthetic_tree_viewer/static/js/analytics.min.js b/synthetic_tree_viewer/synthetic_tree_viewer/static/js/analytics.min.js new file mode 100644 index 000000000..c6af396fe --- /dev/null +++ b/synthetic_tree_viewer/synthetic_tree_viewer/static/js/analytics.min.js @@ -0,0 +1,4 @@ +// Analytics.js 0.2.2 +// (c) 2012 Segment.io Inc. +// Analytics.js may be freely distributed under the MIT license. +(function(){var e={userId:null,date:new Date,loaded:!1,initialized:!1,initializableProviders:{},providers:[],addProvider:function(e,t){this.initializableProviders[e]=t},initialize:function(e){this.providers=[],this.userId=null;for(var t in e){var n=this.initializableProviders[t],r=e[t];if(!n)throw new Error('Could not find a provider named "'+t+'"');n.initialize(r),this.providers.push(n)}this.initialized=!0;var i=this.utils.getUrlParameter(window.location.search,"ajs_uid");i&&this.identify(i);var s=this.utils.getUrlParameter(window.location.search,"ajs_event");s&&this.track(s)},identify:function(e,t){if(!this.initialized)return;this.utils.isObject(e)&&(t=e,e=null),e!==null?this.userId=e:e=this.userId;for(var n=0,r;r=this.providers[n];n++){if(!r.identify)continue;r.identify(e,this.utils.clone(t))}},track:function(e,t){if(!this.initialized)return;for(var n=0,r;r=this.providers[n];n++){if(!r.track)continue;r.track(e,this.utils.clone(t))}},pageview:function(){if(!this.initialized)return;for(var e=0,t;t=this.providers[e];e++){if(!t.pageview)continue;t.pageview()}},utils:{getSeconds:function(e){return Math.floor(new Date(e)/1e3)},clone:function(e){if(!e)return;var t={};for(var n in e)t[n]=e[n];return t},extend:function(e){var t=Array.prototype.slice.call(arguments,1);for(var n=0,r;r=t[n];n++)for(var i in r)e[i]=r[i];return e},alias:function(e,t){for(var n in t){var r=t[n];e[n]!==undefined&&(e[r]=e[n],delete e[n])}},isObject:function(e){return e===Object(e)},isString:function(e){return Object.prototype.toString.call(e)==="[object String]"},isFunction:function(e){return Object.prototype.toString.call(e)==="[object Function]"},isNumber:function(e){return Object.prototype.toString.call(e)==="[object Number]"},isEmail:function(e){return/.+\@.+\..+/.test(e)},resolveSettings:function(e,t){if(!this.isString(e)&&!this.isObject(e))throw new Error("Could not resolve settings.");if(!t)throw new Error("You must provide an api key field name.");if(this.isString(e)){var n=e;e={},e[t]=n}return e},getUrlParameter:function(e,t){var n=e.replace("?","").split("&");for(var r=0;r<",s,' onload="var d=',y,";d.getElementsByTagName('head')[0].",a,"(d.",f,"('script')).",h,"='",r,"//",u.l,"'",'"',">"].join("")}var s="body",o=n[s];if(!o)return setTimeout(p,100);u.P(1);var a="appendChild",f="createElement",h="src",v=n[f]("div"),m=v[a](n[f](i)),g=n[f]("iframe"),y="document",b="domain",w;v.style.display="none",o.insertBefore(v,o.firstChild).id=i,g.frameBorder="0",g.id=i+"-loader",/MSIE[ ]+6/.test(navigator.userAgent)&&(g.src="javascript:false"),g.allowTransparency="true",m[a](g);try{g.contentWindow[y].open()}catch(E){e[b]=n[b],w="javascript:var d="+y+".open();d.domain='"+n.domain+"';",g[h]=w+"void(0);"}try{var S=g.contentWindow[y];S.write(t()),S.close()}catch(x){g[h]=w+'d.write("'+t().replace(/"/g,String.fromCharCode(92)+'"')+'");d.close();'}u.P(2)};p()};o()}({loader:"static.olark.com/jsclient/loader0.js",name:"olark",methods:["configure","extend","declare","identify"]}),window.olark.identify(this.settings.siteId)},identify:function(e,t){var n=e;t&&t.email&&(n=t.email),t&&t.name&&(n=t.name),t&&t.name&&t.email&&(n+=" ("+t.email+")");if(!n)return;window.olark("api.chat.updateVisitorNickname",{snippet:n})},track:function(e,t){if(!this.settings.track)return;window.olark("api.chat.sendNotificationToOperator",{body:'visitor triggered "'+e+'"'})},pageview:function(){if(!this.settings.pageview)return;window.olark("api.chat.sendNotificationToOperator",{body:"looking at "+window.location.href})}}); \ No newline at end of file diff --git a/synthetic_tree_viewer/synthetic_tree_viewer/static/js/argus/browser.html b/synthetic_tree_viewer/synthetic_tree_viewer/static/js/argus/browser.html new file mode 100644 index 000000000..812cb56b2 --- /dev/null +++ b/synthetic_tree_viewer/synthetic_tree_viewer/static/js/argus/browser.html @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/synthetic_tree_viewer/synthetic_tree_viewer/static/js/argus/drawtree.js b/synthetic_tree_viewer/synthetic_tree_viewer/static/js/argus/drawtree.js new file mode 100644 index 000000000..a93a4586a --- /dev/null +++ b/synthetic_tree_viewer/synthetic_tree_viewer/static/js/argus/drawtree.js @@ -0,0 +1,2188 @@ +/* +@licstart The following is the entire license notice for the JavaScript code in this page. + + Copyright (c) 2013, Cody Hinchliff + Copyright (c) 2013, Joseph W. Brown + Copyright (c) 2013, Jim Allman + Copyright (c) 2013, Mark Holder + + All rights reserved. + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions are met: + + Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. + + Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE + FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER + CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, + OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +@licend The above is the entire license notice for the JavaScript code in this page. +*/ + +/*jslint indent: 4 */ +/*globals XMLHttpRequest, Raphael, $, window, location, History, pageUsesHistory, nodeDataLoaded, historyStateToURL, historyStateToWindowTitle*/ + +// factor function -- gradually going to encapsulate argus functions here for better +// information hiding and avoiding putting a lot of things into the global namespace +// Attributes of spec: +// domSource = "ottol" The name of the source of trees. Currently only "ottol" and the latest synthetic tree +// (e.g. "opentree1.2") are supported. +// nodeID = the ID for the node (according to the system of the service indicated by domSource) +// if nodeID or domSource are lacking, they will *both* be parsed out of the URL query string (location.search) +// from node_id and domsource url-encoded GET parameters. If they are not found there, the defaults are +// domSource="ottol" and nodeID = "805080" +// container - DOM element that will contain the argus object +function createArgus(spec) { + "use strict"; + var o; + var argusObj; + var paper; + // use a series of "empty" elements to organize others by depth + var dividerBeforeEdges, dividerBeforeLabels, dividerBeforeHighlights, dividerBeforeNodes, dividerBeforeAnchoredUI; + var getHoverHandlerNodeAndEdge; + var getHoverHandlerCluster; + var getClickHandlerNode; + var getClickHandlerCluster; + var makeRoomForOpeningCluster; + var getBackClickHandler; + var getForwardClickHandler; + var argusZoomLevel; + var argusScrollTop; + var argusScrollLeft; + var zoomStep; + var setZoomAndReframeView; + var getClickHandlerAltRelLine; + var getHoverHandlerProvenanceHighlight; + var getClickHandlerProvenanceHighlight; + + var isNumeric = function (n) { + return !isNaN(parseFloat(n)) && isFinite(n); + }; + + + // get defaults for the root nodeID and domSource + if (spec.nodeID === undefined || spec.domSource === undefined) { + o = (function (q) { + // simple function to get nodeID and domSource the assuming ignored?key1=val1&key2=val2 structure to q + var toks, i, arg; + var ret = {}; + var firstSubstr, qListStr; + if (q) { + firstSubstr = q.substr(1); + if (firstSubstr) { + qListStr = String(firstSubstr.split("?")); + if (qListStr) { + toks = qListStr.split("&"); + for (i = 0; i < toks.length; i++) { + arg = toks[i].split("="); + if (arg[0] === "node_id") { + ret.nodeID = arg[1]; + } else if (arg[0] === "domsource") { + ret.domSource = arg[1]; + } + } + } + } + } + return ret; + }(location.search)); + spec.nodeID = o.nodeID === undefined ? "805080" : o.nodeID; + spec.domSource = o.domSource === undefined ? "ottol" : o.nodeID; + } + if (spec.container === undefined) { + spec.container = $("body")[0]; + } + if (spec.treemachineDomain === undefined) { + spec.treemachineDomain = "http://opentree-dev.bio.ku.edu:7474"; + } + if (spec.taxomachineDomain === undefined) { + spec.taxomachineDomain = "http://opentree-dev.bio.ku.edu:7476"; + } + if (spec.useTreemachine === undefined) { + spec.useTreemachine = true; // for now, this is always true + } + if (spec.useSyntheticTree === undefined) { + spec.useSyntheticTree = true; + } + if (spec.maxDepth === undefined) { + spec.maxDepth = 4; + } + argusObj = { + "nodeID": spec.nodeID, + "domSource": spec.domSource, + "container": spec.container, + "treemachineDomain": spec.treemachineDomain, + "taxomachineDomain": spec.taxomachineDomain, + "useTreemachine": spec.useTreemachine, + "useSyntheticTree": spec.useSyntheticTree, + /* parsed JSON for the current tree view */ + "treeData": null, + "fontScalar": 2.6, // multiplied by radius to set font size + "minTipRadius": 5, // the minimum radius of the node/tip circles. "r" in old argus + "nodeDiamScalar": 1.0, // how much internal nodes are scaled by logleafcount + "nodesWidth": 100, // the distance between parent/child nodes + // TODO: try a wider setting (180?), or adapt to screen-width + "nubDistScalar": 4, // the x/y distance of the nub from its child + "tipOffset": 300, // distance from right margin at which leaf nodes are drawn + "xLabelMargin": 10, // the distance of the labels from the nodes + "xOffset": 0, // rightmost edge of view-tree; this is set in loadData call before drawing nodes + "yNodeMargin": 4, // whitespace above/below nodes + "yOffset": 10, // distance from top margin at which topmost nodes are drawn; also set in loadData + "yOffsetDefault": 10, // distance from top margin at which topmost nodes are drawn; also set in loadData + /* colors for the tree view */ + "bgColor": "#fff", + "altPColor": "#c69", + "altPLinkColor": "#900", + "altRelColor": "#f00", + "nodeColor": "#999", + "actualLeafColor": "#333", + "visibleLeafColor": "#fff", // ie, click to see more descendants + "nodeHoverColor": "#ff3333", + "pathColor": "#999", + "strongPathColor": "#000", + "labelColor": "#000", + "extinctNodeColor": "#c96", // or maybe #963 + "extinctPathColor": "#c96", + "extinctLabelColor": "#a74", + "provenanceHighlightColor": "#3333ff", + "provenanceHighlightLabelColor": "#3333ff", + "provenanceHighlightLabelBackgroundColor": "#ffffff", + "tipColor": "#999", + "tipHoverColor": "#ff3333", + "currMaxDepth": spec.maxDepth, + "backStack": [], // args to previous displayNode calls + "forwardStack": [], // args to displayNode calls after the back button has been clicked + "currDisplayContext": undefined, //arg to most recent displayNode call + // add dagger † before (or after) extinct node labels + "leadingDagger": "\u2020 ", + "trailingDagger": " \u2020", + clusters: {}, // a registry of clustered child-nodes, keyed to the parent-node's ID + maxClusterSize: 100, // try to bundle sets of n children + minClusterSize: 10, // add fewer to the previous cluster (or unclustered children) instead + maxUnclusteredNodes: 30, // show the most interesting n nodes outside of clusters + + toggleAltBoxX: 55, + toggleAltBoxY: 6, + sourceTextBoxX: 10, + sourceTextBoxY: 35, + backArrowX: 10, + backArrowY: 10, + anchoredControls: null, + provenanceHighlight: null, + highlightedNodeInfo: null, + targetNodeY: 0, // used to center the view (vertically) on the target node + + supportingTaxonomyVersion: null, + + // use Javascript pseudo-classes (defined below) to make tree operations more sensible + makeNodeTree: function(key, value) { + // expects to get root JSON object? or each object (or key/val pair) as it's parsed? + if (value.node_id) { + // it's a tree node! + + // assign parent ID to children, for fast tree traversal + if (value.children) { + for (var i = 0; i < value.children.length; i++) { + value.children[i].parentNodeID = value.node_id; + } + } + + if (value.lineage) { + // assign parent IDs up the "root-ward" chain of nodes + var testChild = value; + $.each(value.lineage, function(i, testParent) { + testChild.parentNodeID = testParent.node_id; + testChild = testParent; // and move to *its* parent + }); + } + + // convert to desired JS pseudo-class + return $.extend( new ArgusNode(), value ); + } + + // more grooming (sorting, clustering, etc) happens later, in setupArgusNode() + return value; + }, + + // utility methods for nodeTree above + getArgusNodeByID: function ( nodeID ) { + // NOTE depends on treeview.js methods + return getTreeDataNode( function(node) { + return (node.node_id === nodeID); + }); + }, + // TODO: add a method to get node by OTT id? + + getZoomInHandler: function () { + return function() { + setZoomAndReframeView('+'); + return false; + }; + }, + getZoomOutHandler: function () { + return function() { + setZoomAndReframeView('-'); + return false; + }; + }, + getToggleConflictsHandler: function() { + return null; + } + }; + + + argusObj.nodeHeight = (2 * argusObj.minTipRadius) + argusObj.yNodeMargin; + // helper function to create the URL and arg to be passed to URL. + // Argument: + // o.nodeID + // o.domSource (default "ottol") @TEMP will need to be modified for cases when ottol is not the value + // o.httpMethod (defaul "POST") + // Return an object with + // url -- URL for ajax call + // data -- object to be sent to the server + // httpMethod -- (currently "POST") + argusObj.buildAjaxCallInfo = function (o) { + var url; + var ds; + var ajaxData; + + if (this.useTreemachine) { + if (this.useSyntheticTree) { + url = getSyntheticTree_url; + } else { + console.error('buildAjaxCallInfo(): we need another URL!?'); + return; + } + // default is the classic "tree 4 in phylografter" + ds = o.domSource === undefined ? "4" : o.domSource; + ajaxData = { + "synth_id": ds, // TODO: Omit this paramter if it causes trouble! + "format": "arguson", + "height_limit": this.currMaxDepth + }; + // send *either* OTT id or node id (but not both) + if (o.nodeID !== undefined) { + ajaxData.node_id = String(o.nodeID); // for later analysis + } else { + if (o.ott_id !== undefined) { + ajaxData.ott_id = Number(o.ott_id); + } + } + } else { + /* TODO: Restore the ability to fetch conflict information from taxomachine? + url = getConflictTaxJsonAltRel_url.replace('{nodeID}', o.nodeID); + // @TEMP assuming ottol + ds = o.domSource === undefined ? "ottol" : o.domSource; + ajaxData = {"domsource": ds}; // phylotastic TNRS API wants domsource, MTH believes. + */ + console.error("AJAX calls via taxomachine are no longer supported."); + return; + } + return { + "url": url, + "data": ajaxData, + "httpMethod": "POST", //@TEMP assuming ottol + "domSource": ds + }; + }; + + argusObj.revealAllVisibleTreeElements = function() { + /* Update argus viewbox to show all visible items (via scrollbars). + * For a seamless effect, we need to simultaneously change the size, + * position(?), and viewbox of the RaphaelJS (SVG) canvas. + * + * This is because the SVG element (regardless of its 'overflow' style) + * dictates the beahavior of scrollbars in the argus view. So for a + * seamless transition, e.g. when expanding a cluster, we need + * to preserve the current scale and *apparent* position of tree + * elements, but (potentially) modify the size and position of the main + * SVG element so that we can scroll to any visible part of the tree. + * Tricky stuff! + * + * After some reflection, I think the key is that the SVG's internal + * viewBox should always match its visible contents (plus a small + * cosmetic margin), and that the SVG element should follow these changes + * in both its size and relative position. Let's tweak all related + * code to do this, instead of the old system, which was: + * Let's reckon the default width and height based on the "maximum + * reasonable extent" of all visible and collapsed nodes. + * Instead, let the (visible) content drive the viewBox, and + * that in turn sets the size and location of the SVG element, always. + * + * Is it possible that default viewBox will "follow" visible contents? + * NO, we need to maintain viewBox manually as things change. + * + * Let's also set its preserveAspectRatio to "none", so that we can + * clearly see stretched graphics due to errors on our updated view. + */ + if (!paper.canvas) { + console.warn('revealAllVisibleTreeElements - NO paper.canvas found, skipping update'); + return; + } + + // allow distortion to reveal serious distortion ASAP + paper.canvas.setAttribute('preserveAspectRatio','none'); + // capture old viewbox (if any) and SVG scrollbar position + var svgContainer = $(paper.canvas)[0].parentElement, + oldViewBox = paper.canvas.viewBox.baseVal || null; + // measure the extent of the newly visible tree + var newBBox = paper.canvas.getBBox(); + // add a little padding, so we can see that labels are complete + var margin = 6, + newLeft = newBBox.x - margin, + newTop = newBBox.y - margin, + newWidth = newBBox.width + (margin*2), + newHeight = newBBox.height + (margin*2); + paper.setViewBox(newLeft, newTop, newWidth, newHeight); + // set the SVG element's size to show this fully + paper.setSize(newWidth * argusZoomLevel, newHeight * argusZoomLevel); + // update scrollbars to match old position as best we can + svgContainer.scrollLeft = argusScrollLeft; + svgContainer.scrollTop = argusScrollTop; + }; + + argusObj.loadData = function (o) { + // accepts three named arguments: + // o.url the address to which the HTTP request is sent + // o.data arguement (object of str) to be sent to the URL as an argument + // o.httpMethod e.g. "GET" or "POST"; "POST" is the default + // o.domSource + // + var dataStr = JSON.stringify(o.data); + var domSource = o.domSource === undefined ? "ottol" : o.domSource; + var ottID; + if ('ott_id' in o.data) { + ottID = Number(o.data.ott_id); + } else if (o.data.node_id.indexOf('ott') === 0) { + // strip leading 'ott' from node_id to recover numeric OTT id + ottID = Number( o.data.node_id.replace('ott','') ) || 0; + } + var argusLoadSuccess = function (json, textStatus, jqXHR) { + var argusObjRef = this; + argusObjRef.treeData = json.arguson; + // Determine the maximum node depth (height_limit or less) found in this subtree + var node = argusObjRef.treeData; + var getSubtreeDepth = function(node) { + /* Find the deepest of its childrens' subtrees. While we're + * traversing the tree, let's also set each node's num_tips_in_view! + */ + var maxChildDepth = 0, + descendantTipsInView = 0; + if (node.children) { + for (var i = 0; i < node.children.length; i++) { + var childNode = node.children[i]; + var childDepth = getSubtreeDepth( childNode ); + maxChildDepth = Math.max(childDepth, maxChildDepth); + // Count any tips found, and descendant tips for internal nodes + descendantTipsInView += (childNode.num_tips_in_view || 1); + } + node.num_tips_in_view = descendantTipsInView; + } else { + // This node is a tip in the current view! + node.num_tips_in_view = 0; + } + // add this node to depth, plus that of its deepest child + return maxChildDepth + 1; + } + argusObjRef.treeData.max_node_depth = getSubtreeDepth(node) - 1; + + // get the supporting taxonomy (OTT) version for comparison below + var ottInfo = $.map( argus.treeData.source_id_map, function( value, key ) { + // return info only for taxonomic sources + return ('taxonomy' in value) ? value : null; + })[0]; + if (ottInfo && 'taxonomy' in ottInfo) { + argus.supportingTaxonomyVersion = ottInfo['taxonomy']; + } + if (!argus.supportingTaxonomyVersion) { + console.warn("No supporting OTT version found!"); + return; + } + + // final setup of tree-view object hierarchy + // recursive marking of depth in local tree + var setupArgusNode = function (node, depth) { + node.nodeDepth = depth; // assume this is a number (where 0 = local root) + + // slightly different, this is which column of nodes will hold this one + // (where 0 = the right-most (leaf nodes) column, higher = further left) + node.treeColumn = node.isLocalLeafNode() ? 0 : (argusObj.treeData.max_node_depth - node.nodeDepth); + // TODO: pre-calculate node.x from this, if it never changes..? + + if (node.children) { + // sort and cluster children to build its display list + + /* Prioritize phylogeny-based edges, use alphabetic order, and + * use clustering to deal with lots of uninteresting + * (taxonomy-based) edges. + */ + var nchildren = node.children.length, + nodesWithHybridSupport = [ ], + nodesWithPhyloSupport = [ ], + nodesWithoutPhyloSupport = [ ], + clusters = argusObj.clusters; + + // sort children alphabetically first.. + node.children.sort(alphaSortByName); + // group children based on type of edge support + for (var i = 0; i < nchildren; i++) { + var testChild = node.children[i], + sb = getSupportingSourceIDs(testChild); + //sb = testChild.supported_by; + testChild.supportedByTaxonomy = (argus.supportingTaxonomyVersion in sb); + testChild.supportedByPhylogeny = Object.keys(sb).length > (testChild.supportedByTaxonomy ? 1 : 0); + + if (testChild.supportedByPhylogeny && testChild.supportedByTaxonomy) { + nodesWithHybridSupport.push(testChild); + } else if (testChild.supportedByPhylogeny) { + nodesWithPhyloSupport.push(testChild); + } else { + nodesWithoutPhyloSupport.push(testChild); + } + } + var nWithHybrid = nodesWithHybridSupport.length, + nWithPhylo = nodesWithPhyloSupport.length, + nWithoutPhylo = nodesWithoutPhyloSupport.length; + + // mark some less-interesting nodes for clustering + // + // sort first by number of descendants, so we always show the most + // populous clades + nodesWithoutPhyloSupport.sort(sortByDescendantCount); + var nUnclusteredNodes = argusObj.maxUnclusteredNodes - nWithHybrid - nWithPhylo; + var clusteredNodes = nodesWithoutPhyloSupport.slice( nUnclusteredNodes ); + if (clusteredNodes.length < argusObj.minClusterSize) { + // never mind! there's not enough to make a decent cluster + clusteredNodes = [ ]; + } + var firstClusteredNode = clusteredNodes[0], // capture BEFORE re-sorting! + nClustered = clusteredNodes.length, + nClusteredRemaining, + currentCluster = null, + nInCurrentCluster = 0; + + // re-sort the smaller ones by name, then sort into clusters + clusteredNodes.sort(alphaSortByName); + + for (i = 0; i < nClustered; i++) { + testChild = clusteredNodes[i]; + /// testChild.nameStartsWith = (testChild.name.length > 0 ? testChild.name[0].toLowerCase() : ''); + if (nInCurrentCluster > argusObj.maxClusterSize) { + // this cluster is full, start another one? + if (testChild.name.indexOf(currentCluster.lastName) === 0) { // ie, starts with... + // no, push this node into the last one... + } else { + // are there enough nodes left to form a good cluster? + nClusteredRemaining = nClustered - i; + if (nClusteredRemaining > argusObj.minClusterSize) { + // add a new cluster and start filling it + var newCluster = $.extend( new ArgusCluster(), { + nodes: [ ], + firstName: testChild.name, + lastName: testChild.name, + parentNodeID: node.node_id + }); + clusters[node.node_id].push(newCluster); + currentCluster = newCluster; + nInCurrentCluster = 0; + } + // else toss the remaining few children into the last cluster + } + } + if (!currentCluster) { + // add entry for this node, and its first (empty) cluster + newCluster = $.extend( new ArgusCluster(), { + nodes: [ ], + firstName: '', + lastName: '', + parentNodeID: node.node_id + }); + clusters[ node.node_id ] = [ newCluster ]; + currentCluster = newCluster; + nInCurrentCluster = 0; + } + currentCluster.nodes.push(testChild); + if (currentCluster.firstName === '') { + currentCluster.firstName = testChild.name; + } + currentCluster.lastName = testChild.name; + nInCurrentCluster++; + } + // use names to label each cluster alphabetically + + // Use these groups and clusters to draw children + node.displayList = nodesWithHybridSupport.concat( nodesWithPhyloSupport ); + + nWithHybrid = nodesWithHybridSupport.length; + nWithPhylo = nodesWithPhyloSupport.length; + nWithoutPhylo = nodesWithoutPhyloSupport.length; + // some taxonomy-supported nodes may be hidden in clusters (ignore these) + for (i = 0; i < nWithoutPhylo; i++) { + // postorder traverse the children of this node + if (nodesWithoutPhyloSupport[i] === firstClusteredNode) { + // stop when we reach clustered nodes + break; + } + + node.displayList.push(nodesWithoutPhyloSupport[i]); + } + // add minimized clusters to the display list + if (clusters[node.node_id]) { + node.displayList = node.displayList.concat( clusters[node.node_id]); + } + } + + // recurse into its child nodes + if (node.children) { + for (i = 0; i < node.children.length; i++) { + setupArgusNode( node.children[i], depth + 1 ); + } + } + }; + + // clear the cluster registry first + argusObj.clusters = {}; + + // recursively populate any missing (implied) node names + buildAllMissingNodeNames(node); + + setupArgusNode(node, 0); + + var pheight, pwidth, sourcelabel, anchoredbg; + + //spec.container.text("proxy returned data..." + treeData); + // calculate view-specific geometry parameters + pheight = ((2 * argusObjRef.minTipRadius) + argusObjRef.yNodeMargin) * (node.num_tips_in_view); + pheight += argusObjRef.nubDistScalar * argusObjRef.minTipRadius; + + // for a narrow tree, push topmost nodes down away from the anchored widgets + if (pheight > 16 * argusObjRef.nodeHeight) { + argusObjRef.yOffsetDefault = 10; + } else { + var topBuffer = 8 * argusObjRef.nodeHeight; + argusObjRef.yOffsetDefault = topBuffer; + pheight += topBuffer; + } + argusObjRef.yOffset = argusObjRef.yOffsetDefault; + + // provide enough room for anchored widgets, more if needed for the tree + pheight = Math.max(pheight, 20 * argusObjRef.nodeHeight); + + pwidth = argusObjRef.nodesWidth * (node.max_node_depth + 1); + pwidth += 1.5 * argusObjRef.tipOffset + argusObjRef.xLabelMargin; + // NOTE that this might still clip super-wide labels, e.g. for a cluster + + argusObjRef.xOffset = pwidth - argusObjRef.nodesWidth - argusObjRef.tipOffset; + + hideSpinner(); + + if (argusObjRef.container === undefined) { + paper = new Raphael(10, 10, 10, 10); + } else { + paper = new Raphael(argusObjRef.container, 10, 10); + } + + // add dividers before anything else + dividerBeforeEdges = paper.text(0,0,''); + dividerBeforeLabels = paper.text(0,0,''); + dividerBeforeHighlights = paper.text(0,0,''); + dividerBeforeNodes = paper.text(0,0,''); + dividerBeforeAnchoredUI = paper.text(0,0,''); + + /* Gather all controls that should anchor to the scrolling viewport + * SUPPRESSING this for now, but kept in case we revisit this idea. + if (!argusObj.anchoredControls) { + argusObj.anchoredControls = paper.set(); + } + + // if we need a larger, shared background + anchoredbg = paper.rect(0,0,120,90).attr({ + "fill": this.bgColor, + "fill-opacity": 0.6, + "stroke": 'none' + }); + argusObj.anchoredControls.push(anchoredbg); + + // this should also anchor to the scrolling viewport + sourcelabel = paper.text(argusObjRef.sourceTextBoxX, + argusObjRef.sourceTextBoxY, + "source: " + domSource).attr({ + "font-size": String(argusObjRef.fontScalar * argusObjRef.minTipRadius) + "px", + "text-anchor": "start" + }); + argusObj.anchoredControls.push(sourcelabel); + */ + + // add (and hide) moving highlights for node and edge provenance + argusObj.provenanceHighlight = paper.set(); + // rect to allow scaling (vs path) + argusObj.provenanceHighlight.push( + paper.rect().attr({ + "x": -50, + "y": -2, + "width": 100, + "height": 4, + "fill": argusObj.provenanceHighlightColor, + "title": "Click to see properties for this edge", + "stroke": "none", + "cursor": "pointer" + }).insertBefore(dividerBeforeNodes) + ); + + argusObj.provenanceHighlight.push( + // Draw a lozenge shape, centered on its right focus + // see http://www.w3.org/TR/SVG/paths.html#PathDataEllipticalArcCommands + paper.path('M -20,-7.5 L 0,-7.5 A 7.5,7.5 0 0,1 0,7.5 L -20,7.5 A 7.5,7.5 0 0,1 -20,-7.5 Z').attr({ + "x": 0, + "y": 0, + "stroke": argusObj.provenanceHighlightColor, + "title": "Click to see properties for this node", // add name? + "stroke-width": 2, + "fill": argusObj.provenanceHighlightLabelBackgroundColor, + "cursor": "pointer" + }).insertBefore(dividerBeforeNodes) + ); + argusObj.provenanceHighlight.push( + paper.text().attr({ + "x": -20, + "y": 0, + "text": "i", + "title": "Click to see properties for this node", // add name? + "text-anchor": "middle", + "fill": argusObj.provenanceHighlightLabelColor, + "font-weight": "bold", + "font-family": "Courier, monospace", + "font-size": 12, + "cursor": "pointer" + }).insertBefore(dividerBeforeNodes) + ); + // hide until user rolls over a node or edge + argusObj.provenanceHighlight.hide(); + + argusObj.provenanceHighlight.hover( + getHoverHandlerProvenanceHighlight('OVER', argusObj.provenanceHighlight, {}), + getHoverHandlerProvenanceHighlight('OUT', argusObj.provenanceHighlight, { }) + ); + var handler = getClickHandlerProvenanceHighlight(); // just once! + // note that the target node's info is available as argusObj.highlightedNodeInfo + $.each(argusObj.provenanceHighlight.items, function(i, item) { + // we need to dig into the actual nodes to use jQuery binding + $(item.node).on('click contextmenu', handler); + }); + + // refresh tree + argusObjRef.nodesHash = {}; + argusObjRef.nodesWithCycles = []; + // draw the tree + argusObjRef.drawTree(); + /* Update the viewbox to include all visible elements (esp. + * ancestor nodes and long node+cluster labels) + */ + setZoomAndReframeView(); + + // Release the forced height of the argus viewport + $(this.container).css('height', ''); + + // if there's a page-level callback function, call it now + if (typeof nodeDataLoaded === 'function') { + nodeDataLoaded(node); + } + + // draw the cycles + argusObjRef.drawCycles(); + }; + var argusLoadFailure = function (jqXHR, textStatus, errorThrown) { + // Was this a taxon that didn't make it into synthesis, or some other error? + var mainFetchXHR = jqXHR; + var mainFetchJSON; + try { + // IF there was a JSON payload, we want to keep it (if the payload is + // empty/null, make an empty object) + mainFetchJSON = $.parseJSON(mainFetchXHR.responseText) || { }; + } catch(e) { + // make an empty object for now + mainFetchJSON = { }; + } + $.ajax({ + url: getTaxonInfo_url, + type: 'POST', + crossDomain: true, + contentType: 'application/json', + dataType: 'json', + data: JSON.stringify({ "ott_id": ottID }), // set above, defaults to 0 (invalid ID) if not an OTT taxon + complete: function( jqXHR, textStatus ) { + hideSpinner(); + // report errors or malformed data, if any + var errMsg; + if (textStatus !== 'success') { + // major server-side error, just show raw response for tech support + errMsg = '

Sorry, there was an error checking for taxon status.

'; + showErrorInArgusViewer(errMsg); + return; + } + // check to see if we got a taxon record, or an error in JSON + var json = $.parseJSON(jqXHR.responseText); + // if (json['ott_id'] === ottID) { TODO: use this when we switch to v3 taxonomy API! + if (json['ott_id'] === ottID) { + var taxoBrowserLink = getTaxobrowserLink('View this taxon in the taxonomy browser', ottID) + // the requested taxon exists in OTT, but is not found in the target tree + //errMsg = '

This taxon is in our taxonomy but not in our tree synthesis database.

' + + if (mainFetchJSON.broken) { + // parse this to learn more... + errMsg = '

This taxon is in our taxonomy but it\'s "broken" (not monophyletic) in the latest synthetic tree.

'; + if (mainFetchJSON.broken.mrca) { + // this is the ottid of its MRCA, a good next step for this user + var mrcaSynthViewURL = getSynthTreeViewerURLForNodeID( + '', // defaults to latest synthetic tree + mainFetchJSON.broken.mrca + ); + errMsg +='

View the MRCA of the members of this taxon in the synthetic tree

'; + } + var contestingTreeJSON = mainFetchJSON.broken.contesting_trees; + if (contestingTreeJSON) { + errMsg +='

Input phylogenies that conflict with this taxon:  

'; + errMsg +='
    '; + Object.keys(contestingTreeJSON).forEach(function(treeAndStudyID) { + + var parts = treeAndStudyID.split('@'); + var studyID = parts[0]; + var treeID = parts[1]; + var conflictURL = '/curator/study/view/{STUDY_ID}/?tab=trees&tree={TREE_ID}&conflict=ott' + .replace('{STUDY_ID}', studyID) + .replace('{TREE_ID}', treeID); + var conflictDetailsPanelID = 'conflicting-tree-details-'+ studyID +'-'+ treeID; + errMsg +='
  • ' + treeAndStudyID +' (show this tree in a new window)
    ...loading details..
  • '; + /* TODO: One or more AJAX fetches to retrieve study and tree names? + var treeName = "TODO"; + var compactRef = "TODO"; + errMsg +='   ('+ "tree '+ treeName +' in study '+ compactRef +'" +')'; + */ + /* Fetch more information about conflicting trees and + * studies; update the UI once we have the data. + */ + loadConflictingTreeDetails(studyID, treeID, conflictDetailsPanelID); + }); + errMsg +='
'; + + } + } else { + errMsg = '

This taxon is in our taxonomy but does not appear in the latest synthetic tree. This can happen for a variety of reasons,' + +' but the most probable is that is has a taxon flag (e.g. incertae sedis) that' + +' causes it to be pruned from the synthetic tree.

'; + if (json.flags && json.flags.length > 0) { + errMsg += '

The following flags were found on this taxon:

' + errMsg += '
    '; + $.each(json.flags, function(i, flag) { + errMsg += '
  • '+ flag +'
  • '; + }); + errMsg += '
'; + errMsg += '

See our taxonomy documentation for details on the meanings of each flag.

' + } + } + + errMsg +='

'+ taxoBrowserLink +'

'; + showErrorInArgusViewer( errMsg ); + } else { + // this is not a valid taxon id! Show the *original* error response from the failed argus fetch. + errMsg = '

Whoops! The call to get the tree around a node did not work out the way we were hoping it would.

'; + showErrorInArgusViewer( errMsg, mainFetchXHR.responseText ); + } + } + }); + }; + $.ajax({ + url: o.url, + type: o.httpMethod === undefined ? "POST" : o.httpMethod, + dataType: 'text nodeTree', // 'nodeTree' triggers converter below + data: dataStr, + context: argusObj, + crossDomain: true, + contentType: 'application/json', + converters: { + // serialize this JSON into dedicated pseudo-classes + 'text nodeTree': function(data) { + ///console.log(">>> pre-processing raw JSON string..." ); + // NOTE that jQuery's parseJSON() doesn't support the 'reviver' option + ///return $.parseJSON(data, argusObj.makeNodeTree); + return JSON.parse(data, argusObj.makeNodeTree); + } + }, + success: argusLoadSuccess, + error: argusLoadFailure + }); + }; + + argusObj.moveToNode = function (o) { + // if we're using History.js, all movement through the tree should be driven from history + if (History && History.enabled && "pageUsesHistory" in window && pageUsesHistory) { + // add expected values for minimal history entry + var stateObj = $.extend(true, {'nodeName': ''}, o); // deep copy of o, with default values if none supplied + History.pushState(stateObj, historyStateToWindowTitle(stateObj), historyStateToURL(stateObj)); + } else { + // proceed directly to display (emulate browser history State object) + updateTreeView({'data': o}); + } + // if we're still showing the initial "nudge" message, hide it now + if ($('#nudged-to-latest-synthetic-tree').is(':visible')) { + $('#nudged-to-latest-synthetic-tree').fadeOut(); + } + }; + + argusObj.displayNode = function (o) { + // update argus' domSource to reflect that of the new target node? + this.domSource = (o.domSource === undefined) ? this.domSource : o.domSource; + + var ajaxInfo = this.buildAjaxCallInfo({ + "nodeID": o.nodeID, + "ott_id": o.ott_id || "0", + "domSource": this.domSource + }); + + // Freeze the height of the argus viewport until new results arrive + $(this.container).css('height', $(this.container).css('height')); + + if (paper !== undefined) { + $(this.container).unbind("scroll"); + if (argusObj.anchoredControls) { + argusObj.anchoredControls.remove(); + argusObj.anchoredControls.clear(); + } + paper.clear(); + paper.remove(); + } + + clearPropertyInspector(); + showSpinner($(this.container)); + + /* The next 9 lines store the last call to displayNode. We'll need to move this, if we use other functions as "public" entry points of Argus calls*/ + if (o.storeThisCall === undefined || o.storeThisCall) { + if (this.currDisplayContext !== undefined) { + this.backStack.push(this.currDisplayContext); + } + } + this.currDisplayContext = $.extend(true, {}, o); // cryptic, eh? this is a deep copy of o + if (o.storeThisCall === undefined || o.storeThisCall) { + delete this.currDisplayContext.storeThisCall; + } + + this.nodeID = o.nodeID; + this.loadData(ajaxInfo); + setZoomAndReframeView(); + return this; + }; + + // create closure to access node attributes when hovering in/out + getHoverHandlerNodeAndEdge = function (hoverState, shape, shapeAttributes, nodeInfo) { + ///console.log("CALL getHoverHandlerNodeAndEdge - "+ hoverState); + var targetShape = shape; + return function () { + ///console.log("INNER getHoverHandlerNodeAndEdge - "+ hoverState); + var srcInfo = $.extend(true, {}, targetShape.data('sourceNodeInfo')); + var nodeCircle, edgePath; + switch (targetShape.type) { + case 'circle': + nodeCircle = targetShape; + edgePath = paper.getById('node-branch-trigger-'+ srcInfo.nodeID); + break; + + case 'path': + nodeCircle = paper.getById('node-circle-'+ srcInfo.nodeID); + edgePath = targetShape; + break; + + default: + console.warn("getHoverHandlerNodeAndEdge(): Unexpected type for targetShape: '"+ targetShape.type +"'!"); + return; + } + + nodeCircle.attr(shapeAttributes); + switch (hoverState) { + case 'OVER': + // copy source-node values from the target node to the highlight + + argusObj.highlightedNodeInfo = srcInfo; + + // move the highlight to this node + argusObj.provenanceHighlight.transform('t' + nodeCircle.attr('cx') + ',' + nodeCircle.attr('cy')); + + if (edgePath) { + // move the highlight to this edge + // no easy x/y attributes for a path, need to use its bounding box + var bbox = edgePath.getBBox(false); + + argusObj.provenanceHighlight.forEach(function(element) { + if (element.type == 'rect') { + var xScale = (bbox.width / 100); + var pathScale = 'S '+ xScale +',1 t' + ((bbox.x + (bbox.width / 2.0)) / xScale) + ',' + bbox.y; + // 100 is the natural width of the hilight path + element.transform(pathScale); + element.show(); + } + }); + } + + argusObj.provenanceHighlight.show(); + + if (!edgePath) { + // hide edge-highlight rect if there's no upward edge + argusObj.provenanceHighlight.forEach(function(element) { + if (element.type == 'rect') { + element.hide(); + } + }); + } + break; + case 'OUT': + // do nothing for now + break; + default: + console.log('Unexpected value for hoverState: '+ hoverState); + } + }; + }; + getHoverHandlerCluster = function (hoverState, shape, shapeAttributes, label, labelAttributes, clusterInfo) { + var clusterShape = shape; + var clusterLabel = label; + return function () { + clusterShape.attr(shapeAttributes); + clusterLabel.attr(labelAttributes); + switch (hoverState) { + case 'OVER': + // copy source-node values from the target node to the highlight + var srcInfo = $.extend(true, {}, clusterShape.data('clusterInfo')); + + ///argusObj.highlightedNodeInfo = srcInfo; + break; + case 'OUT': + // do nothing for now + break; + default: + console.log('Unexpected value for hoverState: '+ hoverState); + } + }; + }; + getHoverHandlerProvenanceHighlight = function (hoverState, highlight, shapeAttributes, highlightInfo) { + var nodeHighlight = highlight; + return function (evt) { + switch (hoverState) { + case 'OVER': + nodeHighlight.attr(shapeAttributes); + break; + case 'OUT': + // are we REALLY outside the lozenge, or just over the text? + + // Test using client/page coordinates, instead of canvas. + // (This handles scaling, scrolling, etc. more reliably.) + var bbox = getClientBoundingBox( argusObj.provenanceHighlight ); + + if (Raphael.isPointInsideBBox( bbox, evt.pageX, evt.pageY )) { + // false alarm, it's just moved over text or the node circle + return; + } + + nodeHighlight.attr(shapeAttributes); + // hide the node highlight + argusObj.provenanceHighlight.hide(); + break; + default: + console.log('Unexpected value for hoverState (node highlight): '+ hoverState); + } + }; + } + + getClickHandlerNode = function (nodeID, domSource, nodeName) { + return function (e) { + /* Right-click ('contextmenu' event) should open a new window focused + * on this node; otherwise re-center the argus view in this window. + * + * N.B. Details on how a new window or tab appears depend on each browser, + * as well as popup blockers and user preferences! + */ + switch (e.type) { + case 'contextmenu': + var urlSafeNodeName = encodeURIComponent(nodeName); + var nodeURL = '/opentree/'+ domSource +'@'+ nodeID +'/'+ urlSafeNodeName; + var newWindow = window.open( nodeURL, '_blank' ); + if (newWindow) { + // if blocked by popup blocker, this is undefined + newWindow.focus(); + } + break; + + case 'click': + default: + argusObj.moveToNode({"nodeID": nodeID, + "domSource": domSource, + "nodeName": nodeName}); + } + }; + }; + getClickHandlerCluster = function (minimizedClusterParts, parentNodeID, clusterPosition, depthFromTargetNode, domSource, currentYoffset) { + return function () { + // clobber the minimized cluster + for (var i = 0; i < minimizedClusterParts.length; i++) { + minimizedClusterParts[i].remove(); + } + + var cluster = argusObj.clusters[ parentNodeID ][ clusterPosition ]; + // draw its children, starting at the X and Y coords for this cluster + + // flip its 'expanded' flag and remove it from the display list.. + cluster.expanded = true; + var parentNode = argusObj.getArgusNodeByID(parentNodeID); + var dlPos = $.inArray(cluster, parentNode.displayList); + // replace the minimized cluster with its nodes + var listBeforeCluster = parentNode.displayList.slice(0,dlPos); + var listAfterCluster = parentNode.displayList.slice(dlPos + 1); + parentNode.displayList = listBeforeCluster.concat( cluster.nodes, listAfterCluster ); + + // hide any stale highlight + argusObj.provenanceHighlight.hide(); + + // redraw entire tree with changes + argusObj.drawTree(); + setZoomAndReframeView(); + }; + }; + getBackClickHandler = function () { + return function () { + argusObj.forwardStack.push(argusObj.currDisplayContext); + o = argusObj.backStack.pop(); + o.storeThisCall = false; + argusObj.moveToNode(o); + }; + }; + getForwardClickHandler = function () { + return function () { + o = argusObj.forwardStack.pop(); + argusObj.moveToNode(o); + }; + }; + + // reckon zoom level as a proportion of 1.0 (="natural" size) + argusZoomLevel = null; + zoomStep = 1.2; + setZoomAndReframeView = function( newLevel ) { + if (argusZoomLevel && argusZoomLevel === newLevel) { + return; // do nothing + } + if (!paper || !paper.canvas) { + return; + } + if (typeof(argusZoomLevel) !== 'number') { + // set default size + argusZoomLevel = 1.0; + } + // read the current scrollbar positions of the argus view + var svgContainer = $(paper.canvas)[0].parentElement; + argusScrollLeft = svgContainer.scrollLeft; + argusScrollTop = svgContainer.scrollTop; + switch(newLevel) { + case '+': + argusZoomLevel *= zoomStep; + argusScrollLeft *= zoomStep; + argusScrollTop *= zoomStep; + break; + case '-': + argusZoomLevel /= zoomStep; + argusScrollLeft /= zoomStep; + argusScrollTop /= zoomStep; + break; + default: + if (typeof(newLevel) === 'number') { + // assume it's an explicit zoom level + var oldZoomLevel = (argusZoomLevel || 1.0); + argusZoomLevel = 1.0 * newLevel; + // reckon this change as a "custom zoomStep" + var zoomChange = newLevel / oldZoomLevel; + argusScrollLeft = 0.0 * zoomChange; + argusScrollTop = 0.0 * zoomChange; + } else { + // assume this is simply re-asserting the current zoom level (eg, in a new node) + } + } + // try to apply the new scale, while maintaining the current center point + argusObj.revealAllVisibleTreeElements(); + }; + + getClickHandlerAltRelLine = function (nodeFromAJAX) { + /* at some point we will probably want to retain a history of preferred altrelationships, etc. + * these should be stored/retrieved from a base-level query info object that is passed back + * and forth from the server. for now we are just keeping things simple and not remembering + * anything about previous relationships. + * var altrelids = // get altrels ; + * altrelids.push(child.altrels[j].altrelid); */ + return function () { + argusObj.moveToNode({"nodeID": nodeFromAJAX.parentid, + "domSource": nodeFromAJAX.source}); + }; + }; + getClickHandlerProvenanceHighlight = function () { + return function (e) { + /* Right-click ('contextmenu' event) should open a new window focused + * on this node; otherwise show this node's properties in the inspector. + * We'll use source-node values copied from the target node + * + * N.B. Details on how a new window or tab appears depend on each browser, + * as well as popup blockers and user preferences! + */ + switch (e.type) { + case 'contextmenu': + var info = argusObj.highlightedNodeInfo; + var urlSafeNodeName = encodeURIComponent(info.nodeName); + var nodeURL = '/opentree/'+ info.domSource +'@'+ info.nodeID +'/'+ urlSafeNodeName; + var newWindow = window.open( nodeURL, '_blank' ); + if (newWindow) { + // if blocked by popup blocker, this is undefined + newWindow.focus(); + } + break; + + case 'click': + default: + showObjectProperties( argusObj.highlightedNodeInfo ); + } + }; + }; + + // recursive function to draw nodes and branches for the "dominant" tree (the domSource) + var tempCounter = 1; + argusObj.drawNode = function(obj) { + // recursive (depth first, top down) through all sub-nodes for best layout + var node = obj.node; + var isTargetNode = obj.isTargetNode; + var parentNodeX = obj.parentNodeX; + if (!parentNodeX) { + // passed in arg is fastest, but this is now reliable + var parentNode = argusObj.getArgusNodeByID(node.parentNodeID); + parentNodeX = (parentNode) ? + argusObj.xOffset - (argusObj.nodesWidth * parentNode.treeColumn) : + // if no parent ID, assume it's the local root node + argusObj.xOffset - (argusObj.nodesWidth * argusObj.treeData.treeColumn); + } + var depthFromTargetNode = obj.depthFromTargetNode || 0; + var domSource = obj.domSource; + var fontSize = this.minTipRadius * this.fontScalar; + var curLeaf = obj.curLeaf; + var currentYoffset = obj.currentYoffset || argusObj.yOffset; + // build IDs for visible elements (to move or create) + var nodeCircleElementID = 'node-circle-'+ node.node_id; + var nodeLabelElementID = 'node-label-'+ node.node_id; + var nodeSpineElementID = 'spine-'+ node.node_id; + var nodeTriggerBranchElementID = 'node-branch-trigger-'+ node.node_id; + var nodeVisibleBranchElementID = 'node-branch-'+ node.node_id; + // manipulate the existing elements, if any + var circle = paper.getById(nodeCircleElementID); + var label = paper.getById(nodeLabelElementID); + var spine = paper.getById(nodeSpineElementID); + var triggerBranch = paper.getById(nodeTriggerBranchElementID); + var visibleBranch = paper.getById(nodeVisibleBranchElementID); + + // use standard reckoning for node's X coordinate + node.x = this.xOffset - (this.nodesWidth * node.treeColumn); + + var dlCount = node.displayList.length; + for (var i = 0; i < dlCount; i++) { + var dlChild = node.displayList[i]; + if (dlChild instanceof ArgusNode) { + argusObj.drawNode({ + "node": dlChild, + "domSource": domSource, + "curLeaf": curLeaf, + "isTargetNode": false, + "parentNodeX": node.x, + "currentYoffset": currentYoffset, + "depthFromTargetNode": depthFromTargetNode + 1 + }); + currentYoffset = dlChild.displayBounds.bottomY; + } else if (dlChild instanceof ArgusCluster) { + argusObj.drawCluster({ + "cluster": dlChild, + "clusterPosition": $.inArray(dlChild, node.getClusters()), // returns index + "domSource": domSource, + "parentNodeX": node.x, + "parentNodeExtinct": node.isExtinct(), + "currentYoffset": currentYoffset, + "depthFromTargetNode": depthFromTargetNode + }); + currentYoffset = dlChild.displayBounds.bottomY; + } else { + // something else? let's check it out... + console.log("ERROR: unexpected thing in displayList for '"+ node.name +"': "+ typeof(dlChild)); + ///debugger; + } + } + + var bounds; + if (dlCount === 0) { + node.y = currentYoffset + (this.nodeHeight / 2); + bounds = node.updateDisplayBounds(); + } else { + // now that we know the layout of its children, create (or update) this node + bounds = node.updateDisplayBounds(); + node.y = bounds.middleY; // average of display children's Y coords + } + + // temporary marking to test flow of recursion + ///node.name += (" ["+ tempCounter++ +"]"); + + // draw the main circle for this node + if (node.isLocalLeafNode()) { + node.r = node.isActualLeafNode() ? (this.minTipRadius * 0.7) : this.minTipRadius; + } else { + node.r = this.minTipRadius + this.nodeDiamScalar * Math.log(node.num_tips); + } + var nodeFill = node.isExtinct() ? this.extinctNodeColor : this.nodeColor; + var nodeStroke = node.isExtinct() ? this.extinctPathColor : this.pathColor; + // override for special cases + if (node.isActualLeafNode()) { + nodeFill = node.isExtinct() ? this.extinctNodeColor : this.actualLeafColor; + nodeStroke = this.bgColor; + } else if (node.isVisibleLeafNode()) { + nodeFill = this.visibleLeafColor; + } else if (isTargetNode) { + // add special styles for this? + } + if (circle) { + // update the existing circle + circle.attr({ + 'cx': node.x, + 'cy': node.y + }); + } else { + // create the new circle + circle = paper.circle( node.x, node.y, node.r).attr({ + "fill": nodeFill, + "title": "Click to move to this node", + "stroke": nodeStroke + }).insertBefore(dividerBeforeAnchoredUI); + circle.id = (nodeCircleElementID); + + // insert hover handler (node properties and navigation triggers) + circle.hover(getHoverHandlerNodeAndEdge('OVER', circle, { + "fill": this.nodeHoverColor + }), getHoverHandlerNodeAndEdge('OUT', circle, { + "fill": nodeFill + })); + + $(circle.node).on('click contextmenu', getClickHandlerNode(node.node_id, domSource, node.name)); + // copy source data into the circle element (for use by highlight) + circle.data('sourceNodeInfo', { + 'nodeID': node.node_id, + 'nodeName': node.name, + 'domSource': domSource + }); + + // if this node has cycles, record it; we will draw them once the tree is done + var nAltParents = (node.altrels === undefined ? 0 : node.altrels.length); + if (nAltParents > 0) { + this.nodesWithCycles.push(node.node_id); + } + // store the node for fast access later + this.nodesHash[node.node_id] = node; + } + + // label position varies based on which column we're in + var labelX, labelY, labelAnchor; + if (node.isLocalLeafNode()) { + labelX = node.x + this.xLabelMargin; + labelY = node.y; + labelAnchor = 'start'; + } else { + labelX = node.x - (node.r + 0.5); + labelY = node.y + (node.r + 0.5); + labelAnchor = 'end'; + } + + if (label) { + // update the existing label + label.attr({ + 'x': labelX, + 'y': labelY, + 'text': node.name + }); + } else { + // create the new label + var displayLabel; + if (node.isLocalLeafNode()) { + // always show labels for leaf nodes (in this view) + displayLabel = node.name; + } else { + // hide synthetic/compound node labels for internal (in this view) nodes + var compoundNodeNameDelimiter = ' + '; + var compoundNodeNamePrefix = '['; + var compoundNodeNameSuffix = ']'; + // N.B. this is determined using vars above, COPIED from treeview.js! + var isCompoundNodeName = ((typeof node.name === 'string') && + (node.name.indexOf(compoundNodeNameDelimiter) !== -1) && + (node.name.indexOf(compoundNodeNamePrefix) === 0) && + (node.name.indexOf(compoundNodeNameSuffix) === (node.name.length -1))); + displayLabel = (isCompoundNodeName ? '' : node.name || ''); + } + if (node.isExtinct()) { + if (labelAnchor === 'start') { + displayLabel = this.markLabelAsExtinct(displayLabel, 'LEADING'); + } else { + displayLabel = this.markLabelAsExtinct(displayLabel, 'TRAILING'); + } + } + label = paper.text(labelX, labelY, displayLabel).attr({ + 'text-anchor': labelAnchor, + "title": displayLabel, + "fill": node.isExtinct() ? this.extinctLabelColor : this.labelColor, + "font-size": fontSize + }).insertBefore(dividerBeforeHighlights); + label.id = (nodeLabelElementID); + } + + // create/update spine, if there are multiple display children + if (node.displayList.length > 1) { + var spineSt = "M" + node.x + " " + node.displayBounds.firstChildY + + "L" + node.x + " " + node.displayBounds.lastChildY; + + if (spine) { + // update the existing label + spine.attr({ + 'path': spineSt + }); + } else { + // create the new spine + spine = paper.path(spineSt).toBack().attr({ + "stroke": node.isExtinct() ? this.extinctPathColor : this.pathColor, + "stroke-linecap": 'round' + }).insertBefore(dividerBeforeLabels) + .id = (nodeSpineElementID); + } + } + + if (!isTargetNode) { + // draw/update its "upward" branch to the parent's spine + // TODO: nudge (vs create) if this already exists! + var lineDashes, lineColor, + //sb = node.supported_by, + sb = getSupportingSourceIDs(node), + supportedByTaxonomy = argus.supportingTaxonomyVersion in sb, + supportedByPhylogeny = Object.keys(sb).length > (supportedByTaxonomy ? 1 : 0); + + if (supportedByTaxonomy && supportedByPhylogeny) { + //lineDashes = '--..'; + lineDashes = ''; + lineColor = node.isExtinct() ? this.extinctPathColor : this.strongPathColor; + } else if (supportedByPhylogeny){ + lineDashes = ''; + lineColor = node.isExtinct() ? this.extinctPathColor : this.strongPathColor; + } else if (supportedByTaxonomy){ + lineDashes = '- '; + lineColor = node.isExtinct() ? this.extinctPathColor : this.pathColor; + } else { + lineDashes = '--..'; + lineColor = 'orange'; + } + + var branchSt = "M" + parentNodeX + " " + node.y + "L" + node.x + " " + node.y; + + if (triggerBranch && visibleBranch) { + // update the existing elements + triggerBranch.attr({ + 'path': branchSt + }); + visibleBranch.attr({ + 'path': branchSt + }); + } else { + // draw a wide, invisible path to detect mouse-over + triggerBranch = paper.path(branchSt).toBack().attr({ + "stroke-width": 5, + "stroke-linecap": 'butt', + "stroke": this.bgColor + }).insertAfter(dividerBeforeEdges); + triggerBranch.id = (nodeTriggerBranchElementID); + // NOTE that these are pushed behind all visible paths! + + // ... and a congruent, visible path + visibleBranch = paper.path(branchSt).toBack().attr({ + "stroke-width": 1, + "stroke-linecap": (lineDashes === '.') || (lineDashes === '--..') || (lineDashes === '--.') ? 'butt' : 'round', // avoids Chrome bug with dotted lines + round caps + "stroke-dasharray": lineDashes, + "stroke": node.isExtinct() ? this.extinctPathColor : this.pathColor + }).insertBefore(dividerBeforeLabels); + visibleBranch.id = (nodeVisibleBranchElementID); + + // assign hover behaviors + triggerBranch.hover(getHoverHandlerNodeAndEdge('OVER', triggerBranch, {}), getHoverHandlerNodeAndEdge('OUT', triggerBranch, {})); + + // copy node data into the path element (for use by highlight) + triggerBranch.data('sourceNodeInfo', { + 'nodeID': node.node_id, + 'nodeName': node.name, + 'domSource': domSource + }); + } + } + if (isTargetNode) { + // draw a series of ancestor nodes + this.targetNodeY = node.y; + + if (node.lineage) { + // try to draw upward path w/ up to 3 nodes, plus trailing edge if there's more + var upwardNode; + var maxUpwardNodes = 3; + var alphaStep = 0.15; + var xyStep = 25; + for (i = 0; i < node.lineage.length; i++) { + var startX = node.x - (xyStep * i); + var startY = node.y - (xyStep * i); + var endX = startX - xyStep; + var endY = startY - xyStep; + var pathOpacity = 1.0 - (alphaStep * (i+1)); + var ancestorNode = node.lineage[i]; + // build IDs for visible elements (to move or create) + nodeCircleElementID = 'node-circle-'+ ancestorNode.node_id; + nodeLabelElementID = 'node-label-'+ ancestorNode.node_id; + var nodeBranchElementID = 'node-branch-'+ ancestorNode.node_id; + // manipulate the existing elements, if any + circle = paper.getById(nodeCircleElementID); + label = paper.getById(nodeLabelElementID); + var branch = paper.getById(nodeBranchElementID); + + var upwardSt = "M" + startX+ "," + startY + "L" + endX + " " + endY; + if (branch) { + // update the existing branch + branch.attr({ + 'path': upwardSt + }); + } else { + // create the new branch + branch = paper.path(upwardSt).toBack().attr({ + "stroke": node.isExtinct() ? this.extinctPathColor : this.pathColor, + "stroke-linecap": 'butt', // REQUIRED if stroke-dasharray is '.' + "stroke-dasharray": '. ', + "opacity": pathOpacity + }).insertBefore(dividerBeforeLabels); + branch.id = (nodeBranchElementID); + } + + if (i < maxUpwardNodes) { + // draw node circle and label + labelX = endX - (this.minTipRadius * 1.25); + labelY = endY + (this.minTipRadius * 1.25); + if (circle && label) { + // update the existing circle and label + circle.attr({ + 'cx': endX, + 'cy': endY + }); + label.attr({ + 'x': labelX, + 'y': labelY + }); + + } else { + // create the new circle and label + circle = paper.circle(endX, endY, this.minTipRadius).attr({ + "fill": ancestorNode.isExtinct() ? this.extinctNodeColor : this.nodeColor, + "title": "Click to move to this node", + "stroke": ancestorNode.isExtinct() ? this.extinctPathColor : this.pathColor + }).insertBefore(dividerBeforeAnchoredUI); + circle.id = (nodeCircleElementID); + var displayLabel = (ancestorNode.name || ""); + if (ancestorNode.isExtinct()) { + displayLabel = this.markLabelAsExtinct(displayLabel, 'TRAILING'); + } + label = paper.text(labelX, labelY, displayLabel).attr({ + 'text-anchor': 'end', + "title": displayLabel, + "fill": ancestorNode.isExtinct() ? this.extinctLabelColor :this.labelColor, + "font-size": fontSize + }).insertBefore(dividerBeforeHighlights); + label.id = (nodeLabelElementID); + + // add handlers and metadata + $(circle.node).bind('click contextmenu', getClickHandlerNode(ancestorNode.node_id, domSource, ancestorNode.name)); + // copy source data into the circle element (for use by highlight) + circle.data('sourceNodeInfo', { + 'nodeID': ancestorNode.node_id, + 'nodeName': ancestorNode.name, + 'domSource': domSource + }); + circle.hover(getHoverHandlerNodeAndEdge('OVER', circle, { + "fill": this.nodeHoverColor + }), getHoverHandlerNodeAndEdge('OUT', circle, { + "fill": ancestorNode.isExtinct() ? this.extinctNodeColor : this.nodeColor + })); + } + + } + + if (i === maxUpwardNodes) { + break; // we've drawn a final path bit, now we're done + } + } + + } + } + } + + // add dagger † before (or after) the label of an extinct node + argusObj.markLabelAsExtinct = function(label, leadingOrTrailing) { + if ($.trim(label) === "") { + return ""; + } + if (leadingOrTrailing === 'TRAILING') { + return (label + this.trailingDagger); + } else { + return (this.leadingDagger + label); + } + }; + + argusObj.drawCluster = function (obj) { + var cluster = obj.cluster; + var parentNodeID = cluster.parentNodeID; + var parentNodeX = obj.parentNodeX; + var parentNodeExtinct = obj.parentNodeExtinct; + var depthFromTargetNode = obj.depthFromTargetNode; + var currentYoffset = obj.currentYoffset; + var clusterPosition = obj.clusterPosition; + var domSource = obj.domSource; + // build IDs for visible elements (to move or create) + var clusterBranchElementID = 'min-cluster-branch-'+ parentNodeID +'-'+ clusterPosition; + var clusterBoxElementID = 'min-cluster-box-'+ parentNodeID +'-'+ clusterPosition; + var clusterLabelElementID = 'min-cluster-label-'+ parentNodeID +'-'+ clusterPosition; + // manipulate the existing elements, if any + var branch = paper.getById(clusterBranchElementID); + var box = paper.getById(clusterBoxElementID); + var label = paper.getById(clusterLabelElementID); + + cluster.x = parentNodeX; + // match its parent node, useful when expanding cluster + var clusterLeftEdge = cluster.x + (this.nodesWidth / 3.0); + cluster.y = currentYoffset + (this.nodeHeight * 1.0); + var fontSize = this.minTipRadius * this.fontScalar; + // draw a short branch out to this cluster + var branchSt = "M" + parentNodeX + " " + cluster.y + "L" + clusterLeftEdge + " " + cluster.y; + if (branch) { + // update the existing path + branch.attr({ + 'path': branchSt + }); + } else { + // create the new path + branch = paper.path(branchSt).toBack().attr({ + "stroke-width": 1, + "stroke-linecap": 'butt', // REQUIRED if stroke-dasharray is '.' + "stroke-dasharray": '. ', + "stroke": parentNodeExtinct ? this.extinctPathColor : this.pathColor + }).insertBefore(dividerBeforeLabels); + branch.id = (clusterBranchElementID); + } + + if (box && label) { + // update the existing box and label + box.attr({ + 'x': clusterLeftEdge, + 'y': cluster.y - (this.nodeHeight / 2.0) + }); + label.attr({ + 'x': clusterLeftEdge + 8, + 'y': cluster.y + }); + } else { + // Draw the cluster label, then a surrounding shape (a lozenge that can hold 'Aaa - Zzz')? + var minimizedCluster = paper.set().insertAfter(dividerBeforeLabels); + // NOTE that we can't set (or retrieve) an ID on a Raphael set... + + // draw the cluster label + var clusterLabel = "more... ("+ cluster.firstName +" - "+ cluster.lastName +")"; + label = paper.text(clusterLeftEdge + 8, cluster.y - (this.nodeHeight * 0.0), clusterLabel).attr({ + 'text-anchor': 'start', + "title": clusterLabel, + "fill": parentNodeExtinct ? this.extinctLabelColor : this.labelColor, + "font-size": fontSize, + "cursor": "pointer" + }); + label.id = (clusterLabelElementID); + minimizedCluster.push(label); + + // draw the surrounding shape (appears on mouseover) + var defaultBoxWidth = this.nodesWidth * 3.5; + var minBoxWidth = label.getBBox().width + 16; + var boxWidth = Math.max(defaultBoxWidth, minBoxWidth); + box = paper.rect(clusterLeftEdge, cluster.y - (this.nodeHeight * 0.55), boxWidth, this.nodeHeight * 1.2).attr({ + "stroke": this.bgColor, + "stroke-width": 1, + "stroke-dasharray": '.', + "fill": this.bgColor, + "r": 4, // rounded corner (radius) + "cursor": "pointer" + }); + box.id = (clusterBoxElementID); + minimizedCluster.push(box); + label.toFront(); // else it's hidden behind the lozenge! + + // assign behaviors to replace the minimized cluster with its nodes + var minimizedClusterParts = [branch, minimizedCluster]; + minimizedCluster.click(getClickHandlerCluster( + minimizedClusterParts, + parentNodeID, + clusterPosition, + depthFromTargetNode, + domSource, + currentYoffset + )); + minimizedCluster.hover(getHoverHandlerCluster('OVER', + box, { "fill": this.nodeColor }, + label, { "fill": 'white' } + ), getHoverHandlerCluster('OUT', + box, { "fill": this.bgColor }, + label, { "fill": this.labelColor } + )); + } + cluster.updateDisplayBounds(); + } + + argusObj.drawTree = function(obj) { + // (re)draw the entire tree, starting from the target (local root) node + + // TODO: reset paper dimensions? + + this.yOffset = this.yOffsetDefault; + // TODO: modify this (as above) based on changing paper dimensions? + + var targetNode = this.treeData; + this.drawNode({ + "node": targetNode, + "domSource": this.domSource, + "curLeaf": 0, + "isTargetNode": true, + "parentNodeX": this.xOffset - (this.nodesWidth * targetNode.treeColumn), // * node.max_node_depth), + "currentYoffset": this.yOffset, + "depthFromTargetNode": 0 + }); + } + + argusObj.drawCycles = function () { + var curNub; + var tx, ty, i, j, child, cx, cy, nub; + var naltparents; + var parent, px, py, offset, dst1, dst2, dln1, dln2; + var togglelabel, togglebox, backStackPointer, forwardStackPointer, body; + var sst, altrelline, dln; + var bw, bh, altrellabel, altrellabelbox, altrellabeltext; + var x1, y1, y2; + var getClickHandlerAltRelLine; + var getHoverHandlerAltRelLineShow; + var getHoverHandlerAltRelLineHide; + var toggleAltRels; + var getNubLinkHoverHandler; + var getInfoBoxHoverHandlerShow, getInfoBoxHoverHandlerHide; + var infobox, nublabelbox, nublinks, linktext, thislink; + var fontSize = this.minTipRadius * this.fontScalar; + var curAltRel, curShowAltRelFn, curHideAltRelFn; + var altRelLineAttr = { + "stroke": this.altRelColor + }; + var altrelsset = paper.set(); + altrelsset.hidden = false; + + // create closure so we can affect properties when we hover in/out + getHoverHandlerAltRelLineShow = function (linetomodify, label, attributes) { + return function () { + linetomodify.attr(attributes); + label.show().toFront(); + }; + }; + + getHoverHandlerAltRelLineHide = function (linetomodify, label, attributes) { + return function () { + linetomodify.attr(attributes); + label.hide(); + }; + }; + + toggleAltRels = function (altrels) { + return function () { + if (altrels.hidden) { + altrels.show(); + altrels.hidden = false; + } else { + altrels.hide(); + altrels.hidden = true; + } + }; + }; + getNubLinkHoverHandler = function (nublinktomodify, attributes) { + return function () { + nublinktomodify.attr(attributes); + }; + }; + getInfoBoxHoverHandlerShow = function (cSet) { + return function () { + cSet.show(); + // bring the box to the front of the page + cSet[1].toFront(); + // put the links in front of the box + cSet[0].toFront(); + }; + }; + + getInfoBoxHoverHandlerHide = function (cSet) { + return function () { + cSet.hide(); + }; + }; + + // gather controls that should move together + if (!argusObj.anchoredControls) { + argusObj.anchoredControls = paper.set(); + } + + var conflictsInView = this.nodesWithCycles.length > 0; + if (conflictsInView) { + argusObj.getToggleConflictsHandler = function() { + return function() { + toggleAltRels(altrelsset); + } + }; + } else { + // disable (hide?) the toggle gadget + argusObj.getToggleConflictsHandler = function() { + return null; + }; + } + + /* + tx = this.toggleAltBoxX; + ty = this.toggleAltBoxY; + + var conflictLabel = "Show or hide conflicting relationships in this view"; + var disabledConflictLabel = "No conflicting relationships in this view"; + var toggleHeight = this.nodeHeight * 1.5; + togglebox = paper.rect(tx, ty, this.nodesWidth, toggleHeight).attr({ + "stroke": "black", + "stroke-width": 1, + "fill": this.bgColor, + "fill-opacity": 0.6, + "r": 4, // rounded corner (radius) + "cursor": "pointer", + "title": (conflictsInView) ? conflictLabel : disabledConflictLabel, + "opacity": (conflictsInView) ? 1.0 : 0.4 + }).insertAfter(dividerBeforeAnchoredUI) + .click(toggleAltRels(altrelsset)); + + argusObj.anchoredControls.push(togglebox); + + togglelabel = paper.text(tx + (this.nodesWidth/2), + ty + (toggleHeight / 2), + "Toggle conflicts").attr({ + "cursor": "pointer", + "text-anchor": "middle", + "font-size": fontSize, + "title": (conflictsInView) ? conflictLabel : disabledConflictLabel, + "opacity": (conflictsInView) ? 1.0 : 0.4 + }).insertAfter(dividerBeforeAnchoredUI); + + // label on top needs identical action as box + togglelabel.click(toggleAltRels(altrelsset)); + argusObj.anchoredControls.push(togglelabel); + */ + + /* These are just under-powered history, remove them for now.. + // add clickable Back and Forward pointers (now redundant with browser Back/Fwd buttons) + backStackPointer = forwardStackPointer = null; + backStackPointer = paper.path("M21.871,9.814 15.684,16.001 21.871,22.188 18.335,25.725 8.612,16.001 18.335,6.276z") + .attr({ + fill: "#000", + stroke: "none", + cursor: "pointer", + title: (argusObj.backStack.length > 0) ? "Show the previous view in history" : "No previous views in history", + opacity: (argusObj.backStack.length > 0) ? 1.0 : 0.3 + }); + if (argusObj.backStack.length > 0) { + backStackPointer.click(getBackClickHandler()); + } + argusObj.anchoredControls.push(backStackPointer); + + forwardStackPointer = paper.path("M30.129,22.186 36.316,15.999 30.129,9.812 33.665,6.276 43.389,15.999 33.665,25.725z") + .attr({ + fill: "#000", + stroke: "none", + cursor: "pointer", + title: (argusObj.forwardStack.length > 0) ? "Show the next view in history" : "No later views in history", + opacity: (argusObj.forwardStack.length > 0) ? 1.0 : 0.3 + }); + if (argusObj.forwardStack.length > 0) { + forwardStackPointer.click(getForwardClickHandler()); + } + argusObj.anchoredControls.push(forwardStackPointer); + */ + + /* Let's try to anchor some widgets in the upper left corner of the + * argus viewport. That means it needs to track the scroll of the + * viewport (container) instead of the page body. + */ + var $argusContainer = $(this.container); + $argusContainer.bind("scroll", function () { + // use relative transformation to match the viewport's X/Y scrolling + argusObj.anchoredControls.transform('t' + $argusContainer.scrollLeft() + ',' + $argusContainer.scrollTop()); + argusObj.anchoredControls.toFront(); + }); + // center the view on the target node + $argusContainer.scrollTop((this.targetNodeY) - ($argusContainer.height() / 2)); + + // disable default right-click behavior in the argus view + $argusContainer.bind("contextmenu", function (e) { + e.preventDefault(); + return false; + }); + + // for each node found to have more than one parent + for (i = 0; i < this.nodesWithCycles.length; i++) { + + // this node is the child + child = this.nodesHash[this.nodesWithCycles[i]]; + cx = child.x; + cy = child.y; + + // initialize nub object; it will contain links to topologies not present in the current tree + nub = {}; + nub.nodes = []; + + // for each alternative parent + naltparents = child.altrels.length; + for (j = 0; j < naltparents; j++) { + // try to find this parent in the current tree + curAltRel = child.altrels[j]; + parent = this.nodesHash[curAltRel.parentid]; + if (parent === undefined) { + // if the parent isn't in this tree, put it in the nub + nub.nodes.push(curAltRel); + } else { + // the parent is in the tree; get its coordinates + px = parent.x; + py = parent.y; + + // if the parent and child are vertically aligned, draw an offset line between them + if (px === cx) { + x1 = cx - this.minTipRadius; + if (py > cy) { + offset = Math.abs(cx - x1); + y1 = cy + offset; + y2 = py - offset; + } else { + offset = Math.abs(cx - x1); + y1 = cy - offset; + y2 = py + offset; + } + + // short diagonal connectors + dst1 = "M" + cx + " " + cy + "L" + x1 + " " + y1; + dst2 = "M" + x1 + " " + y2 + "L" + px + " " + py; + dln1 = paper.path(dst1).attr(altRelLineAttr); + dln2 = paper.path(dst2).attr(altRelLineAttr); + altrelsset.push(dln1); + altrelsset.push(dln2); + + // main vertical line + sst = "M" + x1 + " " + y1 + "L" + x1 + " " + y2; + altrelline = paper.path(sst).attr(altRelLineAttr); + + // if the parent and child are not vertically aligned, draw a straight line between them + } else { + dln = "M" + cx + " " + cy + "L" + px + " " + py; + altrelline = paper.path(dln).attr(altRelLineAttr); + } + altrelsset.push(altrelline); + + bw = 60; + bh = this.nodeHeight; + + altrellabel = paper.set(); + altrellabelbox = paper.rect((cx + px) / 2 - bw / 2, + (cy + py) / 2 - bh / 2, + bw, + bh).attr({ + "stroke": "black", + "fill": "white" + }).hide(); + altrellabeltext = paper.text((cx + px) / 2, + (cy + py) / 2, + curAltRel.source).attr({ + "font-size": fontSize + }).hide(); + altrellabel.push(altrellabelbox); + altrellabel.push(altrellabeltext); + curShowAltRelFn = getHoverHandlerAltRelLineShow(altrelline, + altrellabel, + {"stroke-width": 3 + }); + curHideAltRelFn = getHoverHandlerAltRelLineHide(altrelline, + altrellabel, + {"stroke-width": 1 + }); + altrelline.hover(curShowAltRelFn, curHideAltRelFn).click( + getClickHandlerAltRelLine(curAltRel) + ); + } + } + + // if there are parents not in the current tree, create a nub to represent them + if (nub.nodes.length > 0) { + // draw the nub + nub.x = cx - (this.minTipRadius * this.nubDistScalar); + nub.y = cy + (this.minTipRadius * this.nubDistScalar); + nub.line = "M" + cx + " " + cy + "L" + nub.x + " " + nub.y; + nub.dbr1 = paper.path(nub.line).attr(altRelLineAttr); + nub.circle = paper.circle(nub.x, nub.y, this.minTipRadius).attr({ + "fill": this.altPColor, + "stroke": this.pathColor + }); + + // calc geometry for the nub info box, which contains links to alt topologies + infobox = paper.set(); + infobox.w = this.nodesWidth * 2 + (this.xLabelMargin * 2); + infobox.h = this.nodeHeight * (nub.nodes.length + 1); + infobox.x = nub.x - infobox.w; + infobox.y = nub.y; + // draw the info box container + nublabelbox = paper.rect(infobox.x, infobox.y, infobox.w, infobox.h).attr({ + "fill": "white" + }); + // generate links for the infobox; use a paper.set object so we can easily toggle transparency + nublinks = paper.set(); + for (j = 0; j < nub.nodes.length; j++) { + curNub = nub.nodes[j]; + // the link labels are the names of the corresponding sources + linktext = curNub.parentname + " > " + curNub.source; + // links are drawn in a vertical sequence within the infobox container + thislink = paper.text(infobox.x + this.xLabelMargin, + (infobox.y + j) * this.nodeHeight, + linktext).attr({ + "text-anchor": "start", + "fill": this.labelColor, + "font-size": fontSize + }).click(getClickHandlerAltRelLine(curNub)); + // assign hover behaviors + thislink.hover(getNubLinkHoverHandler(thislink, { + "fill": this.altPLinkColor + }), getNubLinkHoverHandler(thislink, { + "fill": "black" + })); + + nublinks.push(thislink); + } + + // add links and infobox container to the infobox object, hide it from view + infobox.push(nublinks); + infobox.push(nublabelbox); + infobox.hide(); + // assign behaviors + nub.circle.hover(getInfoBoxHoverHandlerShow(infobox), + getInfoBoxHoverHandlerHide(infobox) + ); + infobox.hover(getInfoBoxHoverHandlerShow(infobox), + getInfoBoxHoverHandlerHide(infobox) + ); + } + } + }; + return argusObj; +} + +Array.prototype.average = function () { + "use strict"; + var sum = 0; + var count = 0; + var len = this.length; + var i; + for (i = 0; i < len; i++) { + sum += this[i]; + count++; + } + return sum / count; +}; + +function alphaSortByName(a,b) { + var aName = a.name.toLowerCase(), + bName = b.name.toLowerCase(); + if (aName > bName) return 1; + if (aName < bName) return -1; + return 0; +} +function sortByDescendantCount(a,b) { + if (a.num_tips > b.num_tips) return 1; + if (a.num_tips < b.num_tips) return -1; + return 0; +} + +/* Let's deserialize tree-view JSON elements into useful pseudo-classes. This should + * simplify management of dynamic layouts, clustering, etc. + */ +function ArgusNode() { // constructor + // maintain ordered-and-clustered contents? + this.nodeDepth = 0; // 0 = root node, higher for descendants + this.treeColumn = 0; // 0 = rightmost (leaf nodes), higher = further left + this.displayList = [ ]; // refs to visible nodes and clusters (minimized cluster, or its expanded nodes) + this.clusters = [ ]; + this.supportedByTaxonomy = false; + this.supportedByPhylogeny = false; + // parent IDs will be set during reviver sweep of tree-view JSON + this.parentNodeID = null; + // display bounds (mine and my children's) will be set during drawNode + this.displayBounds = null; + // X/Y coords will be set during drawNode + this.x = 0; + this.y = 0; +}; +ArgusNode.prototype.getClusters = function() { + return argus.clusters[this.node_id] || [ ]; +}; +ArgusNode.prototype.isLocalLeafNode = function() { + return (typeof this.children === 'undefined'); +}; +ArgusNode.prototype.isActualLeafNode = function() { + return this.num_tips === 0; +}; +ArgusNode.prototype.isExtinct = function() { + if (typeof this.extinct === 'undefined') { + return false; // allow parsimony (omit property for non-extinct nodes) + } + return (this.extinct === true); +}; +ArgusNode.prototype.isVisibleLeafNode = function() { + return this.hasChildren === false || this.num_tips_in_view === 0; +}; +ArgusNode.prototype.updateDisplayBounds = function() { + // update my layout properties and store results (for faster access) + var topY = this.y - (argus.nodeHeight / 2), + firstChildY = this.y, + lastChildY = this.y, + bottomY = this.y + (argus.nodeHeight / 2), + middleY = this.y; + + if (this.displayList) { + var displayListCount = this.displayList.length; + if (displayListCount > 0) { + // this should override the minimal bounds above + topY = 1000000; // an implausibly high number + bottomY = 0; + for (var i = 0; i < displayListCount; i++) { + var testChild = this.displayList[i]; + topY = Math.min(topY, testChild.displayBounds.topY); + bottomY = Math.max(bottomY, testChild.displayBounds.bottomY); + if (i === 0) { + firstChildY = testChild.y; + } + if (i === displayListCount - 1) { + lastChildY = testChild.y; + } + } + middleY = (bottomY + topY) / 2; + } + } + this.displayBounds = { + topY: topY, + firstChildY: firstChildY, + lastChildY: lastChildY, + bottomY: bottomY, + middleY: middleY + }; + return this.displayBounds; +}; + +function ArgusCluster() { // constructor + this.nodes = [ ]; + // each cluster is either minimized (default) or expanded + this.expanded = false; + // parent ID will be set on creation + this.parentNodeID = null; + // display bounds (minimized cluster) will be set during drawNode + this.displayBounds = null; + // X/Y coords (minimized cluster) will be set during drawNode + this.x = 0; + this.y = 0; +}; +ArgusCluster.prototype.updateDisplayBounds = function() { + // update my layout properties and store results (for faster access) + this.displayBounds = { + topY: this.y - (argus.nodeHeight * 0.7), + bottomY: this.y + (argus.nodeHeight * 1.0) + }; + return this.displayBounds; +}; + +function loadConflictingTreeDetails(studyID, treeID, conflictDetailsPanelID) { + /* Fetch details (esp. names) about a conflicting tree; + * update the UI once we have the data. + */ + var studyURL = '/curator/study/view/{STUDY_ID}/'.replace('{STUDY_ID}', studyID); + var conflictURL = studyURL + '?tab=trees&tree={TREE_ID}&conflict=ott'.replace('{TREE_ID}', treeID); + // One AJAX fetch per tree + $.post( + singlePropertySearchForTrees_url, // JSON fetch URL + JSON.stringify({ // POSTed data + "property": "ot:studyId", + "value": studyID, + verbose: true + }), + function(data) { // JSONP callback + var $detailsPanel = $('#'+ conflictDetailsPanelID); + try { + var studyInfo = data.matched_studies[0]; + var treeInfo = $.grep(studyInfo.matched_trees, function(treeInfo) { + return (treeInfo['ot:treeId'] === treeID); + })[0]; + var treeName = treeInfo['@label'] || ('Untitled ('+ treeInfo['ot:treeId'] +')'); + console.warn(treeName); + detailsPanelHTML = 'Conflicting tree \''+ treeName +'\'
' + + 'Show this tree\'s conflicts in the study curation tool
' + + '
'+ studyInfo['ot:studyPublicationReference']
+                  + ' '+ studyInfo['ot:studyPublication'] +'
'; + //+ 'Show this study (all trees) in a new window
'; + $detailsPanel.html(detailsPanelHTML); + console.log( $detailsPanel.length +' panels updated.'); + // clobber the initial raw link, since we have somethign nicer + $detailsPanel.prev('a').remove(); + } catch(e) { + $detailsPanel.html('ERROR loading details for this conflicting tree!'); + } + } + ); + console.warn("ALL DONE?"); +} + +function getClientBoundingBox( elementSet ) { + // Takes a RaphaelJS element set, reckons its full bounding box in + // page/client coordinates. + var bbox = { + x: Number.MAX_VALUE, + y: Number.MAX_VALUE, + x2: Number.MIN_VALUE, + y2: Number.MIN_VALUE + }; + elementSet.forEach(function(e) { + var el = e[0]; + var rect = el.getBoundingClientRect(); + bbox.x = Math.min(bbox.x, rect.left); + bbox.x2 = Math.max(bbox.x2, rect.right); + bbox.y = Math.min(bbox.y, rect.top); + bbox.y2 = Math.max(bbox.y2, rect.bottom); + }); + bbox.width = bbox.x2 - bbox.x; + bbox.height = bbox.y2 - bbox.y; + return bbox; +} diff --git a/synthetic_tree_viewer/synthetic_tree_viewer/static/js/argus/format.css b/synthetic_tree_viewer/synthetic_tree_viewer/static/js/argus/format.css new file mode 100644 index 000000000..b5c5de4bd --- /dev/null +++ b/synthetic_tree_viewer/synthetic_tree_viewer/static/js/argus/format.css @@ -0,0 +1,47 @@ +body { + font-family: Arial, Helvetica, sans-serif; + +} input { + display: inline; + +} form { + display: inline; + +} .results { + list-style: none; + padding: 0; + margin: 0; + +} .results ul { + list-style: none; + padding: 0 0 0 12px; + margin: 0; + margin: 0 0 1.5em 0; + +} .results ul li { + display: block; + padding: 2px 0 2px 0; + margin: 0; + +} .results ul li span { + display: inline-block; + position: relative; + width: 8em; + padding: 0 0 0 1em; + +} .results ul li span.matchname { + width: 10em; + +} .highlight { + background: #fcf4ff; + +} .label { + font-weight: bold; + font-size: 0.9em; + color: #999; + padding: 0em 0 0.5em 0; + +} #treesearch { + padding: 1em 0 0 0; + +} diff --git a/synthetic_tree_viewer/synthetic_tree_viewer/static/js/argus/index.html b/synthetic_tree_viewer/synthetic_tree_viewer/static/js/argus/index.html new file mode 100644 index 000000000..55fbc796e --- /dev/null +++ b/synthetic_tree_viewer/synthetic_tree_viewer/static/js/argus/index.html @@ -0,0 +1,30 @@ + + +Node start point select form + + + + + + + +
+

+ Search for taxonomic names (separate names with commas):
+ +

+
+
+

+ Enter a tree string to perform TNRS name-matching on its tips:
+
+ +

+
+ + + diff --git a/synthetic_tree_viewer/synthetic_tree_viewer/static/js/argus/jquery-1.7.2.min.js b/synthetic_tree_viewer/synthetic_tree_viewer/static/js/argus/jquery-1.7.2.min.js new file mode 100644 index 000000000..16ad06c5a --- /dev/null +++ b/synthetic_tree_viewer/synthetic_tree_viewer/static/js/argus/jquery-1.7.2.min.js @@ -0,0 +1,4 @@ +/*! jQuery v1.7.2 jquery.com | jquery.org/license */ +(function(a,b){function cy(a){return f.isWindow(a)?a:a.nodeType===9?a.defaultView||a.parentWindow:!1}function cu(a){if(!cj[a]){var b=c.body,d=f("<"+a+">").appendTo(b),e=d.css("display");d.remove();if(e==="none"||e===""){ck||(ck=c.createElement("iframe"),ck.frameBorder=ck.width=ck.height=0),b.appendChild(ck);if(!cl||!ck.createElement)cl=(ck.contentWindow||ck.contentDocument).document,cl.write((f.support.boxModel?"":"")+""),cl.close();d=cl.createElement(a),cl.body.appendChild(d),e=f.css(d,"display"),b.removeChild(ck)}cj[a]=e}return cj[a]}function ct(a,b){var c={};f.each(cp.concat.apply([],cp.slice(0,b)),function(){c[this]=a});return c}function cs(){cq=b}function cr(){setTimeout(cs,0);return cq=f.now()}function ci(){try{return new a.ActiveXObject("Microsoft.XMLHTTP")}catch(b){}}function ch(){try{return new a.XMLHttpRequest}catch(b){}}function cb(a,c){a.dataFilter&&(c=a.dataFilter(c,a.dataType));var d=a.dataTypes,e={},g,h,i=d.length,j,k=d[0],l,m,n,o,p;for(g=1;g0){if(c!=="border")for(;e=0===c})}function S(a){return!a||!a.parentNode||a.parentNode.nodeType===11}function K(){return!0}function J(){return!1}function n(a,b,c){var d=b+"defer",e=b+"queue",g=b+"mark",h=f._data(a,d);h&&(c==="queue"||!f._data(a,e))&&(c==="mark"||!f._data(a,g))&&setTimeout(function(){!f._data(a,e)&&!f._data(a,g)&&(f.removeData(a,d,!0),h.fire())},0)}function m(a){for(var b in a){if(b==="data"&&f.isEmptyObject(a[b]))continue;if(b!=="toJSON")return!1}return!0}function l(a,c,d){if(d===b&&a.nodeType===1){var e="data-"+c.replace(k,"-$1").toLowerCase();d=a.getAttribute(e);if(typeof d=="string"){try{d=d==="true"?!0:d==="false"?!1:d==="null"?null:f.isNumeric(d)?+d:j.test(d)?f.parseJSON(d):d}catch(g){}f.data(a,c,d)}else d=b}return d}function h(a){var b=g[a]={},c,d;a=a.split(/\s+/);for(c=0,d=a.length;c)[^>]*$|#([\w\-]*)$)/,j=/\S/,k=/^\s+/,l=/\s+$/,m=/^<(\w+)\s*\/?>(?:<\/\1>)?$/,n=/^[\],:{}\s]*$/,o=/\\(?:["\\\/bfnrt]|u[0-9a-fA-F]{4})/g,p=/"[^"\\\n\r]*"|true|false|null|-?\d+(?:\.\d*)?(?:[eE][+\-]?\d+)?/g,q=/(?:^|:|,)(?:\s*\[)+/g,r=/(webkit)[ \/]([\w.]+)/,s=/(opera)(?:.*version)?[ \/]([\w.]+)/,t=/(msie) ([\w.]+)/,u=/(mozilla)(?:.*? rv:([\w.]+))?/,v=/-([a-z]|[0-9])/ig,w=/^-ms-/,x=function(a,b){return(b+"").toUpperCase()},y=d.userAgent,z,A,B,C=Object.prototype.toString,D=Object.prototype.hasOwnProperty,E=Array.prototype.push,F=Array.prototype.slice,G=String.prototype.trim,H=Array.prototype.indexOf,I={};e.fn=e.prototype={constructor:e,init:function(a,d,f){var g,h,j,k;if(!a)return this;if(a.nodeType){this.context=this[0]=a,this.length=1;return this}if(a==="body"&&!d&&c.body){this.context=c,this[0]=c.body,this.selector=a,this.length=1;return this}if(typeof a=="string"){a.charAt(0)!=="<"||a.charAt(a.length-1)!==">"||a.length<3?g=i.exec(a):g=[null,a,null];if(g&&(g[1]||!d)){if(g[1]){d=d instanceof e?d[0]:d,k=d?d.ownerDocument||d:c,j=m.exec(a),j?e.isPlainObject(d)?(a=[c.createElement(j[1])],e.fn.attr.call(a,d,!0)):a=[k.createElement(j[1])]:(j=e.buildFragment([g[1]],[k]),a=(j.cacheable?e.clone(j.fragment):j.fragment).childNodes);return e.merge(this,a)}h=c.getElementById(g[2]);if(h&&h.parentNode){if(h.id!==g[2])return f.find(a);this.length=1,this[0]=h}this.context=c,this.selector=a;return this}return!d||d.jquery?(d||f).find(a):this.constructor(d).find(a)}if(e.isFunction(a))return f.ready(a);a.selector!==b&&(this.selector=a.selector,this.context=a.context);return e.makeArray(a,this)},selector:"",jquery:"1.7.2",length:0,size:function(){return this.length},toArray:function(){return F.call(this,0)},get:function(a){return a==null?this.toArray():a<0?this[this.length+a]:this[a]},pushStack:function(a,b,c){var d=this.constructor();e.isArray(a)?E.apply(d,a):e.merge(d,a),d.prevObject=this,d.context=this.context,b==="find"?d.selector=this.selector+(this.selector?" ":"")+c:b&&(d.selector=this.selector+"."+b+"("+c+")");return d},each:function(a,b){return e.each(this,a,b)},ready:function(a){e.bindReady(),A.add(a);return this},eq:function(a){a=+a;return a===-1?this.slice(a):this.slice(a,a+1)},first:function(){return this.eq(0)},last:function(){return this.eq(-1)},slice:function(){return this.pushStack(F.apply(this,arguments),"slice",F.call(arguments).join(","))},map:function(a){return this.pushStack(e.map(this,function(b,c){return a.call(b,c,b)}))},end:function(){return this.prevObject||this.constructor(null)},push:E,sort:[].sort,splice:[].splice},e.fn.init.prototype=e.fn,e.extend=e.fn.extend=function(){var a,c,d,f,g,h,i=arguments[0]||{},j=1,k=arguments.length,l=!1;typeof i=="boolean"&&(l=i,i=arguments[1]||{},j=2),typeof i!="object"&&!e.isFunction(i)&&(i={}),k===j&&(i=this,--j);for(;j0)return;A.fireWith(c,[e]),e.fn.trigger&&e(c).trigger("ready").off("ready")}},bindReady:function(){if(!A){A=e.Callbacks("once memory");if(c.readyState==="complete")return setTimeout(e.ready,1);if(c.addEventListener)c.addEventListener("DOMContentLoaded",B,!1),a.addEventListener("load",e.ready,!1);else if(c.attachEvent){c.attachEvent("onreadystatechange",B),a.attachEvent("onload",e.ready);var b=!1;try{b=a.frameElement==null}catch(d){}c.documentElement.doScroll&&b&&J()}}},isFunction:function(a){return e.type(a)==="function"},isArray:Array.isArray||function(a){return e.type(a)==="array"},isWindow:function(a){return a!=null&&a==a.window},isNumeric:function(a){return!isNaN(parseFloat(a))&&isFinite(a)},type:function(a){return a==null?String(a):I[C.call(a)]||"object"},isPlainObject:function(a){if(!a||e.type(a)!=="object"||a.nodeType||e.isWindow(a))return!1;try{if(a.constructor&&!D.call(a,"constructor")&&!D.call(a.constructor.prototype,"isPrototypeOf"))return!1}catch(c){return!1}var d;for(d in a);return d===b||D.call(a,d)},isEmptyObject:function(a){for(var b in a)return!1;return!0},error:function(a){throw new Error(a)},parseJSON:function(b){if(typeof b!="string"||!b)return null;b=e.trim(b);if(a.JSON&&a.JSON.parse)return a.JSON.parse(b);if(n.test(b.replace(o,"@").replace(p,"]").replace(q,"")))return(new Function("return "+b))();e.error("Invalid JSON: "+b)},parseXML:function(c){if(typeof c!="string"||!c)return null;var d,f;try{a.DOMParser?(f=new DOMParser,d=f.parseFromString(c,"text/xml")):(d=new ActiveXObject("Microsoft.XMLDOM"),d.async="false",d.loadXML(c))}catch(g){d=b}(!d||!d.documentElement||d.getElementsByTagName("parsererror").length)&&e.error("Invalid XML: "+c);return d},noop:function(){},globalEval:function(b){b&&j.test(b)&&(a.execScript||function(b){a.eval.call(a,b)})(b)},camelCase:function(a){return a.replace(w,"ms-").replace(v,x)},nodeName:function(a,b){return a.nodeName&&a.nodeName.toUpperCase()===b.toUpperCase()},each:function(a,c,d){var f,g=0,h=a.length,i=h===b||e.isFunction(a);if(d){if(i){for(f in a)if(c.apply(a[f],d)===!1)break}else for(;g0&&a[0]&&a[j-1]||j===0||e.isArray(a));if(k)for(;i1?i.call(arguments,0):b,j.notifyWith(k,e)}}function l(a){return function(c){b[a]=arguments.length>1?i.call(arguments,0):c,--g||j.resolveWith(j,b)}}var b=i.call(arguments,0),c=0,d=b.length,e=Array(d),g=d,h=d,j=d<=1&&a&&f.isFunction(a.promise)?a:f.Deferred(),k=j.promise();if(d>1){for(;c
a",d=p.getElementsByTagName("*"),e=p.getElementsByTagName("a")[0];if(!d||!d.length||!e)return{};g=c.createElement("select"),h=g.appendChild(c.createElement("option")),i=p.getElementsByTagName("input")[0],b={leadingWhitespace:p.firstChild.nodeType===3,tbody:!p.getElementsByTagName("tbody").length,htmlSerialize:!!p.getElementsByTagName("link").length,style:/top/.test(e.getAttribute("style")),hrefNormalized:e.getAttribute("href")==="/a",opacity:/^0.55/.test(e.style.opacity),cssFloat:!!e.style.cssFloat,checkOn:i.value==="on",optSelected:h.selected,getSetAttribute:p.className!=="t",enctype:!!c.createElement("form").enctype,html5Clone:c.createElement("nav").cloneNode(!0).outerHTML!=="<:nav>",submitBubbles:!0,changeBubbles:!0,focusinBubbles:!1,deleteExpando:!0,noCloneEvent:!0,inlineBlockNeedsLayout:!1,shrinkWrapBlocks:!1,reliableMarginRight:!0,pixelMargin:!0},f.boxModel=b.boxModel=c.compatMode==="CSS1Compat",i.checked=!0,b.noCloneChecked=i.cloneNode(!0).checked,g.disabled=!0,b.optDisabled=!h.disabled;try{delete p.test}catch(r){b.deleteExpando=!1}!p.addEventListener&&p.attachEvent&&p.fireEvent&&(p.attachEvent("onclick",function(){b.noCloneEvent=!1}),p.cloneNode(!0).fireEvent("onclick")),i=c.createElement("input"),i.value="t",i.setAttribute("type","radio"),b.radioValue=i.value==="t",i.setAttribute("checked","checked"),i.setAttribute("name","t"),p.appendChild(i),j=c.createDocumentFragment(),j.appendChild(p.lastChild),b.checkClone=j.cloneNode(!0).cloneNode(!0).lastChild.checked,b.appendChecked=i.checked,j.removeChild(i),j.appendChild(p);if(p.attachEvent)for(n in{submit:1,change:1,focusin:1})m="on"+n,o=m in p,o||(p.setAttribute(m,"return;"),o=typeof p[m]=="function"),b[n+"Bubbles"]=o;j.removeChild(p),j=g=h=p=i=null,f(function(){var d,e,g,h,i,j,l,m,n,q,r,s,t,u=c.getElementsByTagName("body")[0];!u||(m=1,t="padding:0;margin:0;border:",r="position:absolute;top:0;left:0;width:1px;height:1px;",s=t+"0;visibility:hidden;",n="style='"+r+t+"5px solid #000;",q="
"+""+"
",d=c.createElement("div"),d.style.cssText=s+"width:0;height:0;position:static;top:0;margin-top:"+m+"px",u.insertBefore(d,u.firstChild),p=c.createElement("div"),d.appendChild(p),p.innerHTML="
t
",k=p.getElementsByTagName("td"),o=k[0].offsetHeight===0,k[0].style.display="",k[1].style.display="none",b.reliableHiddenOffsets=o&&k[0].offsetHeight===0,a.getComputedStyle&&(p.innerHTML="",l=c.createElement("div"),l.style.width="0",l.style.marginRight="0",p.style.width="2px",p.appendChild(l),b.reliableMarginRight=(parseInt((a.getComputedStyle(l,null)||{marginRight:0}).marginRight,10)||0)===0),typeof p.style.zoom!="undefined"&&(p.innerHTML="",p.style.width=p.style.padding="1px",p.style.border=0,p.style.overflow="hidden",p.style.display="inline",p.style.zoom=1,b.inlineBlockNeedsLayout=p.offsetWidth===3,p.style.display="block",p.style.overflow="visible",p.innerHTML="
",b.shrinkWrapBlocks=p.offsetWidth!==3),p.style.cssText=r+s,p.innerHTML=q,e=p.firstChild,g=e.firstChild,i=e.nextSibling.firstChild.firstChild,j={doesNotAddBorder:g.offsetTop!==5,doesAddBorderForTableAndCells:i.offsetTop===5},g.style.position="fixed",g.style.top="20px",j.fixedPosition=g.offsetTop===20||g.offsetTop===15,g.style.position=g.style.top="",e.style.overflow="hidden",e.style.position="relative",j.subtractsBorderForOverflowNotVisible=g.offsetTop===-5,j.doesNotIncludeMarginInBodyOffset=u.offsetTop!==m,a.getComputedStyle&&(p.style.marginTop="1%",b.pixelMargin=(a.getComputedStyle(p,null)||{marginTop:0}).marginTop!=="1%"),typeof d.style.zoom!="undefined"&&(d.style.zoom=1),u.removeChild(d),l=p=d=null,f.extend(b,j))});return b}();var j=/^(?:\{.*\}|\[.*\])$/,k=/([A-Z])/g;f.extend({cache:{},uuid:0,expando:"jQuery"+(f.fn.jquery+Math.random()).replace(/\D/g,""),noData:{embed:!0,object:"clsid:D27CDB6E-AE6D-11cf-96B8-444553540000",applet:!0},hasData:function(a){a=a.nodeType?f.cache[a[f.expando]]:a[f.expando];return!!a&&!m(a)},data:function(a,c,d,e){if(!!f.acceptData(a)){var g,h,i,j=f.expando,k=typeof c=="string",l=a.nodeType,m=l?f.cache:a,n=l?a[j]:a[j]&&j,o=c==="events";if((!n||!m[n]||!o&&!e&&!m[n].data)&&k&&d===b)return;n||(l?a[j]=n=++f.uuid:n=j),m[n]||(m[n]={},l||(m[n].toJSON=f.noop));if(typeof c=="object"||typeof c=="function")e?m[n]=f.extend(m[n],c):m[n].data=f.extend(m[n].data,c);g=h=m[n],e||(h.data||(h.data={}),h=h.data),d!==b&&(h[f.camelCase(c)]=d);if(o&&!h[c])return g.events;k?(i=h[c],i==null&&(i=h[f.camelCase(c)])):i=h;return i}},removeData:function(a,b,c){if(!!f.acceptData(a)){var d,e,g,h=f.expando,i=a.nodeType,j=i?f.cache:a,k=i?a[h]:h;if(!j[k])return;if(b){d=c?j[k]:j[k].data;if(d){f.isArray(b)||(b in d?b=[b]:(b=f.camelCase(b),b in d?b=[b]:b=b.split(" ")));for(e=0,g=b.length;e1,null,!1)},removeData:function(a){return this.each(function(){f.removeData(this,a)})}}),f.extend({_mark:function(a,b){a&&(b=(b||"fx")+"mark",f._data(a,b,(f._data(a,b)||0)+1))},_unmark:function(a,b,c){a!==!0&&(c=b,b=a,a=!1);if(b){c=c||"fx";var d=c+"mark",e=a?0:(f._data(b,d)||1)-1;e?f._data(b,d,e):(f.removeData(b,d,!0),n(b,c,"mark"))}},queue:function(a,b,c){var d;if(a){b=(b||"fx")+"queue",d=f._data(a,b),c&&(!d||f.isArray(c)?d=f._data(a,b,f.makeArray(c)):d.push(c));return d||[]}},dequeue:function(a,b){b=b||"fx";var c=f.queue(a,b),d=c.shift(),e={};d==="inprogress"&&(d=c.shift()),d&&(b==="fx"&&c.unshift("inprogress"),f._data(a,b+".run",e),d.call(a,function(){f.dequeue(a,b)},e)),c.length||(f.removeData(a,b+"queue "+b+".run",!0),n(a,b,"queue"))}}),f.fn.extend({queue:function(a,c){var d=2;typeof a!="string"&&(c=a,a="fx",d--);if(arguments.length1)},removeAttr:function(a){return this.each(function(){f.removeAttr(this,a)})},prop:function(a,b){return f.access(this,f.prop,a,b,arguments.length>1)},removeProp:function(a){a=f.propFix[a]||a;return this.each(function(){try{this[a]=b,delete this[a]}catch(c){}})},addClass:function(a){var b,c,d,e,g,h,i;if(f.isFunction(a))return this.each(function(b){f(this).addClass(a.call(this,b,this.className))});if(a&&typeof a=="string"){b=a.split(p);for(c=0,d=this.length;c-1)return!0;return!1},val:function(a){var c,d,e,g=this[0];{if(!!arguments.length){e=f.isFunction(a);return this.each(function(d){var g=f(this),h;if(this.nodeType===1){e?h=a.call(this,d,g.val()):h=a,h==null?h="":typeof h=="number"?h+="":f.isArray(h)&&(h=f.map(h,function(a){return a==null?"":a+""})),c=f.valHooks[this.type]||f.valHooks[this.nodeName.toLowerCase()];if(!c||!("set"in c)||c.set(this,h,"value")===b)this.value=h}})}if(g){c=f.valHooks[g.type]||f.valHooks[g.nodeName.toLowerCase()];if(c&&"get"in c&&(d=c.get(g,"value"))!==b)return d;d=g.value;return typeof d=="string"?d.replace(q,""):d==null?"":d}}}}),f.extend({valHooks:{option:{get:function(a){var b=a.attributes.value;return!b||b.specified?a.value:a.text}},select:{get:function(a){var b,c,d,e,g=a.selectedIndex,h=[],i=a.options,j=a.type==="select-one";if(g<0)return null;c=j?g:0,d=j?g+1:i.length;for(;c=0}),c.length||(a.selectedIndex=-1);return c}}},attrFn:{val:!0,css:!0,html:!0,text:!0,data:!0,width:!0,height:!0,offset:!0},attr:function(a,c,d,e){var g,h,i,j=a.nodeType;if(!!a&&j!==3&&j!==8&&j!==2){if(e&&c in f.attrFn)return f(a)[c](d);if(typeof a.getAttribute=="undefined")return f.prop(a,c,d);i=j!==1||!f.isXMLDoc(a),i&&(c=c.toLowerCase(),h=f.attrHooks[c]||(u.test(c)?x:w));if(d!==b){if(d===null){f.removeAttr(a,c);return}if(h&&"set"in h&&i&&(g=h.set(a,d,c))!==b)return g;a.setAttribute(c,""+d);return d}if(h&&"get"in h&&i&&(g=h.get(a,c))!==null)return g;g=a.getAttribute(c);return g===null?b:g}},removeAttr:function(a,b){var c,d,e,g,h,i=0;if(b&&a.nodeType===1){d=b.toLowerCase().split(p),g=d.length;for(;i=0}})});var z=/^(?:textarea|input|select)$/i,A=/^([^\.]*)?(?:\.(.+))?$/,B=/(?:^|\s)hover(\.\S+)?\b/,C=/^key/,D=/^(?:mouse|contextmenu)|click/,E=/^(?:focusinfocus|focusoutblur)$/,F=/^(\w*)(?:#([\w\-]+))?(?:\.([\w\-]+))?$/,G=function( +a){var b=F.exec(a);b&&(b[1]=(b[1]||"").toLowerCase(),b[3]=b[3]&&new RegExp("(?:^|\\s)"+b[3]+"(?:\\s|$)"));return b},H=function(a,b){var c=a.attributes||{};return(!b[1]||a.nodeName.toLowerCase()===b[1])&&(!b[2]||(c.id||{}).value===b[2])&&(!b[3]||b[3].test((c["class"]||{}).value))},I=function(a){return f.event.special.hover?a:a.replace(B,"mouseenter$1 mouseleave$1")};f.event={add:function(a,c,d,e,g){var h,i,j,k,l,m,n,o,p,q,r,s;if(!(a.nodeType===3||a.nodeType===8||!c||!d||!(h=f._data(a)))){d.handler&&(p=d,d=p.handler,g=p.selector),d.guid||(d.guid=f.guid++),j=h.events,j||(h.events=j={}),i=h.handle,i||(h.handle=i=function(a){return typeof f!="undefined"&&(!a||f.event.triggered!==a.type)?f.event.dispatch.apply(i.elem,arguments):b},i.elem=a),c=f.trim(I(c)).split(" ");for(k=0;k=0&&(h=h.slice(0,-1),k=!0),h.indexOf(".")>=0&&(i=h.split("."),h=i.shift(),i.sort());if((!e||f.event.customEvent[h])&&!f.event.global[h])return;c=typeof c=="object"?c[f.expando]?c:new f.Event(h,c):new f.Event(h),c.type=h,c.isTrigger=!0,c.exclusive=k,c.namespace=i.join("."),c.namespace_re=c.namespace?new RegExp("(^|\\.)"+i.join("\\.(?:.*\\.)?")+"(\\.|$)"):null,o=h.indexOf(":")<0?"on"+h:"";if(!e){j=f.cache;for(l in j)j[l].events&&j[l].events[h]&&f.event.trigger(c,d,j[l].handle.elem,!0);return}c.result=b,c.target||(c.target=e),d=d!=null?f.makeArray(d):[],d.unshift(c),p=f.event.special[h]||{};if(p.trigger&&p.trigger.apply(e,d)===!1)return;r=[[e,p.bindType||h]];if(!g&&!p.noBubble&&!f.isWindow(e)){s=p.delegateType||h,m=E.test(s+h)?e:e.parentNode,n=null;for(;m;m=m.parentNode)r.push([m,s]),n=m;n&&n===e.ownerDocument&&r.push([n.defaultView||n.parentWindow||a,s])}for(l=0;le&&j.push({elem:this,matches:d.slice(e)});for(k=0;k0?this.on(b,null,a,c):this.trigger(b)},f.attrFn&&(f.attrFn[b]=!0),C.test(b)&&(f.event.fixHooks[b]=f.event.keyHooks),D.test(b)&&(f.event.fixHooks[b]=f.event.mouseHooks)}),function(){function x(a,b,c,e,f,g){for(var h=0,i=e.length;h0){k=j;break}}j=j[a]}e[h]=k}}}function w(a,b,c,e,f,g){for(var h=0,i=e.length;h+~,(\[\\]+)+|[>+~])(\s*,\s*)?((?:.|\r|\n)*)/g,d="sizcache"+(Math.random()+"").replace(".",""),e=0,g=Object.prototype.toString,h=!1,i=!0,j=/\\/g,k=/\r\n/g,l=/\W/;[0,0].sort(function(){i=!1;return 0});var m=function(b,d,e,f){e=e||[],d=d||c;var h=d;if(d.nodeType!==1&&d.nodeType!==9)return[];if(!b||typeof b!="string")return e;var i,j,k,l,n,q,r,t,u=!0,v=m.isXML(d),w=[],x=b;do{a.exec(""),i=a.exec(x);if(i){x=i[3],w.push(i[1]);if(i[2]){l=i[3];break}}}while(i);if(w.length>1&&p.exec(b))if(w.length===2&&o.relative[w[0]])j=y(w[0]+w[1],d,f);else{j=o.relative[w[0]]?[d]:m(w.shift(),d);while(w.length)b=w.shift(),o.relative[b]&&(b+=w.shift()),j=y(b,j,f)}else{!f&&w.length>1&&d.nodeType===9&&!v&&o.match.ID.test(w[0])&&!o.match.ID.test(w[w.length-1])&&(n=m.find(w.shift(),d,v),d=n.expr?m.filter(n.expr,n.set)[0]:n.set[0]);if(d){n=f?{expr:w.pop(),set:s(f)}:m.find(w.pop(),w.length===1&&(w[0]==="~"||w[0]==="+")&&d.parentNode?d.parentNode:d,v),j=n.expr?m.filter(n.expr,n.set):n.set,w.length>0?k=s(j):u=!1;while(w.length)q=w.pop(),r=q,o.relative[q]?r=w.pop():q="",r==null&&(r=d),o.relative[q](k,r,v)}else k=w=[]}k||(k=j),k||m.error(q||b);if(g.call(k)==="[object Array]")if(!u)e.push.apply(e,k);else if(d&&d.nodeType===1)for(t=0;k[t]!=null;t++)k[t]&&(k[t]===!0||k[t].nodeType===1&&m.contains(d,k[t]))&&e.push(j[t]);else for(t=0;k[t]!=null;t++)k[t]&&k[t].nodeType===1&&e.push(j[t]);else s(k,e);l&&(m(l,h,e,f),m.uniqueSort(e));return e};m.uniqueSort=function(a){if(u){h=i,a.sort(u);if(h)for(var b=1;b0},m.find=function(a,b,c){var d,e,f,g,h,i;if(!a)return[];for(e=0,f=o.order.length;e":function(a,b){var c,d=typeof b=="string",e=0,f=a.length;if(d&&!l.test(b)){b=b.toLowerCase();for(;e=0)?c||d.push(h):c&&(b[g]=!1));return!1},ID:function(a){return a[1].replace(j,"")},TAG:function(a,b){return a[1].replace(j,"").toLowerCase()},CHILD:function(a){if(a[1]==="nth"){a[2]||m.error(a[0]),a[2]=a[2].replace(/^\+|\s*/g,"");var b=/(-?)(\d*)(?:n([+\-]?\d*))?/.exec(a[2]==="even"&&"2n"||a[2]==="odd"&&"2n+1"||!/\D/.test(a[2])&&"0n+"+a[2]||a[2]);a[2]=b[1]+(b[2]||1)-0,a[3]=b[3]-0}else a[2]&&m.error(a[0]);a[0]=e++;return a},ATTR:function(a,b,c,d,e,f){var g=a[1]=a[1].replace(j,"");!f&&o.attrMap[g]&&(a[1]=o.attrMap[g]),a[4]=(a[4]||a[5]||"").replace(j,""),a[2]==="~="&&(a[4]=" "+a[4]+" ");return a},PSEUDO:function(b,c,d,e,f){if(b[1]==="not")if((a.exec(b[3])||"").length>1||/^\w/.test(b[3]))b[3]=m(b[3],null,null,c);else{var g=m.filter(b[3],c,d,!0^f);d||e.push.apply(e,g);return!1}else if(o.match.POS.test(b[0])||o.match.CHILD.test(b[0]))return!0;return b},POS:function(a){a.unshift(!0);return a}},filters:{enabled:function(a){return a.disabled===!1&&a.type!=="hidden"},disabled:function(a){return a.disabled===!0},checked:function(a){return a.checked===!0},selected:function(a){a.parentNode&&a.parentNode.selectedIndex;return a.selected===!0},parent:function(a){return!!a.firstChild},empty:function(a){return!a.firstChild},has:function(a,b,c){return!!m(c[3],a).length},header:function(a){return/h\d/i.test(a.nodeName)},text:function(a){var b=a.getAttribute("type"),c=a.type;return a.nodeName.toLowerCase()==="input"&&"text"===c&&(b===c||b===null)},radio:function(a){return a.nodeName.toLowerCase()==="input"&&"radio"===a.type},checkbox:function(a){return a.nodeName.toLowerCase()==="input"&&"checkbox"===a.type},file:function(a){return a.nodeName.toLowerCase()==="input"&&"file"===a.type},password:function(a){return a.nodeName.toLowerCase()==="input"&&"password"===a.type},submit:function(a){var b=a.nodeName.toLowerCase();return(b==="input"||b==="button")&&"submit"===a.type},image:function(a){return a.nodeName.toLowerCase()==="input"&&"image"===a.type},reset:function(a){var b=a.nodeName.toLowerCase();return(b==="input"||b==="button")&&"reset"===a.type},button:function(a){var b=a.nodeName.toLowerCase();return b==="input"&&"button"===a.type||b==="button"},input:function(a){return/input|select|textarea|button/i.test(a.nodeName)},focus:function(a){return a===a.ownerDocument.activeElement}},setFilters:{first:function(a,b){return b===0},last:function(a,b,c,d){return b===d.length-1},even:function(a,b){return b%2===0},odd:function(a,b){return b%2===1},lt:function(a,b,c){return bc[3]-0},nth:function(a,b,c){return c[3]-0===b},eq:function(a,b,c){return c[3]-0===b}},filter:{PSEUDO:function(a,b,c,d){var e=b[1],f=o.filters[e];if(f)return f(a,c,b,d);if(e==="contains")return(a.textContent||a.innerText||n([a])||"").indexOf(b[3])>=0;if(e==="not"){var g=b[3];for(var h=0,i=g.length;h=0}},ID:function(a,b){return a.nodeType===1&&a.getAttribute("id")===b},TAG:function(a,b){return b==="*"&&a.nodeType===1||!!a.nodeName&&a.nodeName.toLowerCase()===b},CLASS:function(a,b){return(" "+(a.className||a.getAttribute("class"))+" ").indexOf(b)>-1},ATTR:function(a,b){var c=b[1],d=m.attr?m.attr(a,c):o.attrHandle[c]?o.attrHandle[c](a):a[c]!=null?a[c]:a.getAttribute(c),e=d+"",f=b[2],g=b[4];return d==null?f==="!=":!f&&m.attr?d!=null:f==="="?e===g:f==="*="?e.indexOf(g)>=0:f==="~="?(" "+e+" ").indexOf(g)>=0:g?f==="!="?e!==g:f==="^="?e.indexOf(g)===0:f==="$="?e.substr(e.length-g.length)===g:f==="|="?e===g||e.substr(0,g.length+1)===g+"-":!1:e&&d!==!1},POS:function(a,b,c,d){var e=b[2],f=o.setFilters[e];if(f)return f(a,c,b,d)}}},p=o.match.POS,q=function(a,b){return"\\"+(b-0+1)};for(var r in o.match)o.match[r]=new RegExp(o.match[r].source+/(?![^\[]*\])(?![^\(]*\))/.source),o.leftMatch[r]=new RegExp(/(^(?:.|\r|\n)*?)/.source+o.match[r].source.replace(/\\(\d+)/g,q));o.match.globalPOS=p;var s=function(a,b){a=Array.prototype.slice.call(a,0);if(b){b.push.apply(b,a);return b}return a};try{Array.prototype.slice.call(c.documentElement.childNodes,0)[0].nodeType}catch(t){s=function(a,b){var c=0,d=b||[];if(g.call(a)==="[object Array]")Array.prototype.push.apply(d,a);else if(typeof a.length=="number")for(var e=a.length;c",e.insertBefore(a,e.firstChild),c.getElementById(d)&&(o.find.ID=function(a,c,d){if(typeof c.getElementById!="undefined"&&!d){var e=c.getElementById(a[1]);return e?e.id===a[1]||typeof e.getAttributeNode!="undefined"&&e.getAttributeNode("id").nodeValue===a[1]?[e]:b:[]}},o.filter.ID=function(a,b){var c=typeof a.getAttributeNode!="undefined"&&a.getAttributeNode("id");return a.nodeType===1&&c&&c.nodeValue===b}),e.removeChild(a),e=a=null}(),function(){var a=c.createElement("div");a.appendChild(c.createComment("")),a.getElementsByTagName("*").length>0&&(o.find.TAG=function(a,b){var c=b.getElementsByTagName(a[1]);if(a[1]==="*"){var d=[];for(var e=0;c[e];e++)c[e].nodeType===1&&d.push(c[e]);c=d}return c}),a.innerHTML="",a.firstChild&&typeof a.firstChild.getAttribute!="undefined"&&a.firstChild.getAttribute("href")!=="#"&&(o.attrHandle.href=function(a){return a.getAttribute("href",2)}),a=null}(),c.querySelectorAll&&function(){var a=m,b=c.createElement("div"),d="__sizzle__";b.innerHTML="

";if(!b.querySelectorAll||b.querySelectorAll(".TEST").length!==0){m=function(b,e,f,g){e=e||c;if(!g&&!m.isXML(e)){var h=/^(\w+$)|^\.([\w\-]+$)|^#([\w\-]+$)/.exec(b);if(h&&(e.nodeType===1||e.nodeType===9)){if(h[1])return s(e.getElementsByTagName(b),f);if(h[2]&&o.find.CLASS&&e.getElementsByClassName)return s(e.getElementsByClassName(h[2]),f)}if(e.nodeType===9){if(b==="body"&&e.body)return s([e.body],f);if(h&&h[3]){var i=e.getElementById(h[3]);if(!i||!i.parentNode)return s([],f);if(i.id===h[3])return s([i],f)}try{return s(e.querySelectorAll(b),f)}catch(j){}}else if(e.nodeType===1&&e.nodeName.toLowerCase()!=="object"){var k=e,l=e.getAttribute("id"),n=l||d,p=e.parentNode,q=/^\s*[+~]/.test(b);l?n=n.replace(/'/g,"\\$&"):e.setAttribute("id",n),q&&p&&(e=e.parentNode);try{if(!q||p)return s(e.querySelectorAll("[id='"+n+"'] "+b),f)}catch(r){}finally{l||k.removeAttribute("id")}}}return a(b,e,f,g)};for(var e in a)m[e]=a[e];b=null}}(),function(){var a=c.documentElement,b=a.matchesSelector||a.mozMatchesSelector||a.webkitMatchesSelector||a.msMatchesSelector;if(b){var d=!b.call(c.createElement("div"),"div"),e=!1;try{b.call(c.documentElement,"[test!='']:sizzle")}catch(f){e=!0}m.matchesSelector=function(a,c){c=c.replace(/\=\s*([^'"\]]*)\s*\]/g,"='$1']");if(!m.isXML(a))try{if(e||!o.match.PSEUDO.test(c)&&!/!=/.test(c)){var f=b.call(a,c);if(f||!d||a.document&&a.document.nodeType!==11)return f}}catch(g){}return m(c,null,null,[a]).length>0}}}(),function(){var a=c.createElement("div");a.innerHTML="
";if(!!a.getElementsByClassName&&a.getElementsByClassName("e").length!==0){a.lastChild.className="e";if(a.getElementsByClassName("e").length===1)return;o.order.splice(1,0,"CLASS"),o.find.CLASS=function(a,b,c){if(typeof b.getElementsByClassName!="undefined"&&!c)return b.getElementsByClassName(a[1])},a=null}}(),c.documentElement.contains?m.contains=function(a,b){return a!==b&&(a.contains?a.contains(b):!0)}:c.documentElement.compareDocumentPosition?m.contains=function(a,b){return!!(a.compareDocumentPosition(b)&16)}:m.contains=function(){return!1},m.isXML=function(a){var b=(a?a.ownerDocument||a:0).documentElement;return b?b.nodeName!=="HTML":!1};var y=function(a,b,c){var d,e=[],f="",g=b.nodeType?[b]:b;while(d=o.match.PSEUDO.exec(a))f+=d[0],a=a.replace(o.match.PSEUDO,"");a=o.relative[a]?a+"*":a;for(var h=0,i=g.length;h0)for(h=g;h=0:f.filter(a,this).length>0:this.filter(a).length>0)},closest:function(a,b){var c=[],d,e,g=this[0];if(f.isArray(a)){var h=1;while(g&&g.ownerDocument&&g!==b){for(d=0;d-1:f.find.matchesSelector(g,a)){c.push(g);break}g=g.parentNode;if(!g||!g.ownerDocument||g===b||g.nodeType===11)break}}c=c.length>1?f.unique(c):c;return this.pushStack(c,"closest",a)},index:function(a){if(!a)return this[0]&&this[0].parentNode?this.prevAll().length:-1;if(typeof a=="string")return f.inArray(this[0],f(a));return f.inArray(a.jquery?a[0]:a,this)},add:function(a,b){var c=typeof a=="string"?f(a,b):f.makeArray(a&&a.nodeType?[a]:a),d=f.merge(this.get(),c);return this.pushStack(S(c[0])||S(d[0])?d:f.unique(d))},andSelf:function(){return this.add(this.prevObject)}}),f.each({parent:function(a){var b=a.parentNode;return b&&b.nodeType!==11?b:null},parents:function(a){return f.dir(a,"parentNode")},parentsUntil:function(a,b,c){return f.dir(a,"parentNode",c)},next:function(a){return f.nth(a,2,"nextSibling")},prev:function(a){return f.nth(a,2,"previousSibling")},nextAll:function(a){return f.dir(a,"nextSibling")},prevAll:function(a){return f.dir(a,"previousSibling")},nextUntil:function(a,b,c){return f.dir(a,"nextSibling",c)},prevUntil:function(a,b,c){return f.dir(a,"previousSibling",c)},siblings:function(a){return f.sibling((a.parentNode||{}).firstChild,a)},children:function(a){return f.sibling(a.firstChild)},contents:function(a){return f.nodeName(a,"iframe")?a.contentDocument||a.contentWindow.document:f.makeArray(a.childNodes)}},function(a,b){f.fn[a]=function(c,d){var e=f.map(this,b,c);L.test(a)||(d=c),d&&typeof d=="string"&&(e=f.filter(d,e)),e=this.length>1&&!R[a]?f.unique(e):e,(this.length>1||N.test(d))&&M.test(a)&&(e=e.reverse());return this.pushStack(e,a,P.call(arguments).join(","))}}),f.extend({filter:function(a,b,c){c&&(a=":not("+a+")");return b.length===1?f.find.matchesSelector(b[0],a)?[b[0]]:[]:f.find.matches(a,b)},dir:function(a,c,d){var e=[],g=a[c];while(g&&g.nodeType!==9&&(d===b||g.nodeType!==1||!f(g).is(d)))g.nodeType===1&&e.push(g),g=g[c];return e},nth:function(a,b,c,d){b=b||1;var e=0;for(;a;a=a[c])if(a.nodeType===1&&++e===b)break;return a},sibling:function(a,b){var c=[];for(;a;a=a.nextSibling)a.nodeType===1&&a!==b&&c.push(a);return c}});var V="abbr|article|aside|audio|bdi|canvas|data|datalist|details|figcaption|figure|footer|header|hgroup|mark|meter|nav|output|progress|section|summary|time|video",W=/ jQuery\d+="(?:\d+|null)"/g,X=/^\s+/,Y=/<(?!area|br|col|embed|hr|img|input|link|meta|param)(([\w:]+)[^>]*)\/>/ig,Z=/<([\w:]+)/,$=/]","i"),bd=/checked\s*(?:[^=]|=\s*.checked.)/i,be=/\/(java|ecma)script/i,bf=/^\s*",""],legend:[1,"
","
"],thead:[1,"","
"],tr:[2,"","
"],td:[3,"","
"],col:[2,"","
"],area:[1,"",""],_default:[0,"",""]},bh=U(c);bg.optgroup=bg.option,bg.tbody=bg.tfoot=bg.colgroup=bg.caption=bg.thead,bg.th=bg.td,f.support.htmlSerialize||(bg._default=[1,"div
","
"]),f.fn.extend({text:function(a){return f.access(this,function(a){return a===b?f.text(this):this.empty().append((this[0]&&this[0].ownerDocument||c).createTextNode(a))},null,a,arguments.length)},wrapAll:function(a){if(f.isFunction(a))return this.each(function(b){f(this).wrapAll(a.call(this,b))});if(this[0]){var b=f(a,this[0].ownerDocument).eq(0).clone(!0);this[0].parentNode&&b.insertBefore(this[0]),b.map(function(){var a=this;while(a.firstChild&&a.firstChild.nodeType===1)a=a.firstChild;return a}).append(this)}return this},wrapInner:function(a){if(f.isFunction(a))return this.each(function(b){f(this).wrapInner(a.call(this,b))});return this.each(function(){var b=f(this),c=b.contents();c.length?c.wrapAll(a):b.append(a)})},wrap:function(a){var b=f.isFunction(a);return this.each(function(c){f(this).wrapAll(b?a.call(this,c):a)})},unwrap:function(){return this.parent().each(function(){f.nodeName(this,"body")||f(this).replaceWith(this.childNodes)}).end()},append:function(){return this.domManip(arguments,!0,function(a){this.nodeType===1&&this.appendChild(a)})},prepend:function(){return this.domManip(arguments,!0,function(a){this.nodeType===1&&this.insertBefore(a,this.firstChild)})},before:function(){if(this[0]&&this[0].parentNode)return this.domManip(arguments,!1,function(a){this.parentNode.insertBefore(a,this)});if(arguments.length){var a=f +.clean(arguments);a.push.apply(a,this.toArray());return this.pushStack(a,"before",arguments)}},after:function(){if(this[0]&&this[0].parentNode)return this.domManip(arguments,!1,function(a){this.parentNode.insertBefore(a,this.nextSibling)});if(arguments.length){var a=this.pushStack(this,"after",arguments);a.push.apply(a,f.clean(arguments));return a}},remove:function(a,b){for(var c=0,d;(d=this[c])!=null;c++)if(!a||f.filter(a,[d]).length)!b&&d.nodeType===1&&(f.cleanData(d.getElementsByTagName("*")),f.cleanData([d])),d.parentNode&&d.parentNode.removeChild(d);return this},empty:function(){for(var a=0,b;(b=this[a])!=null;a++){b.nodeType===1&&f.cleanData(b.getElementsByTagName("*"));while(b.firstChild)b.removeChild(b.firstChild)}return this},clone:function(a,b){a=a==null?!1:a,b=b==null?a:b;return this.map(function(){return f.clone(this,a,b)})},html:function(a){return f.access(this,function(a){var c=this[0]||{},d=0,e=this.length;if(a===b)return c.nodeType===1?c.innerHTML.replace(W,""):null;if(typeof a=="string"&&!ba.test(a)&&(f.support.leadingWhitespace||!X.test(a))&&!bg[(Z.exec(a)||["",""])[1].toLowerCase()]){a=a.replace(Y,"<$1>");try{for(;d1&&l0?this.clone(!0):this).get();f(e[h])[b](j),d=d.concat(j)}return this.pushStack(d,a,e.selector)}}),f.extend({clone:function(a,b,c){var d,e,g,h=f.support.html5Clone||f.isXMLDoc(a)||!bc.test("<"+a.nodeName+">")?a.cloneNode(!0):bo(a);if((!f.support.noCloneEvent||!f.support.noCloneChecked)&&(a.nodeType===1||a.nodeType===11)&&!f.isXMLDoc(a)){bk(a,h),d=bl(a),e=bl(h);for(g=0;d[g];++g)e[g]&&bk(d[g],e[g])}if(b){bj(a,h);if(c){d=bl(a),e=bl(h);for(g=0;d[g];++g)bj(d[g],e[g])}}d=e=null;return h},clean:function(a,b,d,e){var g,h,i,j=[];b=b||c,typeof b.createElement=="undefined"&&(b=b.ownerDocument||b[0]&&b[0].ownerDocument||c);for(var k=0,l;(l=a[k])!=null;k++){typeof l=="number"&&(l+="");if(!l)continue;if(typeof l=="string")if(!_.test(l))l=b.createTextNode(l);else{l=l.replace(Y,"<$1>");var m=(Z.exec(l)||["",""])[1].toLowerCase(),n=bg[m]||bg._default,o=n[0],p=b.createElement("div"),q=bh.childNodes,r;b===c?bh.appendChild(p):U(b).appendChild(p),p.innerHTML=n[1]+l+n[2];while(o--)p=p.lastChild;if(!f.support.tbody){var s=$.test(l),t=m==="table"&&!s?p.firstChild&&p.firstChild.childNodes:n[1]===""&&!s?p.childNodes:[];for(i=t.length-1;i>=0;--i)f.nodeName(t[i],"tbody")&&!t[i].childNodes.length&&t[i].parentNode.removeChild(t[i])}!f.support.leadingWhitespace&&X.test(l)&&p.insertBefore(b.createTextNode(X.exec(l)[0]),p.firstChild),l=p.childNodes,p&&(p.parentNode.removeChild(p),q.length>0&&(r=q[q.length-1],r&&r.parentNode&&r.parentNode.removeChild(r)))}var u;if(!f.support.appendChecked)if(l[0]&&typeof (u=l.length)=="number")for(i=0;i1)},f.extend({cssHooks:{opacity:{get:function(a,b){if(b){var c=by(a,"opacity");return c===""?"1":c}return a.style.opacity}}},cssNumber:{fillOpacity:!0,fontWeight:!0,lineHeight:!0,opacity:!0,orphans:!0,widows:!0,zIndex:!0,zoom:!0},cssProps:{"float":f.support.cssFloat?"cssFloat":"styleFloat"},style:function(a,c,d,e){if(!!a&&a.nodeType!==3&&a.nodeType!==8&&!!a.style){var g,h,i=f.camelCase(c),j=a.style,k=f.cssHooks[i];c=f.cssProps[i]||i;if(d===b){if(k&&"get"in k&&(g=k.get(a,!1,e))!==b)return g;return j[c]}h=typeof d,h==="string"&&(g=bu.exec(d))&&(d=+(g[1]+1)*+g[2]+parseFloat(f.css(a,c)),h="number");if(d==null||h==="number"&&isNaN(d))return;h==="number"&&!f.cssNumber[i]&&(d+="px");if(!k||!("set"in k)||(d=k.set(a,d))!==b)try{j[c]=d}catch(l){}}},css:function(a,c,d){var e,g;c=f.camelCase(c),g=f.cssHooks[c],c=f.cssProps[c]||c,c==="cssFloat"&&(c="float");if(g&&"get"in g&&(e=g.get(a,!0,d))!==b)return e;if(by)return by(a,c)},swap:function(a,b,c){var d={},e,f;for(f in b)d[f]=a.style[f],a.style[f]=b[f];e=c.call(a);for(f in b)a.style[f]=d[f];return e}}),f.curCSS=f.css,c.defaultView&&c.defaultView.getComputedStyle&&(bz=function(a,b){var c,d,e,g,h=a.style;b=b.replace(br,"-$1").toLowerCase(),(d=a.ownerDocument.defaultView)&&(e=d.getComputedStyle(a,null))&&(c=e.getPropertyValue(b),c===""&&!f.contains(a.ownerDocument.documentElement,a)&&(c=f.style(a,b))),!f.support.pixelMargin&&e&&bv.test(b)&&bt.test(c)&&(g=h.width,h.width=c,c=e.width,h.width=g);return c}),c.documentElement.currentStyle&&(bA=function(a,b){var c,d,e,f=a.currentStyle&&a.currentStyle[b],g=a.style;f==null&&g&&(e=g[b])&&(f=e),bt.test(f)&&(c=g.left,d=a.runtimeStyle&&a.runtimeStyle.left,d&&(a.runtimeStyle.left=a.currentStyle.left),g.left=b==="fontSize"?"1em":f,f=g.pixelLeft+"px",g.left=c,d&&(a.runtimeStyle.left=d));return f===""?"auto":f}),by=bz||bA,f.each(["height","width"],function(a,b){f.cssHooks[b]={get:function(a,c,d){if(c)return a.offsetWidth!==0?bB(a,b,d):f.swap(a,bw,function(){return bB(a,b,d)})},set:function(a,b){return bs.test(b)?b+"px":b}}}),f.support.opacity||(f.cssHooks.opacity={get:function(a,b){return bq.test((b&&a.currentStyle?a.currentStyle.filter:a.style.filter)||"")?parseFloat(RegExp.$1)/100+"":b?"1":""},set:function(a,b){var c=a.style,d=a.currentStyle,e=f.isNumeric(b)?"alpha(opacity="+b*100+")":"",g=d&&d.filter||c.filter||"";c.zoom=1;if(b>=1&&f.trim(g.replace(bp,""))===""){c.removeAttribute("filter");if(d&&!d.filter)return}c.filter=bp.test(g)?g.replace(bp,e):g+" "+e}}),f(function(){f.support.reliableMarginRight||(f.cssHooks.marginRight={get:function(a,b){return f.swap(a,{display:"inline-block"},function(){return b?by(a,"margin-right"):a.style.marginRight})}})}),f.expr&&f.expr.filters&&(f.expr.filters.hidden=function(a){var b=a.offsetWidth,c=a.offsetHeight;return b===0&&c===0||!f.support.reliableHiddenOffsets&&(a.style&&a.style.display||f.css(a,"display"))==="none"},f.expr.filters.visible=function(a){return!f.expr.filters.hidden(a)}),f.each({margin:"",padding:"",border:"Width"},function(a,b){f.cssHooks[a+b]={expand:function(c){var d,e=typeof c=="string"?c.split(" "):[c],f={};for(d=0;d<4;d++)f[a+bx[d]+b]=e[d]||e[d-2]||e[0];return f}}});var bC=/%20/g,bD=/\[\]$/,bE=/\r?\n/g,bF=/#.*$/,bG=/^(.*?):[ \t]*([^\r\n]*)\r?$/mg,bH=/^(?:color|date|datetime|datetime-local|email|hidden|month|number|password|range|search|tel|text|time|url|week)$/i,bI=/^(?:about|app|app\-storage|.+\-extension|file|res|widget):$/,bJ=/^(?:GET|HEAD)$/,bK=/^\/\//,bL=/\?/,bM=/)<[^<]*)*<\/script>/gi,bN=/^(?:select|textarea)/i,bO=/\s+/,bP=/([?&])_=[^&]*/,bQ=/^([\w\+\.\-]+:)(?:\/\/([^\/?#:]*)(?::(\d+))?)?/,bR=f.fn.load,bS={},bT={},bU,bV,bW=["*/"]+["*"];try{bU=e.href}catch(bX){bU=c.createElement("a"),bU.href="",bU=bU.href}bV=bQ.exec(bU.toLowerCase())||[],f.fn.extend({load:function(a,c,d){if(typeof a!="string"&&bR)return bR.apply(this,arguments);if(!this.length)return this;var e=a.indexOf(" ");if(e>=0){var g=a.slice(e,a.length);a=a.slice(0,e)}var h="GET";c&&(f.isFunction(c)?(d=c,c=b):typeof c=="object"&&(c=f.param(c,f.ajaxSettings.traditional),h="POST"));var i=this;f.ajax({url:a,type:h,dataType:"html",data:c,complete:function(a,b,c){c=a.responseText,a.isResolved()&&(a.done(function(a){c=a}),i.html(g?f("
").append(c.replace(bM,"")).find(g):c)),d&&i.each(d,[c,b,a])}});return this},serialize:function(){return f.param(this.serializeArray())},serializeArray:function(){return this.map(function(){return this.elements?f.makeArray(this.elements):this}).filter(function(){return this.name&&!this.disabled&&(this.checked||bN.test(this.nodeName)||bH.test(this.type))}).map(function(a,b){var c=f(this).val();return c==null?null:f.isArray(c)?f.map(c,function(a,c){return{name:b.name,value:a.replace(bE,"\r\n")}}):{name:b.name,value:c.replace(bE,"\r\n")}}).get()}}),f.each("ajaxStart ajaxStop ajaxComplete ajaxError ajaxSuccess ajaxSend".split(" "),function(a,b){f.fn[b]=function(a){return this.on(b,a)}}),f.each(["get","post"],function(a,c){f[c]=function(a,d,e,g){f.isFunction(d)&&(g=g||e,e=d,d=b);return f.ajax({type:c,url:a,data:d,success:e,dataType:g})}}),f.extend({getScript:function(a,c){return f.get(a,b,c,"script")},getJSON:function(a,b,c){return f.get(a,b,c,"json")},ajaxSetup:function(a,b){b?b$(a,f.ajaxSettings):(b=a,a=f.ajaxSettings),b$(a,b);return a},ajaxSettings:{url:bU,isLocal:bI.test(bV[1]),global:!0,type:"GET",contentType:"application/x-www-form-urlencoded; charset=UTF-8",processData:!0,async:!0,accepts:{xml:"application/xml, text/xml",html:"text/html",text:"text/plain",json:"application/json, text/javascript","*":bW},contents:{xml:/xml/,html:/html/,json:/json/},responseFields:{xml:"responseXML",text:"responseText"},converters:{"* text":a.String,"text html":!0,"text json":f.parseJSON,"text xml":f.parseXML},flatOptions:{context:!0,url:!0}},ajaxPrefilter:bY(bS),ajaxTransport:bY(bT),ajax:function(a,c){function w(a,c,l,m){if(s!==2){s=2,q&&clearTimeout(q),p=b,n=m||"",v.readyState=a>0?4:0;var o,r,u,w=c,x=l?ca(d,v,l):b,y,z;if(a>=200&&a<300||a===304){if(d.ifModified){if(y=v.getResponseHeader("Last-Modified"))f.lastModified[k]=y;if(z=v.getResponseHeader("Etag"))f.etag[k]=z}if(a===304)w="notmodified",o=!0;else try{r=cb(d,x),w="success",o=!0}catch(A){w="parsererror",u=A}}else{u=w;if(!w||a)w="error",a<0&&(a=0)}v.status=a,v.statusText=""+(c||w),o?h.resolveWith(e,[r,w,v]):h.rejectWith(e,[v,w,u]),v.statusCode(j),j=b,t&&g.trigger("ajax"+(o?"Success":"Error"),[v,d,o?r:u]),i.fireWith(e,[v,w]),t&&(g.trigger("ajaxComplete",[v,d]),--f.active||f.event.trigger("ajaxStop"))}}typeof a=="object"&&(c=a,a=b),c=c||{};var d=f.ajaxSetup({},c),e=d.context||d,g=e!==d&&(e.nodeType||e instanceof f)?f(e):f.event,h=f.Deferred(),i=f.Callbacks("once memory"),j=d.statusCode||{},k,l={},m={},n,o,p,q,r,s=0,t,u,v={readyState:0,setRequestHeader:function(a,b){if(!s){var c=a.toLowerCase();a=m[c]=m[c]||a,l[a]=b}return this},getAllResponseHeaders:function(){return s===2?n:null},getResponseHeader:function(a){var c;if(s===2){if(!o){o={};while(c=bG.exec(n))o[c[1].toLowerCase()]=c[2]}c=o[a.toLowerCase()]}return c===b?null:c},overrideMimeType:function(a){s||(d.mimeType=a);return this},abort:function(a){a=a||"abort",p&&p.abort(a),w(0,a);return this}};h.promise(v),v.success=v.done,v.error=v.fail,v.complete=i.add,v.statusCode=function(a){if(a){var b;if(s<2)for(b in a)j[b]=[j[b],a[b]];else b=a[v.status],v.then(b,b)}return this},d.url=((a||d.url)+"").replace(bF,"").replace(bK,bV[1]+"//"),d.dataTypes=f.trim(d.dataType||"*").toLowerCase().split(bO),d.crossDomain==null&&(r=bQ.exec(d.url.toLowerCase()),d.crossDomain=!(!r||r[1]==bV[1]&&r[2]==bV[2]&&(r[3]||(r[1]==="http:"?80:443))==(bV[3]||(bV[1]==="http:"?80:443)))),d.data&&d.processData&&typeof d.data!="string"&&(d.data=f.param(d.data,d.traditional)),bZ(bS,d,c,v);if(s===2)return!1;t=d.global,d.type=d.type.toUpperCase(),d.hasContent=!bJ.test(d.type),t&&f.active++===0&&f.event.trigger("ajaxStart");if(!d.hasContent){d.data&&(d.url+=(bL.test(d.url)?"&":"?")+d.data,delete d.data),k=d.url;if(d.cache===!1){var x=f.now(),y=d.url.replace(bP,"$1_="+x);d.url=y+(y===d.url?(bL.test(d.url)?"&":"?")+"_="+x:"")}}(d.data&&d.hasContent&&d.contentType!==!1||c.contentType)&&v.setRequestHeader("Content-Type",d.contentType),d.ifModified&&(k=k||d.url,f.lastModified[k]&&v.setRequestHeader("If-Modified-Since",f.lastModified[k]),f.etag[k]&&v.setRequestHeader("If-None-Match",f.etag[k])),v.setRequestHeader("Accept",d.dataTypes[0]&&d.accepts[d.dataTypes[0]]?d.accepts[d.dataTypes[0]]+(d.dataTypes[0]!=="*"?", "+bW+"; q=0.01":""):d.accepts["*"]);for(u in d.headers)v.setRequestHeader(u,d.headers[u]);if(d.beforeSend&&(d.beforeSend.call(e,v,d)===!1||s===2)){v.abort();return!1}for(u in{success:1,error:1,complete:1})v[u](d[u]);p=bZ(bT,d,c,v);if(!p)w(-1,"No Transport");else{v.readyState=1,t&&g.trigger("ajaxSend",[v,d]),d.async&&d.timeout>0&&(q=setTimeout(function(){v.abort("timeout")},d.timeout));try{s=1,p.send(l,w)}catch(z){if(s<2)w(-1,z);else throw z}}return v},param:function(a,c){var d=[],e=function(a,b){b=f.isFunction(b)?b():b,d[d.length]=encodeURIComponent(a)+"="+encodeURIComponent(b)};c===b&&(c=f.ajaxSettings.traditional);if(f.isArray(a)||a.jquery&&!f.isPlainObject(a))f.each(a,function(){e(this.name,this.value)});else for(var g in a)b_(g,a[g],c,e);return d.join("&").replace(bC,"+")}}),f.extend({active:0,lastModified:{},etag:{}});var cc=f.now(),cd=/(\=)\?(&|$)|\?\?/i;f.ajaxSetup({jsonp:"callback",jsonpCallback:function(){return f.expando+"_"+cc++}}),f.ajaxPrefilter("json jsonp",function(b,c,d){var e=typeof b.data=="string"&&/^application\/x\-www\-form\-urlencoded/.test(b.contentType);if(b.dataTypes[0]==="jsonp"||b.jsonp!==!1&&(cd.test(b.url)||e&&cd.test(b.data))){var g,h=b.jsonpCallback=f.isFunction(b.jsonpCallback)?b.jsonpCallback():b.jsonpCallback,i=a[h],j=b.url,k=b.data,l="$1"+h+"$2";b.jsonp!==!1&&(j=j.replace(cd,l),b.url===j&&(e&&(k=k.replace(cd,l)),b.data===k&&(j+=(/\?/.test(j)?"&":"?")+b.jsonp+"="+h))),b.url=j,b.data=k,a[h]=function(a){g=[a]},d.always(function(){a[h]=i,g&&f.isFunction(i)&&a[h](g[0])}),b.converters["script json"]=function(){g||f.error(h+" was not called");return g[0]},b.dataTypes[0]="json";return"script"}}),f.ajaxSetup({accepts:{script:"text/javascript, application/javascript, application/ecmascript, application/x-ecmascript"},contents:{script:/javascript|ecmascript/},converters:{"text script":function(a){f.globalEval(a);return a}}}),f.ajaxPrefilter("script",function(a){a.cache===b&&(a.cache=!1),a.crossDomain&&(a.type="GET",a.global=!1)}),f.ajaxTransport("script",function(a){if(a.crossDomain){var d,e=c.head||c.getElementsByTagName("head")[0]||c.documentElement;return{send:function(f,g){d=c.createElement("script"),d.async="async",a.scriptCharset&&(d.charset=a.scriptCharset),d.src=a.url,d.onload=d.onreadystatechange=function(a,c){if(c||!d.readyState||/loaded|complete/.test(d.readyState))d.onload=d.onreadystatechange=null,e&&d.parentNode&&e.removeChild(d),d=b,c||g(200,"success")},e.insertBefore(d,e.firstChild)},abort:function(){d&&d.onload(0,1)}}}});var ce=a.ActiveXObject?function(){for(var a in cg)cg[a](0,1)}:!1,cf=0,cg;f.ajaxSettings.xhr=a.ActiveXObject?function(){return!this.isLocal&&ch()||ci()}:ch,function(a){f.extend(f.support,{ajax:!!a,cors:!!a&&"withCredentials"in a})}(f.ajaxSettings.xhr()),f.support.ajax&&f.ajaxTransport(function(c){if(!c.crossDomain||f.support.cors){var d;return{send:function(e,g){var h=c.xhr(),i,j;c.username?h.open(c.type,c.url,c.async,c.username,c.password):h.open(c.type,c.url,c.async);if(c.xhrFields)for(j in c.xhrFields)h[j]=c.xhrFields[j];c.mimeType&&h.overrideMimeType&&h.overrideMimeType(c.mimeType),!c.crossDomain&&!e["X-Requested-With"]&&(e["X-Requested-With"]="XMLHttpRequest");try{for(j in e)h.setRequestHeader(j,e[j])}catch(k){}h.send(c.hasContent&&c.data||null),d=function(a,e){var j,k,l,m,n;try{if(d&&(e||h.readyState===4)){d=b,i&&(h.onreadystatechange=f.noop,ce&&delete cg[i]);if(e)h.readyState!==4&&h.abort();else{j=h.status,l=h.getAllResponseHeaders(),m={},n=h.responseXML,n&&n.documentElement&&(m.xml=n);try{m.text=h.responseText}catch(a){}try{k=h.statusText}catch(o){k=""}!j&&c.isLocal&&!c.crossDomain?j=m.text?200:404:j===1223&&(j=204)}}}catch(p){e||g(-1,p)}m&&g(j,k,m,l)},!c.async||h.readyState===4?d():(i=++cf,ce&&(cg||(cg={},f(a).unload(ce)),cg[i]=d),h.onreadystatechange=d)},abort:function(){d&&d(0,1)}}}});var cj={},ck,cl,cm=/^(?:toggle|show|hide)$/,cn=/^([+\-]=)?([\d+.\-]+)([a-z%]*)$/i,co,cp=[["height","marginTop","marginBottom","paddingTop","paddingBottom"],["width","marginLeft","marginRight","paddingLeft","paddingRight"],["opacity"]],cq;f.fn.extend({show:function(a,b,c){var d,e;if(a||a===0)return this.animate(ct("show",3),a,b,c);for(var g=0,h=this.length;g=i.duration+this.startTime){this.now=this.end,this.pos=this.state=1,this.update(),i.animatedProperties[this.prop]=!0;for(b in i.animatedProperties)i.animatedProperties[b]!==!0&&(g=!1);if(g){i.overflow!=null&&!f.support.shrinkWrapBlocks&&f.each(["","X","Y"],function(a,b){h.style["overflow"+b]=i.overflow[a]}),i.hide&&f(h).hide();if(i.hide||i.show)for(b in i.animatedProperties)f.style(h,b,i.orig[b]),f.removeData(h,"fxshow"+b,!0),f.removeData(h,"toggle"+b,!0);d=i.complete,d&&(i.complete=!1,d.call(h))}return!1}i.duration==Infinity?this.now=e:(c=e-this.startTime,this.state=c/i.duration,this.pos=f.easing[i.animatedProperties[this.prop]](this.state,c,0,1,i.duration),this.now=this.start+(this.end-this.start)*this.pos),this.update();return!0}},f.extend(f.fx,{tick:function(){var a,b=f.timers,c=0;for(;c-1,k={},l={},m,n;j?(l=e.position(),m=l.top,n=l.left):(m=parseFloat(h)||0,n=parseFloat(i)||0),f.isFunction(b)&&(b=b.call(a,c,g)),b.top!=null&&(k.top=b.top-g.top+m),b.left!=null&&(k.left=b.left-g.left+n),"using"in b?b.using.call(a,k):e.css(k)}},f.fn.extend({position:function(){if(!this[0])return null;var a=this[0],b=this.offsetParent(),c=this.offset(),d=cx.test(b[0].nodeName)?{top:0,left:0}:b.offset();c.top-=parseFloat(f.css(a,"marginTop"))||0,c.left-=parseFloat(f.css(a,"marginLeft"))||0,d.top+=parseFloat(f.css(b[0],"borderTopWidth"))||0,d.left+=parseFloat(f.css(b[0],"borderLeftWidth"))||0;return{top:c.top-d.top,left:c.left-d.left}},offsetParent:function(){return this.map(function(){var a=this.offsetParent||c.body;while(a&&!cx.test(a.nodeName)&&f.css(a,"position")==="static")a=a.offsetParent;return a})}}),f.each({scrollLeft:"pageXOffset",scrollTop:"pageYOffset"},function(a,c){var d=/Y/.test(c);f.fn[a]=function(e){return f.access(this,function(a,e,g){var h=cy(a);if(g===b)return h?c in h?h[c]:f.support.boxModel&&h.document.documentElement[e]||h.document.body[e]:a[e];h?h.scrollTo(d?f(h).scrollLeft():g,d?g:f(h).scrollTop()):a[e]=g},a,e,arguments.length,null)}}),f.each({Height:"height",Width:"width"},function(a,c){var d="client"+a,e="scroll"+a,g="offset"+a;f.fn["inner"+a]=function(){var a=this[0];return a?a.style?parseFloat(f.css(a,c,"padding")):this[c]():null},f.fn["outer"+a]=function(a){var b=this[0];return b?b.style?parseFloat(f.css(b,c,a?"margin":"border")):this[c]():null},f.fn[c]=function(a){return f.access(this,function(a,c,h){var i,j,k,l;if(f.isWindow(a)){i=a.document,j=i.documentElement[d];return f.support.boxModel&&j||i.body&&i.body[d]||j}if(a.nodeType===9){i=a.documentElement;if(i[d]>=i[e])return i[d];return Math.max(a.body[e],i[e],a.body[g],i[g])}if(h===b){k=f.css(a,c),l=parseFloat(k);return f.isNumeric(l)?l:k}f(a).css(c,h)},c,a,arguments.length,null)}}),a.jQuery=a.$=f,typeof define=="function"&&define.amd&&define.amd.jQuery&&define("jquery",[],function(){return f})})(window); \ No newline at end of file diff --git a/synthetic_tree_viewer/synthetic_tree_viewer/static/js/argus/loadtaxdata.js b/synthetic_tree_viewer/synthetic_tree_viewer/static/js/argus/loadtaxdata.js new file mode 100644 index 000000000..3cd603dc9 --- /dev/null +++ b/synthetic_tree_viewer/synthetic_tree_viewer/static/js/argus/loadtaxdata.js @@ -0,0 +1,138 @@ +/* +@licstart The following is the entire license notice for the JavaScript code in this page. + + Copyright (c) 2013, Cody Hinchliff + Copyright (c) 2013, Joseph W. Brown + Copyright (c) 2013, Jim Allman + Copyright (c) 2013, Mark Holder + + All rights reserved. + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions are met: + + Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. + + Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE + FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER + CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, + OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +@licend The above is the entire license notice for the JavaScript code in this page. +*/ + +// the location of the TNRS query service +url = doTNRSForNames_url; // passed from main HTML page template + +/* + * NOTE - This appears to be dead code, so I'm not adapting it to work with the autocompleteQuery method + */ + +function roundDecimal(value, precision) { + var t = Math.pow(10,precision); + var result = Math.round(value*t)/t; + return result; +} + +function setup() { + + // attempt to get queried name from url string + var searchStr = ""; + var treeStr = ""; + var domsource = ""; + if (location.search != "") { + var tokstr = location.search.substr(1).split("?"); + var toks = String(tokstr).split("&"); + for (var i=0; i"); + $("body").append(results); + + // for each queried name + for(var i = 0; i < respData.results.length; i++) { + + // get the name itself + var queriedName = respData.results[i].queried_name; + var nameResultIdString = "taxEntry" + i; + + // create a sublist to hold matches to this name + $(results).append("
  • results for '" + queriedName + "'
  • ") + var nameResult = $("
      "); + $(results).append(nameResult); + + // print all matches to the sublist + var matches = respData.results[i].matches; + for (var j = 0; j < matches.length; j++) { + var thisMatch = matches[j]; + + var thisMatchResult = $("
    • "); + + var matchForm = $("
      ").append("").append("").append(""); + + thisMatchResult.append(matchForm).append(""+thisMatch.matchedNodeName+"").append(""+thisMatch.parentName+"").append(""+thisMatch.nomenCode+"").append(""+roundDecimal(thisMatch.score,3)+""); + + $(nameResult).append(thisMatchResult); + + // highlight odd match rows + if (j % 2 == 0) + thisMatchResult.attr("class","highlight"); + } + } + + if (respData.results.length == 0) { + $(results).append("
    • No results found for: " + queriedName + "
    • ") + } + + }); +} diff --git a/synthetic_tree_viewer/synthetic_tree_viewer/static/js/argus/nameresults.html b/synthetic_tree_viewer/synthetic_tree_viewer/static/js/argus/nameresults.html new file mode 100644 index 000000000..b20a9279d --- /dev/null +++ b/synthetic_tree_viewer/synthetic_tree_viewer/static/js/argus/nameresults.html @@ -0,0 +1,17 @@ + + +Node start point select form + + + + + + + + + + + + diff --git a/synthetic_tree_viewer/synthetic_tree_viewer/static/js/argus/raphael-min.js b/synthetic_tree_viewer/synthetic_tree_viewer/static/js/argus/raphael-min.js new file mode 100644 index 000000000..b907338b7 --- /dev/null +++ b/synthetic_tree_viewer/synthetic_tree_viewer/static/js/argus/raphael-min.js @@ -0,0 +1,12 @@ +// ┌────────────────────────────────────────────────────────────────────┐ \\ +// │ Raphaël 2.1.4 - JavaScript Vector Library │ \\ +// ├────────────────────────────────────────────────────────────────────┤ \\ +// │ Copyright © 2008-2012 Dmitry Baranovskiy (http://raphaeljs.com) │ \\ +// │ Copyright © 2008-2012 Sencha Labs (http://sencha.com) │ \\ +// ├────────────────────────────────────────────────────────────────────┤ \\ +// │ Licensed under the MIT (http://raphaeljs.com/license.html) license.│ \\ +// └────────────────────────────────────────────────────────────────────┘ \\ +!function(a,b){"function"==typeof define&&define.amd?define("eve",function(){return b()}):"object"==typeof exports?module.exports=b():a.eve=b()}(this,function(){var a,b,c="0.4.2",d="hasOwnProperty",e=/[\.\/]/,f="*",g=function(){},h=function(a,b){return a-b},i={n:{}},j=function(c,d){c=String(c);var e,f=b,g=Array.prototype.slice.call(arguments,2),i=j.listeners(c),k=0,l=[],m={},n=[],o=a;a=c,b=0;for(var p=0,q=i.length;q>p;p++)"zIndex"in i[p]&&(l.push(i[p].zIndex),i[p].zIndex<0&&(m[i[p].zIndex]=i[p]));for(l.sort(h);l[k]<0;)if(e=m[l[k++]],n.push(e.apply(d,g)),b)return b=f,n;for(p=0;q>p;p++)if(e=i[p],"zIndex"in e)if(e.zIndex==l[k]){if(n.push(e.apply(d,g)),b)break;do if(k++,e=m[l[k]],e&&n.push(e.apply(d,g)),b)break;while(e)}else m[e.zIndex]=e;else if(n.push(e.apply(d,g)),b)break;return b=f,a=o,n.length?n:null};return j._events=i,j.listeners=function(a){var b,c,d,g,h,j,k,l,m=a.split(e),n=i,o=[n],p=[];for(g=0,h=m.length;h>g;g++){for(l=[],j=0,k=o.length;k>j;j++)for(n=o[j].n,c=[n[m[g]],n[f]],d=2;d--;)b=c[d],b&&(l.push(b),p=p.concat(b.f||[]));o=l}return p},j.on=function(a,b){if(a=String(a),"function"!=typeof b)return function(){};for(var c=a.split(e),d=i,f=0,h=c.length;h>f;f++)d=d.n,d=d.hasOwnProperty(c[f])&&d[c[f]]||(d[c[f]]={n:{}});for(d.f=d.f||[],f=0,h=d.f.length;h>f;f++)if(d.f[f]==b)return g;return d.f.push(b),function(a){+a==+a&&(b.zIndex=+a)}},j.f=function(a){var b=[].slice.call(arguments,1);return function(){j.apply(null,[a,null].concat(b).concat([].slice.call(arguments,0)))}},j.stop=function(){b=1},j.nt=function(b){return b?new RegExp("(?:\\.|\\/|^)"+b+"(?:\\.|\\/|$)").test(a):a},j.nts=function(){return a.split(e)},j.off=j.unbind=function(a,b){if(!a)return void(j._events=i={n:{}});var c,g,h,k,l,m,n,o=a.split(e),p=[i];for(k=0,l=o.length;l>k;k++)for(m=0;mk;k++)for(c=p[k];c.n;){if(b){if(c.f){for(m=0,n=c.f.length;n>m;m++)if(c.f[m]==b){c.f.splice(m,1);break}!c.f.length&&delete c.f}for(g in c.n)if(c.n[d](g)&&c.n[g].f){var q=c.n[g].f;for(m=0,n=q.length;n>m;m++)if(q[m]==b){q.splice(m,1);break}!q.length&&delete c.n[g].f}}else{delete c.f;for(g in c.n)c.n[d](g)&&c.n[g].f&&delete c.n[g].f}c=c.n}},j.once=function(a,b){var c=function(){return j.unbind(a,c),b.apply(this,arguments)};return j.on(a,c)},j.version=c,j.toString=function(){return"You are running Eve "+c},j}),function(a,b){"function"==typeof define&&define.amd?define("raphael.core",["eve"],function(a){return b(a)}):"object"==typeof exports?module.exports=b(require("eve")):a.Raphael=b(a.eve)}(this,function(a){function b(c){if(b.is(c,"function"))return t?c():a.on("raphael.DOMload",c);if(b.is(c,U))return b._engine.create[C](b,c.splice(0,3+b.is(c[0],S))).add(c);var d=Array.prototype.slice.call(arguments,0);if(b.is(d[d.length-1],"function")){var e=d.pop();return t?e.call(b._engine.create[C](b,d)):a.on("raphael.DOMload",function(){e.call(b._engine.create[C](b,d))})}return b._engine.create[C](b,arguments)}function c(a){if("function"==typeof a||Object(a)!==a)return a;var b=new a.constructor;for(var d in a)a[y](d)&&(b[d]=c(a[d]));return b}function d(a,b){for(var c=0,d=a.length;d>c;c++)if(a[c]===b)return a.push(a.splice(c,1)[0])}function e(a,b,c){function e(){var f=Array.prototype.slice.call(arguments,0),g=f.join("␀"),h=e.cache=e.cache||{},i=e.count=e.count||[];return h[y](g)?(d(i,g),c?c(h[g]):h[g]):(i.length>=1e3&&delete h[i.shift()],i.push(g),h[g]=a[C](b,f),c?c(h[g]):h[g])}return e}function f(){return this.hex}function g(a,b){for(var c=[],d=0,e=a.length;e-2*!b>d;d+=2){var f=[{x:+a[d-2],y:+a[d-1]},{x:+a[d],y:+a[d+1]},{x:+a[d+2],y:+a[d+3]},{x:+a[d+4],y:+a[d+5]}];b?d?e-4==d?f[3]={x:+a[0],y:+a[1]}:e-2==d&&(f[2]={x:+a[0],y:+a[1]},f[3]={x:+a[2],y:+a[3]}):f[0]={x:+a[e-2],y:+a[e-1]}:e-4==d?f[3]=f[2]:d||(f[0]={x:+a[d],y:+a[d+1]}),c.push(["C",(-f[0].x+6*f[1].x+f[2].x)/6,(-f[0].y+6*f[1].y+f[2].y)/6,(f[1].x+6*f[2].x-f[3].x)/6,(f[1].y+6*f[2].y-f[3].y)/6,f[2].x,f[2].y])}return c}function h(a,b,c,d,e){var f=-3*b+9*c-9*d+3*e,g=a*f+6*b-12*c+6*d;return a*g-3*b+3*c}function i(a,b,c,d,e,f,g,i,j){null==j&&(j=1),j=j>1?1:0>j?0:j;for(var k=j/2,l=12,m=[-.1252,.1252,-.3678,.3678,-.5873,.5873,-.7699,.7699,-.9041,.9041,-.9816,.9816],n=[.2491,.2491,.2335,.2335,.2032,.2032,.1601,.1601,.1069,.1069,.0472,.0472],o=0,p=0;l>p;p++){var q=k*m[p]+k,r=h(q,a,c,e,g),s=h(q,b,d,f,i),t=r*r+s*s;o+=n[p]*M.sqrt(t)}return k*o}function j(a,b,c,d,e,f,g,h,j){if(!(0>j||i(a,b,c,d,e,f,g,h)o;)m/=2,n+=(j>k?1:-1)*m,k=i(a,b,c,d,e,f,g,h,n);return n}}function k(a,b,c,d,e,f,g,h){if(!(N(a,c)N(e,g)||N(b,d)N(f,h))){var i=(a*d-b*c)*(e-g)-(a-c)*(e*h-f*g),j=(a*d-b*c)*(f-h)-(b-d)*(e*h-f*g),k=(a-c)*(f-h)-(b-d)*(e-g);if(k){var l=i/k,m=j/k,n=+l.toFixed(2),o=+m.toFixed(2);if(!(n<+O(a,c).toFixed(2)||n>+N(a,c).toFixed(2)||n<+O(e,g).toFixed(2)||n>+N(e,g).toFixed(2)||o<+O(b,d).toFixed(2)||o>+N(b,d).toFixed(2)||o<+O(f,h).toFixed(2)||o>+N(f,h).toFixed(2)))return{x:l,y:m}}}}function l(a,c,d){var e=b.bezierBBox(a),f=b.bezierBBox(c);if(!b.isBBoxIntersect(e,f))return d?0:[];for(var g=i.apply(0,a),h=i.apply(0,c),j=N(~~(g/5),1),l=N(~~(h/5),1),m=[],n=[],o={},p=d?0:[],q=0;j+1>q;q++){var r=b.findDotsAtSegment.apply(b,a.concat(q/j));m.push({x:r.x,y:r.y,t:q/j})}for(q=0;l+1>q;q++)r=b.findDotsAtSegment.apply(b,c.concat(q/l)),n.push({x:r.x,y:r.y,t:q/l});for(q=0;j>q;q++)for(var s=0;l>s;s++){var t=m[q],u=m[q+1],v=n[s],w=n[s+1],x=P(u.x-t.x)<.001?"y":"x",y=P(w.x-v.x)<.001?"y":"x",z=k(t.x,t.y,u.x,u.y,v.x,v.y,w.x,w.y);if(z){if(o[z.x.toFixed(4)]==z.y.toFixed(4))continue;o[z.x.toFixed(4)]=z.y.toFixed(4);var A=t.t+P((z[x]-t[x])/(u[x]-t[x]))*(u.t-t.t),B=v.t+P((z[y]-v[y])/(w[y]-v[y]))*(w.t-v.t);A>=0&&1.001>=A&&B>=0&&1.001>=B&&(d?p++:p.push({x:z.x,y:z.y,t1:O(A,1),t2:O(B,1)}))}}return p}function m(a,c,d){a=b._path2curve(a),c=b._path2curve(c);for(var e,f,g,h,i,j,k,m,n,o,p=d?0:[],q=0,r=a.length;r>q;q++){var s=a[q];if("M"==s[0])e=i=s[1],f=j=s[2];else{"C"==s[0]?(n=[e,f].concat(s.slice(1)),e=n[6],f=n[7]):(n=[e,f,e,f,i,j,i,j],e=i,f=j);for(var t=0,u=c.length;u>t;t++){var v=c[t];if("M"==v[0])g=k=v[1],h=m=v[2];else{"C"==v[0]?(o=[g,h].concat(v.slice(1)),g=o[6],h=o[7]):(o=[g,h,g,h,k,m,k,m],g=k,h=m);var w=l(n,o,d);if(d)p+=w;else{for(var x=0,y=w.length;y>x;x++)w[x].segment1=q,w[x].segment2=t,w[x].bez1=n,w[x].bez2=o;p=p.concat(w)}}}}}return p}function n(a,b,c,d,e,f){null!=a?(this.a=+a,this.b=+b,this.c=+c,this.d=+d,this.e=+e,this.f=+f):(this.a=1,this.b=0,this.c=0,this.d=1,this.e=0,this.f=0)}function o(){return this.x+G+this.y+G+this.width+" × "+this.height}function p(a,b,c,d,e,f){function g(a){return((l*a+k)*a+j)*a}function h(a,b){var c=i(a,b);return((o*c+n)*c+m)*c}function i(a,b){var c,d,e,f,h,i;for(e=a,i=0;8>i;i++){if(f=g(e)-a,P(f)e)return c;if(e>d)return d;for(;d>c;){if(f=g(e),P(f-a)f?c=e:d=e,e=(d-c)/2+c}return e}var j=3*b,k=3*(d-b)-j,l=1-j-k,m=3*c,n=3*(e-c)-m,o=1-m-n;return h(a,1/(200*f))}function q(a,b){var c=[],d={};if(this.ms=b,this.times=1,a){for(var e in a)a[y](e)&&(d[$(e)]=a[e],c.push($(e)));c.sort(ka)}this.anim=d,this.top=c[c.length-1],this.percents=c}function r(c,d,e,f,g,h){e=$(e);var i,j,k,l,m,o,q=c.ms,r={},s={},t={};if(f)for(w=0,x=fb.length;x>w;w++){var u=fb[w];if(u.el.id==d.id&&u.anim==c){u.percent!=e?(fb.splice(w,1),k=1):j=u,d.attr(u.totalOrigin);break}}else f=+s;for(var w=0,x=c.percents.length;x>w;w++){if(c.percents[w]==e||c.percents[w]>f*c.top){e=c.percents[w],m=c.percents[w-1]||0,q=q/c.top*(e-m),l=c.percents[w+1],i=c.anim[e];break}f&&d.attr(c.anim[c.percents[w]])}if(i){if(j)j.initstatus=f,j.start=new Date-j.ms*f;else{for(var z in i)if(i[y](z)&&(ca[y](z)||d.paper.customAttributes[y](z)))switch(r[z]=d.attr(z),null==r[z]&&(r[z]=ba[z]),s[z]=i[z],ca[z]){case S:t[z]=(s[z]-r[z])/q;break;case"colour":r[z]=b.getRGB(r[z]);var A=b.getRGB(s[z]);t[z]={r:(A.r-r[z].r)/q,g:(A.g-r[z].g)/q,b:(A.b-r[z].b)/q};break;case"path":var B=Ia(r[z],s[z]),C=B[1];for(r[z]=B[0],t[z]=[],w=0,x=r[z].length;x>w;w++){t[z][w]=[0];for(var E=1,F=r[z][w].length;F>E;E++)t[z][w][E]=(C[w][E]-r[z][w][E])/q}break;case"transform":var G=d._,J=Na(G[z],s[z]);if(J)for(r[z]=J.from,s[z]=J.to,t[z]=[],t[z].real=!0,w=0,x=r[z].length;x>w;w++)for(t[z][w]=[r[z][w][0]],E=1,F=r[z][w].length;F>E;E++)t[z][w][E]=(s[z][w][E]-r[z][w][E])/q;else{var K=d.matrix||new n,L={_:{transform:G.transform},getBBox:function(){return d.getBBox(1)}};r[z]=[K.a,K.b,K.c,K.d,K.e,K.f],La(L,s[z]),s[z]=L._.transform,t[z]=[(L.matrix.a-K.a)/q,(L.matrix.b-K.b)/q,(L.matrix.c-K.c)/q,(L.matrix.d-K.d)/q,(L.matrix.e-K.e)/q,(L.matrix.f-K.f)/q]}break;case"csv":var M=H(i[z])[I](v),N=H(r[z])[I](v);if("clip-rect"==z)for(r[z]=N,t[z]=[],w=N.length;w--;)t[z][w]=(M[w]-r[z][w])/q;s[z]=M;break;default:for(M=[][D](i[z]),N=[][D](r[z]),t[z]=[],w=d.paper.customAttributes[z].length;w--;)t[z][w]=((M[w]||0)-(N[w]||0))/q}var O=i.easing,P=b.easing_formulas[O];if(!P)if(P=H(O).match(Y),P&&5==P.length){var Q=P;P=function(a){return p(a,+Q[1],+Q[2],+Q[3],+Q[4],q)}}else P=la;if(o=i.start||c.start||+new Date,u={anim:c,percent:e,timestamp:o,start:o+(c.del||0),status:0,initstatus:f||0,stop:!1,ms:q,easing:P,from:r,diff:t,to:s,el:d,callback:i.callback,prev:m,next:l,repeat:h||c.times,origin:d.attr(),totalOrigin:g},fb.push(u),f&&!j&&!k&&(u.stop=!0,u.start=new Date-q*f,1==fb.length))return hb();k&&(u.start=new Date-u.ms*f),1==fb.length&&gb(hb)}a("raphael.anim.start."+d.id,d,c)}}function s(a){for(var b=0;be;e++)for(i=a[e],f=1,h=i.length;h>f;f+=2)c=b.x(i[f],i[f+1]),d=b.y(i[f],i[f+1]),i[f]=c,i[f+1]=d;return a};if(b._g=z,b.type=z.win.SVGAngle||z.doc.implementation.hasFeature("http://www.w3.org/TR/SVG11/feature#BasicStructure","1.1")?"SVG":"VML","VML"==b.type){var qa,ra=z.doc.createElement("div");if(ra.innerHTML='',qa=ra.firstChild,qa.style.behavior="url(#default#VML)",!qa||"object"!=typeof qa.adj)return b.type=F;ra=null}b.svg=!(b.vml="VML"==b.type),b._Paper=B,b.fn=u=B.prototype=b.prototype,b._id=0,b._oid=0,b.is=function(a,b){return b=L.call(b),"finite"==b?!X[y](+a):"array"==b?a instanceof Array:"null"==b&&null===a||b==typeof a&&null!==a||"object"==b&&a===Object(a)||"array"==b&&Array.isArray&&Array.isArray(a)||V.call(a).slice(8,-1).toLowerCase()==b},b.angle=function(a,c,d,e,f,g){if(null==f){var h=a-d,i=c-e;return h||i?(180+180*M.atan2(-i,-h)/R+360)%360:0}return b.angle(a,c,f,g)-b.angle(d,e,f,g)},b.rad=function(a){return a%360*R/180},b.deg=function(a){return Math.round(180*a/R%360*1e3)/1e3},b.snapTo=function(a,c,d){if(d=b.is(d,"finite")?d:10,b.is(a,U)){for(var e=a.length;e--;)if(P(a[e]-c)<=d)return a[e]}else{a=+a;var f=c%a;if(d>f)return c-f;if(f>a-d)return c-f+a}return c};b.createUUID=function(a,b){return function(){return"xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx".replace(a,b).toUpperCase()}}(/[xy]/g,function(a){var b=16*M.random()|0,c="x"==a?b:3&b|8;return c.toString(16)});b.setWindow=function(c){a("raphael.setWindow",b,z.win,c),z.win=c,z.doc=z.win.document,b._engine.initWin&&b._engine.initWin(z.win)};var sa=function(a){if(b.vml){var c,d=/^\s+|\s+$/g;try{var f=new ActiveXObject("htmlfile");f.write(""),f.close(),c=f.body}catch(g){c=createPopup().document.body}var h=c.createTextRange();sa=e(function(a){try{c.style.color=H(a).replace(d,F);var b=h.queryCommandValue("ForeColor");return b=(255&b)<<16|65280&b|(16711680&b)>>>16,"#"+("000000"+b.toString(16)).slice(-6)}catch(e){return"none"}})}else{var i=z.doc.createElement("i");i.title="Raphaël Colour Picker",i.style.display="none",z.doc.body.appendChild(i),sa=e(function(a){return i.style.color=a,z.doc.defaultView.getComputedStyle(i,F).getPropertyValue("color")})}return sa(a)},ta=function(){return"hsb("+[this.h,this.s,this.b]+")"},ua=function(){return"hsl("+[this.h,this.s,this.l]+")"},va=function(){return this.hex},wa=function(a,c,d){if(null==c&&b.is(a,"object")&&"r"in a&&"g"in a&&"b"in a&&(d=a.b,c=a.g,a=a.r),null==c&&b.is(a,T)){var e=b.getRGB(a);a=e.r,c=e.g,d=e.b}return(a>1||c>1||d>1)&&(a/=255,c/=255,d/=255),[a,c,d]},xa=function(a,c,d,e){a*=255,c*=255,d*=255;var f={r:a,g:c,b:d,hex:b.rgb(a,c,d),toString:va};return b.is(e,"finite")&&(f.opacity=e),f};b.color=function(a){var c;return b.is(a,"object")&&"h"in a&&"s"in a&&"b"in a?(c=b.hsb2rgb(a),a.r=c.r,a.g=c.g,a.b=c.b,a.hex=c.hex):b.is(a,"object")&&"h"in a&&"s"in a&&"l"in a?(c=b.hsl2rgb(a),a.r=c.r,a.g=c.g,a.b=c.b,a.hex=c.hex):(b.is(a,"string")&&(a=b.getRGB(a)),b.is(a,"object")&&"r"in a&&"g"in a&&"b"in a?(c=b.rgb2hsl(a),a.h=c.h,a.s=c.s,a.l=c.l,c=b.rgb2hsb(a),a.v=c.b):(a={hex:"none"},a.r=a.g=a.b=a.h=a.s=a.v=a.l=-1)),a.toString=va,a},b.hsb2rgb=function(a,b,c,d){this.is(a,"object")&&"h"in a&&"s"in a&&"b"in a&&(c=a.b,b=a.s,d=a.o,a=a.h),a*=360;var e,f,g,h,i;return a=a%360/60,i=c*b,h=i*(1-P(a%2-1)),e=f=g=c-i,a=~~a,e+=[i,h,0,0,h,i][a],f+=[h,i,i,h,0,0][a],g+=[0,0,h,i,i,h][a],xa(e,f,g,d)},b.hsl2rgb=function(a,b,c,d){this.is(a,"object")&&"h"in a&&"s"in a&&"l"in a&&(c=a.l,b=a.s,a=a.h),(a>1||b>1||c>1)&&(a/=360,b/=100,c/=100),a*=360;var e,f,g,h,i;return a=a%360/60,i=2*b*(.5>c?c:1-c),h=i*(1-P(a%2-1)),e=f=g=c-i/2,a=~~a,e+=[i,h,0,0,h,i][a],f+=[h,i,i,h,0,0][a],g+=[0,0,h,i,i,h][a],xa(e,f,g,d)},b.rgb2hsb=function(a,b,c){c=wa(a,b,c),a=c[0],b=c[1],c=c[2];var d,e,f,g;return f=N(a,b,c),g=f-O(a,b,c),d=0==g?null:f==a?(b-c)/g:f==b?(c-a)/g+2:(a-b)/g+4,d=(d+360)%6*60/360,e=0==g?0:g/f,{h:d,s:e,b:f,toString:ta}},b.rgb2hsl=function(a,b,c){c=wa(a,b,c),a=c[0],b=c[1],c=c[2];var d,e,f,g,h,i;return g=N(a,b,c),h=O(a,b,c),i=g-h,d=0==i?null:g==a?(b-c)/i:g==b?(c-a)/i+2:(a-b)/i+4,d=(d+360)%6*60/360,f=(g+h)/2,e=0==i?0:.5>f?i/(2*f):i/(2-2*f),{h:d,s:e,l:f,toString:ua}},b._path2string=function(){return this.join(",").replace(fa,"$1")};b._preload=function(a,b){var c=z.doc.createElement("img");c.style.cssText="position:absolute;left:-9999em;top:-9999em",c.onload=function(){b.call(this),this.onload=null,z.doc.body.removeChild(this)},c.onerror=function(){z.doc.body.removeChild(this)},z.doc.body.appendChild(c),c.src=a};b.getRGB=e(function(a){if(!a||(a=H(a)).indexOf("-")+1)return{r:-1,g:-1,b:-1,hex:"none",error:1,toString:f};if("none"==a)return{r:-1,g:-1,b:-1,hex:"none",toString:f};!(ea[y](a.toLowerCase().substring(0,2))||"#"==a.charAt())&&(a=sa(a));var c,d,e,g,h,i,j=a.match(W);return j?(j[2]&&(e=_(j[2].substring(5),16),d=_(j[2].substring(3,5),16),c=_(j[2].substring(1,3),16)),j[3]&&(e=_((h=j[3].charAt(3))+h,16),d=_((h=j[3].charAt(2))+h,16),c=_((h=j[3].charAt(1))+h,16)),j[4]&&(i=j[4][I](da),c=$(i[0]),"%"==i[0].slice(-1)&&(c*=2.55),d=$(i[1]),"%"==i[1].slice(-1)&&(d*=2.55),e=$(i[2]),"%"==i[2].slice(-1)&&(e*=2.55),"rgba"==j[1].toLowerCase().slice(0,4)&&(g=$(i[3])),i[3]&&"%"==i[3].slice(-1)&&(g/=100)),j[5]?(i=j[5][I](da),c=$(i[0]),"%"==i[0].slice(-1)&&(c*=2.55),d=$(i[1]),"%"==i[1].slice(-1)&&(d*=2.55),e=$(i[2]),"%"==i[2].slice(-1)&&(e*=2.55),("deg"==i[0].slice(-3)||"°"==i[0].slice(-1))&&(c/=360),"hsba"==j[1].toLowerCase().slice(0,4)&&(g=$(i[3])),i[3]&&"%"==i[3].slice(-1)&&(g/=100),b.hsb2rgb(c,d,e,g)):j[6]?(i=j[6][I](da),c=$(i[0]),"%"==i[0].slice(-1)&&(c*=2.55),d=$(i[1]),"%"==i[1].slice(-1)&&(d*=2.55),e=$(i[2]),"%"==i[2].slice(-1)&&(e*=2.55),("deg"==i[0].slice(-3)||"°"==i[0].slice(-1))&&(c/=360),"hsla"==j[1].toLowerCase().slice(0,4)&&(g=$(i[3])),i[3]&&"%"==i[3].slice(-1)&&(g/=100),b.hsl2rgb(c,d,e,g)):(j={r:c,g:d,b:e,toString:f},j.hex="#"+(16777216|e|d<<8|c<<16).toString(16).slice(1),b.is(g,"finite")&&(j.opacity=g),j)):{r:-1,g:-1,b:-1,hex:"none",error:1,toString:f}},b),b.hsb=e(function(a,c,d){return b.hsb2rgb(a,c,d).hex}),b.hsl=e(function(a,c,d){return b.hsl2rgb(a,c,d).hex}),b.rgb=e(function(a,b,c){function d(a){return a+.5|0}return"#"+(16777216|d(c)|d(b)<<8|d(a)<<16).toString(16).slice(1)}),b.getColor=function(a){var b=this.getColor.start=this.getColor.start||{h:0,s:1,b:a||.75},c=this.hsb2rgb(b.h,b.s,b.b);return b.h+=.075,b.h>1&&(b.h=0,b.s-=.2,b.s<=0&&(this.getColor.start={h:0,s:1,b:b.b})),c.hex},b.getColor.reset=function(){delete this.start},b.parsePathString=function(a){if(!a)return null;var c=ya(a);if(c.arr)return Aa(c.arr);var d={a:7,c:6,h:1,l:2,m:2,r:4,q:4,s:4,t:2,v:1,z:0},e=[];return b.is(a,U)&&b.is(a[0],U)&&(e=Aa(a)),e.length||H(a).replace(ga,function(a,b,c){var f=[],g=b.toLowerCase();if(c.replace(ia,function(a,b){b&&f.push(+b)}),"m"==g&&f.length>2&&(e.push([b][D](f.splice(0,2))),g="l",b="m"==b?"l":"L"),"r"==g)e.push([b][D](f));else for(;f.length>=d[g]&&(e.push([b][D](f.splice(0,d[g]))),d[g]););}),e.toString=b._path2string,c.arr=Aa(e),e},b.parseTransformString=e(function(a){if(!a)return null;var c=[];return b.is(a,U)&&b.is(a[0],U)&&(c=Aa(a)),c.length||H(a).replace(ha,function(a,b,d){{var e=[];L.call(b)}d.replace(ia,function(a,b){b&&e.push(+b)}),c.push([b][D](e))}),c.toString=b._path2string,c});var ya=function(a){var b=ya.ps=ya.ps||{};return b[a]?b[a].sleep=100:b[a]={sleep:100},setTimeout(function(){for(var c in b)b[y](c)&&c!=a&&(b[c].sleep--,!b[c].sleep&&delete b[c])}),b[a]};b.findDotsAtSegment=function(a,b,c,d,e,f,g,h,i){var j=1-i,k=Q(j,3),l=Q(j,2),m=i*i,n=m*i,o=k*a+3*l*i*c+3*j*i*i*e+n*g,p=k*b+3*l*i*d+3*j*i*i*f+n*h,q=a+2*i*(c-a)+m*(e-2*c+a),r=b+2*i*(d-b)+m*(f-2*d+b),s=c+2*i*(e-c)+m*(g-2*e+c),t=d+2*i*(f-d)+m*(h-2*f+d),u=j*a+i*c,v=j*b+i*d,w=j*e+i*g,x=j*f+i*h,y=90-180*M.atan2(q-s,r-t)/R;return(q>s||t>r)&&(y+=180),{x:o,y:p,m:{x:q,y:r},n:{x:s,y:t},start:{x:u,y:v},end:{x:w,y:x},alpha:y}},b.bezierBBox=function(a,c,d,e,f,g,h,i){b.is(a,"array")||(a=[a,c,d,e,f,g,h,i]);var j=Ha.apply(null,a);return{x:j.min.x,y:j.min.y,x2:j.max.x,y2:j.max.y,width:j.max.x-j.min.x,height:j.max.y-j.min.y}},b.isPointInsideBBox=function(a,b,c){return b>=a.x&&b<=a.x2&&c>=a.y&&c<=a.y2},b.isBBoxIntersect=function(a,c){var d=b.isPointInsideBBox;return d(c,a.x,a.y)||d(c,a.x2,a.y)||d(c,a.x,a.y2)||d(c,a.x2,a.y2)||d(a,c.x,c.y)||d(a,c.x2,c.y)||d(a,c.x,c.y2)||d(a,c.x2,c.y2)||(a.xc.x||c.xa.x)&&(a.yc.y||c.ya.y)},b.pathIntersection=function(a,b){return m(a,b)},b.pathIntersectionNumber=function(a,b){return m(a,b,1)},b.isPointInsidePath=function(a,c,d){var e=b.pathBBox(a);return b.isPointInsideBBox(e,c,d)&&m(a,[["M",c,d],["H",e.x2+10]],1)%2==1},b._removedFactory=function(b){return function(){a("raphael.log",null,"Raphaël: you are calling to method “"+b+"” of removed object",b)}};var za=b.pathBBox=function(a){var b=ya(a);if(b.bbox)return c(b.bbox);if(!a)return{x:0,y:0,width:0,height:0,x2:0,y2:0};a=Ia(a);for(var d,e=0,f=0,g=[],h=[],i=0,j=a.length;j>i;i++)if(d=a[i],"M"==d[0])e=d[1],f=d[2],g.push(e),h.push(f);else{var k=Ha(e,f,d[1],d[2],d[3],d[4],d[5],d[6]);g=g[D](k.min.x,k.max.x),h=h[D](k.min.y,k.max.y),e=d[5],f=d[6]}var l=O[C](0,g),m=O[C](0,h),n=N[C](0,g),o=N[C](0,h),p=n-l,q=o-m,r={x:l,y:m,x2:n,y2:o,width:p,height:q,cx:l+p/2,cy:m+q/2};return b.bbox=c(r),r},Aa=function(a){var d=c(a);return d.toString=b._path2string,d},Ba=b._pathToRelative=function(a){var c=ya(a);if(c.rel)return Aa(c.rel);b.is(a,U)&&b.is(a&&a[0],U)||(a=b.parsePathString(a));var d=[],e=0,f=0,g=0,h=0,i=0;"M"==a[0][0]&&(e=a[0][1],f=a[0][2],g=e,h=f,i++,d.push(["M",e,f]));for(var j=i,k=a.length;k>j;j++){var l=d[j]=[],m=a[j];if(m[0]!=L.call(m[0]))switch(l[0]=L.call(m[0]),l[0]){case"a":l[1]=m[1],l[2]=m[2],l[3]=m[3],l[4]=m[4],l[5]=m[5],l[6]=+(m[6]-e).toFixed(3),l[7]=+(m[7]-f).toFixed(3);break;case"v":l[1]=+(m[1]-f).toFixed(3);break;case"m":g=m[1],h=m[2];default:for(var n=1,o=m.length;o>n;n++)l[n]=+(m[n]-(n%2?e:f)).toFixed(3)}else{l=d[j]=[],"m"==m[0]&&(g=m[1]+e,h=m[2]+f);for(var p=0,q=m.length;q>p;p++)d[j][p]=m[p]}var r=d[j].length;switch(d[j][0]){case"z":e=g,f=h;break;case"h":e+=+d[j][r-1];break;case"v":f+=+d[j][r-1];break;default:e+=+d[j][r-2],f+=+d[j][r-1]}}return d.toString=b._path2string,c.rel=Aa(d),d},Ca=b._pathToAbsolute=function(a){var c=ya(a);if(c.abs)return Aa(c.abs);if(b.is(a,U)&&b.is(a&&a[0],U)||(a=b.parsePathString(a)),!a||!a.length)return[["M",0,0]];var d=[],e=0,f=0,h=0,i=0,j=0;"M"==a[0][0]&&(e=+a[0][1],f=+a[0][2],h=e,i=f,j++,d[0]=["M",e,f]);for(var k,l,m=3==a.length&&"M"==a[0][0]&&"R"==a[1][0].toUpperCase()&&"Z"==a[2][0].toUpperCase(),n=j,o=a.length;o>n;n++){if(d.push(k=[]),l=a[n],l[0]!=aa.call(l[0]))switch(k[0]=aa.call(l[0]),k[0]){case"A":k[1]=l[1],k[2]=l[2],k[3]=l[3],k[4]=l[4],k[5]=l[5],k[6]=+(l[6]+e),k[7]=+(l[7]+f);break;case"V":k[1]=+l[1]+f;break;case"H":k[1]=+l[1]+e;break;case"R":for(var p=[e,f][D](l.slice(1)),q=2,r=p.length;r>q;q++)p[q]=+p[q]+e,p[++q]=+p[q]+f;d.pop(),d=d[D](g(p,m));break;case"M":h=+l[1]+e,i=+l[2]+f;default:for(q=1,r=l.length;r>q;q++)k[q]=+l[q]+(q%2?e:f)}else if("R"==l[0])p=[e,f][D](l.slice(1)),d.pop(),d=d[D](g(p,m)),k=["R"][D](l.slice(-2));else for(var s=0,t=l.length;t>s;s++)k[s]=l[s];switch(k[0]){case"Z":e=h,f=i;break;case"H":e=k[1];break;case"V":f=k[1];break;case"M":h=k[k.length-2],i=k[k.length-1];default:e=k[k.length-2],f=k[k.length-1]}}return d.toString=b._path2string,c.abs=Aa(d),d},Da=function(a,b,c,d){return[a,b,c,d,c,d]},Ea=function(a,b,c,d,e,f){var g=1/3,h=2/3;return[g*a+h*c,g*b+h*d,g*e+h*c,g*f+h*d,e,f]},Fa=function(a,b,c,d,f,g,h,i,j,k){var l,m=120*R/180,n=R/180*(+f||0),o=[],p=e(function(a,b,c){var d=a*M.cos(c)-b*M.sin(c),e=a*M.sin(c)+b*M.cos(c);return{x:d,y:e}});if(k)y=k[0],z=k[1],w=k[2],x=k[3];else{l=p(a,b,-n),a=l.x,b=l.y,l=p(i,j,-n),i=l.x,j=l.y;var q=(M.cos(R/180*f),M.sin(R/180*f),(a-i)/2),r=(b-j)/2,s=q*q/(c*c)+r*r/(d*d);s>1&&(s=M.sqrt(s),c=s*c,d=s*d);var t=c*c,u=d*d,v=(g==h?-1:1)*M.sqrt(P((t*u-t*r*r-u*q*q)/(t*r*r+u*q*q))),w=v*c*r/d+(a+i)/2,x=v*-d*q/c+(b+j)/2,y=M.asin(((b-x)/d).toFixed(9)),z=M.asin(((j-x)/d).toFixed(9));y=w>a?R-y:y,z=w>i?R-z:z,0>y&&(y=2*R+y),0>z&&(z=2*R+z),h&&y>z&&(y-=2*R),!h&&z>y&&(z-=2*R)}var A=z-y;if(P(A)>m){var B=z,C=i,E=j;z=y+m*(h&&z>y?1:-1),i=w+c*M.cos(z),j=x+d*M.sin(z),o=Fa(i,j,c,d,f,0,h,C,E,[z,B,w,x])}A=z-y;var F=M.cos(y),G=M.sin(y),H=M.cos(z),J=M.sin(z),K=M.tan(A/4),L=4/3*c*K,N=4/3*d*K,O=[a,b],Q=[a+L*G,b-N*F],S=[i+L*J,j-N*H],T=[i,j];if(Q[0]=2*O[0]-Q[0],Q[1]=2*O[1]-Q[1],k)return[Q,S,T][D](o);o=[Q,S,T][D](o).join()[I](",");for(var U=[],V=0,W=o.length;W>V;V++)U[V]=V%2?p(o[V-1],o[V],n).y:p(o[V],o[V+1],n).x;return U},Ga=function(a,b,c,d,e,f,g,h,i){var j=1-i;return{x:Q(j,3)*a+3*Q(j,2)*i*c+3*j*i*i*e+Q(i,3)*g,y:Q(j,3)*b+3*Q(j,2)*i*d+3*j*i*i*f+Q(i,3)*h}},Ha=e(function(a,b,c,d,e,f,g,h){var i,j=e-2*c+a-(g-2*e+c),k=2*(c-a)-2*(e-c),l=a-c,m=(-k+M.sqrt(k*k-4*j*l))/2/j,n=(-k-M.sqrt(k*k-4*j*l))/2/j,o=[b,h],p=[a,g];return P(m)>"1e12"&&(m=.5),P(n)>"1e12"&&(n=.5),m>0&&1>m&&(i=Ga(a,b,c,d,e,f,g,h,m),p.push(i.x),o.push(i.y)),n>0&&1>n&&(i=Ga(a,b,c,d,e,f,g,h,n),p.push(i.x),o.push(i.y)),j=f-2*d+b-(h-2*f+d),k=2*(d-b)-2*(f-d),l=b-d,m=(-k+M.sqrt(k*k-4*j*l))/2/j,n=(-k-M.sqrt(k*k-4*j*l))/2/j,P(m)>"1e12"&&(m=.5),P(n)>"1e12"&&(n=.5),m>0&&1>m&&(i=Ga(a,b,c,d,e,f,g,h,m),p.push(i.x),o.push(i.y)),n>0&&1>n&&(i=Ga(a,b,c,d,e,f,g,h,n),p.push(i.x),o.push(i.y)),{min:{x:O[C](0,p),y:O[C](0,o)},max:{x:N[C](0,p),y:N[C](0,o)}}}),Ia=b._path2curve=e(function(a,b){var c=!b&&ya(a);if(!b&&c.curve)return Aa(c.curve);for(var d=Ca(a),e=b&&Ca(b),f={x:0,y:0,bx:0,by:0,X:0,Y:0,qx:null,qy:null},g={x:0,y:0,bx:0,by:0,X:0,Y:0,qx:null,qy:null},h=(function(a,b,c){var d,e,f={T:1,Q:1};if(!a)return["C",b.x,b.y,b.x,b.y,b.x,b.y];switch(!(a[0]in f)&&(b.qx=b.qy=null),a[0]){case"M":b.X=a[1],b.Y=a[2];break;case"A":a=["C"][D](Fa[C](0,[b.x,b.y][D](a.slice(1))));break;case"S":"C"==c||"S"==c?(d=2*b.x-b.bx,e=2*b.y-b.by):(d=b.x,e=b.y),a=["C",d,e][D](a.slice(1));break;case"T":"Q"==c||"T"==c?(b.qx=2*b.x-b.qx,b.qy=2*b.y-b.qy):(b.qx=b.x,b.qy=b.y),a=["C"][D](Ea(b.x,b.y,b.qx,b.qy,a[1],a[2]));break;case"Q":b.qx=a[1],b.qy=a[2],a=["C"][D](Ea(b.x,b.y,a[1],a[2],a[3],a[4]));break;case"L":a=["C"][D](Da(b.x,b.y,a[1],a[2]));break;case"H":a=["C"][D](Da(b.x,b.y,a[1],b.y));break;case"V":a=["C"][D](Da(b.x,b.y,b.x,a[1]));break;case"Z":a=["C"][D](Da(b.x,b.y,b.X,b.Y))}return a}),i=function(a,b){if(a[b].length>7){a[b].shift();for(var c=a[b];c.length;)k[b]="A",e&&(l[b]="A"),a.splice(b++,0,["C"][D](c.splice(0,6)));a.splice(b,1),p=N(d.length,e&&e.length||0)}},j=function(a,b,c,f,g){a&&b&&"M"==a[g][0]&&"M"!=b[g][0]&&(b.splice(g,0,["M",f.x,f.y]),c.bx=0,c.by=0,c.x=a[g][1],c.y=a[g][2],p=N(d.length,e&&e.length||0))},k=[],l=[],m="",n="",o=0,p=N(d.length,e&&e.length||0);p>o;o++){d[o]&&(m=d[o][0]),"C"!=m&&(k[o]=m,o&&(n=k[o-1])),d[o]=h(d[o],f,n),"A"!=k[o]&&"C"==m&&(k[o]="C"),i(d,o),e&&(e[o]&&(m=e[o][0]),"C"!=m&&(l[o]=m,o&&(n=l[o-1])),e[o]=h(e[o],g,n),"A"!=l[o]&&"C"==m&&(l[o]="C"),i(e,o)),j(d,e,f,g,o),j(e,d,g,f,o);var q=d[o],r=e&&e[o],s=q.length,t=e&&r.length;f.x=q[s-2],f.y=q[s-1],f.bx=$(q[s-4])||f.x,f.by=$(q[s-3])||f.y,g.bx=e&&($(r[t-4])||g.x),g.by=e&&($(r[t-3])||g.y),g.x=e&&r[t-2],g.y=e&&r[t-1]}return e||(c.curve=Aa(d)),e?[d,e]:d},null,Aa),Ja=(b._parseDots=e(function(a){for(var c=[],d=0,e=a.length;e>d;d++){var f={},g=a[d].match(/^([^:]*):?([\d\.]*)/);if(f.color=b.getRGB(g[1]),f.color.error)return null;f.opacity=f.color.opacity,f.color=f.color.hex,g[2]&&(f.offset=g[2]+"%"),c.push(f)}for(d=1,e=c.length-1;e>d;d++)if(!c[d].offset){for(var h=$(c[d-1].offset||0),i=0,j=d+1;e>j;j++)if(c[j].offset){i=c[j].offset;break}i||(i=100,j=e),i=$(i);for(var k=(i-h)/(j-d+1);j>d;d++)h+=k,c[d].offset=h+"%"}return c}),b._tear=function(a,b){a==b.top&&(b.top=a.prev),a==b.bottom&&(b.bottom=a.next),a.next&&(a.next.prev=a.prev),a.prev&&(a.prev.next=a.next)}),Ka=(b._tofront=function(a,b){b.top!==a&&(Ja(a,b),a.next=null,a.prev=b.top,b.top.next=a,b.top=a)},b._toback=function(a,b){b.bottom!==a&&(Ja(a,b),a.next=b.bottom,a.prev=null,b.bottom.prev=a,b.bottom=a)},b._insertafter=function(a,b,c){Ja(a,c),b==c.top&&(c.top=a),b.next&&(b.next.prev=a),a.next=b.next,a.prev=b,b.next=a},b._insertbefore=function(a,b,c){Ja(a,c),b==c.bottom&&(c.bottom=a),b.prev&&(b.prev.next=a),a.prev=b.prev,b.prev=a,a.next=b},b.toMatrix=function(a,b){var c=za(a),d={_:{transform:F},getBBox:function(){return c}};return La(d,b),d.matrix}),La=(b.transformPath=function(a,b){return pa(a,Ka(a,b))},b._extractTransform=function(a,c){if(null==c)return a._.transform;c=H(c).replace(/\.{3}|\u2026/g,a._.transform||F);var d=b.parseTransformString(c),e=0,f=0,g=0,h=1,i=1,j=a._,k=new n;if(j.transform=d||[],d)for(var l=0,m=d.length;m>l;l++){var o,p,q,r,s,t=d[l],u=t.length,v=H(t[0]).toLowerCase(),w=t[0]!=v,x=w?k.invert():0;"t"==v&&3==u?w?(o=x.x(0,0),p=x.y(0,0),q=x.x(t[1],t[2]),r=x.y(t[1],t[2]),k.translate(q-o,r-p)):k.translate(t[1],t[2]):"r"==v?2==u?(s=s||a.getBBox(1),k.rotate(t[1],s.x+s.width/2,s.y+s.height/2),e+=t[1]):4==u&&(w?(q=x.x(t[2],t[3]),r=x.y(t[2],t[3]),k.rotate(t[1],q,r)):k.rotate(t[1],t[2],t[3]),e+=t[1]):"s"==v?2==u||3==u?(s=s||a.getBBox(1),k.scale(t[1],t[u-1],s.x+s.width/2,s.y+s.height/2),h*=t[1],i*=t[u-1]):5==u&&(w?(q=x.x(t[3],t[4]),r=x.y(t[3],t[4]),k.scale(t[1],t[2],q,r)):k.scale(t[1],t[2],t[3],t[4]),h*=t[1],i*=t[2]):"m"==v&&7==u&&k.add(t[1],t[2],t[3],t[4],t[5],t[6]),j.dirtyT=1,a.matrix=k}a.matrix=k,j.sx=h,j.sy=i,j.deg=e,j.dx=f=k.e,j.dy=g=k.f,1==h&&1==i&&!e&&j.bbox?(j.bbox.x+=+f,j.bbox.y+=+g):j.dirtyT=1}),Ma=function(a){var b=a[0];switch(b.toLowerCase()){case"t":return[b,0,0];case"m":return[b,1,0,0,1,0,0];case"r":return 4==a.length?[b,0,a[2],a[3]]:[b,0];case"s":return 5==a.length?[b,1,1,a[3],a[4]]:3==a.length?[b,1,1]:[b,1]}},Na=b._equaliseTransform=function(a,c){ +c=H(c).replace(/\.{3}|\u2026/g,a),a=b.parseTransformString(a)||[],c=b.parseTransformString(c)||[];for(var d,e,f,g,h=N(a.length,c.length),i=[],j=[],k=0;h>k;k++){if(f=a[k]||Ma(c[k]),g=c[k]||Ma(f),f[0]!=g[0]||"r"==f[0].toLowerCase()&&(f[2]!=g[2]||f[3]!=g[3])||"s"==f[0].toLowerCase()&&(f[3]!=g[3]||f[4]!=g[4]))return;for(i[k]=[],j[k]=[],d=0,e=N(f.length,g.length);e>d;d++)d in f&&(i[k][d]=f[d]),d in g&&(j[k][d]=g[d])}return{from:i,to:j}};b._getContainer=function(a,c,d,e){var f;return f=null!=e||b.is(a,"object")?a:z.doc.getElementById(a),null!=f?f.tagName?null==c?{container:f,width:f.style.pixelWidth||f.offsetWidth,height:f.style.pixelHeight||f.offsetHeight}:{container:f,width:c,height:d}:{container:1,x:a,y:c,width:d,height:e}:void 0},b.pathToRelative=Ba,b._engine={},b.path2curve=Ia,b.matrix=function(a,b,c,d,e,f){return new n(a,b,c,d,e,f)},function(a){function c(a){return a[0]*a[0]+a[1]*a[1]}function d(a){var b=M.sqrt(c(a));a[0]&&(a[0]/=b),a[1]&&(a[1]/=b)}a.add=function(a,b,c,d,e,f){var g,h,i,j,k=[[],[],[]],l=[[this.a,this.c,this.e],[this.b,this.d,this.f],[0,0,1]],m=[[a,c,e],[b,d,f],[0,0,1]];for(a&&a instanceof n&&(m=[[a.a,a.c,a.e],[a.b,a.d,a.f],[0,0,1]]),g=0;3>g;g++)for(h=0;3>h;h++){for(j=0,i=0;3>i;i++)j+=l[g][i]*m[i][h];k[g][h]=j}this.a=k[0][0],this.b=k[1][0],this.c=k[0][1],this.d=k[1][1],this.e=k[0][2],this.f=k[1][2]},a.invert=function(){var a=this,b=a.a*a.d-a.b*a.c;return new n(a.d/b,-a.b/b,-a.c/b,a.a/b,(a.c*a.f-a.d*a.e)/b,(a.b*a.e-a.a*a.f)/b)},a.clone=function(){return new n(this.a,this.b,this.c,this.d,this.e,this.f)},a.translate=function(a,b){this.add(1,0,0,1,a,b)},a.scale=function(a,b,c,d){null==b&&(b=a),(c||d)&&this.add(1,0,0,1,c,d),this.add(a,0,0,b,0,0),(c||d)&&this.add(1,0,0,1,-c,-d)},a.rotate=function(a,c,d){a=b.rad(a),c=c||0,d=d||0;var e=+M.cos(a).toFixed(9),f=+M.sin(a).toFixed(9);this.add(e,f,-f,e,c,d),this.add(1,0,0,1,-c,-d)},a.x=function(a,b){return a*this.a+b*this.c+this.e},a.y=function(a,b){return a*this.b+b*this.d+this.f},a.get=function(a){return+this[H.fromCharCode(97+a)].toFixed(4)},a.toString=function(){return b.svg?"matrix("+[this.get(0),this.get(1),this.get(2),this.get(3),this.get(4),this.get(5)].join()+")":[this.get(0),this.get(2),this.get(1),this.get(3),0,0].join()},a.toFilter=function(){return"progid:DXImageTransform.Microsoft.Matrix(M11="+this.get(0)+", M12="+this.get(2)+", M21="+this.get(1)+", M22="+this.get(3)+", Dx="+this.get(4)+", Dy="+this.get(5)+", sizingmethod='auto expand')"},a.offset=function(){return[this.e.toFixed(4),this.f.toFixed(4)]},a.split=function(){var a={};a.dx=this.e,a.dy=this.f;var e=[[this.a,this.c],[this.b,this.d]];a.scalex=M.sqrt(c(e[0])),d(e[0]),a.shear=e[0][0]*e[1][0]+e[0][1]*e[1][1],e[1]=[e[1][0]-e[0][0]*a.shear,e[1][1]-e[0][1]*a.shear],a.scaley=M.sqrt(c(e[1])),d(e[1]),a.shear/=a.scaley;var f=-e[0][1],g=e[1][1];return 0>g?(a.rotate=b.deg(M.acos(g)),0>f&&(a.rotate=360-a.rotate)):a.rotate=b.deg(M.asin(f)),a.isSimple=!(+a.shear.toFixed(9)||a.scalex.toFixed(9)!=a.scaley.toFixed(9)&&a.rotate),a.isSuperSimple=!+a.shear.toFixed(9)&&a.scalex.toFixed(9)==a.scaley.toFixed(9)&&!a.rotate,a.noRotation=!+a.shear.toFixed(9)&&!a.rotate,a},a.toTransformString=function(a){var b=a||this[I]();return b.isSimple?(b.scalex=+b.scalex.toFixed(4),b.scaley=+b.scaley.toFixed(4),b.rotate=+b.rotate.toFixed(4),(b.dx||b.dy?"t"+[b.dx,b.dy]:F)+(1!=b.scalex||1!=b.scaley?"s"+[b.scalex,b.scaley,0,0]:F)+(b.rotate?"r"+[b.rotate,0,0]:F)):"m"+[this.get(0),this.get(1),this.get(2),this.get(3),this.get(4),this.get(5)]}}(n.prototype);for(var Oa=function(){this.returnValue=!1},Pa=function(){return this.originalEvent.preventDefault()},Qa=function(){this.cancelBubble=!0},Ra=function(){return this.originalEvent.stopPropagation()},Sa=function(a){var b=z.doc.documentElement.scrollTop||z.doc.body.scrollTop,c=z.doc.documentElement.scrollLeft||z.doc.body.scrollLeft;return{x:a.clientX+c,y:a.clientY+b}},Ta=function(){return z.doc.addEventListener?function(a,b,c,d){var e=function(a){var b=Sa(a);return c.call(d,a,b.x,b.y)};if(a.addEventListener(b,e,!1),E&&K[b]){var f=function(b){for(var e=Sa(b),f=b,g=0,h=b.targetTouches&&b.targetTouches.length;h>g;g++)if(b.targetTouches[g].target==a){b=b.targetTouches[g],b.originalEvent=f,b.preventDefault=Pa,b.stopPropagation=Ra;break}return c.call(d,b,e.x,e.y)};a.addEventListener(K[b],f,!1)}return function(){return a.removeEventListener(b,e,!1),E&&K[b]&&a.removeEventListener(K[b],f,!1),!0}}:z.doc.attachEvent?function(a,b,c,d){var e=function(a){a=a||z.win.event;var b=z.doc.documentElement.scrollTop||z.doc.body.scrollTop,e=z.doc.documentElement.scrollLeft||z.doc.body.scrollLeft,f=a.clientX+e,g=a.clientY+b;return a.preventDefault=a.preventDefault||Oa,a.stopPropagation=a.stopPropagation||Qa,c.call(d,a,f,g)};a.attachEvent("on"+b,e);var f=function(){return a.detachEvent("on"+b,e),!0};return f}:void 0}(),Ua=[],Va=function(b){for(var c,d=b.clientX,e=b.clientY,f=z.doc.documentElement.scrollTop||z.doc.body.scrollTop,g=z.doc.documentElement.scrollLeft||z.doc.body.scrollLeft,h=Ua.length;h--;){if(c=Ua[h],E&&b.touches){for(var i,j=b.touches.length;j--;)if(i=b.touches[j],i.identifier==c.el._drag.id){d=i.clientX,e=i.clientY,(b.originalEvent?b.originalEvent:b).preventDefault();break}}else b.preventDefault();var k,l=c.el.node,m=l.nextSibling,n=l.parentNode,o=l.style.display;z.win.opera&&n.removeChild(l),l.style.display="none",k=c.el.paper.getElementByPoint(d,e),l.style.display=o,z.win.opera&&(m?n.insertBefore(l,m):n.appendChild(l)),k&&a("raphael.drag.over."+c.el.id,c.el,k),d+=g,e+=f,a("raphael.drag.move."+c.el.id,c.move_scope||c.el,d-c.el._drag.x,e-c.el._drag.y,d,e,b)}},Wa=function(c){b.unmousemove(Va).unmouseup(Wa);for(var d,e=Ua.length;e--;)d=Ua[e],d.el._drag={},a("raphael.drag.end."+d.el.id,d.end_scope||d.start_scope||d.move_scope||d.el,c);Ua=[]},Xa=b.el={},Ya=J.length;Ya--;)!function(a){b[a]=Xa[a]=function(c,d){return b.is(c,"function")&&(this.events=this.events||[],this.events.push({name:a,f:c,unbind:Ta(this.shape||this.node||z.doc,a,c,d||this)})),this},b["un"+a]=Xa["un"+a]=function(c){for(var d=this.events||[],e=d.length;e--;)d[e].name!=a||!b.is(c,"undefined")&&d[e].f!=c||(d[e].unbind(),d.splice(e,1),!d.length&&delete this.events);return this}}(J[Ya]);Xa.data=function(c,d){var e=ja[this.id]=ja[this.id]||{};if(0==arguments.length)return e;if(1==arguments.length){if(b.is(c,"object")){for(var f in c)c[y](f)&&this.data(f,c[f]);return this}return a("raphael.data.get."+this.id,this,e[c],c),e[c]}return e[c]=d,a("raphael.data.set."+this.id,this,d,c),this},Xa.removeData=function(a){return null==a?ja[this.id]={}:ja[this.id]&&delete ja[this.id][a],this},Xa.getData=function(){return c(ja[this.id]||{})},Xa.hover=function(a,b,c,d){return this.mouseover(a,c).mouseout(b,d||c)},Xa.unhover=function(a,b){return this.unmouseover(a).unmouseout(b)};var Za=[];Xa.drag=function(c,d,e,f,g,h){function i(i){(i.originalEvent||i).preventDefault();var j=i.clientX,k=i.clientY,l=z.doc.documentElement.scrollTop||z.doc.body.scrollTop,m=z.doc.documentElement.scrollLeft||z.doc.body.scrollLeft;if(this._drag.id=i.identifier,E&&i.touches)for(var n,o=i.touches.length;o--;)if(n=i.touches[o],this._drag.id=n.identifier,n.identifier==this._drag.id){j=n.clientX,k=n.clientY;break}this._drag.x=j+m,this._drag.y=k+l,!Ua.length&&b.mousemove(Va).mouseup(Wa),Ua.push({el:this,move_scope:f,start_scope:g,end_scope:h}),d&&a.on("raphael.drag.start."+this.id,d),c&&a.on("raphael.drag.move."+this.id,c),e&&a.on("raphael.drag.end."+this.id,e),a("raphael.drag.start."+this.id,g||f||this,i.clientX+m,i.clientY+l,i)}return this._drag={},Za.push({el:this,start:i}),this.mousedown(i),this},Xa.onDragOver=function(b){b?a.on("raphael.drag.over."+this.id,b):a.unbind("raphael.drag.over."+this.id)},Xa.undrag=function(){for(var c=Za.length;c--;)Za[c].el==this&&(this.unmousedown(Za[c].start),Za.splice(c,1),a.unbind("raphael.drag.*."+this.id));!Za.length&&b.unmousemove(Va).unmouseup(Wa),Ua=[]},u.circle=function(a,c,d){var e=b._engine.circle(this,a||0,c||0,d||0);return this.__set__&&this.__set__.push(e),e},u.rect=function(a,c,d,e,f){var g=b._engine.rect(this,a||0,c||0,d||0,e||0,f||0);return this.__set__&&this.__set__.push(g),g},u.ellipse=function(a,c,d,e){var f=b._engine.ellipse(this,a||0,c||0,d||0,e||0);return this.__set__&&this.__set__.push(f),f},u.path=function(a){a&&!b.is(a,T)&&!b.is(a[0],U)&&(a+=F);var c=b._engine.path(b.format[C](b,arguments),this);return this.__set__&&this.__set__.push(c),c},u.image=function(a,c,d,e,f){var g=b._engine.image(this,a||"about:blank",c||0,d||0,e||0,f||0);return this.__set__&&this.__set__.push(g),g},u.text=function(a,c,d){var e=b._engine.text(this,a||0,c||0,H(d));return this.__set__&&this.__set__.push(e),e},u.set=function(a){!b.is(a,"array")&&(a=Array.prototype.splice.call(arguments,0,arguments.length));var c=new jb(a);return this.__set__&&this.__set__.push(c),c.paper=this,c.type="set",c},u.setStart=function(a){this.__set__=a||this.set()},u.setFinish=function(a){var b=this.__set__;return delete this.__set__,b},u.getSize=function(){var a=this.canvas.parentNode;return{width:a.offsetWidth,height:a.offsetHeight}},u.setSize=function(a,c){return b._engine.setSize.call(this,a,c)},u.setViewBox=function(a,c,d,e,f){return b._engine.setViewBox.call(this,a,c,d,e,f)},u.top=u.bottom=null,u.raphael=b;var $a=function(a){var b=a.getBoundingClientRect(),c=a.ownerDocument,d=c.body,e=c.documentElement,f=e.clientTop||d.clientTop||0,g=e.clientLeft||d.clientLeft||0,h=b.top+(z.win.pageYOffset||e.scrollTop||d.scrollTop)-f,i=b.left+(z.win.pageXOffset||e.scrollLeft||d.scrollLeft)-g;return{y:h,x:i}};u.getElementByPoint=function(a,b){var c=this,d=c.canvas,e=z.doc.elementFromPoint(a,b);if(z.win.opera&&"svg"==e.tagName){var f=$a(d),g=d.createSVGRect();g.x=a-f.x,g.y=b-f.y,g.width=g.height=1;var h=d.getIntersectionList(g,null);h.length&&(e=h[h.length-1])}if(!e)return null;for(;e.parentNode&&e!=d.parentNode&&!e.raphael;)e=e.parentNode;return e==c.canvas.parentNode&&(e=d),e=e&&e.raphael?c.getById(e.raphaelid):null},u.getElementsByBBox=function(a){var c=this.set();return this.forEach(function(d){b.isBBoxIntersect(d.getBBox(),a)&&c.push(d)}),c},u.getById=function(a){for(var b=this.bottom;b;){if(b.id==a)return b;b=b.next}return null},u.forEach=function(a,b){for(var c=this.bottom;c;){if(a.call(b,c)===!1)return this;c=c.next}return this},u.getElementsByPoint=function(a,b){var c=this.set();return this.forEach(function(d){d.isPointInside(a,b)&&c.push(d)}),c},Xa.isPointInside=function(a,c){var d=this.realPath=oa[this.type](this);return this.attr("transform")&&this.attr("transform").length&&(d=b.transformPath(d,this.attr("transform"))),b.isPointInsidePath(d,a,c)},Xa.getBBox=function(a){if(this.removed)return{};var b=this._;return a?((b.dirty||!b.bboxwt)&&(this.realPath=oa[this.type](this),b.bboxwt=za(this.realPath),b.bboxwt.toString=o,b.dirty=0),b.bboxwt):((b.dirty||b.dirtyT||!b.bbox)&&((b.dirty||!this.realPath)&&(b.bboxwt=0,this.realPath=oa[this.type](this)),b.bbox=za(pa(this.realPath,this.matrix)),b.bbox.toString=o,b.dirty=b.dirtyT=0),b.bbox)},Xa.clone=function(){if(this.removed)return null;var a=this.paper[this.type]().attr(this.attr());return this.__set__&&this.__set__.push(a),a},Xa.glow=function(a){if("text"==this.type)return null;a=a||{};var b={width:(a.width||10)+(+this.attr("stroke-width")||1),fill:a.fill||!1,opacity:null==a.opacity?.5:a.opacity,offsetx:a.offsetx||0,offsety:a.offsety||0,color:a.color||"#000"},c=b.width/2,d=this.paper,e=d.set(),f=this.realPath||oa[this.type](this);f=this.matrix?pa(f,this.matrix):f;for(var g=1;c+1>g;g++)e.push(d.path(f).attr({stroke:b.color,fill:b.fill?b.color:"none","stroke-linejoin":"round","stroke-linecap":"round","stroke-width":+(b.width/c*g).toFixed(3),opacity:+(b.opacity/c).toFixed(3)}));return e.insertBefore(this).translate(b.offsetx,b.offsety)};var _a=function(a,c,d,e,f,g,h,k,l){return null==l?i(a,c,d,e,f,g,h,k):b.findDotsAtSegment(a,c,d,e,f,g,h,k,j(a,c,d,e,f,g,h,k,l))},ab=function(a,c){return function(d,e,f){d=Ia(d);for(var g,h,i,j,k,l="",m={},n=0,o=0,p=d.length;p>o;o++){if(i=d[o],"M"==i[0])g=+i[1],h=+i[2];else{if(j=_a(g,h,i[1],i[2],i[3],i[4],i[5],i[6]),n+j>e){if(c&&!m.start){if(k=_a(g,h,i[1],i[2],i[3],i[4],i[5],i[6],e-n),l+=["C"+k.start.x,k.start.y,k.m.x,k.m.y,k.x,k.y],f)return l;m.start=l,l=["M"+k.x,k.y+"C"+k.n.x,k.n.y,k.end.x,k.end.y,i[5],i[6]].join(),n+=j,g=+i[5],h=+i[6];continue}if(!a&&!c)return k=_a(g,h,i[1],i[2],i[3],i[4],i[5],i[6],e-n),{x:k.x,y:k.y,alpha:k.alpha}}n+=j,g=+i[5],h=+i[6]}l+=i.shift()+i}return m.end=l,k=a?n:c?m:b.findDotsAtSegment(g,h,i[0],i[1],i[2],i[3],i[4],i[5],1),k.alpha&&(k={x:k.x,y:k.y,alpha:k.alpha}),k}},bb=ab(1),cb=ab(),db=ab(0,1);b.getTotalLength=bb,b.getPointAtLength=cb,b.getSubpath=function(a,b,c){if(this.getTotalLength(a)-c<1e-6)return db(a,b).end;var d=db(a,c,1);return b?db(d,b).end:d},Xa.getTotalLength=function(){var a=this.getPath();if(a)return this.node.getTotalLength?this.node.getTotalLength():bb(a)},Xa.getPointAtLength=function(a){var b=this.getPath();if(b)return cb(b,a)},Xa.getPath=function(){var a,c=b._getPath[this.type];if("text"!=this.type&&"set"!=this.type)return c&&(a=c(this)),a},Xa.getSubpath=function(a,c){var d=this.getPath();if(d)return b.getSubpath(d,a,c)};var eb=b.easing_formulas={linear:function(a){return a},"<":function(a){return Q(a,1.7)},">":function(a){return Q(a,.48)},"<>":function(a){var b=.48-a/1.04,c=M.sqrt(.1734+b*b),d=c-b,e=Q(P(d),1/3)*(0>d?-1:1),f=-c-b,g=Q(P(f),1/3)*(0>f?-1:1),h=e+g+.5;return 3*(1-h)*h*h+h*h*h},backIn:function(a){var b=1.70158;return a*a*((b+1)*a-b)},backOut:function(a){a-=1;var b=1.70158;return a*a*((b+1)*a+b)+1},elastic:function(a){return a==!!a?a:Q(2,-10*a)*M.sin(2*(a-.075)*R/.3)+1},bounce:function(a){var b,c=7.5625,d=2.75;return 1/d>a?b=c*a*a:2/d>a?(a-=1.5/d,b=c*a*a+.75):2.5/d>a?(a-=2.25/d,b=c*a*a+.9375):(a-=2.625/d,b=c*a*a+.984375),b}};eb.easeIn=eb["ease-in"]=eb["<"],eb.easeOut=eb["ease-out"]=eb[">"],eb.easeInOut=eb["ease-in-out"]=eb["<>"],eb["back-in"]=eb.backIn,eb["back-out"]=eb.backOut;var fb=[],gb=window.requestAnimationFrame||window.webkitRequestAnimationFrame||window.mozRequestAnimationFrame||window.oRequestAnimationFrame||window.msRequestAnimationFrame||function(a){setTimeout(a,16)},hb=function(){for(var c=+new Date,d=0;dh))if(i>h){var q=j(h/i);for(var s in k)if(k[y](s)){switch(ca[s]){case S:f=+k[s]+q*i*l[s];break;case"colour":f="rgb("+[ib(Z(k[s].r+q*i*l[s].r)),ib(Z(k[s].g+q*i*l[s].g)),ib(Z(k[s].b+q*i*l[s].b))].join(",")+")";break;case"path":f=[];for(var t=0,u=k[s].length;u>t;t++){f[t]=[k[s][t][0]];for(var v=1,w=k[s][t].length;w>v;v++)f[t][v]=+k[s][t][v]+q*i*l[s][t][v];f[t]=f[t].join(G)}f=f.join(G);break;case"transform":if(l[s].real)for(f=[],t=0,u=k[s].length;u>t;t++)for(f[t]=[k[s][t][0]],v=1,w=k[s][t].length;w>v;v++)f[t][v]=k[s][t][v]+q*i*l[s][t][v];else{var x=function(a){return+k[s][a]+q*i*l[s][a]};f=[["m",x(0),x(1),x(2),x(3),x(4),x(5)]]}break;case"csv":if("clip-rect"==s)for(f=[],t=4;t--;)f[t]=+k[s][t]+q*i*l[s][t];break;default:var z=[][D](k[s]);for(f=[],t=n.paper.customAttributes[s].length;t--;)f[t]=+z[t]+q*i*l[s][t]}o[s]=f}n.attr(o),function(b,c,d){setTimeout(function(){a("raphael.anim.frame."+b,c,d)})}(n.id,n,e.anim)}else{if(function(c,d,e){setTimeout(function(){a("raphael.anim.frame."+d.id,d,e),a("raphael.anim.finish."+d.id,d,e),b.is(c,"function")&&c.call(d)})}(e.callback,n,e.anim),n.attr(m),fb.splice(d--,1),e.repeat>1&&!e.next){for(g in m)m[y](g)&&(p[g]=e.totalOrigin[g]);e.el.attr(p),r(e.anim,e.el,e.anim.percents[0],null,e.totalOrigin,e.repeat-1)}e.next&&!e.stop&&r(e.anim,e.el,e.next,null,e.totalOrigin,e.repeat)}}}fb.length&&gb(hb)},ib=function(a){return a>255?255:0>a?0:a};Xa.animateWith=function(a,c,d,e,f,g){var h=this;if(h.removed)return g&&g.call(h),h;var i=d instanceof q?d:b.animation(d,e,f,g);r(i,h,i.percents[0],null,h.attr());for(var j=0,k=fb.length;k>j;j++)if(fb[j].anim==c&&fb[j].el==a){fb[k-1].start=fb[j].start;break}return h},Xa.onAnimation=function(b){return b?a.on("raphael.anim.frame."+this.id,b):a.unbind("raphael.anim.frame."+this.id),this},q.prototype.delay=function(a){var b=new q(this.anim,this.ms);return b.times=this.times,b.del=+a||0,b},q.prototype.repeat=function(a){var b=new q(this.anim,this.ms);return b.del=this.del,b.times=M.floor(N(a,0))||1,b},b.animation=function(a,c,d,e){if(a instanceof q)return a;(b.is(d,"function")||!d)&&(e=e||d||null,d=null),a=Object(a),c=+c||0;var f,g,h={};for(g in a)a[y](g)&&$(g)!=g&&$(g)+"%"!=g&&(f=!0,h[g]=a[g]);if(f)return d&&(h.easing=d),e&&(h.callback=e),new q({100:h},c);if(e){var i=0;for(var j in a){var k=_(j);a[y](j)&&k>i&&(i=k)}i+="%",!a[i].callback&&(a[i].callback=e)}return new q(a,c)},Xa.animate=function(a,c,d,e){var f=this;if(f.removed)return e&&e.call(f),f;var g=a instanceof q?a:b.animation(a,c,d,e);return r(g,f,g.percents[0],null,f.attr()),f},Xa.setTime=function(a,b){return a&&null!=b&&this.status(a,O(b,a.ms)/a.ms),this},Xa.status=function(a,b){var c,d,e=[],f=0;if(null!=b)return r(a,this,-1,O(b,1)),this;for(c=fb.length;c>f;f++)if(d=fb[f],d.el.id==this.id&&(!a||d.anim==a)){if(a)return d.status;e.push({anim:d.anim,status:d.status})}return a?0:e},Xa.pause=function(b){for(var c=0;cb;b++)!a[b]||a[b].constructor!=Xa.constructor&&a[b].constructor!=jb||(this[this.items.length]=this.items[this.items.length]=a[b],this.length++)},kb=jb.prototype;kb.push=function(){for(var a,b,c=0,d=arguments.length;d>c;c++)a=arguments[c],!a||a.constructor!=Xa.constructor&&a.constructor!=jb||(b=this.items.length,this[b]=this.items[b]=a,this.length++);return this},kb.pop=function(){return this.length&&delete this[this.length--],this.items.pop()},kb.forEach=function(a,b){for(var c=0,d=this.items.length;d>c;c++)if(a.call(b,this.items[c],c)===!1)return this;return this};for(var lb in Xa)Xa[y](lb)&&(kb[lb]=function(a){return function(){var b=arguments;return this.forEach(function(c){c[a][C](c,b)})}}(lb));return kb.attr=function(a,c){if(a&&b.is(a,U)&&b.is(a[0],"object"))for(var d=0,e=a.length;e>d;d++)this.items[d].attr(a[d]);else for(var f=0,g=this.items.length;g>f;f++)this.items[f].attr(a,c);return this},kb.clear=function(){for(;this.length;)this.pop()},kb.splice=function(a,b,c){a=0>a?N(this.length+a,0):a,b=N(0,O(this.length-a,b));var d,e=[],f=[],g=[];for(d=2;dd;d++)f.push(this[a+d]);for(;dd?g[d]:e[d-h];for(d=this.items.length=this.length-=b-h;this[d];)delete this[d++];return new jb(f)},kb.exclude=function(a){for(var b=0,c=this.length;c>b;b++)if(this[b]==a)return this.splice(b,1),!0},kb.animate=function(a,c,d,e){(b.is(d,"function")||!d)&&(e=d||null);var f,g,h=this.items.length,i=h,j=this;if(!h)return this;e&&(g=function(){!--h&&e.call(j)}),d=b.is(d,T)?d:g;var k=b.animation(a,c,d,g);for(f=this.items[--i].animate(k);i--;)this.items[i]&&!this.items[i].removed&&this.items[i].animateWith(f,k,k),this.items[i]&&!this.items[i].removed||h--;return this},kb.insertAfter=function(a){for(var b=this.items.length;b--;)this.items[b].insertAfter(a);return this},kb.getBBox=function(){for(var a=[],b=[],c=[],d=[],e=this.items.length;e--;)if(!this.items[e].removed){var f=this.items[e].getBBox();a.push(f.x),b.push(f.y),c.push(f.x+f.width),d.push(f.y+f.height)}return a=O[C](0,a),b=O[C](0,b),c=N[C](0,c),d=N[C](0,d),{x:a,y:b,x2:c,y2:d,width:c-a,height:d-b}},kb.clone=function(a){a=this.paper.set();for(var b=0,c=this.items.length;c>b;b++)a.push(this.items[b].clone());return a},kb.toString=function(){return"Raphaël‘s set"},kb.glow=function(a){var b=this.paper.set();return this.forEach(function(c,d){var e=c.glow(a);null!=e&&e.forEach(function(a,c){b.push(a)})}),b},kb.isPointInside=function(a,b){var c=!1;return this.forEach(function(d){return d.isPointInside(a,b)?(c=!0,!1):void 0}),c},b.registerFont=function(a){if(!a.face)return a;this.fonts=this.fonts||{};var b={w:a.w,face:{},glyphs:{}},c=a.face["font-family"];for(var d in a.face)a.face[y](d)&&(b.face[d]=a.face[d]);if(this.fonts[c]?this.fonts[c].push(b):this.fonts[c]=[b],!a.svg){b.face["units-per-em"]=_(a.face["units-per-em"],10);for(var e in a.glyphs)if(a.glyphs[y](e)){var f=a.glyphs[e];if(b.glyphs[e]={w:f.w,k:{},d:f.d&&"M"+f.d.replace(/[mlcxtrv]/g,function(a){return{l:"L",c:"C",x:"z",t:"m",r:"l",v:"c"}[a]||"M"})+"z"},f.k)for(var g in f.k)f[y](g)&&(b.glyphs[e].k[g]=f.k[g])}}return a},u.getFont=function(a,c,d,e){if(e=e||"normal",d=d||"normal",c=+c||{normal:400,bold:700,lighter:300,bolder:800}[c]||400,b.fonts){var f=b.fonts[a];if(!f){var g=new RegExp("(^|\\s)"+a.replace(/[^\w\d\s+!~.:_-]/g,F)+"(\\s|$)","i");for(var h in b.fonts)if(b.fonts[y](h)&&g.test(h)){f=b.fonts[h];break}}var i;if(f)for(var j=0,k=f.length;k>j&&(i=f[j],i.face["font-weight"]!=c||i.face["font-style"]!=d&&i.face["font-style"]||i.face["font-stretch"]!=e);j++);return i}},u.print=function(a,c,d,e,f,g,h,i){g=g||"middle",h=N(O(h||0,1),-1),i=N(O(i||1,3),1);var j,k=H(d)[I](F),l=0,m=0,n=F;if(b.is(e,"string")&&(e=this.getFont(e)),e){j=(f||16)/e.face["units-per-em"];for(var o=e.face.bbox[I](v),p=+o[0],q=o[3]-o[1],r=0,s=+o[1]+("baseline"==g?q+ +e.face.descent:q/2),t=0,u=k.length;u>t;t++){if("\n"==k[t])l=0,x=0,m=0,r+=q*i;else{var w=m&&e.glyphs[k[t-1]]||{},x=e.glyphs[k[t]];l+=m?(w.w||e.w)+(w.k&&w.k[k[t]]||0)+e.w*h:0,m=1}x&&x.d&&(n+=b.transformPath(x.d,["t",l*j,r*j,"s",j,j,p,s,"t",(a-p)/j,(c-s)/j]))}}return this.path(n).attr({fill:"#000",stroke:"none"})},u.add=function(a){if(b.is(a,"array"))for(var c,d=this.set(),e=0,f=a.length;f>e;e++)c=a[e]||{},w[y](c.type)&&d.push(this[c.type]().attr(c));return d},b.format=function(a,c){var d=b.is(c,U)?[0][D](c):arguments;return a&&b.is(a,T)&&d.length-1&&(a=a.replace(x,function(a,b){return null==d[++b]?F:d[b]})),a||F},b.fullfill=function(){var a=/\{([^\}]+)\}/g,b=/(?:(?:^|\.)(.+?)(?=\[|\.|$|\()|\[('|")(.+?)\2\])(\(\))?/g,c=function(a,c,d){var e=d;return c.replace(b,function(a,b,c,d,f){b=b||d,e&&(b in e&&(e=e[b]),"function"==typeof e&&f&&(e=e()))}),e=(null==e||e==d?a:e)+""};return function(b,d){return String(b).replace(a,function(a,b){return c(a,b,d)})}}(),b.ninja=function(){return A.was?z.win.Raphael=A.is:delete Raphael,b},b.st=kb,a.on("raphael.DOMload",function(){t=!0}),function(a,c,d){function e(){/in/.test(a.readyState)?setTimeout(e,9):b.eve("raphael.DOMload")}null==a.readyState&&a.addEventListener&&(a.addEventListener(c,d=function(){a.removeEventListener(c,d,!1),a.readyState="complete"},!1),a.readyState="loading"),e()}(document,"DOMContentLoaded"),b}),function(a,b){"function"==typeof define&&define.amd?define("raphael.svg",["raphael.core"],function(a){return b(a)}):b("object"==typeof exports?require("./raphael.core"):a.Raphael)}(this,function(a){if(!a||a.svg){var b="hasOwnProperty",c=String,d=parseFloat,e=parseInt,f=Math,g=f.max,h=f.abs,i=f.pow,j=/[, ]+/,k=a.eve,l="",m=" ",n="http://www.w3.org/1999/xlink",o={block:"M5,0 0,2.5 5,5z",classic:"M5,0 0,2.5 5,5 3.5,3 3.5,2z",diamond:"M2.5,0 5,2.5 2.5,5 0,2.5z",open:"M6,1 1,3.5 6,6",oval:"M2.5,0A2.5,2.5,0,0,1,2.5,5 2.5,2.5,0,0,1,2.5,0z"},p={};a.toString=function(){return"Your browser supports SVG.\nYou are running Raphaël "+this.version};var q=function(d,e){if(e){"string"==typeof d&&(d=q(d));for(var f in e)e[b](f)&&("xlink:"==f.substring(0,6)?d.setAttributeNS(n,f.substring(6),c(e[f])):d.setAttribute(f,c(e[f])))}else d=a._g.doc.createElementNS("http://www.w3.org/2000/svg",d),d.style&&(d.style.webkitTapHighlightColor="rgba(0,0,0,0)");return d},r=function(b,e){var j="linear",k=b.id+e,m=.5,n=.5,o=b.node,p=b.paper,r=o.style,s=a._g.doc.getElementById(k);if(!s){if(e=c(e).replace(a._radial_gradient,function(a,b,c){if(j="radial",b&&c){m=d(b),n=d(c);var e=2*(n>.5)-1;i(m-.5,2)+i(n-.5,2)>.25&&(n=f.sqrt(.25-i(m-.5,2))*e+.5)&&.5!=n&&(n=n.toFixed(5)-1e-5*e)}return l}),e=e.split(/\s*\-\s*/),"linear"==j){var t=e.shift();if(t=-d(t),isNaN(t))return null;var u=[0,0,f.cos(a.rad(t)),f.sin(a.rad(t))],v=1/(g(h(u[2]),h(u[3]))||1);u[2]*=v,u[3]*=v,u[2]<0&&(u[0]=-u[2],u[2]=0),u[3]<0&&(u[1]=-u[3],u[3]=0)}var w=a._parseDots(e);if(!w)return null;if(k=k.replace(/[\(\)\s,\xb0#]/g,"_"),b.gradient&&k!=b.gradient.id&&(p.defs.removeChild(b.gradient),delete b.gradient),!b.gradient){s=q(j+"Gradient",{id:k}),b.gradient=s,q(s,"radial"==j?{fx:m,fy:n}:{x1:u[0],y1:u[1],x2:u[2],y2:u[3],gradientTransform:b.matrix.invert()}),p.defs.appendChild(s);for(var x=0,y=w.length;y>x;x++)s.appendChild(q("stop",{offset:w[x].offset?w[x].offset:x?"100%":"0%","stop-color":w[x].color||"#fff","stop-opacity":isFinite(w[x].opacity)?w[x].opacity:1}))}}return q(o,{fill:"url('"+document.location.origin+document.location.pathname+"#"+k+"')",opacity:1,"fill-opacity":1}),r.fill=l,r.opacity=1,r.fillOpacity=1,1},s=function(a){var b=a.getBBox(1);q(a.pattern,{patternTransform:a.matrix.invert()+" translate("+b.x+","+b.y+")"})},t=function(d,e,f){if("path"==d.type){for(var g,h,i,j,k,m=c(e).toLowerCase().split("-"),n=d.paper,r=f?"end":"start",s=d.node,t=d.attrs,u=t["stroke-width"],v=m.length,w="classic",x=3,y=3,z=5;v--;)switch(m[v]){case"block":case"classic":case"oval":case"diamond":case"open":case"none":w=m[v];break;case"wide":y=5;break;case"narrow":y=2;break;case"long":x=5;break;case"short":x=2}if("open"==w?(x+=2,y+=2,z+=2,i=1,j=f?4:1,k={fill:"none",stroke:t.stroke}):(j=i=x/2,k={fill:t.stroke,stroke:"none"}),d._.arrows?f?(d._.arrows.endPath&&p[d._.arrows.endPath]--,d._.arrows.endMarker&&p[d._.arrows.endMarker]--):(d._.arrows.startPath&&p[d._.arrows.startPath]--,d._.arrows.startMarker&&p[d._.arrows.startMarker]--):d._.arrows={},"none"!=w){var A="raphael-marker-"+w,B="raphael-marker-"+r+w+x+y+"-obj"+d.id;a._g.doc.getElementById(A)?p[A]++:(n.defs.appendChild(q(q("path"),{"stroke-linecap":"round",d:o[w],id:A})),p[A]=1);var C,D=a._g.doc.getElementById(B);D?(p[B]++,C=D.getElementsByTagName("use")[0]):(D=q(q("marker"),{id:B,markerHeight:y,markerWidth:x,orient:"auto",refX:j,refY:y/2}),C=q(q("use"),{"xlink:href":"#"+A,transform:(f?"rotate(180 "+x/2+" "+y/2+") ":l)+"scale("+x/z+","+y/z+")","stroke-width":(1/((x/z+y/z)/2)).toFixed(4)}),D.appendChild(C),n.defs.appendChild(D),p[B]=1),q(C,k);var E=i*("diamond"!=w&&"oval"!=w);f?(g=d._.arrows.startdx*u||0,h=a.getTotalLength(t.path)-E*u):(g=E*u,h=a.getTotalLength(t.path)-(d._.arrows.enddx*u||0)),k={},k["marker-"+r]="url(#"+B+")",(h||g)&&(k.d=a.getSubpath(t.path,g,h)),q(s,k),d._.arrows[r+"Path"]=A,d._.arrows[r+"Marker"]=B,d._.arrows[r+"dx"]=E,d._.arrows[r+"Type"]=w,d._.arrows[r+"String"]=e}else f?(g=d._.arrows.startdx*u||0,h=a.getTotalLength(t.path)-g):(g=0,h=a.getTotalLength(t.path)-(d._.arrows.enddx*u||0)),d._.arrows[r+"Path"]&&q(s,{d:a.getSubpath(t.path,g,h)}),delete d._.arrows[r+"Path"],delete d._.arrows[r+"Marker"],delete d._.arrows[r+"dx"],delete d._.arrows[r+"Type"],delete d._.arrows[r+"String"];for(k in p)if(p[b](k)&&!p[k]){var F=a._g.doc.getElementById(k);F&&F.parentNode.removeChild(F)}}},u={"-":[3,1],".":[1,1],"-.":[3,1,1,1],"-..":[3,1,1,1,1,1],". ":[1,3],"- ":[4,3],"--":[8,3],"- .":[4,3,1,3],"--.":[8,3,1,3],"--..":[8,3,1,3,1,3]},v=function(a,b,d){if(b=u[c(b).toLowerCase()]){for(var e=a.attrs["stroke-width"]||"1",f={round:e,square:e,butt:0}[a.attrs["stroke-linecap"]||d["stroke-linecap"]]||0,g=[],h=b.length;h--;)g[h]=b[h]*e+(h%2?1:-1)*f;q(a.node,{"stroke-dasharray":g.join(",")})}else q(a.node,{"stroke-dasharray":"none"})},w=function(d,f){var i=d.node,k=d.attrs,m=i.style.visibility;i.style.visibility="hidden";for(var o in f)if(f[b](o)){if(!a._availableAttrs[b](o))continue;var p=f[o];switch(k[o]=p,o){case"blur":d.blur(p);break;case"title":var u=i.getElementsByTagName("title");if(u.length&&(u=u[0]))u.firstChild.nodeValue=p;else{u=q("title");var w=a._g.doc.createTextNode(p);u.appendChild(w),i.appendChild(u)}break;case"href":case"target":var x=i.parentNode;if("a"!=x.tagName.toLowerCase()){var z=q("a");x.insertBefore(z,i),z.appendChild(i),x=z}"target"==o?x.setAttributeNS(n,"show","blank"==p?"new":p):x.setAttributeNS(n,o,p);break;case"cursor":i.style.cursor=p;break;case"transform":d.transform(p);break;case"arrow-start":t(d,p);break;case"arrow-end":t(d,p,1);break;case"clip-rect":var A=c(p).split(j);if(4==A.length){d.clip&&d.clip.parentNode.parentNode.removeChild(d.clip.parentNode);var B=q("clipPath"),C=q("rect");B.id=a.createUUID(),q(C,{x:A[0],y:A[1],width:A[2],height:A[3]}),B.appendChild(C),d.paper.defs.appendChild(B),q(i,{"clip-path":"url(#"+B.id+")"}),d.clip=C}if(!p){var D=i.getAttribute("clip-path");if(D){var E=a._g.doc.getElementById(D.replace(/(^url\(#|\)$)/g,l));E&&E.parentNode.removeChild(E),q(i,{"clip-path":l}),delete d.clip}}break;case"path":"path"==d.type&&(q(i,{d:p?k.path=a._pathToAbsolute(p):"M0,0"}),d._.dirty=1,d._.arrows&&("startString"in d._.arrows&&t(d,d._.arrows.startString),"endString"in d._.arrows&&t(d,d._.arrows.endString,1)));break;case"width":if(i.setAttribute(o,p),d._.dirty=1,!k.fx)break;o="x",p=k.x;case"x":k.fx&&(p=-k.x-(k.width||0));case"rx":if("rx"==o&&"rect"==d.type)break;case"cx":i.setAttribute(o,p),d.pattern&&s(d),d._.dirty=1;break;case"height":if(i.setAttribute(o,p),d._.dirty=1,!k.fy)break;o="y",p=k.y;case"y":k.fy&&(p=-k.y-(k.height||0));case"ry":if("ry"==o&&"rect"==d.type)break;case"cy":i.setAttribute(o,p),d.pattern&&s(d),d._.dirty=1;break;case"r":"rect"==d.type?q(i,{rx:p,ry:p}):i.setAttribute(o,p),d._.dirty=1;break;case"src":"image"==d.type&&i.setAttributeNS(n,"href",p);break;case"stroke-width":(1!=d._.sx||1!=d._.sy)&&(p/=g(h(d._.sx),h(d._.sy))||1),i.setAttribute(o,p),k["stroke-dasharray"]&&v(d,k["stroke-dasharray"],f),d._.arrows&&("startString"in d._.arrows&&t(d,d._.arrows.startString),"endString"in d._.arrows&&t(d,d._.arrows.endString,1));break;case"stroke-dasharray":v(d,p,f);break;case"fill":var F=c(p).match(a._ISURL);if(F){B=q("pattern");var G=q("image");B.id=a.createUUID(),q(B,{x:0,y:0,patternUnits:"userSpaceOnUse",height:1,width:1}),q(G,{x:0,y:0,"xlink:href":F[1]}),B.appendChild(G),function(b){a._preload(F[1],function(){var a=this.offsetWidth,c=this.offsetHeight;q(b,{width:a,height:c}),q(G,{width:a,height:c})})}(B),d.paper.defs.appendChild(B),q(i,{fill:"url(#"+B.id+")"}),d.pattern=B,d.pattern&&s(d);break}var H=a.getRGB(p);if(H.error){if(("circle"==d.type||"ellipse"==d.type||"r"!=c(p).charAt())&&r(d,p)){if("opacity"in k||"fill-opacity"in k){var I=a._g.doc.getElementById(i.getAttribute("fill").replace(/^url\(#|\)$/g,l));if(I){var J=I.getElementsByTagName("stop");q(J[J.length-1],{"stop-opacity":("opacity"in k?k.opacity:1)*("fill-opacity"in k?k["fill-opacity"]:1)})}}k.gradient=p,k.fill="none";break}}else delete f.gradient,delete k.gradient,!a.is(k.opacity,"undefined")&&a.is(f.opacity,"undefined")&&q(i,{opacity:k.opacity}),!a.is(k["fill-opacity"],"undefined")&&a.is(f["fill-opacity"],"undefined")&&q(i,{"fill-opacity":k["fill-opacity"]});H[b]("opacity")&&q(i,{"fill-opacity":H.opacity>1?H.opacity/100:H.opacity});case"stroke":H=a.getRGB(p),i.setAttribute(o,H.hex),"stroke"==o&&H[b]("opacity")&&q(i,{"stroke-opacity":H.opacity>1?H.opacity/100:H.opacity}),"stroke"==o&&d._.arrows&&("startString"in d._.arrows&&t(d,d._.arrows.startString),"endString"in d._.arrows&&t(d,d._.arrows.endString,1));break;case"gradient":("circle"==d.type||"ellipse"==d.type||"r"!=c(p).charAt())&&r(d,p); + +break;case"opacity":k.gradient&&!k[b]("stroke-opacity")&&q(i,{"stroke-opacity":p>1?p/100:p});case"fill-opacity":if(k.gradient){I=a._g.doc.getElementById(i.getAttribute("fill").replace(/^url\(#|\)$/g,l)),I&&(J=I.getElementsByTagName("stop"),q(J[J.length-1],{"stop-opacity":p}));break}default:"font-size"==o&&(p=e(p,10)+"px");var K=o.replace(/(\-.)/g,function(a){return a.substring(1).toUpperCase()});i.style[K]=p,d._.dirty=1,i.setAttribute(o,p)}}y(d,f),i.style.visibility=m},x=1.2,y=function(d,f){if("text"==d.type&&(f[b]("text")||f[b]("font")||f[b]("font-size")||f[b]("x")||f[b]("y"))){var g=d.attrs,h=d.node,i=h.firstChild?e(a._g.doc.defaultView.getComputedStyle(h.firstChild,l).getPropertyValue("font-size"),10):10;if(f[b]("text")){for(g.text=f.text;h.firstChild;)h.removeChild(h.firstChild);for(var j,k=c(f.text).split("\n"),m=[],n=0,o=k.length;o>n;n++)j=q("tspan"),n&&q(j,{dy:i*x,x:g.x}),j.appendChild(a._g.doc.createTextNode(k[n])),h.appendChild(j),m[n]=j}else for(m=h.getElementsByTagName("tspan"),n=0,o=m.length;o>n;n++)n?q(m[n],{dy:i*x,x:g.x}):q(m[0],{dy:0});q(h,{x:g.x,y:g.y}),d._.dirty=1;var p=d._getBBox(),r=g.y-(p.y+p.height/2);r&&a.is(r,"finite")&&q(m[0],{dy:r})}},z=function(a){return a.parentNode&&"a"===a.parentNode.tagName.toLowerCase()?a.parentNode:a},A=function(b,c){this[0]=this.node=b,b.raphael=!0,this.id=a._oid++,b.raphaelid=this.id,this.matrix=a.matrix(),this.realPath=null,this.paper=c,this.attrs=this.attrs||{},this._={transform:[],sx:1,sy:1,deg:0,dx:0,dy:0,dirty:1},!c.bottom&&(c.bottom=this),this.prev=c.top,c.top&&(c.top.next=this),c.top=this,this.next=null},B=a.el;A.prototype=B,B.constructor=A,a._engine.path=function(a,b){var c=q("path");b.canvas&&b.canvas.appendChild(c);var d=new A(c,b);return d.type="path",w(d,{fill:"none",stroke:"#000",path:a}),d},B.rotate=function(a,b,e){if(this.removed)return this;if(a=c(a).split(j),a.length-1&&(b=d(a[1]),e=d(a[2])),a=d(a[0]),null==e&&(b=e),null==b||null==e){var f=this.getBBox(1);b=f.x+f.width/2,e=f.y+f.height/2}return this.transform(this._.transform.concat([["r",a,b,e]])),this},B.scale=function(a,b,e,f){if(this.removed)return this;if(a=c(a).split(j),a.length-1&&(b=d(a[1]),e=d(a[2]),f=d(a[3])),a=d(a[0]),null==b&&(b=a),null==f&&(e=f),null==e||null==f)var g=this.getBBox(1);return e=null==e?g.x+g.width/2:e,f=null==f?g.y+g.height/2:f,this.transform(this._.transform.concat([["s",a,b,e,f]])),this},B.translate=function(a,b){return this.removed?this:(a=c(a).split(j),a.length-1&&(b=d(a[1])),a=d(a[0])||0,b=+b||0,this.transform(this._.transform.concat([["t",a,b]])),this)},B.transform=function(c){var d=this._;if(null==c)return d.transform;if(a._extractTransform(this,c),this.clip&&q(this.clip,{transform:this.matrix.invert()}),this.pattern&&s(this),this.node&&q(this.node,{transform:this.matrix}),1!=d.sx||1!=d.sy){var e=this.attrs[b]("stroke-width")?this.attrs["stroke-width"]:1;this.attr({"stroke-width":e})}return this},B.hide=function(){return this.removed||(this.node.style.display="none"),this},B.show=function(){return this.removed||(this.node.style.display=""),this},B.remove=function(){var b=z(this.node);if(!this.removed&&b.parentNode){var c=this.paper;c.__set__&&c.__set__.exclude(this),k.unbind("raphael.*.*."+this.id),this.gradient&&c.defs.removeChild(this.gradient),a._tear(this,c),b.parentNode.removeChild(b),this.removeData();for(var d in this)this[d]="function"==typeof this[d]?a._removedFactory(d):null;this.removed=!0}},B._getBBox=function(){if("none"==this.node.style.display){this.show();var a=!0}var b,c=!1;this.paper.canvas.parentElement?b=this.paper.canvas.parentElement.style:this.paper.canvas.parentNode&&(b=this.paper.canvas.parentNode.style),b&&"none"==b.display&&(c=!0,b.display="");var d={};try{d=this.node.getBBox()}catch(e){d={x:this.node.clientLeft,y:this.node.clientTop,width:this.node.clientWidth,height:this.node.clientHeight}}finally{d=d||{},c&&(b.display="none")}return a&&this.hide(),d},B.attr=function(c,d){if(this.removed)return this;if(null==c){var e={};for(var f in this.attrs)this.attrs[b](f)&&(e[f]=this.attrs[f]);return e.gradient&&"none"==e.fill&&(e.fill=e.gradient)&&delete e.gradient,e.transform=this._.transform,e}if(null==d&&a.is(c,"string")){if("fill"==c&&"none"==this.attrs.fill&&this.attrs.gradient)return this.attrs.gradient;if("transform"==c)return this._.transform;for(var g=c.split(j),h={},i=0,l=g.length;l>i;i++)c=g[i],c in this.attrs?h[c]=this.attrs[c]:a.is(this.paper.customAttributes[c],"function")?h[c]=this.paper.customAttributes[c].def:h[c]=a._availableAttrs[c];return l-1?h:h[g[0]]}if(null==d&&a.is(c,"array")){for(h={},i=0,l=c.length;l>i;i++)h[c[i]]=this.attr(c[i]);return h}if(null!=d){var m={};m[c]=d}else null!=c&&a.is(c,"object")&&(m=c);for(var n in m)k("raphael.attr."+n+"."+this.id,this,m[n]);for(n in this.paper.customAttributes)if(this.paper.customAttributes[b](n)&&m[b](n)&&a.is(this.paper.customAttributes[n],"function")){var o=this.paper.customAttributes[n].apply(this,[].concat(m[n]));this.attrs[n]=m[n];for(var p in o)o[b](p)&&(m[p]=o[p])}return w(this,m),this},B.toFront=function(){if(this.removed)return this;var b=z(this.node);b.parentNode.appendChild(b);var c=this.paper;return c.top!=this&&a._tofront(this,c),this},B.toBack=function(){if(this.removed)return this;var b=z(this.node),c=b.parentNode;c.insertBefore(b,c.firstChild),a._toback(this,this.paper);this.paper;return this},B.insertAfter=function(b){if(this.removed||!b)return this;var c=z(this.node),d=z(b.node||b[b.length-1].node);return d.nextSibling?d.parentNode.insertBefore(c,d.nextSibling):d.parentNode.appendChild(c),a._insertafter(this,b,this.paper),this},B.insertBefore=function(b){if(this.removed||!b)return this;var c=z(this.node),d=z(b.node||b[0].node);return d.parentNode.insertBefore(c,d),a._insertbefore(this,b,this.paper),this},B.blur=function(b){var c=this;if(0!==+b){var d=q("filter"),e=q("feGaussianBlur");c.attrs.blur=b,d.id=a.createUUID(),q(e,{stdDeviation:+b||1.5}),d.appendChild(e),c.paper.defs.appendChild(d),c._blur=d,q(c.node,{filter:"url(#"+d.id+")"})}else c._blur&&(c._blur.parentNode.removeChild(c._blur),delete c._blur,delete c.attrs.blur),c.node.removeAttribute("filter");return c},a._engine.circle=function(a,b,c,d){var e=q("circle");a.canvas&&a.canvas.appendChild(e);var f=new A(e,a);return f.attrs={cx:b,cy:c,r:d,fill:"none",stroke:"#000"},f.type="circle",q(e,f.attrs),f},a._engine.rect=function(a,b,c,d,e,f){var g=q("rect");a.canvas&&a.canvas.appendChild(g);var h=new A(g,a);return h.attrs={x:b,y:c,width:d,height:e,rx:f||0,ry:f||0,fill:"none",stroke:"#000"},h.type="rect",q(g,h.attrs),h},a._engine.ellipse=function(a,b,c,d,e){var f=q("ellipse");a.canvas&&a.canvas.appendChild(f);var g=new A(f,a);return g.attrs={cx:b,cy:c,rx:d,ry:e,fill:"none",stroke:"#000"},g.type="ellipse",q(f,g.attrs),g},a._engine.image=function(a,b,c,d,e,f){var g=q("image");q(g,{x:c,y:d,width:e,height:f,preserveAspectRatio:"none"}),g.setAttributeNS(n,"href",b),a.canvas&&a.canvas.appendChild(g);var h=new A(g,a);return h.attrs={x:c,y:d,width:e,height:f,src:b},h.type="image",h},a._engine.text=function(b,c,d,e){var f=q("text");b.canvas&&b.canvas.appendChild(f);var g=new A(f,b);return g.attrs={x:c,y:d,"text-anchor":"middle",text:e,"font-family":a._availableAttrs["font-family"],"font-size":a._availableAttrs["font-size"],stroke:"none",fill:"#000"},g.type="text",w(g,g.attrs),g},a._engine.setSize=function(a,b){return this.width=a||this.width,this.height=b||this.height,this.canvas.setAttribute("width",this.width),this.canvas.setAttribute("height",this.height),this._viewBox&&this.setViewBox.apply(this,this._viewBox),this},a._engine.create=function(){var b=a._getContainer.apply(0,arguments),c=b&&b.container,d=b.x,e=b.y,f=b.width,g=b.height;if(!c)throw new Error("SVG container not found.");var h,i=q("svg"),j="overflow:hidden;";return d=d||0,e=e||0,f=f||512,g=g||342,q(i,{height:g,version:1.1,width:f,xmlns:"http://www.w3.org/2000/svg","xmlns:xlink":"http://www.w3.org/1999/xlink"}),1==c?(i.style.cssText=j+"position:absolute;left:"+d+"px;top:"+e+"px",a._g.doc.body.appendChild(i),h=1):(i.style.cssText=j+"position:relative",c.firstChild?c.insertBefore(i,c.firstChild):c.appendChild(i)),c=new a._Paper,c.width=f,c.height=g,c.canvas=i,c.clear(),c._left=c._top=0,h&&(c.renderfix=function(){}),c.renderfix(),c},a._engine.setViewBox=function(a,b,c,d,e){k("raphael.setViewBox",this,this._viewBox,[a,b,c,d,e]);var f,h,i=this.getSize(),j=g(c/i.width,d/i.height),l=this.top,n=e?"xMidYMid meet":"xMinYMin";for(null==a?(this._vbSize&&(j=1),delete this._vbSize,f="0 0 "+this.width+m+this.height):(this._vbSize=j,f=a+m+b+m+c+m+d),q(this.canvas,{viewBox:f,preserveAspectRatio:n});j&&l;)h="stroke-width"in l.attrs?l.attrs["stroke-width"]:1,l.attr({"stroke-width":h}),l._.dirty=1,l._.dirtyT=1,l=l.prev;return this._viewBox=[a,b,c,d,!!e],this},a.prototype.renderfix=function(){var a,b=this.canvas,c=b.style;try{a=b.getScreenCTM()||b.createSVGMatrix()}catch(d){a=b.createSVGMatrix()}var e=-a.e%1,f=-a.f%1;(e||f)&&(e&&(this._left=(this._left+e)%1,c.left=this._left+"px"),f&&(this._top=(this._top+f)%1,c.top=this._top+"px"))},a.prototype.clear=function(){a.eve("raphael.clear",this);for(var b=this.canvas;b.firstChild;)b.removeChild(b.firstChild);this.bottom=this.top=null,(this.desc=q("desc")).appendChild(a._g.doc.createTextNode("Created with Raphaël "+a.version)),b.appendChild(this.desc),b.appendChild(this.defs=q("defs"))},a.prototype.remove=function(){k("raphael.remove",this),this.canvas.parentNode&&this.canvas.parentNode.removeChild(this.canvas);for(var b in this)this[b]="function"==typeof this[b]?a._removedFactory(b):null};var C=a.st;for(var D in B)B[b](D)&&!C[b](D)&&(C[D]=function(a){return function(){var b=arguments;return this.forEach(function(c){c[a].apply(c,b)})}}(D))}}),function(a,b){"function"==typeof define&&define.amd?define("raphael.vml",["raphael.core"],function(a){return b(a)}):b("object"==typeof exports?require("./raphael.core"):a.Raphael)}(this,function(a){if(!a||a.vml){var b="hasOwnProperty",c=String,d=parseFloat,e=Math,f=e.round,g=e.max,h=e.min,i=e.abs,j="fill",k=/[, ]+/,l=a.eve,m=" progid:DXImageTransform.Microsoft",n=" ",o="",p={M:"m",L:"l",C:"c",Z:"x",m:"t",l:"r",c:"v",z:"x"},q=/([clmz]),?([^clmz]*)/gi,r=/ progid:\S+Blur\([^\)]+\)/g,s=/-?[^,\s-]+/g,t="position:absolute;left:0;top:0;width:1px;height:1px;behavior:url(#default#VML)",u=21600,v={path:1,rect:1,image:1},w={circle:1,ellipse:1},x=function(b){var d=/[ahqstv]/gi,e=a._pathToAbsolute;if(c(b).match(d)&&(e=a._path2curve),d=/[clmz]/g,e==a._pathToAbsolute&&!c(b).match(d)){var g=c(b).replace(q,function(a,b,c){var d=[],e="m"==b.toLowerCase(),g=p[b];return c.replace(s,function(a){e&&2==d.length&&(g+=d+p["m"==b?"l":"L"],d=[]),d.push(f(a*u))}),g+d});return g}var h,i,j=e(b);g=[];for(var k=0,l=j.length;l>k;k++){h=j[k],i=j[k][0].toLowerCase(),"z"==i&&(i="x");for(var m=1,r=h.length;r>m;m++)i+=f(h[m]*u)+(m!=r-1?",":o);g.push(i)}return g.join(n)},y=function(b,c,d){var e=a.matrix();return e.rotate(-b,.5,.5),{dx:e.x(c,d),dy:e.y(c,d)}},z=function(a,b,c,d,e,f){var g=a._,h=a.matrix,k=g.fillpos,l=a.node,m=l.style,o=1,p="",q=u/b,r=u/c;if(m.visibility="hidden",b&&c){if(l.coordsize=i(q)+n+i(r),m.rotation=f*(0>b*c?-1:1),f){var s=y(f,d,e);d=s.dx,e=s.dy}if(0>b&&(p+="x"),0>c&&(p+=" y")&&(o=-1),m.flip=p,l.coordorigin=d*-q+n+e*-r,k||g.fillsize){var t=l.getElementsByTagName(j);t=t&&t[0],l.removeChild(t),k&&(s=y(f,h.x(k[0],k[1]),h.y(k[0],k[1])),t.position=s.dx*o+n+s.dy*o),g.fillsize&&(t.size=g.fillsize[0]*i(b)+n+g.fillsize[1]*i(c)),l.appendChild(t)}m.visibility="visible"}};a.toString=function(){return"Your browser doesn’t support SVG. Falling down to VML.\nYou are running Raphaël "+this.version};var A=function(a,b,d){for(var e=c(b).toLowerCase().split("-"),f=d?"end":"start",g=e.length,h="classic",i="medium",j="medium";g--;)switch(e[g]){case"block":case"classic":case"oval":case"diamond":case"open":case"none":h=e[g];break;case"wide":case"narrow":j=e[g];break;case"long":case"short":i=e[g]}var k=a.node.getElementsByTagName("stroke")[0];k[f+"arrow"]=h,k[f+"arrowlength"]=i,k[f+"arrowwidth"]=j},B=function(e,i){e.attrs=e.attrs||{};var l=e.node,m=e.attrs,p=l.style,q=v[e.type]&&(i.x!=m.x||i.y!=m.y||i.width!=m.width||i.height!=m.height||i.cx!=m.cx||i.cy!=m.cy||i.rx!=m.rx||i.ry!=m.ry||i.r!=m.r),r=w[e.type]&&(m.cx!=i.cx||m.cy!=i.cy||m.r!=i.r||m.rx!=i.rx||m.ry!=i.ry),s=e;for(var t in i)i[b](t)&&(m[t]=i[t]);if(q&&(m.path=a._getPath[e.type](e),e._.dirty=1),i.href&&(l.href=i.href),i.title&&(l.title=i.title),i.target&&(l.target=i.target),i.cursor&&(p.cursor=i.cursor),"blur"in i&&e.blur(i.blur),(i.path&&"path"==e.type||q)&&(l.path=x(~c(m.path).toLowerCase().indexOf("r")?a._pathToAbsolute(m.path):m.path),e._.dirty=1,"image"==e.type&&(e._.fillpos=[m.x,m.y],e._.fillsize=[m.width,m.height],z(e,1,1,0,0,0))),"transform"in i&&e.transform(i.transform),r){var y=+m.cx,B=+m.cy,D=+m.rx||+m.r||0,E=+m.ry||+m.r||0;l.path=a.format("ar{0},{1},{2},{3},{4},{1},{4},{1}x",f((y-D)*u),f((B-E)*u),f((y+D)*u),f((B+E)*u),f(y*u)),e._.dirty=1}if("clip-rect"in i){var G=c(i["clip-rect"]).split(k);if(4==G.length){G[2]=+G[2]+ +G[0],G[3]=+G[3]+ +G[1];var H=l.clipRect||a._g.doc.createElement("div"),I=H.style;I.clip=a.format("rect({1}px {2}px {3}px {0}px)",G),l.clipRect||(I.position="absolute",I.top=0,I.left=0,I.width=e.paper.width+"px",I.height=e.paper.height+"px",l.parentNode.insertBefore(H,l),H.appendChild(l),l.clipRect=H)}i["clip-rect"]||l.clipRect&&(l.clipRect.style.clip="auto")}if(e.textpath){var J=e.textpath.style;i.font&&(J.font=i.font),i["font-family"]&&(J.fontFamily='"'+i["font-family"].split(",")[0].replace(/^['"]+|['"]+$/g,o)+'"'),i["font-size"]&&(J.fontSize=i["font-size"]),i["font-weight"]&&(J.fontWeight=i["font-weight"]),i["font-style"]&&(J.fontStyle=i["font-style"])}if("arrow-start"in i&&A(s,i["arrow-start"]),"arrow-end"in i&&A(s,i["arrow-end"],1),null!=i.opacity||null!=i["stroke-width"]||null!=i.fill||null!=i.src||null!=i.stroke||null!=i["stroke-width"]||null!=i["stroke-opacity"]||null!=i["fill-opacity"]||null!=i["stroke-dasharray"]||null!=i["stroke-miterlimit"]||null!=i["stroke-linejoin"]||null!=i["stroke-linecap"]){var K=l.getElementsByTagName(j),L=!1;if(K=K&&K[0],!K&&(L=K=F(j)),"image"==e.type&&i.src&&(K.src=i.src),i.fill&&(K.on=!0),(null==K.on||"none"==i.fill||null===i.fill)&&(K.on=!1),K.on&&i.fill){var M=c(i.fill).match(a._ISURL);if(M){K.parentNode==l&&l.removeChild(K),K.rotate=!0,K.src=M[1],K.type="tile";var N=e.getBBox(1);K.position=N.x+n+N.y,e._.fillpos=[N.x,N.y],a._preload(M[1],function(){e._.fillsize=[this.offsetWidth,this.offsetHeight]})}else K.color=a.getRGB(i.fill).hex,K.src=o,K.type="solid",a.getRGB(i.fill).error&&(s.type in{circle:1,ellipse:1}||"r"!=c(i.fill).charAt())&&C(s,i.fill,K)&&(m.fill="none",m.gradient=i.fill,K.rotate=!1)}if("fill-opacity"in i||"opacity"in i){var O=((+m["fill-opacity"]+1||2)-1)*((+m.opacity+1||2)-1)*((+a.getRGB(i.fill).o+1||2)-1);O=h(g(O,0),1),K.opacity=O,K.src&&(K.color="none")}l.appendChild(K);var P=l.getElementsByTagName("stroke")&&l.getElementsByTagName("stroke")[0],Q=!1;!P&&(Q=P=F("stroke")),(i.stroke&&"none"!=i.stroke||i["stroke-width"]||null!=i["stroke-opacity"]||i["stroke-dasharray"]||i["stroke-miterlimit"]||i["stroke-linejoin"]||i["stroke-linecap"])&&(P.on=!0),("none"==i.stroke||null===i.stroke||null==P.on||0==i.stroke||0==i["stroke-width"])&&(P.on=!1);var R=a.getRGB(i.stroke);P.on&&i.stroke&&(P.color=R.hex),O=((+m["stroke-opacity"]+1||2)-1)*((+m.opacity+1||2)-1)*((+R.o+1||2)-1);var S=.75*(d(i["stroke-width"])||1);if(O=h(g(O,0),1),null==i["stroke-width"]&&(S=m["stroke-width"]),i["stroke-width"]&&(P.weight=S),S&&1>S&&(O*=S)&&(P.weight=1),P.opacity=O,i["stroke-linejoin"]&&(P.joinstyle=i["stroke-linejoin"]||"miter"),P.miterlimit=i["stroke-miterlimit"]||8,i["stroke-linecap"]&&(P.endcap="butt"==i["stroke-linecap"]?"flat":"square"==i["stroke-linecap"]?"square":"round"),"stroke-dasharray"in i){var T={"-":"shortdash",".":"shortdot","-.":"shortdashdot","-..":"shortdashdotdot",". ":"dot","- ":"dash","--":"longdash","- .":"dashdot","--.":"longdashdot","--..":"longdashdotdot"};P.dashstyle=T[b](i["stroke-dasharray"])?T[i["stroke-dasharray"]]:o}Q&&l.appendChild(P)}if("text"==s.type){s.paper.canvas.style.display=o;var U=s.paper.span,V=100,W=m.font&&m.font.match(/\d+(?:\.\d*)?(?=px)/);p=U.style,m.font&&(p.font=m.font),m["font-family"]&&(p.fontFamily=m["font-family"]),m["font-weight"]&&(p.fontWeight=m["font-weight"]),m["font-style"]&&(p.fontStyle=m["font-style"]),W=d(m["font-size"]||W&&W[0])||10,p.fontSize=W*V+"px",s.textpath.string&&(U.innerHTML=c(s.textpath.string).replace(/"));var X=U.getBoundingClientRect();s.W=m.w=(X.right-X.left)/V,s.H=m.h=(X.bottom-X.top)/V,s.X=m.x,s.Y=m.y+s.H/2,("x"in i||"y"in i)&&(s.path.v=a.format("m{0},{1}l{2},{1}",f(m.x*u),f(m.y*u),f(m.x*u)+1));for(var Y=["x","y","text","font","font-family","font-weight","font-style","font-size"],Z=0,$=Y.length;$>Z;Z++)if(Y[Z]in i){s._.dirty=1;break}switch(m["text-anchor"]){case"start":s.textpath.style["v-text-align"]="left",s.bbx=s.W/2;break;case"end":s.textpath.style["v-text-align"]="right",s.bbx=-s.W/2;break;default:s.textpath.style["v-text-align"]="center",s.bbx=0}s.textpath.style["v-text-kern"]=!0}},C=function(b,f,g){b.attrs=b.attrs||{};var h=(b.attrs,Math.pow),i="linear",j=".5 .5";if(b.attrs.gradient=f,f=c(f).replace(a._radial_gradient,function(a,b,c){return i="radial",b&&c&&(b=d(b),c=d(c),h(b-.5,2)+h(c-.5,2)>.25&&(c=e.sqrt(.25-h(b-.5,2))*(2*(c>.5)-1)+.5),j=b+n+c),o}),f=f.split(/\s*\-\s*/),"linear"==i){var k=f.shift();if(k=-d(k),isNaN(k))return null}var l=a._parseDots(f);if(!l)return null;if(b=b.shape||b.node,l.length){b.removeChild(g),g.on=!0,g.method="none",g.color=l[0].color,g.color2=l[l.length-1].color;for(var m=[],p=0,q=l.length;q>p;p++)l[p].offset&&m.push(l[p].offset+n+l[p].color);g.colors=m.length?m.join():"0% "+g.color,"radial"==i?(g.type="gradientTitle",g.focus="100%",g.focussize="0 0",g.focusposition=j,g.angle=0):(g.type="gradient",g.angle=(270-k)%360),b.appendChild(g)}return 1},D=function(b,c){this[0]=this.node=b,b.raphael=!0,this.id=a._oid++,b.raphaelid=this.id,this.X=0,this.Y=0,this.attrs={},this.paper=c,this.matrix=a.matrix(),this._={transform:[],sx:1,sy:1,dx:0,dy:0,deg:0,dirty:1,dirtyT:1},!c.bottom&&(c.bottom=this),this.prev=c.top,c.top&&(c.top.next=this),c.top=this,this.next=null},E=a.el;D.prototype=E,E.constructor=D,E.transform=function(b){if(null==b)return this._.transform;var d,e=this.paper._viewBoxShift,f=e?"s"+[e.scale,e.scale]+"-1-1t"+[e.dx,e.dy]:o;e&&(d=b=c(b).replace(/\.{3}|\u2026/g,this._.transform||o)),a._extractTransform(this,f+b);var g,h=this.matrix.clone(),i=this.skew,j=this.node,k=~c(this.attrs.fill).indexOf("-"),l=!c(this.attrs.fill).indexOf("url(");if(h.translate(1,1),l||k||"image"==this.type)if(i.matrix="1 0 0 1",i.offset="0 0",g=h.split(),k&&g.noRotation||!g.isSimple){j.style.filter=h.toFilter();var m=this.getBBox(),p=this.getBBox(1),q=m.x-p.x,r=m.y-p.y;j.coordorigin=q*-u+n+r*-u,z(this,1,1,q,r,0)}else j.style.filter=o,z(this,g.scalex,g.scaley,g.dx,g.dy,g.rotate);else j.style.filter=o,i.matrix=c(h),i.offset=h.offset();return null!==d&&(this._.transform=d,a._extractTransform(this,d)),this},E.rotate=function(a,b,e){if(this.removed)return this;if(null!=a){if(a=c(a).split(k),a.length-1&&(b=d(a[1]),e=d(a[2])),a=d(a[0]),null==e&&(b=e),null==b||null==e){var f=this.getBBox(1);b=f.x+f.width/2,e=f.y+f.height/2}return this._.dirtyT=1,this.transform(this._.transform.concat([["r",a,b,e]])),this}},E.translate=function(a,b){return this.removed?this:(a=c(a).split(k),a.length-1&&(b=d(a[1])),a=d(a[0])||0,b=+b||0,this._.bbox&&(this._.bbox.x+=a,this._.bbox.y+=b),this.transform(this._.transform.concat([["t",a,b]])),this)},E.scale=function(a,b,e,f){if(this.removed)return this;if(a=c(a).split(k),a.length-1&&(b=d(a[1]),e=d(a[2]),f=d(a[3]),isNaN(e)&&(e=null),isNaN(f)&&(f=null)),a=d(a[0]),null==b&&(b=a),null==f&&(e=f),null==e||null==f)var g=this.getBBox(1);return e=null==e?g.x+g.width/2:e,f=null==f?g.y+g.height/2:f,this.transform(this._.transform.concat([["s",a,b,e,f]])),this._.dirtyT=1,this},E.hide=function(){return!this.removed&&(this.node.style.display="none"),this},E.show=function(){return!this.removed&&(this.node.style.display=o),this},E.auxGetBBox=a.el.getBBox,E.getBBox=function(){var a=this.auxGetBBox();if(this.paper&&this.paper._viewBoxShift){var b={},c=1/this.paper._viewBoxShift.scale;return b.x=a.x-this.paper._viewBoxShift.dx,b.x*=c,b.y=a.y-this.paper._viewBoxShift.dy,b.y*=c,b.width=a.width*c,b.height=a.height*c,b.x2=b.x+b.width,b.y2=b.y+b.height,b}return a},E._getBBox=function(){return this.removed?{}:{x:this.X+(this.bbx||0)-this.W/2,y:this.Y-this.H,width:this.W,height:this.H}},E.remove=function(){if(!this.removed&&this.node.parentNode){this.paper.__set__&&this.paper.__set__.exclude(this),a.eve.unbind("raphael.*.*."+this.id),a._tear(this,this.paper),this.node.parentNode.removeChild(this.node),this.shape&&this.shape.parentNode.removeChild(this.shape);for(var b in this)this[b]="function"==typeof this[b]?a._removedFactory(b):null;this.removed=!0}},E.attr=function(c,d){if(this.removed)return this;if(null==c){var e={};for(var f in this.attrs)this.attrs[b](f)&&(e[f]=this.attrs[f]);return e.gradient&&"none"==e.fill&&(e.fill=e.gradient)&&delete e.gradient,e.transform=this._.transform,e}if(null==d&&a.is(c,"string")){if(c==j&&"none"==this.attrs.fill&&this.attrs.gradient)return this.attrs.gradient;for(var g=c.split(k),h={},i=0,m=g.length;m>i;i++)c=g[i],c in this.attrs?h[c]=this.attrs[c]:a.is(this.paper.customAttributes[c],"function")?h[c]=this.paper.customAttributes[c].def:h[c]=a._availableAttrs[c];return m-1?h:h[g[0]]}if(this.attrs&&null==d&&a.is(c,"array")){for(h={},i=0,m=c.length;m>i;i++)h[c[i]]=this.attr(c[i]);return h}var n;null!=d&&(n={},n[c]=d),null==d&&a.is(c,"object")&&(n=c);for(var o in n)l("raphael.attr."+o+"."+this.id,this,n[o]);if(n){for(o in this.paper.customAttributes)if(this.paper.customAttributes[b](o)&&n[b](o)&&a.is(this.paper.customAttributes[o],"function")){var p=this.paper.customAttributes[o].apply(this,[].concat(n[o]));this.attrs[o]=n[o];for(var q in p)p[b](q)&&(n[q]=p[q])}n.text&&"text"==this.type&&(this.textpath.string=n.text),B(this,n)}return this},E.toFront=function(){return!this.removed&&this.node.parentNode.appendChild(this.node),this.paper&&this.paper.top!=this&&a._tofront(this,this.paper),this},E.toBack=function(){return this.removed?this:(this.node.parentNode.firstChild!=this.node&&(this.node.parentNode.insertBefore(this.node,this.node.parentNode.firstChild),a._toback(this,this.paper)),this)},E.insertAfter=function(b){return this.removed?this:(b.constructor==a.st.constructor&&(b=b[b.length-1]),b.node.nextSibling?b.node.parentNode.insertBefore(this.node,b.node.nextSibling):b.node.parentNode.appendChild(this.node),a._insertafter(this,b,this.paper),this)},E.insertBefore=function(b){return this.removed?this:(b.constructor==a.st.constructor&&(b=b[0]),b.node.parentNode.insertBefore(this.node,b.node),a._insertbefore(this,b,this.paper),this)},E.blur=function(b){var c=this.node.runtimeStyle,d=c.filter;return d=d.replace(r,o),0!==+b?(this.attrs.blur=b,c.filter=d+n+m+".Blur(pixelradius="+(+b||1.5)+")",c.margin=a.format("-{0}px 0 0 -{0}px",f(+b||1.5))):(c.filter=d,c.margin=0,delete this.attrs.blur),this},a._engine.path=function(a,b){var c=F("shape");c.style.cssText=t,c.coordsize=u+n+u,c.coordorigin=b.coordorigin;var d=new D(c,b),e={fill:"none",stroke:"#000"};a&&(e.path=a),d.type="path",d.path=[],d.Path=o,B(d,e),b.canvas.appendChild(c);var f=F("skew");return f.on=!0,c.appendChild(f),d.skew=f,d.transform(o),d},a._engine.rect=function(b,c,d,e,f,g){var h=a._rectPath(c,d,e,f,g),i=b.path(h),j=i.attrs;return i.X=j.x=c,i.Y=j.y=d,i.W=j.width=e,i.H=j.height=f,j.r=g,j.path=h,i.type="rect",i},a._engine.ellipse=function(a,b,c,d,e){{var f=a.path();f.attrs}return f.X=b-d,f.Y=c-e,f.W=2*d,f.H=2*e,f.type="ellipse",B(f,{cx:b,cy:c,rx:d,ry:e}),f},a._engine.circle=function(a,b,c,d){{var e=a.path();e.attrs}return e.X=b-d,e.Y=c-d,e.W=e.H=2*d,e.type="circle",B(e,{cx:b,cy:c,r:d}),e},a._engine.image=function(b,c,d,e,f,g){var h=a._rectPath(d,e,f,g),i=b.path(h).attr({stroke:"none"}),k=i.attrs,l=i.node,m=l.getElementsByTagName(j)[0];return k.src=c,i.X=k.x=d,i.Y=k.y=e,i.W=k.width=f,i.H=k.height=g,k.path=h,i.type="image",m.parentNode==l&&l.removeChild(m),m.rotate=!0,m.src=c,m.type="tile",i._.fillpos=[d,e],i._.fillsize=[f,g],l.appendChild(m),z(i,1,1,0,0,0),i},a._engine.text=function(b,d,e,g){var h=F("shape"),i=F("path"),j=F("textpath");d=d||0,e=e||0,g=g||"",i.v=a.format("m{0},{1}l{2},{1}",f(d*u),f(e*u),f(d*u)+1),i.textpathok=!0,j.string=c(g),j.on=!0,h.style.cssText=t,h.coordsize=u+n+u,h.coordorigin="0 0";var k=new D(h,b),l={fill:"#000",stroke:"none",font:a._availableAttrs.font,text:g};k.shape=h,k.path=i,k.textpath=j,k.type="text",k.attrs.text=c(g),k.attrs.x=d,k.attrs.y=e,k.attrs.w=1,k.attrs.h=1,B(k,l),h.appendChild(j),h.appendChild(i),b.canvas.appendChild(h);var m=F("skew");return m.on=!0,h.appendChild(m),k.skew=m,k.transform(o),k},a._engine.setSize=function(b,c){var d=this.canvas.style;return this.width=b,this.height=c,b==+b&&(b+="px"),c==+c&&(c+="px"),d.width=b,d.height=c,d.clip="rect(0 "+b+" "+c+" 0)",this._viewBox&&a._engine.setViewBox.apply(this,this._viewBox),this},a._engine.setViewBox=function(b,c,d,e,f){a.eve("raphael.setViewBox",this,this._viewBox,[b,c,d,e,f]);var g,h,i=this.getSize(),j=i.width,k=i.height;return f&&(g=k/e,h=j/d,j>d*g&&(b-=(j-d*g)/2/g),k>e*h&&(c-=(k-e*h)/2/h)),this._viewBox=[b,c,d,e,!!f],this._viewBoxShift={dx:-b,dy:-c,scale:i},this.forEach(function(a){a.transform("...")}),this};var F;a._engine.initWin=function(a){var b=a.document;b.styleSheets.length<31?b.createStyleSheet().addRule(".rvml","behavior:url(#default#VML)"):b.styleSheets[0].addRule(".rvml","behavior:url(#default#VML)");try{!b.namespaces.rvml&&b.namespaces.add("rvml","urn:schemas-microsoft-com:vml"),F=function(a){return b.createElement("')}}catch(c){F=function(a){return b.createElement("<"+a+' xmlns="urn:schemas-microsoft.com:vml" class="rvml">')}}},a._engine.initWin(a._g.win),a._engine.create=function(){var b=a._getContainer.apply(0,arguments),c=b.container,d=b.height,e=b.width,f=b.x,g=b.y;if(!c)throw new Error("VML container not found.");var h=new a._Paper,i=h.canvas=a._g.doc.createElement("div"),j=i.style;return f=f||0,g=g||0,e=e||512,d=d||342,h.width=e,h.height=d,e==+e&&(e+="px"),d==+d&&(d+="px"),h.coordsize=1e3*u+n+1e3*u,h.coordorigin="0 0",h.span=a._g.doc.createElement("span"),h.span.style.cssText="position:absolute;left:-9999em;top:-9999em;padding:0;margin:0;line-height:1;",i.appendChild(h.span),j.cssText=a.format("top:0;left:0;width:{0};height:{1};display:inline-block;position:relative;clip:rect(0 {0} {1} 0);overflow:hidden",e,d),1==c?(a._g.doc.body.appendChild(i),j.left=f+"px",j.top=g+"px",j.position="absolute"):c.firstChild?c.insertBefore(i,c.firstChild):c.appendChild(i),h.renderfix=function(){},h},a.prototype.clear=function(){a.eve("raphael.clear",this),this.canvas.innerHTML=o,this.span=a._g.doc.createElement("span"),this.span.style.cssText="position:absolute;left:-9999em;top:-9999em;padding:0;margin:0;line-height:1;display:inline;",this.canvas.appendChild(this.span),this.bottom=this.top=null},a.prototype.remove=function(){a.eve("raphael.remove",this),this.canvas.parentNode.removeChild(this.canvas);for(var b in this)this[b]="function"==typeof this[b]?a._removedFactory(b):null;return!0};var G=a.st;for(var H in E)E[b](H)&&!G[b](H)&&(G[H]=function(a){return function(){var b=arguments;return this.forEach(function(c){c[a].apply(c,b)})}}(H))}}); \ No newline at end of file diff --git a/synthetic_tree_viewer/synthetic_tree_viewer/static/js/bootstrap-affix.js b/synthetic_tree_viewer/synthetic_tree_viewer/static/js/bootstrap-affix.js new file mode 100644 index 000000000..91c9ced13 --- /dev/null +++ b/synthetic_tree_viewer/synthetic_tree_viewer/static/js/bootstrap-affix.js @@ -0,0 +1,117 @@ +/* ========================================================== + * bootstrap-affix.js v2.3.2 + * http://twitter.github.com/bootstrap/javascript.html#affix + * ========================================================== + * Copyright 2012 Twitter, Inc. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ========================================================== */ + + +!function ($) { + + "use strict"; // jshint ;_; + + + /* AFFIX CLASS DEFINITION + * ====================== */ + + var Affix = function (element, options) { + this.options = $.extend({}, $.fn.affix.defaults, options) + this.$window = $(window) + .on('scroll.affix.data-api', $.proxy(this.checkPosition, this)) + .on('click.affix.data-api', $.proxy(function () { setTimeout($.proxy(this.checkPosition, this), 1) }, this)) + this.$element = $(element) + this.checkPosition() + } + + Affix.prototype.checkPosition = function () { + if (!this.$element.is(':visible')) return + + var scrollHeight = $(document).height() + , scrollTop = this.$window.scrollTop() + , position = this.$element.offset() + , offset = this.options.offset + , offsetBottom = offset.bottom + , offsetTop = offset.top + , reset = 'affix affix-top affix-bottom' + , affix + + if (typeof offset != 'object') offsetBottom = offsetTop = offset + if (typeof offsetTop == 'function') offsetTop = offset.top() + if (typeof offsetBottom == 'function') offsetBottom = offset.bottom() + + affix = this.unpin != null && (scrollTop + this.unpin <= position.top) ? + false : offsetBottom != null && (position.top + this.$element.height() >= scrollHeight - offsetBottom) ? + 'bottom' : offsetTop != null && scrollTop <= offsetTop ? + 'top' : false + + if (this.affixed === affix) return + + this.affixed = affix + this.unpin = affix == 'bottom' ? position.top - scrollTop : null + + this.$element.removeClass(reset).addClass('affix' + (affix ? '-' + affix : '')) + } + + + /* AFFIX PLUGIN DEFINITION + * ======================= */ + + var old = $.fn.affix + + $.fn.affix = function (option) { + return this.each(function () { + var $this = $(this) + , data = $this.data('affix') + , options = typeof option == 'object' && option + if (!data) $this.data('affix', (data = new Affix(this, options))) + if (typeof option == 'string') data[option]() + }) + } + + $.fn.affix.Constructor = Affix + + $.fn.affix.defaults = { + offset: 0 + } + + + /* AFFIX NO CONFLICT + * ================= */ + + $.fn.affix.noConflict = function () { + $.fn.affix = old + return this + } + + + /* AFFIX DATA-API + * ============== */ + + $(window).on('load', function () { + $('[data-spy="affix"]').each(function () { + var $spy = $(this) + , data = $spy.data() + + data.offset = data.offset || {} + + data.offsetBottom && (data.offset.bottom = data.offsetBottom) + data.offsetTop && (data.offset.top = data.offsetTop) + + $spy.affix(data) + }) + }) + + +}(window.jQuery); \ No newline at end of file diff --git a/synthetic_tree_viewer/synthetic_tree_viewer/static/js/bootstrap-alert.js b/synthetic_tree_viewer/synthetic_tree_viewer/static/js/bootstrap-alert.js new file mode 100644 index 000000000..0cefe5fc5 --- /dev/null +++ b/synthetic_tree_viewer/synthetic_tree_viewer/static/js/bootstrap-alert.js @@ -0,0 +1,99 @@ +/* ========================================================== + * bootstrap-alert.js v2.3.2 + * http://twitter.github.com/bootstrap/javascript.html#alerts + * ========================================================== + * Copyright 2012 Twitter, Inc. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ========================================================== */ + + +!function ($) { + + "use strict"; // jshint ;_; + + + /* ALERT CLASS DEFINITION + * ====================== */ + + var dismiss = '[data-dismiss="alert"]' + , Alert = function (el) { + $(el).on('click', dismiss, this.close) + } + + Alert.prototype.close = function (e) { + var $this = $(this) + , selector = $this.attr('data-target') + , $parent + + if (!selector) { + selector = $this.attr('href') + selector = selector && selector.replace(/.*(?=#[^\s]*$)/, '') //strip for ie7 + } + + $parent = $(selector) + + e && e.preventDefault() + + $parent.length || ($parent = $this.hasClass('alert') ? $this : $this.parent()) + + $parent.trigger(e = $.Event('close')) + + if (e.isDefaultPrevented()) return + + $parent.removeClass('in') + + function removeElement() { + $parent + .trigger('closed') + .remove() + } + + $.support.transition && $parent.hasClass('fade') ? + $parent.on($.support.transition.end, removeElement) : + removeElement() + } + + + /* ALERT PLUGIN DEFINITION + * ======================= */ + + var old = $.fn.alert + + $.fn.alert = function (option) { + return this.each(function () { + var $this = $(this) + , data = $this.data('alert') + if (!data) $this.data('alert', (data = new Alert(this))) + if (typeof option == 'string') data[option].call($this) + }) + } + + $.fn.alert.Constructor = Alert + + + /* ALERT NO CONFLICT + * ================= */ + + $.fn.alert.noConflict = function () { + $.fn.alert = old + return this + } + + + /* ALERT DATA-API + * ============== */ + + $(document).on('click.alert.data-api', dismiss, Alert.prototype.close) + +}(window.jQuery); \ No newline at end of file diff --git a/synthetic_tree_viewer/synthetic_tree_viewer/static/js/bootstrap-button.js b/synthetic_tree_viewer/synthetic_tree_viewer/static/js/bootstrap-button.js new file mode 100644 index 000000000..ce4599164 --- /dev/null +++ b/synthetic_tree_viewer/synthetic_tree_viewer/static/js/bootstrap-button.js @@ -0,0 +1,105 @@ +/* ============================================================ + * bootstrap-button.js v2.3.2 + * http://twitter.github.com/bootstrap/javascript.html#buttons + * ============================================================ + * Copyright 2012 Twitter, Inc. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================ */ + + +!function ($) { + + "use strict"; // jshint ;_; + + + /* BUTTON PUBLIC CLASS DEFINITION + * ============================== */ + + var Button = function (element, options) { + this.$element = $(element) + this.options = $.extend({}, $.fn.button.defaults, options) + } + + Button.prototype.setState = function (state) { + var d = 'disabled' + , $el = this.$element + , data = $el.data() + , val = $el.is('input') ? 'val' : 'html' + + state = state + 'Text' + data.resetText || $el.data('resetText', $el[val]()) + + $el[val](data[state] || this.options[state]) + + // push to event loop to allow forms to submit + setTimeout(function () { + state == 'loadingText' ? + $el.addClass(d).attr(d, d) : + $el.removeClass(d).removeAttr(d) + }, 0) + } + + Button.prototype.toggle = function () { + var $parent = this.$element.closest('[data-toggle="buttons-radio"]') + + $parent && $parent + .find('.active') + .removeClass('active') + + this.$element.toggleClass('active') + } + + + /* BUTTON PLUGIN DEFINITION + * ======================== */ + + var old = $.fn.button + + $.fn.button = function (option) { + return this.each(function () { + var $this = $(this) + , data = $this.data('button') + , options = typeof option == 'object' && option + if (!data) $this.data('button', (data = new Button(this, options))) + if (option == 'toggle') data.toggle() + else if (option) data.setState(option) + }) + } + + $.fn.button.defaults = { + loadingText: 'loading...' + } + + $.fn.button.Constructor = Button + + + /* BUTTON NO CONFLICT + * ================== */ + + $.fn.button.noConflict = function () { + $.fn.button = old + return this + } + + + /* BUTTON DATA-API + * =============== */ + + $(document).on('click.button.data-api', '[data-toggle^=button]', function (e) { + var $btn = $(e.target) + if (!$btn.hasClass('btn')) $btn = $btn.closest('.btn') + $btn.button('toggle') + }) + +}(window.jQuery); \ No newline at end of file diff --git a/synthetic_tree_viewer/synthetic_tree_viewer/static/js/bootstrap-carousel.js b/synthetic_tree_viewer/synthetic_tree_viewer/static/js/bootstrap-carousel.js new file mode 100644 index 000000000..476494ad6 --- /dev/null +++ b/synthetic_tree_viewer/synthetic_tree_viewer/static/js/bootstrap-carousel.js @@ -0,0 +1,207 @@ +/* ========================================================== + * bootstrap-carousel.js v2.3.2 + * http://twitter.github.com/bootstrap/javascript.html#carousel + * ========================================================== + * Copyright 2012 Twitter, Inc. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ========================================================== */ + + +!function ($) { + + "use strict"; // jshint ;_; + + + /* CAROUSEL CLASS DEFINITION + * ========================= */ + + var Carousel = function (element, options) { + this.$element = $(element) + this.$indicators = this.$element.find('.carousel-indicators') + this.options = options + this.options.pause == 'hover' && this.$element + .on('mouseenter', $.proxy(this.pause, this)) + .on('mouseleave', $.proxy(this.cycle, this)) + } + + Carousel.prototype = { + + cycle: function (e) { + if (!e) this.paused = false + if (this.interval) clearInterval(this.interval); + this.options.interval + && !this.paused + && (this.interval = setInterval($.proxy(this.next, this), this.options.interval)) + return this + } + + , getActiveIndex: function () { + this.$active = this.$element.find('.item.active') + this.$items = this.$active.parent().children() + return this.$items.index(this.$active) + } + + , to: function (pos) { + var activeIndex = this.getActiveIndex() + , that = this + + if (pos > (this.$items.length - 1) || pos < 0) return + + if (this.sliding) { + return this.$element.one('slid', function () { + that.to(pos) + }) + } + + if (activeIndex == pos) { + return this.pause().cycle() + } + + return this.slide(pos > activeIndex ? 'next' : 'prev', $(this.$items[pos])) + } + + , pause: function (e) { + if (!e) this.paused = true + if (this.$element.find('.next, .prev').length && $.support.transition.end) { + this.$element.trigger($.support.transition.end) + this.cycle(true) + } + clearInterval(this.interval) + this.interval = null + return this + } + + , next: function () { + if (this.sliding) return + return this.slide('next') + } + + , prev: function () { + if (this.sliding) return + return this.slide('prev') + } + + , slide: function (type, next) { + var $active = this.$element.find('.item.active') + , $next = next || $active[type]() + , isCycling = this.interval + , direction = type == 'next' ? 'left' : 'right' + , fallback = type == 'next' ? 'first' : 'last' + , that = this + , e + + this.sliding = true + + isCycling && this.pause() + + $next = $next.length ? $next : this.$element.find('.item')[fallback]() + + e = $.Event('slide', { + relatedTarget: $next[0] + , direction: direction + }) + + if ($next.hasClass('active')) return + + if (this.$indicators.length) { + this.$indicators.find('.active').removeClass('active') + this.$element.one('slid', function () { + var $nextIndicator = $(that.$indicators.children()[that.getActiveIndex()]) + $nextIndicator && $nextIndicator.addClass('active') + }) + } + + if ($.support.transition && this.$element.hasClass('slide')) { + this.$element.trigger(e) + if (e.isDefaultPrevented()) return + $next.addClass(type) + $next[0].offsetWidth // force reflow + $active.addClass(direction) + $next.addClass(direction) + this.$element.one($.support.transition.end, function () { + $next.removeClass([type, direction].join(' ')).addClass('active') + $active.removeClass(['active', direction].join(' ')) + that.sliding = false + setTimeout(function () { that.$element.trigger('slid') }, 0) + }) + } else { + this.$element.trigger(e) + if (e.isDefaultPrevented()) return + $active.removeClass('active') + $next.addClass('active') + this.sliding = false + this.$element.trigger('slid') + } + + isCycling && this.cycle() + + return this + } + + } + + + /* CAROUSEL PLUGIN DEFINITION + * ========================== */ + + var old = $.fn.carousel + + $.fn.carousel = function (option) { + return this.each(function () { + var $this = $(this) + , data = $this.data('carousel') + , options = $.extend({}, $.fn.carousel.defaults, typeof option == 'object' && option) + , action = typeof option == 'string' ? option : options.slide + if (!data) $this.data('carousel', (data = new Carousel(this, options))) + if (typeof option == 'number') data.to(option) + else if (action) data[action]() + else if (options.interval) data.pause().cycle() + }) + } + + $.fn.carousel.defaults = { + interval: 5000 + , pause: 'hover' + } + + $.fn.carousel.Constructor = Carousel + + + /* CAROUSEL NO CONFLICT + * ==================== */ + + $.fn.carousel.noConflict = function () { + $.fn.carousel = old + return this + } + + /* CAROUSEL DATA-API + * ================= */ + + $(document).on('click.carousel.data-api', '[data-slide], [data-slide-to]', function (e) { + var $this = $(this), href + , $target = $($this.attr('data-target') || (href = $this.attr('href')) && href.replace(/.*(?=#[^\s]+$)/, '')) //strip for ie7 + , options = $.extend({}, $target.data(), $this.data()) + , slideIndex + + $target.carousel(options) + + if (slideIndex = $this.attr('data-slide-to')) { + $target.data('carousel').pause().to(slideIndex).cycle() + } + + e.preventDefault() + }) + +}(window.jQuery); \ No newline at end of file diff --git a/synthetic_tree_viewer/synthetic_tree_viewer/static/js/bootstrap-collapse.js b/synthetic_tree_viewer/synthetic_tree_viewer/static/js/bootstrap-collapse.js new file mode 100644 index 000000000..74a73a890 --- /dev/null +++ b/synthetic_tree_viewer/synthetic_tree_viewer/static/js/bootstrap-collapse.js @@ -0,0 +1,167 @@ +/* ============================================================= + * bootstrap-collapse.js v2.3.2 + * http://twitter.github.com/bootstrap/javascript.html#collapse + * ============================================================= + * Copyright 2012 Twitter, Inc. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================ */ + + +!function ($) { + + "use strict"; // jshint ;_; + + + /* COLLAPSE PUBLIC CLASS DEFINITION + * ================================ */ + + var Collapse = function (element, options) { + this.$element = $(element) + this.options = $.extend({}, $.fn.collapse.defaults, options) + + if (this.options.parent) { + this.$parent = $(this.options.parent) + } + + this.options.toggle && this.toggle() + } + + Collapse.prototype = { + + constructor: Collapse + + , dimension: function () { + var hasWidth = this.$element.hasClass('width') + return hasWidth ? 'width' : 'height' + } + + , show: function () { + var dimension + , scroll + , actives + , hasData + + if (this.transitioning || this.$element.hasClass('in')) return + + dimension = this.dimension() + scroll = $.camelCase(['scroll', dimension].join('-')) + actives = this.$parent && this.$parent.find('> .accordion-group > .in') + + if (actives && actives.length) { + hasData = actives.data('collapse') + if (hasData && hasData.transitioning) return + actives.collapse('hide') + hasData || actives.data('collapse', null) + } + + this.$element[dimension](0) + this.transition('addClass', $.Event('show'), 'shown') + $.support.transition && this.$element[dimension](this.$element[0][scroll]) + } + + , hide: function () { + var dimension + if (this.transitioning || !this.$element.hasClass('in')) return + dimension = this.dimension() + this.reset(this.$element[dimension]()) + this.transition('removeClass', $.Event('hide'), 'hidden') + this.$element[dimension](0) + } + + , reset: function (size) { + var dimension = this.dimension() + + this.$element + .removeClass('collapse') + [dimension](size || 'auto') + [0].offsetWidth + + this.$element[size !== null ? 'addClass' : 'removeClass']('collapse') + + return this + } + + , transition: function (method, startEvent, completeEvent) { + var that = this + , complete = function () { + if (startEvent.type == 'show') that.reset() + that.transitioning = 0 + that.$element.trigger(completeEvent) + } + + this.$element.trigger(startEvent) + + if (startEvent.isDefaultPrevented()) return + + this.transitioning = 1 + + this.$element[method]('in') + + $.support.transition && this.$element.hasClass('collapse') ? + this.$element.one($.support.transition.end, complete) : + complete() + } + + , toggle: function () { + this[this.$element.hasClass('in') ? 'hide' : 'show']() + } + + } + + + /* COLLAPSE PLUGIN DEFINITION + * ========================== */ + + var old = $.fn.collapse + + $.fn.collapse = function (option) { + return this.each(function () { + var $this = $(this) + , data = $this.data('collapse') + , options = $.extend({}, $.fn.collapse.defaults, $this.data(), typeof option == 'object' && option) + if (!data) $this.data('collapse', (data = new Collapse(this, options))) + if (typeof option == 'string') data[option]() + }) + } + + $.fn.collapse.defaults = { + toggle: true + } + + $.fn.collapse.Constructor = Collapse + + + /* COLLAPSE NO CONFLICT + * ==================== */ + + $.fn.collapse.noConflict = function () { + $.fn.collapse = old + return this + } + + + /* COLLAPSE DATA-API + * ================= */ + + $(document).on('click.collapse.data-api', '[data-toggle=collapse]', function (e) { + var $this = $(this), href + , target = $this.attr('data-target') + || e.preventDefault() + || (href = $this.attr('href')) && href.replace(/.*(?=#[^\s]+$)/, '') //strip for ie7 + , option = $(target).data('collapse') ? 'toggle' : $this.data() + $this[$(target).hasClass('in') ? 'addClass' : 'removeClass']('collapsed') + $(target).collapse(option) + }) + +}(window.jQuery); \ No newline at end of file diff --git a/synthetic_tree_viewer/synthetic_tree_viewer/static/js/bootstrap-dropdown.js b/synthetic_tree_viewer/synthetic_tree_viewer/static/js/bootstrap-dropdown.js new file mode 100644 index 000000000..cf8cb524d --- /dev/null +++ b/synthetic_tree_viewer/synthetic_tree_viewer/static/js/bootstrap-dropdown.js @@ -0,0 +1,176 @@ +/* ============================================================ + * bootstrap-dropdown.js v2.3.2 + * http://twitter.github.com/bootstrap/javascript.html#dropdowns + * ============================================================ + * Copyright 2012 Twitter, Inc. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================ */ +/* + * Contains minor modifications by Jim Allman (see 'jimA' below) + */ + +!function ($) { + + "use strict"; // jshint ;_; + + + /* DROPDOWN CLASS DEFINITION + * ========================= */ + + var toggle = '[data-toggle=dropdown]' + , Dropdown = function (element) { + var $el = $(element).on('click.dropdown.data-api', this.toggle) + $('html').on('click.dropdown.data-api', function () { + $el.parent().removeClass('open') + }) + } + + Dropdown.prototype = { + + constructor: Dropdown + + , toggle: function (e) { + var $this = $(this) + , $parent + , isActive + + if ($this.is('.disabled, :disabled')) return + + $parent = getParent($this) + + isActive = $parent.hasClass('open') + + clearMenus() + + if (!isActive) { + if ('ontouchstart' in document.documentElement) { + // if mobile we we use a backdrop because click events don't delegate + $('
      a",n=d.getElementsByTagName("*"),r=d.getElementsByTagName("a")[0],!n||!r||!n.length)return{};s=o.createElement("select"),l=s.appendChild(o.createElement("option")),a=d.getElementsByTagName("input")[0],r.style.cssText="top:1px;float:left;opacity:.5",t={getSetAttribute:"t"!==d.className,leadingWhitespace:3===d.firstChild.nodeType,tbody:!d.getElementsByTagName("tbody").length,htmlSerialize:!!d.getElementsByTagName("link").length,style:/top/.test(r.getAttribute("style")),hrefNormalized:"/a"===r.getAttribute("href"),opacity:/^0.5/.test(r.style.opacity),cssFloat:!!r.style.cssFloat,checkOn:!!a.value,optSelected:l.selected,enctype:!!o.createElement("form").enctype,html5Clone:"<:nav>"!==o.createElement("nav").cloneNode(!0).outerHTML,boxModel:"CSS1Compat"===o.compatMode,deleteExpando:!0,noCloneEvent:!0,inlineBlockNeedsLayout:!1,shrinkWrapBlocks:!1,reliableMarginRight:!0,boxSizingReliable:!0,pixelPosition:!1},a.checked=!0,t.noCloneChecked=a.cloneNode(!0).checked,s.disabled=!0,t.optDisabled=!l.disabled;try{delete d.test}catch(h){t.deleteExpando=!1}a=o.createElement("input"),a.setAttribute("value",""),t.input=""===a.getAttribute("value"),a.value="t",a.setAttribute("type","radio"),t.radioValue="t"===a.value,a.setAttribute("checked","t"),a.setAttribute("name","t"),u=o.createDocumentFragment(),u.appendChild(a),t.appendChecked=a.checked,t.checkClone=u.cloneNode(!0).cloneNode(!0).lastChild.checked,d.attachEvent&&(d.attachEvent("onclick",function(){t.noCloneEvent=!1}),d.cloneNode(!0).click());for(f in{submit:!0,change:!0,focusin:!0})d.setAttribute(c="on"+f,"t"),t[f+"Bubbles"]=c in e||d.attributes[c].expando===!1;return d.style.backgroundClip="content-box",d.cloneNode(!0).style.backgroundClip="",t.clearCloneStyle="content-box"===d.style.backgroundClip,b(function(){var n,r,a,s="padding:0;margin:0;border:0;display:block;box-sizing:content-box;-moz-box-sizing:content-box;-webkit-box-sizing:content-box;",u=o.getElementsByTagName("body")[0];u&&(n=o.createElement("div"),n.style.cssText="border:0;width:0;height:0;position:absolute;top:0;left:-9999px;margin-top:1px",u.appendChild(n).appendChild(d),d.innerHTML="
      t
      ",a=d.getElementsByTagName("td"),a[0].style.cssText="padding:0;margin:0;border:0;display:none",p=0===a[0].offsetHeight,a[0].style.display="",a[1].style.display="none",t.reliableHiddenOffsets=p&&0===a[0].offsetHeight,d.innerHTML="",d.style.cssText="box-sizing:border-box;-moz-box-sizing:border-box;-webkit-box-sizing:border-box;padding:1px;border:1px;display:block;width:4px;margin-top:1%;position:absolute;top:1%;",t.boxSizing=4===d.offsetWidth,t.doesNotIncludeMarginInBodyOffset=1!==u.offsetTop,e.getComputedStyle&&(t.pixelPosition="1%"!==(e.getComputedStyle(d,null)||{}).top,t.boxSizingReliable="4px"===(e.getComputedStyle(d,null)||{width:"4px"}).width,r=d.appendChild(o.createElement("div")),r.style.cssText=d.style.cssText=s,r.style.marginRight=r.style.width="0",d.style.width="1px",t.reliableMarginRight=!parseFloat((e.getComputedStyle(r,null)||{}).marginRight)),typeof d.style.zoom!==i&&(d.innerHTML="",d.style.cssText=s+"width:1px;padding:1px;display:inline;zoom:1",t.inlineBlockNeedsLayout=3===d.offsetWidth,d.style.display="block",d.innerHTML="
      ",d.firstChild.style.width="5px",t.shrinkWrapBlocks=3!==d.offsetWidth,t.inlineBlockNeedsLayout&&(u.style.zoom=1)),u.removeChild(n),n=d=a=r=null)}),n=s=u=l=r=a=null,t}();var O=/(?:\{[\s\S]*\}|\[[\s\S]*\])$/,B=/([A-Z])/g;function P(e,n,r,i){if(b.acceptData(e)){var o,a,s=b.expando,u="string"==typeof n,l=e.nodeType,p=l?b.cache:e,f=l?e[s]:e[s]&&s;if(f&&p[f]&&(i||p[f].data)||!u||r!==t)return f||(l?e[s]=f=c.pop()||b.guid++:f=s),p[f]||(p[f]={},l||(p[f].toJSON=b.noop)),("object"==typeof n||"function"==typeof n)&&(i?p[f]=b.extend(p[f],n):p[f].data=b.extend(p[f].data,n)),o=p[f],i||(o.data||(o.data={}),o=o.data),r!==t&&(o[b.camelCase(n)]=r),u?(a=o[n],null==a&&(a=o[b.camelCase(n)])):a=o,a}}function R(e,t,n){if(b.acceptData(e)){var r,i,o,a=e.nodeType,s=a?b.cache:e,u=a?e[b.expando]:b.expando;if(s[u]){if(t&&(o=n?s[u]:s[u].data)){b.isArray(t)?t=t.concat(b.map(t,b.camelCase)):t in o?t=[t]:(t=b.camelCase(t),t=t in o?[t]:t.split(" "));for(r=0,i=t.length;i>r;r++)delete o[t[r]];if(!(n?$:b.isEmptyObject)(o))return}(n||(delete s[u].data,$(s[u])))&&(a?b.cleanData([e],!0):b.support.deleteExpando||s!=s.window?delete s[u]:s[u]=null)}}}b.extend({cache:{},expando:"jQuery"+(p+Math.random()).replace(/\D/g,""),noData:{embed:!0,object:"clsid:D27CDB6E-AE6D-11cf-96B8-444553540000",applet:!0},hasData:function(e){return e=e.nodeType?b.cache[e[b.expando]]:e[b.expando],!!e&&!$(e)},data:function(e,t,n){return P(e,t,n)},removeData:function(e,t){return R(e,t)},_data:function(e,t,n){return P(e,t,n,!0)},_removeData:function(e,t){return R(e,t,!0)},acceptData:function(e){if(e.nodeType&&1!==e.nodeType&&9!==e.nodeType)return!1;var t=e.nodeName&&b.noData[e.nodeName.toLowerCase()];return!t||t!==!0&&e.getAttribute("classid")===t}}),b.fn.extend({data:function(e,n){var r,i,o=this[0],a=0,s=null;if(e===t){if(this.length&&(s=b.data(o),1===o.nodeType&&!b._data(o,"parsedAttrs"))){for(r=o.attributes;r.length>a;a++)i=r[a].name,i.indexOf("data-")||(i=b.camelCase(i.slice(5)),W(o,i,s[i]));b._data(o,"parsedAttrs",!0)}return s}return"object"==typeof e?this.each(function(){b.data(this,e)}):b.access(this,function(n){return n===t?o?W(o,e,b.data(o,e)):null:(this.each(function(){b.data(this,e,n)}),t)},null,n,arguments.length>1,null,!0)},removeData:function(e){return this.each(function(){b.removeData(this,e)})}});function W(e,n,r){if(r===t&&1===e.nodeType){var i="data-"+n.replace(B,"-$1").toLowerCase();if(r=e.getAttribute(i),"string"==typeof r){try{r="true"===r?!0:"false"===r?!1:"null"===r?null:+r+""===r?+r:O.test(r)?b.parseJSON(r):r}catch(o){}b.data(e,n,r)}else r=t}return r}function $(e){var t;for(t in e)if(("data"!==t||!b.isEmptyObject(e[t]))&&"toJSON"!==t)return!1;return!0}b.extend({queue:function(e,n,r){var i;return e?(n=(n||"fx")+"queue",i=b._data(e,n),r&&(!i||b.isArray(r)?i=b._data(e,n,b.makeArray(r)):i.push(r)),i||[]):t},dequeue:function(e,t){t=t||"fx";var n=b.queue(e,t),r=n.length,i=n.shift(),o=b._queueHooks(e,t),a=function(){b.dequeue(e,t)};"inprogress"===i&&(i=n.shift(),r--),o.cur=i,i&&("fx"===t&&n.unshift("inprogress"),delete o.stop,i.call(e,a,o)),!r&&o&&o.empty.fire()},_queueHooks:function(e,t){var n=t+"queueHooks";return b._data(e,n)||b._data(e,n,{empty:b.Callbacks("once memory").add(function(){b._removeData(e,t+"queue"),b._removeData(e,n)})})}}),b.fn.extend({queue:function(e,n){var r=2;return"string"!=typeof e&&(n=e,e="fx",r--),r>arguments.length?b.queue(this[0],e):n===t?this:this.each(function(){var t=b.queue(this,e,n);b._queueHooks(this,e),"fx"===e&&"inprogress"!==t[0]&&b.dequeue(this,e)})},dequeue:function(e){return this.each(function(){b.dequeue(this,e)})},delay:function(e,t){return e=b.fx?b.fx.speeds[e]||e:e,t=t||"fx",this.queue(t,function(t,n){var r=setTimeout(t,e);n.stop=function(){clearTimeout(r)}})},clearQueue:function(e){return this.queue(e||"fx",[])},promise:function(e,n){var r,i=1,o=b.Deferred(),a=this,s=this.length,u=function(){--i||o.resolveWith(a,[a])};"string"!=typeof e&&(n=e,e=t),e=e||"fx";while(s--)r=b._data(a[s],e+"queueHooks"),r&&r.empty&&(i++,r.empty.add(u));return u(),o.promise(n)}});var I,z,X=/[\t\r\n]/g,U=/\r/g,V=/^(?:input|select|textarea|button|object)$/i,Y=/^(?:a|area)$/i,J=/^(?:checked|selected|autofocus|autoplay|async|controls|defer|disabled|hidden|loop|multiple|open|readonly|required|scoped)$/i,G=/^(?:checked|selected)$/i,Q=b.support.getSetAttribute,K=b.support.input;b.fn.extend({attr:function(e,t){return b.access(this,b.attr,e,t,arguments.length>1)},removeAttr:function(e){return this.each(function(){b.removeAttr(this,e)})},prop:function(e,t){return b.access(this,b.prop,e,t,arguments.length>1)},removeProp:function(e){return e=b.propFix[e]||e,this.each(function(){try{this[e]=t,delete this[e]}catch(n){}})},addClass:function(e){var t,n,r,i,o,a=0,s=this.length,u="string"==typeof e&&e;if(b.isFunction(e))return this.each(function(t){b(this).addClass(e.call(this,t,this.className))});if(u)for(t=(e||"").match(w)||[];s>a;a++)if(n=this[a],r=1===n.nodeType&&(n.className?(" "+n.className+" ").replace(X," "):" ")){o=0;while(i=t[o++])0>r.indexOf(" "+i+" ")&&(r+=i+" ");n.className=b.trim(r)}return this},removeClass:function(e){var t,n,r,i,o,a=0,s=this.length,u=0===arguments.length||"string"==typeof e&&e;if(b.isFunction(e))return this.each(function(t){b(this).removeClass(e.call(this,t,this.className))});if(u)for(t=(e||"").match(w)||[];s>a;a++)if(n=this[a],r=1===n.nodeType&&(n.className?(" "+n.className+" ").replace(X," "):"")){o=0;while(i=t[o++])while(r.indexOf(" "+i+" ")>=0)r=r.replace(" "+i+" "," ");n.className=e?b.trim(r):""}return this},toggleClass:function(e,t){var n=typeof e,r="boolean"==typeof t;return b.isFunction(e)?this.each(function(n){b(this).toggleClass(e.call(this,n,this.className,t),t)}):this.each(function(){if("string"===n){var o,a=0,s=b(this),u=t,l=e.match(w)||[];while(o=l[a++])u=r?u:!s.hasClass(o),s[u?"addClass":"removeClass"](o)}else(n===i||"boolean"===n)&&(this.className&&b._data(this,"__className__",this.className),this.className=this.className||e===!1?"":b._data(this,"__className__")||"")})},hasClass:function(e){var t=" "+e+" ",n=0,r=this.length;for(;r>n;n++)if(1===this[n].nodeType&&(" "+this[n].className+" ").replace(X," ").indexOf(t)>=0)return!0;return!1},val:function(e){var n,r,i,o=this[0];{if(arguments.length)return i=b.isFunction(e),this.each(function(n){var o,a=b(this);1===this.nodeType&&(o=i?e.call(this,n,a.val()):e,null==o?o="":"number"==typeof o?o+="":b.isArray(o)&&(o=b.map(o,function(e){return null==e?"":e+""})),r=b.valHooks[this.type]||b.valHooks[this.nodeName.toLowerCase()],r&&"set"in r&&r.set(this,o,"value")!==t||(this.value=o))});if(o)return r=b.valHooks[o.type]||b.valHooks[o.nodeName.toLowerCase()],r&&"get"in r&&(n=r.get(o,"value"))!==t?n:(n=o.value,"string"==typeof n?n.replace(U,""):null==n?"":n)}}}),b.extend({valHooks:{option:{get:function(e){var t=e.attributes.value;return!t||t.specified?e.value:e.text}},select:{get:function(e){var t,n,r=e.options,i=e.selectedIndex,o="select-one"===e.type||0>i,a=o?null:[],s=o?i+1:r.length,u=0>i?s:o?i:0;for(;s>u;u++)if(n=r[u],!(!n.selected&&u!==i||(b.support.optDisabled?n.disabled:null!==n.getAttribute("disabled"))||n.parentNode.disabled&&b.nodeName(n.parentNode,"optgroup"))){if(t=b(n).val(),o)return t;a.push(t)}return a},set:function(e,t){var n=b.makeArray(t);return b(e).find("option").each(function(){this.selected=b.inArray(b(this).val(),n)>=0}),n.length||(e.selectedIndex=-1),n}}},attr:function(e,n,r){var o,a,s,u=e.nodeType;if(e&&3!==u&&8!==u&&2!==u)return typeof e.getAttribute===i?b.prop(e,n,r):(a=1!==u||!b.isXMLDoc(e),a&&(n=n.toLowerCase(),o=b.attrHooks[n]||(J.test(n)?z:I)),r===t?o&&a&&"get"in o&&null!==(s=o.get(e,n))?s:(typeof e.getAttribute!==i&&(s=e.getAttribute(n)),null==s?t:s):null!==r?o&&a&&"set"in o&&(s=o.set(e,r,n))!==t?s:(e.setAttribute(n,r+""),r):(b.removeAttr(e,n),t))},removeAttr:function(e,t){var n,r,i=0,o=t&&t.match(w);if(o&&1===e.nodeType)while(n=o[i++])r=b.propFix[n]||n,J.test(n)?!Q&&G.test(n)?e[b.camelCase("default-"+n)]=e[r]=!1:e[r]=!1:b.attr(e,n,""),e.removeAttribute(Q?n:r)},attrHooks:{type:{set:function(e,t){if(!b.support.radioValue&&"radio"===t&&b.nodeName(e,"input")){var n=e.value;return e.setAttribute("type",t),n&&(e.value=n),t}}}},propFix:{tabindex:"tabIndex",readonly:"readOnly","for":"htmlFor","class":"className",maxlength:"maxLength",cellspacing:"cellSpacing",cellpadding:"cellPadding",rowspan:"rowSpan",colspan:"colSpan",usemap:"useMap",frameborder:"frameBorder",contenteditable:"contentEditable"},prop:function(e,n,r){var i,o,a,s=e.nodeType;if(e&&3!==s&&8!==s&&2!==s)return a=1!==s||!b.isXMLDoc(e),a&&(n=b.propFix[n]||n,o=b.propHooks[n]),r!==t?o&&"set"in o&&(i=o.set(e,r,n))!==t?i:e[n]=r:o&&"get"in o&&null!==(i=o.get(e,n))?i:e[n]},propHooks:{tabIndex:{get:function(e){var n=e.getAttributeNode("tabindex");return n&&n.specified?parseInt(n.value,10):V.test(e.nodeName)||Y.test(e.nodeName)&&e.href?0:t}}}}),z={get:function(e,n){var r=b.prop(e,n),i="boolean"==typeof r&&e.getAttribute(n),o="boolean"==typeof r?K&&Q?null!=i:G.test(n)?e[b.camelCase("default-"+n)]:!!i:e.getAttributeNode(n);return o&&o.value!==!1?n.toLowerCase():t},set:function(e,t,n){return t===!1?b.removeAttr(e,n):K&&Q||!G.test(n)?e.setAttribute(!Q&&b.propFix[n]||n,n):e[b.camelCase("default-"+n)]=e[n]=!0,n}},K&&Q||(b.attrHooks.value={get:function(e,n){var r=e.getAttributeNode(n);return b.nodeName(e,"input")?e.defaultValue:r&&r.specified?r.value:t},set:function(e,n,r){return b.nodeName(e,"input")?(e.defaultValue=n,t):I&&I.set(e,n,r)}}),Q||(I=b.valHooks.button={get:function(e,n){var r=e.getAttributeNode(n);return r&&("id"===n||"name"===n||"coords"===n?""!==r.value:r.specified)?r.value:t},set:function(e,n,r){var i=e.getAttributeNode(r);return i||e.setAttributeNode(i=e.ownerDocument.createAttribute(r)),i.value=n+="","value"===r||n===e.getAttribute(r)?n:t}},b.attrHooks.contenteditable={get:I.get,set:function(e,t,n){I.set(e,""===t?!1:t,n)}},b.each(["width","height"],function(e,n){b.attrHooks[n]=b.extend(b.attrHooks[n],{set:function(e,r){return""===r?(e.setAttribute(n,"auto"),r):t}})})),b.support.hrefNormalized||(b.each(["href","src","width","height"],function(e,n){b.attrHooks[n]=b.extend(b.attrHooks[n],{get:function(e){var r=e.getAttribute(n,2);return null==r?t:r}})}),b.each(["href","src"],function(e,t){b.propHooks[t]={get:function(e){return e.getAttribute(t,4)}}})),b.support.style||(b.attrHooks.style={get:function(e){return e.style.cssText||t},set:function(e,t){return e.style.cssText=t+""}}),b.support.optSelected||(b.propHooks.selected=b.extend(b.propHooks.selected,{get:function(e){var t=e.parentNode;return t&&(t.selectedIndex,t.parentNode&&t.parentNode.selectedIndex),null}})),b.support.enctype||(b.propFix.enctype="encoding"),b.support.checkOn||b.each(["radio","checkbox"],function(){b.valHooks[this]={get:function(e){return null===e.getAttribute("value")?"on":e.value}}}),b.each(["radio","checkbox"],function(){b.valHooks[this]=b.extend(b.valHooks[this],{set:function(e,n){return b.isArray(n)?e.checked=b.inArray(b(e).val(),n)>=0:t}})});var Z=/^(?:input|select|textarea)$/i,et=/^key/,tt=/^(?:mouse|contextmenu)|click/,nt=/^(?:focusinfocus|focusoutblur)$/,rt=/^([^.]*)(?:\.(.+)|)$/;function it(){return!0}function ot(){return!1}b.event={global:{},add:function(e,n,r,o,a){var s,u,l,c,p,f,d,h,g,m,y,v=b._data(e);if(v){r.handler&&(c=r,r=c.handler,a=c.selector),r.guid||(r.guid=b.guid++),(u=v.events)||(u=v.events={}),(f=v.handle)||(f=v.handle=function(e){return typeof b===i||e&&b.event.triggered===e.type?t:b.event.dispatch.apply(f.elem,arguments)},f.elem=e),n=(n||"").match(w)||[""],l=n.length;while(l--)s=rt.exec(n[l])||[],g=y=s[1],m=(s[2]||"").split(".").sort(),p=b.event.special[g]||{},g=(a?p.delegateType:p.bindType)||g,p=b.event.special[g]||{},d=b.extend({type:g,origType:y,data:o,handler:r,guid:r.guid,selector:a,needsContext:a&&b.expr.match.needsContext.test(a),namespace:m.join(".")},c),(h=u[g])||(h=u[g]=[],h.delegateCount=0,p.setup&&p.setup.call(e,o,m,f)!==!1||(e.addEventListener?e.addEventListener(g,f,!1):e.attachEvent&&e.attachEvent("on"+g,f))),p.add&&(p.add.call(e,d),d.handler.guid||(d.handler.guid=r.guid)),a?h.splice(h.delegateCount++,0,d):h.push(d),b.event.global[g]=!0;e=null}},remove:function(e,t,n,r,i){var o,a,s,u,l,c,p,f,d,h,g,m=b.hasData(e)&&b._data(e);if(m&&(c=m.events)){t=(t||"").match(w)||[""],l=t.length;while(l--)if(s=rt.exec(t[l])||[],d=g=s[1],h=(s[2]||"").split(".").sort(),d){p=b.event.special[d]||{},d=(r?p.delegateType:p.bindType)||d,f=c[d]||[],s=s[2]&&RegExp("(^|\\.)"+h.join("\\.(?:.*\\.|)")+"(\\.|$)"),u=o=f.length;while(o--)a=f[o],!i&&g!==a.origType||n&&n.guid!==a.guid||s&&!s.test(a.namespace)||r&&r!==a.selector&&("**"!==r||!a.selector)||(f.splice(o,1),a.selector&&f.delegateCount--,p.remove&&p.remove.call(e,a));u&&!f.length&&(p.teardown&&p.teardown.call(e,h,m.handle)!==!1||b.removeEvent(e,d,m.handle),delete c[d])}else for(d in c)b.event.remove(e,d+t[l],n,r,!0);b.isEmptyObject(c)&&(delete m.handle,b._removeData(e,"events"))}},trigger:function(n,r,i,a){var s,u,l,c,p,f,d,h=[i||o],g=y.call(n,"type")?n.type:n,m=y.call(n,"namespace")?n.namespace.split("."):[];if(l=f=i=i||o,3!==i.nodeType&&8!==i.nodeType&&!nt.test(g+b.event.triggered)&&(g.indexOf(".")>=0&&(m=g.split("."),g=m.shift(),m.sort()),u=0>g.indexOf(":")&&"on"+g,n=n[b.expando]?n:new b.Event(g,"object"==typeof n&&n),n.isTrigger=!0,n.namespace=m.join("."),n.namespace_re=n.namespace?RegExp("(^|\\.)"+m.join("\\.(?:.*\\.|)")+"(\\.|$)"):null,n.result=t,n.target||(n.target=i),r=null==r?[n]:b.makeArray(r,[n]),p=b.event.special[g]||{},a||!p.trigger||p.trigger.apply(i,r)!==!1)){if(!a&&!p.noBubble&&!b.isWindow(i)){for(c=p.delegateType||g,nt.test(c+g)||(l=l.parentNode);l;l=l.parentNode)h.push(l),f=l;f===(i.ownerDocument||o)&&h.push(f.defaultView||f.parentWindow||e)}d=0;while((l=h[d++])&&!n.isPropagationStopped())n.type=d>1?c:p.bindType||g,s=(b._data(l,"events")||{})[n.type]&&b._data(l,"handle"),s&&s.apply(l,r),s=u&&l[u],s&&b.acceptData(l)&&s.apply&&s.apply(l,r)===!1&&n.preventDefault();if(n.type=g,!(a||n.isDefaultPrevented()||p._default&&p._default.apply(i.ownerDocument,r)!==!1||"click"===g&&b.nodeName(i,"a")||!b.acceptData(i)||!u||!i[g]||b.isWindow(i))){f=i[u],f&&(i[u]=null),b.event.triggered=g;try{i[g]()}catch(v){}b.event.triggered=t,f&&(i[u]=f)}return n.result}},dispatch:function(e){e=b.event.fix(e);var n,r,i,o,a,s=[],u=h.call(arguments),l=(b._data(this,"events")||{})[e.type]||[],c=b.event.special[e.type]||{};if(u[0]=e,e.delegateTarget=this,!c.preDispatch||c.preDispatch.call(this,e)!==!1){s=b.event.handlers.call(this,e,l),n=0;while((o=s[n++])&&!e.isPropagationStopped()){e.currentTarget=o.elem,a=0;while((i=o.handlers[a++])&&!e.isImmediatePropagationStopped())(!e.namespace_re||e.namespace_re.test(i.namespace))&&(e.handleObj=i,e.data=i.data,r=((b.event.special[i.origType]||{}).handle||i.handler).apply(o.elem,u),r!==t&&(e.result=r)===!1&&(e.preventDefault(),e.stopPropagation()))}return c.postDispatch&&c.postDispatch.call(this,e),e.result}},handlers:function(e,n){var r,i,o,a,s=[],u=n.delegateCount,l=e.target;if(u&&l.nodeType&&(!e.button||"click"!==e.type))for(;l!=this;l=l.parentNode||this)if(1===l.nodeType&&(l.disabled!==!0||"click"!==e.type)){for(o=[],a=0;u>a;a++)i=n[a],r=i.selector+" ",o[r]===t&&(o[r]=i.needsContext?b(r,this).index(l)>=0:b.find(r,this,null,[l]).length),o[r]&&o.push(i);o.length&&s.push({elem:l,handlers:o})}return n.length>u&&s.push({elem:this,handlers:n.slice(u)}),s},fix:function(e){if(e[b.expando])return e;var t,n,r,i=e.type,a=e,s=this.fixHooks[i];s||(this.fixHooks[i]=s=tt.test(i)?this.mouseHooks:et.test(i)?this.keyHooks:{}),r=s.props?this.props.concat(s.props):this.props,e=new b.Event(a),t=r.length;while(t--)n=r[t],e[n]=a[n];return e.target||(e.target=a.srcElement||o),3===e.target.nodeType&&(e.target=e.target.parentNode),e.metaKey=!!e.metaKey,s.filter?s.filter(e,a):e},props:"altKey bubbles cancelable ctrlKey currentTarget eventPhase metaKey relatedTarget shiftKey target timeStamp view which".split(" "),fixHooks:{},keyHooks:{props:"char charCode key keyCode".split(" "),filter:function(e,t){return null==e.which&&(e.which=null!=t.charCode?t.charCode:t.keyCode),e}},mouseHooks:{props:"button buttons clientX clientY fromElement offsetX offsetY pageX pageY screenX screenY toElement".split(" "),filter:function(e,n){var r,i,a,s=n.button,u=n.fromElement;return null==e.pageX&&null!=n.clientX&&(i=e.target.ownerDocument||o,a=i.documentElement,r=i.body,e.pageX=n.clientX+(a&&a.scrollLeft||r&&r.scrollLeft||0)-(a&&a.clientLeft||r&&r.clientLeft||0),e.pageY=n.clientY+(a&&a.scrollTop||r&&r.scrollTop||0)-(a&&a.clientTop||r&&r.clientTop||0)),!e.relatedTarget&&u&&(e.relatedTarget=u===e.target?n.toElement:u),e.which||s===t||(e.which=1&s?1:2&s?3:4&s?2:0),e}},special:{load:{noBubble:!0},click:{trigger:function(){return b.nodeName(this,"input")&&"checkbox"===this.type&&this.click?(this.click(),!1):t}},focus:{trigger:function(){if(this!==o.activeElement&&this.focus)try{return this.focus(),!1}catch(e){}},delegateType:"focusin"},blur:{trigger:function(){return this===o.activeElement&&this.blur?(this.blur(),!1):t},delegateType:"focusout"},beforeunload:{postDispatch:function(e){e.result!==t&&(e.originalEvent.returnValue=e.result)}}},simulate:function(e,t,n,r){var i=b.extend(new b.Event,n,{type:e,isSimulated:!0,originalEvent:{}});r?b.event.trigger(i,null,t):b.event.dispatch.call(t,i),i.isDefaultPrevented()&&n.preventDefault()}},b.removeEvent=o.removeEventListener?function(e,t,n){e.removeEventListener&&e.removeEventListener(t,n,!1)}:function(e,t,n){var r="on"+t;e.detachEvent&&(typeof e[r]===i&&(e[r]=null),e.detachEvent(r,n))},b.Event=function(e,n){return this instanceof b.Event?(e&&e.type?(this.originalEvent=e,this.type=e.type,this.isDefaultPrevented=e.defaultPrevented||e.returnValue===!1||e.getPreventDefault&&e.getPreventDefault()?it:ot):this.type=e,n&&b.extend(this,n),this.timeStamp=e&&e.timeStamp||b.now(),this[b.expando]=!0,t):new b.Event(e,n)},b.Event.prototype={isDefaultPrevented:ot,isPropagationStopped:ot,isImmediatePropagationStopped:ot,preventDefault:function(){var e=this.originalEvent;this.isDefaultPrevented=it,e&&(e.preventDefault?e.preventDefault():e.returnValue=!1)},stopPropagation:function(){var e=this.originalEvent;this.isPropagationStopped=it,e&&(e.stopPropagation&&e.stopPropagation(),e.cancelBubble=!0)},stopImmediatePropagation:function(){this.isImmediatePropagationStopped=it,this.stopPropagation()}},b.each({mouseenter:"mouseover",mouseleave:"mouseout"},function(e,t){b.event.special[e]={delegateType:t,bindType:t,handle:function(e){var n,r=this,i=e.relatedTarget,o=e.handleObj; +return(!i||i!==r&&!b.contains(r,i))&&(e.type=o.origType,n=o.handler.apply(this,arguments),e.type=t),n}}}),b.support.submitBubbles||(b.event.special.submit={setup:function(){return b.nodeName(this,"form")?!1:(b.event.add(this,"click._submit keypress._submit",function(e){var n=e.target,r=b.nodeName(n,"input")||b.nodeName(n,"button")?n.form:t;r&&!b._data(r,"submitBubbles")&&(b.event.add(r,"submit._submit",function(e){e._submit_bubble=!0}),b._data(r,"submitBubbles",!0))}),t)},postDispatch:function(e){e._submit_bubble&&(delete e._submit_bubble,this.parentNode&&!e.isTrigger&&b.event.simulate("submit",this.parentNode,e,!0))},teardown:function(){return b.nodeName(this,"form")?!1:(b.event.remove(this,"._submit"),t)}}),b.support.changeBubbles||(b.event.special.change={setup:function(){return Z.test(this.nodeName)?(("checkbox"===this.type||"radio"===this.type)&&(b.event.add(this,"propertychange._change",function(e){"checked"===e.originalEvent.propertyName&&(this._just_changed=!0)}),b.event.add(this,"click._change",function(e){this._just_changed&&!e.isTrigger&&(this._just_changed=!1),b.event.simulate("change",this,e,!0)})),!1):(b.event.add(this,"beforeactivate._change",function(e){var t=e.target;Z.test(t.nodeName)&&!b._data(t,"changeBubbles")&&(b.event.add(t,"change._change",function(e){!this.parentNode||e.isSimulated||e.isTrigger||b.event.simulate("change",this.parentNode,e,!0)}),b._data(t,"changeBubbles",!0))}),t)},handle:function(e){var n=e.target;return this!==n||e.isSimulated||e.isTrigger||"radio"!==n.type&&"checkbox"!==n.type?e.handleObj.handler.apply(this,arguments):t},teardown:function(){return b.event.remove(this,"._change"),!Z.test(this.nodeName)}}),b.support.focusinBubbles||b.each({focus:"focusin",blur:"focusout"},function(e,t){var n=0,r=function(e){b.event.simulate(t,e.target,b.event.fix(e),!0)};b.event.special[t]={setup:function(){0===n++&&o.addEventListener(e,r,!0)},teardown:function(){0===--n&&o.removeEventListener(e,r,!0)}}}),b.fn.extend({on:function(e,n,r,i,o){var a,s;if("object"==typeof e){"string"!=typeof n&&(r=r||n,n=t);for(a in e)this.on(a,n,r,e[a],o);return this}if(null==r&&null==i?(i=n,r=n=t):null==i&&("string"==typeof n?(i=r,r=t):(i=r,r=n,n=t)),i===!1)i=ot;else if(!i)return this;return 1===o&&(s=i,i=function(e){return b().off(e),s.apply(this,arguments)},i.guid=s.guid||(s.guid=b.guid++)),this.each(function(){b.event.add(this,e,i,r,n)})},one:function(e,t,n,r){return this.on(e,t,n,r,1)},off:function(e,n,r){var i,o;if(e&&e.preventDefault&&e.handleObj)return i=e.handleObj,b(e.delegateTarget).off(i.namespace?i.origType+"."+i.namespace:i.origType,i.selector,i.handler),this;if("object"==typeof e){for(o in e)this.off(o,n,e[o]);return this}return(n===!1||"function"==typeof n)&&(r=n,n=t),r===!1&&(r=ot),this.each(function(){b.event.remove(this,e,r,n)})},bind:function(e,t,n){return this.on(e,null,t,n)},unbind:function(e,t){return this.off(e,null,t)},delegate:function(e,t,n,r){return this.on(t,e,n,r)},undelegate:function(e,t,n){return 1===arguments.length?this.off(e,"**"):this.off(t,e||"**",n)},trigger:function(e,t){return this.each(function(){b.event.trigger(e,t,this)})},triggerHandler:function(e,n){var r=this[0];return r?b.event.trigger(e,n,r,!0):t}}),function(e,t){var n,r,i,o,a,s,u,l,c,p,f,d,h,g,m,y,v,x="sizzle"+-new Date,w=e.document,T={},N=0,C=0,k=it(),E=it(),S=it(),A=typeof t,j=1<<31,D=[],L=D.pop,H=D.push,q=D.slice,M=D.indexOf||function(e){var t=0,n=this.length;for(;n>t;t++)if(this[t]===e)return t;return-1},_="[\\x20\\t\\r\\n\\f]",F="(?:\\\\.|[\\w-]|[^\\x00-\\xa0])+",O=F.replace("w","w#"),B="([*^$|!~]?=)",P="\\["+_+"*("+F+")"+_+"*(?:"+B+_+"*(?:(['\"])((?:\\\\.|[^\\\\])*?)\\3|("+O+")|)|)"+_+"*\\]",R=":("+F+")(?:\\(((['\"])((?:\\\\.|[^\\\\])*?)\\3|((?:\\\\.|[^\\\\()[\\]]|"+P.replace(3,8)+")*)|.*)\\)|)",W=RegExp("^"+_+"+|((?:^|[^\\\\])(?:\\\\.)*)"+_+"+$","g"),$=RegExp("^"+_+"*,"+_+"*"),I=RegExp("^"+_+"*([\\x20\\t\\r\\n\\f>+~])"+_+"*"),z=RegExp(R),X=RegExp("^"+O+"$"),U={ID:RegExp("^#("+F+")"),CLASS:RegExp("^\\.("+F+")"),NAME:RegExp("^\\[name=['\"]?("+F+")['\"]?\\]"),TAG:RegExp("^("+F.replace("w","w*")+")"),ATTR:RegExp("^"+P),PSEUDO:RegExp("^"+R),CHILD:RegExp("^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\("+_+"*(even|odd|(([+-]|)(\\d*)n|)"+_+"*(?:([+-]|)"+_+"*(\\d+)|))"+_+"*\\)|)","i"),needsContext:RegExp("^"+_+"*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\("+_+"*((?:-\\d)?\\d*)"+_+"*\\)|)(?=[^-]|$)","i")},V=/[\x20\t\r\n\f]*[+~]/,Y=/^[^{]+\{\s*\[native code/,J=/^(?:#([\w-]+)|(\w+)|\.([\w-]+))$/,G=/^(?:input|select|textarea|button)$/i,Q=/^h\d$/i,K=/'|\\/g,Z=/\=[\x20\t\r\n\f]*([^'"\]]*)[\x20\t\r\n\f]*\]/g,et=/\\([\da-fA-F]{1,6}[\x20\t\r\n\f]?|.)/g,tt=function(e,t){var n="0x"+t-65536;return n!==n?t:0>n?String.fromCharCode(n+65536):String.fromCharCode(55296|n>>10,56320|1023&n)};try{q.call(w.documentElement.childNodes,0)[0].nodeType}catch(nt){q=function(e){var t,n=[];while(t=this[e++])n.push(t);return n}}function rt(e){return Y.test(e+"")}function it(){var e,t=[];return e=function(n,r){return t.push(n+=" ")>i.cacheLength&&delete e[t.shift()],e[n]=r}}function ot(e){return e[x]=!0,e}function at(e){var t=p.createElement("div");try{return e(t)}catch(n){return!1}finally{t=null}}function st(e,t,n,r){var i,o,a,s,u,l,f,g,m,v;if((t?t.ownerDocument||t:w)!==p&&c(t),t=t||p,n=n||[],!e||"string"!=typeof e)return n;if(1!==(s=t.nodeType)&&9!==s)return[];if(!d&&!r){if(i=J.exec(e))if(a=i[1]){if(9===s){if(o=t.getElementById(a),!o||!o.parentNode)return n;if(o.id===a)return n.push(o),n}else if(t.ownerDocument&&(o=t.ownerDocument.getElementById(a))&&y(t,o)&&o.id===a)return n.push(o),n}else{if(i[2])return H.apply(n,q.call(t.getElementsByTagName(e),0)),n;if((a=i[3])&&T.getByClassName&&t.getElementsByClassName)return H.apply(n,q.call(t.getElementsByClassName(a),0)),n}if(T.qsa&&!h.test(e)){if(f=!0,g=x,m=t,v=9===s&&e,1===s&&"object"!==t.nodeName.toLowerCase()){l=ft(e),(f=t.getAttribute("id"))?g=f.replace(K,"\\$&"):t.setAttribute("id",g),g="[id='"+g+"'] ",u=l.length;while(u--)l[u]=g+dt(l[u]);m=V.test(e)&&t.parentNode||t,v=l.join(",")}if(v)try{return H.apply(n,q.call(m.querySelectorAll(v),0)),n}catch(b){}finally{f||t.removeAttribute("id")}}}return wt(e.replace(W,"$1"),t,n,r)}a=st.isXML=function(e){var t=e&&(e.ownerDocument||e).documentElement;return t?"HTML"!==t.nodeName:!1},c=st.setDocument=function(e){var n=e?e.ownerDocument||e:w;return n!==p&&9===n.nodeType&&n.documentElement?(p=n,f=n.documentElement,d=a(n),T.tagNameNoComments=at(function(e){return e.appendChild(n.createComment("")),!e.getElementsByTagName("*").length}),T.attributes=at(function(e){e.innerHTML="";var t=typeof e.lastChild.getAttribute("multiple");return"boolean"!==t&&"string"!==t}),T.getByClassName=at(function(e){return e.innerHTML="",e.getElementsByClassName&&e.getElementsByClassName("e").length?(e.lastChild.className="e",2===e.getElementsByClassName("e").length):!1}),T.getByName=at(function(e){e.id=x+0,e.innerHTML="
      ",f.insertBefore(e,f.firstChild);var t=n.getElementsByName&&n.getElementsByName(x).length===2+n.getElementsByName(x+0).length;return T.getIdNotName=!n.getElementById(x),f.removeChild(e),t}),i.attrHandle=at(function(e){return e.innerHTML="",e.firstChild&&typeof e.firstChild.getAttribute!==A&&"#"===e.firstChild.getAttribute("href")})?{}:{href:function(e){return e.getAttribute("href",2)},type:function(e){return e.getAttribute("type")}},T.getIdNotName?(i.find.ID=function(e,t){if(typeof t.getElementById!==A&&!d){var n=t.getElementById(e);return n&&n.parentNode?[n]:[]}},i.filter.ID=function(e){var t=e.replace(et,tt);return function(e){return e.getAttribute("id")===t}}):(i.find.ID=function(e,n){if(typeof n.getElementById!==A&&!d){var r=n.getElementById(e);return r?r.id===e||typeof r.getAttributeNode!==A&&r.getAttributeNode("id").value===e?[r]:t:[]}},i.filter.ID=function(e){var t=e.replace(et,tt);return function(e){var n=typeof e.getAttributeNode!==A&&e.getAttributeNode("id");return n&&n.value===t}}),i.find.TAG=T.tagNameNoComments?function(e,n){return typeof n.getElementsByTagName!==A?n.getElementsByTagName(e):t}:function(e,t){var n,r=[],i=0,o=t.getElementsByTagName(e);if("*"===e){while(n=o[i++])1===n.nodeType&&r.push(n);return r}return o},i.find.NAME=T.getByName&&function(e,n){return typeof n.getElementsByName!==A?n.getElementsByName(name):t},i.find.CLASS=T.getByClassName&&function(e,n){return typeof n.getElementsByClassName===A||d?t:n.getElementsByClassName(e)},g=[],h=[":focus"],(T.qsa=rt(n.querySelectorAll))&&(at(function(e){e.innerHTML="",e.querySelectorAll("[selected]").length||h.push("\\["+_+"*(?:checked|disabled|ismap|multiple|readonly|selected|value)"),e.querySelectorAll(":checked").length||h.push(":checked")}),at(function(e){e.innerHTML="",e.querySelectorAll("[i^='']").length&&h.push("[*^$]="+_+"*(?:\"\"|'')"),e.querySelectorAll(":enabled").length||h.push(":enabled",":disabled"),e.querySelectorAll("*,:x"),h.push(",.*:")})),(T.matchesSelector=rt(m=f.matchesSelector||f.mozMatchesSelector||f.webkitMatchesSelector||f.oMatchesSelector||f.msMatchesSelector))&&at(function(e){T.disconnectedMatch=m.call(e,"div"),m.call(e,"[s!='']:x"),g.push("!=",R)}),h=RegExp(h.join("|")),g=RegExp(g.join("|")),y=rt(f.contains)||f.compareDocumentPosition?function(e,t){var n=9===e.nodeType?e.documentElement:e,r=t&&t.parentNode;return e===r||!(!r||1!==r.nodeType||!(n.contains?n.contains(r):e.compareDocumentPosition&&16&e.compareDocumentPosition(r)))}:function(e,t){if(t)while(t=t.parentNode)if(t===e)return!0;return!1},v=f.compareDocumentPosition?function(e,t){var r;return e===t?(u=!0,0):(r=t.compareDocumentPosition&&e.compareDocumentPosition&&e.compareDocumentPosition(t))?1&r||e.parentNode&&11===e.parentNode.nodeType?e===n||y(w,e)?-1:t===n||y(w,t)?1:0:4&r?-1:1:e.compareDocumentPosition?-1:1}:function(e,t){var r,i=0,o=e.parentNode,a=t.parentNode,s=[e],l=[t];if(e===t)return u=!0,0;if(!o||!a)return e===n?-1:t===n?1:o?-1:a?1:0;if(o===a)return ut(e,t);r=e;while(r=r.parentNode)s.unshift(r);r=t;while(r=r.parentNode)l.unshift(r);while(s[i]===l[i])i++;return i?ut(s[i],l[i]):s[i]===w?-1:l[i]===w?1:0},u=!1,[0,0].sort(v),T.detectDuplicates=u,p):p},st.matches=function(e,t){return st(e,null,null,t)},st.matchesSelector=function(e,t){if((e.ownerDocument||e)!==p&&c(e),t=t.replace(Z,"='$1']"),!(!T.matchesSelector||d||g&&g.test(t)||h.test(t)))try{var n=m.call(e,t);if(n||T.disconnectedMatch||e.document&&11!==e.document.nodeType)return n}catch(r){}return st(t,p,null,[e]).length>0},st.contains=function(e,t){return(e.ownerDocument||e)!==p&&c(e),y(e,t)},st.attr=function(e,t){var n;return(e.ownerDocument||e)!==p&&c(e),d||(t=t.toLowerCase()),(n=i.attrHandle[t])?n(e):d||T.attributes?e.getAttribute(t):((n=e.getAttributeNode(t))||e.getAttribute(t))&&e[t]===!0?t:n&&n.specified?n.value:null},st.error=function(e){throw Error("Syntax error, unrecognized expression: "+e)},st.uniqueSort=function(e){var t,n=[],r=1,i=0;if(u=!T.detectDuplicates,e.sort(v),u){for(;t=e[r];r++)t===e[r-1]&&(i=n.push(r));while(i--)e.splice(n[i],1)}return e};function ut(e,t){var n=t&&e,r=n&&(~t.sourceIndex||j)-(~e.sourceIndex||j);if(r)return r;if(n)while(n=n.nextSibling)if(n===t)return-1;return e?1:-1}function lt(e){return function(t){var n=t.nodeName.toLowerCase();return"input"===n&&t.type===e}}function ct(e){return function(t){var n=t.nodeName.toLowerCase();return("input"===n||"button"===n)&&t.type===e}}function pt(e){return ot(function(t){return t=+t,ot(function(n,r){var i,o=e([],n.length,t),a=o.length;while(a--)n[i=o[a]]&&(n[i]=!(r[i]=n[i]))})})}o=st.getText=function(e){var t,n="",r=0,i=e.nodeType;if(i){if(1===i||9===i||11===i){if("string"==typeof e.textContent)return e.textContent;for(e=e.firstChild;e;e=e.nextSibling)n+=o(e)}else if(3===i||4===i)return e.nodeValue}else for(;t=e[r];r++)n+=o(t);return n},i=st.selectors={cacheLength:50,createPseudo:ot,match:U,find:{},relative:{">":{dir:"parentNode",first:!0}," ":{dir:"parentNode"},"+":{dir:"previousSibling",first:!0},"~":{dir:"previousSibling"}},preFilter:{ATTR:function(e){return e[1]=e[1].replace(et,tt),e[3]=(e[4]||e[5]||"").replace(et,tt),"~="===e[2]&&(e[3]=" "+e[3]+" "),e.slice(0,4)},CHILD:function(e){return e[1]=e[1].toLowerCase(),"nth"===e[1].slice(0,3)?(e[3]||st.error(e[0]),e[4]=+(e[4]?e[5]+(e[6]||1):2*("even"===e[3]||"odd"===e[3])),e[5]=+(e[7]+e[8]||"odd"===e[3])):e[3]&&st.error(e[0]),e},PSEUDO:function(e){var t,n=!e[5]&&e[2];return U.CHILD.test(e[0])?null:(e[4]?e[2]=e[4]:n&&z.test(n)&&(t=ft(n,!0))&&(t=n.indexOf(")",n.length-t)-n.length)&&(e[0]=e[0].slice(0,t),e[2]=n.slice(0,t)),e.slice(0,3))}},filter:{TAG:function(e){return"*"===e?function(){return!0}:(e=e.replace(et,tt).toLowerCase(),function(t){return t.nodeName&&t.nodeName.toLowerCase()===e})},CLASS:function(e){var t=k[e+" "];return t||(t=RegExp("(^|"+_+")"+e+"("+_+"|$)"))&&k(e,function(e){return t.test(e.className||typeof e.getAttribute!==A&&e.getAttribute("class")||"")})},ATTR:function(e,t,n){return function(r){var i=st.attr(r,e);return null==i?"!="===t:t?(i+="","="===t?i===n:"!="===t?i!==n:"^="===t?n&&0===i.indexOf(n):"*="===t?n&&i.indexOf(n)>-1:"$="===t?n&&i.slice(-n.length)===n:"~="===t?(" "+i+" ").indexOf(n)>-1:"|="===t?i===n||i.slice(0,n.length+1)===n+"-":!1):!0}},CHILD:function(e,t,n,r,i){var o="nth"!==e.slice(0,3),a="last"!==e.slice(-4),s="of-type"===t;return 1===r&&0===i?function(e){return!!e.parentNode}:function(t,n,u){var l,c,p,f,d,h,g=o!==a?"nextSibling":"previousSibling",m=t.parentNode,y=s&&t.nodeName.toLowerCase(),v=!u&&!s;if(m){if(o){while(g){p=t;while(p=p[g])if(s?p.nodeName.toLowerCase()===y:1===p.nodeType)return!1;h=g="only"===e&&!h&&"nextSibling"}return!0}if(h=[a?m.firstChild:m.lastChild],a&&v){c=m[x]||(m[x]={}),l=c[e]||[],d=l[0]===N&&l[1],f=l[0]===N&&l[2],p=d&&m.childNodes[d];while(p=++d&&p&&p[g]||(f=d=0)||h.pop())if(1===p.nodeType&&++f&&p===t){c[e]=[N,d,f];break}}else if(v&&(l=(t[x]||(t[x]={}))[e])&&l[0]===N)f=l[1];else while(p=++d&&p&&p[g]||(f=d=0)||h.pop())if((s?p.nodeName.toLowerCase()===y:1===p.nodeType)&&++f&&(v&&((p[x]||(p[x]={}))[e]=[N,f]),p===t))break;return f-=i,f===r||0===f%r&&f/r>=0}}},PSEUDO:function(e,t){var n,r=i.pseudos[e]||i.setFilters[e.toLowerCase()]||st.error("unsupported pseudo: "+e);return r[x]?r(t):r.length>1?(n=[e,e,"",t],i.setFilters.hasOwnProperty(e.toLowerCase())?ot(function(e,n){var i,o=r(e,t),a=o.length;while(a--)i=M.call(e,o[a]),e[i]=!(n[i]=o[a])}):function(e){return r(e,0,n)}):r}},pseudos:{not:ot(function(e){var t=[],n=[],r=s(e.replace(W,"$1"));return r[x]?ot(function(e,t,n,i){var o,a=r(e,null,i,[]),s=e.length;while(s--)(o=a[s])&&(e[s]=!(t[s]=o))}):function(e,i,o){return t[0]=e,r(t,null,o,n),!n.pop()}}),has:ot(function(e){return function(t){return st(e,t).length>0}}),contains:ot(function(e){return function(t){return(t.textContent||t.innerText||o(t)).indexOf(e)>-1}}),lang:ot(function(e){return X.test(e||"")||st.error("unsupported lang: "+e),e=e.replace(et,tt).toLowerCase(),function(t){var n;do if(n=d?t.getAttribute("xml:lang")||t.getAttribute("lang"):t.lang)return n=n.toLowerCase(),n===e||0===n.indexOf(e+"-");while((t=t.parentNode)&&1===t.nodeType);return!1}}),target:function(t){var n=e.location&&e.location.hash;return n&&n.slice(1)===t.id},root:function(e){return e===f},focus:function(e){return e===p.activeElement&&(!p.hasFocus||p.hasFocus())&&!!(e.type||e.href||~e.tabIndex)},enabled:function(e){return e.disabled===!1},disabled:function(e){return e.disabled===!0},checked:function(e){var t=e.nodeName.toLowerCase();return"input"===t&&!!e.checked||"option"===t&&!!e.selected},selected:function(e){return e.parentNode&&e.parentNode.selectedIndex,e.selected===!0},empty:function(e){for(e=e.firstChild;e;e=e.nextSibling)if(e.nodeName>"@"||3===e.nodeType||4===e.nodeType)return!1;return!0},parent:function(e){return!i.pseudos.empty(e)},header:function(e){return Q.test(e.nodeName)},input:function(e){return G.test(e.nodeName)},button:function(e){var t=e.nodeName.toLowerCase();return"input"===t&&"button"===e.type||"button"===t},text:function(e){var t;return"input"===e.nodeName.toLowerCase()&&"text"===e.type&&(null==(t=e.getAttribute("type"))||t.toLowerCase()===e.type)},first:pt(function(){return[0]}),last:pt(function(e,t){return[t-1]}),eq:pt(function(e,t,n){return[0>n?n+t:n]}),even:pt(function(e,t){var n=0;for(;t>n;n+=2)e.push(n);return e}),odd:pt(function(e,t){var n=1;for(;t>n;n+=2)e.push(n);return e}),lt:pt(function(e,t,n){var r=0>n?n+t:n;for(;--r>=0;)e.push(r);return e}),gt:pt(function(e,t,n){var r=0>n?n+t:n;for(;t>++r;)e.push(r);return e})}};for(n in{radio:!0,checkbox:!0,file:!0,password:!0,image:!0})i.pseudos[n]=lt(n);for(n in{submit:!0,reset:!0})i.pseudos[n]=ct(n);function ft(e,t){var n,r,o,a,s,u,l,c=E[e+" "];if(c)return t?0:c.slice(0);s=e,u=[],l=i.preFilter;while(s){(!n||(r=$.exec(s)))&&(r&&(s=s.slice(r[0].length)||s),u.push(o=[])),n=!1,(r=I.exec(s))&&(n=r.shift(),o.push({value:n,type:r[0].replace(W," ")}),s=s.slice(n.length));for(a in i.filter)!(r=U[a].exec(s))||l[a]&&!(r=l[a](r))||(n=r.shift(),o.push({value:n,type:a,matches:r}),s=s.slice(n.length));if(!n)break}return t?s.length:s?st.error(e):E(e,u).slice(0)}function dt(e){var t=0,n=e.length,r="";for(;n>t;t++)r+=e[t].value;return r}function ht(e,t,n){var i=t.dir,o=n&&"parentNode"===i,a=C++;return t.first?function(t,n,r){while(t=t[i])if(1===t.nodeType||o)return e(t,n,r)}:function(t,n,s){var u,l,c,p=N+" "+a;if(s){while(t=t[i])if((1===t.nodeType||o)&&e(t,n,s))return!0}else while(t=t[i])if(1===t.nodeType||o)if(c=t[x]||(t[x]={}),(l=c[i])&&l[0]===p){if((u=l[1])===!0||u===r)return u===!0}else if(l=c[i]=[p],l[1]=e(t,n,s)||r,l[1]===!0)return!0}}function gt(e){return e.length>1?function(t,n,r){var i=e.length;while(i--)if(!e[i](t,n,r))return!1;return!0}:e[0]}function mt(e,t,n,r,i){var o,a=[],s=0,u=e.length,l=null!=t;for(;u>s;s++)(o=e[s])&&(!n||n(o,r,i))&&(a.push(o),l&&t.push(s));return a}function yt(e,t,n,r,i,o){return r&&!r[x]&&(r=yt(r)),i&&!i[x]&&(i=yt(i,o)),ot(function(o,a,s,u){var l,c,p,f=[],d=[],h=a.length,g=o||xt(t||"*",s.nodeType?[s]:s,[]),m=!e||!o&&t?g:mt(g,f,e,s,u),y=n?i||(o?e:h||r)?[]:a:m;if(n&&n(m,y,s,u),r){l=mt(y,d),r(l,[],s,u),c=l.length;while(c--)(p=l[c])&&(y[d[c]]=!(m[d[c]]=p))}if(o){if(i||e){if(i){l=[],c=y.length;while(c--)(p=y[c])&&l.push(m[c]=p);i(null,y=[],l,u)}c=y.length;while(c--)(p=y[c])&&(l=i?M.call(o,p):f[c])>-1&&(o[l]=!(a[l]=p))}}else y=mt(y===a?y.splice(h,y.length):y),i?i(null,a,y,u):H.apply(a,y)})}function vt(e){var t,n,r,o=e.length,a=i.relative[e[0].type],s=a||i.relative[" "],u=a?1:0,c=ht(function(e){return e===t},s,!0),p=ht(function(e){return M.call(t,e)>-1},s,!0),f=[function(e,n,r){return!a&&(r||n!==l)||((t=n).nodeType?c(e,n,r):p(e,n,r))}];for(;o>u;u++)if(n=i.relative[e[u].type])f=[ht(gt(f),n)];else{if(n=i.filter[e[u].type].apply(null,e[u].matches),n[x]){for(r=++u;o>r;r++)if(i.relative[e[r].type])break;return yt(u>1&>(f),u>1&&dt(e.slice(0,u-1)).replace(W,"$1"),n,r>u&&vt(e.slice(u,r)),o>r&&vt(e=e.slice(r)),o>r&&dt(e))}f.push(n)}return gt(f)}function bt(e,t){var n=0,o=t.length>0,a=e.length>0,s=function(s,u,c,f,d){var h,g,m,y=[],v=0,b="0",x=s&&[],w=null!=d,T=l,C=s||a&&i.find.TAG("*",d&&u.parentNode||u),k=N+=null==T?1:Math.random()||.1;for(w&&(l=u!==p&&u,r=n);null!=(h=C[b]);b++){if(a&&h){g=0;while(m=e[g++])if(m(h,u,c)){f.push(h);break}w&&(N=k,r=++n)}o&&((h=!m&&h)&&v--,s&&x.push(h))}if(v+=b,o&&b!==v){g=0;while(m=t[g++])m(x,y,u,c);if(s){if(v>0)while(b--)x[b]||y[b]||(y[b]=L.call(f));y=mt(y)}H.apply(f,y),w&&!s&&y.length>0&&v+t.length>1&&st.uniqueSort(f)}return w&&(N=k,l=T),x};return o?ot(s):s}s=st.compile=function(e,t){var n,r=[],i=[],o=S[e+" "];if(!o){t||(t=ft(e)),n=t.length;while(n--)o=vt(t[n]),o[x]?r.push(o):i.push(o);o=S(e,bt(i,r))}return o};function xt(e,t,n){var r=0,i=t.length;for(;i>r;r++)st(e,t[r],n);return n}function wt(e,t,n,r){var o,a,u,l,c,p=ft(e);if(!r&&1===p.length){if(a=p[0]=p[0].slice(0),a.length>2&&"ID"===(u=a[0]).type&&9===t.nodeType&&!d&&i.relative[a[1].type]){if(t=i.find.ID(u.matches[0].replace(et,tt),t)[0],!t)return n;e=e.slice(a.shift().value.length)}o=U.needsContext.test(e)?0:a.length;while(o--){if(u=a[o],i.relative[l=u.type])break;if((c=i.find[l])&&(r=c(u.matches[0].replace(et,tt),V.test(a[0].type)&&t.parentNode||t))){if(a.splice(o,1),e=r.length&&dt(a),!e)return H.apply(n,q.call(r,0)),n;break}}}return s(e,p)(r,t,d,n,V.test(e)),n}i.pseudos.nth=i.pseudos.eq;function Tt(){}i.filters=Tt.prototype=i.pseudos,i.setFilters=new Tt,c(),st.attr=b.attr,b.find=st,b.expr=st.selectors,b.expr[":"]=b.expr.pseudos,b.unique=st.uniqueSort,b.text=st.getText,b.isXMLDoc=st.isXML,b.contains=st.contains}(e);var at=/Until$/,st=/^(?:parents|prev(?:Until|All))/,ut=/^.[^:#\[\.,]*$/,lt=b.expr.match.needsContext,ct={children:!0,contents:!0,next:!0,prev:!0};b.fn.extend({find:function(e){var t,n,r,i=this.length;if("string"!=typeof e)return r=this,this.pushStack(b(e).filter(function(){for(t=0;i>t;t++)if(b.contains(r[t],this))return!0}));for(n=[],t=0;i>t;t++)b.find(e,this[t],n);return n=this.pushStack(i>1?b.unique(n):n),n.selector=(this.selector?this.selector+" ":"")+e,n},has:function(e){var t,n=b(e,this),r=n.length;return this.filter(function(){for(t=0;r>t;t++)if(b.contains(this,n[t]))return!0})},not:function(e){return this.pushStack(ft(this,e,!1))},filter:function(e){return this.pushStack(ft(this,e,!0))},is:function(e){return!!e&&("string"==typeof e?lt.test(e)?b(e,this.context).index(this[0])>=0:b.filter(e,this).length>0:this.filter(e).length>0)},closest:function(e,t){var n,r=0,i=this.length,o=[],a=lt.test(e)||"string"!=typeof e?b(e,t||this.context):0;for(;i>r;r++){n=this[r];while(n&&n.ownerDocument&&n!==t&&11!==n.nodeType){if(a?a.index(n)>-1:b.find.matchesSelector(n,e)){o.push(n);break}n=n.parentNode}}return this.pushStack(o.length>1?b.unique(o):o)},index:function(e){return e?"string"==typeof e?b.inArray(this[0],b(e)):b.inArray(e.jquery?e[0]:e,this):this[0]&&this[0].parentNode?this.first().prevAll().length:-1},add:function(e,t){var n="string"==typeof e?b(e,t):b.makeArray(e&&e.nodeType?[e]:e),r=b.merge(this.get(),n);return this.pushStack(b.unique(r))},addBack:function(e){return this.add(null==e?this.prevObject:this.prevObject.filter(e))}}),b.fn.andSelf=b.fn.addBack;function pt(e,t){do e=e[t];while(e&&1!==e.nodeType);return e}b.each({parent:function(e){var t=e.parentNode;return t&&11!==t.nodeType?t:null},parents:function(e){return b.dir(e,"parentNode")},parentsUntil:function(e,t,n){return b.dir(e,"parentNode",n)},next:function(e){return pt(e,"nextSibling")},prev:function(e){return pt(e,"previousSibling")},nextAll:function(e){return b.dir(e,"nextSibling")},prevAll:function(e){return b.dir(e,"previousSibling")},nextUntil:function(e,t,n){return b.dir(e,"nextSibling",n)},prevUntil:function(e,t,n){return b.dir(e,"previousSibling",n)},siblings:function(e){return b.sibling((e.parentNode||{}).firstChild,e)},children:function(e){return b.sibling(e.firstChild)},contents:function(e){return b.nodeName(e,"iframe")?e.contentDocument||e.contentWindow.document:b.merge([],e.childNodes)}},function(e,t){b.fn[e]=function(n,r){var i=b.map(this,t,n);return at.test(e)||(r=n),r&&"string"==typeof r&&(i=b.filter(r,i)),i=this.length>1&&!ct[e]?b.unique(i):i,this.length>1&&st.test(e)&&(i=i.reverse()),this.pushStack(i)}}),b.extend({filter:function(e,t,n){return n&&(e=":not("+e+")"),1===t.length?b.find.matchesSelector(t[0],e)?[t[0]]:[]:b.find.matches(e,t)},dir:function(e,n,r){var i=[],o=e[n];while(o&&9!==o.nodeType&&(r===t||1!==o.nodeType||!b(o).is(r)))1===o.nodeType&&i.push(o),o=o[n];return i},sibling:function(e,t){var n=[];for(;e;e=e.nextSibling)1===e.nodeType&&e!==t&&n.push(e);return n}});function ft(e,t,n){if(t=t||0,b.isFunction(t))return b.grep(e,function(e,r){var i=!!t.call(e,r,e);return i===n});if(t.nodeType)return b.grep(e,function(e){return e===t===n});if("string"==typeof t){var r=b.grep(e,function(e){return 1===e.nodeType});if(ut.test(t))return b.filter(t,r,!n);t=b.filter(t,r)}return b.grep(e,function(e){return b.inArray(e,t)>=0===n})}function dt(e){var t=ht.split("|"),n=e.createDocumentFragment();if(n.createElement)while(t.length)n.createElement(t.pop());return n}var ht="abbr|article|aside|audio|bdi|canvas|data|datalist|details|figcaption|figure|footer|header|hgroup|mark|meter|nav|output|progress|section|summary|time|video",gt=/ jQuery\d+="(?:null|\d+)"/g,mt=RegExp("<(?:"+ht+")[\\s/>]","i"),yt=/^\s+/,vt=/<(?!area|br|col|embed|hr|img|input|link|meta|param)(([\w:]+)[^>]*)\/>/gi,bt=/<([\w:]+)/,xt=/\s*$/g,At={option:[1,""],legend:[1,"
      ","
      "],area:[1,"",""],param:[1,"",""],thead:[1,"","
      "],tr:[2,"","
      "],col:[2,"","
      "],td:[3,"","
      "],_default:b.support.htmlSerialize?[0,"",""]:[1,"X
      ","
      "]},jt=dt(o),Dt=jt.appendChild(o.createElement("div"));At.optgroup=At.option,At.tbody=At.tfoot=At.colgroup=At.caption=At.thead,At.th=At.td,b.fn.extend({text:function(e){return b.access(this,function(e){return e===t?b.text(this):this.empty().append((this[0]&&this[0].ownerDocument||o).createTextNode(e))},null,e,arguments.length)},wrapAll:function(e){if(b.isFunction(e))return this.each(function(t){b(this).wrapAll(e.call(this,t))});if(this[0]){var t=b(e,this[0].ownerDocument).eq(0).clone(!0);this[0].parentNode&&t.insertBefore(this[0]),t.map(function(){var e=this;while(e.firstChild&&1===e.firstChild.nodeType)e=e.firstChild;return e}).append(this)}return this},wrapInner:function(e){return b.isFunction(e)?this.each(function(t){b(this).wrapInner(e.call(this,t))}):this.each(function(){var t=b(this),n=t.contents();n.length?n.wrapAll(e):t.append(e)})},wrap:function(e){var t=b.isFunction(e);return this.each(function(n){b(this).wrapAll(t?e.call(this,n):e)})},unwrap:function(){return this.parent().each(function(){b.nodeName(this,"body")||b(this).replaceWith(this.childNodes)}).end()},append:function(){return this.domManip(arguments,!0,function(e){(1===this.nodeType||11===this.nodeType||9===this.nodeType)&&this.appendChild(e)})},prepend:function(){return this.domManip(arguments,!0,function(e){(1===this.nodeType||11===this.nodeType||9===this.nodeType)&&this.insertBefore(e,this.firstChild)})},before:function(){return this.domManip(arguments,!1,function(e){this.parentNode&&this.parentNode.insertBefore(e,this)})},after:function(){return this.domManip(arguments,!1,function(e){this.parentNode&&this.parentNode.insertBefore(e,this.nextSibling)})},remove:function(e,t){var n,r=0;for(;null!=(n=this[r]);r++)(!e||b.filter(e,[n]).length>0)&&(t||1!==n.nodeType||b.cleanData(Ot(n)),n.parentNode&&(t&&b.contains(n.ownerDocument,n)&&Mt(Ot(n,"script")),n.parentNode.removeChild(n)));return this},empty:function(){var e,t=0;for(;null!=(e=this[t]);t++){1===e.nodeType&&b.cleanData(Ot(e,!1));while(e.firstChild)e.removeChild(e.firstChild);e.options&&b.nodeName(e,"select")&&(e.options.length=0)}return this},clone:function(e,t){return e=null==e?!1:e,t=null==t?e:t,this.map(function(){return b.clone(this,e,t)})},html:function(e){return b.access(this,function(e){var n=this[0]||{},r=0,i=this.length;if(e===t)return 1===n.nodeType?n.innerHTML.replace(gt,""):t;if(!("string"!=typeof e||Tt.test(e)||!b.support.htmlSerialize&&mt.test(e)||!b.support.leadingWhitespace&&yt.test(e)||At[(bt.exec(e)||["",""])[1].toLowerCase()])){e=e.replace(vt,"<$1>");try{for(;i>r;r++)n=this[r]||{},1===n.nodeType&&(b.cleanData(Ot(n,!1)),n.innerHTML=e);n=0}catch(o){}}n&&this.empty().append(e)},null,e,arguments.length)},replaceWith:function(e){var t=b.isFunction(e);return t||"string"==typeof e||(e=b(e).not(this).detach()),this.domManip([e],!0,function(e){var t=this.nextSibling,n=this.parentNode;n&&(b(this).remove(),n.insertBefore(e,t))})},detach:function(e){return this.remove(e,!0)},domManip:function(e,n,r){e=f.apply([],e);var i,o,a,s,u,l,c=0,p=this.length,d=this,h=p-1,g=e[0],m=b.isFunction(g);if(m||!(1>=p||"string"!=typeof g||b.support.checkClone)&&Ct.test(g))return this.each(function(i){var o=d.eq(i);m&&(e[0]=g.call(this,i,n?o.html():t)),o.domManip(e,n,r)});if(p&&(l=b.buildFragment(e,this[0].ownerDocument,!1,this),i=l.firstChild,1===l.childNodes.length&&(l=i),i)){for(n=n&&b.nodeName(i,"tr"),s=b.map(Ot(l,"script"),Ht),a=s.length;p>c;c++)o=l,c!==h&&(o=b.clone(o,!0,!0),a&&b.merge(s,Ot(o,"script"))),r.call(n&&b.nodeName(this[c],"table")?Lt(this[c],"tbody"):this[c],o,c);if(a)for(u=s[s.length-1].ownerDocument,b.map(s,qt),c=0;a>c;c++)o=s[c],kt.test(o.type||"")&&!b._data(o,"globalEval")&&b.contains(u,o)&&(o.src?b.ajax({url:o.src,type:"GET",dataType:"script",async:!1,global:!1,"throws":!0}):b.globalEval((o.text||o.textContent||o.innerHTML||"").replace(St,"")));l=i=null}return this}});function Lt(e,t){return e.getElementsByTagName(t)[0]||e.appendChild(e.ownerDocument.createElement(t))}function Ht(e){var t=e.getAttributeNode("type");return e.type=(t&&t.specified)+"/"+e.type,e}function qt(e){var t=Et.exec(e.type);return t?e.type=t[1]:e.removeAttribute("type"),e}function Mt(e,t){var n,r=0;for(;null!=(n=e[r]);r++)b._data(n,"globalEval",!t||b._data(t[r],"globalEval"))}function _t(e,t){if(1===t.nodeType&&b.hasData(e)){var n,r,i,o=b._data(e),a=b._data(t,o),s=o.events;if(s){delete a.handle,a.events={};for(n in s)for(r=0,i=s[n].length;i>r;r++)b.event.add(t,n,s[n][r])}a.data&&(a.data=b.extend({},a.data))}}function Ft(e,t){var n,r,i;if(1===t.nodeType){if(n=t.nodeName.toLowerCase(),!b.support.noCloneEvent&&t[b.expando]){i=b._data(t);for(r in i.events)b.removeEvent(t,r,i.handle);t.removeAttribute(b.expando)}"script"===n&&t.text!==e.text?(Ht(t).text=e.text,qt(t)):"object"===n?(t.parentNode&&(t.outerHTML=e.outerHTML),b.support.html5Clone&&e.innerHTML&&!b.trim(t.innerHTML)&&(t.innerHTML=e.innerHTML)):"input"===n&&Nt.test(e.type)?(t.defaultChecked=t.checked=e.checked,t.value!==e.value&&(t.value=e.value)):"option"===n?t.defaultSelected=t.selected=e.defaultSelected:("input"===n||"textarea"===n)&&(t.defaultValue=e.defaultValue)}}b.each({appendTo:"append",prependTo:"prepend",insertBefore:"before",insertAfter:"after",replaceAll:"replaceWith"},function(e,t){b.fn[e]=function(e){var n,r=0,i=[],o=b(e),a=o.length-1;for(;a>=r;r++)n=r===a?this:this.clone(!0),b(o[r])[t](n),d.apply(i,n.get());return this.pushStack(i)}});function Ot(e,n){var r,o,a=0,s=typeof e.getElementsByTagName!==i?e.getElementsByTagName(n||"*"):typeof e.querySelectorAll!==i?e.querySelectorAll(n||"*"):t;if(!s)for(s=[],r=e.childNodes||e;null!=(o=r[a]);a++)!n||b.nodeName(o,n)?s.push(o):b.merge(s,Ot(o,n));return n===t||n&&b.nodeName(e,n)?b.merge([e],s):s}function Bt(e){Nt.test(e.type)&&(e.defaultChecked=e.checked)}b.extend({clone:function(e,t,n){var r,i,o,a,s,u=b.contains(e.ownerDocument,e);if(b.support.html5Clone||b.isXMLDoc(e)||!mt.test("<"+e.nodeName+">")?o=e.cloneNode(!0):(Dt.innerHTML=e.outerHTML,Dt.removeChild(o=Dt.firstChild)),!(b.support.noCloneEvent&&b.support.noCloneChecked||1!==e.nodeType&&11!==e.nodeType||b.isXMLDoc(e)))for(r=Ot(o),s=Ot(e),a=0;null!=(i=s[a]);++a)r[a]&&Ft(i,r[a]);if(t)if(n)for(s=s||Ot(e),r=r||Ot(o),a=0;null!=(i=s[a]);a++)_t(i,r[a]);else _t(e,o);return r=Ot(o,"script"),r.length>0&&Mt(r,!u&&Ot(e,"script")),r=s=i=null,o},buildFragment:function(e,t,n,r){var i,o,a,s,u,l,c,p=e.length,f=dt(t),d=[],h=0;for(;p>h;h++)if(o=e[h],o||0===o)if("object"===b.type(o))b.merge(d,o.nodeType?[o]:o);else if(wt.test(o)){s=s||f.appendChild(t.createElement("div")),u=(bt.exec(o)||["",""])[1].toLowerCase(),c=At[u]||At._default,s.innerHTML=c[1]+o.replace(vt,"<$1>")+c[2],i=c[0];while(i--)s=s.lastChild;if(!b.support.leadingWhitespace&&yt.test(o)&&d.push(t.createTextNode(yt.exec(o)[0])),!b.support.tbody){o="table"!==u||xt.test(o)?""!==c[1]||xt.test(o)?0:s:s.firstChild,i=o&&o.childNodes.length;while(i--)b.nodeName(l=o.childNodes[i],"tbody")&&!l.childNodes.length&&o.removeChild(l) +}b.merge(d,s.childNodes),s.textContent="";while(s.firstChild)s.removeChild(s.firstChild);s=f.lastChild}else d.push(t.createTextNode(o));s&&f.removeChild(s),b.support.appendChecked||b.grep(Ot(d,"input"),Bt),h=0;while(o=d[h++])if((!r||-1===b.inArray(o,r))&&(a=b.contains(o.ownerDocument,o),s=Ot(f.appendChild(o),"script"),a&&Mt(s),n)){i=0;while(o=s[i++])kt.test(o.type||"")&&n.push(o)}return s=null,f},cleanData:function(e,t){var n,r,o,a,s=0,u=b.expando,l=b.cache,p=b.support.deleteExpando,f=b.event.special;for(;null!=(n=e[s]);s++)if((t||b.acceptData(n))&&(o=n[u],a=o&&l[o])){if(a.events)for(r in a.events)f[r]?b.event.remove(n,r):b.removeEvent(n,r,a.handle);l[o]&&(delete l[o],p?delete n[u]:typeof n.removeAttribute!==i?n.removeAttribute(u):n[u]=null,c.push(o))}}});var Pt,Rt,Wt,$t=/alpha\([^)]*\)/i,It=/opacity\s*=\s*([^)]*)/,zt=/^(top|right|bottom|left)$/,Xt=/^(none|table(?!-c[ea]).+)/,Ut=/^margin/,Vt=RegExp("^("+x+")(.*)$","i"),Yt=RegExp("^("+x+")(?!px)[a-z%]+$","i"),Jt=RegExp("^([+-])=("+x+")","i"),Gt={BODY:"block"},Qt={position:"absolute",visibility:"hidden",display:"block"},Kt={letterSpacing:0,fontWeight:400},Zt=["Top","Right","Bottom","Left"],en=["Webkit","O","Moz","ms"];function tn(e,t){if(t in e)return t;var n=t.charAt(0).toUpperCase()+t.slice(1),r=t,i=en.length;while(i--)if(t=en[i]+n,t in e)return t;return r}function nn(e,t){return e=t||e,"none"===b.css(e,"display")||!b.contains(e.ownerDocument,e)}function rn(e,t){var n,r,i,o=[],a=0,s=e.length;for(;s>a;a++)r=e[a],r.style&&(o[a]=b._data(r,"olddisplay"),n=r.style.display,t?(o[a]||"none"!==n||(r.style.display=""),""===r.style.display&&nn(r)&&(o[a]=b._data(r,"olddisplay",un(r.nodeName)))):o[a]||(i=nn(r),(n&&"none"!==n||!i)&&b._data(r,"olddisplay",i?n:b.css(r,"display"))));for(a=0;s>a;a++)r=e[a],r.style&&(t&&"none"!==r.style.display&&""!==r.style.display||(r.style.display=t?o[a]||"":"none"));return e}b.fn.extend({css:function(e,n){return b.access(this,function(e,n,r){var i,o,a={},s=0;if(b.isArray(n)){for(o=Rt(e),i=n.length;i>s;s++)a[n[s]]=b.css(e,n[s],!1,o);return a}return r!==t?b.style(e,n,r):b.css(e,n)},e,n,arguments.length>1)},show:function(){return rn(this,!0)},hide:function(){return rn(this)},toggle:function(e){var t="boolean"==typeof e;return this.each(function(){(t?e:nn(this))?b(this).show():b(this).hide()})}}),b.extend({cssHooks:{opacity:{get:function(e,t){if(t){var n=Wt(e,"opacity");return""===n?"1":n}}}},cssNumber:{columnCount:!0,fillOpacity:!0,fontWeight:!0,lineHeight:!0,opacity:!0,orphans:!0,widows:!0,zIndex:!0,zoom:!0},cssProps:{"float":b.support.cssFloat?"cssFloat":"styleFloat"},style:function(e,n,r,i){if(e&&3!==e.nodeType&&8!==e.nodeType&&e.style){var o,a,s,u=b.camelCase(n),l=e.style;if(n=b.cssProps[u]||(b.cssProps[u]=tn(l,u)),s=b.cssHooks[n]||b.cssHooks[u],r===t)return s&&"get"in s&&(o=s.get(e,!1,i))!==t?o:l[n];if(a=typeof r,"string"===a&&(o=Jt.exec(r))&&(r=(o[1]+1)*o[2]+parseFloat(b.css(e,n)),a="number"),!(null==r||"number"===a&&isNaN(r)||("number"!==a||b.cssNumber[u]||(r+="px"),b.support.clearCloneStyle||""!==r||0!==n.indexOf("background")||(l[n]="inherit"),s&&"set"in s&&(r=s.set(e,r,i))===t)))try{l[n]=r}catch(c){}}},css:function(e,n,r,i){var o,a,s,u=b.camelCase(n);return n=b.cssProps[u]||(b.cssProps[u]=tn(e.style,u)),s=b.cssHooks[n]||b.cssHooks[u],s&&"get"in s&&(a=s.get(e,!0,r)),a===t&&(a=Wt(e,n,i)),"normal"===a&&n in Kt&&(a=Kt[n]),""===r||r?(o=parseFloat(a),r===!0||b.isNumeric(o)?o||0:a):a},swap:function(e,t,n,r){var i,o,a={};for(o in t)a[o]=e.style[o],e.style[o]=t[o];i=n.apply(e,r||[]);for(o in t)e.style[o]=a[o];return i}}),e.getComputedStyle?(Rt=function(t){return e.getComputedStyle(t,null)},Wt=function(e,n,r){var i,o,a,s=r||Rt(e),u=s?s.getPropertyValue(n)||s[n]:t,l=e.style;return s&&(""!==u||b.contains(e.ownerDocument,e)||(u=b.style(e,n)),Yt.test(u)&&Ut.test(n)&&(i=l.width,o=l.minWidth,a=l.maxWidth,l.minWidth=l.maxWidth=l.width=u,u=s.width,l.width=i,l.minWidth=o,l.maxWidth=a)),u}):o.documentElement.currentStyle&&(Rt=function(e){return e.currentStyle},Wt=function(e,n,r){var i,o,a,s=r||Rt(e),u=s?s[n]:t,l=e.style;return null==u&&l&&l[n]&&(u=l[n]),Yt.test(u)&&!zt.test(n)&&(i=l.left,o=e.runtimeStyle,a=o&&o.left,a&&(o.left=e.currentStyle.left),l.left="fontSize"===n?"1em":u,u=l.pixelLeft+"px",l.left=i,a&&(o.left=a)),""===u?"auto":u});function on(e,t,n){var r=Vt.exec(t);return r?Math.max(0,r[1]-(n||0))+(r[2]||"px"):t}function an(e,t,n,r,i){var o=n===(r?"border":"content")?4:"width"===t?1:0,a=0;for(;4>o;o+=2)"margin"===n&&(a+=b.css(e,n+Zt[o],!0,i)),r?("content"===n&&(a-=b.css(e,"padding"+Zt[o],!0,i)),"margin"!==n&&(a-=b.css(e,"border"+Zt[o]+"Width",!0,i))):(a+=b.css(e,"padding"+Zt[o],!0,i),"padding"!==n&&(a+=b.css(e,"border"+Zt[o]+"Width",!0,i)));return a}function sn(e,t,n){var r=!0,i="width"===t?e.offsetWidth:e.offsetHeight,o=Rt(e),a=b.support.boxSizing&&"border-box"===b.css(e,"boxSizing",!1,o);if(0>=i||null==i){if(i=Wt(e,t,o),(0>i||null==i)&&(i=e.style[t]),Yt.test(i))return i;r=a&&(b.support.boxSizingReliable||i===e.style[t]),i=parseFloat(i)||0}return i+an(e,t,n||(a?"border":"content"),r,o)+"px"}function un(e){var t=o,n=Gt[e];return n||(n=ln(e,t),"none"!==n&&n||(Pt=(Pt||b(" + + +{{ if get_domain_banner_text(request): }} +
      {{= get_domain_banner_text(request) }}
      +

      {{= XML(get_domain_banner_hovertext(request)) }}

      +{{ pass }} + + +
      +
      + {{if left_sidebar_enabled:}} + + {{pass}} + +
      + {{block center}} + {{include}} + {{end}} +
      + + {{if right_sidebar_enabled:}} +
      + {{block right_sidebar}} +

      Right Sidebar

      +

      + {{end}} +
      + {{pass}} +
      + +
      + +{{ if 'nudgingToLatestSyntheticTree' in locals(): }} + {{ if nudgingToLatestSyntheticTree: }} +
      + Note: The requested synthetic tree version ('{{= incomingDomSource}}') is no longer available. + This view reflects the latest version + ({{= draftTreeName}}). + + +
      + {{ pass }} +{{ pass }} + + +
      +
      + +
      +
      + + + + + + + + + + From a492c38c7b05d361d3ff2895a7d7ca6846600a37 Mon Sep 17 00:00:00 2001 From: Jim Allman Date: Sat, 17 Sep 2022 02:13:19 -0400 Subject: [PATCH 08/86] More jinja template cleanup --- .../templates/layout.jinja2 | 135 +++++++++--------- 1 file changed, 68 insertions(+), 67 deletions(-) diff --git a/synthetic_tree_viewer/synthetic_tree_viewer/templates/layout.jinja2 b/synthetic_tree_viewer/synthetic_tree_viewer/templates/layout.jinja2 index 7f252ef1a..252aaeaf2 100644 --- a/synthetic_tree_viewer/synthetic_tree_viewer/templates/layout.jinja2 +++ b/synthetic_tree_viewer/synthetic_tree_viewer/templates/layout.jinja2 @@ -1,9 +1,14 @@ -{{ -from applications.opentree.modules.opentreewebapputil import get_user_display_name, get_conf, get_domain_banner_text, get_domain_banner_hovertext, get_currently_deployed_opentree_branch, latest_CrossRef_URL -}} +{% +from applications.opentree.modules.opentreewebapputil import get_user_display_name, + get_conf, + get_domain_banner_text, + get_domain_banner_hovertext, + get_currently_deployed_opentree_branch, + latest_CrossRef_URL +%} - + @@ -28,7 +33,7 @@ from applications.opentree.modules.opentreewebapputil import get_user_display_na - {{=response.title or request.application}} + {{ response.title or request.application}} {{response.files.append(URL('static','css/bootstrap.css'))}} {{response.files.append(URL('static','css/bootstrap-responsive.css'))}} + +
      +

      Materials and methods

      + +
      +
      + +

      + TODO: What else goes here? Lorem ipsum dolor sit amet, + consectetur adipiscing elit. In bibendum, magna et viverra + tincidunt, nisi leo dapibus massa, sit amet fermentum dui magna a + nunc. Maecenas a ligula libero. Cras id tempus dui. +

      +

      + Nam at vehicula augue. Vestibulum varius ligula ante, sit amet + gravida mi semper non. Nunc ornare bibendum ultrices. Ut nec + porttitor enim. Vivamus luctus semper risus, ac imperdiet ante + pulvinar in. +

      +

      + Vivamus urna lectus, rutrum nec odio ac, ullamcorper sagittis + dolor. Sed lacinia dolor a mauris mollis cursus. Fusce tristique + dictum luctus. Vestibulum ante ipsum primis in faucibus orci + luctus et ultrices posuere cubilia Curae; Nam arcu nisi, pharetra + at felis et, condimentum bibendum tellus. In vitae ante ut elit + mollis auctor sed a tortor. +

      +
      + +
      + +

      Comments

      + {{=plugin_localcomments(filter='url',url=request.url)}} + +
      + + diff --git a/synthetic_tree_viewer/synthetic_tree_viewer/templates/about/open_tree_of_life.jinja2 b/synthetic_tree_viewer/synthetic_tree_viewer/templates/about/open_tree_of_life.jinja2 new file mode 100644 index 000000000..4a0925f42 --- /dev/null +++ b/synthetic_tree_viewer/synthetic_tree_viewer/templates/about/open_tree_of_life.jinja2 @@ -0,0 +1,152 @@ +{% extends "../layout.jinja2" %} + +{% block center %} +
      +

      Open Tree of Life

      + +
      +
      +

      + Open Tree of Life aims to construct a comprehensive, dynamic and digitally-available tree of life by synthesizing published phylogenetic trees along with taxonomic data. The project is a collaborative effort between 11 PIs across 10 institutions. Funded by NSF ABI #1759838, NSF AVAToL #1208809. More information and tutorials at opentreeoflife.org +

      +

      + Browse the tree and leave feedback: Click on nodes to move through the tree, and click on nodes or edges to see more information about taxonomies and phylogenies that contain / support that node. If you have feedback about the relationships that you see, use the "Add Comment" button. +

      +

      + Contribute data: You can contribute to the synthetic tree by uploading trees through our curation interface. These can be trees from TreeBASE or trees uploaded from your computer. There will be a delay before uploaded trees appear in the synthetic tree. Up to summer 2015, the release cycle has been months between new versions of the synthetic tree, but this should shorten in the future. +

      +

      Contact us using one of the methods on the Contact page. +

      +

      Cite the Open Tree Synthetic Tree (please include current synthesis release): + OpenTree et al. "Open Tree of Life Synthetic Tree" + https://doi.org/10.5281/zenodo.3937741

      +

      Cite the Open Tree Taxonomy (please include current taxonomy version): + OpenTree et al. "Open Tree of Life Taxonomy" + https://doi.org/10.5281/zenodo.3937750

      +

      Cite the Open Tree Synthesis Algorithim: + Redelings BD, Holder MT. "A supertree pipeline for summarizing phylogenetic and taxonomic information for millions of species." PeerJ. 2017;5:e3058. + https://doi.org/10.7717/peerj.3058

      +

      Cite the Open Tree Taxonomy: + Rees J, Cranston K (2017) "Automated assembly of a reference taxonomy for phylogenetic data synthesis." + Biodiversity Data Journal 5: e12581. + https://doi.org/10.3897/BDJ.5.e12581

      +

      Cite the Open Tree DataStore: + McTavish EJ, Hinchliff CE, Allman JF, Brown JW, Cranston KA, Holder MT, et al. Phylesystem: a git-based data store for community curated phylogenetic estimates. Bioinformatics. 2015;31:2794–800. + https://doi.org/10.1093/bioinformatics/btv276

      +
      +
      +
      +
      + Sustaining the Open Tree of Life, NSF ABI #1759838; ABI #1759846 (2018-2022) +
      +
      +
      +
      +
      +
      Postdocs & students
      +
      Ben Redelings
      +
      Luna Luisa Sanchez Reyes
      +
      +
      +
      +
      +
      Developers
      +
      Jim Allman
      +
      Karen Cranston
      +
      Mark Holder
      +
      Emily Jane McTavish
      +
      Ben Redelings
      +
      Luna Luisa Sanchez Reyes
      + +
      +
      +
      +
      +
      Principal investigators
      +
      Karen Cranston
      +
      Mark Holder
      +
      Emily Jane McTavish
      +
      +
      +
      +
      +
      + Open Tree of Life, NSF AVAToL #1208809 (2012-2016) +
      +
      +
      +
      +
      +
      Postdocs & students
      +
      Joseph Brown
      +
      Ruchi Chaudhary
      +
      Lyndon M. Coghill
      +
      Jiabin Deng
      +
      Bryan Drew
      +
      Romina Gazis
      +
      Jessica Grant
      +
      Cody Hinchliff
      +
      Dail Laughinghouse
      +
      Emily Jane McTavish
      +
      Chris Owen
      +
      Ben Redelings
      + + + +
      +
      +
      +
      +
      Developers
      +
      Jim Allman
      +
      Joseph Brown
      +
      Karen Cranston
      +
      Cody Hinchliff
      +
      Mark Holder
      +
      Jonathan Leto
      +
      Emily Jane McTavish
      +
      Peter Midford
      +
      Ben Redelings
      +
      Richard Ree
      +
      Jonathan Rees
      +
      Stephen Smith
      +
      +
      +
      +
      +
      Principal investigators
      +
      Gordon Burleigh
      +
      Keith Crandall
      +
      Karen Cranston
      +
      Karl Gude
      +
      David Hibbett
      +
      Mark Holder
      +
      Laura Katz
      +
      Richard Ree
      +
      Stephen Smith
      +
      Doug Soltis
      +
      Tiffani Williams
      + + +
      +
      +
      + +

      Comments

      + {# plugin_localcomments(filter='url',url=request.url) #} + +
      + + +{% endblock center %} diff --git a/synthetic_tree_viewer/synthetic_tree_viewer/templates/about/privacy_policy.html b/synthetic_tree_viewer/synthetic_tree_viewer/templates/about/privacy_policy.html new file mode 100644 index 000000000..0010865b1 --- /dev/null +++ b/synthetic_tree_viewer/synthetic_tree_viewer/templates/about/privacy_policy.html @@ -0,0 +1,156 @@ +{{extend 'layout.html'}} + +
      +

      Privacy Policy

      +
      +
      +

      +The Open Tree of Life project provides infrastructure +to help the community of people interested in evolutionary +relationships to create a synthetic view of published +phylogenetic information. +The website of the project allows user to curate the results of +phylogenetic research via +our curation page. +Users can also comment on current synthetic tree (see instructions on + our "about" page). +

      +

      What kind of user information do we keep?

      +

      Not much, and as little as possible (see the this page for + an explanation of this choice).

      +

      The type of user information stored on our servers depends +on what aspects of the site you are using. Briefly: +

        +
      • You do not need to have an account or any type of registeration to + use our API or + to browse the synthetic tree or + taxonomy.
      • +
      • To maintain provenance of the scientific work involved in curating a study, + we require curators to log in via GitHub (see below).
      • +
      • To leave a comment on the tree, you can either be logged in with a + GitHub account, provide a name and email address (which will be publicly visible), + or enter "Anonymous" in the name field. + Comments are publicly visible on the tree and in our feedback repository. +
      • +
      +We describe below what information is stored for each type of user activity below. +

      + + +

      What information do we keep about users of our APIs?

      +

      IP addresses: + The apache web server software we use writes IP addresses of incoming requests in its log files. +We periodically summarize the counts of calls to different services + based on these logs so that we can better understand what parts of + the project are most widely used. +After that summarization, we delete the log files. +We do not store the IP addresses in them long term. +We do not associate the IP address with any user accounts or user other user information. +We do not distribute any of this IP addresses to any third-parties. +The only form that this information is used or distributed is in summary statistics about + the frequency of usage of our different services. +

      + +

      What information do we keep about non-logged in users browsing the tree?

      +
        +
      1. IP addresses: When you visit our site, your browser users our API. So the information + described in the previous section about IP addresses applies to you.
      2. +
      3. Cookies+Sessions: Our web apps (browsing the synthetic tree and taxonomy) store a single cookie with a +session identifier. This cookie and session store no personal information.
      4. +
      5. Google analytics: We use Google Analytics to gather some basic information about +how users are navigating the site and which features are commonly used. +You can "opt out" of this tracking when you first reach the website. +
      6. +
      + +

      What information do we keep about anonymous comments on the tree?

      +

      +If you want to leave a comment on the synthetic tree, you will be +prompted to log into a GitHub account or to enter your name and email address. +To leave anonymous feedback, enter 'Anonymous' for the name and leave +the email address blank. +

      +
        +
      1. See above: Anonymous commenters are using the site, so the previous sections apply to them.
      2. +
      3. Comments on GitHub: We store the comments in a publicly visible form as an "issue" at + https://github.com/OpenTreeOfLife/feedback/issues/
      4. +
      5. Comments on the tree browser: Open issues will also appear to visitors of the site when they browse to the node + of the tree where the issue was created.
      6. +
      7. Name and email address:If you enter your name and an email address when creating a comment, + the name will appear with a link your email address as the "Author" of the comment.
      8. +
      + + +

      What information do we keep about logged-in users?

      +
        +
      1. See above: The information in "What information do we keep about non-logged in users browsing the tree?" applies to logged-in users
      2. +
      3. GitHub account info: We use GitHub for authentication for data contributors. +This means that the Open Tree of Life project does not store any personal + information about its users. +Our web application can only obtain your name and email address if it is +publicly visible in your GitHub profile. +If you choose not to make that information public, then our application can only + tell what your GitHub username is (and the fact that you have successfully + authenticated with GitHub using that username).
        + We have entered into a Data Protection Agreement with GitHub regarding issues of privacy and personal data. +See GitHub's privacy policy +for their approach to protecting and managing users' personal data. +
      4. +
      + + +

      What information do we keep about study curators?

      +

      +The study curation app handle much more data than the commenting feature. +We prefer to attribute this work to the curators so that they get credit and +other members of the community can ask questions about the curated data. +If you want to edit studies and trees, the curation tool will require +a log in via a GitHub account. If your email address has not been made public in +your GitHub user profile, it will not appear in our study data, but +it's possible that git operations using other tools will reveal your +email address. +

      +
        +
      1. See above: The information in "What information do we keep about logged-in users?" applies to curators
      2. +
      3. GitHub id, your name: When you help with curation, your GitHub username is used as the author of a git commit + so that you get credit for the curation activity. + The username (and your real name if that information is public on your GitHub profile) is publicly visible at in the + git repository storing the curated information. + Those repositories include information on: +
      4. +
      5. your email address: If you have made your email address publicly visible in your GitHub profile, then that address will + occur in the git commit metadata when you save a study. If your email address is not public, then "ANONYMOUS" will be used in the git commit + metadata in place of your email.
      6. +
      + +

      What information do we keep about commenters who are logged-in via GitHub?

      +
        +
      1. See above: The information in "What information do we keep about logged-in users?" applies to curators
      2. +
      3. Comment data:The same information that is described in "What information do we keep about anonymous comments on the tree?" is + associated with the logged-in commenters, except that the comment will appear as an issue that you created on GitHub. + Your name and a link to your GitHub profile will appear in the author field. + You can use the GitHub account settings to control whether you get email about responses to your comment.
      4. +
      + +

      Who can you talk to about data privacy?

      +

      +If you have questions about how we handle personal data, or if you'd +like your personal information to be removed, please send a message to +privacy@opentreeoflife.org. +

      + +
      +
      + +

      Comments

      +{{=plugin_localcomments(filter='url',url=request.url)}} + +
      + + diff --git a/synthetic_tree_viewer/synthetic_tree_viewer/templates/about/progress.html b/synthetic_tree_viewer/synthetic_tree_viewer/templates/about/progress.html new file mode 100644 index 000000000..c350406ad --- /dev/null +++ b/synthetic_tree_viewer/synthetic_tree_viewer/templates/about/progress.html @@ -0,0 +1,743 @@ +{{response.title = "Progress - Open Tree of Life" + ### response.files.append("/curator/static/js/d3.v3.js") + response.files.append("/curator/static/js/d3.v3.min.js") }} +{{extend 'layout.html'}} +{{import urllib}} +{{from pprint import pprint}} +{{### Add support scripts for parsing ISO-8601 dates + #response.files.append(URL('static','js/moment.min.js')) +}} + +
      +

      Open Tree progress

      +
      +
      +

      + The Open Tree of Life project includes periodic releases of + OTT (Open Tree taxonomy) + and the + latest synthetic tree, + as well as incremental addition of published phylogenetic trees. + The timeline below shows the increase in the number of OTUs + (operational taxonomic units) in various components. Note the + large gap between the number of taxa in OTT and the number of + taxa in our datastore (phylesystem) and the synthetic tree! + Please help close this gap by adding published trees through our + curator application. +
      + +

      +

      Move the mouse below to see details for any date.

      +
      +
      + + +
      + +

      Comments

      + {{=plugin_localcomments(filter='url',url=request.url)}} + +
      + + diff --git a/synthetic_tree_viewer/synthetic_tree_viewer/templates/about/references.jinja2 b/synthetic_tree_viewer/synthetic_tree_viewer/templates/about/references.jinja2 new file mode 100644 index 000000000..50aa0c03d --- /dev/null +++ b/synthetic_tree_viewer/synthetic_tree_viewer/templates/about/references.jinja2 @@ -0,0 +1,189 @@ +{% extends "../layout.jinja2" %} + +{% block center %} +{# import urllib #} +{# from pprint import pprint #} + + +
      +

      Bibliographic references for the synthetic tree

      +
      +
      +

      The following studies (listed alphabetically by first author) have contributed to the current synthetic tree.

      +
      +
      + +
      +
      + + + + + {% set priority = 1 %} + {% for study in contributing_studies: %} +
      6}".format(priority) }}"> +
      + {{ study.get('ot:studyPublicationReference') }} + {% if study.get('ot:studyPublication'): %} + {{ latest_CrossRef_URL(study.get('ot:studyPublication')) }} + {% else: %} +
      + + No link provided! Try + + Google Scholar or + + CrossRef.org + +
      + {% endif %} +
      + +
      + {% set priority = priority + 1 %} + {% endfor %} +
      + +
      + +

      Comments

      + {# plugin_localcomments(filter='url',url=request.url) #} + +
      + + +{% endblock center %} diff --git a/synthetic_tree_viewer/synthetic_tree_viewer/templates/about/synthesis_release.html b/synthetic_tree_viewer/synthetic_tree_viewer/templates/about/synthesis_release.html new file mode 100644 index 000000000..ff59fafe5 --- /dev/null +++ b/synthetic_tree_viewer/synthetic_tree_viewer/templates/about/synthesis_release.html @@ -0,0 +1,374 @@ +{{response.title = "Synthesis release {v} - Open Tree of Life".format(v=release_version) + ### response.files.append("/curator/static/js/d3.v3.js") + response.files.append("/curator/static/js/d3.v3.min.js") }} +{{extend 'layout.html'}} +{{import urllib}} +{{from pprint import pprint}} +{{### Add support scripts for parsing ISO-8601 dates + #response.files.append(URL('static','js/moment.min.js')) +}} + +
      +

      Synthesis release +

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

      Statistics

      + +
      + + +

      Release notes

      + A fuller release history (including early draft versions) is available in the germinator documentation: + {{ if synthesis_release_notes: }} +
      + {{ # REMINDER: web2py's sanitize can't handle Unicode! }} + {{= XML(synthesis_release_notes, sanitize=False) }} +
      + {{ else: }} +
      + No release notes found for this synthesis release! +
      + {{ pass }} + + + + +

      Comments

      + {{=plugin_localcomments(filter='url',url=request.url)}} + + + +
      + diff --git a/synthetic_tree_viewer/synthetic_tree_viewer/templates/about/taxonomy_version.html b/synthetic_tree_viewer/synthetic_tree_viewer/templates/about/taxonomy_version.html new file mode 100644 index 000000000..fd6cee688 --- /dev/null +++ b/synthetic_tree_viewer/synthetic_tree_viewer/templates/about/taxonomy_version.html @@ -0,0 +1,329 @@ +{{response.title = "Taxonomy release {v} - Open Tree of Life".format(v=taxonomy_version)}} +{{extend 'layout.html'}} +{{import urllib}} +{{from pprint import pprint}} +{{### Add support scripts for parsing ISO-8601 dates + #response.files.append(URL('static','js/moment.min.js')) +}} + + +
      +

      Taxonomy version +

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

      Statistics

      + + + +

      Release notes

      + A fuller release history (including early draft versions) is available in the OTT documentation: + {{ if taxonomy_version_notes: }} +
      + {{ # REMINDER: web2py's sanitize can't handle Unicode! }} + {{= XML(taxonomy_version_notes, sanitize=False) }} +
      + {{ else: }} +
      + No release notes found for this taxonomy version! +
      + {{ pass }} + +
      + +
      + +

      Comments

      + {{=plugin_localcomments(filter='url',url=request.url)}} + +
      + + diff --git a/synthetic_tree_viewer/synthetic_tree_viewer/templates/about/the_source_tree_manager.html b/synthetic_tree_viewer/synthetic_tree_viewer/templates/about/the_source_tree_manager.html new file mode 100644 index 000000000..1241bb7fa --- /dev/null +++ b/synthetic_tree_viewer/synthetic_tree_viewer/templates/about/the_source_tree_manager.html @@ -0,0 +1,49 @@ +{{extend 'layout.html'}} + +
      +

      About Phylografter, the source tree manager

      + +
      +
      +

      + TODO: What else goes here? Lorem ipsum dolor sit amet, + consectetur adipiscing elit. In bibendum, magna et viverra + tincidunt, nisi leo dapibus massa, sit amet fermentum dui magna a + nunc. Maecenas a ligula libero. Cras id tempus dui. +

      +

      + Vivamus urna lectus, rutrum nec odio ac, ullamcorper sagittis + dolor. Sed lacinia dolor a mauris mollis cursus. Fusce tristique + dictum luctus. Vestibulum ante ipsum primis in faucibus orci + luctus et ultrices posuere cubilia Curae; Nam arcu nisi, pharetra + at felis et, condimentum bibendum tellus. In vitae ante ut elit + mollis auctor sed a tortor. +

      +

      + Ut magna dolor, ultricies nec leo sed, tempor iaculis orci. + Integer dignissim odio nec odio imperdiet, ac ultrices sapien + tristique. In a urna ut eros hendrerit fringilla nec ut ligula. + Sed pulvinar sem vel turpis dapibus mattis. Etiam pretium nibh + quis turpis vulputate suscipit. Suspendisse consequat, dolor + vitae aliquet rhoncus, ipsum nisi tincidunt odio, non pretium + felis erat nec elit. Nullam quis mi lobortis orci volutpat + commodo in iaculis nulla. Mauris sit amet ante quis lectus + vestibulum varius sed vel nisi. +

      +

      + Nam at vehicula augue. Vestibulum varius ligula ante, sit amet + gravida mi semper non. Nunc ornare bibendum ultrices. Ut nec + porttitor enim. Vivamus luctus semper risus, ac imperdiet ante + pulvinar in. +

      +
      +
      + +

      Comments

      + {{=plugin_localcomments(filter='url',url=request.url)}} + +
      + + diff --git a/synthetic_tree_viewer/synthetic_tree_viewer/templates/about/the_synthetic_tree.html b/synthetic_tree_viewer/synthetic_tree_viewer/templates/about/the_synthetic_tree.html new file mode 100644 index 000000000..d38ffcbb0 --- /dev/null +++ b/synthetic_tree_viewer/synthetic_tree_viewer/templates/about/the_synthetic_tree.html @@ -0,0 +1,49 @@ +{{extend 'layout.html'}} + +
      +

      About the synthetic tree

      + +
      +
      +

      + TODO: What else goes here? Lorem ipsum dolor sit amet, + consectetur adipiscing elit. In bibendum, magna et viverra + tincidunt, nisi leo dapibus massa, sit amet fermentum dui magna a + nunc. Maecenas a ligula libero. Cras id tempus dui. +

      +

      + Vivamus urna lectus, rutrum nec odio ac, ullamcorper sagittis + dolor. Sed lacinia dolor a mauris mollis cursus. Fusce tristique + dictum luctus. Vestibulum ante ipsum primis in faucibus orci + luctus et ultrices posuere cubilia Curae; Nam arcu nisi, pharetra + at felis et, condimentum bibendum tellus. In vitae ante ut elit + mollis auctor sed a tortor. +

      +

      + Ut magna dolor, ultricies nec leo sed, tempor iaculis orci. + Integer dignissim odio nec odio imperdiet, ac ultrices sapien + tristique. In a urna ut eros hendrerit fringilla nec ut ligula. + Sed pulvinar sem vel turpis dapibus mattis. Etiam pretium nibh + quis turpis vulputate suscipit. Suspendisse consequat, dolor + vitae aliquet rhoncus, ipsum nisi tincidunt odio, non pretium + felis erat nec elit. Nullam quis mi lobortis orci volutpat + commodo in iaculis nulla. Mauris sit amet ante quis lectus + vestibulum varius sed vel nisi. +

      +

      + Nam at vehicula augue. Vestibulum varius ligula ante, sit amet + gravida mi semper non. Nunc ornare bibendum ultrices. Ut nec + porttitor enim. Vivamus luctus semper risus, ac imperdiet ante + pulvinar in. +

      +
      +
      + +

      Comments

      + {{=plugin_localcomments(filter='url',url=request.url)}} + +
      + + From 8fc9cc7136ed099d3946e7be7475ddeb83b92976 Mon Sep 17 00:00:00 2001 From: Jim Allman Date: Tue, 14 Nov 2023 11:55:27 -0500 Subject: [PATCH 35/86] Implement page setup for About pages (ongoing) --- .../synthetic_tree_viewer/views/about.py | 51 +++++++++++++++++++ 1 file changed, 51 insertions(+) create mode 100644 synthetic_tree_viewer/synthetic_tree_viewer/views/about.py diff --git a/synthetic_tree_viewer/synthetic_tree_viewer/views/about.py b/synthetic_tree_viewer/synthetic_tree_viewer/views/about.py new file mode 100644 index 000000000..58dc62f33 --- /dev/null +++ b/synthetic_tree_viewer/synthetic_tree_viewer/views/about.py @@ -0,0 +1,51 @@ +from pyramid.view import view_config +from synthetic_tree_viewer.opentreewebapputil import ( + get_user_display_name, + get_conf, + get_conf_as_dict, + get_domain_banner_text, + get_domain_banner_hovertext, + get_currently_deployed_opentree_branch, + get_opentree_services_method_urls, + latest_CrossRef_URL, + fetch_current_TNRS_context_names, + ) +from pyramid.httpexceptions import HTTPNotFound, HTTPSeeOther + +def _minimal_about_viewdict(request): + # First, copy our boilerplate config vars (getDraftTreeID_url, etc) + view_dict = get_opentree_services_method_urls(request) + + # Then add/override with these explicit key-value pairs + view_dict.update({ + # NB - Duplicate keys will be resolved in favor of the values below! + 'conf': get_conf(request), # needed for the footer diagnostics + 'response': request.response, + 'registry': request.registry, + 'taxonSearchContextNames': fetch_current_TNRS_context_names(request), + 'domain_banner_text': get_domain_banner_text(request), + 'domain_banner_hovertext': get_domain_banner_hovertext(request), + }) + + if request.params.get('parentWindowURL', None): + plain_feedback_url = unquote_plus(request.params.get('parentWindowURL')) + view_dict['feedbackParentWindowURL'] = plain_feedback_url + else: + view_dict['feedbackParentWindowURL'] = None + + return view_dict + + +@view_config(route_name='about_open_tree_of_life', + renderer='synthetic_tree_viewer:templates/about/open_tree_of_life.jinja2') +@view_config(route_name='about', + renderer='synthetic_tree_viewer:templates/about/open_tree_of_life.jinja2') +@view_config(route_name='about_references', + renderer='synthetic_tree_viewer:templates/about/references.jinja2') +def about_open_tree_of_life(request): + # provide view context for a dumb template + view_dict = _minimal_about_viewdict(request) + + view_dict['contributingStudies'] = ['a', 'b'] + + return view_dict From 37350fdf3161cb7b130147613289096e34e82644 Mon Sep 17 00:00:00 2001 From: Jim Allman Date: Mon, 20 Nov 2023 13:28:13 -0500 Subject: [PATCH 36/86] Add Privacy page; fix default /about (via redirect) --- .../{privacy_policy.html => privacy_policy.jinja2} | 6 ++++-- .../synthetic_tree_viewer/views/about.py | 14 +++++++++++--- 2 files changed, 15 insertions(+), 5 deletions(-) rename synthetic_tree_viewer/synthetic_tree_viewer/templates/about/{privacy_policy.html => privacy_policy.jinja2} (98%) diff --git a/synthetic_tree_viewer/synthetic_tree_viewer/templates/about/privacy_policy.html b/synthetic_tree_viewer/synthetic_tree_viewer/templates/about/privacy_policy.jinja2 similarity index 98% rename from synthetic_tree_viewer/synthetic_tree_viewer/templates/about/privacy_policy.html rename to synthetic_tree_viewer/synthetic_tree_viewer/templates/about/privacy_policy.jinja2 index 0010865b1..001378c4e 100644 --- a/synthetic_tree_viewer/synthetic_tree_viewer/templates/about/privacy_policy.html +++ b/synthetic_tree_viewer/synthetic_tree_viewer/templates/about/privacy_policy.jinja2 @@ -1,5 +1,6 @@ -{{extend 'layout.html'}} +{% extends "../layout.jinja2" %} +{% block center %}

      Privacy Policy

      @@ -147,10 +148,11 @@

      Who can you talk to about data privacy?

      Comments

      -{{=plugin_localcomments(filter='url',url=request.url)}} +{# plugin_localcomments(filter='url',url=request.url) #}
      +{% endblock center %} diff --git a/synthetic_tree_viewer/synthetic_tree_viewer/views/about.py b/synthetic_tree_viewer/synthetic_tree_viewer/views/about.py index 58dc62f33..770b7db12 100644 --- a/synthetic_tree_viewer/synthetic_tree_viewer/views/about.py +++ b/synthetic_tree_viewer/synthetic_tree_viewer/views/about.py @@ -10,7 +10,10 @@ latest_CrossRef_URL, fetch_current_TNRS_context_names, ) -from pyramid.httpexceptions import HTTPNotFound, HTTPSeeOther +from pyramid.httpexceptions import ( + HTTPNotFound, + HTTPSeeOther, + ) def _minimal_about_viewdict(request): # First, copy our boilerplate config vars (getDraftTreeID_url, etc) @@ -36,12 +39,17 @@ def _minimal_about_viewdict(request): return view_dict -@view_config(route_name='about_open_tree_of_life', - renderer='synthetic_tree_viewer:templates/about/open_tree_of_life.jinja2') @view_config(route_name='about', renderer='synthetic_tree_viewer:templates/about/open_tree_of_life.jinja2') +def about_default_redirect(request): + raise HTTPSeeOther(location='/about/open-tree-of-life') + +@view_config(route_name='about_open_tree_of_life', + renderer='synthetic_tree_viewer:templates/about/open_tree_of_life.jinja2') @view_config(route_name='about_references', renderer='synthetic_tree_viewer:templates/about/references.jinja2') +@view_config(route_name='about_privacy_policy', + renderer='synthetic_tree_viewer:templates/about/privacy_policy.jinja2') def about_open_tree_of_life(request): # provide view context for a dumb template view_dict = _minimal_about_viewdict(request) From 6fe12f2dceac1c9f0ccacf91a9157a25a46cbf71 Mon Sep 17 00:00:00 2001 From: Jim Allman Date: Mon, 20 Nov 2023 14:20:01 -0500 Subject: [PATCH 37/86] Migrate About/Licenses page --- .../about/{licenses.html => licenses.jinja2} | 132 +++++++++--------- .../synthetic_tree_viewer/views/about.py | 2 + 2 files changed, 69 insertions(+), 65 deletions(-) rename synthetic_tree_viewer/synthetic_tree_viewer/templates/about/{licenses.html => licenses.jinja2} (53%) diff --git a/synthetic_tree_viewer/synthetic_tree_viewer/templates/about/licenses.html b/synthetic_tree_viewer/synthetic_tree_viewer/templates/about/licenses.jinja2 similarity index 53% rename from synthetic_tree_viewer/synthetic_tree_viewer/templates/about/licenses.html rename to synthetic_tree_viewer/synthetic_tree_viewer/templates/about/licenses.jinja2 index a273d929b..39e192b6f 100644 --- a/synthetic_tree_viewer/synthetic_tree_viewer/templates/about/licenses.html +++ b/synthetic_tree_viewer/synthetic_tree_viewer/templates/about/licenses.jinja2 @@ -1,5 +1,6 @@ -{{extend 'layout.html'}} +{% extends "../layout.jinja2" %} +{% block center %}

      Data rights

      @@ -44,189 +45,189 @@

      JavaScript license information

      Un-minified source code - html5shiv.js + html5shiv.js GPL 2 html5shiv.js - superfish.js + superfish.js Expat (as MIT) - superfish.js + superfish.js - raphael-min.js + raphael-min.js Expat (as MIT) raphael.js - drawtree.js + drawtree.js FreeBSD (as BSD 2-Clause) - drawtree.js + drawtree.js - drawtree.js + drawtree.js FreeBSD (as BSD 2-Clause) - drawtree.js + drawtree.js - jquery.history.js + jquery.history.js BSD 3-Clause (as New BSD) jquery.history.js - jquery.splitter-0.6.js + jquery.splitter-0.6.js GPL 3 - jquery.splitter-0.6.js + jquery.splitter-0.6.js - bootstrap-transition.js + bootstrap-transition.js Apache 2 - bootstrap-transition.js + bootstrap-transition.js - bootstrap-alert.js + bootstrap-alert.js Apache 2 - bootstrap-alert.js + bootstrap-alert.js - bootstrap-modal.js + bootstrap-modal.js Apache 2 - bootstrap-modal.js + bootstrap-modal.js - bootstrap-dropdown.js + bootstrap-dropdown.js Apache 2 - bootstrap-dropdown.js + bootstrap-dropdown.js - bootstrap-scrollspy.js + bootstrap-scrollspy.js Apache 2 - bootstrap-scrollspy.js + bootstrap-scrollspy.js - bootstrap-tab.js + bootstrap-tab.js Apache 2 - bootstrap-tab.js + bootstrap-tab.js - bootstrap-tooltip.js + bootstrap-tooltip.js Apache 2 - bootstrap-tooltip.js + bootstrap-tooltip.js - bootstrap-popover.js + bootstrap-popover.js Apache 2 - bootstrap-popover.js + bootstrap-popover.js - bootstrap-button.js + bootstrap-button.js Apache 2 - bootstrap-button.js + bootstrap-button.js - bootstrap-collapse.js + bootstrap-collapse.js Apache 2 - bootstrap-collapse.js + bootstrap-collapse.js - bootstrap-carousel.js + bootstrap-carousel.js Apache 2 - bootstrap-carousel.js + bootstrap-carousel.js - bootstrap-typeahead.js + bootstrap-typeahead.js Apache 2 - bootstrap-typeahead.js + bootstrap-typeahead.js - web2py.js + web2py.js Lesser GPL - web2py.js + web2py.js - calendar.js + calendar.js Lesser GPL calendar.js - moment.min.js + moment.min.js Expat (as MIT) archive2.8.3.zip - study-creation.js + study-creation.js FreeBSD (as BSD 2-Clause) - study-creation.js + study-creation.js - study-editor.js + study-editor.js FreeBSD (as BSD 2-Clause) - study-editor.js + study-editor.js - curation-helpers.js + curation-helpers.js FreeBSD (as BSD 2-Clause) - curation-helpers.js + curation-helpers.js - modernizr.custom.js + modernizr.custom.js Expat (as MIT) v2.6.2.zip - json2.js + json2.js Public Domain - json2.js + json2.js - knockout-2.3.0.js + knockout-2.3.0.js Expat (as MIT) v2.3.0.zip - knockout-bootstrap.min.js + knockout-bootstrap.min.js Expat (as MIT) v0.2.1.zip - knockout-paged-e4a5770702.js + knockout-paged-e4a5770702.js Expat (as MIT) knockout-paged.js - jquery.fileupload.js + jquery.fileupload.js Expat (as MIT) - jquery.fileupload.js + jquery.fileupload.js - jquery.iframe-transport.js + jquery.iframe-transport.js Expat (as MIT) - jquery.iframe-transport.js + jquery.iframe-transport.js - jquery.ui.widget.js + jquery.ui.widget.js Expat (as MIT) - jquery.ui.widget.js + jquery.ui.widget.js - bootstrap-tagsinput.min.js + bootstrap-tagsinput.min.js Expat (as MIT) 0.3.9.zip - bootstrap-dropdown.js + bootstrap-dropdown.js Apache 2 - + - d3.phylogram.js + d3.phylogram.js FreeBSD (as BSD 2-Clause) - d3.phylogram.js + d3.phylogram.js - d3.v3.min.js + d3.v3.min.js BSD 3-Clause d3.js @@ -235,10 +236,11 @@

      JavaScript license information

      Comments

      - {{=plugin_localcomments(filter='url',url=request.url)}} + {# plugin_localcomments(filter='url',url=request.url) #}
      +{% endblock center %} diff --git a/synthetic_tree_viewer/synthetic_tree_viewer/views/about.py b/synthetic_tree_viewer/synthetic_tree_viewer/views/about.py index 770b7db12..dbae428ff 100644 --- a/synthetic_tree_viewer/synthetic_tree_viewer/views/about.py +++ b/synthetic_tree_viewer/synthetic_tree_viewer/views/about.py @@ -50,6 +50,8 @@ def about_default_redirect(request): renderer='synthetic_tree_viewer:templates/about/references.jinja2') @view_config(route_name='about_privacy_policy', renderer='synthetic_tree_viewer:templates/about/privacy_policy.jinja2') +@view_config(route_name='about_licenses', + renderer='synthetic_tree_viewer:templates/about/licenses.jinja2') def about_open_tree_of_life(request): # provide view context for a dumb template view_dict = _minimal_about_viewdict(request) From 3ec49109ebe6729972f6ce0e9abe741f7ecdeac2 Mon Sep 17 00:00:00 2001 From: Jim Allman Date: Mon, 20 Nov 2023 22:18:20 -0500 Subject: [PATCH 38/86] Migrate and enable the Developer Resources page --- ...{developer_resources.html => developer_resources.jinja2} | 6 ++++-- synthetic_tree_viewer/synthetic_tree_viewer/views/about.py | 2 ++ 2 files changed, 6 insertions(+), 2 deletions(-) rename synthetic_tree_viewer/synthetic_tree_viewer/templates/about/{developer_resources.html => developer_resources.jinja2} (93%) diff --git a/synthetic_tree_viewer/synthetic_tree_viewer/templates/about/developer_resources.html b/synthetic_tree_viewer/synthetic_tree_viewer/templates/about/developer_resources.jinja2 similarity index 93% rename from synthetic_tree_viewer/synthetic_tree_viewer/templates/about/developer_resources.html rename to synthetic_tree_viewer/synthetic_tree_viewer/templates/about/developer_resources.jinja2 index f8bb44f4a..6aa1583ab 100644 --- a/synthetic_tree_viewer/synthetic_tree_viewer/templates/about/developer_resources.html +++ b/synthetic_tree_viewer/synthetic_tree_viewer/templates/about/developer_resources.jinja2 @@ -1,5 +1,6 @@ -{{extend 'layout.html'}} +{% extends "../layout.jinja2" %} +{% block center %}

      Developer resources

      @@ -36,10 +37,11 @@

      Links to various resources

      Comments

      - {{=plugin_localcomments(filter='url',url=request.url)}} + {# plugin_localcomments(filter='url',url=request.url) #} +{% endblock center %} diff --git a/synthetic_tree_viewer/synthetic_tree_viewer/views/about.py b/synthetic_tree_viewer/synthetic_tree_viewer/views/about.py index dbae428ff..ec9d6497f 100644 --- a/synthetic_tree_viewer/synthetic_tree_viewer/views/about.py +++ b/synthetic_tree_viewer/synthetic_tree_viewer/views/about.py @@ -52,6 +52,8 @@ def about_default_redirect(request): renderer='synthetic_tree_viewer:templates/about/privacy_policy.jinja2') @view_config(route_name='about_licenses', renderer='synthetic_tree_viewer:templates/about/licenses.jinja2') +@view_config(route_name='about_developer_resources', + renderer='synthetic_tree_viewer:templates/about/developer_resources.jinja2') def about_open_tree_of_life(request): # provide view context for a dumb template view_dict = _minimal_about_viewdict(request) From 8c45e6445b9487e636aa57e073d797e0308108a3 Mon Sep 17 00:00:00 2001 From: Jim Allman Date: Tue, 21 Nov 2023 11:29:42 -0500 Subject: [PATCH 39/86] Restore Contact page --- .../templates/contact.jinja2 | 62 +++++++++++++++++++ .../synthetic_tree_viewer/views/about.py | 2 +- .../synthetic_tree_viewer/views/default.py | 7 +++ 3 files changed, 70 insertions(+), 1 deletion(-) create mode 100644 synthetic_tree_viewer/synthetic_tree_viewer/templates/contact.jinja2 diff --git a/synthetic_tree_viewer/synthetic_tree_viewer/templates/contact.jinja2 b/synthetic_tree_viewer/synthetic_tree_viewer/templates/contact.jinja2 new file mode 100644 index 000000000..9e8135598 --- /dev/null +++ b/synthetic_tree_viewer/synthetic_tree_viewer/templates/contact.jinja2 @@ -0,0 +1,62 @@ +{% extends "layout.jinja2" %} + +{% block center %} +
      +

      Contact Us

      + +
      +
      + + + + + + + + + + + + + +
      + + Google Groups logo + + + We have three public google groups:
      + 1. opentreeoflife: general mailing list
      + 2. opentreeoflife-software: software discussion (largely deprecated in favour of Gitter; see below)
      + 3. opentreeoflife-announce: announcements of new releases and features; only admins can post
      +
      + + GitHub logo + + + All of our software is on + GitHub, + and you can leave bug reports and feature request as an + issue in our feedback repo. +
      + + Visit our Gitter room + + + Most of our project conversation happens in a public chat room on + Gitter. Clicking the logo at left will + take you to the room. You can browse without logging in, or use your + GitHub account to join the conversation. +
      + +

      Comments

      + {# plugin_localcomments(filter='url',url=request.url) #} + +
      +
      + +
      + + +{% endblock center %} diff --git a/synthetic_tree_viewer/synthetic_tree_viewer/views/about.py b/synthetic_tree_viewer/synthetic_tree_viewer/views/about.py index ec9d6497f..b309e4e55 100644 --- a/synthetic_tree_viewer/synthetic_tree_viewer/views/about.py +++ b/synthetic_tree_viewer/synthetic_tree_viewer/views/about.py @@ -54,7 +54,7 @@ def about_default_redirect(request): renderer='synthetic_tree_viewer:templates/about/licenses.jinja2') @view_config(route_name='about_developer_resources', renderer='synthetic_tree_viewer:templates/about/developer_resources.jinja2') -def about_open_tree_of_life(request): +def about_misc(request): # provide view context for a dumb template view_dict = _minimal_about_viewdict(request) diff --git a/synthetic_tree_viewer/synthetic_tree_viewer/views/default.py b/synthetic_tree_viewer/synthetic_tree_viewer/views/default.py index 64bf20ae9..3999df5af 100644 --- a/synthetic_tree_viewer/synthetic_tree_viewer/views/default.py +++ b/synthetic_tree_viewer/synthetic_tree_viewer/views/default.py @@ -64,6 +64,13 @@ def home(request): # redirect to default tree view return HTTPSeeOther(location='/opentree/argus') +@view_config(route_name='contact', renderer='synthetic_tree_viewer:templates/contact.jinja2') +def contact(request): + view_dict = get_opentree_services_method_urls(request) + view_dict.update({ + 'taxonSearchContextNames': fetch_current_TNRS_context_names(request), + }) + return view_dict @view_config(route_name='tree_view', renderer='synthetic_tree_viewer:templates/tree_view.jinja2') def tree_view(request): From 242776541885a40643a6f2a706c3522d3bddfad0 Mon Sep 17 00:00:00 2001 From: Jim Allman Date: Tue, 21 Nov 2023 11:34:53 -0500 Subject: [PATCH 40/86] Removing unused About pages (from web2py) --- .../templates/about/credits.html | 12 ----- .../about/materials_and_methods.html | 43 ---------------- .../about/the_source_tree_manager.html | 49 ------------------- .../templates/about/the_synthetic_tree.html | 49 ------------------- 4 files changed, 153 deletions(-) delete mode 100644 synthetic_tree_viewer/synthetic_tree_viewer/templates/about/credits.html delete mode 100644 synthetic_tree_viewer/synthetic_tree_viewer/templates/about/materials_and_methods.html delete mode 100644 synthetic_tree_viewer/synthetic_tree_viewer/templates/about/the_source_tree_manager.html delete mode 100644 synthetic_tree_viewer/synthetic_tree_viewer/templates/about/the_synthetic_tree.html diff --git a/synthetic_tree_viewer/synthetic_tree_viewer/templates/about/credits.html b/synthetic_tree_viewer/synthetic_tree_viewer/templates/about/credits.html deleted file mode 100644 index 62c90d149..000000000 --- a/synthetic_tree_viewer/synthetic_tree_viewer/templates/about/credits.html +++ /dev/null @@ -1,12 +0,0 @@ -{{extend 'layout.html'}} -
      -

      Credits

      -See about for full credits -

      Comments

      - {{=plugin_localcomments(filter='url',url=request.url)}} - -
      - - diff --git a/synthetic_tree_viewer/synthetic_tree_viewer/templates/about/materials_and_methods.html b/synthetic_tree_viewer/synthetic_tree_viewer/templates/about/materials_and_methods.html deleted file mode 100644 index 148c2d0bd..000000000 --- a/synthetic_tree_viewer/synthetic_tree_viewer/templates/about/materials_and_methods.html +++ /dev/null @@ -1,43 +0,0 @@ -{{extend 'layout.html'}} -{{import urllib}} - - -
      -

      Materials and methods

      - -
      -
      - -

      - TODO: What else goes here? Lorem ipsum dolor sit amet, - consectetur adipiscing elit. In bibendum, magna et viverra - tincidunt, nisi leo dapibus massa, sit amet fermentum dui magna a - nunc. Maecenas a ligula libero. Cras id tempus dui. -

      -

      - Nam at vehicula augue. Vestibulum varius ligula ante, sit amet - gravida mi semper non. Nunc ornare bibendum ultrices. Ut nec - porttitor enim. Vivamus luctus semper risus, ac imperdiet ante - pulvinar in. -

      -

      - Vivamus urna lectus, rutrum nec odio ac, ullamcorper sagittis - dolor. Sed lacinia dolor a mauris mollis cursus. Fusce tristique - dictum luctus. Vestibulum ante ipsum primis in faucibus orci - luctus et ultrices posuere cubilia Curae; Nam arcu nisi, pharetra - at felis et, condimentum bibendum tellus. In vitae ante ut elit - mollis auctor sed a tortor. -

      -
      - -
      - -

      Comments

      - {{=plugin_localcomments(filter='url',url=request.url)}} - -
      - - diff --git a/synthetic_tree_viewer/synthetic_tree_viewer/templates/about/the_source_tree_manager.html b/synthetic_tree_viewer/synthetic_tree_viewer/templates/about/the_source_tree_manager.html deleted file mode 100644 index 1241bb7fa..000000000 --- a/synthetic_tree_viewer/synthetic_tree_viewer/templates/about/the_source_tree_manager.html +++ /dev/null @@ -1,49 +0,0 @@ -{{extend 'layout.html'}} - -
      -

      About Phylografter, the source tree manager

      - -
      -
      -

      - TODO: What else goes here? Lorem ipsum dolor sit amet, - consectetur adipiscing elit. In bibendum, magna et viverra - tincidunt, nisi leo dapibus massa, sit amet fermentum dui magna a - nunc. Maecenas a ligula libero. Cras id tempus dui. -

      -

      - Vivamus urna lectus, rutrum nec odio ac, ullamcorper sagittis - dolor. Sed lacinia dolor a mauris mollis cursus. Fusce tristique - dictum luctus. Vestibulum ante ipsum primis in faucibus orci - luctus et ultrices posuere cubilia Curae; Nam arcu nisi, pharetra - at felis et, condimentum bibendum tellus. In vitae ante ut elit - mollis auctor sed a tortor. -

      -

      - Ut magna dolor, ultricies nec leo sed, tempor iaculis orci. - Integer dignissim odio nec odio imperdiet, ac ultrices sapien - tristique. In a urna ut eros hendrerit fringilla nec ut ligula. - Sed pulvinar sem vel turpis dapibus mattis. Etiam pretium nibh - quis turpis vulputate suscipit. Suspendisse consequat, dolor - vitae aliquet rhoncus, ipsum nisi tincidunt odio, non pretium - felis erat nec elit. Nullam quis mi lobortis orci volutpat - commodo in iaculis nulla. Mauris sit amet ante quis lectus - vestibulum varius sed vel nisi. -

      -

      - Nam at vehicula augue. Vestibulum varius ligula ante, sit amet - gravida mi semper non. Nunc ornare bibendum ultrices. Ut nec - porttitor enim. Vivamus luctus semper risus, ac imperdiet ante - pulvinar in. -

      -
      -
      - -

      Comments

      - {{=plugin_localcomments(filter='url',url=request.url)}} - -
      - - diff --git a/synthetic_tree_viewer/synthetic_tree_viewer/templates/about/the_synthetic_tree.html b/synthetic_tree_viewer/synthetic_tree_viewer/templates/about/the_synthetic_tree.html deleted file mode 100644 index d38ffcbb0..000000000 --- a/synthetic_tree_viewer/synthetic_tree_viewer/templates/about/the_synthetic_tree.html +++ /dev/null @@ -1,49 +0,0 @@ -{{extend 'layout.html'}} - -
      -

      About the synthetic tree

      - -
      -
      -

      - TODO: What else goes here? Lorem ipsum dolor sit amet, - consectetur adipiscing elit. In bibendum, magna et viverra - tincidunt, nisi leo dapibus massa, sit amet fermentum dui magna a - nunc. Maecenas a ligula libero. Cras id tempus dui. -

      -

      - Vivamus urna lectus, rutrum nec odio ac, ullamcorper sagittis - dolor. Sed lacinia dolor a mauris mollis cursus. Fusce tristique - dictum luctus. Vestibulum ante ipsum primis in faucibus orci - luctus et ultrices posuere cubilia Curae; Nam arcu nisi, pharetra - at felis et, condimentum bibendum tellus. In vitae ante ut elit - mollis auctor sed a tortor. -

      -

      - Ut magna dolor, ultricies nec leo sed, tempor iaculis orci. - Integer dignissim odio nec odio imperdiet, ac ultrices sapien - tristique. In a urna ut eros hendrerit fringilla nec ut ligula. - Sed pulvinar sem vel turpis dapibus mattis. Etiam pretium nibh - quis turpis vulputate suscipit. Suspendisse consequat, dolor - vitae aliquet rhoncus, ipsum nisi tincidunt odio, non pretium - felis erat nec elit. Nullam quis mi lobortis orci volutpat - commodo in iaculis nulla. Mauris sit amet ante quis lectus - vestibulum varius sed vel nisi. -

      -

      - Nam at vehicula augue. Vestibulum varius ligula ante, sit amet - gravida mi semper non. Nunc ornare bibendum ultrices. Ut nec - porttitor enim. Vivamus luctus semper risus, ac imperdiet ante - pulvinar in. -

      -
      -
      - -

      Comments

      - {{=plugin_localcomments(filter='url',url=request.url)}} - -
      - - From 0b2ad4bd2206ec9711d016eda8fc84c60e04ae2f Mon Sep 17 00:00:00 2001 From: Jim Allman Date: Tue, 21 Nov 2023 22:27:27 -0500 Subject: [PATCH 41/86] Finish the About > References page (lotsa logic) --- .../opentreewebapputil.py | 32 +++++- .../templates/about/references.jinja2 | 17 +-- .../synthetic_tree_viewer/views/about.py | 102 +++++++++++++++++- 3 files changed, 136 insertions(+), 15 deletions(-) diff --git a/synthetic_tree_viewer/synthetic_tree_viewer/opentreewebapputil.py b/synthetic_tree_viewer/synthetic_tree_viewer/opentreewebapputil.py index cfe8bd9b8..1788bfbe5 100644 --- a/synthetic_tree_viewer/synthetic_tree_viewer/opentreewebapputil.py +++ b/synthetic_tree_viewer/synthetic_tree_viewer/opentreewebapputil.py @@ -1,5 +1,6 @@ # adapted from web2py (applications.opentree.modules.opentreewebapputil) import os +import re import configparser _CONF_OBJ_DICT = {} @@ -88,9 +89,10 @@ def get_currently_deployed_opentree_branch(request): pass return branch_name -def latest_CrossRef_URL(): - # TODO - pass +def latest_CrossRef_URL(url): + if (not url): + return '' + return url.replace('http://dx.doi.org/', 'https://doi.org/') def get_opentree_services_domains(request): ''' @@ -189,3 +191,27 @@ def unique_ordered_list(seq): seen_add = seen.add return [ x for x in seq if x not in seen and not seen_add(x)] +treebase_deposit_doi = re.compile('//purl.org/phylo/treebase/phylows/study/TB2:S(?P\d+)') +def get_data_deposit_message(raw_deposit_doi): + # Returns a *compact* hyperlink (HTML) to study data, or an empty string if + # no DOI/URL is found. Some cryptic dataDeposit URLs require more + # explanation or a modified URL to be more web-friendly. + # + # NOTE that we maintain a client-side counterpart in + # curator/static/js/study-editor.js > getDataDepositMessage + raw_deposit_doi = raw_deposit_doi.strip() + if raw_deposit_doi == '': + return '' + + # TreeBASE URLs should point to a web page (vs RDF) + # EXAMPLE: http://purl.org/phylo/treebase/phylows/study/TB2:S13451 + # => http://treebase.org/treebase-web/search/study/summary.html?id=13451 + treebase_match = treebase_deposit_doi.search(raw_deposit_doi) + if treebase_match: + return ('Data in Treebase' % treebase_match.group('treebase_id')) + + # TODO: Add other substitutions? + + return ('Data deposit DOI/URL' % raw_deposit_doi) + diff --git a/synthetic_tree_viewer/synthetic_tree_viewer/templates/about/references.jinja2 b/synthetic_tree_viewer/synthetic_tree_viewer/templates/about/references.jinja2 index 50aa0c03d..41240171c 100644 --- a/synthetic_tree_viewer/synthetic_tree_viewer/templates/about/references.jinja2 +++ b/synthetic_tree_viewer/synthetic_tree_viewer/templates/about/references.jinja2 @@ -1,7 +1,6 @@ {% extends "../layout.jinja2" %} {% block center %} -{# import urllib #} {# from pprint import pprint #}