diff --git a/.editorconfig b/.editorconfig deleted file mode 100644 index c2cdfb8..0000000 --- a/.editorconfig +++ /dev/null @@ -1,21 +0,0 @@ -# EditorConfig helps developers define and maintain consistent -# coding styles between different editors and IDEs -# editorconfig.org - -root = true - - -[*] - -# Change these settings to your own preference -indent_style = space -indent_size = 2 - -# We recommend you to keep these unchanged -end_of_line = lf -charset = utf-8 -trim_trailing_whitespace = true -insert_final_newline = true - -[*.md] -trim_trailing_whitespace = false diff --git a/.gitattributes b/.gitattributes deleted file mode 100644 index 0fcd6c2..0000000 --- a/.gitattributes +++ /dev/null @@ -1,2 +0,0 @@ -# Set default behaviour, in case users don't have core.autocrlf set. -* text=crlf \ No newline at end of file diff --git a/.gitignore b/.gitignore deleted file mode 100644 index e0a8140..0000000 --- a/.gitignore +++ /dev/null @@ -1,9 +0,0 @@ -# files -.DS_Store - -# directoroies -.idea/* -node_modules/* -src/* -generated/* -bower_components/* diff --git a/Gruntfile.js b/Gruntfile.js deleted file mode 100644 index 1f5f45d..0000000 --- a/Gruntfile.js +++ /dev/null @@ -1,243 +0,0 @@ -/** - * This file is used to build Handsontable documentation. - * - * Installation: - * 1. Install Grunt CLI (`npm install -g grunt-cli`) - * 1. Install Grunt 0.4.0 and other dependencies (`npm install`) - * - * Build: - * Execute `grunt` from root directory of this directory (where Gruntfile.js is) - * - * Result: - * Building Handsontable docs will create files: - * - generated/* - * - * See http://gruntjs.com/getting-started for more information about Grunt - */ - -var fs = require('fs'); - -module.exports = function (grunt) { - var - DOCS_PATH = 'generated', - HOT_SRC_PATH = 'src/handsontable', - HOT_BRANCH = 'master', - HOT_REPO = 'https://github.com/handsontable/handsontable.git', - querystring = require('querystring'); - - grunt.initConfig({ - pkg: grunt.file.readJSON('package.json'), - - clean: { - dist: [DOCS_PATH], - release: [DOCS_PATH, HOT_SRC_PATH, 'bower_components', 'node_modules'] - }, - - jsdoc: { - docs: { - src: [ - HOT_SRC_PATH + '/src/**/*.js', - 'tutorials/INDEX.md', - '!' + HOT_SRC_PATH + '/src/**/*.spec.js', - '!' + HOT_SRC_PATH + '/src/3rdparty/walkontable/src/**/*.js', - '!' + HOT_SRC_PATH + '/src/3rdparty/walkontable/test/**/*.js', - '!' + HOT_SRC_PATH + '/src/intro.js', - '!' + HOT_SRC_PATH + '/src/outro.js', - // temp fix for file using arrow function - waiting for jsdoc support - '!' + HOT_SRC_PATH + '/src/plugins/contextMenuCopyPaste/contextMenuCopyPaste.js' - ], - jsdoc: 'node_modules/.bin/' + (/^win/.test(process.platform) ? 'jsdoc.cmd' : 'jsdoc'), - options: { - verbose: true, - destination: DOCS_PATH, - configure: 'conf.json', - template: './', - tutorials: 'tutorials', - 'private': false, - query: '' - } - } - }, - - less: { - dist: { - src: 'less/hot/**/docs.less', - dest: 'static/styles/docs.css' - } - }, - - copy: { - dist: { - files: [{ - expand: true, - cwd: 'src', - dest: 'generated', - src: [ - 'static/**' - ] - }] - } - }, - - bowercopy: { - options: { - srcPrefix: 'bower_components' - }, - scripts: { - options: { - destPrefix: 'generated/bower_components' - }, - files: { - 'jquery/jquery.min.js': 'jquery/dist/jquery.min.js', - 'fastclick': 'fastclick', - 'jquery.cookie': 'jquery.cookie', - 'jquery-placeholder': 'jquery-placeholder', - 'modernizr': 'modernizr', - 'handsontable': 'handsontable', - 'zeroclipboard': 'zeroclipboard', - 'pikaday': 'pikaday', - "moment": "moment", - "backbone": "backbone", - "backbone.relational": "backbone.relational", - "highlightjs": "highlightjs", - "chroma-js": "chroma-js", - "raphael": "raphael", - "bootstrap": "bootstrap", - "numeraljs": "numeraljs", - "font-awesome": "font-awesome", - "lodash": "lodash" - } - } - }, - - watch: { - files: ['tutorials/**', 'less/**', 'static/**', 'tmpl/**'], - tasks: [], - options: { - debounceDelay: 250 - }, - dist: { - files: ['generated/**'], - options: { - livereload: true - } - } - }, - - connect: { - dist: { - options: { - port: 5455, - hostname: '0.0.0.0', - base: 'generated', - livereload: true - } - } - }, - - open: { - dist: { - path: 'http://localhost:5455' - } - }, - - robotstxt: { - dist: { - dest: DOCS_PATH + '/', - policy: [ - { - ua: '*', - allow: '/' - }, - { - host: 'docs.handsontable.com' - } - ] - } - }, - - sitemap: { - dist: { - pattern: ['generated/*.html', '!generated/tutorial-40*.html'], - siteRoot: 'generated/' - } - }, - - gitclone: { - handsontable: { - options: { - branch: HOT_BRANCH, - repository: HOT_REPO, - directory: HOT_SRC_PATH, - verbose: true - } - } - }, - - gitpull: { - handsontable: { - options: { - branch: HOT_BRANCH, - cwd: HOT_SRC_PATH, - verbose: true - } - } - } - }); - - grunt.registerTask('server', [ - 'connect', - 'open', - 'watch' - ]); - - grunt.registerTask('default', 'Create documentation for Handsontable', function () { - var timer; - - grunt.task.run('update-hot'); - - timer = setInterval(function () { - if (!grunt.file.isFile(HOT_SRC_PATH + '/package.json')) { - return; - } - clearInterval(timer); - grunt.task.run('build'); - }, 50); - }); - - grunt.registerTask('update-hot', 'Update Handsontable repository', function () { - if (fs.existsSync(HOT_SRC_PATH)) { - grunt.task.run('gitpull'); - } else { - grunt.task.run('gitclone'); - } - }); - - grunt.registerTask('build', 'Generate documentation for Handsontable', function () { - var hotPackage; - - grunt.task.run('less', 'copy', 'bowercopy', 'robotstxt'); - - hotPackage = grunt.file.readJSON(HOT_SRC_PATH + '/package.json'); - grunt.config.set('jsdoc.docs.options.query', querystring.stringify({ - version: hotPackage.version - })); - - grunt.task.run('jsdoc'); - - grunt.task.run('sitemap'); - }); - - grunt.loadNpmTasks('grunt-bowercopy'); - grunt.loadNpmTasks('grunt-contrib-clean'); - grunt.loadNpmTasks('grunt-contrib-connect'); - grunt.loadNpmTasks('grunt-contrib-copy'); - grunt.loadNpmTasks('grunt-contrib-less'); - grunt.loadNpmTasks('grunt-contrib-watch'); - grunt.loadNpmTasks('grunt-exec'); - grunt.loadNpmTasks('grunt-git'); - grunt.loadNpmTasks('grunt-jsdoc'); - grunt.loadNpmTasks('grunt-open'); - grunt.loadNpmTasks('grunt-robots-txt'); - grunt.loadNpmTasks('grunt-sitemap'); -}; diff --git a/LICENSE b/LICENSE deleted file mode 100644 index 05af469..0000000 --- a/LICENSE +++ /dev/null @@ -1,23 +0,0 @@ -(The MIT License) - -Copyright (c) 2012-2014 Marcin Warpechowski -Copyright (c) 2015 Handsoncode sp. z o.o. - -Permission is hereby granted, free of charge, to any person obtaining -a copy of this software and associated documentation files (the -'Software'), to deal in the Software without restriction, including -without limitation the rights to use, copy, modify, merge, publish, -distribute, sublicense, and/or sell copies of the Software, and to -permit persons to whom the Software is furnished to do so, subject to -the following conditions: - -The above copyright notice and this permission notice shall be -included in all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND, -EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF -MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. -IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY -CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, -TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE -SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. diff --git a/bower.json b/bower.json deleted file mode 100644 index 8e758c4..0000000 --- a/bower.json +++ /dev/null @@ -1,35 +0,0 @@ -{ - "name": "handsontable-docs", - "version": "0.1.0", - "homepage": "http://docs.handsontable.com/", - "description": "Handsontable is a minimalist Excel-like data grid editor for HTML & JavaScript", - "authors": [ - "Handsoncode sp. z o.o. " - ], - "license": "MIT", - "ignore": [ - "**/.*", - "node_modules", - "bower_components" - ], - "dependencies": { - "backbone": "~1.1.2", - "backbone.relational": "~0.9.0", - "highlightjs": "~8.4.0", - "chroma-js": "~0.6.1", - "raphael": "~2.1.4", - "bootstrap": "~3.3.4", - "numeraljs": "~1.5.3", - "font-awesome": "~4.3.0", - "lodash": "~3.6.0", - "moment": "~2.9.0", - "pikaday": "~1.3.2", - "zeroclipboard": "~2.2.0", - "handsontable": "~0.15.0-beta2", - "modernizr": "~2.8.3", - "jquery-placeholder": "~2.1.1", - "jquery.cookie": "~1.4.1", - "jquery": "~2.1.3", - "fastclick": "~1.0.6" - } -} diff --git a/conf.json b/conf.json deleted file mode 100644 index 2e7f5a7..0000000 --- a/conf.json +++ /dev/null @@ -1,38 +0,0 @@ -{ - "tags": { - "allowUnknownTags" : true - }, - "plugins": [ - "node_modules/grunt-jsdoc/node_modules/jsdoc/plugins/markdown", - "plugins/pluginTag", - "plugins/utilTag" - ], - "templates": { - "cleverLinks": true, - "monospaceLinks": true, - "default": { - "outputSourceFiles" : true - }, - "applicationName": "Handsontable", - "disqus": "", - "googleAnalytics": "UA-33932793-1", - "openGraph": { - "title": "Handsontable Documentation", - "type": "website", - "image": "", - "site_name": "Handsontable", - "url": "http://docs.handsontable.com" - }, - "meta": { - "title": "Handsontable", - "description": "JavaScript data grid editor. Excel-like grid editing with HTML & JavaScript", - "keyword": "data grid" - }, - "linenums": true - }, - "markdown": { - "parser": "gfm", - "hardwrap": true, - "tags": ["examples", "description"] - } -} diff --git a/less/hot/_app.less b/less/hot/_app.less deleted file mode 100644 index f356d39..0000000 --- a/less/hot/_app.less +++ /dev/null @@ -1,389 +0,0 @@ -@import "_jsdoc"; - -/* body */ -body { - font-family: "Open Sans", "Helvetica Neue", Helvetica, Roboto, Arial, sans-serif!important; - color: #393939; - background-color: #fff; -} -h1, h2, h3, h4, h5, h6 { - font-family: "Open Sans", "Helvetica Neue", Helvetica, Roboto, Arial, sans-serif!important; -} -a, a:visited, a:hover, a:visited:hover { - color: #037BD2; - text-decoration: none; - font-family: "Open Sans", "Helvetica Neue", Helvetica, Roboto, Arial, sans-serif!important; -} -hr { - height: 0; - border: solid #d7d7d7; - border-width: 1px 0 0; - clear: both; - margin: 1.25rem 0 1.1875rem; -} -.row { - max-width: 75em; -} -i.fa-external-link { - font-size: 11px; -} -a.button, a.button:hover { - color: #fff; -} -.c-orange { - color: #FF9800; -} -.c-green { - color: #8BC34A; -} -.c-blue { - color: #0091EA; -} -.c-lightblue { - color: #03A9F4; -} -.c-brown { - color: #795548; -} -.c-deeporange { - color: #FF5722; -} -.c-bluegrey { - color: #607D8B; -} -.c-pink { - color: #C51162; -} -.c-red { - color: #D50000; -} -.c-purple { - color: #6A1B9A; -} -.c-grey { - color: #707070; -} -.yellow { - color: #FFEB3B; -} -.row-grey { - background-color: #f7f7f7; -} -.row-dark-grey { - background-color: #222; -} -.row-blue { - background-color: #07A1E2; -} -.row-lightgreen { - background-color: #00B8D4; -} -.row-silvergrey { - background-color: #455A64; -} - -/* header */ -header { - width: 100%; - padding: 1rem 0 15px; - position: fixed; - top: 0; - z-index: 300; - background: #045ab0; - & .name img { - max-width: 181px; - margin: 0 1rem; - position: relative; - top: -2px; - } - nav.top-bar .title-area { - padding: 0; - } - nav.top-bar, .top-bar-section ul, .top-bar-section ul li, .top-bar-section ul li a, - & .top-bar-section ul li, & .top-bar-section ul li a, & .top-bar.expanded .title-area { - background-color: #045ab0!important; - transition: none!important; - } - & .top-bar-section li:not(.has-form) a:not(.button) { - padding: 0 0.875rem; - } - & nav.expanded .top-bar-section li:not(.has-form) a:not(.button) { - padding: .26rem 0.875rem; - } - & .top-bar.expanded .toggle-topbar a span::after { - opacity: 0.5; - box-shadow: 0 0 0 1px #fff, 0 7px 0 1px #fff, 0 14px 0 1px #fff; - } - & nav.expanded .top-bar-section { - margin-top: 2rem; - } - & .top-bar-section ul { - position: relative; - top: 5px; - } - & .top-bar-section ul li { - margin: 0 0.875rem; - } - & .top-bar-section ul li a { - line-height: 36px!important; - font-weight: 300!important; - } - & .top-bar-section ul > li:hover > a { - padding: 0; - box-shadow: 0 1px 0 #4B96E0 inset, -1px 0 0 #4B96E0 inset, 1px 0 0 #4B96E0 inset, 0 -1px 0 #4B96E0 inset; - } - & .top-bar-section .right li .dropdown { - left: 0; - z-index: 300; - } - & .top-bar-section .dropdown li { - margin: 0; - } - & .top-bar-section ul .dropdown li a, - & .top-bar-section li.has-dropdown:hover > a { - box-shadow: 0 1px 0 #4B96E0 inset, -1px 0 0 #4B96E0 inset, 1px 0 0 #4B96E0 inset; - } - & .top-bar-section ul .dropdown li a:hover { - background-color: #0760BA!important; - } - & .top-bar-section ul .dropdown li a:last-child { - box-shadow: 0 1px 0 #4B96E0 inset, -1px 0 0 #4B96E0 inset, 1px 0 0 #4B96E0 inset, 0 -1px 0 #4B96E0 inset; - } - & .top-bar-section ul .has-dropdown > a:after { - margin-top: -7px; - } - & .top-bar-section h5 { - opacity: 0.7; - } -} - -/* active menu */ -.documentation-el { - box-shadow: 0 1px 0 #4B96E0 inset, -1px 0 0 #4B96E0 inset, 1px 0 0 #4B96E0 inset, 0 -1px 0 #4B96E0 inset; -} - -/* banner */ -.banner { - width: 100%; - position: fixed; - top: 77px; - color: #fff; - z-index: 200; - background: #1976D2; - & .row { - padding: 0 1.5rem; - } -} -& nav, & .breadcrumbs { - border: none; - background-color: #f2f2f2; -} -& .breadcrumbs { - margin-bottom: 1rem; - padding: 1rem 0; - font-size: 0.9231rem; - background: #fff; - span { - color: #676767; - } - & > * { - color: #037BD2; - font-size: 12px; - font-weight: 300; - text-transform: none; - } - & > *:before { - margin: 0 0.45rem; - font-size: 12px; - } -} - -/* Static pages */ -.static-content { - position: relative; - h3 { - margin: 1rem 0; - font-weight: 400; - font-size: 18px; - } - .head-gap { - margin-top: 1rem; - } - .edit-doc { - padding: 0.2rem 0.8rem 0.2rem; - position: absolute; - top: -43px; - color: #fff; - right: 0; - font-size: 12px; - background: #045AB0; - } - .edit-doc:hover { - background-color: #1C72C8; - } - .codeLayout { - margin-top: 2rem; - position: relative; - } - .buttons { - margin-bottom: 0.3rem; - position: absolute; - top: 2px; - right: 2px; - } - .buttons button, button.intext-btn { - margin: 0; - padding: .5rem .5rem; - color: #fff; - font-size: 12px; - border: none; - background: #9e9e9e; - &.jsFiddleLink { - background-color: #8BC34A; - } - &.jsFiddleLink:hover { - background-color: #7CB342; - } - &.dump { - background-color: #607D8B; - } - &.dump:hover { - background-color: #546E7A; - } - } - button:hover { - background-color: #b2b2b2; - } - button i.fa { - margin-right: 0.4rem; - } - .index-list { - margin-bottom: 1rem; - border-bottom: 1px solid #ddd; - } - code { - padding: 0.11111rem 0.27778rem 0.05556rem; - border-color: #dfdfdf; - border-style: solid; - border-width: 1px; - color: #333333; - font-family: Consolas, "Liberation Mono", Courier, monospace; - font-weight: normal; - background-color: #f8f8f8; - } - code.hljs { - padding: 0.5rem; - } - #positions { - font-size: 13px; - } - input[type="search"] { - width: 219px; - margin: 1rem 0; - padding: 0.3rem 0.5rem; - } - .checklist { - margin-bottom: 1rem; - label { - margin: 0.5rem 1rem 0.5rem 0; - font-size: 13px; - display: inline; - } - input[type="checkbox"] { - margin: -3px 0.2rem 0 0; - vertical-align: middle; - } - } - .part-left-container { - margin: 2rem 0; - & > div { - width: 35%; - float: left; - } - &.callbacks-container { - margin-bottom: 0; - } - &.callbacks-container > div { - width: 50%; - } - & #example1_events { - height: 165px; - padding: 0.5rem; - overflow: auto; - font-size: 11px; - border: 1px solid #CCC; - } - & #graphael-example { - text-align: center; - } - & .aggregation p { - font-size: 13px; - } - } - .clear-log { - margin-top: 0.5rem; - text-align: right; - } - & #hooksList { - padding: 0; - & li { - width: 33%; - float: left; - list-style: none; - } - & input[type="checkbox"] { - margin-right: 0.5rem; - position: relative; - top: 2px; - } - } - .error-container { - margin-top: 4rem; - & h1, & h3 { - margin-top: 0.5rem; - text-align: center; - } - & h3 { - font-style: italic; - } - & .hot { - margin: 3rem auto 0; - } - & .cell-dark { - background-color: #222; - } - } -} - -/* Footer */ -.footer { - margin-top: 5rem; - padding-bottom: 1rem; - text-align: right; - & .footer-menu { - padding: 2rem 0 1rem; - border-top: 1px solid #efefef; - } - & .footer-menu .columns { - margin: 1rem auto 3rem; - } - & ul li p { - margin-bottom: 0; - font-weight: 300; - font-size: 13px; - } - & ul li.heading p { - margin-bottom: 0.875rem; - font-weight: 400; - font-size: 13px; - } - & ul li > a { - margin-bottom: 14px; - font-weight: 300; - font-size: 13px; - } - & .copyright span { - font-size: 12px; - font-weight: 500; - } -} diff --git a/less/hot/_handsontable.less b/less/hot/_handsontable.less deleted file mode 100644 index 682878b..0000000 --- a/less/hot/_handsontable.less +++ /dev/null @@ -1,167 +0,0 @@ -/* overriding foundation for handsontable */ - -.main .hot, .hot { - color: #000; - td, th, input, select { - padding: 0 4px; - font-size: 13px; - font-family: Verdana, Helvetica, Arial, FreeSans, sans-serif; - } - .handsontable table { - -webkit-box-shadow: none; - box-shadow: none; - } - thead .htGroupIndicatorContainer { - padding: 0; - } - textarea { - transition: none; - background-color: #fff; - } - input { - margin: 0; - padding: 1px 5px 0; - border: none; - box-shadow: 0 0 0 2px #5292F7 inset; - } - input[type='checkbox'] { - padding: 0; - box-shadow: none; - } - select, select:hover { - padding: 0; - border: 1px solid #ccc; - font-size: 13px; - color: #393939; - background: #fff; - } - .currentRow { - background-color: #E7E8EF; - } - .currentCol { - background-color: #F9F9FB; - } -} - -/* context menu */ -.htContextMenu table tbody tr td { - font-size: 12px; - font-family: Verdana, Helvetica, Arial, FreeSans, sans-serif; -} - -/* datepicker */ -.htDatepickerHolder button { - transition: none; -} - -/* tutorials */ - -/* scrollable table */ -.scroll-container { - width: 584px; - height: 320px; - margin: 1rem 0 1rem; - overflow: hidden; - .hot { - margin: 0; - } -} -.fixed-container { - width: 587px; - .hot table.htCore { - -webkit-box-shadow: 1px 2px 5px rgba(0, 0, 0, 0.4); - box-shadow: 1px 2px 5px rgba(0, 0, 0, 0.4); - } -} -.ipad-container { - width: 100%; - height: 389px; -} -.ajax-container { - .controls { - - } - label { - margin-left: 1rem; - display: inline; - } - input[type="checkbox"] { - margin: -3px 5px 0 0; - vertical-align: middle; - } - pre { - margin: 1rem 0; - font-size: 13px - } -} -.htCore td.customClass { - color: #f8f8ff; - background: #1E90FF; -} -.pagination { - margin: 1rem 0; - a { - padding: 2px 7px; - font-size: 14px; - border: 1px solid #ccc; - } -} -.htCommentTextArea { - font-size: 13px; - padding: 0.2rem 0.5rem; -} - -/* Boostrap demo */ -.bootstrap-container { - width: 567px; - @import "bower_components/bootstrap/less/bootstrap.less"; - /* bootstrap reset */ - //.handsontable .table th, .handsontable .table td { - // border-top: none; - //} - .handsontable tr { - background: #fff; - } - .handsontable td { - background-color: inherit !important; - } - .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: 1px solid #CCCCCC; - } - /* table-bordered */ - .handsontable .table-bordered { - border: 0; - border-collapse: separate; - } - .handsontable .table-bordered th, - .handsontable .table-bordered td { - border-left: none; - } - .handsontable .table-bordered th:first-child, - .handsontable .table-bordered td:first-child { - border-left: 1px solid #CCCCCC; - } - .table > tbody > tr > td, .table > tbody > tr > th, .table > tfoot > tr > td, .table > tfoot > tr > th, .table > thead > tr > td, .table > thead > tr > th { - line-height: 21px; - padding: 0 4px; - } - .col-lg-1.handsontable, .col-lg-10.handsontable, .col-lg-11.handsontable, .col-lg-12.handsontable, - .col-lg-2.handsontable, .col-lg-3.handsontable, .col-lg-4.handsontable, .col-lg-5.handsontable, .col-lg-6.handsontable, .col-lg-7.handsontable, .col-lg-8.handsontable, .col-lg-9.handsontable, - .col-md-1.handsontable, .col-md-10.handsontable, .col-md-11.handsontable, .col-md-12.handsontable, - .col-md-2.handsontable, .col-md-3.handsontable, .col-md-4.handsontable, .col-md-5.handsontable, .col-md-6.handsontable, .col-md-7.handsontable, .col-md-8.handsontable, .col-md-9.handsontable - .col-sm-1.handsontable, .col-sm-10.handsontable, .col-sm-11.handsontable, .col-sm-12.handsontable, - .col-sm-2.handsontable, .col-sm-3.handsontable, .col-sm-4.handsontable, .col-sm-5.handsontable, .col-sm-6.handsontable, .col-sm-7.handsontable, .col-sm-8.handsontable, .col-sm-9.handsontable - .col-xs-1.handsontable, .col-xs-10.handsontable, .col-xs-11.handsontable, .col-xs-12.handsontable, - .col-xs-2.handsontable, .col-xs-3.handsontable, .col-xs-4.handsontable, .col-xs-5.handsontable, .col-xs-6.handsontable, .col-xs-7.handsontable, .col-xs-8.handsontable, .col-xs-9.handsontable { - padding-left: 0; - padding-right: 0; - } - .table-striped > tbody > tr:nth-of-type(even) { - background-color: #FFF; - } -} diff --git a/less/hot/_jsdoc.less b/less/hot/_jsdoc.less deleted file mode 100644 index 2cb6a11..0000000 --- a/less/hot/_jsdoc.less +++ /dev/null @@ -1,602 +0,0 @@ -@navWidth: 270px; -@colorSubtitle: rgb(119, 156, 52); -@colorRed: rgb(238, 125, 125); -@colorLink: #037BD2; -@colorBgNavi: #f2f2f2; - -body { - /* prevent wrapper->body margin collapsing */ - padding-top: 0.1px; -} - -.font-description () { - font-family: "Open Sans", "Helvetica Neue", Helvetica, Roboto, Arial, sans-serif; -} -#wrapper { - margin-top: 5rem; - z-index: 1; - .nav-fix { - width: 270px; - height: 1px; - } -} -.tag-since, .tag-default { - margin-left: 0; -} -.navigation { - width: @navWidth; - min-width: @navWidth; - position: fixed; - top: 6rem; - border: 1px solid #ececec; - background-color: @colorBgNavi; - padding: 10px 0; - - .applicationName { - margin: 0; - margin-top: 15px; - padding: 10px 15px; - color: #4267B6; - - a { - color: #4267B6; - } - } - - .version { - font-size: 10px; - color: #454545; - } - - .search { - padding: 0.2rem 0.5rem 0; - - input { - margin-bottom: 0.5rem; - background-color: #fff; - color: #909090; - font-weight: 300; - box-shadow: none; - border-color: #ccc; - } - } - .app-name { - margin: 0; - padding: 0 12px 6px; - font-size: 12px; - text-align: left; - color: #838383; - } - .list { - margin: 0; - padding: 0; - position: relative; - overflow: auto; - height: 100%; - list-style: none; - } - li.item { - margin: 10px 12px 10px 18px; - a { - color: #037BD2; - &:hover { - color: #037BD2; - } - &.active-link { - font-weight: 600; - } - &.external:after { - margin-top: -2px; - padding-left: 4px; - display: inline-block; - font: normal normal normal 10px/1 FontAwesome; - content: "\f08e"; - } - } - .title { - cursor: pointer; - position: relative; - display: block; - font-size: 0.8em; - a { - padding-bottom: 6px; - display: block; - font-size: 13px; - color: #393939; - cursor: default; - &:hover { - color: #454545; - } - &:after { - content: "\f107"; - font-family: FontAwesome; - color: #B5B5B5; - font-size: 17px; - position: absolute; - top: -3px; - right: 4px; - } - } - .static { - display: block; - border-radius: 3px; - background-color: @colorSubtitle; - color: #000; - font-size: 0.7em; - padding: 2px 4px; - float: right; - } - } - - .subtitle { - margin: 6px 0; - font-size: 14px; - display: block; - } - - - ul { - & > li { - font-size: 13px; - padding: 0.2rem 0; - } - } - - .itemMembers { - margin-bottom: 0.7rem; - display: none; - list-style: square; - } - } - .sublist { - .li { - list-style: none; - } - p.header { - margin: 16px 12px 6px; - padding-top: 1rem; - font-size: 16px; - font-weight: 400; - color: #838383; - border-top: 1px solid rgb(221, 221, 221); - } - p.subheader { - margin: 16px 12px 6px; - font-size: 14px; - color: #61ba01; - } - .itemMembers { - margin: 0 0 0 0.5rem; - padding: 0; - list-style: none!important; - li { - margin-left: 0.4rem; - } - a:hover { - color: #118AE2; - } - } - } - - .sublist.demos { - .header { - margin: 16px 12px 12px; - } - } - - .sublist.not-found { - display: none; - text-align: center; - - .header { - margin: 16px 12px 12px; - } - } - -} - -.main { - width: 100%; - padding: 20px 20px; - .page-title { - display: none; - } - - h1 { - font-weight: 600; - font-size: 1.6em; - margin: 0; - } - - h2 { - font-weight: 400; - font-size: 1.5em; - } - - h3 { - font-weight: bold; - font-size: 14px; - margin: 5px 0; - } - - h4 { - font-weight: bold; - font-size: 1em; - } - - //compensate the hashtag links scrolling - h3::before, - h4::before { - display: block; - content: " "; - margin-top: -6rem; - height: 6rem; - visibility: hidden; - } - - h5 { - font-weight: bold; - font-size: 14px; - } - - dd { - font-size: 14px; - } - kbd { - background-color: #e7e7e7; - background-image: -webkit-linear-gradient(#fefefe, #e7e7e7); - background-image: linear-gradient(#fefefe, #e7e7e7); - background-repeat: repeat-x; - display: inline-block; - padding: 3px 7px; - font: 11px Consolas, "Liberation Mono", Menlo, Courier, monospace; - line-height: 1; - color: #000; - border: 1px solid #cfcfcf; - border-radius: 2px; - } - - h4.name { - span.type-signature { - display: inline-block; - border-radius: 3px; - background-color: gray; - color: #fff; - font-size: 0.9em; - padding: 2px 4px; - } - - span.type { - margin-left: 5px; - } - - span.glyphicon { - display: inline-block; - vertical-align: middle; - color: #e1e1e1; - margin-left: 7px; - } - - span.returnType { - margin-left: 3px; - background-color: transparent!important; - color: gray!important; - } - } - h5 { - span.returnType { - margin-left: 3px; - background-color: transparent!important; - color: gray!important; - } - .return-description { - font-weight: normal; - } - } - - - span.static { - display: inline-block; - border-radius: 3px; - background-color: @colorSubtitle!important; - color: #fff; - font-size: 0.7em; - padding: 2px 4px; - margin-right: 8px; - } - - span.number { - background-color: gray!important; - } - - span.string { - background-color: gray!important; - } - - span.object { - background-color: @colorLink!important; - } - - span.array { - background-color: @colorLink!important; - } - - span.boolean { - background-color: @colorRed!important; - } - - .subsection-title { - font-size: 14px; - margin-top: 30px; - color: @colorSubtitle; - } - - .description { - margin-top: 10px; - font-size: 14px; - - p { - font-size: 14px; - } - } - - .tag-source { - position: absolute; - top: 17px; - right: 0; - font-size: 10px; - a { - color: #037BD2; - } - } - dt { - position: relative; - } - dt.tag-source { - margin-top: 5px; - } - - dt.tag-todo { - font-size: 10px; - display: inline-block; - background-color: @colorLink; - color: #fff; - padding: 2px 4px; - border-radius: 5px; - } - - .type-signature { - font-size: 14px; - } - - .tag-deprecated { - display: inline-block; - font-size: 10px; - } - - .important { - background-color: @colorRed; - color: #fff; - padding: 2px 4px; - border-radius: 5px; - } - - .nameContainer { - position: relative; - margin-top: 20px; - padding-top: 5px; - border-top: 1px solid #e1e1e1; - z-index: -1; - - .inherited { - display: inline-block; - border-radius: 3px; - background-color: #888!important; - font-size: 0.7em; - padding: 2px 4px; - margin-right: 5px; - a { - color: #fff; - } - } - - &.inherited { - color: gray; - } - - h4 { - margin-right: 150px; - line-height: 1.3; - - .signature { - font-size: 14px; - font-weight: normal; - font-family: Menlo,Monaco,Consolas,"Courier New",monospace; - } - } - } - - pre { - margin: 0; - font-size: 14px; - counter-reset: codeLine; - - .code-line { - counter-increment: codeLine; - } - .code-line::before { - content: counter(codeLine); - color: #C0C0C0; - text-align: right; - display: inline-block; - width: 2em; - padding-right: 0.5em; - margin-right: 0.5em; - border-right: 1px solid #e0e0e0; - } - - } - - table { - width: 100%; - margin-bottom: 15px; - &.params th, - &.params td, { - border: 1px solid #e1e1e1; - } - th { - padding: 3px 3px; - } - - td { - vertical-align: top; - padding: 3px 3px; - } - - .name { - width: 110px; - } - - .type { - width: 60px; - color: #aaa; - font-size: 12px; - vertical-align: bottom; - } - - .attributes { - width: 80px; - color: #aaa; - font-size: 11px; - } - - .description { - font-size: 14px; - p { - margin: 0; - } - } - - .optional { - float: left; - border-radius: 3px; - background-color: #ddd!important; - font-size: 0.7em; - padding: 2px 4px; - margin-right: 5px; - color: gray; - } - } - - .readme { - p { - margin-top: 15px; - line-height: 1.2; - font-size: 0.85em; - } - - h1 { - font-size: 1.7em; - } - - h2 { - margin-top: 30px; - margin-bottom: 10px; - padding-bottom: 10px; - border-bottom: 1px solid #e1e1e1; - } - - li { - font-size: 0.9em; - margin-bottom: 10px; - } - } - - article { - ol > li { - list-style-type: decimal; - margin-bottom: 5px; - } - &.source-code ol li { - font-weight: 100; - font-size: 14px; - line-height: 1; - } - ol.linenums { - margin-left: 15px; - } - .tag-see { - margin-left: 0; - } - - ul > li { - margin-bottom: 5px; - list-style-type: square; - &.strike { - text-decoration: line-through; - } - } - p, ul li, ol li { - font-weight: 400; - font-size: 14px; - line-height: 1.7; - } - .next-step { - margin-top: 3rem; - a { - padding: 0.6rem 0.8rem; - font-weight: 500; - border: 1px solid #D7D7D7; - } - } - strong { - font-weight: 600; - } - table.static-data { - background: #FFFFFF; - border: solid 1px #DDDDDD; - margin-bottom: 1.11111rem; - table-layout: auto; - caption { - background: transparent; - color: #222222; - font-size: 0.88889rem; - font-weight: bold; } - thead { - background: #F5F5F5; } - thead tr th, - thead tr td { - color: #222222; - font-size: 0.77778rem; - font-weight: bold; - padding: 0.44444rem 0.55556rem 0.55556rem; } - tfoot { - background: #F5F5F5; } - tfoot tr th, - tfoot tr td { - color: #222222; - font-size: 0.77778rem; - font-weight: bold; - padding: 0.44444rem 0.55556rem 0.55556rem; } - tr th, - tr td { - color: #222222; - font-size: 0.77778rem; - padding: 0.5rem 0.55556rem; - text-align: left; } - tr.even, tr.alt, tr:nth-of-type(even) { - background: #F9F9F9; } - thead tr th, - tfoot tr th, - tfoot tr td, - tbody tr th, - tbody tr td, - tr td { - padding: 0.5rem 0.4rem; - vertical-align: middle; - font-size: 13px; - display: table-cell; - line-height: 1rem; } - } - } -} diff --git a/less/hot/_media.less b/less/hot/_media.less deleted file mode 100644 index f7eaf4c..0000000 --- a/less/hot/_media.less +++ /dev/null @@ -1,68 +0,0 @@ -header { - @media only screen and (max-width: 40em) { - padding: 0.875rem 0; - .name img { - margin: 0 1rem; - } - .top-bar .toggle-topbar.menu-icon { - margin-top: 0; - top: 10%; - right: 14px; - } - & .top-bar-section ul li a { - padding: .36rem 0.875rem!important; - font-size: 15px; - box-shadow: none!important; - } - & .top-bar-section .right li .dropdown { - left: 104%; - } - & .top-bar-section li .dropdown li a:hover { - background: none!important; - } - } - @media only screen and (min-width: 40.063em) and (max-width: 64em) { - .name img { - max-width: 147px; - } - & .top-bar-section ul li { - margin: 0 0.3rem; - } - & .top-bar-section ul li a { - font-size: 13px!important; - } - & .top-bar-section li:not(.has-form) a:not(.button) { - padding: 0 0.5rem; - } - } -} -@media only screen and (max-width: 40em) { - #wrapper { - margin-top: 6rem; - } - .main { - padding: 0; - } - .small-1, .nav-fix, .navigation { - width: 100%!important; - float: none!important; - position: static!important; - } - .small-1.large-3 { - height: 320px!important; - } - .small-1.large-3 .navigation { - height: 300px!important; - overflow-y: scroll!important; - } - .navigation .list { - height: auto!important; - } - .breadcrumbs { - display: none; - } - .footer { - margin-top: 2rem; - text-align: center; - } -} diff --git a/less/hot/docs.less b/less/hot/docs.less deleted file mode 100644 index c9068b8..0000000 --- a/less/hot/docs.less +++ /dev/null @@ -1,4 +0,0 @@ -@import "_jsdoc"; -@import "_app"; -@import "_handsontable"; -@import "_media"; diff --git a/package.json b/package.json deleted file mode 100644 index 4947abd..0000000 --- a/package.json +++ /dev/null @@ -1,38 +0,0 @@ -{ - "name": "handsontable-docs", - "description": "Handsontable is a minimalist Excel-like data grid editor for HTML & JavaScript", - "homepage": "http://docs.handsontable.com/", - "private": true, - "bugs": { - "url": "https://github.com/handsontable/docs/issues" - }, - "repository": { - "type": "git", - "url": "git://github.com/handsontable/docs.git" - }, - "author": "Handsoncode sp. z o.o. ", - "version": "0.1.0", - "dependencies": { - "grunt-bowercopy": "^1.2.0", - "grunt-contrib-clean": "~0.4.1", - "grunt-contrib-copy": "~0.5.0", - "grunt-contrib-less": "~0.9.0", - "grunt-exec": "~0.4.6", - "grunt-git": "^0.3.4", - "grunt-jsdoc": "^0.5.8", - "grunt-robots-txt": "~0.3.0", - "jsdoc": "git://github.com/jsdoc3/jsdoc.git", - "grunt-sitemap": "1.2.1" - }, - "devDependencies": { - "grunt": "~0.4.5", - "grunt-contrib-connect": "^0.10.1", - "grunt-contrib-watch": "^0.6.1", - "grunt-open": "^0.2.3", - "shipit-deploy": "^1.3.1" - }, - "scripts": { - "test": "" - }, - "readmeFilename": "README.md" -} diff --git a/plugins/pluginTag.js b/plugins/pluginTag.js deleted file mode 100644 index 00f4cf3..0000000 --- a/plugins/pluginTag.js +++ /dev/null @@ -1,11 +0,0 @@ - -exports.defineTags = function(dictionary) { - dictionary.defineTag('plugin', { - mustHaveValue: false, - mustNotHaveValue: true, - isNamespace: false, - onTagged: function(doclet, tag) { - doclet.plugin = "plugin"; - } - }) -}; diff --git a/plugins/utilTag.js b/plugins/utilTag.js deleted file mode 100644 index c4d2f18..0000000 --- a/plugins/utilTag.js +++ /dev/null @@ -1,11 +0,0 @@ - -exports.defineTags = function(dictionary) { - dictionary.defineTag('util', { - mustHaveValue: false, - mustNotHaveValue: true, - isNamespace: false, - onTagged: function(doclet, tag) { - doclet.util = "util"; - } - }) -}; diff --git a/publish.js b/publish.js deleted file mode 100644 index 8668385..0000000 --- a/publish.js +++ /dev/null @@ -1,621 +0,0 @@ -/*global env: true */ -var template = require('jsdoc/template'), - fs = require('jsdoc/fs'), - path = require('jsdoc/path'), - taffy = require('taffydb').taffy, - handle = require('jsdoc/util/error').handle, - helper = require('jsdoc/util/templateHelper'), - _ = require('underscore'), - htmlsafe = helper.htmlsafe, - linkto = helper.linkto, - resolveAuthorLinks = helper.resolveAuthorLinks, - scopeToPunc = helper.scopeToPunc, - hasOwnProp = Object.prototype.hasOwnProperty, - data, - view, - outdir = env.opts.destination; - -function find(spec) { - return helper.find(data, spec); -} - -function tutoriallink(node) { - if(node.external) { - return '' + node.title + ''; - } else if(node.demo || (node.parent && node.parent.demo)) { - return helper.toTutorial(node.name, null, { tag: 'em', classname: 'disabled', prefix: 'Demo: ' }).replace('tutorial-','demo-'); - } else { - return helper.toTutorial(node.name, null, { tag: 'em', classname: 'disabled', prefix: 'Tutorial: ' }); - } -} - -function getAncestorLinks(doclet) { - return helper.getAncestorLinks(data, doclet); -} - -function hashToLink(doclet, hash) { - if ( !/^(#.+)/.test(hash) ) { return hash; } - - var url = helper.createLink(doclet); - - url = url.replace(/(#.+|$)/, hash); - return '' + hash + ''; -} - -function needsSignature(doclet) { - var needsSig = false; - - // function and class definitions always get a signature - if (doclet.kind === 'function' || doclet.kind === 'class') { - needsSig = true; - } - // typedefs that contain functions get a signature, too - else if (doclet.kind === 'typedef' && doclet.type && doclet.type.names && - doclet.type.names.length) { - for (var i = 0, l = doclet.type.names.length; i < l; i++) { - if (doclet.type.names[i].toLowerCase() === 'function') { - needsSig = true; - break; - } - } - } - - return needsSig; -} - -function addSignatureParams(f) { - var params = helper.getSignatureParams(f, 'optional'); - - f.signature = (f.signature || '') + '('+params.join(', ')+')'; -} - -function addSignatureReturns(f) { - var returnTypes = helper.getSignatureReturns(f); - - f.signature = ''+(f.signature || '') + ''; - - if (returnTypes.length) { - f.signature += ''+(returnTypes.length ? '{'+returnTypes.join('|')+'}' : '')+''; - } -} - -function addSignatureTypes(f) { - var types = helper.getSignatureTypes(f); - - f.signature = (f.signature || '') + ''+(types.length? ' :'+types.join('|') : '')+''; -} - -function addAttribs(f) { - var attribs = helper.getAttribs(f); - - if (attribs.length) { - f.attribs = '' + htmlsafe(attribs.length ? attribs.join(',') : '') + ''; - } -} - -function shortenPaths(files, commonPrefix) { - // always use forward slashes - var regexp = new RegExp('\\\\', 'g'); - - Object.keys(files).forEach(function(file) { - files[file].shortened = files[file].resolved.replace(commonPrefix, '') - .replace(regexp, '/'); - }); - - return files; -} - -function resolveSourcePath(filepath) { - return path.resolve(process.cwd(), filepath); -} - -function getPathFromDoclet(doclet) { - if (!doclet.meta) { - return; - } - - var filepath = doclet.meta.path && doclet.meta.path !== 'null' ? - doclet.meta.path + '/' + doclet.meta.filename : - doclet.meta.filename; - - return filepath; -} - -function generate(title, docs, filename, resolveLinks) { - resolveLinks = resolveLinks === false ? false : true; - - var docData = { - filename: filename, - title: title, - docs: docs - }; - - var outpath = path.join(outdir, filename), - html = view.render('container.tmpl', docData); - - if (resolveLinks) { - html = helper.resolveLinks(html); // turn {@link foo} into foo - } - - fs.writeFileSync(outpath, html, 'utf8'); -} - -function generateSourceFiles(sourceFiles) { - Object.keys(sourceFiles).forEach(function(file) { - var source; - // links are keyed to the shortened path in each doclet's `meta.filename` property - var sourceOutfile = helper.getUniqueFilename(sourceFiles[file].shortened); - helper.registerLink(sourceFiles[file].shortened, sourceOutfile); - - try { - source = { - kind: 'source', - code: helper.htmlsafe( fs.readFileSync(sourceFiles[file].resolved, 'utf8') ) - }; - } - catch(e) { - handle(e); - } - - generate('Source: ' + sourceFiles[file].shortened, [source], sourceOutfile, false); - }); -} - -/** - * Look for classes or functions with the same name as modules (which indicates that the module - * exports only that class or function), then attach the classes or functions to the `module` - * property of the appropriate module doclets. The name of each class or function is also updated - * for display purposes. This function mutates the original arrays. - * - * @private - * @param {Array.} doclets - The array of classes and functions to check. - * @param {Array.} modules - The array of module doclets to search. - */ -function attachModuleSymbols(doclets, modules) { - var symbols = {}; - - // build a lookup table - doclets.forEach(function(symbol) { - symbols[symbol.longname] = symbol; - }); - - return modules.map(function(module) { - if (symbols[module.longname]) { - module.module = symbols[module.longname]; - module.module.name = module.module.name.replace('module:', 'require("') + '")'; - } - }); -} - -/** - * Create the navigation sidebar. - * @param {object} members The members that will be used to create the sidebar. - * @param {array} members.classes - * @param {array} members.externals - * @param {array} members.globals - * @param {array} members.mixins - * @param {array} members.modules - * @param {array} members.namespaces - * @param {array} members.tutorials - * @param {array} members.events - * @return {string} The HTML for the navigation sidebar. - */ -function buildNav(members) { - var nav = { - core: [], - plugins: [], - utils: [] - }, - push; - - push = function push(object) { - if ( object.isPlugin ) { - nav.plugins.push(object); - - } else if ( object.isUtil ) { - nav.utils.push(object); - } else { - nav.core.push(object); - } - }; - - if (members.namespaces.length) { - _.each(members.namespaces, function (v) { - push({ - isPlugin: v.plugin ? 1 : 0, - isUtil: v.util ? 1 : 0, - type: 'namespace', - longname: v.longname, - name: v.name, - members: find({ - kind: 'member', - memberof: v.longname - }), - methods: find({ - kind: 'function', - memberof: v.longname - }), - typedefs: find({ - kind: 'typedef', - memberof: v.longname - }), - events: find({ - kind: 'event', - memberof: v.longname - }) - }); - }); - } - - if (members.classes.length) { - _.each(members.classes, function (v) { - push({ - isPlugin: v.plugin ? 1 : 0, - isUtil: v.util ? 1 : 0, - type: 'class', - longname: v.longname, - name: v.name, - members: find({ - kind: 'member', - memberof: v.longname - }), - methods: find({ - kind: 'function', - memberof: v.longname - }), - typedefs: find({ - kind: 'typedef', - memberof: v.longname - }), - events: find({ - kind: 'event', - memberof: v.longname - }) - }); - }); - } - - return nav; -} - - -/** - @param {TAFFY} taffyData See . - @param {object} opts - @param {Tutorial} tutorials - */ -exports.publish = function(taffyData, opts, tutorials) { - data = taffyData; - - var conf = env.conf.templates || {}; - conf['default'] = conf['default'] || {}; - - var templatePath = opts.template; - view = new template.Template(templatePath + '/tmpl'); - - // claim some special filenames in advance, so the All-Powerful Overseer of Filename Uniqueness - // doesn't try to hand them out later - var indexUrl = helper.getUniqueFilename('index'); - // don't call registerLink() on this one! 'index' is also a valid longname - - var globalUrl = helper.getUniqueFilename('global'); - helper.registerLink('global', globalUrl); - - // set up templating - view.layout = 'layout.tmpl'; - - - - extendTutorialsObj(tutorials, "external"); - extendTutorialsObj(tutorials, "demo"); - - console.log(tutorials.children[0]); - - // set up tutorials for helper - helper.setTutorials(tutorials); - - data = helper.prune(data); - data.sort('longname, version, since'); - helper.addEventListeners(data); - - var sourceFiles = {}; - var sourceFilePaths = []; - data().each(function(doclet) { - doclet.attribs = ''; - - if (doclet.examples) { - doclet.examples = doclet.examples.map(function(example) { - var caption, code; - - if (example.match(/^\s*(?:

)?\s*([\s\S]+?)<\/caption>\s*(?:<\/p>)?[\s\r\n]*([\s\S]+)$/i)) { - caption = RegExp.$1; - code = RegExp.$2; - } - - return { - caption: caption || '', - code: code || example - }; - }); - } - if (doclet.see) { - doclet.see.forEach(function(seeItem, i) { - doclet.see[i] = hashToLink(doclet, seeItem); - }); - } - - // build a list of source files - var sourcePath; - var resolvedSourcePath; - if (doclet.meta) { - sourcePath = getPathFromDoclet(doclet); - resolvedSourcePath = resolveSourcePath(sourcePath); - sourceFiles[sourcePath] = { - resolved: resolvedSourcePath, - shortened: null - }; - sourceFilePaths.push(resolvedSourcePath); - } - }); - - // update outdir if necessary, then create outdir - var packageInfo = ( find({kind: 'package'}) || [] ) [0]; - if (packageInfo && packageInfo.name) { - outdir = path.join(outdir, packageInfo.name, packageInfo.version); - } - fs.mkPath(outdir); - - // copy the template's static files to outdir - var fromDir = path.join(templatePath, 'static'); - var staticFiles = fs.ls(fromDir, 3); - - staticFiles.forEach(function(fileName) { - var toDir = fs.toDir( fileName.replace(fromDir, outdir) ); - fs.mkPath(toDir); - fs.copyFileSync(fileName, toDir); - }); - - // copy user-specified static files to outdir - var staticFilePaths; - var staticFileFilter; - var staticFileScanner; - if (conf['default'].staticFiles) { - staticFilePaths = conf['default'].staticFiles.paths || []; - staticFileFilter = new (require('jsdoc/src/filter')).Filter(conf['default'].staticFiles); - staticFileScanner = new (require('jsdoc/src/scanner')).Scanner(); - - staticFilePaths.forEach(function(filePath) { - var extraStaticFiles = staticFileScanner.scan([filePath], 10, staticFileFilter); - - extraStaticFiles.forEach(function(fileName) { - var sourcePath = fs.statSync(filePath).isDirectory() ? filePath : - path.dirname(filePath); - var toDir = fs.toDir( fileName.replace(sourcePath, outdir) ); - fs.mkPath(toDir); - fs.copyFileSync(fileName, toDir); - }); - }); - } - - if (sourceFilePaths.length) { - sourceFiles = shortenPaths( sourceFiles, path.commonPrefix(sourceFilePaths) ); - } - data().each(function(doclet) { - var url = helper.createLink(doclet); - helper.registerLink(doclet.longname, url); - - // replace the filename with a shortened version of the full path - var docletPath; - if (doclet.meta) { - docletPath = getPathFromDoclet(doclet); - docletPath = sourceFiles[docletPath].shortened; - if (docletPath) { - doclet.meta.filename = docletPath; - } - } - }); - - data().each(function(doclet) { - var url = helper.longnameToUrl[doclet.longname]; - - if (url.indexOf('#') > -1) { - doclet.id = helper.longnameToUrl[doclet.longname].split(/#/).pop(); - } - else { - doclet.id = doclet.name; - } - - if ( needsSignature(doclet) ) { - addSignatureParams(doclet); - addSignatureReturns(doclet); - addAttribs(doclet); - } - }); - - // do this after the urls have all been generated - data().each(function(doclet) { - doclet.ancestors = getAncestorLinks(doclet); - - if (doclet.kind === 'member') { - addSignatureTypes(doclet); - addAttribs(doclet); - } - - if (doclet.kind === 'constant') { - addSignatureTypes(doclet); - addAttribs(doclet); - doclet.kind = 'member'; - } - }); - - var members = helper.getMembers(data); - members.tutorials = tutorials.children; - - - // add template helpers - view.find = find; - view.linkto = linkto; - view.resolveAuthorLinks = resolveAuthorLinks; - view.tutoriallink = tutoriallink; - - view.htmlsafe = htmlsafe; - view.members = members; //@davidshimjs: To make navigation for customizing - - // once for all - view.nav = buildNav(members); - attachModuleSymbols(find({ kind: ['class', 'function'], longname: {left: 'module:'} }), members.modules); - - // only output pretty-printed source files if requested; do this before generating any other - // pages, so the other pages can link to the source files - if (conf['default'].outputSourceFiles) { - generateSourceFiles(sourceFiles); - } - - if (members.globals.length) { - generate('Global', [{kind: 'globalobj'}], globalUrl); - } - - // index page displays information from package.json and lists files - var files = find({kind: 'file'}), - packages = find({kind: 'package'}); - - generate('Index', - packages.concat( - [{kind: 'mainpage', readme: opts.readme, longname: (opts.mainpagetitle) ? opts.mainpagetitle : 'Main Page'}] - ).concat(files), - indexUrl); - - // set up the lists that we'll use to generate pages - var classes = taffy(members.classes); - var modules = taffy(members.modules); - var namespaces = taffy(members.namespaces); - var mixins = taffy(members.mixins); - var externals = taffy(members.externals); - - for (var longname in helper.longnameToUrl) { - if ( hasOwnProp.call(helper.longnameToUrl, longname) ) { - var myClasses = helper.find(classes, {longname: longname}); - if (myClasses.length) { - generate('Class: ' + myClasses[0].name, myClasses, helper.longnameToUrl[longname]); - } - - var myModules = helper.find(modules, {longname: longname}); - if (myModules.length) { - generate('Module: ' + myModules[0].name, myModules, helper.longnameToUrl[longname]); - } - - var myNamespaces = helper.find(namespaces, {longname: longname}); - if (myNamespaces.length) { - generate('Namespace: ' + myNamespaces[0].name, myNamespaces, helper.longnameToUrl[longname]); - } - - var myMixins = helper.find(mixins, {longname: longname}); - if (myMixins.length) { - generate('Mixin: ' + myMixins[0].name, myMixins, helper.longnameToUrl[longname]); - } - - var myExternals = helper.find(externals, {longname: longname}); - if (myExternals.length) { - generate('External: ' + myExternals[0].name, myExternals, helper.longnameToUrl[longname]); - } - } - } - - // TODO: move the tutorial functions to templateHelper.js - function generateTutorial(title, tutorial, filename) { - var tutorialData = { - title: title, - header: tutorial.title, - content: tutorial.parse(), - children: tutorial.children, - filename: filename - }; - - var tutorialPath = path.join(outdir, filename), - html = view.render('tutorial.tmpl', tutorialData); - - // turn {@link foo} into foo - html = helper.resolveLinks(html); - if(tutorial.demo || (tutorial.parent && tutorial.parent.demo)) { - tutorialPath = tutorialPath.replace('tutorial-', 'demo-'); - } - - - fs.writeFileSync(tutorialPath, html, 'utf8'); - } - - // tutorials can have only one parent so there is no risk for loops - function saveChildren(node) { - node.children.forEach(function(child) { - - // Do not generate static pages for the main 'headers' - if(child.parent.name !== 'index' && !child.external) { - generateTutorial('Tutorial: ' + child.title, child, helper.tutorialToUrl(child.name)); - - } - saveChildren(child); - - }); - } - - function getExtendedTutorialProperties (parsedJSON, extension, list, name) { - var init, - children; - - if(!list) { - var list = []; - - init = true; - parsedJSON = parsedJSON.index; - } else { - init = false; - } - - if(parsedJSON.hasOwnProperty(extension)) { - list.push({ - 'name': name || 'index', - 'extensionValue': parsedJSON[extension] - }); - } - - if(parsedJSON.hasOwnProperty('children')) { - children = Object.keys(parsedJSON.children); - for(var i = 0; i < children.length; i++) { - getExtendedTutorialProperties(parsedJSON.children[children[i]], extension, list, children[i]); - } - } - - if(init) { - return list; - } - } - - function setExtendedTutorialProperties (tutorials, extension, extended) { - for(var i = 0; i < extended.length; i++) { - tutorials.getByName(extended[i].name)[extension] = extended[i].extensionValue; - } - } - - function extendTutorialsObj (tutorials, extensions) { - var extensionsArray = [], - extended, - json, - parsed; - - if(typeof extensions === 'string') { - extensionsArray.push(extensions); - } - - json = fs.readFileSync(env.opts.template + '/' + env.opts.tutorials + '/' + env.opts.tutorials + '.json' , env.opts.encoding); - parsed = JSON.parse(json); - - for(var i = 0; i < extensionsArray.length; i++) { - extended = getExtendedTutorialProperties (parsed, extensionsArray[i]); - setExtendedTutorialProperties(tutorials, extensionsArray[i], extended); - } - - return tutorials; - } - - saveChildren(tutorials); -}; diff --git a/shipitfile.js b/shipitfile.js deleted file mode 100644 index 3bfdd74..0000000 --- a/shipitfile.js +++ /dev/null @@ -1,36 +0,0 @@ - -module.exports = function (shipit) { - require('shipit-deploy')(shipit); - - shipit.initConfig({ - production: { - servers: '142.4.202.189', - workspace: '/tmp/docs.handsontable.com', - deployTo: '/home/httpd/docs.handsontable.com', - repositoryUrl: 'https://github.com/handsontable/docs.git', - branch: 'master', - ignores: ['.git', 'node_modules'], - rsync: ['--force', '--delete', '--delete-excluded', '-I', '--stats', '--chmod=ug=rwX'], - keepReleases: 3, - shallowClone: false - } - }); - - shipit.task('test', function() { - shipit.remote('pwd'); - }); - - shipit.on('published', function() { - var current = shipit.config.deployTo + '/current'; - - shipit.remote('cd ' + current + ' && npm install --production').then(function() { - return shipit.remote('cd ' + current + ' && bower install --config.interactive=false -F'); - - }).then(function() { - return shipit.remote('cd ' + current + ' && grunt update-hot'); - - }).then(function() { - return shipit.remote('cd ' + current + ' && grunt build'); - }) - }); -}; diff --git a/static/favicon.ico b/static/favicon.ico deleted file mode 100644 index ca17529..0000000 Binary files a/static/favicon.ico and /dev/null differ diff --git a/static/images/grunt-build.png b/static/images/grunt-build.png deleted file mode 100644 index 1fb528a..0000000 Binary files a/static/images/grunt-build.png and /dev/null differ diff --git a/static/images/handsoncode-logo-footer.png b/static/images/handsoncode-logo-footer.png deleted file mode 100644 index 6ca6342..0000000 Binary files a/static/images/handsoncode-logo-footer.png and /dev/null differ diff --git a/static/images/hot-builder-results.png b/static/images/hot-builder-results.png deleted file mode 100644 index d23714f..0000000 Binary files a/static/images/hot-builder-results.png and /dev/null differ diff --git a/static/images/hot-builder-ui.png b/static/images/hot-builder-ui.png deleted file mode 100644 index 968b58f..0000000 Binary files a/static/images/hot-builder-ui.png and /dev/null differ diff --git a/static/images/logo.png b/static/images/logo.png deleted file mode 100644 index e697b48..0000000 Binary files a/static/images/logo.png and /dev/null differ diff --git a/static/scripts/bootstrap.min.js b/static/scripts/bootstrap.min.js deleted file mode 100644 index 1a6258e..0000000 --- a/static/scripts/bootstrap.min.js +++ /dev/null @@ -1,7 +0,0 @@ -/*! - * Bootstrap v3.0.3 (http://getbootstrap.com) - * Copyright 2013 Twitter, Inc. - * Licensed under http://www.apache.org/licenses/LICENSE-2.0 - */ - -if("undefined"==typeof jQuery)throw new Error("Bootstrap requires jQuery");+function(a){"use strict";function b(){var a=document.createElement("bootstrap"),b={WebkitTransition:"webkitTransitionEnd",MozTransition:"transitionend",OTransition:"oTransitionEnd otransitionend",transition:"transitionend"};for(var c in b)if(void 0!==a.style[c])return{end:b[c]}}a.fn.emulateTransitionEnd=function(b){var c=!1,d=this;a(this).one(a.support.transition.end,function(){c=!0});var e=function(){c||a(d).trigger(a.support.transition.end)};return setTimeout(e,b),this},a(function(){a.support.transition=b()})}(jQuery),+function(a){"use strict";var b='[data-dismiss="alert"]',c=function(c){a(c).on("click",b,this.close)};c.prototype.close=function(b){function c(){f.trigger("closed.bs.alert").remove()}var d=a(this),e=d.attr("data-target");e||(e=d.attr("href"),e=e&&e.replace(/.*(?=#[^\s]*$)/,""));var f=a(e);b&&b.preventDefault(),f.length||(f=d.hasClass("alert")?d:d.parent()),f.trigger(b=a.Event("close.bs.alert")),b.isDefaultPrevented()||(f.removeClass("in"),a.support.transition&&f.hasClass("fade")?f.one(a.support.transition.end,c).emulateTransitionEnd(150):c())};var d=a.fn.alert;a.fn.alert=function(b){return this.each(function(){var d=a(this),e=d.data("bs.alert");e||d.data("bs.alert",e=new c(this)),"string"==typeof b&&e[b].call(d)})},a.fn.alert.Constructor=c,a.fn.alert.noConflict=function(){return a.fn.alert=d,this},a(document).on("click.bs.alert.data-api",b,c.prototype.close)}(jQuery),+function(a){"use strict";var b=function(c,d){this.$element=a(c),this.options=a.extend({},b.DEFAULTS,d)};b.DEFAULTS={loadingText:"loading..."},b.prototype.setState=function(a){var b="disabled",c=this.$element,d=c.is("input")?"val":"html",e=c.data();a+="Text",e.resetText||c.data("resetText",c[d]()),c[d](e[a]||this.options[a]),setTimeout(function(){"loadingText"==a?c.addClass(b).attr(b,b):c.removeClass(b).removeAttr(b)},0)},b.prototype.toggle=function(){var a=this.$element.closest('[data-toggle="buttons"]'),b=!0;if(a.length){var c=this.$element.find("input");"radio"===c.prop("type")&&(c.prop("checked")&&this.$element.hasClass("active")?b=!1:a.find(".active").removeClass("active")),b&&c.prop("checked",!this.$element.hasClass("active")).trigger("change")}b&&this.$element.toggleClass("active")};var c=a.fn.button;a.fn.button=function(c){return this.each(function(){var d=a(this),e=d.data("bs.button"),f="object"==typeof c&&c;e||d.data("bs.button",e=new b(this,f)),"toggle"==c?e.toggle():c&&e.setState(c)})},a.fn.button.Constructor=b,a.fn.button.noConflict=function(){return a.fn.button=c,this},a(document).on("click.bs.button.data-api","[data-toggle^=button]",function(b){var c=a(b.target);c.hasClass("btn")||(c=c.closest(".btn")),c.button("toggle"),b.preventDefault()})}(jQuery),+function(a){"use strict";var b=function(b,c){this.$element=a(b),this.$indicators=this.$element.find(".carousel-indicators"),this.options=c,this.paused=this.sliding=this.interval=this.$active=this.$items=null,"hover"==this.options.pause&&this.$element.on("mouseenter",a.proxy(this.pause,this)).on("mouseleave",a.proxy(this.cycle,this))};b.DEFAULTS={interval:5e3,pause:"hover",wrap:!0},b.prototype.cycle=function(b){return b||(this.paused=!1),this.interval&&clearInterval(this.interval),this.options.interval&&!this.paused&&(this.interval=setInterval(a.proxy(this.next,this),this.options.interval)),this},b.prototype.getActiveIndex=function(){return this.$active=this.$element.find(".item.active"),this.$items=this.$active.parent().children(),this.$items.index(this.$active)},b.prototype.to=function(b){var c=this,d=this.getActiveIndex();return b>this.$items.length-1||0>b?void 0:this.sliding?this.$element.one("slid.bs.carousel",function(){c.to(b)}):d==b?this.pause().cycle():this.slide(b>d?"next":"prev",a(this.$items[b]))},b.prototype.pause=function(b){return b||(this.paused=!0),this.$element.find(".next, .prev").length&&a.support.transition.end&&(this.$element.trigger(a.support.transition.end),this.cycle(!0)),this.interval=clearInterval(this.interval),this},b.prototype.next=function(){return this.sliding?void 0:this.slide("next")},b.prototype.prev=function(){return this.sliding?void 0:this.slide("prev")},b.prototype.slide=function(b,c){var d=this.$element.find(".item.active"),e=c||d[b](),f=this.interval,g="next"==b?"left":"right",h="next"==b?"first":"last",i=this;if(!e.length){if(!this.options.wrap)return;e=this.$element.find(".item")[h]()}this.sliding=!0,f&&this.pause();var j=a.Event("slide.bs.carousel",{relatedTarget:e[0],direction:g});if(!e.hasClass("active")){if(this.$indicators.length&&(this.$indicators.find(".active").removeClass("active"),this.$element.one("slid.bs.carousel",function(){var b=a(i.$indicators.children()[i.getActiveIndex()]);b&&b.addClass("active")})),a.support.transition&&this.$element.hasClass("slide")){if(this.$element.trigger(j),j.isDefaultPrevented())return;e.addClass(b),e[0].offsetWidth,d.addClass(g),e.addClass(g),d.one(a.support.transition.end,function(){e.removeClass([b,g].join(" ")).addClass("active"),d.removeClass(["active",g].join(" ")),i.sliding=!1,setTimeout(function(){i.$element.trigger("slid.bs.carousel")},0)}).emulateTransitionEnd(600)}else{if(this.$element.trigger(j),j.isDefaultPrevented())return;d.removeClass("active"),e.addClass("active"),this.sliding=!1,this.$element.trigger("slid.bs.carousel")}return f&&this.cycle(),this}};var c=a.fn.carousel;a.fn.carousel=function(c){return this.each(function(){var d=a(this),e=d.data("bs.carousel"),f=a.extend({},b.DEFAULTS,d.data(),"object"==typeof c&&c),g="string"==typeof c?c:f.slide;e||d.data("bs.carousel",e=new b(this,f)),"number"==typeof c?e.to(c):g?e[g]():f.interval&&e.pause().cycle()})},a.fn.carousel.Constructor=b,a.fn.carousel.noConflict=function(){return a.fn.carousel=c,this},a(document).on("click.bs.carousel.data-api","[data-slide], [data-slide-to]",function(b){var c,d=a(this),e=a(d.attr("data-target")||(c=d.attr("href"))&&c.replace(/.*(?=#[^\s]+$)/,"")),f=a.extend({},e.data(),d.data()),g=d.attr("data-slide-to");g&&(f.interval=!1),e.carousel(f),(g=d.attr("data-slide-to"))&&e.data("bs.carousel").to(g),b.preventDefault()}),a(window).on("load",function(){a('[data-ride="carousel"]').each(function(){var b=a(this);b.carousel(b.data())})})}(jQuery),+function(a){"use strict";var b=function(c,d){this.$element=a(c),this.options=a.extend({},b.DEFAULTS,d),this.transitioning=null,this.options.parent&&(this.$parent=a(this.options.parent)),this.options.toggle&&this.toggle()};b.DEFAULTS={toggle:!0},b.prototype.dimension=function(){var a=this.$element.hasClass("width");return a?"width":"height"},b.prototype.show=function(){if(!this.transitioning&&!this.$element.hasClass("in")){var b=a.Event("show.bs.collapse");if(this.$element.trigger(b),!b.isDefaultPrevented()){var c=this.$parent&&this.$parent.find("> .panel > .in");if(c&&c.length){var d=c.data("bs.collapse");if(d&&d.transitioning)return;c.collapse("hide"),d||c.data("bs.collapse",null)}var e=this.dimension();this.$element.removeClass("collapse").addClass("collapsing")[e](0),this.transitioning=1;var f=function(){this.$element.removeClass("collapsing").addClass("in")[e]("auto"),this.transitioning=0,this.$element.trigger("shown.bs.collapse")};if(!a.support.transition)return f.call(this);var g=a.camelCase(["scroll",e].join("-"));this.$element.one(a.support.transition.end,a.proxy(f,this)).emulateTransitionEnd(350)[e](this.$element[0][g])}}},b.prototype.hide=function(){if(!this.transitioning&&this.$element.hasClass("in")){var b=a.Event("hide.bs.collapse");if(this.$element.trigger(b),!b.isDefaultPrevented()){var c=this.dimension();this.$element[c](this.$element[c]())[0].offsetHeight,this.$element.addClass("collapsing").removeClass("collapse").removeClass("in"),this.transitioning=1;var d=function(){this.transitioning=0,this.$element.trigger("hidden.bs.collapse").removeClass("collapsing").addClass("collapse")};return a.support.transition?(this.$element[c](0).one(a.support.transition.end,a.proxy(d,this)).emulateTransitionEnd(350),void 0):d.call(this)}}},b.prototype.toggle=function(){this[this.$element.hasClass("in")?"hide":"show"]()};var c=a.fn.collapse;a.fn.collapse=function(c){return this.each(function(){var d=a(this),e=d.data("bs.collapse"),f=a.extend({},b.DEFAULTS,d.data(),"object"==typeof c&&c);e||d.data("bs.collapse",e=new b(this,f)),"string"==typeof c&&e[c]()})},a.fn.collapse.Constructor=b,a.fn.collapse.noConflict=function(){return a.fn.collapse=c,this},a(document).on("click.bs.collapse.data-api","[data-toggle=collapse]",function(b){var c,d=a(this),e=d.attr("data-target")||b.preventDefault()||(c=d.attr("href"))&&c.replace(/.*(?=#[^\s]+$)/,""),f=a(e),g=f.data("bs.collapse"),h=g?"toggle":d.data(),i=d.attr("data-parent"),j=i&&a(i);g&&g.transitioning||(j&&j.find('[data-toggle=collapse][data-parent="'+i+'"]').not(d).addClass("collapsed"),d[f.hasClass("in")?"addClass":"removeClass"]("collapsed")),f.collapse(h)})}(jQuery),+function(a){"use strict";function b(){a(d).remove(),a(e).each(function(b){var d=c(a(this));d.hasClass("open")&&(d.trigger(b=a.Event("hide.bs.dropdown")),b.isDefaultPrevented()||d.removeClass("open").trigger("hidden.bs.dropdown"))})}function c(b){var c=b.attr("data-target");c||(c=b.attr("href"),c=c&&/#/.test(c)&&c.replace(/.*(?=#[^\s]*$)/,""));var d=c&&a(c);return d&&d.length?d:b.parent()}var d=".dropdown-backdrop",e="[data-toggle=dropdown]",f=function(b){a(b).on("click.bs.dropdown",this.toggle)};f.prototype.toggle=function(d){var e=a(this);if(!e.is(".disabled, :disabled")){var f=c(e),g=f.hasClass("open");if(b(),!g){if("ontouchstart"in document.documentElement&&!f.closest(".navbar-nav").length&&a('

'}),b.prototype=a.extend({},a.fn.tooltip.Constructor.prototype),b.prototype.constructor=b,b.prototype.getDefaults=function(){return b.DEFAULTS},b.prototype.setContent=function(){var a=this.tip(),b=this.getTitle(),c=this.getContent();a.find(".popover-title")[this.options.html?"html":"text"](b),a.find(".popover-content")[this.options.html?"html":"text"](c),a.removeClass("fade top bottom left right in"),a.find(".popover-title").html()||a.find(".popover-title").hide()},b.prototype.hasContent=function(){return this.getTitle()||this.getContent()},b.prototype.getContent=function(){var a=this.$element,b=this.options;return a.attr("data-content")||("function"==typeof b.content?b.content.call(a[0]):b.content)},b.prototype.arrow=function(){return this.$arrow=this.$arrow||this.tip().find(".arrow")},b.prototype.tip=function(){return this.$tip||(this.$tip=a(this.options.template)),this.$tip};var c=a.fn.popover;a.fn.popover=function(c){return this.each(function(){var d=a(this),e=d.data("bs.popover"),f="object"==typeof c&&c;e||d.data("bs.popover",e=new b(this,f)),"string"==typeof c&&e[c]()})},a.fn.popover.Constructor=b,a.fn.popover.noConflict=function(){return a.fn.popover=c,this}}(jQuery),+function(a){"use strict";function b(c,d){var e,f=a.proxy(this.process,this);this.$element=a(c).is("body")?a(window):a(c),this.$body=a("body"),this.$scrollElement=this.$element.on("scroll.bs.scroll-spy.data-api",f),this.options=a.extend({},b.DEFAULTS,d),this.selector=(this.options.target||(e=a(c).attr("href"))&&e.replace(/.*(?=#[^\s]+$)/,"")||"")+" .nav li > a",this.offsets=a([]),this.targets=a([]),this.activeTarget=null,this.refresh(),this.process()}b.DEFAULTS={offset:10},b.prototype.refresh=function(){var b=this.$element[0]==window?"offset":"position";this.offsets=a([]),this.targets=a([]);var c=this;this.$body.find(this.selector).map(function(){var d=a(this),e=d.data("target")||d.attr("href"),f=/^#\w/.test(e)&&a(e);return f&&f.length&&[[f[b]().top+(!a.isWindow(c.$scrollElement.get(0))&&c.$scrollElement.scrollTop()),e]]||null}).sort(function(a,b){return a[0]-b[0]}).each(function(){c.offsets.push(this[0]),c.targets.push(this[1])})},b.prototype.process=function(){var a,b=this.$scrollElement.scrollTop()+this.options.offset,c=this.$scrollElement[0].scrollHeight||this.$body[0].scrollHeight,d=c-this.$scrollElement.height(),e=this.offsets,f=this.targets,g=this.activeTarget;if(b>=d)return g!=(a=f.last()[0])&&this.activate(a);for(a=e.length;a--;)g!=f[a]&&b>=e[a]&&(!e[a+1]||b<=e[a+1])&&this.activate(f[a])},b.prototype.activate=function(b){this.activeTarget=b,a(this.selector).parents(".active").removeClass("active");var c=this.selector+'[data-target="'+b+'"],'+this.selector+'[href="'+b+'"]',d=a(c).parents("li").addClass("active");d.parent(".dropdown-menu").length&&(d=d.closest("li.dropdown").addClass("active")),d.trigger("activate.bs.scrollspy")};var c=a.fn.scrollspy;a.fn.scrollspy=function(c){return this.each(function(){var d=a(this),e=d.data("bs.scrollspy"),f="object"==typeof c&&c;e||d.data("bs.scrollspy",e=new b(this,f)),"string"==typeof c&&e[c]()})},a.fn.scrollspy.Constructor=b,a.fn.scrollspy.noConflict=function(){return a.fn.scrollspy=c,this},a(window).on("load",function(){a('[data-spy="scroll"]').each(function(){var b=a(this);b.scrollspy(b.data())})})}(jQuery),+function(a){"use strict";var b=function(b){this.element=a(b)};b.prototype.show=function(){var b=this.element,c=b.closest("ul:not(.dropdown-menu)"),d=b.data("target");if(d||(d=b.attr("href"),d=d&&d.replace(/.*(?=#[^\s]*$)/,"")),!b.parent("li").hasClass("active")){var e=c.find(".active:last a")[0],f=a.Event("show.bs.tab",{relatedTarget:e});if(b.trigger(f),!f.isDefaultPrevented()){var g=a(d);this.activate(b.parent("li"),c),this.activate(g,g.parent(),function(){b.trigger({type:"shown.bs.tab",relatedTarget:e})})}}},b.prototype.activate=function(b,c,d){function e(){f.removeClass("active").find("> .dropdown-menu > .active").removeClass("active"),b.addClass("active"),g?(b[0].offsetWidth,b.addClass("in")):b.removeClass("fade"),b.parent(".dropdown-menu")&&b.closest("li.dropdown").addClass("active"),d&&d()}var f=c.find("> .active"),g=d&&a.support.transition&&f.hasClass("fade");g?f.one(a.support.transition.end,e).emulateTransitionEnd(150):e(),f.removeClass("in")};var c=a.fn.tab;a.fn.tab=function(c){return this.each(function(){var d=a(this),e=d.data("bs.tab");e||d.data("bs.tab",e=new b(this)),"string"==typeof c&&e[c]()})},a.fn.tab.Constructor=b,a.fn.tab.noConflict=function(){return a.fn.tab=c,this},a(document).on("click.bs.tab.data-api",'[data-toggle="tab"], [data-toggle="pill"]',function(b){b.preventDefault(),a(this).tab("show")})}(jQuery),+function(a){"use strict";var b=function(c,d){this.options=a.extend({},b.DEFAULTS,d),this.$window=a(window).on("scroll.bs.affix.data-api",a.proxy(this.checkPosition,this)).on("click.bs.affix.data-api",a.proxy(this.checkPositionWithEventLoop,this)),this.$element=a(c),this.affixed=this.unpin=null,this.checkPosition()};b.RESET="affix affix-top affix-bottom",b.DEFAULTS={offset:0},b.prototype.checkPositionWithEventLoop=function(){setTimeout(a.proxy(this.checkPosition,this),1)},b.prototype.checkPosition=function(){if(this.$element.is(":visible")){var c=a(document).height(),d=this.$window.scrollTop(),e=this.$element.offset(),f=this.options.offset,g=f.top,h=f.bottom;"object"!=typeof f&&(h=g=f),"function"==typeof g&&(g=f.top()),"function"==typeof h&&(h=f.bottom());var i=null!=this.unpin&&d+this.unpin<=e.top?!1:null!=h&&e.top+this.$element.height()>=c-h?"bottom":null!=g&&g>=d?"top":!1;this.affixed!==i&&(this.unpin&&this.$element.css("top",""),this.affixed=i,this.unpin="bottom"==i?e.top-d:null,this.$element.removeClass(b.RESET).addClass("affix"+(i?"-"+i:"")),"bottom"==i&&this.$element.offset({top:document.body.offsetHeight-h-this.$element.height()}))}};var c=a.fn.affix;a.fn.affix=function(c){return this.each(function(){var d=a(this),e=d.data("bs.affix"),f="object"==typeof c&&c;e||d.data("bs.affix",e=new b(this,f)),"string"==typeof c&&e[c]()})},a.fn.affix.Constructor=b,a.fn.affix.noConflict=function(){return a.fn.affix=c,this},a(window).on("load",function(){a('[data-spy="affix"]').each(function(){var b=a(this),c=b.data();c.offset=c.offset||{},c.offsetBottom&&(c.offset.bottom=c.offsetBottom),c.offsetTop&&(c.offset.top=c.offsetTop),b.affix(c)})})}(jQuery); \ No newline at end of file diff --git a/static/scripts/foundation/foundation.min.css b/static/scripts/foundation/foundation.min.css deleted file mode 100644 index 134c6ab..0000000 --- a/static/scripts/foundation/foundation.min.css +++ /dev/null @@ -1 +0,0 @@ -meta.foundation-version{font-family:"/5.5.1/"}meta.foundation-mq-small{font-family:"/only screen/";width:0}meta.foundation-mq-small-only{font-family:"/only screen and (max-width: 40em)/";width:0}meta.foundation-mq-medium{font-family:"/only screen and (min-width:40.063em)/";width:40.063em}meta.foundation-mq-medium-only{font-family:"/only screen and (min-width:40.063em) and (max-width:64em)/";width:40.063em}meta.foundation-mq-large{font-family:"/only screen and (min-width:64.063em)/";width:64.063em}meta.foundation-mq-large-only{font-family:"/only screen and (min-width:64.063em) and (max-width:90em)/";width:64.063em}meta.foundation-mq-xlarge{font-family:"/only screen and (min-width:90.063em)/";width:90.063em}meta.foundation-mq-xlarge-only{font-family:"/only screen and (min-width:90.063em) and (max-width:120em)/";width:90.063em}meta.foundation-mq-xxlarge{font-family:"/only screen and (min-width:120.063em)/";width:120.063em}meta.foundation-data-attribute-namespace{font-family:false}html,body{height:100%}*,*:before,*:after{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}html,body{font-size:100%}body{background:#fff;color:#393939;padding:0;margin:0;font-family:"Helvetica Neue",Helvetica,Roboto,Arial,sans-serif;font-weight:normal;font-style:normal;line-height:1.5;position:relative;cursor:auto}a:hover{cursor:pointer}img{max-width:100%;height:auto}img{-ms-interpolation-mode:bicubic}#map_canvas img,#map_canvas embed,#map_canvas object,.map_canvas img,.map_canvas embed,.map_canvas object{max-width:none !important}.left{float:left !important}.right{float:right !important}.clearfix:before,.clearfix:after{content:" ";display:table}.clearfix:after{clear:both}.hide{display:none}.invisible{visibility:hidden}.antialiased{-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}img{display:inline-block;vertical-align:middle}textarea{height:auto;min-height:50px}select{width:100%}.row{width:100%;margin-left:auto;margin-right:auto;margin-top:0;margin-bottom:0;max-width:62.5em}.row:before,.row:after{content:" ";display:table}.row:after{clear:both}.row.collapse>.column,.row.collapse>.columns{padding-left:0;padding-right:0}.row.collapse .row{margin-left:0;margin-right:0}.row .row{width:auto;margin-left:-0.9375em;margin-right:-0.9375em;margin-top:0;margin-bottom:0;max-width:none}.row .row:before,.row .row:after{content:" ";display:table}.row .row:after{clear:both}.row .row.collapse{width:auto;margin:0;max-width:none}.row .row.collapse:before,.row .row.collapse:after{content:" ";display:table}.row .row.collapse:after{clear:both}.column,.columns{padding-left:0.9375em;padding-right:0.9375em;width:100%;float:left}[class*="column"]+[class*="column"]:last-child{float:right}[class*="column"]+[class*="column"].end{float:left}@media only screen{.small-push-0{position:relative;left:0%;right:auto}.small-pull-0{position:relative;right:0%;left:auto}.small-push-1{position:relative;left:8.33333%;right:auto}.small-pull-1{position:relative;right:8.33333%;left:auto}.small-push-2{position:relative;left:16.66667%;right:auto}.small-pull-2{position:relative;right:16.66667%;left:auto}.small-push-3{position:relative;left:25%;right:auto}.small-pull-3{position:relative;right:25%;left:auto}.small-push-4{position:relative;left:33.33333%;right:auto}.small-pull-4{position:relative;right:33.33333%;left:auto}.small-push-5{position:relative;left:41.66667%;right:auto}.small-pull-5{position:relative;right:41.66667%;left:auto}.small-push-6{position:relative;left:50%;right:auto}.small-pull-6{position:relative;right:50%;left:auto}.small-push-7{position:relative;left:58.33333%;right:auto}.small-pull-7{position:relative;right:58.33333%;left:auto}.small-push-8{position:relative;left:66.66667%;right:auto}.small-pull-8{position:relative;right:66.66667%;left:auto}.small-push-9{position:relative;left:75%;right:auto}.small-pull-9{position:relative;right:75%;left:auto}.small-push-10{position:relative;left:83.33333%;right:auto}.small-pull-10{position:relative;right:83.33333%;left:auto}.small-push-11{position:relative;left:91.66667%;right:auto}.small-pull-11{position:relative;right:91.66667%;left:auto}.column,.columns{position:relative;padding-left:0.9375em;padding-right:0.9375em;float:left}.small-1{width:8.33333%}.small-2{width:16.66667%}.small-3{width:25%}.small-4{width:33.33333%}.small-5{width:41.66667%}.small-6{width:50%}.small-7{width:58.33333%}.small-8{width:66.66667%}.small-9{width:75%}.small-10{width:83.33333%}.small-11{width:91.66667%}.small-12{width:100%}.small-offset-0{margin-left:0% !important}.small-offset-1{margin-left:8.33333% !important}.small-offset-2{margin-left:16.66667% !important}.small-offset-3{margin-left:25% !important}.small-offset-4{margin-left:33.33333% !important}.small-offset-5{margin-left:41.66667% !important}.small-offset-6{margin-left:50% !important}.small-offset-7{margin-left:58.33333% !important}.small-offset-8{margin-left:66.66667% !important}.small-offset-9{margin-left:75% !important}.small-offset-10{margin-left:83.33333% !important}.small-offset-11{margin-left:91.66667% !important}.small-reset-order{margin-left:0;margin-right:0;left:auto;right:auto;float:left}.column.small-centered,.columns.small-centered{margin-left:auto;margin-right:auto;float:none}.column.small-uncentered,.columns.small-uncentered{margin-left:0;margin-right:0;float:left}.column.small-centered:last-child,.columns.small-centered:last-child{float:none}.column.small-uncentered:last-child,.columns.small-uncentered:last-child{float:left}.column.small-uncentered.opposite,.columns.small-uncentered.opposite{float:right}.row.small-collapse>.column,.row.small-collapse>.columns{padding-left:0;padding-right:0}.row.small-collapse .row{margin-left:0;margin-right:0}.row.small-uncollapse>.column,.row.small-uncollapse>.columns{padding-left:0.9375em;padding-right:0.9375em;float:left}}@media only screen and (min-width: 40.063em){.medium-push-0{position:relative;left:0%;right:auto}.medium-pull-0{position:relative;right:0%;left:auto}.medium-push-1{position:relative;left:8.33333%;right:auto}.medium-pull-1{position:relative;right:8.33333%;left:auto}.medium-push-2{position:relative;left:16.66667%;right:auto}.medium-pull-2{position:relative;right:16.66667%;left:auto}.medium-push-3{position:relative;left:25%;right:auto}.medium-pull-3{position:relative;right:25%;left:auto}.medium-push-4{position:relative;left:33.33333%;right:auto}.medium-pull-4{position:relative;right:33.33333%;left:auto}.medium-push-5{position:relative;left:41.66667%;right:auto}.medium-pull-5{position:relative;right:41.66667%;left:auto}.medium-push-6{position:relative;left:50%;right:auto}.medium-pull-6{position:relative;right:50%;left:auto}.medium-push-7{position:relative;left:58.33333%;right:auto}.medium-pull-7{position:relative;right:58.33333%;left:auto}.medium-push-8{position:relative;left:66.66667%;right:auto}.medium-pull-8{position:relative;right:66.66667%;left:auto}.medium-push-9{position:relative;left:75%;right:auto}.medium-pull-9{position:relative;right:75%;left:auto}.medium-push-10{position:relative;left:83.33333%;right:auto}.medium-pull-10{position:relative;right:83.33333%;left:auto}.medium-push-11{position:relative;left:91.66667%;right:auto}.medium-pull-11{position:relative;right:91.66667%;left:auto}.column,.columns{position:relative;padding-left:0.9375em;padding-right:0.9375em;float:left}.medium-1{width:8.33333%}.medium-2{width:16.66667%}.medium-3{width:25%}.medium-4{width:33.33333%}.medium-5{width:41.66667%}.medium-6{width:50%}.medium-7{width:58.33333%}.medium-8{width:66.66667%}.medium-9{width:75%}.medium-10{width:83.33333%}.medium-11{width:91.66667%}.medium-12{width:100%}.medium-offset-0{margin-left:0% !important}.medium-offset-1{margin-left:8.33333% !important}.medium-offset-2{margin-left:16.66667% !important}.medium-offset-3{margin-left:25% !important}.medium-offset-4{margin-left:33.33333% !important}.medium-offset-5{margin-left:41.66667% !important}.medium-offset-6{margin-left:50% !important}.medium-offset-7{margin-left:58.33333% !important}.medium-offset-8{margin-left:66.66667% !important}.medium-offset-9{margin-left:75% !important}.medium-offset-10{margin-left:83.33333% !important}.medium-offset-11{margin-left:91.66667% !important}.medium-reset-order{margin-left:0;margin-right:0;left:auto;right:auto;float:left}.column.medium-centered,.columns.medium-centered{margin-left:auto;margin-right:auto;float:none}.column.medium-uncentered,.columns.medium-uncentered{margin-left:0;margin-right:0;float:left}.column.medium-centered:last-child,.columns.medium-centered:last-child{float:none}.column.medium-uncentered:last-child,.columns.medium-uncentered:last-child{float:left}.column.medium-uncentered.opposite,.columns.medium-uncentered.opposite{float:right}.row.medium-collapse>.column,.row.medium-collapse>.columns{padding-left:0;padding-right:0}.row.medium-collapse .row{margin-left:0;margin-right:0}.row.medium-uncollapse>.column,.row.medium-uncollapse>.columns{padding-left:0.9375em;padding-right:0.9375em;float:left}.push-0{position:relative;left:0%;right:auto}.pull-0{position:relative;right:0%;left:auto}.push-1{position:relative;left:8.33333%;right:auto}.pull-1{position:relative;right:8.33333%;left:auto}.push-2{position:relative;left:16.66667%;right:auto}.pull-2{position:relative;right:16.66667%;left:auto}.push-3{position:relative;left:25%;right:auto}.pull-3{position:relative;right:25%;left:auto}.push-4{position:relative;left:33.33333%;right:auto}.pull-4{position:relative;right:33.33333%;left:auto}.push-5{position:relative;left:41.66667%;right:auto}.pull-5{position:relative;right:41.66667%;left:auto}.push-6{position:relative;left:50%;right:auto}.pull-6{position:relative;right:50%;left:auto}.push-7{position:relative;left:58.33333%;right:auto}.pull-7{position:relative;right:58.33333%;left:auto}.push-8{position:relative;left:66.66667%;right:auto}.pull-8{position:relative;right:66.66667%;left:auto}.push-9{position:relative;left:75%;right:auto}.pull-9{position:relative;right:75%;left:auto}.push-10{position:relative;left:83.33333%;right:auto}.pull-10{position:relative;right:83.33333%;left:auto}.push-11{position:relative;left:91.66667%;right:auto}.pull-11{position:relative;right:91.66667%;left:auto}}@media only screen and (min-width: 64.063em){.large-push-0{position:relative;left:0%;right:auto}.large-pull-0{position:relative;right:0%;left:auto}.large-push-1{position:relative;left:8.33333%;right:auto}.large-pull-1{position:relative;right:8.33333%;left:auto}.large-push-2{position:relative;left:16.66667%;right:auto}.large-pull-2{position:relative;right:16.66667%;left:auto}.large-push-3{position:relative;left:25%;right:auto}.large-pull-3{position:relative;right:25%;left:auto}.large-push-4{position:relative;left:33.33333%;right:auto}.large-pull-4{position:relative;right:33.33333%;left:auto}.large-push-5{position:relative;left:41.66667%;right:auto}.large-pull-5{position:relative;right:41.66667%;left:auto}.large-push-6{position:relative;left:50%;right:auto}.large-pull-6{position:relative;right:50%;left:auto}.large-push-7{position:relative;left:58.33333%;right:auto}.large-pull-7{position:relative;right:58.33333%;left:auto}.large-push-8{position:relative;left:66.66667%;right:auto}.large-pull-8{position:relative;right:66.66667%;left:auto}.large-push-9{position:relative;left:75%;right:auto}.large-pull-9{position:relative;right:75%;left:auto}.large-push-10{position:relative;left:83.33333%;right:auto}.large-pull-10{position:relative;right:83.33333%;left:auto}.large-push-11{position:relative;left:91.66667%;right:auto}.large-pull-11{position:relative;right:91.66667%;left:auto}.column,.columns{position:relative;padding-left:0.9375em;padding-right:0.9375em;float:left}.large-1{width:8.33333%}.large-2{width:16.66667%}.large-3{width:25%}.large-4{width:33.33333%}.large-5{width:41.66667%}.large-6{width:50%}.large-7{width:58.33333%}.large-8{width:66.66667%}.large-9{width:75%}.large-10{width:83.33333%}.large-11{width:91.66667%}.large-12{width:100%}.large-offset-0{margin-left:0% !important}.large-offset-1{margin-left:8.33333% !important}.large-offset-2{margin-left:16.66667% !important}.large-offset-3{margin-left:25% !important}.large-offset-4{margin-left:33.33333% !important}.large-offset-5{margin-left:41.66667% !important}.large-offset-6{margin-left:50% !important}.large-offset-7{margin-left:58.33333% !important}.large-offset-8{margin-left:66.66667% !important}.large-offset-9{margin-left:75% !important}.large-offset-10{margin-left:83.33333% !important}.large-offset-11{margin-left:91.66667% !important}.large-reset-order{margin-left:0;margin-right:0;left:auto;right:auto;float:left}.column.large-centered,.columns.large-centered{margin-left:auto;margin-right:auto;float:none}.column.large-uncentered,.columns.large-uncentered{margin-left:0;margin-right:0;float:left}.column.large-centered:last-child,.columns.large-centered:last-child{float:none}.column.large-uncentered:last-child,.columns.large-uncentered:last-child{float:left}.column.large-uncentered.opposite,.columns.large-uncentered.opposite{float:right}.row.large-collapse>.column,.row.large-collapse>.columns{padding-left:0;padding-right:0}.row.large-collapse .row{margin-left:0;margin-right:0}.row.large-uncollapse>.column,.row.large-uncollapse>.columns{padding-left:0.9375em;padding-right:0.9375em;float:left}.push-0{position:relative;left:0%;right:auto}.pull-0{position:relative;right:0%;left:auto}.push-1{position:relative;left:8.33333%;right:auto}.pull-1{position:relative;right:8.33333%;left:auto}.push-2{position:relative;left:16.66667%;right:auto}.pull-2{position:relative;right:16.66667%;left:auto}.push-3{position:relative;left:25%;right:auto}.pull-3{position:relative;right:25%;left:auto}.push-4{position:relative;left:33.33333%;right:auto}.pull-4{position:relative;right:33.33333%;left:auto}.push-5{position:relative;left:41.66667%;right:auto}.pull-5{position:relative;right:41.66667%;left:auto}.push-6{position:relative;left:50%;right:auto}.pull-6{position:relative;right:50%;left:auto}.push-7{position:relative;left:58.33333%;right:auto}.pull-7{position:relative;right:58.33333%;left:auto}.push-8{position:relative;left:66.66667%;right:auto}.pull-8{position:relative;right:66.66667%;left:auto}.push-9{position:relative;left:75%;right:auto}.pull-9{position:relative;right:75%;left:auto}.push-10{position:relative;left:83.33333%;right:auto}.pull-10{position:relative;right:83.33333%;left:auto}.push-11{position:relative;left:91.66667%;right:auto}.pull-11{position:relative;right:91.66667%;left:auto}}button,.button{border-style:solid;border-width:0;cursor:pointer;font-family:"Helvetica Neue",Helvetica,Roboto,Arial,sans-serif;font-weight:normal;line-height:normal;margin:0 0 1.25rem;position:relative;text-decoration:none;text-align:center;-webkit-appearance:none;-moz-appearance:none;border-radius:0;display:inline-block;padding-top:1rem;padding-right:2rem;padding-bottom:1.0625rem;padding-left:2rem;font-size:1rem;background-color:#393939;border-color:#2e2e2e;color:#fff;transition:background-color 300ms ease-out}button:hover,button:focus,.button:hover,.button:focus{background-color:#2e2e2e}button:hover,button:focus,.button:hover,.button:focus{color:#fff}button.secondary,.button.secondary{background-color:#e9e9e9;border-color:#bababa;color:#333}button.secondary:hover,button.secondary:focus,.button.secondary:hover,.button.secondary:focus{background-color:#bababa}button.secondary:hover,button.secondary:focus,.button.secondary:hover,.button.secondary:focus{color:#333}button.success,.button.success{background-color:#5da423;border-color:#4a831c;color:#fff}button.success:hover,button.success:focus,.button.success:hover,.button.success:focus{background-color:#4a831c}button.success:hover,button.success:focus,.button.success:hover,.button.success:focus{color:#fff}button.alert,.button.alert{background-color:#c60f13;border-color:#9e0c0f;color:#fff}button.alert:hover,button.alert:focus,.button.alert:hover,.button.alert:focus{background-color:#9e0c0f}button.alert:hover,button.alert:focus,.button.alert:hover,.button.alert:focus{color:#fff}button.warning,.button.warning{background-color:#f08a24;border-color:#cf6e0e;color:#fff}button.warning:hover,button.warning:focus,.button.warning:hover,.button.warning:focus{background-color:#cf6e0e}button.warning:hover,button.warning:focus,.button.warning:hover,.button.warning:focus{color:#fff}button.info,.button.info{background-color:#a0d3e8;border-color:#61b6d9;color:#333}button.info:hover,button.info:focus,.button.info:hover,.button.info:focus{background-color:#61b6d9}button.info:hover,button.info:focus,.button.info:hover,.button.info:focus{color:#fff}button.large,.button.large{padding-top:1.125rem;padding-right:2.25rem;padding-bottom:1.1875rem;padding-left:2.25rem;font-size:1.25rem}button.small,.button.small{padding-top:0.875rem;padding-right:1.75rem;padding-bottom:0.9375rem;padding-left:1.75rem;font-size:0.8125rem}button.tiny,.button.tiny{padding-top:0.625rem;padding-right:1.25rem;padding-bottom:0.6875rem;padding-left:1.25rem;font-size:0.6875rem}button.expand,.button.expand{padding-right:0;padding-left:0;width:100%}button.left-align,.button.left-align{text-align:left;text-indent:0.75rem}button.right-align,.button.right-align{text-align:right;padding-right:0.75rem}button.radius,.button.radius{border-radius:0px}button.round,.button.round{border-radius:1000px}button.disabled,button[disabled],.button.disabled,.button[disabled]{background-color:#393939;border-color:#2e2e2e;color:#fff;cursor:default;opacity:0.7;box-shadow:none}button.disabled:hover,button.disabled:focus,button[disabled]:hover,button[disabled]:focus,.button.disabled:hover,.button.disabled:focus,.button[disabled]:hover,.button[disabled]:focus{background-color:#2e2e2e}button.disabled:hover,button.disabled:focus,button[disabled]:hover,button[disabled]:focus,.button.disabled:hover,.button.disabled:focus,.button[disabled]:hover,.button[disabled]:focus{color:#fff}button.disabled:hover,button.disabled:focus,button[disabled]:hover,button[disabled]:focus,.button.disabled:hover,.button.disabled:focus,.button[disabled]:hover,.button[disabled]:focus{background-color:#393939}button.disabled.secondary,button[disabled].secondary,.button.disabled.secondary,.button[disabled].secondary{background-color:#e9e9e9;border-color:#bababa;color:#333;cursor:default;opacity:0.7;box-shadow:none}button.disabled.secondary:hover,button.disabled.secondary:focus,button[disabled].secondary:hover,button[disabled].secondary:focus,.button.disabled.secondary:hover,.button.disabled.secondary:focus,.button[disabled].secondary:hover,.button[disabled].secondary:focus{background-color:#bababa}button.disabled.secondary:hover,button.disabled.secondary:focus,button[disabled].secondary:hover,button[disabled].secondary:focus,.button.disabled.secondary:hover,.button.disabled.secondary:focus,.button[disabled].secondary:hover,.button[disabled].secondary:focus{color:#333}button.disabled.secondary:hover,button.disabled.secondary:focus,button[disabled].secondary:hover,button[disabled].secondary:focus,.button.disabled.secondary:hover,.button.disabled.secondary:focus,.button[disabled].secondary:hover,.button[disabled].secondary:focus{background-color:#e9e9e9}button.disabled.success,button[disabled].success,.button.disabled.success,.button[disabled].success{background-color:#5da423;border-color:#4a831c;color:#fff;cursor:default;opacity:0.7;box-shadow:none}button.disabled.success:hover,button.disabled.success:focus,button[disabled].success:hover,button[disabled].success:focus,.button.disabled.success:hover,.button.disabled.success:focus,.button[disabled].success:hover,.button[disabled].success:focus{background-color:#4a831c}button.disabled.success:hover,button.disabled.success:focus,button[disabled].success:hover,button[disabled].success:focus,.button.disabled.success:hover,.button.disabled.success:focus,.button[disabled].success:hover,.button[disabled].success:focus{color:#fff}button.disabled.success:hover,button.disabled.success:focus,button[disabled].success:hover,button[disabled].success:focus,.button.disabled.success:hover,.button.disabled.success:focus,.button[disabled].success:hover,.button[disabled].success:focus{background-color:#5da423}button.disabled.alert,button[disabled].alert,.button.disabled.alert,.button[disabled].alert{background-color:#c60f13;border-color:#9e0c0f;color:#fff;cursor:default;opacity:0.7;box-shadow:none}button.disabled.alert:hover,button.disabled.alert:focus,button[disabled].alert:hover,button[disabled].alert:focus,.button.disabled.alert:hover,.button.disabled.alert:focus,.button[disabled].alert:hover,.button[disabled].alert:focus{background-color:#9e0c0f}button.disabled.alert:hover,button.disabled.alert:focus,button[disabled].alert:hover,button[disabled].alert:focus,.button.disabled.alert:hover,.button.disabled.alert:focus,.button[disabled].alert:hover,.button[disabled].alert:focus{color:#fff}button.disabled.alert:hover,button.disabled.alert:focus,button[disabled].alert:hover,button[disabled].alert:focus,.button.disabled.alert:hover,.button.disabled.alert:focus,.button[disabled].alert:hover,.button[disabled].alert:focus{background-color:#c60f13}button.disabled.warning,button[disabled].warning,.button.disabled.warning,.button[disabled].warning{background-color:#f08a24;border-color:#cf6e0e;color:#fff;cursor:default;opacity:0.7;box-shadow:none}button.disabled.warning:hover,button.disabled.warning:focus,button[disabled].warning:hover,button[disabled].warning:focus,.button.disabled.warning:hover,.button.disabled.warning:focus,.button[disabled].warning:hover,.button[disabled].warning:focus{background-color:#cf6e0e}button.disabled.warning:hover,button.disabled.warning:focus,button[disabled].warning:hover,button[disabled].warning:focus,.button.disabled.warning:hover,.button.disabled.warning:focus,.button[disabled].warning:hover,.button[disabled].warning:focus{color:#fff}button.disabled.warning:hover,button.disabled.warning:focus,button[disabled].warning:hover,button[disabled].warning:focus,.button.disabled.warning:hover,.button.disabled.warning:focus,.button[disabled].warning:hover,.button[disabled].warning:focus{background-color:#f08a24}button.disabled.info,button[disabled].info,.button.disabled.info,.button[disabled].info{background-color:#a0d3e8;border-color:#61b6d9;color:#333;cursor:default;opacity:0.7;box-shadow:none}button.disabled.info:hover,button.disabled.info:focus,button[disabled].info:hover,button[disabled].info:focus,.button.disabled.info:hover,.button.disabled.info:focus,.button[disabled].info:hover,.button[disabled].info:focus{background-color:#61b6d9}button.disabled.info:hover,button.disabled.info:focus,button[disabled].info:hover,button[disabled].info:focus,.button.disabled.info:hover,.button.disabled.info:focus,.button[disabled].info:hover,.button[disabled].info:focus{color:#fff}button.disabled.info:hover,button.disabled.info:focus,button[disabled].info:hover,button[disabled].info:focus,.button.disabled.info:hover,.button.disabled.info:focus,.button[disabled].info:hover,.button[disabled].info:focus{background-color:#a0d3e8}button::-moz-focus-inner{border:0;padding:0}@media only screen and (min-width: 40.063em){button,.button{display:inline-block}}form{margin:0 0 1rem}form .row .row{margin:0 -0.5rem}form .row .row .column,form .row .row .columns{padding:0 0.5rem}form .row .row.collapse{margin:0}form .row .row.collapse .column,form .row .row.collapse .columns{padding:0}form .row .row.collapse input{-webkit-border-bottom-right-radius:0;-webkit-border-top-right-radius:0;border-bottom-right-radius:0;border-top-right-radius:0}form .row input.column,form .row input.columns,form .row textarea.column,form .row textarea.columns{padding-left:0.5rem}label{font-size:0.875rem;color:#4d4d4d;cursor:pointer;display:block;font-weight:normal;line-height:1.5;margin-bottom:0}label.right{float:none !important;text-align:right}label.inline{margin:0 0 1rem 0;padding:0.5625rem 0}label small{text-transform:capitalize;color:#676767}.prefix,.postfix{display:block;position:relative;z-index:2;text-align:center;width:100%;padding-top:0;padding-bottom:0;border-style:solid;border-width:1px;overflow:visible;font-size:0.875rem;height:2.3125rem;line-height:2.3125rem}.postfix.button{padding-left:0;padding-right:0;padding-top:0;padding-bottom:0;text-align:center;border:none}.prefix.button{padding-left:0;padding-right:0;padding-top:0;padding-bottom:0;text-align:center;border:none}.prefix.button.radius{border-radius:0;-webkit-border-bottom-left-radius:0px;-webkit-border-top-left-radius:0px;border-bottom-left-radius:0px;border-top-left-radius:0px}.postfix.button.radius{border-radius:0;-webkit-border-bottom-right-radius:0px;-webkit-border-top-right-radius:0px;border-bottom-right-radius:0px;border-top-right-radius:0px}.prefix.button.round{border-radius:0;-webkit-border-bottom-left-radius:1000px;-webkit-border-top-left-radius:1000px;border-bottom-left-radius:1000px;border-top-left-radius:1000px}.postfix.button.round{border-radius:0;-webkit-border-bottom-right-radius:1000px;-webkit-border-top-right-radius:1000px;border-bottom-right-radius:1000px;border-top-right-radius:1000px}span.prefix,label.prefix{background:#f2f2f2;border-right:none;color:#333;border-color:#ccc}span.postfix,label.postfix{background:#f2f2f2;border-left:none;color:#333;border-color:#ccc}input[type="text"],input[type="password"],input[type="date"],input[type="datetime"],input[type="datetime-local"],input[type="month"],input[type="week"],input[type="email"],input[type="number"],input[type="search"],input[type="tel"],input[type="time"],input[type="url"],input[type="color"],textarea{-webkit-appearance:none;border-radius:0;background-color:#fff;font-family:inherit;border-style:solid;border-width:1px;border-color:#ccc;box-shadow:inset 0 1px 2px rgba(0,0,0,0.1);color:rgba(0,0,0,0.75);display:block;font-size:0.875rem;margin:0 0 1rem 0;padding:0.5rem;height:2.3125rem;width:100%;-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;transition:all 0.15s linear}input[type="text"]:focus,input[type="password"]:focus,input[type="date"]:focus,input[type="datetime"]:focus,input[type="datetime-local"]:focus,input[type="month"]:focus,input[type="week"]:focus,input[type="email"]:focus,input[type="number"]:focus,input[type="search"]:focus,input[type="tel"]:focus,input[type="time"]:focus,input[type="url"]:focus,input[type="color"]:focus,textarea:focus{background:#fafafa;border-color:#999;outline:none}input[type="text"]:disabled,input[type="password"]:disabled,input[type="date"]:disabled,input[type="datetime"]:disabled,input[type="datetime-local"]:disabled,input[type="month"]:disabled,input[type="week"]:disabled,input[type="email"]:disabled,input[type="number"]:disabled,input[type="search"]:disabled,input[type="tel"]:disabled,input[type="time"]:disabled,input[type="url"]:disabled,input[type="color"]:disabled,textarea:disabled{background-color:#ddd;cursor:default}input[type="text"][disabled],input[type="text"][readonly],fieldset[disabled] input[type="text"],input[type="password"][disabled],input[type="password"][readonly],fieldset[disabled] input[type="password"],input[type="date"][disabled],input[type="date"][readonly],fieldset[disabled] input[type="date"],input[type="datetime"][disabled],input[type="datetime"][readonly],fieldset[disabled] input[type="datetime"],input[type="datetime-local"][disabled],input[type="datetime-local"][readonly],fieldset[disabled] input[type="datetime-local"],input[type="month"][disabled],input[type="month"][readonly],fieldset[disabled] input[type="month"],input[type="week"][disabled],input[type="week"][readonly],fieldset[disabled] input[type="week"],input[type="email"][disabled],input[type="email"][readonly],fieldset[disabled] input[type="email"],input[type="number"][disabled],input[type="number"][readonly],fieldset[disabled] input[type="number"],input[type="search"][disabled],input[type="search"][readonly],fieldset[disabled] input[type="search"],input[type="tel"][disabled],input[type="tel"][readonly],fieldset[disabled] input[type="tel"],input[type="time"][disabled],input[type="time"][readonly],fieldset[disabled] input[type="time"],input[type="url"][disabled],input[type="url"][readonly],fieldset[disabled] input[type="url"],input[type="color"][disabled],input[type="color"][readonly],fieldset[disabled] input[type="color"],textarea[disabled],textarea[readonly],fieldset[disabled] textarea{background-color:#ddd;cursor:default}input[type="text"].radius,input[type="password"].radius,input[type="date"].radius,input[type="datetime"].radius,input[type="datetime-local"].radius,input[type="month"].radius,input[type="week"].radius,input[type="email"].radius,input[type="number"].radius,input[type="search"].radius,input[type="tel"].radius,input[type="time"].radius,input[type="url"].radius,input[type="color"].radius,textarea.radius{border-radius:0px}form .row .prefix-radius.row.collapse input,form .row .prefix-radius.row.collapse textarea,form .row .prefix-radius.row.collapse select,form .row .prefix-radius.row.collapse button{border-radius:0;-webkit-border-bottom-right-radius:0px;-webkit-border-top-right-radius:0px;border-bottom-right-radius:0px;border-top-right-radius:0px}form .row .prefix-radius.row.collapse .prefix{border-radius:0;-webkit-border-bottom-left-radius:0px;-webkit-border-top-left-radius:0px;border-bottom-left-radius:0px;border-top-left-radius:0px}form .row .postfix-radius.row.collapse input,form .row .postfix-radius.row.collapse textarea,form .row .postfix-radius.row.collapse select,form .row .postfix-radius.row.collapse button{border-radius:0;-webkit-border-bottom-left-radius:0px;-webkit-border-top-left-radius:0px;border-bottom-left-radius:0px;border-top-left-radius:0px}form .row .postfix-radius.row.collapse .postfix{border-radius:0;-webkit-border-bottom-right-radius:0px;-webkit-border-top-right-radius:0px;border-bottom-right-radius:0px;border-top-right-radius:0px}form .row .prefix-round.row.collapse input,form .row .prefix-round.row.collapse textarea,form .row .prefix-round.row.collapse select,form .row .prefix-round.row.collapse button{border-radius:0;-webkit-border-bottom-right-radius:1000px;-webkit-border-top-right-radius:1000px;border-bottom-right-radius:1000px;border-top-right-radius:1000px}form .row .prefix-round.row.collapse .prefix{border-radius:0;-webkit-border-bottom-left-radius:1000px;-webkit-border-top-left-radius:1000px;border-bottom-left-radius:1000px;border-top-left-radius:1000px}form .row .postfix-round.row.collapse input,form .row .postfix-round.row.collapse textarea,form .row .postfix-round.row.collapse select,form .row .postfix-round.row.collapse button{border-radius:0;-webkit-border-bottom-left-radius:1000px;-webkit-border-top-left-radius:1000px;border-bottom-left-radius:1000px;border-top-left-radius:1000px}form .row .postfix-round.row.collapse .postfix{border-radius:0;-webkit-border-bottom-right-radius:1000px;-webkit-border-top-right-radius:1000px;border-bottom-right-radius:1000px;border-top-right-radius:1000px}input[type="submit"]{-webkit-appearance:none;border-radius:0}textarea[rows]{height:auto}textarea{max-width:100%}select{-webkit-appearance:none !important;border-radius:0;background-color:#FAFAFA;background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZlcnNpb249IjEuMSIgeD0iMTJweCIgeT0iMHB4IiB3aWR0aD0iMjRweCIgaGVpZ2h0PSIzcHgiIHZpZXdCb3g9IjAgMCA2IDMiIGVuYWJsZS1iYWNrZ3JvdW5kPSJuZXcgMCAwIDYgMyIgeG1sOnNwYWNlPSJwcmVzZXJ2ZSI+PHBvbHlnb24gcG9pbnRzPSI1Ljk5MiwwIDIuOTkyLDMgLTAuMDA4LDAgIi8+PC9zdmc+);background-position:100% center;background-repeat:no-repeat;border-style:solid;border-width:1px;border-color:#ccc;padding:0.5rem;font-size:0.875rem;font-family:"Helvetica Neue",Helvetica,Roboto,Arial,sans-serif;color:rgba(0,0,0,0.75);line-height:normal;border-radius:0;height:2.3125rem}select::-ms-expand{display:none}select.radius{border-radius:0px}select:hover{background-color:#f3f3f3;border-color:#999}select:disabled{background-color:#ddd;cursor:default}select[multiple]{height:auto}input[type="file"],input[type="checkbox"],input[type="radio"],select{margin:0 0 1rem 0}input[type="checkbox"]+label,input[type="radio"]+label{display:inline-block;margin-left:0.5rem;margin-right:1rem;margin-bottom:0;vertical-align:baseline}input[type="file"]{width:100%}fieldset{border:1px solid #ddd;padding:1.25rem;margin:1.125rem 0}fieldset legend{font-weight:bold;background:#fff;padding:0 0.1875rem;margin:0;margin-left:-0.1875rem}[data-abide] .error small.error,[data-abide] .error span.error,[data-abide] span.error,[data-abide] small.error{display:block;padding:0.375rem 0.5625rem 0.5625rem;margin-top:-1px;margin-bottom:1rem;font-size:0.75rem;font-weight:normal;font-style:italic;background:#c60f13;color:#fff}[data-abide] span.error,[data-abide] small.error{display:none}span.error,small.error{display:block;padding:0.375rem 0.5625rem 0.5625rem;margin-top:-1px;margin-bottom:1rem;font-size:0.75rem;font-weight:normal;font-style:italic;background:#c60f13;color:#fff}.error input,.error textarea,.error select{margin-bottom:0}.error input[type="checkbox"],.error input[type="radio"]{margin-bottom:1rem}.error label,.error label.error{color:#c60f13}.error small.error{display:block;padding:0.375rem 0.5625rem 0.5625rem;margin-top:-1px;margin-bottom:1rem;font-size:0.75rem;font-weight:normal;font-style:italic;background:#c60f13;color:#fff}.error>label>small{color:#676767;background:transparent;padding:0;text-transform:capitalize;font-style:normal;font-size:60%;margin:0;display:inline}.error span.error-message{display:block}input.error,textarea.error,select.error{margin-bottom:0}label.error{color:#c60f13}meta.foundation-mq-topbar{font-family:"/only screen and (min-width:40.063em)/";width:58.75em}.contain-to-grid{width:100%;background:#333}.contain-to-grid .top-bar{margin-bottom:0}.fixed{width:100%;left:0;position:fixed;top:0;z-index:99}.fixed.expanded:not(.top-bar){overflow-y:auto;height:auto;width:100%;max-height:100%}.fixed.expanded:not(.top-bar) .title-area{position:fixed;width:100%;z-index:99}.fixed.expanded:not(.top-bar) .top-bar-section{z-index:98;margin-top:2.8125rem}.top-bar{overflow:hidden;height:2.8125rem;line-height:2.8125rem;position:relative;background:#333;margin-bottom:0}.top-bar ul{margin-bottom:0;list-style:none}.top-bar .row{max-width:none}.top-bar form,.top-bar input{margin-bottom:0}.top-bar input{height:1.75rem;padding-top:.35rem;padding-bottom:.35rem;font-size:0.75rem}.top-bar .button,.top-bar button{padding-top:0.4125rem;padding-bottom:0.4125rem;margin-bottom:0;font-size:0.75rem}@media only screen and (max-width: 40em){.top-bar .button,.top-bar button{position:relative;top:-1px}}.top-bar .title-area{position:relative;margin:0}.top-bar .name{height:2.8125rem;margin:0;font-size:16px}.top-bar .name h1,.top-bar .name h2,.top-bar .name h3,.top-bar .name h4,.top-bar .name p,.top-bar .name span{line-height:2.8125rem;font-size:1.0625rem;margin:0}.top-bar .name h1 a,.top-bar .name h2 a,.top-bar .name h3 a,.top-bar .name h4 a,.top-bar .name p a,.top-bar .name span a{font-weight:normal;color:#fff;width:75%;display:block;padding:0 0.9375rem}.top-bar .toggle-topbar{position:absolute;right:0;top:0}.top-bar .toggle-topbar a{color:#fff;text-transform:uppercase;font-size:0.8125rem;font-weight:bold;position:relative;display:block;padding:0 0.9375rem;height:2.8125rem;line-height:2.8125rem}.top-bar .toggle-topbar.menu-icon{top:50%;margin-top:-16px}.top-bar .toggle-topbar.menu-icon a{height:34px;line-height:33px;padding:0 2.5rem 0 0.9375rem;color:#fff;position:relative}.top-bar .toggle-topbar.menu-icon a span::after{content:"";position:absolute;display:block;height:0;top:50%;margin-top:-8px;right:0.9375rem;box-shadow:0 0 0 1px #fff,0 7px 0 1px #fff,0 14px 0 1px #fff;width:16px}.top-bar .toggle-topbar.menu-icon a span:hover:after{box-shadow:0 0 0 1px "",0 7px 0 1px "",0 14px 0 1px ""}.top-bar.expanded{height:auto;background:transparent}.top-bar.expanded .title-area{background:#333}.top-bar.expanded .toggle-topbar a{color:#888}.top-bar.expanded .toggle-topbar a span::after{box-shadow:0 0 0 1px #888,0 7px 0 1px #888,0 14px 0 1px #888}.top-bar-section{left:0;position:relative;width:auto;transition:left 300ms ease-out}.top-bar-section ul{padding:0;width:100%;height:auto;display:block;font-size:16px;margin:0}.top-bar-section .divider,.top-bar-section [role="separator"]{border-top:solid 1px #1a1a1a;clear:both;height:1px;width:100%}.top-bar-section ul li{background:#333}.top-bar-section ul li>a{display:block;width:100%;color:#fff;padding:12px 0 12px 0;padding-left:0.9375rem;font-family:"Helvetica Neue",Helvetica,Roboto,Arial,sans-serif;font-size:0.8125rem;font-weight:normal;text-transform:none}.top-bar-section ul li>a.button{font-size:0.8125rem;padding-right:0.9375rem;padding-left:0.9375rem;background-color:#393939;border-color:#2e2e2e;color:#fff}.top-bar-section ul li>a.button:hover,.top-bar-section ul li>a.button:focus{background-color:#2e2e2e}.top-bar-section ul li>a.button:hover,.top-bar-section ul li>a.button:focus{color:#fff}.top-bar-section ul li>a.button.secondary{background-color:#e9e9e9;border-color:#bababa;color:#333}.top-bar-section ul li>a.button.secondary:hover,.top-bar-section ul li>a.button.secondary:focus{background-color:#bababa}.top-bar-section ul li>a.button.secondary:hover,.top-bar-section ul li>a.button.secondary:focus{color:#333}.top-bar-section ul li>a.button.success{background-color:#5da423;border-color:#4a831c;color:#fff}.top-bar-section ul li>a.button.success:hover,.top-bar-section ul li>a.button.success:focus{background-color:#4a831c}.top-bar-section ul li>a.button.success:hover,.top-bar-section ul li>a.button.success:focus{color:#fff}.top-bar-section ul li>a.button.alert{background-color:#c60f13;border-color:#9e0c0f;color:#fff}.top-bar-section ul li>a.button.alert:hover,.top-bar-section ul li>a.button.alert:focus{background-color:#9e0c0f}.top-bar-section ul li>a.button.alert:hover,.top-bar-section ul li>a.button.alert:focus{color:#fff}.top-bar-section ul li>a.button.warning{background-color:#f08a24;border-color:#cf6e0e;color:#fff}.top-bar-section ul li>a.button.warning:hover,.top-bar-section ul li>a.button.warning:focus{background-color:#cf6e0e}.top-bar-section ul li>a.button.warning:hover,.top-bar-section ul li>a.button.warning:focus{color:#fff}.top-bar-section ul li>button{font-size:0.8125rem;padding-right:0.9375rem;padding-left:0.9375rem;background-color:#393939;border-color:#2e2e2e;color:#fff}.top-bar-section ul li>button:hover,.top-bar-section ul li>button:focus{background-color:#2e2e2e}.top-bar-section ul li>button:hover,.top-bar-section ul li>button:focus{color:#fff}.top-bar-section ul li>button.secondary{background-color:#e9e9e9;border-color:#bababa;color:#333}.top-bar-section ul li>button.secondary:hover,.top-bar-section ul li>button.secondary:focus{background-color:#bababa}.top-bar-section ul li>button.secondary:hover,.top-bar-section ul li>button.secondary:focus{color:#333}.top-bar-section ul li>button.success{background-color:#5da423;border-color:#4a831c;color:#fff}.top-bar-section ul li>button.success:hover,.top-bar-section ul li>button.success:focus{background-color:#4a831c}.top-bar-section ul li>button.success:hover,.top-bar-section ul li>button.success:focus{color:#fff}.top-bar-section ul li>button.alert{background-color:#c60f13;border-color:#9e0c0f;color:#fff}.top-bar-section ul li>button.alert:hover,.top-bar-section ul li>button.alert:focus{background-color:#9e0c0f}.top-bar-section ul li>button.alert:hover,.top-bar-section ul li>button.alert:focus{color:#fff}.top-bar-section ul li>button.warning{background-color:#f08a24;border-color:#cf6e0e;color:#fff}.top-bar-section ul li>button.warning:hover,.top-bar-section ul li>button.warning:focus{background-color:#cf6e0e}.top-bar-section ul li>button.warning:hover,.top-bar-section ul li>button.warning:focus{color:#fff}.top-bar-section ul li:hover:not(.has-form)>a{background-color:#555;background:#333;color:#fff}.top-bar-section ul li.active>a{background:#393939;color:#fff}.top-bar-section ul li.active>a:hover{background:#313131;color:#fff}.top-bar-section .has-form{padding:0.9375rem}.top-bar-section .has-dropdown{position:relative}.top-bar-section .has-dropdown>a:after{content:"";display:block;width:0;height:0;border:inset 5px;border-color:transparent transparent transparent rgba(255,255,255,0.4);border-left-style:solid;margin-right:0.9375rem;margin-top:-4.5px;position:absolute;top:50%;right:0}.top-bar-section .has-dropdown.moved{position:static}.top-bar-section .has-dropdown.moved>.dropdown{display:block;position:static !important;height:auto;width:auto;overflow:visible;clip:auto;position:absolute !important;width:100%}.top-bar-section .has-dropdown.moved>a:after{display:none}.top-bar-section .dropdown{padding:0;position:absolute;left:100%;top:0;z-index:99;display:block;position:absolute !important;height:1px;width:1px;overflow:hidden;clip:rect(1px, 1px, 1px, 1px)}.top-bar-section .dropdown li{width:100%;height:auto}.top-bar-section .dropdown li a{font-weight:normal;padding:8px 0.9375rem}.top-bar-section .dropdown li a.parent-link{font-weight:normal}.top-bar-section .dropdown li.title h5,.top-bar-section .dropdown li.parent-link{margin-bottom:0;margin-top:0;font-size:1.125rem}.top-bar-section .dropdown li.title h5 a,.top-bar-section .dropdown li.parent-link a{color:#fff;display:block}.top-bar-section .dropdown li.title h5 a:hover,.top-bar-section .dropdown li.parent-link a:hover{background:none}.top-bar-section .dropdown li.has-form{padding:8px 0.9375rem}.top-bar-section .dropdown li .button,.top-bar-section .dropdown li button{top:auto}.top-bar-section .dropdown label{padding:8px 0.9375rem 2px;margin-bottom:0;text-transform:uppercase;color:#777;font-weight:bold;font-size:0.625rem}.js-generated{display:block}@media only screen and (min-width: 40.063em){.top-bar{background:#333;overflow:visible}.top-bar:before,.top-bar:after{content:" ";display:table}.top-bar:after{clear:both}.top-bar .toggle-topbar{display:none}.top-bar .title-area{float:left}.top-bar .name h1 a,.top-bar .name h2 a,.top-bar .name h3 a,.top-bar .name h4 a,.top-bar .name h5 a,.top-bar .name h6 a{width:auto}.top-bar input,.top-bar .button,.top-bar button{font-size:0.875rem;position:relative;height:1.75rem;top:0.53125rem}.top-bar.expanded{background:#333}.contain-to-grid .top-bar{max-width:62.5em;margin:0 auto;margin-bottom:0}.top-bar-section{transition:none 0 0;left:0 !important}.top-bar-section ul{width:auto;height:auto !important;display:inline}.top-bar-section ul li{float:left}.top-bar-section ul li .js-generated{display:none}.top-bar-section li.hover>a:not(.button){background-color:#555;background:#333;color:#fff}.top-bar-section li:not(.has-form) a:not(.button){padding:0 0.9375rem;line-height:2.8125rem;background:#333}.top-bar-section li:not(.has-form) a:not(.button):hover{background-color:#555;background:#333}.top-bar-section li.active:not(.has-form) a:not(.button){padding:0 0.9375rem;line-height:2.8125rem;color:#fff;background:#393939}.top-bar-section li.active:not(.has-form) a:not(.button):hover{background:#313131;color:#fff}.top-bar-section .has-dropdown>a{padding-right:2.1875rem !important}.top-bar-section .has-dropdown>a:after{content:"";display:block;width:0;height:0;border:inset 5px;border-color:rgba(255,255,255,0.4) transparent transparent transparent;border-top-style:solid;margin-top:-2.5px;top:1.40625rem}.top-bar-section .has-dropdown.moved{position:relative}.top-bar-section .has-dropdown.moved>.dropdown{display:block;position:absolute !important;height:1px;width:1px;overflow:hidden;clip:rect(1px, 1px, 1px, 1px)}.top-bar-section .has-dropdown.hover>.dropdown,.top-bar-section .has-dropdown.not-click:hover>.dropdown{display:block;position:static !important;height:auto;width:auto;overflow:visible;clip:auto;position:absolute !important}.top-bar-section .has-dropdown>a:focus+.dropdown{display:block;position:static !important;height:auto;width:auto;overflow:visible;clip:auto;position:absolute !important}.top-bar-section .has-dropdown .dropdown li.has-dropdown>a:after{border:none;content:"\00bb";top:1rem;margin-top:-1px;right:5px;line-height:1.2}.top-bar-section .dropdown{left:0;top:auto;background:transparent;min-width:100%}.top-bar-section .dropdown li a{color:#fff;line-height:2.8125rem;white-space:nowrap;padding:12px 0.9375rem;background:#333}.top-bar-section .dropdown li:not(.has-form):not(.active)>a:not(.button){color:#fff;background:#333}.top-bar-section .dropdown li:not(.has-form):not(.active):hover>a:not(.button){color:#fff;background-color:#555;background:#333}.top-bar-section .dropdown li label{white-space:nowrap;background:#333}.top-bar-section .dropdown li .dropdown{left:100%;top:0}.top-bar-section>ul>.divider,.top-bar-section>ul>[role="separator"]{border-bottom:none;border-top:none;border-right:solid 1px #4e4e4e;clear:none;height:2.8125rem;width:0}.top-bar-section .has-form{background:#333;padding:0 0.9375rem;height:2.8125rem}.top-bar-section .right li .dropdown{left:auto;right:0}.top-bar-section .right li .dropdown li .dropdown{right:100%}.top-bar-section .left li .dropdown{right:auto;left:0}.top-bar-section .left li .dropdown li .dropdown{left:100%}.no-js .top-bar-section ul li:hover>a{background-color:#555;background:#333;color:#fff}.no-js .top-bar-section ul li:active>a{background:#393939;color:#fff}.no-js .top-bar-section .has-dropdown:hover>.dropdown{display:block;position:static !important;height:auto;width:auto;overflow:visible;clip:auto;position:absolute !important}.no-js .top-bar-section .has-dropdown>a:focus+.dropdown{display:block;position:static !important;height:auto;width:auto;overflow:visible;clip:auto;position:absolute !important}}.breadcrumbs{display:block;padding:0.5625rem 0.875rem 0.5625rem;overflow:hidden;margin-left:0;list-style:none;border-style:solid;border-width:1px;background-color:#f5f5f5;border-color:#ddd;border-radius:0px}.breadcrumbs>*{margin:0;float:left;font-size:0.6875rem;line-height:0.6875rem;text-transform:uppercase;color:#393939}.breadcrumbs>*:hover a,.breadcrumbs>*:focus a{text-decoration:underline}.breadcrumbs>* a{color:#393939}.breadcrumbs>*.current{cursor:default;color:#333}.breadcrumbs>*.current a{cursor:default;color:#333}.breadcrumbs>*.current:hover,.breadcrumbs>*.current:hover a,.breadcrumbs>*.current:focus,.breadcrumbs>*.current:focus a{text-decoration:none}.breadcrumbs>*.unavailable{color:#999}.breadcrumbs>*.unavailable a{color:#999}.breadcrumbs>*.unavailable:hover,.breadcrumbs>*.unavailable:hover a,.breadcrumbs>*.unavailable:focus,.breadcrumbs>*.unavailable a:focus{text-decoration:none;color:#999;cursor:not-allowed}.breadcrumbs>*:before{content:"/";color:#aaa;margin:0 0.75rem;position:relative;top:1px}.breadcrumbs>*:first-child:before{content:" ";margin:0}[aria-label="breadcrumbs"] [aria-hidden="true"]:after{content:"/"}.alert-box{border-style:solid;border-width:1px;display:block;font-weight:normal;margin-bottom:1.25rem;position:relative;padding:0.875rem 1.5rem 0.875rem 0.875rem;font-size:0.8125rem;transition:opacity 300ms ease-out;background-color:#393939;border-color:#313131;color:#fff}.alert-box .close{font-size:1.375rem;padding:0 6px 4px;line-height:.9;position:absolute;top:50%;margin-top:-0.6875rem;right:0.25rem;color:#333;opacity:0.3;background:inherit}.alert-box .close:hover,.alert-box .close:focus{opacity:0.5}.alert-box.radius{border-radius:0px}.alert-box.round{border-radius:1000px}.alert-box.success{background-color:#5da423;border-color:#508d1e;color:#fff}.alert-box.alert{background-color:#c60f13;border-color:#aa0d10;color:#fff}.alert-box.secondary{background-color:#e9e9e9;border-color:#c8c8c8;color:#4f4f4f}.alert-box.warning{background-color:#f08a24;border-color:#de770f;color:#fff}.alert-box.info{background-color:#a0d3e8;border-color:#74bfdd;color:#4f4f4f}.alert-box.alert-close{opacity:0}.icon-bar{width:100%;font-size:0;display:inline-block;background:#333}.icon-bar>*{text-align:center;font-size:1rem;width:25%;margin:0 auto;display:block;padding:1.25rem;float:left}.icon-bar>* i,.icon-bar>* img{display:block;margin:0 auto}.icon-bar>* i+label,.icon-bar>* img+label{margin-top:.0625rem}.icon-bar>* i{font-size:1.875rem;vertical-align:middle}.icon-bar>* img{width:1.875rem;height:1.875rem}.icon-bar.label-right>* i,.icon-bar.label-right>* img{margin:0 .0625rem 0 0;display:inline-block}.icon-bar.label-right>* i+label,.icon-bar.label-right>* img+label{margin-top:0}.icon-bar.label-right>* label{display:inline-block}.icon-bar.vertical.label-right>*{text-align:left}.icon-bar.vertical,.icon-bar.small-vertical{height:100%;width:auto}.icon-bar.vertical .item,.icon-bar.small-vertical .item{width:auto;margin:auto;float:none}@media only screen and (min-width: 40.063em){.icon-bar.medium-vertical{height:100%;width:auto}.icon-bar.medium-vertical .item{width:auto;margin:auto;float:none}}@media only screen and (min-width: 64.063em){.icon-bar.large-vertical{height:100%;width:auto}.icon-bar.large-vertical .item{width:auto;margin:auto;float:none}}.icon-bar>*{font-size:1rem;padding:1.25rem}.icon-bar>* i+label,.icon-bar>* img+label{margin-top:.0625rem}.icon-bar>* i{font-size:1.875rem}.icon-bar>* img{width:1.875rem;height:1.875rem}.icon-bar>* label{color:#fff}.icon-bar>* i{color:#fff}.icon-bar>a:hover{background:#393939}.icon-bar>a:hover label{color:#fff}.icon-bar>a:hover i{color:#fff}.icon-bar>a.active{background:#393939}.icon-bar>a.active label{color:#fff}.icon-bar>a.active i{color:#fff}.icon-bar .item.disabled{opacity:0.7;cursor:not-allowed;pointer-events:none}.icon-bar .item.disabled>*{opacity:0.7;cursor:not-allowed}.icon-bar.two-up .item{width:50%}.icon-bar.two-up.vertical .item,.icon-bar.two-up.small-vertical .item{width:auto}@media only screen and (min-width: 40.063em){.icon-bar.two-up.medium-vertical .item{width:auto}}@media only screen and (min-width: 64.063em){.icon-bar.two-up.large-vertical .item{width:auto}}.icon-bar.three-up .item{width:33.3333%}.icon-bar.three-up.vertical .item,.icon-bar.three-up.small-vertical .item{width:auto}@media only screen and (min-width: 40.063em){.icon-bar.three-up.medium-vertical .item{width:auto}}@media only screen and (min-width: 64.063em){.icon-bar.three-up.large-vertical .item{width:auto}}.icon-bar.four-up .item{width:25%}.icon-bar.four-up.vertical .item,.icon-bar.four-up.small-vertical .item{width:auto}@media only screen and (min-width: 40.063em){.icon-bar.four-up.medium-vertical .item{width:auto}}@media only screen and (min-width: 64.063em){.icon-bar.four-up.large-vertical .item{width:auto}}.icon-bar.five-up .item{width:20%}.icon-bar.five-up.vertical .item,.icon-bar.five-up.small-vertical .item{width:auto}@media only screen and (min-width: 40.063em){.icon-bar.five-up.medium-vertical .item{width:auto}}@media only screen and (min-width: 64.063em){.icon-bar.five-up.large-vertical .item{width:auto}}.icon-bar.six-up .item{width:16.66667%}.icon-bar.six-up.vertical .item,.icon-bar.six-up.small-vertical .item{width:auto}@media only screen and (min-width: 40.063em){.icon-bar.six-up.medium-vertical .item{width:auto}}@media only screen and (min-width: 64.063em){.icon-bar.six-up.large-vertical .item{width:auto}}.icon-bar.seven-up .item{width:14.28571%}.icon-bar.seven-up.vertical .item,.icon-bar.seven-up.small-vertical .item{width:auto}@media only screen and (min-width: 40.063em){.icon-bar.seven-up.medium-vertical .item{width:auto}}@media only screen and (min-width: 64.063em){.icon-bar.seven-up.large-vertical .item{width:auto}}.icon-bar.eight-up .item{width:12.5%}.icon-bar.eight-up.vertical .item,.icon-bar.eight-up.small-vertical .item{width:auto}@media only screen and (min-width: 40.063em){.icon-bar.eight-up.medium-vertical .item{width:auto}}@media only screen and (min-width: 64.063em){.icon-bar.eight-up.large-vertical .item{width:auto}}.side-nav{display:block;margin:0;padding:0.875rem 0;list-style-type:none;list-style-position:outside;font-family:"Helvetica Neue",Helvetica,Roboto,Arial,sans-serif}.side-nav li{margin:0 0 0.4375rem 0;font-size:0.875rem;font-weight:normal}.side-nav li a:not(.button){display:block;color:#393939;margin:0;padding:0.4375rem 0.875rem}.side-nav li a:not(.button):hover,.side-nav li a:not(.button):focus{background:rgba(0,0,0,0.025);color:#747474}.side-nav li.active>a:first-child:not(.button){color:#747474;font-weight:normal;font-family:"Helvetica Neue",Helvetica,Roboto,Arial,sans-serif}.side-nav li.divider{border-top:1px solid;height:0;padding:0;list-style:none;border-top-color:#fff}.side-nav li.heading{color:#393939;font-size:0.875rem;font-weight:bold;text-transform:uppercase}.clearing-thumbs,[data-clearing]{margin-bottom:0;margin-left:0;list-style:none}.clearing-thumbs:before,.clearing-thumbs:after,[data-clearing]:before,[data-clearing]:after{content:" ";display:table}.clearing-thumbs:after,[data-clearing]:after{clear:both}.clearing-thumbs li,[data-clearing] li{float:left;margin-right:10px}.clearing-thumbs[class*="block-grid-"] li,[data-clearing][class*="block-grid-"] li{margin-right:0}.clearing-blackout{background:#333;position:fixed;width:100%;height:100%;top:0;left:0;z-index:998}.clearing-blackout .clearing-close{display:block}.clearing-container{position:relative;z-index:998;height:100%;overflow:hidden;margin:0}.clearing-touch-label{position:absolute;top:50%;left:50%;color:#aaa;font-size:0.6em}.visible-img{height:95%;position:relative}.visible-img img{position:absolute;left:50%;top:50%;transform:translateY(-50%) translateX(-50%);-webkit-transform:translateY(-50%) translateX(-50%);-ms-transform:translateY(-50%) translateX(-50%);max-height:100%;max-width:100%}.clearing-caption{color:#ccc;font-size:0.875em;line-height:1.3;margin-bottom:0;text-align:center;bottom:0;background:#333;width:100%;padding:10px 30px 20px;position:absolute;left:0}.clearing-close{z-index:999;padding-left:20px;padding-top:10px;font-size:30px;line-height:1;color:#ccc;display:none}.clearing-close:hover,.clearing-close:focus{color:#ccc}.clearing-assembled .clearing-container{height:100%}.clearing-assembled .clearing-container .carousel>ul{display:none}.clearing-feature li{display:none}.clearing-feature li.clearing-featured-img{display:block}@media only screen and (min-width: 40.063em){.clearing-main-prev,.clearing-main-next{position:absolute;height:100%;width:40px;top:0}.clearing-main-prev>span,.clearing-main-next>span{position:absolute;top:50%;display:block;width:0;height:0;border:solid 12px}.clearing-main-prev>span:hover,.clearing-main-next>span:hover{opacity:0.8}.clearing-main-prev{left:0}.clearing-main-prev>span{left:5px;border-color:transparent;border-right-color:#ccc}.clearing-main-next{right:0}.clearing-main-next>span{border-color:transparent;border-left-color:#ccc}.clearing-main-prev.disabled,.clearing-main-next.disabled{opacity:0.3}.clearing-assembled .clearing-container .carousel{background:rgba(51,51,51,0.8);height:120px;margin-top:10px;text-align:center}.clearing-assembled .clearing-container .carousel>ul{display:inline-block;z-index:999;height:100%;position:relative;float:none}.clearing-assembled .clearing-container .carousel>ul li{display:block;width:120px;min-height:inherit;float:left;overflow:hidden;margin-right:0;padding:0;position:relative;cursor:pointer;opacity:0.4;clear:none}.clearing-assembled .clearing-container .carousel>ul li.fix-height img{height:100%;max-width:none}.clearing-assembled .clearing-container .carousel>ul li a.th{border:none;box-shadow:none;display:block}.clearing-assembled .clearing-container .carousel>ul li img{cursor:pointer !important;width:100% !important}.clearing-assembled .clearing-container .carousel>ul li.visible{opacity:1}.clearing-assembled .clearing-container .carousel>ul li:hover{opacity:0.8}.clearing-assembled .clearing-container .visible-img{background:#333;overflow:hidden;height:85%}.clearing-close{position:absolute;top:10px;right:20px;padding-left:0;padding-top:0}}.sub-nav{display:block;width:auto;overflow:hidden;margin-bottom:-0.25rem 0 1.125rem;padding-top:0.25rem}.sub-nav dt{text-transform:uppercase}.sub-nav dt,.sub-nav dd,.sub-nav li{float:left;margin-left:1rem;margin-bottom:0;font-family:"Helvetica Neue",Helvetica,Roboto,Arial,sans-serif;font-weight:normal;font-size:0.875rem;color:#999}.sub-nav dt a,.sub-nav dd a,.sub-nav li a{text-decoration:none;color:#999;padding:0.1875rem 1rem}.sub-nav dt a:hover,.sub-nav dd a:hover,.sub-nav li a:hover{color:#737373}.sub-nav dt.active a,.sub-nav dd.active a,.sub-nav li.active a{border-radius:3px;font-weight:normal;background:#393939;padding:0.1875rem 1rem;cursor:default;color:#fff}.sub-nav dt.active a:hover,.sub-nav dd.active a:hover,.sub-nav li.active a:hover{background:#313131}[class*="block-grid-"]{display:block;padding:0;margin:0 -0.625rem}[class*="block-grid-"]:before,[class*="block-grid-"]:after{content:" ";display:table}[class*="block-grid-"]:after{clear:both}[class*="block-grid-"]>li{display:block;height:auto;float:left;padding:0 0.625rem 1.25rem}@media only screen{.small-block-grid-1>li{width:100%;list-style:none}.small-block-grid-1>li:nth-of-type(1n){clear:none}.small-block-grid-1>li:nth-of-type(1n+1){clear:both}.small-block-grid-2>li{width:50%;list-style:none}.small-block-grid-2>li:nth-of-type(1n){clear:none}.small-block-grid-2>li:nth-of-type(2n+1){clear:both}.small-block-grid-3>li{width:33.33333%;list-style:none}.small-block-grid-3>li:nth-of-type(1n){clear:none}.small-block-grid-3>li:nth-of-type(3n+1){clear:both}.small-block-grid-4>li{width:25%;list-style:none}.small-block-grid-4>li:nth-of-type(1n){clear:none}.small-block-grid-4>li:nth-of-type(4n+1){clear:both}.small-block-grid-5>li{width:20%;list-style:none}.small-block-grid-5>li:nth-of-type(1n){clear:none}.small-block-grid-5>li:nth-of-type(5n+1){clear:both}.small-block-grid-6>li{width:16.66667%;list-style:none}.small-block-grid-6>li:nth-of-type(1n){clear:none}.small-block-grid-6>li:nth-of-type(6n+1){clear:both}.small-block-grid-7>li{width:14.28571%;list-style:none}.small-block-grid-7>li:nth-of-type(1n){clear:none}.small-block-grid-7>li:nth-of-type(7n+1){clear:both}.small-block-grid-8>li{width:12.5%;list-style:none}.small-block-grid-8>li:nth-of-type(1n){clear:none}.small-block-grid-8>li:nth-of-type(8n+1){clear:both}.small-block-grid-9>li{width:11.11111%;list-style:none}.small-block-grid-9>li:nth-of-type(1n){clear:none}.small-block-grid-9>li:nth-of-type(9n+1){clear:both}.small-block-grid-10>li{width:10%;list-style:none}.small-block-grid-10>li:nth-of-type(1n){clear:none}.small-block-grid-10>li:nth-of-type(10n+1){clear:both}.small-block-grid-11>li{width:9.09091%;list-style:none}.small-block-grid-11>li:nth-of-type(1n){clear:none}.small-block-grid-11>li:nth-of-type(11n+1){clear:both}.small-block-grid-12>li{width:8.33333%;list-style:none}.small-block-grid-12>li:nth-of-type(1n){clear:none}.small-block-grid-12>li:nth-of-type(12n+1){clear:both}}@media only screen and (min-width: 40.063em){.medium-block-grid-1>li{width:100%;list-style:none}.medium-block-grid-1>li:nth-of-type(1n){clear:none}.medium-block-grid-1>li:nth-of-type(1n+1){clear:both}.medium-block-grid-2>li{width:50%;list-style:none}.medium-block-grid-2>li:nth-of-type(1n){clear:none}.medium-block-grid-2>li:nth-of-type(2n+1){clear:both}.medium-block-grid-3>li{width:33.33333%;list-style:none}.medium-block-grid-3>li:nth-of-type(1n){clear:none}.medium-block-grid-3>li:nth-of-type(3n+1){clear:both}.medium-block-grid-4>li{width:25%;list-style:none}.medium-block-grid-4>li:nth-of-type(1n){clear:none}.medium-block-grid-4>li:nth-of-type(4n+1){clear:both}.medium-block-grid-5>li{width:20%;list-style:none}.medium-block-grid-5>li:nth-of-type(1n){clear:none}.medium-block-grid-5>li:nth-of-type(5n+1){clear:both}.medium-block-grid-6>li{width:16.66667%;list-style:none}.medium-block-grid-6>li:nth-of-type(1n){clear:none}.medium-block-grid-6>li:nth-of-type(6n+1){clear:both}.medium-block-grid-7>li{width:14.28571%;list-style:none}.medium-block-grid-7>li:nth-of-type(1n){clear:none}.medium-block-grid-7>li:nth-of-type(7n+1){clear:both}.medium-block-grid-8>li{width:12.5%;list-style:none}.medium-block-grid-8>li:nth-of-type(1n){clear:none}.medium-block-grid-8>li:nth-of-type(8n+1){clear:both}.medium-block-grid-9>li{width:11.11111%;list-style:none}.medium-block-grid-9>li:nth-of-type(1n){clear:none}.medium-block-grid-9>li:nth-of-type(9n+1){clear:both}.medium-block-grid-10>li{width:10%;list-style:none}.medium-block-grid-10>li:nth-of-type(1n){clear:none}.medium-block-grid-10>li:nth-of-type(10n+1){clear:both}.medium-block-grid-11>li{width:9.09091%;list-style:none}.medium-block-grid-11>li:nth-of-type(1n){clear:none}.medium-block-grid-11>li:nth-of-type(11n+1){clear:both}.medium-block-grid-12>li{width:8.33333%;list-style:none}.medium-block-grid-12>li:nth-of-type(1n){clear:none}.medium-block-grid-12>li:nth-of-type(12n+1){clear:both}}@media only screen and (min-width: 64.063em){.large-block-grid-1>li{width:100%;list-style:none}.large-block-grid-1>li:nth-of-type(1n){clear:none}.large-block-grid-1>li:nth-of-type(1n+1){clear:both}.large-block-grid-2>li{width:50%;list-style:none}.large-block-grid-2>li:nth-of-type(1n){clear:none}.large-block-grid-2>li:nth-of-type(2n+1){clear:both}.large-block-grid-3>li{width:33.33333%;list-style:none}.large-block-grid-3>li:nth-of-type(1n){clear:none}.large-block-grid-3>li:nth-of-type(3n+1){clear:both}.large-block-grid-4>li{width:25%;list-style:none}.large-block-grid-4>li:nth-of-type(1n){clear:none}.large-block-grid-4>li:nth-of-type(4n+1){clear:both}.large-block-grid-5>li{width:20%;list-style:none}.large-block-grid-5>li:nth-of-type(1n){clear:none}.large-block-grid-5>li:nth-of-type(5n+1){clear:both}.large-block-grid-6>li{width:16.66667%;list-style:none}.large-block-grid-6>li:nth-of-type(1n){clear:none}.large-block-grid-6>li:nth-of-type(6n+1){clear:both}.large-block-grid-7>li{width:14.28571%;list-style:none}.large-block-grid-7>li:nth-of-type(1n){clear:none}.large-block-grid-7>li:nth-of-type(7n+1){clear:both}.large-block-grid-8>li{width:12.5%;list-style:none}.large-block-grid-8>li:nth-of-type(1n){clear:none}.large-block-grid-8>li:nth-of-type(8n+1){clear:both}.large-block-grid-9>li{width:11.11111%;list-style:none}.large-block-grid-9>li:nth-of-type(1n){clear:none}.large-block-grid-9>li:nth-of-type(9n+1){clear:both}.large-block-grid-10>li{width:10%;list-style:none}.large-block-grid-10>li:nth-of-type(1n){clear:none}.large-block-grid-10>li:nth-of-type(10n+1){clear:both}.large-block-grid-11>li{width:9.09091%;list-style:none}.large-block-grid-11>li:nth-of-type(1n){clear:none}.large-block-grid-11>li:nth-of-type(11n+1){clear:both}.large-block-grid-12>li{width:8.33333%;list-style:none}.large-block-grid-12>li:nth-of-type(1n){clear:none}.large-block-grid-12>li:nth-of-type(12n+1){clear:both}}@media only screen{.show-for-small-only,.show-for-small-up,.show-for-small,.show-for-small-down,.hide-for-medium-only,.hide-for-medium-up,.hide-for-medium,.show-for-medium-down,.hide-for-large-only,.hide-for-large-up,.hide-for-large,.show-for-large-down,.hide-for-xlarge-only,.hide-for-xlarge-up,.hide-for-xlarge,.show-for-xlarge-down,.hide-for-xxlarge-only,.hide-for-xxlarge-up,.hide-for-xxlarge,.show-for-xxlarge-down{display:inherit !important}.hide-for-small-only,.hide-for-small-up,.hide-for-small,.hide-for-small-down,.show-for-medium-only,.show-for-medium-up,.show-for-medium,.hide-for-medium-down,.show-for-large-only,.show-for-large-up,.show-for-large,.hide-for-large-down,.show-for-xlarge-only,.show-for-xlarge-up,.show-for-xlarge,.hide-for-xlarge-down,.show-for-xxlarge-only,.show-for-xxlarge-up,.show-for-xxlarge,.hide-for-xxlarge-down{display:none !important}.visible-for-small-only,.visible-for-small-up,.visible-for-small,.visible-for-small-down,.hidden-for-medium-only,.hidden-for-medium-up,.hidden-for-medium,.visible-for-medium-down,.hidden-for-large-only,.hidden-for-large-up,.hidden-for-large,.visible-for-large-down,.hidden-for-xlarge-only,.hidden-for-xlarge-up,.hidden-for-xlarge,.visible-for-xlarge-down,.hidden-for-xxlarge-only,.hidden-for-xxlarge-up,.hidden-for-xxlarge,.visible-for-xxlarge-down{position:static !important;height:auto;width:auto;overflow:visible;clip:auto}.hidden-for-small-only,.hidden-for-small-up,.hidden-for-small,.hidden-for-small-down,.visible-for-medium-only,.visible-for-medium-up,.visible-for-medium,.hidden-for-medium-down,.visible-for-large-only,.visible-for-large-up,.visible-for-large,.hidden-for-large-down,.visible-for-xlarge-only,.visible-for-xlarge-up,.visible-for-xlarge,.hidden-for-xlarge-down,.visible-for-xxlarge-only,.visible-for-xxlarge-up,.visible-for-xxlarge,.hidden-for-xxlarge-down{position:absolute !important;height:1px;width:1px;overflow:hidden;clip:rect(1px, 1px, 1px, 1px)}table.show-for-small-only,table.show-for-small-up,table.show-for-small,table.show-for-small-down,table.hide-for-medium-only,table.hide-for-medium-up,table.hide-for-medium,table.show-for-medium-down,table.hide-for-large-only,table.hide-for-large-up,table.hide-for-large,table.show-for-large-down,table.hide-for-xlarge-only,table.hide-for-xlarge-up,table.hide-for-xlarge,table.show-for-xlarge-down,table.hide-for-xxlarge-only,table.hide-for-xxlarge-up,table.hide-for-xxlarge,table.show-for-xxlarge-down{display:table !important}thead.show-for-small-only,thead.show-for-small-up,thead.show-for-small,thead.show-for-small-down,thead.hide-for-medium-only,thead.hide-for-medium-up,thead.hide-for-medium,thead.show-for-medium-down,thead.hide-for-large-only,thead.hide-for-large-up,thead.hide-for-large,thead.show-for-large-down,thead.hide-for-xlarge-only,thead.hide-for-xlarge-up,thead.hide-for-xlarge,thead.show-for-xlarge-down,thead.hide-for-xxlarge-only,thead.hide-for-xxlarge-up,thead.hide-for-xxlarge,thead.show-for-xxlarge-down{display:table-header-group !important}tbody.show-for-small-only,tbody.show-for-small-up,tbody.show-for-small,tbody.show-for-small-down,tbody.hide-for-medium-only,tbody.hide-for-medium-up,tbody.hide-for-medium,tbody.show-for-medium-down,tbody.hide-for-large-only,tbody.hide-for-large-up,tbody.hide-for-large,tbody.show-for-large-down,tbody.hide-for-xlarge-only,tbody.hide-for-xlarge-up,tbody.hide-for-xlarge,tbody.show-for-xlarge-down,tbody.hide-for-xxlarge-only,tbody.hide-for-xxlarge-up,tbody.hide-for-xxlarge,tbody.show-for-xxlarge-down{display:table-row-group !important}tr.show-for-small-only,tr.show-for-small-up,tr.show-for-small,tr.show-for-small-down,tr.hide-for-medium-only,tr.hide-for-medium-up,tr.hide-for-medium,tr.show-for-medium-down,tr.hide-for-large-only,tr.hide-for-large-up,tr.hide-for-large,tr.show-for-large-down,tr.hide-for-xlarge-only,tr.hide-for-xlarge-up,tr.hide-for-xlarge,tr.show-for-xlarge-down,tr.hide-for-xxlarge-only,tr.hide-for-xxlarge-up,tr.hide-for-xxlarge,tr.show-for-xxlarge-down{display:table-row}th.show-for-small-only,td.show-for-small-only,th.show-for-small-up,td.show-for-small-up,th.show-for-small,td.show-for-small,th.show-for-small-down,td.show-for-small-down,th.hide-for-medium-only,td.hide-for-medium-only,th.hide-for-medium-up,td.hide-for-medium-up,th.hide-for-medium,td.hide-for-medium,th.show-for-medium-down,td.show-for-medium-down,th.hide-for-large-only,td.hide-for-large-only,th.hide-for-large-up,td.hide-for-large-up,th.hide-for-large,td.hide-for-large,th.show-for-large-down,td.show-for-large-down,th.hide-for-xlarge-only,td.hide-for-xlarge-only,th.hide-for-xlarge-up,td.hide-for-xlarge-up,th.hide-for-xlarge,td.hide-for-xlarge,th.show-for-xlarge-down,td.show-for-xlarge-down,th.hide-for-xxlarge-only,td.hide-for-xxlarge-only,th.hide-for-xxlarge-up,td.hide-for-xxlarge-up,th.hide-for-xxlarge,td.hide-for-xxlarge,th.show-for-xxlarge-down,td.show-for-xxlarge-down{display:table-cell !important}}@media only screen and (min-width: 40.063em){.hide-for-small-only,.show-for-small-up,.hide-for-small,.hide-for-small-down,.show-for-medium-only,.show-for-medium-up,.show-for-medium,.show-for-medium-down,.hide-for-large-only,.hide-for-large-up,.hide-for-large,.show-for-large-down,.hide-for-xlarge-only,.hide-for-xlarge-up,.hide-for-xlarge,.show-for-xlarge-down,.hide-for-xxlarge-only,.hide-for-xxlarge-up,.hide-for-xxlarge,.show-for-xxlarge-down{display:inherit !important}.show-for-small-only,.hide-for-small-up,.show-for-small,.show-for-small-down,.hide-for-medium-only,.hide-for-medium-up,.hide-for-medium,.hide-for-medium-down,.show-for-large-only,.show-for-large-up,.show-for-large,.hide-for-large-down,.show-for-xlarge-only,.show-for-xlarge-up,.show-for-xlarge,.hide-for-xlarge-down,.show-for-xxlarge-only,.show-for-xxlarge-up,.show-for-xxlarge,.hide-for-xxlarge-down{display:none !important}.hidden-for-small-only,.visible-for-small-up,.hidden-for-small,.hidden-for-small-down,.visible-for-medium-only,.visible-for-medium-up,.visible-for-medium,.visible-for-medium-down,.hidden-for-large-only,.hidden-for-large-up,.hidden-for-large,.visible-for-large-down,.hidden-for-xlarge-only,.hidden-for-xlarge-up,.hidden-for-xlarge,.visible-for-xlarge-down,.hidden-for-xxlarge-only,.hidden-for-xxlarge-up,.hidden-for-xxlarge,.visible-for-xxlarge-down{position:static !important;height:auto;width:auto;overflow:visible;clip:auto}.visible-for-small-only,.hidden-for-small-up,.visible-for-small,.visible-for-small-down,.hidden-for-medium-only,.hidden-for-medium-up,.hidden-for-medium,.hidden-for-medium-down,.visible-for-large-only,.visible-for-large-up,.visible-for-large,.hidden-for-large-down,.visible-for-xlarge-only,.visible-for-xlarge-up,.visible-for-xlarge,.hidden-for-xlarge-down,.visible-for-xxlarge-only,.visible-for-xxlarge-up,.visible-for-xxlarge,.hidden-for-xxlarge-down{position:absolute !important;height:1px;width:1px;overflow:hidden;clip:rect(1px, 1px, 1px, 1px)}table.hide-for-small-only,table.show-for-small-up,table.hide-for-small,table.hide-for-small-down,table.show-for-medium-only,table.show-for-medium-up,table.show-for-medium,table.show-for-medium-down,table.hide-for-large-only,table.hide-for-large-up,table.hide-for-large,table.show-for-large-down,table.hide-for-xlarge-only,table.hide-for-xlarge-up,table.hide-for-xlarge,table.show-for-xlarge-down,table.hide-for-xxlarge-only,table.hide-for-xxlarge-up,table.hide-for-xxlarge,table.show-for-xxlarge-down{display:table !important}thead.hide-for-small-only,thead.show-for-small-up,thead.hide-for-small,thead.hide-for-small-down,thead.show-for-medium-only,thead.show-for-medium-up,thead.show-for-medium,thead.show-for-medium-down,thead.hide-for-large-only,thead.hide-for-large-up,thead.hide-for-large,thead.show-for-large-down,thead.hide-for-xlarge-only,thead.hide-for-xlarge-up,thead.hide-for-xlarge,thead.show-for-xlarge-down,thead.hide-for-xxlarge-only,thead.hide-for-xxlarge-up,thead.hide-for-xxlarge,thead.show-for-xxlarge-down{display:table-header-group !important}tbody.hide-for-small-only,tbody.show-for-small-up,tbody.hide-for-small,tbody.hide-for-small-down,tbody.show-for-medium-only,tbody.show-for-medium-up,tbody.show-for-medium,tbody.show-for-medium-down,tbody.hide-for-large-only,tbody.hide-for-large-up,tbody.hide-for-large,tbody.show-for-large-down,tbody.hide-for-xlarge-only,tbody.hide-for-xlarge-up,tbody.hide-for-xlarge,tbody.show-for-xlarge-down,tbody.hide-for-xxlarge-only,tbody.hide-for-xxlarge-up,tbody.hide-for-xxlarge,tbody.show-for-xxlarge-down{display:table-row-group !important}tr.hide-for-small-only,tr.show-for-small-up,tr.hide-for-small,tr.hide-for-small-down,tr.show-for-medium-only,tr.show-for-medium-up,tr.show-for-medium,tr.show-for-medium-down,tr.hide-for-large-only,tr.hide-for-large-up,tr.hide-for-large,tr.show-for-large-down,tr.hide-for-xlarge-only,tr.hide-for-xlarge-up,tr.hide-for-xlarge,tr.show-for-xlarge-down,tr.hide-for-xxlarge-only,tr.hide-for-xxlarge-up,tr.hide-for-xxlarge,tr.show-for-xxlarge-down{display:table-row}th.hide-for-small-only,td.hide-for-small-only,th.show-for-small-up,td.show-for-small-up,th.hide-for-small,td.hide-for-small,th.hide-for-small-down,td.hide-for-small-down,th.show-for-medium-only,td.show-for-medium-only,th.show-for-medium-up,td.show-for-medium-up,th.show-for-medium,td.show-for-medium,th.show-for-medium-down,td.show-for-medium-down,th.hide-for-large-only,td.hide-for-large-only,th.hide-for-large-up,td.hide-for-large-up,th.hide-for-large,td.hide-for-large,th.show-for-large-down,td.show-for-large-down,th.hide-for-xlarge-only,td.hide-for-xlarge-only,th.hide-for-xlarge-up,td.hide-for-xlarge-up,th.hide-for-xlarge,td.hide-for-xlarge,th.show-for-xlarge-down,td.show-for-xlarge-down,th.hide-for-xxlarge-only,td.hide-for-xxlarge-only,th.hide-for-xxlarge-up,td.hide-for-xxlarge-up,th.hide-for-xxlarge,td.hide-for-xxlarge,th.show-for-xxlarge-down,td.show-for-xxlarge-down{display:table-cell !important}}@media only screen and (min-width: 64.063em){.hide-for-small-only,.show-for-small-up,.hide-for-small,.hide-for-small-down,.hide-for-medium-only,.show-for-medium-up,.hide-for-medium,.hide-for-medium-down,.show-for-large-only,.show-for-large-up,.show-for-large,.show-for-large-down,.hide-for-xlarge-only,.hide-for-xlarge-up,.hide-for-xlarge,.show-for-xlarge-down,.hide-for-xxlarge-only,.hide-for-xxlarge-up,.hide-for-xxlarge,.show-for-xxlarge-down{display:inherit !important}.show-for-small-only,.hide-for-small-up,.show-for-small,.show-for-small-down,.show-for-medium-only,.hide-for-medium-up,.show-for-medium,.show-for-medium-down,.hide-for-large-only,.hide-for-large-up,.hide-for-large,.hide-for-large-down,.show-for-xlarge-only,.show-for-xlarge-up,.show-for-xlarge,.hide-for-xlarge-down,.show-for-xxlarge-only,.show-for-xxlarge-up,.show-for-xxlarge,.hide-for-xxlarge-down{display:none !important}.hidden-for-small-only,.visible-for-small-up,.hidden-for-small,.hidden-for-small-down,.hidden-for-medium-only,.visible-for-medium-up,.hidden-for-medium,.hidden-for-medium-down,.visible-for-large-only,.visible-for-large-up,.visible-for-large,.visible-for-large-down,.hidden-for-xlarge-only,.hidden-for-xlarge-up,.hidden-for-xlarge,.visible-for-xlarge-down,.hidden-for-xxlarge-only,.hidden-for-xxlarge-up,.hidden-for-xxlarge,.visible-for-xxlarge-down{position:static !important;height:auto;width:auto;overflow:visible;clip:auto}.visible-for-small-only,.hidden-for-small-up,.visible-for-small,.visible-for-small-down,.visible-for-medium-only,.hidden-for-medium-up,.visible-for-medium,.visible-for-medium-down,.hidden-for-large-only,.hidden-for-large-up,.hidden-for-large,.hidden-for-large-down,.visible-for-xlarge-only,.visible-for-xlarge-up,.visible-for-xlarge,.hidden-for-xlarge-down,.visible-for-xxlarge-only,.visible-for-xxlarge-up,.visible-for-xxlarge,.hidden-for-xxlarge-down{position:absolute !important;height:1px;width:1px;overflow:hidden;clip:rect(1px, 1px, 1px, 1px)}table.hide-for-small-only,table.show-for-small-up,table.hide-for-small,table.hide-for-small-down,table.hide-for-medium-only,table.show-for-medium-up,table.hide-for-medium,table.hide-for-medium-down,table.show-for-large-only,table.show-for-large-up,table.show-for-large,table.show-for-large-down,table.hide-for-xlarge-only,table.hide-for-xlarge-up,table.hide-for-xlarge,table.show-for-xlarge-down,table.hide-for-xxlarge-only,table.hide-for-xxlarge-up,table.hide-for-xxlarge,table.show-for-xxlarge-down{display:table !important}thead.hide-for-small-only,thead.show-for-small-up,thead.hide-for-small,thead.hide-for-small-down,thead.hide-for-medium-only,thead.show-for-medium-up,thead.hide-for-medium,thead.hide-for-medium-down,thead.show-for-large-only,thead.show-for-large-up,thead.show-for-large,thead.show-for-large-down,thead.hide-for-xlarge-only,thead.hide-for-xlarge-up,thead.hide-for-xlarge,thead.show-for-xlarge-down,thead.hide-for-xxlarge-only,thead.hide-for-xxlarge-up,thead.hide-for-xxlarge,thead.show-for-xxlarge-down{display:table-header-group !important}tbody.hide-for-small-only,tbody.show-for-small-up,tbody.hide-for-small,tbody.hide-for-small-down,tbody.hide-for-medium-only,tbody.show-for-medium-up,tbody.hide-for-medium,tbody.hide-for-medium-down,tbody.show-for-large-only,tbody.show-for-large-up,tbody.show-for-large,tbody.show-for-large-down,tbody.hide-for-xlarge-only,tbody.hide-for-xlarge-up,tbody.hide-for-xlarge,tbody.show-for-xlarge-down,tbody.hide-for-xxlarge-only,tbody.hide-for-xxlarge-up,tbody.hide-for-xxlarge,tbody.show-for-xxlarge-down{display:table-row-group !important}tr.hide-for-small-only,tr.show-for-small-up,tr.hide-for-small,tr.hide-for-small-down,tr.hide-for-medium-only,tr.show-for-medium-up,tr.hide-for-medium,tr.hide-for-medium-down,tr.show-for-large-only,tr.show-for-large-up,tr.show-for-large,tr.show-for-large-down,tr.hide-for-xlarge-only,tr.hide-for-xlarge-up,tr.hide-for-xlarge,tr.show-for-xlarge-down,tr.hide-for-xxlarge-only,tr.hide-for-xxlarge-up,tr.hide-for-xxlarge,tr.show-for-xxlarge-down{display:table-row}th.hide-for-small-only,td.hide-for-small-only,th.show-for-small-up,td.show-for-small-up,th.hide-for-small,td.hide-for-small,th.hide-for-small-down,td.hide-for-small-down,th.hide-for-medium-only,td.hide-for-medium-only,th.show-for-medium-up,td.show-for-medium-up,th.hide-for-medium,td.hide-for-medium,th.hide-for-medium-down,td.hide-for-medium-down,th.show-for-large-only,td.show-for-large-only,th.show-for-large-up,td.show-for-large-up,th.show-for-large,td.show-for-large,th.show-for-large-down,td.show-for-large-down,th.hide-for-xlarge-only,td.hide-for-xlarge-only,th.hide-for-xlarge-up,td.hide-for-xlarge-up,th.hide-for-xlarge,td.hide-for-xlarge,th.show-for-xlarge-down,td.show-for-xlarge-down,th.hide-for-xxlarge-only,td.hide-for-xxlarge-only,th.hide-for-xxlarge-up,td.hide-for-xxlarge-up,th.hide-for-xxlarge,td.hide-for-xxlarge,th.show-for-xxlarge-down,td.show-for-xxlarge-down{display:table-cell !important}}@media only screen and (min-width: 90.063em){.hide-for-small-only,.show-for-small-up,.hide-for-small,.hide-for-small-down,.hide-for-medium-only,.show-for-medium-up,.hide-for-medium,.hide-for-medium-down,.hide-for-large-only,.show-for-large-up,.hide-for-large,.hide-for-large-down,.show-for-xlarge-only,.show-for-xlarge-up,.show-for-xlarge,.show-for-xlarge-down,.hide-for-xxlarge-only,.hide-for-xxlarge-up,.hide-for-xxlarge,.show-for-xxlarge-down{display:inherit !important}.show-for-small-only,.hide-for-small-up,.show-for-small,.show-for-small-down,.show-for-medium-only,.hide-for-medium-up,.show-for-medium,.show-for-medium-down,.show-for-large-only,.hide-for-large-up,.show-for-large,.show-for-large-down,.hide-for-xlarge-only,.hide-for-xlarge-up,.hide-for-xlarge,.hide-for-xlarge-down,.show-for-xxlarge-only,.show-for-xxlarge-up,.show-for-xxlarge,.hide-for-xxlarge-down{display:none !important}.hidden-for-small-only,.visible-for-small-up,.hidden-for-small,.hidden-for-small-down,.hidden-for-medium-only,.visible-for-medium-up,.hidden-for-medium,.hidden-for-medium-down,.hidden-for-large-only,.visible-for-large-up,.hidden-for-large,.hidden-for-large-down,.visible-for-xlarge-only,.visible-for-xlarge-up,.visible-for-xlarge,.visible-for-xlarge-down,.hidden-for-xxlarge-only,.hidden-for-xxlarge-up,.hidden-for-xxlarge,.visible-for-xxlarge-down{position:static !important;height:auto;width:auto;overflow:visible;clip:auto}.visible-for-small-only,.hidden-for-small-up,.visible-for-small,.visible-for-small-down,.visible-for-medium-only,.hidden-for-medium-up,.visible-for-medium,.visible-for-medium-down,.visible-for-large-only,.hidden-for-large-up,.visible-for-large,.visible-for-large-down,.hidden-for-xlarge-only,.hidden-for-xlarge-up,.hidden-for-xlarge,.hidden-for-xlarge-down,.visible-for-xxlarge-only,.visible-for-xxlarge-up,.visible-for-xxlarge,.hidden-for-xxlarge-down{position:absolute !important;height:1px;width:1px;overflow:hidden;clip:rect(1px, 1px, 1px, 1px)}table.hide-for-small-only,table.show-for-small-up,table.hide-for-small,table.hide-for-small-down,table.hide-for-medium-only,table.show-for-medium-up,table.hide-for-medium,table.hide-for-medium-down,table.hide-for-large-only,table.show-for-large-up,table.hide-for-large,table.hide-for-large-down,table.show-for-xlarge-only,table.show-for-xlarge-up,table.show-for-xlarge,table.show-for-xlarge-down,table.hide-for-xxlarge-only,table.hide-for-xxlarge-up,table.hide-for-xxlarge,table.show-for-xxlarge-down{display:table !important}thead.hide-for-small-only,thead.show-for-small-up,thead.hide-for-small,thead.hide-for-small-down,thead.hide-for-medium-only,thead.show-for-medium-up,thead.hide-for-medium,thead.hide-for-medium-down,thead.hide-for-large-only,thead.show-for-large-up,thead.hide-for-large,thead.hide-for-large-down,thead.show-for-xlarge-only,thead.show-for-xlarge-up,thead.show-for-xlarge,thead.show-for-xlarge-down,thead.hide-for-xxlarge-only,thead.hide-for-xxlarge-up,thead.hide-for-xxlarge,thead.show-for-xxlarge-down{display:table-header-group !important}tbody.hide-for-small-only,tbody.show-for-small-up,tbody.hide-for-small,tbody.hide-for-small-down,tbody.hide-for-medium-only,tbody.show-for-medium-up,tbody.hide-for-medium,tbody.hide-for-medium-down,tbody.hide-for-large-only,tbody.show-for-large-up,tbody.hide-for-large,tbody.hide-for-large-down,tbody.show-for-xlarge-only,tbody.show-for-xlarge-up,tbody.show-for-xlarge,tbody.show-for-xlarge-down,tbody.hide-for-xxlarge-only,tbody.hide-for-xxlarge-up,tbody.hide-for-xxlarge,tbody.show-for-xxlarge-down{display:table-row-group !important}tr.hide-for-small-only,tr.show-for-small-up,tr.hide-for-small,tr.hide-for-small-down,tr.hide-for-medium-only,tr.show-for-medium-up,tr.hide-for-medium,tr.hide-for-medium-down,tr.hide-for-large-only,tr.show-for-large-up,tr.hide-for-large,tr.hide-for-large-down,tr.show-for-xlarge-only,tr.show-for-xlarge-up,tr.show-for-xlarge,tr.show-for-xlarge-down,tr.hide-for-xxlarge-only,tr.hide-for-xxlarge-up,tr.hide-for-xxlarge,tr.show-for-xxlarge-down{display:table-row}th.hide-for-small-only,td.hide-for-small-only,th.show-for-small-up,td.show-for-small-up,th.hide-for-small,td.hide-for-small,th.hide-for-small-down,td.hide-for-small-down,th.hide-for-medium-only,td.hide-for-medium-only,th.show-for-medium-up,td.show-for-medium-up,th.hide-for-medium,td.hide-for-medium,th.hide-for-medium-down,td.hide-for-medium-down,th.hide-for-large-only,td.hide-for-large-only,th.show-for-large-up,td.show-for-large-up,th.hide-for-large,td.hide-for-large,th.hide-for-large-down,td.hide-for-large-down,th.show-for-xlarge-only,td.show-for-xlarge-only,th.show-for-xlarge-up,td.show-for-xlarge-up,th.show-for-xlarge,td.show-for-xlarge,th.show-for-xlarge-down,td.show-for-xlarge-down,th.hide-for-xxlarge-only,td.hide-for-xxlarge-only,th.hide-for-xxlarge-up,td.hide-for-xxlarge-up,th.hide-for-xxlarge,td.hide-for-xxlarge,th.show-for-xxlarge-down,td.show-for-xxlarge-down{display:table-cell !important}}@media only screen and (min-width: 120.063em){.hide-for-small-only,.show-for-small-up,.hide-for-small,.hide-for-small-down,.hide-for-medium-only,.show-for-medium-up,.hide-for-medium,.hide-for-medium-down,.hide-for-large-only,.show-for-large-up,.hide-for-large,.hide-for-large-down,.hide-for-xlarge-only,.show-for-xlarge-up,.hide-for-xlarge,.hide-for-xlarge-down,.show-for-xxlarge-only,.show-for-xxlarge-up,.show-for-xxlarge,.show-for-xxlarge-down{display:inherit !important}.show-for-small-only,.hide-for-small-up,.show-for-small,.show-for-small-down,.show-for-medium-only,.hide-for-medium-up,.show-for-medium,.show-for-medium-down,.show-for-large-only,.hide-for-large-up,.show-for-large,.show-for-large-down,.show-for-xlarge-only,.hide-for-xlarge-up,.show-for-xlarge,.show-for-xlarge-down,.hide-for-xxlarge-only,.hide-for-xxlarge-up,.hide-for-xxlarge,.hide-for-xxlarge-down{display:none !important}.hidden-for-small-only,.visible-for-small-up,.hidden-for-small,.hidden-for-small-down,.hidden-for-medium-only,.visible-for-medium-up,.hidden-for-medium,.hidden-for-medium-down,.hidden-for-large-only,.visible-for-large-up,.hidden-for-large,.hidden-for-large-down,.hidden-for-xlarge-only,.visible-for-xlarge-up,.hidden-for-xlarge,.hidden-for-xlarge-down,.visible-for-xxlarge-only,.visible-for-xxlarge-up,.visible-for-xxlarge,.visible-for-xxlarge-down{position:static !important;height:auto;width:auto;overflow:visible;clip:auto}.visible-for-small-only,.hidden-for-small-up,.visible-for-small,.visible-for-small-down,.visible-for-medium-only,.hidden-for-medium-up,.visible-for-medium,.visible-for-medium-down,.visible-for-large-only,.hidden-for-large-up,.visible-for-large,.visible-for-large-down,.visible-for-xlarge-only,.hidden-for-xlarge-up,.visible-for-xlarge,.visible-for-xlarge-down,.hidden-for-xxlarge-only,.hidden-for-xxlarge-up,.hidden-for-xxlarge,.hidden-for-xxlarge-down{position:absolute !important;height:1px;width:1px;overflow:hidden;clip:rect(1px, 1px, 1px, 1px)}table.hide-for-small-only,table.show-for-small-up,table.hide-for-small,table.hide-for-small-down,table.hide-for-medium-only,table.show-for-medium-up,table.hide-for-medium,table.hide-for-medium-down,table.hide-for-large-only,table.show-for-large-up,table.hide-for-large,table.hide-for-large-down,table.hide-for-xlarge-only,table.show-for-xlarge-up,table.hide-for-xlarge,table.hide-for-xlarge-down,table.show-for-xxlarge-only,table.show-for-xxlarge-up,table.show-for-xxlarge,table.show-for-xxlarge-down{display:table !important}thead.hide-for-small-only,thead.show-for-small-up,thead.hide-for-small,thead.hide-for-small-down,thead.hide-for-medium-only,thead.show-for-medium-up,thead.hide-for-medium,thead.hide-for-medium-down,thead.hide-for-large-only,thead.show-for-large-up,thead.hide-for-large,thead.hide-for-large-down,thead.hide-for-xlarge-only,thead.show-for-xlarge-up,thead.hide-for-xlarge,thead.hide-for-xlarge-down,thead.show-for-xxlarge-only,thead.show-for-xxlarge-up,thead.show-for-xxlarge,thead.show-for-xxlarge-down{display:table-header-group !important}tbody.hide-for-small-only,tbody.show-for-small-up,tbody.hide-for-small,tbody.hide-for-small-down,tbody.hide-for-medium-only,tbody.show-for-medium-up,tbody.hide-for-medium,tbody.hide-for-medium-down,tbody.hide-for-large-only,tbody.show-for-large-up,tbody.hide-for-large,tbody.hide-for-large-down,tbody.hide-for-xlarge-only,tbody.show-for-xlarge-up,tbody.hide-for-xlarge,tbody.hide-for-xlarge-down,tbody.show-for-xxlarge-only,tbody.show-for-xxlarge-up,tbody.show-for-xxlarge,tbody.show-for-xxlarge-down{display:table-row-group !important}tr.hide-for-small-only,tr.show-for-small-up,tr.hide-for-small,tr.hide-for-small-down,tr.hide-for-medium-only,tr.show-for-medium-up,tr.hide-for-medium,tr.hide-for-medium-down,tr.hide-for-large-only,tr.show-for-large-up,tr.hide-for-large,tr.hide-for-large-down,tr.hide-for-xlarge-only,tr.show-for-xlarge-up,tr.hide-for-xlarge,tr.hide-for-xlarge-down,tr.show-for-xxlarge-only,tr.show-for-xxlarge-up,tr.show-for-xxlarge,tr.show-for-xxlarge-down{display:table-row}th.hide-for-small-only,td.hide-for-small-only,th.show-for-small-up,td.show-for-small-up,th.hide-for-small,td.hide-for-small,th.hide-for-small-down,td.hide-for-small-down,th.hide-for-medium-only,td.hide-for-medium-only,th.show-for-medium-up,td.show-for-medium-up,th.hide-for-medium,td.hide-for-medium,th.hide-for-medium-down,td.hide-for-medium-down,th.hide-for-large-only,td.hide-for-large-only,th.show-for-large-up,td.show-for-large-up,th.hide-for-large,td.hide-for-large,th.hide-for-large-down,td.hide-for-large-down,th.hide-for-xlarge-only,td.hide-for-xlarge-only,th.show-for-xlarge-up,td.show-for-xlarge-up,th.hide-for-xlarge,td.hide-for-xlarge,th.hide-for-xlarge-down,td.hide-for-xlarge-down,th.show-for-xxlarge-only,td.show-for-xxlarge-only,th.show-for-xxlarge-up,td.show-for-xxlarge-up,th.show-for-xxlarge,td.show-for-xxlarge,th.show-for-xxlarge-down,td.show-for-xxlarge-down{display:table-cell !important}}.show-for-landscape,.hide-for-portrait{display:inherit !important}.hide-for-landscape,.show-for-portrait{display:none !important}table.hide-for-landscape,table.show-for-portrait{display:table !important}thead.hide-for-landscape,thead.show-for-portrait{display:table-header-group !important}tbody.hide-for-landscape,tbody.show-for-portrait{display:table-row-group !important}tr.hide-for-landscape,tr.show-for-portrait{display:table-row !important}td.hide-for-landscape,td.show-for-portrait,th.hide-for-landscape,th.show-for-portrait{display:table-cell !important}@media only screen and (orientation: landscape){.show-for-landscape,.hide-for-portrait{display:inherit !important}.hide-for-landscape,.show-for-portrait{display:none !important}table.show-for-landscape,table.hide-for-portrait{display:table !important}thead.show-for-landscape,thead.hide-for-portrait{display:table-header-group !important}tbody.show-for-landscape,tbody.hide-for-portrait{display:table-row-group !important}tr.show-for-landscape,tr.hide-for-portrait{display:table-row !important}td.show-for-landscape,td.hide-for-portrait,th.show-for-landscape,th.hide-for-portrait{display:table-cell !important}}@media only screen and (orientation: portrait){.show-for-portrait,.hide-for-landscape{display:inherit !important}.hide-for-portrait,.show-for-landscape{display:none !important}table.show-for-portrait,table.hide-for-landscape{display:table !important}thead.show-for-portrait,thead.hide-for-landscape{display:table-header-group !important}tbody.show-for-portrait,tbody.hide-for-landscape{display:table-row-group !important}tr.show-for-portrait,tr.hide-for-landscape{display:table-row !important}td.show-for-portrait,td.hide-for-landscape,th.show-for-portrait,th.hide-for-landscape{display:table-cell !important}}.show-for-touch{display:none !important}.hide-for-touch{display:inherit !important}.touch .show-for-touch{display:inherit !important}.touch .hide-for-touch{display:none !important}table.hide-for-touch{display:table !important}.touch table.show-for-touch{display:table !important}thead.hide-for-touch{display:table-header-group !important}.touch thead.show-for-touch{display:table-header-group !important}tbody.hide-for-touch{display:table-row-group !important}.touch tbody.show-for-touch{display:table-row-group !important}tr.hide-for-touch{display:table-row !important}.touch tr.show-for-touch{display:table-row !important}td.hide-for-touch{display:table-cell !important}.touch td.show-for-touch{display:table-cell !important}th.hide-for-touch{display:table-cell !important}.touch th.show-for-touch{display:table-cell !important}.print-only{display:none !important}@media print{*{background:transparent !important;color:#000 !important;box-shadow:none !important;text-shadow:none !important}.show-for-print{display:block}.hide-for-print{display:none}table.show-for-print{display:table !important}thead.show-for-print{display:table-header-group !important}tbody.show-for-print{display:table-row-group !important}tr.show-for-print{display:table-row !important}td.show-for-print{display:table-cell !important}th.show-for-print{display:table-cell !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}.hide-on-print{display:none !important}.print-only{display:block !important}.hide-for-print{display:none !important}.show-for-print{display:inherit !important}}@media print{.show-for-print{display:block}.hide-for-print{display:none}table.show-for-print{display:table !important}thead.show-for-print{display:table-header-group !important}tbody.show-for-print{display:table-row-group !important}tr.show-for-print{display:table-row !important}td.show-for-print{display:table-cell !important}th.show-for-print{display:table-cell !important}} diff --git a/static/scripts/foundation/foundation.min.js b/static/scripts/foundation/foundation.min.js deleted file mode 100644 index dd30100..0000000 --- a/static/scripts/foundation/foundation.min.js +++ /dev/null @@ -1,1754 +0,0 @@ -/* - * Foundation Responsive Library - * http://foundation.zurb.com - * Copyright 2014, ZURB - * Free to use under the MIT license. - * http://www.opensource.org/licenses/mit-license.php -*/ - -(function ($, window, document, undefined) { - 'use strict'; - - var header_helpers = function (class_array) { - var i = class_array.length; - var head = $('head'); - - while (i--) { - if (head.has('.' + class_array[i]).length === 0) { - head.append(''); - } - } - }; - - header_helpers([ - 'foundation-mq-small', - 'foundation-mq-small-only', - 'foundation-mq-medium', - 'foundation-mq-medium-only', - 'foundation-mq-large', - 'foundation-mq-large-only', - 'foundation-mq-xlarge', - 'foundation-mq-xlarge-only', - 'foundation-mq-xxlarge', - 'foundation-data-attribute-namespace']); - - // Enable FastClick if present - - $(function () { - if (typeof FastClick !== 'undefined') { - // Don't attach to body if undefined - if (typeof document.body !== 'undefined') { - FastClick.attach(document.body); - } - } - }); - - // private Fast Selector wrapper, - // returns jQuery object. Only use where - // getElementById is not available. - var S = function (selector, context) { - if (typeof selector === 'string') { - if (context) { - var cont; - if (context.jquery) { - cont = context[0]; - if (!cont) { - return context; - } - } else { - cont = context; - } - return $(cont.querySelectorAll(selector)); - } - - return $(document.querySelectorAll(selector)); - } - - return $(selector, context); - }; - - // Namespace functions. - - var attr_name = function (init) { - var arr = []; - if (!init) { - arr.push('data'); - } - if (this.namespace.length > 0) { - arr.push(this.namespace); - } - arr.push(this.name); - - return arr.join('-'); - }; - - var add_namespace = function (str) { - var parts = str.split('-'), - i = parts.length, - arr = []; - - while (i--) { - if (i !== 0) { - arr.push(parts[i]); - } else { - if (this.namespace.length > 0) { - arr.push(this.namespace, parts[i]); - } else { - arr.push(parts[i]); - } - } - } - - return arr.reverse().join('-'); - }; - - // Event binding and data-options updating. - - var bindings = function (method, options) { - var self = this, - bind = function(){ - var $this = S(this), - should_bind_events = !$this.data(self.attr_name(true) + '-init'); - $this.data(self.attr_name(true) + '-init', $.extend({}, self.settings, (options || method), self.data_options($this))); - - if (should_bind_events) { - self.events(this); - } - }; - - if (S(this.scope).is('[' + this.attr_name() +']')) { - bind.call(this.scope); - } else { - S('[' + this.attr_name() +']', this.scope).each(bind); - } - // # Patch to fix #5043 to move this *after* the if/else clause in order for Backbone and similar frameworks to have improved control over event binding and data-options updating. - if (typeof method === 'string') { - return this[method].call(this, options); - } - - }; - - var single_image_loaded = function (image, callback) { - function loaded () { - callback(image[0]); - } - - function bindLoad () { - this.one('load', loaded); - - if (/MSIE (\d+\.\d+);/.test(navigator.userAgent)) { - var src = this.attr( 'src' ), - param = src.match( /\?/ ) ? '&' : '?'; - - param += 'random=' + (new Date()).getTime(); - this.attr('src', src + param); - } - } - - if (!image.attr('src')) { - loaded(); - return; - } - - if (image[0].complete || image[0].readyState === 4) { - loaded(); - } else { - bindLoad.call(image); - } - }; - - /* - https://github.com/paulirish/matchMedia.js - */ - - window.matchMedia = window.matchMedia || (function ( doc ) { - - 'use strict'; - - var bool, - docElem = doc.documentElement, - refNode = docElem.firstElementChild || docElem.firstChild, - // fakeBody required for - fakeBody = doc.createElement( 'body' ), - div = doc.createElement( 'div' ); - - div.id = 'mq-test-1'; - div.style.cssText = 'position:absolute;top:-100em'; - fakeBody.style.background = 'none'; - fakeBody.appendChild(div); - - return function (q) { - - div.innerHTML = '­'; - - docElem.insertBefore( fakeBody, refNode ); - bool = div.offsetWidth === 42; - docElem.removeChild( fakeBody ); - - return { - matches : bool, - media : q - }; - - }; - - }( document )); - - /* - * jquery.requestAnimationFrame - * https://github.com/gnarf37/jquery-requestAnimationFrame - * Requires jQuery 1.8+ - * - * Copyright (c) 2012 Corey Frang - * Licensed under the MIT license. - */ - - (function(jQuery) { - - - // requestAnimationFrame polyfill adapted from Erik Mƶller - // fixes from Paul Irish and Tino Zijdel - // http://paulirish.com/2011/requestanimationframe-for-smart-animating/ - // http://my.opera.com/emoller/blog/2011/12/20/requestanimationframe-for-smart-er-animating - - var animating, - lastTime = 0, - vendors = ['webkit', 'moz'], - requestAnimationFrame = window.requestAnimationFrame, - cancelAnimationFrame = window.cancelAnimationFrame, - jqueryFxAvailable = 'undefined' !== typeof jQuery.fx; - - for (; lastTime < vendors.length && !requestAnimationFrame; lastTime++) { - requestAnimationFrame = window[ vendors[lastTime] + 'RequestAnimationFrame' ]; - cancelAnimationFrame = cancelAnimationFrame || - window[ vendors[lastTime] + 'CancelAnimationFrame' ] || - window[ vendors[lastTime] + 'CancelRequestAnimationFrame' ]; - } - - function raf() { - if (animating) { - requestAnimationFrame(raf); - - if (jqueryFxAvailable) { - jQuery.fx.tick(); - } - } - } - - if (requestAnimationFrame) { - // use rAF - window.requestAnimationFrame = requestAnimationFrame; - window.cancelAnimationFrame = cancelAnimationFrame; - - if (jqueryFxAvailable) { - jQuery.fx.timer = function (timer) { - if (timer() && jQuery.timers.push(timer) && !animating) { - animating = true; - raf(); - } - }; - - jQuery.fx.stop = function () { - animating = false; - }; - } - } else { - // polyfill - window.requestAnimationFrame = function (callback) { - var currTime = new Date().getTime(), - timeToCall = Math.max(0, 16 - (currTime - lastTime)), - id = window.setTimeout(function () { - callback(currTime + timeToCall); - }, timeToCall); - lastTime = currTime + timeToCall; - return id; - }; - - window.cancelAnimationFrame = function (id) { - clearTimeout(id); - }; - - } - - }( $ )); - - function removeQuotes (string) { - if (typeof string === 'string' || string instanceof String) { - string = string.replace(/^['\\/"]+|(;\s?})+|['\\/"]+$/g, ''); - } - - return string; - } - - window.Foundation = { - name : 'Foundation', - - version : '5.5.1', - - media_queries : { - 'small' : S('.foundation-mq-small').css('font-family').replace(/^[\/\\'"]+|(;\s?})+|[\/\\'"]+$/g, ''), - 'small-only' : S('.foundation-mq-small-only').css('font-family').replace(/^[\/\\'"]+|(;\s?})+|[\/\\'"]+$/g, ''), - 'medium' : S('.foundation-mq-medium').css('font-family').replace(/^[\/\\'"]+|(;\s?})+|[\/\\'"]+$/g, ''), - 'medium-only' : S('.foundation-mq-medium-only').css('font-family').replace(/^[\/\\'"]+|(;\s?})+|[\/\\'"]+$/g, ''), - 'large' : S('.foundation-mq-large').css('font-family').replace(/^[\/\\'"]+|(;\s?})+|[\/\\'"]+$/g, ''), - 'large-only' : S('.foundation-mq-large-only').css('font-family').replace(/^[\/\\'"]+|(;\s?})+|[\/\\'"]+$/g, ''), - 'xlarge' : S('.foundation-mq-xlarge').css('font-family').replace(/^[\/\\'"]+|(;\s?})+|[\/\\'"]+$/g, ''), - 'xlarge-only' : S('.foundation-mq-xlarge-only').css('font-family').replace(/^[\/\\'"]+|(;\s?})+|[\/\\'"]+$/g, ''), - 'xxlarge' : S('.foundation-mq-xxlarge').css('font-family').replace(/^[\/\\'"]+|(;\s?})+|[\/\\'"]+$/g, '') - }, - - stylesheet : $('').appendTo('head')[0].sheet, - - global : { - namespace : undefined - }, - - init : function (scope, libraries, method, options, response) { - var args = [scope, method, options, response], - responses = []; - - // check RTL - this.rtl = /rtl/i.test(S('html').attr('dir')); - - // set foundation global scope - this.scope = scope || this.scope; - - this.set_namespace(); - - if (libraries && typeof libraries === 'string' && !/reflow/i.test(libraries)) { - if (this.libs.hasOwnProperty(libraries)) { - responses.push(this.init_lib(libraries, args)); - } - } else { - for (var lib in this.libs) { - responses.push(this.init_lib(lib, libraries)); - } - } - - S(window).load(function () { - S(window) - .trigger('resize.fndtn.clearing') - .trigger('resize.fndtn.dropdown') - .trigger('resize.fndtn.equalizer') - .trigger('resize.fndtn.interchange') - .trigger('resize.fndtn.joyride') - .trigger('resize.fndtn.magellan') - .trigger('resize.fndtn.topbar') - .trigger('resize.fndtn.slider'); - }); - - return scope; - }, - - init_lib : function (lib, args) { - if (this.libs.hasOwnProperty(lib)) { - this.patch(this.libs[lib]); - - if (args && args.hasOwnProperty(lib)) { - if (typeof this.libs[lib].settings !== 'undefined') { - $.extend(true, this.libs[lib].settings, args[lib]); - } else if (typeof this.libs[lib].defaults !== 'undefined') { - $.extend(true, this.libs[lib].defaults, args[lib]); - } - return this.libs[lib].init.apply(this.libs[lib], [this.scope, args[lib]]); - } - - args = args instanceof Array ? args : new Array(args); - return this.libs[lib].init.apply(this.libs[lib], args); - } - - return function () {}; - }, - - patch : function (lib) { - lib.scope = this.scope; - lib.namespace = this.global.namespace; - lib.rtl = this.rtl; - lib['data_options'] = this.utils.data_options; - lib['attr_name'] = attr_name; - lib['add_namespace'] = add_namespace; - lib['bindings'] = bindings; - lib['S'] = this.utils.S; - }, - - inherit : function (scope, methods) { - var methods_arr = methods.split(' '), - i = methods_arr.length; - - while (i--) { - if (this.utils.hasOwnProperty(methods_arr[i])) { - scope[methods_arr[i]] = this.utils[methods_arr[i]]; - } - } - }, - - set_namespace : function () { - - // Description: - // Don't bother reading the namespace out of the meta tag - // if the namespace has been set globally in javascript - // - // Example: - // Foundation.global.namespace = 'my-namespace'; - // or make it an empty string: - // Foundation.global.namespace = ''; - // - // - - // If the namespace has not been set (is undefined), try to read it out of the meta element. - // Otherwise use the globally defined namespace, even if it's empty ('') - var namespace = ( this.global.namespace === undefined ) ? $('.foundation-data-attribute-namespace').css('font-family') : this.global.namespace; - - // Finally, if the namsepace is either undefined or false, set it to an empty string. - // Otherwise use the namespace value. - this.global.namespace = ( namespace === undefined || /false/i.test(namespace) ) ? '' : namespace; - }, - - libs : {}, - - // methods that can be inherited in libraries - utils : { - - // Description: - // Fast Selector wrapper returns jQuery object. Only use where getElementById - // is not available. - // - // Arguments: - // Selector (String): CSS selector describing the element(s) to be - // returned as a jQuery object. - // - // Scope (String): CSS selector describing the area to be searched. Default - // is document. - // - // Returns: - // Element (jQuery Object): jQuery object containing elements matching the - // selector within the scope. - S : S, - - // Description: - // Executes a function a max of once every n milliseconds - // - // Arguments: - // Func (Function): Function to be throttled. - // - // Delay (Integer): Function execution threshold in milliseconds. - // - // Returns: - // Lazy_function (Function): Function with throttling applied. - throttle : function (func, delay) { - var timer = null; - - return function () { - var context = this, args = arguments; - - if (timer == null) { - timer = setTimeout(function () { - func.apply(context, args); - timer = null; - }, delay); - } - }; - }, - - // Description: - // Executes a function when it stops being invoked for n seconds - // Modified version of _.debounce() http://underscorejs.org - // - // Arguments: - // Func (Function): Function to be debounced. - // - // Delay (Integer): Function execution threshold in milliseconds. - // - // Immediate (Bool): Whether the function should be called at the beginning - // of the delay instead of the end. Default is false. - // - // Returns: - // Lazy_function (Function): Function with debouncing applied. - debounce : function (func, delay, immediate) { - var timeout, result; - return function () { - var context = this, args = arguments; - var later = function () { - timeout = null; - if (!immediate) { - result = func.apply(context, args); - } - }; - var callNow = immediate && !timeout; - clearTimeout(timeout); - timeout = setTimeout(later, delay); - if (callNow) { - result = func.apply(context, args); - } - return result; - }; - }, - - // Description: - // Parses data-options attribute - // - // Arguments: - // El (jQuery Object): Element to be parsed. - // - // Returns: - // Options (Javascript Object): Contents of the element's data-options - // attribute. - data_options : function (el, data_attr_name) { - data_attr_name = data_attr_name || 'options'; - var opts = {}, ii, p, opts_arr, - data_options = function (el) { - var namespace = Foundation.global.namespace; - - if (namespace.length > 0) { - return el.data(namespace + '-' + data_attr_name); - } - - return el.data(data_attr_name); - }; - - var cached_options = data_options(el); - - if (typeof cached_options === 'object') { - return cached_options; - } - - opts_arr = (cached_options || ':').split(';'); - ii = opts_arr.length; - - function isNumber (o) { - return !isNaN (o - 0) && o !== null && o !== '' && o !== false && o !== true; - } - - function trim (str) { - if (typeof str === 'string') { - return $.trim(str); - } - return str; - } - - while (ii--) { - p = opts_arr[ii].split(':'); - p = [p[0], p.slice(1).join(':')]; - - if (/true/i.test(p[1])) { - p[1] = true; - } - if (/false/i.test(p[1])) { - p[1] = false; - } - if (isNumber(p[1])) { - if (p[1].indexOf('.') === -1) { - p[1] = parseInt(p[1], 10); - } else { - p[1] = parseFloat(p[1]); - } - } - - if (p.length === 2 && p[0].length > 0) { - opts[trim(p[0])] = trim(p[1]); - } - } - - return opts; - }, - - // Description: - // Adds JS-recognizable media queries - // - // Arguments: - // Media (String): Key string for the media query to be stored as in - // Foundation.media_queries - // - // Class (String): Class name for the generated tag - register_media : function (media, media_class) { - if (Foundation.media_queries[media] === undefined) { - $('head').append(''); - Foundation.media_queries[media] = removeQuotes($('.' + media_class).css('font-family')); - } - }, - - // Description: - // Add custom CSS within a JS-defined media query - // - // Arguments: - // Rule (String): CSS rule to be appended to the document. - // - // Media (String): Optional media query string for the CSS rule to be - // nested under. - add_custom_rule : function (rule, media) { - if (media === undefined && Foundation.stylesheet) { - Foundation.stylesheet.insertRule(rule, Foundation.stylesheet.cssRules.length); - } else { - var query = Foundation.media_queries[media]; - - if (query !== undefined) { - Foundation.stylesheet.insertRule('@media ' + - Foundation.media_queries[media] + '{ ' + rule + ' }'); - } - } - }, - - // Description: - // Performs a callback function when an image is fully loaded - // - // Arguments: - // Image (jQuery Object): Image(s) to check if loaded. - // - // Callback (Function): Function to execute when image is fully loaded. - image_loaded : function (images, callback) { - var self = this, - unloaded = images.length; - - if (unloaded === 0) { - callback(images); - } - - images.each(function () { - single_image_loaded(self.S(this), function () { - unloaded -= 1; - if (unloaded === 0) { - callback(images); - } - }); - }); - }, - - // Description: - // Returns a random, alphanumeric string - // - // Arguments: - // Length (Integer): Length of string to be generated. Defaults to random - // integer. - // - // Returns: - // Rand (String): Pseudo-random, alphanumeric string. - random_str : function () { - if (!this.fidx) { - this.fidx = 0; - } - this.prefix = this.prefix || [(this.name || 'F'), (+new Date).toString(36)].join('-'); - - return this.prefix + (this.fidx++).toString(36); - }, - - // Description: - // Helper for window.matchMedia - // - // Arguments: - // mq (String): Media query - // - // Returns: - // (Boolean): Whether the media query passes or not - match : function (mq) { - return window.matchMedia(mq).matches; - }, - - // Description: - // Helpers for checking Foundation default media queries with JS - // - // Returns: - // (Boolean): Whether the media query passes or not - - is_small_up : function () { - return this.match(Foundation.media_queries.small); - }, - - is_medium_up : function () { - return this.match(Foundation.media_queries.medium); - }, - - is_large_up : function () { - return this.match(Foundation.media_queries.large); - }, - - is_xlarge_up : function () { - return this.match(Foundation.media_queries.xlarge); - }, - - is_xxlarge_up : function () { - return this.match(Foundation.media_queries.xxlarge); - }, - - is_small_only : function () { - return !this.is_medium_up() && !this.is_large_up() && !this.is_xlarge_up() && !this.is_xxlarge_up(); - }, - - is_medium_only : function () { - return this.is_medium_up() && !this.is_large_up() && !this.is_xlarge_up() && !this.is_xxlarge_up(); - }, - - is_large_only : function () { - return this.is_medium_up() && this.is_large_up() && !this.is_xlarge_up() && !this.is_xxlarge_up(); - }, - - is_xlarge_only : function () { - return this.is_medium_up() && this.is_large_up() && this.is_xlarge_up() && !this.is_xxlarge_up(); - }, - - is_xxlarge_only : function () { - return this.is_medium_up() && this.is_large_up() && this.is_xlarge_up() && this.is_xxlarge_up(); - } - } - }; - - $.fn.foundation = function () { - var args = Array.prototype.slice.call(arguments, 0); - - return this.each(function () { - Foundation.init.apply(Foundation, [this].concat(args)); - return this; - }); - }; - -}(jQuery, window, window.document)); -;(function ($, window, document, undefined) { - 'use strict'; - - Foundation.libs.alert = { - name : 'alert', - - version : '5.5.1', - - settings : { - callback : function () {} - }, - - init : function (scope, method, options) { - this.bindings(method, options); - }, - - events : function () { - var self = this, - S = this.S; - - $(this.scope).off('.alert').on('click.fndtn.alert', '[' + this.attr_name() + '] .close', function (e) { - var alertBox = S(this).closest('[' + self.attr_name() + ']'), - settings = alertBox.data(self.attr_name(true) + '-init') || self.settings; - - e.preventDefault(); - if (Modernizr.csstransitions) { - alertBox.addClass('alert-close'); - alertBox.on('transitionend webkitTransitionEnd oTransitionEnd', function (e) { - S(this).trigger('close').trigger('close.fndtn.alert').remove(); - settings.callback(); - }); - } else { - alertBox.fadeOut(300, function () { - S(this).trigger('close').trigger('close.fndtn.alert').remove(); - settings.callback(); - }); - } - }); - }, - - reflow : function () {} - }; -}(jQuery, window, window.document)); -;(function ($, window, document, undefined) { - 'use strict'; - - Foundation.libs.clearing = { - name : 'clearing', - - version : '5.5.1', - - settings : { - templates : { - viewing : '×' + - '' - }, - - // comma delimited list of selectors that, on click, will close clearing, - // add 'div.clearing-blackout, div.visible-img' to close on background click - close_selectors : '.clearing-close, div.clearing-blackout', - - // Default to the entire li element. - open_selectors : '', - - // Image will be skipped in carousel. - skip_selector : '', - - touch_label : '', - - // event initializers and locks - init : false, - locked : false - }, - - init : function (scope, method, options) { - var self = this; - Foundation.inherit(this, 'throttle image_loaded'); - - this.bindings(method, options); - - if (self.S(this.scope).is('[' + this.attr_name() + ']')) { - this.assemble(self.S('li', this.scope)); - } else { - self.S('[' + this.attr_name() + ']', this.scope).each(function () { - self.assemble(self.S('li', this)); - }); - } - }, - - events : function (scope) { - var self = this, - S = self.S, - $scroll_container = $('.scroll-container'); - - if ($scroll_container.length > 0) { - this.scope = $scroll_container; - } - - S(this.scope) - .off('.clearing') - .on('click.fndtn.clearing', 'ul[' + this.attr_name() + '] li ' + this.settings.open_selectors, - function (e, current, target) { - var current = current || S(this), - target = target || current, - next = current.next('li'), - settings = current.closest('[' + self.attr_name() + ']').data(self.attr_name(true) + '-init'), - image = S(e.target); - - e.preventDefault(); - - if (!settings) { - self.init(); - settings = current.closest('[' + self.attr_name() + ']').data(self.attr_name(true) + '-init'); - } - - // if clearing is open and the current image is - // clicked, go to the next image in sequence - if (target.hasClass('visible') && - current[0] === target[0] && - next.length > 0 && self.is_open(current)) { - target = next; - image = S('img', target); - } - - // set current and target to the clicked li if not otherwise defined. - self.open(image, current, target); - self.update_paddles(target); - }) - - .on('click.fndtn.clearing', '.clearing-main-next', - function (e) { self.nav(e, 'next') }) - .on('click.fndtn.clearing', '.clearing-main-prev', - function (e) { self.nav(e, 'prev') }) - .on('click.fndtn.clearing', this.settings.close_selectors, - function (e) { Foundation.libs.clearing.close(e, this) }); - - $(document).on('keydown.fndtn.clearing', - function (e) { self.keydown(e) }); - - S(window).off('.clearing').on('resize.fndtn.clearing', - function () { self.resize() }); - - this.swipe_events(scope); - }, - - swipe_events : function (scope) { - var self = this, - S = self.S; - - S(this.scope) - .on('touchstart.fndtn.clearing', '.visible-img', function (e) { - if (!e.touches) { e = e.originalEvent; } - var data = { - start_page_x : e.touches[0].pageX, - start_page_y : e.touches[0].pageY, - start_time : (new Date()).getTime(), - delta_x : 0, - is_scrolling : undefined - }; - - S(this).data('swipe-transition', data); - e.stopPropagation(); - }) - .on('touchmove.fndtn.clearing', '.visible-img', function (e) { - if (!e.touches) { - e = e.originalEvent; - } - // Ignore pinch/zoom events - if (e.touches.length > 1 || e.scale && e.scale !== 1) { - return; - } - - var data = S(this).data('swipe-transition'); - - if (typeof data === 'undefined') { - data = {}; - } - - data.delta_x = e.touches[0].pageX - data.start_page_x; - - if (Foundation.rtl) { - data.delta_x = -data.delta_x; - } - - if (typeof data.is_scrolling === 'undefined') { - data.is_scrolling = !!( data.is_scrolling || Math.abs(data.delta_x) < Math.abs(e.touches[0].pageY - data.start_page_y) ); - } - - if (!data.is_scrolling && !data.active) { - e.preventDefault(); - var direction = (data.delta_x < 0) ? 'next' : 'prev'; - data.active = true; - self.nav(e, direction); - } - }) - .on('touchend.fndtn.clearing', '.visible-img', function (e) { - S(this).data('swipe-transition', {}); - e.stopPropagation(); - }); - }, - - assemble : function ($li) { - var $el = $li.parent(); - - if ($el.parent().hasClass('carousel')) { - return; - } - - $el.after('
'); - - var grid = $el.detach(), - grid_outerHTML = ''; - - if (grid[0] == null) { - return; - } else { - grid_outerHTML = grid[0].outerHTML; - } - - var holder = this.S('#foundationClearingHolder'), - settings = $el.data(this.attr_name(true) + '-init'), - data = { - grid : '', - viewing : settings.templates.viewing - }, - wrapper = '
' + data.viewing + - data.grid + '
', - touch_label = this.settings.touch_label; - - if (Modernizr.touch) { - wrapper = $(wrapper).find('.clearing-touch-label').html(touch_label).end(); - } - - holder.after(wrapper).remove(); - }, - - open : function ($image, current, target) { - var self = this, - body = $(document.body), - root = target.closest('.clearing-assembled'), - container = self.S('div', root).first(), - visible_image = self.S('.visible-img', container), - image = self.S('img', visible_image).not($image), - label = self.S('.clearing-touch-label', container), - error = false; - - // Event to disable scrolling on touch devices when Clearing is activated - $('body').on('touchmove', function (e) { - e.preventDefault(); - }); - - image.error(function () { - error = true; - }); - - function startLoad() { - setTimeout(function () { - this.image_loaded(image, function () { - if (image.outerWidth() === 1 && !error) { - startLoad.call(this); - } else { - cb.call(this, image); - } - }.bind(this)); - }.bind(this), 100); - } - - function cb (image) { - var $image = $(image); - $image.css('visibility', 'visible'); - // toggle the gallery - body.css('overflow', 'hidden'); - root.addClass('clearing-blackout'); - container.addClass('clearing-container'); - visible_image.show(); - this.fix_height(target) - .caption(self.S('.clearing-caption', visible_image), self.S('img', target)) - .center_and_label(image, label) - .shift(current, target, function () { - target.closest('li').siblings().removeClass('visible'); - target.closest('li').addClass('visible'); - }); - visible_image.trigger('opened.fndtn.clearing') - } - - if (!this.locked()) { - visible_image.trigger('open.fndtn.clearing'); - // set the image to the selected thumbnail - image - .attr('src', this.load($image)) - .css('visibility', 'hidden'); - - startLoad.call(this); - } - }, - - close : function (e, el) { - e.preventDefault(); - - var root = (function (target) { - if (/blackout/.test(target.selector)) { - return target; - } else { - return target.closest('.clearing-blackout'); - } - }($(el))), - body = $(document.body), container, visible_image; - - if (el === e.target && root) { - body.css('overflow', ''); - container = $('div', root).first(); - visible_image = $('.visible-img', container); - visible_image.trigger('close.fndtn.clearing'); - this.settings.prev_index = 0; - $('ul[' + this.attr_name() + ']', root) - .attr('style', '').closest('.clearing-blackout') - .removeClass('clearing-blackout'); - container.removeClass('clearing-container'); - visible_image.hide(); - visible_image.trigger('closed.fndtn.clearing'); - } - - // Event to re-enable scrolling on touch devices - $('body').off('touchmove'); - - return false; - }, - - is_open : function (current) { - return current.parent().prop('style').length > 0; - }, - - keydown : function (e) { - var clearing = $('.clearing-blackout ul[' + this.attr_name() + ']'), - NEXT_KEY = this.rtl ? 37 : 39, - PREV_KEY = this.rtl ? 39 : 37, - ESC_KEY = 27; - - if (e.which === NEXT_KEY) { - this.go(clearing, 'next'); - } - if (e.which === PREV_KEY) { - this.go(clearing, 'prev'); - } - if (e.which === ESC_KEY) { - this.S('a.clearing-close').trigger('click').trigger('click.fndtn.clearing'); - } - }, - - nav : function (e, direction) { - var clearing = $('ul[' + this.attr_name() + ']', '.clearing-blackout'); - - e.preventDefault(); - this.go(clearing, direction); - }, - - resize : function () { - var image = $('img', '.clearing-blackout .visible-img'), - label = $('.clearing-touch-label', '.clearing-blackout'); - - if (image.length) { - this.center_and_label(image, label); - image.trigger('resized.fndtn.clearing') - } - }, - - // visual adjustments - fix_height : function (target) { - var lis = target.parent().children(), - self = this; - - lis.each(function () { - var li = self.S(this), - image = li.find('img'); - - if (li.height() > image.outerHeight()) { - li.addClass('fix-height'); - } - }) - .closest('ul') - .width(lis.length * 100 + '%'); - - return this; - }, - - update_paddles : function (target) { - target = target.closest('li'); - var visible_image = target - .closest('.carousel') - .siblings('.visible-img'); - - if (target.next().length > 0) { - this.S('.clearing-main-next', visible_image).removeClass('disabled'); - } else { - this.S('.clearing-main-next', visible_image).addClass('disabled'); - } - - if (target.prev().length > 0) { - this.S('.clearing-main-prev', visible_image).removeClass('disabled'); - } else { - this.S('.clearing-main-prev', visible_image).addClass('disabled'); - } - }, - - center_and_label : function (target, label) { - if (!this.rtl && label.length > 0) { - label.css({ - marginLeft : -(label.outerWidth() / 2), - marginTop : -(target.outerHeight() / 2)-label.outerHeight()-10 - }); - } else { - label.css({ - marginRight : -(label.outerWidth() / 2), - marginTop : -(target.outerHeight() / 2)-label.outerHeight()-10, - left: 'auto', - right: '50%' - }); - } - return this; - }, - - // image loading and preloading - - load : function ($image) { - var href; - - if ($image[0].nodeName === 'A') { - href = $image.attr('href'); - } else { - href = $image.closest('a').attr('href'); - } - - this.preload($image); - - if (href) { - return href; - } - return $image.attr('src'); - }, - - preload : function ($image) { - this - .img($image.closest('li').next()) - .img($image.closest('li').prev()); - }, - - img : function (img) { - if (img.length) { - var new_img = new Image(), - new_a = this.S('a', img); - - if (new_a.length) { - new_img.src = new_a.attr('href'); - } else { - new_img.src = this.S('img', img).attr('src'); - } - } - return this; - }, - - // image caption - - caption : function (container, $image) { - var caption = $image.attr('data-caption'); - - if (caption) { - container - .html(caption) - .show(); - } else { - container - .text('') - .hide(); - } - return this; - }, - - // directional methods - - go : function ($ul, direction) { - var current = this.S('.visible', $ul), - target = current[direction](); - - // Check for skip selector. - if (this.settings.skip_selector && target.find(this.settings.skip_selector).length != 0) { - target = target[direction](); - } - - if (target.length) { - this.S('img', target) - .trigger('click', [current, target]).trigger('click.fndtn.clearing', [current, target]) - .trigger('change.fndtn.clearing'); - } - }, - - shift : function (current, target, callback) { - var clearing = target.parent(), - old_index = this.settings.prev_index || target.index(), - direction = this.direction(clearing, current, target), - dir = this.rtl ? 'right' : 'left', - left = parseInt(clearing.css('left'), 10), - width = target.outerWidth(), - skip_shift; - - var dir_obj = {}; - - // we use jQuery animate instead of CSS transitions because we - // need a callback to unlock the next animation - // needs support for RTL ** - if (target.index() !== old_index && !/skip/.test(direction)) { - if (/left/.test(direction)) { - this.lock(); - dir_obj[dir] = left + width; - clearing.animate(dir_obj, 300, this.unlock()); - } else if (/right/.test(direction)) { - this.lock(); - dir_obj[dir] = left - width; - clearing.animate(dir_obj, 300, this.unlock()); - } - } else if (/skip/.test(direction)) { - // the target image is not adjacent to the current image, so - // do we scroll right or not - skip_shift = target.index() - this.settings.up_count; - this.lock(); - - if (skip_shift > 0) { - dir_obj[dir] = -(skip_shift * width); - clearing.animate(dir_obj, 300, this.unlock()); - } else { - dir_obj[dir] = 0; - clearing.animate(dir_obj, 300, this.unlock()); - } - } - - callback(); - }, - - direction : function ($el, current, target) { - var lis = this.S('li', $el), - li_width = lis.outerWidth() + (lis.outerWidth() / 4), - up_count = Math.floor(this.S('.clearing-container').outerWidth() / li_width) - 1, - target_index = lis.index(target), - response; - - this.settings.up_count = up_count; - - if (this.adjacent(this.settings.prev_index, target_index)) { - if ((target_index > up_count) && target_index > this.settings.prev_index) { - response = 'right'; - } else if ((target_index > up_count - 1) && target_index <= this.settings.prev_index) { - response = 'left'; - } else { - response = false; - } - } else { - response = 'skip'; - } - - this.settings.prev_index = target_index; - - return response; - }, - - adjacent : function (current_index, target_index) { - for (var i = target_index + 1; i >= target_index - 1; i--) { - if (i === current_index) { - return true; - } - } - return false; - }, - - // lock management - - lock : function () { - this.settings.locked = true; - }, - - unlock : function () { - this.settings.locked = false; - }, - - locked : function () { - return this.settings.locked; - }, - - off : function () { - this.S(this.scope).off('.fndtn.clearing'); - this.S(window).off('.fndtn.clearing'); - }, - - reflow : function () { - this.init(); - } - }; - -}(jQuery, window, window.document)); -;(function ($, window, document, undefined) { - 'use strict'; - - Foundation.libs.topbar = { - name : 'topbar', - - version : '5.5.1', - - settings : { - index : 0, - sticky_class : 'sticky', - custom_back_text : true, - back_text : 'Back', - mobile_show_parent_link : true, - is_hover : true, - scrolltop : true, // jump to top when sticky nav menu toggle is clicked - sticky_on : 'all' - }, - - init : function (section, method, options) { - Foundation.inherit(this, 'add_custom_rule register_media throttle'); - var self = this; - - self.register_media('topbar', 'foundation-mq-topbar'); - - this.bindings(method, options); - - self.S('[' + this.attr_name() + ']', this.scope).each(function () { - var topbar = $(this), - settings = topbar.data(self.attr_name(true) + '-init'), - section = self.S('section, .top-bar-section', this); - topbar.data('index', 0); - var topbarContainer = topbar.parent(); - if (topbarContainer.hasClass('fixed') || self.is_sticky(topbar, topbarContainer, settings) ) { - self.settings.sticky_class = settings.sticky_class; - self.settings.sticky_topbar = topbar; - topbar.data('height', topbarContainer.outerHeight()); - topbar.data('stickyoffset', topbarContainer.offset().top); - } else { - topbar.data('height', topbar.outerHeight()); - } - - if (!settings.assembled) { - self.assemble(topbar); - } - - if (settings.is_hover) { - self.S('.has-dropdown', topbar).addClass('not-click'); - } else { - self.S('.has-dropdown', topbar).removeClass('not-click'); - } - - // Pad body when sticky (scrolled) or fixed. - self.add_custom_rule('.f-topbar-fixed { padding-top: ' + topbar.data('height') + 'px }'); - - if (topbarContainer.hasClass('fixed')) { - self.S('body').addClass('f-topbar-fixed'); - } - }); - - }, - - is_sticky : function (topbar, topbarContainer, settings) { - var sticky = topbarContainer.hasClass(settings.sticky_class); - var smallMatch = matchMedia(Foundation.media_queries.small).matches; - var medMatch = matchMedia(Foundation.media_queries.medium).matches; - var lrgMatch = matchMedia(Foundation.media_queries.large).matches; - - if (sticky && settings.sticky_on === 'all') { - return true; - } - if (sticky && this.small() && settings.sticky_on.indexOf('small') !== -1) { - if (smallMatch && !medMatch && !lrgMatch) { return true; } - } - if (sticky && this.medium() && settings.sticky_on.indexOf('medium') !== -1) { - if (smallMatch && medMatch && !lrgMatch) { return true; } - } - if (sticky && this.large() && settings.sticky_on.indexOf('large') !== -1) { - if (smallMatch && medMatch && lrgMatch) { return true; } - } - - // fix for iOS browsers - if (sticky && navigator.userAgent.match(/(iPad|iPhone|iPod)/g)) { - return true; - } - return false; - }, - - toggle : function (toggleEl) { - var self = this, - topbar; - - if (toggleEl) { - topbar = self.S(toggleEl).closest('[' + this.attr_name() + ']'); - } else { - topbar = self.S('[' + this.attr_name() + ']'); - } - - var settings = topbar.data(this.attr_name(true) + '-init'); - - var section = self.S('section, .top-bar-section', topbar); - - if (self.breakpoint()) { - if (!self.rtl) { - section.css({left : '0%'}); - $('>.name', section).css({left : '100%'}); - } else { - section.css({right : '0%'}); - $('>.name', section).css({right : '100%'}); - } - - self.S('li.moved', section).removeClass('moved'); - topbar.data('index', 0); - - topbar - .toggleClass('expanded') - .css('height', ''); - } - - if (settings.scrolltop) { - if (!topbar.hasClass('expanded')) { - if (topbar.hasClass('fixed')) { - topbar.parent().addClass('fixed'); - topbar.removeClass('fixed'); - self.S('body').addClass('f-topbar-fixed'); - } - } else if (topbar.parent().hasClass('fixed')) { - if (settings.scrolltop) { - topbar.parent().removeClass('fixed'); - topbar.addClass('fixed'); - self.S('body').removeClass('f-topbar-fixed'); - - window.scrollTo(0, 0); - } else { - topbar.parent().removeClass('expanded'); - } - } - } else { - if (self.is_sticky(topbar, topbar.parent(), settings)) { - topbar.parent().addClass('fixed'); - } - - if (topbar.parent().hasClass('fixed')) { - if (!topbar.hasClass('expanded')) { - topbar.removeClass('fixed'); - topbar.parent().removeClass('expanded'); - self.update_sticky_positioning(); - } else { - topbar.addClass('fixed'); - topbar.parent().addClass('expanded'); - self.S('body').addClass('f-topbar-fixed'); - } - } - } - }, - - timer : null, - - events : function (bar) { - var self = this, - S = this.S; - - S(this.scope) - .off('.topbar') - .on('click.fndtn.topbar', '[' + this.attr_name() + '] .toggle-topbar', function (e) { - e.preventDefault(); - self.toggle(this); - }) - .on('click.fndtn.topbar', '.top-bar .top-bar-section li a[href^="#"],[' + this.attr_name() + '] .top-bar-section li a[href^="#"]', function (e) { - var li = $(this).closest('li'); - if (self.breakpoint() && !li.hasClass('back') && !li.hasClass('has-dropdown')) { - self.toggle(); - } - }) - .on('click.fndtn.topbar', '[' + this.attr_name() + '] li.has-dropdown', function (e) { - var li = S(this), - target = S(e.target), - topbar = li.closest('[' + self.attr_name() + ']'), - settings = topbar.data(self.attr_name(true) + '-init'); - - if (target.data('revealId')) { - self.toggle(); - return; - } - - if (self.breakpoint()) { - return; - } - - if (settings.is_hover && !Modernizr.touch) { - return; - } - - e.stopImmediatePropagation(); - - if (li.hasClass('hover')) { - li - .removeClass('hover') - .find('li') - .removeClass('hover'); - - li.parents('li.hover') - .removeClass('hover'); - } else { - li.addClass('hover'); - - $(li).siblings().removeClass('hover'); - - if (target[0].nodeName === 'A' && target.parent().hasClass('has-dropdown')) { - e.preventDefault(); - } - } - }) - .on('click.fndtn.topbar', '[' + this.attr_name() + '] .has-dropdown>a', function (e) { - if (self.breakpoint()) { - - e.preventDefault(); - - var $this = S(this), - topbar = $this.closest('[' + self.attr_name() + ']'), - section = topbar.find('section, .top-bar-section'), - dropdownHeight = $this.next('.dropdown').outerHeight(), - $selectedLi = $this.closest('li'); - - topbar.data('index', topbar.data('index') + 1); - $selectedLi.addClass('moved'); - - if (!self.rtl) { - section.css({left : -(100 * topbar.data('index')) + '%'}); - section.find('>.name').css({left : 100 * topbar.data('index') + '%'}); - } else { - section.css({right : -(100 * topbar.data('index')) + '%'}); - section.find('>.name').css({right : 100 * topbar.data('index') + '%'}); - } - - topbar.css('height', $this.siblings('ul').outerHeight(true) + topbar.data('height')); - } - }); - - S(window).off('.topbar').on('resize.fndtn.topbar', self.throttle(function () { - self.resize.call(self); - }, 50)).trigger('resize').trigger('resize.fndtn.topbar').load(function () { - // Ensure that the offset is calculated after all of the pages resources have loaded - S(this).trigger('resize.fndtn.topbar'); - }); - - S('body').off('.topbar').on('click.fndtn.topbar', function (e) { - var parent = S(e.target).closest('li').closest('li.hover'); - - if (parent.length > 0) { - return; - } - - S('[' + self.attr_name() + '] li.hover').removeClass('hover'); - }); - - // Go up a level on Click - S(this.scope).on('click.fndtn.topbar', '[' + this.attr_name() + '] .has-dropdown .back', function (e) { - e.preventDefault(); - - var $this = S(this), - topbar = $this.closest('[' + self.attr_name() + ']'), - section = topbar.find('section, .top-bar-section'), - settings = topbar.data(self.attr_name(true) + '-init'), - $movedLi = $this.closest('li.moved'), - $previousLevelUl = $movedLi.parent(); - - topbar.data('index', topbar.data('index') - 1); - - if (!self.rtl) { - section.css({left : -(100 * topbar.data('index')) + '%'}); - section.find('>.name').css({left : 100 * topbar.data('index') + '%'}); - } else { - section.css({right : -(100 * topbar.data('index')) + '%'}); - section.find('>.name').css({right : 100 * topbar.data('index') + '%'}); - } - - if (topbar.data('index') === 0) { - topbar.css('height', ''); - } else { - topbar.css('height', $previousLevelUl.outerHeight(true) + topbar.data('height')); - } - - setTimeout(function () { - $movedLi.removeClass('moved'); - }, 300); - }); - - // Show dropdown menus when their items are focused - S(this.scope).find('.dropdown a') - .focus(function () { - $(this).parents('.has-dropdown').addClass('hover'); - }) - .blur(function () { - $(this).parents('.has-dropdown').removeClass('hover'); - }); - }, - - resize : function () { - var self = this; - self.S('[' + this.attr_name() + ']').each(function () { - var topbar = self.S(this), - settings = topbar.data(self.attr_name(true) + '-init'); - - var stickyContainer = topbar.parent('.' + self.settings.sticky_class); - var stickyOffset; - - if (!self.breakpoint()) { - var doToggle = topbar.hasClass('expanded'); - topbar - .css('height', '') - .removeClass('expanded') - .find('li') - .removeClass('hover'); - - if (doToggle) { - self.toggle(topbar); - } - } - - if (self.is_sticky(topbar, stickyContainer, settings)) { - if (stickyContainer.hasClass('fixed')) { - // Remove the fixed to allow for correct calculation of the offset. - stickyContainer.removeClass('fixed'); - - stickyOffset = stickyContainer.offset().top; - if (self.S(document.body).hasClass('f-topbar-fixed')) { - stickyOffset -= topbar.data('height'); - } - - topbar.data('stickyoffset', stickyOffset); - stickyContainer.addClass('fixed'); - } else { - stickyOffset = stickyContainer.offset().top; - topbar.data('stickyoffset', stickyOffset); - } - } - - }); - }, - - breakpoint : function () { - return !matchMedia(Foundation.media_queries['topbar']).matches; - }, - - small : function () { - return matchMedia(Foundation.media_queries['small']).matches; - }, - - medium : function () { - return matchMedia(Foundation.media_queries['medium']).matches; - }, - - large : function () { - return matchMedia(Foundation.media_queries['large']).matches; - }, - - assemble : function (topbar) { - var self = this, - settings = topbar.data(this.attr_name(true) + '-init'), - section = self.S('section, .top-bar-section', topbar); - - // Pull element out of the DOM for manipulation - section.detach(); - - self.S('.has-dropdown>a', section).each(function () { - var $link = self.S(this), - $dropdown = $link.siblings('.dropdown'), - url = $link.attr('href'), - $titleLi; - - if (!$dropdown.find('.title.back').length) { - - if (settings.mobile_show_parent_link == true && url) { - $titleLi = $('
  • '); - } else { - $titleLi = $('
  • '); - } - - // Copy link to subnav - if (settings.custom_back_text == true) { - $('h5>a', $titleLi).html(settings.back_text); - } else { - $('h5>a', $titleLi).html('« ' + $link.html()); - } - $dropdown.prepend($titleLi); - } - }); - - // Put element back in the DOM - section.appendTo(topbar); - - // check for sticky - this.sticky(); - - this.assembled(topbar); - }, - - assembled : function (topbar) { - topbar.data(this.attr_name(true), $.extend({}, topbar.data(this.attr_name(true)), {assembled : true})); - }, - - height : function (ul) { - var total = 0, - self = this; - - $('> li', ul).each(function () { - total += self.S(this).outerHeight(true); - }); - - return total; - }, - - sticky : function () { - var self = this; - - this.S(window).on('scroll', function () { - self.update_sticky_positioning(); - }); - }, - - update_sticky_positioning : function () { - var klass = '.' + this.settings.sticky_class, - $window = this.S(window), - self = this; - - if (self.settings.sticky_topbar && self.is_sticky(this.settings.sticky_topbar, this.settings.sticky_topbar.parent(), this.settings)) { - var distance = this.settings.sticky_topbar.data('stickyoffset'); - if (!self.S(klass).hasClass('expanded')) { - if ($window.scrollTop() > (distance)) { - if (!self.S(klass).hasClass('fixed')) { - self.S(klass).addClass('fixed'); - self.S('body').addClass('f-topbar-fixed'); - } - } else if ($window.scrollTop() <= distance) { - if (self.S(klass).hasClass('fixed')) { - self.S(klass).removeClass('fixed'); - self.S('body').removeClass('f-topbar-fixed'); - } - } - } - } - }, - - off : function () { - this.S(this.scope).off('.fndtn.topbar'); - this.S(window).off('.fndtn.topbar'); - }, - - reflow : function () {} - }; -}(jQuery, window, window.document)); diff --git a/static/scripts/foundation/normalize.css b/static/scripts/foundation/normalize.css deleted file mode 100644 index 458eea1..0000000 --- a/static/scripts/foundation/normalize.css +++ /dev/null @@ -1,427 +0,0 @@ -/*! normalize.css v3.0.2 | MIT License | git.io/normalize */ - -/** - * 1. Set default font family to sans-serif. - * 2. Prevent iOS text size adjust after orientation change, without disabling - * user zoom. - */ - -html { - font-family: sans-serif; /* 1 */ - -ms-text-size-adjust: 100%; /* 2 */ - -webkit-text-size-adjust: 100%; /* 2 */ -} - -/** - * Remove default margin. - */ - -body { - margin: 0; -} - -/* HTML5 display definitions - ========================================================================== */ - -/** - * Correct `block` display not defined for any HTML5 element in IE 8/9. - * Correct `block` display not defined for `details` or `summary` in IE 10/11 - * and Firefox. - * Correct `block` display not defined for `main` in IE 11. - */ - -article, -aside, -details, -figcaption, -figure, -footer, -header, -hgroup, -main, -menu, -nav, -section, -summary { - display: block; -} - -/** - * 1. Correct `inline-block` display not defined in IE 8/9. - * 2. Normalize vertical alignment of `progress` in Chrome, Firefox, and Opera. - */ - -audio, -canvas, -progress, -video { - display: inline-block; /* 1 */ - vertical-align: baseline; /* 2 */ -} - -/** - * Prevent modern browsers from displaying `audio` without controls. - * Remove excess height in iOS 5 devices. - */ - -audio:not([controls]) { - display: none; - height: 0; -} - -/** - * Address `[hidden]` styling not present in IE 8/9/10. - * Hide the `template` element in IE 8/9/11, Safari, and Firefox < 22. - */ - -[hidden], -template { - display: none; -} - -/* Links - ========================================================================== */ - -/** - * Remove the gray background color from active links in IE 10. - */ - -a { - background-color: transparent; -} - -/** - * Improve readability when focused and also mouse hovered in all browsers. - */ - -a:active, -a:hover { - outline: 0; -} - -/* Text-level semantics - ========================================================================== */ - -/** - * Address styling not present in IE 8/9/10/11, Safari, and Chrome. - */ - -abbr[title] { - border-bottom: 1px dotted; -} - -/** - * Address style set to `bolder` in Firefox 4+, Safari, and Chrome. - */ - -b, -strong { - font-weight: bold; -} - -/** - * Address styling not present in Safari and Chrome. - */ - -dfn { - font-style: italic; -} - -/** - * Address variable `h1` font-size and margin within `section` and `article` - * contexts in Firefox 4+, Safari, and Chrome. - */ - -h1 { - font-size: 2em; - margin: 0.67em 0; -} - -/** - * Address styling not present in IE 8/9. - */ - -mark { - background: #ff0; - color: #000; -} - -/** - * Address inconsistent and variable font size in all browsers. - */ - -small { - font-size: 80%; -} - -/** - * Prevent `sub` and `sup` affecting `line-height` in all browsers. - */ - -sub, -sup { - font-size: 75%; - line-height: 0; - position: relative; - vertical-align: baseline; -} - -sup { - top: -0.5em; -} - -sub { - bottom: -0.25em; -} - -/* Embedded content - ========================================================================== */ - -/** - * Remove border when inside `a` element in IE 8/9/10. - */ - -img { - border: 0; -} - -/** - * Correct overflow not hidden in IE 9/10/11. - */ - -svg:not(:root) { - overflow: hidden; -} - -/* Grouping content - ========================================================================== */ - -/** - * Address margin not present in IE 8/9 and Safari. - */ - -figure { - margin: 1em 40px; -} - -/** - * Address differences between Firefox and other browsers. - */ - -hr { - -moz-box-sizing: content-box; - box-sizing: content-box; - height: 0; -} - -/** - * Contain overflow in all browsers. - */ - -pre { - overflow: auto; -} - -/** - * Address odd `em`-unit font size rendering in all browsers. - */ - -code, -kbd, -pre, -samp { - font-family: monospace, monospace; - font-size: 1em; -} - -/* Forms - ========================================================================== */ - -/** - * Known limitation: by default, Chrome and Safari on OS X allow very limited - * styling of `select`, unless a `border` property is set. - */ - -/** - * 1. Correct color not being inherited. - * Known issue: affects color of disabled elements. - * 2. Correct font properties not being inherited. - * 3. Address margins set differently in Firefox 4+, Safari, and Chrome. - */ - -button, -input, -optgroup, -select, -textarea { - color: inherit; /* 1 */ - font: inherit; /* 2 */ - margin: 0; /* 3 */ -} - -/** - * Address `overflow` set to `hidden` in IE 8/9/10/11. - */ - -button { - overflow: visible; -} - -/** - * Address inconsistent `text-transform` inheritance for `button` and `select`. - * All other form control elements do not inherit `text-transform` values. - * Correct `button` style inheritance in Firefox, IE 8/9/10/11, and Opera. - * Correct `select` style inheritance in Firefox. - */ - -button, -select { - text-transform: none; -} - -/** - * 1. Avoid the WebKit bug in Android 4.0.* where (2) destroys native `audio` - * and `video` controls. - * 2. Correct inability to style clickable `input` types in iOS. - * 3. Improve usability and consistency of cursor style between image-type - * `input` and others. - */ - -button, -html input[type="button"], /* 1 */ -input[type="reset"], -input[type="submit"] { - -webkit-appearance: button; /* 2 */ - cursor: pointer; /* 3 */ -} - -/** - * Re-set default cursor for disabled elements. - */ - -button[disabled], -html input[disabled] { - cursor: default; -} - -/** - * Remove inner padding and border in Firefox 4+. - */ - -button::-moz-focus-inner, -input::-moz-focus-inner { - border: 0; - padding: 0; -} - -/** - * Address Firefox 4+ setting `line-height` on `input` using `!important` in - * the UA stylesheet. - */ - -input { - line-height: normal; -} - -/** - * It's recommended that you don't attempt to style these elements. - * Firefox's implementation doesn't respect box-sizing, padding, or width. - * - * 1. Address box sizing set to `content-box` in IE 8/9/10. - * 2. Remove excess padding in IE 8/9/10. - */ - -input[type="checkbox"], -input[type="radio"] { - box-sizing: border-box; /* 1 */ - padding: 0; /* 2 */ -} - -/** - * Fix the cursor style for Chrome's increment/decrement buttons. For certain - * `font-size` values of the `input`, it causes the cursor style of the - * decrement button to change from `default` to `text`. - */ - -input[type="number"]::-webkit-inner-spin-button, -input[type="number"]::-webkit-outer-spin-button { - height: auto; -} - -/** - * 1. Address `appearance` set to `searchfield` in Safari and Chrome. - * 2. Address `box-sizing` set to `border-box` in Safari and Chrome - * (include `-moz` to future-proof). - */ - -input[type="search"] { - -webkit-appearance: textfield; /* 1 */ - -moz-box-sizing: content-box; - -webkit-box-sizing: content-box; /* 2 */ - box-sizing: content-box; -} - -/** - * Remove inner padding and search cancel button in Safari and Chrome on OS X. - * Safari (but not Chrome) clips the cancel button when the search input has - * padding (and `textfield` appearance). - */ - -input[type="search"]::-webkit-search-cancel-button, -input[type="search"]::-webkit-search-decoration { - -webkit-appearance: none; -} - -/** - * Define consistent border, margin, and padding. - */ - -fieldset { - border: 1px solid #c0c0c0; - margin: 0 2px; - padding: 0.35em 0.625em 0.75em; -} - -/** - * 1. Correct `color` not being inherited in IE 8/9/10/11. - * 2. Remove padding so people aren't caught out if they zero out fieldsets. - */ - -legend { - border: 0; /* 1 */ - padding: 0; /* 2 */ -} - -/** - * Remove default vertical scrollbar in IE 8/9/10/11. - */ - -textarea { - overflow: auto; -} - -/** - * Don't inherit the `font-weight` (applied by a rule above). - * NOTE: the default cannot safely be changed in Chrome and Safari on OS X. - */ - -optgroup { - font-weight: bold; -} - -/* Tables - ========================================================================== */ - -/** - * Remove most spacing between table cells. - */ - -table { - border-collapse: collapse; - border-spacing: 0; -} - -td, -th { - padding: 0; -} diff --git a/static/scripts/graphael-demo/g.bar-min.js b/static/scripts/graphael-demo/g.bar-min.js deleted file mode 100644 index a11dda3..0000000 --- a/static/scripts/graphael-demo/g.bar-min.js +++ /dev/null @@ -1,19 +0,0 @@ -/*! - * g.Raphael 0.51 - Charting library, based on RaphaĆ«l - * - * Copyright (c) 2009-2012 Dmitry Baranovskiy (http://g.raphaeljs.com) - * Licensed under the MIT (http://www.opensource.org/licenses/mit-license.php) license. - */ -(function(){function B(f,m,i,b,a,h,n,A){var c;if(a&&!b||!a&&!i)return n?"":A.path();h={round:"round",sharp:"sharp",soft:"soft",square:"square"}[h]||"square";b=Math.round(b);i=Math.round(i);f=Math.round(f);m=Math.round(m);switch(h){case "round":a?(a=~~(i/2),c=b=2*a?e.attr({path:["M",b,f+a,"a",a,a,0,1,1,0,2*-a,a,a,0,1,1,0,2*a,"m",0,2*-a-3,"a",a+3,a+3,0,1,0,0,2*(a+3),"L",b+a+3,f+c.height/2+3,"l",c.width+6,0, -0,-c.height-6,-c.width-6,0,"L",b,f-a-3].join()}):(g=Math.sqrt(Math.pow(a+3,2)-Math.pow(c.height/2+3,2)),e.attr({path:["M",b,f+a,"c",-i,0,-a,i-a,-a,-a,0,-i,a-i,-a,a,-a,i,0,a,a-i,a,a,0,i,i-a,a,-a,a,"M",b+g,f-c.height/2-3,"a",a+3,a+3,0,1,0,0,c.height+6,"l",a+3-g+c.width+6,0,0,-c.height-6,"L",b+g,f-c.height/2-3].join()}));d=360-d;e.rotate(d,b,f);this.attrs?(this.attr(this.attrs.x?"x":"cx",b+a+3+(!h?"text"==this.type?c.width:0:c.width/2)).attr("y",h?f:f-c.height/2),this.rotate(d,b,f),90d&&this.attr(this.attrs.x? -"x":"cx",b-a-3-(!h?c.width:c.width/2)).rotate(180,b,f)):90d?(this.translate(b-c.x-c.width-a-3,f-c.y-c.height/2),this.rotate(d-180,c.x+c.width+a+3,c.y+c.height/2)):(this.translate(b-c.x+a+3,f-c.y-c.height/2),this.rotate(d,c.x-a-3,c.y+c.height/2));return e.insertBefore(this.node?this:this[0])}}; -Raphael.el.drop=function(d,a,b){var f=this.getBBox(),e=this.paper||this[0].paper,c,g;if(e){switch(this.type){case "text":case "circle":case "ellipse":c=!0;break;default:c=!1}d=d||0;a="number"==typeof a?a:c?f.x+f.width/2:f.x;b="number"==typeof b?b:c?f.y+f.height/2:f.y;g=Math.max(f.width,f.height)+Math.min(f.width,f.height);e=e.path(["M",a,b,"l",g,0,"A",0.4*g,0.4*g,0,1,0,a+0.7*g,b-0.7*g,"z"]).attr({fill:"#000",stroke:"none"}).rotate(22.5-d,a,b);d=(d+90)*Math.PI/180;a=a+g*Math.sin(d)-(c?0:f.width/2); -d=b+g*Math.cos(d)-(c?0:f.height/2);this.attrs?this.attr(this.attrs.x?"x":"cx",a).attr(this.attrs.y?"y":"cy",d):this.translate(a-f.x,d-f.y);return e.insertBefore(this.node?this:this[0])}}; -Raphael.el.flag=function(d,a,b){var f=this.paper||this[0].paper;if(f){var f=f.path().attr({fill:"#000",stroke:"#000"}),e=this.getBBox(),c=e.height/2,g;switch(this.type){case "text":case "circle":case "ellipse":g=!0;break;default:g=!1}d=d||0;a="number"==typeof a?a:g?e.x+e.width/2:e.x;b="number"==typeof b?b:g?e.y+e.height/2:e.y;f.attr({path:["M",a,b,"l",c+3,-c-3,e.width+6,0,0,e.height+6,-e.width-6,0,"z"].join()});d=360-d;f.rotate(d,a,b);this.attrs?(this.attr(this.attrs.x?"x":"cx",a+c+3+(!g?"text"== -this.type?e.width:0:e.width/2)).attr("y",g?b:b-e.height/2),this.rotate(d,a,b),90d&&this.attr(this.attrs.x?"x":"cx",a-c-3-(!g?e.width:e.width/2)).rotate(180,a,b)):90d?(this.translate(a-e.x-e.width-c-3,b-e.y-e.height/2),this.rotate(d-180,e.x+e.width+c+3,e.y+e.height/2)):(this.translate(a-e.x+c+3,b-e.y-e.height/2),this.rotate(d,e.x-c-3,e.y+e.height/2));return f.insertBefore(this.node?this:this[0])}}; -Raphael.el.label=function(){var d=this.getBBox(),a=this.paper||this[0].paper,b=Math.min(20,d.width+10,d.height+10)/2;if(a)return a.rect(d.x-b/2,d.y-b/2,d.width+b,d.height+b,b).attr({stroke:"none",fill:"#000"}).insertBefore(this.node?this:this[0])}; -Raphael.el.blob=function(d,a,b){var f=this.getBBox(),e=Math.PI/180,c=this.paper||this[0].paper,g,i;if(c){switch(this.type){case "text":case "circle":case "ellipse":g=!0;break;default:g=!1}c=c.path().attr({fill:"#000",stroke:"none"});d=(+d+1?d:45)+90;i=Math.min(f.height,f.width);var a="number"==typeof a?a:g?f.x+f.width/2:f.x,b="number"==typeof b?b:g?f.y+f.height/2:f.y,h=Math.max(f.width+i,25*i/12),j=Math.max(f.height+i,25*i/12);g=a+i*Math.sin((d-22.5)*e);var o=b+i*Math.cos((d-22.5)*e),l=a+i*Math.sin((d+ -22.5)*e),d=b+i*Math.cos((d+22.5)*e),e=(l-g)/2;i=(d-o)/2;var h=h/2,j=j/2,n=-Math.sqrt(Math.abs(h*h*j*j-h*h*i*i-j*j*e*e)/(h*h*i*i+j*j*e*e));i=n*h*i/j+(l+g)/2;e=n*-j*e/h+(d+o)/2;c.attr({x:i,y:e,path:["M",a,b,"L",l,d,"A",h,j,0,1,1,g,o,"z"].join()});this.translate(i-f.x-f.width/2,e-f.y-f.height/2);return c.insertBefore(this.node?this:this[0])}};Raphael.fn.label=function(d,a,b){var f=this.set(),b=this.text(d,a,b).attr(Raphael.g.txtattr);return f.push(b.label(),b)}; -Raphael.fn.popup=function(d,a,b,f,e){var c=this.set(),b=this.text(d,a,b).attr(Raphael.g.txtattr);return c.push(b.popup(f,e),b)};Raphael.fn.tag=function(d,a,b,f,e){var c=this.set(),b=this.text(d,a,b).attr(Raphael.g.txtattr);return c.push(b.tag(f,e),b)};Raphael.fn.flag=function(d,a,b,f){var e=this.set(),b=this.text(d,a,b).attr(Raphael.g.txtattr);return e.push(b.flag(f),b)};Raphael.fn.drop=function(d,a,b,f){var e=this.set(),b=this.text(d,a,b).attr(Raphael.g.txtattr);return e.push(b.drop(f),b)}; -Raphael.fn.blob=function(d,a,b,f){var e=this.set(),b=this.text(d,a,b).attr(Raphael.g.txtattr);return e.push(b.blob(f),b)};Raphael.el.lighter=function(d){var d=d||2,a=[this.attrs.fill,this.attrs.stroke];this.fs=this.fs||[a[0],a[1]];a[0]=Raphael.rgb2hsb(Raphael.getRGB(a[0]).hex);a[1]=Raphael.rgb2hsb(Raphael.getRGB(a[1]).hex);a[0].b=Math.min(a[0].b*d,1);a[0].s/=d;a[1].b=Math.min(a[1].b*d,1);a[1].s/=d;this.attr({fill:"hsb("+[a[0].h,a[0].s,a[0].b]+")",stroke:"hsb("+[a[1].h,a[1].s,a[1].b]+")"});return this}; -Raphael.el.darker=function(d){var d=d||2,a=[this.attrs.fill,this.attrs.stroke];this.fs=this.fs||[a[0],a[1]];a[0]=Raphael.rgb2hsb(Raphael.getRGB(a[0]).hex);a[1]=Raphael.rgb2hsb(Raphael.getRGB(a[1]).hex);a[0].s=Math.min(a[0].s*d,1);a[0].b/=d;a[1].s=Math.min(a[1].s*d,1);a[1].b/=d;this.attr({fill:"hsb("+[a[0].h,a[0].s,a[0].b]+")",stroke:"hsb("+[a[1].h,a[1].s,a[1].b]+")"});return this};Raphael.el.resetBrightness=function(){this.fs&&(this.attr({fill:this.fs[0],stroke:this.fs[1]}),delete this.fs);return this}; -(function(){var d=["lighter","darker","resetBrightness"],a="popup tag flag label drop blob".split(" "),b;for(b in a)(function(a){Raphael.st[a]=function(){return Raphael.el[a].apply(this,arguments)}})(a[b]);for(b in d)(function(a){Raphael.st[a]=function(){for(var b=0;bb;b++)bMath.abs(a-0.5)?~~a+0.5:Math.round(a)}var e=d,c=a;if(e==c)return{from:e,to:c,power:0};var e=(c-e)/b,g=c=~~e,b=0;if(c){for(;g;)b--,g=~~(e*Math.pow(10,b))/Math.pow(10,b); -b++}else{if(0==e||!isFinite(e))b=1;else for(;!c;)b=b||1,c=~~(e*Math.pow(10,b))/Math.pow(10,b),b++;b&&b--}c=f(a*Math.pow(10,b))/Math.pow(10,b);c=a-b;)"-"!=h&&" "!=h&&(l=l.concat(["M",d-("+"==h||"|"==h?j:2*!(g-1)*j),m+0.5,"l",2*j+1,0])),n.push(o.text(d+p,m,i&&i[u++]||(Math.round(k)==k?k:+k.toFixed(r))).attr(v).attr({"text-anchor":g-1?"start":"end"})),k+=t,m-=s;Math.round(m+s-(a-b))&&("-"!=h&&" "!=h&&(l=l.concat(["M",d-("+"==h||"|"==h?j:2*!(g-1)*j),a-b+0.5,"l",2*j+1,0])),n.push(o.text(d+ -p,a-b,i&&i[u]||(Math.round(k)==k?k:+k.toFixed(r))).attr(v).attr({"text-anchor":g-1?"start":"end"})))}else{for(var k=p,r=(0=q.x-5?n.pop(n.length-1).remove():w=q.x+q.width,k+=t,m+=s;Math.round(m-s-d-b)&&("-"!=h&&" "!=h&&(l=l.concat(["M",d+b+0.5,a-("+"==h?j:2*!!g*j),"l",0,2*j+1])),n.push(o.text(d+ -b,a+p,i&&i[u]||(Math.round(k)==k?k:+k.toFixed(r))).attr(v)))}l=o.path(l);l.text=n;l.all=o.set([l,n]);l.remove=function(){this.text.remove();this.constructor.prototype.remove.call(this)};return l},labelise:function(d,a,b){return d?(d+"").replace(/(##+(?:\.#+)?)|(%%+(?:\.%+)?)/g,function(d,e,c){if(e)return(+a).toFixed(e.replace(/^#+\.?/g,"").length);if(c)return(100*a/b).toFixed(c.replace(/^%+\.?/g,"").length)+"%"}):(+a).toFixed(0)}}; \ No newline at end of file diff --git a/static/scripts/jquery.min.js b/static/scripts/jquery.min.js deleted file mode 100644 index 9a85bd3..0000000 --- a/static/scripts/jquery.min.js +++ /dev/null @@ -1,6 +0,0 @@ -/*! jQuery v2.0.3 | (c) 2005, 2013 jQuery Foundation, Inc. | jquery.org/license -//@ sourceMappingURL=jquery.min.map -*/ -(function(e,undefined){var t,n,r=typeof undefined,i=e.location,o=e.document,s=o.documentElement,a=e.jQuery,u=e.$,l={},c=[],p="2.0.3",f=c.concat,h=c.push,d=c.slice,g=c.indexOf,m=l.toString,y=l.hasOwnProperty,v=p.trim,x=function(e,n){return new x.fn.init(e,n,t)},b=/[+-]?(?:\d*\.|)\d+(?:[eE][+-]?\d+|)/.source,w=/\S+/g,T=/^(?:\s*(<[\w\W]+>)[^>]*|#([\w-]*))$/,C=/^<(\w+)\s*\/?>(?:<\/\1>|)$/,k=/^-ms-/,N=/-([\da-z])/gi,E=function(e,t){return t.toUpperCase()},S=function(){o.removeEventListener("DOMContentLoaded",S,!1),e.removeEventListener("load",S,!1),x.ready()};x.fn=x.prototype={jquery:p,constructor:x,init:function(e,t,n){var r,i;if(!e)return this;if("string"==typeof e){if(r="<"===e.charAt(0)&&">"===e.charAt(e.length-1)&&e.length>=3?[null,e,null]:T.exec(e),!r||!r[1]&&t)return!t||t.jquery?(t||n).find(e):this.constructor(t).find(e);if(r[1]){if(t=t instanceof x?t[0]:t,x.merge(this,x.parseHTML(r[1],t&&t.nodeType?t.ownerDocument||t:o,!0)),C.test(r[1])&&x.isPlainObject(t))for(r in t)x.isFunction(this[r])?this[r](t[r]):this.attr(r,t[r]);return this}return i=o.getElementById(r[2]),i&&i.parentNode&&(this.length=1,this[0]=i),this.context=o,this.selector=e,this}return e.nodeType?(this.context=this[0]=e,this.length=1,this):x.isFunction(e)?n.ready(e):(e.selector!==undefined&&(this.selector=e.selector,this.context=e.context),x.makeArray(e,this))},selector:"",length:0,toArray:function(){return d.call(this)},get:function(e){return null==e?this.toArray():0>e?this[this.length+e]:this[e]},pushStack:function(e){var t=x.merge(this.constructor(),e);return t.prevObject=this,t.context=this.context,t},each:function(e,t){return x.each(this,e,t)},ready:function(e){return x.ready.promise().done(e),this},slice:function(){return this.pushStack(d.apply(this,arguments))},first:function(){return this.eq(0)},last:function(){return this.eq(-1)},eq:function(e){var t=this.length,n=+e+(0>e?t:0);return this.pushStack(n>=0&&t>n?[this[n]]:[])},map:function(e){return this.pushStack(x.map(this,function(t,n){return e.call(t,n,t)}))},end:function(){return this.prevObject||this.constructor(null)},push:h,sort:[].sort,splice:[].splice},x.fn.init.prototype=x.fn,x.extend=x.fn.extend=function(){var e,t,n,r,i,o,s=arguments[0]||{},a=1,u=arguments.length,l=!1;for("boolean"==typeof s&&(l=s,s=arguments[1]||{},a=2),"object"==typeof s||x.isFunction(s)||(s={}),u===a&&(s=this,--a);u>a;a++)if(null!=(e=arguments[a]))for(t in e)n=s[t],r=e[t],s!==r&&(l&&r&&(x.isPlainObject(r)||(i=x.isArray(r)))?(i?(i=!1,o=n&&x.isArray(n)?n:[]):o=n&&x.isPlainObject(n)?n:{},s[t]=x.extend(l,o,r)):r!==undefined&&(s[t]=r));return s},x.extend({expando:"jQuery"+(p+Math.random()).replace(/\D/g,""),noConflict:function(t){return e.$===x&&(e.$=u),t&&e.jQuery===x&&(e.jQuery=a),x},isReady:!1,readyWait:1,holdReady:function(e){e?x.readyWait++:x.ready(!0)},ready:function(e){(e===!0?--x.readyWait:x.isReady)||(x.isReady=!0,e!==!0&&--x.readyWait>0||(n.resolveWith(o,[x]),x.fn.trigger&&x(o).trigger("ready").off("ready")))},isFunction:function(e){return"function"===x.type(e)},isArray:Array.isArray,isWindow:function(e){return null!=e&&e===e.window},isNumeric:function(e){return!isNaN(parseFloat(e))&&isFinite(e)},type:function(e){return null==e?e+"":"object"==typeof e||"function"==typeof e?l[m.call(e)]||"object":typeof e},isPlainObject:function(e){if("object"!==x.type(e)||e.nodeType||x.isWindow(e))return!1;try{if(e.constructor&&!y.call(e.constructor.prototype,"isPrototypeOf"))return!1}catch(t){return!1}return!0},isEmptyObject:function(e){var t;for(t in e)return!1;return!0},error:function(e){throw Error(e)},parseHTML:function(e,t,n){if(!e||"string"!=typeof e)return null;"boolean"==typeof t&&(n=t,t=!1),t=t||o;var r=C.exec(e),i=!n&&[];return r?[t.createElement(r[1])]:(r=x.buildFragment([e],t,i),i&&x(i).remove(),x.merge([],r.childNodes))},parseJSON:JSON.parse,parseXML:function(e){var t,n;if(!e||"string"!=typeof e)return null;try{n=new DOMParser,t=n.parseFromString(e,"text/xml")}catch(r){t=undefined}return(!t||t.getElementsByTagName("parsererror").length)&&x.error("Invalid XML: "+e),t},noop:function(){},globalEval:function(e){var t,n=eval;e=x.trim(e),e&&(1===e.indexOf("use strict")?(t=o.createElement("script"),t.text=e,o.head.appendChild(t).parentNode.removeChild(t)):n(e))},camelCase:function(e){return e.replace(k,"ms-").replace(N,E)},nodeName:function(e,t){return e.nodeName&&e.nodeName.toLowerCase()===t.toLowerCase()},each:function(e,t,n){var r,i=0,o=e.length,s=j(e);if(n){if(s){for(;o>i;i++)if(r=t.apply(e[i],n),r===!1)break}else for(i in e)if(r=t.apply(e[i],n),r===!1)break}else if(s){for(;o>i;i++)if(r=t.call(e[i],i,e[i]),r===!1)break}else for(i in e)if(r=t.call(e[i],i,e[i]),r===!1)break;return e},trim:function(e){return null==e?"":v.call(e)},makeArray:function(e,t){var n=t||[];return null!=e&&(j(Object(e))?x.merge(n,"string"==typeof e?[e]:e):h.call(n,e)),n},inArray:function(e,t,n){return null==t?-1:g.call(t,e,n)},merge:function(e,t){var n=t.length,r=e.length,i=0;if("number"==typeof n)for(;n>i;i++)e[r++]=t[i];else while(t[i]!==undefined)e[r++]=t[i++];return e.length=r,e},grep:function(e,t,n){var r,i=[],o=0,s=e.length;for(n=!!n;s>o;o++)r=!!t(e[o],o),n!==r&&i.push(e[o]);return i},map:function(e,t,n){var r,i=0,o=e.length,s=j(e),a=[];if(s)for(;o>i;i++)r=t(e[i],i,n),null!=r&&(a[a.length]=r);else for(i in e)r=t(e[i],i,n),null!=r&&(a[a.length]=r);return f.apply([],a)},guid:1,proxy:function(e,t){var n,r,i;return"string"==typeof t&&(n=e[t],t=e,e=n),x.isFunction(e)?(r=d.call(arguments,2),i=function(){return e.apply(t||this,r.concat(d.call(arguments)))},i.guid=e.guid=e.guid||x.guid++,i):undefined},access:function(e,t,n,r,i,o,s){var a=0,u=e.length,l=null==n;if("object"===x.type(n)){i=!0;for(a in n)x.access(e,t,a,n[a],!0,o,s)}else if(r!==undefined&&(i=!0,x.isFunction(r)||(s=!0),l&&(s?(t.call(e,r),t=null):(l=t,t=function(e,t,n){return l.call(x(e),n)})),t))for(;u>a;a++)t(e[a],n,s?r:r.call(e[a],a,t(e[a],n)));return i?e:l?t.call(e):u?t(e[0],n):o},now:Date.now,swap:function(e,t,n,r){var i,o,s={};for(o in t)s[o]=e.style[o],e.style[o]=t[o];i=n.apply(e,r||[]);for(o in t)e.style[o]=s[o];return i}}),x.ready.promise=function(t){return n||(n=x.Deferred(),"complete"===o.readyState?setTimeout(x.ready):(o.addEventListener("DOMContentLoaded",S,!1),e.addEventListener("load",S,!1))),n.promise(t)},x.each("Boolean Number String Function Array Date RegExp Object Error".split(" "),function(e,t){l["[object "+t+"]"]=t.toLowerCase()});function j(e){var t=e.length,n=x.type(e);return x.isWindow(e)?!1:1===e.nodeType&&t?!0:"array"===n||"function"!==n&&(0===t||"number"==typeof t&&t>0&&t-1 in e)}t=x(o),function(e,undefined){var t,n,r,i,o,s,a,u,l,c,p,f,h,d,g,m,y,v="sizzle"+-new Date,b=e.document,w=0,T=0,C=st(),k=st(),N=st(),E=!1,S=function(e,t){return e===t?(E=!0,0):0},j=typeof undefined,D=1<<31,A={}.hasOwnProperty,L=[],q=L.pop,H=L.push,O=L.push,F=L.slice,P=L.indexOf||function(e){var t=0,n=this.length;for(;n>t;t++)if(this[t]===e)return t;return-1},R="checked|selected|async|autofocus|autoplay|controls|defer|disabled|hidden|ismap|loop|multiple|open|readonly|required|scoped",M="[\\x20\\t\\r\\n\\f]",W="(?:\\\\.|[\\w-]|[^\\x00-\\xa0])+",$=W.replace("w","w#"),B="\\["+M+"*("+W+")"+M+"*(?:([*^$|!~]?=)"+M+"*(?:(['\"])((?:\\\\.|[^\\\\])*?)\\3|("+$+")|)|)"+M+"*\\]",I=":("+W+")(?:\\(((['\"])((?:\\\\.|[^\\\\])*?)\\3|((?:\\\\.|[^\\\\()[\\]]|"+B.replace(3,8)+")*)|.*)\\)|)",z=RegExp("^"+M+"+|((?:^|[^\\\\])(?:\\\\.)*)"+M+"+$","g"),_=RegExp("^"+M+"*,"+M+"*"),X=RegExp("^"+M+"*([>+~]|"+M+")"+M+"*"),U=RegExp(M+"*[+~]"),Y=RegExp("="+M+"*([^\\]'\"]*)"+M+"*\\]","g"),V=RegExp(I),G=RegExp("^"+$+"$"),J={ID:RegExp("^#("+W+")"),CLASS:RegExp("^\\.("+W+")"),TAG:RegExp("^("+W.replace("w","w*")+")"),ATTR:RegExp("^"+B),PSEUDO:RegExp("^"+I),CHILD:RegExp("^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\("+M+"*(even|odd|(([+-]|)(\\d*)n|)"+M+"*(?:([+-]|)"+M+"*(\\d+)|))"+M+"*\\)|)","i"),bool:RegExp("^(?:"+R+")$","i"),needsContext:RegExp("^"+M+"*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\("+M+"*((?:-\\d)?\\d*)"+M+"*\\)|)(?=[^-]|$)","i")},Q=/^[^{]+\{\s*\[native \w/,K=/^(?:#([\w-]+)|(\w+)|\.([\w-]+))$/,Z=/^(?:input|select|textarea|button)$/i,et=/^h\d$/i,tt=/'|\\/g,nt=RegExp("\\\\([\\da-f]{1,6}"+M+"?|("+M+")|.)","ig"),rt=function(e,t,n){var r="0x"+t-65536;return r!==r||n?t:0>r?String.fromCharCode(r+65536):String.fromCharCode(55296|r>>10,56320|1023&r)};try{O.apply(L=F.call(b.childNodes),b.childNodes),L[b.childNodes.length].nodeType}catch(it){O={apply:L.length?function(e,t){H.apply(e,F.call(t))}:function(e,t){var n=e.length,r=0;while(e[n++]=t[r++]);e.length=n-1}}}function ot(e,t,r,i){var o,s,a,u,l,f,g,m,x,w;if((t?t.ownerDocument||t:b)!==p&&c(t),t=t||p,r=r||[],!e||"string"!=typeof e)return r;if(1!==(u=t.nodeType)&&9!==u)return[];if(h&&!i){if(o=K.exec(e))if(a=o[1]){if(9===u){if(s=t.getElementById(a),!s||!s.parentNode)return r;if(s.id===a)return r.push(s),r}else if(t.ownerDocument&&(s=t.ownerDocument.getElementById(a))&&y(t,s)&&s.id===a)return r.push(s),r}else{if(o[2])return O.apply(r,t.getElementsByTagName(e)),r;if((a=o[3])&&n.getElementsByClassName&&t.getElementsByClassName)return O.apply(r,t.getElementsByClassName(a)),r}if(n.qsa&&(!d||!d.test(e))){if(m=g=v,x=t,w=9===u&&e,1===u&&"object"!==t.nodeName.toLowerCase()){f=gt(e),(g=t.getAttribute("id"))?m=g.replace(tt,"\\$&"):t.setAttribute("id",m),m="[id='"+m+"'] ",l=f.length;while(l--)f[l]=m+mt(f[l]);x=U.test(e)&&t.parentNode||t,w=f.join(",")}if(w)try{return O.apply(r,x.querySelectorAll(w)),r}catch(T){}finally{g||t.removeAttribute("id")}}}return kt(e.replace(z,"$1"),t,r,i)}function st(){var e=[];function t(n,r){return e.push(n+=" ")>i.cacheLength&&delete t[e.shift()],t[n]=r}return t}function at(e){return e[v]=!0,e}function ut(e){var t=p.createElement("div");try{return!!e(t)}catch(n){return!1}finally{t.parentNode&&t.parentNode.removeChild(t),t=null}}function lt(e,t){var n=e.split("|"),r=e.length;while(r--)i.attrHandle[n[r]]=t}function ct(e,t){var n=t&&e,r=n&&1===e.nodeType&&1===t.nodeType&&(~t.sourceIndex||D)-(~e.sourceIndex||D);if(r)return r;if(n)while(n=n.nextSibling)if(n===t)return-1;return e?1:-1}function pt(e){return function(t){var n=t.nodeName.toLowerCase();return"input"===n&&t.type===e}}function ft(e){return function(t){var n=t.nodeName.toLowerCase();return("input"===n||"button"===n)&&t.type===e}}function ht(e){return at(function(t){return t=+t,at(function(n,r){var i,o=e([],n.length,t),s=o.length;while(s--)n[i=o[s]]&&(n[i]=!(r[i]=n[i]))})})}s=ot.isXML=function(e){var t=e&&(e.ownerDocument||e).documentElement;return t?"HTML"!==t.nodeName:!1},n=ot.support={},c=ot.setDocument=function(e){var t=e?e.ownerDocument||e:b,r=t.defaultView;return t!==p&&9===t.nodeType&&t.documentElement?(p=t,f=t.documentElement,h=!s(t),r&&r.attachEvent&&r!==r.top&&r.attachEvent("onbeforeunload",function(){c()}),n.attributes=ut(function(e){return e.className="i",!e.getAttribute("className")}),n.getElementsByTagName=ut(function(e){return e.appendChild(t.createComment("")),!e.getElementsByTagName("*").length}),n.getElementsByClassName=ut(function(e){return e.innerHTML="
    ",e.firstChild.className="i",2===e.getElementsByClassName("i").length}),n.getById=ut(function(e){return f.appendChild(e).id=v,!t.getElementsByName||!t.getElementsByName(v).length}),n.getById?(i.find.ID=function(e,t){if(typeof t.getElementById!==j&&h){var n=t.getElementById(e);return n&&n.parentNode?[n]:[]}},i.filter.ID=function(e){var t=e.replace(nt,rt);return function(e){return e.getAttribute("id")===t}}):(delete i.find.ID,i.filter.ID=function(e){var t=e.replace(nt,rt);return function(e){var n=typeof e.getAttributeNode!==j&&e.getAttributeNode("id");return n&&n.value===t}}),i.find.TAG=n.getElementsByTagName?function(e,t){return typeof t.getElementsByTagName!==j?t.getElementsByTagName(e):undefined}: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.CLASS=n.getElementsByClassName&&function(e,t){return typeof t.getElementsByClassName!==j&&h?t.getElementsByClassName(e):undefined},g=[],d=[],(n.qsa=Q.test(t.querySelectorAll))&&(ut(function(e){e.innerHTML="",e.querySelectorAll("[selected]").length||d.push("\\["+M+"*(?:value|"+R+")"),e.querySelectorAll(":checked").length||d.push(":checked")}),ut(function(e){var n=t.createElement("input");n.setAttribute("type","hidden"),e.appendChild(n).setAttribute("t",""),e.querySelectorAll("[t^='']").length&&d.push("[*^$]="+M+"*(?:''|\"\")"),e.querySelectorAll(":enabled").length||d.push(":enabled",":disabled"),e.querySelectorAll("*,:x"),d.push(",.*:")})),(n.matchesSelector=Q.test(m=f.webkitMatchesSelector||f.mozMatchesSelector||f.oMatchesSelector||f.msMatchesSelector))&&ut(function(e){n.disconnectedMatch=m.call(e,"div"),m.call(e,"[s!='']:x"),g.push("!=",I)}),d=d.length&&RegExp(d.join("|")),g=g.length&&RegExp(g.join("|")),y=Q.test(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},S=f.compareDocumentPosition?function(e,r){if(e===r)return E=!0,0;var i=r.compareDocumentPosition&&e.compareDocumentPosition&&e.compareDocumentPosition(r);return i?1&i||!n.sortDetached&&r.compareDocumentPosition(e)===i?e===t||y(b,e)?-1:r===t||y(b,r)?1:l?P.call(l,e)-P.call(l,r):0:4&i?-1:1:e.compareDocumentPosition?-1:1}:function(e,n){var r,i=0,o=e.parentNode,s=n.parentNode,a=[e],u=[n];if(e===n)return E=!0,0;if(!o||!s)return e===t?-1:n===t?1:o?-1:s?1:l?P.call(l,e)-P.call(l,n):0;if(o===s)return ct(e,n);r=e;while(r=r.parentNode)a.unshift(r);r=n;while(r=r.parentNode)u.unshift(r);while(a[i]===u[i])i++;return i?ct(a[i],u[i]):a[i]===b?-1:u[i]===b?1:0},t):p},ot.matches=function(e,t){return ot(e,null,null,t)},ot.matchesSelector=function(e,t){if((e.ownerDocument||e)!==p&&c(e),t=t.replace(Y,"='$1']"),!(!n.matchesSelector||!h||g&&g.test(t)||d&&d.test(t)))try{var r=m.call(e,t);if(r||n.disconnectedMatch||e.document&&11!==e.document.nodeType)return r}catch(i){}return ot(t,p,null,[e]).length>0},ot.contains=function(e,t){return(e.ownerDocument||e)!==p&&c(e),y(e,t)},ot.attr=function(e,t){(e.ownerDocument||e)!==p&&c(e);var r=i.attrHandle[t.toLowerCase()],o=r&&A.call(i.attrHandle,t.toLowerCase())?r(e,t,!h):undefined;return o===undefined?n.attributes||!h?e.getAttribute(t):(o=e.getAttributeNode(t))&&o.specified?o.value:null:o},ot.error=function(e){throw Error("Syntax error, unrecognized expression: "+e)},ot.uniqueSort=function(e){var t,r=[],i=0,o=0;if(E=!n.detectDuplicates,l=!n.sortStable&&e.slice(0),e.sort(S),E){while(t=e[o++])t===e[o]&&(i=r.push(o));while(i--)e.splice(r[i],1)}return e},o=ot.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=ot.selectors={cacheLength:50,createPseudo:at,match:J,attrHandle:{},find:{},relative:{">":{dir:"parentNode",first:!0}," ":{dir:"parentNode"},"+":{dir:"previousSibling",first:!0},"~":{dir:"previousSibling"}},preFilter:{ATTR:function(e){return e[1]=e[1].replace(nt,rt),e[3]=(e[4]||e[5]||"").replace(nt,rt),"~="===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]||ot.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]&&ot.error(e[0]),e},PSEUDO:function(e){var t,n=!e[5]&&e[2];return J.CHILD.test(e[0])?null:(e[3]&&e[4]!==undefined?e[2]=e[4]:n&&V.test(n)&&(t=gt(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){var t=e.replace(nt,rt).toLowerCase();return"*"===e?function(){return!0}:function(e){return e.nodeName&&e.nodeName.toLowerCase()===t}},CLASS:function(e){var t=C[e+" "];return t||(t=RegExp("(^|"+M+")"+e+"("+M+"|$)"))&&C(e,function(e){return t.test("string"==typeof e.className&&e.className||typeof e.getAttribute!==j&&e.getAttribute("class")||"")})},ATTR:function(e,t,n){return function(r){var i=ot.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),s="last"!==e.slice(-4),a="of-type"===t;return 1===r&&0===i?function(e){return!!e.parentNode}:function(t,n,u){var l,c,p,f,h,d,g=o!==s?"nextSibling":"previousSibling",m=t.parentNode,y=a&&t.nodeName.toLowerCase(),x=!u&&!a;if(m){if(o){while(g){p=t;while(p=p[g])if(a?p.nodeName.toLowerCase()===y:1===p.nodeType)return!1;d=g="only"===e&&!d&&"nextSibling"}return!0}if(d=[s?m.firstChild:m.lastChild],s&&x){c=m[v]||(m[v]={}),l=c[e]||[],h=l[0]===w&&l[1],f=l[0]===w&&l[2],p=h&&m.childNodes[h];while(p=++h&&p&&p[g]||(f=h=0)||d.pop())if(1===p.nodeType&&++f&&p===t){c[e]=[w,h,f];break}}else if(x&&(l=(t[v]||(t[v]={}))[e])&&l[0]===w)f=l[1];else while(p=++h&&p&&p[g]||(f=h=0)||d.pop())if((a?p.nodeName.toLowerCase()===y:1===p.nodeType)&&++f&&(x&&((p[v]||(p[v]={}))[e]=[w,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()]||ot.error("unsupported pseudo: "+e);return r[v]?r(t):r.length>1?(n=[e,e,"",t],i.setFilters.hasOwnProperty(e.toLowerCase())?at(function(e,n){var i,o=r(e,t),s=o.length;while(s--)i=P.call(e,o[s]),e[i]=!(n[i]=o[s])}):function(e){return r(e,0,n)}):r}},pseudos:{not:at(function(e){var t=[],n=[],r=a(e.replace(z,"$1"));return r[v]?at(function(e,t,n,i){var o,s=r(e,null,i,[]),a=e.length;while(a--)(o=s[a])&&(e[a]=!(t[a]=o))}):function(e,i,o){return t[0]=e,r(t,null,o,n),!n.pop()}}),has:at(function(e){return function(t){return ot(e,t).length>0}}),contains:at(function(e){return function(t){return(t.textContent||t.innerText||o(t)).indexOf(e)>-1}}),lang:at(function(e){return G.test(e||"")||ot.error("unsupported lang: "+e),e=e.replace(nt,rt).toLowerCase(),function(t){var n;do if(n=h?t.lang:t.getAttribute("xml:lang")||t.getAttribute("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 et.test(e.nodeName)},input:function(e){return Z.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:ht(function(){return[0]}),last:ht(function(e,t){return[t-1]}),eq:ht(function(e,t,n){return[0>n?n+t:n]}),even:ht(function(e,t){var n=0;for(;t>n;n+=2)e.push(n);return e}),odd:ht(function(e,t){var n=1;for(;t>n;n+=2)e.push(n);return e}),lt:ht(function(e,t,n){var r=0>n?n+t:n;for(;--r>=0;)e.push(r);return e}),gt:ht(function(e,t,n){var r=0>n?n+t:n;for(;t>++r;)e.push(r);return e})}},i.pseudos.nth=i.pseudos.eq;for(t in{radio:!0,checkbox:!0,file:!0,password:!0,image:!0})i.pseudos[t]=pt(t);for(t in{submit:!0,reset:!0})i.pseudos[t]=ft(t);function dt(){}dt.prototype=i.filters=i.pseudos,i.setFilters=new dt;function gt(e,t){var n,r,o,s,a,u,l,c=k[e+" "];if(c)return t?0:c.slice(0);a=e,u=[],l=i.preFilter;while(a){(!n||(r=_.exec(a)))&&(r&&(a=a.slice(r[0].length)||a),u.push(o=[])),n=!1,(r=X.exec(a))&&(n=r.shift(),o.push({value:n,type:r[0].replace(z," ")}),a=a.slice(n.length));for(s in i.filter)!(r=J[s].exec(a))||l[s]&&!(r=l[s](r))||(n=r.shift(),o.push({value:n,type:s,matches:r}),a=a.slice(n.length));if(!n)break}return t?a.length:a?ot.error(e):k(e,u).slice(0)}function mt(e){var t=0,n=e.length,r="";for(;n>t;t++)r+=e[t].value;return r}function yt(e,t,n){var i=t.dir,o=n&&"parentNode"===i,s=T++;return t.first?function(t,n,r){while(t=t[i])if(1===t.nodeType||o)return e(t,n,r)}:function(t,n,a){var u,l,c,p=w+" "+s;if(a){while(t=t[i])if((1===t.nodeType||o)&&e(t,n,a))return!0}else while(t=t[i])if(1===t.nodeType||o)if(c=t[v]||(t[v]={}),(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,a)||r,l[1]===!0)return!0}}function vt(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 xt(e,t,n,r,i){var o,s=[],a=0,u=e.length,l=null!=t;for(;u>a;a++)(o=e[a])&&(!n||n(o,r,i))&&(s.push(o),l&&t.push(a));return s}function bt(e,t,n,r,i,o){return r&&!r[v]&&(r=bt(r)),i&&!i[v]&&(i=bt(i,o)),at(function(o,s,a,u){var l,c,p,f=[],h=[],d=s.length,g=o||Ct(t||"*",a.nodeType?[a]:a,[]),m=!e||!o&&t?g:xt(g,f,e,a,u),y=n?i||(o?e:d||r)?[]:s:m;if(n&&n(m,y,a,u),r){l=xt(y,h),r(l,[],a,u),c=l.length;while(c--)(p=l[c])&&(y[h[c]]=!(m[h[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?P.call(o,p):f[c])>-1&&(o[l]=!(s[l]=p))}}else y=xt(y===s?y.splice(d,y.length):y),i?i(null,s,y,u):O.apply(s,y)})}function wt(e){var t,n,r,o=e.length,s=i.relative[e[0].type],a=s||i.relative[" "],l=s?1:0,c=yt(function(e){return e===t},a,!0),p=yt(function(e){return P.call(t,e)>-1},a,!0),f=[function(e,n,r){return!s&&(r||n!==u)||((t=n).nodeType?c(e,n,r):p(e,n,r))}];for(;o>l;l++)if(n=i.relative[e[l].type])f=[yt(vt(f),n)];else{if(n=i.filter[e[l].type].apply(null,e[l].matches),n[v]){for(r=++l;o>r;r++)if(i.relative[e[r].type])break;return bt(l>1&&vt(f),l>1&&mt(e.slice(0,l-1).concat({value:" "===e[l-2].type?"*":""})).replace(z,"$1"),n,r>l&&wt(e.slice(l,r)),o>r&&wt(e=e.slice(r)),o>r&&mt(e))}f.push(n)}return vt(f)}function Tt(e,t){var n=0,o=t.length>0,s=e.length>0,a=function(a,l,c,f,h){var d,g,m,y=[],v=0,x="0",b=a&&[],T=null!=h,C=u,k=a||s&&i.find.TAG("*",h&&l.parentNode||l),N=w+=null==C?1:Math.random()||.1;for(T&&(u=l!==p&&l,r=n);null!=(d=k[x]);x++){if(s&&d){g=0;while(m=e[g++])if(m(d,l,c)){f.push(d);break}T&&(w=N,r=++n)}o&&((d=!m&&d)&&v--,a&&b.push(d))}if(v+=x,o&&x!==v){g=0;while(m=t[g++])m(b,y,l,c);if(a){if(v>0)while(x--)b[x]||y[x]||(y[x]=q.call(f));y=xt(y)}O.apply(f,y),T&&!a&&y.length>0&&v+t.length>1&&ot.uniqueSort(f)}return T&&(w=N,u=C),b};return o?at(a):a}a=ot.compile=function(e,t){var n,r=[],i=[],o=N[e+" "];if(!o){t||(t=gt(e)),n=t.length;while(n--)o=wt(t[n]),o[v]?r.push(o):i.push(o);o=N(e,Tt(i,r))}return o};function Ct(e,t,n){var r=0,i=t.length;for(;i>r;r++)ot(e,t[r],n);return n}function kt(e,t,r,o){var s,u,l,c,p,f=gt(e);if(!o&&1===f.length){if(u=f[0]=f[0].slice(0),u.length>2&&"ID"===(l=u[0]).type&&n.getById&&9===t.nodeType&&h&&i.relative[u[1].type]){if(t=(i.find.ID(l.matches[0].replace(nt,rt),t)||[])[0],!t)return r;e=e.slice(u.shift().value.length)}s=J.needsContext.test(e)?0:u.length;while(s--){if(l=u[s],i.relative[c=l.type])break;if((p=i.find[c])&&(o=p(l.matches[0].replace(nt,rt),U.test(u[0].type)&&t.parentNode||t))){if(u.splice(s,1),e=o.length&&mt(u),!e)return O.apply(r,o),r;break}}}return a(e,f)(o,t,!h,r,U.test(e)),r}n.sortStable=v.split("").sort(S).join("")===v,n.detectDuplicates=E,c(),n.sortDetached=ut(function(e){return 1&e.compareDocumentPosition(p.createElement("div"))}),ut(function(e){return e.innerHTML="","#"===e.firstChild.getAttribute("href")})||lt("type|href|height|width",function(e,t,n){return n?undefined:e.getAttribute(t,"type"===t.toLowerCase()?1:2)}),n.attributes&&ut(function(e){return e.innerHTML="",e.firstChild.setAttribute("value",""),""===e.firstChild.getAttribute("value")})||lt("value",function(e,t,n){return n||"input"!==e.nodeName.toLowerCase()?undefined:e.defaultValue}),ut(function(e){return null==e.getAttribute("disabled")})||lt(R,function(e,t,n){var r;return n?undefined:(r=e.getAttributeNode(t))&&r.specified?r.value:e[t]===!0?t.toLowerCase():null}),x.find=ot,x.expr=ot.selectors,x.expr[":"]=x.expr.pseudos,x.unique=ot.uniqueSort,x.text=ot.getText,x.isXMLDoc=ot.isXML,x.contains=ot.contains}(e);var D={};function A(e){var t=D[e]={};return x.each(e.match(w)||[],function(e,n){t[n]=!0}),t}x.Callbacks=function(e){e="string"==typeof e?D[e]||A(e):x.extend({},e);var t,n,r,i,o,s,a=[],u=!e.once&&[],l=function(p){for(t=e.memory&&p,n=!0,s=i||0,i=0,o=a.length,r=!0;a&&o>s;s++)if(a[s].apply(p[0],p[1])===!1&&e.stopOnFalse){t=!1;break}r=!1,a&&(u?u.length&&l(u.shift()):t?a=[]:c.disable())},c={add:function(){if(a){var n=a.length;(function s(t){x.each(t,function(t,n){var r=x.type(n);"function"===r?e.unique&&c.has(n)||a.push(n):n&&n.length&&"string"!==r&&s(n)})})(arguments),r?o=a.length:t&&(i=n,l(t))}return this},remove:function(){return a&&x.each(arguments,function(e,t){var n;while((n=x.inArray(t,a,n))>-1)a.splice(n,1),r&&(o>=n&&o--,s>=n&&s--)}),this},has:function(e){return e?x.inArray(e,a)>-1:!(!a||!a.length)},empty:function(){return a=[],o=0,this},disable:function(){return a=u=t=undefined,this},disabled:function(){return!a},lock:function(){return u=undefined,t||c.disable(),this},locked:function(){return!u},fireWith:function(e,t){return!a||n&&!u||(t=t||[],t=[e,t.slice?t.slice():t],r?u.push(t):l(t)),this},fire:function(){return c.fireWith(this,arguments),this},fired:function(){return!!n}};return c},x.extend({Deferred:function(e){var t=[["resolve","done",x.Callbacks("once memory"),"resolved"],["reject","fail",x.Callbacks("once memory"),"rejected"],["notify","progress",x.Callbacks("memory")]],n="pending",r={state:function(){return n},always:function(){return i.done(arguments).fail(arguments),this},then:function(){var e=arguments;return x.Deferred(function(n){x.each(t,function(t,o){var s=o[0],a=x.isFunction(e[t])&&e[t];i[o[1]](function(){var e=a&&a.apply(this,arguments);e&&x.isFunction(e.promise)?e.promise().done(n.resolve).fail(n.reject).progress(n.notify):n[s+"With"](this===r?n.promise():this,a?[e]:arguments)})}),e=null}).promise()},promise:function(e){return null!=e?x.extend(e,r):r}},i={};return r.pipe=r.then,x.each(t,function(e,o){var s=o[2],a=o[3];r[o[1]]=s.add,a&&s.add(function(){n=a},t[1^e][2].disable,t[2][2].lock),i[o[0]]=function(){return i[o[0]+"With"](this===i?r:this,arguments),this},i[o[0]+"With"]=s.fireWith}),r.promise(i),e&&e.call(i,i),i},when:function(e){var t=0,n=d.call(arguments),r=n.length,i=1!==r||e&&x.isFunction(e.promise)?r:0,o=1===i?e:x.Deferred(),s=function(e,t,n){return function(r){t[e]=this,n[e]=arguments.length>1?d.call(arguments):r,n===a?o.notifyWith(t,n):--i||o.resolveWith(t,n)}},a,u,l;if(r>1)for(a=Array(r),u=Array(r),l=Array(r);r>t;t++)n[t]&&x.isFunction(n[t].promise)?n[t].promise().done(s(t,l,n)).fail(o.reject).progress(s(t,u,a)):--i;return i||o.resolveWith(l,n),o.promise()}}),x.support=function(t){var n=o.createElement("input"),r=o.createDocumentFragment(),i=o.createElement("div"),s=o.createElement("select"),a=s.appendChild(o.createElement("option"));return n.type?(n.type="checkbox",t.checkOn=""!==n.value,t.optSelected=a.selected,t.reliableMarginRight=!0,t.boxSizingReliable=!0,t.pixelPosition=!1,n.checked=!0,t.noCloneChecked=n.cloneNode(!0).checked,s.disabled=!0,t.optDisabled=!a.disabled,n=o.createElement("input"),n.value="t",n.type="radio",t.radioValue="t"===n.value,n.setAttribute("checked","t"),n.setAttribute("name","t"),r.appendChild(n),t.checkClone=r.cloneNode(!0).cloneNode(!0).lastChild.checked,t.focusinBubbles="onfocusin"in e,i.style.backgroundClip="content-box",i.cloneNode(!0).style.backgroundClip="",t.clearCloneStyle="content-box"===i.style.backgroundClip,x(function(){var n,r,s="padding:0;margin:0;border:0;display:block;-webkit-box-sizing:content-box;-moz-box-sizing:content-box;box-sizing:content-box",a=o.getElementsByTagName("body")[0];a&&(n=o.createElement("div"),n.style.cssText="border:0;width:0;height:0;position:absolute;top:0;left:-9999px;margin-top:1px",a.appendChild(n).appendChild(i),i.innerHTML="",i.style.cssText="-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;padding:1px;border:1px;display:block;width:4px;margin-top:1%;position:absolute;top:1%",x.swap(a,null!=a.style.zoom?{zoom:1}:{},function(){t.boxSizing=4===i.offsetWidth}),e.getComputedStyle&&(t.pixelPosition="1%"!==(e.getComputedStyle(i,null)||{}).top,t.boxSizingReliable="4px"===(e.getComputedStyle(i,null)||{width:"4px"}).width,r=i.appendChild(o.createElement("div")),r.style.cssText=i.style.cssText=s,r.style.marginRight=r.style.width="0",i.style.width="1px",t.reliableMarginRight=!parseFloat((e.getComputedStyle(r,null)||{}).marginRight)),a.removeChild(n))}),t):t}({});var L,q,H=/(?:\{[\s\S]*\}|\[[\s\S]*\])$/,O=/([A-Z])/g;function F(){Object.defineProperty(this.cache={},0,{get:function(){return{}}}),this.expando=x.expando+Math.random()}F.uid=1,F.accepts=function(e){return e.nodeType?1===e.nodeType||9===e.nodeType:!0},F.prototype={key:function(e){if(!F.accepts(e))return 0;var t={},n=e[this.expando];if(!n){n=F.uid++;try{t[this.expando]={value:n},Object.defineProperties(e,t)}catch(r){t[this.expando]=n,x.extend(e,t)}}return this.cache[n]||(this.cache[n]={}),n},set:function(e,t,n){var r,i=this.key(e),o=this.cache[i];if("string"==typeof t)o[t]=n;else if(x.isEmptyObject(o))x.extend(this.cache[i],t);else for(r in t)o[r]=t[r];return o},get:function(e,t){var n=this.cache[this.key(e)];return t===undefined?n:n[t]},access:function(e,t,n){var r;return t===undefined||t&&"string"==typeof t&&n===undefined?(r=this.get(e,t),r!==undefined?r:this.get(e,x.camelCase(t))):(this.set(e,t,n),n!==undefined?n:t)},remove:function(e,t){var n,r,i,o=this.key(e),s=this.cache[o];if(t===undefined)this.cache[o]={};else{x.isArray(t)?r=t.concat(t.map(x.camelCase)):(i=x.camelCase(t),t in s?r=[t,i]:(r=i,r=r in s?[r]:r.match(w)||[])),n=r.length;while(n--)delete s[r[n]]}},hasData:function(e){return!x.isEmptyObject(this.cache[e[this.expando]]||{})},discard:function(e){e[this.expando]&&delete this.cache[e[this.expando]]}},L=new F,q=new F,x.extend({acceptData:F.accepts,hasData:function(e){return L.hasData(e)||q.hasData(e)},data:function(e,t,n){return L.access(e,t,n)},removeData:function(e,t){L.remove(e,t)},_data:function(e,t,n){return q.access(e,t,n)},_removeData:function(e,t){q.remove(e,t)}}),x.fn.extend({data:function(e,t){var n,r,i=this[0],o=0,s=null;if(e===undefined){if(this.length&&(s=L.get(i),1===i.nodeType&&!q.get(i,"hasDataAttrs"))){for(n=i.attributes;n.length>o;o++)r=n[o].name,0===r.indexOf("data-")&&(r=x.camelCase(r.slice(5)),P(i,r,s[r]));q.set(i,"hasDataAttrs",!0)}return s}return"object"==typeof e?this.each(function(){L.set(this,e)}):x.access(this,function(t){var n,r=x.camelCase(e);if(i&&t===undefined){if(n=L.get(i,e),n!==undefined)return n;if(n=L.get(i,r),n!==undefined)return n;if(n=P(i,r,undefined),n!==undefined)return n}else this.each(function(){var n=L.get(this,r);L.set(this,r,t),-1!==e.indexOf("-")&&n!==undefined&&L.set(this,e,t)})},null,t,arguments.length>1,null,!0)},removeData:function(e){return this.each(function(){L.remove(this,e)})}});function P(e,t,n){var r;if(n===undefined&&1===e.nodeType)if(r="data-"+t.replace(O,"-$1").toLowerCase(),n=e.getAttribute(r),"string"==typeof n){try{n="true"===n?!0:"false"===n?!1:"null"===n?null:+n+""===n?+n:H.test(n)?JSON.parse(n):n}catch(i){}L.set(e,t,n)}else n=undefined;return n}x.extend({queue:function(e,t,n){var r;return e?(t=(t||"fx")+"queue",r=q.get(e,t),n&&(!r||x.isArray(n)?r=q.access(e,t,x.makeArray(n)):r.push(n)),r||[]):undefined},dequeue:function(e,t){t=t||"fx";var n=x.queue(e,t),r=n.length,i=n.shift(),o=x._queueHooks(e,t),s=function(){x.dequeue(e,t) -};"inprogress"===i&&(i=n.shift(),r--),i&&("fx"===t&&n.unshift("inprogress"),delete o.stop,i.call(e,s,o)),!r&&o&&o.empty.fire()},_queueHooks:function(e,t){var n=t+"queueHooks";return q.get(e,n)||q.access(e,n,{empty:x.Callbacks("once memory").add(function(){q.remove(e,[t+"queue",n])})})}}),x.fn.extend({queue:function(e,t){var n=2;return"string"!=typeof e&&(t=e,e="fx",n--),n>arguments.length?x.queue(this[0],e):t===undefined?this:this.each(function(){var n=x.queue(this,e,t);x._queueHooks(this,e),"fx"===e&&"inprogress"!==n[0]&&x.dequeue(this,e)})},dequeue:function(e){return this.each(function(){x.dequeue(this,e)})},delay:function(e,t){return e=x.fx?x.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,t){var n,r=1,i=x.Deferred(),o=this,s=this.length,a=function(){--r||i.resolveWith(o,[o])};"string"!=typeof e&&(t=e,e=undefined),e=e||"fx";while(s--)n=q.get(o[s],e+"queueHooks"),n&&n.empty&&(r++,n.empty.add(a));return a(),i.promise(t)}});var R,M,W=/[\t\r\n\f]/g,$=/\r/g,B=/^(?:input|select|textarea|button)$/i;x.fn.extend({attr:function(e,t){return x.access(this,x.attr,e,t,arguments.length>1)},removeAttr:function(e){return this.each(function(){x.removeAttr(this,e)})},prop:function(e,t){return x.access(this,x.prop,e,t,arguments.length>1)},removeProp:function(e){return this.each(function(){delete this[x.propFix[e]||e]})},addClass:function(e){var t,n,r,i,o,s=0,a=this.length,u="string"==typeof e&&e;if(x.isFunction(e))return this.each(function(t){x(this).addClass(e.call(this,t,this.className))});if(u)for(t=(e||"").match(w)||[];a>s;s++)if(n=this[s],r=1===n.nodeType&&(n.className?(" "+n.className+" ").replace(W," "):" ")){o=0;while(i=t[o++])0>r.indexOf(" "+i+" ")&&(r+=i+" ");n.className=x.trim(r)}return this},removeClass:function(e){var t,n,r,i,o,s=0,a=this.length,u=0===arguments.length||"string"==typeof e&&e;if(x.isFunction(e))return this.each(function(t){x(this).removeClass(e.call(this,t,this.className))});if(u)for(t=(e||"").match(w)||[];a>s;s++)if(n=this[s],r=1===n.nodeType&&(n.className?(" "+n.className+" ").replace(W," "):"")){o=0;while(i=t[o++])while(r.indexOf(" "+i+" ")>=0)r=r.replace(" "+i+" "," ");n.className=e?x.trim(r):""}return this},toggleClass:function(e,t){var n=typeof e;return"boolean"==typeof t&&"string"===n?t?this.addClass(e):this.removeClass(e):x.isFunction(e)?this.each(function(n){x(this).toggleClass(e.call(this,n,this.className,t),t)}):this.each(function(){if("string"===n){var t,i=0,o=x(this),s=e.match(w)||[];while(t=s[i++])o.hasClass(t)?o.removeClass(t):o.addClass(t)}else(n===r||"boolean"===n)&&(this.className&&q.set(this,"__className__",this.className),this.className=this.className||e===!1?"":q.get(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(W," ").indexOf(t)>=0)return!0;return!1},val:function(e){var t,n,r,i=this[0];{if(arguments.length)return r=x.isFunction(e),this.each(function(n){var i;1===this.nodeType&&(i=r?e.call(this,n,x(this).val()):e,null==i?i="":"number"==typeof i?i+="":x.isArray(i)&&(i=x.map(i,function(e){return null==e?"":e+""})),t=x.valHooks[this.type]||x.valHooks[this.nodeName.toLowerCase()],t&&"set"in t&&t.set(this,i,"value")!==undefined||(this.value=i))});if(i)return t=x.valHooks[i.type]||x.valHooks[i.nodeName.toLowerCase()],t&&"get"in t&&(n=t.get(i,"value"))!==undefined?n:(n=i.value,"string"==typeof n?n.replace($,""):null==n?"":n)}}}),x.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,s=o?null:[],a=o?i+1:r.length,u=0>i?a:o?i:0;for(;a>u;u++)if(n=r[u],!(!n.selected&&u!==i||(x.support.optDisabled?n.disabled:null!==n.getAttribute("disabled"))||n.parentNode.disabled&&x.nodeName(n.parentNode,"optgroup"))){if(t=x(n).val(),o)return t;s.push(t)}return s},set:function(e,t){var n,r,i=e.options,o=x.makeArray(t),s=i.length;while(s--)r=i[s],(r.selected=x.inArray(x(r).val(),o)>=0)&&(n=!0);return n||(e.selectedIndex=-1),o}}},attr:function(e,t,n){var i,o,s=e.nodeType;if(e&&3!==s&&8!==s&&2!==s)return typeof e.getAttribute===r?x.prop(e,t,n):(1===s&&x.isXMLDoc(e)||(t=t.toLowerCase(),i=x.attrHooks[t]||(x.expr.match.bool.test(t)?M:R)),n===undefined?i&&"get"in i&&null!==(o=i.get(e,t))?o:(o=x.find.attr(e,t),null==o?undefined:o):null!==n?i&&"set"in i&&(o=i.set(e,n,t))!==undefined?o:(e.setAttribute(t,n+""),n):(x.removeAttr(e,t),undefined))},removeAttr:function(e,t){var n,r,i=0,o=t&&t.match(w);if(o&&1===e.nodeType)while(n=o[i++])r=x.propFix[n]||n,x.expr.match.bool.test(n)&&(e[r]=!1),e.removeAttribute(n)},attrHooks:{type:{set:function(e,t){if(!x.support.radioValue&&"radio"===t&&x.nodeName(e,"input")){var n=e.value;return e.setAttribute("type",t),n&&(e.value=n),t}}}},propFix:{"for":"htmlFor","class":"className"},prop:function(e,t,n){var r,i,o,s=e.nodeType;if(e&&3!==s&&8!==s&&2!==s)return o=1!==s||!x.isXMLDoc(e),o&&(t=x.propFix[t]||t,i=x.propHooks[t]),n!==undefined?i&&"set"in i&&(r=i.set(e,n,t))!==undefined?r:e[t]=n:i&&"get"in i&&null!==(r=i.get(e,t))?r:e[t]},propHooks:{tabIndex:{get:function(e){return e.hasAttribute("tabindex")||B.test(e.nodeName)||e.href?e.tabIndex:-1}}}}),M={set:function(e,t,n){return t===!1?x.removeAttr(e,n):e.setAttribute(n,n),n}},x.each(x.expr.match.bool.source.match(/\w+/g),function(e,t){var n=x.expr.attrHandle[t]||x.find.attr;x.expr.attrHandle[t]=function(e,t,r){var i=x.expr.attrHandle[t],o=r?undefined:(x.expr.attrHandle[t]=undefined)!=n(e,t,r)?t.toLowerCase():null;return x.expr.attrHandle[t]=i,o}}),x.support.optSelected||(x.propHooks.selected={get:function(e){var t=e.parentNode;return t&&t.parentNode&&t.parentNode.selectedIndex,null}}),x.each(["tabIndex","readOnly","maxLength","cellSpacing","cellPadding","rowSpan","colSpan","useMap","frameBorder","contentEditable"],function(){x.propFix[this.toLowerCase()]=this}),x.each(["radio","checkbox"],function(){x.valHooks[this]={set:function(e,t){return x.isArray(t)?e.checked=x.inArray(x(e).val(),t)>=0:undefined}},x.support.checkOn||(x.valHooks[this].get=function(e){return null===e.getAttribute("value")?"on":e.value})});var I=/^key/,z=/^(?:mouse|contextmenu)|click/,_=/^(?:focusinfocus|focusoutblur)$/,X=/^([^.]*)(?:\.(.+)|)$/;function U(){return!0}function Y(){return!1}function V(){try{return o.activeElement}catch(e){}}x.event={global:{},add:function(e,t,n,i,o){var s,a,u,l,c,p,f,h,d,g,m,y=q.get(e);if(y){n.handler&&(s=n,n=s.handler,o=s.selector),n.guid||(n.guid=x.guid++),(l=y.events)||(l=y.events={}),(a=y.handle)||(a=y.handle=function(e){return typeof x===r||e&&x.event.triggered===e.type?undefined:x.event.dispatch.apply(a.elem,arguments)},a.elem=e),t=(t||"").match(w)||[""],c=t.length;while(c--)u=X.exec(t[c])||[],d=m=u[1],g=(u[2]||"").split(".").sort(),d&&(f=x.event.special[d]||{},d=(o?f.delegateType:f.bindType)||d,f=x.event.special[d]||{},p=x.extend({type:d,origType:m,data:i,handler:n,guid:n.guid,selector:o,needsContext:o&&x.expr.match.needsContext.test(o),namespace:g.join(".")},s),(h=l[d])||(h=l[d]=[],h.delegateCount=0,f.setup&&f.setup.call(e,i,g,a)!==!1||e.addEventListener&&e.addEventListener(d,a,!1)),f.add&&(f.add.call(e,p),p.handler.guid||(p.handler.guid=n.guid)),o?h.splice(h.delegateCount++,0,p):h.push(p),x.event.global[d]=!0);e=null}},remove:function(e,t,n,r,i){var o,s,a,u,l,c,p,f,h,d,g,m=q.hasData(e)&&q.get(e);if(m&&(u=m.events)){t=(t||"").match(w)||[""],l=t.length;while(l--)if(a=X.exec(t[l])||[],h=g=a[1],d=(a[2]||"").split(".").sort(),h){p=x.event.special[h]||{},h=(r?p.delegateType:p.bindType)||h,f=u[h]||[],a=a[2]&&RegExp("(^|\\.)"+d.join("\\.(?:.*\\.|)")+"(\\.|$)"),s=o=f.length;while(o--)c=f[o],!i&&g!==c.origType||n&&n.guid!==c.guid||a&&!a.test(c.namespace)||r&&r!==c.selector&&("**"!==r||!c.selector)||(f.splice(o,1),c.selector&&f.delegateCount--,p.remove&&p.remove.call(e,c));s&&!f.length&&(p.teardown&&p.teardown.call(e,d,m.handle)!==!1||x.removeEvent(e,h,m.handle),delete u[h])}else for(h in u)x.event.remove(e,h+t[l],n,r,!0);x.isEmptyObject(u)&&(delete m.handle,q.remove(e,"events"))}},trigger:function(t,n,r,i){var s,a,u,l,c,p,f,h=[r||o],d=y.call(t,"type")?t.type:t,g=y.call(t,"namespace")?t.namespace.split("."):[];if(a=u=r=r||o,3!==r.nodeType&&8!==r.nodeType&&!_.test(d+x.event.triggered)&&(d.indexOf(".")>=0&&(g=d.split("."),d=g.shift(),g.sort()),c=0>d.indexOf(":")&&"on"+d,t=t[x.expando]?t:new x.Event(d,"object"==typeof t&&t),t.isTrigger=i?2:3,t.namespace=g.join("."),t.namespace_re=t.namespace?RegExp("(^|\\.)"+g.join("\\.(?:.*\\.|)")+"(\\.|$)"):null,t.result=undefined,t.target||(t.target=r),n=null==n?[t]:x.makeArray(n,[t]),f=x.event.special[d]||{},i||!f.trigger||f.trigger.apply(r,n)!==!1)){if(!i&&!f.noBubble&&!x.isWindow(r)){for(l=f.delegateType||d,_.test(l+d)||(a=a.parentNode);a;a=a.parentNode)h.push(a),u=a;u===(r.ownerDocument||o)&&h.push(u.defaultView||u.parentWindow||e)}s=0;while((a=h[s++])&&!t.isPropagationStopped())t.type=s>1?l:f.bindType||d,p=(q.get(a,"events")||{})[t.type]&&q.get(a,"handle"),p&&p.apply(a,n),p=c&&a[c],p&&x.acceptData(a)&&p.apply&&p.apply(a,n)===!1&&t.preventDefault();return t.type=d,i||t.isDefaultPrevented()||f._default&&f._default.apply(h.pop(),n)!==!1||!x.acceptData(r)||c&&x.isFunction(r[d])&&!x.isWindow(r)&&(u=r[c],u&&(r[c]=null),x.event.triggered=d,r[d](),x.event.triggered=undefined,u&&(r[c]=u)),t.result}},dispatch:function(e){e=x.event.fix(e);var t,n,r,i,o,s=[],a=d.call(arguments),u=(q.get(this,"events")||{})[e.type]||[],l=x.event.special[e.type]||{};if(a[0]=e,e.delegateTarget=this,!l.preDispatch||l.preDispatch.call(this,e)!==!1){s=x.event.handlers.call(this,e,u),t=0;while((i=s[t++])&&!e.isPropagationStopped()){e.currentTarget=i.elem,n=0;while((o=i.handlers[n++])&&!e.isImmediatePropagationStopped())(!e.namespace_re||e.namespace_re.test(o.namespace))&&(e.handleObj=o,e.data=o.data,r=((x.event.special[o.origType]||{}).handle||o.handler).apply(i.elem,a),r!==undefined&&(e.result=r)===!1&&(e.preventDefault(),e.stopPropagation()))}return l.postDispatch&&l.postDispatch.call(this,e),e.result}},handlers:function(e,t){var n,r,i,o,s=[],a=t.delegateCount,u=e.target;if(a&&u.nodeType&&(!e.button||"click"!==e.type))for(;u!==this;u=u.parentNode||this)if(u.disabled!==!0||"click"!==e.type){for(r=[],n=0;a>n;n++)o=t[n],i=o.selector+" ",r[i]===undefined&&(r[i]=o.needsContext?x(i,this).index(u)>=0:x.find(i,this,null,[u]).length),r[i]&&r.push(o);r.length&&s.push({elem:u,handlers:r})}return t.length>a&&s.push({elem:this,handlers:t.slice(a)}),s},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 offsetX offsetY pageX pageY screenX screenY toElement".split(" "),filter:function(e,t){var n,r,i,s=t.button;return null==e.pageX&&null!=t.clientX&&(n=e.target.ownerDocument||o,r=n.documentElement,i=n.body,e.pageX=t.clientX+(r&&r.scrollLeft||i&&i.scrollLeft||0)-(r&&r.clientLeft||i&&i.clientLeft||0),e.pageY=t.clientY+(r&&r.scrollTop||i&&i.scrollTop||0)-(r&&r.clientTop||i&&i.clientTop||0)),e.which||s===undefined||(e.which=1&s?1:2&s?3:4&s?2:0),e}},fix:function(e){if(e[x.expando])return e;var t,n,r,i=e.type,s=e,a=this.fixHooks[i];a||(this.fixHooks[i]=a=z.test(i)?this.mouseHooks:I.test(i)?this.keyHooks:{}),r=a.props?this.props.concat(a.props):this.props,e=new x.Event(s),t=r.length;while(t--)n=r[t],e[n]=s[n];return e.target||(e.target=o),3===e.target.nodeType&&(e.target=e.target.parentNode),a.filter?a.filter(e,s):e},special:{load:{noBubble:!0},focus:{trigger:function(){return this!==V()&&this.focus?(this.focus(),!1):undefined},delegateType:"focusin"},blur:{trigger:function(){return this===V()&&this.blur?(this.blur(),!1):undefined},delegateType:"focusout"},click:{trigger:function(){return"checkbox"===this.type&&this.click&&x.nodeName(this,"input")?(this.click(),!1):undefined},_default:function(e){return x.nodeName(e.target,"a")}},beforeunload:{postDispatch:function(e){e.result!==undefined&&(e.originalEvent.returnValue=e.result)}}},simulate:function(e,t,n,r){var i=x.extend(new x.Event,n,{type:e,isSimulated:!0,originalEvent:{}});r?x.event.trigger(i,null,t):x.event.dispatch.call(t,i),i.isDefaultPrevented()&&n.preventDefault()}},x.removeEvent=function(e,t,n){e.removeEventListener&&e.removeEventListener(t,n,!1)},x.Event=function(e,t){return this instanceof x.Event?(e&&e.type?(this.originalEvent=e,this.type=e.type,this.isDefaultPrevented=e.defaultPrevented||e.getPreventDefault&&e.getPreventDefault()?U:Y):this.type=e,t&&x.extend(this,t),this.timeStamp=e&&e.timeStamp||x.now(),this[x.expando]=!0,undefined):new x.Event(e,t)},x.Event.prototype={isDefaultPrevented:Y,isPropagationStopped:Y,isImmediatePropagationStopped:Y,preventDefault:function(){var e=this.originalEvent;this.isDefaultPrevented=U,e&&e.preventDefault&&e.preventDefault()},stopPropagation:function(){var e=this.originalEvent;this.isPropagationStopped=U,e&&e.stopPropagation&&e.stopPropagation()},stopImmediatePropagation:function(){this.isImmediatePropagationStopped=U,this.stopPropagation()}},x.each({mouseenter:"mouseover",mouseleave:"mouseout"},function(e,t){x.event.special[e]={delegateType:t,bindType:t,handle:function(e){var n,r=this,i=e.relatedTarget,o=e.handleObj;return(!i||i!==r&&!x.contains(r,i))&&(e.type=o.origType,n=o.handler.apply(this,arguments),e.type=t),n}}}),x.support.focusinBubbles||x.each({focus:"focusin",blur:"focusout"},function(e,t){var n=0,r=function(e){x.event.simulate(t,e.target,x.event.fix(e),!0)};x.event.special[t]={setup:function(){0===n++&&o.addEventListener(e,r,!0)},teardown:function(){0===--n&&o.removeEventListener(e,r,!0)}}}),x.fn.extend({on:function(e,t,n,r,i){var o,s;if("object"==typeof e){"string"!=typeof t&&(n=n||t,t=undefined);for(s in e)this.on(s,t,n,e[s],i);return this}if(null==n&&null==r?(r=t,n=t=undefined):null==r&&("string"==typeof t?(r=n,n=undefined):(r=n,n=t,t=undefined)),r===!1)r=Y;else if(!r)return this;return 1===i&&(o=r,r=function(e){return x().off(e),o.apply(this,arguments)},r.guid=o.guid||(o.guid=x.guid++)),this.each(function(){x.event.add(this,e,r,n,t)})},one:function(e,t,n,r){return this.on(e,t,n,r,1)},off:function(e,t,n){var r,i;if(e&&e.preventDefault&&e.handleObj)return r=e.handleObj,x(e.delegateTarget).off(r.namespace?r.origType+"."+r.namespace:r.origType,r.selector,r.handler),this;if("object"==typeof e){for(i in e)this.off(i,t,e[i]);return this}return(t===!1||"function"==typeof t)&&(n=t,t=undefined),n===!1&&(n=Y),this.each(function(){x.event.remove(this,e,n,t)})},trigger:function(e,t){return this.each(function(){x.event.trigger(e,t,this)})},triggerHandler:function(e,t){var n=this[0];return n?x.event.trigger(e,t,n,!0):undefined}});var G=/^.[^:#\[\.,]*$/,J=/^(?:parents|prev(?:Until|All))/,Q=x.expr.match.needsContext,K={children:!0,contents:!0,next:!0,prev:!0};x.fn.extend({find:function(e){var t,n=[],r=this,i=r.length;if("string"!=typeof e)return this.pushStack(x(e).filter(function(){for(t=0;i>t;t++)if(x.contains(r[t],this))return!0}));for(t=0;i>t;t++)x.find(e,r[t],n);return n=this.pushStack(i>1?x.unique(n):n),n.selector=this.selector?this.selector+" "+e:e,n},has:function(e){var t=x(e,this),n=t.length;return this.filter(function(){var e=0;for(;n>e;e++)if(x.contains(this,t[e]))return!0})},not:function(e){return this.pushStack(et(this,e||[],!0))},filter:function(e){return this.pushStack(et(this,e||[],!1))},is:function(e){return!!et(this,"string"==typeof e&&Q.test(e)?x(e):e||[],!1).length},closest:function(e,t){var n,r=0,i=this.length,o=[],s=Q.test(e)||"string"!=typeof e?x(e,t||this.context):0;for(;i>r;r++)for(n=this[r];n&&n!==t;n=n.parentNode)if(11>n.nodeType&&(s?s.index(n)>-1:1===n.nodeType&&x.find.matchesSelector(n,e))){n=o.push(n);break}return this.pushStack(o.length>1?x.unique(o):o)},index:function(e){return e?"string"==typeof e?g.call(x(e),this[0]):g.call(this,e.jquery?e[0]:e):this[0]&&this[0].parentNode?this.first().prevAll().length:-1},add:function(e,t){var n="string"==typeof e?x(e,t):x.makeArray(e&&e.nodeType?[e]:e),r=x.merge(this.get(),n);return this.pushStack(x.unique(r))},addBack:function(e){return this.add(null==e?this.prevObject:this.prevObject.filter(e))}});function Z(e,t){while((e=e[t])&&1!==e.nodeType);return e}x.each({parent:function(e){var t=e.parentNode;return t&&11!==t.nodeType?t:null},parents:function(e){return x.dir(e,"parentNode")},parentsUntil:function(e,t,n){return x.dir(e,"parentNode",n)},next:function(e){return Z(e,"nextSibling")},prev:function(e){return Z(e,"previousSibling")},nextAll:function(e){return x.dir(e,"nextSibling")},prevAll:function(e){return x.dir(e,"previousSibling")},nextUntil:function(e,t,n){return x.dir(e,"nextSibling",n)},prevUntil:function(e,t,n){return x.dir(e,"previousSibling",n)},siblings:function(e){return x.sibling((e.parentNode||{}).firstChild,e)},children:function(e){return x.sibling(e.firstChild)},contents:function(e){return e.contentDocument||x.merge([],e.childNodes)}},function(e,t){x.fn[e]=function(n,r){var i=x.map(this,t,n);return"Until"!==e.slice(-5)&&(r=n),r&&"string"==typeof r&&(i=x.filter(r,i)),this.length>1&&(K[e]||x.unique(i),J.test(e)&&i.reverse()),this.pushStack(i)}}),x.extend({filter:function(e,t,n){var r=t[0];return n&&(e=":not("+e+")"),1===t.length&&1===r.nodeType?x.find.matchesSelector(r,e)?[r]:[]:x.find.matches(e,x.grep(t,function(e){return 1===e.nodeType}))},dir:function(e,t,n){var r=[],i=n!==undefined;while((e=e[t])&&9!==e.nodeType)if(1===e.nodeType){if(i&&x(e).is(n))break;r.push(e)}return r},sibling:function(e,t){var n=[];for(;e;e=e.nextSibling)1===e.nodeType&&e!==t&&n.push(e);return n}});function et(e,t,n){if(x.isFunction(t))return x.grep(e,function(e,r){return!!t.call(e,r,e)!==n});if(t.nodeType)return x.grep(e,function(e){return e===t!==n});if("string"==typeof t){if(G.test(t))return x.filter(t,e,n);t=x.filter(t,e)}return x.grep(e,function(e){return g.call(t,e)>=0!==n})}var tt=/<(?!area|br|col|embed|hr|img|input|link|meta|param)(([\w:]+)[^>]*)\/>/gi,nt=/<([\w:]+)/,rt=/<|&#?\w+;/,it=/<(?:script|style|link)/i,ot=/^(?:checkbox|radio)$/i,st=/checked\s*(?:[^=]|=\s*.checked.)/i,at=/^$|\/(?:java|ecma)script/i,ut=/^true\/(.*)/,lt=/^\s*\s*$/g,ct={option:[1,""],thead:[1,"","
    "],col:[2,"","
    "],tr:[2,"","
    "],td:[3,"","
    "],_default:[0,"",""]};ct.optgroup=ct.option,ct.tbody=ct.tfoot=ct.colgroup=ct.caption=ct.thead,ct.th=ct.td,x.fn.extend({text:function(e){return x.access(this,function(e){return e===undefined?x.text(this):this.empty().append((this[0]&&this[0].ownerDocument||o).createTextNode(e))},null,e,arguments.length)},append:function(){return this.domManip(arguments,function(e){if(1===this.nodeType||11===this.nodeType||9===this.nodeType){var t=pt(this,e);t.appendChild(e)}})},prepend:function(){return this.domManip(arguments,function(e){if(1===this.nodeType||11===this.nodeType||9===this.nodeType){var t=pt(this,e);t.insertBefore(e,t.firstChild)}})},before:function(){return this.domManip(arguments,function(e){this.parentNode&&this.parentNode.insertBefore(e,this)})},after:function(){return this.domManip(arguments,function(e){this.parentNode&&this.parentNode.insertBefore(e,this.nextSibling)})},remove:function(e,t){var n,r=e?x.filter(e,this):this,i=0;for(;null!=(n=r[i]);i++)t||1!==n.nodeType||x.cleanData(mt(n)),n.parentNode&&(t&&x.contains(n.ownerDocument,n)&&dt(mt(n,"script")),n.parentNode.removeChild(n));return this},empty:function(){var e,t=0;for(;null!=(e=this[t]);t++)1===e.nodeType&&(x.cleanData(mt(e,!1)),e.textContent="");return this},clone:function(e,t){return e=null==e?!1:e,t=null==t?e:t,this.map(function(){return x.clone(this,e,t)})},html:function(e){return x.access(this,function(e){var t=this[0]||{},n=0,r=this.length;if(e===undefined&&1===t.nodeType)return t.innerHTML;if("string"==typeof e&&!it.test(e)&&!ct[(nt.exec(e)||["",""])[1].toLowerCase()]){e=e.replace(tt,"<$1>");try{for(;r>n;n++)t=this[n]||{},1===t.nodeType&&(x.cleanData(mt(t,!1)),t.innerHTML=e);t=0}catch(i){}}t&&this.empty().append(e)},null,e,arguments.length)},replaceWith:function(){var e=x.map(this,function(e){return[e.nextSibling,e.parentNode]}),t=0;return this.domManip(arguments,function(n){var r=e[t++],i=e[t++];i&&(r&&r.parentNode!==i&&(r=this.nextSibling),x(this).remove(),i.insertBefore(n,r))},!0),t?this:this.remove()},detach:function(e){return this.remove(e,!0)},domManip:function(e,t,n){e=f.apply([],e);var r,i,o,s,a,u,l=0,c=this.length,p=this,h=c-1,d=e[0],g=x.isFunction(d);if(g||!(1>=c||"string"!=typeof d||x.support.checkClone)&&st.test(d))return this.each(function(r){var i=p.eq(r);g&&(e[0]=d.call(this,r,i.html())),i.domManip(e,t,n)});if(c&&(r=x.buildFragment(e,this[0].ownerDocument,!1,!n&&this),i=r.firstChild,1===r.childNodes.length&&(r=i),i)){for(o=x.map(mt(r,"script"),ft),s=o.length;c>l;l++)a=r,l!==h&&(a=x.clone(a,!0,!0),s&&x.merge(o,mt(a,"script"))),t.call(this[l],a,l);if(s)for(u=o[o.length-1].ownerDocument,x.map(o,ht),l=0;s>l;l++)a=o[l],at.test(a.type||"")&&!q.access(a,"globalEval")&&x.contains(u,a)&&(a.src?x._evalUrl(a.src):x.globalEval(a.textContent.replace(lt,"")))}return this}}),x.each({appendTo:"append",prependTo:"prepend",insertBefore:"before",insertAfter:"after",replaceAll:"replaceWith"},function(e,t){x.fn[e]=function(e){var n,r=[],i=x(e),o=i.length-1,s=0;for(;o>=s;s++)n=s===o?this:this.clone(!0),x(i[s])[t](n),h.apply(r,n.get());return this.pushStack(r)}}),x.extend({clone:function(e,t,n){var r,i,o,s,a=e.cloneNode(!0),u=x.contains(e.ownerDocument,e);if(!(x.support.noCloneChecked||1!==e.nodeType&&11!==e.nodeType||x.isXMLDoc(e)))for(s=mt(a),o=mt(e),r=0,i=o.length;i>r;r++)yt(o[r],s[r]);if(t)if(n)for(o=o||mt(e),s=s||mt(a),r=0,i=o.length;i>r;r++)gt(o[r],s[r]);else gt(e,a);return s=mt(a,"script"),s.length>0&&dt(s,!u&&mt(e,"script")),a},buildFragment:function(e,t,n,r){var i,o,s,a,u,l,c=0,p=e.length,f=t.createDocumentFragment(),h=[];for(;p>c;c++)if(i=e[c],i||0===i)if("object"===x.type(i))x.merge(h,i.nodeType?[i]:i);else if(rt.test(i)){o=o||f.appendChild(t.createElement("div")),s=(nt.exec(i)||["",""])[1].toLowerCase(),a=ct[s]||ct._default,o.innerHTML=a[1]+i.replace(tt,"<$1>")+a[2],l=a[0];while(l--)o=o.lastChild;x.merge(h,o.childNodes),o=f.firstChild,o.textContent=""}else h.push(t.createTextNode(i));f.textContent="",c=0;while(i=h[c++])if((!r||-1===x.inArray(i,r))&&(u=x.contains(i.ownerDocument,i),o=mt(f.appendChild(i),"script"),u&&dt(o),n)){l=0;while(i=o[l++])at.test(i.type||"")&&n.push(i)}return f},cleanData:function(e){var t,n,r,i,o,s,a=x.event.special,u=0;for(;(n=e[u])!==undefined;u++){if(F.accepts(n)&&(o=n[q.expando],o&&(t=q.cache[o]))){if(r=Object.keys(t.events||{}),r.length)for(s=0;(i=r[s])!==undefined;s++)a[i]?x.event.remove(n,i):x.removeEvent(n,i,t.handle);q.cache[o]&&delete q.cache[o]}delete L.cache[n[L.expando]]}},_evalUrl:function(e){return x.ajax({url:e,type:"GET",dataType:"script",async:!1,global:!1,"throws":!0})}});function pt(e,t){return x.nodeName(e,"table")&&x.nodeName(1===t.nodeType?t:t.firstChild,"tr")?e.getElementsByTagName("tbody")[0]||e.appendChild(e.ownerDocument.createElement("tbody")):e}function ft(e){return e.type=(null!==e.getAttribute("type"))+"/"+e.type,e}function ht(e){var t=ut.exec(e.type);return t?e.type=t[1]:e.removeAttribute("type"),e}function dt(e,t){var n=e.length,r=0;for(;n>r;r++)q.set(e[r],"globalEval",!t||q.get(t[r],"globalEval"))}function gt(e,t){var n,r,i,o,s,a,u,l;if(1===t.nodeType){if(q.hasData(e)&&(o=q.access(e),s=q.set(t,o),l=o.events)){delete s.handle,s.events={};for(i in l)for(n=0,r=l[i].length;r>n;n++)x.event.add(t,i,l[i][n])}L.hasData(e)&&(a=L.access(e),u=x.extend({},a),L.set(t,u))}}function mt(e,t){var n=e.getElementsByTagName?e.getElementsByTagName(t||"*"):e.querySelectorAll?e.querySelectorAll(t||"*"):[];return t===undefined||t&&x.nodeName(e,t)?x.merge([e],n):n}function yt(e,t){var n=t.nodeName.toLowerCase();"input"===n&&ot.test(e.type)?t.checked=e.checked:("input"===n||"textarea"===n)&&(t.defaultValue=e.defaultValue)}x.fn.extend({wrapAll:function(e){var t;return x.isFunction(e)?this.each(function(t){x(this).wrapAll(e.call(this,t))}):(this[0]&&(t=x(e,this[0].ownerDocument).eq(0).clone(!0),this[0].parentNode&&t.insertBefore(this[0]),t.map(function(){var e=this;while(e.firstElementChild)e=e.firstElementChild;return e}).append(this)),this)},wrapInner:function(e){return x.isFunction(e)?this.each(function(t){x(this).wrapInner(e.call(this,t))}):this.each(function(){var t=x(this),n=t.contents();n.length?n.wrapAll(e):t.append(e)})},wrap:function(e){var t=x.isFunction(e);return this.each(function(n){x(this).wrapAll(t?e.call(this,n):e)})},unwrap:function(){return this.parent().each(function(){x.nodeName(this,"body")||x(this).replaceWith(this.childNodes)}).end()}});var vt,xt,bt=/^(none|table(?!-c[ea]).+)/,wt=/^margin/,Tt=RegExp("^("+b+")(.*)$","i"),Ct=RegExp("^("+b+")(?!px)[a-z%]+$","i"),kt=RegExp("^([+-])=("+b+")","i"),Nt={BODY:"block"},Et={position:"absolute",visibility:"hidden",display:"block"},St={letterSpacing:0,fontWeight:400},jt=["Top","Right","Bottom","Left"],Dt=["Webkit","O","Moz","ms"];function At(e,t){if(t in e)return t;var n=t.charAt(0).toUpperCase()+t.slice(1),r=t,i=Dt.length;while(i--)if(t=Dt[i]+n,t in e)return t;return r}function Lt(e,t){return e=t||e,"none"===x.css(e,"display")||!x.contains(e.ownerDocument,e)}function qt(t){return e.getComputedStyle(t,null)}function Ht(e,t){var n,r,i,o=[],s=0,a=e.length;for(;a>s;s++)r=e[s],r.style&&(o[s]=q.get(r,"olddisplay"),n=r.style.display,t?(o[s]||"none"!==n||(r.style.display=""),""===r.style.display&&Lt(r)&&(o[s]=q.access(r,"olddisplay",Rt(r.nodeName)))):o[s]||(i=Lt(r),(n&&"none"!==n||!i)&&q.set(r,"olddisplay",i?n:x.css(r,"display"))));for(s=0;a>s;s++)r=e[s],r.style&&(t&&"none"!==r.style.display&&""!==r.style.display||(r.style.display=t?o[s]||"":"none"));return e}x.fn.extend({css:function(e,t){return x.access(this,function(e,t,n){var r,i,o={},s=0;if(x.isArray(t)){for(r=qt(e),i=t.length;i>s;s++)o[t[s]]=x.css(e,t[s],!1,r);return o}return n!==undefined?x.style(e,t,n):x.css(e,t)},e,t,arguments.length>1)},show:function(){return Ht(this,!0)},hide:function(){return Ht(this)},toggle:function(e){return"boolean"==typeof e?e?this.show():this.hide():this.each(function(){Lt(this)?x(this).show():x(this).hide()})}}),x.extend({cssHooks:{opacity:{get:function(e,t){if(t){var n=vt(e,"opacity");return""===n?"1":n}}}},cssNumber:{columnCount:!0,fillOpacity:!0,fontWeight:!0,lineHeight:!0,opacity:!0,order:!0,orphans:!0,widows:!0,zIndex:!0,zoom:!0},cssProps:{"float":"cssFloat"},style:function(e,t,n,r){if(e&&3!==e.nodeType&&8!==e.nodeType&&e.style){var i,o,s,a=x.camelCase(t),u=e.style;return t=x.cssProps[a]||(x.cssProps[a]=At(u,a)),s=x.cssHooks[t]||x.cssHooks[a],n===undefined?s&&"get"in s&&(i=s.get(e,!1,r))!==undefined?i:u[t]:(o=typeof n,"string"===o&&(i=kt.exec(n))&&(n=(i[1]+1)*i[2]+parseFloat(x.css(e,t)),o="number"),null==n||"number"===o&&isNaN(n)||("number"!==o||x.cssNumber[a]||(n+="px"),x.support.clearCloneStyle||""!==n||0!==t.indexOf("background")||(u[t]="inherit"),s&&"set"in s&&(n=s.set(e,n,r))===undefined||(u[t]=n)),undefined)}},css:function(e,t,n,r){var i,o,s,a=x.camelCase(t);return t=x.cssProps[a]||(x.cssProps[a]=At(e.style,a)),s=x.cssHooks[t]||x.cssHooks[a],s&&"get"in s&&(i=s.get(e,!0,n)),i===undefined&&(i=vt(e,t,r)),"normal"===i&&t in St&&(i=St[t]),""===n||n?(o=parseFloat(i),n===!0||x.isNumeric(o)?o||0:i):i}}),vt=function(e,t,n){var r,i,o,s=n||qt(e),a=s?s.getPropertyValue(t)||s[t]:undefined,u=e.style;return s&&(""!==a||x.contains(e.ownerDocument,e)||(a=x.style(e,t)),Ct.test(a)&&wt.test(t)&&(r=u.width,i=u.minWidth,o=u.maxWidth,u.minWidth=u.maxWidth=u.width=a,a=s.width,u.width=r,u.minWidth=i,u.maxWidth=o)),a};function Ot(e,t,n){var r=Tt.exec(t);return r?Math.max(0,r[1]-(n||0))+(r[2]||"px"):t}function Ft(e,t,n,r,i){var o=n===(r?"border":"content")?4:"width"===t?1:0,s=0;for(;4>o;o+=2)"margin"===n&&(s+=x.css(e,n+jt[o],!0,i)),r?("content"===n&&(s-=x.css(e,"padding"+jt[o],!0,i)),"margin"!==n&&(s-=x.css(e,"border"+jt[o]+"Width",!0,i))):(s+=x.css(e,"padding"+jt[o],!0,i),"padding"!==n&&(s+=x.css(e,"border"+jt[o]+"Width",!0,i)));return s}function Pt(e,t,n){var r=!0,i="width"===t?e.offsetWidth:e.offsetHeight,o=qt(e),s=x.support.boxSizing&&"border-box"===x.css(e,"boxSizing",!1,o);if(0>=i||null==i){if(i=vt(e,t,o),(0>i||null==i)&&(i=e.style[t]),Ct.test(i))return i;r=s&&(x.support.boxSizingReliable||i===e.style[t]),i=parseFloat(i)||0}return i+Ft(e,t,n||(s?"border":"content"),r,o)+"px"}function Rt(e){var t=o,n=Nt[e];return n||(n=Mt(e,t),"none"!==n&&n||(xt=(xt||x(" - - - - - -
    - -
    - -
    -
    -
    - -
    -
    -
    -

    - - - -
    -
    -
    -
    - - - - - - - - - - diff --git a/tmpl/mainpage.tmpl b/tmpl/mainpage.tmpl deleted file mode 100644 index ac28a36..0000000 --- a/tmpl/mainpage.tmpl +++ /dev/null @@ -1,14 +0,0 @@ - - - -

    - - - -
    -
    -
    - diff --git a/tmpl/members.tmpl b/tmpl/members.tmpl deleted file mode 100644 index 5cabf4b..0000000 --- a/tmpl/members.tmpl +++ /dev/null @@ -1,36 +0,0 @@ - - - - ' + self.linkto(name, self.htmlsafe(name)) + ' '; - }); - ?> - -
    -
    -

    -
    - - -

    - -
    -
    - -
    - -
    - - - - - -
    Example 1? 's':'' ?>
    - - -
    diff --git a/tmpl/method.tmpl b/tmpl/method.tmpl deleted file mode 100644 index fbcda07..0000000 --- a/tmpl/method.tmpl +++ /dev/null @@ -1,107 +0,0 @@ - -
    - -
    - , -
    - -
    -

    - - - - - - -

    -
    - - -

    - -
    -
    - -
    - -
    - - - -
    Type:
    -
      -
    • - -
    • -
    - - - -
    This:
    -
    - - - -
    Parameters:
    - - - - - - -
    Fires:
    -
      - -
    • - -
    - - - -
    Listens to Events:
    -
      - -
    • - -
    - - - -
    Listeners of This Event:
    -
      - -
    • - -
    - - - -
    Throws:
    - 1) { ?> -
      - -
    • - -
    - - - - - - - - -
    Returns:
    - 1 ) { ?> -
    Returns:
    - - - - -
    Example 1? 's':'' ?>
    - - -
    diff --git a/tmpl/navigation.tmpl b/tmpl/navigation.tmpl deleted file mode 100644 index cbbd70d..0000000 --- a/tmpl/navigation.tmpl +++ /dev/null @@ -1,204 +0,0 @@ - - diff --git a/tmpl/params.tmpl b/tmpl/params.tmpl deleted file mode 100644 index 21f46c9..0000000 --- a/tmpl/params.tmpl +++ /dev/null @@ -1,104 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    NameTypeDefaultDescription
    - - - - - - - - - - - optional - - - nullable - - - - repeatable - - - - - - - -
    diff --git a/tmpl/properties.tmpl b/tmpl/properties.tmpl deleted file mode 100644 index ce9cb75..0000000 --- a/tmpl/properties.tmpl +++ /dev/null @@ -1,105 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    NameTypeArgumentDefaultDescription
    - - - - - - <optional>
    - - - - <nullable>
    - -
    - - - - - -
    Properties
    - -
    diff --git a/tmpl/returns.tmpl b/tmpl/returns.tmpl deleted file mode 100644 index 745084b..0000000 --- a/tmpl/returns.tmpl +++ /dev/null @@ -1,96 +0,0 @@ -/g, ''); - - var isNamed = ret.name ? true : false; - var name = ret.name || ret.description; - var startSpacePos = name.indexOf(' '); - - if (parentReturn !== null && name.indexOf(parentReturn.name + '.') === 0) { - ret.name = isNamed ? name.substr(parentReturn.name.length + 1) : name.substr(parentReturn.name.length + 1, startSpacePos - (parentReturn.name.length + 1)); - - if (!isNamed) { - ret.description = ret.description.substr(startSpacePos + 1); - } - - ret.isSubReturns = true; - parentReturn.subReturns = parentReturn.subReturns || []; - parentReturn.subReturns.push(ret); - returns[i] = null; - } - else if (returns.length > 1 || ret.isSubReturns) { - if (!isNamed) { - ret.name = ret.description.substr(0, startSpacePos !== -1 ? startSpacePos : ret.description.length); - ret.description = startSpacePos !== -1 ? ret.description.substr(startSpacePos + 1) : ''; - } - - parentReturn = ret; - } - } - - if (ret.name) { - hasName = true; - } - if (ret.type) { - hasType = true; - } -}); -?> - - - - - - - - - - - - - - - - - - - - - - - - - - -
    NameTypeDescription
    - - - - | - - - - - - - - -
    - - - {} - - - {undefined} - - - - - - diff --git a/tmpl/source.tmpl b/tmpl/source.tmpl deleted file mode 100644 index 6f51981..0000000 --- a/tmpl/source.tmpl +++ /dev/null @@ -1,11 +0,0 @@ - - -
    -
    -
    -
    -
    diff --git a/tmpl/tutorial.tmpl b/tmpl/tutorial.tmpl deleted file mode 100644 index 60ed9aa..0000000 --- a/tmpl/tutorial.tmpl +++ /dev/null @@ -1,18 +0,0 @@ -
    -
    - 0) { ?> -
      - - -
    • - -
    - -

    -
    -
    - -
    - -
    -
    diff --git a/tmpl/type.tmpl b/tmpl/type.tmpl deleted file mode 100644 index 34811ec..0000000 --- a/tmpl/type.tmpl +++ /dev/null @@ -1,8 +0,0 @@ - - - - | - diff --git a/tutorials/401.html b/tutorials/401.html deleted file mode 100644 index 0d5f0fe..0000000 --- a/tutorials/401.html +++ /dev/null @@ -1,85 +0,0 @@ -
    - - -
    -

    You are not authenticated to access this page.

    -

    But guess what, you can still play with Handsontable below.

    -
    - -
    -
    diff --git a/tutorials/403.html b/tutorials/403.html deleted file mode 100644 index c961d95..0000000 --- a/tutorials/403.html +++ /dev/null @@ -1,87 +0,0 @@ -
    - - -
    -

    You donā€™t have permission to access this resource.

    -

    But guess what, you can still play with Handsontable below.

    -
    - -
    -
    diff --git a/tutorials/404.html b/tutorials/404.html deleted file mode 100644 index b938b71..0000000 --- a/tutorials/404.html +++ /dev/null @@ -1,90 +0,0 @@ -
    - - -
    -

    We couldnā€™t find the page youā€™re looking for.

    -

    But guess what, you can still play with Handsontable below.

    -
    - - -
    -
    diff --git a/tutorials/alignment.html b/tutorials/alignment.html deleted file mode 100644 index b33015e..0000000 --- a/tutorials/alignment.html +++ /dev/null @@ -1,64 +0,0 @@ -
    - - -
    - - Edit on GitHub - -

    To initialize Handsontable with predefined horizontal and vertical alignment, provide className cells - details in form of a grid, columns or cell setting (see code sample below). -

    -

    Available classNames:

    -
      -
    • Horizontal: htLeft, htCenter, htRight, htJustify, -
    • -
    • Vertical: htTop, htMiddle, htBottom.
    • -
    -

    Alignment changes can be tracked using afterSetCellMeta hook callback.

    - -
    -
    -
    - -
    -
    - - -
    - -
    -
    -
    - diff --git a/tutorials/appearance-demos.html b/tutorials/appearance-demos.html deleted file mode 100644 index e69de29..0000000 diff --git a/tutorials/autocomplete.html b/tutorials/autocomplete.html deleted file mode 100644 index cb5e0e1..0000000 --- a/tutorials/autocomplete.html +++ /dev/null @@ -1,208 +0,0 @@ -
    - - - - -
    -

    This page shows how to configure Handsontable with Autocomplete cell type, which expands the - Handsontable cell type with features typical for a combo box that - updates its options based on user input. You will find here:

    - -
    - -
    - - Edit on GitHub - -

    Autocomplete lazy mode

    -

    This example shows the usage of the Autocomplete feature in the default lazy mode. In this mode, - user can choose one of the suggested options while typing or enter a custom value that is not included in the suggestions.

    -

    In this mode, the mouse and keyboard bindings are identical as in Handsontable cell type. - The options are rendered from the source property which can be an array, or a function that returns an array.

    - -
    -
    -
    - -
    -
    - - -
    - -
    -
    - -
    -

    Autocomplete strict mode

    -

    This is the same example as above with a difference that autocomplete now runs in strict - mode. In this mode, the autocomplete cells will only accept values that are defined in the source - array. The mouse and keyboard bindings are identical as in Handsontable cell type with the below differences:

    -
      -
    • If there is at least one option visible, there always is a selection in HOT-in-HOT.
    • -
    • When the first row is selected, pressing Arrow up does not deselect HOT-in-HOT. - Instead behaves as the ENTER key but moves the selection in the main HOT upwards.
    • -
    -

    In strict mode, the allowInvalid option determines the behaviour in case of manual user input:

    -
      -
    • allowInvalid: true (optional) - allows manual input of value that does not exist in the - source. In this case, the field background highlight becomes red and the selection - advances to the next cell -
    • -
    • allowInvalid: false - does not allow manual input of value that does not exist in the - source. In this case, the ENTER key is ignored and the editor field remains opened.
    • -
    - -
    -
    -
    - -
    -
    - - -
    - -
    -
    - -
    -

    Autocomplete strict mode (Ajax)

    -

    Autocomplete can be also used with Ajax data source. In the below example, suggestions for the "Car" column are - loaded from server. To load data from remote (asynchronous) source, assign a function to the 'source' property. Function should - perform the server side request and call the callback function when the result is available.

    - -
    -
    -
    - -
    -
    - -
    - -
    -
    -
    diff --git a/tutorials/backbonejs.html b/tutorials/backbonejs.html deleted file mode 100644 index 98afac6..0000000 --- a/tutorials/backbonejs.html +++ /dev/null @@ -1,152 +0,0 @@ -
    - - - - - -
    - - Edit on GitHub - -

    Backbone.js is a client-side - MV* framework that can do some pretty smart things - with data going to and coming back from a server, and has a great - event model for keeping multiple views in sync. -

    -

    This little example shows how Backbone Models and Collections can - work with Handsontable. Below, you'll see events firing from - changes in the CarCollection by Handsontable or - otherwise. -

    - -
    -
    -
    -
    -

    - - -

    -
    - -

    - Please note that Backbone integration is a work in progress since Handsontable 0.8.14. - The code presented here has 2 known issues: -

    -
      -
    • inserting and removing rows or columns triggers errors, both when using alter method and - the context menu, -
    • -
    • minSpareRows does not have effect directly after row was added from Backbone (as a - workaround, you would need to call loadData instead of render). -
    • -
    - -
    -
    - - -
    - -
    -
    -
    - diff --git a/tutorials/bootstrap.html b/tutorials/bootstrap.html deleted file mode 100644 index 95bcba8..0000000 --- a/tutorials/bootstrap.html +++ /dev/null @@ -1,82 +0,0 @@ -
    - - - - - - -
    - - Edit on GitHub - -

    This page demonstrate example of using Handsontable with - Bootstrap. -

    -

    Please note that before you add Bootstrap classes like table, table-hover, table-striped - etc. you should reset some of Bootstrap styles. You can use file - plugins/bootstrap/handsontable.bootstrap.css for that purpose.

    - -
    -
    -
    - -
    -
    - - -
    - -
    -
    -
    - diff --git a/tutorials/callbacks.html b/tutorials/callbacks.html deleted file mode 100644 index 92e6391..0000000 --- a/tutorials/callbacks.html +++ /dev/null @@ -1,245 +0,0 @@ -
    - -
    -

    On this page:

    - -
    - -
    - - Edit on GitHub - -

    Callbacks

    -

    This page shows usage of some callbacks available in Handsontable. If you require a new callback to be added, - please open an issue. - Note that some callbacks are unchecked on this page by default. -

    - -
    -
    -
    -
    -
    - -
    -

    Choose events to be logged:

    -
      -
    • -
    -
    - -
    -
    - - - - - -
    - -
    - -
    -

    beforeKeyDown callback

    -

    The following demo uses beforeKeyDown callback to modify some key bindings:

    -
      -
    • Pressing DELETE or BACKSPACE on a cell deletes the cell and shifts all cells beneath it - in the column up resulting in the cursor (which doesn't move) having the value previously beneath it, - now in the current cell.
    • -
    • Pressing ENTER in a cell (not changing the value) results in pushing all the cells in the column beneath - this cell down one row (including current cell) resulting in a blank cell under the cursor (which hasn't moved).
    • -
    -
    -
    -
    - -
    -
    - - - - - -
    - -
    -
    -
    diff --git a/tutorials/cell-editor.html b/tutorials/cell-editor.html deleted file mode 100644 index dad6c31..0000000 --- a/tutorials/cell-editor.html +++ /dev/null @@ -1,772 +0,0 @@ -
    - - -
    - - Edit on GitHub - -

    Handsontable separates the process of displaying the cell value from the process of changing the value. - Renderers are responsible for presenting the data and Editors for altering it. As a renderer has only one simple task: - get actual value of the cell and return its representation as a HTML code they can be a single function. - Editors, however, need to handle user input (that is, mouse and keyboard events), - validate data and behave according to validation results, so putting all those functionalities into a single function - wouldn't be a good idea. That's why Handsontable editors are represented by editor classes.

    -

    Since Handsontable 0.10.0 we have rewritten most of the editors module to make it (hopefully) more understandable, - predictable and easier to extend. This tutorial will give you a comprehensive understanding of how the whole process of cell - editing works, how Handsontable Core manages editors, how editor life cycle looks like and finally - how to create your own - editors.

    -

    EditorManager

    -

    Handsontable.EditorManager is a class responsible for handling all editors available in Handsontable. If - Handsontable.Core needs - to interact with editors it uses Handsontable.EditorManager object. - Handsontable.EditorManager object is instantiated - in init() method which is run, after you invoke handsontable() constructor for the first - time. The reference for Handsontable.EditorManager - object is kept private in Handsontable instance and you cannot access it. However, there are ways to alter the default - behaviour of Handsontable.EditorManager, more on that later.

    -

    EditorManager tasks

    -

    EditorManager has 4 main tasks:

    -
      -
    • selecting proper editor for an active cell
    • -
    • preparing editor to be displayed
    • -
    • displaying editor (based on user behavior)
    • -
    • closing editor (based on user behavior).
    • -
    -

    We will discuss each of those tasks in detail.

    -

    Selecting proper editor for an active cell

    -

    When user selects a cell EditorManager finds the editor class assigned to this cell, examining the value - of editor property. - You can define editor property globally (for all cells in table), per column (for all cells in column) or - for each cell - individually. For more details see How cascading - configuration works.

    -

    The value of editor property can be either a string representing an editor (such as 'text', - 'autocomplete', 'checkbox' etc.), - or an editor class. EditorManager will then get an instance of editor class and the first very important - thing to remember is: - there is always one instance of certain editor class in a single table, in other words each editor - class object - is a singleton within a single table, which means that its constructor will be invoked only once per - table. - If you have 3 tables on a page, each table will have its own instance of editor class. - This has some important implications that you have to consider creating your own editor.

    -

    Preparing editor to be displayed

    -

    When EditorManager obtain editor class instance (editor object) it invokes its prepare - method. The prepare method - sets editor objects properties related to the selected cell, but does not display the editor. prepare is - called each time - user selects a cell. In some cases it can be invoked multiple times for the same cell, without changing the selection. -

    -

    Displaying editor

    -

    When editor is prepared the EditorManager waits for user event that triggers cell edition. Those events - are:

    -
      -
    • pressing ENTER
    • -
    • double clicking cell
    • -
    • pressing F2
    • -
    -

    If any of those events is triggered, EditorManager calls editor's beginEditing() - method, which should display the editor.

    -

    Closing editor

    -

    When editor is opened the EditorManager waits for user event that should end cell edition. Those events - are:

    -
      -
    • clicking on another cell (saves changes)
    • -
    • pressing ENTER (saves changes)
    • -
    • pressing ESC (abort changes)
    • -
    • pressing ARROW_UP, ARROW_DOWN, ARROW_LEFT, - ARROW_RIGHT (saves changes) -
    • -
    • pressing TAB (saves changes)
    • -
    • pressing HOME, END (saved changes)
    • -
    • pressing PAGE_UP, PAGE_DOWN (saved changes)
    • -
    -

    If any of those events is triggered, EditorManager calls editor's finishEditing() - method, which should try to save changes - (unless ESC key has been pressed) and close the editor.

    -

    Overriding EditorManager default behaviour

    -

    You may want to change the default events that causes editor to open or close. For example, your editor might use - ARROW_UP and ARROW_DOWN events to perform some actions (for example - increasing or decreasing cell value) - and you don't want EditorManager to close the editor when user press those keys. That's why - EditorManager runs beforeKeyDown - hook before processing user events. If you register a listener for beforeKeyDown, that call stopImmediatePropagation() - on event object EditorManager won perform its default action. More on overriding EditorManager's - behaviour in section - "SelectEditor - creating editor from scratch".

    -

    You should now have a better understanding on how EditorManager works. Let's go a bit deeper and see - what methods every - editor class must implement and what those methods do.

    -

    BaseEditor

    -

    Handsontable.editors.BaseEditor is an abstract class from which all editor classes should inherit. - It implements some of the basic editor methods as well as declares some methods that should be implemented by each - editor class. - In this section we examine all of those methods.

    -

    Common methods

    -

    Common methods, are methods implemented by BaseEditor class. They contain some core logic that every - editor should have. - Most of the time, you shouldn't bother with those methods. - However, if you are creating some more complex editors, you might want to override some of the common methods, in - which case you should always - invoke the original method and then perform other operations, specific to your editor.

    -

    Example - overriding common method

    -
    -      // CustomEditor is a class function, inheriting form BaseEditor
    -CustomEditor.prototype.prepare = function(row, col, prop, td, originalValue, cellProperties){
    -  // Invoke the original method...
    -  Handsontable.editors.BaseEditor.prototype.prepare.apply(this, arguments);
    -  // ...and then do some stuff specific to your CustomEditor
    -  this.customEditorSpecificProperty = 'foo';
    -};
    -      
    -    
    -

    There are 7 common methods. All of them are described below.

    -

    prepare(row: Number, - col: Number, prop: String, td: HTMLTableCellElement, cellProperties: Object) -

    -

    Prepares editor to be displayed for given cell. Sets most of the instance properties.

    -

    Returns: undefined

    -

    beginEditing(initialValue: 'String' [optional] ) -

    -

    Sets editor value to initialValue. If initialValue is undefined, the editor value is set to - original cell value. - Calls open() method internally.

    -

    Returns: undefined

    -

    - finishEditing(revertToOriginal: 'Boolean' [optional], ctrlDown: Boolean - [optional], callback: Function)

    -

    Tries to finish cell edition. Calls saveValue() and discardEditor() internally. - If revertToOriginal is set to true cell value is being set to its original value (from - before the edition). - ctrlDown value is passed to saveValue() as the second argument.

    -

    Callback function contains a boolean parameter - if new value is valid or allowInvalid parameter is - true, - otherwise the parameter is false.

    -

    discardEditor(validationResult: Boolean)

    -

    Called when cell validation ends. If new value is saved successfully (validationResult is set to true - or allowInvalid property is true) - it calls close() method, otherwise calls focus() method and keeps editor opened.

    -

    Returns: undefined

    -

    saveValue(val: Mixed, ctrlDown: Boolean)

    -

    Tries to save val as new cell value. Performs validation internally. If ctrlDown is set to - true the new value will be set to all selected cells.

    -

    Returns: undefined

    -

    isOpened()

    -

    Returns true if editor is opened or false if editor is closed. Editor is considered to be - opened after open() has been called. - Editor is considered closed close() after method has been called.

    -

    Returns: Boolean

    -

    extend()

    -

    Returns: Function - a class function that inherits from the current class. The prototype - methods of the returned class can be safely - overwritten, without a danger of altering the parent's prototype.

    -

    Example - inheriting from BaseEditor and overriding its method

    -
    var CustomEditor = Handsontable.editors.BaseEditor.prototype.extend();
    -
    -// This won't alter BaseEditor.prototype.beginEditing()
    -CustomEditor.prototype.beginEditing = function() {};
    -

    Example - inheriting from another editor

    -
    var CustomTextEditor = Handsontable.editors.TextEditor.prototype.extend();
    -
    -// CustomTextEditor uses all methods implemented by TextEditor.
    -// You can safely override any method without affecting original TextEditor.
    -

    Note: This is an utility method not related to the process of editing cell.

    -

    Editor specific methods

    -

    Editor specific methods are methods not implemented in BaseEditor. In order to work, every editor class - has to - implement those methods.

    -

    init()

    -

    Method called when new instance of editor class is created. That happens at most once per table instance, as all used - editors as singletons within table instance. You should use this methods to perform tasks which - results can be reused - during editor's lifecycle. The most common operation is creating HTML structure of editor.

    -

    Method does not need to return any value.

    -

    getValue()

    -

    Method should act return the current editor value, that is value that should be saved as a new cell value.

    -

    setValue(newValue: 'Mixed')

    -

    Method should set editor value to newValue.

    -

    Example - Let's say we are implementing a DateEditor, which helps selecting date, by displaying a calendar. - getValue() and setValue() method could work like so:

    -
    CalendarEditor.prototype.getValue = function() {
    -  return calendar.getDate(); // returns currently selected date, for example "2013/09/15"
    -};
    -
    -CalendarEditor.prototype.setValue = function(newValue) {
    -  calendar.highlightDate(newValue); // highlights given date on calendar
    -};
    -

    open()

    -

    Displays the editor. In most cases this method can be as simple as:

    -
    CustomEditor.prototype.open = function() {
    -  this.editorDiv.style.display = '';
    -};
    -

    This method does need to return any value.

    -

    close()

    -

    Hides the editor after cell value has been changed. In most cases this method can be as simple as:

    -
    CustomEditor.prototype.close = function() {
    -  this.editorDiv.style.display = 'none';
    -};
    -

    This method does need to return any value.

    -

    focus()

    -

    Focuses the editor. This method is called when user wants to close the editor by selecting another cell and the value - in editor does not validate (and allowInvalid is false). In most cases this method can be as - simple as:

    -
    CustomEditor.prototype.focus = function() {
    -  this.editorInput.focus();
    -};
    -

    This method does need to return any value.

    -

    Common editor properties

    -

    All of the undermentioned properties are available in editor instance through this object (e.g. this.instance). -

    -

    instance `Object:Handsontable.Core'

    -

    The instance of Handsontable to which this editor object belongs. Set in class constructor, immutable thorough the - whole lifecycle of editor.

    -

    row Number

    -

    The active cell row index. Updated on every prepare() method call.

    -

    col Number

    -

    The active cell col index. Updated on every prepare() method call.

    -

    prop String

    -

    The property name associated with active cell (relevant only when data source is an array of objects). - Updated on every prepare() method call.

    -

    TD HTMLTableCellNode

    -

    Node object of active cell. Updated on every prepare() method call.

    -

    cellProperties 'Object'

    -

    An object representing active cell properties. Updated on every prepare() method call.

    -

    How to create a custom editor?

    -

    Now you now all the philosophy behind Handsontable editors and you're ready to write your own editor. - Basically, you can build a new editor from scratch, by creating a new editor class, which inherits form BaseEditor, - or - if you just want to enhance an existing editor, you can extend its class and override only a few of its methods.

    -

    In this tutorial we will examine both approaches. - We will create a completely new SelectEditor which uses <select> list to alter the - value of cell. - We will also create a PasswordEditor which works exactly like regular TextEditor except that - it displays a password - input instead of textarea.

    -

    Let's begin with PasswordEditor as it is a bit easier.

    -

    PasswordEditor - extending an existing editor

    -

    TextEditor is the most complex editor available in Handsontable by default. It displays a <textarea> - which automatically - change its size to accommodate to its content. We would like to create a PasswordEditor which preserves - all those capabilities - but displays <input type="password" /> field instead of <textarea>. -

    -

    As you may have guessed, we need to create a new editor class, that inherits from TextEditor and then - override some of its - methods to replace <textarea> with input:password. Luckily, textarea and password - input have the same API, so all we - have to do is replace the code responsible for creating HTML elements. If you take a look at TextEditor - init() method, - you'll notice that it calls internal createElements() method, which creates - <textarea> node and append it to DOM during - editor initialization - BINGO!.

    -

    Here is the code

    -
    var PasswordEditor = Handsontable.editors.TextEditor.prototype.extend();
    -
    -PasswordEditor.prototype.createElements = function () {
    -  // Call the original createElements method
    -  Handsontable.editors.TextEditor.prototype.createElements.apply(this, arguments);
    -
    -  // Create password input and update relevant properties
    -  this.TEXTAREA = document.createElement('input');
    -  this.TEXTAREA.setAttribute('type', 'password');
    -  this.TEXTAREA.className = 'handsontableInput';
    -  this.textareaStyle = this.TEXTAREA.style;
    -  this.textareaStyle.width = 0;
    -  this.textareaStyle.height = 0;
    -
    -  // Replace textarea with password input
    -  Handsontable.Dom.empty(this.TEXTAREA_PARENT);
    -  this.TEXTAREA_PARENT.appendChild(this.TEXTAREA);
    -};
    -

    That's it! You can now use your new editor:

    -
    var hot = new Handsontable(document.getElementById('container'), {
    -  data: someData,
    -  columns: [
    -    {
    -      type: 'text'
    -    },
    -    {
    -      editor: PasswordEditor
    -      // If you want to use string 'password' instead of passing the actual editor class check out section "Registering editor"
    -    }
    -  ]
    -});
    -

    Wow, that was easy. Just a few lines of code and everything works. - Let's try something more complex, let's build new editor from the ground up.

    -

    SelectEditor - creating editor from scratch

    -

    We're going to build a full featured editor, that lets user choose a cell value from predefined list of options, - using - standard <select> input. As an extra feature, we'll add an ability to change currently selected - option with ARROW_UP - and ARROW_DOWN keys.

    -

    Things to do:

    -
      -
    1. Create a new class that inherits from Handsontable.editors.BaseEditor.
    2. -
    3. Add function creating <select> input and attaching to DOM.
    4. -
    5. Add function that populate <select> with options array passed in cell properties.
    6. -
    7. Implement methods: -
        -
      • getValue()
      • -
      • setValue()
      • -
      • open()
      • -
      • close()
      • -
      • focus()
      • -
      -
    8. -
    9. Override the default EditorManager behaviour, so that pressing ARROW_UP and - ARROW_DOWN keys - won't close the editor, but instead change the currently selected value. -
    10. -
    11. Register editor.
    12. -
    -

    Creating new editor

    -

    That's probably the easiest part. All we have to do is call BaseEditor.prototype.extend() function - which will return - a new function class that inherits from BaseEditor.

    -
    var SelectEditor = Handsontable.editors.BaseEditor.prototype.extend();
    -

    Task one: DONE

    -

    Creating <select> input and attaching it to - DOM

    -

    There are three potential places where we can put the function that will create <select> element - and put it in the DOM:

    -
      -
    • init() method
    • -
    • prepare() method
    • -
    • open() method
    • -
    -

    The key to choose the best solution is to understand when each of those methods is called.

    -

    init() method is called during - creation of editor class object. That happens at most one per table instance, because once the object is created it is - reused every time EditorManager asks for this editor class instance (see Singleton pattern for details).

    -

    prepare() method is called every time user selects a cell that has this particular editor class set as - editor property. - So, if we set SelectEditor as editor for an entire column, then selecting any cell in this column will - invoke prepare() - method of SelectEditor. In other words, this method can be called hundreds of times during table life, - especially when - working with large data. Another important aspect of prepare() is that it should not display the editor - (it's open's job). - Displaying editor is triggered by user event such as pressing ENTER, F2 - or double clicking a cell, - so there is some time between calling prepare() and actually displaying the editor. Nevertheless, - operations performed - by prepare() should be as fast as possible, to provide the best user experience.

    -

    open() method is called when editor needs to be displayed. In most cases this method should change CSS - display property - to block or perform something similar. User expects that editor will be displayed right after the event - (pressing appropriate key or double clicking a cell) has been triggered, so open() method should work as - fast as possible.

    -

    Knowing all this, the most reasonable place to put the code responsible for creating <select> - input is somewhere in - init() method. DOM manipulation is considered to be quite expensive (regarding the resource consumption) - operation, so - it's best to perform it once and reuse the produced HTML nodes throughout the life of editor.

    -
    SelectEditor.prototype.init = function() {
    -  // Create detached node, add CSS class and make sure its not visible
    -  this.select = document.createElement('SELECT');
    -  Handsontable.Dom.addClass(this.select, 'htSelectEditor');
    -  this.select.style.display = 'none';
    -
    -  // Attach node to DOM, by appending it to the container holding the table
    -  this.instance.rootElement.appendChild(this.select);
    -};
    -
    -
    .htSelectEditor {
    -  padding: 5px 7px;
    -  position: absolute;
    -  /*
    -   * This hack enables to change <select> dimensions in WebKit browsers
    -   */
    -  -webkit-appearance: menulist-button !important;
    -}
    -

    Task two: DONE

    -

    Populating <select> with options

    -

    In the previous step we implemented a function that creates the <select> input and attaches it to the DOM. - You probably noticed that we haven't written any code that would create the <option> elements, therefore if we - displayed the list, it would be empty.

    -

    We want to be able to define an option list like this:

    -
    var hot = new Handsontable(document.getElementById('container'), {
    -  data: someData,
    -  columns: [
    -    {
    -      editor: SelectEditor,
    -      selectOptions: ['option1', 'option2', 'option3']
    -    }
    -  ]
    -});
    -

    There is no (easy) way to get to the value of selectOptions. Even if we could get to this array we could - only populate the list with options once, if we do this in the 'init' function. - What if we have more than one column using SelectEditor and each of them has it's own option list? - It's even possible that two cells in the same column can have different option lists (cascade configuration - remember?) - It's clear that we have to find a better place for the code that creates items for our list.

    -

    We are left with two places prepare() and open(). The latter one is simpler to implement, - but as we previously stated, - open() should work as fast as possible and creating <option> nodes and attaching them - to DOM might be time consuming, - if selectOptions contains long list of options. Therefore, prepare() seems to be a safer - place to do this kind of work. - The only thing to keep in mind is that we should always invoke BaseEditor's original method when - overriding prepare(). - BaseEditor.prototype.prepare() sets some important properties, which are used by other editor methods. -

    -
    // Create options in prepare() method
    -SelectEditor.prototype.prepare = function() {
    -  // Remember to invoke parent's method
    -  Handsontable.editors.BaseEditor.prototype.prepare.apply(this, arguments);
    -
    -  var selectOptions = this.cellProperties.selectOptions;
    -  var options;
    -
    -  if (typeof selectOptions == 'function') {
    -    options = this.prepareOptions(selectOptions(this.row,
    -    this.col, this.prop))
    -  } else {
    -    options = this.prepareOptions(selectOptions);
    -  }
    -  Handsontable.Dom.empty(this.select);
    -
    -  for (var option in options) {
    -    if (options.hasOwnProperty(option)) {
    -      var optionElement = document.createElement('OPTION');
    -      optionElement.value = option;
    -      Handsontable.Dom.fastInnerHTML(optionElement, options[option]);
    -      this.select.appendChild(optionElement);
    -    }
    -  }
    -}; 
    -

    Where the prepareOptions is:

    -
    SelectEditor.prototype.prepareOptions = function(optionsToPrepare) {
    -  var preparedOptions = {};
    -
    -  if (Handsontable.helper.isArray(optionsToPrepare)) {
    -    for(var i = 0, len = optionsToPrepare.length; i < len; i++) {
    -      preparedOptions[optionsToPrepare[i]] = optionsToPrepare[i];
    -    }
    -  } else if (typeof optionsToPrepare == 'object') {
    -    preparedOptions = optionsToPrepare;
    -  }
    -
    -  return preparedOptions;
    -};
    -

    Task three: DONE

    -

    Implementing editor specific methods

    -

    Most of the work is done. Now we just need to implement all the editor specific methods. Luckily, our editor is quite - simple - so those methods will be only few lines of code.

    -
    SelectEditor.prototype.getValue = function() {
    -  return this.select.value;
    -};
    -
    -SelectEditor.prototype.setValue = function(value) {
    -  this.select.value = value;
    -};
    -
    -SelectEditor.prototype.open = function() {
    -  var width = Handsontable.Dom.outerWidth(this.TD);
    -  var height = Handsontable.Dom.outerHeight(this.TD);
    -  var rootOffset = Handsontable.Dom.offset(this.instance.rootElement);
    -  var tdOffset = Handsontable.Dom.offset(this.TD);
    -
    -  // sets select dimensions to match cell size
    -  this.select.style.height = height + 'px';
    -  this.select.style.minWidth = width + 'px';
    -
    -  // make sure that list positions matches cell position
    -  this.select.style.top = tdOffset.top - rootOffset.top + 'px';
    -  this.select.style.left = tdOffset.left - rootOffset.left + 'px';
    -  this.select.style.margin = '0px';
    -
    -  // display the list
    -  this.select.style.display = '';
    -};
    -
    -SelectEditor.prototype.close = function() {
    -  this.select.style.display = 'none';
    -};
    -

    The implementations of getValue(), setValue() and close() are - self-explanatory, but open() requires a few words of comment. First of all, - the implementation assumes that code responsible for populating the list with options is placed in - prepare(). Secondly, before - displaying the list, we sets its height and min-width so that it matches the size of - corresponding cell. - It's an optional step, but without it the editor will have different sizes depending on the browser. Probably a - good idea - would be also to limit the maximum height of <select>. Finally, as the <select> - has been appended to the end of the - table container, we have to change its position so that it could be displayed above the cell that is being edited. - Again, - this is an optional step, but it seems quite reasonable to put the editor next to the appropriate cell.

    -

    Task four: DONE

    -

    At this point we should have an editor that is ready to use. Put the code somewhere in your page and pass SelectEditor - class function as value of editor property.

    -
    /*
    - * PLACE EDITOR CODE HERE
    - */
    -var hot = new Handsontable(document.getElementById('container'), {
    -  data: someData,
    -  columns: [
    -    {},
    -    {
    -      editor: SelectEditor,
    -      selectOptions: ['option1', 'option2', 'option3']
    -    }
    -  ]
    -});
    -

    Use ARROW_UP and - ARROW_DOWN to change selected value

    -

    We know that our editor works, but let's add one more tweak to it. Currently, when editor is opened and user - presses - ARROW_UP or ARROW_DOWN editor closes and the selection moves one cell up - or down. Wouldn't - it be nice, if pressing up and down arrow keys changed the currently selected value? User could navigate to the cell, - hit - ENTER, choose the desired value and save changes by hitting ENTER again. - It would be possible to - work with the table without even laying your hand on a mouse. Sounds pretty good, but how to override the default - behaviour? - After all, it's the EditorManager who decides when to close the editor.

    -

    Don't worry. Although, you don't have a direct access to EditorManager instance, you can still - override its behaviour. - Before EditorManager starts to process keyboard events it triggers beforeKeyDown hook. If - any of the listening functions - invoke stopImmediatePropagation() method on an event object EditorManager won't - process this event any further. Therefore, - all we have to do is register a beforeKeyDown listener function that checks whether ARROW_UP - or ARROW_DOWN - has been pressed and if so, stops event propagation and changes the currently selected value in - <select> list accordingly.

    -

    The thing that we need to keep in mind is that our listener should work only, when our editor is opened. We want to - preserve - the default behaviour for other editors, as well as when no editor is opened. That's why the most reasonable place - to - register our listener would be the open() method and the close() method should contain code - that will remove our listener.

    -

    Here's how the listener function could look like:

    -
    var onBeforeKeyDown = function(event) {
    -  var instance = this; // context of listener function is always set to Handsontable.Core instance
    -  var editor = instance.getActiveEditor();
    -  var selectedIndex = editor.select.selectedIndex;
    -
    -  Handsontable.Dom.enableImmediatePropagation(event);
    -
    -  switch (event.keyCode) {
    -    case Handsontable.helper.keyCode.ARROW_UP:
    -      var previousOption = editor.select.options[selectedIndex - 1];
    -
    -      if (previousOption) { // if previous option exists
    -        editor.select.value = previousOption.value; // mark it as selected
    -      }
    -
    -      event.stopImmediatePropagation(); // prevent EditorManager from processing this event
    -      event.preventDefault(); // prevent browser from scrolling the page up
    -      break;
    -
    -    case Handsontable.helper.keyCode.ARROW_DOWN:
    -      var nextOption = editor.select.options[selectedIndex + 1];
    -
    -      if (nextOption) { // if previous option exists
    -        editor.select.value = nextOption.value; // mark it as selected
    -      }
    -      event.stopImmediatePropagation(); // prevent EditorManager from processing this event
    -      event.preventDefault(); // prevent browser from scrolling the page up
    -      break;
    -}
    -

    The first two lines of onBeforeKeyDown() are the most important. First of all, in listeners - this is set to instance - of Handsontable.Core NOT the instance of our editor. To get an instance of editor class, - we need to call - getActiveEditor() method, which returns the active editor.

    -

    Active editor is the editor which prepare() method was called most recently. For example, if you select - a cell which - editor is Handsontable.TextEditor, then getActiveEditor() will return an object of this - editor class. If then select - a cell (presumably in another column) which editor is Handsontable.DateEditor, the active editor changes - and now - getActiveEditor() will return an object of DateEditor class.

    -

    The rest of the code should be quite clear. Now all we have to do is register our listener.

    -
    SelectEditor.prototype.open = function() {
    -  var width = Handsontable.Dom.outerWidth(this.TD);
    -  var height = Handsontable.Dom.outerHeight(this.TD);
    -  var rootOffset = Handsontable.Dom.offset(this.instance.rootElement);
    -  var tdOffset = Handsontable.Dom.offset(this.TD);
    -
    -  this.select.style.height = height + 'px';
    -  this.select.style.minWidth = width + 'px';
    -  this.select.style.top = tdOffset.top - rootOffset.top + 'px';
    -  this.select.style.left = tdOffset.left - rootOffset.left + 'px';
    -  this.select.style.margin = '0px';
    -  this.select.style.display = '';
    -
    -  // register listener
    -  this.instance.addHook('beforeKeyDown', onBeforeKeyDown);
    -};
    -
    -SelectEditor.prototype.close = function() {
    -  this.select.style.display = 'none';
    -  // remove listener
    -  this.instance.removeHook('beforeKeyDown', onBeforeKeyDown);
    -};
    -

    Additionally, due to the recent change in the positioning of the overlays (fixed columns, rows, headers etc.) we need - to set the css transform property. We'll use the Handsontable.Dom's getCssTransform - and resetCssTransform to get the correct values:

    -
    SelectEditor.prototype.open = function() {
    -  var width = Handsontable.Dom.outerWidth(this.TD);
    -  // important - group layout reads together for better performance
    -  var height = Handsontable.Dom.outerHeight(this.TD);
    -  var rootOffset = Handsontable.Dom.offset(this.instance.rootElement);
    -  var tdOffset = Handsontable.Dom.offset(this.TD);
    -  var editorSection = this.checkEditorSection();
    -  var cssTransformOffset;
    -
    -  switch(editorSection) {
    -    case 'top':
    -      cssTransformOffset = Handsontable.Dom.getCssTransform(this.instance.view.wt.wtScrollbars.vertical.clone.wtTable.holder.parentNode);
    -      break;
    -    case 'left':
    -      cssTransformOffset = Handsontable.Dom.getCssTransform(this.instance.view.wt.wtScrollbars.horizontal.clone.wtTable.holder.parentNode);
    -      break;
    -    case 'corner':
    -      cssTransformOffset = Handsontable.Dom.getCssTransform(this.instance.view.wt.wtScrollbars.corner.clone.wtTable.holder.parentNode);
    -      break;
    -  }
    -  var selectStyle = this.select.style;
    -
    -  if (cssTransformOffset && cssTransformOffset !== -1) {
    -    selectStyle[cssTransformOffset[0]] = cssTransformOffset[1];
    -  } else {
    -    Handsontable.Dom.resetCssTransform(this.select);
    -  }
    -
    -  selectStyle.height = height + 'px';
    -  selectStyle.minWidth = width + 'px';
    -  selectStyle.top = tdOffset.top - rootOffset.top + 'px';
    -  selectStyle.left = tdOffset.left - rootOffset.left + 'px';
    -  selectStyle.margin = '0px';
    -  selectStyle.display = '';
    -
    -  this.instance.addHook('beforeKeyDown', onBeforeKeyDown);
    -};
    -
    -SelectEditor.prototype.checkEditorSection = function() {
    -  if (this.row < this.instance.getSettings().fixedRowsTop) {
    -    if (this.col < this.instance.getSettings().fixedColumnsLeft) {
    -      return 'corner';
    -    } else {
    -      return 'top';
    -    }
    -  } else {
    -    if (this.col < this.instance.getSettings().fixedColumnsLeft) {
    -      return 'left';
    -    }
    -  }
    -};
    -
    -

    Go ahead and test it!

    -

    Registering an editor

    -

    When you create an editor, a good idea is to assign it an alias that will refer to this particular editor class. - Handsontable defines 6 aliases by default:

    -
      -
    • text for Handsontable.editors.TextEditor
    • -
    • numeric for Handsontable.editors.NumericEditor
    • -
    • date for Handsontable.editors.DateEditor
    • -
    • autocomplete for Handsontable.editors.AutocompleteEditor
    • -
    • checkbox for Handsontable.editors.CheckboxEditor
    • -
    • handsontable for Handsontable.editors.HandsontableEditor
    • -
    -

    It gives users a convenient way for defining which editor should - be use when changing value of certain cells. User doesn't need to - know which class is responsible for displaying the editor, he does - not even need to know that there is any class at all. What is - more, you can change the class associated with an alias without a - need to change code that defines a table.

    -

    To register your own alias use Handsontable.editors.registerEditor() function. It takes two arguments: -

    -
      -
    • editorName - a string representing an editor
    • -
    • editorClass - a class that will be represented by editorName
    • -
    -

    If you'd like to register SelectEditor under alias select you have to call:

    -
    Handsontable.editors.registerEditor('select', SelectEditor);
    -

    Choose aliases wisely. If you register your editor under name that is already registered, the target class will be - overwritten:

    -
    Handsontable.editors.registerEditor('text', MyNewTextEditor);
    -
    -// Now 'text' alias points to MyNewTextEditor class, not Handsontable.editors.TextEditor
    -

    So, unless you intentionally want to overwrite an existing alias, try to choose a unique name. A good practice is - prefixing your aliases with some custom name (for example your GitHub username) to minimize the possibility of name - collisions. - This is especially important if you want to publish your editor, because you never know aliases has been - registered by the user who uses your editor.

    -
    Handsontable.editors.registerEditor('select', SelectEditor);
    -
    -// Someone might already registered such alias
    -

    Handsontable.editors.registerEditor('my.select', SelectEditor); - -// That's better.
    -

    Preparing editor for publication

    -

    If you plan to publish your editor or just want to keep your code nice and clean (as we all do :) there are 3 simple - steps - that will help you to organize your code.

    -

    Enclose in IIFE

    -

    Put your code in some kind of module, to avoid polluting global namespace. You can use AMD, CommonJS or any other - module - pattern, but the easiest way to isolate your code is to use plain immediately invoked function expression (IIFE).

    -
    (function(Handsontable){
    -  var CustomEditor = Handsontable.editors.BaseEditor.prototype.extend();
    -
    -  // ...rest of the editor code
    -
    -})(Handsontable);
    -

    Passing Handsontable namespace as argument is optional (as it is defined globally), but it's a good - practice to use as - few global objects as possible, to make modularisation and dependency management easier.

    -

    Add editor to dedicated namespace

    -

    Code enclosed in IIFE cannot be accessed from outside, unless it's intentionally exposed. To keep things well - organized - add your editor to a special namespace called Handsontable.editors. This way you can use your editor - during table definition - and other users will have an easy access to your editor, in case they would like to extend it.

    -
    (function(Handsontable){
    -  var CustomEditor = Handsontable.editors.BaseEditor.prototype.extend();
    -
    -  // ...rest of the editor code
    -
    -  // And at the end
    -  Handsontable.editors.CustomEditor = CustomEditor;
    -
    -})(Handsontable);
    -

    From now on, you can use CustomEditor like so:

    -
    var hot = new Handsontable(document.getElementById('container'), {
    -  data: someData,
    -  columns: [
    -    {
    -      editor: Handsontable.editors.CustomEditor
    -    }
    -  ]
    -}); 
    -

    Extending your CustomEditor is also easy.

    -
    var AnotherEditor = Handsontable.editors.CustomEditor.prototype.extend();
    -

    Keep in mind, that there is no restrictions on the name you choose, but choose wisely and do not overwrite existing - editors. Try to keep the names unique.

    -

    //TODO: add link to section Registering editors

    -

    Registering an alias

    -

    The final touch is to register your editor under some alias, so that users can easily refer to it without the need - to now the actual class name. See Registering editor for details.

    -

    To sum up, a well prepared editor should look like this:

    -
    (function(Handsontable){
    -  var CustomEditor = Handsontable.editors.BaseEditor.prototype.extend();
    -
    -  // ...rest of the editor code
    -
    -  // Put editor in dedicated namespace
    -  Handsontable.editors.CustomEditor = CustomEditor;
    -
    -  // Register alias
    -  Handsontable.editors.registerEditor('theBestEditor', CustomEditor);
    -
    -})(Handsontable);
    -
    -
    diff --git a/tutorials/cell-features-demos.html b/tutorials/cell-features-demos.html deleted file mode 100644 index 8df2a61..0000000 --- a/tutorials/cell-features-demos.html +++ /dev/null @@ -1,2 +0,0 @@ - -... diff --git a/tutorials/cell-function.html b/tutorials/cell-function.html deleted file mode 100644 index 9a2c0d2..0000000 --- a/tutorials/cell-function.html +++ /dev/null @@ -1,219 +0,0 @@ -
    - -
    - - Edit on GitHub - -

    With every cell in the Handsontable there are 3 associated functions:

    -
      -
    • renderer
    • -
    • editor
    • -
    • validator
    • -
    -

    Each of those functions is responsible for a different cell behavior. You can define them separately or use a cell type to define all three at once. We will now discuss the purpose of the aforementioned - functions in details.

    -

    Renderer

    -

    Handsontable does not display the values stored in the datasource directly. Instead, every time a value from data - source needs to be displayed in a table cell, it is passed to the cell renderer function together with - the table cell object of type HTMLTableCellElement (DOM node) and a few other useful information.

    -

    Renderer is expected to format the passed value and place it as a content of the cell object. Renderer - can also alter the cell class list, i.e. it can add a htInvalid class to let the user know, that the - displayed value is invalid.

    -

    Native cell renderers

    -

    Handsontable comes with 5 predefined renderers that you can extend, when writing your own renderers.

    -
      -
    • TextRenderer
    • -
    • NumericRenderer
    • -
    • AutocompleteRenderer
    • -
    • CheckboxRenderer
    • -
    • PasswordRenderer
    • -
    -

    TextRenderer is the default renderer for all cells. If you write your own renderer, you will most likely - want run this renderer at some point, as it handles things like marking cell as read only or invalid, - however calling TextRenderer is not obligatory.

    -

    Adding event listeners in cell renderer function

    -

    If you are writing an advanced cell renderer and you want to add some custom behavior after a certain user action - (i.e. after user hover a mouse pointer over a cell) you might be tempted to add an event listener directly to table - cell node passed as an argument to the renderer function. Unfortunately, this will almost always cause - you trouble and you will end up with either performance issues or having the listeners attached to the wrong cell.

    -

    This is because Handsontable:

    -
      -
    • calls renderer functions multiple times per cell - this can lead to having multiple copies of the - same event listener attached to a cell -
    • -
    • reuses table cell nodes during table scrolling and adding/removing new rows/columns - this can lead to having - event listeners attached to the wrong cell -
    • -
    -

    Before deciding to attach an event listener in cell renderer make sure, that there is no Handsontable event that suits your needs. Using - Handsontable events system is the safest way to respond to user actions.

    -

    If you did't find a suitable Handsontable event put the cell content into a wrapping - <div>, attach the event listener to the wrapper and then put it into the table cell.

    -

    //TODO: example

    -

    Performance

    -

    Cell renderers are called separately for every displayed cell, during every table render. Table can be rendered - multiple times during its lifetime (after table scroll, after table sorting, after cell edit etc.), therefore you - should keep your renderer functions as simple and fast as possible or you might experience a performance - drop, especially when dealing with large sets of data.

    -

    Renerer templates

    -

    //TODO: write about cellProperty.rendererTemplate

    -

    Editor

    -

    Cell editors are the most complex cell functions. We have prepared a [[separate page|Custom-cell-editor]] explaining - how cell edit works and how to write your own cell editor.

    -

    Validator

    -

    Cell validator can be either a function or a regular expression. A cell is considered valid, when the validator - function calls a callback (passed as one of the validator arguments) with true - or the validation regex test() - method returns true. Because the validity of a value is determined only by the argument that is passed to - callback, validator function can be synchronous or asynchronous.

    -

    Contrary to renderer and editor functions, the validator function doesn't - have to be defined for each cell. If the validator function is not defined, then a cell value is always - valid.

    -

    Cell type

    -

    As we mentioned before, there are 3 functions associated with every table cell: renderer, - editor and (optionally) validator. Most of the time, those function are strongly connected - to each other. For example if you want to store a date in a cell, you will most likely use a renderer which will - display the date using appropriate formatting (dd/mm/yyy, yyy-mm-dd etc.). You will also use - an editor, which will display a calendar instead of the default text input, so user could easily pick the right date. - Finally, you might want to check if the value entered by a user is valid.

    -

    Manually defining those functions for cells or columns would be tedious, so to simplify the configuration, - Handsontable introduced cell types.

    -

    Cell type is represented by a string i.e. "text", "numeric", - "date". Each string is internally mapped to functions associated with this type. For example - "numeric" type is associated with functions:

    -
      -
    • Handsontable.NumericRenderer
    • -
    • Handsontable.editors.TextEditor
    • -
    • Handsontable.NumericValidator
    • -
    -

    so instead of writing

    -
    var hot = new Handsontable(document.getElementById('container'), {
    -  columns: [
    -    {
    -      renderer: Handsontable.NumericRenderer,
    -      editor: Handsontable.editors.TextEditor,
    -      validator: Handsontable.NumericValidator
    -    }
    -  ]
    -});
    -

    you can simply write

    -
    var hot = new Handsontable(document.getElementById('container'), {
    -  columns: [
    -    {
    -      type: 'numeric'
    -    }
    -  ]
    -});
    -

    When Handsontable encounters a cell with type option defined, it checks to which cell functions this - type refers and use them.

    -

    Native types

    -

    Handsontable comes with 9 types:

    -
      -
    • text
    • -
    • numeric
    • -
    • date
    • -
    • checkbox
    • -
    • password
    • -
    • select
    • -
    • dropdown
    • -
    • autocomplete
    • -
    • handsontable
    • -
    -

    text cell type is the default type.

    -

    Precedence

    -

    It is possible to define the type option together with options such as renderer, editor - or validator. Lets look at this example:

    -
    var hot = new Handsontable(document.getElementById('container'), {
    -  columns: [
    -  {
    -    type: 'numeric',
    -    validator: customValidator // validator function defined elsewhere
    -  }
    -]
    -});
    -

    We defined the type for all cells in a column to be numeric. Besides that, we also defined - a validator function directly. In Handsontable, cell functions defined directly always take precedence over functions - associated with cell type, so the above configuration is equivalent to:

    -
    var hot = new Handsontable(document.getElementById('container'), {
    -  columns: [
    -    {
    -      renderer: Handsontable.NumericRenderer,
    -      editor: Handsontable.editors.TextEditor,
    -      validator: customValidator
    -    }
    -  ]
    -});
    -

    There is one more way you can define the configuration using types:

    -
    var hot = new Handsontable(document.getElementById('container'), {
    -  validator: customValidator, // validator function defined elsewhere
    -  columns: [
    -    {
    -      type: 'password'
    -    },
    -    {}
    -  ]
    -});
    -

    We take advantage of the cascade - configuration and define a table with two columns, with validator set to customValidator - function. We also set type of the first column to password. Password cell type - does not define a validator function:

    -
    renderer: Handsontable.PasswordRenderer,
    -editor: Handsontable.editors.PasswordEditor,
    -validator: undefined
    -

    Because type: 'password' is a more specific configuration for the cells in the first column, - than the validator: customValidator, cell functions associated with the password type takes - precedence over the functions defined on the higher level of configuration. Therefore, the equivalent configuration - is:

    -
    var hot = new Handsontable(document.getElementById('container'), {
    -  columns: [
    -    {
    -      renderer: Handsontable.PasswordRenderer,
    -      editor: Handsontable.editors.PasswordEditor,
    -      validator: undefined
    -    }
    -    {
    -      renderer: Handsontable.TextRenderer, // text cell type is the default one
    -      editor: Handsontable.editors.TextEditor, // text cell type is the default one
    -      validator: customValidator
    -    }
    -  ]
    -});
    -

    Cell functions getters

    -

    If, for some reason, you have to get the renderer, editor or validator - function of specific cell you can use standard getCellMeta(row, col) method to get all properties of - particular cell and then refer to cell functions like so:

    -
    var cellProperties = $('#container').handsontable('getCellMeta', 0, 0);
    -// get cell properties for cell [0, 0]
    -cellProperties.renderer; // get cell renderer
    -cellProperties.editor; // get cell editor
    -cellProperties.validator; // get cell validator
    -

    However, you have to remember that getCellMeta() return cell properties "as they are", which - means that if you use cell type to set cell functions, instead of defining functions directly those cell functions - will be undefined:

    -
    var hot = new Handsontable(document.getElementById('container'), {
    -  columns: [
    -    {
    -      type: 'numeric'
    -    }
    -  ]
    -});
    -
    -var cellProperties = hot.getCellMeta(0, 0); // get cell properties for cell [0, 0]
    -cellProperties.renderer; // undefined
    -cellProperties.editor; // undefined
    -cellProperties.validator; // undefined
    -cellProperties.type; // "numeric"
    -

    To get the actual cell function use appropriate cell function getter:

    -
      -
    • getCellRenderer(row, col)
    • -
    • getCellEditor(row, col)
    • -
    • getCellValidator(row, col)
    • -
    -

    Those functions will always return an appropriate value, regardless of whether cell functions have been defined - directly or using a cell type.

    -
    -
    diff --git a/tutorials/cell-types-demos.html b/tutorials/cell-types-demos.html deleted file mode 100644 index e69de29..0000000 diff --git a/tutorials/cell-types.html b/tutorials/cell-types.html deleted file mode 100644 index cd21fcc..0000000 --- a/tutorials/cell-types.html +++ /dev/null @@ -1,121 +0,0 @@ -
    - - - -
    - - Edit on GitHub - -

    Preview of built-in and custom cell types

    -

    The below example shows some of the built-in cell types (in other words, - combinations of cell renderers and editors) available in Handsontable:

    - -

    The same example also shows the declaration of custom cell renderers, namely - yellowRenderer and greenRenderer.

    - -
    -
    -
    - -
    -
    - - -
    - -
    -
    - -
    -

    Anatomy of a cell type

    -

    A cell type is a predefined set of cell properties. Cell type defines what renderer and editor - should be used for a cell. They can also define any different cell property that will be assumed for - each matching cell.

    -

    For example, writing:

    -
    columns: [{
    -  type: 'text'
    -}]
    -

    Equals:

    -
    columns: [{
    -  renderer: Handsontable.renderers.TextRenderer,
    -  editor: Handsontable.editors.TextEditor
    -}]
    -

    This mapping is defined in file - src/cellTypes.js

    -
    -
    - diff --git a/tutorials/change-log.html b/tutorials/change-log.html deleted file mode 100644 index 403051d..0000000 --- a/tutorials/change-log.html +++ /dev/null @@ -1 +0,0 @@ -External link to https://github.com/handsontable/handsontable/releases diff --git a/tutorials/checkbox.html b/tutorials/checkbox.html deleted file mode 100644 index 30e0de0..0000000 --- a/tutorials/checkbox.html +++ /dev/null @@ -1,116 +0,0 @@ -
    - - - -
    - - Edit on GitHub - -

    If you have cells that contains only 2 possible values, you can use checkbox type. - Data in such cells will be rendered as checkbox - and can be easily changed by checking/unchecking the checkbox.

    -

    Checking and unchecking can be performed using mouse or by pressing SPACE. - You can change the state of multiple cells at once. - Simply select cells you want to change and press SPACE

    - -
    -
    -
    - -
    -
    - - -
    - -
    -
    - -
    -

    Checkbox template

    - -

    If you want use other values than true and false, - you have to provide this information using checkedTemplate and - uncheckedTemplate. Handsontable will then update your data using appropriate template. -

    - -
    -
    -
    - -
    -
    - - -
    - -
    -
    -
    diff --git a/tutorials/chromajs.html b/tutorials/chromajs.html deleted file mode 100644 index 7fc64c1..0000000 --- a/tutorials/chromajs.html +++ /dev/null @@ -1,118 +0,0 @@ -
    - - -
    - - Edit on GitHub - -

    - The following demo shows an example of using heatmaps for the values in tha grid's columns. - Changing the values in the grid automatically recalculates the font color for the whole column, thereby - updating a heatmap. The dynamic color scale calculation is done using the excellent - Chroma.js. -

    - -
    -
    -
    - -
    -
    - - -
    - -
    -
    -
    - diff --git a/tutorials/comments.html b/tutorials/comments.html deleted file mode 100644 index bf4e87e..0000000 --- a/tutorials/comments.html +++ /dev/null @@ -1,58 +0,0 @@ -
    - - - -
    - - Edit on GitHub - -

    With option comments: true, you can add and remove cell coments through the context menu. - To initialize Handsontable with predefined comments, provide comment cell property: - {row: 1, col: 1, comment: "Test comment"}

    - -
    -
    -
    - -
    -
    - - -
    - -
    -
    -
    diff --git a/tutorials/compatibility.html b/tutorials/compatibility.html deleted file mode 100644 index 89f6155..0000000 --- a/tutorials/compatibility.html +++ /dev/null @@ -1,39 +0,0 @@ -

    Handsontable was tested against different browsers listed in the comparison table below:

    - - - - - - - - - - - - - - - - - - - - - - - -
    FirefoxChromeInternet ExplorerSafariOperaiOS Safari
    latestlatest9*, 10, 118**latest7, 8
    -
    * Known issues in Internet Explorer 9:
    -
      -
    • Limited ability to handle large amounts of data
    • -
    • Some tests are failing
    • -
    • Choosing options from the context menu may work slow
    • -
    -
    ** Functionality on iOS Safari 8 is limited to simple operations, tested only for iPad 4:
    -
      -
    • Displaying the table with basic configuration
    • -
    • Editing cells using additional editor with navigation arrows
    • -
    • Dragging to scroll the table inside the viewport
    • -
    • Using fill handles to select a cell or range of cells
    • -
    • Highlighting rows and columns
    • -
    diff --git a/tutorials/conditional-formatting.html b/tutorials/conditional-formatting.html deleted file mode 100644 index 6611545..0000000 --- a/tutorials/conditional-formatting.html +++ /dev/null @@ -1,110 +0,0 @@ -
    - -
    - - Edit on GitHub - -

    This demo shows how to use the cell type renderer feature to make some conditional formatting:

    -
      -
    1. first row is read-only, and formatted in green bold text, -
    2. -
    3. all cells in the Nissan column are written in italic,
    4. -
    5. empty cells have silver background,
    6. -
    7. negative numbers are written in red.
    8. -
    - -
    -
    -
    - -
    -
    - - -
    - - -
    -
    -
    - diff --git a/tutorials/context-menu.html b/tutorials/context-menu.html deleted file mode 100644 index b5ee74d..0000000 --- a/tutorials/context-menu.html +++ /dev/null @@ -1,253 +0,0 @@ -
    - - - -
    -

    This page explains how to use and configure right-click context menu with Handsontable:

    - -
    - -
    - - Edit on GitHub - -

    Context menu with default options

    -

    To run the basic configuration of the Context Menu, just set the contextMenu option to true.

    -

    From version 0.11, context menu also works for row and column headers. When the context menu for the row - header is opened, the column options are disabled. Likewise, when the context menu for the column header is opened, - the row options are disabled

    - -
    -
    -
    - -
    -
    - - -
    - -
    -
    - -
    -

    Context menu with specific options

    -

    You can limit options available in the context menu using contextMenu option as an array of strings:

    -
      -
    • row_above
    • -
    • row_below
    • -
    • hsep1
    • -
    • col_left
    • -
    • col_right
    • -
    • hsep2
    • -
    • remove_row
    • -
    • remove_col
    • -
    • hsep3
    • -
    • undo
    • -
    • redo
    • -
    • make_read_only
    • -
    • alignment
    • -
    • borders (with Custom Borders turned on)
    • -
    • commentsAddEdit, commentsRemove (with Comments turned on)
    • -
    - -
    -
    -
    - -
    -
    - - -
    - -
    -
    - -
    -

    Context menu with fully custom configuration

    -

    For greatest configurability, you use contextMenu option as a configuration object as described in jQuery contextMenu documentation.

    -

    This example shows how to set custom text, how to disable - "Remove row" and "Insert row above" for the first row and how to add your own option.

    - -
    -
    -
    - -
    -
    - - -
    - -
    -
    - -
    -

    Copy-paste configuration

    -

    Copy and Paste feature are available in Handsontable by default, but only as key shortcuts (Ctrl (Cmd) + C and Ctrl (Cmd) + V respectively).
    - This plugin makes them available also as a clickable options in the context menu. Unfortunately, due to the browser's security restrictions, - Handsontable is forced to use a third-party flash-based library. We chose to use - - ZeroClipboard - it adds a small invisible flash clip to your website, allowing the user to click on it, and thus save - data to the clipboard.

    -

    Please note, that our Copy/Paste Context Menu plugin requires some additional preparation:

    -
      -
    • ZeroClipboard.js must be present on your server and included in your website's script tag.
    • -
    • ZeroClipboard.swf must also be present at your server
    • -
    -

    To configure Handsontable to use this plugin you need to add a contextMenuCopyPaste config item to your Hansontable instance.

    -

    It can be set to:

    -
      -
    • true - if the ZeroClipboard.swf file is placed in the same directory as the ZeroClipboard.js, or
    • -
    • - {swfPath: [path to the swf file]} -
    • -
    - -
    -
    -
    - - -
    -
    <script src="/bower_components/zeroclipboard/dist/ZeroClipboard.min.js"></script>
    - -
    -
    - - -
    - -
    -
    -
    diff --git a/tutorials/contributing.html b/tutorials/contributing.html deleted file mode 100644 index afd193a..0000000 --- a/tutorials/contributing.html +++ /dev/null @@ -1,25 +0,0 @@ -
    -
    - - Edit on GitHub - -

    Your contributions to the project are very welcome. If you would like to fix a bug or propose a new feature, - you can submit a Pull Request.

    -

    To help us merge your Pull Request, please make sure you follow these points:

    -
      -
    1. Please make your fix on a separate branch. This makes merging much easier.
    2. -
    3. Do not edit files handsontable.js, handsontable.css, - handsontable.full.js, handsontable.full.css. - Instead, try to edit files inside the src/ directory and then use grunt - to make a build. Find more details on Custom Build page.
    4. -
    5. Very important: For any change that you make, please add test cases - in tests/jasmine/spec/ or src/3rdparty/walkontable/test/jasmine/spec/. - This helps us understand the issue and make sure that it will stay fixed forever. See - Testing for details.
    6. -
    7. Very important: Please review our Seven Principles - for instructions on how to maintain a fork and submit patches.
    8. -
    9. Describe the problem in the pull request description.
    10. -
    -

    Your commitment is much appreciated, thanks!

    -
    -
    diff --git a/tutorials/custom-borders.html b/tutorials/custom-borders.html deleted file mode 100644 index a0be461..0000000 --- a/tutorials/custom-borders.html +++ /dev/null @@ -1,92 +0,0 @@ -
    - -
    - - Edit on GitHub - -

    To enable the custom borders feature, set the customBorders option. - It could be set as true or initialized as an array with predefined setup. -

    -

    To initialize Handsontable with predefined custom borders, provide cells coordinates and border styles - in form of an array:

    -
      -
    • with row/col pairs: {row: 2, col: 2, left: { /*...*/ }} -
    • -
    • or with range details: {range: {from: {row: 1, col: 1}, to:{row: 3, col: 4}}, left: { /*...*/ }} -
    • -
    -

    See full example below:

    - -
    -
    -
    - -
    -
    - - -
    - -
    -
    -
    - diff --git a/tutorials/custom-build.html b/tutorials/custom-build.html deleted file mode 100644 index 28bcc36..0000000 --- a/tutorials/custom-build.html +++ /dev/null @@ -1,85 +0,0 @@ -
    - - - -
    - - Edit on GitHub - - -

    The build process is done using Grunt and bunch of its - tasks that are defined in - Gruntfile.js. -

    -

    During the build process, the source files located in the src/* directory are transformed - into output files:

    -
      -
    • ./dist/handsontable.js
    • -
    • ./dist/handsontable.css
    • -
    • ./dist/handsontable.full.js
    • -
    • ./dist/handsontable.full.css (more info about dist packages - here) -
    • -
    • ./dist/handsontable.full.min.js
    • -
    • ./dist/handsontable.full.min.css
    • -
    -

    It is advised that you never modify the above-mentioned files but rather make changes in the src/ - directory and then run a proper build. This is especially important if you want to contribute - your changes back to Handsontable using a pull request.

    -
    - -
    -

    Grunt tasks

    -

    Currently, the following tasks are available for building Handsontable:

    -
      -
    • grunt - runs a single build
    • -
    • grunt build - runs a single build but without code quality checking
    • -
    • grunt jshint - quality-checking
    • -
    • grunt watch - watches for changes in source directory and runs a build when a change is observed. For faster rebuild when a change is observed watcher triggers task which builds files without minify.
    • -
    • grunt --force default watch - runs a single build and then watches for changes
    • -
    • grunt test - runs a single build followed by Jasmine test suite executed in PhantomJS. -
    • -
    -

    You can create your own tasks by editing Gruntfile.js

    -
    -
    -

    Running your first build

    -

    To run your own build, follow the below steps:

    -
      -
    1. Install Node.js (available for Windows, Mac and Linux). This will also install NPM (Node Package Manager) that - handles all the dependencies. Handsontable was tested with Node.js >=0.10 and npm >=1.4 -
    2. -
    3. Clone the Handsontable repository on your local disk and go to the directory where you cloned it.
    4. -
    5. Install Grunt CLI as a global NPM module (npm install -g grunt-cli). More details can be found on - Grunt - Getting Started.
    6. -
    7. Run npm install to download all the dependencies defined in package.json. The - dependencies will be downloaded into a new directory node_modules, that is ignored by Git. -
    8. -
    9. Run grunt to make your first build!
    10. -
    -

    If all is working correctly, you should see something like this:

    - Running your first build -
    -
    -

    Creating a custom package

    -

    For more advanced users we prepared a tool called hot-builder. - With this tool you can customize Handsontable by excluding or including plugins. - To install hot-builder globally run:

    -

    npm install hot-builder -g

    -

    Then to build Handsontable run:

    -

    hot-builder build --output-dir hot-dist

    -

    Select all necessary plugins in your terminal and press Enter. - If it works correctly, you should see something like this:

    -

    Creating a custom package

    -

    And after selecting modules you should see something like this:

    -

    Creating a custom package

    -

    For further details, check out the project page.

    -
    -
    diff --git a/tutorials/custom-buttons.html b/tutorials/custom-buttons.html deleted file mode 100644 index bae0529..0000000 --- a/tutorials/custom-buttons.html +++ /dev/null @@ -1,80 +0,0 @@ -
    - - - - -
    - - Edit on GitHub - -

    The alter method can be used if you want to insert or remove rows and columns using external - buttons. - The below example uses the a custom made - handsontable.removeRow.js plugin for that matter. Move your mouse over a row to see it.

    -

    You can programmatically select a cell using the selectCell method. The below button implements it.

    -

    - -

    -
    - - -
    - -
    -
    -
    - -
    -
    - - -
    - -
    -
    -
    - diff --git a/tutorials/custom-renderers.html b/tutorials/custom-renderers.html deleted file mode 100644 index a086ca2..0000000 --- a/tutorials/custom-renderers.html +++ /dev/null @@ -1,411 +0,0 @@ -
    - - - -
    - - Edit on GitHub - -

    Rendering custom HTML in cells

    -

    This example shows how to use custom cell renderers to display HTML content in a cell. - This is a very powerful feature. Just remember to escape any HTML code that could be used for XSS - attacks. In the below configuration:

    -
      -
    • Title column uses built-in HTML renderer that allows any HTML. This is unsafe if your code comes from untrusted source. Take notice that a Handsontable user can use it to enter <script> or other potentially malicious tags using the cell editor!
    • -
    • Description column also uses HTML renderer (same as above)
    • -
    • Comments column uses a custom renderer (safeHtmlRenderer). This should be safe for user input, because only certain tags are allowed
    • -
    • Cover column accepts image URL as a string and converts it to a <img> in the renderer
    • -
    - -
    -
    -
    - -
    -
    - - -
    - -
    -
    - -
    - - -

    You can also put HTML into row and column headers. If you need to attach events to DOM elements like the checkbox below, just remember to identify the element - by class name, not by id. This is because row and column headers are duplicated in the DOM tree and id - attribute must be unique.

    - -
    -
    -
    - -
    -
    - - -
    - -
    -
    - -
    - - -

    This example makes use of a plugin hook to add a custom dropdown menu to the cell header

    - -
    -
    -
    - -
    -
    - - -
    - - - - -
    -
    -
    diff --git a/tutorials/data-binding.html b/tutorials/data-binding.html deleted file mode 100644 index 36b68e9..0000000 --- a/tutorials/data-binding.html +++ /dev/null @@ -1,150 +0,0 @@ -
    - - - -
    - - Edit on GitHub - -

    Understand binding as a reference

    -

    Handsontable binds to your data source (array or object) by reference. Therefore, all the data entered in - the grid will alter the original data source. In complex applications, you may have a purpose to - change data source programmatically (outside of - Handsontable). A changed being made will not be presented on the screen unless you - refresh the grid on screen using the render method.

    - -
    -
    -
    - -
    -
    - - -
    - -
    -
    - -
    -

    Change data without rendering changes

    -

    In case you want to keep separate working copy of data for Handsontable, it is suggested to clone the data - source before loading it into Handsontable. This can be done with JSON.parse(JSON.stringify(data)) - or some other deep-cloning function.

    - -
    -
    -
    - -
    -
    - - -
    - -
    -
    - -
    -

    Clone data before saving it

    -

    In a similar way, you may find it useful to clone data before saving it. - That would be useful to make programmatic changes that would be saved to server but kept not visible to - the user.

    - -
    -
    -
    - -
    -
    - - -
    - -
    -
    -
    diff --git a/tutorials/data-sources.html b/tutorials/data-sources.html deleted file mode 100644 index d328d4b..0000000 --- a/tutorials/data-sources.html +++ /dev/null @@ -1,334 +0,0 @@ -
    - -
    -

    This page shows how to use Handsontable with various data sources:

    - -

    Please take note that Handsontable will change the original data source.

    -
    - -
    - - Edit on GitHub - -

    Array data source

    -

    The most popular way of binding data with Handsontable is to use array of arrays.

    - -
    -
    -
    - -
    -
    - - -
    - -
    -
    - -
    -

    Array data source with hidden columns

    -

    Let's say, you want the same data source, but without the Kia column:

    - -
    -
    -
    - -
    -
    - - -
    - -
    -
    - -
    -

    Object data source

    -

    You can use array of objects as a data source.

    - -
    -
    -
    - -
    -
    - - -
    - -
    -
    - -
    -

    Object data source with column mapping (nested)

    -

    Some people have nested objects. They can also be used at the data source with a little bit of column - mapping. The mapping is done using the columns option.

    - -
    -
    -
    - -
    -
    - - -
    - -
    -
    - -
    -

    Object data source with custom data schema

    -

    When you use object data binding, Handsontable needs to know the data structure to create when you add a new - row. If your data source contains at least one row, Handsontable will figure out the data structure based on the - first row.

    -

    In case you want to start with an empty data source, you will need to provide the dataSchema - option that contains the data structure for any new row added to the grid. - The below example shows custom data schema with an empty data source:

    - -
    -
    -
    - -
    -
    - - -
    - -
    -
    - -
    -

    Function data source and schema

    -

    - If your dataSchema is actually a constructor of an - object that doesn't directly expose its members, like a Backbone.js - model, you can specify functions for the data member - of each columns item. -

    -

    The below example shows a small example of using such objects:

    - -
    -
    -
    - -
    -
    - - -
    - -
    -
    -
    diff --git a/tutorials/data-validation-demos.html b/tutorials/data-validation-demos.html deleted file mode 100644 index e69de29..0000000 diff --git a/tutorials/data-validation.html b/tutorials/data-validation.html deleted file mode 100644 index 445f1b2..0000000 --- a/tutorials/data-validation.html +++ /dev/null @@ -1,108 +0,0 @@ -
    - -
    - - Edit on GitHub - -

    Use the validator (see options page) method to easily - validate synchronous or asynchronous changes to a cell. If you - need more control, beforeValidate and afterValidate plugin hooks are available (see hooks page). - In the below example, email_validator_fn is an async validator that resolves after 1000 ms. -

    -

    Use the allowInvalid option (see options page) to define if the - grid should accept input that does not validate. - If you need to modify the input (e.g. censor bad words, uppercase first letter), use the plugin hook beforeChange - (see hooks page). -

    - -
    -
    -
    - -

    Callback console: [[row, col, oldValue, newValue], ...]

    -

    Edit the above grid to see callback

    - -
    -
    - - -
    - -
    -
    -
    - diff --git a/tutorials/date.html b/tutorials/date.html deleted file mode 100644 index bf14ffe..0000000 --- a/tutorials/date.html +++ /dev/null @@ -1,84 +0,0 @@ -
    - - - -
    - - Edit on GitHub - -

    To trigger the Date cell type, use the option type: 'date' in columns array - or cells function. The Date cell uses Pikaday datepicker as - the UI control. Pikaday uses Moment.js as a date formatter. -

    Note that Date cell requires additional files in your <head> : -

      -
    • /dist/moment/moment.js
    • -
    • /dist/pikaday/pikaday.js
    • -
    • /dist/pikaday/css/pikaday.css
    • -
    -

    All data entered to the data-typed cells are validated agains the default date format (DD/MM/YYYY), unless another - format is provided. If you enable the correctFormat config item, the dates will be automatically formatted to - match the desired format.

    - -
    -
    -
    - -
    -
    - - -
    - -
    -
    -
    - diff --git a/tutorials/demos-1.html b/tutorials/demos-1.html deleted file mode 100644 index d0658f2..0000000 --- a/tutorials/demos-1.html +++ /dev/null @@ -1,10 +0,0 @@ - - - - - - - - - - diff --git a/tutorials/demos-7.html b/tutorials/demos-7.html deleted file mode 100644 index e69de29..0000000 diff --git a/tutorials/demos-8.html b/tutorials/demos-8.html deleted file mode 100644 index e69de29..0000000 diff --git a/tutorials/demos-9.html b/tutorials/demos-9.html deleted file mode 100644 index e69de29..0000000 diff --git a/tutorials/developer-guide.html b/tutorials/developer-guide.html deleted file mode 100644 index 8b13789..0000000 --- a/tutorials/developer-guide.html +++ /dev/null @@ -1 +0,0 @@ - diff --git a/tutorials/drag-down.html b/tutorials/drag-down.html deleted file mode 100644 index f4f452c..0000000 --- a/tutorials/drag-down.html +++ /dev/null @@ -1,51 +0,0 @@ -
    - -
    - - Edit on GitHub - -

    Notice the little square (fill handle) in the corner of the selected cell. You can drag it - (drag-down) to repeat the values from the cell. Double click the fill handle in cell B4 (value "30") - to fill the selection down to the last value in neighbouring column, just like it would in LibreOffice or Google Docs.

    - -
    -
    -
    - -
    -
    - - -
    - - -
    -
    -
    - diff --git a/tutorials/dropdown.html b/tutorials/dropdown.html deleted file mode 100644 index c635436..0000000 --- a/tutorials/dropdown.html +++ /dev/null @@ -1,64 +0,0 @@ -
    - - - -
    - - - Edit on GitHub - -

    This example shows the usage of the Dropdown feature. Dropdown is based on Autocomplete cell type. - All options used by autocomplete cell type apply to dropdown as well.

    -

    Internally, cell {type: "dropdown"} is equivalent to cell {type: "autocomplete", strict: - true, filter: false}. Therefore you can think of dropdown as a searchable <select>.

    - -
    -
    -
    - -
    -
    - - -
    - -
    -
    -
    diff --git a/tutorials/features.html b/tutorials/features.html deleted file mode 100644 index 79d06a6..0000000 --- a/tutorials/features.html +++ /dev/null @@ -1,248 +0,0 @@ -
    - - Edit on GitHub - -

    Handsontable comprises of the core engine and functional plugins. You can find a complete list of them below:

    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    CategoryNameDescriptionDemo
    Cell featureDrag-downSelect and drag the fill handle (small square in the bottom right corner of the cell) across or down to fill more - cells with data series - Demo
    Cell featureMerge cellsDisplay cells across multiple rows or columnsDemo
    Cell featureAlignmentDecide where the content is placed within the cell or a range of cellsDemo
    Cell featureRead-onlyLock the cell or a range of cells to disallow altering themDemo
    Cell typeCustom HTMLDisplay HTML content in a cell or headerDemo
    Cell typeNumericType a custom number format in a cellDemo
    Cell typeDateUse a date picker to select a dateDemo
    Cell typeCheckboxAdd a checkbox to a cell to indicate binary choicesDemo
    Cell typeSelectCreate a simple dropdown list of choices in a cellDemo
    Cell typeDropdownCreate an advanced dropdown list of choices in a cellDemo
    Cell typeAutocompleteChoose one of the suggested options while typing or entering a custom valueDemo
    Cell typePasswordUse asterisks to mask the value in a cellDemo
    Cell typeHandsontableUse Handsontable itself as a custom cell editorDemo
    Rows and columnsFixed rows and columnsDefine which rows or columns are visible while scrolling down or across the tableDemo
    Rows and columnsScrollbarsUse native scrollbars to navigate within the tableDemo
    Rows and columnsHighlighting rows or columnsIndicate the entire active column or rowDemo
    Rows and columnsStretchingAllow columns to the parent container widthDemo
    Rows and columnsGroupingShow or hide different sections of the tableDemo
    Rows and columnsResizingDrag the sizing handle to change the size of column or rowDemo
    Rows and columnsFreezingCreate freeze columns to keep them visible while scrollingDemo
    Rows and columnsMovingDrag rows or columns to swap them within the tableDemo
    Rows and columnsPre-populating new rowsCreate empty cells with predefined types or valuesDemo
    ValidationData validationControl what values can be entered into a cellDemo
    NavigationPaginationLimited number of records displayed in a single viewDemo
    NavigationSearch for valuesSearch through the content with the search fieldDemo
    SortingSorting dataSort data in ascending or descending order throughout the columnDemo
    AppearanceConditional formattingDefine how specific cells are formatted depending on their valuesDemo
    AppearanceCustom bordersApply custom border style around cells or range of cellsDemo
    CalculationFormula supportUse functions to calculate numerical information within a cell or range of cellsDemo
    MobileMobiles and tabletsDisplay and edit data on mobile phones and tabletsDemo
    UtilityContext menuInvoke a shortcut menu to choose an action related to the selected objectDemo
    UtilityCustom buttonsInsert and remove column or row using custom action buttonsDemo
    UtilityCommentsProvide an additional note about the cell to help better understand its contentDemo
    IntegrationjQueryFull compatibility with jQueryDemo
    IntegrationgRaphaƫl chartsCreate data visualization using gRaphaƫl chartsDemo
    IntegrationChroma.jsCreate a heatmap for the values in the tableDemo
    IntegrationBootstrapApply Bootstrap's styles into HandsontableDemo
    IntegrationBackbone.jsSee how Backbone's models and collections can work with HandsontableDemo
    -
    diff --git a/tutorials/fixed-rows-and-columns.html b/tutorials/fixed-rows-and-columns.html deleted file mode 100644 index c022426..0000000 --- a/tutorials/fixed-rows-and-columns.html +++ /dev/null @@ -1,57 +0,0 @@ -
    - -
    - - Edit on GitHub - -

    Specify two fixed rows with fixedRowsTop: 2 and two fixed columns with fixedColumnsLeft: - 2 option.

    -

    Note: You'll need horizontal scrollbars, so just set a container width and overflow: - hidden in CSS.

    - - - -
    -
    -
    - -
    -
    - - -
    - -
    -
    -
    - diff --git a/tutorials/formula-support-demos.html b/tutorials/formula-support-demos.html deleted file mode 100644 index e69de29..0000000 diff --git a/tutorials/formula-support.html b/tutorials/formula-support.html deleted file mode 100644 index 63b0db5..0000000 --- a/tutorials/formula-support.html +++ /dev/null @@ -1,29 +0,0 @@ -
    - -
    - - Edit on GitHub - -
    - This part of documentation is still in development. If you'd like to contribute to this page, - - enhance it on GitHub. - × -
    -

    A formula parser for Handsontable is based on RuleJS library which takes most of functions from - Formula.js.

    -

    Find the list of features below:

    -
      -
    • math functions: + - * / ^
    • -
    • logical functions: = > < >= <= <> NOT
    • -
    • error handling: #DIV/0! #ERROR #VALUE! #REF! #NAME? #N/A
    • -
    • parser for formulas (list of supported formulas)
    • -
    • absolute cell references: $A$1 $A1 A$1
    • -
    • nested functions
    • -
    • basic auto-fill
    • -
    • dynamic updates
    • -
    -

    Go to demo to see it live

    -
    -
    - diff --git a/tutorials/freezing.html b/tutorials/freezing.html deleted file mode 100644 index c0558d6..0000000 --- a/tutorials/freezing.html +++ /dev/null @@ -1,46 +0,0 @@ -
    - -
    - - Edit on GitHub - -

    In order to manually freeze a column (in another words - make it fixed), you need to set the manualColumnFreeze - config item to true in Handsontable initialization. When the Manual Column Freeze plugin is enabled, you can freeze any non-fixed column and unfreeze any - fixed column in your Handsontable instance using the Context Menu.

    -

    Note: to properly use this plugin, you need to have the Context Menu plugin enabled.

    - -
    -
    -
    - -
    -
    - - -
    - -
    -
    -
    - diff --git a/tutorials/general-configuration-demos.html b/tutorials/general-configuration-demos.html deleted file mode 100644 index e69de29..0000000 diff --git a/tutorials/getting-started.html b/tutorials/getting-started.html deleted file mode 100644 index e69de29..0000000 diff --git a/tutorials/github.html b/tutorials/github.html deleted file mode 100644 index d0658f2..0000000 --- a/tutorials/github.html +++ /dev/null @@ -1,10 +0,0 @@ - - - - - - - - - - diff --git a/tutorials/google-group.html b/tutorials/google-group.html deleted file mode 100644 index d0658f2..0000000 --- a/tutorials/google-group.html +++ /dev/null @@ -1,10 +0,0 @@ - - - - - - - - - - diff --git a/tutorials/graphael-charts.html b/tutorials/graphael-charts.html deleted file mode 100644 index 93b31cc..0000000 --- a/tutorials/graphael-charts.html +++ /dev/null @@ -1,141 +0,0 @@ -
    - - - - -
    - - Edit on GitHub - -

    The following demo shows an example of data visualisation using gRaphaƫl's bar charts.

    -
      -
    • Choosing any of the Aggregate buttons changes the currently used column
    • -
    • Editing data in the grid automatically refreshes the chart with updated values.
    • -
    - -
    -
    -
    - -
    -
    -

    Aggreagate by:

    -
    - - - -
    -
    -
    - -
    -
    - - -
    - -
    -
    -
    - diff --git a/tutorials/grouping-and-ungrouping.html b/tutorials/grouping-and-ungrouping.html deleted file mode 100644 index 04fbfe8..0000000 --- a/tutorials/grouping-and-ungrouping.html +++ /dev/null @@ -1,63 +0,0 @@ -
    - -
    - - Edit on GitHub - -

    To enable this feature, use settings groups: true

    -

    It's also possible to define groups as a arraygroups:[]

    - -
    -
    -
    - -
    -
    - - -
    - -
    -
    -
    - diff --git a/tutorials/handsontable.html b/tutorials/handsontable.html deleted file mode 100644 index efb1c15..0000000 --- a/tutorials/handsontable.html +++ /dev/null @@ -1,114 +0,0 @@ -
    - - - -
    - - Edit on GitHub - -

    This page shows using Handsontable as a cell editor in Handsontable (sometimes - referred as HOT-in-HOT).

    -

    HOT-in-HOT opens by any of the following:

    -
      -
    • F2 or ENTER key is pressed while the cell is selected,
    • -
    • the triangle icon is clicked,
    • -
    • the cell content is double clicked.
    • -
    -

    While HOT-in-HOT is opened, the text field above the HOT-in-HOT remains focused at all times.

    -

    Keyboard bindings while the HOT-in-HOT is opened:

    -
      -
    • ESC - close editor (cancel change),
    • -
    • ENTER - close editor (apply change*), move the selection in the main HOT downwards (or according to enterMoves setting),
    • -
    • TAB - behave as the ENTER key, but move the selection in the main HOT to the right (or according to tabMoves setting),
    • -
    • Arrow down - move the selection in HOT-in-HOT downwards. If the last row was selected, has no effect,
    • -
    • Arrow up - move the selection in HOT-in-HOT upwards. If the first row was selected, deselect. If HOT-in-HOT was deselected, behave as the ENTER key but move the selection in the main HOT upwards,
    • -
    • Arrow right - move the text cursor in the text field to the left. If the text cursor was at the start position, behave as the ENTER key but move the selection in the main HOT to the left,
    • -
    • Arrow left - move the text cursor in the text field to the right. If the text cursor was at the end position, behave as the TAB key.
    • -
    -

    Mouse click outside of the editor or on one of the cells in HOT-in-HOT applies change.

    -

    *apply change means: The value of the cell highlighted or clicked in HOT-in-HOT is applied as new cell value in the main HOT. If no cell in HOT-in-HOT is selected, the value of the text field is used instead.

    - -
    -
    -
    - -
    -
    - - -
    - -
    -
    -
    - diff --git a/tutorials/highlighting-current.html b/tutorials/highlighting-current.html deleted file mode 100644 index 640650d..0000000 --- a/tutorials/highlighting-current.html +++ /dev/null @@ -1,71 +0,0 @@ -
    - - - -
    - - Edit on GitHub - -

    Use options currentRowClassName and currentColumnClassName

    - -
    -
    -
    - -
    -
    - - -
    - - -
    -
    -
    - diff --git a/tutorials/hot-table.html b/tutorials/hot-table.html deleted file mode 100644 index bd80c8d..0000000 --- a/tutorials/hot-table.html +++ /dev/null @@ -1 +0,0 @@ -External link to https://github.com/handsontable/hot-table diff --git a/tutorials/index.html b/tutorials/index.html deleted file mode 100644 index fcc3644..0000000 --- a/tutorials/index.html +++ /dev/null @@ -1 +0,0 @@ -META REDIRECT diff --git a/tutorials/integrations-demos.html b/tutorials/integrations-demos.html deleted file mode 100644 index e69de29..0000000 diff --git a/tutorials/jquery.html b/tutorials/jquery.html deleted file mode 100644 index 2a1cf41..0000000 --- a/tutorials/jquery.html +++ /dev/null @@ -1,74 +0,0 @@ -
    - - - -
    - - Edit on GitHub - -

    - jQuery is a library, which makes DOM manipulations and event handling easier.

    - Handsontable is fully compatible with jQuery - the small example below shows that the integration - between the two is quick and intuitive. In order to use Handsontable as a jQuery plugin, - you need to do some basic preparation: -

      -
    • Include jQuery to your page, before including Handsontable
      - - <script src="handsontable/lib/jquery.min.js"></script>
      - <script src="handsontable/dist/handsontable.full.js"></script>
      - <link rel="stylesheet" media="screen" href="handsontable/dist/handsontable.full.css">
      -
      -
    • -
    • - Run handsontable() plugin constructor on an empty div as in the below code example: -
    • -
    -

    - -
    -
    -
    - -
    -
    - - -
    - -
    -
    -
    - diff --git a/tutorials/keyboard-shortcuts.html b/tutorials/keyboard-shortcuts.html deleted file mode 100644 index 0bb0473..0000000 --- a/tutorials/keyboard-shortcuts.html +++ /dev/null @@ -1,76 +0,0 @@ -
    - -
    -

    On this page:

    - -
    - -
    - - Edit on GitHub - - -
      -
    • Arrow Up ↑ ā€“ move to the cell above current active cell (if exists)
    • -
    • Arrow Down ↓ ā€“ move to cell underneath current active cell (if exists)
    • -
    • Arrow Right → ā€“ move to the cell on the right side of the current active cell (if exists)
    • -
    • Arrow Left ← ā€“ move to the cell on the left side of current active cell (if exists)
    • -
    • Tab ā€“ move to the cell on the right side of the current active cell (if exists)
    • -
    • Tab + Shift ā€“ move to the cell on the left side of current active cell (if exists)
    • -
    • Home ā€“ move to the first cell in a row
    • -
    • End ā€“ move to the last cell in a row
    • -
    • Ctrl + Home ā€“ move to the first cell in a column
    • -
    • Ctrl + End ā€“ move to the last cell in a column
    • -
    -
    -
    -

    Selection

    -
      -
    • Ctrl + A ā€“ select all
    • -
    • Shift + Arrow Up ↑ ā€“ extend selection of the cell above
    • -
    • Shift + Arrow Down ↓ ā€“ extend selection of the cell underneath
    • -
    • Shift + Arrow Right → ā€“ extend selection of the cell on the right
    • -
    • Shift + Arrow Left ← ā€“ extend selection of the cell on the left
    • -
    • Shift + Home ā€“ select all cells in the row to the right including the current cell
    • -
    • Shift + End ā€“ select all cells in the row to the left including the current cell
    • -
    • Ctrl + Shift + Home ā€“ select all cells in the column to the top including the current cell
    • -
    • Ctrl + Shift + End ā€“ select all cells in the column to the bottom including the current cell
    • -
    -
    -
    -

    Editor

    -
      -
    • Enter ā€“ open/close cell editor
    • -
    • F2 ā€“ open cell editor
    • -
    • Esc ā€“ cancel editing and close cell editor
    • -
    • Backspace ā€“ empty cell
    • -
    • Delete ā€“ empty cell
    • -
    • Ctrl + C ā€“ copy cell's content
    • -
    • Ctrl + X ā€“ cut cell's content
    • -
    • Ctrl + V ā€“ pastle cell's content
    • -
    • Ctrl + Enter - fill all selected cells with edited cell's value
    • -
    • Ctrl + Z ā€“ undo
    • -
    • Ctrl + Y ā€“ redo
    • -
    -
    -
    - -
      -
    • Arrow Down ↓ ā€“ move to the next option in context menu
    • -
    • Arrow Up ↑ ā€“ move to the previous option in context menu
    • -
    • Enter ā€“ select option from context menu
    • -
    -
    -
    -

    Merge cells

    -
      -
    • Ctrl + M ā€“ merge/unmerge selected cells
    • -
    -
    -
    diff --git a/tutorials/licensing.html b/tutorials/licensing.html deleted file mode 100644 index d5885c4..0000000 --- a/tutorials/licensing.html +++ /dev/null @@ -1 +0,0 @@ -External link to the new page with license described: http://handsontable.com/licensing.html diff --git a/tutorials/load-and-save.html b/tutorials/load-and-save.html deleted file mode 100644 index 778411b..0000000 --- a/tutorials/load-and-save.html +++ /dev/null @@ -1,145 +0,0 @@ -
    - - - -
    - - Edit on GitHub - -

    Saving data using onChange callback

    -

    Use the onChange callback to track changes made in the table. In the example below, - ajax is used to load and save grid data. Note that this is just a mockup. - Nothing is actually saved. You have to implement the server-side part by yourself.

    - -
    -
    - - - -
    -
    Click "Load" to load data from server
    -
    -
    - -
    -
    - -
    - -
    -
    - -
    -

    Saving data locally

    -

    You can save any sort of data in local storage in to preserve table state between page reloads. - In order to enable data storage mechanism, persistentState option must be set to true - (you can set it either during Handsontable initialization or using the updateSettings method).

    -

    When persistentState is enabled it exposes 3 hooks:

    -
      -
    • -

      persistentStateSave (key: String, value: Mixed)

      -

      Saves value under given key in browser local storage.

      -
    • -
    • -

      persistentStateLoad (key: String, valuePlaceholder: Object)

      -

      Loads value, saved under given key, form browser local storage. The loaded value - will be saved in valuePlaceholder.value (this is due to specific behaviour of PluginHooks.execute() - method). If no value have been saved under key valuePlaceholder.value will be - undefined.

      -
    • -
    • -

      persistentStateReset (key: String)

      -

      Clears the value saved under key. If no key is given, all values associated - with table will be cleared.

      -
    • -
    -
    -
    -

    Why should I use persistentState rather than regular LocalStorage API?

    -

    The main reason behind using persistentState hooks rather than regular LocalStorage API is - that it ensures separation of data stored by multiple Handsontable instances. In other words, - if you have two (or more) instances of Handsontable on one page, data saved by one instance won't be - accessible by the second instance. Those two instances can store data under the same key and - no data would be overwritten.

    -

    In order for the data separation to work properly, make sure that each instance - of Handsontable has a unique id.

    -
    -
    - diff --git a/tutorials/merge-cells.html b/tutorials/merge-cells.html deleted file mode 100644 index e53c7ec..0000000 --- a/tutorials/merge-cells.html +++ /dev/null @@ -1,48 +0,0 @@ -
    - -
    - - Edit on GitHub - -

    To enable the merge cells feature, set the mergeCells option to be true or an - array. To initialize Handsontable with predefined merged cells, provide merged cells details in form of an - array: mergeCells: [{row: 1, col: 1, rowspan: 2, colspan: 2}]

    - -
    -
    -
    - -
    -
    - - -
    - -
    -
    -
    - diff --git a/tutorials/milestones.html b/tutorials/milestones.html deleted file mode 100644 index ac720a9..0000000 --- a/tutorials/milestones.html +++ /dev/null @@ -1 +0,0 @@ -External link to https://github.com/handsontable/handsontable/milestones diff --git a/tutorials/mobiles-and-tablets-demos.html b/tutorials/mobiles-and-tablets-demos.html deleted file mode 100644 index e69de29..0000000 diff --git a/tutorials/mobiles-and-tablets.html b/tutorials/mobiles-and-tablets.html deleted file mode 100644 index 3a87e34..0000000 --- a/tutorials/mobiles-and-tablets.html +++ /dev/null @@ -1,49 +0,0 @@ -
    - -
    - - Edit on GitHub - -
    - This part of documentation is still in development. If you'd like to contribute to this page, - - enhance it on GitHub. - × -
    -

    Currently Handsontable supports only iPad 4 in a basic scope. - Mobile editor and selecting modes are enabled automatically if you're viewing Handsontable on a mobile device.

    -

    Open this page on iPad 4 and play with the demo below:

    - -
    -
    -
    - -
    -
    - - -
    - -
    -
    -
    - diff --git a/tutorials/moving.html b/tutorials/moving.html deleted file mode 100644 index fd9e397..0000000 --- a/tutorials/moving.html +++ /dev/null @@ -1,46 +0,0 @@ -
    - -
    - - Edit on GitHub - -

    To enable these features, use settings manualColumnMove: true and manualRowMove: true

    -

    The draggable move handle appears:

    -
      -
    • in the right part of the column header,
    • -
    • in the top part of the row header.
    • -
    - -
    -
    -
    - -
    -
    - - -
    - -
    -
    -
    - diff --git a/tutorials/navigation-demos.html b/tutorials/navigation-demos.html deleted file mode 100644 index e69de29..0000000 diff --git a/tutorials/ngHandsontable.html b/tutorials/ngHandsontable.html deleted file mode 100644 index 92d719e..0000000 --- a/tutorials/ngHandsontable.html +++ /dev/null @@ -1,2 +0,0 @@ -External link to -https://github.com/handsontable/ngHandsontable diff --git a/tutorials/numeric.html b/tutorials/numeric.html deleted file mode 100644 index f7bcdd1..0000000 --- a/tutorials/numeric.html +++ /dev/null @@ -1,82 +0,0 @@ -
    - - - - - -
    - - Edit on GitHub - -

    By default, Handsontable treats all cell values as string type. This is because <textarea> - returns a string as its value. In many cases you will prefer cell values to be treated as number type. - This allows to format numbers nicely and sort them correctly.

    -

    To trigger the Numeric cell type, use the option type: 'numeric' in columns array - or cells function Numeric cell type uses Numeral.js as the formatting library. - Head over to their website to learn about the formatting syntax.

    -

    To use number formatting style valid for your language (i18n), load language definition to Numeral.js. See - "Languages" section in Numeral.js docs for more info.

    - -
    -
    -
    - -
    -
    - - -
    - -
    -
    -
    - diff --git a/tutorials/overview.html b/tutorials/overview.html deleted file mode 100644 index c44bd84..0000000 --- a/tutorials/overview.html +++ /dev/null @@ -1,32 +0,0 @@ -
    -
    - - Edit on GitHub - -

    The material in this section is to provide you with comprehensive knowledge on different parts of Handsontable and its - dependencies in a structured manner. We keep this documentation simple and unequivocal for those with moderate - experience in development for whom the learning curve may be a bit steep. Every chapter comes with a corresponding - example and a piece of code depicting any given aspect of building upon already existing code.

    -

    From the conceptual point of view this library is not a finished product. We have put a lot of work into keeping this - well maintained but if you experience rough edges, just - open a new GitHub issue about it.

    -

    To begin hacking on Handsontable start from the Data binding section - which explains nuances of connecting Handsontable to any data source of your choice.

    - -

    Mobile Apps

    -

    As for the current version (), Handsontable is not a mobile-friendly component. - Despite the fact that basic functionality works fine with iPad 4, it's still experimental distribution. - We aim to make Handsontable much more responsive as soon as possible.

    - -

    Become proficient and contribute

    -

    If your project requires deep customization of Handsontable you may be interested in learning more about the - rendering engine, performance issues and testing procedures. It would be great to incorporate your changes into - the next official version of Handsontable so if you are willing to contribute to this project don't forget to make pull - requests. Read more about contributing principles.

    - -

    Future versions

    -

    To see the the rough plan for the upcoming releases, see our - Milestones on GitHub or - Roadmap on Trello

    -
    -
    diff --git a/tutorials/pagination.html b/tutorials/pagination.html deleted file mode 100644 index 89f6510..0000000 --- a/tutorials/pagination.html +++ /dev/null @@ -1,83 +0,0 @@ -
    - -
    - - Edit on GitHub - - -
    -
    - -
    - -
    -
    - - -
    - -
    -
    -
    - diff --git a/tutorials/password.html b/tutorials/password.html deleted file mode 100644 index 0bf59a5..0000000 --- a/tutorials/password.html +++ /dev/null @@ -1,143 +0,0 @@ -
    - - - - - -
    - - Edit on GitHub - -

    Password cell type

    -

    This kind of cell behaves like a text cell with a difference that it masks it's value using asterisk in cell renderer. - For the cell editor, a <input type="password"> field is used. Data is stored in the data source as plain text.

    - -
    -
    -
    - -
    -
    - - -
    - -
    -
    - -
    -

    Fixed hash length

    -

    By default every hash has length equal to the length of value that - it corresponds with. Use option hashLength to set fixed hash length.

    - -
    -
    -
    - -
    -
    - - -
    - -
    -
    - -
    -

    Custom hash symbol

    -

    By default every hash consists of asterisks *. Use option hashSymbol - to set custom hash symbol. You can use any character, entity or event HTML. Note that you can't - change symbol used by the input field due to browsers limitations.

    - -
    -
    -
    - -
    -
    - - -
    - -
    -
    -
    diff --git a/tutorials/performance-tips.html b/tutorials/performance-tips.html deleted file mode 100644 index 37dc1b5..0000000 --- a/tutorials/performance-tips.html +++ /dev/null @@ -1,114 +0,0 @@ -
    - - - -
    - - Edit on GitHub - -

    Optimizing JavaScript

    - -
    - -
    -

    Optimizing DOM

    - -
    - -
    -

    Optimizing CSS

    - -
    - - -
    diff --git a/tutorials/pre-populating-new-rows.html b/tutorials/pre-populating-new-rows.html deleted file mode 100644 index 07995aa..0000000 --- a/tutorials/pre-populating-new-rows.html +++ /dev/null @@ -1,113 +0,0 @@ -
    - -
    - - Edit on GitHub - -

    Below example shows how cell renderers can be used to present the template values for empty rows. - When any cell in the empty row is edited, the onChange callback fills the row with the template values.

    - -
    -
    -
    - -
    -
    - - -
    - -
    -
    -
    - diff --git a/tutorials/quick-start.html b/tutorials/quick-start.html deleted file mode 100644 index a9f66a9..0000000 --- a/tutorials/quick-start.html +++ /dev/null @@ -1,148 +0,0 @@ -
    - -
    - - Edit on GitHub - -
    - Would you like to help us improve Handsontable? - - Fill out the 3-minute survey to do that right away. - × -
    -

    - Handsontable is a JavaScript component for creating Excel-like spreadsheets in modern web apps. - Its virtual rendering engine allows you to play with large amounts of data without worrying about performance issues. - You will also find it easy to learn and use, however if you get stuck with something, don't hesitate to ask on - Google Group - or open a relevant issue. -

    -

    - This documentation is organized into different categories. If you are new to Handsontable then start - from the Getting started section that will give you a good idea on what Handsontable is and what powers it has. - In the next step read the overview of the Developer Guide which shows how to dive - into more complicated topics. Handsontable doesn't require high programming skills but if you need - any custom modifications you may need assistance from someone more experienced in JavaScript. -

    -

    - We consider Handsontable as work in progress so - your feedback - is highly appreciated. -

    -
    -
    -

    On this page youā€™ll find out how to get through:

    - -
    -
    - -
    -

    Installing Handsontable

    -

    There are many ways to install Handsontable but if you just want to play with it instantly, - see our JSFiddle demo. -

    -
      -
    1. -

      A recommended way to install Handsontable is through - Bower package manager using the following command: -

      - bower install handsontable --save -

      -

      Bower manages all dependencies so you can just sit back and wait. - After Handsontable is downloaded, embed the code to your project ā€“ you will find all the files in the - /dist directory, therefore your code probably looks like:

      -
        -
      • - <script src="/dist/handsontable.full.js"></script> -
      • -
      • - <link rel="stylesheet" media="screen" href="/dist/handsontable.full.css"> -
      • -
      -

      -
    2. -
    3. -

      Download Handsontable from GitHub - directly as a ZIP file. Note that by doing that youā€™ll need to manage all dependencies by yourself:

      - -
    4. -
    5. -

      Embed the latest, full distribution of the library that includes all dependencies - and is served from our directory. Note that requires our servers to be up and running.

      -
        -
      • - <script src="http://handsontable.com/dist/handsontable.full.js"></script> -
      • -
      • - <link rel="stylesheet" media="screen" href="http://handsontable.com/dist/handsontable.full.css"> -
      • -
      -
    6. -
    7. For further hacking the project or building a custom Handsontable, see the - Custom Build page.
    8. -
    -
    -
    -

    Basic initialization

    -

    If you bundled all together, then itā€™s time to play with Handsontable a bit. - Start by creating a container holding the grid: -

    -

    - <div id="example"></div> -

    -

    Then pass a reference to that div and load some data if you wish:

    -
    -      var data = [
    -  ["", "Ford", "Volvo", "Toyota", "Honda"],
    -  ["2014", 10, 11, 12, 13],
    -  ["2015", 20, 11, 14, 13],
    -  ["2016", 30, 15, 12, 13]
    -];
    -
    -var container = document.getElementById('example');
    -var hot = new Handsontable(container, {
    -  data: data,
    -  minSpareRows: 1,
    -  rowHeaders: true,
    -  colHeaders: true,
    -  contextMenu: true
    -});
    -
    -    
    - VoilĆ ! -

    Your Handsontable is now running and displaying exemplary data. In the above example we decided to - use only a few Options to make our table more functional but - you can play with more of them. -

    -
    -
    -

    Updating

    -

    To update Handsontable, first do a backup of the whole directory - in case of problems. Then use the following - Bower command:

    -

    bower update handsontable

    -

    That will update only Handsontable, leaving other dependencies untouched..

    -
    -
    -

    Next steps

    -

    The learning curve of Handsontable may be a bit steep for some of you, - thatā€™s why we prepared guides covering most popular topics. We suggest to read them first:

    - -
    -
    diff --git a/tutorials/read-only.html b/tutorials/read-only.html deleted file mode 100644 index 9caf042..0000000 --- a/tutorials/read-only.html +++ /dev/null @@ -1,122 +0,0 @@ -
    - - - -
    -

    This page shows ways to configure columns or cells to be read only:

    - -
    - -
    - - Edit on GitHub - -

    Read-only columns

    -

    In many usage cases, you will need to configure a certain column to be read only. This column will be - available for keyboard navigation and CTRL+C. Only editing and pasting data will be disabled.

    -

    To make a column read-only, declare it in the columns setting. You can also define a special - renderer function that will dim the read-only values.

    - -
    -
    -
    - -
    -
    - - -
    - -
    -
    - -
    -

    Read-only specific cells

    -

    This example makes cells that contain the word "Nissan" read only.

    -

    It forces all cells to be rendered by myReadonlyRenderer, which will decide whether a cell is - really read only by checking its readOnly property.

    - -
    -
    -
    - -
    -
    - - -
    - -
    -
    -
    diff --git a/tutorials/releasing.html b/tutorials/releasing.html deleted file mode 100644 index 484864e..0000000 --- a/tutorials/releasing.html +++ /dev/null @@ -1,55 +0,0 @@ -
    - -
    - - Edit on GitHub - -

    Note that Handsontable always uses three-segment version numbers: 0.15.0, 0.15.1, - 0.15.0, etc.
    For beta releases, we use 0.15.0-beta1, 0.15.0-beta2, etc.

    -

    To release a new version of Handsontable:

    -
      -
    1. Put all changes you consider ready for release to develop branch.
    2. -
    3. Start a release (git flow release start 0.12.0). Git Flow will checkout the new release branch.
    4. -
    5. -

      On release branch:

      -
        -
      • run grunt test to make sure tests run in PhantomJS
      • -
      • run grunt sauce to make sure tests pass in other browsers
      • -
      • perform the regression Smoke test scenario
      • -
      • update files package.json, handsontable.jquery.json, bower.json - with next version number 0.12.0. You can also search the files for occurrence of the previous version number and replace it
      • -
      • run grunt to build a version with the new version number inside it
      • -
      • verify that dist/handsontable.full.js contains the new version number in second line
      • -
      • commit changes git commit -m "0.12.0"
      • -
      -
    6. -
    7. Finish the release git flow release finish 0.12.0. Changes will be automatically merged back to - master - and develop branch.
    8. -
    9. On master branch, create a tag for the version: git tag -a "0.12.0" -m "0.12.0". - This tag will be picked up by Bower and GitHub Releases page automatically.
    10. -
    11. -

      Update the static website files

      -
      git checkout gh-pages
      -git merge master
      -
    12. -
    13. -

      Push changes

      -
      git checkout gh-pages
      -git push
      -git checkout master
      -git push
      -git checkout develop
      -git push
      -git push --tags
      -
    14. Go to the homepage http://handsontable.com/ and make sure that the - ew version is available there
    15. -
    16. Make sure the branches master, develop and gh-pages are all updated - with the latest version
    17. -
    18. Update the release notes at - https://github.com/handsontable/handsontable/releases
    19. -
    20. Shout about the new release on Twitter: https://twitter.com/handsontable
    21. -
    -
    -
    diff --git a/tutorials/resizing.html b/tutorials/resizing.html deleted file mode 100644 index 8b0f868..0000000 --- a/tutorials/resizing.html +++ /dev/null @@ -1,49 +0,0 @@ -
    - -
    - - Edit on GitHub - -

    To enable these features, use settings manualColumnResize: true and manualRowResize: true

    -

    The draggable resize handle appears:

    -
      -
    • in the right part of the column header,
    • -
    • in the bottom part of the row header.
    • -
    -

    Double click on the resize handle automatically adjusts size of the row or column.

    - -
    -
    -
    - -
    -
    - - -
    - -
    -
    -
    - diff --git a/tutorials/resources.html b/tutorials/resources.html deleted file mode 100644 index e69de29..0000000 diff --git a/tutorials/roadmap.html b/tutorials/roadmap.html deleted file mode 100644 index 610cb59..0000000 --- a/tutorials/roadmap.html +++ /dev/null @@ -1 +0,0 @@ -External link to https://trello.com/b/wMvdMvow/handsontable-roadmap-2015 diff --git a/tutorials/rulejs.html b/tutorials/rulejs.html deleted file mode 100644 index beefe4d..0000000 --- a/tutorials/rulejs.html +++ /dev/null @@ -1 +0,0 @@ -External link to https://github.com/handsontable/handsontable-RuleJS diff --git a/tutorials/scrollbars.html b/tutorials/scrollbars.html deleted file mode 100644 index fd5057d..0000000 --- a/tutorials/scrollbars.html +++ /dev/null @@ -1,75 +0,0 @@ -
    - -
    - - Edit on GitHub - -

    If you want scrollbars, just set container width, height and overflow: hidden in CSS. - This demo shows table of 1000 rows and columns. Only visible part is rendered. Native div scrollbar is used to - scroll through the table.

    -

    - -
    -
    -
    - -
    -
    - - -
    - -
    -
    -
    - diff --git a/tutorials/search-for-values.html b/tutorials/search-for-values.html deleted file mode 100644 index d1461ee..0000000 --- a/tutorials/search-for-values.html +++ /dev/null @@ -1,291 +0,0 @@ -
    - -
    -

    Search plugin provides an easy interface to perform data search across Handsontable.

    -

    First thing you should do, is enabling the plugin by setting the search option to true. - When enabled, searchPlugin exposes a new method query(queryStr), where queryStr - is a string to find within the table. By default, the search is case insensitive.

    -

    query(queryStr, [callback], [queryMethod]) method does 2 things. First of all, - it returns an array of search results. Every element is an objects containing 3 properties:

    -
      -
    • row – index of the row where the value has been found
    • -
    • col – index of the column where the value has been found
    • -
    • data– the value that has been found
    • -
    -

    The second thing query does is setting the isSearchResult property for each cell. - If a cell is in search results, then its isSearchResult is set to true, - otherwise the property is set to false.

    -

    All you have to do now, is use the query() method inside search input listener and you're done.

    -

    Search result class

    -

    By default searchPlugin adds htSearchResult class to every cell - which isSearchResult property is true. You can change this class using - searchResultClass option.

    -

    If you wish to change the result class globally (for all Handsontable instances on the page), - you can use Handsontable.Search.global.setDefaultSearchResultClass(className) method.

    -

    Custom queryMethod

    -

    The queryMethod is responsible for determining whether a queryStr - matches the value stored in a cell. It takes 2 arguments: queryStr and cellData. - The first is a string passed to query() method. The second is a value returned by getDataAtCell(). - The queryMethod function should return true if there is a match.

    -

    The default queryMethod is dead simple:

    -
    -      Handsontable.Search.DEFAULT_QUERY_METHOD = function (query, value) {
    -  if (typeof query == 'undefined' || query == null || !query.toLowerCase || query.length === 0) {
    -    return false;
    -  }
    -
    -  return value.toString().toLowerCase().indexOf(query.toLowerCase()) !== -1;
    -};
    -      
    -    
    -

    If you want to change the queryMethod, use queryMethod option. - You can also pass the queryMethod as the third argument of query() method. - To change the queryMethod globally, use - Handsontable.Search.global.setDefaultQueryMethod(queryMethod).

    -

    Custom result callback

    -

    After calling queryMethod searchPlugin calls - callback(instance, rowIndex, colIndex, cellData, testResult) for every cell.

    -

    Just as the queryMethod, you can override this callback globally, using - Handsontable.Search.global.setDefaultCallback(), you can set different callbacks - particular Handsontable instances using callback option, or pass the callback - as the second argument of query() method.

    -

    The default callback is responsible for setting the isSearchResult property, - so if you want to preserve this functionality, be sure to invoke Handsontable.Search.DEFAULT_CALLBACK - inside your custom callback.

    -
    -      Handsontable.Search.DEFAULT_CALLBACK = function(instance, row, col, data, testResult) {
    -  instance.getCellMeta(row, col).isSearchResult = testResult;
    -};
    -    
    -

    Find the following examples below:

    - -
    - -
    - - Edit on GitHub - -

    Simplest use case

    - -
    - -
    -
    - -
    -
    - - -
    - -
    -
    - -
    -

    Custom search result class

    -
    - -
    -
    - -
    -
    - - -
    - -
    -
    - -
    -

    Custom query method

    - -
    - -
    -
    - -
    -
    - - -
    - -
    -
    -
    -

    Custom callback

    - -
    - -

    0 results

    -
    -
    - -
    -
    - - -
    - -
    -
    -
    diff --git a/tutorials/select.html b/tutorials/select.html deleted file mode 100644 index 45ca70a..0000000 --- a/tutorials/select.html +++ /dev/null @@ -1,52 +0,0 @@ -
    - -
    - - Edit on GitHub - -

    Select editor should be considered an example how to write editors rather than used as a fully featured - editor. It is a much simpler form of the Dropdown editor. It is suggested to - use the latter in your projects.

    - -
    -
    -
    - -
    -
    - - -
    - -
    -
    -
    - diff --git a/tutorials/setting-options.html b/tutorials/setting-options.html deleted file mode 100644 index 342f120..0000000 --- a/tutorials/setting-options.html +++ /dev/null @@ -1,99 +0,0 @@ -
    - - - -
    - - Edit on GitHub - -

    Introduction to cell options

    -

    Any constructor or column option may be overwritten for a particular cell (row/column combination), - using cell array passed to the Handsontable constructor. Example:

    -
    var hot = new Handsontable(document.getElementById('example'), {
    -  cell: [
    -    {row: 0, col: 0, readOnly: true}
    -  ]
    -});
    -

    Or using cells function property to the Handsontable constructor. Example:

    -
    var hot = new Handsontable(document.getElementById('example'), {
    -  cells: function (row, col, prop) {
    -    var cellProperties = {}
    -
    -    if (row === 0 && col === 0) {
    -      cellProperties.readOnly = true;
    -    }
    -
    -    return cellProperties;
    -  }
    -})
    -
    - -
    -

    How does the Cascading Configuration work?

    -

    Since Handsontable 0.9 we use Cascading Configuration, which is fast way to provide configuration - options for the whole table, its columns and particular cells.

    -

    Consider the following example:

    -
    var hot = new Handsontable(document.getElementById('example'), {
    -  readOnly: true,
    -  columns: [
    -    {readOnly: false},
    -    {},
    -    {}
    -  ],
    -  cells: function (row, col, prop) {
    -    var cellProperties = {}
    -
    -    if (row === 0 && col === 0) {
    -      cellProperties.readOnly = true;
    -    }
    -
    -    return cellProperties;
    -  }
    -});
    -

    The above notation will result in all TDs being read only, except for first column TDs - which will be editable, except for the TD in top left corner which will still be read only.

    -
    - -
    -

    The cascading configuration model

    -

    The Cascading Configuration model is based on prototypal inheritance. It is much faster and memory - efficient compared to the previous model that used jQuery extend. See it yourself: - http://jsperf.com/extending-settings

    -
      -
    • -

      Constructor

      -

      Configuration options that are provided using first-level

      -
      new Handsontable(document.getElementById('example'), {
      -  option: 'value'
      -});
      -

      and updateSettings method.

      -
    • -
    • -

      Columns

      -

      Configuration options that are provided using second-level object

      -
      new Handsontable(document.getElementById('example'), {
      -  columns: {
      -    option: 'value'
      -  }
      -});
      -
    • -
    • -

      Cells

      -

      Configuration options that are provided using second-level function

      -
      new Handsontable(document.getElementById('example'), {
      -  cells: function(row, col, prop) {
      -
      -  }
      -});
      -
    • -
    -
    -
    - diff --git a/tutorials/seven-principles.html b/tutorials/seven-principles.html deleted file mode 100644 index ca876f0..0000000 --- a/tutorials/seven-principles.html +++ /dev/null @@ -1,34 +0,0 @@ -

    Our philosophy is built upon seven principles shared below:

    -
      -
    1. Performance is our number one priority (check out our - Performance Lab),
    2. -
    3. We aim to provide a code which is bug-free, easy to maintain and extend,
    4. -
    5. We improve the code quality through patch releases every two weeks,
    6. -
    7. We test each release against recent versions of the most popular browsers,
    8. -
    9. We write well documented code,
    10. -
    11. We write testable code,
    12. -
    13. Since Handsontable 0.15.0 we support ECMAScript 6 and follow the - Airbnb JavaScript ES6 style guide. -

      Currently supported ES6 features:

      -
        -
      • Arrows
      • -
      • Classes -
      • Enhanced Object Literals -
      • Template Strings -
      • Destructing -
      • Default + Rest + Spread -
      • Let + Const -
      • Iterators + For..Of -
      • Generators
      • -
      • Unicode (partialy)
      • -
      • Modules
      • -
      • Module Loader
      • -
      • Map + Set + WeakMap (our shim) + WeakSet
      • -
      • Proxy
      • -
      • Symbol
      • -
      • Math + Number + String + Object APIs
      • -
      • Binary and Octal Literals
      • -
      • Promises
      • -
      -
    14. -
    diff --git a/tutorials/sorting-data-demos.html b/tutorials/sorting-data-demos.html deleted file mode 100644 index e69de29..0000000 diff --git a/tutorials/sorting-data.html b/tutorials/sorting-data.html deleted file mode 100644 index 20e405b..0000000 --- a/tutorials/sorting-data.html +++ /dev/null @@ -1,176 +0,0 @@ -
    - - - -
    - - Edit on GitHub - -

    How the sorting works

    -

    If you want to sort data in your datasource array, you can simply invoke an Array.prototype.sort() function and call render() function to refresh the table. You don't need any plugin for this. However, this operations alters the structure of the datasource, and in many cases you want to leave the datasource intact, while displaying its content in a specified order. Here's where column sorting plugin comes in handy.

    -

    Column sorting plugin works as a proxy between the datasource and the Handsontable rendering module. It can map indices of displayed rows (called logical indices) to the indices of corresponding rows in datasource (called physical indices) and vice versa. This way you can alter the order of rows which are being presented to user, without changing the datasource internal structure.

    -

    This simple mechanism gives you a lot of flexibility, but it also introduces a few pitfalls if the developer is not full aware of the way plugin works.

    -

    How to enable the plugin

    -

    The property which is responsible for enabling and configuring the column sorting is called columnSorting (pretty unexpected, huh :P ). The value of this property can be either a Boolean or an Object.

    -

    If the columnSorting is of type Boolean, then true means the plugin is enabled and false means the plugin is disabled. The important thing to remember is that enabling the plugin using true does not sort the table content right away. The table has to be sorted either by a user or programmatically.

    -

    If the columnSorting is an Object, then it means that the plugin is enabled and configured according to the properties passed in the configObject. The configObject can be used to set the initial sorting parameters, which are:

    -
      -
    • column : Number - this index of column, by which you want to sorter the table.
    • -
    • sortOrder : Boolean - defines the order of sorting (true for ascending, false for descending). This arguments is optional. If it's not specified, the default order is ascending.
    • -
    -

    As all settings, columnSorting can be altered during the lifetime of a table, using updateSettings() method.

    -

    Examples:

    -
    // enables the plugin, but does not sort the table
    -var hot = new Handsontable(document.getElementById('example'), {
    -  columnSorting: true
    -});
    -
    -// enables the plugin and sort the table by the values from the first column in ascending order
    -var hot = new Handsontable(document.getElementById('example'), {
    -  columnSorting: {
    -    column: 0
    -  }
    -});
    -
    -// enables the plugin and sort the table by the values from the first column in descending order
    -var hot = new Handsontable(document.getElementById('example'), {
    -  columnSorting: {
    -    column: 0
    -    sortOrder: false
    -  }
    -});
    -
    -// disable plugin
    -hot.updateSettings({
    -  columnSorting: false
    -});
    -

    How to determine if sorting is enabled

    -

    To check whether sorting has been enabled for a particular Handsontable instance, use sortingEnabled property.

    -
    hot.sortingEnabled ? doSomething() : doSomethingElse();
    -

    The fact that column sorting has been enabled, does not imply, that the table content is sorted. To check whether a table has been sorted you can check the sortColumn property. If table instance has this property defined then it has been sorted. The value of sortColumn is the index of a column by which the table has been sorted. Additionally, you can check sorting order using sortOrder property. If sortOrder is true, then the order is ascending, otherwise, the order is descending.

    -

    Simple function, which checks whether the table has been sorted could look like this:

    -
    function isSorted(hotInstance) {
    -  return hotInstance.sortingEnabled && typeof hotInstance.sortColumn !== 'undefined';
    -}
    -

    How to sort a table

    -

    There are 3 ways you can sort a table:

    -
      -
    • using columnSorting property
    • -
    • by clicking on the table header
    • -
    • invoking the sort() method
    • -
    -

    The first possibility has been discussed in <a href="#how-to-enable-the-plugin">How to enable the plugin</a> section.

    -

    The second option is probably the most popular one. If the plugin is enabled, clicking on column header causes table to be sorted by the corresponding values in ascending order. As usual, if you click the header again, the order will switch to descending.

    -

    The last recommended way of sorting the table is using the sort() method. When columnSorting plugin is enabled, it exposes a new method in Handsontable instance, called sort(). The method accepts 2 arguments: column and order.

    -
      -
    • column : Number - argument is the index of column, by which you want to sorter the table. This argument is required.
    • -
    • order: Boolean - defines the order of sorting (true for ascending, false for descending). This arguments is optional. If it's not specified, the default order is ascending.
    • -
    -

    Example:

    -
    if (hot.sortingEnabled) {
    -  // will sort table using values from the first column in descending order
    -  hot.sort(0, false);
    -}
    -

    Rows indices translation

    -

    The main task of column sorting plugin is mapping the data source rows indices to displayed rows indices and vice versa. The indices of displayed rows are called logical indices and the indices in datasource array are called physical indices. In general, every logical index has a corresponding physical index.

    -

    Most of the time, this whole mapping logic takes place under the hood and you don't have to bother even remembering it, because a vast majority of important operations and functions is interested only in physical indices. For example, if the cell value changes, the afterChange event is triggered. All event listeners will receive a row index of the row, where the change took place. This will be the physical index of the modified row. Same scheme applies to other events.

    -

    On the other hand, each time a cell renderer is invoked, the row index that is being passed to the renderer function is always a logical row index, because the logic of the renderer should correspond to parameters of the displayed row, instead of the parameters of the actual row in datasource.

    -

    However, sometimes you might need to know which physical row is displayed as the first logical row and the other way around. To do so, you have to use sortIndex an extra property, which is being added to Handsontable instance, when column sorting plugin is enabled.

    -

    sortIndex is a 2D array which maps indices of visible rows (logical indices) to indices of rows stored in datasource (physical indices).

    -

    Example: My table is sorted. I have changed row 4 and I want to know which row in data source got updated. So I want to get the physical index, having the logical index. This is the code I have to write:

    -
    physicalIndex = instance.sortIndex[logicalIndex][0];
    -

    The revers mapping is a bit more complicated, but is also possible. In fact, columnSorting plugin has two dedicated methods which translates logical indices to physical and vice versa (called translateRow() and untranslateRow()) but they are currently inaccessible from the global scope.

    -

    Click on a column header to sort. Only the table view is sorted. The data source remains in the original order. - For an in depth documentation of column sorting plugin see the - Understanding column sorting plugin wiki page. -

    - -
    -
    -
    - -
    -
    - - -
    - -
    -
    -
    - diff --git a/tutorials/stackoverflow.html b/tutorials/stackoverflow.html deleted file mode 100644 index d0658f2..0000000 --- a/tutorials/stackoverflow.html +++ /dev/null @@ -1,10 +0,0 @@ - - - - - - - - - - diff --git a/tutorials/stretching.html b/tutorials/stretching.html deleted file mode 100644 index bc743d6..0000000 --- a/tutorials/stretching.html +++ /dev/null @@ -1,130 +0,0 @@ -
    - -
    -

    This page shows how to configure Handsontable column stretching:

    - -
    - -
    - - Edit on GitHub - -

    StretchH last column

    -

    The following example creates a table with vertical scrollbar by specifying - only the container height and overflow: hidden in CSS. - The last column is stretched using stretchH: 'last' option.

    - -
    -
    -
    - -
    -
    - - -
    - -
    -
    - -
    -

    StretchH all columns

    -

    If the table content is not as wide as the container width, the table will be stretched to the container - width. The default horizontal stretch model is to stretch the last column only (by using stretchH: - 'last' option).

    -

    Other possible stretch modes are all (stretches all columns equally, used in the below example) - and none (not stretching).

    - -
    -
    -
    - -
    -
    - - -
    - -
    -
    - -
    -

    StretchH none (default)

    - -
    -
    -
    - -
    -
    - - -
    - -
    -
    -
    diff --git a/tutorials/styling.html b/tutorials/styling.html deleted file mode 100644 index a03576c..0000000 --- a/tutorials/styling.html +++ /dev/null @@ -1,15 +0,0 @@ -
    -
    - - Edit on GitHub - -
    - This part of documentation is not ready yet. If you'd like to contribute to this page, - - enhance it on GitHub. - × -
    -

    The appearance of Handsontable can be easily modified via CSS.

    -
    -
    - diff --git a/tutorials/subprojects.html b/tutorials/subprojects.html deleted file mode 100644 index d0658f2..0000000 --- a/tutorials/subprojects.html +++ /dev/null @@ -1,10 +0,0 @@ - - - - - - - - - - diff --git a/tutorials/testing.html b/tutorials/testing.html deleted file mode 100644 index b530d1a..0000000 --- a/tutorials/testing.html +++ /dev/null @@ -1,66 +0,0 @@ -
    - - - -
    - - Edit on GitHub - -

    Testing in browser

    -

    To run the Jasmine tests in your browser, go to the following pages:

    - -
    -
    -

    Testing with Grunt (CLI)

    -

    To run Jasmine tests in your command line (using PhantomJS), first install Grunt (based on the instructions provided - on page Building).

    -

    Useful commands:

    -
      -
    • grunt test - runs all test cases (Handsotnable and Walkontable)
    • -
    • grunt test:handsontable - runs only Handsontable tests
    • -
    • grunt test:walkontable - runs only Walkontable tests
    • -
    • grunt test --filter autocomplete - runs only tests and suites matching the name "autocomplete" -
    • -
    -
    -
    -

    Testing with Sauce Labs

    -
      -
    1. Create a Sauce account
    2. -
    3. Save your account credentials in env variables SAUCE_USERNAME and SAUCE_ACCESS_KEY (instructions: general, Mac) -
    4. -
    5. In Gruntfile.js, browsers is the array of browsers that will be tested. You can adjust - the browser definition list to test only the browsers you want (makes it faster). -
    6. -
    7. In Gruntfile.js, concurrency should have the same value as your Sauce account's - "Parallel tests" limit (3 for open source projects) -
    8. -
    9. Execute grunt sauce (or grunt sauce:handsontable, grunt sauce:walkontable) -
    10. -
    11. Log in to your Sauce account to see the results
    12. -
    -

    More details:

    - -
    -
    diff --git a/tutorials/tutorials.json b/tutorials/tutorials.json deleted file mode 100644 index 269f3a4..0000000 --- a/tutorials/tutorials.json +++ /dev/null @@ -1,271 +0,0 @@ -{ - "index": { - "title": "", - "children": { - "getting-started": { - "title": "Getting started", - "children": { - "quick-start": { - "title": "Quick start" - }, - "custom-build": { - "title": "Custom build" - }, - "features": { - "title": "Features" - }, - "compatibility": { - "title": "Compatibility" - }, - "seven-principles": { - "title": "Seven principles" - } - } - }, - "developer-guide": { - "title": "Developer guide", - "children": { - "overview": { - "title": "Overview" - }, - "data-binding": { - "title": "Data binding" - }, - "data-sources": { - "title": "Data sources" - }, - "load-and-save": { - "title": "Load and save" - }, - "setting-options": { - "title": "Setting options" - }, - "callbacks": { - "title": "Callbacks" - }, - "styling": { - "title": "Styling" - }, - "cell-types": { - "title": "Cell types" - }, - "cell-editor": { - "title": "Cell editor" - }, - "cell-function": { - "title": "Cell function" - }, - "keyboard-shortcuts": { - "title": "Keyboard shortcuts" - }, - "performance-tips": { - "title": "Performance tips" - }, - "testing": { - "title": "Testing" - }, - "releasing": { - "title": "Releasing" - }, - "contributing": { - "title": "Contributing" - } - } - }, - "resources": { - "title": "Resources", - "children": { - "change-log": { - "title": "Change log", - "external": "https://github.com/handsontable/handsontable/releases" - }, - "roadmap": { - "title": "Roadmap", - "external": "https://trello.com/b/wMvdMvow/handsontable-roadmap-2015" - }, - "milestones": { - "title": "Milestones", - "external": "https://github.com/handsontable/handsontable/milestones" - }, - "licensing": { - "title": "Licensing", - "external": "https://handsontable.com/licensing.html" - } - } - }, - "subprojects": { - "title": "Subprojects", - "children": { - "ngHandsontable": { - "title": "ngHandsontable", - "external": "https://github.com/handsontable/ngHandsontable" - }, - "hot-table": { - "title": "hot-table", - "external": "https://github.com/handsontable/hot-table" - }, - "rulejs": { - "title": "RuleJS", - "external": "https://github.com/handsontable/handsontable-RuleJS" - } - } - }, - "general-configuration-demos": { - "title": "General configuration", - "demo": true, - "children": { - "fixed-rows-and-columns": { - "title": "Fixed rows and columns" - }, - "resizing": { - "title": "Resizing rows and columns" - }, - "scrollbars": { - "title": "Scrolling rows and columns" - }, - "stretching": { - "title": "Columns stretching" - }, - "freezing": { - "title": "Columns freezing" - }, - "moving": { - "title": "Columns moving" - }, - "highlighting-current": { - "title": "Highlighting current" - }, - "grouping-and-ungrouping": { - "title": "Grouping and ungrouping" - }, - "pre-populating-new-rows": { - "title": "Pre-populating new rows" - }, - "sorting-data": { - "title": "Sorting data" - }, - "pagination": { - "title": "Pagination" - } - } - }, - "cell-features-demos": { - "title": "Cell features", - "demo": true, - "children": { - "data-validation": { - "title": "Data validation" - }, - "drag-down": { - "title": "Drag down" - }, - "merge-cells": { - "title": "Merge cells" - }, - "alignment": { - "title": "Alignment" - }, - "read-only": { - "title": "Read only" - } - } - }, - "cell-types-demos": { - "title": "Cell types", - "demo": true, - "children": { - "custom-renderers": { - "title": "Custom renderers" - }, - "numeric": { - "title": "Numeric" - }, - "date": { - "title": "Date" - }, - "checkbox": { - "title": "Checkbox" - }, - "select": { - "title": "Select" - }, - "dropdown": { - "title": "Dropdown" - }, - "autocomplete": { - "title": "Autocomplete" - }, - "password": { - "title": "Password" - }, - "handsontable": { - "title": "Handsontable" - } - } - }, - "appearance-demos": { - "title": "Appearance", - "demo": true, - "children": { - "conditional-formatting": { - "title": "Conditional formatting" - }, - "custom-borders": { - "title": "Custom borders" - } - } - }, - "mobiles-and-tablets-demos": { - "title": "Mobiles and Tablets", - "demo": true, - "children": { - "mobiles-and-tablets": { - "title": "Mobiles and tablets" - } - } - }, - "utilities-demos": { - "title": "Utilities", - "demo": true, - "children": { - "search-for-values": { - "title": "Search for values" - }, - "context-menu": { - "title": "Context menu" - }, - "custom-buttons": { - "title": "Custom buttons" - }, - "comments": { - "title": "Comments" - } - } - }, - "integrations-demos": { - "title": "Integrations", - "demo": true, - "children": { - "formula-support": { - "title": "RuleJS (formula support)" - }, - "jquery": { - "title": "jQuery" - }, - "graphael-charts": { - "title": "gRaphaƫl charts" - }, - "chromajs": { - "title": "ChromaJS" - }, - "bootstrap": { - "title": "Bootstrap" - }, - "backbonejs": { - "title": "Backbone.js" - } - } - } - } - } -} diff --git a/tutorials/utilities-demos.html b/tutorials/utilities-demos.html deleted file mode 100644 index e69de29..0000000