jquery-rails 2.2.0 → 2.2.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1,4 +1,9 @@
1
- ## 2.2.0 (19 January 2012)
1
+ ## 2.2.1 (08 February 2013)
2
+
3
+ - Updated to jQuery 1.9.1
4
+ - Updated to latest jquery-ujs
5
+
6
+ ## 2.2.0 (19 January 2013)
2
7
 
3
8
  - Updated to jQuery 1.9.0
4
9
  - Updated to latest jquery-ujs
data/README.md CHANGED
@@ -4,7 +4,7 @@ jQuery! For Rails! So great.
4
4
 
5
5
  This gem provides:
6
6
 
7
- * jQuery 1.9.0
7
+ * jQuery 1.9.1
8
8
  * jQuery UI 1.9.2 (javascript only)
9
9
  * the jQuery UJS adapter
10
10
  * assert_select_jquery to test jQuery responses in Ruby tests
@@ -20,6 +20,9 @@ minor version bump = minor-level updates to jquery
20
20
  major version bump = major-level updates to jquery and updates to rails which may be backwards-incompatible
21
21
  ```
22
22
 
23
+ See CHANGELOG.md to see which versions of jquery-rails bundle which
24
+ versions of jQuery.
25
+
23
26
  ## Installation
24
27
 
25
28
  Apps generated with Rails 3.1 or later include jquery-rails in the Gemfile by default. So just make a new app:
@@ -10,6 +10,7 @@ Gem::Specification.new do |s|
10
10
  s.homepage = "http://rubygems.org/gems/jquery-rails"
11
11
  s.summary = "Use jQuery with Rails 3"
12
12
  s.description = "This gem provides jQuery and the jQuery-ujs driver for your Rails 3 application."
13
+ s.license = "MIT"
13
14
 
14
15
  s.required_rubygems_version = ">= 1.3.6"
15
16
  s.rubyforge_project = "jquery-rails"
@@ -1,8 +1,8 @@
1
1
  module Jquery
2
2
  module Rails
3
- VERSION = "2.2.0"
4
- JQUERY_VERSION = "1.8.3"
3
+ VERSION = "2.2.1"
4
+ JQUERY_VERSION = "1.9.1"
5
5
  JQUERY_UI_VERSION = "1.9.2"
6
- JQUERY_UJS_VERSION = "bddff6a677edc54f00e48bde740b0b22d68deef6"
6
+ JQUERY_UJS_VERSION = "aab2251d90afbdfc808d8031312d063b1ccf8f6f"
7
7
  end
8
8
  end
@@ -1,5 +1,5 @@
1
1
  /*!
2
- * jQuery JavaScript Library v1.9.0
2
+ * jQuery JavaScript Library v1.9.1
3
3
  * http://jquery.com/
4
4
  *
5
5
  * Includes Sizzle.js
@@ -9,16 +9,25 @@
9
9
  * Released under the MIT license
10
10
  * http://jquery.org/license
11
11
  *
12
- * Date: 2013-1-14
12
+ * Date: 2013-2-4
13
13
  */
14
14
  (function( window, undefined ) {
15
- "use strict";
15
+
16
+ // Can't do this because several apps including ASP.NET trace
17
+ // the stack via arguments.caller.callee and Firefox dies if
18
+ // you try to trace through "use strict" call chains. (#13335)
19
+ // Support: Firefox 18+
20
+ //"use strict";
16
21
  var
22
+ // The deferred used on DOM ready
23
+ readyList,
24
+
17
25
  // A central reference to the root jQuery(document)
18
26
  rootjQuery,
19
27
 
20
- // The deferred used on DOM ready
21
- readyList,
28
+ // Support: IE<9
29
+ // For `typeof node.method` instead of `node.method !== undefined`
30
+ core_strundefined = typeof undefined,
22
31
 
23
32
  // Use the correct document accordingly with window argument (sandbox)
24
33
  document = window.document,
@@ -36,7 +45,7 @@ var
36
45
  // List of deleted data cache ids, so we can reuse them
37
46
  core_deletedIds = [],
38
47
 
39
- core_version = "1.9.0",
48
+ core_version = "1.9.1",
40
49
 
41
50
  // Save a reference to some core methods
42
51
  core_concat = core_deletedIds.concat,
@@ -85,17 +94,25 @@ var
85
94
  return letter.toUpperCase();
86
95
  },
87
96
 
88
- // The ready event handler and self cleanup method
89
- DOMContentLoaded = function() {
90
- if ( document.addEventListener ) {
91
- document.removeEventListener( "DOMContentLoaded", DOMContentLoaded, false );
92
- jQuery.ready();
93
- } else if ( document.readyState === "complete" ) {
94
- // we're here because readyState === "complete" in oldIE
95
- // which is good enough for us to call the dom ready!
96
- document.detachEvent( "onreadystatechange", DOMContentLoaded );
97
+ // The ready event handler
98
+ completed = function( event ) {
99
+
100
+ // readyState === "complete" is good enough for us to call the dom ready in oldIE
101
+ if ( document.addEventListener || event.type === "load" || document.readyState === "complete" ) {
102
+ detach();
97
103
  jQuery.ready();
98
104
  }
105
+ },
106
+ // Clean-up method for dom ready events
107
+ detach = function() {
108
+ if ( document.addEventListener ) {
109
+ document.removeEventListener( "DOMContentLoaded", completed, false );
110
+ window.removeEventListener( "load", completed, false );
111
+
112
+ } else {
113
+ document.detachEvent( "onreadystatechange", completed );
114
+ window.detachEvent( "onload", completed );
115
+ }
99
116
  };
100
117
 
101
118
  jQuery.fn = jQuery.prototype = {
@@ -299,7 +316,7 @@ jQuery.fn = jQuery.prototype = {
299
316
  jQuery.fn.init.prototype = jQuery.fn;
300
317
 
301
318
  jQuery.extend = jQuery.fn.extend = function() {
302
- var options, name, src, copy, copyIsArray, clone,
319
+ var src, copyIsArray, copy, name, options, clone,
303
320
  target = arguments[0] || {},
304
321
  i = 1,
305
322
  length = arguments.length,
@@ -781,7 +798,7 @@ jQuery.extend({
781
798
  // Bind a function to a context, optionally partially applying any
782
799
  // arguments.
783
800
  proxy: function( fn, context ) {
784
- var tmp, args, proxy;
801
+ var args, proxy, tmp;
785
802
 
786
803
  if ( typeof context === "string" ) {
787
804
  tmp = fn[ context ];
@@ -880,18 +897,18 @@ jQuery.ready.promise = function( obj ) {
880
897
  // Standards-based browsers support DOMContentLoaded
881
898
  } else if ( document.addEventListener ) {
882
899
  // Use the handy event callback
883
- document.addEventListener( "DOMContentLoaded", DOMContentLoaded, false );
900
+ document.addEventListener( "DOMContentLoaded", completed, false );
884
901
 
885
902
  // A fallback to window.onload, that will always work
886
- window.addEventListener( "load", jQuery.ready, false );
903
+ window.addEventListener( "load", completed, false );
887
904
 
888
905
  // If IE event model is used
889
906
  } else {
890
907
  // Ensure firing before onload, maybe late but safe also for iframes
891
- document.attachEvent( "onreadystatechange", DOMContentLoaded );
908
+ document.attachEvent( "onreadystatechange", completed );
892
909
 
893
910
  // A fallback to window.onload, that will always work
894
- window.attachEvent( "onload", jQuery.ready );
911
+ window.attachEvent( "onload", completed );
895
912
 
896
913
  // If IE and not a frame
897
914
  // continually check to see if the document is ready
@@ -913,6 +930,9 @@ jQuery.ready.promise = function( obj ) {
913
930
  return setTimeout( doScrollCheck, 50 );
914
931
  }
915
932
 
933
+ // detach all dom ready events
934
+ detach();
935
+
916
936
  // and execute any waiting functions
917
937
  jQuery.ready();
918
938
  }
@@ -989,18 +1009,18 @@ jQuery.Callbacks = function( options ) {
989
1009
  ( optionsCache[ options ] || createOptions( options ) ) :
990
1010
  jQuery.extend( {}, options );
991
1011
 
992
- var // Last fire value (for non-forgettable lists)
1012
+ var // Flag to know if list is currently firing
1013
+ firing,
1014
+ // Last fire value (for non-forgettable lists)
993
1015
  memory,
994
1016
  // Flag to know if list was already fired
995
1017
  fired,
996
- // Flag to know if list is currently firing
997
- firing,
998
- // First callback to fire (used internally by add and fireWith)
999
- firingStart,
1000
1018
  // End of the loop when firing
1001
1019
  firingLength,
1002
1020
  // Index of currently firing callback (modified by remove if needed)
1003
1021
  firingIndex,
1022
+ // First callback to fire (used internally by add and fireWith)
1023
+ firingStart,
1004
1024
  // Actual callback list
1005
1025
  list = [],
1006
1026
  // Stack of fire calls for repeatable lists
@@ -1086,9 +1106,10 @@ jQuery.Callbacks = function( options ) {
1086
1106
  }
1087
1107
  return this;
1088
1108
  },
1089
- // Control if a given callback is in the list
1109
+ // Check if a given callback is in the list.
1110
+ // If no argument is given, return whether or not list has callbacks attached.
1090
1111
  has: function( fn ) {
1091
- return jQuery.inArray( fn, list ) > -1;
1112
+ return fn ? jQuery.inArray( fn, list ) > -1 : !!( list && list.length );
1092
1113
  },
1093
1114
  // Remove all callbacks from the list
1094
1115
  empty: function() {
@@ -1285,7 +1306,9 @@ jQuery.extend({
1285
1306
  });
1286
1307
  jQuery.support = (function() {
1287
1308
 
1288
- var support, all, a, select, opt, input, fragment, eventName, isSupported, i,
1309
+ var support, all, a,
1310
+ input, select, fragment,
1311
+ opt, eventName, isSupported, i,
1289
1312
  div = document.createElement("div");
1290
1313
 
1291
1314
  // Setup
@@ -1486,7 +1509,7 @@ jQuery.support = (function() {
1486
1509
  !parseFloat( ( window.getComputedStyle( marginDiv, null ) || {} ).marginRight );
1487
1510
  }
1488
1511
 
1489
- if ( typeof div.style.zoom !== "undefined" ) {
1512
+ if ( typeof div.style.zoom !== core_strundefined ) {
1490
1513
  // Support: IE<8
1491
1514
  // Check if natively block-level elements act like inline-block
1492
1515
  // elements when setting their display to 'inline' and giving
@@ -1502,9 +1525,12 @@ jQuery.support = (function() {
1502
1525
  div.firstChild.style.width = "5px";
1503
1526
  support.shrinkWrapBlocks = ( div.offsetWidth !== 3 );
1504
1527
 
1505
- // Prevent IE 6 from affecting layout for positioned elements #11048
1506
- // Prevent IE from shrinking the body in IE 7 mode #12869
1507
- body.style.zoom = 1;
1528
+ if ( support.inlineBlockNeedsLayout ) {
1529
+ // Prevent IE 6 from affecting layout for positioned elements #11048
1530
+ // Prevent IE from shrinking the body in IE 7 mode #12869
1531
+ // Support: IE<8
1532
+ body.style.zoom = 1;
1533
+ }
1508
1534
  }
1509
1535
 
1510
1536
  body.removeChild( container );
@@ -1521,7 +1547,7 @@ jQuery.support = (function() {
1521
1547
 
1522
1548
  var rbrace = /(?:\{[\s\S]*\}|\[[\s\S]*\])$/,
1523
1549
  rmultiDash = /([A-Z])/g;
1524
-
1550
+
1525
1551
  function internalData( elem, name, data, pvt /* Internal Use Only */ ){
1526
1552
  if ( !jQuery.acceptData( elem ) ) {
1527
1553
  return;
@@ -1616,13 +1642,12 @@ function internalData( elem, name, data, pvt /* Internal Use Only */ ){
1616
1642
  return ret;
1617
1643
  }
1618
1644
 
1619
- function internalRemoveData( elem, name, pvt /* For internal use only */ ){
1645
+ function internalRemoveData( elem, name, pvt ) {
1620
1646
  if ( !jQuery.acceptData( elem ) ) {
1621
1647
  return;
1622
1648
  }
1623
1649
 
1624
- var thisCache, i, l,
1625
-
1650
+ var i, l, thisCache,
1626
1651
  isNode = elem.nodeType,
1627
1652
 
1628
1653
  // See jQuery.data for more information
@@ -1726,24 +1751,29 @@ jQuery.extend({
1726
1751
  },
1727
1752
 
1728
1753
  data: function( elem, name, data ) {
1729
- return internalData( elem, name, data, false );
1754
+ return internalData( elem, name, data );
1730
1755
  },
1731
1756
 
1732
1757
  removeData: function( elem, name ) {
1733
- return internalRemoveData( elem, name, false );
1758
+ return internalRemoveData( elem, name );
1734
1759
  },
1735
1760
 
1736
1761
  // For internal use only.
1737
1762
  _data: function( elem, name, data ) {
1738
1763
  return internalData( elem, name, data, true );
1739
1764
  },
1740
-
1765
+
1741
1766
  _removeData: function( elem, name ) {
1742
1767
  return internalRemoveData( elem, name, true );
1743
1768
  },
1744
1769
 
1745
1770
  // A method for determining if a DOM node can handle the data expando
1746
1771
  acceptData: function( elem ) {
1772
+ // Do not set data on non-element because it will not be cleared (#8335).
1773
+ if ( elem.nodeType && elem.nodeType !== 1 && elem.nodeType !== 9 ) {
1774
+ return false;
1775
+ }
1776
+
1747
1777
  var noData = elem.nodeName && jQuery.noData[ elem.nodeName.toLowerCase() ];
1748
1778
 
1749
1779
  // nodes accept data unless otherwise specified; rejection can be conditional
@@ -1769,7 +1799,7 @@ jQuery.fn.extend({
1769
1799
  name = attrs[i].name;
1770
1800
 
1771
1801
  if ( !name.indexOf( "data-" ) ) {
1772
- name = jQuery.camelCase( name.substring(5) );
1802
+ name = jQuery.camelCase( name.slice(5) );
1773
1803
 
1774
1804
  dataAttr( elem, name, data[ name ] );
1775
1805
  }
@@ -1820,12 +1850,12 @@ function dataAttr( elem, key, data ) {
1820
1850
  if ( typeof data === "string" ) {
1821
1851
  try {
1822
1852
  data = data === "true" ? true :
1823
- data === "false" ? false :
1824
- data === "null" ? null :
1825
- // Only convert to a number if it doesn't change the string
1826
- +data + "" === data ? +data :
1827
- rbrace.test( data ) ? jQuery.parseJSON( data ) :
1828
- data;
1853
+ data === "false" ? false :
1854
+ data === "null" ? null :
1855
+ // Only convert to a number if it doesn't change the string
1856
+ +data + "" === data ? +data :
1857
+ rbrace.test( data ) ? jQuery.parseJSON( data ) :
1858
+ data;
1829
1859
  } catch( e ) {}
1830
1860
 
1831
1861
  // Make sure we set the data so it isn't changed later
@@ -2141,7 +2171,7 @@ jQuery.fn.extend({
2141
2171
  }
2142
2172
 
2143
2173
  // Toggle whole class name
2144
- } else if ( type === "undefined" || type === "boolean" ) {
2174
+ } else if ( type === core_strundefined || type === "boolean" ) {
2145
2175
  if ( this.className ) {
2146
2176
  // store className if set
2147
2177
  jQuery._data( this, "__className__", this.className );
@@ -2170,7 +2200,7 @@ jQuery.fn.extend({
2170
2200
  },
2171
2201
 
2172
2202
  val: function( value ) {
2173
- var hooks, ret, isFunction,
2203
+ var ret, hooks, isFunction,
2174
2204
  elem = this[0];
2175
2205
 
2176
2206
  if ( !arguments.length ) {
@@ -2294,7 +2324,7 @@ jQuery.extend({
2294
2324
  },
2295
2325
 
2296
2326
  attr: function( elem, name, value ) {
2297
- var ret, hooks, notxml,
2327
+ var hooks, notxml, ret,
2298
2328
  nType = elem.nodeType;
2299
2329
 
2300
2330
  // don't get/set attributes on text, comment and attribute nodes
@@ -2303,7 +2333,7 @@ jQuery.extend({
2303
2333
  }
2304
2334
 
2305
2335
  // Fallback to prop when attributes are not supported
2306
- if ( typeof elem.getAttribute === "undefined" ) {
2336
+ if ( typeof elem.getAttribute === core_strundefined ) {
2307
2337
  return jQuery.prop( elem, name, value );
2308
2338
  }
2309
2339
 
@@ -2336,7 +2366,7 @@ jQuery.extend({
2336
2366
 
2337
2367
  // In IE9+, Flash objects don't have .getAttribute (#12945)
2338
2368
  // Support: IE9+
2339
- if ( typeof elem.getAttribute !== "undefined" ) {
2369
+ if ( typeof elem.getAttribute !== core_strundefined ) {
2340
2370
  ret = elem.getAttribute( name );
2341
2371
  }
2342
2372
 
@@ -2686,13 +2716,12 @@ jQuery.event = {
2686
2716
  global: {},
2687
2717
 
2688
2718
  add: function( elem, types, handler, data, selector ) {
2719
+ var tmp, events, t, handleObjIn,
2720
+ special, eventHandle, handleObj,
2721
+ handlers, type, namespaces, origType,
2722
+ elemData = jQuery._data( elem );
2689
2723
 
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
-
2724
+ // Don't attach events to noData or text/comment nodes (but allow plain objects)
2696
2725
  if ( !elemData ) {
2697
2726
  return;
2698
2727
  }
@@ -2717,7 +2746,7 @@ jQuery.event = {
2717
2746
  eventHandle = elemData.handle = function( e ) {
2718
2747
  // Discard the second event of a jQuery.event.trigger() and
2719
2748
  // when an event is called after a page has unloaded
2720
- return typeof jQuery !== "undefined" && (!e || jQuery.event.triggered !== e.type) ?
2749
+ return typeof jQuery !== core_strundefined && (!e || jQuery.event.triggered !== e.type) ?
2721
2750
  jQuery.event.dispatch.apply( eventHandle.elem, arguments ) :
2722
2751
  undefined;
2723
2752
  };
@@ -2797,10 +2826,10 @@ jQuery.event = {
2797
2826
 
2798
2827
  // Detach an event or set of events from an element
2799
2828
  remove: function( elem, types, handler, selector, mappedTypes ) {
2800
-
2801
- var j, origCount, tmp,
2802
- events, t, handleObj,
2803
- special, handlers, type, namespaces, origType,
2829
+ var j, handleObj, tmp,
2830
+ origCount, t, events,
2831
+ special, handlers, type,
2832
+ namespaces, origType,
2804
2833
  elemData = jQuery.hasData( elem ) && jQuery._data( elem );
2805
2834
 
2806
2835
  if ( !elemData || !(events = elemData.events) ) {
@@ -2870,11 +2899,11 @@ jQuery.event = {
2870
2899
  },
2871
2900
 
2872
2901
  trigger: function( event, data, elem, onlyHandlers ) {
2873
-
2874
- var i, cur, tmp, bubbleType, ontype, handle, special,
2902
+ var handle, ontype, cur,
2903
+ bubbleType, special, tmp, i,
2875
2904
  eventPath = [ elem || document ],
2876
- type = event.type || event,
2877
- namespaces = event.namespace ? event.namespace.split(".") : [];
2905
+ type = core_hasOwn.call( event, "type" ) ? event.type : event,
2906
+ namespaces = core_hasOwn.call( event, "namespace" ) ? event.namespace.split(".") : [];
2878
2907
 
2879
2908
  cur = tmp = elem = elem || document;
2880
2909
 
@@ -3008,7 +3037,7 @@ jQuery.event = {
3008
3037
  // Make a writable jQuery.Event from the native event object
3009
3038
  event = jQuery.event.fix( event );
3010
3039
 
3011
- var i, j, ret, matched, handleObj,
3040
+ var i, ret, handleObj, matched, j,
3012
3041
  handlerQueue = [],
3013
3042
  args = core_slice.call( arguments ),
3014
3043
  handlers = ( jQuery._data( this, "events" ) || {} )[ event.type ] || [],
@@ -3063,7 +3092,7 @@ jQuery.event = {
3063
3092
  },
3064
3093
 
3065
3094
  handlers: function( event, handlers ) {
3066
- var i, matches, sel, handleObj,
3095
+ var sel, handleObj, matches, i,
3067
3096
  handlerQueue = [],
3068
3097
  delegateCount = handlers.delegateCount,
3069
3098
  cur = event.target;
@@ -3075,8 +3104,9 @@ jQuery.event = {
3075
3104
 
3076
3105
  for ( ; cur != this; cur = cur.parentNode || this ) {
3077
3106
 
3107
+ // Don't check non-elements (#13208)
3078
3108
  // Don't process clicks on disabled elements (#6911, #8165, #11382, #11764)
3079
- if ( cur.disabled !== true || event.type !== "click" ) {
3109
+ if ( cur.nodeType === 1 && (cur.disabled !== true || event.type !== "click") ) {
3080
3110
  matches = [];
3081
3111
  for ( i = 0; i < delegateCount; i++ ) {
3082
3112
  handleObj = handlers[ i ];
@@ -3114,10 +3144,18 @@ jQuery.event = {
3114
3144
  }
3115
3145
 
3116
3146
  // Create a writable copy of the event object and normalize some properties
3117
- var i, prop,
3147
+ var i, prop, copy,
3148
+ type = event.type,
3118
3149
  originalEvent = event,
3119
- fixHook = jQuery.event.fixHooks[ event.type ] || {},
3120
- copy = fixHook.props ? this.props.concat( fixHook.props ) : this.props;
3150
+ fixHook = this.fixHooks[ type ];
3151
+
3152
+ if ( !fixHook ) {
3153
+ this.fixHooks[ type ] = fixHook =
3154
+ rmouseEvent.test( type ) ? this.mouseHooks :
3155
+ rkeyEvent.test( type ) ? this.keyHooks :
3156
+ {};
3157
+ }
3158
+ copy = fixHook.props ? this.props.concat( fixHook.props ) : this.props;
3121
3159
 
3122
3160
  event = new jQuery.Event( originalEvent );
3123
3161
 
@@ -3167,7 +3205,7 @@ jQuery.event = {
3167
3205
  mouseHooks: {
3168
3206
  props: "button buttons clientX clientY fromElement offsetX offsetY pageX pageY screenX screenY toElement".split(" "),
3169
3207
  filter: function( event, original ) {
3170
- var eventDoc, doc, body,
3208
+ var body, eventDoc, doc,
3171
3209
  button = original.button,
3172
3210
  fromElement = original.fromElement;
3173
3211
 
@@ -3283,7 +3321,7 @@ jQuery.removeEvent = document.removeEventListener ?
3283
3321
 
3284
3322
  // #8545, #7054, preventing memory leaks for custom events in IE6-8
3285
3323
  // detachEvent needed property on element, by name of that event, to properly expose it to GC
3286
- if ( typeof elem[ name ] === "undefined" ) {
3324
+ if ( typeof elem[ name ] === core_strundefined ) {
3287
3325
  elem[ name ] = null;
3288
3326
  }
3289
3327
 
@@ -3532,7 +3570,7 @@ if ( !jQuery.support.focusinBubbles ) {
3532
3570
  jQuery.fn.extend({
3533
3571
 
3534
3572
  on: function( types, selector, data, fn, /*INTERNAL*/ one ) {
3535
- var origFn, type;
3573
+ var type, origFn;
3536
3574
 
3537
3575
  // Types can be a map of types/handlers
3538
3576
  if ( typeof types === "object" ) {
@@ -3644,30 +3682,6 @@ jQuery.fn.extend({
3644
3682
  if ( elem ) {
3645
3683
  return jQuery.event.trigger( type, data, elem, true );
3646
3684
  }
3647
- },
3648
-
3649
- hover: function( fnOver, fnOut ) {
3650
- return this.mouseenter( fnOver ).mouseleave( fnOut || fnOver );
3651
- }
3652
- });
3653
-
3654
- jQuery.each( ("blur focus focusin focusout load resize scroll unload click dblclick " +
3655
- "mousedown mouseup mousemove mouseover mouseout mouseenter mouseleave " +
3656
- "change select submit keydown keypress keyup error contextmenu").split(" "), function( i, name ) {
3657
-
3658
- // Handle event binding
3659
- jQuery.fn[ name ] = function( data, fn ) {
3660
- return arguments.length > 0 ?
3661
- this.on( name, null, data, fn ) :
3662
- this.trigger( name );
3663
- };
3664
-
3665
- if ( rkeyEvent.test( name ) ) {
3666
- jQuery.event.fixHooks[ name ] = jQuery.event.keyHooks;
3667
- }
3668
-
3669
- if ( rmouseEvent.test( name ) ) {
3670
- jQuery.event.fixHooks[ name ] = jQuery.event.mouseHooks;
3671
3685
  }
3672
3686
  });
3673
3687
  /*!
@@ -3781,7 +3795,7 @@ var i,
3781
3795
 
3782
3796
  rsibling = /[\x20\t\r\n\f]*[+~]/,
3783
3797
 
3784
- rnative = /\{\s*\[native code\]\s*\}/,
3798
+ rnative = /^[^{]+\{\s*\[native code/,
3785
3799
 
3786
3800
  // Easily-parseable/retrievable ID or TAG or CLASS selectors
3787
3801
  rquickExpr = /^(?:#([\w-]+)|(\w+)|\.([\w-]+))$/,
@@ -3808,12 +3822,12 @@ var i,
3808
3822
 
3809
3823
  // Use a stripped-down slice if we can't use a native one
3810
3824
  try {
3811
- slice.call( docElem.childNodes, 0 )[0].nodeType;
3825
+ slice.call( preferredDoc.documentElement.childNodes, 0 )[0].nodeType;
3812
3826
  } catch ( e ) {
3813
3827
  slice = function( i ) {
3814
3828
  var elem,
3815
3829
  results = [];
3816
- for ( ; (elem = this[i]); i++ ) {
3830
+ while ( (elem = this[i++]) ) {
3817
3831
  results.push( elem );
3818
3832
  }
3819
3833
  return results;
@@ -4132,7 +4146,7 @@ setDocument = Sizzle.setDocument = function( node ) {
4132
4146
 
4133
4147
  // Filter out possible comments
4134
4148
  if ( tag === "*" ) {
4135
- for ( ; (elem = results[i]); i++ ) {
4149
+ while ( (elem = results[i++]) ) {
4136
4150
  if ( elem.nodeType === 1 ) {
4137
4151
  tmp.push( elem );
4138
4152
  }
@@ -4290,15 +4304,11 @@ setDocument = Sizzle.setDocument = function( node ) {
4290
4304
  ap = [ a ],
4291
4305
  bp = [ b ];
4292
4306
 
4293
- // The nodes are identical, we can exit early
4307
+ // Exit early if the nodes are identical
4294
4308
  if ( a === b ) {
4295
4309
  hasDuplicate = true;
4296
4310
  return 0;
4297
4311
 
4298
- // Fallback to using sourceIndex (in IE) if it's available on both nodes
4299
- } else if ( a.sourceIndex && b.sourceIndex ) {
4300
- return ( ~b.sourceIndex || MAX_NEGATIVE ) - ( contains( preferredDoc, a ) && ~a.sourceIndex || MAX_NEGATIVE );
4301
-
4302
4312
  // Parentless nodes are either documents or disconnected
4303
4313
  } else if ( !aup || !bup ) {
4304
4314
  return a === doc ? -1 :
@@ -4437,11 +4447,20 @@ Sizzle.uniqueSort = function( results ) {
4437
4447
  };
4438
4448
 
4439
4449
  function siblingCheck( a, b ) {
4440
- var cur = a && b && a.nextSibling;
4450
+ var cur = b && a,
4451
+ diff = cur && ( ~b.sourceIndex || MAX_NEGATIVE ) - ( ~a.sourceIndex || MAX_NEGATIVE );
4441
4452
 
4442
- for ( ; cur; cur = cur.nextSibling ) {
4443
- if ( cur === b ) {
4444
- return -1;
4453
+ // Use IE sourceIndex if available on both nodes
4454
+ if ( diff ) {
4455
+ return diff;
4456
+ }
4457
+
4458
+ // Check if b follows a
4459
+ if ( cur ) {
4460
+ while ( (cur = cur.nextSibling) ) {
4461
+ if ( cur === b ) {
4462
+ return -1;
4463
+ }
4445
4464
  }
4446
4465
  }
4447
4466
 
@@ -4651,9 +4670,9 @@ Expr = Sizzle.selectors = {
4651
4670
  operator === "!=" ? result !== check :
4652
4671
  operator === "^=" ? check && result.indexOf( check ) === 0 :
4653
4672
  operator === "*=" ? check && result.indexOf( check ) > -1 :
4654
- operator === "$=" ? check && result.substr( result.length - check.length ) === check :
4673
+ operator === "$=" ? check && result.slice( -check.length ) === check :
4655
4674
  operator === "~=" ? ( " " + result + " " ).indexOf( check ) > -1 :
4656
- operator === "|=" ? result === check || result.substr( 0, check.length + 1 ) === check + "-" :
4675
+ operator === "|=" ? result === check || result.slice( 0, check.length + 1 ) === check + "-" :
4657
4676
  false;
4658
4677
  };
4659
4678
  },
@@ -5071,7 +5090,7 @@ function toSelector( tokens ) {
5071
5090
 
5072
5091
  function addCombinator( matcher, combinator, base ) {
5073
5092
  var dir = combinator.dir,
5074
- checkNonElements = base && combinator.dir === "parentNode",
5093
+ checkNonElements = base && dir === "parentNode",
5075
5094
  doneName = done++;
5076
5095
 
5077
5096
  return combinator.first ?
@@ -5314,8 +5333,8 @@ function matcherFromGroupMatchers( elementMatchers, setMatchers ) {
5314
5333
  contextBackup = outermostContext,
5315
5334
  // We must always have either seed elements or context
5316
5335
  elems = seed || byElement && Expr.find["TAG"]( "*", expandContext && context.parentNode || context ),
5317
- // Nested matchers should use non-integer dirruns
5318
- dirrunsUnique = (dirruns += contextBackup == null ? 1 : Math.E);
5336
+ // Use integer dirruns iff this is the outermost matcher
5337
+ dirrunsUnique = (dirruns += contextBackup == null ? 1 : Math.random() || 0.1);
5319
5338
 
5320
5339
  if ( outermost ) {
5321
5340
  outermostContext = context !== document && context;
@@ -5323,9 +5342,11 @@ function matcherFromGroupMatchers( elementMatchers, setMatchers ) {
5323
5342
  }
5324
5343
 
5325
5344
  // Add elements passing elementMatchers directly to results
5345
+ // Keep `i` a string if there are no elements so `matchedCount` will be "00" below
5326
5346
  for ( ; (elem = elems[i]) != null; i++ ) {
5327
5347
  if ( byElement && elem ) {
5328
- for ( j = 0; (matcher = elementMatchers[j]); j++ ) {
5348
+ j = 0;
5349
+ while ( (matcher = elementMatchers[j++]) ) {
5329
5350
  if ( matcher( elem, context, xml ) ) {
5330
5351
  results.push( elem );
5331
5352
  break;
@@ -5352,10 +5373,10 @@ function matcherFromGroupMatchers( elementMatchers, setMatchers ) {
5352
5373
  }
5353
5374
 
5354
5375
  // Apply set filters to unmatched elements
5355
- // `i` starts as a string, so matchedCount would equal "00" if there are no elements
5356
5376
  matchedCount += i;
5357
5377
  if ( bySet && i !== matchedCount ) {
5358
- for ( j = 0; (matcher = setMatchers[j]); j++ ) {
5378
+ j = 0;
5379
+ while ( (matcher = setMatchers[j++]) ) {
5359
5380
  matcher( unmatched, setMatched, context, xml );
5360
5381
  }
5361
5382
 
@@ -5457,7 +5478,8 @@ function select( selector, context, results, seed ) {
5457
5478
  }
5458
5479
 
5459
5480
  // Fetch a seed set for right-to-left matching
5460
- for ( i = matchExpr["needsContext"].test( selector ) ? -1 : tokens.length - 1; i >= 0; i-- ) {
5481
+ i = matchExpr["needsContext"].test( selector ) ? 0 : tokens.length;
5482
+ while ( i-- ) {
5461
5483
  token = tokens[i];
5462
5484
 
5463
5485
  // Abort if we hit a combinator
@@ -5535,12 +5557,13 @@ var runtil = /Until$/,
5535
5557
 
5536
5558
  jQuery.fn.extend({
5537
5559
  find: function( selector ) {
5538
- var i, ret, self;
5560
+ var i, ret, self,
5561
+ len = this.length;
5539
5562
 
5540
5563
  if ( typeof selector !== "string" ) {
5541
5564
  self = this;
5542
5565
  return this.pushStack( jQuery( selector ).filter(function() {
5543
- for ( i = 0; i < self.length; i++ ) {
5566
+ for ( i = 0; i < len; i++ ) {
5544
5567
  if ( jQuery.contains( self[ i ], this ) ) {
5545
5568
  return true;
5546
5569
  }
@@ -5549,12 +5572,12 @@ jQuery.fn.extend({
5549
5572
  }
5550
5573
 
5551
5574
  ret = [];
5552
- for ( i = 0; i < this.length; i++ ) {
5575
+ for ( i = 0; i < len; i++ ) {
5553
5576
  jQuery.find( selector, this[ i ], ret );
5554
5577
  }
5555
5578
 
5556
5579
  // Needed because $( selector, context ) becomes $( context ).find( selector )
5557
- ret = this.pushStack( jQuery.unique( ret ) );
5580
+ ret = this.pushStack( len > 1 ? jQuery.unique( ret ) : ret );
5558
5581
  ret.selector = ( this.selector ? this.selector + " " : "" ) + selector;
5559
5582
  return ret;
5560
5583
  },
@@ -6066,15 +6089,9 @@ jQuery.fn.extend({
6066
6089
  var next = this.nextSibling,
6067
6090
  parent = this.parentNode;
6068
6091
 
6069
- if ( parent && this.nodeType === 1 || this.nodeType === 11 ) {
6070
-
6092
+ if ( parent ) {
6071
6093
  jQuery( this ).remove();
6072
-
6073
- if ( next ) {
6074
- next.parentNode.insertBefore( elem, next );
6075
- } else {
6076
- parent.appendChild( elem );
6077
- }
6094
+ parent.insertBefore( elem, next );
6078
6095
  }
6079
6096
  });
6080
6097
  },
@@ -6088,7 +6105,8 @@ jQuery.fn.extend({
6088
6105
  // Flatten any nested arrays
6089
6106
  args = core_concat.apply( [], args );
6090
6107
 
6091
- var fragment, first, scripts, hasScripts, node, doc,
6108
+ var first, node, hasScripts,
6109
+ scripts, doc, fragment,
6092
6110
  i = 0,
6093
6111
  l = this.length,
6094
6112
  set = this,
@@ -6239,7 +6257,7 @@ function cloneCopyEvent( src, dest ) {
6239
6257
  }
6240
6258
 
6241
6259
  function fixCloneNodeIssues( src, dest ) {
6242
- var nodeName, data, e;
6260
+ var nodeName, e, data;
6243
6261
 
6244
6262
  // We do not need to do anything for non-Elements
6245
6263
  if ( dest.nodeType !== 1 ) {
@@ -6334,8 +6352,8 @@ jQuery.each({
6334
6352
  function getAll( context, tag ) {
6335
6353
  var elems, elem,
6336
6354
  i = 0,
6337
- found = typeof context.getElementsByTagName !== "undefined" ? context.getElementsByTagName( tag || "*" ) :
6338
- typeof context.querySelectorAll !== "undefined" ? context.querySelectorAll( tag || "*" ) :
6355
+ found = typeof context.getElementsByTagName !== core_strundefined ? context.getElementsByTagName( tag || "*" ) :
6356
+ typeof context.querySelectorAll !== core_strundefined ? context.querySelectorAll( tag || "*" ) :
6339
6357
  undefined;
6340
6358
 
6341
6359
  if ( !found ) {
@@ -6362,7 +6380,7 @@ function fixDefaultChecked( elem ) {
6362
6380
 
6363
6381
  jQuery.extend({
6364
6382
  clone: function( elem, dataAndEvents, deepDataAndEvents ) {
6365
- var destElements, srcElements, node, i, clone,
6383
+ var destElements, node, clone, i, srcElements,
6366
6384
  inPage = jQuery.contains( elem.ownerDocument, elem );
6367
6385
 
6368
6386
  if ( jQuery.support.html5Clone || jQuery.isXMLDoc(elem) || !rnoshimcache.test( "<" + elem.nodeName + ">" ) ) {
@@ -6417,7 +6435,8 @@ jQuery.extend({
6417
6435
  },
6418
6436
 
6419
6437
  buildFragment: function( elems, context, scripts, selection ) {
6420
- var contains, elem, tag, tmp, wrap, tbody, j,
6438
+ var j, elem, contains,
6439
+ tmp, tag, tbody, wrap,
6421
6440
  l = elems.length,
6422
6441
 
6423
6442
  // Ensure a safe fragment
@@ -6543,7 +6562,7 @@ jQuery.extend({
6543
6562
  },
6544
6563
 
6545
6564
  cleanData: function( elems, /* internal */ acceptData ) {
6546
- var data, id, elem, type,
6565
+ var elem, type, id, data,
6547
6566
  i = 0,
6548
6567
  internalKey = jQuery.expando,
6549
6568
  cache = jQuery.cache,
@@ -6581,7 +6600,7 @@ jQuery.extend({
6581
6600
  if ( deleteExpando ) {
6582
6601
  delete elem[ internalKey ];
6583
6602
 
6584
- } else if ( typeof elem.removeAttribute !== "undefined" ) {
6603
+ } else if ( typeof elem.removeAttribute !== core_strundefined ) {
6585
6604
  elem.removeAttribute( internalKey );
6586
6605
 
6587
6606
  } else {
@@ -6595,7 +6614,7 @@ jQuery.extend({
6595
6614
  }
6596
6615
  }
6597
6616
  });
6598
- var curCSS, getStyles, iframe,
6617
+ var iframe, getStyles, curCSS,
6599
6618
  ralpha = /alpha\([^)]*\)/i,
6600
6619
  ropacity = /opacity\s*=\s*([^)]*)/,
6601
6620
  rposition = /^(top|right|bottom|left)$/,
@@ -6648,7 +6667,7 @@ function isHidden( elem, el ) {
6648
6667
  }
6649
6668
 
6650
6669
  function showHide( elements, show ) {
6651
- var elem,
6670
+ var display, elem, hidden,
6652
6671
  values = [],
6653
6672
  index = 0,
6654
6673
  length = elements.length;
@@ -6658,11 +6677,13 @@ function showHide( elements, show ) {
6658
6677
  if ( !elem.style ) {
6659
6678
  continue;
6660
6679
  }
6680
+
6661
6681
  values[ index ] = jQuery._data( elem, "olddisplay" );
6682
+ display = elem.style.display;
6662
6683
  if ( show ) {
6663
6684
  // Reset the inline display of this element to learn if it is
6664
6685
  // being hidden by cascaded rules or not
6665
- if ( !values[ index ] && elem.style.display === "none" ) {
6686
+ if ( !values[ index ] && display === "none" ) {
6666
6687
  elem.style.display = "";
6667
6688
  }
6668
6689
 
@@ -6672,8 +6693,15 @@ function showHide( elements, show ) {
6672
6693
  if ( elem.style.display === "" && isHidden( elem ) ) {
6673
6694
  values[ index ] = jQuery._data( elem, "olddisplay", css_defaultDisplay(elem.nodeName) );
6674
6695
  }
6675
- } else if ( !values[ index ] && !isHidden( elem ) ) {
6676
- jQuery._data( elem, "olddisplay", jQuery.css( elem, "display" ) );
6696
+ } else {
6697
+
6698
+ if ( !values[ index ] ) {
6699
+ hidden = isHidden( elem );
6700
+
6701
+ if ( display && display !== "none" || !hidden ) {
6702
+ jQuery._data( elem, "olddisplay", hidden ? display : jQuery.css( elem, "display" ) );
6703
+ }
6704
+ }
6677
6705
  }
6678
6706
  }
6679
6707
 
@@ -6695,7 +6723,7 @@ function showHide( elements, show ) {
6695
6723
  jQuery.fn.extend({
6696
6724
  css: function( name, value ) {
6697
6725
  return jQuery.access( this, function( elem, name, value ) {
6698
- var styles, len,
6726
+ var len, styles,
6699
6727
  map = {},
6700
6728
  i = 0;
6701
6729
 
@@ -6836,7 +6864,7 @@ jQuery.extend({
6836
6864
  },
6837
6865
 
6838
6866
  css: function( elem, name, extra, styles ) {
6839
- var val, num, hooks,
6867
+ var num, val, hooks,
6840
6868
  origName = jQuery.camelCase( name );
6841
6869
 
6842
6870
  // Make sure that we're working with the right name
@@ -6862,7 +6890,7 @@ jQuery.extend({
6862
6890
  }
6863
6891
 
6864
6892
  // Return, converting to number if forced or a qualifier was provided and val looks numeric
6865
- if ( extra ) {
6893
+ if ( extra === "" || extra ) {
6866
6894
  num = parseFloat( val );
6867
6895
  return extra === true || jQuery.isNumeric( num ) ? num || 0 : val;
6868
6896
  }
@@ -7227,7 +7255,10 @@ jQuery(function() {
7227
7255
 
7228
7256
  if ( jQuery.expr && jQuery.expr.filters ) {
7229
7257
  jQuery.expr.filters.hidden = function( elem ) {
7230
- return ( elem.offsetWidth === 0 && elem.offsetHeight === 0 ) || (!jQuery.support.reliableHiddenOffsets && ((elem.style && elem.style.display) || jQuery.css( elem, "display" )) === "none");
7258
+ // Support: Opera <= 12.12
7259
+ // Opera reports offsetWidths and offsetHeights less than zero on some elements
7260
+ return elem.offsetWidth <= 0 && elem.offsetHeight <= 0 ||
7261
+ (!jQuery.support.reliableHiddenOffsets && ((elem.style && elem.style.display) || jQuery.css( elem, "display" )) === "none");
7231
7262
  };
7232
7263
 
7233
7264
  jQuery.expr.filters.visible = function( elem ) {
@@ -7265,7 +7296,7 @@ jQuery.each({
7265
7296
  var r20 = /%20/g,
7266
7297
  rbracket = /\[\]$/,
7267
7298
  rCRLF = /\r?\n/g,
7268
- rsubmitterTypes = /^(?:submit|button|image|reset)$/i,
7299
+ rsubmitterTypes = /^(?:submit|button|image|reset|file)$/i,
7269
7300
  rsubmittable = /^(?:input|select|textarea|keygen)/i;
7270
7301
 
7271
7302
  jQuery.fn.extend({
@@ -7361,11 +7392,25 @@ function buildParams( prefix, obj, traditional, add ) {
7361
7392
  add( prefix, obj );
7362
7393
  }
7363
7394
  }
7395
+ jQuery.each( ("blur focus focusin focusout load resize scroll unload click dblclick " +
7396
+ "mousedown mouseup mousemove mouseover mouseout mouseenter mouseleave " +
7397
+ "change select submit keydown keypress keyup error contextmenu").split(" "), function( i, name ) {
7398
+
7399
+ // Handle event binding
7400
+ jQuery.fn[ name ] = function( data, fn ) {
7401
+ return arguments.length > 0 ?
7402
+ this.on( name, null, data, fn ) :
7403
+ this.trigger( name );
7404
+ };
7405
+ });
7406
+
7407
+ jQuery.fn.hover = function( fnOver, fnOut ) {
7408
+ return this.mouseenter( fnOver ).mouseleave( fnOut || fnOver );
7409
+ };
7364
7410
  var
7365
7411
  // Document location
7366
7412
  ajaxLocParts,
7367
7413
  ajaxLocation,
7368
-
7369
7414
  ajax_nonce = jQuery.now(),
7370
7415
 
7371
7416
  ajax_rquery = /\?/,
@@ -7478,7 +7523,7 @@ function inspectPrefiltersOrTransports( structure, options, originalOptions, jqX
7478
7523
  // that takes "flat" options (not to be deep extended)
7479
7524
  // Fixes #9887
7480
7525
  function ajaxExtend( target, src ) {
7481
- var key, deep,
7526
+ var deep, key,
7482
7527
  flatOptions = jQuery.ajaxSettings.flatOptions || {};
7483
7528
 
7484
7529
  for ( key in src ) {
@@ -7498,7 +7543,7 @@ jQuery.fn.load = function( url, params, callback ) {
7498
7543
  return _load.apply( this, arguments );
7499
7544
  }
7500
7545
 
7501
- var selector, type, response,
7546
+ var selector, response, type,
7502
7547
  self = this,
7503
7548
  off = url.indexOf(" ");
7504
7549
 
@@ -7679,20 +7724,23 @@ jQuery.extend({
7679
7724
  // Force options to be an object
7680
7725
  options = options || {};
7681
7726
 
7682
- var transport,
7727
+ var // Cross-domain detection vars
7728
+ parts,
7729
+ // Loop variable
7730
+ i,
7683
7731
  // URL without anti-cache param
7684
7732
  cacheURL,
7685
- // Response headers
7733
+ // Response headers as string
7686
7734
  responseHeadersString,
7687
- responseHeaders,
7688
7735
  // timeout handle
7689
7736
  timeoutTimer,
7690
- // Cross-domain detection vars
7691
- parts,
7737
+
7692
7738
  // To know if global events are to be dispatched
7693
7739
  fireGlobals,
7694
- // Loop variable
7695
- i,
7740
+
7741
+ transport,
7742
+ // Response headers
7743
+ responseHeaders,
7696
7744
  // Create the final options object
7697
7745
  s = jQuery.ajaxSetup( {}, options ),
7698
7746
  // Callbacks context
@@ -7987,12 +8035,17 @@ jQuery.extend({
7987
8035
  }
7988
8036
  }
7989
8037
 
7990
- // If not modified
7991
- if ( status === 304 ) {
8038
+ // if no content
8039
+ if ( status === 204 ) {
8040
+ isSuccess = true;
8041
+ statusText = "nocontent";
8042
+
8043
+ // if not modified
8044
+ } else if ( status === 304 ) {
7992
8045
  isSuccess = true;
7993
8046
  statusText = "notmodified";
7994
8047
 
7995
- // If we have data
8048
+ // If we have data, let's convert it
7996
8049
  } else {
7997
8050
  isSuccess = ajaxConvert( s, response );
7998
8051
  statusText = isSuccess.state;
@@ -8062,8 +8115,7 @@ jQuery.extend({
8062
8115
  * - returns the corresponding response
8063
8116
  */
8064
8117
  function ajaxHandleResponses( s, jqXHR, responses ) {
8065
-
8066
- var ct, type, finalDataType, firstDataType,
8118
+ var firstDataType, ct, finalDataType, type,
8067
8119
  contents = s.contents,
8068
8120
  dataTypes = s.dataTypes,
8069
8121
  responseFields = s.responseFields;
@@ -8124,8 +8176,7 @@ function ajaxHandleResponses( s, jqXHR, responses ) {
8124
8176
 
8125
8177
  // Chain conversions given the request and the original response
8126
8178
  function ajaxConvert( s, response ) {
8127
-
8128
- var conv, conv2, current, tmp,
8179
+ var conv2, current, conv, tmp,
8129
8180
  converters = {},
8130
8181
  i = 0,
8131
8182
  // Work with a copy of dataTypes in case we need to modify it for conversion
@@ -8476,12 +8527,7 @@ if ( xhrSupported ) {
8476
8527
 
8477
8528
  // Listener
8478
8529
  callback = function( _, isAbort ) {
8479
-
8480
- var status,
8481
- statusText,
8482
- responseHeaders,
8483
- responses,
8484
- xml;
8530
+ var status, responseHeaders, statusText, responses;
8485
8531
 
8486
8532
  // Firefox throws exceptions when accessing properties
8487
8533
  // of an xhr when a network error occurred
@@ -8511,14 +8557,8 @@ if ( xhrSupported ) {
8511
8557
  } else {
8512
8558
  responses = {};
8513
8559
  status = xhr.status;
8514
- xml = xhr.responseXML;
8515
8560
  responseHeaders = xhr.getAllResponseHeaders();
8516
8561
 
8517
- // Construct response list
8518
- if ( xml && xml.documentElement /* #4958 */ ) {
8519
- responses.xml = xml;
8520
- }
8521
-
8522
8562
  // When requesting binary data, IE6-9 will throw an exception
8523
8563
  // on any attempt to access responseText (#11426)
8524
8564
  if ( typeof xhr.responseText === "string" ) {
@@ -8768,7 +8808,7 @@ function Animation( elem, properties, options ) {
8768
8808
  }
8769
8809
 
8770
8810
  function propFilter( props, specialEasing ) {
8771
- var index, name, easing, value, hooks;
8811
+ var value, name, index, easing, hooks;
8772
8812
 
8773
8813
  // camelCase, specialEasing and expand cssHook pass
8774
8814
  for ( index in props ) {
@@ -8836,7 +8876,9 @@ jQuery.Animation = jQuery.extend( Animation, {
8836
8876
 
8837
8877
  function defaultPrefilter( elem, props, opts ) {
8838
8878
  /*jshint validthis:true */
8839
- var index, prop, value, length, dataShow, toggle, tween, hooks, oldfire,
8879
+ var prop, index, length,
8880
+ value, dataShow, toggle,
8881
+ tween, hooks, oldfire,
8840
8882
  anim = this,
8841
8883
  style = elem.style,
8842
8884
  orig = {},
@@ -8896,7 +8938,7 @@ function defaultPrefilter( elem, props, opts ) {
8896
8938
  if ( opts.overflow ) {
8897
8939
  style.overflow = "hidden";
8898
8940
  if ( !jQuery.support.shrinkWrapBlocks ) {
8899
- anim.done(function() {
8941
+ anim.always(function() {
8900
8942
  style.overflow = opts.overflow[ 0 ];
8901
8943
  style.overflowX = opts.overflow[ 1 ];
8902
8944
  style.overflowY = opts.overflow[ 2 ];
@@ -9020,11 +9062,11 @@ Tween.propHooks = {
9020
9062
  return tween.elem[ tween.prop ];
9021
9063
  }
9022
9064
 
9023
- // passing a non empty string as a 3rd parameter to .css will automatically
9065
+ // passing an empty string as a 3rd parameter to .css will automatically
9024
9066
  // attempt a parseFloat and fallback to a string if the parse fails
9025
9067
  // so, simple values such as "10px" are parsed to Float.
9026
9068
  // complex values such as "rotate(1rad)" are returned as is.
9027
- result = jQuery.css( tween.elem, tween.prop, "auto" );
9069
+ result = jQuery.css( tween.elem, tween.prop, "" );
9028
9070
  // Empty strings, null, undefined and "auto" are converted to 0.
9029
9071
  return !result || result === "auto" ? 0 : result;
9030
9072
  },
@@ -9346,7 +9388,7 @@ jQuery.fn.offset = function( options ) {
9346
9388
 
9347
9389
  // If we don't have gBCR, just use 0,0 rather than error
9348
9390
  // BlackBerry 5, iOS 3 (original iPhone)
9349
- if ( typeof elem.getBoundingClientRect !== "undefined" ) {
9391
+ if ( typeof elem.getBoundingClientRect !== core_strundefined ) {
9350
9392
  box = elem.getBoundingClientRect();
9351
9393
  }
9352
9394
  win = getWindow( doc );