From 56a0ed1155bb808d6e57f811765211f4a2520571 Mon Sep 17 00:00:00 2001 From: Dan Heberden Date: Thu, 11 Apr 2013 14:40:46 -0700 Subject: [PATCH] Move all compressed tests to one file that loops through every folder to make adding tests easier. Also added test for node-archiver, which jqueryui uses. --- test/compressed.js | 102 +- test/fileSizeUnknownFlag.js | 78 - test/pipeSingleEntry.js | 29 - .../archive.zip | Bin .../inflated/dir/fileInsideDir.txt | 0 .../inflated/file.txt | 0 .../archive.zip | Bin 0 -> 340150 bytes .../css/no-theme/jquery-ui-1.10.2.custom.css | 87 + .../no-theme/jquery-ui-1.10.2.custom.min.css | 6 + .../inflated/development-bundle/AUTHORS.txt | 242 + .../inflated/development-bundle/Gruntfile.js | 378 + .../development-bundle/MIT-LICENSE.txt | 26 + .../inflated/development-bundle/README.md | 99 + .../development-bundle/demos/demos.css | 19 + .../demos/images/calendar.gif | Bin 0 -> 269 bytes .../demos/images/demo-config-on-tile.gif | Bin 0 -> 172 bytes .../demos/images/demo-config-on.gif | Bin 0 -> 335 bytes .../demos/images/demo-spindown-closed.gif | Bin 0 -> 103 bytes .../demos/images/demo-spindown-open.gif | Bin 0 -> 105 bytes .../demos/images/icon-docs-info.gif | Bin 0 -> 206 bytes .../demos/images/pbar-ani.gif | Bin 0 -> 7970 bytes .../external/globalize.culture.de-DE.js | 81 + .../external/globalize.culture.ja-JP.js | 100 + .../development-bundle/external/globalize.js | 1573 +++ .../external/jquery.mousewheel.js | 101 + .../development-bundle/external/jshint.js | 4835 +++++++++ .../development-bundle/external/qunit.css | 244 + .../development-bundle/external/qunit.js | 2152 ++++ .../development-bundle/jquery-1.9.1.js | 9597 +++++++++++++++++ .../inflated/development-bundle/package.json | 70 + .../themes/base/images/animated-overlay.gif | Bin 0 -> 1738 bytes .../images/ui-bg_flat_0_aaaaaa_40x100.png | Bin 0 -> 180 bytes .../images/ui-bg_flat_75_ffffff_40x100.png | Bin 0 -> 178 bytes .../images/ui-bg_glass_55_fbf9ee_1x400.png | Bin 0 -> 120 bytes .../images/ui-bg_glass_65_ffffff_1x400.png | Bin 0 -> 105 bytes .../images/ui-bg_glass_75_dadada_1x400.png | Bin 0 -> 111 bytes .../images/ui-bg_glass_75_e6e6e6_1x400.png | Bin 0 -> 110 bytes .../images/ui-bg_glass_95_fef1ec_1x400.png | Bin 0 -> 119 bytes .../ui-bg_highlight-soft_75_cccccc_1x100.png | Bin 0 -> 101 bytes .../base/images/ui-icons_222222_256x240.png | Bin 0 -> 4369 bytes .../base/images/ui-icons_2e83ff_256x240.png | Bin 0 -> 4369 bytes .../base/images/ui-icons_454545_256x240.png | Bin 0 -> 4369 bytes .../base/images/ui-icons_888888_256x240.png | Bin 0 -> 4369 bytes .../base/images/ui-icons_cd0a0a_256x240.png | Bin 0 -> 4369 bytes .../themes/base/jquery-ui.css | 480 + .../themes/base/jquery.ui.all.css | 12 + .../themes/base/jquery.ui.base.css | 25 + .../themes/base/jquery.ui.core.css | 93 + .../themes/base/jquery.ui.theme.css | 406 + .../base/minified/images/animated-overlay.gif | Bin 0 -> 1738 bytes .../images/ui-bg_flat_0_aaaaaa_40x100.png | Bin 0 -> 180 bytes .../images/ui-bg_flat_75_ffffff_40x100.png | Bin 0 -> 178 bytes .../images/ui-bg_glass_55_fbf9ee_1x400.png | Bin 0 -> 120 bytes .../images/ui-bg_glass_65_ffffff_1x400.png | Bin 0 -> 105 bytes .../images/ui-bg_glass_75_dadada_1x400.png | Bin 0 -> 111 bytes .../images/ui-bg_glass_75_e6e6e6_1x400.png | Bin 0 -> 110 bytes .../images/ui-bg_glass_95_fef1ec_1x400.png | Bin 0 -> 119 bytes .../ui-bg_highlight-soft_75_cccccc_1x100.png | Bin 0 -> 101 bytes .../images/ui-icons_222222_256x240.png | Bin 0 -> 4369 bytes .../images/ui-icons_2e83ff_256x240.png | Bin 0 -> 4369 bytes .../images/ui-icons_454545_256x240.png | Bin 0 -> 4369 bytes .../images/ui-icons_888888_256x240.png | Bin 0 -> 4369 bytes .../images/ui-icons_cd0a0a_256x240.png | Bin 0 -> 4369 bytes .../themes/base/minified/jquery-ui.min.css | 10 + .../base/minified/jquery.ui.core.min.css | 5 + .../base/minified/jquery.ui.theme.min.css | 5 + .../themes/no-theme/jquery-ui.css | 87 + .../themes/no-theme/jquery.ui.all.css | 11 + .../themes/no-theme/jquery.ui.base.css | 25 + .../themes/no-theme/jquery.ui.core.css | 93 + .../no-theme/minified/jquery-ui.min.css | 6 + .../no-theme/minified/jquery.ui.core.min.css | 5 + .../development-bundle/ui.core.jquery.json | 61 + .../development-bundle/ui/jquery-ui.custom.js | 315 + .../development-bundle/ui/jquery.ui.core.js | 320 + .../ui/minified/jquery-ui.custom.min.js | 6 + .../ui/minified/jquery.ui.core.min.js | 4 + .../inflated/index.html | 301 + .../inflated/js/jquery-1.9.1.js | 9597 +++++++++++++++++ .../inflated/js/jquery-ui-1.10.2.custom.js | 315 + .../js/jquery-ui-1.10.2.custom.min.js | 6 + testData/compressed-node-archiver/.DS_Store | Bin 0 -> 6148 bytes testData/compressed-node-archiver/archive.zip | Bin 0 -> 1514 bytes .../inflated/dir1/dir1_file.txt | 15 + .../inflated/file.txt | 15 + .../inflated/file2.txt | 6 + .../compressed-twitter-bootstrap/archive.zip | Bin 0 -> 85566 bytes .../inflated/css/bootstrap-responsive.css | 1109 ++ .../inflated/css/bootstrap-responsive.min.css | 9 + .../inflated/css/bootstrap.css | 6158 +++++++++++ .../inflated/css/bootstrap.min.css | 9 + .../img/glyphicons-halflings-white.png | Bin 0 -> 8777 bytes .../inflated/img/glyphicons-halflings.png | Bin 0 -> 12799 bytes .../inflated/js/bootstrap.js | 2276 ++++ .../inflated/js/bootstrap.min.js | 6 + 95 files changed, 41471 insertions(+), 139 deletions(-) delete mode 100644 test/fileSizeUnknownFlag.js delete mode 100644 test/pipeSingleEntry.js rename testData/{compressed-OSX-Finder => compressed-OSX-Finder-Size-Unknown}/archive.zip (100%) rename testData/{compressed-OSX-Finder => compressed-OSX-Finder-Size-Unknown}/inflated/dir/fileInsideDir.txt (100%) rename testData/{compressed-OSX-Finder => compressed-OSX-Finder-Size-Unknown}/inflated/file.txt (100%) create mode 100644 testData/compressed-jQueryUI-built-with-node-archiver/archive.zip create mode 100755 testData/compressed-jQueryUI-built-with-node-archiver/inflated/css/no-theme/jquery-ui-1.10.2.custom.css create mode 100755 testData/compressed-jQueryUI-built-with-node-archiver/inflated/css/no-theme/jquery-ui-1.10.2.custom.min.css create mode 100755 testData/compressed-jQueryUI-built-with-node-archiver/inflated/development-bundle/AUTHORS.txt create mode 100755 testData/compressed-jQueryUI-built-with-node-archiver/inflated/development-bundle/Gruntfile.js create mode 100755 testData/compressed-jQueryUI-built-with-node-archiver/inflated/development-bundle/MIT-LICENSE.txt create mode 100755 testData/compressed-jQueryUI-built-with-node-archiver/inflated/development-bundle/README.md create mode 100755 testData/compressed-jQueryUI-built-with-node-archiver/inflated/development-bundle/demos/demos.css create mode 100755 testData/compressed-jQueryUI-built-with-node-archiver/inflated/development-bundle/demos/images/calendar.gif create mode 100755 testData/compressed-jQueryUI-built-with-node-archiver/inflated/development-bundle/demos/images/demo-config-on-tile.gif create mode 100755 testData/compressed-jQueryUI-built-with-node-archiver/inflated/development-bundle/demos/images/demo-config-on.gif create mode 100755 testData/compressed-jQueryUI-built-with-node-archiver/inflated/development-bundle/demos/images/demo-spindown-closed.gif create mode 100755 testData/compressed-jQueryUI-built-with-node-archiver/inflated/development-bundle/demos/images/demo-spindown-open.gif create mode 100755 testData/compressed-jQueryUI-built-with-node-archiver/inflated/development-bundle/demos/images/icon-docs-info.gif create mode 100755 testData/compressed-jQueryUI-built-with-node-archiver/inflated/development-bundle/demos/images/pbar-ani.gif create mode 100755 testData/compressed-jQueryUI-built-with-node-archiver/inflated/development-bundle/external/globalize.culture.de-DE.js create mode 100755 testData/compressed-jQueryUI-built-with-node-archiver/inflated/development-bundle/external/globalize.culture.ja-JP.js create mode 100755 testData/compressed-jQueryUI-built-with-node-archiver/inflated/development-bundle/external/globalize.js create mode 100755 testData/compressed-jQueryUI-built-with-node-archiver/inflated/development-bundle/external/jquery.mousewheel.js create mode 100755 testData/compressed-jQueryUI-built-with-node-archiver/inflated/development-bundle/external/jshint.js create mode 100755 testData/compressed-jQueryUI-built-with-node-archiver/inflated/development-bundle/external/qunit.css create mode 100755 testData/compressed-jQueryUI-built-with-node-archiver/inflated/development-bundle/external/qunit.js create mode 100755 testData/compressed-jQueryUI-built-with-node-archiver/inflated/development-bundle/jquery-1.9.1.js create mode 100755 testData/compressed-jQueryUI-built-with-node-archiver/inflated/development-bundle/package.json create mode 100755 testData/compressed-jQueryUI-built-with-node-archiver/inflated/development-bundle/themes/base/images/animated-overlay.gif create mode 100755 testData/compressed-jQueryUI-built-with-node-archiver/inflated/development-bundle/themes/base/images/ui-bg_flat_0_aaaaaa_40x100.png create mode 100755 testData/compressed-jQueryUI-built-with-node-archiver/inflated/development-bundle/themes/base/images/ui-bg_flat_75_ffffff_40x100.png create mode 100755 testData/compressed-jQueryUI-built-with-node-archiver/inflated/development-bundle/themes/base/images/ui-bg_glass_55_fbf9ee_1x400.png create mode 100755 testData/compressed-jQueryUI-built-with-node-archiver/inflated/development-bundle/themes/base/images/ui-bg_glass_65_ffffff_1x400.png create mode 100755 testData/compressed-jQueryUI-built-with-node-archiver/inflated/development-bundle/themes/base/images/ui-bg_glass_75_dadada_1x400.png create mode 100755 testData/compressed-jQueryUI-built-with-node-archiver/inflated/development-bundle/themes/base/images/ui-bg_glass_75_e6e6e6_1x400.png create mode 100755 testData/compressed-jQueryUI-built-with-node-archiver/inflated/development-bundle/themes/base/images/ui-bg_glass_95_fef1ec_1x400.png create mode 100755 testData/compressed-jQueryUI-built-with-node-archiver/inflated/development-bundle/themes/base/images/ui-bg_highlight-soft_75_cccccc_1x100.png create mode 100755 testData/compressed-jQueryUI-built-with-node-archiver/inflated/development-bundle/themes/base/images/ui-icons_222222_256x240.png create mode 100755 testData/compressed-jQueryUI-built-with-node-archiver/inflated/development-bundle/themes/base/images/ui-icons_2e83ff_256x240.png create mode 100755 testData/compressed-jQueryUI-built-with-node-archiver/inflated/development-bundle/themes/base/images/ui-icons_454545_256x240.png create mode 100755 testData/compressed-jQueryUI-built-with-node-archiver/inflated/development-bundle/themes/base/images/ui-icons_888888_256x240.png create mode 100755 testData/compressed-jQueryUI-built-with-node-archiver/inflated/development-bundle/themes/base/images/ui-icons_cd0a0a_256x240.png create mode 100755 testData/compressed-jQueryUI-built-with-node-archiver/inflated/development-bundle/themes/base/jquery-ui.css create mode 100755 testData/compressed-jQueryUI-built-with-node-archiver/inflated/development-bundle/themes/base/jquery.ui.all.css create mode 100755 testData/compressed-jQueryUI-built-with-node-archiver/inflated/development-bundle/themes/base/jquery.ui.base.css create mode 100755 testData/compressed-jQueryUI-built-with-node-archiver/inflated/development-bundle/themes/base/jquery.ui.core.css create mode 100755 testData/compressed-jQueryUI-built-with-node-archiver/inflated/development-bundle/themes/base/jquery.ui.theme.css create mode 100755 testData/compressed-jQueryUI-built-with-node-archiver/inflated/development-bundle/themes/base/minified/images/animated-overlay.gif create mode 100755 testData/compressed-jQueryUI-built-with-node-archiver/inflated/development-bundle/themes/base/minified/images/ui-bg_flat_0_aaaaaa_40x100.png create mode 100755 testData/compressed-jQueryUI-built-with-node-archiver/inflated/development-bundle/themes/base/minified/images/ui-bg_flat_75_ffffff_40x100.png create mode 100755 testData/compressed-jQueryUI-built-with-node-archiver/inflated/development-bundle/themes/base/minified/images/ui-bg_glass_55_fbf9ee_1x400.png create mode 100755 testData/compressed-jQueryUI-built-with-node-archiver/inflated/development-bundle/themes/base/minified/images/ui-bg_glass_65_ffffff_1x400.png create mode 100755 testData/compressed-jQueryUI-built-with-node-archiver/inflated/development-bundle/themes/base/minified/images/ui-bg_glass_75_dadada_1x400.png create mode 100755 testData/compressed-jQueryUI-built-with-node-archiver/inflated/development-bundle/themes/base/minified/images/ui-bg_glass_75_e6e6e6_1x400.png create mode 100755 testData/compressed-jQueryUI-built-with-node-archiver/inflated/development-bundle/themes/base/minified/images/ui-bg_glass_95_fef1ec_1x400.png create mode 100755 testData/compressed-jQueryUI-built-with-node-archiver/inflated/development-bundle/themes/base/minified/images/ui-bg_highlight-soft_75_cccccc_1x100.png create mode 100755 testData/compressed-jQueryUI-built-with-node-archiver/inflated/development-bundle/themes/base/minified/images/ui-icons_222222_256x240.png create mode 100755 testData/compressed-jQueryUI-built-with-node-archiver/inflated/development-bundle/themes/base/minified/images/ui-icons_2e83ff_256x240.png create mode 100755 testData/compressed-jQueryUI-built-with-node-archiver/inflated/development-bundle/themes/base/minified/images/ui-icons_454545_256x240.png create mode 100755 testData/compressed-jQueryUI-built-with-node-archiver/inflated/development-bundle/themes/base/minified/images/ui-icons_888888_256x240.png create mode 100755 testData/compressed-jQueryUI-built-with-node-archiver/inflated/development-bundle/themes/base/minified/images/ui-icons_cd0a0a_256x240.png create mode 100755 testData/compressed-jQueryUI-built-with-node-archiver/inflated/development-bundle/themes/base/minified/jquery-ui.min.css create mode 100755 testData/compressed-jQueryUI-built-with-node-archiver/inflated/development-bundle/themes/base/minified/jquery.ui.core.min.css create mode 100755 testData/compressed-jQueryUI-built-with-node-archiver/inflated/development-bundle/themes/base/minified/jquery.ui.theme.min.css create mode 100755 testData/compressed-jQueryUI-built-with-node-archiver/inflated/development-bundle/themes/no-theme/jquery-ui.css create mode 100755 testData/compressed-jQueryUI-built-with-node-archiver/inflated/development-bundle/themes/no-theme/jquery.ui.all.css create mode 100755 testData/compressed-jQueryUI-built-with-node-archiver/inflated/development-bundle/themes/no-theme/jquery.ui.base.css create mode 100755 testData/compressed-jQueryUI-built-with-node-archiver/inflated/development-bundle/themes/no-theme/jquery.ui.core.css create mode 100755 testData/compressed-jQueryUI-built-with-node-archiver/inflated/development-bundle/themes/no-theme/minified/jquery-ui.min.css create mode 100755 testData/compressed-jQueryUI-built-with-node-archiver/inflated/development-bundle/themes/no-theme/minified/jquery.ui.core.min.css create mode 100755 testData/compressed-jQueryUI-built-with-node-archiver/inflated/development-bundle/ui.core.jquery.json create mode 100755 testData/compressed-jQueryUI-built-with-node-archiver/inflated/development-bundle/ui/jquery-ui.custom.js create mode 100755 testData/compressed-jQueryUI-built-with-node-archiver/inflated/development-bundle/ui/jquery.ui.core.js create mode 100755 testData/compressed-jQueryUI-built-with-node-archiver/inflated/development-bundle/ui/minified/jquery-ui.custom.min.js create mode 100755 testData/compressed-jQueryUI-built-with-node-archiver/inflated/development-bundle/ui/minified/jquery.ui.core.min.js create mode 100755 testData/compressed-jQueryUI-built-with-node-archiver/inflated/index.html create mode 100755 testData/compressed-jQueryUI-built-with-node-archiver/inflated/js/jquery-1.9.1.js create mode 100755 testData/compressed-jQueryUI-built-with-node-archiver/inflated/js/jquery-ui-1.10.2.custom.js create mode 100755 testData/compressed-jQueryUI-built-with-node-archiver/inflated/js/jquery-ui-1.10.2.custom.min.js create mode 100644 testData/compressed-node-archiver/.DS_Store create mode 100644 testData/compressed-node-archiver/archive.zip create mode 100755 testData/compressed-node-archiver/inflated/dir1/dir1_file.txt create mode 100755 testData/compressed-node-archiver/inflated/file.txt create mode 100755 testData/compressed-node-archiver/inflated/file2.txt create mode 100644 testData/compressed-twitter-bootstrap/archive.zip create mode 100644 testData/compressed-twitter-bootstrap/inflated/css/bootstrap-responsive.css create mode 100644 testData/compressed-twitter-bootstrap/inflated/css/bootstrap-responsive.min.css create mode 100644 testData/compressed-twitter-bootstrap/inflated/css/bootstrap.css create mode 100644 testData/compressed-twitter-bootstrap/inflated/css/bootstrap.min.css create mode 100644 testData/compressed-twitter-bootstrap/inflated/img/glyphicons-halflings-white.png create mode 100644 testData/compressed-twitter-bootstrap/inflated/img/glyphicons-halflings.png create mode 100644 testData/compressed-twitter-bootstrap/inflated/js/bootstrap.js create mode 100644 testData/compressed-twitter-bootstrap/inflated/js/bootstrap.min.js diff --git a/test/compressed.js b/test/compressed.js index 4f598c7c..8a6e3400 100644 --- a/test/compressed.js +++ b/test/compressed.js @@ -5,45 +5,83 @@ var fs = require('fs'); var path = require('path'); var temp = require('temp'); var dirdiff = require('dirdiff'); +var streamBuffers = require("stream-buffers"); var unzip = require('../'); -test("parse compressed archive (created by POSIX zip)", function (t) { - var archive = path.join(__dirname, '../testData/compressed-standard/archive.zip'); - var unzipParser = unzip.Parse(); - fs.createReadStream(archive).pipe(unzipParser); - unzipParser.on('error', function(err) { - throw err; +function testParsing(filename) { + test('parse compressed archive: ' + filename, function(t) { + var archive = path.join(__dirname, '../testData/' + filename + '/archive.zip'); + + var unzipParser = unzip.Parse(); + fs.createReadStream(archive).pipe(unzipParser); + unzipParser.on('error', function(err) { + throw err; + }); + + unzipParser.on('close', t.end.bind(this)); }); +} - unzipParser.on('close', t.end.bind(this)); -}); +function testExtraction(filename) { + test('extract compressed archive: ' + filename, function(t) { + var archive = path.join(__dirname, '../testData/' + filename + '/archive.zip'); -test("extract compressed archive w/ file sizes known prior to zlib inflation (created by POSIX zip)", function (t) { - var archive = path.join(__dirname, '../testData/compressed-standard/archive.zip'); + temp.mkdir('node-unzip-', function(err, dirPath) { + if (err) { + throw err; + } + var unzipExtractor = unzip.Extract({ path: dirPath }); + unzipExtractor.on('error', function(err) { + throw err; + }); + unzipExtractor.on('close', testExtractionResults); - temp.mkdir('node-unzip-', function (err, dirPath) { - if (err) { - throw err; - } - var unzipExtractor = unzip.Extract({ path: dirPath }); - unzipExtractor.on('error', function(err) { - throw err; + fs.createReadStream(archive).pipe(unzipExtractor); + + function testExtractionResults() { + dirdiff(path.join(__dirname, '../testData/' + filename + '/inflated'), dirPath, { + fileContents: true + }, function(err, diffs) { + if (err) { + throw err; + } + t.equal(diffs.length, 0, 'extracted directory contents'); + t.end(); + }); + } }); - unzipExtractor.on('close', testExtractionResults); - - fs.createReadStream(archive).pipe(unzipExtractor); - - function testExtractionResults() { - dirdiff(path.join(__dirname, '../testData/compressed-standard/inflated'), dirPath, { - fileContents: true - }, function (err, diffs) { - if (err) { - throw err; - } - t.equal(diffs.length, 0, 'extracted directory contents'); - t.end(); - }); + }); +} + +// test all archive parsing and extraction +fs.readdir(path.join(__dirname, '../testData/'), function(err, files) { + files.forEach(function(filename) { + if (/^compressed/.test(filename)) { + testParsing(filename); + testExtraction(filename); } }); -}); \ No newline at end of file +}); + +test('pipe a single file entry out of a zip', function (t) { + var archive = path.join(__dirname, '../testData/compressed-standard/archive.zip'); + + fs.createReadStream(archive) + .pipe(unzip.Parse()) + .on('entry', function(entry) { + if (entry.path === 'file.txt') { + var writableStream = new streamBuffers.WritableStreamBuffer(); + writableStream.on('close', function () { + var str = writableStream.getContentsAsString('utf8'); + var fileStr = fs.readFileSync(path.join(__dirname, '../testData/compressed-standard/inflated/file.txt'), 'utf8') + t.equal(str, fileStr); + t.end(); + }); + entry.pipe(writableStream); + } else { + entry.autodrain(); + } + }); +}); + diff --git a/test/fileSizeUnknownFlag.js b/test/fileSizeUnknownFlag.js deleted file mode 100644 index a0f3af4f..00000000 --- a/test/fileSizeUnknownFlag.js +++ /dev/null @@ -1,78 +0,0 @@ -'use strict'; - -var test = require('tap').test; -var fs = require('fs'); -var path = require('path'); -var temp = require('temp'); -var dirdiff = require('dirdiff'); -var unzip = require('../'); - -test("parse archive w/ file size unknown flag set (created by OS X Finder)", function (t) { - var archive = path.join(__dirname, '../testData/compressed-OSX-Finder/archive.zip'); - - var unzipParser = unzip.Parse(); - fs.createReadStream(archive).pipe(unzipParser); - unzipParser.on('error', function(err) { - throw err; - }); - - unzipParser.on('close', t.end.bind(this)); -}); - -test("extract archive w/ file size unknown flag set (created by OS X Finder)", function (t) { - var archive = path.join(__dirname, '../testData/compressed-OSX-Finder/archive.zip'); - - temp.mkdir('node-unzip-', function (err, dirPath) { - if (err) { - throw err; - } - var unzipExtractor = unzip.Extract({ path: dirPath }); - unzipExtractor.on('error', function(err) { - throw err; - }); - unzipExtractor.on('close', testExtractionResults); - - fs.createReadStream(archive).pipe(unzipExtractor); - - function testExtractionResults() { - dirdiff(path.join(__dirname, '../testData/compressed-OSX-Finder/inflated'), dirPath, { - fileContents: true - }, function (err, diffs) { - if (err) { - throw err; - } - t.equal(diffs.length, 0, 'extracted directory contents'); - t.end(); - }); - } - }); -}); - -test("archive w/ language encoding flag set", function (t) { - var archive = path.join(__dirname, '../testData/compressed-flags-set/archive.zip'); - - temp.mkdir('node-unzip-', function (err, dirPath) { - if (err) { - throw err; - } - var unzipExtractor = unzip.Extract({ path: dirPath }); - unzipExtractor.on('error', function(err) { - throw err; - }); - unzipExtractor.on('close', testExtractionResults); - - fs.createReadStream(archive).pipe(unzipExtractor); - - function testExtractionResults() { - dirdiff(path.join(__dirname, '../testData/compressed-flags-set/inflated'), dirPath, { - fileContents: true - }, function (err, diffs) { - if (err) { - throw err; - } - t.equal(diffs.length, 0, 'extracted directory contents'); - t.end(); - }); - } - }); -}); \ No newline at end of file diff --git a/test/pipeSingleEntry.js b/test/pipeSingleEntry.js deleted file mode 100644 index d29b4eba..00000000 --- a/test/pipeSingleEntry.js +++ /dev/null @@ -1,29 +0,0 @@ -'use strict'; - -var test = require('tap').test; -var fs = require('fs'); -var path = require('path'); -var temp = require('temp'); -var streamBuffers = require("stream-buffers"); -var unzip = require('../'); - -test("pipe a single file entry out of a zip", function (t) { - var archive = path.join(__dirname, '../testData/compressed-standard/archive.zip'); - - fs.createReadStream(archive) - .pipe(unzip.Parse()) - .on('entry', function(entry) { - if (entry.path === 'file.txt') { - var writableStream = new streamBuffers.WritableStreamBuffer(); - writableStream.on('close', function () { - var str = writableStream.getContentsAsString('utf8'); - var fileStr = fs.readFileSync(path.join(__dirname, '../testData/compressed-standard/inflated/file.txt'), 'utf8') - t.equal(str, fileStr); - t.end(); - }); - entry.pipe(writableStream); - } else { - entry.autodrain(); - } - }); -}); \ No newline at end of file diff --git a/testData/compressed-OSX-Finder/archive.zip b/testData/compressed-OSX-Finder-Size-Unknown/archive.zip similarity index 100% rename from testData/compressed-OSX-Finder/archive.zip rename to testData/compressed-OSX-Finder-Size-Unknown/archive.zip diff --git a/testData/compressed-OSX-Finder/inflated/dir/fileInsideDir.txt b/testData/compressed-OSX-Finder-Size-Unknown/inflated/dir/fileInsideDir.txt similarity index 100% rename from testData/compressed-OSX-Finder/inflated/dir/fileInsideDir.txt rename to testData/compressed-OSX-Finder-Size-Unknown/inflated/dir/fileInsideDir.txt diff --git a/testData/compressed-OSX-Finder/inflated/file.txt b/testData/compressed-OSX-Finder-Size-Unknown/inflated/file.txt similarity index 100% rename from testData/compressed-OSX-Finder/inflated/file.txt rename to testData/compressed-OSX-Finder-Size-Unknown/inflated/file.txt diff --git a/testData/compressed-jQueryUI-built-with-node-archiver/archive.zip b/testData/compressed-jQueryUI-built-with-node-archiver/archive.zip new file mode 100644 index 0000000000000000000000000000000000000000..5083ee3b15b061a3fddc035d6980955121746e70 GIT binary patch literal 340150 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 ~1XbyX01V@$0v+=*?ic}U*w6S| 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
>L}T^C%+g^rYIGeC~09=$t} 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

MdG-~@j<16IeFqjUOZpUD<|9`4bz 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 g7m$CLioZTluAz#I^5w@=fEPLg2$X~g +Richard Worth +Yehuda Katz +Sean Catchpole +John Resig +Tane Piper +Dmitri Gaskin +Klaus Hartl +Stefan Petre +Gilles van den Hoven +Micheil Bryan Smith +Jörn Zaefferer +Marc Grabanski +Keith Wood +Brandon Aaron +Scott González +Eduardo Lundgren +Aaron Eisenberger +Joan Piedra +Bruno Basto +Remy Sharp +Bohdan Ganicky +David Bolter +Chi Cheng +Ca-Phun Ung +Ariel Flesler +Maggie Costello Wachs +Scott Jehl +Todd Parker +Andrew Powell +Brant Burnett +Douglas Neiner +Paul Irish +Ralph Whitbeck +Thibault Duplessis +Dominique Vincent +Jack Hsu +Adam Sontag +Carl Fürstenberg +Kevin Dalman +Alberto Fernández Capel +Jacek Jędrzejewski (http://jacek.jedrzejewski.name) +Ting Kuei +Samuel Cormier-Iijima +Jon Palmer +Ben Hollis +Justin MacCarthy +Eyal Kobrigo +Tiago Freire +Diego Tres +Holger Rüprich +Ziling Zhao +Mike Alsup +Robson Braga Araujo +Pierre-Henri Ausseil +Christopher McCulloh +Andrew Newcomb +Lim Chee Aun +Jorge Barreiro +Daniel Steigerwald +John Firebaugh +John Enters +Andrey Kapitcyn +Dmitry Petrov +Eric Hynds +Chairat Sunthornwiphat +Josh Varner +Stéphane Raimbault +Jay Merrifield +J. Ryan Stinnett +Peter Heiberg +Alex Dovenmuehle +Jamie Gegerson +Raymond Schwartz +Phillip Barnes +Kyle Wilkinson +Khaled AlHourani +Marian Rudzynski +Jean-Francois Remy +Doug Blood +Filippo Cavallarin +Heiko Henning +Aliaksandr Rahalevich +Mario Visic +Xavi Ramirez +Max Schnur +Saji Nediyanchath +Corey Frang +Aaron Peterson +Ivan Peters +Mohamed Cherif Bouchelaghem +Marcos Sousa +Michael DellaNoce +George Marshall +Tobias Brunner +Martin Solli +David Petersen +Dan Heberden +William Kevin Manire +Gilmore Davidson +Michael Wu +Adam Parod +Guillaume Gautreau +Marcel Toele +Dan Streetman +Matt Hoskins +Giovanni Giacobbi +Kyle Florence +Pavol Hluchý +Hans Hillen +Mark Johnson +Trey Hunner +Shane Whittet +Edward A Faulkner +Adam Baratz +Kato Kazuyoshi +Eike Send +Kris Borchers +Eddie Monge +Israel Tsadok +Carson McDonald +Jason Davies +Garrison Locke +David Murdoch +Benjamin Scott Boyle +Jesse Baird +Jonathan Vingiano +Dylan Just +Hiroshi Tomita +Glenn Goodrich +Tarafder Ashek-E-Elahi +Ryan Neufeld +Marc Neuwirth +Philip Graham +Benjamin Sterling +Wesley Walser +Kouhei Sutou +Karl Kirch +Chris Kelly +Jay Oster +Alexander Polomoshnov +David Leal +Igor Milla +Dave Methvin +Florian Gutmann +Marwan Al Jubeh +Milan Broum +Sebastian Sauer +Gaëtan Muller +Michel Weimerskirch +William Griffiths +Stojce Slavkovski +David Soms +David De Sloovere +Michael P. Jung +Shannon Pekary +Matthew Edward Hutton +James Khoury +Rob Loach +Alberto Monteiro +Alex Rhea +Krzysztof Rosiński +Ryan Olton +Genie <386@mail.com> +Rick Waldron +Ian Simpson +Lev Kitsis +TJ VanToll +Justin Domnitz +Douglas Cerna +Bert ter Heide +Jasvir Nagra +Petr Hromadko +Harri Kilpiö +Lado Lomidze +Amir E. Aharoni +Simon Sattes +Jo Liss +Guntupalli Karunakar +Shahyar Ghobadpour +Lukasz Lipinski +Timo Tijhof +Jason Moon +Martin Frost +Eneko Illarramendi +EungJun Yi +Courtland Allen +Viktar Varvanovich +Danny Trunk +Pavel Stetina +Michael Stay +Steven Roussey +Michael Hollis +Lee Rowlands +Timmy Willison +Karl Swedberg +Baoju Yuan +Maciej Mroziński +Luis Dalmolin +Mark Aaron Shirley +Martin Hoch +Jiayi Yang +Philipp Benjamin Köppchen +Sindre Sorhus +Bernhard Sirlinger +Jared A. Scheel +Rafael Xavier de Souza +John Chen +Dale Kocian +Mike Sherov +Andrew Couch +Marc-Andre Lafortune +Nate Eagle +David Souther +Mathias Stenbom +Sergey Kartashov +Avinash R +Ethan Romba +Cory Gackenheimer +Juan Pablo Kaniefsky +Roman Salnikov +Anika Henke +Samuel Bovée +Fabrício Matté +Viktor Kojouharov +Pawel Maruszczyk +Pavel Selitskas +Bjørn Johansen +Matthieu Penant +Dominic Barnes +David Sullivan +Thomas Jaggi +Vahid Sohrabloo +Travis Carden +Bruno M. Custódio +Nathanael Silverman +Christian Wenz +Steve Urmston +Zaven Muradyan diff --git a/testData/compressed-jQueryUI-built-with-node-archiver/inflated/development-bundle/Gruntfile.js b/testData/compressed-jQueryUI-built-with-node-archiver/inflated/development-bundle/Gruntfile.js new file mode 100755 index 00000000..ff64f0c0 --- /dev/null +++ b/testData/compressed-jQueryUI-built-with-node-archiver/inflated/development-bundle/Gruntfile.js @@ -0,0 +1,378 @@ +module.exports = function( grunt ) { + +"use strict"; + +var + // files + coreFiles = [ + "jquery.ui.core.js", + "jquery.ui.widget.js", + "jquery.ui.mouse.js", + "jquery.ui.draggable.js", + "jquery.ui.droppable.js", + "jquery.ui.resizable.js", + "jquery.ui.selectable.js", + "jquery.ui.sortable.js", + "jquery.ui.effect.js" + ], + + uiFiles = coreFiles.map(function( file ) { + return "ui/" + file; + }).concat( expandFiles( "ui/*.js" ).filter(function( file ) { + return coreFiles.indexOf( file.substring(3) ) === -1; + })), + + allI18nFiles = expandFiles( "ui/i18n/*.js" ), + + cssFiles = [ + "core", + "accordion", + "autocomplete", + "button", + "datepicker", + "dialog", + "menu", + "progressbar", + "resizable", + "selectable", + "slider", + "spinner", + "tabs", + "tooltip", + "theme" + ].map(function( component ) { + return "themes/base/jquery.ui." + component + ".css"; + }), + + // minified files + minify = { + options: { + preserveComments: false + }, + main: { + options: { + banner: createBanner( uiFiles ) + }, + files: { + "dist/jquery-ui.min.js": "dist/jquery-ui.js" + } + }, + i18n: { + options: { + banner: createBanner( allI18nFiles ) + }, + files: { + "dist/i18n/jquery-ui-i18n.min.js": "dist/i18n/jquery-ui-i18n.js" + } + } + }, + + minifyCSS = { + options: { + keepSpecialComments: 0 + }, + main: { + options: { + keepSpecialComments: '*' + }, + src: "dist/jquery-ui.css", + dest: "dist/jquery-ui.min.css" + } + }, + + compareFiles = { + all: [ + "dist/jquery-ui.js", + "dist/jquery-ui.min.js" + ] + }; + +function mapMinFile( file ) { + return "dist/" + file.replace( /\.js$/, ".min.js" ).replace( /ui\//, "minified/" ); +} + +function expandFiles( files ) { + return grunt.util._.pluck( grunt.file.expandMapping( files ), "src" ).map(function( values ) { + return values[ 0 ]; + }); +} + +uiFiles.concat( allI18nFiles ).forEach(function( file ) { + minify[ file ] = { + options: { + banner: createBanner() + }, + files: {} + }; + minify[ file ].files[ mapMinFile( file ) ] = file; +}); + +cssFiles.forEach(function( file ) { + minifyCSS[ file ] = { + options: { + banner: createBanner() + }, + src: file, + dest: "dist/" + file.replace( /\.css$/, ".min.css" ).replace( /themes\/base\//, "themes/base/minified/" ) + }; +}); + +uiFiles.forEach(function( file ) { + // TODO this doesn't do anything until https://github.com/rwldrn/grunt-compare-size/issues/13 + compareFiles[ file ] = [ file, mapMinFile( file ) ]; +}); + +// grunt plugins +grunt.loadNpmTasks( "grunt-contrib-jshint" ); +grunt.loadNpmTasks( "grunt-contrib-uglify" ); +grunt.loadNpmTasks( "grunt-contrib-concat" ); +grunt.loadNpmTasks( "grunt-contrib-qunit" ); +grunt.loadNpmTasks( "grunt-contrib-csslint" ); +grunt.loadNpmTasks( "grunt-contrib-cssmin" ); +grunt.loadNpmTasks( "grunt-html" ); +grunt.loadNpmTasks( "grunt-compare-size" ); +grunt.loadNpmTasks( "grunt-git-authors" ); +// local testswarm and build tasks +grunt.loadTasks( "build/tasks" ); + +function stripDirectory( file ) { + return file.replace( /.+\/(.+?)>?$/, "$1" ); +} + +function createBanner( files ) { + // strip folders + var fileNames = files && files.map( stripDirectory ); + return "/*! <%= pkg.title || pkg.name %> - v<%= pkg.version %> - " + + "<%= grunt.template.today('isoDate') %>\n" + + "<%= pkg.homepage ? '* ' + pkg.homepage + '\\n' : '' %>" + + (files ? "* Includes: " + fileNames.join(", ") + "\n" : "")+ + "* Copyright <%= grunt.template.today('yyyy') %> <%= pkg.author.name %>;" + + " Licensed <%= _.pluck(pkg.licenses, 'type').join(', ') %> */\n"; +} + +grunt.initConfig({ + pkg: grunt.file.readJSON("package.json"), + files: { + dist: "<%= pkg.name %>-<%= pkg.version %>", + cdn: "<%= pkg.name %>-<%= pkg.version %>-cdn", + themes: "<%= pkg.name %>-themes-<%= pkg.version %>" + }, + compare_size: compareFiles, + concat: { + ui: { + options: { + banner: createBanner( uiFiles ), + stripBanners: { + block: true + } + }, + src: uiFiles, + dest: "dist/jquery-ui.js" + }, + i18n: { + options: { + banner: createBanner( allI18nFiles ) + }, + src: allI18nFiles, + dest: "dist/i18n/jquery-ui-i18n.js" + }, + css: { + options: { + banner: createBanner( cssFiles ), + stripBanners: { + block: true + } + }, + src: cssFiles, + dest: "dist/jquery-ui.css" + } + }, + uglify: minify, + cssmin: minifyCSS, + htmllint: { + // ignore files that contain invalid html, used only for ajax content testing + all: grunt.file.expand( [ "demos/**/*.html", "tests/**/*.html" ] ).filter(function( file ) { + return !/(?:ajax\/content\d\.html|tabs\/data\/test\.html|tests\/unit\/core\/core\.html)/.test( file ); + }) + }, + copy: { + dist: { + src: [ + "AUTHORS.txt", + "jquery-*.js", + "MIT-LICENSE.txt", + "README.md", + "Gruntfile.js", + "package.json", + "*.jquery.json", + "ui/**/*", + "ui/.jshintrc", + "demos/**/*", + "themes/**/*", + "external/**/*", + "tests/**/*" + ], + renames: { + "dist/jquery-ui.js": "ui/jquery-ui.js", + "dist/jquery-ui.min.js": "ui/minified/jquery-ui.min.js", + "dist/i18n/jquery-ui-i18n.js": "ui/i18n/jquery-ui-i18n.js", + "dist/i18n/jquery-ui-i18n.min.js": "ui/minified/i18n/jquery-ui-i18n.min.js", + "dist/jquery-ui.css": "themes/base/jquery-ui.css", + "dist/jquery-ui.min.css": "themes/base/minified/jquery-ui.min.css" + }, + dest: "dist/<%= files.dist %>" + }, + dist_min: { + src: "dist/minified/**/*", + strip: /^dist/, + dest: "dist/<%= files.dist %>/ui" + }, + dist_css_min: { + src: "dist/themes/base/minified/*.css", + strip: /^dist/, + dest: "dist/<%= files.dist %>" + }, + dist_units_images: { + src: "themes/base/images/*", + strip: /^themes\/base\//, + dest: "dist/" + }, + dist_min_images: { + src: "themes/base/images/*", + strip: /^themes\/base\//, + dest: "dist/<%= files.dist %>/themes/base/minified" + }, + cdn: { + src: [ + "AUTHORS.txt", + "MIT-LICENSE.txt", + "ui/*.js", + "package.json" + ], + renames: { + "dist/jquery-ui.js": "jquery-ui.js", + "dist/jquery-ui.min.js": "jquery-ui.min.js", + "dist/i18n/jquery-ui-i18n.js": "i18n/jquery-ui-i18n.js", + "dist/i18n/jquery-ui-i18n.min.js": "i18n/jquery-ui-i18n.min.js" + }, + dest: "dist/<%= files.cdn %>" + }, + cdn_i18n: { + src: "ui/i18n/jquery.ui.datepicker-*.js", + strip: "ui/", + dest: "dist/<%= files.cdn %>" + }, + cdn_i18n_min: { + src: "dist/minified/i18n/jquery.ui.datepicker-*.js", + strip: "dist/minified", + dest: "dist/<%= files.cdn %>" + }, + cdn_min: { + src: "dist/minified/*.js", + strip: /^dist\/minified/, + dest: "dist/<%= files.cdn %>/ui" + }, + cdn_themes: { + src: "dist/<%= files.themes %>/themes/**/*", + strip: "dist/<%= files.themes %>", + dest: "dist/<%= files.cdn %>" + }, + themes: { + src: [ + "AUTHORS.txt", + "MIT-LICENSE.txt", + "package.json" + ], + dest: "dist/<%= files.themes %>" + } + }, + zip: { + dist: { + src: "<%= files.dist %>", + dest: "<%= files.dist %>.zip" + }, + cdn: { + src: "<%= files.cdn %>", + dest: "<%= files.cdn %>.zip" + }, + themes: { + src: "<%= files.themes %>", + dest: "<%= files.themes %>.zip" + } + }, + md5: { + dist: { + src: "dist/<%= files.dist %>", + dest: "dist/<%= files.dist %>/MANIFEST" + }, + cdn: { + src: "dist/<%= files.cdn %>", + dest: "dist/<%= files.cdn %>/MANIFEST" + }, + themes: { + src: "dist/<%= files.themes %>", + dest: "dist/<%= files.themes %>/MANIFEST" + } + }, + qunit: { + files: expandFiles( "tests/unit/**/*.html" ).filter(function( file ) { + // disabling everything that doesn't (quite) work with PhantomJS for now + // TODO except for all|index|test, try to include more as we go + return !( /(all|index|test|dialog|dialog_deprecated|tabs|tooltip)\.html$/ ).test( file ); + }) + }, + jshint: { + ui: { + options: { + jshintrc: "ui/.jshintrc" + }, + files: { + src: "ui/*.js" + } + }, + grunt: { + options: { + jshintrc: ".jshintrc" + }, + files: { + src: [ "Gruntfile.js", "build/**/*.js" ] + } + }, + tests: { + options: { + jshintrc: "tests/.jshintrc" + }, + files: { + src: "tests/unit/**/*.js" + } + } + }, + csslint: { + // TODO figure out what to check for, then fix and enable + base_theme: { + src: expandFiles( "themes/base/*.css" ).filter(function( file ) { + // TODO remove items from this list once rewritten + return !( /(button|datepicker|core|dialog|theme)\.css$/ ).test( file ); + }), + // TODO consider reenabling some of these rules + options: { + "adjoining-classes": false, + "import": false, + "outline-none": false, + // especially this one + "overqualified-elements": false, + "compatible-vendor-prefixes": false + } + } + } +}); + +grunt.registerTask( "default", [ "jshint", "csslint", "htmllint", "qunit" ] ); +grunt.registerTask( "sizer", [ "concat:ui", "uglify:main", "compare_size:all" ] ); +grunt.registerTask( "sizer_all", [ "concat:ui", "uglify", "compare_size" ] ); +grunt.registerTask( "build", [ "concat", "uglify", "cssmin", "copy:dist_units_images" ] ); +grunt.registerTask( "release", "clean build copy:dist copy:dist_min copy:dist_min_images copy:dist_css_min md5:dist zip:dist".split( " " ) ); +grunt.registerTask( "release_themes", "release generate_themes copy:themes md5:themes zip:themes".split( " " ) ); +grunt.registerTask( "release_cdn", "release_themes copy:cdn copy:cdn_min copy:cdn_i18n copy:cdn_i18n_min copy:cdn_themes md5:cdn zip:cdn".split( " " ) ); + +}; diff --git a/testData/compressed-jQueryUI-built-with-node-archiver/inflated/development-bundle/MIT-LICENSE.txt b/testData/compressed-jQueryUI-built-with-node-archiver/inflated/development-bundle/MIT-LICENSE.txt new file mode 100755 index 00000000..1c693e3d --- /dev/null +++ b/testData/compressed-jQueryUI-built-with-node-archiver/inflated/development-bundle/MIT-LICENSE.txt @@ -0,0 +1,26 @@ +Copyright 2013 jQuery Foundation and other contributors, +http://jqueryui.com/ + +This software consists of voluntary contributions made by many +individuals (AUTHORS.txt, http://jqueryui.com/about) For exact +contribution history, see the revision history and logs, available +at http://jquery-ui.googlecode.com/svn/ + +Permission is hereby granted, free of charge, to any person obtaining +a copy of this software and associated documentation files (the +"Software"), to deal in the Software without restriction, including +without limitation the rights to use, copy, modify, merge, publish, +distribute, sublicense, and/or sell copies of the Software, and to +permit persons to whom the Software is furnished to do so, subject to +the following conditions: + +The above copyright notice and this permission notice shall be +included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE +LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION +OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION +WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. diff --git a/testData/compressed-jQueryUI-built-with-node-archiver/inflated/development-bundle/README.md b/testData/compressed-jQueryUI-built-with-node-archiver/inflated/development-bundle/README.md new file mode 100755 index 00000000..e7ae90e8 --- /dev/null +++ b/testData/compressed-jQueryUI-built-with-node-archiver/inflated/development-bundle/README.md @@ -0,0 +1,99 @@ +[jQuery UI](http://jqueryui.com/) - Interactions and Widgets for the web +================================ + +jQuery UI provides interactions like Drag and Drop and widgets like Autocomplete, Tabs and Slider and makes these as easy to use as jQuery itself. + +If you want to use jQuery UI, go to [jqueryui.com](http://jqueryui.com) to get started. Or visit the [Using jQuery UI Forum](http://forum.jquery.com/using-jquery-ui) for discussions and questions. + +If you are interested in helping develop jQuery UI, you are in the right place. +To discuss development with team members and the community, visit the [Developing jQuery UI Forum](http://forum.jquery.com/developing-jquery-ui) or in #jquery on irc.freednode.net. + + +For contributors +--- + +If you want to help and provide a patch for a bugfix or new feature, please take +a few minutes and look at [our Getting Involved guide](http://wiki.jqueryui.com/w/page/35263114/Getting-Involved). +In particular check out the [Coding standards](http://wiki.jqueryui.com/w/page/12137737/Coding-standards) +and [Commit Message Style Guide](http://wiki.jqueryui.com/w/page/25941597/Commit-Message-Style-Guide). + +In general, fork the project, create a branch for a specific change and send a +pull request for that branch. Don't mix unrelated changes. You can use the commit +message as the description for the pull request. + + +Running the Unit Tests +--- + +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 jQuery UI +--- + +jQuery UI uses the [grunt](http://github.com/cowboy/grunt) build system. Building jQuery UI requires node.js and a command line zip program. + +Install grunt. + +`npm install grunt -g` + +Clone the jQuery UI git repo. + +`git clone git://github.com/jquery/jquery-ui.git` + +`cd jquery-ui` + +Install node modules. + +`npm install` + +Run grunt. + +`grunt build` + +There are many other tasks that can be run through grunt. For a list of all tasks: + +`grunt --help` + + +For committers +--- + +When looking at pull requests, first check for [proper commit messages](http://wiki.jqueryui.com/w/page/12137724/Bug-Fixing-Guide). + +Do not merge pull requests directly through GitHub's interface. +Most pull requests are a single commit; cherry-picking will avoid creating a merge commit. +It's also common for contributors to make minor fixes in an additional one or two commits. +These should be squashed before landing in master. + +**Make sure the author has a valid name and email address associated with the commit.** + +Fetch the remote first: + + git fetch [their-fork.git] [their-branch] + +Then cherry-pick the commit(s): + + git cherry-pick [sha-of-commit] + +If you need to edit the commit message: + + git cherry-pick -e [sha-of-commit] + +If you need to edit the changes: + + git cherry-pick -n [sha-of-commit] + # make changes + git commit --author="[author-name-and-email]" + +If it should go to the stable brach, cherry-pick it to stable: + + git checkout 1-8-stable + git cherry-pick -x [sha-of-commit-from-master] + +*NOTE: Do not cherry-pick into 1-8-stable until you have pushed the commit from master upstream.* diff --git a/testData/compressed-jQueryUI-built-with-node-archiver/inflated/development-bundle/demos/demos.css b/testData/compressed-jQueryUI-built-with-node-archiver/inflated/development-bundle/demos/demos.css new file mode 100755 index 00000000..da9ad833 --- /dev/null +++ b/testData/compressed-jQueryUI-built-with-node-archiver/inflated/development-bundle/demos/demos.css @@ -0,0 +1,19 @@ +body { + font-size: 62.5%; + font-family: "Trebuchet MS", "Arial", "Helvetica", "Verdana", "sans-serif"; +} + +table { + font-size: 1em; +} + +.demo-description { + clear: both; + padding: 12px; + font-size: 1.3em; + line-height: 1.4em; +} + +.ui-draggable, .ui-droppable { + background-position: top; +} diff --git a/testData/compressed-jQueryUI-built-with-node-archiver/inflated/development-bundle/demos/images/calendar.gif b/testData/compressed-jQueryUI-built-with-node-archiver/inflated/development-bundle/demos/images/calendar.gif new file mode 100755 index 0000000000000000000000000000000000000000..d0abaa7c0b892e781b6f553453a0027efea014b9 GIT binary patch literal 269 zcmZ?wbhEHb6kyoJ#dt% zaYstuiRe5}O|8;NEA%ba6j)5k7TbN(gNwC&D)Y{1Cu2PhDy(ymnp7_1Ai(k{X>FbJ zg$yQ1aX#U+v{)u7c4kS5=DdO;0Y*k<=8BdGnYaWYcOkak83LIJ0`39}`h<8zSFc^O QT3n!+Z|k=0I}{nL0T`orxBvhE literal 0 HcmV?d00001 diff --git a/testData/compressed-jQueryUI-built-with-node-archiver/inflated/development-bundle/demos/images/demo-config-on-tile.gif b/testData/compressed-jQueryUI-built-with-node-archiver/inflated/development-bundle/demos/images/demo-config-on-tile.gif new file mode 100755 index 0000000000000000000000000000000000000000..a96b5bf33adfb9673d05a917b229771725998ef4 GIT binary patch literal 172 zcmZ?wbh9u|WMW8R_#(*gZL<821$y77DSw}({(Xk(&lMIwmzw;Tr~7lY&9Ak#-=-@5 zTyFMbk-^VZR^R7pf1j=SYn}a%#YPN7109e`kX;O{h6*ZuDVg&!R;^nzQ-$M_iR(t4 mHbGY&VV3sh!yhYn*jSnz76dTNyRf3fYi-o}8*fZl7_0%-_c%cS literal 0 HcmV?d00001 diff --git a/testData/compressed-jQueryUI-built-with-node-archiver/inflated/development-bundle/demos/images/demo-config-on.gif b/testData/compressed-jQueryUI-built-with-node-archiver/inflated/development-bundle/demos/images/demo-config-on.gif new file mode 100755 index 0000000000000000000000000000000000000000..e3b6d7c0f723648fcd5d7b23b470d4c58d4d9b13 GIT binary patch literal 335 zcmZ?wbh9u|9ihti+ z`}^$F&$R(RS2_MzY5!xf#ozl|f9@&%`*8b@g=YWW-Tbl4`tQrLKlhgY|NsBT0zC$b zfey$7kY60wN*tyXc<4y=pI9>Kp`^w9qon8M+tBFjE&7LNqe`~^&c hj7yd-aS~HzTfN$aL6m!=ySilew(UE1MmjQB0{}?lkB$HU literal 0 HcmV?d00001 diff --git a/testData/compressed-jQueryUI-built-with-node-archiver/inflated/development-bundle/demos/images/demo-spindown-closed.gif b/testData/compressed-jQueryUI-built-with-node-archiver/inflated/development-bundle/demos/images/demo-spindown-closed.gif new file mode 100755 index 0000000000000000000000000000000000000000..ad4bd3781b52d9681013c66b341a674ca6df1153 GIT binary patch literal 103 zcmZ?wbhEHbWMg1w_{_!7+uOTu-@bM0*3FwYueG&x*|KH#?%jL;{{6Xg=W1(f|NsBb tfC?0Uvam8Ra53nBgh6IFu!smKxQ6ahxiR|)quW;AhsPMh3j+ihtN~u^Bk%wK literal 0 HcmV?d00001 diff --git a/testData/compressed-jQueryUI-built-with-node-archiver/inflated/development-bundle/demos/images/demo-spindown-open.gif b/testData/compressed-jQueryUI-built-with-node-archiver/inflated/development-bundle/demos/images/demo-spindown-open.gif new file mode 100755 index 0000000000000000000000000000000000000000..e1c60aa558ebc4701d66d89c893b9185d92926ae GIT binary patch literal 105 zcmZ?wbhEHbWM^Pw*v!Rn?%cV3`}VC{w{G6Nd9AIj%a$#>ckkZ&_wRdqduwZJ|NsBb vfC?0UvM@3*a53nBgh6I7u!spPwVb$6c!g7Y5WAt|d?6L5pNhxD85yhrk)R_C literal 0 HcmV?d00001 diff --git a/testData/compressed-jQueryUI-built-with-node-archiver/inflated/development-bundle/demos/images/icon-docs-info.gif b/testData/compressed-jQueryUI-built-with-node-archiver/inflated/development-bundle/demos/images/icon-docs-info.gif new file mode 100755 index 0000000000000000000000000000000000000000..ea6d2bece713351eb4b8eef968c3891322093624 GIT binary patch literal 206 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 GZ~qHVLrA>< literal 0 HcmV?d00001 diff --git a/testData/compressed-jQueryUI-built-with-node-archiver/inflated/development-bundle/external/globalize.culture.de-DE.js b/testData/compressed-jQueryUI-built-with-node-archiver/inflated/development-bundle/external/globalize.culture.de-DE.js new file mode 100755 index 00000000..5466bd75 --- /dev/null +++ b/testData/compressed-jQueryUI-built-with-node-archiver/inflated/development-bundle/external/globalize.culture.de-DE.js @@ -0,0 +1,81 @@ +/* + * Globalize Culture de-DE + * + * http://github.com/jquery/globalize + * + * Copyright Software Freedom Conservancy, Inc. + * Dual licensed under the MIT or GPL Version 2 licenses. + * http://jquery.org/license + * + * This file was generated by the Globalize Culture Generator + * Translation: bugs found in this file need to be fixed in the generator + */ + +(function( window, undefined ) { + +var Globalize; + +if ( typeof require !== "undefined" + && typeof exports !== "undefined" + && typeof module !== "undefined" ) { + // Assume CommonJS + Globalize = require( "globalize" ); +} else { + // Global variable + Globalize = window.Globalize; +} + +Globalize.addCultureInfo( "de-DE", "default", { + name: "de-DE", + englishName: "German (Germany)", + nativeName: "Deutsch (Deutschland)", + language: "de", + numberFormat: { + ",": ".", + ".": ",", + NaN: "n. def.", + negativeInfinity: "-unendlich", + positiveInfinity: "+unendlich", + percent: { + pattern: ["-n%","n%"], + ",": ".", + ".": "," + }, + currency: { + pattern: ["-n $","n $"], + ",": ".", + ".": ",", + symbol: "€" + } + }, + calendars: { + standard: { + "/": ".", + firstDay: 1, + days: { + names: ["Sonntag","Montag","Dienstag","Mittwoch","Donnerstag","Freitag","Samstag"], + namesAbbr: ["So","Mo","Di","Mi","Do","Fr","Sa"], + namesShort: ["So","Mo","Di","Mi","Do","Fr","Sa"] + }, + months: { + names: ["Januar","Februar","März","April","Mai","Juni","Juli","August","September","Oktober","November","Dezember",""], + namesAbbr: ["Jan","Feb","Mrz","Apr","Mai","Jun","Jul","Aug","Sep","Okt","Nov","Dez",""] + }, + AM: null, + PM: null, + eras: [{"name":"n. Chr.","start":null,"offset":0}], + patterns: { + d: "dd.MM.yyyy", + D: "dddd, d. MMMM yyyy", + t: "HH:mm", + T: "HH:mm:ss", + f: "dddd, d. MMMM yyyy HH:mm", + F: "dddd, d. MMMM yyyy HH:mm:ss", + M: "dd MMMM", + Y: "MMMM yyyy" + } + } + } +}); + +}( this )); diff --git a/testData/compressed-jQueryUI-built-with-node-archiver/inflated/development-bundle/external/globalize.culture.ja-JP.js b/testData/compressed-jQueryUI-built-with-node-archiver/inflated/development-bundle/external/globalize.culture.ja-JP.js new file mode 100755 index 00000000..a9469d70 --- /dev/null +++ b/testData/compressed-jQueryUI-built-with-node-archiver/inflated/development-bundle/external/globalize.culture.ja-JP.js @@ -0,0 +1,100 @@ +/* + * Globalize Culture ja-JP + * + * http://github.com/jquery/globalize + * + * Copyright Software Freedom Conservancy, Inc. + * Dual licensed under the MIT or GPL Version 2 licenses. + * http://jquery.org/license + * + * This file was generated by the Globalize Culture Generator + * Translation: bugs found in this file need to be fixed in the generator + */ + +(function( window, undefined ) { + +var Globalize; + +if ( typeof require !== "undefined" + && typeof exports !== "undefined" + && typeof module !== "undefined" ) { + // Assume CommonJS + Globalize = require( "globalize" ); +} else { + // Global variable + Globalize = window.Globalize; +} + +Globalize.addCultureInfo( "ja-JP", "default", { + name: "ja-JP", + englishName: "Japanese (Japan)", + nativeName: "日本語 (日本)", + language: "ja", + numberFormat: { + NaN: "NaN (非数値)", + negativeInfinity: "-∞", + positiveInfinity: "+∞", + percent: { + pattern: ["-n%","n%"] + }, + currency: { + pattern: ["-$n","$n"], + decimals: 0, + symbol: "¥" + } + }, + calendars: { + standard: { + days: { + names: ["日曜日","月曜日","火曜日","水曜日","木曜日","金曜日","土曜日"], + namesAbbr: ["日","月","火","水","木","金","土"], + namesShort: ["日","月","火","水","木","金","土"] + }, + months: { + names: ["1月","2月","3月","4月","5月","6月","7月","8月","9月","10月","11月","12月",""], + namesAbbr: ["1","2","3","4","5","6","7","8","9","10","11","12",""] + }, + AM: ["午前","午前","午前"], + PM: ["午後","午後","午後"], + eras: [{"name":"西暦","start":null,"offset":0}], + patterns: { + d: "yyyy/MM/dd", + D: "yyyy'年'M'月'd'日'", + t: "H:mm", + T: "H:mm:ss", + f: "yyyy'年'M'月'd'日' H:mm", + F: "yyyy'年'M'月'd'日' H:mm:ss", + M: "M'月'd'日'", + Y: "yyyy'年'M'月'" + } + }, + Japanese: { + name: "Japanese", + days: { + names: ["日曜日","月曜日","火曜日","水曜日","木曜日","金曜日","土曜日"], + namesAbbr: ["日","月","火","水","木","金","土"], + namesShort: ["日","月","火","水","木","金","土"] + }, + months: { + names: ["1月","2月","3月","4月","5月","6月","7月","8月","9月","10月","11月","12月",""], + namesAbbr: ["1","2","3","4","5","6","7","8","9","10","11","12",""] + }, + AM: ["午前","午前","午前"], + PM: ["午後","午後","午後"], + eras: [{"name":"平成","start":null,"offset":1867},{"name":"昭和","start":-1812153600000,"offset":1911},{"name":"大正","start":-1357603200000,"offset":1925},{"name":"明治","start":60022080000,"offset":1988}], + twoDigitYearMax: 99, + patterns: { + d: "gg y/M/d", + D: "gg y'年'M'月'd'日'", + t: "H:mm", + T: "H:mm:ss", + f: "gg y'年'M'月'd'日' H:mm", + F: "gg y'年'M'月'd'日' H:mm:ss", + M: "M'月'd'日'", + Y: "gg y'年'M'月'" + } + } + } +}); + +}( this )); diff --git a/testData/compressed-jQueryUI-built-with-node-archiver/inflated/development-bundle/external/globalize.js b/testData/compressed-jQueryUI-built-with-node-archiver/inflated/development-bundle/external/globalize.js new file mode 100755 index 00000000..ebaca174 --- /dev/null +++ b/testData/compressed-jQueryUI-built-with-node-archiver/inflated/development-bundle/external/globalize.js @@ -0,0 +1,1573 @@ +/*! + * Globalize + * + * http://github.com/jquery/globalize + * + * Copyright Software Freedom Conservancy, Inc. + * Dual licensed under the MIT or GPL Version 2 licenses. + * http://jquery.org/license + */ + +(function( window, undefined ) { + +var Globalize, + // private variables + regexHex, + regexInfinity, + regexParseFloat, + regexTrim, + // private JavaScript utility functions + arrayIndexOf, + endsWith, + extend, + isArray, + isFunction, + isObject, + startsWith, + trim, + truncate, + zeroPad, + // private Globalization utility functions + appendPreOrPostMatch, + expandFormat, + formatDate, + formatNumber, + getTokenRegExp, + getEra, + getEraYear, + parseExact, + parseNegativePattern; + +// Global variable (Globalize) or CommonJS module (globalize) +Globalize = function( cultureSelector ) { + return new Globalize.prototype.init( cultureSelector ); +}; + +if ( typeof require !== "undefined" + && typeof exports !== "undefined" + && typeof module !== "undefined" ) { + // Assume CommonJS + module.exports = Globalize; +} else { + // Export as global variable + window.Globalize = Globalize; +} + +Globalize.cultures = {}; + +Globalize.prototype = { + constructor: Globalize, + init: function( cultureSelector ) { + this.cultures = Globalize.cultures; + this.cultureSelector = cultureSelector; + + return this; + } +}; +Globalize.prototype.init.prototype = Globalize.prototype; + +// 1. When defining a culture, all fields are required except the ones stated as optional. +// 2. Each culture should have a ".calendars" object with at least one calendar named "standard" +// which serves as the default calendar in use by that culture. +// 3. Each culture should have a ".calendar" object which is the current calendar being used, +// it may be dynamically changed at any time to one of the calendars in ".calendars". +Globalize.cultures[ "default" ] = { + // A unique name for the culture in the form - + name: "en", + // the name of the culture in the english language + englishName: "English", + // the name of the culture in its own language + nativeName: "English", + // whether the culture uses right-to-left text + isRTL: false, + // "language" is used for so-called "specific" cultures. + // For example, the culture "es-CL" means "Spanish, in Chili". + // It represents the Spanish-speaking culture as it is in Chili, + // which might have different formatting rules or even translations + // than Spanish in Spain. A "neutral" culture is one that is not + // specific to a region. For example, the culture "es" is the generic + // Spanish culture, which may be a more generalized version of the language + // that may or may not be what a specific culture expects. + // For a specific culture like "es-CL", the "language" field refers to the + // neutral, generic culture information for the language it is using. + // This is not always a simple matter of the string before the dash. + // For example, the "zh-Hans" culture is netural (Simplified Chinese). + // And the "zh-SG" culture is Simplified Chinese in Singapore, whose lanugage + // field is "zh-CHS", not "zh". + // This field should be used to navigate from a specific culture to it's + // more general, neutral culture. If a culture is already as general as it + // can get, the language may refer to itself. + language: "en", + // numberFormat defines general number formatting rules, like the digits in + // each grouping, the group separator, and how negative numbers are displayed. + numberFormat: { + // [negativePattern] + // Note, numberFormat.pattern has no "positivePattern" unlike percent and currency, + // but is still defined as an array for consistency with them. + // negativePattern: one of "(n)|-n|- n|n-|n -" + pattern: [ "-n" ], + // number of decimal places normally shown + decimals: 2, + // string that separates number groups, as in 1,000,000 + ",": ",", + // string that separates a number from the fractional portion, as in 1.99 + ".": ".", + // array of numbers indicating the size of each number group. + // TODO: more detailed description and example + groupSizes: [ 3 ], + // symbol used for positive numbers + "+": "+", + // symbol used for negative numbers + "-": "-", + // symbol used for NaN (Not-A-Number) + NaN: "NaN", + // symbol used for Negative Infinity + negativeInfinity: "-Infinity", + // symbol used for Positive Infinity + positiveInfinity: "Infinity", + percent: { + // [negativePattern, positivePattern] + // negativePattern: one of "-n %|-n%|-%n|%-n|%n-|n-%|n%-|-% n|n %-|% n-|% -n|n- %" + // positivePattern: one of "n %|n%|%n|% n" + pattern: [ "-n %", "n %" ], + // number of decimal places normally shown + decimals: 2, + // array of numbers indicating the size of each number group. + // TODO: more detailed description and example + groupSizes: [ 3 ], + // string that separates number groups, as in 1,000,000 + ",": ",", + // string that separates a number from the fractional portion, as in 1.99 + ".": ".", + // symbol used to represent a percentage + symbol: "%" + }, + currency: { + // [negativePattern, positivePattern] + // negativePattern: one of "($n)|-$n|$-n|$n-|(n$)|-n$|n-$|n$-|-n $|-$ n|n $-|$ n-|$ -n|n- $|($ n)|(n $)" + // positivePattern: one of "$n|n$|$ n|n $" + pattern: [ "($n)", "$n" ], + // number of decimal places normally shown + decimals: 2, + // array of numbers indicating the size of each number group. + // TODO: more detailed description and example + groupSizes: [ 3 ], + // string that separates number groups, as in 1,000,000 + ",": ",", + // string that separates a number from the fractional portion, as in 1.99 + ".": ".", + // symbol used to represent currency + symbol: "$" + } + }, + // calendars defines all the possible calendars used by this culture. + // There should be at least one defined with name "standard", and is the default + // calendar used by the culture. + // A calendar contains information about how dates are formatted, information about + // the calendar's eras, a standard set of the date formats, + // translations for day and month names, and if the calendar is not based on the Gregorian + // calendar, conversion functions to and from the Gregorian calendar. + calendars: { + standard: { + // name that identifies the type of calendar this is + name: "Gregorian_USEnglish", + // separator of parts of a date (e.g. "/" in 11/05/1955) + "/": "/", + // separator of parts of a time (e.g. ":" in 05:44 PM) + ":": ":", + // the first day of the week (0 = Sunday, 1 = Monday, etc) + firstDay: 0, + days: { + // full day names + names: [ "Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday" ], + // abbreviated day names + namesAbbr: [ "Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat" ], + // shortest day names + namesShort: [ "Su", "Mo", "Tu", "We", "Th", "Fr", "Sa" ] + }, + months: { + // full month names (13 months for lunar calendards -- 13th month should be "" if not lunar) + names: [ "January", "February", "March", "April", "May", "June", "July", "August", "September", "October", "November", "December", "" ], + // abbreviated month names + namesAbbr: [ "Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec", "" ] + }, + // AM and PM designators in one of these forms: + // The usual view, and the upper and lower case versions + // [ standard, lowercase, uppercase ] + // The culture does not use AM or PM (likely all standard date formats use 24 hour time) + // null + AM: [ "AM", "am", "AM" ], + PM: [ "PM", "pm", "PM" ], + eras: [ + // eras in reverse chronological order. + // name: the name of the era in this culture (e.g. A.D., C.E.) + // start: when the era starts in ticks (gregorian, gmt), null if it is the earliest supported era. + // offset: offset in years from gregorian calendar + { + "name": "A.D.", + "start": null, + "offset": 0 + } + ], + // when a two digit year is given, it will never be parsed as a four digit + // year greater than this year (in the appropriate era for the culture) + // Set it as a full year (e.g. 2029) or use an offset format starting from + // the current year: "+19" would correspond to 2029 if the current year 2010. + twoDigitYearMax: 2029, + // set of predefined date and time patterns used by the culture + // these represent the format someone in this culture would expect + // to see given the portions of the date that are shown. + patterns: { + // short date pattern + d: "M/d/yyyy", + // long date pattern + D: "dddd, MMMM dd, yyyy", + // short time pattern + t: "h:mm tt", + // long time pattern + T: "h:mm:ss tt", + // long date, short time pattern + f: "dddd, MMMM dd, yyyy h:mm tt", + // long date, long time pattern + F: "dddd, MMMM dd, yyyy h:mm:ss tt", + // month/day pattern + M: "MMMM dd", + // month/year pattern + Y: "yyyy MMMM", + // S is a sortable format that does not vary by culture + S: "yyyy\u0027-\u0027MM\u0027-\u0027dd\u0027T\u0027HH\u0027:\u0027mm\u0027:\u0027ss" + } + // optional fields for each calendar: + /* + monthsGenitive: + Same as months but used when the day preceeds the month. + Omit if the culture has no genitive distinction in month names. + For an explaination of genitive months, see http://blogs.msdn.com/michkap/archive/2004/12/25/332259.aspx + convert: + Allows for the support of non-gregorian based calendars. This convert object is used to + to convert a date to and from a gregorian calendar date to handle parsing and formatting. + The two functions: + fromGregorian( date ) + Given the date as a parameter, return an array with parts [ year, month, day ] + corresponding to the non-gregorian based year, month, and day for the calendar. + toGregorian( year, month, day ) + Given the non-gregorian year, month, and day, return a new Date() object + set to the corresponding date in the gregorian calendar. + */ + } + }, + // For localized strings + messages: {} +}; + +Globalize.cultures[ "default" ].calendar = Globalize.cultures[ "default" ].calendars.standard; + +Globalize.cultures[ "en" ] = Globalize.cultures[ "default" ]; + +Globalize.cultureSelector = "en"; + +// +// private variables +// + +regexHex = /^0x[a-f0-9]+$/i; +regexInfinity = /^[+-]?infinity$/i; +regexParseFloat = /^[+-]?\d*\.?\d*(e[+-]?\d+)?$/; +regexTrim = /^\s+|\s+$/g; + +// +// private JavaScript utility functions +// + +arrayIndexOf = function( array, item ) { + if ( array.indexOf ) { + return array.indexOf( item ); + } + for ( var i = 0, length = array.length; i < length; i++ ) { + if ( array[i] === item ) { + return i; + } + } + return -1; +}; + +endsWith = function( value, pattern ) { + return value.substr( value.length - pattern.length ) === pattern; +}; + +extend = function( deep ) { + var options, name, src, copy, copyIsArray, clone, + target = arguments[0] || {}, + i = 1, + length = arguments.length, + deep = false; + + // Handle a deep copy situation + if ( typeof target === "boolean" ) { + deep = target; + target = arguments[1] || {}; + // skip the boolean and the target + i = 2; + } + + // Handle case when target is a string or something (possible in deep copy) + if ( typeof target !== "object" && !isFunction(target) ) { + target = {}; + } + + 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 && ( isObject(copy) || (copyIsArray = isArray(copy)) ) ) { + if ( copyIsArray ) { + copyIsArray = false; + clone = src && isArray(src) ? src : []; + + } else { + clone = src && isObject(src) ? src : {}; + } + + // Never move original objects, clone them + target[ name ] = extend( deep, clone, copy ); + + // Don't bring in undefined values + } else if ( copy !== undefined ) { + target[ name ] = copy; + } + } + } + } + + // Return the modified object + return target; +}; + +isArray = Array.isArray || function( obj ) { + return Object.prototype.toString.call( obj ) === "[object Array]"; +}; + +isFunction = function( obj ) { + return Object.prototype.toString.call( obj ) === "[object Function]" +} + +isObject = function( obj ) { + return Object.prototype.toString.call( obj ) === "[object Object]"; +}; + +startsWith = function( value, pattern ) { + return value.indexOf( pattern ) === 0; +}; + +trim = function( value ) { + return ( value + "" ).replace( regexTrim, "" ); +}; + +truncate = function( value ) { + return value | 0; +}; + +zeroPad = function( str, count, left ) { + var l; + for ( l = str.length; l < count; l += 1 ) { + str = ( left ? ("0" + str) : (str + "0") ); + } + return str; +}; + +// +// private Globalization utility functions +// + +appendPreOrPostMatch = function( preMatch, strings ) { + // appends pre- and post- token match strings while removing escaped characters. + // Returns a single quote count which is used to determine if the token occurs + // in a string literal. + var quoteCount = 0, + escaped = false; + for ( var i = 0, il = preMatch.length; i < il; i++ ) { + var c = preMatch.charAt( i ); + switch ( c ) { + case "\'": + if ( escaped ) { + strings.push( "\'" ); + } + else { + quoteCount++; + } + escaped = false; + break; + case "\\": + if ( escaped ) { + strings.push( "\\" ); + } + escaped = !escaped; + break; + default: + strings.push( c ); + escaped = false; + break; + } + } + return quoteCount; +}; + +expandFormat = function( cal, format ) { + // expands unspecified or single character date formats into the full pattern. + format = format || "F"; + var pattern, + patterns = cal.patterns, + len = format.length; + if ( len === 1 ) { + pattern = patterns[ format ]; + if ( !pattern ) { + throw "Invalid date format string \'" + format + "\'."; + } + format = pattern; + } + else if ( len === 2 && format.charAt(0) === "%" ) { + // %X escape format -- intended as a custom format string that is only one character, not a built-in format. + format = format.charAt( 1 ); + } + return format; +}; + +formatDate = function( value, format, culture ) { + var cal = culture.calendar, + convert = cal.convert; + + if ( !format || !format.length || format === "i" ) { + var ret; + if ( culture && culture.name.length ) { + if ( convert ) { + // non-gregorian calendar, so we cannot use built-in toLocaleString() + ret = formatDate( value, cal.patterns.F, culture ); + } + else { + var eraDate = new Date( value.getTime() ), + era = getEra( value, cal.eras ); + eraDate.setFullYear( getEraYear(value, cal, era) ); + ret = eraDate.toLocaleString(); + } + } + else { + ret = value.toString(); + } + return ret; + } + + var eras = cal.eras, + sortable = format === "s"; + format = expandFormat( cal, format ); + + // Start with an empty string + ret = []; + var hour, + zeros = [ "0", "00", "000" ], + foundDay, + checkedDay, + dayPartRegExp = /([^d]|^)(d|dd)([^d]|$)/g, + quoteCount = 0, + tokenRegExp = getTokenRegExp(), + converted; + + function padZeros( num, c ) { + var r, s = num + ""; + if ( c > 1 && s.length < c ) { + r = ( zeros[c - 2] + s); + return r.substr( r.length - c, c ); + } + else { + r = s; + } + return r; + } + + function hasDay() { + if ( foundDay || checkedDay ) { + return foundDay; + } + foundDay = dayPartRegExp.test( format ); + checkedDay = true; + return foundDay; + } + + function getPart( date, part ) { + if ( converted ) { + return converted[ part ]; + } + switch ( part ) { + case 0: return date.getFullYear(); + case 1: return date.getMonth(); + case 2: return date.getDate(); + } + } + + if ( !sortable && convert ) { + converted = convert.fromGregorian( value ); + } + + for ( ; ; ) { + // Save the current index + var index = tokenRegExp.lastIndex, + // Look for the next pattern + ar = tokenRegExp.exec( format ); + + // Append the text before the pattern (or the end of the string if not found) + var preMatch = format.slice( index, ar ? ar.index : format.length ); + quoteCount += appendPreOrPostMatch( preMatch, ret ); + + if ( !ar ) { + break; + } + + // do not replace any matches that occur inside a string literal. + if ( quoteCount % 2 ) { + ret.push( ar[0] ); + continue; + } + + var current = ar[ 0 ], + clength = current.length; + + switch ( current ) { + case "ddd": + //Day of the week, as a three-letter abbreviation + case "dddd": + // Day of the week, using the full name + var names = ( clength === 3 ) ? cal.days.namesAbbr : cal.days.names; + ret.push( names[value.getDay()] ); + break; + case "d": + // Day of month, without leading zero for single-digit days + case "dd": + // Day of month, with leading zero for single-digit days + foundDay = true; + ret.push( + padZeros( getPart(value, 2), clength ) + ); + break; + case "MMM": + // Month, as a three-letter abbreviation + case "MMMM": + // Month, using the full name + var part = getPart( value, 1 ); + ret.push( + ( cal.monthsGenitive && hasDay() ) + ? + cal.monthsGenitive[ clength === 3 ? "namesAbbr" : "names" ][ part ] + : + cal.months[ clength === 3 ? "namesAbbr" : "names" ][ part ] + ); + break; + case "M": + // Month, as digits, with no leading zero for single-digit months + case "MM": + // Month, as digits, with leading zero for single-digit months + ret.push( + padZeros( getPart(value, 1) + 1, clength ) + ); + break; + case "y": + // Year, as two digits, but with no leading zero for years less than 10 + case "yy": + // Year, as two digits, with leading zero for years less than 10 + case "yyyy": + // Year represented by four full digits + part = converted ? converted[ 0 ] : getEraYear( value, cal, getEra(value, eras), sortable ); + if ( clength < 4 ) { + part = part % 100; + } + ret.push( + padZeros( part, clength ) + ); + break; + case "h": + // Hours with no leading zero for single-digit hours, using 12-hour clock + case "hh": + // Hours with leading zero for single-digit hours, using 12-hour clock + hour = value.getHours() % 12; + if ( hour === 0 ) hour = 12; + ret.push( + padZeros( hour, clength ) + ); + break; + case "H": + // Hours with no leading zero for single-digit hours, using 24-hour clock + case "HH": + // Hours with leading zero for single-digit hours, using 24-hour clock + ret.push( + padZeros( value.getHours(), clength ) + ); + break; + case "m": + // Minutes with no leading zero for single-digit minutes + case "mm": + // Minutes with leading zero for single-digit minutes + ret.push( + padZeros( value.getMinutes(), clength ) + ); + break; + case "s": + // Seconds with no leading zero for single-digit seconds + case "ss": + // Seconds with leading zero for single-digit seconds + ret.push( + padZeros( value.getSeconds(), clength ) + ); + break; + case "t": + // One character am/pm indicator ("a" or "p") + case "tt": + // Multicharacter am/pm indicator + part = value.getHours() < 12 ? ( cal.AM ? cal.AM[0] : " " ) : ( cal.PM ? cal.PM[0] : " " ); + ret.push( clength === 1 ? part.charAt(0) : part ); + break; + case "f": + // Deciseconds + case "ff": + // Centiseconds + case "fff": + // Milliseconds + ret.push( + padZeros( value.getMilliseconds(), 3 ).substr( 0, clength ) + ); + break; + case "z": + // Time zone offset, no leading zero + case "zz": + // Time zone offset with leading zero + hour = value.getTimezoneOffset() / 60; + ret.push( + ( hour <= 0 ? "+" : "-" ) + padZeros( Math.floor(Math.abs(hour)), clength ) + ); + break; + case "zzz": + // Time zone offset with leading zero + hour = value.getTimezoneOffset() / 60; + ret.push( + ( hour <= 0 ? "+" : "-" ) + padZeros( Math.floor(Math.abs(hour)), 2 ) + // Hard coded ":" separator, rather than using cal.TimeSeparator + // Repeated here for consistency, plus ":" was already assumed in date parsing. + + ":" + padZeros( Math.abs(value.getTimezoneOffset() % 60), 2 ) + ); + break; + case "g": + case "gg": + if ( cal.eras ) { + ret.push( + cal.eras[ getEra(value, eras) ].name + ); + } + break; + case "/": + ret.push( cal["/"] ); + break; + default: + throw "Invalid date format pattern \'" + current + "\'."; + break; + } + } + return ret.join( "" ); +}; + +// formatNumber +(function() { + var expandNumber; + + expandNumber = function( number, precision, formatInfo ) { + var groupSizes = formatInfo.groupSizes, + curSize = groupSizes[ 0 ], + curGroupIndex = 1, + factor = Math.pow( 10, precision ), + rounded = Math.round( number * factor ) / factor; + + if ( !isFinite(rounded) ) { + rounded = number; + } + number = rounded; + + var numberString = number+"", + right = "", + split = numberString.split( /e/i ), + exponent = split.length > 1 ? parseInt( split[1], 10 ) : 0; + numberString = split[ 0 ]; + split = numberString.split( "." ); + numberString = split[ 0 ]; + right = split.length > 1 ? split[ 1 ] : ""; + + var l; + if ( exponent > 0 ) { + right = zeroPad( right, exponent, false ); + numberString += right.slice( 0, exponent ); + right = right.substr( exponent ); + } + else if ( exponent < 0 ) { + exponent = -exponent; + numberString = zeroPad( numberString, exponent + 1 ); + right = numberString.slice( -exponent, numberString.length ) + right; + numberString = numberString.slice( 0, -exponent ); + } + + if ( precision > 0 ) { + right = formatInfo[ "." ] + + ( (right.length > precision) ? right.slice(0, precision) : zeroPad(right, precision) ); + } + else { + right = ""; + } + + var stringIndex = numberString.length - 1, + sep = formatInfo[ "," ], + ret = ""; + + while ( stringIndex >= 0 ) { + if ( curSize === 0 || curSize > stringIndex ) { + return numberString.slice( 0, stringIndex + 1 ) + ( ret.length ? (sep + ret + right) : right ); + } + ret = numberString.slice( stringIndex - curSize + 1, stringIndex + 1 ) + ( ret.length ? (sep + ret) : "" ); + + stringIndex -= curSize; + + if ( curGroupIndex < groupSizes.length ) { + curSize = groupSizes[ curGroupIndex ]; + curGroupIndex++; + } + } + + return numberString.slice( 0, stringIndex + 1 ) + sep + ret + right; + }; + + formatNumber = function( value, format, culture ) { + if ( !isFinite(value) ) { + if ( value === Infinity ) { + return culture.numberFormat.positiveInfinity; + } + if ( value === -Infinity ) { + return culture.numberFormat.negativeInfinity; + } + return culture.numberFormat.NaN; + } + if ( !format || format === "i" ) { + return culture.name.length ? value.toLocaleString() : value.toString(); + } + format = format || "D"; + + var nf = culture.numberFormat, + number = Math.abs( value ), + precision = -1, + pattern; + if ( format.length > 1 ) precision = parseInt( format.slice(1), 10 ); + + var current = format.charAt( 0 ).toUpperCase(), + formatInfo; + + switch ( current ) { + case "D": + pattern = "n"; + number = truncate( number ); + if ( precision !== -1 ) { + number = zeroPad( "" + number, precision, true ); + } + if ( value < 0 ) number = "-" + number; + break; + case "N": + formatInfo = nf; + // fall through + case "C": + formatInfo = formatInfo || nf.currency; + // fall through + case "P": + formatInfo = formatInfo || nf.percent; + pattern = value < 0 ? formatInfo.pattern[ 0 ] : ( formatInfo.pattern[1] || "n" ); + if ( precision === -1 ) precision = formatInfo.decimals; + number = expandNumber( number * (current === "P" ? 100 : 1), precision, formatInfo ); + break; + default: + throw "Bad number format specifier: " + current; + } + + var patternParts = /n|\$|-|%/g, + ret = ""; + for ( ; ; ) { + var index = patternParts.lastIndex, + ar = patternParts.exec( pattern ); + + ret += pattern.slice( index, ar ? ar.index : pattern.length ); + + if ( !ar ) { + break; + } + + switch ( ar[0] ) { + case "n": + ret += number; + break; + case "$": + ret += nf.currency.symbol; + break; + case "-": + // don't make 0 negative + if ( /[1-9]/.test(number) ) { + ret += nf[ "-" ]; + } + break; + case "%": + ret += nf.percent.symbol; + break; + } + } + + return ret; + }; + +}()); + +getTokenRegExp = function() { + // regular expression for matching date and time tokens in format strings. + return /\/|dddd|ddd|dd|d|MMMM|MMM|MM|M|yyyy|yy|y|hh|h|HH|H|mm|m|ss|s|tt|t|fff|ff|f|zzz|zz|z|gg|g/g; +}; + +getEra = function( date, eras ) { + if ( !eras ) return 0; + var start, ticks = date.getTime(); + for ( var i = 0, l = eras.length; i < l; i++ ) { + start = eras[ i ].start; + if ( start === null || ticks >= start ) { + return i; + } + } + return 0; +}; + +getEraYear = function( date, cal, era, sortable ) { + var year = date.getFullYear(); + if ( !sortable && cal.eras ) { + // convert normal gregorian year to era-shifted gregorian + // year by subtracting the era offset + year -= cal.eras[ era ].offset; + } + return year; +}; + +// parseExact +(function() { + var expandYear, + getDayIndex, + getMonthIndex, + getParseRegExp, + outOfRange, + toUpper, + toUpperArray; + + expandYear = function( cal, year ) { + // expands 2-digit year into 4 digits. + var now = new Date(), + era = getEra( now ); + if ( year < 100 ) { + var twoDigitYearMax = cal.twoDigitYearMax; + twoDigitYearMax = typeof twoDigitYearMax === "string" ? new Date().getFullYear() % 100 + parseInt( twoDigitYearMax, 10 ) : twoDigitYearMax; + var curr = getEraYear( now, cal, era ); + year += curr - ( curr % 100 ); + if ( year > twoDigitYearMax ) { + year -= 100; + } + } + return year; + }; + + getDayIndex = function ( cal, value, abbr ) { + var ret, + days = cal.days, + upperDays = cal._upperDays; + if ( !upperDays ) { + cal._upperDays = upperDays = [ + toUpperArray( days.names ), + toUpperArray( days.namesAbbr ), + toUpperArray( days.namesShort ) + ]; + } + value = toUpper( value ); + if ( abbr ) { + ret = arrayIndexOf( upperDays[1], value ); + if ( ret === -1 ) { + ret = arrayIndexOf( upperDays[2], value ); + } + } + else { + ret = arrayIndexOf( upperDays[0], value ); + } + return ret; + }; + + getMonthIndex = function( cal, value, abbr ) { + var months = cal.months, + monthsGen = cal.monthsGenitive || cal.months, + upperMonths = cal._upperMonths, + upperMonthsGen = cal._upperMonthsGen; + if ( !upperMonths ) { + cal._upperMonths = upperMonths = [ + toUpperArray( months.names ), + toUpperArray( months.namesAbbr ) + ]; + cal._upperMonthsGen = upperMonthsGen = [ + toUpperArray( monthsGen.names ), + toUpperArray( monthsGen.namesAbbr ) + ]; + } + value = toUpper( value ); + var i = arrayIndexOf( abbr ? upperMonths[1] : upperMonths[0], value ); + if ( i < 0 ) { + i = arrayIndexOf( abbr ? upperMonthsGen[1] : upperMonthsGen[0], value ); + } + return i; + }; + + getParseRegExp = function( cal, format ) { + // converts a format string into a regular expression with groups that + // can be used to extract date fields from a date string. + // check for a cached parse regex. + var re = cal._parseRegExp; + if ( !re ) { + cal._parseRegExp = re = {}; + } + else { + var reFormat = re[ format ]; + if ( reFormat ) { + return reFormat; + } + } + + // expand single digit formats, then escape regular expression characters. + var expFormat = expandFormat( cal, format ).replace( /([\^\$\.\*\+\?\|\[\]\(\)\{\}])/g, "\\\\$1" ), + regexp = [ "^" ], + groups = [], + index = 0, + quoteCount = 0, + tokenRegExp = getTokenRegExp(), + match; + + // iterate through each date token found. + while ( (match = tokenRegExp.exec(expFormat)) !== null ) { + var preMatch = expFormat.slice( index, match.index ); + index = tokenRegExp.lastIndex; + + // don't replace any matches that occur inside a string literal. + quoteCount += appendPreOrPostMatch( preMatch, regexp ); + if ( quoteCount % 2 ) { + regexp.push( match[0] ); + continue; + } + + // add a regex group for the token. + var m = match[ 0 ], + len = m.length, + add; + switch ( m ) { + case "dddd": case "ddd": + case "MMMM": case "MMM": + case "gg": case "g": + add = "(\\D+)"; + break; + case "tt": case "t": + add = "(\\D*)"; + break; + case "yyyy": + case "fff": + case "ff": + case "f": + add = "(\\d{" + len + "})"; + break; + case "dd": case "d": + case "MM": case "M": + case "yy": case "y": + case "HH": case "H": + case "hh": case "h": + case "mm": case "m": + case "ss": case "s": + add = "(\\d\\d?)"; + break; + case "zzz": + add = "([+-]?\\d\\d?:\\d{2})"; + break; + case "zz": case "z": + add = "([+-]?\\d\\d?)"; + break; + case "/": + add = "(\\" + cal[ "/" ] + ")"; + break; + default: + throw "Invalid date format pattern \'" + m + "\'."; + break; + } + if ( add ) { + regexp.push( add ); + } + groups.push( match[0] ); + } + appendPreOrPostMatch( expFormat.slice(index), regexp ); + regexp.push( "$" ); + + // allow whitespace to differ when matching formats. + var regexpStr = regexp.join( "" ).replace( /\s+/g, "\\s+" ), + parseRegExp = { "regExp": regexpStr, "groups": groups }; + + // cache the regex for this format. + return re[ format ] = parseRegExp; + }; + + outOfRange = function( value, low, high ) { + return value < low || value > high; + }; + + toUpper = function( value ) { + // "he-IL" has non-breaking space in weekday names. + return value.split( "\u00A0" ).join( " " ).toUpperCase(); + }; + + toUpperArray = function( arr ) { + var results = []; + for ( var i = 0, l = arr.length; i < l; i++ ) { + results[ i ] = toUpper( arr[i] ); + } + return results; + }; + + parseExact = function( value, format, culture ) { + // try to parse the date string by matching against the format string + // while using the specified culture for date field names. + value = trim( value ); + var cal = culture.calendar, + // convert date formats into regular expressions with groupings. + // use the regexp to determine the input format and extract the date fields. + parseInfo = getParseRegExp( cal, format ), + match = new RegExp( parseInfo.regExp ).exec( value ); + if ( match === null ) { + return null; + } + // found a date format that matches the input. + var groups = parseInfo.groups, + era = null, year = null, month = null, date = null, weekDay = null, + hour = 0, hourOffset, min = 0, sec = 0, msec = 0, tzMinOffset = null, + pmHour = false; + // iterate the format groups to extract and set the date fields. + for ( var j = 0, jl = groups.length; j < jl; j++ ) { + var matchGroup = match[ j + 1 ]; + if ( matchGroup ) { + var current = groups[ j ], + clength = current.length, + matchInt = parseInt( matchGroup, 10 ); + switch ( current ) { + case "dd": case "d": + // Day of month. + date = matchInt; + // check that date is generally in valid range, also checking overflow below. + if ( outOfRange(date, 1, 31) ) return null; + break; + case "MMM": case "MMMM": + month = getMonthIndex( cal, matchGroup, clength === 3 ); + if ( outOfRange(month, 0, 11) ) return null; + break; + case "M": case "MM": + // Month. + month = matchInt - 1; + if ( outOfRange(month, 0, 11) ) return null; + break; + case "y": case "yy": + case "yyyy": + year = clength < 4 ? expandYear( cal, matchInt ) : matchInt; + if ( outOfRange(year, 0, 9999) ) return null; + break; + case "h": case "hh": + // Hours (12-hour clock). + hour = matchInt; + if ( hour === 12 ) hour = 0; + if ( outOfRange(hour, 0, 11) ) return null; + break; + case "H": case "HH": + // Hours (24-hour clock). + hour = matchInt; + if ( outOfRange(hour, 0, 23) ) return null; + break; + case "m": case "mm": + // Minutes. + min = matchInt; + if ( outOfRange(min, 0, 59) ) return null; + break; + case "s": case "ss": + // Seconds. + sec = matchInt; + if ( outOfRange(sec, 0, 59) ) return null; + break; + case "tt": case "t": + // AM/PM designator. + // see if it is standard, upper, or lower case PM. If not, ensure it is at least one of + // the AM tokens. If not, fail the parse for this format. + pmHour = cal.PM && ( matchGroup === cal.PM[0] || matchGroup === cal.PM[1] || matchGroup === cal.PM[2] ); + if ( + !pmHour && ( + !cal.AM || ( matchGroup !== cal.AM[0] && matchGroup !== cal.AM[1] && matchGroup !== cal.AM[2] ) + ) + ) return null; + break; + case "f": + // Deciseconds. + case "ff": + // Centiseconds. + case "fff": + // Milliseconds. + msec = matchInt * Math.pow( 10, 3 - clength ); + if ( outOfRange(msec, 0, 999) ) return null; + break; + case "ddd": + // Day of week. + case "dddd": + // Day of week. + weekDay = getDayIndex( cal, matchGroup, clength === 3 ); + if ( outOfRange(weekDay, 0, 6) ) return null; + break; + case "zzz": + // Time zone offset in +/- hours:min. + var offsets = matchGroup.split( /:/ ); + if ( offsets.length !== 2 ) return null; + hourOffset = parseInt( offsets[0], 10 ); + if ( outOfRange(hourOffset, -12, 13) ) return null; + var minOffset = parseInt( offsets[1], 10 ); + if ( outOfRange(minOffset, 0, 59) ) return null; + tzMinOffset = ( hourOffset * 60 ) + ( startsWith(matchGroup, "-") ? -minOffset : minOffset ); + break; + case "z": case "zz": + // Time zone offset in +/- hours. + hourOffset = matchInt; + if ( outOfRange(hourOffset, -12, 13) ) return null; + tzMinOffset = hourOffset * 60; + break; + case "g": case "gg": + var eraName = matchGroup; + if ( !eraName || !cal.eras ) return null; + eraName = trim( eraName.toLowerCase() ); + for ( var i = 0, l = cal.eras.length; i < l; i++ ) { + if ( eraName === cal.eras[i].name.toLowerCase() ) { + era = i; + break; + } + } + // could not find an era with that name + if ( era === null ) return null; + break; + } + } + } + var result = new Date(), defaultYear, convert = cal.convert; + defaultYear = convert ? convert.fromGregorian( result )[ 0 ] : result.getFullYear(); + if ( year === null ) { + year = defaultYear; + } + else if ( cal.eras ) { + // year must be shifted to normal gregorian year + // but not if year was not specified, its already normal gregorian + // per the main if clause above. + year += cal.eras[( era || 0 )].offset; + } + // set default day and month to 1 and January, so if unspecified, these are the defaults + // instead of the current day/month. + if ( month === null ) { + month = 0; + } + if ( date === null ) { + date = 1; + } + // now have year, month, and date, but in the culture's calendar. + // convert to gregorian if necessary + if ( convert ) { + result = convert.toGregorian( year, month, date ); + // conversion failed, must be an invalid match + if ( result === null ) return null; + } + else { + // have to set year, month and date together to avoid overflow based on current date. + result.setFullYear( year, month, date ); + // check to see if date overflowed for specified month (only checked 1-31 above). + if ( result.getDate() !== date ) return null; + // invalid day of week. + if ( weekDay !== null && result.getDay() !== weekDay ) { + return null; + } + } + // if pm designator token was found make sure the hours fit the 24-hour clock. + if ( pmHour && hour < 12 ) { + hour += 12; + } + result.setHours( hour, min, sec, msec ); + if ( tzMinOffset !== null ) { + // adjust timezone to utc before applying local offset. + var adjustedMin = result.getMinutes() - ( tzMinOffset + result.getTimezoneOffset() ); + // Safari limits hours and minutes to the range of -127 to 127. We need to use setHours + // to ensure both these fields will not exceed this range. adjustedMin will range + // somewhere between -1440 and 1500, so we only need to split this into hours. + result.setHours( result.getHours() + parseInt(adjustedMin / 60, 10), adjustedMin % 60 ); + } + return result; + }; +}()); + +parseNegativePattern = function( value, nf, negativePattern ) { + var neg = nf[ "-" ], + pos = nf[ "+" ], + ret; + switch ( negativePattern ) { + case "n -": + neg = " " + neg; + pos = " " + pos; + // fall through + case "n-": + if ( endsWith(value, neg) ) { + ret = [ "-", value.substr(0, value.length - neg.length) ]; + } + else if ( endsWith(value, pos) ) { + ret = [ "+", value.substr(0, value.length - pos.length) ]; + } + break; + case "- n": + neg += " "; + pos += " "; + // fall through + case "-n": + if ( startsWith(value, neg) ) { + ret = [ "-", value.substr(neg.length) ]; + } + else if ( startsWith(value, pos) ) { + ret = [ "+", value.substr(pos.length) ]; + } + break; + case "(n)": + if ( startsWith(value, "(") && endsWith(value, ")") ) { + ret = [ "-", value.substr(1, value.length - 2) ]; + } + break; + } + return ret || [ "", value ]; +}; + +// +// public instance functions +// + +Globalize.prototype.findClosestCulture = function( cultureSelector ) { + return Globalize.findClosestCulture.call( this, cultureSelector ); +}; + +Globalize.prototype.format = function( value, format, cultureSelector ) { + return Globalize.format.call( this, value, format, cultureSelector ); +}; + +Globalize.prototype.localize = function( key, cultureSelector ) { + return Globalize.localize.call( this, key, cultureSelector ); +}; + +Globalize.prototype.parseInt = function( value, radix, cultureSelector ) { + return Globalize.parseInt.call( this, value, radix, cultureSelector ); +}; + +Globalize.prototype.parseFloat = function( value, radix, cultureSelector ) { + return Globalize.parseFloat.call( this, value, radix, cultureSelector ); +}; + +Globalize.prototype.culture = function( cultureSelector ) { + return Globalize.culture.call( this, cultureSelector ); +}; + +// +// public singleton functions +// + +Globalize.addCultureInfo = function( cultureName, baseCultureName, info ) { + + var base = {}, + isNew = false; + + if ( typeof cultureName !== "string" ) { + // cultureName argument is optional string. If not specified, assume info is first + // and only argument. Specified info deep-extends current culture. + info = cultureName; + cultureName = this.culture().name; + base = this.cultures[ cultureName ]; + } else if ( typeof baseCultureName !== "string" ) { + // baseCultureName argument is optional string. If not specified, assume info is second + // argument. Specified info deep-extends specified culture. + // If specified culture does not exist, create by deep-extending default + info = baseCultureName; + isNew = ( this.cultures[ cultureName ] == null ); + base = this.cultures[ cultureName ] || this.cultures[ "default" ]; + } else { + // cultureName and baseCultureName specified. Assume a new culture is being created + // by deep-extending an specified base culture + isNew = true; + base = this.cultures[ baseCultureName ]; + } + + this.cultures[ cultureName ] = extend(true, {}, + base, + info + ); + // Make the standard calendar the current culture if it's a new culture + if ( isNew ) { + this.cultures[ cultureName ].calendar = this.cultures[ cultureName ].calendars.standard; + } +}; + +Globalize.findClosestCulture = function( name ) { + var match; + if ( !name ) { + return this.cultures[ this.cultureSelector ] || this.cultures[ "default" ]; + } + if ( typeof name === "string" ) { + name = name.split( "," ); + } + if ( isArray(name) ) { + var lang, + cultures = this.cultures, + list = name, + i, l = list.length, + prioritized = []; + for ( i = 0; i < l; i++ ) { + name = trim( list[i] ); + var pri, parts = name.split( ";" ); + lang = trim( parts[0] ); + if ( parts.length === 1 ) { + pri = 1; + } + else { + name = trim( parts[1] ); + if ( name.indexOf("q=") === 0 ) { + name = name.substr( 2 ); + pri = parseFloat( name ); + pri = isNaN( pri ) ? 0 : pri; + } + else { + pri = 1; + } + } + prioritized.push({ lang: lang, pri: pri }); + } + prioritized.sort(function( a, b ) { + return a.pri < b.pri ? 1 : -1; + }); + + // exact match + for ( i = 0; i < l; i++ ) { + lang = prioritized[ i ].lang; + match = cultures[ lang ]; + if ( match ) { + return match; + } + } + + // neutral language match + for ( i = 0; i < l; i++ ) { + lang = prioritized[ i ].lang; + do { + var index = lang.lastIndexOf( "-" ); + if ( index === -1 ) { + break; + } + // strip off the last part. e.g. en-US => en + lang = lang.substr( 0, index ); + match = cultures[ lang ]; + if ( match ) { + return match; + } + } + while ( 1 ); + } + + // last resort: match first culture using that language + for ( i = 0; i < l; i++ ) { + lang = prioritized[ i ].lang; + for ( var cultureKey in cultures ) { + var culture = cultures[ cultureKey ]; + if ( culture.language == lang ) { + return culture; + } + } + } + } + else if ( typeof name === "object" ) { + return name; + } + return match || null; +}; + +Globalize.format = function( value, format, cultureSelector ) { + culture = this.findClosestCulture( cultureSelector ); + if ( value instanceof Date ) { + value = formatDate( value, format, culture ); + } + else if ( typeof value === "number" ) { + value = formatNumber( value, format, culture ); + } + return value; +}; + +Globalize.localize = function( key, cultureSelector ) { + return this.findClosestCulture( cultureSelector ).messages[ key ] || + this.cultures[ "default" ].messages[ key ]; +}; + +Globalize.parseDate = function( value, formats, culture ) { + culture = this.findClosestCulture( culture ); + + var date, prop, patterns; + if ( formats ) { + if ( typeof formats === "string" ) { + formats = [ formats ]; + } + if ( formats.length ) { + for ( var i = 0, l = formats.length; i < l; i++ ) { + var format = formats[ i ]; + if ( format ) { + date = parseExact( value, format, culture ); + if ( date ) { + break; + } + } + } + } + } else { + patterns = culture.calendar.patterns; + for ( prop in patterns ) { + date = parseExact( value, patterns[prop], culture ); + if ( date ) { + break; + } + } + } + + return date || null; +}; + +Globalize.parseInt = function( value, radix, cultureSelector ) { + return truncate( Globalize.parseFloat(value, radix, cultureSelector) ); +}; + +Globalize.parseFloat = function( value, radix, cultureSelector ) { + // radix argument is optional + if ( typeof radix !== "number" ) { + cultureSelector = radix; + radix = 10; + } + + var culture = this.findClosestCulture( cultureSelector ); + var ret = NaN, + nf = culture.numberFormat; + + if ( value.indexOf(culture.numberFormat.currency.symbol) > -1 ) { + // remove currency symbol + value = value.replace( culture.numberFormat.currency.symbol, "" ); + // replace decimal seperator + value = value.replace( culture.numberFormat.currency["."], culture.numberFormat["."] ); + } + + // trim leading and trailing whitespace + value = trim( value ); + + // allow infinity or hexidecimal + if ( regexInfinity.test(value) ) { + ret = parseFloat( value ); + } + else if ( !radix && regexHex.test(value) ) { + ret = parseInt( value, 16 ); + } + else { + + // determine sign and number + var signInfo = parseNegativePattern( value, nf, nf.pattern[0] ), + sign = signInfo[ 0 ], + num = signInfo[ 1 ]; + + // #44 - try parsing as "(n)" + if ( sign === "" && nf.pattern[0] !== "(n)" ) { + signInfo = parseNegativePattern( value, nf, "(n)" ); + sign = signInfo[ 0 ]; + num = signInfo[ 1 ]; + } + + // try parsing as "-n" + if ( sign === "" && nf.pattern[0] !== "-n" ) { + signInfo = parseNegativePattern( value, nf, "-n" ); + sign = signInfo[ 0 ]; + num = signInfo[ 1 ]; + } + + sign = sign || "+"; + + // determine exponent and number + var exponent, + intAndFraction, + exponentPos = num.indexOf( "e" ); + if ( exponentPos < 0 ) exponentPos = num.indexOf( "E" ); + if ( exponentPos < 0 ) { + intAndFraction = num; + exponent = null; + } + else { + intAndFraction = num.substr( 0, exponentPos ); + exponent = num.substr( exponentPos + 1 ); + } + // determine decimal position + var integer, + fraction, + decSep = nf[ "." ], + decimalPos = intAndFraction.indexOf( decSep ); + if ( decimalPos < 0 ) { + integer = intAndFraction; + fraction = null; + } + else { + integer = intAndFraction.substr( 0, decimalPos ); + fraction = intAndFraction.substr( decimalPos + decSep.length ); + } + // handle groups (e.g. 1,000,000) + var groupSep = nf[ "," ]; + integer = integer.split( groupSep ).join( "" ); + var altGroupSep = groupSep.replace( /\u00A0/g, " " ); + if ( groupSep !== altGroupSep ) { + integer = integer.split( altGroupSep ).join( "" ); + } + // build a natively parsable number string + var p = sign + integer; + if ( fraction !== null ) { + p += "." + fraction; + } + if ( exponent !== null ) { + // exponent itself may have a number patternd + var expSignInfo = parseNegativePattern( exponent, nf, "-n" ); + p += "e" + ( expSignInfo[0] || "+" ) + expSignInfo[ 1 ]; + } + if ( regexParseFloat.test(p) ) { + ret = parseFloat( p ); + } + } + return ret; +}; + +Globalize.culture = function( cultureSelector ) { + // setter + if ( typeof cultureSelector !== "undefined" ) { + this.cultureSelector = cultureSelector; + } + // getter + return this.findClosestCulture( cultureSelector ) || this.culture[ "default" ]; +}; + +}( this )); diff --git a/testData/compressed-jQueryUI-built-with-node-archiver/inflated/development-bundle/external/jquery.mousewheel.js b/testData/compressed-jQueryUI-built-with-node-archiver/inflated/development-bundle/external/jquery.mousewheel.js new file mode 100755 index 00000000..8c603041 --- /dev/null +++ b/testData/compressed-jQueryUI-built-with-node-archiver/inflated/development-bundle/external/jquery.mousewheel.js @@ -0,0 +1,101 @@ +/*! Copyright (c) 2013 Brandon Aaron (http://brandonaaron.net) + * Licensed under the MIT License (LICENSE.txt). + * + * Thanks to: http://adomas.org/javascript-mouse-wheel/ for some pointers. + * Thanks to: Mathias Bank(http://www.mathias-bank.de) for a scope bug fix. + * Thanks to: Seamus Leahy for adding deltaX and deltaY + * + * Version: 3.1.0 + * + * Requires: 1.2.2+ + */ + +(function (factory) { + if (typeof define === 'function' && define.amd) { + // AMD. Register as an anonymous module. + define(['jquery'], factory); + } else { + // Browser globals + factory(jQuery); + } +}(function ($) { + + var toFix = ['wheel', 'mousewheel', 'DOMMouseScroll']; + var toBind = 'onwheel' in document || document.documentMode >= 9 ? ['wheel'] : ['mousewheel', 'DomMouseScroll', 'MozMousePixelScroll']; + var lowestDelta, lowestDeltaXY; + + if ($.event.fixHooks) { + for ( var i=toFix.length; i; ) { + $.event.fixHooks[ toFix[--i] ] = $.event.mouseHooks; + } + } + + $.event.special.mousewheel = { + setup: function() { + if ( this.addEventListener ) { + for ( var i=toBind.length; i; ) { + this.addEventListener( toBind[--i], handler, false ); + } + } else { + this.onmousewheel = handler; + } + }, + + teardown: function() { + if ( this.removeEventListener ) { + for ( var i=toBind.length; i; ) { + this.removeEventListener( toBind[--i], handler, false ); + } + } else { + this.onmousewheel = null; + } + } + }; + + $.fn.extend({ + mousewheel: function(fn) { + return fn ? this.bind("mousewheel", fn) : this.trigger("mousewheel"); + }, + + unmousewheel: function(fn) { + return this.unbind("mousewheel", fn); + } + }); + + + function handler(event) { + var orgEvent = event || window.event, args = [].slice.call( arguments, 1 ), delta = 0, deltaX = 0, deltaY = 0, absDelta = 0, absDeltaXY = 0; + event = $.event.fix(orgEvent); + event.type = "mousewheel"; + + // Old school scrollwheel delta + if ( orgEvent.wheelDelta ) { delta = orgEvent.wheelDelta; } + if ( orgEvent.detail ) { delta = orgEvent.detail * -1; } + + // New school wheel delta (wheel event) + if ( orgEvent.deltaY ) { + deltaY = orgEvent.deltaY * -1; + delta = deltaY; + } + if ( orgEvent.deltaX ) { + deltaX = orgEvent.deltaX; + delta = deltaX * -1; + } + + // Webkit + if ( orgEvent.wheelDeltaY !== undefined ) { deltaY = orgEvent.wheelDeltaY; } + if ( orgEvent.wheelDeltaX !== undefined ) { deltaX = orgEvent.wheelDeltaX * -1; } + + absDelta = Math.abs(delta); + if ( !lowestDelta || absDelta < lowestDelta ) { lowestDelta = absDelta; } + + absDeltaXY = Math.max( Math.abs(deltaY), Math.abs(deltaX) ); + if ( !lowestDeltaXY || absDeltaXY < lowestDeltaXY ) { lowestDeltaXY = absDeltaXY; } + + // Add event and delta to the front of the arguments + args.unshift(event, Math.floor(delta/lowestDelta), Math.floor(deltaX/lowestDeltaXY), Math.floor(deltaY/lowestDeltaXY)); + + return ($.event.dispatch || $.event.handle).apply(this, args); + } + +})); diff --git a/testData/compressed-jQueryUI-built-with-node-archiver/inflated/development-bundle/external/jshint.js b/testData/compressed-jQueryUI-built-with-node-archiver/inflated/development-bundle/external/jshint.js new file mode 100755 index 00000000..8f06d9be --- /dev/null +++ b/testData/compressed-jQueryUI-built-with-node-archiver/inflated/development-bundle/external/jshint.js @@ -0,0 +1,4835 @@ +/*! + * JSHint, by JSHint Community. + * + * This file (and this file only) is licensed under the same slightly modified + * MIT license that JSLint is. It stops evil-doers everywhere. + * + * JSHint is a derivative work of JSLint: + * + * Copyright (c) 2002 Douglas Crockford (www.JSLint.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 shall be used for Good, not Evil. + * + * 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. + * + */ + +/* + JSHINT is a global function. It takes two parameters. + + var myResult = JSHINT(source, option); + + The first parameter is either a string or an array of strings. If it is a + string, it will be split on '\n' or '\r'. If it is an array of strings, it + is assumed that each string represents one line. The source can be a + JavaScript text or a JSON text. + + The second parameter is an optional object of options which control the + operation of JSHINT. Most of the options are booleans: They are all + optional and have a default value of false. One of the options, predef, + can be an array of names, which will be used to declare global variables, + or an object whose keys are used as global names, with a boolean value + that determines if they are assignable. + + If it checks out, JSHINT returns true. Otherwise, it returns false. + + If false, you can inspect JSHINT.errors to find out the problems. + JSHINT.errors is an array of objects containing these members: + + { + line : The line (relative to 1) at which the lint was found + character : The character (relative to 1) at which the lint was found + reason : The problem + evidence : The text line in which the problem occurred + raw : The raw message before the details were inserted + a : The first detail + b : The second detail + c : The third detail + d : The fourth detail + } + + If a fatal error was found, a null will be the last element of the + JSHINT.errors array. + + You can request a data structure which contains JSHint's results. + + var myData = JSHINT.data(); + + It returns a structure with this form: + + { + errors: [ + { + line: NUMBER, + character: NUMBER, + reason: STRING, + evidence: STRING + } + ], + functions: [ + name: STRING, + line: NUMBER, + character: NUMBER, + last: NUMBER, + lastcharacter: NUMBER, + param: [ + STRING + ], + closure: [ + STRING + ], + var: [ + STRING + ], + exception: [ + STRING + ], + outer: [ + STRING + ], + unused: [ + STRING + ], + global: [ + STRING + ], + label: [ + STRING + ] + ], + globals: [ + STRING + ], + member: { + STRING: NUMBER + }, + unused: [ + { + name: STRING, + line: NUMBER + } + ], + implieds: [ + { + name: STRING, + line: NUMBER + } + ], + urls: [ + STRING + ], + json: BOOLEAN + } + + Empty arrays will not be included. + +*/ + +/*jshint + evil: true, nomen: false, onevar: false, regexp: false, strict: true, boss: true, + undef: true, maxlen: 100, indent: 4, quotmark: double, unused: true +*/ + +/*members "\b", "\t", "\n", "\f", "\r", "!=", "!==", "\"", "%", "(begin)", + "(breakage)", "(character)", "(context)", "(error)", "(explicitNewcap)", "(global)", + "(identifier)", "(last)", "(lastcharacter)", "(line)", "(loopage)", "(metrics)", + "(name)", "(onevar)", "(params)", "(scope)", "(statement)", "(verb)", "(tokens)", "(catch)", + "*", "+", "++", "-", "--", "\/", "<", "<=", "==", + "===", ">", ">=", $, $$, $A, $F, $H, $R, $break, $continue, $w, Abstract, Ajax, + __filename, __dirname, ActiveXObject, Array, ArrayBuffer, ArrayBufferView, Audio, + Autocompleter, Asset, Boolean, Builder, Buffer, Browser, Blob, COM, CScript, Canvas, + CustomAnimation, Class, Control, ComplexityCount, Chain, Color, Cookie, Core, DataView, Date, + Debug, Draggable, Draggables, Droppables, Document, DomReady, DOMEvent, DOMReady, DOMParser, + Drag, E, Enumerator, Enumerable, Element, Elements, Error, Effect, EvalError, Event, + Events, FadeAnimation, Field, Flash, Float32Array, Float64Array, Form, + FormField, Frame, FormData, Function, Fx, GetObject, Group, Hash, HotKey, + HTMLElement, HTMLAnchorElement, HTMLBaseElement, HTMLBlockquoteElement, + HTMLBodyElement, HTMLBRElement, HTMLButtonElement, HTMLCanvasElement, HTMLDirectoryElement, + HTMLDivElement, HTMLDListElement, HTMLFieldSetElement, + HTMLFontElement, HTMLFormElement, HTMLFrameElement, HTMLFrameSetElement, + HTMLHeadElement, HTMLHeadingElement, HTMLHRElement, HTMLHtmlElement, + HTMLIFrameElement, HTMLImageElement, HTMLInputElement, HTMLIsIndexElement, + HTMLLabelElement, HTMLLayerElement, HTMLLegendElement, HTMLLIElement, + HTMLLinkElement, HTMLMapElement, HTMLMenuElement, HTMLMetaElement, + HTMLModElement, HTMLObjectElement, HTMLOListElement, HTMLOptGroupElement, + HTMLOptionElement, HTMLParagraphElement, HTMLParamElement, HTMLPreElement, + HTMLQuoteElement, HTMLScriptElement, HTMLSelectElement, HTMLStyleElement, + HtmlTable, HTMLTableCaptionElement, HTMLTableCellElement, HTMLTableColElement, + HTMLTableElement, HTMLTableRowElement, HTMLTableSectionElement, + HTMLTextAreaElement, HTMLTitleElement, HTMLUListElement, HTMLVideoElement, + Iframe, IframeShim, Image, importScripts, Int16Array, Int32Array, Int8Array, + Insertion, InputValidator, JSON, Keyboard, Locale, LN10, LN2, LOG10E, LOG2E, + MAX_VALUE, MIN_VALUE, Map, Mask, Math, MenuItem, MessageChannel, MessageEvent, MessagePort, + MoveAnimation, MooTools, MutationObserver, NaN, Native, NEGATIVE_INFINITY, Node, NodeFilter, + Number, Object, ObjectRange, + Option, Options, OverText, PI, POSITIVE_INFINITY, PeriodicalExecuter, Point, Position, Prototype, + RangeError, Rectangle, ReferenceError, RegExp, ResizeAnimation, Request, RotateAnimation, Set, + SQRT1_2, SQRT2, ScrollBar, ScriptEngine, ScriptEngineBuildVersion, + ScriptEngineMajorVersion, ScriptEngineMinorVersion, Scriptaculous, Scroller, + Slick, Slider, Selector, SharedWorker, String, Style, SyntaxError, Sortable, Sortables, + SortableObserver, Sound, Spinner, System, Swiff, Text, TextArea, Template, + Timer, Tips, Type, TypeError, Toggle, Try, "use strict", unescape, URI, URIError, URL, + VBArray, WeakMap, WSH, WScript, XDomainRequest, Web, Window, XMLDOM, XMLHttpRequest, XMLSerializer, + XPathEvaluator, XPathException, XPathExpression, XPathNamespace, XPathNSResolver, XPathResult, + "\\", a, abs, addEventListener, address, alert, apply, applicationCache, arguments, arity, + asi, atob, b, basic, basicToken, bitwise, blacklist, block, blur, boolOptions, boss, + browser, btoa, c, call, callee, caller, camelcase, cases, charAt, charCodeAt, character, + clearInterval, clearTimeout, close, closed, closure, comment, complexityCount, condition, + confirm, console, constructor, content, couch, create, css, curly, d, data, datalist, dd, debug, + decodeURI, decodeURIComponent, defaultStatus, defineClass, deserialize, devel, document, + dojo, dijit, dojox, define, else, emit, encodeURI, encodeURIComponent, elem, + eqeq, eqeqeq, eqnull, errors, es5, escape, esnext, eval, event, evidence, evil, + ex, exception, exec, exps, expr, exports, FileReader, first, floor, focus, forEach, + forin, fragment, frames, from, fromCharCode, fud, funcscope, funct, function, functions, + g, gc, getComputedStyle, getRow, getter, getterToken, GLOBAL, global, globals, globalstrict, + hasOwnProperty, help, history, i, id, identifier, immed, implieds, importPackage, include, + indent, indexOf, init, ins, internals, instanceOf, isAlpha, isApplicationRunning, isArray, + isDigit, isFinite, isNaN, iterator, java, join, jshint, + JSHINT, json, jquery, jQuery, keys, label, labelled, last, lastcharacter, lastsemic, laxbreak, + laxcomma, latedef, lbp, led, left, length, line, load, loadClass, localStorage, location, + log, loopfunc, m, match, max, maxcomplexity, maxdepth, maxerr, maxlen, maxstatements, maxparams, + member, message, meta, module, moveBy, moveTo, mootools, multistr, name, navigator, new, newcap, + nestedBlockDepth, noarg, node, noempty, nomen, nonew, nonstandard, nud, onbeforeunload, onblur, + onerror, onevar, onecase, onfocus, onload, onresize, onunload, open, openDatabase, openURL, + opener, opera, options, outer, param, parent, parseFloat, parseInt, passfail, plusplus, + postMessage, pop, predef, print, process, prompt, proto, prototype, prototypejs, provides, push, + quit, quotmark, range, raw, reach, reason, regexp, readFile, readUrl, regexdash, + removeEventListener, replace, report, require, reserved, resizeBy, resizeTo, resolvePath, + resumeUpdates, respond, rhino, right, runCommand, scroll, scope, screen, scripturl, scrollBy, + scrollTo, scrollbar, search, seal, self, send, serialize, sessionStorage, setInterval, setTimeout, + setter, setterToken, shift, slice, smarttabs, sort, spawn, split, statement, statementCount, stack, + status, start, strict, sub, substr, supernew, shadow, supplant, sum, sync, test, toLowerCase, + toString, toUpperCase, toint32, token, tokens, top, trailing, type, typeOf, Uint16Array, + Uint32Array, Uint8Array, undef, undefs, unused, urls, validthis, value, valueOf, var, vars, + version, verifyMaxParametersPerFunction, verifyMaxStatementsPerFunction, + verifyMaxComplexityPerFunction, verifyMaxNestedBlockDepthPerFunction, WebSocket, withstmt, white, + window, windows, Worker, worker, wsh, yui, YUI, Y, YUI_config*/ + +/*global exports: false */ + +// We build the application inside a function so that we produce only a single +// global variable. That function will be invoked immediately, and its return +// value is the JSHINT function itself. + +var JSHINT = (function () { + "use strict"; + + var anonname, // The guessed name for anonymous functions. + +// These are operators that should not be used with the ! operator. + + bang = { + "<" : true, + "<=" : true, + "==" : true, + "===": true, + "!==": true, + "!=" : true, + ">" : true, + ">=" : true, + "+" : true, + "-" : true, + "*" : true, + "/" : true, + "%" : true + }, + + // These are the JSHint boolean options. + boolOptions = { + asi : true, // if automatic semicolon insertion should be tolerated + bitwise : true, // if bitwise operators should not be allowed + boss : true, // if advanced usage of assignments should be allowed + browser : true, // if the standard browser globals should be predefined + camelcase : true, // if identifiers should be required in camel case + couch : true, // if CouchDB globals should be predefined + curly : true, // if curly braces around all blocks should be required + debug : true, // if debugger statements should be allowed + devel : true, // if logging globals should be predefined (console, + // alert, etc.) + dojo : true, // if Dojo Toolkit globals should be predefined + eqeqeq : true, // if === should be required + eqnull : true, // if == null comparisons should be tolerated + es5 : true, // if ES5 syntax should be allowed + esnext : true, // if es.next specific syntax should be allowed + evil : true, // if eval should be allowed + expr : true, // if ExpressionStatement should be allowed as Programs + forin : true, // if for in statements must filter + funcscope : true, // if only function scope should be used for scope tests + globalstrict: true, // if global "use strict"; should be allowed (also + // enables 'strict') + immed : true, // if immediate invocations must be wrapped in parens + iterator : true, // if the `__iterator__` property should be allowed + jquery : true, // if jQuery globals should be predefined + lastsemic : true, // if semicolons may be ommitted for the trailing + // statements inside of a one-line blocks. + latedef : true, // if the use before definition should not be tolerated + laxbreak : true, // if line breaks should not be checked + laxcomma : true, // if line breaks should not be checked around commas + loopfunc : true, // if functions should be allowed to be defined within + // loops + mootools : true, // if MooTools globals should be predefined + multistr : true, // allow multiline strings + newcap : true, // if constructor names must be capitalized + noarg : true, // if arguments.caller and arguments.callee should be + // disallowed + node : true, // if the Node.js environment globals should be + // predefined + noempty : true, // if empty blocks should be disallowed + nonew : true, // if using `new` for side-effects should be disallowed + nonstandard : true, // if non-standard (but widely adopted) globals should + // be predefined + nomen : true, // if names should be checked + onevar : true, // if only one var statement per function should be + // allowed + onecase : true, // if one case switch statements should be allowed + passfail : true, // if the scan should stop on first error + plusplus : true, // if increment/decrement should not be allowed + proto : true, // if the `__proto__` property should be allowed + prototypejs : true, // if Prototype and Scriptaculous globals should be + // predefined + regexdash : true, // if unescaped first/last dash (-) inside brackets + // should be tolerated + regexp : true, // if the . should not be allowed in regexp literals + rhino : true, // if the Rhino environment globals should be predefined + undef : true, // if variables should be declared before used + unused : true, // if variables should be always used + scripturl : true, // if script-targeted URLs should be tolerated + shadow : true, // if variable shadowing should be tolerated + smarttabs : true, // if smarttabs should be tolerated + // (http://www.emacswiki.org/emacs/SmartTabs) + strict : true, // require the "use strict"; pragma + sub : true, // if all forms of subscript notation are tolerated + supernew : true, // if `new function () { ... };` and `new Object;` + // should be tolerated + trailing : true, // if trailing whitespace rules apply + validthis : true, // if 'this' inside a non-constructor function is valid. + // This is a function scoped option only. + withstmt : true, // if with statements should be allowed + white : true, // if strict whitespace rules apply + worker : true, // if Web Worker script symbols should be allowed + wsh : true, // if the Windows Scripting Host environment globals + // should be predefined + yui : true // YUI variables should be predefined + }, + + // These are the JSHint options that can take any value + // (we use this object to detect invalid options) + valOptions = { + maxlen : false, + indent : false, + maxerr : false, + predef : false, + quotmark : false, //'single'|'double'|true + scope : false, + maxstatements: false, // {int} max statements per function + maxdepth : false, // {int} max nested block depth per function + maxparams : false, // {int} max params per function + maxcomplexity: false // {int} max cyclomatic complexity per function + }, + + // These are JSHint boolean options which are shared with JSLint + // where the definition in JSHint is opposite JSLint + invertedOptions = { + bitwise : true, + forin : true, + newcap : true, + nomen : true, + plusplus : true, + regexp : true, + undef : true, + white : true, + + // Inverted and renamed, use JSHint name here + eqeqeq : true, + onevar : true + }, + + // These are JSHint boolean options which are shared with JSLint + // where the name has been changed but the effect is unchanged + renamedOptions = { + eqeq : "eqeqeq", + vars : "onevar", + windows : "wsh" + }, + + + // browser contains a set of global names which are commonly provided by a + // web browser environment. + browser = { + ArrayBuffer : false, + ArrayBufferView : false, + Audio : false, + Blob : false, + addEventListener : false, + applicationCache : false, + atob : false, + blur : false, + btoa : false, + clearInterval : false, + clearTimeout : false, + close : false, + closed : false, + DataView : false, + DOMParser : false, + defaultStatus : false, + document : false, + event : false, + FileReader : false, + Float32Array : false, + Float64Array : false, + FormData : false, + focus : false, + frames : false, + getComputedStyle : false, + HTMLElement : false, + HTMLAnchorElement : false, + HTMLBaseElement : false, + HTMLBlockquoteElement : false, + HTMLBodyElement : false, + HTMLBRElement : false, + HTMLButtonElement : false, + HTMLCanvasElement : false, + HTMLDirectoryElement : false, + HTMLDivElement : false, + HTMLDListElement : false, + HTMLFieldSetElement : false, + HTMLFontElement : false, + HTMLFormElement : false, + HTMLFrameElement : false, + HTMLFrameSetElement : false, + HTMLHeadElement : false, + HTMLHeadingElement : false, + HTMLHRElement : false, + HTMLHtmlElement : false, + HTMLIFrameElement : false, + HTMLImageElement : false, + HTMLInputElement : false, + HTMLIsIndexElement : false, + HTMLLabelElement : false, + HTMLLayerElement : false, + HTMLLegendElement : false, + HTMLLIElement : false, + HTMLLinkElement : false, + HTMLMapElement : false, + HTMLMenuElement : false, + HTMLMetaElement : false, + HTMLModElement : false, + HTMLObjectElement : false, + HTMLOListElement : false, + HTMLOptGroupElement : false, + HTMLOptionElement : false, + HTMLParagraphElement : false, + HTMLParamElement : false, + HTMLPreElement : false, + HTMLQuoteElement : false, + HTMLScriptElement : false, + HTMLSelectElement : false, + HTMLStyleElement : false, + HTMLTableCaptionElement : false, + HTMLTableCellElement : false, + HTMLTableColElement : false, + HTMLTableElement : false, + HTMLTableRowElement : false, + HTMLTableSectionElement : false, + HTMLTextAreaElement : false, + HTMLTitleElement : false, + HTMLUListElement : false, + HTMLVideoElement : false, + history : false, + Int16Array : false, + Int32Array : false, + Int8Array : false, + Image : false, + length : false, + localStorage : false, + location : false, + MessageChannel : false, + MessageEvent : false, + MessagePort : false, + moveBy : false, + moveTo : false, + MutationObserver : false, + name : false, + Node : false, + NodeFilter : false, + navigator : false, + onbeforeunload : true, + onblur : true, + onerror : true, + onfocus : true, + onload : true, + onresize : true, + onunload : true, + open : false, + openDatabase : false, + opener : false, + Option : false, + parent : false, + print : false, + removeEventListener : false, + resizeBy : false, + resizeTo : false, + screen : false, + scroll : false, + scrollBy : false, + scrollTo : false, + sessionStorage : false, + setInterval : false, + setTimeout : false, + SharedWorker : false, + status : false, + top : false, + Uint16Array : false, + Uint32Array : false, + Uint8Array : false, + WebSocket : false, + window : false, + Worker : false, + XMLHttpRequest : false, + XMLSerializer : false, + XPathEvaluator : false, + XPathException : false, + XPathExpression : false, + XPathNamespace : false, + XPathNSResolver : false, + XPathResult : false + }, + + couch = { + "require" : false, + respond : false, + getRow : false, + emit : false, + send : false, + start : false, + sum : false, + log : false, + exports : false, + module : false, + provides : false + }, + + declared, // Globals that were declared using /*global ... */ syntax. + + devel = { + alert : false, + confirm : false, + console : false, + Debug : false, + opera : false, + prompt : false + }, + + dojo = { + dojo : false, + dijit : false, + dojox : false, + define : false, + "require" : false + }, + + funct, // The current function + + functionicity = [ + "closure", "exception", "global", "label", + "outer", "unused", "var" + ], + + functions, // All of the functions + + global, // The global scope + implied, // Implied globals + inblock, + indent, + jsonmode, + + jquery = { + "$" : false, + jQuery : false + }, + + lines, + lookahead, + member, + membersOnly, + + mootools = { + "$" : false, + "$$" : false, + Asset : false, + Browser : false, + Chain : false, + Class : false, + Color : false, + Cookie : false, + Core : false, + Document : false, + DomReady : false, + DOMEvent : false, + DOMReady : false, + Drag : false, + Element : false, + Elements : false, + Event : false, + Events : false, + Fx : false, + Group : false, + Hash : false, + HtmlTable : false, + Iframe : false, + IframeShim : false, + InputValidator : false, + instanceOf : false, + Keyboard : false, + Locale : false, + Mask : false, + MooTools : false, + Native : false, + Options : false, + OverText : false, + Request : false, + Scroller : false, + Slick : false, + Slider : false, + Sortables : false, + Spinner : false, + Swiff : false, + Tips : false, + Type : false, + typeOf : false, + URI : false, + Window : false + }, + + nexttoken, + + node = { + __filename : false, + __dirname : false, + Buffer : false, + console : false, + exports : true, // In Node it is ok to exports = module.exports = foo(); + GLOBAL : false, + global : false, + module : false, + process : false, + require : false, + setTimeout : false, + clearTimeout : false, + setInterval : false, + clearInterval : false + }, + + noreach, + option, + predefined, // Global variables defined by option + prereg, + prevtoken, + + prototypejs = { + "$" : false, + "$$" : false, + "$A" : false, + "$F" : false, + "$H" : false, + "$R" : false, + "$break" : false, + "$continue" : false, + "$w" : false, + Abstract : false, + Ajax : false, + Class : false, + Enumerable : false, + Element : false, + Event : false, + Field : false, + Form : false, + Hash : false, + Insertion : false, + ObjectRange : false, + PeriodicalExecuter: false, + Position : false, + Prototype : false, + Selector : false, + Template : false, + Toggle : false, + Try : false, + Autocompleter : false, + Builder : false, + Control : false, + Draggable : false, + Draggables : false, + Droppables : false, + Effect : false, + Sortable : false, + SortableObserver : false, + Sound : false, + Scriptaculous : false + }, + + quotmark, + + rhino = { + defineClass : false, + deserialize : false, + gc : false, + help : false, + importPackage: false, + "java" : false, + load : false, + loadClass : false, + print : false, + quit : false, + readFile : false, + readUrl : false, + runCommand : false, + seal : false, + serialize : false, + spawn : false, + sync : false, + toint32 : false, + version : false + }, + + scope, // The current scope + stack, + + // standard contains the global names that are provided by the + // ECMAScript standard. + standard = { + Array : false, + Boolean : false, + Date : false, + decodeURI : false, + decodeURIComponent : false, + encodeURI : false, + encodeURIComponent : false, + Error : false, + "eval" : false, + EvalError : false, + Function : false, + hasOwnProperty : false, + isFinite : false, + isNaN : false, + JSON : false, + Map : false, + Math : false, + NaN : false, + Number : false, + Object : false, + parseInt : false, + parseFloat : false, + RangeError : false, + ReferenceError : false, + RegExp : false, + Set : false, + String : false, + SyntaxError : false, + TypeError : false, + URIError : false, + WeakMap : false + }, + + // widely adopted global names that are not part of ECMAScript standard + nonstandard = { + escape : false, + unescape : false + }, + + directive, + syntax = {}, + tab, + token, + unuseds, + urls, + useESNextSyntax, + warnings, + + worker = { + importScripts : true, + postMessage : true, + self : true + }, + + wsh = { + ActiveXObject : true, + Enumerator : true, + GetObject : true, + ScriptEngine : true, + ScriptEngineBuildVersion : true, + ScriptEngineMajorVersion : true, + ScriptEngineMinorVersion : true, + VBArray : true, + WSH : true, + WScript : true, + XDomainRequest : true + }, + + yui = { + YUI : false, + Y : false, + YUI_config : false + }; + // Regular expressions. Some of these are stupidly long. + var ax, cx, tx, nx, nxg, lx, ix, jx, ft; + (function () { + /*jshint maxlen:300 */ + + // unsafe comment or string + ax = /@cc|<\/?|script|\]\s*\]|<\s*!|</i; + + // unsafe characters that are silently deleted by one or more browsers + cx = /[\u0000-\u001f\u007f-\u009f\u00ad\u0600-\u0604\u070f\u17b4\u17b5\u200c-\u200f\u2028-\u202f\u2060-\u206f\ufeff\ufff0-\uffff]/; + + // token + tx = /^\s*([(){}\[.,:;'"~\?\]#@]|==?=?|\/=(?!(\S*\/[gim]?))|\/(\*(jshint|jslint|members?|global)?|\/)?|\*[\/=]?|\+(?:=|\++)?|-(?:=|-+)?|%=?|&[&=]?|\|[|=]?|>>?>?=?|<([\/=!]|\!(\[|--)?|<=?)?|\^=?|\!=?=?|[a-zA-Z_$][a-zA-Z0-9_$]*|[0-9]+([xX][0-9a-fA-F]+|\.[0-9]*)?([eE][+\-]?[0-9]+)?)/; + + // characters in strings that need escapement + nx = /[\u0000-\u001f&<"\/\\\u007f-\u009f\u00ad\u0600-\u0604\u070f\u17b4\u17b5\u200c-\u200f\u2028-\u202f\u2060-\u206f\ufeff\ufff0-\uffff]/; + nxg = /[\u0000-\u001f&<"\/\\\u007f-\u009f\u00ad\u0600-\u0604\u070f\u17b4\u17b5\u200c-\u200f\u2028-\u202f\u2060-\u206f\ufeff\ufff0-\uffff]/g; + + // star slash + lx = /\*\//; + + // identifier + ix = /^([a-zA-Z_$][a-zA-Z0-9_$]*)$/; + + // javascript url + jx = /^(?:javascript|jscript|ecmascript|vbscript|mocha|livescript)\s*:/i; + + // catches /* falls through */ comments + ft = /^\s*\/\*\s*falls\sthrough\s*\*\/\s*$/; + }()); + + function F() {} // Used by Object.create + + function is_own(object, name) { + // The object.hasOwnProperty method fails when the property under consideration + // is named 'hasOwnProperty'. So we have to use this more convoluted form. + return Object.prototype.hasOwnProperty.call(object, name); + } + + function checkOption(name, t) { + if (valOptions[name] === undefined && boolOptions[name] === undefined) { + warning("Bad option: '" + name + "'.", t); + } + } + + function isString(obj) { + return Object.prototype.toString.call(obj) === "[object String]"; + } + + // Provide critical ES5 functions to ES3. + + if (typeof Array.isArray !== "function") { + Array.isArray = function (o) { + return Object.prototype.toString.apply(o) === "[object Array]"; + }; + } + + if (!Array.prototype.forEach) { + Array.prototype.forEach = function (fn, scope) { + var len = this.length; + + for (var i = 0; i < len; i++) { + fn.call(scope || this, this[i], i, this); + } + }; + } + + if (!Array.prototype.indexOf) { + Array.prototype.indexOf = function (searchElement /*, fromIndex */ ) { + if (this === null || this === undefined) { + throw new TypeError(); + } + + var t = new Object(this); + var len = t.length >>> 0; + + if (len === 0) { + return -1; + } + + var n = 0; + if (arguments.length > 0) { + n = Number(arguments[1]); + if (n != n) { // shortcut for verifying if it's NaN + n = 0; + } else if (n !== 0 && n != Infinity && n != -Infinity) { + n = (n > 0 || -1) * Math.floor(Math.abs(n)); + } + } + + if (n >= len) { + return -1; + } + + var k = n >= 0 ? n : Math.max(len - Math.abs(n), 0); + for (; k < len; k++) { + if (k in t && t[k] === searchElement) { + return k; + } + } + + return -1; + }; + } + + if (typeof Object.create !== "function") { + Object.create = function (o) { + F.prototype = o; + return new F(); + }; + } + + if (typeof Object.keys !== "function") { + Object.keys = function (o) { + var a = [], k; + for (k in o) { + if (is_own(o, k)) { + a.push(k); + } + } + return a; + }; + } + + // Non standard methods + + function isAlpha(str) { + return (str >= "a" && str <= "z\uffff") || + (str >= "A" && str <= "Z\uffff"); + } + + function isDigit(str) { + return (str >= "0" && str <= "9"); + } + + function isIdentifier(token, value) { + if (!token) + return false; + + if (!token.identifier || token.value !== value) + return false; + + return true; + } + + function supplant(str, data) { + return str.replace(/\{([^{}]*)\}/g, function (a, b) { + var r = data[b]; + return typeof r === "string" || typeof r === "number" ? r : a; + }); + } + + function combine(t, o) { + var n; + for (n in o) { + if (is_own(o, n) && !is_own(JSHINT.blacklist, n)) { + t[n] = o[n]; + } + } + } + + function updatePredefined() { + Object.keys(JSHINT.blacklist).forEach(function (key) { + delete predefined[key]; + }); + } + + function assume() { + if (option.couch) { + combine(predefined, couch); + } + + if (option.rhino) { + combine(predefined, rhino); + } + + if (option.prototypejs) { + combine(predefined, prototypejs); + } + + if (option.node) { + combine(predefined, node); + option.globalstrict = true; + } + + if (option.devel) { + combine(predefined, devel); + } + + if (option.dojo) { + combine(predefined, dojo); + } + + if (option.browser) { + combine(predefined, browser); + } + + if (option.nonstandard) { + combine(predefined, nonstandard); + } + + if (option.jquery) { + combine(predefined, jquery); + } + + if (option.mootools) { + combine(predefined, mootools); + } + + if (option.worker) { + combine(predefined, worker); + } + + if (option.wsh) { + combine(predefined, wsh); + } + + if (option.esnext) { + useESNextSyntax(); + } + + if (option.globalstrict && option.strict !== false) { + option.strict = true; + } + + if (option.yui) { + combine(predefined, yui); + } + } + + + // Produce an error warning. + function quit(message, line, chr) { + var percentage = Math.floor((line / lines.length) * 100); + + throw { + name: "JSHintError", + line: line, + character: chr, + message: message + " (" + percentage + "% scanned).", + raw: message + }; + } + + function isundef(scope, m, t, a) { + return JSHINT.undefs.push([scope, m, t, a]); + } + + function warning(m, t, a, b, c, d) { + var ch, l, w; + t = t || nexttoken; + if (t.id === "(end)") { // `~ + t = token; + } + l = t.line || 0; + ch = t.from || 0; + w = { + id: "(error)", + raw: m, + evidence: lines[l - 1] || "", + line: l, + character: ch, + scope: JSHINT.scope, + a: a, + b: b, + c: c, + d: d + }; + w.reason = supplant(m, w); + JSHINT.errors.push(w); + if (option.passfail) { + quit("Stopping. ", l, ch); + } + warnings += 1; + if (warnings >= option.maxerr) { + quit("Too many errors.", l, ch); + } + return w; + } + + function warningAt(m, l, ch, a, b, c, d) { + return warning(m, { + line: l, + from: ch + }, a, b, c, d); + } + + function error(m, t, a, b, c, d) { + warning(m, t, a, b, c, d); + } + + function errorAt(m, l, ch, a, b, c, d) { + return error(m, { + line: l, + from: ch + }, a, b, c, d); + } + + // Tracking of "internal" scripts, like eval containing a static string + function addInternalSrc(elem, src) { + var i; + i = { + id: "(internal)", + elem: elem, + value: src + }; + JSHINT.internals.push(i); + return i; + } + + +// lexical analysis and token construction + + var lex = (function lex() { + var character, from, line, s; + +// Private lex methods + + function nextLine() { + var at, + match, + tw; // trailing whitespace check + + if (line >= lines.length) + return false; + + character = 1; + s = lines[line]; + line += 1; + + // If smarttabs option is used check for spaces followed by tabs only. + // Otherwise check for any occurence of mixed tabs and spaces. + // Tabs and one space followed by block comment is allowed. + if (option.smarttabs) { + // negative look-behind for "//" + match = s.match(/(\/\/)? \t/); + at = match && !match[1] ? 0 : -1; + } else { + at = s.search(/ \t|\t [^\*]/); + } + + if (at >= 0) + warningAt("Mixed spaces and tabs.", line, at + 1); + + s = s.replace(/\t/g, tab); + at = s.search(cx); + + if (at >= 0) + warningAt("Unsafe character.", line, at); + + if (option.maxlen && option.maxlen < s.length) + warningAt("Line too long.", line, s.length); + + // Check for trailing whitespaces + tw = option.trailing && s.match(/^(.*?)\s+$/); + if (tw && !/^\s+$/.test(s)) { + warningAt("Trailing whitespace.", line, tw[1].length + 1); + } + return true; + } + +// Produce a token object. The token inherits from a syntax symbol. + + function it(type, value) { + var i, t; + + function checkName(name) { + if (!option.proto && name === "__proto__") { + warningAt("The '{a}' property is deprecated.", line, from, name); + return; + } + + if (!option.iterator && name === "__iterator__") { + warningAt("'{a}' is only available in JavaScript 1.7.", line, from, name); + return; + } + + // Check for dangling underscores unless we're in Node + // environment and this identifier represents built-in + // Node globals with underscores. + + var hasDangling = /^(_+.*|.*_+)$/.test(name); + + if (option.nomen && hasDangling && name !== "_") { + if (option.node && token.id !== "." && /^(__dirname|__filename)$/.test(name)) + return; + + warningAt("Unexpected {a} in '{b}'.", line, from, "dangling '_'", name); + return; + } + + // Check for non-camelcase names. Names like MY_VAR and + // _myVar are okay though. + + if (option.camelcase) { + if (name.replace(/^_+/, "").indexOf("_") > -1 && !name.match(/^[A-Z0-9_]*$/)) { + warningAt("Identifier '{a}' is not in camel case.", line, from, value); + } + } + } + + if (type === "(color)" || type === "(range)") { + t = {type: type}; + } else if (type === "(punctuator)" || + (type === "(identifier)" && is_own(syntax, value))) { + t = syntax[value] || syntax["(error)"]; + } else { + t = syntax[type]; + } + + t = Object.create(t); + + if (type === "(string)" || type === "(range)") { + if (!option.scripturl && jx.test(value)) { + warningAt("Script URL.", line, from); + } + } + + if (type === "(identifier)") { + t.identifier = true; + checkName(value); + } + + t.value = value; + t.line = line; + t.character = character; + t.from = from; + i = t.id; + if (i !== "(endline)") { + prereg = i && + (("(,=:[!&|?{};".indexOf(i.charAt(i.length - 1)) >= 0) || + i === "return" || + i === "case"); + } + return t; + } + + // Public lex methods + return { + init: function (source) { + if (typeof source === "string") { + lines = source + .replace(/\r\n/g, "\n") + .replace(/\r/g, "\n") + .split("\n"); + } else { + lines = source; + } + + // If the first line is a shebang (#!), make it a blank and move on. + // Shebangs are used by Node scripts. + if (lines[0] && lines[0].substr(0, 2) === "#!") + lines[0] = ""; + + line = 0; + nextLine(); + from = 1; + }, + + range: function (begin, end) { + var c, value = ""; + from = character; + if (s.charAt(0) !== begin) { + errorAt("Expected '{a}' and instead saw '{b}'.", + line, character, begin, s.charAt(0)); + } + for (;;) { + s = s.slice(1); + character += 1; + c = s.charAt(0); + switch (c) { + case "": + errorAt("Missing '{a}'.", line, character, c); + break; + case end: + s = s.slice(1); + character += 1; + return it("(range)", value); + case "\\": + warningAt("Unexpected '{a}'.", line, character, c); + } + value += c; + } + + }, + + + // token -- this is called by advance to get the next token + token: function () { + var b, c, captures, d, depth, high, i, l, low, q, t, isLiteral, isInRange, n; + + function match(x) { + var r = x.exec(s), r1; + + if (r) { + l = r[0].length; + r1 = r[1]; + c = r1.charAt(0); + s = s.substr(l); + from = character + l - r1.length; + character += l; + return r1; + } + } + + function string(x) { + var c, j, r = "", allowNewLine = false; + + if (jsonmode && x !== "\"") { + warningAt("Strings must use doublequote.", + line, character); + } + + if (option.quotmark) { + if (option.quotmark === "single" && x !== "'") { + warningAt("Strings must use singlequote.", + line, character); + } else if (option.quotmark === "double" && x !== "\"") { + warningAt("Strings must use doublequote.", + line, character); + } else if (option.quotmark === true) { + quotmark = quotmark || x; + if (quotmark !== x) { + warningAt("Mixed double and single quotes.", + line, character); + } + } + } + + function esc(n) { + var i = parseInt(s.substr(j + 1, n), 16); + j += n; + if (i >= 32 && i <= 126 && + i !== 34 && i !== 92 && i !== 39) { + warningAt("Unnecessary escapement.", line, character); + } + character += n; + c = String.fromCharCode(i); + } + + j = 0; + +unclosedString: + for (;;) { + while (j >= s.length) { + j = 0; + + var cl = line, cf = from; + if (!nextLine()) { + errorAt("Unclosed string.", cl, cf); + break unclosedString; + } + + if (allowNewLine) { + allowNewLine = false; + } else { + warningAt("Unclosed string.", cl, cf); + } + } + + c = s.charAt(j); + if (c === x) { + character += 1; + s = s.substr(j + 1); + return it("(string)", r, x); + } + + if (c < " ") { + if (c === "\n" || c === "\r") { + break; + } + warningAt("Control character in string: {a}.", + line, character + j, s.slice(0, j)); + } else if (c === "\\") { + j += 1; + character += 1; + c = s.charAt(j); + n = s.charAt(j + 1); + switch (c) { + case "\\": + case "\"": + case "/": + break; + case "\'": + if (jsonmode) { + warningAt("Avoid \\'.", line, character); + } + break; + case "b": + c = "\b"; + break; + case "f": + c = "\f"; + break; + case "n": + c = "\n"; + break; + case "r": + c = "\r"; + break; + case "t": + c = "\t"; + break; + case "0": + c = "\0"; + // Octal literals fail in strict mode + // check if the number is between 00 and 07 + // where 'n' is the token next to 'c' + if (n >= 0 && n <= 7 && directive["use strict"]) { + warningAt( + "Octal literals are not allowed in strict mode.", + line, character); + } + break; + case "u": + esc(4); + break; + case "v": + if (jsonmode) { + warningAt("Avoid \\v.", line, character); + } + c = "\v"; + break; + case "x": + if (jsonmode) { + warningAt("Avoid \\x-.", line, character); + } + esc(2); + break; + case "": + // last character is escape character + // always allow new line if escaped, but show + // warning if option is not set + allowNewLine = true; + if (option.multistr) { + if (jsonmode) { + warningAt("Avoid EOL escapement.", line, character); + } + c = ""; + character -= 1; + break; + } + warningAt("Bad escapement of EOL. Use option multistr if needed.", + line, character); + break; + case "!": + if (s.charAt(j - 2) === "<") + break; + /*falls through*/ + default: + warningAt("Bad escapement.", line, character); + } + } + r += c; + character += 1; + j += 1; + } + } + + for (;;) { + if (!s) { + return it(nextLine() ? "(endline)" : "(end)", ""); + } + + t = match(tx); + + if (!t) { + t = ""; + c = ""; + while (s && s < "!") { + s = s.substr(1); + } + if (s) { + errorAt("Unexpected '{a}'.", line, character, s.substr(0, 1)); + s = ""; + } + } else { + + // identifier + + if (isAlpha(c) || c === "_" || c === "$") { + return it("(identifier)", t); + } + + // number + + if (isDigit(c)) { + if (!isFinite(Number(t))) { + warningAt("Bad number '{a}'.", + line, character, t); + } + if (isAlpha(s.substr(0, 1))) { + warningAt("Missing space after '{a}'.", + line, character, t); + } + if (c === "0") { + d = t.substr(1, 1); + if (isDigit(d)) { + if (token.id !== ".") { + warningAt("Don't use extra leading zeros '{a}'.", + line, character, t); + } + } else if (jsonmode && (d === "x" || d === "X")) { + warningAt("Avoid 0x-. '{a}'.", + line, character, t); + } + } + if (t.substr(t.length - 1) === ".") { + warningAt( +"A trailing decimal point can be confused with a dot '{a}'.", line, character, t); + } + return it("(number)", t); + } + switch (t) { + + // string + + case "\"": + case "'": + return string(t); + + // // comment + + case "//": + s = ""; + token.comment = true; + break; + + // /* comment + + case "/*": + for (;;) { + i = s.search(lx); + if (i >= 0) { + break; + } + if (!nextLine()) { + errorAt("Unclosed comment.", line, character); + } + } + s = s.substr(i + 2); + token.comment = true; + break; + + // /*members /*jshint /*global + + case "/*members": + case "/*member": + case "/*jshint": + case "/*jslint": + case "/*global": + case "*/": + return { + value: t, + type: "special", + line: line, + character: character, + from: from + }; + + case "": + break; + // / + case "/": + if (s.charAt(0) === "=") { + errorAt("A regular expression literal can be confused with '/='.", + line, from); + } + + if (prereg) { + depth = 0; + captures = 0; + l = 0; + for (;;) { + b = true; + c = s.charAt(l); + l += 1; + switch (c) { + case "": + errorAt("Unclosed regular expression.", line, from); + return quit("Stopping.", line, from); + case "/": + if (depth > 0) { + warningAt("{a} unterminated regular expression " + + "group(s).", line, from + l, depth); + } + c = s.substr(0, l - 1); + q = { + g: true, + i: true, + m: true + }; + while (q[s.charAt(l)] === true) { + q[s.charAt(l)] = false; + l += 1; + } + character += l; + s = s.substr(l); + q = s.charAt(0); + if (q === "/" || q === "*") { + errorAt("Confusing regular expression.", + line, from); + } + return it("(regexp)", c); + case "\\": + c = s.charAt(l); + if (c < " ") { + warningAt( +"Unexpected control character in regular expression.", line, from + l); + } else if (c === "<") { + warningAt( +"Unexpected escaped character '{a}' in regular expression.", line, from + l, c); + } + l += 1; + break; + case "(": + depth += 1; + b = false; + if (s.charAt(l) === "?") { + l += 1; + switch (s.charAt(l)) { + case ":": + case "=": + case "!": + l += 1; + break; + default: + warningAt( +"Expected '{a}' and instead saw '{b}'.", line, from + l, ":", s.charAt(l)); + } + } else { + captures += 1; + } + break; + case "|": + b = false; + break; + case ")": + if (depth === 0) { + warningAt("Unescaped '{a}'.", + line, from + l, ")"); + } else { + depth -= 1; + } + break; + case " ": + q = 1; + while (s.charAt(l) === " ") { + l += 1; + q += 1; + } + if (q > 1) { + warningAt( +"Spaces are hard to count. Use {{a}}.", line, from + l, q); + } + break; + case "[": + c = s.charAt(l); + if (c === "^") { + l += 1; + if (s.charAt(l) === "]") { + errorAt("Unescaped '{a}'.", + line, from + l, "^"); + } + } + if (c === "]") { + warningAt("Empty class.", line, + from + l - 1); + } + isLiteral = false; + isInRange = false; +klass: + do { + c = s.charAt(l); + l += 1; + switch (c) { + case "[": + case "^": + warningAt("Unescaped '{a}'.", + line, from + l, c); + if (isInRange) { + isInRange = false; + } else { + isLiteral = true; + } + break; + case "-": + if (isLiteral && !isInRange) { + isLiteral = false; + isInRange = true; + } else if (isInRange) { + isInRange = false; + } else if (s.charAt(l) === "]") { + isInRange = true; + } else { + if (option.regexdash !== (l === 2 || (l === 3 && + s.charAt(1) === "^"))) { + warningAt("Unescaped '{a}'.", + line, from + l - 1, "-"); + } + isLiteral = true; + } + break; + case "]": + if (isInRange && !option.regexdash) { + warningAt("Unescaped '{a}'.", + line, from + l - 1, "-"); + } + break klass; + case "\\": + c = s.charAt(l); + if (c < " ") { + warningAt( +"Unexpected control character in regular expression.", line, from + l); + } else if (c === "<") { + warningAt( +"Unexpected escaped character '{a}' in regular expression.", line, from + l, c); + } + l += 1; + + // \w, \s and \d are never part of a character range + if (/[wsd]/i.test(c)) { + if (isInRange) { + warningAt("Unescaped '{a}'.", + line, from + l, "-"); + isInRange = false; + } + isLiteral = false; + } else if (isInRange) { + isInRange = false; + } else { + isLiteral = true; + } + break; + case "/": + warningAt("Unescaped '{a}'.", + line, from + l - 1, "/"); + + if (isInRange) { + isInRange = false; + } else { + isLiteral = true; + } + break; + case "<": + if (isInRange) { + isInRange = false; + } else { + isLiteral = true; + } + break; + default: + if (isInRange) { + isInRange = false; + } else { + isLiteral = true; + } + } + } while (c); + break; + case ".": + if (option.regexp) { + warningAt("Insecure '{a}'.", line, + from + l, c); + } + break; + case "]": + case "?": + case "{": + case "}": + case "+": + case "*": + warningAt("Unescaped '{a}'.", line, + from + l, c); + } + if (b) { + switch (s.charAt(l)) { + case "?": + case "+": + case "*": + l += 1; + if (s.charAt(l) === "?") { + l += 1; + } + break; + case "{": + l += 1; + c = s.charAt(l); + if (c < "0" || c > "9") { + warningAt( +"Expected a number and instead saw '{a}'.", line, from + l, c); + break; // No reason to continue checking numbers. + } + l += 1; + low = +c; + for (;;) { + c = s.charAt(l); + if (c < "0" || c > "9") { + break; + } + l += 1; + low = +c + (low * 10); + } + high = low; + if (c === ",") { + l += 1; + high = Infinity; + c = s.charAt(l); + if (c >= "0" && c <= "9") { + l += 1; + high = +c; + for (;;) { + c = s.charAt(l); + if (c < "0" || c > "9") { + break; + } + l += 1; + high = +c + (high * 10); + } + } + } + if (s.charAt(l) !== "}") { + warningAt( +"Expected '{a}' and instead saw '{b}'.", line, from + l, "}", c); + } else { + l += 1; + } + if (s.charAt(l) === "?") { + l += 1; + } + if (low > high) { + warningAt( +"'{a}' should not be greater than '{b}'.", line, from + l, low, high); + } + } + } + } + c = s.substr(0, l - 1); + character += l; + s = s.substr(l); + return it("(regexp)", c); + } + return it("(punctuator)", t); + + // punctuator + + case "#": + return it("(punctuator)", t); + default: + return it("(punctuator)", t); + } + } + } + } + }; + }()); + + + function addlabel(t, type, token) { + if (t === "hasOwnProperty") { + warning("'hasOwnProperty' is a really bad name."); + } + + // Define t in the current function in the current scope. + if (type === "exception") { + if (is_own(funct["(context)"], t)) { + if (funct[t] !== true && !option.node) { + warning("Value of '{a}' may be overwritten in IE.", nexttoken, t); + } + } + } + + if (is_own(funct, t) && !funct["(global)"]) { + if (funct[t] === true) { + if (option.latedef) + warning("'{a}' was used before it was defined.", nexttoken, t); + } else { + if (!option.shadow && type !== "exception") { + warning("'{a}' is already defined.", nexttoken, t); + } + } + } + + funct[t] = type; + + if (token) { + funct["(tokens)"][t] = token; + } + + if (funct["(global)"]) { + global[t] = funct; + if (is_own(implied, t)) { + if (option.latedef) + warning("'{a}' was used before it was defined.", nexttoken, t); + delete implied[t]; + } + } else { + scope[t] = funct; + } + } + + + function doOption() { + var nt = nexttoken; + var o = nt.value; + var quotmarkValue = option.quotmark; + var predef = {}; + var b, obj, filter, t, tn, v, minus; + + switch (o) { + case "*/": + error("Unbegun comment."); + break; + case "/*members": + case "/*member": + o = "/*members"; + if (!membersOnly) { + membersOnly = {}; + } + obj = membersOnly; + option.quotmark = false; + break; + case "/*jshint": + case "/*jslint": + obj = option; + filter = boolOptions; + break; + case "/*global": + obj = predef; + break; + default: + error("What?"); + } + + t = lex.token(); + +loop: + for (;;) { + minus = false; + for (;;) { + if (t.type === "special" && t.value === "*/") { + break loop; + } + if (t.id !== "(endline)" && t.id !== ",") { + break; + } + t = lex.token(); + } + + if (o === "/*global" && t.value === "-") { + minus = true; + t = lex.token(); + } + + if (t.type !== "(string)" && t.type !== "(identifier)" && o !== "/*members") { + error("Bad option.", t); + } + + v = lex.token(); + if (v.id === ":") { + v = lex.token(); + + if (obj === membersOnly) { + error("Expected '{a}' and instead saw '{b}'.", t, "*/", ":"); + } + + if (o === "/*jshint") { + checkOption(t.value, t); + } + + var numericVals = [ + "maxstatements", + "maxparams", + "maxdepth", + "maxcomplexity", + "maxerr", + "maxlen", + "indent" + ]; + + if (numericVals.indexOf(t.value) > -1 && (o === "/*jshint" || o === "/*jslint")) { + b = +v.value; + + if (typeof b !== "number" || !isFinite(b) || b <= 0 || Math.floor(b) !== b) { + error("Expected a small integer and instead saw '{a}'.", v, v.value); + } + + if (t.value === "indent") + obj.white = true; + + obj[t.value] = b; + } else if (t.value === "validthis") { + if (funct["(global)"]) { + error("Option 'validthis' can't be used in a global scope."); + } else { + if (v.value === "true" || v.value === "false") + obj[t.value] = v.value === "true"; + else + error("Bad option value.", v); + } + } else if (t.value === "quotmark" && (o === "/*jshint")) { + switch (v.value) { + case "true": + obj.quotmark = true; + break; + case "false": + obj.quotmark = false; + break; + case "double": + case "single": + obj.quotmark = v.value; + break; + default: + error("Bad option value.", v); + } + } else if (v.value === "true" || v.value === "false") { + if (o === "/*jslint") { + tn = renamedOptions[t.value] || t.value; + obj[tn] = v.value === "true"; + if (invertedOptions[tn] !== undefined) { + obj[tn] = !obj[tn]; + } + } else { + obj[t.value] = v.value === "true"; + } + + if (t.value === "newcap") + obj["(explicitNewcap)"] = true; + } else { + error("Bad option value.", v); + } + t = lex.token(); + } else { + if (o === "/*jshint" || o === "/*jslint") { + error("Missing option value.", t); + } + + obj[t.value] = false; + + if (o === "/*global" && minus === true) { + JSHINT.blacklist[t.value] = t.value; + updatePredefined(); + } + + t = v; + } + } + + if (o === "/*members") { + option.quotmark = quotmarkValue; + } + + combine(predefined, predef); + + for (var key in predef) { + if (is_own(predef, key)) { + declared[key] = nt; + } + } + + if (filter) { + assume(); + } + } + + +// We need a peek function. If it has an argument, it peeks that much farther +// ahead. It is used to distinguish +// for ( var i in ... +// from +// for ( var i = ... + + function peek(p) { + var i = p || 0, j = 0, t; + + while (j <= i) { + t = lookahead[j]; + if (!t) { + t = lookahead[j] = lex.token(); + } + j += 1; + } + return t; + } + + + +// Produce the next token. It looks for programming errors. + + function advance(id, t) { + switch (token.id) { + case "(number)": + if (nexttoken.id === ".") { + warning("A dot following a number can be confused with a decimal point.", token); + } + break; + case "-": + if (nexttoken.id === "-" || nexttoken.id === "--") { + warning("Confusing minusses."); + } + break; + case "+": + if (nexttoken.id === "+" || nexttoken.id === "++") { + warning("Confusing plusses."); + } + break; + } + + if (token.type === "(string)" || token.identifier) { + anonname = token.value; + } + + if (id && nexttoken.id !== id) { + if (t) { + if (nexttoken.id === "(end)") { + warning("Unmatched '{a}'.", t, t.id); + } else { + warning("Expected '{a}' to match '{b}' from line {c} and instead saw '{d}'.", + nexttoken, id, t.id, t.line, nexttoken.value); + } + } else if (nexttoken.type !== "(identifier)" || + nexttoken.value !== id) { + warning("Expected '{a}' and instead saw '{b}'.", + nexttoken, id, nexttoken.value); + } + } + + prevtoken = token; + token = nexttoken; + for (;;) { + nexttoken = lookahead.shift() || lex.token(); + if (nexttoken.id === "(end)" || nexttoken.id === "(error)") { + return; + } + if (nexttoken.type === "special") { + doOption(); + } else { + if (nexttoken.id !== "(endline)") { + break; + } + } + } + } + + +// This is the heart of JSHINT, the Pratt parser. In addition to parsing, it +// is looking for ad hoc lint patterns. We add .fud to Pratt's model, which is +// like .nud except that it is only used on the first token of a statement. +// Having .fud makes it much easier to define statement-oriented languages like +// JavaScript. I retained Pratt's nomenclature. + +// .nud Null denotation +// .fud First null denotation +// .led Left denotation +// lbp Left binding power +// rbp Right binding power + +// They are elements of the parsing method called Top Down Operator Precedence. + + function expression(rbp, initial) { + var left, isArray = false, isObject = false; + + if (nexttoken.id === "(end)") + error("Unexpected early end of program.", token); + + advance(); + if (initial) { + anonname = "anonymous"; + funct["(verb)"] = token.value; + } + if (initial === true && token.fud) { + left = token.fud(); + } else { + if (token.nud) { + left = token.nud(); + } else { + if (nexttoken.type === "(number)" && token.id === ".") { + warning("A leading decimal point can be confused with a dot: '.{a}'.", + token, nexttoken.value); + advance(); + return token; + } else { + error("Expected an identifier and instead saw '{a}'.", + token, token.id); + } + } + while (rbp < nexttoken.lbp) { + isArray = token.value === "Array"; + isObject = token.value === "Object"; + + // #527, new Foo.Array(), Foo.Array(), new Foo.Object(), Foo.Object() + // Line breaks in IfStatement heads exist to satisfy the checkJSHint + // "Line too long." error. + if (left && (left.value || (left.first && left.first.value))) { + // If the left.value is not "new", or the left.first.value is a "." + // then safely assume that this is not "new Array()" and possibly + // not "new Object()"... + if (left.value !== "new" || + (left.first && left.first.value && left.first.value === ".")) { + isArray = false; + // ...In the case of Object, if the left.value and token.value + // are not equal, then safely assume that this not "new Object()" + if (left.value !== token.value) { + isObject = false; + } + } + } + + advance(); + if (isArray && token.id === "(" && nexttoken.id === ")") + warning("Use the array literal notation [].", token); + if (isObject && token.id === "(" && nexttoken.id === ")") + warning("Use the object literal notation {}.", token); + if (token.led) { + left = token.led(left); + } else { + error("Expected an operator and instead saw '{a}'.", + token, token.id); + } + } + } + return left; + } + + +// Functions for conformance of style. + + function adjacent(left, right) { + left = left || token; + right = right || nexttoken; + if (option.white) { + if (left.character !== right.from && left.line === right.line) { + left.from += (left.character - left.from); + warning("Unexpected space after '{a}'.", left, left.value); + } + } + } + + function nobreak(left, right) { + left = left || token; + right = right || nexttoken; + if (option.white && (left.character !== right.from || left.line !== right.line)) { + warning("Unexpected space before '{a}'.", right, right.value); + } + } + + function nospace(left, right) { + left = left || token; + right = right || nexttoken; + if (option.white && !left.comment) { + if (left.line === right.line) { + adjacent(left, right); + } + } + } + + function nonadjacent(left, right) { + if (option.white) { + left = left || token; + right = right || nexttoken; + if (left.value === ";" && right.value === ";") { + return; + } + if (left.line === right.line && left.character === right.from) { + left.from += (left.character - left.from); + warning("Missing space after '{a}'.", + left, left.value); + } + } + } + + function nobreaknonadjacent(left, right) { + left = left || token; + right = right || nexttoken; + if (!option.laxbreak && left.line !== right.line) { + warning("Bad line breaking before '{a}'.", right, right.id); + } else if (option.white) { + left = left || token; + right = right || nexttoken; + if (left.character === right.from) { + left.from += (left.character - left.from); + warning("Missing space after '{a}'.", + left, left.value); + } + } + } + + function indentation(bias) { + var i; + if (option.white && nexttoken.id !== "(end)") { + i = indent + (bias || 0); + if (nexttoken.from !== i) { + warning( +"Expected '{a}' to have an indentation at {b} instead at {c}.", + nexttoken, nexttoken.value, i, nexttoken.from); + } + } + } + + function nolinebreak(t) { + t = t || token; + if (t.line !== nexttoken.line) { + warning("Line breaking error '{a}'.", t, t.value); + } + } + + + function comma() { + if (token.line !== nexttoken.line) { + if (!option.laxcomma) { + if (comma.first) { + warning("Comma warnings can be turned off with 'laxcomma'"); + comma.first = false; + } + warning("Bad line breaking before '{a}'.", token, nexttoken.id); + } + } else if (!token.comment && token.character !== nexttoken.from && option.white) { + token.from += (token.character - token.from); + warning("Unexpected space after '{a}'.", token, token.value); + } + advance(","); + nonadjacent(token, nexttoken); + } + + +// Functional constructors for making the symbols that will be inherited by +// tokens. + + function symbol(s, p) { + var x = syntax[s]; + if (!x || typeof x !== "object") { + syntax[s] = x = { + id: s, + lbp: p, + value: s + }; + } + return x; + } + + + function delim(s) { + return symbol(s, 0); + } + + + function stmt(s, f) { + var x = delim(s); + x.identifier = x.reserved = true; + x.fud = f; + return x; + } + + + function blockstmt(s, f) { + var x = stmt(s, f); + x.block = true; + return x; + } + + + function reserveName(x) { + var c = x.id.charAt(0); + if ((c >= "a" && c <= "z") || (c >= "A" && c <= "Z")) { + x.identifier = x.reserved = true; + } + return x; + } + + + function prefix(s, f) { + var x = symbol(s, 150); + reserveName(x); + x.nud = (typeof f === "function") ? f : function () { + this.right = expression(150); + this.arity = "unary"; + if (this.id === "++" || this.id === "--") { + if (option.plusplus) { + warning("Unexpected use of '{a}'.", this, this.id); + } else if ((!this.right.identifier || this.right.reserved) && + this.right.id !== "." && this.right.id !== "[") { + warning("Bad operand.", this); + } + } + return this; + }; + return x; + } + + + function type(s, f) { + var x = delim(s); + x.type = s; + x.nud = f; + return x; + } + + + function reserve(s, f) { + var x = type(s, f); + x.identifier = x.reserved = true; + return x; + } + + + function reservevar(s, v) { + return reserve(s, function () { + if (typeof v === "function") { + v(this); + } + return this; + }); + } + + + function infix(s, f, p, w) { + var x = symbol(s, p); + reserveName(x); + x.led = function (left) { + if (!w) { + nobreaknonadjacent(prevtoken, token); + nonadjacent(token, nexttoken); + } + if (s === "in" && left.id === "!") { + warning("Confusing use of '{a}'.", left, "!"); + } + if (typeof f === "function") { + return f(left, this); + } else { + this.left = left; + this.right = expression(p); + return this; + } + }; + return x; + } + + + function relation(s, f) { + var x = symbol(s, 100); + x.led = function (left) { + nobreaknonadjacent(prevtoken, token); + nonadjacent(token, nexttoken); + var right = expression(100); + + if (isIdentifier(left, "NaN") || isIdentifier(right, "NaN")) { + warning("Use the isNaN function to compare with NaN.", this); + } else if (f) { + f.apply(this, [left, right]); + } + if (left.id === "!") { + warning("Confusing use of '{a}'.", left, "!"); + } + if (right.id === "!") { + warning("Confusing use of '{a}'.", right, "!"); + } + this.left = left; + this.right = right; + return this; + }; + return x; + } + + + function isPoorRelation(node) { + return node && + ((node.type === "(number)" && +node.value === 0) || + (node.type === "(string)" && node.value === "") || + (node.type === "null" && !option.eqnull) || + node.type === "true" || + node.type === "false" || + node.type === "undefined"); + } + + + function assignop(s) { + symbol(s, 20).exps = true; + + return infix(s, function (left, that) { + that.left = left; + + if (predefined[left.value] === false && + scope[left.value]["(global)"] === true) { + warning("Read only.", left); + } else if (left["function"]) { + warning("'{a}' is a function.", left, left.value); + } + + if (left) { + if (option.esnext && funct[left.value] === "const") { + warning("Attempting to override '{a}' which is a constant", left, left.value); + } + + if (left.id === "." || left.id === "[") { + if (!left.left || left.left.value === "arguments") { + warning("Bad assignment.", that); + } + that.right = expression(19); + return that; + } else if (left.identifier && !left.reserved) { + if (funct[left.value] === "exception") { + warning("Do not assign to the exception parameter.", left); + } + that.right = expression(19); + return that; + } + + if (left === syntax["function"]) { + warning( +"Expected an identifier in an assignment and instead saw a function invocation.", + token); + } + } + + error("Bad assignment.", that); + }, 20); + } + + + function bitwise(s, f, p) { + var x = symbol(s, p); + reserveName(x); + x.led = (typeof f === "function") ? f : function (left) { + if (option.bitwise) { + warning("Unexpected use of '{a}'.", this, this.id); + } + this.left = left; + this.right = expression(p); + return this; + }; + return x; + } + + + function bitwiseassignop(s) { + symbol(s, 20).exps = true; + return infix(s, function (left, that) { + if (option.bitwise) { + warning("Unexpected use of '{a}'.", that, that.id); + } + nonadjacent(prevtoken, token); + nonadjacent(token, nexttoken); + if (left) { + if (left.id === "." || left.id === "[" || + (left.identifier && !left.reserved)) { + expression(19); + return that; + } + if (left === syntax["function"]) { + warning( +"Expected an identifier in an assignment, and instead saw a function invocation.", + token); + } + return that; + } + error("Bad assignment.", that); + }, 20); + } + + + function suffix(s) { + var x = symbol(s, 150); + x.led = function (left) { + if (option.plusplus) { + warning("Unexpected use of '{a}'.", this, this.id); + } else if ((!left.identifier || left.reserved) && + left.id !== "." && left.id !== "[") { + warning("Bad operand.", this); + } + this.left = left; + return this; + }; + return x; + } + + + // fnparam means that this identifier is being defined as a function + // argument (see identifier()) + function optionalidentifier(fnparam) { + if (nexttoken.identifier) { + advance(); + if (token.reserved && !option.es5) { + // `undefined` as a function param is a common pattern to protect + // against the case when somebody does `undefined = true` and + // help with minification. More info: https://gist.github.com/315916 + if (!fnparam || token.value !== "undefined") { + warning("Expected an identifier and instead saw '{a}' (a reserved word).", + token, token.id); + } + } + return token.value; + } + } + + // fnparam means that this identifier is being defined as a function + // argument + function identifier(fnparam) { + var i = optionalidentifier(fnparam); + if (i) { + return i; + } + if (token.id === "function" && nexttoken.id === "(") { + warning("Missing name in function declaration."); + } else { + error("Expected an identifier and instead saw '{a}'.", + nexttoken, nexttoken.value); + } + } + + + function reachable(s) { + var i = 0, t; + if (nexttoken.id !== ";" || noreach) { + return; + } + for (;;) { + t = peek(i); + if (t.reach) { + return; + } + if (t.id !== "(endline)") { + if (t.id === "function") { + if (!option.latedef) { + break; + } + warning( +"Inner functions should be listed at the top of the outer function.", t); + break; + } + warning("Unreachable '{a}' after '{b}'.", t, t.value, s); + break; + } + i += 1; + } + } + + + function statement(noindent) { + var i = indent, r, s = scope, t = nexttoken; + + if (t.id === ";") { + advance(";"); + return; + } + + // Is this a labelled statement? + + if (t.identifier && !t.reserved && peek().id === ":") { + advance(); + advance(":"); + scope = Object.create(s); + addlabel(t.value, "label"); + + if (!nexttoken.labelled && nexttoken.value !== "{") { + warning("Label '{a}' on {b} statement.", nexttoken, t.value, nexttoken.value); + } + + if (jx.test(t.value + ":")) { + warning("Label '{a}' looks like a javascript url.", t, t.value); + } + + nexttoken.label = t.value; + t = nexttoken; + } + + // Is it a lonely block? + + if (t.id === "{") { + block(true, true); + return; + } + + // Parse the statement. + + if (!noindent) { + indentation(); + } + r = expression(0, true); + + // Look for the final semicolon. + + if (!t.block) { + if (!option.expr && (!r || !r.exps)) { + warning("Expected an assignment or function call and instead saw an expression.", + token); + } else if (option.nonew && r.id === "(" && r.left.id === "new") { + warning("Do not use 'new' for side effects.", t); + } + + if (nexttoken.id === ",") { + return comma(); + } + + if (nexttoken.id !== ";") { + if (!option.asi) { + // If this is the last statement in a block that ends on + // the same line *and* option lastsemic is on, ignore the warning. + // Otherwise, complain about missing semicolon. + if (!option.lastsemic || nexttoken.id !== "}" || + nexttoken.line !== token.line) { + warningAt("Missing semicolon.", token.line, token.character); + } + } + } else { + adjacent(token, nexttoken); + advance(";"); + nonadjacent(token, nexttoken); + } + } + +// Restore the indentation. + + indent = i; + scope = s; + return r; + } + + + function statements(startLine) { + var a = [], p; + + while (!nexttoken.reach && nexttoken.id !== "(end)") { + if (nexttoken.id === ";") { + p = peek(); + if (!p || p.id !== "(") { + warning("Unnecessary semicolon."); + } + advance(";"); + } else { + a.push(statement(startLine === nexttoken.line)); + } + } + return a; + } + + + /* + * read all directives + * recognizes a simple form of asi, but always + * warns, if it is used + */ + function directives() { + var i, p, pn; + + for (;;) { + if (nexttoken.id === "(string)") { + p = peek(0); + if (p.id === "(endline)") { + i = 1; + do { + pn = peek(i); + i = i + 1; + } while (pn.id === "(endline)"); + + if (pn.id !== ";") { + if (pn.id !== "(string)" && pn.id !== "(number)" && + pn.id !== "(regexp)" && pn.identifier !== true && + pn.id !== "}") { + break; + } + warning("Missing semicolon.", nexttoken); + } else { + p = pn; + } + } else if (p.id === "}") { + // directive with no other statements, warn about missing semicolon + warning("Missing semicolon.", p); + } else if (p.id !== ";") { + break; + } + + indentation(); + advance(); + if (directive[token.value]) { + warning("Unnecessary directive \"{a}\".", token, token.value); + } + + if (token.value === "use strict") { + if (!option["(explicitNewcap)"]) + option.newcap = true; + option.undef = true; + } + + // there's no directive negation, so always set to true + directive[token.value] = true; + + if (p.id === ";") { + advance(";"); + } + continue; + } + break; + } + } + + + /* + * Parses a single block. A block is a sequence of statements wrapped in + * braces. + * + * ordinary - true for everything but function bodies and try blocks. + * stmt - true if block can be a single statement (e.g. in if/for/while). + * isfunc - true if block is a function body + */ + function block(ordinary, stmt, isfunc) { + var a, + b = inblock, + old_indent = indent, + m, + s = scope, + t, + line, + d; + + inblock = ordinary; + + if (!ordinary || !option.funcscope) + scope = Object.create(scope); + + nonadjacent(token, nexttoken); + t = nexttoken; + + var metrics = funct["(metrics)"]; + metrics.nestedBlockDepth += 1; + metrics.verifyMaxNestedBlockDepthPerFunction(); + + if (nexttoken.id === "{") { + advance("{"); + line = token.line; + if (nexttoken.id !== "}") { + indent += option.indent; + while (!ordinary && nexttoken.from > indent) { + indent += option.indent; + } + + if (isfunc) { + m = {}; + for (d in directive) { + if (is_own(directive, d)) { + m[d] = directive[d]; + } + } + directives(); + + if (option.strict && funct["(context)"]["(global)"]) { + if (!m["use strict"] && !directive["use strict"]) { + warning("Missing \"use strict\" statement."); + } + } + } + + a = statements(line); + + metrics.statementCount += a.length; + + if (isfunc) { + directive = m; + } + + indent -= option.indent; + if (line !== nexttoken.line) { + indentation(); + } + } else if (line !== nexttoken.line) { + indentation(); + } + advance("}", t); + indent = old_indent; + } else if (!ordinary) { + error("Expected '{a}' and instead saw '{b}'.", + nexttoken, "{", nexttoken.value); + } else { + if (!stmt || option.curly) + warning("Expected '{a}' and instead saw '{b}'.", + nexttoken, "{", nexttoken.value); + + noreach = true; + indent += option.indent; + // test indentation only if statement is in new line + a = [statement(nexttoken.line === token.line)]; + indent -= option.indent; + noreach = false; + } + funct["(verb)"] = null; + if (!ordinary || !option.funcscope) scope = s; + inblock = b; + if (ordinary && option.noempty && (!a || a.length === 0)) { + warning("Empty block."); + } + metrics.nestedBlockDepth -= 1; + return a; + } + + + function countMember(m) { + if (membersOnly && typeof membersOnly[m] !== "boolean") { + warning("Unexpected /*member '{a}'.", token, m); + } + if (typeof member[m] === "number") { + member[m] += 1; + } else { + member[m] = 1; + } + } + + + function note_implied(token) { + var name = token.value, line = token.line, a = implied[name]; + if (typeof a === "function") { + a = false; + } + + if (!a) { + a = [line]; + implied[name] = a; + } else if (a[a.length - 1] !== line) { + a.push(line); + } + } + + + // Build the syntax table by declaring the syntactic elements of the language. + + type("(number)", function () { + return this; + }); + + type("(string)", function () { + return this; + }); + + syntax["(identifier)"] = { + type: "(identifier)", + lbp: 0, + identifier: true, + nud: function () { + var v = this.value, + s = scope[v], + f; + + if (typeof s === "function") { + // Protection against accidental inheritance. + s = undefined; + } else if (typeof s === "boolean") { + f = funct; + funct = functions[0]; + addlabel(v, "var"); + s = funct; + funct = f; + } + + // The name is in scope and defined in the current function. + if (funct === s) { + // Change 'unused' to 'var', and reject labels. + switch (funct[v]) { + case "unused": + funct[v] = "var"; + break; + case "unction": + funct[v] = "function"; + this["function"] = true; + break; + case "function": + this["function"] = true; + break; + case "label": + warning("'{a}' is a statement label.", token, v); + break; + } + } else if (funct["(global)"]) { + // The name is not defined in the function. If we are in the global + // scope, then we have an undefined variable. + // + // Operators typeof and delete do not raise runtime errors even if + // the base object of a reference is null so no need to display warning + // if we're inside of typeof or delete. + + if (option.undef && typeof predefined[v] !== "boolean") { + // Attempting to subscript a null reference will throw an + // error, even within the typeof and delete operators + if (!(anonname === "typeof" || anonname === "delete") || + (nexttoken && (nexttoken.value === "." || nexttoken.value === "["))) { + + isundef(funct, "'{a}' is not defined.", token, v); + } + } + + note_implied(token); + } else { + // If the name is already defined in the current + // function, but not as outer, then there is a scope error. + + switch (funct[v]) { + case "closure": + case "function": + case "var": + case "unused": + warning("'{a}' used out of scope.", token, v); + break; + case "label": + warning("'{a}' is a statement label.", token, v); + break; + case "outer": + case "global": + break; + default: + // If the name is defined in an outer function, make an outer entry, + // and if it was unused, make it var. + if (s === true) { + funct[v] = true; + } else if (s === null) { + warning("'{a}' is not allowed.", token, v); + note_implied(token); + } else if (typeof s !== "object") { + // Operators typeof and delete do not raise runtime errors even + // if the base object of a reference is null so no need to + // display warning if we're inside of typeof or delete. + if (option.undef) { + // Attempting to subscript a null reference will throw an + // error, even within the typeof and delete operators + if (!(anonname === "typeof" || anonname === "delete") || + (nexttoken && + (nexttoken.value === "." || nexttoken.value === "["))) { + + isundef(funct, "'{a}' is not defined.", token, v); + } + } + funct[v] = true; + note_implied(token); + } else { + switch (s[v]) { + case "function": + case "unction": + this["function"] = true; + s[v] = "closure"; + funct[v] = s["(global)"] ? "global" : "outer"; + break; + case "var": + case "unused": + s[v] = "closure"; + funct[v] = s["(global)"] ? "global" : "outer"; + break; + case "closure": + funct[v] = s["(global)"] ? "global" : "outer"; + break; + case "label": + warning("'{a}' is a statement label.", token, v); + } + } + } + } + return this; + }, + led: function () { + error("Expected an operator and instead saw '{a}'.", + nexttoken, nexttoken.value); + } + }; + + type("(regexp)", function () { + return this; + }); + + +// ECMAScript parser + + delim("(endline)"); + delim("(begin)"); + delim("(end)").reach = true; + delim(""); + delim("(error)").reach = true; + delim("}").reach = true; + delim(")"); + delim("]"); + delim("\"").reach = true; + delim("'").reach = true; + delim(";"); + delim(":").reach = true; + delim(","); + delim("#"); + delim("@"); + reserve("else"); + reserve("case").reach = true; + reserve("catch"); + reserve("default").reach = true; + reserve("finally"); + reservevar("arguments", function (x) { + if (directive["use strict"] && funct["(global)"]) { + warning("Strict violation.", x); + } + }); + reservevar("eval"); + reservevar("false"); + reservevar("Infinity"); + reservevar("null"); + reservevar("this", function (x) { + if (directive["use strict"] && !option.validthis && ((funct["(statement)"] && + funct["(name)"].charAt(0) > "Z") || funct["(global)"])) { + warning("Possible strict violation.", x); + } + }); + reservevar("true"); + reservevar("undefined"); + assignop("=", "assign", 20); + assignop("+=", "assignadd", 20); + assignop("-=", "assignsub", 20); + assignop("*=", "assignmult", 20); + assignop("/=", "assigndiv", 20).nud = function () { + error("A regular expression literal can be confused with '/='."); + }; + assignop("%=", "assignmod", 20); + bitwiseassignop("&=", "assignbitand", 20); + bitwiseassignop("|=", "assignbitor", 20); + bitwiseassignop("^=", "assignbitxor", 20); + bitwiseassignop("<<=", "assignshiftleft", 20); + bitwiseassignop(">>=", "assignshiftright", 20); + bitwiseassignop(">>>=", "assignshiftrightunsigned", 20); + infix("?", function (left, that) { + that.left = left; + that.right = expression(10); + advance(":"); + that["else"] = expression(10); + return that; + }, 30); + + infix("||", "or", 40); + infix("&&", "and", 50); + bitwise("|", "bitor", 70); + bitwise("^", "bitxor", 80); + bitwise("&", "bitand", 90); + relation("==", function (left, right) { + var eqnull = option.eqnull && (left.value === "null" || right.value === "null"); + + if (!eqnull && option.eqeqeq) + warning("Expected '{a}' and instead saw '{b}'.", this, "===", "=="); + else if (isPoorRelation(left)) + warning("Use '{a}' to compare with '{b}'.", this, "===", left.value); + else if (isPoorRelation(right)) + warning("Use '{a}' to compare with '{b}'.", this, "===", right.value); + + return this; + }); + relation("==="); + relation("!=", function (left, right) { + var eqnull = option.eqnull && + (left.value === "null" || right.value === "null"); + + if (!eqnull && option.eqeqeq) { + warning("Expected '{a}' and instead saw '{b}'.", + this, "!==", "!="); + } else if (isPoorRelation(left)) { + warning("Use '{a}' to compare with '{b}'.", + this, "!==", left.value); + } else if (isPoorRelation(right)) { + warning("Use '{a}' to compare with '{b}'.", + this, "!==", right.value); + } + return this; + }); + relation("!=="); + relation("<"); + relation(">"); + relation("<="); + relation(">="); + bitwise("<<", "shiftleft", 120); + bitwise(">>", "shiftright", 120); + bitwise(">>>", "shiftrightunsigned", 120); + infix("in", "in", 120); + infix("instanceof", "instanceof", 120); + infix("+", function (left, that) { + var right = expression(130); + if (left && right && left.id === "(string)" && right.id === "(string)") { + left.value += right.value; + left.character = right.character; + if (!option.scripturl && jx.test(left.value)) { + warning("JavaScript URL.", left); + } + return left; + } + that.left = left; + that.right = right; + return that; + }, 130); + prefix("+", "num"); + prefix("+++", function () { + warning("Confusing pluses."); + this.right = expression(150); + this.arity = "unary"; + return this; + }); + infix("+++", function (left) { + warning("Confusing pluses."); + this.left = left; + this.right = expression(130); + return this; + }, 130); + infix("-", "sub", 130); + prefix("-", "neg"); + prefix("---", function () { + warning("Confusing minuses."); + this.right = expression(150); + this.arity = "unary"; + return this; + }); + infix("---", function (left) { + warning("Confusing minuses."); + this.left = left; + this.right = expression(130); + return this; + }, 130); + infix("*", "mult", 140); + infix("/", "div", 140); + infix("%", "mod", 140); + + suffix("++", "postinc"); + prefix("++", "preinc"); + syntax["++"].exps = true; + + suffix("--", "postdec"); + prefix("--", "predec"); + syntax["--"].exps = true; + prefix("delete", function () { + var p = expression(0); + if (!p || (p.id !== "." && p.id !== "[")) { + warning("Variables should not be deleted."); + } + this.first = p; + return this; + }).exps = true; + + prefix("~", function () { + if (option.bitwise) { + warning("Unexpected '{a}'.", this, "~"); + } + expression(150); + return this; + }); + + prefix("!", function () { + this.right = expression(150); + this.arity = "unary"; + if (bang[this.right.id] === true) { + warning("Confusing use of '{a}'.", this, "!"); + } + return this; + }); + prefix("typeof", "typeof"); + prefix("new", function () { + var c = expression(155), i; + if (c && c.id !== "function") { + if (c.identifier) { + c["new"] = true; + switch (c.value) { + case "Number": + case "String": + case "Boolean": + case "Math": + case "JSON": + warning("Do not use {a} as a constructor.", prevtoken, c.value); + break; + case "Function": + if (!option.evil) { + warning("The Function constructor is eval."); + } + break; + case "Date": + case "RegExp": + break; + default: + if (c.id !== "function") { + i = c.value.substr(0, 1); + if (option.newcap && (i < "A" || i > "Z") && !is_own(global, c.value)) { + warning("A constructor name should start with an uppercase letter.", + token); + } + } + } + } else { + if (c.id !== "." && c.id !== "[" && c.id !== "(") { + warning("Bad constructor.", token); + } + } + } else { + if (!option.supernew) + warning("Weird construction. Delete 'new'.", this); + } + adjacent(token, nexttoken); + if (nexttoken.id !== "(" && !option.supernew) { + warning("Missing '()' invoking a constructor.", + token, token.value); + } + this.first = c; + return this; + }); + syntax["new"].exps = true; + + prefix("void").exps = true; + + infix(".", function (left, that) { + adjacent(prevtoken, token); + nobreak(); + var m = identifier(); + if (typeof m === "string") { + countMember(m); + } + that.left = left; + that.right = m; + if (left && left.value === "arguments" && (m === "callee" || m === "caller")) { + if (option.noarg) + warning("Avoid arguments.{a}.", left, m); + else if (directive["use strict"]) + error("Strict violation."); + } else if (!option.evil && left && left.value === "document" && + (m === "write" || m === "writeln")) { + warning("document.write can be a form of eval.", left); + } + if (!option.evil && (m === "eval" || m === "execScript")) { + warning("eval is evil."); + } + return that; + }, 160, true); + + infix("(", function (left, that) { + if (prevtoken.id !== "}" && prevtoken.id !== ")") { + nobreak(prevtoken, token); + } + nospace(); + if (option.immed && !left.immed && left.id === "function") { + warning("Wrap an immediate function invocation in parentheses " + + "to assist the reader in understanding that the expression " + + "is the result of a function, and not the function itself."); + } + var n = 0, + p = []; + if (left) { + if (left.type === "(identifier)") { + if (left.value.match(/^[A-Z]([A-Z0-9_$]*[a-z][A-Za-z0-9_$]*)?$/)) { + if ("Number String Boolean Date Object".indexOf(left.value) === -1) { + if (left.value === "Math") { + warning("Math is not a function.", left); + } else if (option.newcap) { + warning("Missing 'new' prefix when invoking a constructor.", left); + } + } + } + } + } + if (nexttoken.id !== ")") { + for (;;) { + p[p.length] = expression(10); + n += 1; + if (nexttoken.id !== ",") { + break; + } + comma(); + } + } + advance(")"); + nospace(prevtoken, token); + if (typeof left === "object") { + if (left.value === "parseInt" && n === 1) { + warning("Missing radix parameter.", token); + } + if (!option.evil) { + if (left.value === "eval" || left.value === "Function" || + left.value === "execScript") { + warning("eval is evil.", left); + + if (p[0] && [0].id === "(string)") { + addInternalSrc(left, p[0].value); + } + } else if (p[0] && p[0].id === "(string)" && + (left.value === "setTimeout" || + left.value === "setInterval")) { + warning( + "Implied eval is evil. Pass a function instead of a string.", left); + addInternalSrc(left, p[0].value); + + // window.setTimeout/setInterval + } else if (p[0] && p[0].id === "(string)" && + left.value === "." && + left.left.value === "window" && + (left.right === "setTimeout" || + left.right === "setInterval")) { + warning( + "Implied eval is evil. Pass a function instead of a string.", left); + addInternalSrc(left, p[0].value); + } + } + if (!left.identifier && left.id !== "." && left.id !== "[" && + left.id !== "(" && left.id !== "&&" && left.id !== "||" && + left.id !== "?") { + warning("Bad invocation.", left); + } + } + that.left = left; + return that; + }, 155, true).exps = true; + + prefix("(", function () { + nospace(); + if (nexttoken.id === "function") { + nexttoken.immed = true; + } + var v = expression(0); + advance(")", this); + nospace(prevtoken, token); + if (option.immed && v.id === "function") { + if (nexttoken.id !== "(" && + (nexttoken.id !== "." || (peek().value !== "call" && peek().value !== "apply"))) { + warning( +"Do not wrap function literals in parens unless they are to be immediately invoked.", + this); + } + } + + return v; + }); + + infix("[", function (left, that) { + nobreak(prevtoken, token); + nospace(); + var e = expression(0), s; + if (e && e.type === "(string)") { + if (!option.evil && (e.value === "eval" || e.value === "execScript")) { + warning("eval is evil.", that); + } + countMember(e.value); + if (!option.sub && ix.test(e.value)) { + s = syntax[e.value]; + if (!s || !s.reserved) { + warning("['{a}'] is better written in dot notation.", + prevtoken, e.value); + } + } + } + advance("]", that); + nospace(prevtoken, token); + that.left = left; + that.right = e; + return that; + }, 160, true); + + prefix("[", function () { + var b = token.line !== nexttoken.line; + this.first = []; + if (b) { + indent += option.indent; + if (nexttoken.from === indent + option.indent) { + indent += option.indent; + } + } + while (nexttoken.id !== "(end)") { + while (nexttoken.id === ",") { + if (!option.es5) + warning("Extra comma."); + advance(","); + } + if (nexttoken.id === "]") { + break; + } + if (b && token.line !== nexttoken.line) { + indentation(); + } + this.first.push(expression(10)); + if (nexttoken.id === ",") { + comma(); + if (nexttoken.id === "]" && !option.es5) { + warning("Extra comma.", token); + break; + } + } else { + break; + } + } + if (b) { + indent -= option.indent; + indentation(); + } + advance("]", this); + return this; + }, 160); + + + function property_name() { + var id = optionalidentifier(true); + if (!id) { + if (nexttoken.id === "(string)") { + id = nexttoken.value; + advance(); + } else if (nexttoken.id === "(number)") { + id = nexttoken.value.toString(); + advance(); + } + } + return id; + } + + + function functionparams() { + var next = nexttoken; + var params = []; + var ident; + + advance("("); + nospace(); + + if (nexttoken.id === ")") { + advance(")"); + return; + } + + for (;;) { + ident = identifier(true); + params.push(ident); + addlabel(ident, "unused", token); + if (nexttoken.id === ",") { + comma(); + } else { + advance(")", next); + nospace(prevtoken, token); + return params; + } + } + } + + + function doFunction(name, statement) { + var f; + var oldOption = option; + var oldScope = scope; + + option = Object.create(option); + scope = Object.create(scope); + + funct = { + "(name)" : name || "\"" + anonname + "\"", + "(line)" : nexttoken.line, + "(character)": nexttoken.character, + "(context)" : funct, + "(breakage)" : 0, + "(loopage)" : 0, + "(metrics)" : createMetrics(nexttoken), + "(scope)" : scope, + "(statement)": statement, + "(tokens)" : {} + }; + + f = funct; + token.funct = funct; + + functions.push(funct); + + if (name) { + addlabel(name, "function"); + } + + funct["(params)"] = functionparams(); + funct["(metrics)"].verifyMaxParametersPerFunction(funct["(params)"]); + + block(false, false, true); + + funct["(metrics)"].verifyMaxStatementsPerFunction(); + funct["(metrics)"].verifyMaxComplexityPerFunction(); + + scope = oldScope; + option = oldOption; + funct["(last)"] = token.line; + funct["(lastcharacter)"] = token.character; + funct = funct["(context)"]; + + return f; + } + + function createMetrics(functionStartToken) { + return { + statementCount: 0, + nestedBlockDepth: -1, + ComplexityCount: 1, + verifyMaxStatementsPerFunction: function () { + if (option.maxstatements && + this.statementCount > option.maxstatements) { + var message = "Too many statements per function (" + this.statementCount + ")."; + warning(message, functionStartToken); + } + }, + + verifyMaxParametersPerFunction: function (params) { + params = params || []; + + if (option.maxparams && params.length > option.maxparams) { + var message = "Too many parameters per function (" + params.length + ")."; + warning(message, functionStartToken); + } + }, + + verifyMaxNestedBlockDepthPerFunction: function () { + if (option.maxdepth && + this.nestedBlockDepth > 0 && + this.nestedBlockDepth === option.maxdepth + 1) { + var message = "Blocks are nested too deeply (" + this.nestedBlockDepth + ")."; + warning(message); + } + }, + + verifyMaxComplexityPerFunction: function () { + var max = option.maxcomplexity; + var cc = this.ComplexityCount; + if (max && cc > max) { + var message = "Cyclomatic complexity is too high per function (" + cc + ")."; + warning(message, functionStartToken); + } + } + }; + } + + function increaseComplexityCount() { + funct["(metrics)"].ComplexityCount += 1; + } + + + (function (x) { + x.nud = function () { + var b, f, i, p, t; + var props = {}; // All properties, including accessors + + function saveProperty(name, token) { + if (props[name] && is_own(props, name)) + warning("Duplicate member '{a}'.", nexttoken, i); + else + props[name] = {}; + + props[name].basic = true; + props[name].basicToken = token; + } + + function saveSetter(name, token) { + if (props[name] && is_own(props, name)) { + if (props[name].basic || props[name].setter) + warning("Duplicate member '{a}'.", nexttoken, i); + } else { + props[name] = {}; + } + + props[name].setter = true; + props[name].setterToken = token; + } + + function saveGetter(name) { + if (props[name] && is_own(props, name)) { + if (props[name].basic || props[name].getter) + warning("Duplicate member '{a}'.", nexttoken, i); + } else { + props[name] = {}; + } + + props[name].getter = true; + props[name].getterToken = token; + } + + b = token.line !== nexttoken.line; + if (b) { + indent += option.indent; + if (nexttoken.from === indent + option.indent) { + indent += option.indent; + } + } + for (;;) { + if (nexttoken.id === "}") { + break; + } + if (b) { + indentation(); + } + if (nexttoken.value === "get" && peek().id !== ":") { + advance("get"); + if (!option.es5) { + error("get/set are ES5 features."); + } + i = property_name(); + if (!i) { + error("Missing property name."); + } + saveGetter(i); + t = nexttoken; + adjacent(token, nexttoken); + f = doFunction(); + p = f["(params)"]; + if (p) { + warning("Unexpected parameter '{a}' in get {b} function.", t, p[0], i); + } + adjacent(token, nexttoken); + } else if (nexttoken.value === "set" && peek().id !== ":") { + advance("set"); + if (!option.es5) { + error("get/set are ES5 features."); + } + i = property_name(); + if (!i) { + error("Missing property name."); + } + saveSetter(i, nexttoken); + t = nexttoken; + adjacent(token, nexttoken); + f = doFunction(); + p = f["(params)"]; + if (!p || p.length !== 1) { + warning("Expected a single parameter in set {a} function.", t, i); + } + } else { + i = property_name(); + saveProperty(i, nexttoken); + if (typeof i !== "string") { + break; + } + advance(":"); + nonadjacent(token, nexttoken); + expression(10); + } + + countMember(i); + if (nexttoken.id === ",") { + comma(); + if (nexttoken.id === ",") { + warning("Extra comma.", token); + } else if (nexttoken.id === "}" && !option.es5) { + warning("Extra comma.", token); + } + } else { + break; + } + } + if (b) { + indent -= option.indent; + indentation(); + } + advance("}", this); + + // Check for lonely setters if in the ES5 mode. + if (option.es5) { + for (var name in props) { + if (is_own(props, name) && props[name].setter && !props[name].getter) { + warning("Setter is defined without getter.", props[name].setterToken); + } + } + } + return this; + }; + x.fud = function () { + error("Expected to see a statement and instead saw a block.", token); + }; + }(delim("{"))); + +// This Function is called when esnext option is set to true +// it adds the `const` statement to JSHINT + + useESNextSyntax = function () { + var conststatement = stmt("const", function (prefix) { + var id, name, value; + + this.first = []; + for (;;) { + nonadjacent(token, nexttoken); + id = identifier(); + if (funct[id] === "const") { + warning("const '" + id + "' has already been declared"); + } + if (funct["(global)"] && predefined[id] === false) { + warning("Redefinition of '{a}'.", token, id); + } + addlabel(id, "const"); + if (prefix) { + break; + } + name = token; + this.first.push(token); + + if (nexttoken.id !== "=") { + warning("const " + + "'{a}' is initialized to 'undefined'.", token, id); + } + + if (nexttoken.id === "=") { + nonadjacent(token, nexttoken); + advance("="); + nonadjacent(token, nexttoken); + if (nexttoken.id === "undefined") { + warning("It is not necessary to initialize " + + "'{a}' to 'undefined'.", token, id); + } + if (peek(0).id === "=" && nexttoken.identifier) { + error("Constant {a} was not declared correctly.", + nexttoken, nexttoken.value); + } + value = expression(0); + name.first = value; + } + + if (nexttoken.id !== ",") { + break; + } + comma(); + } + return this; + }); + conststatement.exps = true; + }; + + var varstatement = stmt("var", function (prefix) { + // JavaScript does not have block scope. It only has function scope. So, + // declaring a variable in a block can have unexpected consequences. + var id, name, value; + + if (funct["(onevar)"] && option.onevar) { + warning("Too many var statements."); + } else if (!funct["(global)"]) { + funct["(onevar)"] = true; + } + + this.first = []; + + for (;;) { + nonadjacent(token, nexttoken); + id = identifier(); + + if (option.esnext && funct[id] === "const") { + warning("const '" + id + "' has already been declared"); + } + + if (funct["(global)"] && predefined[id] === false) { + warning("Redefinition of '{a}'.", token, id); + } + + addlabel(id, "unused", token); + + if (prefix) { + break; + } + + name = token; + this.first.push(token); + + if (nexttoken.id === "=") { + nonadjacent(token, nexttoken); + advance("="); + nonadjacent(token, nexttoken); + if (nexttoken.id === "undefined") { + warning("It is not necessary to initialize '{a}' to 'undefined'.", token, id); + } + if (peek(0).id === "=" && nexttoken.identifier) { + error("Variable {a} was not declared correctly.", + nexttoken, nexttoken.value); + } + value = expression(0); + name.first = value; + } + if (nexttoken.id !== ",") { + break; + } + comma(); + } + return this; + }); + varstatement.exps = true; + + blockstmt("function", function () { + if (inblock) { + warning("Function declarations should not be placed in blocks. " + + "Use a function expression or move the statement to the top of " + + "the outer function.", token); + + } + var i = identifier(); + if (option.esnext && funct[i] === "const") { + warning("const '" + i + "' has already been declared"); + } + adjacent(token, nexttoken); + addlabel(i, "unction", token); + + doFunction(i, { statement: true }); + if (nexttoken.id === "(" && nexttoken.line === token.line) { + error( +"Function declarations are not invocable. Wrap the whole function invocation in parens."); + } + return this; + }); + + prefix("function", function () { + var i = optionalidentifier(); + if (i) { + adjacent(token, nexttoken); + } else { + nonadjacent(token, nexttoken); + } + doFunction(i); + if (!option.loopfunc && funct["(loopage)"]) { + warning("Don't make functions within a loop."); + } + return this; + }); + + blockstmt("if", function () { + var t = nexttoken; + increaseComplexityCount(); + advance("("); + nonadjacent(this, t); + nospace(); + expression(20); + if (nexttoken.id === "=") { + if (!option.boss) + warning("Expected a conditional expression and instead saw an assignment."); + advance("="); + expression(20); + } + advance(")", t); + nospace(prevtoken, token); + block(true, true); + if (nexttoken.id === "else") { + nonadjacent(token, nexttoken); + advance("else"); + if (nexttoken.id === "if" || nexttoken.id === "switch") { + statement(true); + } else { + block(true, true); + } + } + return this; + }); + + blockstmt("try", function () { + var b; + + function doCatch() { + var oldScope = scope; + var e; + + advance("catch"); + nonadjacent(token, nexttoken); + advance("("); + + scope = Object.create(oldScope); + + e = nexttoken.value; + if (nexttoken.type !== "(identifier)") { + e = null; + warning("Expected an identifier and instead saw '{a}'.", nexttoken, e); + } + + advance(); + advance(")"); + + funct = { + "(name)" : "(catch)", + "(line)" : nexttoken.line, + "(character)": nexttoken.character, + "(context)" : funct, + "(breakage)" : funct["(breakage)"], + "(loopage)" : funct["(loopage)"], + "(scope)" : scope, + "(statement)": false, + "(metrics)" : createMetrics(nexttoken), + "(catch)" : true, + "(tokens)" : {} + }; + + if (e) { + addlabel(e, "exception"); + } + + token.funct = funct; + functions.push(funct); + + block(false); + + scope = oldScope; + + funct["(last)"] = token.line; + funct["(lastcharacter)"] = token.character; + funct = funct["(context)"]; + } + + block(false); + + if (nexttoken.id === "catch") { + increaseComplexityCount(); + doCatch(); + b = true; + } + + if (nexttoken.id === "finally") { + advance("finally"); + block(false); + return; + } else if (!b) { + error("Expected '{a}' and instead saw '{b}'.", + nexttoken, "catch", nexttoken.value); + } + + return this; + }); + + blockstmt("while", function () { + var t = nexttoken; + funct["(breakage)"] += 1; + funct["(loopage)"] += 1; + increaseComplexityCount(); + advance("("); + nonadjacent(this, t); + nospace(); + expression(20); + if (nexttoken.id === "=") { + if (!option.boss) + warning("Expected a conditional expression and instead saw an assignment."); + advance("="); + expression(20); + } + advance(")", t); + nospace(prevtoken, token); + block(true, true); + funct["(breakage)"] -= 1; + funct["(loopage)"] -= 1; + return this; + }).labelled = true; + + blockstmt("with", function () { + var t = nexttoken; + if (directive["use strict"]) { + error("'with' is not allowed in strict mode.", token); + } else if (!option.withstmt) { + warning("Don't use 'with'.", token); + } + + advance("("); + nonadjacent(this, t); + nospace(); + expression(0); + advance(")", t); + nospace(prevtoken, token); + block(true, true); + + return this; + }); + + blockstmt("switch", function () { + var t = nexttoken, + g = false; + funct["(breakage)"] += 1; + advance("("); + nonadjacent(this, t); + nospace(); + this.condition = expression(20); + advance(")", t); + nospace(prevtoken, token); + nonadjacent(token, nexttoken); + t = nexttoken; + advance("{"); + nonadjacent(token, nexttoken); + indent += option.indent; + this.cases = []; + for (;;) { + switch (nexttoken.id) { + case "case": + switch (funct["(verb)"]) { + case "break": + case "case": + case "continue": + case "return": + case "switch": + case "throw": + break; + default: + // You can tell JSHint that you don't use break intentionally by + // adding a comment /* falls through */ on a line just before + // the next `case`. + if (!ft.test(lines[nexttoken.line - 2])) { + warning( + "Expected a 'break' statement before 'case'.", + token); + } + } + indentation(-option.indent); + advance("case"); + this.cases.push(expression(20)); + increaseComplexityCount(); + g = true; + advance(":"); + funct["(verb)"] = "case"; + break; + case "default": + switch (funct["(verb)"]) { + case "break": + case "continue": + case "return": + case "throw": + break; + default: + if (!ft.test(lines[nexttoken.line - 2])) { + warning( + "Expected a 'break' statement before 'default'.", + token); + } + } + indentation(-option.indent); + advance("default"); + g = true; + advance(":"); + break; + case "}": + indent -= option.indent; + indentation(); + advance("}", t); + if (this.cases.length === 1 || this.condition.id === "true" || + this.condition.id === "false") { + if (!option.onecase) + warning("This 'switch' should be an 'if'.", this); + } + funct["(breakage)"] -= 1; + funct["(verb)"] = undefined; + return; + case "(end)": + error("Missing '{a}'.", nexttoken, "}"); + return; + default: + if (g) { + switch (token.id) { + case ",": + error("Each value should have its own case label."); + return; + case ":": + g = false; + statements(); + break; + default: + error("Missing ':' on a case clause.", token); + return; + } + } else { + if (token.id === ":") { + advance(":"); + error("Unexpected '{a}'.", token, ":"); + statements(); + } else { + error("Expected '{a}' and instead saw '{b}'.", + nexttoken, "case", nexttoken.value); + return; + } + } + } + } + }).labelled = true; + + stmt("debugger", function () { + if (!option.debug) { + warning("All 'debugger' statements should be removed."); + } + return this; + }).exps = true; + + (function () { + var x = stmt("do", function () { + funct["(breakage)"] += 1; + funct["(loopage)"] += 1; + increaseComplexityCount(); + + this.first = block(true); + advance("while"); + var t = nexttoken; + nonadjacent(token, t); + advance("("); + nospace(); + expression(20); + if (nexttoken.id === "=") { + if (!option.boss) + warning("Expected a conditional expression and instead saw an assignment."); + advance("="); + expression(20); + } + advance(")", t); + nospace(prevtoken, token); + funct["(breakage)"] -= 1; + funct["(loopage)"] -= 1; + return this; + }); + x.labelled = true; + x.exps = true; + }()); + + blockstmt("for", function () { + var s, t = nexttoken; + funct["(breakage)"] += 1; + funct["(loopage)"] += 1; + increaseComplexityCount(); + advance("("); + nonadjacent(this, t); + nospace(); + if (peek(nexttoken.id === "var" ? 1 : 0).id === "in") { + if (nexttoken.id === "var") { + advance("var"); + varstatement.fud.call(varstatement, true); + } else { + switch (funct[nexttoken.value]) { + case "unused": + funct[nexttoken.value] = "var"; + break; + case "var": + break; + default: + warning("Bad for in variable '{a}'.", + nexttoken, nexttoken.value); + } + advance(); + } + advance("in"); + expression(20); + advance(")", t); + s = block(true, true); + if (option.forin && s && (s.length > 1 || typeof s[0] !== "object" || + s[0].value !== "if")) { + warning("The body of a for in should be wrapped in an if statement to filter " + + "unwanted properties from the prototype.", this); + } + funct["(breakage)"] -= 1; + funct["(loopage)"] -= 1; + return this; + } else { + if (nexttoken.id !== ";") { + if (nexttoken.id === "var") { + advance("var"); + varstatement.fud.call(varstatement); + } else { + for (;;) { + expression(0, "for"); + if (nexttoken.id !== ",") { + break; + } + comma(); + } + } + } + nolinebreak(token); + advance(";"); + if (nexttoken.id !== ";") { + expression(20); + if (nexttoken.id === "=") { + if (!option.boss) + warning("Expected a conditional expression and instead saw an assignment."); + advance("="); + expression(20); + } + } + nolinebreak(token); + advance(";"); + if (nexttoken.id === ";") { + error("Expected '{a}' and instead saw '{b}'.", + nexttoken, ")", ";"); + } + if (nexttoken.id !== ")") { + for (;;) { + expression(0, "for"); + if (nexttoken.id !== ",") { + break; + } + comma(); + } + } + advance(")", t); + nospace(prevtoken, token); + block(true, true); + funct["(breakage)"] -= 1; + funct["(loopage)"] -= 1; + return this; + } + }).labelled = true; + + + stmt("break", function () { + var v = nexttoken.value; + + if (funct["(breakage)"] === 0) + warning("Unexpected '{a}'.", nexttoken, this.value); + + if (!option.asi) + nolinebreak(this); + + if (nexttoken.id !== ";") { + if (token.line === nexttoken.line) { + if (funct[v] !== "label") { + warning("'{a}' is not a statement label.", nexttoken, v); + } else if (scope[v] !== funct) { + warning("'{a}' is out of scope.", nexttoken, v); + } + this.first = nexttoken; + advance(); + } + } + reachable("break"); + return this; + }).exps = true; + + + stmt("continue", function () { + var v = nexttoken.value; + + if (funct["(breakage)"] === 0) + warning("Unexpected '{a}'.", nexttoken, this.value); + + if (!option.asi) + nolinebreak(this); + + if (nexttoken.id !== ";") { + if (token.line === nexttoken.line) { + if (funct[v] !== "label") { + warning("'{a}' is not a statement label.", nexttoken, v); + } else if (scope[v] !== funct) { + warning("'{a}' is out of scope.", nexttoken, v); + } + this.first = nexttoken; + advance(); + } + } else if (!funct["(loopage)"]) { + warning("Unexpected '{a}'.", nexttoken, this.value); + } + reachable("continue"); + return this; + }).exps = true; + + + stmt("return", function () { + if (this.line === nexttoken.line) { + if (nexttoken.id === "(regexp)") + warning("Wrap the /regexp/ literal in parens to disambiguate the slash operator."); + + if (nexttoken.id !== ";" && !nexttoken.reach) { + nonadjacent(token, nexttoken); + if (peek().value === "=" && !option.boss) { + warningAt("Did you mean to return a conditional instead of an assignment?", + token.line, token.character + 1); + } + this.first = expression(0); + } + } else if (!option.asi) { + nolinebreak(this); // always warn (Line breaking error) + } + reachable("return"); + return this; + }).exps = true; + + + stmt("throw", function () { + nolinebreak(this); + nonadjacent(token, nexttoken); + this.first = expression(20); + reachable("throw"); + return this; + }).exps = true; + +// Superfluous reserved words + + reserve("class"); + reserve("const"); + reserve("enum"); + reserve("export"); + reserve("extends"); + reserve("import"); + reserve("super"); + + reserve("let"); + reserve("yield"); + reserve("implements"); + reserve("interface"); + reserve("package"); + reserve("private"); + reserve("protected"); + reserve("public"); + reserve("static"); + + +// Parse JSON + + function jsonValue() { + + function jsonObject() { + var o = {}, t = nexttoken; + advance("{"); + if (nexttoken.id !== "}") { + for (;;) { + if (nexttoken.id === "(end)") { + error("Missing '}' to match '{' from line {a}.", + nexttoken, t.line); + } else if (nexttoken.id === "}") { + warning("Unexpected comma.", token); + break; + } else if (nexttoken.id === ",") { + error("Unexpected comma.", nexttoken); + } else if (nexttoken.id !== "(string)") { + warning("Expected a string and instead saw {a}.", + nexttoken, nexttoken.value); + } + if (o[nexttoken.value] === true) { + warning("Duplicate key '{a}'.", + nexttoken, nexttoken.value); + } else if ((nexttoken.value === "__proto__" && + !option.proto) || (nexttoken.value === "__iterator__" && + !option.iterator)) { + warning("The '{a}' key may produce unexpected results.", + nexttoken, nexttoken.value); + } else { + o[nexttoken.value] = true; + } + advance(); + advance(":"); + jsonValue(); + if (nexttoken.id !== ",") { + break; + } + advance(","); + } + } + advance("}"); + } + + function jsonArray() { + var t = nexttoken; + advance("["); + if (nexttoken.id !== "]") { + for (;;) { + if (nexttoken.id === "(end)") { + error("Missing ']' to match '[' from line {a}.", + nexttoken, t.line); + } else if (nexttoken.id === "]") { + warning("Unexpected comma.", token); + break; + } else if (nexttoken.id === ",") { + error("Unexpected comma.", nexttoken); + } + jsonValue(); + if (nexttoken.id !== ",") { + break; + } + advance(","); + } + } + advance("]"); + } + + switch (nexttoken.id) { + case "{": + jsonObject(); + break; + case "[": + jsonArray(); + break; + case "true": + case "false": + case "null": + case "(number)": + case "(string)": + advance(); + break; + case "-": + advance("-"); + if (token.character !== nexttoken.from) { + warning("Unexpected space after '-'.", token); + } + adjacent(token, nexttoken); + advance("(number)"); + break; + default: + error("Expected a JSON value.", nexttoken); + } + } + + + // The actual JSHINT function itself. + var itself = function (s, o, g) { + var a, i, k, x; + var optionKeys; + var newOptionObj = {}; + + if (o && o.scope) { + JSHINT.scope = o.scope; + } else { + JSHINT.errors = []; + JSHINT.undefs = []; + JSHINT.internals = []; + JSHINT.blacklist = {}; + JSHINT.scope = "(main)"; + } + + predefined = Object.create(standard); + declared = Object.create(null); + combine(predefined, g || {}); + + if (o) { + a = o.predef; + if (a) { + if (!Array.isArray(a) && typeof a === "object") { + a = Object.keys(a); + } + a.forEach(function (item) { + var slice; + if (item[0] === "-") { + slice = item.slice(1); + JSHINT.blacklist[slice] = slice; + } else { + predefined[item] = true; + } + }); + } + + optionKeys = Object.keys(o); + for (x = 0; x < optionKeys.length; x++) { + newOptionObj[optionKeys[x]] = o[optionKeys[x]]; + + if (optionKeys[x] === "newcap" && o[optionKeys[x]] === false) + newOptionObj["(explicitNewcap)"] = true; + + if (optionKeys[x] === "indent") + newOptionObj.white = true; + } + } + + option = newOptionObj; + + option.indent = option.indent || 4; + option.maxerr = option.maxerr || 50; + + tab = ""; + for (i = 0; i < option.indent; i += 1) { + tab += " "; + } + indent = 1; + global = Object.create(predefined); + scope = global; + funct = { + "(global)": true, + "(name)": "(global)", + "(scope)": scope, + "(breakage)": 0, + "(loopage)": 0, + "(tokens)": {}, + "(metrics)": createMetrics(nexttoken) + }; + functions = [funct]; + urls = []; + stack = null; + member = {}; + membersOnly = null; + implied = {}; + inblock = false; + lookahead = []; + jsonmode = false; + warnings = 0; + lines = []; + unuseds = []; + + if (!isString(s) && !Array.isArray(s)) { + errorAt("Input is neither a string nor an array of strings.", 0); + return false; + } + + if (isString(s) && /^\s*$/g.test(s)) { + errorAt("Input is an empty string.", 0); + return false; + } + + if (s.length === 0) { + errorAt("Input is an empty array.", 0); + return false; + } + + lex.init(s); + + prereg = true; + directive = {}; + + prevtoken = token = nexttoken = syntax["(begin)"]; + + // Check options + for (var name in o) { + if (is_own(o, name)) { + checkOption(name, token); + } + } + + assume(); + + // combine the passed globals after we've assumed all our options + combine(predefined, g || {}); + + //reset values + comma.first = true; + quotmark = undefined; + + try { + advance(); + switch (nexttoken.id) { + case "{": + case "[": + option.laxbreak = true; + jsonmode = true; + jsonValue(); + break; + default: + directives(); + if (directive["use strict"] && !option.globalstrict) { + warning("Use the function form of \"use strict\".", prevtoken); + } + + statements(); + } + advance((nexttoken && nexttoken.value !== ".") ? "(end)" : undefined); + + var markDefined = function (name, context) { + do { + if (typeof context[name] === "string") { + // JSHINT marks unused variables as 'unused' and + // unused function declaration as 'unction'. This + // code changes such instances back 'var' and + // 'closure' so that the code in JSHINT.data() + // doesn't think they're unused. + + if (context[name] === "unused") + context[name] = "var"; + else if (context[name] === "unction") + context[name] = "closure"; + + return true; + } + + context = context["(context)"]; + } while (context); + + return false; + }; + + var clearImplied = function (name, line) { + if (!implied[name]) + return; + + var newImplied = []; + for (var i = 0; i < implied[name].length; i += 1) { + if (implied[name][i] !== line) + newImplied.push(implied[name][i]); + } + + if (newImplied.length === 0) + delete implied[name]; + else + implied[name] = newImplied; + }; + + var warnUnused = function (name, token) { + var line = token.line; + var chr = token.character; + + if (option.unused) + warningAt("'{a}' is defined but never used.", line, chr, name); + + unuseds.push({ + name: name, + line: line, + character: chr + }); + }; + + var checkUnused = function (func, key) { + var type = func[key]; + var token = func["(tokens)"][key]; + + if (key.charAt(0) === "(") + return; + + if (type !== "unused" && type !== "unction") + return; + + // Params are checked separately from other variables. + if (func["(params)"] && func["(params)"].indexOf(key) !== -1) + return; + + warnUnused(key, token); + }; + + // Check queued 'x is not defined' instances to see if they're still undefined. + for (i = 0; i < JSHINT.undefs.length; i += 1) { + k = JSHINT.undefs[i].slice(0); + + if (markDefined(k[2].value, k[0])) { + clearImplied(k[2].value, k[2].line); + } else { + warning.apply(warning, k.slice(1)); + } + } + + functions.forEach(function (func) { + for (var key in func) { + if (is_own(func, key)) { + checkUnused(func, key); + } + } + + if (!func["(params)"]) + return; + + var params = func["(params)"].slice(); + var param = params.pop(); + var type; + + while (param) { + type = func[param]; + + // 'undefined' is a special case for (function (window, undefined) { ... })(); + // patterns. + + if (param === "undefined") + return; + + if (type !== "unused" && type !== "unction") + return; + + warnUnused(param, func["(tokens)"][param]); + param = params.pop(); + } + }); + + for (var key in declared) { + if (is_own(declared, key) && !is_own(global, key)) { + warnUnused(key, declared[key]); + } + } + } catch (e) { + if (e) { + var nt = nexttoken || {}; + JSHINT.errors.push({ + raw : e.raw, + reason : e.message, + line : e.line || nt.line, + character : e.character || nt.from + }, null); + } + } + + // Loop over the listed "internals", and check them as well. + + if (JSHINT.scope === "(main)") { + o = o || {}; + + for (i = 0; i < JSHINT.internals.length; i += 1) { + k = JSHINT.internals[i]; + o.scope = k.elem; + itself(k.value, o, g); + } + } + + return JSHINT.errors.length === 0; + }; + + // Data summary. + itself.data = function () { + var data = { + functions: [], + options: option + }; + var implieds = []; + var members = []; + var fu, f, i, j, n, globals; + + if (itself.errors.length) { + data.errors = itself.errors; + } + + if (jsonmode) { + data.json = true; + } + + for (n in implied) { + if (is_own(implied, n)) { + implieds.push({ + name: n, + line: implied[n] + }); + } + } + + if (implieds.length > 0) { + data.implieds = implieds; + } + + if (urls.length > 0) { + data.urls = urls; + } + + globals = Object.keys(scope); + if (globals.length > 0) { + data.globals = globals; + } + + for (i = 1; i < functions.length; i += 1) { + f = functions[i]; + fu = {}; + + for (j = 0; j < functionicity.length; j += 1) { + fu[functionicity[j]] = []; + } + + for (j = 0; j < functionicity.length; j += 1) { + if (fu[functionicity[j]].length === 0) { + delete fu[functionicity[j]]; + } + } + + fu.name = f["(name)"]; + fu.param = f["(params)"]; + fu.line = f["(line)"]; + fu.character = f["(character)"]; + fu.last = f["(last)"]; + fu.lastcharacter = f["(lastcharacter)"]; + data.functions.push(fu); + } + + if (unuseds.length > 0) { + data.unused = unuseds; + } + + members = []; + for (n in member) { + if (typeof member[n] === "number") { + data.member = member; + break; + } + } + + return data; + }; + + itself.jshint = itself; + + return itself; +}()); + +// Make JSHINT a Node module, if possible. +if (typeof exports === "object" && exports) { + exports.JSHINT = JSHINT; +} \ No newline at end of file diff --git a/testData/compressed-jQueryUI-built-with-node-archiver/inflated/development-bundle/external/qunit.css b/testData/compressed-jQueryUI-built-with-node-archiver/inflated/development-bundle/external/qunit.css new file mode 100755 index 00000000..d7fc0c8e --- /dev/null +++ b/testData/compressed-jQueryUI-built-with-node-archiver/inflated/development-bundle/external/qunit.css @@ -0,0 +1,244 @@ +/** + * QUnit v1.11.0 - A JavaScript Unit Testing Framework + * + * http://qunitjs.com + * + * Copyright 2012 jQuery Foundation and other contributors + * Released under the MIT license. + * http://jquery.org/license + */ + +/** Font Family and Sizes */ + +#qunit-tests, #qunit-header, #qunit-banner, #qunit-testrunner-toolbar, #qunit-userAgent, #qunit-testresult { + font-family: "Helvetica Neue Light", "HelveticaNeue-Light", "Helvetica Neue", Calibri, Helvetica, Arial, sans-serif; +} + +#qunit-testrunner-toolbar, #qunit-userAgent, #qunit-testresult, #qunit-tests li { font-size: small; } +#qunit-tests { font-size: smaller; } + + +/** Resets */ + +#qunit-tests, #qunit-header, #qunit-banner, #qunit-userAgent, #qunit-testresult, #qunit-modulefilter { + margin: 0; + padding: 0; +} + + +/** Header */ + +#qunit-header { + padding: 0.5em 0 0.5em 1em; + + color: #8699a4; + background-color: #0d3349; + + font-size: 1.5em; + line-height: 1em; + font-weight: normal; + + border-radius: 5px 5px 0 0; + -moz-border-radius: 5px 5px 0 0; + -webkit-border-top-right-radius: 5px; + -webkit-border-top-left-radius: 5px; +} + +#qunit-header a { + text-decoration: none; + color: #c2ccd1; +} + +#qunit-header a:hover, +#qunit-header a:focus { + color: #fff; +} + +#qunit-testrunner-toolbar label { + display: inline-block; + padding: 0 .5em 0 .1em; +} + +#qunit-banner { + height: 5px; +} + +#qunit-testrunner-toolbar { + padding: 0.5em 0 0.5em 2em; + color: #5E740B; + background-color: #eee; + overflow: hidden; +} + +#qunit-userAgent { + padding: 0.5em 0 0.5em 2.5em; + background-color: #2b81af; + color: #fff; + text-shadow: rgba(0, 0, 0, 0.5) 2px 2px 1px; +} + +#qunit-modulefilter-container { + float: right; +} + +/** Tests: Pass/Fail */ + +#qunit-tests { + list-style-position: inside; +} + +#qunit-tests li { + padding: 0.4em 0.5em 0.4em 2.5em; + border-bottom: 1px solid #fff; + list-style-position: inside; +} + +#qunit-tests.hidepass li.pass, #qunit-tests.hidepass li.running { + display: none; +} + +#qunit-tests li strong { + cursor: pointer; +} + +#qunit-tests li a { + padding: 0.5em; + color: #c2ccd1; + text-decoration: none; +} +#qunit-tests li a:hover, +#qunit-tests li a:focus { + color: #000; +} + +#qunit-tests li .runtime { + float: right; + font-size: smaller; +} + +.qunit-assert-list { + margin-top: 0.5em; + padding: 0.5em; + + background-color: #fff; + + border-radius: 5px; + -moz-border-radius: 5px; + -webkit-border-radius: 5px; +} + +.qunit-collapsed { + display: none; +} + +#qunit-tests table { + border-collapse: collapse; + margin-top: .2em; +} + +#qunit-tests th { + text-align: right; + vertical-align: top; + padding: 0 .5em 0 0; +} + +#qunit-tests td { + vertical-align: top; +} + +#qunit-tests pre { + margin: 0; + white-space: pre-wrap; + word-wrap: break-word; +} + +#qunit-tests del { + background-color: #e0f2be; + color: #374e0c; + text-decoration: none; +} + +#qunit-tests ins { + background-color: #ffcaca; + color: #500; + text-decoration: none; +} + +/*** Test Counts */ + +#qunit-tests b.counts { color: black; } +#qunit-tests b.passed { color: #5E740B; } +#qunit-tests b.failed { color: #710909; } + +#qunit-tests li li { + padding: 5px; + background-color: #fff; + border-bottom: none; + list-style-position: inside; +} + +/*** Passing Styles */ + +#qunit-tests li li.pass { + color: #3c510c; + background-color: #fff; + border-left: 10px solid #C6E746; +} + +#qunit-tests .pass { color: #528CE0; background-color: #D2E0E6; } +#qunit-tests .pass .test-name { color: #366097; } + +#qunit-tests .pass .test-actual, +#qunit-tests .pass .test-expected { color: #999999; } + +#qunit-banner.qunit-pass { background-color: #C6E746; } + +/*** Failing Styles */ + +#qunit-tests li li.fail { + color: #710909; + background-color: #fff; + border-left: 10px solid #EE5757; + white-space: pre; +} + +#qunit-tests > li:last-child { + border-radius: 0 0 5px 5px; + -moz-border-radius: 0 0 5px 5px; + -webkit-border-bottom-right-radius: 5px; + -webkit-border-bottom-left-radius: 5px; +} + +#qunit-tests .fail { color: #000000; background-color: #EE5757; } +#qunit-tests .fail .test-name, +#qunit-tests .fail .module-name { color: #000000; } + +#qunit-tests .fail .test-actual { color: #EE5757; } +#qunit-tests .fail .test-expected { color: green; } + +#qunit-banner.qunit-fail { background-color: #EE5757; } + + +/** Result */ + +#qunit-testresult { + padding: 0.5em 0.5em 0.5em 2.5em; + + color: #2b81af; + background-color: #D2E0E6; + + border-bottom: 1px solid white; +} +#qunit-testresult .module-name { + font-weight: bold; +} + +/** Fixture */ + +#qunit-fixture { + position: absolute; + top: -10000px; + left: -10000px; + width: 1000px; + height: 1000px; +} diff --git a/testData/compressed-jQueryUI-built-with-node-archiver/inflated/development-bundle/external/qunit.js b/testData/compressed-jQueryUI-built-with-node-archiver/inflated/development-bundle/external/qunit.js new file mode 100755 index 00000000..302545f4 --- /dev/null +++ b/testData/compressed-jQueryUI-built-with-node-archiver/inflated/development-bundle/external/qunit.js @@ -0,0 +1,2152 @@ +/** + * QUnit v1.11.0 - A JavaScript Unit Testing Framework + * + * http://qunitjs.com + * + * Copyright 2012 jQuery Foundation and other contributors + * Released under the MIT license. + * http://jquery.org/license + */ + +(function( window ) { + +var QUnit, + assert, + config, + onErrorFnPrev, + testId = 0, + fileName = (sourceFromStacktrace( 0 ) || "" ).replace(/(:\d+)+\)?/, "").replace(/.+\//, ""), + toString = Object.prototype.toString, + hasOwn = Object.prototype.hasOwnProperty, + // Keep a local reference to Date (GH-283) + Date = window.Date, + defined = { + setTimeout: typeof window.setTimeout !== "undefined", + sessionStorage: (function() { + var x = "qunit-test-string"; + try { + sessionStorage.setItem( x, x ); + sessionStorage.removeItem( x ); + return true; + } catch( e ) { + return false; + } + }()) + }, + /** + * Provides a normalized error string, correcting an issue + * with IE 7 (and prior) where Error.prototype.toString is + * not properly implemented + * + * Based on http://es5.github.com/#x15.11.4.4 + * + * @param {String|Error} error + * @return {String} error message + */ + errorString = function( error ) { + var name, message, + errorString = error.toString(); + if ( errorString.substring( 0, 7 ) === "[object" ) { + name = error.name ? error.name.toString() : "Error"; + message = error.message ? error.message.toString() : ""; + if ( name && message ) { + return name + ": " + message; + } else if ( name ) { + return name; + } else if ( message ) { + return message; + } else { + return "Error"; + } + } else { + return errorString; + } + }, + /** + * Makes a clone of an object using only Array or Object as base, + * and copies over the own enumerable properties. + * + * @param {Object} obj + * @return {Object} New object with only the own properties (recursively). + */ + objectValues = function( obj ) { + // Grunt 0.3.x uses an older version of jshint that still has jshint/jshint#392. + /*jshint newcap: false */ + var key, val, + vals = QUnit.is( "array", obj ) ? [] : {}; + for ( key in obj ) { + if ( hasOwn.call( obj, key ) ) { + val = obj[key]; + vals[key] = val === Object(val) ? objectValues(val) : val; + } + } + return vals; + }; + +function Test( settings ) { + extend( this, settings ); + this.assertions = []; + this.testNumber = ++Test.count; +} + +Test.count = 0; + +Test.prototype = { + init: function() { + var a, b, li, + tests = id( "qunit-tests" ); + + if ( tests ) { + b = document.createElement( "strong" ); + b.innerHTML = this.nameHtml; + + // `a` initialized at top of scope + a = document.createElement( "a" ); + a.innerHTML = "Rerun"; + a.href = QUnit.url({ testNumber: this.testNumber }); + + li = document.createElement( "li" ); + li.appendChild( b ); + li.appendChild( a ); + li.className = "running"; + li.id = this.id = "qunit-test-output" + testId++; + + tests.appendChild( li ); + } + }, + setup: function() { + if ( this.module !== config.previousModule ) { + if ( config.previousModule ) { + runLoggingCallbacks( "moduleDone", QUnit, { + name: config.previousModule, + failed: config.moduleStats.bad, + passed: config.moduleStats.all - config.moduleStats.bad, + total: config.moduleStats.all + }); + } + config.previousModule = this.module; + config.moduleStats = { all: 0, bad: 0 }; + runLoggingCallbacks( "moduleStart", QUnit, { + name: this.module + }); + } else if ( config.autorun ) { + runLoggingCallbacks( "moduleStart", QUnit, { + name: this.module + }); + } + + config.current = this; + + this.testEnvironment = extend({ + setup: function() {}, + teardown: function() {} + }, this.moduleTestEnvironment ); + + this.started = +new Date(); + runLoggingCallbacks( "testStart", QUnit, { + name: this.testName, + module: this.module + }); + + // allow utility functions to access the current test environment + // TODO why?? + QUnit.current_testEnvironment = this.testEnvironment; + + if ( !config.pollution ) { + saveGlobal(); + } + if ( config.notrycatch ) { + this.testEnvironment.setup.call( this.testEnvironment ); + return; + } + try { + this.testEnvironment.setup.call( this.testEnvironment ); + } catch( e ) { + QUnit.pushFailure( "Setup failed on " + this.testName + ": " + ( e.message || e ), extractStacktrace( e, 1 ) ); + } + }, + run: function() { + config.current = this; + + var running = id( "qunit-testresult" ); + + if ( running ) { + running.innerHTML = "Running:
" + this.nameHtml; + } + + if ( this.async ) { + QUnit.stop(); + } + + this.callbackStarted = +new Date(); + + if ( config.notrycatch ) { + this.callback.call( this.testEnvironment, QUnit.assert ); + this.callbackRuntime = +new Date() - this.callbackStarted; + return; + } + + try { + this.callback.call( this.testEnvironment, QUnit.assert ); + this.callbackRuntime = +new Date() - this.callbackStarted; + } catch( e ) { + this.callbackRuntime = +new Date() - this.callbackStarted; + + QUnit.pushFailure( "Died on test #" + (this.assertions.length + 1) + " " + this.stack + ": " + ( e.message || e ), extractStacktrace( e, 0 ) ); + // else next test will carry the responsibility + saveGlobal(); + + // Restart the tests if they're blocking + if ( config.blocking ) { + QUnit.start(); + } + } + }, + teardown: function() { + config.current = this; + if ( config.notrycatch ) { + if ( typeof this.callbackRuntime === "undefined" ) { + this.callbackRuntime = +new Date() - this.callbackStarted; + } + this.testEnvironment.teardown.call( this.testEnvironment ); + return; + } else { + try { + this.testEnvironment.teardown.call( this.testEnvironment ); + } catch( e ) { + QUnit.pushFailure( "Teardown failed on " + this.testName + ": " + ( e.message || e ), extractStacktrace( e, 1 ) ); + } + } + checkPollution(); + }, + finish: function() { + config.current = this; + if ( config.requireExpects && this.expected === null ) { + QUnit.pushFailure( "Expected number of assertions to be defined, but expect() was not called.", this.stack ); + } else if ( this.expected !== null && this.expected !== this.assertions.length ) { + QUnit.pushFailure( "Expected " + this.expected + " assertions, but " + this.assertions.length + " were run", this.stack ); + } else if ( this.expected === null && !this.assertions.length ) { + QUnit.pushFailure( "Expected at least one assertion, but none were run - call expect(0) to accept zero assertions.", this.stack ); + } + + var i, assertion, a, b, time, li, ol, + test = this, + good = 0, + bad = 0, + tests = id( "qunit-tests" ); + + this.runtime = +new Date() - this.started; + config.stats.all += this.assertions.length; + config.moduleStats.all += this.assertions.length; + + if ( tests ) { + ol = document.createElement( "ol" ); + ol.className = "qunit-assert-list"; + + for ( i = 0; i < this.assertions.length; i++ ) { + assertion = this.assertions[i]; + + li = document.createElement( "li" ); + li.className = assertion.result ? "pass" : "fail"; + li.innerHTML = assertion.message || ( assertion.result ? "okay" : "failed" ); + ol.appendChild( li ); + + if ( assertion.result ) { + good++; + } else { + bad++; + config.stats.bad++; + config.moduleStats.bad++; + } + } + + // store result when possible + if ( QUnit.config.reorder && defined.sessionStorage ) { + if ( bad ) { + sessionStorage.setItem( "qunit-test-" + this.module + "-" + this.testName, bad ); + } else { + sessionStorage.removeItem( "qunit-test-" + this.module + "-" + this.testName ); + } + } + + if ( bad === 0 ) { + addClass( ol, "qunit-collapsed" ); + } + + // `b` initialized at top of scope + b = document.createElement( "strong" ); + b.innerHTML = this.nameHtml + " (" + bad + ", " + good + ", " + this.assertions.length + ")"; + + addEvent(b, "click", function() { + var next = b.parentNode.lastChild, + collapsed = hasClass( next, "qunit-collapsed" ); + ( collapsed ? removeClass : addClass )( next, "qunit-collapsed" ); + }); + + addEvent(b, "dblclick", function( e ) { + var target = e && e.target ? e.target : window.event.srcElement; + if ( target.nodeName.toLowerCase() === "span" || target.nodeName.toLowerCase() === "b" ) { + target = target.parentNode; + } + if ( window.location && target.nodeName.toLowerCase() === "strong" ) { + window.location = QUnit.url({ testNumber: test.testNumber }); + } + }); + + // `time` initialized at top of scope + time = document.createElement( "span" ); + time.className = "runtime"; + time.innerHTML = this.runtime + " ms"; + + // `li` initialized at top of scope + li = id( this.id ); + li.className = bad ? "fail" : "pass"; + li.removeChild( li.firstChild ); + a = li.firstChild; + li.appendChild( b ); + li.appendChild( a ); + li.appendChild( time ); + li.appendChild( ol ); + + } else { + for ( i = 0; i < this.assertions.length; i++ ) { + if ( !this.assertions[i].result ) { + bad++; + config.stats.bad++; + config.moduleStats.bad++; + } + } + } + + runLoggingCallbacks( "testDone", QUnit, { + name: this.testName, + module: this.module, + failed: bad, + passed: this.assertions.length - bad, + total: this.assertions.length, + duration: this.runtime + }); + + QUnit.reset(); + + config.current = undefined; + }, + + queue: function() { + var bad, + test = this; + + synchronize(function() { + test.init(); + }); + function run() { + // each of these can by async + synchronize(function() { + test.setup(); + }); + synchronize(function() { + test.run(); + }); + synchronize(function() { + test.teardown(); + }); + synchronize(function() { + test.finish(); + }); + } + + // `bad` initialized at top of scope + // defer when previous test run passed, if storage is available + bad = QUnit.config.reorder && defined.sessionStorage && + +sessionStorage.getItem( "qunit-test-" + this.module + "-" + this.testName ); + + if ( bad ) { + run(); + } else { + synchronize( run, true ); + } + } +}; + +// Root QUnit object. +// `QUnit` initialized at top of scope +QUnit = { + + // call on start of module test to prepend name to all tests + module: function( name, testEnvironment ) { + config.currentModule = name; + config.currentModuleTestEnvironment = testEnvironment; + config.modules[name] = true; + }, + + asyncTest: function( testName, expected, callback ) { + if ( arguments.length === 2 ) { + callback = expected; + expected = null; + } + + QUnit.test( testName, expected, callback, true ); + }, + + test: function( testName, expected, callback, async ) { + var test, + nameHtml = "" + escapeText( testName ) + ""; + + if ( arguments.length === 2 ) { + callback = expected; + expected = null; + } + + if ( config.currentModule ) { + nameHtml = "" + escapeText( config.currentModule ) + ": " + nameHtml; + } + + test = new Test({ + nameHtml: nameHtml, + testName: testName, + expected: expected, + async: async, + callback: callback, + module: config.currentModule, + moduleTestEnvironment: config.currentModuleTestEnvironment, + stack: sourceFromStacktrace( 2 ) + }); + + if ( !validTest( test ) ) { + return; + } + + test.queue(); + }, + + // Specify the number of expected assertions to gurantee that failed test (no assertions are run at all) don't slip through. + expect: function( asserts ) { + if (arguments.length === 1) { + config.current.expected = asserts; + } else { + return config.current.expected; + } + }, + + start: function( count ) { + // QUnit hasn't been initialized yet. + // Note: RequireJS (et al) may delay onLoad + if ( config.semaphore === undefined ) { + QUnit.begin(function() { + // This is triggered at the top of QUnit.load, push start() to the event loop, to allow QUnit.load to finish first + setTimeout(function() { + QUnit.start( count ); + }); + }); + return; + } + + config.semaphore -= count || 1; + // don't start until equal number of stop-calls + if ( config.semaphore > 0 ) { + return; + } + // ignore if start is called more often then stop + if ( config.semaphore < 0 ) { + config.semaphore = 0; + QUnit.pushFailure( "Called start() while already started (QUnit.config.semaphore was 0 already)", null, sourceFromStacktrace(2) ); + return; + } + // A slight delay, to avoid any current callbacks + if ( defined.setTimeout ) { + window.setTimeout(function() { + if ( config.semaphore > 0 ) { + return; + } + if ( config.timeout ) { + clearTimeout( config.timeout ); + } + + config.blocking = false; + process( true ); + }, 13); + } else { + config.blocking = false; + process( true ); + } + }, + + stop: function( count ) { + config.semaphore += count || 1; + config.blocking = true; + + if ( config.testTimeout && defined.setTimeout ) { + clearTimeout( config.timeout ); + config.timeout = window.setTimeout(function() { + QUnit.ok( false, "Test timed out" ); + config.semaphore = 1; + QUnit.start(); + }, config.testTimeout ); + } + } +}; + +// `assert` initialized at top of scope +// Asssert helpers +// All of these must either call QUnit.push() or manually do: +// - runLoggingCallbacks( "log", .. ); +// - config.current.assertions.push({ .. }); +// We attach it to the QUnit object *after* we expose the public API, +// otherwise `assert` will become a global variable in browsers (#341). +assert = { + /** + * Asserts rough true-ish result. + * @name ok + * @function + * @example ok( "asdfasdf".length > 5, "There must be at least 5 chars" ); + */ + ok: function( result, msg ) { + if ( !config.current ) { + throw new Error( "ok() assertion outside test context, was " + sourceFromStacktrace(2) ); + } + result = !!result; + + var source, + details = { + module: config.current.module, + name: config.current.testName, + result: result, + message: msg + }; + + msg = escapeText( msg || (result ? "okay" : "failed" ) ); + msg = "" + msg + ""; + + if ( !result ) { + source = sourceFromStacktrace( 2 ); + if ( source ) { + details.source = source; + msg += "
Source:
" + escapeText( source ) + "
"; + } + } + runLoggingCallbacks( "log", QUnit, details ); + config.current.assertions.push({ + result: result, + message: msg + }); + }, + + /** + * Assert that the first two arguments are equal, with an optional message. + * Prints out both actual and expected values. + * @name equal + * @function + * @example equal( format( "Received {0} bytes.", 2), "Received 2 bytes.", "format() replaces {0} with next argument" ); + */ + equal: function( actual, expected, message ) { + /*jshint eqeqeq:false */ + QUnit.push( expected == actual, actual, expected, message ); + }, + + /** + * @name notEqual + * @function + */ + notEqual: function( actual, expected, message ) { + /*jshint eqeqeq:false */ + QUnit.push( expected != actual, actual, expected, message ); + }, + + /** + * @name propEqual + * @function + */ + propEqual: function( actual, expected, message ) { + actual = objectValues(actual); + expected = objectValues(expected); + QUnit.push( QUnit.equiv(actual, expected), actual, expected, message ); + }, + + /** + * @name notPropEqual + * @function + */ + notPropEqual: function( actual, expected, message ) { + actual = objectValues(actual); + expected = objectValues(expected); + QUnit.push( !QUnit.equiv(actual, expected), actual, expected, message ); + }, + + /** + * @name deepEqual + * @function + */ + deepEqual: function( actual, expected, message ) { + QUnit.push( QUnit.equiv(actual, expected), actual, expected, message ); + }, + + /** + * @name notDeepEqual + * @function + */ + notDeepEqual: function( actual, expected, message ) { + QUnit.push( !QUnit.equiv(actual, expected), actual, expected, message ); + }, + + /** + * @name strictEqual + * @function + */ + strictEqual: function( actual, expected, message ) { + QUnit.push( expected === actual, actual, expected, message ); + }, + + /** + * @name notStrictEqual + * @function + */ + notStrictEqual: function( actual, expected, message ) { + QUnit.push( expected !== actual, actual, expected, message ); + }, + + "throws": function( block, expected, message ) { + var actual, + expectedOutput = expected, + ok = false; + + // 'expected' is optional + if ( typeof expected === "string" ) { + message = expected; + expected = null; + } + + config.current.ignoreGlobalErrors = true; + try { + block.call( config.current.testEnvironment ); + } catch (e) { + actual = e; + } + config.current.ignoreGlobalErrors = false; + + if ( actual ) { + // we don't want to validate thrown error + if ( !expected ) { + ok = true; + expectedOutput = null; + // expected is a regexp + } else if ( QUnit.objectType( expected ) === "regexp" ) { + ok = expected.test( errorString( actual ) ); + // expected is a constructor + } else if ( actual instanceof expected ) { + ok = true; + // expected is a validation function which returns true is validation passed + } else if ( expected.call( {}, actual ) === true ) { + expectedOutput = null; + ok = true; + } + + QUnit.push( ok, actual, expectedOutput, message ); + } else { + QUnit.pushFailure( message, null, 'No exception was thrown.' ); + } + } +}; + +/** + * @deprecate since 1.8.0 + * Kept assertion helpers in root for backwards compatibility. + */ +extend( QUnit, assert ); + +/** + * @deprecated since 1.9.0 + * Kept root "raises()" for backwards compatibility. + * (Note that we don't introduce assert.raises). + */ +QUnit.raises = assert[ "throws" ]; + +/** + * @deprecated since 1.0.0, replaced with error pushes since 1.3.0 + * Kept to avoid TypeErrors for undefined methods. + */ +QUnit.equals = function() { + QUnit.push( false, false, false, "QUnit.equals has been deprecated since 2009 (e88049a0), use QUnit.equal instead" ); +}; +QUnit.same = function() { + QUnit.push( false, false, false, "QUnit.same has been deprecated since 2009 (e88049a0), use QUnit.deepEqual instead" ); +}; + +// We want access to the constructor's prototype +(function() { + function F() {} + F.prototype = QUnit; + QUnit = new F(); + // Make F QUnit's constructor so that we can add to the prototype later + QUnit.constructor = F; +}()); + +/** + * Config object: Maintain internal state + * Later exposed as QUnit.config + * `config` initialized at top of scope + */ +config = { + // The queue of tests to run + queue: [], + + // block until document ready + blocking: true, + + // when enabled, show only failing tests + // gets persisted through sessionStorage and can be changed in UI via checkbox + hidepassed: false, + + // by default, run previously failed tests first + // very useful in combination with "Hide passed tests" checked + reorder: true, + + // by default, modify document.title when suite is done + altertitle: true, + + // when enabled, all tests must call expect() + requireExpects: false, + + // add checkboxes that are persisted in the query-string + // when enabled, the id is set to `true` as a `QUnit.config` property + urlConfig: [ + { + id: "noglobals", + label: "Check for Globals", + tooltip: "Enabling this will test if any test introduces new properties on the `window` object. Stored as query-strings." + }, + { + id: "notrycatch", + label: "No try-catch", + tooltip: "Enabling this will run tests outside of a try-catch block. Makes debugging exceptions in IE reasonable. Stored as query-strings." + } + ], + + // Set of all modules. + modules: {}, + + // logging callback queues + begin: [], + done: [], + log: [], + testStart: [], + testDone: [], + moduleStart: [], + moduleDone: [] +}; + +// Export global variables, unless an 'exports' object exists, +// in that case we assume we're in CommonJS (dealt with on the bottom of the script) +if ( typeof exports === "undefined" ) { + extend( window, QUnit ); + + // Expose QUnit object + window.QUnit = QUnit; +} + +// Initialize more QUnit.config and QUnit.urlParams +(function() { + var i, + location = window.location || { search: "", protocol: "file:" }, + params = location.search.slice( 1 ).split( "&" ), + length = params.length, + urlParams = {}, + current; + + if ( params[ 0 ] ) { + for ( i = 0; i < length; i++ ) { + current = params[ i ].split( "=" ); + current[ 0 ] = decodeURIComponent( current[ 0 ] ); + // allow just a key to turn on a flag, e.g., test.html?noglobals + current[ 1 ] = current[ 1 ] ? decodeURIComponent( current[ 1 ] ) : true; + urlParams[ current[ 0 ] ] = current[ 1 ]; + } + } + + QUnit.urlParams = urlParams; + + // String search anywhere in moduleName+testName + config.filter = urlParams.filter; + + // Exact match of the module name + config.module = urlParams.module; + + config.testNumber = parseInt( urlParams.testNumber, 10 ) || null; + + // Figure out if we're running the tests from a server or not + QUnit.isLocal = location.protocol === "file:"; +}()); + +// Extend QUnit object, +// these after set here because they should not be exposed as global functions +extend( QUnit, { + assert: assert, + + config: config, + + // Initialize the configuration options + init: function() { + extend( config, { + stats: { all: 0, bad: 0 }, + moduleStats: { all: 0, bad: 0 }, + started: +new Date(), + updateRate: 1000, + blocking: false, + autostart: true, + autorun: false, + filter: "", + queue: [], + semaphore: 1 + }); + + var tests, banner, result, + qunit = id( "qunit" ); + + if ( qunit ) { + qunit.innerHTML = + "

" + escapeText( document.title ) + "

" + + "

" + + "
" + + "

" + + "
    "; + } + + tests = id( "qunit-tests" ); + banner = id( "qunit-banner" ); + result = id( "qunit-testresult" ); + + if ( tests ) { + tests.innerHTML = ""; + } + + if ( banner ) { + banner.className = ""; + } + + if ( result ) { + result.parentNode.removeChild( result ); + } + + if ( tests ) { + result = document.createElement( "p" ); + result.id = "qunit-testresult"; + result.className = "result"; + tests.parentNode.insertBefore( result, tests ); + result.innerHTML = "Running...
     "; + } + }, + + // Resets the test setup. Useful for tests that modify the DOM. + reset: function() { + var fixture = id( "qunit-fixture" ); + if ( fixture ) { + fixture.innerHTML = config.fixture; + } + }, + + // Trigger an event on an element. + // @example triggerEvent( document.body, "click" ); + triggerEvent: function( elem, type, event ) { + if ( document.createEvent ) { + event = document.createEvent( "MouseEvents" ); + event.initMouseEvent(type, true, true, elem.ownerDocument.defaultView, + 0, 0, 0, 0, 0, false, false, false, false, 0, null); + + elem.dispatchEvent( event ); + } else if ( elem.fireEvent ) { + elem.fireEvent( "on" + type ); + } + }, + + // Safe object type checking + is: function( type, obj ) { + return QUnit.objectType( obj ) === type; + }, + + objectType: function( obj ) { + if ( typeof obj === "undefined" ) { + return "undefined"; + // consider: typeof null === object + } + if ( obj === null ) { + return "null"; + } + + var match = toString.call( obj ).match(/^\[object\s(.*)\]$/), + type = match && match[1] || ""; + + switch ( type ) { + case "Number": + if ( isNaN(obj) ) { + return "nan"; + } + return "number"; + case "String": + case "Boolean": + case "Array": + case "Date": + case "RegExp": + case "Function": + return type.toLowerCase(); + } + if ( typeof obj === "object" ) { + return "object"; + } + return undefined; + }, + + push: function( result, actual, expected, message ) { + if ( !config.current ) { + throw new Error( "assertion outside test context, was " + sourceFromStacktrace() ); + } + + var output, source, + details = { + module: config.current.module, + name: config.current.testName, + result: result, + message: message, + actual: actual, + expected: expected + }; + + message = escapeText( message ) || ( result ? "okay" : "failed" ); + message = "" + message + ""; + output = message; + + if ( !result ) { + expected = escapeText( QUnit.jsDump.parse(expected) ); + actual = escapeText( QUnit.jsDump.parse(actual) ); + output += ""; + + if ( actual !== expected ) { + output += ""; + output += ""; + } + + source = sourceFromStacktrace(); + + if ( source ) { + details.source = source; + output += ""; + } + + output += "
    Expected:
    " + expected + "
    Result:
    " + actual + "
    Diff:
    " + QUnit.diff( expected, actual ) + "
    Source:
    " + escapeText( source ) + "
    "; + } + + runLoggingCallbacks( "log", QUnit, details ); + + config.current.assertions.push({ + result: !!result, + message: output + }); + }, + + pushFailure: function( message, source, actual ) { + if ( !config.current ) { + throw new Error( "pushFailure() assertion outside test context, was " + sourceFromStacktrace(2) ); + } + + var output, + details = { + module: config.current.module, + name: config.current.testName, + result: false, + message: message + }; + + message = escapeText( message ) || "error"; + message = "" + message + ""; + output = message; + + output += ""; + + if ( actual ) { + output += ""; + } + + if ( source ) { + details.source = source; + output += ""; + } + + output += "
    Result:
    " + escapeText( actual ) + "
    Source:
    " + escapeText( source ) + "
    "; + + runLoggingCallbacks( "log", QUnit, details ); + + config.current.assertions.push({ + result: false, + message: output + }); + }, + + url: function( params ) { + params = extend( extend( {}, QUnit.urlParams ), params ); + var key, + querystring = "?"; + + for ( key in params ) { + if ( !hasOwn.call( params, key ) ) { + continue; + } + querystring += encodeURIComponent( key ) + "=" + + encodeURIComponent( params[ key ] ) + "&"; + } + return window.location.protocol + "//" + window.location.host + + window.location.pathname + querystring.slice( 0, -1 ); + }, + + extend: extend, + id: id, + addEvent: addEvent + // load, equiv, jsDump, diff: Attached later +}); + +/** + * @deprecated: Created for backwards compatibility with test runner that set the hook function + * into QUnit.{hook}, instead of invoking it and passing the hook function. + * QUnit.constructor is set to the empty F() above so that we can add to it's prototype here. + * Doing this allows us to tell if the following methods have been overwritten on the actual + * QUnit object. + */ +extend( QUnit.constructor.prototype, { + + // Logging callbacks; all receive a single argument with the listed properties + // run test/logs.html for any related changes + begin: registerLoggingCallback( "begin" ), + + // done: { failed, passed, total, runtime } + done: registerLoggingCallback( "done" ), + + // log: { result, actual, expected, message } + log: registerLoggingCallback( "log" ), + + // testStart: { name } + testStart: registerLoggingCallback( "testStart" ), + + // testDone: { name, failed, passed, total, duration } + testDone: registerLoggingCallback( "testDone" ), + + // moduleStart: { name } + moduleStart: registerLoggingCallback( "moduleStart" ), + + // moduleDone: { name, failed, passed, total } + moduleDone: registerLoggingCallback( "moduleDone" ) +}); + +if ( typeof document === "undefined" || document.readyState === "complete" ) { + config.autorun = true; +} + +QUnit.load = function() { + runLoggingCallbacks( "begin", QUnit, {} ); + + // Initialize the config, saving the execution queue + var banner, filter, i, label, len, main, ol, toolbar, userAgent, val, + urlConfigCheckboxesContainer, urlConfigCheckboxes, moduleFilter, + numModules = 0, + moduleFilterHtml = "", + urlConfigHtml = "", + oldconfig = extend( {}, config ); + + QUnit.init(); + extend(config, oldconfig); + + config.blocking = false; + + len = config.urlConfig.length; + + for ( i = 0; i < len; i++ ) { + val = config.urlConfig[i]; + if ( typeof val === "string" ) { + val = { + id: val, + label: val, + tooltip: "[no tooltip available]" + }; + } + config[ val.id ] = QUnit.urlParams[ val.id ]; + urlConfigHtml += ""; + } + + moduleFilterHtml += ""; + + // `userAgent` initialized at top of scope + userAgent = id( "qunit-userAgent" ); + if ( userAgent ) { + userAgent.innerHTML = navigator.userAgent; + } + + // `banner` initialized at top of scope + banner = id( "qunit-header" ); + if ( banner ) { + banner.innerHTML = "
    " + banner.innerHTML + " "; + } + + // `toolbar` initialized at top of scope + toolbar = id( "qunit-testrunner-toolbar" ); + if ( toolbar ) { + // `filter` initialized at top of scope + filter = document.createElement( "input" ); + filter.type = "checkbox"; + filter.id = "qunit-filter-pass"; + + addEvent( filter, "click", function() { + var tmp, + ol = document.getElementById( "qunit-tests" ); + + if ( filter.checked ) { + ol.className = ol.className + " hidepass"; + } else { + tmp = " " + ol.className.replace( /[\n\t\r]/g, " " ) + " "; + ol.className = tmp.replace( / hidepass /, " " ); + } + if ( defined.sessionStorage ) { + if (filter.checked) { + sessionStorage.setItem( "qunit-filter-passed-tests", "true" ); + } else { + sessionStorage.removeItem( "qunit-filter-passed-tests" ); + } + } + }); + + if ( config.hidepassed || defined.sessionStorage && sessionStorage.getItem( "qunit-filter-passed-tests" ) ) { + filter.checked = true; + // `ol` initialized at top of scope + ol = document.getElementById( "qunit-tests" ); + ol.className = ol.className + " hidepass"; + } + toolbar.appendChild( filter ); + + // `label` initialized at top of scope + label = document.createElement( "label" ); + label.setAttribute( "for", "qunit-filter-pass" ); + label.setAttribute( "title", "Only show tests and assertons that fail. Stored in sessionStorage." ); + label.innerHTML = "Hide passed tests"; + toolbar.appendChild( label ); + + urlConfigCheckboxesContainer = document.createElement("span"); + urlConfigCheckboxesContainer.innerHTML = urlConfigHtml; + urlConfigCheckboxes = urlConfigCheckboxesContainer.getElementsByTagName("input"); + // For oldIE support: + // * Add handlers to the individual elements instead of the container + // * Use "click" instead of "change" + // * Fallback from event.target to event.srcElement + addEvents( urlConfigCheckboxes, "click", function( event ) { + var params = {}, + target = event.target || event.srcElement; + params[ target.name ] = target.checked ? true : undefined; + window.location = QUnit.url( params ); + }); + toolbar.appendChild( urlConfigCheckboxesContainer ); + + if (numModules > 1) { + moduleFilter = document.createElement( 'span' ); + moduleFilter.setAttribute( 'id', 'qunit-modulefilter-container' ); + moduleFilter.innerHTML = moduleFilterHtml; + addEvent( moduleFilter.lastChild, "change", function() { + var selectBox = moduleFilter.getElementsByTagName("select")[0], + selectedModule = decodeURIComponent(selectBox.options[selectBox.selectedIndex].value); + + window.location = QUnit.url( { module: ( selectedModule === "" ) ? undefined : selectedModule } ); + }); + toolbar.appendChild(moduleFilter); + } + } + + // `main` initialized at top of scope + main = id( "qunit-fixture" ); + if ( main ) { + config.fixture = main.innerHTML; + } + + if ( config.autostart ) { + QUnit.start(); + } +}; + +addEvent( window, "load", QUnit.load ); + +// `onErrorFnPrev` initialized at top of scope +// Preserve other handlers +onErrorFnPrev = window.onerror; + +// Cover uncaught exceptions +// Returning true will surpress the default browser handler, +// returning false will let it run. +window.onerror = function ( error, filePath, linerNr ) { + var ret = false; + if ( onErrorFnPrev ) { + ret = onErrorFnPrev( error, filePath, linerNr ); + } + + // Treat return value as window.onerror itself does, + // Only do our handling if not surpressed. + if ( ret !== true ) { + if ( QUnit.config.current ) { + if ( QUnit.config.current.ignoreGlobalErrors ) { + return true; + } + QUnit.pushFailure( error, filePath + ":" + linerNr ); + } else { + QUnit.test( "global failure", extend( function() { + QUnit.pushFailure( error, filePath + ":" + linerNr ); + }, { validTest: validTest } ) ); + } + return false; + } + + return ret; +}; + +function done() { + config.autorun = true; + + // Log the last module results + if ( config.currentModule ) { + runLoggingCallbacks( "moduleDone", QUnit, { + name: config.currentModule, + failed: config.moduleStats.bad, + passed: config.moduleStats.all - config.moduleStats.bad, + total: config.moduleStats.all + }); + } + + var i, key, + banner = id( "qunit-banner" ), + tests = id( "qunit-tests" ), + runtime = +new Date() - config.started, + passed = config.stats.all - config.stats.bad, + html = [ + "Tests completed in ", + runtime, + " milliseconds.
    ", + "", + passed, + " assertions of ", + config.stats.all, + " passed, ", + config.stats.bad, + " failed." + ].join( "" ); + + if ( banner ) { + banner.className = ( config.stats.bad ? "qunit-fail" : "qunit-pass" ); + } + + if ( tests ) { + id( "qunit-testresult" ).innerHTML = html; + } + + if ( config.altertitle && typeof document !== "undefined" && document.title ) { + // show ✖ for good, ✔ for bad suite result in title + // use escape sequences in case file gets loaded with non-utf-8-charset + document.title = [ + ( config.stats.bad ? "\u2716" : "\u2714" ), + document.title.replace( /^[\u2714\u2716] /i, "" ) + ].join( " " ); + } + + // clear own sessionStorage items if all tests passed + if ( config.reorder && defined.sessionStorage && config.stats.bad === 0 ) { + // `key` & `i` initialized at top of scope + for ( i = 0; i < sessionStorage.length; i++ ) { + key = sessionStorage.key( i++ ); + if ( key.indexOf( "qunit-test-" ) === 0 ) { + sessionStorage.removeItem( key ); + } + } + } + + // scroll back to top to show results + if ( window.scrollTo ) { + window.scrollTo(0, 0); + } + + runLoggingCallbacks( "done", QUnit, { + failed: config.stats.bad, + passed: passed, + total: config.stats.all, + runtime: runtime + }); +} + +/** @return Boolean: true if this test should be ran */ +function validTest( test ) { + var include, + filter = config.filter && config.filter.toLowerCase(), + module = config.module && config.module.toLowerCase(), + fullName = (test.module + ": " + test.testName).toLowerCase(); + + // Internally-generated tests are always valid + if ( test.callback && test.callback.validTest === validTest ) { + delete test.callback.validTest; + return true; + } + + if ( config.testNumber ) { + return test.testNumber === config.testNumber; + } + + if ( module && ( !test.module || test.module.toLowerCase() !== module ) ) { + return false; + } + + if ( !filter ) { + return true; + } + + include = filter.charAt( 0 ) !== "!"; + if ( !include ) { + filter = filter.slice( 1 ); + } + + // If the filter matches, we need to honour include + if ( fullName.indexOf( filter ) !== -1 ) { + return include; + } + + // Otherwise, do the opposite + return !include; +} + +// so far supports only Firefox, Chrome and Opera (buggy), Safari (for real exceptions) +// Later Safari and IE10 are supposed to support error.stack as well +// See also https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/Error/Stack +function extractStacktrace( e, offset ) { + offset = offset === undefined ? 3 : offset; + + var stack, include, i; + + if ( e.stacktrace ) { + // Opera + return e.stacktrace.split( "\n" )[ offset + 3 ]; + } else if ( e.stack ) { + // Firefox, Chrome + stack = e.stack.split( "\n" ); + if (/^error$/i.test( stack[0] ) ) { + stack.shift(); + } + if ( fileName ) { + include = []; + for ( i = offset; i < stack.length; i++ ) { + if ( stack[ i ].indexOf( fileName ) !== -1 ) { + break; + } + include.push( stack[ i ] ); + } + if ( include.length ) { + return include.join( "\n" ); + } + } + return stack[ offset ]; + } else if ( e.sourceURL ) { + // Safari, PhantomJS + // hopefully one day Safari provides actual stacktraces + // exclude useless self-reference for generated Error objects + if ( /qunit.js$/.test( e.sourceURL ) ) { + return; + } + // for actual exceptions, this is useful + return e.sourceURL + ":" + e.line; + } +} +function sourceFromStacktrace( offset ) { + try { + throw new Error(); + } catch ( e ) { + return extractStacktrace( e, offset ); + } +} + +/** + * Escape text for attribute or text content. + */ +function escapeText( s ) { + if ( !s ) { + return ""; + } + s = s + ""; + // Both single quotes and double quotes (for attributes) + return s.replace( /['"<>&]/g, function( s ) { + switch( s ) { + case '\'': + return '''; + case '"': + return '"'; + case '<': + return '<'; + case '>': + return '>'; + case '&': + return '&'; + } + }); +} + +function synchronize( callback, last ) { + config.queue.push( callback ); + + if ( config.autorun && !config.blocking ) { + process( last ); + } +} + +function process( last ) { + function next() { + process( last ); + } + var start = new Date().getTime(); + config.depth = config.depth ? config.depth + 1 : 1; + + while ( config.queue.length && !config.blocking ) { + if ( !defined.setTimeout || config.updateRate <= 0 || ( ( new Date().getTime() - start ) < config.updateRate ) ) { + config.queue.shift()(); + } else { + window.setTimeout( next, 13 ); + break; + } + } + config.depth--; + if ( last && !config.blocking && !config.queue.length && config.depth === 0 ) { + done(); + } +} + +function saveGlobal() { + config.pollution = []; + + if ( config.noglobals ) { + for ( var key in window ) { + // in Opera sometimes DOM element ids show up here, ignore them + if ( !hasOwn.call( window, key ) || /^qunit-test-output/.test( key ) ) { + continue; + } + config.pollution.push( key ); + } + } +} + +function checkPollution() { + var newGlobals, + deletedGlobals, + old = config.pollution; + + saveGlobal(); + + newGlobals = diff( config.pollution, old ); + if ( newGlobals.length > 0 ) { + QUnit.pushFailure( "Introduced global variable(s): " + newGlobals.join(", ") ); + } + + deletedGlobals = diff( old, config.pollution ); + if ( deletedGlobals.length > 0 ) { + QUnit.pushFailure( "Deleted global variable(s): " + deletedGlobals.join(", ") ); + } +} + +// returns a new Array with the elements that are in a but not in b +function diff( a, b ) { + var i, j, + result = a.slice(); + + for ( i = 0; i < result.length; i++ ) { + for ( j = 0; j < b.length; j++ ) { + if ( result[i] === b[j] ) { + result.splice( i, 1 ); + i--; + break; + } + } + } + return result; +} + +function extend( a, b ) { + for ( var prop in b ) { + if ( b[ prop ] === undefined ) { + delete a[ prop ]; + + // Avoid "Member not found" error in IE8 caused by setting window.constructor + } else if ( prop !== "constructor" || a !== window ) { + a[ prop ] = b[ prop ]; + } + } + + return a; +} + +/** + * @param {HTMLElement} elem + * @param {string} type + * @param {Function} fn + */ +function addEvent( elem, type, fn ) { + // Standards-based browsers + if ( elem.addEventListener ) { + elem.addEventListener( type, fn, false ); + // IE + } else { + elem.attachEvent( "on" + type, fn ); + } +} + +/** + * @param {Array|NodeList} elems + * @param {string} type + * @param {Function} fn + */ +function addEvents( elems, type, fn ) { + var i = elems.length; + while ( i-- ) { + addEvent( elems[i], type, fn ); + } +} + +function hasClass( elem, name ) { + return (" " + elem.className + " ").indexOf(" " + name + " ") > -1; +} + +function addClass( elem, name ) { + if ( !hasClass( elem, name ) ) { + elem.className += (elem.className ? " " : "") + name; + } +} + +function removeClass( elem, name ) { + var set = " " + elem.className + " "; + // Class name may appear multiple times + while ( set.indexOf(" " + name + " ") > -1 ) { + set = set.replace(" " + name + " " , " "); + } + // If possible, trim it for prettiness, but not neccecarily + elem.className = window.jQuery ? jQuery.trim( set ) : ( set.trim ? set.trim() : set ); +} + +function id( name ) { + return !!( typeof document !== "undefined" && document && document.getElementById ) && + document.getElementById( name ); +} + +function registerLoggingCallback( key ) { + return function( callback ) { + config[key].push( callback ); + }; +} + +// Supports deprecated method of completely overwriting logging callbacks +function runLoggingCallbacks( key, scope, args ) { + var i, callbacks; + if ( QUnit.hasOwnProperty( key ) ) { + QUnit[ key ].call(scope, args ); + } else { + callbacks = config[ key ]; + for ( i = 0; i < callbacks.length; i++ ) { + callbacks[ i ].call( scope, args ); + } + } +} + +// Test for equality any JavaScript type. +// Author: Philippe Rathé +QUnit.equiv = (function() { + + // Call the o related callback with the given arguments. + function bindCallbacks( o, callbacks, args ) { + var prop = QUnit.objectType( o ); + if ( prop ) { + if ( QUnit.objectType( callbacks[ prop ] ) === "function" ) { + return callbacks[ prop ].apply( callbacks, args ); + } else { + return callbacks[ prop ]; // or undefined + } + } + } + + // the real equiv function + var innerEquiv, + // stack to decide between skip/abort functions + callers = [], + // stack to avoiding loops from circular referencing + parents = [], + + getProto = Object.getPrototypeOf || function ( obj ) { + return obj.__proto__; + }, + callbacks = (function () { + + // for string, boolean, number and null + function useStrictEquality( b, a ) { + /*jshint eqeqeq:false */ + if ( b instanceof a.constructor || a instanceof b.constructor ) { + // to catch short annotaion VS 'new' annotation of a + // declaration + // e.g. var i = 1; + // var j = new Number(1); + return a == b; + } else { + return a === b; + } + } + + return { + "string": useStrictEquality, + "boolean": useStrictEquality, + "number": useStrictEquality, + "null": useStrictEquality, + "undefined": useStrictEquality, + + "nan": function( b ) { + return isNaN( b ); + }, + + "date": function( b, a ) { + return QUnit.objectType( b ) === "date" && a.valueOf() === b.valueOf(); + }, + + "regexp": function( b, a ) { + return QUnit.objectType( b ) === "regexp" && + // the regex itself + a.source === b.source && + // and its modifers + a.global === b.global && + // (gmi) ... + a.ignoreCase === b.ignoreCase && + a.multiline === b.multiline && + a.sticky === b.sticky; + }, + + // - skip when the property is a method of an instance (OOP) + // - abort otherwise, + // initial === would have catch identical references anyway + "function": function() { + var caller = callers[callers.length - 1]; + return caller !== Object && typeof caller !== "undefined"; + }, + + "array": function( b, a ) { + var i, j, len, loop; + + // b could be an object literal here + if ( QUnit.objectType( b ) !== "array" ) { + return false; + } + + len = a.length; + if ( len !== b.length ) { + // safe and faster + return false; + } + + // track reference to avoid circular references + parents.push( a ); + for ( i = 0; i < len; i++ ) { + loop = false; + for ( j = 0; j < parents.length; j++ ) { + if ( parents[j] === a[i] ) { + loop = true;// dont rewalk array + } + } + if ( !loop && !innerEquiv(a[i], b[i]) ) { + parents.pop(); + return false; + } + } + parents.pop(); + return true; + }, + + "object": function( b, a ) { + var i, j, loop, + // Default to true + eq = true, + aProperties = [], + bProperties = []; + + // comparing constructors is more strict than using + // instanceof + if ( a.constructor !== b.constructor ) { + // Allow objects with no prototype to be equivalent to + // objects with Object as their constructor. + if ( !(( getProto(a) === null && getProto(b) === Object.prototype ) || + ( getProto(b) === null && getProto(a) === Object.prototype ) ) ) { + return false; + } + } + + // stack constructor before traversing properties + callers.push( a.constructor ); + // track reference to avoid circular references + parents.push( a ); + + for ( i in a ) { // be strict: don't ensures hasOwnProperty + // and go deep + loop = false; + for ( j = 0; j < parents.length; j++ ) { + if ( parents[j] === a[i] ) { + // don't go down the same path twice + loop = true; + } + } + aProperties.push(i); // collect a's properties + + if (!loop && !innerEquiv( a[i], b[i] ) ) { + eq = false; + break; + } + } + + callers.pop(); // unstack, we are done + parents.pop(); + + for ( i in b ) { + bProperties.push( i ); // collect b's properties + } + + // Ensures identical properties name + return eq && innerEquiv( aProperties.sort(), bProperties.sort() ); + } + }; + }()); + + innerEquiv = function() { // can take multiple arguments + var args = [].slice.apply( arguments ); + if ( args.length < 2 ) { + return true; // end transition + } + + return (function( a, b ) { + if ( a === b ) { + return true; // catch the most you can + } else if ( a === null || b === null || typeof a === "undefined" || + typeof b === "undefined" || + QUnit.objectType(a) !== QUnit.objectType(b) ) { + return false; // don't lose time with error prone cases + } else { + return bindCallbacks(a, callbacks, [ b, a ]); + } + + // apply transition with (1..n) arguments + }( args[0], args[1] ) && arguments.callee.apply( this, args.splice(1, args.length - 1 )) ); + }; + + return innerEquiv; +}()); + +/** + * jsDump Copyright (c) 2008 Ariel Flesler - aflesler(at)gmail(dot)com | + * http://flesler.blogspot.com Licensed under BSD + * (http://www.opensource.org/licenses/bsd-license.php) Date: 5/15/2008 + * + * @projectDescription Advanced and extensible data dumping for Javascript. + * @version 1.0.0 + * @author Ariel Flesler + * @link {http://flesler.blogspot.com/2008/05/jsdump-pretty-dump-of-any-javascript.html} + */ +QUnit.jsDump = (function() { + function quote( str ) { + return '"' + str.toString().replace( /"/g, '\\"' ) + '"'; + } + function literal( o ) { + return o + ""; + } + function join( pre, arr, post ) { + var s = jsDump.separator(), + base = jsDump.indent(), + inner = jsDump.indent(1); + if ( arr.join ) { + arr = arr.join( "," + s + inner ); + } + if ( !arr ) { + return pre + post; + } + return [ pre, inner + arr, base + post ].join(s); + } + function array( arr, stack ) { + var i = arr.length, ret = new Array(i); + this.up(); + while ( i-- ) { + ret[i] = this.parse( arr[i] , undefined , stack); + } + this.down(); + return join( "[", ret, "]" ); + } + + var reName = /^function (\w+)/, + jsDump = { + // type is used mostly internally, you can fix a (custom)type in advance + parse: function( obj, type, stack ) { + stack = stack || [ ]; + var inStack, res, + parser = this.parsers[ type || this.typeOf(obj) ]; + + type = typeof parser; + inStack = inArray( obj, stack ); + + if ( inStack !== -1 ) { + return "recursion(" + (inStack - stack.length) + ")"; + } + if ( type === "function" ) { + stack.push( obj ); + res = parser.call( this, obj, stack ); + stack.pop(); + return res; + } + return ( type === "string" ) ? parser : this.parsers.error; + }, + typeOf: function( obj ) { + var type; + if ( obj === null ) { + type = "null"; + } else if ( typeof obj === "undefined" ) { + type = "undefined"; + } else if ( QUnit.is( "regexp", obj) ) { + type = "regexp"; + } else if ( QUnit.is( "date", obj) ) { + type = "date"; + } else if ( QUnit.is( "function", obj) ) { + type = "function"; + } else if ( typeof obj.setInterval !== undefined && typeof obj.document !== "undefined" && typeof obj.nodeType === "undefined" ) { + type = "window"; + } else if ( obj.nodeType === 9 ) { + type = "document"; + } else if ( obj.nodeType ) { + type = "node"; + } else if ( + // native arrays + toString.call( obj ) === "[object Array]" || + // NodeList objects + ( typeof obj.length === "number" && typeof obj.item !== "undefined" && ( obj.length ? obj.item(0) === obj[0] : ( obj.item( 0 ) === null && typeof obj[0] === "undefined" ) ) ) + ) { + type = "array"; + } else if ( obj.constructor === Error.prototype.constructor ) { + type = "error"; + } else { + type = typeof obj; + } + return type; + }, + separator: function() { + return this.multiline ? this.HTML ? "
    " : "\n" : this.HTML ? " " : " "; + }, + // extra can be a number, shortcut for increasing-calling-decreasing + indent: function( extra ) { + if ( !this.multiline ) { + return ""; + } + var chr = this.indentChar; + if ( this.HTML ) { + chr = chr.replace( /\t/g, " " ).replace( / /g, " " ); + } + return new Array( this._depth_ + (extra||0) ).join(chr); + }, + up: function( a ) { + this._depth_ += a || 1; + }, + down: function( a ) { + this._depth_ -= a || 1; + }, + setParser: function( name, parser ) { + this.parsers[name] = parser; + }, + // The next 3 are exposed so you can use them + quote: quote, + literal: literal, + join: join, + // + _depth_: 1, + // This is the list of parsers, to modify them, use jsDump.setParser + parsers: { + window: "[Window]", + document: "[Document]", + error: function(error) { + return "Error(\"" + error.message + "\")"; + }, + unknown: "[Unknown]", + "null": "null", + "undefined": "undefined", + "function": function( fn ) { + var ret = "function", + // functions never have name in IE + name = "name" in fn ? fn.name : (reName.exec(fn) || [])[1]; + + if ( name ) { + ret += " " + name; + } + ret += "( "; + + ret = [ ret, QUnit.jsDump.parse( fn, "functionArgs" ), "){" ].join( "" ); + return join( ret, QUnit.jsDump.parse(fn,"functionCode" ), "}" ); + }, + array: array, + nodelist: array, + "arguments": array, + object: function( map, stack ) { + var ret = [ ], keys, key, val, i; + QUnit.jsDump.up(); + keys = []; + for ( key in map ) { + keys.push( key ); + } + keys.sort(); + for ( i = 0; i < keys.length; i++ ) { + key = keys[ i ]; + val = map[ key ]; + ret.push( QUnit.jsDump.parse( key, "key" ) + ": " + QUnit.jsDump.parse( val, undefined, stack ) ); + } + QUnit.jsDump.down(); + return join( "{", ret, "}" ); + }, + node: function( node ) { + var len, i, val, + open = QUnit.jsDump.HTML ? "<" : "<", + close = QUnit.jsDump.HTML ? ">" : ">", + tag = node.nodeName.toLowerCase(), + ret = open + tag, + attrs = node.attributes; + + if ( attrs ) { + for ( i = 0, len = attrs.length; i < len; i++ ) { + val = attrs[i].nodeValue; + // IE6 includes all attributes in .attributes, even ones not explicitly set. + // Those have values like undefined, null, 0, false, "" or "inherit". + if ( val && val !== "inherit" ) { + ret += " " + attrs[i].nodeName + "=" + QUnit.jsDump.parse( val, "attribute" ); + } + } + } + ret += close; + + // Show content of TextNode or CDATASection + if ( node.nodeType === 3 || node.nodeType === 4 ) { + ret += node.nodeValue; + } + + return ret + open + "/" + tag + close; + }, + // function calls it internally, it's the arguments part of the function + functionArgs: function( fn ) { + var args, + l = fn.length; + + if ( !l ) { + return ""; + } + + args = new Array(l); + while ( l-- ) { + // 97 is 'a' + args[l] = String.fromCharCode(97+l); + } + return " " + args.join( ", " ) + " "; + }, + // object calls it internally, the key part of an item in a map + key: quote, + // function calls it internally, it's the content of the function + functionCode: "[code]", + // node calls it internally, it's an html attribute value + attribute: quote, + string: quote, + date: quote, + regexp: literal, + number: literal, + "boolean": literal + }, + // if true, entities are escaped ( <, >, \t, space and \n ) + HTML: false, + // indentation unit + indentChar: " ", + // if true, items in a collection, are separated by a \n, else just a space. + multiline: true + }; + + return jsDump; +}()); + +// from jquery.js +function inArray( elem, array ) { + if ( array.indexOf ) { + return array.indexOf( elem ); + } + + for ( var i = 0, length = array.length; i < length; i++ ) { + if ( array[ i ] === elem ) { + return i; + } + } + + return -1; +} + +/* + * Javascript Diff Algorithm + * By John Resig (http://ejohn.org/) + * Modified by Chu Alan "sprite" + * + * Released under the MIT license. + * + * More Info: + * http://ejohn.org/projects/javascript-diff-algorithm/ + * + * Usage: QUnit.diff(expected, actual) + * + * QUnit.diff( "the quick brown fox jumped over", "the quick fox jumps over" ) == "the quick brown fox jumped jumps over" + */ +QUnit.diff = (function() { + /*jshint eqeqeq:false, eqnull:true */ + function diff( o, n ) { + var i, + ns = {}, + os = {}; + + for ( i = 0; i < n.length; i++ ) { + if ( !hasOwn.call( ns, n[i] ) ) { + ns[ n[i] ] = { + rows: [], + o: null + }; + } + ns[ n[i] ].rows.push( i ); + } + + for ( i = 0; i < o.length; i++ ) { + if ( !hasOwn.call( os, o[i] ) ) { + os[ o[i] ] = { + rows: [], + n: null + }; + } + os[ o[i] ].rows.push( i ); + } + + for ( i in ns ) { + if ( !hasOwn.call( ns, i ) ) { + continue; + } + if ( ns[i].rows.length === 1 && hasOwn.call( os, i ) && os[i].rows.length === 1 ) { + n[ ns[i].rows[0] ] = { + text: n[ ns[i].rows[0] ], + row: os[i].rows[0] + }; + o[ os[i].rows[0] ] = { + text: o[ os[i].rows[0] ], + row: ns[i].rows[0] + }; + } + } + + for ( i = 0; i < n.length - 1; i++ ) { + if ( n[i].text != null && n[ i + 1 ].text == null && n[i].row + 1 < o.length && o[ n[i].row + 1 ].text == null && + n[ i + 1 ] == o[ n[i].row + 1 ] ) { + + n[ i + 1 ] = { + text: n[ i + 1 ], + row: n[i].row + 1 + }; + o[ n[i].row + 1 ] = { + text: o[ n[i].row + 1 ], + row: i + 1 + }; + } + } + + for ( i = n.length - 1; i > 0; i-- ) { + if ( n[i].text != null && n[ i - 1 ].text == null && n[i].row > 0 && o[ n[i].row - 1 ].text == null && + n[ i - 1 ] == o[ n[i].row - 1 ]) { + + n[ i - 1 ] = { + text: n[ i - 1 ], + row: n[i].row - 1 + }; + o[ n[i].row - 1 ] = { + text: o[ n[i].row - 1 ], + row: i - 1 + }; + } + } + + return { + o: o, + n: n + }; + } + + return function( o, n ) { + o = o.replace( /\s+$/, "" ); + n = n.replace( /\s+$/, "" ); + + var i, pre, + str = "", + out = diff( o === "" ? [] : o.split(/\s+/), n === "" ? [] : n.split(/\s+/) ), + oSpace = o.match(/\s+/g), + nSpace = n.match(/\s+/g); + + if ( oSpace == null ) { + oSpace = [ " " ]; + } + else { + oSpace.push( " " ); + } + + if ( nSpace == null ) { + nSpace = [ " " ]; + } + else { + nSpace.push( " " ); + } + + if ( out.n.length === 0 ) { + for ( i = 0; i < out.o.length; i++ ) { + str += "" + out.o[i] + oSpace[i] + ""; + } + } + else { + if ( out.n[0].text == null ) { + for ( n = 0; n < out.o.length && out.o[n].text == null; n++ ) { + str += "" + out.o[n] + oSpace[n] + ""; + } + } + + for ( i = 0; i < out.n.length; i++ ) { + if (out.n[i].text == null) { + str += "" + out.n[i] + nSpace[i] + ""; + } + else { + // `pre` initialized at top of scope + pre = ""; + + for ( n = out.n[i].row + 1; n < out.o.length && out.o[n].text == null; n++ ) { + pre += "" + out.o[n] + oSpace[n] + ""; + } + str += " " + out.n[i].text + nSpace[i] + pre; + } + } + } + + return str; + }; +}()); + +// for CommonJS enviroments, export everything +if ( typeof exports !== "undefined" ) { + extend( exports, QUnit ); +} + +// get at whatever the global object is, like window in browsers +}( (function() {return this;}.call()) )); diff --git a/testData/compressed-jQueryUI-built-with-node-archiver/inflated/development-bundle/jquery-1.9.1.js b/testData/compressed-jQueryUI-built-with-node-archiver/inflated/development-bundle/jquery-1.9.1.js new file mode 100755 index 00000000..e2c203fe --- /dev/null +++ b/testData/compressed-jQueryUI-built-with-node-archiver/inflated/development-bundle/jquery-1.9.1.js @@ -0,0 +1,9597 @@ +/*! + * jQuery JavaScript Library v1.9.1 + * 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: 2013-2-4 + */ +(function( window, undefined ) { + +// Can't do this because several apps including ASP.NET trace +// the stack via arguments.caller.callee and Firefox dies if +// you try to trace through "use strict" call chains. (#13335) +// Support: Firefox 18+ +//"use strict"; +var + // 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 = "1.9.1", + + // 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 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); +// 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; +}; +jQuery.extend({ + + Deferred: function( func ) { + var tuples = [ + // action, add listener, listener list, final state + [ "resolve", "done", jQuery.Callbacks("once memory"), "resolved" ], + [ "reject", "fail", jQuery.Callbacks("once memory"), "rejected" ], + [ "notify", "progress", jQuery.Callbacks("memory") ] + ], + state = "pending", + promise = { + state: function() { + return state; + }, + always: function() { + deferred.done( arguments ).fail( arguments ); + return this; + }, + then: function( /* fnDone, fnFail, fnProgress */ ) { + var fns = arguments; + return jQuery.Deferred(function( newDefer ) { + jQuery.each( tuples, function( i, tuple ) { + var action = tuple[ 0 ], + fn = jQuery.isFunction( fns[ i ] ) && fns[ i ]; + // deferred[ done | fail | progress ] for forwarding actions to newDefer + deferred[ tuple[1] ](function() { + var returned = fn && fn.apply( this, arguments ); + if ( returned && jQuery.isFunction( returned.promise ) ) { + returned.promise() + .done( newDefer.resolve ) + .fail( newDefer.reject ) + .progress( newDefer.notify ); + } else { + newDefer[ action + "With" ]( this === promise ? newDefer.promise() : this, fn ? [ returned ] : arguments ); + } + }); + }); + fns = null; + }).promise(); + }, + // Get a promise for this deferred + // If obj is provided, the promise aspect is added to the object + promise: function( obj ) { + return obj != null ? jQuery.extend( obj, promise ) : promise; + } + }, + deferred = {}; + + // Keep pipe for back-compat + promise.pipe = promise.then; + + // Add list-specific methods + jQuery.each( tuples, function( i, tuple ) { + var list = tuple[ 2 ], + stateString = tuple[ 3 ]; + + // promise[ done | fail | progress ] = list.add + promise[ tuple[1] ] = list.add; + + // Handle state + if ( stateString ) { + list.add(function() { + // state = [ resolved | rejected ] + state = stateString; + + // [ reject_list | resolve_list ].disable; progress_list.lock + }, tuples[ i ^ 1 ][ 2 ].disable, tuples[ 2 ][ 2 ].lock ); + } + + // deferred[ resolve | reject | notify ] + deferred[ tuple[0] ] = function() { + deferred[ tuple[0] + "With" ]( this === deferred ? promise : this, arguments ); + return this; + }; + deferred[ tuple[0] + "With" ] = list.fireWith; + }); + + // Make the deferred a promise + promise.promise( deferred ); + + // Call given func if any + if ( func ) { + func.call( deferred, deferred ); + } + + // All done! + return deferred; + }, + + // Deferred helper + when: function( subordinate /* , ..., subordinateN */ ) { + var i = 0, + resolveValues = core_slice.call( arguments ), + length = resolveValues.length, + + // the count of uncompleted subordinates + remaining = length !== 1 || ( subordinate && jQuery.isFunction( subordinate.promise ) ) ? length : 0, + + // the master Deferred. If resolveValues consist of only a single Deferred, just use that. + deferred = remaining === 1 ? subordinate : jQuery.Deferred(), + + // Update function for both resolve and progress values + updateFunc = function( i, contexts, values ) { + return function( value ) { + contexts[ i ] = this; + values[ i ] = arguments.length > 1 ? core_slice.call( arguments ) : value; + if( values === progressValues ) { + deferred.notifyWith( contexts, values ); + } else if ( !( --remaining ) ) { + deferred.resolveWith( contexts, values ); + } + }; + }, + + progressValues, progressContexts, resolveContexts; + + // add listeners to Deferred subordinates; treat others as resolved + if ( length > 1 ) { + progressValues = new Array( length ); + progressContexts = new Array( length ); + resolveContexts = new Array( length ); + for ( ; i < length; i++ ) { + if ( resolveValues[ i ] && jQuery.isFunction( resolveValues[ i ].promise ) ) { + resolveValues[ i ].promise() + .done( updateFunc( i, resolveContexts, resolveValues ) ) + .fail( deferred.reject ) + .progress( updateFunc( i, progressContexts, progressValues ) ); + } else { + --remaining; + } + } + } + + // if we're not waiting on anything, resolve the master + if ( !remaining ) { + deferred.resolveWith( resolveContexts, resolveValues ); + } + + return deferred.promise(); + } +}); +jQuery.support = (function() { + + var support, all, a, + input, select, fragment, + opt, eventName, isSupported, i, + div = document.createElement("div"); + + // Setup + div.setAttribute( "className", "t" ); + div.innerHTML = "
    a"; + + // 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>", + + // 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 = "
    t
    "; + 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.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; +})(); + +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; +} +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 ); + } +}); +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 ); + } + } + }); +}); +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 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 ); + } + } +}); +/*! + * Sizzle CSS Selector Engine + * Copyright 2012 jQuery Foundation and other contributors + * Released under the MIT license + * http://sizzlejs.com/ + */ +(function( window, undefined ) { + +var i, + cachedruns, + Expr, + getText, + isXML, + compile, + hasDuplicate, + outermostContext, + + // Local document vars + setDocument, + document, + docElem, + documentIsXML, + rbuggyQSA, + rbuggyMatches, + matches, + contains, + sortOrder, + + // Instance-specific data + expando = "sizzle" + -(new Date()), + preferredDoc = window.document, + support = {}, + dirruns = 0, + done = 0, + classCache = createCache(), + tokenCache = createCache(), + compilerCache = createCache(), + + // General-purpose constants + strundefined = typeof undefined, + MAX_NEGATIVE = 1 << 31, + + // Array methods + arr = [], + pop = arr.pop, + push = arr.push, + slice = arr.slice, + // Use a stripped-down indexOf if we can't use a native one + indexOf = arr.indexOf || function( elem ) { + var i = 0, + len = this.length; + for ( ; i < len; i++ ) { + if ( this[i] === elem ) { + return i; + } + } + return -1; + }, + + + // Regular expressions + + // Whitespace characters http://www.w3.org/TR/css3-selectors/#whitespace + whitespace = "[\\x20\\t\\r\\n\\f]", + // http://www.w3.org/TR/css3-syntax/#characters + characterEncoding = "(?:\\\\.|[\\w-]|[^\\x00-\\xa0])+", + + // Loosely modeled on CSS identifier characters + // An unquoted value should be a CSS identifier http://www.w3.org/TR/css3-selectors/#attribute-selectors + // Proper syntax: http://www.w3.org/TR/CSS21/syndata.html#value-def-identifier + identifier = characterEncoding.replace( "w", "w#" ), + + // Acceptable operators http://www.w3.org/TR/selectors/#attribute-selectors + operators = "([*^$|!~]?=)", + attributes = "\\[" + whitespace + "*(" + characterEncoding + ")" + whitespace + + "*(?:" + operators + whitespace + "*(?:(['\"])((?:\\\\.|[^\\\\])*?)\\3|(" + identifier + ")|)|)" + whitespace + "*\\]", + + // Prefer arguments quoted, + // then not containing pseudos/brackets, + // then attribute selectors/non-parenthetical expressions, + // then anything else + // These preferences are here to reduce the number of selectors + // needing tokenize in the PSEUDO preFilter + pseudos = ":(" + characterEncoding + ")(?:\\(((['\"])((?:\\\\.|[^\\\\])*?)\\3|((?:\\\\.|[^\\\\()[\\]]|" + attributes.replace( 3, 8 ) + ")*)|.*)\\)|)", + + // Leading and non-escaped trailing whitespace, capturing some non-whitespace characters preceding the latter + rtrim = new RegExp( "^" + whitespace + "+|((?:^|[^\\\\])(?:\\\\.)*)" + whitespace + "+$", "g" ), + + rcomma = new RegExp( "^" + whitespace + "*," + whitespace + "*" ), + rcombinators = new RegExp( "^" + whitespace + "*([\\x20\\t\\r\\n\\f>+~])" + whitespace + "*" ), + rpseudo = new RegExp( pseudos ), + ridentifier = new RegExp( "^" + identifier + "$" ), + + matchExpr = { + "ID": new RegExp( "^#(" + characterEncoding + ")" ), + "CLASS": new RegExp( "^\\.(" + characterEncoding + ")" ), + "NAME": new RegExp( "^\\[name=['\"]?(" + characterEncoding + ")['\"]?\\]" ), + "TAG": new RegExp( "^(" + characterEncoding.replace( "w", "w*" ) + ")" ), + "ATTR": new RegExp( "^" + attributes ), + "PSEUDO": new RegExp( "^" + pseudos ), + "CHILD": new RegExp( "^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\(" + whitespace + + "*(even|odd|(([+-]|)(\\d*)n|)" + whitespace + "*(?:([+-]|)" + whitespace + + "*(\\d+)|))" + whitespace + "*\\)|)", "i" ), + // For use in libraries implementing .is() + // We use this for POS matching in `select` + "needsContext": new RegExp( "^" + whitespace + "*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\(" + + whitespace + "*((?:-\\d)?\\d*)" + whitespace + "*\\)|)(?=[^-]|$)", "i" ) + }, + + rsibling = /[\x20\t\r\n\f]*[+~]/, + + rnative = /^[^{]+\{\s*\[native code/, + + // Easily-parseable/retrievable ID or TAG or CLASS selectors + rquickExpr = /^(?:#([\w-]+)|(\w+)|\.([\w-]+))$/, + + rinputs = /^(?:input|select|textarea|button)$/i, + rheader = /^h\d$/i, + + rescape = /'|\\/g, + rattributeQuotes = /\=[\x20\t\r\n\f]*([^'"\]]*)[\x20\t\r\n\f]*\]/g, + + // CSS escapes http://www.w3.org/TR/CSS21/syndata.html#escaped-characters + runescape = /\\([\da-fA-F]{1,6}[\x20\t\r\n\f]?|.)/g, + funescape = function( _, escaped ) { + var high = "0x" + escaped - 0x10000; + // NaN means non-codepoint + return high !== high ? + escaped : + // BMP codepoint + high < 0 ? + String.fromCharCode( high + 0x10000 ) : + // Supplemental Plane codepoint (surrogate pair) + String.fromCharCode( high >> 10 | 0xD800, high & 0x3FF | 0xDC00 ); + }; + +// Use a stripped-down slice if we can't use a native one +try { + slice.call( preferredDoc.documentElement.childNodes, 0 )[0].nodeType; +} catch ( e ) { + slice = function( i ) { + var elem, + results = []; + while ( (elem = this[i++]) ) { + results.push( elem ); + } + return results; + }; +} + +/** + * For feature detection + * @param {Function} fn The function to test for native support + */ +function isNative( fn ) { + return rnative.test( fn + "" ); +} + +/** + * Create key-value caches of limited size + * @returns {Function(string, Object)} Returns the Object data after storing it on itself with + * property name the (space-suffixed) string and (if the cache is larger than Expr.cacheLength) + * deleting the oldest entry + */ +function createCache() { + var cache, + keys = []; + + return (cache = function( key, value ) { + // Use (key + " ") to avoid collision with native prototype properties (see Issue #157) + if ( keys.push( key += " " ) > Expr.cacheLength ) { + // Only keep the most recent entries + delete cache[ keys.shift() ]; + } + return (cache[ key ] = value); + }); +} + +/** + * Mark a function for special use by Sizzle + * @param {Function} fn The function to mark + */ +function markFunction( fn ) { + fn[ expando ] = true; + return fn; +} + +/** + * Support testing using an element + * @param {Function} fn Passed the created div and expects a boolean result + */ +function assert( fn ) { + var div = document.createElement("div"); + + try { + return fn( div ); + } catch (e) { + return false; + } finally { + // release memory in IE + div = null; + } +} + +function Sizzle( selector, context, results, seed ) { + var match, elem, m, nodeType, + // QSA vars + i, groups, old, nid, newContext, newSelector; + + if ( ( context ? context.ownerDocument || context : preferredDoc ) !== document ) { + setDocument( context ); + } + + context = context || document; + results = results || []; + + if ( !selector || typeof selector !== "string" ) { + return results; + } + + if ( (nodeType = context.nodeType) !== 1 && nodeType !== 9 ) { + return []; + } + + if ( !documentIsXML && !seed ) { + + // Shortcuts + if ( (match = rquickExpr.exec( selector )) ) { + // Speed-up: Sizzle("#ID") + if ( (m = match[1]) ) { + if ( nodeType === 9 ) { + elem = context.getElementById( m ); + // Check parentNode to catch when Blackberry 4.6 returns + // nodes that are no longer in the document #6963 + if ( elem && elem.parentNode ) { + // Handle the case where IE, Opera, and Webkit return items + // by name instead of ID + if ( elem.id === m ) { + results.push( elem ); + return results; + } + } else { + return results; + } + } else { + // Context is not a document + if ( context.ownerDocument && (elem = context.ownerDocument.getElementById( m )) && + contains( context, elem ) && elem.id === m ) { + results.push( elem ); + return results; + } + } + + // Speed-up: Sizzle("TAG") + } else if ( match[2] ) { + push.apply( results, slice.call(context.getElementsByTagName( selector ), 0) ); + return results; + + // Speed-up: Sizzle(".CLASS") + } else if ( (m = match[3]) && support.getByClassName && context.getElementsByClassName ) { + push.apply( results, slice.call(context.getElementsByClassName( m ), 0) ); + return results; + } + } + + // QSA path + if ( support.qsa && !rbuggyQSA.test(selector) ) { + old = true; + nid = expando; + newContext = context; + newSelector = nodeType === 9 && selector; + + // qSA works strangely on Element-rooted queries + // We can work around this by specifying an extra ID on the root + // and working up from there (Thanks to Andrew Dupont for the technique) + // IE 8 doesn't work on object elements + if ( nodeType === 1 && context.nodeName.toLowerCase() !== "object" ) { + groups = tokenize( selector ); + + if ( (old = context.getAttribute("id")) ) { + nid = old.replace( rescape, "\\$&" ); + } else { + context.setAttribute( "id", nid ); + } + nid = "[id='" + nid + "'] "; + + i = groups.length; + while ( i-- ) { + groups[i] = nid + toSelector( groups[i] ); + } + newContext = rsibling.test( selector ) && context.parentNode || context; + newSelector = groups.join(","); + } + + if ( newSelector ) { + try { + push.apply( results, slice.call( newContext.querySelectorAll( + newSelector + ), 0 ) ); + return results; + } catch(qsaError) { + } finally { + if ( !old ) { + context.removeAttribute("id"); + } + } + } + } + } + + // All others + return select( selector.replace( rtrim, "$1" ), context, results, seed ); +} + +/** + * Detect xml + * @param {Element|Object} elem An element or a document + */ +isXML = Sizzle.isXML = function( elem ) { + // documentElement is verified for cases where it doesn't yet exist + // (such as loading iframes in IE - #4833) + var documentElement = elem && (elem.ownerDocument || elem).documentElement; + return documentElement ? documentElement.nodeName !== "HTML" : false; +}; + +/** + * Sets document-related variables once based on the current document + * @param {Element|Object} [doc] An element or document object to use to set the document + * @returns {Object} Returns the current document + */ +setDocument = Sizzle.setDocument = function( node ) { + var doc = node ? node.ownerDocument || node : preferredDoc; + + // If no document and documentElement is available, return + if ( doc === document || doc.nodeType !== 9 || !doc.documentElement ) { + return document; + } + + // Set our document + document = doc; + docElem = doc.documentElement; + + // Support tests + documentIsXML = isXML( doc ); + + // Check if getElementsByTagName("*") returns only elements + support.tagNameNoComments = assert(function( div ) { + div.appendChild( doc.createComment("") ); + return !div.getElementsByTagName("*").length; + }); + + // Check if attributes should be retrieved by attribute nodes + support.attributes = assert(function( div ) { + div.innerHTML = ""; + var type = typeof div.lastChild.getAttribute("multiple"); + // IE8 returns a string for some attributes even when not present + return type !== "boolean" && type !== "string"; + }); + + // Check if getElementsByClassName can be trusted + support.getByClassName = assert(function( div ) { + // Opera can't find a second classname (in 9.6) + div.innerHTML = ""; + if ( !div.getElementsByClassName || !div.getElementsByClassName("e").length ) { + return false; + } + + // Safari 3.2 caches class attributes and doesn't catch changes + div.lastChild.className = "e"; + return div.getElementsByClassName("e").length === 2; + }); + + // Check if getElementById returns elements by name + // Check if getElementsByName privileges form controls or returns elements by ID + support.getByName = assert(function( div ) { + // Inject content + div.id = expando + 0; + div.innerHTML = "
    "; + docElem.insertBefore( div, docElem.firstChild ); + + // Test + var pass = doc.getElementsByName && + // buggy browsers will return fewer than the correct 2 + doc.getElementsByName( expando ).length === 2 + + // buggy browsers will return more than the correct 0 + doc.getElementsByName( expando + 0 ).length; + support.getIdNotName = !doc.getElementById( expando ); + + // Cleanup + docElem.removeChild( div ); + + return pass; + }); + + // IE6/7 return modified attributes + Expr.attrHandle = assert(function( div ) { + div.innerHTML = ""; + return div.firstChild && typeof div.firstChild.getAttribute !== strundefined && + div.firstChild.getAttribute("href") === "#"; + }) ? + {} : + { + "href": function( elem ) { + return elem.getAttribute( "href", 2 ); + }, + "type": function( elem ) { + return elem.getAttribute("type"); + } + }; + + // ID find and filter + if ( support.getIdNotName ) { + Expr.find["ID"] = function( id, context ) { + if ( typeof context.getElementById !== strundefined && !documentIsXML ) { + var m = context.getElementById( id ); + // Check parentNode to catch when Blackberry 4.6 returns + // nodes that are no longer in the document #6963 + return m && m.parentNode ? [m] : []; + } + }; + Expr.filter["ID"] = function( id ) { + var attrId = id.replace( runescape, funescape ); + return function( elem ) { + return elem.getAttribute("id") === attrId; + }; + }; + } else { + Expr.find["ID"] = function( id, context ) { + if ( typeof context.getElementById !== strundefined && !documentIsXML ) { + var m = context.getElementById( id ); + + return m ? + m.id === id || typeof m.getAttributeNode !== strundefined && m.getAttributeNode("id").value === id ? + [m] : + undefined : + []; + } + }; + Expr.filter["ID"] = function( id ) { + var attrId = id.replace( runescape, funescape ); + return function( elem ) { + var node = typeof elem.getAttributeNode !== strundefined && elem.getAttributeNode("id"); + return node && node.value === attrId; + }; + }; + } + + // Tag + Expr.find["TAG"] = support.tagNameNoComments ? + function( tag, context ) { + if ( typeof context.getElementsByTagName !== strundefined ) { + return context.getElementsByTagName( tag ); + } + } : + function( tag, context ) { + var elem, + tmp = [], + i = 0, + results = context.getElementsByTagName( tag ); + + // Filter out possible comments + if ( tag === "*" ) { + while ( (elem = results[i++]) ) { + if ( elem.nodeType === 1 ) { + tmp.push( elem ); + } + } + + return tmp; + } + return results; + }; + + // Name + Expr.find["NAME"] = support.getByName && function( tag, context ) { + if ( typeof context.getElementsByName !== strundefined ) { + return context.getElementsByName( name ); + } + }; + + // Class + Expr.find["CLASS"] = support.getByClassName && function( className, context ) { + if ( typeof context.getElementsByClassName !== strundefined && !documentIsXML ) { + return context.getElementsByClassName( className ); + } + }; + + // QSA and matchesSelector support + + // matchesSelector(:active) reports false when true (IE9/Opera 11.5) + rbuggyMatches = []; + + // qSa(:focus) reports false when true (Chrome 21), + // no need to also add to buggyMatches since matches checks buggyQSA + // A support test would require too much code (would include document ready) + rbuggyQSA = [ ":focus" ]; + + if ( (support.qsa = isNative(doc.querySelectorAll)) ) { + // Build QSA regex + // Regex strategy adopted from Diego Perini + assert(function( div ) { + // Select is set to empty string on purpose + // This is to test IE's treatment of not explictly + // setting a boolean content attribute, + // since its presence should be enough + // http://bugs.jquery.com/ticket/12359 + div.innerHTML = ""; + + // IE8 - Some boolean attributes are not treated correctly + if ( !div.querySelectorAll("[selected]").length ) { + rbuggyQSA.push( "\\[" + whitespace + "*(?:checked|disabled|ismap|multiple|readonly|selected|value)" ); + } + + // Webkit/Opera - :checked should return selected option elements + // http://www.w3.org/TR/2011/REC-css3-selectors-20110929/#checked + // IE8 throws error here and will not see later tests + if ( !div.querySelectorAll(":checked").length ) { + rbuggyQSA.push(":checked"); + } + }); + + assert(function( div ) { + + // Opera 10-12/IE8 - ^= $= *= and empty values + // Should not select anything + div.innerHTML = ""; + if ( div.querySelectorAll("[i^='']").length ) { + rbuggyQSA.push( "[*^$]=" + whitespace + "*(?:\"\"|'')" ); + } + + // FF 3.5 - :enabled/:disabled and hidden elements (hidden elements are still enabled) + // IE8 throws error here and will not see later tests + if ( !div.querySelectorAll(":enabled").length ) { + rbuggyQSA.push( ":enabled", ":disabled" ); + } + + // Opera 10-11 does not throw on post-comma invalid pseudos + div.querySelectorAll("*,:x"); + rbuggyQSA.push(",.*:"); + }); + } + + if ( (support.matchesSelector = isNative( (matches = docElem.matchesSelector || + docElem.mozMatchesSelector || + docElem.webkitMatchesSelector || + docElem.oMatchesSelector || + docElem.msMatchesSelector) )) ) { + + assert(function( div ) { + // Check to see if it's possible to do matchesSelector + // on a disconnected node (IE 9) + support.disconnectedMatch = matches.call( div, "div" ); + + // This should fail with an exception + // Gecko does not error, returns false instead + matches.call( div, "[s!='']:x" ); + rbuggyMatches.push( "!=", pseudos ); + }); + } + + rbuggyQSA = new RegExp( rbuggyQSA.join("|") ); + rbuggyMatches = new RegExp( rbuggyMatches.join("|") ); + + // Element contains another + // Purposefully does not implement inclusive descendent + // As in, an element does not contain itself + contains = isNative(docElem.contains) || docElem.compareDocumentPosition ? + function( a, b ) { + var adown = a.nodeType === 9 ? a.documentElement : a, + bup = b && b.parentNode; + return a === bup || !!( bup && bup.nodeType === 1 && ( + adown.contains ? + adown.contains( bup ) : + a.compareDocumentPosition && a.compareDocumentPosition( bup ) & 16 + )); + } : + function( a, b ) { + if ( b ) { + while ( (b = b.parentNode) ) { + if ( b === a ) { + return true; + } + } + } + return false; + }; + + // Document order sorting + sortOrder = docElem.compareDocumentPosition ? + function( a, b ) { + var compare; + + if ( a === b ) { + hasDuplicate = true; + return 0; + } + + if ( (compare = b.compareDocumentPosition && a.compareDocumentPosition && a.compareDocumentPosition( b )) ) { + if ( compare & 1 || a.parentNode && a.parentNode.nodeType === 11 ) { + if ( a === doc || contains( preferredDoc, a ) ) { + return -1; + } + if ( b === doc || contains( preferredDoc, b ) ) { + return 1; + } + return 0; + } + return compare & 4 ? -1 : 1; + } + + return a.compareDocumentPosition ? -1 : 1; + } : + function( a, b ) { + var cur, + i = 0, + aup = a.parentNode, + bup = b.parentNode, + ap = [ a ], + bp = [ b ]; + + // Exit early if the nodes are identical + if ( a === b ) { + hasDuplicate = true; + return 0; + + // Parentless nodes are either documents or disconnected + } else if ( !aup || !bup ) { + return a === doc ? -1 : + b === doc ? 1 : + aup ? -1 : + bup ? 1 : + 0; + + // If the nodes are siblings, we can do a quick check + } else if ( aup === bup ) { + return siblingCheck( a, b ); + } + + // Otherwise we need full lists of their ancestors for comparison + cur = a; + while ( (cur = cur.parentNode) ) { + ap.unshift( cur ); + } + cur = b; + while ( (cur = cur.parentNode) ) { + bp.unshift( cur ); + } + + // Walk down the tree looking for a discrepancy + while ( ap[i] === bp[i] ) { + i++; + } + + return i ? + // Do a sibling check if the nodes have a common ancestor + siblingCheck( ap[i], bp[i] ) : + + // Otherwise nodes in our document sort first + ap[i] === preferredDoc ? -1 : + bp[i] === preferredDoc ? 1 : + 0; + }; + + // Always assume the presence of duplicates if sort doesn't + // pass them to our comparison function (as in Google Chrome). + hasDuplicate = false; + [0, 0].sort( sortOrder ); + support.detectDuplicates = hasDuplicate; + + return document; +}; + +Sizzle.matches = function( expr, elements ) { + return Sizzle( expr, null, null, elements ); +}; + +Sizzle.matchesSelector = function( elem, expr ) { + // Set document vars if needed + if ( ( elem.ownerDocument || elem ) !== document ) { + setDocument( elem ); + } + + // Make sure that attribute selectors are quoted + expr = expr.replace( rattributeQuotes, "='$1']" ); + + // rbuggyQSA always contains :focus, so no need for an existence check + if ( support.matchesSelector && !documentIsXML && (!rbuggyMatches || !rbuggyMatches.test(expr)) && !rbuggyQSA.test(expr) ) { + try { + var ret = matches.call( elem, expr ); + + // IE 9's matchesSelector returns false on disconnected nodes + if ( ret || support.disconnectedMatch || + // As well, disconnected nodes are said to be in a document + // fragment in IE 9 + elem.document && elem.document.nodeType !== 11 ) { + return ret; + } + } catch(e) {} + } + + return Sizzle( expr, document, null, [elem] ).length > 0; +}; + +Sizzle.contains = function( context, elem ) { + // Set document vars if needed + if ( ( context.ownerDocument || context ) !== document ) { + setDocument( context ); + } + return contains( context, elem ); +}; + +Sizzle.attr = function( elem, name ) { + var val; + + // Set document vars if needed + if ( ( elem.ownerDocument || elem ) !== document ) { + setDocument( elem ); + } + + if ( !documentIsXML ) { + name = name.toLowerCase(); + } + if ( (val = Expr.attrHandle[ name ]) ) { + return val( elem ); + } + if ( documentIsXML || support.attributes ) { + return elem.getAttribute( name ); + } + return ( (val = elem.getAttributeNode( name )) || elem.getAttribute( name ) ) && elem[ name ] === true ? + name : + val && val.specified ? val.value : null; +}; + +Sizzle.error = function( msg ) { + throw new Error( "Syntax error, unrecognized expression: " + msg ); +}; + +// Document sorting and removing duplicates +Sizzle.uniqueSort = function( results ) { + var elem, + duplicates = [], + i = 1, + j = 0; + + // Unless we *know* we can detect duplicates, assume their presence + hasDuplicate = !support.detectDuplicates; + results.sort( sortOrder ); + + if ( hasDuplicate ) { + for ( ; (elem = results[i]); i++ ) { + if ( elem === results[ i - 1 ] ) { + j = duplicates.push( i ); + } + } + while ( j-- ) { + results.splice( duplicates[ j ], 1 ); + } + } + + return results; +}; + +function siblingCheck( a, b ) { + var cur = b && a, + diff = cur && ( ~b.sourceIndex || MAX_NEGATIVE ) - ( ~a.sourceIndex || MAX_NEGATIVE ); + + // Use IE sourceIndex if available on both nodes + if ( diff ) { + return diff; + } + + // Check if b follows a + if ( cur ) { + while ( (cur = cur.nextSibling) ) { + if ( cur === b ) { + return -1; + } + } + } + + return a ? 1 : -1; +} + +// Returns a function to use in pseudos for input types +function createInputPseudo( type ) { + return function( elem ) { + var name = elem.nodeName.toLowerCase(); + return name === "input" && elem.type === type; + }; +} + +// Returns a function to use in pseudos for buttons +function createButtonPseudo( type ) { + return function( elem ) { + var name = elem.nodeName.toLowerCase(); + return (name === "input" || name === "button") && elem.type === type; + }; +} + +// Returns a function to use in pseudos for positionals +function createPositionalPseudo( fn ) { + return markFunction(function( argument ) { + argument = +argument; + return markFunction(function( seed, matches ) { + var j, + matchIndexes = fn( [], seed.length, argument ), + i = matchIndexes.length; + + // Match elements found at the specified indexes + while ( i-- ) { + if ( seed[ (j = matchIndexes[i]) ] ) { + seed[j] = !(matches[j] = seed[j]); + } + } + }); + }); +} + +/** + * Utility function for retrieving the text value of an array of DOM nodes + * @param {Array|Element} elem + */ +getText = Sizzle.getText = function( elem ) { + var node, + ret = "", + i = 0, + nodeType = elem.nodeType; + + if ( !nodeType ) { + // If no nodeType, this is expected to be an array + for ( ; (node = elem[i]); i++ ) { + // Do not traverse comment nodes + ret += getText( node ); + } + } else if ( nodeType === 1 || nodeType === 9 || nodeType === 11 ) { + // Use textContent for elements + // innerText usage removed for consistency of new lines (see #11153) + if ( typeof elem.textContent === "string" ) { + return elem.textContent; + } else { + // Traverse its children + for ( elem = elem.firstChild; elem; elem = elem.nextSibling ) { + ret += getText( elem ); + } + } + } else if ( nodeType === 3 || nodeType === 4 ) { + return elem.nodeValue; + } + // Do not include comment or processing instruction nodes + + return ret; +}; + +Expr = Sizzle.selectors = { + + // Can be adjusted by the user + cacheLength: 50, + + createPseudo: markFunction, + + match: matchExpr, + + find: {}, + + relative: { + ">": { dir: "parentNode", first: true }, + " ": { dir: "parentNode" }, + "+": { dir: "previousSibling", first: true }, + "~": { dir: "previousSibling" } + }, + + preFilter: { + "ATTR": function( match ) { + match[1] = match[1].replace( runescape, funescape ); + + // Move the given value to match[3] whether quoted or unquoted + match[3] = ( match[4] || match[5] || "" ).replace( runescape, funescape ); + + if ( match[2] === "~=" ) { + match[3] = " " + match[3] + " "; + } + + return match.slice( 0, 4 ); + }, + + "CHILD": function( match ) { + /* matches from matchExpr["CHILD"] + 1 type (only|nth|...) + 2 what (child|of-type) + 3 argument (even|odd|\d*|\d*n([+-]\d+)?|...) + 4 xn-component of xn+y argument ([+-]?\d*n|) + 5 sign of xn-component + 6 x of xn-component + 7 sign of y-component + 8 y of y-component + */ + match[1] = match[1].toLowerCase(); + + if ( match[1].slice( 0, 3 ) === "nth" ) { + // nth-* requires argument + if ( !match[3] ) { + Sizzle.error( match[0] ); + } + + // numeric x and y parameters for Expr.filter.CHILD + // remember that false/true cast respectively to 0/1 + match[4] = +( match[4] ? match[5] + (match[6] || 1) : 2 * ( match[3] === "even" || match[3] === "odd" ) ); + match[5] = +( ( match[7] + match[8] ) || match[3] === "odd" ); + + // other types prohibit arguments + } else if ( match[3] ) { + Sizzle.error( match[0] ); + } + + return match; + }, + + "PSEUDO": function( match ) { + var excess, + unquoted = !match[5] && match[2]; + + if ( matchExpr["CHILD"].test( match[0] ) ) { + return null; + } + + // Accept quoted arguments as-is + if ( match[4] ) { + match[2] = match[4]; + + // Strip excess characters from unquoted arguments + } else if ( unquoted && rpseudo.test( unquoted ) && + // Get excess from tokenize (recursively) + (excess = tokenize( unquoted, true )) && + // advance to the next closing parenthesis + (excess = unquoted.indexOf( ")", unquoted.length - excess ) - unquoted.length) ) { + + // excess is a negative index + match[0] = match[0].slice( 0, excess ); + match[2] = unquoted.slice( 0, excess ); + } + + // Return only captures needed by the pseudo filter method (type and argument) + return match.slice( 0, 3 ); + } + }, + + filter: { + + "TAG": function( nodeName ) { + if ( nodeName === "*" ) { + return function() { return true; }; + } + + nodeName = nodeName.replace( runescape, funescape ).toLowerCase(); + return function( elem ) { + return elem.nodeName && elem.nodeName.toLowerCase() === nodeName; + }; + }, + + "CLASS": function( className ) { + var pattern = classCache[ className + " " ]; + + return pattern || + (pattern = new RegExp( "(^|" + whitespace + ")" + className + "(" + whitespace + "|$)" )) && + classCache( className, function( elem ) { + return pattern.test( elem.className || (typeof elem.getAttribute !== strundefined && elem.getAttribute("class")) || "" ); + }); + }, + + "ATTR": function( name, operator, check ) { + return function( elem ) { + var result = Sizzle.attr( elem, name ); + + if ( result == null ) { + return operator === "!="; + } + if ( !operator ) { + return true; + } + + result += ""; + + return operator === "=" ? result === check : + operator === "!=" ? result !== check : + operator === "^=" ? check && result.indexOf( check ) === 0 : + operator === "*=" ? check && result.indexOf( check ) > -1 : + operator === "$=" ? check && result.slice( -check.length ) === check : + operator === "~=" ? ( " " + result + " " ).indexOf( check ) > -1 : + operator === "|=" ? result === check || result.slice( 0, check.length + 1 ) === check + "-" : + false; + }; + }, + + "CHILD": function( type, what, argument, first, last ) { + var simple = type.slice( 0, 3 ) !== "nth", + forward = type.slice( -4 ) !== "last", + ofType = what === "of-type"; + + return first === 1 && last === 0 ? + + // Shortcut for :nth-*(n) + function( elem ) { + return !!elem.parentNode; + } : + + function( elem, context, xml ) { + var cache, outerCache, node, diff, nodeIndex, start, + dir = simple !== forward ? "nextSibling" : "previousSibling", + parent = elem.parentNode, + name = ofType && elem.nodeName.toLowerCase(), + useCache = !xml && !ofType; + + if ( parent ) { + + // :(first|last|only)-(child|of-type) + if ( simple ) { + while ( dir ) { + node = elem; + while ( (node = node[ dir ]) ) { + if ( ofType ? node.nodeName.toLowerCase() === name : node.nodeType === 1 ) { + return false; + } + } + // Reverse direction for :only-* (if we haven't yet done so) + start = dir = type === "only" && !start && "nextSibling"; + } + return true; + } + + start = [ forward ? parent.firstChild : parent.lastChild ]; + + // non-xml :nth-child(...) stores cache data on `parent` + if ( forward && useCache ) { + // Seek `elem` from a previously-cached index + outerCache = parent[ expando ] || (parent[ expando ] = {}); + cache = outerCache[ type ] || []; + nodeIndex = cache[0] === dirruns && cache[1]; + diff = cache[0] === dirruns && cache[2]; + node = nodeIndex && parent.childNodes[ nodeIndex ]; + + while ( (node = ++nodeIndex && node && node[ dir ] || + + // Fallback to seeking `elem` from the start + (diff = nodeIndex = 0) || start.pop()) ) { + + // When found, cache indexes on `parent` and break + if ( node.nodeType === 1 && ++diff && node === elem ) { + outerCache[ type ] = [ dirruns, nodeIndex, diff ]; + break; + } + } + + // Use previously-cached element index if available + } else if ( useCache && (cache = (elem[ expando ] || (elem[ expando ] = {}))[ type ]) && cache[0] === dirruns ) { + diff = cache[1]; + + // xml :nth-child(...) or :nth-last-child(...) or :nth(-last)?-of-type(...) + } else { + // Use the same loop as above to seek `elem` from the start + while ( (node = ++nodeIndex && node && node[ dir ] || + (diff = nodeIndex = 0) || start.pop()) ) { + + if ( ( ofType ? node.nodeName.toLowerCase() === name : node.nodeType === 1 ) && ++diff ) { + // Cache the index of each encountered element + if ( useCache ) { + (node[ expando ] || (node[ expando ] = {}))[ type ] = [ dirruns, diff ]; + } + + if ( node === elem ) { + break; + } + } + } + } + + // Incorporate the offset, then check against cycle size + diff -= last; + return diff === first || ( diff % first === 0 && diff / first >= 0 ); + } + }; + }, + + "PSEUDO": function( pseudo, argument ) { + // pseudo-class names are case-insensitive + // http://www.w3.org/TR/selectors/#pseudo-classes + // Prioritize by case sensitivity in case custom pseudos are added with uppercase letters + // Remember that setFilters inherits from pseudos + var args, + fn = Expr.pseudos[ pseudo ] || Expr.setFilters[ pseudo.toLowerCase() ] || + Sizzle.error( "unsupported pseudo: " + pseudo ); + + // The user may use createPseudo to indicate that + // arguments are needed to create the filter function + // just as Sizzle does + if ( fn[ expando ] ) { + return fn( argument ); + } + + // But maintain support for old signatures + if ( fn.length > 1 ) { + args = [ pseudo, pseudo, "", argument ]; + return Expr.setFilters.hasOwnProperty( pseudo.toLowerCase() ) ? + markFunction(function( seed, matches ) { + var idx, + matched = fn( seed, argument ), + i = matched.length; + while ( i-- ) { + idx = indexOf.call( seed, matched[i] ); + seed[ idx ] = !( matches[ idx ] = matched[i] ); + } + }) : + function( elem ) { + return fn( elem, 0, args ); + }; + } + + return fn; + } + }, + + pseudos: { + // Potentially complex pseudos + "not": markFunction(function( selector ) { + // Trim the selector passed to compile + // to avoid treating leading and trailing + // spaces as combinators + var input = [], + results = [], + matcher = compile( selector.replace( rtrim, "$1" ) ); + + return matcher[ expando ] ? + markFunction(function( seed, matches, context, xml ) { + var elem, + unmatched = matcher( seed, null, xml, [] ), + i = seed.length; + + // Match elements unmatched by `matcher` + while ( i-- ) { + if ( (elem = unmatched[i]) ) { + seed[i] = !(matches[i] = elem); + } + } + }) : + function( elem, context, xml ) { + input[0] = elem; + matcher( input, null, xml, results ); + return !results.pop(); + }; + }), + + "has": markFunction(function( selector ) { + return function( elem ) { + return Sizzle( selector, elem ).length > 0; + }; + }), + + "contains": markFunction(function( text ) { + return function( elem ) { + return ( elem.textContent || elem.innerText || getText( elem ) ).indexOf( text ) > -1; + }; + }), + + // "Whether an element is represented by a :lang() selector + // is based solely on the element's language value + // being equal to the identifier C, + // or beginning with the identifier C immediately followed by "-". + // The matching of C against the element's language value is performed case-insensitively. + // The identifier C does not have to be a valid language name." + // http://www.w3.org/TR/selectors/#lang-pseudo + "lang": markFunction( function( lang ) { + // lang value must be a valid identifider + if ( !ridentifier.test(lang || "") ) { + Sizzle.error( "unsupported lang: " + lang ); + } + lang = lang.replace( runescape, funescape ).toLowerCase(); + return function( elem ) { + var elemLang; + do { + if ( (elemLang = documentIsXML ? + elem.getAttribute("xml:lang") || elem.getAttribute("lang") : + elem.lang) ) { + + elemLang = elemLang.toLowerCase(); + return elemLang === lang || elemLang.indexOf( lang + "-" ) === 0; + } + } while ( (elem = elem.parentNode) && elem.nodeType === 1 ); + return false; + }; + }), + + // Miscellaneous + "target": function( elem ) { + var hash = window.location && window.location.hash; + return hash && hash.slice( 1 ) === elem.id; + }, + + "root": function( elem ) { + return elem === docElem; + }, + + "focus": function( elem ) { + return elem === document.activeElement && (!document.hasFocus || document.hasFocus()) && !!(elem.type || elem.href || ~elem.tabIndex); + }, + + // Boolean properties + "enabled": function( elem ) { + return elem.disabled === false; + }, + + "disabled": function( elem ) { + return elem.disabled === true; + }, + + "checked": function( elem ) { + // In CSS3, :checked should return both checked and selected elements + // http://www.w3.org/TR/2011/REC-css3-selectors-20110929/#checked + var nodeName = elem.nodeName.toLowerCase(); + return (nodeName === "input" && !!elem.checked) || (nodeName === "option" && !!elem.selected); + }, + + "selected": function( elem ) { + // Accessing this property makes selected-by-default + // options in Safari work properly + if ( elem.parentNode ) { + elem.parentNode.selectedIndex; + } + + return elem.selected === true; + }, + + // Contents + "empty": function( elem ) { + // http://www.w3.org/TR/selectors/#empty-pseudo + // :empty is only affected by element nodes and content nodes(including text(3), cdata(4)), + // not comment, processing instructions, or others + // Thanks to Diego Perini for the nodeName shortcut + // Greater than "@" means alpha characters (specifically not starting with "#" or "?") + for ( elem = elem.firstChild; elem; elem = elem.nextSibling ) { + if ( elem.nodeName > "@" || elem.nodeType === 3 || elem.nodeType === 4 ) { + return false; + } + } + return true; + }, + + "parent": function( elem ) { + return !Expr.pseudos["empty"]( elem ); + }, + + // Element/input types + "header": function( elem ) { + return rheader.test( elem.nodeName ); + }, + + "input": function( elem ) { + return rinputs.test( elem.nodeName ); + }, + + "button": function( elem ) { + var name = elem.nodeName.toLowerCase(); + return name === "input" && elem.type === "button" || name === "button"; + }, + + "text": function( elem ) { + var attr; + // IE6 and 7 will map elem.type to 'text' for new HTML5 types (search, etc) + // use getAttribute instead to test this case + return elem.nodeName.toLowerCase() === "input" && + elem.type === "text" && + ( (attr = elem.getAttribute("type")) == null || attr.toLowerCase() === elem.type ); + }, + + // Position-in-collection + "first": createPositionalPseudo(function() { + return [ 0 ]; + }), + + "last": createPositionalPseudo(function( matchIndexes, length ) { + return [ length - 1 ]; + }), + + "eq": createPositionalPseudo(function( matchIndexes, length, argument ) { + return [ argument < 0 ? argument + length : argument ]; + }), + + "even": createPositionalPseudo(function( matchIndexes, length ) { + var i = 0; + for ( ; i < length; i += 2 ) { + matchIndexes.push( i ); + } + return matchIndexes; + }), + + "odd": createPositionalPseudo(function( matchIndexes, length ) { + var i = 1; + for ( ; i < length; i += 2 ) { + matchIndexes.push( i ); + } + return matchIndexes; + }), + + "lt": createPositionalPseudo(function( matchIndexes, length, argument ) { + var i = argument < 0 ? argument + length : argument; + for ( ; --i >= 0; ) { + matchIndexes.push( i ); + } + return matchIndexes; + }), + + "gt": createPositionalPseudo(function( matchIndexes, length, argument ) { + var i = argument < 0 ? argument + length : argument; + for ( ; ++i < length; ) { + matchIndexes.push( i ); + } + return matchIndexes; + }) + } +}; + +// Add button/input type pseudos +for ( i in { radio: true, checkbox: true, file: true, password: true, image: true } ) { + Expr.pseudos[ i ] = createInputPseudo( i ); +} +for ( i in { submit: true, reset: true } ) { + Expr.pseudos[ i ] = createButtonPseudo( i ); +} + +function tokenize( selector, parseOnly ) { + var matched, match, tokens, type, + soFar, groups, preFilters, + cached = tokenCache[ selector + " " ]; + + if ( cached ) { + return parseOnly ? 0 : cached.slice( 0 ); + } + + soFar = selector; + groups = []; + preFilters = Expr.preFilter; + + while ( soFar ) { + + // Comma and first run + if ( !matched || (match = rcomma.exec( soFar )) ) { + if ( match ) { + // Don't consume trailing commas as valid + soFar = soFar.slice( match[0].length ) || soFar; + } + groups.push( tokens = [] ); + } + + matched = false; + + // Combinators + if ( (match = rcombinators.exec( soFar )) ) { + matched = match.shift(); + tokens.push( { + value: matched, + // Cast descendant combinators to space + type: match[0].replace( rtrim, " " ) + } ); + soFar = soFar.slice( matched.length ); + } + + // Filters + for ( type in Expr.filter ) { + if ( (match = matchExpr[ type ].exec( soFar )) && (!preFilters[ type ] || + (match = preFilters[ type ]( match ))) ) { + matched = match.shift(); + tokens.push( { + value: matched, + type: type, + matches: match + } ); + soFar = soFar.slice( matched.length ); + } + } + + if ( !matched ) { + break; + } + } + + // Return the length of the invalid excess + // if we're just parsing + // Otherwise, throw an error or return tokens + return parseOnly ? + soFar.length : + soFar ? + Sizzle.error( selector ) : + // Cache the tokens + tokenCache( selector, groups ).slice( 0 ); +} + +function toSelector( tokens ) { + var i = 0, + len = tokens.length, + selector = ""; + for ( ; i < len; i++ ) { + selector += tokens[i].value; + } + return selector; +} + +function addCombinator( matcher, combinator, base ) { + var dir = combinator.dir, + checkNonElements = base && dir === "parentNode", + doneName = done++; + + return combinator.first ? + // Check against closest ancestor/preceding element + function( elem, context, xml ) { + while ( (elem = elem[ dir ]) ) { + if ( elem.nodeType === 1 || checkNonElements ) { + return matcher( elem, context, xml ); + } + } + } : + + // Check against all ancestor/preceding elements + function( elem, context, xml ) { + var data, cache, outerCache, + dirkey = dirruns + " " + doneName; + + // We can't set arbitrary data on XML nodes, so they don't benefit from dir caching + if ( xml ) { + while ( (elem = elem[ dir ]) ) { + if ( elem.nodeType === 1 || checkNonElements ) { + if ( matcher( elem, context, xml ) ) { + return true; + } + } + } + } else { + while ( (elem = elem[ dir ]) ) { + if ( elem.nodeType === 1 || checkNonElements ) { + outerCache = elem[ expando ] || (elem[ expando ] = {}); + if ( (cache = outerCache[ dir ]) && cache[0] === dirkey ) { + if ( (data = cache[1]) === true || data === cachedruns ) { + return data === true; + } + } else { + cache = outerCache[ dir ] = [ dirkey ]; + cache[1] = matcher( elem, context, xml ) || cachedruns; + if ( cache[1] === true ) { + return true; + } + } + } + } + } + }; +} + +function elementMatcher( matchers ) { + return matchers.length > 1 ? + function( elem, context, xml ) { + var i = matchers.length; + while ( i-- ) { + if ( !matchers[i]( elem, context, xml ) ) { + return false; + } + } + return true; + } : + matchers[0]; +} + +function condense( unmatched, map, filter, context, xml ) { + var elem, + newUnmatched = [], + i = 0, + len = unmatched.length, + mapped = map != null; + + for ( ; i < len; i++ ) { + if ( (elem = unmatched[i]) ) { + if ( !filter || filter( elem, context, xml ) ) { + newUnmatched.push( elem ); + if ( mapped ) { + map.push( i ); + } + } + } + } + + return newUnmatched; +} + +function setMatcher( preFilter, selector, matcher, postFilter, postFinder, postSelector ) { + if ( postFilter && !postFilter[ expando ] ) { + postFilter = setMatcher( postFilter ); + } + if ( postFinder && !postFinder[ expando ] ) { + postFinder = setMatcher( postFinder, postSelector ); + } + return markFunction(function( seed, results, context, xml ) { + var temp, i, elem, + preMap = [], + postMap = [], + preexisting = results.length, + + // Get initial elements from seed or context + elems = seed || multipleContexts( selector || "*", context.nodeType ? [ context ] : context, [] ), + + // Prefilter to get matcher input, preserving a map for seed-results synchronization + matcherIn = preFilter && ( seed || !selector ) ? + condense( elems, preMap, preFilter, context, xml ) : + elems, + + matcherOut = matcher ? + // If we have a postFinder, or filtered seed, or non-seed postFilter or preexisting results, + postFinder || ( seed ? preFilter : preexisting || postFilter ) ? + + // ...intermediate processing is necessary + [] : + + // ...otherwise use results directly + results : + matcherIn; + + // Find primary matches + if ( matcher ) { + matcher( matcherIn, matcherOut, context, xml ); + } + + // Apply postFilter + if ( postFilter ) { + temp = condense( matcherOut, postMap ); + postFilter( temp, [], context, xml ); + + // Un-match failing elements by moving them back to matcherIn + i = temp.length; + while ( i-- ) { + if ( (elem = temp[i]) ) { + matcherOut[ postMap[i] ] = !(matcherIn[ postMap[i] ] = elem); + } + } + } + + if ( seed ) { + if ( postFinder || preFilter ) { + if ( postFinder ) { + // Get the final matcherOut by condensing this intermediate into postFinder contexts + temp = []; + i = matcherOut.length; + while ( i-- ) { + if ( (elem = matcherOut[i]) ) { + // Restore matcherIn since elem is not yet a final match + temp.push( (matcherIn[i] = elem) ); + } + } + postFinder( null, (matcherOut = []), temp, xml ); + } + + // Move matched elements from seed to results to keep them synchronized + i = matcherOut.length; + while ( i-- ) { + if ( (elem = matcherOut[i]) && + (temp = postFinder ? indexOf.call( seed, elem ) : preMap[i]) > -1 ) { + + seed[temp] = !(results[temp] = elem); + } + } + } + + // Add elements to results, through postFinder if defined + } else { + matcherOut = condense( + matcherOut === results ? + matcherOut.splice( preexisting, matcherOut.length ) : + matcherOut + ); + if ( postFinder ) { + postFinder( null, results, matcherOut, xml ); + } else { + push.apply( results, matcherOut ); + } + } + }); +} + +function matcherFromTokens( tokens ) { + var checkContext, matcher, j, + len = tokens.length, + leadingRelative = Expr.relative[ tokens[0].type ], + implicitRelative = leadingRelative || Expr.relative[" "], + i = leadingRelative ? 1 : 0, + + // The foundational matcher ensures that elements are reachable from top-level context(s) + matchContext = addCombinator( function( elem ) { + return elem === checkContext; + }, implicitRelative, true ), + matchAnyContext = addCombinator( function( elem ) { + return indexOf.call( checkContext, elem ) > -1; + }, implicitRelative, true ), + matchers = [ function( elem, context, xml ) { + return ( !leadingRelative && ( xml || context !== outermostContext ) ) || ( + (checkContext = context).nodeType ? + matchContext( elem, context, xml ) : + matchAnyContext( elem, context, xml ) ); + } ]; + + for ( ; i < len; i++ ) { + if ( (matcher = Expr.relative[ tokens[i].type ]) ) { + matchers = [ addCombinator(elementMatcher( matchers ), matcher) ]; + } else { + matcher = Expr.filter[ tokens[i].type ].apply( null, tokens[i].matches ); + + // Return special upon seeing a positional matcher + if ( matcher[ expando ] ) { + // Find the next relative operator (if any) for proper handling + j = ++i; + for ( ; j < len; j++ ) { + if ( Expr.relative[ tokens[j].type ] ) { + break; + } + } + return setMatcher( + i > 1 && elementMatcher( matchers ), + i > 1 && toSelector( tokens.slice( 0, i - 1 ) ).replace( rtrim, "$1" ), + matcher, + i < j && matcherFromTokens( tokens.slice( i, j ) ), + j < len && matcherFromTokens( (tokens = tokens.slice( j )) ), + j < len && toSelector( tokens ) + ); + } + matchers.push( matcher ); + } + } + + return elementMatcher( matchers ); +} + +function matcherFromGroupMatchers( elementMatchers, setMatchers ) { + // A counter to specify which element is currently being matched + var matcherCachedRuns = 0, + bySet = setMatchers.length > 0, + byElement = elementMatchers.length > 0, + superMatcher = function( seed, context, xml, results, expandContext ) { + var elem, j, matcher, + setMatched = [], + matchedCount = 0, + i = "0", + unmatched = seed && [], + outermost = expandContext != null, + contextBackup = outermostContext, + // We must always have either seed elements or context + elems = seed || byElement && Expr.find["TAG"]( "*", expandContext && context.parentNode || context ), + // Use integer dirruns iff this is the outermost matcher + dirrunsUnique = (dirruns += contextBackup == null ? 1 : Math.random() || 0.1); + + if ( outermost ) { + outermostContext = context !== document && context; + cachedruns = matcherCachedRuns; + } + + // Add elements passing elementMatchers directly to results + // Keep `i` a string if there are no elements so `matchedCount` will be "00" below + for ( ; (elem = elems[i]) != null; i++ ) { + if ( byElement && elem ) { + j = 0; + while ( (matcher = elementMatchers[j++]) ) { + if ( matcher( elem, context, xml ) ) { + results.push( elem ); + break; + } + } + if ( outermost ) { + dirruns = dirrunsUnique; + cachedruns = ++matcherCachedRuns; + } + } + + // Track unmatched elements for set filters + if ( bySet ) { + // They will have gone through all possible matchers + if ( (elem = !matcher && elem) ) { + matchedCount--; + } + + // Lengthen the array for every element, matched or not + if ( seed ) { + unmatched.push( elem ); + } + } + } + + // Apply set filters to unmatched elements + matchedCount += i; + if ( bySet && i !== matchedCount ) { + j = 0; + while ( (matcher = setMatchers[j++]) ) { + matcher( unmatched, setMatched, context, xml ); + } + + if ( seed ) { + // Reintegrate element matches to eliminate the need for sorting + if ( matchedCount > 0 ) { + while ( i-- ) { + if ( !(unmatched[i] || setMatched[i]) ) { + setMatched[i] = pop.call( results ); + } + } + } + + // Discard index placeholder values to get only actual matches + setMatched = condense( setMatched ); + } + + // Add matches to results + push.apply( results, setMatched ); + + // Seedless set matches succeeding multiple successful matchers stipulate sorting + if ( outermost && !seed && setMatched.length > 0 && + ( matchedCount + setMatchers.length ) > 1 ) { + + Sizzle.uniqueSort( results ); + } + } + + // Override manipulation of globals by nested matchers + if ( outermost ) { + dirruns = dirrunsUnique; + outermostContext = contextBackup; + } + + return unmatched; + }; + + return bySet ? + markFunction( superMatcher ) : + superMatcher; +} + +compile = Sizzle.compile = function( selector, group /* Internal Use Only */ ) { + var i, + setMatchers = [], + elementMatchers = [], + cached = compilerCache[ selector + " " ]; + + if ( !cached ) { + // Generate a function of recursive functions that can be used to check each element + if ( !group ) { + group = tokenize( selector ); + } + i = group.length; + while ( i-- ) { + cached = matcherFromTokens( group[i] ); + if ( cached[ expando ] ) { + setMatchers.push( cached ); + } else { + elementMatchers.push( cached ); + } + } + + // Cache the compiled function + cached = compilerCache( selector, matcherFromGroupMatchers( elementMatchers, setMatchers ) ); + } + return cached; +}; + +function multipleContexts( selector, contexts, results ) { + var i = 0, + len = contexts.length; + for ( ; i < len; i++ ) { + Sizzle( selector, contexts[i], results ); + } + return results; +} + +function select( selector, context, results, seed ) { + var i, tokens, token, type, find, + match = tokenize( selector ); + + if ( !seed ) { + // Try to minimize operations if there is only one group + if ( match.length === 1 ) { + + // Take a shortcut and set the context if the root selector is an ID + tokens = match[0] = match[0].slice( 0 ); + if ( tokens.length > 2 && (token = tokens[0]).type === "ID" && + context.nodeType === 9 && !documentIsXML && + Expr.relative[ tokens[1].type ] ) { + + context = Expr.find["ID"]( token.matches[0].replace( runescape, funescape ), context )[0]; + if ( !context ) { + return results; + } + + selector = selector.slice( tokens.shift().value.length ); + } + + // Fetch a seed set for right-to-left matching + i = matchExpr["needsContext"].test( selector ) ? 0 : tokens.length; + while ( i-- ) { + token = tokens[i]; + + // Abort if we hit a combinator + if ( Expr.relative[ (type = token.type) ] ) { + break; + } + if ( (find = Expr.find[ type ]) ) { + // Search, expanding context for leading sibling combinators + if ( (seed = find( + token.matches[0].replace( runescape, funescape ), + rsibling.test( tokens[0].type ) && context.parentNode || context + )) ) { + + // If seed is empty or no tokens remain, we can return early + tokens.splice( i, 1 ); + selector = seed.length && toSelector( tokens ); + if ( !selector ) { + push.apply( results, slice.call( seed, 0 ) ); + return results; + } + + break; + } + } + } + } + } + + // Compile and execute a filtering function + // Provide `match` to avoid retokenization if we modified the selector above + compile( selector, match )( + seed, + context, + documentIsXML, + results, + rsibling.test( selector ) + ); + return results; +} + +// Deprecated +Expr.pseudos["nth"] = Expr.pseudos["eq"]; + +// Easy API for creating new setFilters +function setFilters() {} +Expr.filters = setFilters.prototype = Expr.pseudos; +Expr.setFilters = new setFilters(); + +// Initialize with the default document +setDocument(); + +// 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; + + +})( window ); +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; + }); +} +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 = /\s*$/g, + + // We have to close these tags to support XHTML (#13200) + wrapMap = { + option: [ 1, "" ], + legend: [ 1, "
    ", "
    " ], + area: [ 1, "", "" ], + param: [ 1, "", "" ], + thead: [ 1, "", "
    " ], + tr: [ 2, "", "
    " ], + col: [ 2, "", "
    " ], + td: [ 3, "", "
    " ], + + // 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
    ", "
    " ] + }, + 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>" ); + + 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>" ) + 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 from table fragments + if ( !jQuery.support.tbody ) { + + // String was a , *may* have spurious + elem = tag === "table" && !rtbody.test( elem ) ? + tmp.firstChild : + + // String was a bare or + wrap[1] === "
    " && !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 ); + } + } + } + } + } +}); +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("