Neues Initialrelease mit IonicMaterial
This commit is contained in:
24
www/lib/jQuery/.bower.json
Normal file
24
www/lib/jQuery/.bower.json
Normal file
@@ -0,0 +1,24 @@
|
||||
{
|
||||
"name": "jquery",
|
||||
"version": "1.9.1",
|
||||
"description": "jQuery component",
|
||||
"keywords": [
|
||||
"jquery",
|
||||
"component"
|
||||
],
|
||||
"scripts": [
|
||||
"jquery.js"
|
||||
],
|
||||
"license": "MIT",
|
||||
"homepage": "https://github.com/jquery/jquery",
|
||||
"_release": "1.9.1",
|
||||
"_resolution": {
|
||||
"type": "version",
|
||||
"tag": "1.9.1",
|
||||
"commit": "d71f6a53927ad02d728503385d15539b73d21ac8"
|
||||
},
|
||||
"_source": "git://github.com/jquery/jquery.git",
|
||||
"_target": "1.9.1",
|
||||
"_originalSource": "jQuery",
|
||||
"_direct": true
|
||||
}
|
||||
43
www/lib/jQuery/.editorconfig
Normal file
43
www/lib/jQuery/.editorconfig
Normal file
@@ -0,0 +1,43 @@
|
||||
# This file is for unifying the coding style for different editors and IDEs
|
||||
# editorconfig.org
|
||||
|
||||
root = true
|
||||
|
||||
|
||||
[*]
|
||||
end_of_line = lf
|
||||
charset = utf-8
|
||||
trim_trailing_whitespace = true
|
||||
insert_final_newline = true
|
||||
|
||||
# Tabs in JS unless otherwise specified
|
||||
[**.js]
|
||||
indent_style = tab
|
||||
|
||||
[Makefile]
|
||||
indent_style = tab
|
||||
|
||||
|
||||
[speed/**.html]
|
||||
indent_style = tab
|
||||
|
||||
[speed/**.css]
|
||||
indent_style = tab
|
||||
|
||||
[speed/benchmarker.js]
|
||||
indent_style = space
|
||||
indent_size = 2
|
||||
|
||||
|
||||
[test/**.xml]
|
||||
indent_style = tab
|
||||
|
||||
[test/**.php]
|
||||
indent_style = tab
|
||||
|
||||
[test/**.html]
|
||||
indent_style = tab
|
||||
|
||||
[test/**.css]
|
||||
indent_style = space
|
||||
indent_size = 8
|
||||
2
www/lib/jQuery/.gitattributes
vendored
Normal file
2
www/lib/jQuery/.gitattributes
vendored
Normal file
@@ -0,0 +1,2 @@
|
||||
* eol=lf
|
||||
*.jar binary
|
||||
13
www/lib/jQuery/.gitignore
vendored
Normal file
13
www/lib/jQuery/.gitignore
vendored
Normal file
@@ -0,0 +1,13 @@
|
||||
src/selector.js
|
||||
dist
|
||||
.project
|
||||
.settings
|
||||
*~
|
||||
*.diff
|
||||
*.patch
|
||||
/*.html
|
||||
.DS_Store
|
||||
dist/.destination.json
|
||||
dist/.sizecache.json
|
||||
build/.sizecache.json
|
||||
node_modules
|
||||
6
www/lib/jQuery/.gitmodules
vendored
Normal file
6
www/lib/jQuery/.gitmodules
vendored
Normal file
@@ -0,0 +1,6 @@
|
||||
[submodule "src/sizzle"]
|
||||
path = src/sizzle
|
||||
url = git://github.com/jquery/sizzle.git
|
||||
[submodule "test/qunit"]
|
||||
path = test/qunit
|
||||
url = git://github.com/jquery/qunit.git
|
||||
14
www/lib/jQuery/.jshintrc
Normal file
14
www/lib/jQuery/.jshintrc
Normal file
@@ -0,0 +1,14 @@
|
||||
{
|
||||
"curly": true,
|
||||
"eqeqeq": true,
|
||||
"latedef": true,
|
||||
"noarg": true,
|
||||
"noempty": true,
|
||||
"quotmark": "double",
|
||||
"undef": true,
|
||||
"unused": true,
|
||||
"strict": true,
|
||||
"trailing": true,
|
||||
|
||||
"node": true
|
||||
}
|
||||
163
www/lib/jQuery/AUTHORS.txt
Normal file
163
www/lib/jQuery/AUTHORS.txt
Normal file
@@ -0,0 +1,163 @@
|
||||
Authors ordered by first contribution.
|
||||
|
||||
John Resig <jeresig@gmail.com>
|
||||
Gilles van den Hoven <gilles0181@gmail.com>
|
||||
Michael Geary <mike@geary.com>
|
||||
Stefan Petre <stefan.petre@gmail.com>
|
||||
Yehuda Katz <wycats@gmail.com>
|
||||
Corey Jewett <cj@syntheticplayground.com>
|
||||
Klaus Hartl <klaus.hartl@googlemail.com>
|
||||
Franck Marcia <franck.marcia@gmail.com>
|
||||
Jörn Zaefferer <joern.zaefferer@gmail.com>
|
||||
Paul Bakaus <paul.bakaus@googlemail.com>
|
||||
Brandon Aaron <brandon.aaron@gmail.com>
|
||||
Mike Alsup <malsup@gmail.com>
|
||||
Dave Methvin <dave.methvin@gmail.com>
|
||||
Ed Engelhardt <edengelhardt@gmail.com>
|
||||
Sean Catchpole <sean@sunsean.com>
|
||||
Paul Mclanahan <pmclanahan@gmail.com>
|
||||
David Serduke <davidserduke@gmail.com>
|
||||
Richard D. Worth <rdworth@gmail.com>
|
||||
Scott González <scott.gonzalez@gmail.com>
|
||||
Ariel Flesler <aflesler@gmail.com>
|
||||
Jon Evans <jon@springyweb.com>
|
||||
TJ Holowaychuk <tj@vision-media.ca>
|
||||
Michael Bensoussan <mickey@seesmic.com>
|
||||
Robert Katić <robert.katic@gmail.com>
|
||||
Louis-Rémi Babé <lrbabe@gmail.com>
|
||||
Earle Castledine <mrspeaker@gmail.com>
|
||||
Damian Janowski <damian.janowski@gmail.com>
|
||||
Rich Dougherty <rich@rd.gen.nz>
|
||||
Kim Dalsgaard <kim@kimdalsgaard.com>
|
||||
Andrea Giammarchi <andrea.giammarchi@gmail.com>
|
||||
Mark Gibson <jollytoad@gmail.com>
|
||||
Karl Swedberg <karl@englishrules.com>
|
||||
Justin Meyer <justinbmeyer@gmail.com>
|
||||
Ben Alman <cowboy@rj3.net>
|
||||
James Padolsey <cla@padolsey.net>
|
||||
David Petersen <public@petersendidit.com>
|
||||
Batiste Bieler <batiste@gmail.com>
|
||||
Alexander Farkas <info@corrupt-system.de>
|
||||
Rick Waldron <waldron.rick@gmail.com>
|
||||
Filipe Fortes <filipe@fortes.com>
|
||||
Neeraj Singh <neerajdotname@gmail.com>
|
||||
Paul Irish <paul.irish@gmail.com>
|
||||
Iraê Carvalho <irae@irae.pro.br>
|
||||
Matt Curry <matt@pseudocoder.com>
|
||||
Michael Monteleone <michael@michaelmonteleone.net>
|
||||
Noah Sloan <noah.sloan@gmail.com>
|
||||
Tom Viner <github@viner.tv>
|
||||
Douglas Neiner <doug@pixelgraphics.us>
|
||||
Adam J. Sontag <ajpiano@ajpiano.com>
|
||||
Dave Reed <dareed@microsoft.com>
|
||||
Ralph Whitbeck <ralph.whitbeck@gmail.com>
|
||||
Carl Fürstenberg <azatoth@gmail.com>
|
||||
Jacob Wright <jacwright@gmail.com>
|
||||
J. Ryan Stinnett <jryans@gmail.com>
|
||||
Heungsub Lee <h@subl.ee>
|
||||
Colin Snover <colin@alpha.zetafleet.com>
|
||||
Ryan W Tenney <ryan@10e.us>
|
||||
Ron Otten <r.j.g.otten@gmail.com>
|
||||
Jephte Clain <Jephte.Clain@univ-reunion.fr>
|
||||
Anton Matzneller <obhvsbypqghgc@gmail.com>
|
||||
Alex Sexton <AlexSexton@gmail.com>
|
||||
Dan Heberden <danheberden@gmail.com>
|
||||
Henri Wiechers <hwiechers@gmail.com>
|
||||
Russell Holbrook <russellholbrook@gmail.com>
|
||||
Julian Aubourg <aubourg.julian@gmail.com>
|
||||
Gianni Alessandro Chiappetta <gianni@runlevel6.org>
|
||||
Scott Jehl <scott@scottjehl.com>
|
||||
James Burke <jrburke@gmail.com>
|
||||
Jonas Pfenniger <jonas@pfenniger.name>
|
||||
Xavi Ramirez <xavi.rmz@gmail.com>
|
||||
Jared Grippe <jared@deadlyicon.com>
|
||||
Sylvester Keil <sylvester@keil.or.at>
|
||||
Brandon Sterne <bsterne@mozilla.com>
|
||||
Mathias Bynens <mathias@qiwi.be>
|
||||
Timmy Willison <timmywillisn@gmail.com>
|
||||
Corey Frang <gnarf@gnarf.net>
|
||||
Anton Kovalyov <anton@kovalyov.net>
|
||||
David Murdoch <musicisair@yahoo.com>
|
||||
Josh Varner <josh.varner@gmail.com>
|
||||
Charles McNulty <cmcnulty@kznf.com>
|
||||
Jordan Boesch <jboesch26@gmail.com>
|
||||
Jess Thrysoee <jess@thrysoee.dk>
|
||||
Michael Murray <m@murz.net>
|
||||
Lee Carpenter <elcarpie@gmail.com>
|
||||
Alexis Abril <me@alexisabril.com>
|
||||
Rob Morgan <robbym@gmail.com>
|
||||
John Firebaugh <john_firebaugh@bigfix.com>
|
||||
Sam Bisbee <sam@sbisbee.com>
|
||||
Gilmore Davidson <gilmoreorless@gmail.com>
|
||||
Brian Brennan <me@brianlovesthings.com>
|
||||
Xavier Montillet <xavierm02.net@gmail.com>
|
||||
Daniel Pihlstrom <sciolist.se@gmail.com>
|
||||
Sahab Yazdani <sahab.yazdani+github@gmail.com>
|
||||
Scott Hughes <shughes@atlassian.com>
|
||||
Mike Sherov <mike.sherov@gmail.com>
|
||||
Greg Hazel <ghazel@gmail.com>
|
||||
Schalk Neethling <schalk@ossreleasefeed.com>
|
||||
Denis Knauf <Denis.Knauf@gmail.com>
|
||||
Timo Tijhof <krinklemail@gmail.com>
|
||||
Steen Nielsen <swinedk@gmail.com>
|
||||
Anton Ryzhov <anton@ryzhov.me>
|
||||
Shi Chuan <shichuanr@gmail.com>
|
||||
Berker Peksag <berker.peksag@gmail.com>
|
||||
Toby Brain <tobyb@freshview.com>
|
||||
Matt Mueller <mattmuelle@gmail.com>
|
||||
Daniel Herman <daniel.c.herman@gmail.com>
|
||||
Oleg Gaidarenko <markelog@gmail.com>
|
||||
Richard Gibson <richard.gibson@gmail.com>
|
||||
Rafaël Blais Masson <rafbmasson@gmail.com>
|
||||
Joe Presbrey <presbrey@gmail.com>
|
||||
Sindre Sorhus <sindresorhus@gmail.com>
|
||||
Arne de Bree <arne@bukkie.nl>
|
||||
Vladislav Zarakovsky <vlad.zar@gmail.com>
|
||||
Andrew E Monat <amonat@gmail.com>
|
||||
Joao Henrique de Andrade Bruni <joaohbruni@yahoo.com.br>
|
||||
Dominik D. Geyer <dominik.geyer@gmail.com>
|
||||
Matt Farmer <matt@frmr.me>
|
||||
Trey Hunner <treyhunner@gmail.com>
|
||||
Jason Moon <jmoon@socialcast.com>
|
||||
Jeffery To <jeffery.to@gmail.com>
|
||||
Kris Borchers <kris.borchers@gmail.com>
|
||||
Vladimir Zhuravlev <private.face@gmail.com>
|
||||
Jacob Thornton <jacobthornton@gmail.com>
|
||||
Chad Killingsworth <chadkillingsworth@missouristate.edu>
|
||||
Nowres Rafid <nowres.rafed@gmail.com>
|
||||
David Benjamin <davidben@mit.edu>
|
||||
Uri Gilad <antishok@gmail.com>
|
||||
Chris Faulkner <thefaulkner@gmail.com>
|
||||
Elijah Manor <elijah.manor@gmail.com>
|
||||
Daniel Chatfield <chatfielddaniel@gmail.com>
|
||||
Nikita Govorov <nikita.govorov@gmail.com>
|
||||
Wesley Walser <wwalser@atlassian.com>
|
||||
Michael Pennisi <mike@mikepennisi.com>
|
||||
Markus Staab <markus.staab@redaxo.de>
|
||||
Benjamin Truyman <bentruyman@gmail.com>
|
||||
James Huston <james@jameshuston.net>
|
||||
Ismail Khair <ismail.khair@gmail.com>
|
||||
Carl Danley <carldanley@gmail.com>
|
||||
Michael Petrovich <michael.c.petrovich@gmail.com>
|
||||
Callum Macrae <callum@lynxphp.com>
|
||||
David Bonner <dbonner@cogolabs.com>
|
||||
Erick Ruiz de Chávez <erickrdch@gmail.com>
|
||||
Akintayo Akinwunmi <aakinwunmi@judge.com>
|
||||
Dave Riddle <david@joyvuu.com>
|
||||
Greg Lavallee <greglavallee@wapolabs.com>
|
||||
Daniel Gálvez <dgalvez@editablething.com>
|
||||
Sai Lung Wong <sai.wong@huffingtonpost.com>
|
||||
Tom H Fuertes <TomFuertes@gmail.com>
|
||||
Roland Eckl <eckl.roland@googlemail.com>
|
||||
Jay Merrifield <fracmak@gmail.com>
|
||||
Allen J Schmidt Jr <cobrasoft@gmail.com>
|
||||
Marcel Greter <marcel.greter@ocbnet.ch>
|
||||
Matthias Jäggli <matthias.jaeggli@gmail.com>
|
||||
Yiming He <yiminghe@gmail.com>
|
||||
Devin Cooper <cooper.semantics@gmail.com>
|
||||
Bennett Sorbo <bsorbo@gmail.com>
|
||||
Sebastian Burkhard <sebi.burkhard@gmail.com>
|
||||
Danil Somsikov <danilasomsikov@gmail.com>
|
||||
Jean Boussier <jean.boussier@gmail.com>
|
||||
Adam Coulombe <me@adam.co>
|
||||
Andrew Plummer <plummer.andrew@gmail.com>
|
||||
216
www/lib/jQuery/CONTRIBUTING.md
Normal file
216
www/lib/jQuery/CONTRIBUTING.md
Normal file
@@ -0,0 +1,216 @@
|
||||
# Contributing to jQuery
|
||||
|
||||
1. [Getting Involved](#getting-involved)
|
||||
2. [Discussion](#discussion)
|
||||
3. [How To Report Bugs](#how-to-report-bugs)
|
||||
4. [Core Style Guide](#jquery-core-style-guide)
|
||||
5. [Tips For Bug Patching](#tips-for-bug-patching)
|
||||
|
||||
|
||||
|
||||
## Getting Involved
|
||||
|
||||
There are a number of ways to get involved with the development of jQuery core. Even if you've never contributed code to an Open Source project before, we're always looking for help identifying bugs, writing and reducing test cases and documentation.
|
||||
|
||||
This is the best way to contribute to jQuery core. Please read through the full guide detailing [How to Report Bugs](#how-to-report-bugs).
|
||||
|
||||
## Discussion
|
||||
|
||||
### Forum and IRC
|
||||
|
||||
The jQuery core development team frequently tracks posts on the [jQuery Development Forum](http://forum.jquery.com/developing-jquery-core). If you have longer posts or questions please feel free to post them there. If you think you've found a bug please [file it in the bug tracker](#how-to-report-bugs).
|
||||
|
||||
Additionally most of the jQuery core development team can be found in the [#jquery-dev](http://webchat.freenode.net/?channels=jquery-dev) IRC channel on irc.freenode.net.
|
||||
|
||||
### Weekly Status Meetings
|
||||
|
||||
Every week (unless otherwise noted) the jQuery core dev team has a meeting to discuss the progress of current work and to bring forward possible new blocker bugs for discussion.
|
||||
|
||||
The meeting is held in the [#jquery-meeting](http://webchat.freenode.net/?channels=jquery-meeting) IRC channel on irc.freenode.net at [Noon EST](http://www.timeanddate.com/worldclock/fixedtime.html?month=1&day=17&year=2011&hour=12&min=0&sec=0&p1=43) on Mondays.
|
||||
|
||||
[Past Meeting Notes](https://docs.google.com/document/d/1MrLFvoxW7GMlH9KK-bwypn77cC98jUnz7sMW1rg_TP4/edit?hl=en)
|
||||
|
||||
|
||||
## How to Report Bugs
|
||||
|
||||
### Make sure it is a jQuery bug
|
||||
|
||||
Many bugs reported to our bug tracker are actually bugs in user code, not in jQuery code. Keep in mind that just because your code throws an error and the console points to a line number inside of jQuery, this does *not* mean the bug is a jQuery bug; more often than not, these errors result from providing incorrect arguments when calling a jQuery function.
|
||||
|
||||
If you are new to jQuery, it is usually a much better idea to ask for help first in the [Using jQuery Forum](http://forum.jquery.com/using-jquery) or the [jQuery IRC channel](http://webchat.freenode.net/?channels=%23jquery). You will get much quicker support, and you will help avoid tying up the jQuery team with invalid bug reports. These same resources can also be useful if you want to confirm that your bug is indeed a bug in jQuery before filing any tickets.
|
||||
|
||||
|
||||
### Disable any browser extensions
|
||||
|
||||
Make sure you have reproduced the bug with all browser extensions and add-ons disabled, as these can sometimes cause things to break in interesting and unpredictable ways. Try using incognito, stealth or anonymous browsing modes.
|
||||
|
||||
|
||||
### Try the latest version of jQuery
|
||||
|
||||
Bugs in old versions of jQuery may have already been fixed. In order to avoid reporting known issues, make sure you are always testing against the [latest build](http://code.jquery.com/jquery.js).
|
||||
|
||||
### Try an older version of jQuery
|
||||
|
||||
Sometimes, bugs are introduced in newer versions of jQuery that do not exist in previous versions. When possible, it can be useful to try testing with an older release.
|
||||
|
||||
### Reduce, reduce, reduce!
|
||||
|
||||
When you are experiencing a problem, the most useful thing you can possibly do is to [reduce your code](http://webkit.org/quality/reduction.html) to the bare minimum required to reproduce the issue. This makes it *much* easier to isolate and fix the offending code. Bugs that are reported without reduced test cases take on average 9001% longer to fix than bugs that are submitted with them, so you really should try to do this if at all possible.
|
||||
|
||||
## jQuery Core Style Guide
|
||||
|
||||
See: [jQuery Core Style Guide](http://docs.jquery.com/JQuery_Core_Style_Guidelines)
|
||||
|
||||
## Tips For Bug Patching
|
||||
|
||||
|
||||
### Environment: localhost w/ PHP, Node & Grunt
|
||||
|
||||
Starting in jQuery 1.8, a newly overhauled development workflow has been introduced. In this new system, we rely on node & gruntjs to automate the building and validation of source code—while you write code.
|
||||
|
||||
The Ajax tests still depend on PHP running locally*, so make sure you have the following installed:
|
||||
|
||||
* Some kind of localhost server program that supports PHP (any will do)
|
||||
* Node.js
|
||||
* NPM (comes with the latest version of Node.js)
|
||||
* Grunt (install with: `npm install grunt -g`
|
||||
|
||||
|
||||
Maintaining a list of platform specific instructions is outside of the scope of this document and there is plenty of existing documentation for the above technologies.
|
||||
|
||||
* The PHP dependency will soon be shed in favor of an all-node solution.
|
||||
|
||||
|
||||
### Build a Local Copy of jQuery
|
||||
|
||||
Create a fork of the jQuery repo on github at http://github.com/jquery/jquery
|
||||
|
||||
Change directory to your web root directory, whatever that might be:
|
||||
|
||||
```bash
|
||||
$ cd /path/to/your/www/root/
|
||||
```
|
||||
|
||||
Clone your jQuery fork to work locally
|
||||
|
||||
```bash
|
||||
$ git clone git@github.com:username/jquery.git
|
||||
```
|
||||
|
||||
Change directory to the newly created dir jquery/
|
||||
|
||||
```bash
|
||||
$ cd jquery
|
||||
```
|
||||
|
||||
Add the jQuery master as a remote. I label mine "upstream"
|
||||
|
||||
```bash
|
||||
$ git remote add upstream git://github.com/jquery/jquery.git
|
||||
```
|
||||
|
||||
Get in the habit of pulling in the "upstream" master to stay up to date as jQuery receives new commits
|
||||
|
||||
```bash
|
||||
$ git pull upstream master
|
||||
```
|
||||
|
||||
Run the Grunt tools:
|
||||
|
||||
```bash
|
||||
$ grunt && grunt watch
|
||||
```
|
||||
|
||||
Now open the jQuery test suite in a browser at http://localhost/test. If there is a port, be sure to include it.
|
||||
|
||||
Success! You just built and tested jQuery!
|
||||
|
||||
|
||||
### Fix a bug from a ticket filed at bugs.jquery.com:
|
||||
|
||||
**NEVER write your patches to the master branch** - it gets messy (I say this from experience!)
|
||||
|
||||
**ALWAYS USE A "TOPIC" BRANCH!** Like so (#### = the ticket #)...
|
||||
|
||||
Make sure you start with your up-to-date master:
|
||||
|
||||
```bash
|
||||
$ git checkout master
|
||||
```
|
||||
|
||||
Create and checkout a new branch that includes the ticket #
|
||||
|
||||
```bash
|
||||
$ git checkout -b bug_####
|
||||
|
||||
# ( Explanation: this useful command will:
|
||||
# "checkout" a "-b" (branch) by the name of "bug_####"
|
||||
# or create it if it doesn't exist )
|
||||
```
|
||||
|
||||
Now you're on branch: bug_####
|
||||
|
||||
Determine the module/file you'll be working in...
|
||||
|
||||
Open up the corresponding /test/unit/?????.js and add the initial failing unit tests. This may seem awkward at first, but in the long run it will make sense. To truly and efficiently patch a bug, you need to be working against that bug.
|
||||
|
||||
Next, open the module files and make your changes
|
||||
|
||||
Run http://localhost/test --> **ALL TESTS MUST PASS**
|
||||
|
||||
Once you're satisfied with your patch...
|
||||
|
||||
Stage the files to be tracked:
|
||||
|
||||
```bash
|
||||
$ git add filename
|
||||
# (you can use "git status" to list the files you've changed)
|
||||
```
|
||||
|
||||
|
||||
( I recommend NEVER, EVER using "git add . " )
|
||||
|
||||
Once you've staged all of your changed files, go ahead and commit them
|
||||
|
||||
```bash
|
||||
$ git commit -m "Brief description of fix. Fixes #0000"
|
||||
```
|
||||
|
||||
For a multiple line commit message, leave off the `-m "description"`.
|
||||
|
||||
You will then be led into vi (or the text editor that you have set up) to complete your commit message.
|
||||
|
||||
Then, push your branch with the bug fix commits to your github fork
|
||||
|
||||
```bash
|
||||
$ git push origin -u bug_####
|
||||
```
|
||||
|
||||
Before you tackle your next bug patch, return to the master:
|
||||
|
||||
```bash
|
||||
$ git checkout master
|
||||
```
|
||||
|
||||
|
||||
|
||||
### Test Suite Tips...
|
||||
|
||||
During the process of writing your patch, you will run the test suite MANY times. You can speed up the process by narrowing the running test suite down to the module you are testing by either double clicking the title of the test or appending it to the url. The following examples assume you're working on a local repo, hosted on your localhost server.
|
||||
|
||||
Example:
|
||||
|
||||
http://localhost/test/?filter=css
|
||||
|
||||
This will only run the "css" module tests. This will significantly speed up your development and debugging.
|
||||
|
||||
**ALWAYS RUN THE FULL SUITE BEFORE COMMITTING AND PUSHING A PATCH!**
|
||||
|
||||
|
||||
### jQuery supports the following browsers:
|
||||
|
||||
* Chrome Current-1
|
||||
* Safari Current-1
|
||||
* Firefox Current-1
|
||||
* IE 6+
|
||||
* Opera Current-1
|
||||
496
www/lib/jQuery/Gruntfile.js
Normal file
496
www/lib/jQuery/Gruntfile.js
Normal file
@@ -0,0 +1,496 @@
|
||||
module.exports = function( grunt ) {
|
||||
|
||||
"use strict";
|
||||
|
||||
var distpaths = [
|
||||
"dist/jquery.js",
|
||||
"dist/jquery.min.map",
|
||||
"dist/jquery.min.js"
|
||||
],
|
||||
readOptionalJSON = function( filepath ) {
|
||||
var data = {};
|
||||
try {
|
||||
data = grunt.file.readJSON( filepath );
|
||||
} catch(e) {}
|
||||
return data;
|
||||
};
|
||||
|
||||
grunt.initConfig({
|
||||
pkg: grunt.file.readJSON("package.json"),
|
||||
dst: readOptionalJSON("dist/.destination.json"),
|
||||
compare_size: {
|
||||
files: distpaths
|
||||
},
|
||||
selector: {
|
||||
destFile: "src/selector.js",
|
||||
apiFile: "src/sizzle-jquery.js",
|
||||
srcFile: "src/sizzle/sizzle.js"
|
||||
},
|
||||
build: {
|
||||
all:{
|
||||
dest: "dist/jquery.js",
|
||||
src: [
|
||||
"src/intro.js",
|
||||
"src/core.js",
|
||||
"src/callbacks.js",
|
||||
"src/deferred.js",
|
||||
"src/support.js",
|
||||
"src/data.js",
|
||||
"src/queue.js",
|
||||
"src/attributes.js",
|
||||
"src/event.js",
|
||||
"src/selector.js",
|
||||
"src/traversing.js",
|
||||
"src/manipulation.js",
|
||||
|
||||
{ flag: "css", src: "src/css.js" },
|
||||
"src/serialize.js",
|
||||
{ flag: "event-alias", src: "src/event-alias.js" },
|
||||
{ flag: "ajax", src: "src/ajax.js" },
|
||||
{ flag: "ajax/script", src: "src/ajax/script.js", needs: ["ajax"] },
|
||||
{ flag: "ajax/jsonp", src: "src/ajax/jsonp.js", needs: [ "ajax", "ajax/script" ] },
|
||||
{ flag: "ajax/xhr", src: "src/ajax/xhr.js", needs: ["ajax"] },
|
||||
{ flag: "effects", src: "src/effects.js", needs: ["css"] },
|
||||
{ flag: "offset", src: "src/offset.js", needs: ["css"] },
|
||||
{ flag: "dimensions", src: "src/dimensions.js", needs: ["css"] },
|
||||
{ flag: "deprecated", src: "src/deprecated.js" },
|
||||
|
||||
"src/exports.js",
|
||||
"src/outro.js"
|
||||
]
|
||||
}
|
||||
},
|
||||
|
||||
jshint: {
|
||||
dist: {
|
||||
src: [ "dist/jquery.js" ],
|
||||
options: {
|
||||
jshintrc: "src/.jshintrc"
|
||||
}
|
||||
},
|
||||
grunt: {
|
||||
src: [ "Gruntfile.js" ],
|
||||
options: {
|
||||
jshintrc: ".jshintrc"
|
||||
}
|
||||
},
|
||||
tests: {
|
||||
// TODO: Once .jshintignore is supported, use that instead.
|
||||
// issue located here: https://github.com/gruntjs/grunt-contrib-jshint/issues/1
|
||||
src: [ "test/data/{test,testinit,testrunner}.js", "test/unit/**/*.js" ],
|
||||
options: {
|
||||
jshintrc: "test/.jshintrc"
|
||||
}
|
||||
}
|
||||
},
|
||||
|
||||
testswarm: {
|
||||
tests: "ajax attributes callbacks core css data deferred dimensions effects event manipulation offset queue selector serialize support traversing Sizzle".split(" ")
|
||||
},
|
||||
|
||||
watch: {
|
||||
files: [ "<%= jshint.grunt.src %>", "<%= jshint.tests.src %>", "src/**/*.js" ],
|
||||
tasks: "dev"
|
||||
},
|
||||
|
||||
uglify: {
|
||||
all: {
|
||||
files: {
|
||||
"dist/jquery.min.js": [ "dist/jquery.js" ]
|
||||
},
|
||||
options: {
|
||||
banner: "/*! jQuery v<%= pkg.version %> | (c) 2005, 2012 jQuery Foundation, Inc. | jquery.org/license */",
|
||||
sourceMap: "dist/jquery.min.map",
|
||||
compress: {
|
||||
hoist_funs: false,
|
||||
join_vars: false,
|
||||
loops: false,
|
||||
unused: false
|
||||
},
|
||||
beautify: {
|
||||
ascii_only: true
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
});
|
||||
|
||||
grunt.registerTask( "testswarm", function( commit, configFile ) {
|
||||
var jobName,
|
||||
testswarm = require( "testswarm" ),
|
||||
testUrls = [],
|
||||
pull = /PR-(\d+)/.exec( commit ),
|
||||
config = grunt.file.readJSON( configFile ).jquery,
|
||||
tests = grunt.config([ this.name, "tests" ]);
|
||||
|
||||
if ( pull ) {
|
||||
jobName = "jQuery pull <a href='https://github.com/jquery/jquery/pull/" +
|
||||
pull[ 1 ] + "'>#" + pull[ 1 ] + "</a>";
|
||||
} else {
|
||||
jobName = "jQuery commit #<a href='https://github.com/jquery/jquery/commit/" +
|
||||
commit + "'>" + commit.substr( 0, 10 ) + "</a>";
|
||||
}
|
||||
|
||||
tests.forEach(function( test ) {
|
||||
testUrls.push( config.testUrl + commit + "/test/index.html?module=" + test );
|
||||
});
|
||||
|
||||
testswarm({
|
||||
url: config.swarmUrl,
|
||||
pollInterval: 10000,
|
||||
timeout: 1000 * 60 * 30,
|
||||
done: this.async()
|
||||
}, {
|
||||
authUsername: config.authUsername,
|
||||
authToken: config.authToken,
|
||||
jobName: jobName,
|
||||
runMax: config.runMax,
|
||||
"runNames[]": tests,
|
||||
"runUrls[]": testUrls,
|
||||
"browserSets[]": config.browserSets
|
||||
});
|
||||
});
|
||||
|
||||
// Build src/selector.js
|
||||
grunt.registerTask( "selector", "Build src/selector.js", function() {
|
||||
|
||||
var cfg = grunt.config("selector"),
|
||||
name = cfg.destFile,
|
||||
sizzle = {
|
||||
api: grunt.file.read( cfg.apiFile ),
|
||||
src: grunt.file.read( cfg.srcFile )
|
||||
},
|
||||
compiled, parts;
|
||||
|
||||
/**
|
||||
|
||||
sizzle-jquery.js -> sizzle between "EXPOSE" blocks,
|
||||
replace define & window.Sizzle assignment
|
||||
|
||||
|
||||
// EXPOSE
|
||||
if ( typeof define === "function" && define.amd ) {
|
||||
define(function() { return Sizzle; });
|
||||
} else {
|
||||
window.Sizzle = Sizzle;
|
||||
}
|
||||
// EXPOSE
|
||||
|
||||
Becomes...
|
||||
|
||||
Sizzle.attr = jQuery.attr;
|
||||
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;
|
||||
|
||||
*/
|
||||
|
||||
// Break into 3 pieces
|
||||
parts = sizzle.src.split("// EXPOSE");
|
||||
// Replace the if/else block with api
|
||||
parts[1] = sizzle.api;
|
||||
// Rejoin the pieces
|
||||
compiled = parts.join("");
|
||||
|
||||
grunt.verbose.write("Injected sizzle-jquery.js into sizzle.js");
|
||||
|
||||
// Write concatenated source to file, and ensure newline-only termination
|
||||
grunt.file.write( name, compiled.replace( /\x0d\x0a/g, "\x0a" ) );
|
||||
|
||||
// Fail task if errors were logged.
|
||||
if ( this.errorCount ) {
|
||||
return false;
|
||||
}
|
||||
|
||||
// Otherwise, print a success message.
|
||||
grunt.log.writeln( "File '" + name + "' created." );
|
||||
});
|
||||
|
||||
|
||||
// Special "alias" task to make custom build creation less grawlix-y
|
||||
grunt.registerTask( "custom", function() {
|
||||
var done = this.async(),
|
||||
args = [].slice.call(arguments),
|
||||
modules = args.length ? args[0].replace(/,/g, ":") : "";
|
||||
|
||||
|
||||
// Translation example
|
||||
//
|
||||
// grunt custom:+ajax,-dimensions,-effects,-offset
|
||||
//
|
||||
// Becomes:
|
||||
//
|
||||
// grunt build:*:*:+ajax:-dimensions:-effects:-offset
|
||||
|
||||
grunt.log.writeln( "Creating custom build...\n" );
|
||||
|
||||
grunt.util.spawn({
|
||||
cmd: process.platform === "win32" ? "grunt.cmd" : "grunt",
|
||||
args: [ "build:*:*:" + modules, "uglify", "dist" ]
|
||||
}, function( err, result ) {
|
||||
if ( err ) {
|
||||
grunt.verbose.error();
|
||||
done( err );
|
||||
return;
|
||||
}
|
||||
|
||||
grunt.log.writeln( result.stdout.replace("Done, without errors.", "") );
|
||||
|
||||
done();
|
||||
});
|
||||
});
|
||||
|
||||
// Special concat/build task to handle various jQuery build requirements
|
||||
//
|
||||
grunt.registerMultiTask(
|
||||
"build",
|
||||
"Concatenate source (include/exclude modules with +/- flags), embed date/version",
|
||||
function() {
|
||||
|
||||
// Concat specified files.
|
||||
var compiled = "",
|
||||
modules = this.flags,
|
||||
optIn = !modules["*"],
|
||||
explicit = optIn || Object.keys(modules).length > 1,
|
||||
name = this.data.dest,
|
||||
src = this.data.src,
|
||||
deps = {},
|
||||
excluded = {},
|
||||
version = grunt.config( "pkg.version" ),
|
||||
excluder = function( flag, needsFlag ) {
|
||||
// optIn defaults implicit behavior to weak exclusion
|
||||
if ( optIn && !modules[ flag ] && !modules[ "+" + flag ] ) {
|
||||
excluded[ flag ] = false;
|
||||
}
|
||||
|
||||
// explicit or inherited strong exclusion
|
||||
if ( excluded[ needsFlag ] || modules[ "-" + flag ] ) {
|
||||
excluded[ flag ] = true;
|
||||
|
||||
// explicit inclusion overrides weak exclusion
|
||||
} else if ( excluded[ needsFlag ] === false &&
|
||||
( modules[ flag ] || modules[ "+" + flag ] ) ) {
|
||||
|
||||
delete excluded[ needsFlag ];
|
||||
|
||||
// ...all the way down
|
||||
if ( deps[ needsFlag ] ) {
|
||||
deps[ needsFlag ].forEach(function( subDep ) {
|
||||
modules[ needsFlag ] = true;
|
||||
excluder( needsFlag, subDep );
|
||||
});
|
||||
}
|
||||
}
|
||||
};
|
||||
|
||||
// append commit id to version
|
||||
if ( process.env.COMMIT ) {
|
||||
version += " " + process.env.COMMIT;
|
||||
}
|
||||
|
||||
// figure out which files to exclude based on these rules in this order:
|
||||
// dependency explicit exclude
|
||||
// > explicit exclude
|
||||
// > explicit include
|
||||
// > dependency implicit exclude
|
||||
// > implicit exclude
|
||||
// examples:
|
||||
// * none (implicit exclude)
|
||||
// *:* all (implicit include)
|
||||
// *:*:-css all except css and dependents (explicit > implicit)
|
||||
// *:*:-css:+effects same (excludes effects because explicit include is trumped by explicit exclude of dependency)
|
||||
// *:+effects none except effects and its dependencies (explicit include trumps implicit exclude of dependency)
|
||||
src.forEach(function( filepath ) {
|
||||
var flag = filepath.flag;
|
||||
|
||||
if ( flag ) {
|
||||
|
||||
excluder(flag);
|
||||
|
||||
// check for dependencies
|
||||
if ( filepath.needs ) {
|
||||
deps[ flag ] = filepath.needs;
|
||||
filepath.needs.forEach(function( needsFlag ) {
|
||||
excluder( flag, needsFlag );
|
||||
});
|
||||
}
|
||||
}
|
||||
});
|
||||
|
||||
// append excluded modules to version
|
||||
if ( Object.keys( excluded ).length ) {
|
||||
version += " -" + Object.keys( excluded ).join( ",-" );
|
||||
// set pkg.version to version with excludes, so minified file picks it up
|
||||
grunt.config.set( "pkg.version", version );
|
||||
}
|
||||
|
||||
|
||||
// conditionally concatenate source
|
||||
src.forEach(function( filepath ) {
|
||||
var flag = filepath.flag,
|
||||
specified = false,
|
||||
omit = false,
|
||||
message = "";
|
||||
|
||||
if ( flag ) {
|
||||
if ( excluded[ flag ] !== undefined ) {
|
||||
message = ( "Excluding " + flag ).red;
|
||||
specified = true;
|
||||
omit = true;
|
||||
} else {
|
||||
message = ( "Including " + flag ).green;
|
||||
|
||||
// If this module was actually specified by the
|
||||
// builder, then st the flag to include it in the
|
||||
// output list
|
||||
if ( modules[ "+" + flag ] ) {
|
||||
specified = true;
|
||||
}
|
||||
}
|
||||
|
||||
// Only display the inclusion/exclusion list when handling
|
||||
// an explicit list.
|
||||
//
|
||||
// Additionally, only display modules that have been specified
|
||||
// by the user
|
||||
if ( explicit && specified ) {
|
||||
grunt.log.writetableln([ 27, 30 ], [
|
||||
message,
|
||||
( "(" + filepath.src + ")").grey
|
||||
]);
|
||||
}
|
||||
|
||||
filepath = filepath.src;
|
||||
}
|
||||
|
||||
if ( !omit ) {
|
||||
compiled += grunt.file.read( filepath );
|
||||
}
|
||||
});
|
||||
|
||||
// Embed Version
|
||||
// Embed Date
|
||||
compiled = compiled.replace( /@VERSION/g, version )
|
||||
.replace( "@DATE", function () {
|
||||
var date = new Date();
|
||||
|
||||
// YYYY-MM-DD
|
||||
return [
|
||||
date.getFullYear(),
|
||||
date.getMonth() + 1,
|
||||
date.getDate()
|
||||
].join( "-" );
|
||||
});
|
||||
|
||||
// Write concatenated source to file
|
||||
grunt.file.write( name, compiled );
|
||||
|
||||
// Fail task if errors were logged.
|
||||
if ( this.errorCount ) {
|
||||
return false;
|
||||
}
|
||||
|
||||
// Otherwise, print a success message.
|
||||
grunt.log.writeln( "File '" + name + "' created." );
|
||||
});
|
||||
|
||||
// Process files for distribution
|
||||
grunt.registerTask( "dist", function() {
|
||||
var flags, paths, stored;
|
||||
|
||||
// Check for stored destination paths
|
||||
// ( set in dist/.destination.json )
|
||||
stored = Object.keys( grunt.config("dst") );
|
||||
|
||||
// Allow command line input as well
|
||||
flags = Object.keys( this.flags );
|
||||
|
||||
// Combine all output target paths
|
||||
paths = [].concat( stored, flags ).filter(function( path ) {
|
||||
return path !== "*";
|
||||
});
|
||||
|
||||
// Ensure the dist files are pure ASCII
|
||||
var fs = require("fs"),
|
||||
nonascii = false;
|
||||
|
||||
distpaths.forEach(function( filename ) {
|
||||
var i, c, map,
|
||||
text = fs.readFileSync( filename, "utf8" );
|
||||
|
||||
// Ensure files use only \n for line endings, not \r\n
|
||||
if ( /\x0d\x0a/.test( text ) ) {
|
||||
grunt.log.writeln( filename + ": Incorrect line endings (\\r\\n)" );
|
||||
nonascii = true;
|
||||
}
|
||||
|
||||
// Ensure only ASCII chars so script tags don't need a charset attribute
|
||||
if ( text.length !== Buffer.byteLength( text, "utf8" ) ) {
|
||||
grunt.log.writeln( filename + ": Non-ASCII characters detected:" );
|
||||
for ( i = 0; i < text.length; i++ ) {
|
||||
c = text.charCodeAt( i );
|
||||
if ( c > 127 ) {
|
||||
grunt.log.writeln( "- position " + i + ": " + c );
|
||||
grunt.log.writeln( "-- " + text.substring( i - 20, i + 20 ) );
|
||||
break;
|
||||
}
|
||||
}
|
||||
nonascii = true;
|
||||
}
|
||||
|
||||
// Modify map/min so that it points to files in the same folder;
|
||||
// see https://github.com/mishoo/UglifyJS2/issues/47
|
||||
if ( /\.map$/.test( filename ) ) {
|
||||
text = text.replace( /"dist\//g, "\"" );
|
||||
fs.writeFileSync( filename, text, "utf-8" );
|
||||
} else if ( /\.min\.js$/.test( filename ) ) {
|
||||
// Wrap sourceMap directive in multiline comments (#13274)
|
||||
text = text.replace( /\n?(\/\/@\s*sourceMappingURL=)(.*)/,
|
||||
function( _, directive, path ) {
|
||||
map = "\n" + directive + path.replace( /^dist\//, "" );
|
||||
return "";
|
||||
});
|
||||
if ( map ) {
|
||||
text = text.replace( /(^\/\*[\w\W]*?)\s*\*\/|$/,
|
||||
function( _, comment ) {
|
||||
return ( comment || "\n/*" ) + map + "\n*/";
|
||||
});
|
||||
}
|
||||
fs.writeFileSync( filename, text, "utf-8" );
|
||||
}
|
||||
|
||||
// Optionally copy dist files to other locations
|
||||
paths.forEach(function( path ) {
|
||||
var created;
|
||||
|
||||
if ( !/\/$/.test( path ) ) {
|
||||
path += "/";
|
||||
}
|
||||
|
||||
created = path + filename.replace( "dist/", "" );
|
||||
grunt.file.write( created, text );
|
||||
grunt.log.writeln( "File '" + created + "' created." );
|
||||
});
|
||||
});
|
||||
|
||||
return !nonascii;
|
||||
});
|
||||
|
||||
// Load grunt tasks from NPM packages
|
||||
grunt.loadNpmTasks("grunt-compare-size");
|
||||
grunt.loadNpmTasks("grunt-git-authors");
|
||||
grunt.loadNpmTasks("grunt-update-submodules");
|
||||
grunt.loadNpmTasks("grunt-contrib-watch");
|
||||
grunt.loadNpmTasks("grunt-contrib-jshint");
|
||||
grunt.loadNpmTasks("grunt-contrib-uglify");
|
||||
|
||||
// Default grunt
|
||||
grunt.registerTask( "default", [ "update_submodules", "selector", "build:*:*", "jshint", "uglify", "dist:*" ] );
|
||||
|
||||
// Short list as a high frequency watch task
|
||||
grunt.registerTask( "dev", [ "selector", "build:*:*", "jshint" ] );
|
||||
};
|
||||
21
www/lib/jQuery/MIT-LICENSE.txt
Normal file
21
www/lib/jQuery/MIT-LICENSE.txt
Normal file
@@ -0,0 +1,21 @@
|
||||
Copyright 2012 jQuery Foundation and other contributors
|
||||
http://jquery.com/
|
||||
|
||||
Permission is hereby granted, free of charge, to any person obtaining
|
||||
a copy of this software and associated documentation files (the
|
||||
"Software"), to deal in the Software without restriction, including
|
||||
without limitation the rights to use, copy, modify, merge, publish,
|
||||
distribute, sublicense, and/or sell copies of the Software, and to
|
||||
permit persons to whom the Software is furnished to do so, subject to
|
||||
the following conditions:
|
||||
|
||||
The above copyright notice and this permission notice shall be
|
||||
included in all copies or substantial portions of the Software.
|
||||
|
||||
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
||||
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
||||
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
||||
NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
|
||||
LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
|
||||
OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
|
||||
WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
||||
415
www/lib/jQuery/README.md
Normal file
415
www/lib/jQuery/README.md
Normal file
@@ -0,0 +1,415 @@
|
||||
[jQuery](http://jquery.com/) - New Wave JavaScript
|
||||
==================================================
|
||||
|
||||
Contribution Guides
|
||||
--------------------------------------
|
||||
|
||||
In the spirit of open source software development, jQuery always encourages community code contribution. To help you get started and before you jump into writing code, be sure to read these important contribution guidelines thoroughly:
|
||||
|
||||
1. [Getting Involved](http://docs.jquery.com/Getting_Involved)
|
||||
2. [Core Style Guide](http://docs.jquery.com/JQuery_Core_Style_Guidelines)
|
||||
3. [Tips For Bug Patching](http://docs.jquery.com/Tips_for_jQuery_Bug_Patching)
|
||||
|
||||
|
||||
What you need to build your own jQuery
|
||||
--------------------------------------
|
||||
|
||||
In order to build jQuery, you need to have Node.js/npm latest and git 1.7 or later.
|
||||
(Earlier versions might work OK, but are not tested.)
|
||||
|
||||
Windows users have two options:
|
||||
|
||||
1. Install [msysgit](https://code.google.com/p/msysgit/) (Full installer for official Git) and a
|
||||
[binary version of Node.js](http://nodejs.org). Make sure all two packages are installed to the same
|
||||
location (by default, this is C:\Program Files\Git).
|
||||
2. Install [Cygwin](http://cygwin.com/) (make sure you install the git and which packages), and
|
||||
a [binary version of Node.js](http://nodejs.org/).
|
||||
|
||||
Mac OS users should install Xcode (comes on your Mac OS install DVD, or downloadable from
|
||||
[Apple's Xcode site](http://developer.apple.com/technologies/xcode.html)) and
|
||||
[Homebrew](http://mxcl.github.com/homebrew/). Once Homebrew is installed, run `brew install git` to install git,
|
||||
and `brew install node` to install Node.js.
|
||||
|
||||
Linux/BSD users should use their appropriate package managers to install git and Node.js, or build from source
|
||||
if you swing that way. Easy-peasy.
|
||||
|
||||
|
||||
How to build your own jQuery
|
||||
----------------------------
|
||||
|
||||
First, clone a copy of the main jQuery git repo by running:
|
||||
|
||||
```bash
|
||||
git clone git://github.com/jquery/jquery.git
|
||||
```
|
||||
|
||||
Enter the directory and install the Node dependencies:
|
||||
|
||||
```bash
|
||||
cd jquery && npm install
|
||||
```
|
||||
|
||||
|
||||
Make sure you have `grunt` installed by testing:
|
||||
|
||||
```bash
|
||||
grunt -version
|
||||
```
|
||||
|
||||
|
||||
|
||||
Then, to get a complete, minified (w/ Uglify.js), linted (w/ JSHint) version of jQuery, type the following:
|
||||
|
||||
```bash
|
||||
grunt
|
||||
```
|
||||
|
||||
|
||||
The built version of jQuery will be put in the `dist/` subdirectory.
|
||||
|
||||
|
||||
### Modules (new in 1.8)
|
||||
|
||||
Starting in jQuery 1.8, special builds can now be created that optionally exclude or include any of the following modules:
|
||||
|
||||
- ajax
|
||||
- css
|
||||
- dimensions
|
||||
- effects
|
||||
- offset
|
||||
|
||||
|
||||
Before creating a custom build for use in production, be sure to check out the latest stable version:
|
||||
|
||||
```bash
|
||||
git pull; git checkout $(git describe --abbrev=0 --tags)
|
||||
```
|
||||
|
||||
Then, make sure all Node dependencies are installed and all Git submodules are checked out:
|
||||
|
||||
```bash
|
||||
npm install && grunt
|
||||
```
|
||||
|
||||
To create a custom build, use the following special `grunt` commands:
|
||||
|
||||
Exclude **ajax**:
|
||||
|
||||
```bash
|
||||
grunt custom:-ajax
|
||||
```
|
||||
|
||||
Exclude **css**:
|
||||
|
||||
```bash
|
||||
grunt custom:-css
|
||||
```
|
||||
|
||||
Exclude **deprecated**:
|
||||
|
||||
```bash
|
||||
grunt custom:-deprecated
|
||||
```
|
||||
|
||||
Exclude **dimensions**:
|
||||
|
||||
```bash
|
||||
grunt custom:-dimensions
|
||||
```
|
||||
|
||||
Exclude **effects**:
|
||||
|
||||
```bash
|
||||
grunt custom:-effects
|
||||
```
|
||||
|
||||
Exclude **offset**:
|
||||
|
||||
```bash
|
||||
grunt custom:-offset
|
||||
```
|
||||
|
||||
Exclude **all** optional modules:
|
||||
|
||||
```bash
|
||||
grunt custom:-ajax,-css,-deprecated,-dimensions,-effects,-offset
|
||||
```
|
||||
|
||||
|
||||
Note: dependencies will be handled internally, by the build process.
|
||||
|
||||
|
||||
Running the Unit Tests
|
||||
--------------------------------------
|
||||
|
||||
|
||||
Start grunt to auto-build jQuery as you work:
|
||||
|
||||
```bash
|
||||
cd jquery && grunt watch
|
||||
```
|
||||
|
||||
|
||||
Run the unit tests with a local server that supports PHP. No database is required. Pre-configured php local servers are available for Windows and Mac. Here are some options:
|
||||
|
||||
- Windows: [WAMP download](http://www.wampserver.com/en/)
|
||||
- Mac: [MAMP download](http://www.mamp.info/en/index.html)
|
||||
- Linux: [Setting up LAMP](https://www.linux.com/learn/tutorials/288158-easy-lamp-server-installation)
|
||||
- [Mongoose (most platforms)](http://code.google.com/p/mongoose/)
|
||||
|
||||
|
||||
|
||||
|
||||
Building to a different directory
|
||||
---------------------------------
|
||||
|
||||
If you want to build jQuery to a directory that is different from the default location:
|
||||
|
||||
```bash
|
||||
grunt && grunt dist:/path/to/special/location/
|
||||
```
|
||||
With this example, the output files would be:
|
||||
|
||||
```bash
|
||||
/path/to/special/location/jquery.js
|
||||
/path/to/special/location/jquery.min.js
|
||||
```
|
||||
|
||||
If you want to add a permanent copy destination, create a file in `dist/` called ".destination.json". Inside the file, paste and customize the following:
|
||||
|
||||
```json
|
||||
|
||||
{
|
||||
"/Absolute/path/to/other/destination": true
|
||||
}
|
||||
```
|
||||
|
||||
|
||||
Additionally, both methods can be combined.
|
||||
|
||||
|
||||
|
||||
Updating Submodules
|
||||
-------------------
|
||||
|
||||
Update the submodules to what is probably the latest upstream code.
|
||||
|
||||
```bash
|
||||
grunt update_submodules
|
||||
```
|
||||
|
||||
Note: This task will also be run any time the default `grunt` command is used.
|
||||
|
||||
|
||||
|
||||
Git for dummies
|
||||
---------------
|
||||
|
||||
As the source code is handled by the version control system Git, it's useful to know some features used.
|
||||
|
||||
### Submodules ###
|
||||
|
||||
The repository uses submodules, which normally are handled directly by the `grunt update_submodules` command, but sometimes you want to
|
||||
be able to work with them manually.
|
||||
|
||||
Following are the steps to manually get the submodules:
|
||||
|
||||
```bash
|
||||
git clone https://github.com/jquery/jquery.git
|
||||
cd jquery
|
||||
git submodule init
|
||||
git submodule update
|
||||
```
|
||||
|
||||
Or:
|
||||
|
||||
```bash
|
||||
git clone https://github.com/jquery/jquery.git
|
||||
cd jquery
|
||||
git submodule update --init
|
||||
```
|
||||
|
||||
Or:
|
||||
|
||||
```bash
|
||||
git clone --recursive https://github.com/jquery/jquery.git
|
||||
cd jquery
|
||||
```
|
||||
|
||||
If you want to work inside a submodule, it is possible, but first you need to checkout a branch:
|
||||
|
||||
```bash
|
||||
cd src/sizzle
|
||||
git checkout master
|
||||
```
|
||||
|
||||
After you've committed your changes to the submodule, you'll update the jquery project to point to the new commit,
|
||||
but remember to push the submodule changes before pushing the new jquery commit:
|
||||
|
||||
```bash
|
||||
cd src/sizzle
|
||||
git push origin master
|
||||
cd ..
|
||||
git add src/sizzle
|
||||
git commit
|
||||
```
|
||||
|
||||
|
||||
### cleaning ###
|
||||
|
||||
If you want to purge your working directory back to the status of upstream, following commands can be used (remember everything you've worked on is gone after these):
|
||||
|
||||
```bash
|
||||
git reset --hard upstream/master
|
||||
git clean -fdx
|
||||
```
|
||||
|
||||
### rebasing ###
|
||||
|
||||
For feature/topic branches, you should always used the `--rebase` flag to `git pull`, or if you are usually handling many temporary "to be in a github pull request" branches, run following to automate this:
|
||||
|
||||
```bash
|
||||
git config branch.autosetuprebase local
|
||||
```
|
||||
(see `man git-config` for more information)
|
||||
|
||||
### handling merge conflicts ###
|
||||
|
||||
If you're getting merge conflicts when merging, instead of editing the conflicted files manually, you can use the feature
|
||||
`git mergetool`. Even though the default tool `xxdiff` looks awful/old, it's rather useful.
|
||||
|
||||
Following are some commands that can be used there:
|
||||
|
||||
* `Ctrl + Alt + M` - automerge as much as possible
|
||||
* `b` - jump to next merge conflict
|
||||
* `s` - change the order of the conflicted lines
|
||||
* `u` - undo an merge
|
||||
* `left mouse button` - mark a block to be the winner
|
||||
* `middle mouse button` - mark a line to be the winner
|
||||
* `Ctrl + S` - save
|
||||
* `Ctrl + Q` - quit
|
||||
|
||||
[QUnit](http://docs.jquery.com/QUnit) Reference
|
||||
-----------------
|
||||
|
||||
### Test methods ###
|
||||
|
||||
```js
|
||||
expect( numAssertions );
|
||||
stop();
|
||||
start();
|
||||
```
|
||||
|
||||
|
||||
note: QUnit's eventual addition of an argument to stop/start is ignored in this test suite so that start and stop can be passed as callbacks without worrying about their parameters
|
||||
|
||||
### Test assertions ###
|
||||
|
||||
|
||||
```js
|
||||
ok( value, [message] );
|
||||
equal( actual, expected, [message] );
|
||||
notEqual( actual, expected, [message] );
|
||||
deepEqual( actual, expected, [message] );
|
||||
notDeepEqual( actual, expected, [message] );
|
||||
strictEqual( actual, expected, [message] );
|
||||
notStrictEqual( actual, expected, [message] );
|
||||
raises( block, [expected], [message] );
|
||||
```
|
||||
|
||||
|
||||
Test Suite Convenience Methods Reference (See [test/data/testinit.js](https://github.com/jquery/jquery/blob/master/test/data/testinit.js))
|
||||
------------------------------
|
||||
|
||||
### Returns an array of elements with the given IDs ###
|
||||
|
||||
```js
|
||||
q( ... );
|
||||
```
|
||||
|
||||
Example:
|
||||
|
||||
```js
|
||||
q("main", "foo", "bar");
|
||||
|
||||
=> [ div#main, span#foo, input#bar ]
|
||||
```
|
||||
|
||||
### Asserts that a selection matches the given IDs ###
|
||||
|
||||
```js
|
||||
t( testName, selector, [ "array", "of", "ids" ] );
|
||||
```
|
||||
|
||||
Example:
|
||||
|
||||
```js
|
||||
t("Check for something", "//[a]", ["foo", "baar"]);
|
||||
```
|
||||
|
||||
|
||||
|
||||
### Fires a native DOM event without going through jQuery ###
|
||||
|
||||
```js
|
||||
fireNative( node, eventType )
|
||||
```
|
||||
|
||||
Example:
|
||||
|
||||
```js
|
||||
fireNative( jQuery("#elem")[0], "click" );
|
||||
```
|
||||
|
||||
### Add random number to url to stop caching ###
|
||||
|
||||
```js
|
||||
url( "some/url.php" );
|
||||
```
|
||||
|
||||
Example:
|
||||
|
||||
```js
|
||||
url("data/test.html");
|
||||
|
||||
=> "data/test.html?10538358428943"
|
||||
|
||||
|
||||
url("data/test.php?foo=bar");
|
||||
|
||||
=> "data/test.php?foo=bar&10538358345554"
|
||||
```
|
||||
|
||||
|
||||
### Load tests in an iframe ###
|
||||
|
||||
Loads a given page constructing a url with fileName: `"./data/" + fileName + ".html"`
|
||||
and fires the given callback on jQuery ready (using the jQuery loading from that page)
|
||||
and passes the iFrame's jQuery to the callback.
|
||||
|
||||
```js
|
||||
testIframe( fileName, testName, callback );
|
||||
```
|
||||
|
||||
Callback arguments:
|
||||
|
||||
```js
|
||||
callback( jQueryFromIFrame, iFrameWindow, iFrameDocument );
|
||||
```
|
||||
|
||||
### Load tests in an iframe (window.iframeCallback) ###
|
||||
|
||||
Loads a given page constructing a url with fileName: `"./data/" + fileName + ".html"`
|
||||
The given callback is fired when window.iframeCallback is called by the page
|
||||
The arguments passed to the callback are the same as the
|
||||
arguments passed to window.iframeCallback, whatever that may be
|
||||
|
||||
```js
|
||||
testIframeWithCallback( testName, fileName, callback );
|
||||
```
|
||||
|
||||
Questions?
|
||||
----------
|
||||
|
||||
If you have any questions, please feel free to ask on the
|
||||
[Developing jQuery Core forum](http://forum.jquery.com/developing-jquery-core) or in #jquery on irc.freenode.net.
|
||||
59
www/lib/jQuery/build/release-notes.js
Normal file
59
www/lib/jQuery/build/release-notes.js
Normal file
@@ -0,0 +1,59 @@
|
||||
#!/usr/bin/env node
|
||||
/*
|
||||
* jQuery Release Note Generator
|
||||
*/
|
||||
|
||||
var fs = require("fs"),
|
||||
http = require("http"),
|
||||
extract = /<a href="\/ticket\/(\d+)" title="View ticket">(.*?)<[^"]+"component">\s*(\S+)/g,
|
||||
categories = [],
|
||||
version = process.argv[2];
|
||||
|
||||
if ( !/^\d+\.\d+/.test( version ) ) {
|
||||
console.error( "Invalid version number: " + version );
|
||||
process.exit( 1 );
|
||||
}
|
||||
|
||||
http.request({
|
||||
host: "bugs.jquery.com",
|
||||
port: 80,
|
||||
method: "GET",
|
||||
path: "/query?status=closed&resolution=fixed&max=400&component=!web&order=component&milestone=" + version
|
||||
}, function (res) {
|
||||
var data = [];
|
||||
|
||||
res.on( "data", function( chunk ) {
|
||||
data.push( chunk );
|
||||
});
|
||||
|
||||
res.on( "end", function() {
|
||||
var match,
|
||||
file = data.join(""),
|
||||
cur;
|
||||
|
||||
while ( (match = extract.exec( file )) ) {
|
||||
if ( "#" + match[1] !== match[2] ) {
|
||||
var cat = match[3];
|
||||
|
||||
if ( !cur || cur !== cat ) {
|
||||
if ( cur ) {
|
||||
console.log("</ul>");
|
||||
}
|
||||
cur = cat;
|
||||
console.log( "<h2>" + cat.charAt(0).toUpperCase() + cat.slice(1) + "</h2>" );
|
||||
console.log("<ul>");
|
||||
}
|
||||
|
||||
console.log(
|
||||
" <li><a href=\"http://bugs.jquery.com/ticket/" + match[1] + "\">#" +
|
||||
match[1] + ": " + match[2] + "</a></li>"
|
||||
);
|
||||
}
|
||||
}
|
||||
if ( cur ) {
|
||||
console.log("</ul>");
|
||||
}
|
||||
|
||||
});
|
||||
}).end();
|
||||
|
||||
246
www/lib/jQuery/build/release.js
Normal file
246
www/lib/jQuery/build/release.js
Normal file
@@ -0,0 +1,246 @@
|
||||
#!/usr/bin/env node
|
||||
/*
|
||||
* jQuery Core Release Management
|
||||
*/
|
||||
|
||||
// Debugging variables
|
||||
var debug = false,
|
||||
skipRemote = false;
|
||||
|
||||
var fs = require("fs"),
|
||||
child = require("child_process"),
|
||||
path = require("path");
|
||||
|
||||
var releaseVersion,
|
||||
nextVersion,
|
||||
CDNFiles,
|
||||
isBeta,
|
||||
pkg,
|
||||
branch,
|
||||
|
||||
scpURL = "jqadmin@code.origin.jquery.com:/var/www/html/code.jquery.com/",
|
||||
cdnURL = "http://code.origin.jquery.com/",
|
||||
repoURL = "git@github.com:jquery/jquery.git",
|
||||
|
||||
// Windows needs the .cmd version but will find the non-.cmd
|
||||
// On Windows, ensure the HOME environment variable is set
|
||||
gruntCmd = process.platform === "win32" ? "grunt.cmd" : "grunt",
|
||||
|
||||
devFile = "dist/jquery.js",
|
||||
minFile = "dist/jquery.min.js",
|
||||
mapFile = "dist/jquery.min.map",
|
||||
|
||||
releaseFiles = {
|
||||
"jquery-VER.js": devFile,
|
||||
"jquery-VER.min.js": minFile,
|
||||
"jquery-VER.min.map": mapFile,
|
||||
"jquery.js": devFile,
|
||||
"jquery.min.js": minFile,
|
||||
"jquery.min.map": mapFile,
|
||||
"jquery-latest.js": devFile,
|
||||
"jquery-latest.min.js": minFile,
|
||||
"jquery-latest.min.map": mapFile
|
||||
};
|
||||
|
||||
steps(
|
||||
initialize,
|
||||
checkGitStatus,
|
||||
tagReleaseVersion,
|
||||
gruntBuild,
|
||||
makeReleaseCopies,
|
||||
setNextVersion,
|
||||
uploadToCDN,
|
||||
pushToGithub,
|
||||
exit
|
||||
);
|
||||
|
||||
function initialize( next ) {
|
||||
|
||||
if ( process.argv[2] === "-d" ) {
|
||||
process.argv.shift();
|
||||
debug = true;
|
||||
console.warn("=== DEBUG MODE ===" );
|
||||
}
|
||||
|
||||
// First arg should be the version number being released
|
||||
var newver, oldver,
|
||||
rversion = /^(\d)\.(\d+)\.(\d)((?:a|b|rc)\d|pre)?$/,
|
||||
version = ( process.argv[3] || "" ).toLowerCase().match( rversion ) || {},
|
||||
major = version[1],
|
||||
minor = version[2],
|
||||
patch = version[3],
|
||||
xbeta = version[4];
|
||||
|
||||
branch = process.argv[2];
|
||||
releaseVersion = process.argv[3];
|
||||
isBeta = !!xbeta;
|
||||
|
||||
if ( !branch || !major || !minor || !patch ) {
|
||||
die( "Usage: " + process.argv[1] + " branch releaseVersion" );
|
||||
}
|
||||
if ( xbeta === "pre" ) {
|
||||
die( "Cannot release a 'pre' version!" );
|
||||
}
|
||||
if ( !(fs.existsSync || path.existsSync)( "package.json" ) ) {
|
||||
die( "No package.json in this directory" );
|
||||
}
|
||||
pkg = JSON.parse( fs.readFileSync( "package.json" ) );
|
||||
|
||||
console.log( "Current version is " + pkg.version + "; generating release " + releaseVersion );
|
||||
version = pkg.version.match( rversion );
|
||||
oldver = ( +version[1] ) * 10000 + ( +version[2] * 100 ) + ( +version[3] )
|
||||
newver = ( +major ) * 10000 + ( +minor * 100 ) + ( +patch );
|
||||
if ( newver < oldver ) {
|
||||
die( "Next version is older than current version!" );
|
||||
}
|
||||
|
||||
nextVersion = major + "." + minor + "." + ( isBeta ? patch : +patch + 1 ) + "pre";
|
||||
next();
|
||||
}
|
||||
|
||||
function checkGitStatus( next ) {
|
||||
git( [ "status" ], function( error, stdout, stderr ) {
|
||||
var onBranch = ((stdout||"").match( /On branch (\S+)/ ) || [])[1];
|
||||
if ( onBranch !== branch ) {
|
||||
die( "Branches don't match: Wanted " + branch + ", got " + onBranch );
|
||||
}
|
||||
if ( /Changes to be committed/i.test( stdout ) ) {
|
||||
die( "Please commit changed files before attemping to push a release." );
|
||||
}
|
||||
if ( /Changes not staged for commit/i.test( stdout ) ) {
|
||||
die( "Please stash files before attempting to push a release." );
|
||||
}
|
||||
next();
|
||||
});
|
||||
}
|
||||
|
||||
function tagReleaseVersion( next ) {
|
||||
updatePackageVersion( releaseVersion );
|
||||
git( [ "commit", "-a", "-m", "Tagging the " + releaseVersion + " release." ], function(){
|
||||
git( [ "tag", releaseVersion ], next, debug);
|
||||
}, debug);
|
||||
}
|
||||
|
||||
function gruntBuild( next ) {
|
||||
exec( gruntCmd, [], function( error, stdout ) {
|
||||
if ( error ) {
|
||||
die( error + stderr );
|
||||
}
|
||||
console.log( stdout );
|
||||
next();
|
||||
}, debug);
|
||||
}
|
||||
|
||||
function makeReleaseCopies( next ) {
|
||||
CDNFiles = {};
|
||||
Object.keys( releaseFiles ).forEach(function( key ) {
|
||||
var text,
|
||||
builtFile = releaseFiles[ key ],
|
||||
releaseFile = key.replace( /VER/g, releaseVersion );
|
||||
|
||||
// Beta releases don't update the jquery-latest etc. copies
|
||||
if ( !isBeta || key !== releaseFile ) {
|
||||
|
||||
if ( /\.map$/.test( releaseFile ) ) {
|
||||
// Map files need to reference the new uncompressed name;
|
||||
// assume that all files reside in the same directory.
|
||||
// "file":"jquery.min.js","sources":["jquery.js"]
|
||||
text = fs.readFileSync( builtFile, "utf8" )
|
||||
.replace( /"file":"([^"]+)","sources":\["([^"]+)"\]/,
|
||||
"\"file\":\"" + releaseFile.replace( /\.min\.map/, ".min.js" ) +
|
||||
"\",\"sources\":[\"" + releaseFile.replace( /\.min\.map/, ".js" ) + "\"]" );
|
||||
console.log( "Modifying map " + builtFile + " to " + releaseFile );
|
||||
if ( !debug ) {
|
||||
fs.writeFileSync( releaseFile, text );
|
||||
}
|
||||
} else {
|
||||
copy( builtFile, releaseFile );
|
||||
}
|
||||
|
||||
CDNFiles[ releaseFile ] = builtFile;
|
||||
}
|
||||
});
|
||||
next();
|
||||
}
|
||||
|
||||
function setNextVersion( next ) {
|
||||
updatePackageVersion( nextVersion );
|
||||
git( [ "commit", "-a", "-m", "Updating the source version to " + nextVersion ], next, debug );
|
||||
}
|
||||
|
||||
function uploadToCDN( next ) {
|
||||
var cmds = [];
|
||||
|
||||
Object.keys( CDNFiles ).forEach(function( name ) {
|
||||
cmds.push(function( nxt ){
|
||||
exec( "scp", [ name, scpURL ], nxt, debug || skipRemote );
|
||||
});
|
||||
cmds.push(function( nxt ){
|
||||
exec( "curl", [ cdnURL + name + "?reload" ], nxt, debug || skipRemote );
|
||||
});
|
||||
});
|
||||
cmds.push( next );
|
||||
|
||||
steps.apply( this, cmds );
|
||||
}
|
||||
|
||||
function pushToGithub( next ) {
|
||||
git( [ "push", "--tags", repoURL, branch ], next, debug || skipRemote );
|
||||
}
|
||||
|
||||
//==============================
|
||||
|
||||
function steps() {
|
||||
var cur = 0,
|
||||
steps = arguments;
|
||||
(function next(){
|
||||
process.nextTick(function(){
|
||||
steps[ cur++ ]( next );
|
||||
});
|
||||
})();
|
||||
}
|
||||
|
||||
function updatePackageVersion( ver ) {
|
||||
console.log( "Updating package.json version to " + ver );
|
||||
pkg.version = ver;
|
||||
if ( !debug ) {
|
||||
fs.writeFileSync( "package.json", JSON.stringify( pkg, null, "\t" ) + "\n" );
|
||||
}
|
||||
}
|
||||
|
||||
function copy( oldFile, newFile ) {
|
||||
console.log( "Copying " + oldFile + " to " + newFile );
|
||||
if ( !debug ) {
|
||||
fs.writeFileSync( newFile, fs.readFileSync( oldFile, "utf8" ) );
|
||||
}
|
||||
}
|
||||
|
||||
function git( args, fn, skip ) {
|
||||
exec( "git", args, fn, skip );
|
||||
}
|
||||
|
||||
function exec( cmd, args, fn, skip ) {
|
||||
if ( skip ) {
|
||||
console.log( "# " + cmd + " " + args.join(" ") );
|
||||
fn( "", "", "" );
|
||||
} else {
|
||||
console.log( cmd + " " + args.join(" ") );
|
||||
child.execFile( cmd, args, { env: process.env },
|
||||
function( err, stdout, stderr ) {
|
||||
if ( err ) {
|
||||
die( stderr || stdout || err );
|
||||
}
|
||||
fn.apply( this, arguments );
|
||||
}
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
function die( msg ) {
|
||||
console.error( "ERROR: " + msg );
|
||||
process.exit( 1 );
|
||||
}
|
||||
|
||||
function exit() {
|
||||
process.exit( 0 );
|
||||
}
|
||||
13
www/lib/jQuery/component.json
Normal file
13
www/lib/jQuery/component.json
Normal file
@@ -0,0 +1,13 @@
|
||||
{
|
||||
"name": "jquery",
|
||||
"version": "1.9.1",
|
||||
"description": "jQuery component",
|
||||
"keywords": [
|
||||
"jquery",
|
||||
"component"
|
||||
],
|
||||
"scripts": [
|
||||
"jquery.js"
|
||||
],
|
||||
"license": "MIT"
|
||||
}
|
||||
35
www/lib/jQuery/composer.json
Normal file
35
www/lib/jQuery/composer.json
Normal file
@@ -0,0 +1,35 @@
|
||||
{
|
||||
"name": "components/jquery",
|
||||
"description": "jQuery JavaScript Library",
|
||||
"type": "component",
|
||||
"homepage": "http://jquery.com",
|
||||
"license": "MIT",
|
||||
"support": {
|
||||
"irc": "irc://irc.freenode.org/jquery",
|
||||
"issues": "http://bugs.jquery.com",
|
||||
"forum": "http://forum.jquery.com",
|
||||
"wiki": "http://docs.jquery.com/",
|
||||
"source": "https://github.com/jquery/jquery"
|
||||
},
|
||||
"authors": [
|
||||
{
|
||||
"name": "John Resig",
|
||||
"email": "jeresig@gmail.com"
|
||||
}
|
||||
],
|
||||
"require": {
|
||||
"robloach/component-installer": "*"
|
||||
},
|
||||
"extra": {
|
||||
"component": {
|
||||
"scripts": [
|
||||
"jquery.js"
|
||||
],
|
||||
"files": [
|
||||
"jquery.min.js",
|
||||
"jquery-migrate.js",
|
||||
"jquery-migrate.min.js"
|
||||
]
|
||||
}
|
||||
}
|
||||
}
|
||||
496
www/lib/jQuery/jquery-migrate.js
vendored
Normal file
496
www/lib/jQuery/jquery-migrate.js
vendored
Normal file
@@ -0,0 +1,496 @@
|
||||
/*!
|
||||
* jQuery Migrate - v1.1.0 - 2013-01-31
|
||||
* https://github.com/jquery/jquery-migrate
|
||||
* Copyright 2005, 2013 jQuery Foundation, Inc. and other contributors; Licensed MIT
|
||||
*/
|
||||
(function( jQuery, window, undefined ) {
|
||||
"use strict";
|
||||
|
||||
|
||||
var warnedAbout = {};
|
||||
|
||||
// List of warnings already given; public read only
|
||||
jQuery.migrateWarnings = [];
|
||||
|
||||
// Set to true to prevent console output; migrateWarnings still maintained
|
||||
// jQuery.migrateMute = false;
|
||||
|
||||
// Show a message on the console so devs know we're active
|
||||
if ( !jQuery.migrateMute && window.console && console.log ) {
|
||||
console.log("JQMIGRATE: Logging is active");
|
||||
}
|
||||
|
||||
// Set to false to disable traces that appear with warnings
|
||||
if ( jQuery.migrateTrace === undefined ) {
|
||||
jQuery.migrateTrace = true;
|
||||
}
|
||||
|
||||
// Forget any warnings we've already given; public
|
||||
jQuery.migrateReset = function() {
|
||||
warnedAbout = {};
|
||||
jQuery.migrateWarnings.length = 0;
|
||||
};
|
||||
|
||||
function migrateWarn( msg) {
|
||||
if ( !warnedAbout[ msg ] ) {
|
||||
warnedAbout[ msg ] = true;
|
||||
jQuery.migrateWarnings.push( msg );
|
||||
if ( window.console && console.warn && !jQuery.migrateMute ) {
|
||||
console.warn( "JQMIGRATE: " + msg );
|
||||
if ( jQuery.migrateTrace && console.trace ) {
|
||||
console.trace();
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
function migrateWarnProp( obj, prop, value, msg ) {
|
||||
if ( Object.defineProperty ) {
|
||||
// On ES5 browsers (non-oldIE), warn if the code tries to get prop;
|
||||
// allow property to be overwritten in case some other plugin wants it
|
||||
try {
|
||||
Object.defineProperty( obj, prop, {
|
||||
configurable: true,
|
||||
enumerable: true,
|
||||
get: function() {
|
||||
migrateWarn( msg );
|
||||
return value;
|
||||
},
|
||||
set: function( newValue ) {
|
||||
migrateWarn( msg );
|
||||
value = newValue;
|
||||
}
|
||||
});
|
||||
return;
|
||||
} catch( err ) {
|
||||
// IE8 is a dope about Object.defineProperty, can't warn there
|
||||
}
|
||||
}
|
||||
|
||||
// Non-ES5 (or broken) browser; just set the property
|
||||
jQuery._definePropertyBroken = true;
|
||||
obj[ prop ] = value;
|
||||
}
|
||||
|
||||
if ( document.compatMode === "BackCompat" ) {
|
||||
// jQuery has never supported or tested Quirks Mode
|
||||
migrateWarn( "jQuery is not compatible with Quirks Mode" );
|
||||
}
|
||||
|
||||
|
||||
var attrFn = {},
|
||||
oldAttr = jQuery.attr,
|
||||
valueAttrGet = jQuery.attrHooks.value && jQuery.attrHooks.value.get ||
|
||||
function() { return null; },
|
||||
valueAttrSet = jQuery.attrHooks.value && jQuery.attrHooks.value.set ||
|
||||
function() { return undefined; },
|
||||
rnoType = /^(?:input|button)$/i,
|
||||
rnoAttrNodeType = /^[238]$/,
|
||||
rboolean = /^(?:autofocus|autoplay|async|checked|controls|defer|disabled|hidden|loop|multiple|open|readonly|required|scoped|selected)$/i,
|
||||
ruseDefault = /^(?:checked|selected)$/i;
|
||||
|
||||
// jQuery.attrFn
|
||||
migrateWarnProp( jQuery, "attrFn", attrFn, "jQuery.attrFn is deprecated" );
|
||||
|
||||
jQuery.attr = function( elem, name, value, pass ) {
|
||||
var lowerName = name.toLowerCase(),
|
||||
nType = elem && elem.nodeType;
|
||||
|
||||
// Since pass is used internally, we only warn and shim for new jQuery
|
||||
// versions where there isn't a pass arg in the formal params
|
||||
if ( pass && oldAttr.length < 4 ) {
|
||||
migrateWarn("jQuery.fn.attr( props, pass ) is deprecated");
|
||||
if ( elem && !rnoAttrNodeType.test( nType ) && jQuery.isFunction( jQuery.fn[ name ] ) ) {
|
||||
return jQuery( elem )[ name ]( value );
|
||||
}
|
||||
}
|
||||
|
||||
// Warn if user tries to set `type`, since it breaks on IE 6/7/8; by checking
|
||||
// for disconnected elements we don't warn on $( "<button>", { type: "button" } ).
|
||||
if ( name === "type" && value !== undefined && rnoType.test( elem.nodeName ) && elem.parentNode ) {
|
||||
migrateWarn("Can't change the 'type' of an input or button in IE 6/7/8");
|
||||
}
|
||||
|
||||
// Restore boolHook for boolean property/attribute synchronization
|
||||
if ( !jQuery.attrHooks[ lowerName ] && rboolean.test( lowerName ) ) {
|
||||
jQuery.attrHooks[ lowerName ] = {
|
||||
get: function( elem, name ) {
|
||||
// Align boolean attributes with corresponding properties
|
||||
// Fall back to attribute presence where some booleans are not supported
|
||||
var attrNode,
|
||||
property = jQuery.prop( elem, name );
|
||||
return property === true || typeof property !== "boolean" &&
|
||||
( attrNode = elem.getAttributeNode(name) ) && attrNode.nodeValue !== false ?
|
||||
|
||||
name.toLowerCase() :
|
||||
undefined;
|
||||
},
|
||||
set: function( elem, value, name ) {
|
||||
var propName;
|
||||
if ( value === false ) {
|
||||
// Remove boolean attributes when set to false
|
||||
jQuery.removeAttr( elem, name );
|
||||
} else {
|
||||
// value is true since we know at this point it's type boolean and not false
|
||||
// Set boolean attributes to the same name and set the DOM property
|
||||
propName = jQuery.propFix[ name ] || name;
|
||||
if ( propName in elem ) {
|
||||
// Only set the IDL specifically if it already exists on the element
|
||||
elem[ propName ] = true;
|
||||
}
|
||||
|
||||
elem.setAttribute( name, name.toLowerCase() );
|
||||
}
|
||||
return name;
|
||||
}
|
||||
};
|
||||
|
||||
// Warn only for attributes that can remain distinct from their properties post-1.9
|
||||
if ( ruseDefault.test( lowerName ) ) {
|
||||
migrateWarn( "jQuery.fn.attr('" + lowerName + "') may use property instead of attribute" );
|
||||
}
|
||||
}
|
||||
|
||||
return oldAttr.call( jQuery, elem, name, value );
|
||||
};
|
||||
|
||||
// attrHooks: value
|
||||
jQuery.attrHooks.value = {
|
||||
get: function( elem, name ) {
|
||||
var nodeName = ( elem.nodeName || "" ).toLowerCase();
|
||||
if ( nodeName === "button" ) {
|
||||
return valueAttrGet.apply( this, arguments );
|
||||
}
|
||||
if ( nodeName !== "input" && nodeName !== "option" ) {
|
||||
migrateWarn("jQuery.fn.attr('value') no longer gets properties");
|
||||
}
|
||||
return name in elem ?
|
||||
elem.value :
|
||||
null;
|
||||
},
|
||||
set: function( elem, value ) {
|
||||
var nodeName = ( elem.nodeName || "" ).toLowerCase();
|
||||
if ( nodeName === "button" ) {
|
||||
return valueAttrSet.apply( this, arguments );
|
||||
}
|
||||
if ( nodeName !== "input" && nodeName !== "option" ) {
|
||||
migrateWarn("jQuery.fn.attr('value', val) no longer sets properties");
|
||||
}
|
||||
// Does not return so that setAttribute is also used
|
||||
elem.value = value;
|
||||
}
|
||||
};
|
||||
|
||||
|
||||
var matched, browser,
|
||||
oldInit = jQuery.fn.init,
|
||||
oldParseJSON = jQuery.parseJSON,
|
||||
// Note this does NOT include the #9521 XSS fix from 1.7!
|
||||
rquickExpr = /^(?:[^<]*(<[\w\W]+>)[^>]*|#([\w\-]*))$/;
|
||||
|
||||
// $(html) "looks like html" rule change
|
||||
jQuery.fn.init = function( selector, context, rootjQuery ) {
|
||||
var match;
|
||||
|
||||
if ( selector && typeof selector === "string" && !jQuery.isPlainObject( context ) &&
|
||||
(match = rquickExpr.exec( selector )) && match[1] ) {
|
||||
// This is an HTML string according to the "old" rules; is it still?
|
||||
if ( selector.charAt( 0 ) !== "<" ) {
|
||||
migrateWarn("$(html) HTML strings must start with '<' character");
|
||||
}
|
||||
// Now process using loose rules; let pre-1.8 play too
|
||||
if ( context && context.context ) {
|
||||
// jQuery object as context; parseHTML expects a DOM object
|
||||
context = context.context;
|
||||
}
|
||||
if ( jQuery.parseHTML ) {
|
||||
return oldInit.call( this, jQuery.parseHTML( jQuery.trim(selector), context, true ),
|
||||
context, rootjQuery );
|
||||
}
|
||||
}
|
||||
return oldInit.apply( this, arguments );
|
||||
};
|
||||
jQuery.fn.init.prototype = jQuery.fn;
|
||||
|
||||
// Let $.parseJSON(falsy_value) return null
|
||||
jQuery.parseJSON = function( json ) {
|
||||
if ( !json && json !== null ) {
|
||||
migrateWarn("jQuery.parseJSON requires a valid JSON string");
|
||||
return null;
|
||||
}
|
||||
return oldParseJSON.apply( this, arguments );
|
||||
};
|
||||
|
||||
jQuery.uaMatch = function( ua ) {
|
||||
ua = ua.toLowerCase();
|
||||
|
||||
var match = /(chrome)[ \/]([\w.]+)/.exec( ua ) ||
|
||||
/(webkit)[ \/]([\w.]+)/.exec( ua ) ||
|
||||
/(opera)(?:.*version|)[ \/]([\w.]+)/.exec( ua ) ||
|
||||
/(msie) ([\w.]+)/.exec( ua ) ||
|
||||
ua.indexOf("compatible") < 0 && /(mozilla)(?:.*? rv:([\w.]+)|)/.exec( ua ) ||
|
||||
[];
|
||||
|
||||
return {
|
||||
browser: match[ 1 ] || "",
|
||||
version: match[ 2 ] || "0"
|
||||
};
|
||||
};
|
||||
|
||||
matched = jQuery.uaMatch( navigator.userAgent );
|
||||
browser = {};
|
||||
|
||||
if ( matched.browser ) {
|
||||
browser[ matched.browser ] = true;
|
||||
browser.version = matched.version;
|
||||
}
|
||||
|
||||
// Chrome is Webkit, but Webkit is also Safari.
|
||||
if ( browser.chrome ) {
|
||||
browser.webkit = true;
|
||||
} else if ( browser.webkit ) {
|
||||
browser.safari = true;
|
||||
}
|
||||
|
||||
jQuery.browser = browser;
|
||||
|
||||
// Warn if the code tries to get jQuery.browser
|
||||
migrateWarnProp( jQuery, "browser", browser, "jQuery.browser is deprecated" );
|
||||
|
||||
jQuery.sub = function() {
|
||||
function jQuerySub( selector, context ) {
|
||||
return new jQuerySub.fn.init( selector, context );
|
||||
}
|
||||
jQuery.extend( true, jQuerySub, this );
|
||||
jQuerySub.superclass = this;
|
||||
jQuerySub.fn = jQuerySub.prototype = this();
|
||||
jQuerySub.fn.constructor = jQuerySub;
|
||||
jQuerySub.sub = this.sub;
|
||||
jQuerySub.fn.init = function init( selector, context ) {
|
||||
if ( context && context instanceof jQuery && !(context instanceof jQuerySub) ) {
|
||||
context = jQuerySub( context );
|
||||
}
|
||||
|
||||
return jQuery.fn.init.call( this, selector, context, rootjQuerySub );
|
||||
};
|
||||
jQuerySub.fn.init.prototype = jQuerySub.fn;
|
||||
var rootjQuerySub = jQuerySub(document);
|
||||
migrateWarn( "jQuery.sub() is deprecated" );
|
||||
return jQuerySub;
|
||||
};
|
||||
|
||||
|
||||
var oldFnData = jQuery.fn.data;
|
||||
|
||||
jQuery.fn.data = function( name ) {
|
||||
var ret, evt,
|
||||
elem = this[0];
|
||||
|
||||
// Handles 1.7 which has this behavior and 1.8 which doesn't
|
||||
if ( elem && name === "events" && arguments.length === 1 ) {
|
||||
ret = jQuery.data( elem, name );
|
||||
evt = jQuery._data( elem, name );
|
||||
if ( ( ret === undefined || ret === evt ) && evt !== undefined ) {
|
||||
migrateWarn("Use of jQuery.fn.data('events') is deprecated");
|
||||
return evt;
|
||||
}
|
||||
}
|
||||
return oldFnData.apply( this, arguments );
|
||||
};
|
||||
|
||||
|
||||
var rscriptType = /\/(java|ecma)script/i,
|
||||
oldSelf = jQuery.fn.andSelf || jQuery.fn.addBack;
|
||||
|
||||
jQuery.fn.andSelf = function() {
|
||||
migrateWarn("jQuery.fn.andSelf() replaced by jQuery.fn.addBack()");
|
||||
return oldSelf.apply( this, arguments );
|
||||
};
|
||||
|
||||
// Since jQuery.clean is used internally on older versions, we only shim if it's missing
|
||||
if ( !jQuery.clean ) {
|
||||
jQuery.clean = function( elems, context, fragment, scripts ) {
|
||||
// Set context per 1.8 logic
|
||||
context = context || document;
|
||||
context = !context.nodeType && context[0] || context;
|
||||
context = context.ownerDocument || context;
|
||||
|
||||
migrateWarn("jQuery.clean() is deprecated");
|
||||
|
||||
var i, elem, handleScript, jsTags,
|
||||
ret = [];
|
||||
|
||||
jQuery.merge( ret, jQuery.buildFragment( elems, context ).childNodes );
|
||||
|
||||
// Complex logic lifted directly from jQuery 1.8
|
||||
if ( fragment ) {
|
||||
// Special handling of each script element
|
||||
handleScript = function( elem ) {
|
||||
// Check if we consider it executable
|
||||
if ( !elem.type || rscriptType.test( elem.type ) ) {
|
||||
// Detach the script and store it in the scripts array (if provided) or the fragment
|
||||
// Return truthy to indicate that it has been handled
|
||||
return scripts ?
|
||||
scripts.push( elem.parentNode ? elem.parentNode.removeChild( elem ) : elem ) :
|
||||
fragment.appendChild( elem );
|
||||
}
|
||||
};
|
||||
|
||||
for ( i = 0; (elem = ret[i]) != null; i++ ) {
|
||||
// Check if we're done after handling an executable script
|
||||
if ( !( jQuery.nodeName( elem, "script" ) && handleScript( elem ) ) ) {
|
||||
// Append to fragment and handle embedded scripts
|
||||
fragment.appendChild( elem );
|
||||
if ( typeof elem.getElementsByTagName !== "undefined" ) {
|
||||
// handleScript alters the DOM, so use jQuery.merge to ensure snapshot iteration
|
||||
jsTags = jQuery.grep( jQuery.merge( [], elem.getElementsByTagName("script") ), handleScript );
|
||||
|
||||
// Splice the scripts into ret after their former ancestor and advance our index beyond them
|
||||
ret.splice.apply( ret, [i + 1, 0].concat( jsTags ) );
|
||||
i += jsTags.length;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return ret;
|
||||
};
|
||||
}
|
||||
|
||||
var eventAdd = jQuery.event.add,
|
||||
eventRemove = jQuery.event.remove,
|
||||
eventTrigger = jQuery.event.trigger,
|
||||
oldToggle = jQuery.fn.toggle,
|
||||
oldLive = jQuery.fn.live,
|
||||
oldDie = jQuery.fn.die,
|
||||
ajaxEvents = "ajaxStart|ajaxStop|ajaxSend|ajaxComplete|ajaxError|ajaxSuccess",
|
||||
rajaxEvent = new RegExp( "\\b(?:" + ajaxEvents + ")\\b" ),
|
||||
rhoverHack = /(?:^|\s)hover(\.\S+|)\b/,
|
||||
hoverHack = function( events ) {
|
||||
if ( typeof( events ) != "string" || jQuery.event.special.hover ) {
|
||||
return events;
|
||||
}
|
||||
if ( rhoverHack.test( events ) ) {
|
||||
migrateWarn("'hover' pseudo-event is deprecated, use 'mouseenter mouseleave'");
|
||||
}
|
||||
return events && events.replace( rhoverHack, "mouseenter$1 mouseleave$1" );
|
||||
};
|
||||
|
||||
// Event props removed in 1.9, put them back if needed; no practical way to warn them
|
||||
if ( jQuery.event.props && jQuery.event.props[ 0 ] !== "attrChange" ) {
|
||||
jQuery.event.props.unshift( "attrChange", "attrName", "relatedNode", "srcElement" );
|
||||
}
|
||||
|
||||
// Undocumented jQuery.event.handle was "deprecated" in jQuery 1.7
|
||||
if ( jQuery.event.dispatch ) {
|
||||
migrateWarnProp( jQuery.event, "handle", jQuery.event.dispatch, "jQuery.event.handle is undocumented and deprecated" );
|
||||
}
|
||||
|
||||
// Support for 'hover' pseudo-event and ajax event warnings
|
||||
jQuery.event.add = function( elem, types, handler, data, selector ){
|
||||
if ( elem !== document && rajaxEvent.test( types ) ) {
|
||||
migrateWarn( "AJAX events should be attached to document: " + types );
|
||||
}
|
||||
eventAdd.call( this, elem, hoverHack( types || "" ), handler, data, selector );
|
||||
};
|
||||
jQuery.event.remove = function( elem, types, handler, selector, mappedTypes ){
|
||||
eventRemove.call( this, elem, hoverHack( types ) || "", handler, selector, mappedTypes );
|
||||
};
|
||||
|
||||
jQuery.fn.error = function() {
|
||||
var args = Array.prototype.slice.call( arguments, 0);
|
||||
migrateWarn("jQuery.fn.error() is deprecated");
|
||||
args.splice( 0, 0, "error" );
|
||||
if ( arguments.length ) {
|
||||
return this.bind.apply( this, args );
|
||||
}
|
||||
// error event should not bubble to window, although it does pre-1.7
|
||||
this.triggerHandler.apply( this, args );
|
||||
return this;
|
||||
};
|
||||
|
||||
jQuery.fn.toggle = function( fn, fn2 ) {
|
||||
|
||||
// Don't mess with animation or css toggles
|
||||
if ( !jQuery.isFunction( fn ) || !jQuery.isFunction( fn2 ) ) {
|
||||
return oldToggle.apply( this, arguments );
|
||||
}
|
||||
migrateWarn("jQuery.fn.toggle(handler, handler...) is deprecated");
|
||||
|
||||
// Save reference to arguments for access in closure
|
||||
var args = arguments,
|
||||
guid = fn.guid || jQuery.guid++,
|
||||
i = 0,
|
||||
toggler = function( event ) {
|
||||
// Figure out which function to execute
|
||||
var lastToggle = ( jQuery._data( this, "lastToggle" + fn.guid ) || 0 ) % i;
|
||||
jQuery._data( this, "lastToggle" + fn.guid, lastToggle + 1 );
|
||||
|
||||
// Make sure that clicks stop
|
||||
event.preventDefault();
|
||||
|
||||
// and execute the function
|
||||
return args[ lastToggle ].apply( this, arguments ) || false;
|
||||
};
|
||||
|
||||
// link all the functions, so any of them can unbind this click handler
|
||||
toggler.guid = guid;
|
||||
while ( i < args.length ) {
|
||||
args[ i++ ].guid = guid;
|
||||
}
|
||||
|
||||
return this.click( toggler );
|
||||
};
|
||||
|
||||
jQuery.fn.live = function( types, data, fn ) {
|
||||
migrateWarn("jQuery.fn.live() is deprecated");
|
||||
if ( oldLive ) {
|
||||
return oldLive.apply( this, arguments );
|
||||
}
|
||||
jQuery( this.context ).on( types, this.selector, data, fn );
|
||||
return this;
|
||||
};
|
||||
|
||||
jQuery.fn.die = function( types, fn ) {
|
||||
migrateWarn("jQuery.fn.die() is deprecated");
|
||||
if ( oldDie ) {
|
||||
return oldDie.apply( this, arguments );
|
||||
}
|
||||
jQuery( this.context ).off( types, this.selector || "**", fn );
|
||||
return this;
|
||||
};
|
||||
|
||||
// Turn global events into document-triggered events
|
||||
jQuery.event.trigger = function( event, data, elem, onlyHandlers ){
|
||||
if ( !elem & !rajaxEvent.test( event ) ) {
|
||||
migrateWarn( "Global events are undocumented and deprecated" );
|
||||
}
|
||||
return eventTrigger.call( this, event, data, elem || document, onlyHandlers );
|
||||
};
|
||||
jQuery.each( ajaxEvents.split("|"),
|
||||
function( _, name ) {
|
||||
jQuery.event.special[ name ] = {
|
||||
setup: function() {
|
||||
var elem = this;
|
||||
|
||||
// The document needs no shimming; must be !== for oldIE
|
||||
if ( elem !== document ) {
|
||||
jQuery.event.add( document, name + "." + jQuery.guid, function() {
|
||||
jQuery.event.trigger( name, null, elem, true );
|
||||
});
|
||||
jQuery._data( this, name, jQuery.guid++ );
|
||||
}
|
||||
return false;
|
||||
},
|
||||
teardown: function() {
|
||||
if ( this !== document ) {
|
||||
jQuery.event.remove( document, name + "." + jQuery._data( this, name ) );
|
||||
}
|
||||
return false;
|
||||
}
|
||||
};
|
||||
}
|
||||
);
|
||||
|
||||
|
||||
})( jQuery, window );
|
||||
3
www/lib/jQuery/jquery-migrate.min.js
vendored
Normal file
3
www/lib/jQuery/jquery-migrate.min.js
vendored
Normal file
File diff suppressed because one or more lines are too long
9597
www/lib/jQuery/jquery.js
vendored
Normal file
9597
www/lib/jQuery/jquery.js
vendored
Normal file
File diff suppressed because it is too large
Load Diff
5
www/lib/jQuery/jquery.min.js
vendored
Normal file
5
www/lib/jQuery/jquery.min.js
vendored
Normal file
File diff suppressed because one or more lines are too long
1
www/lib/jQuery/jquery.min.map
Normal file
1
www/lib/jQuery/jquery.min.map
Normal file
File diff suppressed because one or more lines are too long
39
www/lib/jQuery/package.json
Normal file
39
www/lib/jQuery/package.json
Normal file
@@ -0,0 +1,39 @@
|
||||
{
|
||||
"name": "jquery",
|
||||
"title": "jQuery",
|
||||
"description": "JavaScript library for DOM operations",
|
||||
"version": "1.9.1",
|
||||
"homepage": "http://jquery.com",
|
||||
"author": {
|
||||
"name": "jQuery Foundation and other contributors",
|
||||
"url": "https://github.com/jquery/jquery/blob/master/AUTHORS.txt"
|
||||
},
|
||||
"repository": {
|
||||
"type": "git",
|
||||
"url": "https://github.com/jquery/jquery.git"
|
||||
},
|
||||
"bugs": {
|
||||
"url": "http://bugs.jquery.com"
|
||||
},
|
||||
"licenses": [
|
||||
{
|
||||
"type": "MIT",
|
||||
"url": "https://github.com/jquery/jquery/blob/master/MIT-LICENSE.txt"
|
||||
}
|
||||
],
|
||||
"scripts": {
|
||||
"test": "./node_modules/.bin/grunt"
|
||||
},
|
||||
"dependencies": {},
|
||||
"devDependencies": {
|
||||
"grunt-compare-size": "~0.3.0",
|
||||
"grunt-git-authors": "~1.1.0",
|
||||
"grunt-update-submodules": "~0.2.0",
|
||||
"grunt-contrib-watch": "~0.1.1",
|
||||
"grunt-contrib-jshint": "~0.1.1",
|
||||
"grunt-contrib-uglify": "~0.1.1",
|
||||
"grunt": "~0.4.0",
|
||||
"testswarm": "0.2.2"
|
||||
},
|
||||
"keywords": []
|
||||
}
|
||||
15
www/lib/jQuery/speed/benchmark.js
Normal file
15
www/lib/jQuery/speed/benchmark.js
Normal file
@@ -0,0 +1,15 @@
|
||||
// Runs a function many times without the function call overhead
|
||||
function benchmark(fn, times, name){
|
||||
fn = fn.toString();
|
||||
var s = fn.indexOf('{')+1,
|
||||
e = fn.lastIndexOf('}');
|
||||
fn = fn.substring(s,e);
|
||||
|
||||
return benchmarkString(fn, times, name);
|
||||
}
|
||||
|
||||
function benchmarkString(fn, times, name) {
|
||||
var fn = new Function("i", "var t=new Date; while(i--) {" + fn + "}; return new Date - t")(times)
|
||||
fn.displayName = name || "benchmarked";
|
||||
return fn;
|
||||
}
|
||||
65
www/lib/jQuery/speed/benchmarker.css
Normal file
65
www/lib/jQuery/speed/benchmarker.css
Normal file
@@ -0,0 +1,65 @@
|
||||
|
||||
.dialog {
|
||||
margin-bottom: 1em;
|
||||
}
|
||||
a.expand {
|
||||
background: #e3e3e3;
|
||||
}
|
||||
|
||||
div#time-test {
|
||||
font-family: Arial, Helvetica, sans-serif;
|
||||
font-size: 62.5%;
|
||||
}
|
||||
|
||||
td.test button {
|
||||
float: right;
|
||||
}
|
||||
|
||||
table {
|
||||
border: 1px solid #000;
|
||||
}
|
||||
|
||||
table td, table th {
|
||||
border: 1px solid #000;
|
||||
padding: 10px;
|
||||
}
|
||||
|
||||
td.winner {
|
||||
background-color: #cfc;
|
||||
}
|
||||
|
||||
td.tie {
|
||||
background-color: #ffc;
|
||||
}
|
||||
|
||||
td.fail {
|
||||
background-color: #f99;
|
||||
font-weight: bold;
|
||||
text-align: center;
|
||||
}
|
||||
|
||||
tfoot td {
|
||||
text-align: center;
|
||||
}
|
||||
|
||||
#time-test {
|
||||
margin: 1em 0;
|
||||
padding: .5em;
|
||||
background: #e3e3e3;
|
||||
}
|
||||
#time-taken {
|
||||
font-weight: bold;
|
||||
}
|
||||
|
||||
span.wins {
|
||||
color: #330;
|
||||
}
|
||||
|
||||
span.fails {
|
||||
color: #900;
|
||||
}
|
||||
|
||||
div.buttons {
|
||||
margin-top: 10px;
|
||||
margin-bottom: 10px;
|
||||
}
|
||||
181
www/lib/jQuery/speed/benchmarker.js
Normal file
181
www/lib/jQuery/speed/benchmarker.js
Normal file
@@ -0,0 +1,181 @@
|
||||
jQuery.benchmarker.tests = [
|
||||
// Selectors from:
|
||||
// http://ejohn.org/blog/selectors-that-people-actually-use/
|
||||
/*
|
||||
// For Amazon.com
|
||||
"#navAmazonLogo", "#navSwmSkedPop",
|
||||
".navbar", ".navGreeting",
|
||||
"div", "table",
|
||||
"img.navCrossshopTabCap", "span.navGreeting",
|
||||
"#navbar table", "#navidWelcomeMsg span",
|
||||
"div#navbar", "ul#navAmazonLogo",
|
||||
"#navAmazonLogo .navAmazonLogoGatewayPanel", "#navidWelcomeMsg .navGreeting",
|
||||
".navbar .navAmazonLogoGatewayPanel", ".navbar .navGreeting",
|
||||
"*",
|
||||
"#navAmazonLogo li.navAmazonLogoGatewayPanel", "#navidWelcomeMsg span.navGreeting",
|
||||
"a[name=top]", "form[name=site-search]",
|
||||
".navbar li", ".navbar span",
|
||||
"[name=top]", "[name=site-search]",
|
||||
"ul li", "a img",
|
||||
"#navbar #navidWelcomeMsg", "#navbar #navSwmDWPop",
|
||||
"#navbar ul li", "#navbar a img"
|
||||
*/
|
||||
// For Yahoo.com
|
||||
"#page", "#masthead", "#mastheadhd",
|
||||
".mastheadbd", ".first", ".on",
|
||||
"div", "li", "a",
|
||||
"div.mastheadbd", "li.first", "li.on",
|
||||
"#page div", "#dtba span",
|
||||
"div#page", "div#masthead",
|
||||
"#page .mastheadbd", "#page .first",
|
||||
".outer_search_container .search_container", ".searchbox_container .inputtext",
|
||||
"*",
|
||||
"#page div.mastheadbd", "#page li.first",
|
||||
"input[name=p]", "a[name=marketplace]",
|
||||
".outer_search_container div", ".searchbox_container span",
|
||||
"[name=p]", "[name=marketplace]",
|
||||
"ul li", "form input",
|
||||
"#page #e2econtent", "#page #e2e"
|
||||
];
|
||||
|
||||
jQuery.fn.benchmark = function() {
|
||||
this.each(function() {
|
||||
try {
|
||||
jQuery(this).parent().children("*:gt(1)").remove();
|
||||
} catch(e) { }
|
||||
})
|
||||
// set # times to run the test in index.html
|
||||
var times = parseInt(jQuery("#times").val());
|
||||
jQuery.benchmarker.startingList = this.get();
|
||||
benchmark(this.get(), times, jQuery.benchmarker.libraries);
|
||||
}
|
||||
|
||||
jQuery(function() {
|
||||
for(i = 0; i < jQuery.benchmarker.tests.length; i++) {
|
||||
jQuery("tbody").append("<tr><td class='test'>" + jQuery.benchmarker.tests[i] + "</td></tr>");
|
||||
}
|
||||
jQuery("tbody tr:first-child").remove();
|
||||
jQuery("td.test").before("<td><input type='checkbox' checked='checked' /></td>");
|
||||
jQuery("button.runTests").bind("click", function() {
|
||||
jQuery('td:has(input:checked) + td.test').benchmark();
|
||||
});
|
||||
|
||||
jQuery("button.retryTies").bind("click", function() { jQuery("tr:has(td.tie) td.test").benchmark() })
|
||||
|
||||
jQuery("button.selectAll").bind("click", function() { jQuery("input[type=checkbox]").each(function() { this.checked = true }) })
|
||||
jQuery("button.deselectAll").bind("click", function() { jQuery("input[type=checkbox]").each(function() { this.checked = false }) })
|
||||
|
||||
jQuery("#addTest").bind("click", function() {
|
||||
jQuery("table").append("<tr><td><input type='checkbox' /></td><td><input type='text' /><button>Add</button></td></tr>");
|
||||
jQuery("div#time-test > button").each(function() { this.disabled = true; })
|
||||
jQuery("tbody tr:last button").bind("click", function() {
|
||||
var td = jQuery(this).parent();
|
||||
td.html("<button>-</button>" + jQuery(this).prev().val()).addClass("test");
|
||||
jQuery("div#time-test > button").each(function() { this.disabled = false; })
|
||||
jQuery("button", td).bind("click", function() { jQuery(this).parents("tr").remove(); })
|
||||
})
|
||||
})
|
||||
|
||||
var headers = jQuery.map(jQuery.benchmarker.libraries, function(i,n) {
|
||||
var extra = n == 0 ? "basis - " : "";
|
||||
return "<th>" + extra + i + "</th>"
|
||||
}).join("");
|
||||
|
||||
jQuery("thead tr").append(headers);
|
||||
|
||||
var footers = "";
|
||||
for(i = 0; i < jQuery.benchmarker.libraries.length; i++)
|
||||
footers += "<th></th>"
|
||||
|
||||
var wlfooters = "";
|
||||
for(i = 0; i < jQuery.benchmarker.libraries.length; i++)
|
||||
wlfooters += "<td><span class='wins'>W</span> / <span class='fails'>F</span></th>"
|
||||
|
||||
jQuery("tfoot tr:first").append(footers);
|
||||
jQuery("tfoot tr:last").append(wlfooters);
|
||||
|
||||
});
|
||||
|
||||
benchmark = function(list, times, libraries) {
|
||||
if(list[0]) {
|
||||
var times = times || 50;
|
||||
var el = list[0];
|
||||
var code = jQuery(el).text().replace(/^-/, "");
|
||||
var timeArr = []
|
||||
for(i = 0; i < times + 2; i++) {
|
||||
var time = new Date()
|
||||
try {
|
||||
window[libraries[0]](code);
|
||||
} catch(e) { }
|
||||
timeArr.push(new Date() - time);
|
||||
}
|
||||
var diff = Math.sum(timeArr) - Math.max.apply( Math, timeArr )
|
||||
- Math.min.apply( Math, timeArr );
|
||||
try {
|
||||
var libRes = window[libraries[0]](code);
|
||||
var jqRes = jQuery(code);
|
||||
if(((jqRes.length == 0) && (libRes.length != 0)) ||
|
||||
(libRes.length > 0 && (jqRes.length == libRes.length)) ||
|
||||
((libraries[0] == "cssQuery" || libraries[0] == "jQuery") && code.match(/nth\-child/) && (libRes.length > 0)) ||
|
||||
((libraries[0] == "jQold") && jqRes.length > 0)) {
|
||||
jQuery(el).parent().append("<td>" + Math.round(diff / times * 100) / 100 + "ms</td>");
|
||||
} else {
|
||||
jQuery(el).parent().append("<td class='fail'>FAIL</td>");
|
||||
}
|
||||
} catch(e) {
|
||||
jQuery(el).parent().append("<td class='fail'>FAIL</td>");
|
||||
}
|
||||
setTimeout(benchmarkList(list, times, libraries), 100);
|
||||
} else if(libraries[1]) {
|
||||
benchmark(jQuery.benchmarker.startingList, times, libraries.slice(1));
|
||||
} else {
|
||||
jQuery("tbody tr").each(function() {
|
||||
var winners = jQuery("td:gt(1)", this).min(2);
|
||||
if(winners.length == 1) winners.addClass("winner");
|
||||
else winners.addClass("tie");
|
||||
});
|
||||
setTimeout(count, 100);
|
||||
}
|
||||
}
|
||||
|
||||
function benchmarkList(list, times, libraries) {
|
||||
return function() {
|
||||
benchmark(list.slice(1), times, libraries);
|
||||
}
|
||||
}
|
||||
|
||||
function count() {
|
||||
for(i = 3; i <= jQuery.benchmarker.libraries.length + 2 ; i++) {
|
||||
var fails = jQuery("td:nth-child(" + i + ").fail").length;
|
||||
var wins = jQuery("td:nth-child(" + i + ").winner").length;
|
||||
jQuery("tfoot tr:first th:eq(" + (i - 1) + ")")
|
||||
.html("<span class='wins'>" + wins + "</span> / <span class='fails'>" + fails + "</span>");
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
jQuery.fn.maxmin = function(tolerance, maxmin, percentage) {
|
||||
tolerance = tolerance || 0;
|
||||
var target = Math[maxmin].apply(Math, jQuery.map(this, function(i) {
|
||||
var parsedNum = parseFloat(i.innerHTML.replace(/[^\.\d]/g, ""));
|
||||
if(parsedNum || (parsedNum == 0)) return parsedNum;
|
||||
}));
|
||||
return this.filter(function() {
|
||||
if( withinTolerance(parseFloat(this.innerHTML.replace(/[^\.\d]/g, "")), target, tolerance, percentage) ) return true;
|
||||
})
|
||||
}
|
||||
|
||||
jQuery.fn.max = function(tolerance, percentage) { return this.maxmin(tolerance, "max", percentage) }
|
||||
jQuery.fn.min = function(tolerance, percentage) { return this.maxmin(tolerance, "min", percentage) }
|
||||
|
||||
function withinTolerance(number, target, tolerance, percentage) {
|
||||
if(percentage) { var high = target + ((tolerance / 100) * target); var low = target - ((tolerance / 100) * target); }
|
||||
else { var high = target + tolerance; var low = target - tolerance; }
|
||||
if(number >= low && number <= high) return true;
|
||||
}
|
||||
|
||||
Math.sum = function(arr) {
|
||||
var sum = 0;
|
||||
for(i = 0; i < arr.length; i++) sum += arr[i];
|
||||
return sum;
|
||||
}
|
||||
39
www/lib/jQuery/speed/closest.html
Normal file
39
www/lib/jQuery/speed/closest.html
Normal file
@@ -0,0 +1,39 @@
|
||||
<!doctype html>
|
||||
<html>
|
||||
<head>
|
||||
<title>Test .closest() Performance</title>
|
||||
<script src="benchmark.js"></script>
|
||||
<script src="jquery-basis.js"></script>
|
||||
<script>var old = jQuery.noConflict(true);</script>
|
||||
<script src="../dist/jquery.js"></script>
|
||||
<script>
|
||||
jQuery(function ready() {
|
||||
var node = $("#child"), name;
|
||||
|
||||
jQuery.each([".zoo", "#zoo", "[data-foo=zoo]", "#nonexistant"], function(i, item) {
|
||||
setTimeout(function(){
|
||||
name = "closest '" + item + "'";
|
||||
|
||||
jQuery("#results").append("<li>" + name + "<ul>" +
|
||||
"<li>new: " + benchmarkString("$('#child').closest('" + item + "')", 2500, name) + "</li>" +
|
||||
"<li>old: " + benchmarkString("old('#child').closest('" + item + "')", 2500, name) + "</li>"
|
||||
+ "</ul></li>");
|
||||
}, 100);
|
||||
});
|
||||
});
|
||||
</script>
|
||||
</head>
|
||||
<body>
|
||||
<div>
|
||||
<p>Hello</p>
|
||||
<div class="zoo" id="zoo" data-foo="bar">
|
||||
<div>
|
||||
<p id="child">lorem ipsum</p>
|
||||
<p>dolor sit amet</p>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<ul id="results"></ul>
|
||||
</body>
|
||||
</html>
|
||||
|
||||
82
www/lib/jQuery/speed/css.html
Normal file
82
www/lib/jQuery/speed/css.html
Normal file
@@ -0,0 +1,82 @@
|
||||
<!doctype html>
|
||||
<html>
|
||||
<head>
|
||||
<title>Test Event Handling Performance</title>
|
||||
<script src="benchmark.js"></script>
|
||||
<script src="jquery-basis.js"></script>
|
||||
<script>var old = jQuery.noConflict(true);</script>
|
||||
<script src="../dist/jquery.js"></script>
|
||||
<script>
|
||||
var num = 400;
|
||||
|
||||
jQuery(function(){
|
||||
var p = old("p");
|
||||
var s = (new Date).getTime();
|
||||
|
||||
for ( var n = 0; n < 5; n++ ) {
|
||||
for ( var i = 0; i < num; i++ ) {
|
||||
p.css("position");
|
||||
p.css("top");
|
||||
p.css("left");
|
||||
p.css("display");
|
||||
}
|
||||
}
|
||||
|
||||
var oldNum = (new Date).getTime() - s;
|
||||
|
||||
p = jQuery("p");
|
||||
s = (new Date).getTime();
|
||||
|
||||
for ( var n = 0; n < 5; n++ ) {
|
||||
for ( var i = 0; i < num; i++ ) {
|
||||
p.css("position");
|
||||
p.css("top");
|
||||
p.css("left");
|
||||
p.css("display");
|
||||
}
|
||||
}
|
||||
|
||||
var curNum = (new Date).getTime() - s;
|
||||
|
||||
jQuery("#num").text( old.fn.jquery + ": " + oldNum + " " + jQuery.fn.jquery + ": " + curNum );
|
||||
});
|
||||
|
||||
jQuery(function(){
|
||||
var p = old("p");
|
||||
var s = (new Date).getTime();
|
||||
|
||||
for ( var n = 0; n < 5; n++ ) {
|
||||
for ( var i = 0; i < num; i++ ) {
|
||||
p.css("position", "relative");
|
||||
p.css("top", 15);
|
||||
p.css("left", 15);
|
||||
p.css("display", "block");
|
||||
}
|
||||
}
|
||||
|
||||
var oldNum = (new Date).getTime() - s;
|
||||
|
||||
p = jQuery("p");
|
||||
s = (new Date).getTime();
|
||||
|
||||
for ( var n = 0; n < 5; n++ ) {
|
||||
for ( var i = 0; i < num; i++ ) {
|
||||
p.css("position", "relative");
|
||||
p.css("top", 15);
|
||||
p.css("left", 15);
|
||||
p.css("display", "block");
|
||||
}
|
||||
}
|
||||
|
||||
var curNum = (new Date).getTime() - s;
|
||||
|
||||
jQuery("#num2").text( old.fn.jquery + ": " + oldNum + " " + jQuery.fn.jquery + ": " + curNum );
|
||||
});
|
||||
</script>
|
||||
<style>p { position: absolute; top: 5px; left: 5px; }</style>
|
||||
</head>
|
||||
<body>
|
||||
<p><strong>Getting Values:</strong> <span id="num">Loading...</span></p>
|
||||
<p><strong>Setting Values:</strong> <span id="num2">Loading...</span></p>
|
||||
</body>
|
||||
</html>
|
||||
58
www/lib/jQuery/speed/event.html
Normal file
58
www/lib/jQuery/speed/event.html
Normal file
@@ -0,0 +1,58 @@
|
||||
<!doctype html>
|
||||
<html>
|
||||
<head>
|
||||
<title>Test Event Handling Performance</title>
|
||||
<script src="benchmark.js"></script>
|
||||
<script src="jquery-basis.js"></script>
|
||||
<script>var old = jQuery.noConflict(true);</script>
|
||||
<script src="../dist/jquery.js"></script>
|
||||
<script>
|
||||
jQuery(function(){
|
||||
|
||||
});
|
||||
|
||||
var events = [], num = 400, exec = false;
|
||||
|
||||
jQuery(document).mousemove(function(e){
|
||||
if ( exec ) {
|
||||
return;
|
||||
}
|
||||
|
||||
if ( events.length >= num ) {
|
||||
exec = true;
|
||||
var s = (new Date).getTime();
|
||||
|
||||
for ( var n = 0; n < 5; n++ ) {
|
||||
for ( var i = 0; i < num; i++ ) {
|
||||
old.event.handle.call( document, events[i] );
|
||||
}
|
||||
}
|
||||
|
||||
var oldNum = (new Date).getTime() - s;
|
||||
|
||||
s = (new Date).getTime();
|
||||
|
||||
for ( var n = 0; n < 5; n++ ) {
|
||||
for ( var i = 0; i < num; i++ ) {
|
||||
jQuery.event.handle.call( document, events[i] );
|
||||
}
|
||||
}
|
||||
|
||||
var curNum = (new Date).getTime() - s;
|
||||
|
||||
jQuery("#num").text( old.fn.jquery + ": " + oldNum + " " + jQuery.fn.jquery + ": " + curNum );
|
||||
|
||||
jQuery(this).unbind( "mousemove", e.handler );
|
||||
|
||||
} else {
|
||||
events.push( e.originalEvent );
|
||||
jQuery("#num").text( events.length + " / " + num );
|
||||
}
|
||||
});
|
||||
</script>
|
||||
</head>
|
||||
<body>
|
||||
<p>Move the mouse, please!</p>
|
||||
<p id="num"></p>
|
||||
</body>
|
||||
</html>
|
||||
183
www/lib/jQuery/speed/filter.html
Normal file
183
www/lib/jQuery/speed/filter.html
Normal file
@@ -0,0 +1,183 @@
|
||||
<!doctype html>
|
||||
<html>
|
||||
<head>
|
||||
<title>Test .filter() Performance</title>
|
||||
<script src="benchmark.js"></script>
|
||||
<script src="jquery-basis.js"></script>
|
||||
<script>var old = jQuery.noConflict(true);</script>
|
||||
<script src="../dist/jquery.js"></script>
|
||||
<script>
|
||||
jQuery(function ready() {
|
||||
var node = $("#child"), name;
|
||||
|
||||
jQuery.each([".zoo", "#zoo", "[data-foo=zoo]", "#nonexistant"], function(i, item) {
|
||||
setTimeout(function(){
|
||||
name = "filter '" + item + "'";
|
||||
jQuery("#results").append("<li>" + name + "<ul>" +
|
||||
"<li>new: " + benchmarkString("$('div').filter('" + item + "')", 100, name) + "</li>" +
|
||||
"<li>old: " + benchmarkString("old('div').filter('" + item + "')", 100, name) + "</li>" +
|
||||
"</ul></li>");
|
||||
jQuery("#results").append("<li>single " + name + "<ul>" +
|
||||
"<li>new: " + benchmarkString("$('#nonexistant').filter('" + item + "')", 1000, name) + "</li>" +
|
||||
"<li>old: " + benchmarkString("old('#nonexistant').filter('" + item + "')", 1000, name) + "</li>" +
|
||||
"</ul></li>");
|
||||
}, 100);
|
||||
});
|
||||
});
|
||||
</script>
|
||||
</head>
|
||||
<body>
|
||||
<div>
|
||||
<p>Hello</p>
|
||||
<div class="zoo" id="nonexistant" data-foo="bar"><div></div></div>
|
||||
<div class="zoo" id="zoo" data-foo="bar"><div></div></div>
|
||||
<div class="zoo" id="zoo" data-foo="bar"><div></div></div>
|
||||
<div class="zoo" id="zoo" data-foo="bar"><div></div></div>
|
||||
<div class="zoo" id="zoo" data-foo="bar"><div></div></div>
|
||||
<div class="zoo" id="zoo" data-foo="bar"><div></div></div>
|
||||
<div class="zoo" id="zoo" data-foo="bar"><div></div></div>
|
||||
<div class="zoo" id="zoo" data-foo="bar"><div></div></div>
|
||||
<div class="zoo" id="zoo" data-foo="bar"><div></div></div>
|
||||
<div class="zoo" id="zoo" data-foo="bar"><div></div></div>
|
||||
<div class="zoo" id="zoo" data-foo="bar"><div></div></div>
|
||||
<div class="zoo" id="zoo" data-foo="bar"><div></div></div>
|
||||
<div class="zoo" id="zoo" data-foo="bar"><div></div></div>
|
||||
<div class="zoo" id="zoo" data-foo="bar"><div></div></div>
|
||||
<div class="zoo" id="zoo" data-foo="bar"><div></div></div>
|
||||
<div class="zoo" id="zoo" data-foo="bar"><div></div></div>
|
||||
<div class="zoo" id="zoo" data-foo="bar"><div></div></div>
|
||||
<div class="zoo" id="zoo" data-foo="bar"><div></div></div>
|
||||
<div class="zoo" id="zoo" data-foo="bar"><div></div></div>
|
||||
<div class="zoo" id="zoo" data-foo="bar"><div></div></div>
|
||||
<div class="zoo" id="zoo" data-foo="bar"><div></div></div>
|
||||
<div class="zoo" id="zoo" data-foo="bar"><div></div></div>
|
||||
<div class="zoo" id="zoo" data-foo="bar"><div></div></div>
|
||||
<div class="zoo" id="zoo" data-foo="bar"><div></div></div>
|
||||
<div class="zoo" id="zoo" data-foo="bar"><div></div></div>
|
||||
<div class="zoo" id="zoo" data-foo="bar"><div></div></div>
|
||||
<div class="zoo" id="zoo" data-foo="bar"><div></div></div>
|
||||
<div class="zoo" id="zoo" data-foo="bar"><div></div></div>
|
||||
<div class="zoo" id="zoo" data-foo="bar"><div></div></div>
|
||||
<div class="zoo" id="zoo" data-foo="bar"><div></div></div>
|
||||
<div class="zoo" id="zoo" data-foo="bar"><div></div></div>
|
||||
<div class="zoo" id="zoo" data-foo="bar"><div></div></div>
|
||||
<div class="zoo" id="zoo" data-foo="bar"><div></div></div>
|
||||
<div class="zoo" id="zoo" data-foo="bar"><div></div></div>
|
||||
<div class="zoo" id="zoo" data-foo="bar"><div></div></div>
|
||||
<div class="zoo" id="zoo" data-foo="bar"><div></div></div>
|
||||
<div class="zoo" id="zoo" data-foo="bar"><div></div></div>
|
||||
<div class="zoo" id="zoo" data-foo="bar"><div></div></div>
|
||||
<div class="zoo" id="zoo" data-foo="bar"><div></div></div>
|
||||
<div class="zoo" id="zoo" data-foo="bar"><div></div></div>
|
||||
<div class="zoo" id="zoo" data-foo="bar"><div></div></div>
|
||||
<div class="zoo" id="zoo" data-foo="bar"><div></div></div>
|
||||
<div class="zoo" id="zoo" data-foo="bar"><div></div></div>
|
||||
<div class="zoo" id="zoo" data-foo="bar"><div></div></div>
|
||||
<div class="zoo" id="zoo" data-foo="bar"><div></div></div>
|
||||
<div class="zoo" id="zoo" data-foo="bar"><div></div></div>
|
||||
<div class="zoo" id="zoo" data-foo="bar"><div></div></div>
|
||||
<div class="zoo" id="zoo" data-foo="bar"><div></div></div>
|
||||
<div class="zoo" id="zoo" data-foo="bar"><div></div></div>
|
||||
<div class="zoo" id="zoo" data-foo="bar"><div></div></div>
|
||||
<div class="zoo" id="zoo" data-foo="bar"><div></div></div>
|
||||
<div class="zoo" id="zoo" data-foo="bar"><div></div></div>
|
||||
<div class="zoo" id="zoo" data-foo="bar"><div></div></div>
|
||||
<div class="zoo" id="zoo" data-foo="bar"><div></div></div>
|
||||
<div class="zoo" id="zoo" data-foo="bar"><div></div></div>
|
||||
<div class="zoo" id="zoo" data-foo="bar"><div></div></div>
|
||||
<div class="zoo" id="zoo" data-foo="bar"><div></div></div>
|
||||
<div class="zoo" id="zoo" data-foo="bar"><div></div></div>
|
||||
<div class="zoo" id="zoo" data-foo="bar"><div></div></div>
|
||||
<div class="zoo" id="zoo" data-foo="bar"><div></div></div>
|
||||
<div class="zoo" id="zoo" data-foo="bar"><div></div></div>
|
||||
<div class="zoo" id="zoo" data-foo="bar"><div></div></div>
|
||||
<div class="zoo" id="zoo" data-foo="bar"><div></div></div>
|
||||
<div class="zoo" id="zoo" data-foo="bar"><div></div></div>
|
||||
<div class="zoo" id="zoo" data-foo="bar"><div></div></div>
|
||||
<div class="zoo" id="zoo" data-foo="bar"><div></div></div>
|
||||
<div class="zoo" id="zoo" data-foo="bar"><div></div></div>
|
||||
<div class="zoo" id="zoo" data-foo="bar"><div></div></div>
|
||||
<div class="zoo" id="zoo" data-foo="bar"><div></div></div>
|
||||
<div class="zoo" id="zoo" data-foo="bar"><div></div></div>
|
||||
<div class="zoo" id="zoo" data-foo="bar"><div></div></div>
|
||||
<div class="zoo" id="zoo" data-foo="bar"><div></div></div>
|
||||
<div class="zoo" id="zoo" data-foo="bar"><div></div></div>
|
||||
<div class="zoo" id="zoo" data-foo="bar"><div></div></div>
|
||||
<div class="zoo" id="zoo" data-foo="bar"><div></div></div>
|
||||
<div class="zoo" id="zoo" data-foo="bar"><div></div></div>
|
||||
<div class="zoo" id="zoo" data-foo="bar"><div></div></div>
|
||||
<div class="zoo" id="zoo" data-foo="bar"><div></div></div>
|
||||
<div class="zoo" id="zoo" data-foo="bar"><div></div></div>
|
||||
<div class="zoo" id="zoo" data-foo="bar"><div></div></div>
|
||||
<div class="zoo" id="zoo" data-foo="bar"><div></div></div>
|
||||
<div class="zoo" id="zoo" data-foo="bar"><div></div></div>
|
||||
<div class="zoo" id="zoo" data-foo="bar"><div></div></div>
|
||||
<div class="zoo" id="zoo" data-foo="bar"><div></div></div>
|
||||
<div class="zoo" id="zoo" data-foo="bar"><div></div></div>
|
||||
<div class="zoo" id="zoo" data-foo="bar"><div></div></div>
|
||||
<div class="zoo" id="zoo" data-foo="bar"><div></div></div>
|
||||
<div class="zoo" id="zoo" data-foo="bar"><div></div></div>
|
||||
<div class="zoo" id="zoo" data-foo="bar"><div></div></div>
|
||||
<div class="zoo" id="zoo" data-foo="bar"><div></div></div>
|
||||
<div class="zoo" id="zoo" data-foo="bar"><div></div></div>
|
||||
<div class="zoo" id="zoo" data-foo="bar"><div></div></div>
|
||||
<div class="zoo" id="zoo" data-foo="bar"><div></div></div>
|
||||
<div class="zoo" id="zoo" data-foo="bar"><div></div></div>
|
||||
<div class="zoo" id="zoo" data-foo="bar"><div></div></div>
|
||||
<div class="zoo" id="zoo" data-foo="bar"><div></div></div>
|
||||
<div class="zoo" id="zoo" data-foo="bar"><div></div></div>
|
||||
<div class="zoo" id="zoo" data-foo="bar"><div></div></div>
|
||||
<div class="zoo" id="zoo" data-foo="bar"><div></div></div>
|
||||
<div class="zoo" id="zoo" data-foo="bar"><div></div></div>
|
||||
<div class="zoo" id="zoo" data-foo="bar"><div></div></div>
|
||||
<div class="zoo" id="zoo" data-foo="bar"><div></div></div>
|
||||
<div class="zoo" id="zoo" data-foo="bar"><div></div></div>
|
||||
<div class="zoo" id="zoo" data-foo="bar"><div></div></div>
|
||||
<div class="zoo" id="zoo" data-foo="bar"><div></div></div>
|
||||
<div class="zoo" id="zoo" data-foo="bar"><div></div></div>
|
||||
<div class="zoo" id="zoo" data-foo="bar"><div></div></div>
|
||||
<div class="zoo" id="zoo" data-foo="bar"><div></div></div>
|
||||
<div class="zoo" id="zoo" data-foo="bar"><div></div></div>
|
||||
<div class="zoo" id="zoo" data-foo="bar"><div></div></div>
|
||||
<div class="zoo" id="zoo" data-foo="bar"><div></div></div>
|
||||
<div class="zoo" id="zoo" data-foo="bar"><div></div></div>
|
||||
<div class="zoo" id="zoo" data-foo="bar"><div></div></div>
|
||||
<div class="zoo" id="zoo" data-foo="bar"><div></div></div>
|
||||
<div class="zoo" id="zoo" data-foo="bar"><div></div></div>
|
||||
<div class="zoo" id="zoo" data-foo="bar"><div></div></div>
|
||||
<div class="zoo" id="zoo" data-foo="bar"><div></div></div>
|
||||
<div class="zoo" id="zoo" data-foo="bar"><div></div></div>
|
||||
<div class="zoo" id="zoo" data-foo="bar"><div></div></div>
|
||||
<div class="zoo" id="zoo" data-foo="bar"><div></div></div>
|
||||
<div class="zoo" id="zoo" data-foo="bar"><div></div></div>
|
||||
<div class="zoo" id="zoo" data-foo="bar"><div></div></div>
|
||||
<div class="zoo" id="zoo" data-foo="bar"><div></div></div>
|
||||
<div class="zoo" id="zoo" data-foo="bar"><div></div></div>
|
||||
<div class="zoo" id="zoo" data-foo="bar"><div></div></div>
|
||||
<div class="zoo" id="zoo" data-foo="bar"><div></div></div>
|
||||
<div class="zoo" id="zoo" data-foo="bar"><div></div></div>
|
||||
<div class="zoo" id="zoo" data-foo="bar"><div></div></div>
|
||||
<div class="zoo" id="zoo" data-foo="bar"><div></div></div>
|
||||
<div class="zoo" id="zoo" data-foo="bar"><div></div></div>
|
||||
<div class="zoo" id="zoo" data-foo="bar"><div></div></div>
|
||||
<div class="zoo" id="zoo" data-foo="bar"><div></div></div>
|
||||
<div class="zoo" id="zoo" data-foo="bar"><div></div></div>
|
||||
<div class="zoo" id="zoo" data-foo="bar"><div></div></div>
|
||||
<div class="zoo" id="zoo" data-foo="bar"><div></div></div>
|
||||
<div class="zoo" id="zoo" data-foo="bar"><div></div></div>
|
||||
<div class="zoo" id="zoo" data-foo="bar"><div></div></div>
|
||||
<div class="zoo" id="zoo" data-foo="bar"><div></div></div>
|
||||
<div class="zoo" id="zoo" data-foo="bar"><div></div></div>
|
||||
<div class="zoo" id="zoo" data-foo="bar"><div></div></div>
|
||||
<div class="zoo" id="zoo" data-foo="bar"><div></div></div>
|
||||
<div class="zoo" id="zoo" data-foo="bar"><div></div></div>
|
||||
<div class="zoo" id="zoo" data-foo="bar"><div></div></div>
|
||||
<div class="zoo" id="zoo" data-foo="bar"><div></div></div>
|
||||
<div class="zoo" id="zoo" data-foo="bar"><div></div></div>
|
||||
<div class="zoo" id="zoo" data-foo="bar"><div></div></div>
|
||||
<div class="zoo" id="zoo" data-foo="bar"><div></div></div>
|
||||
</div>
|
||||
<ul id="results"></ul>
|
||||
</body>
|
||||
</html>
|
||||
|
||||
179
www/lib/jQuery/speed/find.html
Normal file
179
www/lib/jQuery/speed/find.html
Normal file
@@ -0,0 +1,179 @@
|
||||
<!doctype html>
|
||||
<html>
|
||||
<head>
|
||||
<title>Test .find() Performance</title>
|
||||
<script src="benchmark.js"></script>
|
||||
<script src="jquery-basis.js"></script>
|
||||
<script>var old = jQuery.noConflict(true);</script>
|
||||
<script src="../dist/jquery.js"></script>
|
||||
<script>
|
||||
jQuery(function ready() {
|
||||
var node = $("#child"), name;
|
||||
|
||||
jQuery.each([".zoo", "#zoo", "[data-foo=zoo]", "#nonexistant"], function(i, item) {
|
||||
setTimeout(function(){
|
||||
name = "find '" + item + "'";
|
||||
jQuery("#results").append("<li>rooted " + name + "<ul>" +
|
||||
"<li>new: " + benchmarkString("$('body').find('" + item + "')", 250, name) + "</li>" +
|
||||
"<li>old: " + benchmarkString("old('body').find('" + item + "')", 250, name) + "</li>" +
|
||||
"</ul></li>");
|
||||
}, 100);
|
||||
});
|
||||
});
|
||||
</script>
|
||||
</head>
|
||||
<body>
|
||||
<div>
|
||||
<p>Hello</p>
|
||||
<div class="zoo" id="nonexistant" data-foo="bar"><div></div></div>
|
||||
<div class="zoo" id="zoo" data-foo="bar"><div></div></div>
|
||||
<div class="zoo" id="zoo" data-foo="bar"><div></div></div>
|
||||
<div class="zoo" id="zoo" data-foo="bar"><div></div></div>
|
||||
<div class="zoo" id="zoo" data-foo="bar"><div></div></div>
|
||||
<div class="zoo" id="zoo" data-foo="bar"><div></div></div>
|
||||
<div class="zoo" id="zoo" data-foo="bar"><div></div></div>
|
||||
<div class="zoo" id="zoo" data-foo="bar"><div></div></div>
|
||||
<div class="zoo" id="zoo" data-foo="bar"><div></div></div>
|
||||
<div class="zoo" id="zoo" data-foo="bar"><div></div></div>
|
||||
<div class="zoo" id="zoo" data-foo="bar"><div></div></div>
|
||||
<div class="zoo" id="zoo" data-foo="bar"><div></div></div>
|
||||
<div class="zoo" id="zoo" data-foo="bar"><div></div></div>
|
||||
<div class="zoo" id="zoo" data-foo="bar"><div></div></div>
|
||||
<div class="zoo" id="zoo" data-foo="bar"><div></div></div>
|
||||
<div class="zoo" id="zoo" data-foo="bar"><div></div></div>
|
||||
<div class="zoo" id="zoo" data-foo="bar"><div></div></div>
|
||||
<div class="zoo" id="zoo" data-foo="bar"><div></div></div>
|
||||
<div class="zoo" id="zoo" data-foo="bar"><div></div></div>
|
||||
<div class="zoo" id="zoo" data-foo="bar"><div></div></div>
|
||||
<div class="zoo" id="zoo" data-foo="bar"><div></div></div>
|
||||
<div class="zoo" id="zoo" data-foo="bar"><div></div></div>
|
||||
<div class="zoo" id="zoo" data-foo="bar"><div></div></div>
|
||||
<div class="zoo" id="zoo" data-foo="bar"><div></div></div>
|
||||
<div class="zoo" id="zoo" data-foo="bar"><div></div></div>
|
||||
<div class="zoo" id="zoo" data-foo="bar"><div></div></div>
|
||||
<div class="zoo" id="zoo" data-foo="bar"><div></div></div>
|
||||
<div class="zoo" id="zoo" data-foo="bar"><div></div></div>
|
||||
<div class="zoo" id="zoo" data-foo="bar"><div></div></div>
|
||||
<div class="zoo" id="zoo" data-foo="bar"><div></div></div>
|
||||
<div class="zoo" id="zoo" data-foo="bar"><div></div></div>
|
||||
<div class="zoo" id="zoo" data-foo="bar"><div></div></div>
|
||||
<div class="zoo" id="zoo" data-foo="bar"><div></div></div>
|
||||
<div class="zoo" id="zoo" data-foo="bar"><div></div></div>
|
||||
<div class="zoo" id="zoo" data-foo="bar"><div></div></div>
|
||||
<div class="zoo" id="zoo" data-foo="bar"><div></div></div>
|
||||
<div class="zoo" id="zoo" data-foo="bar"><div></div></div>
|
||||
<div class="zoo" id="zoo" data-foo="bar"><div></div></div>
|
||||
<div class="zoo" id="zoo" data-foo="bar"><div></div></div>
|
||||
<div class="zoo" id="zoo" data-foo="bar"><div></div></div>
|
||||
<div class="zoo" id="zoo" data-foo="bar"><div></div></div>
|
||||
<div class="zoo" id="zoo" data-foo="bar"><div></div></div>
|
||||
<div class="zoo" id="zoo" data-foo="bar"><div></div></div>
|
||||
<div class="zoo" id="zoo" data-foo="bar"><div></div></div>
|
||||
<div class="zoo" id="zoo" data-foo="bar"><div></div></div>
|
||||
<div class="zoo" id="zoo" data-foo="bar"><div></div></div>
|
||||
<div class="zoo" id="zoo" data-foo="bar"><div></div></div>
|
||||
<div class="zoo" id="zoo" data-foo="bar"><div></div></div>
|
||||
<div class="zoo" id="zoo" data-foo="bar"><div></div></div>
|
||||
<div class="zoo" id="zoo" data-foo="bar"><div></div></div>
|
||||
<div class="zoo" id="zoo" data-foo="bar"><div></div></div>
|
||||
<div class="zoo" id="zoo" data-foo="bar"><div></div></div>
|
||||
<div class="zoo" id="zoo" data-foo="bar"><div></div></div>
|
||||
<div class="zoo" id="zoo" data-foo="bar"><div></div></div>
|
||||
<div class="zoo" id="zoo" data-foo="bar"><div></div></div>
|
||||
<div class="zoo" id="zoo" data-foo="bar"><div></div></div>
|
||||
<div class="zoo" id="zoo" data-foo="bar"><div></div></div>
|
||||
<div class="zoo" id="zoo" data-foo="bar"><div></div></div>
|
||||
<div class="zoo" id="zoo" data-foo="bar"><div></div></div>
|
||||
<div class="zoo" id="zoo" data-foo="bar"><div></div></div>
|
||||
<div class="zoo" id="zoo" data-foo="bar"><div></div></div>
|
||||
<div class="zoo" id="zoo" data-foo="bar"><div></div></div>
|
||||
<div class="zoo" id="zoo" data-foo="bar"><div></div></div>
|
||||
<div class="zoo" id="zoo" data-foo="bar"><div></div></div>
|
||||
<div class="zoo" id="zoo" data-foo="bar"><div></div></div>
|
||||
<div class="zoo" id="zoo" data-foo="bar"><div></div></div>
|
||||
<div class="zoo" id="zoo" data-foo="bar"><div></div></div>
|
||||
<div class="zoo" id="zoo" data-foo="bar"><div></div></div>
|
||||
<div class="zoo" id="zoo" data-foo="bar"><div></div></div>
|
||||
<div class="zoo" id="zoo" data-foo="bar"><div></div></div>
|
||||
<div class="zoo" id="zoo" data-foo="bar"><div></div></div>
|
||||
<div class="zoo" id="zoo" data-foo="bar"><div></div></div>
|
||||
<div class="zoo" id="zoo" data-foo="bar"><div></div></div>
|
||||
<div class="zoo" id="zoo" data-foo="bar"><div></div></div>
|
||||
<div class="zoo" id="zoo" data-foo="bar"><div></div></div>
|
||||
<div class="zoo" id="zoo" data-foo="bar"><div></div></div>
|
||||
<div class="zoo" id="zoo" data-foo="bar"><div></div></div>
|
||||
<div class="zoo" id="zoo" data-foo="bar"><div></div></div>
|
||||
<div class="zoo" id="zoo" data-foo="bar"><div></div></div>
|
||||
<div class="zoo" id="zoo" data-foo="bar"><div></div></div>
|
||||
<div class="zoo" id="zoo" data-foo="bar"><div></div></div>
|
||||
<div class="zoo" id="zoo" data-foo="bar"><div></div></div>
|
||||
<div class="zoo" id="zoo" data-foo="bar"><div></div></div>
|
||||
<div class="zoo" id="zoo" data-foo="bar"><div></div></div>
|
||||
<div class="zoo" id="zoo" data-foo="bar"><div></div></div>
|
||||
<div class="zoo" id="zoo" data-foo="bar"><div></div></div>
|
||||
<div class="zoo" id="zoo" data-foo="bar"><div></div></div>
|
||||
<div class="zoo" id="zoo" data-foo="bar"><div></div></div>
|
||||
<div class="zoo" id="zoo" data-foo="bar"><div></div></div>
|
||||
<div class="zoo" id="zoo" data-foo="bar"><div></div></div>
|
||||
<div class="zoo" id="zoo" data-foo="bar"><div></div></div>
|
||||
<div class="zoo" id="zoo" data-foo="bar"><div></div></div>
|
||||
<div class="zoo" id="zoo" data-foo="bar"><div></div></div>
|
||||
<div class="zoo" id="zoo" data-foo="bar"><div></div></div>
|
||||
<div class="zoo" id="zoo" data-foo="bar"><div></div></div>
|
||||
<div class="zoo" id="zoo" data-foo="bar"><div></div></div>
|
||||
<div class="zoo" id="zoo" data-foo="bar"><div></div></div>
|
||||
<div class="zoo" id="zoo" data-foo="bar"><div></div></div>
|
||||
<div class="zoo" id="zoo" data-foo="bar"><div></div></div>
|
||||
<div class="zoo" id="zoo" data-foo="bar"><div></div></div>
|
||||
<div class="zoo" id="zoo" data-foo="bar"><div></div></div>
|
||||
<div class="zoo" id="zoo" data-foo="bar"><div></div></div>
|
||||
<div class="zoo" id="zoo" data-foo="bar"><div></div></div>
|
||||
<div class="zoo" id="zoo" data-foo="bar"><div></div></div>
|
||||
<div class="zoo" id="zoo" data-foo="bar"><div></div></div>
|
||||
<div class="zoo" id="zoo" data-foo="bar"><div></div></div>
|
||||
<div class="zoo" id="zoo" data-foo="bar"><div></div></div>
|
||||
<div class="zoo" id="zoo" data-foo="bar"><div></div></div>
|
||||
<div class="zoo" id="zoo" data-foo="bar"><div></div></div>
|
||||
<div class="zoo" id="zoo" data-foo="bar"><div></div></div>
|
||||
<div class="zoo" id="zoo" data-foo="bar"><div></div></div>
|
||||
<div class="zoo" id="zoo" data-foo="bar"><div></div></div>
|
||||
<div class="zoo" id="zoo" data-foo="bar"><div></div></div>
|
||||
<div class="zoo" id="zoo" data-foo="bar"><div></div></div>
|
||||
<div class="zoo" id="zoo" data-foo="bar"><div></div></div>
|
||||
<div class="zoo" id="zoo" data-foo="bar"><div></div></div>
|
||||
<div class="zoo" id="zoo" data-foo="bar"><div></div></div>
|
||||
<div class="zoo" id="zoo" data-foo="bar"><div></div></div>
|
||||
<div class="zoo" id="zoo" data-foo="bar"><div></div></div>
|
||||
<div class="zoo" id="zoo" data-foo="bar"><div></div></div>
|
||||
<div class="zoo" id="zoo" data-foo="bar"><div></div></div>
|
||||
<div class="zoo" id="zoo" data-foo="bar"><div></div></div>
|
||||
<div class="zoo" id="zoo" data-foo="bar"><div></div></div>
|
||||
<div class="zoo" id="zoo" data-foo="bar"><div></div></div>
|
||||
<div class="zoo" id="zoo" data-foo="bar"><div></div></div>
|
||||
<div class="zoo" id="zoo" data-foo="bar"><div></div></div>
|
||||
<div class="zoo" id="zoo" data-foo="bar"><div></div></div>
|
||||
<div class="zoo" id="zoo" data-foo="bar"><div></div></div>
|
||||
<div class="zoo" id="zoo" data-foo="bar"><div></div></div>
|
||||
<div class="zoo" id="zoo" data-foo="bar"><div></div></div>
|
||||
<div class="zoo" id="zoo" data-foo="bar"><div></div></div>
|
||||
<div class="zoo" id="zoo" data-foo="bar"><div></div></div>
|
||||
<div class="zoo" id="zoo" data-foo="bar"><div></div></div>
|
||||
<div class="zoo" id="zoo" data-foo="bar"><div></div></div>
|
||||
<div class="zoo" id="zoo" data-foo="bar"><div></div></div>
|
||||
<div class="zoo" id="zoo" data-foo="bar"><div></div></div>
|
||||
<div class="zoo" id="zoo" data-foo="bar"><div></div></div>
|
||||
<div class="zoo" id="zoo" data-foo="bar"><div></div></div>
|
||||
<div class="zoo" id="zoo" data-foo="bar"><div></div></div>
|
||||
<div class="zoo" id="zoo" data-foo="bar"><div></div></div>
|
||||
<div class="zoo" id="zoo" data-foo="bar"><div></div></div>
|
||||
<div class="zoo" id="zoo" data-foo="bar"><div></div></div>
|
||||
<div class="zoo" id="zoo" data-foo="bar"><div></div></div>
|
||||
<div class="zoo" id="zoo" data-foo="bar"><div></div></div>
|
||||
<div class="zoo" id="zoo" data-foo="bar"><div></div></div>
|
||||
<div class="zoo" id="zoo" data-foo="bar"><div></div></div>
|
||||
<div class="zoo" id="zoo" data-foo="bar"><div></div></div>
|
||||
</div>
|
||||
<ul id="results"></ul>
|
||||
</body>
|
||||
</html>
|
||||
|
||||
72
www/lib/jQuery/speed/index.html
Normal file
72
www/lib/jQuery/speed/index.html
Normal file
File diff suppressed because one or more lines are too long
6238
www/lib/jQuery/speed/jquery-basis.js
vendored
Normal file
6238
www/lib/jQuery/speed/jquery-basis.js
vendored
Normal file
File diff suppressed because it is too large
Load Diff
47
www/lib/jQuery/speed/slice.vs.concat.html
Normal file
47
www/lib/jQuery/speed/slice.vs.concat.html
Normal file
@@ -0,0 +1,47 @@
|
||||
<script type="text/javascript">
|
||||
(function(){
|
||||
// Conclusions:
|
||||
// slice() is a little faster than concat() except on Chrome
|
||||
// This clone() is slower on FF & IE but takes 50% on Safari & Chrome
|
||||
|
||||
var SIZE = 1e4,
|
||||
LOOPS = 500;
|
||||
|
||||
var arr = new Array(SIZE);
|
||||
for ( var i=arr.length-1; i >= 0; --i )
|
||||
arr[i] = 0;
|
||||
|
||||
var t = new Date;
|
||||
for ( i=0; i < LOOPS; i++ )
|
||||
arr.slice(0);
|
||||
var tslice = new Date - t;
|
||||
|
||||
t = new Date;
|
||||
for ( i=0; i < LOOPS; i++ )
|
||||
arr.concat();
|
||||
var tconcat = new Date - t;
|
||||
|
||||
// clone() is just to see how fast built-ins are
|
||||
t = new Date;
|
||||
for ( i=0; i < LOOPS; i++ )
|
||||
clone(arr);
|
||||
var tclone = new Date - t;
|
||||
|
||||
alert([
|
||||
'slice:'+tslice,
|
||||
'concat:'+tconcat,
|
||||
'clone:'+tclone
|
||||
].join('\n'));
|
||||
|
||||
|
||||
function clone(arr){
|
||||
var i = arr.length,
|
||||
copy = new Array(i);
|
||||
|
||||
while (i--)
|
||||
copy[i] = arr[i];
|
||||
|
||||
return copy;
|
||||
}
|
||||
})();
|
||||
</script>
|
||||
23
www/lib/jQuery/src/.jshintrc
Normal file
23
www/lib/jQuery/src/.jshintrc
Normal file
@@ -0,0 +1,23 @@
|
||||
{
|
||||
"curly": true,
|
||||
"expr": true,
|
||||
"newcap": false,
|
||||
"quotmark": "double",
|
||||
"regexdash": true,
|
||||
"trailing": true,
|
||||
"undef": true,
|
||||
"unused": true,
|
||||
"maxerr": 100,
|
||||
|
||||
"eqnull": true,
|
||||
"evil": true,
|
||||
"sub": true,
|
||||
|
||||
"browser": true,
|
||||
"wsh": true,
|
||||
|
||||
"predef": [
|
||||
"define",
|
||||
"jQuery"
|
||||
]
|
||||
}
|
||||
851
www/lib/jQuery/src/ajax.js
Normal file
851
www/lib/jQuery/src/ajax.js
Normal file
@@ -0,0 +1,851 @@
|
||||
var
|
||||
// Document location
|
||||
ajaxLocParts,
|
||||
ajaxLocation,
|
||||
ajax_nonce = jQuery.now(),
|
||||
|
||||
ajax_rquery = /\?/,
|
||||
rhash = /#.*$/,
|
||||
rts = /([?&])_=[^&]*/,
|
||||
rheaders = /^(.*?):[ \t]*([^\r\n]*)\r?$/mg, // IE leaves an \r character at EOL
|
||||
// #7653, #8125, #8152: local protocol detection
|
||||
rlocalProtocol = /^(?:about|app|app-storage|.+-extension|file|res|widget):$/,
|
||||
rnoContent = /^(?:GET|HEAD)$/,
|
||||
rprotocol = /^\/\//,
|
||||
rurl = /^([\w.+-]+:)(?:\/\/([^\/?#:]*)(?::(\d+)|)|)/,
|
||||
|
||||
// Keep a copy of the old load method
|
||||
_load = jQuery.fn.load,
|
||||
|
||||
/* Prefilters
|
||||
* 1) They are useful to introduce custom dataTypes (see ajax/jsonp.js for an example)
|
||||
* 2) These are called:
|
||||
* - BEFORE asking for a transport
|
||||
* - AFTER param serialization (s.data is a string if s.processData is true)
|
||||
* 3) key is the dataType
|
||||
* 4) the catchall symbol "*" can be used
|
||||
* 5) execution will start with transport dataType and THEN continue down to "*" if needed
|
||||
*/
|
||||
prefilters = {},
|
||||
|
||||
/* Transports bindings
|
||||
* 1) key is the dataType
|
||||
* 2) the catchall symbol "*" can be used
|
||||
* 3) selection will start with transport dataType and THEN go to "*" if needed
|
||||
*/
|
||||
transports = {},
|
||||
|
||||
// Avoid comment-prolog char sequence (#10098); must appease lint and evade compression
|
||||
allTypes = "*/".concat("*");
|
||||
|
||||
// #8138, IE may throw an exception when accessing
|
||||
// a field from window.location if document.domain has been set
|
||||
try {
|
||||
ajaxLocation = location.href;
|
||||
} catch( e ) {
|
||||
// Use the href attribute of an A element
|
||||
// since IE will modify it given document.location
|
||||
ajaxLocation = document.createElement( "a" );
|
||||
ajaxLocation.href = "";
|
||||
ajaxLocation = ajaxLocation.href;
|
||||
}
|
||||
|
||||
// Segment location into parts
|
||||
ajaxLocParts = rurl.exec( ajaxLocation.toLowerCase() ) || [];
|
||||
|
||||
// Base "constructor" for jQuery.ajaxPrefilter and jQuery.ajaxTransport
|
||||
function addToPrefiltersOrTransports( structure ) {
|
||||
|
||||
// dataTypeExpression is optional and defaults to "*"
|
||||
return function( dataTypeExpression, func ) {
|
||||
|
||||
if ( typeof dataTypeExpression !== "string" ) {
|
||||
func = dataTypeExpression;
|
||||
dataTypeExpression = "*";
|
||||
}
|
||||
|
||||
var dataType,
|
||||
i = 0,
|
||||
dataTypes = dataTypeExpression.toLowerCase().match( core_rnotwhite ) || [];
|
||||
|
||||
if ( jQuery.isFunction( func ) ) {
|
||||
// For each dataType in the dataTypeExpression
|
||||
while ( (dataType = dataTypes[i++]) ) {
|
||||
// Prepend if requested
|
||||
if ( dataType[0] === "+" ) {
|
||||
dataType = dataType.slice( 1 ) || "*";
|
||||
(structure[ dataType ] = structure[ dataType ] || []).unshift( func );
|
||||
|
||||
// Otherwise append
|
||||
} else {
|
||||
(structure[ dataType ] = structure[ dataType ] || []).push( func );
|
||||
}
|
||||
}
|
||||
}
|
||||
};
|
||||
}
|
||||
|
||||
// Base inspection function for prefilters and transports
|
||||
function inspectPrefiltersOrTransports( structure, options, originalOptions, jqXHR ) {
|
||||
|
||||
var inspected = {},
|
||||
seekingTransport = ( structure === transports );
|
||||
|
||||
function inspect( dataType ) {
|
||||
var selected;
|
||||
inspected[ dataType ] = true;
|
||||
jQuery.each( structure[ dataType ] || [], function( _, prefilterOrFactory ) {
|
||||
var dataTypeOrTransport = prefilterOrFactory( options, originalOptions, jqXHR );
|
||||
if( typeof dataTypeOrTransport === "string" && !seekingTransport && !inspected[ dataTypeOrTransport ] ) {
|
||||
options.dataTypes.unshift( dataTypeOrTransport );
|
||||
inspect( dataTypeOrTransport );
|
||||
return false;
|
||||
} else if ( seekingTransport ) {
|
||||
return !( selected = dataTypeOrTransport );
|
||||
}
|
||||
});
|
||||
return selected;
|
||||
}
|
||||
|
||||
return inspect( options.dataTypes[ 0 ] ) || !inspected[ "*" ] && inspect( "*" );
|
||||
}
|
||||
|
||||
// A special extend for ajax options
|
||||
// that takes "flat" options (not to be deep extended)
|
||||
// Fixes #9887
|
||||
function ajaxExtend( target, src ) {
|
||||
var deep, key,
|
||||
flatOptions = jQuery.ajaxSettings.flatOptions || {};
|
||||
|
||||
for ( key in src ) {
|
||||
if ( src[ key ] !== undefined ) {
|
||||
( flatOptions[ key ] ? target : ( deep || (deep = {}) ) )[ key ] = src[ key ];
|
||||
}
|
||||
}
|
||||
if ( deep ) {
|
||||
jQuery.extend( true, target, deep );
|
||||
}
|
||||
|
||||
return target;
|
||||
}
|
||||
|
||||
jQuery.fn.load = function( url, params, callback ) {
|
||||
if ( typeof url !== "string" && _load ) {
|
||||
return _load.apply( this, arguments );
|
||||
}
|
||||
|
||||
var selector, response, type,
|
||||
self = this,
|
||||
off = url.indexOf(" ");
|
||||
|
||||
if ( off >= 0 ) {
|
||||
selector = url.slice( off, url.length );
|
||||
url = url.slice( 0, off );
|
||||
}
|
||||
|
||||
// If it's a function
|
||||
if ( jQuery.isFunction( params ) ) {
|
||||
|
||||
// We assume that it's the callback
|
||||
callback = params;
|
||||
params = undefined;
|
||||
|
||||
// Otherwise, build a param string
|
||||
} else if ( params && typeof params === "object" ) {
|
||||
type = "POST";
|
||||
}
|
||||
|
||||
// If we have elements to modify, make the request
|
||||
if ( self.length > 0 ) {
|
||||
jQuery.ajax({
|
||||
url: url,
|
||||
|
||||
// if "type" variable is undefined, then "GET" method will be used
|
||||
type: type,
|
||||
dataType: "html",
|
||||
data: params
|
||||
}).done(function( responseText ) {
|
||||
|
||||
// Save response for use in complete callback
|
||||
response = arguments;
|
||||
|
||||
self.html( selector ?
|
||||
|
||||
// If a selector was specified, locate the right elements in a dummy div
|
||||
// Exclude scripts to avoid IE 'Permission Denied' errors
|
||||
jQuery("<div>").append( jQuery.parseHTML( responseText ) ).find( selector ) :
|
||||
|
||||
// Otherwise use the full result
|
||||
responseText );
|
||||
|
||||
}).complete( callback && function( jqXHR, status ) {
|
||||
self.each( callback, response || [ jqXHR.responseText, status, jqXHR ] );
|
||||
});
|
||||
}
|
||||
|
||||
return this;
|
||||
};
|
||||
|
||||
// Attach a bunch of functions for handling common AJAX events
|
||||
jQuery.each( [ "ajaxStart", "ajaxStop", "ajaxComplete", "ajaxError", "ajaxSuccess", "ajaxSend" ], function( i, type ){
|
||||
jQuery.fn[ type ] = function( fn ){
|
||||
return this.on( type, fn );
|
||||
};
|
||||
});
|
||||
|
||||
jQuery.each( [ "get", "post" ], function( i, method ) {
|
||||
jQuery[ method ] = function( url, data, callback, type ) {
|
||||
// shift arguments if data argument was omitted
|
||||
if ( jQuery.isFunction( data ) ) {
|
||||
type = type || callback;
|
||||
callback = data;
|
||||
data = undefined;
|
||||
}
|
||||
|
||||
return jQuery.ajax({
|
||||
url: url,
|
||||
type: method,
|
||||
dataType: type,
|
||||
data: data,
|
||||
success: callback
|
||||
});
|
||||
};
|
||||
});
|
||||
|
||||
jQuery.extend({
|
||||
|
||||
// Counter for holding the number of active queries
|
||||
active: 0,
|
||||
|
||||
// Last-Modified header cache for next request
|
||||
lastModified: {},
|
||||
etag: {},
|
||||
|
||||
ajaxSettings: {
|
||||
url: ajaxLocation,
|
||||
type: "GET",
|
||||
isLocal: rlocalProtocol.test( ajaxLocParts[ 1 ] ),
|
||||
global: true,
|
||||
processData: true,
|
||||
async: true,
|
||||
contentType: "application/x-www-form-urlencoded; charset=UTF-8",
|
||||
/*
|
||||
timeout: 0,
|
||||
data: null,
|
||||
dataType: null,
|
||||
username: null,
|
||||
password: null,
|
||||
cache: null,
|
||||
throws: false,
|
||||
traditional: false,
|
||||
headers: {},
|
||||
*/
|
||||
|
||||
accepts: {
|
||||
"*": allTypes,
|
||||
text: "text/plain",
|
||||
html: "text/html",
|
||||
xml: "application/xml, text/xml",
|
||||
json: "application/json, text/javascript"
|
||||
},
|
||||
|
||||
contents: {
|
||||
xml: /xml/,
|
||||
html: /html/,
|
||||
json: /json/
|
||||
},
|
||||
|
||||
responseFields: {
|
||||
xml: "responseXML",
|
||||
text: "responseText"
|
||||
},
|
||||
|
||||
// Data converters
|
||||
// Keys separate source (or catchall "*") and destination types with a single space
|
||||
converters: {
|
||||
|
||||
// Convert anything to text
|
||||
"* text": window.String,
|
||||
|
||||
// Text to html (true = no transformation)
|
||||
"text html": true,
|
||||
|
||||
// Evaluate text as a json expression
|
||||
"text json": jQuery.parseJSON,
|
||||
|
||||
// Parse text as xml
|
||||
"text xml": jQuery.parseXML
|
||||
},
|
||||
|
||||
// For options that shouldn't be deep extended:
|
||||
// you can add your own custom options here if
|
||||
// and when you create one that shouldn't be
|
||||
// deep extended (see ajaxExtend)
|
||||
flatOptions: {
|
||||
url: true,
|
||||
context: true
|
||||
}
|
||||
},
|
||||
|
||||
// Creates a full fledged settings object into target
|
||||
// with both ajaxSettings and settings fields.
|
||||
// If target is omitted, writes into ajaxSettings.
|
||||
ajaxSetup: function( target, settings ) {
|
||||
return settings ?
|
||||
|
||||
// Building a settings object
|
||||
ajaxExtend( ajaxExtend( target, jQuery.ajaxSettings ), settings ) :
|
||||
|
||||
// Extending ajaxSettings
|
||||
ajaxExtend( jQuery.ajaxSettings, target );
|
||||
},
|
||||
|
||||
ajaxPrefilter: addToPrefiltersOrTransports( prefilters ),
|
||||
ajaxTransport: addToPrefiltersOrTransports( transports ),
|
||||
|
||||
// Main method
|
||||
ajax: function( url, options ) {
|
||||
|
||||
// If url is an object, simulate pre-1.5 signature
|
||||
if ( typeof url === "object" ) {
|
||||
options = url;
|
||||
url = undefined;
|
||||
}
|
||||
|
||||
// Force options to be an object
|
||||
options = options || {};
|
||||
|
||||
var // Cross-domain detection vars
|
||||
parts,
|
||||
// Loop variable
|
||||
i,
|
||||
// URL without anti-cache param
|
||||
cacheURL,
|
||||
// Response headers as string
|
||||
responseHeadersString,
|
||||
// timeout handle
|
||||
timeoutTimer,
|
||||
|
||||
// To know if global events are to be dispatched
|
||||
fireGlobals,
|
||||
|
||||
transport,
|
||||
// Response headers
|
||||
responseHeaders,
|
||||
// Create the final options object
|
||||
s = jQuery.ajaxSetup( {}, options ),
|
||||
// Callbacks context
|
||||
callbackContext = s.context || s,
|
||||
// Context for global events is callbackContext if it is a DOM node or jQuery collection
|
||||
globalEventContext = s.context && ( callbackContext.nodeType || callbackContext.jquery ) ?
|
||||
jQuery( callbackContext ) :
|
||||
jQuery.event,
|
||||
// Deferreds
|
||||
deferred = jQuery.Deferred(),
|
||||
completeDeferred = jQuery.Callbacks("once memory"),
|
||||
// Status-dependent callbacks
|
||||
statusCode = s.statusCode || {},
|
||||
// Headers (they are sent all at once)
|
||||
requestHeaders = {},
|
||||
requestHeadersNames = {},
|
||||
// The jqXHR state
|
||||
state = 0,
|
||||
// Default abort message
|
||||
strAbort = "canceled",
|
||||
// Fake xhr
|
||||
jqXHR = {
|
||||
readyState: 0,
|
||||
|
||||
// Builds headers hashtable if needed
|
||||
getResponseHeader: function( key ) {
|
||||
var match;
|
||||
if ( state === 2 ) {
|
||||
if ( !responseHeaders ) {
|
||||
responseHeaders = {};
|
||||
while ( (match = rheaders.exec( responseHeadersString )) ) {
|
||||
responseHeaders[ match[1].toLowerCase() ] = match[ 2 ];
|
||||
}
|
||||
}
|
||||
match = responseHeaders[ key.toLowerCase() ];
|
||||
}
|
||||
return match == null ? null : match;
|
||||
},
|
||||
|
||||
// Raw string
|
||||
getAllResponseHeaders: function() {
|
||||
return state === 2 ? responseHeadersString : null;
|
||||
},
|
||||
|
||||
// Caches the header
|
||||
setRequestHeader: function( name, value ) {
|
||||
var lname = name.toLowerCase();
|
||||
if ( !state ) {
|
||||
name = requestHeadersNames[ lname ] = requestHeadersNames[ lname ] || name;
|
||||
requestHeaders[ name ] = value;
|
||||
}
|
||||
return this;
|
||||
},
|
||||
|
||||
// Overrides response content-type header
|
||||
overrideMimeType: function( type ) {
|
||||
if ( !state ) {
|
||||
s.mimeType = type;
|
||||
}
|
||||
return this;
|
||||
},
|
||||
|
||||
// Status-dependent callbacks
|
||||
statusCode: function( map ) {
|
||||
var code;
|
||||
if ( map ) {
|
||||
if ( state < 2 ) {
|
||||
for ( code in map ) {
|
||||
// Lazy-add the new callback in a way that preserves old ones
|
||||
statusCode[ code ] = [ statusCode[ code ], map[ code ] ];
|
||||
}
|
||||
} else {
|
||||
// Execute the appropriate callbacks
|
||||
jqXHR.always( map[ jqXHR.status ] );
|
||||
}
|
||||
}
|
||||
return this;
|
||||
},
|
||||
|
||||
// Cancel the request
|
||||
abort: function( statusText ) {
|
||||
var finalText = statusText || strAbort;
|
||||
if ( transport ) {
|
||||
transport.abort( finalText );
|
||||
}
|
||||
done( 0, finalText );
|
||||
return this;
|
||||
}
|
||||
};
|
||||
|
||||
// Attach deferreds
|
||||
deferred.promise( jqXHR ).complete = completeDeferred.add;
|
||||
jqXHR.success = jqXHR.done;
|
||||
jqXHR.error = jqXHR.fail;
|
||||
|
||||
// Remove hash character (#7531: and string promotion)
|
||||
// Add protocol if not provided (#5866: IE7 issue with protocol-less urls)
|
||||
// Handle falsy url in the settings object (#10093: consistency with old signature)
|
||||
// We also use the url parameter if available
|
||||
s.url = ( ( url || s.url || ajaxLocation ) + "" ).replace( rhash, "" ).replace( rprotocol, ajaxLocParts[ 1 ] + "//" );
|
||||
|
||||
// Alias method option to type as per ticket #12004
|
||||
s.type = options.method || options.type || s.method || s.type;
|
||||
|
||||
// Extract dataTypes list
|
||||
s.dataTypes = jQuery.trim( s.dataType || "*" ).toLowerCase().match( core_rnotwhite ) || [""];
|
||||
|
||||
// A cross-domain request is in order when we have a protocol:host:port mismatch
|
||||
if ( s.crossDomain == null ) {
|
||||
parts = rurl.exec( s.url.toLowerCase() );
|
||||
s.crossDomain = !!( parts &&
|
||||
( parts[ 1 ] !== ajaxLocParts[ 1 ] || parts[ 2 ] !== ajaxLocParts[ 2 ] ||
|
||||
( parts[ 3 ] || ( parts[ 1 ] === "http:" ? 80 : 443 ) ) !=
|
||||
( ajaxLocParts[ 3 ] || ( ajaxLocParts[ 1 ] === "http:" ? 80 : 443 ) ) )
|
||||
);
|
||||
}
|
||||
|
||||
// Convert data if not already a string
|
||||
if ( s.data && s.processData && typeof s.data !== "string" ) {
|
||||
s.data = jQuery.param( s.data, s.traditional );
|
||||
}
|
||||
|
||||
// Apply prefilters
|
||||
inspectPrefiltersOrTransports( prefilters, s, options, jqXHR );
|
||||
|
||||
// If request was aborted inside a prefilter, stop there
|
||||
if ( state === 2 ) {
|
||||
return jqXHR;
|
||||
}
|
||||
|
||||
// We can fire global events as of now if asked to
|
||||
fireGlobals = s.global;
|
||||
|
||||
// Watch for a new set of requests
|
||||
if ( fireGlobals && jQuery.active++ === 0 ) {
|
||||
jQuery.event.trigger("ajaxStart");
|
||||
}
|
||||
|
||||
// Uppercase the type
|
||||
s.type = s.type.toUpperCase();
|
||||
|
||||
// Determine if request has content
|
||||
s.hasContent = !rnoContent.test( s.type );
|
||||
|
||||
// Save the URL in case we're toying with the If-Modified-Since
|
||||
// and/or If-None-Match header later on
|
||||
cacheURL = s.url;
|
||||
|
||||
// More options handling for requests with no content
|
||||
if ( !s.hasContent ) {
|
||||
|
||||
// If data is available, append data to url
|
||||
if ( s.data ) {
|
||||
cacheURL = ( s.url += ( ajax_rquery.test( cacheURL ) ? "&" : "?" ) + s.data );
|
||||
// #9682: remove data so that it's not used in an eventual retry
|
||||
delete s.data;
|
||||
}
|
||||
|
||||
// Add anti-cache in url if needed
|
||||
if ( s.cache === false ) {
|
||||
s.url = rts.test( cacheURL ) ?
|
||||
|
||||
// If there is already a '_' parameter, set its value
|
||||
cacheURL.replace( rts, "$1_=" + ajax_nonce++ ) :
|
||||
|
||||
// Otherwise add one to the end
|
||||
cacheURL + ( ajax_rquery.test( cacheURL ) ? "&" : "?" ) + "_=" + ajax_nonce++;
|
||||
}
|
||||
}
|
||||
|
||||
// Set the If-Modified-Since and/or If-None-Match header, if in ifModified mode.
|
||||
if ( s.ifModified ) {
|
||||
if ( jQuery.lastModified[ cacheURL ] ) {
|
||||
jqXHR.setRequestHeader( "If-Modified-Since", jQuery.lastModified[ cacheURL ] );
|
||||
}
|
||||
if ( jQuery.etag[ cacheURL ] ) {
|
||||
jqXHR.setRequestHeader( "If-None-Match", jQuery.etag[ cacheURL ] );
|
||||
}
|
||||
}
|
||||
|
||||
// Set the correct header, if data is being sent
|
||||
if ( s.data && s.hasContent && s.contentType !== false || options.contentType ) {
|
||||
jqXHR.setRequestHeader( "Content-Type", s.contentType );
|
||||
}
|
||||
|
||||
// Set the Accepts header for the server, depending on the dataType
|
||||
jqXHR.setRequestHeader(
|
||||
"Accept",
|
||||
s.dataTypes[ 0 ] && s.accepts[ s.dataTypes[0] ] ?
|
||||
s.accepts[ s.dataTypes[0] ] + ( s.dataTypes[ 0 ] !== "*" ? ", " + allTypes + "; q=0.01" : "" ) :
|
||||
s.accepts[ "*" ]
|
||||
);
|
||||
|
||||
// Check for headers option
|
||||
for ( i in s.headers ) {
|
||||
jqXHR.setRequestHeader( i, s.headers[ i ] );
|
||||
}
|
||||
|
||||
// Allow custom headers/mimetypes and early abort
|
||||
if ( s.beforeSend && ( s.beforeSend.call( callbackContext, jqXHR, s ) === false || state === 2 ) ) {
|
||||
// Abort if not done already and return
|
||||
return jqXHR.abort();
|
||||
}
|
||||
|
||||
// aborting is no longer a cancellation
|
||||
strAbort = "abort";
|
||||
|
||||
// Install callbacks on deferreds
|
||||
for ( i in { success: 1, error: 1, complete: 1 } ) {
|
||||
jqXHR[ i ]( s[ i ] );
|
||||
}
|
||||
|
||||
// Get transport
|
||||
transport = inspectPrefiltersOrTransports( transports, s, options, jqXHR );
|
||||
|
||||
// If no transport, we auto-abort
|
||||
if ( !transport ) {
|
||||
done( -1, "No Transport" );
|
||||
} else {
|
||||
jqXHR.readyState = 1;
|
||||
|
||||
// Send global event
|
||||
if ( fireGlobals ) {
|
||||
globalEventContext.trigger( "ajaxSend", [ jqXHR, s ] );
|
||||
}
|
||||
// Timeout
|
||||
if ( s.async && s.timeout > 0 ) {
|
||||
timeoutTimer = setTimeout(function() {
|
||||
jqXHR.abort("timeout");
|
||||
}, s.timeout );
|
||||
}
|
||||
|
||||
try {
|
||||
state = 1;
|
||||
transport.send( requestHeaders, done );
|
||||
} catch ( e ) {
|
||||
// Propagate exception as error if not done
|
||||
if ( state < 2 ) {
|
||||
done( -1, e );
|
||||
// Simply rethrow otherwise
|
||||
} else {
|
||||
throw e;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// Callback for when everything is done
|
||||
function done( status, nativeStatusText, responses, headers ) {
|
||||
var isSuccess, success, error, response, modified,
|
||||
statusText = nativeStatusText;
|
||||
|
||||
// Called once
|
||||
if ( state === 2 ) {
|
||||
return;
|
||||
}
|
||||
|
||||
// State is "done" now
|
||||
state = 2;
|
||||
|
||||
// Clear timeout if it exists
|
||||
if ( timeoutTimer ) {
|
||||
clearTimeout( timeoutTimer );
|
||||
}
|
||||
|
||||
// Dereference transport for early garbage collection
|
||||
// (no matter how long the jqXHR object will be used)
|
||||
transport = undefined;
|
||||
|
||||
// Cache response headers
|
||||
responseHeadersString = headers || "";
|
||||
|
||||
// Set readyState
|
||||
jqXHR.readyState = status > 0 ? 4 : 0;
|
||||
|
||||
// Get response data
|
||||
if ( responses ) {
|
||||
response = ajaxHandleResponses( s, jqXHR, responses );
|
||||
}
|
||||
|
||||
// If successful, handle type chaining
|
||||
if ( status >= 200 && status < 300 || status === 304 ) {
|
||||
|
||||
// Set the If-Modified-Since and/or If-None-Match header, if in ifModified mode.
|
||||
if ( s.ifModified ) {
|
||||
modified = jqXHR.getResponseHeader("Last-Modified");
|
||||
if ( modified ) {
|
||||
jQuery.lastModified[ cacheURL ] = modified;
|
||||
}
|
||||
modified = jqXHR.getResponseHeader("etag");
|
||||
if ( modified ) {
|
||||
jQuery.etag[ cacheURL ] = modified;
|
||||
}
|
||||
}
|
||||
|
||||
// if no content
|
||||
if ( status === 204 ) {
|
||||
isSuccess = true;
|
||||
statusText = "nocontent";
|
||||
|
||||
// if not modified
|
||||
} else if ( status === 304 ) {
|
||||
isSuccess = true;
|
||||
statusText = "notmodified";
|
||||
|
||||
// If we have data, let's convert it
|
||||
} else {
|
||||
isSuccess = ajaxConvert( s, response );
|
||||
statusText = isSuccess.state;
|
||||
success = isSuccess.data;
|
||||
error = isSuccess.error;
|
||||
isSuccess = !error;
|
||||
}
|
||||
} else {
|
||||
// We extract error from statusText
|
||||
// then normalize statusText and status for non-aborts
|
||||
error = statusText;
|
||||
if ( status || !statusText ) {
|
||||
statusText = "error";
|
||||
if ( status < 0 ) {
|
||||
status = 0;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// Set data for the fake xhr object
|
||||
jqXHR.status = status;
|
||||
jqXHR.statusText = ( nativeStatusText || statusText ) + "";
|
||||
|
||||
// Success/Error
|
||||
if ( isSuccess ) {
|
||||
deferred.resolveWith( callbackContext, [ success, statusText, jqXHR ] );
|
||||
} else {
|
||||
deferred.rejectWith( callbackContext, [ jqXHR, statusText, error ] );
|
||||
}
|
||||
|
||||
// Status-dependent callbacks
|
||||
jqXHR.statusCode( statusCode );
|
||||
statusCode = undefined;
|
||||
|
||||
if ( fireGlobals ) {
|
||||
globalEventContext.trigger( isSuccess ? "ajaxSuccess" : "ajaxError",
|
||||
[ jqXHR, s, isSuccess ? success : error ] );
|
||||
}
|
||||
|
||||
// Complete
|
||||
completeDeferred.fireWith( callbackContext, [ jqXHR, statusText ] );
|
||||
|
||||
if ( fireGlobals ) {
|
||||
globalEventContext.trigger( "ajaxComplete", [ jqXHR, s ] );
|
||||
// Handle the global AJAX counter
|
||||
if ( !( --jQuery.active ) ) {
|
||||
jQuery.event.trigger("ajaxStop");
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return jqXHR;
|
||||
},
|
||||
|
||||
getScript: function( url, callback ) {
|
||||
return jQuery.get( url, undefined, callback, "script" );
|
||||
},
|
||||
|
||||
getJSON: function( url, data, callback ) {
|
||||
return jQuery.get( url, data, callback, "json" );
|
||||
}
|
||||
});
|
||||
|
||||
/* Handles responses to an ajax request:
|
||||
* - sets all responseXXX fields accordingly
|
||||
* - finds the right dataType (mediates between content-type and expected dataType)
|
||||
* - returns the corresponding response
|
||||
*/
|
||||
function ajaxHandleResponses( s, jqXHR, responses ) {
|
||||
var firstDataType, ct, finalDataType, type,
|
||||
contents = s.contents,
|
||||
dataTypes = s.dataTypes,
|
||||
responseFields = s.responseFields;
|
||||
|
||||
// Fill responseXXX fields
|
||||
for ( type in responseFields ) {
|
||||
if ( type in responses ) {
|
||||
jqXHR[ responseFields[type] ] = responses[ type ];
|
||||
}
|
||||
}
|
||||
|
||||
// Remove auto dataType and get content-type in the process
|
||||
while( dataTypes[ 0 ] === "*" ) {
|
||||
dataTypes.shift();
|
||||
if ( ct === undefined ) {
|
||||
ct = s.mimeType || jqXHR.getResponseHeader("Content-Type");
|
||||
}
|
||||
}
|
||||
|
||||
// Check if we're dealing with a known content-type
|
||||
if ( ct ) {
|
||||
for ( type in contents ) {
|
||||
if ( contents[ type ] && contents[ type ].test( ct ) ) {
|
||||
dataTypes.unshift( type );
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// Check to see if we have a response for the expected dataType
|
||||
if ( dataTypes[ 0 ] in responses ) {
|
||||
finalDataType = dataTypes[ 0 ];
|
||||
} else {
|
||||
// Try convertible dataTypes
|
||||
for ( type in responses ) {
|
||||
if ( !dataTypes[ 0 ] || s.converters[ type + " " + dataTypes[0] ] ) {
|
||||
finalDataType = type;
|
||||
break;
|
||||
}
|
||||
if ( !firstDataType ) {
|
||||
firstDataType = type;
|
||||
}
|
||||
}
|
||||
// Or just use first one
|
||||
finalDataType = finalDataType || firstDataType;
|
||||
}
|
||||
|
||||
// If we found a dataType
|
||||
// We add the dataType to the list if needed
|
||||
// and return the corresponding response
|
||||
if ( finalDataType ) {
|
||||
if ( finalDataType !== dataTypes[ 0 ] ) {
|
||||
dataTypes.unshift( finalDataType );
|
||||
}
|
||||
return responses[ finalDataType ];
|
||||
}
|
||||
}
|
||||
|
||||
// Chain conversions given the request and the original response
|
||||
function ajaxConvert( s, response ) {
|
||||
var conv2, current, conv, tmp,
|
||||
converters = {},
|
||||
i = 0,
|
||||
// Work with a copy of dataTypes in case we need to modify it for conversion
|
||||
dataTypes = s.dataTypes.slice(),
|
||||
prev = dataTypes[ 0 ];
|
||||
|
||||
// Apply the dataFilter if provided
|
||||
if ( s.dataFilter ) {
|
||||
response = s.dataFilter( response, s.dataType );
|
||||
}
|
||||
|
||||
// Create converters map with lowercased keys
|
||||
if ( dataTypes[ 1 ] ) {
|
||||
for ( conv in s.converters ) {
|
||||
converters[ conv.toLowerCase() ] = s.converters[ conv ];
|
||||
}
|
||||
}
|
||||
|
||||
// Convert to each sequential dataType, tolerating list modification
|
||||
for ( ; (current = dataTypes[++i]); ) {
|
||||
|
||||
// There's only work to do if current dataType is non-auto
|
||||
if ( current !== "*" ) {
|
||||
|
||||
// Convert response if prev dataType is non-auto and differs from current
|
||||
if ( prev !== "*" && prev !== current ) {
|
||||
|
||||
// Seek a direct converter
|
||||
conv = converters[ prev + " " + current ] || converters[ "* " + current ];
|
||||
|
||||
// If none found, seek a pair
|
||||
if ( !conv ) {
|
||||
for ( conv2 in converters ) {
|
||||
|
||||
// If conv2 outputs current
|
||||
tmp = conv2.split(" ");
|
||||
if ( tmp[ 1 ] === current ) {
|
||||
|
||||
// If prev can be converted to accepted input
|
||||
conv = converters[ prev + " " + tmp[ 0 ] ] ||
|
||||
converters[ "* " + tmp[ 0 ] ];
|
||||
if ( conv ) {
|
||||
// Condense equivalence converters
|
||||
if ( conv === true ) {
|
||||
conv = converters[ conv2 ];
|
||||
|
||||
// Otherwise, insert the intermediate dataType
|
||||
} else if ( converters[ conv2 ] !== true ) {
|
||||
current = tmp[ 0 ];
|
||||
dataTypes.splice( i--, 0, current );
|
||||
}
|
||||
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// Apply converter (if not an equivalence)
|
||||
if ( conv !== true ) {
|
||||
|
||||
// Unless errors are allowed to bubble, catch and return them
|
||||
if ( conv && s["throws"] ) {
|
||||
response = conv( response );
|
||||
} else {
|
||||
try {
|
||||
response = conv( response );
|
||||
} catch ( e ) {
|
||||
return { state: "parsererror", error: conv ? e : "No conversion from " + prev + " to " + current };
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// Update prev for next iteration
|
||||
prev = current;
|
||||
}
|
||||
}
|
||||
|
||||
return { state: "success", data: response };
|
||||
}
|
||||
80
www/lib/jQuery/src/ajax/jsonp.js
Normal file
80
www/lib/jQuery/src/ajax/jsonp.js
Normal file
@@ -0,0 +1,80 @@
|
||||
var oldCallbacks = [],
|
||||
rjsonp = /(=)\?(?=&|$)|\?\?/;
|
||||
|
||||
// Default jsonp settings
|
||||
jQuery.ajaxSetup({
|
||||
jsonp: "callback",
|
||||
jsonpCallback: function() {
|
||||
var callback = oldCallbacks.pop() || ( jQuery.expando + "_" + ( ajax_nonce++ ) );
|
||||
this[ callback ] = true;
|
||||
return callback;
|
||||
}
|
||||
});
|
||||
|
||||
// Detect, normalize options and install callbacks for jsonp requests
|
||||
jQuery.ajaxPrefilter( "json jsonp", function( s, originalSettings, jqXHR ) {
|
||||
|
||||
var callbackName, overwritten, responseContainer,
|
||||
jsonProp = s.jsonp !== false && ( rjsonp.test( s.url ) ?
|
||||
"url" :
|
||||
typeof s.data === "string" && !( s.contentType || "" ).indexOf("application/x-www-form-urlencoded") && rjsonp.test( s.data ) && "data"
|
||||
);
|
||||
|
||||
// Handle iff the expected data type is "jsonp" or we have a parameter to set
|
||||
if ( jsonProp || s.dataTypes[ 0 ] === "jsonp" ) {
|
||||
|
||||
// Get callback name, remembering preexisting value associated with it
|
||||
callbackName = s.jsonpCallback = jQuery.isFunction( s.jsonpCallback ) ?
|
||||
s.jsonpCallback() :
|
||||
s.jsonpCallback;
|
||||
|
||||
// Insert callback into url or form data
|
||||
if ( jsonProp ) {
|
||||
s[ jsonProp ] = s[ jsonProp ].replace( rjsonp, "$1" + callbackName );
|
||||
} else if ( s.jsonp !== false ) {
|
||||
s.url += ( ajax_rquery.test( s.url ) ? "&" : "?" ) + s.jsonp + "=" + callbackName;
|
||||
}
|
||||
|
||||
// Use data converter to retrieve json after script execution
|
||||
s.converters["script json"] = function() {
|
||||
if ( !responseContainer ) {
|
||||
jQuery.error( callbackName + " was not called" );
|
||||
}
|
||||
return responseContainer[ 0 ];
|
||||
};
|
||||
|
||||
// force json dataType
|
||||
s.dataTypes[ 0 ] = "json";
|
||||
|
||||
// Install callback
|
||||
overwritten = window[ callbackName ];
|
||||
window[ callbackName ] = function() {
|
||||
responseContainer = arguments;
|
||||
};
|
||||
|
||||
// Clean-up function (fires after converters)
|
||||
jqXHR.always(function() {
|
||||
// Restore preexisting value
|
||||
window[ callbackName ] = overwritten;
|
||||
|
||||
// Save back as free
|
||||
if ( s[ callbackName ] ) {
|
||||
// make sure that re-using the options doesn't screw things around
|
||||
s.jsonpCallback = originalSettings.jsonpCallback;
|
||||
|
||||
// save the callback name for future use
|
||||
oldCallbacks.push( callbackName );
|
||||
}
|
||||
|
||||
// Call if it was a function and we have a response
|
||||
if ( responseContainer && jQuery.isFunction( overwritten ) ) {
|
||||
overwritten( responseContainer[ 0 ] );
|
||||
}
|
||||
|
||||
responseContainer = overwritten = undefined;
|
||||
});
|
||||
|
||||
// Delegate to script
|
||||
return "script";
|
||||
}
|
||||
});
|
||||
86
www/lib/jQuery/src/ajax/script.js
Normal file
86
www/lib/jQuery/src/ajax/script.js
Normal file
@@ -0,0 +1,86 @@
|
||||
// Install script dataType
|
||||
jQuery.ajaxSetup({
|
||||
accepts: {
|
||||
script: "text/javascript, application/javascript, application/ecmascript, application/x-ecmascript"
|
||||
},
|
||||
contents: {
|
||||
script: /(?:java|ecma)script/
|
||||
},
|
||||
converters: {
|
||||
"text script": function( text ) {
|
||||
jQuery.globalEval( text );
|
||||
return text;
|
||||
}
|
||||
}
|
||||
});
|
||||
|
||||
// Handle cache's special case and global
|
||||
jQuery.ajaxPrefilter( "script", function( s ) {
|
||||
if ( s.cache === undefined ) {
|
||||
s.cache = false;
|
||||
}
|
||||
if ( s.crossDomain ) {
|
||||
s.type = "GET";
|
||||
s.global = false;
|
||||
}
|
||||
});
|
||||
|
||||
// Bind script tag hack transport
|
||||
jQuery.ajaxTransport( "script", function(s) {
|
||||
|
||||
// This transport only deals with cross domain requests
|
||||
if ( s.crossDomain ) {
|
||||
|
||||
var script,
|
||||
head = document.head || jQuery("head")[0] || document.documentElement;
|
||||
|
||||
return {
|
||||
|
||||
send: function( _, callback ) {
|
||||
|
||||
script = document.createElement("script");
|
||||
|
||||
script.async = true;
|
||||
|
||||
if ( s.scriptCharset ) {
|
||||
script.charset = s.scriptCharset;
|
||||
}
|
||||
|
||||
script.src = s.url;
|
||||
|
||||
// Attach handlers for all browsers
|
||||
script.onload = script.onreadystatechange = function( _, isAbort ) {
|
||||
|
||||
if ( isAbort || !script.readyState || /loaded|complete/.test( script.readyState ) ) {
|
||||
|
||||
// Handle memory leak in IE
|
||||
script.onload = script.onreadystatechange = null;
|
||||
|
||||
// Remove the script
|
||||
if ( script.parentNode ) {
|
||||
script.parentNode.removeChild( script );
|
||||
}
|
||||
|
||||
// Dereference the script
|
||||
script = null;
|
||||
|
||||
// Callback if not abort
|
||||
if ( !isAbort ) {
|
||||
callback( 200, "success" );
|
||||
}
|
||||
}
|
||||
};
|
||||
|
||||
// Circumvent IE6 bugs with base elements (#2709 and #4378) by prepending
|
||||
// Use native DOM manipulation to avoid our domManip AJAX trickery
|
||||
head.insertBefore( script, head.firstChild );
|
||||
},
|
||||
|
||||
abort: function() {
|
||||
if ( script ) {
|
||||
script.onload( undefined, true );
|
||||
}
|
||||
}
|
||||
};
|
||||
}
|
||||
});
|
||||
207
www/lib/jQuery/src/ajax/xhr.js
Normal file
207
www/lib/jQuery/src/ajax/xhr.js
Normal file
@@ -0,0 +1,207 @@
|
||||
var xhrCallbacks, xhrSupported,
|
||||
xhrId = 0,
|
||||
// #5280: Internet Explorer will keep connections alive if we don't abort on unload
|
||||
xhrOnUnloadAbort = window.ActiveXObject && function() {
|
||||
// Abort all pending requests
|
||||
var key;
|
||||
for ( key in xhrCallbacks ) {
|
||||
xhrCallbacks[ key ]( undefined, true );
|
||||
}
|
||||
};
|
||||
|
||||
// Functions to create xhrs
|
||||
function createStandardXHR() {
|
||||
try {
|
||||
return new window.XMLHttpRequest();
|
||||
} catch( e ) {}
|
||||
}
|
||||
|
||||
function createActiveXHR() {
|
||||
try {
|
||||
return new window.ActiveXObject("Microsoft.XMLHTTP");
|
||||
} catch( e ) {}
|
||||
}
|
||||
|
||||
// Create the request object
|
||||
// (This is still attached to ajaxSettings for backward compatibility)
|
||||
jQuery.ajaxSettings.xhr = window.ActiveXObject ?
|
||||
/* Microsoft failed to properly
|
||||
* implement the XMLHttpRequest in IE7 (can't request local files),
|
||||
* so we use the ActiveXObject when it is available
|
||||
* Additionally XMLHttpRequest can be disabled in IE7/IE8 so
|
||||
* we need a fallback.
|
||||
*/
|
||||
function() {
|
||||
return !this.isLocal && createStandardXHR() || createActiveXHR();
|
||||
} :
|
||||
// For all other browsers, use the standard XMLHttpRequest object
|
||||
createStandardXHR;
|
||||
|
||||
// Determine support properties
|
||||
xhrSupported = jQuery.ajaxSettings.xhr();
|
||||
jQuery.support.cors = !!xhrSupported && ( "withCredentials" in xhrSupported );
|
||||
xhrSupported = jQuery.support.ajax = !!xhrSupported;
|
||||
|
||||
// Create transport if the browser can provide an xhr
|
||||
if ( xhrSupported ) {
|
||||
|
||||
jQuery.ajaxTransport(function( s ) {
|
||||
// Cross domain only allowed if supported through XMLHttpRequest
|
||||
if ( !s.crossDomain || jQuery.support.cors ) {
|
||||
|
||||
var callback;
|
||||
|
||||
return {
|
||||
send: function( headers, complete ) {
|
||||
|
||||
// Get a new xhr
|
||||
var handle, i,
|
||||
xhr = s.xhr();
|
||||
|
||||
// Open the socket
|
||||
// Passing null username, generates a login popup on Opera (#2865)
|
||||
if ( s.username ) {
|
||||
xhr.open( s.type, s.url, s.async, s.username, s.password );
|
||||
} else {
|
||||
xhr.open( s.type, s.url, s.async );
|
||||
}
|
||||
|
||||
// Apply custom fields if provided
|
||||
if ( s.xhrFields ) {
|
||||
for ( i in s.xhrFields ) {
|
||||
xhr[ i ] = s.xhrFields[ i ];
|
||||
}
|
||||
}
|
||||
|
||||
// Override mime type if needed
|
||||
if ( s.mimeType && xhr.overrideMimeType ) {
|
||||
xhr.overrideMimeType( s.mimeType );
|
||||
}
|
||||
|
||||
// X-Requested-With header
|
||||
// For cross-domain requests, seeing as conditions for a preflight are
|
||||
// akin to a jigsaw puzzle, we simply never set it to be sure.
|
||||
// (it can always be set on a per-request basis or even using ajaxSetup)
|
||||
// For same-domain requests, won't change header if already provided.
|
||||
if ( !s.crossDomain && !headers["X-Requested-With"] ) {
|
||||
headers["X-Requested-With"] = "XMLHttpRequest";
|
||||
}
|
||||
|
||||
// Need an extra try/catch for cross domain requests in Firefox 3
|
||||
try {
|
||||
for ( i in headers ) {
|
||||
xhr.setRequestHeader( i, headers[ i ] );
|
||||
}
|
||||
} catch( err ) {}
|
||||
|
||||
// Do send the request
|
||||
// This may raise an exception which is actually
|
||||
// handled in jQuery.ajax (so no try/catch here)
|
||||
xhr.send( ( s.hasContent && s.data ) || null );
|
||||
|
||||
// Listener
|
||||
callback = function( _, isAbort ) {
|
||||
var status, responseHeaders, statusText, responses;
|
||||
|
||||
// Firefox throws exceptions when accessing properties
|
||||
// of an xhr when a network error occurred
|
||||
// http://helpful.knobs-dials.com/index.php/Component_returned_failure_code:_0x80040111_(NS_ERROR_NOT_AVAILABLE)
|
||||
try {
|
||||
|
||||
// Was never called and is aborted or complete
|
||||
if ( callback && ( isAbort || xhr.readyState === 4 ) ) {
|
||||
|
||||
// Only called once
|
||||
callback = undefined;
|
||||
|
||||
// Do not keep as active anymore
|
||||
if ( handle ) {
|
||||
xhr.onreadystatechange = jQuery.noop;
|
||||
if ( xhrOnUnloadAbort ) {
|
||||
delete xhrCallbacks[ handle ];
|
||||
}
|
||||
}
|
||||
|
||||
// If it's an abort
|
||||
if ( isAbort ) {
|
||||
// Abort it manually if needed
|
||||
if ( xhr.readyState !== 4 ) {
|
||||
xhr.abort();
|
||||
}
|
||||
} else {
|
||||
responses = {};
|
||||
status = xhr.status;
|
||||
responseHeaders = xhr.getAllResponseHeaders();
|
||||
|
||||
// When requesting binary data, IE6-9 will throw an exception
|
||||
// on any attempt to access responseText (#11426)
|
||||
if ( typeof xhr.responseText === "string" ) {
|
||||
responses.text = xhr.responseText;
|
||||
}
|
||||
|
||||
// Firefox throws an exception when accessing
|
||||
// statusText for faulty cross-domain requests
|
||||
try {
|
||||
statusText = xhr.statusText;
|
||||
} catch( e ) {
|
||||
// We normalize with Webkit giving an empty statusText
|
||||
statusText = "";
|
||||
}
|
||||
|
||||
// Filter status for non standard behaviors
|
||||
|
||||
// If the request is local and we have data: assume a success
|
||||
// (success with no data won't get notified, that's the best we
|
||||
// can do given current implementations)
|
||||
if ( !status && s.isLocal && !s.crossDomain ) {
|
||||
status = responses.text ? 200 : 404;
|
||||
// IE - #1450: sometimes returns 1223 when it should be 204
|
||||
} else if ( status === 1223 ) {
|
||||
status = 204;
|
||||
}
|
||||
}
|
||||
}
|
||||
} catch( firefoxAccessException ) {
|
||||
if ( !isAbort ) {
|
||||
complete( -1, firefoxAccessException );
|
||||
}
|
||||
}
|
||||
|
||||
// Call complete if needed
|
||||
if ( responses ) {
|
||||
complete( status, statusText, responses, responseHeaders );
|
||||
}
|
||||
};
|
||||
|
||||
if ( !s.async ) {
|
||||
// if we're in sync mode we fire the callback
|
||||
callback();
|
||||
} else if ( xhr.readyState === 4 ) {
|
||||
// (IE6 & IE7) if it's in cache and has been
|
||||
// retrieved directly we need to fire the callback
|
||||
setTimeout( callback );
|
||||
} else {
|
||||
handle = ++xhrId;
|
||||
if ( xhrOnUnloadAbort ) {
|
||||
// Create the active xhrs callbacks list if needed
|
||||
// and attach the unload handler
|
||||
if ( !xhrCallbacks ) {
|
||||
xhrCallbacks = {};
|
||||
jQuery( window ).unload( xhrOnUnloadAbort );
|
||||
}
|
||||
// Add to list of active xhrs callbacks
|
||||
xhrCallbacks[ handle ] = callback;
|
||||
}
|
||||
xhr.onreadystatechange = callback;
|
||||
}
|
||||
},
|
||||
|
||||
abort: function() {
|
||||
if ( callback ) {
|
||||
callback( undefined, true );
|
||||
}
|
||||
}
|
||||
};
|
||||
}
|
||||
});
|
||||
}
|
||||
661
www/lib/jQuery/src/attributes.js
Normal file
661
www/lib/jQuery/src/attributes.js
Normal file
@@ -0,0 +1,661 @@
|
||||
var nodeHook, boolHook,
|
||||
rclass = /[\t\r\n]/g,
|
||||
rreturn = /\r/g,
|
||||
rfocusable = /^(?:input|select|textarea|button|object)$/i,
|
||||
rclickable = /^(?:a|area)$/i,
|
||||
rboolean = /^(?:checked|selected|autofocus|autoplay|async|controls|defer|disabled|hidden|loop|multiple|open|readonly|required|scoped)$/i,
|
||||
ruseDefault = /^(?:checked|selected)$/i,
|
||||
getSetAttribute = jQuery.support.getSetAttribute,
|
||||
getSetInput = jQuery.support.input;
|
||||
|
||||
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 ) {
|
||||
name = jQuery.propFix[ name ] || name;
|
||||
return this.each(function() {
|
||||
// try/catch handles cases where IE balks (such as removing a property on window)
|
||||
try {
|
||||
this[ name ] = undefined;
|
||||
delete this[ name ];
|
||||
} catch( e ) {}
|
||||
});
|
||||
},
|
||||
|
||||
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,
|
||||
isBool = typeof stateVal === "boolean";
|
||||
|
||||
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 ),
|
||||
state = stateVal,
|
||||
classNames = value.match( core_rnotwhite ) || [];
|
||||
|
||||
while ( (className = classNames[ i++ ]) ) {
|
||||
// check each className given, space separated list
|
||||
state = isBool ? state : !self.hasClass( className );
|
||||
self[ state ? "addClass" : "removeClass" ]( className );
|
||||
}
|
||||
|
||||
// Toggle whole class name
|
||||
} else if ( type === core_strundefined || type === "boolean" ) {
|
||||
if ( this.className ) {
|
||||
// store className if set
|
||||
jQuery._data( 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 ? "" : jQuery._data( 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 ret, hooks, 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,
|
||||
self = jQuery(this);
|
||||
|
||||
if ( this.nodeType !== 1 ) {
|
||||
return;
|
||||
}
|
||||
|
||||
if ( isFunction ) {
|
||||
val = value.call( this, i, self.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 ];
|
||||
|
||||
// oldIE 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 values = jQuery.makeArray( value );
|
||||
|
||||
jQuery(elem).find("option").each(function() {
|
||||
this.selected = jQuery.inArray( jQuery(this).val(), values ) >= 0;
|
||||
});
|
||||
|
||||
if ( !values.length ) {
|
||||
elem.selectedIndex = -1;
|
||||
}
|
||||
return values;
|
||||
}
|
||||
}
|
||||
},
|
||||
|
||||
attr: function( elem, name, value ) {
|
||||
var hooks, notxml, 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 );
|
||||
}
|
||||
|
||||
notxml = nType !== 1 || !jQuery.isXMLDoc( elem );
|
||||
|
||||
// All attributes are lowercase
|
||||
// Grab necessary hook if one is defined
|
||||
if ( notxml ) {
|
||||
name = name.toLowerCase();
|
||||
hooks = jQuery.attrHooks[ name ] || ( rboolean.test( name ) ? boolHook : nodeHook );
|
||||
}
|
||||
|
||||
if ( value !== undefined ) {
|
||||
|
||||
if ( value === null ) {
|
||||
jQuery.removeAttr( elem, name );
|
||||
|
||||
} else if ( hooks && notxml && "set" in hooks && (ret = hooks.set( elem, value, name )) !== undefined ) {
|
||||
return ret;
|
||||
|
||||
} else {
|
||||
elem.setAttribute( name, value + "" );
|
||||
return value;
|
||||
}
|
||||
|
||||
} else if ( hooks && notxml && "get" in hooks && (ret = hooks.get( elem, name )) !== null ) {
|
||||
return ret;
|
||||
|
||||
} else {
|
||||
|
||||
// In IE9+, Flash objects don't have .getAttribute (#12945)
|
||||
// Support: IE9+
|
||||
if ( typeof elem.getAttribute !== core_strundefined ) {
|
||||
ret = elem.getAttribute( 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 ( rboolean.test( name ) ) {
|
||||
// Set corresponding property to false for boolean attributes
|
||||
// Also clear defaultChecked/defaultSelected (if appropriate) for IE<8
|
||||
if ( !getSetAttribute && ruseDefault.test( name ) ) {
|
||||
elem[ jQuery.camelCase( "default-" + name ) ] =
|
||||
elem[ propName ] = false;
|
||||
} else {
|
||||
elem[ propName ] = false;
|
||||
}
|
||||
|
||||
// See #9699 for explanation of this approach (setting first, then removal)
|
||||
} else {
|
||||
jQuery.attr( elem, name, "" );
|
||||
}
|
||||
|
||||
elem.removeAttribute( getSetAttribute ? name : propName );
|
||||
}
|
||||
}
|
||||
},
|
||||
|
||||
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: {
|
||||
tabindex: "tabIndex",
|
||||
readonly: "readOnly",
|
||||
"for": "htmlFor",
|
||||
"class": "className",
|
||||
maxlength: "maxLength",
|
||||
cellspacing: "cellSpacing",
|
||||
cellpadding: "cellPadding",
|
||||
rowspan: "rowSpan",
|
||||
colspan: "colSpan",
|
||||
usemap: "useMap",
|
||||
frameborder: "frameBorder",
|
||||
contenteditable: "contentEditable"
|
||||
},
|
||||
|
||||
prop: function( 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 ) {
|
||||
if ( hooks && "set" in hooks && (ret = hooks.set( elem, value, name )) !== undefined ) {
|
||||
return ret;
|
||||
|
||||
} else {
|
||||
return ( elem[ name ] = value );
|
||||
}
|
||||
|
||||
} else {
|
||||
if ( hooks && "get" in hooks && (ret = hooks.get( elem, name )) !== null ) {
|
||||
return ret;
|
||||
|
||||
} else {
|
||||
return elem[ name ];
|
||||
}
|
||||
}
|
||||
},
|
||||
|
||||
propHooks: {
|
||||
tabIndex: {
|
||||
get: function( elem ) {
|
||||
// elem.tabIndex doesn't always return the correct value when it hasn't been explicitly set
|
||||
// http://fluidproject.org/blog/2008/01/09/getting-setting-and-removing-tabindex-values-with-javascript/
|
||||
var attributeNode = elem.getAttributeNode("tabindex");
|
||||
|
||||
return attributeNode && attributeNode.specified ?
|
||||
parseInt( attributeNode.value, 10 ) :
|
||||
rfocusable.test( elem.nodeName ) || rclickable.test( elem.nodeName ) && elem.href ?
|
||||
0 :
|
||||
undefined;
|
||||
}
|
||||
}
|
||||
}
|
||||
});
|
||||
|
||||
// Hook for boolean attributes
|
||||
boolHook = {
|
||||
get: function( elem, name ) {
|
||||
var
|
||||
// Use .prop to determine if this attribute is understood as boolean
|
||||
prop = jQuery.prop( elem, name ),
|
||||
|
||||
// Fetch it accordingly
|
||||
attr = typeof prop === "boolean" && elem.getAttribute( name ),
|
||||
detail = typeof prop === "boolean" ?
|
||||
|
||||
getSetInput && getSetAttribute ?
|
||||
attr != null :
|
||||
// oldIE fabricates an empty string for missing boolean attributes
|
||||
// and conflates checked/selected into attroperties
|
||||
ruseDefault.test( name ) ?
|
||||
elem[ jQuery.camelCase( "default-" + name ) ] :
|
||||
!!attr :
|
||||
|
||||
// fetch an attribute node for properties not recognized as boolean
|
||||
elem.getAttributeNode( name );
|
||||
|
||||
return detail && detail.value !== false ?
|
||||
name.toLowerCase() :
|
||||
undefined;
|
||||
},
|
||||
set: function( elem, value, name ) {
|
||||
if ( value === false ) {
|
||||
// Remove boolean attributes when set to false
|
||||
jQuery.removeAttr( elem, name );
|
||||
} else if ( getSetInput && getSetAttribute || !ruseDefault.test( name ) ) {
|
||||
// IE<8 needs the *property* name
|
||||
elem.setAttribute( !getSetAttribute && jQuery.propFix[ name ] || name, name );
|
||||
|
||||
// Use defaultChecked and defaultSelected for oldIE
|
||||
} else {
|
||||
elem[ jQuery.camelCase( "default-" + name ) ] = elem[ name ] = true;
|
||||
}
|
||||
|
||||
return name;
|
||||
}
|
||||
};
|
||||
|
||||
// fix oldIE value attroperty
|
||||
if ( !getSetInput || !getSetAttribute ) {
|
||||
jQuery.attrHooks.value = {
|
||||
get: function( elem, name ) {
|
||||
var ret = elem.getAttributeNode( name );
|
||||
return jQuery.nodeName( elem, "input" ) ?
|
||||
|
||||
// Ignore the value *property* by using defaultValue
|
||||
elem.defaultValue :
|
||||
|
||||
ret && ret.specified ? ret.value : undefined;
|
||||
},
|
||||
set: function( elem, value, name ) {
|
||||
if ( jQuery.nodeName( elem, "input" ) ) {
|
||||
// Does not return so that setAttribute is also used
|
||||
elem.defaultValue = value;
|
||||
} else {
|
||||
// Use nodeHook if defined (#1954); otherwise setAttribute is fine
|
||||
return nodeHook && nodeHook.set( elem, value, name );
|
||||
}
|
||||
}
|
||||
};
|
||||
}
|
||||
|
||||
// IE6/7 do not support getting/setting some attributes with get/setAttribute
|
||||
if ( !getSetAttribute ) {
|
||||
|
||||
// Use this for any attribute in IE6/7
|
||||
// This fixes almost every IE6/7 issue
|
||||
nodeHook = jQuery.valHooks.button = {
|
||||
get: function( elem, name ) {
|
||||
var ret = elem.getAttributeNode( name );
|
||||
return ret && ( name === "id" || name === "name" || name === "coords" ? ret.value !== "" : ret.specified ) ?
|
||||
ret.value :
|
||||
undefined;
|
||||
},
|
||||
set: function( elem, value, name ) {
|
||||
// Set the existing or create a new attribute node
|
||||
var ret = elem.getAttributeNode( name );
|
||||
if ( !ret ) {
|
||||
elem.setAttributeNode(
|
||||
(ret = elem.ownerDocument.createAttribute( name ))
|
||||
);
|
||||
}
|
||||
|
||||
ret.value = value += "";
|
||||
|
||||
// Break association with cloned elements by also using setAttribute (#9646)
|
||||
return name === "value" || value === elem.getAttribute( name ) ?
|
||||
value :
|
||||
undefined;
|
||||
}
|
||||
};
|
||||
|
||||
// Set contenteditable to false on removals(#10429)
|
||||
// Setting to empty string throws an error as an invalid value
|
||||
jQuery.attrHooks.contenteditable = {
|
||||
get: nodeHook.get,
|
||||
set: function( elem, value, name ) {
|
||||
nodeHook.set( elem, value === "" ? false : value, name );
|
||||
}
|
||||
};
|
||||
|
||||
// Set width and height to auto instead of 0 on empty string( Bug #8150 )
|
||||
// This is for removals
|
||||
jQuery.each([ "width", "height" ], function( i, name ) {
|
||||
jQuery.attrHooks[ name ] = jQuery.extend( jQuery.attrHooks[ name ], {
|
||||
set: function( elem, value ) {
|
||||
if ( value === "" ) {
|
||||
elem.setAttribute( name, "auto" );
|
||||
return value;
|
||||
}
|
||||
}
|
||||
});
|
||||
});
|
||||
}
|
||||
|
||||
|
||||
// Some attributes require a special call on IE
|
||||
// http://msdn.microsoft.com/en-us/library/ms536429%28VS.85%29.aspx
|
||||
if ( !jQuery.support.hrefNormalized ) {
|
||||
jQuery.each([ "href", "src", "width", "height" ], function( i, name ) {
|
||||
jQuery.attrHooks[ name ] = jQuery.extend( jQuery.attrHooks[ name ], {
|
||||
get: function( elem ) {
|
||||
var ret = elem.getAttribute( name, 2 );
|
||||
return ret == null ? undefined : ret;
|
||||
}
|
||||
});
|
||||
});
|
||||
|
||||
// href/src property should get the full normalized URL (#10299/#12915)
|
||||
jQuery.each([ "href", "src" ], function( i, name ) {
|
||||
jQuery.propHooks[ name ] = {
|
||||
get: function( elem ) {
|
||||
return elem.getAttribute( name, 4 );
|
||||
}
|
||||
};
|
||||
});
|
||||
}
|
||||
|
||||
if ( !jQuery.support.style ) {
|
||||
jQuery.attrHooks.style = {
|
||||
get: function( elem ) {
|
||||
// Return undefined in the case of empty string
|
||||
// Note: IE uppercases css property names, but if we were to .toLowerCase()
|
||||
// .cssText, that would destroy case senstitivity in URL's, like in "background"
|
||||
return elem.style.cssText || undefined;
|
||||
},
|
||||
set: function( elem, value ) {
|
||||
return ( elem.style.cssText = value + "" );
|
||||
}
|
||||
};
|
||||
}
|
||||
|
||||
// Safari mis-reports the default selected property of an option
|
||||
// Accessing the parent's selectedIndex property fixes it
|
||||
if ( !jQuery.support.optSelected ) {
|
||||
jQuery.propHooks.selected = jQuery.extend( jQuery.propHooks.selected, {
|
||||
get: function( elem ) {
|
||||
var parent = elem.parentNode;
|
||||
|
||||
if ( parent ) {
|
||||
parent.selectedIndex;
|
||||
|
||||
// Make sure that it also works with optgroups, see #5701
|
||||
if ( parent.parentNode ) {
|
||||
parent.parentNode.selectedIndex;
|
||||
}
|
||||
}
|
||||
return null;
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
// IE6/7 call enctype encoding
|
||||
if ( !jQuery.support.enctype ) {
|
||||
jQuery.propFix.enctype = "encoding";
|
||||
}
|
||||
|
||||
// Radios and checkboxes getter/setter
|
||||
if ( !jQuery.support.checkOn ) {
|
||||
jQuery.each([ "radio", "checkbox" ], function() {
|
||||
jQuery.valHooks[ this ] = {
|
||||
get: function( elem ) {
|
||||
// Handle the case where in Webkit "" is returned instead of "on" if a value isn't specified
|
||||
return elem.getAttribute("value") === null ? "on" : elem.value;
|
||||
}
|
||||
};
|
||||
});
|
||||
}
|
||||
jQuery.each([ "radio", "checkbox" ], function() {
|
||||
jQuery.valHooks[ this ] = jQuery.extend( jQuery.valHooks[ this ], {
|
||||
set: function( elem, value ) {
|
||||
if ( jQuery.isArray( value ) ) {
|
||||
return ( elem.checked = jQuery.inArray( jQuery(elem).val(), value ) >= 0 );
|
||||
}
|
||||
}
|
||||
});
|
||||
});
|
||||
196
www/lib/jQuery/src/callbacks.js
Normal file
196
www/lib/jQuery/src/callbacks.js
Normal file
@@ -0,0 +1,196 @@
|
||||
// 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 // Flag to know if list is currently firing
|
||||
firing,
|
||||
// Last fire value (for non-forgettable lists)
|
||||
memory,
|
||||
// Flag to know if list was already fired
|
||||
fired,
|
||||
// End of the loop when firing
|
||||
firingLength,
|
||||
// Index of currently firing callback (modified by remove if needed)
|
||||
firingIndex,
|
||||
// First callback to fire (used internally by add and fireWith)
|
||||
firingStart,
|
||||
// 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 = [];
|
||||
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 ) {
|
||||
args = args || [];
|
||||
args = [ context, args.slice ? args.slice() : args ];
|
||||
if ( list && ( !fired || stack ) ) {
|
||||
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;
|
||||
};
|
||||
949
www/lib/jQuery/src/core.js
Normal file
949
www/lib/jQuery/src/core.js
Normal file
@@ -0,0 +1,949 @@
|
||||
var
|
||||
// The deferred used on DOM ready
|
||||
readyList,
|
||||
|
||||
// A central reference to the root jQuery(document)
|
||||
rootjQuery,
|
||||
|
||||
// Support: IE<9
|
||||
// For `typeof node.method` instead of `node.method !== undefined`
|
||||
core_strundefined = typeof undefined,
|
||||
|
||||
// Use the correct document accordingly with window argument (sandbox)
|
||||
document = window.document,
|
||||
location = window.location,
|
||||
|
||||
// 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 = "@VERSION",
|
||||
|
||||
// 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,
|
||||
|
||||
// Make sure we trim BOM and NBSP (here's looking at you, Safari 5.0 and IE)
|
||||
rtrim = /^[\s\uFEFF\xA0]+|[\s\uFEFF\xA0]+$/g,
|
||||
|
||||
// A simple way to check for HTML strings
|
||||
// Prioritize #id over <tag> to avoid XSS via location.hash (#9521)
|
||||
// Strict HTML recognition (#11290: must start with <)
|
||||
rquickExpr = /^(?:(<[\w\W]+>)[^>]*|#([\w-]*))$/,
|
||||
|
||||
// Match a standalone tag
|
||||
rsingleTag = /^<(\w+)\s*\/?>(?:<\/\1>|)$/,
|
||||
|
||||
// JSON RegExp
|
||||
rvalidchars = /^[\],:{}\s]*$/,
|
||||
rvalidbraces = /(?:^|:|,)(?:\s*\[)+/g,
|
||||
rvalidescape = /\\(?:["\\\/bfnrt]|u[\da-fA-F]{4})/g,
|
||||
rvalidtokens = /"[^"\\\r\n]*"|true|false|null|-?(?:\d+\.|)\d+(?:[eE][+-]?\d+|)/g,
|
||||
|
||||
// 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
|
||||
completed = function( event ) {
|
||||
|
||||
// readyState === "complete" is good enough for us to call the dom ready in oldIE
|
||||
if ( document.addEventListener || event.type === "load" || document.readyState === "complete" ) {
|
||||
detach();
|
||||
jQuery.ready();
|
||||
}
|
||||
},
|
||||
// Clean-up method for dom ready events
|
||||
detach = function() {
|
||||
if ( document.addEventListener ) {
|
||||
document.removeEventListener( "DOMContentLoaded", completed, false );
|
||||
window.removeEventListener( "load", completed, false );
|
||||
|
||||
} else {
|
||||
document.detachEvent( "onreadystatechange", completed );
|
||||
window.detachEvent( "onload", completed );
|
||||
}
|
||||
};
|
||||
|
||||
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 ) {
|
||||
// Handle the case where IE and Opera return items
|
||||
// by name instead of ID
|
||||
if ( elem.id !== match[2] ) {
|
||||
return rootjQuery.find( selector );
|
||||
}
|
||||
|
||||
// Otherwise, we 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,
|
||||
|
||||
// The number of elements contained in the matched element set
|
||||
size: function() {
|
||||
return this.length;
|
||||
},
|
||||
|
||||
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 src, copyIsArray, copy, name, options, 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({
|
||||
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;
|
||||
}
|
||||
|
||||
// Make sure body exists, at least, in case IE gets a little overzealous (ticket #5443).
|
||||
if ( !document.body ) {
|
||||
return setTimeout( jQuery.ready );
|
||||
}
|
||||
|
||||
// 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 || function( obj ) {
|
||||
return jQuery.type(obj) === "array";
|
||||
},
|
||||
|
||||
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 );
|
||||
}
|
||||
return typeof obj === "object" || typeof obj === "function" ?
|
||||
class2type[ core_toString.call(obj) ] || "object" :
|
||||
typeof obj;
|
||||
},
|
||||
|
||||
isPlainObject: function( obj ) {
|
||||
// Must be an Object.
|
||||
// Because of IE, we also have to check the presence of the constructor property.
|
||||
// Make sure that DOM nodes and window objects don't pass through, as well
|
||||
if ( !obj || jQuery.type(obj) !== "object" || obj.nodeType || jQuery.isWindow( obj ) ) {
|
||||
return false;
|
||||
}
|
||||
|
||||
try {
|
||||
// Not own constructor property must be Object
|
||||
if ( obj.constructor &&
|
||||
!core_hasOwn.call(obj, "constructor") &&
|
||||
!core_hasOwn.call(obj.constructor.prototype, "isPrototypeOf") ) {
|
||||
return false;
|
||||
}
|
||||
} catch ( e ) {
|
||||
// IE8,9 Will throw exceptions on certain host objects #9897
|
||||
return false;
|
||||
}
|
||||
|
||||
// Own properties are enumerated firstly, so to speed up,
|
||||
// if last one is own, then all properties are own.
|
||||
|
||||
var key;
|
||||
for ( key in obj ) {}
|
||||
|
||||
return key === undefined || core_hasOwn.call( obj, key );
|
||||
},
|
||||
|
||||
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: function( data ) {
|
||||
// Attempt to parse using the native JSON parser first
|
||||
if ( window.JSON && window.JSON.parse ) {
|
||||
return window.JSON.parse( data );
|
||||
}
|
||||
|
||||
if ( data === null ) {
|
||||
return data;
|
||||
}
|
||||
|
||||
if ( typeof data === "string" ) {
|
||||
|
||||
// Make sure leading/trailing whitespace is removed (IE can't handle it)
|
||||
data = jQuery.trim( data );
|
||||
|
||||
if ( data ) {
|
||||
// Make sure the incoming data is actual JSON
|
||||
// Logic borrowed from http://json.org/json2.js
|
||||
if ( rvalidchars.test( data.replace( rvalidescape, "@" )
|
||||
.replace( rvalidtokens, "]" )
|
||||
.replace( rvalidbraces, "")) ) {
|
||||
|
||||
return ( new Function( "return " + data ) )();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
jQuery.error( "Invalid JSON: " + data );
|
||||
},
|
||||
|
||||
// Cross-browser xml parsing
|
||||
parseXML: function( data ) {
|
||||
var xml, tmp;
|
||||
if ( !data || typeof data !== "string" ) {
|
||||
return null;
|
||||
}
|
||||
try {
|
||||
if ( window.DOMParser ) { // Standard
|
||||
tmp = new DOMParser();
|
||||
xml = tmp.parseFromString( data , "text/xml" );
|
||||
} else { // IE
|
||||
xml = new ActiveXObject( "Microsoft.XMLDOM" );
|
||||
xml.async = "false";
|
||||
xml.loadXML( data );
|
||||
}
|
||||
} catch( e ) {
|
||||
xml = undefined;
|
||||
}
|
||||
if ( !xml || !xml.documentElement || xml.getElementsByTagName( "parsererror" ).length ) {
|
||||
jQuery.error( "Invalid XML: " + data );
|
||||
}
|
||||
return xml;
|
||||
},
|
||||
|
||||
noop: function() {},
|
||||
|
||||
// Evaluates a script in a global context
|
||||
// Workarounds based on findings by Jim Driscoll
|
||||
// http://weblogs.java.net/blog/driscoll/archive/2009/09/08/eval-javascript-global-context
|
||||
globalEval: function( data ) {
|
||||
if ( data && jQuery.trim( data ) ) {
|
||||
// We use execScript on Internet Explorer
|
||||
// We use an anonymous function so that context is window
|
||||
// rather than jQuery in Firefox
|
||||
( window.execScript || function( data ) {
|
||||
window[ "eval" ].call( window, data );
|
||||
} )( data );
|
||||
}
|
||||
},
|
||||
|
||||
// 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;
|
||||
},
|
||||
|
||||
// Use native String.trim function wherever possible
|
||||
trim: core_trim && !core_trim.call("\uFEFF\xA0") ?
|
||||
function( text ) {
|
||||
return text == null ?
|
||||
"" :
|
||||
core_trim.call( text );
|
||||
} :
|
||||
|
||||
// Otherwise use our own trimming functionality
|
||||
function( text ) {
|
||||
return text == null ?
|
||||
"" :
|
||||
( text + "" ).replace( rtrim, "" );
|
||||
},
|
||||
|
||||
// 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 ) {
|
||||
var len;
|
||||
|
||||
if ( arr ) {
|
||||
if ( core_indexOf ) {
|
||||
return core_indexOf.call( arr, elem, i );
|
||||
}
|
||||
|
||||
len = arr.length;
|
||||
i = i ? i < 0 ? Math.max( 0, len + i ) : i : 0;
|
||||
|
||||
for ( ; i < len; i++ ) {
|
||||
// Skip accessing in sparse arrays
|
||||
if ( i in arr && arr[ i ] === elem ) {
|
||||
return i;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return -1;
|
||||
},
|
||||
|
||||
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 args, proxy, tmp;
|
||||
|
||||
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: function() {
|
||||
return ( new Date() ).getTime();
|
||||
}
|
||||
});
|
||||
|
||||
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 );
|
||||
|
||||
// Standards-based browsers support DOMContentLoaded
|
||||
} else if ( document.addEventListener ) {
|
||||
// Use the handy event callback
|
||||
document.addEventListener( "DOMContentLoaded", completed, false );
|
||||
|
||||
// A fallback to window.onload, that will always work
|
||||
window.addEventListener( "load", completed, false );
|
||||
|
||||
// If IE event model is used
|
||||
} else {
|
||||
// Ensure firing before onload, maybe late but safe also for iframes
|
||||
document.attachEvent( "onreadystatechange", completed );
|
||||
|
||||
// A fallback to window.onload, that will always work
|
||||
window.attachEvent( "onload", completed );
|
||||
|
||||
// If IE and not a frame
|
||||
// continually check to see if the document is ready
|
||||
var top = false;
|
||||
|
||||
try {
|
||||
top = window.frameElement == null && document.documentElement;
|
||||
} catch(e) {}
|
||||
|
||||
if ( top && top.doScroll ) {
|
||||
(function doScrollCheck() {
|
||||
if ( !jQuery.isReady ) {
|
||||
|
||||
try {
|
||||
// Use the trick by Diego Perini
|
||||
// http://javascript.nwbox.com/IEContentLoaded/
|
||||
top.doScroll("left");
|
||||
} catch(e) {
|
||||
return setTimeout( doScrollCheck, 50 );
|
||||
}
|
||||
|
||||
// detach all dom ready events
|
||||
detach();
|
||||
|
||||
// and execute any waiting functions
|
||||
jQuery.ready();
|
||||
}
|
||||
})();
|
||||
}
|
||||
}
|
||||
}
|
||||
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);
|
||||
679
www/lib/jQuery/src/css.js
Normal file
679
www/lib/jQuery/src/css.js
Normal file
@@ -0,0 +1,679 @@
|
||||
var iframe, getStyles, curCSS,
|
||||
ralpha = /alpha\([^)]*\)/i,
|
||||
ropacity = /opacity\s*=\s*([^)]*)/,
|
||||
rposition = /^(top|right|bottom|left)$/,
|
||||
// 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 );
|
||||
}
|
||||
|
||||
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 ] = jQuery._data( 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 ] = jQuery._data( elem, "olddisplay", css_defaultDisplay(elem.nodeName) );
|
||||
}
|
||||
} else {
|
||||
|
||||
if ( !values[ index ] ) {
|
||||
hidden = isHidden( elem );
|
||||
|
||||
if ( display && display !== "none" || !hidden ) {
|
||||
jQuery._data( 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 len, styles,
|
||||
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 ) {
|
||||
var bool = typeof state === "boolean";
|
||||
|
||||
return this.each(function() {
|
||||
if ( bool ? state : 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;
|
||||
}
|
||||
}
|
||||
}
|
||||
},
|
||||
|
||||
// Exclude the following css properties to add px
|
||||
cssNumber: {
|
||||
"columnCount": true,
|
||||
"fillOpacity": true,
|
||||
"fontWeight": true,
|
||||
"lineHeight": true,
|
||||
"opacity": 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": jQuery.support.cssFloat ? "cssFloat" : "styleFloat"
|
||||
},
|
||||
|
||||
// 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 specifing 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 ) {
|
||||
|
||||
// Wrapped to prevent IE from throwing errors when 'invalid' values are provided
|
||||
// Fixes bug #5509
|
||||
try {
|
||||
style[ name ] = value;
|
||||
} catch(e) {}
|
||||
}
|
||||
|
||||
} 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 num, val, 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;
|
||||
},
|
||||
|
||||
// A method for quickly swapping in/out CSS properties to get correct calculations
|
||||
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;
|
||||
}
|
||||
});
|
||||
|
||||
// NOTE: we've included the "window" in window.getComputedStyle
|
||||
// because jsdom on node.js will break without it.
|
||||
if ( window.getComputedStyle ) {
|
||||
getStyles = function( elem ) {
|
||||
return window.getComputedStyle( elem, null );
|
||||
};
|
||||
|
||||
curCSS = function( elem, name, _computed ) {
|
||||
var width, minWidth, maxWidth,
|
||||
computed = _computed || getStyles( elem ),
|
||||
|
||||
// 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 );
|
||||
}
|
||||
|
||||
// A tribute to the "awesome hack by Dean Edwards"
|
||||
// Chrome < 17 and Safari 5.0 uses "computed value" instead of "used value" for margin-right
|
||||
// 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;
|
||||
};
|
||||
} else if ( document.documentElement.currentStyle ) {
|
||||
getStyles = function( elem ) {
|
||||
return elem.currentStyle;
|
||||
};
|
||||
|
||||
curCSS = function( elem, name, _computed ) {
|
||||
var left, rs, rsLeft,
|
||||
computed = _computed || getStyles( elem ),
|
||||
ret = computed ? computed[ name ] : undefined,
|
||||
style = elem.style;
|
||||
|
||||
// Avoid setting ret to empty string here
|
||||
// so we don't default to auto
|
||||
if ( ret == null && style && style[ name ] ) {
|
||||
ret = style[ name ];
|
||||
}
|
||||
|
||||
// From the awesome hack by Dean Edwards
|
||||
// http://erik.eae.net/archives/2007/07/27/18.54.15/#comment-102291
|
||||
|
||||
// If we're not dealing with a regular pixel number
|
||||
// but a number that has a weird ending, we need to convert it to pixels
|
||||
// but not position css attributes, as those are proportional to the parent element instead
|
||||
// and we can't measure the parent instead because it might trigger a "stacking dolls" problem
|
||||
if ( rnumnonpx.test( ret ) && !rposition.test( name ) ) {
|
||||
|
||||
// Remember the original values
|
||||
left = style.left;
|
||||
rs = elem.runtimeStyle;
|
||||
rsLeft = rs && rs.left;
|
||||
|
||||
// Put in the new values to get a computed value out
|
||||
if ( rsLeft ) {
|
||||
rs.left = elem.currentStyle.left;
|
||||
}
|
||||
style.left = name === "fontSize" ? "1em" : ret;
|
||||
ret = style.pixelLeft + "px";
|
||||
|
||||
// Revert the changed values
|
||||
style.left = left;
|
||||
if ( rsLeft ) {
|
||||
rs.left = rsLeft;
|
||||
}
|
||||
}
|
||||
|
||||
return ret === "" ? "auto" : 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("<iframe frameborder='0' width='0' height='0'/>")
|
||||
.css( "cssText", "display:block !important" )
|
||||
).appendTo( doc.documentElement );
|
||||
|
||||
// Always write a new HTML skeleton so Webkit and Firefox don't choke on reuse
|
||||
doc = ( iframe[0].contentWindow || iframe[0].contentDocument ).document;
|
||||
doc.write("<!doctype html><html><body>");
|
||||
doc.close();
|
||||
|
||||
display = actualDisplay( nodeName, doc );
|
||||
iframe.detach();
|
||||
}
|
||||
|
||||
// Store the correct default display
|
||||
elemdisplay[ nodeName ] = display;
|
||||
}
|
||||
|
||||
return display;
|
||||
}
|
||||
|
||||
// Called ONLY from within css_defaultDisplay
|
||||
function actualDisplay( name, doc ) {
|
||||
var elem = jQuery( doc.createElement( name ) ).appendTo( doc.body ),
|
||||
display = jQuery.css( elem[0], "display" );
|
||||
elem.remove();
|
||||
return display;
|
||||
}
|
||||
|
||||
jQuery.each([ "height", "width" ], function( i, name ) {
|
||||
jQuery.cssHooks[ name ] = {
|
||||
get: function( elem, computed, extra ) {
|
||||
if ( computed ) {
|
||||
// certain elements can have dimension info if we invisibly show them
|
||||
// however, it must have a current display style that would benefit from this
|
||||
return elem.offsetWidth === 0 && rdisplayswap.test( jQuery.css( elem, "display" ) ) ?
|
||||
jQuery.swap( elem, cssShow, function() {
|
||||
return getWidthOrHeight( elem, name, extra );
|
||||
}) :
|
||||
getWidthOrHeight( elem, name, extra );
|
||||
}
|
||||
},
|
||||
|
||||
set: function( elem, value, extra ) {
|
||||
var styles = extra && getStyles( elem );
|
||||
return setPositiveNumber( elem, value, extra ?
|
||||
augmentWidthOrHeight(
|
||||
elem,
|
||||
name,
|
||||
extra,
|
||||
jQuery.support.boxSizing && jQuery.css( elem, "boxSizing", false, styles ) === "border-box",
|
||||
styles
|
||||
) : 0
|
||||
);
|
||||
}
|
||||
};
|
||||
});
|
||||
|
||||
if ( !jQuery.support.opacity ) {
|
||||
jQuery.cssHooks.opacity = {
|
||||
get: function( elem, computed ) {
|
||||
// IE uses filters for opacity
|
||||
return ropacity.test( (computed && elem.currentStyle ? elem.currentStyle.filter : elem.style.filter) || "" ) ?
|
||||
( 0.01 * parseFloat( RegExp.$1 ) ) + "" :
|
||||
computed ? "1" : "";
|
||||
},
|
||||
|
||||
set: function( elem, value ) {
|
||||
var style = elem.style,
|
||||
currentStyle = elem.currentStyle,
|
||||
opacity = jQuery.isNumeric( value ) ? "alpha(opacity=" + value * 100 + ")" : "",
|
||||
filter = currentStyle && currentStyle.filter || style.filter || "";
|
||||
|
||||
// IE has trouble with opacity if it does not have layout
|
||||
// Force it by setting the zoom level
|
||||
style.zoom = 1;
|
||||
|
||||
// if setting opacity to 1, and no other filters exist - attempt to remove filter attribute #6652
|
||||
// if value === "", then remove inline opacity #12685
|
||||
if ( ( value >= 1 || value === "" ) &&
|
||||
jQuery.trim( filter.replace( ralpha, "" ) ) === "" &&
|
||||
style.removeAttribute ) {
|
||||
|
||||
// Setting style.filter to null, "" & " " still leave "filter:" in the cssText
|
||||
// if "filter:" is present at all, clearType is disabled, we want to avoid this
|
||||
// style.removeAttribute is IE Only, but so apparently is this code path...
|
||||
style.removeAttribute( "filter" );
|
||||
|
||||
// if there is no filter style applied in a css rule or unset inline opacity, we are done
|
||||
if ( value === "" || currentStyle && !currentStyle.filter ) {
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
// otherwise, set new filter values
|
||||
style.filter = ralpha.test( filter ) ?
|
||||
filter.replace( ralpha, opacity ) :
|
||||
filter + " " + opacity;
|
||||
}
|
||||
};
|
||||
}
|
||||
|
||||
// These hooks cannot be added until DOM ready because the support test
|
||||
// for it is not run until after DOM ready
|
||||
jQuery(function() {
|
||||
if ( !jQuery.support.reliableMarginRight ) {
|
||||
jQuery.cssHooks.marginRight = {
|
||||
get: function( elem, computed ) {
|
||||
if ( computed ) {
|
||||
// WebKit Bug 13343 - getComputedStyle returns wrong value for margin-right
|
||||
// Work around by temporarily setting element display to inline-block
|
||||
return jQuery.swap( elem, { "display": "inline-block" },
|
||||
curCSS, [ elem, "marginRight" ] );
|
||||
}
|
||||
}
|
||||
};
|
||||
}
|
||||
|
||||
// Webkit bug: https://bugs.webkit.org/show_bug.cgi?id=29084
|
||||
// getComputedStyle returns percent when specified for top/left/bottom/right
|
||||
// rather than make the css module depend on the offset module, we just check for it here
|
||||
if ( !jQuery.support.pixelPosition && jQuery.fn.position ) {
|
||||
jQuery.each( [ "top", "left" ], function( i, prop ) {
|
||||
jQuery.cssHooks[ prop ] = {
|
||||
get: function( elem, computed ) {
|
||||
if ( computed ) {
|
||||
computed = curCSS( elem, prop );
|
||||
// if curCSS returns percentage, fallback to offset
|
||||
return rnumnonpx.test( computed ) ?
|
||||
jQuery( elem ).position()[ prop ] + "px" :
|
||||
computed;
|
||||
}
|
||||
}
|
||||
};
|
||||
});
|
||||
}
|
||||
|
||||
});
|
||||
|
||||
if ( jQuery.expr && jQuery.expr.filters ) {
|
||||
jQuery.expr.filters.hidden = function( elem ) {
|
||||
// Support: Opera <= 12.12
|
||||
// Opera reports offsetWidths and offsetHeights less than zero on some elements
|
||||
return elem.offsetWidth <= 0 && elem.offsetHeight <= 0 ||
|
||||
(!jQuery.support.reliableHiddenOffsets && ((elem.style && elem.style.display) || jQuery.css( elem, "display" )) === "none");
|
||||
};
|
||||
|
||||
jQuery.expr.filters.visible = function( elem ) {
|
||||
return !jQuery.expr.filters.hidden( elem );
|
||||
};
|
||||
}
|
||||
|
||||
// These hooks are used by animate to expand properties
|
||||
jQuery.each({
|
||||
margin: "",
|
||||
padding: "",
|
||||
border: "Width"
|
||||
}, function( prefix, suffix ) {
|
||||
jQuery.cssHooks[ prefix + suffix ] = {
|
||||
expand: function( value ) {
|
||||
var i = 0,
|
||||
expanded = {},
|
||||
|
||||
// assumes a single number if not a string
|
||||
parts = typeof value === "string" ? value.split(" ") : [ value ];
|
||||
|
||||
for ( ; i < 4; i++ ) {
|
||||
expanded[ prefix + cssExpand[ i ] + suffix ] =
|
||||
parts[ i ] || parts[ i - 2 ] || parts[ 0 ];
|
||||
}
|
||||
|
||||
return expanded;
|
||||
}
|
||||
};
|
||||
|
||||
if ( !rmargin.test( prefix ) ) {
|
||||
jQuery.cssHooks[ prefix + suffix ].set = setPositiveNumber;
|
||||
}
|
||||
});
|
||||
340
www/lib/jQuery/src/data.js
Normal file
340
www/lib/jQuery/src/data.js
Normal file
@@ -0,0 +1,340 @@
|
||||
var rbrace = /(?:\{[\s\S]*\}|\[[\s\S]*\])$/,
|
||||
rmultiDash = /([A-Z])/g;
|
||||
|
||||
function internalData( elem, name, data, pvt /* Internal Use Only */ ){
|
||||
if ( !jQuery.acceptData( elem ) ) {
|
||||
return;
|
||||
}
|
||||
|
||||
var thisCache, ret,
|
||||
internalKey = jQuery.expando,
|
||||
getByName = typeof name === "string",
|
||||
|
||||
// We have to handle DOM nodes and JS objects differently because IE6-7
|
||||
// can't GC object references properly across the DOM-JS boundary
|
||||
isNode = elem.nodeType,
|
||||
|
||||
// Only DOM nodes need the global jQuery cache; JS object data is
|
||||
// attached directly to the object so GC can occur automatically
|
||||
cache = isNode ? jQuery.cache : elem,
|
||||
|
||||
// Only defining an ID for JS objects if its cache already exists allows
|
||||
// the code to shortcut on the same path as a DOM node with no cache
|
||||
id = isNode ? elem[ internalKey ] : elem[ internalKey ] && internalKey;
|
||||
|
||||
// Avoid doing any more work than we need to when trying to get data on an
|
||||
// object that has no data at all
|
||||
if ( (!id || !cache[id] || (!pvt && !cache[id].data)) && getByName && data === undefined ) {
|
||||
return;
|
||||
}
|
||||
|
||||
if ( !id ) {
|
||||
// Only DOM nodes need a new unique ID for each element since their data
|
||||
// ends up in the global cache
|
||||
if ( isNode ) {
|
||||
elem[ internalKey ] = id = core_deletedIds.pop() || jQuery.guid++;
|
||||
} else {
|
||||
id = internalKey;
|
||||
}
|
||||
}
|
||||
|
||||
if ( !cache[ id ] ) {
|
||||
cache[ id ] = {};
|
||||
|
||||
// Avoids exposing jQuery metadata on plain JS objects when the object
|
||||
// is serialized using JSON.stringify
|
||||
if ( !isNode ) {
|
||||
cache[ id ].toJSON = jQuery.noop;
|
||||
}
|
||||
}
|
||||
|
||||
// An object can be passed to jQuery.data instead of a key/value pair; this gets
|
||||
// shallow copied over onto the existing cache
|
||||
if ( typeof name === "object" || typeof name === "function" ) {
|
||||
if ( pvt ) {
|
||||
cache[ id ] = jQuery.extend( cache[ id ], name );
|
||||
} else {
|
||||
cache[ id ].data = jQuery.extend( cache[ id ].data, name );
|
||||
}
|
||||
}
|
||||
|
||||
thisCache = cache[ id ];
|
||||
|
||||
// jQuery data() is stored in a separate object inside the object's internal data
|
||||
// cache in order to avoid key collisions between internal data and user-defined
|
||||
// data.
|
||||
if ( !pvt ) {
|
||||
if ( !thisCache.data ) {
|
||||
thisCache.data = {};
|
||||
}
|
||||
|
||||
thisCache = thisCache.data;
|
||||
}
|
||||
|
||||
if ( data !== undefined ) {
|
||||
thisCache[ jQuery.camelCase( name ) ] = data;
|
||||
}
|
||||
|
||||
// Check for both converted-to-camel and non-converted data property names
|
||||
// If a data property was specified
|
||||
if ( getByName ) {
|
||||
|
||||
// First Try to find as-is property data
|
||||
ret = thisCache[ name ];
|
||||
|
||||
// Test for null|undefined property data
|
||||
if ( ret == null ) {
|
||||
|
||||
// Try to find the camelCased property
|
||||
ret = thisCache[ jQuery.camelCase( name ) ];
|
||||
}
|
||||
} else {
|
||||
ret = thisCache;
|
||||
}
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
function internalRemoveData( elem, name, pvt ) {
|
||||
if ( !jQuery.acceptData( elem ) ) {
|
||||
return;
|
||||
}
|
||||
|
||||
var i, l, thisCache,
|
||||
isNode = elem.nodeType,
|
||||
|
||||
// See jQuery.data for more information
|
||||
cache = isNode ? jQuery.cache : elem,
|
||||
id = isNode ? elem[ jQuery.expando ] : jQuery.expando;
|
||||
|
||||
// If there is already no cache entry for this object, there is no
|
||||
// purpose in continuing
|
||||
if ( !cache[ id ] ) {
|
||||
return;
|
||||
}
|
||||
|
||||
if ( name ) {
|
||||
|
||||
thisCache = pvt ? cache[ id ] : cache[ id ].data;
|
||||
|
||||
if ( thisCache ) {
|
||||
|
||||
// Support array or space separated string names for data keys
|
||||
if ( !jQuery.isArray( name ) ) {
|
||||
|
||||
// try the string as a key before any manipulation
|
||||
if ( name in thisCache ) {
|
||||
name = [ name ];
|
||||
} else {
|
||||
|
||||
// split the camel cased version by spaces unless a key with the spaces exists
|
||||
name = jQuery.camelCase( name );
|
||||
if ( name in thisCache ) {
|
||||
name = [ name ];
|
||||
} else {
|
||||
name = name.split(" ");
|
||||
}
|
||||
}
|
||||
} else {
|
||||
// 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 = name.concat( jQuery.map( name, jQuery.camelCase ) );
|
||||
}
|
||||
|
||||
for ( i = 0, l = name.length; i < l; i++ ) {
|
||||
delete thisCache[ name[i] ];
|
||||
}
|
||||
|
||||
// If there is no data left in the cache, we want to continue
|
||||
// and let the cache object itself get destroyed
|
||||
if ( !( pvt ? isEmptyDataObject : jQuery.isEmptyObject )( thisCache ) ) {
|
||||
return;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// See jQuery.data for more information
|
||||
if ( !pvt ) {
|
||||
delete cache[ id ].data;
|
||||
|
||||
// Don't destroy the parent cache unless the internal data object
|
||||
// had been the only thing left in it
|
||||
if ( !isEmptyDataObject( cache[ id ] ) ) {
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
// Destroy the cache
|
||||
if ( isNode ) {
|
||||
jQuery.cleanData( [ elem ], true );
|
||||
|
||||
// Use delete when supported for expandos or `cache` is not a window per isWindow (#10080)
|
||||
} else if ( jQuery.support.deleteExpando || cache != cache.window ) {
|
||||
delete cache[ id ];
|
||||
|
||||
// When all else fails, null
|
||||
} else {
|
||||
cache[ id ] = null;
|
||||
}
|
||||
}
|
||||
|
||||
jQuery.extend({
|
||||
cache: {},
|
||||
|
||||
// Unique for each copy of jQuery on the page
|
||||
// Non-digits removed to match rinlinejQuery
|
||||
expando: "jQuery" + ( core_version + Math.random() ).replace( /\D/g, "" ),
|
||||
|
||||
// The following elements throw uncatchable exceptions if you
|
||||
// attempt to add expando properties to them.
|
||||
noData: {
|
||||
"embed": true,
|
||||
// Ban all objects except for Flash (which handle expandos)
|
||||
"object": "clsid:D27CDB6E-AE6D-11cf-96B8-444553540000",
|
||||
"applet": true
|
||||
},
|
||||
|
||||
hasData: function( elem ) {
|
||||
elem = elem.nodeType ? jQuery.cache[ elem[jQuery.expando] ] : elem[ jQuery.expando ];
|
||||
return !!elem && !isEmptyDataObject( elem );
|
||||
},
|
||||
|
||||
data: function( elem, name, data ) {
|
||||
return internalData( elem, name, data );
|
||||
},
|
||||
|
||||
removeData: function( elem, name ) {
|
||||
return internalRemoveData( elem, name );
|
||||
},
|
||||
|
||||
// For internal use only.
|
||||
_data: function( elem, name, data ) {
|
||||
return internalData( elem, name, data, true );
|
||||
},
|
||||
|
||||
_removeData: function( elem, name ) {
|
||||
return internalRemoveData( elem, name, true );
|
||||
},
|
||||
|
||||
// A method for determining if a DOM node can handle the data expando
|
||||
acceptData: function( elem ) {
|
||||
// Do not set data on non-element because it will not be cleared (#8335).
|
||||
if ( elem.nodeType && elem.nodeType !== 1 && elem.nodeType !== 9 ) {
|
||||
return false;
|
||||
}
|
||||
|
||||
var noData = elem.nodeName && jQuery.noData[ elem.nodeName.toLowerCase() ];
|
||||
|
||||
// nodes accept data unless otherwise specified; rejection can be conditional
|
||||
return !noData || noData !== true && elem.getAttribute("classid") === noData;
|
||||
}
|
||||
});
|
||||
|
||||
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 = jQuery.data( elem );
|
||||
|
||||
if ( elem.nodeType === 1 && !jQuery._data( elem, "parsedAttrs" ) ) {
|
||||
attrs = elem.attributes;
|
||||
for ( ; i < attrs.length; i++ ) {
|
||||
name = attrs[i].name;
|
||||
|
||||
if ( !name.indexOf( "data-" ) ) {
|
||||
name = jQuery.camelCase( name.slice(5) );
|
||||
|
||||
dataAttr( elem, name, data[ name ] );
|
||||
}
|
||||
}
|
||||
jQuery._data( elem, "parsedAttrs", true );
|
||||
}
|
||||
}
|
||||
|
||||
return data;
|
||||
}
|
||||
|
||||
// Sets multiple values
|
||||
if ( typeof key === "object" ) {
|
||||
return this.each(function() {
|
||||
jQuery.data( this, key );
|
||||
});
|
||||
}
|
||||
|
||||
return jQuery.access( this, function( value ) {
|
||||
|
||||
if ( value === undefined ) {
|
||||
// Try to fetch any internally stored data first
|
||||
return elem ? dataAttr( elem, key, jQuery.data( elem, key ) ) : null;
|
||||
}
|
||||
|
||||
this.each(function() {
|
||||
jQuery.data( this, key, value );
|
||||
});
|
||||
}, null, value, arguments.length > 1, null, true );
|
||||
},
|
||||
|
||||
removeData: function( key ) {
|
||||
return this.each(function() {
|
||||
jQuery.removeData( this, key );
|
||||
});
|
||||
}
|
||||
});
|
||||
|
||||
function dataAttr( elem, key, data ) {
|
||||
// If nothing was found internally, try to fetch any
|
||||
// data from the HTML5 data-* attribute
|
||||
if ( data === undefined && elem.nodeType === 1 ) {
|
||||
|
||||
var 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 ) ? jQuery.parseJSON( data ) :
|
||||
data;
|
||||
} catch( e ) {}
|
||||
|
||||
// Make sure we set the data so it isn't changed later
|
||||
jQuery.data( elem, key, data );
|
||||
|
||||
} else {
|
||||
data = undefined;
|
||||
}
|
||||
}
|
||||
|
||||
return data;
|
||||
}
|
||||
|
||||
// checks a cache object for emptiness
|
||||
function isEmptyDataObject( obj ) {
|
||||
var name;
|
||||
for ( name in obj ) {
|
||||
|
||||
// if the public data object is empty, the private is still empty
|
||||
if ( name === "data" && jQuery.isEmptyObject( obj[name] ) ) {
|
||||
continue;
|
||||
}
|
||||
if ( name !== "toJSON" ) {
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
141
www/lib/jQuery/src/deferred.js
Normal file
141
www/lib/jQuery/src/deferred.js
Normal file
@@ -0,0 +1,141 @@
|
||||
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();
|
||||
}
|
||||
});
|
||||
4
www/lib/jQuery/src/deprecated.js
Normal file
4
www/lib/jQuery/src/deprecated.js
Normal file
@@ -0,0 +1,4 @@
|
||||
// Limit scope pollution from any deprecated API
|
||||
// (function() {
|
||||
|
||||
// })();
|
||||
41
www/lib/jQuery/src/dimensions.js
Normal file
41
www/lib/jQuery/src/dimensions.js
Normal file
@@ -0,0 +1,41 @@
|
||||
// Create innerHeight, innerWidth, height, width, outerHeight and outerWidth methods
|
||||
jQuery.each( { Height: "height", Width: "width" }, function( name, type ) {
|
||||
jQuery.each( { padding: "inner" + name, content: type, "": "outer" + name }, function( defaultExtra, funcName ) {
|
||||
// margin is only for outerHeight, outerWidth
|
||||
jQuery.fn[ funcName ] = function( margin, value ) {
|
||||
var chainable = arguments.length && ( defaultExtra || typeof margin !== "boolean" ),
|
||||
extra = defaultExtra || ( margin === true || value === true ? "margin" : "border" );
|
||||
|
||||
return jQuery.access( this, function( elem, type, value ) {
|
||||
var doc;
|
||||
|
||||
if ( jQuery.isWindow( elem ) ) {
|
||||
// As of 5/8/2012 this will yield incorrect results for Mobile Safari, but there
|
||||
// isn't a whole lot we can do. See pull request at this URL for discussion:
|
||||
// https://github.com/jquery/jquery/pull/764
|
||||
return elem.document.documentElement[ "client" + name ];
|
||||
}
|
||||
|
||||
// Get document width or height
|
||||
if ( elem.nodeType === 9 ) {
|
||||
doc = elem.documentElement;
|
||||
|
||||
// Either scroll[Width/Height] or offset[Width/Height] or client[Width/Height], whichever is greatest
|
||||
// unfortunately, this causes bug #3838 in IE6/8 only, but there is currently no good, small way to fix it.
|
||||
return Math.max(
|
||||
elem.body[ "scroll" + name ], doc[ "scroll" + name ],
|
||||
elem.body[ "offset" + name ], doc[ "offset" + name ],
|
||||
doc[ "client" + name ]
|
||||
);
|
||||
}
|
||||
|
||||
return value === undefined ?
|
||||
// Get width or height on the element, requesting but not forcing parseFloat
|
||||
jQuery.css( elem, type, extra ) :
|
||||
|
||||
// Set width or height on the element
|
||||
jQuery.style( elem, type, value, extra );
|
||||
}, type, chainable ? margin : undefined, chainable, null );
|
||||
};
|
||||
});
|
||||
});
|
||||
730
www/lib/jQuery/src/effects.js
vendored
Normal file
730
www/lib/jQuery/src/effects.js
vendored
Normal file
@@ -0,0 +1,730 @@
|
||||
var fxNow, timerId,
|
||||
rfxtypes = /^(?:toggle|show|hide)$/,
|
||||
rfxnum = new RegExp( "^(?:([+-])=|)(" + core_pnum + ")([a-z%]*)$", "i" ),
|
||||
rrun = /queueHooks$/,
|
||||
animationPrefilters = [ defaultPrefilter ],
|
||||
tweeners = {
|
||||
"*": [function( prop, value ) {
|
||||
var end, unit,
|
||||
tween = this.createTween( prop, value ),
|
||||
parts = rfxnum.exec( value ),
|
||||
target = tween.cur(),
|
||||
start = +target || 0,
|
||||
scale = 1,
|
||||
maxIterations = 20;
|
||||
|
||||
if ( parts ) {
|
||||
end = +parts[2];
|
||||
unit = parts[3] || ( jQuery.cssNumber[ prop ] ? "" : "px" );
|
||||
|
||||
// We need to compute starting value
|
||||
if ( unit !== "px" && start ) {
|
||||
// Iteratively approximate from a nonzero starting point
|
||||
// Prefer the current property, because this process will be trivial if it uses the same units
|
||||
// Fallback to end or a simple constant
|
||||
start = jQuery.css( tween.elem, prop, true ) || end || 1;
|
||||
|
||||
do {
|
||||
// If previous iteration zeroed out, double until we get *something*
|
||||
// Use a string for doubling factor so we don't accidentally see scale as unchanged below
|
||||
scale = scale || ".5";
|
||||
|
||||
// Adjust and apply
|
||||
start = start / scale;
|
||||
jQuery.style( tween.elem, prop, start + unit );
|
||||
|
||||
// Update scale, tolerating zero or NaN from tween.cur()
|
||||
// And breaking the loop if scale is unchanged or perfect, or if we've just had enough
|
||||
} while ( scale !== (scale = tween.cur() / target) && scale !== 1 && --maxIterations );
|
||||
}
|
||||
|
||||
tween.unit = unit;
|
||||
tween.start = start;
|
||||
// If a +=/-= token was provided, we're doing a relative animation
|
||||
tween.end = parts[1] ? start + ( parts[1] + 1 ) * end : end;
|
||||
}
|
||||
return tween;
|
||||
}]
|
||||
};
|
||||
|
||||
// Animations created synchronously will run synchronously
|
||||
function createFxNow() {
|
||||
setTimeout(function() {
|
||||
fxNow = undefined;
|
||||
});
|
||||
return ( fxNow = jQuery.now() );
|
||||
}
|
||||
|
||||
function createTweens( animation, props ) {
|
||||
jQuery.each( props, function( prop, value ) {
|
||||
var collection = ( tweeners[ prop ] || [] ).concat( tweeners[ "*" ] ),
|
||||
index = 0,
|
||||
length = collection.length;
|
||||
for ( ; index < length; index++ ) {
|
||||
if ( collection[ index ].call( animation, prop, value ) ) {
|
||||
|
||||
// we're done with this property
|
||||
return;
|
||||
}
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
function Animation( elem, properties, options ) {
|
||||
var result,
|
||||
stopped,
|
||||
index = 0,
|
||||
length = animationPrefilters.length,
|
||||
deferred = jQuery.Deferred().always( function() {
|
||||
// don't match elem in the :animated selector
|
||||
delete tick.elem;
|
||||
}),
|
||||
tick = function() {
|
||||
if ( stopped ) {
|
||||
return false;
|
||||
}
|
||||
var currentTime = fxNow || createFxNow(),
|
||||
remaining = Math.max( 0, animation.startTime + animation.duration - currentTime ),
|
||||
// archaic crash bug won't allow us to use 1 - ( 0.5 || 0 ) (#12497)
|
||||
temp = remaining / animation.duration || 0,
|
||||
percent = 1 - temp,
|
||||
index = 0,
|
||||
length = animation.tweens.length;
|
||||
|
||||
for ( ; index < length ; index++ ) {
|
||||
animation.tweens[ index ].run( percent );
|
||||
}
|
||||
|
||||
deferred.notifyWith( elem, [ animation, percent, remaining ]);
|
||||
|
||||
if ( percent < 1 && length ) {
|
||||
return remaining;
|
||||
} else {
|
||||
deferred.resolveWith( elem, [ animation ] );
|
||||
return false;
|
||||
}
|
||||
},
|
||||
animation = deferred.promise({
|
||||
elem: elem,
|
||||
props: jQuery.extend( {}, properties ),
|
||||
opts: jQuery.extend( true, { specialEasing: {} }, options ),
|
||||
originalProperties: properties,
|
||||
originalOptions: options,
|
||||
startTime: fxNow || createFxNow(),
|
||||
duration: options.duration,
|
||||
tweens: [],
|
||||
createTween: function( prop, end ) {
|
||||
var tween = jQuery.Tween( elem, animation.opts, prop, end,
|
||||
animation.opts.specialEasing[ prop ] || animation.opts.easing );
|
||||
animation.tweens.push( tween );
|
||||
return tween;
|
||||
},
|
||||
stop: function( gotoEnd ) {
|
||||
var index = 0,
|
||||
// if we are going to the end, we want to run all the tweens
|
||||
// otherwise we skip this part
|
||||
length = gotoEnd ? animation.tweens.length : 0;
|
||||
if ( stopped ) {
|
||||
return this;
|
||||
}
|
||||
stopped = true;
|
||||
for ( ; index < length ; index++ ) {
|
||||
animation.tweens[ index ].run( 1 );
|
||||
}
|
||||
|
||||
// resolve when we played the last frame
|
||||
// otherwise, reject
|
||||
if ( gotoEnd ) {
|
||||
deferred.resolveWith( elem, [ animation, gotoEnd ] );
|
||||
} else {
|
||||
deferred.rejectWith( elem, [ animation, gotoEnd ] );
|
||||
}
|
||||
return this;
|
||||
}
|
||||
}),
|
||||
props = animation.props;
|
||||
|
||||
propFilter( props, animation.opts.specialEasing );
|
||||
|
||||
for ( ; index < length ; index++ ) {
|
||||
result = animationPrefilters[ index ].call( animation, elem, props, animation.opts );
|
||||
if ( result ) {
|
||||
return result;
|
||||
}
|
||||
}
|
||||
|
||||
createTweens( animation, props );
|
||||
|
||||
if ( jQuery.isFunction( animation.opts.start ) ) {
|
||||
animation.opts.start.call( elem, animation );
|
||||
}
|
||||
|
||||
jQuery.fx.timer(
|
||||
jQuery.extend( tick, {
|
||||
elem: elem,
|
||||
anim: animation,
|
||||
queue: animation.opts.queue
|
||||
})
|
||||
);
|
||||
|
||||
// attach callbacks from options
|
||||
return animation.progress( animation.opts.progress )
|
||||
.done( animation.opts.done, animation.opts.complete )
|
||||
.fail( animation.opts.fail )
|
||||
.always( animation.opts.always );
|
||||
}
|
||||
|
||||
function propFilter( props, specialEasing ) {
|
||||
var value, name, index, easing, hooks;
|
||||
|
||||
// camelCase, specialEasing and expand cssHook pass
|
||||
for ( index in props ) {
|
||||
name = jQuery.camelCase( index );
|
||||
easing = specialEasing[ name ];
|
||||
value = props[ index ];
|
||||
if ( jQuery.isArray( value ) ) {
|
||||
easing = value[ 1 ];
|
||||
value = props[ index ] = value[ 0 ];
|
||||
}
|
||||
|
||||
if ( index !== name ) {
|
||||
props[ name ] = value;
|
||||
delete props[ index ];
|
||||
}
|
||||
|
||||
hooks = jQuery.cssHooks[ name ];
|
||||
if ( hooks && "expand" in hooks ) {
|
||||
value = hooks.expand( value );
|
||||
delete props[ name ];
|
||||
|
||||
// not quite $.extend, this wont overwrite keys already present.
|
||||
// also - reusing 'index' from above because we have the correct "name"
|
||||
for ( index in value ) {
|
||||
if ( !( index in props ) ) {
|
||||
props[ index ] = value[ index ];
|
||||
specialEasing[ index ] = easing;
|
||||
}
|
||||
}
|
||||
} else {
|
||||
specialEasing[ name ] = easing;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
jQuery.Animation = jQuery.extend( Animation, {
|
||||
|
||||
tweener: function( props, callback ) {
|
||||
if ( jQuery.isFunction( props ) ) {
|
||||
callback = props;
|
||||
props = [ "*" ];
|
||||
} else {
|
||||
props = props.split(" ");
|
||||
}
|
||||
|
||||
var prop,
|
||||
index = 0,
|
||||
length = props.length;
|
||||
|
||||
for ( ; index < length ; index++ ) {
|
||||
prop = props[ index ];
|
||||
tweeners[ prop ] = tweeners[ prop ] || [];
|
||||
tweeners[ prop ].unshift( callback );
|
||||
}
|
||||
},
|
||||
|
||||
prefilter: function( callback, prepend ) {
|
||||
if ( prepend ) {
|
||||
animationPrefilters.unshift( callback );
|
||||
} else {
|
||||
animationPrefilters.push( callback );
|
||||
}
|
||||
}
|
||||
});
|
||||
|
||||
function defaultPrefilter( elem, props, opts ) {
|
||||
/*jshint validthis:true */
|
||||
var prop, index, length,
|
||||
value, dataShow, toggle,
|
||||
tween, hooks, oldfire,
|
||||
anim = this,
|
||||
style = elem.style,
|
||||
orig = {},
|
||||
handled = [],
|
||||
hidden = elem.nodeType && isHidden( elem );
|
||||
|
||||
// handle queue: false promises
|
||||
if ( !opts.queue ) {
|
||||
hooks = jQuery._queueHooks( elem, "fx" );
|
||||
if ( hooks.unqueued == null ) {
|
||||
hooks.unqueued = 0;
|
||||
oldfire = hooks.empty.fire;
|
||||
hooks.empty.fire = function() {
|
||||
if ( !hooks.unqueued ) {
|
||||
oldfire();
|
||||
}
|
||||
};
|
||||
}
|
||||
hooks.unqueued++;
|
||||
|
||||
anim.always(function() {
|
||||
// doing this makes sure that the complete handler will be called
|
||||
// before this completes
|
||||
anim.always(function() {
|
||||
hooks.unqueued--;
|
||||
if ( !jQuery.queue( elem, "fx" ).length ) {
|
||||
hooks.empty.fire();
|
||||
}
|
||||
});
|
||||
});
|
||||
}
|
||||
|
||||
// height/width overflow pass
|
||||
if ( elem.nodeType === 1 && ( "height" in props || "width" in props ) ) {
|
||||
// Make sure that nothing sneaks out
|
||||
// Record all 3 overflow attributes because IE does not
|
||||
// change the overflow attribute when overflowX and
|
||||
// overflowY are set to the same value
|
||||
opts.overflow = [ style.overflow, style.overflowX, style.overflowY ];
|
||||
|
||||
// Set display property to inline-block for height/width
|
||||
// animations on inline elements that are having width/height animated
|
||||
if ( jQuery.css( elem, "display" ) === "inline" &&
|
||||
jQuery.css( elem, "float" ) === "none" ) {
|
||||
|
||||
// inline-level elements accept inline-block;
|
||||
// block-level elements need to be inline with layout
|
||||
if ( !jQuery.support.inlineBlockNeedsLayout || css_defaultDisplay( elem.nodeName ) === "inline" ) {
|
||||
style.display = "inline-block";
|
||||
|
||||
} else {
|
||||
style.zoom = 1;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if ( opts.overflow ) {
|
||||
style.overflow = "hidden";
|
||||
if ( !jQuery.support.shrinkWrapBlocks ) {
|
||||
anim.always(function() {
|
||||
style.overflow = opts.overflow[ 0 ];
|
||||
style.overflowX = opts.overflow[ 1 ];
|
||||
style.overflowY = opts.overflow[ 2 ];
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
// show/hide pass
|
||||
for ( index in props ) {
|
||||
value = props[ index ];
|
||||
if ( rfxtypes.exec( value ) ) {
|
||||
delete props[ index ];
|
||||
toggle = toggle || value === "toggle";
|
||||
if ( value === ( hidden ? "hide" : "show" ) ) {
|
||||
continue;
|
||||
}
|
||||
handled.push( index );
|
||||
}
|
||||
}
|
||||
|
||||
length = handled.length;
|
||||
if ( length ) {
|
||||
dataShow = jQuery._data( elem, "fxshow" ) || jQuery._data( elem, "fxshow", {} );
|
||||
if ( "hidden" in dataShow ) {
|
||||
hidden = dataShow.hidden;
|
||||
}
|
||||
|
||||
// store state if its toggle - enables .stop().toggle() to "reverse"
|
||||
if ( toggle ) {
|
||||
dataShow.hidden = !hidden;
|
||||
}
|
||||
if ( hidden ) {
|
||||
jQuery( elem ).show();
|
||||
} else {
|
||||
anim.done(function() {
|
||||
jQuery( elem ).hide();
|
||||
});
|
||||
}
|
||||
anim.done(function() {
|
||||
var prop;
|
||||
jQuery._removeData( elem, "fxshow" );
|
||||
for ( prop in orig ) {
|
||||
jQuery.style( elem, prop, orig[ prop ] );
|
||||
}
|
||||
});
|
||||
for ( index = 0 ; index < length ; index++ ) {
|
||||
prop = handled[ index ];
|
||||
tween = anim.createTween( prop, hidden ? dataShow[ prop ] : 0 );
|
||||
orig[ prop ] = dataShow[ prop ] || jQuery.style( elem, prop );
|
||||
|
||||
if ( !( prop in dataShow ) ) {
|
||||
dataShow[ prop ] = tween.start;
|
||||
if ( hidden ) {
|
||||
tween.end = tween.start;
|
||||
tween.start = prop === "width" || prop === "height" ? 1 : 0;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
function Tween( elem, options, prop, end, easing ) {
|
||||
return new Tween.prototype.init( elem, options, prop, end, easing );
|
||||
}
|
||||
jQuery.Tween = Tween;
|
||||
|
||||
Tween.prototype = {
|
||||
constructor: Tween,
|
||||
init: function( elem, options, prop, end, easing, unit ) {
|
||||
this.elem = elem;
|
||||
this.prop = prop;
|
||||
this.easing = easing || "swing";
|
||||
this.options = options;
|
||||
this.start = this.now = this.cur();
|
||||
this.end = end;
|
||||
this.unit = unit || ( jQuery.cssNumber[ prop ] ? "" : "px" );
|
||||
},
|
||||
cur: function() {
|
||||
var hooks = Tween.propHooks[ this.prop ];
|
||||
|
||||
return hooks && hooks.get ?
|
||||
hooks.get( this ) :
|
||||
Tween.propHooks._default.get( this );
|
||||
},
|
||||
run: function( percent ) {
|
||||
var eased,
|
||||
hooks = Tween.propHooks[ this.prop ];
|
||||
|
||||
if ( this.options.duration ) {
|
||||
this.pos = eased = jQuery.easing[ this.easing ](
|
||||
percent, this.options.duration * percent, 0, 1, this.options.duration
|
||||
);
|
||||
} else {
|
||||
this.pos = eased = percent;
|
||||
}
|
||||
this.now = ( this.end - this.start ) * eased + this.start;
|
||||
|
||||
if ( this.options.step ) {
|
||||
this.options.step.call( this.elem, this.now, this );
|
||||
}
|
||||
|
||||
if ( hooks && hooks.set ) {
|
||||
hooks.set( this );
|
||||
} else {
|
||||
Tween.propHooks._default.set( this );
|
||||
}
|
||||
return this;
|
||||
}
|
||||
};
|
||||
|
||||
Tween.prototype.init.prototype = Tween.prototype;
|
||||
|
||||
Tween.propHooks = {
|
||||
_default: {
|
||||
get: function( tween ) {
|
||||
var result;
|
||||
|
||||
if ( tween.elem[ tween.prop ] != null &&
|
||||
(!tween.elem.style || tween.elem.style[ tween.prop ] == null) ) {
|
||||
return tween.elem[ tween.prop ];
|
||||
}
|
||||
|
||||
// passing an empty string as a 3rd parameter to .css will automatically
|
||||
// attempt a parseFloat and fallback to a string if the parse fails
|
||||
// so, simple values such as "10px" are parsed to Float.
|
||||
// complex values such as "rotate(1rad)" are returned as is.
|
||||
result = jQuery.css( tween.elem, tween.prop, "" );
|
||||
// Empty strings, null, undefined and "auto" are converted to 0.
|
||||
return !result || result === "auto" ? 0 : result;
|
||||
},
|
||||
set: function( tween ) {
|
||||
// use step hook for back compat - use cssHook if its there - use .style if its
|
||||
// available and use plain properties where available
|
||||
if ( jQuery.fx.step[ tween.prop ] ) {
|
||||
jQuery.fx.step[ tween.prop ]( tween );
|
||||
} else if ( tween.elem.style && ( tween.elem.style[ jQuery.cssProps[ tween.prop ] ] != null || jQuery.cssHooks[ tween.prop ] ) ) {
|
||||
jQuery.style( tween.elem, tween.prop, tween.now + tween.unit );
|
||||
} else {
|
||||
tween.elem[ tween.prop ] = tween.now;
|
||||
}
|
||||
}
|
||||
}
|
||||
};
|
||||
|
||||
// Remove in 2.0 - this supports IE8's panic based approach
|
||||
// to setting things on disconnected nodes
|
||||
|
||||
Tween.propHooks.scrollTop = Tween.propHooks.scrollLeft = {
|
||||
set: function( tween ) {
|
||||
if ( tween.elem.nodeType && tween.elem.parentNode ) {
|
||||
tween.elem[ tween.prop ] = tween.now;
|
||||
}
|
||||
}
|
||||
};
|
||||
|
||||
jQuery.each([ "toggle", "show", "hide" ], function( i, name ) {
|
||||
var cssFn = jQuery.fn[ name ];
|
||||
jQuery.fn[ name ] = function( speed, easing, callback ) {
|
||||
return speed == null || typeof speed === "boolean" ?
|
||||
cssFn.apply( this, arguments ) :
|
||||
this.animate( genFx( name, true ), speed, easing, callback );
|
||||
};
|
||||
});
|
||||
|
||||
jQuery.fn.extend({
|
||||
fadeTo: function( speed, to, easing, callback ) {
|
||||
|
||||
// show any hidden elements after setting opacity to 0
|
||||
return this.filter( isHidden ).css( "opacity", 0 ).show()
|
||||
|
||||
// animate to the value specified
|
||||
.end().animate({ opacity: to }, speed, easing, callback );
|
||||
},
|
||||
animate: function( prop, speed, easing, callback ) {
|
||||
var empty = jQuery.isEmptyObject( prop ),
|
||||
optall = jQuery.speed( speed, easing, callback ),
|
||||
doAnimation = function() {
|
||||
// Operate on a copy of prop so per-property easing won't be lost
|
||||
var anim = Animation( this, jQuery.extend( {}, prop ), optall );
|
||||
doAnimation.finish = function() {
|
||||
anim.stop( true );
|
||||
};
|
||||
// Empty animations, or finishing resolves immediately
|
||||
if ( empty || jQuery._data( this, "finish" ) ) {
|
||||
anim.stop( true );
|
||||
}
|
||||
};
|
||||
doAnimation.finish = doAnimation;
|
||||
|
||||
return empty || optall.queue === false ?
|
||||
this.each( doAnimation ) :
|
||||
this.queue( optall.queue, doAnimation );
|
||||
},
|
||||
stop: function( type, clearQueue, gotoEnd ) {
|
||||
var stopQueue = function( hooks ) {
|
||||
var stop = hooks.stop;
|
||||
delete hooks.stop;
|
||||
stop( gotoEnd );
|
||||
};
|
||||
|
||||
if ( typeof type !== "string" ) {
|
||||
gotoEnd = clearQueue;
|
||||
clearQueue = type;
|
||||
type = undefined;
|
||||
}
|
||||
if ( clearQueue && type !== false ) {
|
||||
this.queue( type || "fx", [] );
|
||||
}
|
||||
|
||||
return this.each(function() {
|
||||
var dequeue = true,
|
||||
index = type != null && type + "queueHooks",
|
||||
timers = jQuery.timers,
|
||||
data = jQuery._data( this );
|
||||
|
||||
if ( index ) {
|
||||
if ( data[ index ] && data[ index ].stop ) {
|
||||
stopQueue( data[ index ] );
|
||||
}
|
||||
} else {
|
||||
for ( index in data ) {
|
||||
if ( data[ index ] && data[ index ].stop && rrun.test( index ) ) {
|
||||
stopQueue( data[ index ] );
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
for ( index = timers.length; index--; ) {
|
||||
if ( timers[ index ].elem === this && (type == null || timers[ index ].queue === type) ) {
|
||||
timers[ index ].anim.stop( gotoEnd );
|
||||
dequeue = false;
|
||||
timers.splice( index, 1 );
|
||||
}
|
||||
}
|
||||
|
||||
// start the next in the queue if the last step wasn't forced
|
||||
// timers currently will call their complete callbacks, which will dequeue
|
||||
// but only if they were gotoEnd
|
||||
if ( dequeue || !gotoEnd ) {
|
||||
jQuery.dequeue( this, type );
|
||||
}
|
||||
});
|
||||
},
|
||||
finish: function( type ) {
|
||||
if ( type !== false ) {
|
||||
type = type || "fx";
|
||||
}
|
||||
return this.each(function() {
|
||||
var index,
|
||||
data = jQuery._data( this ),
|
||||
queue = data[ type + "queue" ],
|
||||
hooks = data[ type + "queueHooks" ],
|
||||
timers = jQuery.timers,
|
||||
length = queue ? queue.length : 0;
|
||||
|
||||
// enable finishing flag on private data
|
||||
data.finish = true;
|
||||
|
||||
// empty the queue first
|
||||
jQuery.queue( this, type, [] );
|
||||
|
||||
if ( hooks && hooks.cur && hooks.cur.finish ) {
|
||||
hooks.cur.finish.call( this );
|
||||
}
|
||||
|
||||
// look for any active animations, and finish them
|
||||
for ( index = timers.length; index--; ) {
|
||||
if ( timers[ index ].elem === this && timers[ index ].queue === type ) {
|
||||
timers[ index ].anim.stop( true );
|
||||
timers.splice( index, 1 );
|
||||
}
|
||||
}
|
||||
|
||||
// look for any animations in the old queue and finish them
|
||||
for ( index = 0; index < length; index++ ) {
|
||||
if ( queue[ index ] && queue[ index ].finish ) {
|
||||
queue[ index ].finish.call( this );
|
||||
}
|
||||
}
|
||||
|
||||
// turn off finishing flag
|
||||
delete data.finish;
|
||||
});
|
||||
}
|
||||
});
|
||||
|
||||
// Generate parameters to create a standard animation
|
||||
function genFx( type, includeWidth ) {
|
||||
var which,
|
||||
attrs = { height: type },
|
||||
i = 0;
|
||||
|
||||
// if we include width, step value is 1 to do all cssExpand values,
|
||||
// if we don't include width, step value is 2 to skip over Left and Right
|
||||
includeWidth = includeWidth? 1 : 0;
|
||||
for( ; i < 4 ; i += 2 - includeWidth ) {
|
||||
which = cssExpand[ i ];
|
||||
attrs[ "margin" + which ] = attrs[ "padding" + which ] = type;
|
||||
}
|
||||
|
||||
if ( includeWidth ) {
|
||||
attrs.opacity = attrs.width = type;
|
||||
}
|
||||
|
||||
return attrs;
|
||||
}
|
||||
|
||||
// Generate shortcuts for custom animations
|
||||
jQuery.each({
|
||||
slideDown: genFx("show"),
|
||||
slideUp: genFx("hide"),
|
||||
slideToggle: genFx("toggle"),
|
||||
fadeIn: { opacity: "show" },
|
||||
fadeOut: { opacity: "hide" },
|
||||
fadeToggle: { opacity: "toggle" }
|
||||
}, function( name, props ) {
|
||||
jQuery.fn[ name ] = function( speed, easing, callback ) {
|
||||
return this.animate( props, speed, easing, callback );
|
||||
};
|
||||
});
|
||||
|
||||
jQuery.speed = function( speed, easing, fn ) {
|
||||
var opt = speed && typeof speed === "object" ? jQuery.extend( {}, speed ) : {
|
||||
complete: fn || !fn && easing ||
|
||||
jQuery.isFunction( speed ) && speed,
|
||||
duration: speed,
|
||||
easing: fn && easing || easing && !jQuery.isFunction( easing ) && easing
|
||||
};
|
||||
|
||||
opt.duration = jQuery.fx.off ? 0 : typeof opt.duration === "number" ? opt.duration :
|
||||
opt.duration in jQuery.fx.speeds ? jQuery.fx.speeds[ opt.duration ] : jQuery.fx.speeds._default;
|
||||
|
||||
// normalize opt.queue - true/undefined/null -> "fx"
|
||||
if ( opt.queue == null || opt.queue === true ) {
|
||||
opt.queue = "fx";
|
||||
}
|
||||
|
||||
// Queueing
|
||||
opt.old = opt.complete;
|
||||
|
||||
opt.complete = function() {
|
||||
if ( jQuery.isFunction( opt.old ) ) {
|
||||
opt.old.call( this );
|
||||
}
|
||||
|
||||
if ( opt.queue ) {
|
||||
jQuery.dequeue( this, opt.queue );
|
||||
}
|
||||
};
|
||||
|
||||
return opt;
|
||||
};
|
||||
|
||||
jQuery.easing = {
|
||||
linear: function( p ) {
|
||||
return p;
|
||||
},
|
||||
swing: function( p ) {
|
||||
return 0.5 - Math.cos( p*Math.PI ) / 2;
|
||||
}
|
||||
};
|
||||
|
||||
jQuery.timers = [];
|
||||
jQuery.fx = Tween.prototype.init;
|
||||
jQuery.fx.tick = function() {
|
||||
var timer,
|
||||
timers = jQuery.timers,
|
||||
i = 0;
|
||||
|
||||
fxNow = jQuery.now();
|
||||
|
||||
for ( ; i < timers.length; i++ ) {
|
||||
timer = timers[ i ];
|
||||
// Checks the timer has not already been removed
|
||||
if ( !timer() && timers[ i ] === timer ) {
|
||||
timers.splice( i--, 1 );
|
||||
}
|
||||
}
|
||||
|
||||
if ( !timers.length ) {
|
||||
jQuery.fx.stop();
|
||||
}
|
||||
fxNow = undefined;
|
||||
};
|
||||
|
||||
jQuery.fx.timer = function( timer ) {
|
||||
if ( timer() && jQuery.timers.push( timer ) ) {
|
||||
jQuery.fx.start();
|
||||
}
|
||||
};
|
||||
|
||||
jQuery.fx.interval = 13;
|
||||
|
||||
jQuery.fx.start = function() {
|
||||
if ( !timerId ) {
|
||||
timerId = setInterval( jQuery.fx.tick, jQuery.fx.interval );
|
||||
}
|
||||
};
|
||||
|
||||
jQuery.fx.stop = function() {
|
||||
clearInterval( timerId );
|
||||
timerId = null;
|
||||
};
|
||||
|
||||
jQuery.fx.speeds = {
|
||||
slow: 600,
|
||||
fast: 200,
|
||||
// Default speed
|
||||
_default: 400
|
||||
};
|
||||
|
||||
// Back Compat <1.8 extension point
|
||||
jQuery.fx.step = {};
|
||||
|
||||
if ( jQuery.expr && jQuery.expr.filters ) {
|
||||
jQuery.expr.filters.animated = function( elem ) {
|
||||
return jQuery.grep(jQuery.timers, function( fn ) {
|
||||
return elem === fn.elem;
|
||||
}).length;
|
||||
};
|
||||
}
|
||||
15
www/lib/jQuery/src/event-alias.js
Normal file
15
www/lib/jQuery/src/event-alias.js
Normal file
@@ -0,0 +1,15 @@
|
||||
jQuery.each( ("blur focus focusin focusout load resize scroll unload click dblclick " +
|
||||
"mousedown mouseup mousemove mouseover mouseout mouseenter mouseleave " +
|
||||
"change select submit keydown keypress keyup error contextmenu").split(" "), function( i, name ) {
|
||||
|
||||
// Handle event binding
|
||||
jQuery.fn[ name ] = function( data, fn ) {
|
||||
return arguments.length > 0 ?
|
||||
this.on( name, null, data, fn ) :
|
||||
this.trigger( name );
|
||||
};
|
||||
});
|
||||
|
||||
jQuery.fn.hover = function( fnOver, fnOut ) {
|
||||
return this.mouseenter( fnOver ).mouseleave( fnOut || fnOver );
|
||||
};
|
||||
991
www/lib/jQuery/src/event.js
Normal file
991
www/lib/jQuery/src/event.js
Normal file
@@ -0,0 +1,991 @@
|
||||
var rformElems = /^(?:input|select|textarea)$/i,
|
||||
rkeyEvent = /^key/,
|
||||
rmouseEvent = /^(?:mouse|contextmenu)|click/,
|
||||
rfocusMorph = /^(?:focusinfocus|focusoutblur)$/,
|
||||
rtypenamespace = /^([^.]*)(?:\.(.+)|)$/;
|
||||
|
||||
function returnTrue() {
|
||||
return true;
|
||||
}
|
||||
|
||||
function returnFalse() {
|
||||
return false;
|
||||
}
|
||||
|
||||
/*
|
||||
* 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 tmp, events, t, handleObjIn,
|
||||
special, eventHandle, handleObj,
|
||||
handlers, type, namespaces, origType,
|
||||
elemData = jQuery._data( 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
|
||||
// jQuery(...).bind("mouseover mouseout", fn);
|
||||
types = ( types || "" ).match( core_rnotwhite ) || [""];
|
||||
t = types.length;
|
||||
while ( t-- ) {
|
||||
tmp = rtypenamespace.exec( types[t] ) || [];
|
||||
type = origType = tmp[1];
|
||||
namespaces = ( tmp[2] || "" ).split( "." ).sort();
|
||||
|
||||
// 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/attachEvent if the special events handler returns false
|
||||
if ( !special.setup || special.setup.call( elem, data, namespaces, eventHandle ) === false ) {
|
||||
// Bind the global event handler to the element
|
||||
if ( elem.addEventListener ) {
|
||||
elem.addEventListener( type, eventHandle, false );
|
||||
|
||||
} else if ( elem.attachEvent ) {
|
||||
elem.attachEvent( "on" + type, eventHandle );
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
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, handleObj, tmp,
|
||||
origCount, t, events,
|
||||
special, handlers, type,
|
||||
namespaces, origType,
|
||||
elemData = jQuery.hasData( elem ) && jQuery._data( 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;
|
||||
|
||||
// removeData also checks for emptiness and clears the expando if empty
|
||||
// so use it instead of delete
|
||||
jQuery._removeData( elem, "events" );
|
||||
}
|
||||
},
|
||||
|
||||
trigger: function( event, data, elem, onlyHandlers ) {
|
||||
var handle, ontype, cur,
|
||||
bubbleType, special, tmp, i,
|
||||
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 );
|
||||
|
||||
event.isTrigger = true;
|
||||
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 = ( jQuery._data( cur, "events" ) || {} )[ event.type ] && jQuery._data( 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( elem.ownerDocument, data ) === false) &&
|
||||
!(type === "click" && jQuery.nodeName( elem, "a" )) && jQuery.acceptData( elem ) ) {
|
||||
|
||||
// Call a native DOM method on the target with the same name name as the event.
|
||||
// Can't use an .isFunction() check here because IE6/7 fails that test.
|
||||
// Don't do default actions on window, that's where global variables be (#6170)
|
||||
if ( ontype && 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;
|
||||
try {
|
||||
elem[ type ]();
|
||||
} catch ( e ) {
|
||||
// IE<9 dies on focus/blur to hidden element (#1486,#12518)
|
||||
// only reproducible on winXP IE8 native, not IE9 in IE8 mode
|
||||
}
|
||||
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, ret, handleObj, matched, j,
|
||||
handlerQueue = [],
|
||||
args = core_slice.call( arguments ),
|
||||
handlers = ( jQuery._data( 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 sel, handleObj, matches, i,
|
||||
handlerQueue = [],
|
||||
delegateCount = handlers.delegateCount,
|
||||
cur = event.target;
|
||||
|
||||
// Find delegate handlers
|
||||
// Black-hole SVG <use> 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 check non-elements (#13208)
|
||||
// Don't process clicks on disabled elements (#6911, #8165, #11382, #11764)
|
||||
if ( cur.nodeType === 1 && (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;
|
||||
},
|
||||
|
||||
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: IE<9
|
||||
// Fix target property (#1925)
|
||||
if ( !event.target ) {
|
||||
event.target = originalEvent.srcElement || document;
|
||||
}
|
||||
|
||||
// Support: Chrome 23+, Safari?
|
||||
// Target should not be a text node (#504, #13143)
|
||||
if ( event.target.nodeType === 3 ) {
|
||||
event.target = event.target.parentNode;
|
||||
}
|
||||
|
||||
// Support: IE<9
|
||||
// For mouse/key events, metaKey==false if it's undefined (#3368, #11328)
|
||||
event.metaKey = !!event.metaKey;
|
||||
|
||||
return fixHook.filter ? fixHook.filter( event, originalEvent ) : event;
|
||||
},
|
||||
|
||||
// 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 fromElement offsetX offsetY pageX pageY screenX screenY toElement".split(" "),
|
||||
filter: function( event, original ) {
|
||||
var body, eventDoc, doc,
|
||||
button = original.button,
|
||||
fromElement = original.fromElement;
|
||||
|
||||
// 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 relatedTarget, if necessary
|
||||
if ( !event.relatedTarget && fromElement ) {
|
||||
event.relatedTarget = fromElement === event.target ? original.toElement : fromElement;
|
||||
}
|
||||
|
||||
// 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;
|
||||
}
|
||||
},
|
||||
|
||||
special: {
|
||||
load: {
|
||||
// Prevent triggered image.load events from bubbling to window.load
|
||||
noBubble: true
|
||||
},
|
||||
click: {
|
||||
// For checkbox, fire native event so checked state will be right
|
||||
trigger: function() {
|
||||
if ( jQuery.nodeName( this, "input" ) && this.type === "checkbox" && this.click ) {
|
||||
this.click();
|
||||
return false;
|
||||
}
|
||||
}
|
||||
},
|
||||
focus: {
|
||||
// Fire native event if possible so blur/focus sequence is correct
|
||||
trigger: function() {
|
||||
if ( this !== document.activeElement && this.focus ) {
|
||||
try {
|
||||
this.focus();
|
||||
return false;
|
||||
} catch ( e ) {
|
||||
// Support: IE<9
|
||||
// If we error on focus to hidden element (#1486, #12518),
|
||||
// let .trigger() run the handlers
|
||||
}
|
||||
}
|
||||
},
|
||||
delegateType: "focusin"
|
||||
},
|
||||
blur: {
|
||||
trigger: function() {
|
||||
if ( this === document.activeElement && this.blur ) {
|
||||
this.blur();
|
||||
return false;
|
||||
}
|
||||
},
|
||||
delegateType: "focusout"
|
||||
},
|
||||
|
||||
beforeunload: {
|
||||
postDispatch: function( event ) {
|
||||
|
||||
// Even when returnValue equals to undefined Firefox will still show alert
|
||||
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 = document.removeEventListener ?
|
||||
function( elem, type, handle ) {
|
||||
if ( elem.removeEventListener ) {
|
||||
elem.removeEventListener( type, handle, false );
|
||||
}
|
||||
} :
|
||||
function( elem, type, handle ) {
|
||||
var name = "on" + type;
|
||||
|
||||
if ( elem.detachEvent ) {
|
||||
|
||||
// #8545, #7054, preventing memory leaks for custom events in IE6-8
|
||||
// detachEvent needed property on element, by name of that event, to properly expose it to GC
|
||||
if ( typeof elem[ name ] === core_strundefined ) {
|
||||
elem[ name ] = null;
|
||||
}
|
||||
|
||||
elem.detachEvent( name, handle );
|
||||
}
|
||||
};
|
||||
|
||||
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.returnValue === false ||
|
||||
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 ) {
|
||||
return;
|
||||
}
|
||||
|
||||
// If preventDefault exists, run it on the original event
|
||||
if ( e.preventDefault ) {
|
||||
e.preventDefault();
|
||||
|
||||
// Support: IE
|
||||
// Otherwise set the returnValue property of the original event to false
|
||||
} else {
|
||||
e.returnValue = false;
|
||||
}
|
||||
},
|
||||
stopPropagation: function() {
|
||||
var e = this.originalEvent;
|
||||
|
||||
this.isPropagationStopped = returnTrue;
|
||||
if ( !e ) {
|
||||
return;
|
||||
}
|
||||
// If stopPropagation exists, run it on the original event
|
||||
if ( e.stopPropagation ) {
|
||||
e.stopPropagation();
|
||||
}
|
||||
|
||||
// Support: IE
|
||||
// Set the cancelBubble property of the original event to true
|
||||
e.cancelBubble = true;
|
||||
},
|
||||
stopImmediatePropagation: function() {
|
||||
this.isImmediatePropagationStopped = returnTrue;
|
||||
this.stopPropagation();
|
||||
}
|
||||
};
|
||||
|
||||
// Create mouseenter/leave events using mouseover/out and event-time checks
|
||||
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;
|
||||
}
|
||||
};
|
||||
});
|
||||
|
||||
// IE submit delegation
|
||||
if ( !jQuery.support.submitBubbles ) {
|
||||
|
||||
jQuery.event.special.submit = {
|
||||
setup: function() {
|
||||
// Only need this for delegated form submit events
|
||||
if ( jQuery.nodeName( this, "form" ) ) {
|
||||
return false;
|
||||
}
|
||||
|
||||
// Lazy-add a submit handler when a descendant form may potentially be submitted
|
||||
jQuery.event.add( this, "click._submit keypress._submit", function( e ) {
|
||||
// Node name check avoids a VML-related crash in IE (#9807)
|
||||
var elem = e.target,
|
||||
form = jQuery.nodeName( elem, "input" ) || jQuery.nodeName( elem, "button" ) ? elem.form : undefined;
|
||||
if ( form && !jQuery._data( form, "submitBubbles" ) ) {
|
||||
jQuery.event.add( form, "submit._submit", function( event ) {
|
||||
event._submit_bubble = true;
|
||||
});
|
||||
jQuery._data( form, "submitBubbles", true );
|
||||
}
|
||||
});
|
||||
// return undefined since we don't need an event listener
|
||||
},
|
||||
|
||||
postDispatch: function( event ) {
|
||||
// If form was submitted by the user, bubble the event up the tree
|
||||
if ( event._submit_bubble ) {
|
||||
delete event._submit_bubble;
|
||||
if ( this.parentNode && !event.isTrigger ) {
|
||||
jQuery.event.simulate( "submit", this.parentNode, event, true );
|
||||
}
|
||||
}
|
||||
},
|
||||
|
||||
teardown: function() {
|
||||
// Only need this for delegated form submit events
|
||||
if ( jQuery.nodeName( this, "form" ) ) {
|
||||
return false;
|
||||
}
|
||||
|
||||
// Remove delegated handlers; cleanData eventually reaps submit handlers attached above
|
||||
jQuery.event.remove( this, "._submit" );
|
||||
}
|
||||
};
|
||||
}
|
||||
|
||||
// IE change delegation and checkbox/radio fix
|
||||
if ( !jQuery.support.changeBubbles ) {
|
||||
|
||||
jQuery.event.special.change = {
|
||||
|
||||
setup: function() {
|
||||
|
||||
if ( rformElems.test( this.nodeName ) ) {
|
||||
// IE doesn't fire change on a check/radio until blur; trigger it on click
|
||||
// after a propertychange. Eat the blur-change in special.change.handle.
|
||||
// This still fires onchange a second time for check/radio after blur.
|
||||
if ( this.type === "checkbox" || this.type === "radio" ) {
|
||||
jQuery.event.add( this, "propertychange._change", function( event ) {
|
||||
if ( event.originalEvent.propertyName === "checked" ) {
|
||||
this._just_changed = true;
|
||||
}
|
||||
});
|
||||
jQuery.event.add( this, "click._change", function( event ) {
|
||||
if ( this._just_changed && !event.isTrigger ) {
|
||||
this._just_changed = false;
|
||||
}
|
||||
// Allow triggered, simulated change events (#11500)
|
||||
jQuery.event.simulate( "change", this, event, true );
|
||||
});
|
||||
}
|
||||
return false;
|
||||
}
|
||||
// Delegated event; lazy-add a change handler on descendant inputs
|
||||
jQuery.event.add( this, "beforeactivate._change", function( e ) {
|
||||
var elem = e.target;
|
||||
|
||||
if ( rformElems.test( elem.nodeName ) && !jQuery._data( elem, "changeBubbles" ) ) {
|
||||
jQuery.event.add( elem, "change._change", function( event ) {
|
||||
if ( this.parentNode && !event.isSimulated && !event.isTrigger ) {
|
||||
jQuery.event.simulate( "change", this.parentNode, event, true );
|
||||
}
|
||||
});
|
||||
jQuery._data( elem, "changeBubbles", true );
|
||||
}
|
||||
});
|
||||
},
|
||||
|
||||
handle: function( event ) {
|
||||
var elem = event.target;
|
||||
|
||||
// Swallow native change events from checkbox/radio, we already triggered them above
|
||||
if ( this !== elem || event.isSimulated || event.isTrigger || (elem.type !== "radio" && elem.type !== "checkbox") ) {
|
||||
return event.handleObj.handler.apply( this, arguments );
|
||||
}
|
||||
},
|
||||
|
||||
teardown: function() {
|
||||
jQuery.event.remove( this, "._change" );
|
||||
|
||||
return !rformElems.test( this.nodeName );
|
||||
}
|
||||
};
|
||||
}
|
||||
|
||||
// Create "bubbling" focus and blur events
|
||||
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 type, origFn;
|
||||
|
||||
// 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 );
|
||||
});
|
||||
},
|
||||
|
||||
bind: function( types, data, fn ) {
|
||||
return this.on( types, null, data, fn );
|
||||
},
|
||||
unbind: function( types, fn ) {
|
||||
return this.off( types, null, fn );
|
||||
},
|
||||
|
||||
delegate: function( selector, types, data, fn ) {
|
||||
return this.on( types, selector, data, fn );
|
||||
},
|
||||
undelegate: function( selector, types, fn ) {
|
||||
// ( namespace ) or ( selector, types [, fn] )
|
||||
return arguments.length === 1 ? this.off( selector, "**" ) : this.off( types, selector || "**", fn );
|
||||
},
|
||||
|
||||
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 );
|
||||
}
|
||||
}
|
||||
});
|
||||
18
www/lib/jQuery/src/exports.js
Normal file
18
www/lib/jQuery/src/exports.js
Normal file
@@ -0,0 +1,18 @@
|
||||
// Expose jQuery to the global object
|
||||
window.jQuery = window.$ = jQuery;
|
||||
|
||||
// Expose jQuery as an AMD module, but only for AMD loaders that
|
||||
// understand the issues with loading multiple versions of jQuery
|
||||
// in a page that all might call define(). The loader will indicate
|
||||
// they have special allowances for multiple jQuery versions by
|
||||
// specifying define.amd.jQuery = true. Register as a named module,
|
||||
// since jQuery can be concatenated with other files that may use define,
|
||||
// but not use a proper concatenation script that understands anonymous
|
||||
// AMD modules. A named AMD is safest and most robust way to register.
|
||||
// Lowercase jquery is used because AMD module names are derived from
|
||||
// file names, and jQuery is normally delivered in a lowercase file name.
|
||||
// Do this after creating the global so that if an AMD module wants to call
|
||||
// noConflict to hide this version of jQuery, it will work.
|
||||
if ( typeof define === "function" && define.amd && define.amd.jQuery ) {
|
||||
define( "jquery", [], function () { return jQuery; } );
|
||||
}
|
||||
20
www/lib/jQuery/src/intro.js
Normal file
20
www/lib/jQuery/src/intro.js
Normal file
@@ -0,0 +1,20 @@
|
||||
/*!
|
||||
* jQuery JavaScript Library v@VERSION
|
||||
* http://jquery.com/
|
||||
*
|
||||
* Includes Sizzle.js
|
||||
* http://sizzlejs.com/
|
||||
*
|
||||
* Copyright 2005, 2012 jQuery Foundation, Inc. and other contributors
|
||||
* Released under the MIT license
|
||||
* http://jquery.org/license
|
||||
*
|
||||
* Date: @DATE
|
||||
*/
|
||||
(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";
|
||||
796
www/lib/jQuery/src/manipulation.js
Normal file
796
www/lib/jQuery/src/manipulation.js
Normal file
@@ -0,0 +1,796 @@
|
||||
function createSafeFragment( document ) {
|
||||
var list = nodeNames.split( "|" ),
|
||||
safeFrag = document.createDocumentFragment();
|
||||
|
||||
if ( safeFrag.createElement ) {
|
||||
while ( list.length ) {
|
||||
safeFrag.createElement(
|
||||
list.pop()
|
||||
);
|
||||
}
|
||||
}
|
||||
return safeFrag;
|
||||
}
|
||||
|
||||
var nodeNames = "abbr|article|aside|audio|bdi|canvas|data|datalist|details|figcaption|figure|footer|" +
|
||||
"header|hgroup|mark|meter|nav|output|progress|section|summary|time|video",
|
||||
rinlinejQuery = / jQuery\d+="(?:null|\d+)"/g,
|
||||
rnoshimcache = new RegExp("<(?:" + nodeNames + ")[\\s/>]", "i"),
|
||||
rleadingWhitespace = /^\s+/,
|
||||
rxhtmlTag = /<(?!area|br|col|embed|hr|img|input|link|meta|param)(([\w:]+)[^>]*)\/>/gi,
|
||||
rtagName = /<([\w:]+)/,
|
||||
rtbody = /<tbody/i,
|
||||
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*<!(?:\[CDATA\[|--)|(?:\]\]|--)>\s*$/g,
|
||||
|
||||
// We have to close these tags to support XHTML (#13200)
|
||||
wrapMap = {
|
||||
option: [ 1, "<select multiple='multiple'>", "</select>" ],
|
||||
legend: [ 1, "<fieldset>", "</fieldset>" ],
|
||||
area: [ 1, "<map>", "</map>" ],
|
||||
param: [ 1, "<object>", "</object>" ],
|
||||
thead: [ 1, "<table>", "</table>" ],
|
||||
tr: [ 2, "<table><tbody>", "</tbody></table>" ],
|
||||
col: [ 2, "<table><tbody></tbody><colgroup>", "</colgroup></table>" ],
|
||||
td: [ 3, "<table><tbody><tr>", "</tr></tbody></table>" ],
|
||||
|
||||
// IE6-8 can't serialize link, script, style, or any html5 (NoScope) tags,
|
||||
// unless wrapped in a div with non-breaking characters in front of it.
|
||||
_default: jQuery.support.htmlSerialize ? [ 0, "", "" ] : [ 1, "X<div>", "</div>" ]
|
||||
},
|
||||
safeFragment = createSafeFragment( document ),
|
||||
fragmentDiv = safeFragment.appendChild( document.createElement("div") );
|
||||
|
||||
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 );
|
||||
},
|
||||
|
||||
wrapAll: function( html ) {
|
||||
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
|
||||
var 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.firstChild && elem.firstChild.nodeType === 1 ) {
|
||||
elem = elem.firstChild;
|
||||
}
|
||||
|
||||
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();
|
||||
},
|
||||
|
||||
append: function() {
|
||||
return this.domManip(arguments, true, function( elem ) {
|
||||
if ( this.nodeType === 1 || this.nodeType === 11 || this.nodeType === 9 ) {
|
||||
this.appendChild( elem );
|
||||
}
|
||||
});
|
||||
},
|
||||
|
||||
prepend: function() {
|
||||
return this.domManip(arguments, true, function( elem ) {
|
||||
if ( this.nodeType === 1 || this.nodeType === 11 || this.nodeType === 9 ) {
|
||||
this.insertBefore( elem, this.firstChild );
|
||||
}
|
||||
});
|
||||
},
|
||||
|
||||
before: function() {
|
||||
return this.domManip( arguments, false, function( elem ) {
|
||||
if ( this.parentNode ) {
|
||||
this.parentNode.insertBefore( elem, this );
|
||||
}
|
||||
});
|
||||
},
|
||||
|
||||
after: function() {
|
||||
return this.domManip( arguments, false, 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,
|
||||
i = 0;
|
||||
|
||||
for ( ; (elem = this[i]) != null; i++ ) {
|
||||
if ( !selector || jQuery.filter( selector, [ elem ] ).length > 0 ) {
|
||||
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++ ) {
|
||||
// Remove element nodes and prevent memory leaks
|
||||
if ( elem.nodeType === 1 ) {
|
||||
jQuery.cleanData( getAll( elem, false ) );
|
||||
}
|
||||
|
||||
// Remove any remaining nodes
|
||||
while ( elem.firstChild ) {
|
||||
elem.removeChild( elem.firstChild );
|
||||
}
|
||||
|
||||
// If this is a select, ensure that it displays empty (#12336)
|
||||
// Support: IE<9
|
||||
if ( elem.options && jQuery.nodeName( elem, "select" ) ) {
|
||||
elem.options.length = 0;
|
||||
}
|
||||
}
|
||||
|
||||
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 ) {
|
||||
return elem.nodeType === 1 ?
|
||||
elem.innerHTML.replace( rinlinejQuery, "" ) :
|
||||
undefined;
|
||||
}
|
||||
|
||||
// See if we can take a shortcut and just use innerHTML
|
||||
if ( typeof value === "string" && !rnoInnerhtml.test( value ) &&
|
||||
( jQuery.support.htmlSerialize || !rnoshimcache.test( value ) ) &&
|
||||
( jQuery.support.leadingWhitespace || !rleadingWhitespace.test( value ) ) &&
|
||||
!wrapMap[ ( rtagName.exec( value ) || ["", ""] )[1].toLowerCase() ] ) {
|
||||
|
||||
value = value.replace( rxhtmlTag, "<$1></$2>" );
|
||||
|
||||
try {
|
||||
for (; i < l; i++ ) {
|
||||
// Remove element nodes and prevent memory leaks
|
||||
elem = this[i] || {};
|
||||
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( value ) {
|
||||
var isFunc = jQuery.isFunction( value );
|
||||
|
||||
// Make sure that the elements are removed from the DOM before they are inserted
|
||||
// this can help fix replacing a parent with child elements
|
||||
if ( !isFunc && typeof value !== "string" ) {
|
||||
value = jQuery( value ).not( this ).detach();
|
||||
}
|
||||
|
||||
return this.domManip( [ value ], true, function( elem ) {
|
||||
var next = this.nextSibling,
|
||||
parent = this.parentNode;
|
||||
|
||||
if ( parent ) {
|
||||
jQuery( this ).remove();
|
||||
parent.insertBefore( elem, next );
|
||||
}
|
||||
});
|
||||
},
|
||||
|
||||
detach: function( selector ) {
|
||||
return this.remove( selector, true );
|
||||
},
|
||||
|
||||
domManip: function( args, table, callback ) {
|
||||
|
||||
// Flatten any nested arrays
|
||||
args = core_concat.apply( [], args );
|
||||
|
||||
var first, node, hasScripts,
|
||||
scripts, doc, fragment,
|
||||
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, table ? self.html() : undefined );
|
||||
}
|
||||
self.domManip( args, table, callback );
|
||||
});
|
||||
}
|
||||
|
||||
if ( l ) {
|
||||
fragment = jQuery.buildFragment( args, this[ 0 ].ownerDocument, false, this );
|
||||
first = fragment.firstChild;
|
||||
|
||||
if ( fragment.childNodes.length === 1 ) {
|
||||
fragment = first;
|
||||
}
|
||||
|
||||
if ( first ) {
|
||||
table = table && jQuery.nodeName( first, "tr" );
|
||||
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 ) {
|
||||
jQuery.merge( scripts, getAll( node, "script" ) );
|
||||
}
|
||||
}
|
||||
|
||||
callback.call(
|
||||
table && jQuery.nodeName( this[i], "table" ) ?
|
||||
findOrAppend( this[i], "tbody" ) :
|
||||
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 || "" ) &&
|
||||
!jQuery._data( node, "globalEval" ) && jQuery.contains( doc, node ) ) {
|
||||
|
||||
if ( node.src ) {
|
||||
// Hope ajax is available...
|
||||
jQuery.ajax({
|
||||
url: node.src,
|
||||
type: "GET",
|
||||
dataType: "script",
|
||||
async: false,
|
||||
global: false,
|
||||
"throws": true
|
||||
});
|
||||
} else {
|
||||
jQuery.globalEval( ( node.text || node.textContent || node.innerHTML || "" ).replace( rcleanScript, "" ) );
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// Fix #11809: Avoid leaking memory
|
||||
fragment = first = null;
|
||||
}
|
||||
}
|
||||
|
||||
return this;
|
||||
}
|
||||
});
|
||||
|
||||
function findOrAppend( elem, tag ) {
|
||||
return elem.getElementsByTagName( tag )[0] || elem.appendChild( elem.ownerDocument.createElement( tag ) );
|
||||
}
|
||||
|
||||
// Replace/restore the type attribute of script elements for safe DOM manipulation
|
||||
function disableScript( elem ) {
|
||||
var attr = elem.getAttributeNode("type");
|
||||
elem.type = ( attr && attr.specified ) + "/" + 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 elem,
|
||||
i = 0;
|
||||
for ( ; (elem = elems[i]) != null; i++ ) {
|
||||
jQuery._data( elem, "globalEval", !refElements || jQuery._data( refElements[i], "globalEval" ) );
|
||||
}
|
||||
}
|
||||
|
||||
function cloneCopyEvent( src, dest ) {
|
||||
|
||||
if ( dest.nodeType !== 1 || !jQuery.hasData( src ) ) {
|
||||
return;
|
||||
}
|
||||
|
||||
var type, i, l,
|
||||
oldData = jQuery._data( src ),
|
||||
curData = jQuery._data( dest, oldData ),
|
||||
events = oldData.events;
|
||||
|
||||
if ( events ) {
|
||||
delete curData.handle;
|
||||
curData.events = {};
|
||||
|
||||
for ( type in events ) {
|
||||
for ( i = 0, l = events[ type ].length; i < l; i++ ) {
|
||||
jQuery.event.add( dest, type, events[ type ][ i ] );
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// make the cloned public data object a copy from the original
|
||||
if ( curData.data ) {
|
||||
curData.data = jQuery.extend( {}, curData.data );
|
||||
}
|
||||
}
|
||||
|
||||
function fixCloneNodeIssues( src, dest ) {
|
||||
var nodeName, e, data;
|
||||
|
||||
// We do not need to do anything for non-Elements
|
||||
if ( dest.nodeType !== 1 ) {
|
||||
return;
|
||||
}
|
||||
|
||||
nodeName = dest.nodeName.toLowerCase();
|
||||
|
||||
// IE6-8 copies events bound via attachEvent when using cloneNode.
|
||||
if ( !jQuery.support.noCloneEvent && dest[ jQuery.expando ] ) {
|
||||
data = jQuery._data( dest );
|
||||
|
||||
for ( e in data.events ) {
|
||||
jQuery.removeEvent( dest, e, data.handle );
|
||||
}
|
||||
|
||||
// Event data gets referenced instead of copied if the expando gets copied too
|
||||
dest.removeAttribute( jQuery.expando );
|
||||
}
|
||||
|
||||
// IE blanks contents when cloning scripts, and tries to evaluate newly-set text
|
||||
if ( nodeName === "script" && dest.text !== src.text ) {
|
||||
disableScript( dest ).text = src.text;
|
||||
restoreScript( dest );
|
||||
|
||||
// IE6-10 improperly clones children of object elements using classid.
|
||||
// IE10 throws NoModificationAllowedError if parent is null, #12132.
|
||||
} else if ( nodeName === "object" ) {
|
||||
if ( dest.parentNode ) {
|
||||
dest.outerHTML = src.outerHTML;
|
||||
}
|
||||
|
||||
// This path appears unavoidable for IE9. When cloning an object
|
||||
// element in IE9, the outerHTML strategy above is not sufficient.
|
||||
// If the src has innerHTML and the destination does not,
|
||||
// copy the src.innerHTML into the dest.innerHTML. #10324
|
||||
if ( jQuery.support.html5Clone && ( src.innerHTML && !jQuery.trim(dest.innerHTML) ) ) {
|
||||
dest.innerHTML = src.innerHTML;
|
||||
}
|
||||
|
||||
} else if ( nodeName === "input" && manipulation_rcheckableType.test( src.type ) ) {
|
||||
// IE6-8 fails to persist the checked state of a cloned checkbox
|
||||
// or radio button. Worse, IE6-7 fail to give the cloned element
|
||||
// a checked appearance if the defaultChecked value isn't also set
|
||||
|
||||
dest.defaultChecked = dest.checked = src.checked;
|
||||
|
||||
// IE6-7 get confused and end up setting the value of a cloned
|
||||
// checkbox/radio button to an empty string instead of "on"
|
||||
if ( dest.value !== src.value ) {
|
||||
dest.value = src.value;
|
||||
}
|
||||
|
||||
// IE6-8 fails to return the selected option to the default selected
|
||||
// state when cloning options
|
||||
} else if ( nodeName === "option" ) {
|
||||
dest.defaultSelected = dest.selected = src.defaultSelected;
|
||||
|
||||
// IE6-8 fails to set the defaultValue to the correct value when
|
||||
// cloning other types of input fields
|
||||
} else if ( nodeName === "input" || nodeName === "textarea" ) {
|
||||
dest.defaultValue = src.defaultValue;
|
||||
}
|
||||
}
|
||||
|
||||
jQuery.each({
|
||||
appendTo: "append",
|
||||
prependTo: "prepend",
|
||||
insertBefore: "before",
|
||||
insertAfter: "after",
|
||||
replaceAll: "replaceWith"
|
||||
}, function( name, original ) {
|
||||
jQuery.fn[ name ] = function( selector ) {
|
||||
var elems,
|
||||
i = 0,
|
||||
ret = [],
|
||||
insert = jQuery( selector ),
|
||||
last = insert.length - 1;
|
||||
|
||||
for ( ; i <= last; i++ ) {
|
||||
elems = i === last ? this : this.clone(true);
|
||||
jQuery( insert[i] )[ original ]( elems );
|
||||
|
||||
// Modern browsers can apply jQuery collections as arrays, but oldIE needs a .get()
|
||||
core_push.apply( ret, elems.get() );
|
||||
}
|
||||
|
||||
return this.pushStack( ret );
|
||||
};
|
||||
});
|
||||
|
||||
function getAll( context, tag ) {
|
||||
var elems, elem,
|
||||
i = 0,
|
||||
found = typeof context.getElementsByTagName !== core_strundefined ? context.getElementsByTagName( tag || "*" ) :
|
||||
typeof context.querySelectorAll !== core_strundefined ? context.querySelectorAll( tag || "*" ) :
|
||||
undefined;
|
||||
|
||||
if ( !found ) {
|
||||
for ( found = [], elems = context.childNodes || context; (elem = elems[i]) != null; i++ ) {
|
||||
if ( !tag || jQuery.nodeName( elem, tag ) ) {
|
||||
found.push( elem );
|
||||
} else {
|
||||
jQuery.merge( found, getAll( elem, tag ) );
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return tag === undefined || tag && jQuery.nodeName( context, tag ) ?
|
||||
jQuery.merge( [ context ], found ) :
|
||||
found;
|
||||
}
|
||||
|
||||
// Used in buildFragment, fixes the defaultChecked property
|
||||
function fixDefaultChecked( elem ) {
|
||||
if ( manipulation_rcheckableType.test( elem.type ) ) {
|
||||
elem.defaultChecked = elem.checked;
|
||||
}
|
||||
}
|
||||
|
||||
jQuery.extend({
|
||||
clone: function( elem, dataAndEvents, deepDataAndEvents ) {
|
||||
var destElements, node, clone, i, srcElements,
|
||||
inPage = jQuery.contains( elem.ownerDocument, elem );
|
||||
|
||||
if ( jQuery.support.html5Clone || jQuery.isXMLDoc(elem) || !rnoshimcache.test( "<" + elem.nodeName + ">" ) ) {
|
||||
clone = elem.cloneNode( true );
|
||||
|
||||
// IE<=8 does not properly clone detached, unknown element nodes
|
||||
} else {
|
||||
fragmentDiv.innerHTML = elem.outerHTML;
|
||||
fragmentDiv.removeChild( clone = fragmentDiv.firstChild );
|
||||
}
|
||||
|
||||
if ( (!jQuery.support.noCloneEvent || !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 );
|
||||
|
||||
// Fix all IE cloning issues
|
||||
for ( i = 0; (node = srcElements[i]) != null; ++i ) {
|
||||
// Ensure that the destination node is not null; Fixes #9587
|
||||
if ( destElements[i] ) {
|
||||
fixCloneNodeIssues( node, 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; (node = srcElements[i]) != null; i++ ) {
|
||||
cloneCopyEvent( node, destElements[i] );
|
||||
}
|
||||
} else {
|
||||
cloneCopyEvent( elem, clone );
|
||||
}
|
||||
}
|
||||
|
||||
// Preserve script evaluation history
|
||||
destElements = getAll( clone, "script" );
|
||||
if ( destElements.length > 0 ) {
|
||||
setGlobalEval( destElements, !inPage && getAll( elem, "script" ) );
|
||||
}
|
||||
|
||||
destElements = srcElements = node = null;
|
||||
|
||||
// Return the cloned set
|
||||
return clone;
|
||||
},
|
||||
|
||||
buildFragment: function( elems, context, scripts, selection ) {
|
||||
var j, elem, contains,
|
||||
tmp, tag, tbody, wrap,
|
||||
l = elems.length,
|
||||
|
||||
// Ensure a safe fragment
|
||||
safe = createSafeFragment( context ),
|
||||
|
||||
nodes = [],
|
||||
i = 0;
|
||||
|
||||
for ( ; i < l; i++ ) {
|
||||
elem = elems[ i ];
|
||||
|
||||
if ( elem || elem === 0 ) {
|
||||
|
||||
// Add nodes directly
|
||||
if ( jQuery.type( elem ) === "object" ) {
|
||||
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 || safe.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></$2>" ) + wrap[2];
|
||||
|
||||
// Descend through wrappers to the right content
|
||||
j = wrap[0];
|
||||
while ( j-- ) {
|
||||
tmp = tmp.lastChild;
|
||||
}
|
||||
|
||||
// Manually add leading whitespace removed by IE
|
||||
if ( !jQuery.support.leadingWhitespace && rleadingWhitespace.test( elem ) ) {
|
||||
nodes.push( context.createTextNode( rleadingWhitespace.exec( elem )[0] ) );
|
||||
}
|
||||
|
||||
// Remove IE's autoinserted <tbody> from table fragments
|
||||
if ( !jQuery.support.tbody ) {
|
||||
|
||||
// String was a <table>, *may* have spurious <tbody>
|
||||
elem = tag === "table" && !rtbody.test( elem ) ?
|
||||
tmp.firstChild :
|
||||
|
||||
// String was a bare <thead> or <tfoot>
|
||||
wrap[1] === "<table>" && !rtbody.test( elem ) ?
|
||||
tmp :
|
||||
0;
|
||||
|
||||
j = elem && elem.childNodes.length;
|
||||
while ( j-- ) {
|
||||
if ( jQuery.nodeName( (tbody = elem.childNodes[j]), "tbody" ) && !tbody.childNodes.length ) {
|
||||
elem.removeChild( tbody );
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
jQuery.merge( nodes, tmp.childNodes );
|
||||
|
||||
// Fix #12392 for WebKit and IE > 9
|
||||
tmp.textContent = "";
|
||||
|
||||
// Fix #12392 for oldIE
|
||||
while ( tmp.firstChild ) {
|
||||
tmp.removeChild( tmp.firstChild );
|
||||
}
|
||||
|
||||
// Remember the top-level container for proper cleanup
|
||||
tmp = safe.lastChild;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// Fix #11356: Clear elements from fragment
|
||||
if ( tmp ) {
|
||||
safe.removeChild( tmp );
|
||||
}
|
||||
|
||||
// Reset defaultChecked for any radios and checkboxes
|
||||
// about to be appended to the DOM in IE 6/7 (#8060)
|
||||
if ( !jQuery.support.appendChecked ) {
|
||||
jQuery.grep( getAll( nodes, "input" ), fixDefaultChecked );
|
||||
}
|
||||
|
||||
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( safe.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 );
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
tmp = null;
|
||||
|
||||
return safe;
|
||||
},
|
||||
|
||||
cleanData: function( elems, /* internal */ acceptData ) {
|
||||
var elem, type, id, data,
|
||||
i = 0,
|
||||
internalKey = jQuery.expando,
|
||||
cache = jQuery.cache,
|
||||
deleteExpando = jQuery.support.deleteExpando,
|
||||
special = jQuery.event.special;
|
||||
|
||||
for ( ; (elem = elems[i]) != null; i++ ) {
|
||||
|
||||
if ( acceptData || jQuery.acceptData( elem ) ) {
|
||||
|
||||
id = elem[ internalKey ];
|
||||
data = id && cache[ id ];
|
||||
|
||||
if ( data ) {
|
||||
if ( data.events ) {
|
||||
for ( type in data.events ) {
|
||||
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 );
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// Remove cache only if it was not already removed by jQuery.event.remove
|
||||
if ( cache[ id ] ) {
|
||||
|
||||
delete cache[ id ];
|
||||
|
||||
// IE does not allow us to delete expando properties from nodes,
|
||||
// nor does it have a removeAttribute function on Document nodes;
|
||||
// we must handle all of these cases
|
||||
if ( deleteExpando ) {
|
||||
delete elem[ internalKey ];
|
||||
|
||||
} else if ( typeof elem.removeAttribute !== core_strundefined ) {
|
||||
elem.removeAttribute( internalKey );
|
||||
|
||||
} else {
|
||||
elem[ internalKey ] = null;
|
||||
}
|
||||
|
||||
core_deletedIds.push( id );
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
});
|
||||
169
www/lib/jQuery/src/offset.js
Normal file
169
www/lib/jQuery/src/offset.js
Normal file
@@ -0,0 +1,169 @@
|
||||
jQuery.fn.offset = function( options ) {
|
||||
if ( arguments.length ) {
|
||||
return options === undefined ?
|
||||
this :
|
||||
this.each(function( i ) {
|
||||
jQuery.offset.setOffset( this, options, i );
|
||||
});
|
||||
}
|
||||
|
||||
var docElem, win,
|
||||
box = { top: 0, left: 0 },
|
||||
elem = this[ 0 ],
|
||||
doc = elem && elem.ownerDocument;
|
||||
|
||||
if ( !doc ) {
|
||||
return;
|
||||
}
|
||||
|
||||
docElem = doc.documentElement;
|
||||
|
||||
// Make sure it's not a disconnected DOM node
|
||||
if ( !jQuery.contains( docElem, elem ) ) {
|
||||
return box;
|
||||
}
|
||||
|
||||
// If we don't have gBCR, just use 0,0 rather than error
|
||||
// BlackBerry 5, iOS 3 (original iPhone)
|
||||
if ( typeof elem.getBoundingClientRect !== core_strundefined ) {
|
||||
box = elem.getBoundingClientRect();
|
||||
}
|
||||
win = getWindow( doc );
|
||||
return {
|
||||
top: box.top + ( win.pageYOffset || docElem.scrollTop ) - ( docElem.clientTop || 0 ),
|
||||
left: box.left + ( win.pageXOffset || docElem.scrollLeft ) - ( docElem.clientLeft || 0 )
|
||||
};
|
||||
};
|
||||
|
||||
jQuery.offset = {
|
||||
|
||||
setOffset: function( elem, options, i ) {
|
||||
var position = jQuery.css( elem, "position" );
|
||||
|
||||
// set position first, in-case top/left are set even on static elem
|
||||
if ( position === "static" ) {
|
||||
elem.style.position = "relative";
|
||||
}
|
||||
|
||||
var curElem = jQuery( elem ),
|
||||
curOffset = curElem.offset(),
|
||||
curCSSTop = jQuery.css( elem, "top" ),
|
||||
curCSSLeft = jQuery.css( elem, "left" ),
|
||||
calculatePosition = ( position === "absolute" || position === "fixed" ) && jQuery.inArray("auto", [curCSSTop, curCSSLeft]) > -1,
|
||||
props = {}, curPosition = {}, curTop, curLeft;
|
||||
|
||||
// need to be able to calculate position if either top or left is auto and position is either absolute or fixed
|
||||
if ( calculatePosition ) {
|
||||
curPosition = curElem.position();
|
||||
curTop = curPosition.top;
|
||||
curLeft = curPosition.left;
|
||||
} else {
|
||||
curTop = parseFloat( curCSSTop ) || 0;
|
||||
curLeft = parseFloat( curCSSLeft ) || 0;
|
||||
}
|
||||
|
||||
if ( jQuery.isFunction( options ) ) {
|
||||
options = options.call( elem, i, curOffset );
|
||||
}
|
||||
|
||||
if ( options.top != null ) {
|
||||
props.top = ( options.top - curOffset.top ) + curTop;
|
||||
}
|
||||
if ( options.left != null ) {
|
||||
props.left = ( options.left - curOffset.left ) + curLeft;
|
||||
}
|
||||
|
||||
if ( "using" in options ) {
|
||||
options.using.call( elem, props );
|
||||
} else {
|
||||
curElem.css( props );
|
||||
}
|
||||
}
|
||||
};
|
||||
|
||||
|
||||
jQuery.fn.extend({
|
||||
|
||||
position: function() {
|
||||
if ( !this[ 0 ] ) {
|
||||
return;
|
||||
}
|
||||
|
||||
var offsetParent, offset,
|
||||
parentOffset = { top: 0, left: 0 },
|
||||
elem = this[ 0 ];
|
||||
|
||||
// fixed elements are offset from window (parentOffset = {top:0, left: 0}, because it is it's only offset parent
|
||||
if ( jQuery.css( elem, "position" ) === "fixed" ) {
|
||||
// we assume that getBoundingClientRect is available when computed position is fixed
|
||||
offset = elem.getBoundingClientRect();
|
||||
} else {
|
||||
// Get *real* offsetParent
|
||||
offsetParent = this.offsetParent();
|
||||
|
||||
// Get correct offsets
|
||||
offset = this.offset();
|
||||
if ( !jQuery.nodeName( offsetParent[ 0 ], "html" ) ) {
|
||||
parentOffset = offsetParent.offset();
|
||||
}
|
||||
|
||||
// Add offsetParent borders
|
||||
parentOffset.top += jQuery.css( offsetParent[ 0 ], "borderTopWidth", true );
|
||||
parentOffset.left += jQuery.css( offsetParent[ 0 ], "borderLeftWidth", true );
|
||||
}
|
||||
|
||||
// Subtract parent offsets and element margins
|
||||
// note: when an element has margin: auto the offsetLeft and marginLeft
|
||||
// are the same in Safari causing offset.left to incorrectly be 0
|
||||
return {
|
||||
top: offset.top - parentOffset.top - jQuery.css( elem, "marginTop", true ),
|
||||
left: offset.left - parentOffset.left - jQuery.css( elem, "marginLeft", true)
|
||||
};
|
||||
},
|
||||
|
||||
offsetParent: function() {
|
||||
return this.map(function() {
|
||||
var offsetParent = this.offsetParent || document.documentElement;
|
||||
while ( offsetParent && ( !jQuery.nodeName( offsetParent, "html" ) && jQuery.css( offsetParent, "position") === "static" ) ) {
|
||||
offsetParent = offsetParent.offsetParent;
|
||||
}
|
||||
return offsetParent || document.documentElement;
|
||||
});
|
||||
}
|
||||
});
|
||||
|
||||
|
||||
// Create scrollLeft and scrollTop methods
|
||||
jQuery.each( {scrollLeft: "pageXOffset", scrollTop: "pageYOffset"}, function( method, prop ) {
|
||||
var top = /Y/.test( prop );
|
||||
|
||||
jQuery.fn[ method ] = function( val ) {
|
||||
return jQuery.access( this, function( elem, method, val ) {
|
||||
var win = getWindow( elem );
|
||||
|
||||
if ( val === undefined ) {
|
||||
return win ? (prop in win) ? win[ prop ] :
|
||||
win.document.documentElement[ method ] :
|
||||
elem[ method ];
|
||||
}
|
||||
|
||||
if ( win ) {
|
||||
win.scrollTo(
|
||||
!top ? val : jQuery( win ).scrollLeft(),
|
||||
top ? val : jQuery( win ).scrollTop()
|
||||
);
|
||||
|
||||
} else {
|
||||
elem[ method ] = val;
|
||||
}
|
||||
}, method, val, arguments.length, null );
|
||||
};
|
||||
});
|
||||
|
||||
function getWindow( elem ) {
|
||||
return jQuery.isWindow( elem ) ?
|
||||
elem :
|
||||
elem.nodeType === 9 ?
|
||||
elem.defaultView || elem.parentWindow :
|
||||
false;
|
||||
}
|
||||
2
www/lib/jQuery/src/outro.js
Normal file
2
www/lib/jQuery/src/outro.js
Normal file
@@ -0,0 +1,2 @@
|
||||
|
||||
})( window );
|
||||
147
www/lib/jQuery/src/queue.js
Normal file
147
www/lib/jQuery/src/queue.js
Normal file
@@ -0,0 +1,147 @@
|
||||
jQuery.extend({
|
||||
queue: function( elem, type, data ) {
|
||||
var queue;
|
||||
|
||||
if ( elem ) {
|
||||
type = ( type || "fx" ) + "queue";
|
||||
queue = jQuery._data( elem, type );
|
||||
|
||||
// Speed up dequeue by getting out quickly if this is just a lookup
|
||||
if ( data ) {
|
||||
if ( !queue || jQuery.isArray(data) ) {
|
||||
queue = jQuery._data( 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--;
|
||||
}
|
||||
|
||||
hooks.cur = fn;
|
||||
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 jQuery._data( elem, key ) || jQuery._data( elem, key, {
|
||||
empty: jQuery.Callbacks("once memory").add(function() {
|
||||
jQuery._removeData( elem, type + "queue" );
|
||||
jQuery._removeData( elem, 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 = jQuery._data( elements[ i ], type + "queueHooks" );
|
||||
if ( tmp && tmp.empty ) {
|
||||
count++;
|
||||
tmp.empty.add( resolve );
|
||||
}
|
||||
}
|
||||
resolve();
|
||||
return defer.promise( obj );
|
||||
}
|
||||
});
|
||||
99
www/lib/jQuery/src/serialize.js
Normal file
99
www/lib/jQuery/src/serialize.js
Normal file
@@ -0,0 +1,99 @@
|
||||
var r20 = /%20/g,
|
||||
rbracket = /\[\]$/,
|
||||
rCRLF = /\r?\n/g,
|
||||
rsubmitterTypes = /^(?:submit|button|image|reset|file)$/i,
|
||||
rsubmittable = /^(?:input|select|textarea|keygen)/i;
|
||||
|
||||
jQuery.fn.extend({
|
||||
serialize: function() {
|
||||
return jQuery.param( this.serializeArray() );
|
||||
},
|
||||
serializeArray: function() {
|
||||
return this.map(function(){
|
||||
// Can add propHook for "elements" to filter or add form elements
|
||||
var elements = jQuery.prop( this, "elements" );
|
||||
return elements ? jQuery.makeArray( elements ) : this;
|
||||
})
|
||||
.filter(function(){
|
||||
var type = this.type;
|
||||
// Use .is(":disabled") so that fieldset[disabled] works
|
||||
return this.name && !jQuery( this ).is( ":disabled" ) &&
|
||||
rsubmittable.test( this.nodeName ) && !rsubmitterTypes.test( type ) &&
|
||||
( this.checked || !manipulation_rcheckableType.test( type ) );
|
||||
})
|
||||
.map(function( i, elem ){
|
||||
var val = jQuery( this ).val();
|
||||
|
||||
return val == null ?
|
||||
null :
|
||||
jQuery.isArray( val ) ?
|
||||
jQuery.map( val, function( val ){
|
||||
return { name: elem.name, value: val.replace( rCRLF, "\r\n" ) };
|
||||
}) :
|
||||
{ name: elem.name, value: val.replace( rCRLF, "\r\n" ) };
|
||||
}).get();
|
||||
}
|
||||
});
|
||||
|
||||
//Serialize an array of form elements or a set of
|
||||
//key/values into a query string
|
||||
jQuery.param = function( a, traditional ) {
|
||||
var prefix,
|
||||
s = [],
|
||||
add = function( key, value ) {
|
||||
// If value is a function, invoke it and return its value
|
||||
value = jQuery.isFunction( value ) ? value() : ( value == null ? "" : value );
|
||||
s[ s.length ] = encodeURIComponent( key ) + "=" + encodeURIComponent( value );
|
||||
};
|
||||
|
||||
// Set traditional to true for jQuery <= 1.3.2 behavior.
|
||||
if ( traditional === undefined ) {
|
||||
traditional = jQuery.ajaxSettings && jQuery.ajaxSettings.traditional;
|
||||
}
|
||||
|
||||
// If an array was passed in, assume that it is an array of form elements.
|
||||
if ( jQuery.isArray( a ) || ( a.jquery && !jQuery.isPlainObject( a ) ) ) {
|
||||
// Serialize the form elements
|
||||
jQuery.each( a, function() {
|
||||
add( this.name, this.value );
|
||||
});
|
||||
|
||||
} else {
|
||||
// If traditional, encode the "old" way (the way 1.3.2 or older
|
||||
// did it), otherwise encode params recursively.
|
||||
for ( prefix in a ) {
|
||||
buildParams( prefix, a[ prefix ], traditional, add );
|
||||
}
|
||||
}
|
||||
|
||||
// Return the resulting serialization
|
||||
return s.join( "&" ).replace( r20, "+" );
|
||||
};
|
||||
|
||||
function buildParams( prefix, obj, traditional, add ) {
|
||||
var name;
|
||||
|
||||
if ( jQuery.isArray( obj ) ) {
|
||||
// Serialize array item.
|
||||
jQuery.each( obj, function( i, v ) {
|
||||
if ( traditional || rbracket.test( prefix ) ) {
|
||||
// Treat each array item as a scalar.
|
||||
add( prefix, v );
|
||||
|
||||
} else {
|
||||
// Item is non-scalar (array or object), encode its numeric index.
|
||||
buildParams( prefix + "[" + ( typeof v === "object" ? i : "" ) + "]", v, traditional, add );
|
||||
}
|
||||
});
|
||||
|
||||
} else if ( !traditional && jQuery.type( obj ) === "object" ) {
|
||||
// Serialize object item.
|
||||
for ( name in obj ) {
|
||||
buildParams( prefix + "[" + name + "]", obj[ name ], traditional, add );
|
||||
}
|
||||
|
||||
} else {
|
||||
// Serialize scalar item.
|
||||
add( prefix, obj );
|
||||
}
|
||||
}
|
||||
9
www/lib/jQuery/src/sizzle-jquery.js
Normal file
9
www/lib/jQuery/src/sizzle-jquery.js
Normal file
@@ -0,0 +1,9 @@
|
||||
// Override sizzle attribute retrieval
|
||||
Sizzle.attr = jQuery.attr;
|
||||
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;
|
||||
241
www/lib/jQuery/src/support.js
Normal file
241
www/lib/jQuery/src/support.js
Normal file
@@ -0,0 +1,241 @@
|
||||
jQuery.support = (function() {
|
||||
|
||||
var support, all, a,
|
||||
input, select, fragment,
|
||||
opt, eventName, isSupported, i,
|
||||
div = document.createElement("div");
|
||||
|
||||
// Setup
|
||||
div.setAttribute( "className", "t" );
|
||||
div.innerHTML = " <link/><table></table><a href='/a'>a</a><input type='checkbox'/>";
|
||||
|
||||
// Support tests won't run in some limited or non-browser environments
|
||||
all = div.getElementsByTagName("*");
|
||||
a = div.getElementsByTagName("a")[ 0 ];
|
||||
if ( !all || !a || !all.length ) {
|
||||
return {};
|
||||
}
|
||||
|
||||
// First batch of tests
|
||||
select = document.createElement("select");
|
||||
opt = select.appendChild( document.createElement("option") );
|
||||
input = div.getElementsByTagName("input")[ 0 ];
|
||||
|
||||
a.style.cssText = "top:1px;float:left;opacity:.5";
|
||||
support = {
|
||||
// Test setAttribute on camelCase class. If it works, we need attrFixes when doing get/setAttribute (ie6/7)
|
||||
getSetAttribute: div.className !== "t",
|
||||
|
||||
// IE strips leading whitespace when .innerHTML is used
|
||||
leadingWhitespace: div.firstChild.nodeType === 3,
|
||||
|
||||
// Make sure that tbody elements aren't automatically inserted
|
||||
// IE will insert them into empty tables
|
||||
tbody: !div.getElementsByTagName("tbody").length,
|
||||
|
||||
// Make sure that link elements get serialized correctly by innerHTML
|
||||
// This requires a wrapper element in IE
|
||||
htmlSerialize: !!div.getElementsByTagName("link").length,
|
||||
|
||||
// Get the style information from getAttribute
|
||||
// (IE uses .cssText instead)
|
||||
style: /top/.test( a.getAttribute("style") ),
|
||||
|
||||
// Make sure that URLs aren't manipulated
|
||||
// (IE normalizes it by default)
|
||||
hrefNormalized: a.getAttribute("href") === "/a",
|
||||
|
||||
// Make sure that element opacity exists
|
||||
// (IE uses filter instead)
|
||||
// Use a regex to work around a WebKit issue. See #5145
|
||||
opacity: /^0.5/.test( a.style.opacity ),
|
||||
|
||||
// Verify style float existence
|
||||
// (IE uses styleFloat instead of cssFloat)
|
||||
cssFloat: !!a.style.cssFloat,
|
||||
|
||||
// Check the default checkbox/radio value ("" on WebKit; "on" elsewhere)
|
||||
checkOn: !!input.value,
|
||||
|
||||
// Make sure that a selected-by-default option has a working selected property.
|
||||
// (WebKit defaults to false instead of true, IE too, if it's in an optgroup)
|
||||
optSelected: opt.selected,
|
||||
|
||||
// Tests for enctype support on a form (#6743)
|
||||
enctype: !!document.createElement("form").enctype,
|
||||
|
||||
// Makes sure cloning an html5 element does not cause problems
|
||||
// Where outerHTML is undefined, this still works
|
||||
html5Clone: document.createElement("nav").cloneNode( true ).outerHTML !== "<:nav></:nav>",
|
||||
|
||||
// jQuery.support.boxModel DEPRECATED in 1.8 since we don't support Quirks Mode
|
||||
boxModel: document.compatMode === "CSS1Compat",
|
||||
|
||||
// Will be defined later
|
||||
deleteExpando: true,
|
||||
noCloneEvent: true,
|
||||
inlineBlockNeedsLayout: false,
|
||||
shrinkWrapBlocks: false,
|
||||
reliableMarginRight: true,
|
||||
boxSizingReliable: true,
|
||||
pixelPosition: false
|
||||
};
|
||||
|
||||
// Make sure checked status is properly cloned
|
||||
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;
|
||||
|
||||
// Support: IE<9
|
||||
try {
|
||||
delete div.test;
|
||||
} catch( e ) {
|
||||
support.deleteExpando = false;
|
||||
}
|
||||
|
||||
// Check if we can trust getAttribute("value")
|
||||
input = document.createElement("input");
|
||||
input.setAttribute( "value", "" );
|
||||
support.input = input.getAttribute( "value" ) === "";
|
||||
|
||||
// Check if an input maintains its value after becoming a radio
|
||||
input.value = "t";
|
||||
input.setAttribute( "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 = document.createDocumentFragment();
|
||||
fragment.appendChild( input );
|
||||
|
||||
// Check if a disconnected checkbox will retain its checked
|
||||
// value of true after appended to the DOM (IE6/7)
|
||||
support.appendChecked = input.checked;
|
||||
|
||||
// WebKit doesn't clone checked state correctly in fragments
|
||||
support.checkClone = fragment.cloneNode( true ).cloneNode( true ).lastChild.checked;
|
||||
|
||||
// Support: IE<9
|
||||
// Opera does not clone events (and typeof div.attachEvent === undefined).
|
||||
// IE9-10 clones events bound via attachEvent, but they don't trigger with .click()
|
||||
if ( div.attachEvent ) {
|
||||
div.attachEvent( "onclick", function() {
|
||||
support.noCloneEvent = false;
|
||||
});
|
||||
|
||||
div.cloneNode( true ).click();
|
||||
}
|
||||
|
||||
// Support: IE<9 (lack submit/change bubble), Firefox 17+ (lack focusin event)
|
||||
// Beware of CSP restrictions (https://developer.mozilla.org/en/Security/CSP), test/csp.php
|
||||
for ( i in { submit: true, change: true, focusin: true }) {
|
||||
div.setAttribute( eventName = "on" + i, "t" );
|
||||
|
||||
support[ i + "Bubbles" ] = eventName in window || div.attributes[ eventName ].expando === false;
|
||||
}
|
||||
|
||||
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, tds,
|
||||
divReset = "padding:0;margin:0;border:0;display:block;box-sizing:content-box;-moz-box-sizing:content-box;-webkit-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";
|
||||
|
||||
body.appendChild( container ).appendChild( div );
|
||||
|
||||
// Support: IE8
|
||||
// Check if table cells still have offsetWidth/Height when they are set
|
||||
// to display:none and there are still other visible table cells in a
|
||||
// table row; if so, offsetWidth/Height are not reliable for use when
|
||||
// determining if an element has been hidden directly using
|
||||
// display:none (it is still safe to use offsets if a parent element is
|
||||
// hidden; don safety goggles and see bug #4512 for more information).
|
||||
div.innerHTML = "<table><tr><td></td><td>t</td></tr></table>";
|
||||
tds = div.getElementsByTagName("td");
|
||||
tds[ 0 ].style.cssText = "padding:0;margin:0;border:0;display:none";
|
||||
isSupported = ( tds[ 0 ].offsetHeight === 0 );
|
||||
|
||||
tds[ 0 ].style.display = "";
|
||||
tds[ 1 ].style.display = "none";
|
||||
|
||||
// Support: IE8
|
||||
// Check if empty table cells still have offsetWidth/Height
|
||||
support.reliableHiddenOffsets = isSupported && ( tds[ 0 ].offsetHeight === 0 );
|
||||
|
||||
// Check box-sizing and margin behavior
|
||||
div.innerHTML = "";
|
||||
div.style.cssText = "box-sizing:border-box;-moz-box-sizing:border-box;-webkit-box-sizing:border-box;padding:1px;border:1px;display:block;width:4px;margin-top:1%;position:absolute;top:1%;";
|
||||
support.boxSizing = ( div.offsetWidth === 4 );
|
||||
support.doesNotIncludeMarginInBodyOffset = ( body.offsetTop !== 1 );
|
||||
|
||||
// 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";
|
||||
|
||||
// Check if div with explicit width and no margin-right incorrectly
|
||||
// gets computed margin-right based on width of container. (#3333)
|
||||
// Fails in WebKit before Feb 2011 nightlies
|
||||
// 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 );
|
||||
}
|
||||
|
||||
if ( typeof div.style.zoom !== core_strundefined ) {
|
||||
// Support: IE<8
|
||||
// Check if natively block-level elements act like inline-block
|
||||
// elements when setting their display to 'inline' and giving
|
||||
// them layout
|
||||
div.innerHTML = "";
|
||||
div.style.cssText = divReset + "width:1px;padding:1px;display:inline;zoom:1";
|
||||
support.inlineBlockNeedsLayout = ( div.offsetWidth === 3 );
|
||||
|
||||
// Support: IE6
|
||||
// Check if elements with layout shrink-wrap their children
|
||||
div.style.display = "block";
|
||||
div.innerHTML = "<div></div>";
|
||||
div.firstChild.style.width = "5px";
|
||||
support.shrinkWrapBlocks = ( div.offsetWidth !== 3 );
|
||||
|
||||
if ( support.inlineBlockNeedsLayout ) {
|
||||
// Prevent IE 6 from affecting layout for positioned elements #11048
|
||||
// Prevent IE from shrinking the body in IE 7 mode #12869
|
||||
// Support: IE<8
|
||||
body.style.zoom = 1;
|
||||
}
|
||||
}
|
||||
|
||||
body.removeChild( container );
|
||||
|
||||
// Null elements to avoid leaks in IE
|
||||
container = div = tds = marginDiv = null;
|
||||
});
|
||||
|
||||
// Null elements to avoid leaks in IE
|
||||
all = select = fragment = opt = a = input = null;
|
||||
|
||||
return support;
|
||||
})();
|
||||
|
||||
275
www/lib/jQuery/src/traversing.js
Normal file
275
www/lib/jQuery/src/traversing.js
Normal file
@@ -0,0 +1,275 @@
|
||||
var runtil = /Until$/,
|
||||
rparentsprev = /^(?:parents|prev(?:Until|All))/,
|
||||
isSimple = /^.[^:#\[\.,]*$/,
|
||||
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,
|
||||
len = this.length;
|
||||
|
||||
if ( typeof selector !== "string" ) {
|
||||
self = this;
|
||||
return this.pushStack( jQuery( selector ).filter(function() {
|
||||
for ( i = 0; i < len; i++ ) {
|
||||
if ( jQuery.contains( self[ i ], this ) ) {
|
||||
return true;
|
||||
}
|
||||
}
|
||||
}) );
|
||||
}
|
||||
|
||||
ret = [];
|
||||
for ( i = 0; i < len; i++ ) {
|
||||
jQuery.find( selector, this[ 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;
|
||||
return ret;
|
||||
},
|
||||
|
||||
has: function( target ) {
|
||||
var i,
|
||||
targets = jQuery( target, this ),
|
||||
len = targets.length;
|
||||
|
||||
return this.filter(function() {
|
||||
for ( i = 0; i < len; i++ ) {
|
||||
if ( jQuery.contains( this, targets[i] ) ) {
|
||||
return true;
|
||||
}
|
||||
}
|
||||
});
|
||||
},
|
||||
|
||||
not: function( selector ) {
|
||||
return this.pushStack( winnow(this, selector, false) );
|
||||
},
|
||||
|
||||
filter: function( selector ) {
|
||||
return this.pushStack( winnow(this, selector, true) );
|
||||
},
|
||||
|
||||
is: function( selector ) {
|
||||
return !!selector && (
|
||||
typeof selector === "string" ?
|
||||
// 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".
|
||||
rneedsContext.test( selector ) ?
|
||||
jQuery( selector, this.context ).index( this[0] ) >= 0 :
|
||||
jQuery.filter( selector, this ).length > 0 :
|
||||
this.filter( selector ).length > 0 );
|
||||
},
|
||||
|
||||
closest: function( selectors, context ) {
|
||||
var cur,
|
||||
i = 0,
|
||||
l = this.length,
|
||||
ret = [],
|
||||
pos = rneedsContext.test( selectors ) || typeof selectors !== "string" ?
|
||||
jQuery( selectors, context || this.context ) :
|
||||
0;
|
||||
|
||||
for ( ; i < l; i++ ) {
|
||||
cur = this[i];
|
||||
|
||||
while ( cur && cur.ownerDocument && cur !== context && cur.nodeType !== 11 ) {
|
||||
if ( pos ? pos.index(cur) > -1 : jQuery.find.matchesSelector(cur, selectors) ) {
|
||||
ret.push( cur );
|
||||
break;
|
||||
}
|
||||
cur = cur.parentNode;
|
||||
}
|
||||
}
|
||||
|
||||
return this.pushStack( ret.length > 1 ? jQuery.unique( ret ) : ret );
|
||||
},
|
||||
|
||||
// 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 jQuery.inArray( this[0], jQuery( elem ) );
|
||||
}
|
||||
|
||||
// Locate the position of the desired element
|
||||
return jQuery.inArray(
|
||||
// If it receives a jQuery object, the first element is used
|
||||
elem.jquery ? elem[0] : elem, this );
|
||||
},
|
||||
|
||||
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)
|
||||
);
|
||||
}
|
||||
});
|
||||
|
||||
jQuery.fn.andSelf = jQuery.fn.addBack;
|
||||
|
||||
function sibling( cur, dir ) {
|
||||
do {
|
||||
cur = cur[ dir ];
|
||||
} while ( cur && 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 jQuery.nodeName( elem, "iframe" ) ?
|
||||
elem.contentDocument || elem.contentWindow.document :
|
||||
jQuery.merge( [], elem.childNodes );
|
||||
}
|
||||
}, function( name, fn ) {
|
||||
jQuery.fn[ name ] = function( until, selector ) {
|
||||
var ret = jQuery.map( this, fn, until );
|
||||
|
||||
if ( !runtil.test( name ) ) {
|
||||
selector = until;
|
||||
}
|
||||
|
||||
if ( selector && typeof selector === "string" ) {
|
||||
ret = jQuery.filter( selector, ret );
|
||||
}
|
||||
|
||||
ret = this.length > 1 && !guaranteedUnique[ name ] ? jQuery.unique( ret ) : ret;
|
||||
|
||||
if ( this.length > 1 && rparentsprev.test( name ) ) {
|
||||
ret = ret.reverse();
|
||||
}
|
||||
|
||||
return this.pushStack( ret );
|
||||
};
|
||||
});
|
||||
|
||||
jQuery.extend({
|
||||
filter: function( expr, elems, not ) {
|
||||
if ( not ) {
|
||||
expr = ":not(" + expr + ")";
|
||||
}
|
||||
|
||||
return elems.length === 1 ?
|
||||
jQuery.find.matchesSelector(elems[0], expr) ? [ elems[0] ] : [] :
|
||||
jQuery.find.matches(expr, elems);
|
||||
},
|
||||
|
||||
dir: function( elem, dir, until ) {
|
||||
var matched = [],
|
||||
cur = elem[ dir ];
|
||||
|
||||
while ( cur && cur.nodeType !== 9 && (until === undefined || cur.nodeType !== 1 || !jQuery( cur ).is( until )) ) {
|
||||
if ( cur.nodeType === 1 ) {
|
||||
matched.push( cur );
|
||||
}
|
||||
cur = cur[dir];
|
||||
}
|
||||
return matched;
|
||||
},
|
||||
|
||||
sibling: function( n, elem ) {
|
||||
var r = [];
|
||||
|
||||
for ( ; n; n = n.nextSibling ) {
|
||||
if ( n.nodeType === 1 && n !== elem ) {
|
||||
r.push( n );
|
||||
}
|
||||
}
|
||||
|
||||
return r;
|
||||
}
|
||||
});
|
||||
|
||||
// Implement the identical functionality for filter and not
|
||||
function winnow( elements, qualifier, keep ) {
|
||||
|
||||
// Can't pass null or undefined to indexOf in Firefox 4
|
||||
// Set to 0 to skip string check
|
||||
qualifier = qualifier || 0;
|
||||
|
||||
if ( jQuery.isFunction( qualifier ) ) {
|
||||
return jQuery.grep(elements, function( elem, i ) {
|
||||
var retVal = !!qualifier.call( elem, i, elem );
|
||||
return retVal === keep;
|
||||
});
|
||||
|
||||
} else if ( qualifier.nodeType ) {
|
||||
return jQuery.grep(elements, function( elem ) {
|
||||
return ( elem === qualifier ) === keep;
|
||||
});
|
||||
|
||||
} else if ( typeof qualifier === "string" ) {
|
||||
var filtered = jQuery.grep(elements, function( elem ) {
|
||||
return elem.nodeType === 1;
|
||||
});
|
||||
|
||||
if ( isSimple.test( qualifier ) ) {
|
||||
return jQuery.filter(qualifier, filtered, !keep);
|
||||
} else {
|
||||
qualifier = jQuery.filter( qualifier, filtered );
|
||||
}
|
||||
}
|
||||
|
||||
return jQuery.grep(elements, function( elem ) {
|
||||
return ( jQuery.inArray( elem, qualifier ) >= 0 ) === keep;
|
||||
});
|
||||
}
|
||||
3
www/lib/jQuery/test/.jshintignore
Normal file
3
www/lib/jQuery/test/.jshintignore
Normal file
@@ -0,0 +1,3 @@
|
||||
qunit/
|
||||
data/badjson.js
|
||||
data/jquery-1.8.2.ajax_xhr.min.js
|
||||
55
www/lib/jQuery/test/.jshintrc
Normal file
55
www/lib/jQuery/test/.jshintrc
Normal file
@@ -0,0 +1,55 @@
|
||||
{
|
||||
"curly": true,
|
||||
"expr": true,
|
||||
"quotmark": "double",
|
||||
"trailing": true,
|
||||
"undef": true,
|
||||
"maxerr": 100,
|
||||
|
||||
"eqnull": true,
|
||||
"evil": true,
|
||||
"smarttabs": true,
|
||||
"sub": true,
|
||||
|
||||
"browser": true,
|
||||
"devel": true,
|
||||
"wsh": true,
|
||||
|
||||
"predef": [
|
||||
"DOMParser",
|
||||
"jQuery",
|
||||
"QUnit",
|
||||
"module",
|
||||
"ok",
|
||||
"equal",
|
||||
"test",
|
||||
"asyncTest",
|
||||
"notEqual",
|
||||
"deepEqual",
|
||||
"strictEqual",
|
||||
"notStrictEqual",
|
||||
"start",
|
||||
"stop",
|
||||
"expect",
|
||||
"raises",
|
||||
"ajaxTest",
|
||||
"testIframe",
|
||||
"testIframeWithCallback",
|
||||
"createDashboardXML",
|
||||
"createXMLFragment",
|
||||
"moduleTeardown",
|
||||
"testFoo",
|
||||
"url",
|
||||
"t",
|
||||
"q",
|
||||
"amdDefined",
|
||||
"fireNative",
|
||||
"Globals",
|
||||
"hasPHP",
|
||||
"isLocal",
|
||||
"originaljQuery",
|
||||
"$",
|
||||
"original$",
|
||||
"externalHost"
|
||||
]
|
||||
}
|
||||
16
www/lib/jQuery/test/csp.php
Normal file
16
www/lib/jQuery/test/csp.php
Normal file
@@ -0,0 +1,16 @@
|
||||
<?php
|
||||
header("X-Content-Security-Policy: default-src localhost 'self';");
|
||||
header("X-WebKit-CSP: script-src 'self'; style-src 'self' 'unsafe-inline'");
|
||||
?>
|
||||
<!DOCTYPE html>
|
||||
<html>
|
||||
<head>
|
||||
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
|
||||
<title>CSP Test Page</title>
|
||||
|
||||
<script src="../dist/jquery.js"></script>
|
||||
</head>
|
||||
<body>
|
||||
<p>CSP Test Page</p>
|
||||
</body>
|
||||
</html>
|
||||
BIN
www/lib/jQuery/test/data/1x1.jpg
Normal file
BIN
www/lib/jQuery/test/data/1x1.jpg
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 693 B |
25
www/lib/jQuery/test/data/ajax/unreleasedXHR.html
Normal file
25
www/lib/jQuery/test/data/ajax/unreleasedXHR.html
Normal file
@@ -0,0 +1,25 @@
|
||||
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
|
||||
<html>
|
||||
<head>
|
||||
<meta http-equiv="content-type" content="text/html; charset=utf-8">
|
||||
<title>Attempt to block tests because of dangling XHR requests (IE)</title>
|
||||
<script type="text/javascript" src="../../../dist/jquery.min.js"></script>
|
||||
<script type="text/javascript">
|
||||
window.onunload = function() {};
|
||||
jQuery(function() {
|
||||
setTimeout(function() {
|
||||
var parent = window.parent;
|
||||
document.write("");
|
||||
parent.iframeCallback();
|
||||
}, 200 );
|
||||
var number = 50;
|
||||
while( number-- ) {
|
||||
jQuery.ajax("../name.php?wait=600");
|
||||
}
|
||||
});
|
||||
</script>
|
||||
</head>
|
||||
<body>
|
||||
<!-- empty body -->
|
||||
</body>
|
||||
</html>
|
||||
4
www/lib/jQuery/test/data/atom+xml.php
Normal file
4
www/lib/jQuery/test/data/atom+xml.php
Normal file
@@ -0,0 +1,4 @@
|
||||
<?php header("Content-type: atom+xml") ?>
|
||||
<root>
|
||||
<element />
|
||||
</root>
|
||||
1
www/lib/jQuery/test/data/badcall.js
Normal file
1
www/lib/jQuery/test/data/badcall.js
Normal file
@@ -0,0 +1 @@
|
||||
undefined();
|
||||
1
www/lib/jQuery/test/data/badjson.js
Normal file
1
www/lib/jQuery/test/data/badjson.js
Normal file
@@ -0,0 +1 @@
|
||||
{bad: toTheBone}
|
||||
10
www/lib/jQuery/test/data/cleanScript.html
Normal file
10
www/lib/jQuery/test/data/cleanScript.html
Normal file
@@ -0,0 +1,10 @@
|
||||
<script>
|
||||
<!--
|
||||
ok( true, "script within html comments executed" );
|
||||
-->
|
||||
</script>
|
||||
<script>
|
||||
<![CDATA[
|
||||
ok( true, "script within CDATA executed" );
|
||||
]]>
|
||||
</script>
|
||||
22
www/lib/jQuery/test/data/core/cc_on.html
Normal file
22
www/lib/jQuery/test/data/core/cc_on.html
Normal file
@@ -0,0 +1,22 @@
|
||||
<!DOCTYPE html>
|
||||
<html lang="en">
|
||||
<head>
|
||||
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
|
||||
<script>
|
||||
var cc_on = false,
|
||||
errors = [];
|
||||
/*@cc_on
|
||||
cc_on = true;
|
||||
@*/
|
||||
window.onerror = function( errorMessage, filePath, lineNumber ) {
|
||||
errors.push( errorMessage );
|
||||
};
|
||||
</script>
|
||||
<script src="../../../dist/jquery.min.js"></script>
|
||||
</head>
|
||||
<body>
|
||||
<script>
|
||||
window.parent.iframeCallback( cc_on, errors, jQuery );
|
||||
</script>
|
||||
</body>
|
||||
</html>
|
||||
11
www/lib/jQuery/test/data/dashboard.xml
Normal file
11
www/lib/jQuery/test/data/dashboard.xml
Normal file
@@ -0,0 +1,11 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<dashboard>
|
||||
<locations class="foo">
|
||||
<location for="bar" checked="different">
|
||||
<infowindowtab>
|
||||
<tab title="Location"><![CDATA[blabla]]></tab>
|
||||
<tab title="Users"><![CDATA[blublu]]></tab>
|
||||
</infowindowtab>
|
||||
</location>
|
||||
</locations>
|
||||
</dashboard>
|
||||
17
www/lib/jQuery/test/data/dimensions/documentLarge.html
Normal file
17
www/lib/jQuery/test/data/dimensions/documentLarge.html
Normal file
@@ -0,0 +1,17 @@
|
||||
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
|
||||
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en" dir="ltr" id="html">
|
||||
<head>
|
||||
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
|
||||
<style>
|
||||
body {
|
||||
width: 1000px;
|
||||
height: 1000px;
|
||||
}
|
||||
</style>
|
||||
</head>
|
||||
<body>
|
||||
<div>
|
||||
<script src="../../../dist/jquery.min.js"></script>
|
||||
</div>
|
||||
</body>
|
||||
</html>
|
||||
21
www/lib/jQuery/test/data/dimensions/documentSmall.html
Normal file
21
www/lib/jQuery/test/data/dimensions/documentSmall.html
Normal file
@@ -0,0 +1,21 @@
|
||||
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
|
||||
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en" dir="ltr" id="html">
|
||||
<head>
|
||||
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
|
||||
<style>
|
||||
html {
|
||||
/**
|
||||
* we need to null out border-width, because it causes bug #3838
|
||||
* and until we drop IE6, this test will fail in IE6 if we didn't
|
||||
* special case this situation.
|
||||
**/
|
||||
border-width: 0;
|
||||
}
|
||||
</style>
|
||||
</head>
|
||||
<body>
|
||||
<div>
|
||||
<script src="../../../dist/jquery.min.js"></script>
|
||||
</div>
|
||||
</body>
|
||||
</html>
|
||||
1
www/lib/jQuery/test/data/echoData.php
Normal file
1
www/lib/jQuery/test/data/echoData.php
Normal file
@@ -0,0 +1 @@
|
||||
<?php echo file_get_contents('php://input'); ?>
|
||||
1
www/lib/jQuery/test/data/echoQuery.php
Normal file
1
www/lib/jQuery/test/data/echoQuery.php
Normal file
@@ -0,0 +1 @@
|
||||
<?php echo $_SERVER['QUERY_STRING']; ?>
|
||||
5
www/lib/jQuery/test/data/errorWithText.php
Normal file
5
www/lib/jQuery/test/data/errorWithText.php
Normal file
@@ -0,0 +1,5 @@
|
||||
<?php
|
||||
|
||||
header("HTTP/1.0 400 Bad Request");
|
||||
|
||||
echo "plain text message";
|
||||
21
www/lib/jQuery/test/data/etag.php
Normal file
21
www/lib/jQuery/test/data/etag.php
Normal file
@@ -0,0 +1,21 @@
|
||||
<?php
|
||||
error_reporting(0);
|
||||
|
||||
$ts = $_REQUEST['ts'];
|
||||
$etag = md5($ts);
|
||||
|
||||
$ifNoneMatch = isset($_SERVER['HTTP_IF_NONE_MATCH']) ? stripslashes($_SERVER['HTTP_IF_NONE_MATCH']) : false;
|
||||
if ($ifNoneMatch == $etag) {
|
||||
header('HTTP/1.0 304 Not Modified');
|
||||
die; // stop processing
|
||||
}
|
||||
|
||||
header("Etag: " . $etag);
|
||||
|
||||
if ( $ifNoneMatch ) {
|
||||
echo "OK: " . $etag;
|
||||
} else {
|
||||
echo "FAIL";
|
||||
}
|
||||
|
||||
?>
|
||||
1
www/lib/jQuery/test/data/evalScript.php
Normal file
1
www/lib/jQuery/test/data/evalScript.php
Normal file
@@ -0,0 +1 @@
|
||||
ok( "<?php echo $_SERVER['REQUEST_METHOD'] ?>" === "GET", "request method is <?php echo $_SERVER['REQUEST_METHOD'] ?>" );
|
||||
4
www/lib/jQuery/test/data/event/longLoadScript.php
Normal file
4
www/lib/jQuery/test/data/event/longLoadScript.php
Normal file
@@ -0,0 +1,4 @@
|
||||
<?php
|
||||
sleep((int)$_GET['sleep']);
|
||||
header('Content-type: text/javascript');
|
||||
?>
|
||||
17
www/lib/jQuery/test/data/event/promiseReady.html
Normal file
17
www/lib/jQuery/test/data/event/promiseReady.html
Normal file
@@ -0,0 +1,17 @@
|
||||
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
|
||||
<html>
|
||||
<head>
|
||||
<meta http-equiv="content-type" content="text/html; charset=utf-8">
|
||||
<title>Test case for jQuery ticket #11470</title>
|
||||
<script type="text/javascript" src="../../../dist/jquery.min.js"></script>
|
||||
<script type="text/javascript">
|
||||
jQuery.when( jQuery.ready ).done(function() {
|
||||
jQuery("body").append("<div>modifying DOM</div>");
|
||||
window.parent.iframeCallback( $("div").text() === "modifying DOM" );
|
||||
});
|
||||
</script>
|
||||
</head>
|
||||
<body>
|
||||
<!-- empty body -->
|
||||
</body>
|
||||
</html>
|
||||
23
www/lib/jQuery/test/data/event/syncReady.html
Normal file
23
www/lib/jQuery/test/data/event/syncReady.html
Normal file
@@ -0,0 +1,23 @@
|
||||
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
|
||||
<html>
|
||||
<head>
|
||||
<meta http-equiv="content-type" content="text/html; charset=utf-8">
|
||||
<title>Test case for jQuery ticket #10067</title>
|
||||
<script type="text/javascript" src="../../../dist/jquery.min.js"></script>
|
||||
</head>
|
||||
<body>
|
||||
|
||||
<script type="text/javascript">
|
||||
jQuery( document ).ready(function () {
|
||||
window.parent.iframeCallback( jQuery('#container').length === 1 );
|
||||
});
|
||||
</script>
|
||||
|
||||
<!-- external resources that come before elements trick
|
||||
oldIE into thinking the dom is ready, but it's not...
|
||||
leaving this check here for future trailblazers to attempt
|
||||
fixing this...-->
|
||||
<script type="text/javascript" src="longLoadScript.php?sleep=1"></script>
|
||||
<div id="container" style="height: 300px"></div>
|
||||
</body>
|
||||
</html>
|
||||
18
www/lib/jQuery/test/data/headers.php
Normal file
18
www/lib/jQuery/test/data/headers.php
Normal file
@@ -0,0 +1,18 @@
|
||||
<?php
|
||||
|
||||
header( "Sample-Header: Hello World" );
|
||||
header( "Empty-Header: " );
|
||||
header( "Sample-Header2: Hello World 2" );
|
||||
|
||||
$headers = array();
|
||||
|
||||
foreach( $_SERVER as $key => $value ) {
|
||||
|
||||
$key = str_replace( "_" , "-" , substr( $key , 0 , 5 ) == "HTTP_" ? substr( $key , 5 ) : $key );
|
||||
$headers[ $key ] = $value;
|
||||
|
||||
}
|
||||
|
||||
foreach( explode( "_" , $_GET[ "keys" ] ) as $key ) {
|
||||
echo "$key: " . @$headers[ strtoupper( $key ) ] . "\n";
|
||||
}
|
||||
20
www/lib/jQuery/test/data/if_modified_since.php
Normal file
20
www/lib/jQuery/test/data/if_modified_since.php
Normal file
@@ -0,0 +1,20 @@
|
||||
<?php
|
||||
error_reporting(0);
|
||||
|
||||
$ts = $_REQUEST['ts'];
|
||||
|
||||
$ifModifiedSince = isset($_SERVER['HTTP_IF_MODIFIED_SINCE']) ? stripslashes($_SERVER['HTTP_IF_MODIFIED_SINCE']) : false;
|
||||
if ($ifModifiedSince == $ts) {
|
||||
header('HTTP/1.0 304 Not Modified');
|
||||
die; // stop processing
|
||||
}
|
||||
|
||||
header("Last-Modified: " . $ts);
|
||||
|
||||
if ( $ifModifiedSince ) {
|
||||
echo "OK: " . $ts;
|
||||
} else {
|
||||
echo "FAIL";
|
||||
}
|
||||
|
||||
?>
|
||||
8
www/lib/jQuery/test/data/iframe.html
Normal file
8
www/lib/jQuery/test/data/iframe.html
Normal file
@@ -0,0 +1,8 @@
|
||||
<html>
|
||||
<head>
|
||||
<title>iframe</title>
|
||||
</head>
|
||||
<body>
|
||||
<div><span>span text</span></div>
|
||||
</body>
|
||||
</html>
|
||||
2
www/lib/jQuery/test/data/jquery-1.8.2.ajax_xhr.min.js
vendored
Normal file
2
www/lib/jQuery/test/data/jquery-1.8.2.ajax_xhr.min.js
vendored
Normal file
File diff suppressed because one or more lines are too long
13
www/lib/jQuery/test/data/json.php
Normal file
13
www/lib/jQuery/test/data/json.php
Normal file
@@ -0,0 +1,13 @@
|
||||
<?php
|
||||
error_reporting(0);
|
||||
if ( $_REQUEST['header'] ) {
|
||||
header("Content-type: application/json");
|
||||
}
|
||||
|
||||
$json = $_REQUEST['json'];
|
||||
if($json) {
|
||||
echo '[ {"name": "John", "age": 21}, {"name": "Peter", "age": 25 } ]';
|
||||
} else {
|
||||
echo '{ "data": {"lang": "en", "length": 25} }';
|
||||
}
|
||||
?>
|
||||
1
www/lib/jQuery/test/data/json_obj.js
Normal file
1
www/lib/jQuery/test/data/json_obj.js
Normal file
@@ -0,0 +1 @@
|
||||
{ "data": {"lang": "en", "length": 25} }
|
||||
14
www/lib/jQuery/test/data/jsonp.php
Normal file
14
www/lib/jQuery/test/data/jsonp.php
Normal file
@@ -0,0 +1,14 @@
|
||||
<?php
|
||||
error_reporting(0);
|
||||
$callback = $_REQUEST['callback'];
|
||||
if ( ! $callback ) {
|
||||
$callback = explode("?",end(explode("/",$_SERVER['REQUEST_URI'])));
|
||||
$callback = $callback[0];
|
||||
}
|
||||
$json = $_REQUEST['json'];
|
||||
if($json) {
|
||||
echo $callback . '([ {"name": "John", "age": 21}, {"name": "Peter", "age": 25 } ])';
|
||||
} else {
|
||||
echo $callback . '({ "data": {"lang": "en", "length": 25} })';
|
||||
}
|
||||
?>
|
||||
36
www/lib/jQuery/test/data/manipulation/iframe-denied.html
Normal file
36
www/lib/jQuery/test/data/manipulation/iframe-denied.html
Normal file
@@ -0,0 +1,36 @@
|
||||
<!DOCTYPE html>
|
||||
<html>
|
||||
<head>
|
||||
<meta charset=utf-8 />
|
||||
<title>body</title>
|
||||
</head>
|
||||
<body>
|
||||
<div id="qunit-fixture"></div>
|
||||
<script src="../../../dist/jquery.min.js"></script>
|
||||
<script>
|
||||
var script = document.getElementsByTagName( "script" )[ 0 ],
|
||||
div = document.createElement( "div" ),
|
||||
src = "http://" + window.parent.externalHost,
|
||||
success = true,
|
||||
error = "";
|
||||
|
||||
script.parentNode.appendChild( div );
|
||||
div.innerHTML = "<iframe name=\"test\" src=\"" + src + "\">";
|
||||
|
||||
jQuery(function() {
|
||||
try {
|
||||
jQuery( "<div>hello<div>world</div>!</div>" ).appendTo( "#qunit-fixture" );
|
||||
} catch( e ) {
|
||||
success = false;
|
||||
error = e;
|
||||
}
|
||||
|
||||
window.parent.iframeCallback({
|
||||
status: success,
|
||||
description: "buildFragment sets the context without throwing an exception" +
|
||||
( error ? ": " + error : "" )
|
||||
});
|
||||
});
|
||||
</script>
|
||||
</body>
|
||||
</html>
|
||||
1
www/lib/jQuery/test/data/name.html
Normal file
1
www/lib/jQuery/test/data/name.html
Normal file
@@ -0,0 +1 @@
|
||||
ERROR <script type="text/javascript">ok( true, "name.html retrieved" );</script>
|
||||
24
www/lib/jQuery/test/data/name.php
Normal file
24
www/lib/jQuery/test/data/name.php
Normal file
@@ -0,0 +1,24 @@
|
||||
<?php
|
||||
error_reporting(0);
|
||||
$wait = $_REQUEST['wait'];
|
||||
if($wait) {
|
||||
sleep($wait);
|
||||
}
|
||||
$xml = $_REQUEST['xml'];
|
||||
if($xml) {
|
||||
header("Content-type: text/xml");
|
||||
$result = ($xml == "5-2") ? "3" : "?";
|
||||
echo "<math><calculation>$xml</calculation><result>$result</result></math>";
|
||||
die();
|
||||
}
|
||||
$name = $_REQUEST['name'];
|
||||
if($name == 'foo') {
|
||||
echo "bar";
|
||||
die();
|
||||
} else if($name == 'peter') {
|
||||
echo "pan";
|
||||
die();
|
||||
}
|
||||
|
||||
echo 'ERROR <script type="text/javascript">ok( true, "name.php executed" );</script>';
|
||||
?>
|
||||
5
www/lib/jQuery/test/data/nocontent.php
Normal file
5
www/lib/jQuery/test/data/nocontent.php
Normal file
@@ -0,0 +1,5 @@
|
||||
<?php
|
||||
|
||||
header('HTTP/1.0 204 No Content');
|
||||
|
||||
?>
|
||||
41
www/lib/jQuery/test/data/offset/absolute.html
Normal file
41
www/lib/jQuery/test/data/offset/absolute.html
Normal file
@@ -0,0 +1,41 @@
|
||||
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
|
||||
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
|
||||
<html>
|
||||
<head>
|
||||
<meta http-equiv="Content-type" content="text/html; charset=utf-8">
|
||||
<title>absolute</title>
|
||||
<style type="text/css" media="screen">
|
||||
body { margin: 1px; padding: 5px; }
|
||||
div.absolute { position: absolute; margin: 1px; border: 2px solid #000; padding: 5px; width: 100px; height: 100px; background: #fff; }
|
||||
#absolute-1 { top: 0; left: 0; }
|
||||
#absolute-1-1 { top: 1px; left: 1px; }
|
||||
#absolute-1-1-1 { top: 1px; left: 1px; }
|
||||
#absolute-2 { top: 19px; left: 19px; }
|
||||
#marker { position: absolute; border: 2px solid #000; width: 50px; height: 50px; background: #ccc; }
|
||||
p.instructions { position: absolute; bottom: 0; }
|
||||
#positionTest { position: absolute; }
|
||||
</style>
|
||||
<script src="../../../dist/jquery.min.js"></script>
|
||||
<script type="text/javascript" charset="utf-8">
|
||||
jQuery(function($) {
|
||||
$('.absolute').click(function() {
|
||||
$('#marker').css( $(this).offset() );
|
||||
var pos = $(this).position();
|
||||
$(this).css({ top: pos.top, left: pos.left });
|
||||
return false;
|
||||
});
|
||||
});
|
||||
</script>
|
||||
</head>
|
||||
<body>
|
||||
<div id="absolute-1" class="absolute">absolute-1
|
||||
<div id="absolute-1-1" class="absolute">absolute-1-1
|
||||
<div id="absolute-1-1-1" class="absolute">absolute-1-1-1</div>
|
||||
</div>
|
||||
</div>
|
||||
<div id="absolute-2" class="absolute">absolute-2</div>
|
||||
<div id="positionTest">Has absolute position but no values set for the location ('auto').</div>
|
||||
<div id="marker"></div>
|
||||
<p class="instructions">Click the white box to move the marker to it. Clicking the box also changes the position to absolute (if not already) and sets the position according to the position method.</p>
|
||||
</body>
|
||||
</html>
|
||||
26
www/lib/jQuery/test/data/offset/body.html
Normal file
26
www/lib/jQuery/test/data/offset/body.html
Normal file
@@ -0,0 +1,26 @@
|
||||
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
|
||||
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
|
||||
<html>
|
||||
<head>
|
||||
<meta http-equiv="Content-type" content="text/html; charset=utf-8">
|
||||
<title>body</title>
|
||||
<style type="text/css" media="screen">
|
||||
body { margin: 1px; padding: 5px; position: relative }
|
||||
#marker { position: absolute; border: 2px solid #000; width: 50px; height: 50px; background: #ccc; }
|
||||
#firstElement { width: 50px; height: 50px; background: green; }
|
||||
</style>
|
||||
<script src="../../../dist/jquery.min.js"></script>
|
||||
<script type="text/javascript" charset="utf-8">
|
||||
jQuery(function($) {
|
||||
$('body').click(function() {
|
||||
$('#marker').css( $(this).offset() );
|
||||
return false;
|
||||
});
|
||||
});
|
||||
</script>
|
||||
</head>
|
||||
<body>
|
||||
<div id="firstElement"></div>
|
||||
<div id="marker"></div>
|
||||
</body>
|
||||
</html>
|
||||
34
www/lib/jQuery/test/data/offset/fixed.html
Normal file
34
www/lib/jQuery/test/data/offset/fixed.html
Normal file
@@ -0,0 +1,34 @@
|
||||
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
|
||||
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
|
||||
<html>
|
||||
<head>
|
||||
<meta http-equiv="Content-type" content="text/html; charset=utf-8">
|
||||
<title>fixed</title>
|
||||
<style type="text/css" media="screen">
|
||||
body { margin: 1px; padding: 5px; }
|
||||
div.fixed { position: fixed; margin: 1px; border: 2px solid #000; padding: 5px; width: 100px; height: 100px; background: #fff; overflow: hidden; }
|
||||
#fixed-1 { top: 0; left: 0; }
|
||||
#fixed-2 { top: 20px; left: 20px; }
|
||||
#forceScroll { width: 5000px; height: 5000px; }
|
||||
#marker { position: absolute; border: 2px solid #000; width: 50px; height: 50px; background: #ccc; }
|
||||
</style>
|
||||
<script src="../../../dist/jquery.min.js"></script>
|
||||
<script type="text/javascript" charset="utf-8">
|
||||
jQuery(function($) {
|
||||
window.scrollTo(1000,1000);
|
||||
$('.fixed').click(function() {
|
||||
$('#marker').css( $(this).offset() );
|
||||
return false;
|
||||
});
|
||||
});
|
||||
</script>
|
||||
</head>
|
||||
<body>
|
||||
<div id="fixed-1" class="fixed"></div>
|
||||
<div id="fixed-2" class="fixed"></div>
|
||||
<div id="fixed-no-top-left" class="fixed"></div>
|
||||
<div id="forceScroll"></div>
|
||||
<div id="marker"></div>
|
||||
<p class="instructions">Click the white box to move the marker to it.</p>
|
||||
</body>
|
||||
</html>
|
||||
31
www/lib/jQuery/test/data/offset/relative.html
Normal file
31
www/lib/jQuery/test/data/offset/relative.html
Normal file
@@ -0,0 +1,31 @@
|
||||
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
|
||||
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
|
||||
<html>
|
||||
<head>
|
||||
<meta http-equiv="Content-type" content="text/html; charset=utf-8">
|
||||
<title>relative</title>
|
||||
<style type="text/css" media="screen">
|
||||
body { margin: 1px; padding: 5px; }
|
||||
div.relative { position: relative; top: 0; left: 0; margin: 1px; border: 2px solid #000; padding: 5px; width: 100px; height: 100px; background: #fff; overflow: hidden; }
|
||||
#relative-2 { top: 20px; left: 20px; }
|
||||
#marker { position: absolute; border: 2px solid #000; width: 50px; height: 50px; background: #ccc; }
|
||||
</style>
|
||||
<script src="../../../dist/jquery.min.js"></script>
|
||||
<script type="text/javascript" charset="utf-8">
|
||||
jQuery(function($) {
|
||||
$('.relative').click(function() {
|
||||
$('#marker').css( $(this).offset() );
|
||||
var pos = $(this).position();
|
||||
$(this).css({ position: 'absolute', top: pos.top, left: pos.left });
|
||||
return false;
|
||||
});
|
||||
});
|
||||
</script>
|
||||
</head>
|
||||
<body>
|
||||
<div id="relative-1" class="relative"><div id="relative-1-1" class="relative"><div id="relative-1-1-1" class="relative"></div></div></div>
|
||||
<div id="relative-2" class="relative"></div>
|
||||
<div id="marker"></div>
|
||||
<p class="instructions">Click the white box to move the marker to it. Clicking the box also changes the position to absolute (if not already) and sets the position according to the position method.</p>
|
||||
</body>
|
||||
</html>
|
||||
39
www/lib/jQuery/test/data/offset/scroll.html
Normal file
39
www/lib/jQuery/test/data/offset/scroll.html
Normal file
@@ -0,0 +1,39 @@
|
||||
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
|
||||
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
|
||||
<html>
|
||||
<head>
|
||||
<meta http-equiv="Content-type" content="text/html; charset=utf-8">
|
||||
<title>scroll</title>
|
||||
<style type="text/css" media="screen">
|
||||
body { margin: 1px; padding: 5px; }
|
||||
div.scroll { position: relative; margin: 1px; border: 2px solid #000; padding: 5px; width: 100px; height: 100px; background: #fff; overflow: auto; }
|
||||
#scroll-1 { top: 0; left: 0; }
|
||||
#scroll-1-1 { top: 1px; left: 1px; }
|
||||
#scroll-1-1-1 { top: 1px; left: 1px; }
|
||||
#forceScroll { width: 5000px; height: 5000px; }
|
||||
#marker { position: absolute; border: 2px solid #000; width: 50px; height: 50px; background: #ccc; }
|
||||
</style>
|
||||
<script src="../../../dist/jquery.min.js"></script>
|
||||
<script type="text/javascript" charset="utf-8">
|
||||
jQuery(function($) {
|
||||
window.scrollTo(1000,1000);
|
||||
$('#scroll-1')[0].scrollLeft = 5;
|
||||
$('#scroll-1')[0].scrollTop = 5;
|
||||
$('.scroll').click(function() {
|
||||
$('#marker').css( $(this).offset() );
|
||||
return false;
|
||||
});
|
||||
});
|
||||
</script>
|
||||
</head>
|
||||
<body>
|
||||
<div id="scroll-1" class="scroll">
|
||||
<div id="scroll-1-1" class="scroll">
|
||||
<div id="scroll-1-1-1" class="scroll"></div>
|
||||
</div>
|
||||
</div>
|
||||
<div id="forceScroll"></div>
|
||||
<div id="marker"></div>
|
||||
<p class="instructions">Click the white box to move the marker to it.</p>
|
||||
</body>
|
||||
</html>
|
||||
31
www/lib/jQuery/test/data/offset/static.html
Normal file
31
www/lib/jQuery/test/data/offset/static.html
Normal file
@@ -0,0 +1,31 @@
|
||||
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
|
||||
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
|
||||
<html>
|
||||
<head>
|
||||
<meta http-equiv="Content-type" content="text/html; charset=utf-8">
|
||||
<title>static</title>
|
||||
<style type="text/css" media="screen">
|
||||
body { margin: 1px; padding: 5px; }
|
||||
div.static { position: static; top: 0; left: 0; margin: 1px; border: 2px solid #000; padding: 5px; width: 100px; height: 100px; background: #fff; overflow: hidden; }
|
||||
#static-2 { top: 20px; left: 20px; }
|
||||
#marker { position: absolute; border: 2px solid #000; width: 50px; height: 50px; background: #ccc; }
|
||||
</style>
|
||||
<script src="../../../dist/jquery.min.js"></script>
|
||||
<script type="text/javascript" charset="utf-8">
|
||||
jQuery(function($) {
|
||||
$('.static').click(function() {
|
||||
$('#marker').css( $(this).offset() );
|
||||
var pos = $(this).position();
|
||||
$(this).css({ position: 'absolute', top: pos.top, left: pos.left });
|
||||
return false;
|
||||
});
|
||||
});
|
||||
</script>
|
||||
</head>
|
||||
<body>
|
||||
<div id="static-1" class="static"><div id="static-1-1" class="static"><div id="static-1-1-1" class="static"></div></div></div>
|
||||
<div id="static-2" class="static"></div>
|
||||
<div id="marker"></div>
|
||||
<p class="instructions">Click the white box to move the marker to it. Clicking the box also changes the position to absolute (if not already) and sets the position according to the position method.</p>
|
||||
</body>
|
||||
</html>
|
||||
43
www/lib/jQuery/test/data/offset/table.html
Normal file
43
www/lib/jQuery/test/data/offset/table.html
Normal file
@@ -0,0 +1,43 @@
|
||||
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
|
||||
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
|
||||
<html>
|
||||
<head>
|
||||
<meta http-equiv="Content-type" content="text/html; charset=utf-8">
|
||||
<title>table</title>
|
||||
<style type="text/css" media="screen">
|
||||
body { margin: 1px; padding: 5px; }
|
||||
table { border: 2px solid #000; }
|
||||
th, td { border: 1px solid #000; width: 100px; height: 100px; }
|
||||
#marker { position: absolute; border: 2px solid #000; width: 50px; height: 50px; background: #ccc; }
|
||||
</style>
|
||||
<script src="../../../dist/jquery.min.js"></script>
|
||||
<script type="text/javascript" charset="utf-8">
|
||||
jQuery(function($) {
|
||||
$('table, th, td').click(function() {
|
||||
$('#marker').css( $(this).offset() );
|
||||
return false;
|
||||
});
|
||||
});
|
||||
</script>
|
||||
</head>
|
||||
<body>
|
||||
<table id="table-1">
|
||||
<thead>
|
||||
<tr valign="top">
|
||||
<th id="th-1">th-1</th>
|
||||
<th id="th-2">th-2</th>
|
||||
<th id="th-3">th-3</th>
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody>
|
||||
<tr valign="top">
|
||||
<td id="td-1">td-1</td>
|
||||
<td id="td-2">td-2</td>
|
||||
<td id="td-3">td-3</td>
|
||||
</tr>
|
||||
</tbody>
|
||||
</table>
|
||||
<div id="marker"></div>
|
||||
<p class="instructions">Click the white box to move the marker to it.</p>
|
||||
</body>
|
||||
</html>
|
||||
12
www/lib/jQuery/test/data/params_html.php
Normal file
12
www/lib/jQuery/test/data/params_html.php
Normal file
@@ -0,0 +1,12 @@
|
||||
<div id="post">
|
||||
<?php
|
||||
foreach( $_POST as $key=>$value )
|
||||
echo "<b id='$key'>$value</b>";
|
||||
?>
|
||||
</div>
|
||||
<div id="get">
|
||||
<?php
|
||||
foreach( $_GET as $key=>$value )
|
||||
echo "<b id='$key'>$value</b>";
|
||||
?>
|
||||
</div>
|
||||
1
www/lib/jQuery/test/data/readywaitasset.js
Normal file
1
www/lib/jQuery/test/data/readywaitasset.js
Normal file
@@ -0,0 +1 @@
|
||||
var delayedMessage = "It worked!";
|
||||
25
www/lib/jQuery/test/data/readywaitloader.js
Normal file
25
www/lib/jQuery/test/data/readywaitloader.js
Normal file
@@ -0,0 +1,25 @@
|
||||
// Simple script loader that uses jQuery.readyWait via jQuery.holdReady()
|
||||
|
||||
//Hold on jQuery!
|
||||
jQuery.holdReady(true);
|
||||
|
||||
var readyRegExp = /^(complete|loaded)$/;
|
||||
|
||||
function assetLoaded( evt ){
|
||||
var node = evt.currentTarget || evt.srcElement;
|
||||
if ( evt.type === "load" || readyRegExp.test(node.readyState) ) {
|
||||
jQuery.holdReady(false);
|
||||
}
|
||||
}
|
||||
|
||||
setTimeout( function() {
|
||||
var script = document.createElement("script");
|
||||
script.type = "text/javascript";
|
||||
if ( script.addEventListener ) {
|
||||
script.addEventListener( "load", assetLoaded, false );
|
||||
} else {
|
||||
script.attachEvent( "onreadystatechange", assetLoaded );
|
||||
}
|
||||
script.src = "data/readywaitasset.js";
|
||||
document.getElementsByTagName("head")[0].appendChild(script);
|
||||
}, 2000 );
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user