Alternc  latest
Alternc logiel libre pour l'hébergement
jquery-1.9.1.js
Go to the documentation of this file.
1 /*!
2  * jQuery JavaScript Library v1.9.1
3  * http://jquery.com/
4  *
5  * Includes Sizzle.js
6  * http://sizzlejs.com/
7  *
8  * Copyright 2005, 2012 jQuery Foundation, Inc. and other contributors
9  * Released under the MIT license
10  * http://jquery.org/license
11  *
12  * Date: 2013-2-4
13  */
14 (function( window, undefined ) {
15 
16 // Can't do this because several apps including ASP.NET trace
17 // the stack via arguments.caller.callee and Firefox dies if
18 // you try to trace through "use strict" call chains. (#13335)
19 // Support: Firefox 18+
20 //"use strict";
21 var
22  // The deferred used on DOM ready
23  readyList,
24 
25  // A central reference to the root jQuery(document)
26  rootjQuery,
27 
28  // Support: IE<9
29  // For `typeof node.method` instead of `node.method !== undefined`
30  core_strundefined = typeof undefined,
31 
32  // Use the correct document accordingly with window argument (sandbox)
33  document = window.document,
34  location = window.location,
35 
36  // Map over jQuery in case of overwrite
37  _jQuery = window.jQuery,
38 
39  // Map over the $ in case of overwrite
40  _$ = window.$,
41 
42  // [[Class]] -> type pairs
43  class2type = {},
44 
45  // List of deleted data cache ids, so we can reuse them
46  core_deletedIds = [],
47 
48  core_version = "1.9.1",
49 
50  // Save a reference to some core methods
51  core_concat = core_deletedIds.concat,
52  core_push = core_deletedIds.push,
53  core_slice = core_deletedIds.slice,
54  core_indexOf = core_deletedIds.indexOf,
55  core_toString = class2type.toString,
56  core_hasOwn = class2type.hasOwnProperty,
57  core_trim = core_version.trim,
58 
59  // Define a local copy of jQuery
60  jQuery = function( selector, context ) {
61  // The jQuery object is actually just the init constructor 'enhanced'
62  return new jQuery.fn.init( selector, context, rootjQuery );
63  },
64 
65  // Used for matching numbers
66  core_pnum = /[+-]?(?:\d*\.|)\d+(?:[eE][+-]?\d+|)/.source,
67 
68  // Used for splitting on whitespace
69  core_rnotwhite = /\S+/g,
70 
71  // Make sure we trim BOM and NBSP (here's looking at you, Safari 5.0 and IE)
72  rtrim = /^[\s\uFEFF\xA0]+|[\s\uFEFF\xA0]+$/g,
73 
74  // A simple way to check for HTML strings
75  // Prioritize #id over <tag> to avoid XSS via location.hash (#9521)
76  // Strict HTML recognition (#11290: must start with <)
77  rquickExpr = /^(?:(<[\w\W]+>)[^>]*|#([\w-]*))$/,
78 
79  // Match a standalone tag
80  rsingleTag = /^<(\w+)\s*\/?>(?:<\/\1>|)$/,
81 
82  // JSON RegExp
83  rvalidchars = /^[\],:{}\s]*$/,
84  rvalidbraces = /(?:^|:|,)(?:\s*\[)+/g,
85  rvalidescape = /\\(?:["\\\/bfnrt]|u[\da-fA-F]{4})/g,
86  rvalidtokens = /"[^"\\\r\n]*"|true|false|null|-?(?:\d+\.|)\d+(?:[eE][+-]?\d+|)/g,
87 
88  // Matches dashed string for camelizing
89  rmsPrefix = /^-ms-/,
90  rdashAlpha = /-([\da-z])/gi,
91 
92  // Used by jQuery.camelCase as callback to replace()
93  fcamelCase = function( all, letter ) {
94  return letter.toUpperCase();
95  },
96 
97  // The ready event handler
98  completed = function( event ) {
99 
100  // readyState === "complete" is good enough for us to call the dom ready in oldIE
101  if ( document.addEventListener || event.type === "load" || document.readyState === "complete" ) {
102  detach();
103  jQuery.ready();
104  }
105  },
106  // Clean-up method for dom ready events
107  detach = function() {
108  if ( document.addEventListener ) {
109  document.removeEventListener( "DOMContentLoaded", completed, false );
110  window.removeEventListener( "load", completed, false );
111 
112  } else {
113  document.detachEvent( "onreadystatechange", completed );
114  window.detachEvent( "onload", completed );
115  }
116  };
117 
118 jQuery.fn = jQuery.prototype = {
119  // The current version of jQuery being used
120  jquery: core_version,
121 
122  constructor: jQuery,
123  init: function( selector, context, rootjQuery ) {
124  var match, elem;
125 
126  // HANDLE: $(""), $(null), $(undefined), $(false)
127  if ( !selector ) {
128  return this;
129  }
130 
131  // Handle HTML strings
132  if ( typeof selector === "string" ) {
133  if ( selector.charAt(0) === "<" && selector.charAt( selector.length - 1 ) === ">" && selector.length >= 3 ) {
134  // Assume that strings that start and end with <> are HTML and skip the regex check
135  match = [ null, selector, null ];
136 
137  } else {
138  match = rquickExpr.exec( selector );
139  }
140 
141  // Match html or make sure no context is specified for #id
142  if ( match && (match[1] || !context) ) {
143 
144  // HANDLE: $(html) -> $(array)
145  if ( match[1] ) {
146  context = context instanceof jQuery ? context[0] : context;
147 
148  // scripts is true for back-compat
149  jQuery.merge( this, jQuery.parseHTML(
150  match[1],
151  context && context.nodeType ? context.ownerDocument || context : document,
152  true
153  ) );
154 
155  // HANDLE: $(html, props)
156  if ( rsingleTag.test( match[1] ) && jQuery.isPlainObject( context ) ) {
157  for ( match in context ) {
158  // Properties of context are called as methods if possible
159  if ( jQuery.isFunction( this[ match ] ) ) {
160  this[ match ]( context[ match ] );
161 
162  // ...and otherwise set as attributes
163  } else {
164  this.attr( match, context[ match ] );
165  }
166  }
167  }
168 
169  return this;
170 
171  // HANDLE: $(#id)
172  } else {
173  elem = document.getElementById( match[2] );
174 
175  // Check parentNode to catch when Blackberry 4.6 returns
176  // nodes that are no longer in the document #6963
177  if ( elem && elem.parentNode ) {
178  // Handle the case where IE and Opera return items
179  // by name instead of ID
180  if ( elem.id !== match[2] ) {
181  return rootjQuery.find( selector );
182  }
183 
184  // Otherwise, we inject the element directly into the jQuery object
185  this.length = 1;
186  this[0] = elem;
187  }
188 
189  this.context = document;
190  this.selector = selector;
191  return this;
192  }
193 
194  // HANDLE: $(expr, $(...))
195  } else if ( !context || context.jquery ) {
196  return ( context || rootjQuery ).find( selector );
197 
198  // HANDLE: $(expr, context)
199  // (which is just equivalent to: $(context).find(expr)
200  } else {
201  return this.constructor( context ).find( selector );
202  }
203 
204  // HANDLE: $(DOMElement)
205  } else if ( selector.nodeType ) {
206  this.context = this[0] = selector;
207  this.length = 1;
208  return this;
209 
210  // HANDLE: $(function)
211  // Shortcut for document ready
212  } else if ( jQuery.isFunction( selector ) ) {
213  return rootjQuery.ready( selector );
214  }
215 
216  if ( selector.selector !== undefined ) {
217  this.selector = selector.selector;
218  this.context = selector.context;
219  }
220 
221  return jQuery.makeArray( selector, this );
222  },
223 
224  // Start with an empty selector
225  selector: "",
226 
227  // The default length of a jQuery object is 0
228  length: 0,
229 
230  // The number of elements contained in the matched element set
231  size: function() {
232  return this.length;
233  },
234 
235  toArray: function() {
236  return core_slice.call( this );
237  },
238 
239  // Get the Nth element in the matched element set OR
240  // Get the whole matched element set as a clean array
241  get: function( num ) {
242  return num == null ?
243 
244  // Return a 'clean' array
245  this.toArray() :
246 
247  // Return just the object
248  ( num < 0 ? this[ this.length + num ] : this[ num ] );
249  },
250 
251  // Take an array of elements and push it onto the stack
252  // (returning the new matched element set)
253  pushStack: function( elems ) {
254 
255  // Build a new jQuery matched element set
256  var ret = jQuery.merge( this.constructor(), elems );
257 
258  // Add the old object onto the stack (as a reference)
259  ret.prevObject = this;
260  ret.context = this.context;
261 
262  // Return the newly-formed element set
263  return ret;
264  },
265 
266  // Execute a callback for every element in the matched set.
267  // (You can seed the arguments with an array of args, but this is
268  // only used internally.)
269  each: function( callback, args ) {
270  return jQuery.each( this, callback, args );
271  },
272 
273  ready: function( fn ) {
274  // Add the callback
275  jQuery.ready.promise().done( fn );
276 
277  return this;
278  },
279 
280  slice: function() {
281  return this.pushStack( core_slice.apply( this, arguments ) );
282  },
283 
284  first: function() {
285  return this.eq( 0 );
286  },
287 
288  last: function() {
289  return this.eq( -1 );
290  },
291 
292  eq: function( i ) {
293  var len = this.length,
294  j = +i + ( i < 0 ? len : 0 );
295  return this.pushStack( j >= 0 && j < len ? [ this[j] ] : [] );
296  },
297 
298  map: function( callback ) {
299  return this.pushStack( jQuery.map(this, function( elem, i ) {
300  return callback.call( elem, i, elem );
301  }));
302  },
303 
304  end: function() {
305  return this.prevObject || this.constructor(null);
306  },
307 
308  // For internal use only.
309  // Behaves like an Array's method, not like a jQuery method.
310  push: core_push,
311  sort: [].sort,
312  splice: [].splice
313 };
314 
315 // Give the init function the jQuery prototype for later instantiation
316 jQuery.fn.init.prototype = jQuery.fn;
317 
318 jQuery.extend = jQuery.fn.extend = function() {
319  var src, copyIsArray, copy, name, options, clone,
320  target = arguments[0] || {},
321  i = 1,
322  length = arguments.length,
323  deep = false;
324 
325  // Handle a deep copy situation
326  if ( typeof target === "boolean" ) {
327  deep = target;
328  target = arguments[1] || {};
329  // skip the boolean and the target
330  i = 2;
331  }
332 
333  // Handle case when target is a string or something (possible in deep copy)
334  if ( typeof target !== "object" && !jQuery.isFunction(target) ) {
335  target = {};
336  }
337 
338  // extend jQuery itself if only one argument is passed
339  if ( length === i ) {
340  target = this;
341  --i;
342  }
343 
344  for ( ; i < length; i++ ) {
345  // Only deal with non-null/undefined values
346  if ( (options = arguments[ i ]) != null ) {
347  // Extend the base object
348  for ( name in options ) {
349  src = target[ name ];
350  copy = options[ name ];
351 
352  // Prevent never-ending loop
353  if ( target === copy ) {
354  continue;
355  }
356 
357  // Recurse if we're merging plain objects or arrays
358  if ( deep && copy && ( jQuery.isPlainObject(copy) || (copyIsArray = jQuery.isArray(copy)) ) ) {
359  if ( copyIsArray ) {
360  copyIsArray = false;
361  clone = src && jQuery.isArray(src) ? src : [];
362 
363  } else {
364  clone = src && jQuery.isPlainObject(src) ? src : {};
365  }
366 
367  // Never move original objects, clone them
368  target[ name ] = jQuery.extend( deep, clone, copy );
369 
370  // Don't bring in undefined values
371  } else if ( copy !== undefined ) {
372  target[ name ] = copy;
373  }
374  }
375  }
376  }
377 
378  // Return the modified object
379  return target;
380 };
381 
382 jQuery.extend({
383  noConflict: function( deep ) {
384  if ( window.$ === jQuery ) {
385  window.$ = _$;
386  }
387 
388  if ( deep && window.jQuery === jQuery ) {
389  window.jQuery = _jQuery;
390  }
391 
392  return jQuery;
393  },
394 
395  // Is the DOM ready to be used? Set to true once it occurs.
396  isReady: false,
397 
398  // A counter to track how many items to wait for before
399  // the ready event fires. See #6781
400  readyWait: 1,
401 
402  // Hold (or release) the ready event
403  holdReady: function( hold ) {
404  if ( hold ) {
405  jQuery.readyWait++;
406  } else {
407  jQuery.ready( true );
408  }
409  },
410 
411  // Handle when the DOM is ready
412  ready: function( wait ) {
413 
414  // Abort if there are pending holds or we're already ready
415  if ( wait === true ? --jQuery.readyWait : jQuery.isReady ) {
416  return;
417  }
418 
419  // Make sure body exists, at least, in case IE gets a little overzealous (ticket #5443).
420  if ( !document.body ) {
421  return setTimeout( jQuery.ready );
422  }
423 
424  // Remember that the DOM is ready
425  jQuery.isReady = true;
426 
427  // If a normal DOM Ready event fired, decrement, and wait if need be
428  if ( wait !== true && --jQuery.readyWait > 0 ) {
429  return;
430  }
431 
432  // If there are functions bound, to execute
433  readyList.resolveWith( document, [ jQuery ] );
434 
435  // Trigger any bound ready events
436  if ( jQuery.fn.trigger ) {
437  jQuery( document ).trigger("ready").off("ready");
438  }
439  },
440 
441  // See test/unit/core.js for details concerning isFunction.
442  // Since version 1.3, DOM methods and functions like alert
443  // aren't supported. They return false on IE (#2968).
444  isFunction: function( obj ) {
445  return jQuery.type(obj) === "function";
446  },
447 
448  isArray: Array.isArray || function( obj ) {
449  return jQuery.type(obj) === "array";
450  },
451 
452  isWindow: function( obj ) {
453  return obj != null && obj == obj.window;
454  },
455 
456  isNumeric: function( obj ) {
457  return !isNaN( parseFloat(obj) ) && isFinite( obj );
458  },
459 
460  type: function( obj ) {
461  if ( obj == null ) {
462  return String( obj );
463  }
464  return typeof obj === "object" || typeof obj === "function" ?
465  class2type[ core_toString.call(obj) ] || "object" :
466  typeof obj;
467  },
468 
469  isPlainObject: function( obj ) {
470  // Must be an Object.
471  // Because of IE, we also have to check the presence of the constructor property.
472  // Make sure that DOM nodes and window objects don't pass through, as well
473  if ( !obj || jQuery.type(obj) !== "object" || obj.nodeType || jQuery.isWindow( obj ) ) {
474  return false;
475  }
476 
477  try {
478  // Not own constructor property must be Object
479  if ( obj.constructor &&
480  !core_hasOwn.call(obj, "constructor") &&
481  !core_hasOwn.call(obj.constructor.prototype, "isPrototypeOf") ) {
482  return false;
483  }
484  } catch ( e ) {
485  // IE8,9 Will throw exceptions on certain host objects #9897
486  return false;
487  }
488 
489  // Own properties are enumerated firstly, so to speed up,
490  // if last one is own, then all properties are own.
491 
492  var key;
493  for ( key in obj ) {}
494 
495  return key === undefined || core_hasOwn.call( obj, key );
496  },
497 
498  isEmptyObject: function( obj ) {
499  var name;
500  for ( name in obj ) {
501  return false;
502  }
503  return true;
504  },
505 
506  error: function( msg ) {
507  throw new Error( msg );
508  },
509 
510  // data: string of html
511  // context (optional): If specified, the fragment will be created in this context, defaults to document
512  // keepScripts (optional): If true, will include scripts passed in the html string
513  parseHTML: function( data, context, keepScripts ) {
514  if ( !data || typeof data !== "string" ) {
515  return null;
516  }
517  if ( typeof context === "boolean" ) {
518  keepScripts = context;
519  context = false;
520  }
521  context = context || document;
522 
523  var parsed = rsingleTag.exec( data ),
524  scripts = !keepScripts && [];
525 
526  // Single tag
527  if ( parsed ) {
528  return [ context.createElement( parsed[1] ) ];
529  }
530 
531  parsed = jQuery.buildFragment( [ data ], context, scripts );
532  if ( scripts ) {
533  jQuery( scripts ).remove();
534  }
535  return jQuery.merge( [], parsed.childNodes );
536  },
537 
538  parseJSON: function( data ) {
539  // Attempt to parse using the native JSON parser first
540  if ( window.JSON && window.JSON.parse ) {
541  return window.JSON.parse( data );
542  }
543 
544  if ( data === null ) {
545  return data;
546  }
547 
548  if ( typeof data === "string" ) {
549 
550  // Make sure leading/trailing whitespace is removed (IE can't handle it)
551  data = jQuery.trim( data );
552 
553  if ( data ) {
554  // Make sure the incoming data is actual JSON
555  // Logic borrowed from http://json.org/json2.js
556  if ( rvalidchars.test( data.replace( rvalidescape, "@" )
557  .replace( rvalidtokens, "]" )
558  .replace( rvalidbraces, "")) ) {
559 
560  return ( new Function( "return " + data ) )();
561  }
562  }
563  }
564 
565  jQuery.error( "Invalid JSON: " + data );
566  },
567 
568  // Cross-browser xml parsing
569  parseXML: function( data ) {
570  var xml, tmp;
571  if ( !data || typeof data !== "string" ) {
572  return null;
573  }
574  try {
575  if ( window.DOMParser ) { // Standard
576  tmp = new DOMParser();
577  xml = tmp.parseFromString( data , "text/xml" );
578  } else { // IE
579  xml = new ActiveXObject( "Microsoft.XMLDOM" );
580  xml.async = "false";
581  xml.loadXML( data );
582  }
583  } catch( e ) {
584  xml = undefined;
585  }
586  if ( !xml || !xml.documentElement || xml.getElementsByTagName( "parsererror" ).length ) {
587  jQuery.error( "Invalid XML: " + data );
588  }
589  return xml;
590  },
591 
592  noop: function() {},
593 
594  // Evaluates a script in a global context
595  // Workarounds based on findings by Jim Driscoll
596  // http://weblogs.java.net/blog/driscoll/archive/2009/09/08/eval-javascript-global-context
597  globalEval: function( data ) {
598  if ( data && jQuery.trim( data ) ) {
599  // We use execScript on Internet Explorer
600  // We use an anonymous function so that context is window
601  // rather than jQuery in Firefox
602  ( window.execScript || function( data ) {
603  window[ "eval" ].call( window, data );
604  } )( data );
605  }
606  },
607 
608  // Convert dashed to camelCase; used by the css and data modules
609  // Microsoft forgot to hump their vendor prefix (#9572)
610  camelCase: function( string ) {
611  return string.replace( rmsPrefix, "ms-" ).replace( rdashAlpha, fcamelCase );
612  },
613 
614  nodeName: function( elem, name ) {
615  return elem.nodeName && elem.nodeName.toLowerCase() === name.toLowerCase();
616  },
617 
618  // args is for internal usage only
619  each: function( obj, callback, args ) {
620  var value,
621  i = 0,
622  length = obj.length,
623  isArray = isArraylike( obj );
624 
625  if ( args ) {
626  if ( isArray ) {
627  for ( ; i < length; i++ ) {
628  value = callback.apply( obj[ i ], args );
629 
630  if ( value === false ) {
631  break;
632  }
633  }
634  } else {
635  for ( i in obj ) {
636  value = callback.apply( obj[ i ], args );
637 
638  if ( value === false ) {
639  break;
640  }
641  }
642  }
643 
644  // A special, fast, case for the most common use of each
645  } else {
646  if ( isArray ) {
647  for ( ; i < length; i++ ) {
648  value = callback.call( obj[ i ], i, obj[ i ] );
649 
650  if ( value === false ) {
651  break;
652  }
653  }
654  } else {
655  for ( i in obj ) {
656  value = callback.call( obj[ i ], i, obj[ i ] );
657 
658  if ( value === false ) {
659  break;
660  }
661  }
662  }
663  }
664 
665  return obj;
666  },
667 
668  // Use native String.trim function wherever possible
669  trim: core_trim && !core_trim.call("\uFEFF\xA0") ?
670  function( text ) {
671  return text == null ?
672  "" :
673  core_trim.call( text );
674  } :
675 
676  // Otherwise use our own trimming functionality
677  function( text ) {
678  return text == null ?
679  "" :
680  ( text + "" ).replace( rtrim, "" );
681  },
682 
683  // results is for internal usage only
684  makeArray: function( arr, results ) {
685  var ret = results || [];
686 
687  if ( arr != null ) {
688  if ( isArraylike( Object(arr) ) ) {
689  jQuery.merge( ret,
690  typeof arr === "string" ?
691  [ arr ] : arr
692  );
693  } else {
694  core_push.call( ret, arr );
695  }
696  }
697 
698  return ret;
699  },
700 
701  inArray: function( elem, arr, i ) {
702  var len;
703 
704  if ( arr ) {
705  if ( core_indexOf ) {
706  return core_indexOf.call( arr, elem, i );
707  }
708 
709  len = arr.length;
710  i = i ? i < 0 ? Math.max( 0, len + i ) : i : 0;
711 
712  for ( ; i < len; i++ ) {
713  // Skip accessing in sparse arrays
714  if ( i in arr && arr[ i ] === elem ) {
715  return i;
716  }
717  }
718  }
719 
720  return -1;
721  },
722 
723  merge: function( first, second ) {
724  var l = second.length,
725  i = first.length,
726  j = 0;
727 
728  if ( typeof l === "number" ) {
729  for ( ; j < l; j++ ) {
730  first[ i++ ] = second[ j ];
731  }
732  } else {
733  while ( second[j] !== undefined ) {
734  first[ i++ ] = second[ j++ ];
735  }
736  }
737 
738  first.length = i;
739 
740  return first;
741  },
742 
743  grep: function( elems, callback, inv ) {
744  var retVal,
745  ret = [],
746  i = 0,
747  length = elems.length;
748  inv = !!inv;
749 
750  // Go through the array, only saving the items
751  // that pass the validator function
752  for ( ; i < length; i++ ) {
753  retVal = !!callback( elems[ i ], i );
754  if ( inv !== retVal ) {
755  ret.push( elems[ i ] );
756  }
757  }
758 
759  return ret;
760  },
761 
762  // arg is for internal usage only
763  map: function( elems, callback, arg ) {
764  var value,
765  i = 0,
766  length = elems.length,
767  isArray = isArraylike( elems ),
768  ret = [];
769 
770  // Go through the array, translating each of the items to their
771  if ( isArray ) {
772  for ( ; i < length; i++ ) {
773  value = callback( elems[ i ], i, arg );
774 
775  if ( value != null ) {
776  ret[ ret.length ] = value;
777  }
778  }
779 
780  // Go through every key on the object,
781  } else {
782  for ( i in elems ) {
783  value = callback( elems[ i ], i, arg );
784 
785  if ( value != null ) {
786  ret[ ret.length ] = value;
787  }
788  }
789  }
790 
791  // Flatten any nested arrays
792  return core_concat.apply( [], ret );
793  },
794 
795  // A global GUID counter for objects
796  guid: 1,
797 
798  // Bind a function to a context, optionally partially applying any
799  // arguments.
800  proxy: function( fn, context ) {
801  var args, proxy, tmp;
802 
803  if ( typeof context === "string" ) {
804  tmp = fn[ context ];
805  context = fn;
806  fn = tmp;
807  }
808 
809  // Quick check to determine if target is callable, in the spec
810  // this throws a TypeError, but we will just return undefined.
811  if ( !jQuery.isFunction( fn ) ) {
812  return undefined;
813  }
814 
815  // Simulated bind
816  args = core_slice.call( arguments, 2 );
817  proxy = function() {
818  return fn.apply( context || this, args.concat( core_slice.call( arguments ) ) );
819  };
820 
821  // Set the guid of unique handler to the same of original handler, so it can be removed
822  proxy.guid = fn.guid = fn.guid || jQuery.guid++;
823 
824  return proxy;
825  },
826 
827  // Multifunctional method to get and set values of a collection
828  // The value/s can optionally be executed if it's a function
829  access: function( elems, fn, key, value, chainable, emptyGet, raw ) {
830  var i = 0,
831  length = elems.length,
832  bulk = key == null;
833 
834  // Sets many values
835  if ( jQuery.type( key ) === "object" ) {
836  chainable = true;
837  for ( i in key ) {
838  jQuery.access( elems, fn, i, key[i], true, emptyGet, raw );
839  }
840 
841  // Sets one value
842  } else if ( value !== undefined ) {
843  chainable = true;
844 
845  if ( !jQuery.isFunction( value ) ) {
846  raw = true;
847  }
848 
849  if ( bulk ) {
850  // Bulk operations run against the entire set
851  if ( raw ) {
852  fn.call( elems, value );
853  fn = null;
854 
855  // ...except when executing function values
856  } else {
857  bulk = fn;
858  fn = function( elem, key, value ) {
859  return bulk.call( jQuery( elem ), value );
860  };
861  }
862  }
863 
864  if ( fn ) {
865  for ( ; i < length; i++ ) {
866  fn( elems[i], key, raw ? value : value.call( elems[i], i, fn( elems[i], key ) ) );
867  }
868  }
869  }
870 
871  return chainable ?
872  elems :
873 
874  // Gets
875  bulk ?
876  fn.call( elems ) :
877  length ? fn( elems[0], key ) : emptyGet;
878  },
879 
880  now: function() {
881  return ( new Date() ).getTime();
882  }
883 });
884 
885 jQuery.ready.promise = function( obj ) {
886  if ( !readyList ) {
887 
888  readyList = jQuery.Deferred();
889 
890  // Catch cases where $(document).ready() is called after the browser event has already occurred.
891  // we once tried to use readyState "interactive" here, but it caused issues like the one
892  // discovered by ChrisS here: http://bugs.jquery.com/ticket/12282#comment:15
893  if ( document.readyState === "complete" ) {
894  // Handle it asynchronously to allow scripts the opportunity to delay ready
895  setTimeout( jQuery.ready );
896 
897  // Standards-based browsers support DOMContentLoaded
898  } else if ( document.addEventListener ) {
899  // Use the handy event callback
900  document.addEventListener( "DOMContentLoaded", completed, false );
901 
902  // A fallback to window.onload, that will always work
903  window.addEventListener( "load", completed, false );
904 
905  // If IE event model is used
906  } else {
907  // Ensure firing before onload, maybe late but safe also for iframes
908  document.attachEvent( "onreadystatechange", completed );
909 
910  // A fallback to window.onload, that will always work
911  window.attachEvent( "onload", completed );
912 
913  // If IE and not a frame
914  // continually check to see if the document is ready
915  var top = false;
916 
917  try {
918  top = window.frameElement == null && document.documentElement;
919  } catch(e) {}
920 
921  if ( top && top.doScroll ) {
922  (function doScrollCheck() {
923  if ( !jQuery.isReady ) {
924 
925  try {
926  // Use the trick by Diego Perini
927  // http://javascript.nwbox.com/IEContentLoaded/
928  top.doScroll("left");
929  } catch(e) {
930  return setTimeout( doScrollCheck, 50 );
931  }
932 
933  // detach all dom ready events
934  detach();
935 
936  // and execute any waiting functions
937  jQuery.ready();
938  }
939  })();
940  }
941  }
942  }
943  return readyList.promise( obj );
944 };
945 
946 // Populate the class2type map
947 jQuery.each("Boolean Number String Function Array Date RegExp Object Error".split(" "), function(i, name) {
948  class2type[ "[object " + name + "]" ] = name.toLowerCase();
949 });
950 
951 function isArraylike( obj ) {
952  var length = obj.length,
953  type = jQuery.type( obj );
954 
955  if ( jQuery.isWindow( obj ) ) {
956  return false;
957  }
958 
959  if ( obj.nodeType === 1 && length ) {
960  return true;
961  }
962 
963  return type === "array" || type !== "function" &&
964  ( length === 0 ||
965  typeof length === "number" && length > 0 && ( length - 1 ) in obj );
966 }
967 
968 // All jQuery objects should point back to these
969 rootjQuery = jQuery(document);
970 // String to Object options format cache
971 var optionsCache = {};
972 
973 // Convert String-formatted options into Object-formatted ones and store in cache
974 function createOptions( options ) {
975  var object = optionsCache[ options ] = {};
976  jQuery.each( options.match( core_rnotwhite ) || [], function( _, flag ) {
977  object[ flag ] = true;
978  });
979  return object;
980 }
981 
982 /*
983  * Create a callback list using the following parameters:
984  *
985  * options: an optional list of space-separated options that will change how
986  * the callback list behaves or a more traditional option object
987  *
988  * By default a callback list will act like an event callback list and can be
989  * "fired" multiple times.
990  *
991  * Possible options:
992  *
993  * once: will ensure the callback list can only be fired once (like a Deferred)
994  *
995  * memory: will keep track of previous values and will call any callback added
996  * after the list has been fired right away with the latest "memorized"
997  * values (like a Deferred)
998  *
999  * unique: will ensure a callback can only be added once (no duplicate in the list)
1000  *
1001  * stopOnFalse: interrupt callings when a callback returns false
1002  *
1003  */
1004 jQuery.Callbacks = function( options ) {
1005 
1006  // Convert options from String-formatted to Object-formatted if needed
1007  // (we check in cache first)
1008  options = typeof options === "string" ?
1009  ( optionsCache[ options ] || createOptions( options ) ) :
1010  jQuery.extend( {}, options );
1011 
1012  var // Flag to know if list is currently firing
1013  firing,
1014  // Last fire value (for non-forgettable lists)
1015  memory,
1016  // Flag to know if list was already fired
1017  fired,
1018  // End of the loop when firing
1019  firingLength,
1020  // Index of currently firing callback (modified by remove if needed)
1021  firingIndex,
1022  // First callback to fire (used internally by add and fireWith)
1023  firingStart,
1024  // Actual callback list
1025  list = [],
1026  // Stack of fire calls for repeatable lists
1027  stack = !options.once && [],
1028  // Fire callbacks
1029  fire = function( data ) {
1030  memory = options.memory && data;
1031  fired = true;
1032  firingIndex = firingStart || 0;
1033  firingStart = 0;
1034  firingLength = list.length;
1035  firing = true;
1036  for ( ; list && firingIndex < firingLength; firingIndex++ ) {
1037  if ( list[ firingIndex ].apply( data[ 0 ], data[ 1 ] ) === false && options.stopOnFalse ) {
1038  memory = false; // To prevent further calls using add
1039  break;
1040  }
1041  }
1042  firing = false;
1043  if ( list ) {
1044  if ( stack ) {
1045  if ( stack.length ) {
1046  fire( stack.shift() );
1047  }
1048  } else if ( memory ) {
1049  list = [];
1050  } else {
1051  self.disable();
1052  }
1053  }
1054  },
1055  // Actual Callbacks object
1056  self = {
1057  // Add a callback or a collection of callbacks to the list
1058  add: function() {
1059  if ( list ) {
1060  // First, we save the current length
1061  var start = list.length;
1062  (function add( args ) {
1063  jQuery.each( args, function( _, arg ) {
1064  var type = jQuery.type( arg );
1065  if ( type === "function" ) {
1066  if ( !options.unique || !self.has( arg ) ) {
1067  list.push( arg );
1068  }
1069  } else if ( arg && arg.length && type !== "string" ) {
1070  // Inspect recursively
1071  add( arg );
1072  }
1073  });
1074  })( arguments );
1075  // Do we need to add the callbacks to the
1076  // current firing batch?
1077  if ( firing ) {
1078  firingLength = list.length;
1079  // With memory, if we're not firing then
1080  // we should call right away
1081  } else if ( memory ) {
1082  firingStart = start;
1083  fire( memory );
1084  }
1085  }
1086  return this;
1087  },
1088  // Remove a callback from the list
1089  remove: function() {
1090  if ( list ) {
1091  jQuery.each( arguments, function( _, arg ) {
1092  var index;
1093  while( ( index = jQuery.inArray( arg, list, index ) ) > -1 ) {
1094  list.splice( index, 1 );
1095  // Handle firing indexes
1096  if ( firing ) {
1097  if ( index <= firingLength ) {
1098  firingLength--;
1099  }
1100  if ( index <= firingIndex ) {
1101  firingIndex--;
1102  }
1103  }
1104  }
1105  });
1106  }
1107  return this;
1108  },
1109  // Check if a given callback is in the list.
1110  // If no argument is given, return whether or not list has callbacks attached.
1111  has: function( fn ) {
1112  return fn ? jQuery.inArray( fn, list ) > -1 : !!( list && list.length );
1113  },
1114  // Remove all callbacks from the list
1115  empty: function() {
1116  list = [];
1117  return this;
1118  },
1119  // Have the list do nothing anymore
1120  disable: function() {
1121  list = stack = memory = undefined;
1122  return this;
1123  },
1124  // Is it disabled?
1125  disabled: function() {
1126  return !list;
1127  },
1128  // Lock the list in its current state
1129  lock: function() {
1130  stack = undefined;
1131  if ( !memory ) {
1132  self.disable();
1133  }
1134  return this;
1135  },
1136  // Is it locked?
1137  locked: function() {
1138  return !stack;
1139  },
1140  // Call all callbacks with the given context and arguments
1141  fireWith: function( context, args ) {
1142  args = args || [];
1143  args = [ context, args.slice ? args.slice() : args ];
1144  if ( list && ( !fired || stack ) ) {
1145  if ( firing ) {
1146  stack.push( args );
1147  } else {
1148  fire( args );
1149  }
1150  }
1151  return this;
1152  },
1153  // Call all the callbacks with the given arguments
1154  fire: function() {
1155  self.fireWith( this, arguments );
1156  return this;
1157  },
1158  // To know if the callbacks have already been called at least once
1159  fired: function() {
1160  return !!fired;
1161  }
1162  };
1163 
1164  return self;
1165 };
1166 jQuery.extend({
1167 
1168  Deferred: function( func ) {
1169  var tuples = [
1170  // action, add listener, listener list, final state
1171  [ "resolve", "done", jQuery.Callbacks("once memory"), "resolved" ],
1172  [ "reject", "fail", jQuery.Callbacks("once memory"), "rejected" ],
1173  [ "notify", "progress", jQuery.Callbacks("memory") ]
1174  ],
1175  state = "pending",
1176  promise = {
1177  state: function() {
1178  return state;
1179  },
1180  always: function() {
1181  deferred.done( arguments ).fail( arguments );
1182  return this;
1183  },
1184  then: function( /* fnDone, fnFail, fnProgress */ ) {
1185  var fns = arguments;
1186  return jQuery.Deferred(function( newDefer ) {
1187  jQuery.each( tuples, function( i, tuple ) {
1188  var action = tuple[ 0 ],
1189  fn = jQuery.isFunction( fns[ i ] ) && fns[ i ];
1190  // deferred[ done | fail | progress ] for forwarding actions to newDefer
1191  deferred[ tuple[1] ](function() {
1192  var returned = fn && fn.apply( this, arguments );
1193  if ( returned && jQuery.isFunction( returned.promise ) ) {
1194  returned.promise()
1195  .done( newDefer.resolve )
1196  .fail( newDefer.reject )
1197  .progress( newDefer.notify );
1198  } else {
1199  newDefer[ action + "With" ]( this === promise ? newDefer.promise() : this, fn ? [ returned ] : arguments );
1200  }
1201  });
1202  });
1203  fns = null;
1204  }).promise();
1205  },
1206  // Get a promise for this deferred
1207  // If obj is provided, the promise aspect is added to the object
1208  promise: function( obj ) {
1209  return obj != null ? jQuery.extend( obj, promise ) : promise;
1210  }
1211  },
1212  deferred = {};
1213 
1214  // Keep pipe for back-compat
1215  promise.pipe = promise.then;
1216 
1217  // Add list-specific methods
1218  jQuery.each( tuples, function( i, tuple ) {
1219  var list = tuple[ 2 ],
1220  stateString = tuple[ 3 ];
1221 
1222  // promise[ done | fail | progress ] = list.add
1223  promise[ tuple[1] ] = list.add;
1224 
1225  // Handle state
1226  if ( stateString ) {
1227  list.add(function() {
1228  // state = [ resolved | rejected ]
1229  state = stateString;
1230 
1231  // [ reject_list | resolve_list ].disable; progress_list.lock
1232  }, tuples[ i ^ 1 ][ 2 ].disable, tuples[ 2 ][ 2 ].lock );
1233  }
1234 
1235  // deferred[ resolve | reject | notify ]
1236  deferred[ tuple[0] ] = function() {
1237  deferred[ tuple[0] + "With" ]( this === deferred ? promise : this, arguments );
1238  return this;
1239  };
1240  deferred[ tuple[0] + "With" ] = list.fireWith;
1241  });
1242 
1243  // Make the deferred a promise
1244  promise.promise( deferred );
1245 
1246  // Call given func if any
1247  if ( func ) {
1248  func.call( deferred, deferred );
1249  }
1250 
1251  // All done!
1252  return deferred;
1253  },
1254 
1255  // Deferred helper
1256  when: function( subordinate /* , ..., subordinateN */ ) {
1257  var i = 0,
1258  resolveValues = core_slice.call( arguments ),
1259  length = resolveValues.length,
1260 
1261  // the count of uncompleted subordinates
1262  remaining = length !== 1 || ( subordinate && jQuery.isFunction( subordinate.promise ) ) ? length : 0,
1263 
1264  // the master Deferred. If resolveValues consist of only a single Deferred, just use that.
1265  deferred = remaining === 1 ? subordinate : jQuery.Deferred(),
1266 
1267  // Update function for both resolve and progress values
1268  updateFunc = function( i, contexts, values ) {
1269  return function( value ) {
1270  contexts[ i ] = this;
1271  values[ i ] = arguments.length > 1 ? core_slice.call( arguments ) : value;
1272  if( values === progressValues ) {
1273  deferred.notifyWith( contexts, values );
1274  } else if ( !( --remaining ) ) {
1275  deferred.resolveWith( contexts, values );
1276  }
1277  };
1278  },
1279 
1280  progressValues, progressContexts, resolveContexts;
1281 
1282  // add listeners to Deferred subordinates; treat others as resolved
1283  if ( length > 1 ) {
1284  progressValues = new Array( length );
1285  progressContexts = new Array( length );
1286  resolveContexts = new Array( length );
1287  for ( ; i < length; i++ ) {
1288  if ( resolveValues[ i ] && jQuery.isFunction( resolveValues[ i ].promise ) ) {
1289  resolveValues[ i ].promise()
1290  .done( updateFunc( i, resolveContexts, resolveValues ) )
1291  .fail( deferred.reject )
1292  .progress( updateFunc( i, progressContexts, progressValues ) );
1293  } else {
1294  --remaining;
1295  }
1296  }
1297  }
1298 
1299  // if we're not waiting on anything, resolve the master
1300  if ( !remaining ) {
1301  deferred.resolveWith( resolveContexts, resolveValues );
1302  }
1303 
1304  return deferred.promise();
1305  }
1306 });
1307 jQuery.support = (function() {
1308 
1309  var support, all, a,
1310  input, select, fragment,
1311  opt, eventName, isSupported, i,
1312  div = document.createElement("div");
1313 
1314  // Setup
1315  div.setAttribute( "className", "t" );
1316  div.innerHTML = " <link/><table></table><a href='/a'>a</a><input type='checkbox'/>";
1317 
1318  // Support tests won't run in some limited or non-browser environments
1319  all = div.getElementsByTagName("*");
1320  a = div.getElementsByTagName("a")[ 0 ];
1321  if ( !all || !a || !all.length ) {
1322  return {};
1323  }
1324 
1325  // First batch of tests
1326  select = document.createElement("select");
1327  opt = select.appendChild( document.createElement("option") );
1328  input = div.getElementsByTagName("input")[ 0 ];
1329 
1330  a.style.cssText = "top:1px;float:left;opacity:.5";
1331  support = {
1332  // Test setAttribute on camelCase class. If it works, we need attrFixes when doing get/setAttribute (ie6/7)
1333  getSetAttribute: div.className !== "t",
1334 
1335  // IE strips leading whitespace when .innerHTML is used
1336  leadingWhitespace: div.firstChild.nodeType === 3,
1337 
1338  // Make sure that tbody elements aren't automatically inserted
1339  // IE will insert them into empty tables
1340  tbody: !div.getElementsByTagName("tbody").length,
1341 
1342  // Make sure that link elements get serialized correctly by innerHTML
1343  // This requires a wrapper element in IE
1344  htmlSerialize: !!div.getElementsByTagName("link").length,
1345 
1346  // Get the style information from getAttribute
1347  // (IE uses .cssText instead)
1348  style: /top/.test( a.getAttribute("style") ),
1349 
1350  // Make sure that URLs aren't manipulated
1351  // (IE normalizes it by default)
1352  hrefNormalized: a.getAttribute("href") === "/a",
1353 
1354  // Make sure that element opacity exists
1355  // (IE uses filter instead)
1356  // Use a regex to work around a WebKit issue. See #5145
1357  opacity: /^0.5/.test( a.style.opacity ),
1358 
1359  // Verify style float existence
1360  // (IE uses styleFloat instead of cssFloat)
1361  cssFloat: !!a.style.cssFloat,
1362 
1363  // Check the default checkbox/radio value ("" on WebKit; "on" elsewhere)
1364  checkOn: !!input.value,
1365 
1366  // Make sure that a selected-by-default option has a working selected property.
1367  // (WebKit defaults to false instead of true, IE too, if it's in an optgroup)
1368  optSelected: opt.selected,
1369 
1370  // Tests for enctype support on a form (#6743)
1371  enctype: !!document.createElement("form").enctype,
1372 
1373  // Makes sure cloning an html5 element does not cause problems
1374  // Where outerHTML is undefined, this still works
1375  html5Clone: document.createElement("nav").cloneNode( true ).outerHTML !== "<:nav></:nav>",
1376 
1377  // jQuery.support.boxModel DEPRECATED in 1.8 since we don't support Quirks Mode
1378  boxModel: document.compatMode === "CSS1Compat",
1379 
1380  // Will be defined later
1381  deleteExpando: true,
1382  noCloneEvent: true,
1383  inlineBlockNeedsLayout: false,
1384  shrinkWrapBlocks: false,
1385  reliableMarginRight: true,
1386  boxSizingReliable: true,
1387  pixelPosition: false
1388  };
1389 
1390  // Make sure checked status is properly cloned
1391  input.checked = true;
1392  support.noCloneChecked = input.cloneNode( true ).checked;
1393 
1394  // Make sure that the options inside disabled selects aren't marked as disabled
1395  // (WebKit marks them as disabled)
1396  select.disabled = true;
1397  support.optDisabled = !opt.disabled;
1398 
1399  // Support: IE<9
1400  try {
1401  delete div.test;
1402  } catch( e ) {
1403  support.deleteExpando = false;
1404  }
1405 
1406  // Check if we can trust getAttribute("value")
1407  input = document.createElement("input");
1408  input.setAttribute( "value", "" );
1409  support.input = input.getAttribute( "value" ) === "";
1410 
1411  // Check if an input maintains its value after becoming a radio
1412  input.value = "t";
1413  input.setAttribute( "type", "radio" );
1414  support.radioValue = input.value === "t";
1415 
1416  // #11217 - WebKit loses check when the name is after the checked attribute
1417  input.setAttribute( "checked", "t" );
1418  input.setAttribute( "name", "t" );
1419 
1420  fragment = document.createDocumentFragment();
1421  fragment.appendChild( input );
1422 
1423  // Check if a disconnected checkbox will retain its checked
1424  // value of true after appended to the DOM (IE6/7)
1425  support.appendChecked = input.checked;
1426 
1427  // WebKit doesn't clone checked state correctly in fragments
1428  support.checkClone = fragment.cloneNode( true ).cloneNode( true ).lastChild.checked;
1429 
1430  // Support: IE<9
1431  // Opera does not clone events (and typeof div.attachEvent === undefined).
1432  // IE9-10 clones events bound via attachEvent, but they don't trigger with .click()
1433  if ( div.attachEvent ) {
1434  div.attachEvent( "onclick", function() {
1435  support.noCloneEvent = false;
1436  });
1437 
1438  div.cloneNode( true ).click();
1439  }
1440 
1441  // Support: IE<9 (lack submit/change bubble), Firefox 17+ (lack focusin event)
1442  // Beware of CSP restrictions (https://developer.mozilla.org/en/Security/CSP), test/csp.php
1443  for ( i in { submit: true, change: true, focusin: true }) {
1444  div.setAttribute( eventName = "on" + i, "t" );
1445 
1446  support[ i + "Bubbles" ] = eventName in window || div.attributes[ eventName ].expando === false;
1447  }
1448 
1449  div.style.backgroundClip = "content-box";
1450  div.cloneNode( true ).style.backgroundClip = "";
1451  support.clearCloneStyle = div.style.backgroundClip === "content-box";
1452 
1453  // Run tests that need a body at doc ready
1454  jQuery(function() {
1455  var container, marginDiv, tds,
1456  divReset = "padding:0;margin:0;border:0;display:block;box-sizing:content-box;-moz-box-sizing:content-box;-webkit-box-sizing:content-box;",
1457  body = document.getElementsByTagName("body")[0];
1458 
1459  if ( !body ) {
1460  // Return for frameset docs that don't have a body
1461  return;
1462  }
1463 
1464  container = document.createElement("div");
1465  container.style.cssText = "border:0;width:0;height:0;position:absolute;top:0;left:-9999px;margin-top:1px";
1466 
1467  body.appendChild( container ).appendChild( div );
1468 
1469  // Support: IE8
1470  // Check if table cells still have offsetWidth/Height when they are set
1471  // to display:none and there are still other visible table cells in a
1472  // table row; if so, offsetWidth/Height are not reliable for use when
1473  // determining if an element has been hidden directly using
1474  // display:none (it is still safe to use offsets if a parent element is
1475  // hidden; don safety goggles and see bug #4512 for more information).
1476  div.innerHTML = "<table><tr><td></td><td>t</td></tr></table>";
1477  tds = div.getElementsByTagName("td");
1478  tds[ 0 ].style.cssText = "padding:0;margin:0;border:0;display:none";
1479  isSupported = ( tds[ 0 ].offsetHeight === 0 );
1480 
1481  tds[ 0 ].style.display = "";
1482  tds[ 1 ].style.display = "none";
1483 
1484  // Support: IE8
1485  // Check if empty table cells still have offsetWidth/Height
1486  support.reliableHiddenOffsets = isSupported && ( tds[ 0 ].offsetHeight === 0 );
1487 
1488  // Check box-sizing and margin behavior
1489  div.innerHTML = "";
1490  div.style.cssText = "box-sizing:border-box;-moz-box-sizing:border-box;-webkit-box-sizing:border-box;padding:1px;border:1px;display:block;width:4px;margin-top:1%;position:absolute;top:1%;";
1491  support.boxSizing = ( div.offsetWidth === 4 );
1492  support.doesNotIncludeMarginInBodyOffset = ( body.offsetTop !== 1 );
1493 
1494  // Use window.getComputedStyle because jsdom on node.js will break without it.
1495  if ( window.getComputedStyle ) {
1496  support.pixelPosition = ( window.getComputedStyle( div, null ) || {} ).top !== "1%";
1497  support.boxSizingReliable = ( window.getComputedStyle( div, null ) || { width: "4px" } ).width === "4px";
1498 
1499  // Check if div with explicit width and no margin-right incorrectly
1500  // gets computed margin-right based on width of container. (#3333)
1501  // Fails in WebKit before Feb 2011 nightlies
1502  // WebKit Bug 13343 - getComputedStyle returns wrong value for margin-right
1503  marginDiv = div.appendChild( document.createElement("div") );
1504  marginDiv.style.cssText = div.style.cssText = divReset;
1505  marginDiv.style.marginRight = marginDiv.style.width = "0";
1506  div.style.width = "1px";
1507 
1508  support.reliableMarginRight =
1509  !parseFloat( ( window.getComputedStyle( marginDiv, null ) || {} ).marginRight );
1510  }
1511 
1512  if ( typeof div.style.zoom !== core_strundefined ) {
1513  // Support: IE<8
1514  // Check if natively block-level elements act like inline-block
1515  // elements when setting their display to 'inline' and giving
1516  // them layout
1517  div.innerHTML = "";
1518  div.style.cssText = divReset + "width:1px;padding:1px;display:inline;zoom:1";
1519  support.inlineBlockNeedsLayout = ( div.offsetWidth === 3 );
1520 
1521  // Support: IE6
1522  // Check if elements with layout shrink-wrap their children
1523  div.style.display = "block";
1524  div.innerHTML = "<div></div>";
1525  div.firstChild.style.width = "5px";
1526  support.shrinkWrapBlocks = ( div.offsetWidth !== 3 );
1527 
1528  if ( support.inlineBlockNeedsLayout ) {
1529  // Prevent IE 6 from affecting layout for positioned elements #11048
1530  // Prevent IE from shrinking the body in IE 7 mode #12869
1531  // Support: IE<8
1532  body.style.zoom = 1;
1533  }
1534  }
1535 
1536  body.removeChild( container );
1537 
1538  // Null elements to avoid leaks in IE
1539  container = div = tds = marginDiv = null;
1540  });
1541 
1542  // Null elements to avoid leaks in IE
1543  all = select = fragment = opt = a = input = null;
1544 
1545  return support;
1546 })();
1547 
1548 var rbrace = /(?:\{[\s\S]*\}|\[[\s\S]*\])$/,
1549  rmultiDash = /([A-Z])/g;
1550 
1551 function internalData( elem, name, data, pvt /* Internal Use Only */ ){
1552  if ( !jQuery.acceptData( elem ) ) {
1553  return;
1554  }
1555 
1556  var thisCache, ret,
1557  internalKey = jQuery.expando,
1558  getByName = typeof name === "string",
1559 
1560  // We have to handle DOM nodes and JS objects differently because IE6-7
1561  // can't GC object references properly across the DOM-JS boundary
1562  isNode = elem.nodeType,
1563 
1564  // Only DOM nodes need the global jQuery cache; JS object data is
1565  // attached directly to the object so GC can occur automatically
1566  cache = isNode ? jQuery.cache : elem,
1567 
1568  // Only defining an ID for JS objects if its cache already exists allows
1569  // the code to shortcut on the same path as a DOM node with no cache
1570  id = isNode ? elem[ internalKey ] : elem[ internalKey ] && internalKey;
1571 
1572  // Avoid doing any more work than we need to when trying to get data on an
1573  // object that has no data at all
1574  if ( (!id || !cache[id] || (!pvt && !cache[id].data)) && getByName && data === undefined ) {
1575  return;
1576  }
1577 
1578  if ( !id ) {
1579  // Only DOM nodes need a new unique ID for each element since their data
1580  // ends up in the global cache
1581  if ( isNode ) {
1582  elem[ internalKey ] = id = core_deletedIds.pop() || jQuery.guid++;
1583  } else {
1584  id = internalKey;
1585  }
1586  }
1587 
1588  if ( !cache[ id ] ) {
1589  cache[ id ] = {};
1590 
1591  // Avoids exposing jQuery metadata on plain JS objects when the object
1592  // is serialized using JSON.stringify
1593  if ( !isNode ) {
1594  cache[ id ].toJSON = jQuery.noop;
1595  }
1596  }
1597 
1598  // An object can be passed to jQuery.data instead of a key/value pair; this gets
1599  // shallow copied over onto the existing cache
1600  if ( typeof name === "object" || typeof name === "function" ) {
1601  if ( pvt ) {
1602  cache[ id ] = jQuery.extend( cache[ id ], name );
1603  } else {
1604  cache[ id ].data = jQuery.extend( cache[ id ].data, name );
1605  }
1606  }
1607 
1608  thisCache = cache[ id ];
1609 
1610  // jQuery data() is stored in a separate object inside the object's internal data
1611  // cache in order to avoid key collisions between internal data and user-defined
1612  // data.
1613  if ( !pvt ) {
1614  if ( !thisCache.data ) {
1615  thisCache.data = {};
1616  }
1617 
1618  thisCache = thisCache.data;
1619  }
1620 
1621  if ( data !== undefined ) {
1622  thisCache[ jQuery.camelCase( name ) ] = data;
1623  }
1624 
1625  // Check for both converted-to-camel and non-converted data property names
1626  // If a data property was specified
1627  if ( getByName ) {
1628 
1629  // First Try to find as-is property data
1630  ret = thisCache[ name ];
1631 
1632  // Test for null|undefined property data
1633  if ( ret == null ) {
1634 
1635  // Try to find the camelCased property
1636  ret = thisCache[ jQuery.camelCase( name ) ];
1637  }
1638  } else {
1639  ret = thisCache;
1640  }
1641 
1642  return ret;
1643 }
1644 
1645 function internalRemoveData( elem, name, pvt ) {
1646  if ( !jQuery.acceptData( elem ) ) {
1647  return;
1648  }
1649 
1650  var i, l, thisCache,
1651  isNode = elem.nodeType,
1652 
1653  // See jQuery.data for more information
1654  cache = isNode ? jQuery.cache : elem,
1655  id = isNode ? elem[ jQuery.expando ] : jQuery.expando;
1656 
1657  // If there is already no cache entry for this object, there is no
1658  // purpose in continuing
1659  if ( !cache[ id ] ) {
1660  return;
1661  }
1662 
1663  if ( name ) {
1664 
1665  thisCache = pvt ? cache[ id ] : cache[ id ].data;
1666 
1667  if ( thisCache ) {
1668 
1669  // Support array or space separated string names for data keys
1670  if ( !jQuery.isArray( name ) ) {
1671 
1672  // try the string as a key before any manipulation
1673  if ( name in thisCache ) {
1674  name = [ name ];
1675  } else {
1676 
1677  // split the camel cased version by spaces unless a key with the spaces exists
1678  name = jQuery.camelCase( name );
1679  if ( name in thisCache ) {
1680  name = [ name ];
1681  } else {
1682  name = name.split(" ");
1683  }
1684  }
1685  } else {
1686  // If "name" is an array of keys...
1687  // When data is initially created, via ("key", "val") signature,
1688  // keys will be converted to camelCase.
1689  // Since there is no way to tell _how_ a key was added, remove
1690  // both plain key and camelCase key. #12786
1691  // This will only penalize the array argument path.
1692  name = name.concat( jQuery.map( name, jQuery.camelCase ) );
1693  }
1694 
1695  for ( i = 0, l = name.length; i < l; i++ ) {
1696  delete thisCache[ name[i] ];
1697  }
1698 
1699  // If there is no data left in the cache, we want to continue
1700  // and let the cache object itself get destroyed
1701  if ( !( pvt ? isEmptyDataObject : jQuery.isEmptyObject )( thisCache ) ) {
1702  return;
1703  }
1704  }
1705  }
1706 
1707  // See jQuery.data for more information
1708  if ( !pvt ) {
1709  delete cache[ id ].data;
1710 
1711  // Don't destroy the parent cache unless the internal data object
1712  // had been the only thing left in it
1713  if ( !isEmptyDataObject( cache[ id ] ) ) {
1714  return;
1715  }
1716  }
1717 
1718  // Destroy the cache
1719  if ( isNode ) {
1720  jQuery.cleanData( [ elem ], true );
1721 
1722  // Use delete when supported for expandos or `cache` is not a window per isWindow (#10080)
1723  } else if ( jQuery.support.deleteExpando || cache != cache.window ) {
1724  delete cache[ id ];
1725 
1726  // When all else fails, null
1727  } else {
1728  cache[ id ] = null;
1729  }
1730 }
1731 
1732 jQuery.extend({
1733  cache: {},
1734 
1735  // Unique for each copy of jQuery on the page
1736  // Non-digits removed to match rinlinejQuery
1737  expando: "jQuery" + ( core_version + Math.random() ).replace( /\D/g, "" ),
1738 
1739  // The following elements throw uncatchable exceptions if you
1740  // attempt to add expando properties to them.
1741  noData: {
1742  "embed": true,
1743  // Ban all objects except for Flash (which handle expandos)
1744  "object": "clsid:D27CDB6E-AE6D-11cf-96B8-444553540000",
1745  "applet": true
1746  },
1747 
1748  hasData: function( elem ) {
1749  elem = elem.nodeType ? jQuery.cache[ elem[jQuery.expando] ] : elem[ jQuery.expando ];
1750  return !!elem && !isEmptyDataObject( elem );
1751  },
1752 
1753  data: function( elem, name, data ) {
1754  return internalData( elem, name, data );
1755  },
1756 
1757  removeData: function( elem, name ) {
1758  return internalRemoveData( elem, name );
1759  },
1760 
1761  // For internal use only.
1762  _data: function( elem, name, data ) {
1763  return internalData( elem, name, data, true );
1764  },
1765 
1766  _removeData: function( elem, name ) {
1767  return internalRemoveData( elem, name, true );
1768  },
1769 
1770  // A method for determining if a DOM node can handle the data expando
1771  acceptData: function( elem ) {
1772  // Do not set data on non-element because it will not be cleared (#8335).
1773  if ( elem.nodeType && elem.nodeType !== 1 && elem.nodeType !== 9 ) {
1774  return false;
1775  }
1776 
1777  var noData = elem.nodeName && jQuery.noData[ elem.nodeName.toLowerCase() ];
1778 
1779  // nodes accept data unless otherwise specified; rejection can be conditional
1780  return !noData || noData !== true && elem.getAttribute("classid") === noData;
1781  }
1782 });
1783 
1784 jQuery.fn.extend({
1785  data: function( key, value ) {
1786  var attrs, name,
1787  elem = this[0],
1788  i = 0,
1789  data = null;
1790 
1791  // Gets all values
1792  if ( key === undefined ) {
1793  if ( this.length ) {
1794  data = jQuery.data( elem );
1795 
1796  if ( elem.nodeType === 1 && !jQuery._data( elem, "parsedAttrs" ) ) {
1797  attrs = elem.attributes;
1798  for ( ; i < attrs.length; i++ ) {
1799  name = attrs[i].name;
1800 
1801  if ( !name.indexOf( "data-" ) ) {
1802  name = jQuery.camelCase( name.slice(5) );
1803 
1804  dataAttr( elem, name, data[ name ] );
1805  }
1806  }
1807  jQuery._data( elem, "parsedAttrs", true );
1808  }
1809  }
1810 
1811  return data;
1812  }
1813 
1814  // Sets multiple values
1815  if ( typeof key === "object" ) {
1816  return this.each(function() {
1817  jQuery.data( this, key );
1818  });
1819  }
1820 
1821  return jQuery.access( this, function( value ) {
1822 
1823  if ( value === undefined ) {
1824  // Try to fetch any internally stored data first
1825  return elem ? dataAttr( elem, key, jQuery.data( elem, key ) ) : null;
1826  }
1827 
1828  this.each(function() {
1829  jQuery.data( this, key, value );
1830  });
1831  }, null, value, arguments.length > 1, null, true );
1832  },
1833 
1834  removeData: function( key ) {
1835  return this.each(function() {
1836  jQuery.removeData( this, key );
1837  });
1838  }
1839 });
1840 
1841 function dataAttr( elem, key, data ) {
1842  // If nothing was found internally, try to fetch any
1843  // data from the HTML5 data-* attribute
1844  if ( data === undefined && elem.nodeType === 1 ) {
1845 
1846  var name = "data-" + key.replace( rmultiDash, "-$1" ).toLowerCase();
1847 
1848  data = elem.getAttribute( name );
1849 
1850  if ( typeof data === "string" ) {
1851  try {
1852  data = data === "true" ? true :
1853  data === "false" ? false :
1854  data === "null" ? null :
1855  // Only convert to a number if it doesn't change the string
1856  +data + "" === data ? +data :
1857  rbrace.test( data ) ? jQuery.parseJSON( data ) :
1858  data;
1859  } catch( e ) {}
1860 
1861  // Make sure we set the data so it isn't changed later
1862  jQuery.data( elem, key, data );
1863 
1864  } else {
1865  data = undefined;
1866  }
1867  }
1868 
1869  return data;
1870 }
1871 
1872 // checks a cache object for emptiness
1873 function isEmptyDataObject( obj ) {
1874  var name;
1875  for ( name in obj ) {
1876 
1877  // if the public data object is empty, the private is still empty
1878  if ( name === "data" && jQuery.isEmptyObject( obj[name] ) ) {
1879  continue;
1880  }
1881  if ( name !== "toJSON" ) {
1882  return false;
1883  }
1884  }
1885 
1886  return true;
1887 }
1888 jQuery.extend({
1889  queue: function( elem, type, data ) {
1890  var queue;
1891 
1892  if ( elem ) {
1893  type = ( type || "fx" ) + "queue";
1894  queue = jQuery._data( elem, type );
1895 
1896  // Speed up dequeue by getting out quickly if this is just a lookup
1897  if ( data ) {
1898  if ( !queue || jQuery.isArray(data) ) {
1899  queue = jQuery._data( elem, type, jQuery.makeArray(data) );
1900  } else {
1901  queue.push( data );
1902  }
1903  }
1904  return queue || [];
1905  }
1906  },
1907 
1908  dequeue: function( elem, type ) {
1909  type = type || "fx";
1910 
1911  var queue = jQuery.queue( elem, type ),
1912  startLength = queue.length,
1913  fn = queue.shift(),
1914  hooks = jQuery._queueHooks( elem, type ),
1915  next = function() {
1916  jQuery.dequeue( elem, type );
1917  };
1918 
1919  // If the fx queue is dequeued, always remove the progress sentinel
1920  if ( fn === "inprogress" ) {
1921  fn = queue.shift();
1922  startLength--;
1923  }
1924 
1925  hooks.cur = fn;
1926  if ( fn ) {
1927 
1928  // Add a progress sentinel to prevent the fx queue from being
1929  // automatically dequeued
1930  if ( type === "fx" ) {
1931  queue.unshift( "inprogress" );
1932  }
1933 
1934  // clear up the last queue stop function
1935  delete hooks.stop;
1936  fn.call( elem, next, hooks );
1937  }
1938 
1939  if ( !startLength && hooks ) {
1940  hooks.empty.fire();
1941  }
1942  },
1943 
1944  // not intended for public consumption - generates a queueHooks object, or returns the current one
1945  _queueHooks: function( elem, type ) {
1946  var key = type + "queueHooks";
1947  return jQuery._data( elem, key ) || jQuery._data( elem, key, {
1948  empty: jQuery.Callbacks("once memory").add(function() {
1949  jQuery._removeData( elem, type + "queue" );
1950  jQuery._removeData( elem, key );
1951  })
1952  });
1953  }
1954 });
1955 
1956 jQuery.fn.extend({
1957  queue: function( type, data ) {
1958  var setter = 2;
1959 
1960  if ( typeof type !== "string" ) {
1961  data = type;
1962  type = "fx";
1963  setter--;
1964  }
1965 
1966  if ( arguments.length < setter ) {
1967  return jQuery.queue( this[0], type );
1968  }
1969 
1970  return data === undefined ?
1971  this :
1972  this.each(function() {
1973  var queue = jQuery.queue( this, type, data );
1974 
1975  // ensure a hooks for this queue
1976  jQuery._queueHooks( this, type );
1977 
1978  if ( type === "fx" && queue[0] !== "inprogress" ) {
1979  jQuery.dequeue( this, type );
1980  }
1981  });
1982  },
1983  dequeue: function( type ) {
1984  return this.each(function() {
1985  jQuery.dequeue( this, type );
1986  });
1987  },
1988  // Based off of the plugin by Clint Helfers, with permission.
1989  // http://blindsignals.com/index.php/2009/07/jquery-delay/
1990  delay: function( time, type ) {
1991  time = jQuery.fx ? jQuery.fx.speeds[ time ] || time : time;
1992  type = type || "fx";
1993 
1994  return this.queue( type, function( next, hooks ) {
1995  var timeout = setTimeout( next, time );
1996  hooks.stop = function() {
1997  clearTimeout( timeout );
1998  };
1999  });
2000  },
2001  clearQueue: function( type ) {
2002  return this.queue( type || "fx", [] );
2003  },
2004  // Get a promise resolved when queues of a certain type
2005  // are emptied (fx is the type by default)
2006  promise: function( type, obj ) {
2007  var tmp,
2008  count = 1,
2009  defer = jQuery.Deferred(),
2010  elements = this,
2011  i = this.length,
2012  resolve = function() {
2013  if ( !( --count ) ) {
2014  defer.resolveWith( elements, [ elements ] );
2015  }
2016  };
2017 
2018  if ( typeof type !== "string" ) {
2019  obj = type;
2020  type = undefined;
2021  }
2022  type = type || "fx";
2023 
2024  while( i-- ) {
2025  tmp = jQuery._data( elements[ i ], type + "queueHooks" );
2026  if ( tmp && tmp.empty ) {
2027  count++;
2028  tmp.empty.add( resolve );
2029  }
2030  }
2031  resolve();
2032  return defer.promise( obj );
2033  }
2034 });
2035 var nodeHook, boolHook,
2036  rclass = /[\t\r\n]/g,
2037  rreturn = /\r/g,
2038  rfocusable = /^(?:input|select|textarea|button|object)$/i,
2039  rclickable = /^(?:a|area)$/i,
2040  rboolean = /^(?:checked|selected|autofocus|autoplay|async|controls|defer|disabled|hidden|loop|multiple|open|readonly|required|scoped)$/i,
2041  ruseDefault = /^(?:checked|selected)$/i,
2042  getSetAttribute = jQuery.support.getSetAttribute,
2043  getSetInput = jQuery.support.input;
2044 
2045 jQuery.fn.extend({
2046  attr: function( name, value ) {
2047  return jQuery.access( this, jQuery.attr, name, value, arguments.length > 1 );
2048  },
2049 
2050  removeAttr: function( name ) {
2051  return this.each(function() {
2052  jQuery.removeAttr( this, name );
2053  });
2054  },
2055 
2056  prop: function( name, value ) {
2057  return jQuery.access( this, jQuery.prop, name, value, arguments.length > 1 );
2058  },
2059 
2060  removeProp: function( name ) {
2061  name = jQuery.propFix[ name ] || name;
2062  return this.each(function() {
2063  // try/catch handles cases where IE balks (such as removing a property on window)
2064  try {
2065  this[ name ] = undefined;
2066  delete this[ name ];
2067  } catch( e ) {}
2068  });
2069  },
2070 
2071  addClass: function( value ) {
2072  var classes, elem, cur, clazz, j,
2073  i = 0,
2074  len = this.length,
2075  proceed = typeof value === "string" && value;
2076 
2077  if ( jQuery.isFunction( value ) ) {
2078  return this.each(function( j ) {
2079  jQuery( this ).addClass( value.call( this, j, this.className ) );
2080  });
2081  }
2082 
2083  if ( proceed ) {
2084  // The disjunction here is for better compressibility (see removeClass)
2085  classes = ( value || "" ).match( core_rnotwhite ) || [];
2086 
2087  for ( ; i < len; i++ ) {
2088  elem = this[ i ];
2089  cur = elem.nodeType === 1 && ( elem.className ?
2090  ( " " + elem.className + " " ).replace( rclass, " " ) :
2091  " "
2092  );
2093 
2094  if ( cur ) {
2095  j = 0;
2096  while ( (clazz = classes[j++]) ) {
2097  if ( cur.indexOf( " " + clazz + " " ) < 0 ) {
2098  cur += clazz + " ";
2099  }
2100  }
2101  elem.className = jQuery.trim( cur );
2102 
2103  }
2104  }
2105  }
2106 
2107  return this;
2108  },
2109 
2110  removeClass: function( value ) {
2111  var classes, elem, cur, clazz, j,
2112  i = 0,
2113  len = this.length,
2114  proceed = arguments.length === 0 || typeof value === "string" && value;
2115 
2116  if ( jQuery.isFunction( value ) ) {
2117  return this.each(function( j ) {
2118  jQuery( this ).removeClass( value.call( this, j, this.className ) );
2119  });
2120  }
2121  if ( proceed ) {
2122  classes = ( value || "" ).match( core_rnotwhite ) || [];
2123 
2124  for ( ; i < len; i++ ) {
2125  elem = this[ i ];
2126  // This expression is here for better compressibility (see addClass)
2127  cur = elem.nodeType === 1 && ( elem.className ?
2128  ( " " + elem.className + " " ).replace( rclass, " " ) :
2129  ""
2130  );
2131 
2132  if ( cur ) {
2133  j = 0;
2134  while ( (clazz = classes[j++]) ) {
2135  // Remove *all* instances
2136  while ( cur.indexOf( " " + clazz + " " ) >= 0 ) {
2137  cur = cur.replace( " " + clazz + " ", " " );
2138  }
2139  }
2140  elem.className = value ? jQuery.trim( cur ) : "";
2141  }
2142  }
2143  }
2144 
2145  return this;
2146  },
2147 
2148  toggleClass: function( value, stateVal ) {
2149  var type = typeof value,
2150  isBool = typeof stateVal === "boolean";
2151 
2152  if ( jQuery.isFunction( value ) ) {
2153  return this.each(function( i ) {
2154  jQuery( this ).toggleClass( value.call(this, i, this.className, stateVal), stateVal );
2155  });
2156  }
2157 
2158  return this.each(function() {
2159  if ( type === "string" ) {
2160  // toggle individual class names
2161  var className,
2162  i = 0,
2163  self = jQuery( this ),
2164  state = stateVal,
2165  classNames = value.match( core_rnotwhite ) || [];
2166 
2167  while ( (className = classNames[ i++ ]) ) {
2168  // check each className given, space separated list
2169  state = isBool ? state : !self.hasClass( className );
2170  self[ state ? "addClass" : "removeClass" ]( className );
2171  }
2172 
2173  // Toggle whole class name
2174  } else if ( type === core_strundefined || type === "boolean" ) {
2175  if ( this.className ) {
2176  // store className if set
2177  jQuery._data( this, "__className__", this.className );
2178  }
2179 
2180  // If the element has a class name or if we're passed "false",
2181  // then remove the whole classname (if there was one, the above saved it).
2182  // Otherwise bring back whatever was previously saved (if anything),
2183  // falling back to the empty string if nothing was stored.
2184  this.className = this.className || value === false ? "" : jQuery._data( this, "__className__" ) || "";
2185  }
2186  });
2187  },
2188 
2189  hasClass: function( selector ) {
2190  var className = " " + selector + " ",
2191  i = 0,
2192  l = this.length;
2193  for ( ; i < l; i++ ) {
2194  if ( this[i].nodeType === 1 && (" " + this[i].className + " ").replace(rclass, " ").indexOf( className ) >= 0 ) {
2195  return true;
2196  }
2197  }
2198 
2199  return false;
2200  },
2201 
2202  val: function( value ) {
2203  var ret, hooks, isFunction,
2204  elem = this[0];
2205 
2206  if ( !arguments.length ) {
2207  if ( elem ) {
2208  hooks = jQuery.valHooks[ elem.type ] || jQuery.valHooks[ elem.nodeName.toLowerCase() ];
2209 
2210  if ( hooks && "get" in hooks && (ret = hooks.get( elem, "value" )) !== undefined ) {
2211  return ret;
2212  }
2213 
2214  ret = elem.value;
2215 
2216  return typeof ret === "string" ?
2217  // handle most common string cases
2218  ret.replace(rreturn, "") :
2219  // handle cases where value is null/undef or number
2220  ret == null ? "" : ret;
2221  }
2222 
2223  return;
2224  }
2225 
2226  isFunction = jQuery.isFunction( value );
2227 
2228  return this.each(function( i ) {
2229  var val,
2230  self = jQuery(this);
2231 
2232  if ( this.nodeType !== 1 ) {
2233  return;
2234  }
2235 
2236  if ( isFunction ) {
2237  val = value.call( this, i, self.val() );
2238  } else {
2239  val = value;
2240  }
2241 
2242  // Treat null/undefined as ""; convert numbers to string
2243  if ( val == null ) {
2244  val = "";
2245  } else if ( typeof val === "number" ) {
2246  val += "";
2247  } else if ( jQuery.isArray( val ) ) {
2248  val = jQuery.map(val, function ( value ) {
2249  return value == null ? "" : value + "";
2250  });
2251  }
2252 
2253  hooks = jQuery.valHooks[ this.type ] || jQuery.valHooks[ this.nodeName.toLowerCase() ];
2254 
2255  // If set returns undefined, fall back to normal setting
2256  if ( !hooks || !("set" in hooks) || hooks.set( this, val, "value" ) === undefined ) {
2257  this.value = val;
2258  }
2259  });
2260  }
2261 });
2262 
2263 jQuery.extend({
2264  valHooks: {
2265  option: {
2266  get: function( elem ) {
2267  // attributes.value is undefined in Blackberry 4.7 but
2268  // uses .value. See #6932
2269  var val = elem.attributes.value;
2270  return !val || val.specified ? elem.value : elem.text;
2271  }
2272  },
2273  select: {
2274  get: function( elem ) {
2275  var value, option,
2276  options = elem.options,
2277  index = elem.selectedIndex,
2278  one = elem.type === "select-one" || index < 0,
2279  values = one ? null : [],
2280  max = one ? index + 1 : options.length,
2281  i = index < 0 ?
2282  max :
2283  one ? index : 0;
2284 
2285  // Loop through all the selected options
2286  for ( ; i < max; i++ ) {
2287  option = options[ i ];
2288 
2289  // oldIE doesn't update selected after form reset (#2551)
2290  if ( ( option.selected || i === index ) &&
2291  // Don't return options that are disabled or in a disabled optgroup
2292  ( jQuery.support.optDisabled ? !option.disabled : option.getAttribute("disabled") === null ) &&
2293  ( !option.parentNode.disabled || !jQuery.nodeName( option.parentNode, "optgroup" ) ) ) {
2294 
2295  // Get the specific value for the option
2296  value = jQuery( option ).val();
2297 
2298  // We don't need an array for one selects
2299  if ( one ) {
2300  return value;
2301  }
2302 
2303  // Multi-Selects return an array
2304  values.push( value );
2305  }
2306  }
2307 
2308  return values;
2309  },
2310 
2311  set: function( elem, value ) {
2312  var values = jQuery.makeArray( value );
2313 
2314  jQuery(elem).find("option").each(function() {
2315  this.selected = jQuery.inArray( jQuery(this).val(), values ) >= 0;
2316  });
2317 
2318  if ( !values.length ) {
2319  elem.selectedIndex = -1;
2320  }
2321  return values;
2322  }
2323  }
2324  },
2325 
2326  attr: function( elem, name, value ) {
2327  var hooks, notxml, ret,
2328  nType = elem.nodeType;
2329 
2330  // don't get/set attributes on text, comment and attribute nodes
2331  if ( !elem || nType === 3 || nType === 8 || nType === 2 ) {
2332  return;
2333  }
2334 
2335  // Fallback to prop when attributes are not supported
2336  if ( typeof elem.getAttribute === core_strundefined ) {
2337  return jQuery.prop( elem, name, value );
2338  }
2339 
2340  notxml = nType !== 1 || !jQuery.isXMLDoc( elem );
2341 
2342  // All attributes are lowercase
2343  // Grab necessary hook if one is defined
2344  if ( notxml ) {
2345  name = name.toLowerCase();
2346  hooks = jQuery.attrHooks[ name ] || ( rboolean.test( name ) ? boolHook : nodeHook );
2347  }
2348 
2349  if ( value !== undefined ) {
2350 
2351  if ( value === null ) {
2352  jQuery.removeAttr( elem, name );
2353 
2354  } else if ( hooks && notxml && "set" in hooks && (ret = hooks.set( elem, value, name )) !== undefined ) {
2355  return ret;
2356 
2357  } else {
2358  elem.setAttribute( name, value + "" );
2359  return value;
2360  }
2361 
2362  } else if ( hooks && notxml && "get" in hooks && (ret = hooks.get( elem, name )) !== null ) {
2363  return ret;
2364 
2365  } else {
2366 
2367  // In IE9+, Flash objects don't have .getAttribute (#12945)
2368  // Support: IE9+
2369  if ( typeof elem.getAttribute !== core_strundefined ) {
2370  ret = elem.getAttribute( name );
2371  }
2372 
2373  // Non-existent attributes return null, we normalize to undefined
2374  return ret == null ?
2375  undefined :
2376  ret;
2377  }
2378  },
2379 
2380  removeAttr: function( elem, value ) {
2381  var name, propName,
2382  i = 0,
2383  attrNames = value && value.match( core_rnotwhite );
2384 
2385  if ( attrNames && elem.nodeType === 1 ) {
2386  while ( (name = attrNames[i++]) ) {
2387  propName = jQuery.propFix[ name ] || name;
2388 
2389  // Boolean attributes get special treatment (#10870)
2390  if ( rboolean.test( name ) ) {
2391  // Set corresponding property to false for boolean attributes
2392  // Also clear defaultChecked/defaultSelected (if appropriate) for IE<8
2393  if ( !getSetAttribute && ruseDefault.test( name ) ) {
2394  elem[ jQuery.camelCase( "default-" + name ) ] =
2395  elem[ propName ] = false;
2396  } else {
2397  elem[ propName ] = false;
2398  }
2399 
2400  // See #9699 for explanation of this approach (setting first, then removal)
2401  } else {
2402  jQuery.attr( elem, name, "" );
2403  }
2404 
2405  elem.removeAttribute( getSetAttribute ? name : propName );
2406  }
2407  }
2408  },
2409 
2410  attrHooks: {
2411  type: {
2412  set: function( elem, value ) {
2413  if ( !jQuery.support.radioValue && value === "radio" && jQuery.nodeName(elem, "input") ) {
2414  // Setting the type on a radio button after the value resets the value in IE6-9
2415  // Reset value to default in case type is set after value during creation
2416  var val = elem.value;
2417  elem.setAttribute( "type", value );
2418  if ( val ) {
2419  elem.value = val;
2420  }
2421  return value;
2422  }
2423  }
2424  }
2425  },
2426 
2427  propFix: {
2428  tabindex: "tabIndex",
2429  readonly: "readOnly",
2430  "for": "htmlFor",
2431  "class": "className",
2432  maxlength: "maxLength",
2433  cellspacing: "cellSpacing",
2434  cellpadding: "cellPadding",
2435  rowspan: "rowSpan",
2436  colspan: "colSpan",
2437  usemap: "useMap",
2438  frameborder: "frameBorder",
2439  contenteditable: "contentEditable"
2440  },
2441 
2442  prop: function( elem, name, value ) {
2443  var ret, hooks, notxml,
2444  nType = elem.nodeType;
2445 
2446  // don't get/set properties on text, comment and attribute nodes
2447  if ( !elem || nType === 3 || nType === 8 || nType === 2 ) {
2448  return;
2449  }
2450 
2451  notxml = nType !== 1 || !jQuery.isXMLDoc( elem );
2452 
2453  if ( notxml ) {
2454  // Fix name and attach hooks
2455  name = jQuery.propFix[ name ] || name;
2456  hooks = jQuery.propHooks[ name ];
2457  }
2458 
2459  if ( value !== undefined ) {
2460  if ( hooks && "set" in hooks && (ret = hooks.set( elem, value, name )) !== undefined ) {
2461  return ret;
2462 
2463  } else {
2464  return ( elem[ name ] = value );
2465  }
2466 
2467  } else {
2468  if ( hooks && "get" in hooks && (ret = hooks.get( elem, name )) !== null ) {
2469  return ret;
2470 
2471  } else {
2472  return elem[ name ];
2473  }
2474  }
2475  },
2476 
2477  propHooks: {
2478  tabIndex: {
2479  get: function( elem ) {
2480  // elem.tabIndex doesn't always return the correct value when it hasn't been explicitly set
2481  // http://fluidproject.org/blog/2008/01/09/getting-setting-and-removing-tabindex-values-with-javascript/
2482  var attributeNode = elem.getAttributeNode("tabindex");
2483 
2484  return attributeNode && attributeNode.specified ?
2485  parseInt( attributeNode.value, 10 ) :
2486  rfocusable.test( elem.nodeName ) || rclickable.test( elem.nodeName ) && elem.href ?
2487  0 :
2488  undefined;
2489  }
2490  }
2491  }
2492 });
2493 
2494 // Hook for boolean attributes
2495 boolHook = {
2496  get: function( elem, name ) {
2497  var
2498  // Use .prop to determine if this attribute is understood as boolean
2499  prop = jQuery.prop( elem, name ),
2500 
2501  // Fetch it accordingly
2502  attr = typeof prop === "boolean" && elem.getAttribute( name ),
2503  detail = typeof prop === "boolean" ?
2504 
2505  getSetInput && getSetAttribute ?
2506  attr != null :
2507  // oldIE fabricates an empty string for missing boolean attributes
2508  // and conflates checked/selected into attroperties
2509  ruseDefault.test( name ) ?
2510  elem[ jQuery.camelCase( "default-" + name ) ] :
2511  !!attr :
2512 
2513  // fetch an attribute node for properties not recognized as boolean
2514  elem.getAttributeNode( name );
2515 
2516  return detail && detail.value !== false ?
2517  name.toLowerCase() :
2518  undefined;
2519  },
2520  set: function( elem, value, name ) {
2521  if ( value === false ) {
2522  // Remove boolean attributes when set to false
2523  jQuery.removeAttr( elem, name );
2524  } else if ( getSetInput && getSetAttribute || !ruseDefault.test( name ) ) {
2525  // IE<8 needs the *property* name
2526  elem.setAttribute( !getSetAttribute && jQuery.propFix[ name ] || name, name );
2527 
2528  // Use defaultChecked and defaultSelected for oldIE
2529  } else {
2530  elem[ jQuery.camelCase( "default-" + name ) ] = elem[ name ] = true;
2531  }
2532 
2533  return name;
2534  }
2535 };
2536 
2537 // fix oldIE value attroperty
2538 if ( !getSetInput || !getSetAttribute ) {
2539  jQuery.attrHooks.value = {
2540  get: function( elem, name ) {
2541  var ret = elem.getAttributeNode( name );
2542  return jQuery.nodeName( elem, "input" ) ?
2543 
2544  // Ignore the value *property* by using defaultValue
2545  elem.defaultValue :
2546 
2547  ret && ret.specified ? ret.value : undefined;
2548  },
2549  set: function( elem, value, name ) {
2550  if ( jQuery.nodeName( elem, "input" ) ) {
2551  // Does not return so that setAttribute is also used
2552  elem.defaultValue = value;
2553  } else {
2554  // Use nodeHook if defined (#1954); otherwise setAttribute is fine
2555  return nodeHook && nodeHook.set( elem, value, name );
2556  }
2557  }
2558  };
2559 }
2560 
2561 // IE6/7 do not support getting/setting some attributes with get/setAttribute
2562 if ( !getSetAttribute ) {
2563 
2564  // Use this for any attribute in IE6/7
2565  // This fixes almost every IE6/7 issue
2566  nodeHook = jQuery.valHooks.button = {
2567  get: function( elem, name ) {
2568  var ret = elem.getAttributeNode( name );
2569  return ret && ( name === "id" || name === "name" || name === "coords" ? ret.value !== "" : ret.specified ) ?
2570  ret.value :
2571  undefined;
2572  },
2573  set: function( elem, value, name ) {
2574  // Set the existing or create a new attribute node
2575  var ret = elem.getAttributeNode( name );
2576  if ( !ret ) {
2577  elem.setAttributeNode(
2578  (ret = elem.ownerDocument.createAttribute( name ))
2579  );
2580  }
2581 
2582  ret.value = value += "";
2583 
2584  // Break association with cloned elements by also using setAttribute (#9646)
2585  return name === "value" || value === elem.getAttribute( name ) ?
2586  value :
2587  undefined;
2588  }
2589  };
2590 
2591  // Set contenteditable to false on removals(#10429)
2592  // Setting to empty string throws an error as an invalid value
2593  jQuery.attrHooks.contenteditable = {
2594  get: nodeHook.get,
2595  set: function( elem, value, name ) {
2596  nodeHook.set( elem, value === "" ? false : value, name );
2597  }
2598  };
2599 
2600  // Set width and height to auto instead of 0 on empty string( Bug #8150 )
2601  // This is for removals
2602  jQuery.each([ "width", "height" ], function( i, name ) {
2603  jQuery.attrHooks[ name ] = jQuery.extend( jQuery.attrHooks[ name ], {
2604  set: function( elem, value ) {
2605  if ( value === "" ) {
2606  elem.setAttribute( name, "auto" );
2607  return value;
2608  }
2609  }
2610  });
2611  });
2612 }
2613 
2614 
2615 // Some attributes require a special call on IE
2616 // http://msdn.microsoft.com/en-us/library/ms536429%28VS.85%29.aspx
2617 if ( !jQuery.support.hrefNormalized ) {
2618  jQuery.each([ "href", "src", "width", "height" ], function( i, name ) {
2619  jQuery.attrHooks[ name ] = jQuery.extend( jQuery.attrHooks[ name ], {
2620  get: function( elem ) {
2621  var ret = elem.getAttribute( name, 2 );
2622  return ret == null ? undefined : ret;
2623  }
2624  });
2625  });
2626 
2627  // href/src property should get the full normalized URL (#10299/#12915)
2628  jQuery.each([ "href", "src" ], function( i, name ) {
2629  jQuery.propHooks[ name ] = {
2630  get: function( elem ) {
2631  return elem.getAttribute( name, 4 );
2632  }
2633  };
2634  });
2635 }
2636 
2637 if ( !jQuery.support.style ) {
2638  jQuery.attrHooks.style = {
2639  get: function( elem ) {
2640  // Return undefined in the case of empty string
2641  // Note: IE uppercases css property names, but if we were to .toLowerCase()
2642  // .cssText, that would destroy case senstitivity in URL's, like in "background"
2643  return elem.style.cssText || undefined;
2644  },
2645  set: function( elem, value ) {
2646  return ( elem.style.cssText = value + "" );
2647  }
2648  };
2649 }
2650 
2651 // Safari mis-reports the default selected property of an option
2652 // Accessing the parent's selectedIndex property fixes it
2653 if ( !jQuery.support.optSelected ) {
2654  jQuery.propHooks.selected = jQuery.extend( jQuery.propHooks.selected, {
2655  get: function( elem ) {
2656  var parent = elem.parentNode;
2657 
2658  if ( parent ) {
2659  parent.selectedIndex;
2660 
2661  // Make sure that it also works with optgroups, see #5701
2662  if ( parent.parentNode ) {
2663  parent.parentNode.selectedIndex;
2664  }
2665  }
2666  return null;
2667  }
2668  });
2669 }
2670 
2671 // IE6/7 call enctype encoding
2672 if ( !jQuery.support.enctype ) {
2673  jQuery.propFix.enctype = "encoding";
2674 }
2675 
2676 // Radios and checkboxes getter/setter
2677 if ( !jQuery.support.checkOn ) {
2678  jQuery.each([ "radio", "checkbox" ], function() {
2679  jQuery.valHooks[ this ] = {
2680  get: function( elem ) {
2681  // Handle the case where in Webkit "" is returned instead of "on" if a value isn't specified
2682  return elem.getAttribute("value") === null ? "on" : elem.value;
2683  }
2684  };
2685  });
2686 }
2687 jQuery.each([ "radio", "checkbox" ], function() {
2688  jQuery.valHooks[ this ] = jQuery.extend( jQuery.valHooks[ this ], {
2689  set: function( elem, value ) {
2690  if ( jQuery.isArray( value ) ) {
2691  return ( elem.checked = jQuery.inArray( jQuery(elem).val(), value ) >= 0 );
2692  }
2693  }
2694  });
2695 });
2696 var rformElems = /^(?:input|select|textarea)$/i,
2697  rkeyEvent = /^key/,
2698  rmouseEvent = /^(?:mouse|contextmenu)|click/,
2699  rfocusMorph = /^(?:focusinfocus|focusoutblur)$/,
2700  rtypenamespace = /^([^.]*)(?:\.(.+)|)$/;
2701 
2702 function returnTrue() {
2703  return true;
2704 }
2705 
2706 function returnFalse() {
2707  return false;
2708 }
2709 
2710 /*
2711  * Helper functions for managing events -- not part of the public interface.
2712  * Props to Dean Edwards' addEvent library for many of the ideas.
2713  */
2714 jQuery.event = {
2715 
2716  global: {},
2717 
2718  add: function( elem, types, handler, data, selector ) {
2719  var tmp, events, t, handleObjIn,
2720  special, eventHandle, handleObj,
2721  handlers, type, namespaces, origType,
2722  elemData = jQuery._data( elem );
2723 
2724  // Don't attach events to noData or text/comment nodes (but allow plain objects)
2725  if ( !elemData ) {
2726  return;
2727  }
2728 
2729  // Caller can pass in an object of custom data in lieu of the handler
2730  if ( handler.handler ) {
2731  handleObjIn = handler;
2732  handler = handleObjIn.handler;
2733  selector = handleObjIn.selector;
2734  }
2735 
2736  // Make sure that the handler has a unique ID, used to find/remove it later
2737  if ( !handler.guid ) {
2738  handler.guid = jQuery.guid++;
2739  }
2740 
2741  // Init the element's event structure and main handler, if this is the first
2742  if ( !(events = elemData.events) ) {
2743  events = elemData.events = {};
2744  }
2745  if ( !(eventHandle = elemData.handle) ) {
2746  eventHandle = elemData.handle = function( e ) {
2747  // Discard the second event of a jQuery.event.trigger() and
2748  // when an event is called after a page has unloaded
2749  return typeof jQuery !== core_strundefined && (!e || jQuery.event.triggered !== e.type) ?
2750  jQuery.event.dispatch.apply( eventHandle.elem, arguments ) :
2751  undefined;
2752  };
2753  // Add elem as a property of the handle fn to prevent a memory leak with IE non-native events
2754  eventHandle.elem = elem;
2755  }
2756 
2757  // Handle multiple events separated by a space
2758  // jQuery(...).bind("mouseover mouseout", fn);
2759  types = ( types || "" ).match( core_rnotwhite ) || [""];
2760  t = types.length;
2761  while ( t-- ) {
2762  tmp = rtypenamespace.exec( types[t] ) || [];
2763  type = origType = tmp[1];
2764  namespaces = ( tmp[2] || "" ).split( "." ).sort();
2765 
2766  // If event changes its type, use the special event handlers for the changed type
2767  special = jQuery.event.special[ type ] || {};
2768 
2769  // If selector defined, determine special event api type, otherwise given type
2770  type = ( selector ? special.delegateType : special.bindType ) || type;
2771 
2772  // Update special based on newly reset type
2773  special = jQuery.event.special[ type ] || {};
2774 
2775  // handleObj is passed to all event handlers
2776  handleObj = jQuery.extend({
2777  type: type,
2778  origType: origType,
2779  data: data,
2780  handler: handler,
2781  guid: handler.guid,
2782  selector: selector,
2783  needsContext: selector && jQuery.expr.match.needsContext.test( selector ),
2784  namespace: namespaces.join(".")
2785  }, handleObjIn );
2786 
2787  // Init the event handler queue if we're the first
2788  if ( !(handlers = events[ type ]) ) {
2789  handlers = events[ type ] = [];
2790  handlers.delegateCount = 0;
2791 
2792  // Only use addEventListener/attachEvent if the special events handler returns false
2793  if ( !special.setup || special.setup.call( elem, data, namespaces, eventHandle ) === false ) {
2794  // Bind the global event handler to the element
2795  if ( elem.addEventListener ) {
2796  elem.addEventListener( type, eventHandle, false );
2797 
2798  } else if ( elem.attachEvent ) {
2799  elem.attachEvent( "on" + type, eventHandle );
2800  }
2801  }
2802  }
2803 
2804  if ( special.add ) {
2805  special.add.call( elem, handleObj );
2806 
2807  if ( !handleObj.handler.guid ) {
2808  handleObj.handler.guid = handler.guid;
2809  }
2810  }
2811 
2812  // Add to the element's handler list, delegates in front
2813  if ( selector ) {
2814  handlers.splice( handlers.delegateCount++, 0, handleObj );
2815  } else {
2816  handlers.push( handleObj );
2817  }
2818 
2819  // Keep track of which events have ever been used, for event optimization
2820  jQuery.event.global[ type ] = true;
2821  }
2822 
2823  // Nullify elem to prevent memory leaks in IE
2824  elem = null;
2825  },
2826 
2827  // Detach an event or set of events from an element
2828  remove: function( elem, types, handler, selector, mappedTypes ) {
2829  var j, handleObj, tmp,
2830  origCount, t, events,
2831  special, handlers, type,
2832  namespaces, origType,
2833  elemData = jQuery.hasData( elem ) && jQuery._data( elem );
2834 
2835  if ( !elemData || !(events = elemData.events) ) {
2836  return;
2837  }
2838 
2839  // Once for each type.namespace in types; type may be omitted
2840  types = ( types || "" ).match( core_rnotwhite ) || [""];
2841  t = types.length;
2842  while ( t-- ) {
2843  tmp = rtypenamespace.exec( types[t] ) || [];
2844  type = origType = tmp[1];
2845  namespaces = ( tmp[2] || "" ).split( "." ).sort();
2846 
2847  // Unbind all events (on this namespace, if provided) for the element
2848  if ( !type ) {
2849  for ( type in events ) {
2850  jQuery.event.remove( elem, type + types[ t ], handler, selector, true );
2851  }
2852  continue;
2853  }
2854 
2855  special = jQuery.event.special[ type ] || {};
2856  type = ( selector ? special.delegateType : special.bindType ) || type;
2857  handlers = events[ type ] || [];
2858  tmp = tmp[2] && new RegExp( "(^|\\.)" + namespaces.join("\\.(?:.*\\.|)") + "(\\.|$)" );
2859 
2860  // Remove matching events
2861  origCount = j = handlers.length;
2862  while ( j-- ) {
2863  handleObj = handlers[ j ];
2864 
2865  if ( ( mappedTypes || origType === handleObj.origType ) &&
2866  ( !handler || handler.guid === handleObj.guid ) &&
2867  ( !tmp || tmp.test( handleObj.namespace ) ) &&
2868  ( !selector || selector === handleObj.selector || selector === "**" && handleObj.selector ) ) {
2869  handlers.splice( j, 1 );
2870 
2871  if ( handleObj.selector ) {
2872  handlers.delegateCount--;
2873  }
2874  if ( special.remove ) {
2875  special.remove.call( elem, handleObj );
2876  }
2877  }
2878  }
2879 
2880  // Remove generic event handler if we removed something and no more handlers exist
2881  // (avoids potential for endless recursion during removal of special event handlers)
2882  if ( origCount && !handlers.length ) {
2883  if ( !special.teardown || special.teardown.call( elem, namespaces, elemData.handle ) === false ) {
2884  jQuery.removeEvent( elem, type, elemData.handle );
2885  }
2886 
2887  delete events[ type ];
2888  }
2889  }
2890 
2891  // Remove the expando if it's no longer used
2892  if ( jQuery.isEmptyObject( events ) ) {
2893  delete elemData.handle;
2894 
2895  // removeData also checks for emptiness and clears the expando if empty
2896  // so use it instead of delete
2897  jQuery._removeData( elem, "events" );
2898  }
2899  },
2900 
2901  trigger: function( event, data, elem, onlyHandlers ) {
2902  var handle, ontype, cur,
2903  bubbleType, special, tmp, i,
2904  eventPath = [ elem || document ],
2905  type = core_hasOwn.call( event, "type" ) ? event.type : event,
2906  namespaces = core_hasOwn.call( event, "namespace" ) ? event.namespace.split(".") : [];
2907 
2908  cur = tmp = elem = elem || document;
2909 
2910  // Don't do events on text and comment nodes
2911  if ( elem.nodeType === 3 || elem.nodeType === 8 ) {
2912  return;
2913  }
2914 
2915  // focus/blur morphs to focusin/out; ensure we're not firing them right now
2916  if ( rfocusMorph.test( type + jQuery.event.triggered ) ) {
2917  return;
2918  }
2919 
2920  if ( type.indexOf(".") >= 0 ) {
2921  // Namespaced trigger; create a regexp to match event type in handle()
2922  namespaces = type.split(".");
2923  type = namespaces.shift();
2924  namespaces.sort();
2925  }
2926  ontype = type.indexOf(":") < 0 && "on" + type;
2927 
2928  // Caller can pass in a jQuery.Event object, Object, or just an event type string
2929  event = event[ jQuery.expando ] ?
2930  event :
2931  new jQuery.Event( type, typeof event === "object" && event );
2932 
2933  event.isTrigger = true;
2934  event.namespace = namespaces.join(".");
2935  event.namespace_re = event.namespace ?
2936  new RegExp( "(^|\\.)" + namespaces.join("\\.(?:.*\\.|)") + "(\\.|$)" ) :
2937  null;
2938 
2939  // Clean up the event in case it is being reused
2940  event.result = undefined;
2941  if ( !event.target ) {
2942  event.target = elem;
2943  }
2944 
2945  // Clone any incoming data and prepend the event, creating the handler arg list
2946  data = data == null ?
2947  [ event ] :
2948  jQuery.makeArray( data, [ event ] );
2949 
2950  // Allow special events to draw outside the lines
2951  special = jQuery.event.special[ type ] || {};
2952  if ( !onlyHandlers && special.trigger && special.trigger.apply( elem, data ) === false ) {
2953  return;
2954  }
2955 
2956  // Determine event propagation path in advance, per W3C events spec (#9951)
2957  // Bubble up to document, then to window; watch for a global ownerDocument var (#9724)
2958  if ( !onlyHandlers && !special.noBubble && !jQuery.isWindow( elem ) ) {
2959 
2960  bubbleType = special.delegateType || type;
2961  if ( !rfocusMorph.test( bubbleType + type ) ) {
2962  cur = cur.parentNode;
2963  }
2964  for ( ; cur; cur = cur.parentNode ) {
2965  eventPath.push( cur );
2966  tmp = cur;
2967  }
2968 
2969  // Only add window if we got to document (e.g., not plain obj or detached DOM)
2970  if ( tmp === (elem.ownerDocument || document) ) {
2971  eventPath.push( tmp.defaultView || tmp.parentWindow || window );
2972  }
2973  }
2974 
2975  // Fire handlers on the event path
2976  i = 0;
2977  while ( (cur = eventPath[i++]) && !event.isPropagationStopped() ) {
2978 
2979  event.type = i > 1 ?
2980  bubbleType :
2981  special.bindType || type;
2982 
2983  // jQuery handler
2984  handle = ( jQuery._data( cur, "events" ) || {} )[ event.type ] && jQuery._data( cur, "handle" );
2985  if ( handle ) {
2986  handle.apply( cur, data );
2987  }
2988 
2989  // Native handler
2990  handle = ontype && cur[ ontype ];
2991  if ( handle && jQuery.acceptData( cur ) && handle.apply && handle.apply( cur, data ) === false ) {
2992  event.preventDefault();
2993  }
2994  }
2995  event.type = type;
2996 
2997  // If nobody prevented the default action, do it now
2998  if ( !onlyHandlers && !event.isDefaultPrevented() ) {
2999 
3000  if ( (!special._default || special._default.apply( elem.ownerDocument, data ) === false) &&
3001  !(type === "click" && jQuery.nodeName( elem, "a" )) && jQuery.acceptData( elem ) ) {
3002 
3003  // Call a native DOM method on the target with the same name name as the event.
3004  // Can't use an .isFunction() check here because IE6/7 fails that test.
3005  // Don't do default actions on window, that's where global variables be (#6170)
3006  if ( ontype && elem[ type ] && !jQuery.isWindow( elem ) ) {
3007 
3008  // Don't re-trigger an onFOO event when we call its FOO() method
3009  tmp = elem[ ontype ];
3010 
3011  if ( tmp ) {
3012  elem[ ontype ] = null;
3013  }
3014 
3015  // Prevent re-triggering of the same event, since we already bubbled it above
3016  jQuery.event.triggered = type;
3017  try {
3018  elem[ type ]();
3019  } catch ( e ) {
3020  // IE<9 dies on focus/blur to hidden element (#1486,#12518)
3021  // only reproducible on winXP IE8 native, not IE9 in IE8 mode
3022  }
3023  jQuery.event.triggered = undefined;
3024 
3025  if ( tmp ) {
3026  elem[ ontype ] = tmp;
3027  }
3028  }
3029  }
3030  }
3031 
3032  return event.result;
3033  },
3034 
3035  dispatch: function( event ) {
3036 
3037  // Make a writable jQuery.Event from the native event object
3038  event = jQuery.event.fix( event );
3039 
3040  var i, ret, handleObj, matched, j,
3041  handlerQueue = [],
3042  args = core_slice.call( arguments ),
3043  handlers = ( jQuery._data( this, "events" ) || {} )[ event.type ] || [],
3044  special = jQuery.event.special[ event.type ] || {};
3045 
3046  // Use the fix-ed jQuery.Event rather than the (read-only) native event
3047  args[0] = event;
3048  event.delegateTarget = this;
3049 
3050  // Call the preDispatch hook for the mapped type, and let it bail if desired
3051  if ( special.preDispatch && special.preDispatch.call( this, event ) === false ) {
3052  return;
3053  }
3054 
3055  // Determine handlers
3056  handlerQueue = jQuery.event.handlers.call( this, event, handlers );
3057 
3058  // Run delegates first; they may want to stop propagation beneath us
3059  i = 0;
3060  while ( (matched = handlerQueue[ i++ ]) && !event.isPropagationStopped() ) {
3061  event.currentTarget = matched.elem;
3062 
3063  j = 0;
3064  while ( (handleObj = matched.handlers[ j++ ]) && !event.isImmediatePropagationStopped() ) {
3065 
3066  // Triggered event must either 1) have no namespace, or
3067  // 2) have namespace(s) a subset or equal to those in the bound event (both can have no namespace).
3068  if ( !event.namespace_re || event.namespace_re.test( handleObj.namespace ) ) {
3069 
3070  event.handleObj = handleObj;
3071  event.data = handleObj.data;
3072 
3073  ret = ( (jQuery.event.special[ handleObj.origType ] || {}).handle || handleObj.handler )
3074  .apply( matched.elem, args );
3075 
3076  if ( ret !== undefined ) {
3077  if ( (event.result = ret) === false ) {
3078  event.preventDefault();
3079  event.stopPropagation();
3080  }
3081  }
3082  }
3083  }
3084  }
3085 
3086  // Call the postDispatch hook for the mapped type
3087  if ( special.postDispatch ) {
3088  special.postDispatch.call( this, event );
3089  }
3090 
3091  return event.result;
3092  },
3093 
3094  handlers: function( event, handlers ) {
3095  var sel, handleObj, matches, i,
3096  handlerQueue = [],
3097  delegateCount = handlers.delegateCount,
3098  cur = event.target;
3099 
3100  // Find delegate handlers
3101  // Black-hole SVG <use> instance trees (#13180)
3102  // Avoid non-left-click bubbling in Firefox (#3861)
3103  if ( delegateCount && cur.nodeType && (!event.button || event.type !== "click") ) {
3104 
3105  for ( ; cur != this; cur = cur.parentNode || this ) {
3106 
3107  // Don't check non-elements (#13208)
3108  // Don't process clicks on disabled elements (#6911, #8165, #11382, #11764)
3109  if ( cur.nodeType === 1 && (cur.disabled !== true || event.type !== "click") ) {
3110  matches = [];
3111  for ( i = 0; i < delegateCount; i++ ) {
3112  handleObj = handlers[ i ];
3113 
3114  // Don't conflict with Object.prototype properties (#13203)
3115  sel = handleObj.selector + " ";
3116 
3117  if ( matches[ sel ] === undefined ) {
3118  matches[ sel ] = handleObj.needsContext ?
3119  jQuery( sel, this ).index( cur ) >= 0 :
3120  jQuery.find( sel, this, null, [ cur ] ).length;
3121  }
3122  if ( matches[ sel ] ) {
3123  matches.push( handleObj );
3124  }
3125  }
3126  if ( matches.length ) {
3127  handlerQueue.push({ elem: cur, handlers: matches });
3128  }
3129  }
3130  }
3131  }
3132 
3133  // Add the remaining (directly-bound) handlers
3134  if ( delegateCount < handlers.length ) {
3135  handlerQueue.push({ elem: this, handlers: handlers.slice( delegateCount ) });
3136  }
3137 
3138  return handlerQueue;
3139  },
3140 
3141  fix: function( event ) {
3142  if ( event[ jQuery.expando ] ) {
3143  return event;
3144  }
3145 
3146  // Create a writable copy of the event object and normalize some properties
3147  var i, prop, copy,
3148  type = event.type,
3149  originalEvent = event,
3150  fixHook = this.fixHooks[ type ];
3151 
3152  if ( !fixHook ) {
3153  this.fixHooks[ type ] = fixHook =
3154  rmouseEvent.test( type ) ? this.mouseHooks :
3155  rkeyEvent.test( type ) ? this.keyHooks :
3156  {};
3157  }
3158  copy = fixHook.props ? this.props.concat( fixHook.props ) : this.props;
3159 
3160  event = new jQuery.Event( originalEvent );
3161 
3162  i = copy.length;
3163  while ( i-- ) {
3164  prop = copy[ i ];
3165  event[ prop ] = originalEvent[ prop ];
3166  }
3167 
3168  // Support: IE<9
3169  // Fix target property (#1925)
3170  if ( !event.target ) {
3171  event.target = originalEvent.srcElement || document;
3172  }
3173 
3174  // Support: Chrome 23+, Safari?
3175  // Target should not be a text node (#504, #13143)
3176  if ( event.target.nodeType === 3 ) {
3177  event.target = event.target.parentNode;
3178  }
3179 
3180  // Support: IE<9
3181  // For mouse/key events, metaKey==false if it's undefined (#3368, #11328)
3182  event.metaKey = !!event.metaKey;
3183 
3184  return fixHook.filter ? fixHook.filter( event, originalEvent ) : event;
3185  },
3186 
3187  // Includes some event props shared by KeyEvent and MouseEvent
3188  props: "altKey bubbles cancelable ctrlKey currentTarget eventPhase metaKey relatedTarget shiftKey target timeStamp view which".split(" "),
3189 
3190  fixHooks: {},
3191 
3192  keyHooks: {
3193  props: "char charCode key keyCode".split(" "),
3194  filter: function( event, original ) {
3195 
3196  // Add which for key events
3197  if ( event.which == null ) {
3198  event.which = original.charCode != null ? original.charCode : original.keyCode;
3199  }
3200 
3201  return event;
3202  }
3203  },
3204 
3205  mouseHooks: {
3206  props: "button buttons clientX clientY fromElement offsetX offsetY pageX pageY screenX screenY toElement".split(" "),
3207  filter: function( event, original ) {
3208  var body, eventDoc, doc,
3209  button = original.button,
3210  fromElement = original.fromElement;
3211 
3212  // Calculate pageX/Y if missing and clientX/Y available
3213  if ( event.pageX == null && original.clientX != null ) {
3214  eventDoc = event.target.ownerDocument || document;
3215  doc = eventDoc.documentElement;
3216  body = eventDoc.body;
3217 
3218  event.pageX = original.clientX + ( doc && doc.scrollLeft || body && body.scrollLeft || 0 ) - ( doc && doc.clientLeft || body && body.clientLeft || 0 );
3219  event.pageY = original.clientY + ( doc && doc.scrollTop || body && body.scrollTop || 0 ) - ( doc && doc.clientTop || body && body.clientTop || 0 );
3220  }
3221 
3222  // Add relatedTarget, if necessary
3223  if ( !event.relatedTarget && fromElement ) {
3224  event.relatedTarget = fromElement === event.target ? original.toElement : fromElement;
3225  }
3226 
3227  // Add which for click: 1 === left; 2 === middle; 3 === right
3228  // Note: button is not normalized, so don't use it
3229  if ( !event.which && button !== undefined ) {
3230  event.which = ( button & 1 ? 1 : ( button & 2 ? 3 : ( button & 4 ? 2 : 0 ) ) );
3231  }
3232 
3233  return event;
3234  }
3235  },
3236 
3237  special: {
3238  load: {
3239  // Prevent triggered image.load events from bubbling to window.load
3240  noBubble: true
3241  },
3242  click: {
3243  // For checkbox, fire native event so checked state will be right
3244  trigger: function() {
3245  if ( jQuery.nodeName( this, "input" ) && this.type === "checkbox" && this.click ) {
3246  this.click();
3247  return false;
3248  }
3249  }
3250  },
3251  focus: {
3252  // Fire native event if possible so blur/focus sequence is correct
3253  trigger: function() {
3254  if ( this !== document.activeElement && this.focus ) {
3255  try {
3256  this.focus();
3257  return false;
3258  } catch ( e ) {
3259  // Support: IE<9
3260  // If we error on focus to hidden element (#1486, #12518),
3261  // let .trigger() run the handlers
3262  }
3263  }
3264  },
3265  delegateType: "focusin"
3266  },
3267  blur: {
3268  trigger: function() {
3269  if ( this === document.activeElement && this.blur ) {
3270  this.blur();
3271  return false;
3272  }
3273  },
3274  delegateType: "focusout"
3275  },
3276 
3277  beforeunload: {
3278  postDispatch: function( event ) {
3279 
3280  // Even when returnValue equals to undefined Firefox will still show alert
3281  if ( event.result !== undefined ) {
3282  event.originalEvent.returnValue = event.result;
3283  }
3284  }
3285  }
3286  },
3287 
3288  simulate: function( type, elem, event, bubble ) {
3289  // Piggyback on a donor event to simulate a different one.
3290  // Fake originalEvent to avoid donor's stopPropagation, but if the
3291  // simulated event prevents default then we do the same on the donor.
3292  var e = jQuery.extend(
3293  new jQuery.Event(),
3294  event,
3295  { type: type,
3296  isSimulated: true,
3297  originalEvent: {}
3298  }
3299  );
3300  if ( bubble ) {
3301  jQuery.event.trigger( e, null, elem );
3302  } else {
3303  jQuery.event.dispatch.call( elem, e );
3304  }
3305  if ( e.isDefaultPrevented() ) {
3306  event.preventDefault();
3307  }
3308  }
3309 };
3310 
3311 jQuery.removeEvent = document.removeEventListener ?
3312  function( elem, type, handle ) {
3313  if ( elem.removeEventListener ) {
3314  elem.removeEventListener( type, handle, false );
3315  }
3316  } :
3317  function( elem, type, handle ) {
3318  var name = "on" + type;
3319 
3320  if ( elem.detachEvent ) {
3321 
3322  // #8545, #7054, preventing memory leaks for custom events in IE6-8
3323  // detachEvent needed property on element, by name of that event, to properly expose it to GC
3324  if ( typeof elem[ name ] === core_strundefined ) {
3325  elem[ name ] = null;
3326  }
3327 
3328  elem.detachEvent( name, handle );
3329  }
3330  };
3331 
3332 jQuery.Event = function( src, props ) {
3333  // Allow instantiation without the 'new' keyword
3334  if ( !(this instanceof jQuery.Event) ) {
3335  return new jQuery.Event( src, props );
3336  }
3337 
3338  // Event object
3339  if ( src && src.type ) {
3340  this.originalEvent = src;
3341  this.type = src.type;
3342 
3343  // Events bubbling up the document may have been marked as prevented
3344  // by a handler lower down the tree; reflect the correct value.
3345  this.isDefaultPrevented = ( src.defaultPrevented || src.returnValue === false ||
3346  src.getPreventDefault && src.getPreventDefault() ) ? returnTrue : returnFalse;
3347 
3348  // Event type
3349  } else {
3350  this.type = src;
3351  }
3352 
3353  // Put explicitly provided properties onto the event object
3354  if ( props ) {
3355  jQuery.extend( this, props );
3356  }
3357 
3358  // Create a timestamp if incoming event doesn't have one
3359  this.timeStamp = src && src.timeStamp || jQuery.now();
3360 
3361  // Mark it as fixed
3362  this[ jQuery.expando ] = true;
3363 };
3364 
3365 // jQuery.Event is based on DOM3 Events as specified by the ECMAScript Language Binding
3366 // http://www.w3.org/TR/2003/WD-DOM-Level-3-Events-20030331/ecma-script-binding.html
3367 jQuery.Event.prototype = {
3368  isDefaultPrevented: returnFalse,
3369  isPropagationStopped: returnFalse,
3370  isImmediatePropagationStopped: returnFalse,
3371 
3372  preventDefault: function() {
3373  var e = this.originalEvent;
3374 
3375  this.isDefaultPrevented = returnTrue;
3376  if ( !e ) {
3377  return;
3378  }
3379 
3380  // If preventDefault exists, run it on the original event
3381  if ( e.preventDefault ) {
3382  e.preventDefault();
3383 
3384  // Support: IE
3385  // Otherwise set the returnValue property of the original event to false
3386  } else {
3387  e.returnValue = false;
3388  }
3389  },
3390  stopPropagation: function() {
3391  var e = this.originalEvent;
3392 
3393  this.isPropagationStopped = returnTrue;
3394  if ( !e ) {
3395  return;
3396  }
3397  // If stopPropagation exists, run it on the original event
3398  if ( e.stopPropagation ) {
3399  e.stopPropagation();
3400  }
3401 
3402  // Support: IE
3403  // Set the cancelBubble property of the original event to true
3404  e.cancelBubble = true;
3405  },
3406  stopImmediatePropagation: function() {
3407  this.isImmediatePropagationStopped = returnTrue;
3408  this.stopPropagation();
3409  }
3410 };
3411 
3412 // Create mouseenter/leave events using mouseover/out and event-time checks
3413 jQuery.each({
3414  mouseenter: "mouseover",
3415  mouseleave: "mouseout"
3416 }, function( orig, fix ) {
3417  jQuery.event.special[ orig ] = {
3418  delegateType: fix,
3419  bindType: fix,
3420 
3421  handle: function( event ) {
3422  var ret,
3423  target = this,
3424  related = event.relatedTarget,
3425  handleObj = event.handleObj;
3426 
3427  // For mousenter/leave call the handler if related is outside the target.
3428  // NB: No relatedTarget if the mouse left/entered the browser window
3429  if ( !related || (related !== target && !jQuery.contains( target, related )) ) {
3430  event.type = handleObj.origType;
3431  ret = handleObj.handler.apply( this, arguments );
3432  event.type = fix;
3433  }
3434  return ret;
3435  }
3436  };
3437 });
3438 
3439 // IE submit delegation
3440 if ( !jQuery.support.submitBubbles ) {
3441 
3442  jQuery.event.special.submit = {
3443  setup: function() {
3444  // Only need this for delegated form submit events
3445  if ( jQuery.nodeName( this, "form" ) ) {
3446  return false;
3447  }
3448 
3449  // Lazy-add a submit handler when a descendant form may potentially be submitted
3450  jQuery.event.add( this, "click._submit keypress._submit", function( e ) {
3451  // Node name check avoids a VML-related crash in IE (#9807)
3452  var elem = e.target,
3453  form = jQuery.nodeName( elem, "input" ) || jQuery.nodeName( elem, "button" ) ? elem.form : undefined;
3454  if ( form && !jQuery._data( form, "submitBubbles" ) ) {
3455  jQuery.event.add( form, "submit._submit", function( event ) {
3456  event._submit_bubble = true;
3457  });
3458  jQuery._data( form, "submitBubbles", true );
3459  }
3460  });
3461  // return undefined since we don't need an event listener
3462  },
3463 
3464  postDispatch: function( event ) {
3465  // If form was submitted by the user, bubble the event up the tree
3466  if ( event._submit_bubble ) {
3467  delete event._submit_bubble;
3468  if ( this.parentNode && !event.isTrigger ) {
3469  jQuery.event.simulate( "submit", this.parentNode, event, true );
3470  }
3471  }
3472  },
3473 
3474  teardown: function() {
3475  // Only need this for delegated form submit events
3476  if ( jQuery.nodeName( this, "form" ) ) {
3477  return false;
3478  }
3479 
3480  // Remove delegated handlers; cleanData eventually reaps submit handlers attached above
3481  jQuery.event.remove( this, "._submit" );
3482  }
3483  };
3484 }
3485 
3486 // IE change delegation and checkbox/radio fix
3487 if ( !jQuery.support.changeBubbles ) {
3488 
3489  jQuery.event.special.change = {
3490 
3491  setup: function() {
3492 
3493  if ( rformElems.test( this.nodeName ) ) {
3494  // IE doesn't fire change on a check/radio until blur; trigger it on click
3495  // after a propertychange. Eat the blur-change in special.change.handle.
3496  // This still fires onchange a second time for check/radio after blur.
3497  if ( this.type === "checkbox" || this.type === "radio" ) {
3498  jQuery.event.add( this, "propertychange._change", function( event ) {
3499  if ( event.originalEvent.propertyName === "checked" ) {
3500  this._just_changed = true;
3501  }
3502  });
3503  jQuery.event.add( this, "click._change", function( event ) {
3504  if ( this._just_changed && !event.isTrigger ) {
3505  this._just_changed = false;
3506  }
3507  // Allow triggered, simulated change events (#11500)
3508  jQuery.event.simulate( "change", this, event, true );
3509  });
3510  }
3511  return false;
3512  }
3513  // Delegated event; lazy-add a change handler on descendant inputs
3514  jQuery.event.add( this, "beforeactivate._change", function( e ) {
3515  var elem = e.target;
3516 
3517  if ( rformElems.test( elem.nodeName ) && !jQuery._data( elem, "changeBubbles" ) ) {
3518  jQuery.event.add( elem, "change._change", function( event ) {
3519  if ( this.parentNode && !event.isSimulated && !event.isTrigger ) {
3520  jQuery.event.simulate( "change", this.parentNode, event, true );
3521  }
3522  });
3523  jQuery._data( elem, "changeBubbles", true );
3524  }
3525  });
3526  },
3527 
3528  handle: function( event ) {
3529  var elem = event.target;
3530 
3531  // Swallow native change events from checkbox/radio, we already triggered them above
3532  if ( this !== elem || event.isSimulated || event.isTrigger || (elem.type !== "radio" && elem.type !== "checkbox") ) {
3533  return event.handleObj.handler.apply( this, arguments );
3534  }
3535  },
3536 
3537  teardown: function() {
3538  jQuery.event.remove( this, "._change" );
3539 
3540  return !rformElems.test( this.nodeName );
3541  }
3542  };
3543 }
3544 
3545 // Create "bubbling" focus and blur events
3546 if ( !jQuery.support.focusinBubbles ) {
3547  jQuery.each({ focus: "focusin", blur: "focusout" }, function( orig, fix ) {
3548 
3549  // Attach a single capturing handler while someone wants focusin/focusout
3550  var attaches = 0,
3551  handler = function( event ) {
3552  jQuery.event.simulate( fix, event.target, jQuery.event.fix( event ), true );
3553  };
3554 
3555  jQuery.event.special[ fix ] = {
3556  setup: function() {
3557  if ( attaches++ === 0 ) {
3558  document.addEventListener( orig, handler, true );
3559  }
3560  },
3561  teardown: function() {
3562  if ( --attaches === 0 ) {
3563  document.removeEventListener( orig, handler, true );
3564  }
3565  }
3566  };
3567  });
3568 }
3569 
3570 jQuery.fn.extend({
3571 
3572  on: function( types, selector, data, fn, /*INTERNAL*/ one ) {
3573  var type, origFn;
3574 
3575  // Types can be a map of types/handlers
3576  if ( typeof types === "object" ) {
3577  // ( types-Object, selector, data )
3578  if ( typeof selector !== "string" ) {
3579  // ( types-Object, data )
3580  data = data || selector;
3581  selector = undefined;
3582  }
3583  for ( type in types ) {
3584  this.on( type, selector, data, types[ type ], one );
3585  }
3586  return this;
3587  }
3588 
3589  if ( data == null && fn == null ) {
3590  // ( types, fn )
3591  fn = selector;
3592  data = selector = undefined;
3593  } else if ( fn == null ) {
3594  if ( typeof selector === "string" ) {
3595  // ( types, selector, fn )
3596  fn = data;
3597  data = undefined;
3598  } else {
3599  // ( types, data, fn )
3600  fn = data;
3601  data = selector;
3602  selector = undefined;
3603  }
3604  }
3605  if ( fn === false ) {
3606  fn = returnFalse;
3607  } else if ( !fn ) {
3608  return this;
3609  }
3610 
3611  if ( one === 1 ) {
3612  origFn = fn;
3613  fn = function( event ) {
3614  // Can use an empty set, since event contains the info
3615  jQuery().off( event );
3616  return origFn.apply( this, arguments );
3617  };
3618  // Use same guid so caller can remove using origFn
3619  fn.guid = origFn.guid || ( origFn.guid = jQuery.guid++ );
3620  }
3621  return this.each( function() {
3622  jQuery.event.add( this, types, fn, data, selector );
3623  });
3624  },
3625  one: function( types, selector, data, fn ) {
3626  return this.on( types, selector, data, fn, 1 );
3627  },
3628  off: function( types, selector, fn ) {
3629  var handleObj, type;
3630  if ( types && types.preventDefault && types.handleObj ) {
3631  // ( event ) dispatched jQuery.Event
3632  handleObj = types.handleObj;
3633  jQuery( types.delegateTarget ).off(
3634  handleObj.namespace ? handleObj.origType + "." + handleObj.namespace : handleObj.origType,
3635  handleObj.selector,
3636  handleObj.handler
3637  );
3638  return this;
3639  }
3640  if ( typeof types === "object" ) {
3641  // ( types-object [, selector] )
3642  for ( type in types ) {
3643  this.off( type, selector, types[ type ] );
3644  }
3645  return this;
3646  }
3647  if ( selector === false || typeof selector === "function" ) {
3648  // ( types [, fn] )
3649  fn = selector;
3650  selector = undefined;
3651  }
3652  if ( fn === false ) {
3653  fn = returnFalse;
3654  }
3655  return this.each(function() {
3656  jQuery.event.remove( this, types, fn, selector );
3657  });
3658  },
3659 
3660  bind: function( types, data, fn ) {
3661  return this.on( types, null, data, fn );
3662  },
3663  unbind: function( types, fn ) {
3664  return this.off( types, null, fn );
3665  },
3666 
3667  delegate: function( selector, types, data, fn ) {
3668  return this.on( types, selector, data, fn );
3669  },
3670  undelegate: function( selector, types, fn ) {
3671  // ( namespace ) or ( selector, types [, fn] )
3672  return arguments.length === 1 ? this.off( selector, "**" ) : this.off( types, selector || "**", fn );
3673  },
3674 
3675  trigger: function( type, data ) {
3676  return this.each(function() {
3677  jQuery.event.trigger( type, data, this );
3678  });
3679  },
3680  triggerHandler: function( type, data ) {
3681  var elem = this[0];
3682  if ( elem ) {
3683  return jQuery.event.trigger( type, data, elem, true );
3684  }
3685  }
3686 });
3687 /*!
3688  * Sizzle CSS Selector Engine
3689  * Copyright 2012 jQuery Foundation and other contributors
3690  * Released under the MIT license
3691  * http://sizzlejs.com/
3692  */
3693 (function( window, undefined ) {
3694 
3695 var i,
3696  cachedruns,
3697  Expr,
3698  getText,
3699  isXML,
3700  compile,
3701  hasDuplicate,
3702  outermostContext,
3703 
3704  // Local document vars
3705  setDocument,
3706  document,
3707  docElem,
3708  documentIsXML,
3709  rbuggyQSA,
3710  rbuggyMatches,
3711  matches,
3712  contains,
3713  sortOrder,
3714 
3715  // Instance-specific data
3716  expando = "sizzle" + -(new Date()),
3717  preferredDoc = window.document,
3718  support = {},
3719  dirruns = 0,
3720  done = 0,
3721  classCache = createCache(),
3722  tokenCache = createCache(),
3723  compilerCache = createCache(),
3724 
3725  // General-purpose constants
3726  strundefined = typeof undefined,
3727  MAX_NEGATIVE = 1 << 31,
3728 
3729  // Array methods
3730  arr = [],
3731  pop = arr.pop,
3732  push = arr.push,
3733  slice = arr.slice,
3734  // Use a stripped-down indexOf if we can't use a native one
3735  indexOf = arr.indexOf || function( elem ) {
3736  var i = 0,
3737  len = this.length;
3738  for ( ; i < len; i++ ) {
3739  if ( this[i] === elem ) {
3740  return i;
3741  }
3742  }
3743  return -1;
3744  },
3745 
3746 
3747  // Regular expressions
3748 
3749  // Whitespace characters http://www.w3.org/TR/css3-selectors/#whitespace
3750  whitespace = "[\\x20\\t\\r\\n\\f]",
3751  // http://www.w3.org/TR/css3-syntax/#characters
3752  characterEncoding = "(?:\\\\.|[\\w-]|[^\\x00-\\xa0])+",
3753 
3754  // Loosely modeled on CSS identifier characters
3755  // An unquoted value should be a CSS identifier http://www.w3.org/TR/css3-selectors/#attribute-selectors
3756  // Proper syntax: http://www.w3.org/TR/CSS21/syndata.html#value-def-identifier
3757  identifier = characterEncoding.replace( "w", "w#" ),
3758 
3759  // Acceptable operators http://www.w3.org/TR/selectors/#attribute-selectors
3760  operators = "([*^$|!~]?=)",
3761  attributes = "\\[" + whitespace + "*(" + characterEncoding + ")" + whitespace +
3762  "*(?:" + operators + whitespace + "*(?:(['\"])((?:\\\\.|[^\\\\])*?)\\3|(" + identifier + ")|)|)" + whitespace + "*\\]",
3763 
3764  // Prefer arguments quoted,
3765  // then not containing pseudos/brackets,
3766  // then attribute selectors/non-parenthetical expressions,
3767  // then anything else
3768  // These preferences are here to reduce the number of selectors
3769  // needing tokenize in the PSEUDO preFilter
3770  pseudos = ":(" + characterEncoding + ")(?:\\(((['\"])((?:\\\\.|[^\\\\])*?)\\3|((?:\\\\.|[^\\\\()[\\]]|" + attributes.replace( 3, 8 ) + ")*)|.*)\\)|)",
3771 
3772  // Leading and non-escaped trailing whitespace, capturing some non-whitespace characters preceding the latter
3773  rtrim = new RegExp( "^" + whitespace + "+|((?:^|[^\\\\])(?:\\\\.)*)" + whitespace + "+$", "g" ),
3774 
3775  rcomma = new RegExp( "^" + whitespace + "*," + whitespace + "*" ),
3776  rcombinators = new RegExp( "^" + whitespace + "*([\\x20\\t\\r\\n\\f>+~])" + whitespace + "*" ),
3777  rpseudo = new RegExp( pseudos ),
3778  ridentifier = new RegExp( "^" + identifier + "$" ),
3779 
3780  matchExpr = {
3781  "ID": new RegExp( "^#(" + characterEncoding + ")" ),
3782  "CLASS": new RegExp( "^\\.(" + characterEncoding + ")" ),
3783  "NAME": new RegExp( "^\\[name=['\"]?(" + characterEncoding + ")['\"]?\\]" ),
3784  "TAG": new RegExp( "^(" + characterEncoding.replace( "w", "w*" ) + ")" ),
3785  "ATTR": new RegExp( "^" + attributes ),
3786  "PSEUDO": new RegExp( "^" + pseudos ),
3787  "CHILD": new RegExp( "^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\(" + whitespace +
3788  "*(even|odd|(([+-]|)(\\d*)n|)" + whitespace + "*(?:([+-]|)" + whitespace +
3789  "*(\\d+)|))" + whitespace + "*\\)|)", "i" ),
3790  // For use in libraries implementing .is()
3791  // We use this for POS matching in `select`
3792  "needsContext": new RegExp( "^" + whitespace + "*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\(" +
3793  whitespace + "*((?:-\\d)?\\d*)" + whitespace + "*\\)|)(?=[^-]|$)", "i" )
3794  },
3795 
3796  rsibling = /[\x20\t\r\n\f]*[+~]/,
3797 
3798  rnative = /^[^{]+\{\s*\[native code/,
3799 
3800  // Easily-parseable/retrievable ID or TAG or CLASS selectors
3801  rquickExpr = /^(?:#([\w-]+)|(\w+)|\.([\w-]+))$/,
3802 
3803  rinputs = /^(?:input|select|textarea|button)$/i,
3804  rheader = /^h\d$/i,
3805 
3806  rescape = /'|\\/g,
3807  rattributeQuotes = /\=[\x20\t\r\n\f]*([^'"\]]*)[\x20\t\r\n\f]*\]/g,
3808 
3809  // CSS escapes http://www.w3.org/TR/CSS21/syndata.html#escaped-characters
3810  runescape = /\\([\da-fA-F]{1,6}[\x20\t\r\n\f]?|.)/g,
3811  funescape = function( _, escaped ) {
3812  var high = "0x" + escaped - 0x10000;
3813  // NaN means non-codepoint
3814  return high !== high ?
3815  escaped :
3816  // BMP codepoint
3817  high < 0 ?
3818  String.fromCharCode( high + 0x10000 ) :
3819  // Supplemental Plane codepoint (surrogate pair)
3820  String.fromCharCode( high >> 10 | 0xD800, high & 0x3FF | 0xDC00 );
3821  };
3822 
3823 // Use a stripped-down slice if we can't use a native one
3824 try {
3825  slice.call( preferredDoc.documentElement.childNodes, 0 )[0].nodeType;
3826 } catch ( e ) {
3827  slice = function( i ) {
3828  var elem,
3829  results = [];
3830  while ( (elem = this[i++]) ) {
3831  results.push( elem );
3832  }
3833  return results;
3834  };
3835 }
3836 
3837 /**
3838  * For feature detection
3839  * @param {Function} fn The function to test for native support
3840  */
3841 function isNative( fn ) {
3842  return rnative.test( fn + "" );
3843 }
3844 
3845 /**
3846  * Create key-value caches of limited size
3847  * @returns {Function(string, Object)} Returns the Object data after storing it on itself with
3848  * property name the (space-suffixed) string and (if the cache is larger than Expr.cacheLength)
3849  * deleting the oldest entry
3850  */
3851 function createCache() {
3852  var cache,
3853  keys = [];
3854 
3855  return (cache = function( key, value ) {
3856  // Use (key + " ") to avoid collision with native prototype properties (see Issue #157)
3857  if ( keys.push( key += " " ) > Expr.cacheLength ) {
3858  // Only keep the most recent entries
3859  delete cache[ keys.shift() ];
3860  }
3861  return (cache[ key ] = value);
3862  });
3863 }
3864 
3865 /**
3866  * Mark a function for special use by Sizzle
3867  * @param {Function} fn The function to mark
3868  */
3869 function markFunction( fn ) {
3870  fn[ expando ] = true;
3871  return fn;
3872 }
3873 
3874 /**
3875  * Support testing using an element
3876  * @param {Function} fn Passed the created div and expects a boolean result
3877  */
3878 function assert( fn ) {
3879  var div = document.createElement("div");
3880 
3881  try {
3882  return fn( div );
3883  } catch (e) {
3884  return false;
3885  } finally {
3886  // release memory in IE
3887  div = null;
3888  }
3889 }
3890 
3891 function Sizzle( selector, context, results, seed ) {
3892  var match, elem, m, nodeType,
3893  // QSA vars
3894  i, groups, old, nid, newContext, newSelector;
3895 
3896  if ( ( context ? context.ownerDocument || context : preferredDoc ) !== document ) {
3897  setDocument( context );
3898  }
3899 
3900  context = context || document;
3901  results = results || [];
3902 
3903  if ( !selector || typeof selector !== "string" ) {
3904  return results;
3905  }
3906 
3907  if ( (nodeType = context.nodeType) !== 1 && nodeType !== 9 ) {
3908  return [];
3909  }
3910 
3911  if ( !documentIsXML && !seed ) {
3912 
3913  // Shortcuts
3914  if ( (match = rquickExpr.exec( selector )) ) {
3915  // Speed-up: Sizzle("#ID")
3916  if ( (m = match[1]) ) {
3917  if ( nodeType === 9 ) {
3918  elem = context.getElementById( m );
3919  // Check parentNode to catch when Blackberry 4.6 returns
3920  // nodes that are no longer in the document #6963
3921  if ( elem && elem.parentNode ) {
3922  // Handle the case where IE, Opera, and Webkit return items
3923  // by name instead of ID
3924  if ( elem.id === m ) {
3925  results.push( elem );
3926  return results;
3927  }
3928  } else {
3929  return results;
3930  }
3931  } else {
3932  // Context is not a document
3933  if ( context.ownerDocument && (elem = context.ownerDocument.getElementById( m )) &&
3934  contains( context, elem ) && elem.id === m ) {
3935  results.push( elem );
3936  return results;
3937  }
3938  }
3939 
3940  // Speed-up: Sizzle("TAG")
3941  } else if ( match[2] ) {
3942  push.apply( results, slice.call(context.getElementsByTagName( selector ), 0) );
3943  return results;
3944 
3945  // Speed-up: Sizzle(".CLASS")
3946  } else if ( (m = match[3]) && support.getByClassName && context.getElementsByClassName ) {
3947  push.apply( results, slice.call(context.getElementsByClassName( m ), 0) );
3948  return results;
3949  }
3950  }
3951 
3952  // QSA path
3953  if ( support.qsa && !rbuggyQSA.test(selector) ) {
3954  old = true;
3955  nid = expando;
3956  newContext = context;
3957  newSelector = nodeType === 9 && selector;
3958 
3959  // qSA works strangely on Element-rooted queries
3960  // We can work around this by specifying an extra ID on the root
3961  // and working up from there (Thanks to Andrew Dupont for the technique)
3962  // IE 8 doesn't work on object elements
3963  if ( nodeType === 1 && context.nodeName.toLowerCase() !== "object" ) {
3964  groups = tokenize( selector );
3965 
3966  if ( (old = context.getAttribute("id")) ) {
3967  nid = old.replace( rescape, "\\$&" );
3968  } else {
3969  context.setAttribute( "id", nid );
3970  }
3971  nid = "[id='" + nid + "'] ";
3972 
3973  i = groups.length;
3974  while ( i-- ) {
3975  groups[i] = nid + toSelector( groups[i] );
3976  }
3977  newContext = rsibling.test( selector ) && context.parentNode || context;
3978  newSelector = groups.join(",");
3979  }
3980 
3981  if ( newSelector ) {
3982  try {
3983  push.apply( results, slice.call( newContext.querySelectorAll(
3984  newSelector
3985  ), 0 ) );
3986  return results;
3987  } catch(qsaError) {
3988  } finally {
3989  if ( !old ) {
3990  context.removeAttribute("id");
3991  }
3992  }
3993  }
3994  }
3995  }
3996 
3997  // All others
3998  return select( selector.replace( rtrim, "$1" ), context, results, seed );
3999 }
4000 
4001 /**
4002  * Detect xml
4003  * @param {Element|Object} elem An element or a document
4004  */
4005 isXML = Sizzle.isXML = function( elem ) {
4006  // documentElement is verified for cases where it doesn't yet exist
4007  // (such as loading iframes in IE - #4833)
4008  var documentElement = elem && (elem.ownerDocument || elem).documentElement;
4009  return documentElement ? documentElement.nodeName !== "HTML" : false;
4010 };
4011 
4012 /**
4013  * Sets document-related variables once based on the current document
4014  * @param {Element|Object} [doc] An element or document object to use to set the document
4015  * @returns {Object} Returns the current document
4016  */
4017 setDocument = Sizzle.setDocument = function( node ) {
4018  var doc = node ? node.ownerDocument || node : preferredDoc;
4019 
4020  // If no document and documentElement is available, return
4021  if ( doc === document || doc.nodeType !== 9 || !doc.documentElement ) {
4022  return document;
4023  }
4024 
4025  // Set our document
4026  document = doc;
4027  docElem = doc.documentElement;
4028 
4029  // Support tests
4030  documentIsXML = isXML( doc );
4031 
4032  // Check if getElementsByTagName("*") returns only elements
4033  support.tagNameNoComments = assert(function( div ) {
4034  div.appendChild( doc.createComment("") );
4035  return !div.getElementsByTagName("*").length;
4036  });
4037 
4038  // Check if attributes should be retrieved by attribute nodes
4039  support.attributes = assert(function( div ) {
4040  div.innerHTML = "<select></select>";
4041  var type = typeof div.lastChild.getAttribute("multiple");
4042  // IE8 returns a string for some attributes even when not present
4043  return type !== "boolean" && type !== "string";
4044  });
4045 
4046  // Check if getElementsByClassName can be trusted
4047  support.getByClassName = assert(function( div ) {
4048  // Opera can't find a second classname (in 9.6)
4049  div.innerHTML = "<div class='hidden e'></div><div class='hidden'></div>";
4050  if ( !div.getElementsByClassName || !div.getElementsByClassName("e").length ) {
4051  return false;
4052  }
4053 
4054  // Safari 3.2 caches class attributes and doesn't catch changes
4055  div.lastChild.className = "e";
4056  return div.getElementsByClassName("e").length === 2;
4057  });
4058 
4059  // Check if getElementById returns elements by name
4060  // Check if getElementsByName privileges form controls or returns elements by ID
4061  support.getByName = assert(function( div ) {
4062  // Inject content
4063  div.id = expando + 0;
4064  div.innerHTML = "<a name='" + expando + "'></a><div name='" + expando + "'></div>";
4065  docElem.insertBefore( div, docElem.firstChild );
4066 
4067  // Test
4068  var pass = doc.getElementsByName &&
4069  // buggy browsers will return fewer than the correct 2
4070  doc.getElementsByName( expando ).length === 2 +
4071  // buggy browsers will return more than the correct 0
4072  doc.getElementsByName( expando + 0 ).length;
4073  support.getIdNotName = !doc.getElementById( expando );
4074 
4075  // Cleanup
4076  docElem.removeChild( div );
4077 
4078  return pass;
4079  });
4080 
4081  // IE6/7 return modified attributes
4082  Expr.attrHandle = assert(function( div ) {
4083  div.innerHTML = "<a href='#'></a>";
4084  return div.firstChild && typeof div.firstChild.getAttribute !== strundefined &&
4085  div.firstChild.getAttribute("href") === "#";
4086  }) ?
4087  {} :
4088  {
4089  "href": function( elem ) {
4090  return elem.getAttribute( "href", 2 );
4091  },
4092  "type": function( elem ) {
4093  return elem.getAttribute("type");
4094  }
4095  };
4096 
4097  // ID find and filter
4098  if ( support.getIdNotName ) {
4099  Expr.find["ID"] = function( id, context ) {
4100  if ( typeof context.getElementById !== strundefined && !documentIsXML ) {
4101  var m = context.getElementById( id );
4102  // Check parentNode to catch when Blackberry 4.6 returns
4103  // nodes that are no longer in the document #6963
4104  return m && m.parentNode ? [m] : [];
4105  }
4106  };
4107  Expr.filter["ID"] = function( id ) {
4108  var attrId = id.replace( runescape, funescape );
4109  return function( elem ) {
4110  return elem.getAttribute("id") === attrId;
4111  };
4112  };
4113  } else {
4114  Expr.find["ID"] = function( id, context ) {
4115  if ( typeof context.getElementById !== strundefined && !documentIsXML ) {
4116  var m = context.getElementById( id );
4117 
4118  return m ?
4119  m.id === id || typeof m.getAttributeNode !== strundefined && m.getAttributeNode("id").value === id ?
4120  [m] :
4121  undefined :
4122  [];
4123  }
4124  };
4125  Expr.filter["ID"] = function( id ) {
4126  var attrId = id.replace( runescape, funescape );
4127  return function( elem ) {
4128  var node = typeof elem.getAttributeNode !== strundefined && elem.getAttributeNode("id");
4129  return node && node.value === attrId;
4130  };
4131  };
4132  }
4133 
4134  // Tag
4135  Expr.find["TAG"] = support.tagNameNoComments ?
4136  function( tag, context ) {
4137  if ( typeof context.getElementsByTagName !== strundefined ) {
4138  return context.getElementsByTagName( tag );
4139  }
4140  } :
4141  function( tag, context ) {
4142  var elem,
4143  tmp = [],
4144  i = 0,
4145  results = context.getElementsByTagName( tag );
4146 
4147  // Filter out possible comments
4148  if ( tag === "*" ) {
4149  while ( (elem = results[i++]) ) {
4150  if ( elem.nodeType === 1 ) {
4151  tmp.push( elem );
4152  }
4153  }
4154 
4155  return tmp;
4156  }
4157  return results;
4158  };
4159 
4160  // Name
4161  Expr.find["NAME"] = support.getByName && function( tag, context ) {
4162  if ( typeof context.getElementsByName !== strundefined ) {
4163  return context.getElementsByName( name );
4164  }
4165  };
4166 
4167  // Class
4168  Expr.find["CLASS"] = support.getByClassName && function( className, context ) {
4169  if ( typeof context.getElementsByClassName !== strundefined && !documentIsXML ) {
4170  return context.getElementsByClassName( className );
4171  }
4172  };
4173 
4174  // QSA and matchesSelector support
4175 
4176  // matchesSelector(:active) reports false when true (IE9/Opera 11.5)
4177  rbuggyMatches = [];
4178 
4179  // qSa(:focus) reports false when true (Chrome 21),
4180  // no need to also add to buggyMatches since matches checks buggyQSA
4181  // A support test would require too much code (would include document ready)
4182  rbuggyQSA = [ ":focus" ];
4183 
4184  if ( (support.qsa = isNative(doc.querySelectorAll)) ) {
4185  // Build QSA regex
4186  // Regex strategy adopted from Diego Perini
4187  assert(function( div ) {
4188  // Select is set to empty string on purpose
4189  // This is to test IE's treatment of not explictly
4190  // setting a boolean content attribute,
4191  // since its presence should be enough
4192  // http://bugs.jquery.com/ticket/12359
4193  div.innerHTML = "<select><option selected=''></option></select>";
4194 
4195  // IE8 - Some boolean attributes are not treated correctly
4196  if ( !div.querySelectorAll("[selected]").length ) {
4197  rbuggyQSA.push( "\\[" + whitespace + "*(?:checked|disabled|ismap|multiple|readonly|selected|value)" );
4198  }
4199 
4200  // Webkit/Opera - :checked should return selected option elements
4201  // http://www.w3.org/TR/2011/REC-css3-selectors-20110929/#checked
4202  // IE8 throws error here and will not see later tests
4203  if ( !div.querySelectorAll(":checked").length ) {
4204  rbuggyQSA.push(":checked");
4205  }
4206  });
4207 
4208  assert(function( div ) {
4209 
4210  // Opera 10-12/IE8 - ^= $= *= and empty values
4211  // Should not select anything
4212  div.innerHTML = "<input type='hidden' i=''/>";
4213  if ( div.querySelectorAll("[i^='']").length ) {
4214  rbuggyQSA.push( "[*^$]=" + whitespace + "*(?:\"\"|'')" );
4215  }
4216 
4217  // FF 3.5 - :enabled/:disabled and hidden elements (hidden elements are still enabled)
4218  // IE8 throws error here and will not see later tests
4219  if ( !div.querySelectorAll(":enabled").length ) {
4220  rbuggyQSA.push( ":enabled", ":disabled" );
4221  }
4222 
4223  // Opera 10-11 does not throw on post-comma invalid pseudos
4224  div.querySelectorAll("*,:x");
4225  rbuggyQSA.push(",.*:");
4226  });
4227  }
4228 
4229  if ( (support.matchesSelector = isNative( (matches = docElem.matchesSelector ||
4230  docElem.mozMatchesSelector ||
4231  docElem.webkitMatchesSelector ||
4232  docElem.oMatchesSelector ||
4233  docElem.msMatchesSelector) )) ) {
4234 
4235  assert(function( div ) {
4236  // Check to see if it's possible to do matchesSelector
4237  // on a disconnected node (IE 9)
4238  support.disconnectedMatch = matches.call( div, "div" );
4239 
4240  // This should fail with an exception
4241  // Gecko does not error, returns false instead
4242  matches.call( div, "[s!='']:x" );
4243  rbuggyMatches.push( "!=", pseudos );
4244  });
4245  }
4246 
4247  rbuggyQSA = new RegExp( rbuggyQSA.join("|") );
4248  rbuggyMatches = new RegExp( rbuggyMatches.join("|") );
4249 
4250  // Element contains another
4251  // Purposefully does not implement inclusive descendent
4252  // As in, an element does not contain itself
4253  contains = isNative(docElem.contains) || docElem.compareDocumentPosition ?
4254  function( a, b ) {
4255  var adown = a.nodeType === 9 ? a.documentElement : a,
4256  bup = b && b.parentNode;
4257  return a === bup || !!( bup && bup.nodeType === 1 && (
4258  adown.contains ?
4259  adown.contains( bup ) :
4260  a.compareDocumentPosition && a.compareDocumentPosition( bup ) & 16
4261  ));
4262  } :
4263  function( a, b ) {
4264  if ( b ) {
4265  while ( (b = b.parentNode) ) {
4266  if ( b === a ) {
4267  return true;
4268  }
4269  }
4270  }
4271  return false;
4272  };
4273 
4274  // Document order sorting
4275  sortOrder = docElem.compareDocumentPosition ?
4276  function( a, b ) {
4277  var compare;
4278 
4279  if ( a === b ) {
4280  hasDuplicate = true;
4281  return 0;
4282  }
4283 
4284  if ( (compare = b.compareDocumentPosition && a.compareDocumentPosition && a.compareDocumentPosition( b )) ) {
4285  if ( compare & 1 || a.parentNode && a.parentNode.nodeType === 11 ) {
4286  if ( a === doc || contains( preferredDoc, a ) ) {
4287  return -1;
4288  }
4289  if ( b === doc || contains( preferredDoc, b ) ) {
4290  return 1;
4291  }
4292  return 0;
4293  }
4294  return compare & 4 ? -1 : 1;
4295  }
4296 
4297  return a.compareDocumentPosition ? -1 : 1;
4298  } :
4299  function( a, b ) {
4300  var cur,
4301  i = 0,
4302  aup = a.parentNode,
4303  bup = b.parentNode,
4304  ap = [ a ],
4305  bp = [ b ];
4306 
4307  // Exit early if the nodes are identical
4308  if ( a === b ) {
4309  hasDuplicate = true;
4310  return 0;
4311 
4312  // Parentless nodes are either documents or disconnected
4313  } else if ( !aup || !bup ) {
4314  return a === doc ? -1 :
4315  b === doc ? 1 :
4316  aup ? -1 :
4317  bup ? 1 :
4318  0;
4319 
4320  // If the nodes are siblings, we can do a quick check
4321  } else if ( aup === bup ) {
4322  return siblingCheck( a, b );
4323  }
4324 
4325  // Otherwise we need full lists of their ancestors for comparison
4326  cur = a;
4327  while ( (cur = cur.parentNode) ) {
4328  ap.unshift( cur );
4329  }
4330  cur = b;
4331  while ( (cur = cur.parentNode) ) {
4332  bp.unshift( cur );
4333  }
4334 
4335  // Walk down the tree looking for a discrepancy
4336  while ( ap[i] === bp[i] ) {
4337  i++;
4338  }
4339 
4340  return i ?
4341  // Do a sibling check if the nodes have a common ancestor
4342  siblingCheck( ap[i], bp[i] ) :
4343 
4344  // Otherwise nodes in our document sort first
4345  ap[i] === preferredDoc ? -1 :
4346  bp[i] === preferredDoc ? 1 :
4347  0;
4348  };
4349 
4350  // Always assume the presence of duplicates if sort doesn't
4351  // pass them to our comparison function (as in Google Chrome).
4352  hasDuplicate = false;
4353  [0, 0].sort( sortOrder );
4354  support.detectDuplicates = hasDuplicate;
4355 
4356  return document;
4357 };
4358 
4359 Sizzle.matches = function( expr, elements ) {
4360  return Sizzle( expr, null, null, elements );
4361 };
4362 
4363 Sizzle.matchesSelector = function( elem, expr ) {
4364  // Set document vars if needed
4365  if ( ( elem.ownerDocument || elem ) !== document ) {
4366  setDocument( elem );
4367  }
4368 
4369  // Make sure that attribute selectors are quoted
4370  expr = expr.replace( rattributeQuotes, "='$1']" );
4371 
4372  // rbuggyQSA always contains :focus, so no need for an existence check
4373  if ( support.matchesSelector && !documentIsXML && (!rbuggyMatches || !rbuggyMatches.test(expr)) && !rbuggyQSA.test(expr) ) {
4374  try {
4375  var ret = matches.call( elem, expr );
4376 
4377  // IE 9's matchesSelector returns false on disconnected nodes
4378  if ( ret || support.disconnectedMatch ||
4379  // As well, disconnected nodes are said to be in a document
4380  // fragment in IE 9
4381  elem.document && elem.document.nodeType !== 11 ) {
4382  return ret;
4383  }
4384  } catch(e) {}
4385  }
4386 
4387  return Sizzle( expr, document, null, [elem] ).length > 0;
4388 };
4389 
4390 Sizzle.contains = function( context, elem ) {
4391  // Set document vars if needed
4392  if ( ( context.ownerDocument || context ) !== document ) {
4393  setDocument( context );
4394  }
4395  return contains( context, elem );
4396 };
4397 
4398 Sizzle.attr = function( elem, name ) {
4399  var val;
4400 
4401  // Set document vars if needed
4402  if ( ( elem.ownerDocument || elem ) !== document ) {
4403  setDocument( elem );
4404  }
4405 
4406  if ( !documentIsXML ) {
4407  name = name.toLowerCase();
4408  }
4409  if ( (val = Expr.attrHandle[ name ]) ) {
4410  return val( elem );
4411  }
4412  if ( documentIsXML || support.attributes ) {
4413  return elem.getAttribute( name );
4414  }
4415  return ( (val = elem.getAttributeNode( name )) || elem.getAttribute( name ) ) && elem[ name ] === true ?
4416  name :
4417  val && val.specified ? val.value : null;
4418 };
4419 
4420 Sizzle.error = function( msg ) {
4421  throw new Error( "Syntax error, unrecognized expression: " + msg );
4422 };
4423 
4424 // Document sorting and removing duplicates
4425 Sizzle.uniqueSort = function( results ) {
4426  var elem,
4427  duplicates = [],
4428  i = 1,
4429  j = 0;
4430 
4431  // Unless we *know* we can detect duplicates, assume their presence
4432  hasDuplicate = !support.detectDuplicates;
4433  results.sort( sortOrder );
4434 
4435  if ( hasDuplicate ) {
4436  for ( ; (elem = results[i]); i++ ) {
4437  if ( elem === results[ i - 1 ] ) {
4438  j = duplicates.push( i );
4439  }
4440  }
4441  while ( j-- ) {
4442  results.splice( duplicates[ j ], 1 );
4443  }
4444  }
4445 
4446  return results;
4447 };
4448 
4449 function siblingCheck( a, b ) {
4450  var cur = b && a,
4451  diff = cur && ( ~b.sourceIndex || MAX_NEGATIVE ) - ( ~a.sourceIndex || MAX_NEGATIVE );
4452 
4453  // Use IE sourceIndex if available on both nodes
4454  if ( diff ) {
4455  return diff;
4456  }
4457 
4458  // Check if b follows a
4459  if ( cur ) {
4460  while ( (cur = cur.nextSibling) ) {
4461  if ( cur === b ) {
4462  return -1;
4463  }
4464  }
4465  }
4466 
4467  return a ? 1 : -1;
4468 }
4469 
4470 // Returns a function to use in pseudos for input types
4471 function createInputPseudo( type ) {
4472  return function( elem ) {
4473  var name = elem.nodeName.toLowerCase();
4474  return name === "input" && elem.type === type;
4475  };
4476 }
4477 
4478 // Returns a function to use in pseudos for buttons
4479 function createButtonPseudo( type ) {
4480  return function( elem ) {
4481  var name = elem.nodeName.toLowerCase();
4482  return (name === "input" || name === "button") && elem.type === type;
4483  };
4484 }
4485 
4486 // Returns a function to use in pseudos for positionals
4487 function createPositionalPseudo( fn ) {
4488  return markFunction(function( argument ) {
4489  argument = +argument;
4490  return markFunction(function( seed, matches ) {
4491  var j,
4492  matchIndexes = fn( [], seed.length, argument ),
4493  i = matchIndexes.length;
4494 
4495  // Match elements found at the specified indexes
4496  while ( i-- ) {
4497  if ( seed[ (j = matchIndexes[i]) ] ) {
4498  seed[j] = !(matches[j] = seed[j]);
4499  }
4500  }
4501  });
4502  });
4503 }
4504 
4505 /**
4506  * Utility function for retrieving the text value of an array of DOM nodes
4507  * @param {Array|Element} elem
4508  */
4509 getText = Sizzle.getText = function( elem ) {
4510  var node,
4511  ret = "",
4512  i = 0,
4513  nodeType = elem.nodeType;
4514 
4515  if ( !nodeType ) {
4516  // If no nodeType, this is expected to be an array
4517  for ( ; (node = elem[i]); i++ ) {
4518  // Do not traverse comment nodes
4519  ret += getText( node );
4520  }
4521  } else if ( nodeType === 1 || nodeType === 9 || nodeType === 11 ) {
4522  // Use textContent for elements
4523  // innerText usage removed for consistency of new lines (see #11153)
4524  if ( typeof elem.textContent === "string" ) {
4525  return elem.textContent;
4526  } else {
4527  // Traverse its children
4528  for ( elem = elem.firstChild; elem; elem = elem.nextSibling ) {
4529  ret += getText( elem );
4530  }
4531  }
4532  } else if ( nodeType === 3 || nodeType === 4 ) {
4533  return elem.nodeValue;
4534  }
4535  // Do not include comment or processing instruction nodes
4536 
4537  return ret;
4538 };
4539 
4540 Expr = Sizzle.selectors = {
4541 
4542  // Can be adjusted by the user
4543  cacheLength: 50,
4544 
4545  createPseudo: markFunction,
4546 
4547  match: matchExpr,
4548 
4549  find: {},
4550 
4551  relative: {
4552  ">": { dir: "parentNode", first: true },
4553  " ": { dir: "parentNode" },
4554  "+": { dir: "previousSibling", first: true },
4555  "~": { dir: "previousSibling" }
4556  },
4557 
4558  preFilter: {
4559  "ATTR": function( match ) {
4560  match[1] = match[1].replace( runescape, funescape );
4561 
4562  // Move the given value to match[3] whether quoted or unquoted
4563  match[3] = ( match[4] || match[5] || "" ).replace( runescape, funescape );
4564 
4565  if ( match[2] === "~=" ) {
4566  match[3] = " " + match[3] + " ";
4567  }
4568 
4569  return match.slice( 0, 4 );
4570  },
4571 
4572  "CHILD": function( match ) {
4573  /* matches from matchExpr["CHILD"]
4574  1 type (only|nth|...)
4575  2 what (child|of-type)
4576  3 argument (even|odd|\d*|\d*n([+-]\d+)?|...)
4577  4 xn-component of xn+y argument ([+-]?\d*n|)
4578  5 sign of xn-component
4579  6 x of xn-component
4580  7 sign of y-component
4581  8 y of y-component
4582  */
4583  match[1] = match[1].toLowerCase();
4584 
4585  if ( match[1].slice( 0, 3 ) === "nth" ) {
4586  // nth-* requires argument
4587  if ( !match[3] ) {
4588  Sizzle.error( match[0] );
4589  }
4590 
4591  // numeric x and y parameters for Expr.filter.CHILD
4592  // remember that false/true cast respectively to 0/1
4593  match[4] = +( match[4] ? match[5] + (match[6] || 1) : 2 * ( match[3] === "even" || match[3] === "odd" ) );
4594  match[5] = +( ( match[7] + match[8] ) || match[3] === "odd" );
4595 
4596  // other types prohibit arguments
4597  } else if ( match[3] ) {
4598  Sizzle.error( match[0] );
4599  }
4600 
4601  return match;
4602  },
4603 
4604  "PSEUDO": function( match ) {
4605  var excess,
4606  unquoted = !match[5] && match[2];
4607 
4608  if ( matchExpr["CHILD"].test( match[0] ) ) {
4609  return null;
4610  }
4611 
4612  // Accept quoted arguments as-is
4613  if ( match[4] ) {
4614  match[2] = match[4];
4615 
4616  // Strip excess characters from unquoted arguments
4617  } else if ( unquoted && rpseudo.test( unquoted ) &&
4618  // Get excess from tokenize (recursively)
4619  (excess = tokenize( unquoted, true )) &&
4620  // advance to the next closing parenthesis
4621  (excess = unquoted.indexOf( ")", unquoted.length - excess ) - unquoted.length) ) {
4622 
4623  // excess is a negative index
4624  match[0] = match[0].slice( 0, excess );
4625  match[2] = unquoted.slice( 0, excess );
4626  }
4627 
4628  // Return only captures needed by the pseudo filter method (type and argument)
4629  return match.slice( 0, 3 );
4630  }
4631  },
4632 
4633  filter: {
4634 
4635  "TAG": function( nodeName ) {
4636  if ( nodeName === "*" ) {
4637  return function() { return true; };
4638  }
4639 
4640  nodeName = nodeName.replace( runescape, funescape ).toLowerCase();
4641  return function( elem ) {
4642  return elem.nodeName && elem.nodeName.toLowerCase() === nodeName;
4643  };
4644  },
4645 
4646  "CLASS": function( className ) {
4647  var pattern = classCache[ className + " " ];
4648 
4649  return pattern ||
4650  (pattern = new RegExp( "(^|" + whitespace + ")" + className + "(" + whitespace + "|$)" )) &&
4651  classCache( className, function( elem ) {
4652  return pattern.test( elem.className || (typeof elem.getAttribute !== strundefined && elem.getAttribute("class")) || "" );
4653  });
4654  },
4655 
4656  "ATTR": function( name, operator, check ) {
4657  return function( elem ) {
4658  var result = Sizzle.attr( elem, name );
4659 
4660  if ( result == null ) {
4661  return operator === "!=";
4662  }
4663  if ( !operator ) {
4664  return true;
4665  }
4666 
4667  result += "";
4668 
4669  return operator === "=" ? result === check :
4670  operator === "!=" ? result !== check :
4671  operator === "^=" ? check && result.indexOf( check ) === 0 :
4672  operator === "*=" ? check && result.indexOf( check ) > -1 :
4673  operator === "$=" ? check && result.slice( -check.length ) === check :
4674  operator === "~=" ? ( " " + result + " " ).indexOf( check ) > -1 :
4675  operator === "|=" ? result === check || result.slice( 0, check.length + 1 ) === check + "-" :
4676  false;
4677  };
4678  },
4679 
4680  "CHILD": function( type, what, argument, first, last ) {
4681  var simple = type.slice( 0, 3 ) !== "nth",
4682  forward = type.slice( -4 ) !== "last",
4683  ofType = what === "of-type";
4684 
4685  return first === 1 && last === 0 ?
4686 
4687  // Shortcut for :nth-*(n)
4688  function( elem ) {
4689  return !!elem.parentNode;
4690  } :
4691 
4692  function( elem, context, xml ) {
4693  var cache, outerCache, node, diff, nodeIndex, start,
4694  dir = simple !== forward ? "nextSibling" : "previousSibling",
4695  parent = elem.parentNode,
4696  name = ofType && elem.nodeName.toLowerCase(),
4697  useCache = !xml && !ofType;
4698 
4699  if ( parent ) {
4700 
4701  // :(first|last|only)-(child|of-type)
4702  if ( simple ) {
4703  while ( dir ) {
4704  node = elem;
4705  while ( (node = node[ dir ]) ) {
4706  if ( ofType ? node.nodeName.toLowerCase() === name : node.nodeType === 1 ) {
4707  return false;
4708  }
4709  }
4710  // Reverse direction for :only-* (if we haven't yet done so)
4711  start = dir = type === "only" && !start && "nextSibling";
4712  }
4713  return true;
4714  }
4715 
4716  start = [ forward ? parent.firstChild : parent.lastChild ];
4717 
4718  // non-xml :nth-child(...) stores cache data on `parent`
4719  if ( forward && useCache ) {
4720  // Seek `elem` from a previously-cached index
4721  outerCache = parent[ expando ] || (parent[ expando ] = {});
4722  cache = outerCache[ type ] || [];
4723  nodeIndex = cache[0] === dirruns && cache[1];
4724  diff = cache[0] === dirruns && cache[2];
4725  node = nodeIndex && parent.childNodes[ nodeIndex ];
4726 
4727  while ( (node = ++nodeIndex && node && node[ dir ] ||
4728 
4729  // Fallback to seeking `elem` from the start
4730  (diff = nodeIndex = 0) || start.pop()) ) {
4731 
4732  // When found, cache indexes on `parent` and break
4733  if ( node.nodeType === 1 && ++diff && node === elem ) {
4734  outerCache[ type ] = [ dirruns, nodeIndex, diff ];
4735  break;
4736  }
4737  }
4738 
4739  // Use previously-cached element index if available
4740  } else if ( useCache && (cache = (elem[ expando ] || (elem[ expando ] = {}))[ type ]) && cache[0] === dirruns ) {
4741  diff = cache[1];
4742 
4743  // xml :nth-child(...) or :nth-last-child(...) or :nth(-last)?-of-type(...)
4744  } else {
4745  // Use the same loop as above to seek `elem` from the start
4746  while ( (node = ++nodeIndex && node && node[ dir ] ||
4747  (diff = nodeIndex = 0) || start.pop()) ) {
4748 
4749  if ( ( ofType ? node.nodeName.toLowerCase() === name : node.nodeType === 1 ) && ++diff ) {
4750  // Cache the index of each encountered element
4751  if ( useCache ) {
4752  (node[ expando ] || (node[ expando ] = {}))[ type ] = [ dirruns, diff ];
4753  }
4754 
4755  if ( node === elem ) {
4756  break;
4757  }
4758  }
4759  }
4760  }
4761 
4762  // Incorporate the offset, then check against cycle size
4763  diff -= last;
4764  return diff === first || ( diff % first === 0 && diff / first >= 0 );
4765  }
4766  };
4767  },
4768 
4769  "PSEUDO": function( pseudo, argument ) {
4770  // pseudo-class names are case-insensitive
4771  // http://www.w3.org/TR/selectors/#pseudo-classes
4772  // Prioritize by case sensitivity in case custom pseudos are added with uppercase letters
4773  // Remember that setFilters inherits from pseudos
4774  var args,
4775  fn = Expr.pseudos[ pseudo ] || Expr.setFilters[ pseudo.toLowerCase() ] ||
4776  Sizzle.error( "unsupported pseudo: " + pseudo );
4777 
4778  // The user may use createPseudo to indicate that
4779  // arguments are needed to create the filter function
4780  // just as Sizzle does
4781  if ( fn[ expando ] ) {
4782  return fn( argument );
4783  }
4784 
4785  // But maintain support for old signatures
4786  if ( fn.length > 1 ) {
4787  args = [ pseudo, pseudo, "", argument ];
4788  return Expr.setFilters.hasOwnProperty( pseudo.toLowerCase() ) ?
4789  markFunction(function( seed, matches ) {
4790  var idx,
4791  matched = fn( seed, argument ),
4792  i = matched.length;
4793  while ( i-- ) {
4794  idx = indexOf.call( seed, matched[i] );
4795  seed[ idx ] = !( matches[ idx ] = matched[i] );
4796  }
4797  }) :
4798  function( elem ) {
4799  return fn( elem, 0, args );
4800  };
4801  }
4802 
4803  return fn;
4804  }
4805  },
4806 
4807  pseudos: {
4808  // Potentially complex pseudos
4809  "not": markFunction(function( selector ) {
4810  // Trim the selector passed to compile
4811  // to avoid treating leading and trailing
4812  // spaces as combinators
4813  var input = [],
4814  results = [],
4815  matcher = compile( selector.replace( rtrim, "$1" ) );
4816 
4817  return matcher[ expando ] ?
4818  markFunction(function( seed, matches, context, xml ) {
4819  var elem,
4820  unmatched = matcher( seed, null, xml, [] ),
4821  i = seed.length;
4822 
4823  // Match elements unmatched by `matcher`
4824  while ( i-- ) {
4825  if ( (elem = unmatched[i]) ) {
4826  seed[i] = !(matches[i] = elem);
4827  }
4828  }
4829  }) :
4830  function( elem, context, xml ) {
4831  input[0] = elem;
4832  matcher( input, null, xml, results );
4833  return !results.pop();
4834  };
4835  }),
4836 
4837  "has": markFunction(function( selector ) {
4838  return function( elem ) {
4839  return Sizzle( selector, elem ).length > 0;
4840  };
4841  }),
4842 
4843  "contains": markFunction(function( text ) {
4844  return function( elem ) {
4845  return ( elem.textContent || elem.innerText || getText( elem ) ).indexOf( text ) > -1;
4846  };
4847  }),
4848 
4849  // "Whether an element is represented by a :lang() selector
4850  // is based solely on the element's language value
4851  // being equal to the identifier C,
4852  // or beginning with the identifier C immediately followed by "-".
4853  // The matching of C against the element's language value is performed case-insensitively.
4854  // The identifier C does not have to be a valid language name."
4855  // http://www.w3.org/TR/selectors/#lang-pseudo
4856  "lang": markFunction( function( lang ) {
4857  // lang value must be a valid identifider
4858  if ( !ridentifier.test(lang || "") ) {
4859  Sizzle.error( "unsupported lang: " + lang );
4860  }
4861  lang = lang.replace( runescape, funescape ).toLowerCase();
4862  return function( elem ) {
4863  var elemLang;
4864  do {
4865  if ( (elemLang = documentIsXML ?
4866  elem.getAttribute("xml:lang") || elem.getAttribute("lang") :
4867  elem.lang) ) {
4868 
4869  elemLang = elemLang.toLowerCase();
4870  return elemLang === lang || elemLang.indexOf( lang + "-" ) === 0;
4871  }
4872  } while ( (elem = elem.parentNode) && elem.nodeType === 1 );
4873  return false;
4874  };
4875  }),
4876 
4877  // Miscellaneous
4878  "target": function( elem ) {
4879  var hash = window.location && window.location.hash;
4880  return hash && hash.slice( 1 ) === elem.id;
4881  },
4882 
4883  "root": function( elem ) {
4884  return elem === docElem;
4885  },
4886 
4887  "focus": function( elem ) {
4888  return elem === document.activeElement && (!document.hasFocus || document.hasFocus()) && !!(elem.type || elem.href || ~elem.tabIndex);
4889  },
4890 
4891  // Boolean properties
4892  "enabled": function( elem ) {
4893  return elem.disabled === false;
4894  },
4895 
4896  "disabled": function( elem ) {
4897  return elem.disabled === true;
4898  },
4899 
4900  "checked": function( elem ) {
4901  // In CSS3, :checked should return both checked and selected elements
4902  // http://www.w3.org/TR/2011/REC-css3-selectors-20110929/#checked
4903  var nodeName = elem.nodeName.toLowerCase();
4904  return (nodeName === "input" && !!elem.checked) || (nodeName === "option" && !!elem.selected);
4905  },
4906 
4907  "selected": function( elem ) {
4908  // Accessing this property makes selected-by-default
4909  // options in Safari work properly
4910  if ( elem.parentNode ) {
4911  elem.parentNode.selectedIndex;
4912  }
4913 
4914  return elem.selected === true;
4915  },
4916 
4917  // Contents
4918  "empty": function( elem ) {
4919  // http://www.w3.org/TR/selectors/#empty-pseudo
4920  // :empty is only affected by element nodes and content nodes(including text(3), cdata(4)),
4921  // not comment, processing instructions, or others
4922  // Thanks to Diego Perini for the nodeName shortcut
4923  // Greater than "@" means alpha characters (specifically not starting with "#" or "?")
4924  for ( elem = elem.firstChild; elem; elem = elem.nextSibling ) {
4925  if ( elem.nodeName > "@" || elem.nodeType === 3 || elem.nodeType === 4 ) {
4926  return false;
4927  }
4928  }
4929  return true;
4930  },
4931 
4932  "parent": function( elem ) {
4933  return !Expr.pseudos["empty"]( elem );
4934  },
4935 
4936  // Element/input types
4937  "header": function( elem ) {
4938  return rheader.test( elem.nodeName );
4939  },
4940 
4941  "input": function( elem ) {
4942  return rinputs.test( elem.nodeName );
4943  },
4944 
4945  "button": function( elem ) {
4946  var name = elem.nodeName.toLowerCase();
4947  return name === "input" && elem.type === "button" || name === "button";
4948  },
4949 
4950  "text": function( elem ) {
4951  var attr;
4952  // IE6 and 7 will map elem.type to 'text' for new HTML5 types (search, etc)
4953  // use getAttribute instead to test this case
4954  return elem.nodeName.toLowerCase() === "input" &&
4955  elem.type === "text" &&
4956  ( (attr = elem.getAttribute("type")) == null || attr.toLowerCase() === elem.type );
4957  },
4958 
4959  // Position-in-collection
4960  "first": createPositionalPseudo(function() {
4961  return [ 0 ];
4962  }),
4963 
4964  "last": createPositionalPseudo(function( matchIndexes, length ) {
4965  return [ length - 1 ];
4966  }),
4967 
4968  "eq": createPositionalPseudo(function( matchIndexes, length, argument ) {
4969  return [ argument < 0 ? argument + length : argument ];
4970  }),
4971 
4972  "even": createPositionalPseudo(function( matchIndexes, length ) {
4973  var i = 0;
4974  for ( ; i < length; i += 2 ) {
4975  matchIndexes.push( i );
4976  }
4977  return matchIndexes;
4978  }),
4979 
4980  "odd": createPositionalPseudo(function( matchIndexes, length ) {
4981  var i = 1;
4982  for ( ; i < length; i += 2 ) {
4983  matchIndexes.push( i );
4984  }
4985  return matchIndexes;
4986  }),
4987 
4988  "lt": createPositionalPseudo(function( matchIndexes, length, argument ) {
4989  var i = argument < 0 ? argument + length : argument;
4990  for ( ; --i >= 0; ) {
4991  matchIndexes.push( i );
4992  }
4993  return matchIndexes;
4994  }),
4995 
4996  "gt": createPositionalPseudo(function( matchIndexes, length, argument ) {
4997  var i = argument < 0 ? argument + length : argument;
4998  for ( ; ++i < length; ) {
4999  matchIndexes.push( i );
5000  }
5001  return matchIndexes;
5002  })
5003  }
5004 };
5005 
5006 // Add button/input type pseudos
5007 for ( i in { radio: true, checkbox: true, file: true, password: true, image: true } ) {
5008  Expr.pseudos[ i ] = createInputPseudo( i );
5009 }
5010 for ( i in { submit: true, reset: true } ) {
5011  Expr.pseudos[ i ] = createButtonPseudo( i );
5012 }
5013 
5014 function tokenize( selector, parseOnly ) {
5015  var matched, match, tokens, type,
5016  soFar, groups, preFilters,
5017  cached = tokenCache[ selector + " " ];
5018 
5019  if ( cached ) {
5020  return parseOnly ? 0 : cached.slice( 0 );
5021  }
5022 
5023  soFar = selector;
5024  groups = [];
5025  preFilters = Expr.preFilter;
5026 
5027  while ( soFar ) {
5028 
5029  // Comma and first run
5030  if ( !matched || (match = rcomma.exec( soFar )) ) {
5031  if ( match ) {
5032  // Don't consume trailing commas as valid
5033  soFar = soFar.slice( match[0].length ) || soFar;
5034  }
5035  groups.push( tokens = [] );
5036  }
5037 
5038  matched = false;
5039 
5040  // Combinators
5041  if ( (match = rcombinators.exec( soFar )) ) {
5042  matched = match.shift();
5043  tokens.push( {
5044  value: matched,
5045  // Cast descendant combinators to space
5046  type: match[0].replace( rtrim, " " )
5047  } );
5048  soFar = soFar.slice( matched.length );
5049  }
5050 
5051  // Filters
5052  for ( type in Expr.filter ) {
5053  if ( (match = matchExpr[ type ].exec( soFar )) && (!preFilters[ type ] ||
5054  (match = preFilters[ type ]( match ))) ) {
5055  matched = match.shift();
5056  tokens.push( {
5057  value: matched,
5058  type: type,
5059  matches: match
5060  } );
5061  soFar = soFar.slice( matched.length );
5062  }
5063  }
5064 
5065  if ( !matched ) {
5066  break;
5067  }
5068  }
5069 
5070  // Return the length of the invalid excess
5071  // if we're just parsing
5072  // Otherwise, throw an error or return tokens
5073  return parseOnly ?
5074  soFar.length :
5075  soFar ?
5076  Sizzle.error( selector ) :
5077  // Cache the tokens
5078  tokenCache( selector, groups ).slice( 0 );
5079 }
5080 
5081 function toSelector( tokens ) {
5082  var i = 0,
5083  len = tokens.length,
5084  selector = "";
5085  for ( ; i < len; i++ ) {
5086  selector += tokens[i].value;
5087  }
5088  return selector;
5089 }
5090 
5091 function addCombinator( matcher, combinator, base ) {
5092  var dir = combinator.dir,
5093  checkNonElements = base && dir === "parentNode",
5094  doneName = done++;
5095 
5096  return combinator.first ?
5097  // Check against closest ancestor/preceding element
5098  function( elem, context, xml ) {
5099  while ( (elem = elem[ dir ]) ) {
5100  if ( elem.nodeType === 1 || checkNonElements ) {
5101  return matcher( elem, context, xml );
5102  }
5103  }
5104  } :
5105 
5106  // Check against all ancestor/preceding elements
5107  function( elem, context, xml ) {
5108  var data, cache, outerCache,
5109  dirkey = dirruns + " " + doneName;
5110 
5111  // We can't set arbitrary data on XML nodes, so they don't benefit from dir caching
5112  if ( xml ) {
5113  while ( (elem = elem[ dir ]) ) {
5114  if ( elem.nodeType === 1 || checkNonElements ) {
5115  if ( matcher( elem, context, xml ) ) {
5116  return true;
5117  }
5118  }
5119  }
5120  } else {
5121  while ( (elem = elem[ dir ]) ) {
5122  if ( elem.nodeType === 1 || checkNonElements ) {
5123  outerCache = elem[ expando ] || (elem[ expando ] = {});
5124  if ( (cache = outerCache[ dir ]) && cache[0] === dirkey ) {
5125  if ( (data = cache[1]) === true || data === cachedruns ) {
5126  return data === true;
5127  }
5128  } else {
5129  cache = outerCache[ dir ] = [ dirkey ];
5130  cache[1] = matcher( elem, context, xml ) || cachedruns;
5131  if ( cache[1] === true ) {
5132  return true;
5133  }
5134  }
5135  }
5136  }
5137  }
5138  };
5139 }
5140 
5141 function elementMatcher( matchers ) {
5142  return matchers.length > 1 ?
5143  function( elem, context, xml ) {
5144  var i = matchers.length;
5145  while ( i-- ) {
5146  if ( !matchers[i]( elem, context, xml ) ) {
5147  return false;
5148  }
5149  }
5150  return true;
5151  } :
5152  matchers[0];
5153 }
5154 
5155 function condense( unmatched, map, filter, context, xml ) {
5156  var elem,
5157  newUnmatched = [],
5158  i = 0,
5159  len = unmatched.length,
5160  mapped = map != null;
5161 
5162  for ( ; i < len; i++ ) {
5163  if ( (elem = unmatched[i]) ) {
5164  if ( !filter || filter( elem, context, xml ) ) {
5165  newUnmatched.push( elem );
5166  if ( mapped ) {
5167  map.push( i );
5168  }
5169  }
5170  }
5171  }
5172 
5173  return newUnmatched;
5174 }
5175 
5176 function setMatcher( preFilter, selector, matcher, postFilter, postFinder, postSelector ) {
5177  if ( postFilter && !postFilter[ expando ] ) {
5178  postFilter = setMatcher( postFilter );
5179  }
5180  if ( postFinder && !postFinder[ expando ] ) {
5181  postFinder = setMatcher( postFinder, postSelector );
5182  }
5183  return markFunction(function( seed, results, context, xml ) {
5184  var temp, i, elem,
5185  preMap = [],
5186  postMap = [],
5187  preexisting = results.length,
5188 
5189  // Get initial elements from seed or context
5190  elems = seed || multipleContexts( selector || "*", context.nodeType ? [ context ] : context, [] ),
5191 
5192  // Prefilter to get matcher input, preserving a map for seed-results synchronization
5193  matcherIn = preFilter && ( seed || !selector ) ?
5194  condense( elems, preMap, preFilter, context, xml ) :
5195  elems,
5196 
5197  matcherOut = matcher ?
5198  // If we have a postFinder, or filtered seed, or non-seed postFilter or preexisting results,
5199  postFinder || ( seed ? preFilter : preexisting || postFilter ) ?
5200 
5201  // ...intermediate processing is necessary
5202  [] :
5203 
5204  // ...otherwise use results directly
5205  results :
5206  matcherIn;
5207 
5208  // Find primary matches
5209  if ( matcher ) {
5210  matcher( matcherIn, matcherOut, context, xml );
5211  }
5212 
5213  // Apply postFilter
5214  if ( postFilter ) {
5215  temp = condense( matcherOut, postMap );
5216  postFilter( temp, [], context, xml );
5217 
5218  // Un-match failing elements by moving them back to matcherIn
5219  i = temp.length;
5220  while ( i-- ) {
5221  if ( (elem = temp[i]) ) {
5222  matcherOut[ postMap[i] ] = !(matcherIn[ postMap[i] ] = elem);
5223  }
5224  }
5225  }
5226 
5227  if ( seed ) {
5228  if ( postFinder || preFilter ) {
5229  if ( postFinder ) {
5230  // Get the final matcherOut by condensing this intermediate into postFinder contexts
5231  temp = [];
5232  i = matcherOut.length;
5233  while ( i-- ) {
5234  if ( (elem = matcherOut[i]) ) {
5235  // Restore matcherIn since elem is not yet a final match
5236  temp.push( (matcherIn[i] = elem) );
5237  }
5238  }
5239  postFinder( null, (matcherOut = []), temp, xml );
5240  }
5241 
5242  // Move matched elements from seed to results to keep them synchronized
5243  i = matcherOut.length;
5244  while ( i-- ) {
5245  if ( (elem = matcherOut[i]) &&
5246  (temp = postFinder ? indexOf.call( seed, elem ) : preMap[i]) > -1 ) {
5247 
5248  seed[temp] = !(results[temp] = elem);
5249  }
5250  }
5251  }
5252 
5253  // Add elements to results, through postFinder if defined
5254  } else {
5255  matcherOut = condense(
5256  matcherOut === results ?
5257  matcherOut.splice( preexisting, matcherOut.length ) :
5258  matcherOut
5259  );
5260  if ( postFinder ) {
5261  postFinder( null, results, matcherOut, xml );
5262  } else {
5263  push.apply( results, matcherOut );
5264  }
5265  }
5266  });
5267 }
5268 
5269 function matcherFromTokens( tokens ) {
5270  var checkContext, matcher, j,
5271  len = tokens.length,
5272  leadingRelative = Expr.relative[ tokens[0].type ],
5273  implicitRelative = leadingRelative || Expr.relative[" "],
5274  i = leadingRelative ? 1 : 0,
5275 
5276  // The foundational matcher ensures that elements are reachable from top-level context(s)
5277  matchContext = addCombinator( function( elem ) {
5278  return elem === checkContext;
5279  }, implicitRelative, true ),
5280  matchAnyContext = addCombinator( function( elem ) {
5281  return indexOf.call( checkContext, elem ) > -1;
5282  }, implicitRelative, true ),
5283  matchers = [ function( elem, context, xml ) {
5284  return ( !leadingRelative && ( xml || context !== outermostContext ) ) || (
5285  (checkContext = context).nodeType ?
5286  matchContext( elem, context, xml ) :
5287  matchAnyContext( elem, context, xml ) );
5288  } ];
5289 
5290  for ( ; i < len; i++ ) {
5291  if ( (matcher = Expr.relative[ tokens[i].type ]) ) {
5292  matchers = [ addCombinator(elementMatcher( matchers ), matcher) ];
5293  } else {
5294  matcher = Expr.filter[ tokens[i].type ].apply( null, tokens[i].matches );
5295 
5296  // Return special upon seeing a positional matcher
5297  if ( matcher[ expando ] ) {
5298  // Find the next relative operator (if any) for proper handling
5299  j = ++i;
5300  for ( ; j < len; j++ ) {
5301  if ( Expr.relative[ tokens[j].type ] ) {
5302  break;
5303  }
5304  }
5305  return setMatcher(
5306  i > 1 && elementMatcher( matchers ),
5307  i > 1 && toSelector( tokens.slice( 0, i - 1 ) ).replace( rtrim, "$1" ),
5308  matcher,
5309  i < j && matcherFromTokens( tokens.slice( i, j ) ),
5310  j < len && matcherFromTokens( (tokens = tokens.slice( j )) ),
5311  j < len && toSelector( tokens )
5312  );
5313  }
5314  matchers.push( matcher );
5315  }
5316  }
5317 
5318  return elementMatcher( matchers );
5319 }
5320 
5321 function matcherFromGroupMatchers( elementMatchers, setMatchers ) {
5322  // A counter to specify which element is currently being matched
5323  var matcherCachedRuns = 0,
5324  bySet = setMatchers.length > 0,
5325  byElement = elementMatchers.length > 0,
5326  superMatcher = function( seed, context, xml, results, expandContext ) {
5327  var elem, j, matcher,
5328  setMatched = [],
5329  matchedCount = 0,
5330  i = "0",
5331  unmatched = seed && [],
5332  outermost = expandContext != null,
5333  contextBackup = outermostContext,
5334  // We must always have either seed elements or context
5335  elems = seed || byElement && Expr.find["TAG"]( "*", expandContext && context.parentNode || context ),
5336  // Use integer dirruns iff this is the outermost matcher
5337  dirrunsUnique = (dirruns += contextBackup == null ? 1 : Math.random() || 0.1);
5338 
5339  if ( outermost ) {
5340  outermostContext = context !== document && context;
5341  cachedruns = matcherCachedRuns;
5342  }
5343 
5344  // Add elements passing elementMatchers directly to results
5345  // Keep `i` a string if there are no elements so `matchedCount` will be "00" below
5346  for ( ; (elem = elems[i]) != null; i++ ) {
5347  if ( byElement && elem ) {
5348  j = 0;
5349  while ( (matcher = elementMatchers[j++]) ) {
5350  if ( matcher( elem, context, xml ) ) {
5351  results.push( elem );
5352  break;
5353  }
5354  }
5355  if ( outermost ) {
5356  dirruns = dirrunsUnique;
5357  cachedruns = ++matcherCachedRuns;
5358  }
5359  }
5360 
5361  // Track unmatched elements for set filters
5362  if ( bySet ) {
5363  // They will have gone through all possible matchers
5364  if ( (elem = !matcher && elem) ) {
5365  matchedCount--;
5366  }
5367 
5368  // Lengthen the array for every element, matched or not
5369  if ( seed ) {
5370  unmatched.push( elem );
5371  }
5372  }
5373  }
5374 
5375  // Apply set filters to unmatched elements
5376  matchedCount += i;
5377  if ( bySet && i !== matchedCount ) {
5378  j = 0;
5379  while ( (matcher = setMatchers[j++]) ) {
5380  matcher( unmatched, setMatched, context, xml );
5381  }
5382 
5383  if ( seed ) {
5384  // Reintegrate element matches to eliminate the need for sorting
5385  if ( matchedCount > 0 ) {
5386  while ( i-- ) {
5387  if ( !(unmatched[i] || setMatched[i]) ) {
5388  setMatched[i] = pop.call( results );
5389  }
5390  }
5391  }
5392 
5393  // Discard index placeholder values to get only actual matches
5394  setMatched = condense( setMatched );
5395  }
5396 
5397  // Add matches to results
5398  push.apply( results, setMatched );
5399 
5400  // Seedless set matches succeeding multiple successful matchers stipulate sorting
5401  if ( outermost && !seed && setMatched.length > 0 &&
5402  ( matchedCount + setMatchers.length ) > 1 ) {
5403 
5404  Sizzle.uniqueSort( results );
5405  }
5406  }
5407 
5408  // Override manipulation of globals by nested matchers
5409  if ( outermost ) {
5410  dirruns = dirrunsUnique;
5411  outermostContext = contextBackup;
5412  }
5413 
5414  return unmatched;
5415  };
5416 
5417  return bySet ?
5418  markFunction( superMatcher ) :
5419  superMatcher;
5420 }
5421 
5422 compile = Sizzle.compile = function( selector, group /* Internal Use Only */ ) {
5423  var i,
5424  setMatchers = [],
5425  elementMatchers = [],
5426  cached = compilerCache[ selector + " " ];
5427 
5428  if ( !cached ) {
5429  // Generate a function of recursive functions that can be used to check each element
5430  if ( !group ) {
5431  group = tokenize( selector );
5432  }
5433  i = group.length;
5434  while ( i-- ) {
5435  cached = matcherFromTokens( group[i] );
5436  if ( cached[ expando ] ) {
5437  setMatchers.push( cached );
5438  } else {
5439  elementMatchers.push( cached );
5440  }
5441  }
5442 
5443  // Cache the compiled function
5444  cached = compilerCache( selector, matcherFromGroupMatchers( elementMatchers, setMatchers ) );
5445  }
5446  return cached;
5447 };
5448 
5449 function multipleContexts( selector, contexts, results ) {
5450  var i = 0,
5451  len = contexts.length;
5452  for ( ; i < len; i++ ) {
5453  Sizzle( selector, contexts[i], results );
5454  }
5455  return results;
5456 }
5457 
5458 function select( selector, context, results, seed ) {
5459  var i, tokens, token, type, find,
5460  match = tokenize( selector );
5461 
5462  if ( !seed ) {
5463  // Try to minimize operations if there is only one group
5464  if ( match.length === 1 ) {
5465 
5466  // Take a shortcut and set the context if the root selector is an ID
5467  tokens = match[0] = match[0].slice( 0 );
5468  if ( tokens.length > 2 && (token = tokens[0]).type === "ID" &&
5469  context.nodeType === 9 && !documentIsXML &&
5470  Expr.relative[ tokens[1].type ] ) {
5471 
5472  context = Expr.find["ID"]( token.matches[0].replace( runescape, funescape ), context )[0];
5473  if ( !context ) {
5474  return results;
5475  }
5476 
5477  selector = selector.slice( tokens.shift().value.length );
5478  }
5479 
5480  // Fetch a seed set for right-to-left matching
5481  i = matchExpr["needsContext"].test( selector ) ? 0 : tokens.length;
5482  while ( i-- ) {
5483  token = tokens[i];
5484 
5485  // Abort if we hit a combinator
5486  if ( Expr.relative[ (type = token.type) ] ) {
5487  break;
5488  }
5489  if ( (find = Expr.find[ type ]) ) {
5490  // Search, expanding context for leading sibling combinators
5491  if ( (seed = find(
5492  token.matches[0].replace( runescape, funescape ),
5493  rsibling.test( tokens[0].type ) && context.parentNode || context
5494  )) ) {
5495 
5496  // If seed is empty or no tokens remain, we can return early
5497  tokens.splice( i, 1 );
5498  selector = seed.length && toSelector( tokens );
5499  if ( !selector ) {
5500  push.apply( results, slice.call( seed, 0 ) );
5501  return results;
5502  }
5503 
5504  break;
5505  }
5506  }
5507  }
5508  }
5509  }
5510 
5511  // Compile and execute a filtering function
5512  // Provide `match` to avoid retokenization if we modified the selector above
5513  compile( selector, match )(
5514  seed,
5515  context,
5516  documentIsXML,
5517  results,
5518  rsibling.test( selector )
5519  );
5520  return results;
5521 }
5522 
5523 // Deprecated
5524 Expr.pseudos["nth"] = Expr.pseudos["eq"];
5525 
5526 // Easy API for creating new setFilters
5527 function setFilters() {}
5528 Expr.filters = setFilters.prototype = Expr.pseudos;
5529 Expr.setFilters = new setFilters();
5530 
5531 // Initialize with the default document
5532 setDocument();
5533 
5534 // Override sizzle attribute retrieval
5535 Sizzle.attr = jQuery.attr;
5536 jQuery.find = Sizzle;
5537 jQuery.expr = Sizzle.selectors;
5538 jQuery.expr[":"] = jQuery.expr.pseudos;
5539 jQuery.unique = Sizzle.uniqueSort;
5540 jQuery.text = Sizzle.getText;
5541 jQuery.isXMLDoc = Sizzle.isXML;
5542 jQuery.contains = Sizzle.contains;
5543 
5544 
5545 })( window );
5546 var runtil = /Until$/,
5547  rparentsprev = /^(?:parents|prev(?:Until|All))/,
5548  isSimple = /^.[^:#\[\.,]*$/,
5549  rneedsContext = jQuery.expr.match.needsContext,
5550  // methods guaranteed to produce a unique set when starting from a unique set
5551  guaranteedUnique = {
5552  children: true,
5553  contents: true,
5554  next: true,
5555  prev: true
5556  };
5557 
5558 jQuery.fn.extend({
5559  find: function( selector ) {
5560  var i, ret, self,
5561  len = this.length;
5562 
5563  if ( typeof selector !== "string" ) {
5564  self = this;
5565  return this.pushStack( jQuery( selector ).filter(function() {
5566  for ( i = 0; i < len; i++ ) {
5567  if ( jQuery.contains( self[ i ], this ) ) {
5568  return true;
5569  }
5570  }
5571  }) );
5572  }
5573 
5574  ret = [];
5575  for ( i = 0; i < len; i++ ) {
5576  jQuery.find( selector, this[ i ], ret );
5577  }
5578 
5579  // Needed because $( selector, context ) becomes $( context ).find( selector )
5580  ret = this.pushStack( len > 1 ? jQuery.unique( ret ) : ret );
5581  ret.selector = ( this.selector ? this.selector + " " : "" ) + selector;
5582  return ret;
5583  },
5584 
5585  has: function( target ) {
5586  var i,
5587  targets = jQuery( target, this ),
5588  len = targets.length;
5589 
5590  return this.filter(function() {
5591  for ( i = 0; i < len; i++ ) {
5592  if ( jQuery.contains( this, targets[i] ) ) {
5593  return true;
5594  }
5595  }
5596  });
5597  },
5598 
5599  not: function( selector ) {
5600  return this.pushStack( winnow(this, selector, false) );
5601  },
5602 
5603  filter: function( selector ) {
5604  return this.pushStack( winnow(this, selector, true) );
5605  },
5606 
5607  is: function( selector ) {
5608  return !!selector && (
5609  typeof selector === "string" ?
5610  // If this is a positional/relative selector, check membership in the returned set
5611  // so $("p:first").is("p:last") won't return true for a doc with two "p".
5612  rneedsContext.test( selector ) ?
5613  jQuery( selector, this.context ).index( this[0] ) >= 0 :
5614  jQuery.filter( selector, this ).length > 0 :
5615  this.filter( selector ).length > 0 );
5616  },
5617 
5618  closest: function( selectors, context ) {
5619  var cur,
5620  i = 0,
5621  l = this.length,
5622  ret = [],
5623  pos = rneedsContext.test( selectors ) || typeof selectors !== "string" ?
5624  jQuery( selectors, context || this.context ) :
5625  0;
5626 
5627  for ( ; i < l; i++ ) {
5628  cur = this[i];
5629 
5630  while ( cur && cur.ownerDocument && cur !== context && cur.nodeType !== 11 ) {
5631  if ( pos ? pos.index(cur) > -1 : jQuery.find.matchesSelector(cur, selectors) ) {
5632  ret.push( cur );
5633  break;
5634  }
5635  cur = cur.parentNode;
5636  }
5637  }
5638 
5639  return this.pushStack( ret.length > 1 ? jQuery.unique( ret ) : ret );
5640  },
5641 
5642  // Determine the position of an element within
5643  // the matched set of elements
5644  index: function( elem ) {
5645 
5646  // No argument, return index in parent
5647  if ( !elem ) {
5648  return ( this[0] && this[0].parentNode ) ? this.first().prevAll().length : -1;
5649  }
5650 
5651  // index in selector
5652  if ( typeof elem === "string" ) {
5653  return jQuery.inArray( this[0], jQuery( elem ) );
5654  }
5655 
5656  // Locate the position of the desired element
5657  return jQuery.inArray(
5658  // If it receives a jQuery object, the first element is used
5659  elem.jquery ? elem[0] : elem, this );
5660  },
5661 
5662  add: function( selector, context ) {
5663  var set = typeof selector === "string" ?
5664  jQuery( selector, context ) :
5665  jQuery.makeArray( selector && selector.nodeType ? [ selector ] : selector ),
5666  all = jQuery.merge( this.get(), set );
5667 
5668  return this.pushStack( jQuery.unique(all) );
5669  },
5670 
5671  addBack: function( selector ) {
5672  return this.add( selector == null ?
5673  this.prevObject : this.prevObject.filter(selector)
5674  );
5675  }
5676 });
5677 
5678 jQuery.fn.andSelf = jQuery.fn.addBack;
5679 
5680 function sibling( cur, dir ) {
5681  do {
5682  cur = cur[ dir ];
5683  } while ( cur && cur.nodeType !== 1 );
5684 
5685  return cur;
5686 }
5687 
5688 jQuery.each({
5689  parent: function( elem ) {
5690  var parent = elem.parentNode;
5691  return parent && parent.nodeType !== 11 ? parent : null;
5692  },
5693  parents: function( elem ) {
5694  return jQuery.dir( elem, "parentNode" );
5695  },
5696  parentsUntil: function( elem, i, until ) {
5697  return jQuery.dir( elem, "parentNode", until );
5698  },
5699  next: function( elem ) {
5700  return sibling( elem, "nextSibling" );
5701  },
5702  prev: function( elem ) {
5703  return sibling( elem, "previousSibling" );
5704  },
5705  nextAll: function( elem ) {
5706  return jQuery.dir( elem, "nextSibling" );
5707  },
5708  prevAll: function( elem ) {
5709  return jQuery.dir( elem, "previousSibling" );
5710  },
5711  nextUntil: function( elem, i, until ) {
5712  return jQuery.dir( elem, "nextSibling", until );
5713  },
5714  prevUntil: function( elem, i, until ) {
5715  return jQuery.dir( elem, "previousSibling", until );
5716  },
5717  siblings: function( elem ) {
5718  return jQuery.sibling( ( elem.parentNode || {} ).firstChild, elem );
5719  },
5720  children: function( elem ) {
5721  return jQuery.sibling( elem.firstChild );
5722  },
5723  contents: function( elem ) {
5724  return jQuery.nodeName( elem, "iframe" ) ?
5725  elem.contentDocument || elem.contentWindow.document :
5726  jQuery.merge( [], elem.childNodes );
5727  }
5728 }, function( name, fn ) {
5729  jQuery.fn[ name ] = function( until, selector ) {
5730  var ret = jQuery.map( this, fn, until );
5731 
5732  if ( !runtil.test( name ) ) {
5733  selector = until;
5734  }
5735 
5736  if ( selector && typeof selector === "string" ) {
5737  ret = jQuery.filter( selector, ret );
5738  }
5739 
5740  ret = this.length > 1 && !guaranteedUnique[ name ] ? jQuery.unique( ret ) : ret;
5741 
5742  if ( this.length > 1 && rparentsprev.test( name ) ) {
5743  ret = ret.reverse();
5744  }
5745 
5746  return this.pushStack( ret );
5747  };
5748 });
5749 
5750 jQuery.extend({
5751  filter: function( expr, elems, not ) {
5752  if ( not ) {
5753  expr = ":not(" + expr + ")";
5754  }
5755 
5756  return elems.length === 1 ?
5757  jQuery.find.matchesSelector(elems[0], expr) ? [ elems[0] ] : [] :
5758  jQuery.find.matches(expr, elems);
5759  },
5760 
5761  dir: function( elem, dir, until ) {
5762  var matched = [],
5763  cur = elem[ dir ];
5764 
5765  while ( cur && cur.nodeType !== 9 && (until === undefined || cur.nodeType !== 1 || !jQuery( cur ).is( until )) ) {
5766  if ( cur.nodeType === 1 ) {
5767  matched.push( cur );
5768  }
5769  cur = cur[dir];
5770  }
5771  return matched;
5772  },
5773 
5774  sibling: function( n, elem ) {
5775  var r = [];
5776 
5777  for ( ; n; n = n.nextSibling ) {
5778  if ( n.nodeType === 1 && n !== elem ) {
5779  r.push( n );
5780  }
5781  }
5782 
5783  return r;
5784  }
5785 });
5786 
5787 // Implement the identical functionality for filter and not
5788 function winnow( elements, qualifier, keep ) {
5789 
5790  // Can't pass null or undefined to indexOf in Firefox 4
5791  // Set to 0 to skip string check
5792  qualifier = qualifier || 0;
5793 
5794  if ( jQuery.isFunction( qualifier ) ) {
5795  return jQuery.grep(elements, function( elem, i ) {
5796  var retVal = !!qualifier.call( elem, i, elem );
5797  return retVal === keep;
5798  });
5799 
5800  } else if ( qualifier.nodeType ) {
5801  return jQuery.grep(elements, function( elem ) {
5802  return ( elem === qualifier ) === keep;
5803  });
5804 
5805  } else if ( typeof qualifier === "string" ) {
5806  var filtered = jQuery.grep(elements, function( elem ) {
5807  return elem.nodeType === 1;
5808  });
5809 
5810  if ( isSimple.test( qualifier ) ) {
5811  return jQuery.filter(qualifier, filtered, !keep);
5812  } else {
5813  qualifier = jQuery.filter( qualifier, filtered );
5814  }
5815  }
5816 
5817  return jQuery.grep(elements, function( elem ) {
5818  return ( jQuery.inArray( elem, qualifier ) >= 0 ) === keep;
5819  });
5820 }
5821 function createSafeFragment( document ) {
5822  var list = nodeNames.split( "|" ),
5823  safeFrag = document.createDocumentFragment();
5824 
5825  if ( safeFrag.createElement ) {
5826  while ( list.length ) {
5827  safeFrag.createElement(
5828  list.pop()
5829  );
5830  }
5831  }
5832  return safeFrag;
5833 }
5834 
5835 var nodeNames = "abbr|article|aside|audio|bdi|canvas|data|datalist|details|figcaption|figure|footer|" +
5836  "header|hgroup|mark|meter|nav|output|progress|section|summary|time|video",
5837  rinlinejQuery = / jQuery\d+="(?:null|\d+)"/g,
5838  rnoshimcache = new RegExp("<(?:" + nodeNames + ")[\\s/>]", "i"),
5839  rleadingWhitespace = /^\s+/,
5840  rxhtmlTag = /<(?!area|br|col|embed|hr|img|input|link|meta|param)(([\w:]+)[^>]*)\/>/gi,
5841  rtagName = /<([\w:]+)/,
5842  rtbody = /<tbody/i,
5843  rhtml = /<|&#?\w+;/,
5844  rnoInnerhtml = /<(?:script|style|link)/i,
5845  manipulation_rcheckableType = /^(?:checkbox|radio)$/i,
5846  // checked="checked" or checked
5847  rchecked = /checked\s*(?:[^=]|=\s*.checked.)/i,
5848  rscriptType = /^$|\/(?:java|ecma)script/i,
5849  rscriptTypeMasked = /^true\/(.*)/,
5850  rcleanScript = /^\s*<!(?:\[CDATA\[|--)|(?:\]\]|--)>\s*$/g,
5851 
5852  // We have to close these tags to support XHTML (#13200)
5853  wrapMap = {
5854  option: [ 1, "<select multiple='multiple'>", "</select>" ],
5855  legend: [ 1, "<fieldset>", "</fieldset>" ],
5856  area: [ 1, "<map>", "</map>" ],
5857  param: [ 1, "<object>", "</object>" ],
5858  thead: [ 1, "<table>", "</table>" ],
5859  tr: [ 2, "<table><tbody>", "</tbody></table>" ],
5860  col: [ 2, "<table><tbody></tbody><colgroup>", "</colgroup></table>" ],
5861  td: [ 3, "<table><tbody><tr>", "</tr></tbody></table>" ],
5862 
5863  // IE6-8 can't serialize link, script, style, or any html5 (NoScope) tags,
5864  // unless wrapped in a div with non-breaking characters in front of it.
5865  _default: jQuery.support.htmlSerialize ? [ 0, "", "" ] : [ 1, "X<div>", "</div>" ]
5866  },
5867  safeFragment = createSafeFragment( document ),
5868  fragmentDiv = safeFragment.appendChild( document.createElement("div") );
5869 
5870 wrapMap.optgroup = wrapMap.option;
5871 wrapMap.tbody = wrapMap.tfoot = wrapMap.colgroup = wrapMap.caption = wrapMap.thead;
5872 wrapMap.th = wrapMap.td;
5873 
5874 jQuery.fn.extend({
5875  text: function( value ) {
5876  return jQuery.access( this, function( value ) {
5877  return value === undefined ?
5878  jQuery.text( this ) :
5879  this.empty().append( ( this[0] && this[0].ownerDocument || document ).createTextNode( value ) );
5880  }, null, value, arguments.length );
5881  },
5882 
5883  wrapAll: function( html ) {
5884  if ( jQuery.isFunction( html ) ) {
5885  return this.each(function(i) {
5886  jQuery(this).wrapAll( html.call(this, i) );
5887  });
5888  }
5889 
5890  if ( this[0] ) {
5891  // The elements to wrap the target around
5892  var wrap = jQuery( html, this[0].ownerDocument ).eq(0).clone(true);
5893 
5894  if ( this[0].parentNode ) {
5895  wrap.insertBefore( this[0] );
5896  }
5897 
5898  wrap.map(function() {
5899  var elem = this;
5900 
5901  while ( elem.firstChild && elem.firstChild.nodeType === 1 ) {
5902  elem = elem.firstChild;
5903  }
5904 
5905  return elem;
5906  }).append( this );
5907  }
5908 
5909  return this;
5910  },
5911 
5912  wrapInner: function( html ) {
5913  if ( jQuery.isFunction( html ) ) {
5914  return this.each(function(i) {
5915  jQuery(this).wrapInner( html.call(this, i) );
5916  });
5917  }
5918 
5919  return this.each(function() {
5920  var self = jQuery( this ),
5921  contents = self.contents();
5922 
5923  if ( contents.length ) {
5924  contents.wrapAll( html );
5925 
5926  } else {
5927  self.append( html );
5928  }
5929  });
5930  },
5931 
5932  wrap: function( html ) {
5933  var isFunction = jQuery.isFunction( html );
5934 
5935  return this.each(function(i) {
5936  jQuery( this ).wrapAll( isFunction ? html.call(this, i) : html );
5937  });
5938  },
5939 
5940  unwrap: function() {
5941  return this.parent().each(function() {
5942  if ( !jQuery.nodeName( this, "body" ) ) {
5943  jQuery( this ).replaceWith( this.childNodes );
5944  }
5945  }).end();
5946  },
5947 
5948  append: function() {
5949  return this.domManip(arguments, true, function( elem ) {
5950  if ( this.nodeType === 1 || this.nodeType === 11 || this.nodeType === 9 ) {
5951  this.appendChild( elem );
5952  }
5953  });
5954  },
5955 
5956  prepend: function() {
5957  return this.domManip(arguments, true, function( elem ) {
5958  if ( this.nodeType === 1 || this.nodeType === 11 || this.nodeType === 9 ) {
5959  this.insertBefore( elem, this.firstChild );
5960  }
5961  });
5962  },
5963 
5964  before: function() {
5965  return this.domManip( arguments, false, function( elem ) {
5966  if ( this.parentNode ) {
5967  this.parentNode.insertBefore( elem, this );
5968  }
5969  });
5970  },
5971 
5972  after: function() {
5973  return this.domManip( arguments, false, function( elem ) {
5974  if ( this.parentNode ) {
5975  this.parentNode.insertBefore( elem, this.nextSibling );
5976  }
5977  });
5978  },
5979 
5980  // keepData is for internal use only--do not document
5981  remove: function( selector, keepData ) {
5982  var elem,
5983  i = 0;
5984 
5985  for ( ; (elem = this[i]) != null; i++ ) {
5986  if ( !selector || jQuery.filter( selector, [ elem ] ).length > 0 ) {
5987  if ( !keepData && elem.nodeType === 1 ) {
5988  jQuery.cleanData( getAll( elem ) );
5989  }
5990 
5991  if ( elem.parentNode ) {
5992  if ( keepData && jQuery.contains( elem.ownerDocument, elem ) ) {
5993  setGlobalEval( getAll( elem, "script" ) );
5994  }
5995  elem.parentNode.removeChild( elem );
5996  }
5997  }
5998  }
5999 
6000  return this;
6001  },
6002 
6003  empty: function() {
6004  var elem,
6005  i = 0;
6006 
6007  for ( ; (elem = this[i]) != null; i++ ) {
6008  // Remove element nodes and prevent memory leaks
6009  if ( elem.nodeType === 1 ) {
6010  jQuery.cleanData( getAll( elem, false ) );
6011  }
6012 
6013  // Remove any remaining nodes
6014  while ( elem.firstChild ) {
6015  elem.removeChild( elem.firstChild );
6016  }
6017 
6018  // If this is a select, ensure that it displays empty (#12336)
6019  // Support: IE<9
6020  if ( elem.options && jQuery.nodeName( elem, "select" ) ) {
6021  elem.options.length = 0;
6022  }
6023  }
6024 
6025  return this;
6026  },
6027 
6028  clone: function( dataAndEvents, deepDataAndEvents ) {
6029  dataAndEvents = dataAndEvents == null ? false : dataAndEvents;
6030  deepDataAndEvents = deepDataAndEvents == null ? dataAndEvents : deepDataAndEvents;
6031 
6032  return this.map( function () {
6033  return jQuery.clone( this, dataAndEvents, deepDataAndEvents );
6034  });
6035  },
6036 
6037  html: function( value ) {
6038  return jQuery.access( this, function( value ) {
6039  var elem = this[0] || {},
6040  i = 0,
6041  l = this.length;
6042 
6043  if ( value === undefined ) {
6044  return elem.nodeType === 1 ?
6045  elem.innerHTML.replace( rinlinejQuery, "" ) :
6046  undefined;
6047  }
6048 
6049  // See if we can take a shortcut and just use innerHTML
6050  if ( typeof value === "string" && !rnoInnerhtml.test( value ) &&
6051  ( jQuery.support.htmlSerialize || !rnoshimcache.test( value ) ) &&
6052  ( jQuery.support.leadingWhitespace || !rleadingWhitespace.test( value ) ) &&
6053  !wrapMap[ ( rtagName.exec( value ) || ["", ""] )[1].toLowerCase() ] ) {
6054 
6055  value = value.replace( rxhtmlTag, "<$1></$2>" );
6056 
6057  try {
6058  for (; i < l; i++ ) {
6059  // Remove element nodes and prevent memory leaks
6060  elem = this[i] || {};
6061  if ( elem.nodeType === 1 ) {
6062  jQuery.cleanData( getAll( elem, false ) );
6063  elem.innerHTML = value;
6064  }
6065  }
6066 
6067  elem = 0;
6068 
6069  // If using innerHTML throws an exception, use the fallback method
6070  } catch(e) {}
6071  }
6072 
6073  if ( elem ) {
6074  this.empty().append( value );
6075  }
6076  }, null, value, arguments.length );
6077  },
6078 
6079  replaceWith: function( value ) {
6080  var isFunc = jQuery.isFunction( value );
6081 
6082  // Make sure that the elements are removed from the DOM before they are inserted
6083  // this can help fix replacing a parent with child elements
6084  if ( !isFunc && typeof value !== "string" ) {
6085  value = jQuery( value ).not( this ).detach();
6086  }
6087 
6088  return this.domManip( [ value ], true, function( elem ) {
6089  var next = this.nextSibling,
6090  parent = this.parentNode;
6091 
6092  if ( parent ) {
6093  jQuery( this ).remove();
6094  parent.insertBefore( elem, next );
6095  }
6096  });
6097  },
6098 
6099  detach: function( selector ) {
6100  return this.remove( selector, true );
6101  },
6102 
6103  domManip: function( args, table, callback ) {
6104 
6105  // Flatten any nested arrays
6106  args = core_concat.apply( [], args );
6107 
6108  var first, node, hasScripts,
6109  scripts, doc, fragment,
6110  i = 0,
6111  l = this.length,
6112  set = this,
6113  iNoClone = l - 1,
6114  value = args[0],
6115  isFunction = jQuery.isFunction( value );
6116 
6117  // We can't cloneNode fragments that contain checked, in WebKit
6118  if ( isFunction || !( l <= 1 || typeof value !== "string" || jQuery.support.checkClone || !rchecked.test( value ) ) ) {
6119  return this.each(function( index ) {
6120  var self = set.eq( index );
6121  if ( isFunction ) {
6122  args[0] = value.call( this, index, table ? self.html() : undefined );
6123  }
6124  self.domManip( args, table, callback );
6125  });
6126  }
6127 
6128  if ( l ) {
6129  fragment = jQuery.buildFragment( args, this[ 0 ].ownerDocument, false, this );
6130  first = fragment.firstChild;
6131 
6132  if ( fragment.childNodes.length === 1 ) {
6133  fragment = first;
6134  }
6135 
6136  if ( first ) {
6137  table = table && jQuery.nodeName( first, "tr" );
6138  scripts = jQuery.map( getAll( fragment, "script" ), disableScript );
6139  hasScripts = scripts.length;
6140 
6141  // Use the original fragment for the last item instead of the first because it can end up
6142  // being emptied incorrectly in certain situations (#8070).
6143  for ( ; i < l; i++ ) {
6144  node = fragment;
6145 
6146  if ( i !== iNoClone ) {
6147  node = jQuery.clone( node, true, true );
6148 
6149  // Keep references to cloned scripts for later restoration
6150  if ( hasScripts ) {
6151  jQuery.merge( scripts, getAll( node, "script" ) );
6152  }
6153  }
6154 
6155  callback.call(
6156  table && jQuery.nodeName( this[i], "table" ) ?
6157  findOrAppend( this[i], "tbody" ) :
6158  this[i],
6159  node,
6160  i
6161  );
6162  }
6163 
6164  if ( hasScripts ) {
6165  doc = scripts[ scripts.length - 1 ].ownerDocument;
6166 
6167  // Reenable scripts
6168  jQuery.map( scripts, restoreScript );
6169 
6170  // Evaluate executable scripts on first document insertion
6171  for ( i = 0; i < hasScripts; i++ ) {
6172  node = scripts[ i ];
6173  if ( rscriptType.test( node.type || "" ) &&
6174  !jQuery._data( node, "globalEval" ) && jQuery.contains( doc, node ) ) {
6175 
6176  if ( node.src ) {
6177  // Hope ajax is available...
6178  jQuery.ajax({
6179  url: node.src,
6180  type: "GET",
6181  dataType: "script",
6182  async: false,
6183  global: false,
6184  "throws": true
6185  });
6186  } else {
6187  jQuery.globalEval( ( node.text || node.textContent || node.innerHTML || "" ).replace( rcleanScript, "" ) );
6188  }
6189  }
6190  }
6191  }
6192 
6193  // Fix #11809: Avoid leaking memory
6194  fragment = first = null;
6195  }
6196  }
6197 
6198  return this;
6199  }
6200 });
6201 
6202 function findOrAppend( elem, tag ) {
6203  return elem.getElementsByTagName( tag )[0] || elem.appendChild( elem.ownerDocument.createElement( tag ) );
6204 }
6205 
6206 // Replace/restore the type attribute of script elements for safe DOM manipulation
6207 function disableScript( elem ) {
6208  var attr = elem.getAttributeNode("type");
6209  elem.type = ( attr && attr.specified ) + "/" + elem.type;
6210  return elem;
6211 }
6212 function restoreScript( elem ) {
6213  var match = rscriptTypeMasked.exec( elem.type );
6214  if ( match ) {
6215  elem.type = match[1];
6216  } else {
6217  elem.removeAttribute("type");
6218  }
6219  return elem;
6220 }
6221 
6222 // Mark scripts as having already been evaluated
6223 function setGlobalEval( elems, refElements ) {
6224  var elem,
6225  i = 0;
6226  for ( ; (elem = elems[i]) != null; i++ ) {
6227  jQuery._data( elem, "globalEval", !refElements || jQuery._data( refElements[i], "globalEval" ) );
6228  }
6229 }
6230 
6231 function cloneCopyEvent( src, dest ) {
6232 
6233  if ( dest.nodeType !== 1 || !jQuery.hasData( src ) ) {
6234  return;
6235  }
6236 
6237  var type, i, l,
6238  oldData = jQuery._data( src ),
6239  curData = jQuery._data( dest, oldData ),
6240  events = oldData.events;
6241 
6242  if ( events ) {
6243  delete curData.handle;
6244  curData.events = {};
6245 
6246  for ( type in events ) {
6247  for ( i = 0, l = events[ type ].length; i < l; i++ ) {
6248  jQuery.event.add( dest, type, events[ type ][ i ] );
6249  }
6250  }
6251  }
6252 
6253  // make the cloned public data object a copy from the original
6254  if ( curData.data ) {
6255  curData.data = jQuery.extend( {}, curData.data );
6256  }
6257 }
6258 
6259 function fixCloneNodeIssues( src, dest ) {
6260  var nodeName, e, data;
6261 
6262  // We do not need to do anything for non-Elements
6263  if ( dest.nodeType !== 1 ) {
6264  return;
6265  }
6266 
6267  nodeName = dest.nodeName.toLowerCase();
6268 
6269  // IE6-8 copies events bound via attachEvent when using cloneNode.
6270  if ( !jQuery.support.noCloneEvent && dest[ jQuery.expando ] ) {
6271  data = jQuery._data( dest );
6272 
6273  for ( e in data.events ) {
6274  jQuery.removeEvent( dest, e, data.handle );
6275  }
6276 
6277  // Event data gets referenced instead of copied if the expando gets copied too
6278  dest.removeAttribute( jQuery.expando );
6279  }
6280 
6281  // IE blanks contents when cloning scripts, and tries to evaluate newly-set text
6282  if ( nodeName === "script" && dest.text !== src.text ) {
6283  disableScript( dest ).text = src.text;
6284  restoreScript( dest );
6285 
6286  // IE6-10 improperly clones children of object elements using classid.
6287  // IE10 throws NoModificationAllowedError if parent is null, #12132.
6288  } else if ( nodeName === "object" ) {
6289  if ( dest.parentNode ) {
6290  dest.outerHTML = src.outerHTML;
6291  }
6292 
6293  // This path appears unavoidable for IE9. When cloning an object
6294  // element in IE9, the outerHTML strategy above is not sufficient.
6295  // If the src has innerHTML and the destination does not,
6296  // copy the src.innerHTML into the dest.innerHTML. #10324
6297  if ( jQuery.support.html5Clone && ( src.innerHTML && !jQuery.trim(dest.innerHTML) ) ) {
6298  dest.innerHTML = src.innerHTML;
6299  }
6300 
6301  } else if ( nodeName === "input" && manipulation_rcheckableType.test( src.type ) ) {
6302  // IE6-8 fails to persist the checked state of a cloned checkbox
6303  // or radio button. Worse, IE6-7 fail to give the cloned element
6304  // a checked appearance if the defaultChecked value isn't also set
6305 
6306  dest.defaultChecked = dest.checked = src.checked;
6307 
6308  // IE6-7 get confused and end up setting the value of a cloned
6309  // checkbox/radio button to an empty string instead of "on"
6310  if ( dest.value !== src.value ) {
6311  dest.value = src.value;
6312  }
6313 
6314  // IE6-8 fails to return the selected option to the default selected
6315  // state when cloning options
6316  } else if ( nodeName === "option" ) {
6317  dest.defaultSelected = dest.selected = src.defaultSelected;
6318 
6319  // IE6-8 fails to set the defaultValue to the correct value when
6320  // cloning other types of input fields
6321  } else if ( nodeName === "input" || nodeName === "textarea" ) {
6322  dest.defaultValue = src.defaultValue;
6323  }
6324 }
6325 
6326 jQuery.each({
6327  appendTo: "append",
6328  prependTo: "prepend",
6329  insertBefore: "before",
6330  insertAfter: "after",
6331  replaceAll: "replaceWith"
6332 }, function( name, original ) {
6333  jQuery.fn[ name ] = function( selector ) {
6334  var elems,
6335  i = 0,
6336  ret = [],
6337  insert = jQuery( selector ),
6338  last = insert.length - 1;
6339 
6340  for ( ; i <= last; i++ ) {
6341  elems = i === last ? this : this.clone(true);
6342  jQuery( insert[i] )[ original ]( elems );
6343 
6344  // Modern browsers can apply jQuery collections as arrays, but oldIE needs a .get()
6345  core_push.apply( ret, elems.get() );
6346  }
6347 
6348  return this.pushStack( ret );
6349  };
6350 });
6351 
6352 function getAll( context, tag ) {
6353  var elems, elem,
6354  i = 0,
6355  found = typeof context.getElementsByTagName !== core_strundefined ? context.getElementsByTagName( tag || "*" ) :
6356  typeof context.querySelectorAll !== core_strundefined ? context.querySelectorAll( tag || "*" ) :
6357  undefined;
6358 
6359  if ( !found ) {
6360  for ( found = [], elems = context.childNodes || context; (elem = elems[i]) != null; i++ ) {
6361  if ( !tag || jQuery.nodeName( elem, tag ) ) {
6362  found.push( elem );
6363  } else {
6364  jQuery.merge( found, getAll( elem, tag ) );
6365  }
6366  }
6367  }
6368 
6369  return tag === undefined || tag && jQuery.nodeName( context, tag ) ?
6370  jQuery.merge( [ context ], found ) :
6371  found;
6372 }
6373 
6374 // Used in buildFragment, fixes the defaultChecked property
6375 function fixDefaultChecked( elem ) {
6376  if ( manipulation_rcheckableType.test( elem.type ) ) {
6377  elem.defaultChecked = elem.checked;
6378  }
6379 }
6380 
6381 jQuery.extend({
6382  clone: function( elem, dataAndEvents, deepDataAndEvents ) {
6383  var destElements, node, clone, i, srcElements,
6384  inPage = jQuery.contains( elem.ownerDocument, elem );
6385 
6386  if ( jQuery.support.html5Clone || jQuery.isXMLDoc(elem) || !rnoshimcache.test( "<" + elem.nodeName + ">" ) ) {
6387  clone = elem.cloneNode( true );
6388 
6389  // IE<=8 does not properly clone detached, unknown element nodes
6390  } else {
6391  fragmentDiv.innerHTML = elem.outerHTML;
6392  fragmentDiv.removeChild( clone = fragmentDiv.firstChild );
6393  }
6394 
6395  if ( (!jQuery.support.noCloneEvent || !jQuery.support.noCloneChecked) &&
6396  (elem.nodeType === 1 || elem.nodeType === 11) && !jQuery.isXMLDoc(elem) ) {
6397 
6398  // We eschew Sizzle here for performance reasons: http://jsperf.com/getall-vs-sizzle/2
6399  destElements = getAll( clone );
6400  srcElements = getAll( elem );
6401 
6402  // Fix all IE cloning issues
6403  for ( i = 0; (node = srcElements[i]) != null; ++i ) {
6404  // Ensure that the destination node is not null; Fixes #9587
6405  if ( destElements[i] ) {
6406  fixCloneNodeIssues( node, destElements[i] );
6407  }
6408  }
6409  }
6410 
6411  // Copy the events from the original to the clone
6412  if ( dataAndEvents ) {
6413  if ( deepDataAndEvents ) {
6414  srcElements = srcElements || getAll( elem );
6415  destElements = destElements || getAll( clone );
6416 
6417  for ( i = 0; (node = srcElements[i]) != null; i++ ) {
6418  cloneCopyEvent( node, destElements[i] );
6419  }
6420  } else {
6421  cloneCopyEvent( elem, clone );
6422  }
6423  }
6424 
6425  // Preserve script evaluation history
6426  destElements = getAll( clone, "script" );
6427  if ( destElements.length > 0 ) {
6428  setGlobalEval( destElements, !inPage && getAll( elem, "script" ) );
6429  }
6430 
6431  destElements = srcElements = node = null;
6432 
6433  // Return the cloned set
6434  return clone;
6435  },
6436 
6437  buildFragment: function( elems, context, scripts, selection ) {
6438  var j, elem, contains,
6439  tmp, tag, tbody, wrap,
6440  l = elems.length,
6441 
6442  // Ensure a safe fragment
6443  safe = createSafeFragment( context ),
6444 
6445  nodes = [],
6446  i = 0;
6447 
6448  for ( ; i < l; i++ ) {
6449  elem = elems[ i ];
6450 
6451  if ( elem || elem === 0 ) {
6452 
6453  // Add nodes directly
6454  if ( jQuery.type( elem ) === "object" ) {
6455  jQuery.merge( nodes, elem.nodeType ? [ elem ] : elem );
6456 
6457  // Convert non-html into a text node
6458  } else if ( !rhtml.test( elem ) ) {
6459  nodes.push( context.createTextNode( elem ) );
6460 
6461  // Convert html into DOM nodes
6462  } else {
6463  tmp = tmp || safe.appendChild( context.createElement("div") );
6464 
6465  // Deserialize a standard representation
6466  tag = ( rtagName.exec( elem ) || ["", ""] )[1].toLowerCase();
6467  wrap = wrapMap[ tag ] || wrapMap._default;
6468 
6469  tmp.innerHTML = wrap[1] + elem.replace( rxhtmlTag, "<$1></$2>" ) + wrap[2];
6470 
6471  // Descend through wrappers to the right content
6472  j = wrap[0];
6473  while ( j-- ) {
6474  tmp = tmp.lastChild;
6475  }
6476 
6477  // Manually add leading whitespace removed by IE
6478  if ( !jQuery.support.leadingWhitespace && rleadingWhitespace.test( elem ) ) {
6479  nodes.push( context.createTextNode( rleadingWhitespace.exec( elem )[0] ) );
6480  }
6481 
6482  // Remove IE's autoinserted <tbody> from table fragments
6483  if ( !jQuery.support.tbody ) {
6484 
6485  // String was a <table>, *may* have spurious <tbody>
6486  elem = tag === "table" && !rtbody.test( elem ) ?
6487  tmp.firstChild :
6488 
6489  // String was a bare <thead> or <tfoot>
6490  wrap[1] === "<table>" && !rtbody.test( elem ) ?
6491  tmp :
6492  0;
6493 
6494  j = elem && elem.childNodes.length;
6495  while ( j-- ) {
6496  if ( jQuery.nodeName( (tbody = elem.childNodes[j]), "tbody" ) && !tbody.childNodes.length ) {
6497  elem.removeChild( tbody );
6498  }
6499  }
6500  }
6501 
6502  jQuery.merge( nodes, tmp.childNodes );
6503 
6504  // Fix #12392 for WebKit and IE > 9
6505  tmp.textContent = "";
6506 
6507  // Fix #12392 for oldIE
6508  while ( tmp.firstChild ) {
6509  tmp.removeChild( tmp.firstChild );
6510  }
6511 
6512  // Remember the top-level container for proper cleanup
6513  tmp = safe.lastChild;
6514  }
6515  }
6516  }
6517 
6518  // Fix #11356: Clear elements from fragment
6519  if ( tmp ) {
6520  safe.removeChild( tmp );
6521  }
6522 
6523  // Reset defaultChecked for any radios and checkboxes
6524  // about to be appended to the DOM in IE 6/7 (#8060)
6525  if ( !jQuery.support.appendChecked ) {
6526  jQuery.grep( getAll( nodes, "input" ), fixDefaultChecked );
6527  }
6528 
6529  i = 0;
6530  while ( (elem = nodes[ i++ ]) ) {
6531 
6532  // #4087 - If origin and destination elements are the same, and this is
6533  // that element, do not do anything
6534  if ( selection && jQuery.inArray( elem, selection ) !== -1 ) {
6535  continue;
6536  }
6537 
6538  contains = jQuery.contains( elem.ownerDocument, elem );
6539 
6540  // Append to fragment
6541  tmp = getAll( safe.appendChild( elem ), "script" );
6542 
6543  // Preserve script evaluation history
6544  if ( contains ) {
6545  setGlobalEval( tmp );
6546  }
6547 
6548  // Capture executables
6549  if ( scripts ) {
6550  j = 0;
6551  while ( (elem = tmp[ j++ ]) ) {
6552  if ( rscriptType.test( elem.type || "" ) ) {
6553  scripts.push( elem );
6554  }
6555  }
6556  }
6557  }
6558 
6559  tmp = null;
6560 
6561  return safe;
6562  },
6563 
6564  cleanData: function( elems, /* internal */ acceptData ) {
6565  var elem, type, id, data,
6566  i = 0,
6567  internalKey = jQuery.expando,
6568  cache = jQuery.cache,
6569  deleteExpando = jQuery.support.deleteExpando,
6570  special = jQuery.event.special;
6571 
6572  for ( ; (elem = elems[i]) != null; i++ ) {
6573 
6574  if ( acceptData || jQuery.acceptData( elem ) ) {
6575 
6576  id = elem[ internalKey ];
6577  data = id && cache[ id ];
6578 
6579  if ( data ) {
6580  if ( data.events ) {
6581  for ( type in data.events ) {
6582  if ( special[ type ] ) {
6583  jQuery.event.remove( elem, type );
6584 
6585  // This is a shortcut to avoid jQuery.event.remove's overhead
6586  } else {
6587  jQuery.removeEvent( elem, type, data.handle );
6588  }
6589  }
6590  }
6591 
6592  // Remove cache only if it was not already removed by jQuery.event.remove
6593  if ( cache[ id ] ) {
6594 
6595  delete cache[ id ];
6596 
6597  // IE does not allow us to delete expando properties from nodes,
6598  // nor does it have a removeAttribute function on Document nodes;
6599  // we must handle all of these cases
6600  if ( deleteExpando ) {
6601  delete elem[ internalKey ];
6602 
6603  } else if ( typeof elem.removeAttribute !== core_strundefined ) {
6604  elem.removeAttribute( internalKey );
6605 
6606  } else {
6607  elem[ internalKey ] = null;
6608  }
6609 
6610  core_deletedIds.push( id );
6611  }
6612  }
6613  }
6614  }
6615  }
6616 });
6617 var iframe, getStyles, curCSS,
6618  ralpha = /alpha\([^)]*\)/i,
6619  ropacity = /opacity\s*=\s*([^)]*)/,
6620  rposition = /^(top|right|bottom|left)$/,
6621  // swappable if display is none or starts with table except "table", "table-cell", or "table-caption"
6622  // see here for display values: https://developer.mozilla.org/en-US/docs/CSS/display
6623  rdisplayswap = /^(none|table(?!-c[ea]).+)/,
6624  rmargin = /^margin/,
6625  rnumsplit = new RegExp( "^(" + core_pnum + ")(.*)$", "i" ),
6626  rnumnonpx = new RegExp( "^(" + core_pnum + ")(?!px)[a-z%]+$", "i" ),
6627  rrelNum = new RegExp( "^([+-])=(" + core_pnum + ")", "i" ),
6628  elemdisplay = { BODY: "block" },
6629 
6630  cssShow = { position: "absolute", visibility: "hidden", display: "block" },
6631  cssNormalTransform = {
6632  letterSpacing: 0,
6633  fontWeight: 400
6634  },
6635 
6636  cssExpand = [ "Top", "Right", "Bottom", "Left" ],
6637  cssPrefixes = [ "Webkit", "O", "Moz", "ms" ];
6638 
6639 // return a css property mapped to a potentially vendor prefixed property
6640 function vendorPropName( style, name ) {
6641 
6642  // shortcut for names that are not vendor prefixed
6643  if ( name in style ) {
6644  return name;
6645  }
6646 
6647  // check for vendor prefixed names
6648  var capName = name.charAt(0).toUpperCase() + name.slice(1),
6649  origName = name,
6650  i = cssPrefixes.length;
6651 
6652  while ( i-- ) {
6653  name = cssPrefixes[ i ] + capName;
6654  if ( name in style ) {
6655  return name;
6656  }
6657  }
6658 
6659  return origName;
6660 }
6661 
6662 function isHidden( elem, el ) {
6663  // isHidden might be called from jQuery#filter function;
6664  // in that case, element will be second argument
6665  elem = el || elem;
6666  return jQuery.css( elem, "display" ) === "none" || !jQuery.contains( elem.ownerDocument, elem );
6667 }
6668 
6669 function showHide( elements, show ) {
6670  var display, elem, hidden,
6671  values = [],
6672  index = 0,
6673  length = elements.length;
6674 
6675  for ( ; index < length; index++ ) {
6676  elem = elements[ index ];
6677  if ( !elem.style ) {
6678  continue;
6679  }
6680 
6681  values[ index ] = jQuery._data( elem, "olddisplay" );
6682  display = elem.style.display;
6683  if ( show ) {
6684  // Reset the inline display of this element to learn if it is
6685  // being hidden by cascaded rules or not
6686  if ( !values[ index ] && display === "none" ) {
6687  elem.style.display = "";
6688  }
6689 
6690  // Set elements which have been overridden with display: none
6691  // in a stylesheet to whatever the default browser style is
6692  // for such an element
6693  if ( elem.style.display === "" && isHidden( elem ) ) {
6694  values[ index ] = jQuery._data( elem, "olddisplay", css_defaultDisplay(elem.nodeName) );
6695  }
6696  } else {
6697 
6698  if ( !values[ index ] ) {
6699  hidden = isHidden( elem );
6700 
6701  if ( display && display !== "none" || !hidden ) {
6702  jQuery._data( elem, "olddisplay", hidden ? display : jQuery.css( elem, "display" ) );
6703  }
6704  }
6705  }
6706  }
6707 
6708  // Set the display of most of the elements in a second loop
6709  // to avoid the constant reflow
6710  for ( index = 0; index < length; index++ ) {
6711  elem = elements[ index ];
6712  if ( !elem.style ) {
6713  continue;
6714  }
6715  if ( !show || elem.style.display === "none" || elem.style.display === "" ) {
6716  elem.style.display = show ? values[ index ] || "" : "none";
6717  }
6718  }
6719 
6720  return elements;
6721 }
6722 
6723 jQuery.fn.extend({
6724  css: function( name, value ) {
6725  return jQuery.access( this, function( elem, name, value ) {
6726  var len, styles,
6727  map = {},
6728  i = 0;
6729 
6730  if ( jQuery.isArray( name ) ) {
6731  styles = getStyles( elem );
6732  len = name.length;
6733 
6734  for ( ; i < len; i++ ) {
6735  map[ name[ i ] ] = jQuery.css( elem, name[ i ], false, styles );
6736  }
6737 
6738  return map;
6739  }
6740 
6741  return value !== undefined ?
6742  jQuery.style( elem, name, value ) :
6743  jQuery.css( elem, name );
6744  }, name, value, arguments.length > 1 );
6745  },
6746  show: function() {
6747  return showHide( this, true );
6748  },
6749  hide: function() {
6750  return showHide( this );
6751  },
6752  toggle: function( state ) {
6753  var bool = typeof state === "boolean";
6754 
6755  return this.each(function() {
6756  if ( bool ? state : isHidden( this ) ) {
6757  jQuery( this ).show();
6758  } else {
6759  jQuery( this ).hide();
6760  }
6761  });
6762  }
6763 });
6764 
6765 jQuery.extend({
6766  // Add in style property hooks for overriding the default
6767  // behavior of getting and setting a style property
6768  cssHooks: {
6769  opacity: {
6770  get: function( elem, computed ) {
6771  if ( computed ) {
6772  // We should always get a number back from opacity
6773  var ret = curCSS( elem, "opacity" );
6774  return ret === "" ? "1" : ret;
6775  }
6776  }
6777  }
6778  },
6779 
6780  // Exclude the following css properties to add px
6781  cssNumber: {
6782  "columnCount": true,
6783  "fillOpacity": true,
6784  "fontWeight": true,
6785  "lineHeight": true,
6786  "opacity": true,
6787  "orphans": true,
6788  "widows": true,
6789  "zIndex": true,
6790  "zoom": true
6791  },
6792 
6793  // Add in properties whose names you wish to fix before
6794  // setting or getting the value
6795  cssProps: {
6796  // normalize float css property
6797  "float": jQuery.support.cssFloat ? "cssFloat" : "styleFloat"
6798  },
6799 
6800  // Get and set the style property on a DOM Node
6801  style: function( elem, name, value, extra ) {
6802  // Don't set styles on text and comment nodes
6803  if ( !elem || elem.nodeType === 3 || elem.nodeType === 8 || !elem.style ) {
6804  return;
6805  }
6806 
6807  // Make sure that we're working with the right name
6808  var ret, type, hooks,
6809  origName = jQuery.camelCase( name ),
6810  style = elem.style;
6811 
6812  name = jQuery.cssProps[ origName ] || ( jQuery.cssProps[ origName ] = vendorPropName( style, origName ) );
6813 
6814  // gets hook for the prefixed version
6815  // followed by the unprefixed version
6816  hooks = jQuery.cssHooks[ name ] || jQuery.cssHooks[ origName ];
6817 
6818  // Check if we're setting a value
6819  if ( value !== undefined ) {
6820  type = typeof value;
6821 
6822  // convert relative number strings (+= or -=) to relative numbers. #7345
6823  if ( type === "string" && (ret = rrelNum.exec( value )) ) {
6824  value = ( ret[1] + 1 ) * ret[2] + parseFloat( jQuery.css( elem, name ) );
6825  // Fixes bug #9237
6826  type = "number";
6827  }
6828 
6829  // Make sure that NaN and null values aren't set. See: #7116
6830  if ( value == null || type === "number" && isNaN( value ) ) {
6831  return;
6832  }
6833 
6834  // If a number was passed in, add 'px' to the (except for certain CSS properties)
6835  if ( type === "number" && !jQuery.cssNumber[ origName ] ) {
6836  value += "px";
6837  }
6838 
6839  // Fixes #8908, it can be done more correctly by specifing setters in cssHooks,
6840  // but it would mean to define eight (for every problematic property) identical functions
6841  if ( !jQuery.support.clearCloneStyle && value === "" && name.indexOf("background") === 0 ) {
6842  style[ name ] = "inherit";
6843  }
6844 
6845  // If a hook was provided, use that value, otherwise just set the specified value
6846  if ( !hooks || !("set" in hooks) || (value = hooks.set( elem, value, extra )) !== undefined ) {
6847 
6848  // Wrapped to prevent IE from throwing errors when 'invalid' values are provided
6849  // Fixes bug #5509
6850  try {
6851  style[ name ] = value;
6852  } catch(e) {}
6853  }
6854 
6855  } else {
6856  // If a hook was provided get the non-computed value from there
6857  if ( hooks && "get" in hooks && (ret = hooks.get( elem, false, extra )) !== undefined ) {
6858  return ret;
6859  }
6860 
6861  // Otherwise just get the value from the style object
6862  return style[ name ];
6863  }
6864  },
6865 
6866  css: function( elem, name, extra, styles ) {
6867  var num, val, hooks,
6868  origName = jQuery.camelCase( name );
6869 
6870  // Make sure that we're working with the right name
6871  name = jQuery.cssProps[ origName ] || ( jQuery.cssProps[ origName ] = vendorPropName( elem.style, origName ) );
6872 
6873  // gets hook for the prefixed version
6874  // followed by the unprefixed version
6875  hooks = jQuery.cssHooks[ name ] || jQuery.cssHooks[ origName ];
6876 
6877  // If a hook was provided get the computed value from there
6878  if ( hooks && "get" in hooks ) {
6879  val = hooks.get( elem, true, extra );
6880  }
6881 
6882  // Otherwise, if a way to get the computed value exists, use that
6883  if ( val === undefined ) {
6884  val = curCSS( elem, name, styles );
6885  }
6886 
6887  //convert "normal" to computed value
6888  if ( val === "normal" && name in cssNormalTransform ) {
6889  val = cssNormalTransform[ name ];
6890  }
6891 
6892  // Return, converting to number if forced or a qualifier was provided and val looks numeric
6893  if ( extra === "" || extra ) {
6894  num = parseFloat( val );
6895  return extra === true || jQuery.isNumeric( num ) ? num || 0 : val;
6896  }
6897  return val;
6898  },
6899 
6900  // A method for quickly swapping in/out CSS properties to get correct calculations
6901  swap: function( elem, options, callback, args ) {
6902  var ret, name,
6903  old = {};
6904 
6905  // Remember the old values, and insert the new ones
6906  for ( name in options ) {
6907  old[ name ] = elem.style[ name ];
6908  elem.style[ name ] = options[ name ];
6909  }
6910 
6911  ret = callback.apply( elem, args || [] );
6912 
6913  // Revert the old values
6914  for ( name in options ) {
6915  elem.style[ name ] = old[ name ];
6916  }
6917 
6918  return ret;
6919  }
6920 });
6921 
6922 // NOTE: we've included the "window" in window.getComputedStyle
6923 // because jsdom on node.js will break without it.
6924 if ( window.getComputedStyle ) {
6925  getStyles = function( elem ) {
6926  return window.getComputedStyle( elem, null );
6927  };
6928 
6929  curCSS = function( elem, name, _computed ) {
6930  var width, minWidth, maxWidth,
6931  computed = _computed || getStyles( elem ),
6932 
6933  // getPropertyValue is only needed for .css('filter') in IE9, see #12537
6934  ret = computed ? computed.getPropertyValue( name ) || computed[ name ] : undefined,
6935  style = elem.style;
6936 
6937  if ( computed ) {
6938 
6939  if ( ret === "" && !jQuery.contains( elem.ownerDocument, elem ) ) {
6940  ret = jQuery.style( elem, name );
6941  }
6942 
6943  // A tribute to the "awesome hack by Dean Edwards"
6944  // Chrome < 17 and Safari 5.0 uses "computed value" instead of "used value" for margin-right
6945  // Safari 5.1.7 (at least) returns percentage for a larger set of values, but width seems to be reliably pixels
6946  // this is against the CSSOM draft spec: http://dev.w3.org/csswg/cssom/#resolved-values
6947  if ( rnumnonpx.test( ret ) && rmargin.test( name ) ) {
6948 
6949  // Remember the original values
6950  width = style.width;
6951  minWidth = style.minWidth;
6952  maxWidth = style.maxWidth;
6953 
6954  // Put in the new values to get a computed value out
6955  style.minWidth = style.maxWidth = style.width = ret;
6956  ret = computed.width;
6957 
6958  // Revert the changed values
6959  style.width = width;
6960  style.minWidth = minWidth;
6961  style.maxWidth = maxWidth;
6962  }
6963  }
6964 
6965  return ret;
6966  };
6967 } else if ( document.documentElement.currentStyle ) {
6968  getStyles = function( elem ) {
6969  return elem.currentStyle;
6970  };
6971 
6972  curCSS = function( elem, name, _computed ) {
6973  var left, rs, rsLeft,
6974  computed = _computed || getStyles( elem ),
6975  ret = computed ? computed[ name ] : undefined,
6976  style = elem.style;
6977 
6978  // Avoid setting ret to empty string here
6979  // so we don't default to auto
6980  if ( ret == null && style && style[ name ] ) {
6981  ret = style[ name ];
6982  }
6983 
6984  // From the awesome hack by Dean Edwards
6985  // http://erik.eae.net/archives/2007/07/27/18.54.15/#comment-102291
6986 
6987  // If we're not dealing with a regular pixel number
6988  // but a number that has a weird ending, we need to convert it to pixels
6989  // but not position css attributes, as those are proportional to the parent element instead
6990  // and we can't measure the parent instead because it might trigger a "stacking dolls" problem
6991  if ( rnumnonpx.test( ret ) && !rposition.test( name ) ) {
6992 
6993  // Remember the original values
6994  left = style.left;
6995  rs = elem.runtimeStyle;
6996  rsLeft = rs && rs.left;
6997 
6998  // Put in the new values to get a computed value out
6999  if ( rsLeft ) {
7000  rs.left = elem.currentStyle.left;
7001  }
7002  style.left = name === "fontSize" ? "1em" : ret;
7003  ret = style.pixelLeft + "px";
7004 
7005  // Revert the changed values
7006  style.left = left;
7007  if ( rsLeft ) {
7008  rs.left = rsLeft;
7009  }
7010  }
7011 
7012  return ret === "" ? "auto" : ret;
7013  };
7014 }
7015 
7016 function setPositiveNumber( elem, value, subtract ) {
7017  var matches = rnumsplit.exec( value );
7018  return matches ?
7019  // Guard against undefined "subtract", e.g., when used as in cssHooks
7020  Math.max( 0, matches[ 1 ] - ( subtract || 0 ) ) + ( matches[ 2 ] || "px" ) :
7021  value;
7022 }
7023 
7024 function augmentWidthOrHeight( elem, name, extra, isBorderBox, styles ) {
7025  var i = extra === ( isBorderBox ? "border" : "content" ) ?
7026  // If we already have the right measurement, avoid augmentation
7027  4 :
7028  // Otherwise initialize for horizontal or vertical properties
7029  name === "width" ? 1 : 0,
7030 
7031  val = 0;
7032 
7033  for ( ; i < 4; i += 2 ) {
7034  // both box models exclude margin, so add it if we want it
7035  if ( extra === "margin" ) {
7036  val += jQuery.css( elem, extra + cssExpand[ i ], true, styles );
7037  }
7038 
7039  if ( isBorderBox ) {
7040  // border-box includes padding, so remove it if we want content
7041  if ( extra === "content" ) {
7042  val -= jQuery.css( elem, "padding" + cssExpand[ i ], true, styles );
7043  }
7044 
7045  // at this point, extra isn't border nor margin, so remove border
7046  if ( extra !== "margin" ) {
7047  val -= jQuery.css( elem, "border" + cssExpand[ i ] + "Width", true, styles );
7048  }
7049  } else {
7050  // at this point, extra isn't content, so add padding
7051  val += jQuery.css( elem, "padding" + cssExpand[ i ], true, styles );
7052 
7053  // at this point, extra isn't content nor padding, so add border
7054  if ( extra !== "padding" ) {
7055  val += jQuery.css( elem, "border" + cssExpand[ i ] + "Width", true, styles );
7056  }
7057  }
7058  }
7059 
7060  return val;
7061 }
7062 
7063 function getWidthOrHeight( elem, name, extra ) {
7064 
7065  // Start with offset property, which is equivalent to the border-box value
7066  var valueIsBorderBox = true,
7067  val = name === "width" ? elem.offsetWidth : elem.offsetHeight,
7068  styles = getStyles( elem ),
7069  isBorderBox = jQuery.support.boxSizing && jQuery.css( elem, "boxSizing", false, styles ) === "border-box";
7070 
7071  // some non-html elements return undefined for offsetWidth, so check for null/undefined
7072  // svg - https://bugzilla.mozilla.org/show_bug.cgi?id=649285
7073  // MathML - https://bugzilla.mozilla.org/show_bug.cgi?id=491668
7074  if ( val <= 0 || val == null ) {
7075  // Fall back to computed then uncomputed css if necessary
7076  val = curCSS( elem, name, styles );
7077  if ( val < 0 || val == null ) {
7078  val = elem.style[ name ];
7079  }
7080 
7081  // Computed unit is not pixels. Stop here and return.
7082  if ( rnumnonpx.test(val) ) {
7083  return val;
7084  }
7085 
7086  // we need the check for style in case a browser which returns unreliable values
7087  // for getComputedStyle silently falls back to the reliable elem.style
7088  valueIsBorderBox = isBorderBox && ( jQuery.support.boxSizingReliable || val === elem.style[ name ] );
7089 
7090  // Normalize "", auto, and prepare for extra
7091  val = parseFloat( val ) || 0;
7092  }
7093 
7094  // use the active box-sizing model to add/subtract irrelevant styles
7095  return ( val +
7096  augmentWidthOrHeight(
7097  elem,
7098  name,
7099  extra || ( isBorderBox ? "border" : "content" ),
7100  valueIsBorderBox,
7101  styles
7102  )
7103  ) + "px";
7104 }
7105 
7106 // Try to determine the default display value of an element
7107 function css_defaultDisplay( nodeName ) {
7108  var doc = document,
7109  display = elemdisplay[ nodeName ];
7110 
7111  if ( !display ) {
7112  display = actualDisplay( nodeName, doc );
7113 
7114  // If the simple way fails, read from inside an iframe
7115  if ( display === "none" || !display ) {
7116  // Use the already-created iframe if possible
7117  iframe = ( iframe ||
7118  jQuery("<iframe frameborder='0' width='0' height='0'/>")
7119  .css( "cssText", "display:block !important" )
7120  ).appendTo( doc.documentElement );
7121 
7122  // Always write a new HTML skeleton so Webkit and Firefox don't choke on reuse
7123  doc = ( iframe[0].contentWindow || iframe[0].contentDocument ).document;
7124  doc.write("<!doctype html><html><body>");
7125  doc.close();
7126 
7127  display = actualDisplay( nodeName, doc );
7128  iframe.detach();
7129  }
7130 
7131  // Store the correct default display
7132  elemdisplay[ nodeName ] = display;
7133  }
7134 
7135  return display;
7136 }
7137 
7138 // Called ONLY from within css_defaultDisplay
7139 function actualDisplay( name, doc ) {
7140  var elem = jQuery( doc.createElement( name ) ).appendTo( doc.body ),
7141  display = jQuery.css( elem[0], "display" );
7142  elem.remove();
7143  return display;
7144 }
7145 
7146 jQuery.each([ "height", "width" ], function( i, name ) {
7147  jQuery.cssHooks[ name ] = {
7148  get: function( elem, computed, extra ) {
7149  if ( computed ) {
7150  // certain elements can have dimension info if we invisibly show them
7151  // however, it must have a current display style that would benefit from this
7152  return elem.offsetWidth === 0 && rdisplayswap.test( jQuery.css( elem, "display" ) ) ?
7153  jQuery.swap( elem, cssShow, function() {
7154  return getWidthOrHeight( elem, name, extra );
7155  }) :
7156  getWidthOrHeight( elem, name, extra );
7157  }
7158  },
7159 
7160  set: function( elem, value, extra ) {
7161  var styles = extra && getStyles( elem );
7162  return setPositiveNumber( elem, value, extra ?
7163  augmentWidthOrHeight(
7164  elem,
7165  name,
7166  extra,
7167  jQuery.support.boxSizing && jQuery.css( elem, "boxSizing", false, styles ) === "border-box",
7168  styles
7169  ) : 0
7170  );
7171  }
7172  };
7173 });
7174 
7175 if ( !jQuery.support.opacity ) {
7176  jQuery.cssHooks.opacity = {
7177  get: function( elem, computed ) {
7178  // IE uses filters for opacity
7179  return ropacity.test( (computed && elem.currentStyle ? elem.currentStyle.filter : elem.style.filter) || "" ) ?
7180  ( 0.01 * parseFloat( RegExp.$1 ) ) + "" :
7181  computed ? "1" : "";
7182  },
7183 
7184  set: function( elem, value ) {
7185  var style = elem.style,
7186  currentStyle = elem.currentStyle,
7187  opacity = jQuery.isNumeric( value ) ? "alpha(opacity=" + value * 100 + ")" : "",
7188  filter = currentStyle && currentStyle.filter || style.filter || "";
7189 
7190  // IE has trouble with opacity if it does not have layout
7191  // Force it by setting the zoom level
7192  style.zoom = 1;
7193 
7194  // if setting opacity to 1, and no other filters exist - attempt to remove filter attribute #6652
7195  // if value === "", then remove inline opacity #12685
7196  if ( ( value >= 1 || value === "" ) &&
7197  jQuery.trim( filter.replace( ralpha, "" ) ) === "" &&
7198  style.removeAttribute ) {
7199 
7200  // Setting style.filter to null, "" & " " still leave "filter:" in the cssText
7201  // if "filter:" is present at all, clearType is disabled, we want to avoid this
7202  // style.removeAttribute is IE Only, but so apparently is this code path...
7203  style.removeAttribute( "filter" );
7204 
7205  // if there is no filter style applied in a css rule or unset inline opacity, we are done
7206  if ( value === "" || currentStyle && !currentStyle.filter ) {
7207  return;
7208  }
7209  }
7210 
7211  // otherwise, set new filter values
7212  style.filter = ralpha.test( filter ) ?
7213  filter.replace( ralpha, opacity ) :
7214  filter + " " + opacity;
7215  }
7216  };
7217 }
7218 
7219 // These hooks cannot be added until DOM ready because the support test
7220 // for it is not run until after DOM ready
7221 jQuery(function() {
7222  if ( !jQuery.support.reliableMarginRight ) {
7223  jQuery.cssHooks.marginRight = {
7224  get: function( elem, computed ) {
7225  if ( computed ) {
7226  // WebKit Bug 13343 - getComputedStyle returns wrong value for margin-right
7227  // Work around by temporarily setting element display to inline-block
7228  return jQuery.swap( elem, { "display": "inline-block" },
7229  curCSS, [ elem, "marginRight" ] );
7230  }
7231  }
7232  };
7233  }
7234 
7235  // Webkit bug: https://bugs.webkit.org/show_bug.cgi?id=29084
7236  // getComputedStyle returns percent when specified for top/left/bottom/right
7237  // rather than make the css module depend on the offset module, we just check for it here
7238  if ( !jQuery.support.pixelPosition && jQuery.fn.position ) {
7239  jQuery.each( [ "top", "left" ], function( i, prop ) {
7240  jQuery.cssHooks[ prop ] = {
7241  get: function( elem, computed ) {
7242  if ( computed ) {
7243  computed = curCSS( elem, prop );
7244  // if curCSS returns percentage, fallback to offset
7245  return rnumnonpx.test( computed ) ?
7246  jQuery( elem ).position()[ prop ] + "px" :
7247  computed;
7248  }
7249  }
7250  };
7251  });
7252  }
7253 
7254 });
7255 
7256 if ( jQuery.expr && jQuery.expr.filters ) {
7257  jQuery.expr.filters.hidden = function( elem ) {
7258  // Support: Opera <= 12.12
7259  // Opera reports offsetWidths and offsetHeights less than zero on some elements
7260  return elem.offsetWidth <= 0 && elem.offsetHeight <= 0 ||
7261  (!jQuery.support.reliableHiddenOffsets && ((elem.style && elem.style.display) || jQuery.css( elem, "display" )) === "none");
7262  };
7263 
7264  jQuery.expr.filters.visible = function( elem ) {
7265  return !jQuery.expr.filters.hidden( elem );
7266  };
7267 }
7268 
7269 // These hooks are used by animate to expand properties
7270 jQuery.each({
7271  margin: "",
7272  padding: "",
7273  border: "Width"
7274 }, function( prefix, suffix ) {
7275  jQuery.cssHooks[ prefix + suffix ] = {
7276  expand: function( value ) {
7277  var i = 0,
7278  expanded = {},
7279 
7280  // assumes a single number if not a string
7281  parts = typeof value === "string" ? value.split(" ") : [ value ];
7282 
7283  for ( ; i < 4; i++ ) {
7284  expanded[ prefix + cssExpand[ i ] + suffix ] =
7285  parts[ i ] || parts[ i - 2 ] || parts[ 0 ];
7286  }
7287 
7288  return expanded;
7289  }
7290  };
7291 
7292  if ( !rmargin.test( prefix ) ) {
7293  jQuery.cssHooks[ prefix + suffix ].set = setPositiveNumber;
7294  }
7295 });
7296 var r20 = /%20/g,
7297  rbracket = /\[\]$/,
7298  rCRLF = /\r?\n/g,
7299  rsubmitterTypes = /^(?:submit|button|image|reset|file)$/i,
7300  rsubmittable = /^(?:input|select|textarea|keygen)/i;
7301 
7302 jQuery.fn.extend({
7303  serialize: function() {
7304  return jQuery.param( this.serializeArray() );
7305  },
7306  serializeArray: function() {
7307  return this.map(function(){
7308  // Can add propHook for "elements" to filter or add form elements
7309  var elements = jQuery.prop( this, "elements" );
7310  return elements ? jQuery.makeArray( elements ) : this;
7311  })
7312  .filter(function(){
7313  var type = this.type;
7314  // Use .is(":disabled") so that fieldset[disabled] works
7315  return this.name && !jQuery( this ).is( ":disabled" ) &&
7316  rsubmittable.test( this.nodeName ) && !rsubmitterTypes.test( type ) &&
7317  ( this.checked || !manipulation_rcheckableType.test( type ) );
7318  })
7319  .map(function( i, elem ){
7320  var val = jQuery( this ).val();
7321 
7322  return val == null ?
7323  null :
7324  jQuery.isArray( val ) ?
7325  jQuery.map( val, function( val ){
7326  return { name: elem.name, value: val.replace( rCRLF, "\r\n" ) };
7327  }) :
7328  { name: elem.name, value: val.replace( rCRLF, "\r\n" ) };
7329  }).get();
7330  }
7331 });
7332 
7333 //Serialize an array of form elements or a set of
7334 //key/values into a query string
7335 jQuery.param = function( a, traditional ) {
7336  var prefix,
7337  s = [],
7338  add = function( key, value ) {
7339  // If value is a function, invoke it and return its value
7340  value = jQuery.isFunction( value ) ? value() : ( value == null ? "" : value );
7341  s[ s.length ] = encodeURIComponent( key ) + "=" + encodeURIComponent( value );
7342  };
7343 
7344  // Set traditional to true for jQuery <= 1.3.2 behavior.
7345  if ( traditional === undefined ) {
7346  traditional = jQuery.ajaxSettings && jQuery.ajaxSettings.traditional;
7347  }
7348 
7349  // If an array was passed in, assume that it is an array of form elements.
7350  if ( jQuery.isArray( a ) || ( a.jquery && !jQuery.isPlainObject( a ) ) ) {
7351  // Serialize the form elements
7352  jQuery.each( a, function() {
7353  add( this.name, this.value );
7354  });
7355 
7356  } else {
7357  // If traditional, encode the "old" way (the way 1.3.2 or older
7358  // did it), otherwise encode params recursively.
7359  for ( prefix in a ) {
7360  buildParams( prefix, a[ prefix ], traditional, add );
7361  }
7362  }
7363 
7364  // Return the resulting serialization
7365  return s.join( "&" ).replace( r20, "+" );
7366 };
7367 
7368 function buildParams( prefix, obj, traditional, add ) {
7369  var name;
7370 
7371  if ( jQuery.isArray( obj ) ) {
7372  // Serialize array item.
7373  jQuery.each( obj, function( i, v ) {
7374  if ( traditional || rbracket.test( prefix ) ) {
7375  // Treat each array item as a scalar.
7376  add( prefix, v );
7377 
7378  } else {
7379  // Item is non-scalar (array or object), encode its numeric index.
7380  buildParams( prefix + "[" + ( typeof v === "object" ? i : "" ) + "]", v, traditional, add );
7381  }
7382  });
7383 
7384  } else if ( !traditional && jQuery.type( obj ) === "object" ) {
7385  // Serialize object item.
7386  for ( name in obj ) {
7387  buildParams( prefix + "[" + name + "]", obj[ name ], traditional, add );
7388  }
7389 
7390  } else {
7391  // Serialize scalar item.
7392  add( prefix, obj );
7393  }
7394 }
7395 jQuery.each( ("blur focus focusin focusout load resize scroll unload click dblclick " +
7396  "mousedown mouseup mousemove mouseover mouseout mouseenter mouseleave " +
7397  "change select submit keydown keypress keyup error contextmenu").split(" "), function( i, name ) {
7398 
7399  // Handle event binding
7400  jQuery.fn[ name ] = function( data, fn ) {
7401  return arguments.length > 0 ?
7402  this.on( name, null, data, fn ) :
7403  this.trigger( name );
7404  };
7405 });
7406 
7407 jQuery.fn.hover = function( fnOver, fnOut ) {
7408  return this.mouseenter( fnOver ).mouseleave( fnOut || fnOver );
7409 };
7410 var
7411  // Document location
7412  ajaxLocParts,
7413  ajaxLocation,
7414  ajax_nonce = jQuery.now(),
7415 
7416  ajax_rquery = /\?/,
7417  rhash = /#.*$/,
7418  rts = /([?&])_=[^&]*/,
7419  rheaders = /^(.*?):[ \t]*([^\r\n]*)\r?$/mg, // IE leaves an \r character at EOL
7420  // #7653, #8125, #8152: local protocol detection
7421  rlocalProtocol = /^(?:about|app|app-storage|.+-extension|file|res|widget):$/,
7422  rnoContent = /^(?:GET|HEAD)$/,
7423  rprotocol = /^\/\//,
7424  rurl = /^([\w.+-]+:)(?:\/\/([^\/?#:]*)(?::(\d+)|)|)/,
7425 
7426  // Keep a copy of the old load method
7427  _load = jQuery.fn.load,
7428 
7429  /* Prefilters
7430  * 1) They are useful to introduce custom dataTypes (see ajax/jsonp.js for an example)
7431  * 2) These are called:
7432  * - BEFORE asking for a transport
7433  * - AFTER param serialization (s.data is a string if s.processData is true)
7434  * 3) key is the dataType
7435  * 4) the catchall symbol "*" can be used
7436  * 5) execution will start with transport dataType and THEN continue down to "*" if needed
7437  */
7438  prefilters = {},
7439 
7440  /* Transports bindings
7441  * 1) key is the dataType
7442  * 2) the catchall symbol "*" can be used
7443  * 3) selection will start with transport dataType and THEN go to "*" if needed
7444  */
7445  transports = {},
7446 
7447  // Avoid comment-prolog char sequence (#10098); must appease lint and evade compression
7448  allTypes = "*/".concat("*");
7449 
7450 // #8138, IE may throw an exception when accessing
7451 // a field from window.location if document.domain has been set
7452 try {
7453  ajaxLocation = location.href;
7454 } catch( e ) {
7455  // Use the href attribute of an A element
7456  // since IE will modify it given document.location
7457  ajaxLocation = document.createElement( "a" );
7458  ajaxLocation.href = "";
7459  ajaxLocation = ajaxLocation.href;
7460 }
7461 
7462 // Segment location into parts
7463 ajaxLocParts = rurl.exec( ajaxLocation.toLowerCase() ) || [];
7464 
7465 // Base "constructor" for jQuery.ajaxPrefilter and jQuery.ajaxTransport
7466 function addToPrefiltersOrTransports( structure ) {
7467 
7468  // dataTypeExpression is optional and defaults to "*"
7469  return function( dataTypeExpression, func ) {
7470 
7471  if ( typeof dataTypeExpression !== "string" ) {
7472  func = dataTypeExpression;
7473  dataTypeExpression = "*";
7474  }
7475 
7476  var dataType,
7477  i = 0,
7478  dataTypes = dataTypeExpression.toLowerCase().match( core_rnotwhite ) || [];
7479 
7480  if ( jQuery.isFunction( func ) ) {
7481  // For each dataType in the dataTypeExpression
7482  while ( (dataType = dataTypes[i++]) ) {
7483  // Prepend if requested
7484  if ( dataType[0] === "+" ) {
7485  dataType = dataType.slice( 1 ) || "*";
7486  (structure[ dataType ] = structure[ dataType ] || []).unshift( func );
7487 
7488  // Otherwise append
7489  } else {
7490  (structure[ dataType ] = structure[ dataType ] || []).push( func );
7491  }
7492  }
7493  }
7494  };
7495 }
7496 
7497 // Base inspection function for prefilters and transports
7498 function inspectPrefiltersOrTransports( structure, options, originalOptions, jqXHR ) {
7499 
7500  var inspected = {},
7501  seekingTransport = ( structure === transports );
7502 
7503  function inspect( dataType ) {
7504  var selected;
7505  inspected[ dataType ] = true;
7506  jQuery.each( structure[ dataType ] || [], function( _, prefilterOrFactory ) {
7507  var dataTypeOrTransport = prefilterOrFactory( options, originalOptions, jqXHR );
7508  if( typeof dataTypeOrTransport === "string" && !seekingTransport && !inspected[ dataTypeOrTransport ] ) {
7509  options.dataTypes.unshift( dataTypeOrTransport );
7510  inspect( dataTypeOrTransport );
7511  return false;
7512  } else if ( seekingTransport ) {
7513  return !( selected = dataTypeOrTransport );
7514  }
7515  });
7516  return selected;
7517  }
7518 
7519  return inspect( options.dataTypes[ 0 ] ) || !inspected[ "*" ] && inspect( "*" );
7520 }
7521 
7522 // A special extend for ajax options
7523 // that takes "flat" options (not to be deep extended)
7524 // Fixes #9887
7525 function ajaxExtend( target, src ) {
7526  var deep, key,
7527  flatOptions = jQuery.ajaxSettings.flatOptions || {};
7528 
7529  for ( key in src ) {
7530  if ( src[ key ] !== undefined ) {
7531  ( flatOptions[ key ] ? target : ( deep || (deep = {}) ) )[ key ] = src[ key ];
7532  }
7533  }
7534  if ( deep ) {
7535  jQuery.extend( true, target, deep );
7536  }
7537 
7538  return target;
7539 }
7540 
7541 jQuery.fn.load = function( url, params, callback ) {
7542  if ( typeof url !== "string" && _load ) {
7543  return _load.apply( this, arguments );
7544  }
7545 
7546  var selector, response, type,
7547  self = this,
7548  off = url.indexOf(" ");
7549 
7550  if ( off >= 0 ) {
7551  selector = url.slice( off, url.length );
7552  url = url.slice( 0, off );
7553  }
7554 
7555  // If it's a function
7556  if ( jQuery.isFunction( params ) ) {
7557 
7558  // We assume that it's the callback
7559  callback = params;
7560  params = undefined;
7561 
7562  // Otherwise, build a param string
7563  } else if ( params && typeof params === "object" ) {
7564  type = "POST";
7565  }
7566 
7567  // If we have elements to modify, make the request
7568  if ( self.length > 0 ) {
7569  jQuery.ajax({
7570  url: url,
7571 
7572  // if "type" variable is undefined, then "GET" method will be used
7573  type: type,
7574  dataType: "html",
7575  data: params
7576  }).done(function( responseText ) {
7577 
7578  // Save response for use in complete callback
7579  response = arguments;
7580 
7581  self.html( selector ?
7582 
7583  // If a selector was specified, locate the right elements in a dummy div
7584  // Exclude scripts to avoid IE 'Permission Denied' errors
7585  jQuery("<div>").append( jQuery.parseHTML( responseText ) ).find( selector ) :
7586 
7587  // Otherwise use the full result
7588  responseText );
7589 
7590  }).complete( callback && function( jqXHR, status ) {
7591  self.each( callback, response || [ jqXHR.responseText, status, jqXHR ] );
7592  });
7593  }
7594 
7595  return this;
7596 };
7597 
7598 // Attach a bunch of functions for handling common AJAX events
7599 jQuery.each( [ "ajaxStart", "ajaxStop", "ajaxComplete", "ajaxError", "ajaxSuccess", "ajaxSend" ], function( i, type ){
7600  jQuery.fn[ type ] = function( fn ){
7601  return this.on( type, fn );
7602  };
7603 });
7604 
7605 jQuery.each( [ "get", "post" ], function( i, method ) {
7606  jQuery[ method ] = function( url, data, callback, type ) {
7607  // shift arguments if data argument was omitted
7608  if ( jQuery.isFunction( data ) ) {
7609  type = type || callback;
7610  callback = data;
7611  data = undefined;
7612  }
7613 
7614  return jQuery.ajax({
7615  url: url,
7616  type: method,
7617  dataType: type,
7618  data: data,
7619  success: callback
7620  });
7621  };
7622 });
7623 
7624 jQuery.extend({
7625 
7626  // Counter for holding the number of active queries
7627  active: 0,
7628 
7629  // Last-Modified header cache for next request
7630  lastModified: {},
7631  etag: {},
7632 
7633  ajaxSettings: {
7634  url: ajaxLocation,
7635  type: "GET",
7636  isLocal: rlocalProtocol.test( ajaxLocParts[ 1 ] ),
7637  global: true,
7638  processData: true,
7639  async: true,
7640  contentType: "application/x-www-form-urlencoded; charset=UTF-8",
7641  /*
7642  timeout: 0,
7643  data: null,
7644  dataType: null,
7645  username: null,
7646  password: null,
7647  cache: null,
7648  throws: false,
7649  traditional: false,
7650  headers: {},
7651  */
7652 
7653  accepts: {
7654  "*": allTypes,
7655  text: "text/plain",
7656  html: "text/html",
7657  xml: "application/xml, text/xml",
7658  json: "application/json, text/javascript"
7659  },
7660 
7661  contents: {
7662  xml: /xml/,
7663  html: /html/,
7664  json: /json/
7665  },
7666 
7667  responseFields: {
7668  xml: "responseXML",
7669  text: "responseText"
7670  },
7671 
7672  // Data converters
7673  // Keys separate source (or catchall "*") and destination types with a single space
7674  converters: {
7675 
7676  // Convert anything to text
7677  "* text": window.String,
7678 
7679  // Text to html (true = no transformation)
7680  "text html": true,
7681 
7682  // Evaluate text as a json expression
7683  "text json": jQuery.parseJSON,
7684 
7685  // Parse text as xml
7686  "text xml": jQuery.parseXML
7687  },
7688 
7689  // For options that shouldn't be deep extended:
7690  // you can add your own custom options here if
7691  // and when you create one that shouldn't be
7692  // deep extended (see ajaxExtend)
7693  flatOptions: {
7694  url: true,
7695  context: true
7696  }
7697  },
7698 
7699  // Creates a full fledged settings object into target
7700  // with both ajaxSettings and settings fields.
7701  // If target is omitted, writes into ajaxSettings.
7702  ajaxSetup: function( target, settings ) {
7703  return settings ?
7704 
7705  // Building a settings object
7706  ajaxExtend( ajaxExtend( target, jQuery.ajaxSettings ), settings ) :
7707 
7708  // Extending ajaxSettings
7709  ajaxExtend( jQuery.ajaxSettings, target );
7710  },
7711 
7712  ajaxPrefilter: addToPrefiltersOrTransports( prefilters ),
7713  ajaxTransport: addToPrefiltersOrTransports( transports ),
7714 
7715  // Main method
7716  ajax: function( url, options ) {
7717 
7718  // If url is an object, simulate pre-1.5 signature
7719  if ( typeof url === "object" ) {
7720  options = url;
7721  url = undefined;
7722  }
7723 
7724  // Force options to be an object
7725  options = options || {};
7726 
7727  var // Cross-domain detection vars
7728  parts,
7729  // Loop variable
7730  i,
7731  // URL without anti-cache param
7732  cacheURL,
7733  // Response headers as string
7734  responseHeadersString,
7735  // timeout handle
7736  timeoutTimer,
7737 
7738  // To know if global events are to be dispatched
7739  fireGlobals,
7740 
7741  transport,
7742  // Response headers
7743  responseHeaders,
7744  // Create the final options object
7745  s = jQuery.ajaxSetup( {}, options ),
7746  // Callbacks context
7747  callbackContext = s.context || s,
7748  // Context for global events is callbackContext if it is a DOM node or jQuery collection
7749  globalEventContext = s.context && ( callbackContext.nodeType || callbackContext.jquery ) ?
7750  jQuery( callbackContext ) :
7751  jQuery.event,
7752  // Deferreds
7753  deferred = jQuery.Deferred(),
7754  completeDeferred = jQuery.Callbacks("once memory"),
7755  // Status-dependent callbacks
7756  statusCode = s.statusCode || {},
7757  // Headers (they are sent all at once)
7758  requestHeaders = {},
7759  requestHeadersNames = {},
7760  // The jqXHR state
7761  state = 0,
7762  // Default abort message
7763  strAbort = "canceled",
7764  // Fake xhr
7765  jqXHR = {
7766  readyState: 0,
7767 
7768  // Builds headers hashtable if needed
7769  getResponseHeader: function( key ) {
7770  var match;
7771  if ( state === 2 ) {
7772  if ( !responseHeaders ) {
7773  responseHeaders = {};
7774  while ( (match = rheaders.exec( responseHeadersString )) ) {
7775  responseHeaders[ match[1].toLowerCase() ] = match[ 2 ];
7776  }
7777  }
7778  match = responseHeaders[ key.toLowerCase() ];
7779  }
7780  return match == null ? null : match;
7781  },
7782 
7783  // Raw string
7784  getAllResponseHeaders: function() {
7785  return state === 2 ? responseHeadersString : null;
7786  },
7787 
7788  // Caches the header
7789  setRequestHeader: function( name, value ) {
7790  var lname = name.toLowerCase();
7791  if ( !state ) {
7792  name = requestHeadersNames[ lname ] = requestHeadersNames[ lname ] || name;
7793  requestHeaders[ name ] = value;
7794  }
7795  return this;
7796  },
7797 
7798  // Overrides response content-type header
7799  overrideMimeType: function( type ) {
7800  if ( !state ) {
7801  s.mimeType = type;
7802  }
7803  return this;
7804  },
7805 
7806  // Status-dependent callbacks
7807  statusCode: function( map ) {
7808  var code;
7809  if ( map ) {
7810  if ( state < 2 ) {
7811  for ( code in map ) {
7812  // Lazy-add the new callback in a way that preserves old ones
7813  statusCode[ code ] = [ statusCode[ code ], map[ code ] ];
7814  }
7815  } else {
7816  // Execute the appropriate callbacks
7817  jqXHR.always( map[ jqXHR.status ] );
7818  }
7819  }
7820  return this;
7821  },
7822 
7823  // Cancel the request
7824  abort: function( statusText ) {
7825  var finalText = statusText || strAbort;
7826  if ( transport ) {
7827  transport.abort( finalText );
7828  }
7829  done( 0, finalText );
7830  return this;
7831  }
7832  };
7833 
7834  // Attach deferreds
7835  deferred.promise( jqXHR ).complete = completeDeferred.add;
7836  jqXHR.success = jqXHR.done;
7837  jqXHR.error = jqXHR.fail;
7838 
7839  // Remove hash character (#7531: and string promotion)
7840  // Add protocol if not provided (#5866: IE7 issue with protocol-less urls)
7841  // Handle falsy url in the settings object (#10093: consistency with old signature)
7842  // We also use the url parameter if available
7843  s.url = ( ( url || s.url || ajaxLocation ) + "" ).replace( rhash, "" ).replace( rprotocol, ajaxLocParts[ 1 ] + "//" );
7844 
7845  // Alias method option to type as per ticket #12004
7846  s.type = options.method || options.type || s.method || s.type;
7847 
7848  // Extract dataTypes list
7849  s.dataTypes = jQuery.trim( s.dataType || "*" ).toLowerCase().match( core_rnotwhite ) || [""];
7850 
7851  // A cross-domain request is in order when we have a protocol:host:port mismatch
7852  if ( s.crossDomain == null ) {
7853  parts = rurl.exec( s.url.toLowerCase() );
7854  s.crossDomain = !!( parts &&
7855  ( parts[ 1 ] !== ajaxLocParts[ 1 ] || parts[ 2 ] !== ajaxLocParts[ 2 ] ||
7856  ( parts[ 3 ] || ( parts[ 1 ] === "http:" ? 80 : 443 ) ) !=
7857  ( ajaxLocParts[ 3 ] || ( ajaxLocParts[ 1 ] === "http:" ? 80 : 443 ) ) )
7858  );
7859  }
7860 
7861  // Convert data if not already a string
7862  if ( s.data && s.processData && typeof s.data !== "string" ) {
7863  s.data = jQuery.param( s.data, s.traditional );
7864  }
7865 
7866  // Apply prefilters
7867  inspectPrefiltersOrTransports( prefilters, s, options, jqXHR );
7868 
7869  // If request was aborted inside a prefilter, stop there
7870  if ( state === 2 ) {
7871  return jqXHR;
7872  }
7873 
7874  // We can fire global events as of now if asked to
7875  fireGlobals = s.global;
7876 
7877  // Watch for a new set of requests
7878  if ( fireGlobals && jQuery.active++ === 0 ) {
7879  jQuery.event.trigger("ajaxStart");
7880  }
7881 
7882  // Uppercase the type
7883  s.type = s.type.toUpperCase();
7884 
7885  // Determine if request has content
7886  s.hasContent = !rnoContent.test( s.type );
7887 
7888  // Save the URL in case we're toying with the If-Modified-Since
7889  // and/or If-None-Match header later on
7890  cacheURL = s.url;
7891 
7892  // More options handling for requests with no content
7893  if ( !s.hasContent ) {
7894 
7895  // If data is available, append data to url
7896  if ( s.data ) {
7897  cacheURL = ( s.url += ( ajax_rquery.test( cacheURL ) ? "&" : "?" ) + s.data );
7898  // #9682: remove data so that it's not used in an eventual retry
7899  delete s.data;
7900  }
7901 
7902  // Add anti-cache in url if needed
7903  if ( s.cache === false ) {
7904  s.url = rts.test( cacheURL ) ?
7905 
7906  // If there is already a '_' parameter, set its value
7907  cacheURL.replace( rts, "$1_=" + ajax_nonce++ ) :
7908 
7909  // Otherwise add one to the end
7910  cacheURL + ( ajax_rquery.test( cacheURL ) ? "&" : "?" ) + "_=" + ajax_nonce++;
7911  }
7912  }
7913 
7914  // Set the If-Modified-Since and/or If-None-Match header, if in ifModified mode.
7915  if ( s.ifModified ) {
7916  if ( jQuery.lastModified[ cacheURL ] ) {
7917  jqXHR.setRequestHeader( "If-Modified-Since", jQuery.lastModified[ cacheURL ] );
7918  }
7919  if ( jQuery.etag[ cacheURL ] ) {
7920  jqXHR.setRequestHeader( "If-None-Match", jQuery.etag[ cacheURL ] );
7921  }
7922  }
7923 
7924  // Set the correct header, if data is being sent
7925  if ( s.data && s.hasContent && s.contentType !== false || options.contentType ) {
7926  jqXHR.setRequestHeader( "Content-Type", s.contentType );
7927  }
7928 
7929  // Set the Accepts header for the server, depending on the dataType
7930  jqXHR.setRequestHeader(
7931  "Accept",
7932  s.dataTypes[ 0 ] && s.accepts[ s.dataTypes[0] ] ?
7933  s.accepts[ s.dataTypes[0] ] + ( s.dataTypes[ 0 ] !== "*" ? ", " + allTypes + "; q=0.01" : "" ) :
7934  s.accepts[ "*" ]
7935  );
7936 
7937  // Check for headers option
7938  for ( i in s.headers ) {
7939  jqXHR.setRequestHeader( i, s.headers[ i ] );
7940  }
7941 
7942  // Allow custom headers/mimetypes and early abort
7943  if ( s.beforeSend && ( s.beforeSend.call( callbackContext, jqXHR, s ) === false || state === 2 ) ) {
7944  // Abort if not done already and return
7945  return jqXHR.abort();
7946  }
7947 
7948  // aborting is no longer a cancellation
7949  strAbort = "abort";
7950 
7951  // Install callbacks on deferreds
7952  for ( i in { success: 1, error: 1, complete: 1 } ) {
7953  jqXHR[ i ]( s[ i ] );
7954  }
7955 
7956  // Get transport
7957  transport = inspectPrefiltersOrTransports( transports, s, options, jqXHR );
7958 
7959  // If no transport, we auto-abort
7960  if ( !transport ) {
7961  done( -1, "No Transport" );
7962  } else {
7963  jqXHR.readyState = 1;
7964 
7965  // Send global event
7966  if ( fireGlobals ) {
7967  globalEventContext.trigger( "ajaxSend", [ jqXHR, s ] );
7968  }
7969  // Timeout
7970  if ( s.async && s.timeout > 0 ) {
7971  timeoutTimer = setTimeout(function() {
7972  jqXHR.abort("timeout");
7973  }, s.timeout );
7974  }
7975 
7976  try {
7977  state = 1;
7978  transport.send( requestHeaders, done );
7979  } catch ( e ) {
7980  // Propagate exception as error if not done
7981  if ( state < 2 ) {
7982  done( -1, e );
7983  // Simply rethrow otherwise
7984  } else {
7985  throw e;
7986  }
7987  }
7988  }
7989 
7990  // Callback for when everything is done
7991  function done( status, nativeStatusText, responses, headers ) {
7992  var isSuccess, success, error, response, modified,
7993  statusText = nativeStatusText;
7994 
7995  // Called once
7996  if ( state === 2 ) {
7997  return;
7998  }
7999 
8000  // State is "done" now
8001  state = 2;
8002 
8003  // Clear timeout if it exists
8004  if ( timeoutTimer ) {
8005  clearTimeout( timeoutTimer );
8006  }
8007 
8008  // Dereference transport for early garbage collection
8009  // (no matter how long the jqXHR object will be used)
8010  transport = undefined;
8011 
8012  // Cache response headers
8013  responseHeadersString = headers || "";
8014 
8015  // Set readyState
8016  jqXHR.readyState = status > 0 ? 4 : 0;
8017 
8018  // Get response data
8019  if ( responses ) {
8020  response = ajaxHandleResponses( s, jqXHR, responses );
8021  }
8022 
8023  // If successful, handle type chaining
8024  if ( status >= 200 && status < 300 || status === 304 ) {
8025 
8026  // Set the If-Modified-Since and/or If-None-Match header, if in ifModified mode.
8027  if ( s.ifModified ) {
8028  modified = jqXHR.getResponseHeader("Last-Modified");
8029  if ( modified ) {
8030  jQuery.lastModified[ cacheURL ] = modified;
8031  }
8032  modified = jqXHR.getResponseHeader("etag");
8033  if ( modified ) {
8034  jQuery.etag[ cacheURL ] = modified;
8035  }
8036  }
8037 
8038  // if no content
8039  if ( status === 204 ) {
8040  isSuccess = true;
8041  statusText = "nocontent";
8042 
8043  // if not modified
8044  } else if ( status === 304 ) {
8045  isSuccess = true;
8046  statusText = "notmodified";
8047 
8048  // If we have data, let's convert it
8049  } else {
8050  isSuccess = ajaxConvert( s, response );
8051  statusText = isSuccess.state;
8052  success = isSuccess.data;
8053  error = isSuccess.error;
8054  isSuccess = !error;
8055  }
8056  } else {
8057  // We extract error from statusText
8058  // then normalize statusText and status for non-aborts
8059  error = statusText;
8060  if ( status || !statusText ) {
8061  statusText = "error";
8062  if ( status < 0 ) {
8063  status = 0;
8064  }
8065  }
8066  }
8067 
8068  // Set data for the fake xhr object
8069  jqXHR.status = status;
8070  jqXHR.statusText = ( nativeStatusText || statusText ) + "";
8071 
8072  // Success/Error
8073  if ( isSuccess ) {
8074  deferred.resolveWith( callbackContext, [ success, statusText, jqXHR ] );
8075  } else {
8076  deferred.rejectWith( callbackContext, [ jqXHR, statusText, error ] );
8077  }
8078 
8079  // Status-dependent callbacks
8080  jqXHR.statusCode( statusCode );
8081  statusCode = undefined;
8082 
8083  if ( fireGlobals ) {
8084  globalEventContext.trigger( isSuccess ? "ajaxSuccess" : "ajaxError",
8085  [ jqXHR, s, isSuccess ? success : error ] );
8086  }
8087 
8088  // Complete
8089  completeDeferred.fireWith( callbackContext, [ jqXHR, statusText ] );
8090 
8091  if ( fireGlobals ) {
8092  globalEventContext.trigger( "ajaxComplete", [ jqXHR, s ] );
8093  // Handle the global AJAX counter
8094  if ( !( --jQuery.active ) ) {
8095  jQuery.event.trigger("ajaxStop");
8096  }
8097  }
8098  }
8099 
8100  return jqXHR;
8101  },
8102 
8103  getScript: function( url, callback ) {
8104  return jQuery.get( url, undefined, callback, "script" );
8105  },
8106 
8107  getJSON: function( url, data, callback ) {
8108  return jQuery.get( url, data, callback, "json" );
8109  }
8110 });
8111 
8112 /* Handles responses to an ajax request:
8113  * - sets all responseXXX fields accordingly
8114  * - finds the right dataType (mediates between content-type and expected dataType)
8115  * - returns the corresponding response
8116  */
8117 function ajaxHandleResponses( s, jqXHR, responses ) {
8118  var firstDataType, ct, finalDataType, type,
8119  contents = s.contents,
8120  dataTypes = s.dataTypes,
8121  responseFields = s.responseFields;
8122 
8123  // Fill responseXXX fields
8124  for ( type in responseFields ) {
8125  if ( type in responses ) {
8126  jqXHR[ responseFields[type] ] = responses[ type ];
8127  }
8128  }
8129 
8130  // Remove auto dataType and get content-type in the process
8131  while( dataTypes[ 0 ] === "*" ) {
8132  dataTypes.shift();
8133  if ( ct === undefined ) {
8134  ct = s.mimeType || jqXHR.getResponseHeader("Content-Type");
8135  }
8136  }
8137 
8138  // Check if we're dealing with a known content-type
8139  if ( ct ) {
8140  for ( type in contents ) {
8141  if ( contents[ type ] && contents[ type ].test( ct ) ) {
8142  dataTypes.unshift( type );
8143  break;
8144  }
8145  }
8146  }
8147 
8148  // Check to see if we have a response for the expected dataType
8149  if ( dataTypes[ 0 ] in responses ) {
8150  finalDataType = dataTypes[ 0 ];
8151  } else {
8152  // Try convertible dataTypes
8153  for ( type in responses ) {
8154  if ( !dataTypes[ 0 ] || s.converters[ type + " " + dataTypes[0] ] ) {
8155  finalDataType = type;
8156  break;
8157  }
8158  if ( !firstDataType ) {
8159  firstDataType = type;
8160  }
8161  }
8162  // Or just use first one
8163  finalDataType = finalDataType || firstDataType;
8164  }
8165 
8166  // If we found a dataType
8167  // We add the dataType to the list if needed
8168  // and return the corresponding response
8169  if ( finalDataType ) {
8170  if ( finalDataType !== dataTypes[ 0 ] ) {
8171  dataTypes.unshift( finalDataType );
8172  }
8173  return responses[ finalDataType ];
8174  }
8175 }
8176 
8177 // Chain conversions given the request and the original response
8178 function ajaxConvert( s, response ) {
8179  var conv2, current, conv, tmp,
8180  converters = {},
8181  i = 0,
8182  // Work with a copy of dataTypes in case we need to modify it for conversion
8183  dataTypes = s.dataTypes.slice(),
8184  prev = dataTypes[ 0 ];
8185 
8186  // Apply the dataFilter if provided
8187  if ( s.dataFilter ) {
8188  response = s.dataFilter( response, s.dataType );
8189  }
8190 
8191  // Create converters map with lowercased keys
8192  if ( dataTypes[ 1 ] ) {
8193  for ( conv in s.converters ) {
8194  converters[ conv.toLowerCase() ] = s.converters[ conv ];
8195  }
8196  }
8197 
8198  // Convert to each sequential dataType, tolerating list modification
8199  for ( ; (current = dataTypes[++i]); ) {
8200 
8201  // There's only work to do if current dataType is non-auto
8202  if ( current !== "*" ) {
8203 
8204  // Convert response if prev dataType is non-auto and differs from current
8205  if ( prev !== "*" && prev !== current ) {
8206 
8207  // Seek a direct converter
8208  conv = converters[ prev + " " + current ] || converters[ "* " + current ];
8209 
8210  // If none found, seek a pair
8211  if ( !conv ) {
8212  for ( conv2 in converters ) {
8213 
8214  // If conv2 outputs current
8215  tmp = conv2.split(" ");
8216  if ( tmp[ 1 ] === current ) {
8217 
8218  // If prev can be converted to accepted input
8219  conv = converters[ prev + " " + tmp[ 0 ] ] ||
8220  converters[ "* " + tmp[ 0 ] ];
8221  if ( conv ) {
8222  // Condense equivalence converters
8223  if ( conv === true ) {
8224  conv = converters[ conv2 ];
8225 
8226  // Otherwise, insert the intermediate dataType
8227  } else if ( converters[ conv2 ] !== true ) {
8228  current = tmp[ 0 ];
8229  dataTypes.splice( i--, 0, current );
8230  }
8231 
8232  break;
8233  }
8234  }
8235  }
8236  }
8237 
8238  // Apply converter (if not an equivalence)
8239  if ( conv !== true ) {
8240 
8241  // Unless errors are allowed to bubble, catch and return them
8242  if ( conv && s["throws"] ) {
8243  response = conv( response );
8244  } else {
8245  try {
8246  response = conv( response );
8247  } catch ( e ) {
8248  return { state: "parsererror", error: conv ? e : "No conversion from " + prev + " to " + current };
8249  }
8250  }
8251  }
8252  }
8253 
8254  // Update prev for next iteration
8255  prev = current;
8256  }
8257  }
8258 
8259  return { state: "success", data: response };
8260 }
8261 // Install script dataType
8262 jQuery.ajaxSetup({
8263  accepts: {
8264  script: "text/javascript, application/javascript, application/ecmascript, application/x-ecmascript"
8265  },
8266  contents: {
8267  script: /(?:java|ecma)script/
8268  },
8269  converters: {
8270  "text script": function( text ) {
8271  jQuery.globalEval( text );
8272  return text;
8273  }
8274  }
8275 });
8276 
8277 // Handle cache's special case and global
8278 jQuery.ajaxPrefilter( "script", function( s ) {
8279  if ( s.cache === undefined ) {
8280  s.cache = false;
8281  }
8282  if ( s.crossDomain ) {
8283  s.type = "GET";
8284  s.global = false;
8285  }
8286 });
8287 
8288 // Bind script tag hack transport
8289 jQuery.ajaxTransport( "script", function(s) {
8290 
8291  // This transport only deals with cross domain requests
8292  if ( s.crossDomain ) {
8293 
8294  var script,
8295  head = document.head || jQuery("head")[0] || document.documentElement;
8296 
8297  return {
8298 
8299  send: function( _, callback ) {
8300 
8301  script = document.createElement("script");
8302 
8303  script.async = true;
8304 
8305  if ( s.scriptCharset ) {
8306  script.charset = s.scriptCharset;
8307  }
8308 
8309  script.src = s.url;
8310 
8311  // Attach handlers for all browsers
8312  script.onload = script.onreadystatechange = function( _, isAbort ) {
8313 
8314  if ( isAbort || !script.readyState || /loaded|complete/.test( script.readyState ) ) {
8315 
8316  // Handle memory leak in IE
8317  script.onload = script.onreadystatechange = null;
8318 
8319  // Remove the script
8320  if ( script.parentNode ) {
8321  script.parentNode.removeChild( script );
8322  }
8323 
8324  // Dereference the script
8325  script = null;
8326 
8327  // Callback if not abort
8328  if ( !isAbort ) {
8329  callback( 200, "success" );
8330  }
8331  }
8332  };
8333 
8334  // Circumvent IE6 bugs with base elements (#2709 and #4378) by prepending
8335  // Use native DOM manipulation to avoid our domManip AJAX trickery
8336  head.insertBefore( script, head.firstChild );
8337  },
8338 
8339  abort: function() {
8340  if ( script ) {
8341  script.onload( undefined, true );
8342  }
8343  }
8344  };
8345  }
8346 });
8347 var oldCallbacks = [],
8348  rjsonp = /(=)\?(?=&|$)|\?\?/;
8349 
8350 // Default jsonp settings
8351 jQuery.ajaxSetup({
8352  jsonp: "callback",
8353  jsonpCallback: function() {
8354  var callback = oldCallbacks.pop() || ( jQuery.expando + "_" + ( ajax_nonce++ ) );
8355  this[ callback ] = true;
8356  return callback;
8357  }
8358 });
8359 
8360 // Detect, normalize options and install callbacks for jsonp requests
8361 jQuery.ajaxPrefilter( "json jsonp", function( s, originalSettings, jqXHR ) {
8362 
8363  var callbackName, overwritten, responseContainer,
8364  jsonProp = s.jsonp !== false && ( rjsonp.test( s.url ) ?
8365  "url" :
8366  typeof s.data === "string" && !( s.contentType || "" ).indexOf("application/x-www-form-urlencoded") && rjsonp.test( s.data ) && "data"
8367  );
8368 
8369  // Handle iff the expected data type is "jsonp" or we have a parameter to set
8370  if ( jsonProp || s.dataTypes[ 0 ] === "jsonp" ) {
8371 
8372  // Get callback name, remembering preexisting value associated with it
8373  callbackName = s.jsonpCallback = jQuery.isFunction( s.jsonpCallback ) ?
8374  s.jsonpCallback() :
8375  s.jsonpCallback;
8376 
8377  // Insert callback into url or form data
8378  if ( jsonProp ) {
8379  s[ jsonProp ] = s[ jsonProp ].replace( rjsonp, "$1" + callbackName );
8380  } else if ( s.jsonp !== false ) {
8381  s.url += ( ajax_rquery.test( s.url ) ? "&" : "?" ) + s.jsonp + "=" + callbackName;
8382  }
8383 
8384  // Use data converter to retrieve json after script execution
8385  s.converters["script json"] = function() {
8386  if ( !responseContainer ) {
8387  jQuery.error( callbackName + " was not called" );
8388  }
8389  return responseContainer[ 0 ];
8390  };
8391 
8392  // force json dataType
8393  s.dataTypes[ 0 ] = "json";
8394 
8395  // Install callback
8396  overwritten = window[ callbackName ];
8397  window[ callbackName ] = function() {
8398  responseContainer = arguments;
8399  };
8400 
8401  // Clean-up function (fires after converters)
8402  jqXHR.always(function() {
8403  // Restore preexisting value
8404  window[ callbackName ] = overwritten;
8405 
8406  // Save back as free
8407  if ( s[ callbackName ] ) {
8408  // make sure that re-using the options doesn't screw things around
8409  s.jsonpCallback = originalSettings.jsonpCallback;
8410 
8411  // save the callback name for future use
8412  oldCallbacks.push( callbackName );
8413  }
8414 
8415  // Call if it was a function and we have a response
8416  if ( responseContainer && jQuery.isFunction( overwritten ) ) {
8417  overwritten( responseContainer[ 0 ] );
8418  }
8419 
8420  responseContainer = overwritten = undefined;
8421  });
8422 
8423  // Delegate to script
8424  return "script";
8425  }
8426 });
8427 var xhrCallbacks, xhrSupported,
8428  xhrId = 0,
8429  // #5280: Internet Explorer will keep connections alive if we don't abort on unload
8430  xhrOnUnloadAbort = window.ActiveXObject && function() {
8431  // Abort all pending requests
8432  var key;
8433  for ( key in xhrCallbacks ) {
8434  xhrCallbacks[ key ]( undefined, true );
8435  }
8436  };
8437 
8438 // Functions to create xhrs
8439 function createStandardXHR() {
8440  try {
8441  return new window.XMLHttpRequest();
8442  } catch( e ) {}
8443 }
8444 
8445 function createActiveXHR() {
8446  try {
8447  return new window.ActiveXObject("Microsoft.XMLHTTP");
8448  } catch( e ) {}
8449 }
8450 
8451 // Create the request object
8452 // (This is still attached to ajaxSettings for backward compatibility)
8453 jQuery.ajaxSettings.xhr = window.ActiveXObject ?
8454  /* Microsoft failed to properly
8455  * implement the XMLHttpRequest in IE7 (can't request local files),
8456  * so we use the ActiveXObject when it is available
8457  * Additionally XMLHttpRequest can be disabled in IE7/IE8 so
8458  * we need a fallback.
8459  */
8460  function() {
8461  return !this.isLocal && createStandardXHR() || createActiveXHR();
8462  } :
8463  // For all other browsers, use the standard XMLHttpRequest object
8464  createStandardXHR;
8465 
8466 // Determine support properties
8467 xhrSupported = jQuery.ajaxSettings.xhr();
8468 jQuery.support.cors = !!xhrSupported && ( "withCredentials" in xhrSupported );
8469 xhrSupported = jQuery.support.ajax = !!xhrSupported;
8470 
8471 // Create transport if the browser can provide an xhr
8472 if ( xhrSupported ) {
8473 
8474  jQuery.ajaxTransport(function( s ) {
8475  // Cross domain only allowed if supported through XMLHttpRequest
8476  if ( !s.crossDomain || jQuery.support.cors ) {
8477 
8478  var callback;
8479 
8480  return {
8481  send: function( headers, complete ) {
8482 
8483  // Get a new xhr
8484  var handle, i,
8485  xhr = s.xhr();
8486 
8487  // Open the socket
8488  // Passing null username, generates a login popup on Opera (#2865)
8489  if ( s.username ) {
8490  xhr.open( s.type, s.url, s.async, s.username, s.password );
8491  } else {
8492  xhr.open( s.type, s.url, s.async );
8493  }
8494 
8495  // Apply custom fields if provided
8496  if ( s.xhrFields ) {
8497  for ( i in s.xhrFields ) {
8498  xhr[ i ] = s.xhrFields[ i ];
8499  }
8500  }
8501 
8502  // Override mime type if needed
8503  if ( s.mimeType && xhr.overrideMimeType ) {
8504  xhr.overrideMimeType( s.mimeType );
8505  }
8506 
8507  // X-Requested-With header
8508  // For cross-domain requests, seeing as conditions for a preflight are
8509  // akin to a jigsaw puzzle, we simply never set it to be sure.
8510  // (it can always be set on a per-request basis or even using ajaxSetup)
8511  // For same-domain requests, won't change header if already provided.
8512  if ( !s.crossDomain && !headers["X-Requested-With"] ) {
8513  headers["X-Requested-With"] = "XMLHttpRequest";
8514  }
8515 
8516  // Need an extra try/catch for cross domain requests in Firefox 3
8517  try {
8518  for ( i in headers ) {
8519  xhr.setRequestHeader( i, headers[ i ] );
8520  }
8521  } catch( err ) {}
8522 
8523  // Do send the request
8524  // This may raise an exception which is actually
8525  // handled in jQuery.ajax (so no try/catch here)
8526  xhr.send( ( s.hasContent && s.data ) || null );
8527 
8528  // Listener
8529  callback = function( _, isAbort ) {
8530  var status, responseHeaders, statusText, responses;
8531 
8532  // Firefox throws exceptions when accessing properties
8533  // of an xhr when a network error occurred
8534  // http://helpful.knobs-dials.com/index.php/Component_returned_failure_code:_0x80040111_(NS_ERROR_NOT_AVAILABLE)
8535  try {
8536 
8537  // Was never called and is aborted or complete
8538  if ( callback && ( isAbort || xhr.readyState === 4 ) ) {
8539 
8540  // Only called once
8541  callback = undefined;
8542 
8543  // Do not keep as active anymore
8544  if ( handle ) {
8545  xhr.onreadystatechange = jQuery.noop;
8546  if ( xhrOnUnloadAbort ) {
8547  delete xhrCallbacks[ handle ];
8548  }
8549  }
8550 
8551  // If it's an abort
8552  if ( isAbort ) {
8553  // Abort it manually if needed
8554  if ( xhr.readyState !== 4 ) {
8555  xhr.abort();
8556  }
8557  } else {
8558  responses = {};
8559  status = xhr.status;
8560  responseHeaders = xhr.getAllResponseHeaders();
8561 
8562  // When requesting binary data, IE6-9 will throw an exception
8563  // on any attempt to access responseText (#11426)
8564  if ( typeof xhr.responseText === "string" ) {
8565  responses.text = xhr.responseText;
8566  }
8567 
8568  // Firefox throws an exception when accessing
8569  // statusText for faulty cross-domain requests
8570  try {
8571  statusText = xhr.statusText;
8572  } catch( e ) {
8573  // We normalize with Webkit giving an empty statusText
8574  statusText = "";
8575  }
8576 
8577  // Filter status for non standard behaviors
8578 
8579  // If the request is local and we have data: assume a success
8580  // (success with no data won't get notified, that's the best we
8581  // can do given current implementations)
8582  if ( !status && s.isLocal && !s.crossDomain ) {
8583  status = responses.text ? 200 : 404;
8584  // IE - #1450: sometimes returns 1223 when it should be 204
8585  } else if ( status === 1223 ) {
8586  status = 204;
8587  }
8588  }
8589  }
8590  } catch( firefoxAccessException ) {
8591  if ( !isAbort ) {
8592  complete( -1, firefoxAccessException );
8593  }
8594  }
8595 
8596  // Call complete if needed
8597  if ( responses ) {
8598  complete( status, statusText, responses, responseHeaders );
8599  }
8600  };
8601 
8602  if ( !s.async ) {
8603  // if we're in sync mode we fire the callback
8604  callback();
8605  } else if ( xhr.readyState === 4 ) {
8606  // (IE6 & IE7) if it's in cache and has been
8607  // retrieved directly we need to fire the callback
8608  setTimeout( callback );
8609  } else {
8610  handle = ++xhrId;
8611  if ( xhrOnUnloadAbort ) {
8612  // Create the active xhrs callbacks list if needed
8613  // and attach the unload handler
8614  if ( !xhrCallbacks ) {
8615  xhrCallbacks = {};
8616  jQuery( window ).unload( xhrOnUnloadAbort );
8617  }
8618  // Add to list of active xhrs callbacks
8619  xhrCallbacks[ handle ] = callback;
8620  }
8621  xhr.onreadystatechange = callback;
8622  }
8623  },
8624 
8625  abort: function() {
8626  if ( callback ) {
8627  callback( undefined, true );
8628  }
8629  }
8630  };
8631  }
8632  });
8633 }
8634 var fxNow, timerId,
8635  rfxtypes = /^(?:toggle|show|hide)$/,
8636  rfxnum = new RegExp( "^(?:([+-])=|)(" + core_pnum + ")([a-z%]*)$", "i" ),
8637  rrun = /queueHooks$/,
8638  animationPrefilters = [ defaultPrefilter ],
8639  tweeners = {
8640  "*": [function( prop, value ) {
8641  var end, unit,
8642  tween = this.createTween( prop, value ),
8643  parts = rfxnum.exec( value ),
8644  target = tween.cur(),
8645  start = +target || 0,
8646  scale = 1,
8647  maxIterations = 20;
8648 
8649  if ( parts ) {
8650  end = +parts[2];
8651  unit = parts[3] || ( jQuery.cssNumber[ prop ] ? "" : "px" );
8652 
8653  // We need to compute starting value
8654  if ( unit !== "px" && start ) {
8655  // Iteratively approximate from a nonzero starting point
8656  // Prefer the current property, because this process will be trivial if it uses the same units
8657  // Fallback to end or a simple constant
8658  start = jQuery.css( tween.elem, prop, true ) || end || 1;
8659 
8660  do {
8661  // If previous iteration zeroed out, double until we get *something*
8662  // Use a string for doubling factor so we don't accidentally see scale as unchanged below
8663  scale = scale || ".5";
8664 
8665  // Adjust and apply
8666  start = start / scale;
8667  jQuery.style( tween.elem, prop, start + unit );
8668 
8669  // Update scale, tolerating zero or NaN from tween.cur()
8670  // And breaking the loop if scale is unchanged or perfect, or if we've just had enough
8671  } while ( scale !== (scale = tween.cur() / target) && scale !== 1 && --maxIterations );
8672  }
8673 
8674  tween.unit = unit;
8675  tween.start = start;
8676  // If a +=/-= token was provided, we're doing a relative animation
8677  tween.end = parts[1] ? start + ( parts[1] + 1 ) * end : end;
8678  }
8679  return tween;
8680  }]
8681  };
8682 
8683 // Animations created synchronously will run synchronously
8684 function createFxNow() {
8685  setTimeout(function() {
8686  fxNow = undefined;
8687  });
8688  return ( fxNow = jQuery.now() );
8689 }
8690 
8691 function createTweens( animation, props ) {
8692  jQuery.each( props, function( prop, value ) {
8693  var collection = ( tweeners[ prop ] || [] ).concat( tweeners[ "*" ] ),
8694  index = 0,
8695  length = collection.length;
8696  for ( ; index < length; index++ ) {
8697  if ( collection[ index ].call( animation, prop, value ) ) {
8698 
8699  // we're done with this property
8700  return;
8701  }
8702  }
8703  });
8704 }
8705 
8706 function Animation( elem, properties, options ) {
8707  var result,
8708  stopped,
8709  index = 0,
8710  length = animationPrefilters.length,
8711  deferred = jQuery.Deferred().always( function() {
8712  // don't match elem in the :animated selector
8713  delete tick.elem;
8714  }),
8715  tick = function() {
8716  if ( stopped ) {
8717  return false;
8718  }
8719  var currentTime = fxNow || createFxNow(),
8720  remaining = Math.max( 0, animation.startTime + animation.duration - currentTime ),
8721  // archaic crash bug won't allow us to use 1 - ( 0.5 || 0 ) (#12497)
8722  temp = remaining / animation.duration || 0,
8723  percent = 1 - temp,
8724  index = 0,
8725  length = animation.tweens.length;
8726 
8727  for ( ; index < length ; index++ ) {
8728  animation.tweens[ index ].run( percent );
8729  }
8730 
8731  deferred.notifyWith( elem, [ animation, percent, remaining ]);
8732 
8733  if ( percent < 1 && length ) {
8734  return remaining;
8735  } else {
8736  deferred.resolveWith( elem, [ animation ] );
8737  return false;
8738  }
8739  },
8740  animation = deferred.promise({
8741  elem: elem,
8742  props: jQuery.extend( {}, properties ),
8743  opts: jQuery.extend( true, { specialEasing: {} }, options ),
8744  originalProperties: properties,
8745  originalOptions: options,
8746  startTime: fxNow || createFxNow(),
8747  duration: options.duration,
8748  tweens: [],
8749  createTween: function( prop, end ) {
8750  var tween = jQuery.Tween( elem, animation.opts, prop, end,
8751  animation.opts.specialEasing[ prop ] || animation.opts.easing );
8752  animation.tweens.push( tween );
8753  return tween;
8754  },
8755  stop: function( gotoEnd ) {
8756  var index = 0,
8757  // if we are going to the end, we want to run all the tweens
8758  // otherwise we skip this part
8759  length = gotoEnd ? animation.tweens.length : 0;
8760  if ( stopped ) {
8761  return this;
8762  }
8763  stopped = true;
8764  for ( ; index < length ; index++ ) {
8765  animation.tweens[ index ].run( 1 );
8766  }
8767 
8768  // resolve when we played the last frame
8769  // otherwise, reject
8770  if ( gotoEnd ) {
8771  deferred.resolveWith( elem, [ animation, gotoEnd ] );
8772  } else {
8773  deferred.rejectWith( elem, [ animation, gotoEnd ] );
8774  }
8775  return this;
8776  }
8777  }),
8778  props = animation.props;
8779 
8780  propFilter( props, animation.opts.specialEasing );
8781 
8782  for ( ; index < length ; index++ ) {
8783  result = animationPrefilters[ index ].call( animation, elem, props, animation.opts );
8784  if ( result ) {
8785  return result;
8786  }
8787  }
8788 
8789  createTweens( animation, props );
8790 
8791  if ( jQuery.isFunction( animation.opts.start ) ) {
8792  animation.opts.start.call( elem, animation );
8793  }
8794 
8795  jQuery.fx.timer(
8796  jQuery.extend( tick, {
8797  elem: elem,
8798  anim: animation,
8799  queue: animation.opts.queue
8800  })
8801  );
8802 
8803  // attach callbacks from options
8804  return animation.progress( animation.opts.progress )
8805  .done( animation.opts.done, animation.opts.complete )
8806  .fail( animation.opts.fail )
8807  .always( animation.opts.always );
8808 }
8809 
8810 function propFilter( props, specialEasing ) {
8811  var value, name, index, easing, hooks;
8812 
8813  // camelCase, specialEasing and expand cssHook pass
8814  for ( index in props ) {
8815  name = jQuery.camelCase( index );
8816  easing = specialEasing[ name ];
8817  value = props[ index ];
8818  if ( jQuery.isArray( value ) ) {
8819  easing = value[ 1 ];
8820  value = props[ index ] = value[ 0 ];
8821  }
8822 
8823  if ( index !== name ) {
8824  props[ name ] = value;
8825  delete props[ index ];
8826  }
8827 
8828  hooks = jQuery.cssHooks[ name ];
8829  if ( hooks && "expand" in hooks ) {
8830  value = hooks.expand( value );
8831  delete props[ name ];
8832 
8833  // not quite $.extend, this wont overwrite keys already present.
8834  // also - reusing 'index' from above because we have the correct "name"
8835  for ( index in value ) {
8836  if ( !( index in props ) ) {
8837  props[ index ] = value[ index ];
8838  specialEasing[ index ] = easing;
8839  }
8840  }
8841  } else {
8842  specialEasing[ name ] = easing;
8843  }
8844  }
8845 }
8846 
8847 jQuery.Animation = jQuery.extend( Animation, {
8848 
8849  tweener: function( props, callback ) {
8850  if ( jQuery.isFunction( props ) ) {
8851  callback = props;
8852  props = [ "*" ];
8853  } else {
8854  props = props.split(" ");
8855  }
8856 
8857  var prop,
8858  index = 0,
8859  length = props.length;
8860 
8861  for ( ; index < length ; index++ ) {
8862  prop = props[ index ];
8863  tweeners[ prop ] = tweeners[ prop ] || [];
8864  tweeners[ prop ].unshift( callback );
8865  }
8866  },
8867 
8868  prefilter: function( callback, prepend ) {
8869  if ( prepend ) {
8870  animationPrefilters.unshift( callback );
8871  } else {
8872  animationPrefilters.push( callback );
8873  }
8874  }
8875 });
8876 
8877 function defaultPrefilter( elem, props, opts ) {
8878  /*jshint validthis:true */
8879  var prop, index, length,
8880  value, dataShow, toggle,
8881  tween, hooks, oldfire,
8882  anim = this,
8883  style = elem.style,
8884  orig = {},
8885  handled = [],
8886  hidden = elem.nodeType && isHidden( elem );
8887 
8888  // handle queue: false promises
8889  if ( !opts.queue ) {
8890  hooks = jQuery._queueHooks( elem, "fx" );
8891  if ( hooks.unqueued == null ) {
8892  hooks.unqueued = 0;
8893  oldfire = hooks.empty.fire;
8894  hooks.empty.fire = function() {
8895  if ( !hooks.unqueued ) {
8896  oldfire();
8897  }
8898  };
8899  }
8900  hooks.unqueued++;
8901 
8902  anim.always(function() {
8903  // doing this makes sure that the complete handler will be called
8904  // before this completes
8905  anim.always(function() {
8906  hooks.unqueued--;
8907  if ( !jQuery.queue( elem, "fx" ).length ) {
8908  hooks.empty.fire();
8909  }
8910  });
8911  });
8912  }
8913 
8914  // height/width overflow pass
8915  if ( elem.nodeType === 1 && ( "height" in props || "width" in props ) ) {
8916  // Make sure that nothing sneaks out
8917  // Record all 3 overflow attributes because IE does not
8918  // change the overflow attribute when overflowX and
8919  // overflowY are set to the same value
8920  opts.overflow = [ style.overflow, style.overflowX, style.overflowY ];
8921 
8922  // Set display property to inline-block for height/width
8923  // animations on inline elements that are having width/height animated
8924  if ( jQuery.css( elem, "display" ) === "inline" &&
8925  jQuery.css( elem, "float" ) === "none" ) {
8926 
8927  // inline-level elements accept inline-block;
8928  // block-level elements need to be inline with layout
8929  if ( !jQuery.support.inlineBlockNeedsLayout || css_defaultDisplay( elem.nodeName ) === "inline" ) {
8930  style.display = "inline-block";
8931 
8932  } else {
8933  style.zoom = 1;
8934  }
8935  }
8936  }
8937 
8938  if ( opts.overflow ) {
8939  style.overflow = "hidden";
8940  if ( !jQuery.support.shrinkWrapBlocks ) {
8941  anim.always(function() {
8942  style.overflow = opts.overflow[ 0 ];
8943  style.overflowX = opts.overflow[ 1 ];
8944  style.overflowY = opts.overflow[ 2 ];
8945  });
8946  }
8947  }
8948 
8949 
8950  // show/hide pass
8951  for ( index in props ) {
8952  value = props[ index ];
8953  if ( rfxtypes.exec( value ) ) {
8954  delete props[ index ];
8955  toggle = toggle || value === "toggle";
8956  if ( value === ( hidden ? "hide" : "show" ) ) {
8957  continue;
8958  }
8959  handled.push( index );
8960  }
8961  }
8962 
8963  length = handled.length;
8964  if ( length ) {
8965  dataShow = jQuery._data( elem, "fxshow" ) || jQuery._data( elem, "fxshow", {} );
8966  if ( "hidden" in dataShow ) {
8967  hidden = dataShow.hidden;
8968  }
8969 
8970  // store state if its toggle - enables .stop().toggle() to "reverse"
8971  if ( toggle ) {
8972  dataShow.hidden = !hidden;
8973  }
8974  if ( hidden ) {
8975  jQuery( elem ).show();
8976  } else {
8977  anim.done(function() {
8978  jQuery( elem ).hide();
8979  });
8980  }
8981  anim.done(function() {
8982  var prop;
8983  jQuery._removeData( elem, "fxshow" );
8984  for ( prop in orig ) {
8985  jQuery.style( elem, prop, orig[ prop ] );
8986  }
8987  });
8988  for ( index = 0 ; index < length ; index++ ) {
8989  prop = handled[ index ];
8990  tween = anim.createTween( prop, hidden ? dataShow[ prop ] : 0 );
8991  orig[ prop ] = dataShow[ prop ] || jQuery.style( elem, prop );
8992 
8993  if ( !( prop in dataShow ) ) {
8994  dataShow[ prop ] = tween.start;
8995  if ( hidden ) {
8996  tween.end = tween.start;
8997  tween.start = prop === "width" || prop === "height" ? 1 : 0;
8998  }
8999  }
9000  }
9001  }
9002 }
9003 
9004 function Tween( elem, options, prop, end, easing ) {
9005  return new Tween.prototype.init( elem, options, prop, end, easing );
9006 }
9007 jQuery.Tween = Tween;
9008 
9009 Tween.prototype = {
9010  constructor: Tween,
9011  init: function( elem, options, prop, end, easing, unit ) {
9012  this.elem = elem;
9013  this.prop = prop;
9014  this.easing = easing || "swing";
9015  this.options = options;
9016  this.start = this.now = this.cur();
9017  this.end = end;
9018  this.unit = unit || ( jQuery.cssNumber[ prop ] ? "" : "px" );
9019  },
9020  cur: function() {
9021  var hooks = Tween.propHooks[ this.prop ];
9022 
9023  return hooks && hooks.get ?
9024  hooks.get( this ) :
9025  Tween.propHooks._default.get( this );
9026  },
9027  run: function( percent ) {
9028  var eased,
9029  hooks = Tween.propHooks[ this.prop ];
9030 
9031  if ( this.options.duration ) {
9032  this.pos = eased = jQuery.easing[ this.easing ](
9033  percent, this.options.duration * percent, 0, 1, this.options.duration
9034  );
9035  } else {
9036  this.pos = eased = percent;
9037  }
9038  this.now = ( this.end - this.start ) * eased + this.start;
9039 
9040  if ( this.options.step ) {
9041  this.options.step.call( this.elem, this.now, this );
9042  }
9043 
9044  if ( hooks && hooks.set ) {
9045  hooks.set( this );
9046  } else {
9047  Tween.propHooks._default.set( this );
9048  }
9049  return this;
9050  }
9051 };
9052 
9053 Tween.prototype.init.prototype = Tween.prototype;
9054 
9055 Tween.propHooks = {
9056  _default: {
9057  get: function( tween ) {
9058  var result;
9059 
9060  if ( tween.elem[ tween.prop ] != null &&
9061  (!tween.elem.style || tween.elem.style[ tween.prop ] == null) ) {
9062  return tween.elem[ tween.prop ];
9063  }
9064 
9065  // passing an empty string as a 3rd parameter to .css will automatically
9066  // attempt a parseFloat and fallback to a string if the parse fails
9067  // so, simple values such as "10px" are parsed to Float.
9068  // complex values such as "rotate(1rad)" are returned as is.
9069  result = jQuery.css( tween.elem, tween.prop, "" );
9070  // Empty strings, null, undefined and "auto" are converted to 0.
9071  return !result || result === "auto" ? 0 : result;
9072  },
9073  set: function( tween ) {
9074  // use step hook for back compat - use cssHook if its there - use .style if its
9075  // available and use plain properties where available
9076  if ( jQuery.fx.step[ tween.prop ] ) {
9077  jQuery.fx.step[ tween.prop ]( tween );
9078  } else if ( tween.elem.style && ( tween.elem.style[ jQuery.cssProps[ tween.prop ] ] != null || jQuery.cssHooks[ tween.prop ] ) ) {
9079  jQuery.style( tween.elem, tween.prop, tween.now + tween.unit );
9080  } else {
9081  tween.elem[ tween.prop ] = tween.now;
9082  }
9083  }
9084  }
9085 };
9086 
9087 // Remove in 2.0 - this supports IE8's panic based approach
9088 // to setting things on disconnected nodes
9089 
9090 Tween.propHooks.scrollTop = Tween.propHooks.scrollLeft = {
9091  set: function( tween ) {
9092  if ( tween.elem.nodeType && tween.elem.parentNode ) {
9093  tween.elem[ tween.prop ] = tween.now;
9094  }
9095  }
9096 };
9097 
9098 jQuery.each([ "toggle", "show", "hide" ], function( i, name ) {
9099  var cssFn = jQuery.fn[ name ];
9100  jQuery.fn[ name ] = function( speed, easing, callback ) {
9101  return speed == null || typeof speed === "boolean" ?
9102  cssFn.apply( this, arguments ) :
9103  this.animate( genFx( name, true ), speed, easing, callback );
9104  };
9105 });
9106 
9107 jQuery.fn.extend({
9108  fadeTo: function( speed, to, easing, callback ) {
9109 
9110  // show any hidden elements after setting opacity to 0
9111  return this.filter( isHidden ).css( "opacity", 0 ).show()
9112 
9113  // animate to the value specified
9114  .end().animate({ opacity: to }, speed, easing, callback );
9115  },
9116  animate: function( prop, speed, easing, callback ) {
9117  var empty = jQuery.isEmptyObject( prop ),
9118  optall = jQuery.speed( speed, easing, callback ),
9119  doAnimation = function() {
9120  // Operate on a copy of prop so per-property easing won't be lost
9121  var anim = Animation( this, jQuery.extend( {}, prop ), optall );
9122  doAnimation.finish = function() {
9123  anim.stop( true );
9124  };
9125  // Empty animations, or finishing resolves immediately
9126  if ( empty || jQuery._data( this, "finish" ) ) {
9127  anim.stop( true );
9128  }
9129  };
9130  doAnimation.finish = doAnimation;
9131 
9132  return empty || optall.queue === false ?
9133  this.each( doAnimation ) :
9134  this.queue( optall.queue, doAnimation );
9135  },
9136  stop: function( type, clearQueue, gotoEnd ) {
9137  var stopQueue = function( hooks ) {
9138  var stop = hooks.stop;
9139  delete hooks.stop;
9140  stop( gotoEnd );
9141  };
9142 
9143  if ( typeof type !== "string" ) {
9144  gotoEnd = clearQueue;
9145  clearQueue = type;
9146  type = undefined;
9147  }
9148  if ( clearQueue && type !== false ) {
9149  this.queue( type || "fx", [] );
9150  }
9151 
9152  return this.each(function() {
9153  var dequeue = true,
9154  index = type != null && type + "queueHooks",
9155  timers = jQuery.timers,
9156  data = jQuery._data( this );
9157 
9158  if ( index ) {
9159  if ( data[ index ] && data[ index ].stop ) {
9160  stopQueue( data[ index ] );
9161  }
9162  } else {
9163  for ( index in data ) {
9164  if ( data[ index ] && data[ index ].stop && rrun.test( index ) ) {
9165  stopQueue( data[ index ] );
9166  }
9167  }
9168  }
9169 
9170  for ( index = timers.length; index--; ) {
9171  if ( timers[ index ].elem === this && (type == null || timers[ index ].queue === type) ) {
9172  timers[ index ].anim.stop( gotoEnd );
9173  dequeue = false;
9174  timers.splice( index, 1 );
9175  }
9176  }
9177 
9178  // start the next in the queue if the last step wasn't forced
9179  // timers currently will call their complete callbacks, which will dequeue
9180  // but only if they were gotoEnd
9181  if ( dequeue || !gotoEnd ) {
9182  jQuery.dequeue( this, type );
9183  }
9184  });
9185  },
9186  finish: function( type ) {
9187  if ( type !== false ) {
9188  type = type || "fx";
9189  }
9190  return this.each(function() {
9191  var index,
9192  data = jQuery._data( this ),
9193  queue = data[ type + "queue" ],
9194  hooks = data[ type + "queueHooks" ],
9195  timers = jQuery.timers,
9196  length = queue ? queue.length : 0;
9197 
9198  // enable finishing flag on private data
9199  data.finish = true;
9200 
9201  // empty the queue first
9202  jQuery.queue( this, type, [] );
9203 
9204  if ( hooks && hooks.cur && hooks.cur.finish ) {
9205  hooks.cur.finish.call( this );
9206  }
9207 
9208  // look for any active animations, and finish them
9209  for ( index = timers.length; index--; ) {
9210  if ( timers[ index ].elem === this && timers[ index ].queue === type ) {
9211  timers[ index ].anim.stop( true );
9212  timers.splice( index, 1 );
9213  }
9214  }
9215 
9216  // look for any animations in the old queue and finish them
9217  for ( index = 0; index < length; index++ ) {
9218  if ( queue[ index ] && queue[ index ].finish ) {
9219  queue[ index ].finish.call( this );
9220  }
9221  }
9222 
9223  // turn off finishing flag
9224  delete data.finish;
9225  });
9226  }
9227 });
9228 
9229 // Generate parameters to create a standard animation
9230 function genFx( type, includeWidth ) {
9231  var which,
9232  attrs = { height: type },
9233  i = 0;
9234 
9235  // if we include width, step value is 1 to do all cssExpand values,
9236  // if we don't include width, step value is 2 to skip over Left and Right
9237  includeWidth = includeWidth? 1 : 0;
9238  for( ; i < 4 ; i += 2 - includeWidth ) {
9239  which = cssExpand[ i ];
9240  attrs[ "margin" + which ] = attrs[ "padding" + which ] = type;
9241  }
9242 
9243  if ( includeWidth ) {
9244  attrs.opacity = attrs.width = type;
9245  }
9246 
9247  return attrs;
9248 }
9249 
9250 // Generate shortcuts for custom animations
9251 jQuery.each({
9252  slideDown: genFx("show"),
9253  slideUp: genFx("hide"),
9254  slideToggle: genFx("toggle"),
9255  fadeIn: { opacity: "show" },
9256  fadeOut: { opacity: "hide" },
9257  fadeToggle: { opacity: "toggle" }
9258 }, function( name, props ) {
9259  jQuery.fn[ name ] = function( speed, easing, callback ) {
9260  return this.animate( props, speed, easing, callback );
9261  };
9262 });
9263 
9264 jQuery.speed = function( speed, easing, fn ) {
9265  var opt = speed && typeof speed === "object" ? jQuery.extend( {}, speed ) : {
9266  complete: fn || !fn && easing ||
9267  jQuery.isFunction( speed ) && speed,
9268  duration: speed,
9269  easing: fn && easing || easing && !jQuery.isFunction( easing ) && easing
9270  };
9271 
9272  opt.duration = jQuery.fx.off ? 0 : typeof opt.duration === "number" ? opt.duration :
9273  opt.duration in jQuery.fx.speeds ? jQuery.fx.speeds[ opt.duration ] : jQuery.fx.speeds._default;
9274 
9275  // normalize opt.queue - true/undefined/null -> "fx"
9276  if ( opt.queue == null || opt.queue === true ) {
9277  opt.queue = "fx";
9278  }
9279 
9280  // Queueing
9281  opt.old = opt.complete;
9282 
9283  opt.complete = function() {
9284  if ( jQuery.isFunction( opt.old ) ) {
9285  opt.old.call( this );
9286  }
9287 
9288  if ( opt.queue ) {
9289  jQuery.dequeue( this, opt.queue );
9290  }
9291  };
9292 
9293  return opt;
9294 };
9295 
9296 jQuery.easing = {
9297  linear: function( p ) {
9298  return p;
9299  },
9300  swing: function( p ) {
9301  return 0.5 - Math.cos( p*Math.PI ) / 2;
9302  }
9303 };
9304 
9305 jQuery.timers = [];
9306 jQuery.fx = Tween.prototype.init;
9307 jQuery.fx.tick = function() {
9308  var timer,
9309  timers = jQuery.timers,
9310  i = 0;
9311 
9312  fxNow = jQuery.now();
9313 
9314  for ( ; i < timers.length; i++ ) {
9315  timer = timers[ i ];
9316  // Checks the timer has not already been removed
9317  if ( !timer() && timers[ i ] === timer ) {
9318  timers.splice( i--, 1 );
9319  }
9320  }
9321 
9322  if ( !timers.length ) {
9323  jQuery.fx.stop();
9324  }
9325  fxNow = undefined;
9326 };
9327 
9328 jQuery.fx.timer = function( timer ) {
9329  if ( timer() && jQuery.timers.push( timer ) ) {
9330  jQuery.fx.start();
9331  }
9332 };
9333 
9334 jQuery.fx.interval = 13;
9335 
9336 jQuery.fx.start = function() {
9337  if ( !timerId ) {
9338  timerId = setInterval( jQuery.fx.tick, jQuery.fx.interval );
9339  }
9340 };
9341 
9342 jQuery.fx.stop = function() {
9343  clearInterval( timerId );
9344  timerId = null;
9345 };
9346 
9347 jQuery.fx.speeds = {
9348  slow: 600,
9349  fast: 200,
9350  // Default speed
9351  _default: 400
9352 };
9353 
9354 // Back Compat <1.8 extension point
9355 jQuery.fx.step = {};
9356 
9357 if ( jQuery.expr && jQuery.expr.filters ) {
9358  jQuery.expr.filters.animated = function( elem ) {
9359  return jQuery.grep(jQuery.timers, function( fn ) {
9360  return elem === fn.elem;
9361  }).length;
9362  };
9363 }
9364 jQuery.fn.offset = function( options ) {
9365  if ( arguments.length ) {
9366  return options === undefined ?
9367  this :
9368  this.each(function( i ) {
9369  jQuery.offset.setOffset( this, options, i );
9370  });
9371  }
9372 
9373  var docElem, win,
9374  box = { top: 0, left: 0 },
9375  elem = this[ 0 ],
9376  doc = elem && elem.ownerDocument;
9377 
9378  if ( !doc ) {
9379  return;
9380  }
9381 
9382  docElem = doc.documentElement;
9383 
9384  // Make sure it's not a disconnected DOM node
9385  if ( !jQuery.contains( docElem, elem ) ) {
9386  return box;
9387  }
9388 
9389  // If we don't have gBCR, just use 0,0 rather than error
9390  // BlackBerry 5, iOS 3 (original iPhone)
9391  if ( typeof elem.getBoundingClientRect !== core_strundefined ) {
9392  box = elem.getBoundingClientRect();
9393  }
9394  win = getWindow( doc );
9395  return {
9396  top: box.top + ( win.pageYOffset || docElem.scrollTop ) - ( docElem.clientTop || 0 ),
9397  left: box.left + ( win.pageXOffset || docElem.scrollLeft ) - ( docElem.clientLeft || 0 )
9398  };
9399 };
9400 
9401 jQuery.offset = {
9402 
9403  setOffset: function( elem, options, i ) {
9404  var position = jQuery.css( elem, "position" );
9405 
9406  // set position first, in-case top/left are set even on static elem
9407  if ( position === "static" ) {
9408  elem.style.position = "relative";
9409  }
9410 
9411  var curElem = jQuery( elem ),
9412  curOffset = curElem.offset(),
9413  curCSSTop = jQuery.css( elem, "top" ),
9414  curCSSLeft = jQuery.css( elem, "left" ),
9415  calculatePosition = ( position === "absolute" || position === "fixed" ) && jQuery.inArray("auto", [curCSSTop, curCSSLeft]) > -1,
9416  props = {}, curPosition = {}, curTop, curLeft;
9417 
9418  // need to be able to calculate position if either top or left is auto and position is either absolute or fixed
9419  if ( calculatePosition ) {
9420  curPosition = curElem.position();
9421  curTop = curPosition.top;
9422  curLeft = curPosition.left;
9423  } else {
9424  curTop = parseFloat( curCSSTop ) || 0;
9425  curLeft = parseFloat( curCSSLeft ) || 0;
9426  }
9427 
9428  if ( jQuery.isFunction( options ) ) {
9429  options = options.call( elem, i, curOffset );
9430  }
9431 
9432  if ( options.top != null ) {
9433  props.top = ( options.top - curOffset.top ) + curTop;
9434  }
9435  if ( options.left != null ) {
9436  props.left = ( options.left - curOffset.left ) + curLeft;
9437  }
9438 
9439  if ( "using" in options ) {
9440  options.using.call( elem, props );
9441  } else {
9442  curElem.css( props );
9443  }
9444  }
9445 };
9446 
9447 
9448 jQuery.fn.extend({
9449 
9450  position: function() {
9451  if ( !this[ 0 ] ) {
9452  return;
9453  }
9454 
9455  var offsetParent, offset,
9456  parentOffset = { top: 0, left: 0 },
9457  elem = this[ 0 ];
9458 
9459  // fixed elements are offset from window (parentOffset = {top:0, left: 0}, because it is it's only offset parent
9460  if ( jQuery.css( elem, "position" ) === "fixed" ) {
9461  // we assume that getBoundingClientRect is available when computed position is fixed
9462  offset = elem.getBoundingClientRect();
9463  } else {
9464  // Get *real* offsetParent
9465  offsetParent = this.offsetParent();
9466 
9467  // Get correct offsets
9468  offset = this.offset();
9469  if ( !jQuery.nodeName( offsetParent[ 0 ], "html" ) ) {
9470  parentOffset = offsetParent.offset();
9471  }
9472 
9473  // Add offsetParent borders
9474  parentOffset.top += jQuery.css( offsetParent[ 0 ], "borderTopWidth", true );
9475  parentOffset.left += jQuery.css( offsetParent[ 0 ], "borderLeftWidth", true );
9476  }
9477 
9478  // Subtract parent offsets and element margins
9479  // note: when an element has margin: auto the offsetLeft and marginLeft
9480  // are the same in Safari causing offset.left to incorrectly be 0
9481  return {
9482  top: offset.top - parentOffset.top - jQuery.css( elem, "marginTop", true ),
9483  left: offset.left - parentOffset.left - jQuery.css( elem, "marginLeft", true)
9484  };
9485  },
9486 
9487  offsetParent: function() {
9488  return this.map(function() {
9489  var offsetParent = this.offsetParent || document.documentElement;
9490  while ( offsetParent && ( !jQuery.nodeName( offsetParent, "html" ) && jQuery.css( offsetParent, "position") === "static" ) ) {
9491  offsetParent = offsetParent.offsetParent;
9492  }
9493  return offsetParent || document.documentElement;
9494  });
9495  }
9496 });
9497 
9498 
9499 // Create scrollLeft and scrollTop methods
9500 jQuery.each( {scrollLeft: "pageXOffset", scrollTop: "pageYOffset"}, function( method, prop ) {
9501  var top = /Y/.test( prop );
9502 
9503  jQuery.fn[ method ] = function( val ) {
9504  return jQuery.access( this, function( elem, method, val ) {
9505  var win = getWindow( elem );
9506 
9507  if ( val === undefined ) {
9508  return win ? (prop in win) ? win[ prop ] :
9509  win.document.documentElement[ method ] :
9510  elem[ method ];
9511  }
9512 
9513  if ( win ) {
9514  win.scrollTo(
9515  !top ? val : jQuery( win ).scrollLeft(),
9516  top ? val : jQuery( win ).scrollTop()
9517  );
9518 
9519  } else {
9520  elem[ method ] = val;
9521  }
9522  }, method, val, arguments.length, null );
9523  };
9524 });
9525 
9526 function getWindow( elem ) {
9527  return jQuery.isWindow( elem ) ?
9528  elem :
9529  elem.nodeType === 9 ?
9530  elem.defaultView || elem.parentWindow :
9531  false;
9532 }
9533 // Create innerHeight, innerWidth, height, width, outerHeight and outerWidth methods
9534 jQuery.each( { Height: "height", Width: "width" }, function( name, type ) {
9535  jQuery.each( { padding: "inner" + name, content: type, "": "outer" + name }, function( defaultExtra, funcName ) {
9536  // margin is only for outerHeight, outerWidth
9537  jQuery.fn[ funcName ] = function( margin, value ) {
9538  var chainable = arguments.length && ( defaultExtra || typeof margin !== "boolean" ),
9539  extra = defaultExtra || ( margin === true || value === true ? "margin" : "border" );
9540 
9541  return jQuery.access( this, function( elem, type, value ) {
9542  var doc;
9543 
9544  if ( jQuery.isWindow( elem ) ) {
9545  // As of 5/8/2012 this will yield incorrect results for Mobile Safari, but there
9546  // isn't a whole lot we can do. See pull request at this URL for discussion:
9547  // https://github.com/jquery/jquery/pull/764
9548  return elem.document.documentElement[ "client" + name ];
9549  }
9550 
9551  // Get document width or height
9552  if ( elem.nodeType === 9 ) {
9553  doc = elem.documentElement;
9554 
9555  // Either scroll[Width/Height] or offset[Width/Height] or client[Width/Height], whichever is greatest
9556  // unfortunately, this causes bug #3838 in IE6/8 only, but there is currently no good, small way to fix it.
9557  return Math.max(
9558  elem.body[ "scroll" + name ], doc[ "scroll" + name ],
9559  elem.body[ "offset" + name ], doc[ "offset" + name ],
9560  doc[ "client" + name ]
9561  );
9562  }
9563 
9564  return value === undefined ?
9565  // Get width or height on the element, requesting but not forcing parseFloat
9566  jQuery.css( elem, type, extra ) :
9567 
9568  // Set width or height on the element
9569  jQuery.style( elem, type, value, extra );
9570  }, type, chainable ? margin : undefined, chainable, null );
9571  };
9572  });
9573 });
9574 // Limit scope pollution from any deprecated API
9575 // (function() {
9576 
9577 // })();
9578 // Expose jQuery to the global object
9579 window.jQuery = window.$ = jQuery;
9580 
9581 // Expose jQuery as an AMD module, but only for AMD loaders that
9582 // understand the issues with loading multiple versions of jQuery
9583 // in a page that all might call define(). The loader will indicate
9584 // they have special allowances for multiple jQuery versions by
9585 // specifying define.amd.jQuery = true. Register as a named module,
9586 // since jQuery can be concatenated with other files that may use define,
9587 // but not use a proper concatenation script that understands anonymous
9588 // AMD modules. A named AMD is safest and most robust way to register.
9589 // Lowercase jquery is used because AMD module names are derived from
9590 // file names, and jQuery is normally delivered in a lowercase file name.
9591 // Do this after creating the global so that if an AMD module wants to call
9592 // noConflict to hide this version of jQuery, it will work.
9593 if ( typeof define === "function" && define.amd && define.amd.jQuery ) {
9594  define( "jquery", [], function () { return jQuery; } );
9595 }
9596 
9597 })( window );