From 162d0ede65d3e6a1fcbf01745fd0a6239a5fc7b1 Mon Sep 17 00:00:00 2001 From: ruan Date: Fri, 9 Oct 2015 04:27:07 +0200 Subject: [PATCH] Updates - Updated jQuery to v2.1.4, include original unformatted versions - Added punishment totals to the header (bans, mutes, warnings, kicks) as badges - Refactored and cleaned up a few classes --- history.php | 10 +- includes/header.php | 47 +- includes/js/jquery.js | 8702 ++++++++++++++++--------------------- includes/js/jquery.min.js | 2630 +---------- includes/page.php | 7 +- includes/settings.php | 4 + index.php | 14 +- info.php | 24 +- 8 files changed, 3868 insertions(+), 7570 deletions(-) diff --git a/history.php b/history.php index 1029ac9..7103408 100644 --- a/history.php +++ b/history.php @@ -30,8 +30,6 @@ class History { $st = $page->conn->prepare("SELECT * FROM $table WHERE $field=:uuid ORDER BY time"); $st->bindParam(":uuid", $uuid, PDO::PARAM_STR); - // Incompatible with pager as rows are usort()'d - // $st->bindParam(':limit', $limit, PDO::PARAM_INT); if ($st->execute()) { while ($row = $st->fetch(PDO::FETCH_ASSOC)) { @@ -59,18 +57,14 @@ class History { $page = new Page("history"); -if (!isset($_GET['uuid'])) { - die("Missing arguments (uuid)."); -} +isset($_GET['uuid']) or die("Missing arguments (uuid)."); $staffhistory = (isset($_GET['staffhistory']) && $_GET['staffhistory'] === "1"); $uuid = $_GET['uuid']; $name = $page->get_name($uuid); -if ($name === null) { - die("Player not found in database."); -} +$name !== null or die("Player not found in database."); if ($staffhistory) { $page->name = "Recent Punishments by $name"; diff --git a/includes/header.php b/includes/header.php index 5d35a43..2e06189 100644 --- a/includes/header.php +++ b/includes/header.php @@ -1,8 +1,34 @@ page = $page; + if ($page->settings->header_show_totals) { + $t = $page->settings->table; + $t_bans = $t['bans']; + $t_mutes = $t['mutes']; + $t_warnings = $t['warnings']; + $t_kicks = $t['kicks']; + $st = $page->conn->query("SELECT + (SELECT COUNT(*) FROM $t_bans) AS c_bans, + (SELECT COUNT(*) FROM $t_mutes) AS c_mutes, + (SELECT COUNT(*) FROM $t_warnings) AS c_warnings, + (SELECT COUNT(*) FROM $t_kicks) AS c_kicks"); + ($row = $st->fetch(PDO::FETCH_ASSOC)) or die('Failed to fetch row counts.'); + $this->count = array( + 'bans.php' => $row['c_bans'], + 'mutes.php' => $row['c_mutes'], + 'warnings.php' => $row['c_warnings'], + 'kicks.php' => $row['c_kicks'], + ); + } +} function navbar($links) { echo ''; } +function print_header() { +$settings = $this->page->settings; ?> @@ -48,11 +81,12 @@ function navbar($links) { - name; ?> + name; ?> + diff --git a/includes/js/jquery.js b/includes/js/jquery.js index 7d1a488..f780e26 100644 --- a/includes/js/jquery.js +++ b/includes/js/jquery.js @@ -1,5 +1,5 @@ /*! - * jQuery JavaScript Library v1.11.3 + * jQuery JavaScript Library v2.1.4 * http://jquery.com/ * * Includes Sizzle.js @@ -9,49 +9,49 @@ * Released under the MIT license * http://jquery.org/license * - * Date: 2015-04-28T16:19Z + * Date: 2015-04-28T16:01Z */ -(function (global, factory) { +(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 + 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 have a `window` with a `document` + // (such as Node.js), expose a 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 + // 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"); + factory( global, true ) : + function( w ) { + if ( !w.document ) { + throw new Error( "jQuery requires a window with a document" ); } - return factory(w); + return factory( w ); }; } else { - factory(global); + factory( global ); } // Pass this if window is not defined yet -}(typeof window !== "undefined" ? window : this, function (window, noGlobal) { +}(typeof window !== "undefined" ? window : this, function( window, noGlobal ) { -// Can't do this because several apps including ASP.NET trace +// Support: Firefox 18+ +// Can't be in strict mode, several libs 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+ // - var deletedIds = []; + var arr = []; - var slice = deletedIds.slice; + var slice = arr.slice; - var concat = deletedIds.concat; + var concat = arr.concat; - var push = deletedIds.push; + var push = arr.push; - var indexOf = deletedIds.indexOf; + var indexOf = arr.indexOf; var class2type = {}; @@ -62,17 +62,21 @@ var support = {}; + var - version = "1.11.3", + // Use the correct document accordingly with window argument (sandbox) + document = window.document, + + version = "2.1.4", // Define a local copy of jQuery - jQuery = function (selector, context) { + 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); + return new jQuery.fn.init( selector, context ); }, - // Support: Android<4.1, IE<9 + // Support: Android<4.1 // Make sure we trim BOM and NBSP rtrim = /^[\s\uFEFF\xA0]+|[\s\uFEFF\xA0]+$/g, @@ -81,7 +85,7 @@ rdashAlpha = /-([\da-z])/gi, // Used by jQuery.camelCase as callback to replace() - fcamelCase = function (all, letter) { + fcamelCase = function( all, letter ) { return letter.toUpperCase(); }; @@ -97,28 +101,28 @@ // The default length of a jQuery object is 0 length: 0, - toArray: function () { - return slice.call(this); + 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) { + get: function( num ) { return num != null ? // Return just the one element from the set - ( num < 0 ? this[num + this.length] : this[num] ) : + ( num < 0 ? this[ num + this.length ] : this[ num ] ) : // Return all the elements in a clean array - slice.call(this); + slice.call( this ); }, // Take an array of elements and push it onto the stack // (returning the new matched element set) - pushStack: function (elems) { + pushStack: function( elems ) { // Build a new jQuery matched element set - var ret = jQuery.merge(this.constructor(), elems); + var ret = jQuery.merge( this.constructor(), elems ); // Add the old object onto the stack (as a reference) ret.prevObject = this; @@ -131,88 +135,88 @@ // 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); + 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); + 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)); + slice: function() { + return this.pushStack( slice.apply( this, arguments ) ); }, - first: function () { - return this.eq(0); + first: function() { + return this.eq( 0 ); }, - last: function () { - return this.eq(-1); + last: function() { + return this.eq( -1 ); }, - eq: function (i) { + eq: function( i ) { var len = this.length, j = +i + ( i < 0 ? len : 0 ); - return this.pushStack(j >= 0 && j < len ? [this[j]] : []); + return this.pushStack( j >= 0 && j < len ? [ this[j] ] : [] ); }, - end: function () { + 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: deletedIds.sort, - splice: deletedIds.splice + sort: arr.sort, + splice: arr.splice }; - jQuery.extend = jQuery.fn.extend = function () { - var src, copyIsArray, copy, name, options, clone, + 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") { + if ( typeof target === "boolean" ) { deep = target; - // skip the boolean and the target - target = arguments[i] || {}; + // 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)) { + if ( typeof target !== "object" && !jQuery.isFunction(target) ) { target = {}; } - // extend jQuery itself if only one argument is passed - if (i === length) { + // Extend jQuery itself if only one argument is passed + if ( i === length ) { target = this; i--; } - for (; i < length; i++) { + for ( ; i < length; i++ ) { // Only deal with non-null/undefined values - if ((options = arguments[i]) != null) { + if ( (options = arguments[ i ]) != null ) { // Extend the base object - for (name in options) { - src = target[name]; - copy = options[name]; + for ( name in options ) { + src = target[ name ]; + copy = options[ name ]; // Prevent never-ending loop - if (target === copy) { + 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) { + if ( deep && copy && ( jQuery.isPlainObject(copy) || (copyIsArray = jQuery.isArray(copy)) ) ) { + if ( copyIsArray ) { copyIsArray = false; clone = src && jQuery.isArray(src) ? src : []; @@ -221,11 +225,11 @@ } // Never move original objects, clone them - target[name] = jQuery.extend(deep, clone, copy); + target[ name ] = jQuery.extend( deep, clone, copy ); // Don't bring in undefined values - } else if (copy !== undefined) { - target[name] = copy; + } else if ( copy !== undefined ) { + target[ name ] = copy; } } } @@ -237,140 +241,127 @@ jQuery.extend({ // Unique for each copy of jQuery on the page - expando: "jQuery" + ( version + Math.random() ).replace(/\D/g, ""), + 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); + error: function( msg ) { + throw new Error( msg ); }, - noop: function () { - }, + 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) { + isFunction: function( obj ) { return jQuery.type(obj) === "function"; }, - isArray: Array.isArray || function (obj) { - return jQuery.type(obj) === "array"; + isArray: Array.isArray, + + isWindow: function( obj ) { + return obj != null && obj === obj.window; }, - isWindow: function (obj) { - /* jshint eqeqeq: false */ - return obj != null && obj == obj.window; - }, - - isNumeric: function (obj) { + 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 // adding 1 corrects loss of precision from parseFloat (#15100) - return !jQuery.isArray(obj) && (obj - parseFloat(obj) + 1) >= 0; + return !jQuery.isArray( obj ) && (obj - parseFloat( obj ) + 1) >= 0; }, - isEmptyObject: function (obj) { + isPlainObject: function( obj ) { + // Not plain objects: + // - Any object or value whose internal [[Class]] property is not "[object Object]" + // - DOM nodes + // - window + if ( jQuery.type( obj ) !== "object" || obj.nodeType || jQuery.isWindow( obj ) ) { + return false; + } + + 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) { + for ( name in obj ) { return false; } return true; }, - isPlainObject: function (obj) { - var key; - - // Must be an Object. - // Because of IE, we also have to check the presence of the constructor property. - // Make sure that DOM nodes and window objects don't pass through, as well - if (!obj || jQuery.type(obj) !== "object" || obj.nodeType || jQuery.isWindow(obj)) { - return false; - } - - try { - // Not own constructor property must be Object - if (obj.constructor && !hasOwn.call(obj, "constructor") && !hasOwn.call(obj.constructor.prototype, "isPrototypeOf")) { - return false; - } - } catch (e) { - // IE8,9 Will throw exceptions on certain host objects #9897 - return false; - } - - // Support: IE<9 - // Handle iteration over inherited properties before own properties. - if (support.ownLast) { - for (key in obj) { - return hasOwn.call(obj, key); - } - } - - // Own properties are enumerated firstly, so to speed up, - // if last one is own, then all properties are own. - for (key in obj) { - } - - return key === undefined || hasOwn.call(obj, key); - }, - - type: function (obj) { - if (obj == null) { + 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" : + class2type[ toString.call(obj) ] || "object" : typeof obj; }, // Evaluates a script in a global context - // Workarounds based on findings by Jim Driscoll - // http://weblogs.java.net/blog/driscoll/archive/2009/09/08/eval-javascript-global-context - globalEval: function (data) { - if (data && jQuery.trim(data)) { - // We use execScript on Internet Explorer - // We use an anonymous function so that context is window - // rather than jQuery in Firefox - ( window.execScript || function (data) { - window["eval"].call(window, data); - } )(data); + 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 + // Support: IE9-11+ // Microsoft forgot to hump their vendor prefix (#9572) - camelCase: function (string) { - return string.replace(rmsPrefix, "ms-").replace(rdashAlpha, fcamelCase); + camelCase: function( string ) { + return string.replace( rmsPrefix, "ms-" ).replace( rdashAlpha, fcamelCase ); }, - nodeName: function (elem, name) { + nodeName: function( elem, name ) { return elem.nodeName && elem.nodeName.toLowerCase() === name.toLowerCase(); }, // args is for internal usage only - each: function (obj, callback, args) { + each: function( obj, callback, args ) { var value, i = 0, length = obj.length, - isArray = isArraylike(obj); + isArray = isArraylike( obj ); - if (args) { - if (isArray) { - for (; i < length; i++) { - value = callback.apply(obj[i], args); + if ( args ) { + if ( isArray ) { + for ( ; i < length; i++ ) { + value = callback.apply( obj[ i ], args ); - if (value === false) { + if ( value === false ) { break; } } } else { - for (i in obj) { - value = callback.apply(obj[i], args); + for ( i in obj ) { + value = callback.apply( obj[ i ], args ); - if (value === false) { + if ( value === false ) { break; } } @@ -378,19 +369,19 @@ // 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 ( isArray ) { + for ( ; i < length; i++ ) { + value = callback.call( obj[ i ], i, obj[ i ] ); - if (value === false) { + if ( value === false ) { break; } } } else { - for (i in obj) { - value = callback.call(obj[i], i, obj[i]); + for ( i in obj ) { + value = callback.call( obj[ i ], i, obj[ i ] ); - if (value === false) { + if ( value === false ) { break; } } @@ -400,68 +391,42 @@ return obj; }, - // Support: Android<4.1, IE<9 - trim: function (text) { + // Support: Android<4.1 + trim: function( text ) { return text == null ? "" : - ( text + "" ).replace(rtrim, ""); + ( text + "" ).replace( rtrim, "" ); }, // results is for internal usage only - makeArray: function (arr, results) { + makeArray: function( arr, results ) { var ret = results || []; - if (arr != null) { - if (isArraylike(Object(arr))) { - jQuery.merge(ret, + if ( arr != null ) { + if ( isArraylike( Object(arr) ) ) { + jQuery.merge( ret, typeof arr === "string" ? - [arr] : arr + [ arr ] : arr ); } else { - push.call(ret, arr); + push.call( ret, arr ); } } return ret; }, - inArray: function (elem, arr, i) { - var len; - - if (arr) { - if (indexOf) { - return indexOf.call(arr, elem, i); - } - - len = arr.length; - i = i ? i < 0 ? Math.max(0, len + i) : i : 0; - - for (; i < len; i++) { - // Skip accessing in sparse arrays - if (i in arr && arr[i] === elem) { - return i; - } - } - } - - return -1; + inArray: function( elem, arr, i ) { + return arr == null ? -1 : indexOf.call( arr, elem, i ); }, - merge: function (first, second) { + merge: function( first, second ) { var len = +second.length, j = 0, i = first.length; - while (j < len) { - first[i++] = second[j++]; - } - - // Support: IE<9 - // Workaround casting of .length to NaN on otherwise arraylike objects (e.g., NodeLists) - if (len !== len) { - while (second[j] !== undefined) { - first[i++] = second[j++]; - } + for ( ; j < len; j++ ) { + first[ i++ ] = second[ j ]; } first.length = i; @@ -469,7 +434,7 @@ return first; }, - grep: function (elems, callback, invert) { + grep: function( elems, callback, invert ) { var callbackInverse, matches = [], i = 0, @@ -478,10 +443,10 @@ // 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]); + for ( ; i < length; i++ ) { + callbackInverse = !callback( elems[ i ], i ); + if ( callbackInverse !== callbackExpect ) { + matches.push( elems[ i ] ); } } @@ -489,36 +454,36 @@ }, // arg is for internal usage only - map: function (elems, callback, arg) { + map: function( elems, callback, arg ) { var value, i = 0, length = elems.length, - isArray = isArraylike(elems), + 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 ( isArray ) { + for ( ; i < length; i++ ) { + value = callback( elems[ i ], i, arg ); - if (value != null) { - ret.push(value); + if ( value != null ) { + ret.push( value ); } } // Go through every key on the object, } else { - for (i in elems) { - value = callback(elems[i], i, arg); + for ( i in elems ) { + value = callback( elems[ i ], i, arg ); - if (value != null) { - ret.push(value); + if ( value != null ) { + ret.push( value ); } } } // Flatten any nested arrays - return concat.apply([], ret); + return concat.apply( [], ret ); }, // A global GUID counter for objects @@ -526,25 +491,25 @@ // Bind a function to a context, optionally partially applying any // arguments. - proxy: function (fn, context) { - var args, proxy, tmp; + proxy: function( fn, context ) { + var tmp, args, proxy; - if (typeof context === "string") { - tmp = fn[context]; + 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)) { + 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))); + 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 @@ -553,9 +518,7 @@ return proxy; }, - now: function () { - return +( new Date() ); - }, + now: Date.now, // jQuery.support is not used in Core but other projects attach their // properties to it so it needs to exist. @@ -563,31 +526,30 @@ }); // Populate the class2type map - jQuery.each("Boolean Number String Function Array Date RegExp Object Error".split(" "), function (i, name) { - class2type["[object " + name + "]"] = name.toLowerCase(); + jQuery.each("Boolean Number String Function Array Date RegExp Object Error".split(" "), function(i, name) { + class2type[ "[object " + name + "]" ] = name.toLowerCase(); }); - function isArraylike(obj) { + function isArraylike( obj ) { // Support: iOS 8.2 (not reproducible in simulator) // `in` check used to prevent JIT error (gh-2145) // hasOwn isn't used here due to false negatives // regarding Nodelist length in IE var length = "length" in obj && obj.length, - type = jQuery.type(obj); + type = jQuery.type( obj ); - if (type === "function" || jQuery.isWindow(obj)) { + if ( type === "function" || jQuery.isWindow( obj ) ) { return false; } - if (obj.nodeType === 1 && length) { + if ( obj.nodeType === 1 && length ) { return true; } return type === "array" || length === 0 || typeof length === "number" && length > 0 && ( length - 1 ) in obj; } - var Sizzle = /*! * Sizzle CSS Selector Engine v2.2.0-pre @@ -599,7 +561,7 @@ * * Date: 2014-12-16 */ - (function (window) { + (function( window ) { var i, support, @@ -631,8 +593,8 @@ classCache = createCache(), tokenCache = createCache(), compilerCache = createCache(), - sortOrder = function (a, b) { - if (a === b) { + sortOrder = function( a, b ) { + if ( a === b ) { hasDuplicate = true; } return 0; @@ -650,11 +612,11 @@ slice = arr.slice, // Use a stripped-down indexOf as it's faster than native // http://jsperf.com/thor-indexof-vs-for/5 - indexOf = function (list, elem) { + indexOf = function( list, elem ) { var i = 0, len = list.length; - for (; i < len; i++) { - if (list[i] === elem) { + for ( ; i < len; i++ ) { + if ( list[i] === elem ) { return i; } } @@ -673,7 +635,7 @@ // Loosely modeled on CSS identifier characters // An unquoted value should be a CSS identifier http://www.w3.org/TR/css3-selectors/#attribute-selectors // Proper syntax: http://www.w3.org/TR/CSS21/syndata.html#value-def-identifier - identifier = characterEncoding.replace("w", "w#"), + identifier = characterEncoding.replace( "w", "w#" ), // Attribute selectors: http://www.w3.org/TR/selectors/#attribute-selectors attributes = "\\[" + whitespace + "*(" + characterEncoding + ")(?:" + whitespace + @@ -694,31 +656,31 @@ ")\\)|)", // Leading and non-escaped trailing whitespace, capturing some non-whitespace characters preceding the latter - rwhitespace = new RegExp(whitespace + "+", "g"), - rtrim = new RegExp("^" + whitespace + "+|((?:^|[^\\\\])(?:\\\\.)*)" + whitespace + "+$", "g"), + rwhitespace = new RegExp( whitespace + "+", "g" ), + rtrim = new RegExp( "^" + whitespace + "+|((?:^|[^\\\\])(?:\\\\.)*)" + whitespace + "+$", "g" ), - rcomma = new RegExp("^" + whitespace + "*," + whitespace + "*"), - rcombinators = new RegExp("^" + whitespace + "*([>+~]|" + whitespace + ")" + whitespace + "*"), + rcomma = new RegExp( "^" + whitespace + "*," + whitespace + "*" ), + rcombinators = new RegExp( "^" + whitespace + "*([>+~]|" + whitespace + ")" + whitespace + "*" ), - rattributeQuotes = new RegExp("=" + whitespace + "*([^\\]'\"]*?)" + whitespace + "*\\]", "g"), + rattributeQuotes = new RegExp( "=" + whitespace + "*([^\\]'\"]*?)" + whitespace + "*\\]", "g" ), - rpseudo = new RegExp(pseudos), - ridentifier = new RegExp("^" + identifier + "$"), + rpseudo = new RegExp( pseudos ), + ridentifier = new RegExp( "^" + identifier + "$" ), matchExpr = { - "ID": new RegExp("^#(" + characterEncoding + ")"), - "CLASS": new RegExp("^\\.(" + characterEncoding + ")"), - "TAG": new RegExp("^(" + characterEncoding.replace("w", "w*") + ")"), - "ATTR": new RegExp("^" + attributes), - "PSEUDO": new RegExp("^" + pseudos), - "CHILD": new RegExp("^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\(" + whitespace + + "ID": new RegExp( "^#(" + characterEncoding + ")" ), + "CLASS": new RegExp( "^\\.(" + characterEncoding + ")" ), + "TAG": new RegExp( "^(" + characterEncoding.replace( "w", "w*" ) + ")" ), + "ATTR": new RegExp( "^" + attributes ), + "PSEUDO": new RegExp( "^" + pseudos ), + "CHILD": new RegExp( "^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\(" + whitespace + "*(even|odd|(([+-]|)(\\d*)n|)" + whitespace + "*(?:([+-]|)" + whitespace + - "*(\\d+)|))" + whitespace + "*\\)|)", "i"), - "bool": new RegExp("^(?:" + booleans + ")$", "i"), + "*(\\d+)|))" + whitespace + "*\\)|)", "i" ), + "bool": new RegExp( "^(?:" + booleans + ")$", "i" ), // For use in libraries implementing .is() // We use this for POS matching in `select` - "needsContext": new RegExp("^" + whitespace + "*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\(" + - whitespace + "*((?:-\\d)?\\d*)" + whitespace + "*\\)|)(?=[^-]|$)", "i") + "needsContext": new RegExp( "^" + whitespace + "*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\(" + + whitespace + "*((?:-\\d)?\\d*)" + whitespace + "*\\)|)(?=[^-]|$)", "i" ) }, rinputs = /^(?:input|select|textarea|button)$/i, @@ -733,8 +695,8 @@ rescape = /'|\\/g, // CSS escapes http://www.w3.org/TR/CSS21/syndata.html#escaped-characters - runescape = new RegExp("\\\\([\\da-f]{1,6}" + whitespace + "?|(" + whitespace + ")|.)", "ig"), - funescape = function (_, escaped, escapedWhitespace) { + runescape = new RegExp( "\\\\([\\da-f]{1,6}" + whitespace + "?|(" + whitespace + ")|.)", "ig" ), + funescape = function( _, escaped, escapedWhitespace ) { var high = "0x" + escaped - 0x10000; // NaN means non-codepoint // Support: Firefox<24 @@ -743,84 +705,82 @@ escaped : high < 0 ? // BMP codepoint - String.fromCharCode(high + 0x10000) : + String.fromCharCode( high + 0x10000 ) : // Supplemental Plane codepoint (surrogate pair) - String.fromCharCode(high >> 10 | 0xD800, high & 0x3FF | 0xDC00); + String.fromCharCode( high >> 10 | 0xD800, high & 0x3FF | 0xDC00 ); }, // Used for iframes // See setDocument() // Removing the function wrapper causes a "Permission Denied" // error in IE - unloadHandler = function () { + unloadHandler = function() { setDocument(); }; // Optimize for push.apply( _, NodeList ) try { push.apply( - (arr = slice.call(preferredDoc.childNodes)), + (arr = slice.call( preferredDoc.childNodes )), preferredDoc.childNodes ); // Support: Android<4.0 // Detect silently failing push.apply - arr[preferredDoc.childNodes.length].nodeType; - } catch (e) { - push = { - apply: arr.length ? + arr[ preferredDoc.childNodes.length ].nodeType; + } catch ( e ) { + push = { apply: arr.length ? - // Leverage slice if possible - function (target, els) { - push_native.apply(target, slice.call(els)); - } : + // Leverage slice if possible + function( target, els ) { + push_native.apply( target, slice.call(els) ); + } : - // Support: IE<9 - // Otherwise append directly - function (target, els) { - var j = target.length, - i = 0; - // Can't trust NodeList.length - while ((target[j++] = els[i++])) { - } - target.length = j - 1; - } + // Support: IE<9 + // Otherwise append directly + function( target, els ) { + var j = target.length, + i = 0; + // Can't trust NodeList.length + while ( (target[j++] = els[i++]) ) {} + target.length = j - 1; + } }; } - function Sizzle(selector, context, results, seed) { + function Sizzle( selector, context, results, seed ) { var match, elem, m, nodeType, // QSA vars i, groups, old, nid, newContext, newSelector; - if (( context ? context.ownerDocument || context : preferredDoc ) !== document) { - setDocument(context); + if ( ( context ? context.ownerDocument || context : preferredDoc ) !== document ) { + setDocument( context ); } context = context || document; results = results || []; nodeType = context.nodeType; - if (typeof selector !== "string" || !selector || - nodeType !== 1 && nodeType !== 9 && nodeType !== 11) { + if ( typeof selector !== "string" || !selector || + nodeType !== 1 && nodeType !== 9 && nodeType !== 11 ) { return results; } - if (!seed && documentIsHTML) { + if ( !seed && documentIsHTML ) { // Try to shortcut find operations when possible (e.g., not under DocumentFragment) - if (nodeType !== 11 && (match = rquickExpr.exec(selector))) { + if ( nodeType !== 11 && (match = rquickExpr.exec( selector )) ) { // Speed-up: Sizzle("#ID") - if ((m = match[1])) { - if (nodeType === 9) { - elem = context.getElementById(m); + if ( (m = match[1]) ) { + if ( nodeType === 9 ) { + elem = context.getElementById( m ); // Check parentNode to catch when Blackberry 4.6 returns // nodes that are no longer in the document (jQuery #6963) - if (elem && elem.parentNode) { + if ( elem && elem.parentNode ) { // Handle the case where IE, Opera, and Webkit return items // by name instead of ID - if (elem.id === m) { - results.push(elem); + if ( elem.id === m ) { + results.push( elem ); return results; } } else { @@ -828,27 +788,27 @@ } } else { // Context is not a document - if (context.ownerDocument && (elem = context.ownerDocument.getElementById(m)) && - contains(context, elem) && elem.id === m) { - results.push(elem); + if ( context.ownerDocument && (elem = context.ownerDocument.getElementById( m )) && + contains( context, elem ) && elem.id === m ) { + results.push( elem ); return results; } } // Speed-up: Sizzle("TAG") - } else if (match[2]) { - push.apply(results, context.getElementsByTagName(selector)); + } else if ( match[2] ) { + push.apply( results, context.getElementsByTagName( selector ) ); return results; // Speed-up: Sizzle(".CLASS") - } else if ((m = match[3]) && support.getElementsByClassName) { - push.apply(results, context.getElementsByClassName(m)); + } else if ( (m = match[3]) && support.getElementsByClassName ) { + push.apply( results, context.getElementsByClassName( m ) ); return results; } } // QSA path - if (support.qsa && (!rbuggyQSA || !rbuggyQSA.test(selector))) { + if ( support.qsa && (!rbuggyQSA || !rbuggyQSA.test( selector )) ) { nid = old = expando; newContext = context; newSelector = nodeType !== 1 && selector; @@ -857,33 +817,33 @@ // We can work around this by specifying an extra ID on the root // and working up from there (Thanks to Andrew Dupont for the technique) // IE 8 doesn't work on object elements - if (nodeType === 1 && context.nodeName.toLowerCase() !== "object") { - groups = tokenize(selector); + if ( nodeType === 1 && context.nodeName.toLowerCase() !== "object" ) { + groups = tokenize( selector ); - if ((old = context.getAttribute("id"))) { - nid = old.replace(rescape, "\\$&"); + if ( (old = context.getAttribute("id")) ) { + nid = old.replace( rescape, "\\$&" ); } else { - context.setAttribute("id", nid); + context.setAttribute( "id", nid ); } nid = "[id='" + nid + "'] "; i = groups.length; - while (i--) { - groups[i] = nid + toSelector(groups[i]); + while ( i-- ) { + groups[i] = nid + toSelector( groups[i] ); } - newContext = rsibling.test(selector) && testContext(context.parentNode) || context; + newContext = rsibling.test( selector ) && testContext( context.parentNode ) || context; newSelector = groups.join(","); } - if (newSelector) { + if ( newSelector ) { try { - push.apply(results, - newContext.querySelectorAll(newSelector) + push.apply( results, + newContext.querySelectorAll( newSelector ) ); return results; - } catch (qsaError) { + } catch(qsaError) { } finally { - if (!old) { + if ( !old ) { context.removeAttribute("id"); } } @@ -892,27 +852,26 @@ } // All others - return select(selector.replace(rtrim, "$1"), context, results, seed); + return select( selector.replace( rtrim, "$1" ), context, results, seed ); } /** * Create key-value caches of limited size * @returns {Function(string, Object)} Returns the Object data after storing it on itself with - * property name the (space-suffixed) string and (if the cache is larger than Expr.cacheLength) - * deleting the oldest entry + * property name the (space-suffixed) string and (if the cache is larger than Expr.cacheLength) + * deleting the oldest entry */ function createCache() { var keys = []; - function cache(key, value) { + function cache( key, value ) { // Use (key + " ") to avoid collision with native prototype properties (see Issue #157) - if (keys.push(key + " ") > Expr.cacheLength) { + if ( keys.push( key + " " ) > Expr.cacheLength ) { // Only keep the most recent entries - delete cache[keys.shift()]; + delete cache[ keys.shift() ]; } - return (cache[key + " "] = value); + return (cache[ key + " " ] = value); } - return cache; } @@ -920,8 +879,8 @@ * Mark a function for special use by Sizzle * @param {Function} fn The function to mark */ - function markFunction(fn) { - fn[expando] = true; + function markFunction( fn ) { + fn[ expando ] = true; return fn; } @@ -929,17 +888,17 @@ * Support testing using an element * @param {Function} fn Passed the created div and expects a boolean result */ - function assert(fn) { + function assert( fn ) { var div = document.createElement("div"); try { - return !!fn(div); + return !!fn( div ); } catch (e) { return false; } finally { // Remove from its parent by default - if (div.parentNode) { - div.parentNode.removeChild(div); + if ( div.parentNode ) { + div.parentNode.removeChild( div ); } // release memory in IE div = null; @@ -951,12 +910,12 @@ * @param {String} attrs Pipe-separated list of attributes * @param {Function} handler The method that will be applied */ - function addHandle(attrs, handler) { + function addHandle( attrs, handler ) { var arr = attrs.split("|"), i = attrs.length; - while (i--) { - Expr.attrHandle[arr[i]] = handler; + while ( i-- ) { + Expr.attrHandle[ arr[i] ] = handler; } } @@ -966,21 +925,21 @@ * @param {Element} b * @returns {Number} Returns less than 0 if a precedes b, greater than 0 if a follows b */ - function siblingCheck(a, b) { + function siblingCheck( a, b ) { var cur = b && a, diff = cur && a.nodeType === 1 && b.nodeType === 1 && ( ~b.sourceIndex || MAX_NEGATIVE ) - ( ~a.sourceIndex || MAX_NEGATIVE ); // Use IE sourceIndex if available on both nodes - if (diff) { + if ( diff ) { return diff; } // Check if b follows a - if (cur) { - while ((cur = cur.nextSibling)) { - if (cur === b) { + if ( cur ) { + while ( (cur = cur.nextSibling) ) { + if ( cur === b ) { return -1; } } @@ -993,8 +952,8 @@ * Returns a function to use in pseudos for input types * @param {String} type */ - function createInputPseudo(type) { - return function (elem) { + function createInputPseudo( type ) { + return function( elem ) { var name = elem.nodeName.toLowerCase(); return name === "input" && elem.type === type; }; @@ -1004,8 +963,8 @@ * Returns a function to use in pseudos for buttons * @param {String} type */ - function createButtonPseudo(type) { - return function (elem) { + function createButtonPseudo( type ) { + return function( elem ) { var name = elem.nodeName.toLowerCase(); return (name === "input" || name === "button") && elem.type === type; }; @@ -1015,17 +974,17 @@ * Returns a function to use in pseudos for positionals * @param {Function} fn */ - function createPositionalPseudo(fn) { - return markFunction(function (argument) { + function createPositionalPseudo( fn ) { + return markFunction(function( argument ) { argument = +argument; - return markFunction(function (seed, matches) { + return markFunction(function( seed, matches ) { var j, - matchIndexes = fn([], seed.length, argument), + matchIndexes = fn( [], seed.length, argument ), i = matchIndexes.length; // Match elements found at the specified indexes - while (i--) { - if (seed[(j = matchIndexes[i])]) { + while ( i-- ) { + if ( seed[ (j = matchIndexes[i]) ] ) { seed[j] = !(matches[j] = seed[j]); } } @@ -1038,7 +997,7 @@ * @param {Element|Object=} context * @returns {Element|Object|Boolean} The input node if acceptable, otherwise a falsy value */ - function testContext(context) { + function testContext( context ) { return context && typeof context.getElementsByTagName !== "undefined" && context; } @@ -1050,7 +1009,7 @@ * @param {Element|Object} elem An element or a document * @returns {Boolean} True iff elem is a non-HTML XML node */ - isXML = Sizzle.isXML = function (elem) { + isXML = Sizzle.isXML = function( elem ) { // documentElement is verified for cases where it doesn't yet exist // (such as loading iframes in IE - #4833) var documentElement = elem && (elem.ownerDocument || elem).documentElement; @@ -1062,12 +1021,12 @@ * @param {Element|Object} [doc] An element or document object to use to set the document * @returns {Object} Returns the current document */ - setDocument = Sizzle.setDocument = function (node) { + setDocument = Sizzle.setDocument = function( node ) { var hasCompare, parent, doc = node ? node.ownerDocument || node : preferredDoc; // If no document and documentElement is available, return - if (doc === document || doc.nodeType !== 9 || !doc.documentElement) { + if ( doc === document || doc.nodeType !== 9 || !doc.documentElement ) { return document; } @@ -1080,18 +1039,18 @@ // If iframe document is assigned to "document" variable and if iframe has been reloaded, // IE will throw "permission denied" error when accessing "document" variable, see jQuery #13936 // IE6-8 do not support the defaultView property so parent will be undefined - if (parent && parent !== parent.top) { + if ( parent && parent !== parent.top ) { // IE11 does not have attachEvent, so all must suffer - if (parent.addEventListener) { - parent.addEventListener("unload", unloadHandler, false); - } else if (parent.attachEvent) { - parent.attachEvent("onunload", unloadHandler); + if ( parent.addEventListener ) { + parent.addEventListener( "unload", unloadHandler, false ); + } else if ( parent.attachEvent ) { + parent.attachEvent( "onunload", unloadHandler ); } } /* Support tests ---------------------------------------------------------------------- */ - documentIsHTML = !isXML(doc); + documentIsHTML = !isXML( doc ); /* Attributes ---------------------------------------------------------------------- */ @@ -1099,7 +1058,7 @@ // Support: IE<8 // Verify that getAttribute really returns attributes and not properties // (excepting IE8 booleans) - support.attributes = assert(function (div) { + support.attributes = assert(function( div ) { div.className = "i"; return !div.getAttribute("className"); }); @@ -1108,36 +1067,36 @@ ---------------------------------------------------------------------- */ // Check if getElementsByTagName("*") returns only elements - support.getElementsByTagName = assert(function (div) { - div.appendChild(doc.createComment("")); + support.getElementsByTagName = assert(function( div ) { + div.appendChild( doc.createComment("") ); return !div.getElementsByTagName("*").length; }); // Support: IE<9 - support.getElementsByClassName = rnative.test(doc.getElementsByClassName); + support.getElementsByClassName = rnative.test( doc.getElementsByClassName ); // Support: IE<10 // Check if getElementById returns elements by name // The broken getElementById methods don't pick up programatically-set names, // so use a roundabout getElementsByName test - support.getById = assert(function (div) { - docElem.appendChild(div).id = expando; - return !doc.getElementsByName || !doc.getElementsByName(expando).length; + support.getById = assert(function( div ) { + docElem.appendChild( div ).id = expando; + return !doc.getElementsByName || !doc.getElementsByName( expando ).length; }); // ID find and filter - if (support.getById) { - Expr.find["ID"] = function (id, context) { - if (typeof context.getElementById !== "undefined" && documentIsHTML) { - var m = context.getElementById(id); + if ( support.getById ) { + Expr.find["ID"] = function( id, context ) { + if ( typeof context.getElementById !== "undefined" && documentIsHTML ) { + var m = context.getElementById( id ); // Check parentNode to catch when Blackberry 4.6 returns // nodes that are no longer in the document #6963 - return m && m.parentNode ? [m] : []; + return m && m.parentNode ? [ m ] : []; } }; - Expr.filter["ID"] = function (id) { - var attrId = id.replace(runescape, funescape); - return function (elem) { + Expr.filter["ID"] = function( id ) { + var attrId = id.replace( runescape, funescape ); + return function( elem ) { return elem.getAttribute("id") === attrId; }; }; @@ -1146,9 +1105,9 @@ // getElementById is not reliable as a find shortcut delete Expr.find["ID"]; - Expr.filter["ID"] = function (id) { - var attrId = id.replace(runescape, funescape); - return function (elem) { + Expr.filter["ID"] = function( id ) { + var attrId = id.replace( runescape, funescape ); + return function( elem ) { var node = typeof elem.getAttributeNode !== "undefined" && elem.getAttributeNode("id"); return node && node.value === attrId; }; @@ -1157,28 +1116,28 @@ // Tag Expr.find["TAG"] = support.getElementsByTagName ? - function (tag, context) { - if (typeof context.getElementsByTagName !== "undefined") { - return context.getElementsByTagName(tag); + function( tag, context ) { + if ( typeof context.getElementsByTagName !== "undefined" ) { + return context.getElementsByTagName( tag ); // DocumentFragment nodes don't have gEBTN - } else if (support.qsa) { - return context.querySelectorAll(tag); + } else if ( support.qsa ) { + return context.querySelectorAll( tag ); } } : - function (tag, context) { + function( tag, context ) { var elem, tmp = [], i = 0, // By happy coincidence, a (broken) gEBTN appears on DocumentFragment nodes too - results = context.getElementsByTagName(tag); + results = context.getElementsByTagName( tag ); // Filter out possible comments - if (tag === "*") { - while ((elem = results[i++])) { - if (elem.nodeType === 1) { - tmp.push(elem); + if ( tag === "*" ) { + while ( (elem = results[i++]) ) { + if ( elem.nodeType === 1 ) { + tmp.push( elem ); } } @@ -1188,9 +1147,9 @@ }; // Class - Expr.find["CLASS"] = support.getElementsByClassName && function (className, context) { - if (documentIsHTML) { - return context.getElementsByClassName(className); + Expr.find["CLASS"] = support.getElementsByClassName && function( className, context ) { + if ( documentIsHTML ) { + return context.getElementsByClassName( className ); } }; @@ -1209,16 +1168,16 @@ // See http://bugs.jquery.com/ticket/13378 rbuggyQSA = []; - if ((support.qsa = rnative.test(doc.querySelectorAll))) { + if ( (support.qsa = rnative.test( doc.querySelectorAll )) ) { // Build QSA regex // Regex strategy adopted from Diego Perini - assert(function (div) { + assert(function( div ) { // Select is set to empty string on purpose // This is to test IE's treatment of not explicitly // setting a boolean content attribute, // since its presence should be enough // http://bugs.jquery.com/ticket/12359 - docElem.appendChild(div).innerHTML = "" + + docElem.appendChild( div ).innerHTML = "" + ""; @@ -1226,53 +1185,53 @@ // Nothing should be selected when empty strings follow ^= or $= or *= // The test attribute must be unknown in Opera but "safe" for WinRT // http://msdn.microsoft.com/en-us/library/ie/hh465388.aspx#attribute_section - if (div.querySelectorAll("[msallowcapture^='']").length) { - rbuggyQSA.push("[*^$]=" + whitespace + "*(?:''|\"\")"); + if ( div.querySelectorAll("[msallowcapture^='']").length ) { + rbuggyQSA.push( "[*^$]=" + whitespace + "*(?:''|\"\")" ); } // Support: IE8 // Boolean attributes and "value" are not treated correctly - if (!div.querySelectorAll("[selected]").length) { - rbuggyQSA.push("\\[" + whitespace + "*(?:value|" + booleans + ")"); + if ( !div.querySelectorAll("[selected]").length ) { + rbuggyQSA.push( "\\[" + whitespace + "*(?:value|" + booleans + ")" ); } // Support: Chrome<29, Android<4.2+, Safari<7.0+, iOS<7.0+, PhantomJS<1.9.7+ - if (!div.querySelectorAll("[id~=" + expando + "-]").length) { + if ( !div.querySelectorAll( "[id~=" + expando + "-]" ).length ) { rbuggyQSA.push("~="); } // Webkit/Opera - :checked should return selected option elements // http://www.w3.org/TR/2011/REC-css3-selectors-20110929/#checked // IE8 throws error here and will not see later tests - if (!div.querySelectorAll(":checked").length) { + if ( !div.querySelectorAll(":checked").length ) { rbuggyQSA.push(":checked"); } // Support: Safari 8+, iOS 8+ // https://bugs.webkit.org/show_bug.cgi?id=136851 // In-page `selector#id sibing-combinator selector` fails - if (!div.querySelectorAll("a#" + expando + "+*").length) { + if ( !div.querySelectorAll( "a#" + expando + "+*" ).length ) { rbuggyQSA.push(".#.+[+~]"); } }); - assert(function (div) { + assert(function( div ) { // Support: Windows 8 Native Apps // The type and name attributes are restricted during .innerHTML assignment var input = doc.createElement("input"); - input.setAttribute("type", "hidden"); - div.appendChild(input).setAttribute("name", "D"); + input.setAttribute( "type", "hidden" ); + div.appendChild( input ).setAttribute( "name", "D" ); // Support: IE8 // Enforce case-sensitivity of name attribute - if (div.querySelectorAll("[name=d]").length) { - rbuggyQSA.push("name" + whitespace + "*[*^$|!~]?="); + if ( div.querySelectorAll("[name=d]").length ) { + rbuggyQSA.push( "name" + whitespace + "*[*^$|!~]?=" ); } // FF 3.5 - :enabled/:disabled and hidden elements (hidden elements are still enabled) // IE8 throws error here and will not see later tests - if (!div.querySelectorAll(":enabled").length) { - rbuggyQSA.push(":enabled", ":disabled"); + if ( !div.querySelectorAll(":enabled").length ) { + rbuggyQSA.push( ":enabled", ":disabled" ); } // Opera 10-11 does not throw on post-comma invalid pseudos @@ -1281,48 +1240,48 @@ }); } - if ((support.matchesSelector = rnative.test((matches = docElem.matches || + if ( (support.matchesSelector = rnative.test( (matches = docElem.matches || docElem.webkitMatchesSelector || docElem.mozMatchesSelector || docElem.oMatchesSelector || - docElem.msMatchesSelector)))) { + docElem.msMatchesSelector) )) ) { - assert(function (div) { + assert(function( div ) { // Check to see if it's possible to do matchesSelector // on a disconnected node (IE 9) - support.disconnectedMatch = matches.call(div, "div"); + support.disconnectedMatch = matches.call( div, "div" ); // This should fail with an exception // Gecko does not error, returns false instead - matches.call(div, "[s!='']:x"); - rbuggyMatches.push("!=", pseudos); + matches.call( div, "[s!='']:x" ); + rbuggyMatches.push( "!=", pseudos ); }); } - rbuggyQSA = rbuggyQSA.length && new RegExp(rbuggyQSA.join("|")); - rbuggyMatches = rbuggyMatches.length && new RegExp(rbuggyMatches.join("|")); + rbuggyQSA = rbuggyQSA.length && new RegExp( rbuggyQSA.join("|") ); + rbuggyMatches = rbuggyMatches.length && new RegExp( rbuggyMatches.join("|") ); /* Contains ---------------------------------------------------------------------- */ - hasCompare = rnative.test(docElem.compareDocumentPosition); + hasCompare = rnative.test( docElem.compareDocumentPosition ); // Element contains another // Purposefully does not implement inclusive descendent // As in, an element does not contain itself - contains = hasCompare || rnative.test(docElem.contains) ? - function (a, b) { + contains = hasCompare || rnative.test( docElem.contains ) ? + function( a, b ) { var adown = a.nodeType === 9 ? a.documentElement : a, bup = b && b.parentNode; return a === bup || !!( bup && bup.nodeType === 1 && ( adown.contains ? - adown.contains(bup) : - a.compareDocumentPosition && a.compareDocumentPosition(bup) & 16 + adown.contains( bup ) : + a.compareDocumentPosition && a.compareDocumentPosition( bup ) & 16 )); } : - function (a, b) { - if (b) { - while ((b = b.parentNode)) { - if (b === a) { + function( a, b ) { + if ( b ) { + while ( (b = b.parentNode) ) { + if ( b === a ) { return true; } } @@ -1335,50 +1294,50 @@ // Document order sorting sortOrder = hasCompare ? - function (a, b) { + function( a, b ) { // Flag for duplicate removal - if (a === b) { + if ( a === b ) { hasDuplicate = true; return 0; } // Sort on method existence if only one input has compareDocumentPosition var compare = !a.compareDocumentPosition - !b.compareDocumentPosition; - if (compare) { + if ( compare ) { return compare; } // Calculate position if both inputs belong to the same document compare = ( a.ownerDocument || a ) === ( b.ownerDocument || b ) ? - a.compareDocumentPosition(b) : + a.compareDocumentPosition( b ) : // Otherwise we know they are disconnected 1; // Disconnected nodes - if (compare & 1 || - (!support.sortDetached && b.compareDocumentPosition(a) === compare)) { + if ( compare & 1 || + (!support.sortDetached && b.compareDocumentPosition( a ) === compare) ) { // Choose the first element that is related to our preferred document - if (a === doc || a.ownerDocument === preferredDoc && contains(preferredDoc, a)) { + if ( a === doc || a.ownerDocument === preferredDoc && contains(preferredDoc, a) ) { return -1; } - if (b === doc || b.ownerDocument === preferredDoc && contains(preferredDoc, b)) { + if ( b === doc || b.ownerDocument === preferredDoc && contains(preferredDoc, b) ) { return 1; } // Maintain original order return sortInput ? - ( indexOf(sortInput, a) - indexOf(sortInput, b) ) : + ( indexOf( sortInput, a ) - indexOf( sortInput, b ) ) : 0; } return compare & 4 ? -1 : 1; } : - function (a, b) { + function( a, b ) { // Exit early if the nodes are identical - if (a === b) { + if ( a === b ) { hasDuplicate = true; return 0; } @@ -1387,42 +1346,42 @@ i = 0, aup = a.parentNode, bup = b.parentNode, - ap = [a], - bp = [b]; + ap = [ a ], + bp = [ b ]; // Parentless nodes are either documents or disconnected - if (!aup || !bup) { + if ( !aup || !bup ) { return a === doc ? -1 : b === doc ? 1 : aup ? -1 : bup ? 1 : sortInput ? - ( indexOf(sortInput, a) - indexOf(sortInput, b) ) : + ( indexOf( sortInput, a ) - indexOf( sortInput, b ) ) : 0; // If the nodes are siblings, we can do a quick check - } else if (aup === bup) { - return siblingCheck(a, b); + } else if ( aup === bup ) { + return siblingCheck( a, b ); } // Otherwise we need full lists of their ancestors for comparison cur = a; - while ((cur = cur.parentNode)) { - ap.unshift(cur); + while ( (cur = cur.parentNode) ) { + ap.unshift( cur ); } cur = b; - while ((cur = cur.parentNode)) { - bp.unshift(cur); + while ( (cur = cur.parentNode) ) { + bp.unshift( cur ); } // Walk down the tree looking for a discrepancy - while (ap[i] === bp[i]) { + while ( ap[i] === bp[i] ) { i++; } return i ? // Do a sibling check if the nodes have a common ancestor - siblingCheck(ap[i], bp[i]) : + siblingCheck( ap[i], bp[i] ) : // Otherwise nodes in our document sort first ap[i] === preferredDoc ? -1 : @@ -1433,78 +1392,77 @@ return doc; }; - Sizzle.matches = function (expr, elements) { - return Sizzle(expr, null, null, elements); + Sizzle.matches = function( expr, elements ) { + return Sizzle( expr, null, null, elements ); }; - Sizzle.matchesSelector = function (elem, expr) { + Sizzle.matchesSelector = function( elem, expr ) { // Set document vars if needed - if (( elem.ownerDocument || elem ) !== document) { - setDocument(elem); + if ( ( elem.ownerDocument || elem ) !== document ) { + setDocument( elem ); } // Make sure that attribute selectors are quoted - expr = expr.replace(rattributeQuotes, "='$1']"); + expr = expr.replace( rattributeQuotes, "='$1']" ); - if (support.matchesSelector && documentIsHTML && - ( !rbuggyMatches || !rbuggyMatches.test(expr) ) && - ( !rbuggyQSA || !rbuggyQSA.test(expr) )) { + if ( support.matchesSelector && documentIsHTML && + ( !rbuggyMatches || !rbuggyMatches.test( expr ) ) && + ( !rbuggyQSA || !rbuggyQSA.test( expr ) ) ) { try { - var ret = matches.call(elem, expr); + var ret = matches.call( elem, expr ); // IE 9's matchesSelector returns false on disconnected nodes - if (ret || support.disconnectedMatch || + if ( ret || support.disconnectedMatch || // As well, disconnected nodes are said to be in a document // fragment in IE 9 - elem.document && elem.document.nodeType !== 11) { + elem.document && elem.document.nodeType !== 11 ) { return ret; } - } catch (e) { - } + } catch (e) {} } - return Sizzle(expr, document, null, [elem]).length > 0; + return Sizzle( expr, document, null, [ elem ] ).length > 0; }; - Sizzle.contains = function (context, elem) { + Sizzle.contains = function( context, elem ) { // Set document vars if needed - if (( context.ownerDocument || context ) !== document) { - setDocument(context); + if ( ( context.ownerDocument || context ) !== document ) { + setDocument( context ); } - return contains(context, elem); + return contains( context, elem ); }; - Sizzle.attr = function (elem, name) { + Sizzle.attr = function( elem, name ) { // Set document vars if needed - if (( elem.ownerDocument || elem ) !== document) { - setDocument(elem); + if ( ( elem.ownerDocument || elem ) !== document ) { + setDocument( elem ); } - var fn = Expr.attrHandle[name.toLowerCase()], + var fn = Expr.attrHandle[ name.toLowerCase() ], // Don't get fooled by Object.prototype properties (jQuery #13807) - val = fn && hasOwn.call(Expr.attrHandle, name.toLowerCase()) ? - fn(elem, name, !documentIsHTML) : + val = fn && hasOwn.call( Expr.attrHandle, name.toLowerCase() ) ? + fn( elem, name, !documentIsHTML ) : undefined; return val !== undefined ? val : support.attributes || !documentIsHTML ? - elem.getAttribute(name) : + elem.getAttribute( name ) : (val = elem.getAttributeNode(name)) && val.specified ? val.value : null; }; - Sizzle.error = function (msg) { - throw new Error("Syntax error, unrecognized expression: " + msg); + Sizzle.error = function( msg ) { + throw new Error( "Syntax error, unrecognized expression: " + msg ); }; /** * Document sorting and removing duplicates * @param {ArrayLike} results */ - Sizzle.uniqueSort = function (results) { + Sizzle.uniqueSort = function( results ) { var elem, duplicates = [], j = 0, @@ -1512,17 +1470,17 @@ // Unless we *know* we can detect duplicates, assume their presence hasDuplicate = !support.detectDuplicates; - sortInput = !support.sortStable && results.slice(0); - results.sort(sortOrder); + sortInput = !support.sortStable && results.slice( 0 ); + results.sort( sortOrder ); - if (hasDuplicate) { - while ((elem = results[i++])) { - if (elem === results[i]) { - j = duplicates.push(i); + if ( hasDuplicate ) { + while ( (elem = results[i++]) ) { + if ( elem === results[ i ] ) { + j = duplicates.push( i ); } } - while (j--) { - results.splice(duplicates[j], 1); + while ( j-- ) { + results.splice( duplicates[ j ], 1 ); } } @@ -1537,30 +1495,30 @@ * Utility function for retrieving the text value of an array of DOM nodes * @param {Array|Element} elem */ - getText = Sizzle.getText = function (elem) { + getText = Sizzle.getText = function( elem ) { var node, ret = "", i = 0, nodeType = elem.nodeType; - if (!nodeType) { + if ( !nodeType ) { // If no nodeType, this is expected to be an array - while ((node = elem[i++])) { + while ( (node = elem[i++]) ) { // Do not traverse comment nodes - ret += getText(node); + ret += getText( node ); } - } else if (nodeType === 1 || nodeType === 9 || nodeType === 11) { + } else if ( nodeType === 1 || nodeType === 9 || nodeType === 11 ) { // Use textContent for elements // innerText usage removed for consistency of new lines (jQuery #11153) - if (typeof elem.textContent === "string") { + if ( typeof elem.textContent === "string" ) { return elem.textContent; } else { // Traverse its children - for (elem = elem.firstChild; elem; elem = elem.nextSibling) { - ret += getText(elem); + for ( elem = elem.firstChild; elem; elem = elem.nextSibling ) { + ret += getText( elem ); } } - } else if (nodeType === 3 || nodeType === 4) { + } else if ( nodeType === 3 || nodeType === 4 ) { return elem.nodeValue; } // Do not include comment or processing instruction nodes @@ -1582,27 +1540,27 @@ find: {}, relative: { - ">": {dir: "parentNode", first: true}, - " ": {dir: "parentNode"}, - "+": {dir: "previousSibling", first: true}, - "~": {dir: "previousSibling"} + ">": { dir: "parentNode", first: true }, + " ": { dir: "parentNode" }, + "+": { dir: "previousSibling", first: true }, + "~": { dir: "previousSibling" } }, preFilter: { - "ATTR": function (match) { - match[1] = match[1].replace(runescape, funescape); + "ATTR": function( match ) { + match[1] = match[1].replace( runescape, funescape ); // Move the given value to match[3] whether quoted or unquoted - match[3] = ( match[3] || match[4] || match[5] || "" ).replace(runescape, funescape); + match[3] = ( match[3] || match[4] || match[5] || "" ).replace( runescape, funescape ); - if (match[2] === "~=") { + if ( match[2] === "~=" ) { match[3] = " " + match[3] + " "; } - return match.slice(0, 4); + return match.slice( 0, 4 ); }, - "CHILD": function (match) { + "CHILD": function( match ) { /* matches from matchExpr["CHILD"] 1 type (only|nth|...) 2 what (child|of-type) @@ -1615,10 +1573,10 @@ */ match[1] = match[1].toLowerCase(); - if (match[1].slice(0, 3) === "nth") { + if ( match[1].slice( 0, 3 ) === "nth" ) { // nth-* requires argument - if (!match[3]) { - Sizzle.error(match[0]); + if ( !match[3] ) { + Sizzle.error( match[0] ); } // numeric x and y parameters for Expr.filter.CHILD @@ -1627,73 +1585,71 @@ match[5] = +( ( match[7] + match[8] ) || match[3] === "odd" ); // other types prohibit arguments - } else if (match[3]) { - Sizzle.error(match[0]); + } else if ( match[3] ) { + Sizzle.error( match[0] ); } return match; }, - "PSEUDO": function (match) { + "PSEUDO": function( match ) { var excess, unquoted = !match[6] && match[2]; - if (matchExpr["CHILD"].test(match[0])) { + if ( matchExpr["CHILD"].test( match[0] ) ) { return null; } // Accept quoted arguments as-is - if (match[3]) { + if ( match[3] ) { match[2] = match[4] || match[5] || ""; // Strip excess characters from unquoted arguments - } else if (unquoted && rpseudo.test(unquoted) && + } else if ( unquoted && rpseudo.test( unquoted ) && // Get excess from tokenize (recursively) - (excess = tokenize(unquoted, true)) && + (excess = tokenize( unquoted, true )) && // advance to the next closing parenthesis - (excess = unquoted.indexOf(")", unquoted.length - excess) - unquoted.length)) { + (excess = unquoted.indexOf( ")", unquoted.length - excess ) - unquoted.length) ) { // excess is a negative index - match[0] = match[0].slice(0, excess); - match[2] = unquoted.slice(0, excess); + match[0] = match[0].slice( 0, excess ); + match[2] = unquoted.slice( 0, excess ); } // Return only captures needed by the pseudo filter method (type and argument) - return match.slice(0, 3); + return match.slice( 0, 3 ); } }, filter: { - "TAG": function (nodeNameSelector) { - var nodeName = nodeNameSelector.replace(runescape, funescape).toLowerCase(); + "TAG": function( nodeNameSelector ) { + var nodeName = nodeNameSelector.replace( runescape, funescape ).toLowerCase(); return nodeNameSelector === "*" ? - function () { - return true; - } : - function (elem) { + function() { return true; } : + function( elem ) { return elem.nodeName && elem.nodeName.toLowerCase() === nodeName; }; }, - "CLASS": function (className) { - var pattern = classCache[className + " "]; + "CLASS": function( className ) { + var pattern = classCache[ className + " " ]; return pattern || - (pattern = new RegExp("(^|" + whitespace + ")" + className + "(" + whitespace + "|$)")) && - classCache(className, function (elem) { - return pattern.test(typeof elem.className === "string" && elem.className || typeof elem.getAttribute !== "undefined" && elem.getAttribute("class") || ""); + (pattern = new RegExp( "(^|" + whitespace + ")" + className + "(" + whitespace + "|$)" )) && + classCache( className, function( elem ) { + return pattern.test( typeof elem.className === "string" && elem.className || typeof elem.getAttribute !== "undefined" && elem.getAttribute("class") || "" ); }); }, - "ATTR": function (name, operator, check) { - return function (elem) { - var result = Sizzle.attr(elem, name); + "ATTR": function( name, operator, check ) { + return function( elem ) { + var result = Sizzle.attr( elem, name ); - if (result == null) { + if ( result == null ) { return operator === "!="; } - if (!operator) { + if ( !operator ) { return true; } @@ -1701,42 +1657,42 @@ return operator === "=" ? result === check : operator === "!=" ? result !== check : - operator === "^=" ? check && result.indexOf(check) === 0 : - operator === "*=" ? check && result.indexOf(check) > -1 : - operator === "$=" ? check && result.slice(-check.length) === check : - operator === "~=" ? ( " " + result.replace(rwhitespace, " ") + " " ).indexOf(check) > -1 : - operator === "|=" ? result === check || result.slice(0, check.length + 1) === check + "-" : + operator === "^=" ? check && result.indexOf( check ) === 0 : + operator === "*=" ? check && result.indexOf( check ) > -1 : + operator === "$=" ? check && result.slice( -check.length ) === check : + operator === "~=" ? ( " " + result.replace( rwhitespace, " " ) + " " ).indexOf( check ) > -1 : + operator === "|=" ? result === check || result.slice( 0, check.length + 1 ) === check + "-" : false; }; }, - "CHILD": function (type, what, argument, first, last) { - var simple = type.slice(0, 3) !== "nth", - forward = type.slice(-4) !== "last", + "CHILD": function( type, what, argument, first, last ) { + var simple = type.slice( 0, 3 ) !== "nth", + forward = type.slice( -4 ) !== "last", ofType = what === "of-type"; return first === 1 && last === 0 ? // Shortcut for :nth-*(n) - function (elem) { + function( elem ) { return !!elem.parentNode; } : - function (elem, context, xml) { + function( elem, context, xml ) { var cache, outerCache, node, diff, nodeIndex, start, dir = simple !== forward ? "nextSibling" : "previousSibling", parent = elem.parentNode, name = ofType && elem.nodeName.toLowerCase(), useCache = !xml && !ofType; - if (parent) { + if ( parent ) { // :(first|last|only)-(child|of-type) - if (simple) { - while (dir) { + if ( simple ) { + while ( dir ) { node = elem; - while ((node = node[dir])) { - if (ofType ? node.nodeName.toLowerCase() === name : node.nodeType === 1) { + while ( (node = node[ dir ]) ) { + if ( ofType ? node.nodeName.toLowerCase() === name : node.nodeType === 1 ) { return false; } } @@ -1746,46 +1702,46 @@ return true; } - start = [forward ? parent.firstChild : parent.lastChild]; + start = [ forward ? parent.firstChild : parent.lastChild ]; // non-xml :nth-child(...) stores cache data on `parent` - if (forward && useCache) { + if ( forward && useCache ) { // Seek `elem` from a previously-cached index - outerCache = parent[expando] || (parent[expando] = {}); - cache = outerCache[type] || []; + outerCache = parent[ expando ] || (parent[ expando ] = {}); + cache = outerCache[ type ] || []; nodeIndex = cache[0] === dirruns && cache[1]; diff = cache[0] === dirruns && cache[2]; - node = nodeIndex && parent.childNodes[nodeIndex]; + node = nodeIndex && parent.childNodes[ nodeIndex ]; - while ((node = ++nodeIndex && node && node[dir] || + while ( (node = ++nodeIndex && node && node[ dir ] || // Fallback to seeking `elem` from the start - (diff = nodeIndex = 0) || start.pop())) { + (diff = nodeIndex = 0) || start.pop()) ) { // When found, cache indexes on `parent` and break - if (node.nodeType === 1 && ++diff && node === elem) { - outerCache[type] = [dirruns, nodeIndex, diff]; + if ( node.nodeType === 1 && ++diff && node === elem ) { + outerCache[ type ] = [ dirruns, nodeIndex, diff ]; break; } } // Use previously-cached element index if available - } else if (useCache && (cache = (elem[expando] || (elem[expando] = {}))[type]) && cache[0] === dirruns) { + } else if ( useCache && (cache = (elem[ expando ] || (elem[ expando ] = {}))[ type ]) && cache[0] === dirruns ) { diff = cache[1]; // xml :nth-child(...) or :nth-last-child(...) or :nth(-last)?-of-type(...) } else { // Use the same loop as above to seek `elem` from the start - while ((node = ++nodeIndex && node && node[dir] || - (diff = nodeIndex = 0) || start.pop())) { + while ( (node = ++nodeIndex && node && node[ dir ] || + (diff = nodeIndex = 0) || start.pop()) ) { - if (( ofType ? node.nodeName.toLowerCase() === name : node.nodeType === 1 ) && ++diff) { + if ( ( ofType ? node.nodeName.toLowerCase() === name : node.nodeType === 1 ) && ++diff ) { // Cache the index of each encountered element - if (useCache) { - (node[expando] || (node[expando] = {}))[type] = [dirruns, diff]; + if ( useCache ) { + (node[ expando ] || (node[ expando ] = {}))[ type ] = [ dirruns, diff ]; } - if (node === elem) { + if ( node === elem ) { break; } } @@ -1799,37 +1755,37 @@ }; }, - "PSEUDO": function (pseudo, argument) { + "PSEUDO": function( pseudo, argument ) { // pseudo-class names are case-insensitive // http://www.w3.org/TR/selectors/#pseudo-classes // Prioritize by case sensitivity in case custom pseudos are added with uppercase letters // Remember that setFilters inherits from pseudos var args, - fn = Expr.pseudos[pseudo] || Expr.setFilters[pseudo.toLowerCase()] || - Sizzle.error("unsupported pseudo: " + pseudo); + fn = Expr.pseudos[ pseudo ] || Expr.setFilters[ pseudo.toLowerCase() ] || + Sizzle.error( "unsupported pseudo: " + pseudo ); // The user may use createPseudo to indicate that // arguments are needed to create the filter function // just as Sizzle does - if (fn[expando]) { - return fn(argument); + if ( fn[ expando ] ) { + return fn( argument ); } // But maintain support for old signatures - if (fn.length > 1) { - args = [pseudo, pseudo, "", argument]; - return Expr.setFilters.hasOwnProperty(pseudo.toLowerCase()) ? - markFunction(function (seed, matches) { + if ( fn.length > 1 ) { + args = [ pseudo, pseudo, "", argument ]; + return Expr.setFilters.hasOwnProperty( pseudo.toLowerCase() ) ? + markFunction(function( seed, matches ) { var idx, - matched = fn(seed, argument), + matched = fn( seed, argument ), i = matched.length; - while (i--) { - idx = indexOf(seed, matched[i]); - seed[idx] = !( matches[idx] = matched[i] ); + while ( i-- ) { + idx = indexOf( seed, matched[i] ); + seed[ idx ] = !( matches[ idx ] = matched[i] ); } }) : - function (elem) { - return fn(elem, 0, args); + function( elem ) { + return fn( elem, 0, args ); }; } @@ -1839,46 +1795,46 @@ pseudos: { // Potentially complex pseudos - "not": markFunction(function (selector) { + "not": markFunction(function( selector ) { // Trim the selector passed to compile // to avoid treating leading and trailing // spaces as combinators var input = [], results = [], - matcher = compile(selector.replace(rtrim, "$1")); + matcher = compile( selector.replace( rtrim, "$1" ) ); - return matcher[expando] ? - markFunction(function (seed, matches, context, xml) { + return matcher[ expando ] ? + markFunction(function( seed, matches, context, xml ) { var elem, - unmatched = matcher(seed, null, xml, []), + unmatched = matcher( seed, null, xml, [] ), i = seed.length; // Match elements unmatched by `matcher` - while (i--) { - if ((elem = unmatched[i])) { + while ( i-- ) { + if ( (elem = unmatched[i]) ) { seed[i] = !(matches[i] = elem); } } }) : - function (elem, context, xml) { + function( elem, context, xml ) { input[0] = elem; - matcher(input, null, xml, results); + matcher( input, null, xml, results ); // Don't keep the element (issue #299) input[0] = null; return !results.pop(); }; }), - "has": markFunction(function (selector) { - return function (elem) { - return Sizzle(selector, elem).length > 0; + "has": markFunction(function( selector ) { + return function( elem ) { + return Sizzle( selector, elem ).length > 0; }; }), - "contains": markFunction(function (text) { - text = text.replace(runescape, funescape); - return function (elem) { - return ( elem.textContent || elem.innerText || getText(elem) ).indexOf(text) > -1; + "contains": markFunction(function( text ) { + text = text.replace( runescape, funescape ); + return function( elem ) { + return ( elem.textContent || elem.innerText || getText( elem ) ).indexOf( text ) > -1; }; }), @@ -1889,61 +1845,61 @@ // The matching of C against the element's language value is performed case-insensitively. // The identifier C does not have to be a valid language name." // http://www.w3.org/TR/selectors/#lang-pseudo - "lang": markFunction(function (lang) { + "lang": markFunction( function( lang ) { // lang value must be a valid identifier - if (!ridentifier.test(lang || "")) { - Sizzle.error("unsupported lang: " + lang); + if ( !ridentifier.test(lang || "") ) { + Sizzle.error( "unsupported lang: " + lang ); } - lang = lang.replace(runescape, funescape).toLowerCase(); - return function (elem) { + lang = lang.replace( runescape, funescape ).toLowerCase(); + return function( elem ) { var elemLang; do { - if ((elemLang = documentIsHTML ? + if ( (elemLang = documentIsHTML ? elem.lang : - elem.getAttribute("xml:lang") || elem.getAttribute("lang"))) { + elem.getAttribute("xml:lang") || elem.getAttribute("lang")) ) { elemLang = elemLang.toLowerCase(); - return elemLang === lang || elemLang.indexOf(lang + "-") === 0; + return elemLang === lang || elemLang.indexOf( lang + "-" ) === 0; } - } while ((elem = elem.parentNode) && elem.nodeType === 1); + } while ( (elem = elem.parentNode) && elem.nodeType === 1 ); return false; }; }), // Miscellaneous - "target": function (elem) { + "target": function( elem ) { var hash = window.location && window.location.hash; - return hash && hash.slice(1) === elem.id; + return hash && hash.slice( 1 ) === elem.id; }, - "root": function (elem) { + "root": function( elem ) { return elem === docElem; }, - "focus": function (elem) { + "focus": function( elem ) { return elem === document.activeElement && (!document.hasFocus || document.hasFocus()) && !!(elem.type || elem.href || ~elem.tabIndex); }, // Boolean properties - "enabled": function (elem) { + "enabled": function( elem ) { return elem.disabled === false; }, - "disabled": function (elem) { + "disabled": function( elem ) { return elem.disabled === true; }, - "checked": function (elem) { + "checked": function( elem ) { // In CSS3, :checked should return both checked and selected elements // http://www.w3.org/TR/2011/REC-css3-selectors-20110929/#checked var nodeName = elem.nodeName.toLowerCase(); return (nodeName === "input" && !!elem.checked) || (nodeName === "option" && !!elem.selected); }, - "selected": function (elem) { + "selected": function( elem ) { // Accessing this property makes selected-by-default // options in Safari work properly - if (elem.parentNode) { + if ( elem.parentNode ) { elem.parentNode.selectedIndex; } @@ -1951,38 +1907,38 @@ }, // Contents - "empty": function (elem) { + "empty": function( elem ) { // http://www.w3.org/TR/selectors/#empty-pseudo // :empty is negated by element (1) or content nodes (text: 3; cdata: 4; entity ref: 5), // but not by others (comment: 8; processing instruction: 7; etc.) // nodeType < 6 works because attributes (2) do not appear as children - for (elem = elem.firstChild; elem; elem = elem.nextSibling) { - if (elem.nodeType < 6) { + for ( elem = elem.firstChild; elem; elem = elem.nextSibling ) { + if ( elem.nodeType < 6 ) { return false; } } return true; }, - "parent": function (elem) { - return !Expr.pseudos["empty"](elem); + "parent": function( elem ) { + return !Expr.pseudos["empty"]( elem ); }, // Element/input types - "header": function (elem) { - return rheader.test(elem.nodeName); + "header": function( elem ) { + return rheader.test( elem.nodeName ); }, - "input": function (elem) { - return rinputs.test(elem.nodeName); + "input": function( elem ) { + return rinputs.test( elem.nodeName ); }, - "button": function (elem) { + "button": function( elem ) { var name = elem.nodeName.toLowerCase(); return name === "input" && elem.type === "button" || name === "button"; }, - "text": function (elem) { + "text": function( elem ) { var attr; return elem.nodeName.toLowerCase() === "input" && elem.type === "text" && @@ -1993,46 +1949,46 @@ }, // Position-in-collection - "first": createPositionalPseudo(function () { - return [0]; + "first": createPositionalPseudo(function() { + return [ 0 ]; }), - "last": createPositionalPseudo(function (matchIndexes, length) { - return [length - 1]; + "last": createPositionalPseudo(function( matchIndexes, length ) { + return [ length - 1 ]; }), - "eq": createPositionalPseudo(function (matchIndexes, length, argument) { - return [argument < 0 ? argument + length : argument]; + "eq": createPositionalPseudo(function( matchIndexes, length, argument ) { + return [ argument < 0 ? argument + length : argument ]; }), - "even": createPositionalPseudo(function (matchIndexes, length) { + "even": createPositionalPseudo(function( matchIndexes, length ) { var i = 0; - for (; i < length; i += 2) { - matchIndexes.push(i); + for ( ; i < length; i += 2 ) { + matchIndexes.push( i ); } return matchIndexes; }), - "odd": createPositionalPseudo(function (matchIndexes, length) { + "odd": createPositionalPseudo(function( matchIndexes, length ) { var i = 1; - for (; i < length; i += 2) { - matchIndexes.push(i); + for ( ; i < length; i += 2 ) { + matchIndexes.push( i ); } return matchIndexes; }), - "lt": createPositionalPseudo(function (matchIndexes, length, argument) { + "lt": createPositionalPseudo(function( matchIndexes, length, argument ) { var i = argument < 0 ? argument + length : argument; - for (; --i >= 0;) { - matchIndexes.push(i); + for ( ; --i >= 0; ) { + matchIndexes.push( i ); } return matchIndexes; }), - "gt": createPositionalPseudo(function (matchIndexes, length, argument) { + "gt": createPositionalPseudo(function( matchIndexes, length, argument ) { var i = argument < 0 ? argument + length : argument; - for (; ++i < length;) { - matchIndexes.push(i); + for ( ; ++i < length; ) { + matchIndexes.push( i ); } return matchIndexes; }) @@ -2042,72 +1998,70 @@ Expr.pseudos["nth"] = Expr.pseudos["eq"]; // Add button/input type pseudos - for (i in {radio: true, checkbox: true, file: true, password: true, image: true}) { - Expr.pseudos[i] = createInputPseudo(i); + for ( i in { radio: true, checkbox: true, file: true, password: true, image: true } ) { + Expr.pseudos[ i ] = createInputPseudo( i ); } - for (i in {submit: true, reset: true}) { - Expr.pseudos[i] = createButtonPseudo(i); + for ( i in { submit: true, reset: true } ) { + Expr.pseudos[ i ] = createButtonPseudo( i ); } // Easy API for creating new setFilters - function setFilters() { - } - + function setFilters() {} setFilters.prototype = Expr.filters = Expr.pseudos; Expr.setFilters = new setFilters(); - tokenize = Sizzle.tokenize = function (selector, parseOnly) { + tokenize = Sizzle.tokenize = function( selector, parseOnly ) { var matched, match, tokens, type, soFar, groups, preFilters, - cached = tokenCache[selector + " "]; + cached = tokenCache[ selector + " " ]; - if (cached) { - return parseOnly ? 0 : cached.slice(0); + if ( cached ) { + return parseOnly ? 0 : cached.slice( 0 ); } soFar = selector; groups = []; preFilters = Expr.preFilter; - while (soFar) { + while ( soFar ) { // Comma and first run - if (!matched || (match = rcomma.exec(soFar))) { - if (match) { + if ( !matched || (match = rcomma.exec( soFar )) ) { + if ( match ) { // Don't consume trailing commas as valid - soFar = soFar.slice(match[0].length) || soFar; + soFar = soFar.slice( match[0].length ) || soFar; } - groups.push((tokens = [])); + groups.push( (tokens = []) ); } matched = false; // Combinators - if ((match = rcombinators.exec(soFar))) { + if ( (match = rcombinators.exec( soFar )) ) { matched = match.shift(); tokens.push({ value: matched, // Cast descendant combinators to space - type: match[0].replace(rtrim, " ") + type: match[0].replace( rtrim, " " ) }); - soFar = soFar.slice(matched.length); + soFar = soFar.slice( matched.length ); } // Filters - for (type in Expr.filter) { - if ((match = matchExpr[type].exec(soFar)) && (!preFilters[type] || - (match = preFilters[type](match)))) { + for ( type in Expr.filter ) { + if ( (match = matchExpr[ type ].exec( soFar )) && (!preFilters[ type ] || + (match = preFilters[ type ]( match ))) ) { matched = match.shift(); tokens.push({ value: matched, type: type, matches: match }); - soFar = soFar.slice(matched.length); + soFar = soFar.slice( matched.length ); } } - if (!matched) { + if ( !matched ) { break; } } @@ -2118,65 +2072,65 @@ return parseOnly ? soFar.length : soFar ? - Sizzle.error(selector) : + Sizzle.error( selector ) : // Cache the tokens - tokenCache(selector, groups).slice(0); + tokenCache( selector, groups ).slice( 0 ); }; - function toSelector(tokens) { + function toSelector( tokens ) { var i = 0, len = tokens.length, selector = ""; - for (; i < len; i++) { + for ( ; i < len; i++ ) { selector += tokens[i].value; } return selector; } - function addCombinator(matcher, combinator, base) { + function addCombinator( matcher, combinator, base ) { var dir = combinator.dir, checkNonElements = base && dir === "parentNode", doneName = done++; return combinator.first ? // Check against closest ancestor/preceding element - function (elem, context, xml) { - while ((elem = elem[dir])) { - if (elem.nodeType === 1 || checkNonElements) { - return matcher(elem, context, xml); + function( elem, context, xml ) { + while ( (elem = elem[ dir ]) ) { + if ( elem.nodeType === 1 || checkNonElements ) { + return matcher( elem, context, xml ); } } } : // Check against all ancestor/preceding elements - function (elem, context, xml) { + function( elem, context, xml ) { var oldCache, outerCache, - newCache = [dirruns, doneName]; + newCache = [ dirruns, doneName ]; // We can't set arbitrary data on XML nodes, so they don't benefit from dir caching - if (xml) { - while ((elem = elem[dir])) { - if (elem.nodeType === 1 || checkNonElements) { - if (matcher(elem, context, xml)) { + if ( xml ) { + while ( (elem = elem[ dir ]) ) { + if ( elem.nodeType === 1 || checkNonElements ) { + if ( matcher( elem, context, xml ) ) { return true; } } } } else { - while ((elem = elem[dir])) { - if (elem.nodeType === 1 || checkNonElements) { - outerCache = elem[expando] || (elem[expando] = {}); - if ((oldCache = outerCache[dir]) && - oldCache[0] === dirruns && oldCache[1] === doneName) { + while ( (elem = elem[ dir ]) ) { + if ( elem.nodeType === 1 || checkNonElements ) { + outerCache = elem[ expando ] || (elem[ expando ] = {}); + if ( (oldCache = outerCache[ dir ]) && + oldCache[ 0 ] === dirruns && oldCache[ 1 ] === doneName ) { // Assign to newCache so results back-propagate to previous elements - return (newCache[2] = oldCache[2]); + return (newCache[ 2 ] = oldCache[ 2 ]); } else { // Reuse newcache so results back-propagate to previous elements - outerCache[dir] = newCache; + outerCache[ dir ] = newCache; // A match means we're done; a fail means we have to keep checking - if ((newCache[2] = matcher(elem, context, xml))) { + if ( (newCache[ 2 ] = matcher( elem, context, xml )) ) { return true; } } @@ -2186,12 +2140,12 @@ }; } - function elementMatcher(matchers) { + function elementMatcher( matchers ) { return matchers.length > 1 ? - function (elem, context, xml) { + function( elem, context, xml ) { var i = matchers.length; - while (i--) { - if (!matchers[i](elem, context, xml)) { + while ( i-- ) { + if ( !matchers[i]( elem, context, xml ) ) { return false; } } @@ -2200,28 +2154,28 @@ matchers[0]; } - function multipleContexts(selector, contexts, results) { + function multipleContexts( selector, contexts, results ) { var i = 0, len = contexts.length; - for (; i < len; i++) { - Sizzle(selector, contexts[i], results); + for ( ; i < len; i++ ) { + Sizzle( selector, contexts[i], results ); } return results; } - function condense(unmatched, map, filter, context, xml) { + function condense( unmatched, map, filter, context, xml ) { var elem, newUnmatched = [], i = 0, len = unmatched.length, mapped = map != null; - for (; i < len; i++) { - if ((elem = unmatched[i])) { - if (!filter || filter(elem, context, xml)) { - newUnmatched.push(elem); - if (mapped) { - map.push(i); + for ( ; i < len; i++ ) { + if ( (elem = unmatched[i]) ) { + if ( !filter || filter( elem, context, xml ) ) { + newUnmatched.push( elem ); + if ( mapped ) { + map.push( i ); } } } @@ -2230,25 +2184,25 @@ return newUnmatched; } - function setMatcher(preFilter, selector, matcher, postFilter, postFinder, postSelector) { - if (postFilter && !postFilter[expando]) { - postFilter = setMatcher(postFilter); + function setMatcher( preFilter, selector, matcher, postFilter, postFinder, postSelector ) { + if ( postFilter && !postFilter[ expando ] ) { + postFilter = setMatcher( postFilter ); } - if (postFinder && !postFinder[expando]) { - postFinder = setMatcher(postFinder, postSelector); + if ( postFinder && !postFinder[ expando ] ) { + postFinder = setMatcher( postFinder, postSelector ); } - return markFunction(function (seed, results, context, xml) { + return markFunction(function( seed, results, context, xml ) { var temp, i, elem, preMap = [], postMap = [], preexisting = results.length, // Get initial elements from seed or context - elems = seed || multipleContexts(selector || "*", context.nodeType ? [context] : context, []), + elems = seed || multipleContexts( selector || "*", context.nodeType ? [ context ] : context, [] ), // Prefilter to get matcher input, preserving a map for seed-results synchronization matcherIn = preFilter && ( seed || !selector ) ? - condense(elems, preMap, preFilter, context, xml) : + condense( elems, preMap, preFilter, context, xml ) : elems, matcherOut = matcher ? @@ -2263,44 +2217,44 @@ matcherIn; // Find primary matches - if (matcher) { - matcher(matcherIn, matcherOut, context, xml); + if ( matcher ) { + matcher( matcherIn, matcherOut, context, xml ); } // Apply postFilter - if (postFilter) { - temp = condense(matcherOut, postMap); - postFilter(temp, [], context, xml); + if ( postFilter ) { + temp = condense( matcherOut, postMap ); + postFilter( temp, [], context, xml ); // Un-match failing elements by moving them back to matcherIn i = temp.length; - while (i--) { - if ((elem = temp[i])) { - matcherOut[postMap[i]] = !(matcherIn[postMap[i]] = elem); + while ( i-- ) { + if ( (elem = temp[i]) ) { + matcherOut[ postMap[i] ] = !(matcherIn[ postMap[i] ] = elem); } } } - if (seed) { - if (postFinder || preFilter) { - if (postFinder) { + if ( seed ) { + if ( postFinder || preFilter ) { + if ( postFinder ) { // Get the final matcherOut by condensing this intermediate into postFinder contexts temp = []; i = matcherOut.length; - while (i--) { - if ((elem = matcherOut[i])) { + while ( i-- ) { + if ( (elem = matcherOut[i]) ) { // Restore matcherIn since elem is not yet a final match - temp.push((matcherIn[i] = elem)); + temp.push( (matcherIn[i] = elem) ); } } - postFinder(null, (matcherOut = []), temp, xml); + postFinder( null, (matcherOut = []), temp, xml ); } // Move matched elements from seed to results to keep them synchronized i = matcherOut.length; - while (i--) { - if ((elem = matcherOut[i]) && - (temp = postFinder ? indexOf(seed, elem) : preMap[i]) > -1) { + while ( i-- ) { + if ( (elem = matcherOut[i]) && + (temp = postFinder ? indexOf( seed, elem ) : preMap[i]) > -1 ) { seed[temp] = !(results[temp] = elem); } @@ -2311,80 +2265,80 @@ } else { matcherOut = condense( matcherOut === results ? - matcherOut.splice(preexisting, matcherOut.length) : + matcherOut.splice( preexisting, matcherOut.length ) : matcherOut ); - if (postFinder) { - postFinder(null, results, matcherOut, xml); + if ( postFinder ) { + postFinder( null, results, matcherOut, xml ); } else { - push.apply(results, matcherOut); + push.apply( results, matcherOut ); } } }); } - function matcherFromTokens(tokens) { + function matcherFromTokens( tokens ) { var checkContext, matcher, j, len = tokens.length, - leadingRelative = Expr.relative[tokens[0].type], + leadingRelative = Expr.relative[ tokens[0].type ], implicitRelative = leadingRelative || Expr.relative[" "], i = leadingRelative ? 1 : 0, // The foundational matcher ensures that elements are reachable from top-level context(s) - matchContext = addCombinator(function (elem) { + matchContext = addCombinator( function( elem ) { return elem === checkContext; - }, implicitRelative, true), - matchAnyContext = addCombinator(function (elem) { - return indexOf(checkContext, elem) > -1; - }, implicitRelative, true), - matchers = [function (elem, context, xml) { + }, implicitRelative, true ), + matchAnyContext = addCombinator( function( elem ) { + return indexOf( checkContext, elem ) > -1; + }, implicitRelative, true ), + matchers = [ function( elem, context, xml ) { var ret = ( !leadingRelative && ( xml || context !== outermostContext ) ) || ( (checkContext = context).nodeType ? - matchContext(elem, context, xml) : - matchAnyContext(elem, context, xml) ); + matchContext( elem, context, xml ) : + matchAnyContext( elem, context, xml ) ); // Avoid hanging onto element (issue #299) checkContext = null; return ret; - }]; + } ]; - for (; i < len; i++) { - if ((matcher = Expr.relative[tokens[i].type])) { - matchers = [addCombinator(elementMatcher(matchers), matcher)]; + for ( ; i < len; i++ ) { + if ( (matcher = Expr.relative[ tokens[i].type ]) ) { + matchers = [ addCombinator(elementMatcher( matchers ), matcher) ]; } else { - matcher = Expr.filter[tokens[i].type].apply(null, tokens[i].matches); + matcher = Expr.filter[ tokens[i].type ].apply( null, tokens[i].matches ); // Return special upon seeing a positional matcher - if (matcher[expando]) { + if ( matcher[ expando ] ) { // Find the next relative operator (if any) for proper handling j = ++i; - for (; j < len; j++) { - if (Expr.relative[tokens[j].type]) { + for ( ; j < len; j++ ) { + if ( Expr.relative[ tokens[j].type ] ) { break; } } return setMatcher( - i > 1 && elementMatcher(matchers), + i > 1 && elementMatcher( matchers ), i > 1 && toSelector( // If the preceding token was a descendant combinator, insert an implicit any-element `*` - tokens.slice(0, i - 1).concat({value: tokens[i - 2].type === " " ? "*" : ""}) - ).replace(rtrim, "$1"), + tokens.slice( 0, i - 1 ).concat({ value: tokens[ i - 2 ].type === " " ? "*" : "" }) + ).replace( rtrim, "$1" ), matcher, - i < j && matcherFromTokens(tokens.slice(i, j)), - j < len && matcherFromTokens((tokens = tokens.slice(j))), - j < len && toSelector(tokens) + i < j && matcherFromTokens( tokens.slice( i, j ) ), + j < len && matcherFromTokens( (tokens = tokens.slice( j )) ), + j < len && toSelector( tokens ) ); } - matchers.push(matcher); + matchers.push( matcher ); } } - return elementMatcher(matchers); + return elementMatcher( matchers ); } - function matcherFromGroupMatchers(elementMatchers, setMatchers) { + function matcherFromGroupMatchers( elementMatchers, setMatchers ) { var bySet = setMatchers.length > 0, byElement = elementMatchers.length > 0, - superMatcher = function (seed, context, xml, results, outermost) { + superMatcher = function( seed, context, xml, results, outermost ) { var elem, j, matcher, matchedCount = 0, i = "0", @@ -2392,12 +2346,12 @@ setMatched = [], contextBackup = outermostContext, // We must always have either seed elements or outermost context - elems = seed || byElement && Expr.find["TAG"]("*", outermost), + elems = seed || byElement && Expr.find["TAG"]( "*", outermost ), // Use integer dirruns iff this is the outermost matcher dirrunsUnique = (dirruns += contextBackup == null ? 1 : Math.random() || 0.1), len = elems.length; - if (outermost) { + if ( outermost ) { outermostContext = context !== document && context; } @@ -2405,69 +2359,69 @@ // Keep `i` a string if there are no elements so `matchedCount` will be "00" below // Support: IE<9, Safari // Tolerate NodeList properties (IE: "length"; Safari: ) matching elements by id - for (; i !== len && (elem = elems[i]) != null; i++) { - if (byElement && elem) { + for ( ; i !== len && (elem = elems[i]) != null; i++ ) { + if ( byElement && elem ) { j = 0; - while ((matcher = elementMatchers[j++])) { - if (matcher(elem, context, xml)) { - results.push(elem); + while ( (matcher = elementMatchers[j++]) ) { + if ( matcher( elem, context, xml ) ) { + results.push( elem ); break; } } - if (outermost) { + if ( outermost ) { dirruns = dirrunsUnique; } } // Track unmatched elements for set filters - if (bySet) { + if ( bySet ) { // They will have gone through all possible matchers - if ((elem = !matcher && elem)) { + if ( (elem = !matcher && elem) ) { matchedCount--; } // Lengthen the array for every element, matched or not - if (seed) { - unmatched.push(elem); + if ( seed ) { + unmatched.push( elem ); } } } // Apply set filters to unmatched elements matchedCount += i; - if (bySet && i !== matchedCount) { + if ( bySet && i !== matchedCount ) { j = 0; - while ((matcher = setMatchers[j++])) { - matcher(unmatched, setMatched, context, xml); + while ( (matcher = setMatchers[j++]) ) { + matcher( unmatched, setMatched, context, xml ); } - if (seed) { + if ( seed ) { // Reintegrate element matches to eliminate the need for sorting - if (matchedCount > 0) { - while (i--) { - if (!(unmatched[i] || setMatched[i])) { - setMatched[i] = pop.call(results); + if ( matchedCount > 0 ) { + while ( i-- ) { + if ( !(unmatched[i] || setMatched[i]) ) { + setMatched[i] = pop.call( results ); } } } // Discard index placeholder values to get only actual matches - setMatched = condense(setMatched); + setMatched = condense( setMatched ); } // Add matches to results - push.apply(results, setMatched); + push.apply( results, setMatched ); // Seedless set matches succeeding multiple successful matchers stipulate sorting - if (outermost && !seed && setMatched.length > 0 && - ( matchedCount + setMatchers.length ) > 1) { + if ( outermost && !seed && setMatched.length > 0 && + ( matchedCount + setMatchers.length ) > 1 ) { - Sizzle.uniqueSort(results); + Sizzle.uniqueSort( results ); } } // Override manipulation of globals by nested matchers - if (outermost) { + if ( outermost ) { dirruns = dirrunsUnique; outermostContext = contextBackup; } @@ -2476,33 +2430,33 @@ }; return bySet ? - markFunction(superMatcher) : + markFunction( superMatcher ) : superMatcher; } - compile = Sizzle.compile = function (selector, match /* Internal Use Only */) { + compile = Sizzle.compile = function( selector, match /* Internal Use Only */ ) { var i, setMatchers = [], elementMatchers = [], - cached = compilerCache[selector + " "]; + cached = compilerCache[ selector + " " ]; - if (!cached) { + if ( !cached ) { // Generate a function of recursive functions that can be used to check each element - if (!match) { - match = tokenize(selector); + if ( !match ) { + match = tokenize( selector ); } i = match.length; - while (i--) { - cached = matcherFromTokens(match[i]); - if (cached[expando]) { - setMatchers.push(cached); + while ( i-- ) { + cached = matcherFromTokens( match[i] ); + if ( cached[ expando ] ) { + setMatchers.push( cached ); } else { - elementMatchers.push(cached); + elementMatchers.push( cached ); } } // Cache the compiled function - cached = compilerCache(selector, matcherFromGroupMatchers(elementMatchers, setMatchers)); + cached = compilerCache( selector, matcherFromGroupMatchers( elementMatchers, setMatchers ) ); // Save selector and tokenization cached.selector = selector; @@ -2519,55 +2473,55 @@ * @param {Array} [results] * @param {Array} [seed] A set of elements to match against */ - select = Sizzle.select = function (selector, context, results, seed) { + select = Sizzle.select = function( selector, context, results, seed ) { var i, tokens, token, type, find, compiled = typeof selector === "function" && selector, - match = !seed && tokenize((selector = compiled.selector || selector)); + match = !seed && tokenize( (selector = compiled.selector || selector) ); results = results || []; // Try to minimize operations if there is no seed and only one group - if (match.length === 1) { + if ( match.length === 1 ) { // Take a shortcut and set the context if the root selector is an ID - tokens = match[0] = match[0].slice(0); - if (tokens.length > 2 && (token = tokens[0]).type === "ID" && + tokens = match[0] = match[0].slice( 0 ); + if ( tokens.length > 2 && (token = tokens[0]).type === "ID" && support.getById && context.nodeType === 9 && documentIsHTML && - Expr.relative[tokens[1].type]) { + Expr.relative[ tokens[1].type ] ) { - context = ( Expr.find["ID"](token.matches[0].replace(runescape, funescape), context) || [] )[0]; - if (!context) { + context = ( Expr.find["ID"]( token.matches[0].replace(runescape, funescape), context ) || [] )[0]; + if ( !context ) { return results; // Precompiled matchers will still verify ancestry, so step up a level - } else if (compiled) { + } else if ( compiled ) { context = context.parentNode; } - selector = selector.slice(tokens.shift().value.length); + selector = selector.slice( tokens.shift().value.length ); } // Fetch a seed set for right-to-left matching - i = matchExpr["needsContext"].test(selector) ? 0 : tokens.length; - while (i--) { + i = matchExpr["needsContext"].test( selector ) ? 0 : tokens.length; + while ( i-- ) { token = tokens[i]; // Abort if we hit a combinator - if (Expr.relative[(type = token.type)]) { + if ( Expr.relative[ (type = token.type) ] ) { break; } - if ((find = Expr.find[type])) { + if ( (find = Expr.find[ type ]) ) { // Search, expanding context for leading sibling combinators - if ((seed = find( - token.matches[0].replace(runescape, funescape), - rsibling.test(tokens[0].type) && testContext(context.parentNode) || context - ))) { + if ( (seed = find( + token.matches[0].replace( runescape, funescape ), + rsibling.test( tokens[0].type ) && testContext( context.parentNode ) || context + )) ) { // If seed is empty or no tokens remain, we can return early - tokens.splice(i, 1); - selector = seed.length && toSelector(tokens); - if (!selector) { - push.apply(results, seed); + tokens.splice( i, 1 ); + selector = seed.length && toSelector( tokens ); + if ( !selector ) { + push.apply( results, seed ); return results; } @@ -2579,12 +2533,12 @@ // Compile and execute a filtering function if one is not provided // Provide `match` to avoid retokenization if we modified the selector above - ( compiled || compile(selector, match) )( + ( compiled || compile( selector, match ) )( seed, context, !documentIsHTML, results, - rsibling.test(selector) && testContext(context.parentNode) || context + rsibling.test( selector ) && testContext( context.parentNode ) || context ); return results; }; @@ -2592,7 +2546,7 @@ // One-time assignments // Sort stability - support.sortStable = expando.split("").sort(sortOrder).join("") === expando; + support.sortStable = expando.split("").sort( sortOrder ).join("") === expando; // Support: Chrome 14-35+ // Always assume duplicates if they aren't passed to the comparison function @@ -2603,34 +2557,34 @@ // Support: Webkit<537.32 - Safari 6.0.3/Chrome 25 (fixed in Chrome 27) // Detached nodes confoundingly follow *each other* - support.sortDetached = assert(function (div1) { + support.sortDetached = assert(function( div1 ) { // Should return 1, but returns 4 (following) - return div1.compareDocumentPosition(document.createElement("div")) & 1; + return div1.compareDocumentPosition( document.createElement("div") ) & 1; }); // Support: IE<8 // Prevent attribute/property "interpolation" // http://msdn.microsoft.com/en-us/library/ms536429%28VS.85%29.aspx - if (!assert(function (div) { + if ( !assert(function( div ) { div.innerHTML = ""; - return div.firstChild.getAttribute("href") === "#"; - })) { - addHandle("type|href|height|width", function (elem, name, isXML) { - if (!isXML) { - return elem.getAttribute(name, name.toLowerCase() === "type" ? 1 : 2); + return div.firstChild.getAttribute("href") === "#" ; + }) ) { + addHandle( "type|href|height|width", function( elem, name, isXML ) { + if ( !isXML ) { + return elem.getAttribute( name, name.toLowerCase() === "type" ? 1 : 2 ); } }); } // Support: IE<9 // Use defaultValue in place of getAttribute("value") - if (!support.attributes || !assert(function (div) { + if ( !support.attributes || !assert(function( div ) { div.innerHTML = ""; - div.firstChild.setAttribute("value", ""); - return div.firstChild.getAttribute("value") === ""; - })) { - addHandle("value", function (elem, name, isXML) { - if (!isXML && elem.nodeName.toLowerCase() === "input") { + div.firstChild.setAttribute( "value", "" ); + return div.firstChild.getAttribute( "value" ) === ""; + }) ) { + addHandle( "value", function( elem, name, isXML ) { + if ( !isXML && elem.nodeName.toLowerCase() === "input" ) { return elem.defaultValue; } }); @@ -2638,14 +2592,14 @@ // Support: IE<9 // Use getAttributeNode to fetch booleans when getAttribute lies - if (!assert(function (div) { + if ( !assert(function( div ) { return div.getAttribute("disabled") == null; - })) { - addHandle(booleans, function (elem, name, isXML) { + }) ) { + addHandle( booleans, function( elem, name, isXML ) { var val; - if (!isXML) { - return elem[name] === true ? name.toLowerCase() : - (val = elem.getAttributeNode(name)) && val.specified ? + if ( !isXML ) { + return elem[ name ] === true ? name.toLowerCase() : + (val = elem.getAttributeNode( name )) && val.specified ? val.value : null; } @@ -2654,7 +2608,8 @@ return Sizzle; - })(window); + })( window ); + jQuery.find = Sizzle; @@ -2666,97 +2621,99 @@ jQuery.contains = Sizzle.contains; + var rneedsContext = jQuery.expr.match.needsContext; var rsingleTag = (/^<(\w+)\s*\/?>(?:<\/\1>|)$/); + var risSimple = /^.[^:#\[\.,]*$/; // Implement the identical functionality for filter and not - function winnow(elements, qualifier, not) { - if (jQuery.isFunction(qualifier)) { - return jQuery.grep(elements, function (elem, i) { + function winnow( elements, qualifier, not ) { + if ( jQuery.isFunction( qualifier ) ) { + return jQuery.grep( elements, function( elem, i ) { /* jshint -W018 */ - return !!qualifier.call(elem, i, elem) !== not; + return !!qualifier.call( elem, i, elem ) !== not; }); } - if (qualifier.nodeType) { - return jQuery.grep(elements, function (elem) { + if ( qualifier.nodeType ) { + return jQuery.grep( elements, function( elem ) { return ( elem === qualifier ) !== not; }); } - if (typeof qualifier === "string") { - if (risSimple.test(qualifier)) { - return jQuery.filter(qualifier, elements, not); + if ( typeof qualifier === "string" ) { + if ( risSimple.test( qualifier ) ) { + return jQuery.filter( qualifier, elements, not ); } - qualifier = jQuery.filter(qualifier, elements); + qualifier = jQuery.filter( qualifier, elements ); } - return jQuery.grep(elements, function (elem) { - return ( jQuery.inArray(elem, qualifier) >= 0 ) !== not; + return jQuery.grep( elements, function( elem ) { + return ( indexOf.call( qualifier, elem ) >= 0 ) !== not; }); } - jQuery.filter = function (expr, elems, not) { - var elem = elems[0]; + jQuery.filter = function( expr, elems, not ) { + var elem = elems[ 0 ]; - if (not) { + if ( not ) { expr = ":not(" + expr + ")"; } return elems.length === 1 && elem.nodeType === 1 ? - jQuery.find.matchesSelector(elem, expr) ? [elem] : [] : - jQuery.find.matches(expr, jQuery.grep(elems, function (elem) { + jQuery.find.matchesSelector( elem, expr ) ? [ elem ] : [] : + jQuery.find.matches( expr, jQuery.grep( elems, function( elem ) { return elem.nodeType === 1; })); }; jQuery.fn.extend({ - find: function (selector) { + find: function( selector ) { var i, + len = this.length, ret = [], - self = this, - len = self.length; + self = this; - if (typeof selector !== "string") { - return this.pushStack(jQuery(selector).filter(function () { - for (i = 0; i < len; i++) { - if (jQuery.contains(self[i], this)) { + if ( typeof selector !== "string" ) { + return this.pushStack( jQuery( selector ).filter(function() { + for ( i = 0; i < len; i++ ) { + if ( jQuery.contains( self[ i ], this ) ) { return true; } } - })); + }) ); } - for (i = 0; i < len; i++) { - jQuery.find(selector, self[i], ret); + for ( i = 0; i < len; i++ ) { + jQuery.find( selector, self[ i ], ret ); } // Needed because $( selector, context ) becomes $( context ).find( selector ) - ret = this.pushStack(len > 1 ? jQuery.unique(ret) : ret); + ret = this.pushStack( len > 1 ? jQuery.unique( ret ) : ret ); ret.selector = this.selector ? this.selector + " " + selector : selector; return ret; }, - filter: function (selector) { - return this.pushStack(winnow(this, selector || [], false)); + filter: function( selector ) { + return this.pushStack( winnow(this, selector || [], false) ); }, - not: function (selector) { - return this.pushStack(winnow(this, selector || [], true)); + not: function( selector ) { + return this.pushStack( winnow(this, selector || [], true) ); }, - is: function (selector) { + is: function( selector ) { return !!winnow( this, // If this is a positional/relative selector, check membership in the returned set // so $("p:first").is("p:last") won't return true for a doc with two "p". - typeof selector === "string" && rneedsContext.test(selector) ? - jQuery(selector) : + typeof selector === "string" && rneedsContext.test( selector ) ? + jQuery( selector ) : selector || [], false ).length; @@ -2770,57 +2727,54 @@ // A central reference to the root jQuery(document) var rootjQuery, - // Use the correct document accordingly with window argument (sandbox) - document = window.document, - // A simple way to check for HTML strings // Prioritize #id over to avoid XSS via location.hash (#9521) // Strict HTML recognition (#11290: must start with <) rquickExpr = /^(?:\s*(<[\w\W]+>)[^>]*|#([\w-]*))$/, - init = jQuery.fn.init = function (selector, context) { + init = jQuery.fn.init = function( selector, context ) { var match, elem; // HANDLE: $(""), $(null), $(undefined), $(false) - if (!selector) { + if ( !selector ) { return this; } // Handle HTML strings - if (typeof selector === "string") { - if (selector.charAt(0) === "<" && selector.charAt(selector.length - 1) === ">" && selector.length >= 3) { + 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]; + match = [ null, selector, null ]; } else { - match = rquickExpr.exec(selector); + match = rquickExpr.exec( selector ); } // Match html or make sure no context is specified for #id - if (match && (match[1] || !context)) { + if ( match && (match[1] || !context) ) { // HANDLE: $(html) -> $(array) - if (match[1]) { + if ( match[1] ) { context = context instanceof jQuery ? context[0] : context; - // scripts is true for back-compat + // Option to run scripts is true for back-compat // Intentionally let the error be thrown if parseHTML is not present - jQuery.merge(this, jQuery.parseHTML( + 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) { + 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]); + if ( jQuery.isFunction( this[ match ] ) ) { + this[ match ]( context[ match ] ); // ...and otherwise set as attributes } else { - this.attr(match, context[match]); + this.attr( match, context[ match ] ); } } } @@ -2829,18 +2783,12 @@ // HANDLE: $(#id) } else { - elem = document.getElementById(match[2]); + elem = document.getElementById( match[2] ); - // Check parentNode to catch when Blackberry 4.6 returns - // nodes that are no longer in the document #6963 - if (elem && elem.parentNode) { - // Handle the case where IE and Opera return items - // by name instead of ID - if (elem.id !== match[2]) { - return rootjQuery.find(selector); - } - - // Otherwise, we inject the element directly into the jQuery object + // Support: Blackberry 4.6 + // gEBID returns nodes no longer in the document (#6963) + if ( elem && elem.parentNode ) { + // Inject the element directly into the jQuery object this.length = 1; this[0] = elem; } @@ -2851,47 +2799,47 @@ } // HANDLE: $(expr, $(...)) - } else if (!context || context.jquery) { - return ( context || rootjQuery ).find(selector); + } 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); + return this.constructor( context ).find( selector ); } // HANDLE: $(DOMElement) - } else if (selector.nodeType) { + } 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)) { + } else if ( jQuery.isFunction( selector ) ) { return typeof rootjQuery.ready !== "undefined" ? - rootjQuery.ready(selector) : + rootjQuery.ready( selector ) : // Execute immediately if ready is not present - selector(jQuery); + selector( jQuery ); } - if (selector.selector !== undefined) { + if ( selector.selector !== undefined ) { this.selector = selector.selector; this.context = selector.context; } - return jQuery.makeArray(selector, this); + 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); + rootjQuery = jQuery( document ); var rparentsprev = /^(?:parents|prev(?:Until|All))/, - // methods guaranteed to produce a unique set when starting from a unique set + // Methods guaranteed to produce a unique set when starting from a unique set guaranteedUnique = { children: true, contents: true, @@ -2900,196 +2848,195 @@ }; jQuery.extend({ - dir: function (elem, dir, until) { + dir: function( elem, dir, until ) { var matched = [], - cur = elem[dir]; + truncate = until !== undefined; - while (cur && cur.nodeType !== 9 && (until === undefined || cur.nodeType !== 1 || !jQuery(cur).is(until))) { - if (cur.nodeType === 1) { - matched.push(cur); + while ( (elem = elem[ dir ]) && elem.nodeType !== 9 ) { + if ( elem.nodeType === 1 ) { + if ( truncate && jQuery( elem ).is( until ) ) { + break; + } + matched.push( elem ); } - cur = cur[dir]; } return matched; }, - sibling: function (n, elem) { - var r = []; + sibling: function( n, elem ) { + var matched = []; - for (; n; n = n.nextSibling) { - if (n.nodeType === 1 && n !== elem) { - r.push(n); + for ( ; n; n = n.nextSibling ) { + if ( n.nodeType === 1 && n !== elem ) { + matched.push( n ); } } - return r; + return matched; } }); jQuery.fn.extend({ - has: function (target) { - var i, - targets = jQuery(target, this), - len = targets.length; + has: function( target ) { + var targets = jQuery( target, this ), + l = targets.length; - return this.filter(function () { - for (i = 0; i < len; i++) { - if (jQuery.contains(this, targets[i])) { + return this.filter(function() { + var i = 0; + for ( ; i < l; i++ ) { + if ( jQuery.contains( this, targets[i] ) ) { return true; } } }); }, - closest: function (selectors, context) { + closest: function( selectors, context ) { var cur, i = 0, l = this.length, matched = [], - pos = rneedsContext.test(selectors) || typeof selectors !== "string" ? - jQuery(selectors, context || this.context) : + pos = rneedsContext.test( selectors ) || typeof selectors !== "string" ? + jQuery( selectors, context || this.context ) : 0; - for (; i < l; i++) { - for (cur = this[i]; cur && cur !== context; cur = cur.parentNode) { + for ( ; i < l; i++ ) { + for ( cur = this[i]; cur && cur !== context; cur = cur.parentNode ) { // Always skip document fragments - if (cur.nodeType < 11 && (pos ? + if ( cur.nodeType < 11 && (pos ? pos.index(cur) > -1 : // Don't pass non-elements to Sizzle cur.nodeType === 1 && - jQuery.find.matchesSelector(cur, selectors))) { + jQuery.find.matchesSelector(cur, selectors)) ) { - matched.push(cur); + matched.push( cur ); break; } } } - return this.pushStack(matched.length > 1 ? jQuery.unique(matched) : matched); + return this.pushStack( matched.length > 1 ? jQuery.unique( matched ) : matched ); }, - // Determine the position of an element within - // the matched set of elements - index: function (elem) { + // Determine the position of an element within the set + index: function( elem ) { // No argument, return index in parent - if (!elem) { - return ( this[0] && this[0].parentNode ) ? this.first().prevAll().length : -1; + if ( !elem ) { + return ( this[ 0 ] && this[ 0 ].parentNode ) ? this.first().prevAll().length : -1; } - // index in selector - if (typeof elem === "string") { - return jQuery.inArray(this[0], jQuery(elem)); + // Index in selector + if ( typeof elem === "string" ) { + return indexOf.call( jQuery( elem ), this[ 0 ] ); } // Locate the position of the desired element - return jQuery.inArray( + return indexOf.call( this, + // If it receives a jQuery object, the first element is used - elem.jquery ? elem[0] : elem, this); + elem.jquery ? elem[ 0 ] : elem + ); }, - add: function (selector, context) { + add: function( selector, context ) { return this.pushStack( jQuery.unique( - jQuery.merge(this.get(), jQuery(selector, context)) + jQuery.merge( this.get(), jQuery( selector, context ) ) ) ); }, - addBack: function (selector) { - return this.add(selector == null ? + addBack: function( selector ) { + return this.add( selector == null ? this.prevObject : this.prevObject.filter(selector) ); } }); - function sibling(cur, dir) { - do { - cur = cur[dir]; - } while (cur && cur.nodeType !== 1); - + function sibling( cur, dir ) { + while ( (cur = cur[dir]) && cur.nodeType !== 1 ) {} return cur; } jQuery.each({ - parent: function (elem) { + parent: function( elem ) { var parent = elem.parentNode; return parent && parent.nodeType !== 11 ? parent : null; }, - parents: function (elem) { - return jQuery.dir(elem, "parentNode"); + parents: function( elem ) { + return jQuery.dir( elem, "parentNode" ); }, - parentsUntil: function (elem, i, until) { - return jQuery.dir(elem, "parentNode", until); + parentsUntil: function( elem, i, until ) { + return jQuery.dir( elem, "parentNode", until ); }, - next: function (elem) { - return sibling(elem, "nextSibling"); + next: function( elem ) { + return sibling( elem, "nextSibling" ); }, - prev: function (elem) { - return sibling(elem, "previousSibling"); + prev: function( elem ) { + return sibling( elem, "previousSibling" ); }, - nextAll: function (elem) { - return jQuery.dir(elem, "nextSibling"); + nextAll: function( elem ) { + return jQuery.dir( elem, "nextSibling" ); }, - prevAll: function (elem) { - return jQuery.dir(elem, "previousSibling"); + prevAll: function( elem ) { + return jQuery.dir( elem, "previousSibling" ); }, - nextUntil: function (elem, i, until) { - return jQuery.dir(elem, "nextSibling", until); + nextUntil: function( elem, i, until ) { + return jQuery.dir( elem, "nextSibling", until ); }, - prevUntil: function (elem, i, until) { - return jQuery.dir(elem, "previousSibling", until); + prevUntil: function( elem, i, until ) { + return jQuery.dir( elem, "previousSibling", until ); }, - siblings: function (elem) { - return jQuery.sibling(( elem.parentNode || {} ).firstChild, elem); + siblings: function( elem ) { + return jQuery.sibling( ( elem.parentNode || {} ).firstChild, elem ); }, - children: function (elem) { - return jQuery.sibling(elem.firstChild); + children: function( elem ) { + return jQuery.sibling( elem.firstChild ); }, - contents: function (elem) { - return jQuery.nodeName(elem, "iframe") ? - elem.contentDocument || elem.contentWindow.document : - jQuery.merge([], elem.childNodes); + contents: function( elem ) { + return elem.contentDocument || jQuery.merge( [], elem.childNodes ); } - }, function (name, fn) { - jQuery.fn[name] = function (until, selector) { - var ret = jQuery.map(this, fn, until); + }, function( name, fn ) { + jQuery.fn[ name ] = function( until, selector ) { + var matched = jQuery.map( this, fn, until ); - if (name.slice(-5) !== "Until") { + if ( name.slice( -5 ) !== "Until" ) { selector = until; } - if (selector && typeof selector === "string") { - ret = jQuery.filter(selector, ret); + if ( selector && typeof selector === "string" ) { + matched = jQuery.filter( selector, matched ); } - if (this.length > 1) { + if ( this.length > 1 ) { // Remove duplicates - if (!guaranteedUnique[name]) { - ret = jQuery.unique(ret); + if ( !guaranteedUnique[ name ] ) { + jQuery.unique( matched ); } // Reverse order for parents* and prev-derivatives - if (rparentsprev.test(name)) { - ret = ret.reverse(); + if ( rparentsprev.test( name ) ) { + matched.reverse(); } } - return this.pushStack(ret); + return this.pushStack( matched ); }; }); var rnotwhite = (/\S+/g); + // 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; + function createOptions( options ) { + var object = optionsCache[ options ] = {}; + jQuery.each( options.match( rnotwhite ) || [], function( _, flag ) { + object[ flag ] = true; }); return object; } @@ -3116,51 +3063,51 @@ * stopOnFalse: interrupt callings when a callback returns false * */ - jQuery.Callbacks = function (options) { + 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); + ( optionsCache[ options ] || createOptions( options ) ) : + jQuery.extend( {}, options ); - var // Flag to know if list is currently firing - firing, - // Last fire value (for non-forgettable lists) + 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, - // First callback to fire (used internally by add and fireWith) - firingStart, // Actual callback list list = [], // Stack of fire calls for repeatable lists stack = !options.once && [], // Fire callbacks - fire = function (data) { + 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) { + 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()); + if ( list ) { + if ( stack ) { + if ( stack.length ) { + fire( stack.shift() ); } - } else if (memory) { + } else if ( memory ) { list = []; } else { self.disable(); @@ -3170,49 +3117,49 @@ // Actual Callbacks object self = { // Add a callback or a collection of callbacks to the list - add: function () { - if (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); + (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") { + } else if ( arg && arg.length && type !== "string" ) { // Inspect recursively - add(arg); + add( arg ); } }); - })(arguments); + })( arguments ); // Do we need to add the callbacks to the // current firing batch? - if (firing) { + if ( firing ) { firingLength = list.length; // With memory, if we're not firing then // we should call right away - } else if (memory) { + } else if ( memory ) { firingStart = start; - fire(memory); + fire( memory ); } } return this; }, // Remove a callback from the list - remove: function () { - if (list) { - jQuery.each(arguments, function (_, arg) { + remove: function() { + if ( list ) { + jQuery.each( arguments, function( _, arg ) { var index; - while (( index = jQuery.inArray(arg, list, index) ) > -1) { - list.splice(index, 1); + while ( ( index = jQuery.inArray( arg, list, index ) ) > -1 ) { + list.splice( index, 1 ); // Handle firing indexes - if (firing) { - if (index <= firingLength) { + if ( firing ) { + if ( index <= firingLength ) { firingLength--; } - if (index <= firingIndex) { + if ( index <= firingIndex ) { firingIndex--; } } @@ -3223,56 +3170,56 @@ }, // 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 ); + has: function( fn ) { + return fn ? jQuery.inArray( fn, list ) > -1 : !!( list && list.length ); }, // Remove all callbacks from the list - empty: function () { + empty: function() { list = []; firingLength = 0; return this; }, // Have the list do nothing anymore - disable: function () { + disable: function() { list = stack = memory = undefined; return this; }, // Is it disabled? - disabled: function () { + disabled: function() { return !list; }, // Lock the list in its current state - lock: function () { + lock: function() { stack = undefined; - if (!memory) { + if ( !memory ) { self.disable(); } return this; }, // Is it locked? - locked: function () { + locked: function() { return !stack; }, // Call all callbacks with the given context and arguments - fireWith: function (context, args) { - if (list && ( !fired || stack )) { + fireWith: function( context, args ) { + if ( list && ( !fired || stack ) ) { args = args || []; - args = [context, args.slice ? args.slice() : args]; - if (firing) { - stack.push(args); + args = [ context, args.slice ? args.slice() : args ]; + if ( firing ) { + stack.push( args ); } else { - fire(args); + fire( args ); } } return this; }, // Call all the callbacks with the given arguments - fire: function () { - self.fireWith(this, arguments); + fire: function() { + self.fireWith( this, arguments ); return this; }, // To know if the callbacks have already been called at least once - fired: function () { + fired: function() { return !!fired; } }; @@ -3283,37 +3230,37 @@ jQuery.extend({ - Deferred: function (func) { + 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")] + [ "resolve", "done", jQuery.Callbacks("once memory"), "resolved" ], + [ "reject", "fail", jQuery.Callbacks("once memory"), "rejected" ], + [ "notify", "progress", jQuery.Callbacks("memory") ] ], state = "pending", promise = { - state: function () { + state: function() { return state; }, - always: function () { - deferred.done(arguments).fail(arguments); + always: function() { + deferred.done( arguments ).fail( arguments ); return this; }, - then: function (/* fnDone, fnFail, fnProgress */) { + 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]; + 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)) { + 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); + .done( newDefer.resolve ) + .fail( newDefer.reject ) + .progress( newDefer.notify ); } else { - newDefer[tuple[0] + "With"](this === promise ? newDefer.promise() : this, fn ? [returned] : arguments); + newDefer[ tuple[ 0 ] + "With" ]( this === promise ? newDefer.promise() : this, fn ? [ returned ] : arguments ); } }); }); @@ -3322,8 +3269,8 @@ }, // 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; + promise: function( obj ) { + return obj != null ? jQuery.extend( obj, promise ) : promise; } }, deferred = {}; @@ -3332,37 +3279,37 @@ promise.pipe = promise.then; // Add list-specific methods - jQuery.each(tuples, function (i, tuple) { - var list = tuple[2], - stateString = tuple[3]; + jQuery.each( tuples, function( i, tuple ) { + var list = tuple[ 2 ], + stateString = tuple[ 3 ]; // promise[ done | fail | progress ] = list.add - promise[tuple[1]] = list.add; + promise[ tuple[1] ] = list.add; // Handle state - if (stateString) { - list.add(function () { + 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); + }, 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); + deferred[ tuple[0] ] = function() { + deferred[ tuple[0] + "With" ]( this === deferred ? promise : this, arguments ); return this; }; - deferred[tuple[0] + "With"] = list.fireWith; + deferred[ tuple[0] + "With" ] = list.fireWith; }); // Make the deferred a promise - promise.promise(deferred); + promise.promise( deferred ); // Call given func if any - if (func) { - func.call(deferred, deferred); + if ( func ) { + func.call( deferred, deferred ); } // All done! @@ -3370,53 +3317,52 @@ }, // Deferred helper - when: function (subordinate /* , ..., subordinateN */) { + when: function( subordinate /* , ..., subordinateN */ ) { var i = 0, - resolveValues = slice.call(arguments), + resolveValues = slice.call( arguments ), length = resolveValues.length, // the count of uncompleted subordinates - remaining = length !== 1 || ( subordinate && jQuery.isFunction(subordinate.promise) ) ? length : 0, + 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); + 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)); + // 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); + // If we're not waiting on anything, resolve the master + if ( !remaining ) { + deferred.resolveWith( resolveContexts, resolveValues ); } return deferred.promise(); @@ -3427,9 +3373,9 @@ // The deferred used on DOM ready var readyList; - jQuery.fn.ready = function (fn) { + jQuery.fn.ready = function( fn ) { // Add the callback - jQuery.ready.promise().done(fn); + jQuery.ready.promise().done( fn ); return this; }; @@ -3443,734 +3389,120 @@ readyWait: 1, // Hold (or release) the ready event - holdReady: function (hold) { - if (hold) { + holdReady: function( hold ) { + if ( hold ) { jQuery.readyWait++; } else { - jQuery.ready(true); + jQuery.ready( true ); } }, // Handle when the DOM is ready - ready: function (wait) { + ready: function( wait ) { // Abort if there are pending holds or we're already ready - if (wait === true ? --jQuery.readyWait : jQuery.isReady) { + if ( wait === true ? --jQuery.readyWait : jQuery.isReady ) { return; } - // Make sure body exists, at least, in case IE gets a little overzealous (ticket #5443). - if (!document.body) { - return setTimeout(jQuery.ready); - } - // Remember that the DOM is ready jQuery.isReady = true; // If a normal DOM Ready event fired, decrement, and wait if need be - if (wait !== true && --jQuery.readyWait > 0) { + if ( wait !== true && --jQuery.readyWait > 0 ) { return; } // If there are functions bound, to execute - readyList.resolveWith(document, [jQuery]); + readyList.resolveWith( document, [ jQuery ] ); // Trigger any bound ready events - if (jQuery.fn.triggerHandler) { - jQuery(document).triggerHandler("ready"); - jQuery(document).off("ready"); + if ( jQuery.fn.triggerHandler ) { + jQuery( document ).triggerHandler( "ready" ); + jQuery( document ).off( "ready" ); } } }); - /** - * Clean-up method for dom ready events - */ - function detach() { - if (document.addEventListener) { - document.removeEventListener("DOMContentLoaded", completed, false); - window.removeEventListener("load", completed, false); - - } else { - document.detachEvent("onreadystatechange", completed); - window.detachEvent("onload", completed); - } - } - /** * The ready event handler and self cleanup method */ function completed() { - // readyState === "complete" is good enough for us to call the dom ready in oldIE - if (document.addEventListener || event.type === "load" || document.readyState === "complete") { - detach(); - jQuery.ready(); - } + document.removeEventListener( "DOMContentLoaded", completed, false ); + window.removeEventListener( "load", completed, false ); + jQuery.ready(); } - jQuery.ready.promise = function (obj) { - if (!readyList) { + 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 + // 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") { + if ( document.readyState === "complete" ) { // Handle it asynchronously to allow scripts the opportunity to delay ready - setTimeout(jQuery.ready); + setTimeout( jQuery.ready ); + + } else { - // Standards-based browsers support DOMContentLoaded - } else if (document.addEventListener) { // Use the handy event callback - document.addEventListener("DOMContentLoaded", completed, false); + document.addEventListener( "DOMContentLoaded", completed, false ); // A fallback to window.onload, that will always work - window.addEventListener("load", completed, false); - - // If IE event model is used - } else { - // Ensure firing before onload, maybe late but safe also for iframes - document.attachEvent("onreadystatechange", completed); - - // A fallback to window.onload, that will always work - window.attachEvent("onload", completed); - - // If IE and not a frame - // continually check to see if the document is ready - var top = false; - - try { - top = window.frameElement == null && document.documentElement; - } catch (e) { - } - - if (top && top.doScroll) { - (function doScrollCheck() { - if (!jQuery.isReady) { - - try { - // Use the trick by Diego Perini - // http://javascript.nwbox.com/IEContentLoaded/ - top.doScroll("left"); - } catch (e) { - return setTimeout(doScrollCheck, 50); - } - - // detach all dom ready events - detach(); - - // and execute any waiting functions - jQuery.ready(); - } - })(); - } + window.addEventListener( "load", completed, false ); } } - return readyList.promise(obj); + return readyList.promise( obj ); }; +// Kick off the DOM ready check even if the user does not + jQuery.ready.promise(); - var strundefined = typeof undefined; -// Support: IE<9 -// Iteration over object's inherited properties before its own - var i; - for (i in jQuery(support)) { - break; - } - support.ownLast = i !== "0"; - -// Note: most support tests are defined in their respective modules. -// false until the test is run - support.inlineBlockNeedsLayout = false; - -// Execute ASAP in case we need to set body.style.zoom - jQuery(function () { - // Minified: var a,b,c,d - var val, div, body, container; - - body = document.getElementsByTagName("body")[0]; - if (!body || !body.style) { - // Return for frameset docs that don't have a body - return; - } - - // Setup - div = document.createElement("div"); - container = document.createElement("div"); - container.style.cssText = "position:absolute;border:0;width:0;height:0;top:0;left:-9999px"; - body.appendChild(container).appendChild(div); - - if (typeof div.style.zoom !== strundefined) { - // Support: IE<8 - // Check if natively block-level elements act like inline-block - // elements when setting their display to 'inline' and giving - // them layout - div.style.cssText = "display:inline;margin:0;border:0;padding:1px;width:1px;zoom:1"; - - support.inlineBlockNeedsLayout = val = div.offsetWidth === 3; - if (val) { - // Prevent IE 6 from affecting layout for positioned elements #11048 - // Prevent IE from shrinking the body in IE 7 mode #12869 - // Support: IE<8 - body.style.zoom = 1; - } - } - - body.removeChild(container); - }); - - - (function () { - var div = document.createElement("div"); - - // Execute the test only if not already executed in another module. - if (support.deleteExpando == null) { - // Support: IE<9 - support.deleteExpando = true; - try { - delete div.test; - } catch (e) { - support.deleteExpando = false; - } - } - - // Null elements to avoid leaks in IE. - div = null; - })(); - - - /** - * Determines whether an object can have data - */ - jQuery.acceptData = function (elem) { - var noData = jQuery.noData[(elem.nodeName + " ").toLowerCase()], - nodeType = +elem.nodeType || 1; - - // Do not set data on non-element DOM nodes because it will not be cleared (#8335). - return nodeType !== 1 && nodeType !== 9 ? - false : - - // Nodes accept data unless otherwise specified; rejection can be conditional - !noData || noData !== true && elem.getAttribute("classid") === noData; - }; - - - var rbrace = /^(?:\{[\w\W]*\}|\[[\w\W]*\])$/, - rmultiDash = /([A-Z])/g; - - function dataAttr(elem, key, data) { - // If nothing was found internally, try to fetch any - // data from the HTML5 data-* attribute - if (data === undefined && elem.nodeType === 1) { - - var name = "data-" + key.replace(rmultiDash, "-$1").toLowerCase(); - - data = elem.getAttribute(name); - - if (typeof data === "string") { - try { - data = data === "true" ? true : - data === "false" ? false : - data === "null" ? null : - // Only convert to a number if it doesn't change the string - +data + "" === data ? +data : - rbrace.test(data) ? jQuery.parseJSON(data) : - data; - } catch (e) { - } - - // Make sure we set the data so it isn't changed later - jQuery.data(elem, key, data); - - } else { - data = undefined; - } - } - - return data; - } - -// checks a cache object for emptiness - function isEmptyDataObject(obj) { - var name; - for (name in obj) { - - // if the public data object is empty, the private is still empty - if (name === "data" && jQuery.isEmptyObject(obj[name])) { - continue; - } - if (name !== "toJSON") { - return false; - } - } - - return true; - } - - function internalData(elem, name, data, pvt /* Internal Use Only */) { - if (!jQuery.acceptData(elem)) { - return; - } - - var ret, thisCache, - internalKey = jQuery.expando, - - // We have to handle DOM nodes and JS objects differently because IE6-7 - // can't GC object references properly across the DOM-JS boundary - isNode = elem.nodeType, - - // Only DOM nodes need the global jQuery cache; JS object data is - // attached directly to the object so GC can occur automatically - cache = isNode ? jQuery.cache : elem, - - // Only defining an ID for JS objects if its cache already exists allows - // the code to shortcut on the same path as a DOM node with no cache - id = isNode ? elem[internalKey] : elem[internalKey] && internalKey; - - // Avoid doing any more work than we need to when trying to get data on an - // object that has no data at all - if ((!id || !cache[id] || (!pvt && !cache[id].data)) && data === undefined && typeof name === "string") { - return; - } - - if (!id) { - // Only DOM nodes need a new unique ID for each element since their data - // ends up in the global cache - if (isNode) { - id = elem[internalKey] = deletedIds.pop() || jQuery.guid++; - } else { - id = internalKey; - } - } - - if (!cache[id]) { - // Avoid exposing jQuery metadata on plain JS objects when the object - // is serialized using JSON.stringify - cache[id] = isNode ? {} : {toJSON: jQuery.noop}; - } - - // An object can be passed to jQuery.data instead of a key/value pair; this gets - // shallow copied over onto the existing cache - if (typeof name === "object" || typeof name === "function") { - if (pvt) { - cache[id] = jQuery.extend(cache[id], name); - } else { - cache[id].data = jQuery.extend(cache[id].data, name); - } - } - - thisCache = cache[id]; - - // jQuery data() is stored in a separate object inside the object's internal data - // cache in order to avoid key collisions between internal data and user-defined - // data. - if (!pvt) { - if (!thisCache.data) { - thisCache.data = {}; - } - - thisCache = thisCache.data; - } - - if (data !== undefined) { - thisCache[jQuery.camelCase(name)] = data; - } - - // Check for both converted-to-camel and non-converted data property names - // If a data property was specified - if (typeof name === "string") { - - // First Try to find as-is property data - ret = thisCache[name]; - - // Test for null|undefined property data - if (ret == null) { - - // Try to find the camelCased property - ret = thisCache[jQuery.camelCase(name)]; - } - } else { - ret = thisCache; - } - - return ret; - } - - function internalRemoveData(elem, name, pvt) { - if (!jQuery.acceptData(elem)) { - return; - } - - var thisCache, i, - isNode = elem.nodeType, - - // See jQuery.data for more information - cache = isNode ? jQuery.cache : elem, - id = isNode ? elem[jQuery.expando] : jQuery.expando; - - // If there is already no cache entry for this object, there is no - // purpose in continuing - if (!cache[id]) { - return; - } - - if (name) { - - thisCache = pvt ? cache[id] : cache[id].data; - - if (thisCache) { - - // Support array or space separated string names for data keys - if (!jQuery.isArray(name)) { - - // try the string as a key before any manipulation - if (name in thisCache) { - name = [name]; - } else { - - // split the camel cased version by spaces unless a key with the spaces exists - name = jQuery.camelCase(name); - if (name in thisCache) { - name = [name]; - } else { - name = name.split(" "); - } - } - } else { - // If "name" is an array of keys... - // When data is initially created, via ("key", "val") signature, - // keys will be converted to camelCase. - // Since there is no way to tell _how_ a key was added, remove - // both plain key and camelCase key. #12786 - // This will only penalize the array argument path. - name = name.concat(jQuery.map(name, jQuery.camelCase)); - } - - i = name.length; - while (i--) { - delete thisCache[name[i]]; - } - - // If there is no data left in the cache, we want to continue - // and let the cache object itself get destroyed - if (pvt ? !isEmptyDataObject(thisCache) : !jQuery.isEmptyObject(thisCache)) { - return; - } - } - } - - // See jQuery.data for more information - if (!pvt) { - delete cache[id].data; - - // Don't destroy the parent cache unless the internal data object - // had been the only thing left in it - if (!isEmptyDataObject(cache[id])) { - return; - } - } - - // Destroy the cache - if (isNode) { - jQuery.cleanData([elem], true); - - // Use delete when supported for expandos or `cache` is not a window per isWindow (#10080) - /* jshint eqeqeq: false */ - } else if (support.deleteExpando || cache != cache.window) { - /* jshint eqeqeq: true */ - delete cache[id]; - - // When all else fails, null - } else { - cache[id] = null; - } - } - - jQuery.extend({ - cache: {}, - - // The following elements (space-suffixed to avoid Object.prototype collisions) - // throw uncatchable exceptions if you attempt to set expando properties - noData: { - "applet ": true, - "embed ": true, - // ...but Flash objects (which have this classid) *can* handle expandos - "object ": "clsid:D27CDB6E-AE6D-11cf-96B8-444553540000" - }, - - hasData: function (elem) { - elem = elem.nodeType ? jQuery.cache[elem[jQuery.expando]] : elem[jQuery.expando]; - return !!elem && !isEmptyDataObject(elem); - }, - - data: function (elem, name, data) { - return internalData(elem, name, data); - }, - - removeData: function (elem, name) { - return internalRemoveData(elem, name); - }, - - // For internal use only. - _data: function (elem, name, data) { - return internalData(elem, name, data, true); - }, - - _removeData: function (elem, name) { - return internalRemoveData(elem, name, true); - } - }); - - jQuery.fn.extend({ - data: function (key, value) { - var i, name, data, - elem = this[0], - attrs = elem && elem.attributes; - - // Special expections of .data basically thwart jQuery.access, - // so implement the relevant behavior ourselves - - // Gets all values - if (key === undefined) { - if (this.length) { - data = jQuery.data(elem); - - if (elem.nodeType === 1 && !jQuery._data(elem, "parsedAttrs")) { - 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]); - } - } - } - jQuery._data(elem, "parsedAttrs", true); - } - } - - return data; - } - - // Sets multiple values - if (typeof key === "object") { - return this.each(function () { - jQuery.data(this, key); - }); - } - - return arguments.length > 1 ? - - // Sets one value - this.each(function () { - jQuery.data(this, key, value); - }) : - - // Gets one value - // Try to fetch any internally stored data first - elem ? dataAttr(elem, key, jQuery.data(elem, key)) : undefined; - }, - - removeData: function (key) { - return this.each(function () { - jQuery.removeData(this, key); - }); - } - }); - - - jQuery.extend({ - queue: function (elem, type, data) { - var queue; - - if (elem) { - type = ( type || "fx" ) + "queue"; - queue = jQuery._data(elem, type); - - // Speed up dequeue by getting out quickly if this is just a lookup - if (data) { - if (!queue || jQuery.isArray(data)) { - queue = jQuery._data(elem, type, jQuery.makeArray(data)); - } else { - queue.push(data); - } - } - return queue || []; - } - }, - - dequeue: function (elem, type) { - type = type || "fx"; - - var queue = jQuery.queue(elem, type), - startLength = queue.length, - fn = queue.shift(), - hooks = jQuery._queueHooks(elem, type), - next = function () { - jQuery.dequeue(elem, type); - }; - - // If the fx queue is dequeued, always remove the progress sentinel - if (fn === "inprogress") { - fn = queue.shift(); - startLength--; - } - - if (fn) { - - // Add a progress sentinel to prevent the fx queue from being - // automatically dequeued - if (type === "fx") { - queue.unshift("inprogress"); - } - - // clear up the last queue stop function - delete hooks.stop; - fn.call(elem, next, hooks); - } - - if (!startLength && hooks) { - hooks.empty.fire(); - } - }, - - // not intended for public consumption - generates a queueHooks object, or returns the current one - _queueHooks: function (elem, type) { - var key = type + "queueHooks"; - return jQuery._data(elem, key) || jQuery._data(elem, key, { - empty: jQuery.Callbacks("once memory").add(function () { - jQuery._removeData(elem, type + "queue"); - jQuery._removeData(elem, key); - }) - }); - } - }); - - jQuery.fn.extend({ - queue: function (type, data) { - var setter = 2; - - if (typeof type !== "string") { - data = type; - type = "fx"; - setter--; - } - - if (arguments.length < setter) { - return jQuery.queue(this[0], type); - } - - return data === undefined ? - this : - this.each(function () { - var queue = jQuery.queue(this, type, data); - - // ensure a hooks for this queue - jQuery._queueHooks(this, type); - - if (type === "fx" && queue[0] !== "inprogress") { - jQuery.dequeue(this, type); - } - }); - }, - dequeue: function (type) { - return this.each(function () { - jQuery.dequeue(this, type); - }); - }, - clearQueue: function (type) { - return this.queue(type || "fx", []); - }, - // Get a promise resolved when queues of a certain type - // are emptied (fx is the type by default) - promise: function (type, obj) { - var tmp, - count = 1, - defer = jQuery.Deferred(), - elements = this, - i = this.length, - resolve = function () { - if (!( --count )) { - defer.resolveWith(elements, [elements]); - } - }; - - if (typeof type !== "string") { - obj = type; - type = undefined; - } - type = type || "fx"; - - while (i--) { - tmp = jQuery._data(elements[i], type + "queueHooks"); - if (tmp && tmp.empty) { - count++; - tmp.empty.add(resolve); - } - } - resolve(); - return defer.promise(obj); - } - }); - var pnum = (/[+-]?(?:\d*\.|)\d+(?:[eE][+-]?\d+|)/).source; - - var cssExpand = ["Top", "Right", "Bottom", "Left"]; - - var isHidden = 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); - }; - // 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 access = jQuery.access = function( elems, fn, key, value, chainable, emptyGet, raw ) { var i = 0, - length = elems.length, + len = elems.length, bulk = key == null; // Sets many values - if (jQuery.type(key) === "object") { + if ( jQuery.type( key ) === "object" ) { chainable = true; - for (i in key) { - jQuery.access(elems, fn, i, key[i], true, emptyGet, raw); + for ( i in key ) { + jQuery.access( elems, fn, i, key[i], true, emptyGet, raw ); } // Sets one value - } else if (value !== undefined) { + } else if ( value !== undefined ) { chainable = true; - if (!jQuery.isFunction(value)) { + if ( !jQuery.isFunction( value ) ) { raw = true; } - if (bulk) { + if ( bulk ) { // Bulk operations run against the entire set - if (raw) { - fn.call(elems, value); + 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); + fn = function( elem, key, value ) { + return bulk.call( jQuery( elem ), value ); }; } } - if (fn) { - for (; i < length; i++) { - fn(elems[i], key, raw ? value : value.call(elems[i], i, fn(elems[i], key))); + if ( fn ) { + for ( ; i < len; i++ ) { + fn( elems[i], key, raw ? value : value.call( elems[i], i, fn( elems[i], key ) ) ); } } } @@ -4180,103 +3512,552 @@ // Gets bulk ? - fn.call(elems) : - length ? fn(elems[0], key) : emptyGet; + fn.call( elems ) : + len ? fn( elems[0], key ) : emptyGet; }; + + + /** + * 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 ); + }; + + + 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 + Data.uid++; + } + + 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 ] ]; + } + } + }; + var data_priv = new Data(); + + var data_user = new Data(); + + + +// 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 ); + }); + } + }); + + + 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 public - generate a queueHooks object, or return 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 ); + } + }); + var pnum = (/[+-]?(?:\d*\.|)\d+(?:[eE][+-]?\d+|)/).source; + + var cssExpand = [ "Top", "Right", "Bottom", "Left" ]; + + var isHidden = 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 ); + }; + var rcheckableType = (/^(?:checkbox|radio)$/i); - (function () { - // Minified: var a,b,c - var input = document.createElement("input"), - div = document.createElement("div"), - fragment = document.createDocumentFragment(); - // Setup - div.innerHTML = "
a"; + (function() { + var fragment = document.createDocumentFragment(), + div = fragment.appendChild( document.createElement( "div" ) ), + input = document.createElement( "input" ); - // IE strips leading whitespace when .innerHTML is used - support.leadingWhitespace = div.firstChild.nodeType === 3; + // Support: Safari<=5.1 + // Check state lost if the name is set (#11217) + // Support: Windows Web Apps (WWA) + // `name` and `type` must use .setAttribute for WWA (#14901) + input.setAttribute( "type", "radio" ); + input.setAttribute( "checked", "checked" ); + input.setAttribute( "name", "t" ); - // Make sure that tbody elements aren't automatically inserted - // IE will insert them into empty tables - support.tbody = !div.getElementsByTagName("tbody").length; + div.appendChild( input ); - // Make sure that link elements get serialized correctly by innerHTML - // This requires a wrapper element in IE - support.htmlSerialize = !!div.getElementsByTagName("link").length; - - // Makes sure cloning an html5 element does not cause problems - // Where outerHTML is undefined, this still works - support.html5Clone = - document.createElement("nav").cloneNode(true).outerHTML !== "<:nav>"; - - // Check if a disconnected checkbox will retain its checked - // value of true after appended to the DOM (IE6/7) - input.type = "checkbox"; - input.checked = true; - fragment.appendChild(input); - support.appendChecked = input.checked; + // Support: Safari<=5.1, Android<4.2 + // Older WebKit doesn't clone checked state correctly in fragments + support.checkClone = div.cloneNode( true ).cloneNode( true ).lastChild.checked; + // Support: IE<=11+ // Make sure textarea (and checkbox) defaultValue is properly cloned - // Support: IE6-IE11+ div.innerHTML = ""; - support.noCloneChecked = !!div.cloneNode(true).lastChild.defaultValue; - - // #11217 - WebKit loses check when the name is after the checked attribute - fragment.appendChild(div); - div.innerHTML = ""; - - // 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; - - // Support: IE<9 - // Opera does not clone events (and typeof div.attachEvent === undefined). - // IE9-10 clones events bound via attachEvent, but they don't trigger with .click() - support.noCloneEvent = true; - if (div.attachEvent) { - div.attachEvent("onclick", function () { - support.noCloneEvent = false; - }); - - div.cloneNode(true).click(); - } - - // Execute the test only if not already executed in another module. - if (support.deleteExpando == null) { - // Support: IE<9 - support.deleteExpando = true; - try { - delete div.test; - } catch (e) { - support.deleteExpando = false; - } - } + support.noCloneChecked = !!div.cloneNode( true ).lastChild.defaultValue; })(); + var strundefined = typeof undefined; - (function () { - var i, eventName, - div = document.createElement("div"); - // Support: IE<9 (lack submit/change bubble), Firefox 23+ (lack focusin event) - for (i in {submit: true, change: true, focusin: true}) { - eventName = "on" + i; - - if (!(support[i + "Bubbles"] = eventName in window)) { - // Beware of CSP restrictions (https://developer.mozilla.org/en/Security/CSP) - div.setAttribute(eventName, "t"); - support[i + "Bubbles"] = div.attributes[eventName].expando === false; - } - } - - // Null elements to avoid leaks in IE. - div = null; - })(); + support.focusinBubbles = "onfocusin" in window; - var rformElems = /^(?:input|select|textarea)$/i, + var rkeyEvent = /^key/, rmouseEvent = /^(?:mouse|pointer|contextmenu)|click/, rfocusMorph = /^(?:focusinfocus|focusoutblur)$/, @@ -4293,8 +4074,7 @@ function safeActiveElement() { try { return document.activeElement; - } catch (err) { - } + } catch ( err ) { } } /* @@ -4305,66 +4085,64 @@ global: {}, - add: function (elem, types, handler, data, selector) { - var tmp, events, t, handleObjIn, - special, eventHandle, handleObj, - handlers, type, namespaces, origType, - elemData = jQuery._data(elem); + 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) { + if ( !elemData ) { return; } // Caller can pass in an object of custom data in lieu of the handler - if (handler.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) { + 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)) { + if ( !(events = elemData.events) ) { events = elemData.events = {}; } - if (!(eventHandle = elemData.handle)) { - eventHandle = elemData.handle = function (e) { + 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 && (!e || jQuery.event.triggered !== e.type) ? - jQuery.event.dispatch.apply(eventHandle.elem, arguments) : - undefined; + return typeof jQuery !== strundefined && jQuery.event.triggered !== e.type ? + jQuery.event.dispatch.apply( elem, arguments ) : undefined; }; - // Add elem as a property of the handle fn to prevent a memory leak with IE non-native events - eventHandle.elem = elem; } // Handle multiple events separated by a space - types = ( types || "" ).match(rnotwhite) || [""]; + types = ( types || "" ).match( rnotwhite ) || [ "" ]; t = types.length; - while (t--) { - tmp = rtypenamespace.exec(types[t]) || []; + while ( t-- ) { + tmp = rtypenamespace.exec( types[t] ) || []; type = origType = tmp[1]; - namespaces = ( tmp[2] || "" ).split(".").sort(); + namespaces = ( tmp[2] || "" ).split( "." ).sort(); // There *must* be a type, no attaching namespace-only handlers - if (!type) { + if ( !type ) { continue; } // If event changes its type, use the special event handlers for the changed type - special = jQuery.event.special[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] || {}; + special = jQuery.event.special[ type ] || {}; // handleObj is passed to all event handlers handleObj = jQuery.extend({ @@ -4374,144 +4152,135 @@ handler: handler, guid: handler.guid, selector: selector, - needsContext: selector && jQuery.expr.match.needsContext.test(selector), + needsContext: selector && jQuery.expr.match.needsContext.test( selector ), namespace: namespaces.join(".") - }, handleObjIn); + }, handleObjIn ); // Init the event handler queue if we're the first - if (!(handlers = events[type])) { - handlers = events[type] = []; + if ( !(handlers = events[ type ]) ) { + handlers = events[ type ] = []; handlers.delegateCount = 0; - // Only use addEventListener/attachEvent if the special events handler returns false - if (!special.setup || special.setup.call(elem, data, namespaces, eventHandle) === false) { - // Bind the global event handler to the element - if (elem.addEventListener) { - elem.addEventListener(type, eventHandle, false); - - } else if (elem.attachEvent) { - elem.attachEvent("on" + type, eventHandle); + // 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 ( special.add ) { + special.add.call( elem, handleObj ); - if (!handleObj.handler.guid) { + 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); + if ( selector ) { + handlers.splice( handlers.delegateCount++, 0, handleObj ); } else { - handlers.push(handleObj); + handlers.push( handleObj ); } // Keep track of which events have ever been used, for event optimization - jQuery.event.global[type] = true; + jQuery.event.global[ type ] = true; } - // Nullify elem to prevent memory leaks in IE - elem = null; }, // Detach an event or set of events from an element - remove: function (elem, types, handler, selector, mappedTypes) { - var j, handleObj, tmp, - origCount, t, events, - special, handlers, type, - namespaces, origType, - elemData = jQuery.hasData(elem) && jQuery._data(elem); + remove: function( elem, types, handler, selector, mappedTypes ) { - if (!elemData || !(events = elemData.events)) { + 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) || [""]; + types = ( types || "" ).match( rnotwhite ) || [ "" ]; t = types.length; - while (t--) { - tmp = rtypenamespace.exec(types[t]) || []; + while ( t-- ) { + tmp = rtypenamespace.exec( types[t] ) || []; type = origType = tmp[1]; - namespaces = ( tmp[2] || "" ).split(".").sort(); + 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); + if ( !type ) { + for ( type in events ) { + jQuery.event.remove( elem, type + types[ t ], handler, selector, true ); } continue; } - special = jQuery.event.special[type] || {}; + special = jQuery.event.special[ type ] || {}; type = ( selector ? special.delegateType : special.bindType ) || type; - handlers = events[type] || []; - tmp = tmp[2] && new RegExp("(^|\\.)" + namespaces.join("\\.(?:.*\\.|)") + "(\\.|$)"); + handlers = events[ type ] || []; + tmp = tmp[2] && new RegExp( "(^|\\.)" + namespaces.join("\\.(?:.*\\.|)") + "(\\.|$)" ); // Remove matching events origCount = j = handlers.length; - while (j--) { - handleObj = handlers[j]; + while ( j-- ) { + handleObj = handlers[ j ]; - if (( mappedTypes || origType === handleObj.origType ) && + 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); + ( !tmp || tmp.test( handleObj.namespace ) ) && + ( !selector || selector === handleObj.selector || selector === "**" && handleObj.selector ) ) { + handlers.splice( j, 1 ); - if (handleObj.selector) { + if ( handleObj.selector ) { handlers.delegateCount--; } - if (special.remove) { - special.remove.call(elem, handleObj); + 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); + if ( origCount && !handlers.length ) { + if ( !special.teardown || special.teardown.call( elem, namespaces, elemData.handle ) === false ) { + jQuery.removeEvent( elem, type, elemData.handle ); } - delete events[type]; + delete events[ type ]; } } // Remove the expando if it's no longer used - if (jQuery.isEmptyObject(events)) { + if ( jQuery.isEmptyObject( events ) ) { delete elemData.handle; - - // removeData also checks for emptiness and clears the expando if empty - // so use it instead of delete - jQuery._removeData(elem, "events"); + data_priv.remove( elem, "events" ); } }, - trigger: function (event, data, elem, onlyHandlers) { - var handle, ontype, cur, - bubbleType, special, tmp, i, - eventPath = [elem || document], - type = hasOwn.call(event, "type") ? event.type : event, - namespaces = hasOwn.call(event, "namespace") ? event.namespace.split(".") : []; + 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) { + 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)) { + if ( rfocusMorph.test( type + jQuery.event.triggered ) ) { return; } - if (type.indexOf(".") >= 0) { + if ( type.indexOf(".") >= 0 ) { // Namespaced trigger; create a regexp to match event type in handle() namespaces = type.split("."); type = namespaces.shift(); @@ -4520,72 +4289,72 @@ 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 = event[ jQuery.expando ] ? event : - new jQuery.Event(type, typeof event === "object" && 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("\\.(?:.*\\.|)") + "(\\.|$)") : + new RegExp( "(^|\\.)" + namespaces.join("\\.(?:.*\\.|)") + "(\\.|$)" ) : null; // Clean up the event in case it is being reused event.result = undefined; - if (!event.target) { + 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]); + [ 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) { + 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)) { + if ( !onlyHandlers && !special.noBubble && !jQuery.isWindow( elem ) ) { bubbleType = special.delegateType || type; - if (!rfocusMorph.test(bubbleType + type)) { + if ( !rfocusMorph.test( bubbleType + type ) ) { cur = cur.parentNode; } - for (; cur; cur = cur.parentNode) { - eventPath.push(cur); + 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); + 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()) { + while ( (cur = eventPath[i++]) && !event.isPropagationStopped() ) { event.type = i > 1 ? bubbleType : special.bindType || type; // jQuery handler - handle = ( jQuery._data(cur, "events") || {} )[event.type] && jQuery._data(cur, "handle"); - if (handle) { - handle.apply(cur, data); + 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) { + handle = ontype && cur[ ontype ]; + if ( handle && handle.apply && jQuery.acceptData( cur ) ) { + event.result = handle.apply( cur, data ); + if ( event.result === false ) { event.preventDefault(); } } @@ -4593,35 +4362,29 @@ event.type = type; // If nobody prevented the default action, do it now - if (!onlyHandlers && !event.isDefaultPrevented()) { + if ( !onlyHandlers && !event.isDefaultPrevented() ) { - if ((!special._default || special._default.apply(eventPath.pop(), data) === false) && - jQuery.acceptData(elem)) { + 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. - // Can't use an .isFunction() check here because IE6/7 fails that test. // Don't do default actions on window, that's where global variables be (#6170) - if (ontype && elem[type] && !jQuery.isWindow(elem)) { + 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]; + tmp = elem[ ontype ]; - if (tmp) { - elem[ontype] = null; + if ( tmp ) { + elem[ ontype ] = null; } // Prevent re-triggering of the same event, since we already bubbled it above jQuery.event.triggered = type; - try { - elem[type](); - } catch (e) { - // IE<9 dies on focus/blur to hidden element (#1486,#12518) - // only reproducible on winXP IE8 native, not IE9 in IE8 mode - } + elem[ type ](); jQuery.event.triggered = undefined; - if (tmp) { - elem[ontype] = tmp; + if ( tmp ) { + elem[ ontype ] = tmp; } } } @@ -4630,49 +4393,49 @@ return event.result; }, - dispatch: function (event) { + dispatch: function( event ) { // Make a writable jQuery.Event from the native event object - event = jQuery.event.fix(event); + event = jQuery.event.fix( event ); - var i, ret, handleObj, matched, j, + var i, j, ret, matched, handleObj, handlerQueue = [], - args = slice.call(arguments), - handlers = ( jQuery._data(this, "events") || {} )[event.type] || [], - special = jQuery.event.special[event.type] || {}; + 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) { + if ( special.preDispatch && special.preDispatch.call( this, event ) === false ) { return; } // Determine handlers - handlerQueue = jQuery.event.handlers.call(this, event, 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()) { + while ( (matched = handlerQueue[ i++ ]) && !event.isPropagationStopped() ) { event.currentTarget = matched.elem; j = 0; - while ((handleObj = matched.handlers[j++]) && !event.isImmediatePropagationStopped()) { + 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)) { + // 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); + ret = ( (jQuery.event.special[ handleObj.origType ] || {}).handle || handleObj.handler ) + .apply( matched.elem, args ); - if (ret !== undefined) { - if ((event.result = ret) === false) { + if ( ret !== undefined ) { + if ( (event.result = ret) === false ) { event.preventDefault(); event.stopPropagation(); } @@ -4682,15 +4445,15 @@ } // Call the postDispatch hook for the mapped type - if (special.postDispatch) { - special.postDispatch.call(this, event); + if ( special.postDispatch ) { + special.postDispatch.call( this, event ); } return event.result; }, - handlers: function (event, handlers) { - var sel, handleObj, matches, i, + handlers: function( event, handlers ) { + var i, matches, sel, handleObj, handlerQueue = [], delegateCount = handlers.delegateCount, cur = event.target; @@ -4698,92 +4461,43 @@ // Find delegate handlers // Black-hole SVG instance trees (#13180) // Avoid non-left-click bubbling in Firefox (#3861) - if (delegateCount && cur.nodeType && (!event.button || event.type !== "click")) { + if ( delegateCount && cur.nodeType && (!event.button || event.type !== "click") ) { - /* jshint eqeqeq: false */ - for (; cur != this; cur = cur.parentNode || this) { - /* jshint eqeqeq: true */ + for ( ; cur !== this; cur = cur.parentNode || this ) { - // Don't check non-elements (#13208) // Don't process clicks on disabled elements (#6911, #8165, #11382, #11764) - if (cur.nodeType === 1 && (cur.disabled !== true || event.type !== "click")) { + if ( cur.disabled !== true || event.type !== "click" ) { matches = []; - for (i = 0; i < delegateCount; i++) { - handleObj = handlers[i]; + 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 ] === 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[ sel ] ) { + matches.push( handleObj ); } } - if (matches.length) { - handlerQueue.push({elem: cur, handlers: matches}); + 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)}); + if ( delegateCount < handlers.length ) { + handlerQueue.push({ elem: this, handlers: handlers.slice( delegateCount ) }); } return handlerQueue; }, - fix: function (event) { - if (event[jQuery.expando]) { - return event; - } - - // Create a writable copy of the event object and normalize some properties - var i, prop, copy, - type = event.type, - originalEvent = event, - fixHook = this.fixHooks[type]; - - if (!fixHook) { - this.fixHooks[type] = fixHook = - rmouseEvent.test(type) ? this.mouseHooks : - rkeyEvent.test(type) ? this.keyHooks : - {}; - } - copy = fixHook.props ? this.props.concat(fixHook.props) : this.props; - - event = new jQuery.Event(originalEvent); - - i = copy.length; - while (i--) { - prop = copy[i]; - event[prop] = originalEvent[prop]; - } - - // Support: IE<9 - // Fix target property (#1925) - if (!event.target) { - event.target = originalEvent.srcElement || document; - } - - // Support: Chrome 23+, Safari? - // Target should not be a text node (#504, #13143) - if (event.target.nodeType === 3) { - event.target = event.target.parentNode; - } - - // Support: IE<9 - // For mouse/key events, metaKey==false if it's undefined (#3368, #11328) - event.metaKey = !!event.metaKey; - - return fixHook.filter ? fixHook.filter(event, originalEvent) : event; - }, - // Includes some event props shared by KeyEvent and MouseEvent props: "altKey bubbles cancelable ctrlKey currentTarget eventPhase metaKey relatedTarget shiftKey target timeStamp view which".split(" "), @@ -4791,10 +4505,10 @@ keyHooks: { props: "char charCode key keyCode".split(" "), - filter: function (event, original) { + filter: function( event, original ) { // Add which for key events - if (event.which == null) { + if ( event.which == null ) { event.which = original.charCode != null ? original.charCode : original.keyCode; } @@ -4803,30 +4517,24 @@ }, mouseHooks: { - props: "button buttons clientX clientY fromElement offsetX offsetY pageX pageY screenX screenY toElement".split(" "), - filter: function (event, original) { - var body, eventDoc, doc, - button = original.button, - fromElement = original.fromElement; + 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) { + if ( event.pageX == null && original.clientX != null ) { eventDoc = event.target.ownerDocument || document; doc = eventDoc.documentElement; body = eventDoc.body; event.pageX = original.clientX + ( doc && doc.scrollLeft || body && body.scrollLeft || 0 ) - ( doc && doc.clientLeft || body && body.clientLeft || 0 ); - event.pageY = original.clientY + ( doc && doc.scrollTop || body && body.scrollTop || 0 ) - ( doc && doc.clientTop || body && body.clientTop || 0 ); - } - - // Add relatedTarget, if necessary - if (!event.relatedTarget && fromElement) { - event.relatedTarget = fromElement === event.target ? original.toElement : fromElement; + 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) { + if ( !event.which && button !== undefined ) { event.which = ( button & 1 ? 1 : ( button & 2 ? 3 : ( button & 4 ? 2 : 0 ) ) ); } @@ -4834,6 +4542,48 @@ } }, + 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 @@ -4841,23 +4591,17 @@ }, focus: { // Fire native event if possible so blur/focus sequence is correct - trigger: function () { - if (this !== safeActiveElement() && this.focus) { - try { - this.focus(); - return false; - } catch (e) { - // Support: IE<9 - // If we error on focus to hidden element (#1486, #12518), - // let .trigger() run the handlers - } + trigger: function() { + if ( this !== safeActiveElement() && this.focus ) { + this.focus(); + return false; } }, delegateType: "focusin" }, blur: { - trigger: function () { - if (this === safeActiveElement() && this.blur) { + trigger: function() { + if ( this === safeActiveElement() && this.blur ) { this.blur(); return false; } @@ -4866,32 +4610,32 @@ }, click: { // For checkbox, fire native event so checked state will be right - trigger: function () { - if (jQuery.nodeName(this, "input") && this.type === "checkbox" && this.click) { + 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"); + _default: function( event ) { + return jQuery.nodeName( event.target, "a" ); } }, beforeunload: { - postDispatch: function (event) { + postDispatch: function( event ) { // Support: Firefox 20+ // Firefox doesn't alert if the returnValue field is not set. - if (event.result !== undefined && event.originalEvent) { + if ( event.result !== undefined && event.originalEvent ) { event.originalEvent.returnValue = event.result; } } } }, - simulate: function (type, elem, event, bubble) { + 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. @@ -4904,46 +4648,31 @@ originalEvent: {} } ); - if (bubble) { - jQuery.event.trigger(e, null, elem); + if ( bubble ) { + jQuery.event.trigger( e, null, elem ); } else { - jQuery.event.dispatch.call(elem, e); + jQuery.event.dispatch.call( elem, e ); } - if (e.isDefaultPrevented()) { + if ( e.isDefaultPrevented() ) { event.preventDefault(); } } }; - jQuery.removeEvent = document.removeEventListener ? - function (elem, type, handle) { - if (elem.removeEventListener) { - elem.removeEventListener(type, handle, false); - } - } : - function (elem, type, handle) { - var name = "on" + type; + jQuery.removeEvent = function( elem, type, handle ) { + if ( elem.removeEventListener ) { + elem.removeEventListener( type, handle, false ); + } + }; - if (elem.detachEvent) { - - // #8545, #7054, preventing memory leaks for custom events in IE6-8 - // detachEvent needed property on element, by name of that event, to properly expose it to GC - if (typeof elem[name] === strundefined) { - elem[name] = null; - } - - elem.detachEvent(name, handle); - } - }; - - jQuery.Event = function (src, props) { + jQuery.Event = function( src, props ) { // Allow instantiation without the 'new' keyword - if (!(this instanceof jQuery.Event)) { - return new jQuery.Event(src, props); + if ( !(this instanceof jQuery.Event) ) { + return new jQuery.Event( src, props ); } // Event object - if (src && src.type) { + if ( src && src.type ) { this.originalEvent = src; this.type = src.type; @@ -4951,7 +4680,7 @@ // by a handler lower down the tree; reflect the correct value. this.isDefaultPrevented = src.defaultPrevented || src.defaultPrevented === undefined && - // Support: IE < 9, Android < 4.0 + // Support: Android<4.0 src.returnValue === false ? returnTrue : returnFalse; @@ -4962,15 +4691,15 @@ } // Put explicitly provided properties onto the event object - if (props) { - jQuery.extend(this, props); + 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; + this[ jQuery.expando ] = true; }; // jQuery.Event is based on DOM3 Events as specified by the ECMAScript Language Binding @@ -4980,46 +4709,30 @@ isPropagationStopped: returnFalse, isImmediatePropagationStopped: returnFalse, - preventDefault: function () { + preventDefault: function() { var e = this.originalEvent; this.isDefaultPrevented = returnTrue; - if (!e) { - return; - } - // If preventDefault exists, run it on the original event - if (e.preventDefault) { + if ( e && e.preventDefault ) { e.preventDefault(); - - // Support: IE - // Otherwise set the returnValue property of the original event to false - } else { - e.returnValue = false; } }, - stopPropagation: function () { + stopPropagation: function() { var e = this.originalEvent; this.isPropagationStopped = returnTrue; - if (!e) { - return; - } - // If stopPropagation exists, run it on the original event - if (e.stopPropagation) { + + if ( e && e.stopPropagation ) { e.stopPropagation(); } - - // Support: IE - // Set the cancelBubble property of the original event to true - e.cancelBubble = true; }, - stopImmediatePropagation: function () { + stopImmediatePropagation: function() { var e = this.originalEvent; this.isImmediatePropagationStopped = returnTrue; - if (e && e.stopImmediatePropagation) { + if ( e && e.stopImmediatePropagation ) { e.stopImmediatePropagation(); } @@ -5028,17 +4741,18 @@ }; // 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] = { + }, function( orig, fix ) { + jQuery.event.special[ orig ] = { delegateType: fix, bindType: fix, - handle: function (event) { + handle: function( event ) { var ret, target = this, related = event.relatedTarget, @@ -5046,9 +4760,9 @@ // 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))) { + if ( !related || (related !== target && !jQuery.contains( target, related )) ) { event.type = handleObj.origType; - ret = handleObj.handler.apply(this, arguments); + ret = handleObj.handler.apply( this, arguments ); event.type = fix; } return ret; @@ -5056,140 +4770,36 @@ }; }); -// IE submit delegation - if (!support.submitBubbles) { - - jQuery.event.special.submit = { - setup: function () { - // Only need this for delegated form submit events - if (jQuery.nodeName(this, "form")) { - return false; - } - - // Lazy-add a submit handler when a descendant form may potentially be submitted - jQuery.event.add(this, "click._submit keypress._submit", function (e) { - // Node name check avoids a VML-related crash in IE (#9807) - var elem = e.target, - form = jQuery.nodeName(elem, "input") || jQuery.nodeName(elem, "button") ? elem.form : undefined; - if (form && !jQuery._data(form, "submitBubbles")) { - jQuery.event.add(form, "submit._submit", function (event) { - event._submit_bubble = true; - }); - jQuery._data(form, "submitBubbles", true); - } - }); - // return undefined since we don't need an event listener - }, - - postDispatch: function (event) { - // If form was submitted by the user, bubble the event up the tree - if (event._submit_bubble) { - delete event._submit_bubble; - if (this.parentNode && !event.isTrigger) { - jQuery.event.simulate("submit", this.parentNode, event, true); - } - } - }, - - teardown: function () { - // Only need this for delegated form submit events - if (jQuery.nodeName(this, "form")) { - return false; - } - - // Remove delegated handlers; cleanData eventually reaps submit handlers attached above - jQuery.event.remove(this, "._submit"); - } - }; - } - -// IE change delegation and checkbox/radio fix - if (!support.changeBubbles) { - - jQuery.event.special.change = { - - setup: function () { - - if (rformElems.test(this.nodeName)) { - // IE doesn't fire change on a check/radio until blur; trigger it on click - // after a propertychange. Eat the blur-change in special.change.handle. - // This still fires onchange a second time for check/radio after blur. - if (this.type === "checkbox" || this.type === "radio") { - jQuery.event.add(this, "propertychange._change", function (event) { - if (event.originalEvent.propertyName === "checked") { - this._just_changed = true; - } - }); - jQuery.event.add(this, "click._change", function (event) { - if (this._just_changed && !event.isTrigger) { - this._just_changed = false; - } - // Allow triggered, simulated change events (#11500) - jQuery.event.simulate("change", this, event, true); - }); - } - return false; - } - // Delegated event; lazy-add a change handler on descendant inputs - jQuery.event.add(this, "beforeactivate._change", function (e) { - var elem = e.target; - - if (rformElems.test(elem.nodeName) && !jQuery._data(elem, "changeBubbles")) { - jQuery.event.add(elem, "change._change", function (event) { - if (this.parentNode && !event.isSimulated && !event.isTrigger) { - jQuery.event.simulate("change", this.parentNode, event, true); - } - }); - jQuery._data(elem, "changeBubbles", true); - } - }); - }, - - handle: function (event) { - var elem = event.target; - - // Swallow native change events from checkbox/radio, we already triggered them above - if (this !== elem || event.isSimulated || event.isTrigger || (elem.type !== "radio" && elem.type !== "checkbox")) { - return event.handleObj.handler.apply(this, arguments); - } - }, - - teardown: function () { - jQuery.event.remove(this, "._change"); - - return !rformElems.test(this.nodeName); - } - }; - } - +// Support: Firefox, Chrome, Safari // Create "bubbling" focus and blur events - if (!support.focusinBubbles) { - jQuery.each({focus: "focusin", blur: "focusout"}, function (orig, fix) { + 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); + var handler = function( event ) { + jQuery.event.simulate( fix, event.target, jQuery.event.fix( event ), true ); }; - jQuery.event.special[fix] = { - setup: function () { + jQuery.event.special[ fix ] = { + setup: function() { var doc = this.ownerDocument || this, - attaches = jQuery._data(doc, fix); + attaches = data_priv.access( doc, fix ); - if (!attaches) { - doc.addEventListener(orig, handler, true); + if ( !attaches ) { + doc.addEventListener( orig, handler, true ); } - jQuery._data(doc, fix, ( attaches || 0 ) + 1); + data_priv.access( doc, fix, ( attaches || 0 ) + 1 ); }, - teardown: function () { + teardown: function() { var doc = this.ownerDocument || this, - attaches = jQuery._data(doc, fix) - 1; + attaches = data_priv.access( doc, fix ) - 1; + + if ( !attaches ) { + doc.removeEventListener( orig, handler, true ); + data_priv.remove( doc, fix ); - if (!attaches) { - doc.removeEventListener(orig, handler, true); - jQuery._removeData(doc, fix); } else { - jQuery._data(doc, fix, attaches); + data_priv.access( doc, fix, attaches ); } } }; @@ -5198,29 +4808,29 @@ jQuery.fn.extend({ - on: function (types, selector, data, fn, /*INTERNAL*/ one) { - var type, origFn; + on: function( types, selector, data, fn, /*INTERNAL*/ one ) { + var origFn, type; // Types can be a map of types/handlers - if (typeof types === "object") { + if ( typeof types === "object" ) { // ( types-Object, selector, data ) - if (typeof selector !== "string") { + if ( typeof selector !== "string" ) { // ( types-Object, data ) data = data || selector; selector = undefined; } - for (type in types) { - this.on(type, selector, data, types[type], one); + for ( type in types ) { + this.on( type, selector, data, types[ type ], one ); } return this; } - if (data == null && fn == null) { + if ( data == null && fn == null ) { // ( types, fn ) fn = selector; data = selector = undefined; - } else if (fn == null) { - if (typeof selector === "string") { + } else if ( fn == null ) { + if ( typeof selector === "string" ) { // ( types, selector, fn ) fn = data; data = undefined; @@ -5231,97 +4841,78 @@ selector = undefined; } } - if (fn === false) { + if ( fn === false ) { fn = returnFalse; - } else if (!fn) { + } else if ( !fn ) { return this; } - if (one === 1) { + if ( one === 1 ) { origFn = fn; - fn = function (event) { + fn = function( event ) { // Can use an empty set, since event contains the info - jQuery().off(event); - return origFn.apply(this, arguments); + 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); + 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); + one: function( types, selector, data, fn ) { + return this.on( types, selector, data, fn, 1 ); }, - off: function (types, selector, fn) { + off: function( types, selector, fn ) { var handleObj, type; - if (types && types.preventDefault && types.handleObj) { + if ( types && types.preventDefault && types.handleObj ) { // ( event ) dispatched jQuery.Event handleObj = types.handleObj; - jQuery(types.delegateTarget).off( + jQuery( types.delegateTarget ).off( handleObj.namespace ? handleObj.origType + "." + handleObj.namespace : handleObj.origType, handleObj.selector, handleObj.handler ); return this; } - if (typeof types === "object") { + if ( typeof types === "object" ) { // ( types-object [, selector] ) - for (type in types) { - this.off(type, selector, types[type]); + for ( type in types ) { + this.off( type, selector, types[ type ] ); } return this; } - if (selector === false || typeof selector === "function") { + if ( selector === false || typeof selector === "function" ) { // ( types [, fn] ) fn = selector; selector = undefined; } - if (fn === false) { + if ( fn === false ) { fn = returnFalse; } - return this.each(function () { - jQuery.event.remove(this, types, fn, selector); + 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); + trigger: function( type, data ) { + return this.each(function() { + jQuery.event.trigger( type, data, this ); }); }, - triggerHandler: function (type, data) { + triggerHandler: function( type, data ) { var elem = this[0]; - if (elem) { - return jQuery.event.trigger(type, data, elem, true); + if ( elem ) { + return jQuery.event.trigger( type, data, elem, true ); } } }); - function createSafeFragment(document) { - var list = nodeNames.split("|"), - safeFrag = document.createDocumentFragment(); - - if (safeFrag.createElement) { - while (list.length) { - safeFrag.createElement( - list.pop() - ); - } - } - return safeFrag; - } - - var nodeNames = "abbr|article|aside|audio|bdi|canvas|data|datalist|details|figcaption|figure|footer|" + - "header|hgroup|mark|meter|nav|output|progress|section|summary|time|video", - rinlinejQuery = / jQuery\d+="(?:null|\d+)"/g, - rnoshimcache = new RegExp("<(?:" + nodeNames + ")[\\s/>]", "i"), - rleadingWhitespace = /^\s+/, + var rxhtmlTag = /<(?!area|br|col|embed|hr|img|input|link|meta|param)(([\w:]+)[^>]*)\/>/gi, rtagName = /<([\w:]+)/, - rtbody = /", ""], - legend: [1, "
", "
"], - area: [1, "", ""], - param: [1, "", ""], - thead: [1, "", "
"], - tr: [2, "", "
"], - col: [2, "", "
"], - td: [3, "", "
"], - // IE6-8 can't serialize link, script, style, or any html5 (NoScope) tags, - // unless wrapped in a div with non-breaking characters in front of it. - _default: support.htmlSerialize ? [0, "", ""] : [1, "X
", "
"] - }, - safeFragment = createSafeFragment(document), - fragmentDiv = safeFragment.appendChild(document.createElement("div")); + // Support: IE9 + option: [ 1, "" ], + thead: [ 1, "", "
" ], + col: [ 2, "", "
" ], + tr: [ 2, "", "
" ], + td: [ 3, "", "
" ], + + _default: [ 0, "", "" ] + }; + +// Support: IE9 wrapMap.optgroup = wrapMap.option; + wrapMap.tbody = wrapMap.tfoot = wrapMap.colgroup = wrapMap.caption = wrapMap.thead; wrapMap.th = wrapMap.td; - function getAll(context, tag) { - var elems, elem, - i = 0, - found = typeof context.getElementsByTagName !== strundefined ? context.getElementsByTagName(tag || "*") : - typeof context.querySelectorAll !== strundefined ? context.querySelectorAll(tag || "*") : - undefined; - - if (!found) { - for (found = [], elems = context.childNodes || context; (elem = elems[i]) != null; i++) { - if (!tag || jQuery.nodeName(elem, tag)) { - found.push(elem); - } else { - jQuery.merge(found, getAll(elem, tag)); - } - } - } - - return tag === undefined || tag && jQuery.nodeName(context, tag) ? - jQuery.merge([context], found) : - found; - } - -// Used in buildFragment, fixes the defaultChecked property - function fixDefaultChecked(elem) { - if (rcheckableType.test(elem.type)) { - elem.defaultChecked = elem.checked; - } - } - -// Support: IE<8 +// 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") ? + 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.appendChild( elem.ownerDocument.createElement("tbody") ) : elem; } // Replace/restore the type attribute of script elements for safe DOM manipulation - function disableScript(elem) { - elem.type = (jQuery.find.attr(elem, "type") !== null) + "/" + elem.type; + function disableScript( elem ) { + elem.type = (elem.getAttribute("type") !== null) + "/" + elem.type; return elem; } + function restoreScript( elem ) { + var match = rscriptTypeMasked.exec( elem.type ); - function restoreScript(elem) { - var match = rscriptTypeMasked.exec(elem.type); - if (match) { - elem.type = match[1]; + if ( match ) { + elem.type = match[ 1 ]; } else { elem.removeAttribute("type"); } + return elem; } // Mark scripts as having already been evaluated - function setGlobalEval(elems, refElements) { - var elem, - i = 0; - for (; (elem = elems[i]) != null; i++) { - jQuery._data(elem, "globalEval", !refElements || jQuery._data(refElements[i], "globalEval")); + function 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) { + function cloneCopyEvent( src, dest ) { + var i, l, type, pdataOld, pdataCur, udataOld, udataCur, events; - if (dest.nodeType !== 1 || !jQuery.hasData(src)) { + if ( dest.nodeType !== 1 ) { return; } - var type, i, l, - oldData = jQuery._data(src), - curData = jQuery._data(dest, oldData), - events = oldData.events; + // 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 curData.handle; - curData.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]); + for ( type in events ) { + for ( i = 0, l = events[ type ].length; i < l; i++ ) { + jQuery.event.add( dest, type, events[ type ][ i ] ); + } } } } - // make the cloned public data object a copy from the original - if (curData.data) { - curData.data = jQuery.extend({}, curData.data); + // 2. Copy user data + if ( data_user.hasData( src ) ) { + udataOld = data_user.access( src ); + udataCur = jQuery.extend( {}, udataOld ); + + data_user.set( dest, udataCur ); } } - function fixCloneNodeIssues(src, dest) { - var nodeName, e, data; + function getAll( context, tag ) { + var ret = context.getElementsByTagName ? context.getElementsByTagName( tag || "*" ) : + context.querySelectorAll ? context.querySelectorAll( tag || "*" ) : + []; - // We do not need to do anything for non-Elements - if (dest.nodeType !== 1) { - return; - } + return tag === undefined || tag && jQuery.nodeName( context, tag ) ? + jQuery.merge( [ context ], ret ) : + ret; + } - nodeName = dest.nodeName.toLowerCase(); +// Fix IE bugs, see support tests + function fixInput( src, dest ) { + var nodeName = dest.nodeName.toLowerCase(); - // IE6-8 copies events bound via attachEvent when using cloneNode. - if (!support.noCloneEvent && dest[jQuery.expando]) { - data = jQuery._data(dest); + // Fails to persist the checked state of a cloned checkbox or radio button. + if ( nodeName === "input" && rcheckableType.test( src.type ) ) { + dest.checked = src.checked; - for (e in data.events) { - jQuery.removeEvent(dest, e, data.handle); - } - - // Event data gets referenced instead of copied if the expando gets copied too - dest.removeAttribute(jQuery.expando); - } - - // IE blanks contents when cloning scripts, and tries to evaluate newly-set text - if (nodeName === "script" && dest.text !== src.text) { - disableScript(dest).text = src.text; - restoreScript(dest); - - // IE6-10 improperly clones children of object elements using classid. - // IE10 throws NoModificationAllowedError if parent is null, #12132. - } else if (nodeName === "object") { - if (dest.parentNode) { - dest.outerHTML = src.outerHTML; - } - - // This path appears unavoidable for IE9. When cloning an object - // element in IE9, the outerHTML strategy above is not sufficient. - // If the src has innerHTML and the destination does not, - // copy the src.innerHTML into the dest.innerHTML. #10324 - if (support.html5Clone && ( src.innerHTML && !jQuery.trim(dest.innerHTML) )) { - dest.innerHTML = src.innerHTML; - } - - } else if (nodeName === "input" && rcheckableType.test(src.type)) { - // IE6-8 fails to persist the checked state of a cloned checkbox - // or radio button. Worse, IE6-7 fail to give the cloned element - // a checked appearance if the defaultChecked value isn't also set - - dest.defaultChecked = dest.checked = src.checked; - - // IE6-7 get confused and end up setting the value of a cloned - // checkbox/radio button to an empty string instead of "on" - if (dest.value !== src.value) { - dest.value = src.value; - } - - // IE6-8 fails to return the selected option to the default selected - // state when cloning options - } else if (nodeName === "option") { - dest.defaultSelected = dest.selected = src.defaultSelected; - - // IE6-8 fails to set the defaultValue to the correct value when - // cloning other types of input fields - } else if (nodeName === "input" || nodeName === "textarea") { + // 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 destElements, node, clone, i, srcElements, - inPage = jQuery.contains(elem.ownerDocument, elem); + clone: function( elem, dataAndEvents, deepDataAndEvents ) { + var i, l, srcElements, destElements, + clone = elem.cloneNode( true ), + inPage = jQuery.contains( elem.ownerDocument, elem ); - if (support.html5Clone || jQuery.isXMLDoc(elem) || !rnoshimcache.test("<" + elem.nodeName + ">")) { - clone = elem.cloneNode(true); - - // IE<=8 does not properly clone detached, unknown element nodes - } else { - fragmentDiv.innerHTML = elem.outerHTML; - fragmentDiv.removeChild(clone = fragmentDiv.firstChild); - } - - if ((!support.noCloneEvent || !support.noCloneChecked) && - (elem.nodeType === 1 || elem.nodeType === 11) && !jQuery.isXMLDoc(elem)) { + // Fix IE 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); + destElements = getAll( clone ); + srcElements = getAll( elem ); - // Fix all IE cloning issues - for (i = 0; (node = srcElements[i]) != null; ++i) { - // Ensure that the destination node is not null; Fixes #9587 - if (destElements[i]) { - fixCloneNodeIssues(node, destElements[i]); - } + 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); + if ( dataAndEvents ) { + if ( deepDataAndEvents ) { + srcElements = srcElements || getAll( elem ); + destElements = destElements || getAll( clone ); - for (i = 0; (node = srcElements[i]) != null; i++) { - cloneCopyEvent(node, destElements[i]); + for ( i = 0, l = srcElements.length; i < l; i++ ) { + cloneCopyEvent( srcElements[ i ], destElements[ i ] ); } } else { - cloneCopyEvent(elem, clone); + cloneCopyEvent( elem, clone ); } } // Preserve script evaluation history - destElements = getAll(clone, "script"); - if (destElements.length > 0) { - setGlobalEval(destElements, !inPage && getAll(elem, "script")); + destElements = getAll( clone, "script" ); + if ( destElements.length > 0 ) { + setGlobalEval( destElements, !inPage && getAll( elem, "script" ) ); } - destElements = srcElements = node = null; - // Return the cloned set return clone; }, - buildFragment: function (elems, context, scripts, selection) { - var j, elem, contains, - tmp, tag, tbody, wrap, - l = elems.length, - - // Ensure a safe fragment - safe = createSafeFragment(context), - + buildFragment: function( elems, context, scripts, selection ) { + var elem, tmp, tag, wrap, contains, j, + fragment = context.createDocumentFragment(), nodes = [], - i = 0; + i = 0, + l = elems.length; - for (; i < l; i++) { - elem = elems[i]; + for ( ; i < l; i++ ) { + elem = elems[ i ]; - if (elem || elem === 0) { + if ( elem || elem === 0 ) { // Add nodes directly - if (jQuery.type(elem) === "object") { - jQuery.merge(nodes, elem.nodeType ? [elem] : elem); + if ( jQuery.type( elem ) === "object" ) { + // Support: QtWebKit, PhantomJS + // push.apply(_, arraylike) throws on ancient WebKit + jQuery.merge( nodes, elem.nodeType ? [ elem ] : elem ); // Convert non-html into a text node - } else if (!rhtml.test(elem)) { - nodes.push(context.createTextNode(elem)); + } else if ( !rhtml.test( elem ) ) { + nodes.push( context.createTextNode( elem ) ); // Convert html into DOM nodes } else { - tmp = tmp || safe.appendChild(context.createElement("div")); + tmp = tmp || fragment.appendChild( context.createElement("div") ); // Deserialize a standard representation - tag = (rtagName.exec(elem) || ["", ""])[1].toLowerCase(); - wrap = wrapMap[tag] || wrapMap._default; - - tmp.innerHTML = wrap[1] + elem.replace(rxhtmlTag, "<$1>") + wrap[2]; + tag = ( rtagName.exec( elem ) || [ "", "" ] )[ 1 ].toLowerCase(); + wrap = wrapMap[ tag ] || wrapMap._default; + tmp.innerHTML = wrap[ 1 ] + elem.replace( rxhtmlTag, "<$1>" ) + wrap[ 2 ]; // Descend through wrappers to the right content - j = wrap[0]; - while (j--) { + j = wrap[ 0 ]; + while ( j-- ) { tmp = tmp.lastChild; } - // Manually add leading whitespace removed by IE - if (!support.leadingWhitespace && rleadingWhitespace.test(elem)) { - nodes.push(context.createTextNode(rleadingWhitespace.exec(elem)[0])); - } + // Support: QtWebKit, PhantomJS + // push.apply(_, arraylike) throws on ancient WebKit + jQuery.merge( nodes, tmp.childNodes ); - // Remove IE's autoinserted from table fragments - if (!support.tbody) { + // Remember the top-level container + tmp = fragment.firstChild; - // String was a , *may* have spurious - elem = tag === "table" && !rtbody.test(elem) ? - tmp.firstChild : - - // String was a bare or - wrap[1] === "
" && !rtbody.test(elem) ? - tmp : - 0; - - j = elem && elem.childNodes.length; - while (j--) { - if (jQuery.nodeName((tbody = elem.childNodes[j]), "tbody") && !tbody.childNodes.length) { - elem.removeChild(tbody); - } - } - } - - jQuery.merge(nodes, tmp.childNodes); - - // Fix #12392 for WebKit and IE > 9 + // Ensure the created nodes are orphaned (#12392) tmp.textContent = ""; - - // Fix #12392 for oldIE - while (tmp.firstChild) { - tmp.removeChild(tmp.firstChild); - } - - // Remember the top-level container for proper cleanup - tmp = safe.lastChild; } } } - // Fix #11356: Clear elements from fragment - if (tmp) { - safe.removeChild(tmp); - } - - // Reset defaultChecked for any radios and checkboxes - // about to be appended to the DOM in IE 6/7 (#8060) - if (!support.appendChecked) { - jQuery.grep(getAll(nodes, "input"), fixDefaultChecked); - } + // Remove wrapper from fragment + fragment.textContent = ""; i = 0; - while ((elem = nodes[i++])) { + 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) { + if ( selection && jQuery.inArray( elem, selection ) !== -1 ) { continue; } - contains = jQuery.contains(elem.ownerDocument, elem); + contains = jQuery.contains( elem.ownerDocument, elem ); // Append to fragment - tmp = getAll(safe.appendChild(elem), "script"); + tmp = getAll( fragment.appendChild( elem ), "script" ); // Preserve script evaluation history - if (contains) { - setGlobalEval(tmp); + if ( contains ) { + setGlobalEval( tmp ); } // Capture executables - if (scripts) { + if ( scripts ) { j = 0; - while ((elem = tmp[j++])) { - if (rscriptType.test(elem.type || "")) { - scripts.push(elem); + while ( (elem = tmp[ j++ ]) ) { + if ( rscriptType.test( elem.type || "" ) ) { + scripts.push( elem ); } } } } - tmp = null; - - return safe; + return fragment; }, - cleanData: function (elems, /* internal */ acceptData) { - var elem, type, id, data, - i = 0, - internalKey = jQuery.expando, - cache = jQuery.cache, - deleteExpando = support.deleteExpando, - special = jQuery.event.special; + cleanData: function( elems ) { + var data, elem, type, key, + special = jQuery.event.special, + i = 0; - for (; (elem = elems[i]) != null; i++) { - if (acceptData || jQuery.acceptData(elem)) { + for ( ; (elem = elems[ i ]) !== undefined; i++ ) { + if ( jQuery.acceptData( elem ) ) { + key = elem[ data_priv.expando ]; - id = elem[internalKey]; - data = id && cache[id]; - - if (data) { - if (data.events) { - for (type in data.events) { - if (special[type]) { - jQuery.event.remove(elem, type); + 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); + jQuery.removeEvent( elem, type, data.handle ); } } } - - // Remove cache only if it was not already removed by jQuery.event.remove - if (cache[id]) { - - delete cache[id]; - - // IE does not allow us to delete expando properties from nodes, - // nor does it have a removeAttribute function on Document nodes; - // we must handle all of these cases - if (deleteExpando) { - delete elem[internalKey]; - - } else if (typeof elem.removeAttribute !== strundefined) { - elem.removeAttribute(internalKey); - - } else { - elem[internalKey] = null; - } - - deletedIds.push(id); + 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) { + text: function( value ) { + return access( this, function( value ) { return value === undefined ? - jQuery.text(this) : - this.empty().append(( this[0] && this[0].ownerDocument || document ).createTextNode(value)); - }, null, value, arguments.length); + 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); + 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); + 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); + 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); + after: function() { + return this.domManip( arguments, function( elem ) { + if ( this.parentNode ) { + this.parentNode.insertBefore( elem, this.nextSibling ); } }); }, - remove: function (selector, keepData /* Internal Use Only */) { + remove: function( selector, keepData /* Internal Use Only */ ) { var elem, - elems = selector ? jQuery.filter(selector, this) : this, + elems = selector ? jQuery.filter( selector, this ) : this, i = 0; - for (; (elem = elems[i]) != null; i++) { - - if (!keepData && elem.nodeType === 1) { - jQuery.cleanData(getAll(elem)); + 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")); + if ( elem.parentNode ) { + if ( keepData && jQuery.contains( elem.ownerDocument, elem ) ) { + setGlobalEval( getAll( elem, "script" ) ); } - elem.parentNode.removeChild(elem); + elem.parentNode.removeChild( elem ); } } return this; }, - empty: function () { + empty: function() { var elem, i = 0; - for (; (elem = this[i]) != null; i++) { - // Remove element nodes and prevent memory leaks - if (elem.nodeType === 1) { - jQuery.cleanData(getAll(elem, false)); - } + for ( ; (elem = this[i]) != null; i++ ) { + if ( elem.nodeType === 1 ) { - // Remove any remaining nodes - while (elem.firstChild) { - elem.removeChild(elem.firstChild); - } + // Prevent memory leaks + jQuery.cleanData( getAll( elem, false ) ); - // If this is a select, ensure that it displays empty (#12336) - // Support: IE<9 - if (elem.options && jQuery.nodeName(elem, "select")) { - elem.options.length = 0; + // Remove any remaining nodes + elem.textContent = ""; } } return this; }, - clone: function (dataAndEvents, deepDataAndEvents) { + clone: function( dataAndEvents, deepDataAndEvents ) { dataAndEvents = dataAndEvents == null ? false : dataAndEvents; deepDataAndEvents = deepDataAndEvents == null ? dataAndEvents : deepDataAndEvents; - return this.map(function () { - return jQuery.clone(this, dataAndEvents, deepDataAndEvents); + return this.map(function() { + return jQuery.clone( this, dataAndEvents, deepDataAndEvents ); }); }, - html: function (value) { - return access(this, function (value) { - var elem = this[0] || {}, + html: function( value ) { + return access( this, function( value ) { + var elem = this[ 0 ] || {}, i = 0, l = this.length; - if (value === undefined) { - return elem.nodeType === 1 ? - elem.innerHTML.replace(rinlinejQuery, "") : - undefined; + 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) && - ( support.htmlSerialize || !rnoshimcache.test(value) ) && - ( support.leadingWhitespace || !rleadingWhitespace.test(value) ) && !wrapMap[(rtagName.exec(value) || ["", ""])[1].toLowerCase()]) { + if ( typeof value === "string" && !rnoInnerhtml.test( value ) && + !wrapMap[ ( rtagName.exec( value ) || [ "", "" ] )[ 1 ].toLowerCase() ] ) { - value = value.replace(rxhtmlTag, "<$1>"); + value = value.replace( rxhtmlTag, "<$1>" ); try { - for (; i < l; i++) { + for ( ; i < l; i++ ) { + elem = this[ i ] || {}; + // Remove element nodes and prevent memory leaks - elem = this[i] || {}; - if (elem.nodeType === 1) { - jQuery.cleanData(getAll(elem, false)); + if ( elem.nodeType === 1 ) { + jQuery.cleanData( getAll( elem, false ) ); elem.innerHTML = value; } } @@ -5879,27 +5326,26 @@ elem = 0; // If using innerHTML throws an exception, use the fallback method - } catch (e) { - } + } catch( e ) {} } - if (elem) { - this.empty().append(value); + if ( elem ) { + this.empty().append( value ); } - }, null, value, arguments.length); + }, null, value, arguments.length ); }, - replaceWith: function () { - var arg = arguments[0]; + replaceWith: function() { + var arg = arguments[ 0 ]; // Make the changes, replacing each context element with the new content - this.domManip(arguments, function (elem) { + this.domManip( arguments, function( elem ) { arg = this.parentNode; - jQuery.cleanData(getAll(this)); + jQuery.cleanData( getAll( this ) ); - if (arg) { - arg.replaceChild(elem, this); + if ( arg ) { + arg.replaceChild( elem, this ); } }); @@ -5907,90 +5353,90 @@ return arg && (arg.length || arg.nodeType) ? this : this.remove(); }, - detach: function (selector) { - return this.remove(selector, true); + detach: function( selector ) { + return this.remove( selector, true ); }, - domManip: function (args, callback) { + domManip: function( args, callback ) { // Flatten any nested arrays - args = concat.apply([], args); + args = concat.apply( [], args ); - var first, node, hasScripts, - scripts, doc, fragment, + var fragment, first, scripts, hasScripts, node, doc, i = 0, l = this.length, set = this, iNoClone = l - 1, - value = args[0], - isFunction = jQuery.isFunction(value); + 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()); + 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); + self.domManip( args, callback ); }); } - if (l) { - fragment = jQuery.buildFragment(args, this[0].ownerDocument, false, this); + if ( l ) { + fragment = jQuery.buildFragment( args, this[ 0 ].ownerDocument, false, this ); first = fragment.firstChild; - if (fragment.childNodes.length === 1) { + if ( fragment.childNodes.length === 1 ) { fragment = first; } - if (first) { - scripts = jQuery.map(getAll(fragment, "script"), disableScript); + 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++) { + for ( ; i < l; i++ ) { node = fragment; - if (i !== iNoClone) { - node = jQuery.clone(node, true, true); + if ( i !== iNoClone ) { + node = jQuery.clone( node, true, true ); // Keep references to cloned scripts for later restoration - if (hasScripts) { - jQuery.merge(scripts, getAll(node, "script")); + if ( hasScripts ) { + // Support: QtWebKit + // jQuery.merge because push.apply(_, arraylike) throws + jQuery.merge( scripts, getAll( node, "script" ) ); } } - callback.call(this[i], node, i); + callback.call( this[ i ], node, i ); } - if (hasScripts) { - doc = scripts[scripts.length - 1].ownerDocument; + if ( hasScripts ) { + doc = scripts[ scripts.length - 1 ].ownerDocument; // Reenable scripts - jQuery.map(scripts, restoreScript); + jQuery.map( scripts, restoreScript ); // Evaluate executable scripts on first document insertion - for (i = 0; i < hasScripts; i++) { - node = scripts[i]; - if (rscriptType.test(node.type || "") && !jQuery._data(node, "globalEval") && jQuery.contains(doc, node)) { + 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) { + if ( node.src ) { // Optional AJAX dependency, but won't run scripts if not present - if (jQuery._evalUrl) { - jQuery._evalUrl(node.src); + if ( jQuery._evalUrl ) { + jQuery._evalUrl( node.src ); } } else { - jQuery.globalEval(( node.text || node.textContent || node.innerHTML || "" ).replace(rcleanScript, "")); + jQuery.globalEval( node.textContent.replace( rcleanScript, "" ) ); } } } } - - // Fix #11809: Avoid leaking memory - fragment = first = null; } } @@ -6004,23 +5450,24 @@ insertBefore: "before", insertAfter: "after", replaceAll: "replaceWith" - }, function (name, original) { - jQuery.fn[name] = function (selector) { + }, function( name, original ) { + jQuery.fn[ name ] = function( selector ) { var elems, - i = 0, ret = [], - insert = jQuery(selector), - last = insert.length - 1; + 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); + for ( ; i <= last; i++ ) { + elems = i === last ? this : this.clone( true ); + jQuery( insert[ i ] )[ original ]( elems ); - // Modern browsers can apply jQuery collections as arrays, but oldIE needs a .get() - push.apply(ret, elems.get()); + // Support: QtWebKit + // .get() because push.apply(_, arraylike) throws + push.apply( ret, elems.get() ); } - return this.pushStack(ret); + return this.pushStack( ret ); }; }); @@ -6034,16 +5481,16 @@ * @param {Object} doc Document object */ // Called only from within defaultDisplay - function actualDisplay(name, doc) { + function actualDisplay( name, doc ) { var style, - elem = jQuery(doc.createElement(name)).appendTo(doc.body), + 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]) ) ? + display = window.getDefaultComputedStyle && ( style = window.getDefaultComputedStyle( elem[ 0 ] ) ) ? - // Use of this method is a temporary fix (more like optmization) until something better comes along, + // Use of this method is a temporary fix (more like optimization) until something better comes along, // since it was removed from specification and supported only in FF - style.display : jQuery.css(elem[0], "display"); + 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 @@ -6056,389 +5503,224 @@ * Try to determine the default display value of an element * @param {String} nodeName */ - function defaultDisplay(nodeName) { + function defaultDisplay( nodeName ) { var doc = document, - display = elemdisplay[nodeName]; + display = elemdisplay[ nodeName ]; - if (!display) { - display = actualDisplay(nodeName, doc); + if ( !display ) { + display = actualDisplay( nodeName, doc ); // If the simple way fails, read from inside an iframe - if (display === "none" || !display) { + if ( display === "none" || !display ) { // Use the already-created iframe if possible - iframe = (iframe || jQuery("