зеркало из https://github.com/nextcloud/news.git
add basic files for js rewrite
This commit is contained in:
Родитель
adb9dfeb35
Коммит
04e421cf2f
|
@ -0,0 +1,4 @@
|
||||||
|
{
|
||||||
|
"directory": "vendor"
|
||||||
|
|
||||||
|
}
|
|
@ -0,0 +1,10 @@
|
||||||
|
{
|
||||||
|
"globals": {
|
||||||
|
"console": true,
|
||||||
|
"jQuery": true,
|
||||||
|
"$": true,
|
||||||
|
"angular": true,
|
||||||
|
"OC": true,
|
||||||
|
"app": true
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,151 @@
|
||||||
|
/**
|
||||||
|
* ownCloud - News
|
||||||
|
*
|
||||||
|
* This file is licensed under the Affero General Public License version 3 or
|
||||||
|
* later. See the COPYING file.
|
||||||
|
*
|
||||||
|
* @author Bernhard Posselt <dev@bernhard-posselt.com>
|
||||||
|
* @copyright Bernhard Posselt 2012, 2014
|
||||||
|
*/
|
||||||
|
|
||||||
|
module.exports = function(grunt) {
|
||||||
|
|
||||||
|
// load needed modules
|
||||||
|
grunt.loadNpmTasks('grunt-contrib-concat');
|
||||||
|
grunt.loadNpmTasks('grunt-contrib-watch');
|
||||||
|
grunt.loadNpmTasks('grunt-contrib-jshint');
|
||||||
|
grunt.loadNpmTasks('grunt-jslint');
|
||||||
|
grunt.loadNpmTasks('grunt-phpunit');
|
||||||
|
grunt.loadNpmTasks('grunt-wrap');
|
||||||
|
grunt.loadNpmTasks('grunt-karma');
|
||||||
|
grunt.loadNpmTasks('grunt-ngmin');
|
||||||
|
|
||||||
|
grunt.initConfig({
|
||||||
|
meta: {
|
||||||
|
pkg: grunt.file.readJSON('package.json'),
|
||||||
|
version: '<%= meta.pkg.version %>',
|
||||||
|
production: 'build/'
|
||||||
|
},
|
||||||
|
concat: {
|
||||||
|
options: {
|
||||||
|
// remove license headers
|
||||||
|
stripBanners: true
|
||||||
|
},
|
||||||
|
dist: {
|
||||||
|
src: [
|
||||||
|
'config/app.js',
|
||||||
|
'config/config.js',
|
||||||
|
'config/run.js',
|
||||||
|
'filter/**/*.js',
|
||||||
|
'service/**/*.js',
|
||||||
|
'directive/**/*.js',
|
||||||
|
'utilitie/**/*.js'
|
||||||
|
],
|
||||||
|
dest: '<%= meta.production %>app.js'
|
||||||
|
}
|
||||||
|
},
|
||||||
|
ngmin: {
|
||||||
|
app: {
|
||||||
|
src: ['<%= meta.production %>app.js'],
|
||||||
|
dest: '<%= meta.production %>app.js',
|
||||||
|
}
|
||||||
|
},
|
||||||
|
wrap: {
|
||||||
|
basic: {
|
||||||
|
src: ['<%= meta.production %>app.js'],
|
||||||
|
dest: '<%= meta.production %>app.js',
|
||||||
|
options: {
|
||||||
|
wrapper: [
|
||||||
|
'(function(angular, $, OC, undefined){\n\n\'use strict\';\n\n',
|
||||||
|
'\n})(angular, jQuery, OC);'
|
||||||
|
]
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
jslint: {
|
||||||
|
browser: {
|
||||||
|
src: [
|
||||||
|
'tests/**/*.js',
|
||||||
|
'config/app.js',
|
||||||
|
'config/config.js',
|
||||||
|
'config/run.js',
|
||||||
|
'controller/**/*.js',
|
||||||
|
'directive/**/*.js',
|
||||||
|
'filter/**/*.js',
|
||||||
|
'service/**/*.js',
|
||||||
|
],
|
||||||
|
directives: {
|
||||||
|
browser: true,
|
||||||
|
predef: ['$', 'angular', 'app', 'OC']
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
jshint: {
|
||||||
|
all: [
|
||||||
|
'**/*.js',
|
||||||
|
'!config/karma.js',
|
||||||
|
'!build/**/*',
|
||||||
|
'!coverage/**/*',
|
||||||
|
'!vendor/**/*',
|
||||||
|
'!node_modules/**/*'
|
||||||
|
],
|
||||||
|
options: {
|
||||||
|
jshintrc: true
|
||||||
|
}
|
||||||
|
},
|
||||||
|
watch: {
|
||||||
|
concat: {
|
||||||
|
files: [
|
||||||
|
'tests/**/*.js',
|
||||||
|
'config/**/*.js',
|
||||||
|
'controller/**/*.js',
|
||||||
|
'directive/**/*.js',
|
||||||
|
'filter/**/*.js',
|
||||||
|
'service/**/*.js',
|
||||||
|
],
|
||||||
|
tasks: ['default']
|
||||||
|
},
|
||||||
|
phpunit: {
|
||||||
|
files: [
|
||||||
|
'../*/**.php',
|
||||||
|
'!../3rdparty',
|
||||||
|
],
|
||||||
|
tasks: ['phpunit']
|
||||||
|
}
|
||||||
|
},
|
||||||
|
karma: {
|
||||||
|
unit: {
|
||||||
|
configFile: 'config/karma.js',
|
||||||
|
browsers: ['PhantomJS']
|
||||||
|
},
|
||||||
|
continuous: {
|
||||||
|
configFile: 'config/karma.js',
|
||||||
|
singleRun: true,
|
||||||
|
browsers: ['PhantomJS'],
|
||||||
|
preprocessors: {
|
||||||
|
'build/app.js': 'coverage'
|
||||||
|
},
|
||||||
|
coverageReporter: {
|
||||||
|
type: 'lcovonly',
|
||||||
|
dir: 'coverage/',
|
||||||
|
file: 'coverage.lcov'
|
||||||
|
},
|
||||||
|
reporters: ['coverage']
|
||||||
|
}
|
||||||
|
},
|
||||||
|
phpunit: {
|
||||||
|
classes: {
|
||||||
|
dir: '../tests'
|
||||||
|
},
|
||||||
|
options: {
|
||||||
|
colors: true
|
||||||
|
}
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
// make tasks available under simpler commands
|
||||||
|
grunt.registerTask('default', ['jshint', 'jslint', 'concat', 'ngmin', 'wrap']);
|
||||||
|
grunt.registerTask('test', ['karma:unit']);
|
||||||
|
grunt.registerTask('ci', ['default', 'karma:continuous']);
|
||||||
|
|
||||||
|
};
|
|
@ -0,0 +1,34 @@
|
||||||
|
{
|
||||||
|
"name": "ownCloud-news",
|
||||||
|
"version": "0.0.0",
|
||||||
|
"homepage": "https://github.com/owncloud/news",
|
||||||
|
"authors": [
|
||||||
|
"Bernhard Posselt <dev@bernhard-posselt.com>"
|
||||||
|
],
|
||||||
|
"description": "An RSS/Atom feed reader",
|
||||||
|
"keywords": [
|
||||||
|
"rss",
|
||||||
|
"atom",
|
||||||
|
"owncloud",
|
||||||
|
"feed",
|
||||||
|
"reader",
|
||||||
|
"app"
|
||||||
|
],
|
||||||
|
"license": "AGPL",
|
||||||
|
"private": true,
|
||||||
|
"ignore": [
|
||||||
|
"**/.*",
|
||||||
|
"node_modules",
|
||||||
|
"bower_components",
|
||||||
|
"test",
|
||||||
|
"tests"
|
||||||
|
],
|
||||||
|
"dependencies": {
|
||||||
|
"angular": "~1.2.16",
|
||||||
|
"angular-route": "~1.2.16",
|
||||||
|
"angular-mocks": "~1.2.16",
|
||||||
|
"angular-sanitize": "~1.2.16",
|
||||||
|
"jquery": "~2.1.1",
|
||||||
|
"momentjs": "~2.6.0"
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,10 @@
|
||||||
|
/**
|
||||||
|
* ownCloud - News
|
||||||
|
*
|
||||||
|
* This file is licensed under the Affero General Public License version 3 or
|
||||||
|
* later. See the COPYING file.
|
||||||
|
*
|
||||||
|
* @author Bernhard Posselt <dev@bernhard-posselt.com>
|
||||||
|
* @copyright Bernhard Posselt 2012, 2014
|
||||||
|
*/
|
||||||
|
var app = angular.module('News', []);
|
|
@ -0,0 +1,17 @@
|
||||||
|
/**
|
||||||
|
* ownCloud - News
|
||||||
|
*
|
||||||
|
* This file is licensed under the Affero General Public License version 3 or
|
||||||
|
* later. See the COPYING file.
|
||||||
|
*
|
||||||
|
* @author Bernhard Posselt <dev@bernhard-posselt.com>
|
||||||
|
* @copyright Bernhard Posselt 2012, 2014
|
||||||
|
*/
|
||||||
|
app.config(function ($routeProvider, $provide) {
|
||||||
|
'use strict';
|
||||||
|
|
||||||
|
$routeProvider.otherwise('/');
|
||||||
|
$provide.constant('baseUrl', OC.generateUrl(''));
|
||||||
|
|
||||||
|
});
|
||||||
|
|
|
@ -0,0 +1,75 @@
|
||||||
|
// Karma configuration
|
||||||
|
// Generated on Thu May 15 2014 04:01:02 GMT+0200 (CEST)
|
||||||
|
|
||||||
|
module.exports = function(config) {
|
||||||
|
config.set({
|
||||||
|
|
||||||
|
// base path that will be used to resolve all patterns (eg. files, exclude)
|
||||||
|
basePath: '../',
|
||||||
|
|
||||||
|
|
||||||
|
// frameworks to use
|
||||||
|
// available frameworks: https://npmjs.org/browse/keyword/karma-adapter
|
||||||
|
frameworks: ['jasmine'],
|
||||||
|
|
||||||
|
|
||||||
|
// list of files / patterns to load in the browser
|
||||||
|
files: [
|
||||||
|
'vendor/jquery/dist/jquery.js',
|
||||||
|
'vendor/momentjs/momentjs.js',
|
||||||
|
'vendor/bootstrap/tooltip.js',
|
||||||
|
'vendor/angular',
|
||||||
|
'vendor/angular-mocks/angular-mocks.js',
|
||||||
|
'vendor/angular-route/angular-route.js',
|
||||||
|
'vendor/angular/angular-sanitize/angular-sanitize.js',
|
||||||
|
'build/app.js',
|
||||||
|
'tests/**/*Spec.js'
|
||||||
|
],
|
||||||
|
|
||||||
|
|
||||||
|
// list of files to exclude
|
||||||
|
exclude: [
|
||||||
|
|
||||||
|
],
|
||||||
|
|
||||||
|
|
||||||
|
// preprocess matching files before serving them to the browser
|
||||||
|
// available preprocessors: https://npmjs.org/browse/keyword/karma-preprocessor
|
||||||
|
preprocessors: {
|
||||||
|
|
||||||
|
},
|
||||||
|
|
||||||
|
|
||||||
|
// test results reporter to use
|
||||||
|
// possible values: 'dots', 'progress'
|
||||||
|
// available reporters: https://npmjs.org/browse/keyword/karma-reporter
|
||||||
|
reporters: ['progress'],
|
||||||
|
|
||||||
|
|
||||||
|
// web server port
|
||||||
|
port: 9876,
|
||||||
|
|
||||||
|
|
||||||
|
// enable / disable colors in the output (reporters and logs)
|
||||||
|
colors: true,
|
||||||
|
|
||||||
|
|
||||||
|
// level of logging
|
||||||
|
// possible values: config.LOG_DISABLE || config.LOG_ERROR || config.LOG_WARN || config.LOG_INFO || config.LOG_DEBUG
|
||||||
|
logLevel: config.LOG_INFO,
|
||||||
|
|
||||||
|
|
||||||
|
// enable / disable watching file and executing tests whenever any file changes
|
||||||
|
autoWatch: false,
|
||||||
|
|
||||||
|
|
||||||
|
// start these browsers
|
||||||
|
// available browser launchers: https://npmjs.org/browse/keyword/karma-launcher
|
||||||
|
browsers: ['PhantomJS'],
|
||||||
|
|
||||||
|
|
||||||
|
// Continuous Integration mode
|
||||||
|
// if true, Karma captures browsers, runs the tests and exits
|
||||||
|
singleRun: false
|
||||||
|
});
|
||||||
|
};
|
|
@ -0,0 +1,14 @@
|
||||||
|
/**
|
||||||
|
* ownCloud - News
|
||||||
|
*
|
||||||
|
* This file is licensed under the Affero General Public License version 3 or
|
||||||
|
* later. See the COPYING file.
|
||||||
|
*
|
||||||
|
* @author Bernhard Posselt <dev@bernhard-posselt.com>
|
||||||
|
* @copyright Bernhard Posselt 2012, 2014
|
||||||
|
*/
|
||||||
|
app.run(function ($rootScope) {
|
||||||
|
'use strict';
|
||||||
|
|
||||||
|
$rootScope.$on('$routeChangeError');
|
||||||
|
});
|
|
@ -0,0 +1,42 @@
|
||||||
|
{
|
||||||
|
"name": "ownCloud-news",
|
||||||
|
"version": "0.0.0",
|
||||||
|
"description": "An RSS/Atom feed reader",
|
||||||
|
"main": "build/app.js",
|
||||||
|
"scripts": {
|
||||||
|
"test": "grunt ci"
|
||||||
|
},
|
||||||
|
"repository": {
|
||||||
|
"type": "git",
|
||||||
|
"url": "https://github.com/owncloud/news"
|
||||||
|
},
|
||||||
|
"keywords": [
|
||||||
|
"rss",
|
||||||
|
"atom",
|
||||||
|
"feed",
|
||||||
|
"reader",
|
||||||
|
"owncloud",
|
||||||
|
"app"
|
||||||
|
],
|
||||||
|
"author": "Bernhard Posselt",
|
||||||
|
"license": "AGPL",
|
||||||
|
"bugs": {
|
||||||
|
"url": "https://github.com/owncloud/news/issues"
|
||||||
|
},
|
||||||
|
"homepage": "https://github.com/owncloud/news",
|
||||||
|
"devDependencies": {
|
||||||
|
"grunt": "^0.4.5",
|
||||||
|
"grunt-contrib-concat": "^0.4.0",
|
||||||
|
"grunt-contrib-jshint": "^0.10.0",
|
||||||
|
"grunt-contrib-watch": "^0.6.1",
|
||||||
|
"grunt-jslint": "^1.1.11",
|
||||||
|
"grunt-karma": "^0.8.3",
|
||||||
|
"grunt-ngmin": "0.0.3",
|
||||||
|
"grunt-phpunit": "^0.3.3",
|
||||||
|
"grunt-wrap": "^0.3.0",
|
||||||
|
"karma": "^0.12.16",
|
||||||
|
"karma-coverage": "^0.2.1",
|
||||||
|
"karma-jasmine": "^0.1.5",
|
||||||
|
"karma-phantomjs-launcher": "^0.1.4"
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,19 @@
|
||||||
|
{
|
||||||
|
"name": "angular-mocks",
|
||||||
|
"version": "1.2.16",
|
||||||
|
"main": "./angular-mocks.js",
|
||||||
|
"dependencies": {
|
||||||
|
"angular": "1.2.16"
|
||||||
|
},
|
||||||
|
"homepage": "https://github.com/angular/bower-angular-mocks",
|
||||||
|
"_release": "1.2.16",
|
||||||
|
"_resolution": {
|
||||||
|
"type": "version",
|
||||||
|
"tag": "v1.2.16",
|
||||||
|
"commit": "e429a011d88c402430329449500f352751d1a137"
|
||||||
|
},
|
||||||
|
"_source": "git://github.com/angular/bower-angular-mocks.git",
|
||||||
|
"_target": "~1.2.16",
|
||||||
|
"_originalSource": "angular-mocks",
|
||||||
|
"_direct": true
|
||||||
|
}
|
|
@ -0,0 +1,42 @@
|
||||||
|
# bower-angular-mocks
|
||||||
|
|
||||||
|
This repo is for distribution on `bower`. The source for this module is in the
|
||||||
|
[main AngularJS repo](https://github.com/angular/angular.js/tree/master/src/ngMock).
|
||||||
|
Please file issues and pull requests against that repo.
|
||||||
|
|
||||||
|
## Install
|
||||||
|
|
||||||
|
Install with `bower`:
|
||||||
|
|
||||||
|
```shell
|
||||||
|
bower install angular-mocks
|
||||||
|
```
|
||||||
|
|
||||||
|
## Documentation
|
||||||
|
|
||||||
|
Documentation is available on the
|
||||||
|
[AngularJS docs site](http://docs.angularjs.org/guide/dev_guide.unit-testing).
|
||||||
|
|
||||||
|
## License
|
||||||
|
|
||||||
|
The MIT License
|
||||||
|
|
||||||
|
Copyright (c) 2010-2012 Google, Inc. http://angularjs.org
|
||||||
|
|
||||||
|
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.
|
Разница между файлами не показана из-за своего большого размера
Загрузить разницу
|
@ -0,0 +1,8 @@
|
||||||
|
{
|
||||||
|
"name": "angular-mocks",
|
||||||
|
"version": "1.2.16",
|
||||||
|
"main": "./angular-mocks.js",
|
||||||
|
"dependencies": {
|
||||||
|
"angular": "1.2.16"
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,19 @@
|
||||||
|
{
|
||||||
|
"name": "angular-route",
|
||||||
|
"version": "1.2.16",
|
||||||
|
"main": "./angular-route.js",
|
||||||
|
"dependencies": {
|
||||||
|
"angular": "1.2.16"
|
||||||
|
},
|
||||||
|
"homepage": "https://github.com/angular/bower-angular-route",
|
||||||
|
"_release": "1.2.16",
|
||||||
|
"_resolution": {
|
||||||
|
"type": "version",
|
||||||
|
"tag": "v1.2.16",
|
||||||
|
"commit": "ed0e2b796077d953f518cb81cc7af981cf695a45"
|
||||||
|
},
|
||||||
|
"_source": "git://github.com/angular/bower-angular-route.git",
|
||||||
|
"_target": "~1.2.16",
|
||||||
|
"_originalSource": "angular-route",
|
||||||
|
"_direct": true
|
||||||
|
}
|
|
@ -0,0 +1,54 @@
|
||||||
|
# bower-angular-route
|
||||||
|
|
||||||
|
This repo is for distribution on `bower`. The source for this module is in the
|
||||||
|
[main AngularJS repo](https://github.com/angular/angular.js/tree/master/src/ngRoute).
|
||||||
|
Please file issues and pull requests against that repo.
|
||||||
|
|
||||||
|
## Install
|
||||||
|
|
||||||
|
Install with `bower`:
|
||||||
|
|
||||||
|
```shell
|
||||||
|
bower install angular-route
|
||||||
|
```
|
||||||
|
|
||||||
|
Add a `<script>` to your `index.html`:
|
||||||
|
|
||||||
|
```html
|
||||||
|
<script src="/bower_components/angular-route/angular-route.js"></script>
|
||||||
|
```
|
||||||
|
|
||||||
|
And add `ngRoute` as a dependency for your app:
|
||||||
|
|
||||||
|
```javascript
|
||||||
|
angular.module('myApp', ['ngRoute']);
|
||||||
|
```
|
||||||
|
|
||||||
|
## Documentation
|
||||||
|
|
||||||
|
Documentation is available on the
|
||||||
|
[AngularJS docs site](http://docs.angularjs.org/api/ngRoute).
|
||||||
|
|
||||||
|
## License
|
||||||
|
|
||||||
|
The MIT License
|
||||||
|
|
||||||
|
Copyright (c) 2010-2012 Google, Inc. http://angularjs.org
|
||||||
|
|
||||||
|
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.
|
|
@ -0,0 +1,927 @@
|
||||||
|
/**
|
||||||
|
* @license AngularJS v1.2.16
|
||||||
|
* (c) 2010-2014 Google, Inc. http://angularjs.org
|
||||||
|
* License: MIT
|
||||||
|
*/
|
||||||
|
(function(window, angular, undefined) {'use strict';
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @ngdoc module
|
||||||
|
* @name ngRoute
|
||||||
|
* @description
|
||||||
|
*
|
||||||
|
* # ngRoute
|
||||||
|
*
|
||||||
|
* The `ngRoute` module provides routing and deeplinking services and directives for angular apps.
|
||||||
|
*
|
||||||
|
* ## Example
|
||||||
|
* See {@link ngRoute.$route#example $route} for an example of configuring and using `ngRoute`.
|
||||||
|
*
|
||||||
|
*
|
||||||
|
* <div doc-module-components="ngRoute"></div>
|
||||||
|
*/
|
||||||
|
/* global -ngRouteModule */
|
||||||
|
var ngRouteModule = angular.module('ngRoute', ['ng']).
|
||||||
|
provider('$route', $RouteProvider);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @ngdoc provider
|
||||||
|
* @name $routeProvider
|
||||||
|
* @function
|
||||||
|
*
|
||||||
|
* @description
|
||||||
|
*
|
||||||
|
* Used for configuring routes.
|
||||||
|
*
|
||||||
|
* ## Example
|
||||||
|
* See {@link ngRoute.$route#example $route} for an example of configuring and using `ngRoute`.
|
||||||
|
*
|
||||||
|
* ## Dependencies
|
||||||
|
* Requires the {@link ngRoute `ngRoute`} module to be installed.
|
||||||
|
*/
|
||||||
|
function $RouteProvider(){
|
||||||
|
function inherit(parent, extra) {
|
||||||
|
return angular.extend(new (angular.extend(function() {}, {prototype:parent}))(), extra);
|
||||||
|
}
|
||||||
|
|
||||||
|
var routes = {};
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @ngdoc method
|
||||||
|
* @name $routeProvider#when
|
||||||
|
*
|
||||||
|
* @param {string} path Route path (matched against `$location.path`). If `$location.path`
|
||||||
|
* contains redundant trailing slash or is missing one, the route will still match and the
|
||||||
|
* `$location.path` will be updated to add or drop the trailing slash to exactly match the
|
||||||
|
* route definition.
|
||||||
|
*
|
||||||
|
* * `path` can contain named groups starting with a colon: e.g. `:name`. All characters up
|
||||||
|
* to the next slash are matched and stored in `$routeParams` under the given `name`
|
||||||
|
* when the route matches.
|
||||||
|
* * `path` can contain named groups starting with a colon and ending with a star:
|
||||||
|
* e.g.`:name*`. All characters are eagerly stored in `$routeParams` under the given `name`
|
||||||
|
* when the route matches.
|
||||||
|
* * `path` can contain optional named groups with a question mark: e.g.`:name?`.
|
||||||
|
*
|
||||||
|
* For example, routes like `/color/:color/largecode/:largecode*\/edit` will match
|
||||||
|
* `/color/brown/largecode/code/with/slashes/edit` and extract:
|
||||||
|
*
|
||||||
|
* * `color: brown`
|
||||||
|
* * `largecode: code/with/slashes`.
|
||||||
|
*
|
||||||
|
*
|
||||||
|
* @param {Object} route Mapping information to be assigned to `$route.current` on route
|
||||||
|
* match.
|
||||||
|
*
|
||||||
|
* Object properties:
|
||||||
|
*
|
||||||
|
* - `controller` – `{(string|function()=}` – Controller fn that should be associated with
|
||||||
|
* newly created scope or the name of a {@link angular.Module#controller registered
|
||||||
|
* controller} if passed as a string.
|
||||||
|
* - `controllerAs` – `{string=}` – A controller alias name. If present the controller will be
|
||||||
|
* published to scope under the `controllerAs` name.
|
||||||
|
* - `template` – `{string=|function()=}` – html template as a string or a function that
|
||||||
|
* returns an html template as a string which should be used by {@link
|
||||||
|
* ngRoute.directive:ngView ngView} or {@link ng.directive:ngInclude ngInclude} directives.
|
||||||
|
* This property takes precedence over `templateUrl`.
|
||||||
|
*
|
||||||
|
* If `template` is a function, it will be called with the following parameters:
|
||||||
|
*
|
||||||
|
* - `{Array.<Object>}` - route parameters extracted from the current
|
||||||
|
* `$location.path()` by applying the current route
|
||||||
|
*
|
||||||
|
* - `templateUrl` – `{string=|function()=}` – path or function that returns a path to an html
|
||||||
|
* template that should be used by {@link ngRoute.directive:ngView ngView}.
|
||||||
|
*
|
||||||
|
* If `templateUrl` is a function, it will be called with the following parameters:
|
||||||
|
*
|
||||||
|
* - `{Array.<Object>}` - route parameters extracted from the current
|
||||||
|
* `$location.path()` by applying the current route
|
||||||
|
*
|
||||||
|
* - `resolve` - `{Object.<string, function>=}` - An optional map of dependencies which should
|
||||||
|
* be injected into the controller. If any of these dependencies are promises, the router
|
||||||
|
* will wait for them all to be resolved or one to be rejected before the controller is
|
||||||
|
* instantiated.
|
||||||
|
* If all the promises are resolved successfully, the values of the resolved promises are
|
||||||
|
* injected and {@link ngRoute.$route#$routeChangeSuccess $routeChangeSuccess} event is
|
||||||
|
* fired. If any of the promises are rejected the
|
||||||
|
* {@link ngRoute.$route#$routeChangeError $routeChangeError} event is fired. The map object
|
||||||
|
* is:
|
||||||
|
*
|
||||||
|
* - `key` – `{string}`: a name of a dependency to be injected into the controller.
|
||||||
|
* - `factory` - `{string|function}`: If `string` then it is an alias for a service.
|
||||||
|
* Otherwise if function, then it is {@link auto.$injector#invoke injected}
|
||||||
|
* and the return value is treated as the dependency. If the result is a promise, it is
|
||||||
|
* resolved before its value is injected into the controller. Be aware that
|
||||||
|
* `ngRoute.$routeParams` will still refer to the previous route within these resolve
|
||||||
|
* functions. Use `$route.current.params` to access the new route parameters, instead.
|
||||||
|
*
|
||||||
|
* - `redirectTo` – {(string|function())=} – value to update
|
||||||
|
* {@link ng.$location $location} path with and trigger route redirection.
|
||||||
|
*
|
||||||
|
* If `redirectTo` is a function, it will be called with the following parameters:
|
||||||
|
*
|
||||||
|
* - `{Object.<string>}` - route parameters extracted from the current
|
||||||
|
* `$location.path()` by applying the current route templateUrl.
|
||||||
|
* - `{string}` - current `$location.path()`
|
||||||
|
* - `{Object}` - current `$location.search()`
|
||||||
|
*
|
||||||
|
* The custom `redirectTo` function is expected to return a string which will be used
|
||||||
|
* to update `$location.path()` and `$location.search()`.
|
||||||
|
*
|
||||||
|
* - `[reloadOnSearch=true]` - {boolean=} - reload route when only `$location.search()`
|
||||||
|
* or `$location.hash()` changes.
|
||||||
|
*
|
||||||
|
* If the option is set to `false` and url in the browser changes, then
|
||||||
|
* `$routeUpdate` event is broadcasted on the root scope.
|
||||||
|
*
|
||||||
|
* - `[caseInsensitiveMatch=false]` - {boolean=} - match routes without being case sensitive
|
||||||
|
*
|
||||||
|
* If the option is set to `true`, then the particular route can be matched without being
|
||||||
|
* case sensitive
|
||||||
|
*
|
||||||
|
* @returns {Object} self
|
||||||
|
*
|
||||||
|
* @description
|
||||||
|
* Adds a new route definition to the `$route` service.
|
||||||
|
*/
|
||||||
|
this.when = function(path, route) {
|
||||||
|
routes[path] = angular.extend(
|
||||||
|
{reloadOnSearch: true},
|
||||||
|
route,
|
||||||
|
path && pathRegExp(path, route)
|
||||||
|
);
|
||||||
|
|
||||||
|
// create redirection for trailing slashes
|
||||||
|
if (path) {
|
||||||
|
var redirectPath = (path[path.length-1] == '/')
|
||||||
|
? path.substr(0, path.length-1)
|
||||||
|
: path +'/';
|
||||||
|
|
||||||
|
routes[redirectPath] = angular.extend(
|
||||||
|
{redirectTo: path},
|
||||||
|
pathRegExp(redirectPath, route)
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
return this;
|
||||||
|
};
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @param path {string} path
|
||||||
|
* @param opts {Object} options
|
||||||
|
* @return {?Object}
|
||||||
|
*
|
||||||
|
* @description
|
||||||
|
* Normalizes the given path, returning a regular expression
|
||||||
|
* and the original path.
|
||||||
|
*
|
||||||
|
* Inspired by pathRexp in visionmedia/express/lib/utils.js.
|
||||||
|
*/
|
||||||
|
function pathRegExp(path, opts) {
|
||||||
|
var insensitive = opts.caseInsensitiveMatch,
|
||||||
|
ret = {
|
||||||
|
originalPath: path,
|
||||||
|
regexp: path
|
||||||
|
},
|
||||||
|
keys = ret.keys = [];
|
||||||
|
|
||||||
|
path = path
|
||||||
|
.replace(/([().])/g, '\\$1')
|
||||||
|
.replace(/(\/)?:(\w+)([\?\*])?/g, function(_, slash, key, option){
|
||||||
|
var optional = option === '?' ? option : null;
|
||||||
|
var star = option === '*' ? option : null;
|
||||||
|
keys.push({ name: key, optional: !!optional });
|
||||||
|
slash = slash || '';
|
||||||
|
return ''
|
||||||
|
+ (optional ? '' : slash)
|
||||||
|
+ '(?:'
|
||||||
|
+ (optional ? slash : '')
|
||||||
|
+ (star && '(.+?)' || '([^/]+)')
|
||||||
|
+ (optional || '')
|
||||||
|
+ ')'
|
||||||
|
+ (optional || '');
|
||||||
|
})
|
||||||
|
.replace(/([\/$\*])/g, '\\$1');
|
||||||
|
|
||||||
|
ret.regexp = new RegExp('^' + path + '$', insensitive ? 'i' : '');
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @ngdoc method
|
||||||
|
* @name $routeProvider#otherwise
|
||||||
|
*
|
||||||
|
* @description
|
||||||
|
* Sets route definition that will be used on route change when no other route definition
|
||||||
|
* is matched.
|
||||||
|
*
|
||||||
|
* @param {Object} params Mapping information to be assigned to `$route.current`.
|
||||||
|
* @returns {Object} self
|
||||||
|
*/
|
||||||
|
this.otherwise = function(params) {
|
||||||
|
this.when(null, params);
|
||||||
|
return this;
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
this.$get = ['$rootScope',
|
||||||
|
'$location',
|
||||||
|
'$routeParams',
|
||||||
|
'$q',
|
||||||
|
'$injector',
|
||||||
|
'$http',
|
||||||
|
'$templateCache',
|
||||||
|
'$sce',
|
||||||
|
function($rootScope, $location, $routeParams, $q, $injector, $http, $templateCache, $sce) {
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @ngdoc service
|
||||||
|
* @name $route
|
||||||
|
* @requires $location
|
||||||
|
* @requires $routeParams
|
||||||
|
*
|
||||||
|
* @property {Object} current Reference to the current route definition.
|
||||||
|
* The route definition contains:
|
||||||
|
*
|
||||||
|
* - `controller`: The controller constructor as define in route definition.
|
||||||
|
* - `locals`: A map of locals which is used by {@link ng.$controller $controller} service for
|
||||||
|
* controller instantiation. The `locals` contain
|
||||||
|
* the resolved values of the `resolve` map. Additionally the `locals` also contain:
|
||||||
|
*
|
||||||
|
* - `$scope` - The current route scope.
|
||||||
|
* - `$template` - The current route template HTML.
|
||||||
|
*
|
||||||
|
* @property {Object} routes Object with all route configuration Objects as its properties.
|
||||||
|
*
|
||||||
|
* @description
|
||||||
|
* `$route` is used for deep-linking URLs to controllers and views (HTML partials).
|
||||||
|
* It watches `$location.url()` and tries to map the path to an existing route definition.
|
||||||
|
*
|
||||||
|
* Requires the {@link ngRoute `ngRoute`} module to be installed.
|
||||||
|
*
|
||||||
|
* You can define routes through {@link ngRoute.$routeProvider $routeProvider}'s API.
|
||||||
|
*
|
||||||
|
* The `$route` service is typically used in conjunction with the
|
||||||
|
* {@link ngRoute.directive:ngView `ngView`} directive and the
|
||||||
|
* {@link ngRoute.$routeParams `$routeParams`} service.
|
||||||
|
*
|
||||||
|
* @example
|
||||||
|
* This example shows how changing the URL hash causes the `$route` to match a route against the
|
||||||
|
* URL, and the `ngView` pulls in the partial.
|
||||||
|
*
|
||||||
|
* Note that this example is using {@link ng.directive:script inlined templates}
|
||||||
|
* to get it working on jsfiddle as well.
|
||||||
|
*
|
||||||
|
* <example name="$route-service" module="ngRouteExample"
|
||||||
|
* deps="angular-route.js" fixBase="true">
|
||||||
|
* <file name="index.html">
|
||||||
|
* <div ng-controller="MainController">
|
||||||
|
* Choose:
|
||||||
|
* <a href="Book/Moby">Moby</a> |
|
||||||
|
* <a href="Book/Moby/ch/1">Moby: Ch1</a> |
|
||||||
|
* <a href="Book/Gatsby">Gatsby</a> |
|
||||||
|
* <a href="Book/Gatsby/ch/4?key=value">Gatsby: Ch4</a> |
|
||||||
|
* <a href="Book/Scarlet">Scarlet Letter</a><br/>
|
||||||
|
*
|
||||||
|
* <div ng-view></div>
|
||||||
|
*
|
||||||
|
* <hr />
|
||||||
|
*
|
||||||
|
* <pre>$location.path() = {{$location.path()}}</pre>
|
||||||
|
* <pre>$route.current.templateUrl = {{$route.current.templateUrl}}</pre>
|
||||||
|
* <pre>$route.current.params = {{$route.current.params}}</pre>
|
||||||
|
* <pre>$route.current.scope.name = {{$route.current.scope.name}}</pre>
|
||||||
|
* <pre>$routeParams = {{$routeParams}}</pre>
|
||||||
|
* </div>
|
||||||
|
* </file>
|
||||||
|
*
|
||||||
|
* <file name="book.html">
|
||||||
|
* controller: {{name}}<br />
|
||||||
|
* Book Id: {{params.bookId}}<br />
|
||||||
|
* </file>
|
||||||
|
*
|
||||||
|
* <file name="chapter.html">
|
||||||
|
* controller: {{name}}<br />
|
||||||
|
* Book Id: {{params.bookId}}<br />
|
||||||
|
* Chapter Id: {{params.chapterId}}
|
||||||
|
* </file>
|
||||||
|
*
|
||||||
|
* <file name="script.js">
|
||||||
|
* angular.module('ngRouteExample', ['ngRoute'])
|
||||||
|
*
|
||||||
|
* .controller('MainController', function($scope, $route, $routeParams, $location) {
|
||||||
|
* $scope.$route = $route;
|
||||||
|
* $scope.$location = $location;
|
||||||
|
* $scope.$routeParams = $routeParams;
|
||||||
|
* })
|
||||||
|
*
|
||||||
|
* .controller('BookController', function($scope, $routeParams) {
|
||||||
|
* $scope.name = "BookController";
|
||||||
|
* $scope.params = $routeParams;
|
||||||
|
* })
|
||||||
|
*
|
||||||
|
* .controller('ChapterController', function($scope, $routeParams) {
|
||||||
|
* $scope.name = "ChapterController";
|
||||||
|
* $scope.params = $routeParams;
|
||||||
|
* })
|
||||||
|
*
|
||||||
|
* .config(function($routeProvider, $locationProvider) {
|
||||||
|
* $routeProvider
|
||||||
|
* .when('/Book/:bookId', {
|
||||||
|
* templateUrl: 'book.html',
|
||||||
|
* controller: 'BookController',
|
||||||
|
* resolve: {
|
||||||
|
* // I will cause a 1 second delay
|
||||||
|
* delay: function($q, $timeout) {
|
||||||
|
* var delay = $q.defer();
|
||||||
|
* $timeout(delay.resolve, 1000);
|
||||||
|
* return delay.promise;
|
||||||
|
* }
|
||||||
|
* }
|
||||||
|
* })
|
||||||
|
* .when('/Book/:bookId/ch/:chapterId', {
|
||||||
|
* templateUrl: 'chapter.html',
|
||||||
|
* controller: 'ChapterController'
|
||||||
|
* });
|
||||||
|
*
|
||||||
|
* // configure html5 to get links working on jsfiddle
|
||||||
|
* $locationProvider.html5Mode(true);
|
||||||
|
* });
|
||||||
|
*
|
||||||
|
* </file>
|
||||||
|
*
|
||||||
|
* <file name="protractor.js" type="protractor">
|
||||||
|
* it('should load and compile correct template', function() {
|
||||||
|
* element(by.linkText('Moby: Ch1')).click();
|
||||||
|
* var content = element(by.css('[ng-view]')).getText();
|
||||||
|
* expect(content).toMatch(/controller\: ChapterController/);
|
||||||
|
* expect(content).toMatch(/Book Id\: Moby/);
|
||||||
|
* expect(content).toMatch(/Chapter Id\: 1/);
|
||||||
|
*
|
||||||
|
* element(by.partialLinkText('Scarlet')).click();
|
||||||
|
*
|
||||||
|
* content = element(by.css('[ng-view]')).getText();
|
||||||
|
* expect(content).toMatch(/controller\: BookController/);
|
||||||
|
* expect(content).toMatch(/Book Id\: Scarlet/);
|
||||||
|
* });
|
||||||
|
* </file>
|
||||||
|
* </example>
|
||||||
|
*/
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @ngdoc event
|
||||||
|
* @name $route#$routeChangeStart
|
||||||
|
* @eventType broadcast on root scope
|
||||||
|
* @description
|
||||||
|
* Broadcasted before a route change. At this point the route services starts
|
||||||
|
* resolving all of the dependencies needed for the route change to occur.
|
||||||
|
* Typically this involves fetching the view template as well as any dependencies
|
||||||
|
* defined in `resolve` route property. Once all of the dependencies are resolved
|
||||||
|
* `$routeChangeSuccess` is fired.
|
||||||
|
*
|
||||||
|
* @param {Object} angularEvent Synthetic event object.
|
||||||
|
* @param {Route} next Future route information.
|
||||||
|
* @param {Route} current Current route information.
|
||||||
|
*/
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @ngdoc event
|
||||||
|
* @name $route#$routeChangeSuccess
|
||||||
|
* @eventType broadcast on root scope
|
||||||
|
* @description
|
||||||
|
* Broadcasted after a route dependencies are resolved.
|
||||||
|
* {@link ngRoute.directive:ngView ngView} listens for the directive
|
||||||
|
* to instantiate the controller and render the view.
|
||||||
|
*
|
||||||
|
* @param {Object} angularEvent Synthetic event object.
|
||||||
|
* @param {Route} current Current route information.
|
||||||
|
* @param {Route|Undefined} previous Previous route information, or undefined if current is
|
||||||
|
* first route entered.
|
||||||
|
*/
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @ngdoc event
|
||||||
|
* @name $route#$routeChangeError
|
||||||
|
* @eventType broadcast on root scope
|
||||||
|
* @description
|
||||||
|
* Broadcasted if any of the resolve promises are rejected.
|
||||||
|
*
|
||||||
|
* @param {Object} angularEvent Synthetic event object
|
||||||
|
* @param {Route} current Current route information.
|
||||||
|
* @param {Route} previous Previous route information.
|
||||||
|
* @param {Route} rejection Rejection of the promise. Usually the error of the failed promise.
|
||||||
|
*/
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @ngdoc event
|
||||||
|
* @name $route#$routeUpdate
|
||||||
|
* @eventType broadcast on root scope
|
||||||
|
* @description
|
||||||
|
*
|
||||||
|
* The `reloadOnSearch` property has been set to false, and we are reusing the same
|
||||||
|
* instance of the Controller.
|
||||||
|
*/
|
||||||
|
|
||||||
|
var forceReload = false,
|
||||||
|
$route = {
|
||||||
|
routes: routes,
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @ngdoc method
|
||||||
|
* @name $route#reload
|
||||||
|
*
|
||||||
|
* @description
|
||||||
|
* Causes `$route` service to reload the current route even if
|
||||||
|
* {@link ng.$location $location} hasn't changed.
|
||||||
|
*
|
||||||
|
* As a result of that, {@link ngRoute.directive:ngView ngView}
|
||||||
|
* creates new scope, reinstantiates the controller.
|
||||||
|
*/
|
||||||
|
reload: function() {
|
||||||
|
forceReload = true;
|
||||||
|
$rootScope.$evalAsync(updateRoute);
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
$rootScope.$on('$locationChangeSuccess', updateRoute);
|
||||||
|
|
||||||
|
return $route;
|
||||||
|
|
||||||
|
/////////////////////////////////////////////////////
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @param on {string} current url
|
||||||
|
* @param route {Object} route regexp to match the url against
|
||||||
|
* @return {?Object}
|
||||||
|
*
|
||||||
|
* @description
|
||||||
|
* Check if the route matches the current url.
|
||||||
|
*
|
||||||
|
* Inspired by match in
|
||||||
|
* visionmedia/express/lib/router/router.js.
|
||||||
|
*/
|
||||||
|
function switchRouteMatcher(on, route) {
|
||||||
|
var keys = route.keys,
|
||||||
|
params = {};
|
||||||
|
|
||||||
|
if (!route.regexp) return null;
|
||||||
|
|
||||||
|
var m = route.regexp.exec(on);
|
||||||
|
if (!m) return null;
|
||||||
|
|
||||||
|
for (var i = 1, len = m.length; i < len; ++i) {
|
||||||
|
var key = keys[i - 1];
|
||||||
|
|
||||||
|
var val = 'string' == typeof m[i]
|
||||||
|
? decodeURIComponent(m[i])
|
||||||
|
: m[i];
|
||||||
|
|
||||||
|
if (key && val) {
|
||||||
|
params[key.name] = val;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return params;
|
||||||
|
}
|
||||||
|
|
||||||
|
function updateRoute() {
|
||||||
|
var next = parseRoute(),
|
||||||
|
last = $route.current;
|
||||||
|
|
||||||
|
if (next && last && next.$$route === last.$$route
|
||||||
|
&& angular.equals(next.pathParams, last.pathParams)
|
||||||
|
&& !next.reloadOnSearch && !forceReload) {
|
||||||
|
last.params = next.params;
|
||||||
|
angular.copy(last.params, $routeParams);
|
||||||
|
$rootScope.$broadcast('$routeUpdate', last);
|
||||||
|
} else if (next || last) {
|
||||||
|
forceReload = false;
|
||||||
|
$rootScope.$broadcast('$routeChangeStart', next, last);
|
||||||
|
$route.current = next;
|
||||||
|
if (next) {
|
||||||
|
if (next.redirectTo) {
|
||||||
|
if (angular.isString(next.redirectTo)) {
|
||||||
|
$location.path(interpolate(next.redirectTo, next.params)).search(next.params)
|
||||||
|
.replace();
|
||||||
|
} else {
|
||||||
|
$location.url(next.redirectTo(next.pathParams, $location.path(), $location.search()))
|
||||||
|
.replace();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
$q.when(next).
|
||||||
|
then(function() {
|
||||||
|
if (next) {
|
||||||
|
var locals = angular.extend({}, next.resolve),
|
||||||
|
template, templateUrl;
|
||||||
|
|
||||||
|
angular.forEach(locals, function(value, key) {
|
||||||
|
locals[key] = angular.isString(value) ?
|
||||||
|
$injector.get(value) : $injector.invoke(value);
|
||||||
|
});
|
||||||
|
|
||||||
|
if (angular.isDefined(template = next.template)) {
|
||||||
|
if (angular.isFunction(template)) {
|
||||||
|
template = template(next.params);
|
||||||
|
}
|
||||||
|
} else if (angular.isDefined(templateUrl = next.templateUrl)) {
|
||||||
|
if (angular.isFunction(templateUrl)) {
|
||||||
|
templateUrl = templateUrl(next.params);
|
||||||
|
}
|
||||||
|
templateUrl = $sce.getTrustedResourceUrl(templateUrl);
|
||||||
|
if (angular.isDefined(templateUrl)) {
|
||||||
|
next.loadedTemplateUrl = templateUrl;
|
||||||
|
template = $http.get(templateUrl, {cache: $templateCache}).
|
||||||
|
then(function(response) { return response.data; });
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (angular.isDefined(template)) {
|
||||||
|
locals['$template'] = template;
|
||||||
|
}
|
||||||
|
return $q.all(locals);
|
||||||
|
}
|
||||||
|
}).
|
||||||
|
// after route change
|
||||||
|
then(function(locals) {
|
||||||
|
if (next == $route.current) {
|
||||||
|
if (next) {
|
||||||
|
next.locals = locals;
|
||||||
|
angular.copy(next.params, $routeParams);
|
||||||
|
}
|
||||||
|
$rootScope.$broadcast('$routeChangeSuccess', next, last);
|
||||||
|
}
|
||||||
|
}, function(error) {
|
||||||
|
if (next == $route.current) {
|
||||||
|
$rootScope.$broadcast('$routeChangeError', next, last, error);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @returns {Object} the current active route, by matching it against the URL
|
||||||
|
*/
|
||||||
|
function parseRoute() {
|
||||||
|
// Match a route
|
||||||
|
var params, match;
|
||||||
|
angular.forEach(routes, function(route, path) {
|
||||||
|
if (!match && (params = switchRouteMatcher($location.path(), route))) {
|
||||||
|
match = inherit(route, {
|
||||||
|
params: angular.extend({}, $location.search(), params),
|
||||||
|
pathParams: params});
|
||||||
|
match.$$route = route;
|
||||||
|
}
|
||||||
|
});
|
||||||
|
// No route matched; fallback to "otherwise" route
|
||||||
|
return match || routes[null] && inherit(routes[null], {params: {}, pathParams:{}});
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @returns {string} interpolation of the redirect path with the parameters
|
||||||
|
*/
|
||||||
|
function interpolate(string, params) {
|
||||||
|
var result = [];
|
||||||
|
angular.forEach((string||'').split(':'), function(segment, i) {
|
||||||
|
if (i === 0) {
|
||||||
|
result.push(segment);
|
||||||
|
} else {
|
||||||
|
var segmentMatch = segment.match(/(\w+)(.*)/);
|
||||||
|
var key = segmentMatch[1];
|
||||||
|
result.push(params[key]);
|
||||||
|
result.push(segmentMatch[2] || '');
|
||||||
|
delete params[key];
|
||||||
|
}
|
||||||
|
});
|
||||||
|
return result.join('');
|
||||||
|
}
|
||||||
|
}];
|
||||||
|
}
|
||||||
|
|
||||||
|
ngRouteModule.provider('$routeParams', $RouteParamsProvider);
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @ngdoc service
|
||||||
|
* @name $routeParams
|
||||||
|
* @requires $route
|
||||||
|
*
|
||||||
|
* @description
|
||||||
|
* The `$routeParams` service allows you to retrieve the current set of route parameters.
|
||||||
|
*
|
||||||
|
* Requires the {@link ngRoute `ngRoute`} module to be installed.
|
||||||
|
*
|
||||||
|
* The route parameters are a combination of {@link ng.$location `$location`}'s
|
||||||
|
* {@link ng.$location#search `search()`} and {@link ng.$location#path `path()`}.
|
||||||
|
* The `path` parameters are extracted when the {@link ngRoute.$route `$route`} path is matched.
|
||||||
|
*
|
||||||
|
* In case of parameter name collision, `path` params take precedence over `search` params.
|
||||||
|
*
|
||||||
|
* The service guarantees that the identity of the `$routeParams` object will remain unchanged
|
||||||
|
* (but its properties will likely change) even when a route change occurs.
|
||||||
|
*
|
||||||
|
* Note that the `$routeParams` are only updated *after* a route change completes successfully.
|
||||||
|
* This means that you cannot rely on `$routeParams` being correct in route resolve functions.
|
||||||
|
* Instead you can use `$route.current.params` to access the new route's parameters.
|
||||||
|
*
|
||||||
|
* @example
|
||||||
|
* ```js
|
||||||
|
* // Given:
|
||||||
|
* // URL: http://server.com/index.html#/Chapter/1/Section/2?search=moby
|
||||||
|
* // Route: /Chapter/:chapterId/Section/:sectionId
|
||||||
|
* //
|
||||||
|
* // Then
|
||||||
|
* $routeParams ==> {chapterId:1, sectionId:2, search:'moby'}
|
||||||
|
* ```
|
||||||
|
*/
|
||||||
|
function $RouteParamsProvider() {
|
||||||
|
this.$get = function() { return {}; };
|
||||||
|
}
|
||||||
|
|
||||||
|
ngRouteModule.directive('ngView', ngViewFactory);
|
||||||
|
ngRouteModule.directive('ngView', ngViewFillContentFactory);
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @ngdoc directive
|
||||||
|
* @name ngView
|
||||||
|
* @restrict ECA
|
||||||
|
*
|
||||||
|
* @description
|
||||||
|
* # Overview
|
||||||
|
* `ngView` is a directive that complements the {@link ngRoute.$route $route} service by
|
||||||
|
* including the rendered template of the current route into the main layout (`index.html`) file.
|
||||||
|
* Every time the current route changes, the included view changes with it according to the
|
||||||
|
* configuration of the `$route` service.
|
||||||
|
*
|
||||||
|
* Requires the {@link ngRoute `ngRoute`} module to be installed.
|
||||||
|
*
|
||||||
|
* @animations
|
||||||
|
* enter - animation is used to bring new content into the browser.
|
||||||
|
* leave - animation is used to animate existing content away.
|
||||||
|
*
|
||||||
|
* The enter and leave animation occur concurrently.
|
||||||
|
*
|
||||||
|
* @scope
|
||||||
|
* @priority 400
|
||||||
|
* @param {string=} onload Expression to evaluate whenever the view updates.
|
||||||
|
*
|
||||||
|
* @param {string=} autoscroll Whether `ngView` should call {@link ng.$anchorScroll
|
||||||
|
* $anchorScroll} to scroll the viewport after the view is updated.
|
||||||
|
*
|
||||||
|
* - If the attribute is not set, disable scrolling.
|
||||||
|
* - If the attribute is set without value, enable scrolling.
|
||||||
|
* - Otherwise enable scrolling only if the `autoscroll` attribute value evaluated
|
||||||
|
* as an expression yields a truthy value.
|
||||||
|
* @example
|
||||||
|
<example name="ngView-directive" module="ngViewExample"
|
||||||
|
deps="angular-route.js;angular-animate.js"
|
||||||
|
animations="true" fixBase="true">
|
||||||
|
<file name="index.html">
|
||||||
|
<div ng-controller="MainCtrl as main">
|
||||||
|
Choose:
|
||||||
|
<a href="Book/Moby">Moby</a> |
|
||||||
|
<a href="Book/Moby/ch/1">Moby: Ch1</a> |
|
||||||
|
<a href="Book/Gatsby">Gatsby</a> |
|
||||||
|
<a href="Book/Gatsby/ch/4?key=value">Gatsby: Ch4</a> |
|
||||||
|
<a href="Book/Scarlet">Scarlet Letter</a><br/>
|
||||||
|
|
||||||
|
<div class="view-animate-container">
|
||||||
|
<div ng-view class="view-animate"></div>
|
||||||
|
</div>
|
||||||
|
<hr />
|
||||||
|
|
||||||
|
<pre>$location.path() = {{main.$location.path()}}</pre>
|
||||||
|
<pre>$route.current.templateUrl = {{main.$route.current.templateUrl}}</pre>
|
||||||
|
<pre>$route.current.params = {{main.$route.current.params}}</pre>
|
||||||
|
<pre>$route.current.scope.name = {{main.$route.current.scope.name}}</pre>
|
||||||
|
<pre>$routeParams = {{main.$routeParams}}</pre>
|
||||||
|
</div>
|
||||||
|
</file>
|
||||||
|
|
||||||
|
<file name="book.html">
|
||||||
|
<div>
|
||||||
|
controller: {{book.name}}<br />
|
||||||
|
Book Id: {{book.params.bookId}}<br />
|
||||||
|
</div>
|
||||||
|
</file>
|
||||||
|
|
||||||
|
<file name="chapter.html">
|
||||||
|
<div>
|
||||||
|
controller: {{chapter.name}}<br />
|
||||||
|
Book Id: {{chapter.params.bookId}}<br />
|
||||||
|
Chapter Id: {{chapter.params.chapterId}}
|
||||||
|
</div>
|
||||||
|
</file>
|
||||||
|
|
||||||
|
<file name="animations.css">
|
||||||
|
.view-animate-container {
|
||||||
|
position:relative;
|
||||||
|
height:100px!important;
|
||||||
|
position:relative;
|
||||||
|
background:white;
|
||||||
|
border:1px solid black;
|
||||||
|
height:40px;
|
||||||
|
overflow:hidden;
|
||||||
|
}
|
||||||
|
|
||||||
|
.view-animate {
|
||||||
|
padding:10px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.view-animate.ng-enter, .view-animate.ng-leave {
|
||||||
|
-webkit-transition:all cubic-bezier(0.250, 0.460, 0.450, 0.940) 1.5s;
|
||||||
|
transition:all cubic-bezier(0.250, 0.460, 0.450, 0.940) 1.5s;
|
||||||
|
|
||||||
|
display:block;
|
||||||
|
width:100%;
|
||||||
|
border-left:1px solid black;
|
||||||
|
|
||||||
|
position:absolute;
|
||||||
|
top:0;
|
||||||
|
left:0;
|
||||||
|
right:0;
|
||||||
|
bottom:0;
|
||||||
|
padding:10px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.view-animate.ng-enter {
|
||||||
|
left:100%;
|
||||||
|
}
|
||||||
|
.view-animate.ng-enter.ng-enter-active {
|
||||||
|
left:0;
|
||||||
|
}
|
||||||
|
.view-animate.ng-leave.ng-leave-active {
|
||||||
|
left:-100%;
|
||||||
|
}
|
||||||
|
</file>
|
||||||
|
|
||||||
|
<file name="script.js">
|
||||||
|
angular.module('ngViewExample', ['ngRoute', 'ngAnimate'])
|
||||||
|
.config(['$routeProvider', '$locationProvider',
|
||||||
|
function($routeProvider, $locationProvider) {
|
||||||
|
$routeProvider
|
||||||
|
.when('/Book/:bookId', {
|
||||||
|
templateUrl: 'book.html',
|
||||||
|
controller: 'BookCtrl',
|
||||||
|
controllerAs: 'book'
|
||||||
|
})
|
||||||
|
.when('/Book/:bookId/ch/:chapterId', {
|
||||||
|
templateUrl: 'chapter.html',
|
||||||
|
controller: 'ChapterCtrl',
|
||||||
|
controllerAs: 'chapter'
|
||||||
|
});
|
||||||
|
|
||||||
|
// configure html5 to get links working on jsfiddle
|
||||||
|
$locationProvider.html5Mode(true);
|
||||||
|
}])
|
||||||
|
.controller('MainCtrl', ['$route', '$routeParams', '$location',
|
||||||
|
function($route, $routeParams, $location) {
|
||||||
|
this.$route = $route;
|
||||||
|
this.$location = $location;
|
||||||
|
this.$routeParams = $routeParams;
|
||||||
|
}])
|
||||||
|
.controller('BookCtrl', ['$routeParams', function($routeParams) {
|
||||||
|
this.name = "BookCtrl";
|
||||||
|
this.params = $routeParams;
|
||||||
|
}])
|
||||||
|
.controller('ChapterCtrl', ['$routeParams', function($routeParams) {
|
||||||
|
this.name = "ChapterCtrl";
|
||||||
|
this.params = $routeParams;
|
||||||
|
}]);
|
||||||
|
|
||||||
|
</file>
|
||||||
|
|
||||||
|
<file name="protractor.js" type="protractor">
|
||||||
|
it('should load and compile correct template', function() {
|
||||||
|
element(by.linkText('Moby: Ch1')).click();
|
||||||
|
var content = element(by.css('[ng-view]')).getText();
|
||||||
|
expect(content).toMatch(/controller\: ChapterCtrl/);
|
||||||
|
expect(content).toMatch(/Book Id\: Moby/);
|
||||||
|
expect(content).toMatch(/Chapter Id\: 1/);
|
||||||
|
|
||||||
|
element(by.partialLinkText('Scarlet')).click();
|
||||||
|
|
||||||
|
content = element(by.css('[ng-view]')).getText();
|
||||||
|
expect(content).toMatch(/controller\: BookCtrl/);
|
||||||
|
expect(content).toMatch(/Book Id\: Scarlet/);
|
||||||
|
});
|
||||||
|
</file>
|
||||||
|
</example>
|
||||||
|
*/
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @ngdoc event
|
||||||
|
* @name ngView#$viewContentLoaded
|
||||||
|
* @eventType emit on the current ngView scope
|
||||||
|
* @description
|
||||||
|
* Emitted every time the ngView content is reloaded.
|
||||||
|
*/
|
||||||
|
ngViewFactory.$inject = ['$route', '$anchorScroll', '$animate'];
|
||||||
|
function ngViewFactory( $route, $anchorScroll, $animate) {
|
||||||
|
return {
|
||||||
|
restrict: 'ECA',
|
||||||
|
terminal: true,
|
||||||
|
priority: 400,
|
||||||
|
transclude: 'element',
|
||||||
|
link: function(scope, $element, attr, ctrl, $transclude) {
|
||||||
|
var currentScope,
|
||||||
|
currentElement,
|
||||||
|
previousElement,
|
||||||
|
autoScrollExp = attr.autoscroll,
|
||||||
|
onloadExp = attr.onload || '';
|
||||||
|
|
||||||
|
scope.$on('$routeChangeSuccess', update);
|
||||||
|
update();
|
||||||
|
|
||||||
|
function cleanupLastView() {
|
||||||
|
if(previousElement) {
|
||||||
|
previousElement.remove();
|
||||||
|
previousElement = null;
|
||||||
|
}
|
||||||
|
if(currentScope) {
|
||||||
|
currentScope.$destroy();
|
||||||
|
currentScope = null;
|
||||||
|
}
|
||||||
|
if(currentElement) {
|
||||||
|
$animate.leave(currentElement, function() {
|
||||||
|
previousElement = null;
|
||||||
|
});
|
||||||
|
previousElement = currentElement;
|
||||||
|
currentElement = null;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
function update() {
|
||||||
|
var locals = $route.current && $route.current.locals,
|
||||||
|
template = locals && locals.$template;
|
||||||
|
|
||||||
|
if (angular.isDefined(template)) {
|
||||||
|
var newScope = scope.$new();
|
||||||
|
var current = $route.current;
|
||||||
|
|
||||||
|
// Note: This will also link all children of ng-view that were contained in the original
|
||||||
|
// html. If that content contains controllers, ... they could pollute/change the scope.
|
||||||
|
// However, using ng-view on an element with additional content does not make sense...
|
||||||
|
// Note: We can't remove them in the cloneAttchFn of $transclude as that
|
||||||
|
// function is called before linking the content, which would apply child
|
||||||
|
// directives to non existing elements.
|
||||||
|
var clone = $transclude(newScope, function(clone) {
|
||||||
|
$animate.enter(clone, null, currentElement || $element, function onNgViewEnter () {
|
||||||
|
if (angular.isDefined(autoScrollExp)
|
||||||
|
&& (!autoScrollExp || scope.$eval(autoScrollExp))) {
|
||||||
|
$anchorScroll();
|
||||||
|
}
|
||||||
|
});
|
||||||
|
cleanupLastView();
|
||||||
|
});
|
||||||
|
|
||||||
|
currentElement = clone;
|
||||||
|
currentScope = current.scope = newScope;
|
||||||
|
currentScope.$emit('$viewContentLoaded');
|
||||||
|
currentScope.$eval(onloadExp);
|
||||||
|
} else {
|
||||||
|
cleanupLastView();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
// This directive is called during the $transclude call of the first `ngView` directive.
|
||||||
|
// It will replace and compile the content of the element with the loaded template.
|
||||||
|
// We need this directive so that the element content is already filled when
|
||||||
|
// the link function of another directive on the same element as ngView
|
||||||
|
// is called.
|
||||||
|
ngViewFillContentFactory.$inject = ['$compile', '$controller', '$route'];
|
||||||
|
function ngViewFillContentFactory($compile, $controller, $route) {
|
||||||
|
return {
|
||||||
|
restrict: 'ECA',
|
||||||
|
priority: -400,
|
||||||
|
link: function(scope, $element) {
|
||||||
|
var current = $route.current,
|
||||||
|
locals = current.locals;
|
||||||
|
|
||||||
|
$element.html(locals.$template);
|
||||||
|
|
||||||
|
var link = $compile($element.contents());
|
||||||
|
|
||||||
|
if (current.controller) {
|
||||||
|
locals.$scope = scope;
|
||||||
|
var controller = $controller(current.controller, locals);
|
||||||
|
if (current.controllerAs) {
|
||||||
|
scope[current.controllerAs] = controller;
|
||||||
|
}
|
||||||
|
$element.data('$ngControllerController', controller);
|
||||||
|
$element.children().data('$ngControllerController', controller);
|
||||||
|
}
|
||||||
|
|
||||||
|
link(scope);
|
||||||
|
}
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
})(window, window.angular);
|
|
@ -0,0 +1,14 @@
|
||||||
|
/*
|
||||||
|
AngularJS v1.2.16
|
||||||
|
(c) 2010-2014 Google, Inc. http://angularjs.org
|
||||||
|
License: MIT
|
||||||
|
*/
|
||||||
|
(function(n,e,A){'use strict';function x(s,g,k){return{restrict:"ECA",terminal:!0,priority:400,transclude:"element",link:function(a,c,b,f,w){function y(){p&&(p.remove(),p=null);h&&(h.$destroy(),h=null);l&&(k.leave(l,function(){p=null}),p=l,l=null)}function v(){var b=s.current&&s.current.locals;if(e.isDefined(b&&b.$template)){var b=a.$new(),d=s.current;l=w(b,function(d){k.enter(d,null,l||c,function(){!e.isDefined(t)||t&&!a.$eval(t)||g()});y()});h=d.scope=b;h.$emit("$viewContentLoaded");h.$eval(u)}else y()}
|
||||||
|
var h,l,p,t=b.autoscroll,u=b.onload||"";a.$on("$routeChangeSuccess",v);v()}}}function z(e,g,k){return{restrict:"ECA",priority:-400,link:function(a,c){var b=k.current,f=b.locals;c.html(f.$template);var w=e(c.contents());b.controller&&(f.$scope=a,f=g(b.controller,f),b.controllerAs&&(a[b.controllerAs]=f),c.data("$ngControllerController",f),c.children().data("$ngControllerController",f));w(a)}}}n=e.module("ngRoute",["ng"]).provider("$route",function(){function s(a,c){return e.extend(new (e.extend(function(){},
|
||||||
|
{prototype:a})),c)}function g(a,e){var b=e.caseInsensitiveMatch,f={originalPath:a,regexp:a},k=f.keys=[];a=a.replace(/([().])/g,"\\$1").replace(/(\/)?:(\w+)([\?\*])?/g,function(a,e,b,c){a="?"===c?c:null;c="*"===c?c:null;k.push({name:b,optional:!!a});e=e||"";return""+(a?"":e)+"(?:"+(a?e:"")+(c&&"(.+?)"||"([^/]+)")+(a||"")+")"+(a||"")}).replace(/([\/$\*])/g,"\\$1");f.regexp=RegExp("^"+a+"$",b?"i":"");return f}var k={};this.when=function(a,c){k[a]=e.extend({reloadOnSearch:!0},c,a&&g(a,c));if(a){var b=
|
||||||
|
"/"==a[a.length-1]?a.substr(0,a.length-1):a+"/";k[b]=e.extend({redirectTo:a},g(b,c))}return this};this.otherwise=function(a){this.when(null,a);return this};this.$get=["$rootScope","$location","$routeParams","$q","$injector","$http","$templateCache","$sce",function(a,c,b,f,g,n,v,h){function l(){var d=p(),m=r.current;if(d&&m&&d.$$route===m.$$route&&e.equals(d.pathParams,m.pathParams)&&!d.reloadOnSearch&&!u)m.params=d.params,e.copy(m.params,b),a.$broadcast("$routeUpdate",m);else if(d||m)u=!1,a.$broadcast("$routeChangeStart",
|
||||||
|
d,m),(r.current=d)&&d.redirectTo&&(e.isString(d.redirectTo)?c.path(t(d.redirectTo,d.params)).search(d.params).replace():c.url(d.redirectTo(d.pathParams,c.path(),c.search())).replace()),f.when(d).then(function(){if(d){var a=e.extend({},d.resolve),c,b;e.forEach(a,function(d,c){a[c]=e.isString(d)?g.get(d):g.invoke(d)});e.isDefined(c=d.template)?e.isFunction(c)&&(c=c(d.params)):e.isDefined(b=d.templateUrl)&&(e.isFunction(b)&&(b=b(d.params)),b=h.getTrustedResourceUrl(b),e.isDefined(b)&&(d.loadedTemplateUrl=
|
||||||
|
b,c=n.get(b,{cache:v}).then(function(a){return a.data})));e.isDefined(c)&&(a.$template=c);return f.all(a)}}).then(function(c){d==r.current&&(d&&(d.locals=c,e.copy(d.params,b)),a.$broadcast("$routeChangeSuccess",d,m))},function(c){d==r.current&&a.$broadcast("$routeChangeError",d,m,c)})}function p(){var a,b;e.forEach(k,function(f,k){var q;if(q=!b){var g=c.path();q=f.keys;var l={};if(f.regexp)if(g=f.regexp.exec(g)){for(var h=1,p=g.length;h<p;++h){var n=q[h-1],r="string"==typeof g[h]?decodeURIComponent(g[h]):
|
||||||
|
g[h];n&&r&&(l[n.name]=r)}q=l}else q=null;else q=null;q=a=q}q&&(b=s(f,{params:e.extend({},c.search(),a),pathParams:a}),b.$$route=f)});return b||k[null]&&s(k[null],{params:{},pathParams:{}})}function t(a,c){var b=[];e.forEach((a||"").split(":"),function(a,d){if(0===d)b.push(a);else{var e=a.match(/(\w+)(.*)/),f=e[1];b.push(c[f]);b.push(e[2]||"");delete c[f]}});return b.join("")}var u=!1,r={routes:k,reload:function(){u=!0;a.$evalAsync(l)}};a.$on("$locationChangeSuccess",l);return r}]});n.provider("$routeParams",
|
||||||
|
function(){this.$get=function(){return{}}});n.directive("ngView",x);n.directive("ngView",z);x.$inject=["$route","$anchorScroll","$animate"];z.$inject=["$compile","$controller","$route"]})(window,window.angular);
|
||||||
|
//# sourceMappingURL=angular-route.min.js.map
|
Различия файлов скрыты, потому что одна или несколько строк слишком длинны
|
@ -0,0 +1,8 @@
|
||||||
|
{
|
||||||
|
"name": "angular-route",
|
||||||
|
"version": "1.2.16",
|
||||||
|
"main": "./angular-route.js",
|
||||||
|
"dependencies": {
|
||||||
|
"angular": "1.2.16"
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,19 @@
|
||||||
|
{
|
||||||
|
"name": "angular-sanitize",
|
||||||
|
"version": "1.2.16",
|
||||||
|
"main": "./angular-sanitize.js",
|
||||||
|
"dependencies": {
|
||||||
|
"angular": "1.2.16"
|
||||||
|
},
|
||||||
|
"homepage": "https://github.com/angular/bower-angular-sanitize",
|
||||||
|
"_release": "1.2.16",
|
||||||
|
"_resolution": {
|
||||||
|
"type": "version",
|
||||||
|
"tag": "v1.2.16",
|
||||||
|
"commit": "0534ccd6bb2b7b6e5d0fa6c27fd3277f312a4347"
|
||||||
|
},
|
||||||
|
"_source": "git://github.com/angular/bower-angular-sanitize.git",
|
||||||
|
"_target": "~1.2.16",
|
||||||
|
"_originalSource": "angular-sanitize",
|
||||||
|
"_direct": true
|
||||||
|
}
|
|
@ -0,0 +1,54 @@
|
||||||
|
# bower-angular-sanitize
|
||||||
|
|
||||||
|
This repo is for distribution on `bower`. The source for this module is in the
|
||||||
|
[main AngularJS repo](https://github.com/angular/angular.js/tree/master/src/ngSanitize).
|
||||||
|
Please file issues and pull requests against that repo.
|
||||||
|
|
||||||
|
## Install
|
||||||
|
|
||||||
|
Install with `bower`:
|
||||||
|
|
||||||
|
```shell
|
||||||
|
bower install angular-sanitize
|
||||||
|
```
|
||||||
|
|
||||||
|
Add a `<script>` to your `index.html`:
|
||||||
|
|
||||||
|
```html
|
||||||
|
<script src="/bower_components/angular-sanitize/angular-sanitize.js"></script>
|
||||||
|
```
|
||||||
|
|
||||||
|
And add `ngSanitize` as a dependency for your app:
|
||||||
|
|
||||||
|
```javascript
|
||||||
|
angular.module('myApp', ['ngSanitize']);
|
||||||
|
```
|
||||||
|
|
||||||
|
## Documentation
|
||||||
|
|
||||||
|
Documentation is available on the
|
||||||
|
[AngularJS docs site](http://docs.angularjs.org/api/ngSanitize).
|
||||||
|
|
||||||
|
## License
|
||||||
|
|
||||||
|
The MIT License
|
||||||
|
|
||||||
|
Copyright (c) 2010-2012 Google, Inc. http://angularjs.org
|
||||||
|
|
||||||
|
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.
|
|
@ -0,0 +1,624 @@
|
||||||
|
/**
|
||||||
|
* @license AngularJS v1.2.16
|
||||||
|
* (c) 2010-2014 Google, Inc. http://angularjs.org
|
||||||
|
* License: MIT
|
||||||
|
*/
|
||||||
|
(function(window, angular, undefined) {'use strict';
|
||||||
|
|
||||||
|
var $sanitizeMinErr = angular.$$minErr('$sanitize');
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @ngdoc module
|
||||||
|
* @name ngSanitize
|
||||||
|
* @description
|
||||||
|
*
|
||||||
|
* # ngSanitize
|
||||||
|
*
|
||||||
|
* The `ngSanitize` module provides functionality to sanitize HTML.
|
||||||
|
*
|
||||||
|
*
|
||||||
|
* <div doc-module-components="ngSanitize"></div>
|
||||||
|
*
|
||||||
|
* See {@link ngSanitize.$sanitize `$sanitize`} for usage.
|
||||||
|
*/
|
||||||
|
|
||||||
|
/*
|
||||||
|
* HTML Parser By Misko Hevery (misko@hevery.com)
|
||||||
|
* based on: HTML Parser By John Resig (ejohn.org)
|
||||||
|
* Original code by Erik Arvidsson, Mozilla Public License
|
||||||
|
* http://erik.eae.net/simplehtmlparser/simplehtmlparser.js
|
||||||
|
*
|
||||||
|
* // Use like so:
|
||||||
|
* htmlParser(htmlString, {
|
||||||
|
* start: function(tag, attrs, unary) {},
|
||||||
|
* end: function(tag) {},
|
||||||
|
* chars: function(text) {},
|
||||||
|
* comment: function(text) {}
|
||||||
|
* });
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @ngdoc service
|
||||||
|
* @name $sanitize
|
||||||
|
* @function
|
||||||
|
*
|
||||||
|
* @description
|
||||||
|
* The input is sanitized by parsing the html into tokens. All safe tokens (from a whitelist) are
|
||||||
|
* then serialized back to properly escaped html string. This means that no unsafe input can make
|
||||||
|
* it into the returned string, however, since our parser is more strict than a typical browser
|
||||||
|
* parser, it's possible that some obscure input, which would be recognized as valid HTML by a
|
||||||
|
* browser, won't make it through the sanitizer.
|
||||||
|
* The whitelist is configured using the functions `aHrefSanitizationWhitelist` and
|
||||||
|
* `imgSrcSanitizationWhitelist` of {@link ng.$compileProvider `$compileProvider`}.
|
||||||
|
*
|
||||||
|
* @param {string} html Html input.
|
||||||
|
* @returns {string} Sanitized html.
|
||||||
|
*
|
||||||
|
* @example
|
||||||
|
<example module="ngSanitize" deps="angular-sanitize.js">
|
||||||
|
<file name="index.html">
|
||||||
|
<script>
|
||||||
|
function Ctrl($scope, $sce) {
|
||||||
|
$scope.snippet =
|
||||||
|
'<p style="color:blue">an html\n' +
|
||||||
|
'<em onmouseover="this.textContent=\'PWN3D!\'">click here</em>\n' +
|
||||||
|
'snippet</p>';
|
||||||
|
$scope.deliberatelyTrustDangerousSnippet = function() {
|
||||||
|
return $sce.trustAsHtml($scope.snippet);
|
||||||
|
};
|
||||||
|
}
|
||||||
|
</script>
|
||||||
|
<div ng-controller="Ctrl">
|
||||||
|
Snippet: <textarea ng-model="snippet" cols="60" rows="3"></textarea>
|
||||||
|
<table>
|
||||||
|
<tr>
|
||||||
|
<td>Directive</td>
|
||||||
|
<td>How</td>
|
||||||
|
<td>Source</td>
|
||||||
|
<td>Rendered</td>
|
||||||
|
</tr>
|
||||||
|
<tr id="bind-html-with-sanitize">
|
||||||
|
<td>ng-bind-html</td>
|
||||||
|
<td>Automatically uses $sanitize</td>
|
||||||
|
<td><pre><div ng-bind-html="snippet"><br/></div></pre></td>
|
||||||
|
<td><div ng-bind-html="snippet"></div></td>
|
||||||
|
</tr>
|
||||||
|
<tr id="bind-html-with-trust">
|
||||||
|
<td>ng-bind-html</td>
|
||||||
|
<td>Bypass $sanitize by explicitly trusting the dangerous value</td>
|
||||||
|
<td>
|
||||||
|
<pre><div ng-bind-html="deliberatelyTrustDangerousSnippet()">
|
||||||
|
</div></pre>
|
||||||
|
</td>
|
||||||
|
<td><div ng-bind-html="deliberatelyTrustDangerousSnippet()"></div></td>
|
||||||
|
</tr>
|
||||||
|
<tr id="bind-default">
|
||||||
|
<td>ng-bind</td>
|
||||||
|
<td>Automatically escapes</td>
|
||||||
|
<td><pre><div ng-bind="snippet"><br/></div></pre></td>
|
||||||
|
<td><div ng-bind="snippet"></div></td>
|
||||||
|
</tr>
|
||||||
|
</table>
|
||||||
|
</div>
|
||||||
|
</file>
|
||||||
|
<file name="protractor.js" type="protractor">
|
||||||
|
it('should sanitize the html snippet by default', function() {
|
||||||
|
expect(element(by.css('#bind-html-with-sanitize div')).getInnerHtml()).
|
||||||
|
toBe('<p>an html\n<em>click here</em>\nsnippet</p>');
|
||||||
|
});
|
||||||
|
|
||||||
|
it('should inline raw snippet if bound to a trusted value', function() {
|
||||||
|
expect(element(by.css('#bind-html-with-trust div')).getInnerHtml()).
|
||||||
|
toBe("<p style=\"color:blue\">an html\n" +
|
||||||
|
"<em onmouseover=\"this.textContent='PWN3D!'\">click here</em>\n" +
|
||||||
|
"snippet</p>");
|
||||||
|
});
|
||||||
|
|
||||||
|
it('should escape snippet without any filter', function() {
|
||||||
|
expect(element(by.css('#bind-default div')).getInnerHtml()).
|
||||||
|
toBe("<p style=\"color:blue\">an html\n" +
|
||||||
|
"<em onmouseover=\"this.textContent='PWN3D!'\">click here</em>\n" +
|
||||||
|
"snippet</p>");
|
||||||
|
});
|
||||||
|
|
||||||
|
it('should update', function() {
|
||||||
|
element(by.model('snippet')).clear();
|
||||||
|
element(by.model('snippet')).sendKeys('new <b onclick="alert(1)">text</b>');
|
||||||
|
expect(element(by.css('#bind-html-with-sanitize div')).getInnerHtml()).
|
||||||
|
toBe('new <b>text</b>');
|
||||||
|
expect(element(by.css('#bind-html-with-trust div')).getInnerHtml()).toBe(
|
||||||
|
'new <b onclick="alert(1)">text</b>');
|
||||||
|
expect(element(by.css('#bind-default div')).getInnerHtml()).toBe(
|
||||||
|
"new <b onclick=\"alert(1)\">text</b>");
|
||||||
|
});
|
||||||
|
</file>
|
||||||
|
</example>
|
||||||
|
*/
|
||||||
|
function $SanitizeProvider() {
|
||||||
|
this.$get = ['$$sanitizeUri', function($$sanitizeUri) {
|
||||||
|
return function(html) {
|
||||||
|
var buf = [];
|
||||||
|
htmlParser(html, htmlSanitizeWriter(buf, function(uri, isImage) {
|
||||||
|
return !/^unsafe/.test($$sanitizeUri(uri, isImage));
|
||||||
|
}));
|
||||||
|
return buf.join('');
|
||||||
|
};
|
||||||
|
}];
|
||||||
|
}
|
||||||
|
|
||||||
|
function sanitizeText(chars) {
|
||||||
|
var buf = [];
|
||||||
|
var writer = htmlSanitizeWriter(buf, angular.noop);
|
||||||
|
writer.chars(chars);
|
||||||
|
return buf.join('');
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
// Regular Expressions for parsing tags and attributes
|
||||||
|
var START_TAG_REGEXP =
|
||||||
|
/^<\s*([\w:-]+)((?:\s+[\w:-]+(?:\s*=\s*(?:(?:"[^"]*")|(?:'[^']*')|[^>\s]+))?)*)\s*(\/?)\s*>/,
|
||||||
|
END_TAG_REGEXP = /^<\s*\/\s*([\w:-]+)[^>]*>/,
|
||||||
|
ATTR_REGEXP = /([\w:-]+)(?:\s*=\s*(?:(?:"((?:[^"])*)")|(?:'((?:[^'])*)')|([^>\s]+)))?/g,
|
||||||
|
BEGIN_TAG_REGEXP = /^</,
|
||||||
|
BEGING_END_TAGE_REGEXP = /^<\s*\//,
|
||||||
|
COMMENT_REGEXP = /<!--(.*?)-->/g,
|
||||||
|
DOCTYPE_REGEXP = /<!DOCTYPE([^>]*?)>/i,
|
||||||
|
CDATA_REGEXP = /<!\[CDATA\[(.*?)]]>/g,
|
||||||
|
// Match everything outside of normal chars and " (quote character)
|
||||||
|
NON_ALPHANUMERIC_REGEXP = /([^\#-~| |!])/g;
|
||||||
|
|
||||||
|
|
||||||
|
// Good source of info about elements and attributes
|
||||||
|
// http://dev.w3.org/html5/spec/Overview.html#semantics
|
||||||
|
// http://simon.html5.org/html-elements
|
||||||
|
|
||||||
|
// Safe Void Elements - HTML5
|
||||||
|
// http://dev.w3.org/html5/spec/Overview.html#void-elements
|
||||||
|
var voidElements = makeMap("area,br,col,hr,img,wbr");
|
||||||
|
|
||||||
|
// Elements that you can, intentionally, leave open (and which close themselves)
|
||||||
|
// http://dev.w3.org/html5/spec/Overview.html#optional-tags
|
||||||
|
var optionalEndTagBlockElements = makeMap("colgroup,dd,dt,li,p,tbody,td,tfoot,th,thead,tr"),
|
||||||
|
optionalEndTagInlineElements = makeMap("rp,rt"),
|
||||||
|
optionalEndTagElements = angular.extend({},
|
||||||
|
optionalEndTagInlineElements,
|
||||||
|
optionalEndTagBlockElements);
|
||||||
|
|
||||||
|
// Safe Block Elements - HTML5
|
||||||
|
var blockElements = angular.extend({}, optionalEndTagBlockElements, makeMap("address,article," +
|
||||||
|
"aside,blockquote,caption,center,del,dir,div,dl,figure,figcaption,footer,h1,h2,h3,h4,h5," +
|
||||||
|
"h6,header,hgroup,hr,ins,map,menu,nav,ol,pre,script,section,table,ul"));
|
||||||
|
|
||||||
|
// Inline Elements - HTML5
|
||||||
|
var inlineElements = angular.extend({}, optionalEndTagInlineElements, makeMap("a,abbr,acronym,b," +
|
||||||
|
"bdi,bdo,big,br,cite,code,del,dfn,em,font,i,img,ins,kbd,label,map,mark,q,ruby,rp,rt,s," +
|
||||||
|
"samp,small,span,strike,strong,sub,sup,time,tt,u,var"));
|
||||||
|
|
||||||
|
|
||||||
|
// Special Elements (can contain anything)
|
||||||
|
var specialElements = makeMap("script,style");
|
||||||
|
|
||||||
|
var validElements = angular.extend({},
|
||||||
|
voidElements,
|
||||||
|
blockElements,
|
||||||
|
inlineElements,
|
||||||
|
optionalEndTagElements);
|
||||||
|
|
||||||
|
//Attributes that have href and hence need to be sanitized
|
||||||
|
var uriAttrs = makeMap("background,cite,href,longdesc,src,usemap");
|
||||||
|
var validAttrs = angular.extend({}, uriAttrs, makeMap(
|
||||||
|
'abbr,align,alt,axis,bgcolor,border,cellpadding,cellspacing,class,clear,'+
|
||||||
|
'color,cols,colspan,compact,coords,dir,face,headers,height,hreflang,hspace,'+
|
||||||
|
'ismap,lang,language,nohref,nowrap,rel,rev,rows,rowspan,rules,'+
|
||||||
|
'scope,scrolling,shape,size,span,start,summary,target,title,type,'+
|
||||||
|
'valign,value,vspace,width'));
|
||||||
|
|
||||||
|
function makeMap(str) {
|
||||||
|
var obj = {}, items = str.split(','), i;
|
||||||
|
for (i = 0; i < items.length; i++) obj[items[i]] = true;
|
||||||
|
return obj;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @example
|
||||||
|
* htmlParser(htmlString, {
|
||||||
|
* start: function(tag, attrs, unary) {},
|
||||||
|
* end: function(tag) {},
|
||||||
|
* chars: function(text) {},
|
||||||
|
* comment: function(text) {}
|
||||||
|
* });
|
||||||
|
*
|
||||||
|
* @param {string} html string
|
||||||
|
* @param {object} handler
|
||||||
|
*/
|
||||||
|
function htmlParser( html, handler ) {
|
||||||
|
var index, chars, match, stack = [], last = html;
|
||||||
|
stack.last = function() { return stack[ stack.length - 1 ]; };
|
||||||
|
|
||||||
|
while ( html ) {
|
||||||
|
chars = true;
|
||||||
|
|
||||||
|
// Make sure we're not in a script or style element
|
||||||
|
if ( !stack.last() || !specialElements[ stack.last() ] ) {
|
||||||
|
|
||||||
|
// Comment
|
||||||
|
if ( html.indexOf("<!--") === 0 ) {
|
||||||
|
// comments containing -- are not allowed unless they terminate the comment
|
||||||
|
index = html.indexOf("--", 4);
|
||||||
|
|
||||||
|
if ( index >= 0 && html.lastIndexOf("-->", index) === index) {
|
||||||
|
if (handler.comment) handler.comment( html.substring( 4, index ) );
|
||||||
|
html = html.substring( index + 3 );
|
||||||
|
chars = false;
|
||||||
|
}
|
||||||
|
// DOCTYPE
|
||||||
|
} else if ( DOCTYPE_REGEXP.test(html) ) {
|
||||||
|
match = html.match( DOCTYPE_REGEXP );
|
||||||
|
|
||||||
|
if ( match ) {
|
||||||
|
html = html.replace( match[0], '');
|
||||||
|
chars = false;
|
||||||
|
}
|
||||||
|
// end tag
|
||||||
|
} else if ( BEGING_END_TAGE_REGEXP.test(html) ) {
|
||||||
|
match = html.match( END_TAG_REGEXP );
|
||||||
|
|
||||||
|
if ( match ) {
|
||||||
|
html = html.substring( match[0].length );
|
||||||
|
match[0].replace( END_TAG_REGEXP, parseEndTag );
|
||||||
|
chars = false;
|
||||||
|
}
|
||||||
|
|
||||||
|
// start tag
|
||||||
|
} else if ( BEGIN_TAG_REGEXP.test(html) ) {
|
||||||
|
match = html.match( START_TAG_REGEXP );
|
||||||
|
|
||||||
|
if ( match ) {
|
||||||
|
html = html.substring( match[0].length );
|
||||||
|
match[0].replace( START_TAG_REGEXP, parseStartTag );
|
||||||
|
chars = false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if ( chars ) {
|
||||||
|
index = html.indexOf("<");
|
||||||
|
|
||||||
|
var text = index < 0 ? html : html.substring( 0, index );
|
||||||
|
html = index < 0 ? "" : html.substring( index );
|
||||||
|
|
||||||
|
if (handler.chars) handler.chars( decodeEntities(text) );
|
||||||
|
}
|
||||||
|
|
||||||
|
} else {
|
||||||
|
html = html.replace(new RegExp("(.*)<\\s*\\/\\s*" + stack.last() + "[^>]*>", 'i'),
|
||||||
|
function(all, text){
|
||||||
|
text = text.replace(COMMENT_REGEXP, "$1").replace(CDATA_REGEXP, "$1");
|
||||||
|
|
||||||
|
if (handler.chars) handler.chars( decodeEntities(text) );
|
||||||
|
|
||||||
|
return "";
|
||||||
|
});
|
||||||
|
|
||||||
|
parseEndTag( "", stack.last() );
|
||||||
|
}
|
||||||
|
|
||||||
|
if ( html == last ) {
|
||||||
|
throw $sanitizeMinErr('badparse', "The sanitizer was unable to parse the following block " +
|
||||||
|
"of html: {0}", html);
|
||||||
|
}
|
||||||
|
last = html;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Clean up any remaining tags
|
||||||
|
parseEndTag();
|
||||||
|
|
||||||
|
function parseStartTag( tag, tagName, rest, unary ) {
|
||||||
|
tagName = angular.lowercase(tagName);
|
||||||
|
if ( blockElements[ tagName ] ) {
|
||||||
|
while ( stack.last() && inlineElements[ stack.last() ] ) {
|
||||||
|
parseEndTag( "", stack.last() );
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if ( optionalEndTagElements[ tagName ] && stack.last() == tagName ) {
|
||||||
|
parseEndTag( "", tagName );
|
||||||
|
}
|
||||||
|
|
||||||
|
unary = voidElements[ tagName ] || !!unary;
|
||||||
|
|
||||||
|
if ( !unary )
|
||||||
|
stack.push( tagName );
|
||||||
|
|
||||||
|
var attrs = {};
|
||||||
|
|
||||||
|
rest.replace(ATTR_REGEXP,
|
||||||
|
function(match, name, doubleQuotedValue, singleQuotedValue, unquotedValue) {
|
||||||
|
var value = doubleQuotedValue
|
||||||
|
|| singleQuotedValue
|
||||||
|
|| unquotedValue
|
||||||
|
|| '';
|
||||||
|
|
||||||
|
attrs[name] = decodeEntities(value);
|
||||||
|
});
|
||||||
|
if (handler.start) handler.start( tagName, attrs, unary );
|
||||||
|
}
|
||||||
|
|
||||||
|
function parseEndTag( tag, tagName ) {
|
||||||
|
var pos = 0, i;
|
||||||
|
tagName = angular.lowercase(tagName);
|
||||||
|
if ( tagName )
|
||||||
|
// Find the closest opened tag of the same type
|
||||||
|
for ( pos = stack.length - 1; pos >= 0; pos-- )
|
||||||
|
if ( stack[ pos ] == tagName )
|
||||||
|
break;
|
||||||
|
|
||||||
|
if ( pos >= 0 ) {
|
||||||
|
// Close all the open elements, up the stack
|
||||||
|
for ( i = stack.length - 1; i >= pos; i-- )
|
||||||
|
if (handler.end) handler.end( stack[ i ] );
|
||||||
|
|
||||||
|
// Remove the open elements from the stack
|
||||||
|
stack.length = pos;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
var hiddenPre=document.createElement("pre");
|
||||||
|
var spaceRe = /^(\s*)([\s\S]*?)(\s*)$/;
|
||||||
|
/**
|
||||||
|
* decodes all entities into regular string
|
||||||
|
* @param value
|
||||||
|
* @returns {string} A string with decoded entities.
|
||||||
|
*/
|
||||||
|
function decodeEntities(value) {
|
||||||
|
if (!value) { return ''; }
|
||||||
|
|
||||||
|
// Note: IE8 does not preserve spaces at the start/end of innerHTML
|
||||||
|
// so we must capture them and reattach them afterward
|
||||||
|
var parts = spaceRe.exec(value);
|
||||||
|
var spaceBefore = parts[1];
|
||||||
|
var spaceAfter = parts[3];
|
||||||
|
var content = parts[2];
|
||||||
|
if (content) {
|
||||||
|
hiddenPre.innerHTML=content.replace(/</g,"<");
|
||||||
|
// innerText depends on styling as it doesn't display hidden elements.
|
||||||
|
// Therefore, it's better to use textContent not to cause unnecessary
|
||||||
|
// reflows. However, IE<9 don't support textContent so the innerText
|
||||||
|
// fallback is necessary.
|
||||||
|
content = 'textContent' in hiddenPre ?
|
||||||
|
hiddenPre.textContent : hiddenPre.innerText;
|
||||||
|
}
|
||||||
|
return spaceBefore + content + spaceAfter;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Escapes all potentially dangerous characters, so that the
|
||||||
|
* resulting string can be safely inserted into attribute or
|
||||||
|
* element text.
|
||||||
|
* @param value
|
||||||
|
* @returns {string} escaped text
|
||||||
|
*/
|
||||||
|
function encodeEntities(value) {
|
||||||
|
return value.
|
||||||
|
replace(/&/g, '&').
|
||||||
|
replace(NON_ALPHANUMERIC_REGEXP, function(value){
|
||||||
|
return '&#' + value.charCodeAt(0) + ';';
|
||||||
|
}).
|
||||||
|
replace(/</g, '<').
|
||||||
|
replace(/>/g, '>');
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* create an HTML/XML writer which writes to buffer
|
||||||
|
* @param {Array} buf use buf.jain('') to get out sanitized html string
|
||||||
|
* @returns {object} in the form of {
|
||||||
|
* start: function(tag, attrs, unary) {},
|
||||||
|
* end: function(tag) {},
|
||||||
|
* chars: function(text) {},
|
||||||
|
* comment: function(text) {}
|
||||||
|
* }
|
||||||
|
*/
|
||||||
|
function htmlSanitizeWriter(buf, uriValidator){
|
||||||
|
var ignore = false;
|
||||||
|
var out = angular.bind(buf, buf.push);
|
||||||
|
return {
|
||||||
|
start: function(tag, attrs, unary){
|
||||||
|
tag = angular.lowercase(tag);
|
||||||
|
if (!ignore && specialElements[tag]) {
|
||||||
|
ignore = tag;
|
||||||
|
}
|
||||||
|
if (!ignore && validElements[tag] === true) {
|
||||||
|
out('<');
|
||||||
|
out(tag);
|
||||||
|
angular.forEach(attrs, function(value, key){
|
||||||
|
var lkey=angular.lowercase(key);
|
||||||
|
var isImage = (tag === 'img' && lkey === 'src') || (lkey === 'background');
|
||||||
|
if (validAttrs[lkey] === true &&
|
||||||
|
(uriAttrs[lkey] !== true || uriValidator(value, isImage))) {
|
||||||
|
out(' ');
|
||||||
|
out(key);
|
||||||
|
out('="');
|
||||||
|
out(encodeEntities(value));
|
||||||
|
out('"');
|
||||||
|
}
|
||||||
|
});
|
||||||
|
out(unary ? '/>' : '>');
|
||||||
|
}
|
||||||
|
},
|
||||||
|
end: function(tag){
|
||||||
|
tag = angular.lowercase(tag);
|
||||||
|
if (!ignore && validElements[tag] === true) {
|
||||||
|
out('</');
|
||||||
|
out(tag);
|
||||||
|
out('>');
|
||||||
|
}
|
||||||
|
if (tag == ignore) {
|
||||||
|
ignore = false;
|
||||||
|
}
|
||||||
|
},
|
||||||
|
chars: function(chars){
|
||||||
|
if (!ignore) {
|
||||||
|
out(encodeEntities(chars));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
// define ngSanitize module and register $sanitize service
|
||||||
|
angular.module('ngSanitize', []).provider('$sanitize', $SanitizeProvider);
|
||||||
|
|
||||||
|
/* global sanitizeText: false */
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @ngdoc filter
|
||||||
|
* @name linky
|
||||||
|
* @function
|
||||||
|
*
|
||||||
|
* @description
|
||||||
|
* Finds links in text input and turns them into html links. Supports http/https/ftp/mailto and
|
||||||
|
* plain email address links.
|
||||||
|
*
|
||||||
|
* Requires the {@link ngSanitize `ngSanitize`} module to be installed.
|
||||||
|
*
|
||||||
|
* @param {string} text Input text.
|
||||||
|
* @param {string} target Window (_blank|_self|_parent|_top) or named frame to open links in.
|
||||||
|
* @returns {string} Html-linkified text.
|
||||||
|
*
|
||||||
|
* @usage
|
||||||
|
<span ng-bind-html="linky_expression | linky"></span>
|
||||||
|
*
|
||||||
|
* @example
|
||||||
|
<example module="ngSanitize" deps="angular-sanitize.js">
|
||||||
|
<file name="index.html">
|
||||||
|
<script>
|
||||||
|
function Ctrl($scope) {
|
||||||
|
$scope.snippet =
|
||||||
|
'Pretty text with some links:\n'+
|
||||||
|
'http://angularjs.org/,\n'+
|
||||||
|
'mailto:us@somewhere.org,\n'+
|
||||||
|
'another@somewhere.org,\n'+
|
||||||
|
'and one more: ftp://127.0.0.1/.';
|
||||||
|
$scope.snippetWithTarget = 'http://angularjs.org/';
|
||||||
|
}
|
||||||
|
</script>
|
||||||
|
<div ng-controller="Ctrl">
|
||||||
|
Snippet: <textarea ng-model="snippet" cols="60" rows="3"></textarea>
|
||||||
|
<table>
|
||||||
|
<tr>
|
||||||
|
<td>Filter</td>
|
||||||
|
<td>Source</td>
|
||||||
|
<td>Rendered</td>
|
||||||
|
</tr>
|
||||||
|
<tr id="linky-filter">
|
||||||
|
<td>linky filter</td>
|
||||||
|
<td>
|
||||||
|
<pre><div ng-bind-html="snippet | linky"><br></div></pre>
|
||||||
|
</td>
|
||||||
|
<td>
|
||||||
|
<div ng-bind-html="snippet | linky"></div>
|
||||||
|
</td>
|
||||||
|
</tr>
|
||||||
|
<tr id="linky-target">
|
||||||
|
<td>linky target</td>
|
||||||
|
<td>
|
||||||
|
<pre><div ng-bind-html="snippetWithTarget | linky:'_blank'"><br></div></pre>
|
||||||
|
</td>
|
||||||
|
<td>
|
||||||
|
<div ng-bind-html="snippetWithTarget | linky:'_blank'"></div>
|
||||||
|
</td>
|
||||||
|
</tr>
|
||||||
|
<tr id="escaped-html">
|
||||||
|
<td>no filter</td>
|
||||||
|
<td><pre><div ng-bind="snippet"><br></div></pre></td>
|
||||||
|
<td><div ng-bind="snippet"></div></td>
|
||||||
|
</tr>
|
||||||
|
</table>
|
||||||
|
</file>
|
||||||
|
<file name="protractor.js" type="protractor">
|
||||||
|
it('should linkify the snippet with urls', function() {
|
||||||
|
expect(element(by.id('linky-filter')).element(by.binding('snippet | linky')).getText()).
|
||||||
|
toBe('Pretty text with some links: http://angularjs.org/, us@somewhere.org, ' +
|
||||||
|
'another@somewhere.org, and one more: ftp://127.0.0.1/.');
|
||||||
|
expect(element.all(by.css('#linky-filter a')).count()).toEqual(4);
|
||||||
|
});
|
||||||
|
|
||||||
|
it('should not linkify snippet without the linky filter', function() {
|
||||||
|
expect(element(by.id('escaped-html')).element(by.binding('snippet')).getText()).
|
||||||
|
toBe('Pretty text with some links: http://angularjs.org/, mailto:us@somewhere.org, ' +
|
||||||
|
'another@somewhere.org, and one more: ftp://127.0.0.1/.');
|
||||||
|
expect(element.all(by.css('#escaped-html a')).count()).toEqual(0);
|
||||||
|
});
|
||||||
|
|
||||||
|
it('should update', function() {
|
||||||
|
element(by.model('snippet')).clear();
|
||||||
|
element(by.model('snippet')).sendKeys('new http://link.');
|
||||||
|
expect(element(by.id('linky-filter')).element(by.binding('snippet | linky')).getText()).
|
||||||
|
toBe('new http://link.');
|
||||||
|
expect(element.all(by.css('#linky-filter a')).count()).toEqual(1);
|
||||||
|
expect(element(by.id('escaped-html')).element(by.binding('snippet')).getText())
|
||||||
|
.toBe('new http://link.');
|
||||||
|
});
|
||||||
|
|
||||||
|
it('should work with the target property', function() {
|
||||||
|
expect(element(by.id('linky-target')).
|
||||||
|
element(by.binding("snippetWithTarget | linky:'_blank'")).getText()).
|
||||||
|
toBe('http://angularjs.org/');
|
||||||
|
expect(element(by.css('#linky-target a')).getAttribute('target')).toEqual('_blank');
|
||||||
|
});
|
||||||
|
</file>
|
||||||
|
</example>
|
||||||
|
*/
|
||||||
|
angular.module('ngSanitize').filter('linky', ['$sanitize', function($sanitize) {
|
||||||
|
var LINKY_URL_REGEXP =
|
||||||
|
/((ftp|https?):\/\/|(mailto:)?[A-Za-z0-9._%+-]+@)\S*[^\s.;,(){}<>]/,
|
||||||
|
MAILTO_REGEXP = /^mailto:/;
|
||||||
|
|
||||||
|
return function(text, target) {
|
||||||
|
if (!text) return text;
|
||||||
|
var match;
|
||||||
|
var raw = text;
|
||||||
|
var html = [];
|
||||||
|
var url;
|
||||||
|
var i;
|
||||||
|
while ((match = raw.match(LINKY_URL_REGEXP))) {
|
||||||
|
// We can not end in these as they are sometimes found at the end of the sentence
|
||||||
|
url = match[0];
|
||||||
|
// if we did not match ftp/http/mailto then assume mailto
|
||||||
|
if (match[2] == match[3]) url = 'mailto:' + url;
|
||||||
|
i = match.index;
|
||||||
|
addText(raw.substr(0, i));
|
||||||
|
addLink(url, match[0].replace(MAILTO_REGEXP, ''));
|
||||||
|
raw = raw.substring(i + match[0].length);
|
||||||
|
}
|
||||||
|
addText(raw);
|
||||||
|
return $sanitize(html.join(''));
|
||||||
|
|
||||||
|
function addText(text) {
|
||||||
|
if (!text) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
html.push(sanitizeText(text));
|
||||||
|
}
|
||||||
|
|
||||||
|
function addLink(url, text) {
|
||||||
|
html.push('<a ');
|
||||||
|
if (angular.isDefined(target)) {
|
||||||
|
html.push('target="');
|
||||||
|
html.push(target);
|
||||||
|
html.push('" ');
|
||||||
|
}
|
||||||
|
html.push('href="');
|
||||||
|
html.push(url);
|
||||||
|
html.push('">');
|
||||||
|
addText(text);
|
||||||
|
html.push('</a>');
|
||||||
|
}
|
||||||
|
};
|
||||||
|
}]);
|
||||||
|
|
||||||
|
|
||||||
|
})(window, window.angular);
|
|
@ -0,0 +1,14 @@
|
||||||
|
/*
|
||||||
|
AngularJS v1.2.16
|
||||||
|
(c) 2010-2014 Google, Inc. http://angularjs.org
|
||||||
|
License: MIT
|
||||||
|
*/
|
||||||
|
(function(p,h,q){'use strict';function E(a){var e=[];s(e,h.noop).chars(a);return e.join("")}function k(a){var e={};a=a.split(",");var d;for(d=0;d<a.length;d++)e[a[d]]=!0;return e}function F(a,e){function d(a,b,d,g){b=h.lowercase(b);if(t[b])for(;f.last()&&u[f.last()];)c("",f.last());v[b]&&f.last()==b&&c("",b);(g=w[b]||!!g)||f.push(b);var l={};d.replace(G,function(a,b,e,c,d){l[b]=r(e||c||d||"")});e.start&&e.start(b,l,g)}function c(a,b){var c=0,d;if(b=h.lowercase(b))for(c=f.length-1;0<=c&&f[c]!=b;c--);
|
||||||
|
if(0<=c){for(d=f.length-1;d>=c;d--)e.end&&e.end(f[d]);f.length=c}}var b,g,f=[],l=a;for(f.last=function(){return f[f.length-1]};a;){g=!0;if(f.last()&&x[f.last()])a=a.replace(RegExp("(.*)<\\s*\\/\\s*"+f.last()+"[^>]*>","i"),function(b,a){a=a.replace(H,"$1").replace(I,"$1");e.chars&&e.chars(r(a));return""}),c("",f.last());else{if(0===a.indexOf("\x3c!--"))b=a.indexOf("--",4),0<=b&&a.lastIndexOf("--\x3e",b)===b&&(e.comment&&e.comment(a.substring(4,b)),a=a.substring(b+3),g=!1);else if(y.test(a)){if(b=a.match(y))a=
|
||||||
|
a.replace(b[0],""),g=!1}else if(J.test(a)){if(b=a.match(z))a=a.substring(b[0].length),b[0].replace(z,c),g=!1}else K.test(a)&&(b=a.match(A))&&(a=a.substring(b[0].length),b[0].replace(A,d),g=!1);g&&(b=a.indexOf("<"),g=0>b?a:a.substring(0,b),a=0>b?"":a.substring(b),e.chars&&e.chars(r(g)))}if(a==l)throw L("badparse",a);l=a}c()}function r(a){if(!a)return"";var e=M.exec(a);a=e[1];var d=e[3];if(e=e[2])n.innerHTML=e.replace(/</g,"<"),e="textContent"in n?n.textContent:n.innerText;return a+e+d}function B(a){return a.replace(/&/g,
|
||||||
|
"&").replace(N,function(a){return"&#"+a.charCodeAt(0)+";"}).replace(/</g,"<").replace(/>/g,">")}function s(a,e){var d=!1,c=h.bind(a,a.push);return{start:function(a,g,f){a=h.lowercase(a);!d&&x[a]&&(d=a);d||!0!==C[a]||(c("<"),c(a),h.forEach(g,function(d,f){var g=h.lowercase(f),k="img"===a&&"src"===g||"background"===g;!0!==O[g]||!0===D[g]&&!e(d,k)||(c(" "),c(f),c('="'),c(B(d)),c('"'))}),c(f?"/>":">"))},end:function(a){a=h.lowercase(a);d||!0!==C[a]||(c("</"),c(a),c(">"));a==d&&(d=!1)},chars:function(a){d||
|
||||||
|
c(B(a))}}}var L=h.$$minErr("$sanitize"),A=/^<\s*([\w:-]+)((?:\s+[\w:-]+(?:\s*=\s*(?:(?:"[^"]*")|(?:'[^']*')|[^>\s]+))?)*)\s*(\/?)\s*>/,z=/^<\s*\/\s*([\w:-]+)[^>]*>/,G=/([\w:-]+)(?:\s*=\s*(?:(?:"((?:[^"])*)")|(?:'((?:[^'])*)')|([^>\s]+)))?/g,K=/^</,J=/^<\s*\//,H=/\x3c!--(.*?)--\x3e/g,y=/<!DOCTYPE([^>]*?)>/i,I=/<!\[CDATA\[(.*?)]]\x3e/g,N=/([^\#-~| |!])/g,w=k("area,br,col,hr,img,wbr");p=k("colgroup,dd,dt,li,p,tbody,td,tfoot,th,thead,tr");q=k("rp,rt");var v=h.extend({},q,p),t=h.extend({},p,k("address,article,aside,blockquote,caption,center,del,dir,div,dl,figure,figcaption,footer,h1,h2,h3,h4,h5,h6,header,hgroup,hr,ins,map,menu,nav,ol,pre,script,section,table,ul")),
|
||||||
|
u=h.extend({},q,k("a,abbr,acronym,b,bdi,bdo,big,br,cite,code,del,dfn,em,font,i,img,ins,kbd,label,map,mark,q,ruby,rp,rt,s,samp,small,span,strike,strong,sub,sup,time,tt,u,var")),x=k("script,style"),C=h.extend({},w,t,u,v),D=k("background,cite,href,longdesc,src,usemap"),O=h.extend({},D,k("abbr,align,alt,axis,bgcolor,border,cellpadding,cellspacing,class,clear,color,cols,colspan,compact,coords,dir,face,headers,height,hreflang,hspace,ismap,lang,language,nohref,nowrap,rel,rev,rows,rowspan,rules,scope,scrolling,shape,size,span,start,summary,target,title,type,valign,value,vspace,width")),
|
||||||
|
n=document.createElement("pre"),M=/^(\s*)([\s\S]*?)(\s*)$/;h.module("ngSanitize",[]).provider("$sanitize",function(){this.$get=["$$sanitizeUri",function(a){return function(e){var d=[];F(e,s(d,function(c,b){return!/^unsafe/.test(a(c,b))}));return d.join("")}}]});h.module("ngSanitize").filter("linky",["$sanitize",function(a){var e=/((ftp|https?):\/\/|(mailto:)?[A-Za-z0-9._%+-]+@)\S*[^\s.;,(){}<>]/,d=/^mailto:/;return function(c,b){function g(a){a&&m.push(E(a))}function f(a,c){m.push("<a ");h.isDefined(b)&&
|
||||||
|
(m.push('target="'),m.push(b),m.push('" '));m.push('href="');m.push(a);m.push('">');g(c);m.push("</a>")}if(!c)return c;for(var l,k=c,m=[],n,p;l=k.match(e);)n=l[0],l[2]==l[3]&&(n="mailto:"+n),p=l.index,g(k.substr(0,p)),f(n,l[0].replace(d,"")),k=k.substring(p+l[0].length);g(k);return a(m.join(""))}}])})(window,window.angular);
|
||||||
|
//# sourceMappingURL=angular-sanitize.min.js.map
|
Различия файлов скрыты, потому что одна или несколько строк слишком длинны
|
@ -0,0 +1,8 @@
|
||||||
|
{
|
||||||
|
"name": "angular-sanitize",
|
||||||
|
"version": "1.2.16",
|
||||||
|
"main": "./angular-sanitize.js",
|
||||||
|
"dependencies": {
|
||||||
|
"angular": "1.2.16"
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,16 @@
|
||||||
|
{
|
||||||
|
"name": "angular",
|
||||||
|
"version": "1.2.16",
|
||||||
|
"main": "./angular.js",
|
||||||
|
"dependencies": {},
|
||||||
|
"homepage": "https://github.com/angular/bower-angular",
|
||||||
|
"_release": "1.2.16",
|
||||||
|
"_resolution": {
|
||||||
|
"type": "version",
|
||||||
|
"tag": "v1.2.16",
|
||||||
|
"commit": "7ae38b4a0cfced157e3486a0d6e2d299601723bb"
|
||||||
|
},
|
||||||
|
"_source": "git://github.com/angular/bower-angular.git",
|
||||||
|
"_target": "1.2.16",
|
||||||
|
"_originalSource": "angular"
|
||||||
|
}
|
|
@ -0,0 +1,48 @@
|
||||||
|
# bower-angular
|
||||||
|
|
||||||
|
This repo is for distribution on `bower`. The source for this module is in the
|
||||||
|
[main AngularJS repo](https://github.com/angular/angular.js).
|
||||||
|
Please file issues and pull requests against that repo.
|
||||||
|
|
||||||
|
## Install
|
||||||
|
|
||||||
|
Install with `bower`:
|
||||||
|
|
||||||
|
```shell
|
||||||
|
bower install angular
|
||||||
|
```
|
||||||
|
|
||||||
|
Add a `<script>` to your `index.html`:
|
||||||
|
|
||||||
|
```html
|
||||||
|
<script src="/bower_components/angular/angular.js"></script>
|
||||||
|
```
|
||||||
|
|
||||||
|
## Documentation
|
||||||
|
|
||||||
|
Documentation is available on the
|
||||||
|
[AngularJS docs site](http://docs.angularjs.org/).
|
||||||
|
|
||||||
|
## License
|
||||||
|
|
||||||
|
The MIT License
|
||||||
|
|
||||||
|
Copyright (c) 2010-2012 Google, Inc. http://angularjs.org
|
||||||
|
|
||||||
|
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.
|
|
@ -0,0 +1,18 @@
|
||||||
|
/* Include this file in your html if you are using the CSP mode. */
|
||||||
|
|
||||||
|
@charset "UTF-8";
|
||||||
|
|
||||||
|
[ng\:cloak], [ng-cloak], [data-ng-cloak], [x-ng-cloak],
|
||||||
|
.ng-cloak, .x-ng-cloak,
|
||||||
|
.ng-hide {
|
||||||
|
display: none !important;
|
||||||
|
}
|
||||||
|
|
||||||
|
ng\:form {
|
||||||
|
display: block;
|
||||||
|
}
|
||||||
|
|
||||||
|
.ng-animate-block-transitions {
|
||||||
|
transition:0s all!important;
|
||||||
|
-webkit-transition:0s all!important;
|
||||||
|
}
|
Разница между файлами не показана из-за своего большого размера
Загрузить разницу
|
@ -0,0 +1,210 @@
|
||||||
|
/*
|
||||||
|
AngularJS v1.2.16
|
||||||
|
(c) 2010-2014 Google, Inc. http://angularjs.org
|
||||||
|
License: MIT
|
||||||
|
*/
|
||||||
|
(function(O,U,s){'use strict';function t(b){return function(){var a=arguments[0],c,a="["+(b?b+":":"")+a+"] http://errors.angularjs.org/1.2.16/"+(b?b+"/":"")+a;for(c=1;c<arguments.length;c++)a=a+(1==c?"?":"&")+"p"+(c-1)+"="+encodeURIComponent("function"==typeof arguments[c]?arguments[c].toString().replace(/ \{[\s\S]*$/,""):"undefined"==typeof arguments[c]?"undefined":"string"!=typeof arguments[c]?JSON.stringify(arguments[c]):arguments[c]);return Error(a)}}function ab(b){if(null==b||Ca(b))return!1;
|
||||||
|
var a=b.length;return 1===b.nodeType&&a?!0:w(b)||M(b)||0===a||"number"===typeof a&&0<a&&a-1 in b}function q(b,a,c){var d;if(b)if(P(b))for(d in b)"prototype"==d||("length"==d||"name"==d||b.hasOwnProperty&&!b.hasOwnProperty(d))||a.call(c,b[d],d);else if(b.forEach&&b.forEach!==q)b.forEach(a,c);else if(ab(b))for(d=0;d<b.length;d++)a.call(c,b[d],d);else for(d in b)b.hasOwnProperty(d)&&a.call(c,b[d],d);return b}function Qb(b){var a=[],c;for(c in b)b.hasOwnProperty(c)&&a.push(c);return a.sort()}function Sc(b,
|
||||||
|
a,c){for(var d=Qb(b),e=0;e<d.length;e++)a.call(c,b[d[e]],d[e]);return d}function Rb(b){return function(a,c){b(c,a)}}function bb(){for(var b=ka.length,a;b;){b--;a=ka[b].charCodeAt(0);if(57==a)return ka[b]="A",ka.join("");if(90==a)ka[b]="0";else return ka[b]=String.fromCharCode(a+1),ka.join("")}ka.unshift("0");return ka.join("")}function Sb(b,a){a?b.$$hashKey=a:delete b.$$hashKey}function D(b){var a=b.$$hashKey;q(arguments,function(a){a!==b&&q(a,function(a,c){b[c]=a})});Sb(b,a);return b}function Y(b){return parseInt(b,
|
||||||
|
10)}function Tb(b,a){return D(new (D(function(){},{prototype:b})),a)}function C(){}function Da(b){return b}function aa(b){return function(){return b}}function E(b){return"undefined"===typeof b}function B(b){return"undefined"!==typeof b}function X(b){return null!=b&&"object"===typeof b}function w(b){return"string"===typeof b}function vb(b){return"number"===typeof b}function Na(b){return"[object Date]"===wa.call(b)}function M(b){return"[object Array]"===wa.call(b)}function P(b){return"function"===typeof b}
|
||||||
|
function cb(b){return"[object RegExp]"===wa.call(b)}function Ca(b){return b&&b.document&&b.location&&b.alert&&b.setInterval}function Tc(b){return!(!b||!(b.nodeName||b.prop&&b.attr&&b.find))}function Uc(b,a,c){var d=[];q(b,function(b,g,f){d.push(a.call(c,b,g,f))});return d}function db(b,a){if(b.indexOf)return b.indexOf(a);for(var c=0;c<b.length;c++)if(a===b[c])return c;return-1}function Oa(b,a){var c=db(b,a);0<=c&&b.splice(c,1);return a}function ba(b,a){if(Ca(b)||b&&b.$evalAsync&&b.$watch)throw Pa("cpws");
|
||||||
|
if(a){if(b===a)throw Pa("cpi");if(M(b))for(var c=a.length=0;c<b.length;c++)a.push(ba(b[c]));else{c=a.$$hashKey;q(a,function(b,c){delete a[c]});for(var d in b)a[d]=ba(b[d]);Sb(a,c)}}else(a=b)&&(M(b)?a=ba(b,[]):Na(b)?a=new Date(b.getTime()):cb(b)?a=RegExp(b.source):X(b)&&(a=ba(b,{})));return a}function Ub(b,a){a=a||{};for(var c in b)!b.hasOwnProperty(c)||"$"===c.charAt(0)&&"$"===c.charAt(1)||(a[c]=b[c]);return a}function xa(b,a){if(b===a)return!0;if(null===b||null===a)return!1;if(b!==b&&a!==a)return!0;
|
||||||
|
var c=typeof b,d;if(c==typeof a&&"object"==c)if(M(b)){if(!M(a))return!1;if((c=b.length)==a.length){for(d=0;d<c;d++)if(!xa(b[d],a[d]))return!1;return!0}}else{if(Na(b))return Na(a)&&b.getTime()==a.getTime();if(cb(b)&&cb(a))return b.toString()==a.toString();if(b&&b.$evalAsync&&b.$watch||a&&a.$evalAsync&&a.$watch||Ca(b)||Ca(a)||M(a))return!1;c={};for(d in b)if("$"!==d.charAt(0)&&!P(b[d])){if(!xa(b[d],a[d]))return!1;c[d]=!0}for(d in a)if(!c.hasOwnProperty(d)&&"$"!==d.charAt(0)&&a[d]!==s&&!P(a[d]))return!1;
|
||||||
|
return!0}return!1}function Vb(){return U.securityPolicy&&U.securityPolicy.isActive||U.querySelector&&!(!U.querySelector("[ng-csp]")&&!U.querySelector("[data-ng-csp]"))}function eb(b,a){var c=2<arguments.length?ya.call(arguments,2):[];return!P(a)||a instanceof RegExp?a:c.length?function(){return arguments.length?a.apply(b,c.concat(ya.call(arguments,0))):a.apply(b,c)}:function(){return arguments.length?a.apply(b,arguments):a.call(b)}}function Vc(b,a){var c=a;"string"===typeof b&&"$"===b.charAt(0)?c=
|
||||||
|
s:Ca(a)?c="$WINDOW":a&&U===a?c="$DOCUMENT":a&&(a.$evalAsync&&a.$watch)&&(c="$SCOPE");return c}function qa(b,a){return"undefined"===typeof b?s:JSON.stringify(b,Vc,a?" ":null)}function Wb(b){return w(b)?JSON.parse(b):b}function Qa(b){"function"===typeof b?b=!0:b&&0!==b.length?(b=K(""+b),b=!("f"==b||"0"==b||"false"==b||"no"==b||"n"==b||"[]"==b)):b=!1;return b}function ha(b){b=y(b).clone();try{b.empty()}catch(a){}var c=y("<div>").append(b).html();try{return 3===b[0].nodeType?K(c):c.match(/^(<[^>]+>)/)[1].replace(/^<([\w\-]+)/,
|
||||||
|
function(a,b){return"<"+K(b)})}catch(d){return K(c)}}function Xb(b){try{return decodeURIComponent(b)}catch(a){}}function Yb(b){var a={},c,d;q((b||"").split("&"),function(b){b&&(c=b.split("="),d=Xb(c[0]),B(d)&&(b=B(c[1])?Xb(c[1]):!0,a[d]?M(a[d])?a[d].push(b):a[d]=[a[d],b]:a[d]=b))});return a}function Zb(b){var a=[];q(b,function(b,d){M(b)?q(b,function(b){a.push(za(d,!0)+(!0===b?"":"="+za(b,!0)))}):a.push(za(d,!0)+(!0===b?"":"="+za(b,!0)))});return a.length?a.join("&"):""}function wb(b){return za(b,
|
||||||
|
!0).replace(/%26/gi,"&").replace(/%3D/gi,"=").replace(/%2B/gi,"+")}function za(b,a){return encodeURIComponent(b).replace(/%40/gi,"@").replace(/%3A/gi,":").replace(/%24/g,"$").replace(/%2C/gi,",").replace(/%20/g,a?"%20":"+")}function Wc(b,a){function c(a){a&&d.push(a)}var d=[b],e,g,f=["ng:app","ng-app","x-ng-app","data-ng-app"],h=/\sng[:\-]app(:\s*([\w\d_]+);?)?\s/;q(f,function(a){f[a]=!0;c(U.getElementById(a));a=a.replace(":","\\:");b.querySelectorAll&&(q(b.querySelectorAll("."+a),c),q(b.querySelectorAll("."+
|
||||||
|
a+"\\:"),c),q(b.querySelectorAll("["+a+"]"),c))});q(d,function(a){if(!e){var b=h.exec(" "+a.className+" ");b?(e=a,g=(b[2]||"").replace(/\s+/g,",")):q(a.attributes,function(b){!e&&f[b.name]&&(e=a,g=b.value)})}});e&&a(e,g?[g]:[])}function $b(b,a){var c=function(){b=y(b);if(b.injector()){var c=b[0]===U?"document":ha(b);throw Pa("btstrpd",c);}a=a||[];a.unshift(["$provide",function(a){a.value("$rootElement",b)}]);a.unshift("ng");c=ac(a);c.invoke(["$rootScope","$rootElement","$compile","$injector","$animate",
|
||||||
|
function(a,b,c,d,e){a.$apply(function(){b.data("$injector",d);c(b)(a)})}]);return c},d=/^NG_DEFER_BOOTSTRAP!/;if(O&&!d.test(O.name))return c();O.name=O.name.replace(d,"");Ea.resumeBootstrap=function(b){q(b,function(b){a.push(b)});c()}}function fb(b,a){a=a||"_";return b.replace(Xc,function(b,d){return(d?a:"")+b.toLowerCase()})}function xb(b,a,c){if(!b)throw Pa("areq",a||"?",c||"required");return b}function Ra(b,a,c){c&&M(b)&&(b=b[b.length-1]);xb(P(b),a,"not a function, got "+(b&&"object"==typeof b?
|
||||||
|
b.constructor.name||"Object":typeof b));return b}function Aa(b,a){if("hasOwnProperty"===b)throw Pa("badname",a);}function bc(b,a,c){if(!a)return b;a=a.split(".");for(var d,e=b,g=a.length,f=0;f<g;f++)d=a[f],b&&(b=(e=b)[d]);return!c&&P(b)?eb(e,b):b}function yb(b){var a=b[0];b=b[b.length-1];if(a===b)return y(a);var c=[a];do{a=a.nextSibling;if(!a)break;c.push(a)}while(a!==b);return y(c)}function Yc(b){var a=t("$injector"),c=t("ng");b=b.angular||(b.angular={});b.$$minErr=b.$$minErr||t;return b.module||
|
||||||
|
(b.module=function(){var b={};return function(e,g,f){if("hasOwnProperty"===e)throw c("badname","module");g&&b.hasOwnProperty(e)&&(b[e]=null);return b[e]||(b[e]=function(){function b(a,d,e){return function(){c[e||"push"]([a,d,arguments]);return n}}if(!g)throw a("nomod",e);var c=[],d=[],m=b("$injector","invoke"),n={_invokeQueue:c,_runBlocks:d,requires:g,name:e,provider:b("$provide","provider"),factory:b("$provide","factory"),service:b("$provide","service"),value:b("$provide","value"),constant:b("$provide",
|
||||||
|
"constant","unshift"),animation:b("$animateProvider","register"),filter:b("$filterProvider","register"),controller:b("$controllerProvider","register"),directive:b("$compileProvider","directive"),config:m,run:function(a){d.push(a);return this}};f&&m(f);return n}())}}())}function Zc(b){D(b,{bootstrap:$b,copy:ba,extend:D,equals:xa,element:y,forEach:q,injector:ac,noop:C,bind:eb,toJson:qa,fromJson:Wb,identity:Da,isUndefined:E,isDefined:B,isString:w,isFunction:P,isObject:X,isNumber:vb,isElement:Tc,isArray:M,
|
||||||
|
version:$c,isDate:Na,lowercase:K,uppercase:Fa,callbacks:{counter:0},$$minErr:t,$$csp:Vb});Sa=Yc(O);try{Sa("ngLocale")}catch(a){Sa("ngLocale",[]).provider("$locale",ad)}Sa("ng",["ngLocale"],["$provide",function(a){a.provider({$$sanitizeUri:bd});a.provider("$compile",cc).directive({a:cd,input:dc,textarea:dc,form:dd,script:ed,select:fd,style:gd,option:hd,ngBind:id,ngBindHtml:jd,ngBindTemplate:kd,ngClass:ld,ngClassEven:md,ngClassOdd:nd,ngCloak:od,ngController:pd,ngForm:qd,ngHide:rd,ngIf:sd,ngInclude:td,
|
||||||
|
ngInit:ud,ngNonBindable:vd,ngPluralize:wd,ngRepeat:xd,ngShow:yd,ngStyle:zd,ngSwitch:Ad,ngSwitchWhen:Bd,ngSwitchDefault:Cd,ngOptions:Dd,ngTransclude:Ed,ngModel:Fd,ngList:Gd,ngChange:Hd,required:ec,ngRequired:ec,ngValue:Id}).directive({ngInclude:Jd}).directive(zb).directive(fc);a.provider({$anchorScroll:Kd,$animate:Ld,$browser:Md,$cacheFactory:Nd,$controller:Od,$document:Pd,$exceptionHandler:Qd,$filter:gc,$interpolate:Rd,$interval:Sd,$http:Td,$httpBackend:Ud,$location:Vd,$log:Wd,$parse:Xd,$rootScope:Yd,
|
||||||
|
$q:Zd,$sce:$d,$sceDelegate:ae,$sniffer:be,$templateCache:ce,$timeout:de,$window:ee,$$rAF:fe,$$asyncCallback:ge})}])}function Ta(b){return b.replace(he,function(a,b,d,e){return e?d.toUpperCase():d}).replace(ie,"Moz$1")}function Ab(b,a,c,d){function e(b){var e=c&&b?[this.filter(b)]:[this],l=a,k,m,n,p,r,z;if(!d||null!=b)for(;e.length;)for(k=e.shift(),m=0,n=k.length;m<n;m++)for(p=y(k[m]),l?p.triggerHandler("$destroy"):l=!l,r=0,p=(z=p.children()).length;r<p;r++)e.push(Ga(z[r]));return g.apply(this,arguments)}
|
||||||
|
var g=Ga.fn[b],g=g.$original||g;e.$original=g;Ga.fn[b]=e}function N(b){if(b instanceof N)return b;w(b)&&(b=ca(b));if(!(this instanceof N)){if(w(b)&&"<"!=b.charAt(0))throw Bb("nosel");return new N(b)}if(w(b)){var a=b;b=U;var c;if(c=je.exec(a))b=[b.createElement(c[1])];else{var d=b,e;b=d.createDocumentFragment();c=[];if(Cb.test(a)){d=b.appendChild(d.createElement("div"));e=(ke.exec(a)||["",""])[1].toLowerCase();e=ea[e]||ea._default;d.innerHTML="<div> </div>"+e[1]+a.replace(le,"<$1></$2>")+e[2];
|
||||||
|
d.removeChild(d.firstChild);for(a=e[0];a--;)d=d.lastChild;a=0;for(e=d.childNodes.length;a<e;++a)c.push(d.childNodes[a]);d=b.firstChild;d.textContent=""}else c.push(d.createTextNode(a));b.textContent="";b.innerHTML="";b=c}Db(this,b);y(U.createDocumentFragment()).append(this)}else Db(this,b)}function Eb(b){return b.cloneNode(!0)}function Ha(b){hc(b);var a=0;for(b=b.childNodes||[];a<b.length;a++)Ha(b[a])}function ic(b,a,c,d){if(B(d))throw Bb("offargs");var e=la(b,"events");la(b,"handle")&&(E(a)?q(e,
|
||||||
|
function(a,c){Fb(b,c,a);delete e[c]}):q(a.split(" "),function(a){E(c)?(Fb(b,a,e[a]),delete e[a]):Oa(e[a]||[],c)}))}function hc(b,a){var c=b[gb],d=Ua[c];d&&(a?delete Ua[c].data[a]:(d.handle&&(d.events.$destroy&&d.handle({},"$destroy"),ic(b)),delete Ua[c],b[gb]=s))}function la(b,a,c){var d=b[gb],d=Ua[d||-1];if(B(c))d||(b[gb]=d=++me,d=Ua[d]={}),d[a]=c;else return d&&d[a]}function jc(b,a,c){var d=la(b,"data"),e=B(c),g=!e&&B(a),f=g&&!X(a);d||f||la(b,"data",d={});if(e)d[a]=c;else if(g){if(f)return d&&d[a];
|
||||||
|
D(d,a)}else return d}function Gb(b,a){return b.getAttribute?-1<(" "+(b.getAttribute("class")||"")+" ").replace(/[\n\t]/g," ").indexOf(" "+a+" "):!1}function hb(b,a){a&&b.setAttribute&&q(a.split(" "),function(a){b.setAttribute("class",ca((" "+(b.getAttribute("class")||"")+" ").replace(/[\n\t]/g," ").replace(" "+ca(a)+" "," ")))})}function ib(b,a){if(a&&b.setAttribute){var c=(" "+(b.getAttribute("class")||"")+" ").replace(/[\n\t]/g," ");q(a.split(" "),function(a){a=ca(a);-1===c.indexOf(" "+a+" ")&&
|
||||||
|
(c+=a+" ")});b.setAttribute("class",ca(c))}}function Db(b,a){if(a){a=a.nodeName||!B(a.length)||Ca(a)?[a]:a;for(var c=0;c<a.length;c++)b.push(a[c])}}function kc(b,a){return jb(b,"$"+(a||"ngController")+"Controller")}function jb(b,a,c){b=y(b);9==b[0].nodeType&&(b=b.find("html"));for(a=M(a)?a:[a];b.length;){for(var d=b[0],e=0,g=a.length;e<g;e++)if((c=b.data(a[e]))!==s)return c;b=y(d.parentNode||11===d.nodeType&&d.host)}}function lc(b){for(var a=0,c=b.childNodes;a<c.length;a++)Ha(c[a]);for(;b.firstChild;)b.removeChild(b.firstChild)}
|
||||||
|
function mc(b,a){var c=kb[a.toLowerCase()];return c&&nc[b.nodeName]&&c}function ne(b,a){var c=function(c,e){c.preventDefault||(c.preventDefault=function(){c.returnValue=!1});c.stopPropagation||(c.stopPropagation=function(){c.cancelBubble=!0});c.target||(c.target=c.srcElement||U);if(E(c.defaultPrevented)){var g=c.preventDefault;c.preventDefault=function(){c.defaultPrevented=!0;g.call(c)};c.defaultPrevented=!1}c.isDefaultPrevented=function(){return c.defaultPrevented||!1===c.returnValue};var f=Ub(a[e||
|
||||||
|
c.type]||[]);q(f,function(a){a.call(b,c)});8>=S?(c.preventDefault=null,c.stopPropagation=null,c.isDefaultPrevented=null):(delete c.preventDefault,delete c.stopPropagation,delete c.isDefaultPrevented)};c.elem=b;return c}function Ia(b){var a=typeof b,c;"object"==a&&null!==b?"function"==typeof(c=b.$$hashKey)?c=b.$$hashKey():c===s&&(c=b.$$hashKey=bb()):c=b;return a+":"+c}function Va(b){q(b,this.put,this)}function oc(b){var a,c;"function"==typeof b?(a=b.$inject)||(a=[],b.length&&(c=b.toString().replace(oe,
|
||||||
|
""),c=c.match(pe),q(c[1].split(qe),function(b){b.replace(re,function(b,c,d){a.push(d)})})),b.$inject=a):M(b)?(c=b.length-1,Ra(b[c],"fn"),a=b.slice(0,c)):Ra(b,"fn",!0);return a}function ac(b){function a(a){return function(b,c){if(X(b))q(b,Rb(a));else return a(b,c)}}function c(a,b){Aa(a,"service");if(P(b)||M(b))b=n.instantiate(b);if(!b.$get)throw Wa("pget",a);return m[a+h]=b}function d(a,b){return c(a,{$get:b})}function e(a){var b=[],c,d,g,h;q(a,function(a){if(!k.get(a)){k.put(a,!0);try{if(w(a))for(c=
|
||||||
|
Sa(a),b=b.concat(e(c.requires)).concat(c._runBlocks),d=c._invokeQueue,g=0,h=d.length;g<h;g++){var f=d[g],l=n.get(f[0]);l[f[1]].apply(l,f[2])}else P(a)?b.push(n.invoke(a)):M(a)?b.push(n.invoke(a)):Ra(a,"module")}catch(m){throw M(a)&&(a=a[a.length-1]),m.message&&(m.stack&&-1==m.stack.indexOf(m.message))&&(m=m.message+"\n"+m.stack),Wa("modulerr",a,m.stack||m.message||m);}}});return b}function g(a,b){function c(d){if(a.hasOwnProperty(d)){if(a[d]===f)throw Wa("cdep",l.join(" <- "));return a[d]}try{return l.unshift(d),
|
||||||
|
a[d]=f,a[d]=b(d)}catch(e){throw a[d]===f&&delete a[d],e;}finally{l.shift()}}function d(a,b,e){var g=[],h=oc(a),f,l,k;l=0;for(f=h.length;l<f;l++){k=h[l];if("string"!==typeof k)throw Wa("itkn",k);g.push(e&&e.hasOwnProperty(k)?e[k]:c(k))}a.$inject||(a=a[f]);return a.apply(b,g)}return{invoke:d,instantiate:function(a,b){var c=function(){},e;c.prototype=(M(a)?a[a.length-1]:a).prototype;c=new c;e=d(a,c,b);return X(e)||P(e)?e:c},get:c,annotate:oc,has:function(b){return m.hasOwnProperty(b+h)||a.hasOwnProperty(b)}}}
|
||||||
|
var f={},h="Provider",l=[],k=new Va,m={$provide:{provider:a(c),factory:a(d),service:a(function(a,b){return d(a,["$injector",function(a){return a.instantiate(b)}])}),value:a(function(a,b){return d(a,aa(b))}),constant:a(function(a,b){Aa(a,"constant");m[a]=b;p[a]=b}),decorator:function(a,b){var c=n.get(a+h),d=c.$get;c.$get=function(){var a=r.invoke(d,c);return r.invoke(b,null,{$delegate:a})}}}},n=m.$injector=g(m,function(){throw Wa("unpr",l.join(" <- "));}),p={},r=p.$injector=g(p,function(a){a=n.get(a+
|
||||||
|
h);return r.invoke(a.$get,a)});q(e(b),function(a){r.invoke(a||C)});return r}function Kd(){var b=!0;this.disableAutoScrolling=function(){b=!1};this.$get=["$window","$location","$rootScope",function(a,c,d){function e(a){var b=null;q(a,function(a){b||"a"!==K(a.nodeName)||(b=a)});return b}function g(){var b=c.hash(),d;b?(d=f.getElementById(b))?d.scrollIntoView():(d=e(f.getElementsByName(b)))?d.scrollIntoView():"top"===b&&a.scrollTo(0,0):a.scrollTo(0,0)}var f=a.document;b&&d.$watch(function(){return c.hash()},
|
||||||
|
function(){d.$evalAsync(g)});return g}]}function ge(){this.$get=["$$rAF","$timeout",function(b,a){return b.supported?function(a){return b(a)}:function(b){return a(b,0,!1)}}]}function se(b,a,c,d){function e(a){try{a.apply(null,ya.call(arguments,1))}finally{if(z--,0===z)for(;u.length;)try{u.pop()()}catch(b){c.error(b)}}}function g(a,b){(function T(){q(F,function(a){a()});v=b(T,a)})()}function f(){x=null;J!=h.url()&&(J=h.url(),q(ma,function(a){a(h.url())}))}var h=this,l=a[0],k=b.location,m=b.history,
|
||||||
|
n=b.setTimeout,p=b.clearTimeout,r={};h.isMock=!1;var z=0,u=[];h.$$completeOutstandingRequest=e;h.$$incOutstandingRequestCount=function(){z++};h.notifyWhenNoOutstandingRequests=function(a){q(F,function(a){a()});0===z?a():u.push(a)};var F=[],v;h.addPollFn=function(a){E(v)&&g(100,n);F.push(a);return a};var J=k.href,A=a.find("base"),x=null;h.url=function(a,c){k!==b.location&&(k=b.location);m!==b.history&&(m=b.history);if(a){if(J!=a)return J=a,d.history?c?m.replaceState(null,"",a):(m.pushState(null,"",
|
||||||
|
a),A.attr("href",A.attr("href"))):(x=a,c?k.replace(a):k.href=a),h}else return x||k.href.replace(/%27/g,"'")};var ma=[],L=!1;h.onUrlChange=function(a){if(!L){if(d.history)y(b).on("popstate",f);if(d.hashchange)y(b).on("hashchange",f);else h.addPollFn(f);L=!0}ma.push(a);return a};h.baseHref=function(){var a=A.attr("href");return a?a.replace(/^(https?\:)?\/\/[^\/]*/,""):""};var Q={},da="",H=h.baseHref();h.cookies=function(a,b){var d,e,g,h;if(a)b===s?l.cookie=escape(a)+"=;path="+H+";expires=Thu, 01 Jan 1970 00:00:00 GMT":
|
||||||
|
w(b)&&(d=(l.cookie=escape(a)+"="+escape(b)+";path="+H).length+1,4096<d&&c.warn("Cookie '"+a+"' possibly not set or overflowed because it was too large ("+d+" > 4096 bytes)!"));else{if(l.cookie!==da)for(da=l.cookie,d=da.split("; "),Q={},g=0;g<d.length;g++)e=d[g],h=e.indexOf("="),0<h&&(a=unescape(e.substring(0,h)),Q[a]===s&&(Q[a]=unescape(e.substring(h+1))));return Q}};h.defer=function(a,b){var c;z++;c=n(function(){delete r[c];e(a)},b||0);r[c]=!0;return c};h.defer.cancel=function(a){return r[a]?(delete r[a],
|
||||||
|
p(a),e(C),!0):!1}}function Md(){this.$get=["$window","$log","$sniffer","$document",function(b,a,c,d){return new se(b,d,a,c)}]}function Nd(){this.$get=function(){function b(b,d){function e(a){a!=n&&(p?p==a&&(p=a.n):p=a,g(a.n,a.p),g(a,n),n=a,n.n=null)}function g(a,b){a!=b&&(a&&(a.p=b),b&&(b.n=a))}if(b in a)throw t("$cacheFactory")("iid",b);var f=0,h=D({},d,{id:b}),l={},k=d&&d.capacity||Number.MAX_VALUE,m={},n=null,p=null;return a[b]={put:function(a,b){if(k<Number.MAX_VALUE){var c=m[a]||(m[a]={key:a});
|
||||||
|
e(c)}if(!E(b))return a in l||f++,l[a]=b,f>k&&this.remove(p.key),b},get:function(a){if(k<Number.MAX_VALUE){var b=m[a];if(!b)return;e(b)}return l[a]},remove:function(a){if(k<Number.MAX_VALUE){var b=m[a];if(!b)return;b==n&&(n=b.p);b==p&&(p=b.n);g(b.n,b.p);delete m[a]}delete l[a];f--},removeAll:function(){l={};f=0;m={};n=p=null},destroy:function(){m=h=l=null;delete a[b]},info:function(){return D({},h,{size:f})}}}var a={};b.info=function(){var b={};q(a,function(a,e){b[e]=a.info()});return b};b.get=function(b){return a[b]};
|
||||||
|
return b}}function ce(){this.$get=["$cacheFactory",function(b){return b("templates")}]}function cc(b,a){var c={},d="Directive",e=/^\s*directive\:\s*([\d\w\-_]+)\s+(.*)$/,g=/(([\d\w\-_]+)(?:\:([^;]+))?;?)/,f=/^(on[a-z]+|formaction)$/;this.directive=function l(a,e){Aa(a,"directive");w(a)?(xb(e,"directiveFactory"),c.hasOwnProperty(a)||(c[a]=[],b.factory(a+d,["$injector","$exceptionHandler",function(b,d){var e=[];q(c[a],function(c,g){try{var f=b.invoke(c);P(f)?f={compile:aa(f)}:!f.compile&&f.link&&(f.compile=
|
||||||
|
aa(f.link));f.priority=f.priority||0;f.index=g;f.name=f.name||a;f.require=f.require||f.controller&&f.name;f.restrict=f.restrict||"A";e.push(f)}catch(l){d(l)}});return e}])),c[a].push(e)):q(a,Rb(l));return this};this.aHrefSanitizationWhitelist=function(b){return B(b)?(a.aHrefSanitizationWhitelist(b),this):a.aHrefSanitizationWhitelist()};this.imgSrcSanitizationWhitelist=function(b){return B(b)?(a.imgSrcSanitizationWhitelist(b),this):a.imgSrcSanitizationWhitelist()};this.$get=["$injector","$interpolate",
|
||||||
|
"$exceptionHandler","$http","$templateCache","$parse","$controller","$rootScope","$document","$sce","$animate","$$sanitizeUri",function(a,b,m,n,p,r,z,u,F,v,J,A){function x(a,b,c,d,e){a instanceof y||(a=y(a));q(a,function(b,c){3==b.nodeType&&b.nodeValue.match(/\S+/)&&(a[c]=y(b).wrap("<span></span>").parent()[0])});var g=L(a,b,a,c,d,e);ma(a,"ng-scope");return function(b,c,d){xb(b,"scope");var e=c?Ja.clone.call(a):a;q(d,function(a,b){e.data("$"+b+"Controller",a)});d=0;for(var f=e.length;d<f;d++){var l=
|
||||||
|
e[d].nodeType;1!==l&&9!==l||e.eq(d).data("$scope",b)}c&&c(e,b);g&&g(b,e,e);return e}}function ma(a,b){try{a.addClass(b)}catch(c){}}function L(a,b,c,d,e,g){function f(a,c,d,e){var g,k,m,r,n,p,z;g=c.length;var I=Array(g);for(n=0;n<g;n++)I[n]=c[n];z=n=0;for(p=l.length;n<p;z++)k=I[z],c=l[n++],g=l[n++],m=y(k),c?(c.scope?(r=a.$new(),m.data("$scope",r)):r=a,(m=c.transclude)||!e&&b?c(g,r,k,d,Q(a,m||b)):c(g,r,k,d,e)):g&&g(a,k.childNodes,s,e)}for(var l=[],k,m,r,n,p=0;p<a.length;p++)k=new Hb,m=da(a[p],[],k,
|
||||||
|
0===p?d:s,e),(g=m.length?ia(m,a[p],k,b,c,null,[],[],g):null)&&g.scope&&ma(y(a[p]),"ng-scope"),k=g&&g.terminal||!(r=a[p].childNodes)||!r.length?null:L(r,g?g.transclude:b),l.push(g,k),n=n||g||k,g=null;return n?f:null}function Q(a,b){return function(c,d,e){var g=!1;c||(c=a.$new(),g=c.$$transcluded=!0);d=b(c,d,e);if(g)d.on("$destroy",eb(c,c.$destroy));return d}}function da(a,b,c,d,f){var k=c.$attr,l;switch(a.nodeType){case 1:T(b,na(Ka(a).toLowerCase()),"E",d,f);var m,r,n;l=a.attributes;for(var p=0,z=
|
||||||
|
l&&l.length;p<z;p++){var u=!1,F=!1;m=l[p];if(!S||8<=S||m.specified){r=m.name;n=na(r);W.test(n)&&(r=fb(n.substr(6),"-"));var J=n.replace(/(Start|End)$/,"");n===J+"Start"&&(u=r,F=r.substr(0,r.length-5)+"end",r=r.substr(0,r.length-6));n=na(r.toLowerCase());k[n]=r;c[n]=m=ca(m.value);mc(a,n)&&(c[n]=!0);N(a,b,m,n);T(b,n,"A",d,f,u,F)}}a=a.className;if(w(a)&&""!==a)for(;l=g.exec(a);)n=na(l[2]),T(b,n,"C",d,f)&&(c[n]=ca(l[3])),a=a.substr(l.index+l[0].length);break;case 3:t(b,a.nodeValue);break;case 8:try{if(l=
|
||||||
|
e.exec(a.nodeValue))n=na(l[1]),T(b,n,"M",d,f)&&(c[n]=ca(l[2]))}catch(x){}}b.sort(E);return b}function H(a,b,c){var d=[],e=0;if(b&&a.hasAttribute&&a.hasAttribute(b)){do{if(!a)throw ja("uterdir",b,c);1==a.nodeType&&(a.hasAttribute(b)&&e++,a.hasAttribute(c)&&e--);d.push(a);a=a.nextSibling}while(0<e)}else d.push(a);return y(d)}function R(a,b,c){return function(d,e,g,f,l){e=H(e[0],b,c);return a(d,e,g,f,l)}}function ia(a,c,d,e,g,f,l,n,p){function u(a,b,c,d){if(a){c&&(a=R(a,c,d));a.require=G.require;if(Q===
|
||||||
|
G||G.$$isolateScope)a=qc(a,{isolateScope:!0});l.push(a)}if(b){c&&(b=R(b,c,d));b.require=G.require;if(Q===G||G.$$isolateScope)b=qc(b,{isolateScope:!0});n.push(b)}}function F(a,b,c){var d,e="data",g=!1;if(w(a)){for(;"^"==(d=a.charAt(0))||"?"==d;)a=a.substr(1),"^"==d&&(e="inheritedData"),g=g||"?"==d;d=null;c&&"data"===e&&(d=c[a]);d=d||b[e]("$"+a+"Controller");if(!d&&!g)throw ja("ctreq",a,t);}else M(a)&&(d=[],q(a,function(a){d.push(F(a,b,c))}));return d}function J(a,e,g,f,p){function u(a,b){var c;2>arguments.length&&
|
||||||
|
(b=a,a=s);D&&(c=lb);return p(a,b,c)}var I,x,v,A,R,H,lb={},da;I=c===g?d:Ub(d,new Hb(y(g),d.$attr));x=I.$$element;if(Q){var T=/^\s*([@=&])(\??)\s*(\w*)\s*$/;f=y(g);H=e.$new(!0);ia&&ia===Q.$$originalDirective?f.data("$isolateScope",H):f.data("$isolateScopeNoTemplate",H);ma(f,"ng-isolate-scope");q(Q.scope,function(a,c){var d=a.match(T)||[],g=d[3]||c,f="?"==d[2],d=d[1],l,m,n,p;H.$$isolateBindings[c]=d+g;switch(d){case "@":I.$observe(g,function(a){H[c]=a});I.$$observers[g].$$scope=e;I[g]&&(H[c]=b(I[g])(e));
|
||||||
|
break;case "=":if(f&&!I[g])break;m=r(I[g]);p=m.literal?xa:function(a,b){return a===b};n=m.assign||function(){l=H[c]=m(e);throw ja("nonassign",I[g],Q.name);};l=H[c]=m(e);H.$watch(function(){var a=m(e);p(a,H[c])||(p(a,l)?n(e,a=H[c]):H[c]=a);return l=a},null,m.literal);break;case "&":m=r(I[g]);H[c]=function(a){return m(e,a)};break;default:throw ja("iscp",Q.name,c,a);}})}da=p&&u;L&&q(L,function(a){var b={$scope:a===Q||a.$$isolateScope?H:e,$element:x,$attrs:I,$transclude:da},c;R=a.controller;"@"==R&&(R=
|
||||||
|
I[a.name]);c=z(R,b);lb[a.name]=c;D||x.data("$"+a.name+"Controller",c);a.controllerAs&&(b.$scope[a.controllerAs]=c)});f=0;for(v=l.length;f<v;f++)try{A=l[f],A(A.isolateScope?H:e,x,I,A.require&&F(A.require,x,lb),da)}catch(G){m(G,ha(x))}f=e;Q&&(Q.template||null===Q.templateUrl)&&(f=H);a&&a(f,g.childNodes,s,p);for(f=n.length-1;0<=f;f--)try{A=n[f],A(A.isolateScope?H:e,x,I,A.require&&F(A.require,x,lb),da)}catch(B){m(B,ha(x))}}p=p||{};for(var v=-Number.MAX_VALUE,A,L=p.controllerDirectives,Q=p.newIsolateScopeDirective,
|
||||||
|
ia=p.templateDirective,T=p.nonTlbTranscludeDirective,E=!1,D=p.hasElementTranscludeDirective,Z=d.$$element=y(c),G,t,V,Xa=e,O,N=0,S=a.length;N<S;N++){G=a[N];var ra=G.$$start,W=G.$$end;ra&&(Z=H(c,ra,W));V=s;if(v>G.priority)break;if(V=G.scope)A=A||G,G.templateUrl||(K("new/isolated scope",Q,G,Z),X(V)&&(Q=G));t=G.name;!G.templateUrl&&G.controller&&(V=G.controller,L=L||{},K("'"+t+"' controller",L[t],G,Z),L[t]=G);if(V=G.transclude)E=!0,G.$$tlb||(K("transclusion",T,G,Z),T=G),"element"==V?(D=!0,v=G.priority,
|
||||||
|
V=H(c,ra,W),Z=d.$$element=y(U.createComment(" "+t+": "+d[t]+" ")),c=Z[0],mb(g,y(ya.call(V,0)),c),Xa=x(V,e,v,f&&f.name,{nonTlbTranscludeDirective:T})):(V=y(Eb(c)).contents(),Z.empty(),Xa=x(V,e));if(G.template)if(K("template",ia,G,Z),ia=G,V=P(G.template)?G.template(Z,d):G.template,V=Y(V),G.replace){f=G;V=Cb.test(V)?y(V):[];c=V[0];if(1!=V.length||1!==c.nodeType)throw ja("tplrt",t,"");mb(g,Z,c);S={$attr:{}};V=da(c,[],S);var $=a.splice(N+1,a.length-(N+1));Q&&pc(V);a=a.concat(V).concat($);B(d,S);S=a.length}else Z.html(V);
|
||||||
|
if(G.templateUrl)K("template",ia,G,Z),ia=G,G.replace&&(f=G),J=C(a.splice(N,a.length-N),Z,d,g,Xa,l,n,{controllerDirectives:L,newIsolateScopeDirective:Q,templateDirective:ia,nonTlbTranscludeDirective:T}),S=a.length;else if(G.compile)try{O=G.compile(Z,d,Xa),P(O)?u(null,O,ra,W):O&&u(O.pre,O.post,ra,W)}catch(aa){m(aa,ha(Z))}G.terminal&&(J.terminal=!0,v=Math.max(v,G.priority))}J.scope=A&&!0===A.scope;J.transclude=E&&Xa;p.hasElementTranscludeDirective=D;return J}function pc(a){for(var b=0,c=a.length;b<c;b++)a[b]=
|
||||||
|
Tb(a[b],{$$isolateScope:!0})}function T(b,e,g,f,k,n,r){if(e===k)return null;k=null;if(c.hasOwnProperty(e)){var p;e=a.get(e+d);for(var z=0,u=e.length;z<u;z++)try{p=e[z],(f===s||f>p.priority)&&-1!=p.restrict.indexOf(g)&&(n&&(p=Tb(p,{$$start:n,$$end:r})),b.push(p),k=p)}catch(F){m(F)}}return k}function B(a,b){var c=b.$attr,d=a.$attr,e=a.$$element;q(a,function(d,e){"$"!=e.charAt(0)&&(b[e]&&(d+=("style"===e?";":" ")+b[e]),a.$set(e,d,!0,c[e]))});q(b,function(b,g){"class"==g?(ma(e,b),a["class"]=(a["class"]?
|
||||||
|
a["class"]+" ":"")+b):"style"==g?(e.attr("style",e.attr("style")+";"+b),a.style=(a.style?a.style+";":"")+b):"$"==g.charAt(0)||a.hasOwnProperty(g)||(a[g]=b,d[g]=c[g])})}function C(a,b,c,d,e,g,f,l){var k=[],m,r,z=b[0],u=a.shift(),F=D({},u,{templateUrl:null,transclude:null,replace:null,$$originalDirective:u}),x=P(u.templateUrl)?u.templateUrl(b,c):u.templateUrl;b.empty();n.get(v.getTrustedResourceUrl(x),{cache:p}).success(function(n){var p,J;n=Y(n);if(u.replace){n=Cb.test(n)?y(n):[];p=n[0];if(1!=n.length||
|
||||||
|
1!==p.nodeType)throw ja("tplrt",u.name,x);n={$attr:{}};mb(d,b,p);var v=da(p,[],n);X(u.scope)&&pc(v);a=v.concat(a);B(c,n)}else p=z,b.html(n);a.unshift(F);m=ia(a,p,c,e,b,u,g,f,l);q(d,function(a,c){a==p&&(d[c]=b[0])});for(r=L(b[0].childNodes,e);k.length;){n=k.shift();J=k.shift();var A=k.shift(),R=k.shift(),v=b[0];if(J!==z){var H=J.className;l.hasElementTranscludeDirective&&u.replace||(v=Eb(p));mb(A,y(J),v);ma(y(v),H)}J=m.transclude?Q(n,m.transclude):R;m(r,n,v,d,J)}k=null}).error(function(a,b,c,d){throw ja("tpload",
|
||||||
|
d.url);});return function(a,b,c,d,e){k?(k.push(b),k.push(c),k.push(d),k.push(e)):m(r,b,c,d,e)}}function E(a,b){var c=b.priority-a.priority;return 0!==c?c:a.name!==b.name?a.name<b.name?-1:1:a.index-b.index}function K(a,b,c,d){if(b)throw ja("multidir",b.name,c.name,a,ha(d));}function t(a,c){var d=b(c,!0);d&&a.push({priority:0,compile:aa(function(a,b){var c=b.parent(),e=c.data("$binding")||[];e.push(d);ma(c.data("$binding",e),"ng-binding");a.$watch(d,function(a){b[0].nodeValue=a})})})}function O(a,b){if("srcdoc"==
|
||||||
|
b)return v.HTML;var c=Ka(a);if("xlinkHref"==b||"FORM"==c&&"action"==b||"IMG"!=c&&("src"==b||"ngSrc"==b))return v.RESOURCE_URL}function N(a,c,d,e){var g=b(d,!0);if(g){if("multiple"===e&&"SELECT"===Ka(a))throw ja("selmulti",ha(a));c.push({priority:100,compile:function(){return{pre:function(c,d,l){d=l.$$observers||(l.$$observers={});if(f.test(e))throw ja("nodomevents");if(g=b(l[e],!0,O(a,e)))l[e]=g(c),(d[e]||(d[e]=[])).$$inter=!0,(l.$$observers&&l.$$observers[e].$$scope||c).$watch(g,function(a,b){"class"===
|
||||||
|
e&&a!=b?l.$updateClass(a,b):l.$set(e,a)})}}}})}}function mb(a,b,c){var d=b[0],e=b.length,g=d.parentNode,f,l;if(a)for(f=0,l=a.length;f<l;f++)if(a[f]==d){a[f++]=c;l=f+e-1;for(var k=a.length;f<k;f++,l++)l<k?a[f]=a[l]:delete a[f];a.length-=e-1;break}g&&g.replaceChild(c,d);a=U.createDocumentFragment();a.appendChild(d);c[y.expando]=d[y.expando];d=1;for(e=b.length;d<e;d++)g=b[d],y(g).remove(),a.appendChild(g),delete b[d];b[0]=c;b.length=1}function qc(a,b){return D(function(){return a.apply(null,arguments)},
|
||||||
|
a,b)}var Hb=function(a,b){this.$$element=a;this.$attr=b||{}};Hb.prototype={$normalize:na,$addClass:function(a){a&&0<a.length&&J.addClass(this.$$element,a)},$removeClass:function(a){a&&0<a.length&&J.removeClass(this.$$element,a)},$updateClass:function(a,b){var c=rc(a,b),d=rc(b,a);0===c.length?J.removeClass(this.$$element,d):0===d.length?J.addClass(this.$$element,c):J.setClass(this.$$element,c,d)},$set:function(a,b,c,d){var e=mc(this.$$element[0],a);e&&(this.$$element.prop(a,b),d=e);this[a]=b;d?this.$attr[a]=
|
||||||
|
d:(d=this.$attr[a])||(this.$attr[a]=d=fb(a,"-"));e=Ka(this.$$element);if("A"===e&&"href"===a||"IMG"===e&&"src"===a)this[a]=b=A(b,"src"===a);!1!==c&&(null===b||b===s?this.$$element.removeAttr(d):this.$$element.attr(d,b));(c=this.$$observers)&&q(c[a],function(a){try{a(b)}catch(c){m(c)}})},$observe:function(a,b){var c=this,d=c.$$observers||(c.$$observers={}),e=d[a]||(d[a]=[]);e.push(b);u.$evalAsync(function(){e.$$inter||b(c[a])});return b}};var Z=b.startSymbol(),ra=b.endSymbol(),Y="{{"==Z||"}}"==ra?
|
||||||
|
Da:function(a){return a.replace(/\{\{/g,Z).replace(/}}/g,ra)},W=/^ngAttr[A-Z]/;return x}]}function na(b){return Ta(b.replace(te,""))}function rc(b,a){var c="",d=b.split(/\s+/),e=a.split(/\s+/),g=0;a:for(;g<d.length;g++){for(var f=d[g],h=0;h<e.length;h++)if(f==e[h])continue a;c+=(0<c.length?" ":"")+f}return c}function Od(){var b={},a=/^(\S+)(\s+as\s+(\w+))?$/;this.register=function(a,d){Aa(a,"controller");X(a)?D(b,a):b[a]=d};this.$get=["$injector","$window",function(c,d){return function(e,g){var f,
|
||||||
|
h,l;w(e)&&(f=e.match(a),h=f[1],l=f[3],e=b.hasOwnProperty(h)?b[h]:bc(g.$scope,h,!0)||bc(d,h,!0),Ra(e,h,!0));f=c.instantiate(e,g);if(l){if(!g||"object"!=typeof g.$scope)throw t("$controller")("noscp",h||e.name,l);g.$scope[l]=f}return f}}]}function Pd(){this.$get=["$window",function(b){return y(b.document)}]}function Qd(){this.$get=["$log",function(b){return function(a,c){b.error.apply(b,arguments)}}]}function sc(b){var a={},c,d,e;if(!b)return a;q(b.split("\n"),function(b){e=b.indexOf(":");c=K(ca(b.substr(0,
|
||||||
|
e)));d=ca(b.substr(e+1));c&&(a[c]=a[c]?a[c]+(", "+d):d)});return a}function tc(b){var a=X(b)?b:s;return function(c){a||(a=sc(b));return c?a[K(c)]||null:a}}function uc(b,a,c){if(P(c))return c(b,a);q(c,function(c){b=c(b,a)});return b}function Td(){var b=/^\s*(\[|\{[^\{])/,a=/[\}\]]\s*$/,c=/^\)\]\}',?\n/,d={"Content-Type":"application/json;charset=utf-8"},e=this.defaults={transformResponse:[function(d){w(d)&&(d=d.replace(c,""),b.test(d)&&a.test(d)&&(d=Wb(d)));return d}],transformRequest:[function(a){return X(a)&&
|
||||||
|
"[object File]"!==wa.call(a)&&"[object Blob]"!==wa.call(a)?qa(a):a}],headers:{common:{Accept:"application/json, text/plain, */*"},post:ba(d),put:ba(d),patch:ba(d)},xsrfCookieName:"XSRF-TOKEN",xsrfHeaderName:"X-XSRF-TOKEN"},g=this.interceptors=[],f=this.responseInterceptors=[];this.$get=["$httpBackend","$browser","$cacheFactory","$rootScope","$q","$injector",function(a,b,c,d,n,p){function r(a){function c(a){var b=D({},a,{data:uc(a.data,a.headers,d.transformResponse)});return 200<=a.status&&300>a.status?
|
||||||
|
b:n.reject(b)}var d={method:"get",transformRequest:e.transformRequest,transformResponse:e.transformResponse},g=function(a){function b(a){var c;q(a,function(b,d){P(b)&&(c=b(),null!=c?a[d]=c:delete a[d])})}var c=e.headers,d=D({},a.headers),g,f,c=D({},c.common,c[K(a.method)]);b(c);b(d);a:for(g in c){a=K(g);for(f in d)if(K(f)===a)continue a;d[g]=c[g]}return d}(a);D(d,a);d.headers=g;d.method=Fa(d.method);(a=Ib(d.url)?b.cookies()[d.xsrfCookieName||e.xsrfCookieName]:s)&&(g[d.xsrfHeaderName||e.xsrfHeaderName]=
|
||||||
|
a);var f=[function(a){g=a.headers;var b=uc(a.data,tc(g),a.transformRequest);E(a.data)&&q(g,function(a,b){"content-type"===K(b)&&delete g[b]});E(a.withCredentials)&&!E(e.withCredentials)&&(a.withCredentials=e.withCredentials);return z(a,b,g).then(c,c)},s],h=n.when(d);for(q(v,function(a){(a.request||a.requestError)&&f.unshift(a.request,a.requestError);(a.response||a.responseError)&&f.push(a.response,a.responseError)});f.length;){a=f.shift();var k=f.shift(),h=h.then(a,k)}h.success=function(a){h.then(function(b){a(b.data,
|
||||||
|
b.status,b.headers,d)});return h};h.error=function(a){h.then(null,function(b){a(b.data,b.status,b.headers,d)});return h};return h}function z(b,c,g){function f(a,b,c,e){v&&(200<=a&&300>a?v.put(s,[a,b,sc(c),e]):v.remove(s));l(b,a,c,e);d.$$phase||d.$apply()}function l(a,c,d,e){c=Math.max(c,0);(200<=c&&300>c?p.resolve:p.reject)({data:a,status:c,headers:tc(d),config:b,statusText:e})}function k(){var a=db(r.pendingRequests,b);-1!==a&&r.pendingRequests.splice(a,1)}var p=n.defer(),z=p.promise,v,q,s=u(b.url,
|
||||||
|
b.params);r.pendingRequests.push(b);z.then(k,k);(b.cache||e.cache)&&(!1!==b.cache&&"GET"==b.method)&&(v=X(b.cache)?b.cache:X(e.cache)?e.cache:F);if(v)if(q=v.get(s),B(q)){if(q.then)return q.then(k,k),q;M(q)?l(q[1],q[0],ba(q[2]),q[3]):l(q,200,{},"OK")}else v.put(s,z);E(q)&&a(b.method,s,c,f,g,b.timeout,b.withCredentials,b.responseType);return z}function u(a,b){if(!b)return a;var c=[];Sc(b,function(a,b){null===a||E(a)||(M(a)||(a=[a]),q(a,function(a){X(a)&&(a=qa(a));c.push(za(b)+"="+za(a))}))});0<c.length&&
|
||||||
|
(a+=(-1==a.indexOf("?")?"?":"&")+c.join("&"));return a}var F=c("$http"),v=[];q(g,function(a){v.unshift(w(a)?p.get(a):p.invoke(a))});q(f,function(a,b){var c=w(a)?p.get(a):p.invoke(a);v.splice(b,0,{response:function(a){return c(n.when(a))},responseError:function(a){return c(n.reject(a))}})});r.pendingRequests=[];(function(a){q(arguments,function(a){r[a]=function(b,c){return r(D(c||{},{method:a,url:b}))}})})("get","delete","head","jsonp");(function(a){q(arguments,function(a){r[a]=function(b,c,d){return r(D(d||
|
||||||
|
{},{method:a,url:b,data:c}))}})})("post","put");r.defaults=e;return r}]}function ue(b){if(8>=S&&(!b.match(/^(get|post|head|put|delete|options)$/i)||!O.XMLHttpRequest))return new O.ActiveXObject("Microsoft.XMLHTTP");if(O.XMLHttpRequest)return new O.XMLHttpRequest;throw t("$httpBackend")("noxhr");}function Ud(){this.$get=["$browser","$window","$document",function(b,a,c){return ve(b,ue,b.defer,a.angular.callbacks,c[0])}]}function ve(b,a,c,d,e){function g(a,b){var c=e.createElement("script"),d=function(){c.onreadystatechange=
|
||||||
|
c.onload=c.onerror=null;e.body.removeChild(c);b&&b()};c.type="text/javascript";c.src=a;S&&8>=S?c.onreadystatechange=function(){/loaded|complete/.test(c.readyState)&&d()}:c.onload=c.onerror=function(){d()};e.body.appendChild(c);return d}var f=-1;return function(e,l,k,m,n,p,r,z){function u(){v=f;A&&A();x&&x.abort()}function F(a,d,e,g,f){L&&c.cancel(L);A=x=null;0===d&&(d=e?200:"file"==sa(l).protocol?404:0);a(1223===d?204:d,e,g,f||"");b.$$completeOutstandingRequest(C)}var v;b.$$incOutstandingRequestCount();
|
||||||
|
l=l||b.url();if("jsonp"==K(e)){var J="_"+(d.counter++).toString(36);d[J]=function(a){d[J].data=a};var A=g(l.replace("JSON_CALLBACK","angular.callbacks."+J),function(){d[J].data?F(m,200,d[J].data):F(m,v||-2);d[J]=Ea.noop})}else{var x=a(e);x.open(e,l,!0);q(n,function(a,b){B(a)&&x.setRequestHeader(b,a)});x.onreadystatechange=function(){if(x&&4==x.readyState){var a=null,b=null;v!==f&&(a=x.getAllResponseHeaders(),b="response"in x?x.response:x.responseText);F(m,v||x.status,b,a,x.statusText||"")}};r&&(x.withCredentials=
|
||||||
|
!0);if(z)try{x.responseType=z}catch(s){if("json"!==z)throw s;}x.send(k||null)}if(0<p)var L=c(u,p);else p&&p.then&&p.then(u)}}function Rd(){var b="{{",a="}}";this.startSymbol=function(a){return a?(b=a,this):b};this.endSymbol=function(b){return b?(a=b,this):a};this.$get=["$parse","$exceptionHandler","$sce",function(c,d,e){function g(g,k,m){for(var n,p,r=0,z=[],u=g.length,F=!1,v=[];r<u;)-1!=(n=g.indexOf(b,r))&&-1!=(p=g.indexOf(a,n+f))?(r!=n&&z.push(g.substring(r,n)),z.push(r=c(F=g.substring(n+f,p))),
|
||||||
|
r.exp=F,r=p+h,F=!0):(r!=u&&z.push(g.substring(r)),r=u);(u=z.length)||(z.push(""),u=1);if(m&&1<z.length)throw vc("noconcat",g);if(!k||F)return v.length=u,r=function(a){try{for(var b=0,c=u,f;b<c;b++)"function"==typeof(f=z[b])&&(f=f(a),f=m?e.getTrusted(m,f):e.valueOf(f),null===f||E(f)?f="":"string"!=typeof f&&(f=qa(f))),v[b]=f;return v.join("")}catch(h){a=vc("interr",g,h.toString()),d(a)}},r.exp=g,r.parts=z,r}var f=b.length,h=a.length;g.startSymbol=function(){return b};g.endSymbol=function(){return a};
|
||||||
|
return g}]}function Sd(){this.$get=["$rootScope","$window","$q",function(b,a,c){function d(d,f,h,l){var k=a.setInterval,m=a.clearInterval,n=c.defer(),p=n.promise,r=0,z=B(l)&&!l;h=B(h)?h:0;p.then(null,null,d);p.$$intervalId=k(function(){n.notify(r++);0<h&&r>=h&&(n.resolve(r),m(p.$$intervalId),delete e[p.$$intervalId]);z||b.$apply()},f);e[p.$$intervalId]=n;return p}var e={};d.cancel=function(a){return a&&a.$$intervalId in e?(e[a.$$intervalId].reject("canceled"),clearInterval(a.$$intervalId),delete e[a.$$intervalId],
|
||||||
|
!0):!1};return d}]}function ad(){this.$get=function(){return{id:"en-us",NUMBER_FORMATS:{DECIMAL_SEP:".",GROUP_SEP:",",PATTERNS:[{minInt:1,minFrac:0,maxFrac:3,posPre:"",posSuf:"",negPre:"-",negSuf:"",gSize:3,lgSize:3},{minInt:1,minFrac:2,maxFrac:2,posPre:"\u00a4",posSuf:"",negPre:"(\u00a4",negSuf:")",gSize:3,lgSize:3}],CURRENCY_SYM:"$"},DATETIME_FORMATS:{MONTH:"January February March April May June July August September October November December".split(" "),SHORTMONTH:"Jan Feb Mar Apr May Jun Jul Aug Sep Oct Nov Dec".split(" "),
|
||||||
|
DAY:"Sunday Monday Tuesday Wednesday Thursday Friday Saturday".split(" "),SHORTDAY:"Sun Mon Tue Wed Thu Fri Sat".split(" "),AMPMS:["AM","PM"],medium:"MMM d, y h:mm:ss a","short":"M/d/yy h:mm a",fullDate:"EEEE, MMMM d, y",longDate:"MMMM d, y",mediumDate:"MMM d, y",shortDate:"M/d/yy",mediumTime:"h:mm:ss a",shortTime:"h:mm a"},pluralCat:function(b){return 1===b?"one":"other"}}}}function wc(b){b=b.split("/");for(var a=b.length;a--;)b[a]=wb(b[a]);return b.join("/")}function xc(b,a,c){b=sa(b,c);a.$$protocol=
|
||||||
|
b.protocol;a.$$host=b.hostname;a.$$port=Y(b.port)||we[b.protocol]||null}function yc(b,a,c){var d="/"!==b.charAt(0);d&&(b="/"+b);b=sa(b,c);a.$$path=decodeURIComponent(d&&"/"===b.pathname.charAt(0)?b.pathname.substring(1):b.pathname);a.$$search=Yb(b.search);a.$$hash=decodeURIComponent(b.hash);a.$$path&&"/"!=a.$$path.charAt(0)&&(a.$$path="/"+a.$$path)}function oa(b,a){if(0===a.indexOf(b))return a.substr(b.length)}function Ya(b){var a=b.indexOf("#");return-1==a?b:b.substr(0,a)}function Jb(b){return b.substr(0,
|
||||||
|
Ya(b).lastIndexOf("/")+1)}function zc(b,a){this.$$html5=!0;a=a||"";var c=Jb(b);xc(b,this,b);this.$$parse=function(a){var e=oa(c,a);if(!w(e))throw Kb("ipthprfx",a,c);yc(e,this,b);this.$$path||(this.$$path="/");this.$$compose()};this.$$compose=function(){var a=Zb(this.$$search),b=this.$$hash?"#"+wb(this.$$hash):"";this.$$url=wc(this.$$path)+(a?"?"+a:"")+b;this.$$absUrl=c+this.$$url.substr(1)};this.$$rewrite=function(d){var e;if((e=oa(b,d))!==s)return d=e,(e=oa(a,e))!==s?c+(oa("/",e)||e):b+d;if((e=oa(c,
|
||||||
|
d))!==s)return c+e;if(c==d+"/")return c}}function Lb(b,a){var c=Jb(b);xc(b,this,b);this.$$parse=function(d){var e=oa(b,d)||oa(c,d),e="#"==e.charAt(0)?oa(a,e):this.$$html5?e:"";if(!w(e))throw Kb("ihshprfx",d,a);yc(e,this,b);d=this.$$path;var g=/^\/?.*?:(\/.*)/;0===e.indexOf(b)&&(e=e.replace(b,""));g.exec(e)||(d=(e=g.exec(d))?e[1]:d);this.$$path=d;this.$$compose()};this.$$compose=function(){var c=Zb(this.$$search),e=this.$$hash?"#"+wb(this.$$hash):"";this.$$url=wc(this.$$path)+(c?"?"+c:"")+e;this.$$absUrl=
|
||||||
|
b+(this.$$url?a+this.$$url:"")};this.$$rewrite=function(a){if(Ya(b)==Ya(a))return a}}function Ac(b,a){this.$$html5=!0;Lb.apply(this,arguments);var c=Jb(b);this.$$rewrite=function(d){var e;if(b==Ya(d))return d;if(e=oa(c,d))return b+a+e;if(c===d+"/")return c}}function nb(b){return function(){return this[b]}}function Bc(b,a){return function(c){if(E(c))return this[b];this[b]=a(c);this.$$compose();return this}}function Vd(){var b="",a=!1;this.hashPrefix=function(a){return B(a)?(b=a,this):b};this.html5Mode=
|
||||||
|
function(b){return B(b)?(a=b,this):a};this.$get=["$rootScope","$browser","$sniffer","$rootElement",function(c,d,e,g){function f(a){c.$broadcast("$locationChangeSuccess",h.absUrl(),a)}var h,l=d.baseHref(),k=d.url();a?(l=k.substring(0,k.indexOf("/",k.indexOf("//")+2))+(l||"/"),e=e.history?zc:Ac):(l=Ya(k),e=Lb);h=new e(l,"#"+b);h.$$parse(h.$$rewrite(k));g.on("click",function(a){if(!a.ctrlKey&&!a.metaKey&&2!=a.which){for(var b=y(a.target);"a"!==K(b[0].nodeName);)if(b[0]===g[0]||!(b=b.parent())[0])return;
|
||||||
|
var e=b.prop("href");X(e)&&"[object SVGAnimatedString]"===e.toString()&&(e=sa(e.animVal).href);var f=h.$$rewrite(e);e&&(!b.attr("target")&&f&&!a.isDefaultPrevented())&&(a.preventDefault(),f!=d.url()&&(h.$$parse(f),c.$apply(),O.angular["ff-684208-preventDefault"]=!0))}});h.absUrl()!=k&&d.url(h.absUrl(),!0);d.onUrlChange(function(a){h.absUrl()!=a&&(c.$evalAsync(function(){var b=h.absUrl();h.$$parse(a);c.$broadcast("$locationChangeStart",a,b).defaultPrevented?(h.$$parse(b),d.url(b)):f(b)}),c.$$phase||
|
||||||
|
c.$digest())});var m=0;c.$watch(function(){var a=d.url(),b=h.$$replace;m&&a==h.absUrl()||(m++,c.$evalAsync(function(){c.$broadcast("$locationChangeStart",h.absUrl(),a).defaultPrevented?h.$$parse(a):(d.url(h.absUrl(),b),f(a))}));h.$$replace=!1;return m});return h}]}function Wd(){var b=!0,a=this;this.debugEnabled=function(a){return B(a)?(b=a,this):b};this.$get=["$window",function(c){function d(a){a instanceof Error&&(a.stack?a=a.message&&-1===a.stack.indexOf(a.message)?"Error: "+a.message+"\n"+a.stack:
|
||||||
|
a.stack:a.sourceURL&&(a=a.message+"\n"+a.sourceURL+":"+a.line));return a}function e(a){var b=c.console||{},e=b[a]||b.log||C;a=!1;try{a=!!e.apply}catch(l){}return a?function(){var a=[];q(arguments,function(b){a.push(d(b))});return e.apply(b,a)}:function(a,b){e(a,null==b?"":b)}}return{log:e("log"),info:e("info"),warn:e("warn"),error:e("error"),debug:function(){var c=e("debug");return function(){b&&c.apply(a,arguments)}}()}}]}function fa(b,a){if("constructor"===b)throw Ba("isecfld",a);return b}function Za(b,
|
||||||
|
a){if(b){if(b.constructor===b)throw Ba("isecfn",a);if(b.document&&b.location&&b.alert&&b.setInterval)throw Ba("isecwindow",a);if(b.children&&(b.nodeName||b.prop&&b.attr&&b.find))throw Ba("isecdom",a);}return b}function ob(b,a,c,d,e){e=e||{};a=a.split(".");for(var g,f=0;1<a.length;f++){g=fa(a.shift(),d);var h=b[g];h||(h={},b[g]=h);b=h;b.then&&e.unwrapPromises&&(ta(d),"$$v"in b||function(a){a.then(function(b){a.$$v=b})}(b),b.$$v===s&&(b.$$v={}),b=b.$$v)}g=fa(a.shift(),d);return b[g]=c}function Cc(b,
|
||||||
|
a,c,d,e,g,f){fa(b,g);fa(a,g);fa(c,g);fa(d,g);fa(e,g);return f.unwrapPromises?function(f,l){var k=l&&l.hasOwnProperty(b)?l:f,m;if(null==k)return k;(k=k[b])&&k.then&&(ta(g),"$$v"in k||(m=k,m.$$v=s,m.then(function(a){m.$$v=a})),k=k.$$v);if(!a)return k;if(null==k)return s;(k=k[a])&&k.then&&(ta(g),"$$v"in k||(m=k,m.$$v=s,m.then(function(a){m.$$v=a})),k=k.$$v);if(!c)return k;if(null==k)return s;(k=k[c])&&k.then&&(ta(g),"$$v"in k||(m=k,m.$$v=s,m.then(function(a){m.$$v=a})),k=k.$$v);if(!d)return k;if(null==
|
||||||
|
k)return s;(k=k[d])&&k.then&&(ta(g),"$$v"in k||(m=k,m.$$v=s,m.then(function(a){m.$$v=a})),k=k.$$v);if(!e)return k;if(null==k)return s;(k=k[e])&&k.then&&(ta(g),"$$v"in k||(m=k,m.$$v=s,m.then(function(a){m.$$v=a})),k=k.$$v);return k}:function(g,f){var k=f&&f.hasOwnProperty(b)?f:g;if(null==k)return k;k=k[b];if(!a)return k;if(null==k)return s;k=k[a];if(!c)return k;if(null==k)return s;k=k[c];if(!d)return k;if(null==k)return s;k=k[d];return e?null==k?s:k=k[e]:k}}function xe(b,a){fa(b,a);return function(a,
|
||||||
|
d){return null==a?s:(d&&d.hasOwnProperty(b)?d:a)[b]}}function ye(b,a,c){fa(b,c);fa(a,c);return function(c,e){if(null==c)return s;c=(e&&e.hasOwnProperty(b)?e:c)[b];return null==c?s:c[a]}}function Dc(b,a,c){if(Mb.hasOwnProperty(b))return Mb[b];var d=b.split("."),e=d.length,g;if(a.unwrapPromises||1!==e)if(a.unwrapPromises||2!==e)if(a.csp)g=6>e?Cc(d[0],d[1],d[2],d[3],d[4],c,a):function(b,g){var f=0,h;do h=Cc(d[f++],d[f++],d[f++],d[f++],d[f++],c,a)(b,g),g=s,b=h;while(f<e);return h};else{var f="var p;\n";
|
||||||
|
q(d,function(b,d){fa(b,c);f+="if(s == null) return undefined;\ns="+(d?"s":'((k&&k.hasOwnProperty("'+b+'"))?k:s)')+'["'+b+'"];\n'+(a.unwrapPromises?'if (s && s.then) {\n pw("'+c.replace(/(["\r\n])/g,"\\$1")+'");\n if (!("$$v" in s)) {\n p=s;\n p.$$v = undefined;\n p.then(function(v) {p.$$v=v;});\n}\n s=s.$$v\n}\n':"")});var f=f+"return s;",h=new Function("s","k","pw",f);h.toString=aa(f);g=a.unwrapPromises?function(a,b){return h(a,b,ta)}:h}else g=ye(d[0],d[1],c);else g=xe(d[0],c);"hasOwnProperty"!==
|
||||||
|
b&&(Mb[b]=g);return g}function Xd(){var b={},a={csp:!1,unwrapPromises:!1,logPromiseWarnings:!0};this.unwrapPromises=function(b){return B(b)?(a.unwrapPromises=!!b,this):a.unwrapPromises};this.logPromiseWarnings=function(b){return B(b)?(a.logPromiseWarnings=b,this):a.logPromiseWarnings};this.$get=["$filter","$sniffer","$log",function(c,d,e){a.csp=d.csp;ta=function(b){a.logPromiseWarnings&&!Ec.hasOwnProperty(b)&&(Ec[b]=!0,e.warn("[$parse] Promise found in the expression `"+b+"`. Automatic unwrapping of promises in Angular expressions is deprecated."))};
|
||||||
|
return function(d){var e;switch(typeof d){case "string":if(b.hasOwnProperty(d))return b[d];e=new Nb(a);e=(new $a(e,c,a)).parse(d,!1);"hasOwnProperty"!==d&&(b[d]=e);return e;case "function":return d;default:return C}}}]}function Zd(){this.$get=["$rootScope","$exceptionHandler",function(b,a){return ze(function(a){b.$evalAsync(a)},a)}]}function ze(b,a){function c(a){return a}function d(a){return f(a)}var e=function(){var f=[],k,m;return m={resolve:function(a){if(f){var c=f;f=s;k=g(a);c.length&&b(function(){for(var a,
|
||||||
|
b=0,d=c.length;b<d;b++)a=c[b],k.then(a[0],a[1],a[2])})}},reject:function(a){m.resolve(h(a))},notify:function(a){if(f){var c=f;f.length&&b(function(){for(var b,d=0,e=c.length;d<e;d++)b=c[d],b[2](a)})}},promise:{then:function(b,g,h){var m=e(),u=function(d){try{m.resolve((P(b)?b:c)(d))}catch(e){m.reject(e),a(e)}},F=function(b){try{m.resolve((P(g)?g:d)(b))}catch(c){m.reject(c),a(c)}},v=function(b){try{m.notify((P(h)?h:c)(b))}catch(d){a(d)}};f?f.push([u,F,v]):k.then(u,F,v);return m.promise},"catch":function(a){return this.then(null,
|
||||||
|
a)},"finally":function(a){function b(a,c){var d=e();c?d.resolve(a):d.reject(a);return d.promise}function d(e,g){var f=null;try{f=(a||c)()}catch(h){return b(h,!1)}return f&&P(f.then)?f.then(function(){return b(e,g)},function(a){return b(a,!1)}):b(e,g)}return this.then(function(a){return d(a,!0)},function(a){return d(a,!1)})}}}},g=function(a){return a&&P(a.then)?a:{then:function(c){var d=e();b(function(){d.resolve(c(a))});return d.promise}}},f=function(a){var b=e();b.reject(a);return b.promise},h=function(c){return{then:function(g,
|
||||||
|
f){var h=e();b(function(){try{h.resolve((P(f)?f:d)(c))}catch(b){h.reject(b),a(b)}});return h.promise}}};return{defer:e,reject:f,when:function(h,k,m,n){var p=e(),r,z=function(b){try{return(P(k)?k:c)(b)}catch(d){return a(d),f(d)}},u=function(b){try{return(P(m)?m:d)(b)}catch(c){return a(c),f(c)}},F=function(b){try{return(P(n)?n:c)(b)}catch(d){a(d)}};b(function(){g(h).then(function(a){r||(r=!0,p.resolve(g(a).then(z,u,F)))},function(a){r||(r=!0,p.resolve(u(a)))},function(a){r||p.notify(F(a))})});return p.promise},
|
||||||
|
all:function(a){var b=e(),c=0,d=M(a)?[]:{};q(a,function(a,e){c++;g(a).then(function(a){d.hasOwnProperty(e)||(d[e]=a,--c||b.resolve(d))},function(a){d.hasOwnProperty(e)||b.reject(a)})});0===c&&b.resolve(d);return b.promise}}}function fe(){this.$get=["$window","$timeout",function(b,a){var c=b.requestAnimationFrame||b.webkitRequestAnimationFrame||b.mozRequestAnimationFrame,d=b.cancelAnimationFrame||b.webkitCancelAnimationFrame||b.mozCancelAnimationFrame||b.webkitCancelRequestAnimationFrame,e=!!c,g=e?
|
||||||
|
function(a){var b=c(a);return function(){d(b)}}:function(b){var c=a(b,16.66,!1);return function(){a.cancel(c)}};g.supported=e;return g}]}function Yd(){var b=10,a=t("$rootScope"),c=null;this.digestTtl=function(a){arguments.length&&(b=a);return b};this.$get=["$injector","$exceptionHandler","$parse","$browser",function(d,e,g,f){function h(){this.$id=bb();this.$$phase=this.$parent=this.$$watchers=this.$$nextSibling=this.$$prevSibling=this.$$childHead=this.$$childTail=null;this["this"]=this.$root=this;
|
||||||
|
this.$$destroyed=!1;this.$$asyncQueue=[];this.$$postDigestQueue=[];this.$$listeners={};this.$$listenerCount={};this.$$isolateBindings={}}function l(b){if(p.$$phase)throw a("inprog",p.$$phase);p.$$phase=b}function k(a,b){var c=g(a);Ra(c,b);return c}function m(a,b,c){do a.$$listenerCount[c]-=b,0===a.$$listenerCount[c]&&delete a.$$listenerCount[c];while(a=a.$parent)}function n(){}h.prototype={constructor:h,$new:function(a){a?(a=new h,a.$root=this.$root,a.$$asyncQueue=this.$$asyncQueue,a.$$postDigestQueue=
|
||||||
|
this.$$postDigestQueue):(a=function(){},a.prototype=this,a=new a,a.$id=bb());a["this"]=a;a.$$listeners={};a.$$listenerCount={};a.$parent=this;a.$$watchers=a.$$nextSibling=a.$$childHead=a.$$childTail=null;a.$$prevSibling=this.$$childTail;this.$$childHead?this.$$childTail=this.$$childTail.$$nextSibling=a:this.$$childHead=this.$$childTail=a;return a},$watch:function(a,b,d){var e=k(a,"watch"),g=this.$$watchers,f={fn:b,last:n,get:e,exp:a,eq:!!d};c=null;if(!P(b)){var h=k(b||C,"listener");f.fn=function(a,
|
||||||
|
b,c){h(c)}}if("string"==typeof a&&e.constant){var l=f.fn;f.fn=function(a,b,c){l.call(this,a,b,c);Oa(g,f)}}g||(g=this.$$watchers=[]);g.unshift(f);return function(){Oa(g,f);c=null}},$watchCollection:function(a,b){var c=this,d,e,f,h=1<b.length,l=0,k=g(a),m=[],n={},p=!0,q=0;return this.$watch(function(){d=k(c);var a,b;if(X(d))if(ab(d))for(e!==m&&(e=m,q=e.length=0,l++),a=d.length,q!==a&&(l++,e.length=q=a),b=0;b<a;b++)e[b]!==e[b]&&d[b]!==d[b]||e[b]===d[b]||(l++,e[b]=d[b]);else{e!==n&&(e=n={},q=0,l++);a=
|
||||||
|
0;for(b in d)d.hasOwnProperty(b)&&(a++,e.hasOwnProperty(b)?e[b]!==d[b]&&(l++,e[b]=d[b]):(q++,e[b]=d[b],l++));if(q>a)for(b in l++,e)e.hasOwnProperty(b)&&!d.hasOwnProperty(b)&&(q--,delete e[b])}else e!==d&&(e=d,l++);return l},function(){p?(p=!1,b(d,d,c)):b(d,f,c);if(h)if(X(d))if(ab(d)){f=Array(d.length);for(var a=0;a<d.length;a++)f[a]=d[a]}else for(a in f={},d)Fc.call(d,a)&&(f[a]=d[a]);else f=d})},$digest:function(){var d,g,f,h,k=this.$$asyncQueue,m=this.$$postDigestQueue,q,x,s=b,L,Q=[],y,H,R;l("$digest");
|
||||||
|
c=null;do{x=!1;for(L=this;k.length;){try{R=k.shift(),R.scope.$eval(R.expression)}catch(B){p.$$phase=null,e(B)}c=null}a:do{if(h=L.$$watchers)for(q=h.length;q--;)try{if(d=h[q])if((g=d.get(L))!==(f=d.last)&&!(d.eq?xa(g,f):"number"==typeof g&&"number"==typeof f&&isNaN(g)&&isNaN(f)))x=!0,c=d,d.last=d.eq?ba(g):g,d.fn(g,f===n?g:f,L),5>s&&(y=4-s,Q[y]||(Q[y]=[]),H=P(d.exp)?"fn: "+(d.exp.name||d.exp.toString()):d.exp,H+="; newVal: "+qa(g)+"; oldVal: "+qa(f),Q[y].push(H));else if(d===c){x=!1;break a}}catch(w){p.$$phase=
|
||||||
|
null,e(w)}if(!(h=L.$$childHead||L!==this&&L.$$nextSibling))for(;L!==this&&!(h=L.$$nextSibling);)L=L.$parent}while(L=h);if((x||k.length)&&!s--)throw p.$$phase=null,a("infdig",b,qa(Q));}while(x||k.length);for(p.$$phase=null;m.length;)try{m.shift()()}catch(T){e(T)}},$destroy:function(){if(!this.$$destroyed){var a=this.$parent;this.$broadcast("$destroy");this.$$destroyed=!0;this!==p&&(q(this.$$listenerCount,eb(null,m,this)),a.$$childHead==this&&(a.$$childHead=this.$$nextSibling),a.$$childTail==this&&
|
||||||
|
(a.$$childTail=this.$$prevSibling),this.$$prevSibling&&(this.$$prevSibling.$$nextSibling=this.$$nextSibling),this.$$nextSibling&&(this.$$nextSibling.$$prevSibling=this.$$prevSibling),this.$parent=this.$$nextSibling=this.$$prevSibling=this.$$childHead=this.$$childTail=this.$root=null,this.$$listeners={},this.$$watchers=this.$$asyncQueue=this.$$postDigestQueue=[],this.$destroy=this.$digest=this.$apply=C,this.$on=this.$watch=function(){return C})}},$eval:function(a,b){return g(a)(this,b)},$evalAsync:function(a){p.$$phase||
|
||||||
|
p.$$asyncQueue.length||f.defer(function(){p.$$asyncQueue.length&&p.$digest()});this.$$asyncQueue.push({scope:this,expression:a})},$$postDigest:function(a){this.$$postDigestQueue.push(a)},$apply:function(a){try{return l("$apply"),this.$eval(a)}catch(b){e(b)}finally{p.$$phase=null;try{p.$digest()}catch(c){throw e(c),c;}}},$on:function(a,b){var c=this.$$listeners[a];c||(this.$$listeners[a]=c=[]);c.push(b);var d=this;do d.$$listenerCount[a]||(d.$$listenerCount[a]=0),d.$$listenerCount[a]++;while(d=d.$parent);
|
||||||
|
var e=this;return function(){c[db(c,b)]=null;m(e,1,a)}},$emit:function(a,b){var c=[],d,g=this,f=!1,h={name:a,targetScope:g,stopPropagation:function(){f=!0},preventDefault:function(){h.defaultPrevented=!0},defaultPrevented:!1},l=[h].concat(ya.call(arguments,1)),k,m;do{d=g.$$listeners[a]||c;h.currentScope=g;k=0;for(m=d.length;k<m;k++)if(d[k])try{d[k].apply(null,l)}catch(n){e(n)}else d.splice(k,1),k--,m--;if(f)break;g=g.$parent}while(g);return h},$broadcast:function(a,b){for(var c=this,d=this,g={name:a,
|
||||||
|
targetScope:this,preventDefault:function(){g.defaultPrevented=!0},defaultPrevented:!1},f=[g].concat(ya.call(arguments,1)),h,k;c=d;){g.currentScope=c;d=c.$$listeners[a]||[];h=0;for(k=d.length;h<k;h++)if(d[h])try{d[h].apply(null,f)}catch(l){e(l)}else d.splice(h,1),h--,k--;if(!(d=c.$$listenerCount[a]&&c.$$childHead||c!==this&&c.$$nextSibling))for(;c!==this&&!(d=c.$$nextSibling);)c=c.$parent}return g}};var p=new h;return p}]}function bd(){var b=/^\s*(https?|ftp|mailto|tel|file):/,a=/^\s*(https?|ftp|file):|data:image\//;
|
||||||
|
this.aHrefSanitizationWhitelist=function(a){return B(a)?(b=a,this):b};this.imgSrcSanitizationWhitelist=function(b){return B(b)?(a=b,this):a};this.$get=function(){return function(c,d){var e=d?a:b,g;if(!S||8<=S)if(g=sa(c).href,""!==g&&!g.match(e))return"unsafe:"+g;return c}}}function Ae(b){if("self"===b)return b;if(w(b)){if(-1<b.indexOf("***"))throw ua("iwcard",b);b=b.replace(/([-()\[\]{}+?*.$\^|,:#<!\\])/g,"\\$1").replace(/\x08/g,"\\x08").replace("\\*\\*",".*").replace("\\*","[^:/.?&;]*");return RegExp("^"+
|
||||||
|
b+"$")}if(cb(b))return RegExp("^"+b.source+"$");throw ua("imatcher");}function Gc(b){var a=[];B(b)&&q(b,function(b){a.push(Ae(b))});return a}function ae(){this.SCE_CONTEXTS=ga;var b=["self"],a=[];this.resourceUrlWhitelist=function(a){arguments.length&&(b=Gc(a));return b};this.resourceUrlBlacklist=function(b){arguments.length&&(a=Gc(b));return a};this.$get=["$injector",function(c){function d(a){var b=function(a){this.$$unwrapTrustedValue=function(){return a}};a&&(b.prototype=new a);b.prototype.valueOf=
|
||||||
|
function(){return this.$$unwrapTrustedValue()};b.prototype.toString=function(){return this.$$unwrapTrustedValue().toString()};return b}var e=function(a){throw ua("unsafe");};c.has("$sanitize")&&(e=c.get("$sanitize"));var g=d(),f={};f[ga.HTML]=d(g);f[ga.CSS]=d(g);f[ga.URL]=d(g);f[ga.JS]=d(g);f[ga.RESOURCE_URL]=d(f[ga.URL]);return{trustAs:function(a,b){var c=f.hasOwnProperty(a)?f[a]:null;if(!c)throw ua("icontext",a,b);if(null===b||b===s||""===b)return b;if("string"!==typeof b)throw ua("itype",a);return new c(b)},
|
||||||
|
getTrusted:function(c,d){if(null===d||d===s||""===d)return d;var g=f.hasOwnProperty(c)?f[c]:null;if(g&&d instanceof g)return d.$$unwrapTrustedValue();if(c===ga.RESOURCE_URL){var g=sa(d.toString()),m,n,p=!1;m=0;for(n=b.length;m<n;m++)if("self"===b[m]?Ib(g):b[m].exec(g.href)){p=!0;break}if(p)for(m=0,n=a.length;m<n;m++)if("self"===a[m]?Ib(g):a[m].exec(g.href)){p=!1;break}if(p)return d;throw ua("insecurl",d.toString());}if(c===ga.HTML)return e(d);throw ua("unsafe");},valueOf:function(a){return a instanceof
|
||||||
|
g?a.$$unwrapTrustedValue():a}}}]}function $d(){var b=!0;this.enabled=function(a){arguments.length&&(b=!!a);return b};this.$get=["$parse","$sniffer","$sceDelegate",function(a,c,d){if(b&&c.msie&&8>c.msieDocumentMode)throw ua("iequirks");var e=ba(ga);e.isEnabled=function(){return b};e.trustAs=d.trustAs;e.getTrusted=d.getTrusted;e.valueOf=d.valueOf;b||(e.trustAs=e.getTrusted=function(a,b){return b},e.valueOf=Da);e.parseAs=function(b,c){var d=a(c);return d.literal&&d.constant?d:function(a,c){return e.getTrusted(b,
|
||||||
|
d(a,c))}};var g=e.parseAs,f=e.getTrusted,h=e.trustAs;q(ga,function(a,b){var c=K(b);e[Ta("parse_as_"+c)]=function(b){return g(a,b)};e[Ta("get_trusted_"+c)]=function(b){return f(a,b)};e[Ta("trust_as_"+c)]=function(b){return h(a,b)}});return e}]}function be(){this.$get=["$window","$document",function(b,a){var c={},d=Y((/android (\d+)/.exec(K((b.navigator||{}).userAgent))||[])[1]),e=/Boxee/i.test((b.navigator||{}).userAgent),g=a[0]||{},f=g.documentMode,h,l=/^(Moz|webkit|O|ms)(?=[A-Z])/,k=g.body&&g.body.style,
|
||||||
|
m=!1,n=!1;if(k){for(var p in k)if(m=l.exec(p)){h=m[0];h=h.substr(0,1).toUpperCase()+h.substr(1);break}h||(h="WebkitOpacity"in k&&"webkit");m=!!("transition"in k||h+"Transition"in k);n=!!("animation"in k||h+"Animation"in k);!d||m&&n||(m=w(g.body.style.webkitTransition),n=w(g.body.style.webkitAnimation))}return{history:!(!b.history||!b.history.pushState||4>d||e),hashchange:"onhashchange"in b&&(!f||7<f),hasEvent:function(a){if("input"==a&&9==S)return!1;if(E(c[a])){var b=g.createElement("div");c[a]="on"+
|
||||||
|
a in b}return c[a]},csp:Vb(),vendorPrefix:h,transitions:m,animations:n,android:d,msie:S,msieDocumentMode:f}}]}function de(){this.$get=["$rootScope","$browser","$q","$exceptionHandler",function(b,a,c,d){function e(e,h,l){var k=c.defer(),m=k.promise,n=B(l)&&!l;h=a.defer(function(){try{k.resolve(e())}catch(a){k.reject(a),d(a)}finally{delete g[m.$$timeoutId]}n||b.$apply()},h);m.$$timeoutId=h;g[h]=k;return m}var g={};e.cancel=function(b){return b&&b.$$timeoutId in g?(g[b.$$timeoutId].reject("canceled"),
|
||||||
|
delete g[b.$$timeoutId],a.defer.cancel(b.$$timeoutId)):!1};return e}]}function sa(b,a){var c=b;S&&(W.setAttribute("href",c),c=W.href);W.setAttribute("href",c);return{href:W.href,protocol:W.protocol?W.protocol.replace(/:$/,""):"",host:W.host,search:W.search?W.search.replace(/^\?/,""):"",hash:W.hash?W.hash.replace(/^#/,""):"",hostname:W.hostname,port:W.port,pathname:"/"===W.pathname.charAt(0)?W.pathname:"/"+W.pathname}}function Ib(b){b=w(b)?sa(b):b;return b.protocol===Hc.protocol&&b.host===Hc.host}
|
||||||
|
function ee(){this.$get=aa(O)}function gc(b){function a(d,e){if(X(d)){var g={};q(d,function(b,c){g[c]=a(c,b)});return g}return b.factory(d+c,e)}var c="Filter";this.register=a;this.$get=["$injector",function(a){return function(b){return a.get(b+c)}}];a("currency",Ic);a("date",Jc);a("filter",Be);a("json",Ce);a("limitTo",De);a("lowercase",Ee);a("number",Kc);a("orderBy",Lc);a("uppercase",Fe)}function Be(){return function(b,a,c){if(!M(b))return b;var d=typeof c,e=[];e.check=function(a){for(var b=0;b<e.length;b++)if(!e[b](a))return!1;
|
||||||
|
return!0};"function"!==d&&(c="boolean"===d&&c?function(a,b){return Ea.equals(a,b)}:function(a,b){if(a&&b&&"object"===typeof a&&"object"===typeof b){for(var d in a)if("$"!==d.charAt(0)&&Fc.call(a,d)&&c(a[d],b[d]))return!0;return!1}b=(""+b).toLowerCase();return-1<(""+a).toLowerCase().indexOf(b)});var g=function(a,b){if("string"==typeof b&&"!"===b.charAt(0))return!g(a,b.substr(1));switch(typeof a){case "boolean":case "number":case "string":return c(a,b);case "object":switch(typeof b){case "object":return c(a,
|
||||||
|
b);default:for(var d in a)if("$"!==d.charAt(0)&&g(a[d],b))return!0}return!1;case "array":for(d=0;d<a.length;d++)if(g(a[d],b))return!0;return!1;default:return!1}};switch(typeof a){case "boolean":case "number":case "string":a={$:a};case "object":for(var f in a)(function(b){"undefined"!=typeof a[b]&&e.push(function(c){return g("$"==b?c:c&&c[b],a[b])})})(f);break;case "function":e.push(a);break;default:return b}d=[];for(f=0;f<b.length;f++){var h=b[f];e.check(h)&&d.push(h)}return d}}function Ic(b){var a=
|
||||||
|
b.NUMBER_FORMATS;return function(b,d){E(d)&&(d=a.CURRENCY_SYM);return Mc(b,a.PATTERNS[1],a.GROUP_SEP,a.DECIMAL_SEP,2).replace(/\u00A4/g,d)}}function Kc(b){var a=b.NUMBER_FORMATS;return function(b,d){return Mc(b,a.PATTERNS[0],a.GROUP_SEP,a.DECIMAL_SEP,d)}}function Mc(b,a,c,d,e){if(null==b||!isFinite(b)||X(b))return"";var g=0>b;b=Math.abs(b);var f=b+"",h="",l=[],k=!1;if(-1!==f.indexOf("e")){var m=f.match(/([\d\.]+)e(-?)(\d+)/);m&&"-"==m[2]&&m[3]>e+1?f="0":(h=f,k=!0)}if(k)0<e&&(-1<b&&1>b)&&(h=b.toFixed(e));
|
||||||
|
else{f=(f.split(Nc)[1]||"").length;E(e)&&(e=Math.min(Math.max(a.minFrac,f),a.maxFrac));f=Math.pow(10,e);b=Math.round(b*f)/f;b=(""+b).split(Nc);f=b[0];b=b[1]||"";var m=0,n=a.lgSize,p=a.gSize;if(f.length>=n+p)for(m=f.length-n,k=0;k<m;k++)0===(m-k)%p&&0!==k&&(h+=c),h+=f.charAt(k);for(k=m;k<f.length;k++)0===(f.length-k)%n&&0!==k&&(h+=c),h+=f.charAt(k);for(;b.length<e;)b+="0";e&&"0"!==e&&(h+=d+b.substr(0,e))}l.push(g?a.negPre:a.posPre);l.push(h);l.push(g?a.negSuf:a.posSuf);return l.join("")}function Ob(b,
|
||||||
|
a,c){var d="";0>b&&(d="-",b=-b);for(b=""+b;b.length<a;)b="0"+b;c&&(b=b.substr(b.length-a));return d+b}function $(b,a,c,d){c=c||0;return function(e){e=e["get"+b]();if(0<c||e>-c)e+=c;0===e&&-12==c&&(e=12);return Ob(e,a,d)}}function pb(b,a){return function(c,d){var e=c["get"+b](),g=Fa(a?"SHORT"+b:b);return d[g][e]}}function Jc(b){function a(a){var b;if(b=a.match(c)){a=new Date(0);var g=0,f=0,h=b[8]?a.setUTCFullYear:a.setFullYear,l=b[8]?a.setUTCHours:a.setHours;b[9]&&(g=Y(b[9]+b[10]),f=Y(b[9]+b[11]));
|
||||||
|
h.call(a,Y(b[1]),Y(b[2])-1,Y(b[3]));g=Y(b[4]||0)-g;f=Y(b[5]||0)-f;h=Y(b[6]||0);b=Math.round(1E3*parseFloat("0."+(b[7]||0)));l.call(a,g,f,h,b)}return a}var c=/^(\d{4})-?(\d\d)-?(\d\d)(?:T(\d\d)(?::?(\d\d)(?::?(\d\d)(?:\.(\d+))?)?)?(Z|([+-])(\d\d):?(\d\d))?)?$/;return function(c,e){var g="",f=[],h,l;e=e||"mediumDate";e=b.DATETIME_FORMATS[e]||e;w(c)&&(c=Ge.test(c)?Y(c):a(c));vb(c)&&(c=new Date(c));if(!Na(c))return c;for(;e;)(l=He.exec(e))?(f=f.concat(ya.call(l,1)),e=f.pop()):(f.push(e),e=null);q(f,function(a){h=
|
||||||
|
Ie[a];g+=h?h(c,b.DATETIME_FORMATS):a.replace(/(^'|'$)/g,"").replace(/''/g,"'")});return g}}function Ce(){return function(b){return qa(b,!0)}}function De(){return function(b,a){if(!M(b)&&!w(b))return b;a=Y(a);if(w(b))return a?0<=a?b.slice(0,a):b.slice(a,b.length):"";var c=[],d,e;a>b.length?a=b.length:a<-b.length&&(a=-b.length);0<a?(d=0,e=a):(d=b.length+a,e=b.length);for(;d<e;d++)c.push(b[d]);return c}}function Lc(b){return function(a,c,d){function e(a,b){return Qa(b)?function(b,c){return a(c,b)}:a}
|
||||||
|
function g(a,b){var c=typeof a,d=typeof b;return c==d?("string"==c&&(a=a.toLowerCase(),b=b.toLowerCase()),a===b?0:a<b?-1:1):c<d?-1:1}if(!M(a)||!c)return a;c=M(c)?c:[c];c=Uc(c,function(a){var c=!1,d=a||Da;if(w(a)){if("+"==a.charAt(0)||"-"==a.charAt(0))c="-"==a.charAt(0),a=a.substring(1);d=b(a);if(d.constant){var f=d();return e(function(a,b){return g(a[f],b[f])},c)}}return e(function(a,b){return g(d(a),d(b))},c)});for(var f=[],h=0;h<a.length;h++)f.push(a[h]);return f.sort(e(function(a,b){for(var d=
|
||||||
|
0;d<c.length;d++){var e=c[d](a,b);if(0!==e)return e}return 0},d))}}function va(b){P(b)&&(b={link:b});b.restrict=b.restrict||"AC";return aa(b)}function Oc(b,a,c,d){function e(a,c){c=c?"-"+fb(c,"-"):"";d.removeClass(b,(a?qb:rb)+c);d.addClass(b,(a?rb:qb)+c)}var g=this,f=b.parent().controller("form")||sb,h=0,l=g.$error={},k=[];g.$name=a.name||a.ngForm;g.$dirty=!1;g.$pristine=!0;g.$valid=!0;g.$invalid=!1;f.$addControl(g);b.addClass(La);e(!0);g.$addControl=function(a){Aa(a.$name,"input");k.push(a);a.$name&&
|
||||||
|
(g[a.$name]=a)};g.$removeControl=function(a){a.$name&&g[a.$name]===a&&delete g[a.$name];q(l,function(b,c){g.$setValidity(c,!0,a)});Oa(k,a)};g.$setValidity=function(a,b,c){var d=l[a];if(b)d&&(Oa(d,c),d.length||(h--,h||(e(b),g.$valid=!0,g.$invalid=!1),l[a]=!1,e(!0,a),f.$setValidity(a,!0,g)));else{h||e(b);if(d){if(-1!=db(d,c))return}else l[a]=d=[],h++,e(!1,a),f.$setValidity(a,!1,g);d.push(c);g.$valid=!1;g.$invalid=!0}};g.$setDirty=function(){d.removeClass(b,La);d.addClass(b,tb);g.$dirty=!0;g.$pristine=
|
||||||
|
!1;f.$setDirty()};g.$setPristine=function(){d.removeClass(b,tb);d.addClass(b,La);g.$dirty=!1;g.$pristine=!0;q(k,function(a){a.$setPristine()})}}function pa(b,a,c,d){b.$setValidity(a,c);return c?d:s}function Je(b,a,c){var d=c.prop("validity");X(d)&&b.$parsers.push(function(c){if(b.$error[a]||!(d.badInput||d.customError||d.typeMismatch)||d.valueMissing)return c;b.$setValidity(a,!1)})}function ub(b,a,c,d,e,g){var f=a.prop("validity");if(!e.android){var h=!1;a.on("compositionstart",function(a){h=!0});
|
||||||
|
a.on("compositionend",function(){h=!1;l()})}var l=function(){if(!h){var e=a.val();Qa(c.ngTrim||"T")&&(e=ca(e));if(d.$viewValue!==e||f&&""===e&&!f.valueMissing)b.$$phase?d.$setViewValue(e):b.$apply(function(){d.$setViewValue(e)})}};if(e.hasEvent("input"))a.on("input",l);else{var k,m=function(){k||(k=g.defer(function(){l();k=null}))};a.on("keydown",function(a){a=a.keyCode;91===a||(15<a&&19>a||37<=a&&40>=a)||m()});if(e.hasEvent("paste"))a.on("paste cut",m)}a.on("change",l);d.$render=function(){a.val(d.$isEmpty(d.$viewValue)?
|
||||||
|
"":d.$viewValue)};var n=c.ngPattern;n&&((e=n.match(/^\/(.*)\/([gim]*)$/))?(n=RegExp(e[1],e[2]),e=function(a){return pa(d,"pattern",d.$isEmpty(a)||n.test(a),a)}):e=function(c){var e=b.$eval(n);if(!e||!e.test)throw t("ngPattern")("noregexp",n,e,ha(a));return pa(d,"pattern",d.$isEmpty(c)||e.test(c),c)},d.$formatters.push(e),d.$parsers.push(e));if(c.ngMinlength){var p=Y(c.ngMinlength);e=function(a){return pa(d,"minlength",d.$isEmpty(a)||a.length>=p,a)};d.$parsers.push(e);d.$formatters.push(e)}if(c.ngMaxlength){var r=
|
||||||
|
Y(c.ngMaxlength);e=function(a){return pa(d,"maxlength",d.$isEmpty(a)||a.length<=r,a)};d.$parsers.push(e);d.$formatters.push(e)}}function Pb(b,a){b="ngClass"+b;return["$animate",function(c){function d(a,b){var c=[],d=0;a:for(;d<a.length;d++){for(var e=a[d],m=0;m<b.length;m++)if(e==b[m])continue a;c.push(e)}return c}function e(a){if(!M(a)){if(w(a))return a.split(" ");if(X(a)){var b=[];q(a,function(a,c){a&&b.push(c)});return b}}return a}return{restrict:"AC",link:function(g,f,h){function l(a,b){var c=
|
||||||
|
f.data("$classCounts")||{},d=[];q(a,function(a){if(0<b||c[a])c[a]=(c[a]||0)+b,c[a]===+(0<b)&&d.push(a)});f.data("$classCounts",c);return d.join(" ")}function k(b){if(!0===a||g.$index%2===a){var k=e(b||[]);if(!m){var r=l(k,1);h.$addClass(r)}else if(!xa(b,m)){var q=e(m),r=d(k,q),k=d(q,k),k=l(k,-1),r=l(r,1);0===r.length?c.removeClass(f,k):0===k.length?c.addClass(f,r):c.setClass(f,r,k)}}m=ba(b)}var m;g.$watch(h[b],k,!0);h.$observe("class",function(a){k(g.$eval(h[b]))});"ngClass"!==b&&g.$watch("$index",
|
||||||
|
function(c,d){var f=c&1;if(f!==d&1){var k=e(g.$eval(h[b]));f===a?(f=l(k,1),h.$addClass(f)):(f=l(k,-1),h.$removeClass(f))}})}}}]}var K=function(b){return w(b)?b.toLowerCase():b},Fc=Object.prototype.hasOwnProperty,Fa=function(b){return w(b)?b.toUpperCase():b},S,y,Ga,ya=[].slice,Ke=[].push,wa=Object.prototype.toString,Pa=t("ng"),Ea=O.angular||(O.angular={}),Sa,Ka,ka=["0","0","0"];S=Y((/msie (\d+)/.exec(K(navigator.userAgent))||[])[1]);isNaN(S)&&(S=Y((/trident\/.*; rv:(\d+)/.exec(K(navigator.userAgent))||
|
||||||
|
[])[1]));C.$inject=[];Da.$inject=[];var ca=function(){return String.prototype.trim?function(b){return w(b)?b.trim():b}:function(b){return w(b)?b.replace(/^\s\s*/,"").replace(/\s\s*$/,""):b}}();Ka=9>S?function(b){b=b.nodeName?b:b[0];return b.scopeName&&"HTML"!=b.scopeName?Fa(b.scopeName+":"+b.nodeName):b.nodeName}:function(b){return b.nodeName?b.nodeName:b[0].nodeName};var Xc=/[A-Z]/g,$c={full:"1.2.16",major:1,minor:2,dot:16,codeName:"badger-enumeration"},Ua=N.cache={},gb=N.expando="ng-"+(new Date).getTime(),
|
||||||
|
me=1,Pc=O.document.addEventListener?function(b,a,c){b.addEventListener(a,c,!1)}:function(b,a,c){b.attachEvent("on"+a,c)},Fb=O.document.removeEventListener?function(b,a,c){b.removeEventListener(a,c,!1)}:function(b,a,c){b.detachEvent("on"+a,c)};N._data=function(b){return this.cache[b[this.expando]]||{}};var he=/([\:\-\_]+(.))/g,ie=/^moz([A-Z])/,Bb=t("jqLite"),je=/^<(\w+)\s*\/?>(?:<\/\1>|)$/,Cb=/<|&#?\w+;/,ke=/<([\w:]+)/,le=/<(?!area|br|col|embed|hr|img|input|link|meta|param)(([\w:]+)[^>]*)\/>/gi,ea=
|
||||||
|
{option:[1,'<select multiple="multiple">',"</select>"],thead:[1,"<table>","</table>"],col:[2,"<table><colgroup>","</colgroup></table>"],tr:[2,"<table><tbody>","</tbody></table>"],td:[3,"<table><tbody><tr>","</tr></tbody></table>"],_default:[0,"",""]};ea.optgroup=ea.option;ea.tbody=ea.tfoot=ea.colgroup=ea.caption=ea.thead;ea.th=ea.td;var Ja=N.prototype={ready:function(b){function a(){c||(c=!0,b())}var c=!1;"complete"===U.readyState?setTimeout(a):(this.on("DOMContentLoaded",a),N(O).on("load",a))},toString:function(){var b=
|
||||||
|
[];q(this,function(a){b.push(""+a)});return"["+b.join(", ")+"]"},eq:function(b){return 0<=b?y(this[b]):y(this[this.length+b])},length:0,push:Ke,sort:[].sort,splice:[].splice},kb={};q("multiple selected checked disabled readOnly required open".split(" "),function(b){kb[K(b)]=b});var nc={};q("input select option textarea button form details".split(" "),function(b){nc[Fa(b)]=!0});q({data:jc,inheritedData:jb,scope:function(b){return y(b).data("$scope")||jb(b.parentNode||b,["$isolateScope","$scope"])},
|
||||||
|
isolateScope:function(b){return y(b).data("$isolateScope")||y(b).data("$isolateScopeNoTemplate")},controller:kc,injector:function(b){return jb(b,"$injector")},removeAttr:function(b,a){b.removeAttribute(a)},hasClass:Gb,css:function(b,a,c){a=Ta(a);if(B(c))b.style[a]=c;else{var d;8>=S&&(d=b.currentStyle&&b.currentStyle[a],""===d&&(d="auto"));d=d||b.style[a];8>=S&&(d=""===d?s:d);return d}},attr:function(b,a,c){var d=K(a);if(kb[d])if(B(c))c?(b[a]=!0,b.setAttribute(a,d)):(b[a]=!1,b.removeAttribute(d));
|
||||||
|
else return b[a]||(b.attributes.getNamedItem(a)||C).specified?d:s;else if(B(c))b.setAttribute(a,c);else if(b.getAttribute)return b=b.getAttribute(a,2),null===b?s:b},prop:function(b,a,c){if(B(c))b[a]=c;else return b[a]},text:function(){function b(b,d){var e=a[b.nodeType];if(E(d))return e?b[e]:"";b[e]=d}var a=[];9>S?(a[1]="innerText",a[3]="nodeValue"):a[1]=a[3]="textContent";b.$dv="";return b}(),val:function(b,a){if(E(a)){if("SELECT"===Ka(b)&&b.multiple){var c=[];q(b.options,function(a){a.selected&&
|
||||||
|
c.push(a.value||a.text)});return 0===c.length?null:c}return b.value}b.value=a},html:function(b,a){if(E(a))return b.innerHTML;for(var c=0,d=b.childNodes;c<d.length;c++)Ha(d[c]);b.innerHTML=a},empty:lc},function(b,a){N.prototype[a]=function(a,d){var e,g;if(b!==lc&&(2==b.length&&b!==Gb&&b!==kc?a:d)===s){if(X(a)){for(e=0;e<this.length;e++)if(b===jc)b(this[e],a);else for(g in a)b(this[e],g,a[g]);return this}e=b.$dv;g=e===s?Math.min(this.length,1):this.length;for(var f=0;f<g;f++){var h=b(this[f],a,d);e=
|
||||||
|
e?e+h:h}return e}for(e=0;e<this.length;e++)b(this[e],a,d);return this}});q({removeData:hc,dealoc:Ha,on:function a(c,d,e,g){if(B(g))throw Bb("onargs");var f=la(c,"events"),h=la(c,"handle");f||la(c,"events",f={});h||la(c,"handle",h=ne(c,f));q(d.split(" "),function(d){var g=f[d];if(!g){if("mouseenter"==d||"mouseleave"==d){var m=U.body.contains||U.body.compareDocumentPosition?function(a,c){var d=9===a.nodeType?a.documentElement:a,e=c&&c.parentNode;return a===e||!!(e&&1===e.nodeType&&(d.contains?d.contains(e):
|
||||||
|
a.compareDocumentPosition&&a.compareDocumentPosition(e)&16))}:function(a,c){if(c)for(;c=c.parentNode;)if(c===a)return!0;return!1};f[d]=[];a(c,{mouseleave:"mouseout",mouseenter:"mouseover"}[d],function(a){var c=a.relatedTarget;c&&(c===this||m(this,c))||h(a,d)})}else Pc(c,d,h),f[d]=[];g=f[d]}g.push(e)})},off:ic,one:function(a,c,d){a=y(a);a.on(c,function g(){a.off(c,d);a.off(c,g)});a.on(c,d)},replaceWith:function(a,c){var d,e=a.parentNode;Ha(a);q(new N(c),function(c){d?e.insertBefore(c,d.nextSibling):
|
||||||
|
e.replaceChild(c,a);d=c})},children:function(a){var c=[];q(a.childNodes,function(a){1===a.nodeType&&c.push(a)});return c},contents:function(a){return a.contentDocument||a.childNodes||[]},append:function(a,c){q(new N(c),function(c){1!==a.nodeType&&11!==a.nodeType||a.appendChild(c)})},prepend:function(a,c){if(1===a.nodeType){var d=a.firstChild;q(new N(c),function(c){a.insertBefore(c,d)})}},wrap:function(a,c){c=y(c)[0];var d=a.parentNode;d&&d.replaceChild(c,a);c.appendChild(a)},remove:function(a){Ha(a);
|
||||||
|
var c=a.parentNode;c&&c.removeChild(a)},after:function(a,c){var d=a,e=a.parentNode;q(new N(c),function(a){e.insertBefore(a,d.nextSibling);d=a})},addClass:ib,removeClass:hb,toggleClass:function(a,c,d){c&&q(c.split(" "),function(c){var g=d;E(g)&&(g=!Gb(a,c));(g?ib:hb)(a,c)})},parent:function(a){return(a=a.parentNode)&&11!==a.nodeType?a:null},next:function(a){if(a.nextElementSibling)return a.nextElementSibling;for(a=a.nextSibling;null!=a&&1!==a.nodeType;)a=a.nextSibling;return a},find:function(a,c){return a.getElementsByTagName?
|
||||||
|
a.getElementsByTagName(c):[]},clone:Eb,triggerHandler:function(a,c,d){c=(la(a,"events")||{})[c];d=d||[];var e=[{preventDefault:C,stopPropagation:C}];q(c,function(c){c.apply(a,e.concat(d))})}},function(a,c){N.prototype[c]=function(c,e,g){for(var f,h=0;h<this.length;h++)E(f)?(f=a(this[h],c,e,g),B(f)&&(f=y(f))):Db(f,a(this[h],c,e,g));return B(f)?f:this};N.prototype.bind=N.prototype.on;N.prototype.unbind=N.prototype.off});Va.prototype={put:function(a,c){this[Ia(a)]=c},get:function(a){return this[Ia(a)]},
|
||||||
|
remove:function(a){var c=this[a=Ia(a)];delete this[a];return c}};var pe=/^function\s*[^\(]*\(\s*([^\)]*)\)/m,qe=/,/,re=/^\s*(_?)(\S+?)\1\s*$/,oe=/((\/\/.*$)|(\/\*[\s\S]*?\*\/))/mg,Wa=t("$injector"),Le=t("$animate"),Ld=["$provide",function(a){this.$$selectors={};this.register=function(c,d){var e=c+"-animation";if(c&&"."!=c.charAt(0))throw Le("notcsel",c);this.$$selectors[c.substr(1)]=e;a.factory(e,d)};this.classNameFilter=function(a){1===arguments.length&&(this.$$classNameFilter=a instanceof RegExp?
|
||||||
|
a:null);return this.$$classNameFilter};this.$get=["$timeout","$$asyncCallback",function(a,d){return{enter:function(a,c,f,h){f?f.after(a):(c&&c[0]||(c=f.parent()),c.append(a));h&&d(h)},leave:function(a,c){a.remove();c&&d(c)},move:function(a,c,d,h){this.enter(a,c,d,h)},addClass:function(a,c,f){c=w(c)?c:M(c)?c.join(" "):"";q(a,function(a){ib(a,c)});f&&d(f)},removeClass:function(a,c,f){c=w(c)?c:M(c)?c.join(" "):"";q(a,function(a){hb(a,c)});f&&d(f)},setClass:function(a,c,f,h){q(a,function(a){ib(a,c);hb(a,
|
||||||
|
f)});h&&d(h)},enabled:C}}]}],ja=t("$compile");cc.$inject=["$provide","$$sanitizeUriProvider"];var te=/^(x[\:\-_]|data[\:\-_])/i,vc=t("$interpolate"),Me=/^([^\?#]*)(\?([^#]*))?(#(.*))?$/,we={http:80,https:443,ftp:21},Kb=t("$location");Ac.prototype=Lb.prototype=zc.prototype={$$html5:!1,$$replace:!1,absUrl:nb("$$absUrl"),url:function(a,c){if(E(a))return this.$$url;var d=Me.exec(a);d[1]&&this.path(decodeURIComponent(d[1]));(d[2]||d[1])&&this.search(d[3]||"");this.hash(d[5]||"",c);return this},protocol:nb("$$protocol"),
|
||||||
|
host:nb("$$host"),port:nb("$$port"),path:Bc("$$path",function(a){return"/"==a.charAt(0)?a:"/"+a}),search:function(a,c){switch(arguments.length){case 0:return this.$$search;case 1:if(w(a))this.$$search=Yb(a);else if(X(a))this.$$search=a;else throw Kb("isrcharg");break;default:E(c)||null===c?delete this.$$search[a]:this.$$search[a]=c}this.$$compose();return this},hash:Bc("$$hash",Da),replace:function(){this.$$replace=!0;return this}};var Ba=t("$parse"),Ec={},ta,Ma={"null":function(){return null},"true":function(){return!0},
|
||||||
|
"false":function(){return!1},undefined:C,"+":function(a,c,d,e){d=d(a,c);e=e(a,c);return B(d)?B(e)?d+e:d:B(e)?e:s},"-":function(a,c,d,e){d=d(a,c);e=e(a,c);return(B(d)?d:0)-(B(e)?e:0)},"*":function(a,c,d,e){return d(a,c)*e(a,c)},"/":function(a,c,d,e){return d(a,c)/e(a,c)},"%":function(a,c,d,e){return d(a,c)%e(a,c)},"^":function(a,c,d,e){return d(a,c)^e(a,c)},"=":C,"===":function(a,c,d,e){return d(a,c)===e(a,c)},"!==":function(a,c,d,e){return d(a,c)!==e(a,c)},"==":function(a,c,d,e){return d(a,c)==e(a,
|
||||||
|
c)},"!=":function(a,c,d,e){return d(a,c)!=e(a,c)},"<":function(a,c,d,e){return d(a,c)<e(a,c)},">":function(a,c,d,e){return d(a,c)>e(a,c)},"<=":function(a,c,d,e){return d(a,c)<=e(a,c)},">=":function(a,c,d,e){return d(a,c)>=e(a,c)},"&&":function(a,c,d,e){return d(a,c)&&e(a,c)},"||":function(a,c,d,e){return d(a,c)||e(a,c)},"&":function(a,c,d,e){return d(a,c)&e(a,c)},"|":function(a,c,d,e){return e(a,c)(a,c,d(a,c))},"!":function(a,c,d){return!d(a,c)}},Ne={n:"\n",f:"\f",r:"\r",t:"\t",v:"\v","'":"'",'"':'"'},
|
||||||
|
Nb=function(a){this.options=a};Nb.prototype={constructor:Nb,lex:function(a){this.text=a;this.index=0;this.ch=s;this.lastCh=":";this.tokens=[];var c;for(a=[];this.index<this.text.length;){this.ch=this.text.charAt(this.index);if(this.is("\"'"))this.readString(this.ch);else if(this.isNumber(this.ch)||this.is(".")&&this.isNumber(this.peek()))this.readNumber();else if(this.isIdent(this.ch))this.readIdent(),this.was("{,")&&("{"===a[0]&&(c=this.tokens[this.tokens.length-1]))&&(c.json=-1===c.text.indexOf("."));
|
||||||
|
else if(this.is("(){}[].,;:?"))this.tokens.push({index:this.index,text:this.ch,json:this.was(":[,")&&this.is("{[")||this.is("}]:,")}),this.is("{[")&&a.unshift(this.ch),this.is("}]")&&a.shift(),this.index++;else if(this.isWhitespace(this.ch)){this.index++;continue}else{var d=this.ch+this.peek(),e=d+this.peek(2),g=Ma[this.ch],f=Ma[d],h=Ma[e];h?(this.tokens.push({index:this.index,text:e,fn:h}),this.index+=3):f?(this.tokens.push({index:this.index,text:d,fn:f}),this.index+=2):g?(this.tokens.push({index:this.index,
|
||||||
|
text:this.ch,fn:g,json:this.was("[,:")&&this.is("+-")}),this.index+=1):this.throwError("Unexpected next character ",this.index,this.index+1)}this.lastCh=this.ch}return this.tokens},is:function(a){return-1!==a.indexOf(this.ch)},was:function(a){return-1!==a.indexOf(this.lastCh)},peek:function(a){a=a||1;return this.index+a<this.text.length?this.text.charAt(this.index+a):!1},isNumber:function(a){return"0"<=a&&"9">=a},isWhitespace:function(a){return" "===a||"\r"===a||"\t"===a||"\n"===a||"\v"===a||"\u00a0"===
|
||||||
|
a},isIdent:function(a){return"a"<=a&&"z">=a||"A"<=a&&"Z">=a||"_"===a||"$"===a},isExpOperator:function(a){return"-"===a||"+"===a||this.isNumber(a)},throwError:function(a,c,d){d=d||this.index;c=B(c)?"s "+c+"-"+this.index+" ["+this.text.substring(c,d)+"]":" "+d;throw Ba("lexerr",a,c,this.text);},readNumber:function(){for(var a="",c=this.index;this.index<this.text.length;){var d=K(this.text.charAt(this.index));if("."==d||this.isNumber(d))a+=d;else{var e=this.peek();if("e"==d&&this.isExpOperator(e))a+=
|
||||||
|
d;else if(this.isExpOperator(d)&&e&&this.isNumber(e)&&"e"==a.charAt(a.length-1))a+=d;else if(!this.isExpOperator(d)||e&&this.isNumber(e)||"e"!=a.charAt(a.length-1))break;else this.throwError("Invalid exponent")}this.index++}a*=1;this.tokens.push({index:c,text:a,json:!0,fn:function(){return a}})},readIdent:function(){for(var a=this,c="",d=this.index,e,g,f,h;this.index<this.text.length;){h=this.text.charAt(this.index);if("."===h||this.isIdent(h)||this.isNumber(h))"."===h&&(e=this.index),c+=h;else break;
|
||||||
|
this.index++}if(e)for(g=this.index;g<this.text.length;){h=this.text.charAt(g);if("("===h){f=c.substr(e-d+1);c=c.substr(0,e-d);this.index=g;break}if(this.isWhitespace(h))g++;else break}d={index:d,text:c};if(Ma.hasOwnProperty(c))d.fn=Ma[c],d.json=Ma[c];else{var l=Dc(c,this.options,this.text);d.fn=D(function(a,c){return l(a,c)},{assign:function(d,e){return ob(d,c,e,a.text,a.options)}})}this.tokens.push(d);f&&(this.tokens.push({index:e,text:".",json:!1}),this.tokens.push({index:e+1,text:f,json:!1}))},
|
||||||
|
readString:function(a){var c=this.index;this.index++;for(var d="",e=a,g=!1;this.index<this.text.length;){var f=this.text.charAt(this.index),e=e+f;if(g)"u"===f?(f=this.text.substring(this.index+1,this.index+5),f.match(/[\da-f]{4}/i)||this.throwError("Invalid unicode escape [\\u"+f+"]"),this.index+=4,d+=String.fromCharCode(parseInt(f,16))):d=(g=Ne[f])?d+g:d+f,g=!1;else if("\\"===f)g=!0;else{if(f===a){this.index++;this.tokens.push({index:c,text:e,string:d,json:!0,fn:function(){return d}});return}d+=
|
||||||
|
f}this.index++}this.throwError("Unterminated quote",c)}};var $a=function(a,c,d){this.lexer=a;this.$filter=c;this.options=d};$a.ZERO=D(function(){return 0},{constant:!0});$a.prototype={constructor:$a,parse:function(a,c){this.text=a;this.json=c;this.tokens=this.lexer.lex(a);c&&(this.assignment=this.logicalOR,this.functionCall=this.fieldAccess=this.objectIndex=this.filterChain=function(){this.throwError("is not valid json",{text:a,index:0})});var d=c?this.primary():this.statements();0!==this.tokens.length&&
|
||||||
|
this.throwError("is an unexpected token",this.tokens[0]);d.literal=!!d.literal;d.constant=!!d.constant;return d},primary:function(){var a;if(this.expect("("))a=this.filterChain(),this.consume(")");else if(this.expect("["))a=this.arrayDeclaration();else if(this.expect("{"))a=this.object();else{var c=this.expect();(a=c.fn)||this.throwError("not a primary expression",c);c.json&&(a.constant=!0,a.literal=!0)}for(var d;c=this.expect("(","[",".");)"("===c.text?(a=this.functionCall(a,d),d=null):"["===c.text?
|
||||||
|
(d=a,a=this.objectIndex(a)):"."===c.text?(d=a,a=this.fieldAccess(a)):this.throwError("IMPOSSIBLE");return a},throwError:function(a,c){throw Ba("syntax",c.text,a,c.index+1,this.text,this.text.substring(c.index));},peekToken:function(){if(0===this.tokens.length)throw Ba("ueoe",this.text);return this.tokens[0]},peek:function(a,c,d,e){if(0<this.tokens.length){var g=this.tokens[0],f=g.text;if(f===a||f===c||f===d||f===e||!(a||c||d||e))return g}return!1},expect:function(a,c,d,e){return(a=this.peek(a,c,d,
|
||||||
|
e))?(this.json&&!a.json&&this.throwError("is not valid json",a),this.tokens.shift(),a):!1},consume:function(a){this.expect(a)||this.throwError("is unexpected, expecting ["+a+"]",this.peek())},unaryFn:function(a,c){return D(function(d,e){return a(d,e,c)},{constant:c.constant})},ternaryFn:function(a,c,d){return D(function(e,g){return a(e,g)?c(e,g):d(e,g)},{constant:a.constant&&c.constant&&d.constant})},binaryFn:function(a,c,d){return D(function(e,g){return c(e,g,a,d)},{constant:a.constant&&d.constant})},
|
||||||
|
statements:function(){for(var a=[];;)if(0<this.tokens.length&&!this.peek("}",")",";","]")&&a.push(this.filterChain()),!this.expect(";"))return 1===a.length?a[0]:function(c,d){for(var e,g=0;g<a.length;g++){var f=a[g];f&&(e=f(c,d))}return e}},filterChain:function(){for(var a=this.expression(),c;;)if(c=this.expect("|"))a=this.binaryFn(a,c.fn,this.filter());else return a},filter:function(){for(var a=this.expect(),c=this.$filter(a.text),d=[];;)if(a=this.expect(":"))d.push(this.expression());else{var e=
|
||||||
|
function(a,e,h){h=[h];for(var l=0;l<d.length;l++)h.push(d[l](a,e));return c.apply(a,h)};return function(){return e}}},expression:function(){return this.assignment()},assignment:function(){var a=this.ternary(),c,d;return(d=this.expect("="))?(a.assign||this.throwError("implies assignment but ["+this.text.substring(0,d.index)+"] can not be assigned to",d),c=this.ternary(),function(d,g){return a.assign(d,c(d,g),g)}):a},ternary:function(){var a=this.logicalOR(),c,d;if(this.expect("?")){c=this.ternary();
|
||||||
|
if(d=this.expect(":"))return this.ternaryFn(a,c,this.ternary());this.throwError("expected :",d)}else return a},logicalOR:function(){for(var a=this.logicalAND(),c;;)if(c=this.expect("||"))a=this.binaryFn(a,c.fn,this.logicalAND());else return a},logicalAND:function(){var a=this.equality(),c;if(c=this.expect("&&"))a=this.binaryFn(a,c.fn,this.logicalAND());return a},equality:function(){var a=this.relational(),c;if(c=this.expect("==","!=","===","!=="))a=this.binaryFn(a,c.fn,this.equality());return a},
|
||||||
|
relational:function(){var a=this.additive(),c;if(c=this.expect("<",">","<=",">="))a=this.binaryFn(a,c.fn,this.relational());return a},additive:function(){for(var a=this.multiplicative(),c;c=this.expect("+","-");)a=this.binaryFn(a,c.fn,this.multiplicative());return a},multiplicative:function(){for(var a=this.unary(),c;c=this.expect("*","/","%");)a=this.binaryFn(a,c.fn,this.unary());return a},unary:function(){var a;return this.expect("+")?this.primary():(a=this.expect("-"))?this.binaryFn($a.ZERO,a.fn,
|
||||||
|
this.unary()):(a=this.expect("!"))?this.unaryFn(a.fn,this.unary()):this.primary()},fieldAccess:function(a){var c=this,d=this.expect().text,e=Dc(d,this.options,this.text);return D(function(c,d,h){return e(h||a(c,d))},{assign:function(e,f,h){return ob(a(e,h),d,f,c.text,c.options)}})},objectIndex:function(a){var c=this,d=this.expression();this.consume("]");return D(function(e,g){var f=a(e,g),h=d(e,g),l;if(!f)return s;(f=Za(f[h],c.text))&&(f.then&&c.options.unwrapPromises)&&(l=f,"$$v"in f||(l.$$v=s,l.then(function(a){l.$$v=
|
||||||
|
a})),f=f.$$v);return f},{assign:function(e,g,f){var h=d(e,f);return Za(a(e,f),c.text)[h]=g}})},functionCall:function(a,c){var d=[];if(")"!==this.peekToken().text){do d.push(this.expression());while(this.expect(","))}this.consume(")");var e=this;return function(g,f){for(var h=[],l=c?c(g,f):g,k=0;k<d.length;k++)h.push(d[k](g,f));k=a(g,f,l)||C;Za(l,e.text);Za(k,e.text);h=k.apply?k.apply(l,h):k(h[0],h[1],h[2],h[3],h[4]);return Za(h,e.text)}},arrayDeclaration:function(){var a=[],c=!0;if("]"!==this.peekToken().text){do{if(this.peek("]"))break;
|
||||||
|
var d=this.expression();a.push(d);d.constant||(c=!1)}while(this.expect(","))}this.consume("]");return D(function(c,d){for(var f=[],h=0;h<a.length;h++)f.push(a[h](c,d));return f},{literal:!0,constant:c})},object:function(){var a=[],c=!0;if("}"!==this.peekToken().text){do{if(this.peek("}"))break;var d=this.expect(),d=d.string||d.text;this.consume(":");var e=this.expression();a.push({key:d,value:e});e.constant||(c=!1)}while(this.expect(","))}this.consume("}");return D(function(c,d){for(var e={},l=0;l<
|
||||||
|
a.length;l++){var k=a[l];e[k.key]=k.value(c,d)}return e},{literal:!0,constant:c})}};var Mb={},ua=t("$sce"),ga={HTML:"html",CSS:"css",URL:"url",RESOURCE_URL:"resourceUrl",JS:"js"},W=U.createElement("a"),Hc=sa(O.location.href,!0);gc.$inject=["$provide"];Ic.$inject=["$locale"];Kc.$inject=["$locale"];var Nc=".",Ie={yyyy:$("FullYear",4),yy:$("FullYear",2,0,!0),y:$("FullYear",1),MMMM:pb("Month"),MMM:pb("Month",!0),MM:$("Month",2,1),M:$("Month",1,1),dd:$("Date",2),d:$("Date",1),HH:$("Hours",2),H:$("Hours",
|
||||||
|
1),hh:$("Hours",2,-12),h:$("Hours",1,-12),mm:$("Minutes",2),m:$("Minutes",1),ss:$("Seconds",2),s:$("Seconds",1),sss:$("Milliseconds",3),EEEE:pb("Day"),EEE:pb("Day",!0),a:function(a,c){return 12>a.getHours()?c.AMPMS[0]:c.AMPMS[1]},Z:function(a){a=-1*a.getTimezoneOffset();return a=(0<=a?"+":"")+(Ob(Math[0<a?"floor":"ceil"](a/60),2)+Ob(Math.abs(a%60),2))}},He=/((?:[^yMdHhmsaZE']+)|(?:'(?:[^']|'')*')|(?:E+|y+|M+|d+|H+|h+|m+|s+|a|Z))(.*)/,Ge=/^\-?\d+$/;Jc.$inject=["$locale"];var Ee=aa(K),Fe=aa(Fa);Lc.$inject=
|
||||||
|
["$parse"];var cd=aa({restrict:"E",compile:function(a,c){8>=S&&(c.href||c.name||c.$set("href",""),a.append(U.createComment("IE fix")));if(!c.href&&!c.xlinkHref&&!c.name)return function(a,c){var g="[object SVGAnimatedString]"===wa.call(c.prop("href"))?"xlink:href":"href";c.on("click",function(a){c.attr(g)||a.preventDefault()})}}}),zb={};q(kb,function(a,c){if("multiple"!=a){var d=na("ng-"+c);zb[d]=function(){return{priority:100,link:function(a,g,f){a.$watch(f[d],function(a){f.$set(c,!!a)})}}}}});q(["src",
|
||||||
|
"srcset","href"],function(a){var c=na("ng-"+a);zb[c]=function(){return{priority:99,link:function(d,e,g){var f=a,h=a;"href"===a&&"[object SVGAnimatedString]"===wa.call(e.prop("href"))&&(h="xlinkHref",g.$attr[h]="xlink:href",f=null);g.$observe(c,function(a){a&&(g.$set(h,a),S&&f&&e.prop(f,g[h]))})}}}});var sb={$addControl:C,$removeControl:C,$setValidity:C,$setDirty:C,$setPristine:C};Oc.$inject=["$element","$attrs","$scope","$animate"];var Qc=function(a){return["$timeout",function(c){return{name:"form",
|
||||||
|
restrict:a?"EAC":"E",controller:Oc,compile:function(){return{pre:function(a,e,g,f){if(!g.action){var h=function(a){a.preventDefault?a.preventDefault():a.returnValue=!1};Pc(e[0],"submit",h);e.on("$destroy",function(){c(function(){Fb(e[0],"submit",h)},0,!1)})}var l=e.parent().controller("form"),k=g.name||g.ngForm;k&&ob(a,k,f,k);if(l)e.on("$destroy",function(){l.$removeControl(f);k&&ob(a,k,s,k);D(f,sb)})}}}}}]},dd=Qc(),qd=Qc(!0),Oe=/^(ftp|http|https):\/\/(\w+:{0,1}\w*@)?(\S+)(:[0-9]+)?(\/|\/([\w#!:.?+=&%@!\-\/]))?$/,
|
||||||
|
Pe=/^[a-z0-9!#$%&'*+/=?^_`{|}~.-]+@[a-z0-9-]+(\.[a-z0-9-]+)*$/i,Qe=/^\s*(\-|\+)?(\d+|(\d*(\.\d*)))\s*$/,Rc={text:ub,number:function(a,c,d,e,g,f){ub(a,c,d,e,g,f);e.$parsers.push(function(a){var c=e.$isEmpty(a);if(c||Qe.test(a))return e.$setValidity("number",!0),""===a?null:c?a:parseFloat(a);e.$setValidity("number",!1);return s});Je(e,"number",c);e.$formatters.push(function(a){return e.$isEmpty(a)?"":""+a});d.min&&(a=function(a){var c=parseFloat(d.min);return pa(e,"min",e.$isEmpty(a)||a>=c,a)},e.$parsers.push(a),
|
||||||
|
e.$formatters.push(a));d.max&&(a=function(a){var c=parseFloat(d.max);return pa(e,"max",e.$isEmpty(a)||a<=c,a)},e.$parsers.push(a),e.$formatters.push(a));e.$formatters.push(function(a){return pa(e,"number",e.$isEmpty(a)||vb(a),a)})},url:function(a,c,d,e,g,f){ub(a,c,d,e,g,f);a=function(a){return pa(e,"url",e.$isEmpty(a)||Oe.test(a),a)};e.$formatters.push(a);e.$parsers.push(a)},email:function(a,c,d,e,g,f){ub(a,c,d,e,g,f);a=function(a){return pa(e,"email",e.$isEmpty(a)||Pe.test(a),a)};e.$formatters.push(a);
|
||||||
|
e.$parsers.push(a)},radio:function(a,c,d,e){E(d.name)&&c.attr("name",bb());c.on("click",function(){c[0].checked&&a.$apply(function(){e.$setViewValue(d.value)})});e.$render=function(){c[0].checked=d.value==e.$viewValue};d.$observe("value",e.$render)},checkbox:function(a,c,d,e){var g=d.ngTrueValue,f=d.ngFalseValue;w(g)||(g=!0);w(f)||(f=!1);c.on("click",function(){a.$apply(function(){e.$setViewValue(c[0].checked)})});e.$render=function(){c[0].checked=e.$viewValue};e.$isEmpty=function(a){return a!==g};
|
||||||
|
e.$formatters.push(function(a){return a===g});e.$parsers.push(function(a){return a?g:f})},hidden:C,button:C,submit:C,reset:C,file:C},dc=["$browser","$sniffer",function(a,c){return{restrict:"E",require:"?ngModel",link:function(d,e,g,f){f&&(Rc[K(g.type)]||Rc.text)(d,e,g,f,c,a)}}}],rb="ng-valid",qb="ng-invalid",La="ng-pristine",tb="ng-dirty",Re=["$scope","$exceptionHandler","$attrs","$element","$parse","$animate",function(a,c,d,e,g,f){function h(a,c){c=c?"-"+fb(c,"-"):"";f.removeClass(e,(a?qb:rb)+c);
|
||||||
|
f.addClass(e,(a?rb:qb)+c)}this.$modelValue=this.$viewValue=Number.NaN;this.$parsers=[];this.$formatters=[];this.$viewChangeListeners=[];this.$pristine=!0;this.$dirty=!1;this.$valid=!0;this.$invalid=!1;this.$name=d.name;var l=g(d.ngModel),k=l.assign;if(!k)throw t("ngModel")("nonassign",d.ngModel,ha(e));this.$render=C;this.$isEmpty=function(a){return E(a)||""===a||null===a||a!==a};var m=e.inheritedData("$formController")||sb,n=0,p=this.$error={};e.addClass(La);h(!0);this.$setValidity=function(a,c){p[a]!==
|
||||||
|
!c&&(c?(p[a]&&n--,n||(h(!0),this.$valid=!0,this.$invalid=!1)):(h(!1),this.$invalid=!0,this.$valid=!1,n++),p[a]=!c,h(c,a),m.$setValidity(a,c,this))};this.$setPristine=function(){this.$dirty=!1;this.$pristine=!0;f.removeClass(e,tb);f.addClass(e,La)};this.$setViewValue=function(d){this.$viewValue=d;this.$pristine&&(this.$dirty=!0,this.$pristine=!1,f.removeClass(e,La),f.addClass(e,tb),m.$setDirty());q(this.$parsers,function(a){d=a(d)});this.$modelValue!==d&&(this.$modelValue=d,k(a,d),q(this.$viewChangeListeners,
|
||||||
|
function(a){try{a()}catch(d){c(d)}}))};var r=this;a.$watch(function(){var c=l(a);if(r.$modelValue!==c){var d=r.$formatters,e=d.length;for(r.$modelValue=c;e--;)c=d[e](c);r.$viewValue!==c&&(r.$viewValue=c,r.$render())}return c})}],Fd=function(){return{require:["ngModel","^?form"],controller:Re,link:function(a,c,d,e){var g=e[0],f=e[1]||sb;f.$addControl(g);a.$on("$destroy",function(){f.$removeControl(g)})}}},Hd=aa({require:"ngModel",link:function(a,c,d,e){e.$viewChangeListeners.push(function(){a.$eval(d.ngChange)})}}),
|
||||||
|
ec=function(){return{require:"?ngModel",link:function(a,c,d,e){if(e){d.required=!0;var g=function(a){if(d.required&&e.$isEmpty(a))e.$setValidity("required",!1);else return e.$setValidity("required",!0),a};e.$formatters.push(g);e.$parsers.unshift(g);d.$observe("required",function(){g(e.$viewValue)})}}}},Gd=function(){return{require:"ngModel",link:function(a,c,d,e){var g=(a=/\/(.*)\//.exec(d.ngList))&&RegExp(a[1])||d.ngList||",";e.$parsers.push(function(a){if(!E(a)){var c=[];a&&q(a.split(g),function(a){a&&
|
||||||
|
c.push(ca(a))});return c}});e.$formatters.push(function(a){return M(a)?a.join(", "):s});e.$isEmpty=function(a){return!a||!a.length}}}},Se=/^(true|false|\d+)$/,Id=function(){return{priority:100,compile:function(a,c){return Se.test(c.ngValue)?function(a,c,g){g.$set("value",a.$eval(g.ngValue))}:function(a,c,g){a.$watch(g.ngValue,function(a){g.$set("value",a)})}}}},id=va(function(a,c,d){c.addClass("ng-binding").data("$binding",d.ngBind);a.$watch(d.ngBind,function(a){c.text(a==s?"":a)})}),kd=["$interpolate",
|
||||||
|
function(a){return function(c,d,e){c=a(d.attr(e.$attr.ngBindTemplate));d.addClass("ng-binding").data("$binding",c);e.$observe("ngBindTemplate",function(a){d.text(a)})}}],jd=["$sce","$parse",function(a,c){return function(d,e,g){e.addClass("ng-binding").data("$binding",g.ngBindHtml);var f=c(g.ngBindHtml);d.$watch(function(){return(f(d)||"").toString()},function(c){e.html(a.getTrustedHtml(f(d))||"")})}}],ld=Pb("",!0),nd=Pb("Odd",0),md=Pb("Even",1),od=va({compile:function(a,c){c.$set("ngCloak",s);a.removeClass("ng-cloak")}}),
|
||||||
|
pd=[function(){return{scope:!0,controller:"@",priority:500}}],fc={};q("click dblclick mousedown mouseup mouseover mouseout mousemove mouseenter mouseleave keydown keyup keypress submit focus blur copy cut paste".split(" "),function(a){var c=na("ng-"+a);fc[c]=["$parse",function(d){return{compile:function(e,g){var f=d(g[c]);return function(c,d,e){d.on(K(a),function(a){c.$apply(function(){f(c,{$event:a})})})}}}}]});var sd=["$animate",function(a){return{transclude:"element",priority:600,terminal:!0,restrict:"A",
|
||||||
|
$$tlb:!0,link:function(c,d,e,g,f){var h,l,k;c.$watch(e.ngIf,function(g){Qa(g)?l||(l=c.$new(),f(l,function(c){c[c.length++]=U.createComment(" end ngIf: "+e.ngIf+" ");h={clone:c};a.enter(c,d.parent(),d)})):(k&&(k.remove(),k=null),l&&(l.$destroy(),l=null),h&&(k=yb(h.clone),a.leave(k,function(){k=null}),h=null))})}}}],td=["$http","$templateCache","$anchorScroll","$animate","$sce",function(a,c,d,e,g){return{restrict:"ECA",priority:400,terminal:!0,transclude:"element",controller:Ea.noop,compile:function(f,
|
||||||
|
h){var l=h.ngInclude||h.src,k=h.onload||"",m=h.autoscroll;return function(f,h,q,s,u){var F=0,v,y,A,x=function(){y&&(y.remove(),y=null);v&&(v.$destroy(),v=null);A&&(e.leave(A,function(){y=null}),y=A,A=null)};f.$watch(g.parseAsResourceUrl(l),function(g){var l=function(){!B(m)||m&&!f.$eval(m)||d()},q=++F;g?(a.get(g,{cache:c}).success(function(a){if(q===F){var c=f.$new();s.template=a;a=u(c,function(a){x();e.enter(a,null,h,l)});v=c;A=a;v.$emit("$includeContentLoaded");f.$eval(k)}}).error(function(){q===
|
||||||
|
F&&x()}),f.$emit("$includeContentRequested")):(x(),s.template=null)})}}}}],Jd=["$compile",function(a){return{restrict:"ECA",priority:-400,require:"ngInclude",link:function(c,d,e,g){d.html(g.template);a(d.contents())(c)}}}],ud=va({priority:450,compile:function(){return{pre:function(a,c,d){a.$eval(d.ngInit)}}}}),vd=va({terminal:!0,priority:1E3}),wd=["$locale","$interpolate",function(a,c){var d=/{}/g;return{restrict:"EA",link:function(e,g,f){var h=f.count,l=f.$attr.when&&g.attr(f.$attr.when),k=f.offset||
|
||||||
|
0,m=e.$eval(l)||{},n={},p=c.startSymbol(),r=c.endSymbol(),s=/^when(Minus)?(.+)$/;q(f,function(a,c){s.test(c)&&(m[K(c.replace("when","").replace("Minus","-"))]=g.attr(f.$attr[c]))});q(m,function(a,e){n[e]=c(a.replace(d,p+h+"-"+k+r))});e.$watch(function(){var c=parseFloat(e.$eval(h));if(isNaN(c))return"";c in m||(c=a.pluralCat(c-k));return n[c](e,g,!0)},function(a){g.text(a)})}}}],xd=["$parse","$animate",function(a,c){var d=t("ngRepeat");return{transclude:"element",priority:1E3,terminal:!0,$$tlb:!0,
|
||||||
|
link:function(e,g,f,h,l){var k=f.ngRepeat,m=k.match(/^\s*([\s\S]+?)\s+in\s+([\s\S]+?)(?:\s+track\s+by\s+([\s\S]+?))?\s*$/),n,p,r,s,u,F,v={$id:Ia};if(!m)throw d("iexp",k);f=m[1];h=m[2];(m=m[3])?(n=a(m),p=function(a,c,d){F&&(v[F]=a);v[u]=c;v.$index=d;return n(e,v)}):(r=function(a,c){return Ia(c)},s=function(a){return a});m=f.match(/^(?:([\$\w]+)|\(([\$\w]+)\s*,\s*([\$\w]+)\))$/);if(!m)throw d("iidexp",f);u=m[3]||m[1];F=m[2];var B={};e.$watchCollection(h,function(a){var f,h,m=g[0],n,v={},H,R,w,C,T,t,
|
||||||
|
E=[];if(ab(a))T=a,n=p||r;else{n=p||s;T=[];for(w in a)a.hasOwnProperty(w)&&"$"!=w.charAt(0)&&T.push(w);T.sort()}H=T.length;h=E.length=T.length;for(f=0;f<h;f++)if(w=a===T?f:T[f],C=a[w],C=n(w,C,f),Aa(C,"`track by` id"),B.hasOwnProperty(C))t=B[C],delete B[C],v[C]=t,E[f]=t;else{if(v.hasOwnProperty(C))throw q(E,function(a){a&&a.scope&&(B[a.id]=a)}),d("dupes",k,C);E[f]={id:C};v[C]=!1}for(w in B)B.hasOwnProperty(w)&&(t=B[w],f=yb(t.clone),c.leave(f),q(f,function(a){a.$$NG_REMOVED=!0}),t.scope.$destroy());
|
||||||
|
f=0;for(h=T.length;f<h;f++){w=a===T?f:T[f];C=a[w];t=E[f];E[f-1]&&(m=E[f-1].clone[E[f-1].clone.length-1]);if(t.scope){R=t.scope;n=m;do n=n.nextSibling;while(n&&n.$$NG_REMOVED);t.clone[0]!=n&&c.move(yb(t.clone),null,y(m));m=t.clone[t.clone.length-1]}else R=e.$new();R[u]=C;F&&(R[F]=w);R.$index=f;R.$first=0===f;R.$last=f===H-1;R.$middle=!(R.$first||R.$last);R.$odd=!(R.$even=0===(f&1));t.scope||l(R,function(a){a[a.length++]=U.createComment(" end ngRepeat: "+k+" ");c.enter(a,null,y(m));m=a;t.scope=R;t.clone=
|
||||||
|
a;v[t.id]=t})}B=v})}}}],yd=["$animate",function(a){return function(c,d,e){c.$watch(e.ngShow,function(c){a[Qa(c)?"removeClass":"addClass"](d,"ng-hide")})}}],rd=["$animate",function(a){return function(c,d,e){c.$watch(e.ngHide,function(c){a[Qa(c)?"addClass":"removeClass"](d,"ng-hide")})}}],zd=va(function(a,c,d){a.$watch(d.ngStyle,function(a,d){d&&a!==d&&q(d,function(a,d){c.css(d,"")});a&&c.css(a)},!0)}),Ad=["$animate",function(a){return{restrict:"EA",require:"ngSwitch",controller:["$scope",function(){this.cases=
|
||||||
|
{}}],link:function(c,d,e,g){var f,h,l,k=[];c.$watch(e.ngSwitch||e.on,function(d){var n,p=k.length;if(0<p){if(l){for(n=0;n<p;n++)l[n].remove();l=null}l=[];for(n=0;n<p;n++){var r=h[n];k[n].$destroy();l[n]=r;a.leave(r,function(){l.splice(n,1);0===l.length&&(l=null)})}}h=[];k=[];if(f=g.cases["!"+d]||g.cases["?"])c.$eval(e.change),q(f,function(d){var e=c.$new();k.push(e);d.transclude(e,function(c){var e=d.element;h.push(c);a.enter(c,e.parent(),e)})})})}}}],Bd=va({transclude:"element",priority:800,require:"^ngSwitch",
|
||||||
|
link:function(a,c,d,e,g){e.cases["!"+d.ngSwitchWhen]=e.cases["!"+d.ngSwitchWhen]||[];e.cases["!"+d.ngSwitchWhen].push({transclude:g,element:c})}}),Cd=va({transclude:"element",priority:800,require:"^ngSwitch",link:function(a,c,d,e,g){e.cases["?"]=e.cases["?"]||[];e.cases["?"].push({transclude:g,element:c})}}),Ed=va({link:function(a,c,d,e,g){if(!g)throw t("ngTransclude")("orphan",ha(c));g(function(a){c.empty();c.append(a)})}}),ed=["$templateCache",function(a){return{restrict:"E",terminal:!0,compile:function(c,
|
||||||
|
d){"text/ng-template"==d.type&&a.put(d.id,c[0].text)}}}],Te=t("ngOptions"),Dd=aa({terminal:!0}),fd=["$compile","$parse",function(a,c){var d=/^\s*([\s\S]+?)(?:\s+as\s+([\s\S]+?))?(?:\s+group\s+by\s+([\s\S]+?))?\s+for\s+(?:([\$\w][\$\w]*)|(?:\(\s*([\$\w][\$\w]*)\s*,\s*([\$\w][\$\w]*)\s*\)))\s+in\s+([\s\S]+?)(?:\s+track\s+by\s+([\s\S]+?))?$/,e={$setViewValue:C};return{restrict:"E",require:["select","?ngModel"],controller:["$element","$scope","$attrs",function(a,c,d){var l=this,k={},m=e,n;l.databound=
|
||||||
|
d.ngModel;l.init=function(a,c,d){m=a;n=d};l.addOption=function(c){Aa(c,'"option value"');k[c]=!0;m.$viewValue==c&&(a.val(c),n.parent()&&n.remove())};l.removeOption=function(a){this.hasOption(a)&&(delete k[a],m.$viewValue==a&&this.renderUnknownOption(a))};l.renderUnknownOption=function(c){c="? "+Ia(c)+" ?";n.val(c);a.prepend(n);a.val(c);n.prop("selected",!0)};l.hasOption=function(a){return k.hasOwnProperty(a)};c.$on("$destroy",function(){l.renderUnknownOption=C})}],link:function(e,f,h,l){function k(a,
|
||||||
|
c,d,e){d.$render=function(){var a=d.$viewValue;e.hasOption(a)?(A.parent()&&A.remove(),c.val(a),""===a&&w.prop("selected",!0)):E(a)&&w?c.val(""):e.renderUnknownOption(a)};c.on("change",function(){a.$apply(function(){A.parent()&&A.remove();d.$setViewValue(c.val())})})}function m(a,c,d){var e;d.$render=function(){var a=new Va(d.$viewValue);q(c.find("option"),function(c){c.selected=B(a.get(c.value))})};a.$watch(function(){xa(e,d.$viewValue)||(e=ba(d.$viewValue),d.$render())});c.on("change",function(){a.$apply(function(){var a=
|
||||||
|
[];q(c.find("option"),function(c){c.selected&&a.push(c.value)});d.$setViewValue(a)})})}function n(e,f,g){function h(){var a={"":[]},c=[""],d,k,s,t,z;t=g.$modelValue;z=y(e)||[];var E=n?Qb(z):z,F,I,A;I={};s=!1;var D,H;if(r)if(w&&M(t))for(s=new Va([]),A=0;A<t.length;A++)I[m]=t[A],s.put(w(e,I),t[A]);else s=new Va(t);for(A=0;F=E.length,A<F;A++){k=A;if(n){k=E[A];if("$"===k.charAt(0))continue;I[n]=k}I[m]=z[k];d=p(e,I)||"";(k=a[d])||(k=a[d]=[],c.push(d));r?d=B(s.remove(w?w(e,I):q(e,I))):(w?(d={},d[m]=t,d=
|
||||||
|
w(e,d)===w(e,I)):d=t===q(e,I),s=s||d);D=l(e,I);D=B(D)?D:"";k.push({id:w?w(e,I):n?E[A]:A,label:D,selected:d})}r||(u||null===t?a[""].unshift({id:"",label:"",selected:!s}):s||a[""].unshift({id:"?",label:"",selected:!0}));I=0;for(E=c.length;I<E;I++){d=c[I];k=a[d];x.length<=I?(t={element:C.clone().attr("label",d),label:k.label},z=[t],x.push(z),f.append(t.element)):(z=x[I],t=z[0],t.label!=d&&t.element.attr("label",t.label=d));D=null;A=0;for(F=k.length;A<F;A++)s=k[A],(d=z[A+1])?(D=d.element,d.label!==s.label&&
|
||||||
|
D.text(d.label=s.label),d.id!==s.id&&D.val(d.id=s.id),d.selected!==s.selected&&D.prop("selected",d.selected=s.selected)):(""===s.id&&u?H=u:(H=v.clone()).val(s.id).attr("selected",s.selected).text(s.label),z.push({element:H,label:s.label,id:s.id,selected:s.selected}),D?D.after(H):t.element.append(H),D=H);for(A++;z.length>A;)z.pop().element.remove()}for(;x.length>I;)x.pop()[0].element.remove()}var k;if(!(k=t.match(d)))throw Te("iexp",t,ha(f));var l=c(k[2]||k[1]),m=k[4]||k[6],n=k[5],p=c(k[3]||""),q=
|
||||||
|
c(k[2]?k[1]:m),y=c(k[7]),w=k[8]?c(k[8]):null,x=[[{element:f,label:""}]];u&&(a(u)(e),u.removeClass("ng-scope"),u.remove());f.empty();f.on("change",function(){e.$apply(function(){var a,c=y(e)||[],d={},h,k,l,p,t,v,u;if(r)for(k=[],p=0,v=x.length;p<v;p++)for(a=x[p],l=1,t=a.length;l<t;l++){if((h=a[l].element)[0].selected){h=h.val();n&&(d[n]=h);if(w)for(u=0;u<c.length&&(d[m]=c[u],w(e,d)!=h);u++);else d[m]=c[h];k.push(q(e,d))}}else{h=f.val();if("?"==h)k=s;else if(""===h)k=null;else if(w)for(u=0;u<c.length;u++){if(d[m]=
|
||||||
|
c[u],w(e,d)==h){k=q(e,d);break}}else d[m]=c[h],n&&(d[n]=h),k=q(e,d);1<x[0].length&&x[0][1].id!==h&&(x[0][1].selected=!1)}g.$setViewValue(k)})});g.$render=h;e.$watch(h)}if(l[1]){var p=l[0];l=l[1];var r=h.multiple,t=h.ngOptions,u=!1,w,v=y(U.createElement("option")),C=y(U.createElement("optgroup")),A=v.clone();h=0;for(var x=f.children(),D=x.length;h<D;h++)if(""===x[h].value){w=u=x.eq(h);break}p.init(l,u,A);r&&(l.$isEmpty=function(a){return!a||0===a.length});t?n(e,f,l):r?m(e,f,l):k(e,f,l,p)}}}}],hd=["$interpolate",
|
||||||
|
function(a){var c={addOption:C,removeOption:C};return{restrict:"E",priority:100,compile:function(d,e){if(E(e.value)){var g=a(d.text(),!0);g||e.$set("value",d.text())}return function(a,d,e){var k=d.parent(),m=k.data("$selectController")||k.parent().data("$selectController");m&&m.databound?d.prop("selected",!1):m=c;g?a.$watch(g,function(a,c){e.$set("value",a);a!==c&&m.removeOption(c);m.addOption(a)}):m.addOption(e.value);d.on("$destroy",function(){m.removeOption(e.value)})}}}}],gd=aa({restrict:"E",
|
||||||
|
terminal:!0});O.angular.bootstrap?console.log("WARNING: Tried to load angular more than once."):((Ga=O.jQuery)?(y=Ga,D(Ga.fn,{scope:Ja.scope,isolateScope:Ja.isolateScope,controller:Ja.controller,injector:Ja.injector,inheritedData:Ja.inheritedData}),Ab("remove",!0,!0,!1),Ab("empty",!1,!1,!1),Ab("html",!1,!1,!0)):y=N,Ea.element=y,Zc(Ea),y(U).ready(function(){Wc(U,$b)}))})(window,document);!angular.$$csp()&&angular.element(document).find("head").prepend('<style type="text/css">@charset "UTF-8";[ng\\:cloak],[ng-cloak],[data-ng-cloak],[x-ng-cloak],.ng-cloak,.x-ng-cloak,.ng-hide{display:none !important;}ng\\:form{display:block;}.ng-animate-block-transitions{transition:0s all!important;-webkit-transition:0s all!important;}</style>');
|
||||||
|
//# sourceMappingURL=angular.min.js.map
|
Двоичный файл не отображается.
Различия файлов скрыты, потому что одна или несколько строк слишком длинны
|
@ -0,0 +1,7 @@
|
||||||
|
{
|
||||||
|
"name": "angular",
|
||||||
|
"version": "1.2.16",
|
||||||
|
"main": "./angular.js",
|
||||||
|
"dependencies": {
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,361 @@
|
||||||
|
/* ===========================================================
|
||||||
|
* bootstrap-tooltip.js v2.3.1
|
||||||
|
* http://twitter.github.com/bootstrap/javascript.html#tooltips
|
||||||
|
* Inspired by the original jQuery.tipsy by Jason Frame
|
||||||
|
* ===========================================================
|
||||||
|
* Copyright 2012 Twitter, Inc.
|
||||||
|
*
|
||||||
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
* you may not use this file except in compliance with the License.
|
||||||
|
* You may obtain a copy of the License at
|
||||||
|
*
|
||||||
|
* http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
*
|
||||||
|
* Unless required by applicable law or agreed to in writing, software
|
||||||
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
* See the License for the specific language governing permissions and
|
||||||
|
* limitations under the License.
|
||||||
|
* ========================================================== */
|
||||||
|
|
||||||
|
|
||||||
|
!function ($) {
|
||||||
|
|
||||||
|
"use strict"; // jshint ;_;
|
||||||
|
|
||||||
|
|
||||||
|
/* TOOLTIP PUBLIC CLASS DEFINITION
|
||||||
|
* =============================== */
|
||||||
|
|
||||||
|
var Tooltip = function (element, options) {
|
||||||
|
this.init('tooltip', element, options)
|
||||||
|
}
|
||||||
|
|
||||||
|
Tooltip.prototype = {
|
||||||
|
|
||||||
|
constructor: Tooltip
|
||||||
|
|
||||||
|
, init: function (type, element, options) {
|
||||||
|
var eventIn
|
||||||
|
, eventOut
|
||||||
|
, triggers
|
||||||
|
, trigger
|
||||||
|
, i
|
||||||
|
|
||||||
|
this.type = type
|
||||||
|
this.$element = $(element)
|
||||||
|
this.options = this.getOptions(options)
|
||||||
|
this.enabled = true
|
||||||
|
|
||||||
|
triggers = this.options.trigger.split(' ')
|
||||||
|
|
||||||
|
for (i = triggers.length; i--;) {
|
||||||
|
trigger = triggers[i]
|
||||||
|
if (trigger == 'click') {
|
||||||
|
this.$element.on('click.' + this.type, this.options.selector, $.proxy(this.toggle, this))
|
||||||
|
} else if (trigger != 'manual') {
|
||||||
|
eventIn = trigger == 'hover' ? 'mouseenter' : 'focus'
|
||||||
|
eventOut = trigger == 'hover' ? 'mouseleave' : 'blur'
|
||||||
|
this.$element.on(eventIn + '.' + this.type, this.options.selector, $.proxy(this.enter, this))
|
||||||
|
this.$element.on(eventOut + '.' + this.type, this.options.selector, $.proxy(this.leave, this))
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
this.options.selector ?
|
||||||
|
(this._options = $.extend({}, this.options, { trigger: 'manual', selector: '' })) :
|
||||||
|
this.fixTitle()
|
||||||
|
}
|
||||||
|
|
||||||
|
, getOptions: function (options) {
|
||||||
|
options = $.extend({}, $.fn[this.type].defaults, this.$element.data(), options)
|
||||||
|
|
||||||
|
if (options.delay && typeof options.delay == 'number') {
|
||||||
|
options.delay = {
|
||||||
|
show: options.delay
|
||||||
|
, hide: options.delay
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return options
|
||||||
|
}
|
||||||
|
|
||||||
|
, enter: function (e) {
|
||||||
|
var defaults = $.fn[this.type].defaults
|
||||||
|
, options = {}
|
||||||
|
, self
|
||||||
|
|
||||||
|
this._options && $.each(this._options, function (key, value) {
|
||||||
|
if (defaults[key] != value) options[key] = value
|
||||||
|
}, this)
|
||||||
|
|
||||||
|
self = $(e.currentTarget)[this.type](options).data(this.type)
|
||||||
|
|
||||||
|
if (!self.options.delay || !self.options.delay.show) return self.show()
|
||||||
|
|
||||||
|
clearTimeout(this.timeout)
|
||||||
|
self.hoverState = 'in'
|
||||||
|
this.timeout = setTimeout(function() {
|
||||||
|
if (self.hoverState == 'in') self.show()
|
||||||
|
}, self.options.delay.show)
|
||||||
|
}
|
||||||
|
|
||||||
|
, leave: function (e) {
|
||||||
|
var self = $(e.currentTarget)[this.type](this._options).data(this.type)
|
||||||
|
|
||||||
|
if (this.timeout) clearTimeout(this.timeout)
|
||||||
|
if (!self.options.delay || !self.options.delay.hide) return self.hide()
|
||||||
|
|
||||||
|
self.hoverState = 'out'
|
||||||
|
this.timeout = setTimeout(function() {
|
||||||
|
if (self.hoverState == 'out') self.hide()
|
||||||
|
}, self.options.delay.hide)
|
||||||
|
}
|
||||||
|
|
||||||
|
, show: function () {
|
||||||
|
var $tip
|
||||||
|
, pos
|
||||||
|
, actualWidth
|
||||||
|
, actualHeight
|
||||||
|
, placement
|
||||||
|
, tp
|
||||||
|
, e = $.Event('show')
|
||||||
|
|
||||||
|
if (this.hasContent() && this.enabled) {
|
||||||
|
this.$element.trigger(e)
|
||||||
|
if (e.isDefaultPrevented()) return
|
||||||
|
$tip = this.tip()
|
||||||
|
this.setContent()
|
||||||
|
|
||||||
|
if (this.options.animation) {
|
||||||
|
$tip.addClass('fade')
|
||||||
|
}
|
||||||
|
|
||||||
|
placement = typeof this.options.placement == 'function' ?
|
||||||
|
this.options.placement.call(this, $tip[0], this.$element[0]) :
|
||||||
|
this.options.placement
|
||||||
|
|
||||||
|
$tip
|
||||||
|
.detach()
|
||||||
|
.css({ top: 0, left: 0, display: 'block' })
|
||||||
|
|
||||||
|
this.options.container ? $tip.appendTo(this.options.container) : $tip.insertAfter(this.$element)
|
||||||
|
|
||||||
|
pos = this.getPosition()
|
||||||
|
|
||||||
|
actualWidth = $tip[0].offsetWidth
|
||||||
|
actualHeight = $tip[0].offsetHeight
|
||||||
|
|
||||||
|
switch (placement) {
|
||||||
|
case 'bottom':
|
||||||
|
tp = {top: pos.top + pos.height, left: pos.left + pos.width / 2 - actualWidth / 2}
|
||||||
|
break
|
||||||
|
case 'top':
|
||||||
|
tp = {top: pos.top - actualHeight, left: pos.left + pos.width / 2 - actualWidth / 2}
|
||||||
|
break
|
||||||
|
case 'left':
|
||||||
|
tp = {top: pos.top + pos.height / 2 - actualHeight / 2, left: pos.left - actualWidth}
|
||||||
|
break
|
||||||
|
case 'right':
|
||||||
|
tp = {top: pos.top + pos.height / 2 - actualHeight / 2, left: pos.left + pos.width}
|
||||||
|
break
|
||||||
|
}
|
||||||
|
|
||||||
|
this.applyPlacement(tp, placement)
|
||||||
|
this.$element.trigger('shown')
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
, applyPlacement: function(offset, placement){
|
||||||
|
var $tip = this.tip()
|
||||||
|
, width = $tip[0].offsetWidth
|
||||||
|
, height = $tip[0].offsetHeight
|
||||||
|
, actualWidth
|
||||||
|
, actualHeight
|
||||||
|
, delta
|
||||||
|
, replace
|
||||||
|
|
||||||
|
$tip
|
||||||
|
.offset(offset)
|
||||||
|
.addClass(placement)
|
||||||
|
.addClass('in')
|
||||||
|
|
||||||
|
actualWidth = $tip[0].offsetWidth
|
||||||
|
actualHeight = $tip[0].offsetHeight
|
||||||
|
|
||||||
|
if (placement == 'top' && actualHeight != height) {
|
||||||
|
offset.top = offset.top + height - actualHeight
|
||||||
|
replace = true
|
||||||
|
}
|
||||||
|
|
||||||
|
if (placement == 'bottom' || placement == 'top') {
|
||||||
|
delta = 0
|
||||||
|
|
||||||
|
if (offset.left < 0){
|
||||||
|
delta = offset.left * -2
|
||||||
|
offset.left = 0
|
||||||
|
$tip.offset(offset)
|
||||||
|
actualWidth = $tip[0].offsetWidth
|
||||||
|
actualHeight = $tip[0].offsetHeight
|
||||||
|
}
|
||||||
|
|
||||||
|
this.replaceArrow(delta - width + actualWidth, actualWidth, 'left')
|
||||||
|
} else {
|
||||||
|
this.replaceArrow(actualHeight - height, actualHeight, 'top')
|
||||||
|
}
|
||||||
|
|
||||||
|
if (replace) $tip.offset(offset)
|
||||||
|
}
|
||||||
|
|
||||||
|
, replaceArrow: function(delta, dimension, position){
|
||||||
|
this
|
||||||
|
.arrow()
|
||||||
|
.css(position, delta ? (50 * (1 - delta / dimension) + "%") : '')
|
||||||
|
}
|
||||||
|
|
||||||
|
, setContent: function () {
|
||||||
|
var $tip = this.tip()
|
||||||
|
, title = this.getTitle()
|
||||||
|
|
||||||
|
$tip.find('.tooltip-inner')[this.options.html ? 'html' : 'text'](title)
|
||||||
|
$tip.removeClass('fade in top bottom left right')
|
||||||
|
}
|
||||||
|
|
||||||
|
, hide: function () {
|
||||||
|
var that = this
|
||||||
|
, $tip = this.tip()
|
||||||
|
, e = $.Event('hide')
|
||||||
|
|
||||||
|
this.$element.trigger(e)
|
||||||
|
if (e.isDefaultPrevented()) return
|
||||||
|
|
||||||
|
$tip.removeClass('in')
|
||||||
|
|
||||||
|
function removeWithAnimation() {
|
||||||
|
var timeout = setTimeout(function () {
|
||||||
|
$tip.off($.support.transition.end).detach()
|
||||||
|
}, 500)
|
||||||
|
|
||||||
|
$tip.one($.support.transition.end, function () {
|
||||||
|
clearTimeout(timeout)
|
||||||
|
$tip.detach()
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
$.support.transition && this.$tip.hasClass('fade') ?
|
||||||
|
removeWithAnimation() :
|
||||||
|
$tip.detach()
|
||||||
|
|
||||||
|
this.$element.trigger('hidden')
|
||||||
|
|
||||||
|
return this
|
||||||
|
}
|
||||||
|
|
||||||
|
, fixTitle: function () {
|
||||||
|
var $e = this.$element
|
||||||
|
if ($e.attr('title') || typeof($e.attr('data-original-title')) != 'string') {
|
||||||
|
$e.attr('data-original-title', $e.attr('title') || '').attr('title', '')
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
, hasContent: function () {
|
||||||
|
return this.getTitle()
|
||||||
|
}
|
||||||
|
|
||||||
|
, getPosition: function () {
|
||||||
|
var el = this.$element[0]
|
||||||
|
return $.extend({}, (typeof el.getBoundingClientRect == 'function') ? el.getBoundingClientRect() : {
|
||||||
|
width: el.offsetWidth
|
||||||
|
, height: el.offsetHeight
|
||||||
|
}, this.$element.offset())
|
||||||
|
}
|
||||||
|
|
||||||
|
, getTitle: function () {
|
||||||
|
var title
|
||||||
|
, $e = this.$element
|
||||||
|
, o = this.options
|
||||||
|
|
||||||
|
title = $e.attr('data-original-title')
|
||||||
|
|| (typeof o.title == 'function' ? o.title.call($e[0]) : o.title)
|
||||||
|
|
||||||
|
return title
|
||||||
|
}
|
||||||
|
|
||||||
|
, tip: function () {
|
||||||
|
return this.$tip = this.$tip || $(this.options.template)
|
||||||
|
}
|
||||||
|
|
||||||
|
, arrow: function(){
|
||||||
|
return this.$arrow = this.$arrow || this.tip().find(".tooltip-arrow")
|
||||||
|
}
|
||||||
|
|
||||||
|
, validate: function () {
|
||||||
|
if (!this.$element[0].parentNode) {
|
||||||
|
this.hide()
|
||||||
|
this.$element = null
|
||||||
|
this.options = null
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
, enable: function () {
|
||||||
|
this.enabled = true
|
||||||
|
}
|
||||||
|
|
||||||
|
, disable: function () {
|
||||||
|
this.enabled = false
|
||||||
|
}
|
||||||
|
|
||||||
|
, toggleEnabled: function () {
|
||||||
|
this.enabled = !this.enabled
|
||||||
|
}
|
||||||
|
|
||||||
|
, toggle: function (e) {
|
||||||
|
var self = e ? $(e.currentTarget)[this.type](this._options).data(this.type) : this
|
||||||
|
self.tip().hasClass('in') ? self.hide() : self.show()
|
||||||
|
}
|
||||||
|
|
||||||
|
, destroy: function () {
|
||||||
|
this.hide().$element.off('.' + this.type).removeData(this.type)
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/* TOOLTIP PLUGIN DEFINITION
|
||||||
|
* ========================= */
|
||||||
|
|
||||||
|
var old = $.fn.tooltip
|
||||||
|
|
||||||
|
$.fn.tooltip = function ( option ) {
|
||||||
|
return this.each(function () {
|
||||||
|
var $this = $(this)
|
||||||
|
, data = $this.data('tooltip')
|
||||||
|
, options = typeof option == 'object' && option
|
||||||
|
if (!data) $this.data('tooltip', (data = new Tooltip(this, options)))
|
||||||
|
if (typeof option == 'string') data[option]()
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
$.fn.tooltip.Constructor = Tooltip
|
||||||
|
|
||||||
|
$.fn.tooltip.defaults = {
|
||||||
|
animation: true
|
||||||
|
, placement: 'top'
|
||||||
|
, selector: false
|
||||||
|
, template: '<div class="tooltip"><div class="tooltip-arrow"></div><div class="tooltip-inner"></div></div>'
|
||||||
|
, trigger: 'hover focus'
|
||||||
|
, title: ''
|
||||||
|
, delay: 0
|
||||||
|
, html: false
|
||||||
|
, container: false
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/* TOOLTIP NO CONFLICT
|
||||||
|
* =================== */
|
||||||
|
|
||||||
|
$.fn.tooltip.noConflict = function () {
|
||||||
|
$.fn.tooltip = old
|
||||||
|
return this
|
||||||
|
}
|
||||||
|
|
||||||
|
}(window.jQuery);
|
|
@ -0,0 +1,38 @@
|
||||||
|
{
|
||||||
|
"name": "jquery",
|
||||||
|
"version": "2.1.1",
|
||||||
|
"main": "dist/jquery.js",
|
||||||
|
"license": "MIT",
|
||||||
|
"ignore": [
|
||||||
|
"**/.*",
|
||||||
|
"build",
|
||||||
|
"speed",
|
||||||
|
"test",
|
||||||
|
"*.md",
|
||||||
|
"AUTHORS.txt",
|
||||||
|
"Gruntfile.js",
|
||||||
|
"package.json"
|
||||||
|
],
|
||||||
|
"devDependencies": {
|
||||||
|
"sizzle": "1.10.19",
|
||||||
|
"requirejs": "2.1.10",
|
||||||
|
"qunit": "1.14.0",
|
||||||
|
"sinon": "1.8.1"
|
||||||
|
},
|
||||||
|
"keywords": [
|
||||||
|
"jquery",
|
||||||
|
"javascript",
|
||||||
|
"library"
|
||||||
|
],
|
||||||
|
"homepage": "https://github.com/jquery/jquery",
|
||||||
|
"_release": "2.1.1",
|
||||||
|
"_resolution": {
|
||||||
|
"type": "version",
|
||||||
|
"tag": "2.1.1",
|
||||||
|
"commit": "4dec426aa2a6cbabb1b064319ba7c272d594a688"
|
||||||
|
},
|
||||||
|
"_source": "git://github.com/jquery/jquery.git",
|
||||||
|
"_target": "~2.1.1",
|
||||||
|
"_originalSource": "jquery",
|
||||||
|
"_direct": true
|
||||||
|
}
|
|
@ -0,0 +1,21 @@
|
||||||
|
Copyright 2014 jQuery Foundation and other contributors
|
||||||
|
http://jquery.com/
|
||||||
|
|
||||||
|
Permission is hereby granted, free of charge, to any person obtaining
|
||||||
|
a copy of this software and associated documentation files (the
|
||||||
|
"Software"), to deal in the Software without restriction, including
|
||||||
|
without limitation the rights to use, copy, modify, merge, publish,
|
||||||
|
distribute, sublicense, and/or sell copies of the Software, and to
|
||||||
|
permit persons to whom the Software is furnished to do so, subject to
|
||||||
|
the following conditions:
|
||||||
|
|
||||||
|
The above copyright notice and this permission notice shall be
|
||||||
|
included in all copies or substantial portions of the Software.
|
||||||
|
|
||||||
|
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
||||||
|
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
||||||
|
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
||||||
|
NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
|
||||||
|
LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
|
||||||
|
OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
|
||||||
|
WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
|
@ -0,0 +1,27 @@
|
||||||
|
{
|
||||||
|
"name": "jquery",
|
||||||
|
"version": "2.1.1",
|
||||||
|
"main": "dist/jquery.js",
|
||||||
|
"license": "MIT",
|
||||||
|
"ignore": [
|
||||||
|
"**/.*",
|
||||||
|
"build",
|
||||||
|
"speed",
|
||||||
|
"test",
|
||||||
|
"*.md",
|
||||||
|
"AUTHORS.txt",
|
||||||
|
"Gruntfile.js",
|
||||||
|
"package.json"
|
||||||
|
],
|
||||||
|
"devDependencies": {
|
||||||
|
"sizzle": "1.10.19",
|
||||||
|
"requirejs": "2.1.10",
|
||||||
|
"qunit": "1.14.0",
|
||||||
|
"sinon": "1.8.1"
|
||||||
|
},
|
||||||
|
"keywords": [
|
||||||
|
"jquery",
|
||||||
|
"javascript",
|
||||||
|
"library"
|
||||||
|
]
|
||||||
|
}
|
Разница между файлами не показана из-за своего большого размера
Загрузить разницу
Различия файлов скрыты, потому что одна или несколько строк слишком длинны
Различия файлов скрыты, потому что одна или несколько строк слишком длинны
|
@ -0,0 +1,806 @@
|
||||||
|
define([
|
||||||
|
"./core",
|
||||||
|
"./var/rnotwhite",
|
||||||
|
"./ajax/var/nonce",
|
||||||
|
"./ajax/var/rquery",
|
||||||
|
"./core/init",
|
||||||
|
"./ajax/parseJSON",
|
||||||
|
"./ajax/parseXML",
|
||||||
|
"./deferred"
|
||||||
|
], function( jQuery, rnotwhite, nonce, rquery ) {
|
||||||
|
|
||||||
|
var
|
||||||
|
// Document location
|
||||||
|
ajaxLocParts,
|
||||||
|
ajaxLocation,
|
||||||
|
|
||||||
|
rhash = /#.*$/,
|
||||||
|
rts = /([?&])_=[^&]*/,
|
||||||
|
rheaders = /^(.*?):[ \t]*([^\r\n]*)$/mg,
|
||||||
|
// #7653, #8125, #8152: local protocol detection
|
||||||
|
rlocalProtocol = /^(?:about|app|app-storage|.+-extension|file|res|widget):$/,
|
||||||
|
rnoContent = /^(?:GET|HEAD)$/,
|
||||||
|
rprotocol = /^\/\//,
|
||||||
|
rurl = /^([\w.+-]+:)(?:\/\/(?:[^\/?#]*@|)([^\/?#:]*)(?::(\d+)|)|)/,
|
||||||
|
|
||||||
|
/* Prefilters
|
||||||
|
* 1) They are useful to introduce custom dataTypes (see ajax/jsonp.js for an example)
|
||||||
|
* 2) These are called:
|
||||||
|
* - BEFORE asking for a transport
|
||||||
|
* - AFTER param serialization (s.data is a string if s.processData is true)
|
||||||
|
* 3) key is the dataType
|
||||||
|
* 4) the catchall symbol "*" can be used
|
||||||
|
* 5) execution will start with transport dataType and THEN continue down to "*" if needed
|
||||||
|
*/
|
||||||
|
prefilters = {},
|
||||||
|
|
||||||
|
/* Transports bindings
|
||||||
|
* 1) key is the dataType
|
||||||
|
* 2) the catchall symbol "*" can be used
|
||||||
|
* 3) selection will start with transport dataType and THEN go to "*" if needed
|
||||||
|
*/
|
||||||
|
transports = {},
|
||||||
|
|
||||||
|
// Avoid comment-prolog char sequence (#10098); must appease lint and evade compression
|
||||||
|
allTypes = "*/".concat("*");
|
||||||
|
|
||||||
|
// #8138, IE may throw an exception when accessing
|
||||||
|
// a field from window.location if document.domain has been set
|
||||||
|
try {
|
||||||
|
ajaxLocation = location.href;
|
||||||
|
} catch( e ) {
|
||||||
|
// Use the href attribute of an A element
|
||||||
|
// since IE will modify it given document.location
|
||||||
|
ajaxLocation = document.createElement( "a" );
|
||||||
|
ajaxLocation.href = "";
|
||||||
|
ajaxLocation = ajaxLocation.href;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Segment location into parts
|
||||||
|
ajaxLocParts = rurl.exec( ajaxLocation.toLowerCase() ) || [];
|
||||||
|
|
||||||
|
// Base "constructor" for jQuery.ajaxPrefilter and jQuery.ajaxTransport
|
||||||
|
function addToPrefiltersOrTransports( structure ) {
|
||||||
|
|
||||||
|
// dataTypeExpression is optional and defaults to "*"
|
||||||
|
return function( dataTypeExpression, func ) {
|
||||||
|
|
||||||
|
if ( typeof dataTypeExpression !== "string" ) {
|
||||||
|
func = dataTypeExpression;
|
||||||
|
dataTypeExpression = "*";
|
||||||
|
}
|
||||||
|
|
||||||
|
var dataType,
|
||||||
|
i = 0,
|
||||||
|
dataTypes = dataTypeExpression.toLowerCase().match( rnotwhite ) || [];
|
||||||
|
|
||||||
|
if ( jQuery.isFunction( func ) ) {
|
||||||
|
// For each dataType in the dataTypeExpression
|
||||||
|
while ( (dataType = dataTypes[i++]) ) {
|
||||||
|
// Prepend if requested
|
||||||
|
if ( dataType[0] === "+" ) {
|
||||||
|
dataType = dataType.slice( 1 ) || "*";
|
||||||
|
(structure[ dataType ] = structure[ dataType ] || []).unshift( func );
|
||||||
|
|
||||||
|
// Otherwise append
|
||||||
|
} else {
|
||||||
|
(structure[ dataType ] = structure[ dataType ] || []).push( func );
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
// Base inspection function for prefilters and transports
|
||||||
|
function inspectPrefiltersOrTransports( structure, options, originalOptions, jqXHR ) {
|
||||||
|
|
||||||
|
var inspected = {},
|
||||||
|
seekingTransport = ( structure === transports );
|
||||||
|
|
||||||
|
function inspect( dataType ) {
|
||||||
|
var selected;
|
||||||
|
inspected[ dataType ] = true;
|
||||||
|
jQuery.each( structure[ dataType ] || [], function( _, prefilterOrFactory ) {
|
||||||
|
var dataTypeOrTransport = prefilterOrFactory( options, originalOptions, jqXHR );
|
||||||
|
if ( typeof dataTypeOrTransport === "string" && !seekingTransport && !inspected[ dataTypeOrTransport ] ) {
|
||||||
|
options.dataTypes.unshift( dataTypeOrTransport );
|
||||||
|
inspect( dataTypeOrTransport );
|
||||||
|
return false;
|
||||||
|
} else if ( seekingTransport ) {
|
||||||
|
return !( selected = dataTypeOrTransport );
|
||||||
|
}
|
||||||
|
});
|
||||||
|
return selected;
|
||||||
|
}
|
||||||
|
|
||||||
|
return inspect( options.dataTypes[ 0 ] ) || !inspected[ "*" ] && inspect( "*" );
|
||||||
|
}
|
||||||
|
|
||||||
|
// A special extend for ajax options
|
||||||
|
// that takes "flat" options (not to be deep extended)
|
||||||
|
// Fixes #9887
|
||||||
|
function ajaxExtend( target, src ) {
|
||||||
|
var key, deep,
|
||||||
|
flatOptions = jQuery.ajaxSettings.flatOptions || {};
|
||||||
|
|
||||||
|
for ( key in src ) {
|
||||||
|
if ( src[ key ] !== undefined ) {
|
||||||
|
( flatOptions[ key ] ? target : ( deep || (deep = {}) ) )[ key ] = src[ key ];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if ( deep ) {
|
||||||
|
jQuery.extend( true, target, deep );
|
||||||
|
}
|
||||||
|
|
||||||
|
return target;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Handles responses to an ajax request:
|
||||||
|
* - finds the right dataType (mediates between content-type and expected dataType)
|
||||||
|
* - returns the corresponding response
|
||||||
|
*/
|
||||||
|
function ajaxHandleResponses( s, jqXHR, responses ) {
|
||||||
|
|
||||||
|
var ct, type, finalDataType, firstDataType,
|
||||||
|
contents = s.contents,
|
||||||
|
dataTypes = s.dataTypes;
|
||||||
|
|
||||||
|
// Remove auto dataType and get content-type in the process
|
||||||
|
while ( dataTypes[ 0 ] === "*" ) {
|
||||||
|
dataTypes.shift();
|
||||||
|
if ( ct === undefined ) {
|
||||||
|
ct = s.mimeType || jqXHR.getResponseHeader("Content-Type");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Check if we're dealing with a known content-type
|
||||||
|
if ( ct ) {
|
||||||
|
for ( type in contents ) {
|
||||||
|
if ( contents[ type ] && contents[ type ].test( ct ) ) {
|
||||||
|
dataTypes.unshift( type );
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Check to see if we have a response for the expected dataType
|
||||||
|
if ( dataTypes[ 0 ] in responses ) {
|
||||||
|
finalDataType = dataTypes[ 0 ];
|
||||||
|
} else {
|
||||||
|
// Try convertible dataTypes
|
||||||
|
for ( type in responses ) {
|
||||||
|
if ( !dataTypes[ 0 ] || s.converters[ type + " " + dataTypes[0] ] ) {
|
||||||
|
finalDataType = type;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
if ( !firstDataType ) {
|
||||||
|
firstDataType = type;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
// Or just use first one
|
||||||
|
finalDataType = finalDataType || firstDataType;
|
||||||
|
}
|
||||||
|
|
||||||
|
// If we found a dataType
|
||||||
|
// We add the dataType to the list if needed
|
||||||
|
// and return the corresponding response
|
||||||
|
if ( finalDataType ) {
|
||||||
|
if ( finalDataType !== dataTypes[ 0 ] ) {
|
||||||
|
dataTypes.unshift( finalDataType );
|
||||||
|
}
|
||||||
|
return responses[ finalDataType ];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Chain conversions given the request and the original response
|
||||||
|
* Also sets the responseXXX fields on the jqXHR instance
|
||||||
|
*/
|
||||||
|
function ajaxConvert( s, response, jqXHR, isSuccess ) {
|
||||||
|
var conv2, current, conv, tmp, prev,
|
||||||
|
converters = {},
|
||||||
|
// Work with a copy of dataTypes in case we need to modify it for conversion
|
||||||
|
dataTypes = s.dataTypes.slice();
|
||||||
|
|
||||||
|
// Create converters map with lowercased keys
|
||||||
|
if ( dataTypes[ 1 ] ) {
|
||||||
|
for ( conv in s.converters ) {
|
||||||
|
converters[ conv.toLowerCase() ] = s.converters[ conv ];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
current = dataTypes.shift();
|
||||||
|
|
||||||
|
// Convert to each sequential dataType
|
||||||
|
while ( current ) {
|
||||||
|
|
||||||
|
if ( s.responseFields[ current ] ) {
|
||||||
|
jqXHR[ s.responseFields[ current ] ] = response;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Apply the dataFilter if provided
|
||||||
|
if ( !prev && isSuccess && s.dataFilter ) {
|
||||||
|
response = s.dataFilter( response, s.dataType );
|
||||||
|
}
|
||||||
|
|
||||||
|
prev = current;
|
||||||
|
current = dataTypes.shift();
|
||||||
|
|
||||||
|
if ( current ) {
|
||||||
|
|
||||||
|
// There's only work to do if current dataType is non-auto
|
||||||
|
if ( current === "*" ) {
|
||||||
|
|
||||||
|
current = prev;
|
||||||
|
|
||||||
|
// Convert response if prev dataType is non-auto and differs from current
|
||||||
|
} else if ( prev !== "*" && prev !== current ) {
|
||||||
|
|
||||||
|
// Seek a direct converter
|
||||||
|
conv = converters[ prev + " " + current ] || converters[ "* " + current ];
|
||||||
|
|
||||||
|
// If none found, seek a pair
|
||||||
|
if ( !conv ) {
|
||||||
|
for ( conv2 in converters ) {
|
||||||
|
|
||||||
|
// If conv2 outputs current
|
||||||
|
tmp = conv2.split( " " );
|
||||||
|
if ( tmp[ 1 ] === current ) {
|
||||||
|
|
||||||
|
// If prev can be converted to accepted input
|
||||||
|
conv = converters[ prev + " " + tmp[ 0 ] ] ||
|
||||||
|
converters[ "* " + tmp[ 0 ] ];
|
||||||
|
if ( conv ) {
|
||||||
|
// Condense equivalence converters
|
||||||
|
if ( conv === true ) {
|
||||||
|
conv = converters[ conv2 ];
|
||||||
|
|
||||||
|
// Otherwise, insert the intermediate dataType
|
||||||
|
} else if ( converters[ conv2 ] !== true ) {
|
||||||
|
current = tmp[ 0 ];
|
||||||
|
dataTypes.unshift( tmp[ 1 ] );
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Apply converter (if not an equivalence)
|
||||||
|
if ( conv !== true ) {
|
||||||
|
|
||||||
|
// Unless errors are allowed to bubble, catch and return them
|
||||||
|
if ( conv && s[ "throws" ] ) {
|
||||||
|
response = conv( response );
|
||||||
|
} else {
|
||||||
|
try {
|
||||||
|
response = conv( response );
|
||||||
|
} catch ( e ) {
|
||||||
|
return { state: "parsererror", error: conv ? e : "No conversion from " + prev + " to " + current };
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return { state: "success", data: response };
|
||||||
|
}
|
||||||
|
|
||||||
|
jQuery.extend({
|
||||||
|
|
||||||
|
// Counter for holding the number of active queries
|
||||||
|
active: 0,
|
||||||
|
|
||||||
|
// Last-Modified header cache for next request
|
||||||
|
lastModified: {},
|
||||||
|
etag: {},
|
||||||
|
|
||||||
|
ajaxSettings: {
|
||||||
|
url: ajaxLocation,
|
||||||
|
type: "GET",
|
||||||
|
isLocal: rlocalProtocol.test( ajaxLocParts[ 1 ] ),
|
||||||
|
global: true,
|
||||||
|
processData: true,
|
||||||
|
async: true,
|
||||||
|
contentType: "application/x-www-form-urlencoded; charset=UTF-8",
|
||||||
|
/*
|
||||||
|
timeout: 0,
|
||||||
|
data: null,
|
||||||
|
dataType: null,
|
||||||
|
username: null,
|
||||||
|
password: null,
|
||||||
|
cache: null,
|
||||||
|
throws: false,
|
||||||
|
traditional: false,
|
||||||
|
headers: {},
|
||||||
|
*/
|
||||||
|
|
||||||
|
accepts: {
|
||||||
|
"*": allTypes,
|
||||||
|
text: "text/plain",
|
||||||
|
html: "text/html",
|
||||||
|
xml: "application/xml, text/xml",
|
||||||
|
json: "application/json, text/javascript"
|
||||||
|
},
|
||||||
|
|
||||||
|
contents: {
|
||||||
|
xml: /xml/,
|
||||||
|
html: /html/,
|
||||||
|
json: /json/
|
||||||
|
},
|
||||||
|
|
||||||
|
responseFields: {
|
||||||
|
xml: "responseXML",
|
||||||
|
text: "responseText",
|
||||||
|
json: "responseJSON"
|
||||||
|
},
|
||||||
|
|
||||||
|
// Data converters
|
||||||
|
// Keys separate source (or catchall "*") and destination types with a single space
|
||||||
|
converters: {
|
||||||
|
|
||||||
|
// Convert anything to text
|
||||||
|
"* text": String,
|
||||||
|
|
||||||
|
// Text to html (true = no transformation)
|
||||||
|
"text html": true,
|
||||||
|
|
||||||
|
// Evaluate text as a json expression
|
||||||
|
"text json": jQuery.parseJSON,
|
||||||
|
|
||||||
|
// Parse text as xml
|
||||||
|
"text xml": jQuery.parseXML
|
||||||
|
},
|
||||||
|
|
||||||
|
// For options that shouldn't be deep extended:
|
||||||
|
// you can add your own custom options here if
|
||||||
|
// and when you create one that shouldn't be
|
||||||
|
// deep extended (see ajaxExtend)
|
||||||
|
flatOptions: {
|
||||||
|
url: true,
|
||||||
|
context: true
|
||||||
|
}
|
||||||
|
},
|
||||||
|
|
||||||
|
// Creates a full fledged settings object into target
|
||||||
|
// with both ajaxSettings and settings fields.
|
||||||
|
// If target is omitted, writes into ajaxSettings.
|
||||||
|
ajaxSetup: function( target, settings ) {
|
||||||
|
return settings ?
|
||||||
|
|
||||||
|
// Building a settings object
|
||||||
|
ajaxExtend( ajaxExtend( target, jQuery.ajaxSettings ), settings ) :
|
||||||
|
|
||||||
|
// Extending ajaxSettings
|
||||||
|
ajaxExtend( jQuery.ajaxSettings, target );
|
||||||
|
},
|
||||||
|
|
||||||
|
ajaxPrefilter: addToPrefiltersOrTransports( prefilters ),
|
||||||
|
ajaxTransport: addToPrefiltersOrTransports( transports ),
|
||||||
|
|
||||||
|
// Main method
|
||||||
|
ajax: function( url, options ) {
|
||||||
|
|
||||||
|
// If url is an object, simulate pre-1.5 signature
|
||||||
|
if ( typeof url === "object" ) {
|
||||||
|
options = url;
|
||||||
|
url = undefined;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Force options to be an object
|
||||||
|
options = options || {};
|
||||||
|
|
||||||
|
var transport,
|
||||||
|
// URL without anti-cache param
|
||||||
|
cacheURL,
|
||||||
|
// Response headers
|
||||||
|
responseHeadersString,
|
||||||
|
responseHeaders,
|
||||||
|
// timeout handle
|
||||||
|
timeoutTimer,
|
||||||
|
// Cross-domain detection vars
|
||||||
|
parts,
|
||||||
|
// To know if global events are to be dispatched
|
||||||
|
fireGlobals,
|
||||||
|
// Loop variable
|
||||||
|
i,
|
||||||
|
// Create the final options object
|
||||||
|
s = jQuery.ajaxSetup( {}, options ),
|
||||||
|
// Callbacks context
|
||||||
|
callbackContext = s.context || s,
|
||||||
|
// Context for global events is callbackContext if it is a DOM node or jQuery collection
|
||||||
|
globalEventContext = s.context && ( callbackContext.nodeType || callbackContext.jquery ) ?
|
||||||
|
jQuery( callbackContext ) :
|
||||||
|
jQuery.event,
|
||||||
|
// Deferreds
|
||||||
|
deferred = jQuery.Deferred(),
|
||||||
|
completeDeferred = jQuery.Callbacks("once memory"),
|
||||||
|
// Status-dependent callbacks
|
||||||
|
statusCode = s.statusCode || {},
|
||||||
|
// Headers (they are sent all at once)
|
||||||
|
requestHeaders = {},
|
||||||
|
requestHeadersNames = {},
|
||||||
|
// The jqXHR state
|
||||||
|
state = 0,
|
||||||
|
// Default abort message
|
||||||
|
strAbort = "canceled",
|
||||||
|
// Fake xhr
|
||||||
|
jqXHR = {
|
||||||
|
readyState: 0,
|
||||||
|
|
||||||
|
// Builds headers hashtable if needed
|
||||||
|
getResponseHeader: function( key ) {
|
||||||
|
var match;
|
||||||
|
if ( state === 2 ) {
|
||||||
|
if ( !responseHeaders ) {
|
||||||
|
responseHeaders = {};
|
||||||
|
while ( (match = rheaders.exec( responseHeadersString )) ) {
|
||||||
|
responseHeaders[ match[1].toLowerCase() ] = match[ 2 ];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
match = responseHeaders[ key.toLowerCase() ];
|
||||||
|
}
|
||||||
|
return match == null ? null : match;
|
||||||
|
},
|
||||||
|
|
||||||
|
// Raw string
|
||||||
|
getAllResponseHeaders: function() {
|
||||||
|
return state === 2 ? responseHeadersString : null;
|
||||||
|
},
|
||||||
|
|
||||||
|
// Caches the header
|
||||||
|
setRequestHeader: function( name, value ) {
|
||||||
|
var lname = name.toLowerCase();
|
||||||
|
if ( !state ) {
|
||||||
|
name = requestHeadersNames[ lname ] = requestHeadersNames[ lname ] || name;
|
||||||
|
requestHeaders[ name ] = value;
|
||||||
|
}
|
||||||
|
return this;
|
||||||
|
},
|
||||||
|
|
||||||
|
// Overrides response content-type header
|
||||||
|
overrideMimeType: function( type ) {
|
||||||
|
if ( !state ) {
|
||||||
|
s.mimeType = type;
|
||||||
|
}
|
||||||
|
return this;
|
||||||
|
},
|
||||||
|
|
||||||
|
// Status-dependent callbacks
|
||||||
|
statusCode: function( map ) {
|
||||||
|
var code;
|
||||||
|
if ( map ) {
|
||||||
|
if ( state < 2 ) {
|
||||||
|
for ( code in map ) {
|
||||||
|
// Lazy-add the new callback in a way that preserves old ones
|
||||||
|
statusCode[ code ] = [ statusCode[ code ], map[ code ] ];
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
// Execute the appropriate callbacks
|
||||||
|
jqXHR.always( map[ jqXHR.status ] );
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return this;
|
||||||
|
},
|
||||||
|
|
||||||
|
// Cancel the request
|
||||||
|
abort: function( statusText ) {
|
||||||
|
var finalText = statusText || strAbort;
|
||||||
|
if ( transport ) {
|
||||||
|
transport.abort( finalText );
|
||||||
|
}
|
||||||
|
done( 0, finalText );
|
||||||
|
return this;
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
// Attach deferreds
|
||||||
|
deferred.promise( jqXHR ).complete = completeDeferred.add;
|
||||||
|
jqXHR.success = jqXHR.done;
|
||||||
|
jqXHR.error = jqXHR.fail;
|
||||||
|
|
||||||
|
// Remove hash character (#7531: and string promotion)
|
||||||
|
// Add protocol if not provided (prefilters might expect it)
|
||||||
|
// Handle falsy url in the settings object (#10093: consistency with old signature)
|
||||||
|
// We also use the url parameter if available
|
||||||
|
s.url = ( ( url || s.url || ajaxLocation ) + "" ).replace( rhash, "" )
|
||||||
|
.replace( rprotocol, ajaxLocParts[ 1 ] + "//" );
|
||||||
|
|
||||||
|
// Alias method option to type as per ticket #12004
|
||||||
|
s.type = options.method || options.type || s.method || s.type;
|
||||||
|
|
||||||
|
// Extract dataTypes list
|
||||||
|
s.dataTypes = jQuery.trim( s.dataType || "*" ).toLowerCase().match( rnotwhite ) || [ "" ];
|
||||||
|
|
||||||
|
// A cross-domain request is in order when we have a protocol:host:port mismatch
|
||||||
|
if ( s.crossDomain == null ) {
|
||||||
|
parts = rurl.exec( s.url.toLowerCase() );
|
||||||
|
s.crossDomain = !!( parts &&
|
||||||
|
( parts[ 1 ] !== ajaxLocParts[ 1 ] || parts[ 2 ] !== ajaxLocParts[ 2 ] ||
|
||||||
|
( parts[ 3 ] || ( parts[ 1 ] === "http:" ? "80" : "443" ) ) !==
|
||||||
|
( ajaxLocParts[ 3 ] || ( ajaxLocParts[ 1 ] === "http:" ? "80" : "443" ) ) )
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Convert data if not already a string
|
||||||
|
if ( s.data && s.processData && typeof s.data !== "string" ) {
|
||||||
|
s.data = jQuery.param( s.data, s.traditional );
|
||||||
|
}
|
||||||
|
|
||||||
|
// Apply prefilters
|
||||||
|
inspectPrefiltersOrTransports( prefilters, s, options, jqXHR );
|
||||||
|
|
||||||
|
// If request was aborted inside a prefilter, stop there
|
||||||
|
if ( state === 2 ) {
|
||||||
|
return jqXHR;
|
||||||
|
}
|
||||||
|
|
||||||
|
// We can fire global events as of now if asked to
|
||||||
|
fireGlobals = s.global;
|
||||||
|
|
||||||
|
// Watch for a new set of requests
|
||||||
|
if ( fireGlobals && jQuery.active++ === 0 ) {
|
||||||
|
jQuery.event.trigger("ajaxStart");
|
||||||
|
}
|
||||||
|
|
||||||
|
// Uppercase the type
|
||||||
|
s.type = s.type.toUpperCase();
|
||||||
|
|
||||||
|
// Determine if request has content
|
||||||
|
s.hasContent = !rnoContent.test( s.type );
|
||||||
|
|
||||||
|
// Save the URL in case we're toying with the If-Modified-Since
|
||||||
|
// and/or If-None-Match header later on
|
||||||
|
cacheURL = s.url;
|
||||||
|
|
||||||
|
// More options handling for requests with no content
|
||||||
|
if ( !s.hasContent ) {
|
||||||
|
|
||||||
|
// If data is available, append data to url
|
||||||
|
if ( s.data ) {
|
||||||
|
cacheURL = ( s.url += ( rquery.test( cacheURL ) ? "&" : "?" ) + s.data );
|
||||||
|
// #9682: remove data so that it's not used in an eventual retry
|
||||||
|
delete s.data;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Add anti-cache in url if needed
|
||||||
|
if ( s.cache === false ) {
|
||||||
|
s.url = rts.test( cacheURL ) ?
|
||||||
|
|
||||||
|
// If there is already a '_' parameter, set its value
|
||||||
|
cacheURL.replace( rts, "$1_=" + nonce++ ) :
|
||||||
|
|
||||||
|
// Otherwise add one to the end
|
||||||
|
cacheURL + ( rquery.test( cacheURL ) ? "&" : "?" ) + "_=" + nonce++;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Set the If-Modified-Since and/or If-None-Match header, if in ifModified mode.
|
||||||
|
if ( s.ifModified ) {
|
||||||
|
if ( jQuery.lastModified[ cacheURL ] ) {
|
||||||
|
jqXHR.setRequestHeader( "If-Modified-Since", jQuery.lastModified[ cacheURL ] );
|
||||||
|
}
|
||||||
|
if ( jQuery.etag[ cacheURL ] ) {
|
||||||
|
jqXHR.setRequestHeader( "If-None-Match", jQuery.etag[ cacheURL ] );
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Set the correct header, if data is being sent
|
||||||
|
if ( s.data && s.hasContent && s.contentType !== false || options.contentType ) {
|
||||||
|
jqXHR.setRequestHeader( "Content-Type", s.contentType );
|
||||||
|
}
|
||||||
|
|
||||||
|
// Set the Accepts header for the server, depending on the dataType
|
||||||
|
jqXHR.setRequestHeader(
|
||||||
|
"Accept",
|
||||||
|
s.dataTypes[ 0 ] && s.accepts[ s.dataTypes[0] ] ?
|
||||||
|
s.accepts[ s.dataTypes[0] ] + ( s.dataTypes[ 0 ] !== "*" ? ", " + allTypes + "; q=0.01" : "" ) :
|
||||||
|
s.accepts[ "*" ]
|
||||||
|
);
|
||||||
|
|
||||||
|
// Check for headers option
|
||||||
|
for ( i in s.headers ) {
|
||||||
|
jqXHR.setRequestHeader( i, s.headers[ i ] );
|
||||||
|
}
|
||||||
|
|
||||||
|
// Allow custom headers/mimetypes and early abort
|
||||||
|
if ( s.beforeSend && ( s.beforeSend.call( callbackContext, jqXHR, s ) === false || state === 2 ) ) {
|
||||||
|
// Abort if not done already and return
|
||||||
|
return jqXHR.abort();
|
||||||
|
}
|
||||||
|
|
||||||
|
// aborting is no longer a cancellation
|
||||||
|
strAbort = "abort";
|
||||||
|
|
||||||
|
// Install callbacks on deferreds
|
||||||
|
for ( i in { success: 1, error: 1, complete: 1 } ) {
|
||||||
|
jqXHR[ i ]( s[ i ] );
|
||||||
|
}
|
||||||
|
|
||||||
|
// Get transport
|
||||||
|
transport = inspectPrefiltersOrTransports( transports, s, options, jqXHR );
|
||||||
|
|
||||||
|
// If no transport, we auto-abort
|
||||||
|
if ( !transport ) {
|
||||||
|
done( -1, "No Transport" );
|
||||||
|
} else {
|
||||||
|
jqXHR.readyState = 1;
|
||||||
|
|
||||||
|
// Send global event
|
||||||
|
if ( fireGlobals ) {
|
||||||
|
globalEventContext.trigger( "ajaxSend", [ jqXHR, s ] );
|
||||||
|
}
|
||||||
|
// Timeout
|
||||||
|
if ( s.async && s.timeout > 0 ) {
|
||||||
|
timeoutTimer = setTimeout(function() {
|
||||||
|
jqXHR.abort("timeout");
|
||||||
|
}, s.timeout );
|
||||||
|
}
|
||||||
|
|
||||||
|
try {
|
||||||
|
state = 1;
|
||||||
|
transport.send( requestHeaders, done );
|
||||||
|
} catch ( e ) {
|
||||||
|
// Propagate exception as error if not done
|
||||||
|
if ( state < 2 ) {
|
||||||
|
done( -1, e );
|
||||||
|
// Simply rethrow otherwise
|
||||||
|
} else {
|
||||||
|
throw e;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Callback for when everything is done
|
||||||
|
function done( status, nativeStatusText, responses, headers ) {
|
||||||
|
var isSuccess, success, error, response, modified,
|
||||||
|
statusText = nativeStatusText;
|
||||||
|
|
||||||
|
// Called once
|
||||||
|
if ( state === 2 ) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
// State is "done" now
|
||||||
|
state = 2;
|
||||||
|
|
||||||
|
// Clear timeout if it exists
|
||||||
|
if ( timeoutTimer ) {
|
||||||
|
clearTimeout( timeoutTimer );
|
||||||
|
}
|
||||||
|
|
||||||
|
// Dereference transport for early garbage collection
|
||||||
|
// (no matter how long the jqXHR object will be used)
|
||||||
|
transport = undefined;
|
||||||
|
|
||||||
|
// Cache response headers
|
||||||
|
responseHeadersString = headers || "";
|
||||||
|
|
||||||
|
// Set readyState
|
||||||
|
jqXHR.readyState = status > 0 ? 4 : 0;
|
||||||
|
|
||||||
|
// Determine if successful
|
||||||
|
isSuccess = status >= 200 && status < 300 || status === 304;
|
||||||
|
|
||||||
|
// Get response data
|
||||||
|
if ( responses ) {
|
||||||
|
response = ajaxHandleResponses( s, jqXHR, responses );
|
||||||
|
}
|
||||||
|
|
||||||
|
// Convert no matter what (that way responseXXX fields are always set)
|
||||||
|
response = ajaxConvert( s, response, jqXHR, isSuccess );
|
||||||
|
|
||||||
|
// If successful, handle type chaining
|
||||||
|
if ( isSuccess ) {
|
||||||
|
|
||||||
|
// Set the If-Modified-Since and/or If-None-Match header, if in ifModified mode.
|
||||||
|
if ( s.ifModified ) {
|
||||||
|
modified = jqXHR.getResponseHeader("Last-Modified");
|
||||||
|
if ( modified ) {
|
||||||
|
jQuery.lastModified[ cacheURL ] = modified;
|
||||||
|
}
|
||||||
|
modified = jqXHR.getResponseHeader("etag");
|
||||||
|
if ( modified ) {
|
||||||
|
jQuery.etag[ cacheURL ] = modified;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// if no content
|
||||||
|
if ( status === 204 || s.type === "HEAD" ) {
|
||||||
|
statusText = "nocontent";
|
||||||
|
|
||||||
|
// if not modified
|
||||||
|
} else if ( status === 304 ) {
|
||||||
|
statusText = "notmodified";
|
||||||
|
|
||||||
|
// If we have data, let's convert it
|
||||||
|
} else {
|
||||||
|
statusText = response.state;
|
||||||
|
success = response.data;
|
||||||
|
error = response.error;
|
||||||
|
isSuccess = !error;
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
// We extract error from statusText
|
||||||
|
// then normalize statusText and status for non-aborts
|
||||||
|
error = statusText;
|
||||||
|
if ( status || !statusText ) {
|
||||||
|
statusText = "error";
|
||||||
|
if ( status < 0 ) {
|
||||||
|
status = 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Set data for the fake xhr object
|
||||||
|
jqXHR.status = status;
|
||||||
|
jqXHR.statusText = ( nativeStatusText || statusText ) + "";
|
||||||
|
|
||||||
|
// Success/Error
|
||||||
|
if ( isSuccess ) {
|
||||||
|
deferred.resolveWith( callbackContext, [ success, statusText, jqXHR ] );
|
||||||
|
} else {
|
||||||
|
deferred.rejectWith( callbackContext, [ jqXHR, statusText, error ] );
|
||||||
|
}
|
||||||
|
|
||||||
|
// Status-dependent callbacks
|
||||||
|
jqXHR.statusCode( statusCode );
|
||||||
|
statusCode = undefined;
|
||||||
|
|
||||||
|
if ( fireGlobals ) {
|
||||||
|
globalEventContext.trigger( isSuccess ? "ajaxSuccess" : "ajaxError",
|
||||||
|
[ jqXHR, s, isSuccess ? success : error ] );
|
||||||
|
}
|
||||||
|
|
||||||
|
// Complete
|
||||||
|
completeDeferred.fireWith( callbackContext, [ jqXHR, statusText ] );
|
||||||
|
|
||||||
|
if ( fireGlobals ) {
|
||||||
|
globalEventContext.trigger( "ajaxComplete", [ jqXHR, s ] );
|
||||||
|
// Handle the global AJAX counter
|
||||||
|
if ( !( --jQuery.active ) ) {
|
||||||
|
jQuery.event.trigger("ajaxStop");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return jqXHR;
|
||||||
|
},
|
||||||
|
|
||||||
|
getJSON: function( url, data, callback ) {
|
||||||
|
return jQuery.get( url, data, callback, "json" );
|
||||||
|
},
|
||||||
|
|
||||||
|
getScript: function( url, callback ) {
|
||||||
|
return jQuery.get( url, undefined, callback, "script" );
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
jQuery.each( [ "get", "post" ], function( i, method ) {
|
||||||
|
jQuery[ method ] = function( url, data, callback, type ) {
|
||||||
|
// shift arguments if data argument was omitted
|
||||||
|
if ( jQuery.isFunction( data ) ) {
|
||||||
|
type = type || callback;
|
||||||
|
callback = data;
|
||||||
|
data = undefined;
|
||||||
|
}
|
||||||
|
|
||||||
|
return jQuery.ajax({
|
||||||
|
url: url,
|
||||||
|
type: method,
|
||||||
|
dataType: type,
|
||||||
|
data: data,
|
||||||
|
success: callback
|
||||||
|
});
|
||||||
|
};
|
||||||
|
});
|
||||||
|
|
||||||
|
// Attach a bunch of functions for handling common AJAX events
|
||||||
|
jQuery.each( [ "ajaxStart", "ajaxStop", "ajaxComplete", "ajaxError", "ajaxSuccess", "ajaxSend" ], function( i, type ) {
|
||||||
|
jQuery.fn[ type ] = function( fn ) {
|
||||||
|
return this.on( type, fn );
|
||||||
|
};
|
||||||
|
});
|
||||||
|
|
||||||
|
return jQuery;
|
||||||
|
});
|
|
@ -0,0 +1,89 @@
|
||||||
|
define([
|
||||||
|
"../core",
|
||||||
|
"./var/nonce",
|
||||||
|
"./var/rquery",
|
||||||
|
"../ajax"
|
||||||
|
], function( jQuery, nonce, rquery ) {
|
||||||
|
|
||||||
|
var oldCallbacks = [],
|
||||||
|
rjsonp = /(=)\?(?=&|$)|\?\?/;
|
||||||
|
|
||||||
|
// Default jsonp settings
|
||||||
|
jQuery.ajaxSetup({
|
||||||
|
jsonp: "callback",
|
||||||
|
jsonpCallback: function() {
|
||||||
|
var callback = oldCallbacks.pop() || ( jQuery.expando + "_" + ( nonce++ ) );
|
||||||
|
this[ callback ] = true;
|
||||||
|
return callback;
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
// Detect, normalize options and install callbacks for jsonp requests
|
||||||
|
jQuery.ajaxPrefilter( "json jsonp", function( s, originalSettings, jqXHR ) {
|
||||||
|
|
||||||
|
var callbackName, overwritten, responseContainer,
|
||||||
|
jsonProp = s.jsonp !== false && ( rjsonp.test( s.url ) ?
|
||||||
|
"url" :
|
||||||
|
typeof s.data === "string" && !( s.contentType || "" ).indexOf("application/x-www-form-urlencoded") && rjsonp.test( s.data ) && "data"
|
||||||
|
);
|
||||||
|
|
||||||
|
// Handle iff the expected data type is "jsonp" or we have a parameter to set
|
||||||
|
if ( jsonProp || s.dataTypes[ 0 ] === "jsonp" ) {
|
||||||
|
|
||||||
|
// Get callback name, remembering preexisting value associated with it
|
||||||
|
callbackName = s.jsonpCallback = jQuery.isFunction( s.jsonpCallback ) ?
|
||||||
|
s.jsonpCallback() :
|
||||||
|
s.jsonpCallback;
|
||||||
|
|
||||||
|
// Insert callback into url or form data
|
||||||
|
if ( jsonProp ) {
|
||||||
|
s[ jsonProp ] = s[ jsonProp ].replace( rjsonp, "$1" + callbackName );
|
||||||
|
} else if ( s.jsonp !== false ) {
|
||||||
|
s.url += ( rquery.test( s.url ) ? "&" : "?" ) + s.jsonp + "=" + callbackName;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Use data converter to retrieve json after script execution
|
||||||
|
s.converters["script json"] = function() {
|
||||||
|
if ( !responseContainer ) {
|
||||||
|
jQuery.error( callbackName + " was not called" );
|
||||||
|
}
|
||||||
|
return responseContainer[ 0 ];
|
||||||
|
};
|
||||||
|
|
||||||
|
// force json dataType
|
||||||
|
s.dataTypes[ 0 ] = "json";
|
||||||
|
|
||||||
|
// Install callback
|
||||||
|
overwritten = window[ callbackName ];
|
||||||
|
window[ callbackName ] = function() {
|
||||||
|
responseContainer = arguments;
|
||||||
|
};
|
||||||
|
|
||||||
|
// Clean-up function (fires after converters)
|
||||||
|
jqXHR.always(function() {
|
||||||
|
// Restore preexisting value
|
||||||
|
window[ callbackName ] = overwritten;
|
||||||
|
|
||||||
|
// Save back as free
|
||||||
|
if ( s[ callbackName ] ) {
|
||||||
|
// make sure that re-using the options doesn't screw things around
|
||||||
|
s.jsonpCallback = originalSettings.jsonpCallback;
|
||||||
|
|
||||||
|
// save the callback name for future use
|
||||||
|
oldCallbacks.push( callbackName );
|
||||||
|
}
|
||||||
|
|
||||||
|
// Call if it was a function and we have a response
|
||||||
|
if ( responseContainer && jQuery.isFunction( overwritten ) ) {
|
||||||
|
overwritten( responseContainer[ 0 ] );
|
||||||
|
}
|
||||||
|
|
||||||
|
responseContainer = overwritten = undefined;
|
||||||
|
});
|
||||||
|
|
||||||
|
// Delegate to script
|
||||||
|
return "script";
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
});
|
|
@ -0,0 +1,75 @@
|
||||||
|
define([
|
||||||
|
"../core",
|
||||||
|
"../core/parseHTML",
|
||||||
|
"../ajax",
|
||||||
|
"../traversing",
|
||||||
|
"../manipulation",
|
||||||
|
"../selector",
|
||||||
|
// Optional event/alias dependency
|
||||||
|
"../event/alias"
|
||||||
|
], function( jQuery ) {
|
||||||
|
|
||||||
|
// Keep a copy of the old load method
|
||||||
|
var _load = jQuery.fn.load;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Load a url into a page
|
||||||
|
*/
|
||||||
|
jQuery.fn.load = function( url, params, callback ) {
|
||||||
|
if ( typeof url !== "string" && _load ) {
|
||||||
|
return _load.apply( this, arguments );
|
||||||
|
}
|
||||||
|
|
||||||
|
var selector, type, response,
|
||||||
|
self = this,
|
||||||
|
off = url.indexOf(" ");
|
||||||
|
|
||||||
|
if ( off >= 0 ) {
|
||||||
|
selector = jQuery.trim( url.slice( off ) );
|
||||||
|
url = url.slice( 0, off );
|
||||||
|
}
|
||||||
|
|
||||||
|
// If it's a function
|
||||||
|
if ( jQuery.isFunction( params ) ) {
|
||||||
|
|
||||||
|
// We assume that it's the callback
|
||||||
|
callback = params;
|
||||||
|
params = undefined;
|
||||||
|
|
||||||
|
// Otherwise, build a param string
|
||||||
|
} else if ( params && typeof params === "object" ) {
|
||||||
|
type = "POST";
|
||||||
|
}
|
||||||
|
|
||||||
|
// If we have elements to modify, make the request
|
||||||
|
if ( self.length > 0 ) {
|
||||||
|
jQuery.ajax({
|
||||||
|
url: url,
|
||||||
|
|
||||||
|
// if "type" variable is undefined, then "GET" method will be used
|
||||||
|
type: type,
|
||||||
|
dataType: "html",
|
||||||
|
data: params
|
||||||
|
}).done(function( responseText ) {
|
||||||
|
|
||||||
|
// Save response for use in complete callback
|
||||||
|
response = arguments;
|
||||||
|
|
||||||
|
self.html( selector ?
|
||||||
|
|
||||||
|
// If a selector was specified, locate the right elements in a dummy div
|
||||||
|
// Exclude scripts to avoid IE 'Permission Denied' errors
|
||||||
|
jQuery("<div>").append( jQuery.parseHTML( responseText ) ).find( selector ) :
|
||||||
|
|
||||||
|
// Otherwise use the full result
|
||||||
|
responseText );
|
||||||
|
|
||||||
|
}).complete( callback && function( jqXHR, status ) {
|
||||||
|
self.each( callback, response || [ jqXHR.responseText, status, jqXHR ] );
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
return this;
|
||||||
|
};
|
||||||
|
|
||||||
|
});
|
|
@ -0,0 +1,13 @@
|
||||||
|
define([
|
||||||
|
"../core"
|
||||||
|
], function( jQuery ) {
|
||||||
|
|
||||||
|
// Support: Android 2.3
|
||||||
|
// Workaround failure to string-cast null input
|
||||||
|
jQuery.parseJSON = function( data ) {
|
||||||
|
return JSON.parse( data + "" );
|
||||||
|
};
|
||||||
|
|
||||||
|
return jQuery.parseJSON;
|
||||||
|
|
||||||
|
});
|
|
@ -0,0 +1,28 @@
|
||||||
|
define([
|
||||||
|
"../core"
|
||||||
|
], function( jQuery ) {
|
||||||
|
|
||||||
|
// Cross-browser xml parsing
|
||||||
|
jQuery.parseXML = function( data ) {
|
||||||
|
var xml, tmp;
|
||||||
|
if ( !data || typeof data !== "string" ) {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Support: IE9
|
||||||
|
try {
|
||||||
|
tmp = new DOMParser();
|
||||||
|
xml = tmp.parseFromString( data, "text/xml" );
|
||||||
|
} catch ( e ) {
|
||||||
|
xml = undefined;
|
||||||
|
}
|
||||||
|
|
||||||
|
if ( !xml || xml.getElementsByTagName( "parsererror" ).length ) {
|
||||||
|
jQuery.error( "Invalid XML: " + data );
|
||||||
|
}
|
||||||
|
return xml;
|
||||||
|
};
|
||||||
|
|
||||||
|
return jQuery.parseXML;
|
||||||
|
|
||||||
|
});
|
|
@ -0,0 +1,64 @@
|
||||||
|
define([
|
||||||
|
"../core",
|
||||||
|
"../ajax"
|
||||||
|
], function( jQuery ) {
|
||||||
|
|
||||||
|
// Install script dataType
|
||||||
|
jQuery.ajaxSetup({
|
||||||
|
accepts: {
|
||||||
|
script: "text/javascript, application/javascript, application/ecmascript, application/x-ecmascript"
|
||||||
|
},
|
||||||
|
contents: {
|
||||||
|
script: /(?:java|ecma)script/
|
||||||
|
},
|
||||||
|
converters: {
|
||||||
|
"text script": function( text ) {
|
||||||
|
jQuery.globalEval( text );
|
||||||
|
return text;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
// Handle cache's special case and crossDomain
|
||||||
|
jQuery.ajaxPrefilter( "script", function( s ) {
|
||||||
|
if ( s.cache === undefined ) {
|
||||||
|
s.cache = false;
|
||||||
|
}
|
||||||
|
if ( s.crossDomain ) {
|
||||||
|
s.type = "GET";
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
// Bind script tag hack transport
|
||||||
|
jQuery.ajaxTransport( "script", function( s ) {
|
||||||
|
// This transport only deals with cross domain requests
|
||||||
|
if ( s.crossDomain ) {
|
||||||
|
var script, callback;
|
||||||
|
return {
|
||||||
|
send: function( _, complete ) {
|
||||||
|
script = jQuery("<script>").prop({
|
||||||
|
async: true,
|
||||||
|
charset: s.scriptCharset,
|
||||||
|
src: s.url
|
||||||
|
}).on(
|
||||||
|
"load error",
|
||||||
|
callback = function( evt ) {
|
||||||
|
script.remove();
|
||||||
|
callback = null;
|
||||||
|
if ( evt ) {
|
||||||
|
complete( evt.type === "error" ? 404 : 200, evt.type );
|
||||||
|
}
|
||||||
|
}
|
||||||
|
);
|
||||||
|
document.head.appendChild( script[ 0 ] );
|
||||||
|
},
|
||||||
|
abort: function() {
|
||||||
|
if ( callback ) {
|
||||||
|
callback();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
};
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
});
|
|
@ -0,0 +1,5 @@
|
||||||
|
define([
|
||||||
|
"../../core"
|
||||||
|
], function( jQuery ) {
|
||||||
|
return jQuery.now();
|
||||||
|
});
|
|
@ -0,0 +1,3 @@
|
||||||
|
define(function() {
|
||||||
|
return (/\?/);
|
||||||
|
});
|
|
@ -0,0 +1,135 @@
|
||||||
|
define([
|
||||||
|
"../core",
|
||||||
|
"../var/support",
|
||||||
|
"../ajax"
|
||||||
|
], function( jQuery, support ) {
|
||||||
|
|
||||||
|
jQuery.ajaxSettings.xhr = function() {
|
||||||
|
try {
|
||||||
|
return new XMLHttpRequest();
|
||||||
|
} catch( e ) {}
|
||||||
|
};
|
||||||
|
|
||||||
|
var xhrId = 0,
|
||||||
|
xhrCallbacks = {},
|
||||||
|
xhrSuccessStatus = {
|
||||||
|
// file protocol always yields status code 0, assume 200
|
||||||
|
0: 200,
|
||||||
|
// Support: IE9
|
||||||
|
// #1450: sometimes IE returns 1223 when it should be 204
|
||||||
|
1223: 204
|
||||||
|
},
|
||||||
|
xhrSupported = jQuery.ajaxSettings.xhr();
|
||||||
|
|
||||||
|
// Support: IE9
|
||||||
|
// Open requests must be manually aborted on unload (#5280)
|
||||||
|
if ( window.ActiveXObject ) {
|
||||||
|
jQuery( window ).on( "unload", function() {
|
||||||
|
for ( var key in xhrCallbacks ) {
|
||||||
|
xhrCallbacks[ key ]();
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
support.cors = !!xhrSupported && ( "withCredentials" in xhrSupported );
|
||||||
|
support.ajax = xhrSupported = !!xhrSupported;
|
||||||
|
|
||||||
|
jQuery.ajaxTransport(function( options ) {
|
||||||
|
var callback;
|
||||||
|
|
||||||
|
// Cross domain only allowed if supported through XMLHttpRequest
|
||||||
|
if ( support.cors || xhrSupported && !options.crossDomain ) {
|
||||||
|
return {
|
||||||
|
send: function( headers, complete ) {
|
||||||
|
var i,
|
||||||
|
xhr = options.xhr(),
|
||||||
|
id = ++xhrId;
|
||||||
|
|
||||||
|
xhr.open( options.type, options.url, options.async, options.username, options.password );
|
||||||
|
|
||||||
|
// Apply custom fields if provided
|
||||||
|
if ( options.xhrFields ) {
|
||||||
|
for ( i in options.xhrFields ) {
|
||||||
|
xhr[ i ] = options.xhrFields[ i ];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Override mime type if needed
|
||||||
|
if ( options.mimeType && xhr.overrideMimeType ) {
|
||||||
|
xhr.overrideMimeType( options.mimeType );
|
||||||
|
}
|
||||||
|
|
||||||
|
// X-Requested-With header
|
||||||
|
// For cross-domain requests, seeing as conditions for a preflight are
|
||||||
|
// akin to a jigsaw puzzle, we simply never set it to be sure.
|
||||||
|
// (it can always be set on a per-request basis or even using ajaxSetup)
|
||||||
|
// For same-domain requests, won't change header if already provided.
|
||||||
|
if ( !options.crossDomain && !headers["X-Requested-With"] ) {
|
||||||
|
headers["X-Requested-With"] = "XMLHttpRequest";
|
||||||
|
}
|
||||||
|
|
||||||
|
// Set headers
|
||||||
|
for ( i in headers ) {
|
||||||
|
xhr.setRequestHeader( i, headers[ i ] );
|
||||||
|
}
|
||||||
|
|
||||||
|
// Callback
|
||||||
|
callback = function( type ) {
|
||||||
|
return function() {
|
||||||
|
if ( callback ) {
|
||||||
|
delete xhrCallbacks[ id ];
|
||||||
|
callback = xhr.onload = xhr.onerror = null;
|
||||||
|
|
||||||
|
if ( type === "abort" ) {
|
||||||
|
xhr.abort();
|
||||||
|
} else if ( type === "error" ) {
|
||||||
|
complete(
|
||||||
|
// file: protocol always yields status 0; see #8605, #14207
|
||||||
|
xhr.status,
|
||||||
|
xhr.statusText
|
||||||
|
);
|
||||||
|
} else {
|
||||||
|
complete(
|
||||||
|
xhrSuccessStatus[ xhr.status ] || xhr.status,
|
||||||
|
xhr.statusText,
|
||||||
|
// Support: IE9
|
||||||
|
// Accessing binary-data responseText throws an exception
|
||||||
|
// (#11426)
|
||||||
|
typeof xhr.responseText === "string" ? {
|
||||||
|
text: xhr.responseText
|
||||||
|
} : undefined,
|
||||||
|
xhr.getAllResponseHeaders()
|
||||||
|
);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
|
// Listen to events
|
||||||
|
xhr.onload = callback();
|
||||||
|
xhr.onerror = callback("error");
|
||||||
|
|
||||||
|
// Create the abort callback
|
||||||
|
callback = xhrCallbacks[ id ] = callback("abort");
|
||||||
|
|
||||||
|
try {
|
||||||
|
// Do send the request (this may raise an exception)
|
||||||
|
xhr.send( options.hasContent && options.data || null );
|
||||||
|
} catch ( e ) {
|
||||||
|
// #14683: Only rethrow if this hasn't been notified as an error yet
|
||||||
|
if ( callback ) {
|
||||||
|
throw e;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
|
||||||
|
abort: function() {
|
||||||
|
if ( callback ) {
|
||||||
|
callback();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
};
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
});
|
|
@ -0,0 +1,11 @@
|
||||||
|
define([
|
||||||
|
"./core",
|
||||||
|
"./attributes/attr",
|
||||||
|
"./attributes/prop",
|
||||||
|
"./attributes/classes",
|
||||||
|
"./attributes/val"
|
||||||
|
], function( jQuery ) {
|
||||||
|
|
||||||
|
// Return jQuery for attributes-only inclusion
|
||||||
|
return jQuery;
|
||||||
|
});
|
|
@ -0,0 +1,143 @@
|
||||||
|
define([
|
||||||
|
"../core",
|
||||||
|
"../var/rnotwhite",
|
||||||
|
"../var/strundefined",
|
||||||
|
"../core/access",
|
||||||
|
"./support",
|
||||||
|
"../selector"
|
||||||
|
], function( jQuery, rnotwhite, strundefined, access, support ) {
|
||||||
|
|
||||||
|
var nodeHook, boolHook,
|
||||||
|
attrHandle = jQuery.expr.attrHandle;
|
||||||
|
|
||||||
|
jQuery.fn.extend({
|
||||||
|
attr: function( name, value ) {
|
||||||
|
return access( this, jQuery.attr, name, value, arguments.length > 1 );
|
||||||
|
},
|
||||||
|
|
||||||
|
removeAttr: function( name ) {
|
||||||
|
return this.each(function() {
|
||||||
|
jQuery.removeAttr( this, name );
|
||||||
|
});
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
jQuery.extend({
|
||||||
|
attr: function( elem, name, value ) {
|
||||||
|
var hooks, ret,
|
||||||
|
nType = elem.nodeType;
|
||||||
|
|
||||||
|
// don't get/set attributes on text, comment and attribute nodes
|
||||||
|
if ( !elem || nType === 3 || nType === 8 || nType === 2 ) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Fallback to prop when attributes are not supported
|
||||||
|
if ( typeof elem.getAttribute === strundefined ) {
|
||||||
|
return jQuery.prop( elem, name, value );
|
||||||
|
}
|
||||||
|
|
||||||
|
// All attributes are lowercase
|
||||||
|
// Grab necessary hook if one is defined
|
||||||
|
if ( nType !== 1 || !jQuery.isXMLDoc( elem ) ) {
|
||||||
|
name = name.toLowerCase();
|
||||||
|
hooks = jQuery.attrHooks[ name ] ||
|
||||||
|
( jQuery.expr.match.bool.test( name ) ? boolHook : nodeHook );
|
||||||
|
}
|
||||||
|
|
||||||
|
if ( value !== undefined ) {
|
||||||
|
|
||||||
|
if ( value === null ) {
|
||||||
|
jQuery.removeAttr( elem, name );
|
||||||
|
|
||||||
|
} else if ( hooks && "set" in hooks && (ret = hooks.set( elem, value, name )) !== undefined ) {
|
||||||
|
return ret;
|
||||||
|
|
||||||
|
} else {
|
||||||
|
elem.setAttribute( name, value + "" );
|
||||||
|
return value;
|
||||||
|
}
|
||||||
|
|
||||||
|
} else if ( hooks && "get" in hooks && (ret = hooks.get( elem, name )) !== null ) {
|
||||||
|
return ret;
|
||||||
|
|
||||||
|
} else {
|
||||||
|
ret = jQuery.find.attr( elem, name );
|
||||||
|
|
||||||
|
// Non-existent attributes return null, we normalize to undefined
|
||||||
|
return ret == null ?
|
||||||
|
undefined :
|
||||||
|
ret;
|
||||||
|
}
|
||||||
|
},
|
||||||
|
|
||||||
|
removeAttr: function( elem, value ) {
|
||||||
|
var name, propName,
|
||||||
|
i = 0,
|
||||||
|
attrNames = value && value.match( rnotwhite );
|
||||||
|
|
||||||
|
if ( attrNames && elem.nodeType === 1 ) {
|
||||||
|
while ( (name = attrNames[i++]) ) {
|
||||||
|
propName = jQuery.propFix[ name ] || name;
|
||||||
|
|
||||||
|
// Boolean attributes get special treatment (#10870)
|
||||||
|
if ( jQuery.expr.match.bool.test( name ) ) {
|
||||||
|
// Set corresponding property to false
|
||||||
|
elem[ propName ] = false;
|
||||||
|
}
|
||||||
|
|
||||||
|
elem.removeAttribute( name );
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
|
||||||
|
attrHooks: {
|
||||||
|
type: {
|
||||||
|
set: function( elem, value ) {
|
||||||
|
if ( !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;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
// Hooks for boolean attributes
|
||||||
|
boolHook = {
|
||||||
|
set: function( elem, value, name ) {
|
||||||
|
if ( value === false ) {
|
||||||
|
// Remove boolean attributes when set to false
|
||||||
|
jQuery.removeAttr( elem, name );
|
||||||
|
} else {
|
||||||
|
elem.setAttribute( name, name );
|
||||||
|
}
|
||||||
|
return name;
|
||||||
|
}
|
||||||
|
};
|
||||||
|
jQuery.each( jQuery.expr.match.bool.source.match( /\w+/g ), function( i, name ) {
|
||||||
|
var getter = attrHandle[ name ] || jQuery.find.attr;
|
||||||
|
|
||||||
|
attrHandle[ name ] = function( elem, name, isXML ) {
|
||||||
|
var ret, handle;
|
||||||
|
if ( !isXML ) {
|
||||||
|
// Avoid an infinite loop by temporarily removing this function from the getter
|
||||||
|
handle = attrHandle[ name ];
|
||||||
|
attrHandle[ name ] = ret;
|
||||||
|
ret = getter( elem, name, isXML ) != null ?
|
||||||
|
name.toLowerCase() :
|
||||||
|
null;
|
||||||
|
attrHandle[ name ] = handle;
|
||||||
|
}
|
||||||
|
return ret;
|
||||||
|
};
|
||||||
|
});
|
||||||
|
|
||||||
|
});
|
|
@ -0,0 +1,158 @@
|
||||||
|
define([
|
||||||
|
"../core",
|
||||||
|
"../var/rnotwhite",
|
||||||
|
"../var/strundefined",
|
||||||
|
"../data/var/data_priv",
|
||||||
|
"../core/init"
|
||||||
|
], function( jQuery, rnotwhite, strundefined, data_priv ) {
|
||||||
|
|
||||||
|
var rclass = /[\t\r\n\f]/g;
|
||||||
|
|
||||||
|
jQuery.fn.extend({
|
||||||
|
addClass: function( value ) {
|
||||||
|
var classes, elem, cur, clazz, j, finalValue,
|
||||||
|
proceed = typeof value === "string" && value,
|
||||||
|
i = 0,
|
||||||
|
len = this.length;
|
||||||
|
|
||||||
|
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( 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 + " ";
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// only assign if different to avoid unneeded rendering.
|
||||||
|
finalValue = jQuery.trim( cur );
|
||||||
|
if ( elem.className !== finalValue ) {
|
||||||
|
elem.className = finalValue;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return this;
|
||||||
|
},
|
||||||
|
|
||||||
|
removeClass: function( value ) {
|
||||||
|
var classes, elem, cur, clazz, j, finalValue,
|
||||||
|
proceed = arguments.length === 0 || typeof value === "string" && value,
|
||||||
|
i = 0,
|
||||||
|
len = this.length;
|
||||||
|
|
||||||
|
if ( jQuery.isFunction( value ) ) {
|
||||||
|
return this.each(function( j ) {
|
||||||
|
jQuery( this ).removeClass( value.call( this, j, this.className ) );
|
||||||
|
});
|
||||||
|
}
|
||||||
|
if ( proceed ) {
|
||||||
|
classes = ( value || "" ).match( 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 + " ", " " );
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// only assign if different to avoid unneeded rendering.
|
||||||
|
finalValue = value ? jQuery.trim( cur ) : "";
|
||||||
|
if ( elem.className !== finalValue ) {
|
||||||
|
elem.className = finalValue;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return this;
|
||||||
|
},
|
||||||
|
|
||||||
|
toggleClass: function( value, stateVal ) {
|
||||||
|
var type = typeof value;
|
||||||
|
|
||||||
|
if ( typeof stateVal === "boolean" && type === "string" ) {
|
||||||
|
return stateVal ? this.addClass( value ) : this.removeClass( value );
|
||||||
|
}
|
||||||
|
|
||||||
|
if ( jQuery.isFunction( value ) ) {
|
||||||
|
return this.each(function( i ) {
|
||||||
|
jQuery( this ).toggleClass( value.call(this, i, this.className, stateVal), stateVal );
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
return this.each(function() {
|
||||||
|
if ( type === "string" ) {
|
||||||
|
// toggle individual class names
|
||||||
|
var className,
|
||||||
|
i = 0,
|
||||||
|
self = jQuery( this ),
|
||||||
|
classNames = value.match( rnotwhite ) || [];
|
||||||
|
|
||||||
|
while ( (className = classNames[ i++ ]) ) {
|
||||||
|
// check each className given, space separated list
|
||||||
|
if ( self.hasClass( className ) ) {
|
||||||
|
self.removeClass( className );
|
||||||
|
} else {
|
||||||
|
self.addClass( className );
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Toggle whole class name
|
||||||
|
} else if ( type === strundefined || type === "boolean" ) {
|
||||||
|
if ( this.className ) {
|
||||||
|
// store className if set
|
||||||
|
data_priv.set( this, "__className__", this.className );
|
||||||
|
}
|
||||||
|
|
||||||
|
// If the element has a class name or if we're passed "false",
|
||||||
|
// then remove the whole classname (if there was one, the above saved it).
|
||||||
|
// Otherwise bring back whatever was previously saved (if anything),
|
||||||
|
// falling back to the empty string if nothing was stored.
|
||||||
|
this.className = this.className || value === false ? "" : data_priv.get( this, "__className__" ) || "";
|
||||||
|
}
|
||||||
|
});
|
||||||
|
},
|
||||||
|
|
||||||
|
hasClass: function( selector ) {
|
||||||
|
var className = " " + selector + " ",
|
||||||
|
i = 0,
|
||||||
|
l = this.length;
|
||||||
|
for ( ; i < l; i++ ) {
|
||||||
|
if ( this[i].nodeType === 1 && (" " + this[i].className + " ").replace(rclass, " ").indexOf( className ) >= 0 ) {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
});
|
|
@ -0,0 +1,96 @@
|
||||||
|
define([
|
||||||
|
"../core",
|
||||||
|
"../core/access",
|
||||||
|
"./support"
|
||||||
|
], function( jQuery, access, support ) {
|
||||||
|
|
||||||
|
var rfocusable = /^(?:input|select|textarea|button)$/i;
|
||||||
|
|
||||||
|
jQuery.fn.extend({
|
||||||
|
prop: function( name, value ) {
|
||||||
|
return access( this, jQuery.prop, name, value, arguments.length > 1 );
|
||||||
|
},
|
||||||
|
|
||||||
|
removeProp: function( name ) {
|
||||||
|
return this.each(function() {
|
||||||
|
delete this[ jQuery.propFix[ name ] || name ];
|
||||||
|
});
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
jQuery.extend({
|
||||||
|
propFix: {
|
||||||
|
"for": "htmlFor",
|
||||||
|
"class": "className"
|
||||||
|
},
|
||||||
|
|
||||||
|
prop: function( elem, name, value ) {
|
||||||
|
var ret, hooks, notxml,
|
||||||
|
nType = elem.nodeType;
|
||||||
|
|
||||||
|
// don't get/set properties on text, comment and attribute nodes
|
||||||
|
if ( !elem || nType === 3 || nType === 8 || nType === 2 ) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
notxml = nType !== 1 || !jQuery.isXMLDoc( elem );
|
||||||
|
|
||||||
|
if ( notxml ) {
|
||||||
|
// Fix name and attach hooks
|
||||||
|
name = jQuery.propFix[ name ] || name;
|
||||||
|
hooks = jQuery.propHooks[ name ];
|
||||||
|
}
|
||||||
|
|
||||||
|
if ( value !== undefined ) {
|
||||||
|
return hooks && "set" in hooks && (ret = hooks.set( elem, value, name )) !== undefined ?
|
||||||
|
ret :
|
||||||
|
( elem[ name ] = value );
|
||||||
|
|
||||||
|
} else {
|
||||||
|
return hooks && "get" in hooks && (ret = hooks.get( elem, name )) !== null ?
|
||||||
|
ret :
|
||||||
|
elem[ name ];
|
||||||
|
}
|
||||||
|
},
|
||||||
|
|
||||||
|
propHooks: {
|
||||||
|
tabIndex: {
|
||||||
|
get: function( elem ) {
|
||||||
|
return elem.hasAttribute( "tabindex" ) || rfocusable.test( elem.nodeName ) || elem.href ?
|
||||||
|
elem.tabIndex :
|
||||||
|
-1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
// Support: IE9+
|
||||||
|
// Selectedness for an option in an optgroup can be inaccurate
|
||||||
|
if ( !support.optSelected ) {
|
||||||
|
jQuery.propHooks.selected = {
|
||||||
|
get: function( elem ) {
|
||||||
|
var parent = elem.parentNode;
|
||||||
|
if ( parent && parent.parentNode ) {
|
||||||
|
parent.parentNode.selectedIndex;
|
||||||
|
}
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
jQuery.each([
|
||||||
|
"tabIndex",
|
||||||
|
"readOnly",
|
||||||
|
"maxLength",
|
||||||
|
"cellSpacing",
|
||||||
|
"cellPadding",
|
||||||
|
"rowSpan",
|
||||||
|
"colSpan",
|
||||||
|
"useMap",
|
||||||
|
"frameBorder",
|
||||||
|
"contentEditable"
|
||||||
|
], function() {
|
||||||
|
jQuery.propFix[ this.toLowerCase() ] = this;
|
||||||
|
});
|
||||||
|
|
||||||
|
});
|
|
@ -0,0 +1,35 @@
|
||||||
|
define([
|
||||||
|
"../var/support"
|
||||||
|
], function( support ) {
|
||||||
|
|
||||||
|
(function() {
|
||||||
|
var input = document.createElement( "input" ),
|
||||||
|
select = document.createElement( "select" ),
|
||||||
|
opt = select.appendChild( document.createElement( "option" ) );
|
||||||
|
|
||||||
|
input.type = "checkbox";
|
||||||
|
|
||||||
|
// Support: iOS 5.1, Android 4.x, Android 2.3
|
||||||
|
// Check the default checkbox/radio value ("" on old WebKit; "on" elsewhere)
|
||||||
|
support.checkOn = input.value !== "";
|
||||||
|
|
||||||
|
// Must access the parent to make an option select properly
|
||||||
|
// Support: IE9, IE10
|
||||||
|
support.optSelected = opt.selected;
|
||||||
|
|
||||||
|
// Make sure that the options inside disabled selects aren't marked as disabled
|
||||||
|
// (WebKit marks them as disabled)
|
||||||
|
select.disabled = true;
|
||||||
|
support.optDisabled = !opt.disabled;
|
||||||
|
|
||||||
|
// Check if an input maintains its value after becoming a radio
|
||||||
|
// Support: IE9, IE10
|
||||||
|
input = document.createElement( "input" );
|
||||||
|
input.value = "t";
|
||||||
|
input.type = "radio";
|
||||||
|
support.radioValue = input.value === "t";
|
||||||
|
})();
|
||||||
|
|
||||||
|
return support;
|
||||||
|
|
||||||
|
});
|
|
@ -0,0 +1,163 @@
|
||||||
|
define([
|
||||||
|
"../core",
|
||||||
|
"./support",
|
||||||
|
"../core/init"
|
||||||
|
], function( jQuery, support ) {
|
||||||
|
|
||||||
|
var rreturn = /\r/g;
|
||||||
|
|
||||||
|
jQuery.fn.extend({
|
||||||
|
val: function( value ) {
|
||||||
|
var hooks, ret, isFunction,
|
||||||
|
elem = this[0];
|
||||||
|
|
||||||
|
if ( !arguments.length ) {
|
||||||
|
if ( elem ) {
|
||||||
|
hooks = jQuery.valHooks[ elem.type ] || jQuery.valHooks[ elem.nodeName.toLowerCase() ];
|
||||||
|
|
||||||
|
if ( hooks && "get" in hooks && (ret = hooks.get( elem, "value" )) !== undefined ) {
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
|
ret = elem.value;
|
||||||
|
|
||||||
|
return typeof ret === "string" ?
|
||||||
|
// handle most common string cases
|
||||||
|
ret.replace(rreturn, "") :
|
||||||
|
// handle cases where value is null/undef or number
|
||||||
|
ret == null ? "" : ret;
|
||||||
|
}
|
||||||
|
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
isFunction = jQuery.isFunction( value );
|
||||||
|
|
||||||
|
return this.each(function( i ) {
|
||||||
|
var val;
|
||||||
|
|
||||||
|
if ( this.nodeType !== 1 ) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
if ( isFunction ) {
|
||||||
|
val = value.call( this, i, jQuery( this ).val() );
|
||||||
|
} else {
|
||||||
|
val = value;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Treat null/undefined as ""; convert numbers to string
|
||||||
|
if ( val == null ) {
|
||||||
|
val = "";
|
||||||
|
|
||||||
|
} else if ( typeof val === "number" ) {
|
||||||
|
val += "";
|
||||||
|
|
||||||
|
} else if ( jQuery.isArray( val ) ) {
|
||||||
|
val = jQuery.map( val, function( value ) {
|
||||||
|
return value == null ? "" : value + "";
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
hooks = jQuery.valHooks[ this.type ] || jQuery.valHooks[ this.nodeName.toLowerCase() ];
|
||||||
|
|
||||||
|
// If set returns undefined, fall back to normal setting
|
||||||
|
if ( !hooks || !("set" in hooks) || hooks.set( this, val, "value" ) === undefined ) {
|
||||||
|
this.value = val;
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
jQuery.extend({
|
||||||
|
valHooks: {
|
||||||
|
option: {
|
||||||
|
get: function( elem ) {
|
||||||
|
var val = jQuery.find.attr( elem, "value" );
|
||||||
|
return val != null ?
|
||||||
|
val :
|
||||||
|
// Support: IE10-11+
|
||||||
|
// option.text throws exceptions (#14686, #14858)
|
||||||
|
jQuery.trim( jQuery.text( elem ) );
|
||||||
|
}
|
||||||
|
},
|
||||||
|
select: {
|
||||||
|
get: function( elem ) {
|
||||||
|
var value, option,
|
||||||
|
options = elem.options,
|
||||||
|
index = elem.selectedIndex,
|
||||||
|
one = elem.type === "select-one" || index < 0,
|
||||||
|
values = one ? null : [],
|
||||||
|
max = one ? index + 1 : options.length,
|
||||||
|
i = index < 0 ?
|
||||||
|
max :
|
||||||
|
one ? index : 0;
|
||||||
|
|
||||||
|
// Loop through all the selected options
|
||||||
|
for ( ; i < max; i++ ) {
|
||||||
|
option = options[ i ];
|
||||||
|
|
||||||
|
// IE6-9 doesn't update selected after form reset (#2551)
|
||||||
|
if ( ( option.selected || i === index ) &&
|
||||||
|
// Don't return options that are disabled or in a disabled optgroup
|
||||||
|
( support.optDisabled ? !option.disabled : option.getAttribute( "disabled" ) === null ) &&
|
||||||
|
( !option.parentNode.disabled || !jQuery.nodeName( option.parentNode, "optgroup" ) ) ) {
|
||||||
|
|
||||||
|
// Get the specific value for the option
|
||||||
|
value = jQuery( option ).val();
|
||||||
|
|
||||||
|
// We don't need an array for one selects
|
||||||
|
if ( one ) {
|
||||||
|
return value;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Multi-Selects return an array
|
||||||
|
values.push( value );
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return values;
|
||||||
|
},
|
||||||
|
|
||||||
|
set: function( elem, value ) {
|
||||||
|
var optionSet, option,
|
||||||
|
options = elem.options,
|
||||||
|
values = jQuery.makeArray( value ),
|
||||||
|
i = options.length;
|
||||||
|
|
||||||
|
while ( i-- ) {
|
||||||
|
option = options[ i ];
|
||||||
|
if ( (option.selected = jQuery.inArray( option.value, values ) >= 0) ) {
|
||||||
|
optionSet = true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// force browsers to behave consistently when non-matching value is set
|
||||||
|
if ( !optionSet ) {
|
||||||
|
elem.selectedIndex = -1;
|
||||||
|
}
|
||||||
|
return values;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
// Radios and checkboxes getter/setter
|
||||||
|
jQuery.each([ "radio", "checkbox" ], function() {
|
||||||
|
jQuery.valHooks[ this ] = {
|
||||||
|
set: function( elem, value ) {
|
||||||
|
if ( jQuery.isArray( value ) ) {
|
||||||
|
return ( elem.checked = jQuery.inArray( jQuery(elem).val(), value ) >= 0 );
|
||||||
|
}
|
||||||
|
}
|
||||||
|
};
|
||||||
|
if ( !support.checkOn ) {
|
||||||
|
jQuery.valHooks[ this ].get = function( elem ) {
|
||||||
|
// Support: Webkit
|
||||||
|
// "" is returned instead of "on" if a value isn't specified
|
||||||
|
return elem.getAttribute("value") === null ? "on" : elem.value;
|
||||||
|
};
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
});
|
|
@ -0,0 +1,205 @@
|
||||||
|
define([
|
||||||
|
"./core",
|
||||||
|
"./var/rnotwhite"
|
||||||
|
], function( jQuery, rnotwhite ) {
|
||||||
|
|
||||||
|
// 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( rnotwhite ) || [], function( _, flag ) {
|
||||||
|
object[ flag ] = true;
|
||||||
|
});
|
||||||
|
return object;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Create a callback list using the following parameters:
|
||||||
|
*
|
||||||
|
* options: an optional list of space-separated options that will change how
|
||||||
|
* the callback list behaves or a more traditional option object
|
||||||
|
*
|
||||||
|
* By default a callback list will act like an event callback list and can be
|
||||||
|
* "fired" multiple times.
|
||||||
|
*
|
||||||
|
* Possible options:
|
||||||
|
*
|
||||||
|
* once: will ensure the callback list can only be fired once (like a Deferred)
|
||||||
|
*
|
||||||
|
* memory: will keep track of previous values and will call any callback added
|
||||||
|
* after the list has been fired right away with the latest "memorized"
|
||||||
|
* values (like a Deferred)
|
||||||
|
*
|
||||||
|
* unique: will ensure a callback can only be added once (no duplicate in the list)
|
||||||
|
*
|
||||||
|
* stopOnFalse: interrupt callings when a callback returns false
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
jQuery.Callbacks = function( options ) {
|
||||||
|
|
||||||
|
// Convert options from String-formatted to Object-formatted if needed
|
||||||
|
// (we check in cache first)
|
||||||
|
options = typeof options === "string" ?
|
||||||
|
( optionsCache[ options ] || createOptions( options ) ) :
|
||||||
|
jQuery.extend( {}, options );
|
||||||
|
|
||||||
|
var // Last fire value (for non-forgettable lists)
|
||||||
|
memory,
|
||||||
|
// Flag to know if list was already fired
|
||||||
|
fired,
|
||||||
|
// Flag to know if list is currently firing
|
||||||
|
firing,
|
||||||
|
// First callback to fire (used internally by add and fireWith)
|
||||||
|
firingStart,
|
||||||
|
// End of the loop when firing
|
||||||
|
firingLength,
|
||||||
|
// Index of currently firing callback (modified by remove if needed)
|
||||||
|
firingIndex,
|
||||||
|
// Actual callback list
|
||||||
|
list = [],
|
||||||
|
// Stack of fire calls for repeatable lists
|
||||||
|
stack = !options.once && [],
|
||||||
|
// Fire callbacks
|
||||||
|
fire = function( data ) {
|
||||||
|
memory = options.memory && data;
|
||||||
|
fired = true;
|
||||||
|
firingIndex = firingStart || 0;
|
||||||
|
firingStart = 0;
|
||||||
|
firingLength = list.length;
|
||||||
|
firing = true;
|
||||||
|
for ( ; list && firingIndex < firingLength; firingIndex++ ) {
|
||||||
|
if ( list[ firingIndex ].apply( data[ 0 ], data[ 1 ] ) === false && options.stopOnFalse ) {
|
||||||
|
memory = false; // To prevent further calls using add
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
firing = false;
|
||||||
|
if ( list ) {
|
||||||
|
if ( stack ) {
|
||||||
|
if ( stack.length ) {
|
||||||
|
fire( stack.shift() );
|
||||||
|
}
|
||||||
|
} else if ( memory ) {
|
||||||
|
list = [];
|
||||||
|
} else {
|
||||||
|
self.disable();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
// Actual Callbacks object
|
||||||
|
self = {
|
||||||
|
// Add a callback or a collection of callbacks to the list
|
||||||
|
add: function() {
|
||||||
|
if ( list ) {
|
||||||
|
// First, we save the current length
|
||||||
|
var start = list.length;
|
||||||
|
(function add( args ) {
|
||||||
|
jQuery.each( args, function( _, arg ) {
|
||||||
|
var type = jQuery.type( arg );
|
||||||
|
if ( type === "function" ) {
|
||||||
|
if ( !options.unique || !self.has( arg ) ) {
|
||||||
|
list.push( arg );
|
||||||
|
}
|
||||||
|
} else if ( arg && arg.length && type !== "string" ) {
|
||||||
|
// Inspect recursively
|
||||||
|
add( arg );
|
||||||
|
}
|
||||||
|
});
|
||||||
|
})( arguments );
|
||||||
|
// Do we need to add the callbacks to the
|
||||||
|
// current firing batch?
|
||||||
|
if ( firing ) {
|
||||||
|
firingLength = list.length;
|
||||||
|
// With memory, if we're not firing then
|
||||||
|
// we should call right away
|
||||||
|
} else if ( memory ) {
|
||||||
|
firingStart = start;
|
||||||
|
fire( memory );
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return this;
|
||||||
|
},
|
||||||
|
// Remove a callback from the list
|
||||||
|
remove: function() {
|
||||||
|
if ( list ) {
|
||||||
|
jQuery.each( arguments, function( _, arg ) {
|
||||||
|
var index;
|
||||||
|
while ( ( index = jQuery.inArray( arg, list, index ) ) > -1 ) {
|
||||||
|
list.splice( index, 1 );
|
||||||
|
// Handle firing indexes
|
||||||
|
if ( firing ) {
|
||||||
|
if ( index <= firingLength ) {
|
||||||
|
firingLength--;
|
||||||
|
}
|
||||||
|
if ( index <= firingIndex ) {
|
||||||
|
firingIndex--;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
return this;
|
||||||
|
},
|
||||||
|
// Check if a given callback is in the list.
|
||||||
|
// If no argument is given, return whether or not list has callbacks attached.
|
||||||
|
has: function( fn ) {
|
||||||
|
return fn ? jQuery.inArray( fn, list ) > -1 : !!( list && list.length );
|
||||||
|
},
|
||||||
|
// Remove all callbacks from the list
|
||||||
|
empty: function() {
|
||||||
|
list = [];
|
||||||
|
firingLength = 0;
|
||||||
|
return this;
|
||||||
|
},
|
||||||
|
// Have the list do nothing anymore
|
||||||
|
disable: function() {
|
||||||
|
list = stack = memory = undefined;
|
||||||
|
return this;
|
||||||
|
},
|
||||||
|
// Is it disabled?
|
||||||
|
disabled: function() {
|
||||||
|
return !list;
|
||||||
|
},
|
||||||
|
// Lock the list in its current state
|
||||||
|
lock: function() {
|
||||||
|
stack = undefined;
|
||||||
|
if ( !memory ) {
|
||||||
|
self.disable();
|
||||||
|
}
|
||||||
|
return this;
|
||||||
|
},
|
||||||
|
// Is it locked?
|
||||||
|
locked: function() {
|
||||||
|
return !stack;
|
||||||
|
},
|
||||||
|
// Call all callbacks with the given context and arguments
|
||||||
|
fireWith: function( context, args ) {
|
||||||
|
if ( list && ( !fired || stack ) ) {
|
||||||
|
args = args || [];
|
||||||
|
args = [ context, args.slice ? args.slice() : args ];
|
||||||
|
if ( firing ) {
|
||||||
|
stack.push( args );
|
||||||
|
} else {
|
||||||
|
fire( args );
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return this;
|
||||||
|
},
|
||||||
|
// Call all the callbacks with the given arguments
|
||||||
|
fire: function() {
|
||||||
|
self.fireWith( this, arguments );
|
||||||
|
return this;
|
||||||
|
},
|
||||||
|
// To know if the callbacks have already been called at least once
|
||||||
|
fired: function() {
|
||||||
|
return !!fired;
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
return self;
|
||||||
|
};
|
||||||
|
|
||||||
|
return jQuery;
|
||||||
|
});
|
|
@ -0,0 +1,498 @@
|
||||||
|
define([
|
||||||
|
"./var/arr",
|
||||||
|
"./var/slice",
|
||||||
|
"./var/concat",
|
||||||
|
"./var/push",
|
||||||
|
"./var/indexOf",
|
||||||
|
"./var/class2type",
|
||||||
|
"./var/toString",
|
||||||
|
"./var/hasOwn",
|
||||||
|
"./var/support"
|
||||||
|
], function( arr, slice, concat, push, indexOf, class2type, toString, hasOwn, support ) {
|
||||||
|
|
||||||
|
var
|
||||||
|
// Use the correct document accordingly with window argument (sandbox)
|
||||||
|
document = window.document,
|
||||||
|
|
||||||
|
version = "@VERSION",
|
||||||
|
|
||||||
|
// Define a local copy of jQuery
|
||||||
|
jQuery = function( selector, context ) {
|
||||||
|
// The jQuery object is actually just the init constructor 'enhanced'
|
||||||
|
// Need init if jQuery is called (just allow error to be thrown if not included)
|
||||||
|
return new jQuery.fn.init( selector, context );
|
||||||
|
},
|
||||||
|
|
||||||
|
// Support: Android<4.1
|
||||||
|
// Make sure we trim BOM and NBSP
|
||||||
|
rtrim = /^[\s\uFEFF\xA0]+|[\s\uFEFF\xA0]+$/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();
|
||||||
|
};
|
||||||
|
|
||||||
|
jQuery.fn = jQuery.prototype = {
|
||||||
|
// The current version of jQuery being used
|
||||||
|
jquery: version,
|
||||||
|
|
||||||
|
constructor: jQuery,
|
||||||
|
|
||||||
|
// Start with an empty selector
|
||||||
|
selector: "",
|
||||||
|
|
||||||
|
// The default length of a jQuery object is 0
|
||||||
|
length: 0,
|
||||||
|
|
||||||
|
toArray: function() {
|
||||||
|
return 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 just the one element from the set
|
||||||
|
( num < 0 ? this[ num + this.length ] : this[ num ] ) :
|
||||||
|
|
||||||
|
// Return all the elements in a clean array
|
||||||
|
slice.call( this );
|
||||||
|
},
|
||||||
|
|
||||||
|
// 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 );
|
||||||
|
},
|
||||||
|
|
||||||
|
map: function( callback ) {
|
||||||
|
return this.pushStack( jQuery.map(this, function( elem, i ) {
|
||||||
|
return callback.call( elem, i, elem );
|
||||||
|
}));
|
||||||
|
},
|
||||||
|
|
||||||
|
slice: function() {
|
||||||
|
return this.pushStack( 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] ] : [] );
|
||||||
|
},
|
||||||
|
|
||||||
|
end: function() {
|
||||||
|
return this.prevObject || this.constructor(null);
|
||||||
|
},
|
||||||
|
|
||||||
|
// For internal use only.
|
||||||
|
// Behaves like an Array's method, not like a jQuery method.
|
||||||
|
push: push,
|
||||||
|
sort: arr.sort,
|
||||||
|
splice: arr.splice
|
||||||
|
};
|
||||||
|
|
||||||
|
jQuery.extend = jQuery.fn.extend = function() {
|
||||||
|
var options, name, src, copy, copyIsArray, clone,
|
||||||
|
target = arguments[0] || {},
|
||||||
|
i = 1,
|
||||||
|
length = arguments.length,
|
||||||
|
deep = false;
|
||||||
|
|
||||||
|
// Handle a deep copy situation
|
||||||
|
if ( typeof target === "boolean" ) {
|
||||||
|
deep = target;
|
||||||
|
|
||||||
|
// skip the boolean and the target
|
||||||
|
target = arguments[ i ] || {};
|
||||||
|
i++;
|
||||||
|
}
|
||||||
|
|
||||||
|
// 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 ( i === length ) {
|
||||||
|
target = this;
|
||||||
|
i--;
|
||||||
|
}
|
||||||
|
|
||||||
|
for ( ; i < length; i++ ) {
|
||||||
|
// Only deal with non-null/undefined values
|
||||||
|
if ( (options = arguments[ i ]) != null ) {
|
||||||
|
// Extend the base object
|
||||||
|
for ( name in options ) {
|
||||||
|
src = target[ name ];
|
||||||
|
copy = options[ name ];
|
||||||
|
|
||||||
|
// Prevent never-ending loop
|
||||||
|
if ( target === copy ) {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Recurse if we're merging plain objects or arrays
|
||||||
|
if ( deep && copy && ( jQuery.isPlainObject(copy) || (copyIsArray = jQuery.isArray(copy)) ) ) {
|
||||||
|
if ( copyIsArray ) {
|
||||||
|
copyIsArray = false;
|
||||||
|
clone = src && jQuery.isArray(src) ? src : [];
|
||||||
|
|
||||||
|
} else {
|
||||||
|
clone = src && jQuery.isPlainObject(src) ? src : {};
|
||||||
|
}
|
||||||
|
|
||||||
|
// Never move original objects, clone them
|
||||||
|
target[ name ] = jQuery.extend( deep, clone, copy );
|
||||||
|
|
||||||
|
// Don't bring in undefined values
|
||||||
|
} else if ( copy !== undefined ) {
|
||||||
|
target[ name ] = copy;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Return the modified object
|
||||||
|
return target;
|
||||||
|
};
|
||||||
|
|
||||||
|
jQuery.extend({
|
||||||
|
// Unique for each copy of jQuery on the page
|
||||||
|
expando: "jQuery" + ( version + Math.random() ).replace( /\D/g, "" ),
|
||||||
|
|
||||||
|
// Assume jQuery is ready without the ready module
|
||||||
|
isReady: true,
|
||||||
|
|
||||||
|
error: function( msg ) {
|
||||||
|
throw new Error( msg );
|
||||||
|
},
|
||||||
|
|
||||||
|
noop: function() {},
|
||||||
|
|
||||||
|
// See test/unit/core.js for details concerning isFunction.
|
||||||
|
// Since version 1.3, DOM methods and functions like alert
|
||||||
|
// aren't supported. They return false on IE (#2968).
|
||||||
|
isFunction: function( obj ) {
|
||||||
|
return jQuery.type(obj) === "function";
|
||||||
|
},
|
||||||
|
|
||||||
|
isArray: Array.isArray,
|
||||||
|
|
||||||
|
isWindow: function( obj ) {
|
||||||
|
return obj != null && obj === obj.window;
|
||||||
|
},
|
||||||
|
|
||||||
|
isNumeric: function( obj ) {
|
||||||
|
// parseFloat NaNs numeric-cast false positives (null|true|false|"")
|
||||||
|
// ...but misinterprets leading-number strings, particularly hex literals ("0x...")
|
||||||
|
// subtraction forces infinities to NaN
|
||||||
|
return !jQuery.isArray( obj ) && obj - parseFloat( obj ) >= 0;
|
||||||
|
},
|
||||||
|
|
||||||
|
isPlainObject: function( obj ) {
|
||||||
|
// Not plain objects:
|
||||||
|
// - Any object or value whose internal [[Class]] property is not "[object Object]"
|
||||||
|
// - DOM nodes
|
||||||
|
// - window
|
||||||
|
if ( jQuery.type( obj ) !== "object" || obj.nodeType || jQuery.isWindow( obj ) ) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
if ( obj.constructor &&
|
||||||
|
!hasOwn.call( obj.constructor.prototype, "isPrototypeOf" ) ) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
// If the function hasn't returned already, we're confident that
|
||||||
|
// |obj| is a plain object, created by {} or constructed with new Object
|
||||||
|
return true;
|
||||||
|
},
|
||||||
|
|
||||||
|
isEmptyObject: function( obj ) {
|
||||||
|
var name;
|
||||||
|
for ( name in obj ) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
return true;
|
||||||
|
},
|
||||||
|
|
||||||
|
type: function( obj ) {
|
||||||
|
if ( obj == null ) {
|
||||||
|
return obj + "";
|
||||||
|
}
|
||||||
|
// Support: Android < 4.0, iOS < 6 (functionish RegExp)
|
||||||
|
return typeof obj === "object" || typeof obj === "function" ?
|
||||||
|
class2type[ toString.call(obj) ] || "object" :
|
||||||
|
typeof obj;
|
||||||
|
},
|
||||||
|
|
||||||
|
// Evaluates a script in a global context
|
||||||
|
globalEval: function( code ) {
|
||||||
|
var script,
|
||||||
|
indirect = eval;
|
||||||
|
|
||||||
|
code = jQuery.trim( code );
|
||||||
|
|
||||||
|
if ( code ) {
|
||||||
|
// If the code includes a valid, prologue position
|
||||||
|
// strict mode pragma, execute code by injecting a
|
||||||
|
// script tag into the document.
|
||||||
|
if ( code.indexOf("use strict") === 1 ) {
|
||||||
|
script = document.createElement("script");
|
||||||
|
script.text = code;
|
||||||
|
document.head.appendChild( script ).parentNode.removeChild( script );
|
||||||
|
} else {
|
||||||
|
// Otherwise, avoid the DOM node creation, insertion
|
||||||
|
// and removal by using an indirect global eval
|
||||||
|
indirect( code );
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
|
||||||
|
// Convert dashed to camelCase; used by the css and data modules
|
||||||
|
// Microsoft forgot to hump their vendor prefix (#9572)
|
||||||
|
camelCase: function( string ) {
|
||||||
|
return string.replace( rmsPrefix, "ms-" ).replace( rdashAlpha, fcamelCase );
|
||||||
|
},
|
||||||
|
|
||||||
|
nodeName: function( elem, name ) {
|
||||||
|
return elem.nodeName && elem.nodeName.toLowerCase() === name.toLowerCase();
|
||||||
|
},
|
||||||
|
|
||||||
|
// args is for internal usage only
|
||||||
|
each: function( obj, callback, args ) {
|
||||||
|
var value,
|
||||||
|
i = 0,
|
||||||
|
length = obj.length,
|
||||||
|
isArray = isArraylike( obj );
|
||||||
|
|
||||||
|
if ( args ) {
|
||||||
|
if ( isArray ) {
|
||||||
|
for ( ; i < length; i++ ) {
|
||||||
|
value = callback.apply( obj[ i ], args );
|
||||||
|
|
||||||
|
if ( value === false ) {
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
for ( i in obj ) {
|
||||||
|
value = callback.apply( obj[ i ], args );
|
||||||
|
|
||||||
|
if ( value === false ) {
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// A special, fast, case for the most common use of each
|
||||||
|
} else {
|
||||||
|
if ( isArray ) {
|
||||||
|
for ( ; i < length; i++ ) {
|
||||||
|
value = callback.call( obj[ i ], i, obj[ i ] );
|
||||||
|
|
||||||
|
if ( value === false ) {
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
for ( i in obj ) {
|
||||||
|
value = callback.call( obj[ i ], i, obj[ i ] );
|
||||||
|
|
||||||
|
if ( value === false ) {
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return obj;
|
||||||
|
},
|
||||||
|
|
||||||
|
// Support: Android<4.1
|
||||||
|
trim: 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 {
|
||||||
|
push.call( ret, arr );
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return ret;
|
||||||
|
},
|
||||||
|
|
||||||
|
inArray: function( elem, arr, i ) {
|
||||||
|
return arr == null ? -1 : indexOf.call( arr, elem, i );
|
||||||
|
},
|
||||||
|
|
||||||
|
merge: function( first, second ) {
|
||||||
|
var len = +second.length,
|
||||||
|
j = 0,
|
||||||
|
i = first.length;
|
||||||
|
|
||||||
|
for ( ; j < len; j++ ) {
|
||||||
|
first[ i++ ] = second[ j ];
|
||||||
|
}
|
||||||
|
|
||||||
|
first.length = i;
|
||||||
|
|
||||||
|
return first;
|
||||||
|
},
|
||||||
|
|
||||||
|
grep: function( elems, callback, invert ) {
|
||||||
|
var callbackInverse,
|
||||||
|
matches = [],
|
||||||
|
i = 0,
|
||||||
|
length = elems.length,
|
||||||
|
callbackExpect = !invert;
|
||||||
|
|
||||||
|
// Go through the array, only saving the items
|
||||||
|
// that pass the validator function
|
||||||
|
for ( ; i < length; i++ ) {
|
||||||
|
callbackInverse = !callback( elems[ i ], i );
|
||||||
|
if ( callbackInverse !== callbackExpect ) {
|
||||||
|
matches.push( elems[ i ] );
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return matches;
|
||||||
|
},
|
||||||
|
|
||||||
|
// 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 new values
|
||||||
|
if ( isArray ) {
|
||||||
|
for ( ; i < length; i++ ) {
|
||||||
|
value = callback( elems[ i ], i, arg );
|
||||||
|
|
||||||
|
if ( value != null ) {
|
||||||
|
ret.push( value );
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Go through every key on the object,
|
||||||
|
} else {
|
||||||
|
for ( i in elems ) {
|
||||||
|
value = callback( elems[ i ], i, arg );
|
||||||
|
|
||||||
|
if ( value != null ) {
|
||||||
|
ret.push( value );
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Flatten any nested arrays
|
||||||
|
return concat.apply( [], ret );
|
||||||
|
},
|
||||||
|
|
||||||
|
// A global GUID counter for objects
|
||||||
|
guid: 1,
|
||||||
|
|
||||||
|
// Bind a function to a context, optionally partially applying any
|
||||||
|
// arguments.
|
||||||
|
proxy: function( fn, context ) {
|
||||||
|
var tmp, args, proxy;
|
||||||
|
|
||||||
|
if ( typeof context === "string" ) {
|
||||||
|
tmp = fn[ context ];
|
||||||
|
context = fn;
|
||||||
|
fn = tmp;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Quick check to determine if target is callable, in the spec
|
||||||
|
// this throws a TypeError, but we will just return undefined.
|
||||||
|
if ( !jQuery.isFunction( fn ) ) {
|
||||||
|
return undefined;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Simulated bind
|
||||||
|
args = slice.call( arguments, 2 );
|
||||||
|
proxy = function() {
|
||||||
|
return fn.apply( context || this, args.concat( 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;
|
||||||
|
},
|
||||||
|
|
||||||
|
now: Date.now,
|
||||||
|
|
||||||
|
// jQuery.support is not used in Core but other projects attach their
|
||||||
|
// properties to it so it needs to exist.
|
||||||
|
support: support
|
||||||
|
});
|
||||||
|
|
||||||
|
// 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 ( type === "function" || jQuery.isWindow( obj ) ) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
if ( obj.nodeType === 1 && length ) {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
return type === "array" || length === 0 ||
|
||||||
|
typeof length === "number" && length > 0 && ( length - 1 ) in obj;
|
||||||
|
}
|
||||||
|
|
||||||
|
return jQuery;
|
||||||
|
});
|
|
@ -0,0 +1,60 @@
|
||||||
|
define([
|
||||||
|
"../core"
|
||||||
|
], function( jQuery ) {
|
||||||
|
|
||||||
|
// Multifunctional method to get and set values of a collection
|
||||||
|
// The value/s can optionally be executed if it's a function
|
||||||
|
var access = jQuery.access = function( elems, fn, key, value, chainable, emptyGet, raw ) {
|
||||||
|
var i = 0,
|
||||||
|
len = 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 < len; i++ ) {
|
||||||
|
fn( elems[i], key, raw ? value : value.call( elems[i], i, fn( elems[i], key ) ) );
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return chainable ?
|
||||||
|
elems :
|
||||||
|
|
||||||
|
// Gets
|
||||||
|
bulk ?
|
||||||
|
fn.call( elems ) :
|
||||||
|
len ? fn( elems[0], key ) : emptyGet;
|
||||||
|
};
|
||||||
|
|
||||||
|
return access;
|
||||||
|
|
||||||
|
});
|
|
@ -0,0 +1,123 @@
|
||||||
|
// Initialize a jQuery object
|
||||||
|
define([
|
||||||
|
"../core",
|
||||||
|
"./var/rsingleTag",
|
||||||
|
"../traversing/findFilter"
|
||||||
|
], function( jQuery, rsingleTag ) {
|
||||||
|
|
||||||
|
// A central reference to the root jQuery(document)
|
||||||
|
var rootjQuery,
|
||||||
|
|
||||||
|
// A simple way to check for HTML strings
|
||||||
|
// Prioritize #id over <tag> to avoid XSS via location.hash (#9521)
|
||||||
|
// Strict HTML recognition (#11290: must start with <)
|
||||||
|
rquickExpr = /^(?:\s*(<[\w\W]+>)[^>]*|#([\w-]*))$/,
|
||||||
|
|
||||||
|
init = jQuery.fn.init = function( selector, context ) {
|
||||||
|
var match, elem;
|
||||||
|
|
||||||
|
// HANDLE: $(""), $(null), $(undefined), $(false)
|
||||||
|
if ( !selector ) {
|
||||||
|
return this;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Handle HTML strings
|
||||||
|
if ( typeof selector === "string" ) {
|
||||||
|
if ( selector[0] === "<" && selector[ 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
|
||||||
|
// Intentionally let the error be thrown if parseHTML is not present
|
||||||
|
jQuery.merge( this, jQuery.parseHTML(
|
||||||
|
match[1],
|
||||||
|
context && context.nodeType ? context.ownerDocument || context : document,
|
||||||
|
true
|
||||||
|
) );
|
||||||
|
|
||||||
|
// HANDLE: $(html, props)
|
||||||
|
if ( rsingleTag.test( match[1] ) && jQuery.isPlainObject( context ) ) {
|
||||||
|
for ( match in context ) {
|
||||||
|
// Properties of context are called as methods if possible
|
||||||
|
if ( jQuery.isFunction( this[ match ] ) ) {
|
||||||
|
this[ match ]( context[ match ] );
|
||||||
|
|
||||||
|
// ...and otherwise set as attributes
|
||||||
|
} else {
|
||||||
|
this.attr( match, context[ match ] );
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return this;
|
||||||
|
|
||||||
|
// HANDLE: $(#id)
|
||||||
|
} else {
|
||||||
|
elem = document.getElementById( match[2] );
|
||||||
|
|
||||||
|
// Check parentNode to catch when Blackberry 4.6 returns
|
||||||
|
// nodes that are no longer in the document #6963
|
||||||
|
if ( elem && elem.parentNode ) {
|
||||||
|
// Inject the element directly into the jQuery object
|
||||||
|
this.length = 1;
|
||||||
|
this[0] = elem;
|
||||||
|
}
|
||||||
|
|
||||||
|
this.context = document;
|
||||||
|
this.selector = selector;
|
||||||
|
return this;
|
||||||
|
}
|
||||||
|
|
||||||
|
// HANDLE: $(expr, $(...))
|
||||||
|
} else if ( !context || context.jquery ) {
|
||||||
|
return ( context || rootjQuery ).find( selector );
|
||||||
|
|
||||||
|
// HANDLE: $(expr, context)
|
||||||
|
// (which is just equivalent to: $(context).find(expr)
|
||||||
|
} else {
|
||||||
|
return this.constructor( context ).find( selector );
|
||||||
|
}
|
||||||
|
|
||||||
|
// HANDLE: $(DOMElement)
|
||||||
|
} else if ( selector.nodeType ) {
|
||||||
|
this.context = this[0] = selector;
|
||||||
|
this.length = 1;
|
||||||
|
return this;
|
||||||
|
|
||||||
|
// HANDLE: $(function)
|
||||||
|
// Shortcut for document ready
|
||||||
|
} else if ( jQuery.isFunction( selector ) ) {
|
||||||
|
return typeof rootjQuery.ready !== "undefined" ?
|
||||||
|
rootjQuery.ready( selector ) :
|
||||||
|
// Execute immediately if ready is not present
|
||||||
|
selector( jQuery );
|
||||||
|
}
|
||||||
|
|
||||||
|
if ( selector.selector !== undefined ) {
|
||||||
|
this.selector = selector.selector;
|
||||||
|
this.context = selector.context;
|
||||||
|
}
|
||||||
|
|
||||||
|
return jQuery.makeArray( selector, this );
|
||||||
|
};
|
||||||
|
|
||||||
|
// Give the init function the jQuery prototype for later instantiation
|
||||||
|
init.prototype = jQuery.fn;
|
||||||
|
|
||||||
|
// Initialize central reference
|
||||||
|
rootjQuery = jQuery( document );
|
||||||
|
|
||||||
|
return init;
|
||||||
|
|
||||||
|
});
|
|
@ -0,0 +1,39 @@
|
||||||
|
define([
|
||||||
|
"../core",
|
||||||
|
"./var/rsingleTag",
|
||||||
|
"../manipulation" // buildFragment
|
||||||
|
], function( jQuery, rsingleTag ) {
|
||||||
|
|
||||||
|
// 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
|
||||||
|
jQuery.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 && scripts.length ) {
|
||||||
|
jQuery( scripts ).remove();
|
||||||
|
}
|
||||||
|
|
||||||
|
return jQuery.merge( [], parsed.childNodes );
|
||||||
|
};
|
||||||
|
|
||||||
|
return jQuery.parseHTML;
|
||||||
|
|
||||||
|
});
|
|
@ -0,0 +1,97 @@
|
||||||
|
define([
|
||||||
|
"../core",
|
||||||
|
"../core/init",
|
||||||
|
"../deferred"
|
||||||
|
], function( jQuery ) {
|
||||||
|
|
||||||
|
// The deferred used on DOM ready
|
||||||
|
var readyList;
|
||||||
|
|
||||||
|
jQuery.fn.ready = function( fn ) {
|
||||||
|
// Add the callback
|
||||||
|
jQuery.ready.promise().done( fn );
|
||||||
|
|
||||||
|
return this;
|
||||||
|
};
|
||||||
|
|
||||||
|
jQuery.extend({
|
||||||
|
// Is the DOM ready to be used? Set to true once it occurs.
|
||||||
|
isReady: false,
|
||||||
|
|
||||||
|
// A counter to track how many items to wait for before
|
||||||
|
// the ready event fires. See #6781
|
||||||
|
readyWait: 1,
|
||||||
|
|
||||||
|
// Hold (or release) the ready event
|
||||||
|
holdReady: function( hold ) {
|
||||||
|
if ( hold ) {
|
||||||
|
jQuery.readyWait++;
|
||||||
|
} else {
|
||||||
|
jQuery.ready( true );
|
||||||
|
}
|
||||||
|
},
|
||||||
|
|
||||||
|
// Handle when the DOM is ready
|
||||||
|
ready: function( wait ) {
|
||||||
|
|
||||||
|
// Abort if there are pending holds or we're already ready
|
||||||
|
if ( wait === true ? --jQuery.readyWait : jQuery.isReady ) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Remember that the DOM is ready
|
||||||
|
jQuery.isReady = true;
|
||||||
|
|
||||||
|
// If a normal DOM Ready event fired, decrement, and wait if need be
|
||||||
|
if ( wait !== true && --jQuery.readyWait > 0 ) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
// If there are functions bound, to execute
|
||||||
|
readyList.resolveWith( document, [ jQuery ] );
|
||||||
|
|
||||||
|
// Trigger any bound ready events
|
||||||
|
if ( jQuery.fn.triggerHandler ) {
|
||||||
|
jQuery( document ).triggerHandler( "ready" );
|
||||||
|
jQuery( document ).off( "ready" );
|
||||||
|
}
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
/**
|
||||||
|
* The ready event handler and self cleanup method
|
||||||
|
*/
|
||||||
|
function completed() {
|
||||||
|
document.removeEventListener( "DOMContentLoaded", completed, false );
|
||||||
|
window.removeEventListener( "load", completed, false );
|
||||||
|
jQuery.ready();
|
||||||
|
}
|
||||||
|
|
||||||
|
jQuery.ready.promise = function( obj ) {
|
||||||
|
if ( !readyList ) {
|
||||||
|
|
||||||
|
readyList = jQuery.Deferred();
|
||||||
|
|
||||||
|
// Catch cases where $(document).ready() is called after the browser event has already occurred.
|
||||||
|
// we once tried to use readyState "interactive" here, but it caused issues like the one
|
||||||
|
// discovered by ChrisS here: http://bugs.jquery.com/ticket/12282#comment:15
|
||||||
|
if ( document.readyState === "complete" ) {
|
||||||
|
// Handle it asynchronously to allow scripts the opportunity to delay ready
|
||||||
|
setTimeout( jQuery.ready );
|
||||||
|
|
||||||
|
} else {
|
||||||
|
|
||||||
|
// Use the handy event callback
|
||||||
|
document.addEventListener( "DOMContentLoaded", completed, false );
|
||||||
|
|
||||||
|
// A fallback to window.onload, that will always work
|
||||||
|
window.addEventListener( "load", completed, false );
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return readyList.promise( obj );
|
||||||
|
};
|
||||||
|
|
||||||
|
// Kick off the DOM ready check even if the user does not
|
||||||
|
jQuery.ready.promise();
|
||||||
|
|
||||||
|
});
|
|
@ -0,0 +1,4 @@
|
||||||
|
define(function() {
|
||||||
|
// Match a standalone tag
|
||||||
|
return (/^<(\w+)\s*\/?>(?:<\/\1>|)$/);
|
||||||
|
});
|
|
@ -0,0 +1,451 @@
|
||||||
|
define([
|
||||||
|
"./core",
|
||||||
|
"./var/pnum",
|
||||||
|
"./core/access",
|
||||||
|
"./css/var/rmargin",
|
||||||
|
"./css/var/rnumnonpx",
|
||||||
|
"./css/var/cssExpand",
|
||||||
|
"./css/var/isHidden",
|
||||||
|
"./css/var/getStyles",
|
||||||
|
"./css/curCSS",
|
||||||
|
"./css/defaultDisplay",
|
||||||
|
"./css/addGetHookIf",
|
||||||
|
"./css/support",
|
||||||
|
"./data/var/data_priv",
|
||||||
|
|
||||||
|
"./core/init",
|
||||||
|
"./css/swap",
|
||||||
|
"./core/ready",
|
||||||
|
"./selector" // contains
|
||||||
|
], function( jQuery, pnum, access, rmargin, rnumnonpx, cssExpand, isHidden,
|
||||||
|
getStyles, curCSS, defaultDisplay, addGetHookIf, support, data_priv ) {
|
||||||
|
|
||||||
|
var
|
||||||
|
// 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]).+)/,
|
||||||
|
rnumsplit = new RegExp( "^(" + pnum + ")(.*)$", "i" ),
|
||||||
|
rrelNum = new RegExp( "^([+-])=(" + pnum + ")", "i" ),
|
||||||
|
|
||||||
|
cssShow = { position: "absolute", visibility: "hidden", display: "block" },
|
||||||
|
cssNormalTransform = {
|
||||||
|
letterSpacing: "0",
|
||||||
|
fontWeight: "400"
|
||||||
|
},
|
||||||
|
|
||||||
|
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[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 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.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 &&
|
||||||
|
( 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";
|
||||||
|
}
|
||||||
|
|
||||||
|
function showHide( elements, show ) {
|
||||||
|
var display, elem, hidden,
|
||||||
|
values = [],
|
||||||
|
index = 0,
|
||||||
|
length = elements.length;
|
||||||
|
|
||||||
|
for ( ; index < length; index++ ) {
|
||||||
|
elem = elements[ index ];
|
||||||
|
if ( !elem.style ) {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
values[ index ] = data_priv.get( elem, "olddisplay" );
|
||||||
|
display = elem.style.display;
|
||||||
|
if ( show ) {
|
||||||
|
// Reset the inline display of this element to learn if it is
|
||||||
|
// being hidden by cascaded rules or not
|
||||||
|
if ( !values[ index ] && display === "none" ) {
|
||||||
|
elem.style.display = "";
|
||||||
|
}
|
||||||
|
|
||||||
|
// Set elements which have been overridden with display: none
|
||||||
|
// in a stylesheet to whatever the default browser style is
|
||||||
|
// for such an element
|
||||||
|
if ( elem.style.display === "" && isHidden( elem ) ) {
|
||||||
|
values[ index ] = data_priv.access( elem, "olddisplay", defaultDisplay(elem.nodeName) );
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
hidden = isHidden( elem );
|
||||||
|
|
||||||
|
if ( display !== "none" || !hidden ) {
|
||||||
|
data_priv.set( elem, "olddisplay", hidden ? display : jQuery.css( elem, "display" ) );
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Set the display of most of the elements in a second loop
|
||||||
|
// to avoid the constant reflow
|
||||||
|
for ( index = 0; index < length; index++ ) {
|
||||||
|
elem = elements[ index ];
|
||||||
|
if ( !elem.style ) {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
if ( !show || elem.style.display === "none" || elem.style.display === "" ) {
|
||||||
|
elem.style.display = show ? values[ index ] || "" : "none";
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return elements;
|
||||||
|
}
|
||||||
|
|
||||||
|
jQuery.extend({
|
||||||
|
// Add in style property hooks for overriding the default
|
||||||
|
// behavior of getting and setting a style property
|
||||||
|
cssHooks: {
|
||||||
|
opacity: {
|
||||||
|
get: function( elem, computed ) {
|
||||||
|
if ( computed ) {
|
||||||
|
// We should always get a number back from opacity
|
||||||
|
var ret = curCSS( elem, "opacity" );
|
||||||
|
return ret === "" ? "1" : ret;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
|
||||||
|
// Don't automatically add "px" to these possibly-unitless properties
|
||||||
|
cssNumber: {
|
||||||
|
"columnCount": true,
|
||||||
|
"fillOpacity": true,
|
||||||
|
"flexGrow": true,
|
||||||
|
"flexShrink": true,
|
||||||
|
"fontWeight": true,
|
||||||
|
"lineHeight": true,
|
||||||
|
"opacity": true,
|
||||||
|
"order": true,
|
||||||
|
"orphans": true,
|
||||||
|
"widows": true,
|
||||||
|
"zIndex": true,
|
||||||
|
"zoom": true
|
||||||
|
},
|
||||||
|
|
||||||
|
// Add in properties whose names you wish to fix before
|
||||||
|
// setting or getting the value
|
||||||
|
cssProps: {
|
||||||
|
// normalize float css property
|
||||||
|
"float": "cssFloat"
|
||||||
|
},
|
||||||
|
|
||||||
|
// Get and set the style property on a DOM Node
|
||||||
|
style: function( elem, name, value, extra ) {
|
||||||
|
// Don't set styles on text and comment nodes
|
||||||
|
if ( !elem || elem.nodeType === 3 || elem.nodeType === 8 || !elem.style ) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Make sure that we're working with the right name
|
||||||
|
var ret, type, hooks,
|
||||||
|
origName = jQuery.camelCase( name ),
|
||||||
|
style = elem.style;
|
||||||
|
|
||||||
|
name = jQuery.cssProps[ origName ] || ( jQuery.cssProps[ origName ] = vendorPropName( style, origName ) );
|
||||||
|
|
||||||
|
// gets hook for the prefixed version
|
||||||
|
// followed by the unprefixed version
|
||||||
|
hooks = jQuery.cssHooks[ name ] || jQuery.cssHooks[ origName ];
|
||||||
|
|
||||||
|
// Check if we're setting a value
|
||||||
|
if ( value !== undefined ) {
|
||||||
|
type = typeof value;
|
||||||
|
|
||||||
|
// convert relative number strings (+= or -=) to relative numbers. #7345
|
||||||
|
if ( type === "string" && (ret = rrelNum.exec( value )) ) {
|
||||||
|
value = ( ret[1] + 1 ) * ret[2] + parseFloat( jQuery.css( elem, name ) );
|
||||||
|
// Fixes bug #9237
|
||||||
|
type = "number";
|
||||||
|
}
|
||||||
|
|
||||||
|
// Make sure that null and NaN values aren't set. See: #7116
|
||||||
|
if ( value == null || value !== value ) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
// If a number was passed in, add 'px' to the (except for certain CSS properties)
|
||||||
|
if ( type === "number" && !jQuery.cssNumber[ origName ] ) {
|
||||||
|
value += "px";
|
||||||
|
}
|
||||||
|
|
||||||
|
// Fixes #8908, it can be done more correctly by specifying setters in cssHooks,
|
||||||
|
// but it would mean to define eight (for every problematic property) identical functions
|
||||||
|
if ( !support.clearCloneStyle && value === "" && name.indexOf( "background" ) === 0 ) {
|
||||||
|
style[ name ] = "inherit";
|
||||||
|
}
|
||||||
|
|
||||||
|
// If a hook was provided, use that value, otherwise just set the specified value
|
||||||
|
if ( !hooks || !("set" in hooks) || (value = hooks.set( elem, value, extra )) !== undefined ) {
|
||||||
|
style[ name ] = value;
|
||||||
|
}
|
||||||
|
|
||||||
|
} else {
|
||||||
|
// If a hook was provided get the non-computed value from there
|
||||||
|
if ( hooks && "get" in hooks && (ret = hooks.get( elem, false, extra )) !== undefined ) {
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Otherwise just get the value from the style object
|
||||||
|
return style[ name ];
|
||||||
|
}
|
||||||
|
},
|
||||||
|
|
||||||
|
css: function( elem, name, extra, styles ) {
|
||||||
|
var val, num, hooks,
|
||||||
|
origName = jQuery.camelCase( name );
|
||||||
|
|
||||||
|
// Make sure that we're working with the right name
|
||||||
|
name = jQuery.cssProps[ origName ] || ( jQuery.cssProps[ origName ] = vendorPropName( elem.style, origName ) );
|
||||||
|
|
||||||
|
// gets hook for the prefixed version
|
||||||
|
// followed by the unprefixed version
|
||||||
|
hooks = jQuery.cssHooks[ name ] || jQuery.cssHooks[ origName ];
|
||||||
|
|
||||||
|
// If a hook was provided get the computed value from there
|
||||||
|
if ( hooks && "get" in hooks ) {
|
||||||
|
val = hooks.get( elem, true, extra );
|
||||||
|
}
|
||||||
|
|
||||||
|
// Otherwise, if a way to get the computed value exists, use that
|
||||||
|
if ( val === undefined ) {
|
||||||
|
val = curCSS( elem, name, styles );
|
||||||
|
}
|
||||||
|
|
||||||
|
//convert "normal" to computed value
|
||||||
|
if ( val === "normal" && name in cssNormalTransform ) {
|
||||||
|
val = cssNormalTransform[ name ];
|
||||||
|
}
|
||||||
|
|
||||||
|
// Return, converting to number if forced or a qualifier was provided and val looks numeric
|
||||||
|
if ( extra === "" || extra ) {
|
||||||
|
num = parseFloat( val );
|
||||||
|
return extra === true || jQuery.isNumeric( num ) ? num || 0 : val;
|
||||||
|
}
|
||||||
|
return val;
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
jQuery.each([ "height", "width" ], function( i, name ) {
|
||||||
|
jQuery.cssHooks[ name ] = {
|
||||||
|
get: function( elem, computed, extra ) {
|
||||||
|
if ( computed ) {
|
||||||
|
// certain elements can have dimension info if we invisibly show them
|
||||||
|
// however, it must have a current display style that would benefit from this
|
||||||
|
return rdisplayswap.test( jQuery.css( elem, "display" ) ) && elem.offsetWidth === 0 ?
|
||||||
|
jQuery.swap( elem, cssShow, function() {
|
||||||
|
return getWidthOrHeight( elem, name, extra );
|
||||||
|
}) :
|
||||||
|
getWidthOrHeight( elem, name, extra );
|
||||||
|
}
|
||||||
|
},
|
||||||
|
|
||||||
|
set: function( elem, value, extra ) {
|
||||||
|
var styles = extra && getStyles( elem );
|
||||||
|
return setPositiveNumber( elem, value, extra ?
|
||||||
|
augmentWidthOrHeight(
|
||||||
|
elem,
|
||||||
|
name,
|
||||||
|
extra,
|
||||||
|
jQuery.css( elem, "boxSizing", false, styles ) === "border-box",
|
||||||
|
styles
|
||||||
|
) : 0
|
||||||
|
);
|
||||||
|
}
|
||||||
|
};
|
||||||
|
});
|
||||||
|
|
||||||
|
// Support: Android 2.3
|
||||||
|
jQuery.cssHooks.marginRight = addGetHookIf( support.reliableMarginRight,
|
||||||
|
function( elem, computed ) {
|
||||||
|
if ( computed ) {
|
||||||
|
// WebKit Bug 13343 - getComputedStyle returns wrong value for margin-right
|
||||||
|
// Work around by temporarily setting element display to inline-block
|
||||||
|
return jQuery.swap( elem, { "display": "inline-block" },
|
||||||
|
curCSS, [ elem, "marginRight" ] );
|
||||||
|
}
|
||||||
|
}
|
||||||
|
);
|
||||||
|
|
||||||
|
// These hooks are used by animate to expand properties
|
||||||
|
jQuery.each({
|
||||||
|
margin: "",
|
||||||
|
padding: "",
|
||||||
|
border: "Width"
|
||||||
|
}, function( prefix, suffix ) {
|
||||||
|
jQuery.cssHooks[ prefix + suffix ] = {
|
||||||
|
expand: function( value ) {
|
||||||
|
var i = 0,
|
||||||
|
expanded = {},
|
||||||
|
|
||||||
|
// assumes a single number if not a string
|
||||||
|
parts = typeof value === "string" ? value.split(" ") : [ value ];
|
||||||
|
|
||||||
|
for ( ; i < 4; i++ ) {
|
||||||
|
expanded[ prefix + cssExpand[ i ] + suffix ] =
|
||||||
|
parts[ i ] || parts[ i - 2 ] || parts[ 0 ];
|
||||||
|
}
|
||||||
|
|
||||||
|
return expanded;
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
if ( !rmargin.test( prefix ) ) {
|
||||||
|
jQuery.cssHooks[ prefix + suffix ].set = setPositiveNumber;
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
jQuery.fn.extend({
|
||||||
|
css: function( name, value ) {
|
||||||
|
return access( this, function( elem, name, value ) {
|
||||||
|
var styles, len,
|
||||||
|
map = {},
|
||||||
|
i = 0;
|
||||||
|
|
||||||
|
if ( jQuery.isArray( name ) ) {
|
||||||
|
styles = getStyles( elem );
|
||||||
|
len = name.length;
|
||||||
|
|
||||||
|
for ( ; i < len; i++ ) {
|
||||||
|
map[ name[ i ] ] = jQuery.css( elem, name[ i ], false, styles );
|
||||||
|
}
|
||||||
|
|
||||||
|
return map;
|
||||||
|
}
|
||||||
|
|
||||||
|
return value !== undefined ?
|
||||||
|
jQuery.style( elem, name, value ) :
|
||||||
|
jQuery.css( elem, name );
|
||||||
|
}, name, value, arguments.length > 1 );
|
||||||
|
},
|
||||||
|
show: function() {
|
||||||
|
return showHide( this, true );
|
||||||
|
},
|
||||||
|
hide: function() {
|
||||||
|
return showHide( this );
|
||||||
|
},
|
||||||
|
toggle: function( state ) {
|
||||||
|
if ( typeof state === "boolean" ) {
|
||||||
|
return state ? this.show() : this.hide();
|
||||||
|
}
|
||||||
|
|
||||||
|
return this.each(function() {
|
||||||
|
if ( isHidden( this ) ) {
|
||||||
|
jQuery( this ).show();
|
||||||
|
} else {
|
||||||
|
jQuery( this ).hide();
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
return jQuery;
|
||||||
|
});
|
|
@ -0,0 +1,24 @@
|
||||||
|
define(function() {
|
||||||
|
|
||||||
|
function addGetHookIf( conditionFn, hookFn ) {
|
||||||
|
// Define the hook, we'll check on the first run if it's really needed.
|
||||||
|
return {
|
||||||
|
get: function() {
|
||||||
|
if ( conditionFn() ) {
|
||||||
|
// Hook not needed (or it's not possible to use it due to missing dependency),
|
||||||
|
// remove it.
|
||||||
|
// Since there are no other hooks for marginRight, remove the whole object.
|
||||||
|
delete this.get;
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Hook needed; redefine it so that the support test is not executed again.
|
||||||
|
|
||||||
|
return (this.get = hookFn).apply( this, arguments );
|
||||||
|
}
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
return addGetHookIf;
|
||||||
|
|
||||||
|
});
|
|
@ -0,0 +1,57 @@
|
||||||
|
define([
|
||||||
|
"../core",
|
||||||
|
"./var/rnumnonpx",
|
||||||
|
"./var/rmargin",
|
||||||
|
"./var/getStyles",
|
||||||
|
"../selector" // contains
|
||||||
|
], function( jQuery, rnumnonpx, rmargin, getStyles ) {
|
||||||
|
|
||||||
|
function curCSS( elem, name, computed ) {
|
||||||
|
var width, minWidth, maxWidth, ret,
|
||||||
|
style = elem.style;
|
||||||
|
|
||||||
|
computed = computed || getStyles( elem );
|
||||||
|
|
||||||
|
// Support: IE9
|
||||||
|
// getPropertyValue is only needed for .css('filter') in IE9, see #12537
|
||||||
|
if ( computed ) {
|
||||||
|
ret = computed.getPropertyValue( name ) || computed[ name ];
|
||||||
|
}
|
||||||
|
|
||||||
|
if ( computed ) {
|
||||||
|
|
||||||
|
if ( ret === "" && !jQuery.contains( elem.ownerDocument, elem ) ) {
|
||||||
|
ret = jQuery.style( elem, name );
|
||||||
|
}
|
||||||
|
|
||||||
|
// Support: iOS < 6
|
||||||
|
// A tribute to the "awesome hack by Dean Edwards"
|
||||||
|
// iOS < 6 (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 !== undefined ?
|
||||||
|
// Support: IE
|
||||||
|
// IE returns zIndex value as an integer.
|
||||||
|
ret + "" :
|
||||||
|
ret;
|
||||||
|
}
|
||||||
|
|
||||||
|
return curCSS;
|
||||||
|
});
|
|
@ -0,0 +1,70 @@
|
||||||
|
define([
|
||||||
|
"../core",
|
||||||
|
"../manipulation" // appendTo
|
||||||
|
], function( jQuery ) {
|
||||||
|
|
||||||
|
var iframe,
|
||||||
|
elemdisplay = {};
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Retrieve the actual display of a element
|
||||||
|
* @param {String} name nodeName of the element
|
||||||
|
* @param {Object} doc Document object
|
||||||
|
*/
|
||||||
|
// Called only from within defaultDisplay
|
||||||
|
function actualDisplay( name, doc ) {
|
||||||
|
var style,
|
||||||
|
elem = jQuery( doc.createElement( name ) ).appendTo( doc.body ),
|
||||||
|
|
||||||
|
// getDefaultComputedStyle might be reliably used only on attached element
|
||||||
|
display = window.getDefaultComputedStyle && ( style = window.getDefaultComputedStyle( elem[ 0 ] ) ) ?
|
||||||
|
|
||||||
|
// Use of this method is a temporary fix (more like optmization) until something better comes along,
|
||||||
|
// since it was removed from specification and supported only in FF
|
||||||
|
style.display : jQuery.css( elem[ 0 ], "display" );
|
||||||
|
|
||||||
|
// We don't have any data stored on the element,
|
||||||
|
// so use "detach" method as fast way to get rid of the element
|
||||||
|
elem.detach();
|
||||||
|
|
||||||
|
return display;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Try to determine the default display value of an element
|
||||||
|
* @param {String} nodeName
|
||||||
|
*/
|
||||||
|
function defaultDisplay( nodeName ) {
|
||||||
|
var doc = document,
|
||||||
|
display = elemdisplay[ nodeName ];
|
||||||
|
|
||||||
|
if ( !display ) {
|
||||||
|
display = actualDisplay( nodeName, doc );
|
||||||
|
|
||||||
|
// If the simple way fails, read from inside an iframe
|
||||||
|
if ( display === "none" || !display ) {
|
||||||
|
|
||||||
|
// Use the already-created iframe if possible
|
||||||
|
iframe = (iframe || jQuery( "<iframe frameborder='0' width='0' height='0'/>" )).appendTo( doc.documentElement );
|
||||||
|
|
||||||
|
// Always write a new HTML skeleton so Webkit and Firefox don't choke on reuse
|
||||||
|
doc = iframe[ 0 ].contentDocument;
|
||||||
|
|
||||||
|
// Support: IE
|
||||||
|
doc.write();
|
||||||
|
doc.close();
|
||||||
|
|
||||||
|
display = actualDisplay( nodeName, doc );
|
||||||
|
iframe.detach();
|
||||||
|
}
|
||||||
|
|
||||||
|
// Store the correct default display
|
||||||
|
elemdisplay[ nodeName ] = display;
|
||||||
|
}
|
||||||
|
|
||||||
|
return display;
|
||||||
|
}
|
||||||
|
|
||||||
|
return defaultDisplay;
|
||||||
|
|
||||||
|
});
|
|
@ -0,0 +1,15 @@
|
||||||
|
define([
|
||||||
|
"../core",
|
||||||
|
"../selector"
|
||||||
|
], function( jQuery ) {
|
||||||
|
|
||||||
|
jQuery.expr.filters.hidden = function( elem ) {
|
||||||
|
// Support: Opera <= 12.12
|
||||||
|
// Opera reports offsetWidths and offsetHeights less than zero on some elements
|
||||||
|
return elem.offsetWidth <= 0 && elem.offsetHeight <= 0;
|
||||||
|
};
|
||||||
|
jQuery.expr.filters.visible = function( elem ) {
|
||||||
|
return !jQuery.expr.filters.hidden( elem );
|
||||||
|
};
|
||||||
|
|
||||||
|
});
|
|
@ -0,0 +1,91 @@
|
||||||
|
define([
|
||||||
|
"../core",
|
||||||
|
"../var/support"
|
||||||
|
], function( jQuery, support ) {
|
||||||
|
|
||||||
|
(function() {
|
||||||
|
var pixelPositionVal, boxSizingReliableVal,
|
||||||
|
docElem = document.documentElement,
|
||||||
|
container = document.createElement( "div" ),
|
||||||
|
div = document.createElement( "div" );
|
||||||
|
|
||||||
|
if ( !div.style ) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
div.style.backgroundClip = "content-box";
|
||||||
|
div.cloneNode( true ).style.backgroundClip = "";
|
||||||
|
support.clearCloneStyle = div.style.backgroundClip === "content-box";
|
||||||
|
|
||||||
|
container.style.cssText = "border:0;width:0;height:0;top:0;left:-9999px;margin-top:1px;" +
|
||||||
|
"position:absolute";
|
||||||
|
container.appendChild( div );
|
||||||
|
|
||||||
|
// Executing both pixelPosition & boxSizingReliable tests require only one layout
|
||||||
|
// so they're executed at the same time to save the second computation.
|
||||||
|
function computePixelPositionAndBoxSizingReliable() {
|
||||||
|
div.style.cssText =
|
||||||
|
// Support: Firefox<29, Android 2.3
|
||||||
|
// Vendor-prefix box-sizing
|
||||||
|
"-webkit-box-sizing:border-box;-moz-box-sizing:border-box;" +
|
||||||
|
"box-sizing:border-box;display:block;margin-top:1%;top:1%;" +
|
||||||
|
"border:1px;padding:1px;width:4px;position:absolute";
|
||||||
|
div.innerHTML = "";
|
||||||
|
docElem.appendChild( container );
|
||||||
|
|
||||||
|
var divStyle = window.getComputedStyle( div, null );
|
||||||
|
pixelPositionVal = divStyle.top !== "1%";
|
||||||
|
boxSizingReliableVal = divStyle.width === "4px";
|
||||||
|
|
||||||
|
docElem.removeChild( container );
|
||||||
|
}
|
||||||
|
|
||||||
|
// Support: node.js jsdom
|
||||||
|
// Don't assume that getComputedStyle is a property of the global object
|
||||||
|
if ( window.getComputedStyle ) {
|
||||||
|
jQuery.extend( support, {
|
||||||
|
pixelPosition: function() {
|
||||||
|
// This test is executed only once but we still do memoizing
|
||||||
|
// since we can use the boxSizingReliable pre-computing.
|
||||||
|
// No need to check if the test was already performed, though.
|
||||||
|
computePixelPositionAndBoxSizingReliable();
|
||||||
|
return pixelPositionVal;
|
||||||
|
},
|
||||||
|
boxSizingReliable: function() {
|
||||||
|
if ( boxSizingReliableVal == null ) {
|
||||||
|
computePixelPositionAndBoxSizingReliable();
|
||||||
|
}
|
||||||
|
return boxSizingReliableVal;
|
||||||
|
},
|
||||||
|
reliableMarginRight: function() {
|
||||||
|
// Support: Android 2.3
|
||||||
|
// Check if div with explicit width and no margin-right incorrectly
|
||||||
|
// gets computed margin-right based on width of container. (#3333)
|
||||||
|
// WebKit Bug 13343 - getComputedStyle returns wrong value for margin-right
|
||||||
|
// This support function is only executed once so no memoizing is needed.
|
||||||
|
var ret,
|
||||||
|
marginDiv = div.appendChild( document.createElement( "div" ) );
|
||||||
|
|
||||||
|
// Reset CSS: box-sizing; display; margin; border; padding
|
||||||
|
marginDiv.style.cssText = div.style.cssText =
|
||||||
|
// Support: Firefox<29, Android 2.3
|
||||||
|
// Vendor-prefix box-sizing
|
||||||
|
"-webkit-box-sizing:content-box;-moz-box-sizing:content-box;" +
|
||||||
|
"box-sizing:content-box;display:block;margin:0;border:0;padding:0";
|
||||||
|
marginDiv.style.marginRight = marginDiv.style.width = "0";
|
||||||
|
div.style.width = "1px";
|
||||||
|
docElem.appendChild( container );
|
||||||
|
|
||||||
|
ret = !parseFloat( window.getComputedStyle( marginDiv, null ).marginRight );
|
||||||
|
|
||||||
|
docElem.removeChild( container );
|
||||||
|
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
})();
|
||||||
|
|
||||||
|
return support;
|
||||||
|
|
||||||
|
});
|
|
@ -0,0 +1,28 @@
|
||||||
|
define([
|
||||||
|
"../core"
|
||||||
|
], function( jQuery ) {
|
||||||
|
|
||||||
|
// A method for quickly swapping in/out CSS properties to get correct calculations.
|
||||||
|
jQuery.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;
|
||||||
|
};
|
||||||
|
|
||||||
|
return jQuery.swap;
|
||||||
|
|
||||||
|
});
|
|
@ -0,0 +1,3 @@
|
||||||
|
define(function() {
|
||||||
|
return [ "Top", "Right", "Bottom", "Left" ];
|
||||||
|
});
|
|
@ -0,0 +1,5 @@
|
||||||
|
define(function() {
|
||||||
|
return function( elem ) {
|
||||||
|
return elem.ownerDocument.defaultView.getComputedStyle( elem, null );
|
||||||
|
};
|
||||||
|
});
|
|
@ -0,0 +1,13 @@
|
||||||
|
define([
|
||||||
|
"../../core",
|
||||||
|
"../../selector"
|
||||||
|
// css is assumed
|
||||||
|
], function( jQuery ) {
|
||||||
|
|
||||||
|
return function( 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 );
|
||||||
|
};
|
||||||
|
});
|
|
@ -0,0 +1,3 @@
|
||||||
|
define(function() {
|
||||||
|
return (/^margin/);
|
||||||
|
});
|
|
@ -0,0 +1,5 @@
|
||||||
|
define([
|
||||||
|
"../../var/pnum"
|
||||||
|
], function( pnum ) {
|
||||||
|
return new RegExp( "^(" + pnum + ")(?!px)[a-z%]+$", "i" );
|
||||||
|
});
|
|
@ -0,0 +1,179 @@
|
||||||
|
define([
|
||||||
|
"./core",
|
||||||
|
"./var/rnotwhite",
|
||||||
|
"./core/access",
|
||||||
|
"./data/var/data_priv",
|
||||||
|
"./data/var/data_user"
|
||||||
|
], function( jQuery, rnotwhite, access, data_priv, data_user ) {
|
||||||
|
|
||||||
|
/*
|
||||||
|
Implementation Summary
|
||||||
|
|
||||||
|
1. Enforce API surface and semantic compatibility with 1.9.x branch
|
||||||
|
2. Improve the module's maintainability by reducing the storage
|
||||||
|
paths to a single mechanism.
|
||||||
|
3. Use the same single mechanism to support "private" and "user" data.
|
||||||
|
4. _Never_ expose "private" data to user code (TODO: Drop _data, _removeData)
|
||||||
|
5. Avoid exposing implementation details on user objects (eg. expando properties)
|
||||||
|
6. Provide a clear path for implementation upgrade to WeakMap in 2014
|
||||||
|
*/
|
||||||
|
var rbrace = /^(?:\{[\w\W]*\}|\[[\w\W]*\])$/,
|
||||||
|
rmultiDash = /([A-Z])/g;
|
||||||
|
|
||||||
|
function dataAttr( elem, key, data ) {
|
||||||
|
var name;
|
||||||
|
|
||||||
|
// If nothing was found internally, try to fetch any
|
||||||
|
// data from the HTML5 data-* attribute
|
||||||
|
if ( data === undefined && elem.nodeType === 1 ) {
|
||||||
|
name = "data-" + key.replace( rmultiDash, "-$1" ).toLowerCase();
|
||||||
|
data = elem.getAttribute( name );
|
||||||
|
|
||||||
|
if ( typeof data === "string" ) {
|
||||||
|
try {
|
||||||
|
data = data === "true" ? true :
|
||||||
|
data === "false" ? false :
|
||||||
|
data === "null" ? null :
|
||||||
|
// Only convert to a number if it doesn't change the string
|
||||||
|
+data + "" === data ? +data :
|
||||||
|
rbrace.test( data ) ? jQuery.parseJSON( data ) :
|
||||||
|
data;
|
||||||
|
} catch( e ) {}
|
||||||
|
|
||||||
|
// Make sure we set the data so it isn't changed later
|
||||||
|
data_user.set( elem, key, data );
|
||||||
|
} else {
|
||||||
|
data = undefined;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return data;
|
||||||
|
}
|
||||||
|
|
||||||
|
jQuery.extend({
|
||||||
|
hasData: function( elem ) {
|
||||||
|
return data_user.hasData( elem ) || data_priv.hasData( elem );
|
||||||
|
},
|
||||||
|
|
||||||
|
data: function( elem, name, data ) {
|
||||||
|
return data_user.access( elem, name, data );
|
||||||
|
},
|
||||||
|
|
||||||
|
removeData: function( elem, name ) {
|
||||||
|
data_user.remove( elem, name );
|
||||||
|
},
|
||||||
|
|
||||||
|
// TODO: Now that all calls to _data and _removeData have been replaced
|
||||||
|
// with direct calls to data_priv methods, these can be deprecated.
|
||||||
|
_data: function( elem, name, data ) {
|
||||||
|
return data_priv.access( elem, name, data );
|
||||||
|
},
|
||||||
|
|
||||||
|
_removeData: function( elem, name ) {
|
||||||
|
data_priv.remove( elem, name );
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
jQuery.fn.extend({
|
||||||
|
data: function( key, value ) {
|
||||||
|
var i, name, data,
|
||||||
|
elem = this[ 0 ],
|
||||||
|
attrs = elem && elem.attributes;
|
||||||
|
|
||||||
|
// Gets all values
|
||||||
|
if ( key === undefined ) {
|
||||||
|
if ( this.length ) {
|
||||||
|
data = data_user.get( elem );
|
||||||
|
|
||||||
|
if ( elem.nodeType === 1 && !data_priv.get( elem, "hasDataAttrs" ) ) {
|
||||||
|
i = attrs.length;
|
||||||
|
while ( i-- ) {
|
||||||
|
|
||||||
|
// Support: IE11+
|
||||||
|
// The attrs elements can be null (#14894)
|
||||||
|
if ( attrs[ i ] ) {
|
||||||
|
name = attrs[ i ].name;
|
||||||
|
if ( name.indexOf( "data-" ) === 0 ) {
|
||||||
|
name = jQuery.camelCase( name.slice(5) );
|
||||||
|
dataAttr( elem, name, data[ name ] );
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
data_priv.set( elem, "hasDataAttrs", true );
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return data;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Sets multiple values
|
||||||
|
if ( typeof key === "object" ) {
|
||||||
|
return this.each(function() {
|
||||||
|
data_user.set( this, key );
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
return access( this, function( value ) {
|
||||||
|
var data,
|
||||||
|
camelKey = jQuery.camelCase( key );
|
||||||
|
|
||||||
|
// The calling jQuery object (element matches) is not empty
|
||||||
|
// (and therefore has an element appears at this[ 0 ]) and the
|
||||||
|
// `value` parameter was not undefined. An empty jQuery object
|
||||||
|
// will result in `undefined` for elem = this[ 0 ] which will
|
||||||
|
// throw an exception if an attempt to read a data cache is made.
|
||||||
|
if ( elem && value === undefined ) {
|
||||||
|
// Attempt to get data from the cache
|
||||||
|
// with the key as-is
|
||||||
|
data = data_user.get( elem, key );
|
||||||
|
if ( data !== undefined ) {
|
||||||
|
return data;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Attempt to get data from the cache
|
||||||
|
// with the key camelized
|
||||||
|
data = data_user.get( elem, camelKey );
|
||||||
|
if ( data !== undefined ) {
|
||||||
|
return data;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Attempt to "discover" the data in
|
||||||
|
// HTML5 custom data-* attrs
|
||||||
|
data = dataAttr( elem, camelKey, undefined );
|
||||||
|
if ( data !== undefined ) {
|
||||||
|
return data;
|
||||||
|
}
|
||||||
|
|
||||||
|
// We tried really hard, but the data doesn't exist.
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Set the data...
|
||||||
|
this.each(function() {
|
||||||
|
// First, attempt to store a copy or reference of any
|
||||||
|
// data that might've been store with a camelCased key.
|
||||||
|
var data = data_user.get( this, camelKey );
|
||||||
|
|
||||||
|
// For HTML5 data-* attribute interop, we have to
|
||||||
|
// store property names with dashes in a camelCase form.
|
||||||
|
// This might not apply to all properties...*
|
||||||
|
data_user.set( this, camelKey, value );
|
||||||
|
|
||||||
|
// *... In the case of properties that might _actually_
|
||||||
|
// have dashes, we need to also store a copy of that
|
||||||
|
// unchanged property.
|
||||||
|
if ( key.indexOf("-") !== -1 && data !== undefined ) {
|
||||||
|
data_user.set( this, key, value );
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}, null, value, arguments.length > 1, null, true );
|
||||||
|
},
|
||||||
|
|
||||||
|
removeData: function( key ) {
|
||||||
|
return this.each(function() {
|
||||||
|
data_user.remove( this, key );
|
||||||
|
});
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
return jQuery;
|
||||||
|
});
|
|
@ -0,0 +1,181 @@
|
||||||
|
define([
|
||||||
|
"../core",
|
||||||
|
"../var/rnotwhite",
|
||||||
|
"./accepts"
|
||||||
|
], function( jQuery, rnotwhite ) {
|
||||||
|
|
||||||
|
function Data() {
|
||||||
|
// Support: Android < 4,
|
||||||
|
// Old WebKit does not have Object.preventExtensions/freeze method,
|
||||||
|
// return new empty object instead with no [[set]] accessor
|
||||||
|
Object.defineProperty( this.cache = {}, 0, {
|
||||||
|
get: function() {
|
||||||
|
return {};
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
this.expando = jQuery.expando + Math.random();
|
||||||
|
}
|
||||||
|
|
||||||
|
Data.uid = 1;
|
||||||
|
Data.accepts = jQuery.acceptData;
|
||||||
|
|
||||||
|
Data.prototype = {
|
||||||
|
key: function( owner ) {
|
||||||
|
// We can accept data for non-element nodes in modern browsers,
|
||||||
|
// but we should not, see #8335.
|
||||||
|
// Always return the key for a frozen object.
|
||||||
|
if ( !Data.accepts( owner ) ) {
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
var descriptor = {},
|
||||||
|
// Check if the owner object already has a cache key
|
||||||
|
unlock = owner[ this.expando ];
|
||||||
|
|
||||||
|
// If not, create one
|
||||||
|
if ( !unlock ) {
|
||||||
|
unlock = Data.uid++;
|
||||||
|
|
||||||
|
// Secure it in a non-enumerable, non-writable property
|
||||||
|
try {
|
||||||
|
descriptor[ this.expando ] = { value: unlock };
|
||||||
|
Object.defineProperties( owner, descriptor );
|
||||||
|
|
||||||
|
// Support: Android < 4
|
||||||
|
// Fallback to a less secure definition
|
||||||
|
} catch ( e ) {
|
||||||
|
descriptor[ this.expando ] = unlock;
|
||||||
|
jQuery.extend( owner, descriptor );
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Ensure the cache object
|
||||||
|
if ( !this.cache[ unlock ] ) {
|
||||||
|
this.cache[ unlock ] = {};
|
||||||
|
}
|
||||||
|
|
||||||
|
return unlock;
|
||||||
|
},
|
||||||
|
set: function( owner, data, value ) {
|
||||||
|
var prop,
|
||||||
|
// There may be an unlock assigned to this node,
|
||||||
|
// if there is no entry for this "owner", create one inline
|
||||||
|
// and set the unlock as though an owner entry had always existed
|
||||||
|
unlock = this.key( owner ),
|
||||||
|
cache = this.cache[ unlock ];
|
||||||
|
|
||||||
|
// Handle: [ owner, key, value ] args
|
||||||
|
if ( typeof data === "string" ) {
|
||||||
|
cache[ data ] = value;
|
||||||
|
|
||||||
|
// Handle: [ owner, { properties } ] args
|
||||||
|
} else {
|
||||||
|
// Fresh assignments by object are shallow copied
|
||||||
|
if ( jQuery.isEmptyObject( cache ) ) {
|
||||||
|
jQuery.extend( this.cache[ unlock ], data );
|
||||||
|
// Otherwise, copy the properties one-by-one to the cache object
|
||||||
|
} else {
|
||||||
|
for ( prop in data ) {
|
||||||
|
cache[ prop ] = data[ prop ];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return cache;
|
||||||
|
},
|
||||||
|
get: function( owner, key ) {
|
||||||
|
// Either a valid cache is found, or will be created.
|
||||||
|
// New caches will be created and the unlock returned,
|
||||||
|
// allowing direct access to the newly created
|
||||||
|
// empty data object. A valid owner object must be provided.
|
||||||
|
var cache = this.cache[ this.key( owner ) ];
|
||||||
|
|
||||||
|
return key === undefined ?
|
||||||
|
cache : cache[ key ];
|
||||||
|
},
|
||||||
|
access: function( owner, key, value ) {
|
||||||
|
var stored;
|
||||||
|
// In cases where either:
|
||||||
|
//
|
||||||
|
// 1. No key was specified
|
||||||
|
// 2. A string key was specified, but no value provided
|
||||||
|
//
|
||||||
|
// Take the "read" path and allow the get method to determine
|
||||||
|
// which value to return, respectively either:
|
||||||
|
//
|
||||||
|
// 1. The entire cache object
|
||||||
|
// 2. The data stored at the key
|
||||||
|
//
|
||||||
|
if ( key === undefined ||
|
||||||
|
((key && typeof key === "string") && value === undefined) ) {
|
||||||
|
|
||||||
|
stored = this.get( owner, key );
|
||||||
|
|
||||||
|
return stored !== undefined ?
|
||||||
|
stored : this.get( owner, jQuery.camelCase(key) );
|
||||||
|
}
|
||||||
|
|
||||||
|
// [*]When the key is not a string, or both a key and value
|
||||||
|
// are specified, set or extend (existing objects) with either:
|
||||||
|
//
|
||||||
|
// 1. An object of properties
|
||||||
|
// 2. A key and value
|
||||||
|
//
|
||||||
|
this.set( owner, key, value );
|
||||||
|
|
||||||
|
// Since the "set" path can have two possible entry points
|
||||||
|
// return the expected data based on which path was taken[*]
|
||||||
|
return value !== undefined ? value : key;
|
||||||
|
},
|
||||||
|
remove: function( owner, key ) {
|
||||||
|
var i, name, camel,
|
||||||
|
unlock = this.key( owner ),
|
||||||
|
cache = this.cache[ unlock ];
|
||||||
|
|
||||||
|
if ( key === undefined ) {
|
||||||
|
this.cache[ unlock ] = {};
|
||||||
|
|
||||||
|
} else {
|
||||||
|
// Support array or space separated string of keys
|
||||||
|
if ( jQuery.isArray( key ) ) {
|
||||||
|
// If "name" is an array of keys...
|
||||||
|
// When data is initially created, via ("key", "val") signature,
|
||||||
|
// keys will be converted to camelCase.
|
||||||
|
// Since there is no way to tell _how_ a key was added, remove
|
||||||
|
// both plain key and camelCase key. #12786
|
||||||
|
// This will only penalize the array argument path.
|
||||||
|
name = key.concat( key.map( jQuery.camelCase ) );
|
||||||
|
} else {
|
||||||
|
camel = jQuery.camelCase( key );
|
||||||
|
// Try the string as a key before any manipulation
|
||||||
|
if ( key in cache ) {
|
||||||
|
name = [ key, camel ];
|
||||||
|
} else {
|
||||||
|
// If a key with the spaces exists, use it.
|
||||||
|
// Otherwise, create an array by matching non-whitespace
|
||||||
|
name = camel;
|
||||||
|
name = name in cache ?
|
||||||
|
[ name ] : ( name.match( rnotwhite ) || [] );
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
i = name.length;
|
||||||
|
while ( i-- ) {
|
||||||
|
delete cache[ name[ i ] ];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
hasData: function( owner ) {
|
||||||
|
return !jQuery.isEmptyObject(
|
||||||
|
this.cache[ owner[ this.expando ] ] || {}
|
||||||
|
);
|
||||||
|
},
|
||||||
|
discard: function( owner ) {
|
||||||
|
if ( owner[ this.expando ] ) {
|
||||||
|
delete this.cache[ owner[ this.expando ] ];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
return Data;
|
||||||
|
});
|
|
@ -0,0 +1,20 @@
|
||||||
|
define([
|
||||||
|
"../core"
|
||||||
|
], function( jQuery ) {
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Determines whether an object can have data
|
||||||
|
*/
|
||||||
|
jQuery.acceptData = function( owner ) {
|
||||||
|
// Accepts only:
|
||||||
|
// - Node
|
||||||
|
// - Node.ELEMENT_NODE
|
||||||
|
// - Node.DOCUMENT_NODE
|
||||||
|
// - Object
|
||||||
|
// - Any
|
||||||
|
/* jshint -W018 */
|
||||||
|
return owner.nodeType === 1 || owner.nodeType === 9 || !( +owner.nodeType );
|
||||||
|
};
|
||||||
|
|
||||||
|
return jQuery.acceptData;
|
||||||
|
});
|
|
@ -0,0 +1,5 @@
|
||||||
|
define([
|
||||||
|
"../Data"
|
||||||
|
], function( Data ) {
|
||||||
|
return new Data();
|
||||||
|
});
|
|
@ -0,0 +1,5 @@
|
||||||
|
define([
|
||||||
|
"../Data"
|
||||||
|
], function( Data ) {
|
||||||
|
return new Data();
|
||||||
|
});
|
|
@ -0,0 +1,149 @@
|
||||||
|
define([
|
||||||
|
"./core",
|
||||||
|
"./var/slice",
|
||||||
|
"./callbacks"
|
||||||
|
], function( jQuery, slice ) {
|
||||||
|
|
||||||
|
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 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[ tuple[ 0 ] + "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 = 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 ? 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();
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
return jQuery;
|
||||||
|
});
|
|
@ -0,0 +1,13 @@
|
||||||
|
define([
|
||||||
|
"./core",
|
||||||
|
"./traversing"
|
||||||
|
], function( jQuery ) {
|
||||||
|
|
||||||
|
// The number of elements contained in the matched element set
|
||||||
|
jQuery.fn.size = function() {
|
||||||
|
return this.length;
|
||||||
|
};
|
||||||
|
|
||||||
|
jQuery.fn.andSelf = jQuery.fn.addBack;
|
||||||
|
|
||||||
|
});
|
|
@ -0,0 +1,50 @@
|
||||||
|
define([
|
||||||
|
"./core",
|
||||||
|
"./core/access",
|
||||||
|
"./css"
|
||||||
|
], function( jQuery, access ) {
|
||||||
|
|
||||||
|
// Create innerHeight, innerWidth, height, width, outerHeight and outerWidth methods
|
||||||
|
jQuery.each( { Height: "height", Width: "width" }, function( name, type ) {
|
||||||
|
jQuery.each( { padding: "inner" + name, content: type, "": "outer" + name }, function( defaultExtra, funcName ) {
|
||||||
|
// margin is only for outerHeight, outerWidth
|
||||||
|
jQuery.fn[ funcName ] = function( margin, value ) {
|
||||||
|
var chainable = arguments.length && ( defaultExtra || typeof margin !== "boolean" ),
|
||||||
|
extra = defaultExtra || ( margin === true || value === true ? "margin" : "border" );
|
||||||
|
|
||||||
|
return access( this, function( elem, type, value ) {
|
||||||
|
var doc;
|
||||||
|
|
||||||
|
if ( jQuery.isWindow( elem ) ) {
|
||||||
|
// As of 5/8/2012 this will yield incorrect results for Mobile Safari, but there
|
||||||
|
// isn't a whole lot we can do. See pull request at this URL for discussion:
|
||||||
|
// https://github.com/jquery/jquery/pull/764
|
||||||
|
return elem.document.documentElement[ "client" + name ];
|
||||||
|
}
|
||||||
|
|
||||||
|
// Get document width or height
|
||||||
|
if ( elem.nodeType === 9 ) {
|
||||||
|
doc = elem.documentElement;
|
||||||
|
|
||||||
|
// Either scroll[Width/Height] or offset[Width/Height] or client[Width/Height],
|
||||||
|
// whichever is greatest
|
||||||
|
return Math.max(
|
||||||
|
elem.body[ "scroll" + name ], doc[ "scroll" + name ],
|
||||||
|
elem.body[ "offset" + name ], doc[ "offset" + name ],
|
||||||
|
doc[ "client" + name ]
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
return value === undefined ?
|
||||||
|
// Get width or height on the element, requesting but not forcing parseFloat
|
||||||
|
jQuery.css( elem, type, extra ) :
|
||||||
|
|
||||||
|
// Set width or height on the element
|
||||||
|
jQuery.style( elem, type, value, extra );
|
||||||
|
}, type, chainable ? margin : undefined, chainable, null );
|
||||||
|
};
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
return jQuery;
|
||||||
|
});
|
|
@ -0,0 +1,649 @@
|
||||||
|
define([
|
||||||
|
"./core",
|
||||||
|
"./var/pnum",
|
||||||
|
"./css/var/cssExpand",
|
||||||
|
"./css/var/isHidden",
|
||||||
|
"./css/defaultDisplay",
|
||||||
|
"./data/var/data_priv",
|
||||||
|
|
||||||
|
"./core/init",
|
||||||
|
"./effects/Tween",
|
||||||
|
"./queue",
|
||||||
|
"./css",
|
||||||
|
"./deferred",
|
||||||
|
"./traversing"
|
||||||
|
], function( jQuery, pnum, cssExpand, isHidden, defaultDisplay, data_priv ) {
|
||||||
|
|
||||||
|
var
|
||||||
|
fxNow, timerId,
|
||||||
|
rfxtypes = /^(?:toggle|show|hide)$/,
|
||||||
|
rfxnum = new RegExp( "^(?:([+-])=|)(" + pnum + ")([a-z%]*)$", "i" ),
|
||||||
|
rrun = /queueHooks$/,
|
||||||
|
animationPrefilters = [ defaultPrefilter ],
|
||||||
|
tweeners = {
|
||||||
|
"*": [ function( prop, value ) {
|
||||||
|
var tween = this.createTween( prop, value ),
|
||||||
|
target = tween.cur(),
|
||||||
|
parts = rfxnum.exec( value ),
|
||||||
|
unit = parts && parts[ 3 ] || ( jQuery.cssNumber[ prop ] ? "" : "px" ),
|
||||||
|
|
||||||
|
// Starting value computation is required for potential unit mismatches
|
||||||
|
start = ( jQuery.cssNumber[ prop ] || unit !== "px" && +target ) &&
|
||||||
|
rfxnum.exec( jQuery.css( tween.elem, prop ) ),
|
||||||
|
scale = 1,
|
||||||
|
maxIterations = 20;
|
||||||
|
|
||||||
|
if ( start && start[ 3 ] !== unit ) {
|
||||||
|
// Trust units reported by jQuery.css
|
||||||
|
unit = unit || start[ 3 ];
|
||||||
|
|
||||||
|
// Make sure we update the tween properties later on
|
||||||
|
parts = parts || [];
|
||||||
|
|
||||||
|
// Iteratively approximate from a nonzero starting point
|
||||||
|
start = +target || 1;
|
||||||
|
|
||||||
|
do {
|
||||||
|
// If previous iteration zeroed out, double until we get *something*
|
||||||
|
// Use a string for doubling factor so we don't accidentally see scale as unchanged below
|
||||||
|
scale = scale || ".5";
|
||||||
|
|
||||||
|
// Adjust and apply
|
||||||
|
start = start / scale;
|
||||||
|
jQuery.style( tween.elem, prop, start + unit );
|
||||||
|
|
||||||
|
// Update scale, tolerating zero or NaN from tween.cur()
|
||||||
|
// And breaking the loop if scale is unchanged or perfect, or if we've just had enough
|
||||||
|
} while ( scale !== (scale = tween.cur() / target) && scale !== 1 && --maxIterations );
|
||||||
|
}
|
||||||
|
|
||||||
|
// Update tween properties
|
||||||
|
if ( parts ) {
|
||||||
|
start = tween.start = +start || +target || 0;
|
||||||
|
tween.unit = unit;
|
||||||
|
// If a +=/-= token was provided, we're doing a relative animation
|
||||||
|
tween.end = parts[ 1 ] ?
|
||||||
|
start + ( parts[ 1 ] + 1 ) * parts[ 2 ] :
|
||||||
|
+parts[ 2 ];
|
||||||
|
}
|
||||||
|
|
||||||
|
return tween;
|
||||||
|
} ]
|
||||||
|
};
|
||||||
|
|
||||||
|
// Animations created synchronously will run synchronously
|
||||||
|
function createFxNow() {
|
||||||
|
setTimeout(function() {
|
||||||
|
fxNow = undefined;
|
||||||
|
});
|
||||||
|
return ( fxNow = jQuery.now() );
|
||||||
|
}
|
||||||
|
|
||||||
|
// Generate parameters to create a standard animation
|
||||||
|
function genFx( type, includeWidth ) {
|
||||||
|
var which,
|
||||||
|
i = 0,
|
||||||
|
attrs = { height: type };
|
||||||
|
|
||||||
|
// if we include width, step value is 1 to do all cssExpand values,
|
||||||
|
// if we don't include width, step value is 2 to skip over Left and Right
|
||||||
|
includeWidth = includeWidth ? 1 : 0;
|
||||||
|
for ( ; i < 4 ; i += 2 - includeWidth ) {
|
||||||
|
which = cssExpand[ i ];
|
||||||
|
attrs[ "margin" + which ] = attrs[ "padding" + which ] = type;
|
||||||
|
}
|
||||||
|
|
||||||
|
if ( includeWidth ) {
|
||||||
|
attrs.opacity = attrs.width = type;
|
||||||
|
}
|
||||||
|
|
||||||
|
return attrs;
|
||||||
|
}
|
||||||
|
|
||||||
|
function createTween( value, prop, animation ) {
|
||||||
|
var tween,
|
||||||
|
collection = ( tweeners[ prop ] || [] ).concat( tweeners[ "*" ] ),
|
||||||
|
index = 0,
|
||||||
|
length = collection.length;
|
||||||
|
for ( ; index < length; index++ ) {
|
||||||
|
if ( (tween = collection[ index ].call( animation, prop, value )) ) {
|
||||||
|
|
||||||
|
// we're done with this property
|
||||||
|
return tween;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
function defaultPrefilter( elem, props, opts ) {
|
||||||
|
/* jshint validthis: true */
|
||||||
|
var prop, value, toggle, tween, hooks, oldfire, display, checkDisplay,
|
||||||
|
anim = this,
|
||||||
|
orig = {},
|
||||||
|
style = elem.style,
|
||||||
|
hidden = elem.nodeType && isHidden( elem ),
|
||||||
|
dataShow = data_priv.get( elem, "fxshow" );
|
||||||
|
|
||||||
|
// handle queue: false promises
|
||||||
|
if ( !opts.queue ) {
|
||||||
|
hooks = jQuery._queueHooks( elem, "fx" );
|
||||||
|
if ( hooks.unqueued == null ) {
|
||||||
|
hooks.unqueued = 0;
|
||||||
|
oldfire = hooks.empty.fire;
|
||||||
|
hooks.empty.fire = function() {
|
||||||
|
if ( !hooks.unqueued ) {
|
||||||
|
oldfire();
|
||||||
|
}
|
||||||
|
};
|
||||||
|
}
|
||||||
|
hooks.unqueued++;
|
||||||
|
|
||||||
|
anim.always(function() {
|
||||||
|
// doing this makes sure that the complete handler will be called
|
||||||
|
// before this completes
|
||||||
|
anim.always(function() {
|
||||||
|
hooks.unqueued--;
|
||||||
|
if ( !jQuery.queue( elem, "fx" ).length ) {
|
||||||
|
hooks.empty.fire();
|
||||||
|
}
|
||||||
|
});
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
// height/width overflow pass
|
||||||
|
if ( elem.nodeType === 1 && ( "height" in props || "width" in props ) ) {
|
||||||
|
// Make sure that nothing sneaks out
|
||||||
|
// Record all 3 overflow attributes because IE9-10 do not
|
||||||
|
// change the overflow attribute when overflowX and
|
||||||
|
// overflowY are set to the same value
|
||||||
|
opts.overflow = [ style.overflow, style.overflowX, style.overflowY ];
|
||||||
|
|
||||||
|
// Set display property to inline-block for height/width
|
||||||
|
// animations on inline elements that are having width/height animated
|
||||||
|
display = jQuery.css( elem, "display" );
|
||||||
|
|
||||||
|
// Test default display if display is currently "none"
|
||||||
|
checkDisplay = display === "none" ?
|
||||||
|
data_priv.get( elem, "olddisplay" ) || defaultDisplay( elem.nodeName ) : display;
|
||||||
|
|
||||||
|
if ( checkDisplay === "inline" && jQuery.css( elem, "float" ) === "none" ) {
|
||||||
|
style.display = "inline-block";
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if ( opts.overflow ) {
|
||||||
|
style.overflow = "hidden";
|
||||||
|
anim.always(function() {
|
||||||
|
style.overflow = opts.overflow[ 0 ];
|
||||||
|
style.overflowX = opts.overflow[ 1 ];
|
||||||
|
style.overflowY = opts.overflow[ 2 ];
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
// show/hide pass
|
||||||
|
for ( prop in props ) {
|
||||||
|
value = props[ prop ];
|
||||||
|
if ( rfxtypes.exec( value ) ) {
|
||||||
|
delete props[ prop ];
|
||||||
|
toggle = toggle || value === "toggle";
|
||||||
|
if ( value === ( hidden ? "hide" : "show" ) ) {
|
||||||
|
|
||||||
|
// If there is dataShow left over from a stopped hide or show and we are going to proceed with show, we should pretend to be hidden
|
||||||
|
if ( value === "show" && dataShow && dataShow[ prop ] !== undefined ) {
|
||||||
|
hidden = true;
|
||||||
|
} else {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
orig[ prop ] = dataShow && dataShow[ prop ] || jQuery.style( elem, prop );
|
||||||
|
|
||||||
|
// Any non-fx value stops us from restoring the original display value
|
||||||
|
} else {
|
||||||
|
display = undefined;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if ( !jQuery.isEmptyObject( orig ) ) {
|
||||||
|
if ( dataShow ) {
|
||||||
|
if ( "hidden" in dataShow ) {
|
||||||
|
hidden = dataShow.hidden;
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
dataShow = data_priv.access( elem, "fxshow", {} );
|
||||||
|
}
|
||||||
|
|
||||||
|
// store state if its toggle - enables .stop().toggle() to "reverse"
|
||||||
|
if ( toggle ) {
|
||||||
|
dataShow.hidden = !hidden;
|
||||||
|
}
|
||||||
|
if ( hidden ) {
|
||||||
|
jQuery( elem ).show();
|
||||||
|
} else {
|
||||||
|
anim.done(function() {
|
||||||
|
jQuery( elem ).hide();
|
||||||
|
});
|
||||||
|
}
|
||||||
|
anim.done(function() {
|
||||||
|
var prop;
|
||||||
|
|
||||||
|
data_priv.remove( elem, "fxshow" );
|
||||||
|
for ( prop in orig ) {
|
||||||
|
jQuery.style( elem, prop, orig[ prop ] );
|
||||||
|
}
|
||||||
|
});
|
||||||
|
for ( prop in orig ) {
|
||||||
|
tween = createTween( hidden ? dataShow[ prop ] : 0, prop, anim );
|
||||||
|
|
||||||
|
if ( !( prop in dataShow ) ) {
|
||||||
|
dataShow[ prop ] = tween.start;
|
||||||
|
if ( hidden ) {
|
||||||
|
tween.end = tween.start;
|
||||||
|
tween.start = prop === "width" || prop === "height" ? 1 : 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// If this is a noop like .hide().hide(), restore an overwritten display value
|
||||||
|
} else if ( (display === "none" ? defaultDisplay( elem.nodeName ) : display) === "inline" ) {
|
||||||
|
style.display = display;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
function propFilter( props, specialEasing ) {
|
||||||
|
var index, name, easing, value, hooks;
|
||||||
|
|
||||||
|
// camelCase, specialEasing and expand cssHook pass
|
||||||
|
for ( index in props ) {
|
||||||
|
name = jQuery.camelCase( index );
|
||||||
|
easing = specialEasing[ name ];
|
||||||
|
value = props[ index ];
|
||||||
|
if ( jQuery.isArray( value ) ) {
|
||||||
|
easing = value[ 1 ];
|
||||||
|
value = props[ index ] = value[ 0 ];
|
||||||
|
}
|
||||||
|
|
||||||
|
if ( index !== name ) {
|
||||||
|
props[ name ] = value;
|
||||||
|
delete props[ index ];
|
||||||
|
}
|
||||||
|
|
||||||
|
hooks = jQuery.cssHooks[ name ];
|
||||||
|
if ( hooks && "expand" in hooks ) {
|
||||||
|
value = hooks.expand( value );
|
||||||
|
delete props[ name ];
|
||||||
|
|
||||||
|
// not quite $.extend, this wont overwrite keys already present.
|
||||||
|
// also - reusing 'index' from above because we have the correct "name"
|
||||||
|
for ( index in value ) {
|
||||||
|
if ( !( index in props ) ) {
|
||||||
|
props[ index ] = value[ index ];
|
||||||
|
specialEasing[ index ] = easing;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
specialEasing[ name ] = easing;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
function Animation( elem, properties, options ) {
|
||||||
|
var result,
|
||||||
|
stopped,
|
||||||
|
index = 0,
|
||||||
|
length = animationPrefilters.length,
|
||||||
|
deferred = jQuery.Deferred().always( function() {
|
||||||
|
// don't match elem in the :animated selector
|
||||||
|
delete tick.elem;
|
||||||
|
}),
|
||||||
|
tick = function() {
|
||||||
|
if ( stopped ) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
var currentTime = fxNow || createFxNow(),
|
||||||
|
remaining = Math.max( 0, animation.startTime + animation.duration - currentTime ),
|
||||||
|
// archaic crash bug won't allow us to use 1 - ( 0.5 || 0 ) (#12497)
|
||||||
|
temp = remaining / animation.duration || 0,
|
||||||
|
percent = 1 - temp,
|
||||||
|
index = 0,
|
||||||
|
length = animation.tweens.length;
|
||||||
|
|
||||||
|
for ( ; index < length ; index++ ) {
|
||||||
|
animation.tweens[ index ].run( percent );
|
||||||
|
}
|
||||||
|
|
||||||
|
deferred.notifyWith( elem, [ animation, percent, remaining ]);
|
||||||
|
|
||||||
|
if ( percent < 1 && length ) {
|
||||||
|
return remaining;
|
||||||
|
} else {
|
||||||
|
deferred.resolveWith( elem, [ animation ] );
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
},
|
||||||
|
animation = deferred.promise({
|
||||||
|
elem: elem,
|
||||||
|
props: jQuery.extend( {}, properties ),
|
||||||
|
opts: jQuery.extend( true, { specialEasing: {} }, options ),
|
||||||
|
originalProperties: properties,
|
||||||
|
originalOptions: options,
|
||||||
|
startTime: fxNow || createFxNow(),
|
||||||
|
duration: options.duration,
|
||||||
|
tweens: [],
|
||||||
|
createTween: function( prop, end ) {
|
||||||
|
var tween = jQuery.Tween( elem, animation.opts, prop, end,
|
||||||
|
animation.opts.specialEasing[ prop ] || animation.opts.easing );
|
||||||
|
animation.tweens.push( tween );
|
||||||
|
return tween;
|
||||||
|
},
|
||||||
|
stop: function( gotoEnd ) {
|
||||||
|
var index = 0,
|
||||||
|
// if we are going to the end, we want to run all the tweens
|
||||||
|
// otherwise we skip this part
|
||||||
|
length = gotoEnd ? animation.tweens.length : 0;
|
||||||
|
if ( stopped ) {
|
||||||
|
return this;
|
||||||
|
}
|
||||||
|
stopped = true;
|
||||||
|
for ( ; index < length ; index++ ) {
|
||||||
|
animation.tweens[ index ].run( 1 );
|
||||||
|
}
|
||||||
|
|
||||||
|
// resolve when we played the last frame
|
||||||
|
// otherwise, reject
|
||||||
|
if ( gotoEnd ) {
|
||||||
|
deferred.resolveWith( elem, [ animation, gotoEnd ] );
|
||||||
|
} else {
|
||||||
|
deferred.rejectWith( elem, [ animation, gotoEnd ] );
|
||||||
|
}
|
||||||
|
return this;
|
||||||
|
}
|
||||||
|
}),
|
||||||
|
props = animation.props;
|
||||||
|
|
||||||
|
propFilter( props, animation.opts.specialEasing );
|
||||||
|
|
||||||
|
for ( ; index < length ; index++ ) {
|
||||||
|
result = animationPrefilters[ index ].call( animation, elem, props, animation.opts );
|
||||||
|
if ( result ) {
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
jQuery.map( props, createTween, animation );
|
||||||
|
|
||||||
|
if ( jQuery.isFunction( animation.opts.start ) ) {
|
||||||
|
animation.opts.start.call( elem, animation );
|
||||||
|
}
|
||||||
|
|
||||||
|
jQuery.fx.timer(
|
||||||
|
jQuery.extend( tick, {
|
||||||
|
elem: elem,
|
||||||
|
anim: animation,
|
||||||
|
queue: animation.opts.queue
|
||||||
|
})
|
||||||
|
);
|
||||||
|
|
||||||
|
// attach callbacks from options
|
||||||
|
return animation.progress( animation.opts.progress )
|
||||||
|
.done( animation.opts.done, animation.opts.complete )
|
||||||
|
.fail( animation.opts.fail )
|
||||||
|
.always( animation.opts.always );
|
||||||
|
}
|
||||||
|
|
||||||
|
jQuery.Animation = jQuery.extend( Animation, {
|
||||||
|
|
||||||
|
tweener: function( props, callback ) {
|
||||||
|
if ( jQuery.isFunction( props ) ) {
|
||||||
|
callback = props;
|
||||||
|
props = [ "*" ];
|
||||||
|
} else {
|
||||||
|
props = props.split(" ");
|
||||||
|
}
|
||||||
|
|
||||||
|
var prop,
|
||||||
|
index = 0,
|
||||||
|
length = props.length;
|
||||||
|
|
||||||
|
for ( ; index < length ; index++ ) {
|
||||||
|
prop = props[ index ];
|
||||||
|
tweeners[ prop ] = tweeners[ prop ] || [];
|
||||||
|
tweeners[ prop ].unshift( callback );
|
||||||
|
}
|
||||||
|
},
|
||||||
|
|
||||||
|
prefilter: function( callback, prepend ) {
|
||||||
|
if ( prepend ) {
|
||||||
|
animationPrefilters.unshift( callback );
|
||||||
|
} else {
|
||||||
|
animationPrefilters.push( callback );
|
||||||
|
}
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
jQuery.speed = function( speed, easing, fn ) {
|
||||||
|
var opt = speed && typeof speed === "object" ? jQuery.extend( {}, speed ) : {
|
||||||
|
complete: fn || !fn && easing ||
|
||||||
|
jQuery.isFunction( speed ) && speed,
|
||||||
|
duration: speed,
|
||||||
|
easing: fn && easing || easing && !jQuery.isFunction( easing ) && easing
|
||||||
|
};
|
||||||
|
|
||||||
|
opt.duration = jQuery.fx.off ? 0 : typeof opt.duration === "number" ? opt.duration :
|
||||||
|
opt.duration in jQuery.fx.speeds ? jQuery.fx.speeds[ opt.duration ] : jQuery.fx.speeds._default;
|
||||||
|
|
||||||
|
// normalize opt.queue - true/undefined/null -> "fx"
|
||||||
|
if ( opt.queue == null || opt.queue === true ) {
|
||||||
|
opt.queue = "fx";
|
||||||
|
}
|
||||||
|
|
||||||
|
// Queueing
|
||||||
|
opt.old = opt.complete;
|
||||||
|
|
||||||
|
opt.complete = function() {
|
||||||
|
if ( jQuery.isFunction( opt.old ) ) {
|
||||||
|
opt.old.call( this );
|
||||||
|
}
|
||||||
|
|
||||||
|
if ( opt.queue ) {
|
||||||
|
jQuery.dequeue( this, opt.queue );
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
return opt;
|
||||||
|
};
|
||||||
|
|
||||||
|
jQuery.fn.extend({
|
||||||
|
fadeTo: function( speed, to, easing, callback ) {
|
||||||
|
|
||||||
|
// show any hidden elements after setting opacity to 0
|
||||||
|
return this.filter( isHidden ).css( "opacity", 0 ).show()
|
||||||
|
|
||||||
|
// animate to the value specified
|
||||||
|
.end().animate({ opacity: to }, speed, easing, callback );
|
||||||
|
},
|
||||||
|
animate: function( prop, speed, easing, callback ) {
|
||||||
|
var empty = jQuery.isEmptyObject( prop ),
|
||||||
|
optall = jQuery.speed( speed, easing, callback ),
|
||||||
|
doAnimation = function() {
|
||||||
|
// Operate on a copy of prop so per-property easing won't be lost
|
||||||
|
var anim = Animation( this, jQuery.extend( {}, prop ), optall );
|
||||||
|
|
||||||
|
// Empty animations, or finishing resolves immediately
|
||||||
|
if ( empty || data_priv.get( this, "finish" ) ) {
|
||||||
|
anim.stop( true );
|
||||||
|
}
|
||||||
|
};
|
||||||
|
doAnimation.finish = doAnimation;
|
||||||
|
|
||||||
|
return empty || optall.queue === false ?
|
||||||
|
this.each( doAnimation ) :
|
||||||
|
this.queue( optall.queue, doAnimation );
|
||||||
|
},
|
||||||
|
stop: function( type, clearQueue, gotoEnd ) {
|
||||||
|
var stopQueue = function( hooks ) {
|
||||||
|
var stop = hooks.stop;
|
||||||
|
delete hooks.stop;
|
||||||
|
stop( gotoEnd );
|
||||||
|
};
|
||||||
|
|
||||||
|
if ( typeof type !== "string" ) {
|
||||||
|
gotoEnd = clearQueue;
|
||||||
|
clearQueue = type;
|
||||||
|
type = undefined;
|
||||||
|
}
|
||||||
|
if ( clearQueue && type !== false ) {
|
||||||
|
this.queue( type || "fx", [] );
|
||||||
|
}
|
||||||
|
|
||||||
|
return this.each(function() {
|
||||||
|
var dequeue = true,
|
||||||
|
index = type != null && type + "queueHooks",
|
||||||
|
timers = jQuery.timers,
|
||||||
|
data = data_priv.get( this );
|
||||||
|
|
||||||
|
if ( index ) {
|
||||||
|
if ( data[ index ] && data[ index ].stop ) {
|
||||||
|
stopQueue( data[ index ] );
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
for ( index in data ) {
|
||||||
|
if ( data[ index ] && data[ index ].stop && rrun.test( index ) ) {
|
||||||
|
stopQueue( data[ index ] );
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
for ( index = timers.length; index--; ) {
|
||||||
|
if ( timers[ index ].elem === this && (type == null || timers[ index ].queue === type) ) {
|
||||||
|
timers[ index ].anim.stop( gotoEnd );
|
||||||
|
dequeue = false;
|
||||||
|
timers.splice( index, 1 );
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// start the next in the queue if the last step wasn't forced
|
||||||
|
// timers currently will call their complete callbacks, which will dequeue
|
||||||
|
// but only if they were gotoEnd
|
||||||
|
if ( dequeue || !gotoEnd ) {
|
||||||
|
jQuery.dequeue( this, type );
|
||||||
|
}
|
||||||
|
});
|
||||||
|
},
|
||||||
|
finish: function( type ) {
|
||||||
|
if ( type !== false ) {
|
||||||
|
type = type || "fx";
|
||||||
|
}
|
||||||
|
return this.each(function() {
|
||||||
|
var index,
|
||||||
|
data = data_priv.get( this ),
|
||||||
|
queue = data[ type + "queue" ],
|
||||||
|
hooks = data[ type + "queueHooks" ],
|
||||||
|
timers = jQuery.timers,
|
||||||
|
length = queue ? queue.length : 0;
|
||||||
|
|
||||||
|
// enable finishing flag on private data
|
||||||
|
data.finish = true;
|
||||||
|
|
||||||
|
// empty the queue first
|
||||||
|
jQuery.queue( this, type, [] );
|
||||||
|
|
||||||
|
if ( hooks && hooks.stop ) {
|
||||||
|
hooks.stop.call( this, true );
|
||||||
|
}
|
||||||
|
|
||||||
|
// look for any active animations, and finish them
|
||||||
|
for ( index = timers.length; index--; ) {
|
||||||
|
if ( timers[ index ].elem === this && timers[ index ].queue === type ) {
|
||||||
|
timers[ index ].anim.stop( true );
|
||||||
|
timers.splice( index, 1 );
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// look for any animations in the old queue and finish them
|
||||||
|
for ( index = 0; index < length; index++ ) {
|
||||||
|
if ( queue[ index ] && queue[ index ].finish ) {
|
||||||
|
queue[ index ].finish.call( this );
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// turn off finishing flag
|
||||||
|
delete data.finish;
|
||||||
|
});
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
jQuery.each([ "toggle", "show", "hide" ], function( i, name ) {
|
||||||
|
var cssFn = jQuery.fn[ name ];
|
||||||
|
jQuery.fn[ name ] = function( speed, easing, callback ) {
|
||||||
|
return speed == null || typeof speed === "boolean" ?
|
||||||
|
cssFn.apply( this, arguments ) :
|
||||||
|
this.animate( genFx( name, true ), speed, easing, callback );
|
||||||
|
};
|
||||||
|
});
|
||||||
|
|
||||||
|
// Generate shortcuts for custom animations
|
||||||
|
jQuery.each({
|
||||||
|
slideDown: genFx("show"),
|
||||||
|
slideUp: genFx("hide"),
|
||||||
|
slideToggle: genFx("toggle"),
|
||||||
|
fadeIn: { opacity: "show" },
|
||||||
|
fadeOut: { opacity: "hide" },
|
||||||
|
fadeToggle: { opacity: "toggle" }
|
||||||
|
}, function( name, props ) {
|
||||||
|
jQuery.fn[ name ] = function( speed, easing, callback ) {
|
||||||
|
return this.animate( props, speed, easing, callback );
|
||||||
|
};
|
||||||
|
});
|
||||||
|
|
||||||
|
jQuery.timers = [];
|
||||||
|
jQuery.fx.tick = function() {
|
||||||
|
var timer,
|
||||||
|
i = 0,
|
||||||
|
timers = jQuery.timers;
|
||||||
|
|
||||||
|
fxNow = jQuery.now();
|
||||||
|
|
||||||
|
for ( ; i < timers.length; i++ ) {
|
||||||
|
timer = timers[ i ];
|
||||||
|
// Checks the timer has not already been removed
|
||||||
|
if ( !timer() && timers[ i ] === timer ) {
|
||||||
|
timers.splice( i--, 1 );
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if ( !timers.length ) {
|
||||||
|
jQuery.fx.stop();
|
||||||
|
}
|
||||||
|
fxNow = undefined;
|
||||||
|
};
|
||||||
|
|
||||||
|
jQuery.fx.timer = function( timer ) {
|
||||||
|
jQuery.timers.push( timer );
|
||||||
|
if ( timer() ) {
|
||||||
|
jQuery.fx.start();
|
||||||
|
} else {
|
||||||
|
jQuery.timers.pop();
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
jQuery.fx.interval = 13;
|
||||||
|
|
||||||
|
jQuery.fx.start = function() {
|
||||||
|
if ( !timerId ) {
|
||||||
|
timerId = setInterval( jQuery.fx.tick, jQuery.fx.interval );
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
jQuery.fx.stop = function() {
|
||||||
|
clearInterval( timerId );
|
||||||
|
timerId = null;
|
||||||
|
};
|
||||||
|
|
||||||
|
jQuery.fx.speeds = {
|
||||||
|
slow: 600,
|
||||||
|
fast: 200,
|
||||||
|
// Default speed
|
||||||
|
_default: 400
|
||||||
|
};
|
||||||
|
|
||||||
|
return jQuery;
|
||||||
|
});
|
|
@ -0,0 +1,114 @@
|
||||||
|
define([
|
||||||
|
"../core",
|
||||||
|
"../css"
|
||||||
|
], function( jQuery ) {
|
||||||
|
|
||||||
|
function Tween( elem, options, prop, end, easing ) {
|
||||||
|
return new Tween.prototype.init( elem, options, prop, end, easing );
|
||||||
|
}
|
||||||
|
jQuery.Tween = Tween;
|
||||||
|
|
||||||
|
Tween.prototype = {
|
||||||
|
constructor: Tween,
|
||||||
|
init: function( elem, options, prop, end, easing, unit ) {
|
||||||
|
this.elem = elem;
|
||||||
|
this.prop = prop;
|
||||||
|
this.easing = easing || "swing";
|
||||||
|
this.options = options;
|
||||||
|
this.start = this.now = this.cur();
|
||||||
|
this.end = end;
|
||||||
|
this.unit = unit || ( jQuery.cssNumber[ prop ] ? "" : "px" );
|
||||||
|
},
|
||||||
|
cur: function() {
|
||||||
|
var hooks = Tween.propHooks[ this.prop ];
|
||||||
|
|
||||||
|
return hooks && hooks.get ?
|
||||||
|
hooks.get( this ) :
|
||||||
|
Tween.propHooks._default.get( this );
|
||||||
|
},
|
||||||
|
run: function( percent ) {
|
||||||
|
var eased,
|
||||||
|
hooks = Tween.propHooks[ this.prop ];
|
||||||
|
|
||||||
|
if ( this.options.duration ) {
|
||||||
|
this.pos = eased = jQuery.easing[ this.easing ](
|
||||||
|
percent, this.options.duration * percent, 0, 1, this.options.duration
|
||||||
|
);
|
||||||
|
} else {
|
||||||
|
this.pos = eased = percent;
|
||||||
|
}
|
||||||
|
this.now = ( this.end - this.start ) * eased + this.start;
|
||||||
|
|
||||||
|
if ( this.options.step ) {
|
||||||
|
this.options.step.call( this.elem, this.now, this );
|
||||||
|
}
|
||||||
|
|
||||||
|
if ( hooks && hooks.set ) {
|
||||||
|
hooks.set( this );
|
||||||
|
} else {
|
||||||
|
Tween.propHooks._default.set( this );
|
||||||
|
}
|
||||||
|
return this;
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
Tween.prototype.init.prototype = Tween.prototype;
|
||||||
|
|
||||||
|
Tween.propHooks = {
|
||||||
|
_default: {
|
||||||
|
get: function( tween ) {
|
||||||
|
var result;
|
||||||
|
|
||||||
|
if ( tween.elem[ tween.prop ] != null &&
|
||||||
|
(!tween.elem.style || tween.elem.style[ tween.prop ] == null) ) {
|
||||||
|
return tween.elem[ tween.prop ];
|
||||||
|
}
|
||||||
|
|
||||||
|
// passing an empty string as a 3rd parameter to .css will automatically
|
||||||
|
// attempt a parseFloat and fallback to a string if the parse fails
|
||||||
|
// so, simple values such as "10px" are parsed to Float.
|
||||||
|
// complex values such as "rotate(1rad)" are returned as is.
|
||||||
|
result = jQuery.css( tween.elem, tween.prop, "" );
|
||||||
|
// Empty strings, null, undefined and "auto" are converted to 0.
|
||||||
|
return !result || result === "auto" ? 0 : result;
|
||||||
|
},
|
||||||
|
set: function( tween ) {
|
||||||
|
// use step hook for back compat - use cssHook if its there - use .style if its
|
||||||
|
// available and use plain properties where available
|
||||||
|
if ( jQuery.fx.step[ tween.prop ] ) {
|
||||||
|
jQuery.fx.step[ tween.prop ]( tween );
|
||||||
|
} else if ( tween.elem.style && ( tween.elem.style[ jQuery.cssProps[ tween.prop ] ] != null || jQuery.cssHooks[ tween.prop ] ) ) {
|
||||||
|
jQuery.style( tween.elem, tween.prop, tween.now + tween.unit );
|
||||||
|
} else {
|
||||||
|
tween.elem[ tween.prop ] = tween.now;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
// Support: IE9
|
||||||
|
// Panic based approach to setting things on disconnected nodes
|
||||||
|
|
||||||
|
Tween.propHooks.scrollTop = Tween.propHooks.scrollLeft = {
|
||||||
|
set: function( tween ) {
|
||||||
|
if ( tween.elem.nodeType && tween.elem.parentNode ) {
|
||||||
|
tween.elem[ tween.prop ] = tween.now;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
jQuery.easing = {
|
||||||
|
linear: function( p ) {
|
||||||
|
return p;
|
||||||
|
},
|
||||||
|
swing: function( p ) {
|
||||||
|
return 0.5 - Math.cos( p * Math.PI ) / 2;
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
jQuery.fx = Tween.prototype.init;
|
||||||
|
|
||||||
|
// Back Compat <1.8 extension point
|
||||||
|
jQuery.fx.step = {};
|
||||||
|
|
||||||
|
});
|
|
@ -0,0 +1,13 @@
|
||||||
|
define([
|
||||||
|
"../core",
|
||||||
|
"../selector",
|
||||||
|
"../effects"
|
||||||
|
], function( jQuery ) {
|
||||||
|
|
||||||
|
jQuery.expr.filters.animated = function( elem ) {
|
||||||
|
return jQuery.grep(jQuery.timers, function( fn ) {
|
||||||
|
return elem === fn.elem;
|
||||||
|
}).length;
|
||||||
|
};
|
||||||
|
|
||||||
|
});
|
|
@ -0,0 +1,868 @@
|
||||||
|
define([
|
||||||
|
"./core",
|
||||||
|
"./var/strundefined",
|
||||||
|
"./var/rnotwhite",
|
||||||
|
"./var/hasOwn",
|
||||||
|
"./var/slice",
|
||||||
|
"./event/support",
|
||||||
|
"./data/var/data_priv",
|
||||||
|
|
||||||
|
"./core/init",
|
||||||
|
"./data/accepts",
|
||||||
|
"./selector"
|
||||||
|
], function( jQuery, strundefined, rnotwhite, hasOwn, slice, support, data_priv ) {
|
||||||
|
|
||||||
|
var
|
||||||
|
rkeyEvent = /^key/,
|
||||||
|
rmouseEvent = /^(?:mouse|pointer|contextmenu)|click/,
|
||||||
|
rfocusMorph = /^(?:focusinfocus|focusoutblur)$/,
|
||||||
|
rtypenamespace = /^([^.]*)(?:\.(.+)|)$/;
|
||||||
|
|
||||||
|
function returnTrue() {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
function returnFalse() {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
function safeActiveElement() {
|
||||||
|
try {
|
||||||
|
return document.activeElement;
|
||||||
|
} catch ( err ) { }
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Helper functions for managing events -- not part of the public interface.
|
||||||
|
* Props to Dean Edwards' addEvent library for many of the ideas.
|
||||||
|
*/
|
||||||
|
jQuery.event = {
|
||||||
|
|
||||||
|
global: {},
|
||||||
|
|
||||||
|
add: function( elem, types, handler, data, selector ) {
|
||||||
|
|
||||||
|
var handleObjIn, eventHandle, tmp,
|
||||||
|
events, t, handleObj,
|
||||||
|
special, handlers, type, namespaces, origType,
|
||||||
|
elemData = data_priv.get( elem );
|
||||||
|
|
||||||
|
// Don't attach events to noData or text/comment nodes (but allow plain objects)
|
||||||
|
if ( !elemData ) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Caller can pass in an object of custom data in lieu of the handler
|
||||||
|
if ( handler.handler ) {
|
||||||
|
handleObjIn = handler;
|
||||||
|
handler = handleObjIn.handler;
|
||||||
|
selector = handleObjIn.selector;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Make sure that the handler has a unique ID, used to find/remove it later
|
||||||
|
if ( !handler.guid ) {
|
||||||
|
handler.guid = jQuery.guid++;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Init the element's event structure and main handler, if this is the first
|
||||||
|
if ( !(events = elemData.events) ) {
|
||||||
|
events = elemData.events = {};
|
||||||
|
}
|
||||||
|
if ( !(eventHandle = elemData.handle) ) {
|
||||||
|
eventHandle = elemData.handle = function( e ) {
|
||||||
|
// Discard the second event of a jQuery.event.trigger() and
|
||||||
|
// when an event is called after a page has unloaded
|
||||||
|
return typeof jQuery !== strundefined && jQuery.event.triggered !== e.type ?
|
||||||
|
jQuery.event.dispatch.apply( elem, arguments ) : undefined;
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
// Handle multiple events separated by a space
|
||||||
|
types = ( types || "" ).match( rnotwhite ) || [ "" ];
|
||||||
|
t = types.length;
|
||||||
|
while ( t-- ) {
|
||||||
|
tmp = rtypenamespace.exec( types[t] ) || [];
|
||||||
|
type = origType = tmp[1];
|
||||||
|
namespaces = ( tmp[2] || "" ).split( "." ).sort();
|
||||||
|
|
||||||
|
// There *must* be a type, no attaching namespace-only handlers
|
||||||
|
if ( !type ) {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
// If event changes its type, use the special event handlers for the changed type
|
||||||
|
special = jQuery.event.special[ type ] || {};
|
||||||
|
|
||||||
|
// If selector defined, determine special event api type, otherwise given type
|
||||||
|
type = ( selector ? special.delegateType : special.bindType ) || type;
|
||||||
|
|
||||||
|
// Update special based on newly reset type
|
||||||
|
special = jQuery.event.special[ type ] || {};
|
||||||
|
|
||||||
|
// handleObj is passed to all event handlers
|
||||||
|
handleObj = jQuery.extend({
|
||||||
|
type: type,
|
||||||
|
origType: origType,
|
||||||
|
data: data,
|
||||||
|
handler: handler,
|
||||||
|
guid: handler.guid,
|
||||||
|
selector: selector,
|
||||||
|
needsContext: selector && jQuery.expr.match.needsContext.test( selector ),
|
||||||
|
namespace: namespaces.join(".")
|
||||||
|
}, handleObjIn );
|
||||||
|
|
||||||
|
// Init the event handler queue if we're the first
|
||||||
|
if ( !(handlers = events[ type ]) ) {
|
||||||
|
handlers = events[ type ] = [];
|
||||||
|
handlers.delegateCount = 0;
|
||||||
|
|
||||||
|
// Only use addEventListener if the special events handler returns false
|
||||||
|
if ( !special.setup || special.setup.call( elem, data, namespaces, eventHandle ) === false ) {
|
||||||
|
if ( elem.addEventListener ) {
|
||||||
|
elem.addEventListener( type, eventHandle, false );
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if ( special.add ) {
|
||||||
|
special.add.call( elem, handleObj );
|
||||||
|
|
||||||
|
if ( !handleObj.handler.guid ) {
|
||||||
|
handleObj.handler.guid = handler.guid;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Add to the element's handler list, delegates in front
|
||||||
|
if ( selector ) {
|
||||||
|
handlers.splice( handlers.delegateCount++, 0, handleObj );
|
||||||
|
} else {
|
||||||
|
handlers.push( handleObj );
|
||||||
|
}
|
||||||
|
|
||||||
|
// Keep track of which events have ever been used, for event optimization
|
||||||
|
jQuery.event.global[ type ] = true;
|
||||||
|
}
|
||||||
|
|
||||||
|
},
|
||||||
|
|
||||||
|
// Detach an event or set of events from an element
|
||||||
|
remove: function( elem, types, handler, selector, mappedTypes ) {
|
||||||
|
|
||||||
|
var j, origCount, tmp,
|
||||||
|
events, t, handleObj,
|
||||||
|
special, handlers, type, namespaces, origType,
|
||||||
|
elemData = data_priv.hasData( elem ) && data_priv.get( elem );
|
||||||
|
|
||||||
|
if ( !elemData || !(events = elemData.events) ) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Once for each type.namespace in types; type may be omitted
|
||||||
|
types = ( types || "" ).match( rnotwhite ) || [ "" ];
|
||||||
|
t = types.length;
|
||||||
|
while ( t-- ) {
|
||||||
|
tmp = rtypenamespace.exec( types[t] ) || [];
|
||||||
|
type = origType = tmp[1];
|
||||||
|
namespaces = ( tmp[2] || "" ).split( "." ).sort();
|
||||||
|
|
||||||
|
// Unbind all events (on this namespace, if provided) for the element
|
||||||
|
if ( !type ) {
|
||||||
|
for ( type in events ) {
|
||||||
|
jQuery.event.remove( elem, type + types[ t ], handler, selector, true );
|
||||||
|
}
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
special = jQuery.event.special[ type ] || {};
|
||||||
|
type = ( selector ? special.delegateType : special.bindType ) || type;
|
||||||
|
handlers = events[ type ] || [];
|
||||||
|
tmp = tmp[2] && new RegExp( "(^|\\.)" + namespaces.join("\\.(?:.*\\.|)") + "(\\.|$)" );
|
||||||
|
|
||||||
|
// Remove matching events
|
||||||
|
origCount = j = handlers.length;
|
||||||
|
while ( j-- ) {
|
||||||
|
handleObj = handlers[ j ];
|
||||||
|
|
||||||
|
if ( ( mappedTypes || origType === handleObj.origType ) &&
|
||||||
|
( !handler || handler.guid === handleObj.guid ) &&
|
||||||
|
( !tmp || tmp.test( handleObj.namespace ) ) &&
|
||||||
|
( !selector || selector === handleObj.selector || selector === "**" && handleObj.selector ) ) {
|
||||||
|
handlers.splice( j, 1 );
|
||||||
|
|
||||||
|
if ( handleObj.selector ) {
|
||||||
|
handlers.delegateCount--;
|
||||||
|
}
|
||||||
|
if ( special.remove ) {
|
||||||
|
special.remove.call( elem, handleObj );
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Remove generic event handler if we removed something and no more handlers exist
|
||||||
|
// (avoids potential for endless recursion during removal of special event handlers)
|
||||||
|
if ( origCount && !handlers.length ) {
|
||||||
|
if ( !special.teardown || special.teardown.call( elem, namespaces, elemData.handle ) === false ) {
|
||||||
|
jQuery.removeEvent( elem, type, elemData.handle );
|
||||||
|
}
|
||||||
|
|
||||||
|
delete events[ type ];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Remove the expando if it's no longer used
|
||||||
|
if ( jQuery.isEmptyObject( events ) ) {
|
||||||
|
delete elemData.handle;
|
||||||
|
data_priv.remove( elem, "events" );
|
||||||
|
}
|
||||||
|
},
|
||||||
|
|
||||||
|
trigger: function( event, data, elem, onlyHandlers ) {
|
||||||
|
|
||||||
|
var i, cur, tmp, bubbleType, ontype, handle, special,
|
||||||
|
eventPath = [ elem || document ],
|
||||||
|
type = hasOwn.call( event, "type" ) ? event.type : event,
|
||||||
|
namespaces = hasOwn.call( event, "namespace" ) ? event.namespace.split(".") : [];
|
||||||
|
|
||||||
|
cur = tmp = elem = elem || document;
|
||||||
|
|
||||||
|
// Don't do events on text and comment nodes
|
||||||
|
if ( elem.nodeType === 3 || elem.nodeType === 8 ) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
// focus/blur morphs to focusin/out; ensure we're not firing them right now
|
||||||
|
if ( rfocusMorph.test( type + jQuery.event.triggered ) ) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
if ( type.indexOf(".") >= 0 ) {
|
||||||
|
// Namespaced trigger; create a regexp to match event type in handle()
|
||||||
|
namespaces = type.split(".");
|
||||||
|
type = namespaces.shift();
|
||||||
|
namespaces.sort();
|
||||||
|
}
|
||||||
|
ontype = type.indexOf(":") < 0 && "on" + type;
|
||||||
|
|
||||||
|
// Caller can pass in a jQuery.Event object, Object, or just an event type string
|
||||||
|
event = event[ jQuery.expando ] ?
|
||||||
|
event :
|
||||||
|
new jQuery.Event( type, typeof event === "object" && event );
|
||||||
|
|
||||||
|
// Trigger bitmask: & 1 for native handlers; & 2 for jQuery (always true)
|
||||||
|
event.isTrigger = onlyHandlers ? 2 : 3;
|
||||||
|
event.namespace = namespaces.join(".");
|
||||||
|
event.namespace_re = event.namespace ?
|
||||||
|
new RegExp( "(^|\\.)" + namespaces.join("\\.(?:.*\\.|)") + "(\\.|$)" ) :
|
||||||
|
null;
|
||||||
|
|
||||||
|
// Clean up the event in case it is being reused
|
||||||
|
event.result = undefined;
|
||||||
|
if ( !event.target ) {
|
||||||
|
event.target = elem;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Clone any incoming data and prepend the event, creating the handler arg list
|
||||||
|
data = data == null ?
|
||||||
|
[ event ] :
|
||||||
|
jQuery.makeArray( data, [ event ] );
|
||||||
|
|
||||||
|
// Allow special events to draw outside the lines
|
||||||
|
special = jQuery.event.special[ type ] || {};
|
||||||
|
if ( !onlyHandlers && special.trigger && special.trigger.apply( elem, data ) === false ) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Determine event propagation path in advance, per W3C events spec (#9951)
|
||||||
|
// Bubble up to document, then to window; watch for a global ownerDocument var (#9724)
|
||||||
|
if ( !onlyHandlers && !special.noBubble && !jQuery.isWindow( elem ) ) {
|
||||||
|
|
||||||
|
bubbleType = special.delegateType || type;
|
||||||
|
if ( !rfocusMorph.test( bubbleType + type ) ) {
|
||||||
|
cur = cur.parentNode;
|
||||||
|
}
|
||||||
|
for ( ; cur; cur = cur.parentNode ) {
|
||||||
|
eventPath.push( cur );
|
||||||
|
tmp = cur;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Only add window if we got to document (e.g., not plain obj or detached DOM)
|
||||||
|
if ( tmp === (elem.ownerDocument || document) ) {
|
||||||
|
eventPath.push( tmp.defaultView || tmp.parentWindow || window );
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Fire handlers on the event path
|
||||||
|
i = 0;
|
||||||
|
while ( (cur = eventPath[i++]) && !event.isPropagationStopped() ) {
|
||||||
|
|
||||||
|
event.type = i > 1 ?
|
||||||
|
bubbleType :
|
||||||
|
special.bindType || type;
|
||||||
|
|
||||||
|
// jQuery handler
|
||||||
|
handle = ( data_priv.get( cur, "events" ) || {} )[ event.type ] && data_priv.get( cur, "handle" );
|
||||||
|
if ( handle ) {
|
||||||
|
handle.apply( cur, data );
|
||||||
|
}
|
||||||
|
|
||||||
|
// Native handler
|
||||||
|
handle = ontype && cur[ ontype ];
|
||||||
|
if ( handle && handle.apply && jQuery.acceptData( cur ) ) {
|
||||||
|
event.result = handle.apply( cur, data );
|
||||||
|
if ( event.result === false ) {
|
||||||
|
event.preventDefault();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
event.type = type;
|
||||||
|
|
||||||
|
// If nobody prevented the default action, do it now
|
||||||
|
if ( !onlyHandlers && !event.isDefaultPrevented() ) {
|
||||||
|
|
||||||
|
if ( (!special._default || special._default.apply( eventPath.pop(), data ) === false) &&
|
||||||
|
jQuery.acceptData( elem ) ) {
|
||||||
|
|
||||||
|
// Call a native DOM method on the target with the same name name as the event.
|
||||||
|
// Don't do default actions on window, that's where global variables be (#6170)
|
||||||
|
if ( ontype && jQuery.isFunction( elem[ type ] ) && !jQuery.isWindow( elem ) ) {
|
||||||
|
|
||||||
|
// Don't re-trigger an onFOO event when we call its FOO() method
|
||||||
|
tmp = elem[ ontype ];
|
||||||
|
|
||||||
|
if ( tmp ) {
|
||||||
|
elem[ ontype ] = null;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Prevent re-triggering of the same event, since we already bubbled it above
|
||||||
|
jQuery.event.triggered = type;
|
||||||
|
elem[ type ]();
|
||||||
|
jQuery.event.triggered = undefined;
|
||||||
|
|
||||||
|
if ( tmp ) {
|
||||||
|
elem[ ontype ] = tmp;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return event.result;
|
||||||
|
},
|
||||||
|
|
||||||
|
dispatch: function( event ) {
|
||||||
|
|
||||||
|
// Make a writable jQuery.Event from the native event object
|
||||||
|
event = jQuery.event.fix( event );
|
||||||
|
|
||||||
|
var i, j, ret, matched, handleObj,
|
||||||
|
handlerQueue = [],
|
||||||
|
args = slice.call( arguments ),
|
||||||
|
handlers = ( data_priv.get( this, "events" ) || {} )[ event.type ] || [],
|
||||||
|
special = jQuery.event.special[ event.type ] || {};
|
||||||
|
|
||||||
|
// Use the fix-ed jQuery.Event rather than the (read-only) native event
|
||||||
|
args[0] = event;
|
||||||
|
event.delegateTarget = this;
|
||||||
|
|
||||||
|
// Call the preDispatch hook for the mapped type, and let it bail if desired
|
||||||
|
if ( special.preDispatch && special.preDispatch.call( this, event ) === false ) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Determine handlers
|
||||||
|
handlerQueue = jQuery.event.handlers.call( this, event, handlers );
|
||||||
|
|
||||||
|
// Run delegates first; they may want to stop propagation beneath us
|
||||||
|
i = 0;
|
||||||
|
while ( (matched = handlerQueue[ i++ ]) && !event.isPropagationStopped() ) {
|
||||||
|
event.currentTarget = matched.elem;
|
||||||
|
|
||||||
|
j = 0;
|
||||||
|
while ( (handleObj = matched.handlers[ j++ ]) && !event.isImmediatePropagationStopped() ) {
|
||||||
|
|
||||||
|
// Triggered event must either 1) have no namespace, or
|
||||||
|
// 2) have namespace(s) a subset or equal to those in the bound event (both can have no namespace).
|
||||||
|
if ( !event.namespace_re || event.namespace_re.test( handleObj.namespace ) ) {
|
||||||
|
|
||||||
|
event.handleObj = handleObj;
|
||||||
|
event.data = handleObj.data;
|
||||||
|
|
||||||
|
ret = ( (jQuery.event.special[ handleObj.origType ] || {}).handle || handleObj.handler )
|
||||||
|
.apply( matched.elem, args );
|
||||||
|
|
||||||
|
if ( ret !== undefined ) {
|
||||||
|
if ( (event.result = ret) === false ) {
|
||||||
|
event.preventDefault();
|
||||||
|
event.stopPropagation();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Call the postDispatch hook for the mapped type
|
||||||
|
if ( special.postDispatch ) {
|
||||||
|
special.postDispatch.call( this, event );
|
||||||
|
}
|
||||||
|
|
||||||
|
return event.result;
|
||||||
|
},
|
||||||
|
|
||||||
|
handlers: function( event, handlers ) {
|
||||||
|
var i, matches, sel, handleObj,
|
||||||
|
handlerQueue = [],
|
||||||
|
delegateCount = handlers.delegateCount,
|
||||||
|
cur = event.target;
|
||||||
|
|
||||||
|
// Find delegate handlers
|
||||||
|
// Black-hole SVG <use> instance trees (#13180)
|
||||||
|
// Avoid non-left-click bubbling in Firefox (#3861)
|
||||||
|
if ( delegateCount && cur.nodeType && (!event.button || event.type !== "click") ) {
|
||||||
|
|
||||||
|
for ( ; cur !== this; cur = cur.parentNode || this ) {
|
||||||
|
|
||||||
|
// Don't process clicks on disabled elements (#6911, #8165, #11382, #11764)
|
||||||
|
if ( cur.disabled !== true || event.type !== "click" ) {
|
||||||
|
matches = [];
|
||||||
|
for ( i = 0; i < delegateCount; i++ ) {
|
||||||
|
handleObj = handlers[ i ];
|
||||||
|
|
||||||
|
// Don't conflict with Object.prototype properties (#13203)
|
||||||
|
sel = handleObj.selector + " ";
|
||||||
|
|
||||||
|
if ( matches[ sel ] === undefined ) {
|
||||||
|
matches[ sel ] = handleObj.needsContext ?
|
||||||
|
jQuery( sel, this ).index( cur ) >= 0 :
|
||||||
|
jQuery.find( sel, this, null, [ cur ] ).length;
|
||||||
|
}
|
||||||
|
if ( matches[ sel ] ) {
|
||||||
|
matches.push( handleObj );
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if ( matches.length ) {
|
||||||
|
handlerQueue.push({ elem: cur, handlers: matches });
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Add the remaining (directly-bound) handlers
|
||||||
|
if ( delegateCount < handlers.length ) {
|
||||||
|
handlerQueue.push({ elem: this, handlers: handlers.slice( delegateCount ) });
|
||||||
|
}
|
||||||
|
|
||||||
|
return handlerQueue;
|
||||||
|
},
|
||||||
|
|
||||||
|
// Includes some event props shared by KeyEvent and MouseEvent
|
||||||
|
props: "altKey bubbles cancelable ctrlKey currentTarget eventPhase metaKey relatedTarget shiftKey target timeStamp view which".split(" "),
|
||||||
|
|
||||||
|
fixHooks: {},
|
||||||
|
|
||||||
|
keyHooks: {
|
||||||
|
props: "char charCode key keyCode".split(" "),
|
||||||
|
filter: function( event, original ) {
|
||||||
|
|
||||||
|
// Add which for key events
|
||||||
|
if ( event.which == null ) {
|
||||||
|
event.which = original.charCode != null ? original.charCode : original.keyCode;
|
||||||
|
}
|
||||||
|
|
||||||
|
return event;
|
||||||
|
}
|
||||||
|
},
|
||||||
|
|
||||||
|
mouseHooks: {
|
||||||
|
props: "button buttons clientX clientY offsetX offsetY pageX pageY screenX screenY toElement".split(" "),
|
||||||
|
filter: function( event, original ) {
|
||||||
|
var eventDoc, doc, body,
|
||||||
|
button = original.button;
|
||||||
|
|
||||||
|
// Calculate pageX/Y if missing and clientX/Y available
|
||||||
|
if ( event.pageX == null && original.clientX != null ) {
|
||||||
|
eventDoc = event.target.ownerDocument || document;
|
||||||
|
doc = eventDoc.documentElement;
|
||||||
|
body = eventDoc.body;
|
||||||
|
|
||||||
|
event.pageX = original.clientX + ( doc && doc.scrollLeft || body && body.scrollLeft || 0 ) - ( doc && doc.clientLeft || body && body.clientLeft || 0 );
|
||||||
|
event.pageY = original.clientY + ( doc && doc.scrollTop || body && body.scrollTop || 0 ) - ( doc && doc.clientTop || body && body.clientTop || 0 );
|
||||||
|
}
|
||||||
|
|
||||||
|
// Add which for click: 1 === left; 2 === middle; 3 === right
|
||||||
|
// Note: button is not normalized, so don't use it
|
||||||
|
if ( !event.which && button !== undefined ) {
|
||||||
|
event.which = ( button & 1 ? 1 : ( button & 2 ? 3 : ( button & 4 ? 2 : 0 ) ) );
|
||||||
|
}
|
||||||
|
|
||||||
|
return event;
|
||||||
|
}
|
||||||
|
},
|
||||||
|
|
||||||
|
fix: function( event ) {
|
||||||
|
if ( event[ jQuery.expando ] ) {
|
||||||
|
return event;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Create a writable copy of the event object and normalize some properties
|
||||||
|
var i, prop, copy,
|
||||||
|
type = event.type,
|
||||||
|
originalEvent = event,
|
||||||
|
fixHook = this.fixHooks[ type ];
|
||||||
|
|
||||||
|
if ( !fixHook ) {
|
||||||
|
this.fixHooks[ type ] = fixHook =
|
||||||
|
rmouseEvent.test( type ) ? this.mouseHooks :
|
||||||
|
rkeyEvent.test( type ) ? this.keyHooks :
|
||||||
|
{};
|
||||||
|
}
|
||||||
|
copy = fixHook.props ? this.props.concat( fixHook.props ) : this.props;
|
||||||
|
|
||||||
|
event = new jQuery.Event( originalEvent );
|
||||||
|
|
||||||
|
i = copy.length;
|
||||||
|
while ( i-- ) {
|
||||||
|
prop = copy[ i ];
|
||||||
|
event[ prop ] = originalEvent[ prop ];
|
||||||
|
}
|
||||||
|
|
||||||
|
// Support: Cordova 2.5 (WebKit) (#13255)
|
||||||
|
// All events should have a target; Cordova deviceready doesn't
|
||||||
|
if ( !event.target ) {
|
||||||
|
event.target = document;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Support: Safari 6.0+, Chrome < 28
|
||||||
|
// Target should not be a text node (#504, #13143)
|
||||||
|
if ( event.target.nodeType === 3 ) {
|
||||||
|
event.target = event.target.parentNode;
|
||||||
|
}
|
||||||
|
|
||||||
|
return fixHook.filter ? fixHook.filter( event, originalEvent ) : event;
|
||||||
|
},
|
||||||
|
|
||||||
|
special: {
|
||||||
|
load: {
|
||||||
|
// Prevent triggered image.load events from bubbling to window.load
|
||||||
|
noBubble: true
|
||||||
|
},
|
||||||
|
focus: {
|
||||||
|
// Fire native event if possible so blur/focus sequence is correct
|
||||||
|
trigger: function() {
|
||||||
|
if ( this !== safeActiveElement() && this.focus ) {
|
||||||
|
this.focus();
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
},
|
||||||
|
delegateType: "focusin"
|
||||||
|
},
|
||||||
|
blur: {
|
||||||
|
trigger: function() {
|
||||||
|
if ( this === safeActiveElement() && this.blur ) {
|
||||||
|
this.blur();
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
},
|
||||||
|
delegateType: "focusout"
|
||||||
|
},
|
||||||
|
click: {
|
||||||
|
// For checkbox, fire native event so checked state will be right
|
||||||
|
trigger: function() {
|
||||||
|
if ( this.type === "checkbox" && this.click && jQuery.nodeName( this, "input" ) ) {
|
||||||
|
this.click();
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
},
|
||||||
|
|
||||||
|
// For cross-browser consistency, don't fire native .click() on links
|
||||||
|
_default: function( event ) {
|
||||||
|
return jQuery.nodeName( event.target, "a" );
|
||||||
|
}
|
||||||
|
},
|
||||||
|
|
||||||
|
beforeunload: {
|
||||||
|
postDispatch: function( event ) {
|
||||||
|
|
||||||
|
// Support: Firefox 20+
|
||||||
|
// Firefox doesn't alert if the returnValue field is not set.
|
||||||
|
if ( event.result !== undefined && event.originalEvent ) {
|
||||||
|
event.originalEvent.returnValue = event.result;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
|
||||||
|
simulate: function( type, elem, event, bubble ) {
|
||||||
|
// Piggyback on a donor event to simulate a different one.
|
||||||
|
// Fake originalEvent to avoid donor's stopPropagation, but if the
|
||||||
|
// simulated event prevents default then we do the same on the donor.
|
||||||
|
var e = jQuery.extend(
|
||||||
|
new jQuery.Event(),
|
||||||
|
event,
|
||||||
|
{
|
||||||
|
type: type,
|
||||||
|
isSimulated: true,
|
||||||
|
originalEvent: {}
|
||||||
|
}
|
||||||
|
);
|
||||||
|
if ( bubble ) {
|
||||||
|
jQuery.event.trigger( e, null, elem );
|
||||||
|
} else {
|
||||||
|
jQuery.event.dispatch.call( elem, e );
|
||||||
|
}
|
||||||
|
if ( e.isDefaultPrevented() ) {
|
||||||
|
event.preventDefault();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
jQuery.removeEvent = function( elem, type, handle ) {
|
||||||
|
if ( elem.removeEventListener ) {
|
||||||
|
elem.removeEventListener( type, handle, false );
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
jQuery.Event = function( src, props ) {
|
||||||
|
// Allow instantiation without the 'new' keyword
|
||||||
|
if ( !(this instanceof jQuery.Event) ) {
|
||||||
|
return new jQuery.Event( src, props );
|
||||||
|
}
|
||||||
|
|
||||||
|
// Event object
|
||||||
|
if ( src && src.type ) {
|
||||||
|
this.originalEvent = src;
|
||||||
|
this.type = src.type;
|
||||||
|
|
||||||
|
// Events bubbling up the document may have been marked as prevented
|
||||||
|
// by a handler lower down the tree; reflect the correct value.
|
||||||
|
this.isDefaultPrevented = src.defaultPrevented ||
|
||||||
|
src.defaultPrevented === undefined &&
|
||||||
|
// Support: Android < 4.0
|
||||||
|
src.returnValue === false ?
|
||||||
|
returnTrue :
|
||||||
|
returnFalse;
|
||||||
|
|
||||||
|
// Event type
|
||||||
|
} else {
|
||||||
|
this.type = src;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Put explicitly provided properties onto the event object
|
||||||
|
if ( props ) {
|
||||||
|
jQuery.extend( this, props );
|
||||||
|
}
|
||||||
|
|
||||||
|
// Create a timestamp if incoming event doesn't have one
|
||||||
|
this.timeStamp = src && src.timeStamp || jQuery.now();
|
||||||
|
|
||||||
|
// Mark it as fixed
|
||||||
|
this[ jQuery.expando ] = true;
|
||||||
|
};
|
||||||
|
|
||||||
|
// jQuery.Event is based on DOM3 Events as specified by the ECMAScript Language Binding
|
||||||
|
// http://www.w3.org/TR/2003/WD-DOM-Level-3-Events-20030331/ecma-script-binding.html
|
||||||
|
jQuery.Event.prototype = {
|
||||||
|
isDefaultPrevented: returnFalse,
|
||||||
|
isPropagationStopped: returnFalse,
|
||||||
|
isImmediatePropagationStopped: returnFalse,
|
||||||
|
|
||||||
|
preventDefault: function() {
|
||||||
|
var e = this.originalEvent;
|
||||||
|
|
||||||
|
this.isDefaultPrevented = returnTrue;
|
||||||
|
|
||||||
|
if ( e && e.preventDefault ) {
|
||||||
|
e.preventDefault();
|
||||||
|
}
|
||||||
|
},
|
||||||
|
stopPropagation: function() {
|
||||||
|
var e = this.originalEvent;
|
||||||
|
|
||||||
|
this.isPropagationStopped = returnTrue;
|
||||||
|
|
||||||
|
if ( e && e.stopPropagation ) {
|
||||||
|
e.stopPropagation();
|
||||||
|
}
|
||||||
|
},
|
||||||
|
stopImmediatePropagation: function() {
|
||||||
|
var e = this.originalEvent;
|
||||||
|
|
||||||
|
this.isImmediatePropagationStopped = returnTrue;
|
||||||
|
|
||||||
|
if ( e && e.stopImmediatePropagation ) {
|
||||||
|
e.stopImmediatePropagation();
|
||||||
|
}
|
||||||
|
|
||||||
|
this.stopPropagation();
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
// Create mouseenter/leave events using mouseover/out and event-time checks
|
||||||
|
// Support: Chrome 15+
|
||||||
|
jQuery.each({
|
||||||
|
mouseenter: "mouseover",
|
||||||
|
mouseleave: "mouseout",
|
||||||
|
pointerenter: "pointerover",
|
||||||
|
pointerleave: "pointerout"
|
||||||
|
}, function( orig, fix ) {
|
||||||
|
jQuery.event.special[ orig ] = {
|
||||||
|
delegateType: fix,
|
||||||
|
bindType: fix,
|
||||||
|
|
||||||
|
handle: function( event ) {
|
||||||
|
var ret,
|
||||||
|
target = this,
|
||||||
|
related = event.relatedTarget,
|
||||||
|
handleObj = event.handleObj;
|
||||||
|
|
||||||
|
// For mousenter/leave call the handler if related is outside the target.
|
||||||
|
// NB: No relatedTarget if the mouse left/entered the browser window
|
||||||
|
if ( !related || (related !== target && !jQuery.contains( target, related )) ) {
|
||||||
|
event.type = handleObj.origType;
|
||||||
|
ret = handleObj.handler.apply( this, arguments );
|
||||||
|
event.type = fix;
|
||||||
|
}
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
};
|
||||||
|
});
|
||||||
|
|
||||||
|
// Create "bubbling" focus and blur events
|
||||||
|
// Support: Firefox, Chrome, Safari
|
||||||
|
if ( !support.focusinBubbles ) {
|
||||||
|
jQuery.each({ focus: "focusin", blur: "focusout" }, function( orig, fix ) {
|
||||||
|
|
||||||
|
// Attach a single capturing handler on the document while someone wants focusin/focusout
|
||||||
|
var handler = function( event ) {
|
||||||
|
jQuery.event.simulate( fix, event.target, jQuery.event.fix( event ), true );
|
||||||
|
};
|
||||||
|
|
||||||
|
jQuery.event.special[ fix ] = {
|
||||||
|
setup: function() {
|
||||||
|
var doc = this.ownerDocument || this,
|
||||||
|
attaches = data_priv.access( doc, fix );
|
||||||
|
|
||||||
|
if ( !attaches ) {
|
||||||
|
doc.addEventListener( orig, handler, true );
|
||||||
|
}
|
||||||
|
data_priv.access( doc, fix, ( attaches || 0 ) + 1 );
|
||||||
|
},
|
||||||
|
teardown: function() {
|
||||||
|
var doc = this.ownerDocument || this,
|
||||||
|
attaches = data_priv.access( doc, fix ) - 1;
|
||||||
|
|
||||||
|
if ( !attaches ) {
|
||||||
|
doc.removeEventListener( orig, handler, true );
|
||||||
|
data_priv.remove( doc, fix );
|
||||||
|
|
||||||
|
} else {
|
||||||
|
data_priv.access( doc, fix, attaches );
|
||||||
|
}
|
||||||
|
}
|
||||||
|
};
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
jQuery.fn.extend({
|
||||||
|
|
||||||
|
on: function( types, selector, data, fn, /*INTERNAL*/ one ) {
|
||||||
|
var origFn, type;
|
||||||
|
|
||||||
|
// Types can be a map of types/handlers
|
||||||
|
if ( typeof types === "object" ) {
|
||||||
|
// ( types-Object, selector, data )
|
||||||
|
if ( typeof selector !== "string" ) {
|
||||||
|
// ( types-Object, data )
|
||||||
|
data = data || selector;
|
||||||
|
selector = undefined;
|
||||||
|
}
|
||||||
|
for ( type in types ) {
|
||||||
|
this.on( type, selector, data, types[ type ], one );
|
||||||
|
}
|
||||||
|
return this;
|
||||||
|
}
|
||||||
|
|
||||||
|
if ( data == null && fn == null ) {
|
||||||
|
// ( types, fn )
|
||||||
|
fn = selector;
|
||||||
|
data = selector = undefined;
|
||||||
|
} else if ( fn == null ) {
|
||||||
|
if ( typeof selector === "string" ) {
|
||||||
|
// ( types, selector, fn )
|
||||||
|
fn = data;
|
||||||
|
data = undefined;
|
||||||
|
} else {
|
||||||
|
// ( types, data, fn )
|
||||||
|
fn = data;
|
||||||
|
data = selector;
|
||||||
|
selector = undefined;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if ( fn === false ) {
|
||||||
|
fn = returnFalse;
|
||||||
|
} else if ( !fn ) {
|
||||||
|
return this;
|
||||||
|
}
|
||||||
|
|
||||||
|
if ( one === 1 ) {
|
||||||
|
origFn = fn;
|
||||||
|
fn = function( event ) {
|
||||||
|
// Can use an empty set, since event contains the info
|
||||||
|
jQuery().off( event );
|
||||||
|
return origFn.apply( this, arguments );
|
||||||
|
};
|
||||||
|
// Use same guid so caller can remove using origFn
|
||||||
|
fn.guid = origFn.guid || ( origFn.guid = jQuery.guid++ );
|
||||||
|
}
|
||||||
|
return this.each( function() {
|
||||||
|
jQuery.event.add( this, types, fn, data, selector );
|
||||||
|
});
|
||||||
|
},
|
||||||
|
one: function( types, selector, data, fn ) {
|
||||||
|
return this.on( types, selector, data, fn, 1 );
|
||||||
|
},
|
||||||
|
off: function( types, selector, fn ) {
|
||||||
|
var handleObj, type;
|
||||||
|
if ( types && types.preventDefault && types.handleObj ) {
|
||||||
|
// ( event ) dispatched jQuery.Event
|
||||||
|
handleObj = types.handleObj;
|
||||||
|
jQuery( types.delegateTarget ).off(
|
||||||
|
handleObj.namespace ? handleObj.origType + "." + handleObj.namespace : handleObj.origType,
|
||||||
|
handleObj.selector,
|
||||||
|
handleObj.handler
|
||||||
|
);
|
||||||
|
return this;
|
||||||
|
}
|
||||||
|
if ( typeof types === "object" ) {
|
||||||
|
// ( types-object [, selector] )
|
||||||
|
for ( type in types ) {
|
||||||
|
this.off( type, selector, types[ type ] );
|
||||||
|
}
|
||||||
|
return this;
|
||||||
|
}
|
||||||
|
if ( selector === false || typeof selector === "function" ) {
|
||||||
|
// ( types [, fn] )
|
||||||
|
fn = selector;
|
||||||
|
selector = undefined;
|
||||||
|
}
|
||||||
|
if ( fn === false ) {
|
||||||
|
fn = returnFalse;
|
||||||
|
}
|
||||||
|
return this.each(function() {
|
||||||
|
jQuery.event.remove( this, types, fn, selector );
|
||||||
|
});
|
||||||
|
},
|
||||||
|
|
||||||
|
trigger: function( type, data ) {
|
||||||
|
return this.each(function() {
|
||||||
|
jQuery.event.trigger( type, data, this );
|
||||||
|
});
|
||||||
|
},
|
||||||
|
triggerHandler: function( type, data ) {
|
||||||
|
var elem = this[0];
|
||||||
|
if ( elem ) {
|
||||||
|
return jQuery.event.trigger( type, data, elem, true );
|
||||||
|
}
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
return jQuery;
|
||||||
|
});
|
|
@ -0,0 +1,39 @@
|
||||||
|
define([
|
||||||
|
"../core",
|
||||||
|
"../event"
|
||||||
|
], function( jQuery ) {
|
||||||
|
|
||||||
|
jQuery.each( ("blur focus focusin focusout load resize scroll unload click dblclick " +
|
||||||
|
"mousedown mouseup mousemove mouseover mouseout mouseenter mouseleave " +
|
||||||
|
"change select submit keydown keypress keyup error contextmenu").split(" "), function( i, name ) {
|
||||||
|
|
||||||
|
// Handle event binding
|
||||||
|
jQuery.fn[ name ] = function( data, fn ) {
|
||||||
|
return arguments.length > 0 ?
|
||||||
|
this.on( name, null, data, fn ) :
|
||||||
|
this.trigger( name );
|
||||||
|
};
|
||||||
|
});
|
||||||
|
|
||||||
|
jQuery.fn.extend({
|
||||||
|
hover: function( fnOver, fnOut ) {
|
||||||
|
return this.mouseenter( fnOver ).mouseleave( fnOut || fnOver );
|
||||||
|
},
|
||||||
|
|
||||||
|
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 );
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
});
|
|
@ -0,0 +1,9 @@
|
||||||
|
define([
|
||||||
|
"../var/support"
|
||||||
|
], function( support ) {
|
||||||
|
|
||||||
|
support.focusinBubbles = "onfocusin" in window;
|
||||||
|
|
||||||
|
return support;
|
||||||
|
|
||||||
|
});
|
|
@ -0,0 +1,24 @@
|
||||||
|
define([
|
||||||
|
"../core"
|
||||||
|
], function( jQuery ) {
|
||||||
|
|
||||||
|
// Register as a named AMD module, since jQuery can be concatenated with other
|
||||||
|
// files that may use define, but not via a proper concatenation script that
|
||||||
|
// understands anonymous AMD modules. A named AMD is safest and most robust
|
||||||
|
// way to register. Lowercase jquery is used because AMD module names are
|
||||||
|
// derived from file names, and jQuery is normally delivered in a lowercase
|
||||||
|
// file name. Do this after creating the global so that if an AMD module wants
|
||||||
|
// to call noConflict to hide this version of jQuery, it will work.
|
||||||
|
|
||||||
|
// Note that for maximum portability, libraries that are not jQuery should
|
||||||
|
// declare themselves as anonymous modules, and avoid setting a global if an
|
||||||
|
// AMD loader is present. jQuery is a special case. For more information, see
|
||||||
|
// https://github.com/jrburke/requirejs/wiki/Updating-existing-libraries#wiki-anon
|
||||||
|
|
||||||
|
if ( typeof define === "function" && define.amd ) {
|
||||||
|
define( "jquery", [], function() {
|
||||||
|
return jQuery;
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
});
|
|
@ -0,0 +1,32 @@
|
||||||
|
define([
|
||||||
|
"../core",
|
||||||
|
"../var/strundefined"
|
||||||
|
], function( jQuery, strundefined ) {
|
||||||
|
|
||||||
|
var
|
||||||
|
// Map over jQuery in case of overwrite
|
||||||
|
_jQuery = window.jQuery,
|
||||||
|
|
||||||
|
// Map over the $ in case of overwrite
|
||||||
|
_$ = window.$;
|
||||||
|
|
||||||
|
jQuery.noConflict = function( deep ) {
|
||||||
|
if ( window.$ === jQuery ) {
|
||||||
|
window.$ = _$;
|
||||||
|
}
|
||||||
|
|
||||||
|
if ( deep && window.jQuery === jQuery ) {
|
||||||
|
window.jQuery = _jQuery;
|
||||||
|
}
|
||||||
|
|
||||||
|
return jQuery;
|
||||||
|
};
|
||||||
|
|
||||||
|
// Expose jQuery and $ identifiers, even in
|
||||||
|
// AMD (#7102#comment:10, https://github.com/jquery/jquery/pull/557)
|
||||||
|
// and CommonJS for browser emulators (#13566)
|
||||||
|
if ( typeof noGlobal === strundefined ) {
|
||||||
|
window.jQuery = window.$ = jQuery;
|
||||||
|
}
|
||||||
|
|
||||||
|
});
|
|
@ -0,0 +1,44 @@
|
||||||
|
/*!
|
||||||
|
* jQuery JavaScript Library v@VERSION
|
||||||
|
* http://jquery.com/
|
||||||
|
*
|
||||||
|
* Includes Sizzle.js
|
||||||
|
* http://sizzlejs.com/
|
||||||
|
*
|
||||||
|
* Copyright 2005, 2014 jQuery Foundation, Inc. and other contributors
|
||||||
|
* Released under the MIT license
|
||||||
|
* http://jquery.org/license
|
||||||
|
*
|
||||||
|
* Date: @DATE
|
||||||
|
*/
|
||||||
|
|
||||||
|
(function( global, factory ) {
|
||||||
|
|
||||||
|
if ( typeof module === "object" && typeof module.exports === "object" ) {
|
||||||
|
// For CommonJS and CommonJS-like environments where a proper window is present,
|
||||||
|
// execute the factory and get jQuery
|
||||||
|
// For environments that do not inherently posses a window with a document
|
||||||
|
// (such as Node.js), expose a jQuery-making factory as module.exports
|
||||||
|
// This accentuates the need for the creation of a real window
|
||||||
|
// e.g. var jQuery = require("jquery")(window);
|
||||||
|
// See ticket #14549 for more info
|
||||||
|
module.exports = global.document ?
|
||||||
|
factory( global, true ) :
|
||||||
|
function( w ) {
|
||||||
|
if ( !w.document ) {
|
||||||
|
throw new Error( "jQuery requires a window with a document" );
|
||||||
|
}
|
||||||
|
return factory( w );
|
||||||
|
};
|
||||||
|
} else {
|
||||||
|
factory( global );
|
||||||
|
}
|
||||||
|
|
||||||
|
// Pass this if window is not defined yet
|
||||||
|
}(typeof window !== "undefined" ? window : this, function( window, noGlobal ) {
|
||||||
|
|
||||||
|
// 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";
|
|
@ -0,0 +1,36 @@
|
||||||
|
define([
|
||||||
|
"./core",
|
||||||
|
"./selector",
|
||||||
|
"./traversing",
|
||||||
|
"./callbacks",
|
||||||
|
"./deferred",
|
||||||
|
"./core/ready",
|
||||||
|
"./data",
|
||||||
|
"./queue",
|
||||||
|
"./queue/delay",
|
||||||
|
"./attributes",
|
||||||
|
"./event",
|
||||||
|
"./event/alias",
|
||||||
|
"./manipulation",
|
||||||
|
"./manipulation/_evalUrl",
|
||||||
|
"./wrap",
|
||||||
|
"./css",
|
||||||
|
"./css/hiddenVisibleSelectors",
|
||||||
|
"./serialize",
|
||||||
|
"./ajax",
|
||||||
|
"./ajax/xhr",
|
||||||
|
"./ajax/script",
|
||||||
|
"./ajax/jsonp",
|
||||||
|
"./ajax/load",
|
||||||
|
"./effects",
|
||||||
|
"./effects/animatedSelector",
|
||||||
|
"./offset",
|
||||||
|
"./dimensions",
|
||||||
|
"./deprecated",
|
||||||
|
"./exports/amd",
|
||||||
|
"./exports/global"
|
||||||
|
], function( jQuery ) {
|
||||||
|
|
||||||
|
return jQuery;
|
||||||
|
|
||||||
|
});
|
|
@ -0,0 +1,582 @@
|
||||||
|
define([
|
||||||
|
"./core",
|
||||||
|
"./var/concat",
|
||||||
|
"./var/push",
|
||||||
|
"./core/access",
|
||||||
|
"./manipulation/var/rcheckableType",
|
||||||
|
"./manipulation/support",
|
||||||
|
"./data/var/data_priv",
|
||||||
|
"./data/var/data_user",
|
||||||
|
|
||||||
|
"./core/init",
|
||||||
|
"./data/accepts",
|
||||||
|
"./traversing",
|
||||||
|
"./selector",
|
||||||
|
"./event"
|
||||||
|
], function( jQuery, concat, push, access, rcheckableType, support, data_priv, data_user ) {
|
||||||
|
|
||||||
|
var
|
||||||
|
rxhtmlTag = /<(?!area|br|col|embed|hr|img|input|link|meta|param)(([\w:]+)[^>]*)\/>/gi,
|
||||||
|
rtagName = /<([\w:]+)/,
|
||||||
|
rhtml = /<|&#?\w+;/,
|
||||||
|
rnoInnerhtml = /<(?:script|style|link)/i,
|
||||||
|
// checked="checked" or checked
|
||||||
|
rchecked = /checked\s*(?:[^=]|=\s*.checked.)/i,
|
||||||
|
rscriptType = /^$|\/(?:java|ecma)script/i,
|
||||||
|
rscriptTypeMasked = /^true\/(.*)/,
|
||||||
|
rcleanScript = /^\s*<!(?:\[CDATA\[|--)|(?:\]\]|--)>\s*$/g,
|
||||||
|
|
||||||
|
// We have to close these tags to support XHTML (#13200)
|
||||||
|
wrapMap = {
|
||||||
|
|
||||||
|
// Support: IE 9
|
||||||
|
option: [ 1, "<select multiple='multiple'>", "</select>" ],
|
||||||
|
|
||||||
|
thead: [ 1, "<table>", "</table>" ],
|
||||||
|
col: [ 2, "<table><colgroup>", "</colgroup></table>" ],
|
||||||
|
tr: [ 2, "<table><tbody>", "</tbody></table>" ],
|
||||||
|
td: [ 3, "<table><tbody><tr>", "</tr></tbody></table>" ],
|
||||||
|
|
||||||
|
_default: [ 0, "", "" ]
|
||||||
|
};
|
||||||
|
|
||||||
|
// Support: IE 9
|
||||||
|
wrapMap.optgroup = wrapMap.option;
|
||||||
|
|
||||||
|
wrapMap.tbody = wrapMap.tfoot = wrapMap.colgroup = wrapMap.caption = wrapMap.thead;
|
||||||
|
wrapMap.th = wrapMap.td;
|
||||||
|
|
||||||
|
// Support: 1.x compatibility
|
||||||
|
// Manipulating tables requires a tbody
|
||||||
|
function manipulationTarget( elem, content ) {
|
||||||
|
return jQuery.nodeName( elem, "table" ) &&
|
||||||
|
jQuery.nodeName( content.nodeType !== 11 ? content : content.firstChild, "tr" ) ?
|
||||||
|
|
||||||
|
elem.getElementsByTagName("tbody")[0] ||
|
||||||
|
elem.appendChild( elem.ownerDocument.createElement("tbody") ) :
|
||||||
|
elem;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Replace/restore the type attribute of script elements for safe DOM manipulation
|
||||||
|
function disableScript( elem ) {
|
||||||
|
elem.type = (elem.getAttribute("type") !== null) + "/" + elem.type;
|
||||||
|
return elem;
|
||||||
|
}
|
||||||
|
function restoreScript( elem ) {
|
||||||
|
var match = rscriptTypeMasked.exec( elem.type );
|
||||||
|
|
||||||
|
if ( match ) {
|
||||||
|
elem.type = match[ 1 ];
|
||||||
|
} else {
|
||||||
|
elem.removeAttribute("type");
|
||||||
|
}
|
||||||
|
|
||||||
|
return elem;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Mark scripts as having already been evaluated
|
||||||
|
function setGlobalEval( elems, refElements ) {
|
||||||
|
var i = 0,
|
||||||
|
l = elems.length;
|
||||||
|
|
||||||
|
for ( ; i < l; i++ ) {
|
||||||
|
data_priv.set(
|
||||||
|
elems[ i ], "globalEval", !refElements || data_priv.get( refElements[ i ], "globalEval" )
|
||||||
|
);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
function cloneCopyEvent( src, dest ) {
|
||||||
|
var i, l, type, pdataOld, pdataCur, udataOld, udataCur, events;
|
||||||
|
|
||||||
|
if ( dest.nodeType !== 1 ) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
// 1. Copy private data: events, handlers, etc.
|
||||||
|
if ( data_priv.hasData( src ) ) {
|
||||||
|
pdataOld = data_priv.access( src );
|
||||||
|
pdataCur = data_priv.set( dest, pdataOld );
|
||||||
|
events = pdataOld.events;
|
||||||
|
|
||||||
|
if ( events ) {
|
||||||
|
delete pdataCur.handle;
|
||||||
|
pdataCur.events = {};
|
||||||
|
|
||||||
|
for ( type in events ) {
|
||||||
|
for ( i = 0, l = events[ type ].length; i < l; i++ ) {
|
||||||
|
jQuery.event.add( dest, type, events[ type ][ i ] );
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// 2. Copy user data
|
||||||
|
if ( data_user.hasData( src ) ) {
|
||||||
|
udataOld = data_user.access( src );
|
||||||
|
udataCur = jQuery.extend( {}, udataOld );
|
||||||
|
|
||||||
|
data_user.set( dest, udataCur );
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
function getAll( context, tag ) {
|
||||||
|
var ret = context.getElementsByTagName ? context.getElementsByTagName( tag || "*" ) :
|
||||||
|
context.querySelectorAll ? context.querySelectorAll( tag || "*" ) :
|
||||||
|
[];
|
||||||
|
|
||||||
|
return tag === undefined || tag && jQuery.nodeName( context, tag ) ?
|
||||||
|
jQuery.merge( [ context ], ret ) :
|
||||||
|
ret;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Support: IE >= 9
|
||||||
|
function fixInput( src, dest ) {
|
||||||
|
var nodeName = dest.nodeName.toLowerCase();
|
||||||
|
|
||||||
|
// Fails to persist the checked state of a cloned checkbox or radio button.
|
||||||
|
if ( nodeName === "input" && rcheckableType.test( src.type ) ) {
|
||||||
|
dest.checked = src.checked;
|
||||||
|
|
||||||
|
// Fails to return the selected option to the default selected state when cloning options
|
||||||
|
} else if ( nodeName === "input" || nodeName === "textarea" ) {
|
||||||
|
dest.defaultValue = src.defaultValue;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
jQuery.extend({
|
||||||
|
clone: function( elem, dataAndEvents, deepDataAndEvents ) {
|
||||||
|
var i, l, srcElements, destElements,
|
||||||
|
clone = elem.cloneNode( true ),
|
||||||
|
inPage = jQuery.contains( elem.ownerDocument, elem );
|
||||||
|
|
||||||
|
// Support: IE >= 9
|
||||||
|
// Fix Cloning issues
|
||||||
|
if ( !support.noCloneChecked && ( elem.nodeType === 1 || elem.nodeType === 11 ) &&
|
||||||
|
!jQuery.isXMLDoc( elem ) ) {
|
||||||
|
|
||||||
|
// We eschew Sizzle here for performance reasons: http://jsperf.com/getall-vs-sizzle/2
|
||||||
|
destElements = getAll( clone );
|
||||||
|
srcElements = getAll( elem );
|
||||||
|
|
||||||
|
for ( i = 0, l = srcElements.length; i < l; i++ ) {
|
||||||
|
fixInput( srcElements[ i ], destElements[ i ] );
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Copy the events from the original to the clone
|
||||||
|
if ( dataAndEvents ) {
|
||||||
|
if ( deepDataAndEvents ) {
|
||||||
|
srcElements = srcElements || getAll( elem );
|
||||||
|
destElements = destElements || getAll( clone );
|
||||||
|
|
||||||
|
for ( i = 0, l = srcElements.length; i < l; i++ ) {
|
||||||
|
cloneCopyEvent( srcElements[ i ], destElements[ i ] );
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
cloneCopyEvent( elem, clone );
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Preserve script evaluation history
|
||||||
|
destElements = getAll( clone, "script" );
|
||||||
|
if ( destElements.length > 0 ) {
|
||||||
|
setGlobalEval( destElements, !inPage && getAll( elem, "script" ) );
|
||||||
|
}
|
||||||
|
|
||||||
|
// Return the cloned set
|
||||||
|
return clone;
|
||||||
|
},
|
||||||
|
|
||||||
|
buildFragment: function( elems, context, scripts, selection ) {
|
||||||
|
var elem, tmp, tag, wrap, contains, j,
|
||||||
|
fragment = context.createDocumentFragment(),
|
||||||
|
nodes = [],
|
||||||
|
i = 0,
|
||||||
|
l = elems.length;
|
||||||
|
|
||||||
|
for ( ; i < l; i++ ) {
|
||||||
|
elem = elems[ i ];
|
||||||
|
|
||||||
|
if ( elem || elem === 0 ) {
|
||||||
|
|
||||||
|
// Add nodes directly
|
||||||
|
if ( jQuery.type( elem ) === "object" ) {
|
||||||
|
// Support: QtWebKit
|
||||||
|
// jQuery.merge because push.apply(_, arraylike) throws
|
||||||
|
jQuery.merge( nodes, elem.nodeType ? [ elem ] : elem );
|
||||||
|
|
||||||
|
// Convert non-html into a text node
|
||||||
|
} else if ( !rhtml.test( elem ) ) {
|
||||||
|
nodes.push( context.createTextNode( elem ) );
|
||||||
|
|
||||||
|
// Convert html into DOM nodes
|
||||||
|
} else {
|
||||||
|
tmp = tmp || fragment.appendChild( context.createElement("div") );
|
||||||
|
|
||||||
|
// Deserialize a standard representation
|
||||||
|
tag = ( rtagName.exec( elem ) || [ "", "" ] )[ 1 ].toLowerCase();
|
||||||
|
wrap = wrapMap[ tag ] || wrapMap._default;
|
||||||
|
tmp.innerHTML = wrap[ 1 ] + elem.replace( rxhtmlTag, "<$1></$2>" ) + wrap[ 2 ];
|
||||||
|
|
||||||
|
// Descend through wrappers to the right content
|
||||||
|
j = wrap[ 0 ];
|
||||||
|
while ( j-- ) {
|
||||||
|
tmp = tmp.lastChild;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Support: QtWebKit
|
||||||
|
// jQuery.merge because push.apply(_, arraylike) throws
|
||||||
|
jQuery.merge( nodes, tmp.childNodes );
|
||||||
|
|
||||||
|
// Remember the top-level container
|
||||||
|
tmp = fragment.firstChild;
|
||||||
|
|
||||||
|
// Fixes #12346
|
||||||
|
// Support: Webkit, IE
|
||||||
|
tmp.textContent = "";
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Remove wrapper from fragment
|
||||||
|
fragment.textContent = "";
|
||||||
|
|
||||||
|
i = 0;
|
||||||
|
while ( (elem = nodes[ i++ ]) ) {
|
||||||
|
|
||||||
|
// #4087 - If origin and destination elements are the same, and this is
|
||||||
|
// that element, do not do anything
|
||||||
|
if ( selection && jQuery.inArray( elem, selection ) !== -1 ) {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
contains = jQuery.contains( elem.ownerDocument, elem );
|
||||||
|
|
||||||
|
// Append to fragment
|
||||||
|
tmp = getAll( fragment.appendChild( elem ), "script" );
|
||||||
|
|
||||||
|
// Preserve script evaluation history
|
||||||
|
if ( contains ) {
|
||||||
|
setGlobalEval( tmp );
|
||||||
|
}
|
||||||
|
|
||||||
|
// Capture executables
|
||||||
|
if ( scripts ) {
|
||||||
|
j = 0;
|
||||||
|
while ( (elem = tmp[ j++ ]) ) {
|
||||||
|
if ( rscriptType.test( elem.type || "" ) ) {
|
||||||
|
scripts.push( elem );
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return fragment;
|
||||||
|
},
|
||||||
|
|
||||||
|
cleanData: function( elems ) {
|
||||||
|
var data, elem, type, key,
|
||||||
|
special = jQuery.event.special,
|
||||||
|
i = 0;
|
||||||
|
|
||||||
|
for ( ; (elem = elems[ i ]) !== undefined; i++ ) {
|
||||||
|
if ( jQuery.acceptData( elem ) ) {
|
||||||
|
key = elem[ data_priv.expando ];
|
||||||
|
|
||||||
|
if ( key && (data = data_priv.cache[ key ]) ) {
|
||||||
|
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 );
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if ( data_priv.cache[ key ] ) {
|
||||||
|
// Discard any remaining `private` data
|
||||||
|
delete data_priv.cache[ key ];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
// Discard any remaining `user` data
|
||||||
|
delete data_user.cache[ elem[ data_user.expando ] ];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
jQuery.fn.extend({
|
||||||
|
text: function( value ) {
|
||||||
|
return access( this, function( value ) {
|
||||||
|
return value === undefined ?
|
||||||
|
jQuery.text( this ) :
|
||||||
|
this.empty().each(function() {
|
||||||
|
if ( this.nodeType === 1 || this.nodeType === 11 || this.nodeType === 9 ) {
|
||||||
|
this.textContent = value;
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}, null, value, arguments.length );
|
||||||
|
},
|
||||||
|
|
||||||
|
append: function() {
|
||||||
|
return this.domManip( arguments, function( elem ) {
|
||||||
|
if ( this.nodeType === 1 || this.nodeType === 11 || this.nodeType === 9 ) {
|
||||||
|
var target = manipulationTarget( this, elem );
|
||||||
|
target.appendChild( elem );
|
||||||
|
}
|
||||||
|
});
|
||||||
|
},
|
||||||
|
|
||||||
|
prepend: function() {
|
||||||
|
return this.domManip( arguments, function( elem ) {
|
||||||
|
if ( this.nodeType === 1 || this.nodeType === 11 || this.nodeType === 9 ) {
|
||||||
|
var target = manipulationTarget( this, elem );
|
||||||
|
target.insertBefore( elem, target.firstChild );
|
||||||
|
}
|
||||||
|
});
|
||||||
|
},
|
||||||
|
|
||||||
|
before: function() {
|
||||||
|
return this.domManip( arguments, function( elem ) {
|
||||||
|
if ( this.parentNode ) {
|
||||||
|
this.parentNode.insertBefore( elem, this );
|
||||||
|
}
|
||||||
|
});
|
||||||
|
},
|
||||||
|
|
||||||
|
after: function() {
|
||||||
|
return this.domManip( arguments, function( elem ) {
|
||||||
|
if ( this.parentNode ) {
|
||||||
|
this.parentNode.insertBefore( elem, this.nextSibling );
|
||||||
|
}
|
||||||
|
});
|
||||||
|
},
|
||||||
|
|
||||||
|
remove: function( selector, keepData /* Internal Use Only */ ) {
|
||||||
|
var elem,
|
||||||
|
elems = selector ? jQuery.filter( selector, this ) : this,
|
||||||
|
i = 0;
|
||||||
|
|
||||||
|
for ( ; (elem = elems[i]) != null; i++ ) {
|
||||||
|
if ( !keepData && elem.nodeType === 1 ) {
|
||||||
|
jQuery.cleanData( getAll( elem ) );
|
||||||
|
}
|
||||||
|
|
||||||
|
if ( elem.parentNode ) {
|
||||||
|
if ( keepData && jQuery.contains( elem.ownerDocument, elem ) ) {
|
||||||
|
setGlobalEval( getAll( elem, "script" ) );
|
||||||
|
}
|
||||||
|
elem.parentNode.removeChild( elem );
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return this;
|
||||||
|
},
|
||||||
|
|
||||||
|
empty: function() {
|
||||||
|
var elem,
|
||||||
|
i = 0;
|
||||||
|
|
||||||
|
for ( ; (elem = this[i]) != null; i++ ) {
|
||||||
|
if ( elem.nodeType === 1 ) {
|
||||||
|
|
||||||
|
// Prevent memory leaks
|
||||||
|
jQuery.cleanData( getAll( elem, false ) );
|
||||||
|
|
||||||
|
// Remove any remaining nodes
|
||||||
|
elem.textContent = "";
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return this;
|
||||||
|
},
|
||||||
|
|
||||||
|
clone: function( dataAndEvents, deepDataAndEvents ) {
|
||||||
|
dataAndEvents = dataAndEvents == null ? false : dataAndEvents;
|
||||||
|
deepDataAndEvents = deepDataAndEvents == null ? dataAndEvents : deepDataAndEvents;
|
||||||
|
|
||||||
|
return this.map(function() {
|
||||||
|
return jQuery.clone( this, dataAndEvents, deepDataAndEvents );
|
||||||
|
});
|
||||||
|
},
|
||||||
|
|
||||||
|
html: function( value ) {
|
||||||
|
return access( this, function( value ) {
|
||||||
|
var elem = this[ 0 ] || {},
|
||||||
|
i = 0,
|
||||||
|
l = this.length;
|
||||||
|
|
||||||
|
if ( value === undefined && elem.nodeType === 1 ) {
|
||||||
|
return elem.innerHTML;
|
||||||
|
}
|
||||||
|
|
||||||
|
// See if we can take a shortcut and just use innerHTML
|
||||||
|
if ( typeof value === "string" && !rnoInnerhtml.test( value ) &&
|
||||||
|
!wrapMap[ ( rtagName.exec( value ) || [ "", "" ] )[ 1 ].toLowerCase() ] ) {
|
||||||
|
|
||||||
|
value = value.replace( rxhtmlTag, "<$1></$2>" );
|
||||||
|
|
||||||
|
try {
|
||||||
|
for ( ; i < l; i++ ) {
|
||||||
|
elem = this[ i ] || {};
|
||||||
|
|
||||||
|
// Remove element nodes and prevent memory leaks
|
||||||
|
if ( elem.nodeType === 1 ) {
|
||||||
|
jQuery.cleanData( getAll( elem, false ) );
|
||||||
|
elem.innerHTML = value;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
elem = 0;
|
||||||
|
|
||||||
|
// If using innerHTML throws an exception, use the fallback method
|
||||||
|
} catch( e ) {}
|
||||||
|
}
|
||||||
|
|
||||||
|
if ( elem ) {
|
||||||
|
this.empty().append( value );
|
||||||
|
}
|
||||||
|
}, null, value, arguments.length );
|
||||||
|
},
|
||||||
|
|
||||||
|
replaceWith: function() {
|
||||||
|
var arg = arguments[ 0 ];
|
||||||
|
|
||||||
|
// Make the changes, replacing each context element with the new content
|
||||||
|
this.domManip( arguments, function( elem ) {
|
||||||
|
arg = this.parentNode;
|
||||||
|
|
||||||
|
jQuery.cleanData( getAll( this ) );
|
||||||
|
|
||||||
|
if ( arg ) {
|
||||||
|
arg.replaceChild( elem, this );
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
// Force removal if there was no new content (e.g., from empty arguments)
|
||||||
|
return arg && (arg.length || arg.nodeType) ? this : this.remove();
|
||||||
|
},
|
||||||
|
|
||||||
|
detach: function( selector ) {
|
||||||
|
return this.remove( selector, true );
|
||||||
|
},
|
||||||
|
|
||||||
|
domManip: function( args, callback ) {
|
||||||
|
|
||||||
|
// Flatten any nested arrays
|
||||||
|
args = concat.apply( [], args );
|
||||||
|
|
||||||
|
var fragment, first, scripts, hasScripts, node, doc,
|
||||||
|
i = 0,
|
||||||
|
l = this.length,
|
||||||
|
set = this,
|
||||||
|
iNoClone = l - 1,
|
||||||
|
value = args[ 0 ],
|
||||||
|
isFunction = jQuery.isFunction( value );
|
||||||
|
|
||||||
|
// We can't cloneNode fragments that contain checked, in WebKit
|
||||||
|
if ( isFunction ||
|
||||||
|
( l > 1 && typeof value === "string" &&
|
||||||
|
!support.checkClone && rchecked.test( value ) ) ) {
|
||||||
|
return this.each(function( index ) {
|
||||||
|
var self = set.eq( index );
|
||||||
|
if ( isFunction ) {
|
||||||
|
args[ 0 ] = value.call( this, index, self.html() );
|
||||||
|
}
|
||||||
|
self.domManip( args, callback );
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
if ( l ) {
|
||||||
|
fragment = jQuery.buildFragment( args, this[ 0 ].ownerDocument, false, this );
|
||||||
|
first = fragment.firstChild;
|
||||||
|
|
||||||
|
if ( fragment.childNodes.length === 1 ) {
|
||||||
|
fragment = first;
|
||||||
|
}
|
||||||
|
|
||||||
|
if ( first ) {
|
||||||
|
scripts = jQuery.map( getAll( fragment, "script" ), disableScript );
|
||||||
|
hasScripts = scripts.length;
|
||||||
|
|
||||||
|
// Use the original fragment for the last item instead of the first because it can end up
|
||||||
|
// being emptied incorrectly in certain situations (#8070).
|
||||||
|
for ( ; i < l; i++ ) {
|
||||||
|
node = fragment;
|
||||||
|
|
||||||
|
if ( i !== iNoClone ) {
|
||||||
|
node = jQuery.clone( node, true, true );
|
||||||
|
|
||||||
|
// Keep references to cloned scripts for later restoration
|
||||||
|
if ( hasScripts ) {
|
||||||
|
// Support: QtWebKit
|
||||||
|
// jQuery.merge because push.apply(_, arraylike) throws
|
||||||
|
jQuery.merge( scripts, getAll( node, "script" ) );
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
callback.call( this[ i ], node, i );
|
||||||
|
}
|
||||||
|
|
||||||
|
if ( hasScripts ) {
|
||||||
|
doc = scripts[ scripts.length - 1 ].ownerDocument;
|
||||||
|
|
||||||
|
// Reenable scripts
|
||||||
|
jQuery.map( scripts, restoreScript );
|
||||||
|
|
||||||
|
// Evaluate executable scripts on first document insertion
|
||||||
|
for ( i = 0; i < hasScripts; i++ ) {
|
||||||
|
node = scripts[ i ];
|
||||||
|
if ( rscriptType.test( node.type || "" ) &&
|
||||||
|
!data_priv.access( node, "globalEval" ) && jQuery.contains( doc, node ) ) {
|
||||||
|
|
||||||
|
if ( node.src ) {
|
||||||
|
// Optional AJAX dependency, but won't run scripts if not present
|
||||||
|
if ( jQuery._evalUrl ) {
|
||||||
|
jQuery._evalUrl( node.src );
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
jQuery.globalEval( node.textContent.replace( rcleanScript, "" ) );
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return this;
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
jQuery.each({
|
||||||
|
appendTo: "append",
|
||||||
|
prependTo: "prepend",
|
||||||
|
insertBefore: "before",
|
||||||
|
insertAfter: "after",
|
||||||
|
replaceAll: "replaceWith"
|
||||||
|
}, function( name, original ) {
|
||||||
|
jQuery.fn[ name ] = function( selector ) {
|
||||||
|
var elems,
|
||||||
|
ret = [],
|
||||||
|
insert = jQuery( selector ),
|
||||||
|
last = insert.length - 1,
|
||||||
|
i = 0;
|
||||||
|
|
||||||
|
for ( ; i <= last; i++ ) {
|
||||||
|
elems = i === last ? this : this.clone( true );
|
||||||
|
jQuery( insert[ i ] )[ original ]( elems );
|
||||||
|
|
||||||
|
// Support: QtWebKit
|
||||||
|
// .get() because push.apply(_, arraylike) throws
|
||||||
|
push.apply( ret, elems.get() );
|
||||||
|
}
|
||||||
|
|
||||||
|
return this.pushStack( ret );
|
||||||
|
};
|
||||||
|
});
|
||||||
|
|
||||||
|
return jQuery;
|
||||||
|
});
|
|
@ -0,0 +1,18 @@
|
||||||
|
define([
|
||||||
|
"../ajax"
|
||||||
|
], function( jQuery ) {
|
||||||
|
|
||||||
|
jQuery._evalUrl = function( url ) {
|
||||||
|
return jQuery.ajax({
|
||||||
|
url: url,
|
||||||
|
type: "GET",
|
||||||
|
dataType: "script",
|
||||||
|
async: false,
|
||||||
|
global: false,
|
||||||
|
"throws": true
|
||||||
|
});
|
||||||
|
};
|
||||||
|
|
||||||
|
return jQuery._evalUrl;
|
||||||
|
|
||||||
|
});
|
|
@ -0,0 +1,31 @@
|
||||||
|
define([
|
||||||
|
"../var/support"
|
||||||
|
], function( support ) {
|
||||||
|
|
||||||
|
(function() {
|
||||||
|
var fragment = document.createDocumentFragment(),
|
||||||
|
div = fragment.appendChild( document.createElement( "div" ) ),
|
||||||
|
input = document.createElement( "input" );
|
||||||
|
|
||||||
|
// #11217 - WebKit loses check when the name is after the checked attribute
|
||||||
|
// Support: Windows Web Apps (WWA)
|
||||||
|
// `name` and `type` need .setAttribute for WWA
|
||||||
|
input.setAttribute( "type", "radio" );
|
||||||
|
input.setAttribute( "checked", "checked" );
|
||||||
|
input.setAttribute( "name", "t" );
|
||||||
|
|
||||||
|
div.appendChild( input );
|
||||||
|
|
||||||
|
// Support: Safari 5.1, iOS 5.1, Android 4.x, Android 2.3
|
||||||
|
// old WebKit doesn't clone checked state correctly in fragments
|
||||||
|
support.checkClone = div.cloneNode( true ).cloneNode( true ).lastChild.checked;
|
||||||
|
|
||||||
|
// Make sure textarea (and checkbox) defaultValue is properly cloned
|
||||||
|
// Support: IE9-IE11+
|
||||||
|
div.innerHTML = "<textarea>x</textarea>";
|
||||||
|
support.noCloneChecked = !!div.cloneNode( true ).lastChild.defaultValue;
|
||||||
|
})();
|
||||||
|
|
||||||
|
return support;
|
||||||
|
|
||||||
|
});
|
|
@ -0,0 +1,3 @@
|
||||||
|
define(function() {
|
||||||
|
return (/^(?:checkbox|radio)$/i);
|
||||||
|
});
|
|
@ -0,0 +1,204 @@
|
||||||
|
define([
|
||||||
|
"./core",
|
||||||
|
"./var/strundefined",
|
||||||
|
"./core/access",
|
||||||
|
"./css/var/rnumnonpx",
|
||||||
|
"./css/curCSS",
|
||||||
|
"./css/addGetHookIf",
|
||||||
|
"./css/support",
|
||||||
|
|
||||||
|
"./core/init",
|
||||||
|
"./css",
|
||||||
|
"./selector" // contains
|
||||||
|
], function( jQuery, strundefined, access, rnumnonpx, curCSS, addGetHookIf, support ) {
|
||||||
|
|
||||||
|
var docElem = window.document.documentElement;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Gets a window from an element
|
||||||
|
*/
|
||||||
|
function getWindow( elem ) {
|
||||||
|
return jQuery.isWindow( elem ) ? elem : elem.nodeType === 9 && elem.defaultView;
|
||||||
|
}
|
||||||
|
|
||||||
|
jQuery.offset = {
|
||||||
|
setOffset: function( elem, options, i ) {
|
||||||
|
var curPosition, curLeft, curCSSTop, curTop, curOffset, curCSSLeft, calculatePosition,
|
||||||
|
position = jQuery.css( elem, "position" ),
|
||||||
|
curElem = jQuery( elem ),
|
||||||
|
props = {};
|
||||||
|
|
||||||
|
// Set position first, in-case top/left are set even on static elem
|
||||||
|
if ( position === "static" ) {
|
||||||
|
elem.style.position = "relative";
|
||||||
|
}
|
||||||
|
|
||||||
|
curOffset = curElem.offset();
|
||||||
|
curCSSTop = jQuery.css( elem, "top" );
|
||||||
|
curCSSLeft = jQuery.css( elem, "left" );
|
||||||
|
calculatePosition = ( position === "absolute" || position === "fixed" ) &&
|
||||||
|
( curCSSTop + curCSSLeft ).indexOf("auto") > -1;
|
||||||
|
|
||||||
|
// Need to be able to calculate position if either top or left is auto and position is either absolute or fixed
|
||||||
|
if ( calculatePosition ) {
|
||||||
|
curPosition = curElem.position();
|
||||||
|
curTop = curPosition.top;
|
||||||
|
curLeft = curPosition.left;
|
||||||
|
|
||||||
|
} else {
|
||||||
|
curTop = parseFloat( curCSSTop ) || 0;
|
||||||
|
curLeft = parseFloat( curCSSLeft ) || 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
if ( jQuery.isFunction( options ) ) {
|
||||||
|
options = options.call( elem, i, curOffset );
|
||||||
|
}
|
||||||
|
|
||||||
|
if ( options.top != null ) {
|
||||||
|
props.top = ( options.top - curOffset.top ) + curTop;
|
||||||
|
}
|
||||||
|
if ( options.left != null ) {
|
||||||
|
props.left = ( options.left - curOffset.left ) + curLeft;
|
||||||
|
}
|
||||||
|
|
||||||
|
if ( "using" in options ) {
|
||||||
|
options.using.call( elem, props );
|
||||||
|
|
||||||
|
} else {
|
||||||
|
curElem.css( props );
|
||||||
|
}
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
jQuery.fn.extend({
|
||||||
|
offset: function( options ) {
|
||||||
|
if ( arguments.length ) {
|
||||||
|
return options === undefined ?
|
||||||
|
this :
|
||||||
|
this.each(function( i ) {
|
||||||
|
jQuery.offset.setOffset( this, options, i );
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
var docElem, win,
|
||||||
|
elem = this[ 0 ],
|
||||||
|
box = { top: 0, left: 0 },
|
||||||
|
doc = elem && elem.ownerDocument;
|
||||||
|
|
||||||
|
if ( !doc ) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
docElem = doc.documentElement;
|
||||||
|
|
||||||
|
// Make sure it's not a disconnected DOM node
|
||||||
|
if ( !jQuery.contains( docElem, elem ) ) {
|
||||||
|
return box;
|
||||||
|
}
|
||||||
|
|
||||||
|
// If we don't have gBCR, just use 0,0 rather than error
|
||||||
|
// BlackBerry 5, iOS 3 (original iPhone)
|
||||||
|
if ( typeof elem.getBoundingClientRect !== strundefined ) {
|
||||||
|
box = elem.getBoundingClientRect();
|
||||||
|
}
|
||||||
|
win = getWindow( doc );
|
||||||
|
return {
|
||||||
|
top: box.top + win.pageYOffset - docElem.clientTop,
|
||||||
|
left: box.left + win.pageXOffset - docElem.clientLeft
|
||||||
|
};
|
||||||
|
},
|
||||||
|
|
||||||
|
position: function() {
|
||||||
|
if ( !this[ 0 ] ) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
var offsetParent, offset,
|
||||||
|
elem = this[ 0 ],
|
||||||
|
parentOffset = { top: 0, left: 0 };
|
||||||
|
|
||||||
|
// Fixed elements are offset from window (parentOffset = {top:0, left: 0}, because it is its only offset parent
|
||||||
|
if ( jQuery.css( elem, "position" ) === "fixed" ) {
|
||||||
|
// We assume that getBoundingClientRect is available when computed position is fixed
|
||||||
|
offset = elem.getBoundingClientRect();
|
||||||
|
|
||||||
|
} else {
|
||||||
|
// Get *real* offsetParent
|
||||||
|
offsetParent = this.offsetParent();
|
||||||
|
|
||||||
|
// Get correct offsets
|
||||||
|
offset = this.offset();
|
||||||
|
if ( !jQuery.nodeName( offsetParent[ 0 ], "html" ) ) {
|
||||||
|
parentOffset = offsetParent.offset();
|
||||||
|
}
|
||||||
|
|
||||||
|
// Add offsetParent borders
|
||||||
|
parentOffset.top += jQuery.css( offsetParent[ 0 ], "borderTopWidth", true );
|
||||||
|
parentOffset.left += jQuery.css( offsetParent[ 0 ], "borderLeftWidth", true );
|
||||||
|
}
|
||||||
|
|
||||||
|
// Subtract parent offsets and element margins
|
||||||
|
return {
|
||||||
|
top: offset.top - parentOffset.top - jQuery.css( elem, "marginTop", true ),
|
||||||
|
left: offset.left - parentOffset.left - jQuery.css( elem, "marginLeft", true )
|
||||||
|
};
|
||||||
|
},
|
||||||
|
|
||||||
|
offsetParent: function() {
|
||||||
|
return this.map(function() {
|
||||||
|
var offsetParent = this.offsetParent || docElem;
|
||||||
|
|
||||||
|
while ( offsetParent && ( !jQuery.nodeName( offsetParent, "html" ) && jQuery.css( offsetParent, "position" ) === "static" ) ) {
|
||||||
|
offsetParent = offsetParent.offsetParent;
|
||||||
|
}
|
||||||
|
|
||||||
|
return offsetParent || docElem;
|
||||||
|
});
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
// Create scrollLeft and scrollTop methods
|
||||||
|
jQuery.each( { scrollLeft: "pageXOffset", scrollTop: "pageYOffset" }, function( method, prop ) {
|
||||||
|
var top = "pageYOffset" === prop;
|
||||||
|
|
||||||
|
jQuery.fn[ method ] = function( val ) {
|
||||||
|
return access( this, function( elem, method, val ) {
|
||||||
|
var win = getWindow( elem );
|
||||||
|
|
||||||
|
if ( val === undefined ) {
|
||||||
|
return win ? win[ prop ] : elem[ method ];
|
||||||
|
}
|
||||||
|
|
||||||
|
if ( win ) {
|
||||||
|
win.scrollTo(
|
||||||
|
!top ? val : window.pageXOffset,
|
||||||
|
top ? val : window.pageYOffset
|
||||||
|
);
|
||||||
|
|
||||||
|
} else {
|
||||||
|
elem[ method ] = val;
|
||||||
|
}
|
||||||
|
}, method, val, arguments.length, null );
|
||||||
|
};
|
||||||
|
});
|
||||||
|
|
||||||
|
// Add the top/left cssHooks using jQuery.fn.position
|
||||||
|
// Webkit bug: https://bugs.webkit.org/show_bug.cgi?id=29084
|
||||||
|
// getComputedStyle returns percent when specified for top/left/bottom/right
|
||||||
|
// rather than make the css module depend on the offset module, we just check for it here
|
||||||
|
jQuery.each( [ "top", "left" ], function( i, prop ) {
|
||||||
|
jQuery.cssHooks[ prop ] = addGetHookIf( support.pixelPosition,
|
||||||
|
function( elem, computed ) {
|
||||||
|
if ( computed ) {
|
||||||
|
computed = curCSS( elem, prop );
|
||||||
|
// if curCSS returns percentage, fallback to offset
|
||||||
|
return rnumnonpx.test( computed ) ?
|
||||||
|
jQuery( elem ).position()[ prop ] + "px" :
|
||||||
|
computed;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
);
|
||||||
|
});
|
||||||
|
|
||||||
|
return jQuery;
|
||||||
|
});
|
|
@ -0,0 +1 @@
|
||||||
|
}));
|
|
@ -0,0 +1,142 @@
|
||||||
|
define([
|
||||||
|
"./core",
|
||||||
|
"./data/var/data_priv",
|
||||||
|
"./deferred",
|
||||||
|
"./callbacks"
|
||||||
|
], function( jQuery, data_priv ) {
|
||||||
|
|
||||||
|
jQuery.extend({
|
||||||
|
queue: function( elem, type, data ) {
|
||||||
|
var queue;
|
||||||
|
|
||||||
|
if ( elem ) {
|
||||||
|
type = ( type || "fx" ) + "queue";
|
||||||
|
queue = data_priv.get( elem, type );
|
||||||
|
|
||||||
|
// Speed up dequeue by getting out quickly if this is just a lookup
|
||||||
|
if ( data ) {
|
||||||
|
if ( !queue || jQuery.isArray( data ) ) {
|
||||||
|
queue = data_priv.access( elem, type, jQuery.makeArray(data) );
|
||||||
|
} else {
|
||||||
|
queue.push( data );
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return queue || [];
|
||||||
|
}
|
||||||
|
},
|
||||||
|
|
||||||
|
dequeue: function( elem, type ) {
|
||||||
|
type = type || "fx";
|
||||||
|
|
||||||
|
var queue = jQuery.queue( elem, type ),
|
||||||
|
startLength = queue.length,
|
||||||
|
fn = queue.shift(),
|
||||||
|
hooks = jQuery._queueHooks( elem, type ),
|
||||||
|
next = function() {
|
||||||
|
jQuery.dequeue( elem, type );
|
||||||
|
};
|
||||||
|
|
||||||
|
// If the fx queue is dequeued, always remove the progress sentinel
|
||||||
|
if ( fn === "inprogress" ) {
|
||||||
|
fn = queue.shift();
|
||||||
|
startLength--;
|
||||||
|
}
|
||||||
|
|
||||||
|
if ( fn ) {
|
||||||
|
|
||||||
|
// Add a progress sentinel to prevent the fx queue from being
|
||||||
|
// automatically dequeued
|
||||||
|
if ( type === "fx" ) {
|
||||||
|
queue.unshift( "inprogress" );
|
||||||
|
}
|
||||||
|
|
||||||
|
// clear up the last queue stop function
|
||||||
|
delete hooks.stop;
|
||||||
|
fn.call( elem, next, hooks );
|
||||||
|
}
|
||||||
|
|
||||||
|
if ( !startLength && hooks ) {
|
||||||
|
hooks.empty.fire();
|
||||||
|
}
|
||||||
|
},
|
||||||
|
|
||||||
|
// not intended for public consumption - generates a queueHooks object, or returns the current one
|
||||||
|
_queueHooks: function( elem, type ) {
|
||||||
|
var key = type + "queueHooks";
|
||||||
|
return data_priv.get( elem, key ) || data_priv.access( elem, key, {
|
||||||
|
empty: jQuery.Callbacks("once memory").add(function() {
|
||||||
|
data_priv.remove( elem, [ type + "queue", key ] );
|
||||||
|
})
|
||||||
|
});
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
jQuery.fn.extend({
|
||||||
|
queue: function( type, data ) {
|
||||||
|
var setter = 2;
|
||||||
|
|
||||||
|
if ( typeof type !== "string" ) {
|
||||||
|
data = type;
|
||||||
|
type = "fx";
|
||||||
|
setter--;
|
||||||
|
}
|
||||||
|
|
||||||
|
if ( arguments.length < setter ) {
|
||||||
|
return jQuery.queue( this[0], type );
|
||||||
|
}
|
||||||
|
|
||||||
|
return data === undefined ?
|
||||||
|
this :
|
||||||
|
this.each(function() {
|
||||||
|
var queue = jQuery.queue( this, type, data );
|
||||||
|
|
||||||
|
// ensure a hooks for this queue
|
||||||
|
jQuery._queueHooks( this, type );
|
||||||
|
|
||||||
|
if ( type === "fx" && queue[0] !== "inprogress" ) {
|
||||||
|
jQuery.dequeue( this, type );
|
||||||
|
}
|
||||||
|
});
|
||||||
|
},
|
||||||
|
dequeue: function( type ) {
|
||||||
|
return this.each(function() {
|
||||||
|
jQuery.dequeue( this, type );
|
||||||
|
});
|
||||||
|
},
|
||||||
|
clearQueue: function( type ) {
|
||||||
|
return this.queue( type || "fx", [] );
|
||||||
|
},
|
||||||
|
// Get a promise resolved when queues of a certain type
|
||||||
|
// are emptied (fx is the type by default)
|
||||||
|
promise: function( type, obj ) {
|
||||||
|
var tmp,
|
||||||
|
count = 1,
|
||||||
|
defer = jQuery.Deferred(),
|
||||||
|
elements = this,
|
||||||
|
i = this.length,
|
||||||
|
resolve = function() {
|
||||||
|
if ( !( --count ) ) {
|
||||||
|
defer.resolveWith( elements, [ elements ] );
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
if ( typeof type !== "string" ) {
|
||||||
|
obj = type;
|
||||||
|
type = undefined;
|
||||||
|
}
|
||||||
|
type = type || "fx";
|
||||||
|
|
||||||
|
while ( i-- ) {
|
||||||
|
tmp = data_priv.get( elements[ i ], type + "queueHooks" );
|
||||||
|
if ( tmp && tmp.empty ) {
|
||||||
|
count++;
|
||||||
|
tmp.empty.add( resolve );
|
||||||
|
}
|
||||||
|
}
|
||||||
|
resolve();
|
||||||
|
return defer.promise( obj );
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
return jQuery;
|
||||||
|
});
|
|
@ -0,0 +1,22 @@
|
||||||
|
define([
|
||||||
|
"../core",
|
||||||
|
"../queue",
|
||||||
|
"../effects" // Delay is optional because of this dependency
|
||||||
|
], function( jQuery ) {
|
||||||
|
|
||||||
|
// Based off of the plugin by Clint Helfers, with permission.
|
||||||
|
// http://blindsignals.com/index.php/2009/07/jquery-delay/
|
||||||
|
jQuery.fn.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 );
|
||||||
|
};
|
||||||
|
});
|
||||||
|
};
|
||||||
|
|
||||||
|
return jQuery.fn.delay;
|
||||||
|
});
|
Некоторые файлы не были показаны из-за слишком большого количества измененных файлов Показать больше
Загрузка…
Ссылка в новой задаче