Make WordPress Core

Changeset 23301


Ignore:
Timestamp:
01/15/2013 05:52:42 PM (14 years ago)
Author:
nacin
Message:

jQuery 1.9 final. jQuery Migrate 1.0. Uncompressed for now, while we iron out kinks.

props jorbin. see #22975.

Location:
trunk/wp-includes
Files:
3 edited

Legend:

Unmodified
Added
Removed
  • trunk/wp-includes/js/jquery/jquery-migrate.js

    r23182 r23301  
    11/*!
    2  * jQuery Migrate - v1.0.0pre - 2012-12-17
     2 * jQuery Migrate - v1.0.0 - 2013-01-14
    33 * https://github.com/jquery/jquery-migrate
    4  * Copyright 2012 jQuery Foundation and other contributors; Licensed MIT
     4 * Copyright 2005, 2013 jQuery Foundation, Inc. and other contributors; Licensed MIT
    55 */
    6 
    76(function( jQuery, window, undefined ) {
    87"use strict";
    98
    10 // Use Uglify to do conditional compilation of warning messages;
    11 // the minified version will set this to false and remove dead code.
    12 if ( typeof window.JQMIGRATE_WARN === "undefined" ) {
    13         window.JQMIGRATE_WARN = true;
    14 }
    15 
    169
    1710var warnedAbout = {};
    … …  
    1912// List of warnings already given; public read only
    2013jQuery.migrateWarnings = [];
     14
     15// Set to true to prevent console output; migrateWarnings still maintained
     16// jQuery.migrateMute = false;
    2117
    2218// Forget any warnings we've already given; public
    … …  
    2723
    2824function migrateWarn( msg) {
    29         if ( window.JQMIGRATE_WARN ) {
    30                 if ( !warnedAbout[ msg ] ) {
    31                         warnedAbout[ msg ] = true;
    32                         jQuery.migrateWarnings.push( msg );
    33                         if ( window.console && console.warn ) {
    34                                 console.warn( "JQMIGRATE: " + msg );
    35                         }
     25        if ( !warnedAbout[ msg ] ) {
     26                warnedAbout[ msg ] = true;
     27                jQuery.migrateWarnings.push( msg );
     28                if ( window.console && console.warn && !jQuery.migrateMute ) {
     29                        console.warn( "JQMIGRATE: " + msg );
    3630                }
    3731        }
    … …  
    3933
    4034function migrateWarnProp( obj, prop, value, msg ) {
    41         if ( window.JQMIGRATE_WARN && Object.defineProperty ) {
     35        if ( Object.defineProperty ) {
    4236                // On ES5 browsers (non-oldIE), warn if the code tries to get prop;
    4337                // allow property to be overwritten in case some other plugin wants it
    … …  
    6660}
    6761
    68 if ( window.JQMIGRATE_WARN && document.compatMode === "BackCompat" ) {
     62if ( document.compatMode === "BackCompat" ) {
    6963        // jQuery has never supported or tested Quirks Mode
    7064        migrateWarn( "jQuery is not compatible with Quirks Mode" );
    … …  
    7973                function() { return undefined; },
    8074        rnoType = /^(?:input|button)$/i,
    81         rnoAttrNodeType = /^[238]$/;
     75        rnoAttrNodeType = /^[238]$/,
     76        rboolean = /^(?:autofocus|autoplay|async|checked|controls|defer|disabled|hidden|loop|multiple|open|readonly|required|scoped|selected)$/i,
     77        ruseDefault = /^(?:checked|selected)$/i;
    8278
    8379// jQuery.attrFn
    … …  
    8581
    8682jQuery.attr = function( elem, name, value, pass ) {
     83        var lowerName = name.toLowerCase(),
     84                nType = elem && elem.nodeType;
     85
    8786        if ( pass ) {
    8887                migrateWarn("jQuery.fn.attr( props, pass ) is deprecated");
    89                 if ( elem && !rnoAttrNodeType.test( elem.nodeType ) && jQuery.isFunction( jQuery.fn[ name ] ) ) {
     88                if ( elem && !rnoAttrNodeType.test( nType ) && jQuery.isFunction( jQuery.fn[ name ] ) ) {
    9089                        return jQuery( elem )[ name ]( value );
    9190                }
    … …  
    9796        }
    9897
     98        // Restore boolHook for boolean property/attribute synchronization
     99        if ( !jQuery.attrHooks[ lowerName ] && rboolean.test( lowerName ) ) {
     100                jQuery.attrHooks[ lowerName ] = {
     101                        get: function( elem, name ) {
     102                                // Align boolean attributes with corresponding properties
     103                                // Fall back to attribute presence where some booleans are not supported
     104                                var attrNode,
     105                                        property = jQuery.prop( elem, name );
     106                                return property === true || typeof property !== "boolean" &&
     107                                        ( attrNode = elem.getAttributeNode(name) ) && attrNode.nodeValue !== false ?
     108
     109                                        name.toLowerCase() :
     110                                        undefined;
     111                        },
     112                        set: function( elem, value, name ) {
     113                                var propName;
     114                                if ( value === false ) {
     115                                        // Remove boolean attributes when set to false
     116                                        jQuery.removeAttr( elem, name );
     117                                } else {
     118                                        // value is true since we know at this point it's type boolean and not false
     119                                        // Set boolean attributes to the same name and set the DOM property
     120                                        propName = jQuery.propFix[ name ] || name;
     121                                        if ( propName in elem ) {
     122                                                // Only set the IDL specifically if it already exists on the element
     123                                                elem[ propName ] = true;
     124                                        }
     125
     126                                        elem.setAttribute( name, name.toLowerCase() );
     127                                }
     128                                return name;
     129                        }
     130                };
     131
     132                // Warn only for attributes that can remain distinct from their properties post-1.9
     133                if ( ruseDefault.test( lowerName ) ) {
     134                        migrateWarn( "jQuery.fn.attr(" + lowerName + ") may use property instead of attribute" );
     135                }
     136        }
     137
    99138        return attr.call( jQuery, elem, name, value );
    100139};
    … …  
    103142jQuery.attrHooks.value = {
    104143        get: function( elem, name ) {
    105                 if ( jQuery.nodeName( elem, "button" ) ) {
     144                var nodeName = ( elem.nodeName || "" ).toLowerCase();
     145                if ( nodeName === "button" ) {
    106146                        return valueAttrGet.apply( this, arguments );
    107147                }
    108                 migrateWarn("property-based jQuery.fn.attr('value') is deprecated");
     148                if ( nodeName !== "input" && nodeName !== "option" ) {
     149                        migrateWarn("property-based jQuery.fn.attr('value') is deprecated");
     150                }
    109151                return name in elem ?
    110152                        elem.value :
    111153                        null;
    112154        },
    113         set: function( elem, value, name ) {
    114                 if ( jQuery.nodeName( elem, "button" ) ) {
     155        set: function( elem, value ) {
     156                var nodeName = ( elem.nodeName || "" ).toLowerCase();
     157                if ( nodeName === "button" ) {
    115158                        return valueAttrSet.apply( this, arguments );
    116159                }
    117                 migrateWarn("property-based jQuery.fn.attr('value', val) is deprecated");
     160                if ( nodeName !== "input" && nodeName !== "option" ) {
     161                        migrateWarn("property-based jQuery.fn.attr('value', val) is deprecated");
     162                }
    118163                // Does not return so that setAttribute is also used
    119164                elem.value = value;
    … …  
    123168
    124169var matched, browser,
    125         oldAccess = jQuery.access,
    126170        oldInit = jQuery.fn.init,
    127171        // Note this does NOT include the # XSS fix from 1.7!
    128         rquickExpr = /^(?:.*(<[\w\W]+>)[^>]*|#([\w-]*))$/;
     172        rquickExpr = /^(?:.*(<[\w\W]+>)[^>]*|#([\w\-]*))$/;
    129173
    130174// $(html) "looks like html" rule change
    … …  
    151195};
    152196jQuery.fn.init.prototype = jQuery.fn;
    153 
    154 if ( jQuery.fn.jquery >= "1.9" ) {
    155         // jQuery.access( ..., pass )
    156         jQuery.access = function( elems, fn, key, value, chainable, emptyGet, pass ) {
    157                 var i = 0,
    158                         length = elems.length;
    159 
    160                 if ( key && typeof key === "object" && value ) {
    161                         for ( i in key ) {
    162                                 jQuery.access( elems, fn, i, key[i], true, emptyGet, value );
    163                         }
    164                         return elems;
    165                 } else if ( pass && key != null && value !== undefined ) {
    166                         for ( ; i < length; i++ ) {
    167                                 fn( elems[i], key, value, true );
    168                         }
    169                         return elems;
    170                 }
    171                 return oldAccess.call( jQuery, elems, fn, key, value, chainable, emptyGet );
    172         };
    173 }
    174197
    175198jQuery.uaMatch = function( ua ) {
    … …  
    251274
    252275
    253 var oldSelf = jQuery.fn.andSelf || jQuery.fn.addBack,
     276var rscriptType = /\/(java|ecma)script/i,
     277        oldSelf = jQuery.fn.andSelf || jQuery.fn.addBack,
    254278        oldFragment = jQuery.buildFragment;
    255279
    … …  
    259283};
    260284
    261 jQuery.buildFragment = function( args, context, scripts ) {
    262         var fragment;
    263 
    264         if ( !oldFragment ) {
    265                 // Set context from what may come in as undefined or a jQuery collection or a node
    266                 // Updated to fix #12266 where accessing context[0] could throw an exception in IE9/10 &
    267                 // also doubles as fix for #8950 where plain objects caused createDocumentFragment exception
     285// Since jQuery.clean is used internally on older versions, we only shim if it's missing
     286if ( !jQuery.clean ) {
     287        jQuery.clean = function( elems, context, fragment, scripts ) {
     288                // Set context per 1.8 logic
    268289                context = context || document;
    269290                context = !context.nodeType && context[0] || context;
    270291                context = context.ownerDocument || context;
    271292
    272                 fragment = context.createDocumentFragment();
    273                 jQuery.clean( args, context, fragment, scripts );
    274 
    275                 migrateWarn("jQuery.buildFragment() is deprecated");
    276                 return { fragment: fragment, cacheable: false };
    277         }
    278         // Don't warn if we are in a version where buildFragment is used internally
    279         return oldFragment.apply( this, arguments );
     293                migrateWarn("jQuery.clean() is deprecated");
     294
     295                var i, elem, handleScript, jsTags,
     296                        ret = [];
     297
     298                jQuery.merge( ret, jQuery.buildFragment( elems, context ).childNodes );
     299
     300                // Complex logic lifted directly from jQuery 1.8
     301                if ( fragment ) {
     302                        // Special handling of each script element
     303                        handleScript = function( elem ) {
     304                                // Check if we consider it executable
     305                                if ( !elem.type || rscriptType.test( elem.type ) ) {
     306                                        // Detach the script and store it in the scripts array (if provided) or the fragment
     307                                        // Return truthy to indicate that it has been handled
     308                                        return scripts ?
     309                                                scripts.push( elem.parentNode ? elem.parentNode.removeChild( elem ) : elem ) :
     310                                                fragment.appendChild( elem );
     311                                }
     312                        };
     313
     314                        for ( i = 0; (elem = ret[i]) != null; i++ ) {
     315                                // Check if we're done after handling an executable script
     316                                if ( !( jQuery.nodeName( elem, "script" ) && handleScript( elem ) ) ) {
     317                                        // Append to fragment and handle embedded scripts
     318                                        fragment.appendChild( elem );
     319                                        if ( typeof elem.getElementsByTagName !== "undefined" ) {
     320                                                // handleScript alters the DOM, so use jQuery.merge to ensure snapshot iteration
     321                                                jsTags = jQuery.grep( jQuery.merge( [], elem.getElementsByTagName("script") ), handleScript );
     322
     323                                                // Splice the scripts into ret after their former ancestor and advance our index beyond them
     324                                                ret.splice.apply( ret, [i + 1, 0].concat( jsTags ) );
     325                                                i += jsTags.length;
     326                                        }
     327                                }
     328                        }
     329                }
     330
     331                return ret;
     332        };
     333}
     334
     335jQuery.buildFragment = function( elems, context, scripts, selection ) {
     336        var ret,
     337                warning = "jQuery.buildFragment() is deprecated";
     338
     339        // Set context per 1.8 logic
     340        context = context || document;
     341        context = !context.nodeType && context[0] || context;
     342        context = context.ownerDocument || context;
     343
     344        try {
     345                ret = oldFragment.call( jQuery, elems, context, scripts, selection );
     346
     347        // jQuery < 1.8 required arrayish context; jQuery 1.9 fails on it
     348        } catch( x ) {
     349                ret = oldFragment.call( jQuery, elems, context.nodeType ? [ context ] : context[ 0 ], scripts, selection );
     350
     351                // Success from tweaking context means buildFragment was called by the user
     352                migrateWarn( warning );
     353        }
     354
     355        // jQuery < 1.9 returned an object instead of the fragment itself
     356        if ( !ret.fragment ) {
     357                migrateWarnProp( ret, "fragment", ret, warning );
     358                migrateWarnProp( ret, "cacheable", false, warning );
     359        }
     360
     361        return ret;
    280362};
    281363
    … …  
    304386}
    305387
     388// Undocumented jQuery.event.handle was "deprecated" in jQuery 1.7
     389migrateWarnProp( jQuery.event, "handle", jQuery.event.dispatch, "jQuery.event.handle is undocumented and deprecated" );
     390
    306391// Support for 'hover' pseudo-event and ajax event warnings
    307392jQuery.event.add = function( elem, types, handler, data, selector ){
    … …  
    315400};
    316401
    317 jQuery.fn.error = function( data, fn ) {
     402jQuery.fn.error = function() {
    318403        var args = Array.prototype.slice.call( arguments, 0);
    319404        migrateWarn("jQuery.fn.error() is deprecated");
    … …  
    388473        function( _, name ) {
    389474                jQuery.event.special[ name ] = {
    390                         setup: function( data ) {
     475                        setup: function() {
    391476                                var elem = this;
    392477
    393478                                // The document needs no shimming; must be !== for oldIE
    394479                                if ( elem !== document ) {
    395                                         jQuery.event.add( document, name + "." + jQuery.guid, function( event ) {
     480                                        jQuery.event.add( document, name + "." + jQuery.guid, function() {
    396481                                                jQuery.event.trigger( name, null, elem, true );
    397482                                        });
    … …  
    400485                                return false;
    401486                        },
    402                         teardown: function( data, handleObj ) {
     487                        teardown: function() {
    403488                                if ( this !== document ) {
    404489                                        jQuery.event.remove( document, name + "." + jQuery._data( this, name ) );
    … …  
    406491                                return false;
    407492                        }
    408                 }
     493                };
    409494        }
    410495);
  • trunk/wp-includes/js/jquery/jquery.js

    r23180 r23301  
    11/*!
    2  * jQuery JavaScript Library v1.9.0b1
     2 * jQuery JavaScript Library v1.9.0
    33 * http://jquery.com/
    44 *
    … …  
    66 * http://sizzlejs.com/
    77 *
    8  * Copyright 2012 jQuery Foundation and other contributors
     8 * Copyright 2005, 2012 jQuery Foundation, Inc. and other contributors
    99 * Released under the MIT license
    1010 * http://jquery.org/license
    1111 *
    12  * Date: 2012-12-16
     12 * Date: 2013-1-14
    1313 */
    1414(function( window, undefined ) {
    … …  
    3737        core_deletedIds = [],
    3838
    39         core_version = "1.9.0b1",
     39        core_version = "1.9.0",
    4040
    4141        // Save a reference to some core methods
    … …  
    112112                }
    113113
    114                 // HANDLE: $(DOMElement)
    115                 if ( selector.nodeType ) {
    116                         this.context = this[0] = selector;
    117                         this.length = 1;
    118                         return this;
    119                 }
    120 
    121114                // Handle HTML strings
    122115                if ( typeof selector === "string" ) {
    … …  
    192185                        }
    193186
     187                // HANDLE: $(DOMElement)
     188                } else if ( selector.nodeType ) {
     189                        this.context = this[0] = selector;
     190                        this.length = 1;
     191                        return this;
     192
    194193                // HANDLE: $(function)
    195194                // Shortcut for document ready
    … …  
    443442
    444443        type: function( obj ) {
    445                 return obj == null ?
    446                         String( obj ) :
    447                         class2type[ core_toString.call(obj) ] || "object";
     444                if ( obj == null ) {
     445                        return String( obj );
     446                }
     447                return typeof obj === "object" || typeof obj === "function" ?
     448                        class2type[ core_toString.call(obj) ] || "object" :
     449                        typeof obj;
    448450        },
    449451
    … …  
    510512                }
    511513
    512                 parsed = context.createDocumentFragment();
    513                 jQuery.clean( [ data ], context, parsed, scripts );
     514                parsed = jQuery.buildFragment( [ data ], context, scripts );
    514515                if ( scripts ) {
    515516                        jQuery( scripts ).remove();
    … …  
    11651166                                                jQuery.each( tuples, function( i, tuple ) {
    11661167                                                        var action = tuple[ 0 ],
    1167                                                                 fn = fns[ i ];
     1168                                                                fn = jQuery.isFunction( fns[ i ] ) && fns[ i ];
    11681169                                                        // deferred[ done | fail | progress ] for forwarding actions to newDefer
    1169                                                         deferred[ tuple[1] ]( jQuery.isFunction( fn ) ?
    1170                                                                 function() {
    1171                                                                         var returned = fn.apply( this, arguments );
    1172                                                                         if ( returned && jQuery.isFunction( returned.promise ) ) {
    1173                                                                                 returned.promise()
    1174                                                                                         .done( newDefer.resolve )
    1175                                                                                         .fail( newDefer.reject )
    1176                                                                                         .progress( newDefer.notify );
    1177                                                                         } else {
    1178                                                                                 newDefer[ action + "With" ]( this === promise ? newDefer.promise() : this, [ returned ] );
    1179                                                                         }
    1180                                                                 } :
    1181                                                                 newDefer[ action ]
    1182                                                         );
     1170                                                        deferred[ tuple[1] ](function() {
     1171                                                                var returned = fn && fn.apply( this, arguments );
     1172                                                                if ( returned && jQuery.isFunction( returned.promise ) ) {
     1173                                                                        returned.promise()
     1174                                                                                .done( newDefer.resolve )
     1175                                                                                .fail( newDefer.reject )
     1176                                                                                .progress( newDefer.notify );
     1177                                                                } else {
     1178                                                                        newDefer[ action + "With" ]( this === promise ? newDefer.promise() : this, fn ? [ returned ] : arguments );
     1179                                                                }
     1180                                                        });
    11831181                                                });
    11841182                                                fns = null;
    … …  
    12161214                        // deferred[ resolve | reject | notify ]
    12171215                        deferred[ tuple[0] ] = function() {
    1218                                 deferred[ tuple[0] + "With" ]( promise, arguments );
     1216                                deferred[ tuple[0] + "With" ]( this === deferred ? promise : this, arguments );
    12191217                                return this;
    12201218                        };
    … …  
    12881286jQuery.support = (function() {
    12891287
    1290         var support,
    1291                 all,
    1292                 a,
    1293                 select,
    1294                 opt,
    1295                 input,
    1296                 fragment,
    1297                 eventName,
    1298                 i,
    1299                 isSupported,
    1300                 clickFn,
     1288        var support, all, a, select, opt, input, fragment, eventName, isSupported, i,
    13011289                div = document.createElement("div");
    13021290
    … …  
    13681356
    13691357                // Will be defined later
    1370                 submitBubbles: true,
    1371                 changeBubbles: true,
    1372                 focusinBubbles: false,
    13731358                deleteExpando: true,
    13741359                noCloneEvent: true,
    … …  
    13891374        support.optDisabled = !opt.disabled;
    13901375
    1391         // Test to see if it's possible to delete an expando from an element
    1392         // Fails in Internet Explorer
     1376        // Support: IE<9
    13931377        try {
    13941378                delete div.test;
    … …  
    13971381        }
    13981382
    1399         if ( !div.addEventListener && div.attachEvent && div.fireEvent ) {
    1400                 div.attachEvent( "onclick", clickFn = function() {
    1401                         // Cloning a node shouldn't copy over any
    1402                         // bound event handlers (IE does this)
    1403                         support.noCloneEvent = false;
    1404                 });
    1405                 div.cloneNode( true ).fireEvent("onclick");
    1406                 div.detachEvent( "onclick", clickFn );
    1407         }
    1408 
    14091383        // Check if we can trust getAttribute("value")
    14101384        input = document.createElement("input");
    … …  
    14181392
    14191393        // #11217 - WebKit loses check when the name is after the checked attribute
    1420         input.setAttribute( "checked", "checked" );
     1394        input.setAttribute( "checked", "t" );
    14211395        input.setAttribute( "name", "t" );
    14221396
    1423         div.appendChild( input );
    14241397        fragment = document.createDocumentFragment();
    1425         fragment.appendChild( div.lastChild );
    1426 
    1427         // WebKit doesn't clone checked state correctly in fragments
    1428         support.checkClone = fragment.cloneNode( true ).cloneNode( true ).lastChild.checked;
     1398        fragment.appendChild( input );
    14291399
    14301400        // Check if a disconnected checkbox will retain its checked
    … …  
    14321402        support.appendChecked = input.checked;
    14331403
    1434         fragment.removeChild( input );
    1435         fragment.appendChild( div );
    1436 
    1437         // Technique from Juriy Zaytsev
    1438         // http://perfectionkills.com/detecting-event-support-without-browser-sniffing/
    1439         // We only care about the case where non-standard event systems
    1440         // are used, namely in IE. Short-circuiting here helps us to
    1441         // avoid an eval call (in setAttribute) which can cause CSP
    1442         // to go haywire. See: https://developer.mozilla.org/en/Security/CSP
     1404        // WebKit doesn't clone checked state correctly in fragments
     1405        support.checkClone = fragment.cloneNode( true ).cloneNode( true ).lastChild.checked;
     1406
     1407        // Support: IE<9
     1408        // Opera does not clone events (and typeof div.attachEvent === undefined).
     1409        // IE9-10 clones events bound via attachEvent, but they don't trigger with .click()
    14431410        if ( div.attachEvent ) {
    1444                 for ( i in {
    1445                         submit: true,
    1446                         change: true,
    1447                         focusin: true
    1448                 }) {
    1449                         eventName = "on" + i;
    1450                         isSupported = ( eventName in div );
    1451                         if ( !isSupported ) {
    1452                                 div.setAttribute( eventName, "return;" );
    1453                                 isSupported = ( typeof div[ eventName ] === "function" );
    1454                         }
    1455                         support[ i + "Bubbles" ] = isSupported;
    1456                 }
    1457         }
     1411                div.attachEvent( "onclick", function() {
     1412                        support.noCloneEvent = false;
     1413                });
     1414
     1415                div.cloneNode( true ).click();
     1416        }
     1417
     1418        // Support: IE<9 (lack submit/change bubble), Firefox 17+ (lack focusin event)
     1419        // Beware of CSP restrictions (https://developer.mozilla.org/en/Security/CSP), test/csp.php
     1420        for ( i in { submit: true, change: true, focusin: true }) {
     1421                div.setAttribute( eventName = "on" + i, "t" );
     1422
     1423                support[ i + "Bubbles" ] = eventName in window || div.attributes[ eventName ].expando === false;
     1424        }
     1425
     1426        div.style.backgroundClip = "content-box";
     1427        div.cloneNode( true ).style.backgroundClip = "";
     1428        support.clearCloneStyle = div.style.backgroundClip === "content-box";
    14581429
    14591430        // Run tests that need a body at doc ready
    14601431        jQuery(function() {
    1461                 var container, div, tds, marginDiv,
    1462                         divReset = "padding:0;margin:0;border:0;display:block;overflow:hidden;box-sizing:content-box;-moz-box-sizing:content-box;-webkit-box-sizing:content-box;",
     1432                var container, marginDiv, tds,
     1433                        divReset = "padding:0;margin:0;border:0;display:block;box-sizing:content-box;-moz-box-sizing:content-box;-webkit-box-sizing:content-box;",
    14631434                        body = document.getElementsByTagName("body")[0];
    14641435
    … …  
    14691440
    14701441                container = document.createElement("div");
    1471                 container.style.cssText = "visibility:hidden;border:0;width:0;height:0;position:static;top:0;margin-top:1px";
    1472                 body.insertBefore( container, body.firstChild );
    1473 
    1474                 // Construct the test element
    1475                 div = document.createElement("div");
    1476                 container.appendChild( div );
    1477 
     1442                container.style.cssText = "border:0;width:0;height:0;position:absolute;top:0;left:-9999px;margin-top:1px";
     1443
     1444                body.appendChild( container ).appendChild( div );
     1445
     1446                // Support: IE8
    14781447                // Check if table cells still have offsetWidth/Height when they are set
    14791448                // to display:none and there are still other visible table cells in a
    … …  
    14821451                // display:none (it is still safe to use offsets if a parent element is
    14831452                // hidden; don safety goggles and see bug #4512 for more information).
    1484                 // (only IE 8 fails this test)
    14851453                div.innerHTML = "<table><tr><td></td><td>t</td></tr></table>";
    14861454                tds = div.getElementsByTagName("td");
    … …  
    14911459                tds[ 1 ].style.display = "none";
    14921460
     1461                // Support: IE8
    14931462                // Check if empty table cells still have offsetWidth/Height
    1494                 // (IE <= 8 fail this test)
    14951463                support.reliableHiddenOffsets = isSupported && ( tds[ 0 ].offsetHeight === 0 );
    14961464
    … …  
    15011469                support.doesNotIncludeMarginInBodyOffset = ( body.offsetTop !== 1 );
    15021470
    1503                 // NOTE: To any future maintainer, we've window.getComputedStyle
    1504                 // because jsdom on node.js will break without it.
     1471                // Use window.getComputedStyle because jsdom on node.js will break without it.
    15051472                if ( window.getComputedStyle ) {
    15061473                        support.pixelPosition = ( window.getComputedStyle( div, null ) || {} ).top !== "1%";
    … …  
    15081475
    15091476                        // Check if div with explicit width and no margin-right incorrectly
    1510                         // gets computed margin-right based on width of container. For more
    1511                         // info see bug #3333
     1477                        // gets computed margin-right based on width of container. (#3333)
    15121478                        // Fails in WebKit before Feb 2011 nightlies
    15131479                        // WebKit Bug 13343 - getComputedStyle returns wrong value for margin-right
    1514                         marginDiv = document.createElement("div");
     1480                        marginDiv = div.appendChild( document.createElement("div") );
    15151481                        marginDiv.style.cssText = div.style.cssText = divReset;
    15161482                        marginDiv.style.marginRight = marginDiv.style.width = "0";
    15171483                        div.style.width = "1px";
    1518                         div.appendChild( marginDiv );
     1484
    15191485                        support.reliableMarginRight =
    15201486                                !parseFloat( ( window.getComputedStyle( marginDiv, null ) || {} ).marginRight );
    … …  
    15221488
    15231489                if ( typeof div.style.zoom !== "undefined" ) {
     1490                        // Support: IE<8
    15241491                        // Check if natively block-level elements act like inline-block
    15251492                        // elements when setting their display to 'inline' and giving
    15261493                        // them layout
    1527                         // (IE < 8 does this)
    15281494                        div.innerHTML = "";
    15291495                        div.style.cssText = divReset + "width:1px;padding:1px;display:inline;zoom:1";
    15301496                        support.inlineBlockNeedsLayout = ( div.offsetWidth === 3 );
    15311497
     1498                        // Support: IE6
    15321499                        // Check if elements with layout shrink-wrap their children
    1533                         // (IE 6 does this)
    15341500                        div.style.display = "block";
    1535                         div.style.overflow = "visible";
    15361501                        div.innerHTML = "<div></div>";
    15371502                        div.firstChild.style.width = "5px";
    … …  
    15431508                }
    15441509
     1510                body.removeChild( container );
     1511
    15451512                // Null elements to avoid leaks in IE
    1546                 body.removeChild( container );
    15471513                container = div = tds = marginDiv = null;
    15481514        });
    15491515
    15501516        // Null elements to avoid leaks in IE
    1551         fragment.removeChild( div );
    1552         all = a = select = opt = input = fragment = div = null;
     1517        all = select = fragment = opt = a = input = null;
    15531518
    15541519        return support;
    15551520})();
     1521
    15561522var rbrace = /(?:\{[\s\S]*\}|\[[\s\S]*\])$/,
    15571523        rmultiDash = /([A-Z])/g;
    1558 
     1524       
    15591525function internalData( elem, name, data, pvt /* Internal Use Only */ ){
    15601526        if ( !jQuery.acceptData( elem ) ) {
    … …  
    17721738                return internalData( elem, name, data, true );
    17731739        },
    1774 
     1740       
    17751741        _removeData: function( elem, name ) {
    17761742                return internalRemoveData( elem, name, true );
    … …  
    19271893                }
    19281894
     1895                hooks.cur = fn;
    19291896                if ( fn ) {
    19301897
    … …  
    23682335                } else {
    23692336
    2370                         ret = elem.getAttribute( name );
     2337                        // In IE9+, Flash objects don't have .getAttribute (#12945)
     2338                        // Support: IE9+
     2339                        if ( typeof elem.getAttribute !== "undefined" ) {
     2340                                ret =  elem.getAttribute( name );
     2341                        }
    23712342
    23722343                        // Non-existent attributes return null, we normalize to undefined
    … …  
    26382609                get: function( elem ) {
    26392610                        // Return undefined in the case of empty string
    2640                         // Normalize to lowercase since IE uppercases css property names
    2641                         return elem.style.cssText.toLowerCase() || undefined;
     2611                        // Note: IE uppercases css property names, but if we were to .toLowerCase()
     2612                        // .cssText, that would destroy case senstitivity in URL's, like in "background"
     2613                        return elem.style.cssText || undefined;
    26422614                },
    26432615                set: function( elem, value ) {
    … …  
    26982670        rtypenamespace = /^([^.]*)(?:\.(.+)|)$/;
    26992671
     2672function returnTrue() {
     2673        return true;
     2674}
     2675
     2676function returnFalse() {
     2677        return false;
     2678}
     2679
    27002680/*
    27012681 * Helper functions for managing events -- not part of the public interface.
    … …  
    27042684jQuery.event = {
    27052685
     2686        global: {},
     2687
    27062688        add: function( elem, types, handler, data, selector ) {
    2707                 var elemData, eventHandle, events,
    2708                         tns, type, namespaces, handleObj,
    2709                         handleObjIn, handlers, special,
    2710                         t = 0;
    2711 
    2712                 // Don't attach events to noData or text/comment nodes (allow plain objects tho)
    2713                 if ( elem.nodeType === 3 || elem.nodeType === 8 || !types || !handler || !(elemData = jQuery._data( elem )) ) {
     2689
     2690                var handleObjIn, eventHandle, tmp,
     2691                        events, t, handleObj,
     2692                        special, handlers, type, namespaces, origType,
     2693                        // Don't attach events to noData or text/comment nodes (but allow plain objects)
     2694                        elemData = elem.nodeType !== 3 && elem.nodeType !== 8 && jQuery._data( elem );
     2695
     2696                if ( !elemData ) {
    27142697                        return;
    27152698                }
    … …  
    27282711
    27292712                // Init the element's event structure and main handler, if this is the first
    2730                 events = elemData.events;
    2731                 if ( !events ) {
    2732                         elemData.events = events = {};
    2733                 }
    2734                 eventHandle = elemData.handle;
    2735                 if ( !eventHandle ) {
    2736                         elemData.handle = eventHandle = function( e ) {
     2713                if ( !(events = elemData.events) ) {
     2714                        events = elemData.events = {};
     2715                }
     2716                if ( !(eventHandle = elemData.handle) ) {
     2717                        eventHandle = elemData.handle = function( e ) {
    27372718                                // Discard the second event of a jQuery.event.trigger() and
    27382719                                // when an event is called after a page has unloaded
    … …  
    27482729                // jQuery(...).bind("mouseover mouseout", fn);
    27492730                types = ( types || "" ).match( core_rnotwhite ) || [""];
    2750                 for ( ; t < types.length; t++ ) {
    2751 
    2752                         tns = rtypenamespace.exec( types[t] ) || [];
    2753                         type = tns[1];
    2754                         namespaces = ( tns[2] || "" ).split( "." ).sort();
     2731                t = types.length;
     2732                while ( t-- ) {
     2733                        tmp = rtypenamespace.exec( types[t] ) || [];
     2734                        type = origType = tmp[1];
     2735                        namespaces = ( tmp[2] || "" ).split( "." ).sort();
    27552736
    27562737                        // If event changes its type, use the special event handlers for the changed type
    … …  
    27662747                        handleObj = jQuery.extend({
    27672748                                type: type,
    2768                                 origType: tns[1],
     2749                                origType: origType,
    27692750                                data: data,
    27702751                                handler: handler,
    … …  
    27762757
    27772758                        // Init the event handler queue if we're the first
    2778                         handlers = events[ type ];
    2779                         if ( !handlers ) {
     2759                        if ( !(handlers = events[ type ]) ) {
    27802760                                handlers = events[ type ] = [];
    27812761                                handlers.delegateCount = 0;
    … …  
    28162796        },
    28172797
    2818         global: {},
    2819 
    28202798        // Detach an event or set of events from an element
    28212799        remove: function( elem, types, handler, selector, mappedTypes ) {
    28222800
    2823                 var tns, type, origType, namespaces, origCount,
    2824                         j, events, special, eventType, handleObj,
    2825                         t = 0,
     2801                var j, origCount, tmp,
     2802                        events, t, handleObj,
     2803                        special, handlers, type, namespaces, origType,
    28262804                        elemData = jQuery.hasData( elem ) && jQuery._data( elem );
    28272805
    … …  
    28322810                // Once for each type.namespace in types; type may be omitted
    28332811                types = ( types || "" ).match( core_rnotwhite ) || [""];
    2834                 for ( ; t < types.length; t++ ) {
    2835                         tns = rtypenamespace.exec( types[t] ) || [];
    2836                         type = origType = tns[1];
    2837                         namespaces = tns[2];
     2812                t = types.length;
     2813                while ( t-- ) {
     2814                        tmp = rtypenamespace.exec( types[t] ) || [];
     2815                        type = origType = tmp[1];
     2816                        namespaces = ( tmp[2] || "" ).split( "." ).sort();
    28382817
    28392818                        // Unbind all events (on this namespace, if provided) for the element
    … …  
    28462825
    28472826                        special = jQuery.event.special[ type ] || {};
    2848                         type = ( selector? special.delegateType : special.bindType ) || type;
    2849                         eventType = events[ type ] || [];
    2850                         origCount = eventType.length;
    2851                         namespaces = namespaces ? new RegExp("(^|\\.)" + namespaces.split(".").sort().join("\\.(?:.*\\.|)") + "(\\.|$)") : null;
     2827                        type = ( selector ? special.delegateType : special.bindType ) || type;
     2828                        handlers = events[ type ] || [];
     2829                        tmp = tmp[2] && new RegExp( "(^|\\.)" + namespaces.join("\\.(?:.*\\.|)") + "(\\.|$)" );
    28522830
    28532831                        // Remove matching events
    2854                         for ( j = 0; j < eventType.length; j++ ) {
    2855                                 handleObj = eventType[ j ];
     2832                        origCount = j = handlers.length;
     2833                        while ( j-- ) {
     2834                                handleObj = handlers[ j ];
    28562835
    28572836                                if ( ( mappedTypes || origType === handleObj.origType ) &&
    28582837                                        ( !handler || handler.guid === handleObj.guid ) &&
    2859                                         ( !namespaces || namespaces.test( handleObj.namespace ) ) &&
     2838                                        ( !tmp || tmp.test( handleObj.namespace ) ) &&
    28602839                                        ( !selector || selector === handleObj.selector || selector === "**" && handleObj.selector ) ) {
    2861                                         eventType.splice( j--, 1 );
     2840                                        handlers.splice( j, 1 );
    28622841
    28632842                                        if ( handleObj.selector ) {
    2864                                                 eventType.delegateCount--;
     2843                                                handlers.delegateCount--;
    28652844                                        }
    28662845                                        if ( special.remove ) {
    … …  
    28722851                        // Remove generic event handler if we removed something and no more handlers exist
    28732852                        // (avoids potential for endless recursion during removal of special event handlers)
    2874                         if ( eventType.length === 0 && origCount !== eventType.length ) {
     2853                        if ( origCount && !handlers.length ) {
    28752854                                if ( !special.teardown || special.teardown.call( elem, namespaces, elemData.handle ) === false ) {
    28762855                                        jQuery.removeEvent( elem, type, elemData.handle );
    … …  
    28932872        trigger: function( event, data, elem, onlyHandlers ) {
    28942873
    2895                 var i, cur, old, ontype, special, handle, eventPath, bubbleType,
     2874                var i, cur, tmp, bubbleType, ontype, handle, special,
     2875                        eventPath = [ elem || document ],
    28962876                        type = event.type || event,
    28972877                        namespaces = event.namespace ? event.namespace.split(".") : [];
    28982878
    2899                 elem = elem || document;
     2879                cur = tmp = elem = elem || document;
    29002880
    29012881                // Don't do events on text and comment nodes
    … …  
    29152895                        namespaces.sort();
    29162896                }
    2917 
    2918                 // Caller can pass in an Event, Object, or just an event type string
    2919                 event = typeof event === "object" ?
    2920                         // jQuery.Event object
    2921                         event[ jQuery.expando ] ? event :
    2922                         // Object literal
    2923                         new jQuery.Event( type, event ) :
    2924                         // Just the event type (string)
    2925                         new jQuery.Event( type );
    2926 
    2927                 event.type = type;
     2897                ontype = type.indexOf(":") < 0 && "on" + type;
     2898
     2899                // Caller can pass in a jQuery.Event object, Object, or just an event type string
     2900                event = event[ jQuery.expando ] ?
     2901                        event :
     2902                        new jQuery.Event( type, typeof event === "object" && event );
     2903
    29282904                event.isTrigger = true;
    29292905                event.namespace = namespaces.join(".");
    2930                 event.namespace_re = event.namespace? new RegExp("(^|\\.)" + namespaces.join("\\.(?:.*\\.|)") + "(\\.|$)") : null;
    2931                 ontype = type.indexOf(":") < 0 ? "on" + type : "";
     2906                event.namespace_re = event.namespace ?
     2907                        new RegExp( "(^|\\.)" + namespaces.join("\\.(?:.*\\.|)") + "(\\.|$)" ) :
     2908                        null;
    29322909
    29332910                // Clean up the event in case it is being reused
    … …  
    29382915
    29392916                // Clone any incoming data and prepend the event, creating the handler arg list
    2940                 data = data != null ? jQuery.makeArray( data ) : [];
    2941                 data.unshift( event );
     2917                data = data == null ?
     2918                        [ event ] :
     2919                        jQuery.makeArray( data, [ event ] );
    29422920
    29432921                // Allow special events to draw outside the lines
    … …  
    29492927                // Determine event propagation path in advance, per W3C events spec (#9951)
    29502928                // Bubble up to document, then to window; watch for a global ownerDocument var (#9724)
    2951                 eventPath = [[ elem, special.bindType || type ]];
    29522929                if ( !onlyHandlers && !special.noBubble && !jQuery.isWindow( elem ) ) {
    29532930
    29542931                        bubbleType = special.delegateType || type;
    2955                         cur = rfocusMorph.test( bubbleType + type ) ? elem : elem.parentNode;
    2956                         for ( old = elem; cur; cur = cur.parentNode ) {
    2957                                 eventPath.push([ cur, bubbleType ]);
    2958                                 old = cur;
     2932                        if ( !rfocusMorph.test( bubbleType + type ) ) {
     2933                                cur = cur.parentNode;
     2934                        }
     2935                        for ( ; cur; cur = cur.parentNode ) {
     2936                                eventPath.push( cur );
     2937                                tmp = cur;
    29592938                        }
    29602939
    29612940                        // Only add window if we got to document (e.g., not plain obj or detached DOM)
    2962                         if ( old === (elem.ownerDocument || document) ) {
    2963                                 eventPath.push([ old.defaultView || old.parentWindow || window, bubbleType ]);
     2941                        if ( tmp === (elem.ownerDocument || document) ) {
     2942                                eventPath.push( tmp.defaultView || tmp.parentWindow || window );
    29642943                        }
    29652944                }
    29662945
    29672946                // Fire handlers on the event path
    2968                 for ( i = 0; i < eventPath.length && !event.isPropagationStopped(); i++ ) {
    2969 
    2970                         cur = eventPath[i][0];
    2971                         event.type = eventPath[i][1];
    2972 
     2947                i = 0;
     2948                while ( (cur = eventPath[i++]) && !event.isPropagationStopped() ) {
     2949
     2950                        event.type = i > 1 ?
     2951                                bubbleType :
     2952                                special.bindType || type;
     2953
     2954                        // jQuery handler
    29732955                        handle = ( jQuery._data( cur, "events" ) || {} )[ event.type ] && jQuery._data( cur, "handle" );
    29742956                        if ( handle ) {
    29752957                                handle.apply( cur, data );
    29762958                        }
    2977                         // Note that this is a bare JS function and not a jQuery handler
     2959
     2960                        // Native handler
    29782961                        handle = ontype && cur[ ontype ];
    29792962                        if ( handle && jQuery.acceptData( cur ) && handle.apply && handle.apply( cur, data ) === false ) {
    … …  
    29952978
    29962979                                        // Don't re-trigger an onFOO event when we call its FOO() method
    2997                                         old = elem[ ontype ];
    2998 
    2999                                         if ( old ) {
     2980                                        tmp = elem[ ontype ];
     2981
     2982                                        if ( tmp ) {
    30002983                                                elem[ ontype ] = null;
    30012984                                        }
    … …  
    30112994                                        jQuery.event.triggered = undefined;
    30122995
    3013                                         if ( old ) {
    3014                                                 elem[ ontype ] = old;
     2996                                        if ( tmp ) {
     2997                                                elem[ ontype ] = tmp;
    30152998                                        }
    30162999                                }
    … …  
    30263009                event = jQuery.event.fix( event );
    30273010
    3028                 var i, j, cur, ret, selMatch, matched, matches, handleObj, sel,
    3029                         handlers = ( (jQuery._data( this, "events" ) || {} )[ event.type ] || []),
    3030                         delegateCount = handlers.delegateCount,
     3011                var i, j, ret, matched, handleObj,
     3012                        handlerQueue = [],
    30313013                        args = core_slice.call( arguments ),
    3032                         special = jQuery.event.special[ event.type ] || {},
    3033                         handlerQueue = [];
     3014                        handlers = ( jQuery._data( this, "events" ) || {} )[ event.type ] || [],
     3015                        special = jQuery.event.special[ event.type ] || {};
    30343016
    30353017                // Use the fix-ed jQuery.Event rather than the (read-only) native event
    … …  
    30423024                }
    30433025
    3044                 // Determine handlers that should run if there are delegated events
     3026                // Determine handlers
     3027                handlerQueue = jQuery.event.handlers.call( this, event, handlers );
     3028
     3029                // Run delegates first; they may want to stop propagation beneath us
     3030                i = 0;
     3031                while ( (matched = handlerQueue[ i++ ]) && !event.isPropagationStopped() ) {
     3032                        event.currentTarget = matched.elem;
     3033
     3034                        j = 0;
     3035                        while ( (handleObj = matched.handlers[ j++ ]) && !event.isImmediatePropagationStopped() ) {
     3036
     3037                                // Triggered event must either 1) have no namespace, or
     3038                                // 2) have namespace(s) a subset or equal to those in the bound event (both can have no namespace).
     3039                                if ( !event.namespace_re || event.namespace_re.test( handleObj.namespace ) ) {
     3040
     3041                                        event.handleObj = handleObj;
     3042                                        event.data = handleObj.data;
     3043
     3044                                        ret = ( (jQuery.event.special[ handleObj.origType ] || {}).handle || handleObj.handler )
     3045                                                        .apply( matched.elem, args );
     3046
     3047                                        if ( ret !== undefined ) {
     3048                                                if ( (event.result = ret) === false ) {
     3049                                                        event.preventDefault();
     3050                                                        event.stopPropagation();
     3051                                                }
     3052                                        }
     3053                                }
     3054                        }
     3055                }
     3056
     3057                // Call the postDispatch hook for the mapped type
     3058                if ( special.postDispatch ) {
     3059                        special.postDispatch.call( this, event );
     3060                }
     3061
     3062                return event.result;
     3063        },
     3064
     3065        handlers: function( event, handlers ) {
     3066                var i, matches, sel, handleObj,
     3067                        handlerQueue = [],
     3068                        delegateCount = handlers.delegateCount,
     3069                        cur = event.target;
     3070
     3071                // Find delegate handlers
     3072                // Black-hole SVG <use> instance trees (#13180)
    30453073                // Avoid non-left-click bubbling in Firefox (#3861)
    3046                 if ( delegateCount && !(event.button && event.type === "click") ) {
    3047 
    3048                         for ( cur = event.target; cur != this; cur = cur.parentNode || this ) {
    3049 
    3050                                 // Don't process clicks (ONLY) on disabled elements (#6911, #8165, #11382, #11764)
     3074                if ( delegateCount && cur.nodeType && (!event.button || event.type !== "click") ) {
     3075
     3076                        for ( ; cur != this; cur = cur.parentNode || this ) {
     3077
     3078                                // Don't process clicks on disabled elements (#6911, #8165, #11382, #11764)
    30513079                                if ( cur.disabled !== true || event.type !== "click" ) {
    3052                                         selMatch = {};
    30533080                                        matches = [];
    30543081                                        for ( i = 0; i < delegateCount; i++ ) {
    30553082                                                handleObj = handlers[ i ];
    3056                                                 sel = handleObj.selector;
    3057 
    3058                                                 if ( selMatch[ sel ] === undefined ) {
    3059                                                         selMatch[ sel ] = handleObj.needsContext ?
     3083
     3084                                                // Don't conflict with Object.prototype properties (#13203)
     3085                                                sel = handleObj.selector + " ";
     3086
     3087                                                if ( matches[ sel ] === undefined ) {
     3088                                                        matches[ sel ] = handleObj.needsContext ?
    30603089                                                                jQuery( sel, this ).index( cur ) >= 0 :
    30613090                                                                jQuery.find( sel, this, null, [ cur ] ).length;
    30623091                                                }
    3063                                                 if ( selMatch[ sel ] ) {
     3092                                                if ( matches[ sel ] ) {
    30643093                                                        matches.push( handleObj );
    30653094                                                }
    30663095                                        }
    30673096                                        if ( matches.length ) {
    3068                                                 handlerQueue.push({ elem: cur, matches: matches });
     3097                                                handlerQueue.push({ elem: cur, handlers: matches });
    30693098                                        }
    30703099                                }
    … …  
    30733102
    30743103                // Add the remaining (directly-bound) handlers
    3075                 if ( handlers.length > delegateCount ) {
    3076                         handlerQueue.push({ elem: this, matches: handlers.slice( delegateCount ) });
    3077                 }
    3078 
    3079                 // Run delegates first; they may want to stop propagation beneath us
    3080                 for ( i = 0; i < handlerQueue.length && !event.isPropagationStopped(); i++ ) {
    3081                         matched = handlerQueue[ i ];
    3082                         event.currentTarget = matched.elem;
    3083 
    3084                         for ( j = 0; j < matched.matches.length && !event.isImmediatePropagationStopped(); j++ ) {
    3085                                 handleObj = matched.matches[ j ];
    3086 
    3087                                 // Triggered event must either 1) have no namespace, or
    3088                                 // 2) have namespace(s) a subset or equal to those in the bound event (both can have no namespace).
    3089                                 if ( !event.namespace || event.namespace_re && event.namespace_re.test( handleObj.namespace ) ) {
    3090 
    3091                                         event.data = handleObj.data;
    3092                                         event.handleObj = handleObj;
    3093 
    3094                                         ret = ( (jQuery.event.special[ handleObj.origType ] || {}).handle || handleObj.handler )
    3095                                                         .apply( matched.elem, args );
    3096 
    3097                                         if ( ret !== undefined ) {
    3098                                                 event.result = ret;
    3099                                                 if ( ret === false ) {
    3100                                                         event.preventDefault();
    3101                                                         event.stopPropagation();
    3102                                                 }
    3103                                         }
    3104                                 }
    3105                         }
    3106                 }
    3107 
    3108                 // Call the postDispatch hook for the mapped type
    3109                 if ( special.postDispatch ) {
    3110                         special.postDispatch.call( this, event );
    3111                 }
    3112 
    3113                 return event.result;
     3104                if ( delegateCount < handlers.length ) {
     3105                        handlerQueue.push({ elem: this, handlers: handlers.slice( delegateCount ) });
     3106                }
     3107
     3108                return handlerQueue;
     3109        },
     3110
     3111        fix: function( event ) {
     3112                if ( event[ jQuery.expando ] ) {
     3113                        return event;
     3114                }
     3115
     3116                // Create a writable copy of the event object and normalize some properties
     3117                var i, prop,
     3118                        originalEvent = event,
     3119                        fixHook = jQuery.event.fixHooks[ event.type ] || {},
     3120                        copy = fixHook.props ? this.props.concat( fixHook.props ) : this.props;
     3121
     3122                event = new jQuery.Event( originalEvent );
     3123
     3124                i = copy.length;
     3125                while ( i-- ) {
     3126                        prop = copy[ i ];
     3127                        event[ prop ] = originalEvent[ prop ];
     3128                }
     3129
     3130                // Support: IE<9
     3131                // Fix target property (#1925)
     3132                if ( !event.target ) {
     3133                        event.target = originalEvent.srcElement || document;
     3134                }
     3135
     3136                // Support: Chrome 23+, Safari?
     3137                // Target should not be a text node (#504, #13143)
     3138                if ( event.target.nodeType === 3 ) {
     3139                        event.target = event.target.parentNode;
     3140                }
     3141
     3142                // Support: IE<9
     3143                // For mouse/key events, metaKey==false if it's undefined (#3368, #11328)
     3144                event.metaKey = !!event.metaKey;
     3145
     3146                return fixHook.filter ? fixHook.filter( event, originalEvent ) : event;
    31143147        },
    31153148
    … …  
    31623195                        return event;
    31633196                }
    3164         },
    3165 
    3166         fix: function( event ) {
    3167                 if ( event[ jQuery.expando ] ) {
    3168                         return event;
    3169                 }
    3170 
    3171                 // Create a writable copy of the event object and normalize some properties
    3172                 var i, prop,
    3173                         originalEvent = event,
    3174                         fixHook = jQuery.event.fixHooks[ event.type ] || {},
    3175                         copy = fixHook.props ? this.props.concat( fixHook.props ) : this.props;
    3176 
    3177                 event = jQuery.Event( originalEvent );
    3178 
    3179                 for ( i = copy.length; i; ) {
    3180                         prop = copy[ --i ];
    3181                         event[ prop ] = originalEvent[ prop ];
    3182                 }
    3183 
    3184                 // Fix target property, if necessary (#1925, IE 6/7/8 & Safari2)
    3185                 if ( !event.target ) {
    3186                         event.target = originalEvent.srcElement || document;
    3187                 }
    3188 
    3189                 // Target should not be a text node (#504, Safari)
    3190                 if ( event.target.nodeType === 3 ) {
    3191                         event.target = event.target.parentNode;
    3192                 }
    3193 
    3194                 // For mouse/key events, metaKey==false if it's undefined (#3368, #11328; IE6/7/8)
    3195                 event.metaKey = !!event.metaKey;
    3196 
    3197                 return fixHook.filter? fixHook.filter( event, originalEvent ) : event;
    31983197        },
    31993198
    … …  
    32203219                                                return false;
    32213220                                        } catch ( e ) {
    3222                                                 // IE<9 dies on focus to hidden element (#1486,#12518)
    3223                                                 // If this happens, let .trigger() run the handlers
     3221                                                // Support: IE<9
     3222                                                // If we error on focus to hidden element (#1486, #12518),
     3223                                                // let .trigger() run the handlers
    32243224                                        }
    32253225                                }
    … …  
    32713271};
    32723272
    3273 // Some plugins are using, but it's undocumented/deprecated and will be removed.
    3274 // The 1.7 special event interface should provide all the hooks needed now.
    3275 jQuery.event.handle = jQuery.event.dispatch;
    3276 
    32773273jQuery.removeEvent = document.removeEventListener ?
    32783274        function( elem, type, handle ) {
    … …  
    33293325};
    33303326
    3331 function returnFalse() {
    3332         return false;
    3333 }
    3334 function returnTrue() {
    3335         return true;
    3336 }
    3337 
    33383327// jQuery.Event is based on DOM3 Events as specified by the ECMAScript Language Binding
    33393328// http://www.w3.org/TR/2003/WD-DOM-Level-3-Events-20030331/ecma-script-binding.html
    33403329jQuery.Event.prototype = {
     3330        isDefaultPrevented: returnFalse,
     3331        isPropagationStopped: returnFalse,
     3332        isImmediatePropagationStopped: returnFalse,
     3333
    33413334        preventDefault: function() {
     3335                var e = this.originalEvent;
     3336
    33423337                this.isDefaultPrevented = returnTrue;
    3343 
    3344                 var e = this.originalEvent;
    33453338                if ( !e ) {
    33463339                        return;
    33473340                }
    33483341
    3349                 // if preventDefault exists run it on the original event
     3342                // If preventDefault exists, run it on the original event
    33503343                if ( e.preventDefault ) {
    33513344                        e.preventDefault();
    33523345
    3353                 // otherwise set the returnValue property of the original event to false (IE)
     3346                // Support: IE
     3347                // Otherwise set the returnValue property of the original event to false
    33543348                } else {
    33553349                        e.returnValue = false;
    … …  
    33573351        },
    33583352        stopPropagation: function() {
     3353                var e = this.originalEvent;
     3354
    33593355                this.isPropagationStopped = returnTrue;
    3360 
    3361                 var e = this.originalEvent;
    33623356                if ( !e ) {
    33633357                        return;
    33643358                }
    3365                 // if stopPropagation exists run it on the original event
     3359                // If stopPropagation exists, run it on the original event
    33663360                if ( e.stopPropagation ) {
    33673361                        e.stopPropagation();
    33683362                }
    3369                 // otherwise set the cancelBubble property of the original event to true (IE)
     3363
     3364                // Support: IE
     3365                // Set the cancelBubble property of the original event to true
    33703366                e.cancelBubble = true;
    33713367        },
    … …  
    33733369                this.isImmediatePropagationStopped = returnTrue;
    33743370                this.stopPropagation();
    3375         },
    3376         isDefaultPrevented: returnFalse,
    3377         isPropagationStopped: returnFalse,
    3378         isImmediatePropagationStopped: returnFalse
     3371        }
    33793372};
    33803373
    … …  
    34213414                                var elem = e.target,
    34223415                                        form = jQuery.nodeName( elem, "input" ) || jQuery.nodeName( elem, "button" ) ? elem.form : undefined;
    3423                                 if ( form && !jQuery._data( form, "_submit_attached" ) ) {
     3416                                if ( form && !jQuery._data( form, "submitBubbles" ) ) {
    34243417                                        jQuery.event.add( form, "submit._submit", function( event ) {
    34253418                                                event._submit_bubble = true;
    34263419                                        });
    3427                                         jQuery._data( form, "_submit_attached", true );
     3420                                        jQuery._data( form, "submitBubbles", true );
    34283421                                }
    34293422                        });
    … …  
    34843477                                var elem = e.target;
    34853478
    3486                                 if ( rformElems.test( elem.nodeName ) && !jQuery._data( elem, "_change_attached" ) ) {
     3479                                if ( rformElems.test( elem.nodeName ) && !jQuery._data( elem, "changeBubbles" ) ) {
    34873480                                        jQuery.event.add( elem, "change._change", function( event ) {
    34883481                                                if ( this.parentNode && !event.isSimulated && !event.isTrigger ) {
    … …  
    34903483                                                }
    34913484                                        });
    3492                                         jQuery._data( elem, "_change_attached", true );
     3485                                        jQuery._data( elem, "changeBubbles", true );
    34933486                                }
    34943487                        });
    … …  
    35453538                if ( typeof types === "object" ) {
    35463539                        // ( types-Object, selector, data )
    3547                         if ( typeof selector !== "string" ) { // && selector != null
     3540                        if ( typeof selector !== "string" ) {
    35483541                                // ( types-Object, data )
    35493542                                data = data || selector;
    … …  
    36343627        },
    36353628
    3636         live: function( types, data, fn ) {
    3637                 jQuery( this.context ).on( types, this.selector, data, fn );
    3638                 return this;
    3639         },
    3640         die: function( types, fn ) {
    3641                 jQuery( this.context ).off( types, this.selector || "**", fn );
    3642                 return this;
    3643         },
    3644 
    36453629        delegate: function( selector, types, data, fn ) {
    36463630                return this.on( types, selector, data, fn );
    … …  
    36573641        },
    36583642        triggerHandler: function( type, data ) {
    3659                 if ( this[0] ) {
    3660                         return jQuery.event.trigger( type, data, this[0], true );
     3643                var elem = this[0];
     3644                if ( elem ) {
     3645                        return jQuery.event.trigger( type, data, elem, true );
    36613646                }
    36623647        },
    … …  
    37143699        sortOrder,
    37153700
     3701        // Instance-specific data
    37163702        expando = "sizzle" + -(new Date()),
    3717 
    3718         strundefined = typeof undefined,
    3719 
    3720         // Used in sorting
    3721         MAX_NEGATIVE = 1 << 31,
    37223703        preferredDoc = window.document,
    3723 
    3724         Token = String,
     3704        support = {},
    37253705        dirruns = 0,
    37263706        done = 0,
    3727         support = {},
     3707        classCache = createCache(),
     3708        tokenCache = createCache(),
     3709        compilerCache = createCache(),
     3710
     3711        // General-purpose constants
     3712        strundefined = typeof undefined,
     3713        MAX_NEGATIVE = 1 << 31,
    37283714
    37293715        // Array methods
    … …  
    37443730        },
    37453731
    3746         // Augment a function for special use by Sizzle
    3747         markFunction = function( fn, value ) {
    3748                 fn[ expando ] = value == null || value;
    3749                 return fn;
    3750         },
    3751 
    3752         createCache = function() {
    3753                 var cache = {},
    3754                         keys = [];
    3755 
    3756                 return markFunction(function( key, value ) {
    3757                         // Only keep the most recent entries
    3758                         if ( keys.push( key ) > Expr.cacheLength ) {
    3759                                 delete cache[ keys.shift() ];
    3760                         }
    3761 
    3762                         // Retrieve with (key + " ") to avoid collision with native Object.prototype properties (see Issue #157)
    3763                         return (cache[ key + " " ] = value);
    3764                 }, cache );
    3765         },
    3766 
    3767         classCache = createCache(),
    3768         tokenCache = createCache(),
    3769         compilerCache = createCache(),
    3770 
    3771         // Regex
     3732
     3733        // Regular expressions
    37723734
    37733735        // Whitespace characters http://www.w3.org/TR/css3-selectors/#whitespace
    … …  
    37773739
    37783740        // Loosely modeled on CSS identifier characters
    3779         // An unquoted value should be a CSS identifier (http://www.w3.org/TR/css3-selectors/#attribute-selectors)
     3741        // An unquoted value should be a CSS identifier http://www.w3.org/TR/css3-selectors/#attribute-selectors
    37803742        // Proper syntax: http://www.w3.org/TR/CSS21/syndata.html#value-def-identifier
    37813743        identifier = characterEncoding.replace( "w", "w#" ),
    … …  
    38003762        rcombinators = new RegExp( "^" + whitespace + "*([\\x20\\t\\r\\n\\f>+~])" + whitespace + "*" ),
    38013763        rpseudo = new RegExp( pseudos ),
    3802 
    3803         // Easily-parseable/retrievable ID or TAG or CLASS selectors
    3804         rquickExpr = /^(?:#([\w-]+)|(\w+)|\.([\w-]+))$/,
    3805 
    3806         rsibling = /[\x20\t\r\n\f]*[+~]/,
    3807 
    3808         rheader = /h\d/i,
    3809         rinputs = /input|select|textarea|button/i,
    3810 
    3811         rnative = /\{\s*\[native code\]\s*\}/,
    3812 
    3813         rbackslash = /\\(?!\\)/g,
    3814 
    3815         rescape = /'|\\/g,
    3816         rattributeQuotes = /\=[\x20\t\r\n\f]*([^'"\]]*)[\x20\t\r\n\f]*\]/g,
     3764        ridentifier = new RegExp( "^" + identifier + "$" ),
    38173765
    38183766        matchExpr = {
    … …  
    38323780        },
    38333781
    3834         /**
    3835          * For feature detection
    3836          * @param {Function} fn The function to test for native support
    3837          */
    3838         isNative = function( fn ) {
    3839                 return rnative.test( fn + "" );
    3840         },
    3841 
    3842         /**
    3843          * Support testing using an element
    3844          * @param {Function} fn Passed the created div and expects a boolean result
    3845          */
    3846         assert = function( fn ) {
    3847                 var div = document.createElement("div");
    3848 
    3849                 try {
    3850                         return fn( div );
    3851                 } catch (e) {
    3852                         return false;
    3853                 } finally {
    3854                         // release memory in IE
    3855                         div = null;
    3856                 }
     3782        rsibling = /[\x20\t\r\n\f]*[+~]/,
     3783
     3784        rnative = /\{\s*\[native code\]\s*\}/,
     3785
     3786        // Easily-parseable/retrievable ID or TAG or CLASS selectors
     3787        rquickExpr = /^(?:#([\w-]+)|(\w+)|\.([\w-]+))$/,
     3788
     3789        rinputs = /^(?:input|select|textarea|button)$/i,
     3790        rheader = /^h\d$/i,
     3791
     3792        rescape = /'|\\/g,
     3793        rattributeQuotes = /\=[\x20\t\r\n\f]*([^'"\]]*)[\x20\t\r\n\f]*\]/g,
     3794
     3795        // CSS escapes http://www.w3.org/TR/CSS21/syndata.html#escaped-characters
     3796        runescape = /\\([\da-fA-F]{1,6}[\x20\t\r\n\f]?|.)/g,
     3797        funescape = function( _, escaped ) {
     3798                var high = "0x" + escaped - 0x10000;
     3799                // NaN means non-codepoint
     3800                return high !== high ?
     3801                        escaped :
     3802                        // BMP codepoint
     3803                        high < 0 ?
     3804                                String.fromCharCode( high + 0x10000 ) :
     3805                                // Supplemental Plane codepoint (surrogate pair)
     3806                                String.fromCharCode( high >> 10 | 0xD800, high & 0x3FF | 0xDC00 );
    38573807        };
    38583808
    … …  
    38713821}
    38723822
     3823/**
     3824 * For feature detection
     3825 * @param {Function} fn The function to test for native support
     3826 */
     3827function isNative( fn ) {
     3828        return rnative.test( fn + "" );
     3829}
     3830
     3831/**
     3832 * Create key-value caches of limited size
     3833 * @returns {Function(string, Object)} Returns the Object data after storing it on itself with
     3834 *      property name the (space-suffixed) string and (if the cache is larger than Expr.cacheLength)
     3835 *      deleting the oldest entry
     3836 */
     3837function createCache() {
     3838        var cache,
     3839                keys = [];
     3840
     3841        return (cache = function( key, value ) {
     3842                // Use (key + " ") to avoid collision with native prototype properties (see Issue #157)
     3843                if ( keys.push( key += " " ) > Expr.cacheLength ) {
     3844                        // Only keep the most recent entries
     3845                        delete cache[ keys.shift() ];
     3846                }
     3847                return (cache[ key ] = value);
     3848        });
     3849}
     3850
     3851/**
     3852 * Mark a function for special use by Sizzle
     3853 * @param {Function} fn The function to mark
     3854 */
     3855function markFunction( fn ) {
     3856        fn[ expando ] = true;
     3857        return fn;
     3858}
     3859
     3860/**
     3861 * Support testing using an element
     3862 * @param {Function} fn Passed the created div and expects a boolean result
     3863 */
     3864function assert( fn ) {
     3865        var div = document.createElement("div");
     3866
     3867        try {
     3868                return fn( div );
     3869        } catch (e) {
     3870                return false;
     3871        } finally {
     3872                // release memory in IE
     3873                div = null;
     3874        }
     3875}
     3876
    38733877function Sizzle( selector, context, results, seed ) {
    38743878        var match, elem, m, nodeType,
    … …  
    38763880                i, groups, old, nid, newContext, newSelector;
    38773881
    3878         if ( context && (( context.ownerDocument || context ) !== document) ) {
     3882        if ( ( context ? context.ownerDocument || context : preferredDoc ) !== document ) {
    38793883                setDocument( context );
    38803884        }
    … …  
    39553959                                i = groups.length;
    39563960                                while ( i-- ) {
    3957                                         groups[i] = nid + groups[i].join("");
     3961                                        groups[i] = nid + toSelector( groups[i] );
    39583962                                }
    39593963                                newContext = rsibling.test( selector ) && context.parentNode || context;
    … …  
    39974001 * @returns {Object} Returns the current document
    39984002 */
    3999 setDocument = Sizzle.setDocument = function( doc ) {
    4000         doc = doc && doc.ownerDocument || doc || window.document;
     4003setDocument = Sizzle.setDocument = function( node ) {
     4004        var doc = node ? node.ownerDocument || node : preferredDoc;
    40014005
    40024006        // If no document and documentElement is available, return
    4003         if ( !doc || doc.nodeType !== 9 || !doc.documentElement || document === doc ) {
     4007        if ( doc === document || doc.nodeType !== 9 || !doc.documentElement ) {
    40044008                return document;
    40054009        }
    … …  
    40884092                };
    40894093                Expr.filter["ID"] = function( id ) {
    4090                         var attrId = id.replace( rbackslash, "" );
     4094                        var attrId = id.replace( runescape, funescape );
    40914095                        return function( elem ) {
    40924096                                return elem.getAttribute("id") === attrId;
    … …  
    41064110                };
    41074111                Expr.filter["ID"] =  function( id ) {
    4108                         var attrId = id.replace( rbackslash, "" );
     4112                        var attrId = id.replace( runescape, funescape );
    41094113                        return function( elem ) {
    41104114                                var node = typeof elem.getAttributeNode !== strundefined && elem.getAttributeNode("id");
    … …  
    41904194                assert(function( div ) {
    41914195
    4192                         // Opera 10-12/IE9 - ^= $= *= and empty values
     4196                        // Opera 10-12/IE8 - ^= $= *= and empty values
    41934197                        // Should not select anything
    4194                         div.innerHTML = "<p test=''></p>";
    4195                         if ( div.querySelectorAll("[test^='']").length ) {
     4198                        div.innerHTML = "<input type='hidden' i=''/>";
     4199                        if ( div.querySelectorAll("[i^='']").length ) {
    41964200                                rbuggyQSA.push( "[*^$]=" + whitespace + "*(?:\"\"|'')" );
    41974201                        }
    … …  
    41994203                        // FF 3.5 - :enabled/:disabled and hidden elements (hidden elements are still enabled)
    42004204                        // IE8 throws error here and will not see later tests
    4201                         div.innerHTML = "<input type='hidden'/>";
    42024205                        if ( !div.querySelectorAll(":enabled").length ) {
    42034206                                rbuggyQSA.push( ":enabled", ":disabled" );
    … …  
    42234226                        // This should fail with an exception
    42244227                        // Gecko does not error, returns false instead
    4225                         matches.call( div, "[test!='']:x" );
     4228                        matches.call( div, "[s!='']:x" );
    42264229                        rbuggyMatches.push( "!=", pseudos );
    42274230                });
    … …  
    43454348
    43464349Sizzle.matches = function( expr, elements ) {
    4347         return Sizzle( expr, window.document, null, elements );
     4350        return Sizzle( expr, null, null, elements );
    43484351};
    43494352
    43504353Sizzle.matchesSelector = function( elem, expr ) {
    43514354        // Set document vars if needed
    4352         if ( elem && (( elem.ownerDocument || elem ) !== document) ) {
     4355        if ( ( elem.ownerDocument || elem ) !== document ) {
    43534356                setDocument( elem );
    43544357        }
    … …  
    43774380Sizzle.contains = function( context, elem ) {
    43784381        // Set document vars if needed
    4379         if ( context && (( context.ownerDocument || context ) !== document) ) {
     4382        if ( ( context.ownerDocument || context ) !== document ) {
    43804383                setDocument( context );
    43814384        }
    … …  
    43874390
    43884391        // Set document vars if needed
    4389         if ( elem && (( elem.ownerDocument || elem ) !== document) ) {
     4392        if ( ( elem.ownerDocument || elem ) !== document ) {
    43904393                setDocument( elem );
    43914394        }
    … …  
    45364539        preFilter: {
    45374540                "ATTR": function( match ) {
    4538                         match[1] = match[1].replace( rbackslash, "" );
     4541                        match[1] = match[1].replace( runescape, funescape );
    45394542
    45404543                        // Move the given value to match[3] whether quoted or unquoted
    4541                         match[3] = ( match[4] || match[5] || "" ).replace( rbackslash, "" );
     4544                        match[3] = ( match[4] || match[5] || "" ).replace( runescape, funescape );
    45424545
    45434546                        if ( match[2] === "~=" ) {
    … …  
    46164619                        }
    46174620
    4618                         nodeName = nodeName.replace( rbackslash, "" ).toLowerCase();
     4621                        nodeName = nodeName.replace( runescape, funescape ).toLowerCase();
    46194622                        return function( elem ) {
    46204623                                return elem.nodeName && elem.nodeName.toLowerCase() === nodeName;
    … …  
    46234626
    46244627                "CLASS": function( className ) {
    4625                         var pattern = classCache[ expando ][ className + " " ];
     4628                        var pattern = classCache[ className + " " ];
    46264629
    46274630                        return pattern ||
    … …  
    48254828                }),
    48264829
     4830                // "Whether an element is represented by a :lang() selector
     4831                // is based solely on the element's language value
     4832                // being equal to the identifier C,
     4833                // or beginning with the identifier C immediately followed by "-".
     4834                // The matching of C against the element's language value is performed case-insensitively.
     4835                // The identifier C does not have to be a valid language name."
     4836                // http://www.w3.org/TR/selectors/#lang-pseudo
     4837                "lang": markFunction( function( lang ) {
     4838                        // lang value must be a valid identifider
     4839                        if ( !ridentifier.test(lang || "") ) {
     4840                                Sizzle.error( "unsupported lang: " + lang );
     4841                        }
     4842                        lang = lang.replace( runescape, funescape ).toLowerCase();
     4843                        return function( elem ) {
     4844                                var elemLang;
     4845                                do {
     4846                                        if ( (elemLang = documentIsXML ?
     4847                                                elem.getAttribute("xml:lang") || elem.getAttribute("lang") :
     4848                                                elem.lang) ) {
     4849
     4850                                                elemLang = elemLang.toLowerCase();
     4851                                                return elemLang === lang || elemLang.indexOf( lang + "-" ) === 0;
     4852                                        }
     4853                                } while ( (elem = elem.parentNode) && elem.nodeType === 1 );
     4854                                return false;
     4855                        };
     4856                }),
     4857
    48274858                // Miscellaneous
    48284859                "target": function( elem ) {
    … …  
    49654996        var matched, match, tokens, type,
    49664997                soFar, groups, preFilters,
    4967                 cached = tokenCache[ expando ][ selector + " " ];
     4998                cached = tokenCache[ selector + " " ];
    49684999
    49695000        if ( cached ) {
    … …  
    49905021                // Combinators
    49915022                if ( (match = rcombinators.exec( soFar )) ) {
    4992                         tokens.push( matched = new Token( match.shift() ) );
     5023                        matched = match.shift();
     5024                        tokens.push( {
     5025                                value: matched,
     5026                                // Cast descendant combinators to space
     5027                                type: match[0].replace( rtrim, " " )
     5028                        } );
    49935029                        soFar = soFar.slice( matched.length );
    4994 
    4995                         // Cast descendant combinators to space
    4996                         matched.type = match[0].replace( rtrim, " " );
    49975030                }
    49985031
    … …  
    50015034                        if ( (match = matchExpr[ type ].exec( soFar )) && (!preFilters[ type ] ||
    50025035                                (match = preFilters[ type ]( match ))) ) {
    5003 
    5004                                 tokens.push( matched = new Token( match.shift() ) );
     5036                                matched = match.shift();
     5037                                tokens.push( {
     5038                                        value: matched,
     5039                                        type: type,
     5040                                        matches: match
     5041                                } );
    50055042                                soFar = soFar.slice( matched.length );
    5006                                 matched.type = type;
    5007                                 matched.matches = match;
    50085043                        }
    50095044                }
    … …  
    50235058                        // Cache the tokens
    50245059                        tokenCache( selector, groups ).slice( 0 );
     5060}
     5061
     5062function toSelector( tokens ) {
     5063        var i = 0,
     5064                len = tokens.length,
     5065                selector = "";
     5066        for ( ; i < len; i++ ) {
     5067                selector += tokens[i].value;
     5068        }
     5069        return selector;
    50255070}
    50265071
    … …  
    52415286                                return setMatcher(
    52425287                                        i > 1 && elementMatcher( matchers ),
    5243                                         i > 1 && tokens.slice( 0, i - 1 ).join("").replace( rtrim, "$1" ),
     5288                                        i > 1 && toSelector( tokens.slice( 0, i - 1 ) ).replace( rtrim, "$1" ),
    52445289                                        matcher,
    52455290                                        i < j && matcherFromTokens( tokens.slice( i, j ) ),
    52465291                                        j < len && matcherFromTokens( (tokens = tokens.slice( j )) ),
    5247                                         j < len && tokens.join("")
     5292                                        j < len && toSelector( tokens )
    52485293                                );
    52495294                        }
    … …  
    53585403                setMatchers = [],
    53595404                elementMatchers = [],
    5360                 cached = compilerCache[ expando ][ selector + " " ];
     5405                cached = compilerCache[ selector + " " ];
    53615406
    53625407        if ( !cached ) {
    … …  
    54045449                                        Expr.relative[ tokens[1].type ] ) {
    54055450
    5406                                 context = Expr.find["ID"]( token.matches[0].replace( rbackslash, "" ), context )[0];
     5451                                context = Expr.find["ID"]( token.matches[0].replace( runescape, funescape ), context )[0];
    54075452                                if ( !context ) {
    54085453                                        return results;
    54095454                                }
    54105455
    5411                                 selector = selector.slice( tokens.shift().length );
     5456                                selector = selector.slice( tokens.shift().value.length );
    54125457                        }
    54135458
    … …  
    54235468                                        // Search, expanding context for leading sibling combinators
    54245469                                        if ( (seed = find(
    5425                                                 token.matches[0].replace( rbackslash, "" ),
     5470                                                token.matches[0].replace( runescape, funescape ),
    54265471                                                rsibling.test( tokens[0].type ) && context.parentNode || context
    54275472                                        )) ) {
    … …  
    54295474                                                // If seed is empty or no tokens remain, we can return early
    54305475                                                tokens.splice( i, 1 );
    5431                                                 selector = seed.length && tokens.join("");
     5476                                                selector = seed.length && toSelector( tokens );
    54325477                                                if ( !selector ) {
    54335478                                                        push.apply( results, slice.call( seed, 0 ) );
    … …  
    57815826        rscriptTypeMasked = /^true\/(.*)/,
    57825827        rcleanScript = /^\s*<!(?:\[CDATA\[|--)|(?:\]\]|--)>\s*$/g,
     5828
     5829        // We have to close these tags to support XHTML (#13200)
    57835830        wrapMap = {
    5784                 option: [ 1, "<select multiple='multiple'>" ],
    5785                 legend: [ 1, "<fieldset>" ],
    5786                 area: [ 1, "<map>" ],
    5787                 param: [ 1, "<object>" ],
    5788                 thead: [ 1, "<table>"  ],
    5789                 tr: [ 2, "<table><tbody>" ],
    5790                 col: [ 2, "<table><tbody></tbody><colgroup>", "</table>" ],
    5791                 td: [ 3, "<table><tbody><tr>" ],
     5831                option: [ 1, "<select multiple='multiple'>", "</select>" ],
     5832                legend: [ 1, "<fieldset>", "</fieldset>" ],
     5833                area: [ 1, "<map>", "</map>" ],
     5834                param: [ 1, "<object>", "</object>" ],
     5835                thead: [ 1, "<table>", "</table>" ],
     5836                tr: [ 2, "<table><tbody>", "</tbody></table>" ],
     5837                col: [ 2, "<table><tbody></tbody><colgroup>", "</colgroup></table>" ],
     5838                td: [ 3, "<table><tbody><tr>", "</tr></tbody></table>" ],
    57925839
    57935840                // IE6-8 can't serialize link, script, style, or any html5 (NoScope) tags,
    57945841                // unless wrapped in a div with non-breaking characters in front of it.
    5795                 _default: jQuery.support.htmlSerialize ? [ 0, "" ] : [ 1, "X<div>"  ]
     5842                _default: jQuery.support.htmlSerialize ? [ 0, "", "" ] : [ 1, "X<div>", "</div>"  ]
    57965843        },
    57975844        safeFragment = createSafeFragment( document ),
    … …  
    59445991                        while ( elem.firstChild ) {
    59455992                                elem.removeChild( elem.firstChild );
     5993                        }
     5994
     5995                        // If this is a select, ensure that it displays empty (#12336)
     5996                        // Support: IE<9
     5997                        if ( elem.options && jQuery.nodeName( elem, "select" ) ) {
     5998                                elem.options.length = 0;
    59465999                        }
    59476000                }
    … …  
    60396092                        i = 0,
    60406093                        l = this.length,
     6094                        set = this,
    60416095                        iNoClone = l - 1,
    60426096                        value = args[0],
    … …  
    60456099                // We can't cloneNode fragments that contain checked, in WebKit
    60466100                if ( isFunction || !( l <= 1 || typeof value !== "string" || jQuery.support.checkClone || !rchecked.test( value ) ) ) {
    6047                         return this.each(function() {
    6048                                 var self = jQuery( this );
     6101                        return this.each(function( index ) {
     6102                                var self = set.eq( index );
    60496103                                if ( isFunction ) {
    6050                                         args[0] = value.call( this, i, table ? self.html() : undefined );
     6104                                        args[0] = value.call( this, index, table ? self.html() : undefined );
    60516105                                }
    60526106                                self.domManip( args, table, callback );
    … …  
    60546108                }
    60556109
    6056                 if ( this[0] ) {
    6057                         doc = this[0].ownerDocument;
    6058                         fragment = doc.createDocumentFragment();
    6059                         jQuery.clean( args, doc, fragment, undefined, this );
     6110                if ( l ) {
     6111                        fragment = jQuery.buildFragment( args, this[ 0 ].ownerDocument, false, this );
    60606112                        first = fragment.firstChild;
    60616113
    … …  
    63026354}
    63036355
    6304 // Used in clean, fixes the defaultChecked property
     6356// Used in buildFragment, fixes the defaultChecked property
    63056357function fixDefaultChecked( elem ) {
    63066358        if ( manipulation_rcheckableType.test( elem.type ) ) {
    … …  
    63656417        },
    63666418
    6367         clean: function( elems, context, fragment, scripts, selection ) {
    6368                 var elem, i, j, tmp, tag, wrap, tbody,
    6369                         ret = [],
    6370                         safe = context === document && safeFragment;
    6371 
    6372                 // Ensure that context is a document
    6373                 if ( !context || typeof context.createDocumentFragment === "undefined" ) {
    6374                         context = document;
    6375                 }
    6376 
    6377                 for ( i = 0; (elem = elems[i]) != null; i++ ) {
     6419        buildFragment: function( elems, context, scripts, selection ) {
     6420                var contains, elem, tag, tmp, wrap, tbody, j,
     6421                        l = elems.length,
     6422
     6423                        // Ensure a safe fragment
     6424                        safe = createSafeFragment( context ),
     6425
     6426                        nodes = [],
     6427                        i = 0;
     6428
     6429                for ( ; i < l; i++ ) {
     6430                        elem = elems[ i ];
     6431
    63786432                        if ( elem || elem === 0 ) {
     6433
    63796434                                // Add nodes directly
    63806435                                if ( jQuery.type( elem ) === "object" ) {
    6381                                         jQuery.merge( ret, elem.nodeType ? [ elem ] : elem );
     6436                                        jQuery.merge( nodes, elem.nodeType ? [ elem ] : elem );
    63826437
    63836438                                // Convert non-html into a text node
    63846439                                } else if ( !rhtml.test( elem ) ) {
    6385                                         ret.push( context.createTextNode( elem ) );
     6440                                        nodes.push( context.createTextNode( elem ) );
    63866441
    63876442                                // Convert html into DOM nodes
    63886443                                } else {
    6389                                         // Ensure a safe container
    6390                                         safe = safe || createSafeFragment( context );
    63916444                                        tmp = tmp || safe.appendChild( context.createElement("div") );
    63926445
    … …  
    63946447                                        tag = ( rtagName.exec( elem ) || ["", ""] )[1].toLowerCase();
    63956448                                        wrap = wrapMap[ tag ] || wrapMap._default;
    6396                                         tmp.innerHTML = wrap[1] + elem.replace( rxhtmlTag, "<$1></$2>" ) + ( wrap[2] || "" );
     6449
     6450                                        tmp.innerHTML = wrap[1] + elem.replace( rxhtmlTag, "<$1></$2>" ) + wrap[2];
    63976451
    63986452                                        // Descend through wrappers to the right content
    … …  
    64046458                                        // Manually add leading whitespace removed by IE
    64056459                                        if ( !jQuery.support.leadingWhitespace && rleadingWhitespace.test( elem ) ) {
    6406                                                 ret.push( context.createTextNode( rleadingWhitespace.exec( elem )[0] ) );
     6460                                                nodes.push( context.createTextNode( rleadingWhitespace.exec( elem )[0] ) );
    64076461                                        }
    64086462
    … …  
    64276481                                        }
    64286482
    6429                                         jQuery.merge( ret, tmp.childNodes );
     6483                                        jQuery.merge( nodes, tmp.childNodes );
    64306484
    64316485                                        // Fix #12392 for WebKit and IE > 9
    … …  
    64436497                }
    64446498
    6445                 // Fix #11356: Clear elements from safeFragment
     6499                // Fix #11356: Clear elements from fragment
    64466500                if ( tmp ) {
    64476501                        safe.removeChild( tmp );
    … …  
    64516505                // about to be appended to the DOM in IE 6/7 (#8060)
    64526506                if ( !jQuery.support.appendChecked ) {
    6453                         jQuery.grep( getAll( ret, "input" ), fixDefaultChecked );
    6454                 }
    6455 
    6456                 if ( fragment ) {
    6457                         for ( i = 0; (elem = ret[i]) != null; i++ ) {
    6458                                 safe = jQuery.contains( elem.ownerDocument, elem );
    6459 
    6460                                 // Append to fragment
    6461                                 // #4087 - If origin and destination elements are the same, and this is
    6462                                 // that element, do not append to fragment
    6463                                 if ( !selection || jQuery.inArray( elem, selection ) === -1 ) {
    6464                                         fragment.appendChild( elem );
    6465                                 }
    6466                                 tmp = getAll( elem, "script" );
    6467 
    6468                                 // Preserve script evaluation history
    6469                                 if ( safe ) {
    6470                                         setGlobalEval( tmp );
    6471                                 }
    6472 
    6473                                 // Capture executables
    6474                                 if ( scripts ) {
    6475                                         for ( j = 0; (elem = tmp[j]) != null; j++ ) {
    6476                                                 if ( rscriptType.test( elem.type || "" ) ) {
    6477                                                         scripts.push( elem );
    6478                                                 }
     6507                        jQuery.grep( getAll( nodes, "input" ), fixDefaultChecked );
     6508                }
     6509
     6510                i = 0;
     6511                while ( (elem = nodes[ i++ ]) ) {
     6512
     6513                        // #4087 - If origin and destination elements are the same, and this is
     6514                        // that element, do not do anything
     6515                        if ( selection && jQuery.inArray( elem, selection ) !== -1 ) {
     6516                                continue;
     6517                        }
     6518
     6519                        contains = jQuery.contains( elem.ownerDocument, elem );
     6520
     6521                        // Append to fragment
     6522                        tmp = getAll( safe.appendChild( elem ), "script" );
     6523
     6524                        // Preserve script evaluation history
     6525                        if ( contains ) {
     6526                                setGlobalEval( tmp );
     6527                        }
     6528
     6529                        // Capture executables
     6530                        if ( scripts ) {
     6531                                j = 0;
     6532                                while ( (elem = tmp[ j++ ]) ) {
     6533                                        if ( rscriptType.test( elem.type || "" ) ) {
     6534                                                scripts.push( elem );
    64796535                                        }
    64806536                                }
    … …  
    64826538                }
    64836539
    6484                 elem = tmp = safe = null;
    6485 
    6486                 return ret;
     6540                tmp = null;
     6541
     6542                return safe;
    64876543        },
    64886544
    … …  
    65266582                                                        delete elem[ internalKey ];
    65276583
    6528                                                 } else if ( elem.removeAttribute ) {
     6584                                                } else if ( typeof elem.removeAttribute !== "undefined" ) {
    65296585                                                        elem.removeAttribute( internalKey );
    65306586
    … …  
    67556811                        // Fixes #8908, it can be done more correctly by specifing setters in cssHooks,
    67566812                        // but it would mean to define eight (for every problematic property) identical functions
    6757                         if ( value === "" && name.indexOf("background") === 0 ) {
    6758                                 value = " ";
     6813                        if ( !jQuery.support.clearCloneStyle && value === "" && name.indexOf("background") === 0 ) {
     6814                                style[ name ] = "inherit";
    67596815                        }
    67606816
    … …  
    73107366        ajaxLocParts,
    73117367        ajaxLocation,
    7312 
     7368       
    73137369        ajax_nonce = jQuery.now(),
    73147370
    … …  
    86108666function Animation( elem, properties, options ) {
    86118667        var result,
     8668                stopped,
    86128669                index = 0,
    86138670                length = animationPrefilters.length,
    … …  
    86178674                }),
    86188675                tick = function() {
     8676                        if ( stopped ) {
     8677                                return false;
     8678                        }
    86198679                        var currentTime = fxNow || createFxNow(),
    86208680                                remaining = Math.max( 0, animation.startTime + animation.duration - currentTime ),
    … …  
    86588718                                        // otherwise we skip this part
    86598719                                        length = gotoEnd ? animation.tweens.length : 0;
    8660 
     8720                                if ( stopped ) {
     8721                                        return this;
     8722                                }
     8723                                stopped = true;
    86618724                                for ( ; index < length ; index++ ) {
    86628725                                        animation.tweens[ index ].run( 1 );
    … …  
    86928755        jQuery.fx.timer(
    86938756                jQuery.extend( tick, {
     8757                        elem: elem,
    86948758                        anim: animation,
    8695                         queue: animation.opts.queue,
    8696                         elem: elem
     8759                        queue: animation.opts.queue
    86978760                })
    86988761        );
    … …  
    90159078                                // Operate on a copy of prop so per-property easing won't be lost
    90169079                                var anim = Animation( this, jQuery.extend( {}, prop ), optall );
    9017 
    9018                                 // Empty animations resolve immediately
    9019                                 if ( empty ) {
     9080                                doAnimation.finish = function() {
    90209081                                        anim.stop( true );
     9082                                };
     9083                                // Empty animations, or finishing resolves immediately
     9084                                if ( empty || jQuery._data( this, "finish" ) ) {
     9085                                        anim.stop( true );
    90219086                                }
    90229087                        };
     9088                        doAnimation.finish = doAnimation;
    90239089
    90249090                return empty || optall.queue === false ?
    … …  
    90749140                                jQuery.dequeue( this, type );
    90759141                        }
     9142                });
     9143        },
     9144        finish: function( type ) {
     9145                if ( type !== false ) {
     9146                        type = type || "fx";
     9147                }
     9148                return this.each(function() {
     9149                        var index,
     9150                                data = jQuery._data( this ),
     9151                                queue = data[ type + "queue" ],
     9152                                hooks = data[ type + "queueHooks" ],
     9153                                timers = jQuery.timers,
     9154                                length = queue ? queue.length : 0;
     9155
     9156                        // enable finishing flag on private data
     9157                        data.finish = true;
     9158
     9159                        // empty the queue first
     9160                        jQuery.queue( this, type, [] );
     9161
     9162                        if ( hooks && hooks.cur && hooks.cur.finish ) {
     9163                                hooks.cur.finish.call( this );
     9164                        }
     9165
     9166                        // look for any active animations, and finish them
     9167                        for ( index = timers.length; index--; ) {
     9168                                if ( timers[ index ].elem === this && timers[ index ].queue === type ) {
     9169                                        timers[ index ].anim.stop( true );
     9170                                        timers.splice( index, 1 );
     9171                                }
     9172                        }
     9173
     9174                        // look for any animations in the old queue and finish them
     9175                        for ( index = 0; index < length; index++ ) {
     9176                                if ( queue[ index ] && queue[ index ].finish ) {
     9177                                        queue[ index ].finish.call( this );
     9178                                }
     9179                        }
     9180
     9181                        // turn off finishing flag
     9182                        delete data.finish;
    90769183                });
    90779184        }
  • trunk/wp-includes/script-loader.php

    r23220 r23301  
    127127        // jQuery
    128128        $scripts->add( 'jquery', false, array( 'jquery-core', 'jquery-migrate' ) );
    129         $scripts->add( 'jquery-core', '/wp-includes/js/jquery/jquery.js', array(), '1.9.0b1' );
    130         $scripts->add( 'jquery-migrate', '/wp-includes/js/jquery/jquery-migrate.js', array(), '1.0.0b1' );
     129        $scripts->add( 'jquery-core', '/wp-includes/js/jquery/jquery.js', array(), '1.9.0' );
     130        $scripts->add( 'jquery-migrate', '/wp-includes/js/jquery/jquery-migrate.js', array(), '1.0.0' );
    131131
    132132        // full jQuery UI
Note: See TracChangeset for help on using the changeset viewer.