jquery-1.3.2-vsdoc2.js
上传用户:zhl0745
上传日期:2022-04-11
资源大小:128k
文件大小:189k
源码类别:

行业应用

开发平台:

Java

  1. /*
  2.  * This file has been commented to support Visual Studio Intellisense.
  3.  * You should not use this file at runtime inside the browser--it is only
  4.  * intended to be used only for design-time IntelliSense.  Please use the
  5.  * standard jQuery library for all production use.
  6.  *
  7.  * Comment version: 1.3.2b
  8.  */
  9. /*
  10.  * jQuery JavaScript Library v1.3.2
  11.  * http://jquery.com/
  12.  *
  13.  * Copyright (c) 2009 John Resig
  14.  *
  15.  * Permission is hereby granted, free of charge, to any person obtaining
  16.  * a copy of this software and associated documentation files (the
  17.  * "Software"), to deal in the Software without restriction, including
  18.  * without limitation the rights to use, copy, modify, merge, publish,
  19.  * distribute, sublicense, and/or sell copies of the Software, and to
  20.  * permit persons to whom the Software is furnished to do so, subject to
  21.  * the following conditions:
  22.  *
  23.  * The above copyright notice and this permission notice shall be
  24.  * included in all copies or substantial portions of the Software.
  25.  *
  26.  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
  27.  * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
  28.  * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
  29.  * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
  30.  * LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
  31.  * OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
  32.  * WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
  33.  *
  34.  * Date: 2009-02-19 17:34:21 -0500 (Thu, 19 Feb 2009)
  35.  * Revision: 6246
  36.  */
  37. (function(){
  38. var 
  39. // Will speed up references to window, and allows munging its name.
  40. window = this,
  41. // Will speed up references to undefined, and allows munging its name.
  42. undefined,
  43. // Map over jQuery in case of overwrite
  44. _jQuery = window.jQuery,
  45. // Map over the $ in case of overwrite
  46. _$ = window.$,
  47. jQuery = window.jQuery = window.$ = function(selector, context) {
  48.         /// <summary>
  49.         /// 1: $(expression, context) - This function accepts a string containing a CSS selector which is then used to match a set of elements.
  50.         /// 2: $(html) - Create DOM elements on-the-fly from the provided String of raw HTML.
  51.         /// 3: $(elements) - Wrap jQuery functionality around a single or multiple DOM Element(s).
  52.         /// 4: $(callback) - A shorthand for $(document).ready().
  53.         /// </summary>
  54.         /// <param name="selector" type="String">
  55.         /// 1: expression - An expression to search with.
  56.         /// 2: html - A string of HTML to create on the fly.
  57.         /// 3: elements - DOM element(s) to be encapsulated by a jQuery object.
  58.         /// 4: callback - The function to execute when the DOM is ready.
  59.         /// </param>
  60.         /// <param name="context" type="jQuery">
  61.         /// 1: context - A DOM Element, Document or jQuery to use as context.
  62.         /// </param>
  63.         /// <field name="selector" Type="Object">
  64.         ///     The DOM node context originally passed to jQuery() (if none was passed then context will be equal to the document).
  65.         /// </field>
  66.         /// <field name="context" Type="String">
  67.         ///     A selector representing selector originally passed to jQuery().
  68.         /// </field>
  69.         /// <returns type="jQuery" />
  70. // The jQuery object is actually just the init constructor 'enhanced'
  71. return new jQuery.fn.init( selector, context );
  72. },
  73. // A simple way to check for HTML strings or ID strings
  74. // (both of which we optimize for)
  75. quickExpr = /^[^<]*(<(.|s)+>)[^>]*$|^#([w-]+)$/,
  76. // Is it a simple selector
  77. isSimple = /^.[^:#[.,]*$/;
  78. jQuery.fn = jQuery.prototype = {
  79. init: function( selector, context ) {
  80. /// <summary>
  81. /// 1: $(expression, context) - This function accepts a string containing a CSS selector which is then used to match a set of elements.
  82. /// 2: $(html) - Create DOM elements on-the-fly from the provided String of raw HTML.
  83. /// 3: $(elements) - Wrap jQuery functionality around a single or multiple DOM Element(s).
  84. /// 4: $(callback) - A shorthand for $(document).ready().
  85. /// </summary>
  86. /// <param name="selector" type="String">
  87. /// 1: expression - An expression to search with.
  88. /// 2: html - A string of HTML to create on the fly.
  89. /// 3: elements - DOM element(s) to be encapsulated by a jQuery object.
  90. /// 4: callback - The function to execute when the DOM is ready.
  91. /// </param>
  92. /// <param name="context" type="jQuery">
  93. /// 1: context - A DOM Element, Document or jQuery to use as context.
  94. /// </param>
  95. /// <returns type="jQuery" />
  96. // Make sure that a selection was provided
  97. selector = selector || document;
  98. // Handle $(DOMElement)
  99. if ( selector.nodeType ) {
  100. this[0] = selector;
  101. this.length = 1;
  102. this.context = selector;
  103. return this;
  104. }
  105. // Handle HTML strings
  106. if (typeof selector === "string") {
  107.     // Are we dealing with HTML string or an ID?
  108.     var match = quickExpr.exec(selector);
  109.     // Verify a match, and that no context was specified for #id
  110.     if (match && (match[1] || !context)) {
  111.         // HANDLE: $(html) -> $(array)
  112.         if (match[1])
  113.             selector = jQuery.clean([match[1]], context);
  114.         // HANDLE: $("#id")
  115.         else {
  116.             var elem = document.getElementById(match[3]);
  117.             // Handle the case where IE and Opera return items
  118.             // by name instead of ID
  119.             if (elem && elem.id != match[3])
  120.                 return jQuery().find(selector);
  121.             // Otherwise, we inject the element directly into the jQuery object
  122.             var ret = jQuery(elem || []);
  123.             ret.context = document;
  124.             ret.selector = selector;
  125.             return ret;
  126.         }
  127.         // HANDLE: $(expr, [context])
  128.         // (which is just equivalent to: $(content).find(expr)
  129.     } else
  130.         return jQuery(context).find(selector);
  131.     // HANDLE: $(function)
  132.     // Shortcut for document ready
  133. } else if ( jQuery.isFunction( selector ) )
  134. return jQuery( document ).ready( selector );
  135. // Make sure that old selector state is passed along
  136. if ( selector.selector && selector.context ) {
  137. this.selector = selector.selector;
  138. this.context = selector.context;
  139. }
  140. return this.setArray(jQuery.isArray( selector ) ?
  141. selector :
  142. jQuery.makeArray(selector));
  143. },
  144. // Start with an empty selector
  145. selector: "",
  146. // The current version of jQuery being used
  147. jquery: "1.3.2",
  148. // The number of elements contained in the matched element set
  149. size: function() {
  150. /// <summary>
  151. /// The number of elements currently matched.
  152. /// Part of Core
  153. /// </summary>
  154. /// <returns type="Number" />
  155. return this.length;
  156. },
  157. // Get the Nth element in the matched element set OR
  158. // Get the whole matched element set as a clean array
  159. get: function( num ) {
  160. /// <summary>
  161. /// Access a single matched element. num is used to access the
  162. /// Nth element matched.
  163. /// Part of Core
  164. /// </summary>
  165. /// <returns type="Element" />
  166. /// <param name="num" type="Number">
  167. /// Access the element in the Nth position.
  168. /// </param>
  169. return num == undefined ?
  170. // Return a 'clean' array
  171. Array.prototype.slice.call( this ) :
  172. // Return just the object
  173. this[ num ];
  174. },
  175. // Take an array of elements and push it onto the stack
  176. // (returning the new matched element set)
  177. pushStack: function( elems, name, selector ) {
  178. /// <summary>
  179. /// Set the jQuery object to an array of elements, while maintaining
  180. /// the stack.
  181. /// Part of Core
  182. /// </summary>
  183. /// <returns type="jQuery" />
  184. /// <param name="elems" type="Elements">
  185. /// An array of elements
  186. /// </param>
  187. // Build a new jQuery matched element set
  188. var ret = jQuery( elems );
  189. // Add the old object onto the stack (as a reference)
  190. ret.prevObject = this;
  191. ret.context = this.context;
  192. if ( name === "find" )
  193. ret.selector = this.selector + (this.selector ? " " : "") + selector;
  194. else if ( name )
  195. ret.selector = this.selector + "." + name + "(" + selector + ")";
  196. // Return the newly-formed element set
  197. return ret;
  198. },
  199. // Force the current matched set of elements to become
  200. // the specified array of elements (destroying the stack in the process)
  201. // You should use pushStack() in order to do this, but maintain the stack
  202. setArray: function( elems ) {
  203. /// <summary>
  204. /// Set the jQuery object to an array of elements. This operation is
  205. /// completely destructive - be sure to use .pushStack() if you wish to maintain
  206. /// the jQuery stack.
  207. /// Part of Core
  208. /// </summary>
  209. /// <returns type="jQuery" />
  210. /// <param name="elems" type="Elements">
  211. /// An array of elements
  212. /// </param>
  213. // Resetting the length to 0, then using the native Array push
  214. // is a super-fast way to populate an object with array-like properties
  215. this.length = 0;
  216. Array.prototype.push.apply( this, elems );
  217. return this;
  218. },
  219. // Execute a callback for every element in the matched set.
  220. // (You can seed the arguments with an array of args, but this is
  221. // only used internally.)
  222. each: function( callback, args ) {
  223. /// <summary>
  224. /// Execute a function within the context of every matched element.
  225. /// This means that every time the passed-in function is executed
  226. /// (which is once for every element matched) the 'this' keyword
  227. /// points to the specific element.
  228. /// Additionally, the function, when executed, is passed a single
  229. /// argument representing the position of the element in the matched
  230. /// set.
  231. /// Part of Core
  232. /// </summary>
  233. /// <returns type="jQuery" />
  234. /// <param name="callback" type="Function">
  235. /// A function to execute
  236. /// </param>
  237. return jQuery.each( this, callback, args );
  238. },
  239. // Determine the position of an element within
  240. // the matched set of elements
  241. index: function( elem ) {
  242. /// <summary>
  243. /// Searches every matched element for the object and returns
  244. /// the index of the element, if found, starting with zero. 
  245. /// Returns -1 if the object wasn't found.
  246. /// Part of Core
  247. /// </summary>
  248. /// <returns type="Number" />
  249. /// <param name="elem" type="Element">
  250. /// Object to search for
  251. /// </param>
  252. // Locate the position of the desired element
  253. return jQuery.inArray(
  254. // If it receives a jQuery object, the first element is used
  255. elem && elem.jquery ? elem[0] : elem
  256. , this );
  257. },
  258. attr: function( name, value, type ) {
  259. /// <summary>
  260. /// Set a single property to a computed value, on all matched elements.
  261. /// Instead of a value, a function is provided, that computes the value.
  262. /// Part of DOM/Attributes
  263. /// </summary>
  264. /// <returns type="jQuery" />
  265. /// <param name="name" type="String">
  266. /// The name of the property to set.
  267. /// </param>
  268. /// <param name="value" type="Function">
  269. /// A function returning the value to set.
  270. /// </param>
  271. var options = name;
  272. // Look for the case where we're accessing a style value
  273. if ( typeof name === "string" )
  274. if ( value === undefined )
  275. return this[0] && jQuery[ type || "attr" ]( this[0], name );
  276. else {
  277. options = {};
  278. options[ name ] = value;
  279. }
  280. // Check to see if we're setting style values
  281. return this.each(function(i){
  282. // Set all the styles
  283. for ( name in options )
  284. jQuery.attr(
  285. type ?
  286. this.style :
  287. this,
  288. name, jQuery.prop( this, options[ name ], type, i, name )
  289. );
  290. });
  291. },
  292. css: function( key, value ) {
  293. /// <summary>
  294. /// Set a single style property to a value, on all matched elements.
  295. /// If a number is provided, it is automatically converted into a pixel value.
  296. /// Part of CSS
  297. /// </summary>
  298. /// <returns type="jQuery" />
  299. /// <param name="key" type="String">
  300. /// The name of the property to set.
  301. /// </param>
  302. /// <param name="value" type="String">
  303. /// The value to set the property to.
  304. /// </param>
  305. // ignore negative width and height values
  306. if ( (key == 'width' || key == 'height') && parseFloat(value) < 0 )
  307. value = undefined;
  308. return this.attr( key, value, "curCSS" );
  309. },
  310. text: function( text ) {
  311. /// <summary>
  312. /// Set the text contents of all matched elements.
  313. /// Similar to html(), but escapes HTML (replace &quot;&lt;&quot; and &quot;&gt;&quot; with their
  314. /// HTML entities).
  315. /// Part of DOM/Attributes
  316. /// </summary>
  317. /// <returns type="String" />
  318. /// <param name="text" type="String">
  319. /// The text value to set the contents of the element to.
  320. /// </param>
  321. if ( typeof text !== "object" && text != null )
  322. return this.empty().append( (this[0] && this[0].ownerDocument || document).createTextNode( text ) );
  323. var ret = "";
  324. jQuery.each( text || this, function(){
  325. jQuery.each( this.childNodes, function(){
  326. if ( this.nodeType != 8 )
  327. ret += this.nodeType != 1 ?
  328. this.nodeValue :
  329. jQuery.fn.text( [ this ] );
  330. });
  331. });
  332. return ret;
  333. },
  334. wrapAll: function( html ) {
  335. /// <summary>
  336. /// Wrap all matched elements with a structure of other elements.
  337. /// This wrapping process is most useful for injecting additional
  338. /// stucture into a document, without ruining the original semantic
  339. /// qualities of a document.
  340. /// This works by going through the first element
  341. /// provided and finding the deepest ancestor element within its
  342. /// structure - it is that element that will en-wrap everything else.
  343. /// This does not work with elements that contain text. Any necessary text
  344. /// must be added after the wrapping is done.
  345. /// Part of DOM/Manipulation
  346. /// </summary>
  347. /// <returns type="jQuery" />
  348. /// <param name="html" type="Element">
  349. /// A DOM element that will be wrapped around the target.
  350. /// </param>
  351. if ( this[0] ) {
  352. // The elements to wrap the target around
  353. var wrap = jQuery( html, this[0].ownerDocument ).clone();
  354. if ( this[0].parentNode )
  355. wrap.insertBefore( this[0] );
  356. wrap.map(function(){
  357. var elem = this;
  358. while ( elem.firstChild )
  359. elem = elem.firstChild;
  360. return elem;
  361. }).append(this);
  362. }
  363. return this;
  364. },
  365. wrapInner: function( html ) {
  366. /// <summary>
  367. /// Wraps the inner child contents of each matched elemenht (including text nodes) with an HTML structure.
  368. /// </summary>
  369. /// <param name="html" type="String">
  370. /// A string of HTML or a DOM element that will be wrapped around the target contents.
  371. /// </param>
  372. /// <returns type="jQuery" />
  373. return this.each(function(){
  374. jQuery( this ).contents().wrapAll( html );
  375. });
  376. },
  377. wrap: function( html ) {
  378. /// <summary>
  379. /// Wrap all matched elements with a structure of other elements.
  380. /// This wrapping process is most useful for injecting additional
  381. /// stucture into a document, without ruining the original semantic
  382. /// qualities of a document.
  383. /// This works by going through the first element
  384. /// provided and finding the deepest ancestor element within its
  385. /// structure - it is that element that will en-wrap everything else.
  386. /// This does not work with elements that contain text. Any necessary text
  387. /// must be added after the wrapping is done.
  388. /// Part of DOM/Manipulation
  389. /// </summary>
  390. /// <returns type="jQuery" />
  391. /// <param name="html" type="Element">
  392. /// A DOM element that will be wrapped around the target.
  393. /// </param>
  394. return this.each(function(){
  395. jQuery( this ).wrapAll( html );
  396. });
  397. },
  398. append: function() {
  399. /// <summary>
  400. /// Append content to the inside of every matched element.
  401. /// This operation is similar to doing an appendChild to all the
  402. /// specified elements, adding them into the document.
  403. /// Part of DOM/Manipulation
  404. /// </summary>
  405. /// <returns type="jQuery" />
  406. /// <param name="content" type="Content">
  407. /// Content to append to the target
  408. /// </param>
  409. return this.domManip(arguments, true, function(elem){
  410. if (this.nodeType == 1)
  411. this.appendChild( elem );
  412. });
  413. },
  414. prepend: function() {
  415. /// <summary>
  416. /// Prepend content to the inside of every matched element.
  417. /// This operation is the best way to insert elements
  418. /// inside, at the beginning, of all matched elements.
  419. /// Part of DOM/Manipulation
  420. /// </summary>
  421. /// <returns type="jQuery" />
  422. /// <param name="" type="Content">
  423. /// Content to prepend to the target.
  424. /// </param>
  425. return this.domManip(arguments, true, function(elem){
  426. if (this.nodeType == 1)
  427. this.insertBefore( elem, this.firstChild );
  428. });
  429. },
  430. before: function() {
  431. /// <summary>
  432. /// Insert content before each of the matched elements.
  433. /// Part of DOM/Manipulation
  434. /// </summary>
  435. /// <returns type="jQuery" />
  436. /// <param name="" type="Content">
  437. /// Content to insert before each target.
  438. /// </param>
  439. return this.domManip(arguments, false, function(elem){
  440. this.parentNode.insertBefore( elem, this );
  441. });
  442. },
  443. after: function() {
  444. /// <summary>
  445. /// Insert content after each of the matched elements.
  446. /// Part of DOM/Manipulation
  447. /// </summary>
  448. /// <returns type="jQuery" />
  449. /// <param name="" type="Content">
  450. /// Content to insert after each target.
  451. /// </param>
  452. return this.domManip(arguments, false, function(elem){
  453. this.parentNode.insertBefore( elem, this.nextSibling );
  454. });
  455. },
  456. end: function() {
  457. /// <summary>
  458. /// End the most recent 'destructive' operation, reverting the list of matched elements
  459. /// back to its previous state. After an end operation, the list of matched elements will
  460. /// revert to the last state of matched elements.
  461. /// If there was no destructive operation before, an empty set is returned.
  462. /// Part of DOM/Traversing
  463. /// </summary>
  464. /// <returns type="jQuery" />
  465. return this.prevObject || jQuery( [] );
  466. },
  467. // For internal use only.
  468. // Behaves like an Array's method, not like a jQuery method.
  469. push: [].push,
  470. sort: [].sort,
  471. splice: [].splice,
  472. find: function( selector ) {
  473. /// <summary>
  474. /// Searches for all elements that match the specified expression.
  475. /// This method is a good way to find additional descendant
  476. /// elements with which to process.
  477. /// All searching is done using a jQuery expression. The expression can be
  478. /// written using CSS 1-3 Selector syntax, or basic XPath.
  479. /// Part of DOM/Traversing
  480. /// </summary>
  481. /// <returns type="jQuery" />
  482. /// <param name="selector" type="String">
  483. /// An expression to search with.
  484. /// </param>
  485. /// <returns type="jQuery" />
  486. if ( this.length === 1 ) {
  487. var ret = this.pushStack( [], "find", selector );
  488. ret.length = 0;
  489. jQuery.find( selector, this[0], ret );
  490. return ret;
  491. } else {
  492. return this.pushStack( jQuery.unique(jQuery.map(this, function(elem){
  493. return jQuery.find( selector, elem );
  494. })), "find", selector );
  495. }
  496. },
  497. clone: function( events ) {
  498. /// <summary>
  499. /// Clone matched DOM Elements and select the clones. 
  500. /// This is useful for moving copies of the elements to another
  501. /// location in the DOM.
  502. /// Part of DOM/Manipulation
  503. /// </summary>
  504. /// <returns type="jQuery" />
  505. /// <param name="deep" type="Boolean" optional="true">
  506. /// (Optional) Set to false if you don't want to clone all descendant nodes, in addition to the element itself.
  507. /// </param>
  508. // Do the clone
  509. var ret = this.map(function(){
  510. if ( !jQuery.support.noCloneEvent && !jQuery.isXMLDoc(this) ) {
  511. // IE copies events bound via attachEvent when
  512. // using cloneNode. Calling detachEvent on the
  513. // clone will also remove the events from the orignal
  514. // In order to get around this, we use innerHTML.
  515. // Unfortunately, this means some modifications to
  516. // attributes in IE that are actually only stored
  517. // as properties will not be copied (such as the
  518. // the name attribute on an input).
  519. var html = this.outerHTML;
  520. if ( !html ) {
  521. var div = this.ownerDocument.createElement("div");
  522. div.appendChild( this.cloneNode(true) );
  523. html = div.innerHTML;
  524. }
  525. return jQuery.clean([html.replace(/ jQueryd+="(?:d+|null)"/g, "").replace(/^s*/, "")])[0];
  526. } else
  527. return this.cloneNode(true);
  528. });
  529. // Copy the events from the original to the clone
  530. if ( events === true ) {
  531. var orig = this.find("*").andSelf(), i = 0;
  532. ret.find("*").andSelf().each(function(){
  533. if ( this.nodeName !== orig[i].nodeName )
  534. return;
  535. var events = jQuery.data( orig[i], "events" );
  536. for ( var type in events ) {
  537. for ( var handler in events[ type ] ) {
  538. jQuery.event.add( this, type, events[ type ][ handler ], events[ type ][ handler ].data );
  539. }
  540. }
  541. i++;
  542. });
  543. }
  544. // Return the cloned set
  545. return ret;
  546. },
  547. filter: function( selector ) {
  548. /// <summary>
  549. /// Removes all elements from the set of matched elements that do not
  550. /// pass the specified filter. This method is used to narrow down
  551. /// the results of a search.
  552. /// })
  553. /// Part of DOM/Traversing
  554. /// </summary>
  555. /// <returns type="jQuery" />
  556. /// <param name="selector" type="Function">
  557. /// A function to use for filtering
  558. /// </param>
  559. /// <returns type="jQuery" />
  560. return this.pushStack(
  561. jQuery.isFunction( selector ) &&
  562. jQuery.grep(this, function(elem, i){
  563. return selector.call( elem, i );
  564. }) ||
  565. jQuery.multiFilter( selector, jQuery.grep(this, function(elem){
  566. return elem.nodeType === 1;
  567. }) ), "filter", selector );
  568. },
  569. closest: function( selector ) {
  570. /// <summary>
  571. /// Get a set of elements containing the closest parent element that matches the specified selector, the starting element included.
  572. /// </summary>
  573. /// <returns type="jQuery" />
  574. /// <param name="selector" type="Function">
  575. /// An expression to filter the elements with.
  576. /// </param>
  577. /// <returns type="jQuery" />
  578. var pos = jQuery.expr.match.POS.test( selector ) ? jQuery(selector) : null,
  579. closer = 0;
  580. return this.map(function(){
  581. var cur = this;
  582. while ( cur && cur.ownerDocument ) {
  583. if ( pos ? pos.index(cur) > -1 : jQuery(cur).is(selector) ) {
  584. jQuery.data(cur, "closest", closer);
  585. return cur;
  586. }
  587. cur = cur.parentNode;
  588. closer++;
  589. }
  590. });
  591. },
  592. not: function( selector ) {
  593. /// <summary>
  594. /// Removes any elements inside the array of elements from the set
  595. /// of matched elements. This method is used to remove one or more
  596. /// elements from a jQuery object.
  597. /// Part of DOM/Traversing
  598. /// </summary>
  599. /// <param name="selector" type="jQuery">
  600. /// A set of elements to remove from the jQuery set of matched elements.
  601. /// </param>
  602. /// <returns type="jQuery" />
  603. if ( typeof selector === "string" )
  604. // test special case where just one selector is passed in
  605. if ( isSimple.test( selector ) )
  606. return this.pushStack( jQuery.multiFilter( selector, this, true ), "not", selector );
  607. else
  608. selector = jQuery.multiFilter( selector, this );
  609. var isArrayLike = selector.length && selector[selector.length - 1] !== undefined && !selector.nodeType;
  610. return this.filter(function() {
  611. return isArrayLike ? jQuery.inArray( this, selector ) < 0 : this != selector;
  612. });
  613. },
  614. add: function( selector ) {
  615. /// <summary>
  616. /// Adds one or more Elements to the set of matched elements.
  617. /// Part of DOM/Traversing
  618. /// </summary>
  619. /// <param name="elements" type="Element">
  620. /// One or more Elements to add
  621. /// </param>
  622. /// <returns type="jQuery" />
  623. return this.pushStack( jQuery.unique( jQuery.merge(
  624. this.get(),
  625. typeof selector === "string" ?
  626. jQuery( selector ) :
  627. jQuery.makeArray( selector )
  628. )));
  629. },
  630. is: function( selector ) {
  631. /// <summary>
  632. /// Checks the current selection against an expression and returns true,
  633. /// if at least one element of the selection fits the given expression.
  634. /// Does return false, if no element fits or the expression is not valid.
  635. /// filter(String) is used internally, therefore all rules that apply there
  636. /// apply here, too.
  637. /// Part of DOM/Traversing
  638. /// </summary>
  639. /// <returns type="Boolean" />
  640. /// <param name="expr" type="String">
  641. ///  The expression with which to filter
  642. /// </param>
  643. return !!selector && jQuery.multiFilter( selector, this ).length > 0;
  644. },
  645. hasClass: function( selector ) {
  646. /// <summary>
  647. /// Checks the current selection against a class and returns whether at least one selection has a given class.
  648. /// </summary>
  649. /// <param name="selector" type="String">The class to check against</param>
  650. /// <returns type="Boolean">True if at least one element in the selection has the class, otherwise false.</returns>
  651. return !!selector && this.is( "." + selector );
  652. },
  653. val: function( value ) {
  654. /// <summary>
  655. /// Set the value of every matched element.
  656. /// Part of DOM/Attributes
  657. /// </summary>
  658. /// <returns type="jQuery" />
  659. /// <param name="val" type="String">
  660. ///  Set the property to the specified value.
  661. /// </param>
  662. if ( value === undefined ) {
  663. var elem = this[0];
  664. if ( elem ) {
  665. if( jQuery.nodeName( elem, 'option' ) )
  666. return (elem.attributes.value || {}).specified ? elem.value : elem.text;
  667. // We need to handle select boxes special
  668. if ( jQuery.nodeName( elem, "select" ) ) {
  669. var index = elem.selectedIndex,
  670. values = [],
  671. options = elem.options,
  672. one = elem.type == "select-one";
  673. // Nothing was selected
  674. if ( index < 0 )
  675. return null;
  676. // Loop through all the selected options
  677. for ( var i = one ? index : 0, max = one ? index + 1 : options.length; i < max; i++ ) {
  678. var option = options[ i ];
  679. if ( option.selected ) {
  680. // Get the specifc value for the option
  681. value = jQuery(option).val();
  682. // We don't need an array for one selects
  683. if ( one )
  684. return value;
  685. // Multi-Selects return an array
  686. values.push( value );
  687. }
  688. }
  689. return values;
  690. }
  691. // Everything else, we just grab the value
  692. return (elem.value || "").replace(/r/g, "");
  693. }
  694. return undefined;
  695. }
  696. if ( typeof value === "number" )
  697. value += '';
  698. return this.each(function(){
  699. if ( this.nodeType != 1 )
  700. return;
  701. if ( jQuery.isArray(value) && /radio|checkbox/.test( this.type ) )
  702. this.checked = (jQuery.inArray(this.value, value) >= 0 ||
  703. jQuery.inArray(this.name, value) >= 0);
  704. else if ( jQuery.nodeName( this, "select" ) ) {
  705. var values = jQuery.makeArray(value);
  706. jQuery( "option", this ).each(function(){
  707. this.selected = (jQuery.inArray( this.value, values ) >= 0 ||
  708. jQuery.inArray( this.text, values ) >= 0);
  709. });
  710. if ( !values.length )
  711. this.selectedIndex = -1;
  712. } else
  713. this.value = value;
  714. });
  715. },
  716. html: function( value ) {
  717. /// <summary>
  718. /// Set the html contents of every matched element.
  719. /// This property is not available on XML documents.
  720. /// Part of DOM/Attributes
  721. /// </summary>
  722. /// <returns type="jQuery" />
  723. /// <param name="val" type="String">
  724. ///  Set the html contents to the specified value.
  725. /// </param>
  726. return value === undefined ?
  727. (this[0] ?
  728. this[0].innerHTML.replace(/ jQueryd+="(?:d+|null)"/g, "") :
  729. null) :
  730. this.empty().append( value );
  731. },
  732. replaceWith: function( value ) {
  733. /// <summary>
  734. /// Replaces all matched element with the specified HTML or DOM elements.
  735. /// </summary>
  736. /// <param name="value" type="String">
  737. /// The content with which to replace the matched elements.
  738. /// </param>
  739. /// <returns type="jQuery">The element that was just replaced.</returns>
  740. return this.after( value ).remove();
  741. },
  742. eq: function( i ) {
  743. /// <summary>
  744. /// Reduce the set of matched elements to a single element.
  745. /// The position of the element in the set of matched elements
  746. /// starts at 0 and goes to length - 1.
  747. /// Part of Core
  748. /// </summary>
  749. /// <returns type="jQuery" />
  750. /// <param name="num" type="Number">
  751. /// pos The index of the element that you wish to limit to.
  752. /// </param>
  753. return this.slice( i, +i + 1 );
  754. },
  755. slice: function() {
  756. /// <summary>
  757. /// Selects a subset of the matched elements.  Behaves exactly like the built-in Array slice method.
  758. /// </summary>
  759. /// <param name="start" type="Number" integer="true">Where to start the subset (0-based).</param>
  760. /// <param name="end" optional="true" type="Number" integer="true">Where to end the subset (not including the end element itself).
  761. /// If omitted, ends at the end of the selection</param>
  762. /// <returns type="jQuery">The sliced elements</returns>
  763. return this.pushStack( Array.prototype.slice.apply( this, arguments ),
  764. "slice", Array.prototype.slice.call(arguments).join(",") );
  765. },
  766. map: function( callback ) {
  767. /// <summary>
  768. /// This member is internal.
  769. /// </summary>
  770. /// <private />
  771. /// <returns type="jQuery" />
  772. return this.pushStack( jQuery.map(this, function(elem, i){
  773. return callback.call( elem, i, elem );
  774. }));
  775. },
  776. andSelf: function() {
  777. /// <summary>
  778. /// Adds the previous selection to the current selection.
  779. /// </summary>
  780. /// <returns type="jQuery" />
  781. return this.add( this.prevObject );
  782. },
  783. domManip: function( args, table, callback ) {
  784. /// <param name="args" type="Array">
  785. ///  Args
  786. /// </param>
  787. /// <param name="table" type="Boolean">
  788. ///  Insert TBODY in TABLEs if one is not found.
  789. /// </param>
  790. /// <param name="dir" type="Number">
  791. ///  If dir&lt;0, process args in reverse order.
  792. /// </param>
  793. /// <param name="fn" type="Function">
  794. ///  The function doing the DOM manipulation.
  795. /// </param>
  796. /// <returns type="jQuery" />
  797. /// <summary>
  798. /// Part of Core
  799. /// </summary>
  800. if ( this[0] ) {
  801. var fragment = (this[0].ownerDocument || this[0]).createDocumentFragment(),
  802. scripts = jQuery.clean( args, (this[0].ownerDocument || this[0]), fragment ),
  803. first = fragment.firstChild;
  804. if ( first )
  805. for ( var i = 0, l = this.length; i < l; i++ )
  806. callback.call( root(this[i], first), this.length > 1 || i > 0 ?
  807. fragment.cloneNode(true) : fragment );
  808. if ( scripts )
  809. jQuery.each( scripts, evalScript );
  810. }
  811. return this;
  812. function root( elem, cur ) {
  813. return table && jQuery.nodeName(elem, "table") && jQuery.nodeName(cur, "tr") ?
  814. (elem.getElementsByTagName("tbody")[0] ||
  815. elem.appendChild(elem.ownerDocument.createElement("tbody"))) :
  816. elem;
  817. }
  818. }
  819. };
  820. // Give the init function the jQuery prototype for later instantiation
  821. jQuery.fn.init.prototype = jQuery.fn;
  822. function evalScript( i, elem ) {
  823. /// <summary>
  824. /// This method is internal.
  825. /// </summary>
  826. /// <private />
  827. if ( elem.src )
  828. jQuery.ajax({
  829. url: elem.src,
  830. async: false,
  831. dataType: "script"
  832. });
  833. else
  834. jQuery.globalEval( elem.text || elem.textContent || elem.innerHTML || "" );
  835. if ( elem.parentNode )
  836. elem.parentNode.removeChild( elem );
  837. }
  838. function now(){
  839. /// <summary>
  840. /// Gets the current date.
  841. /// </summary>
  842. /// <returns type="Date">The current date.</returns>
  843. return +new Date;
  844. }
  845. jQuery.extend = jQuery.fn.extend = function() {
  846. /// <summary>
  847. /// Extend one object with one or more others, returning the original,
  848. /// modified, object. This is a great utility for simple inheritance.
  849. /// jQuery.extend(settings, options);
  850. /// var settings = jQuery.extend({}, defaults, options);
  851. /// Part of JavaScript
  852. /// </summary>
  853. /// <param name="target" type="Object">
  854. ///  The object to extend
  855. /// </param>
  856. /// <param name="prop1" type="Object">
  857. ///  The object that will be merged into the first.
  858. /// </param>
  859. /// <param name="propN" type="Object" optional="true" parameterArray="true">
  860. ///  (optional) More objects to merge into the first
  861. /// </param>
  862. /// <returns type="Object" />
  863. // copy reference to target object
  864. var target = arguments[0] || {}, i = 1, length = arguments.length, deep = false, options;
  865. // Handle a deep copy situation
  866. if ( typeof target === "boolean" ) {
  867. deep = target;
  868. target = arguments[1] || {};
  869. // skip the boolean and the target
  870. i = 2;
  871. }
  872. // Handle case when target is a string or something (possible in deep copy)
  873. if ( typeof target !== "object" && !jQuery.isFunction(target) )
  874. target = {};
  875. // extend jQuery itself if only one argument is passed
  876. if ( length == i ) {
  877. target = this;
  878. --i;
  879. }
  880. for ( ; i < length; i++ )
  881. // Only deal with non-null/undefined values
  882. if ( (options = arguments[ i ]) != null )
  883. // Extend the base object
  884. for ( var name in options ) {
  885. var src = target[ name ], copy = options[ name ];
  886. // Prevent never-ending loop
  887. if ( target === copy )
  888. continue;
  889. // Recurse if we're merging object values
  890. if ( deep && copy && typeof copy === "object" && !copy.nodeType )
  891. target[ name ] = jQuery.extend( deep, 
  892. // Never move original objects, clone them
  893. src || ( copy.length != null ? [ ] : { } )
  894. , copy );
  895. // Don't bring in undefined values
  896. else if ( copy !== undefined )
  897. target[ name ] = copy;
  898. }
  899. // Return the modified object
  900. return target;
  901. };
  902. // exclude the following css properties to add px
  903. var exclude = /z-?index|font-?weight|opacity|zoom|line-?height/i,
  904. // cache defaultView
  905. defaultView = document.defaultView || {},
  906. toString = Object.prototype.toString;
  907. jQuery.extend({
  908. noConflict: function( deep ) {
  909. /// <summary>
  910. /// Run this function to give control of the $ variable back
  911. /// to whichever library first implemented it. This helps to make 
  912. /// sure that jQuery doesn't conflict with the $ object
  913. /// of other libraries.
  914. /// By using this function, you will only be able to access jQuery
  915. /// using the 'jQuery' variable. For example, where you used to do
  916. /// $(&quot;div p&quot;), you now must do jQuery(&quot;div p&quot;).
  917. /// Part of Core 
  918. /// </summary>
  919. /// <returns type="undefined" />
  920. window.$ = _$;
  921. if ( deep )
  922. window.jQuery = _jQuery;
  923. return jQuery;
  924. },
  925. // See test/unit/core.js for details concerning isFunction.
  926. // Since version 1.3, DOM methods and functions like alert
  927. // aren't supported. They return false on IE (#2968).
  928. isFunction: function( obj ) {
  929. /// <summary>
  930. /// Determines if the parameter passed is a function.
  931. /// </summary>
  932. /// <param name="obj" type="Object">The object to check</param>
  933. /// <returns type="Boolean">True if the parameter is a function; otherwise false.</returns>
  934. return toString.call(obj) === "[object Function]";
  935. },
  936. isArray: function(obj) {
  937.     /// <summary>
  938.     /// Determine if the parameter passed is an array.
  939.     /// </summary>
  940.     /// <param name="obj" type="Object">Object to test whether or not it is an array.</param>
  941.     /// <returns type="Boolean">True if the parameter is a function; otherwise false.</returns>
  942.     
  943. return toString.call(obj) === "[object Array]";
  944. },
  945. // check if an element is in a (or is an) XML document
  946. isXMLDoc: function( elem ) {
  947. /// <summary>
  948. /// Determines if the parameter passed is an XML document.
  949. /// </summary>
  950. /// <param name="elem" type="Object">The object to test</param>
  951. /// <returns type="Boolean">True if the parameter is an XML document; otherwise false.</returns>
  952.     return elem.nodeType === 9 && elem.documentElement.nodeName !== "HTML" ||
  953. !!elem.ownerDocument && jQuery.isXMLDoc(elem.ownerDocument);
  954.     },
  955. // Evalulates a script in a global context
  956. globalEval: function( data ) {
  957. /// <summary>
  958. /// Internally evaluates a script in a global context.
  959. /// </summary>
  960. /// <private />
  961. if ( data && /S/.test(data) ) {
  962. // Inspired by code by Andrea Giammarchi
  963. // http://webreflection.blogspot.com/2007/08/global-scope-evaluation-and-dom.html
  964. var head = document.getElementsByTagName("head")[0] || document.documentElement,
  965. script = document.createElement("script");
  966. script.type = "text/javascript";
  967. if ( jQuery.support.scriptEval )
  968. script.appendChild( document.createTextNode( data ) );
  969. else
  970. script.text = data;
  971. // Use insertBefore instead of appendChild  to circumvent an IE6 bug.
  972. // This arises when a base node is used (#2709).
  973. head.insertBefore( script, head.firstChild );
  974. head.removeChild( script );
  975. }
  976. },
  977. nodeName: function( elem, name ) {
  978. /// <summary>
  979. /// Checks whether the specified element has the specified DOM node name.
  980. /// </summary>
  981. /// <param name="elem" type="Element">The element to examine</param>
  982. /// <param name="name" type="String">The node name to check</param>
  983. /// <returns type="Boolean">True if the specified node name matches the node's DOM node name; otherwise false</returns>
  984. return elem.nodeName && elem.nodeName.toUpperCase() == name.toUpperCase();
  985. },
  986. // args is for internal usage only
  987. each: function( object, callback, args ) {
  988. /// <summary>
  989. /// A generic iterator function, which can be used to seemlessly
  990. /// iterate over both objects and arrays. This function is not the same
  991. /// as $().each() - which is used to iterate, exclusively, over a jQuery
  992. /// object. This function can be used to iterate over anything.
  993. /// The callback has two arguments:the key (objects) or index (arrays) as first
  994. /// the first, and the value as the second.
  995. /// Part of JavaScript
  996. /// </summary>
  997. /// <param name="obj" type="Object">
  998. ///  The object, or array, to iterate over.
  999. /// </param>
  1000. /// <param name="fn" type="Function">
  1001. ///  The function that will be executed on every object.
  1002. /// </param>
  1003. /// <returns type="Object" />
  1004. var name, i = 0, length = object.length;
  1005. if ( args ) {
  1006. if ( length === undefined ) {
  1007. for ( name in object )
  1008. if ( callback.apply( object[ name ], args ) === false )
  1009. break;
  1010. } else
  1011. for ( ; i < length; )
  1012. if ( callback.apply( object[ i++ ], args ) === false )
  1013. break;
  1014. // A special, fast, case for the most common use of each
  1015. } else {
  1016. if ( length === undefined ) {
  1017. for ( name in object )
  1018. if ( callback.call( object[ name ], name, object[ name ] ) === false )
  1019. break;
  1020. } else
  1021. for ( var value = object[0];
  1022. i < length && callback.call( value, i, value ) !== false; value = object[++i] ){}
  1023. }
  1024. return object;
  1025. },
  1026. prop: function( elem, value, type, i, name ) {
  1027. /// <summary>
  1028. /// This method is internal.
  1029. /// </summary>
  1030. /// <private />
  1031. // This member is not documented within the jQuery API: http://docs.jquery.com/action/edit/Internals/jQuery.prop
  1032. // Handle executable functions
  1033. if ( jQuery.isFunction( value ) )
  1034. value = value.call( elem, i );
  1035. // Handle passing in a number to a CSS property
  1036. return typeof value === "number" && type == "curCSS" && !exclude.test( name ) ?
  1037. value + "px" :
  1038. value;
  1039. },
  1040. className: {
  1041. // internal only, use addClass("class")
  1042. add: function( elem, classNames ) {
  1043.     /// <summary>
  1044.     /// Internal use only; use addClass('class')
  1045. /// </summary>
  1046.     /// <private />
  1047. jQuery.each((classNames || "").split(/s+/), function(i, className){
  1048. if ( elem.nodeType == 1 && !jQuery.className.has( elem.className, className ) )
  1049. elem.className += (elem.className ? " " : "") + className;
  1050. });
  1051. },
  1052. // internal only, use removeClass("class")
  1053. remove: function( elem, classNames ) {
  1054.     /// <summary>
  1055.     /// Internal use only; use removeClass('class')
  1056. /// </summary>
  1057.     /// <private />
  1058. if (elem.nodeType == 1)
  1059. elem.className = classNames !== undefined ?
  1060. jQuery.grep(elem.className.split(/s+/), function(className){
  1061. return !jQuery.className.has( classNames, className );
  1062. }).join(" ") :
  1063. "";
  1064. },
  1065. // internal only, use hasClass("class")
  1066. has: function( elem, className ) {
  1067.     /// <summary>
  1068.     /// Internal use only; use hasClass('class')
  1069. /// </summary>
  1070.     /// <private />
  1071.     return elem && jQuery.inArray(className, (elem.className || elem).toString().split(/s+/)) > -1;
  1072. }
  1073. },
  1074. // A method for quickly swapping in/out CSS properties to get correct calculations
  1075. swap: function( elem, options, callback ) {
  1076. /// <summary>
  1077. /// Swap in/out style options.
  1078. /// </summary>
  1079. var old = {};
  1080. // Remember the old values, and insert the new ones
  1081. for ( var name in options ) {
  1082. old[ name ] = elem.style[ name ];
  1083. elem.style[ name ] = options[ name ];
  1084. }
  1085. callback.call( elem );
  1086. // Revert the old values
  1087. for ( var name in options )
  1088. elem.style[ name ] = old[ name ];
  1089. },
  1090. css: function( elem, name, force, extra ) {
  1091. /// <summary>
  1092. /// This method is internal only.
  1093. /// </summary>
  1094. /// <private />
  1095. // This method is undocumented in jQuery API: http://docs.jquery.com/action/edit/Internals/jQuery.css
  1096. if ( name == "width" || name == "height" ) {
  1097. var val, props = { position: "absolute", visibility: "hidden", display:"block" }, which = name == "width" ? [ "Left", "Right" ] : [ "Top", "Bottom" ];
  1098. function getWH() {
  1099. val = name == "width" ? elem.offsetWidth : elem.offsetHeight;
  1100. if ( extra === "border" )
  1101. return;
  1102. jQuery.each( which, function() {
  1103. if ( !extra )
  1104. val -= parseFloat(jQuery.curCSS( elem, "padding" + this, true)) || 0;
  1105. if ( extra === "margin" )
  1106. val += parseFloat(jQuery.curCSS( elem, "margin" + this, true)) || 0;
  1107. else
  1108. val -= parseFloat(jQuery.curCSS( elem, "border" + this + "Width", true)) || 0;
  1109. });
  1110. }
  1111. if ( elem.offsetWidth !== 0 )
  1112. getWH();
  1113. else
  1114. jQuery.swap( elem, props, getWH );
  1115. return Math.max(0, Math.round(val));
  1116. }
  1117. return jQuery.curCSS( elem, name, force );
  1118. },
  1119. curCSS: function( elem, name, force ) {
  1120. /// <summary>
  1121. /// This method is internal only.
  1122. /// </summary>
  1123. /// <private />
  1124. // This method is undocumented in jQuery API: http://docs.jquery.com/action/edit/Internals/jQuery.curCSS
  1125. var ret, style = elem.style;
  1126. // We need to handle opacity special in IE
  1127. if ( name == "opacity" && !jQuery.support.opacity ) {
  1128. ret = jQuery.attr( style, "opacity" );
  1129. return ret == "" ?
  1130. "1" :
  1131. ret;
  1132. }
  1133. // Make sure we're using the right name for getting the float value
  1134. if ( name.match( /float/i ) )
  1135. name = styleFloat;
  1136. if ( !force && style && style[ name ] )
  1137. ret = style[ name ];
  1138. else if ( defaultView.getComputedStyle ) {
  1139. // Only "float" is needed here
  1140. if ( name.match( /float/i ) )
  1141. name = "float";
  1142. name = name.replace( /([A-Z])/g, "-$1" ).toLowerCase();
  1143. var computedStyle = defaultView.getComputedStyle( elem, null );
  1144. if ( computedStyle )
  1145. ret = computedStyle.getPropertyValue( name );
  1146. // We should always get a number back from opacity
  1147. if ( name == "opacity" && ret == "" )
  1148. ret = "1";
  1149. } else if ( elem.currentStyle ) {
  1150. var camelCase = name.replace(/-(w)/g, function(all, letter){
  1151. return letter.toUpperCase();
  1152. });
  1153. ret = elem.currentStyle[ name ] || elem.currentStyle[ camelCase ];
  1154. // From the awesome hack by Dean Edwards
  1155. // http://erik.eae.net/archives/2007/07/27/18.54.15/#comment-102291
  1156. // If we're not dealing with a regular pixel number
  1157. // but a number that has a weird ending, we need to convert it to pixels
  1158. if ( !/^d+(px)?$/i.test( ret ) && /^d/.test( ret ) ) {
  1159. // Remember the original values
  1160. var left = style.left, rsLeft = elem.runtimeStyle.left;
  1161. // Put in the new values to get a computed value out
  1162. elem.runtimeStyle.left = elem.currentStyle.left;
  1163. style.left = ret || 0;
  1164. ret = style.pixelLeft + "px";
  1165. // Revert the changed values
  1166. style.left = left;
  1167. elem.runtimeStyle.left = rsLeft;
  1168. }
  1169. }
  1170. return ret;
  1171. },
  1172. clean: function( elems, context, fragment ) {
  1173. /// <summary>
  1174. /// This method is internal only.
  1175. /// </summary>
  1176. /// <private />
  1177. // This method is undocumented in the jQuery API: http://docs.jquery.com/action/edit/Internals/jQuery.clean
  1178. context = context || document;
  1179. // !context.createElement fails in IE with an error but returns typeof 'object'
  1180. if ( typeof context.createElement === "undefined" )
  1181. context = context.ownerDocument || context[0] && context[0].ownerDocument || document;
  1182. // If a single string is passed in and it's a single tag
  1183. // just do a createElement and skip the rest
  1184. if ( !fragment && elems.length === 1 && typeof elems[0] === "string" ) {
  1185. var match = /^<(w+)s*/?>$/.exec(elems[0]);
  1186. if ( match )
  1187. return [ context.createElement( match[1] ) ];
  1188. }
  1189. var ret = [], scripts = [], div = context.createElement("div");
  1190. jQuery.each(elems, function(i, elem){
  1191. if ( typeof elem === "number" )
  1192. elem += '';
  1193. if ( !elem )
  1194. return;
  1195. // Convert html string into DOM nodes
  1196. if ( typeof elem === "string" ) {
  1197. // Fix "XHTML"-style tags in all browsers
  1198. elem = elem.replace(/(<(w+)[^>]*?)/>/g, function(all, front, tag){
  1199. return tag.match(/^(abbr|br|col|img|input|link|meta|param|hr|area|embed)$/i) ?
  1200. all :
  1201. front + "></" + tag + ">";
  1202. });
  1203. // Trim whitespace, otherwise indexOf won't work as expected
  1204. var tags = elem.replace(/^s+/, "").substring(0, 10).toLowerCase();
  1205. var wrap =
  1206. // option or optgroup
  1207. !tags.indexOf("<opt") &&
  1208. [ 1, "<select multiple='multiple'>", "</select>" ] ||
  1209. !tags.indexOf("<leg") &&
  1210. [ 1, "<fieldset>", "</fieldset>" ] ||
  1211. tags.match(/^<(thead|tbody|tfoot|colg|cap)/) &&
  1212. [ 1, "<table>", "</table>" ] ||
  1213. !tags.indexOf("<tr") &&
  1214. [ 2, "<table><tbody>", "</tbody></table>" ] ||
  1215.   // <thead> matched above
  1216. (!tags.indexOf("<td") || !tags.indexOf("<th")) &&
  1217. [ 3, "<table><tbody><tr>", "</tr></tbody></table>" ] ||
  1218. !tags.indexOf("<col") &&
  1219. [ 2, "<table><tbody></tbody><colgroup>", "</colgroup></table>" ] ||
  1220. // IE can't serialize <link> and <script> tags normally
  1221. !jQuery.support.htmlSerialize &&
  1222. [ 1, "div<div>", "</div>" ] ||
  1223. [ 0, "", "" ];
  1224. // Go to html and back, then peel off extra wrappers
  1225. div.innerHTML = wrap[1] + elem + wrap[2];
  1226. // Move to the right depth
  1227. while ( wrap[0]-- )
  1228. div = div.lastChild;
  1229. // Remove IE's autoinserted <tbody> from table fragments
  1230. if ( !jQuery.support.tbody ) {
  1231. // String was a <table>, *may* have spurious <tbody>
  1232. var hasBody = /<tbody/i.test(elem),
  1233. tbody = !tags.indexOf("<table") && !hasBody ?
  1234. div.firstChild && div.firstChild.childNodes :
  1235. // String was a bare <thead> or <tfoot>
  1236. wrap[1] == "<table>" && !hasBody ?
  1237. div.childNodes :
  1238. [];
  1239. for ( var j = tbody.length - 1; j >= 0 ; --j )
  1240. if ( jQuery.nodeName( tbody[ j ], "tbody" ) && !tbody[ j ].childNodes.length )
  1241. tbody[ j ].parentNode.removeChild( tbody[ j ] );
  1242. }
  1243. // IE completely kills leading whitespace when innerHTML is used
  1244. if ( !jQuery.support.leadingWhitespace && /^s/.test( elem ) )
  1245. div.insertBefore( context.createTextNode( elem.match(/^s*/)[0] ), div.firstChild );
  1246. elem = jQuery.makeArray( div.childNodes );
  1247. }
  1248. if ( elem.nodeType )
  1249. ret.push( elem );
  1250. else
  1251. ret = jQuery.merge( ret, elem );
  1252. });
  1253. if ( fragment ) {
  1254. for ( var i = 0; ret[i]; i++ ) {
  1255. if ( jQuery.nodeName( ret[i], "script" ) && (!ret[i].type || ret[i].type.toLowerCase() === "text/javascript") ) {
  1256. scripts.push( ret[i].parentNode ? ret[i].parentNode.removeChild( ret[i] ) : ret[i] );
  1257. } else {
  1258. if ( ret[i].nodeType === 1 )
  1259. ret.splice.apply( ret, [i + 1, 0].concat(jQuery.makeArray(ret[i].getElementsByTagName("script"))) );
  1260. fragment.appendChild( ret[i] );
  1261. }
  1262. }
  1263. return scripts;
  1264. }
  1265. return ret;
  1266. },
  1267. attr: function( elem, name, value ) {
  1268. /// <summary>
  1269. /// This method is internal.
  1270. /// </summary>
  1271. /// <private />
  1272. // don't set attributes on text and comment nodes
  1273. if (!elem || elem.nodeType == 3 || elem.nodeType == 8)
  1274. return undefined;
  1275. var notxml = !jQuery.isXMLDoc( elem ),
  1276. // Whether we are setting (or getting)
  1277. set = value !== undefined;
  1278. // Try to normalize/fix the name
  1279. name = notxml && jQuery.props[ name ] || name;
  1280. // Only do all the following if this is a node (faster for style)
  1281. // IE elem.getAttribute passes even for style
  1282. if ( elem.tagName ) {
  1283. // These attributes require special treatment
  1284. var special = /href|src|style/.test( name );
  1285. // Safari mis-reports the default selected property of a hidden option
  1286. // Accessing the parent's selectedIndex property fixes it
  1287. if ( name == "selected" && elem.parentNode )
  1288. elem.parentNode.selectedIndex;
  1289. // If applicable, access the attribute via the DOM 0 way
  1290. if ( name in elem && notxml && !special ) {
  1291. if ( set ){
  1292. // We can't allow the type property to be changed (since it causes problems in IE)
  1293. if ( name == "type" && jQuery.nodeName( elem, "input" ) && elem.parentNode )
  1294. throw "type property can't be changed";
  1295. elem[ name ] = value;
  1296. }
  1297. // browsers index elements by id/name on forms, give priority to attributes.
  1298. if( jQuery.nodeName( elem, "form" ) && elem.getAttributeNode(name) )
  1299. return elem.getAttributeNode( name ).nodeValue;
  1300. // elem.tabIndex doesn't always return the correct value when it hasn't been explicitly set
  1301. // http://fluidproject.org/blog/2008/01/09/getting-setting-and-removing-tabindex-values-with-javascript/
  1302. if ( name == "tabIndex" ) {
  1303. var attributeNode = elem.getAttributeNode( "tabIndex" );
  1304. return attributeNode && attributeNode.specified
  1305. ? attributeNode.value
  1306. : elem.nodeName.match(/(button|input|object|select|textarea)/i)
  1307. ? 0
  1308. : elem.nodeName.match(/^(a|area)$/i) && elem.href
  1309. ? 0
  1310. : undefined;
  1311. }
  1312. return elem[ name ];
  1313. }
  1314. if ( !jQuery.support.style && notxml &&  name == "style" )
  1315. return jQuery.attr( elem.style, "cssText", value );
  1316. if ( set )
  1317. // convert the value to a string (all browsers do this but IE) see #1070
  1318. elem.setAttribute( name, "" + value );
  1319. var attr = !jQuery.support.hrefNormalized && notxml && special
  1320. // Some attributes require a special call on IE
  1321. ? elem.getAttribute( name, 2 )
  1322. : elem.getAttribute( name );
  1323. // Non-existent attributes return null, we normalize to undefined
  1324. return attr === null ? undefined : attr;
  1325. }
  1326. // elem is actually elem.style ... set the style
  1327. // IE uses filters for opacity
  1328. if ( !jQuery.support.opacity && name == "opacity" ) {
  1329. if ( set ) {
  1330. // IE has trouble with opacity if it does not have layout
  1331. // Force it by setting the zoom level
  1332. elem.zoom = 1;
  1333. // Set the alpha filter to set the opacity
  1334. elem.filter = (elem.filter || "").replace( /alpha([^)]*)/, "" ) +
  1335. (parseInt( value ) + '' == "NaN" ? "" : "alpha(opacity=" + value * 100 + ")");
  1336. }
  1337. return elem.filter && elem.filter.indexOf("opacity=") >= 0 ?
  1338. (parseFloat( elem.filter.match(/opacity=([^)]*)/)[1] ) / 100) + '':
  1339. "";
  1340. }
  1341. name = name.replace(/-([a-z])/ig, function(all, letter){
  1342. return letter.toUpperCase();
  1343. });
  1344. if ( set )
  1345. elem[ name ] = value;
  1346. return elem[ name ];
  1347. },
  1348. trim: function( text ) {
  1349. /// <summary>
  1350. /// Remove the whitespace from the beginning and end of a string.
  1351. /// Part of JavaScript
  1352. /// </summary>
  1353. /// <returns type="String" />
  1354. /// <param name="text" type="String">
  1355. /// The string to trim.
  1356. /// </param>
  1357. return (text || "").replace( /^s+|s+$/g, "" );
  1358. },
  1359. makeArray: function( array ) {
  1360. /// <summary>
  1361. /// Turns anything into a true array.  This is an internal method.
  1362. /// </summary>
  1363. /// <param name="array" type="Object">Anything to turn into an actual Array</param>
  1364. /// <returns type="Array" />
  1365. /// <private />
  1366. var ret = [];
  1367. if( array != null ){
  1368. var i = array.length;
  1369. // The window, strings (and functions) also have 'length'
  1370. if( i == null || typeof array === "string" || jQuery.isFunction(array) || array.setInterval )
  1371. ret[0] = array;
  1372. else
  1373. while( i )
  1374. ret[--i] = array[i];
  1375. }
  1376. return ret;
  1377. },
  1378. inArray: function( elem, array ) {
  1379. /// <summary>
  1380. /// Determines the index of the first parameter in the array.
  1381. /// </summary>
  1382. /// <param name="elem">The value to see if it exists in the array.</param>
  1383. /// <param name="array" type="Array">The array to look through for the value</param>
  1384. /// <returns type="Number" integer="true">The 0-based index of the item if it was found, otherwise -1.</returns>
  1385. for ( var i = 0, length = array.length; i < length; i++ )
  1386. // Use === because on IE, window == document
  1387. if ( array[ i ] === elem )
  1388. return i;
  1389. return -1;
  1390. },
  1391. merge: function( first, second ) {
  1392. /// <summary>
  1393. /// Merge two arrays together, removing all duplicates.
  1394. /// The new array is: All the results from the first array, followed
  1395. /// by the unique results from the second array.
  1396. /// Part of JavaScript
  1397. /// </summary>
  1398. /// <returns type="Array" />
  1399. /// <param name="first" type="Array">
  1400. ///  The first array to merge.
  1401. /// </param>
  1402. /// <param name="second" type="Array">
  1403. ///  The second array to merge.
  1404. /// </param>
  1405. // We have to loop this way because IE & Opera overwrite the length
  1406. // expando of getElementsByTagName
  1407. var i = 0, elem, pos = first.length;
  1408. // Also, we need to make sure that the correct elements are being returned
  1409. // (IE returns comment nodes in a '*' query)
  1410. if ( !jQuery.support.getAll ) {
  1411. while ( (elem = second[ i++ ]) != null )
  1412. if ( elem.nodeType != 8 )
  1413. first[ pos++ ] = elem;
  1414. } else
  1415. while ( (elem = second[ i++ ]) != null )
  1416. first[ pos++ ] = elem;
  1417. return first;
  1418. },
  1419. unique: function( array ) {
  1420. /// <summary>
  1421. /// Removes all duplicate elements from an array of elements.
  1422. /// </summary>
  1423. /// <param name="array" type="Array&lt;Element&gt;">The array to translate</param>
  1424. /// <returns type="Array&lt;Element&gt;">The array after translation.</returns>
  1425. var ret = [], done = {};
  1426. try {
  1427. for ( var i = 0, length = array.length; i < length; i++ ) {
  1428. var id = jQuery.data( array[ i ] );
  1429. if ( !done[ id ] ) {
  1430. done[ id ] = true;
  1431. ret.push( array[ i ] );
  1432. }
  1433. }
  1434. } catch( e ) {
  1435. ret = array;
  1436. }
  1437. return ret;
  1438. },
  1439. grep: function( elems, callback, inv ) {
  1440. /// <summary>
  1441. /// Filter items out of an array, by using a filter function.
  1442. /// The specified function will be passed two arguments: The
  1443. /// current array item and the index of the item in the array. The
  1444. /// function must return 'true' to keep the item in the array, 
  1445. /// false to remove it.
  1446. /// });
  1447. /// Part of JavaScript
  1448. /// </summary>
  1449. /// <returns type="Array" />
  1450. /// <param name="elems" type="Array">
  1451. /// array The Array to find items in.
  1452. /// </param>
  1453. /// <param name="fn" type="Function">
  1454. ///  The function to process each item against.
  1455. /// </param>
  1456. /// <param name="inv" type="Boolean">
  1457. ///  Invert the selection - select the opposite of the function.
  1458. /// </param>
  1459. var ret = [];
  1460. // Go through the array, only saving the items
  1461. // that pass the validator function
  1462. for ( var i = 0, length = elems.length; i < length; i++ )
  1463. if ( !inv != !callback( elems[ i ], i ) )
  1464. ret.push( elems[ i ] );
  1465. return ret;
  1466. },
  1467. map: function( elems, callback ) {
  1468. /// <summary>
  1469. /// Translate all items in an array to another array of items.
  1470. /// The translation function that is provided to this method is 
  1471. /// called for each item in the array and is passed one argument: 
  1472. /// The item to be translated.
  1473. /// The function can then return the translated value, 'null'
  1474. /// (to remove the item), or  an array of values - which will
  1475. /// be flattened into the full array.
  1476. /// Part of JavaScript
  1477. /// </summary>
  1478. /// <returns type="Array" />
  1479. /// <param name="elems" type="Array">
  1480. /// array The Array to translate.
  1481. /// </param>
  1482. /// <param name="fn" type="Function">
  1483. ///  The function to process each item against.
  1484. /// </param>
  1485. var ret = [];
  1486. // Go through the array, translating each of the items to their
  1487. // new value (or values).
  1488. for ( var i = 0, length = elems.length; i < length; i++ ) {
  1489. var value = callback( elems[ i ], i );
  1490. if ( value != null )
  1491. ret[ ret.length ] = value;
  1492. }
  1493. return ret.concat.apply( [], ret );
  1494. }
  1495. });
  1496. // Use of jQuery.browser is deprecated.
  1497. // It's included for backwards compatibility and plugins,
  1498. // although they should work to migrate away.
  1499. var userAgent = navigator.userAgent.toLowerCase();
  1500. // Figure out what browser is being used
  1501. jQuery.browser = {
  1502. version: (userAgent.match( /.+(?:rv|it|ra|ie)[/: ]([d.]+)/ ) || [0,'0'])[1],
  1503. safari: /webkit/.test( userAgent ),
  1504. opera: /opera/.test( userAgent ),
  1505. msie: /msie/.test( userAgent ) && !/opera/.test( userAgent ),
  1506. mozilla: /mozilla/.test( userAgent ) && !/(compatible|webkit)/.test( userAgent )
  1507. };
  1508. // [vsdoc] The following section has been denormalized from original sources for IntelliSense.
  1509. // jQuery.each({
  1510. //  parent: function(elem){return elem.parentNode;},
  1511. //  parents: function(elem){return jQuery.dir(elem,"parentNode");},
  1512. //  next: function(elem){return jQuery.nth(elem,2,"nextSibling");},
  1513. //  prev: function(elem){return jQuery.nth(elem,2,"previousSibling");},
  1514. //  nextAll: function(elem){return jQuery.dir(elem,"nextSibling");},
  1515. //  prevAll: function(elem){return jQuery.dir(elem,"previousSibling");},
  1516. //  siblings: function(elem){return jQuery.sibling(elem.parentNode.firstChild,elem);},
  1517. //  children: function(elem){return jQuery.sibling(elem.firstChild);},
  1518. //  contents: function(elem){return jQuery.nodeName(elem,"iframe")?elem.contentDocument||elem.contentWindow.document:jQuery.makeArray(elem.childNodes);}
  1519. // }, function(name, fn){
  1520. //  jQuery.fn[ name ] = function( selector ) {
  1521. //  /// <summary>
  1522. //  /// Get a set of elements containing the unique parents of the matched
  1523. //  /// set of elements.
  1524. //  /// Can be filtered with an optional expressions.
  1525. //  /// Part of DOM/Traversing
  1526. //  /// </summary>
  1527. //  /// <param name="expr" type="String" optional="true">
  1528. //  /// (optional) An expression to filter the parents with
  1529. //  /// </param>
  1530. //  /// <returns type="jQuery" />   
  1531. // 
  1532. //  var ret = jQuery.map( this, fn );
  1533. // 
  1534. //  if ( selector && typeof selector == "string" )
  1535. //  ret = jQuery.multiFilter( selector, ret );
  1536. // 
  1537. //  return this.pushStack( jQuery.unique( ret ), name, selector );
  1538. //  };
  1539. // });
  1540. jQuery.each({
  1541. parent: function(elem){return elem.parentNode;}
  1542. }, function(name, fn){
  1543. jQuery.fn[ name ] = function( selector ) {
  1544. /// <summary>
  1545. /// Get a set of elements containing the unique parents of the matched
  1546. /// set of elements.
  1547. /// Can be filtered with an optional expressions.
  1548. /// Part of DOM/Traversing
  1549. /// </summary>
  1550. /// <param name="expr" type="String" optional="true">
  1551. /// (optional) An expression to filter the parents with
  1552. /// </param>
  1553. /// <returns type="jQuery" />   
  1554. var ret = jQuery.map( this, fn );
  1555. if ( selector && typeof selector == "string" )
  1556. ret = jQuery.multiFilter( selector, ret );
  1557. return this.pushStack( jQuery.unique( ret ), name, selector );
  1558. };
  1559. });
  1560. jQuery.each({
  1561. parents: function(elem){return jQuery.dir(elem,"parentNode");}
  1562. }, function(name, fn){
  1563. jQuery.fn[ name ] = function( selector ) {
  1564. /// <summary>
  1565. /// Get a set of elements containing the unique ancestors of the matched
  1566. /// set of elements (except for the root element).
  1567. /// Can be filtered with an optional expressions.
  1568. /// Part of DOM/Traversing
  1569. /// </summary>
  1570. /// <param name="expr" type="String" optional="true">
  1571. /// (optional) An expression to filter the ancestors with
  1572. /// </param>
  1573. /// <returns type="jQuery" />   
  1574. var ret = jQuery.map( this, fn );
  1575. if ( selector && typeof selector == "string" )
  1576. ret = jQuery.multiFilter( selector, ret );
  1577. return this.pushStack( jQuery.unique( ret ), name, selector );
  1578. };
  1579. });
  1580. jQuery.each({
  1581. next: function(elem){return jQuery.nth(elem,2,"nextSibling");}
  1582. }, function(name, fn){
  1583. jQuery.fn[ name ] = function( selector ) {
  1584. /// <summary>
  1585. /// Get a set of elements containing the unique next siblings of each of the
  1586. /// matched set of elements.
  1587. /// It only returns the very next sibling, not all next siblings.
  1588. /// Can be filtered with an optional expressions.
  1589. /// Part of DOM/Traversing
  1590. /// </summary>
  1591. /// <param name="expr" type="String" optional="true">
  1592. /// (optional) An expression to filter the next Elements with
  1593. /// </param>
  1594. /// <returns type="jQuery" />
  1595. var ret = jQuery.map( this, fn );
  1596. if ( selector && typeof selector == "string" )
  1597. ret = jQuery.multiFilter( selector, ret );
  1598. return this.pushStack( jQuery.unique( ret ), name, selector );
  1599. };
  1600. });
  1601. jQuery.each({
  1602. prev: function(elem){return jQuery.nth(elem,2,"previousSibling");}
  1603. }, function(name, fn){
  1604. jQuery.fn[ name ] = function( selector ) {
  1605. /// <summary>
  1606. /// Get a set of elements containing the unique previous siblings of each of the
  1607. /// matched set of elements.
  1608. /// Can be filtered with an optional expressions.
  1609. /// It only returns the immediately previous sibling, not all previous siblings.
  1610. /// Part of DOM/Traversing
  1611. /// </summary>
  1612. /// <param name="expr" type="String" optional="true">
  1613. /// (optional) An expression to filter the previous Elements with
  1614. /// </param>
  1615. /// <returns type="jQuery" />
  1616. var ret = jQuery.map( this, fn );
  1617. if ( selector && typeof selector == "string" )
  1618. ret = jQuery.multiFilter( selector, ret );
  1619. return this.pushStack( jQuery.unique( ret ), name, selector );
  1620. };
  1621. });
  1622. jQuery.each({
  1623. nextAll: function(elem){return jQuery.dir(elem,"nextSibling");}
  1624. }, function(name, fn){
  1625. jQuery.fn[name] = function(selector) {
  1626. /// <summary>
  1627. /// Finds all sibling elements after the current element.
  1628. /// Can be filtered with an optional expressions.
  1629. /// Part of DOM/Traversing
  1630. /// </summary>
  1631. /// <param name="expr" type="String" optional="true">
  1632. /// (optional) An expression to filter the next Elements with
  1633. /// </param>
  1634. /// <returns type="jQuery" />
  1635. var ret = jQuery.map( this, fn );
  1636. if ( selector && typeof selector == "string" )
  1637. ret = jQuery.multiFilter( selector, ret );
  1638. return this.pushStack( jQuery.unique( ret ), name, selector );
  1639. };
  1640. });
  1641. jQuery.each({
  1642. prevAll: function(elem){return jQuery.dir(elem,"previousSibling");}
  1643. }, function(name, fn){
  1644. jQuery.fn[ name ] = function( selector ) {
  1645. /// <summary>
  1646. /// Finds all sibling elements before the current element.
  1647. /// Can be filtered with an optional expressions.
  1648. /// Part of DOM/Traversing
  1649. /// </summary>
  1650. /// <param name="expr" type="String" optional="true">
  1651. /// (optional) An expression to filter the previous Elements with
  1652. /// </param>
  1653. /// <returns type="jQuery" />
  1654. var ret = jQuery.map( this, fn );
  1655. if ( selector && typeof selector == "string" )
  1656. ret = jQuery.multiFilter( selector, ret );
  1657. return this.pushStack( jQuery.unique( ret ), name, selector );
  1658. };
  1659. });
  1660. jQuery.each({
  1661. siblings: function(elem){return jQuery.sibling(elem.parentNode.firstChild,elem);}
  1662. }, function(name, fn){
  1663. jQuery.fn[ name ] = function( selector ) {
  1664. /// <summary>
  1665. /// Get a set of elements containing all of the unique siblings of each of the
  1666. /// matched set of elements.
  1667. /// Can be filtered with an optional expressions.
  1668. /// Part of DOM/Traversing
  1669. /// </summary>
  1670. /// <param name="expr" type="String" optional="true">
  1671. /// (optional) An expression to filter the sibling Elements with
  1672. /// </param>
  1673. /// <returns type="jQuery" />
  1674. var ret = jQuery.map( this, fn );
  1675. if ( selector && typeof selector == "string" )
  1676. ret = jQuery.multiFilter( selector, ret );
  1677. return this.pushStack( jQuery.unique( ret ), name, selector );
  1678. };
  1679. });
  1680. jQuery.each({
  1681. children: function(elem){return jQuery.sibling(elem.firstChild);}
  1682. }, function(name, fn){
  1683. jQuery.fn[ name ] = function( selector ) {
  1684. /// <summary>
  1685. /// Get a set of elements containing all of the unique children of each of the
  1686. /// matched set of elements.
  1687. /// Can be filtered with an optional expressions.
  1688. /// Part of DOM/Traversing
  1689. /// </summary>
  1690. /// <param name="expr" type="String" optional="true">
  1691. /// (optional) An expression to filter the child Elements with
  1692. /// </param>
  1693. /// <returns type="jQuery" />
  1694. var ret = jQuery.map( this, fn );
  1695. if ( selector && typeof selector == "string" )
  1696. ret = jQuery.multiFilter( selector, ret );
  1697. return this.pushStack( jQuery.unique( ret ), name, selector );
  1698. };
  1699. });
  1700. jQuery.each({
  1701. contents: function(elem){return jQuery.nodeName(elem,"iframe")?elem.contentDocument||elem.contentWindow.document:jQuery.makeArray(elem.childNodes);}
  1702. }, function(name, fn){
  1703. jQuery.fn[ name ] = function( selector ) {
  1704. /// <summary>Finds all the child nodes inside the matched elements including text nodes, or the content document if the element is an iframe.</summary>
  1705. /// <returns type="jQuery" />
  1706. var ret = jQuery.map( this, fn );
  1707. if ( selector && typeof selector == "string" )
  1708. ret = jQuery.multiFilter( selector, ret );
  1709. return this.pushStack( jQuery.unique( ret ), name, selector );
  1710. };
  1711. });
  1712. // [vsdoc] The following section has been denormalized from original sources for IntelliSense.
  1713. // jQuery.each({
  1714. //  appendTo: "append",
  1715. //  prependTo: "prepend",
  1716. //  insertBefore: "before",
  1717. //  insertAfter: "after",
  1718. //  replaceAll: "replaceWith"
  1719. // }, function(name, original){
  1720. //  jQuery.fn[ name ] = function() {
  1721. //  var args = arguments;
  1722. // 
  1723. //  return this.each(function(){
  1724. //  for ( var i = 0, length = args.length; i < length; i++ )
  1725. //  jQuery( args[ i ] )[ original ]( this );
  1726. //  });
  1727. //  };
  1728. // });
  1729. jQuery.fn.appendTo = function( selector ) {
  1730. /// <summary>
  1731. /// Append all of the matched elements to another, specified, set of elements.
  1732. /// As of jQuery 1.3.2, returns all of the inserted elements.
  1733. /// This operation is, essentially, the reverse of doing a regular
  1734. /// $(A).append(B), in that instead of appending B to A, you're appending
  1735. /// A to B.
  1736. /// </summary>
  1737. /// <param name="selector" type="Selector">
  1738. ///  target to which the content will be appended.
  1739. /// </param>
  1740. /// <returns type="jQuery" />
  1741. var ret = [], insert = jQuery( selector );
  1742. for ( var i = 0, l = insert.length; i < l; i++ ) {
  1743. var elems = (i > 0 ? this.clone(true) : this).get();
  1744. jQuery.fn[ "append" ].apply( jQuery(insert[i]), elems );
  1745. ret = ret.concat( elems );
  1746. }
  1747. return this.pushStack( ret, "appendTo", selector );
  1748. };
  1749. jQuery.fn.prependTo = function( selector ) {
  1750. /// <summary>
  1751. /// Prepend all of the matched elements to another, specified, set of elements.
  1752. /// As of jQuery 1.3.2, returns all of the inserted elements.
  1753. /// This operation is, essentially, the reverse of doing a regular
  1754. /// $(A).prepend(B), in that instead of prepending B to A, you're prepending
  1755. /// A to B.
  1756. /// </summary>
  1757. /// <param name="selector" type="Selector">
  1758. ///  target to which the content will be appended.
  1759. /// </param>
  1760. /// <returns type="jQuery" />
  1761. var ret = [], insert = jQuery( selector );
  1762. for ( var i = 0, l = insert.length; i < l; i++ ) {
  1763. var elems = (i > 0 ? this.clone(true) : this).get();
  1764. jQuery.fn[ "prepend" ].apply( jQuery(insert[i]), elems );
  1765. ret = ret.concat( elems );
  1766. }
  1767. return this.pushStack( ret, "prependTo", selector );
  1768. };
  1769. jQuery.fn.insertBefore = function( selector ) {
  1770. /// <summary>
  1771. /// Insert all of the matched elements before another, specified, set of elements.
  1772. /// As of jQuery 1.3.2, returns all of the inserted elements.
  1773. /// This operation is, essentially, the reverse of doing a regular
  1774. /// $(A).before(B), in that instead of inserting B before A, you're inserting
  1775. /// A before B.
  1776. /// </summary>
  1777. /// <param name="content" type="String">
  1778. ///  Content after which the selected element(s) is inserted.
  1779. /// </param>
  1780. /// <returns type="jQuery" />
  1781. var ret = [], insert = jQuery( selector );
  1782. for ( var i = 0, l = insert.length; i < l; i++ ) {
  1783. var elems = (i > 0 ? this.clone(true) : this).get();
  1784. jQuery.fn[ "before" ].apply( jQuery(insert[i]), elems );
  1785. ret = ret.concat( elems );
  1786. }
  1787. return this.pushStack( ret, "insertBefore", selector );
  1788. };
  1789. jQuery.fn.insertAfter = function( selector ) {
  1790. /// <summary>
  1791. /// Insert all of the matched elements after another, specified, set of elements.
  1792. /// As of jQuery 1.3.2, returns all of the inserted elements.
  1793. /// This operation is, essentially, the reverse of doing a regular
  1794. /// $(A).after(B), in that instead of inserting B after A, you're inserting
  1795. /// A after B.
  1796. /// </summary>
  1797. /// <param name="content" type="String">
  1798. ///  Content after which the selected element(s) is inserted.
  1799. /// </param>
  1800. /// <returns type="jQuery" />
  1801. var ret = [], insert = jQuery( selector );
  1802. for ( var i = 0, l = insert.length; i < l; i++ ) {
  1803. var elems = (i > 0 ? this.clone(true) : this).get();
  1804. jQuery.fn[ "after" ].apply( jQuery(insert[i]), elems );
  1805. ret = ret.concat( elems );
  1806. }
  1807. return this.pushStack( ret, "insertAfter", selector );
  1808. };
  1809. jQuery.fn.replaceAll = function( selector ) {
  1810. /// <summary>
  1811. /// Replaces the elements matched by the specified selector with the matched elements.
  1812. /// As of jQuery 1.3.2, returns all of the inserted elements.
  1813. /// </summary>
  1814. /// <param name="selector" type="Selector">The elements to find and replace the matched elements with.</param>
  1815. /// <returns type="jQuery" />
  1816. var ret = [], insert = jQuery( selector );
  1817. for ( var i = 0, l = insert.length; i < l; i++ ) {
  1818. var elems = (i > 0 ? this.clone(true) : this).get();
  1819. jQuery.fn[ "replaceWith" ].apply( jQuery(insert[i]), elems );
  1820. ret = ret.concat( elems );
  1821. }
  1822. return this.pushStack( ret, "replaceAll", selector );
  1823. };
  1824. // [vsdoc] The following section has been denormalized from original sources for IntelliSense.
  1825. // jQuery.each({
  1826. //  removeAttr: function( name ) {
  1827. //  jQuery.attr( this, name, "" );
  1828. //  if (this.nodeType == 1)
  1829. //  this.removeAttribute( name );
  1830. //  },
  1831. // 
  1832. //  addClass: function( classNames ) {
  1833. //  jQuery.className.add( this, classNames );
  1834. //  },
  1835. // 
  1836. //  removeClass: function( classNames ) {
  1837. //  jQuery.className.remove( this, classNames );
  1838. //  },
  1839. // 
  1840. //  toggleClass: function( classNames, state ) {
  1841. //  if( typeof state !== "boolean" )
  1842. //  state = !jQuery.className.has( this, classNames );
  1843. //  jQuery.className[ state ? "add" : "remove" ]( this, classNames );
  1844. //  },
  1845. // 
  1846. //  remove: function( selector ) {
  1847. //  if ( !selector || jQuery.filter( selector, [ this ] ).length ) {
  1848. //  // Prevent memory leaks
  1849. //  jQuery( "*", this ).add([this]).each(function(){
  1850. //  jQuery.event.remove(this);
  1851. //  jQuery.removeData(this);
  1852. //  });
  1853. //  if (this.parentNode)
  1854. //  this.parentNode.removeChild( this );
  1855. //  }
  1856. //  },
  1857. // 
  1858. //  empty: function() {
  1859. //  // Remove element nodes and prevent memory leaks
  1860. //  jQuery( ">*", this ).remove();
  1861. // 
  1862. //  // Remove any remaining nodes
  1863. //  while ( this.firstChild )
  1864. //  this.removeChild( this.firstChild );
  1865. //  }
  1866. // }, function(name, fn){
  1867. //  jQuery.fn[ name ] = function(){
  1868. //  return this.each( fn, arguments );
  1869. //  };
  1870. // });
  1871. jQuery.fn.removeAttr = function(){
  1872. /// <summary>
  1873. /// Remove an attribute from each of the matched elements.
  1874. /// Part of DOM/Attributes
  1875. /// </summary>
  1876. /// <param name="key" type="String">
  1877. /// name The name of the attribute to remove.
  1878. /// </param>
  1879. /// <returns type="jQuery" />
  1880. return this.each( function( name ) {
  1881. jQuery.attr( this, name, "" );
  1882. if (this.nodeType == 1)
  1883. this.removeAttribute( name );
  1884. }, arguments );
  1885. };
  1886. jQuery.fn.addClass = function(){
  1887. /// <summary>
  1888. /// Adds the specified class(es) to each of the set of matched elements.
  1889. /// Part of DOM/Attributes
  1890. /// </summary>
  1891. /// <param name="classNames" type="String">
  1892. /// lass One or more CSS classes to add to the elements
  1893. /// </param>
  1894. /// <returns type="jQuery" />
  1895. return this.each( function( classNames ) {
  1896. jQuery.className.add( this, classNames );
  1897. }, arguments );
  1898. };
  1899. jQuery.fn.removeClass = function(){
  1900. /// <summary>
  1901. /// Removes all or the specified class(es) from the set of matched elements.
  1902. /// Part of DOM/Attributes
  1903. /// </summary>
  1904. /// <param name="cssClasses" type="String" optional="true">
  1905. /// (Optional) One or more CSS classes to remove from the elements
  1906. /// </param>
  1907. /// <returns type="jQuery" />
  1908. return this.each( function( classNames ) {
  1909. jQuery.className.remove( this, classNames );
  1910. }, arguments );
  1911. };
  1912. jQuery.fn.toggleClass = function(){
  1913. /// <summary>
  1914. /// Adds the specified class if it is not present, removes it if it is
  1915. /// present.
  1916. /// Part of DOM/Attributes
  1917. /// </summary>
  1918. /// <param name="cssClass" type="String">
  1919. /// A CSS class with which to toggle the elements
  1920. /// </param>
  1921. /// <returns type="jQuery" />
  1922. return this.each( function( classNames, state ) {
  1923. if( typeof state !== "boolean" )
  1924. state = !jQuery.className.has( this, classNames );
  1925. jQuery.className[ state ? "add" : "remove" ]( this, classNames );
  1926. }, arguments );
  1927. };
  1928. jQuery.fn.remove = function(){
  1929. /// <summary>
  1930. /// Removes all matched elements from the DOM. This does NOT remove them from the
  1931. /// jQuery object, allowing you to use the matched elements further.
  1932. /// Can be filtered with an optional expressions.
  1933. /// Part of DOM/Manipulation
  1934. /// </summary>
  1935. /// <param name="expr" type="String" optional="true">
  1936. /// (optional) A jQuery expression to filter elements by.
  1937. /// </param>
  1938. /// <returns type="jQuery" />
  1939. return this.each( function( selector ) {
  1940. if ( !selector || jQuery.filter( selector, [ this ] ).length ) {
  1941. // Prevent memory leaks
  1942. jQuery( "*", this ).add([this]).each(function(){
  1943. jQuery.event.remove(this);
  1944. jQuery.removeData(this);
  1945. });
  1946. if (this.parentNode)
  1947. this.parentNode.removeChild( this );
  1948. }
  1949. }, arguments );
  1950. };
  1951. jQuery.fn.empty = function(){
  1952. /// <summary>
  1953. /// Removes all child nodes from the set of matched elements.
  1954. /// Part of DOM/Manipulation
  1955. /// </summary>
  1956. /// <returns type="jQuery" />
  1957. return this.each( function() {
  1958. // Remove element nodes and prevent memory leaks
  1959. jQuery(this).children().remove();
  1960. // Remove any remaining nodes
  1961. while ( this.firstChild )
  1962. this.removeChild( this.firstChild );
  1963. }, arguments );
  1964. };
  1965. // Helper function used by the dimensions and offset modules
  1966. function num(elem, prop) {
  1967. return elem[0] && parseInt( jQuery.curCSS(elem[0], prop, true), 10 ) || 0;
  1968. }
  1969. var expando = "jQuery" + now(), uuid = 0, windowData = {};
  1970. jQuery.extend({
  1971. cache: {},
  1972. data: function( elem, name, data ) {
  1973. elem = elem == window ?
  1974. windowData :
  1975. elem;
  1976. var id = elem[ expando ];
  1977. // Compute a unique ID for the element
  1978. if ( !id )
  1979. id = elem[ expando ] = ++uuid;
  1980. // Only generate the data cache if we're
  1981. // trying to access or manipulate it
  1982. if ( name && !jQuery.cache[ id ] )
  1983. jQuery.cache[ id ] = {};
  1984. // Prevent overriding the named cache with undefined values
  1985. if ( data !== undefined )
  1986. jQuery.cache[ id ][ name ] = data;
  1987. // Return the named cache data, or the ID for the element
  1988. return name ?
  1989. jQuery.cache[ id ][ name ] :
  1990. id;
  1991. },
  1992. removeData: function( elem, name ) {
  1993. elem = elem == window ?
  1994. windowData :
  1995. elem;
  1996. var id = elem[ expando ];
  1997. // If we want to remove a specific section of the element's data
  1998. if ( name ) {
  1999. if ( jQuery.cache[ id ] ) {
  2000. // Remove the section of cache data
  2001. delete jQuery.cache[ id ][ name ];
  2002. // If we've removed all the data, remove the element's cache
  2003. name = "";
  2004. for ( name in jQuery.cache[ id ] )
  2005. break;
  2006. if ( !name )
  2007. jQuery.removeData( elem );
  2008. }
  2009. // Otherwise, we want to remove all of the element's data
  2010. } else {
  2011. // Clean up the element expando
  2012. try {
  2013. delete elem[ expando ];
  2014. } catch(e){
  2015. // IE has trouble directly removing the expando
  2016. // but it's ok with using removeAttribute
  2017. if ( elem.removeAttribute )
  2018. elem.removeAttribute( expando );
  2019. }
  2020. // Completely remove the data cache
  2021. delete jQuery.cache[ id ];
  2022. }
  2023. },
  2024. queue: function( elem, type, data ) {
  2025. if ( elem ){
  2026. type = (type || "fx") + "queue";
  2027. var q = jQuery.data( elem, type );
  2028. if ( !q || jQuery.isArray(data) )
  2029. q = jQuery.data( elem, type, jQuery.makeArray(data) );
  2030. else if( data )
  2031. q.push( data );
  2032. }
  2033. return q;
  2034. },
  2035. dequeue: function( elem, type ){
  2036. var queue = jQuery.queue( elem, type ),
  2037. fn = queue.shift();
  2038. if( !type || type === "fx" )
  2039. fn = queue[0];
  2040. if( fn !== undefined )
  2041. fn.call(elem);
  2042. }
  2043. });
  2044. jQuery.fn.extend({
  2045. data: function( key, value ){
  2046. var parts = key.split(".");
  2047. parts[1] = parts[1] ? "." + parts[1] : "";
  2048. if ( value === undefined ) {
  2049. var data = this.triggerHandler("getData" + parts[1] + "!", [parts[0]]);
  2050. if ( data === undefined && this.length )
  2051. data = jQuery.data( this[0], key );
  2052. return data === undefined && parts[1] ?
  2053. this.data( parts[0] ) :
  2054. data;
  2055. } else
  2056. return this.trigger("setData" + parts[1] + "!", [parts[0], value]).each(function(){
  2057. jQuery.data( this, key, value );
  2058. });
  2059. },
  2060. removeData: function( key ){
  2061. return this.each(function(){
  2062. jQuery.removeData( this, key );
  2063. });
  2064. },
  2065. queue: function(type, data){
  2066. /// <summary>
  2067. /// 1: queue() - Returns a reference to the first element's queue (which is an array of functions).
  2068. /// 2: queue(callback) - Adds a new function, to be executed, onto the end of the queue of all matched elements.
  2069. /// 3: queue(queue) - Replaces the queue of all matched element with this new queue (the array of functions).
  2070. /// </summary>
  2071. /// <param name="type" type="Function">The function to add to the queue.</param>
  2072. /// <returns type="jQuery" />
  2073. if ( typeof type !== "string" ) {
  2074. data = type;
  2075. type = "fx";
  2076. }
  2077. if ( data === undefined )
  2078. return jQuery.queue( this[0], type );
  2079. return this.each(function(){
  2080. var queue = jQuery.queue( this, type, data );
  2081.  if( type == "fx" && queue.length == 1 )
  2082. queue[0].call(this);
  2083. });
  2084. },
  2085. dequeue: function(type){
  2086. /// <summary>
  2087. /// Removes a queued function from the front of the queue and executes it.
  2088. /// </summary>
  2089. /// <param name="type" type="String" optional="true">The type of queue to access.</param>
  2090. /// <returns type="jQuery" />
  2091. return this.each(function(){
  2092. jQuery.dequeue( this, type );
  2093. });
  2094. }
  2095. });/*!
  2096.  * Sizzle CSS Selector Engine - v0.9.3
  2097.  *  Copyright 2009, The Dojo Foundation
  2098.  *  Released under the MIT, BSD, and GPL Licenses.
  2099.  *  More information: http://sizzlejs.com/
  2100.  */
  2101. (function(){
  2102. var chunker = /((?:((?:([^()]+)|[^()]+)+)|[(?:[[^[]]*]|['"][^'"]*['"]|[^[]'"]+)+]|\.|[^ >+~,([\]+)+|[>+~])(s*,s*)?/g,
  2103. done = 0,
  2104. toString = Object.prototype.toString;
  2105. var Sizzle = function(selector, context, results, seed) {
  2106. results = results || [];
  2107. context = context || document;
  2108. if ( context.nodeType !== 1 && context.nodeType !== 9 )
  2109. return [];
  2110. if ( !selector || typeof selector !== "string" ) {
  2111. return results;
  2112. }
  2113. var parts = [], m, set, checkSet, check, mode, extra, prune = true;
  2114. // Reset the position of the chunker regexp (start from head)
  2115. chunker.lastIndex = 0;
  2116. while ( (m = chunker.exec(selector)) !== null ) {
  2117. parts.push( m[1] );
  2118. if ( m[2] ) {
  2119. extra = RegExp.rightContext;
  2120. break;
  2121. }
  2122. }
  2123. if ( parts.length > 1 && origPOS.exec( selector ) ) {
  2124. if ( parts.length === 2 && Expr.relative[ parts[0] ] ) {
  2125. set = posProcess( parts[0] + parts[1], context );
  2126. } else {
  2127. set = Expr.relative[ parts[0] ] ?
  2128. [ context ] :
  2129. Sizzle( parts.shift(), context );
  2130. while ( parts.length ) {
  2131. selector = parts.shift();
  2132. if ( Expr.relative[ selector ] )
  2133. selector += parts.shift();
  2134. set = posProcess( selector, set );
  2135. }
  2136. }
  2137. } else {
  2138. var ret = seed ?
  2139. { expr: parts.pop(), set: makeArray(seed) } :
  2140. Sizzle.find( parts.pop(), parts.length === 1 && context.parentNode ? context.parentNode : context, isXML(context) );
  2141. set = Sizzle.filter( ret.expr, ret.set );
  2142. if ( parts.length > 0 ) {
  2143. checkSet = makeArray(set);
  2144. } else {
  2145. prune = false;
  2146. }
  2147. while ( parts.length ) {
  2148. var cur = parts.pop(), pop = cur;
  2149. if ( !Expr.relative[ cur ] ) {
  2150. cur = "";
  2151. } else {
  2152. pop = parts.pop();
  2153. }
  2154. if ( pop == null ) {
  2155. pop = context;
  2156. }
  2157. Expr.relative[ cur ]( checkSet, pop, isXML(context) );
  2158. }
  2159. }
  2160. if ( !checkSet ) {
  2161. checkSet = set;
  2162. }
  2163. if ( !checkSet ) {
  2164. throw "Syntax error, unrecognized expression: " + (cur || selector);
  2165. }
  2166. if ( toString.call(checkSet) === "[object Array]" ) {
  2167. if ( !prune ) {
  2168. results.push.apply( results, checkSet );
  2169. } else if ( context.nodeType === 1 ) {
  2170. for ( var i = 0; checkSet[i] != null; i++ ) {
  2171. if ( checkSet[i] && (checkSet[i] === true || checkSet[i].nodeType === 1 && contains(context, checkSet[i])) ) {
  2172. results.push( set[i] );
  2173. }
  2174. }
  2175. } else {
  2176. for ( var i = 0; checkSet[i] != null; i++ ) {
  2177. if ( checkSet[i] && checkSet[i].nodeType === 1 ) {
  2178. results.push( set[i] );
  2179. }
  2180. }
  2181. }
  2182. } else {
  2183. makeArray( checkSet, results );
  2184. }
  2185. if ( extra ) {
  2186. Sizzle( extra, context, results, seed );
  2187. if ( sortOrder ) {
  2188. hasDuplicate = false;
  2189. results.sort(sortOrder);
  2190. if ( hasDuplicate ) {
  2191. for ( var i = 1; i < results.length; i++ ) {
  2192. if ( results[i] === results[i-1] ) {
  2193. results.splice(i--, 1);
  2194. }
  2195. }
  2196. }
  2197. }
  2198. }
  2199. return results;
  2200. };
  2201. Sizzle.matches = function(expr, set){
  2202. return Sizzle(expr, null, null, set);
  2203. };
  2204. Sizzle.find = function(expr, context, isXML){
  2205. var set, match;
  2206. if ( !expr ) {
  2207. return [];
  2208. }
  2209. for ( var i = 0, l = Expr.order.length; i < l; i++ ) {
  2210. var type = Expr.order[i], match;
  2211. if ( (match = Expr.match[ type ].exec( expr )) ) {
  2212. var left = RegExp.leftContext;
  2213. if ( left.substr( left.length - 1 ) !== "\" ) {
  2214. match[1] = (match[1] || "").replace(/\/g, "");
  2215. set = Expr.find[ type ]( match, context, isXML );
  2216. if ( set != null ) {
  2217. expr = expr.replace( Expr.match[ type ], "" );
  2218. break;
  2219. }
  2220. }
  2221. }
  2222. }
  2223. if ( !set ) {
  2224. set = context.getElementsByTagName("*");
  2225. }
  2226. return {set: set, expr: expr};
  2227. };
  2228. Sizzle.filter = function(expr, set, inplace, not){
  2229. var old = expr, result = [], curLoop = set, match, anyFound,
  2230. isXMLFilter = set && set[0] && isXML(set[0]);
  2231. while ( expr && set.length ) {
  2232. for ( var type in Expr.filter ) {
  2233. if ( (match = Expr.match[ type ].exec( expr )) != null ) {
  2234. var filter = Expr.filter[ type ], found, item;
  2235. anyFound = false;
  2236. if ( curLoop == result ) {
  2237. result = [];
  2238. }
  2239. if ( Expr.preFilter[ type ] ) {
  2240. match = Expr.preFilter[ type ]( match, curLoop, inplace, result, not, isXMLFilter );
  2241. if ( !match ) {
  2242. anyFound = found = true;
  2243. } else if ( match === true ) {
  2244. continue;
  2245. }
  2246. }
  2247. if ( match ) {
  2248. for ( var i = 0; (item = curLoop[i]) != null; i++ ) {
  2249. if ( item ) {
  2250. found = filter( item, match, i, curLoop );
  2251. var pass = not ^ !!found;
  2252. if ( inplace && found != null ) {
  2253. if ( pass ) {
  2254. anyFound = true;
  2255. } else {
  2256. curLoop[i] = false;
  2257. }
  2258. } else if ( pass ) {
  2259. result.push( item );
  2260. anyFound = true;
  2261. }
  2262. }
  2263. }
  2264. }
  2265. if ( found !== undefined ) {
  2266. if ( !inplace ) {
  2267. curLoop = result;
  2268. }
  2269. expr = expr.replace( Expr.match[ type ], "" );
  2270. if ( !anyFound ) {
  2271. return [];
  2272. }
  2273. break;
  2274. }
  2275. }
  2276. }
  2277. // Improper expression
  2278. if ( expr == old ) {
  2279. if ( anyFound == null ) {
  2280. throw "Syntax error, unrecognized expression: " + expr;
  2281. } else {
  2282. break;
  2283. }
  2284. }
  2285. old = expr;
  2286. }
  2287. return curLoop;
  2288. };
  2289. var Expr = Sizzle.selectors = {
  2290. order: [ "ID", "NAME", "TAG" ],
  2291. match: {
  2292. ID: /#((?:[wu00c0-uFFFF_-]|\.)+)/,
  2293. CLASS: /.((?:[wu00c0-uFFFF_-]|\.)+)/,
  2294. NAME: /[name=['"]*((?:[wu00c0-uFFFF_-]|\.)+)['"]*]/,
  2295. ATTR: /[s*((?:[wu00c0-uFFFF_-]|\.)+)s*(?:(S?=)s*(['"]*)(.*?)3|)s*]/,
  2296. TAG: /^((?:[wu00c0-uFFFF*_-]|\.)+)/,
  2297. CHILD: /:(only|nth|last|first)-child(?:((even|odd|[dn+-]*)))?/,
  2298. POS: /:(nth|eq|gt|lt|first|last|even|odd)(?:((d*)))?(?=[^-]|$)/,
  2299. PSEUDO: /:((?:[wu00c0-uFFFF_-]|\.)+)(?:((['"]*)((?:([^)]+)|[^2()]*)+)2))?/
  2300. },
  2301. attrMap: {
  2302. "class": "className",
  2303. "for": "htmlFor"
  2304. },
  2305. attrHandle: {
  2306. href: function(elem){
  2307. return elem.getAttribute("href");
  2308. }
  2309. },
  2310. relative: {
  2311. "+": function(checkSet, part, isXML){
  2312. var isPartStr = typeof part === "string",
  2313. isTag = isPartStr && !/W/.test(part),
  2314. isPartStrNotTag = isPartStr && !isTag;
  2315. if ( isTag && !isXML ) {
  2316. part = part.toUpperCase();
  2317. }
  2318. for ( var i = 0, l = checkSet.length, elem; i < l; i++ ) {
  2319. if ( (elem = checkSet[i]) ) {
  2320. while ( (elem = elem.previousSibling) && elem.nodeType !== 1 ) {}
  2321. checkSet[i] = isPartStrNotTag || elem && elem.nodeName === part ?
  2322. elem || false :
  2323. elem === part;
  2324. }
  2325. }
  2326. if ( isPartStrNotTag ) {
  2327. Sizzle.filter( part, checkSet, true );
  2328. }
  2329. },
  2330. ">": function(checkSet, part, isXML){
  2331. var isPartStr = typeof part === "string";
  2332. if ( isPartStr && !/W/.test(part) ) {
  2333. part = isXML ? part : part.toUpperCase();
  2334. for ( var i = 0, l = checkSet.length; i < l; i++ ) {
  2335. var elem = checkSet[i];
  2336. if ( elem ) {
  2337. var parent = elem.parentNode;
  2338. checkSet[i] = parent.nodeName === part ? parent : false;
  2339. }
  2340. }
  2341. } else {
  2342. for ( var i = 0, l = checkSet.length; i < l; i++ ) {
  2343. var elem = checkSet[i];
  2344. if ( elem ) {
  2345. checkSet[i] = isPartStr ?
  2346. elem.parentNode :
  2347. elem.parentNode === part;
  2348. }
  2349. }
  2350. if ( isPartStr ) {
  2351. Sizzle.filter( part, checkSet, true );
  2352. }
  2353. }
  2354. },
  2355. "": function(checkSet, part, isXML){
  2356. var doneName = done++, checkFn = dirCheck;
  2357. if ( !part.match(/W/) ) {
  2358. var nodeCheck = part = isXML ? part : part.toUpperCase();
  2359. checkFn = dirNodeCheck;
  2360. }
  2361. checkFn("parentNode", part, doneName, checkSet, nodeCheck, isXML);
  2362. },
  2363. "~": function(checkSet, part, isXML){
  2364. var doneName = done++, checkFn = dirCheck;
  2365. if ( typeof part === "string" && !part.match(/W/) ) {
  2366. var nodeCheck = part = isXML ? part : part.toUpperCase();
  2367. checkFn = dirNodeCheck;
  2368. }
  2369. checkFn("previousSibling", part, doneName, checkSet, nodeCheck, isXML);
  2370. }
  2371. },
  2372. find: {
  2373. ID: function(match, context, isXML){
  2374. if ( typeof context.getElementById !== "undefined" && !isXML ) {
  2375. var m = context.getElementById(match[1]);
  2376. return m ? [m] : [];
  2377. }
  2378. },
  2379. NAME: function(match, context, isXML){
  2380. if ( typeof context.getElementsByName !== "undefined" ) {
  2381. var ret = [], results = context.getElementsByName(match[1]);
  2382. for ( var i = 0, l = results.length; i < l; i++ ) {
  2383. if ( results[i].getAttribute("name") === match[1] ) {
  2384. ret.push( results[i] );
  2385. }
  2386. }
  2387. return ret.length === 0 ? null : ret;
  2388. }
  2389. },
  2390. TAG: function(match, context){
  2391. return context.getElementsByTagName(match[1]);
  2392. }
  2393. },
  2394. preFilter: {
  2395. CLASS: function(match, curLoop, inplace, result, not, isXML){
  2396. match = " " + match[1].replace(/\/g, "") + " ";
  2397. if ( isXML ) {
  2398. return match;
  2399. }
  2400. for ( var i = 0, elem; (elem = curLoop[i]) != null; i++ ) {
  2401. if ( elem ) {
  2402. if ( not ^ (elem.className && (" " + elem.className + " ").indexOf(match) >= 0) ) {
  2403. if ( !inplace )
  2404. result.push( elem );
  2405. } else if ( inplace ) {
  2406. curLoop[i] = false;
  2407. }
  2408. }
  2409. }
  2410. return false;
  2411. },
  2412. ID: function(match){
  2413. return match[1].replace(/\/g, "");
  2414. },
  2415. TAG: function(match, curLoop){
  2416. for ( var i = 0; curLoop[i] === false; i++ ){}
  2417. return curLoop[i] && isXML(curLoop[i]) ? match[1] : match[1].toUpperCase();
  2418. },
  2419. CHILD: function(match){
  2420. if ( match[1] == "nth" ) {
  2421. // parse equations like 'even', 'odd', '5', '2n', '3n+2', '4n-1', '-n+6'
  2422. var test = /(-?)(d*)n((?:+|-)?d*)/.exec(
  2423. match[2] == "even" && "2n" || match[2] == "odd" && "2n+1" ||
  2424. !/D/.test( match[2] ) && "0n+" + match[2] || match[2]);
  2425. // calculate the numbers (first)n+(last) including if they are negative
  2426. match[2] = (test[1] + (test[2] || 1)) - 0;
  2427. match[3] = test[3] - 0;
  2428. }
  2429. // TODO: Move to normal caching system
  2430. match[0] = done++;
  2431. return match;
  2432. },
  2433. ATTR: function(match, curLoop, inplace, result, not, isXML){
  2434. var name = match[1].replace(/\/g, "");
  2435. if ( !isXML && Expr.attrMap[name] ) {
  2436. match[1] = Expr.attrMap[name];
  2437. }
  2438. if ( match[2] === "~=" ) {
  2439. match[4] = " " + match[4] + " ";
  2440. }
  2441. return match;
  2442. },
  2443. PSEUDO: function(match, curLoop, inplace, result, not){
  2444. if ( match[1] === "not" ) {
  2445. // If we're dealing with a complex expression, or a simple one
  2446. if ( match[3].match(chunker).length > 1 || /^w/.test(match[3]) ) {
  2447. match[3] = Sizzle(match[3], null, null, curLoop);
  2448. } else {
  2449. var ret = Sizzle.filter(match[3], curLoop, inplace, true ^ not);
  2450. if ( !inplace ) {
  2451. result.push.apply( result, ret );
  2452. }
  2453. return false;
  2454. }
  2455. } else if ( Expr.match.POS.test( match[0] ) || Expr.match.CHILD.test( match[0] ) ) {
  2456. return true;
  2457. }
  2458. return match;
  2459. },
  2460. POS: function(match){
  2461. match.unshift( true );
  2462. return match;
  2463. }
  2464. },
  2465. filters: {
  2466. enabled: function(elem){
  2467. return elem.disabled === false && elem.type !== "hidden";
  2468. },
  2469. disabled: function(elem){
  2470. return elem.disabled === true;
  2471. },
  2472. checked: function(elem){
  2473. return elem.checked === true;
  2474. },
  2475. selected: function(elem){
  2476. // Accessing this property makes selected-by-default
  2477. // options in Safari work properly
  2478. elem.parentNode.selectedIndex;
  2479. return elem.selected === true;
  2480. },
  2481. parent: function(elem){
  2482. return !!elem.firstChild;
  2483. },
  2484. empty: function(elem){
  2485. return !elem.firstChild;
  2486. },
  2487. has: function(elem, i, match){
  2488. return !!Sizzle( match[3], elem ).length;
  2489. },
  2490. header: function(elem){
  2491. return /hd/i.test( elem.nodeName );
  2492. },
  2493. text: function(elem){
  2494. return "text" === elem.type;
  2495. },
  2496. radio: function(elem){
  2497. return "radio" === elem.type;
  2498. },
  2499. checkbox: function(elem){
  2500. return "checkbox" === elem.type;
  2501. },
  2502. file: function(elem){
  2503. return "file" === elem.type;
  2504. },
  2505. password: function(elem){
  2506. return "password" === elem.type;
  2507. },
  2508. submit: function(elem){
  2509. return "submit" === elem.type;
  2510. },
  2511. image: function(elem){
  2512. return "image" === elem.type;
  2513. },
  2514. reset: function(elem){
  2515. return "reset" === elem.type;
  2516. },
  2517. button: function(elem){
  2518. return "button" === elem.type || elem.nodeName.toUpperCase() === "BUTTON";
  2519. },
  2520. input: function(elem){
  2521. return /input|select|textarea|button/i.test(elem.nodeName);
  2522. }
  2523. },
  2524. setFilters: {
  2525. first: function(elem, i){
  2526. return i === 0;
  2527. },
  2528. last: function(elem, i, match, array){
  2529. return i === array.length - 1;
  2530. },
  2531. even: function(elem, i){
  2532. return i % 2 === 0;
  2533. },
  2534. odd: function(elem, i){
  2535. return i % 2 === 1;
  2536. },
  2537. lt: function(elem, i, match){
  2538. return i < match[3] - 0;
  2539. },
  2540. gt: function(elem, i, match){
  2541. return i > match[3] - 0;
  2542. },
  2543. nth: function(elem, i, match){
  2544. return match[3] - 0 == i;
  2545. },
  2546. eq: function(elem, i, match){
  2547. return match[3] - 0 == i;
  2548. }
  2549. },
  2550. filter: {
  2551. PSEUDO: function(elem, match, i, array){
  2552. var name = match[1], filter = Expr.filters[ name ];
  2553. if ( filter ) {
  2554. return filter( elem, i, match, array );
  2555. } else if ( name === "contains" ) {
  2556. return (elem.textContent || elem.innerText || "").indexOf(match[3]) >= 0;
  2557. } else if ( name === "not" ) {
  2558. var not = match[3];
  2559. for ( var i = 0, l = not.length; i < l; i++ ) {
  2560. if ( not[i] === elem ) {
  2561. return false;
  2562. }
  2563. }
  2564. return true;
  2565. }
  2566. },
  2567. CHILD: function(elem, match){
  2568. var type = match[1], node = elem;
  2569. switch (type) {
  2570. case 'only':
  2571. case 'first':
  2572. while (node = node.previousSibling)  {
  2573. if ( node.nodeType === 1 ) return false;
  2574. }
  2575. if ( type == 'first') return true;
  2576. node = elem;
  2577. case 'last':
  2578. while (node = node.nextSibling)  {
  2579. if ( node.nodeType === 1 ) return false;
  2580. }
  2581. return true;
  2582. case 'nth':
  2583. var first = match[2], last = match[3];
  2584. if ( first == 1 && last == 0 ) {
  2585. return true;
  2586. }
  2587. var doneName = match[0],
  2588. parent = elem.parentNode;
  2589. if ( parent && (parent.sizcache !== doneName || !elem.nodeIndex) ) {
  2590. var count = 0;
  2591. for ( node = parent.firstChild; node; node = node.nextSibling ) {
  2592. if ( node.nodeType === 1 ) {
  2593. node.nodeIndex = ++count;
  2594. }
  2595. parent.sizcache = doneName;
  2596. }
  2597. var diff = elem.nodeIndex - last;
  2598. if ( first == 0 ) {
  2599. return diff == 0;
  2600. } else {
  2601. return ( diff % first == 0 && diff / first >= 0 );
  2602. }
  2603. }
  2604. },
  2605. ID: function(elem, match){
  2606. return elem.nodeType === 1 && elem.getAttribute("id") === match;
  2607. },
  2608. TAG: function(elem, match){
  2609. return (match === "*" && elem.nodeType === 1) || elem.nodeName === match;
  2610. },
  2611. CLASS: function(elem, match){
  2612. return (" " + (elem.className || elem.getAttribute("class")) + " ")
  2613. .indexOf( match ) > -1;
  2614. },
  2615. ATTR: function(elem, match){
  2616. var name = match[1],
  2617. result = Expr.attrHandle[ name ] ?
  2618. Expr.attrHandle[ name ]( elem ) :