[ Index ]

PHP Cross Reference of vtigercrm-6.1.0

title

Body

[close]

/libraries/jquery/defunkt-jquery-pjax/test/ -> jquery-1.7.2.js (source)

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


Generated: Fri Nov 28 20:08:37 2014 Cross-referenced by PHPXref 0.7.1