From cb84aa46579957231dea4e73ca176eb069e9885c Mon Sep 17 00:00:00 2001 From: IrosTheBeggar Date: Tue, 24 Jan 2017 01:42:21 -0500 Subject: [PATCH] No more paper player. Other file organization --- SKININNG.md => docs/SKININNG.md | 0 .../exampleJSON}/allOptions.json | 0 .../exampleJSON}/exampleNewJSON.json | 0 {exampleJSON => docs/exampleJSON}/remote.json | 0 .../exampleJSON}/skeleton.json | 0 modules/configure-json-file.js | 5 + modules/jukebox.js | 99 + mstream.js | 92 +- public-shared/css/shared.css | 31 +- public-shared/img/mstream-logo.svg | 34 + public-shared/mstream.html | 5 +- public/css/master.css | 151 +- public/img/album-art.jpg | Bin 181321 -> 0 bytes .../mstream-concept.png} | Bin .../mstreamV1.png} | Bin .../mstreamV2.png} | Bin public/js/foundation/foundation.abide.js | 201 - public/js/foundation/foundation.accordion.js | 41 - public/js/foundation/foundation.alert.js | 34 - public/js/foundation/foundation.clearing.js | 450 - public/js/foundation/foundation.dropdown.js | 184 - .../js/foundation/foundation.interchange.js | 304 - public/js/foundation/foundation.js | 416 - public/js/foundation/foundation.magellan.js | 118 - public/js/foundation/foundation.offcanvas.js | 37 - public/js/foundation/foundation.orbit.js | 434 - public/js/foundation/foundation.reveal.js | 347 - public/js/foundation/foundation.tab.js | 37 - public/js/foundation/foundation.tooltip.js | 202 - public/js/foundation/foundation.topbar.js | 380 - public/js/jquery.js | 8829 ----------- public/js/mstream.js | 142 +- public/js/vendor/custom.modernizr.js | 4 - public/js/vendor/jquery.cookie.js | 107 - public/js/vendor/jquery.js | 8829 ----------- public/mstream.html | 331 +- public/paper-player.zip | Bin 0 -> 1143834 bytes public/paper-player/font-roboto/.bower.json | 31 - public/paper-player/font-roboto/README.md | 1 - public/paper-player/font-roboto/bower.json | 22 - public/paper-player/font-roboto/roboto.html | 11 - .../iron-a11y-keys-behavior/.bower.json | 43 - .../.github/ISSUE_TEMPLATE.md | 33 - .../iron-a11y-keys-behavior/.gitignore | 1 - .../iron-a11y-keys-behavior/.travis.yml | 25 - .../iron-a11y-keys-behavior/CONTRIBUTING.md | 77 - .../iron-a11y-keys-behavior/README.md | 58 - .../iron-a11y-keys-behavior/bower.json | 33 - .../iron-a11y-keys-behavior/demo/index.html | 24 - .../demo/x-key-aware.html | 105 - .../iron-a11y-keys-behavior/index.html | 24 - .../iron-a11y-keys-behavior.html | 492 - .../test/basic-test.html | 446 - .../iron-a11y-keys-behavior/test/index.html | 28 - .../paper-player/iron-behaviors/.bower.json | 42 - .../iron-behaviors/.github/ISSUE_TEMPLATE.md | 33 - public/paper-player/iron-behaviors/.gitignore | 1 - .../paper-player/iron-behaviors/.travis.yml | 23 - .../iron-behaviors/CONTRIBUTING.md | 77 - public/paper-player/iron-behaviors/README.md | 22 - public/paper-player/iron-behaviors/bower.json | 32 - .../iron-behaviors/demo/index.html | 48 - .../iron-behaviors/demo/simple-button.html | 66 - public/paper-player/iron-behaviors/index.html | 27 - .../iron-behaviors/iron-button-state.html | 228 - .../iron-behaviors/iron-control-state.html | 110 - .../iron-behaviors/test/active-state.html | 280 - .../iron-behaviors/test/disabled-state.html | 82 - .../iron-behaviors/test/focused-state.html | 161 - .../iron-behaviors/test/index.html | 27 - .../iron-behaviors/test/test-elements.html | 91 - .../iron-checked-element-behavior/.bower.json | 43 - .../.github/ISSUE_TEMPLATE.md | 33 - .../iron-checked-element-behavior/.gitignore | 1 - .../iron-checked-element-behavior/.travis.yml | 23 - .../CONTRIBUTING.md | 77 - .../iron-checked-element-behavior/README.md | 27 - .../iron-checked-element-behavior/bower.json | 34 - .../demo/index.html | 39 - .../demo/simple-checkbox.html | 65 - .../iron-checked-element-behavior/index.html | 30 - .../iron-checked-element-behavior.html | 120 - .../test/basic.html | 152 - .../test/index.html | 31 - .../test/simple-checkbox.html | 26 - .../paper-player/iron-flex-layout/.bower.json | 41 - .../paper-player/iron-flex-layout/.gitignore | 2 - .../paper-player/iron-flex-layout/.travis.yml | 25 - .../iron-flex-layout/CONTRIBUTING.md | 77 - .../paper-player/iron-flex-layout/README.md | 55 - .../paper-player/iron-flex-layout/bower.json | 31 - .../classes/iron-flex-layout.html | 311 - .../classes/iron-shadow-flex-layout.html | 307 - .../iron-flex-layout/demo/index.html | 396 - .../paper-player/iron-flex-layout/index.html | 24 - .../iron-flex-layout-classes.html | 431 - .../iron-flex-layout/iron-flex-layout.html | 399 - .../iron-flex-layout/test/index.html | 31 - .../test/iron-flex-layout-classes.html | 412 - .../test/iron-flex-layout.html | 434 - .../iron-form-element-behavior/.bower.json | 41 - .../iron-form-element-behavior/.gitignore | 1 - .../iron-form-element-behavior/.travis.yml | 22 - .../CONTRIBUTING.md | 72 - .../iron-form-element-behavior/README.md | 23 - .../iron-form-element-behavior/bower.json | 31 - .../demo/index.html | 67 - .../demo/simple-element.html | 27 - .../demo/simple-form.html | 53 - .../iron-form-element-behavior/index.html | 30 - .../iron-form-element-behavior.html | 86 - .../test/basic.html | 71 - .../test/index.html | 24 - .../test/simple-element.html | 23 - .../test/simple-form.html | 19 - public/paper-player/iron-icon/.bower.json | 45 - .../iron-icon/.github/ISSUE_TEMPLATE.md | 33 - public/paper-player/iron-icon/.gitignore | 1 - public/paper-player/iron-icon/.travis.yml | 23 - public/paper-player/iron-icon/CONTRIBUTING.md | 77 - public/paper-player/iron-icon/README.md | 92 - public/paper-player/iron-icon/bower.json | 35 - public/paper-player/iron-icon/demo/async.html | 62 - public/paper-player/iron-icon/demo/index.html | 48 - .../paper-player/iron-icon/demo/location.png | Bin 324 -> 0 bytes public/paper-player/iron-icon/hero.svg | 19 - public/paper-player/iron-icon/index.html | 26 - public/paper-player/iron-icon/iron-icon.html | 205 - public/paper-player/iron-icon/test/index.html | 27 - .../iron-icon/test/iron-icon.html | 220 - public/paper-player/iron-icons/.bower.json | 46 - public/paper-player/iron-icons/.gitignore | 3 - public/paper-player/iron-icons/.travis.yml | 22 - .../paper-player/iron-icons/CONTRIBUTING.md | 72 - public/paper-player/iron-icons/README.md | 39 - public/paper-player/iron-icons/av-icons.html | 73 - public/paper-player/iron-icons/bower.json | 37 - .../iron-icons/communication-icons.html | 59 - .../paper-player/iron-icons/demo/index.html | 131 - .../paper-player/iron-icons/device-icons.html | 94 - .../paper-player/iron-icons/editor-icons.html | 70 - .../iron-icons/hardware-icons.html | 61 - public/paper-player/iron-icons/hero.svg | 35 - .../paper-player/iron-icons/image-icons.html | 164 - public/paper-player/iron-icons/index.html | 25 - .../paper-player/iron-icons/iron-icons.html | 303 - .../paper-player/iron-icons/maps-icons.html | 71 - .../iron-icons/notification-icons.html | 62 - .../paper-player/iron-icons/social-icons.html | 40 - .../paper-player/iron-iconset-svg/.bower.json | 43 - .../paper-player/iron-iconset-svg/.gitignore | 1 - .../paper-player/iron-iconset-svg/.travis.yml | 28 - .../iron-iconset-svg/CONTRIBUTING.md | 72 - .../paper-player/iron-iconset-svg/README.md | 50 - .../paper-player/iron-iconset-svg/bower.json | 33 - .../iron-iconset-svg/demo/index.html | 70 - .../demo/svg-sample-icons.html | 81 - .../paper-player/iron-iconset-svg/index.html | 26 - .../iron-iconset-svg/iron-iconset-svg.html | 194 - .../iron-iconset-svg/test/index.html | 30 - .../test/iron-iconset-svg.html | 145 - public/paper-player/iron-meta/.bower.json | 39 - public/paper-player/iron-meta/.gitignore | 1 - public/paper-player/iron-meta/.travis.yml | 28 - public/paper-player/iron-meta/CONTRIBUTING.md | 72 - public/paper-player/iron-meta/README.md | 93 - public/paper-player/iron-meta/bower.json | 29 - public/paper-player/iron-meta/demo/index.html | 46 - public/paper-player/iron-meta/hero.svg | 33 - public/paper-player/iron-meta/index.html | 27 - public/paper-player/iron-meta/iron-meta.html | 333 - public/paper-player/iron-meta/test/basic.html | 48 - public/paper-player/iron-meta/test/index.html | 30 - .../iron-meta/test/iron-meta.html | 195 - .../iron-range-behavior/.bower.json | 39 - .../.github/ISSUE_TEMPLATE.md | 33 - .../iron-range-behavior/.gitignore | 1 - .../iron-range-behavior/.travis.yml | 23 - .../iron-range-behavior/CONTRIBUTING.md | 77 - .../iron-range-behavior/README.md | 24 - .../iron-range-behavior/bower.json | 29 - .../iron-range-behavior/demo/index.html | 80 - .../iron-range-behavior/index.html | 24 - .../iron-range-behavior.html | 121 - .../iron-range-behavior/test/basic.html | 180 - .../iron-range-behavior/test/index.html | 24 - .../test/x-progressbar.html | 19 - .../iron-validatable-behavior/.bower.json | 42 - .../.github/ISSUE_TEMPLATE.md | 33 - .../iron-validatable-behavior/.gitignore | 1 - .../iron-validatable-behavior/.travis.yml | 23 - .../iron-validatable-behavior/CONTRIBUTING.md | 77 - .../iron-validatable-behavior/README.md | 42 - .../iron-validatable-behavior/bower.json | 33 - .../demo/cats-only.html | 46 - .../iron-validatable-behavior/demo/index.html | 71 - .../demo/validatable-input.html | 46 - .../iron-validatable-behavior/index.html | 30 - .../iron-validatable-behavior.html | 149 - .../test/cats-only.html | 30 - .../test/dogs-only.html | 30 - .../iron-validatable-behavior/test/index.html | 32 - .../test/iron-validatable-behavior.html | 88 - .../test/test-validatable.html | 29 - .../paper-audio-player/.bower.json | 47 - .../paper-audio-player/LICENSE.txt | 21 - .../paper-player/paper-audio-player/README.md | 131 - .../paper-audio-player/bower.json | 37 - .../paper-audio-player/gulpfile.js | 20 - .../paper-audio-player/index.html | 29 - .../paper-audio-player/package.json | 35 - .../paper-audio-player.html | 688 - .../paper-player/paper-behaviors/.bower.json | 51 - .../paper-behaviors/.github/ISSUE_TEMPLATE.md | 33 - .../paper-player/paper-behaviors/.gitignore | 1 - .../paper-player/paper-behaviors/.travis.yml | 23 - .../paper-behaviors/CONTRIBUTING.md | 77 - public/paper-player/paper-behaviors/README.md | 44 - .../paper-player/paper-behaviors/bower.json | 42 - .../paper-behaviors/demo/index.html | 45 - .../paper-behaviors/demo/paper-button.html | 64 - .../demo/paper-radio-button.html | 112 - .../paper-player/paper-behaviors/index.html | 26 - .../paper-button-behavior.html | 97 - .../paper-checked-element-behavior.html | 57 - .../paper-inky-focus-behavior.html | 51 - .../paper-ripple-behavior.html | 126 - .../paper-behaviors/test/index.html | 29 - .../test/paper-button-behavior.html | 113 - .../test/paper-checked-element-behavior.html | 94 - .../test/paper-radio-button-behavior.html | 58 - .../test/paper-ripple-behavior.html | 335 - .../paper-behaviors/test/shadowed-ripple.html | 55 - .../paper-behaviors/test/test-button.html | 34 - .../test/test-radio-button.html | 41 - .../paper-icon-button/.bower.json | 47 - .../paper-player/paper-icon-button/.gitignore | 1 - .../paper-icon-button/.travis.yml | 25 - .../paper-icon-button/CONTRIBUTING.md | 77 - .../paper-player/paper-icon-button/README.md | 79 - .../paper-player/paper-icon-button/bower.json | 37 - .../paper-icon-button/demo/index.html | 103 - .../paper-player/paper-icon-button/index.html | 23 - .../paper-icon-button/paper-icon-button.html | 173 - .../paper-icon-button/test/a11y.html | 92 - .../paper-icon-button/test/basic.html | 75 - .../paper-icon-button/test/index.html | 26 - .../paper-player/paper-progress/.bower.json | 42 - public/paper-player/paper-progress/.gitignore | 1 - .../paper-player/paper-progress/.travis.yml | 25 - .../paper-progress/CONTRIBUTING.md | 77 - public/paper-player/paper-progress/README.md | 94 - public/paper-player/paper-progress/bower.json | 32 - .../paper-progress/demo/index.html | 122 - public/paper-player/paper-progress/hero.svg | 21 - public/paper-player/paper-progress/index.html | 28 - .../paper-progress/paper-progress.html | 341 - .../paper-progress/test/basic.html | 148 - .../paper-progress/test/index.html | 24 - public/paper-player/paper-ripple/.bower.json | 45 - .../paper-ripple/.github/ISSUE_TEMPLATE.md | 33 - public/paper-player/paper-ripple/.gitignore | 1 - public/paper-player/paper-ripple/.travis.yml | 23 - .../paper-player/paper-ripple/CONTRIBUTING.md | 77 - public/paper-player/paper-ripple/README.md | 90 - public/paper-player/paper-ripple/bower.json | 35 - .../paper-player/paper-ripple/demo/index.html | 415 - public/paper-player/paper-ripple/hero.svg | 30 - public/paper-player/paper-ripple/index.html | 27 - .../paper-ripple/paper-ripple.html | 758 - .../paper-player/paper-ripple/test/index.html | 24 - .../paper-ripple/test/paper-ripple.html | 253 - public/paper-player/paper-styles/.bower.json | 42 - .../paper-player/paper-styles/CONTRIBUTING.md | 77 - public/paper-player/paper-styles/README.md | 49 - public/paper-player/paper-styles/bower.json | 33 - .../paper-styles/classes/global.html | 96 - .../paper-styles/classes/shadow-layout.html | 302 - .../paper-styles/classes/shadow.html | 52 - .../paper-styles/classes/typography.html | 169 - public/paper-player/paper-styles/color.html | 333 - .../paper-styles/default-theme.html | 72 - .../paper-player/paper-styles/demo-pages.html | 72 - public/paper-player/paper-styles/demo.css | 25 - .../paper-player/paper-styles/demo/index.html | 339 - public/paper-player/paper-styles/index.html | 24 - .../paper-styles/paper-styles-classes.html | 14 - .../paper-styles/paper-styles.html | 44 - public/paper-player/paper-styles/shadow.html | 71 - .../paper-player/paper-styles/typography.html | 169 - public/paper-player/polymer/.bower.json | 45 - public/paper-player/polymer/LICENSE.txt | 27 - public/paper-player/polymer/bower.json | 35 - public/paper-player/polymer/build.log | 562 - .../paper-player/polymer/polymer-micro.html | 732 - public/paper-player/polymer/polymer-mini.html | 2164 --- public/paper-player/polymer/polymer.html | 5357 ------- .../paper-player/webcomponentsjs/.bower.json | 30 - .../webcomponentsjs/CustomElements.js | 1029 -- .../webcomponentsjs/CustomElements.min.js | 11 - .../webcomponentsjs/HTMLImports.js | 1157 -- .../webcomponentsjs/HTMLImports.min.js | 11 - .../webcomponentsjs/MutationObserver.js | 350 - .../webcomponentsjs/MutationObserver.min.js | 11 - public/paper-player/webcomponentsjs/README.md | 155 - .../paper-player/webcomponentsjs/ShadowDOM.js | 4493 ------ .../webcomponentsjs/ShadowDOM.min.js | 13 - .../paper-player/webcomponentsjs/bower.json | 21 - .../accessibility-developer-tools/.bower.json | 40 - .../Changelog.md | 141 - .../accessibility-developer-tools/LICENSE | 202 - .../accessibility-developer-tools/README.md | 211 - .../accessibility-developer-tools/bower.json | 31 - .../dist/js/axs_testing.js | 2278 --- .../bower_components/async/.bower.json | 67 - .../bower_components/async/CHANGELOG.md | 125 - .../bower_components/async/LICENSE | 19 - .../bower_components/async/Makefile | 37 - .../bower_components/async/README.md | 1877 --- .../bower_components/async/bower.json | 57 - .../bower_components/async/component.json | 17 - .../bower_components/async/deps/nodeunit.css | 70 - .../bower_components/async/deps/nodeunit.js | 2117 --- .../bower_components/async/dist/async.js | 1265 -- .../bower_components/async/dist/async.min.js | 2 - .../bower_components/async/dist/async.min.map | 1 - .../bower_components/async/karma.conf.js | 12 - .../bower_components/async/lib/async.js | 1265 -- .../async/mocha_test/compose.js | 86 - .../async/mocha_test/forever.js | 44 - .../async/mocha_test/support/is_browser.js | 4 - .../bower_components/async/package.json | 85 - .../bower_components/async/perf/benchmark.js | 228 - .../bower_components/async/perf/memory.js | 46 - .../bower_components/async/perf/suites.js | 297 - .../async/support/sync-package-managers.js | 53 - .../bower_components/chai/.bower.json | 37 - .../bower_components/chai/CODE_OF_CONDUCT.md | 58 - .../bower_components/chai/CONTRIBUTING.md | 214 - .../bower_components/chai/History.md | 1059 -- .../bower_components/chai/README.md | 83 - .../bower_components/chai/ReleaseNotes.md | 737 - .../bower_components/chai/bower.json | 26 - .../bower_components/chai/chai.js | 6142 -------- .../bower_components/chai/karma.conf.js | 28 - .../bower_components/chai/karma.sauce.js | 41 - .../bower_components/chai/package.json | 51 - .../bower_components/chai/sauce.browsers.js | 128 - .../bower_components/lodash/.bower.json | 30 - .../bower_components/lodash/LICENSE | 22 - .../bower_components/lodash/bower.json | 19 - .../bower_components/lodash/lodash.js | 12352 --------------- .../bower_components/lodash/lodash.min.js | 98 - .../bower_components/mocha/.bower.json | 56 - .../bower_components/mocha/.editorconfig | 18 - .../bower_components/mocha/.eslintrc | 130 - .../bower_components/mocha/.mailmap | 12 - .../bower_components/mocha/CHANGELOG.md | 1262 -- .../bower_components/mocha/CONTRIBUTING.md | 49 - .../bower_components/mocha/LICENSE | 22 - .../bower_components/mocha/README.md | 84 - .../mocha/assets/mocha-banner-192.png | Bin 15667 -> 0 bytes .../mocha/assets/mocha-banner.svg | 160 - .../mocha/assets/mocha-logo-128.png | Bin 7445 -> 0 bytes .../mocha/assets/mocha-logo-192.png | Bin 10373 -> 0 bytes .../mocha/assets/mocha-logo-64.png | Bin 3275 -> 0 bytes .../mocha/assets/mocha-logo.svg | 125 - .../bower_components/mocha/bower.json | 46 - .../bower_components/mocha/browser-entry.js | 166 - .../bower_components/mocha/karma.conf.js | 131 - .../bower_components/mocha/media/logo.svg | 7 - .../bower_components/mocha/mocha.css | 314 - .../bower_components/mocha/mocha.js | 13149 ---------------- .../mocha/scripts/upgrade-npm.js | 21 - .../bower_components/sinon-chai/.bower.json | 14 - .../bower_components/sinon-chai/.gitignore | 4 - .../bower_components/sinon-chai/.jshintrc | 25 - .../bower_components/sinon-chai/.travis.yml | 6 - .../bower_components/sinon-chai/LICENSE.txt | 49 - .../bower_components/sinon-chai/README.md | 248 - .../sinon-chai/lib/sinon-chai.js | 131 - .../bower_components/sinon-chai/package.json | 41 - .../sinon-chai/test/callArguments.coffee | 212 - .../sinon-chai/test/callContext.coffee | 78 - .../sinon-chai/test/callCount.coffee | 119 - .../sinon-chai/test/callOrder.coffee | 63 - .../sinon-chai/test/callingWithNew.coffee | 62 - .../sinon-chai/test/common.js | 15 - .../sinon-chai/test/messages.coffee | 304 - .../sinon-chai/test/mocha.opts | 3 - .../sinon-chai/test/regressions.coffee | 13 - .../sinon-chai/test/returning.coffee | 60 - .../sinon-chai/test/throwing.coffee | 149 - .../bower_components/sinonjs/.bower.json | 20 - .../bower_components/sinonjs/README.md | 8 - .../bower_components/sinonjs/bower.json | 10 - .../bower_components/sinonjs/sinon.js | 6383 -------- .../bower_components/stacky/.bower.json | 37 - .../bower_components/stacky/LICENSE | 27 - .../bower_components/stacky/bower.json | 28 - .../bower_components/stacky/browser.js | 346 - .../bower_components/stacky/lib/formatting.js | 158 - .../bower_components/stacky/lib/index.js | 26 - .../stacky/lib/normalization.js | 57 - .../bower_components/stacky/lib/parsing.js | 95 - .../bower_components/test-fixture/.bower.json | 27 - .../bower_components/test-fixture/.gitignore | 4 - .../bower_components/test-fixture/.travis.yml | 25 - .../test-fixture/CONTRIBUTING.md | 77 - .../bower_components/test-fixture/README.md | 148 - .../bower_components/test-fixture/bower.json | 17 - .../test-fixture/package.json | 21 - .../test-fixture/test-fixture-mocha.js | 40 - .../test-fixture/test-fixture.html | 326 - .../test/handle-multiple-registrations.html | 29 - .../test-fixture/test/index.html | 28 - .../test-fixture/test/test-fixture.html | 251 - .../test-fixture/wct.conf.json | 5 - .../web-component-tester/.bower.json | 51 - .../web-component-tester/bower.json | 41 - .../web-component-tester/browser.js | 2062 --- .../web-component-tester/browser.js.map | 1 - .../web-component-tester/data/a11ySuite.js | 119 - .../web-component-tester/data/index.html | 17 - public/paper-player/webcomponentsjs/build.log | 468 - .../paper-player/webcomponentsjs/package.json | 31 - .../webcomponentsjs/webcomponents-lite.js | 2505 --- .../webcomponentsjs/webcomponents-lite.min.js | 12 - .../webcomponentsjs/webcomponents.js | 7206 --------- .../webcomponentsjs/webcomponents.min.js | 14 - .../master.scssc | Bin 77221 -> 0 bytes 431 files changed, 662 insertions(+), 127992 deletions(-) rename SKININNG.md => docs/SKININNG.md (100%) rename {exampleJSON => docs/exampleJSON}/allOptions.json (100%) rename {exampleJSON => docs/exampleJSON}/exampleNewJSON.json (100%) rename {exampleJSON => docs/exampleJSON}/remote.json (100%) rename {exampleJSON => docs/exampleJSON}/skeleton.json (100%) create mode 100644 modules/jukebox.js create mode 100644 public-shared/img/mstream-logo.svg delete mode 100755 public/img/album-art.jpg rename public/img/{mstream.png => designs/mstream-concept.png} (100%) mode change 100755 => 100644 rename public/img/{mstream-current.png => designs/mstreamV1.png} (100%) rename public/img/{mstream-paper.png => designs/mstreamV2.png} (100%) delete mode 100755 public/js/foundation/foundation.abide.js delete mode 100755 public/js/foundation/foundation.accordion.js delete mode 100755 public/js/foundation/foundation.alert.js delete mode 100755 public/js/foundation/foundation.clearing.js delete mode 100755 public/js/foundation/foundation.dropdown.js delete mode 100755 public/js/foundation/foundation.interchange.js delete mode 100755 public/js/foundation/foundation.js delete mode 100755 public/js/foundation/foundation.magellan.js delete mode 100755 public/js/foundation/foundation.offcanvas.js delete mode 100755 public/js/foundation/foundation.orbit.js delete mode 100755 public/js/foundation/foundation.reveal.js delete mode 100755 public/js/foundation/foundation.tab.js delete mode 100755 public/js/foundation/foundation.tooltip.js delete mode 100755 public/js/foundation/foundation.topbar.js delete mode 100755 public/js/jquery.js delete mode 100755 public/js/vendor/custom.modernizr.js delete mode 100755 public/js/vendor/jquery.cookie.js delete mode 100755 public/js/vendor/jquery.js create mode 100644 public/paper-player.zip delete mode 100644 public/paper-player/font-roboto/.bower.json delete mode 100644 public/paper-player/font-roboto/README.md delete mode 100644 public/paper-player/font-roboto/bower.json delete mode 100644 public/paper-player/font-roboto/roboto.html delete mode 100644 public/paper-player/iron-a11y-keys-behavior/.bower.json delete mode 100644 public/paper-player/iron-a11y-keys-behavior/.github/ISSUE_TEMPLATE.md delete mode 100644 public/paper-player/iron-a11y-keys-behavior/.gitignore delete mode 100644 public/paper-player/iron-a11y-keys-behavior/.travis.yml delete mode 100644 public/paper-player/iron-a11y-keys-behavior/CONTRIBUTING.md delete mode 100644 public/paper-player/iron-a11y-keys-behavior/README.md delete mode 100644 public/paper-player/iron-a11y-keys-behavior/bower.json delete mode 100644 public/paper-player/iron-a11y-keys-behavior/demo/index.html delete mode 100644 public/paper-player/iron-a11y-keys-behavior/demo/x-key-aware.html delete mode 100644 public/paper-player/iron-a11y-keys-behavior/index.html delete mode 100644 public/paper-player/iron-a11y-keys-behavior/iron-a11y-keys-behavior.html delete mode 100644 public/paper-player/iron-a11y-keys-behavior/test/basic-test.html delete mode 100755 public/paper-player/iron-a11y-keys-behavior/test/index.html delete mode 100644 public/paper-player/iron-behaviors/.bower.json delete mode 100644 public/paper-player/iron-behaviors/.github/ISSUE_TEMPLATE.md delete mode 100644 public/paper-player/iron-behaviors/.gitignore delete mode 100644 public/paper-player/iron-behaviors/.travis.yml delete mode 100644 public/paper-player/iron-behaviors/CONTRIBUTING.md delete mode 100644 public/paper-player/iron-behaviors/README.md delete mode 100644 public/paper-player/iron-behaviors/bower.json delete mode 100644 public/paper-player/iron-behaviors/demo/index.html delete mode 100644 public/paper-player/iron-behaviors/demo/simple-button.html delete mode 100644 public/paper-player/iron-behaviors/index.html delete mode 100644 public/paper-player/iron-behaviors/iron-button-state.html delete mode 100644 public/paper-player/iron-behaviors/iron-control-state.html delete mode 100644 public/paper-player/iron-behaviors/test/active-state.html delete mode 100644 public/paper-player/iron-behaviors/test/disabled-state.html delete mode 100644 public/paper-player/iron-behaviors/test/focused-state.html delete mode 100644 public/paper-player/iron-behaviors/test/index.html delete mode 100644 public/paper-player/iron-behaviors/test/test-elements.html delete mode 100644 public/paper-player/iron-checked-element-behavior/.bower.json delete mode 100644 public/paper-player/iron-checked-element-behavior/.github/ISSUE_TEMPLATE.md delete mode 100644 public/paper-player/iron-checked-element-behavior/.gitignore delete mode 100644 public/paper-player/iron-checked-element-behavior/.travis.yml delete mode 100644 public/paper-player/iron-checked-element-behavior/CONTRIBUTING.md delete mode 100644 public/paper-player/iron-checked-element-behavior/README.md delete mode 100644 public/paper-player/iron-checked-element-behavior/bower.json delete mode 100644 public/paper-player/iron-checked-element-behavior/demo/index.html delete mode 100644 public/paper-player/iron-checked-element-behavior/demo/simple-checkbox.html delete mode 100644 public/paper-player/iron-checked-element-behavior/index.html delete mode 100644 public/paper-player/iron-checked-element-behavior/iron-checked-element-behavior.html delete mode 100644 public/paper-player/iron-checked-element-behavior/test/basic.html delete mode 100644 public/paper-player/iron-checked-element-behavior/test/index.html delete mode 100644 public/paper-player/iron-checked-element-behavior/test/simple-checkbox.html delete mode 100644 public/paper-player/iron-flex-layout/.bower.json delete mode 100644 public/paper-player/iron-flex-layout/.gitignore delete mode 100644 public/paper-player/iron-flex-layout/.travis.yml delete mode 100644 public/paper-player/iron-flex-layout/CONTRIBUTING.md delete mode 100644 public/paper-player/iron-flex-layout/README.md delete mode 100644 public/paper-player/iron-flex-layout/bower.json delete mode 100644 public/paper-player/iron-flex-layout/classes/iron-flex-layout.html delete mode 100644 public/paper-player/iron-flex-layout/classes/iron-shadow-flex-layout.html delete mode 100644 public/paper-player/iron-flex-layout/demo/index.html delete mode 100644 public/paper-player/iron-flex-layout/index.html delete mode 100644 public/paper-player/iron-flex-layout/iron-flex-layout-classes.html delete mode 100644 public/paper-player/iron-flex-layout/iron-flex-layout.html delete mode 100644 public/paper-player/iron-flex-layout/test/index.html delete mode 100644 public/paper-player/iron-flex-layout/test/iron-flex-layout-classes.html delete mode 100644 public/paper-player/iron-flex-layout/test/iron-flex-layout.html delete mode 100644 public/paper-player/iron-form-element-behavior/.bower.json delete mode 100644 public/paper-player/iron-form-element-behavior/.gitignore delete mode 100644 public/paper-player/iron-form-element-behavior/.travis.yml delete mode 100644 public/paper-player/iron-form-element-behavior/CONTRIBUTING.md delete mode 100644 public/paper-player/iron-form-element-behavior/README.md delete mode 100644 public/paper-player/iron-form-element-behavior/bower.json delete mode 100644 public/paper-player/iron-form-element-behavior/demo/index.html delete mode 100644 public/paper-player/iron-form-element-behavior/demo/simple-element.html delete mode 100644 public/paper-player/iron-form-element-behavior/demo/simple-form.html delete mode 100644 public/paper-player/iron-form-element-behavior/index.html delete mode 100644 public/paper-player/iron-form-element-behavior/iron-form-element-behavior.html delete mode 100644 public/paper-player/iron-form-element-behavior/test/basic.html delete mode 100644 public/paper-player/iron-form-element-behavior/test/index.html delete mode 100644 public/paper-player/iron-form-element-behavior/test/simple-element.html delete mode 100644 public/paper-player/iron-form-element-behavior/test/simple-form.html delete mode 100644 public/paper-player/iron-icon/.bower.json delete mode 100644 public/paper-player/iron-icon/.github/ISSUE_TEMPLATE.md delete mode 100644 public/paper-player/iron-icon/.gitignore delete mode 100644 public/paper-player/iron-icon/.travis.yml delete mode 100644 public/paper-player/iron-icon/CONTRIBUTING.md delete mode 100644 public/paper-player/iron-icon/README.md delete mode 100644 public/paper-player/iron-icon/bower.json delete mode 100644 public/paper-player/iron-icon/demo/async.html delete mode 100644 public/paper-player/iron-icon/demo/index.html delete mode 100644 public/paper-player/iron-icon/demo/location.png delete mode 100755 public/paper-player/iron-icon/hero.svg delete mode 100644 public/paper-player/iron-icon/index.html delete mode 100644 public/paper-player/iron-icon/iron-icon.html delete mode 100644 public/paper-player/iron-icon/test/index.html delete mode 100644 public/paper-player/iron-icon/test/iron-icon.html delete mode 100644 public/paper-player/iron-icons/.bower.json delete mode 100644 public/paper-player/iron-icons/.gitignore delete mode 100644 public/paper-player/iron-icons/.travis.yml delete mode 100644 public/paper-player/iron-icons/CONTRIBUTING.md delete mode 100644 public/paper-player/iron-icons/README.md delete mode 100644 public/paper-player/iron-icons/av-icons.html delete mode 100644 public/paper-player/iron-icons/bower.json delete mode 100644 public/paper-player/iron-icons/communication-icons.html delete mode 100644 public/paper-player/iron-icons/demo/index.html delete mode 100644 public/paper-player/iron-icons/device-icons.html delete mode 100644 public/paper-player/iron-icons/editor-icons.html delete mode 100644 public/paper-player/iron-icons/hardware-icons.html delete mode 100755 public/paper-player/iron-icons/hero.svg delete mode 100644 public/paper-player/iron-icons/image-icons.html delete mode 100644 public/paper-player/iron-icons/index.html delete mode 100644 public/paper-player/iron-icons/iron-icons.html delete mode 100644 public/paper-player/iron-icons/maps-icons.html delete mode 100644 public/paper-player/iron-icons/notification-icons.html delete mode 100644 public/paper-player/iron-icons/social-icons.html delete mode 100644 public/paper-player/iron-iconset-svg/.bower.json delete mode 100644 public/paper-player/iron-iconset-svg/.gitignore delete mode 100644 public/paper-player/iron-iconset-svg/.travis.yml delete mode 100644 public/paper-player/iron-iconset-svg/CONTRIBUTING.md delete mode 100644 public/paper-player/iron-iconset-svg/README.md delete mode 100644 public/paper-player/iron-iconset-svg/bower.json delete mode 100644 public/paper-player/iron-iconset-svg/demo/index.html delete mode 100644 public/paper-player/iron-iconset-svg/demo/svg-sample-icons.html delete mode 100644 public/paper-player/iron-iconset-svg/index.html delete mode 100644 public/paper-player/iron-iconset-svg/iron-iconset-svg.html delete mode 100644 public/paper-player/iron-iconset-svg/test/index.html delete mode 100644 public/paper-player/iron-iconset-svg/test/iron-iconset-svg.html delete mode 100644 public/paper-player/iron-meta/.bower.json delete mode 100644 public/paper-player/iron-meta/.gitignore delete mode 100644 public/paper-player/iron-meta/.travis.yml delete mode 100644 public/paper-player/iron-meta/CONTRIBUTING.md delete mode 100644 public/paper-player/iron-meta/README.md delete mode 100644 public/paper-player/iron-meta/bower.json delete mode 100644 public/paper-player/iron-meta/demo/index.html delete mode 100755 public/paper-player/iron-meta/hero.svg delete mode 100644 public/paper-player/iron-meta/index.html delete mode 100644 public/paper-player/iron-meta/iron-meta.html delete mode 100644 public/paper-player/iron-meta/test/basic.html delete mode 100644 public/paper-player/iron-meta/test/index.html delete mode 100644 public/paper-player/iron-meta/test/iron-meta.html delete mode 100644 public/paper-player/iron-range-behavior/.bower.json delete mode 100644 public/paper-player/iron-range-behavior/.github/ISSUE_TEMPLATE.md delete mode 100644 public/paper-player/iron-range-behavior/.gitignore delete mode 100644 public/paper-player/iron-range-behavior/.travis.yml delete mode 100644 public/paper-player/iron-range-behavior/CONTRIBUTING.md delete mode 100644 public/paper-player/iron-range-behavior/README.md delete mode 100644 public/paper-player/iron-range-behavior/bower.json delete mode 100644 public/paper-player/iron-range-behavior/demo/index.html delete mode 100644 public/paper-player/iron-range-behavior/index.html delete mode 100644 public/paper-player/iron-range-behavior/iron-range-behavior.html delete mode 100644 public/paper-player/iron-range-behavior/test/basic.html delete mode 100644 public/paper-player/iron-range-behavior/test/index.html delete mode 100644 public/paper-player/iron-range-behavior/test/x-progressbar.html delete mode 100644 public/paper-player/iron-validatable-behavior/.bower.json delete mode 100644 public/paper-player/iron-validatable-behavior/.github/ISSUE_TEMPLATE.md delete mode 100644 public/paper-player/iron-validatable-behavior/.gitignore delete mode 100644 public/paper-player/iron-validatable-behavior/.travis.yml delete mode 100644 public/paper-player/iron-validatable-behavior/CONTRIBUTING.md delete mode 100644 public/paper-player/iron-validatable-behavior/README.md delete mode 100644 public/paper-player/iron-validatable-behavior/bower.json delete mode 100644 public/paper-player/iron-validatable-behavior/demo/cats-only.html delete mode 100644 public/paper-player/iron-validatable-behavior/demo/index.html delete mode 100644 public/paper-player/iron-validatable-behavior/demo/validatable-input.html delete mode 100644 public/paper-player/iron-validatable-behavior/index.html delete mode 100644 public/paper-player/iron-validatable-behavior/iron-validatable-behavior.html delete mode 100644 public/paper-player/iron-validatable-behavior/test/cats-only.html delete mode 100644 public/paper-player/iron-validatable-behavior/test/dogs-only.html delete mode 100644 public/paper-player/iron-validatable-behavior/test/index.html delete mode 100644 public/paper-player/iron-validatable-behavior/test/iron-validatable-behavior.html delete mode 100644 public/paper-player/iron-validatable-behavior/test/test-validatable.html delete mode 100644 public/paper-player/paper-audio-player/.bower.json delete mode 100644 public/paper-player/paper-audio-player/LICENSE.txt delete mode 100755 public/paper-player/paper-audio-player/README.md delete mode 100755 public/paper-player/paper-audio-player/bower.json delete mode 100644 public/paper-player/paper-audio-player/gulpfile.js delete mode 100755 public/paper-player/paper-audio-player/index.html delete mode 100644 public/paper-player/paper-audio-player/package.json delete mode 100755 public/paper-player/paper-audio-player/paper-audio-player.html delete mode 100644 public/paper-player/paper-behaviors/.bower.json delete mode 100644 public/paper-player/paper-behaviors/.github/ISSUE_TEMPLATE.md delete mode 100644 public/paper-player/paper-behaviors/.gitignore delete mode 100644 public/paper-player/paper-behaviors/.travis.yml delete mode 100644 public/paper-player/paper-behaviors/CONTRIBUTING.md delete mode 100644 public/paper-player/paper-behaviors/README.md delete mode 100644 public/paper-player/paper-behaviors/bower.json delete mode 100644 public/paper-player/paper-behaviors/demo/index.html delete mode 100644 public/paper-player/paper-behaviors/demo/paper-button.html delete mode 100644 public/paper-player/paper-behaviors/demo/paper-radio-button.html delete mode 100644 public/paper-player/paper-behaviors/index.html delete mode 100644 public/paper-player/paper-behaviors/paper-button-behavior.html delete mode 100644 public/paper-player/paper-behaviors/paper-checked-element-behavior.html delete mode 100644 public/paper-player/paper-behaviors/paper-inky-focus-behavior.html delete mode 100644 public/paper-player/paper-behaviors/paper-ripple-behavior.html delete mode 100644 public/paper-player/paper-behaviors/test/index.html delete mode 100644 public/paper-player/paper-behaviors/test/paper-button-behavior.html delete mode 100644 public/paper-player/paper-behaviors/test/paper-checked-element-behavior.html delete mode 100644 public/paper-player/paper-behaviors/test/paper-radio-button-behavior.html delete mode 100644 public/paper-player/paper-behaviors/test/paper-ripple-behavior.html delete mode 100644 public/paper-player/paper-behaviors/test/shadowed-ripple.html delete mode 100644 public/paper-player/paper-behaviors/test/test-button.html delete mode 100644 public/paper-player/paper-behaviors/test/test-radio-button.html delete mode 100644 public/paper-player/paper-icon-button/.bower.json delete mode 100644 public/paper-player/paper-icon-button/.gitignore delete mode 100644 public/paper-player/paper-icon-button/.travis.yml delete mode 100644 public/paper-player/paper-icon-button/CONTRIBUTING.md delete mode 100644 public/paper-player/paper-icon-button/README.md delete mode 100644 public/paper-player/paper-icon-button/bower.json delete mode 100644 public/paper-player/paper-icon-button/demo/index.html delete mode 100644 public/paper-player/paper-icon-button/index.html delete mode 100644 public/paper-player/paper-icon-button/paper-icon-button.html delete mode 100644 public/paper-player/paper-icon-button/test/a11y.html delete mode 100644 public/paper-player/paper-icon-button/test/basic.html delete mode 100644 public/paper-player/paper-icon-button/test/index.html delete mode 100644 public/paper-player/paper-progress/.bower.json delete mode 100644 public/paper-player/paper-progress/.gitignore delete mode 100644 public/paper-player/paper-progress/.travis.yml delete mode 100644 public/paper-player/paper-progress/CONTRIBUTING.md delete mode 100644 public/paper-player/paper-progress/README.md delete mode 100644 public/paper-player/paper-progress/bower.json delete mode 100644 public/paper-player/paper-progress/demo/index.html delete mode 100755 public/paper-player/paper-progress/hero.svg delete mode 100644 public/paper-player/paper-progress/index.html delete mode 100644 public/paper-player/paper-progress/paper-progress.html delete mode 100644 public/paper-player/paper-progress/test/basic.html delete mode 100644 public/paper-player/paper-progress/test/index.html delete mode 100644 public/paper-player/paper-ripple/.bower.json delete mode 100644 public/paper-player/paper-ripple/.github/ISSUE_TEMPLATE.md delete mode 100644 public/paper-player/paper-ripple/.gitignore delete mode 100644 public/paper-player/paper-ripple/.travis.yml delete mode 100644 public/paper-player/paper-ripple/CONTRIBUTING.md delete mode 100644 public/paper-player/paper-ripple/README.md delete mode 100644 public/paper-player/paper-ripple/bower.json delete mode 100644 public/paper-player/paper-ripple/demo/index.html delete mode 100755 public/paper-player/paper-ripple/hero.svg delete mode 100644 public/paper-player/paper-ripple/index.html delete mode 100644 public/paper-player/paper-ripple/paper-ripple.html delete mode 100644 public/paper-player/paper-ripple/test/index.html delete mode 100644 public/paper-player/paper-ripple/test/paper-ripple.html delete mode 100644 public/paper-player/paper-styles/.bower.json delete mode 100644 public/paper-player/paper-styles/CONTRIBUTING.md delete mode 100644 public/paper-player/paper-styles/README.md delete mode 100644 public/paper-player/paper-styles/bower.json delete mode 100644 public/paper-player/paper-styles/classes/global.html delete mode 100644 public/paper-player/paper-styles/classes/shadow-layout.html delete mode 100644 public/paper-player/paper-styles/classes/shadow.html delete mode 100644 public/paper-player/paper-styles/classes/typography.html delete mode 100644 public/paper-player/paper-styles/color.html delete mode 100644 public/paper-player/paper-styles/default-theme.html delete mode 100644 public/paper-player/paper-styles/demo-pages.html delete mode 100644 public/paper-player/paper-styles/demo.css delete mode 100644 public/paper-player/paper-styles/demo/index.html delete mode 100644 public/paper-player/paper-styles/index.html delete mode 100644 public/paper-player/paper-styles/paper-styles-classes.html delete mode 100644 public/paper-player/paper-styles/paper-styles.html delete mode 100644 public/paper-player/paper-styles/shadow.html delete mode 100644 public/paper-player/paper-styles/typography.html delete mode 100644 public/paper-player/polymer/.bower.json delete mode 100644 public/paper-player/polymer/LICENSE.txt delete mode 100644 public/paper-player/polymer/bower.json delete mode 100644 public/paper-player/polymer/build.log delete mode 100644 public/paper-player/polymer/polymer-micro.html delete mode 100644 public/paper-player/polymer/polymer-mini.html delete mode 100644 public/paper-player/polymer/polymer.html delete mode 100644 public/paper-player/webcomponentsjs/.bower.json delete mode 100644 public/paper-player/webcomponentsjs/CustomElements.js delete mode 100644 public/paper-player/webcomponentsjs/CustomElements.min.js delete mode 100644 public/paper-player/webcomponentsjs/HTMLImports.js delete mode 100644 public/paper-player/webcomponentsjs/HTMLImports.min.js delete mode 100644 public/paper-player/webcomponentsjs/MutationObserver.js delete mode 100644 public/paper-player/webcomponentsjs/MutationObserver.min.js delete mode 100644 public/paper-player/webcomponentsjs/README.md delete mode 100644 public/paper-player/webcomponentsjs/ShadowDOM.js delete mode 100644 public/paper-player/webcomponentsjs/ShadowDOM.min.js delete mode 100644 public/paper-player/webcomponentsjs/bower.json delete mode 100644 public/paper-player/webcomponentsjs/bower_components/accessibility-developer-tools/.bower.json delete mode 100644 public/paper-player/webcomponentsjs/bower_components/accessibility-developer-tools/Changelog.md delete mode 100644 public/paper-player/webcomponentsjs/bower_components/accessibility-developer-tools/LICENSE delete mode 100644 public/paper-player/webcomponentsjs/bower_components/accessibility-developer-tools/README.md delete mode 100644 public/paper-player/webcomponentsjs/bower_components/accessibility-developer-tools/bower.json delete mode 100644 public/paper-player/webcomponentsjs/bower_components/accessibility-developer-tools/dist/js/axs_testing.js delete mode 100644 public/paper-player/webcomponentsjs/bower_components/async/.bower.json delete mode 100644 public/paper-player/webcomponentsjs/bower_components/async/CHANGELOG.md delete mode 100644 public/paper-player/webcomponentsjs/bower_components/async/LICENSE delete mode 100644 public/paper-player/webcomponentsjs/bower_components/async/Makefile delete mode 100644 public/paper-player/webcomponentsjs/bower_components/async/README.md delete mode 100644 public/paper-player/webcomponentsjs/bower_components/async/bower.json delete mode 100644 public/paper-player/webcomponentsjs/bower_components/async/component.json delete mode 100644 public/paper-player/webcomponentsjs/bower_components/async/deps/nodeunit.css delete mode 100644 public/paper-player/webcomponentsjs/bower_components/async/deps/nodeunit.js delete mode 100644 public/paper-player/webcomponentsjs/bower_components/async/dist/async.js delete mode 100644 public/paper-player/webcomponentsjs/bower_components/async/dist/async.min.js delete mode 100644 public/paper-player/webcomponentsjs/bower_components/async/dist/async.min.map delete mode 100644 public/paper-player/webcomponentsjs/bower_components/async/karma.conf.js delete mode 100644 public/paper-player/webcomponentsjs/bower_components/async/lib/async.js delete mode 100644 public/paper-player/webcomponentsjs/bower_components/async/mocha_test/compose.js delete mode 100644 public/paper-player/webcomponentsjs/bower_components/async/mocha_test/forever.js delete mode 100644 public/paper-player/webcomponentsjs/bower_components/async/mocha_test/support/is_browser.js delete mode 100644 public/paper-player/webcomponentsjs/bower_components/async/package.json delete mode 100755 public/paper-player/webcomponentsjs/bower_components/async/perf/benchmark.js delete mode 100644 public/paper-player/webcomponentsjs/bower_components/async/perf/memory.js delete mode 100644 public/paper-player/webcomponentsjs/bower_components/async/perf/suites.js delete mode 100755 public/paper-player/webcomponentsjs/bower_components/async/support/sync-package-managers.js delete mode 100644 public/paper-player/webcomponentsjs/bower_components/chai/.bower.json delete mode 100644 public/paper-player/webcomponentsjs/bower_components/chai/CODE_OF_CONDUCT.md delete mode 100644 public/paper-player/webcomponentsjs/bower_components/chai/CONTRIBUTING.md delete mode 100644 public/paper-player/webcomponentsjs/bower_components/chai/History.md delete mode 100644 public/paper-player/webcomponentsjs/bower_components/chai/README.md delete mode 100644 public/paper-player/webcomponentsjs/bower_components/chai/ReleaseNotes.md delete mode 100644 public/paper-player/webcomponentsjs/bower_components/chai/bower.json delete mode 100644 public/paper-player/webcomponentsjs/bower_components/chai/chai.js delete mode 100644 public/paper-player/webcomponentsjs/bower_components/chai/karma.conf.js delete mode 100644 public/paper-player/webcomponentsjs/bower_components/chai/karma.sauce.js delete mode 100644 public/paper-player/webcomponentsjs/bower_components/chai/package.json delete mode 100644 public/paper-player/webcomponentsjs/bower_components/chai/sauce.browsers.js delete mode 100644 public/paper-player/webcomponentsjs/bower_components/lodash/.bower.json delete mode 100644 public/paper-player/webcomponentsjs/bower_components/lodash/LICENSE delete mode 100644 public/paper-player/webcomponentsjs/bower_components/lodash/bower.json delete mode 100644 public/paper-player/webcomponentsjs/bower_components/lodash/lodash.js delete mode 100644 public/paper-player/webcomponentsjs/bower_components/lodash/lodash.min.js delete mode 100644 public/paper-player/webcomponentsjs/bower_components/mocha/.bower.json delete mode 100644 public/paper-player/webcomponentsjs/bower_components/mocha/.editorconfig delete mode 100644 public/paper-player/webcomponentsjs/bower_components/mocha/.eslintrc delete mode 100644 public/paper-player/webcomponentsjs/bower_components/mocha/.mailmap delete mode 100644 public/paper-player/webcomponentsjs/bower_components/mocha/CHANGELOG.md delete mode 100644 public/paper-player/webcomponentsjs/bower_components/mocha/CONTRIBUTING.md delete mode 100644 public/paper-player/webcomponentsjs/bower_components/mocha/LICENSE delete mode 100644 public/paper-player/webcomponentsjs/bower_components/mocha/README.md delete mode 100644 public/paper-player/webcomponentsjs/bower_components/mocha/assets/mocha-banner-192.png delete mode 100644 public/paper-player/webcomponentsjs/bower_components/mocha/assets/mocha-banner.svg delete mode 100644 public/paper-player/webcomponentsjs/bower_components/mocha/assets/mocha-logo-128.png delete mode 100644 public/paper-player/webcomponentsjs/bower_components/mocha/assets/mocha-logo-192.png delete mode 100644 public/paper-player/webcomponentsjs/bower_components/mocha/assets/mocha-logo-64.png delete mode 100644 public/paper-player/webcomponentsjs/bower_components/mocha/assets/mocha-logo.svg delete mode 100644 public/paper-player/webcomponentsjs/bower_components/mocha/bower.json delete mode 100644 public/paper-player/webcomponentsjs/bower_components/mocha/browser-entry.js delete mode 100644 public/paper-player/webcomponentsjs/bower_components/mocha/karma.conf.js delete mode 100644 public/paper-player/webcomponentsjs/bower_components/mocha/media/logo.svg delete mode 100644 public/paper-player/webcomponentsjs/bower_components/mocha/mocha.css delete mode 100644 public/paper-player/webcomponentsjs/bower_components/mocha/mocha.js delete mode 100644 public/paper-player/webcomponentsjs/bower_components/mocha/scripts/upgrade-npm.js delete mode 100644 public/paper-player/webcomponentsjs/bower_components/sinon-chai/.bower.json delete mode 100644 public/paper-player/webcomponentsjs/bower_components/sinon-chai/.gitignore delete mode 100644 public/paper-player/webcomponentsjs/bower_components/sinon-chai/.jshintrc delete mode 100644 public/paper-player/webcomponentsjs/bower_components/sinon-chai/.travis.yml delete mode 100644 public/paper-player/webcomponentsjs/bower_components/sinon-chai/LICENSE.txt delete mode 100644 public/paper-player/webcomponentsjs/bower_components/sinon-chai/README.md delete mode 100644 public/paper-player/webcomponentsjs/bower_components/sinon-chai/lib/sinon-chai.js delete mode 100644 public/paper-player/webcomponentsjs/bower_components/sinon-chai/package.json delete mode 100644 public/paper-player/webcomponentsjs/bower_components/sinon-chai/test/callArguments.coffee delete mode 100644 public/paper-player/webcomponentsjs/bower_components/sinon-chai/test/callContext.coffee delete mode 100644 public/paper-player/webcomponentsjs/bower_components/sinon-chai/test/callCount.coffee delete mode 100644 public/paper-player/webcomponentsjs/bower_components/sinon-chai/test/callOrder.coffee delete mode 100644 public/paper-player/webcomponentsjs/bower_components/sinon-chai/test/callingWithNew.coffee delete mode 100644 public/paper-player/webcomponentsjs/bower_components/sinon-chai/test/common.js delete mode 100644 public/paper-player/webcomponentsjs/bower_components/sinon-chai/test/messages.coffee delete mode 100644 public/paper-player/webcomponentsjs/bower_components/sinon-chai/test/mocha.opts delete mode 100644 public/paper-player/webcomponentsjs/bower_components/sinon-chai/test/regressions.coffee delete mode 100644 public/paper-player/webcomponentsjs/bower_components/sinon-chai/test/returning.coffee delete mode 100644 public/paper-player/webcomponentsjs/bower_components/sinon-chai/test/throwing.coffee delete mode 100644 public/paper-player/webcomponentsjs/bower_components/sinonjs/.bower.json delete mode 100644 public/paper-player/webcomponentsjs/bower_components/sinonjs/README.md delete mode 100644 public/paper-player/webcomponentsjs/bower_components/sinonjs/bower.json delete mode 100644 public/paper-player/webcomponentsjs/bower_components/sinonjs/sinon.js delete mode 100644 public/paper-player/webcomponentsjs/bower_components/stacky/.bower.json delete mode 100644 public/paper-player/webcomponentsjs/bower_components/stacky/LICENSE delete mode 100644 public/paper-player/webcomponentsjs/bower_components/stacky/bower.json delete mode 100644 public/paper-player/webcomponentsjs/bower_components/stacky/browser.js delete mode 100644 public/paper-player/webcomponentsjs/bower_components/stacky/lib/formatting.js delete mode 100644 public/paper-player/webcomponentsjs/bower_components/stacky/lib/index.js delete mode 100644 public/paper-player/webcomponentsjs/bower_components/stacky/lib/normalization.js delete mode 100644 public/paper-player/webcomponentsjs/bower_components/stacky/lib/parsing.js delete mode 100644 public/paper-player/webcomponentsjs/bower_components/test-fixture/.bower.json delete mode 100644 public/paper-player/webcomponentsjs/bower_components/test-fixture/.gitignore delete mode 100644 public/paper-player/webcomponentsjs/bower_components/test-fixture/.travis.yml delete mode 100644 public/paper-player/webcomponentsjs/bower_components/test-fixture/CONTRIBUTING.md delete mode 100644 public/paper-player/webcomponentsjs/bower_components/test-fixture/README.md delete mode 100644 public/paper-player/webcomponentsjs/bower_components/test-fixture/bower.json delete mode 100644 public/paper-player/webcomponentsjs/bower_components/test-fixture/package.json delete mode 100644 public/paper-player/webcomponentsjs/bower_components/test-fixture/test-fixture-mocha.js delete mode 100644 public/paper-player/webcomponentsjs/bower_components/test-fixture/test-fixture.html delete mode 100644 public/paper-player/webcomponentsjs/bower_components/test-fixture/test/handle-multiple-registrations.html delete mode 100644 public/paper-player/webcomponentsjs/bower_components/test-fixture/test/index.html delete mode 100644 public/paper-player/webcomponentsjs/bower_components/test-fixture/test/test-fixture.html delete mode 100644 public/paper-player/webcomponentsjs/bower_components/test-fixture/wct.conf.json delete mode 100644 public/paper-player/webcomponentsjs/bower_components/web-component-tester/.bower.json delete mode 100644 public/paper-player/webcomponentsjs/bower_components/web-component-tester/bower.json delete mode 100644 public/paper-player/webcomponentsjs/bower_components/web-component-tester/browser.js delete mode 100644 public/paper-player/webcomponentsjs/bower_components/web-component-tester/browser.js.map delete mode 100644 public/paper-player/webcomponentsjs/bower_components/web-component-tester/data/a11ySuite.js delete mode 100644 public/paper-player/webcomponentsjs/bower_components/web-component-tester/data/index.html delete mode 100644 public/paper-player/webcomponentsjs/build.log delete mode 100644 public/paper-player/webcomponentsjs/package.json delete mode 100644 public/paper-player/webcomponentsjs/webcomponents-lite.js delete mode 100644 public/paper-player/webcomponentsjs/webcomponents-lite.min.js delete mode 100644 public/paper-player/webcomponentsjs/webcomponents.js delete mode 100644 public/paper-player/webcomponentsjs/webcomponents.min.js delete mode 100755 public/scss/.sass-cache/a4186c235974f88301a28f06cb9640b47c56acf2/master.scssc diff --git a/SKININNG.md b/docs/SKININNG.md similarity index 100% rename from SKININNG.md rename to docs/SKININNG.md diff --git a/exampleJSON/allOptions.json b/docs/exampleJSON/allOptions.json similarity index 100% rename from exampleJSON/allOptions.json rename to docs/exampleJSON/allOptions.json diff --git a/exampleJSON/exampleNewJSON.json b/docs/exampleJSON/exampleNewJSON.json similarity index 100% rename from exampleJSON/exampleNewJSON.json rename to docs/exampleJSON/exampleNewJSON.json diff --git a/exampleJSON/remote.json b/docs/exampleJSON/remote.json similarity index 100% rename from exampleJSON/remote.json rename to docs/exampleJSON/remote.json diff --git a/exampleJSON/skeleton.json b/docs/exampleJSON/skeleton.json similarity index 100% rename from exampleJSON/skeleton.json rename to docs/exampleJSON/skeleton.json diff --git a/modules/configure-json-file.js b/modules/configure-json-file.js index db00e8e..8474949 100644 --- a/modules/configure-json-file.js +++ b/modules/configure-json-file.js @@ -15,6 +15,11 @@ exports.setup = function(args, rootDir){ return {error:"Failed to parse JSON file"}; } + console.log(loadJson); + console.log(loadJson); + console.log(loadJson); + + if(!loadJson.port){ loadJson.port = 5050; diff --git a/modules/jukebox.js b/modules/jukebox.js new file mode 100644 index 0000000..6e908c1 --- /dev/null +++ b/modules/jukebox.js @@ -0,0 +1,99 @@ +// TODO: Properly integrate this +//https://gist.github.com/martinsik/2031681 + +// Websocket Server +const WebSocketServer = require('ws').Server; + + + +// list of currently connected clients (users) +var clients = { }; + + +exports.setup = function(mstream, server, program){ + const wss = new WebSocketServer({ server: server }); + // This callback function is called every time someone + // tries to connect to the WebSocket server + wss.on('connection', function(connection) { + + // accept connection - you should check 'request.origin' to make sure that + // client is connecting from your website + // var connection = request.accept(null, request.origin); + console.log((new Date()) + ' Connection accepted.'); + + + // Generate code and assure it doesn't exist + var code; + var n = 0; + while (true) { + code = Math.floor(Math.random()*90000) + 10000; + if(!(code in clients)){ + break; + } + if(n === 10){ + console.log('Failed to create ID for jukebox.'); + // FIXME: Close connection + return; + } + n++; + } + + // Send Code + connection.send(JSON.stringify( { code: code} )); + // Add code to clients object + clients[code] = connection; + + + // user sent some message + connection.on('message', function(message) { + if (message.type === 'utf8') { // accept only text + // Send client code back + connection.send(JSON.stringify( { code: code} )); + + // FIXME: Will need some work to add more commands + } + }); + + // user disconnected + connection.on('close', function(connection) { + // Remove client from array + delete clients[code]; + }); + + }); + + + + // TODO: Get Album Art calls + mstream.post( '/push-to-client', function(req, res){ + // Get client id + console.log(req.body.json); + const json = JSON.parse(req.body.json); + console.log(json); + console.log(json.code); + console.log(json.command); + + + // Check if client ID exists + const clientCode = json.code; + const command = json.command; + console.log(clientCode); + console.log(clientCode); + console.log(clientCode); + console.log(command); + + + if(!(clientCode in clients)){ + res.status(500).json({ error: 'Client code not found' }); + } + + // TODO: Check if command logic makes sense + + // Push commands to client + clients[clientCode].send(JSON.stringify({command:command})); + + // Send confirmation back to user + res.json({ status: 'done' }); + }); + +} diff --git a/mstream.js b/mstream.js index 7a2174a..ae374b6 100755 --- a/mstream.js +++ b/mstream.js @@ -400,8 +400,8 @@ mstream.post('/download', function (req, res){ // ============================================================================ -// // New Way -// // TODO: We need to pull this from the program var +// New Way +// We need to pull this from the program var var dbSettings = program.database_plugin; const mstreamDB = require('./modules/db-management/database-master.js'); mstreamDB.setup(mstream, program); @@ -426,92 +426,10 @@ mstream.post( '/get-album-art', function(req, res){ }); -// TODO: Properly integrate this -//https://gist.github.com/martinsik/2031681 - -// Websocket Server -const WebSocketServer = require('ws').Server; -const wss = new WebSocketServer({ server: server }); - - -// list of currently connected clients (users) -var clients = { }; - -// This callback function is called every time someone -// tries to connect to the WebSocket server -wss.on('connection', function(connection) { - - // accept connection - you should check 'request.origin' to make sure that - // client is connecting from your website - // var connection = request.accept(null, request.origin); - console.log((new Date()) + ' Connection accepted.'); - - - // Generate code and assure it doesn't exist - var code; - var n = 0; - while (true) { - code = Math.floor(Math.random()*90000) + 10000; - if(!(code in clients)){ - break; - } - if(n === 10){ - console.log('Failed to create ID for jukebox.'); - // FIXME: Close connection - return; - } - n++; - } - - // Send Code - connection.send(JSON.stringify( { code: code} )); - // Add code to clients object - clients[code] = connection; - - - // user sent some message - connection.on('message', function(message) { - if (message.type === 'utf8') { // accept only text - // Send client code back - connection.send(JSON.stringify( { code: code} )); - - // FIXME: Will need some work to add more commands - } - }); - - // user disconnected - connection.on('close', function(connection) { - // Remove client from array - delete clients[code]; - }); - -}); - - - -// TODO: Get Album Art calls -mstream.post( '/push-to-client', function(req, res){ - // Get client id - console.log(req.body.json); - const json = JSON.parse(req.body.json); - console.log(json); - // Check if client ID exists - const clientCode = json.code; - const command = json.command; - - if(!(clientCode in clients)){ - res.status(500).json({ error: 'Client code not found' }); - } - - // TODO: Check if command logic makes sense - - // Push commands to client - clients[clientCode].send(JSON.stringify({command:command})); - - // Send confirmation back to user - res.json({ status: 'done' }); -}); +// JukeBox +const jukebox = require('./modules/jukebox.js'); +jukebox.setup(mstream, server, program); diff --git a/public-shared/css/shared.css b/public-shared/css/shared.css index 56a4a13..9c212f9 100644 --- a/public-shared/css/shared.css +++ b/public-shared/css/shared.css @@ -9,9 +9,23 @@ body{ .header{ margin: 0; padding: 0; - overflow: hidden; background-color: #333; - height:20px; + height:25px; +} + +.mstream-image{ + height:100%; + background-color: white; + border-radius: 0 0 3px 3px; + box-shadow: 0 0 5px #8D8D8D; +} + +.logo-box{ + overflow-y: visible; + width: 1px; + height: 140%; + margin-left: 35px; + z-index: 99; } .playlist-header{ @@ -34,6 +48,7 @@ body{ overflow-y: scroll; height:calc(100% - 120px); background-color: rgba(250,250,250, .50); + font-family: "Helvetica Neue", "Helvetica", Helvetica, Arial, sans-serif; } #playlist{ @@ -42,8 +57,8 @@ body{ } .playlist-item{ - height:30px; - border-bottom: 1px solid black; + height:auto; + border-bottom:solid 1px #b4b4b4; cursor: pointer; width: 100%; @@ -144,10 +159,12 @@ body{ background-color: rgba(255,0,0, .85); } .song-area{ - height: 100%; display: block; - width: calc(100% - 29px); + width: calc(100% - 49px); float: left; + padding-top: 12px; + padding-bottom: 10px; + padding-left: 12px; } @@ -183,7 +200,7 @@ body{ font-style: normal; margin-top: 3px; - margin-left: 5px; + margin-left: 2px; padding-bottom: 17px; /* This pushes the scr */ overflow-x: scroll; diff --git a/public-shared/img/mstream-logo.svg b/public-shared/img/mstream-logo.svg new file mode 100644 index 0000000..164177d --- /dev/null +++ b/public-shared/img/mstream-logo.svg @@ -0,0 +1,34 @@ + + + + + + + + + + + + + + + + diff --git a/public-shared/mstream.html b/public-shared/mstream.html index 6a99ebe..226aec8 100644 --- a/public-shared/mstream.html +++ b/public-shared/mstream.html @@ -206,6 +206,7 @@ // Check the key switch (event.keyCode) { case 32: //SpaceBar + event.preventDefault(); MSTREAM.playPause(); break; } @@ -219,7 +220,9 @@
- +
+ +
diff --git a/public/css/master.css b/public/css/master.css index 3c032c2..e4e11bf 100755 --- a/public/css/master.css +++ b/public/css/master.css @@ -45,7 +45,7 @@ background-color: #E6EBFA !important; height: calc(100% - 95px); } .scrollBoxHeight2{ - height: calc(100% - 140px); + height: calc(100% - 50px); } .playerControls{ height: 90px; @@ -449,3 +449,152 @@ h3 { display: block; margin: auto; } + + + + + + + + +.mstream-player{ + position:absolute; + bottom:0; + width:100%; + height: 50px; + overflow: hidden; + box-shadow: 0px -2px 3px rgba(50, 50, 50, 0.75); +} + +.previous-button{ + position:relative; + height: 100%; + width:50px; + background-color: #333333; + float:left; + overflow:hidden; + box-shadow: 5px 0 8px -2px rgba(31, 73, 125, 0.8), -5px 0 8px -2px rgba(31, 73, 125, 0.8); + cursor:pointer; +} +.play-pause-button{ + height: 100%; + width:50px; + background-color: rgb(102, 132, 178); + float:left; + overflow:hidden; + cursor:pointer; +} +.next-border{ + height: 100%; + padding: 8px; +} +.previous-border{ + height: 100%; + padding: 8px; +} +.play-pause-border{ + border-left: 5px solid rgb(102, 132, 178); + border-top: 5px solid rgb(102, 132, 178); + height: 100%; + padding: 3px; +} +.next-button{ + height: 100%; + width:50px; + background-color: #333333; + float:left; + position: relative; + overflow:hidden; + box-shadow: 5px 0 8px -2px rgba(31, 73, 125, 0.8), -5px 0 8px -2px rgba(31, 73, 125, 0.8); + cursor:pointer; +} +.progress-bar{ + height: 100%; + width: calc(100% - 152px); + background-color: rgba(51,51,51,.15); + float:left; + overflow-x: hidden; + border-right: 2px solid rgba(51,51,51,.15); + cursor: crosshair; +} + + +.removeSong{ + width: 29px !important; + height: 33px; + background-color: rgba(255,0,0, .7); + float: right; + + box-shadow: 0 2px 4px 0 rgba(0, 0, 0, 0.2), 0 3px 10px 0 rgba(0, 0, 0, 0.19); + + text-align: center; + font-size: 28px; + text-shadow: 0 1px darkred; + padding-bottom: 5px; + font-family: "Arial Black", Gadget, sans-serif; + opacity: 0.9; +} + +.removeSong:hover{ + opacity: 1; + background-color: rgba(255,0,0, .85); +} +.song-area{ + display: block; + width: calc(100% - 49px); + float: left; + padding-top: 12px; + padding-bottom: 10px; + padding-left: 12px; + +} + +.titlebar{ + height: 50%; + width:calc(100% - 190px); + background-color: rgba(255, 255, 255,0.7); + position: absolute; + margin-top: 10px; + border-radius: 5px; + box-shadow: 3px 3px 3px #888888; + margin-left: 20px; + + overflow-y: hidden; + white-space: nowrap; /* This is the secret to make text scroll left-to-right*/ +} +.pbar{ + background-color: rgb(102, 132, 178); + height: 100%; +} + +.playing{ + background-color: #E6EBFA !important; +} + + +.title-text{ + width: calc(100% - 100px); + float:left; + + font-family: '8BITWONDERNominal'; + font-weight: normal; + font-style: normal; + + margin-top: 3px; + margin-left: 2px; + + padding-bottom: 17px; /* This pushes the scr */ + overflow-x: scroll; + overflow-y: hidden; +} + +.duration-text{ + float: right; + width: 90px; + font-family: '8BITWONDERNominal'; + font-weight: normal; + font-style: normal; + margin-top: 3px; + text-align: right; + margin-right: 5px; +} diff --git a/public/img/album-art.jpg b/public/img/album-art.jpg deleted file mode 100755 index 48688b0740f69c87d989fbb664fd26d571319a02..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 181321 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 z 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 z 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 diff --git a/public/img/mstream.png b/public/img/designs/mstream-concept.png old mode 100755 new mode 100644 similarity index 100% rename from public/img/mstream.png rename to public/img/designs/mstream-concept.png diff --git a/public/img/mstream-current.png b/public/img/designs/mstreamV1.png similarity index 100% rename from public/img/mstream-current.png rename to public/img/designs/mstreamV1.png diff --git a/public/img/mstream-paper.png b/public/img/designs/mstreamV2.png similarity index 100% rename from public/img/mstream-paper.png rename to public/img/designs/mstreamV2.png diff --git a/public/js/foundation/foundation.abide.js b/public/js/foundation/foundation.abide.js deleted file mode 100755 index 1478b18..0000000 --- a/public/js/foundation/foundation.abide.js +++ /dev/null @@ -1,201 +0,0 @@ -;(function ($, window, document, undefined) { - 'use strict'; - - Foundation.libs.abide = { - name : 'abide', - - version : '5.0.0', - - settings : { - focus_on_invalid : true, - timeout : 1000, - patterns : { - alpha: /[a-zA-Z]+/, - alpha_numeric : /[a-zA-Z0-9]+/, - integer: /-?\d+/, - number: /-?(?:\d+|\d{1,3}(?:,\d{3})+)?(?:\.\d+)?/, - - // generic password: upper-case, lower-case, number/special character, and min 8 characters - password : /(?=^.{8,}$)((?=.*\d)|(?=.*\W+))(?![.\n])(?=.*[A-Z])(?=.*[a-z]).*$/, - - // amex, visa, diners - card : /^(?:4[0-9]{12}(?:[0-9]{3})?|5[1-5][0-9]{14}|6(?:011|5[0-9][0-9])[0-9]{12}|3[47][0-9]{13}|3(?:0[0-5]|[68][0-9])[0-9]{11}|(?:2131|1800|35\d{3})\d{11})$/, - cvv : /^([0-9]){3,4}$/, - - // http://www.whatwg.org/specs/web-apps/current-work/multipage/states-of-the-type-attribute.html#valid-e-mail-address - email : /^[a-zA-Z0-9.!#$%&'*+\/=?^_`{|}~-]+@[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?(?:\.[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?)*$/, - - url: /(https?|ftp|file|ssh):\/\/(((([a-zA-Z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(%[\da-f]{2})|[!\$&'\(\)\*\+,;=]|:)*@)?(((\d|[1-9]\d|1\d\d|2[0-4]\d|25[0-5])\.(\d|[1-9]\d|1\d\d|2[0-4]\d|25[0-5])\.(\d|[1-9]\d|1\d\d|2[0-4]\d|25[0-5])\.(\d|[1-9]\d|1\d\d|2[0-4]\d|25[0-5]))|((([a-zA-Z]|\d|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(([a-zA-Z]|\d|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])([a-zA-Z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])*([a-zA-Z]|\d|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])))\.)+(([a-zA-Z]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(([a-zA-Z]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])([a-zA-Z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])*([a-zA-Z]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])))\.?)(:\d*)?)(\/((([a-zA-Z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(%[\da-f]{2})|[!\$&'\(\)\*\+,;=]|:|@)+(\/(([a-zA-Z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(%[\da-f]{2})|[!\$&'\(\)\*\+,;=]|:|@)*)*)?)?(\?((([a-zA-Z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(%[\da-f]{2})|[!\$&'\(\)\*\+,;=]|:|@)|[\uE000-\uF8FF]|\/|\?)*)?(\#((([a-zA-Z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(%[\da-f]{2})|[!\$&'\(\)\*\+,;=]|:|@)|\/|\?)*)?/, - // abc.de - domain: /^([a-zA-Z0-9]([a-zA-Z0-9\-]{0,61}[a-zA-Z0-9])?\.)+[a-zA-Z]{2,6}$/, - - datetime: /([0-2][0-9]{3})\-([0-1][0-9])\-([0-3][0-9])T([0-5][0-9])\:([0-5][0-9])\:([0-5][0-9])(Z|([\-\+]([0-1][0-9])\:00))/, - // YYYY-MM-DD - date: /(?:19|20)[0-9]{2}-(?:(?:0[1-9]|1[0-2])-(?:0[1-9]|1[0-9]|2[0-9])|(?:(?!02)(?:0[1-9]|1[0-2])-(?:30))|(?:(?:0[13578]|1[02])-31))/, - // HH:MM:SS - time : /(0[0-9]|1[0-9]|2[0-3])(:[0-5][0-9]){2}/, - dateISO: /\d{4}[\/\-]\d{1,2}[\/\-]\d{1,2}/, - // MM/DD/YYYY - month_day_year : /(0[1-9]|1[012])[- \/.](0[1-9]|[12][0-9]|3[01])[- \/.](19|20)\d\d/, - - // #FFF or #FFFFFF - color: /^#?([a-fA-F0-9]{6}|[a-fA-F0-9]{3})$/ - } - }, - - timer : null, - - init : function (scope, method, options) { - this.bindings(method, options); - }, - - events : function (scope) { - var self = this, - form = $(scope).attr('novalidate', 'novalidate'), - settings = form.data('abide-init'); - - form - .off('.abide') - .on('submit.fndtn.abide validate.fndtn.abide', function (e) { - var is_ajax = /ajax/i.test($(this).attr('data-abide')); - return self.validate($(this).find('input, textarea, select').get(), e, is_ajax); - }) - .find('input, textarea, select') - .off('.abide') - .on('blur.fndtn.abide change.fndtn.abide', function (e) { - self.validate([this], e); - }) - .on('keydown.fndtn.abide', function (e) { - var settings = $(this).closest('form').data('abide-init'); - clearTimeout(self.timer); - self.timer = setTimeout(function () { - self.validate([this], e); - }.bind(this), settings.timeout); - }); - }, - - validate : function (els, e, is_ajax) { - var validations = this.parse_patterns(els), - validation_count = validations.length, - form = $(els[0]).closest('form'), - submit_event = /submit/.test(e.type); - - for (var i=0; i < validation_count; i++) { - if (!validations[i] && (submit_event || is_ajax)) { - if (this.settings.focus_on_invalid) els[i].focus(); - form.trigger('invalid'); - $(els[i]).closest('form').attr('data-invalid', ''); - return false; - } - } - - if (submit_event || is_ajax) { - form.trigger('valid'); - } - - form.removeAttr('data-invalid'); - - if (is_ajax) return false; - - return true; - }, - - parse_patterns : function (els) { - var count = els.length, - el_patterns = []; - - for (var i = count - 1; i >= 0; i--) { - el_patterns.push(this.pattern(els[i])); - } - - return this.check_validation_and_apply_styles(el_patterns); - }, - - pattern : function (el) { - var type = el.getAttribute('type'), - required = typeof el.getAttribute('required') === 'string'; - - if (this.settings.patterns.hasOwnProperty(type)) { - return [el, this.settings.patterns[type], required]; - } - - var pattern = el.getAttribute('pattern') || ''; - - if (this.settings.patterns.hasOwnProperty(pattern) && pattern.length > 0) { - return [el, this.settings.patterns[pattern], required]; - } else if (pattern.length > 0) { - return [el, new RegExp(pattern), required]; - } - - pattern = /.*/; - - return [el, pattern, required]; - }, - - check_validation_and_apply_styles : function (el_patterns) { - var count = el_patterns.length, - validations = []; - - for (var i = count - 1; i >= 0; i--) { - var el = el_patterns[i][0], - required = el_patterns[i][2], - value = el.value, - is_equal = el.getAttribute('data-equalto'), - is_radio = el.type === "radio", - valid_length = (required) ? (el.value.length > 0) : true; - - if (is_radio && required) { - validations.push(this.valid_radio(el, required)); - } else if (is_equal && required) { - validations.push(this.valid_equal(el, required)); - } else { - if (el_patterns[i][1].test(value) && valid_length || - !required && el.value.length < 1) { - $(el).removeAttr('data-invalid').parent().removeClass('error'); - validations.push(true); - } else { - $(el).attr('data-invalid', '').parent().addClass('error'); - validations.push(false); - } - } - } - - return validations; - }, - - valid_radio : function (el, required) { - var name = el.getAttribute('name'), - group = document.getElementsByName(name), - count = group.length, - valid = false; - - for (var i=0; i < count; i++) { - if (group[i].checked) valid = true; - } - - for (var i=0; i < count; i++) { - if (valid) { - $(group[i]).removeAttr('data-invalid').parent().removeClass('error'); - } else { - $(group[i]).attr('data-invalid', '').parent().addClass('error'); - } - } - - return valid; - }, - - valid_equal: function(el, required) { - var from = document.getElementById(el.getAttribute('data-equalto')).value, - to = el.value, - valid = (from === to); - - if (valid) { - $(el).removeAttr('data-invalid').parent().removeClass('error'); - } else { - $(el).attr('data-invalid', '').parent().addClass('error'); - } - - return valid; - } - }; -}(jQuery, this, this.document)); diff --git a/public/js/foundation/foundation.accordion.js b/public/js/foundation/foundation.accordion.js deleted file mode 100755 index c36d0b1..0000000 --- a/public/js/foundation/foundation.accordion.js +++ /dev/null @@ -1,41 +0,0 @@ -;(function ($, window, document, undefined) { - 'use strict'; - - Foundation.libs.accordion = { - name : 'accordion', - - version : '5.0.1', - - settings : { - active_class: 'active', - toggleable: true - }, - - init : function (scope, method, options) { - this.bindings(method, options); - }, - - events : function () { - $(this.scope).off('.accordion').on('click.fndtn.accordion', '[data-accordion] > dd > a', function (e) { - var accordion = $(this).parent(), - target = $('#' + this.href.split('#')[1]), - siblings = $('> dd > .content', target.closest('[data-accordion]')), - settings = accordion.parent().data('accordion-init'), - active = $('> dd > .content.' + settings.active_class, accordion.parent()); - - e.preventDefault(); - - if (active[0] == target[0] && settings.toggleable) { - return target.toggleClass(settings.active_class); - } - - siblings.removeClass(settings.active_class); - target.addClass(settings.active_class); - }); - }, - - off : function () {}, - - reflow : function () {} - }; -}(jQuery, this, this.document)); diff --git a/public/js/foundation/foundation.alert.js b/public/js/foundation/foundation.alert.js deleted file mode 100755 index 1bb404a..0000000 --- a/public/js/foundation/foundation.alert.js +++ /dev/null @@ -1,34 +0,0 @@ -;(function ($, window, document, undefined) { - 'use strict'; - - Foundation.libs.alert = { - name : 'alert', - - version : '5.0.0', - - settings : { - animation: 'fadeOut', - speed: 300, // fade out speed - callback: function (){} - }, - - init : function (scope, method, options) { - this.bindings(method, options); - }, - - events : function () { - $(this.scope).off('.alert').on('click.fndtn.alert', '[data-alert] a.close', function (e) { - var alertBox = $(this).closest("[data-alert]"), - settings = alertBox.data('alert-init'); - - e.preventDefault(); - alertBox[settings.animation](settings.speed, function () { - $(this).trigger('closed').remove(); - settings.callback(); - }); - }); - }, - - reflow : function () {} - }; -}(jQuery, this, this.document)); diff --git a/public/js/foundation/foundation.clearing.js b/public/js/foundation/foundation.clearing.js deleted file mode 100755 index 75daf44..0000000 --- a/public/js/foundation/foundation.clearing.js +++ /dev/null @@ -1,450 +0,0 @@ -;(function ($, window, document, undefined) { - 'use strict'; - - Foundation.libs.clearing = { - name : 'clearing', - - version: '5.0.0', - - 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', - - // event initializers and locks - init : false, - locked : false - }, - - init : function (scope, method, options) { - var self = this; - Foundation.inherit(this, 'throttle loaded'); - - this.bindings(method, options); - - if ($(this.scope).is('[data-clearing]')) { - this.assemble($('li', this.scope)); - } else { - $('[data-clearing]', this.scope).each(function () { - self.assemble($('li', this)); - }); - } - }, - - events : function (scope) { - var self = this; - - $(this.scope) - .off('.clearing') - .on('click.fndtn.clearing', 'ul[data-clearing] li', - function (e, current, target) { - var current = current || $(this), - target = target || current, - next = current.next('li'), - settings = current.closest('[data-clearing]').data('clearing-init'), - image = $(e.target); - - e.preventDefault(); - - if (!settings) { - self.init(); - settings = current.closest('[data-clearing]').data('clearing-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 = $('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) }) - .on('keydown.fndtn.clearing', - function (e) { self.keydown(e) }); - - $(window).off('.clearing').on('resize.fndtn.clearing', - function () { self.resize() }); - - this.swipe_events(scope); - }, - - swipe_events : function (scope) { - var self = this; - - $(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 - }; - - $(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 = $(this).data('swipe-transition'); - - if (typeof data === 'undefined') { - data = {}; - } - - data.delta_x = e.touches[0].pageX - data.start_page_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) { - $(this).data('swipe-transition', {}); - e.stopPropagation(); - }); - }, - - assemble : function ($li) { - var $el = $li.parent(); - - if ($el.parent().hasClass('carousel')) return; - $el.after('
'); - - var holder = $('#foundationClearingHolder'), - settings = $el.data('clearing-init'), - grid = $el.detach(), - data = { - grid: '', - viewing: settings.templates.viewing - }, - wrapper = '
' + data.viewing + - data.grid + '
'; - - return holder.after(wrapper).remove(); - }, - - open : function ($image, current, target) { - var root = target.closest('.clearing-assembled'), - container = $('div', root).first(), - visible_image = $('.visible-img', container), - image = $('img', visible_image).not($image); - - if (!this.locked()) { - // set the image to the selected thumbnail - image - .attr('src', this.load($image)) - .css('visibility', 'hidden'); - - this.loaded(image, function () { - image.css('visibility', 'visible'); - // toggle the gallery - root.addClass('clearing-blackout'); - container.addClass('clearing-container'); - visible_image.show(); - this.fix_height(target) - .caption($('.clearing-caption', visible_image), $image) - .center(image) - .shift(current, target, function () { - target.siblings().removeClass('visible'); - target.addClass('visible'); - }); - }.bind(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))), container, visible_image; - - if (el === e.target && root) { - container = $('div', root).first(); - visible_image = $('.visible-img', container); - this.settings.prev_index = 0; - $('ul[data-clearing]', root) - .attr('style', '').closest('.clearing-blackout') - .removeClass('clearing-blackout'); - container.removeClass('clearing-container'); - visible_image.hide(); - } - - return false; - }, - - is_open : function (current) { - return current.parent().prop('style').length > 0; - }, - - keydown : function (e) { - var clearing = $('ul[data-clearing]', '.clearing-blackout'); - - if (e.which === 39) this.go(clearing, 'next'); - if (e.which === 37) this.go(clearing, 'prev'); - if (e.which === 27) $('a.clearing-close').trigger('click'); - }, - - nav : function (e, direction) { - var clearing = $('ul[data-clearing]', '.clearing-blackout'); - - e.preventDefault(); - this.go(clearing, direction); - }, - - resize : function () { - var image = $('img', '.clearing-blackout .visible-img'); - - if (image.length) { - this.center(image); - } - }, - - // visual adjustments - fix_height : function (target) { - var lis = target.parent().children(), - self = this; - - lis.each(function () { - var li = $(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) { - var visible_image = target - .closest('.carousel') - .siblings('.visible-img'); - - if (target.next().length > 0) { - $('.clearing-main-next', visible_image) - .removeClass('disabled'); - } else { - $('.clearing-main-next', visible_image) - .addClass('disabled'); - } - - if (target.prev().length > 0) { - $('.clearing-main-prev', visible_image) - .removeClass('disabled'); - } else { - $('.clearing-main-prev', visible_image) - .addClass('disabled'); - } - }, - - center : function (target) { - if (!this.rtl) { - target.css({ - marginLeft : -(target.outerWidth() / 2), - marginTop : -(target.outerHeight() / 2) - }); - } else { - target.css({ - marginRight : -(target.outerWidth() / 2), - marginTop : -(target.outerHeight() / 2) - }); - } - return this; - }, - - // image loading and preloading - - load : function ($image) { - if ($image[0].nodeName === "A") { - var href = $image.attr('href'); - } else { - var href = $image.parent().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 = $('a', img); - - if (new_a.length) { - new_img.src = new_a.attr('href'); - } else { - new_img.src = $('img', img).attr('src'); - } - } - return this; - }, - - // image caption - - caption : function (container, $image) { - var caption = $image.data('caption'); - - if (caption) { - container - .html(caption) - .show(); - } else { - container - .text('') - .hide(); - } - return this; - }, - - // directional methods - - go : function ($ul, direction) { - var current = $('.visible', $ul), - target = current[direction](); - - if (target.length) { - $('img', target) - .trigger('click', [current, target]); - } - }, - - shift : function (current, target, callback) { - var clearing = target.parent(), - old_index = this.settings.prev_index || target.index(), - direction = this.direction(clearing, current, target), - left = parseInt(clearing.css('left'), 10), - width = target.outerWidth(), - skip_shift; - - // we use jQuery animate instead of CSS transitions because we - // need a callback to unlock the next animation - if (target.index() !== old_index && !/skip/.test(direction)){ - if (/left/.test(direction)) { - this.lock(); - clearing.animate({left : left + width}, 300, this.unlock()); - } else if (/right/.test(direction)) { - this.lock(); - clearing.animate({left : left - width}, 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) { - clearing.animate({left : -(skip_shift * width)}, 300, this.unlock()); - } else { - clearing.animate({left : 0}, 300, this.unlock()); - } - } - - callback(); - }, - - direction : function ($el, current, target) { - var lis = $('li', $el), - li_width = lis.outerWidth() + (lis.outerWidth() / 4), - up_count = Math.floor($('.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.scope).off('.fndtn.clearing'); - $(window).off('.fndtn.clearing'); - }, - - reflow : function () { - this.init(); - } - }; - -}(jQuery, this, this.document)); diff --git a/public/js/foundation/foundation.dropdown.js b/public/js/foundation/foundation.dropdown.js deleted file mode 100755 index 622db93..0000000 --- a/public/js/foundation/foundation.dropdown.js +++ /dev/null @@ -1,184 +0,0 @@ -;(function ($, window, document, undefined) { - 'use strict'; - - Foundation.libs.dropdown = { - name : 'dropdown', - - version : '5.0.0', - - settings : { - active_class: 'open', - is_hover: false, - opened: function(){}, - closed: function(){} - }, - - init : function (scope, method, options) { - Foundation.inherit(this, 'throttle'); - - this.bindings(method, options); - }, - - events : function (scope) { - var self = this; - - $(this.scope) - .off('.dropdown') - .on('click.fndtn.dropdown', '[data-dropdown]', function (e) { - var settings = $(this).data('dropdown-init'); - e.preventDefault(); - - if (!settings.is_hover || Modernizr.touch) self.toggle($(this)); - }) - .on('mouseenter.fndtn.dropdown', '[data-dropdown], [data-dropdown-content]', function (e) { - var $this = $(this); - clearTimeout(self.timeout); - - if ($this.data('dropdown')) { - var dropdown = $('#' + $this.data('dropdown')), - target = $this; - } else { - var dropdown = $this; - target = $("[data-dropdown='" + dropdown.attr('id') + "']"); - } - - var settings = target.data('dropdown-init'); - if (settings.is_hover) self.open.apply(self, [dropdown, target]); - }) - .on('mouseleave.fndtn.dropdown', '[data-dropdown], [data-dropdown-content]', function (e) { - var $this = $(this); - self.timeout = setTimeout(function () { - if ($this.data('dropdown')) { - var settings = $this.data('dropdown-init'); - if (settings.is_hover) self.close.call(self, $('#' + $this.data('dropdown'))); - } else { - var target = $('[data-dropdown="' + $(this).attr('id') + '"]'), - settings = target.data('dropdown-init'); - if (settings.is_hover) self.close.call(self, $this); - } - }.bind(this), 150); - }) - .on('click.fndtn.dropdown', function (e) { - var parent = $(e.target).closest('[data-dropdown-content]'); - - if ($(e.target).data('dropdown') || $(e.target).parent().data('dropdown')) { - return; - } - if (!($(e.target).data('revealId')) && - (parent.length > 0 && ($(e.target).is('[data-dropdown-content]') || - $.contains(parent.first()[0], e.target)))) { - e.stopPropagation(); - return; - } - - self.close.call(self, $('[data-dropdown-content]')); - }) - .on('opened.fndtn.dropdown', '[data-dropdown-content]', this.settings.opened) - .on('closed.fndtn.dropdown', '[data-dropdown-content]', this.settings.closed); - - $(window) - .off('.dropdown') - .on('resize.fndtn.dropdown', self.throttle(function () { - self.resize.call(self); - }, 50)).trigger('resize'); - }, - - close: function (dropdown) { - var self = this; - dropdown.each(function () { - if ($(this).hasClass(self.settings.active_class)) { - $(this) - .css(Foundation.rtl ? 'right':'left', '-99999px') - .removeClass(self.settings.active_class); - $(this).trigger('closed'); - } - }); - }, - - open: function (dropdown, target) { - this - .css(dropdown - .addClass(this.settings.active_class), target); - dropdown.trigger('opened'); - }, - - toggle : function (target) { - var dropdown = $('#' + target.data('dropdown')); - if (dropdown.length === 0) { - // No dropdown found, not continuing - return; - } - - this.close.call(this, $('[data-dropdown-content]').not(dropdown)); - - if (dropdown.hasClass(this.settings.active_class)) { - this.close.call(this, dropdown); - } else { - this.close.call(this, $('[data-dropdown-content]')) - this.open.call(this, dropdown, target); - } - }, - - resize : function () { - var dropdown = $('[data-dropdown-content].open'), - target = $("[data-dropdown='" + dropdown.attr('id') + "']"); - - if (dropdown.length && target.length) { - this.css(dropdown, target); - } - }, - - css : function (dropdown, target) { - var offset_parent = dropdown.offsetParent(), - position = target.offset(); - - position.top -= offset_parent.offset().top; - position.left -= offset_parent.offset().left; - - if (this.small()) { - dropdown.css({ - position : 'absolute', - width: '95%', - 'max-width': 'none', - top: position.top + target.outerHeight() - }); - dropdown.css(Foundation.rtl ? 'right':'left', '2.5%'); - } else { - if (!Foundation.rtl && $(window).width() > dropdown.outerWidth() + target.offset().left) { - var left = position.left; - if (dropdown.hasClass('right')) { - dropdown.removeClass('right'); - } - } else { - if (!dropdown.hasClass('right')) { - dropdown.addClass('right'); - } - var left = position.left - (dropdown.outerWidth() - target.outerWidth()); - } - - dropdown.attr('style', '').css({ - position : 'absolute', - top: position.top + target.outerHeight(), - left: left - }); - } - - return dropdown; - }, - - small : function () { - return matchMedia(Foundation.media_queries.small).matches && - !matchMedia(Foundation.media_queries.medium).matches; - }, - - off: function () { - $(this.scope).off('.fndtn.dropdown'); - $('html, body').off('.fndtn.dropdown'); - $(window).off('.fndtn.dropdown'); - $('[data-dropdown-content]').off('.fndtn.dropdown'); - this.settings.init = false; - }, - - reflow : function () {} - }; -}(jQuery, this, this.document)); diff --git a/public/js/foundation/foundation.interchange.js b/public/js/foundation/foundation.interchange.js deleted file mode 100755 index 73b46a2..0000000 --- a/public/js/foundation/foundation.interchange.js +++ /dev/null @@ -1,304 +0,0 @@ -;(function ($, window, document, undefined) { - 'use strict'; - - Foundation.libs.interchange = { - name : 'interchange', - - version : '5.0.0', - - cache : {}, - - images_loaded : false, - nodes_loaded : false, - - settings : { - load_attr : 'interchange', - - named_queries : { - 'default' : Foundation.media_queries.small, - small : Foundation.media_queries.small, - medium : Foundation.media_queries.medium, - large : Foundation.media_queries.large, - xlarge : Foundation.media_queries.xlarge, - xxlarge: Foundation.media_queries.xxlarge, - landscape : 'only screen and (orientation: landscape)', - portrait : 'only screen and (orientation: portrait)', - retina : 'only screen and (-webkit-min-device-pixel-ratio: 2),' + - 'only screen and (min--moz-device-pixel-ratio: 2),' + - 'only screen and (-o-min-device-pixel-ratio: 2/1),' + - 'only screen and (min-device-pixel-ratio: 2),' + - 'only screen and (min-resolution: 192dpi),' + - 'only screen and (min-resolution: 2dppx)' - }, - - directives : { - replace: function (el, path, trigger) { - // The trigger argument, if called within the directive, fires - // an event named after the directive on the element, passing - // any parameters along to the event that you pass to trigger. - // - // ex. trigger(), trigger([a, b, c]), or trigger(a, b, c) - // - // This allows you to bind a callback like so: - // $('#interchangeContainer').on('replace', function (e, a, b, c) { - // console.log($(this).html(), a, b, c); - // }); - - if (/IMG/.test(el[0].nodeName)) { - var orig_path = el[0].src; - - if (new RegExp(path, 'i').test(orig_path)) return; - - el[0].src = path; - - return trigger(el[0].src); - } - var last_path = el.data('interchange-last-path'); - - if (last_path == path) return; - - return $.get(path, function (response) { - el.html(response); - el.data('interchange-last-path', path); - trigger(); - }); - - } - } - }, - - init : function (scope, method, options) { - Foundation.inherit(this, 'throttle'); - - this.data_attr = 'data-' + this.settings.load_attr; - - this.bindings(method, options); - this.load('images'); - this.load('nodes'); - }, - - events : function () { - var self = this; - - $(window) - .off('.interchange') - .on('resize.fndtn.interchange', self.throttle(function () { - self.resize.call(self); - }, 50)); - - return this; - }, - - resize : function () { - var cache = this.cache; - - if(!this.images_loaded || !this.nodes_loaded) { - setTimeout($.proxy(this.resize, this), 50); - return; - } - - for (var uuid in cache) { - if (cache.hasOwnProperty(uuid)) { - var passed = this.results(uuid, cache[uuid]); - - if (passed) { - this.settings.directives[passed - .scenario[1]](passed.el, passed.scenario[0], function () { - if (arguments[0] instanceof Array) { - var args = arguments[0]; - } else { - var args = Array.prototype.slice.call(arguments, 0); - } - - passed.el.trigger(passed.scenario[1], args); - }); - } - } - } - - }, - - results : function (uuid, scenarios) { - var count = scenarios.length; - - if (count > 0) { - var el = this.S('[data-uuid="' + uuid + '"]'); - - for (var i = count - 1; i >= 0; i--) { - var mq, rule = scenarios[i][2]; - if (this.settings.named_queries.hasOwnProperty(rule)) { - mq = matchMedia(this.settings.named_queries[rule]); - } else { - mq = matchMedia(rule); - } - if (mq.matches) { - return {el: el, scenario: scenarios[i]}; - } - } - } - - return false; - }, - - load : function (type, force_update) { - if (typeof this['cached_' + type] === 'undefined' || force_update) { - this['update_' + type](); - } - - return this['cached_' + type]; - }, - - update_images : function () { - var images = this.S('img[' + this.data_attr + ']'), - count = images.length, - loaded_count = 0, - data_attr = this.data_attr; - - this.cache = {}; - this.cached_images = []; - this.images_loaded = (count === 0); - - for (var i = count - 1; i >= 0; i--) { - loaded_count++; - if (images[i]) { - var str = images[i].getAttribute(data_attr) || ''; - - if (str.length > 0) { - this.cached_images.push(images[i]); - } - } - - if(loaded_count === count) { - this.images_loaded = true; - this.enhance('images'); - } - } - - return this; - }, - - update_nodes : function () { - var nodes = this.S('[' + this.data_attr + ']:not(img)'), - count = nodes.length, - loaded_count = 0, - data_attr = this.data_attr; - - this.cached_nodes = []; - // Set nodes_loaded to true if there are no nodes - // this.nodes_loaded = false; - this.nodes_loaded = (count === 0); - - - for (var i = count - 1; i >= 0; i--) { - loaded_count++; - var str = nodes[i].getAttribute(data_attr) || ''; - - if (str.length > 0) { - this.cached_nodes.push(nodes[i]); - } - - if(loaded_count === count) { - this.nodes_loaded = true; - this.enhance('nodes'); - } - } - - return this; - }, - - enhance : function (type) { - var count = this['cached_' + type].length; - - for (var i = count - 1; i >= 0; i--) { - this.object($(this['cached_' + type][i])); - } - - return $(window).trigger('resize'); - }, - - parse_params : function (path, directive, mq) { - return [this.trim(path), this.convert_directive(directive), this.trim(mq)]; - }, - - convert_directive : function (directive) { - var trimmed = this.trim(directive); - - if (trimmed.length > 0) { - return trimmed; - } - - return 'replace'; - }, - - object : function(el) { - var raw_arr = this.parse_data_attr(el), - scenarios = [], count = raw_arr.length; - - if (count > 0) { - for (var i = count - 1; i >= 0; i--) { - var split = raw_arr[i].split(/\((.*?)(\))$/); - - if (split.length > 1) { - var cached_split = split[0].split(','), - params = this.parse_params(cached_split[0], - cached_split[1], split[1]); - - scenarios.push(params); - } - } - } - - return this.store(el, scenarios); - }, - - uuid : function (separator) { - var delim = separator || "-"; - - function S4() { - return (((1 + Math.random()) * 0x10000) | 0).toString(16).substring(1); - } - - return (S4() + S4() + delim + S4() + delim + S4() - + delim + S4() + delim + S4() + S4() + S4()); - }, - - store : function (el, scenarios) { - var uuid = this.uuid(), - current_uuid = el.data('uuid'); - - if (current_uuid) return this.cache[current_uuid]; - - el.attr('data-uuid', uuid); - - return this.cache[uuid] = scenarios; - }, - - trim : function(str) { - if (typeof str === 'string') { - return $.trim(str); - } - - return str; - }, - - parse_data_attr : function (el) { - var raw = el.data(this.settings.load_attr).split(/\[(.*?)\]/), - count = raw.length, output = []; - - for (var i = count - 1; i >= 0; i--) { - if (raw[i].replace(/[\W\d]+/, '').length > 4) { - output.push(raw[i]); - } - } - - return output; - }, - - reflow : function () { - this.load('images', true); - this.load('nodes', true); - } - - }; - -}(jQuery, this, this.document)); diff --git a/public/js/foundation/foundation.js b/public/js/foundation/foundation.js deleted file mode 100755 index c2d031f..0000000 --- a/public/js/foundation/foundation.js +++ /dev/null @@ -1,416 +0,0 @@ -/* - * Foundation Responsive Library - * http://foundation.zurb.com - * Copyright 2013, ZURB - * Free to use under the MIT license. - * http://www.opensource.org/licenses/mit-license.php -*/ - -(function ($, window, document, undefined) { - 'use strict'; - - // Used to retrieve Foundation media queries from CSS. - if($('head').has('.foundation-mq-small').length === 0) { - $('head').append(''); - } - - if($('head').has('.foundation-mq-medium').length === 0) { - $('head').append(''); - } - - if($('head').has('.foundation-mq-large').length === 0) { - $('head').append(''); - } - - if($('head').has('.foundation-mq-xlarge').length === 0) { - $('head').append(''); - } - - if($('head').has('.foundation-mq-xxlarge').length === 0) { - $('head').append(''); - } - - // Embed FastClick (this should be removed later) - function FastClick(layer){'use strict';var oldOnClick,self=this;this.trackingClick=false;this.trackingClickStart=0;this.targetElement=null;this.touchStartX=0;this.touchStartY=0;this.lastTouchIdentifier=0;this.touchBoundary=10;this.layer=layer;if(!layer||!layer.nodeType){throw new TypeError('Layer must be a document node');}this.onClick=function(){return FastClick.prototype.onClick.apply(self,arguments)};this.onMouse=function(){return FastClick.prototype.onMouse.apply(self,arguments)};this.onTouchStart=function(){return FastClick.prototype.onTouchStart.apply(self,arguments)};this.onTouchMove=function(){return FastClick.prototype.onTouchMove.apply(self,arguments)};this.onTouchEnd=function(){return FastClick.prototype.onTouchEnd.apply(self,arguments)};this.onTouchCancel=function(){return FastClick.prototype.onTouchCancel.apply(self,arguments)};if(FastClick.notNeeded(layer)){return}if(this.deviceIsAndroid){layer.addEventListener('mouseover',this.onMouse,true);layer.addEventListener('mousedown',this.onMouse,true);layer.addEventListener('mouseup',this.onMouse,true)}layer.addEventListener('click',this.onClick,true);layer.addEventListener('touchstart',this.onTouchStart,false);layer.addEventListener('touchmove',this.onTouchMove,false);layer.addEventListener('touchend',this.onTouchEnd,false);layer.addEventListener('touchcancel',this.onTouchCancel,false);if(!Event.prototype.stopImmediatePropagation){layer.removeEventListener=function(type,callback,capture){var rmv=Node.prototype.removeEventListener;if(type==='click'){rmv.call(layer,type,callback.hijacked||callback,capture)}else{rmv.call(layer,type,callback,capture)}};layer.addEventListener=function(type,callback,capture){var adv=Node.prototype.addEventListener;if(type==='click'){adv.call(layer,type,callback.hijacked||(callback.hijacked=function(event){if(!event.propagationStopped){callback(event)}}),capture)}else{adv.call(layer,type,callback,capture)}}}if(typeof layer.onclick==='function'){oldOnClick=layer.onclick;layer.addEventListener('click',function(event){oldOnClick(event)},false);layer.onclick=null}}FastClick.prototype.deviceIsAndroid=navigator.userAgent.indexOf('Android')>0;FastClick.prototype.deviceIsIOS=/iP(ad|hone|od)/.test(navigator.userAgent);FastClick.prototype.deviceIsIOS4=FastClick.prototype.deviceIsIOS&&(/OS 4_\d(_\d)?/).test(navigator.userAgent);FastClick.prototype.deviceIsIOSWithBadTarget=FastClick.prototype.deviceIsIOS&&(/OS ([6-9]|\d{2})_\d/).test(navigator.userAgent);FastClick.prototype.needsClick=function(target){'use strict';switch(target.nodeName.toLowerCase()){case'button':case'select':case'textarea':if(target.disabled){return true}break;case'input':if((this.deviceIsIOS&&target.type==='file')||target.disabled){return true}break;case'label':case'video':return true}return(/\bneedsclick\b/).test(target.className)};FastClick.prototype.needsFocus=function(target){'use strict';switch(target.nodeName.toLowerCase()){case'textarea':case'select':return true;case'input':switch(target.type){case'button':case'checkbox':case'file':case'image':case'radio':case'submit':return false}return!target.disabled&&!target.readOnly;default:return(/\bneedsfocus\b/).test(target.className)}};FastClick.prototype.sendClick=function(targetElement,event){'use strict';var clickEvent,touch;if(document.activeElement&&document.activeElement!==targetElement){document.activeElement.blur()}touch=event.changedTouches[0];clickEvent=document.createEvent('MouseEvents');clickEvent.initMouseEvent('click',true,true,window,1,touch.screenX,touch.screenY,touch.clientX,touch.clientY,false,false,false,false,0,null);clickEvent.forwardedTouchEvent=true;targetElement.dispatchEvent(clickEvent)};FastClick.prototype.focus=function(targetElement){'use strict';var length;if(this.deviceIsIOS&&targetElement.setSelectionRange){length=targetElement.value.length;targetElement.setSelectionRange(length,length)}else{targetElement.focus()}};FastClick.prototype.updateScrollParent=function(targetElement){'use strict';var scrollParent,parentElement;scrollParent=targetElement.fastClickScrollParent;if(!scrollParent||!scrollParent.contains(targetElement)){parentElement=targetElement;do{if(parentElement.scrollHeight>parentElement.offsetHeight){scrollParent=parentElement;targetElement.fastClickScrollParent=parentElement;break}parentElement=parentElement.parentElement}while(parentElement)}if(scrollParent){scrollParent.fastClickLastScrollTop=scrollParent.scrollTop}};FastClick.prototype.getTargetElementFromEventTarget=function(eventTarget){'use strict';if(eventTarget.nodeType===Node.TEXT_NODE){return eventTarget.parentNode}return eventTarget};FastClick.prototype.onTouchStart=function(event){'use strict';var targetElement,touch,selection;if(event.targetTouches.length>1){return true}targetElement=this.getTargetElementFromEventTarget(event.target);touch=event.targetTouches[0];if(this.deviceIsIOS){selection=window.getSelection();if(selection.rangeCount&&!selection.isCollapsed){return true}if(!this.deviceIsIOS4){if(touch.identifier===this.lastTouchIdentifier){event.preventDefault();return false}this.lastTouchIdentifier=touch.identifier;this.updateScrollParent(targetElement)}}this.trackingClick=true;this.trackingClickStart=event.timeStamp;this.targetElement=targetElement;this.touchStartX=touch.pageX;this.touchStartY=touch.pageY;if((event.timeStamp-this.lastClickTime)<200){event.preventDefault()}return true};FastClick.prototype.touchHasMoved=function(event){'use strict';var touch=event.changedTouches[0],boundary=this.touchBoundary;if(Math.abs(touch.pageX-this.touchStartX)>boundary||Math.abs(touch.pageY-this.touchStartY)>boundary){return true}return false};FastClick.prototype.onTouchMove=function(event){'use strict';if(!this.trackingClick){return true}if(this.targetElement!==this.getTargetElementFromEventTarget(event.target)||this.touchHasMoved(event)){this.trackingClick=false;this.targetElement=null}return true};FastClick.prototype.findControl=function(labelElement){'use strict';if(labelElement.control!==undefined){return labelElement.control}if(labelElement.htmlFor){return document.getElementById(labelElement.htmlFor)}return labelElement.querySelector('button, input:not([type=hidden]), keygen, meter, output, progress, select, textarea')};FastClick.prototype.onTouchEnd=function(event){'use strict';var forElement,trackingClickStart,targetTagName,scrollParent,touch,targetElement=this.targetElement;if(!this.trackingClick){return true}if((event.timeStamp-this.lastClickTime)<200){this.cancelNextClick=true;return true}this.lastClickTime=event.timeStamp;trackingClickStart=this.trackingClickStart;this.trackingClick=false;this.trackingClickStart=0;if(this.deviceIsIOSWithBadTarget){touch=event.changedTouches[0];targetElement=document.elementFromPoint(touch.pageX-window.pageXOffset,touch.pageY-window.pageYOffset)||targetElement;targetElement.fastClickScrollParent=this.targetElement.fastClickScrollParent}targetTagName=targetElement.tagName.toLowerCase();if(targetTagName==='label'){forElement=this.findControl(targetElement);if(forElement){this.focus(targetElement);if(this.deviceIsAndroid){return false}targetElement=forElement}}else if(this.needsFocus(targetElement)){if((event.timeStamp-trackingClickStart)>100||(this.deviceIsIOS&&window.top!==window&&targetTagName==='input')){this.targetElement=null;return false}this.focus(targetElement);if(!this.deviceIsIOS4||targetTagName!=='select'){this.targetElement=null;event.preventDefault()}return false}if(this.deviceIsIOS&&!this.deviceIsIOS4){scrollParent=targetElement.fastClickScrollParent;if(scrollParent&&scrollParent.fastClickLastScrollTop!==scrollParent.scrollTop){return true}}if(!this.needsClick(targetElement)){event.preventDefault();this.sendClick(targetElement,event)}return false};FastClick.prototype.onTouchCancel=function(){'use strict';this.trackingClick=false;this.targetElement=null};FastClick.prototype.onMouse=function(event){'use strict';if(!this.targetElement){return true}if(event.forwardedTouchEvent){return true}if(!event.cancelable){return true}if(!this.needsClick(this.targetElement)||this.cancelNextClick){if(event.stopImmediatePropagation){event.stopImmediatePropagation()}else{event.propagationStopped=true}event.stopPropagation();event.preventDefault();return false}return true};FastClick.prototype.onClick=function(event){'use strict';var permitted;if(this.trackingClick){this.targetElement=null;this.trackingClick=false;return true}if(event.target.type==='submit'&&event.detail===0){return true}permitted=this.onMouse(event);if(!permitted){this.targetElement=null}return permitted};FastClick.prototype.destroy=function(){'use strict';var layer=this.layer;if(this.deviceIsAndroid){layer.removeEventListener('mouseover',this.onMouse,true);layer.removeEventListener('mousedown',this.onMouse,true);layer.removeEventListener('mouseup',this.onMouse,true)}layer.removeEventListener('click',this.onClick,true);layer.removeEventListener('touchstart',this.onTouchStart,false);layer.removeEventListener('touchmove',this.onTouchMove,false);layer.removeEventListener('touchend',this.onTouchEnd,false);layer.removeEventListener('touchcancel',this.onTouchCancel,false)};FastClick.notNeeded=function(layer){'use strict';var metaViewport;if(typeof window.ontouchstart==='undefined'){return true}if((/Chrome\/[0-9]+/).test(navigator.userAgent)){if(FastClick.prototype.deviceIsAndroid){metaViewport=document.querySelector('meta[name=viewport]');if(metaViewport&&metaViewport.content.indexOf('user-scalable=no')!==-1){return true}}else{return true}}if(layer.style.msTouchAction==='none'){return true}return false};FastClick.attach=function(layer){'use strict';return new FastClick(layer)};if(typeof define!=='undefined'&&define.amd){define(function(){'use strict';return FastClick})}else if(typeof module!=='undefined'&&module.exports){module.exports=FastClick.attach;module.exports.FastClick=FastClick}else{window.FastClick=FastClick} - - - // Enable FastClick - if(typeof FastClick !== '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) { - return $(context.querySelectorAll(selector)); - } - - return $(document.querySelectorAll(selector)); - } - - return $(selector, context); - }; - - /* - https://github.com/paulirish/matchMedia.js - */ - - window.matchMedia = window.matchMedia || (function( doc, undefined ) { - - "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( $ ) { - - // 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; - - 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 ); - jQuery.fx.tick(); - } - } - - if ( requestAnimationFrame ) { - // use rAF - window.requestAnimationFrame = requestAnimationFrame; - window.cancelAnimationFrame = cancelAnimationFrame; - 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, element ) { - 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); - }; - - } - - }( jQuery )); - - - function removeQuotes (string) { - if (typeof string === 'string' || string instanceof String) { - string = string.replace(/^[\\/'"]+|(;\s?})+|[\\/'"]+$/g, ''); - } - - return string; - } - - window.Foundation = { - name : 'Foundation', - - version : '5.0.0', - - media_queries : { - small : S('.foundation-mq-small').css('font-family').replace(/^[\/\\'"]+|(;\s?})+|[\/\\'"]+$/g, ''), - medium : S('.foundation-mq-medium').css('font-family').replace(/^[\/\\'"]+|(;\s?})+|[\/\\'"]+$/g, ''), - large : S('.foundation-mq-large').css('font-family').replace(/^[\/\\'"]+|(;\s?})+|[\/\\'"]+$/g, ''), - xlarge: S('.foundation-mq-xlarge').css('font-family').replace(/^[\/\\'"]+|(;\s?})+|[\/\\'"]+$/g, ''), - xxlarge: S('.foundation-mq-xxlarge').css('font-family').replace(/^[\/\\'"]+|(;\s?})+|[\/\\'"]+$/g, '') - }, - - stylesheet : $('').appendTo('head')[0].sheet, - - init : function (scope, libraries, method, options, response) { - var library_arr, - 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; - - 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)); - } - } - - return scope; - }, - - init_lib : function (lib, args) { - if (this.libs.hasOwnProperty(lib)) { - this.patch(this.libs[lib]); - - if (args && args.hasOwnProperty(lib)) { - return this.libs[lib].init.apply(this.libs[lib], [this.scope, args[lib]]); - } - - return this.libs[lib].init.apply(this.libs[lib], args); - } - - return function () {}; - }, - - patch : function (lib) { - lib.scope = this.scope; - lib['data_options'] = this.lib_methods.data_options; - lib['bindings'] = this.lib_methods.bindings; - lib['S'] = S; - lib.rtl = this.rtl; - }, - - inherit : function (scope, methods) { - var methods_arr = methods.split(' '); - - for (var i = methods_arr.length - 1; i >= 0; i--) { - if (this.lib_methods.hasOwnProperty(methods_arr[i])) { - this.libs[scope.name][methods_arr[i]] = this.lib_methods[methods_arr[i]]; - } - } - }, - - random_str : function (length) { - var chars = '0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz'.split(''); - - if (!length) { - length = Math.floor(Math.random() * chars.length); - } - - var str = ''; - for (var i = 0; i < length; i++) { - str += chars[Math.floor(Math.random() * chars.length)]; - } - return str; - }, - - libs : {}, - - // methods that can be inherited in libraries - lib_methods : { - throttle : function(fun, delay) { - var timer = null; - - return function () { - var context = this, args = arguments; - - clearTimeout(timer); - timer = setTimeout(function () { - fun.apply(context, args); - }, delay); - }; - }, - - // parses data-options attribute - data_options : function (el) { - var opts = {}, ii, p, opts_arr, opts_len, - data_options = el.data('options'); - - if (typeof data_options === 'object') { - return data_options; - } - - opts_arr = (data_options || ':').split(';'), - opts_len = 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; - } - - // parse options - for (ii = opts_len - 1; ii >= 0; ii--) { - p = opts_arr[ii].split(':'); - - if (/true/i.test(p[1])) p[1] = true; - if (/false/i.test(p[1])) p[1] = false; - if (isNumber(p[1])) p[1] = parseInt(p[1], 10); - - if (p.length === 2 && p[0].length > 0) { - opts[trim(p[0])] = trim(p[1]); - } - } - - return opts; - }, - - delay : function (fun, delay) { - return setTimeout(fun, delay); - }, - - // test for empty object or array - empty : function (obj) { - if (obj.length && obj.length > 0) return false; - if (obj.length && obj.length === 0) return true; - - for (var key in obj) { - if (hasOwnProperty.call(obj, key)) return false; - } - - return true; - }, - - register_media : function(media, media_class) { - if(Foundation.media_queries[media] === undefined) { - $('head').append(''); - Foundation.media_queries[media] = removeQuotes($('.' + media_class).css('font-family')); - } - }, - - addCustomRule : function(rule, media) { - if(media === undefined) { - 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 + ' }'); - } - } - }, - - 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); - } - }, - - bindings : function (method, options) { - var self = this, - should_bind_events = !S(this).data(this.name + '-init'); - - if (typeof method === 'string') { - return this[method].call(this); - } - - if (S(this.scope).is('[data-' + this.name +']')) { - S(this.scope).data(this.name + '-init', $.extend({}, this.settings, (options || method), this.data_options(S(this.scope)))); - - if (should_bind_events) { - this.events(this.scope); - } - - } else { - S('[data-' + this.name + ']', this.scope).each(function () { - var should_bind_events = !S(this).data(self.name + '-init'); - - S(this).data(self.name + '-init', $.extend({}, self.settings, (options || method), self.data_options(S(this)))); - - if (should_bind_events) { - self.events(this); - } - }); - } - } - } - }; - - $.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, this, this.document)); diff --git a/public/js/foundation/foundation.magellan.js b/public/js/foundation/foundation.magellan.js deleted file mode 100755 index 586741b..0000000 --- a/public/js/foundation/foundation.magellan.js +++ /dev/null @@ -1,118 +0,0 @@ -;(function ($, window, document, undefined) { - 'use strict'; - - Foundation.libs.magellan = { - name : 'magellan', - - version : '5.0.0', - - settings : { - active_class: 'active', - threshold: 0 - }, - - init : function (scope, method, options) { - this.fixed_magellan = $("[data-magellan-expedition]"); - this.set_threshold(); - this.last_destination = $('[data-magellan-destination]').last(); - this.events(); - }, - - events : function () { - var self = this; - - $(this.scope) - .off('.magellan') - .on('arrival.fndtn.magellan', '[data-magellan-arrival]', function (e) { - var $destination = $(this), - $expedition = $destination.closest('[data-magellan-expedition]'), - active_class = $expedition.attr('data-magellan-active-class') - || self.settings.active_class; - - $destination - .closest('[data-magellan-expedition]') - .find('[data-magellan-arrival]') - .not($destination) - .removeClass(active_class); - $destination.addClass(active_class); - }); - - this.fixed_magellan - .off('.magellan') - .on('update-position.fndtn.magellan', function() { - var $el = $(this); - }) - .trigger('update-position'); - - $(window) - .off('.magellan') - .on('resize.fndtn.magellan', function() { - this.fixed_magellan.trigger('update-position'); - }.bind(this)) - .on('scroll.fndtn.magellan', function() { - var windowScrollTop = $(window).scrollTop(); - self.fixed_magellan.each(function() { - var $expedition = $(this); - if (typeof $expedition.data('magellan-top-offset') === 'undefined') { - $expedition.data('magellan-top-offset', $expedition.offset().top); - } - if (typeof $expedition.data('magellan-fixed-position') === 'undefined') { - $expedition.data('magellan-fixed-position', false); - } - var fixed_position = (windowScrollTop + self.settings.threshold) > $expedition.data("magellan-top-offset"); - var attr = $expedition.attr('data-magellan-top-offset'); - - if ($expedition.data("magellan-fixed-position") != fixed_position) { - $expedition.data("magellan-fixed-position", fixed_position); - if (fixed_position) { - $expedition.addClass('fixed'); - $expedition.css({position:"fixed", top:0}); - } else { - $expedition.removeClass('fixed'); - $expedition.css({position:"", top:""}); - } - if (fixed_position && typeof attr != 'undefined' && attr != false) { - $expedition.css({position:"fixed", top:attr + "px"}); - } - } - }); - }); - - - if (this.last_destination.length > 0) { - $(window).on('scroll.fndtn.magellan', function (e) { - var windowScrollTop = $(window).scrollTop(), - scrolltopPlusHeight = windowScrollTop + $(window).height(), - lastDestinationTop = Math.ceil(self.last_destination.offset().top); - - $('[data-magellan-destination]').each(function () { - var $destination = $(this), - destination_name = $destination.attr('data-magellan-destination'), - topOffset = $destination.offset().top - $destination.outerHeight(true) - windowScrollTop; - if (topOffset <= self.settings.threshold) { - $("[data-magellan-arrival='" + destination_name + "']").trigger('arrival'); - } - // In large screens we may hit the bottom of the page and dont reach the top of the last magellan-destination, so lets force it - if (scrolltopPlusHeight >= $(self.scope).height() && lastDestinationTop > windowScrollTop && lastDestinationTop < scrolltopPlusHeight) { - $('[data-magellan-arrival]').last().trigger('arrival'); - } - }); - }); - } - }, - - set_threshold : function () { - if (typeof this.settings.threshold !== 'number') { - this.settings.threshold = (this.fixed_magellan.length > 0) ? - this.fixed_magellan.outerHeight(true) : 0; - } - }, - - off : function () { - $(this.scope).off('.fndtn.magellan'); - $(window).off('.fndtn.magellan'); - }, - - reflow : function () {} - }; -}(jQuery, this, this.document)); diff --git a/public/js/foundation/foundation.offcanvas.js b/public/js/foundation/foundation.offcanvas.js deleted file mode 100755 index 0ce07c0..0000000 --- a/public/js/foundation/foundation.offcanvas.js +++ /dev/null @@ -1,37 +0,0 @@ -;(function ($, window, document, undefined) { - 'use strict'; - - Foundation.libs.offcanvas = { - name : 'offcanvas', - - version : '5.0.0', - - settings : {}, - - init : function (scope, method, options) { - this.events(); - }, - - events : function () { - $(this.scope).off('.offcanvas') - .on('click.fndtn.offcanvas', '.left-off-canvas-toggle', function (e) { - e.preventDefault(); - $(this).closest('.off-canvas-wrap').toggleClass('move-right'); - }) - .on('click.fndtn.offcanvas', '.exit-off-canvas', function (e) { - e.preventDefault(); - $(".off-canvas-wrap").removeClass("move-right"); - }) - .on('click.fndtn.offcanvas', '.right-off-canvas-toggle', function (e) { - e.preventDefault(); - $(this).closest(".off-canvas-wrap").toggleClass("move-left"); - }) - .on('click.fndtn.offcanvas', '.exit-off-canvas', function (e) { - e.preventDefault(); - $(".off-canvas-wrap").removeClass("move-left"); - }); - }, - - reflow : function () {} - }; -}(jQuery, this, this.document)); diff --git a/public/js/foundation/foundation.orbit.js b/public/js/foundation/foundation.orbit.js deleted file mode 100755 index c9dc14c..0000000 --- a/public/js/foundation/foundation.orbit.js +++ /dev/null @@ -1,434 +0,0 @@ -;(function ($, window, document, undefined) { - 'use strict'; - - var noop = function() {}; - - var Orbit = function(el, settings) { - // Don't reinitialize plugin - if (el.hasClass(settings.slides_container_class)) { - return this; - } - - var self = this, - container, - slides_container = el, - number_container, - bullets_container, - timer_container, - idx = 0, - animate, - timer, - locked = false, - adjust_height_after = false; - - slides_container.children().first().addClass(settings.active_slide_class); - - self.update_slide_number = function(index) { - if (settings.slide_number) { - number_container.find('span:first').text(parseInt(index)+1); - number_container.find('span:last').text(slides_container.children().length); - } - if (settings.bullets) { - bullets_container.children().removeClass(settings.bullets_active_class); - $(bullets_container.children().get(index)).addClass(settings.bullets_active_class); - } - }; - - self.update_active_link = function(index) { - var link = $('a[data-orbit-link="'+slides_container.children().eq(index).attr('data-orbit-slide')+'"]'); - link.parents('ul').find('[data-orbit-link]').removeClass(settings.bullets_active_class); - link.addClass(settings.bullets_active_class); - }; - - self.build_markup = function() { - slides_container.wrap('
'); - container = slides_container.parent(); - slides_container.addClass(settings.slides_container_class); - - if (settings.navigation_arrows) { - container.append($('').addClass(settings.prev_class)); - container.append($('').addClass(settings.next_class)); - } - - if (settings.timer) { - timer_container = $('
').addClass(settings.timer_container_class); - timer_container.append(''); - timer_container.append($('
').addClass(settings.timer_progress_class)); - timer_container.addClass(settings.timer_paused_class); - container.append(timer_container); - } - - if (settings.slide_number) { - number_container = $('
').addClass(settings.slide_number_class); - number_container.append(' ' + settings.slide_number_text + ' '); - container.append(number_container); - } - - if (settings.bullets) { - bullets_container = $('
    ').addClass(settings.bullets_container_class); - container.append(bullets_container); - bullets_container.wrap('
    '); - slides_container.children().each(function(idx, el) { - var bullet = $('
  1. ').attr('data-orbit-slide', idx); - bullets_container.append(bullet); - }); - } - - if (settings.stack_on_small) { - container.addClass(settings.stack_on_small_class); - } - - self.update_slide_number(0); - self.update_active_link(0); - }; - - self._goto = function(next_idx, start_timer) { - // if (locked) {return false;} - if (next_idx === idx) {return false;} - if (typeof timer === 'object') {timer.restart();} - var slides = slides_container.children(); - - var dir = 'next'; - locked = true; - if (next_idx < idx) {dir = 'prev';} - if (next_idx >= slides.length) {next_idx = 0;} - else if (next_idx < 0) {next_idx = slides.length - 1;} - - var current = $(slides.get(idx)); - var next = $(slides.get(next_idx)); - - current.css('zIndex', 2); - current.removeClass(settings.active_slide_class); - next.css('zIndex', 4).addClass(settings.active_slide_class); - - slides_container.trigger('before-slide-change.fndtn.orbit'); - settings.before_slide_change(); - self.update_active_link(next_idx); - - var callback = function() { - var unlock = function() { - idx = next_idx; - locked = false; - if (start_timer === true) {timer = self.create_timer(); timer.start();} - self.update_slide_number(idx); - slides_container.trigger('after-slide-change.fndtn.orbit',[{slide_number: idx, total_slides: slides.length}]); - settings.after_slide_change(idx, slides.length); - }; - if (slides_container.height() != next.height() && settings.variable_height) { - slides_container.animate({'height': next.height()}, 250, 'linear', unlock); - } else { - unlock(); - } - }; - - if (slides.length === 1) {callback(); return false;} - - var start_animation = function() { - if (dir === 'next') {animate.next(current, next, callback);} - if (dir === 'prev') {animate.prev(current, next, callback);} - }; - - if (next.height() > slides_container.height() && settings.variable_height) { - slides_container.animate({'height': next.height()}, 250, 'linear', start_animation); - } else { - start_animation(); - } - }; - - self.next = function(e) { - e.stopImmediatePropagation(); - e.preventDefault(); - self._goto(idx + 1); - }; - - self.prev = function(e) { - e.stopImmediatePropagation(); - e.preventDefault(); - self._goto(idx - 1); - }; - - self.link_custom = function(e) { - e.preventDefault(); - var link = $(this).attr('data-orbit-link'); - if ((typeof link === 'string') && (link = $.trim(link)) != "") { - var slide = container.find('[data-orbit-slide='+link+']'); - if (slide.index() != -1) {self._goto(slide.index());} - } - }; - - self.link_bullet = function(e) { - var index = $(this).attr('data-orbit-slide'); - if ((typeof index === 'string') && (index = $.trim(index)) != "") { - self._goto(parseInt(index)); - } - } - - self.timer_callback = function() { - self._goto(idx + 1, true); - } - - self.compute_dimensions = function() { - var current = $(slides_container.children().get(idx)); - var h = current.height(); - if (!settings.variable_height) { - slides_container.children().each(function(){ - if ($(this).height() > h) { h = $(this).height(); } - }); - } - slides_container.height(h); - }; - - self.create_timer = function() { - var t = new Timer( - container.find('.'+settings.timer_container_class), - settings, - self.timer_callback - ); - return t; - }; - - self.stop_timer = function() { - if (typeof timer === 'object') timer.stop(); - }; - - self.toggle_timer = function() { - var t = container.find('.'+settings.timer_container_class); - if (t.hasClass(settings.timer_paused_class)) { - if (typeof timer === 'undefined') {timer = self.create_timer();} - timer.start(); - } - else { - if (typeof timer === 'object') {timer.stop();} - } - }; - - self.init = function() { - self.build_markup(); - if (settings.timer) {timer = self.create_timer(); timer.start();} - animate = new FadeAnimation(settings, slides_container); - if (settings.animation === 'slide') - animate = new SlideAnimation(settings, slides_container); - container.on('click', '.'+settings.next_class, self.next); - container.on('click', '.'+settings.prev_class, self.prev); - container.on('click', '[data-orbit-slide]', self.link_bullet); - container.on('click', self.toggle_timer); - if (settings.swipe) { - container.on('touchstart.fndtn.orbit', 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 - }; - container.data('swipe-transition', data); - e.stopPropagation(); - }) - .on('touchmove.fndtn.orbit', 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 = container.data('swipe-transition'); - if (typeof data === 'undefined') {data = {};} - - data.delta_x = e.touches[0].pageX - data.start_page_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) ? (idx+1) : (idx-1); - data.active = true; - self._goto(direction); - } - }) - .on('touchend.fndtn.orbit', function(e) { - container.data('swipe-transition', {}); - e.stopPropagation(); - }) - } - container.on('mouseenter.fndtn.orbit', function(e) { - if (settings.timer && settings.pause_on_hover) { - self.stop_timer(); - } - }) - .on('mouseleave.fndtn.orbit', function(e) { - if (settings.timer && settings.resume_on_mouseout) { - timer.start(); - } - }); - - $(document).on('click', '[data-orbit-link]', self.link_custom); - $(window).on('resize', self.compute_dimensions); - $(window).on('load', self.compute_dimensions); - $(window).on('load', function(){ - container.prev('.preloader').css('display', 'none'); - }); - slides_container.trigger('ready.fndtn.orbit'); - }; - - self.init(); - }; - - var Timer = function(el, settings, callback) { - var self = this, - duration = settings.timer_speed, - progress = el.find('.'+settings.timer_progress_class), - start, - timeout, - left = -1; - - this.update_progress = function(w) { - var new_progress = progress.clone(); - new_progress.attr('style', ''); - new_progress.css('width', w+'%'); - progress.replaceWith(new_progress); - progress = new_progress; - }; - - this.restart = function() { - clearTimeout(timeout); - el.addClass(settings.timer_paused_class); - left = -1; - self.update_progress(0); - }; - - this.start = function() { - if (!el.hasClass(settings.timer_paused_class)) {return true;} - left = (left === -1) ? duration : left; - el.removeClass(settings.timer_paused_class); - start = new Date().getTime(); - progress.animate({'width': '100%'}, left, 'linear'); - timeout = setTimeout(function() { - self.restart(); - callback(); - }, left); - el.trigger('timer-started.fndtn.orbit') - }; - - this.stop = function() { - if (el.hasClass(settings.timer_paused_class)) {return true;} - clearTimeout(timeout); - el.addClass(settings.timer_paused_class); - var end = new Date().getTime(); - left = left - (end - start); - var w = 100 - ((left / duration) * 100); - self.update_progress(w); - el.trigger('timer-stopped.fndtn.orbit'); - }; - }; - - var SlideAnimation = function(settings, container) { - var duration = settings.animation_speed; - var is_rtl = ($('html[dir=rtl]').length === 1); - var margin = is_rtl ? 'marginRight' : 'marginLeft'; - var animMargin = {}; - animMargin[margin] = '0%'; - - this.next = function(current, next, callback) { - current.animate({marginLeft:'-100%'}, duration); - next.animate(animMargin, duration, function() { - current.css(margin, '100%'); - callback(); - }); - }; - - this.prev = function(current, prev, callback) { - current.animate({marginLeft:'100%'}, duration); - prev.css(margin, '-100%'); - prev.animate(animMargin, duration, function() { - current.css(margin, '100%'); - callback(); - }); - }; - }; - - var FadeAnimation = function(settings, container) { - var duration = settings.animation_speed; - var is_rtl = ($('html[dir=rtl]').length === 1); - var margin = is_rtl ? 'marginRight' : 'marginLeft'; - - this.next = function(current, next, callback) { - next.css({'margin':'0%', 'opacity':'0.01'}); - next.animate({'opacity':'1'}, duration, 'linear', function() { - current.css('margin', '100%'); - callback(); - }); - }; - - this.prev = function(current, prev, callback) { - prev.css({'margin':'0%', 'opacity':'0.01'}); - prev.animate({'opacity':'1'}, duration, 'linear', function() { - current.css('margin', '100%'); - callback(); - }); - }; - }; - - - Foundation.libs = Foundation.libs || {}; - - Foundation.libs.orbit = { - name: 'orbit', - - version: '5.0.0', - - settings: { - animation: 'slide', - timer_speed: 10000, - pause_on_hover: true, - resume_on_mouseout: false, - animation_speed: 500, - stack_on_small: false, - navigation_arrows: true, - slide_number: true, - slide_number_text: 'of', - container_class: 'orbit-container', - stack_on_small_class: 'orbit-stack-on-small', - next_class: 'orbit-next', - prev_class: 'orbit-prev', - timer_container_class: 'orbit-timer', - timer_paused_class: 'paused', - timer_progress_class: 'orbit-progress', - slides_container_class: 'orbit-slides-container', - bullets_container_class: 'orbit-bullets', - bullets_active_class: 'active', - slide_number_class: 'orbit-slide-number', - caption_class: 'orbit-caption', - active_slide_class: 'active', - orbit_transition_class: 'orbit-transitioning', - bullets: true, - timer: true, - variable_height: false, - swipe: true, - before_slide_change: noop, - after_slide_change: noop - }, - - init: function (scope, method, options) { - var self = this; - - if (typeof method === 'object') { - $.extend(true, self.settings, method); - } - - if ($(scope).is('[data-orbit]')) { - var $el = $(scope); - var opts = self.data_options($el); - new Orbit($el, $.extend({},self.settings, opts)); - } - - $('[data-orbit]', scope).each(function(idx, el) { - var $el = $(el); - var opts = self.data_options($el); - new Orbit($el, $.extend({},self.settings, opts)); - }); - } - }; - - -}(jQuery, this, this.document)); diff --git a/public/js/foundation/foundation.reveal.js b/public/js/foundation/foundation.reveal.js deleted file mode 100755 index a7521ec..0000000 --- a/public/js/foundation/foundation.reveal.js +++ /dev/null @@ -1,347 +0,0 @@ -;(function ($, window, document, undefined) { - 'use strict'; - - Foundation.libs.reveal = { - name : 'reveal', - - version : '5.0.0', - - locked : false, - - settings : { - animation: 'fadeAndPop', - animation_speed: 250, - close_on_background_click: true, - close_on_esc: true, - dismiss_modal_class: 'close-reveal-modal', - bg_class: 'reveal-modal-bg', - open: function(){}, - opened: function(){}, - close: function(){}, - closed: function(){}, - bg : $('.reveal-modal-bg'), - css : { - open : { - 'opacity': 0, - 'visibility': 'visible', - 'display' : 'block' - }, - close : { - 'opacity': 1, - 'visibility': 'hidden', - 'display': 'none' - } - } - }, - - init : function (scope, method, options) { - Foundation.inherit(this, 'delay'); - - this.bindings(method, options); - }, - - events : function (scope) { - var self = this; - - $('[data-reveal-id]', this.scope) - .off('.reveal') - .on('click.fndtn.reveal', function (e) { - e.preventDefault(); - - if (!self.locked) { - var element = $(this), - ajax = element.data('reveal-ajax'); - - self.locked = true; - - if (typeof ajax === 'undefined') { - self.open.call(self, element); - } else { - var url = ajax === true ? element.attr('href') : ajax; - - self.open.call(self, element, {url: url}); - } - } - }); - - $(this.scope) - .off('.reveal') - .on('click.fndtn.reveal', this.close_targets(), function (e) { - - e.preventDefault(); - - if (!self.locked) { - var settings = $('[data-reveal].open').data('reveal-init'), - bg_clicked = $(e.target)[0] === $('.' + settings.bg_class)[0]; - - if (bg_clicked && !settings.close_on_background_click) { - return; - } - - self.locked = true; - self.close.call(self, bg_clicked ? $('[data-reveal].open') : $(this).closest('[data-reveal]')); - } - }); - - if($('[data-reveal]', this.scope).length > 0) { - $(this.scope) - // .off('.reveal') - .on('open.fndtn.reveal', this.settings.open) - .on('opened.fndtn.reveal', this.settings.opened) - .on('opened.fndtn.reveal', this.open_video) - .on('close.fndtn.reveal', this.settings.close) - .on('closed.fndtn.reveal', this.settings.closed) - .on('closed.fndtn.reveal', this.close_video); - } else { - $(this.scope) - // .off('.reveal') - .on('open.fndtn.reveal', '[data-reveal]', this.settings.open) - .on('opened.fndtn.reveal', '[data-reveal]', this.settings.opened) - .on('opened.fndtn.reveal', '[data-reveal]', this.open_video) - .on('close.fndtn.reveal', '[data-reveal]', this.settings.close) - .on('closed.fndtn.reveal', '[data-reveal]', this.settings.closed) - .on('closed.fndtn.reveal', '[data-reveal]', this.close_video); - } - - $('body').on('keyup.fndtn.reveal', function ( event ) { - var open_modal = $('[data-reveal].open'), - settings = open_modal.data('reveal-init'); - if ( event.which === 27 && settings.close_on_esc) { // 27 is the keycode for the Escape key - open_modal.foundation('reveal', 'close'); - } - }); - - return true; - }, - - open : function (target, ajax_settings) { - if (target) { - if (typeof target.selector !== 'undefined') { - var modal = $('#' + target.data('reveal-id')); - } else { - var modal = $(this.scope); - - ajax_settings = target; - } - } else { - var modal = $(this.scope); - } - - if (!modal.hasClass('open')) { - var open_modal = $('[data-reveal].open'); - - if (typeof modal.data('css-top') === 'undefined') { - modal.data('css-top', parseInt(modal.css('top'), 10)) - .data('offset', this.cache_offset(modal)); - } - - modal.trigger('open'); - - if (open_modal.length < 1) { - this.toggle_bg(); - } - - if (typeof ajax_settings === 'undefined' || !ajax_settings.url) { - this.hide(open_modal, this.settings.css.close); - this.show(modal, this.settings.css.open); - } else { - var self = this, - old_success = typeof ajax_settings.success !== 'undefined' ? ajax_settings.success : null; - - $.extend(ajax_settings, { - success: function (data, textStatus, jqXHR) { - if ( $.isFunction(old_success) ) { - old_success(data, textStatus, jqXHR); - } - - modal.html(data); - $(modal).foundation('section', 'reflow'); - - self.hide(open_modal, self.settings.css.close); - self.show(modal, self.settings.css.open); - } - }); - - $.ajax(ajax_settings); - } - } - }, - - close : function (modal) { - - var modal = modal && modal.length ? modal : $(this.scope), - open_modals = $('[data-reveal].open'); - - if (open_modals.length > 0) { - this.locked = true; - modal.trigger('close'); - this.toggle_bg(); - this.hide(open_modals, this.settings.css.close); - } - }, - - close_targets : function () { - var base = '.' + this.settings.dismiss_modal_class; - - if (this.settings.close_on_background_click) { - return base + ', .' + this.settings.bg_class; - } - - return base; - }, - - toggle_bg : function () { - if ($('.' + this.settings.bg_class).length === 0) { - this.settings.bg = $('
    ', {'class': this.settings.bg_class}) - .appendTo('body'); - } - - if (this.settings.bg.filter(':visible').length > 0) { - this.hide(this.settings.bg); - } else { - this.show(this.settings.bg); - } - }, - - show : function (el, css) { - // is modal - if (css) { - if (el.parent('body').length === 0) { - var placeholder = el.wrap('
    ').parent(); - el.on('closed.fndtn.reveal.wrapped', function() { - el.detach().appendTo(placeholder); - el.unwrap().unbind('closed.fndtn.reveal.wrapped'); - }); - - el.detach().appendTo('body'); - } - - if (/pop/i.test(this.settings.animation)) { - css.top = $(window).scrollTop() - el.data('offset') + 'px'; - var end_css = { - top: $(window).scrollTop() + el.data('css-top') + 'px', - opacity: 1 - }; - - return this.delay(function () { - return el - .css(css) - .animate(end_css, this.settings.animation_speed, 'linear', function () { - this.locked = false; - el.trigger('opened'); - }.bind(this)) - .addClass('open'); - }.bind(this), this.settings.animation_speed / 2); - } - - if (/fade/i.test(this.settings.animation)) { - var end_css = {opacity: 1}; - - return this.delay(function () { - return el - .css(css) - .animate(end_css, this.settings.animation_speed, 'linear', function () { - this.locked = false; - el.trigger('opened'); - }.bind(this)) - .addClass('open'); - }.bind(this), this.settings.animation_speed / 2); - } - - return el.css(css).show().css({opacity: 1}).addClass('open').trigger('opened'); - } - - // should we animate the background? - if (/fade/i.test(this.settings.animation)) { - return el.fadeIn(this.settings.animation_speed / 2); - } - - return el.show(); - }, - - hide : function (el, css) { - // is modal - if (css) { - if (/pop/i.test(this.settings.animation)) { - var end_css = { - top: - $(window).scrollTop() - el.data('offset') + 'px', - opacity: 0 - }; - - return this.delay(function () { - return el - .animate(end_css, this.settings.animation_speed, 'linear', function () { - this.locked = false; - el.css(css).trigger('closed'); - }.bind(this)) - .removeClass('open'); - }.bind(this), this.settings.animation_speed / 2); - } - - if (/fade/i.test(this.settings.animation)) { - var end_css = {opacity: 0}; - - return this.delay(function () { - return el - .animate(end_css, this.settings.animation_speed, 'linear', function () { - this.locked = false; - el.css(css).trigger('closed'); - }.bind(this)) - .removeClass('open'); - }.bind(this), this.settings.animation_speed / 2); - } - - return el.hide().css(css).removeClass('open').trigger('closed'); - } - - // should we animate the background? - if (/fade/i.test(this.settings.animation)) { - return el.fadeOut(this.settings.animation_speed / 2); - } - - return el.hide(); - }, - - close_video : function (e) { - var video = $(this).find('.flex-video'), - iframe = video.find('iframe'); - - if (iframe.length > 0) { - iframe.attr('data-src', iframe[0].src); - iframe.attr('src', 'about:blank'); - video.hide(); - } - }, - - open_video : function (e) { - var video = $(this).find('.flex-video'), - iframe = video.find('iframe'); - - if (iframe.length > 0) { - var data_src = iframe.attr('data-src'); - if (typeof data_src === 'string') { - iframe[0].src = iframe.attr('data-src'); - } else { - var src = iframe[0].src; - iframe[0].src = undefined; - iframe[0].src = src; - } - video.show(); - } - }, - - cache_offset : function (modal) { - var offset = modal.show().height() + parseInt(modal.css('top'), 10); - - modal.hide(); - - return offset; - }, - - off : function () { - $(this.scope).off('.fndtn.reveal'); - }, - - reflow : function () {} - }; -}(jQuery, this, this.document)); diff --git a/public/js/foundation/foundation.tab.js b/public/js/foundation/foundation.tab.js deleted file mode 100755 index f3dff80..0000000 --- a/public/js/foundation/foundation.tab.js +++ /dev/null @@ -1,37 +0,0 @@ -/*jslint unparam: true, browser: true, indent: 2 */ -;(function ($, window, document, undefined) { - 'use strict'; - - Foundation.libs.tab = { - name : 'tab', - - version : '5.0.1', - - settings : { - active_class: 'active' - }, - - init : function (scope, method, options) { - this.bindings(method, options); - }, - - events : function () { - $(this.scope).off('.tab').on('click.fndtn.tab', '[data-tab] > dd > a', function (e) { - e.preventDefault(); - - var tab = $(this).parent(), - target = $('#' + this.href.split('#')[1]), - siblings = tab.siblings(), - settings = tab.closest('[data-tab]').data('tab-init'); - - tab.addClass(settings.active_class); - siblings.removeClass(settings.active_class); - target.siblings().removeClass(settings.active_class).end().addClass(settings.active_class); - }); - }, - - off : function () {}, - - reflow : function () {} - }; -}(jQuery, this, this.document)); diff --git a/public/js/foundation/foundation.tooltip.js b/public/js/foundation/foundation.tooltip.js deleted file mode 100755 index 27429ee..0000000 --- a/public/js/foundation/foundation.tooltip.js +++ /dev/null @@ -1,202 +0,0 @@ -;(function ($, window, document, undefined) { - 'use strict'; - - Foundation.libs.tooltip = { - name : 'tooltip', - - version : '5.0.0', - - settings : { - additional_inheritable_classes : [], - tooltip_class : '.tooltip', - append_to: 'body', - touch_close_text: 'Tap To Close', - disable_for_touch: false, - tip_template : function (selector, content) { - return '' + content + ''; - } - }, - - cache : {}, - - init : function (scope, method, options) { - this.bindings(method, options); - }, - - events : function () { - var self = this; - - if (Modernizr.touch) { - $(this.scope) - .off('.tooltip') - .on('click.fndtn.tooltip touchstart.fndtn.tooltip touchend.fndtn.tooltip', - '[data-tooltip]', function (e) { - var settings = $.extend({}, self.settings, self.data_options($(this))); - if (!settings.disable_for_touch) { - e.preventDefault(); - $(settings.tooltip_class).hide(); - self.showOrCreateTip($(this)); - } - }) - .on('click.fndtn.tooltip touchstart.fndtn.tooltip touchend.fndtn.tooltip', - this.settings.tooltip_class, function (e) { - e.preventDefault(); - $(this).fadeOut(150); - }); - } else { - $(this.scope) - .off('.tooltip') - .on('mouseenter.fndtn.tooltip mouseleave.fndtn.tooltip', - '[data-tooltip]', function (e) { - var $this = $(this); - - if (/enter|over/i.test(e.type)) { - self.showOrCreateTip($this); - } else if (e.type === 'mouseout' || e.type === 'mouseleave') { - self.hide($this); - } - }); - } - }, - - showOrCreateTip : function ($target) { - var $tip = this.getTip($target); - - if ($tip && $tip.length > 0) { - return this.show($target); - } - - return this.create($target); - }, - - getTip : function ($target) { - var selector = this.selector($target), - tip = null; - - if (selector) { - tip = $('span[data-selector="' + selector + '"]' + this.settings.tooltip_class); - } - - return (typeof tip === 'object') ? tip : false; - }, - - selector : function ($target) { - var id = $target.attr('id'), - dataSelector = $target.attr('data-tooltip') || $target.attr('data-selector'); - - if ((id && id.length < 1 || !id) && typeof dataSelector != 'string') { - dataSelector = 'tooltip' + Math.random().toString(36).substring(7); - $target.attr('data-selector', dataSelector); - } - - return (id && id.length > 0) ? id : dataSelector; - }, - - create : function ($target) { - var $tip = $(this.settings.tip_template(this.selector($target), $('
    ').html($target.attr('title')).html())), - classes = this.inheritable_classes($target); - - $tip.addClass(classes).appendTo(this.settings.append_to); - if (Modernizr.touch) { - $tip.append(''+this.settings.touch_close_text+''); - } - $target.removeAttr('title').attr('title',''); - this.show($target); - }, - - reposition : function (target, tip, classes) { - var width, nub, nubHeight, nubWidth, column, objPos; - - tip.css('visibility', 'hidden').show(); - - width = target.data('width'); - nub = tip.children('.nub'); - nubHeight = nub.outerHeight(); - nubWidth = nub.outerHeight(); - - objPos = function (obj, top, right, bottom, left, width) { - return obj.css({ - 'top' : (top) ? top : 'auto', - 'bottom' : (bottom) ? bottom : 'auto', - 'left' : (left) ? left : 'auto', - 'right' : (right) ? right : 'auto', - 'width' : (width) ? width : 'auto' - }).end(); - }; - - objPos(tip, (target.offset().top + target.outerHeight() + 10), 'auto', 'auto', target.offset().left, width); - - if (this.small()) { - objPos(tip, (target.offset().top + target.outerHeight() + 10), 'auto', 'auto', 12.5, $(this.scope).width()); - tip.addClass('tip-override'); - objPos(nub, -nubHeight, 'auto', 'auto', target.offset().left); - } else { - var left = target.offset().left; - if (Foundation.rtl) { - left = target.offset().left + target.offset().width - tip.outerWidth(); - } - objPos(tip, (target.offset().top + target.outerHeight() + 10), 'auto', 'auto', left, width); - tip.removeClass('tip-override'); - if (classes && classes.indexOf('tip-top') > -1) { - objPos(tip, (target.offset().top - tip.outerHeight()), 'auto', 'auto', left, width) - .removeClass('tip-override'); - } else if (classes && classes.indexOf('tip-left') > -1) { - objPos(tip, (target.offset().top + (target.outerHeight() / 2) - nubHeight*2.5), 'auto', 'auto', (target.offset().left - tip.outerWidth() - nubHeight), width) - .removeClass('tip-override'); - } else if (classes && classes.indexOf('tip-right') > -1) { - objPos(tip, (target.offset().top + (target.outerHeight() / 2) - nubHeight*2.5), 'auto', 'auto', (target.offset().left + target.outerWidth() + nubHeight), width) - .removeClass('tip-override'); - } - } - - tip.css('visibility', 'visible').hide(); - }, - - small : function () { - return matchMedia(Foundation.media_queries.small).matches; - }, - - inheritable_classes : function (target) { - var inheritables = ['tip-top', 'tip-left', 'tip-bottom', 'tip-right', 'noradius'].concat(this.settings.additional_inheritable_classes), - classes = target.attr('class'), - filtered = classes ? $.map(classes.split(' '), function (el, i) { - if ($.inArray(el, inheritables) !== -1) { - return el; - } - }).join(' ') : ''; - - return $.trim(filtered); - }, - - show : function ($target) { - var $tip = this.getTip($target); - - this.reposition($target, $tip, $target.attr('class')); - $tip.fadeIn(150); - }, - - hide : function ($target) { - var $tip = this.getTip($target); - - $tip.fadeOut(150); - }, - - // deprecate reload - reload : function () { - var $self = $(this); - - return ($self.data('fndtn-tooltips')) ? $self.foundationTooltips('destroy').foundationTooltips('init') : $self.foundationTooltips('init'); - }, - - off : function () { - $(this.scope).off('.fndtn.tooltip'); - $(this.settings.tooltip_class).each(function (i) { - $('[data-tooltip]').get(i).attr('title', $(this).text()); - }).remove(); - }, - - reflow : function () {} - }; -}(jQuery, this, this.document)); diff --git a/public/js/foundation/foundation.topbar.js b/public/js/foundation/foundation.topbar.js deleted file mode 100755 index 019471c..0000000 --- a/public/js/foundation/foundation.topbar.js +++ /dev/null @@ -1,380 +0,0 @@ -;(function ($, window, document, undefined) { - 'use strict'; - - Foundation.libs.topbar = { - name : 'topbar', - - version: '5.0.1', - - settings : { - index : 0, - sticky_class : 'sticky', - custom_back_text: true, - back_text: 'Back', - is_hover: true, - mobile_show_parent_link: false, - scrolltop : true // jump to top when sticky nav menu toggle is clicked - }, - - init : function (section, method, options) { - Foundation.inherit(this, 'addCustomRule register_media throttle'); - var self = this; - - self.register_media('topbar', 'foundation-mq-topbar'); - - this.bindings(method, options); - - $('[data-topbar]', this.scope).each(function () { - var topbar = $(this), - settings = topbar.data('topbar-init'), - section = $('section', this), - titlebar = $('> ul', this).first(); - - topbar.data('index', 0); - - var topbarContainer = topbar.parent(); - if(topbarContainer.hasClass('fixed') || topbarContainer.hasClass(settings.sticky_class)) { - self.settings.sticky_class = settings.sticky_class; - self.settings.stick_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) { - $('.has-dropdown', topbar).addClass('not-click'); - } else { - $('.has-dropdown', topbar).removeClass('not-click'); - } - - // Pad body when sticky (scrolled) or fixed. - self.addCustomRule('.f-topbar-fixed { padding-top: ' + topbar.data('height') + 'px }'); - - if (topbarContainer.hasClass('fixed')) { - $('body').addClass('f-topbar-fixed'); - } - }); - - }, - - toggle: function (toggleEl) { - var self = this; - - if (toggleEl) { - var topbar = $(toggleEl).closest('[data-topbar]'); - } else { - var topbar = $('[data-topbar]'); - } - - var settings = topbar.data('topbar-init'); - - var section = $('section, .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%'}); - } - - $('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'); - $('body').addClass('f-topbar-fixed'); - } - } else if (topbar.parent().hasClass('fixed')) { - if (settings.scrolltop) { - topbar.parent().removeClass('fixed'); - topbar.addClass('fixed'); - $('body').removeClass('f-topbar-fixed'); - - window.scrollTo(0,0); - } else { - topbar.parent().removeClass('expanded'); - } - } - } else { - if(topbar.parent().hasClass(self.settings.sticky_class)) { - 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'); - } - } - } - }, - - timer : null, - - events : function (bar) { - var self = this; - $(this.scope) - .off('.topbar') - .on('click.fndtn.topbar', '[data-topbar] .toggle-topbar', function (e) { - e.preventDefault(); - self.toggle(this); - }) - .on('click.fndtn.topbar', '[data-topbar] li.has-dropdown', function (e) { - var li = $(this), - target = $(e.target), - topbar = li.closest('[data-topbar]'), - settings = topbar.data('topbar-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'); - - if (target[0].nodeName === 'A' && target.parent().hasClass('has-dropdown')) { - e.preventDefault(); - } - } - }) - .on('click.fndtn.topbar', '[data-topbar] .has-dropdown>a', function (e) { - if (self.breakpoint()) { - - e.preventDefault(); - - var $this = $(this), - topbar = $this.closest('[data-topbar]'), - section = topbar.find('section, .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')); - } - }); - - $(window).off('.topbar').on('resize.fndtn.topbar', self.throttle(function () { - self.resize.call(self); - }, 50)).trigger('resize'); - - $('body').off('.topbar').on('click.fndtn.topbar touchstart.fndtn.topbar', function (e) { - var parent = $(e.target).closest('li').closest('li.hover'); - - if (parent.length > 0) { - return; - } - - $('[data-topbar] li').removeClass('hover'); - }); - - // Go up a level on Click - $(this.scope).on('click.fndtn.topbar', '[data-topbar] .has-dropdown .back', function (e) { - e.preventDefault(); - - var $this = $(this), - topbar = $this.closest('[data-topbar]'), - section = topbar.find('section, .section'), - settings = topbar.data('topbar-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); - }); - }, - - resize : function () { - var self = this; - $('[data-topbar]').each(function () { - var topbar = $(this), - settings = topbar.data('topbar-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(stickyContainer.length > 0) { - if(stickyContainer.hasClass('fixed')) { - // Remove the fixed to allow for correct calculation of the offset. - stickyContainer.removeClass('fixed'); - - stickyOffset = stickyContainer.offset().top; - if($(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; - }, - - assemble : function (topbar) { - var self = this, - settings = topbar.data('topbar-init'), - section = $('section', topbar), - titlebar = $('> ul', topbar).first(); - - // Pull element out of the DOM for manipulation - section.detach(); - - $('.has-dropdown>a', section).each(function () { - var $link = $(this), - $dropdown = $link.siblings('.dropdown'), - url = $link.attr('href'); - - if (settings.mobile_show_parent_link && url && url.length > 1) { - var $titleLi = $('
  2. ' + $link.text() +'
  3. '); - } else { - var $titleLi = $('
  4. '); - } - - // 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('topbar-init', $.extend({}, topbar.data('topbar-init'), {assembled: true})); - }, - - height : function (ul) { - var total = 0, - self = this; - - $('> li', ul).each(function () { total += $(this).outerHeight(true); }); - - return total; - }, - - sticky : function () { - var $window = $(window), - self = this; - - $(window).on('scroll', function() { - self.update_sticky_positioning(); - }); - }, - - update_sticky_positioning: function() { - var klass = '.' + this.settings.sticky_class; - var $window = $(window); - - if ($(klass).length > 0) { - var distance = this.settings.sticky_topbar.data('stickyoffset'); - if (!$(klass).hasClass('expanded')) { - if ($window.scrollTop() > (distance)) { - if (!$(klass).hasClass('fixed')) { - $(klass).addClass('fixed'); - $('body').addClass('f-topbar-fixed'); - } - } else if ($window.scrollTop() <= distance) { - if ($(klass).hasClass('fixed')) { - $(klass).removeClass('fixed'); - $('body').removeClass('f-topbar-fixed'); - } - } - } - } - }, - - off : function () { - $(this.scope).off('.fndtn.topbar'); - $(window).off('.fndtn.topbar'); - }, - - reflow : function () {} - }; -}(jQuery, this, this.document)); diff --git a/public/js/jquery.js b/public/js/jquery.js deleted file mode 100755 index cb15301..0000000 --- a/public/js/jquery.js +++ /dev/null @@ -1,8829 +0,0 @@ -/*! - * jQuery JavaScript Library v2.0.3 - * http://jquery.com/ - * - * Includes Sizzle.js - * http://sizzlejs.com/ - * - * Copyright 2005, 2013 jQuery Foundation, Inc. and other contributors - * Released under the MIT license - * http://jquery.org/license - * - * Date: 2013-07-03T13:30Z - */ -(function( window, undefined ) { - -// Can't do this because several apps including ASP.NET trace -// the stack via arguments.caller.callee and Firefox dies if -// you try to trace through "use strict" call chains. (#13335) -// Support: Firefox 18+ -//"use strict"; -var - // A central reference to the root jQuery(document) - rootjQuery, - - // The deferred used on DOM ready - readyList, - - // Support: IE9 - // For `typeof xmlNode.method` instead of `xmlNode.method !== undefined` - core_strundefined = typeof undefined, - - // Use the correct document accordingly with window argument (sandbox) - location = window.location, - document = window.document, - docElem = document.documentElement, - - // Map over jQuery in case of overwrite - _jQuery = window.jQuery, - - // Map over the $ in case of overwrite - _$ = window.$, - - // [[Class]] -> type pairs - class2type = {}, - - // List of deleted data cache ids, so we can reuse them - core_deletedIds = [], - - core_version = "2.0.3", - - // Save a reference to some core methods - core_concat = core_deletedIds.concat, - core_push = core_deletedIds.push, - core_slice = core_deletedIds.slice, - core_indexOf = core_deletedIds.indexOf, - core_toString = class2type.toString, - core_hasOwn = class2type.hasOwnProperty, - core_trim = core_version.trim, - - // Define a local copy of jQuery - jQuery = function( selector, context ) { - // The jQuery object is actually just the init constructor 'enhanced' - return new jQuery.fn.init( selector, context, rootjQuery ); - }, - - // Used for matching numbers - core_pnum = /[+-]?(?:\d*\.|)\d+(?:[eE][+-]?\d+|)/.source, - - // Used for splitting on whitespace - core_rnotwhite = /\S+/g, - - // A simple way to check for HTML strings - // Prioritize #id over to avoid XSS via location.hash (#9521) - // Strict HTML recognition (#11290: must start with <) - rquickExpr = /^(?:\s*(<[\w\W]+>)[^>]*|#([\w-]*))$/, - - // Match a standalone tag - rsingleTag = /^<(\w+)\s*\/?>(?:<\/\1>|)$/, - - // Matches dashed string for camelizing - rmsPrefix = /^-ms-/, - rdashAlpha = /-([\da-z])/gi, - - // Used by jQuery.camelCase as callback to replace() - fcamelCase = function( all, letter ) { - return letter.toUpperCase(); - }, - - // The ready event handler and self cleanup method - completed = function() { - document.removeEventListener( "DOMContentLoaded", completed, false ); - window.removeEventListener( "load", completed, false ); - jQuery.ready(); - }; - -jQuery.fn = jQuery.prototype = { - // The current version of jQuery being used - jquery: core_version, - - constructor: jQuery, - init: function( selector, context, rootjQuery ) { - var match, elem; - - // HANDLE: $(""), $(null), $(undefined), $(false) - if ( !selector ) { - return this; - } - - // Handle HTML strings - if ( typeof selector === "string" ) { - if ( selector.charAt(0) === "<" && selector.charAt( selector.length - 1 ) === ">" && selector.length >= 3 ) { - // Assume that strings that start and end with <> are HTML and skip the regex check - match = [ null, selector, null ]; - - } else { - match = rquickExpr.exec( selector ); - } - - // Match html or make sure no context is specified for #id - if ( match && (match[1] || !context) ) { - - // HANDLE: $(html) -> $(array) - if ( match[1] ) { - context = context instanceof jQuery ? context[0] : context; - - // scripts is true for back-compat - jQuery.merge( this, jQuery.parseHTML( - match[1], - context && context.nodeType ? context.ownerDocument || context : document, - true - ) ); - - // HANDLE: $(html, props) - if ( rsingleTag.test( match[1] ) && jQuery.isPlainObject( context ) ) { - for ( match in context ) { - // Properties of context are called as methods if possible - if ( jQuery.isFunction( this[ match ] ) ) { - this[ match ]( context[ match ] ); - - // ...and otherwise set as attributes - } else { - this.attr( match, context[ match ] ); - } - } - } - - return this; - - // HANDLE: $(#id) - } else { - elem = document.getElementById( match[2] ); - - // Check parentNode to catch when Blackberry 4.6 returns - // nodes that are no longer in the document #6963 - if ( elem && elem.parentNode ) { - // Inject the element directly into the jQuery object - this.length = 1; - this[0] = elem; - } - - this.context = document; - this.selector = selector; - return this; - } - - // HANDLE: $(expr, $(...)) - } else if ( !context || context.jquery ) { - return ( context || rootjQuery ).find( selector ); - - // HANDLE: $(expr, context) - // (which is just equivalent to: $(context).find(expr) - } else { - return this.constructor( context ).find( selector ); - } - - // HANDLE: $(DOMElement) - } else if ( selector.nodeType ) { - this.context = this[0] = selector; - this.length = 1; - return this; - - // HANDLE: $(function) - // Shortcut for document ready - } else if ( jQuery.isFunction( selector ) ) { - return rootjQuery.ready( selector ); - } - - if ( selector.selector !== undefined ) { - this.selector = selector.selector; - this.context = selector.context; - } - - return jQuery.makeArray( selector, this ); - }, - - // Start with an empty selector - selector: "", - - // The default length of a jQuery object is 0 - length: 0, - - toArray: function() { - return core_slice.call( this ); - }, - - // Get the Nth element in the matched element set OR - // Get the whole matched element set as a clean array - get: function( num ) { - return num == null ? - - // Return a 'clean' array - this.toArray() : - - // Return just the object - ( num < 0 ? this[ this.length + num ] : this[ num ] ); - }, - - // Take an array of elements and push it onto the stack - // (returning the new matched element set) - pushStack: function( elems ) { - - // Build a new jQuery matched element set - var ret = jQuery.merge( this.constructor(), elems ); - - // Add the old object onto the stack (as a reference) - ret.prevObject = this; - ret.context = this.context; - - // Return the newly-formed element set - return ret; - }, - - // Execute a callback for every element in the matched set. - // (You can seed the arguments with an array of args, but this is - // only used internally.) - each: function( callback, args ) { - return jQuery.each( this, callback, args ); - }, - - ready: function( fn ) { - // Add the callback - jQuery.ready.promise().done( fn ); - - return this; - }, - - slice: function() { - return this.pushStack( core_slice.apply( this, arguments ) ); - }, - - first: function() { - return this.eq( 0 ); - }, - - last: function() { - return this.eq( -1 ); - }, - - eq: function( i ) { - var len = this.length, - j = +i + ( i < 0 ? len : 0 ); - return this.pushStack( j >= 0 && j < len ? [ this[j] ] : [] ); - }, - - map: function( callback ) { - return this.pushStack( jQuery.map(this, function( elem, i ) { - return callback.call( elem, i, elem ); - })); - }, - - end: function() { - return this.prevObject || this.constructor(null); - }, - - // For internal use only. - // Behaves like an Array's method, not like a jQuery method. - push: core_push, - sort: [].sort, - splice: [].splice -}; - -// Give the init function the jQuery prototype for later instantiation -jQuery.fn.init.prototype = jQuery.fn; - -jQuery.extend = jQuery.fn.extend = function() { - var options, name, src, copy, copyIsArray, clone, - target = arguments[0] || {}, - i = 1, - length = arguments.length, - deep = false; - - // Handle a deep copy situation - if ( typeof target === "boolean" ) { - deep = target; - target = arguments[1] || {}; - // skip the boolean and the target - i = 2; - } - - // Handle case when target is a string or something (possible in deep copy) - if ( typeof target !== "object" && !jQuery.isFunction(target) ) { - target = {}; - } - - // extend jQuery itself if only one argument is passed - if ( length === i ) { - target = this; - --i; - } - - for ( ; i < length; i++ ) { - // Only deal with non-null/undefined values - if ( (options = arguments[ i ]) != null ) { - // Extend the base object - for ( name in options ) { - src = target[ name ]; - copy = options[ name ]; - - // Prevent never-ending loop - if ( target === copy ) { - continue; - } - - // Recurse if we're merging plain objects or arrays - if ( deep && copy && ( jQuery.isPlainObject(copy) || (copyIsArray = jQuery.isArray(copy)) ) ) { - if ( copyIsArray ) { - copyIsArray = false; - clone = src && jQuery.isArray(src) ? src : []; - - } else { - clone = src && jQuery.isPlainObject(src) ? src : {}; - } - - // Never move original objects, clone them - target[ name ] = jQuery.extend( deep, clone, copy ); - - // Don't bring in undefined values - } else if ( copy !== undefined ) { - target[ name ] = copy; - } - } - } - } - - // Return the modified object - return target; -}; - -jQuery.extend({ - // Unique for each copy of jQuery on the page - expando: "jQuery" + ( core_version + Math.random() ).replace( /\D/g, "" ), - - noConflict: function( deep ) { - if ( window.$ === jQuery ) { - window.$ = _$; - } - - if ( deep && window.jQuery === jQuery ) { - window.jQuery = _jQuery; - } - - return jQuery; - }, - - // Is the DOM ready to be used? Set to true once it occurs. - isReady: false, - - // A counter to track how many items to wait for before - // the ready event fires. See #6781 - readyWait: 1, - - // Hold (or release) the ready event - holdReady: function( hold ) { - if ( hold ) { - jQuery.readyWait++; - } else { - jQuery.ready( true ); - } - }, - - // Handle when the DOM is ready - ready: function( wait ) { - - // Abort if there are pending holds or we're already ready - if ( wait === true ? --jQuery.readyWait : jQuery.isReady ) { - return; - } - - // Remember that the DOM is ready - jQuery.isReady = true; - - // If a normal DOM Ready event fired, decrement, and wait if need be - if ( wait !== true && --jQuery.readyWait > 0 ) { - return; - } - - // If there are functions bound, to execute - readyList.resolveWith( document, [ jQuery ] ); - - // Trigger any bound ready events - if ( jQuery.fn.trigger ) { - jQuery( document ).trigger("ready").off("ready"); - } - }, - - // See test/unit/core.js for details concerning isFunction. - // Since version 1.3, DOM methods and functions like alert - // aren't supported. They return false on IE (#2968). - isFunction: function( obj ) { - return jQuery.type(obj) === "function"; - }, - - isArray: Array.isArray, - - isWindow: function( obj ) { - return obj != null && obj === obj.window; - }, - - isNumeric: function( obj ) { - return !isNaN( parseFloat(obj) ) && isFinite( obj ); - }, - - type: function( obj ) { - if ( obj == null ) { - return String( obj ); - } - // Support: Safari <= 5.1 (functionish RegExp) - return typeof obj === "object" || typeof obj === "function" ? - class2type[ core_toString.call(obj) ] || "object" : - typeof obj; - }, - - isPlainObject: function( obj ) { - // Not plain objects: - // - Any object or value whose internal [[Class]] property is not "[object Object]" - // - DOM nodes - // - window - if ( jQuery.type( obj ) !== "object" || obj.nodeType || jQuery.isWindow( obj ) ) { - return false; - } - - // Support: Firefox <20 - // The try/catch suppresses exceptions thrown when attempting to access - // the "constructor" property of certain host objects, ie. |window.location| - // https://bugzilla.mozilla.org/show_bug.cgi?id=814622 - try { - if ( obj.constructor && - !core_hasOwn.call( obj.constructor.prototype, "isPrototypeOf" ) ) { - return false; - } - } catch ( e ) { - return false; - } - - // If the function hasn't returned already, we're confident that - // |obj| is a plain object, created by {} or constructed with new Object - return true; - }, - - isEmptyObject: function( obj ) { - var name; - for ( name in obj ) { - return false; - } - return true; - }, - - error: function( msg ) { - throw new Error( msg ); - }, - - // data: string of html - // context (optional): If specified, the fragment will be created in this context, defaults to document - // keepScripts (optional): If true, will include scripts passed in the html string - parseHTML: function( data, context, keepScripts ) { - if ( !data || typeof data !== "string" ) { - return null; - } - if ( typeof context === "boolean" ) { - keepScripts = context; - context = false; - } - context = context || document; - - var parsed = rsingleTag.exec( data ), - scripts = !keepScripts && []; - - // Single tag - if ( parsed ) { - return [ context.createElement( parsed[1] ) ]; - } - - parsed = jQuery.buildFragment( [ data ], context, scripts ); - - if ( scripts ) { - jQuery( scripts ).remove(); - } - - return jQuery.merge( [], parsed.childNodes ); - }, - - parseJSON: JSON.parse, - - // Cross-browser xml parsing - parseXML: function( data ) { - var xml, tmp; - if ( !data || typeof data !== "string" ) { - return null; - } - - // Support: IE9 - try { - tmp = new DOMParser(); - xml = tmp.parseFromString( data , "text/xml" ); - } catch ( e ) { - xml = undefined; - } - - if ( !xml || xml.getElementsByTagName( "parsererror" ).length ) { - jQuery.error( "Invalid XML: " + data ); - } - return xml; - }, - - noop: function() {}, - - // Evaluates a script in a global context - globalEval: function( code ) { - var script, - indirect = eval; - - code = jQuery.trim( code ); - - if ( code ) { - // If the code includes a valid, prologue position - // strict mode pragma, execute code by injecting a - // script tag into the document. - if ( code.indexOf("use strict") === 1 ) { - script = document.createElement("script"); - script.text = code; - document.head.appendChild( script ).parentNode.removeChild( script ); - } else { - // Otherwise, avoid the DOM node creation, insertion - // and removal by using an indirect global eval - indirect( code ); - } - } - }, - - // Convert dashed to camelCase; used by the css and data modules - // Microsoft forgot to hump their vendor prefix (#9572) - camelCase: function( string ) { - return string.replace( rmsPrefix, "ms-" ).replace( rdashAlpha, fcamelCase ); - }, - - nodeName: function( elem, name ) { - return elem.nodeName && elem.nodeName.toLowerCase() === name.toLowerCase(); - }, - - // args is for internal usage only - each: function( obj, callback, args ) { - var value, - i = 0, - length = obj.length, - isArray = isArraylike( obj ); - - if ( args ) { - if ( isArray ) { - for ( ; i < length; i++ ) { - value = callback.apply( obj[ i ], args ); - - if ( value === false ) { - break; - } - } - } else { - for ( i in obj ) { - value = callback.apply( obj[ i ], args ); - - if ( value === false ) { - break; - } - } - } - - // A special, fast, case for the most common use of each - } else { - if ( isArray ) { - for ( ; i < length; i++ ) { - value = callback.call( obj[ i ], i, obj[ i ] ); - - if ( value === false ) { - break; - } - } - } else { - for ( i in obj ) { - value = callback.call( obj[ i ], i, obj[ i ] ); - - if ( value === false ) { - break; - } - } - } - } - - return obj; - }, - - trim: function( text ) { - return text == null ? "" : core_trim.call( text ); - }, - - // results is for internal usage only - makeArray: function( arr, results ) { - var ret = results || []; - - if ( arr != null ) { - if ( isArraylike( Object(arr) ) ) { - jQuery.merge( ret, - typeof arr === "string" ? - [ arr ] : arr - ); - } else { - core_push.call( ret, arr ); - } - } - - return ret; - }, - - inArray: function( elem, arr, i ) { - return arr == null ? -1 : core_indexOf.call( arr, elem, i ); - }, - - merge: function( first, second ) { - var l = second.length, - i = first.length, - j = 0; - - if ( typeof l === "number" ) { - for ( ; j < l; j++ ) { - first[ i++ ] = second[ j ]; - } - } else { - while ( second[j] !== undefined ) { - first[ i++ ] = second[ j++ ]; - } - } - - first.length = i; - - return first; - }, - - grep: function( elems, callback, inv ) { - var retVal, - ret = [], - i = 0, - length = elems.length; - inv = !!inv; - - // Go through the array, only saving the items - // that pass the validator function - for ( ; i < length; i++ ) { - retVal = !!callback( elems[ i ], i ); - if ( inv !== retVal ) { - ret.push( elems[ i ] ); - } - } - - return ret; - }, - - // arg is for internal usage only - map: function( elems, callback, arg ) { - var value, - i = 0, - length = elems.length, - isArray = isArraylike( elems ), - ret = []; - - // Go through the array, translating each of the items to their - if ( isArray ) { - for ( ; i < length; i++ ) { - value = callback( elems[ i ], i, arg ); - - if ( value != null ) { - ret[ ret.length ] = value; - } - } - - // Go through every key on the object, - } else { - for ( i in elems ) { - value = callback( elems[ i ], i, arg ); - - if ( value != null ) { - ret[ ret.length ] = value; - } - } - } - - // Flatten any nested arrays - return core_concat.apply( [], ret ); - }, - - // A global GUID counter for objects - guid: 1, - - // Bind a function to a context, optionally partially applying any - // arguments. - proxy: function( fn, context ) { - var tmp, args, proxy; - - if ( typeof context === "string" ) { - tmp = fn[ context ]; - context = fn; - fn = tmp; - } - - // Quick check to determine if target is callable, in the spec - // this throws a TypeError, but we will just return undefined. - if ( !jQuery.isFunction( fn ) ) { - return undefined; - } - - // Simulated bind - args = core_slice.call( arguments, 2 ); - proxy = function() { - return fn.apply( context || this, args.concat( core_slice.call( arguments ) ) ); - }; - - // Set the guid of unique handler to the same of original handler, so it can be removed - proxy.guid = fn.guid = fn.guid || jQuery.guid++; - - return proxy; - }, - - // Multifunctional method to get and set values of a collection - // The value/s can optionally be executed if it's a function - access: function( elems, fn, key, value, chainable, emptyGet, raw ) { - var i = 0, - length = elems.length, - bulk = key == null; - - // Sets many values - if ( jQuery.type( key ) === "object" ) { - chainable = true; - for ( i in key ) { - jQuery.access( elems, fn, i, key[i], true, emptyGet, raw ); - } - - // Sets one value - } else if ( value !== undefined ) { - chainable = true; - - if ( !jQuery.isFunction( value ) ) { - raw = true; - } - - if ( bulk ) { - // Bulk operations run against the entire set - if ( raw ) { - fn.call( elems, value ); - fn = null; - - // ...except when executing function values - } else { - bulk = fn; - fn = function( elem, key, value ) { - return bulk.call( jQuery( elem ), value ); - }; - } - } - - if ( fn ) { - for ( ; i < length; i++ ) { - fn( elems[i], key, raw ? value : value.call( elems[i], i, fn( elems[i], key ) ) ); - } - } - } - - return chainable ? - elems : - - // Gets - bulk ? - fn.call( elems ) : - length ? fn( elems[0], key ) : emptyGet; - }, - - now: Date.now, - - // A method for quickly swapping in/out CSS properties to get correct calculations. - // Note: this method belongs to the css module but it's needed here for the support module. - // If support gets modularized, this method should be moved back to the css module. - swap: function( elem, options, callback, args ) { - var ret, name, - old = {}; - - // Remember the old values, and insert the new ones - for ( name in options ) { - old[ name ] = elem.style[ name ]; - elem.style[ name ] = options[ name ]; - } - - ret = callback.apply( elem, args || [] ); - - // Revert the old values - for ( name in options ) { - elem.style[ name ] = old[ name ]; - } - - return ret; - } -}); - -jQuery.ready.promise = function( obj ) { - if ( !readyList ) { - - readyList = jQuery.Deferred(); - - // Catch cases where $(document).ready() is called after the browser event has already occurred. - // we once tried to use readyState "interactive" here, but it caused issues like the one - // discovered by ChrisS here: http://bugs.jquery.com/ticket/12282#comment:15 - if ( document.readyState === "complete" ) { - // Handle it asynchronously to allow scripts the opportunity to delay ready - setTimeout( jQuery.ready ); - - } else { - - // Use the handy event callback - document.addEventListener( "DOMContentLoaded", completed, false ); - - // A fallback to window.onload, that will always work - window.addEventListener( "load", completed, false ); - } - } - return readyList.promise( obj ); -}; - -// Populate the class2type map -jQuery.each("Boolean Number String Function Array Date RegExp Object Error".split(" "), function(i, name) { - class2type[ "[object " + name + "]" ] = name.toLowerCase(); -}); - -function isArraylike( obj ) { - var length = obj.length, - type = jQuery.type( obj ); - - if ( jQuery.isWindow( obj ) ) { - return false; - } - - if ( obj.nodeType === 1 && length ) { - return true; - } - - return type === "array" || type !== "function" && - ( length === 0 || - typeof length === "number" && length > 0 && ( length - 1 ) in obj ); -} - -// All jQuery objects should point back to these -rootjQuery = jQuery(document); -/*! - * Sizzle CSS Selector Engine v1.9.4-pre - * http://sizzlejs.com/ - * - * Copyright 2013 jQuery Foundation, Inc. and other contributors - * Released under the MIT license - * http://jquery.org/license - * - * Date: 2013-06-03 - */ -(function( window, undefined ) { - -var i, - support, - cachedruns, - Expr, - getText, - isXML, - compile, - outermostContext, - sortInput, - - // Local document vars - setDocument, - document, - docElem, - documentIsHTML, - rbuggyQSA, - rbuggyMatches, - matches, - contains, - - // Instance-specific data - expando = "sizzle" + -(new Date()), - preferredDoc = window.document, - dirruns = 0, - done = 0, - classCache = createCache(), - tokenCache = createCache(), - compilerCache = createCache(), - hasDuplicate = false, - sortOrder = function( a, b ) { - if ( a === b ) { - hasDuplicate = true; - return 0; - } - return 0; - }, - - // General-purpose constants - strundefined = typeof undefined, - MAX_NEGATIVE = 1 << 31, - - // Instance methods - hasOwn = ({}).hasOwnProperty, - arr = [], - pop = arr.pop, - push_native = arr.push, - push = arr.push, - slice = arr.slice, - // Use a stripped-down indexOf if we can't use a native one - indexOf = arr.indexOf || function( elem ) { - var i = 0, - len = this.length; - for ( ; i < len; i++ ) { - if ( this[i] === elem ) { - return i; - } - } - return -1; - }, - - booleans = "checked|selected|async|autofocus|autoplay|controls|defer|disabled|hidden|ismap|loop|multiple|open|readonly|required|scoped", - - // Regular expressions - - // Whitespace characters http://www.w3.org/TR/css3-selectors/#whitespace - whitespace = "[\\x20\\t\\r\\n\\f]", - // http://www.w3.org/TR/css3-syntax/#characters - characterEncoding = "(?:\\\\.|[\\w-]|[^\\x00-\\xa0])+", - - // Loosely modeled on CSS identifier characters - // An unquoted value should be a CSS identifier http://www.w3.org/TR/css3-selectors/#attribute-selectors - // Proper syntax: http://www.w3.org/TR/CSS21/syndata.html#value-def-identifier - identifier = characterEncoding.replace( "w", "w#" ), - - // Acceptable operators http://www.w3.org/TR/selectors/#attribute-selectors - attributes = "\\[" + whitespace + "*(" + characterEncoding + ")" + whitespace + - "*(?:([*^$|!~]?=)" + whitespace + "*(?:(['\"])((?:\\\\.|[^\\\\])*?)\\3|(" + identifier + ")|)|)" + whitespace + "*\\]", - - // Prefer arguments quoted, - // then not containing pseudos/brackets, - // then attribute selectors/non-parenthetical expressions, - // then anything else - // These preferences are here to reduce the number of selectors - // needing tokenize in the PSEUDO preFilter - pseudos = ":(" + characterEncoding + ")(?:\\(((['\"])((?:\\\\.|[^\\\\])*?)\\3|((?:\\\\.|[^\\\\()[\\]]|" + attributes.replace( 3, 8 ) + ")*)|.*)\\)|)", - - // Leading and non-escaped trailing whitespace, capturing some non-whitespace characters preceding the latter - rtrim = new RegExp( "^" + whitespace + "+|((?:^|[^\\\\])(?:\\\\.)*)" + whitespace + "+$", "g" ), - - rcomma = new RegExp( "^" + whitespace + "*," + whitespace + "*" ), - rcombinators = new RegExp( "^" + whitespace + "*([>+~]|" + whitespace + ")" + whitespace + "*" ), - - rsibling = new RegExp( whitespace + "*[+~]" ), - rattributeQuotes = new RegExp( "=" + whitespace + "*([^\\]'\"]*)" + whitespace + "*\\]", "g" ), - - rpseudo = new RegExp( pseudos ), - ridentifier = new RegExp( "^" + identifier + "$" ), - - matchExpr = { - "ID": new RegExp( "^#(" + characterEncoding + ")" ), - "CLASS": new RegExp( "^\\.(" + characterEncoding + ")" ), - "TAG": new RegExp( "^(" + characterEncoding.replace( "w", "w*" ) + ")" ), - "ATTR": new RegExp( "^" + attributes ), - "PSEUDO": new RegExp( "^" + pseudos ), - "CHILD": new RegExp( "^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\(" + whitespace + - "*(even|odd|(([+-]|)(\\d*)n|)" + whitespace + "*(?:([+-]|)" + whitespace + - "*(\\d+)|))" + whitespace + "*\\)|)", "i" ), - "bool": new RegExp( "^(?:" + booleans + ")$", "i" ), - // For use in libraries implementing .is() - // We use this for POS matching in `select` - "needsContext": new RegExp( "^" + whitespace + "*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\(" + - whitespace + "*((?:-\\d)?\\d*)" + whitespace + "*\\)|)(?=[^-]|$)", "i" ) - }, - - rnative = /^[^{]+\{\s*\[native \w/, - - // Easily-parseable/retrievable ID or TAG or CLASS selectors - rquickExpr = /^(?:#([\w-]+)|(\w+)|\.([\w-]+))$/, - - rinputs = /^(?:input|select|textarea|button)$/i, - rheader = /^h\d$/i, - - rescape = /'|\\/g, - - // CSS escapes http://www.w3.org/TR/CSS21/syndata.html#escaped-characters - runescape = new RegExp( "\\\\([\\da-f]{1,6}" + whitespace + "?|(" + whitespace + ")|.)", "ig" ), - funescape = function( _, escaped, escapedWhitespace ) { - var high = "0x" + escaped - 0x10000; - // NaN means non-codepoint - // Support: Firefox - // Workaround erroneous numeric interpretation of +"0x" - return high !== high || escapedWhitespace ? - escaped : - // BMP codepoint - high < 0 ? - String.fromCharCode( high + 0x10000 ) : - // Supplemental Plane codepoint (surrogate pair) - String.fromCharCode( high >> 10 | 0xD800, high & 0x3FF | 0xDC00 ); - }; - -// Optimize for push.apply( _, NodeList ) -try { - push.apply( - (arr = slice.call( preferredDoc.childNodes )), - preferredDoc.childNodes - ); - // Support: Android<4.0 - // Detect silently failing push.apply - arr[ preferredDoc.childNodes.length ].nodeType; -} catch ( e ) { - push = { apply: arr.length ? - - // Leverage slice if possible - function( target, els ) { - push_native.apply( target, slice.call(els) ); - } : - - // Support: IE<9 - // Otherwise append directly - function( target, els ) { - var j = target.length, - i = 0; - // Can't trust NodeList.length - while ( (target[j++] = els[i++]) ) {} - target.length = j - 1; - } - }; -} - -function Sizzle( selector, context, results, seed ) { - var match, elem, m, nodeType, - // QSA vars - i, groups, old, nid, newContext, newSelector; - - if ( ( context ? context.ownerDocument || context : preferredDoc ) !== document ) { - setDocument( context ); - } - - context = context || document; - results = results || []; - - if ( !selector || typeof selector !== "string" ) { - return results; - } - - if ( (nodeType = context.nodeType) !== 1 && nodeType !== 9 ) { - return []; - } - - if ( documentIsHTML && !seed ) { - - // Shortcuts - if ( (match = rquickExpr.exec( selector )) ) { - // Speed-up: Sizzle("#ID") - if ( (m = match[1]) ) { - if ( nodeType === 9 ) { - elem = context.getElementById( m ); - // Check parentNode to catch when Blackberry 4.6 returns - // nodes that are no longer in the document #6963 - if ( elem && elem.parentNode ) { - // Handle the case where IE, Opera, and Webkit return items - // by name instead of ID - if ( elem.id === m ) { - results.push( elem ); - return results; - } - } else { - return results; - } - } else { - // Context is not a document - if ( context.ownerDocument && (elem = context.ownerDocument.getElementById( m )) && - contains( context, elem ) && elem.id === m ) { - results.push( elem ); - return results; - } - } - - // Speed-up: Sizzle("TAG") - } else if ( match[2] ) { - push.apply( results, context.getElementsByTagName( selector ) ); - return results; - - // Speed-up: Sizzle(".CLASS") - } else if ( (m = match[3]) && support.getElementsByClassName && context.getElementsByClassName ) { - push.apply( results, context.getElementsByClassName( m ) ); - return results; - } - } - - // QSA path - if ( support.qsa && (!rbuggyQSA || !rbuggyQSA.test( selector )) ) { - nid = old = expando; - newContext = context; - newSelector = nodeType === 9 && selector; - - // qSA works strangely on Element-rooted queries - // We can work around this by specifying an extra ID on the root - // and working up from there (Thanks to Andrew Dupont for the technique) - // IE 8 doesn't work on object elements - if ( nodeType === 1 && context.nodeName.toLowerCase() !== "object" ) { - groups = tokenize( selector ); - - if ( (old = context.getAttribute("id")) ) { - nid = old.replace( rescape, "\\$&" ); - } else { - context.setAttribute( "id", nid ); - } - nid = "[id='" + nid + "'] "; - - i = groups.length; - while ( i-- ) { - groups[i] = nid + toSelector( groups[i] ); - } - newContext = rsibling.test( selector ) && context.parentNode || context; - newSelector = groups.join(","); - } - - if ( newSelector ) { - try { - push.apply( results, - newContext.querySelectorAll( newSelector ) - ); - return results; - } catch(qsaError) { - } finally { - if ( !old ) { - context.removeAttribute("id"); - } - } - } - } - } - - // All others - return select( selector.replace( rtrim, "$1" ), context, results, seed ); -} - -/** - * Create key-value caches of limited size - * @returns {Function(string, Object)} Returns the Object data after storing it on itself with - * property name the (space-suffixed) string and (if the cache is larger than Expr.cacheLength) - * deleting the oldest entry - */ -function createCache() { - var keys = []; - - function cache( key, value ) { - // Use (key + " ") to avoid collision with native prototype properties (see Issue #157) - if ( keys.push( key += " " ) > Expr.cacheLength ) { - // Only keep the most recent entries - delete cache[ keys.shift() ]; - } - return (cache[ key ] = value); - } - return cache; -} - -/** - * Mark a function for special use by Sizzle - * @param {Function} fn The function to mark - */ -function markFunction( fn ) { - fn[ expando ] = true; - return fn; -} - -/** - * Support testing using an element - * @param {Function} fn Passed the created div and expects a boolean result - */ -function assert( fn ) { - var div = document.createElement("div"); - - try { - return !!fn( div ); - } catch (e) { - return false; - } finally { - // Remove from its parent by default - if ( div.parentNode ) { - div.parentNode.removeChild( div ); - } - // release memory in IE - div = null; - } -} - -/** - * Adds the same handler for all of the specified attrs - * @param {String} attrs Pipe-separated list of attributes - * @param {Function} handler The method that will be applied - */ -function addHandle( attrs, handler ) { - var arr = attrs.split("|"), - i = attrs.length; - - while ( i-- ) { - Expr.attrHandle[ arr[i] ] = handler; - } -} - -/** - * Checks document order of two siblings - * @param {Element} a - * @param {Element} b - * @returns {Number} Returns less than 0 if a precedes b, greater than 0 if a follows b - */ -function siblingCheck( a, b ) { - var cur = b && a, - diff = cur && a.nodeType === 1 && b.nodeType === 1 && - ( ~b.sourceIndex || MAX_NEGATIVE ) - - ( ~a.sourceIndex || MAX_NEGATIVE ); - - // Use IE sourceIndex if available on both nodes - if ( diff ) { - return diff; - } - - // Check if b follows a - if ( cur ) { - while ( (cur = cur.nextSibling) ) { - if ( cur === b ) { - return -1; - } - } - } - - return a ? 1 : -1; -} - -/** - * Returns a function to use in pseudos for input types - * @param {String} type - */ -function createInputPseudo( type ) { - return function( elem ) { - var name = elem.nodeName.toLowerCase(); - return name === "input" && elem.type === type; - }; -} - -/** - * Returns a function to use in pseudos for buttons - * @param {String} type - */ -function createButtonPseudo( type ) { - return function( elem ) { - var name = elem.nodeName.toLowerCase(); - return (name === "input" || name === "button") && elem.type === type; - }; -} - -/** - * Returns a function to use in pseudos for positionals - * @param {Function} fn - */ -function createPositionalPseudo( fn ) { - return markFunction(function( argument ) { - argument = +argument; - return markFunction(function( seed, matches ) { - var j, - matchIndexes = fn( [], seed.length, argument ), - i = matchIndexes.length; - - // Match elements found at the specified indexes - while ( i-- ) { - if ( seed[ (j = matchIndexes[i]) ] ) { - seed[j] = !(matches[j] = seed[j]); - } - } - }); - }); -} - -/** - * Detect xml - * @param {Element|Object} elem An element or a document - */ -isXML = Sizzle.isXML = function( elem ) { - // documentElement is verified for cases where it doesn't yet exist - // (such as loading iframes in IE - #4833) - var documentElement = elem && (elem.ownerDocument || elem).documentElement; - return documentElement ? documentElement.nodeName !== "HTML" : false; -}; - -// Expose support vars for convenience -support = Sizzle.support = {}; - -/** - * Sets document-related variables once based on the current document - * @param {Element|Object} [doc] An element or document object to use to set the document - * @returns {Object} Returns the current document - */ -setDocument = Sizzle.setDocument = function( node ) { - var doc = node ? node.ownerDocument || node : preferredDoc, - parent = doc.defaultView; - - // If no document and documentElement is available, return - if ( doc === document || doc.nodeType !== 9 || !doc.documentElement ) { - return document; - } - - // Set our document - document = doc; - docElem = doc.documentElement; - - // Support tests - documentIsHTML = !isXML( doc ); - - // Support: IE>8 - // If iframe document is assigned to "document" variable and if iframe has been reloaded, - // IE will throw "permission denied" error when accessing "document" variable, see jQuery #13936 - // IE6-8 do not support the defaultView property so parent will be undefined - if ( parent && parent.attachEvent && parent !== parent.top ) { - parent.attachEvent( "onbeforeunload", function() { - setDocument(); - }); - } - - /* Attributes - ---------------------------------------------------------------------- */ - - // Support: IE<8 - // Verify that getAttribute really returns attributes and not properties (excepting IE8 booleans) - support.attributes = assert(function( div ) { - div.className = "i"; - return !div.getAttribute("className"); - }); - - /* getElement(s)By* - ---------------------------------------------------------------------- */ - - // Check if getElementsByTagName("*") returns only elements - support.getElementsByTagName = assert(function( div ) { - div.appendChild( doc.createComment("") ); - return !div.getElementsByTagName("*").length; - }); - - // Check if getElementsByClassName can be trusted - support.getElementsByClassName = assert(function( div ) { - div.innerHTML = "
    "; - - // Support: Safari<4 - // Catch class over-caching - div.firstChild.className = "i"; - // Support: Opera<10 - // Catch gEBCN failure to find non-leading classes - return div.getElementsByClassName("i").length === 2; - }); - - // Support: IE<10 - // Check if getElementById returns elements by name - // The broken getElementById methods don't pick up programatically-set names, - // so use a roundabout getElementsByName test - support.getById = assert(function( div ) { - docElem.appendChild( div ).id = expando; - return !doc.getElementsByName || !doc.getElementsByName( expando ).length; - }); - - // ID find and filter - if ( support.getById ) { - Expr.find["ID"] = function( id, context ) { - if ( typeof context.getElementById !== strundefined && documentIsHTML ) { - var m = context.getElementById( id ); - // Check parentNode to catch when Blackberry 4.6 returns - // nodes that are no longer in the document #6963 - return m && m.parentNode ? [m] : []; - } - }; - Expr.filter["ID"] = function( id ) { - var attrId = id.replace( runescape, funescape ); - return function( elem ) { - return elem.getAttribute("id") === attrId; - }; - }; - } else { - // Support: IE6/7 - // getElementById is not reliable as a find shortcut - delete Expr.find["ID"]; - - Expr.filter["ID"] = function( id ) { - var attrId = id.replace( runescape, funescape ); - return function( elem ) { - var node = typeof elem.getAttributeNode !== strundefined && elem.getAttributeNode("id"); - return node && node.value === attrId; - }; - }; - } - - // Tag - Expr.find["TAG"] = support.getElementsByTagName ? - function( tag, context ) { - if ( typeof context.getElementsByTagName !== strundefined ) { - return context.getElementsByTagName( tag ); - } - } : - function( tag, context ) { - var elem, - tmp = [], - i = 0, - results = context.getElementsByTagName( tag ); - - // Filter out possible comments - if ( tag === "*" ) { - while ( (elem = results[i++]) ) { - if ( elem.nodeType === 1 ) { - tmp.push( elem ); - } - } - - return tmp; - } - return results; - }; - - // Class - Expr.find["CLASS"] = support.getElementsByClassName && function( className, context ) { - if ( typeof context.getElementsByClassName !== strundefined && documentIsHTML ) { - return context.getElementsByClassName( className ); - } - }; - - /* QSA/matchesSelector - ---------------------------------------------------------------------- */ - - // QSA and matchesSelector support - - // matchesSelector(:active) reports false when true (IE9/Opera 11.5) - rbuggyMatches = []; - - // qSa(:focus) reports false when true (Chrome 21) - // We allow this because of a bug in IE8/9 that throws an error - // whenever `document.activeElement` is accessed on an iframe - // So, we allow :focus to pass through QSA all the time to avoid the IE error - // See http://bugs.jquery.com/ticket/13378 - rbuggyQSA = []; - - if ( (support.qsa = rnative.test( doc.querySelectorAll )) ) { - // Build QSA regex - // Regex strategy adopted from Diego Perini - assert(function( div ) { - // Select is set to empty string on purpose - // This is to test IE's treatment of not explicitly - // setting a boolean content attribute, - // since its presence should be enough - // http://bugs.jquery.com/ticket/12359 - div.innerHTML = ""; - - // Support: IE8 - // Boolean attributes and "value" are not treated correctly - if ( !div.querySelectorAll("[selected]").length ) { - rbuggyQSA.push( "\\[" + whitespace + "*(?:value|" + booleans + ")" ); - } - - // Webkit/Opera - :checked should return selected option elements - // http://www.w3.org/TR/2011/REC-css3-selectors-20110929/#checked - // IE8 throws error here and will not see later tests - if ( !div.querySelectorAll(":checked").length ) { - rbuggyQSA.push(":checked"); - } - }); - - assert(function( div ) { - - // Support: Opera 10-12/IE8 - // ^= $= *= and empty values - // Should not select anything - // Support: Windows 8 Native Apps - // The type attribute is restricted during .innerHTML assignment - var input = doc.createElement("input"); - input.setAttribute( "type", "hidden" ); - div.appendChild( input ).setAttribute( "t", "" ); - - if ( div.querySelectorAll("[t^='']").length ) { - rbuggyQSA.push( "[*^$]=" + whitespace + "*(?:''|\"\")" ); - } - - // FF 3.5 - :enabled/:disabled and hidden elements (hidden elements are still enabled) - // IE8 throws error here and will not see later tests - if ( !div.querySelectorAll(":enabled").length ) { - rbuggyQSA.push( ":enabled", ":disabled" ); - } - - // Opera 10-11 does not throw on post-comma invalid pseudos - div.querySelectorAll("*,:x"); - rbuggyQSA.push(",.*:"); - }); - } - - if ( (support.matchesSelector = rnative.test( (matches = docElem.webkitMatchesSelector || - docElem.mozMatchesSelector || - docElem.oMatchesSelector || - docElem.msMatchesSelector) )) ) { - - assert(function( div ) { - // Check to see if it's possible to do matchesSelector - // on a disconnected node (IE 9) - support.disconnectedMatch = matches.call( div, "div" ); - - // This should fail with an exception - // Gecko does not error, returns false instead - matches.call( div, "[s!='']:x" ); - rbuggyMatches.push( "!=", pseudos ); - }); - } - - rbuggyQSA = rbuggyQSA.length && new RegExp( rbuggyQSA.join("|") ); - rbuggyMatches = rbuggyMatches.length && new RegExp( rbuggyMatches.join("|") ); - - /* Contains - ---------------------------------------------------------------------- */ - - // Element contains another - // Purposefully does not implement inclusive descendent - // As in, an element does not contain itself - contains = rnative.test( docElem.contains ) || docElem.compareDocumentPosition ? - function( a, b ) { - var adown = a.nodeType === 9 ? a.documentElement : a, - bup = b && b.parentNode; - return a === bup || !!( bup && bup.nodeType === 1 && ( - adown.contains ? - adown.contains( bup ) : - a.compareDocumentPosition && a.compareDocumentPosition( bup ) & 16 - )); - } : - function( a, b ) { - if ( b ) { - while ( (b = b.parentNode) ) { - if ( b === a ) { - return true; - } - } - } - return false; - }; - - /* Sorting - ---------------------------------------------------------------------- */ - - // Document order sorting - sortOrder = docElem.compareDocumentPosition ? - function( a, b ) { - - // Flag for duplicate removal - if ( a === b ) { - hasDuplicate = true; - return 0; - } - - var compare = b.compareDocumentPosition && a.compareDocumentPosition && a.compareDocumentPosition( b ); - - if ( compare ) { - // Disconnected nodes - if ( compare & 1 || - (!support.sortDetached && b.compareDocumentPosition( a ) === compare) ) { - - // Choose the first element that is related to our preferred document - if ( a === doc || contains(preferredDoc, a) ) { - return -1; - } - if ( b === doc || contains(preferredDoc, b) ) { - return 1; - } - - // Maintain original order - return sortInput ? - ( indexOf.call( sortInput, a ) - indexOf.call( sortInput, b ) ) : - 0; - } - - return compare & 4 ? -1 : 1; - } - - // Not directly comparable, sort on existence of method - return a.compareDocumentPosition ? -1 : 1; - } : - function( a, b ) { - var cur, - i = 0, - aup = a.parentNode, - bup = b.parentNode, - ap = [ a ], - bp = [ b ]; - - // Exit early if the nodes are identical - if ( a === b ) { - hasDuplicate = true; - return 0; - - // Parentless nodes are either documents or disconnected - } else if ( !aup || !bup ) { - return a === doc ? -1 : - b === doc ? 1 : - aup ? -1 : - bup ? 1 : - sortInput ? - ( indexOf.call( sortInput, a ) - indexOf.call( sortInput, b ) ) : - 0; - - // If the nodes are siblings, we can do a quick check - } else if ( aup === bup ) { - return siblingCheck( a, b ); - } - - // Otherwise we need full lists of their ancestors for comparison - cur = a; - while ( (cur = cur.parentNode) ) { - ap.unshift( cur ); - } - cur = b; - while ( (cur = cur.parentNode) ) { - bp.unshift( cur ); - } - - // Walk down the tree looking for a discrepancy - while ( ap[i] === bp[i] ) { - i++; - } - - return i ? - // Do a sibling check if the nodes have a common ancestor - siblingCheck( ap[i], bp[i] ) : - - // Otherwise nodes in our document sort first - ap[i] === preferredDoc ? -1 : - bp[i] === preferredDoc ? 1 : - 0; - }; - - return doc; -}; - -Sizzle.matches = function( expr, elements ) { - return Sizzle( expr, null, null, elements ); -}; - -Sizzle.matchesSelector = function( elem, expr ) { - // Set document vars if needed - if ( ( elem.ownerDocument || elem ) !== document ) { - setDocument( elem ); - } - - // Make sure that attribute selectors are quoted - expr = expr.replace( rattributeQuotes, "='$1']" ); - - if ( support.matchesSelector && documentIsHTML && - ( !rbuggyMatches || !rbuggyMatches.test( expr ) ) && - ( !rbuggyQSA || !rbuggyQSA.test( expr ) ) ) { - - try { - var ret = matches.call( elem, expr ); - - // IE 9's matchesSelector returns false on disconnected nodes - if ( ret || support.disconnectedMatch || - // As well, disconnected nodes are said to be in a document - // fragment in IE 9 - elem.document && elem.document.nodeType !== 11 ) { - return ret; - } - } catch(e) {} - } - - return Sizzle( expr, document, null, [elem] ).length > 0; -}; - -Sizzle.contains = function( context, elem ) { - // Set document vars if needed - if ( ( context.ownerDocument || context ) !== document ) { - setDocument( context ); - } - return contains( context, elem ); -}; - -Sizzle.attr = function( elem, name ) { - // Set document vars if needed - if ( ( elem.ownerDocument || elem ) !== document ) { - setDocument( elem ); - } - - var fn = Expr.attrHandle[ name.toLowerCase() ], - // Don't get fooled by Object.prototype properties (jQuery #13807) - val = fn && hasOwn.call( Expr.attrHandle, name.toLowerCase() ) ? - fn( elem, name, !documentIsHTML ) : - undefined; - - return val === undefined ? - support.attributes || !documentIsHTML ? - elem.getAttribute( name ) : - (val = elem.getAttributeNode(name)) && val.specified ? - val.value : - null : - val; -}; - -Sizzle.error = function( msg ) { - throw new Error( "Syntax error, unrecognized expression: " + msg ); -}; - -/** - * Document sorting and removing duplicates - * @param {ArrayLike} results - */ -Sizzle.uniqueSort = function( results ) { - var elem, - duplicates = [], - j = 0, - i = 0; - - // Unless we *know* we can detect duplicates, assume their presence - hasDuplicate = !support.detectDuplicates; - sortInput = !support.sortStable && results.slice( 0 ); - results.sort( sortOrder ); - - if ( hasDuplicate ) { - while ( (elem = results[i++]) ) { - if ( elem === results[ i ] ) { - j = duplicates.push( i ); - } - } - while ( j-- ) { - results.splice( duplicates[ j ], 1 ); - } - } - - return results; -}; - -/** - * Utility function for retrieving the text value of an array of DOM nodes - * @param {Array|Element} elem - */ -getText = Sizzle.getText = function( elem ) { - var node, - ret = "", - i = 0, - nodeType = elem.nodeType; - - if ( !nodeType ) { - // If no nodeType, this is expected to be an array - for ( ; (node = elem[i]); i++ ) { - // Do not traverse comment nodes - ret += getText( node ); - } - } else if ( nodeType === 1 || nodeType === 9 || nodeType === 11 ) { - // Use textContent for elements - // innerText usage removed for consistency of new lines (see #11153) - if ( typeof elem.textContent === "string" ) { - return elem.textContent; - } else { - // Traverse its children - for ( elem = elem.firstChild; elem; elem = elem.nextSibling ) { - ret += getText( elem ); - } - } - } else if ( nodeType === 3 || nodeType === 4 ) { - return elem.nodeValue; - } - // Do not include comment or processing instruction nodes - - return ret; -}; - -Expr = Sizzle.selectors = { - - // Can be adjusted by the user - cacheLength: 50, - - createPseudo: markFunction, - - match: matchExpr, - - attrHandle: {}, - - find: {}, - - relative: { - ">": { dir: "parentNode", first: true }, - " ": { dir: "parentNode" }, - "+": { dir: "previousSibling", first: true }, - "~": { dir: "previousSibling" } - }, - - preFilter: { - "ATTR": function( match ) { - match[1] = match[1].replace( runescape, funescape ); - - // Move the given value to match[3] whether quoted or unquoted - match[3] = ( match[4] || match[5] || "" ).replace( runescape, funescape ); - - if ( match[2] === "~=" ) { - match[3] = " " + match[3] + " "; - } - - return match.slice( 0, 4 ); - }, - - "CHILD": function( match ) { - /* matches from matchExpr["CHILD"] - 1 type (only|nth|...) - 2 what (child|of-type) - 3 argument (even|odd|\d*|\d*n([+-]\d+)?|...) - 4 xn-component of xn+y argument ([+-]?\d*n|) - 5 sign of xn-component - 6 x of xn-component - 7 sign of y-component - 8 y of y-component - */ - match[1] = match[1].toLowerCase(); - - if ( match[1].slice( 0, 3 ) === "nth" ) { - // nth-* requires argument - if ( !match[3] ) { - Sizzle.error( match[0] ); - } - - // numeric x and y parameters for Expr.filter.CHILD - // remember that false/true cast respectively to 0/1 - match[4] = +( match[4] ? match[5] + (match[6] || 1) : 2 * ( match[3] === "even" || match[3] === "odd" ) ); - match[5] = +( ( match[7] + match[8] ) || match[3] === "odd" ); - - // other types prohibit arguments - } else if ( match[3] ) { - Sizzle.error( match[0] ); - } - - return match; - }, - - "PSEUDO": function( match ) { - var excess, - unquoted = !match[5] && match[2]; - - if ( matchExpr["CHILD"].test( match[0] ) ) { - return null; - } - - // Accept quoted arguments as-is - if ( match[3] && match[4] !== undefined ) { - match[2] = match[4]; - - // Strip excess characters from unquoted arguments - } else if ( unquoted && rpseudo.test( unquoted ) && - // Get excess from tokenize (recursively) - (excess = tokenize( unquoted, true )) && - // advance to the next closing parenthesis - (excess = unquoted.indexOf( ")", unquoted.length - excess ) - unquoted.length) ) { - - // excess is a negative index - match[0] = match[0].slice( 0, excess ); - match[2] = unquoted.slice( 0, excess ); - } - - // Return only captures needed by the pseudo filter method (type and argument) - return match.slice( 0, 3 ); - } - }, - - filter: { - - "TAG": function( nodeNameSelector ) { - var nodeName = nodeNameSelector.replace( runescape, funescape ).toLowerCase(); - return nodeNameSelector === "*" ? - function() { return true; } : - function( elem ) { - return elem.nodeName && elem.nodeName.toLowerCase() === nodeName; - }; - }, - - "CLASS": function( className ) { - var pattern = classCache[ className + " " ]; - - return pattern || - (pattern = new RegExp( "(^|" + whitespace + ")" + className + "(" + whitespace + "|$)" )) && - classCache( className, function( elem ) { - return pattern.test( typeof elem.className === "string" && elem.className || typeof elem.getAttribute !== strundefined && elem.getAttribute("class") || "" ); - }); - }, - - "ATTR": function( name, operator, check ) { - return function( elem ) { - var result = Sizzle.attr( elem, name ); - - if ( result == null ) { - return operator === "!="; - } - if ( !operator ) { - return true; - } - - result += ""; - - return operator === "=" ? result === check : - operator === "!=" ? result !== check : - operator === "^=" ? check && result.indexOf( check ) === 0 : - operator === "*=" ? check && result.indexOf( check ) > -1 : - operator === "$=" ? check && result.slice( -check.length ) === check : - operator === "~=" ? ( " " + result + " " ).indexOf( check ) > -1 : - operator === "|=" ? result === check || result.slice( 0, check.length + 1 ) === check + "-" : - false; - }; - }, - - "CHILD": function( type, what, argument, first, last ) { - var simple = type.slice( 0, 3 ) !== "nth", - forward = type.slice( -4 ) !== "last", - ofType = what === "of-type"; - - return first === 1 && last === 0 ? - - // Shortcut for :nth-*(n) - function( elem ) { - return !!elem.parentNode; - } : - - function( elem, context, xml ) { - var cache, outerCache, node, diff, nodeIndex, start, - dir = simple !== forward ? "nextSibling" : "previousSibling", - parent = elem.parentNode, - name = ofType && elem.nodeName.toLowerCase(), - useCache = !xml && !ofType; - - if ( parent ) { - - // :(first|last|only)-(child|of-type) - if ( simple ) { - while ( dir ) { - node = elem; - while ( (node = node[ dir ]) ) { - if ( ofType ? node.nodeName.toLowerCase() === name : node.nodeType === 1 ) { - return false; - } - } - // Reverse direction for :only-* (if we haven't yet done so) - start = dir = type === "only" && !start && "nextSibling"; - } - return true; - } - - start = [ forward ? parent.firstChild : parent.lastChild ]; - - // non-xml :nth-child(...) stores cache data on `parent` - if ( forward && useCache ) { - // Seek `elem` from a previously-cached index - outerCache = parent[ expando ] || (parent[ expando ] = {}); - cache = outerCache[ type ] || []; - nodeIndex = cache[0] === dirruns && cache[1]; - diff = cache[0] === dirruns && cache[2]; - node = nodeIndex && parent.childNodes[ nodeIndex ]; - - while ( (node = ++nodeIndex && node && node[ dir ] || - - // Fallback to seeking `elem` from the start - (diff = nodeIndex = 0) || start.pop()) ) { - - // When found, cache indexes on `parent` and break - if ( node.nodeType === 1 && ++diff && node === elem ) { - outerCache[ type ] = [ dirruns, nodeIndex, diff ]; - break; - } - } - - // Use previously-cached element index if available - } else if ( useCache && (cache = (elem[ expando ] || (elem[ expando ] = {}))[ type ]) && cache[0] === dirruns ) { - diff = cache[1]; - - // xml :nth-child(...) or :nth-last-child(...) or :nth(-last)?-of-type(...) - } else { - // Use the same loop as above to seek `elem` from the start - while ( (node = ++nodeIndex && node && node[ dir ] || - (diff = nodeIndex = 0) || start.pop()) ) { - - if ( ( ofType ? node.nodeName.toLowerCase() === name : node.nodeType === 1 ) && ++diff ) { - // Cache the index of each encountered element - if ( useCache ) { - (node[ expando ] || (node[ expando ] = {}))[ type ] = [ dirruns, diff ]; - } - - if ( node === elem ) { - break; - } - } - } - } - - // Incorporate the offset, then check against cycle size - diff -= last; - return diff === first || ( diff % first === 0 && diff / first >= 0 ); - } - }; - }, - - "PSEUDO": function( pseudo, argument ) { - // pseudo-class names are case-insensitive - // http://www.w3.org/TR/selectors/#pseudo-classes - // Prioritize by case sensitivity in case custom pseudos are added with uppercase letters - // Remember that setFilters inherits from pseudos - var args, - fn = Expr.pseudos[ pseudo ] || Expr.setFilters[ pseudo.toLowerCase() ] || - Sizzle.error( "unsupported pseudo: " + pseudo ); - - // The user may use createPseudo to indicate that - // arguments are needed to create the filter function - // just as Sizzle does - if ( fn[ expando ] ) { - return fn( argument ); - } - - // But maintain support for old signatures - if ( fn.length > 1 ) { - args = [ pseudo, pseudo, "", argument ]; - return Expr.setFilters.hasOwnProperty( pseudo.toLowerCase() ) ? - markFunction(function( seed, matches ) { - var idx, - matched = fn( seed, argument ), - i = matched.length; - while ( i-- ) { - idx = indexOf.call( seed, matched[i] ); - seed[ idx ] = !( matches[ idx ] = matched[i] ); - } - }) : - function( elem ) { - return fn( elem, 0, args ); - }; - } - - return fn; - } - }, - - pseudos: { - // Potentially complex pseudos - "not": markFunction(function( selector ) { - // Trim the selector passed to compile - // to avoid treating leading and trailing - // spaces as combinators - var input = [], - results = [], - matcher = compile( selector.replace( rtrim, "$1" ) ); - - return matcher[ expando ] ? - markFunction(function( seed, matches, context, xml ) { - var elem, - unmatched = matcher( seed, null, xml, [] ), - i = seed.length; - - // Match elements unmatched by `matcher` - while ( i-- ) { - if ( (elem = unmatched[i]) ) { - seed[i] = !(matches[i] = elem); - } - } - }) : - function( elem, context, xml ) { - input[0] = elem; - matcher( input, null, xml, results ); - return !results.pop(); - }; - }), - - "has": markFunction(function( selector ) { - return function( elem ) { - return Sizzle( selector, elem ).length > 0; - }; - }), - - "contains": markFunction(function( text ) { - return function( elem ) { - return ( elem.textContent || elem.innerText || getText( elem ) ).indexOf( text ) > -1; - }; - }), - - // "Whether an element is represented by a :lang() selector - // is based solely on the element's language value - // being equal to the identifier C, - // or beginning with the identifier C immediately followed by "-". - // The matching of C against the element's language value is performed case-insensitively. - // The identifier C does not have to be a valid language name." - // http://www.w3.org/TR/selectors/#lang-pseudo - "lang": markFunction( function( lang ) { - // lang value must be a valid identifier - if ( !ridentifier.test(lang || "") ) { - Sizzle.error( "unsupported lang: " + lang ); - } - lang = lang.replace( runescape, funescape ).toLowerCase(); - return function( elem ) { - var elemLang; - do { - if ( (elemLang = documentIsHTML ? - elem.lang : - elem.getAttribute("xml:lang") || elem.getAttribute("lang")) ) { - - elemLang = elemLang.toLowerCase(); - return elemLang === lang || elemLang.indexOf( lang + "-" ) === 0; - } - } while ( (elem = elem.parentNode) && elem.nodeType === 1 ); - return false; - }; - }), - - // Miscellaneous - "target": function( elem ) { - var hash = window.location && window.location.hash; - return hash && hash.slice( 1 ) === elem.id; - }, - - "root": function( elem ) { - return elem === docElem; - }, - - "focus": function( elem ) { - return elem === document.activeElement && (!document.hasFocus || document.hasFocus()) && !!(elem.type || elem.href || ~elem.tabIndex); - }, - - // Boolean properties - "enabled": function( elem ) { - return elem.disabled === false; - }, - - "disabled": function( elem ) { - return elem.disabled === true; - }, - - "checked": function( elem ) { - // In CSS3, :checked should return both checked and selected elements - // http://www.w3.org/TR/2011/REC-css3-selectors-20110929/#checked - var nodeName = elem.nodeName.toLowerCase(); - return (nodeName === "input" && !!elem.checked) || (nodeName === "option" && !!elem.selected); - }, - - "selected": function( elem ) { - // Accessing this property makes selected-by-default - // options in Safari work properly - if ( elem.parentNode ) { - elem.parentNode.selectedIndex; - } - - return elem.selected === true; - }, - - // Contents - "empty": function( elem ) { - // http://www.w3.org/TR/selectors/#empty-pseudo - // :empty is only affected by element nodes and content nodes(including text(3), cdata(4)), - // not comment, processing instructions, or others - // Thanks to Diego Perini for the nodeName shortcut - // Greater than "@" means alpha characters (specifically not starting with "#" or "?") - for ( elem = elem.firstChild; elem; elem = elem.nextSibling ) { - if ( elem.nodeName > "@" || elem.nodeType === 3 || elem.nodeType === 4 ) { - return false; - } - } - return true; - }, - - "parent": function( elem ) { - return !Expr.pseudos["empty"]( elem ); - }, - - // Element/input types - "header": function( elem ) { - return rheader.test( elem.nodeName ); - }, - - "input": function( elem ) { - return rinputs.test( elem.nodeName ); - }, - - "button": function( elem ) { - var name = elem.nodeName.toLowerCase(); - return name === "input" && elem.type === "button" || name === "button"; - }, - - "text": function( elem ) { - var attr; - // IE6 and 7 will map elem.type to 'text' for new HTML5 types (search, etc) - // use getAttribute instead to test this case - return elem.nodeName.toLowerCase() === "input" && - elem.type === "text" && - ( (attr = elem.getAttribute("type")) == null || attr.toLowerCase() === elem.type ); - }, - - // Position-in-collection - "first": createPositionalPseudo(function() { - return [ 0 ]; - }), - - "last": createPositionalPseudo(function( matchIndexes, length ) { - return [ length - 1 ]; - }), - - "eq": createPositionalPseudo(function( matchIndexes, length, argument ) { - return [ argument < 0 ? argument + length : argument ]; - }), - - "even": createPositionalPseudo(function( matchIndexes, length ) { - var i = 0; - for ( ; i < length; i += 2 ) { - matchIndexes.push( i ); - } - return matchIndexes; - }), - - "odd": createPositionalPseudo(function( matchIndexes, length ) { - var i = 1; - for ( ; i < length; i += 2 ) { - matchIndexes.push( i ); - } - return matchIndexes; - }), - - "lt": createPositionalPseudo(function( matchIndexes, length, argument ) { - var i = argument < 0 ? argument + length : argument; - for ( ; --i >= 0; ) { - matchIndexes.push( i ); - } - return matchIndexes; - }), - - "gt": createPositionalPseudo(function( matchIndexes, length, argument ) { - var i = argument < 0 ? argument + length : argument; - for ( ; ++i < length; ) { - matchIndexes.push( i ); - } - return matchIndexes; - }) - } -}; - -Expr.pseudos["nth"] = Expr.pseudos["eq"]; - -// Add button/input type pseudos -for ( i in { radio: true, checkbox: true, file: true, password: true, image: true } ) { - Expr.pseudos[ i ] = createInputPseudo( i ); -} -for ( i in { submit: true, reset: true } ) { - Expr.pseudos[ i ] = createButtonPseudo( i ); -} - -// Easy API for creating new setFilters -function setFilters() {} -setFilters.prototype = Expr.filters = Expr.pseudos; -Expr.setFilters = new setFilters(); - -function tokenize( selector, parseOnly ) { - var matched, match, tokens, type, - soFar, groups, preFilters, - cached = tokenCache[ selector + " " ]; - - if ( cached ) { - return parseOnly ? 0 : cached.slice( 0 ); - } - - soFar = selector; - groups = []; - preFilters = Expr.preFilter; - - while ( soFar ) { - - // Comma and first run - if ( !matched || (match = rcomma.exec( soFar )) ) { - if ( match ) { - // Don't consume trailing commas as valid - soFar = soFar.slice( match[0].length ) || soFar; - } - groups.push( tokens = [] ); - } - - matched = false; - - // Combinators - if ( (match = rcombinators.exec( soFar )) ) { - matched = match.shift(); - tokens.push({ - value: matched, - // Cast descendant combinators to space - type: match[0].replace( rtrim, " " ) - }); - soFar = soFar.slice( matched.length ); - } - - // Filters - for ( type in Expr.filter ) { - if ( (match = matchExpr[ type ].exec( soFar )) && (!preFilters[ type ] || - (match = preFilters[ type ]( match ))) ) { - matched = match.shift(); - tokens.push({ - value: matched, - type: type, - matches: match - }); - soFar = soFar.slice( matched.length ); - } - } - - if ( !matched ) { - break; - } - } - - // Return the length of the invalid excess - // if we're just parsing - // Otherwise, throw an error or return tokens - return parseOnly ? - soFar.length : - soFar ? - Sizzle.error( selector ) : - // Cache the tokens - tokenCache( selector, groups ).slice( 0 ); -} - -function toSelector( tokens ) { - var i = 0, - len = tokens.length, - selector = ""; - for ( ; i < len; i++ ) { - selector += tokens[i].value; - } - return selector; -} - -function addCombinator( matcher, combinator, base ) { - var dir = combinator.dir, - checkNonElements = base && dir === "parentNode", - doneName = done++; - - return combinator.first ? - // Check against closest ancestor/preceding element - function( elem, context, xml ) { - while ( (elem = elem[ dir ]) ) { - if ( elem.nodeType === 1 || checkNonElements ) { - return matcher( elem, context, xml ); - } - } - } : - - // Check against all ancestor/preceding elements - function( elem, context, xml ) { - var data, cache, outerCache, - dirkey = dirruns + " " + doneName; - - // We can't set arbitrary data on XML nodes, so they don't benefit from dir caching - if ( xml ) { - while ( (elem = elem[ dir ]) ) { - if ( elem.nodeType === 1 || checkNonElements ) { - if ( matcher( elem, context, xml ) ) { - return true; - } - } - } - } else { - while ( (elem = elem[ dir ]) ) { - if ( elem.nodeType === 1 || checkNonElements ) { - outerCache = elem[ expando ] || (elem[ expando ] = {}); - if ( (cache = outerCache[ dir ]) && cache[0] === dirkey ) { - if ( (data = cache[1]) === true || data === cachedruns ) { - return data === true; - } - } else { - cache = outerCache[ dir ] = [ dirkey ]; - cache[1] = matcher( elem, context, xml ) || cachedruns; - if ( cache[1] === true ) { - return true; - } - } - } - } - } - }; -} - -function elementMatcher( matchers ) { - return matchers.length > 1 ? - function( elem, context, xml ) { - var i = matchers.length; - while ( i-- ) { - if ( !matchers[i]( elem, context, xml ) ) { - return false; - } - } - return true; - } : - matchers[0]; -} - -function condense( unmatched, map, filter, context, xml ) { - var elem, - newUnmatched = [], - i = 0, - len = unmatched.length, - mapped = map != null; - - for ( ; i < len; i++ ) { - if ( (elem = unmatched[i]) ) { - if ( !filter || filter( elem, context, xml ) ) { - newUnmatched.push( elem ); - if ( mapped ) { - map.push( i ); - } - } - } - } - - return newUnmatched; -} - -function setMatcher( preFilter, selector, matcher, postFilter, postFinder, postSelector ) { - if ( postFilter && !postFilter[ expando ] ) { - postFilter = setMatcher( postFilter ); - } - if ( postFinder && !postFinder[ expando ] ) { - postFinder = setMatcher( postFinder, postSelector ); - } - return markFunction(function( seed, results, context, xml ) { - var temp, i, elem, - preMap = [], - postMap = [], - preexisting = results.length, - - // Get initial elements from seed or context - elems = seed || multipleContexts( selector || "*", context.nodeType ? [ context ] : context, [] ), - - // Prefilter to get matcher input, preserving a map for seed-results synchronization - matcherIn = preFilter && ( seed || !selector ) ? - condense( elems, preMap, preFilter, context, xml ) : - elems, - - matcherOut = matcher ? - // If we have a postFinder, or filtered seed, or non-seed postFilter or preexisting results, - postFinder || ( seed ? preFilter : preexisting || postFilter ) ? - - // ...intermediate processing is necessary - [] : - - // ...otherwise use results directly - results : - matcherIn; - - // Find primary matches - if ( matcher ) { - matcher( matcherIn, matcherOut, context, xml ); - } - - // Apply postFilter - if ( postFilter ) { - temp = condense( matcherOut, postMap ); - postFilter( temp, [], context, xml ); - - // Un-match failing elements by moving them back to matcherIn - i = temp.length; - while ( i-- ) { - if ( (elem = temp[i]) ) { - matcherOut[ postMap[i] ] = !(matcherIn[ postMap[i] ] = elem); - } - } - } - - if ( seed ) { - if ( postFinder || preFilter ) { - if ( postFinder ) { - // Get the final matcherOut by condensing this intermediate into postFinder contexts - temp = []; - i = matcherOut.length; - while ( i-- ) { - if ( (elem = matcherOut[i]) ) { - // Restore matcherIn since elem is not yet a final match - temp.push( (matcherIn[i] = elem) ); - } - } - postFinder( null, (matcherOut = []), temp, xml ); - } - - // Move matched elements from seed to results to keep them synchronized - i = matcherOut.length; - while ( i-- ) { - if ( (elem = matcherOut[i]) && - (temp = postFinder ? indexOf.call( seed, elem ) : preMap[i]) > -1 ) { - - seed[temp] = !(results[temp] = elem); - } - } - } - - // Add elements to results, through postFinder if defined - } else { - matcherOut = condense( - matcherOut === results ? - matcherOut.splice( preexisting, matcherOut.length ) : - matcherOut - ); - if ( postFinder ) { - postFinder( null, results, matcherOut, xml ); - } else { - push.apply( results, matcherOut ); - } - } - }); -} - -function matcherFromTokens( tokens ) { - var checkContext, matcher, j, - len = tokens.length, - leadingRelative = Expr.relative[ tokens[0].type ], - implicitRelative = leadingRelative || Expr.relative[" "], - i = leadingRelative ? 1 : 0, - - // The foundational matcher ensures that elements are reachable from top-level context(s) - matchContext = addCombinator( function( elem ) { - return elem === checkContext; - }, implicitRelative, true ), - matchAnyContext = addCombinator( function( elem ) { - return indexOf.call( checkContext, elem ) > -1; - }, implicitRelative, true ), - matchers = [ function( elem, context, xml ) { - return ( !leadingRelative && ( xml || context !== outermostContext ) ) || ( - (checkContext = context).nodeType ? - matchContext( elem, context, xml ) : - matchAnyContext( elem, context, xml ) ); - } ]; - - for ( ; i < len; i++ ) { - if ( (matcher = Expr.relative[ tokens[i].type ]) ) { - matchers = [ addCombinator(elementMatcher( matchers ), matcher) ]; - } else { - matcher = Expr.filter[ tokens[i].type ].apply( null, tokens[i].matches ); - - // Return special upon seeing a positional matcher - if ( matcher[ expando ] ) { - // Find the next relative operator (if any) for proper handling - j = ++i; - for ( ; j < len; j++ ) { - if ( Expr.relative[ tokens[j].type ] ) { - break; - } - } - return setMatcher( - i > 1 && elementMatcher( matchers ), - i > 1 && toSelector( - // If the preceding token was a descendant combinator, insert an implicit any-element `*` - tokens.slice( 0, i - 1 ).concat({ value: tokens[ i - 2 ].type === " " ? "*" : "" }) - ).replace( rtrim, "$1" ), - matcher, - i < j && matcherFromTokens( tokens.slice( i, j ) ), - j < len && matcherFromTokens( (tokens = tokens.slice( j )) ), - j < len && toSelector( tokens ) - ); - } - matchers.push( matcher ); - } - } - - return elementMatcher( matchers ); -} - -function matcherFromGroupMatchers( elementMatchers, setMatchers ) { - // A counter to specify which element is currently being matched - var matcherCachedRuns = 0, - bySet = setMatchers.length > 0, - byElement = elementMatchers.length > 0, - superMatcher = function( seed, context, xml, results, expandContext ) { - var elem, j, matcher, - setMatched = [], - matchedCount = 0, - i = "0", - unmatched = seed && [], - outermost = expandContext != null, - contextBackup = outermostContext, - // We must always have either seed elements or context - elems = seed || byElement && Expr.find["TAG"]( "*", expandContext && context.parentNode || context ), - // Use integer dirruns iff this is the outermost matcher - dirrunsUnique = (dirruns += contextBackup == null ? 1 : Math.random() || 0.1); - - if ( outermost ) { - outermostContext = context !== document && context; - cachedruns = matcherCachedRuns; - } - - // Add elements passing elementMatchers directly to results - // Keep `i` a string if there are no elements so `matchedCount` will be "00" below - for ( ; (elem = elems[i]) != null; i++ ) { - if ( byElement && elem ) { - j = 0; - while ( (matcher = elementMatchers[j++]) ) { - if ( matcher( elem, context, xml ) ) { - results.push( elem ); - break; - } - } - if ( outermost ) { - dirruns = dirrunsUnique; - cachedruns = ++matcherCachedRuns; - } - } - - // Track unmatched elements for set filters - if ( bySet ) { - // They will have gone through all possible matchers - if ( (elem = !matcher && elem) ) { - matchedCount--; - } - - // Lengthen the array for every element, matched or not - if ( seed ) { - unmatched.push( elem ); - } - } - } - - // Apply set filters to unmatched elements - matchedCount += i; - if ( bySet && i !== matchedCount ) { - j = 0; - while ( (matcher = setMatchers[j++]) ) { - matcher( unmatched, setMatched, context, xml ); - } - - if ( seed ) { - // Reintegrate element matches to eliminate the need for sorting - if ( matchedCount > 0 ) { - while ( i-- ) { - if ( !(unmatched[i] || setMatched[i]) ) { - setMatched[i] = pop.call( results ); - } - } - } - - // Discard index placeholder values to get only actual matches - setMatched = condense( setMatched ); - } - - // Add matches to results - push.apply( results, setMatched ); - - // Seedless set matches succeeding multiple successful matchers stipulate sorting - if ( outermost && !seed && setMatched.length > 0 && - ( matchedCount + setMatchers.length ) > 1 ) { - - Sizzle.uniqueSort( results ); - } - } - - // Override manipulation of globals by nested matchers - if ( outermost ) { - dirruns = dirrunsUnique; - outermostContext = contextBackup; - } - - return unmatched; - }; - - return bySet ? - markFunction( superMatcher ) : - superMatcher; -} - -compile = Sizzle.compile = function( selector, group /* Internal Use Only */ ) { - var i, - setMatchers = [], - elementMatchers = [], - cached = compilerCache[ selector + " " ]; - - if ( !cached ) { - // Generate a function of recursive functions that can be used to check each element - if ( !group ) { - group = tokenize( selector ); - } - i = group.length; - while ( i-- ) { - cached = matcherFromTokens( group[i] ); - if ( cached[ expando ] ) { - setMatchers.push( cached ); - } else { - elementMatchers.push( cached ); - } - } - - // Cache the compiled function - cached = compilerCache( selector, matcherFromGroupMatchers( elementMatchers, setMatchers ) ); - } - return cached; -}; - -function multipleContexts( selector, contexts, results ) { - var i = 0, - len = contexts.length; - for ( ; i < len; i++ ) { - Sizzle( selector, contexts[i], results ); - } - return results; -} - -function select( selector, context, results, seed ) { - var i, tokens, token, type, find, - match = tokenize( selector ); - - if ( !seed ) { - // Try to minimize operations if there is only one group - if ( match.length === 1 ) { - - // Take a shortcut and set the context if the root selector is an ID - tokens = match[0] = match[0].slice( 0 ); - if ( tokens.length > 2 && (token = tokens[0]).type === "ID" && - support.getById && context.nodeType === 9 && documentIsHTML && - Expr.relative[ tokens[1].type ] ) { - - context = ( Expr.find["ID"]( token.matches[0].replace(runescape, funescape), context ) || [] )[0]; - if ( !context ) { - return results; - } - selector = selector.slice( tokens.shift().value.length ); - } - - // Fetch a seed set for right-to-left matching - i = matchExpr["needsContext"].test( selector ) ? 0 : tokens.length; - while ( i-- ) { - token = tokens[i]; - - // Abort if we hit a combinator - if ( Expr.relative[ (type = token.type) ] ) { - break; - } - if ( (find = Expr.find[ type ]) ) { - // Search, expanding context for leading sibling combinators - if ( (seed = find( - token.matches[0].replace( runescape, funescape ), - rsibling.test( tokens[0].type ) && context.parentNode || context - )) ) { - - // If seed is empty or no tokens remain, we can return early - tokens.splice( i, 1 ); - selector = seed.length && toSelector( tokens ); - if ( !selector ) { - push.apply( results, seed ); - return results; - } - - break; - } - } - } - } - } - - // Compile and execute a filtering function - // Provide `match` to avoid retokenization if we modified the selector above - compile( selector, match )( - seed, - context, - !documentIsHTML, - results, - rsibling.test( selector ) - ); - return results; -} - -// One-time assignments - -// Sort stability -support.sortStable = expando.split("").sort( sortOrder ).join("") === expando; - -// Support: Chrome<14 -// Always assume duplicates if they aren't passed to the comparison function -support.detectDuplicates = hasDuplicate; - -// Initialize against the default document -setDocument(); - -// Support: Webkit<537.32 - Safari 6.0.3/Chrome 25 (fixed in Chrome 27) -// Detached nodes confoundingly follow *each other* -support.sortDetached = assert(function( div1 ) { - // Should return 1, but returns 4 (following) - return div1.compareDocumentPosition( document.createElement("div") ) & 1; -}); - -// Support: IE<8 -// Prevent attribute/property "interpolation" -// http://msdn.microsoft.com/en-us/library/ms536429%28VS.85%29.aspx -if ( !assert(function( div ) { - div.innerHTML = ""; - return div.firstChild.getAttribute("href") === "#" ; -}) ) { - addHandle( "type|href|height|width", function( elem, name, isXML ) { - if ( !isXML ) { - return elem.getAttribute( name, name.toLowerCase() === "type" ? 1 : 2 ); - } - }); -} - -// Support: IE<9 -// Use defaultValue in place of getAttribute("value") -if ( !support.attributes || !assert(function( div ) { - div.innerHTML = ""; - div.firstChild.setAttribute( "value", "" ); - return div.firstChild.getAttribute( "value" ) === ""; -}) ) { - addHandle( "value", function( elem, name, isXML ) { - if ( !isXML && elem.nodeName.toLowerCase() === "input" ) { - return elem.defaultValue; - } - }); -} - -// Support: IE<9 -// Use getAttributeNode to fetch booleans when getAttribute lies -if ( !assert(function( div ) { - return div.getAttribute("disabled") == null; -}) ) { - addHandle( booleans, function( elem, name, isXML ) { - var val; - if ( !isXML ) { - return (val = elem.getAttributeNode( name )) && val.specified ? - val.value : - elem[ name ] === true ? name.toLowerCase() : null; - } - }); -} - -jQuery.find = Sizzle; -jQuery.expr = Sizzle.selectors; -jQuery.expr[":"] = jQuery.expr.pseudos; -jQuery.unique = Sizzle.uniqueSort; -jQuery.text = Sizzle.getText; -jQuery.isXMLDoc = Sizzle.isXML; -jQuery.contains = Sizzle.contains; - - -})( window ); -// String to Object options format cache -var optionsCache = {}; - -// Convert String-formatted options into Object-formatted ones and store in cache -function createOptions( options ) { - var object = optionsCache[ options ] = {}; - jQuery.each( options.match( core_rnotwhite ) || [], function( _, flag ) { - object[ flag ] = true; - }); - return object; -} - -/* - * Create a callback list using the following parameters: - * - * options: an optional list of space-separated options that will change how - * the callback list behaves or a more traditional option object - * - * By default a callback list will act like an event callback list and can be - * "fired" multiple times. - * - * Possible options: - * - * once: will ensure the callback list can only be fired once (like a Deferred) - * - * memory: will keep track of previous values and will call any callback added - * after the list has been fired right away with the latest "memorized" - * values (like a Deferred) - * - * unique: will ensure a callback can only be added once (no duplicate in the list) - * - * stopOnFalse: interrupt callings when a callback returns false - * - */ -jQuery.Callbacks = function( options ) { - - // Convert options from String-formatted to Object-formatted if needed - // (we check in cache first) - options = typeof options === "string" ? - ( optionsCache[ options ] || createOptions( options ) ) : - jQuery.extend( {}, options ); - - var // Last fire value (for non-forgettable lists) - memory, - // Flag to know if list was already fired - fired, - // Flag to know if list is currently firing - firing, - // First callback to fire (used internally by add and fireWith) - firingStart, - // End of the loop when firing - firingLength, - // Index of currently firing callback (modified by remove if needed) - firingIndex, - // Actual callback list - list = [], - // Stack of fire calls for repeatable lists - stack = !options.once && [], - // Fire callbacks - fire = function( data ) { - memory = options.memory && data; - fired = true; - firingIndex = firingStart || 0; - firingStart = 0; - firingLength = list.length; - firing = true; - for ( ; list && firingIndex < firingLength; firingIndex++ ) { - if ( list[ firingIndex ].apply( data[ 0 ], data[ 1 ] ) === false && options.stopOnFalse ) { - memory = false; // To prevent further calls using add - break; - } - } - firing = false; - if ( list ) { - if ( stack ) { - if ( stack.length ) { - fire( stack.shift() ); - } - } else if ( memory ) { - list = []; - } else { - self.disable(); - } - } - }, - // Actual Callbacks object - self = { - // Add a callback or a collection of callbacks to the list - add: function() { - if ( list ) { - // First, we save the current length - var start = list.length; - (function add( args ) { - jQuery.each( args, function( _, arg ) { - var type = jQuery.type( arg ); - if ( type === "function" ) { - if ( !options.unique || !self.has( arg ) ) { - list.push( arg ); - } - } else if ( arg && arg.length && type !== "string" ) { - // Inspect recursively - add( arg ); - } - }); - })( arguments ); - // Do we need to add the callbacks to the - // current firing batch? - if ( firing ) { - firingLength = list.length; - // With memory, if we're not firing then - // we should call right away - } else if ( memory ) { - firingStart = start; - fire( memory ); - } - } - return this; - }, - // Remove a callback from the list - remove: function() { - if ( list ) { - jQuery.each( arguments, function( _, arg ) { - var index; - while( ( index = jQuery.inArray( arg, list, index ) ) > -1 ) { - list.splice( index, 1 ); - // Handle firing indexes - if ( firing ) { - if ( index <= firingLength ) { - firingLength--; - } - if ( index <= firingIndex ) { - firingIndex--; - } - } - } - }); - } - return this; - }, - // Check if a given callback is in the list. - // If no argument is given, return whether or not list has callbacks attached. - has: function( fn ) { - return fn ? jQuery.inArray( fn, list ) > -1 : !!( list && list.length ); - }, - // Remove all callbacks from the list - empty: function() { - list = []; - firingLength = 0; - return this; - }, - // Have the list do nothing anymore - disable: function() { - list = stack = memory = undefined; - return this; - }, - // Is it disabled? - disabled: function() { - return !list; - }, - // Lock the list in its current state - lock: function() { - stack = undefined; - if ( !memory ) { - self.disable(); - } - return this; - }, - // Is it locked? - locked: function() { - return !stack; - }, - // Call all callbacks with the given context and arguments - fireWith: function( context, args ) { - if ( list && ( !fired || stack ) ) { - args = args || []; - args = [ context, args.slice ? args.slice() : args ]; - if ( firing ) { - stack.push( args ); - } else { - fire( args ); - } - } - return this; - }, - // Call all the callbacks with the given arguments - fire: function() { - self.fireWith( this, arguments ); - return this; - }, - // To know if the callbacks have already been called at least once - fired: function() { - return !!fired; - } - }; - - return self; -}; -jQuery.extend({ - - Deferred: function( func ) { - var tuples = [ - // action, add listener, listener list, final state - [ "resolve", "done", jQuery.Callbacks("once memory"), "resolved" ], - [ "reject", "fail", jQuery.Callbacks("once memory"), "rejected" ], - [ "notify", "progress", jQuery.Callbacks("memory") ] - ], - state = "pending", - promise = { - state: function() { - return state; - }, - always: function() { - deferred.done( arguments ).fail( arguments ); - return this; - }, - then: function( /* fnDone, fnFail, fnProgress */ ) { - var fns = arguments; - return jQuery.Deferred(function( newDefer ) { - jQuery.each( tuples, function( i, tuple ) { - var action = tuple[ 0 ], - fn = jQuery.isFunction( fns[ i ] ) && fns[ i ]; - // deferred[ done | fail | progress ] for forwarding actions to newDefer - deferred[ tuple[1] ](function() { - var returned = fn && fn.apply( this, arguments ); - if ( returned && jQuery.isFunction( returned.promise ) ) { - returned.promise() - .done( newDefer.resolve ) - .fail( newDefer.reject ) - .progress( newDefer.notify ); - } else { - newDefer[ action + "With" ]( this === promise ? newDefer.promise() : this, fn ? [ returned ] : arguments ); - } - }); - }); - fns = null; - }).promise(); - }, - // Get a promise for this deferred - // If obj is provided, the promise aspect is added to the object - promise: function( obj ) { - return obj != null ? jQuery.extend( obj, promise ) : promise; - } - }, - deferred = {}; - - // Keep pipe for back-compat - promise.pipe = promise.then; - - // Add list-specific methods - jQuery.each( tuples, function( i, tuple ) { - var list = tuple[ 2 ], - stateString = tuple[ 3 ]; - - // promise[ done | fail | progress ] = list.add - promise[ tuple[1] ] = list.add; - - // Handle state - if ( stateString ) { - list.add(function() { - // state = [ resolved | rejected ] - state = stateString; - - // [ reject_list | resolve_list ].disable; progress_list.lock - }, tuples[ i ^ 1 ][ 2 ].disable, tuples[ 2 ][ 2 ].lock ); - } - - // deferred[ resolve | reject | notify ] - deferred[ tuple[0] ] = function() { - deferred[ tuple[0] + "With" ]( this === deferred ? promise : this, arguments ); - return this; - }; - deferred[ tuple[0] + "With" ] = list.fireWith; - }); - - // Make the deferred a promise - promise.promise( deferred ); - - // Call given func if any - if ( func ) { - func.call( deferred, deferred ); - } - - // All done! - return deferred; - }, - - // Deferred helper - when: function( subordinate /* , ..., subordinateN */ ) { - var i = 0, - resolveValues = core_slice.call( arguments ), - length = resolveValues.length, - - // the count of uncompleted subordinates - remaining = length !== 1 || ( subordinate && jQuery.isFunction( subordinate.promise ) ) ? length : 0, - - // the master Deferred. If resolveValues consist of only a single Deferred, just use that. - deferred = remaining === 1 ? subordinate : jQuery.Deferred(), - - // Update function for both resolve and progress values - updateFunc = function( i, contexts, values ) { - return function( value ) { - contexts[ i ] = this; - values[ i ] = arguments.length > 1 ? core_slice.call( arguments ) : value; - if( values === progressValues ) { - deferred.notifyWith( contexts, values ); - } else if ( !( --remaining ) ) { - deferred.resolveWith( contexts, values ); - } - }; - }, - - progressValues, progressContexts, resolveContexts; - - // add listeners to Deferred subordinates; treat others as resolved - if ( length > 1 ) { - progressValues = new Array( length ); - progressContexts = new Array( length ); - resolveContexts = new Array( length ); - for ( ; i < length; i++ ) { - if ( resolveValues[ i ] && jQuery.isFunction( resolveValues[ i ].promise ) ) { - resolveValues[ i ].promise() - .done( updateFunc( i, resolveContexts, resolveValues ) ) - .fail( deferred.reject ) - .progress( updateFunc( i, progressContexts, progressValues ) ); - } else { - --remaining; - } - } - } - - // if we're not waiting on anything, resolve the master - if ( !remaining ) { - deferred.resolveWith( resolveContexts, resolveValues ); - } - - return deferred.promise(); - } -}); -jQuery.support = (function( support ) { - var input = document.createElement("input"), - fragment = document.createDocumentFragment(), - div = document.createElement("div"), - select = document.createElement("select"), - opt = select.appendChild( document.createElement("option") ); - - // Finish early in limited environments - if ( !input.type ) { - return support; - } - - input.type = "checkbox"; - - // Support: Safari 5.1, iOS 5.1, Android 4.x, Android 2.3 - // Check the default checkbox/radio value ("" on old WebKit; "on" elsewhere) - support.checkOn = input.value !== ""; - - // Must access the parent to make an option select properly - // Support: IE9, IE10 - support.optSelected = opt.selected; - - // Will be defined later - support.reliableMarginRight = true; - support.boxSizingReliable = true; - support.pixelPosition = false; - - // Make sure checked status is properly cloned - // Support: IE9, IE10 - input.checked = true; - support.noCloneChecked = input.cloneNode( true ).checked; - - // Make sure that the options inside disabled selects aren't marked as disabled - // (WebKit marks them as disabled) - select.disabled = true; - support.optDisabled = !opt.disabled; - - // Check if an input maintains its value after becoming a radio - // Support: IE9, IE10 - input = document.createElement("input"); - input.value = "t"; - input.type = "radio"; - support.radioValue = input.value === "t"; - - // #11217 - WebKit loses check when the name is after the checked attribute - input.setAttribute( "checked", "t" ); - input.setAttribute( "name", "t" ); - - fragment.appendChild( input ); - - // Support: Safari 5.1, Android 4.x, Android 2.3 - // old WebKit doesn't clone checked state correctly in fragments - support.checkClone = fragment.cloneNode( true ).cloneNode( true ).lastChild.checked; - - // Support: Firefox, Chrome, Safari - // Beware of CSP restrictions (https://developer.mozilla.org/en/Security/CSP) - support.focusinBubbles = "onfocusin" in window; - - div.style.backgroundClip = "content-box"; - div.cloneNode( true ).style.backgroundClip = ""; - support.clearCloneStyle = div.style.backgroundClip === "content-box"; - - // Run tests that need a body at doc ready - jQuery(function() { - var container, marginDiv, - // Support: Firefox, Android 2.3 (Prefixed box-sizing versions). - divReset = "padding:0;margin:0;border:0;display:block;-webkit-box-sizing:content-box;-moz-box-sizing:content-box;box-sizing:content-box", - body = document.getElementsByTagName("body")[ 0 ]; - - if ( !body ) { - // Return for frameset docs that don't have a body - return; - } - - container = document.createElement("div"); - container.style.cssText = "border:0;width:0;height:0;position:absolute;top:0;left:-9999px;margin-top:1px"; - - // Check box-sizing and margin behavior. - body.appendChild( container ).appendChild( div ); - div.innerHTML = ""; - // Support: Firefox, Android 2.3 (Prefixed box-sizing versions). - div.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%"; - - // Workaround failing boxSizing test due to offsetWidth returning wrong value - // with some non-1 values of body zoom, ticket #13543 - jQuery.swap( body, body.style.zoom != null ? { zoom: 1 } : {}, function() { - support.boxSizing = div.offsetWidth === 4; - }); - - // Use window.getComputedStyle because jsdom on node.js will break without it. - if ( window.getComputedStyle ) { - support.pixelPosition = ( window.getComputedStyle( div, null ) || {} ).top !== "1%"; - support.boxSizingReliable = ( window.getComputedStyle( div, null ) || { width: "4px" } ).width === "4px"; - - // Support: Android 2.3 - // Check if div with explicit width and no margin-right incorrectly - // gets computed margin-right based on width of container. (#3333) - // WebKit Bug 13343 - getComputedStyle returns wrong value for margin-right - marginDiv = div.appendChild( document.createElement("div") ); - marginDiv.style.cssText = div.style.cssText = divReset; - marginDiv.style.marginRight = marginDiv.style.width = "0"; - div.style.width = "1px"; - - support.reliableMarginRight = - !parseFloat( ( window.getComputedStyle( marginDiv, null ) || {} ).marginRight ); - } - - body.removeChild( container ); - }); - - return support; -})( {} ); - -/* - Implementation Summary - - 1. Enforce API surface and semantic compatibility with 1.9.x branch - 2. Improve the module's maintainability by reducing the storage - paths to a single mechanism. - 3. Use the same single mechanism to support "private" and "user" data. - 4. _Never_ expose "private" data to user code (TODO: Drop _data, _removeData) - 5. Avoid exposing implementation details on user objects (eg. expando properties) - 6. Provide a clear path for implementation upgrade to WeakMap in 2014 -*/ -var data_user, data_priv, - rbrace = /(?:\{[\s\S]*\}|\[[\s\S]*\])$/, - rmultiDash = /([A-Z])/g; - -function Data() { - // Support: Android < 4, - // Old WebKit does not have Object.preventExtensions/freeze method, - // return new empty object instead with no [[set]] accessor - Object.defineProperty( this.cache = {}, 0, { - get: function() { - return {}; - } - }); - - this.expando = jQuery.expando + Math.random(); -} - -Data.uid = 1; - -Data.accepts = function( owner ) { - // Accepts only: - // - Node - // - Node.ELEMENT_NODE - // - Node.DOCUMENT_NODE - // - Object - // - Any - return owner.nodeType ? - owner.nodeType === 1 || owner.nodeType === 9 : true; -}; - -Data.prototype = { - key: function( owner ) { - // We can accept data for non-element nodes in modern browsers, - // but we should not, see #8335. - // Always return the key for a frozen object. - if ( !Data.accepts( owner ) ) { - return 0; - } - - var descriptor = {}, - // Check if the owner object already has a cache key - unlock = owner[ this.expando ]; - - // If not, create one - if ( !unlock ) { - unlock = Data.uid++; - - // Secure it in a non-enumerable, non-writable property - try { - descriptor[ this.expando ] = { value: unlock }; - Object.defineProperties( owner, descriptor ); - - // Support: Android < 4 - // Fallback to a less secure definition - } catch ( e ) { - descriptor[ this.expando ] = unlock; - jQuery.extend( owner, descriptor ); - } - } - - // Ensure the cache object - if ( !this.cache[ unlock ] ) { - this.cache[ unlock ] = {}; - } - - return unlock; - }, - set: function( owner, data, value ) { - var prop, - // There may be an unlock assigned to this node, - // if there is no entry for this "owner", create one inline - // and set the unlock as though an owner entry had always existed - unlock = this.key( owner ), - cache = this.cache[ unlock ]; - - // Handle: [ owner, key, value ] args - if ( typeof data === "string" ) { - cache[ data ] = value; - - // Handle: [ owner, { properties } ] args - } else { - // Fresh assignments by object are shallow copied - if ( jQuery.isEmptyObject( cache ) ) { - jQuery.extend( this.cache[ unlock ], data ); - // Otherwise, copy the properties one-by-one to the cache object - } else { - for ( prop in data ) { - cache[ prop ] = data[ prop ]; - } - } - } - return cache; - }, - get: function( owner, key ) { - // Either a valid cache is found, or will be created. - // New caches will be created and the unlock returned, - // allowing direct access to the newly created - // empty data object. A valid owner object must be provided. - var cache = this.cache[ this.key( owner ) ]; - - return key === undefined ? - cache : cache[ key ]; - }, - access: function( owner, key, value ) { - var stored; - // In cases where either: - // - // 1. No key was specified - // 2. A string key was specified, but no value provided - // - // Take the "read" path and allow the get method to determine - // which value to return, respectively either: - // - // 1. The entire cache object - // 2. The data stored at the key - // - if ( key === undefined || - ((key && typeof key === "string") && value === undefined) ) { - - stored = this.get( owner, key ); - - return stored !== undefined ? - stored : this.get( owner, jQuery.camelCase(key) ); - } - - // [*]When the key is not a string, or both a key and value - // are specified, set or extend (existing objects) with either: - // - // 1. An object of properties - // 2. A key and value - // - this.set( owner, key, value ); - - // Since the "set" path can have two possible entry points - // return the expected data based on which path was taken[*] - return value !== undefined ? value : key; - }, - remove: function( owner, key ) { - var i, name, camel, - unlock = this.key( owner ), - cache = this.cache[ unlock ]; - - if ( key === undefined ) { - this.cache[ unlock ] = {}; - - } else { - // Support array or space separated string of keys - if ( jQuery.isArray( key ) ) { - // If "name" is an array of keys... - // When data is initially created, via ("key", "val") signature, - // keys will be converted to camelCase. - // Since there is no way to tell _how_ a key was added, remove - // both plain key and camelCase key. #12786 - // This will only penalize the array argument path. - name = key.concat( key.map( jQuery.camelCase ) ); - } else { - camel = jQuery.camelCase( key ); - // Try the string as a key before any manipulation - if ( key in cache ) { - name = [ key, camel ]; - } else { - // If a key with the spaces exists, use it. - // Otherwise, create an array by matching non-whitespace - name = camel; - name = name in cache ? - [ name ] : ( name.match( core_rnotwhite ) || [] ); - } - } - - i = name.length; - while ( i-- ) { - delete cache[ name[ i ] ]; - } - } - }, - hasData: function( owner ) { - return !jQuery.isEmptyObject( - this.cache[ owner[ this.expando ] ] || {} - ); - }, - discard: function( owner ) { - if ( owner[ this.expando ] ) { - delete this.cache[ owner[ this.expando ] ]; - } - } -}; - -// These may be used throughout the jQuery core codebase -data_user = new Data(); -data_priv = new Data(); - - -jQuery.extend({ - acceptData: Data.accepts, - - hasData: function( elem ) { - return data_user.hasData( elem ) || data_priv.hasData( elem ); - }, - - data: function( elem, name, data ) { - return data_user.access( elem, name, data ); - }, - - removeData: function( elem, name ) { - data_user.remove( elem, name ); - }, - - // TODO: Now that all calls to _data and _removeData have been replaced - // with direct calls to data_priv methods, these can be deprecated. - _data: function( elem, name, data ) { - return data_priv.access( elem, name, data ); - }, - - _removeData: function( elem, name ) { - data_priv.remove( elem, name ); - } -}); - -jQuery.fn.extend({ - data: function( key, value ) { - var attrs, name, - elem = this[ 0 ], - i = 0, - data = null; - - // Gets all values - if ( key === undefined ) { - if ( this.length ) { - data = data_user.get( elem ); - - if ( elem.nodeType === 1 && !data_priv.get( elem, "hasDataAttrs" ) ) { - attrs = elem.attributes; - for ( ; i < attrs.length; i++ ) { - name = attrs[ i ].name; - - if ( name.indexOf( "data-" ) === 0 ) { - name = jQuery.camelCase( name.slice(5) ); - dataAttr( elem, name, data[ name ] ); - } - } - data_priv.set( elem, "hasDataAttrs", true ); - } - } - - return data; - } - - // Sets multiple values - if ( typeof key === "object" ) { - return this.each(function() { - data_user.set( this, key ); - }); - } - - return jQuery.access( this, function( value ) { - var data, - camelKey = jQuery.camelCase( key ); - - // The calling jQuery object (element matches) is not empty - // (and therefore has an element appears at this[ 0 ]) and the - // `value` parameter was not undefined. An empty jQuery object - // will result in `undefined` for elem = this[ 0 ] which will - // throw an exception if an attempt to read a data cache is made. - if ( elem && value === undefined ) { - // Attempt to get data from the cache - // with the key as-is - data = data_user.get( elem, key ); - if ( data !== undefined ) { - return data; - } - - // Attempt to get data from the cache - // with the key camelized - data = data_user.get( elem, camelKey ); - if ( data !== undefined ) { - return data; - } - - // Attempt to "discover" the data in - // HTML5 custom data-* attrs - data = dataAttr( elem, camelKey, undefined ); - if ( data !== undefined ) { - return data; - } - - // We tried really hard, but the data doesn't exist. - return; - } - - // Set the data... - this.each(function() { - // First, attempt to store a copy or reference of any - // data that might've been store with a camelCased key. - var data = data_user.get( this, camelKey ); - - // For HTML5 data-* attribute interop, we have to - // store property names with dashes in a camelCase form. - // This might not apply to all properties...* - data_user.set( this, camelKey, value ); - - // *... In the case of properties that might _actually_ - // have dashes, we need to also store a copy of that - // unchanged property. - if ( key.indexOf("-") !== -1 && data !== undefined ) { - data_user.set( this, key, value ); - } - }); - }, null, value, arguments.length > 1, null, true ); - }, - - removeData: function( key ) { - return this.each(function() { - data_user.remove( this, key ); - }); - } -}); - -function dataAttr( elem, key, data ) { - var name; - - // If nothing was found internally, try to fetch any - // data from the HTML5 data-* attribute - if ( data === undefined && elem.nodeType === 1 ) { - name = "data-" + key.replace( rmultiDash, "-$1" ).toLowerCase(); - data = elem.getAttribute( name ); - - if ( typeof data === "string" ) { - try { - data = data === "true" ? true : - data === "false" ? false : - data === "null" ? null : - // Only convert to a number if it doesn't change the string - +data + "" === data ? +data : - rbrace.test( data ) ? JSON.parse( data ) : - data; - } catch( e ) {} - - // Make sure we set the data so it isn't changed later - data_user.set( elem, key, data ); - } else { - data = undefined; - } - } - return data; -} -jQuery.extend({ - queue: function( elem, type, data ) { - var queue; - - if ( elem ) { - type = ( type || "fx" ) + "queue"; - queue = data_priv.get( elem, type ); - - // Speed up dequeue by getting out quickly if this is just a lookup - if ( data ) { - if ( !queue || jQuery.isArray( data ) ) { - queue = data_priv.access( elem, type, jQuery.makeArray(data) ); - } else { - queue.push( data ); - } - } - return queue || []; - } - }, - - dequeue: function( elem, type ) { - type = type || "fx"; - - var queue = jQuery.queue( elem, type ), - startLength = queue.length, - fn = queue.shift(), - hooks = jQuery._queueHooks( elem, type ), - next = function() { - jQuery.dequeue( elem, type ); - }; - - // If the fx queue is dequeued, always remove the progress sentinel - if ( fn === "inprogress" ) { - fn = queue.shift(); - startLength--; - } - - if ( fn ) { - - // Add a progress sentinel to prevent the fx queue from being - // automatically dequeued - if ( type === "fx" ) { - queue.unshift( "inprogress" ); - } - - // clear up the last queue stop function - delete hooks.stop; - fn.call( elem, next, hooks ); - } - - if ( !startLength && hooks ) { - hooks.empty.fire(); - } - }, - - // not intended for public consumption - generates a queueHooks object, or returns the current one - _queueHooks: function( elem, type ) { - var key = type + "queueHooks"; - return data_priv.get( elem, key ) || data_priv.access( elem, key, { - empty: jQuery.Callbacks("once memory").add(function() { - data_priv.remove( elem, [ type + "queue", key ] ); - }) - }); - } -}); - -jQuery.fn.extend({ - queue: function( type, data ) { - var setter = 2; - - if ( typeof type !== "string" ) { - data = type; - type = "fx"; - setter--; - } - - if ( arguments.length < setter ) { - return jQuery.queue( this[0], type ); - } - - return data === undefined ? - this : - this.each(function() { - var queue = jQuery.queue( this, type, data ); - - // ensure a hooks for this queue - jQuery._queueHooks( this, type ); - - if ( type === "fx" && queue[0] !== "inprogress" ) { - jQuery.dequeue( this, type ); - } - }); - }, - dequeue: function( type ) { - return this.each(function() { - jQuery.dequeue( this, type ); - }); - }, - // Based off of the plugin by Clint Helfers, with permission. - // http://blindsignals.com/index.php/2009/07/jquery-delay/ - delay: function( time, type ) { - time = jQuery.fx ? jQuery.fx.speeds[ time ] || time : time; - type = type || "fx"; - - return this.queue( type, function( next, hooks ) { - var timeout = setTimeout( next, time ); - hooks.stop = function() { - clearTimeout( timeout ); - }; - }); - }, - clearQueue: function( type ) { - return this.queue( type || "fx", [] ); - }, - // Get a promise resolved when queues of a certain type - // are emptied (fx is the type by default) - promise: function( type, obj ) { - var tmp, - count = 1, - defer = jQuery.Deferred(), - elements = this, - i = this.length, - resolve = function() { - if ( !( --count ) ) { - defer.resolveWith( elements, [ elements ] ); - } - }; - - if ( typeof type !== "string" ) { - obj = type; - type = undefined; - } - type = type || "fx"; - - while( i-- ) { - tmp = data_priv.get( elements[ i ], type + "queueHooks" ); - if ( tmp && tmp.empty ) { - count++; - tmp.empty.add( resolve ); - } - } - resolve(); - return defer.promise( obj ); - } -}); -var nodeHook, boolHook, - rclass = /[\t\r\n\f]/g, - rreturn = /\r/g, - rfocusable = /^(?:input|select|textarea|button)$/i; - -jQuery.fn.extend({ - attr: function( name, value ) { - return jQuery.access( this, jQuery.attr, name, value, arguments.length > 1 ); - }, - - removeAttr: function( name ) { - return this.each(function() { - jQuery.removeAttr( this, name ); - }); - }, - - prop: function( name, value ) { - return jQuery.access( this, jQuery.prop, name, value, arguments.length > 1 ); - }, - - removeProp: function( name ) { - return this.each(function() { - delete this[ jQuery.propFix[ name ] || name ]; - }); - }, - - addClass: function( value ) { - var classes, elem, cur, clazz, j, - i = 0, - len = this.length, - proceed = typeof value === "string" && value; - - if ( jQuery.isFunction( value ) ) { - return this.each(function( j ) { - jQuery( this ).addClass( value.call( this, j, this.className ) ); - }); - } - - if ( proceed ) { - // The disjunction here is for better compressibility (see removeClass) - classes = ( value || "" ).match( core_rnotwhite ) || []; - - for ( ; i < len; i++ ) { - elem = this[ i ]; - cur = elem.nodeType === 1 && ( elem.className ? - ( " " + elem.className + " " ).replace( rclass, " " ) : - " " - ); - - if ( cur ) { - j = 0; - while ( (clazz = classes[j++]) ) { - if ( cur.indexOf( " " + clazz + " " ) < 0 ) { - cur += clazz + " "; - } - } - elem.className = jQuery.trim( cur ); - - } - } - } - - return this; - }, - - removeClass: function( value ) { - var classes, elem, cur, clazz, j, - i = 0, - len = this.length, - proceed = arguments.length === 0 || typeof value === "string" && value; - - if ( jQuery.isFunction( value ) ) { - return this.each(function( j ) { - jQuery( this ).removeClass( value.call( this, j, this.className ) ); - }); - } - if ( proceed ) { - classes = ( value || "" ).match( core_rnotwhite ) || []; - - for ( ; i < len; i++ ) { - elem = this[ i ]; - // This expression is here for better compressibility (see addClass) - cur = elem.nodeType === 1 && ( elem.className ? - ( " " + elem.className + " " ).replace( rclass, " " ) : - "" - ); - - if ( cur ) { - j = 0; - while ( (clazz = classes[j++]) ) { - // Remove *all* instances - while ( cur.indexOf( " " + clazz + " " ) >= 0 ) { - cur = cur.replace( " " + clazz + " ", " " ); - } - } - elem.className = value ? jQuery.trim( cur ) : ""; - } - } - } - - return this; - }, - - toggleClass: function( value, stateVal ) { - var type = typeof value; - - if ( typeof stateVal === "boolean" && type === "string" ) { - return stateVal ? this.addClass( value ) : this.removeClass( value ); - } - - if ( jQuery.isFunction( value ) ) { - return this.each(function( i ) { - jQuery( this ).toggleClass( value.call(this, i, this.className, stateVal), stateVal ); - }); - } - - return this.each(function() { - if ( type === "string" ) { - // toggle individual class names - var className, - i = 0, - self = jQuery( this ), - classNames = value.match( core_rnotwhite ) || []; - - while ( (className = classNames[ i++ ]) ) { - // check each className given, space separated list - if ( self.hasClass( className ) ) { - self.removeClass( className ); - } else { - self.addClass( className ); - } - } - - // Toggle whole class name - } else if ( type === core_strundefined || type === "boolean" ) { - if ( this.className ) { - // store className if set - data_priv.set( this, "__className__", this.className ); - } - - // If the element has a class name or if we're passed "false", - // then remove the whole classname (if there was one, the above saved it). - // Otherwise bring back whatever was previously saved (if anything), - // falling back to the empty string if nothing was stored. - this.className = this.className || value === false ? "" : data_priv.get( this, "__className__" ) || ""; - } - }); - }, - - hasClass: function( selector ) { - var className = " " + selector + " ", - i = 0, - l = this.length; - for ( ; i < l; i++ ) { - if ( this[i].nodeType === 1 && (" " + this[i].className + " ").replace(rclass, " ").indexOf( className ) >= 0 ) { - return true; - } - } - - return false; - }, - - val: function( value ) { - var hooks, ret, isFunction, - elem = this[0]; - - if ( !arguments.length ) { - if ( elem ) { - hooks = jQuery.valHooks[ elem.type ] || jQuery.valHooks[ elem.nodeName.toLowerCase() ]; - - if ( hooks && "get" in hooks && (ret = hooks.get( elem, "value" )) !== undefined ) { - return ret; - } - - ret = elem.value; - - return typeof ret === "string" ? - // handle most common string cases - ret.replace(rreturn, "") : - // handle cases where value is null/undef or number - ret == null ? "" : ret; - } - - return; - } - - isFunction = jQuery.isFunction( value ); - - return this.each(function( i ) { - var val; - - if ( this.nodeType !== 1 ) { - return; - } - - if ( isFunction ) { - val = value.call( this, i, jQuery( this ).val() ); - } else { - val = value; - } - - // Treat null/undefined as ""; convert numbers to string - if ( val == null ) { - val = ""; - } else if ( typeof val === "number" ) { - val += ""; - } else if ( jQuery.isArray( val ) ) { - val = jQuery.map(val, function ( value ) { - return value == null ? "" : value + ""; - }); - } - - hooks = jQuery.valHooks[ this.type ] || jQuery.valHooks[ this.nodeName.toLowerCase() ]; - - // If set returns undefined, fall back to normal setting - if ( !hooks || !("set" in hooks) || hooks.set( this, val, "value" ) === undefined ) { - this.value = val; - } - }); - } -}); - -jQuery.extend({ - valHooks: { - option: { - get: function( elem ) { - // attributes.value is undefined in Blackberry 4.7 but - // uses .value. See #6932 - var val = elem.attributes.value; - return !val || val.specified ? elem.value : elem.text; - } - }, - select: { - get: function( elem ) { - var value, option, - options = elem.options, - index = elem.selectedIndex, - one = elem.type === "select-one" || index < 0, - values = one ? null : [], - max = one ? index + 1 : options.length, - i = index < 0 ? - max : - one ? index : 0; - - // Loop through all the selected options - for ( ; i < max; i++ ) { - option = options[ i ]; - - // IE6-9 doesn't update selected after form reset (#2551) - if ( ( option.selected || i === index ) && - // Don't return options that are disabled or in a disabled optgroup - ( jQuery.support.optDisabled ? !option.disabled : option.getAttribute("disabled") === null ) && - ( !option.parentNode.disabled || !jQuery.nodeName( option.parentNode, "optgroup" ) ) ) { - - // Get the specific value for the option - value = jQuery( option ).val(); - - // We don't need an array for one selects - if ( one ) { - return value; - } - - // Multi-Selects return an array - values.push( value ); - } - } - - return values; - }, - - set: function( elem, value ) { - var optionSet, option, - options = elem.options, - values = jQuery.makeArray( value ), - i = options.length; - - while ( i-- ) { - option = options[ i ]; - if ( (option.selected = jQuery.inArray( jQuery(option).val(), values ) >= 0) ) { - optionSet = true; - } - } - - // force browsers to behave consistently when non-matching value is set - if ( !optionSet ) { - elem.selectedIndex = -1; - } - return values; - } - } - }, - - attr: function( elem, name, value ) { - var hooks, ret, - nType = elem.nodeType; - - // don't get/set attributes on text, comment and attribute nodes - if ( !elem || nType === 3 || nType === 8 || nType === 2 ) { - return; - } - - // Fallback to prop when attributes are not supported - if ( typeof elem.getAttribute === core_strundefined ) { - return jQuery.prop( elem, name, value ); - } - - // All attributes are lowercase - // Grab necessary hook if one is defined - if ( nType !== 1 || !jQuery.isXMLDoc( elem ) ) { - name = name.toLowerCase(); - hooks = jQuery.attrHooks[ name ] || - ( jQuery.expr.match.bool.test( name ) ? boolHook : nodeHook ); - } - - if ( value !== undefined ) { - - if ( value === null ) { - jQuery.removeAttr( elem, name ); - - } else if ( hooks && "set" in hooks && (ret = hooks.set( elem, value, name )) !== undefined ) { - return ret; - - } else { - elem.setAttribute( name, value + "" ); - return value; - } - - } else if ( hooks && "get" in hooks && (ret = hooks.get( elem, name )) !== null ) { - return ret; - - } else { - ret = jQuery.find.attr( elem, name ); - - // Non-existent attributes return null, we normalize to undefined - return ret == null ? - undefined : - ret; - } - }, - - removeAttr: function( elem, value ) { - var name, propName, - i = 0, - attrNames = value && value.match( core_rnotwhite ); - - if ( attrNames && elem.nodeType === 1 ) { - while ( (name = attrNames[i++]) ) { - propName = jQuery.propFix[ name ] || name; - - // Boolean attributes get special treatment (#10870) - if ( jQuery.expr.match.bool.test( name ) ) { - // Set corresponding property to false - elem[ propName ] = false; - } - - elem.removeAttribute( name ); - } - } - }, - - attrHooks: { - type: { - set: function( elem, value ) { - if ( !jQuery.support.radioValue && value === "radio" && jQuery.nodeName(elem, "input") ) { - // Setting the type on a radio button after the value resets the value in IE6-9 - // Reset value to default in case type is set after value during creation - var val = elem.value; - elem.setAttribute( "type", value ); - if ( val ) { - elem.value = val; - } - return value; - } - } - } - }, - - propFix: { - "for": "htmlFor", - "class": "className" - }, - - prop: function( elem, name, value ) { - var ret, hooks, notxml, - nType = elem.nodeType; - - // don't get/set properties on text, comment and attribute nodes - if ( !elem || nType === 3 || nType === 8 || nType === 2 ) { - return; - } - - notxml = nType !== 1 || !jQuery.isXMLDoc( elem ); - - if ( notxml ) { - // Fix name and attach hooks - name = jQuery.propFix[ name ] || name; - hooks = jQuery.propHooks[ name ]; - } - - if ( value !== undefined ) { - return hooks && "set" in hooks && (ret = hooks.set( elem, value, name )) !== undefined ? - ret : - ( elem[ name ] = value ); - - } else { - return hooks && "get" in hooks && (ret = hooks.get( elem, name )) !== null ? - ret : - elem[ name ]; - } - }, - - propHooks: { - tabIndex: { - get: function( elem ) { - return elem.hasAttribute( "tabindex" ) || rfocusable.test( elem.nodeName ) || elem.href ? - elem.tabIndex : - -1; - } - } - } -}); - -// Hooks for boolean attributes -boolHook = { - set: function( elem, value, name ) { - if ( value === false ) { - // Remove boolean attributes when set to false - jQuery.removeAttr( elem, name ); - } else { - elem.setAttribute( name, name ); - } - return name; - } -}; -jQuery.each( jQuery.expr.match.bool.source.match( /\w+/g ), function( i, name ) { - var getter = jQuery.expr.attrHandle[ name ] || jQuery.find.attr; - - jQuery.expr.attrHandle[ name ] = function( elem, name, isXML ) { - var fn = jQuery.expr.attrHandle[ name ], - ret = isXML ? - undefined : - /* jshint eqeqeq: false */ - // Temporarily disable this handler to check existence - (jQuery.expr.attrHandle[ name ] = undefined) != - getter( elem, name, isXML ) ? - - name.toLowerCase() : - null; - - // Restore handler - jQuery.expr.attrHandle[ name ] = fn; - - return ret; - }; -}); - -// Support: IE9+ -// Selectedness for an option in an optgroup can be inaccurate -if ( !jQuery.support.optSelected ) { - jQuery.propHooks.selected = { - get: function( elem ) { - var parent = elem.parentNode; - if ( parent && parent.parentNode ) { - parent.parentNode.selectedIndex; - } - return null; - } - }; -} - -jQuery.each([ - "tabIndex", - "readOnly", - "maxLength", - "cellSpacing", - "cellPadding", - "rowSpan", - "colSpan", - "useMap", - "frameBorder", - "contentEditable" -], function() { - jQuery.propFix[ this.toLowerCase() ] = this; -}); - -// Radios and checkboxes getter/setter -jQuery.each([ "radio", "checkbox" ], function() { - jQuery.valHooks[ this ] = { - set: function( elem, value ) { - if ( jQuery.isArray( value ) ) { - return ( elem.checked = jQuery.inArray( jQuery(elem).val(), value ) >= 0 ); - } - } - }; - if ( !jQuery.support.checkOn ) { - jQuery.valHooks[ this ].get = function( elem ) { - // Support: Webkit - // "" is returned instead of "on" if a value isn't specified - return elem.getAttribute("value") === null ? "on" : elem.value; - }; - } -}); -var rkeyEvent = /^key/, - rmouseEvent = /^(?:mouse|contextmenu)|click/, - rfocusMorph = /^(?:focusinfocus|focusoutblur)$/, - rtypenamespace = /^([^.]*)(?:\.(.+)|)$/; - -function returnTrue() { - return true; -} - -function returnFalse() { - return false; -} - -function safeActiveElement() { - try { - return document.activeElement; - } catch ( err ) { } -} - -/* - * Helper functions for managing events -- not part of the public interface. - * Props to Dean Edwards' addEvent library for many of the ideas. - */ -jQuery.event = { - - global: {}, - - add: function( elem, types, handler, data, selector ) { - - var handleObjIn, eventHandle, tmp, - events, t, handleObj, - special, handlers, type, namespaces, origType, - elemData = data_priv.get( elem ); - - // Don't attach events to noData or text/comment nodes (but allow plain objects) - if ( !elemData ) { - return; - } - - // Caller can pass in an object of custom data in lieu of the handler - if ( handler.handler ) { - handleObjIn = handler; - handler = handleObjIn.handler; - selector = handleObjIn.selector; - } - - // Make sure that the handler has a unique ID, used to find/remove it later - if ( !handler.guid ) { - handler.guid = jQuery.guid++; - } - - // Init the element's event structure and main handler, if this is the first - if ( !(events = elemData.events) ) { - events = elemData.events = {}; - } - if ( !(eventHandle = elemData.handle) ) { - eventHandle = elemData.handle = function( e ) { - // Discard the second event of a jQuery.event.trigger() and - // when an event is called after a page has unloaded - return typeof jQuery !== core_strundefined && (!e || jQuery.event.triggered !== e.type) ? - jQuery.event.dispatch.apply( eventHandle.elem, arguments ) : - undefined; - }; - // Add elem as a property of the handle fn to prevent a memory leak with IE non-native events - eventHandle.elem = elem; - } - - // Handle multiple events separated by a space - types = ( types || "" ).match( core_rnotwhite ) || [""]; - t = types.length; - while ( t-- ) { - tmp = rtypenamespace.exec( types[t] ) || []; - type = origType = tmp[1]; - namespaces = ( tmp[2] || "" ).split( "." ).sort(); - - // There *must* be a type, no attaching namespace-only handlers - if ( !type ) { - continue; - } - - // If event changes its type, use the special event handlers for the changed type - special = jQuery.event.special[ type ] || {}; - - // If selector defined, determine special event api type, otherwise given type - type = ( selector ? special.delegateType : special.bindType ) || type; - - // Update special based on newly reset type - special = jQuery.event.special[ type ] || {}; - - // handleObj is passed to all event handlers - handleObj = jQuery.extend({ - type: type, - origType: origType, - data: data, - handler: handler, - guid: handler.guid, - selector: selector, - needsContext: selector && jQuery.expr.match.needsContext.test( selector ), - namespace: namespaces.join(".") - }, handleObjIn ); - - // Init the event handler queue if we're the first - if ( !(handlers = events[ type ]) ) { - handlers = events[ type ] = []; - handlers.delegateCount = 0; - - // Only use addEventListener if the special events handler returns false - if ( !special.setup || special.setup.call( elem, data, namespaces, eventHandle ) === false ) { - if ( elem.addEventListener ) { - elem.addEventListener( type, eventHandle, false ); - } - } - } - - if ( special.add ) { - special.add.call( elem, handleObj ); - - if ( !handleObj.handler.guid ) { - handleObj.handler.guid = handler.guid; - } - } - - // Add to the element's handler list, delegates in front - if ( selector ) { - handlers.splice( handlers.delegateCount++, 0, handleObj ); - } else { - handlers.push( handleObj ); - } - - // Keep track of which events have ever been used, for event optimization - jQuery.event.global[ type ] = true; - } - - // Nullify elem to prevent memory leaks in IE - elem = null; - }, - - // Detach an event or set of events from an element - remove: function( elem, types, handler, selector, mappedTypes ) { - - var j, origCount, tmp, - events, t, handleObj, - special, handlers, type, namespaces, origType, - elemData = data_priv.hasData( elem ) && data_priv.get( elem ); - - if ( !elemData || !(events = elemData.events) ) { - return; - } - - // Once for each type.namespace in types; type may be omitted - types = ( types || "" ).match( core_rnotwhite ) || [""]; - t = types.length; - while ( t-- ) { - tmp = rtypenamespace.exec( types[t] ) || []; - type = origType = tmp[1]; - namespaces = ( tmp[2] || "" ).split( "." ).sort(); - - // Unbind all events (on this namespace, if provided) for the element - if ( !type ) { - for ( type in events ) { - jQuery.event.remove( elem, type + types[ t ], handler, selector, true ); - } - continue; - } - - special = jQuery.event.special[ type ] || {}; - type = ( selector ? special.delegateType : special.bindType ) || type; - handlers = events[ type ] || []; - tmp = tmp[2] && new RegExp( "(^|\\.)" + namespaces.join("\\.(?:.*\\.|)") + "(\\.|$)" ); - - // Remove matching events - origCount = j = handlers.length; - while ( j-- ) { - handleObj = handlers[ j ]; - - if ( ( mappedTypes || origType === handleObj.origType ) && - ( !handler || handler.guid === handleObj.guid ) && - ( !tmp || tmp.test( handleObj.namespace ) ) && - ( !selector || selector === handleObj.selector || selector === "**" && handleObj.selector ) ) { - handlers.splice( j, 1 ); - - if ( handleObj.selector ) { - handlers.delegateCount--; - } - if ( special.remove ) { - special.remove.call( elem, handleObj ); - } - } - } - - // Remove generic event handler if we removed something and no more handlers exist - // (avoids potential for endless recursion during removal of special event handlers) - if ( origCount && !handlers.length ) { - if ( !special.teardown || special.teardown.call( elem, namespaces, elemData.handle ) === false ) { - jQuery.removeEvent( elem, type, elemData.handle ); - } - - delete events[ type ]; - } - } - - // Remove the expando if it's no longer used - if ( jQuery.isEmptyObject( events ) ) { - delete elemData.handle; - data_priv.remove( elem, "events" ); - } - }, - - trigger: function( event, data, elem, onlyHandlers ) { - - var i, cur, tmp, bubbleType, ontype, handle, special, - eventPath = [ elem || document ], - type = core_hasOwn.call( event, "type" ) ? event.type : event, - namespaces = core_hasOwn.call( event, "namespace" ) ? event.namespace.split(".") : []; - - cur = tmp = elem = elem || document; - - // Don't do events on text and comment nodes - if ( elem.nodeType === 3 || elem.nodeType === 8 ) { - return; - } - - // focus/blur morphs to focusin/out; ensure we're not firing them right now - if ( rfocusMorph.test( type + jQuery.event.triggered ) ) { - return; - } - - if ( type.indexOf(".") >= 0 ) { - // Namespaced trigger; create a regexp to match event type in handle() - namespaces = type.split("."); - type = namespaces.shift(); - namespaces.sort(); - } - ontype = type.indexOf(":") < 0 && "on" + type; - - // Caller can pass in a jQuery.Event object, Object, or just an event type string - event = event[ jQuery.expando ] ? - event : - new jQuery.Event( type, typeof event === "object" && event ); - - // Trigger bitmask: & 1 for native handlers; & 2 for jQuery (always true) - event.isTrigger = onlyHandlers ? 2 : 3; - event.namespace = namespaces.join("."); - event.namespace_re = event.namespace ? - new RegExp( "(^|\\.)" + namespaces.join("\\.(?:.*\\.|)") + "(\\.|$)" ) : - null; - - // Clean up the event in case it is being reused - event.result = undefined; - if ( !event.target ) { - event.target = elem; - } - - // Clone any incoming data and prepend the event, creating the handler arg list - data = data == null ? - [ event ] : - jQuery.makeArray( data, [ event ] ); - - // Allow special events to draw outside the lines - special = jQuery.event.special[ type ] || {}; - if ( !onlyHandlers && special.trigger && special.trigger.apply( elem, data ) === false ) { - return; - } - - // Determine event propagation path in advance, per W3C events spec (#9951) - // Bubble up to document, then to window; watch for a global ownerDocument var (#9724) - if ( !onlyHandlers && !special.noBubble && !jQuery.isWindow( elem ) ) { - - bubbleType = special.delegateType || type; - if ( !rfocusMorph.test( bubbleType + type ) ) { - cur = cur.parentNode; - } - for ( ; cur; cur = cur.parentNode ) { - eventPath.push( cur ); - tmp = cur; - } - - // Only add window if we got to document (e.g., not plain obj or detached DOM) - if ( tmp === (elem.ownerDocument || document) ) { - eventPath.push( tmp.defaultView || tmp.parentWindow || window ); - } - } - - // Fire handlers on the event path - i = 0; - while ( (cur = eventPath[i++]) && !event.isPropagationStopped() ) { - - event.type = i > 1 ? - bubbleType : - special.bindType || type; - - // jQuery handler - handle = ( data_priv.get( cur, "events" ) || {} )[ event.type ] && data_priv.get( cur, "handle" ); - if ( handle ) { - handle.apply( cur, data ); - } - - // Native handler - handle = ontype && cur[ ontype ]; - if ( handle && jQuery.acceptData( cur ) && handle.apply && handle.apply( cur, data ) === false ) { - event.preventDefault(); - } - } - event.type = type; - - // If nobody prevented the default action, do it now - if ( !onlyHandlers && !event.isDefaultPrevented() ) { - - if ( (!special._default || special._default.apply( eventPath.pop(), data ) === false) && - jQuery.acceptData( elem ) ) { - - // Call a native DOM method on the target with the same name name as the event. - // Don't do default actions on window, that's where global variables be (#6170) - if ( ontype && jQuery.isFunction( elem[ type ] ) && !jQuery.isWindow( elem ) ) { - - // Don't re-trigger an onFOO event when we call its FOO() method - tmp = elem[ ontype ]; - - if ( tmp ) { - elem[ ontype ] = null; - } - - // Prevent re-triggering of the same event, since we already bubbled it above - jQuery.event.triggered = type; - elem[ type ](); - jQuery.event.triggered = undefined; - - if ( tmp ) { - elem[ ontype ] = tmp; - } - } - } - } - - return event.result; - }, - - dispatch: function( event ) { - - // Make a writable jQuery.Event from the native event object - event = jQuery.event.fix( event ); - - var i, j, ret, matched, handleObj, - handlerQueue = [], - args = core_slice.call( arguments ), - handlers = ( data_priv.get( this, "events" ) || {} )[ event.type ] || [], - special = jQuery.event.special[ event.type ] || {}; - - // Use the fix-ed jQuery.Event rather than the (read-only) native event - args[0] = event; - event.delegateTarget = this; - - // Call the preDispatch hook for the mapped type, and let it bail if desired - if ( special.preDispatch && special.preDispatch.call( this, event ) === false ) { - return; - } - - // Determine handlers - handlerQueue = jQuery.event.handlers.call( this, event, handlers ); - - // Run delegates first; they may want to stop propagation beneath us - i = 0; - while ( (matched = handlerQueue[ i++ ]) && !event.isPropagationStopped() ) { - event.currentTarget = matched.elem; - - j = 0; - while ( (handleObj = matched.handlers[ j++ ]) && !event.isImmediatePropagationStopped() ) { - - // Triggered event must either 1) have no namespace, or - // 2) have namespace(s) a subset or equal to those in the bound event (both can have no namespace). - if ( !event.namespace_re || event.namespace_re.test( handleObj.namespace ) ) { - - event.handleObj = handleObj; - event.data = handleObj.data; - - ret = ( (jQuery.event.special[ handleObj.origType ] || {}).handle || handleObj.handler ) - .apply( matched.elem, args ); - - if ( ret !== undefined ) { - if ( (event.result = ret) === false ) { - event.preventDefault(); - event.stopPropagation(); - } - } - } - } - } - - // Call the postDispatch hook for the mapped type - if ( special.postDispatch ) { - special.postDispatch.call( this, event ); - } - - return event.result; - }, - - handlers: function( event, handlers ) { - var i, matches, sel, handleObj, - handlerQueue = [], - delegateCount = handlers.delegateCount, - cur = event.target; - - // Find delegate handlers - // Black-hole SVG instance trees (#13180) - // Avoid non-left-click bubbling in Firefox (#3861) - if ( delegateCount && cur.nodeType && (!event.button || event.type !== "click") ) { - - for ( ; cur !== this; cur = cur.parentNode || this ) { - - // Don't process clicks on disabled elements (#6911, #8165, #11382, #11764) - if ( cur.disabled !== true || event.type !== "click" ) { - matches = []; - for ( i = 0; i < delegateCount; i++ ) { - handleObj = handlers[ i ]; - - // Don't conflict with Object.prototype properties (#13203) - sel = handleObj.selector + " "; - - if ( matches[ sel ] === undefined ) { - matches[ sel ] = handleObj.needsContext ? - jQuery( sel, this ).index( cur ) >= 0 : - jQuery.find( sel, this, null, [ cur ] ).length; - } - if ( matches[ sel ] ) { - matches.push( handleObj ); - } - } - if ( matches.length ) { - handlerQueue.push({ elem: cur, handlers: matches }); - } - } - } - } - - // Add the remaining (directly-bound) handlers - if ( delegateCount < handlers.length ) { - handlerQueue.push({ elem: this, handlers: handlers.slice( delegateCount ) }); - } - - return handlerQueue; - }, - - // Includes some event props shared by KeyEvent and MouseEvent - 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( event, original ) { - - // Add which for key events - if ( event.which == null ) { - event.which = original.charCode != null ? original.charCode : original.keyCode; - } - - return event; - } - }, - - mouseHooks: { - props: "button buttons clientX clientY offsetX offsetY pageX pageY screenX screenY toElement".split(" "), - filter: function( event, original ) { - var eventDoc, doc, body, - button = original.button; - - // Calculate pageX/Y if missing and clientX/Y available - if ( event.pageX == null && original.clientX != null ) { - eventDoc = event.target.ownerDocument || document; - doc = eventDoc.documentElement; - body = eventDoc.body; - - event.pageX = original.clientX + ( doc && doc.scrollLeft || body && body.scrollLeft || 0 ) - ( doc && doc.clientLeft || body && body.clientLeft || 0 ); - event.pageY = original.clientY + ( doc && doc.scrollTop || body && body.scrollTop || 0 ) - ( doc && doc.clientTop || body && body.clientTop || 0 ); - } - - // Add which for click: 1 === left; 2 === middle; 3 === right - // Note: button is not normalized, so don't use it - if ( !event.which && button !== undefined ) { - event.which = ( button & 1 ? 1 : ( button & 2 ? 3 : ( button & 4 ? 2 : 0 ) ) ); - } - - return event; - } - }, - - fix: function( event ) { - if ( event[ jQuery.expando ] ) { - return event; - } - - // Create a writable copy of the event object and normalize some properties - var i, prop, copy, - type = event.type, - originalEvent = event, - fixHook = this.fixHooks[ type ]; - - if ( !fixHook ) { - this.fixHooks[ type ] = fixHook = - rmouseEvent.test( type ) ? this.mouseHooks : - rkeyEvent.test( type ) ? this.keyHooks : - {}; - } - copy = fixHook.props ? this.props.concat( fixHook.props ) : this.props; - - event = new jQuery.Event( originalEvent ); - - i = copy.length; - while ( i-- ) { - prop = copy[ i ]; - event[ prop ] = originalEvent[ prop ]; - } - - // Support: Cordova 2.5 (WebKit) (#13255) - // All events should have a target; Cordova deviceready doesn't - if ( !event.target ) { - event.target = document; - } - - // Support: Safari 6.0+, Chrome < 28 - // Target should not be a text node (#504, #13143) - if ( event.target.nodeType === 3 ) { - event.target = event.target.parentNode; - } - - return fixHook.filter? fixHook.filter( event, originalEvent ) : event; - }, - - special: { - load: { - // Prevent triggered image.load events from bubbling to window.load - noBubble: true - }, - focus: { - // Fire native event if possible so blur/focus sequence is correct - trigger: function() { - if ( this !== safeActiveElement() && this.focus ) { - this.focus(); - return false; - } - }, - delegateType: "focusin" - }, - blur: { - trigger: function() { - if ( this === safeActiveElement() && this.blur ) { - this.blur(); - return false; - } - }, - delegateType: "focusout" - }, - click: { - // For checkbox, fire native event so checked state will be right - trigger: function() { - if ( this.type === "checkbox" && this.click && jQuery.nodeName( this, "input" ) ) { - this.click(); - return false; - } - }, - - // For cross-browser consistency, don't fire native .click() on links - _default: function( event ) { - return jQuery.nodeName( event.target, "a" ); - } - }, - - beforeunload: { - postDispatch: function( event ) { - - // Support: Firefox 20+ - // Firefox doesn't alert if the returnValue field is not set. - if ( event.result !== undefined ) { - event.originalEvent.returnValue = event.result; - } - } - } - }, - - simulate: function( type, elem, event, bubble ) { - // Piggyback on a donor event to simulate a different one. - // Fake originalEvent to avoid donor's stopPropagation, but if the - // simulated event prevents default then we do the same on the donor. - var e = jQuery.extend( - new jQuery.Event(), - event, - { - type: type, - isSimulated: true, - originalEvent: {} - } - ); - if ( bubble ) { - jQuery.event.trigger( e, null, elem ); - } else { - jQuery.event.dispatch.call( elem, e ); - } - if ( e.isDefaultPrevented() ) { - event.preventDefault(); - } - } -}; - -jQuery.removeEvent = function( elem, type, handle ) { - if ( elem.removeEventListener ) { - elem.removeEventListener( type, handle, false ); - } -}; - -jQuery.Event = function( src, props ) { - // Allow instantiation without the 'new' keyword - if ( !(this instanceof jQuery.Event) ) { - return new jQuery.Event( src, props ); - } - - // Event object - if ( src && src.type ) { - this.originalEvent = src; - this.type = src.type; - - // Events bubbling up the document may have been marked as prevented - // by a handler lower down the tree; reflect the correct value. - this.isDefaultPrevented = ( src.defaultPrevented || - src.getPreventDefault && src.getPreventDefault() ) ? returnTrue : returnFalse; - - // Event type - } else { - this.type = src; - } - - // Put explicitly provided properties onto the event object - if ( props ) { - jQuery.extend( this, props ); - } - - // Create a timestamp if incoming event doesn't have one - this.timeStamp = src && src.timeStamp || jQuery.now(); - - // Mark it as fixed - this[ jQuery.expando ] = true; -}; - -// jQuery.Event is based on DOM3 Events as specified by the ECMAScript Language Binding -// http://www.w3.org/TR/2003/WD-DOM-Level-3-Events-20030331/ecma-script-binding.html -jQuery.Event.prototype = { - isDefaultPrevented: returnFalse, - isPropagationStopped: returnFalse, - isImmediatePropagationStopped: returnFalse, - - preventDefault: function() { - var e = this.originalEvent; - - this.isDefaultPrevented = returnTrue; - - if ( e && e.preventDefault ) { - e.preventDefault(); - } - }, - stopPropagation: function() { - var e = this.originalEvent; - - this.isPropagationStopped = returnTrue; - - if ( e && e.stopPropagation ) { - e.stopPropagation(); - } - }, - stopImmediatePropagation: function() { - this.isImmediatePropagationStopped = returnTrue; - this.stopPropagation(); - } -}; - -// Create mouseenter/leave events using mouseover/out and event-time checks -// Support: Chrome 15+ -jQuery.each({ - mouseenter: "mouseover", - mouseleave: "mouseout" -}, function( orig, fix ) { - jQuery.event.special[ orig ] = { - delegateType: fix, - bindType: fix, - - handle: function( event ) { - var ret, - target = this, - related = event.relatedTarget, - handleObj = event.handleObj; - - // For mousenter/leave call the handler if related is outside the target. - // NB: No relatedTarget if the mouse left/entered the browser window - if ( !related || (related !== target && !jQuery.contains( target, related )) ) { - event.type = handleObj.origType; - ret = handleObj.handler.apply( this, arguments ); - event.type = fix; - } - return ret; - } - }; -}); - -// Create "bubbling" focus and blur events -// Support: Firefox, Chrome, Safari -if ( !jQuery.support.focusinBubbles ) { - jQuery.each({ focus: "focusin", blur: "focusout" }, function( orig, fix ) { - - // Attach a single capturing handler while someone wants focusin/focusout - var attaches = 0, - handler = function( event ) { - jQuery.event.simulate( fix, event.target, jQuery.event.fix( event ), true ); - }; - - jQuery.event.special[ fix ] = { - setup: function() { - if ( attaches++ === 0 ) { - document.addEventListener( orig, handler, true ); - } - }, - teardown: function() { - if ( --attaches === 0 ) { - document.removeEventListener( orig, handler, true ); - } - } - }; - }); -} - -jQuery.fn.extend({ - - on: function( types, selector, data, fn, /*INTERNAL*/ one ) { - var origFn, type; - - // Types can be a map of types/handlers - if ( typeof types === "object" ) { - // ( types-Object, selector, data ) - if ( typeof selector !== "string" ) { - // ( types-Object, data ) - data = data || selector; - selector = undefined; - } - for ( type in types ) { - this.on( type, selector, data, types[ type ], one ); - } - return this; - } - - if ( data == null && fn == null ) { - // ( types, fn ) - fn = selector; - data = selector = undefined; - } else if ( fn == null ) { - if ( typeof selector === "string" ) { - // ( types, selector, fn ) - fn = data; - data = undefined; - } else { - // ( types, data, fn ) - fn = data; - data = selector; - selector = undefined; - } - } - if ( fn === false ) { - fn = returnFalse; - } else if ( !fn ) { - return this; - } - - if ( one === 1 ) { - origFn = fn; - fn = function( event ) { - // Can use an empty set, since event contains the info - jQuery().off( event ); - return origFn.apply( this, arguments ); - }; - // Use same guid so caller can remove using origFn - fn.guid = origFn.guid || ( origFn.guid = jQuery.guid++ ); - } - return this.each( function() { - jQuery.event.add( this, types, fn, data, selector ); - }); - }, - one: function( types, selector, data, fn ) { - return this.on( types, selector, data, fn, 1 ); - }, - off: function( types, selector, fn ) { - var handleObj, type; - if ( types && types.preventDefault && types.handleObj ) { - // ( event ) dispatched jQuery.Event - handleObj = types.handleObj; - jQuery( types.delegateTarget ).off( - handleObj.namespace ? handleObj.origType + "." + handleObj.namespace : handleObj.origType, - handleObj.selector, - handleObj.handler - ); - return this; - } - if ( typeof types === "object" ) { - // ( types-object [, selector] ) - for ( type in types ) { - this.off( type, selector, types[ type ] ); - } - return this; - } - if ( selector === false || typeof selector === "function" ) { - // ( types [, fn] ) - fn = selector; - selector = undefined; - } - if ( fn === false ) { - fn = returnFalse; - } - return this.each(function() { - jQuery.event.remove( this, types, fn, selector ); - }); - }, - - trigger: function( type, data ) { - return this.each(function() { - jQuery.event.trigger( type, data, this ); - }); - }, - triggerHandler: function( type, data ) { - var elem = this[0]; - if ( elem ) { - return jQuery.event.trigger( type, data, elem, true ); - } - } -}); -var isSimple = /^.[^:#\[\.,]*$/, - rparentsprev = /^(?:parents|prev(?:Until|All))/, - rneedsContext = jQuery.expr.match.needsContext, - // methods guaranteed to produce a unique set when starting from a unique set - guaranteedUnique = { - children: true, - contents: true, - next: true, - prev: true - }; - -jQuery.fn.extend({ - find: function( selector ) { - var i, - ret = [], - self = this, - len = self.length; - - if ( typeof selector !== "string" ) { - return this.pushStack( jQuery( selector ).filter(function() { - for ( i = 0; i < len; i++ ) { - if ( jQuery.contains( self[ i ], this ) ) { - return true; - } - } - }) ); - } - - for ( i = 0; i < len; i++ ) { - jQuery.find( selector, self[ i ], ret ); - } - - // Needed because $( selector, context ) becomes $( context ).find( selector ) - ret = this.pushStack( len > 1 ? jQuery.unique( ret ) : ret ); - ret.selector = this.selector ? this.selector + " " + selector : selector; - return ret; - }, - - has: function( target ) { - var targets = jQuery( target, this ), - l = targets.length; - - return this.filter(function() { - var i = 0; - for ( ; i < l; i++ ) { - if ( jQuery.contains( this, targets[i] ) ) { - return true; - } - } - }); - }, - - not: function( selector ) { - return this.pushStack( winnow(this, selector || [], true) ); - }, - - filter: function( selector ) { - return this.pushStack( winnow(this, selector || [], false) ); - }, - - is: function( selector ) { - return !!winnow( - this, - - // If this is a positional/relative selector, check membership in the returned set - // so $("p:first").is("p:last") won't return true for a doc with two "p". - typeof selector === "string" && rneedsContext.test( selector ) ? - jQuery( selector ) : - selector || [], - false - ).length; - }, - - closest: function( selectors, context ) { - var cur, - i = 0, - l = this.length, - matched = [], - pos = ( rneedsContext.test( selectors ) || typeof selectors !== "string" ) ? - jQuery( selectors, context || this.context ) : - 0; - - for ( ; i < l; i++ ) { - for ( cur = this[i]; cur && cur !== context; cur = cur.parentNode ) { - // Always skip document fragments - if ( cur.nodeType < 11 && (pos ? - pos.index(cur) > -1 : - - // Don't pass non-elements to Sizzle - cur.nodeType === 1 && - jQuery.find.matchesSelector(cur, selectors)) ) { - - cur = matched.push( cur ); - break; - } - } - } - - return this.pushStack( matched.length > 1 ? jQuery.unique( matched ) : matched ); - }, - - // Determine the position of an element within - // the matched set of elements - index: function( elem ) { - - // No argument, return index in parent - if ( !elem ) { - return ( this[ 0 ] && this[ 0 ].parentNode ) ? this.first().prevAll().length : -1; - } - - // index in selector - if ( typeof elem === "string" ) { - return core_indexOf.call( jQuery( elem ), this[ 0 ] ); - } - - // Locate the position of the desired element - return core_indexOf.call( this, - - // If it receives a jQuery object, the first element is used - elem.jquery ? elem[ 0 ] : elem - ); - }, - - add: function( selector, context ) { - var set = typeof selector === "string" ? - jQuery( selector, context ) : - jQuery.makeArray( selector && selector.nodeType ? [ selector ] : selector ), - all = jQuery.merge( this.get(), set ); - - return this.pushStack( jQuery.unique(all) ); - }, - - addBack: function( selector ) { - return this.add( selector == null ? - this.prevObject : this.prevObject.filter(selector) - ); - } -}); - -function sibling( cur, dir ) { - while ( (cur = cur[dir]) && cur.nodeType !== 1 ) {} - - return cur; -} - -jQuery.each({ - parent: function( elem ) { - var parent = elem.parentNode; - return parent && parent.nodeType !== 11 ? parent : null; - }, - parents: function( elem ) { - return jQuery.dir( elem, "parentNode" ); - }, - parentsUntil: function( elem, i, until ) { - return jQuery.dir( elem, "parentNode", until ); - }, - next: function( elem ) { - return sibling( elem, "nextSibling" ); - }, - prev: function( elem ) { - return sibling( elem, "previousSibling" ); - }, - nextAll: function( elem ) { - return jQuery.dir( elem, "nextSibling" ); - }, - prevAll: function( elem ) { - return jQuery.dir( elem, "previousSibling" ); - }, - nextUntil: function( elem, i, until ) { - return jQuery.dir( elem, "nextSibling", until ); - }, - prevUntil: function( elem, i, until ) { - return jQuery.dir( elem, "previousSibling", until ); - }, - siblings: function( elem ) { - return jQuery.sibling( ( elem.parentNode || {} ).firstChild, elem ); - }, - children: function( elem ) { - return jQuery.sibling( elem.firstChild ); - }, - contents: function( elem ) { - return elem.contentDocument || jQuery.merge( [], elem.childNodes ); - } -}, function( name, fn ) { - jQuery.fn[ name ] = function( until, selector ) { - var matched = jQuery.map( this, fn, until ); - - if ( name.slice( -5 ) !== "Until" ) { - selector = until; - } - - if ( selector && typeof selector === "string" ) { - matched = jQuery.filter( selector, matched ); - } - - if ( this.length > 1 ) { - // Remove duplicates - if ( !guaranteedUnique[ name ] ) { - jQuery.unique( matched ); - } - - // Reverse order for parents* and prev-derivatives - if ( rparentsprev.test( name ) ) { - matched.reverse(); - } - } - - return this.pushStack( matched ); - }; -}); - -jQuery.extend({ - filter: function( expr, elems, not ) { - var elem = elems[ 0 ]; - - if ( not ) { - expr = ":not(" + expr + ")"; - } - - return elems.length === 1 && elem.nodeType === 1 ? - jQuery.find.matchesSelector( elem, expr ) ? [ elem ] : [] : - jQuery.find.matches( expr, jQuery.grep( elems, function( elem ) { - return elem.nodeType === 1; - })); - }, - - dir: function( elem, dir, until ) { - var matched = [], - truncate = until !== undefined; - - while ( (elem = elem[ dir ]) && elem.nodeType !== 9 ) { - if ( elem.nodeType === 1 ) { - if ( truncate && jQuery( elem ).is( until ) ) { - break; - } - matched.push( elem ); - } - } - return matched; - }, - - sibling: function( n, elem ) { - var matched = []; - - for ( ; n; n = n.nextSibling ) { - if ( n.nodeType === 1 && n !== elem ) { - matched.push( n ); - } - } - - return matched; - } -}); - -// Implement the identical functionality for filter and not -function winnow( elements, qualifier, not ) { - if ( jQuery.isFunction( qualifier ) ) { - return jQuery.grep( elements, function( elem, i ) { - /* jshint -W018 */ - return !!qualifier.call( elem, i, elem ) !== not; - }); - - } - - if ( qualifier.nodeType ) { - return jQuery.grep( elements, function( elem ) { - return ( elem === qualifier ) !== not; - }); - - } - - if ( typeof qualifier === "string" ) { - if ( isSimple.test( qualifier ) ) { - return jQuery.filter( qualifier, elements, not ); - } - - qualifier = jQuery.filter( qualifier, elements ); - } - - return jQuery.grep( elements, function( elem ) { - return ( core_indexOf.call( qualifier, elem ) >= 0 ) !== not; - }); -} -var rxhtmlTag = /<(?!area|br|col|embed|hr|img|input|link|meta|param)(([\w:]+)[^>]*)\/>/gi, - rtagName = /<([\w:]+)/, - rhtml = /<|&#?\w+;/, - rnoInnerhtml = /<(?:script|style|link)/i, - manipulation_rcheckableType = /^(?:checkbox|radio)$/i, - // checked="checked" or checked - rchecked = /checked\s*(?:[^=]|=\s*.checked.)/i, - rscriptType = /^$|\/(?:java|ecma)script/i, - rscriptTypeMasked = /^true\/(.*)/, - rcleanScript = /^\s*\s*$/g, - - // We have to close these tags to support XHTML (#13200) - wrapMap = { - - // Support: IE 9 - option: [ 1, "" ], - - thead: [ 1, "", "
    " ], - col: [ 2, "", "
    " ], - tr: [ 2, "", "
    " ], - td: [ 3, "", "
    " ], - - _default: [ 0, "", "" ] - }; - -// Support: IE 9 -wrapMap.optgroup = wrapMap.option; - -wrapMap.tbody = wrapMap.tfoot = wrapMap.colgroup = wrapMap.caption = wrapMap.thead; -wrapMap.th = wrapMap.td; - -jQuery.fn.extend({ - text: function( value ) { - return jQuery.access( this, function( value ) { - return value === undefined ? - jQuery.text( this ) : - this.empty().append( ( this[ 0 ] && this[ 0 ].ownerDocument || document ).createTextNode( value ) ); - }, null, value, arguments.length ); - }, - - append: function() { - return this.domManip( arguments, function( elem ) { - if ( this.nodeType === 1 || this.nodeType === 11 || this.nodeType === 9 ) { - var target = manipulationTarget( this, elem ); - target.appendChild( elem ); - } - }); - }, - - prepend: function() { - return this.domManip( arguments, function( elem ) { - if ( this.nodeType === 1 || this.nodeType === 11 || this.nodeType === 9 ) { - var target = manipulationTarget( this, elem ); - target.insertBefore( elem, target.firstChild ); - } - }); - }, - - before: function() { - return this.domManip( arguments, function( elem ) { - if ( this.parentNode ) { - this.parentNode.insertBefore( elem, this ); - } - }); - }, - - after: function() { - return this.domManip( arguments, function( elem ) { - if ( this.parentNode ) { - this.parentNode.insertBefore( elem, this.nextSibling ); - } - }); - }, - - // keepData is for internal use only--do not document - remove: function( selector, keepData ) { - var elem, - elems = selector ? jQuery.filter( selector, this ) : this, - i = 0; - - for ( ; (elem = elems[i]) != null; i++ ) { - if ( !keepData && elem.nodeType === 1 ) { - jQuery.cleanData( getAll( elem ) ); - } - - if ( elem.parentNode ) { - if ( keepData && jQuery.contains( elem.ownerDocument, elem ) ) { - setGlobalEval( getAll( elem, "script" ) ); - } - elem.parentNode.removeChild( elem ); - } - } - - return this; - }, - - empty: function() { - var elem, - i = 0; - - for ( ; (elem = this[i]) != null; i++ ) { - if ( elem.nodeType === 1 ) { - - // Prevent memory leaks - jQuery.cleanData( getAll( elem, false ) ); - - // Remove any remaining nodes - elem.textContent = ""; - } - } - - return this; - }, - - clone: function( dataAndEvents, deepDataAndEvents ) { - dataAndEvents = dataAndEvents == null ? false : dataAndEvents; - deepDataAndEvents = deepDataAndEvents == null ? dataAndEvents : deepDataAndEvents; - - return this.map( function () { - return jQuery.clone( this, dataAndEvents, deepDataAndEvents ); - }); - }, - - html: function( value ) { - return jQuery.access( this, function( value ) { - var elem = this[ 0 ] || {}, - i = 0, - l = this.length; - - if ( value === undefined && elem.nodeType === 1 ) { - return elem.innerHTML; - } - - // See if we can take a shortcut and just use innerHTML - if ( typeof value === "string" && !rnoInnerhtml.test( value ) && - !wrapMap[ ( rtagName.exec( value ) || [ "", "" ] )[ 1 ].toLowerCase() ] ) { - - value = value.replace( rxhtmlTag, "<$1>" ); - - try { - for ( ; i < l; i++ ) { - elem = this[ i ] || {}; - - // Remove element nodes and prevent memory leaks - if ( elem.nodeType === 1 ) { - jQuery.cleanData( getAll( elem, false ) ); - elem.innerHTML = value; - } - } - - elem = 0; - - // If using innerHTML throws an exception, use the fallback method - } catch( e ) {} - } - - if ( elem ) { - this.empty().append( value ); - } - }, null, value, arguments.length ); - }, - - replaceWith: function() { - var - // Snapshot the DOM in case .domManip sweeps something relevant into its fragment - args = jQuery.map( this, function( elem ) { - return [ elem.nextSibling, elem.parentNode ]; - }), - i = 0; - - // Make the changes, replacing each context element with the new content - this.domManip( arguments, function( elem ) { - var next = args[ i++ ], - parent = args[ i++ ]; - - if ( parent ) { - // Don't use the snapshot next if it has moved (#13810) - if ( next && next.parentNode !== parent ) { - next = this.nextSibling; - } - jQuery( this ).remove(); - parent.insertBefore( elem, next ); - } - // Allow new content to include elements from the context set - }, true ); - - // Force removal if there was no new content (e.g., from empty arguments) - return i ? this : this.remove(); - }, - - detach: function( selector ) { - return this.remove( selector, true ); - }, - - domManip: function( args, callback, allowIntersection ) { - - // Flatten any nested arrays - args = core_concat.apply( [], args ); - - var fragment, first, scripts, hasScripts, node, doc, - i = 0, - l = this.length, - set = this, - iNoClone = l - 1, - value = args[ 0 ], - isFunction = jQuery.isFunction( value ); - - // We can't cloneNode fragments that contain checked, in WebKit - if ( isFunction || !( l <= 1 || typeof value !== "string" || jQuery.support.checkClone || !rchecked.test( value ) ) ) { - return this.each(function( index ) { - var self = set.eq( index ); - if ( isFunction ) { - args[ 0 ] = value.call( this, index, self.html() ); - } - self.domManip( args, callback, allowIntersection ); - }); - } - - if ( l ) { - fragment = jQuery.buildFragment( args, this[ 0 ].ownerDocument, false, !allowIntersection && this ); - first = fragment.firstChild; - - if ( fragment.childNodes.length === 1 ) { - fragment = first; - } - - if ( first ) { - scripts = jQuery.map( getAll( fragment, "script" ), disableScript ); - hasScripts = scripts.length; - - // Use the original fragment for the last item instead of the first because it can end up - // being emptied incorrectly in certain situations (#8070). - for ( ; i < l; i++ ) { - node = fragment; - - if ( i !== iNoClone ) { - node = jQuery.clone( node, true, true ); - - // Keep references to cloned scripts for later restoration - if ( hasScripts ) { - // Support: QtWebKit - // jQuery.merge because core_push.apply(_, arraylike) throws - jQuery.merge( scripts, getAll( node, "script" ) ); - } - } - - callback.call( this[ i ], node, i ); - } - - if ( hasScripts ) { - doc = scripts[ scripts.length - 1 ].ownerDocument; - - // Reenable scripts - jQuery.map( scripts, restoreScript ); - - // Evaluate executable scripts on first document insertion - for ( i = 0; i < hasScripts; i++ ) { - node = scripts[ i ]; - if ( rscriptType.test( node.type || "" ) && - !data_priv.access( node, "globalEval" ) && jQuery.contains( doc, node ) ) { - - if ( node.src ) { - // Hope ajax is available... - jQuery._evalUrl( node.src ); - } else { - jQuery.globalEval( node.textContent.replace( rcleanScript, "" ) ); - } - } - } - } - } - } - - return this; - } -}); - -jQuery.each({ - appendTo: "append", - prependTo: "prepend", - insertBefore: "before", - insertAfter: "after", - replaceAll: "replaceWith" -}, function( name, original ) { - jQuery.fn[ name ] = function( selector ) { - var elems, - ret = [], - insert = jQuery( selector ), - last = insert.length - 1, - i = 0; - - for ( ; i <= last; i++ ) { - elems = i === last ? this : this.clone( true ); - jQuery( insert[ i ] )[ original ]( elems ); - - // Support: QtWebKit - // .get() because core_push.apply(_, arraylike) throws - core_push.apply( ret, elems.get() ); - } - - return this.pushStack( ret ); - }; -}); - -jQuery.extend({ - clone: function( elem, dataAndEvents, deepDataAndEvents ) { - var i, l, srcElements, destElements, - clone = elem.cloneNode( true ), - inPage = jQuery.contains( elem.ownerDocument, elem ); - - // Support: IE >= 9 - // Fix Cloning issues - if ( !jQuery.support.noCloneChecked && ( elem.nodeType === 1 || elem.nodeType === 11 ) && !jQuery.isXMLDoc( elem ) ) { - - // We eschew Sizzle here for performance reasons: http://jsperf.com/getall-vs-sizzle/2 - destElements = getAll( clone ); - srcElements = getAll( elem ); - - for ( i = 0, l = srcElements.length; i < l; i++ ) { - fixInput( srcElements[ i ], destElements[ i ] ); - } - } - - // Copy the events from the original to the clone - if ( dataAndEvents ) { - if ( deepDataAndEvents ) { - srcElements = srcElements || getAll( elem ); - destElements = destElements || getAll( clone ); - - for ( i = 0, l = srcElements.length; i < l; i++ ) { - cloneCopyEvent( srcElements[ i ], destElements[ i ] ); - } - } else { - cloneCopyEvent( elem, clone ); - } - } - - // Preserve script evaluation history - destElements = getAll( clone, "script" ); - if ( destElements.length > 0 ) { - setGlobalEval( destElements, !inPage && getAll( elem, "script" ) ); - } - - // Return the cloned set - return clone; - }, - - buildFragment: function( elems, context, scripts, selection ) { - var elem, tmp, tag, wrap, contains, j, - i = 0, - l = elems.length, - fragment = context.createDocumentFragment(), - nodes = []; - - for ( ; i < l; i++ ) { - elem = elems[ i ]; - - if ( elem || elem === 0 ) { - - // Add nodes directly - if ( jQuery.type( elem ) === "object" ) { - // Support: QtWebKit - // jQuery.merge because core_push.apply(_, arraylike) throws - jQuery.merge( nodes, elem.nodeType ? [ elem ] : elem ); - - // Convert non-html into a text node - } else if ( !rhtml.test( elem ) ) { - nodes.push( context.createTextNode( elem ) ); - - // Convert html into DOM nodes - } else { - tmp = tmp || fragment.appendChild( context.createElement("div") ); - - // Deserialize a standard representation - tag = ( rtagName.exec( elem ) || ["", ""] )[ 1 ].toLowerCase(); - wrap = wrapMap[ tag ] || wrapMap._default; - tmp.innerHTML = wrap[ 1 ] + elem.replace( rxhtmlTag, "<$1>" ) + wrap[ 2 ]; - - // Descend through wrappers to the right content - j = wrap[ 0 ]; - while ( j-- ) { - tmp = tmp.lastChild; - } - - // Support: QtWebKit - // jQuery.merge because core_push.apply(_, arraylike) throws - jQuery.merge( nodes, tmp.childNodes ); - - // Remember the top-level container - tmp = fragment.firstChild; - - // Fixes #12346 - // Support: Webkit, IE - tmp.textContent = ""; - } - } - } - - // Remove wrapper from fragment - fragment.textContent = ""; - - i = 0; - while ( (elem = nodes[ i++ ]) ) { - - // #4087 - If origin and destination elements are the same, and this is - // that element, do not do anything - if ( selection && jQuery.inArray( elem, selection ) !== -1 ) { - continue; - } - - contains = jQuery.contains( elem.ownerDocument, elem ); - - // Append to fragment - tmp = getAll( fragment.appendChild( elem ), "script" ); - - // Preserve script evaluation history - if ( contains ) { - setGlobalEval( tmp ); - } - - // Capture executables - if ( scripts ) { - j = 0; - while ( (elem = tmp[ j++ ]) ) { - if ( rscriptType.test( elem.type || "" ) ) { - scripts.push( elem ); - } - } - } - } - - return fragment; - }, - - cleanData: function( elems ) { - var data, elem, events, type, key, j, - special = jQuery.event.special, - i = 0; - - for ( ; (elem = elems[ i ]) !== undefined; i++ ) { - if ( Data.accepts( elem ) ) { - key = elem[ data_priv.expando ]; - - if ( key && (data = data_priv.cache[ key ]) ) { - events = Object.keys( data.events || {} ); - if ( events.length ) { - for ( j = 0; (type = events[j]) !== undefined; j++ ) { - if ( special[ type ] ) { - jQuery.event.remove( elem, type ); - - // This is a shortcut to avoid jQuery.event.remove's overhead - } else { - jQuery.removeEvent( elem, type, data.handle ); - } - } - } - if ( data_priv.cache[ key ] ) { - // Discard any remaining `private` data - delete data_priv.cache[ key ]; - } - } - } - // Discard any remaining `user` data - delete data_user.cache[ elem[ data_user.expando ] ]; - } - }, - - _evalUrl: function( url ) { - return jQuery.ajax({ - url: url, - type: "GET", - dataType: "script", - async: false, - global: false, - "throws": true - }); - } -}); - -// Support: 1.x compatibility -// Manipulating tables requires a tbody -function manipulationTarget( elem, content ) { - return jQuery.nodeName( elem, "table" ) && - jQuery.nodeName( content.nodeType === 1 ? content : content.firstChild, "tr" ) ? - - elem.getElementsByTagName("tbody")[0] || - elem.appendChild( elem.ownerDocument.createElement("tbody") ) : - elem; -} - -// Replace/restore the type attribute of script elements for safe DOM manipulation -function disableScript( elem ) { - elem.type = (elem.getAttribute("type") !== null) + "/" + elem.type; - return elem; -} -function restoreScript( elem ) { - var match = rscriptTypeMasked.exec( elem.type ); - - if ( match ) { - elem.type = match[ 1 ]; - } else { - elem.removeAttribute("type"); - } - - return elem; -} - -// Mark scripts as having already been evaluated -function setGlobalEval( elems, refElements ) { - var l = elems.length, - i = 0; - - for ( ; i < l; i++ ) { - data_priv.set( - elems[ i ], "globalEval", !refElements || data_priv.get( refElements[ i ], "globalEval" ) - ); - } -} - -function cloneCopyEvent( src, dest ) { - var i, l, type, pdataOld, pdataCur, udataOld, udataCur, events; - - if ( dest.nodeType !== 1 ) { - return; - } - - // 1. Copy private data: events, handlers, etc. - if ( data_priv.hasData( src ) ) { - pdataOld = data_priv.access( src ); - pdataCur = data_priv.set( dest, pdataOld ); - events = pdataOld.events; - - if ( events ) { - delete pdataCur.handle; - pdataCur.events = {}; - - for ( type in events ) { - for ( i = 0, l = events[ type ].length; i < l; i++ ) { - jQuery.event.add( dest, type, events[ type ][ i ] ); - } - } - } - } - - // 2. Copy user data - if ( data_user.hasData( src ) ) { - udataOld = data_user.access( src ); - udataCur = jQuery.extend( {}, udataOld ); - - data_user.set( dest, udataCur ); - } -} - - -function getAll( context, tag ) { - var ret = context.getElementsByTagName ? context.getElementsByTagName( tag || "*" ) : - context.querySelectorAll ? context.querySelectorAll( tag || "*" ) : - []; - - return tag === undefined || tag && jQuery.nodeName( context, tag ) ? - jQuery.merge( [ context ], ret ) : - ret; -} - -// Support: IE >= 9 -function fixInput( src, dest ) { - var nodeName = dest.nodeName.toLowerCase(); - - // Fails to persist the checked state of a cloned checkbox or radio button. - if ( nodeName === "input" && manipulation_rcheckableType.test( src.type ) ) { - dest.checked = src.checked; - - // Fails to return the selected option to the default selected state when cloning options - } else if ( nodeName === "input" || nodeName === "textarea" ) { - dest.defaultValue = src.defaultValue; - } -} -jQuery.fn.extend({ - wrapAll: function( html ) { - var wrap; - - if ( jQuery.isFunction( html ) ) { - return this.each(function( i ) { - jQuery( this ).wrapAll( html.call(this, i) ); - }); - } - - if ( this[ 0 ] ) { - - // The elements to wrap the target around - wrap = jQuery( html, this[ 0 ].ownerDocument ).eq( 0 ).clone( true ); - - if ( this[ 0 ].parentNode ) { - wrap.insertBefore( this[ 0 ] ); - } - - wrap.map(function() { - var elem = this; - - while ( elem.firstElementChild ) { - elem = elem.firstElementChild; - } - - return elem; - }).append( this ); - } - - return this; - }, - - wrapInner: function( html ) { - if ( jQuery.isFunction( html ) ) { - return this.each(function( i ) { - jQuery( this ).wrapInner( html.call(this, i) ); - }); - } - - return this.each(function() { - var self = jQuery( this ), - contents = self.contents(); - - if ( contents.length ) { - contents.wrapAll( html ); - - } else { - self.append( html ); - } - }); - }, - - wrap: function( html ) { - var isFunction = jQuery.isFunction( html ); - - return this.each(function( i ) { - jQuery( this ).wrapAll( isFunction ? html.call(this, i) : html ); - }); - }, - - unwrap: function() { - return this.parent().each(function() { - if ( !jQuery.nodeName( this, "body" ) ) { - jQuery( this ).replaceWith( this.childNodes ); - } - }).end(); - } -}); -var curCSS, iframe, - // swappable if display is none or starts with table except "table", "table-cell", or "table-caption" - // see here for display values: https://developer.mozilla.org/en-US/docs/CSS/display - rdisplayswap = /^(none|table(?!-c[ea]).+)/, - rmargin = /^margin/, - rnumsplit = new RegExp( "^(" + core_pnum + ")(.*)$", "i" ), - rnumnonpx = new RegExp( "^(" + core_pnum + ")(?!px)[a-z%]+$", "i" ), - rrelNum = new RegExp( "^([+-])=(" + core_pnum + ")", "i" ), - elemdisplay = { BODY: "block" }, - - cssShow = { position: "absolute", visibility: "hidden", display: "block" }, - cssNormalTransform = { - letterSpacing: 0, - fontWeight: 400 - }, - - cssExpand = [ "Top", "Right", "Bottom", "Left" ], - cssPrefixes = [ "Webkit", "O", "Moz", "ms" ]; - -// return a css property mapped to a potentially vendor prefixed property -function vendorPropName( style, name ) { - - // shortcut for names that are not vendor prefixed - if ( name in style ) { - return name; - } - - // check for vendor prefixed names - var capName = name.charAt(0).toUpperCase() + name.slice(1), - origName = name, - i = cssPrefixes.length; - - while ( i-- ) { - name = cssPrefixes[ i ] + capName; - if ( name in style ) { - return name; - } - } - - return origName; -} - -function isHidden( elem, el ) { - // isHidden might be called from jQuery#filter function; - // in that case, element will be second argument - elem = el || elem; - return jQuery.css( elem, "display" ) === "none" || !jQuery.contains( elem.ownerDocument, elem ); -} - -// NOTE: we've included the "window" in window.getComputedStyle -// because jsdom on node.js will break without it. -function getStyles( elem ) { - return window.getComputedStyle( elem, null ); -} - -function showHide( elements, show ) { - var display, elem, hidden, - values = [], - index = 0, - length = elements.length; - - for ( ; index < length; index++ ) { - elem = elements[ index ]; - if ( !elem.style ) { - continue; - } - - values[ index ] = data_priv.get( elem, "olddisplay" ); - display = elem.style.display; - if ( show ) { - // Reset the inline display of this element to learn if it is - // being hidden by cascaded rules or not - if ( !values[ index ] && display === "none" ) { - elem.style.display = ""; - } - - // Set elements which have been overridden with display: none - // in a stylesheet to whatever the default browser style is - // for such an element - if ( elem.style.display === "" && isHidden( elem ) ) { - values[ index ] = data_priv.access( elem, "olddisplay", css_defaultDisplay(elem.nodeName) ); - } - } else { - - if ( !values[ index ] ) { - hidden = isHidden( elem ); - - if ( display && display !== "none" || !hidden ) { - data_priv.set( elem, "olddisplay", hidden ? display : jQuery.css(elem, "display") ); - } - } - } - } - - // Set the display of most of the elements in a second loop - // to avoid the constant reflow - for ( index = 0; index < length; index++ ) { - elem = elements[ index ]; - if ( !elem.style ) { - continue; - } - if ( !show || elem.style.display === "none" || elem.style.display === "" ) { - elem.style.display = show ? values[ index ] || "" : "none"; - } - } - - return elements; -} - -jQuery.fn.extend({ - css: function( name, value ) { - return jQuery.access( this, function( elem, name, value ) { - var styles, len, - map = {}, - i = 0; - - if ( jQuery.isArray( name ) ) { - styles = getStyles( elem ); - len = name.length; - - for ( ; i < len; i++ ) { - map[ name[ i ] ] = jQuery.css( elem, name[ i ], false, styles ); - } - - return map; - } - - return value !== undefined ? - jQuery.style( elem, name, value ) : - jQuery.css( elem, name ); - }, name, value, arguments.length > 1 ); - }, - show: function() { - return showHide( this, true ); - }, - hide: function() { - return showHide( this ); - }, - toggle: function( state ) { - if ( typeof state === "boolean" ) { - return state ? this.show() : this.hide(); - } - - return this.each(function() { - if ( isHidden( this ) ) { - jQuery( this ).show(); - } else { - jQuery( this ).hide(); - } - }); - } -}); - -jQuery.extend({ - // Add in style property hooks for overriding the default - // behavior of getting and setting a style property - cssHooks: { - opacity: { - get: function( elem, computed ) { - if ( computed ) { - // We should always get a number back from opacity - var ret = curCSS( elem, "opacity" ); - return ret === "" ? "1" : ret; - } - } - } - }, - - // Don't automatically add "px" to these possibly-unitless properties - cssNumber: { - "columnCount": true, - "fillOpacity": true, - "fontWeight": true, - "lineHeight": true, - "opacity": true, - "order": true, - "orphans": true, - "widows": true, - "zIndex": true, - "zoom": true - }, - - // Add in properties whose names you wish to fix before - // setting or getting the value - cssProps: { - // normalize float css property - "float": "cssFloat" - }, - - // Get and set the style property on a DOM Node - style: function( elem, name, value, extra ) { - // Don't set styles on text and comment nodes - if ( !elem || elem.nodeType === 3 || elem.nodeType === 8 || !elem.style ) { - return; - } - - // Make sure that we're working with the right name - var ret, type, hooks, - origName = jQuery.camelCase( name ), - style = elem.style; - - name = jQuery.cssProps[ origName ] || ( jQuery.cssProps[ origName ] = vendorPropName( style, origName ) ); - - // gets hook for the prefixed version - // followed by the unprefixed version - hooks = jQuery.cssHooks[ name ] || jQuery.cssHooks[ origName ]; - - // Check if we're setting a value - if ( value !== undefined ) { - type = typeof value; - - // convert relative number strings (+= or -=) to relative numbers. #7345 - if ( type === "string" && (ret = rrelNum.exec( value )) ) { - value = ( ret[1] + 1 ) * ret[2] + parseFloat( jQuery.css( elem, name ) ); - // Fixes bug #9237 - type = "number"; - } - - // Make sure that NaN and null values aren't set. See: #7116 - if ( value == null || type === "number" && isNaN( value ) ) { - return; - } - - // If a number was passed in, add 'px' to the (except for certain CSS properties) - if ( type === "number" && !jQuery.cssNumber[ origName ] ) { - value += "px"; - } - - // Fixes #8908, it can be done more correctly by specifying setters in cssHooks, - // but it would mean to define eight (for every problematic property) identical functions - if ( !jQuery.support.clearCloneStyle && value === "" && name.indexOf("background") === 0 ) { - style[ name ] = "inherit"; - } - - // If a hook was provided, use that value, otherwise just set the specified value - if ( !hooks || !("set" in hooks) || (value = hooks.set( elem, value, extra )) !== undefined ) { - style[ name ] = value; - } - - } else { - // If a hook was provided get the non-computed value from there - if ( hooks && "get" in hooks && (ret = hooks.get( elem, false, extra )) !== undefined ) { - return ret; - } - - // Otherwise just get the value from the style object - return style[ name ]; - } - }, - - css: function( elem, name, extra, styles ) { - var val, num, hooks, - origName = jQuery.camelCase( name ); - - // Make sure that we're working with the right name - name = jQuery.cssProps[ origName ] || ( jQuery.cssProps[ origName ] = vendorPropName( elem.style, origName ) ); - - // gets hook for the prefixed version - // followed by the unprefixed version - hooks = jQuery.cssHooks[ name ] || jQuery.cssHooks[ origName ]; - - // If a hook was provided get the computed value from there - if ( hooks && "get" in hooks ) { - val = hooks.get( elem, true, extra ); - } - - // Otherwise, if a way to get the computed value exists, use that - if ( val === undefined ) { - val = curCSS( elem, name, styles ); - } - - //convert "normal" to computed value - if ( val === "normal" && name in cssNormalTransform ) { - val = cssNormalTransform[ name ]; - } - - // Return, converting to number if forced or a qualifier was provided and val looks numeric - if ( extra === "" || extra ) { - num = parseFloat( val ); - return extra === true || jQuery.isNumeric( num ) ? num || 0 : val; - } - return val; - } -}); - -curCSS = function( elem, name, _computed ) { - var width, minWidth, maxWidth, - computed = _computed || getStyles( elem ), - - // Support: IE9 - // getPropertyValue is only needed for .css('filter') in IE9, see #12537 - ret = computed ? computed.getPropertyValue( name ) || computed[ name ] : undefined, - style = elem.style; - - if ( computed ) { - - if ( ret === "" && !jQuery.contains( elem.ownerDocument, elem ) ) { - ret = jQuery.style( elem, name ); - } - - // Support: Safari 5.1 - // A tribute to the "awesome hack by Dean Edwards" - // Safari 5.1.7 (at least) returns percentage for a larger set of values, but width seems to be reliably pixels - // this is against the CSSOM draft spec: http://dev.w3.org/csswg/cssom/#resolved-values - if ( rnumnonpx.test( ret ) && rmargin.test( name ) ) { - - // Remember the original values - width = style.width; - minWidth = style.minWidth; - maxWidth = style.maxWidth; - - // Put in the new values to get a computed value out - style.minWidth = style.maxWidth = style.width = ret; - ret = computed.width; - - // Revert the changed values - style.width = width; - style.minWidth = minWidth; - style.maxWidth = maxWidth; - } - } - - return ret; -}; - - -function setPositiveNumber( elem, value, subtract ) { - var matches = rnumsplit.exec( value ); - return matches ? - // Guard against undefined "subtract", e.g., when used as in cssHooks - Math.max( 0, matches[ 1 ] - ( subtract || 0 ) ) + ( matches[ 2 ] || "px" ) : - value; -} - -function augmentWidthOrHeight( elem, name, extra, isBorderBox, styles ) { - var i = extra === ( isBorderBox ? "border" : "content" ) ? - // If we already have the right measurement, avoid augmentation - 4 : - // Otherwise initialize for horizontal or vertical properties - name === "width" ? 1 : 0, - - val = 0; - - for ( ; i < 4; i += 2 ) { - // both box models exclude margin, so add it if we want it - if ( extra === "margin" ) { - val += jQuery.css( elem, extra + cssExpand[ i ], true, styles ); - } - - if ( isBorderBox ) { - // border-box includes padding, so remove it if we want content - if ( extra === "content" ) { - val -= jQuery.css( elem, "padding" + cssExpand[ i ], true, styles ); - } - - // at this point, extra isn't border nor margin, so remove border - if ( extra !== "margin" ) { - val -= jQuery.css( elem, "border" + cssExpand[ i ] + "Width", true, styles ); - } - } else { - // at this point, extra isn't content, so add padding - val += jQuery.css( elem, "padding" + cssExpand[ i ], true, styles ); - - // at this point, extra isn't content nor padding, so add border - if ( extra !== "padding" ) { - val += jQuery.css( elem, "border" + cssExpand[ i ] + "Width", true, styles ); - } - } - } - - return val; -} - -function getWidthOrHeight( elem, name, extra ) { - - // Start with offset property, which is equivalent to the border-box value - var valueIsBorderBox = true, - val = name === "width" ? elem.offsetWidth : elem.offsetHeight, - styles = getStyles( elem ), - isBorderBox = jQuery.support.boxSizing && jQuery.css( elem, "boxSizing", false, styles ) === "border-box"; - - // some non-html elements return undefined for offsetWidth, so check for null/undefined - // svg - https://bugzilla.mozilla.org/show_bug.cgi?id=649285 - // MathML - https://bugzilla.mozilla.org/show_bug.cgi?id=491668 - if ( val <= 0 || val == null ) { - // Fall back to computed then uncomputed css if necessary - val = curCSS( elem, name, styles ); - if ( val < 0 || val == null ) { - val = elem.style[ name ]; - } - - // Computed unit is not pixels. Stop here and return. - if ( rnumnonpx.test(val) ) { - return val; - } - - // we need the check for style in case a browser which returns unreliable values - // for getComputedStyle silently falls back to the reliable elem.style - valueIsBorderBox = isBorderBox && ( jQuery.support.boxSizingReliable || val === elem.style[ name ] ); - - // Normalize "", auto, and prepare for extra - val = parseFloat( val ) || 0; - } - - // use the active box-sizing model to add/subtract irrelevant styles - return ( val + - augmentWidthOrHeight( - elem, - name, - extra || ( isBorderBox ? "border" : "content" ), - valueIsBorderBox, - styles - ) - ) + "px"; -} - -// Try to determine the default display value of an element -function css_defaultDisplay( nodeName ) { - var doc = document, - display = elemdisplay[ nodeName ]; - - if ( !display ) { - display = actualDisplay( nodeName, doc ); - - // If the simple way fails, read from inside an iframe - if ( display === "none" || !display ) { - // Use the already-created iframe if possible - iframe = ( iframe || - jQuery("