From d5a61090dee8725e86c654285568122eb11285bd Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E7=BC=96=E7=A0=81=E7=8C=BF?= Date: Fri, 27 Sep 2024 00:52:52 +0800 Subject: [PATCH] first commit --- .gitignore | 23 + .pydio | 1 + Template/.gitignore | 7 + Template/.pydio | 1 + Template/CHANGES.md | 21 + Template/LICENSE | 201 + Template/README.md | 72 + Template/app.js | 11 + Template/config/.pydio | 1 + Template/config/index.js | 38 + Template/docs/.nojekyll | 0 Template/docs/.pydio | 1 + Template/docs/README.md | 49 + Template/docs/_coverpage.md | 12 + Template/docs/_media/.pydio | 1 + Template/docs/_media/img/.pydio | 1 + Template/docs/_media/img/favicon.ico | Bin 0 -> 9662 bytes Template/docs/_media/img/gen.svg | 343 + Template/docs/_media/img/wxpay.png | Bin 0 -> 111476 bytes Template/docs/_sidebar.md | 14 + Template/docs/becareful.md | 73 + Template/docs/code.md | 175 + Template/docs/index.html | 26 + Template/docs/install.md | 26 + Template/docs/team.md | 23 + Template/docs/use.md | 53 + Template/gulpfile.js | 202 + Template/package.json | 33 + Template/sh/.pydio | 1 + Template/sh/push.sh | 5 + Template/src/.pydio | 1 + Template/src/assets/.pydio | 1 + Template/src/assets/README.md | 5 + Template/src/assets/css/.pydio | 1 + Template/src/assets/css/layout.styl | 2 + Template/src/assets/css/page/.pydio | 1 + Template/src/assets/css/page/index.styl | 7 + Template/src/assets/css/public/.pydio | 1 + Template/src/assets/css/public/config.styl | 1 + Template/src/assets/css/public/lib.styl | 1 + Template/src/assets/css/public/reset.styl | 1 + Template/src/assets/font/.pydio | 1 + Template/src/assets/font/awesome.woff2 | Bin 0 -> 77160 bytes Template/src/assets/img/.pydio | 1 + Template/src/assets/img/gen.svg | 343 + Template/src/assets/js/.pydio | 1 + Template/src/assets/js/demo.js | 3 + Template/src/assets/js/jquery.js | 8829 ++++++++++++++++++++ Template/src/view/.pydio | 1 + Template/src/view/layout.jade | 26 + Template/src/view/main/.pydio | 1 + Template/src/view/main/README.md | 5 + Template/src/view/main/index.jade | 17 + Template/src/view/public/.pydio | 1 + Template/src/view/public/README.md | 5 + Template/src/view/public/footer.jade | 3 + Template/src/view/public/header.jade | 2 + Template/utils/.pydio | 1 + Template/utils/index.js | 119 + whtml-cli/.git-credentials | 1 + whtml-cli/.pydio | 1 + whtml-cli/README.md | 77 + whtml-cli/bin/.pydio | 1 + whtml-cli/bin/whtml | 8 + whtml-cli/bin/whtml-init | 50 + whtml-cli/bin/whtml-list | 13 + whtml-cli/index.js | 1 + whtml-cli/lib/.pydio | 1 + whtml-cli/lib/config.js | 8 + whtml-cli/lib/index.js | 74 + whtml-cli/package-lock.json | 586 ++ whtml-cli/package.json | 40 + 72 files changed, 11656 insertions(+) create mode 100644 .gitignore create mode 100644 .pydio create mode 100755 Template/.gitignore create mode 100644 Template/.pydio create mode 100755 Template/CHANGES.md create mode 100644 Template/LICENSE create mode 100755 Template/README.md create mode 100755 Template/app.js create mode 100644 Template/config/.pydio create mode 100755 Template/config/index.js create mode 100755 Template/docs/.nojekyll create mode 100644 Template/docs/.pydio create mode 100755 Template/docs/README.md create mode 100755 Template/docs/_coverpage.md create mode 100644 Template/docs/_media/.pydio create mode 100644 Template/docs/_media/img/.pydio create mode 100755 Template/docs/_media/img/favicon.ico create mode 100755 Template/docs/_media/img/gen.svg create mode 100755 Template/docs/_media/img/wxpay.png create mode 100755 Template/docs/_sidebar.md create mode 100755 Template/docs/becareful.md create mode 100755 Template/docs/code.md create mode 100755 Template/docs/index.html create mode 100755 Template/docs/install.md create mode 100755 Template/docs/team.md create mode 100755 Template/docs/use.md create mode 100755 Template/gulpfile.js create mode 100755 Template/package.json create mode 100644 Template/sh/.pydio create mode 100755 Template/sh/push.sh create mode 100644 Template/src/.pydio create mode 100644 Template/src/assets/.pydio create mode 100755 Template/src/assets/README.md create mode 100644 Template/src/assets/css/.pydio create mode 100755 Template/src/assets/css/layout.styl create mode 100644 Template/src/assets/css/page/.pydio create mode 100755 Template/src/assets/css/page/index.styl create mode 100644 Template/src/assets/css/public/.pydio create mode 100755 Template/src/assets/css/public/config.styl create mode 100755 Template/src/assets/css/public/lib.styl create mode 100755 Template/src/assets/css/public/reset.styl create mode 100644 Template/src/assets/font/.pydio create mode 100755 Template/src/assets/font/awesome.woff2 create mode 100644 Template/src/assets/img/.pydio create mode 100755 Template/src/assets/img/gen.svg create mode 100644 Template/src/assets/js/.pydio create mode 100755 Template/src/assets/js/demo.js create mode 100755 Template/src/assets/js/jquery.js create mode 100644 Template/src/view/.pydio create mode 100755 Template/src/view/layout.jade create mode 100644 Template/src/view/main/.pydio create mode 100755 Template/src/view/main/README.md create mode 100755 Template/src/view/main/index.jade create mode 100644 Template/src/view/public/.pydio create mode 100755 Template/src/view/public/README.md create mode 100755 Template/src/view/public/footer.jade create mode 100755 Template/src/view/public/header.jade create mode 100644 Template/utils/.pydio create mode 100755 Template/utils/index.js create mode 100755 whtml-cli/.git-credentials create mode 100644 whtml-cli/.pydio create mode 100755 whtml-cli/README.md create mode 100644 whtml-cli/bin/.pydio create mode 100755 whtml-cli/bin/whtml create mode 100755 whtml-cli/bin/whtml-init create mode 100755 whtml-cli/bin/whtml-list create mode 100755 whtml-cli/index.js create mode 100644 whtml-cli/lib/.pydio create mode 100755 whtml-cli/lib/config.js create mode 100755 whtml-cli/lib/index.js create mode 100755 whtml-cli/package-lock.json create mode 100755 whtml-cli/package.json diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..403adbc --- /dev/null +++ b/.gitignore @@ -0,0 +1,23 @@ +.DS_Store +node_modules +/dist + + +# local env files +.env.local +.env.*.local + +# Log files +npm-debug.log* +yarn-debug.log* +yarn-error.log* +pnpm-debug.log* + +# Editor directories and files +.idea +.vscode +*.suo +*.ntvs* +*.njsproj +*.sln +*.sw? diff --git a/.pydio b/.pydio new file mode 100644 index 0000000..1ac2ea8 --- /dev/null +++ b/.pydio @@ -0,0 +1 @@ +b1c3f8e7-f80c-49f3-9ffe-c9e1296ed01f \ No newline at end of file diff --git a/Template/.gitignore b/Template/.gitignore new file mode 100755 index 0000000..5baede2 --- /dev/null +++ b/Template/.gitignore @@ -0,0 +1,7 @@ +.DS_Store +node_modules/ +.git-credentials +npm-debug.log* +yarn-debug.log* +yarn-error.log* +package-lock.json* \ No newline at end of file diff --git a/Template/.pydio b/Template/.pydio new file mode 100644 index 0000000..5ef3c86 --- /dev/null +++ b/Template/.pydio @@ -0,0 +1 @@ +e90a6ca3-776a-4719-8af9-f7a80ab8b6dd \ No newline at end of file diff --git a/Template/CHANGES.md b/Template/CHANGES.md new file mode 100755 index 0000000..2dd6436 --- /dev/null +++ b/Template/CHANGES.md @@ -0,0 +1,21 @@ +## 1.1.7 +* 增加`sh`文件夹,实现在`Linux`系统上的一键提交代码至`git` +* 增加对`public`css文件和`font`文件的同步`src`删除操作 +* 增加对`public`中第三方css文件的编译支持 +* 增加对字体文件夹`font`的编译支持 +* 更改`less`为`stylus`,使语法更简洁美观 +* 增加更多的代码详细的代码注释,一目了然 + +## 1.1.6 +* `tinify` 速度实在太慢已去除这个模块,等白天我来自己写个。 +* 修改优化 gulp 代码,去除冗余! + +## 1.1.2 +* 这个模块`tinify`超过500次使用就要钱,所以正在开发自己的图片压缩插件(尽请期待..) +* 去除gulp-imagemin模块,增加 `tinify` 模块的自动图片压缩 + +## 1.0.2 +* 去除gulp.js图片压缩模块,因为这个模块问题太多用不了 +* 根据朋友建议增加对css编译的修改,page/ 文件合并,public/ 公共模块不合并 +* 根据朋友建议去除对 less,js,jade代码编译后的自动压缩 +* 增加更多源码注释 \ No newline at end of file diff --git a/Template/LICENSE b/Template/LICENSE new file mode 100644 index 0000000..261eeb9 --- /dev/null +++ b/Template/LICENSE @@ -0,0 +1,201 @@ + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + + 1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + + 2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + + 3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + + 4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + + 5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + + 6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + + 7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + + 8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + + 9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + + END OF TERMS AND CONDITIONS + + APPENDIX: How to apply the Apache License to your work. + + To apply the Apache License to your work, attach the following + boilerplate notice, with the fields enclosed by brackets "[]" + replaced with your own identifying information. (Don't include + the brackets!) The text should be enclosed in the appropriate + comment syntax for the file format. We also recommend that a + file or class name and description of purpose be included on the + same "printed page" as the copyright notice for easier + identification within third-party archives. + + Copyright [yyyy] [name of copyright owner] + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. diff --git a/Template/README.md b/Template/README.md new file mode 100755 index 0000000..5f14edf --- /dev/null +++ b/Template/README.md @@ -0,0 +1,72 @@ +

+

Node gulpjs expressjs

+ +## WHtml + +> 一款让你用更加丝滑更符合组件化思想的方式来编写传统前端HTML页面 +- 1: **脚手架地址:[whtml-cli](https://www.npmjs.com/package/whtml-cli)** +- 2: 文档地址:[Whtml](https://helpcode.github.io/Whtml/#/) +- 2: 创想工作室QQ群:[399041912](http://shang.qq.com/wpa/qunwpa?idkey=6311ead3dd326b975b76cb90590535973515776cf83d0854c0dc7b4a5c9cebfb) + + +## 介绍 + +当你在编写传统HTML页面的时候是否曾经遇到过静态页面众多导致html,css,ja代码过度冗余,将大部分时间花在不断的ctrl+c,ctrl+v上,是否想过能将传统静态页面的公共部分例如头部和底部分离出来,不需要每次的复制粘贴,是否想过css代码频繁重复为何不能像写JavaScript那样封装成函数直接调用。 + +是否想过省去每次写css3时需要手动去加浏览器前缀的烦恼等,是否不想让自己辛勤编码的成果被别人轻而易举的获取到。是否抱怨过美工给的素材太大等。。。? + + +为何我们不能换种方式来进行更加优雅自动化的编码,我们只关心核心页面的编写,其他一切交给程序帮助我们自动化实现? + + +## 特性 + +`WHtml`能够让你获得以下更加爽快的体验: + + +- 1: 将静态页面组件化模块化,降低重复代码的重复编写。 + +- 2: 基于Node.js + Gulp 自动化构建项目,让前端的你无缝对接 + +- 3: 采用jade + stylus,用更加简洁高效的方式去书写html和css + +- 4: 自动压缩合并编译html,css,JavaScript使的项目具备更加优秀的响应速度 + +- 5: 更加自由的框架配置和详细的中文代码注释,一键轻松配置源码实现定制化 + +- 6: 简洁明了的ES6+语法,代码赏心悦目,提升编码乐趣。 + +- 7: 程序实时编译同步你的每一行修改,删除,重命名,新建为你自动构建输出到 dist/,代码写完程序自动zip压缩打包,你需要做的是将zip发给你的后端即可。 + +- 9: ....等 + +更多的功能期待你的切身尝试! + +## 版本更新 + +- 1.1.7 +* 增加`sh`文件夹,实现在`Linux`系统上的一键提交代码至`git` +* 增加对`public`css文件和`font`文件的同步`src`删除操作 +* 增加对`public`中第三方css文件的编译支持 +* 增加对字体文件夹`font`的编译支持 +* 更改`less`为`stylus`,使语法更简洁美观 +* 增加更多的代码详细的代码注释,一目了然 + +- 1.1.6 +* `tinify` 速度实在太慢已去除这个模块,等白天我来自己写个。 +* 修改优化 gulp 代码,去除冗余! + +- 1.1.2 +* 这个模块`tinify`超过500次使用就要钱,所以正在开发自己的图片压缩插件(尽请期待..) +* 去除gulp-imagemin模块,增加 `tinify` 模块的自动图片压缩 + +- 1.0.2 +* 去除gulp.js图片压缩模块,因为这个模块问题太多用不了 +* 根据朋友建议增加对css编译的修改,page/ 文件合并,public/ 公共模块不合并 +* 根据朋友建议去除对 less,js,jade代码编译后的自动压缩 +* 增加更多源码注释 + +## 捐赠 + + +如果你觉得 `WHtml` 对你有帮助,或者想对我微小的工作一点资瓷,欢迎给我提建议。 \ No newline at end of file diff --git a/Template/app.js b/Template/app.js new file mode 100755 index 0000000..c7ad062 --- /dev/null +++ b/Template/app.js @@ -0,0 +1,11 @@ +// express 框架部分 +const express = require('express') +const app = express() +// 站点配置 +const config = require('./config') +// 工具函数 +const { OpenBrowser } = require('./utils') +// 核心,需要被 express 托管的静态资源文件路径 +app.use(express.static('./dist')) +// 监听 1314 端口,运行网站 +app.listen(config.nodeService.port, () => OpenBrowser() ); \ No newline at end of file diff --git a/Template/config/.pydio b/Template/config/.pydio new file mode 100644 index 0000000..3d92e05 --- /dev/null +++ b/Template/config/.pydio @@ -0,0 +1 @@ +aea4f241-7eed-4c98-bf2f-69f0b3d246e7 \ No newline at end of file diff --git a/Template/config/index.js b/Template/config/index.js new file mode 100755 index 0000000..a05fddb --- /dev/null +++ b/Template/config/index.js @@ -0,0 +1,38 @@ +/** + * 网站配置信息 + */ + +module.exports = { + jade: { + // jade -> html 需要监听转换的jade文件路径 + jadeTohtml: "./src/view/main/*.jade", + // html 输出的路径 + jadeTodist: "./dist/" + }, + styl: { + // 将 public/ 公共的 styl 文件直接编译在 dist/ 中生成对应的 + stylTocssPublic: "./src/assets/css/public/*.styl", + cssToDist: "", + // 将 page/ 中 styl 编译合并 + stylTocssPage: "./src/assets/css/layout.styl", + // styl 转换完成后,需要将多个文件合并成一个的文件名 + stylToFileName: "main.css", + // css 输出的路径 + stylTodist: "./dist/css/" + }, + watch: { + // gulp 需要监听的文件路径,当我们在src修改源码时,gulp会动态编译输出到dist + watchFile: "src/**/*" + }, + nodeService: { + // 访问ip + host: "http://127.0.0.1:", + // 访问端口 + port: 1314, + default: "about.html", + // 提示信息 + log: "app is run here: ", + // 是否开始自动打开浏览器功能,取值:true,false + isOpenBrowser: false + } +}; diff --git a/Template/docs/.nojekyll b/Template/docs/.nojekyll new file mode 100755 index 0000000..e69de29 diff --git a/Template/docs/.pydio b/Template/docs/.pydio new file mode 100644 index 0000000..7f2eaac --- /dev/null +++ b/Template/docs/.pydio @@ -0,0 +1 @@ +6a94895c-3a6d-4067-b249-c52d03b04bce \ No newline at end of file diff --git a/Template/docs/README.md b/Template/docs/README.md new file mode 100755 index 0000000..2f1da0c --- /dev/null +++ b/Template/docs/README.md @@ -0,0 +1,49 @@ +# WHtml + +> 一款让你用更加丝滑的方式来编写传统前端HTML页面 + +- 1: 文档地址:[Whtml](https://helpcode.github.io/Whtml/#/) +- 2: 创想工作室QQ群:[399041912](http://shang.qq.com/wpa/qunwpa?idkey=6311ead3dd326b975b76cb90590535973515776cf83d0854c0dc7b4a5c9cebfb) + +# 介绍 + +--- + +当你在编写传统HTML页面的时候是否曾经遇到过静态页面众多导致html,css,ja代码过度冗余,将大部分时间花在不断的ctrl+c,ctrl+v上,是否想过能将传统静态页面的公共部分例如头部和底部分离出来,不需要每次的复制粘贴,是否想过css代码频繁重复为何不能像写JavaScript那样封装成函数直接调用。 + +是否想过省去每次写css3时需要手动去加浏览器前缀的烦恼等,是否不想让自己辛勤编码的成果被别人轻而易举的获取到。是否抱怨过美工给的素材太大等。。。? + + +为何我们不能换种方式来进行更加优雅自动化的编码,我们只关心核心页面的编写,其他一切交给程序帮助我们自动化实现? + + +## 特性 + +`WHtml`能够让你获得以下更加爽快的体验: + +--- + +- 1: 将静态页面组件化模块化,降低重复代码的重复编写。 + +- 2: 基于Node.js + Gulp 自动化构建项目,让前端的你无缝对接 + +- 3: 采用jade + stylus,用更加简洁高效的方式去书写html和css + +- 4: 自动压缩合并编译html,css,JavaScript使的项目具备更加优秀的响应速度 + +- 5: 更加自由的框架配置和详细的中文代码注释,一键轻松配置源码实现定制化 + +- 6: 简洁明了的ES6+语法,代码赏心悦目,提升编码乐趣。 + +- 7: 程序实时编译同步你的每一行修改,删除,重命名,新建为你自动构建输出到 dist/,代码写完程序自动zip压缩打包,你需要做的是将zip发给你的后端即可。 + +- 9: ....等 + +更多的功能期待你的切身尝试! + + +## 捐赠 + +--- + +如果你觉得 `WHtml` 对你有帮助,或者想对我微小的工作一点资瓷,欢迎给我提建议。 \ No newline at end of file diff --git a/Template/docs/_coverpage.md b/Template/docs/_coverpage.md new file mode 100755 index 0000000..af1ad90 --- /dev/null +++ b/Template/docs/_coverpage.md @@ -0,0 +1,12 @@ +![logo](_media/img/gen.svg) + +# WHtml v1.1.0 + +> 一款自动化模块化的HTML页面编写框架 + +* 轻量小巧,编译丝滑 +* 免费开源 +* 适用强,高度订制 + +[GitHub](https://github.com/QingWei-Li/docsify/) +[开始](#WHtml) \ No newline at end of file diff --git a/Template/docs/_media/.pydio b/Template/docs/_media/.pydio new file mode 100644 index 0000000..4d2389b --- /dev/null +++ b/Template/docs/_media/.pydio @@ -0,0 +1 @@ +e1a88b3c-ca75-40a9-aebd-d20d2e27f4ee \ No newline at end of file diff --git a/Template/docs/_media/img/.pydio b/Template/docs/_media/img/.pydio new file mode 100644 index 0000000..8cdf708 --- /dev/null +++ b/Template/docs/_media/img/.pydio @@ -0,0 +1 @@ +61a5299c-304d-450b-88b2-bfc0b2d2b584 \ No newline at end of file diff --git a/Template/docs/_media/img/favicon.ico b/Template/docs/_media/img/favicon.ico new file mode 100755 index 0000000000000000000000000000000000000000..f5da35c6d0dba93ec016a04fec96e07790599bfc GIT binary patch literal 9662 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 M<3&lbdWZi10`3W^u>b%7 literal 0 HcmV?d00001 diff --git a/Template/docs/_media/img/gen.svg b/Template/docs/_media/img/gen.svg new file mode 100755 index 0000000..bace471 --- /dev/null +++ b/Template/docs/_media/img/gen.svg @@ -0,0 +1,343 @@ + + + + diff --git a/Template/docs/_media/img/wxpay.png b/Template/docs/_media/img/wxpay.png new file mode 100755 index 0000000000000000000000000000000000000000..ab07326441a562abea2f977217cbb3573d85763d GIT binary patch literal 111476 zcmeFY^;eeB)-{Zzbax{S(w)-MAgOdoHwea`i>SJ$94?u9q--T}JsNGNEhoF#s#k7OEPUiT=7OEDeB1Q_0r3ap z0JY*Tnz_xnrbfEPxuLJ*$;Na3(a|4v(cF4{2#?ij80QMrPuL0M({KEYn0u1O2F;Q< zdS7I{%#IyIRli0)Gz_b#K3X-CivRaRC!Vqk8T{YRdPF83`v3RIAqq77?@z@#;D!G8 z>&pEGw37e*23^qqe&K(s^uN;h-+B07*Z990`2TCGRPHi1#K%c0#MFWPzpYZ9r3_*6 z2{t@APpPiU*|nGzj4`Wr)_)mQCL-qjLEih;<21li5M4Zh4M~)!8Oj{*iK181g!ml{5;9U7ccD_VpaTY`Mde$cCosH4LH_4 z=dPwm*RhYPw`adjvg|J@zg?YluB~mrqdwWt&W000c`!RIxSzQWIP$PL2n?&CEC2oU z)`5|0W_|RORnGM=glUIj4*@Yg=Y7|Gv1|paDQB!N9# zA>(iC-16arlthe#tnn53h@$A|0F0st%3BnxadCg&{F{>|&#qpitPnTa6?^ zz{WOVXSYiW{S)nykF5eLE|AT`w%t$Ds+9M|nYD{{baR~)*OM6a_}<&@K~T9U)r`J~ zop3Z-H;BP;28ySVz~*HX{g99^+-1Zg{5s^ec=Vx4+Zktn0!Q&~p3agGiA_iQfV^L0 zhfFLn@ZG!KweyB-3?jX_+BYl3^{DlQ#TmVV(~npr79LpYwbng1&_3E~I5zKFa43RV z_6ej0To3MEt~yc6R^WsmPw$>i@0-CN<$BxVzAiTH_)1t|y=y42NV9^jXrx!i9bnPT zD!+AX+;nVQbWt7RiXnw)LWX?&5K;=kz!q;{J&iEP9VxV}`ee@*-j^cH^kxhl%q7=WQ~qzLL?6

yq`y&QsA>j`El1b+8bz!YLfk*%?v!ty(&%BRn~* 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 Ct0y)9 literal 0 HcmV?d00001 diff --git a/Template/docs/_sidebar.md b/Template/docs/_sidebar.md new file mode 100755 index 0000000..acfc462 --- /dev/null +++ b/Template/docs/_sidebar.md @@ -0,0 +1,14 @@ +* 基础 + + * [开始](install.md) + * [安装](becareful.md) + +* 架构设计 + + * [使用](use.md) + * [源码](code.md) + + +* 关于 + + * [关于(赞)](team.md) diff --git a/Template/docs/becareful.md b/Template/docs/becareful.md new file mode 100755 index 0000000..429cf40 --- /dev/null +++ b/Template/docs/becareful.md @@ -0,0 +1,73 @@ +## 环境准备 + +--- + +### windows + +首先安装最基本的Node.js环境,先去官网下载最新版的nodejs,记住根据你的操作系统和位数选择下载。 + +> 官网地址: [http://nodejs.cn/download/](http://nodejs.cn/download/) + +虽然在Windows上安装很简单,但是为了避免错误具体的安装过程参考这篇教程: + +[Node.js 安装配置 http://nodejs.cn/download/](http://nodejs.cn/download/) + +!> 注意:安装nodejs的路径杜绝使用中文,记住杜绝包含中文的路径!!! + +### Linux + +Linux下安装比Windows稍微麻烦一点点,这边安装方式很多。不推荐用`apt-get install xxx` 来安装,因为版本老旧。也不推荐下载文件然后改配置,个人感觉不好(你也可以选择这种方法)。 + +我这边推荐使用的方法是:**编译源码安装** + + +具体操作看这篇教程,不再累述: + +> [Linux安装Node.js(源码编译安装)](https://www.yiibai.com/html/node_js/2013/0826201.html) + +## 部署代码 + +--- + +上面的步骤很简单没有什么可说的,假设你已经完美安装成功,那么我们开始愉快的部署代码吧。 + +**1: 解决依赖** + +--- + +命令提示符界面输入命令 + +> npm install + +如果npm下载速度十分缓慢,请更换npm为cnpm,具体操作百度,太简单懒得详细说!! + +成功更换为cnpm后名称变为下面: + +> cnpm install + +OK,到这一步基本上我们的框架就可以被成功的运行起来来。 + + +## 运行代码 + +--- + +查看`package.json`文件中`scripts`字段,你可以通过命令: + +> npm run all + +来运行框架。 + +## 运行帮助文档 + +--- + +**如果你想查看网站的帮助文档,那么很简单,运行下面的命令即可:** + +> npm run doc + +## 自动提交 + +--- + +> npm run push \ No newline at end of file diff --git a/Template/docs/code.md b/Template/docs/code.md new file mode 100755 index 0000000..278d2cb --- /dev/null +++ b/Template/docs/code.md @@ -0,0 +1,175 @@ +## 源码分析 - package.json + +--- + +上面说过了,我们可以通过`npm run all`命令来运行框架。那么我们这边先从`package.json`开始分析,看看这行命令背后到底发生了哪些事情。 + +打开`package.json`你将看到下面这些代码: + +```bash +"scripts": { + "all": "node_modules/.bin/concurrently \" node_modules/.bin/node-dev app.js \" \"node_modules/.bin/gulp \" ", + "doc": "node_modules/.bin/docsify serve ./docs" +} +``` + +1:all :通过nodejs的 `concurrently` 模块来并发执行两条命令,其中`node-dev app.js`是用来启动`express`框架运行我们编译后产生的静态文件`dist/`。而`gulp`命令执行的是`gulpfile.js`中的默认任务`default` + +2:doc :通过 `docsify` 来运行我们网站的帮助文档,这里没有什么好说的。 + +--- + +我们框架的关键逻辑在`all`命令背后,通过上面知道`all`命令运行后会并发执行`node-dev app.js`,我们打开项目根目录下的`app.js`探究一下: + +```js +// express 框架部分 +const express = require('express') +const app = express() +// 站点配置 +const config = require('./config') +// 工具函数,OpenBrowser 自动打开浏览器 +const { OpenBrowser } = require('./utils') +// 核心,需要被 express 托管的静态资源文件路径,提供给前端访问静态页面 +app.use(express.static('./dist')) + +// 监听 1314 端口,运行网站 +app.listen(config.nodeService.port, () => OpenBrowser() ); +``` + +这部分源码注释很详细也很简单,没什么可说的吧,一看就懂。 + + +我们的核心应该在`gulp`命令背后,打开`gulpfile.js`文件,你将看到以下源码: + +```js +const gulp = require('gulp') +// 编译jade文件为hrml +const jade = require('gulp-jade') +// 编译stylus文件为css +const stylus = require('gulp-stylus') +// 自动为css3属性加前缀 +const autoprefixer = require('gulp-autoprefixer') +// 合并js,css文件 +const concat = require('gulp-concat') +// 压缩css +const cssmin = require('gulp-clean-css') +// gulp 文件监听 +const watchPath = require('gulp-watch-path') +// zip压缩 +const zip = require('gulp-zip') +// 压缩js文件 +const uglify = require('gulp-uglify') +// 处理gulp错误,防止程序报错终止 +const plumber = require('gulp-plumber') +// 引入gulp的配置文件 +const config = require('./config/index.js') +// 引入全局公共方法 +const { RemoveFile } = require('./utils') + +/** + * 编译jade为html + */ +gulp.task('jade', function() { + return gulp.src(config.jade.jadeTohtml) + .pipe(plumber({ errHandler: e => { + gutil.beep() + gutil.log(e) + }})) + .pipe(jade({ + pretty: true + })) + .pipe(gulp.dest(config.jade.jadeTodist)) +}) + + +... + +/** + * 监听用户在 src/ 的所有文件操作 + */ +gulp.task('file', function() { + gulp.watch(config.watch.watchFile, function(event) { + let paths = watchPath(event,'src/', 'Template/src/') + switch (event.type){ + case 'deleted': + console.log('删除操作...') + RemoveFile(paths.srcFilename) + break + default: + console.log('其他操作...') + gulp.run('publicstyl','copyfont','pagestyl','jade','copyjs','copyimg','Online') + break + } + }) + }) + + +/** + * 默认先运行一次 编译过程 + */ +gulp.run('publicstyl','copyfont','pagestyl','jade','copyjs','copyimg','Online') + + +/** + * 执行file任务,当文件被操作后进行相关的编译过程 + */ +gulp.task('default',['file']) +``` + +这边通过`gulp.watch`实现对`src/`文件夹进行监听,当用户修改被监听的`src/`文件夹里的文件后使用`gulp-watch-path`模块获得被修改文件的路径,然后判断`event.type`的操作类型,根据操作类型来进行对应的操作。 + +1:如果是在`src/`文件夹中的删除操作,那么调用`utils/index.js`里的方法`RemoveFile()`同步去删除对应被编译后的文件。 + +2:如果是其他操作例如修改,添加等,直接将进行重新编译输出到`dist/`中,保持在`src`中的修改被同步到`dist/`中。这一步就是我们最核心的页面逻辑了。其实也没什么,你会发现还是很简单的。 + +## 源码分析 - src/ + +--- + +`src`文件夹中是前端工程师真正需要关心的源码部分。 +- 1: `assets`是静态资源的存放。 +- 2: `view`是页面的存放。 +- 3: `main/`文件夹中存放主要的页面, +- 4: `public/`存放公共的页面组件,而`layout.jade`是页面的核心入口 + +## 源码分析 - 配置/ + +--- + +你可以在网站的`config/index.js`文件来修改基本配置,做到设置端口,打开url地址,是否自动打开浏览器等,具体配置信息如下: + +```js +module.exports = { + "jade":{ + // jade -> html 需要监听转换的jade文件路径 + "jadeTohtml": "./src/view/main/*.jade", + // html 输出的路径 + "jadeTodist": "./dist/" + }, + "styl":{ + // 将 public/ 公共的 styl 文件直接编译在 dist/ 中生成对应的 + "stylTocssPublic": "./src/assets/css/public/*.styl", + // 将 page/ 中 styl 编译合并 + "stylTocssPage": "./src/assets/css/layout.styl", + // styl 转换完成后,需要将多个文件合并成一个的文件名 + "stylToFileName":"main.css", + // css 输出的路径 + "stylTodist":"./dist/css/" + }, + "watch":{ + // gulp 需要监听的文件路径,当我们在src修改源码时,gulp会动态编译输出到dist + "watchFile":"src/**/*" + }, + "nodeService": { + // 访问ip + "host":"http://127.0.0.1:", + // 访问端口 + "port": 1314, + // 提示信息 + "log":"项目运行在:", + // 是否开始自动打开浏览器功能,取值:true,false + "isOpenBrowser": false + } +} +``` + diff --git a/Template/docs/index.html b/Template/docs/index.html new file mode 100755 index 0000000..6c2c5b0 --- /dev/null +++ b/Template/docs/index.html @@ -0,0 +1,26 @@ + + + + + WHtml + + + + + + + + +

+ + + + diff --git a/Template/docs/install.md b/Template/docs/install.md new file mode 100755 index 0000000..fba04c8 --- /dev/null +++ b/Template/docs/install.md @@ -0,0 +1,26 @@ +## 说明 + +--- + +拿到框源码后并不是直接双击HTML通过浏览器来运行,这边需要你根据我的文档说明做好基本的环境配置,然后来运行我们的框架。 + +请按照我制定的规范来编写前端HTML代码,其他只需要交由框架来帮你搞定一切,或许你不适应这种代码的编写方式甚至没听过所谓的html模板引擎,css预处理器,gulp自动化工具。 + +但你需要习惯这种开发方式,大的团队普遍适用的技术套路你真的有必要去学习,不要抱怨,逼着自己埋头苦练技术提升自己的能力才是最根本。 + +## 技术架构 + +--- + +- 1: 基于Node.js开发 +- 2: gulp作为自动化构建工具 +- 3: HTML模板引擎采用jade +- 4: stylus作为项目css的预编译器 +- 5: 使用express的来托管gulp编译后的dist/静态文件夹,启动nodejs服务器来访问静态网站查看效果。 +- 6: concurrently 实现命令的多条并发执行 +- 7: cli-color 实现终端命令行输出彩色信息 +- 8: 采用 node-dev ,当我们修改js文件后自动重启node进程 +- 9: open模块实现自动为你打开浏览器并运行我们的网站 +- 10: autoprefixer帮你自动解决css3特性的浏览器前缀问题 +- 11: minify-css,concat为你自动压缩美化合并多个css文件 +- 12: imagemin 实现图片的自动高清压缩 \ No newline at end of file diff --git a/Template/docs/team.md b/Template/docs/team.md new file mode 100755 index 0000000..76efc4c --- /dev/null +++ b/Template/docs/team.md @@ -0,0 +1,23 @@ +## 团队 + +--- + +我们的团队名叫`创想工作室`由一群热衷技术的小伙伴组成,欢迎加入创想工作室QQ群这里有同样热衷技术,也有很多正在学习过程中的小伙伴。 + +> 创想工作室(技术) + +## 源码下载 + +--- + +项目源码已经上传到github,感兴趣的同学可以去github下载代码,这里贴上地址: + +> [https://github.com/helpcode/Whtml](https://github.com/helpcode/Whtml) + +## 鸣谢感恩 + +--- + +十分感谢众多优秀开源的技术支持,众多开源技术的帮助才能让我们的项目编码更加方便。 + + diff --git a/Template/docs/use.md b/Template/docs/use.md new file mode 100755 index 0000000..88f772c --- /dev/null +++ b/Template/docs/use.md @@ -0,0 +1,53 @@ +## 目录解读 + +--- + +首先我们来看以下框架的文件层级结构,从宏观上了解以下框架的基本架构,然后我们在一一解读其具体的源码实现,目录结构图如下: + +```html +. +├── app.js #通过nodejs的web框架express来启动打包后的dist/静态网站 +├── config #基本信息配置,一般修改这里即可实现订制 +│   └── index.js +├── dist # gulp编译src产生的文件,我们写完静态页面需要交给后端的就是它 +├── docs # 框架的帮助文档 +├── gulpfile.js # 最核心的 gulp 配置文件,看不懂源码情况下不要修改 +├── Online.zip # gulp 自动zip打包 dist/ 文件夹产生的,直接将这个压缩包发给后端,省事 +├── package.json # 项目的基本核心配置,你懂的!看不懂源码情况下不要修改 +├── .gitignore #git 上传忽略文件配置 +├── CHANGES.md #版本更新日志 +├── README.md #帮助文档 +├── src # 核心源码,主要代码编写在这进行,在这的任何操作都会被同步映射更新到dist/ +│   ├── assets # 存放静态资源 +│   │   ├── css # css样式 +│   │   │   ├── layout.styl #css样式主入口,gulp将会从这里进行对css的编译打包 +│   │   │   ├── page #对应具体页面的css +│   │   │   │   ├── header.styl #公共头部样式 +│   │   │   │   └── index.styl #首页的样式 +│   │   │   └── public #全局公共的样式 +│   │   │   ├── colors.styl #全局css颜色的封装 +│   │   │   ├── lib.styl #全局css方法的封装 +| | | ├── reset.styl #清除浏览器默认样式 +│   │   ├── img #网站用到的图片 +│   │   │   └── gen.svg #测试用的图片[测试可删除] +│   │   └── js #存放js脚本 +│   │   ├── demo.js #index.jade 页面组件的私有js文件[测试可删除] +│   │   └── jquery.js #默认自带的 jquery +│   │   └── font #存放网站字体 +│   │   ├── awesome.woff2 #测试用的字体[测试可删除] +│   └── view #存放页面的视图jade +│   ├── layout.jade #页面试图的核心入口文件 +│   ├── main #存放主要的页面 +│   │   └── index.jade #首页 +│   └── public #公共页面组件 +│   ├── footer.jade #公共版权 +│   └── header.jade #公共头部 +└── utils #框架需要用的工具类 +│  └── index.js +└── sh #shell脚本 +   └── push.sh #自动提交代码到github + +``` + +仔细阅读上面对各个文件的作用的解释,这里很关键。 + diff --git a/Template/gulpfile.js b/Template/gulpfile.js new file mode 100755 index 0000000..8354f65 --- /dev/null +++ b/Template/gulpfile.js @@ -0,0 +1,202 @@ +const gulp = require('gulp') +// 编译jade文件为hrml +const jade = require('gulp-jade') +// 编译stylus文件为css +const stylus = require('gulp-stylus') +// 自动为css3属性加前缀 +const autoprefixer = require('gulp-autoprefixer') +// 合并js,css文件 +const concat = require('gulp-concat') +// 压缩css +const cssmin = require('gulp-clean-css') +// gulp 文件监听 +const watchPath = require('gulp-watch-path') +// zip压缩 +const zip = require('gulp-zip') +// 压缩js文件 +const uglify = require('gulp-uglify') +// 处理gulp错误,防止程序报错终止 +const plumber = require('gulp-plumber') +// 引入gulp的配置文件 +const config = require('./config/index.js') +// 引入全局公共方法 +const { RemoveFile } = require('./utils') + +const DistPublic = `${config.styl.stylTodist}public` + +/** + * 编译jade为html + */ +gulp.task('jade', function() { + return gulp.src(config.jade.jadeTohtml) + .pipe(plumber({ errHandler: e => { + gutil.beep() + gutil.log(e) + }})) + .pipe(jade({ + pretty: true + })) + .pipe(gulp.dest(config.jade.jadeTodist)) +}) + + +/** + * 编译公共页 css + */ +gulp.task('publicstyl', function() { + return gulp.src(config.styl.stylTocssPublic) + .pipe(plumber({ errHandler: e => { + gutil.beep() + gutil.log(e) + }})) + .pipe(stylus()) + .pipe(autoprefixer({ + browsers: ['last 2 versions','last 2 Explorer versions','Android >= 4.0'], + cascade: true + })) + /** + * 压缩兼容处理css文件,取消注释使用 + */ + // .pipe(cssmin({ + // advanced: false, + // compatibility: 'ie7', + // keepBreaks: false, + // keepSpecialComments: '*' + // })) + .pipe(gulp.dest(DistPublic)) +}) + + +/** + * 编译主要页面的 css,合并为main.css + */ +gulp.task('pagestyl', function() { + return gulp.src(config.styl.stylTocssPage) + .pipe(plumber({ errHandler: e => { + gutil.beep() + gutil.log(e) + }})) + .pipe(stylus()) + .pipe(autoprefixer({ + browsers: ['last 2 versions','last 2 Explorer versions','Android >= 4.0'], + cascade: true + })) + .pipe(concat(config.styl.stylToFileName)) + /** + * 同上 + */ + // .pipe(cssmin({ + // advanced: false, + // compatibility: 'ie7', + // keepBreaks: false, + // keepSpecialComments: '*' + // })) + .pipe(gulp.dest(`${config.styl.stylTodist}page`)) +}) + +/** + * 拷贝 public中的第三方css到dist文件夹 + */ +gulp.task('copycss',function(){ + return gulp.src('src/assets/css/public/*.css') + .pipe(plumber({ errHandler: e => { + gutil.beep() + gutil.log(e) + }})) + .pipe(cssmin({ + advanced: false, + compatibility: 'ie7', + keepBreaks: false, + keepSpecialComments: '*' + })) + .pipe(gulp.dest(DistPublic)) +}) + +/** + * 拷贝img 到dist文件夹 + */ +gulp.task('copyimg',function(){ + return gulp.src('src/assets/img/*') + .pipe(plumber({ errHandler: e => { + gutil.beep() + gutil.log(e) + }})) + .pipe(gulp.dest('dist/img')) +}) + +/** + * 拷贝字体文件 + */ +gulp.task('copyfont',function(){ + return gulp.src('src/assets/font/*') + .pipe(plumber({ errHandler: e => { + gutil.beep() + gutil.log(e) + }})) + .pipe(gulp.dest('dist/font')) +}) + + +/** + * 拷贝js文件 + */ +gulp.task('copyjs',function(){ + return gulp.src('src/assets/js/*') + .pipe(plumber({ errHandler: e => { + gutil.beep() + gutil.log(e) + }})) + /** + * 压缩js代码,取消注释启用 + */ + // .pipe(uglify({ + // compress: false + // })) + .pipe(gulp.dest('dist/js')) +}) + + +/** + * 自动zip打包 dist 文件夹,用于提交给后端 + */ +gulp.task('Online',function(){ + return gulp.src(['./dist/**']) + .pipe(plumber({ errHandler: e => { + gutil.beep() + gutil.log(e) + }})) + .pipe(zip('Online.zip')) + .pipe(gulp.dest('./')) +}) + + +/** + * 监听用户在 src/ 的所有文件操作 + */ +gulp.task('file', function() { + gulp.watch(config.watch.watchFile, function(event) { + let paths = watchPath(event,'src/', 'Template/src/') + switch (event.type){ + case 'deleted': + console.log('删除操作...') + RemoveFile(paths.srcFilename) + break + default: + console.log('其他操作...') + gulp.run('publicstyl','copyfont','pagestyl','jade','copyjs','copyimg','copycss','Online') + break + } + }) + }) + + +/** + * 默认先运行一次 编译过程 + */ +gulp.run('publicstyl','copyfont','pagestyl','jade','copyjs','copyimg','copycss','Online') + + +/** + * 执行file任务,当文件被操作后进行相关的编译过程 + */ +gulp.task('default',['file']) \ No newline at end of file diff --git a/Template/package.json b/Template/package.json new file mode 100755 index 0000000..0a891ab --- /dev/null +++ b/Template/package.json @@ -0,0 +1,33 @@ +{ + "name": "whtml", + "version": "1.2.8", + "description": "An HTML automatic compiler framework", + "main": "app.js", + "scripts": { + "all": "node_modules/.bin/concurrently \" node_modules/.bin/node-dev app.js \" \"node_modules/.bin/gulp \" ", + "doc": "node_modules/.bin/docsify serve ./docs", + "push": "./sh/push.sh" + }, + "keywords": [], + "author": "", + "license": "ISC", + "devDependencies": { + "cli-color": "^1.2.0", + "concurrently": "^3.5.1", + "docsify-cli": "^4.2.1", + "express": "^4.16.3", + "gulp": "^3.9.1", + "gulp-autoprefixer": "^5.0.0", + "gulp-clean-css": "^3.9.3", + "gulp-concat": "^2.6.1", + "gulp-jade": "^1.1.0", + "gulp-minify-css": "^1.2.4", + "gulp-plumber": "^1.2.0", + "gulp-stylus": "^2.7.0", + "gulp-uglify": "^3.0.0", + "gulp-watch-path": "^0.1.0", + "gulp-zip": "^4.1.0", + "node-dev": "^3.1.3", + "open": "0.0.5" + } +} diff --git a/Template/sh/.pydio b/Template/sh/.pydio new file mode 100644 index 0000000..512d0bf --- /dev/null +++ b/Template/sh/.pydio @@ -0,0 +1 @@ +bbb32e53-9bbc-4537-b22b-2be773a4553a \ No newline at end of file diff --git a/Template/sh/push.sh b/Template/sh/push.sh new file mode 100755 index 0000000..0a09995 --- /dev/null +++ b/Template/sh/push.sh @@ -0,0 +1,5 @@ +#!/bin/bash + +# 自动提交代码到 github,linux 系统才能使用 +message="shell的自动提交,更新记录查看CHANGES.md" +git add -A && git commit -m $message && git push \ No newline at end of file diff --git a/Template/src/.pydio b/Template/src/.pydio new file mode 100644 index 0000000..1508c13 --- /dev/null +++ b/Template/src/.pydio @@ -0,0 +1 @@ +e078f410-1610-4b9e-bbf4-963b92aaf5a3 \ No newline at end of file diff --git a/Template/src/assets/.pydio b/Template/src/assets/.pydio new file mode 100644 index 0000000..80a6525 --- /dev/null +++ b/Template/src/assets/.pydio @@ -0,0 +1 @@ +26506e85-84b3-4039-b85c-f999565a06e5 \ No newline at end of file diff --git a/Template/src/assets/README.md b/Template/src/assets/README.md new file mode 100755 index 0000000..801fa35 --- /dev/null +++ b/Template/src/assets/README.md @@ -0,0 +1,5 @@ +# 帮助信息,该文件可删除 + +--- + +## 存放网站主体静态资源,例如css,js,img,font \ No newline at end of file diff --git a/Template/src/assets/css/.pydio b/Template/src/assets/css/.pydio new file mode 100644 index 0000000..5206c76 --- /dev/null +++ b/Template/src/assets/css/.pydio @@ -0,0 +1 @@ +2ae432b7-8ee8-4fbd-981f-5687c5687aec \ No newline at end of file diff --git a/Template/src/assets/css/layout.styl b/Template/src/assets/css/layout.styl new file mode 100755 index 0000000..0f827ce --- /dev/null +++ b/Template/src/assets/css/layout.styl @@ -0,0 +1,2 @@ +// page 各个主页面用到的less必须在这里先被引用 +@import "page/index"; \ No newline at end of file diff --git a/Template/src/assets/css/page/.pydio b/Template/src/assets/css/page/.pydio new file mode 100644 index 0000000..9d6a909 --- /dev/null +++ b/Template/src/assets/css/page/.pydio @@ -0,0 +1 @@ +57a1e13f-f682-4b48-a7a3-8c9b72ef5e35 \ No newline at end of file diff --git a/Template/src/assets/css/page/index.styl b/Template/src/assets/css/page/index.styl new file mode 100755 index 0000000..3f466e5 --- /dev/null +++ b/Template/src/assets/css/page/index.styl @@ -0,0 +1,7 @@ +.index + h1 + color red + p + font-size 20px + + diff --git a/Template/src/assets/css/public/.pydio b/Template/src/assets/css/public/.pydio new file mode 100644 index 0000000..55ac09e --- /dev/null +++ b/Template/src/assets/css/public/.pydio @@ -0,0 +1 @@ +c3464317-13fd-44ca-aa3a-1d13e0faca43 \ No newline at end of file diff --git a/Template/src/assets/css/public/config.styl b/Template/src/assets/css/public/config.styl new file mode 100755 index 0000000..a2e1b03 --- /dev/null +++ b/Template/src/assets/css/public/config.styl @@ -0,0 +1 @@ +// 存放全局的颜色,布局,尺寸等配置,可删除 \ No newline at end of file diff --git a/Template/src/assets/css/public/lib.styl b/Template/src/assets/css/public/lib.styl new file mode 100755 index 0000000..acecaf4 --- /dev/null +++ b/Template/src/assets/css/public/lib.styl @@ -0,0 +1 @@ +// 存放全局的css方法,可删除 \ No newline at end of file diff --git a/Template/src/assets/css/public/reset.styl b/Template/src/assets/css/public/reset.styl new file mode 100755 index 0000000..92c72e3 --- /dev/null +++ b/Template/src/assets/css/public/reset.styl @@ -0,0 +1 @@ +// 清空默认样式,可删除 \ No newline at end of file diff --git a/Template/src/assets/font/.pydio b/Template/src/assets/font/.pydio new file mode 100644 index 0000000..573671b --- /dev/null +++ b/Template/src/assets/font/.pydio @@ -0,0 +1 @@ +0fa95758-9641-46d3-8ca0-34924b9afe7e \ No newline at end of file diff --git a/Template/src/assets/font/awesome.woff2 b/Template/src/assets/font/awesome.woff2 new file mode 100755 index 0000000000000000000000000000000000000000..4d13fc60404b91e398a37200c4a77b645cfd9586 GIT binary patch literal 77160 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 literal 0 HcmV?d00001 diff --git a/Template/src/assets/img/.pydio b/Template/src/assets/img/.pydio new file mode 100644 index 0000000..8908965 --- /dev/null +++ b/Template/src/assets/img/.pydio @@ -0,0 +1 @@ +f84b5704-b115-4780-a90d-ffd0826ba29d \ No newline at end of file diff --git a/Template/src/assets/img/gen.svg b/Template/src/assets/img/gen.svg new file mode 100755 index 0000000..bace471 --- /dev/null +++ b/Template/src/assets/img/gen.svg @@ -0,0 +1,343 @@ + + + + diff --git a/Template/src/assets/js/.pydio b/Template/src/assets/js/.pydio new file mode 100644 index 0000000..5f12814 --- /dev/null +++ b/Template/src/assets/js/.pydio @@ -0,0 +1 @@ +604b8161-e8a1-404b-bcda-22fd81c1c345 \ No newline at end of file diff --git a/Template/src/assets/js/demo.js b/Template/src/assets/js/demo.js new file mode 100755 index 0000000..e88fa6d --- /dev/null +++ b/Template/src/assets/js/demo.js @@ -0,0 +1,3 @@ +function demo(){ + alert('index.jade 组件独有的js') +} \ No newline at end of file diff --git a/Template/src/assets/js/jquery.js b/Template/src/assets/js/jquery.js new file mode 100755 index 0000000..ebc6c18 --- /dev/null +++ b/Template/src/assets/js/jquery.js @@ -0,0 +1,8829 @@ +/*! + * 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("