" && !rtbody.test( elem ) ? // 5616
tmp : // 5617
0; // 5618
// 5619
j = elem && elem.childNodes.length; // 5620
while ( j-- ) { // 5621
if ( jQuery.nodeName( (tbody = elem.childNodes[j]), "tbody" ) && !tbody.childNodes.length ) { // 5622
elem.removeChild( tbody ); // 5623
} // 5624
} // 5625
} // 5626
// 5627
jQuery.merge( nodes, tmp.childNodes ); // 5628
// 5629
// Fix #12392 for WebKit and IE > 9 // 5630
tmp.textContent = ""; // 5631
// 5632
// Fix #12392 for oldIE // 5633
while ( tmp.firstChild ) { // 5634
tmp.removeChild( tmp.firstChild ); // 5635
} // 5636
// 5637
// Remember the top-level container for proper cleanup // 5638
tmp = safe.lastChild; // 5639
} // 5640
} // 5641
} // 5642
// 5643
// Fix #11356: Clear elements from fragment // 5644
if ( tmp ) { // 5645
safe.removeChild( tmp ); // 5646
} // 5647
// 5648
// Reset defaultChecked for any radios and checkboxes // 5649
// about to be appended to the DOM in IE 6/7 (#8060) // 5650
if ( !support.appendChecked ) { // 5651
jQuery.grep( getAll( nodes, "input" ), fixDefaultChecked ); // 5652
} // 5653
// 5654
i = 0; // 5655
while ( (elem = nodes[ i++ ]) ) { // 5656
// 5657
// #4087 - If origin and destination elements are the same, and this is // 5658
// that element, do not do anything // 5659
if ( selection && jQuery.inArray( elem, selection ) !== -1 ) { // 5660
continue; // 5661
} // 5662
// 5663
contains = jQuery.contains( elem.ownerDocument, elem ); // 5664
// 5665
// Append to fragment // 5666
tmp = getAll( safe.appendChild( elem ), "script" ); // 5667
// 5668
// Preserve script evaluation history // 5669
if ( contains ) { // 5670
setGlobalEval( tmp ); // 5671
} // 5672
// 5673
// Capture executables // 5674
if ( scripts ) { // 5675
j = 0; // 5676
while ( (elem = tmp[ j++ ]) ) { // 5677
if ( rscriptType.test( elem.type || "" ) ) { // 5678
scripts.push( elem ); // 5679
} // 5680
} // 5681
} // 5682
} // 5683
// 5684
tmp = null; // 5685
// 5686
return safe; // 5687
}, // 5688
// 5689
cleanData: function( elems, /* internal */ acceptData ) { // 5690
var elem, type, id, data, // 5691
i = 0, // 5692
internalKey = jQuery.expando, // 5693
cache = jQuery.cache, // 5694
deleteExpando = support.deleteExpando, // 5695
special = jQuery.event.special; // 5696
// 5697
for ( ; (elem = elems[i]) != null; i++ ) { // 5698
if ( acceptData || jQuery.acceptData( elem ) ) { // 5699
// 5700
id = elem[ internalKey ]; // 5701
data = id && cache[ id ]; // 5702
// 5703
if ( data ) { // 5704
if ( data.events ) { // 5705
for ( type in data.events ) { // 5706
if ( special[ type ] ) { // 5707
jQuery.event.remove( elem, type ); // 5708
// 5709
// This is a shortcut to avoid jQuery.event.remove's overhead // 5710
} else { // 5711
jQuery.removeEvent( elem, type, data.handle ); // 5712
} // 5713
} // 5714
} // 5715
// 5716
// Remove cache only if it was not already removed by jQuery.event.remove // 5717
if ( cache[ id ] ) { // 5718
// 5719
delete cache[ id ]; // 5720
// 5721
// IE does not allow us to delete expando properties from nodes, // 5722
// nor does it have a removeAttribute function on Document nodes; // 5723
// we must handle all of these cases // 5724
if ( deleteExpando ) { // 5725
delete elem[ internalKey ]; // 5726
// 5727
} else if ( typeof elem.removeAttribute !== strundefined ) { // 5728
elem.removeAttribute( internalKey ); // 5729
// 5730
} else { // 5731
elem[ internalKey ] = null; // 5732
} // 5733
// 5734
deletedIds.push( id ); // 5735
} // 5736
} // 5737
} // 5738
} // 5739
} // 5740
}); // 5741
// 5742
jQuery.fn.extend({ // 5743
text: function( value ) { // 5744
return access( this, function( value ) { // 5745
return value === undefined ? // 5746
jQuery.text( this ) : // 5747
this.empty().append( ( this[0] && this[0].ownerDocument || document ).createTextNode( value ) ); // 5748
}, null, value, arguments.length ); // 5749
}, // 5750
// 5751
append: function() { // 5752
return this.domManip( arguments, function( elem ) { // 5753
if ( this.nodeType === 1 || this.nodeType === 11 || this.nodeType === 9 ) { // 5754
var target = manipulationTarget( this, elem ); // 5755
target.appendChild( elem ); // 5756
} // 5757
}); // 5758
}, // 5759
// 5760
prepend: function() { // 5761
return this.domManip( arguments, function( elem ) { // 5762
if ( this.nodeType === 1 || this.nodeType === 11 || this.nodeType === 9 ) { // 5763
var target = manipulationTarget( this, elem ); // 5764
target.insertBefore( elem, target.firstChild ); // 5765
} // 5766
}); // 5767
}, // 5768
// 5769
before: function() { // 5770
return this.domManip( arguments, function( elem ) { // 5771
if ( this.parentNode ) { // 5772
this.parentNode.insertBefore( elem, this ); // 5773
} // 5774
}); // 5775
}, // 5776
// 5777
after: function() { // 5778
return this.domManip( arguments, function( elem ) { // 5779
if ( this.parentNode ) { // 5780
this.parentNode.insertBefore( elem, this.nextSibling ); // 5781
} // 5782
}); // 5783
}, // 5784
// 5785
remove: function( selector, keepData /* Internal Use Only */ ) { // 5786
var elem, // 5787
elems = selector ? jQuery.filter( selector, this ) : this, // 5788
i = 0; // 5789
// 5790
for ( ; (elem = elems[i]) != null; i++ ) { // 5791
// 5792
if ( !keepData && elem.nodeType === 1 ) { // 5793
jQuery.cleanData( getAll( elem ) ); // 5794
} // 5795
// 5796
if ( elem.parentNode ) { // 5797
if ( keepData && jQuery.contains( elem.ownerDocument, elem ) ) { // 5798
setGlobalEval( getAll( elem, "script" ) ); // 5799
} // 5800
elem.parentNode.removeChild( elem ); // 5801
} // 5802
} // 5803
// 5804
return this; // 5805
}, // 5806
// 5807
empty: function() { // 5808
var elem, // 5809
i = 0; // 5810
// 5811
for ( ; (elem = this[i]) != null; i++ ) { // 5812
// Remove element nodes and prevent memory leaks // 5813
if ( elem.nodeType === 1 ) { // 5814
jQuery.cleanData( getAll( elem, false ) ); // 5815
} // 5816
// 5817
// Remove any remaining nodes // 5818
while ( elem.firstChild ) { // 5819
elem.removeChild( elem.firstChild ); // 5820
} // 5821
// 5822
// If this is a select, ensure that it displays empty (#12336) // 5823
// Support: IE<9 // 5824
if ( elem.options && jQuery.nodeName( elem, "select" ) ) { // 5825
elem.options.length = 0; // 5826
} // 5827
} // 5828
// 5829
return this; // 5830
}, // 5831
// 5832
clone: function( dataAndEvents, deepDataAndEvents ) { // 5833
dataAndEvents = dataAndEvents == null ? false : dataAndEvents; // 5834
deepDataAndEvents = deepDataAndEvents == null ? dataAndEvents : deepDataAndEvents; // 5835
// 5836
return this.map(function() { // 5837
return jQuery.clone( this, dataAndEvents, deepDataAndEvents ); // 5838
}); // 5839
}, // 5840
// 5841
html: function( value ) { // 5842
return access( this, function( value ) { // 5843
var elem = this[ 0 ] || {}, // 5844
i = 0, // 5845
l = this.length; // 5846
// 5847
if ( value === undefined ) { // 5848
return elem.nodeType === 1 ? // 5849
elem.innerHTML.replace( rinlinejQuery, "" ) : // 5850
undefined; // 5851
} // 5852
// 5853
// See if we can take a shortcut and just use innerHTML // 5854
if ( typeof value === "string" && !rnoInnerhtml.test( value ) && // 5855
( support.htmlSerialize || !rnoshimcache.test( value ) ) && // 5856
( support.leadingWhitespace || !rleadingWhitespace.test( value ) ) && // 5857
!wrapMap[ (rtagName.exec( value ) || [ "", "" ])[ 1 ].toLowerCase() ] ) { // 5858
// 5859
value = value.replace( rxhtmlTag, "<$1>$2>" ); // 5860
// 5861
try { // 5862
for (; i < l; i++ ) { // 5863
// Remove element nodes and prevent memory leaks // 5864
elem = this[i] || {}; // 5865
if ( elem.nodeType === 1 ) { // 5866
jQuery.cleanData( getAll( elem, false ) ); // 5867
elem.innerHTML = value; // 5868
} // 5869
} // 5870
// 5871
elem = 0; // 5872
// 5873
// If using innerHTML throws an exception, use the fallback method // 5874
} catch(e) {} // 5875
} // 5876
// 5877
if ( elem ) { // 5878
this.empty().append( value ); // 5879
} // 5880
}, null, value, arguments.length ); // 5881
}, // 5882
// 5883
replaceWith: function() { // 5884
var arg = arguments[ 0 ]; // 5885
// 5886
// Make the changes, replacing each context element with the new content // 5887
this.domManip( arguments, function( elem ) { // 5888
arg = this.parentNode; // 5889
// 5890
jQuery.cleanData( getAll( this ) ); // 5891
// 5892
if ( arg ) { // 5893
arg.replaceChild( elem, this ); // 5894
} // 5895
}); // 5896
// 5897
// Force removal if there was no new content (e.g., from empty arguments) // 5898
return arg && (arg.length || arg.nodeType) ? this : this.remove(); // 5899
}, // 5900
// 5901
detach: function( selector ) { // 5902
return this.remove( selector, true ); // 5903
}, // 5904
// 5905
domManip: function( args, callback ) { // 5906
// 5907
// Flatten any nested arrays // 5908
args = concat.apply( [], args ); // 5909
// 5910
var first, node, hasScripts, // 5911
scripts, doc, fragment, // 5912
i = 0, // 5913
l = this.length, // 5914
set = this, // 5915
iNoClone = l - 1, // 5916
value = args[0], // 5917
isFunction = jQuery.isFunction( value ); // 5918
// 5919
// We can't cloneNode fragments that contain checked, in WebKit // 5920
if ( isFunction || // 5921
( l > 1 && typeof value === "string" && // 5922
!support.checkClone && rchecked.test( value ) ) ) { // 5923
return this.each(function( index ) { // 5924
var self = set.eq( index ); // 5925
if ( isFunction ) { // 5926
args[0] = value.call( this, index, self.html() ); // 5927
} // 5928
self.domManip( args, callback ); // 5929
}); // 5930
} // 5931
// 5932
if ( l ) { // 5933
fragment = jQuery.buildFragment( args, this[ 0 ].ownerDocument, false, this ); // 5934
first = fragment.firstChild; // 5935
// 5936
if ( fragment.childNodes.length === 1 ) { // 5937
fragment = first; // 5938
} // 5939
// 5940
if ( first ) { // 5941
scripts = jQuery.map( getAll( fragment, "script" ), disableScript ); // 5942
hasScripts = scripts.length; // 5943
// 5944
// Use the original fragment for the last item instead of the first because it can end up // 5945
// being emptied incorrectly in certain situations (#8070). // 5946
for ( ; i < l; i++ ) { // 5947
node = fragment; // 5948
// 5949
if ( i !== iNoClone ) { // 5950
node = jQuery.clone( node, true, true ); // 5951
// 5952
// Keep references to cloned scripts for later restoration // 5953
if ( hasScripts ) { // 5954
jQuery.merge( scripts, getAll( node, "script" ) ); // 5955
} // 5956
} // 5957
// 5958
callback.call( this[i], node, i ); // 5959
} // 5960
// 5961
if ( hasScripts ) { // 5962
doc = scripts[ scripts.length - 1 ].ownerDocument; // 5963
// 5964
// Reenable scripts // 5965
jQuery.map( scripts, restoreScript ); // 5966
// 5967
// Evaluate executable scripts on first document insertion // 5968
for ( i = 0; i < hasScripts; i++ ) { // 5969
node = scripts[ i ]; // 5970
if ( rscriptType.test( node.type || "" ) && // 5971
!jQuery._data( node, "globalEval" ) && jQuery.contains( doc, node ) ) { // 5972
// 5973
if ( node.src ) { // 5974
// Optional AJAX dependency, but won't run scripts if not present // 5975
if ( jQuery._evalUrl ) { // 5976
jQuery._evalUrl( node.src ); // 5977
} // 5978
} else { // 5979
jQuery.globalEval( ( node.text || node.textContent || node.innerHTML || "" ).replace( rcleanScript, "" ) ); // 5980
} // 5981
} // 5982
} // 5983
} // 5984
// 5985
// Fix #11809: Avoid leaking memory // 5986
fragment = first = null; // 5987
} // 5988
} // 5989
// 5990
return this; // 5991
} // 5992
}); // 5993
// 5994
jQuery.each({ // 5995
appendTo: "append", // 5996
prependTo: "prepend", // 5997
insertBefore: "before", // 5998
insertAfter: "after", // 5999
replaceAll: "replaceWith" // 6000
}, function( name, original ) { // 6001
jQuery.fn[ name ] = function( selector ) { // 6002
var elems, // 6003
i = 0, // 6004
ret = [], // 6005
insert = jQuery( selector ), // 6006
last = insert.length - 1; // 6007
// 6008
for ( ; i <= last; i++ ) { // 6009
elems = i === last ? this : this.clone(true); // 6010
jQuery( insert[i] )[ original ]( elems ); // 6011
// 6012
// Modern browsers can apply jQuery collections as arrays, but oldIE needs a .get() // 6013
push.apply( ret, elems.get() ); // 6014
} // 6015
// 6016
return this.pushStack( ret ); // 6017
}; // 6018
}); // 6019
// 6020
// 6021
var iframe, // 6022
elemdisplay = {}; // 6023
// 6024
/** // 6025
* Retrieve the actual display of a element // 6026
* @param {String} name nodeName of the element // 6027
* @param {Object} doc Document object // 6028
*/ // 6029
// Called only from within defaultDisplay // 6030
function actualDisplay( name, doc ) { // 6031
var style, // 6032
elem = jQuery( doc.createElement( name ) ).appendTo( doc.body ), // 6033
// 6034
// getDefaultComputedStyle might be reliably used only on attached element // 6035
display = window.getDefaultComputedStyle && ( style = window.getDefaultComputedStyle( elem[ 0 ] ) ) ? // 6036
// 6037
// Use of this method is a temporary fix (more like optmization) until something better comes along, // 6038
// since it was removed from specification and supported only in FF // 6039
style.display : jQuery.css( elem[ 0 ], "display" ); // 6040
// 6041
// We don't have any data stored on the element, // 6042
// so use "detach" method as fast way to get rid of the element // 6043
elem.detach(); // 6044
// 6045
return display; // 6046
} // 6047
// 6048
/** // 6049
* Try to determine the default display value of an element // 6050
* @param {String} nodeName // 6051
*/ // 6052
function defaultDisplay( nodeName ) { // 6053
var doc = document, // 6054
display = elemdisplay[ nodeName ]; // 6055
// 6056
if ( !display ) { // 6057
display = actualDisplay( nodeName, doc ); // 6058
// 6059
// If the simple way fails, read from inside an iframe // 6060
if ( display === "none" || !display ) { // 6061
// 6062
// Use the already-created iframe if possible // 6063
iframe = (iframe || jQuery( "" )).appendTo( doc.documentElement ); // 6064
// 6065
// Always write a new HTML skeleton so Webkit and Firefox don't choke on reuse // 6066
doc = ( iframe[ 0 ].contentWindow || iframe[ 0 ].contentDocument ).document; // 6067
// 6068
// Support: IE // 6069
doc.write(); // 6070
doc.close(); // 6071
// 6072
display = actualDisplay( nodeName, doc ); // 6073
iframe.detach(); // 6074
} // 6075
// 6076
// Store the correct default display // 6077
elemdisplay[ nodeName ] = display; // 6078
} // 6079
// 6080
return display; // 6081
} // 6082
// 6083
// 6084
(function() { // 6085
var shrinkWrapBlocksVal; // 6086
// 6087
support.shrinkWrapBlocks = function() { // 6088
if ( shrinkWrapBlocksVal != null ) { // 6089
return shrinkWrapBlocksVal; // 6090
} // 6091
// 6092
// Will be changed later if needed. // 6093
shrinkWrapBlocksVal = false; // 6094
// 6095
// Minified: var b,c,d // 6096
var div, body, container; // 6097
// 6098
body = document.getElementsByTagName( "body" )[ 0 ]; // 6099
if ( !body || !body.style ) { // 6100
// Test fired too early or in an unsupported environment, exit. // 6101
return; // 6102
} // 6103
// 6104
// Setup // 6105
div = document.createElement( "div" ); // 6106
container = document.createElement( "div" ); // 6107
container.style.cssText = "position:absolute;border:0;width:0;height:0;top:0;left:-9999px"; // 6108
body.appendChild( container ).appendChild( div ); // 6109
// 6110
// Support: IE6 // 6111
// Check if elements with layout shrink-wrap their children // 6112
if ( typeof div.style.zoom !== strundefined ) { // 6113
// Reset CSS: box-sizing; display; margin; border // 6114
div.style.cssText = // 6115
// Support: Firefox<29, Android 2.3 // 6116
// Vendor-prefix box-sizing // 6117
"-webkit-box-sizing:content-box;-moz-box-sizing:content-box;" + // 6118
"box-sizing:content-box;display:block;margin:0;border:0;" + // 6119
"padding:1px;width:1px;zoom:1"; // 6120
div.appendChild( document.createElement( "div" ) ).style.width = "5px"; // 6121
shrinkWrapBlocksVal = div.offsetWidth !== 3; // 6122
} // 6123
// 6124
body.removeChild( container ); // 6125
// 6126
return shrinkWrapBlocksVal; // 6127
}; // 6128
// 6129
})(); // 6130
var rmargin = (/^margin/); // 6131
// 6132
var rnumnonpx = new RegExp( "^(" + pnum + ")(?!px)[a-z%]+$", "i" ); // 6133
// 6134
// 6135
// 6136
var getStyles, curCSS, // 6137
rposition = /^(top|right|bottom|left)$/; // 6138
// 6139
if ( window.getComputedStyle ) { // 6140
getStyles = function( elem ) { // 6141
// Support: IE<=11+, Firefox<=30+ (#15098, #14150) // 6142
// IE throws on elements created in popups // 6143
// FF meanwhile throws on frame elements through "defaultView.getComputedStyle" // 6144
if ( elem.ownerDocument.defaultView.opener ) { // 6145
return elem.ownerDocument.defaultView.getComputedStyle( elem, null ); // 6146
} // 6147
// 6148
return window.getComputedStyle( elem, null ); // 6149
}; // 6150
// 6151
curCSS = function( elem, name, computed ) { // 6152
var width, minWidth, maxWidth, ret, // 6153
style = elem.style; // 6154
// 6155
computed = computed || getStyles( elem ); // 6156
// 6157
// getPropertyValue is only needed for .css('filter') in IE9, see #12537 // 6158
ret = computed ? computed.getPropertyValue( name ) || computed[ name ] : undefined; // 6159
// 6160
if ( computed ) { // 6161
// 6162
if ( ret === "" && !jQuery.contains( elem.ownerDocument, elem ) ) { // 6163
ret = jQuery.style( elem, name ); // 6164
} // 6165
// 6166
// A tribute to the "awesome hack by Dean Edwards" // 6167
// Chrome < 17 and Safari 5.0 uses "computed value" instead of "used value" for margin-right // 6168
// Safari 5.1.7 (at least) returns percentage for a larger set of values, but width seems to be reliably pixels // 6169
// this is against the CSSOM draft spec: http://dev.w3.org/csswg/cssom/#resolved-values // 6170
if ( rnumnonpx.test( ret ) && rmargin.test( name ) ) { // 6171
// 6172
// Remember the original values // 6173
width = style.width; // 6174
minWidth = style.minWidth; // 6175
maxWidth = style.maxWidth; // 6176
// 6177
// Put in the new values to get a computed value out // 6178
style.minWidth = style.maxWidth = style.width = ret; // 6179
ret = computed.width; // 6180
// 6181
// Revert the changed values // 6182
style.width = width; // 6183
style.minWidth = minWidth; // 6184
style.maxWidth = maxWidth; // 6185
} // 6186
} // 6187
// 6188
// Support: IE // 6189
// IE returns zIndex value as an integer. // 6190
return ret === undefined ? // 6191
ret : // 6192
ret + ""; // 6193
}; // 6194
} else if ( document.documentElement.currentStyle ) { // 6195
getStyles = function( elem ) { // 6196
return elem.currentStyle; // 6197
}; // 6198
// 6199
curCSS = function( elem, name, computed ) { // 6200
var left, rs, rsLeft, ret, // 6201
style = elem.style; // 6202
// 6203
computed = computed || getStyles( elem ); // 6204
ret = computed ? computed[ name ] : undefined; // 6205
// 6206
// Avoid setting ret to empty string here // 6207
// so we don't default to auto // 6208
if ( ret == null && style && style[ name ] ) { // 6209
ret = style[ name ]; // 6210
} // 6211
// 6212
// From the awesome hack by Dean Edwards // 6213
// http://erik.eae.net/archives/2007/07/27/18.54.15/#comment-102291 // 6214
// 6215
// If we're not dealing with a regular pixel number // 6216
// but a number that has a weird ending, we need to convert it to pixels // 6217
// but not position css attributes, as those are proportional to the parent element instead // 6218
// and we can't measure the parent instead because it might trigger a "stacking dolls" problem // 6219
if ( rnumnonpx.test( ret ) && !rposition.test( name ) ) { // 6220
// 6221
// Remember the original values // 6222
left = style.left; // 6223
rs = elem.runtimeStyle; // 6224
rsLeft = rs && rs.left; // 6225
// 6226
// Put in the new values to get a computed value out // 6227
if ( rsLeft ) { // 6228
rs.left = elem.currentStyle.left; // 6229
} // 6230
style.left = name === "fontSize" ? "1em" : ret; // 6231
ret = style.pixelLeft + "px"; // 6232
// 6233
// Revert the changed values // 6234
style.left = left; // 6235
if ( rsLeft ) { // 6236
rs.left = rsLeft; // 6237
} // 6238
} // 6239
// 6240
// Support: IE // 6241
// IE returns zIndex value as an integer. // 6242
return ret === undefined ? // 6243
ret : // 6244
ret + "" || "auto"; // 6245
}; // 6246
} // 6247
// 6248
// 6249
// 6250
// 6251
function addGetHookIf( conditionFn, hookFn ) { // 6252
// Define the hook, we'll check on the first run if it's really needed. // 6253
return { // 6254
get: function() { // 6255
var condition = conditionFn(); // 6256
// 6257
if ( condition == null ) { // 6258
// The test was not ready at this point; screw the hook this time // 6259
// but check again when needed next time. // 6260
return; // 6261
} // 6262
// 6263
if ( condition ) { // 6264
// Hook not needed (or it's not possible to use it due to missing dependency), // 6265
// remove it. // 6266
// Since there are no other hooks for marginRight, remove the whole object. // 6267
delete this.get; // 6268
return; // 6269
} // 6270
// 6271
// Hook needed; redefine it so that the support test is not executed again. // 6272
// 6273
return (this.get = hookFn).apply( this, arguments ); // 6274
} // 6275
}; // 6276
} // 6277
// 6278
// 6279
(function() { // 6280
// Minified: var b,c,d,e,f,g, h,i // 6281
var div, style, a, pixelPositionVal, boxSizingReliableVal, // 6282
reliableHiddenOffsetsVal, reliableMarginRightVal; // 6283
// 6284
// Setup // 6285
div = document.createElement( "div" ); // 6286
div.innerHTML = " a"; // 6287
a = div.getElementsByTagName( "a" )[ 0 ]; // 6288
style = a && a.style; // 6289
// 6290
// Finish early in limited (non-browser) environments // 6291
if ( !style ) { // 6292
return; // 6293
} // 6294
// 6295
style.cssText = "float:left;opacity:.5"; // 6296
// 6297
// Support: IE<9 // 6298
// Make sure that element opacity exists (as opposed to filter) // 6299
support.opacity = style.opacity === "0.5"; // 6300
// 6301
// Verify style float existence // 6302
// (IE uses styleFloat instead of cssFloat) // 6303
support.cssFloat = !!style.cssFloat; // 6304
// 6305
div.style.backgroundClip = "content-box"; // 6306
div.cloneNode( true ).style.backgroundClip = ""; // 6307
support.clearCloneStyle = div.style.backgroundClip === "content-box"; // 6308
// 6309
// Support: Firefox<29, Android 2.3 // 6310
// Vendor-prefix box-sizing // 6311
support.boxSizing = style.boxSizing === "" || style.MozBoxSizing === "" || // 6312
style.WebkitBoxSizing === ""; // 6313
// 6314
jQuery.extend(support, { // 6315
reliableHiddenOffsets: function() { // 6316
if ( reliableHiddenOffsetsVal == null ) { // 6317
computeStyleTests(); // 6318
} // 6319
return reliableHiddenOffsetsVal; // 6320
}, // 6321
// 6322
boxSizingReliable: function() { // 6323
if ( boxSizingReliableVal == null ) { // 6324
computeStyleTests(); // 6325
} // 6326
return boxSizingReliableVal; // 6327
}, // 6328
// 6329
pixelPosition: function() { // 6330
if ( pixelPositionVal == null ) { // 6331
computeStyleTests(); // 6332
} // 6333
return pixelPositionVal; // 6334
}, // 6335
// 6336
// Support: Android 2.3 // 6337
reliableMarginRight: function() { // 6338
if ( reliableMarginRightVal == null ) { // 6339
computeStyleTests(); // 6340
} // 6341
return reliableMarginRightVal; // 6342
} // 6343
}); // 6344
// 6345
function computeStyleTests() { // 6346
// Minified: var b,c,d,j // 6347
var div, body, container, contents; // 6348
// 6349
body = document.getElementsByTagName( "body" )[ 0 ]; // 6350
if ( !body || !body.style ) { // 6351
// Test fired too early or in an unsupported environment, exit. // 6352
return; // 6353
} // 6354
// 6355
// Setup // 6356
div = document.createElement( "div" ); // 6357
container = document.createElement( "div" ); // 6358
container.style.cssText = "position:absolute;border:0;width:0;height:0;top:0;left:-9999px"; // 6359
body.appendChild( container ).appendChild( div ); // 6360
// 6361
div.style.cssText = // 6362
// Support: Firefox<29, Android 2.3 // 6363
// Vendor-prefix box-sizing // 6364
"-webkit-box-sizing:border-box;-moz-box-sizing:border-box;" + // 6365
"box-sizing:border-box;display:block;margin-top:1%;top:1%;" + // 6366
"border:1px;padding:1px;width:4px;position:absolute"; // 6367
// 6368
// Support: IE<9 // 6369
// Assume reasonable values in the absence of getComputedStyle // 6370
pixelPositionVal = boxSizingReliableVal = false; // 6371
reliableMarginRightVal = true; // 6372
// 6373
// Check for getComputedStyle so that this code is not run in IE<9. // 6374
if ( window.getComputedStyle ) { // 6375
pixelPositionVal = ( window.getComputedStyle( div, null ) || {} ).top !== "1%"; // 6376
boxSizingReliableVal = // 6377
( window.getComputedStyle( div, null ) || { width: "4px" } ).width === "4px"; // 6378
// 6379
// Support: Android 2.3 // 6380
// Div with explicit width and no margin-right incorrectly // 6381
// gets computed margin-right based on width of container (#3333) // 6382
// WebKit Bug 13343 - getComputedStyle returns wrong value for margin-right // 6383
contents = div.appendChild( document.createElement( "div" ) ); // 6384
// 6385
// Reset CSS: box-sizing; display; margin; border; padding // 6386
contents.style.cssText = div.style.cssText = // 6387
// Support: Firefox<29, Android 2.3 // 6388
// Vendor-prefix box-sizing // 6389
"-webkit-box-sizing:content-box;-moz-box-sizing:content-box;" + // 6390
"box-sizing:content-box;display:block;margin:0;border:0;padding:0"; // 6391
contents.style.marginRight = contents.style.width = "0"; // 6392
div.style.width = "1px"; // 6393
// 6394
reliableMarginRightVal = // 6395
!parseFloat( ( window.getComputedStyle( contents, null ) || {} ).marginRight ); // 6396
// 6397
div.removeChild( contents ); // 6398
} // 6399
// 6400
// Support: IE8 // 6401
// Check if table cells still have offsetWidth/Height when they are set // 6402
// to display:none and there are still other visible table cells in a // 6403
// table row; if so, offsetWidth/Height are not reliable for use when // 6404
// determining if an element has been hidden directly using // 6405
// display:none (it is still safe to use offsets if a parent element is // 6406
// hidden; don safety goggles and see bug #4512 for more information). // 6407
div.innerHTML = ""; // 6408
contents = div.getElementsByTagName( "td" ); // 6409
contents[ 0 ].style.cssText = "margin:0;border:0;padding:0;display:none"; // 6410
reliableHiddenOffsetsVal = contents[ 0 ].offsetHeight === 0; // 6411
if ( reliableHiddenOffsetsVal ) { // 6412
contents[ 0 ].style.display = ""; // 6413
contents[ 1 ].style.display = "none"; // 6414
reliableHiddenOffsetsVal = contents[ 0 ].offsetHeight === 0; // 6415
} // 6416
// 6417
body.removeChild( container ); // 6418
} // 6419
// 6420
})(); // 6421
// 6422
// 6423
// A method for quickly swapping in/out CSS properties to get correct calculations. // 6424
jQuery.swap = function( elem, options, callback, args ) { // 6425
var ret, name, // 6426
old = {}; // 6427
// 6428
// Remember the old values, and insert the new ones // 6429
for ( name in options ) { // 6430
old[ name ] = elem.style[ name ]; // 6431
elem.style[ name ] = options[ name ]; // 6432
} // 6433
// 6434
ret = callback.apply( elem, args || [] ); // 6435
// 6436
// Revert the old values // 6437
for ( name in options ) { // 6438
elem.style[ name ] = old[ name ]; // 6439
} // 6440
// 6441
return ret; // 6442
}; // 6443
// 6444
// 6445
var // 6446
ralpha = /alpha\([^)]*\)/i, // 6447
ropacity = /opacity\s*=\s*([^)]*)/, // 6448
// 6449
// swappable if display is none or starts with table except "table", "table-cell", or "table-caption" // 6450
// see here for display values: https://developer.mozilla.org/en-US/docs/CSS/display // 6451
rdisplayswap = /^(none|table(?!-c[ea]).+)/, // 6452
rnumsplit = new RegExp( "^(" + pnum + ")(.*)$", "i" ), // 6453
rrelNum = new RegExp( "^([+-])=(" + pnum + ")", "i" ), // 6454
// 6455
cssShow = { position: "absolute", visibility: "hidden", display: "block" }, // 6456
cssNormalTransform = { // 6457
letterSpacing: "0", // 6458
fontWeight: "400" // 6459
}, // 6460
// 6461
cssPrefixes = [ "Webkit", "O", "Moz", "ms" ]; // 6462
// 6463
// 6464
// return a css property mapped to a potentially vendor prefixed property // 6465
function vendorPropName( style, name ) { // 6466
// 6467
// shortcut for names that are not vendor prefixed // 6468
if ( name in style ) { // 6469
return name; // 6470
} // 6471
// 6472
// check for vendor prefixed names // 6473
var capName = name.charAt(0).toUpperCase() + name.slice(1), // 6474
origName = name, // 6475
i = cssPrefixes.length; // 6476
// 6477
while ( i-- ) { // 6478
name = cssPrefixes[ i ] + capName; // 6479
if ( name in style ) { // 6480
return name; // 6481
} // 6482
} // 6483
// 6484
return origName; // 6485
} // 6486
// 6487
function showHide( elements, show ) { // 6488
var display, elem, hidden, // 6489
values = [], // 6490
index = 0, // 6491
length = elements.length; // 6492
// 6493
for ( ; index < length; index++ ) { // 6494
elem = elements[ index ]; // 6495
if ( !elem.style ) { // 6496
continue; // 6497
} // 6498
// 6499
values[ index ] = jQuery._data( elem, "olddisplay" ); // 6500
display = elem.style.display; // 6501
if ( show ) { // 6502
// Reset the inline display of this element to learn if it is // 6503
// being hidden by cascaded rules or not // 6504
if ( !values[ index ] && display === "none" ) { // 6505
elem.style.display = ""; // 6506
} // 6507
// 6508
// Set elements which have been overridden with display: none // 6509
// in a stylesheet to whatever the default browser style is // 6510
// for such an element // 6511
if ( elem.style.display === "" && isHidden( elem ) ) { // 6512
values[ index ] = jQuery._data( elem, "olddisplay", defaultDisplay(elem.nodeName) ); // 6513
} // 6514
} else { // 6515
hidden = isHidden( elem ); // 6516
// 6517
if ( display && display !== "none" || !hidden ) { // 6518
jQuery._data( elem, "olddisplay", hidden ? display : jQuery.css( elem, "display" ) ); // 6519
} // 6520
} // 6521
} // 6522
// 6523
// Set the display of most of the elements in a second loop // 6524
// to avoid the constant reflow // 6525
for ( index = 0; index < length; index++ ) { // 6526
elem = elements[ index ]; // 6527
if ( !elem.style ) { // 6528
continue; // 6529
} // 6530
if ( !show || elem.style.display === "none" || elem.style.display === "" ) { // 6531
elem.style.display = show ? values[ index ] || "" : "none"; // 6532
} // 6533
} // 6534
// 6535
return elements; // 6536
} // 6537
// 6538
function setPositiveNumber( elem, value, subtract ) { // 6539
var matches = rnumsplit.exec( value ); // 6540
return matches ? // 6541
// Guard against undefined "subtract", e.g., when used as in cssHooks // 6542
Math.max( 0, matches[ 1 ] - ( subtract || 0 ) ) + ( matches[ 2 ] || "px" ) : // 6543
value; // 6544
} // 6545
// 6546
function augmentWidthOrHeight( elem, name, extra, isBorderBox, styles ) { // 6547
var i = extra === ( isBorderBox ? "border" : "content" ) ? // 6548
// If we already have the right measurement, avoid augmentation // 6549
4 : // 6550
// Otherwise initialize for horizontal or vertical properties // 6551
name === "width" ? 1 : 0, // 6552
// 6553
val = 0; // 6554
// 6555
for ( ; i < 4; i += 2 ) { // 6556
// both box models exclude margin, so add it if we want it // 6557
if ( extra === "margin" ) { // 6558
val += jQuery.css( elem, extra + cssExpand[ i ], true, styles ); // 6559
} // 6560
// 6561
if ( isBorderBox ) { // 6562
// border-box includes padding, so remove it if we want content // 6563
if ( extra === "content" ) { // 6564
val -= jQuery.css( elem, "padding" + cssExpand[ i ], true, styles ); // 6565
} // 6566
// 6567
// at this point, extra isn't border nor margin, so remove border // 6568
if ( extra !== "margin" ) { // 6569
val -= jQuery.css( elem, "border" + cssExpand[ i ] + "Width", true, styles ); // 6570
} // 6571
} else { // 6572
// at this point, extra isn't content, so add padding // 6573
val += jQuery.css( elem, "padding" + cssExpand[ i ], true, styles ); // 6574
// 6575
// at this point, extra isn't content nor padding, so add border // 6576
if ( extra !== "padding" ) { // 6577
val += jQuery.css( elem, "border" + cssExpand[ i ] + "Width", true, styles ); // 6578
} // 6579
} // 6580
} // 6581
// 6582
return val; // 6583
} // 6584
// 6585
function getWidthOrHeight( elem, name, extra ) { // 6586
// 6587
// Start with offset property, which is equivalent to the border-box value // 6588
var valueIsBorderBox = true, // 6589
val = name === "width" ? elem.offsetWidth : elem.offsetHeight, // 6590
styles = getStyles( elem ), // 6591
isBorderBox = support.boxSizing && jQuery.css( elem, "boxSizing", false, styles ) === "border-box"; // 6592
// 6593
// some non-html elements return undefined for offsetWidth, so check for null/undefined // 6594
// svg - https://bugzilla.mozilla.org/show_bug.cgi?id=649285 // 6595
// MathML - https://bugzilla.mozilla.org/show_bug.cgi?id=491668 // 6596
if ( val <= 0 || val == null ) { // 6597
// Fall back to computed then uncomputed css if necessary // 6598
val = curCSS( elem, name, styles ); // 6599
if ( val < 0 || val == null ) { // 6600
val = elem.style[ name ]; // 6601
} // 6602
// 6603
// Computed unit is not pixels. Stop here and return. // 6604
if ( rnumnonpx.test(val) ) { // 6605
return val; // 6606
} // 6607
// 6608
// we need the check for style in case a browser which returns unreliable values // 6609
// for getComputedStyle silently falls back to the reliable elem.style // 6610
valueIsBorderBox = isBorderBox && ( support.boxSizingReliable() || val === elem.style[ name ] ); // 6611
// 6612
// Normalize "", auto, and prepare for extra // 6613
val = parseFloat( val ) || 0; // 6614
} // 6615
// 6616
// use the active box-sizing model to add/subtract irrelevant styles // 6617
return ( val + // 6618
augmentWidthOrHeight( // 6619
elem, // 6620
name, // 6621
extra || ( isBorderBox ? "border" : "content" ), // 6622
valueIsBorderBox, // 6623
styles // 6624
) // 6625
) + "px"; // 6626
} // 6627
// 6628
jQuery.extend({ // 6629
// Add in style property hooks for overriding the default // 6630
// behavior of getting and setting a style property // 6631
cssHooks: { // 6632
opacity: { // 6633
get: function( elem, computed ) { // 6634
if ( computed ) { // 6635
// We should always get a number back from opacity // 6636
var ret = curCSS( elem, "opacity" ); // 6637
return ret === "" ? "1" : ret; // 6638
} // 6639
} // 6640
} // 6641
}, // 6642
// 6643
// Don't automatically add "px" to these possibly-unitless properties // 6644
cssNumber: { // 6645
"columnCount": true, // 6646
"fillOpacity": true, // 6647
"flexGrow": true, // 6648
"flexShrink": true, // 6649
"fontWeight": true, // 6650
"lineHeight": true, // 6651
"opacity": true, // 6652
"order": true, // 6653
"orphans": true, // 6654
"widows": true, // 6655
"zIndex": true, // 6656
"zoom": true // 6657
}, // 6658
// 6659
// Add in properties whose names you wish to fix before // 6660
// setting or getting the value // 6661
cssProps: { // 6662
// normalize float css property // 6663
"float": support.cssFloat ? "cssFloat" : "styleFloat" // 6664
}, // 6665
// 6666
// Get and set the style property on a DOM Node // 6667
style: function( elem, name, value, extra ) { // 6668
// Don't set styles on text and comment nodes // 6669
if ( !elem || elem.nodeType === 3 || elem.nodeType === 8 || !elem.style ) { // 6670
return; // 6671
} // 6672
// 6673
// Make sure that we're working with the right name // 6674
var ret, type, hooks, // 6675
origName = jQuery.camelCase( name ), // 6676
style = elem.style; // 6677
// 6678
name = jQuery.cssProps[ origName ] || ( jQuery.cssProps[ origName ] = vendorPropName( style, origName ) ); // 6679
// 6680
// gets hook for the prefixed version // 6681
// followed by the unprefixed version // 6682
hooks = jQuery.cssHooks[ name ] || jQuery.cssHooks[ origName ]; // 6683
// 6684
// Check if we're setting a value // 6685
if ( value !== undefined ) { // 6686
type = typeof value; // 6687
// 6688
// convert relative number strings (+= or -=) to relative numbers. #7345 // 6689
if ( type === "string" && (ret = rrelNum.exec( value )) ) { // 6690
value = ( ret[1] + 1 ) * ret[2] + parseFloat( jQuery.css( elem, name ) ); // 6691
// Fixes bug #9237 // 6692
type = "number"; // 6693
} // 6694
// 6695
// Make sure that null and NaN values aren't set. See: #7116 // 6696
if ( value == null || value !== value ) { // 6697
return; // 6698
} // 6699
// 6700
// If a number was passed in, add 'px' to the (except for certain CSS properties) // 6701
if ( type === "number" && !jQuery.cssNumber[ origName ] ) { // 6702
value += "px"; // 6703
} // 6704
// 6705
// Fixes #8908, it can be done more correctly by specifing setters in cssHooks, // 6706
// but it would mean to define eight (for every problematic property) identical functions // 6707
if ( !support.clearCloneStyle && value === "" && name.indexOf("background") === 0 ) { // 6708
style[ name ] = "inherit"; // 6709
} // 6710
// 6711
// If a hook was provided, use that value, otherwise just set the specified value // 6712
if ( !hooks || !("set" in hooks) || (value = hooks.set( elem, value, extra )) !== undefined ) { // 6713
// 6714
// Support: IE // 6715
// Swallow errors from 'invalid' CSS values (#5509) // 6716
try { // 6717
style[ name ] = value; // 6718
} catch(e) {} // 6719
} // 6720
// 6721
} else { // 6722
// If a hook was provided get the non-computed value from there // 6723
if ( hooks && "get" in hooks && (ret = hooks.get( elem, false, extra )) !== undefined ) { // 6724
return ret; // 6725
} // 6726
// 6727
// Otherwise just get the value from the style object // 6728
return style[ name ]; // 6729
} // 6730
}, // 6731
// 6732
css: function( elem, name, extra, styles ) { // 6733
var num, val, hooks, // 6734
origName = jQuery.camelCase( name ); // 6735
// 6736
// Make sure that we're working with the right name // 6737
name = jQuery.cssProps[ origName ] || ( jQuery.cssProps[ origName ] = vendorPropName( elem.style, origName ) ); // 6738
// 6739
// gets hook for the prefixed version // 6740
// followed by the unprefixed version // 6741
hooks = jQuery.cssHooks[ name ] || jQuery.cssHooks[ origName ]; // 6742
// 6743
// If a hook was provided get the computed value from there // 6744
if ( hooks && "get" in hooks ) { // 6745
val = hooks.get( elem, true, extra ); // 6746
} // 6747
// 6748
// Otherwise, if a way to get the computed value exists, use that // 6749
if ( val === undefined ) { // 6750
val = curCSS( elem, name, styles ); // 6751
} // 6752
// 6753
//convert "normal" to computed value // 6754
if ( val === "normal" && name in cssNormalTransform ) { // 6755
val = cssNormalTransform[ name ]; // 6756
} // 6757
// 6758
// Return, converting to number if forced or a qualifier was provided and val looks numeric // 6759
if ( extra === "" || extra ) { // 6760
num = parseFloat( val ); // 6761
return extra === true || jQuery.isNumeric( num ) ? num || 0 : val; // 6762
} // 6763
return val; // 6764
} // 6765
}); // 6766
// 6767
jQuery.each([ "height", "width" ], function( i, name ) { // 6768
jQuery.cssHooks[ name ] = { // 6769
get: function( elem, computed, extra ) { // 6770
if ( computed ) { // 6771
// certain elements can have dimension info if we invisibly show them // 6772
// however, it must have a current display style that would benefit from this // 6773
return rdisplayswap.test( jQuery.css( elem, "display" ) ) && elem.offsetWidth === 0 ? // 6774
jQuery.swap( elem, cssShow, function() { // 6775
return getWidthOrHeight( elem, name, extra ); // 6776
}) : // 6777
getWidthOrHeight( elem, name, extra ); // 6778
} // 6779
}, // 6780
// 6781
set: function( elem, value, extra ) { // 6782
var styles = extra && getStyles( elem ); // 6783
return setPositiveNumber( elem, value, extra ? // 6784
augmentWidthOrHeight( // 6785
elem, // 6786
name, // 6787
extra, // 6788
support.boxSizing && jQuery.css( elem, "boxSizing", false, styles ) === "border-box", // 6789
styles // 6790
) : 0 // 6791
); // 6792
} // 6793
}; // 6794
}); // 6795
// 6796
if ( !support.opacity ) { // 6797
jQuery.cssHooks.opacity = { // 6798
get: function( elem, computed ) { // 6799
// IE uses filters for opacity // 6800
return ropacity.test( (computed && elem.currentStyle ? elem.currentStyle.filter : elem.style.filter) || "" ) ? // 6801
( 0.01 * parseFloat( RegExp.$1 ) ) + "" : // 6802
computed ? "1" : ""; // 6803
}, // 6804
// 6805
set: function( elem, value ) { // 6806
var style = elem.style, // 6807
currentStyle = elem.currentStyle, // 6808
opacity = jQuery.isNumeric( value ) ? "alpha(opacity=" + value * 100 + ")" : "", // 6809
filter = currentStyle && currentStyle.filter || style.filter || ""; // 6810
// 6811
// IE has trouble with opacity if it does not have layout // 6812
// Force it by setting the zoom level // 6813
style.zoom = 1; // 6814
// 6815
// if setting opacity to 1, and no other filters exist - attempt to remove filter attribute #6652 // 6816
// if value === "", then remove inline opacity #12685 // 6817
if ( ( value >= 1 || value === "" ) && // 6818
jQuery.trim( filter.replace( ralpha, "" ) ) === "" && // 6819
style.removeAttribute ) { // 6820
// 6821
// Setting style.filter to null, "" & " " still leave "filter:" in the cssText // 6822
// if "filter:" is present at all, clearType is disabled, we want to avoid this // 6823
// style.removeAttribute is IE Only, but so apparently is this code path... // 6824
style.removeAttribute( "filter" ); // 6825
// 6826
// if there is no filter style applied in a css rule or unset inline opacity, we are done // 6827
if ( value === "" || currentStyle && !currentStyle.filter ) { // 6828
return; // 6829
} // 6830
} // 6831
// 6832
// otherwise, set new filter values // 6833
style.filter = ralpha.test( filter ) ? // 6834
filter.replace( ralpha, opacity ) : // 6835
filter + " " + opacity; // 6836
} // 6837
}; // 6838
} // 6839
// 6840
jQuery.cssHooks.marginRight = addGetHookIf( support.reliableMarginRight, // 6841
function( elem, computed ) { // 6842
if ( computed ) { // 6843
// WebKit Bug 13343 - getComputedStyle returns wrong value for margin-right // 6844
// Work around by temporarily setting element display to inline-block // 6845
return jQuery.swap( elem, { "display": "inline-block" }, // 6846
curCSS, [ elem, "marginRight" ] ); // 6847
} // 6848
} // 6849
); // 6850
// 6851
// These hooks are used by animate to expand properties // 6852
jQuery.each({ // 6853
margin: "", // 6854
padding: "", // 6855
border: "Width" // 6856
}, function( prefix, suffix ) { // 6857
jQuery.cssHooks[ prefix + suffix ] = { // 6858
expand: function( value ) { // 6859
var i = 0, // 6860
expanded = {}, // 6861
// 6862
// assumes a single number if not a string // 6863
parts = typeof value === "string" ? value.split(" ") : [ value ]; // 6864
// 6865
for ( ; i < 4; i++ ) { // 6866
expanded[ prefix + cssExpand[ i ] + suffix ] = // 6867
parts[ i ] || parts[ i - 2 ] || parts[ 0 ]; // 6868
} // 6869
// 6870
return expanded; // 6871
} // 6872
}; // 6873
// 6874
if ( !rmargin.test( prefix ) ) { // 6875
jQuery.cssHooks[ prefix + suffix ].set = setPositiveNumber; // 6876
} // 6877
}); // 6878
// 6879
jQuery.fn.extend({ // 6880
css: function( name, value ) { // 6881
return access( this, function( elem, name, value ) { // 6882
var styles, len, // 6883
map = {}, // 6884
i = 0; // 6885
// 6886
if ( jQuery.isArray( name ) ) { // 6887
styles = getStyles( elem ); // 6888
len = name.length; // 6889
// 6890
for ( ; i < len; i++ ) { // 6891
map[ name[ i ] ] = jQuery.css( elem, name[ i ], false, styles ); // 6892
} // 6893
// 6894
return map; // 6895
} // 6896
// 6897
return value !== undefined ? // 6898
jQuery.style( elem, name, value ) : // 6899
jQuery.css( elem, name ); // 6900
}, name, value, arguments.length > 1 ); // 6901
}, // 6902
show: function() { // 6903
return showHide( this, true ); // 6904
}, // 6905
hide: function() { // 6906
return showHide( this ); // 6907
}, // 6908
toggle: function( state ) { // 6909
if ( typeof state === "boolean" ) { // 6910
return state ? this.show() : this.hide(); // 6911
} // 6912
// 6913
return this.each(function() { // 6914
if ( isHidden( this ) ) { // 6915
jQuery( this ).show(); // 6916
} else { // 6917
jQuery( this ).hide(); // 6918
} // 6919
}); // 6920
} // 6921
}); // 6922
// 6923
// 6924
function Tween( elem, options, prop, end, easing ) { // 6925
return new Tween.prototype.init( elem, options, prop, end, easing ); // 6926
} // 6927
jQuery.Tween = Tween; // 6928
// 6929
Tween.prototype = { // 6930
constructor: Tween, // 6931
init: function( elem, options, prop, end, easing, unit ) { // 6932
this.elem = elem; // 6933
this.prop = prop; // 6934
this.easing = easing || "swing"; // 6935
this.options = options; // 6936
this.start = this.now = this.cur(); // 6937
this.end = end; // 6938
this.unit = unit || ( jQuery.cssNumber[ prop ] ? "" : "px" ); // 6939
}, // 6940
cur: function() { // 6941
var hooks = Tween.propHooks[ this.prop ]; // 6942
// 6943
return hooks && hooks.get ? // 6944
hooks.get( this ) : // 6945
Tween.propHooks._default.get( this ); // 6946
}, // 6947
run: function( percent ) { // 6948
var eased, // 6949
hooks = Tween.propHooks[ this.prop ]; // 6950
// 6951
if ( this.options.duration ) { // 6952
this.pos = eased = jQuery.easing[ this.easing ]( // 6953
percent, this.options.duration * percent, 0, 1, this.options.duration // 6954
); // 6955
} else { // 6956
this.pos = eased = percent; // 6957
} // 6958
this.now = ( this.end - this.start ) * eased + this.start; // 6959
// 6960
if ( this.options.step ) { // 6961
this.options.step.call( this.elem, this.now, this ); // 6962
} // 6963
// 6964
if ( hooks && hooks.set ) { // 6965
hooks.set( this ); // 6966
} else { // 6967
Tween.propHooks._default.set( this ); // 6968
} // 6969
return this; // 6970
} // 6971
}; // 6972
// 6973
Tween.prototype.init.prototype = Tween.prototype; // 6974
// 6975
Tween.propHooks = { // 6976
_default: { // 6977
get: function( tween ) { // 6978
var result; // 6979
// 6980
if ( tween.elem[ tween.prop ] != null && // 6981
(!tween.elem.style || tween.elem.style[ tween.prop ] == null) ) { // 6982
return tween.elem[ tween.prop ]; // 6983
} // 6984
// 6985
// passing an empty string as a 3rd parameter to .css will automatically // 6986
// attempt a parseFloat and fallback to a string if the parse fails // 6987
// so, simple values such as "10px" are parsed to Float. // 6988
// complex values such as "rotate(1rad)" are returned as is. // 6989
result = jQuery.css( tween.elem, tween.prop, "" ); // 6990
// Empty strings, null, undefined and "auto" are converted to 0. // 6991
return !result || result === "auto" ? 0 : result; // 6992
}, // 6993
set: function( tween ) { // 6994
// use step hook for back compat - use cssHook if its there - use .style if its // 6995
// available and use plain properties where available // 6996
if ( jQuery.fx.step[ tween.prop ] ) { // 6997
jQuery.fx.step[ tween.prop ]( tween ); // 6998
} else if ( tween.elem.style && ( tween.elem.style[ jQuery.cssProps[ tween.prop ] ] != null || jQuery.cssHooks[ tween.prop ] ) ) {
jQuery.style( tween.elem, tween.prop, tween.now + tween.unit ); // 7000
} else { // 7001
tween.elem[ tween.prop ] = tween.now; // 7002
} // 7003
} // 7004
} // 7005
}; // 7006
// 7007
// Support: IE <=9 // 7008
// Panic based approach to setting things on disconnected nodes // 7009
// 7010
Tween.propHooks.scrollTop = Tween.propHooks.scrollLeft = { // 7011
set: function( tween ) { // 7012
if ( tween.elem.nodeType && tween.elem.parentNode ) { // 7013
tween.elem[ tween.prop ] = tween.now; // 7014
} // 7015
} // 7016
}; // 7017
// 7018
jQuery.easing = { // 7019
linear: function( p ) { // 7020
return p; // 7021
}, // 7022
swing: function( p ) { // 7023
return 0.5 - Math.cos( p * Math.PI ) / 2; // 7024
} // 7025
}; // 7026
// 7027
jQuery.fx = Tween.prototype.init; // 7028
// 7029
// Back Compat <1.8 extension point // 7030
jQuery.fx.step = {}; // 7031
// 7032
// 7033
// 7034
// 7035
var // 7036
fxNow, timerId, // 7037
rfxtypes = /^(?:toggle|show|hide)$/, // 7038
rfxnum = new RegExp( "^(?:([+-])=|)(" + pnum + ")([a-z%]*)$", "i" ), // 7039
rrun = /queueHooks$/, // 7040
animationPrefilters = [ defaultPrefilter ], // 7041
tweeners = { // 7042
"*": [ function( prop, value ) { // 7043
var tween = this.createTween( prop, value ), // 7044
target = tween.cur(), // 7045
parts = rfxnum.exec( value ), // 7046
unit = parts && parts[ 3 ] || ( jQuery.cssNumber[ prop ] ? "" : "px" ), // 7047
// 7048
// Starting value computation is required for potential unit mismatches // 7049
start = ( jQuery.cssNumber[ prop ] || unit !== "px" && +target ) && // 7050
rfxnum.exec( jQuery.css( tween.elem, prop ) ), // 7051
scale = 1, // 7052
maxIterations = 20; // 7053
// 7054
if ( start && start[ 3 ] !== unit ) { // 7055
// Trust units reported by jQuery.css // 7056
unit = unit || start[ 3 ]; // 7057
// 7058
// Make sure we update the tween properties later on // 7059
parts = parts || []; // 7060
// 7061
// Iteratively approximate from a nonzero starting point // 7062
start = +target || 1; // 7063
// 7064
do { // 7065
// If previous iteration zeroed out, double until we get *something* // 7066
// Use a string for doubling factor so we don't accidentally see scale as unchanged below // 7067
scale = scale || ".5"; // 7068
// 7069
// Adjust and apply // 7070
start = start / scale; // 7071
jQuery.style( tween.elem, prop, start + unit ); // 7072
// 7073
// Update scale, tolerating zero or NaN from tween.cur() // 7074
// And breaking the loop if scale is unchanged or perfect, or if we've just had enough // 7075
} while ( scale !== (scale = tween.cur() / target) && scale !== 1 && --maxIterations ); // 7076
} // 7077
// 7078
// Update tween properties // 7079
if ( parts ) { // 7080
start = tween.start = +start || +target || 0; // 7081
tween.unit = unit; // 7082
// If a +=/-= token was provided, we're doing a relative animation // 7083
tween.end = parts[ 1 ] ? // 7084
start + ( parts[ 1 ] + 1 ) * parts[ 2 ] : // 7085
+parts[ 2 ]; // 7086
} // 7087
// 7088
return tween; // 7089
} ] // 7090
}; // 7091
// 7092
// Animations created synchronously will run synchronously // 7093
function createFxNow() { // 7094
setTimeout(function() { // 7095
fxNow = undefined; // 7096
}); // 7097
return ( fxNow = jQuery.now() ); // 7098
} // 7099
// 7100
// Generate parameters to create a standard animation // 7101
function genFx( type, includeWidth ) { // 7102
var which, // 7103
attrs = { height: type }, // 7104
i = 0; // 7105
// 7106
// if we include width, step value is 1 to do all cssExpand values, // 7107
// if we don't include width, step value is 2 to skip over Left and Right // 7108
includeWidth = includeWidth ? 1 : 0; // 7109
for ( ; i < 4 ; i += 2 - includeWidth ) { // 7110
which = cssExpand[ i ]; // 7111
attrs[ "margin" + which ] = attrs[ "padding" + which ] = type; // 7112
} // 7113
// 7114
if ( includeWidth ) { // 7115
attrs.opacity = attrs.width = type; // 7116
} // 7117
// 7118
return attrs; // 7119
} // 7120
// 7121
function createTween( value, prop, animation ) { // 7122
var tween, // 7123
collection = ( tweeners[ prop ] || [] ).concat( tweeners[ "*" ] ), // 7124
index = 0, // 7125
length = collection.length; // 7126
for ( ; index < length; index++ ) { // 7127
if ( (tween = collection[ index ].call( animation, prop, value )) ) { // 7128
// 7129
// we're done with this property // 7130
return tween; // 7131
} // 7132
} // 7133
} // 7134
// 7135
function defaultPrefilter( elem, props, opts ) { // 7136
/* jshint validthis: true */ // 7137
var prop, value, toggle, tween, hooks, oldfire, display, checkDisplay, // 7138
anim = this, // 7139
orig = {}, // 7140
style = elem.style, // 7141
hidden = elem.nodeType && isHidden( elem ), // 7142
dataShow = jQuery._data( elem, "fxshow" ); // 7143
// 7144
// handle queue: false promises // 7145
if ( !opts.queue ) { // 7146
hooks = jQuery._queueHooks( elem, "fx" ); // 7147
if ( hooks.unqueued == null ) { // 7148
hooks.unqueued = 0; // 7149
oldfire = hooks.empty.fire; // 7150
hooks.empty.fire = function() { // 7151
if ( !hooks.unqueued ) { // 7152
oldfire(); // 7153
} // 7154
}; // 7155
} // 7156
hooks.unqueued++; // 7157
// 7158
anim.always(function() { // 7159
// doing this makes sure that the complete handler will be called // 7160
// before this completes // 7161
anim.always(function() { // 7162
hooks.unqueued--; // 7163
if ( !jQuery.queue( elem, "fx" ).length ) { // 7164
hooks.empty.fire(); // 7165
} // 7166
}); // 7167
}); // 7168
} // 7169
// 7170
// height/width overflow pass // 7171
if ( elem.nodeType === 1 && ( "height" in props || "width" in props ) ) { // 7172
// Make sure that nothing sneaks out // 7173
// Record all 3 overflow attributes because IE does not // 7174
// change the overflow attribute when overflowX and // 7175
// overflowY are set to the same value // 7176
opts.overflow = [ style.overflow, style.overflowX, style.overflowY ]; // 7177
// 7178
// Set display property to inline-block for height/width // 7179
// animations on inline elements that are having width/height animated // 7180
display = jQuery.css( elem, "display" ); // 7181
// 7182
// Test default display if display is currently "none" // 7183
checkDisplay = display === "none" ? // 7184
jQuery._data( elem, "olddisplay" ) || defaultDisplay( elem.nodeName ) : display; // 7185
// 7186
if ( checkDisplay === "inline" && jQuery.css( elem, "float" ) === "none" ) { // 7187
// 7188
// inline-level elements accept inline-block; // 7189
// block-level elements need to be inline with layout // 7190
if ( !support.inlineBlockNeedsLayout || defaultDisplay( elem.nodeName ) === "inline" ) { // 7191
style.display = "inline-block"; // 7192
} else { // 7193
style.zoom = 1; // 7194
} // 7195
} // 7196
} // 7197
// 7198
if ( opts.overflow ) { // 7199
style.overflow = "hidden"; // 7200
if ( !support.shrinkWrapBlocks() ) { // 7201
anim.always(function() { // 7202
style.overflow = opts.overflow[ 0 ]; // 7203
style.overflowX = opts.overflow[ 1 ]; // 7204
style.overflowY = opts.overflow[ 2 ]; // 7205
}); // 7206
} // 7207
} // 7208
// 7209
// show/hide pass // 7210
for ( prop in props ) { // 7211
value = props[ prop ]; // 7212
if ( rfxtypes.exec( value ) ) { // 7213
delete props[ prop ]; // 7214
toggle = toggle || value === "toggle"; // 7215
if ( value === ( hidden ? "hide" : "show" ) ) { // 7216
// 7217
// If there is dataShow left over from a stopped hide or show and we are going to proceed with show, we should pretend to be hidden
if ( value === "show" && dataShow && dataShow[ prop ] !== undefined ) { // 7219
hidden = true; // 7220
} else { // 7221
continue; // 7222
} // 7223
} // 7224
orig[ prop ] = dataShow && dataShow[ prop ] || jQuery.style( elem, prop ); // 7225
// 7226
// Any non-fx value stops us from restoring the original display value // 7227
} else { // 7228
display = undefined; // 7229
} // 7230
} // 7231
// 7232
if ( !jQuery.isEmptyObject( orig ) ) { // 7233
if ( dataShow ) { // 7234
if ( "hidden" in dataShow ) { // 7235
hidden = dataShow.hidden; // 7236
} // 7237
} else { // 7238
dataShow = jQuery._data( elem, "fxshow", {} ); // 7239
} // 7240
// 7241
// store state if its toggle - enables .stop().toggle() to "reverse" // 7242
if ( toggle ) { // 7243
dataShow.hidden = !hidden; // 7244
} // 7245
if ( hidden ) { // 7246
jQuery( elem ).show(); // 7247
} else { // 7248
anim.done(function() { // 7249
jQuery( elem ).hide(); // 7250
}); // 7251
} // 7252
anim.done(function() { // 7253
var prop; // 7254
jQuery._removeData( elem, "fxshow" ); // 7255
for ( prop in orig ) { // 7256
jQuery.style( elem, prop, orig[ prop ] ); // 7257
} // 7258
}); // 7259
for ( prop in orig ) { // 7260
tween = createTween( hidden ? dataShow[ prop ] : 0, prop, anim ); // 7261
// 7262
if ( !( prop in dataShow ) ) { // 7263
dataShow[ prop ] = tween.start; // 7264
if ( hidden ) { // 7265
tween.end = tween.start; // 7266
tween.start = prop === "width" || prop === "height" ? 1 : 0; // 7267
} // 7268
} // 7269
} // 7270
// 7271
// If this is a noop like .hide().hide(), restore an overwritten display value // 7272
} else if ( (display === "none" ? defaultDisplay( elem.nodeName ) : display) === "inline" ) { // 7273
style.display = display; // 7274
} // 7275
} // 7276
// 7277
function propFilter( props, specialEasing ) { // 7278
var index, name, easing, value, hooks; // 7279
// 7280
// camelCase, specialEasing and expand cssHook pass // 7281
for ( index in props ) { // 7282
name = jQuery.camelCase( index ); // 7283
easing = specialEasing[ name ]; // 7284
value = props[ index ]; // 7285
if ( jQuery.isArray( value ) ) { // 7286
easing = value[ 1 ]; // 7287
value = props[ index ] = value[ 0 ]; // 7288
} // 7289
// 7290
if ( index !== name ) { // 7291
props[ name ] = value; // 7292
delete props[ index ]; // 7293
} // 7294
// 7295
hooks = jQuery.cssHooks[ name ]; // 7296
if ( hooks && "expand" in hooks ) { // 7297
value = hooks.expand( value ); // 7298
delete props[ name ]; // 7299
// 7300
// not quite $.extend, this wont overwrite keys already present. // 7301
// also - reusing 'index' from above because we have the correct "name" // 7302
for ( index in value ) { // 7303
if ( !( index in props ) ) { // 7304
props[ index ] = value[ index ]; // 7305
specialEasing[ index ] = easing; // 7306
} // 7307
} // 7308
} else { // 7309
specialEasing[ name ] = easing; // 7310
} // 7311
} // 7312
} // 7313
// 7314
function Animation( elem, properties, options ) { // 7315
var result, // 7316
stopped, // 7317
index = 0, // 7318
length = animationPrefilters.length, // 7319
deferred = jQuery.Deferred().always( function() { // 7320
// don't match elem in the :animated selector // 7321
delete tick.elem; // 7322
}), // 7323
tick = function() { // 7324
if ( stopped ) { // 7325
return false; // 7326
} // 7327
var currentTime = fxNow || createFxNow(), // 7328
remaining = Math.max( 0, animation.startTime + animation.duration - currentTime ), // 7329
// archaic crash bug won't allow us to use 1 - ( 0.5 || 0 ) (#12497) // 7330
temp = remaining / animation.duration || 0, // 7331
percent = 1 - temp, // 7332
index = 0, // 7333
length = animation.tweens.length; // 7334
// 7335
for ( ; index < length ; index++ ) { // 7336
animation.tweens[ index ].run( percent ); // 7337
} // 7338
// 7339
deferred.notifyWith( elem, [ animation, percent, remaining ]); // 7340
// 7341
if ( percent < 1 && length ) { // 7342
return remaining; // 7343
} else { // 7344
deferred.resolveWith( elem, [ animation ] ); // 7345
return false; // 7346
} // 7347
}, // 7348
animation = deferred.promise({ // 7349
elem: elem, // 7350
props: jQuery.extend( {}, properties ), // 7351
opts: jQuery.extend( true, { specialEasing: {} }, options ), // 7352
originalProperties: properties, // 7353
originalOptions: options, // 7354
startTime: fxNow || createFxNow(), // 7355
duration: options.duration, // 7356
tweens: [], // 7357
createTween: function( prop, end ) { // 7358
var tween = jQuery.Tween( elem, animation.opts, prop, end, // 7359
animation.opts.specialEasing[ prop ] || animation.opts.easing ); // 7360
animation.tweens.push( tween ); // 7361
return tween; // 7362
}, // 7363
stop: function( gotoEnd ) { // 7364
var index = 0, // 7365
// if we are going to the end, we want to run all the tweens // 7366
// otherwise we skip this part // 7367
length = gotoEnd ? animation.tweens.length : 0; // 7368
if ( stopped ) { // 7369
return this; // 7370
} // 7371
stopped = true; // 7372
for ( ; index < length ; index++ ) { // 7373
animation.tweens[ index ].run( 1 ); // 7374
} // 7375
// 7376
// resolve when we played the last frame // 7377
// otherwise, reject // 7378
if ( gotoEnd ) { // 7379
deferred.resolveWith( elem, [ animation, gotoEnd ] ); // 7380
} else { // 7381
deferred.rejectWith( elem, [ animation, gotoEnd ] ); // 7382
} // 7383
return this; // 7384
} // 7385
}), // 7386
props = animation.props; // 7387
// 7388
propFilter( props, animation.opts.specialEasing ); // 7389
// 7390
for ( ; index < length ; index++ ) { // 7391
result = animationPrefilters[ index ].call( animation, elem, props, animation.opts ); // 7392
if ( result ) { // 7393
return result; // 7394
} // 7395
} // 7396
// 7397
jQuery.map( props, createTween, animation ); // 7398
// 7399
if ( jQuery.isFunction( animation.opts.start ) ) { // 7400
animation.opts.start.call( elem, animation ); // 7401
} // 7402
// 7403
jQuery.fx.timer( // 7404
jQuery.extend( tick, { // 7405
elem: elem, // 7406
anim: animation, // 7407
queue: animation.opts.queue // 7408
}) // 7409
); // 7410
// 7411
// attach callbacks from options // 7412
return animation.progress( animation.opts.progress ) // 7413
.done( animation.opts.done, animation.opts.complete ) // 7414
.fail( animation.opts.fail ) // 7415
.always( animation.opts.always ); // 7416
} // 7417
// 7418
jQuery.Animation = jQuery.extend( Animation, { // 7419
tweener: function( props, callback ) { // 7420
if ( jQuery.isFunction( props ) ) { // 7421
callback = props; // 7422
props = [ "*" ]; // 7423
} else { // 7424
props = props.split(" "); // 7425
} // 7426
// 7427
var prop, // 7428
index = 0, // 7429
length = props.length; // 7430
// 7431
for ( ; index < length ; index++ ) { // 7432
prop = props[ index ]; // 7433
tweeners[ prop ] = tweeners[ prop ] || []; // 7434
tweeners[ prop ].unshift( callback ); // 7435
} // 7436
}, // 7437
// 7438
prefilter: function( callback, prepend ) { // 7439
if ( prepend ) { // 7440
animationPrefilters.unshift( callback ); // 7441
} else { // 7442
animationPrefilters.push( callback ); // 7443
} // 7444
} // 7445
}); // 7446
// 7447
jQuery.speed = function( speed, easing, fn ) { // 7448
var opt = speed && typeof speed === "object" ? jQuery.extend( {}, speed ) : { // 7449
complete: fn || !fn && easing || // 7450
jQuery.isFunction( speed ) && speed, // 7451
duration: speed, // 7452
easing: fn && easing || easing && !jQuery.isFunction( easing ) && easing // 7453
}; // 7454
// 7455
opt.duration = jQuery.fx.off ? 0 : typeof opt.duration === "number" ? opt.duration : // 7456
opt.duration in jQuery.fx.speeds ? jQuery.fx.speeds[ opt.duration ] : jQuery.fx.speeds._default; // 7457
// 7458
// normalize opt.queue - true/undefined/null -> "fx" // 7459
if ( opt.queue == null || opt.queue === true ) { // 7460
opt.queue = "fx"; // 7461
} // 7462
// 7463
// Queueing // 7464
opt.old = opt.complete; // 7465
// 7466
opt.complete = function() { // 7467
if ( jQuery.isFunction( opt.old ) ) { // 7468
opt.old.call( this ); // 7469
} // 7470
// 7471
if ( opt.queue ) { // 7472
jQuery.dequeue( this, opt.queue ); // 7473
} // 7474
}; // 7475
// 7476
return opt; // 7477
}; // 7478
// 7479
jQuery.fn.extend({ // 7480
fadeTo: function( speed, to, easing, callback ) { // 7481
// 7482
// show any hidden elements after setting opacity to 0 // 7483
return this.filter( isHidden ).css( "opacity", 0 ).show() // 7484
// 7485
// animate to the value specified // 7486
.end().animate({ opacity: to }, speed, easing, callback ); // 7487
}, // 7488
animate: function( prop, speed, easing, callback ) { // 7489
var empty = jQuery.isEmptyObject( prop ), // 7490
optall = jQuery.speed( speed, easing, callback ), // 7491
doAnimation = function() { // 7492
// Operate on a copy of prop so per-property easing won't be lost // 7493
var anim = Animation( this, jQuery.extend( {}, prop ), optall ); // 7494
// 7495
// Empty animations, or finishing resolves immediately // 7496
if ( empty || jQuery._data( this, "finish" ) ) { // 7497
anim.stop( true ); // 7498
} // 7499
}; // 7500
doAnimation.finish = doAnimation; // 7501
// 7502
return empty || optall.queue === false ? // 7503
this.each( doAnimation ) : // 7504
this.queue( optall.queue, doAnimation ); // 7505
}, // 7506
stop: function( type, clearQueue, gotoEnd ) { // 7507
var stopQueue = function( hooks ) { // 7508
var stop = hooks.stop; // 7509
delete hooks.stop; // 7510
stop( gotoEnd ); // 7511
}; // 7512
// 7513
if ( typeof type !== "string" ) { // 7514
gotoEnd = clearQueue; // 7515
clearQueue = type; // 7516
type = undefined; // 7517
} // 7518
if ( clearQueue && type !== false ) { // 7519
this.queue( type || "fx", [] ); // 7520
} // 7521
// 7522
return this.each(function() { // 7523
var dequeue = true, // 7524
index = type != null && type + "queueHooks", // 7525
timers = jQuery.timers, // 7526
data = jQuery._data( this ); // 7527
// 7528
if ( index ) { // 7529
if ( data[ index ] && data[ index ].stop ) { // 7530
stopQueue( data[ index ] ); // 7531
} // 7532
} else { // 7533
for ( index in data ) { // 7534
if ( data[ index ] && data[ index ].stop && rrun.test( index ) ) { // 7535
stopQueue( data[ index ] ); // 7536
} // 7537
} // 7538
} // 7539
// 7540
for ( index = timers.length; index--; ) { // 7541
if ( timers[ index ].elem === this && (type == null || timers[ index ].queue === type) ) { // 7542
timers[ index ].anim.stop( gotoEnd ); // 7543
dequeue = false; // 7544
timers.splice( index, 1 ); // 7545
} // 7546
} // 7547
// 7548
// start the next in the queue if the last step wasn't forced // 7549
// timers currently will call their complete callbacks, which will dequeue // 7550
// but only if they were gotoEnd // 7551
if ( dequeue || !gotoEnd ) { // 7552
jQuery.dequeue( this, type ); // 7553
} // 7554
}); // 7555
}, // 7556
finish: function( type ) { // 7557
if ( type !== false ) { // 7558
type = type || "fx"; // 7559
} // 7560
return this.each(function() { // 7561
var index, // 7562
data = jQuery._data( this ), // 7563
queue = data[ type + "queue" ], // 7564
hooks = data[ type + "queueHooks" ], // 7565
timers = jQuery.timers, // 7566
length = queue ? queue.length : 0; // 7567
// 7568
// enable finishing flag on private data // 7569
data.finish = true; // 7570
// 7571
// empty the queue first // 7572
jQuery.queue( this, type, [] ); // 7573
// 7574
if ( hooks && hooks.stop ) { // 7575
hooks.stop.call( this, true ); // 7576
} // 7577
// 7578
// look for any active animations, and finish them // 7579
for ( index = timers.length; index--; ) { // 7580
if ( timers[ index ].elem === this && timers[ index ].queue === type ) { // 7581
timers[ index ].anim.stop( true ); // 7582
timers.splice( index, 1 ); // 7583
} // 7584
} // 7585
// 7586
// look for any animations in the old queue and finish them // 7587
for ( index = 0; index < length; index++ ) { // 7588
if ( queue[ index ] && queue[ index ].finish ) { // 7589
queue[ index ].finish.call( this ); // 7590
} // 7591
} // 7592
// 7593
// turn off finishing flag // 7594
delete data.finish; // 7595
}); // 7596
} // 7597
}); // 7598
// 7599
jQuery.each([ "toggle", "show", "hide" ], function( i, name ) { // 7600
var cssFn = jQuery.fn[ name ]; // 7601
jQuery.fn[ name ] = function( speed, easing, callback ) { // 7602
return speed == null || typeof speed === "boolean" ? // 7603
cssFn.apply( this, arguments ) : // 7604
this.animate( genFx( name, true ), speed, easing, callback ); // 7605
}; // 7606
}); // 7607
// 7608
// Generate shortcuts for custom animations // 7609
jQuery.each({ // 7610
slideDown: genFx("show"), // 7611
slideUp: genFx("hide"), // 7612
slideToggle: genFx("toggle"), // 7613
fadeIn: { opacity: "show" }, // 7614
fadeOut: { opacity: "hide" }, // 7615
fadeToggle: { opacity: "toggle" } // 7616
}, function( name, props ) { // 7617
jQuery.fn[ name ] = function( speed, easing, callback ) { // 7618
return this.animate( props, speed, easing, callback ); // 7619
}; // 7620
}); // 7621
// 7622
jQuery.timers = []; // 7623
jQuery.fx.tick = function() { // 7624
var timer, // 7625
timers = jQuery.timers, // 7626
i = 0; // 7627
// 7628
fxNow = jQuery.now(); // 7629
// 7630
for ( ; i < timers.length; i++ ) { // 7631
timer = timers[ i ]; // 7632
// Checks the timer has not already been removed // 7633
if ( !timer() && timers[ i ] === timer ) { // 7634
timers.splice( i--, 1 ); // 7635
} // 7636
} // 7637
// 7638
if ( !timers.length ) { // 7639
jQuery.fx.stop(); // 7640
} // 7641
fxNow = undefined; // 7642
}; // 7643
// 7644
jQuery.fx.timer = function( timer ) { // 7645
jQuery.timers.push( timer ); // 7646
if ( timer() ) { // 7647
jQuery.fx.start(); // 7648
} else { // 7649
jQuery.timers.pop(); // 7650
} // 7651
}; // 7652
// 7653
jQuery.fx.interval = 13; // 7654
// 7655
jQuery.fx.start = function() { // 7656
if ( !timerId ) { // 7657
timerId = setInterval( jQuery.fx.tick, jQuery.fx.interval ); // 7658
} // 7659
}; // 7660
// 7661
jQuery.fx.stop = function() { // 7662
clearInterval( timerId ); // 7663
timerId = null; // 7664
}; // 7665
// 7666
jQuery.fx.speeds = { // 7667
slow: 600, // 7668
fast: 200, // 7669
// Default speed // 7670
_default: 400 // 7671
}; // 7672
// 7673
// 7674
// Based off of the plugin by Clint Helfers, with permission. // 7675
// http://blindsignals.com/index.php/2009/07/jquery-delay/ // 7676
jQuery.fn.delay = function( time, type ) { // 7677
time = jQuery.fx ? jQuery.fx.speeds[ time ] || time : time; // 7678
type = type || "fx"; // 7679
// 7680
return this.queue( type, function( next, hooks ) { // 7681
var timeout = setTimeout( next, time ); // 7682
hooks.stop = function() { // 7683
clearTimeout( timeout ); // 7684
}; // 7685
}); // 7686
}; // 7687
// 7688
// 7689
(function() { // 7690
// Minified: var a,b,c,d,e // 7691
var input, div, select, a, opt; // 7692
// 7693
// Setup // 7694
div = document.createElement( "div" ); // 7695
div.setAttribute( "className", "t" ); // 7696
div.innerHTML = " a"; // 7697
a = div.getElementsByTagName("a")[ 0 ]; // 7698
// 7699
// First batch of tests. // 7700
select = document.createElement("select"); // 7701
opt = select.appendChild( document.createElement("option") ); // 7702
input = div.getElementsByTagName("input")[ 0 ]; // 7703
// 7704
a.style.cssText = "top:1px"; // 7705
// 7706
// Test setAttribute on camelCase class. If it works, we need attrFixes when doing get/setAttribute (ie6/7) // 7707
support.getSetAttribute = div.className !== "t"; // 7708
// 7709
// Get the style information from getAttribute // 7710
// (IE uses .cssText instead) // 7711
support.style = /top/.test( a.getAttribute("style") ); // 7712
// 7713
// Make sure that URLs aren't manipulated // 7714
// (IE normalizes it by default) // 7715
support.hrefNormalized = a.getAttribute("href") === "/a"; // 7716
// 7717
// Check the default checkbox/radio value ("" on WebKit; "on" elsewhere) // 7718
support.checkOn = !!input.value; // 7719
// 7720
// Make sure that a selected-by-default option has a working selected property. // 7721
// (WebKit defaults to false instead of true, IE too, if it's in an optgroup) // 7722
support.optSelected = opt.selected; // 7723
// 7724
// Tests for enctype support on a form (#6743) // 7725
support.enctype = !!document.createElement("form").enctype; // 7726
// 7727
// Make sure that the options inside disabled selects aren't marked as disabled // 7728
// (WebKit marks them as disabled) // 7729
select.disabled = true; // 7730
support.optDisabled = !opt.disabled; // 7731
// 7732
// Support: IE8 only // 7733
// Check if we can trust getAttribute("value") // 7734
input = document.createElement( "input" ); // 7735
input.setAttribute( "value", "" ); // 7736
support.input = input.getAttribute( "value" ) === ""; // 7737
// 7738
// Check if an input maintains its value after becoming a radio // 7739
input.value = "t"; // 7740
input.setAttribute( "type", "radio" ); // 7741
support.radioValue = input.value === "t"; // 7742
})(); // 7743
// 7744
// 7745
var rreturn = /\r/g; // 7746
// 7747
jQuery.fn.extend({ // 7748
val: function( value ) { // 7749
var hooks, ret, isFunction, // 7750
elem = this[0]; // 7751
// 7752
if ( !arguments.length ) { // 7753
if ( elem ) { // 7754
hooks = jQuery.valHooks[ elem.type ] || jQuery.valHooks[ elem.nodeName.toLowerCase() ]; // 7755
// 7756
if ( hooks && "get" in hooks && (ret = hooks.get( elem, "value" )) !== undefined ) { // 7757
return ret; // 7758
} // 7759
// 7760
ret = elem.value; // 7761
// 7762
return typeof ret === "string" ? // 7763
// handle most common string cases // 7764
ret.replace(rreturn, "") : // 7765
// handle cases where value is null/undef or number // 7766
ret == null ? "" : ret; // 7767
} // 7768
// 7769
return; // 7770
} // 7771
// 7772
isFunction = jQuery.isFunction( value ); // 7773
// 7774
return this.each(function( i ) { // 7775
var val; // 7776
// 7777
if ( this.nodeType !== 1 ) { // 7778
return; // 7779
} // 7780
// 7781
if ( isFunction ) { // 7782
val = value.call( this, i, jQuery( this ).val() ); // 7783
} else { // 7784
val = value; // 7785
} // 7786
// 7787
// Treat null/undefined as ""; convert numbers to string // 7788
if ( val == null ) { // 7789
val = ""; // 7790
} else if ( typeof val === "number" ) { // 7791
val += ""; // 7792
} else if ( jQuery.isArray( val ) ) { // 7793
val = jQuery.map( val, function( value ) { // 7794
return value == null ? "" : value + ""; // 7795
}); // 7796
} // 7797
// 7798
hooks = jQuery.valHooks[ this.type ] || jQuery.valHooks[ this.nodeName.toLowerCase() ]; // 7799
// 7800
// If set returns undefined, fall back to normal setting // 7801
if ( !hooks || !("set" in hooks) || hooks.set( this, val, "value" ) === undefined ) { // 7802
this.value = val; // 7803
} // 7804
}); // 7805
} // 7806
}); // 7807
// 7808
jQuery.extend({ // 7809
valHooks: { // 7810
option: { // 7811
get: function( elem ) { // 7812
var val = jQuery.find.attr( elem, "value" ); // 7813
return val != null ? // 7814
val : // 7815
// Support: IE10-11+ // 7816
// option.text throws exceptions (#14686, #14858) // 7817
jQuery.trim( jQuery.text( elem ) ); // 7818
} // 7819
}, // 7820
select: { // 7821
get: function( elem ) { // 7822
var value, option, // 7823
options = elem.options, // 7824
index = elem.selectedIndex, // 7825
one = elem.type === "select-one" || index < 0, // 7826
values = one ? null : [], // 7827
max = one ? index + 1 : options.length, // 7828
i = index < 0 ? // 7829
max : // 7830
one ? index : 0; // 7831
// 7832
// Loop through all the selected options // 7833
for ( ; i < max; i++ ) { // 7834
option = options[ i ]; // 7835
// 7836
// oldIE doesn't update selected after form reset (#2551) // 7837
if ( ( option.selected || i === index ) && // 7838
// Don't return options that are disabled or in a disabled optgroup // 7839
( support.optDisabled ? !option.disabled : option.getAttribute("disabled") === null ) && // 7840
( !option.parentNode.disabled || !jQuery.nodeName( option.parentNode, "optgroup" ) ) ) { // 7841
// 7842
// Get the specific value for the option // 7843
value = jQuery( option ).val(); // 7844
// 7845
// We don't need an array for one selects // 7846
if ( one ) { // 7847
return value; // 7848
} // 7849
// 7850
// Multi-Selects return an array // 7851
values.push( value ); // 7852
} // 7853
} // 7854
// 7855
return values; // 7856
}, // 7857
// 7858
set: function( elem, value ) { // 7859
var optionSet, option, // 7860
options = elem.options, // 7861
values = jQuery.makeArray( value ), // 7862
i = options.length; // 7863
// 7864
while ( i-- ) { // 7865
option = options[ i ]; // 7866
// 7867
if ( jQuery.inArray( jQuery.valHooks.option.get( option ), values ) >= 0 ) { // 7868
// 7869
// Support: IE6 // 7870
// When new option element is added to select box we need to // 7871
// force reflow of newly added node in order to workaround delay // 7872
// of initialization properties // 7873
try { // 7874
option.selected = optionSet = true; // 7875
// 7876
} catch ( _ ) { // 7877
// 7878
// Will be executed only in IE6 // 7879
option.scrollHeight; // 7880
} // 7881
// 7882
} else { // 7883
option.selected = false; // 7884
} // 7885
} // 7886
// 7887
// Force browsers to behave consistently when non-matching value is set // 7888
if ( !optionSet ) { // 7889
elem.selectedIndex = -1; // 7890
} // 7891
// 7892
return options; // 7893
} // 7894
} // 7895
} // 7896
}); // 7897
// 7898
// Radios and checkboxes getter/setter // 7899
jQuery.each([ "radio", "checkbox" ], function() { // 7900
jQuery.valHooks[ this ] = { // 7901
set: function( elem, value ) { // 7902
if ( jQuery.isArray( value ) ) { // 7903
return ( elem.checked = jQuery.inArray( jQuery(elem).val(), value ) >= 0 ); // 7904
} // 7905
} // 7906
}; // 7907
if ( !support.checkOn ) { // 7908
jQuery.valHooks[ this ].get = function( elem ) { // 7909
// Support: Webkit // 7910
// "" is returned instead of "on" if a value isn't specified // 7911
return elem.getAttribute("value") === null ? "on" : elem.value; // 7912
}; // 7913
} // 7914
}); // 7915
// 7916
// 7917
// 7918
// 7919
var nodeHook, boolHook, // 7920
attrHandle = jQuery.expr.attrHandle, // 7921
ruseDefault = /^(?:checked|selected)$/i, // 7922
getSetAttribute = support.getSetAttribute, // 7923
getSetInput = support.input; // 7924
// 7925
jQuery.fn.extend({ // 7926
attr: function( name, value ) { // 7927
return access( this, jQuery.attr, name, value, arguments.length > 1 ); // 7928
}, // 7929
// 7930
removeAttr: function( name ) { // 7931
return this.each(function() { // 7932
jQuery.removeAttr( this, name ); // 7933
}); // 7934
} // 7935
}); // 7936
// 7937
jQuery.extend({ // 7938
attr: function( elem, name, value ) { // 7939
var hooks, ret, // 7940
nType = elem.nodeType; // 7941
// 7942
// don't get/set attributes on text, comment and attribute nodes // 7943
if ( !elem || nType === 3 || nType === 8 || nType === 2 ) { // 7944
return; // 7945
} // 7946
// 7947
// Fallback to prop when attributes are not supported // 7948
if ( typeof elem.getAttribute === strundefined ) { // 7949
return jQuery.prop( elem, name, value ); // 7950
} // 7951
// 7952
// All attributes are lowercase // 7953
// Grab necessary hook if one is defined // 7954
if ( nType !== 1 || !jQuery.isXMLDoc( elem ) ) { // 7955
name = name.toLowerCase(); // 7956
hooks = jQuery.attrHooks[ name ] || // 7957
( jQuery.expr.match.bool.test( name ) ? boolHook : nodeHook ); // 7958
} // 7959
// 7960
if ( value !== undefined ) { // 7961
// 7962
if ( value === null ) { // 7963
jQuery.removeAttr( elem, name ); // 7964
// 7965
} else if ( hooks && "set" in hooks && (ret = hooks.set( elem, value, name )) !== undefined ) { // 7966
return ret; // 7967
// 7968
} else { // 7969
elem.setAttribute( name, value + "" ); // 7970
return value; // 7971
} // 7972
// 7973
} else if ( hooks && "get" in hooks && (ret = hooks.get( elem, name )) !== null ) { // 7974
return ret; // 7975
// 7976
} else { // 7977
ret = jQuery.find.attr( elem, name ); // 7978
// 7979
// Non-existent attributes return null, we normalize to undefined // 7980
return ret == null ? // 7981
undefined : // 7982
ret; // 7983
} // 7984
}, // 7985
// 7986
removeAttr: function( elem, value ) { // 7987
var name, propName, // 7988
i = 0, // 7989
attrNames = value && value.match( rnotwhite ); // 7990
// 7991
if ( attrNames && elem.nodeType === 1 ) { // 7992
while ( (name = attrNames[i++]) ) { // 7993
propName = jQuery.propFix[ name ] || name; // 7994
// 7995
// Boolean attributes get special treatment (#10870) // 7996
if ( jQuery.expr.match.bool.test( name ) ) { // 7997
// Set corresponding property to false // 7998
if ( getSetInput && getSetAttribute || !ruseDefault.test( name ) ) { // 7999
elem[ propName ] = false; // 8000
// Support: IE<9 // 8001
// Also clear defaultChecked/defaultSelected (if appropriate) // 8002
} else { // 8003
elem[ jQuery.camelCase( "default-" + name ) ] = // 8004
elem[ propName ] = false; // 8005
} // 8006
// 8007
// See #9699 for explanation of this approach (setting first, then removal) // 8008
} else { // 8009
jQuery.attr( elem, name, "" ); // 8010
} // 8011
// 8012
elem.removeAttribute( getSetAttribute ? name : propName ); // 8013
} // 8014
} // 8015
}, // 8016
// 8017
attrHooks: { // 8018
type: { // 8019
set: function( elem, value ) { // 8020
if ( !support.radioValue && value === "radio" && jQuery.nodeName(elem, "input") ) { // 8021
// Setting the type on a radio button after the value resets the value in IE6-9 // 8022
// Reset value to default in case type is set after value during creation // 8023
var val = elem.value; // 8024
elem.setAttribute( "type", value ); // 8025
if ( val ) { // 8026
elem.value = val; // 8027
} // 8028
return value; // 8029
} // 8030
} // 8031
} // 8032
} // 8033
}); // 8034
// 8035
// Hook for boolean attributes // 8036
boolHook = { // 8037
set: function( elem, value, name ) { // 8038
if ( value === false ) { // 8039
// Remove boolean attributes when set to false // 8040
jQuery.removeAttr( elem, name ); // 8041
} else if ( getSetInput && getSetAttribute || !ruseDefault.test( name ) ) { // 8042
// IE<8 needs the *property* name // 8043
elem.setAttribute( !getSetAttribute && jQuery.propFix[ name ] || name, name ); // 8044
// 8045
// Use defaultChecked and defaultSelected for oldIE // 8046
} else { // 8047
elem[ jQuery.camelCase( "default-" + name ) ] = elem[ name ] = true; // 8048
} // 8049
// 8050
return name; // 8051
} // 8052
}; // 8053
// 8054
// Retrieve booleans specially // 8055
jQuery.each( jQuery.expr.match.bool.source.match( /\w+/g ), function( i, name ) { // 8056
// 8057
var getter = attrHandle[ name ] || jQuery.find.attr; // 8058
// 8059
attrHandle[ name ] = getSetInput && getSetAttribute || !ruseDefault.test( name ) ? // 8060
function( elem, name, isXML ) { // 8061
var ret, handle; // 8062
if ( !isXML ) { // 8063
// Avoid an infinite loop by temporarily removing this function from the getter // 8064
handle = attrHandle[ name ]; // 8065
attrHandle[ name ] = ret; // 8066
ret = getter( elem, name, isXML ) != null ? // 8067
name.toLowerCase() : // 8068
null; // 8069
attrHandle[ name ] = handle; // 8070
} // 8071
return ret; // 8072
} : // 8073
function( elem, name, isXML ) { // 8074
if ( !isXML ) { // 8075
return elem[ jQuery.camelCase( "default-" + name ) ] ? // 8076
name.toLowerCase() : // 8077
null; // 8078
} // 8079
}; // 8080
}); // 8081
// 8082
// fix oldIE attroperties // 8083
if ( !getSetInput || !getSetAttribute ) { // 8084
jQuery.attrHooks.value = { // 8085
set: function( elem, value, name ) { // 8086
if ( jQuery.nodeName( elem, "input" ) ) { // 8087
// Does not return so that setAttribute is also used // 8088
elem.defaultValue = value; // 8089
} else { // 8090
// Use nodeHook if defined (#1954); otherwise setAttribute is fine // 8091
return nodeHook && nodeHook.set( elem, value, name ); // 8092
} // 8093
} // 8094
}; // 8095
} // 8096
// 8097
// IE6/7 do not support getting/setting some attributes with get/setAttribute // 8098
if ( !getSetAttribute ) { // 8099
// 8100
// Use this for any attribute in IE6/7 // 8101
// This fixes almost every IE6/7 issue // 8102
nodeHook = { // 8103
set: function( elem, value, name ) { // 8104
// Set the existing or create a new attribute node // 8105
var ret = elem.getAttributeNode( name ); // 8106
if ( !ret ) { // 8107
elem.setAttributeNode( // 8108
(ret = elem.ownerDocument.createAttribute( name )) // 8109
); // 8110
} // 8111
// 8112
ret.value = value += ""; // 8113
// 8114
// Break association with cloned elements by also using setAttribute (#9646) // 8115
if ( name === "value" || value === elem.getAttribute( name ) ) { // 8116
return value; // 8117
} // 8118
} // 8119
}; // 8120
// 8121
// Some attributes are constructed with empty-string values when not defined // 8122
attrHandle.id = attrHandle.name = attrHandle.coords = // 8123
function( elem, name, isXML ) { // 8124
var ret; // 8125
if ( !isXML ) { // 8126
return (ret = elem.getAttributeNode( name )) && ret.value !== "" ? // 8127
ret.value : // 8128
null; // 8129
} // 8130
}; // 8131
// 8132
// Fixing value retrieval on a button requires this module // 8133
jQuery.valHooks.button = { // 8134
get: function( elem, name ) { // 8135
var ret = elem.getAttributeNode( name ); // 8136
if ( ret && ret.specified ) { // 8137
return ret.value; // 8138
} // 8139
}, // 8140
set: nodeHook.set // 8141
}; // 8142
// 8143
// Set contenteditable to false on removals(#10429) // 8144
// Setting to empty string throws an error as an invalid value // 8145
jQuery.attrHooks.contenteditable = { // 8146
set: function( elem, value, name ) { // 8147
nodeHook.set( elem, value === "" ? false : value, name ); // 8148
} // 8149
}; // 8150
// 8151
// Set width and height to auto instead of 0 on empty string( Bug #8150 ) // 8152
// This is for removals // 8153
jQuery.each([ "width", "height" ], function( i, name ) { // 8154
jQuery.attrHooks[ name ] = { // 8155
set: function( elem, value ) { // 8156
if ( value === "" ) { // 8157
elem.setAttribute( name, "auto" ); // 8158
return value; // 8159
} // 8160
} // 8161
}; // 8162
}); // 8163
} // 8164
// 8165
if ( !support.style ) { // 8166
jQuery.attrHooks.style = { // 8167
get: function( elem ) { // 8168
// Return undefined in the case of empty string // 8169
// Note: IE uppercases css property names, but if we were to .toLowerCase() // 8170
// .cssText, that would destroy case senstitivity in URL's, like in "background" // 8171
return elem.style.cssText || undefined; // 8172
}, // 8173
set: function( elem, value ) { // 8174
return ( elem.style.cssText = value + "" ); // 8175
} // 8176
}; // 8177
} // 8178
// 8179
// 8180
// 8181
// 8182
var rfocusable = /^(?:input|select|textarea|button|object)$/i, // 8183
rclickable = /^(?:a|area)$/i; // 8184
// 8185
jQuery.fn.extend({ // 8186
prop: function( name, value ) { // 8187
return access( this, jQuery.prop, name, value, arguments.length > 1 ); // 8188
}, // 8189
// 8190
removeProp: function( name ) { // 8191
name = jQuery.propFix[ name ] || name; // 8192
return this.each(function() { // 8193
// try/catch handles cases where IE balks (such as removing a property on window) // 8194
try { // 8195
this[ name ] = undefined; // 8196
delete this[ name ]; // 8197
} catch( e ) {} // 8198
}); // 8199
} // 8200
}); // 8201
// 8202
jQuery.extend({ // 8203
propFix: { // 8204
"for": "htmlFor", // 8205
"class": "className" // 8206
}, // 8207
// 8208
prop: function( elem, name, value ) { // 8209
var ret, hooks, notxml, // 8210
nType = elem.nodeType; // 8211
// 8212
// don't get/set properties on text, comment and attribute nodes // 8213
if ( !elem || nType === 3 || nType === 8 || nType === 2 ) { // 8214
return; // 8215
} // 8216
// 8217
notxml = nType !== 1 || !jQuery.isXMLDoc( elem ); // 8218
// 8219
if ( notxml ) { // 8220
// Fix name and attach hooks // 8221
name = jQuery.propFix[ name ] || name; // 8222
hooks = jQuery.propHooks[ name ]; // 8223
} // 8224
// 8225
if ( value !== undefined ) { // 8226
return hooks && "set" in hooks && (ret = hooks.set( elem, value, name )) !== undefined ? // 8227
ret : // 8228
( elem[ name ] = value ); // 8229
// 8230
} else { // 8231
return hooks && "get" in hooks && (ret = hooks.get( elem, name )) !== null ? // 8232
ret : // 8233
elem[ name ]; // 8234
} // 8235
}, // 8236
// 8237
propHooks: { // 8238
tabIndex: { // 8239
get: function( elem ) { // 8240
// elem.tabIndex doesn't always return the correct value when it hasn't been explicitly set // 8241
// http://fluidproject.org/blog/2008/01/09/getting-setting-and-removing-tabindex-values-with-javascript/ // 8242
// Use proper attribute retrieval(#12072) // 8243
var tabindex = jQuery.find.attr( elem, "tabindex" ); // 8244
// 8245
return tabindex ? // 8246
parseInt( tabindex, 10 ) : // 8247
rfocusable.test( elem.nodeName ) || rclickable.test( elem.nodeName ) && elem.href ? // 8248
0 : // 8249
-1; // 8250
} // 8251
} // 8252
} // 8253
}); // 8254
// 8255
// Some attributes require a special call on IE // 8256
// http://msdn.microsoft.com/en-us/library/ms536429%28VS.85%29.aspx // 8257
if ( !support.hrefNormalized ) { // 8258
// href/src property should get the full normalized URL (#10299/#12915) // 8259
jQuery.each([ "href", "src" ], function( i, name ) { // 8260
jQuery.propHooks[ name ] = { // 8261
get: function( elem ) { // 8262
return elem.getAttribute( name, 4 ); // 8263
} // 8264
}; // 8265
}); // 8266
} // 8267
// 8268
// Support: Safari, IE9+ // 8269
// mis-reports the default selected property of an option // 8270
// Accessing the parent's selectedIndex property fixes it // 8271
if ( !support.optSelected ) { // 8272
jQuery.propHooks.selected = { // 8273
get: function( elem ) { // 8274
var parent = elem.parentNode; // 8275
// 8276
if ( parent ) { // 8277
parent.selectedIndex; // 8278
// 8279
// Make sure that it also works with optgroups, see #5701 // 8280
if ( parent.parentNode ) { // 8281
parent.parentNode.selectedIndex; // 8282
} // 8283
} // 8284
return null; // 8285
} // 8286
}; // 8287
} // 8288
// 8289
jQuery.each([ // 8290
"tabIndex", // 8291
"readOnly", // 8292
"maxLength", // 8293
"cellSpacing", // 8294
"cellPadding", // 8295
"rowSpan", // 8296
"colSpan", // 8297
"useMap", // 8298
"frameBorder", // 8299
"contentEditable" // 8300
], function() { // 8301
jQuery.propFix[ this.toLowerCase() ] = this; // 8302
}); // 8303
// 8304
// IE6/7 call enctype encoding // 8305
if ( !support.enctype ) { // 8306
jQuery.propFix.enctype = "encoding"; // 8307
} // 8308
// 8309
// 8310
// 8311
// 8312
var rclass = /[\t\r\n\f]/g; // 8313
// 8314
jQuery.fn.extend({ // 8315
addClass: function( value ) { // 8316
var classes, elem, cur, clazz, j, finalValue, // 8317
i = 0, // 8318
len = this.length, // 8319
proceed = typeof value === "string" && value; // 8320
// 8321
if ( jQuery.isFunction( value ) ) { // 8322
return this.each(function( j ) { // 8323
jQuery( this ).addClass( value.call( this, j, this.className ) ); // 8324
}); // 8325
} // 8326
// 8327
if ( proceed ) { // 8328
// The disjunction here is for better compressibility (see removeClass) // 8329
classes = ( value || "" ).match( rnotwhite ) || []; // 8330
// 8331
for ( ; i < len; i++ ) { // 8332
elem = this[ i ]; // 8333
cur = elem.nodeType === 1 && ( elem.className ? // 8334
( " " + elem.className + " " ).replace( rclass, " " ) : // 8335
" " // 8336
); // 8337
// 8338
if ( cur ) { // 8339
j = 0; // 8340
while ( (clazz = classes[j++]) ) { // 8341
if ( cur.indexOf( " " + clazz + " " ) < 0 ) { // 8342
cur += clazz + " "; // 8343
} // 8344
} // 8345
// 8346
// only assign if different to avoid unneeded rendering. // 8347
finalValue = jQuery.trim( cur ); // 8348
if ( elem.className !== finalValue ) { // 8349
elem.className = finalValue; // 8350
} // 8351
} // 8352
} // 8353
} // 8354
// 8355
return this; // 8356
}, // 8357
// 8358
removeClass: function( value ) { // 8359
var classes, elem, cur, clazz, j, finalValue, // 8360
i = 0, // 8361
len = this.length, // 8362
proceed = arguments.length === 0 || typeof value === "string" && value; // 8363
// 8364
if ( jQuery.isFunction( value ) ) { // 8365
return this.each(function( j ) { // 8366
jQuery( this ).removeClass( value.call( this, j, this.className ) ); // 8367
}); // 8368
} // 8369
if ( proceed ) { // 8370
classes = ( value || "" ).match( rnotwhite ) || []; // 8371
// 8372
for ( ; i < len; i++ ) { // 8373
elem = this[ i ]; // 8374
// This expression is here for better compressibility (see addClass) // 8375
cur = elem.nodeType === 1 && ( elem.className ? // 8376
( " " + elem.className + " " ).replace( rclass, " " ) : // 8377
"" // 8378
); // 8379
// 8380
if ( cur ) { // 8381
j = 0; // 8382
while ( (clazz = classes[j++]) ) { // 8383
// Remove *all* instances // 8384
while ( cur.indexOf( " " + clazz + " " ) >= 0 ) { // 8385
cur = cur.replace( " " + clazz + " ", " " ); // 8386
} // 8387
} // 8388
// 8389
// only assign if different to avoid unneeded rendering. // 8390
finalValue = value ? jQuery.trim( cur ) : ""; // 8391
if ( elem.className !== finalValue ) { // 8392
elem.className = finalValue; // 8393
} // 8394
} // 8395
} // 8396
} // 8397
// 8398
return this; // 8399
}, // 8400
// 8401
toggleClass: function( value, stateVal ) { // 8402
var type = typeof value; // 8403
// 8404
if ( typeof stateVal === "boolean" && type === "string" ) { // 8405
return stateVal ? this.addClass( value ) : this.removeClass( value ); // 8406
} // 8407
// 8408
if ( jQuery.isFunction( value ) ) { // 8409
return this.each(function( i ) { // 8410
jQuery( this ).toggleClass( value.call(this, i, this.className, stateVal), stateVal ); // 8411
}); // 8412
} // 8413
// 8414
return this.each(function() { // 8415
if ( type === "string" ) { // 8416
// toggle individual class names // 8417
var className, // 8418
i = 0, // 8419
self = jQuery( this ), // 8420
classNames = value.match( rnotwhite ) || []; // 8421
// 8422
while ( (className = classNames[ i++ ]) ) { // 8423
// check each className given, space separated list // 8424
if ( self.hasClass( className ) ) { // 8425
self.removeClass( className ); // 8426
} else { // 8427
self.addClass( className ); // 8428
} // 8429
} // 8430
// 8431
// Toggle whole class name // 8432
} else if ( type === strundefined || type === "boolean" ) { // 8433
if ( this.className ) { // 8434
// store className if set // 8435
jQuery._data( this, "__className__", this.className ); // 8436
} // 8437
// 8438
// If the element has a class name or if we're passed "false", // 8439
// then remove the whole classname (if there was one, the above saved it). // 8440
// Otherwise bring back whatever was previously saved (if anything), // 8441
// falling back to the empty string if nothing was stored. // 8442
this.className = this.className || value === false ? "" : jQuery._data( this, "__className__" ) || ""; // 8443
} // 8444
}); // 8445
}, // 8446
// 8447
hasClass: function( selector ) { // 8448
var className = " " + selector + " ", // 8449
i = 0, // 8450
l = this.length; // 8451
for ( ; i < l; i++ ) { // 8452
if ( this[i].nodeType === 1 && (" " + this[i].className + " ").replace(rclass, " ").indexOf( className ) >= 0 ) { // 8453
return true; // 8454
} // 8455
} // 8456
// 8457
return false; // 8458
} // 8459
}); // 8460
// 8461
// 8462
// 8463
// 8464
// Return jQuery for attributes-only inclusion // 8465
// 8466
// 8467
jQuery.each( ("blur focus focusin focusout load resize scroll unload click dblclick " + // 8468
"mousedown mouseup mousemove mouseover mouseout mouseenter mouseleave " + // 8469
"change select submit keydown keypress keyup error contextmenu").split(" "), function( i, name ) { // 8470
// 8471
// Handle event binding // 8472
jQuery.fn[ name ] = function( data, fn ) { // 8473
return arguments.length > 0 ? // 8474
this.on( name, null, data, fn ) : // 8475
this.trigger( name ); // 8476
}; // 8477
}); // 8478
// 8479
jQuery.fn.extend({ // 8480
hover: function( fnOver, fnOut ) { // 8481
return this.mouseenter( fnOver ).mouseleave( fnOut || fnOver ); // 8482
}, // 8483
// 8484
bind: function( types, data, fn ) { // 8485
return this.on( types, null, data, fn ); // 8486
}, // 8487
unbind: function( types, fn ) { // 8488
return this.off( types, null, fn ); // 8489
}, // 8490
// 8491
delegate: function( selector, types, data, fn ) { // 8492
return this.on( types, selector, data, fn ); // 8493
}, // 8494
undelegate: function( selector, types, fn ) { // 8495
// ( namespace ) or ( selector, types [, fn] ) // 8496
return arguments.length === 1 ? this.off( selector, "**" ) : this.off( types, selector || "**", fn ); // 8497
} // 8498
}); // 8499
// 8500
// 8501
var nonce = jQuery.now(); // 8502
// 8503
var rquery = (/\?/); // 8504
// 8505
// 8506
// 8507
var rvalidtokens = /(,)|(\[|{)|(}|])|"(?:[^"\\\r\n]|\\["\\\/bfnrt]|\\u[\da-fA-F]{4})*"\s*:?|true|false|null|-?(?!0\d)\d+(?:\.\d+|)(?:[eE][+-]?\d+|)/g;
// 8509
jQuery.parseJSON = function( data ) { // 8510
// Attempt to parse using the native JSON parser first // 8511
if ( window.JSON && window.JSON.parse ) { // 8512
// Support: Android 2.3 // 8513
// Workaround failure to string-cast null input // 8514
return window.JSON.parse( data + "" ); // 8515
} // 8516
// 8517
var requireNonComma, // 8518
depth = null, // 8519
str = jQuery.trim( data + "" ); // 8520
// 8521
// Guard against invalid (and possibly dangerous) input by ensuring that nothing remains // 8522
// after removing valid tokens // 8523
return str && !jQuery.trim( str.replace( rvalidtokens, function( token, comma, open, close ) { // 8524
// 8525
// Force termination if we see a misplaced comma // 8526
if ( requireNonComma && comma ) { // 8527
depth = 0; // 8528
} // 8529
// 8530
// Perform no more replacements after returning to outermost depth // 8531
if ( depth === 0 ) { // 8532
return token; // 8533
} // 8534
// 8535
// Commas must not follow "[", "{", or "," // 8536
requireNonComma = open || comma; // 8537
// 8538
// Determine new depth // 8539
// array/object open ("[" or "{"): depth += true - false (increment) // 8540
// array/object close ("]" or "}"): depth += false - true (decrement) // 8541
// other cases ("," or primitive): depth += true - true (numeric cast) // 8542
depth += !close - !open; // 8543
// 8544
// Remove this token // 8545
return ""; // 8546
}) ) ? // 8547
( Function( "return " + str ) )() : // 8548
jQuery.error( "Invalid JSON: " + data ); // 8549
}; // 8550
// 8551
// 8552
// Cross-browser xml parsing // 8553
jQuery.parseXML = function( data ) { // 8554
var xml, tmp; // 8555
if ( !data || typeof data !== "string" ) { // 8556
return null; // 8557
} // 8558
try { // 8559
if ( window.DOMParser ) { // Standard // 8560
tmp = new DOMParser(); // 8561
xml = tmp.parseFromString( data, "text/xml" ); // 8562
} else { // IE // 8563
xml = new ActiveXObject( "Microsoft.XMLDOM" ); // 8564
xml.async = "false"; // 8565
xml.loadXML( data ); // 8566
} // 8567
} catch( e ) { // 8568
xml = undefined; // 8569
} // 8570
if ( !xml || !xml.documentElement || xml.getElementsByTagName( "parsererror" ).length ) { // 8571
jQuery.error( "Invalid XML: " + data ); // 8572
} // 8573
return xml; // 8574
}; // 8575
// 8576
// 8577
var // 8578
// Document location // 8579
ajaxLocParts, // 8580
ajaxLocation, // 8581
// 8582
rhash = /#.*$/, // 8583
rts = /([?&])_=[^&]*/, // 8584
rheaders = /^(.*?):[ \t]*([^\r\n]*)\r?$/mg, // IE leaves an \r character at EOL // 8585
// #7653, #8125, #8152: local protocol detection // 8586
rlocalProtocol = /^(?:about|app|app-storage|.+-extension|file|res|widget):$/, // 8587
rnoContent = /^(?:GET|HEAD)$/, // 8588
rprotocol = /^\/\//, // 8589
rurl = /^([\w.+-]+:)(?:\/\/(?:[^\/?#]*@|)([^\/?#:]*)(?::(\d+)|)|)/, // 8590
// 8591
/* Prefilters // 8592
* 1) They are useful to introduce custom dataTypes (see ajax/jsonp.js for an example) // 8593
* 2) These are called: // 8594
* - BEFORE asking for a transport // 8595
* - AFTER param serialization (s.data is a string if s.processData is true) // 8596
* 3) key is the dataType // 8597
* 4) the catchall symbol "*" can be used // 8598
* 5) execution will start with transport dataType and THEN continue down to "*" if needed // 8599
*/ // 8600
prefilters = {}, // 8601
// 8602
/* Transports bindings // 8603
* 1) key is the dataType // 8604
* 2) the catchall symbol "*" can be used // 8605
* 3) selection will start with transport dataType and THEN go to "*" if needed // 8606
*/ // 8607
transports = {}, // 8608
// 8609
// Avoid comment-prolog char sequence (#10098); must appease lint and evade compression // 8610
allTypes = "*/".concat("*"); // 8611
// 8612
// #8138, IE may throw an exception when accessing // 8613
// a field from window.location if document.domain has been set // 8614
try { // 8615
ajaxLocation = location.href; // 8616
} catch( e ) { // 8617
// Use the href attribute of an A element // 8618
// since IE will modify it given document.location // 8619
ajaxLocation = document.createElement( "a" ); // 8620
ajaxLocation.href = ""; // 8621
ajaxLocation = ajaxLocation.href; // 8622
} // 8623
// 8624
// Segment location into parts // 8625
ajaxLocParts = rurl.exec( ajaxLocation.toLowerCase() ) || []; // 8626
// 8627
// Base "constructor" for jQuery.ajaxPrefilter and jQuery.ajaxTransport // 8628
function addToPrefiltersOrTransports( structure ) { // 8629
// 8630
// dataTypeExpression is optional and defaults to "*" // 8631
return function( dataTypeExpression, func ) { // 8632
// 8633
if ( typeof dataTypeExpression !== "string" ) { // 8634
func = dataTypeExpression; // 8635
dataTypeExpression = "*"; // 8636
} // 8637
// 8638
var dataType, // 8639
i = 0, // 8640
dataTypes = dataTypeExpression.toLowerCase().match( rnotwhite ) || []; // 8641
// 8642
if ( jQuery.isFunction( func ) ) { // 8643
// For each dataType in the dataTypeExpression // 8644
while ( (dataType = dataTypes[i++]) ) { // 8645
// Prepend if requested // 8646
if ( dataType.charAt( 0 ) === "+" ) { // 8647
dataType = dataType.slice( 1 ) || "*"; // 8648
(structure[ dataType ] = structure[ dataType ] || []).unshift( func ); // 8649
// 8650
// Otherwise append // 8651
} else { // 8652
(structure[ dataType ] = structure[ dataType ] || []).push( func ); // 8653
} // 8654
} // 8655
} // 8656
}; // 8657
} // 8658
// 8659
// Base inspection function for prefilters and transports // 8660
function inspectPrefiltersOrTransports( structure, options, originalOptions, jqXHR ) { // 8661
// 8662
var inspected = {}, // 8663
seekingTransport = ( structure === transports ); // 8664
// 8665
function inspect( dataType ) { // 8666
var selected; // 8667
inspected[ dataType ] = true; // 8668
jQuery.each( structure[ dataType ] || [], function( _, prefilterOrFactory ) { // 8669
var dataTypeOrTransport = prefilterOrFactory( options, originalOptions, jqXHR ); // 8670
if ( typeof dataTypeOrTransport === "string" && !seekingTransport && !inspected[ dataTypeOrTransport ] ) { // 8671
options.dataTypes.unshift( dataTypeOrTransport ); // 8672
inspect( dataTypeOrTransport ); // 8673
return false; // 8674
} else if ( seekingTransport ) { // 8675
return !( selected = dataTypeOrTransport ); // 8676
} // 8677
}); // 8678
return selected; // 8679
} // 8680
// 8681
return inspect( options.dataTypes[ 0 ] ) || !inspected[ "*" ] && inspect( "*" ); // 8682
} // 8683
// 8684
// A special extend for ajax options // 8685
// that takes "flat" options (not to be deep extended) // 8686
// Fixes #9887 // 8687
function ajaxExtend( target, src ) { // 8688
var deep, key, // 8689
flatOptions = jQuery.ajaxSettings.flatOptions || {}; // 8690
// 8691
for ( key in src ) { // 8692
if ( src[ key ] !== undefined ) { // 8693
( flatOptions[ key ] ? target : ( deep || (deep = {}) ) )[ key ] = src[ key ]; // 8694
} // 8695
} // 8696
if ( deep ) { // 8697
jQuery.extend( true, target, deep ); // 8698
} // 8699
// 8700
return target; // 8701
} // 8702
// 8703
/* Handles responses to an ajax request: // 8704
* - finds the right dataType (mediates between content-type and expected dataType) // 8705
* - returns the corresponding response // 8706
*/ // 8707
function ajaxHandleResponses( s, jqXHR, responses ) { // 8708
var firstDataType, ct, finalDataType, type, // 8709
contents = s.contents, // 8710
dataTypes = s.dataTypes; // 8711
// 8712
// Remove auto dataType and get content-type in the process // 8713
while ( dataTypes[ 0 ] === "*" ) { // 8714
dataTypes.shift(); // 8715
if ( ct === undefined ) { // 8716
ct = s.mimeType || jqXHR.getResponseHeader("Content-Type"); // 8717
} // 8718
} // 8719
// 8720
// Check if we're dealing with a known content-type // 8721
if ( ct ) { // 8722
for ( type in contents ) { // 8723
if ( contents[ type ] && contents[ type ].test( ct ) ) { // 8724
dataTypes.unshift( type ); // 8725
break; // 8726
} // 8727
} // 8728
} // 8729
// 8730
// Check to see if we have a response for the expected dataType // 8731
if ( dataTypes[ 0 ] in responses ) { // 8732
finalDataType = dataTypes[ 0 ]; // 8733
} else { // 8734
// Try convertible dataTypes // 8735
for ( type in responses ) { // 8736
if ( !dataTypes[ 0 ] || s.converters[ type + " " + dataTypes[0] ] ) { // 8737
finalDataType = type; // 8738
break; // 8739
} // 8740
if ( !firstDataType ) { // 8741
firstDataType = type; // 8742
} // 8743
} // 8744
// Or just use first one // 8745
finalDataType = finalDataType || firstDataType; // 8746
} // 8747
// 8748
// If we found a dataType // 8749
// We add the dataType to the list if needed // 8750
// and return the corresponding response // 8751
if ( finalDataType ) { // 8752
if ( finalDataType !== dataTypes[ 0 ] ) { // 8753
dataTypes.unshift( finalDataType ); // 8754
} // 8755
return responses[ finalDataType ]; // 8756
} // 8757
} // 8758
// 8759
/* Chain conversions given the request and the original response // 8760
* Also sets the responseXXX fields on the jqXHR instance // 8761
*/ // 8762
function ajaxConvert( s, response, jqXHR, isSuccess ) { // 8763
var conv2, current, conv, tmp, prev, // 8764
converters = {}, // 8765
// Work with a copy of dataTypes in case we need to modify it for conversion // 8766
dataTypes = s.dataTypes.slice(); // 8767
// 8768
// Create converters map with lowercased keys // 8769
if ( dataTypes[ 1 ] ) { // 8770
for ( conv in s.converters ) { // 8771
converters[ conv.toLowerCase() ] = s.converters[ conv ]; // 8772
} // 8773
} // 8774
// 8775
current = dataTypes.shift(); // 8776
// 8777
// Convert to each sequential dataType // 8778
while ( current ) { // 8779
// 8780
if ( s.responseFields[ current ] ) { // 8781
jqXHR[ s.responseFields[ current ] ] = response; // 8782
} // 8783
// 8784
// Apply the dataFilter if provided // 8785
if ( !prev && isSuccess && s.dataFilter ) { // 8786
response = s.dataFilter( response, s.dataType ); // 8787
} // 8788
// 8789
prev = current; // 8790
current = dataTypes.shift(); // 8791
// 8792
if ( current ) { // 8793
// 8794
// There's only work to do if current dataType is non-auto // 8795
if ( current === "*" ) { // 8796
// 8797
current = prev; // 8798
// 8799
// Convert response if prev dataType is non-auto and differs from current // 8800
} else if ( prev !== "*" && prev !== current ) { // 8801
// 8802
// Seek a direct converter // 8803
conv = converters[ prev + " " + current ] || converters[ "* " + current ]; // 8804
// 8805
// If none found, seek a pair // 8806
if ( !conv ) { // 8807
for ( conv2 in converters ) { // 8808
// 8809
// If conv2 outputs current // 8810
tmp = conv2.split( " " ); // 8811
if ( tmp[ 1 ] === current ) { // 8812
// 8813
// If prev can be converted to accepted input // 8814
conv = converters[ prev + " " + tmp[ 0 ] ] || // 8815
converters[ "* " + tmp[ 0 ] ]; // 8816
if ( conv ) { // 8817
// Condense equivalence converters // 8818
if ( conv === true ) { // 8819
conv = converters[ conv2 ]; // 8820
// 8821
// Otherwise, insert the intermediate dataType // 8822
} else if ( converters[ conv2 ] !== true ) { // 8823
current = tmp[ 0 ]; // 8824
dataTypes.unshift( tmp[ 1 ] ); // 8825
} // 8826
break; // 8827
} // 8828
} // 8829
} // 8830
} // 8831
// 8832
// Apply converter (if not an equivalence) // 8833
if ( conv !== true ) { // 8834
// 8835
// Unless errors are allowed to bubble, catch and return them // 8836
if ( conv && s[ "throws" ] ) { // 8837
response = conv( response ); // 8838
} else { // 8839
try { // 8840
response = conv( response ); // 8841
} catch ( e ) { // 8842
return { state: "parsererror", error: conv ? e : "No conversion from " + prev + " to " + current }; // 8843
} // 8844
} // 8845
} // 8846
} // 8847
} // 8848
} // 8849
// 8850
return { state: "success", data: response }; // 8851
} // 8852
// 8853
jQuery.extend({ // 8854
// 8855
// Counter for holding the number of active queries // 8856
active: 0, // 8857
// 8858
// Last-Modified header cache for next request // 8859
lastModified: {}, // 8860
etag: {}, // 8861
// 8862
ajaxSettings: { // 8863
url: ajaxLocation, // 8864
type: "GET", // 8865
isLocal: rlocalProtocol.test( ajaxLocParts[ 1 ] ), // 8866
global: true, // 8867
processData: true, // 8868
async: true, // 8869
contentType: "application/x-www-form-urlencoded; charset=UTF-8", // 8870
/* // 8871
timeout: 0, // 8872
data: null, // 8873
dataType: null, // 8874
username: null, // 8875
password: null, // 8876
cache: null, // 8877
throws: false, // 8878
traditional: false, // 8879
headers: {}, // 8880
*/ // 8881
// 8882
accepts: { // 8883
"*": allTypes, // 8884
text: "text/plain", // 8885
html: "text/html", // 8886
xml: "application/xml, text/xml", // 8887
json: "application/json, text/javascript" // 8888
}, // 8889
// 8890
contents: { // 8891
xml: /xml/, // 8892
html: /html/, // 8893
json: /json/ // 8894
}, // 8895
// 8896
responseFields: { // 8897
xml: "responseXML", // 8898
text: "responseText", // 8899
json: "responseJSON" // 8900
}, // 8901
// 8902
// Data converters // 8903
// Keys separate source (or catchall "*") and destination types with a single space // 8904
converters: { // 8905
// 8906
// Convert anything to text // 8907
"* text": String, // 8908
// 8909
// Text to html (true = no transformation) // 8910
"text html": true, // 8911
// 8912
// Evaluate text as a json expression // 8913
"text json": jQuery.parseJSON, // 8914
// 8915
// Parse text as xml // 8916
"text xml": jQuery.parseXML // 8917
}, // 8918
// 8919
// For options that shouldn't be deep extended: // 8920
// you can add your own custom options here if // 8921
// and when you create one that shouldn't be // 8922
// deep extended (see ajaxExtend) // 8923
flatOptions: { // 8924
url: true, // 8925
context: true // 8926
} // 8927
}, // 8928
// 8929
// Creates a full fledged settings object into target // 8930
// with both ajaxSettings and settings fields. // 8931
// If target is omitted, writes into ajaxSettings. // 8932
ajaxSetup: function( target, settings ) { // 8933
return settings ? // 8934
// 8935
// Building a settings object // 8936
ajaxExtend( ajaxExtend( target, jQuery.ajaxSettings ), settings ) : // 8937
// 8938
// Extending ajaxSettings // 8939
ajaxExtend( jQuery.ajaxSettings, target ); // 8940
}, // 8941
// 8942
ajaxPrefilter: addToPrefiltersOrTransports( prefilters ), // 8943
ajaxTransport: addToPrefiltersOrTransports( transports ), // 8944
// 8945
// Main method // 8946
ajax: function( url, options ) { // 8947
// 8948
// If url is an object, simulate pre-1.5 signature // 8949
if ( typeof url === "object" ) { // 8950
options = url; // 8951
url = undefined; // 8952
} // 8953
// 8954
// Force options to be an object // 8955
options = options || {}; // 8956
// 8957
var // Cross-domain detection vars // 8958
parts, // 8959
// Loop variable // 8960
i, // 8961
// URL without anti-cache param // 8962
cacheURL, // 8963
// Response headers as string // 8964
responseHeadersString, // 8965
// timeout handle // 8966
timeoutTimer, // 8967
// 8968
// To know if global events are to be dispatched // 8969
fireGlobals, // 8970
// 8971
transport, // 8972
// Response headers // 8973
responseHeaders, // 8974
// Create the final options object // 8975
s = jQuery.ajaxSetup( {}, options ), // 8976
// Callbacks context // 8977
callbackContext = s.context || s, // 8978
// Context for global events is callbackContext if it is a DOM node or jQuery collection // 8979
globalEventContext = s.context && ( callbackContext.nodeType || callbackContext.jquery ) ? // 8980
jQuery( callbackContext ) : // 8981
jQuery.event, // 8982
// Deferreds // 8983
deferred = jQuery.Deferred(), // 8984
completeDeferred = jQuery.Callbacks("once memory"), // 8985
// Status-dependent callbacks // 8986
statusCode = s.statusCode || {}, // 8987
// Headers (they are sent all at once) // 8988
requestHeaders = {}, // 8989
requestHeadersNames = {}, // 8990
// The jqXHR state // 8991
state = 0, // 8992
// Default abort message // 8993
strAbort = "canceled", // 8994
// Fake xhr // 8995
jqXHR = { // 8996
readyState: 0, // 8997
// 8998
// Builds headers hashtable if needed // 8999
getResponseHeader: function( key ) { // 9000
var match; // 9001
if ( state === 2 ) { // 9002
if ( !responseHeaders ) { // 9003
responseHeaders = {}; // 9004
while ( (match = rheaders.exec( responseHeadersString )) ) { // 9005
responseHeaders[ match[1].toLowerCase() ] = match[ 2 ]; // 9006
} // 9007
} // 9008
match = responseHeaders[ key.toLowerCase() ]; // 9009
} // 9010
return match == null ? null : match; // 9011
}, // 9012
// 9013
// Raw string // 9014
getAllResponseHeaders: function() { // 9015
return state === 2 ? responseHeadersString : null; // 9016
}, // 9017
// 9018
// Caches the header // 9019
setRequestHeader: function( name, value ) { // 9020
var lname = name.toLowerCase(); // 9021
if ( !state ) { // 9022
name = requestHeadersNames[ lname ] = requestHeadersNames[ lname ] || name; // 9023
requestHeaders[ name ] = value; // 9024
} // 9025
return this; // 9026
}, // 9027
// 9028
// Overrides response content-type header // 9029
overrideMimeType: function( type ) { // 9030
if ( !state ) { // 9031
s.mimeType = type; // 9032
} // 9033
return this; // 9034
}, // 9035
// 9036
// Status-dependent callbacks // 9037
statusCode: function( map ) { // 9038
var code; // 9039
if ( map ) { // 9040
if ( state < 2 ) { // 9041
for ( code in map ) { // 9042
// Lazy-add the new callback in a way that preserves old ones // 9043
statusCode[ code ] = [ statusCode[ code ], map[ code ] ]; // 9044
} // 9045
} else { // 9046
// Execute the appropriate callbacks // 9047
jqXHR.always( map[ jqXHR.status ] ); // 9048
} // 9049
} // 9050
return this; // 9051
}, // 9052
// 9053
// Cancel the request // 9054
abort: function( statusText ) { // 9055
var finalText = statusText || strAbort; // 9056
if ( transport ) { // 9057
transport.abort( finalText ); // 9058
} // 9059
done( 0, finalText ); // 9060
return this; // 9061
} // 9062
}; // 9063
// 9064
// Attach deferreds // 9065
deferred.promise( jqXHR ).complete = completeDeferred.add; // 9066
jqXHR.success = jqXHR.done; // 9067
jqXHR.error = jqXHR.fail; // 9068
// 9069
// Remove hash character (#7531: and string promotion) // 9070
// Add protocol if not provided (#5866: IE7 issue with protocol-less urls) // 9071
// Handle falsy url in the settings object (#10093: consistency with old signature) // 9072
// We also use the url parameter if available // 9073
s.url = ( ( url || s.url || ajaxLocation ) + "" ).replace( rhash, "" ).replace( rprotocol, ajaxLocParts[ 1 ] + "//" );
// 9075
// Alias method option to type as per ticket #12004 // 9076
s.type = options.method || options.type || s.method || s.type; // 9077
// 9078
// Extract dataTypes list // 9079
s.dataTypes = jQuery.trim( s.dataType || "*" ).toLowerCase().match( rnotwhite ) || [ "" ]; // 9080
// 9081
// A cross-domain request is in order when we have a protocol:host:port mismatch // 9082
if ( s.crossDomain == null ) { // 9083
parts = rurl.exec( s.url.toLowerCase() ); // 9084
s.crossDomain = !!( parts && // 9085
( parts[ 1 ] !== ajaxLocParts[ 1 ] || parts[ 2 ] !== ajaxLocParts[ 2 ] || // 9086
( parts[ 3 ] || ( parts[ 1 ] === "http:" ? "80" : "443" ) ) !== // 9087
( ajaxLocParts[ 3 ] || ( ajaxLocParts[ 1 ] === "http:" ? "80" : "443" ) ) ) // 9088
); // 9089
} // 9090
// 9091
// Convert data if not already a string // 9092
if ( s.data && s.processData && typeof s.data !== "string" ) { // 9093
s.data = jQuery.param( s.data, s.traditional ); // 9094
} // 9095
// 9096
// Apply prefilters // 9097
inspectPrefiltersOrTransports( prefilters, s, options, jqXHR ); // 9098
// 9099
// If request was aborted inside a prefilter, stop there // 9100
if ( state === 2 ) { // 9101
return jqXHR; // 9102
} // 9103
// 9104
// We can fire global events as of now if asked to // 9105
// Don't fire events if jQuery.event is undefined in an AMD-usage scenario (#15118) // 9106
fireGlobals = jQuery.event && s.global; // 9107
// 9108
// Watch for a new set of requests // 9109
if ( fireGlobals && jQuery.active++ === 0 ) { // 9110
jQuery.event.trigger("ajaxStart"); // 9111
} // 9112
// 9113
// Uppercase the type // 9114
s.type = s.type.toUpperCase(); // 9115
// 9116
// Determine if request has content // 9117
s.hasContent = !rnoContent.test( s.type ); // 9118
// 9119
// Save the URL in case we're toying with the If-Modified-Since // 9120
// and/or If-None-Match header later on // 9121
cacheURL = s.url; // 9122
// 9123
// More options handling for requests with no content // 9124
if ( !s.hasContent ) { // 9125
// 9126
// If data is available, append data to url // 9127
if ( s.data ) { // 9128
cacheURL = ( s.url += ( rquery.test( cacheURL ) ? "&" : "?" ) + s.data ); // 9129
// #9682: remove data so that it's not used in an eventual retry // 9130
delete s.data; // 9131
} // 9132
// 9133
// Add anti-cache in url if needed // 9134
if ( s.cache === false ) { // 9135
s.url = rts.test( cacheURL ) ? // 9136
// 9137
// If there is already a '_' parameter, set its value // 9138
cacheURL.replace( rts, "$1_=" + nonce++ ) : // 9139
// 9140
// Otherwise add one to the end // 9141
cacheURL + ( rquery.test( cacheURL ) ? "&" : "?" ) + "_=" + nonce++; // 9142
} // 9143
} // 9144
// 9145
// Set the If-Modified-Since and/or If-None-Match header, if in ifModified mode. // 9146
if ( s.ifModified ) { // 9147
if ( jQuery.lastModified[ cacheURL ] ) { // 9148
jqXHR.setRequestHeader( "If-Modified-Since", jQuery.lastModified[ cacheURL ] ); // 9149
} // 9150
if ( jQuery.etag[ cacheURL ] ) { // 9151
jqXHR.setRequestHeader( "If-None-Match", jQuery.etag[ cacheURL ] ); // 9152
} // 9153
} // 9154
// 9155
// Set the correct header, if data is being sent // 9156
if ( s.data && s.hasContent && s.contentType !== false || options.contentType ) { // 9157
jqXHR.setRequestHeader( "Content-Type", s.contentType ); // 9158
} // 9159
// 9160
// Set the Accepts header for the server, depending on the dataType // 9161
jqXHR.setRequestHeader( // 9162
"Accept", // 9163
s.dataTypes[ 0 ] && s.accepts[ s.dataTypes[0] ] ? // 9164
s.accepts[ s.dataTypes[0] ] + ( s.dataTypes[ 0 ] !== "*" ? ", " + allTypes + "; q=0.01" : "" ) : // 9165
s.accepts[ "*" ] // 9166
); // 9167
// 9168
// Check for headers option // 9169
for ( i in s.headers ) { // 9170
jqXHR.setRequestHeader( i, s.headers[ i ] ); // 9171
} // 9172
// 9173
// Allow custom headers/mimetypes and early abort // 9174
if ( s.beforeSend && ( s.beforeSend.call( callbackContext, jqXHR, s ) === false || state === 2 ) ) { // 9175
// Abort if not done already and return // 9176
return jqXHR.abort(); // 9177
} // 9178
// 9179
// aborting is no longer a cancellation // 9180
strAbort = "abort"; // 9181
// 9182
// Install callbacks on deferreds // 9183
for ( i in { success: 1, error: 1, complete: 1 } ) { // 9184
jqXHR[ i ]( s[ i ] ); // 9185
} // 9186
// 9187
// Get transport // 9188
transport = inspectPrefiltersOrTransports( transports, s, options, jqXHR ); // 9189
// 9190
// If no transport, we auto-abort // 9191
if ( !transport ) { // 9192
done( -1, "No Transport" ); // 9193
} else { // 9194
jqXHR.readyState = 1; // 9195
// 9196
// Send global event // 9197
if ( fireGlobals ) { // 9198
globalEventContext.trigger( "ajaxSend", [ jqXHR, s ] ); // 9199
} // 9200
// Timeout // 9201
if ( s.async && s.timeout > 0 ) { // 9202
timeoutTimer = setTimeout(function() { // 9203
jqXHR.abort("timeout"); // 9204
}, s.timeout ); // 9205
} // 9206
// 9207
try { // 9208
state = 1; // 9209
transport.send( requestHeaders, done ); // 9210
} catch ( e ) { // 9211
// Propagate exception as error if not done // 9212
if ( state < 2 ) { // 9213
done( -1, e ); // 9214
// Simply rethrow otherwise // 9215
} else { // 9216
throw e; // 9217
} // 9218
} // 9219
} // 9220
// 9221
// Callback for when everything is done // 9222
function done( status, nativeStatusText, responses, headers ) { // 9223
var isSuccess, success, error, response, modified, // 9224
statusText = nativeStatusText; // 9225
// 9226
// Called once // 9227
if ( state === 2 ) { // 9228
return; // 9229
} // 9230
// 9231
// State is "done" now // 9232
state = 2; // 9233
// 9234
// Clear timeout if it exists // 9235
if ( timeoutTimer ) { // 9236
clearTimeout( timeoutTimer ); // 9237
} // 9238
// 9239
// Dereference transport for early garbage collection // 9240
// (no matter how long the jqXHR object will be used) // 9241
transport = undefined; // 9242
// 9243
// Cache response headers // 9244
responseHeadersString = headers || ""; // 9245
// 9246
// Set readyState // 9247
jqXHR.readyState = status > 0 ? 4 : 0; // 9248
// 9249
// Determine if successful // 9250
isSuccess = status >= 200 && status < 300 || status === 304; // 9251
// 9252
// Get response data // 9253
if ( responses ) { // 9254
response = ajaxHandleResponses( s, jqXHR, responses ); // 9255
} // 9256
// 9257
// Convert no matter what (that way responseXXX fields are always set) // 9258
response = ajaxConvert( s, response, jqXHR, isSuccess ); // 9259
// 9260
// If successful, handle type chaining // 9261
if ( isSuccess ) { // 9262
// 9263
// Set the If-Modified-Since and/or If-None-Match header, if in ifModified mode. // 9264
if ( s.ifModified ) { // 9265
modified = jqXHR.getResponseHeader("Last-Modified"); // 9266
if ( modified ) { // 9267
jQuery.lastModified[ cacheURL ] = modified; // 9268
} // 9269
modified = jqXHR.getResponseHeader("etag"); // 9270
if ( modified ) { // 9271
jQuery.etag[ cacheURL ] = modified; // 9272
} // 9273
} // 9274
// 9275
// if no content // 9276
if ( status === 204 || s.type === "HEAD" ) { // 9277
statusText = "nocontent"; // 9278
// 9279
// if not modified // 9280
} else if ( status === 304 ) { // 9281
statusText = "notmodified"; // 9282
// 9283
// If we have data, let's convert it // 9284
} else { // 9285
statusText = response.state; // 9286
success = response.data; // 9287
error = response.error; // 9288
isSuccess = !error; // 9289
} // 9290
} else { // 9291
// We extract error from statusText // 9292
// then normalize statusText and status for non-aborts // 9293
error = statusText; // 9294
if ( status || !statusText ) { // 9295
statusText = "error"; // 9296
if ( status < 0 ) { // 9297
status = 0; // 9298
} // 9299
} // 9300
} // 9301
// 9302
// Set data for the fake xhr object // 9303
jqXHR.status = status; // 9304
jqXHR.statusText = ( nativeStatusText || statusText ) + ""; // 9305
// 9306
// Success/Error // 9307
if ( isSuccess ) { // 9308
deferred.resolveWith( callbackContext, [ success, statusText, jqXHR ] ); // 9309
} else { // 9310
deferred.rejectWith( callbackContext, [ jqXHR, statusText, error ] ); // 9311
} // 9312
// 9313
// Status-dependent callbacks // 9314
jqXHR.statusCode( statusCode ); // 9315
statusCode = undefined; // 9316
// 9317
if ( fireGlobals ) { // 9318
globalEventContext.trigger( isSuccess ? "ajaxSuccess" : "ajaxError", // 9319
[ jqXHR, s, isSuccess ? success : error ] ); // 9320
} // 9321
// 9322
// Complete // 9323
completeDeferred.fireWith( callbackContext, [ jqXHR, statusText ] ); // 9324
// 9325
if ( fireGlobals ) { // 9326
globalEventContext.trigger( "ajaxComplete", [ jqXHR, s ] ); // 9327
// Handle the global AJAX counter // 9328
if ( !( --jQuery.active ) ) { // 9329
jQuery.event.trigger("ajaxStop"); // 9330
} // 9331
} // 9332
} // 9333
// 9334
return jqXHR; // 9335
}, // 9336
// 9337
getJSON: function( url, data, callback ) { // 9338
return jQuery.get( url, data, callback, "json" ); // 9339
}, // 9340
// 9341
getScript: function( url, callback ) { // 9342
return jQuery.get( url, undefined, callback, "script" ); // 9343
} // 9344
}); // 9345
// 9346
jQuery.each( [ "get", "post" ], function( i, method ) { // 9347
jQuery[ method ] = function( url, data, callback, type ) { // 9348
// shift arguments if data argument was omitted // 9349
if ( jQuery.isFunction( data ) ) { // 9350
type = type || callback; // 9351
callback = data; // 9352
data = undefined; // 9353
} // 9354
// 9355
return jQuery.ajax({ // 9356
url: url, // 9357
type: method, // 9358
dataType: type, // 9359
data: data, // 9360
success: callback // 9361
}); // 9362
}; // 9363
}); // 9364
// 9365
// 9366
jQuery._evalUrl = function( url ) { // 9367
return jQuery.ajax({ // 9368
url: url, // 9369
type: "GET", // 9370
dataType: "script", // 9371
async: false, // 9372
global: false, // 9373
"throws": true // 9374
}); // 9375
}; // 9376
// 9377
// 9378
jQuery.fn.extend({ // 9379
wrapAll: function( html ) { // 9380
if ( jQuery.isFunction( html ) ) { // 9381
return this.each(function(i) { // 9382
jQuery(this).wrapAll( html.call(this, i) ); // 9383
}); // 9384
} // 9385
// 9386
if ( this[0] ) { // 9387
// The elements to wrap the target around // 9388
var wrap = jQuery( html, this[0].ownerDocument ).eq(0).clone(true); // 9389
// 9390
if ( this[0].parentNode ) { // 9391
wrap.insertBefore( this[0] ); // 9392
} // 9393
// 9394
wrap.map(function() { // 9395
var elem = this; // 9396
// 9397
while ( elem.firstChild && elem.firstChild.nodeType === 1 ) { // 9398
elem = elem.firstChild; // 9399
} // 9400
// 9401
return elem; // 9402
}).append( this ); // 9403
} // 9404
// 9405
return this; // 9406
}, // 9407
// 9408
wrapInner: function( html ) { // 9409
if ( jQuery.isFunction( html ) ) { // 9410
return this.each(function(i) { // 9411
jQuery(this).wrapInner( html.call(this, i) ); // 9412
}); // 9413
} // 9414
// 9415
return this.each(function() { // 9416
var self = jQuery( this ), // 9417
contents = self.contents(); // 9418
// 9419
if ( contents.length ) { // 9420
contents.wrapAll( html ); // 9421
// 9422
} else { // 9423
self.append( html ); // 9424
} // 9425
}); // 9426
}, // 9427
// 9428
wrap: function( html ) { // 9429
var isFunction = jQuery.isFunction( html ); // 9430
// 9431
return this.each(function(i) { // 9432
jQuery( this ).wrapAll( isFunction ? html.call(this, i) : html ); // 9433
}); // 9434
}, // 9435
// 9436
unwrap: function() { // 9437
return this.parent().each(function() { // 9438
if ( !jQuery.nodeName( this, "body" ) ) { // 9439
jQuery( this ).replaceWith( this.childNodes ); // 9440
} // 9441
}).end(); // 9442
} // 9443
}); // 9444
// 9445
// 9446
jQuery.expr.filters.hidden = function( elem ) { // 9447
// Support: Opera <= 12.12 // 9448
// Opera reports offsetWidths and offsetHeights less than zero on some elements // 9449
return elem.offsetWidth <= 0 && elem.offsetHeight <= 0 || // 9450
(!support.reliableHiddenOffsets() && // 9451
((elem.style && elem.style.display) || jQuery.css( elem, "display" )) === "none"); // 9452
}; // 9453
// 9454
jQuery.expr.filters.visible = function( elem ) { // 9455
return !jQuery.expr.filters.hidden( elem ); // 9456
}; // 9457
// 9458
// 9459
// 9460
// 9461
var r20 = /%20/g, // 9462
rbracket = /\[\]$/, // 9463
rCRLF = /\r?\n/g, // 9464
rsubmitterTypes = /^(?:submit|button|image|reset|file)$/i, // 9465
rsubmittable = /^(?:input|select|textarea|keygen)/i; // 9466
// 9467
function buildParams( prefix, obj, traditional, add ) { // 9468
var name; // 9469
// 9470
if ( jQuery.isArray( obj ) ) { // 9471
// Serialize array item. // 9472
jQuery.each( obj, function( i, v ) { // 9473
if ( traditional || rbracket.test( prefix ) ) { // 9474
// Treat each array item as a scalar. // 9475
add( prefix, v ); // 9476
// 9477
} else { // 9478
// Item is non-scalar (array or object), encode its numeric index. // 9479
buildParams( prefix + "[" + ( typeof v === "object" ? i : "" ) + "]", v, traditional, add ); // 9480
} // 9481
}); // 9482
// 9483
} else if ( !traditional && jQuery.type( obj ) === "object" ) { // 9484
// Serialize object item. // 9485
for ( name in obj ) { // 9486
buildParams( prefix + "[" + name + "]", obj[ name ], traditional, add ); // 9487
} // 9488
// 9489
} else { // 9490
// Serialize scalar item. // 9491
add( prefix, obj ); // 9492
} // 9493
} // 9494
// 9495
// Serialize an array of form elements or a set of // 9496
// key/values into a query string // 9497
jQuery.param = function( a, traditional ) { // 9498
var prefix, // 9499
s = [], // 9500
add = function( key, value ) { // 9501
// If value is a function, invoke it and return its value // 9502
value = jQuery.isFunction( value ) ? value() : ( value == null ? "" : value ); // 9503
s[ s.length ] = encodeURIComponent( key ) + "=" + encodeURIComponent( value ); // 9504
}; // 9505
// 9506
// Set traditional to true for jQuery <= 1.3.2 behavior. // 9507
if ( traditional === undefined ) { // 9508
traditional = jQuery.ajaxSettings && jQuery.ajaxSettings.traditional; // 9509
} // 9510
// 9511
// If an array was passed in, assume that it is an array of form elements. // 9512
if ( jQuery.isArray( a ) || ( a.jquery && !jQuery.isPlainObject( a ) ) ) { // 9513
// Serialize the form elements // 9514
jQuery.each( a, function() { // 9515
add( this.name, this.value ); // 9516
}); // 9517
// 9518
} else { // 9519
// If traditional, encode the "old" way (the way 1.3.2 or older // 9520
// did it), otherwise encode params recursively. // 9521
for ( prefix in a ) { // 9522
buildParams( prefix, a[ prefix ], traditional, add ); // 9523
} // 9524
} // 9525
// 9526
// Return the resulting serialization // 9527
return s.join( "&" ).replace( r20, "+" ); // 9528
}; // 9529
// 9530
jQuery.fn.extend({ // 9531
serialize: function() { // 9532
return jQuery.param( this.serializeArray() ); // 9533
}, // 9534
serializeArray: function() { // 9535
return this.map(function() { // 9536
// Can add propHook for "elements" to filter or add form elements // 9537
var elements = jQuery.prop( this, "elements" ); // 9538
return elements ? jQuery.makeArray( elements ) : this; // 9539
}) // 9540
.filter(function() { // 9541
var type = this.type; // 9542
// Use .is(":disabled") so that fieldset[disabled] works // 9543
return this.name && !jQuery( this ).is( ":disabled" ) && // 9544
rsubmittable.test( this.nodeName ) && !rsubmitterTypes.test( type ) && // 9545
( this.checked || !rcheckableType.test( type ) ); // 9546
}) // 9547
.map(function( i, elem ) { // 9548
var val = jQuery( this ).val(); // 9549
// 9550
return val == null ? // 9551
null : // 9552
jQuery.isArray( val ) ? // 9553
jQuery.map( val, function( val ) { // 9554
return { name: elem.name, value: val.replace( rCRLF, "\r\n" ) }; // 9555
}) : // 9556
{ name: elem.name, value: val.replace( rCRLF, "\r\n" ) }; // 9557
}).get(); // 9558
} // 9559
}); // 9560
// 9561
// 9562
// Create the request object // 9563
// (This is still attached to ajaxSettings for backward compatibility) // 9564
jQuery.ajaxSettings.xhr = window.ActiveXObject !== undefined ? // 9565
// Support: IE6+ // 9566
function() { // 9567
// 9568
// XHR cannot access local files, always use ActiveX for that case // 9569
return !this.isLocal && // 9570
// 9571
// Support: IE7-8 // 9572
// oldIE XHR does not support non-RFC2616 methods (#13240) // 9573
// See http://msdn.microsoft.com/en-us/library/ie/ms536648(v=vs.85).aspx // 9574
// and http://www.w3.org/Protocols/rfc2616/rfc2616-sec9.html#sec9 // 9575
// Although this check for six methods instead of eight // 9576
// since IE also does not support "trace" and "connect" // 9577
/^(get|post|head|put|delete|options)$/i.test( this.type ) && // 9578
// 9579
createStandardXHR() || createActiveXHR(); // 9580
} : // 9581
// For all other browsers, use the standard XMLHttpRequest object // 9582
createStandardXHR; // 9583
// 9584
var xhrId = 0, // 9585
xhrCallbacks = {}, // 9586
xhrSupported = jQuery.ajaxSettings.xhr(); // 9587
// 9588
// Support: IE<10 // 9589
// Open requests must be manually aborted on unload (#5280) // 9590
// See https://support.microsoft.com/kb/2856746 for more info // 9591
if ( window.attachEvent ) { // 9592
window.attachEvent( "onunload", function() { // 9593
for ( var key in xhrCallbacks ) { // 9594
xhrCallbacks[ key ]( undefined, true ); // 9595
} // 9596
}); // 9597
} // 9598
// 9599
// Determine support properties // 9600
support.cors = !!xhrSupported && ( "withCredentials" in xhrSupported ); // 9601
xhrSupported = support.ajax = !!xhrSupported; // 9602
// 9603
// Create transport if the browser can provide an xhr // 9604
if ( xhrSupported ) { // 9605
// 9606
jQuery.ajaxTransport(function( options ) { // 9607
// Cross domain only allowed if supported through XMLHttpRequest // 9608
if ( !options.crossDomain || support.cors ) { // 9609
// 9610
var callback; // 9611
// 9612
return { // 9613
send: function( headers, complete ) { // 9614
var i, // 9615
xhr = options.xhr(), // 9616
id = ++xhrId; // 9617
// 9618
// Open the socket // 9619
xhr.open( options.type, options.url, options.async, options.username, options.password ); // 9620
// 9621
// Apply custom fields if provided // 9622
if ( options.xhrFields ) { // 9623
for ( i in options.xhrFields ) { // 9624
xhr[ i ] = options.xhrFields[ i ]; // 9625
} // 9626
} // 9627
// 9628
// Override mime type if needed // 9629
if ( options.mimeType && xhr.overrideMimeType ) { // 9630
xhr.overrideMimeType( options.mimeType ); // 9631
} // 9632
// 9633
// X-Requested-With header // 9634
// For cross-domain requests, seeing as conditions for a preflight are // 9635
// akin to a jigsaw puzzle, we simply never set it to be sure. // 9636
// (it can always be set on a per-request basis or even using ajaxSetup) // 9637
// For same-domain requests, won't change header if already provided. // 9638
if ( !options.crossDomain && !headers["X-Requested-With"] ) { // 9639
headers["X-Requested-With"] = "XMLHttpRequest"; // 9640
} // 9641
// 9642
// Set headers // 9643
for ( i in headers ) { // 9644
// Support: IE<9 // 9645
// IE's ActiveXObject throws a 'Type Mismatch' exception when setting // 9646
// request header to a null-value. // 9647
// // 9648
// To keep consistent with other XHR implementations, cast the value // 9649
// to string and ignore `undefined`. // 9650
if ( headers[ i ] !== undefined ) { // 9651
xhr.setRequestHeader( i, headers[ i ] + "" ); // 9652
} // 9653
} // 9654
// 9655
// Do send the request // 9656
// This may raise an exception which is actually // 9657
// handled in jQuery.ajax (so no try/catch here) // 9658
xhr.send( ( options.hasContent && options.data ) || null ); // 9659
// 9660
// Listener // 9661
callback = function( _, isAbort ) { // 9662
var status, statusText, responses; // 9663
// 9664
// Was never called and is aborted or complete // 9665
if ( callback && ( isAbort || xhr.readyState === 4 ) ) { // 9666
// Clean up // 9667
delete xhrCallbacks[ id ]; // 9668
callback = undefined; // 9669
xhr.onreadystatechange = jQuery.noop; // 9670
// 9671
// Abort manually if needed // 9672
if ( isAbort ) { // 9673
if ( xhr.readyState !== 4 ) { // 9674
xhr.abort(); // 9675
} // 9676
} else { // 9677
responses = {}; // 9678
status = xhr.status; // 9679
// 9680
// Support: IE<10 // 9681
// Accessing binary-data responseText throws an exception // 9682
// (#11426) // 9683
if ( typeof xhr.responseText === "string" ) { // 9684
responses.text = xhr.responseText; // 9685
} // 9686
// 9687
// Firefox throws an exception when accessing // 9688
// statusText for faulty cross-domain requests // 9689
try { // 9690
statusText = xhr.statusText; // 9691
} catch( e ) { // 9692
// We normalize with Webkit giving an empty statusText // 9693
statusText = ""; // 9694
} // 9695
// 9696
// Filter status for non standard behaviors // 9697
// 9698
// If the request is local and we have data: assume a success // 9699
// (success with no data won't get notified, that's the best we // 9700
// can do given current implementations) // 9701
if ( !status && options.isLocal && !options.crossDomain ) { // 9702
status = responses.text ? 200 : 404; // 9703
// IE - #1450: sometimes returns 1223 when it should be 204 // 9704
} else if ( status === 1223 ) { // 9705
status = 204; // 9706
} // 9707
} // 9708
} // 9709
// 9710
// Call complete if needed // 9711
if ( responses ) { // 9712
complete( status, statusText, responses, xhr.getAllResponseHeaders() ); // 9713
} // 9714
}; // 9715
// 9716
if ( !options.async ) { // 9717
// if we're in sync mode we fire the callback // 9718
callback(); // 9719
} else if ( xhr.readyState === 4 ) { // 9720
// (IE6 & IE7) if it's in cache and has been // 9721
// retrieved directly we need to fire the callback // 9722
setTimeout( callback ); // 9723
} else { // 9724
// Add to the list of active xhr callbacks // 9725
xhr.onreadystatechange = xhrCallbacks[ id ] = callback; // 9726
} // 9727
}, // 9728
// 9729
abort: function() { // 9730
if ( callback ) { // 9731
callback( undefined, true ); // 9732
} // 9733
} // 9734
}; // 9735
} // 9736
}); // 9737
} // 9738
// 9739
// Functions to create xhrs // 9740
function createStandardXHR() { // 9741
try { // 9742
return new window.XMLHttpRequest(); // 9743
} catch( e ) {} // 9744
} // 9745
// 9746
function createActiveXHR() { // 9747
try { // 9748
return new window.ActiveXObject( "Microsoft.XMLHTTP" ); // 9749
} catch( e ) {} // 9750
} // 9751
// 9752
// 9753
// 9754
// 9755
// Install script dataType // 9756
jQuery.ajaxSetup({ // 9757
accepts: { // 9758
script: "text/javascript, application/javascript, application/ecmascript, application/x-ecmascript" // 9759
}, // 9760
contents: { // 9761
script: /(?:java|ecma)script/ // 9762
}, // 9763
converters: { // 9764
"text script": function( text ) { // 9765
jQuery.globalEval( text ); // 9766
return text; // 9767
} // 9768
} // 9769
}); // 9770
// 9771
// Handle cache's special case and global // 9772
jQuery.ajaxPrefilter( "script", function( s ) { // 9773
if ( s.cache === undefined ) { // 9774
s.cache = false; // 9775
} // 9776
if ( s.crossDomain ) { // 9777
s.type = "GET"; // 9778
s.global = false; // 9779
} // 9780
}); // 9781
// 9782
// Bind script tag hack transport // 9783
jQuery.ajaxTransport( "script", function(s) { // 9784
// 9785
// This transport only deals with cross domain requests // 9786
if ( s.crossDomain ) { // 9787
// 9788
var script, // 9789
head = document.head || jQuery("head")[0] || document.documentElement; // 9790
// 9791
return { // 9792
// 9793
send: function( _, callback ) { // 9794
// 9795
script = document.createElement("script"); // 9796
// 9797
script.async = true; // 9798
// 9799
if ( s.scriptCharset ) { // 9800
script.charset = s.scriptCharset; // 9801
} // 9802
// 9803
script.src = s.url; // 9804
// 9805
// Attach handlers for all browsers // 9806
script.onload = script.onreadystatechange = function( _, isAbort ) { // 9807
// 9808
if ( isAbort || !script.readyState || /loaded|complete/.test( script.readyState ) ) { // 9809
// 9810
// Handle memory leak in IE // 9811
script.onload = script.onreadystatechange = null; // 9812
// 9813
// Remove the script // 9814
if ( script.parentNode ) { // 9815
script.parentNode.removeChild( script ); // 9816
} // 9817
// 9818
// Dereference the script // 9819
script = null; // 9820
// 9821
// Callback if not abort // 9822
if ( !isAbort ) { // 9823
callback( 200, "success" ); // 9824
} // 9825
} // 9826
}; // 9827
// 9828
// Circumvent IE6 bugs with base elements (#2709 and #4378) by prepending // 9829
// Use native DOM manipulation to avoid our domManip AJAX trickery // 9830
head.insertBefore( script, head.firstChild ); // 9831
}, // 9832
// 9833
abort: function() { // 9834
if ( script ) { // 9835
script.onload( undefined, true ); // 9836
} // 9837
} // 9838
}; // 9839
} // 9840
}); // 9841
// 9842
// 9843
// 9844
// 9845
var oldCallbacks = [], // 9846
rjsonp = /(=)\?(?=&|$)|\?\?/; // 9847
// 9848
// Default jsonp settings // 9849
jQuery.ajaxSetup({ // 9850
jsonp: "callback", // 9851
jsonpCallback: function() { // 9852
var callback = oldCallbacks.pop() || ( jQuery.expando + "_" + ( nonce++ ) ); // 9853
this[ callback ] = true; // 9854
return callback; // 9855
} // 9856
}); // 9857
// 9858
// Detect, normalize options and install callbacks for jsonp requests // 9859
jQuery.ajaxPrefilter( "json jsonp", function( s, originalSettings, jqXHR ) { // 9860
// 9861
var callbackName, overwritten, responseContainer, // 9862
jsonProp = s.jsonp !== false && ( rjsonp.test( s.url ) ? // 9863
"url" : // 9864
typeof s.data === "string" && !( s.contentType || "" ).indexOf("application/x-www-form-urlencoded") && rjsonp.test( s.data ) && "data"
); // 9866
// 9867
// Handle iff the expected data type is "jsonp" or we have a parameter to set // 9868
if ( jsonProp || s.dataTypes[ 0 ] === "jsonp" ) { // 9869
// 9870
// Get callback name, remembering preexisting value associated with it // 9871
callbackName = s.jsonpCallback = jQuery.isFunction( s.jsonpCallback ) ? // 9872
s.jsonpCallback() : // 9873
s.jsonpCallback; // 9874
// 9875
// Insert callback into url or form data // 9876
if ( jsonProp ) { // 9877
s[ jsonProp ] = s[ jsonProp ].replace( rjsonp, "$1" + callbackName ); // 9878
} else if ( s.jsonp !== false ) { // 9879
s.url += ( rquery.test( s.url ) ? "&" : "?" ) + s.jsonp + "=" + callbackName; // 9880
} // 9881
// 9882
// Use data converter to retrieve json after script execution // 9883
s.converters["script json"] = function() { // 9884
if ( !responseContainer ) { // 9885
jQuery.error( callbackName + " was not called" ); // 9886
} // 9887
return responseContainer[ 0 ]; // 9888
}; // 9889
// 9890
// force json dataType // 9891
s.dataTypes[ 0 ] = "json"; // 9892
// 9893
// Install callback // 9894
overwritten = window[ callbackName ]; // 9895
window[ callbackName ] = function() { // 9896
responseContainer = arguments; // 9897
}; // 9898
// 9899
// Clean-up function (fires after converters) // 9900
jqXHR.always(function() { // 9901
// Restore preexisting value // 9902
window[ callbackName ] = overwritten; // 9903
// 9904
// Save back as free // 9905
if ( s[ callbackName ] ) { // 9906
// make sure that re-using the options doesn't screw things around // 9907
s.jsonpCallback = originalSettings.jsonpCallback; // 9908
// 9909
// save the callback name for future use // 9910
oldCallbacks.push( callbackName ); // 9911
} // 9912
// 9913
// Call if it was a function and we have a response // 9914
if ( responseContainer && jQuery.isFunction( overwritten ) ) { // 9915
overwritten( responseContainer[ 0 ] ); // 9916
} // 9917
// 9918
responseContainer = overwritten = undefined; // 9919
}); // 9920
// 9921
// Delegate to script // 9922
return "script"; // 9923
} // 9924
}); // 9925
// 9926
// 9927
// 9928
// 9929
// data: string of html // 9930
// context (optional): If specified, the fragment will be created in this context, defaults to document // 9931
// keepScripts (optional): If true, will include scripts passed in the html string // 9932
jQuery.parseHTML = function( data, context, keepScripts ) { // 9933
if ( !data || typeof data !== "string" ) { // 9934
return null; // 9935
} // 9936
if ( typeof context === "boolean" ) { // 9937
keepScripts = context; // 9938
context = false; // 9939
} // 9940
context = context || document; // 9941
// 9942
var parsed = rsingleTag.exec( data ), // 9943
scripts = !keepScripts && []; // 9944
// 9945
// Single tag // 9946
if ( parsed ) { // 9947
return [ context.createElement( parsed[1] ) ]; // 9948
} // 9949
// 9950
parsed = jQuery.buildFragment( [ data ], context, scripts ); // 9951
// 9952
if ( scripts && scripts.length ) { // 9953
jQuery( scripts ).remove(); // 9954
} // 9955
// 9956
return jQuery.merge( [], parsed.childNodes ); // 9957
}; // 9958
// 9959
// 9960
// Keep a copy of the old load method // 9961
var _load = jQuery.fn.load; // 9962
// 9963
/** // 9964
* Load a url into a page // 9965
*/ // 9966
jQuery.fn.load = function( url, params, callback ) { // 9967
if ( typeof url !== "string" && _load ) { // 9968
return _load.apply( this, arguments ); // 9969
} // 9970
// 9971
var selector, response, type, // 9972
self = this, // 9973
off = url.indexOf(" "); // 9974
// 9975
if ( off >= 0 ) { // 9976
selector = jQuery.trim( url.slice( off, url.length ) ); // 9977
url = url.slice( 0, off ); // 9978
} // 9979
// 9980
// If it's a function // 9981
if ( jQuery.isFunction( params ) ) { // 9982
// 9983
// We assume that it's the callback // 9984
callback = params; // 9985
params = undefined; // 9986
// 9987
// Otherwise, build a param string // 9988
} else if ( params && typeof params === "object" ) { // 9989
type = "POST"; // 9990
} // 9991
// 9992
// If we have elements to modify, make the request // 9993
if ( self.length > 0 ) { // 9994
jQuery.ajax({ // 9995
url: url, // 9996
// 9997
// if "type" variable is undefined, then "GET" method will be used // 9998
type: type, // 9999
dataType: "html", // 10000
data: params // 10001
}).done(function( responseText ) { // 10002
// 10003
// Save response for use in complete callback // 10004
response = arguments; // 10005
// 10006
self.html( selector ? // 10007
// 10008
// If a selector was specified, locate the right elements in a dummy div // 10009
// Exclude scripts to avoid IE 'Permission Denied' errors // 10010
jQuery("").append( jQuery.parseHTML( responseText ) ).find( selector ) : // 10011
// 10012
// Otherwise use the full result // 10013
responseText ); // 10014
// 10015
}).complete( callback && function( jqXHR, status ) { // 10016
self.each( callback, response || [ jqXHR.responseText, status, jqXHR ] ); // 10017
}); // 10018
} // 10019
// 10020
return this; // 10021
}; // 10022
// 10023
// 10024
// 10025
// 10026
// Attach a bunch of functions for handling common AJAX events // 10027
jQuery.each( [ "ajaxStart", "ajaxStop", "ajaxComplete", "ajaxError", "ajaxSuccess", "ajaxSend" ], function( i, type ) {
jQuery.fn[ type ] = function( fn ) { // 10029
return this.on( type, fn ); // 10030
}; // 10031
}); // 10032
// 10033
// 10034
// 10035
// 10036
jQuery.expr.filters.animated = function( elem ) { // 10037
return jQuery.grep(jQuery.timers, function( fn ) { // 10038
return elem === fn.elem; // 10039
}).length; // 10040
}; // 10041
// 10042
// 10043
// 10044
// 10045
// 10046
var docElem = window.document.documentElement; // 10047
// 10048
/** // 10049
* Gets a window from an element // 10050
*/ // 10051
function getWindow( elem ) { // 10052
return jQuery.isWindow( elem ) ? // 10053
elem : // 10054
elem.nodeType === 9 ? // 10055
elem.defaultView || elem.parentWindow : // 10056
false; // 10057
} // 10058
// 10059
jQuery.offset = { // 10060
setOffset: function( elem, options, i ) { // 10061
var curPosition, curLeft, curCSSTop, curTop, curOffset, curCSSLeft, calculatePosition, // 10062
position = jQuery.css( elem, "position" ), // 10063
curElem = jQuery( elem ), // 10064
props = {}; // 10065
// 10066
// set position first, in-case top/left are set even on static elem // 10067
if ( position === "static" ) { // 10068
elem.style.position = "relative"; // 10069
} // 10070
// 10071
curOffset = curElem.offset(); // 10072
curCSSTop = jQuery.css( elem, "top" ); // 10073
curCSSLeft = jQuery.css( elem, "left" ); // 10074
calculatePosition = ( position === "absolute" || position === "fixed" ) && // 10075
jQuery.inArray("auto", [ curCSSTop, curCSSLeft ] ) > -1; // 10076
// 10077
// need to be able to calculate position if either top or left is auto and position is either absolute or fixed // 10078
if ( calculatePosition ) { // 10079
curPosition = curElem.position(); // 10080
curTop = curPosition.top; // 10081
curLeft = curPosition.left; // 10082
} else { // 10083
curTop = parseFloat( curCSSTop ) || 0; // 10084
curLeft = parseFloat( curCSSLeft ) || 0; // 10085
} // 10086
// 10087
if ( jQuery.isFunction( options ) ) { // 10088
options = options.call( elem, i, curOffset ); // 10089
} // 10090
// 10091
if ( options.top != null ) { // 10092
props.top = ( options.top - curOffset.top ) + curTop; // 10093
} // 10094
if ( options.left != null ) { // 10095
props.left = ( options.left - curOffset.left ) + curLeft; // 10096
} // 10097
// 10098
if ( "using" in options ) { // 10099
options.using.call( elem, props ); // 10100
} else { // 10101
curElem.css( props ); // 10102
} // 10103
} // 10104
}; // 10105
// 10106
jQuery.fn.extend({ // 10107
offset: function( options ) { // 10108
if ( arguments.length ) { // 10109
return options === undefined ? // 10110
this : // 10111
this.each(function( i ) { // 10112
jQuery.offset.setOffset( this, options, i ); // 10113
}); // 10114
} // 10115
// 10116
var docElem, win, // 10117
box = { top: 0, left: 0 }, // 10118
elem = this[ 0 ], // 10119
doc = elem && elem.ownerDocument; // 10120
// 10121
if ( !doc ) { // 10122
return; // 10123
} // 10124
// 10125
docElem = doc.documentElement; // 10126
// 10127
// Make sure it's not a disconnected DOM node // 10128
if ( !jQuery.contains( docElem, elem ) ) { // 10129
return box; // 10130
} // 10131
// 10132
// If we don't have gBCR, just use 0,0 rather than error // 10133
// BlackBerry 5, iOS 3 (original iPhone) // 10134
if ( typeof elem.getBoundingClientRect !== strundefined ) { // 10135
box = elem.getBoundingClientRect(); // 10136
} // 10137
win = getWindow( doc ); // 10138
return { // 10139
top: box.top + ( win.pageYOffset || docElem.scrollTop ) - ( docElem.clientTop || 0 ), // 10140
left: box.left + ( win.pageXOffset || docElem.scrollLeft ) - ( docElem.clientLeft || 0 ) // 10141
}; // 10142
}, // 10143
// 10144
position: function() { // 10145
if ( !this[ 0 ] ) { // 10146
return; // 10147
} // 10148
// 10149
var offsetParent, offset, // 10150
parentOffset = { top: 0, left: 0 }, // 10151
elem = this[ 0 ]; // 10152
// 10153
// fixed elements are offset from window (parentOffset = {top:0, left: 0}, because it is its only offset parent // 10154
if ( jQuery.css( elem, "position" ) === "fixed" ) { // 10155
// we assume that getBoundingClientRect is available when computed position is fixed // 10156
offset = elem.getBoundingClientRect(); // 10157
} else { // 10158
// Get *real* offsetParent // 10159
offsetParent = this.offsetParent(); // 10160
// 10161
// Get correct offsets // 10162
offset = this.offset(); // 10163
if ( !jQuery.nodeName( offsetParent[ 0 ], "html" ) ) { // 10164
parentOffset = offsetParent.offset(); // 10165
} // 10166
// 10167
// Add offsetParent borders // 10168
parentOffset.top += jQuery.css( offsetParent[ 0 ], "borderTopWidth", true ); // 10169
parentOffset.left += jQuery.css( offsetParent[ 0 ], "borderLeftWidth", true ); // 10170
} // 10171
// 10172
// Subtract parent offsets and element margins // 10173
// note: when an element has margin: auto the offsetLeft and marginLeft // 10174
// are the same in Safari causing offset.left to incorrectly be 0 // 10175
return { // 10176
top: offset.top - parentOffset.top - jQuery.css( elem, "marginTop", true ), // 10177
left: offset.left - parentOffset.left - jQuery.css( elem, "marginLeft", true) // 10178
}; // 10179
}, // 10180
// 10181
offsetParent: function() { // 10182
return this.map(function() { // 10183
var offsetParent = this.offsetParent || docElem; // 10184
// 10185
while ( offsetParent && ( !jQuery.nodeName( offsetParent, "html" ) && jQuery.css( offsetParent, "position" ) === "static" ) ) {
offsetParent = offsetParent.offsetParent; // 10187
} // 10188
return offsetParent || docElem; // 10189
}); // 10190
} // 10191
}); // 10192
// 10193
// Create scrollLeft and scrollTop methods // 10194
jQuery.each( { scrollLeft: "pageXOffset", scrollTop: "pageYOffset" }, function( method, prop ) { // 10195
var top = /Y/.test( prop ); // 10196
// 10197
jQuery.fn[ method ] = function( val ) { // 10198
return access( this, function( elem, method, val ) { // 10199
var win = getWindow( elem ); // 10200
// 10201
if ( val === undefined ) { // 10202
return win ? (prop in win) ? win[ prop ] : // 10203
win.document.documentElement[ method ] : // 10204
elem[ method ]; // 10205
} // 10206
// 10207
if ( win ) { // 10208
win.scrollTo( // 10209
!top ? val : jQuery( win ).scrollLeft(), // 10210
top ? val : jQuery( win ).scrollTop() // 10211
); // 10212
// 10213
} else { // 10214
elem[ method ] = val; // 10215
} // 10216
}, method, val, arguments.length, null ); // 10217
}; // 10218
}); // 10219
// 10220
// Add the top/left cssHooks using jQuery.fn.position // 10221
// Webkit bug: https://bugs.webkit.org/show_bug.cgi?id=29084 // 10222
// getComputedStyle returns percent when specified for top/left/bottom/right // 10223
// rather than make the css module depend on the offset module, we just check for it here // 10224
jQuery.each( [ "top", "left" ], function( i, prop ) { // 10225
jQuery.cssHooks[ prop ] = addGetHookIf( support.pixelPosition, // 10226
function( elem, computed ) { // 10227
if ( computed ) { // 10228
computed = curCSS( elem, prop ); // 10229
// if curCSS returns percentage, fallback to offset // 10230
return rnumnonpx.test( computed ) ? // 10231
jQuery( elem ).position()[ prop ] + "px" : // 10232
computed; // 10233
} // 10234
} // 10235
); // 10236
}); // 10237
// 10238
// 10239
// Create innerHeight, innerWidth, height, width, outerHeight and outerWidth methods // 10240
jQuery.each( { Height: "height", Width: "width" }, function( name, type ) { // 10241
jQuery.each( { padding: "inner" + name, content: type, "": "outer" + name }, function( defaultExtra, funcName ) { // 10242
// margin is only for outerHeight, outerWidth // 10243
jQuery.fn[ funcName ] = function( margin, value ) { // 10244
var chainable = arguments.length && ( defaultExtra || typeof margin !== "boolean" ), // 10245
extra = defaultExtra || ( margin === true || value === true ? "margin" : "border" ); // 10246
// 10247
return access( this, function( elem, type, value ) { // 10248
var doc; // 10249
// 10250
if ( jQuery.isWindow( elem ) ) { // 10251
// As of 5/8/2012 this will yield incorrect results for Mobile Safari, but there // 10252
// isn't a whole lot we can do. See pull request at this URL for discussion: // 10253
// https://github.com/jquery/jquery/pull/764 // 10254
return elem.document.documentElement[ "client" + name ]; // 10255
} // 10256
// 10257
// Get document width or height // 10258
if ( elem.nodeType === 9 ) { // 10259
doc = elem.documentElement; // 10260
// 10261
// Either scroll[Width/Height] or offset[Width/Height] or client[Width/Height], whichever is greatest // 10262
// unfortunately, this causes bug #3838 in IE6/8 only, but there is currently no good, small way to fix it. // 10263
return Math.max( // 10264
elem.body[ "scroll" + name ], doc[ "scroll" + name ], // 10265
elem.body[ "offset" + name ], doc[ "offset" + name ], // 10266
doc[ "client" + name ] // 10267
); // 10268
} // 10269
// 10270
return value === undefined ? // 10271
// Get width or height on the element, requesting but not forcing parseFloat // 10272
jQuery.css( elem, type, extra ) : // 10273
// 10274
// Set width or height on the element // 10275
jQuery.style( elem, type, value, extra ); // 10276
}, type, chainable ? margin : undefined, chainable, null ); // 10277
}; // 10278
}); // 10279
}); // 10280
// 10281
// 10282
// The number of elements contained in the matched element set // 10283
jQuery.fn.size = function() { // 10284
return this.length; // 10285
}; // 10286
// 10287
jQuery.fn.andSelf = jQuery.fn.addBack; // 10288
// 10289
// 10290
// 10291
// 10292
// Register as a named AMD module, since jQuery can be concatenated with other // 10293
// files that may use define, but not via a proper concatenation script that // 10294
// understands anonymous AMD modules. A named AMD is safest and most robust // 10295
// way to register. Lowercase jquery is used because AMD module names are // 10296
// derived from file names, and jQuery is normally delivered in a lowercase // 10297
// file name. Do this after creating the global so that if an AMD module wants // 10298
// to call noConflict to hide this version of jQuery, it will work. // 10299
// 10300
// Note that for maximum portability, libraries that are not jQuery should // 10301
// declare themselves as anonymous modules, and avoid setting a global if an // 10302
// AMD loader is present. jQuery is a special case. For more information, see // 10303
// https://github.com/jrburke/requirejs/wiki/Updating-existing-libraries#wiki-anon // 10304
// 10305
if ( typeof define === "function" && define.amd ) { // 10306
define( "jquery", [], function() { // 10307
return jQuery; // 10308
}); // 10309
} // 10310
// 10311
// 10312
// 10313
// 10314
var // 10315
// Map over jQuery in case of overwrite // 10316
_jQuery = window.jQuery, // 10317
// 10318
// Map over the $ in case of overwrite // 10319
_$ = window.$; // 10320
// 10321
jQuery.noConflict = function( deep ) { // 10322
if ( window.$ === jQuery ) { // 10323
window.$ = _$; // 10324
} // 10325
// 10326
if ( deep && window.jQuery === jQuery ) { // 10327
window.jQuery = _jQuery; // 10328
} // 10329
// 10330
return jQuery; // 10331
}; // 10332
// 10333
// Expose jQuery and $ identifiers, even in // 10334
// AMD (#7102#comment:10, https://github.com/jquery/jquery/pull/557) // 10335
// and CommonJS for browser emulators (#13566) // 10336
if ( typeof noGlobal === strundefined ) { // 10337
window.jQuery = window.$ = jQuery; // 10338
} // 10339
// 10340
// 10341
// 10342
// 10343
return jQuery; // 10344
// 10345
})); // 10346
// 10347
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
}).call(this);
(function () {
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
// //
// packages/jquery/post.js //
// //
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
//
// Put jQuery and $ in our exported package-scope variables and remove window.$. // 1
// (Sadly, we don't call noConflict(true), which would also remove // 2
// window.jQuery, because bootstrap very specifically relies on window.jQuery.) // 3
$ = jQuery = window.jQuery.noConflict(); // 4
// 5
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
}).call(this);
/* Exports */
if (typeof Package === 'undefined') Package = {};
Package.jquery = {
$: $,
jQuery: jQuery
};
})();