[ Index ] |
PHP Cross Reference of vtigercrm-6.1.0 |
[Summary view] [Print] [Text view]
1 /*! 2 * jQuery JavaScript Library v1.4 3 * http://jquery.com/ 4 * 5 * Copyright 2010, John Resig 6 * Dual licensed under the MIT or GPL Version 2 licenses. 7 * http://docs.jquery.com/License 8 * 9 * Includes Sizzle.js 10 * http://sizzlejs.com/ 11 * Copyright 2010, The Dojo Foundation 12 * Released under the MIT, BSD, and GPL Licenses. 13 * 14 * Date: Wed Jan 13 15:23:05 2010 -0500 15 */ 16 (function( window, undefined ) { 17 18 // Define a local copy of jQuery 19 var jQuery = function( selector, context ) { 20 // The jQuery object is actually just the init constructor 'enhanced' 21 return new jQuery.fn.init( selector, context ); 22 }, 23 24 // Map over jQuery in case of overwrite 25 _jQuery = window.jQuery, 26 27 // Map over the $ in case of overwrite 28 _$ = window.$, 29 30 // Use the correct document accordingly with window argument (sandbox) 31 document = window.document, 32 33 // A central reference to the root jQuery(document) 34 rootjQuery, 35 36 // A simple way to check for HTML strings or ID strings 37 // (both of which we optimize for) 38 quickExpr = /^[^<]*(<[\w\W]+>)[^>]*$|^#([\w-]+)$/, 39 40 // Is it a simple selector 41 isSimple = /^.[^:#\[\.,]*$/, 42 43 // Check if a string has a non-whitespace character in it 44 rnotwhite = /\S/, 45 46 // Used for trimming whitespace 47 rtrim = /^(\s|\u00A0)+|(\s|\u00A0)+$/g, 48 49 // Match a standalone tag 50 rsingleTag = /^<(\w+)\s*\/?>(?:<\/\1>)?$/, 51 52 // Keep a UserAgent string for use with jQuery.browser 53 userAgent = navigator.userAgent, 54 55 // For matching the engine and version of the browser 56 browserMatch, 57 58 // Has the ready events already been bound? 59 readyBound = false, 60 61 // The functions to execute on DOM ready 62 readyList = [], 63 64 // The ready event handler 65 DOMContentLoaded, 66 67 // Save a reference to some core methods 68 toString = Object.prototype.toString, 69 hasOwnProperty = Object.prototype.hasOwnProperty, 70 push = Array.prototype.push, 71 slice = Array.prototype.slice, 72 indexOf = Array.prototype.indexOf; 73 74 jQuery.fn = jQuery.prototype = { 75 init: function( selector, context ) { 76 var match, elem, ret, doc; 77 78 // Handle $(""), $(null), or $(undefined) 79 if ( !selector ) { 80 return this; 81 } 82 83 // Handle $(DOMElement) 84 if ( selector.nodeType ) { 85 this.context = this[0] = selector; 86 this.length = 1; 87 return this; 88 } 89 90 // Handle HTML strings 91 if ( typeof selector === "string" ) { 92 // Are we dealing with HTML string or an ID? 93 match = quickExpr.exec( selector ); 94 95 // Verify a match, and that no context was specified for #id 96 if ( match && (match[1] || !context) ) { 97 98 // HANDLE: $(html) -> $(array) 99 if ( match[1] ) { 100 doc = (context ? context.ownerDocument || context : document); 101 102 // If a single string is passed in and it's a single tag 103 // just do a createElement and skip the rest 104 ret = rsingleTag.exec( selector ); 105 106 if ( ret ) { 107 if ( jQuery.isPlainObject( context ) ) { 108 selector = [ document.createElement( ret[1] ) ]; 109 jQuery.fn.attr.call( selector, context, true ); 110 111 } else { 112 selector = [ doc.createElement( ret[1] ) ]; 113 } 114 115 } else { 116 ret = buildFragment( [ match[1] ], [ doc ] ); 117 selector = (ret.cacheable ? ret.fragment.cloneNode(true) : ret.fragment).childNodes; 118 } 119 120 // HANDLE: $("#id") 121 } else { 122 elem = document.getElementById( match[2] ); 123 124 if ( elem ) { 125 // Handle the case where IE and Opera return items 126 // by name instead of ID 127 if ( elem.id !== match[2] ) { 128 return rootjQuery.find( selector ); 129 } 130 131 // Otherwise, we inject the element directly into the jQuery object 132 this.length = 1; 133 this[0] = elem; 134 } 135 136 this.context = document; 137 this.selector = selector; 138 return this; 139 } 140 141 // HANDLE: $("TAG") 142 } else if ( !context && /^\w+$/.test( selector ) ) { 143 this.selector = selector; 144 this.context = document; 145 selector = document.getElementsByTagName( selector ); 146 147 // HANDLE: $(expr, $(...)) 148 } else if ( !context || context.jquery ) { 149 return (context || rootjQuery).find( selector ); 150 151 // HANDLE: $(expr, context) 152 // (which is just equivalent to: $(context).find(expr) 153 } else { 154 return jQuery( context ).find( selector ); 155 } 156 157 // HANDLE: $(function) 158 // Shortcut for document ready 159 } else if ( jQuery.isFunction( selector ) ) { 160 return rootjQuery.ready( selector ); 161 } 162 163 if (selector.selector !== undefined) { 164 this.selector = selector.selector; 165 this.context = selector.context; 166 } 167 168 return jQuery.isArray( selector ) ? 169 this.setArray( selector ) : 170 jQuery.makeArray( selector, this ); 171 }, 172 173 // Start with an empty selector 174 selector: "", 175 176 // The current version of jQuery being used 177 jquery: "1.4", 178 179 // The default length of a jQuery object is 0 180 length: 0, 181 182 // The number of elements contained in the matched element set 183 size: function() { 184 return this.length; 185 }, 186 187 toArray: function() { 188 return slice.call( this, 0 ); 189 }, 190 191 // Get the Nth element in the matched element set OR 192 // Get the whole matched element set as a clean array 193 get: function( num ) { 194 return num == null ? 195 196 // Return a 'clean' array 197 this.toArray() : 198 199 // Return just the object 200 ( num < 0 ? this.slice(num)[ 0 ] : this[ num ] ); 201 }, 202 203 // Take an array of elements and push it onto the stack 204 // (returning the new matched element set) 205 pushStack: function( elems, name, selector ) { 206 // Build a new jQuery matched element set 207 var ret = jQuery( elems || null ); 208 209 // Add the old object onto the stack (as a reference) 210 ret.prevObject = this; 211 212 ret.context = this.context; 213 214 if ( name === "find" ) { 215 ret.selector = this.selector + (this.selector ? " " : "") + selector; 216 } else if ( name ) { 217 ret.selector = this.selector + "." + name + "(" + selector + ")"; 218 } 219 220 // Return the newly-formed element set 221 return ret; 222 }, 223 224 // Force the current matched set of elements to become 225 // the specified array of elements (destroying the stack in the process) 226 // You should use pushStack() in order to do this, but maintain the stack 227 setArray: function( elems ) { 228 // Resetting the length to 0, then using the native Array push 229 // is a super-fast way to populate an object with array-like properties 230 this.length = 0; 231 push.apply( this, elems ); 232 233 return this; 234 }, 235 236 // Execute a callback for every element in the matched set. 237 // (You can seed the arguments with an array of args, but this is 238 // only used internally.) 239 each: function( callback, args ) { 240 return jQuery.each( this, callback, args ); 241 }, 242 243 ready: function( fn ) { 244 // Attach the listeners 245 jQuery.bindReady(); 246 247 // If the DOM is already ready 248 if ( jQuery.isReady ) { 249 // Execute the function immediately 250 fn.call( document, jQuery ); 251 252 // Otherwise, remember the function for later 253 } else if ( readyList ) { 254 // Add the function to the wait list 255 readyList.push( fn ); 256 } 257 258 return this; 259 }, 260 261 eq: function( i ) { 262 return i === -1 ? 263 this.slice( i ) : 264 this.slice( i, +i + 1 ); 265 }, 266 267 first: function() { 268 return this.eq( 0 ); 269 }, 270 271 last: function() { 272 return this.eq( -1 ); 273 }, 274 275 slice: function() { 276 return this.pushStack( slice.apply( this, arguments ), 277 "slice", slice.call(arguments).join(",") ); 278 }, 279 280 map: function( callback ) { 281 return this.pushStack( jQuery.map(this, function( elem, i ) { 282 return callback.call( elem, i, elem ); 283 })); 284 }, 285 286 end: function() { 287 return this.prevObject || jQuery(null); 288 }, 289 290 // For internal use only. 291 // Behaves like an Array's method, not like a jQuery method. 292 push: push, 293 sort: [].sort, 294 splice: [].splice 295 }; 296 297 // Give the init function the jQuery prototype for later instantiation 298 jQuery.fn.init.prototype = jQuery.fn; 299 300 jQuery.extend = jQuery.fn.extend = function() { 301 // copy reference to target object 302 var target = arguments[0] || {}, i = 1, length = arguments.length, deep = false, options, name, src, copy; 303 304 // Handle a deep copy situation 305 if ( typeof target === "boolean" ) { 306 deep = target; 307 target = arguments[1] || {}; 308 // skip the boolean and the target 309 i = 2; 310 } 311 312 // Handle case when target is a string or something (possible in deep copy) 313 if ( typeof target !== "object" && !jQuery.isFunction(target) ) { 314 target = {}; 315 } 316 317 // extend jQuery itself if only one argument is passed 318 if ( length === i ) { 319 target = this; 320 --i; 321 } 322 323 for ( ; i < length; i++ ) { 324 // Only deal with non-null/undefined values 325 if ( (options = arguments[ i ]) != null ) { 326 // Extend the base object 327 for ( name in options ) { 328 src = target[ name ]; 329 copy = options[ name ]; 330 331 // Prevent never-ending loop 332 if ( target === copy ) { 333 continue; 334 } 335 336 // Recurse if we're merging object literal values or arrays 337 if ( deep && copy && ( jQuery.isPlainObject(copy) || jQuery.isArray(copy) ) ) { 338 var clone = src && ( jQuery.isPlainObject(src) || jQuery.isArray(src) ) ? src 339 : jQuery.isArray(copy) ? [] : {}; 340 341 // Never move original objects, clone them 342 target[ name ] = jQuery.extend( deep, clone, copy ); 343 344 // Don't bring in undefined values 345 } else if ( copy !== undefined ) { 346 target[ name ] = copy; 347 } 348 } 349 } 350 } 351 352 // Return the modified object 353 return target; 354 }; 355 356 jQuery.extend({ 357 noConflict: function( deep ) { 358 window.$ = _$; 359 360 if ( deep ) { 361 window.jQuery = _jQuery; 362 } 363 364 return jQuery; 365 }, 366 367 // Is the DOM ready to be used? Set to true once it occurs. 368 isReady: false, 369 370 // Handle when the DOM is ready 371 ready: function() { 372 // Make sure that the DOM is not already loaded 373 if ( !jQuery.isReady ) { 374 // Make sure body exists, at least, in case IE gets a little overzealous (ticket #5443). 375 if ( !document.body ) { 376 return setTimeout( jQuery.ready, 13 ); 377 } 378 379 // Remember that the DOM is ready 380 jQuery.isReady = true; 381 382 // If there are functions bound, to execute 383 if ( readyList ) { 384 // Execute all of them 385 var fn, i = 0; 386 while ( (fn = readyList[ i++ ]) ) { 387 fn.call( document, jQuery ); 388 } 389 390 // Reset the list of functions 391 readyList = null; 392 } 393 394 // Trigger any bound ready events 395 if ( jQuery.fn.triggerHandler ) { 396 jQuery( document ).triggerHandler( "ready" ); 397 } 398 } 399 }, 400 401 bindReady: function() { 402 if ( readyBound ) { 403 return; 404 } 405 406 readyBound = true; 407 408 // Catch cases where $(document).ready() is called after the 409 // browser event has already occurred. 410 if ( document.readyState === "complete" ) { 411 return jQuery.ready(); 412 } 413 414 // Mozilla, Opera and webkit nightlies currently support this event 415 if ( document.addEventListener ) { 416 // Use the handy event callback 417 document.addEventListener( "DOMContentLoaded", DOMContentLoaded, false ); 418 419 // A fallback to window.onload, that will always work 420 window.addEventListener( "load", jQuery.ready, false ); 421 422 // If IE event model is used 423 } else if ( document.attachEvent ) { 424 // ensure firing before onload, 425 // maybe late but safe also for iframes 426 document.attachEvent("onreadystatechange", DOMContentLoaded); 427 428 // A fallback to window.onload, that will always work 429 window.attachEvent( "onload", jQuery.ready ); 430 431 // If IE and not a frame 432 // continually check to see if the document is ready 433 var toplevel = false; 434 435 try { 436 toplevel = window.frameElement == null; 437 } catch(e) {} 438 439 if ( document.documentElement.doScroll && toplevel ) { 440 doScrollCheck(); 441 } 442 } 443 }, 444 445 // See test/unit/core.js for details concerning isFunction. 446 // Since version 1.3, DOM methods and functions like alert 447 // aren't supported. They return false on IE (#2968). 448 isFunction: function( obj ) { 449 return toString.call(obj) === "[object Function]"; 450 }, 451 452 isArray: function( obj ) { 453 return toString.call(obj) === "[object Array]"; 454 }, 455 456 isPlainObject: function( obj ) { 457 // Must be an Object. 458 // Because of IE, we also have to check the presence of the constructor property. 459 // Make sure that DOM nodes and window objects don't pass through, as well 460 if ( !obj || toString.call(obj) !== "[object Object]" || obj.nodeType || obj.setInterval ) { 461 return false; 462 } 463 464 // Not own constructor property must be Object 465 if ( obj.constructor 466 && !hasOwnProperty.call(obj, "constructor") 467 && !hasOwnProperty.call(obj.constructor.prototype, "isPrototypeOf") ) { 468 return false; 469 } 470 471 // Own properties are enumerated firstly, so to speed up, 472 // if last one is own, then all properties are own. 473 474 var key; 475 for ( key in obj ) {} 476 477 return key === undefined || hasOwnProperty.call( obj, key ); 478 }, 479 480 isEmptyObject: function( obj ) { 481 for ( var name in obj ) { 482 return false; 483 } 484 return true; 485 }, 486 487 noop: function() {}, 488 489 // Evalulates a script in a global context 490 globalEval: function( data ) { 491 if ( data && rnotwhite.test(data) ) { 492 // Inspired by code by Andrea Giammarchi 493 // http://webreflection.blogspot.com/2007/08/global-scope-evaluation-and-dom.html 494 var head = document.getElementsByTagName("head")[0] || document.documentElement, 495 script = document.createElement("script"); 496 497 script.type = "text/javascript"; 498 499 if ( jQuery.support.scriptEval ) { 500 script.appendChild( document.createTextNode( data ) ); 501 } else { 502 script.text = data; 503 } 504 505 // Use insertBefore instead of appendChild to circumvent an IE6 bug. 506 // This arises when a base node is used (#2709). 507 head.insertBefore( script, head.firstChild ); 508 head.removeChild( script ); 509 } 510 }, 511 512 nodeName: function( elem, name ) { 513 return elem.nodeName && elem.nodeName.toUpperCase() === name.toUpperCase(); 514 }, 515 516 // args is for internal usage only 517 each: function( object, callback, args ) { 518 var name, i = 0, 519 length = object.length, 520 isObj = length === undefined || jQuery.isFunction(object); 521 522 if ( args ) { 523 if ( isObj ) { 524 for ( name in object ) { 525 if ( callback.apply( object[ name ], args ) === false ) { 526 break; 527 } 528 } 529 } else { 530 for ( ; i < length; ) { 531 if ( callback.apply( object[ i++ ], args ) === false ) { 532 break; 533 } 534 } 535 } 536 537 // A special, fast, case for the most common use of each 538 } else { 539 if ( isObj ) { 540 for ( name in object ) { 541 if ( callback.call( object[ name ], name, object[ name ] ) === false ) { 542 break; 543 } 544 } 545 } else { 546 for ( var value = object[0]; 547 i < length && callback.call( value, i, value ) !== false; value = object[++i] ) {} 548 } 549 } 550 551 return object; 552 }, 553 554 trim: function( text ) { 555 return (text || "").replace( rtrim, "" ); 556 }, 557 558 // results is for internal usage only 559 makeArray: function( array, results ) { 560 var ret = results || []; 561 562 if ( array != null ) { 563 // The window, strings (and functions) also have 'length' 564 // The extra typeof function check is to prevent crashes 565 // in Safari 2 (See: #3039) 566 if ( array.length == null || typeof array === "string" || jQuery.isFunction(array) || (typeof array !== "function" && array.setInterval) ) { 567 push.call( ret, array ); 568 } else { 569 jQuery.merge( ret, array ); 570 } 571 } 572 573 return ret; 574 }, 575 576 inArray: function( elem, array ) { 577 if ( array.indexOf ) { 578 return array.indexOf( elem ); 579 } 580 581 for ( var i = 0, length = array.length; i < length; i++ ) { 582 if ( array[ i ] === elem ) { 583 return i; 584 } 585 } 586 587 return -1; 588 }, 589 590 merge: function( first, second ) { 591 var i = first.length, j = 0; 592 593 if ( typeof second.length === "number" ) { 594 for ( var l = second.length; j < l; j++ ) { 595 first[ i++ ] = second[ j ]; 596 } 597 } else { 598 while ( second[j] !== undefined ) { 599 first[ i++ ] = second[ j++ ]; 600 } 601 } 602 603 first.length = i; 604 605 return first; 606 }, 607 608 grep: function( elems, callback, inv ) { 609 var ret = []; 610 611 // Go through the array, only saving the items 612 // that pass the validator function 613 for ( var i = 0, length = elems.length; i < length; i++ ) { 614 if ( !inv !== !callback( elems[ i ], i ) ) { 615 ret.push( elems[ i ] ); 616 } 617 } 618 619 return ret; 620 }, 621 622 // arg is for internal usage only 623 map: function( elems, callback, arg ) { 624 var ret = [], value; 625 626 // Go through the array, translating each of the items to their 627 // new value (or values). 628 for ( var i = 0, length = elems.length; i < length; i++ ) { 629 value = callback( elems[ i ], i, arg ); 630 631 if ( value != null ) { 632 ret[ ret.length ] = value; 633 } 634 } 635 636 return ret.concat.apply( [], ret ); 637 }, 638 639 // A global GUID counter for objects 640 guid: 1, 641 642 proxy: function( fn, proxy, thisObject ) { 643 if ( arguments.length === 2 ) { 644 if ( typeof proxy === "string" ) { 645 thisObject = fn; 646 fn = thisObject[ proxy ]; 647 proxy = undefined; 648 649 } else if ( proxy && !jQuery.isFunction( proxy ) ) { 650 thisObject = proxy; 651 proxy = undefined; 652 } 653 } 654 655 if ( !proxy && fn ) { 656 proxy = function() { 657 return fn.apply( thisObject || this, arguments ); 658 }; 659 } 660 661 // Set the guid of unique handler to the same of original handler, so it can be removed 662 if ( fn ) { 663 proxy.guid = fn.guid = fn.guid || proxy.guid || jQuery.guid++; 664 } 665 666 // So proxy can be declared as an argument 667 return proxy; 668 }, 669 670 // Use of jQuery.browser is frowned upon. 671 // More details: http://docs.jquery.com/Utilities/jQuery.browser 672 uaMatch: function( ua ) { 673 var ret = { browser: "" }; 674 675 ua = ua.toLowerCase(); 676 677 if ( /webkit/.test( ua ) ) { 678 ret = { browser: "webkit", version: /webkit[\/ ]([\w.]+)/ }; 679 680 } else if ( /opera/.test( ua ) ) { 681 ret = { browser: "opera", version: /version/.test( ua ) ? /version[\/ ]([\w.]+)/ : /opera[\/ ]([\w.]+)/ }; 682 683 } else if ( /msie/.test( ua ) ) { 684 ret = { browser: "msie", version: /msie ([\w.]+)/ }; 685 686 } else if ( /mozilla/.test( ua ) && !/compatible/.test( ua ) ) { 687 ret = { browser: "mozilla", version: /rv:([\w.]+)/ }; 688 } 689 690 ret.version = (ret.version && ret.version.exec( ua ) || [0, "0"])[1]; 691 692 return ret; 693 }, 694 695 browser: {} 696 }); 697 698 browserMatch = jQuery.uaMatch( userAgent ); 699 if ( browserMatch.browser ) { 700 jQuery.browser[ browserMatch.browser ] = true; 701 jQuery.browser.version = browserMatch.version; 702 } 703 704 // Deprecated, use jQuery.browser.webkit instead 705 if ( jQuery.browser.webkit ) { 706 jQuery.browser.safari = true; 707 } 708 709 if ( indexOf ) { 710 jQuery.inArray = function( elem, array ) { 711 return indexOf.call( array, elem ); 712 }; 713 } 714 715 // All jQuery objects should point back to these 716 rootjQuery = jQuery(document); 717 718 // Cleanup functions for the document ready method 719 if ( document.addEventListener ) { 720 DOMContentLoaded = function() { 721 document.removeEventListener( "DOMContentLoaded", DOMContentLoaded, false ); 722 jQuery.ready(); 723 }; 724 725 } else if ( document.attachEvent ) { 726 DOMContentLoaded = function() { 727 // Make sure body exists, at least, in case IE gets a little overzealous (ticket #5443). 728 if ( document.readyState === "complete" ) { 729 document.detachEvent( "onreadystatechange", DOMContentLoaded ); 730 jQuery.ready(); 731 } 732 }; 733 } 734 735 // The DOM ready check for Internet Explorer 736 function doScrollCheck() { 737 if ( jQuery.isReady ) { 738 return; 739 } 740 741 try { 742 // If IE is used, use the trick by Diego Perini 743 // http://javascript.nwbox.com/IEContentLoaded/ 744 document.documentElement.doScroll("left"); 745 } catch( error ) { 746 setTimeout( doScrollCheck, 1 ); 747 return; 748 } 749 750 // and execute any waiting functions 751 jQuery.ready(); 752 } 753 754 if ( indexOf ) { 755 jQuery.inArray = function( elem, array ) { 756 return indexOf.call( array, elem ); 757 }; 758 } 759 760 function evalScript( i, elem ) { 761 if ( elem.src ) { 762 jQuery.ajax({ 763 url: elem.src, 764 async: false, 765 dataType: "script" 766 }); 767 } else { 768 jQuery.globalEval( elem.text || elem.textContent || elem.innerHTML || "" ); 769 } 770 771 if ( elem.parentNode ) { 772 elem.parentNode.removeChild( elem ); 773 } 774 } 775 776 // Mutifunctional method to get and set values to a collection 777 // The value/s can be optionally by executed if its a function 778 function access( elems, key, value, exec, fn, pass ) { 779 var length = elems.length; 780 781 // Setting many attributes 782 if ( typeof key === "object" ) { 783 for ( var k in key ) { 784 access( elems, k, key[k], exec, fn, value ); 785 } 786 return elems; 787 } 788 789 // Setting one attribute 790 if ( value !== undefined ) { 791 // Optionally, function values get executed if exec is true 792 exec = !pass && exec && jQuery.isFunction(value); 793 794 for ( var i = 0; i < length; i++ ) { 795 fn( elems[i], key, exec ? value.call( elems[i], i, fn( elems[i], key ) ) : value, pass ); 796 } 797 798 return elems; 799 } 800 801 // Getting an attribute 802 return length ? fn( elems[0], key ) : null; 803 } 804 805 function now() { 806 return (new Date).getTime(); 807 } 808 (function() { 809 810 jQuery.support = {}; 811 812 var root = document.documentElement, 813 script = document.createElement("script"), 814 div = document.createElement("div"), 815 id = "script" + now(); 816 817 div.style.display = "none"; 818 div.innerHTML = " <link/><table></table><a href='/a' style='color:red;float:left;opacity:.55;'>a</a><input type='checkbox'/>"; 819 820 var all = div.getElementsByTagName("*"), 821 a = div.getElementsByTagName("a")[0]; 822 823 // Can't get basic test support 824 if ( !all || !all.length || !a ) { 825 return; 826 } 827 828 jQuery.support = { 829 // IE strips leading whitespace when .innerHTML is used 830 leadingWhitespace: div.firstChild.nodeType === 3, 831 832 // Make sure that tbody elements aren't automatically inserted 833 // IE will insert them into empty tables 834 tbody: !div.getElementsByTagName("tbody").length, 835 836 // Make sure that link elements get serialized correctly by innerHTML 837 // This requires a wrapper element in IE 838 htmlSerialize: !!div.getElementsByTagName("link").length, 839 840 // Get the style information from getAttribute 841 // (IE uses .cssText insted) 842 style: /red/.test( a.getAttribute("style") ), 843 844 // Make sure that URLs aren't manipulated 845 // (IE normalizes it by default) 846 hrefNormalized: a.getAttribute("href") === "/a", 847 848 // Make sure that element opacity exists 849 // (IE uses filter instead) 850 // Use a regex to work around a WebKit issue. See #5145 851 opacity: /^0.55$/.test( a.style.opacity ), 852 853 // Verify style float existence 854 // (IE uses styleFloat instead of cssFloat) 855 cssFloat: !!a.style.cssFloat, 856 857 // Make sure that if no value is specified for a checkbox 858 // that it defaults to "on". 859 // (WebKit defaults to "" instead) 860 checkOn: div.getElementsByTagName("input")[0].value === "on", 861 862 // Make sure that a selected-by-default option has a working selected property. 863 // (WebKit defaults to false instead of true, IE too, if it's in an optgroup) 864 optSelected: document.createElement("select").appendChild( document.createElement("option") ).selected, 865 866 // Will be defined later 867 scriptEval: false, 868 noCloneEvent: true, 869 boxModel: null 870 }; 871 872 script.type = "text/javascript"; 873 try { 874 script.appendChild( document.createTextNode( "window." + id + "=1;" ) ); 875 } catch(e) {} 876 877 root.insertBefore( script, root.firstChild ); 878 879 // Make sure that the execution of code works by injecting a script 880 // tag with appendChild/createTextNode 881 // (IE doesn't support this, fails, and uses .text instead) 882 if ( window[ id ] ) { 883 jQuery.support.scriptEval = true; 884 delete window[ id ]; 885 } 886 887 root.removeChild( script ); 888 889 if ( div.attachEvent && div.fireEvent ) { 890 div.attachEvent("onclick", function click() { 891 // Cloning a node shouldn't copy over any 892 // bound event handlers (IE does this) 893 jQuery.support.noCloneEvent = false; 894 div.detachEvent("onclick", click); 895 }); 896 div.cloneNode(true).fireEvent("onclick"); 897 } 898 899 // Figure out if the W3C box model works as expected 900 // document.body must exist before we can do this 901 // TODO: This timeout is temporary until I move ready into core.js. 902 jQuery(function() { 903 var div = document.createElement("div"); 904 div.style.width = div.style.paddingLeft = "1px"; 905 906 document.body.appendChild( div ); 907 jQuery.boxModel = jQuery.support.boxModel = div.offsetWidth === 2; 908 document.body.removeChild( div ).style.display = 'none'; 909 div = null; 910 }); 911 912 // Technique from Juriy Zaytsev 913 // http://thinkweb2.com/projects/prototype/detecting-event-support-without-browser-sniffing/ 914 var eventSupported = function( eventName ) { 915 var el = document.createElement("div"); 916 eventName = "on" + eventName; 917 918 var isSupported = (eventName in el); 919 if ( !isSupported ) { 920 el.setAttribute(eventName, "return;"); 921 isSupported = typeof el[eventName] === "function"; 922 } 923 el = null; 924 925 return isSupported; 926 }; 927 928 jQuery.support.submitBubbles = eventSupported("submit"); 929 jQuery.support.changeBubbles = eventSupported("change"); 930 931 // release memory in IE 932 root = script = div = all = a = null; 933 })(); 934 935 jQuery.props = { 936 "for": "htmlFor", 937 "class": "className", 938 readonly: "readOnly", 939 maxlength: "maxLength", 940 cellspacing: "cellSpacing", 941 rowspan: "rowSpan", 942 colspan: "colSpan", 943 tabindex: "tabIndex", 944 usemap: "useMap", 945 frameborder: "frameBorder" 946 }; 947 var expando = "jQuery" + now(), uuid = 0, windowData = {}; 948 var emptyObject = {}; 949 950 jQuery.extend({ 951 cache: {}, 952 953 expando:expando, 954 955 // The following elements throw uncatchable exceptions if you 956 // attempt to add expando properties to them. 957 noData: { 958 "embed": true, 959 "object": true, 960 "applet": true 961 }, 962 963 data: function( elem, name, data ) { 964 if ( elem.nodeName && jQuery.noData[elem.nodeName.toLowerCase()] ) { 965 return; 966 } 967 968 elem = elem == window ? 969 windowData : 970 elem; 971 972 var id = elem[ expando ], cache = jQuery.cache, thisCache; 973 974 // Handle the case where there's no name immediately 975 if ( !name && !id ) { 976 return null; 977 } 978 979 // Compute a unique ID for the element 980 if ( !id ) { 981 id = ++uuid; 982 } 983 984 // Avoid generating a new cache unless none exists and we 985 // want to manipulate it. 986 if ( typeof name === "object" ) { 987 elem[ expando ] = id; 988 thisCache = cache[ id ] = jQuery.extend(true, {}, name); 989 } else if ( cache[ id ] ) { 990 thisCache = cache[ id ]; 991 } else if ( typeof data === "undefined" ) { 992 thisCache = emptyObject; 993 } else { 994 thisCache = cache[ id ] = {}; 995 } 996 997 // Prevent overriding the named cache with undefined values 998 if ( data !== undefined ) { 999 elem[ expando ] = id; 1000 thisCache[ name ] = data; 1001 } 1002 1003 return typeof name === "string" ? thisCache[ name ] : thisCache; 1004 }, 1005 1006 removeData: function( elem, name ) { 1007 if ( elem.nodeName && jQuery.noData[elem.nodeName.toLowerCase()] ) { 1008 return; 1009 } 1010 1011 elem = elem == window ? 1012 windowData : 1013 elem; 1014 1015 var id = elem[ expando ], cache = jQuery.cache, thisCache = cache[ id ]; 1016 1017 // If we want to remove a specific section of the element's data 1018 if ( name ) { 1019 if ( thisCache ) { 1020 // Remove the section of cache data 1021 delete thisCache[ name ]; 1022 1023 // If we've removed all the data, remove the element's cache 1024 if ( jQuery.isEmptyObject(thisCache) ) { 1025 jQuery.removeData( elem ); 1026 } 1027 } 1028 1029 // Otherwise, we want to remove all of the element's data 1030 } else { 1031 // Clean up the element expando 1032 try { 1033 delete elem[ expando ]; 1034 } catch( e ) { 1035 // IE has trouble directly removing the expando 1036 // but it's ok with using removeAttribute 1037 if ( elem.removeAttribute ) { 1038 elem.removeAttribute( expando ); 1039 } 1040 } 1041 1042 // Completely remove the data cache 1043 delete cache[ id ]; 1044 } 1045 } 1046 }); 1047 1048 jQuery.fn.extend({ 1049 data: function( key, value ) { 1050 if ( typeof key === "undefined" && this.length ) { 1051 return jQuery.data( this[0] ); 1052 1053 } else if ( typeof key === "object" ) { 1054 return this.each(function() { 1055 jQuery.data( this, key ); 1056 }); 1057 } 1058 1059 var parts = key.split("."); 1060 parts[1] = parts[1] ? "." + parts[1] : ""; 1061 1062 if ( value === undefined ) { 1063 var data = this.triggerHandler("getData" + parts[1] + "!", [parts[0]]); 1064 1065 if ( data === undefined && this.length ) { 1066 data = jQuery.data( this[0], key ); 1067 } 1068 return data === undefined && parts[1] ? 1069 this.data( parts[0] ) : 1070 data; 1071 } else { 1072 return this.trigger("setData" + parts[1] + "!", [parts[0], value]).each(function() { 1073 jQuery.data( this, key, value ); 1074 }); 1075 } 1076 }, 1077 1078 removeData: function( key ) { 1079 return this.each(function() { 1080 jQuery.removeData( this, key ); 1081 }); 1082 } 1083 }); 1084 jQuery.extend({ 1085 queue: function( elem, type, data ) { 1086 if ( !elem ) { 1087 return; 1088 } 1089 1090 type = (type || "fx") + "queue"; 1091 var q = jQuery.data( elem, type ); 1092 1093 // Speed up dequeue by getting out quickly if this is just a lookup 1094 if ( !data ) { 1095 return q || []; 1096 } 1097 1098 if ( !q || jQuery.isArray(data) ) { 1099 q = jQuery.data( elem, type, jQuery.makeArray(data) ); 1100 1101 } else { 1102 q.push( data ); 1103 } 1104 1105 return q; 1106 }, 1107 1108 dequeue: function( elem, type ) { 1109 type = type || "fx"; 1110 1111 var queue = jQuery.queue( elem, type ), fn = queue.shift(); 1112 1113 // If the fx queue is dequeued, always remove the progress sentinel 1114 if ( fn === "inprogress" ) { 1115 fn = queue.shift(); 1116 } 1117 1118 if ( fn ) { 1119 // Add a progress sentinel to prevent the fx queue from being 1120 // automatically dequeued 1121 if ( type === "fx" ) { 1122 queue.unshift("inprogress"); 1123 } 1124 1125 fn.call(elem, function() { 1126 jQuery.dequeue(elem, type); 1127 }); 1128 } 1129 } 1130 }); 1131 1132 jQuery.fn.extend({ 1133 queue: function( type, data ) { 1134 if ( typeof type !== "string" ) { 1135 data = type; 1136 type = "fx"; 1137 } 1138 1139 if ( data === undefined ) { 1140 return jQuery.queue( this[0], type ); 1141 } 1142 return this.each(function( i, elem ) { 1143 var queue = jQuery.queue( this, type, data ); 1144 1145 if ( type === "fx" && queue[0] !== "inprogress" ) { 1146 jQuery.dequeue( this, type ); 1147 } 1148 }); 1149 }, 1150 dequeue: function( type ) { 1151 return this.each(function() { 1152 jQuery.dequeue( this, type ); 1153 }); 1154 }, 1155 1156 // Based off of the plugin by Clint Helfers, with permission. 1157 // http://blindsignals.com/index.php/2009/07/jquery-delay/ 1158 delay: function( time, type ) { 1159 time = jQuery.fx ? jQuery.fx.speeds[time] || time : time; 1160 type = type || "fx"; 1161 1162 return this.queue( type, function() { 1163 var elem = this; 1164 setTimeout(function() { 1165 jQuery.dequeue( elem, type ); 1166 }, time ); 1167 }); 1168 }, 1169 1170 clearQueue: function( type ) { 1171 return this.queue( type || "fx", [] ); 1172 } 1173 }); 1174 var rclass = /[\n\t]/g, 1175 rspace = /\s+/, 1176 rreturn = /\r/g, 1177 rspecialurl = /href|src|style/, 1178 rtype = /(button|input)/i, 1179 rfocusable = /(button|input|object|select|textarea)/i, 1180 rclickable = /^(a|area)$/i, 1181 rradiocheck = /radio|checkbox/; 1182 1183 jQuery.fn.extend({ 1184 attr: function( name, value ) { 1185 return access( this, name, value, true, jQuery.attr ); 1186 }, 1187 1188 removeAttr: function( name, fn ) { 1189 return this.each(function(){ 1190 jQuery.attr( this, name, "" ); 1191 if ( this.nodeType === 1 ) { 1192 this.removeAttribute( name ); 1193 } 1194 }); 1195 }, 1196 1197 addClass: function( value ) { 1198 if ( jQuery.isFunction(value) ) { 1199 return this.each(function(i) { 1200 var self = jQuery(this); 1201 self.addClass( value.call(this, i, self.attr("class")) ); 1202 }); 1203 } 1204 1205 if ( value && typeof value === "string" ) { 1206 var classNames = (value || "").split( rspace ); 1207 1208 for ( var i = 0, l = this.length; i < l; i++ ) { 1209 var elem = this[i]; 1210 1211 if ( elem.nodeType === 1 ) { 1212 if ( !elem.className ) { 1213 elem.className = value; 1214 1215 } else { 1216 var className = " " + elem.className + " "; 1217 for ( var c = 0, cl = classNames.length; c < cl; c++ ) { 1218 if ( className.indexOf( " " + classNames[c] + " " ) < 0 ) { 1219 elem.className += " " + classNames[c]; 1220 } 1221 } 1222 } 1223 } 1224 } 1225 } 1226 1227 return this; 1228 }, 1229 1230 removeClass: function( value ) { 1231 if ( jQuery.isFunction(value) ) { 1232 return this.each(function(i) { 1233 var self = jQuery(this); 1234 self.removeClass( value.call(this, i, self.attr("class")) ); 1235 }); 1236 } 1237 1238 if ( (value && typeof value === "string") || value === undefined ) { 1239 var classNames = (value || "").split(rspace); 1240 1241 for ( var i = 0, l = this.length; i < l; i++ ) { 1242 var elem = this[i]; 1243 1244 if ( elem.nodeType === 1 && elem.className ) { 1245 if ( value ) { 1246 var className = (" " + elem.className + " ").replace(rclass, " "); 1247 for ( var c = 0, cl = classNames.length; c < cl; c++ ) { 1248 className = className.replace(" " + classNames[c] + " ", " "); 1249 } 1250 elem.className = className.substring(1, className.length - 1); 1251 1252 } else { 1253 elem.className = ""; 1254 } 1255 } 1256 } 1257 } 1258 1259 return this; 1260 }, 1261 1262 toggleClass: function( value, stateVal ) { 1263 var type = typeof value, isBool = typeof stateVal === "boolean"; 1264 1265 if ( jQuery.isFunction( value ) ) { 1266 return this.each(function(i) { 1267 var self = jQuery(this); 1268 self.toggleClass( value.call(this, i, self.attr("class"), stateVal), stateVal ); 1269 }); 1270 } 1271 1272 return this.each(function() { 1273 if ( type === "string" ) { 1274 // toggle individual class names 1275 var className, i = 0, self = jQuery(this), 1276 state = stateVal, 1277 classNames = value.split( rspace ); 1278 1279 while ( (className = classNames[ i++ ]) ) { 1280 // check each className given, space seperated list 1281 state = isBool ? state : !self.hasClass( className ); 1282 self[ state ? "addClass" : "removeClass" ]( className ); 1283 } 1284 1285 } else if ( type === "undefined" || type === "boolean" ) { 1286 if ( this.className ) { 1287 // store className if set 1288 jQuery.data( this, "__className__", this.className ); 1289 } 1290 1291 // toggle whole className 1292 this.className = this.className || value === false ? "" : jQuery.data( this, "__className__" ) || ""; 1293 } 1294 }); 1295 }, 1296 1297 hasClass: function( selector ) { 1298 var className = " " + selector + " "; 1299 for ( var i = 0, l = this.length; i < l; i++ ) { 1300 if ( (" " + this[i].className + " ").replace(rclass, " ").indexOf( className ) > -1 ) { 1301 return true; 1302 } 1303 } 1304 1305 return false; 1306 }, 1307 1308 val: function( value ) { 1309 if ( value === undefined ) { 1310 var elem = this[0]; 1311 1312 if ( elem ) { 1313 if ( jQuery.nodeName( elem, "option" ) ) { 1314 return (elem.attributes.value || {}).specified ? elem.value : elem.text; 1315 } 1316 1317 // We need to handle select boxes special 1318 if ( jQuery.nodeName( elem, "select" ) ) { 1319 var index = elem.selectedIndex, 1320 values = [], 1321 options = elem.options, 1322 one = elem.type === "select-one"; 1323 1324 // Nothing was selected 1325 if ( index < 0 ) { 1326 return null; 1327 } 1328 1329 // Loop through all the selected options 1330 for ( var i = one ? index : 0, max = one ? index + 1 : options.length; i < max; i++ ) { 1331 var option = options[ i ]; 1332 1333 if ( option.selected ) { 1334 // Get the specifc value for the option 1335 value = jQuery(option).val(); 1336 1337 // We don't need an array for one selects 1338 if ( one ) { 1339 return value; 1340 } 1341 1342 // Multi-Selects return an array 1343 values.push( value ); 1344 } 1345 } 1346 1347 return values; 1348 } 1349 1350 // Handle the case where in Webkit "" is returned instead of "on" if a value isn't specified 1351 if ( rradiocheck.test( elem.type ) && !jQuery.support.checkOn ) { 1352 return elem.getAttribute("value") === null ? "on" : elem.value; 1353 } 1354 1355 1356 // Everything else, we just grab the value 1357 return (elem.value || "").replace(rreturn, ""); 1358 1359 } 1360 1361 return undefined; 1362 } 1363 1364 var isFunction = jQuery.isFunction(value); 1365 1366 return this.each(function(i) { 1367 var self = jQuery(this), val = value; 1368 1369 if ( this.nodeType !== 1 ) { 1370 return; 1371 } 1372 1373 if ( isFunction ) { 1374 val = value.call(this, i, self.val()); 1375 } 1376 1377 // Typecast each time if the value is a Function and the appended 1378 // value is therefore different each time. 1379 if ( typeof val === "number" ) { 1380 val += ""; 1381 } 1382 1383 if ( jQuery.isArray(val) && rradiocheck.test( this.type ) ) { 1384 this.checked = jQuery.inArray( self.val(), val ) >= 0; 1385 1386 } else if ( jQuery.nodeName( this, "select" ) ) { 1387 var values = jQuery.makeArray(val); 1388 1389 jQuery( "option", this ).each(function() { 1390 this.selected = jQuery.inArray( jQuery(this).val(), values ) >= 0; 1391 }); 1392 1393 if ( !values.length ) { 1394 this.selectedIndex = -1; 1395 } 1396 1397 } else { 1398 this.value = val; 1399 } 1400 }); 1401 } 1402 }); 1403 1404 jQuery.extend({ 1405 attrFn: { 1406 val: true, 1407 css: true, 1408 html: true, 1409 text: true, 1410 data: true, 1411 width: true, 1412 height: true, 1413 offset: true 1414 }, 1415 1416 attr: function( elem, name, value, pass ) { 1417 // don't set attributes on text and comment nodes 1418 if ( !elem || elem.nodeType === 3 || elem.nodeType === 8 ) { 1419 return undefined; 1420 } 1421 1422 if ( pass && name in jQuery.attrFn ) { 1423 return jQuery(elem)[name](value); 1424 } 1425 1426 var notxml = elem.nodeType !== 1 || !jQuery.isXMLDoc( elem ), 1427 // Whether we are setting (or getting) 1428 set = value !== undefined; 1429 1430 // Try to normalize/fix the name 1431 name = notxml && jQuery.props[ name ] || name; 1432 1433 // Only do all the following if this is a node (faster for style) 1434 if ( elem.nodeType === 1 ) { 1435 // These attributes require special treatment 1436 var special = rspecialurl.test( name ); 1437 1438 // Safari mis-reports the default selected property of an option 1439 // Accessing the parent's selectedIndex property fixes it 1440 if ( name === "selected" && !jQuery.support.optSelected ) { 1441 var parent = elem.parentNode; 1442 if ( parent ) { 1443 parent.selectedIndex; 1444 1445 // Make sure that it also works with optgroups, see #5701 1446 if ( parent.parentNode ) { 1447 parent.parentNode.selectedIndex; 1448 } 1449 } 1450 } 1451 1452 // If applicable, access the attribute via the DOM 0 way 1453 if ( name in elem && notxml && !special ) { 1454 if ( set ) { 1455 // We can't allow the type property to be changed (since it causes problems in IE) 1456 if ( name === "type" && rtype.test( elem.nodeName ) && elem.parentNode ) { 1457 throw "type property can't be changed"; 1458 } 1459 1460 elem[ name ] = value; 1461 } 1462 1463 // browsers index elements by id/name on forms, give priority to attributes. 1464 if ( jQuery.nodeName( elem, "form" ) && elem.getAttributeNode(name) ) { 1465 return elem.getAttributeNode( name ).nodeValue; 1466 } 1467 1468 // elem.tabIndex doesn't always return the correct value when it hasn't been explicitly set 1469 // http://fluidproject.org/blog/2008/01/09/getting-setting-and-removing-tabindex-values-with-javascript/ 1470 if ( name === "tabIndex" ) { 1471 var attributeNode = elem.getAttributeNode( "tabIndex" ); 1472 1473 return attributeNode && attributeNode.specified ? 1474 attributeNode.value : 1475 rfocusable.test( elem.nodeName ) || rclickable.test( elem.nodeName ) && elem.href ? 1476 0 : 1477 undefined; 1478 } 1479 1480 return elem[ name ]; 1481 } 1482 1483 if ( !jQuery.support.style && notxml && name === "style" ) { 1484 if ( set ) { 1485 elem.style.cssText = "" + value; 1486 } 1487 1488 return elem.style.cssText; 1489 } 1490 1491 if ( set ) { 1492 // convert the value to a string (all browsers do this but IE) see #1070 1493 elem.setAttribute( name, "" + value ); 1494 } 1495 1496 var attr = !jQuery.support.hrefNormalized && notxml && special ? 1497 // Some attributes require a special call on IE 1498 elem.getAttribute( name, 2 ) : 1499 elem.getAttribute( name ); 1500 1501 // Non-existent attributes return null, we normalize to undefined 1502 return attr === null ? undefined : attr; 1503 } 1504 1505 // elem is actually elem.style ... set the style 1506 // Using attr for specific style information is now deprecated. Use style insead. 1507 return jQuery.style( elem, name, value ); 1508 } 1509 }); 1510 var fcleanup = function( nm ) { 1511 return nm.replace(/[^\w\s\.\|`]/g, function( ch ) { 1512 return "\\" + ch; 1513 }); 1514 }; 1515 1516 /* 1517 * A number of helper functions used for managing events. 1518 * Many of the ideas behind this code originated from 1519 * Dean Edwards' addEvent library. 1520 */ 1521 jQuery.event = { 1522 1523 // Bind an event to an element 1524 // Original by Dean Edwards 1525 add: function( elem, types, handler, data ) { 1526 if ( elem.nodeType === 3 || elem.nodeType === 8 ) { 1527 return; 1528 } 1529 1530 // For whatever reason, IE has trouble passing the window object 1531 // around, causing it to be cloned in the process 1532 if ( elem.setInterval && ( elem !== window && !elem.frameElement ) ) { 1533 elem = window; 1534 } 1535 1536 // Make sure that the function being executed has a unique ID 1537 if ( !handler.guid ) { 1538 handler.guid = jQuery.guid++; 1539 } 1540 1541 // if data is passed, bind to handler 1542 if ( data !== undefined ) { 1543 // Create temporary function pointer to original handler 1544 var fn = handler; 1545 1546 // Create unique handler function, wrapped around original handler 1547 handler = jQuery.proxy( fn ); 1548 1549 // Store data in unique handler 1550 handler.data = data; 1551 } 1552 1553 // Init the element's event structure 1554 var events = jQuery.data( elem, "events" ) || jQuery.data( elem, "events", {} ), 1555 handle = jQuery.data( elem, "handle" ), eventHandle; 1556 1557 if ( !handle ) { 1558 eventHandle = function() { 1559 // Handle the second event of a trigger and when 1560 // an event is called after a page has unloaded 1561 return typeof jQuery !== "undefined" && !jQuery.event.triggered ? 1562 jQuery.event.handle.apply( eventHandle.elem, arguments ) : 1563 undefined; 1564 }; 1565 1566 handle = jQuery.data( elem, "handle", eventHandle ); 1567 } 1568 1569 // If no handle is found then we must be trying to bind to one of the 1570 // banned noData elements 1571 if ( !handle ) { 1572 return; 1573 } 1574 1575 // Add elem as a property of the handle function 1576 // This is to prevent a memory leak with non-native 1577 // event in IE. 1578 handle.elem = elem; 1579 1580 // Handle multiple events separated by a space 1581 // jQuery(...).bind("mouseover mouseout", fn); 1582 types = types.split( /\s+/ ); 1583 var type, i=0; 1584 while ( (type = types[ i++ ]) ) { 1585 // Namespaced event handlers 1586 var namespaces = type.split("."); 1587 type = namespaces.shift(); 1588 handler.type = namespaces.slice(0).sort().join("."); 1589 1590 // Get the current list of functions bound to this event 1591 var handlers = events[ type ], 1592 special = this.special[ type ] || {}; 1593 1594 1595 1596 // Init the event handler queue 1597 if ( !handlers ) { 1598 handlers = events[ type ] = {}; 1599 1600 // Check for a special event handler 1601 // Only use addEventListener/attachEvent if the special 1602 // events handler returns false 1603 if ( !special.setup || special.setup.call( elem, data, namespaces, handler) === false ) { 1604 // Bind the global event handler to the element 1605 if ( elem.addEventListener ) { 1606 elem.addEventListener( type, handle, false ); 1607 } else if ( elem.attachEvent ) { 1608 elem.attachEvent( "on" + type, handle ); 1609 } 1610 } 1611 } 1612 1613 if ( special.add ) { 1614 var modifiedHandler = special.add.call( elem, handler, data, namespaces, handlers ); 1615 if ( modifiedHandler && jQuery.isFunction( modifiedHandler ) ) { 1616 modifiedHandler.guid = modifiedHandler.guid || handler.guid; 1617 handler = modifiedHandler; 1618 } 1619 } 1620 1621 // Add the function to the element's handler list 1622 handlers[ handler.guid ] = handler; 1623 1624 // Keep track of which events have been used, for global triggering 1625 this.global[ type ] = true; 1626 } 1627 1628 // Nullify elem to prevent memory leaks in IE 1629 elem = null; 1630 }, 1631 1632 global: {}, 1633 1634 // Detach an event or set of events from an element 1635 remove: function( elem, types, handler ) { 1636 // don't do events on text and comment nodes 1637 if ( elem.nodeType === 3 || elem.nodeType === 8 ) { 1638 return; 1639 } 1640 1641 var events = jQuery.data( elem, "events" ), ret, type, fn; 1642 1643 if ( events ) { 1644 // Unbind all events for the element 1645 if ( types === undefined || (typeof types === "string" && types.charAt(0) === ".") ) { 1646 for ( type in events ) { 1647 this.remove( elem, type + (types || "") ); 1648 } 1649 } else { 1650 // types is actually an event object here 1651 if ( types.type ) { 1652 handler = types.handler; 1653 types = types.type; 1654 } 1655 1656 // Handle multiple events separated by a space 1657 // jQuery(...).unbind("mouseover mouseout", fn); 1658 types = types.split(/\s+/); 1659 var i = 0; 1660 while ( (type = types[ i++ ]) ) { 1661 // Namespaced event handlers 1662 var namespaces = type.split("."); 1663 type = namespaces.shift(); 1664 var all = !namespaces.length, 1665 cleaned = jQuery.map( namespaces.slice(0).sort(), fcleanup ), 1666 namespace = new RegExp("(^|\\.)" + cleaned.join("\\.(?:.*\\.)?") + "(\\.|$)"), 1667 special = this.special[ type ] || {}; 1668 1669 if ( events[ type ] ) { 1670 // remove the given handler for the given type 1671 if ( handler ) { 1672 fn = events[ type ][ handler.guid ]; 1673 delete events[ type ][ handler.guid ]; 1674 1675 // remove all handlers for the given type 1676 } else { 1677 for ( var handle in events[ type ] ) { 1678 // Handle the removal of namespaced events 1679 if ( all || namespace.test( events[ type ][ handle ].type ) ) { 1680 delete events[ type ][ handle ]; 1681 } 1682 } 1683 } 1684 1685 if ( special.remove ) { 1686 special.remove.call( elem, namespaces, fn); 1687 } 1688 1689 // remove generic event handler if no more handlers exist 1690 for ( ret in events[ type ] ) { 1691 break; 1692 } 1693 if ( !ret ) { 1694 if ( !special.teardown || special.teardown.call( elem, namespaces ) === false ) { 1695 if ( elem.removeEventListener ) { 1696 elem.removeEventListener( type, jQuery.data( elem, "handle" ), false ); 1697 } else if ( elem.detachEvent ) { 1698 elem.detachEvent( "on" + type, jQuery.data( elem, "handle" ) ); 1699 } 1700 } 1701 ret = null; 1702 delete events[ type ]; 1703 } 1704 } 1705 } 1706 } 1707 1708 // Remove the expando if it's no longer used 1709 for ( ret in events ) { 1710 break; 1711 } 1712 if ( !ret ) { 1713 var handle = jQuery.data( elem, "handle" ); 1714 if ( handle ) { 1715 handle.elem = null; 1716 } 1717 jQuery.removeData( elem, "events" ); 1718 jQuery.removeData( elem, "handle" ); 1719 } 1720 } 1721 }, 1722 1723 // bubbling is internal 1724 trigger: function( event, data, elem /*, bubbling */ ) { 1725 // Event object or event type 1726 var type = event.type || event, 1727 bubbling = arguments[3]; 1728 1729 if ( !bubbling ) { 1730 event = typeof event === "object" ? 1731 // jQuery.Event object 1732 event[expando] ? event : 1733 // Object literal 1734 jQuery.extend( jQuery.Event(type), event ) : 1735 // Just the event type (string) 1736 jQuery.Event(type); 1737 1738 if ( type.indexOf("!") >= 0 ) { 1739 event.type = type = type.slice(0, -1); 1740 event.exclusive = true; 1741 } 1742 1743 // Handle a global trigger 1744 if ( !elem ) { 1745 // Don't bubble custom events when global (to avoid too much overhead) 1746 event.stopPropagation(); 1747 1748 // Only trigger if we've ever bound an event for it 1749 if ( this.global[ type ] ) { 1750 jQuery.each( jQuery.cache, function() { 1751 if ( this.events && this.events[type] ) { 1752 jQuery.event.trigger( event, data, this.handle.elem ); 1753 } 1754 }); 1755 } 1756 } 1757 1758 // Handle triggering a single element 1759 1760 // don't do events on text and comment nodes 1761 if ( !elem || elem.nodeType === 3 || elem.nodeType === 8 ) { 1762 return undefined; 1763 } 1764 1765 // Clean up in case it is reused 1766 event.result = undefined; 1767 event.target = elem; 1768 1769 // Clone the incoming data, if any 1770 data = jQuery.makeArray( data ); 1771 data.unshift( event ); 1772 } 1773 1774 event.currentTarget = elem; 1775 1776 // Trigger the event, it is assumed that "handle" is a function 1777 var handle = jQuery.data( elem, "handle" ); 1778 if ( handle ) { 1779 handle.apply( elem, data ); 1780 } 1781 1782 var nativeFn, nativeHandler; 1783 try { 1784 if ( !(elem && elem.nodeName && jQuery.noData[elem.nodeName.toLowerCase()]) ) { 1785 nativeFn = elem[ type ]; 1786 nativeHandler = elem[ "on" + type ]; 1787 } 1788 // prevent IE from throwing an error for some elements with some event types, see #3533 1789 } catch (e) {} 1790 1791 var isClick = jQuery.nodeName(elem, "a") && type === "click"; 1792 1793 // Trigger the native events (except for clicks on links) 1794 if ( !bubbling && nativeFn && !event.isDefaultPrevented() && !isClick ) { 1795 this.triggered = true; 1796 try { 1797 elem[ type ](); 1798 // prevent IE from throwing an error for some hidden elements 1799 } catch (e) {} 1800 1801 // Handle triggering native .onfoo handlers 1802 } else if ( nativeHandler && elem[ "on" + type ].apply( elem, data ) === false ) { 1803 event.result = false; 1804 } 1805 1806 this.triggered = false; 1807 1808 if ( !event.isPropagationStopped() ) { 1809 var parent = elem.parentNode || elem.ownerDocument; 1810 if ( parent ) { 1811 jQuery.event.trigger( event, data, parent, true ); 1812 } 1813 } 1814 }, 1815 1816 handle: function( event ) { 1817 // returned undefined or false 1818 var all, handlers; 1819 1820 event = arguments[0] = jQuery.event.fix( event || window.event ); 1821 event.currentTarget = this; 1822 1823 // Namespaced event handlers 1824 var namespaces = event.type.split("."); 1825 event.type = namespaces.shift(); 1826 1827 // Cache this now, all = true means, any handler 1828 all = !namespaces.length && !event.exclusive; 1829 1830 var namespace = new RegExp("(^|\\.)" + namespaces.slice(0).sort().join("\\.(?:.*\\.)?") + "(\\.|$)"); 1831 1832 handlers = ( jQuery.data(this, "events") || {} )[ event.type ]; 1833 1834 for ( var j in handlers ) { 1835 var handler = handlers[ j ]; 1836 1837 // Filter the functions by class 1838 if ( all || namespace.test(handler.type) ) { 1839 // Pass in a reference to the handler function itself 1840 // So that we can later remove it 1841 event.handler = handler; 1842 event.data = handler.data; 1843 1844 var ret = handler.apply( this, arguments ); 1845 1846 if ( ret !== undefined ) { 1847 event.result = ret; 1848 if ( ret === false ) { 1849 event.preventDefault(); 1850 event.stopPropagation(); 1851 } 1852 } 1853 1854 if ( event.isImmediatePropagationStopped() ) { 1855 break; 1856 } 1857 1858 } 1859 } 1860 1861 return event.result; 1862 }, 1863 1864 props: "altKey attrChange attrName bubbles button cancelable charCode clientX clientY ctrlKey currentTarget data detail eventPhase fromElement handler keyCode layerX layerY metaKey newValue offsetX offsetY originalTarget pageX pageY prevValue relatedNode relatedTarget screenX screenY shiftKey srcElement target toElement view wheelDelta which".split(" "), 1865 1866 fix: function( event ) { 1867 if ( event[ expando ] ) { 1868 return event; 1869 } 1870 1871 // store a copy of the original event object 1872 // and "clone" to set read-only properties 1873 var originalEvent = event; 1874 event = jQuery.Event( originalEvent ); 1875 1876 for ( var i = this.props.length, prop; i; ) { 1877 prop = this.props[ --i ]; 1878 event[ prop ] = originalEvent[ prop ]; 1879 } 1880 1881 // Fix target property, if necessary 1882 if ( !event.target ) { 1883 event.target = event.srcElement || document; // Fixes #1925 where srcElement might not be defined either 1884 } 1885 1886 // check if target is a textnode (safari) 1887 if ( event.target.nodeType === 3 ) { 1888 event.target = event.target.parentNode; 1889 } 1890 1891 // Add relatedTarget, if necessary 1892 if ( !event.relatedTarget && event.fromElement ) { 1893 event.relatedTarget = event.fromElement === event.target ? event.toElement : event.fromElement; 1894 } 1895 1896 // Calculate pageX/Y if missing and clientX/Y available 1897 if ( event.pageX == null && event.clientX != null ) { 1898 var doc = document.documentElement, body = document.body; 1899 event.pageX = event.clientX + (doc && doc.scrollLeft || body && body.scrollLeft || 0) - (doc && doc.clientLeft || body && body.clientLeft || 0); 1900 event.pageY = event.clientY + (doc && doc.scrollTop || body && body.scrollTop || 0) - (doc && doc.clientTop || body && body.clientTop || 0); 1901 } 1902 1903 // Add which for key events 1904 if ( !event.which && ((event.charCode || event.charCode === 0) ? event.charCode : event.keyCode) ) { 1905 event.which = event.charCode || event.keyCode; 1906 } 1907 1908 // Add metaKey to non-Mac browsers (use ctrl for PC's and Meta for Macs) 1909 if ( !event.metaKey && event.ctrlKey ) { 1910 event.metaKey = event.ctrlKey; 1911 } 1912 1913 // Add which for click: 1 === left; 2 === middle; 3 === right 1914 // Note: button is not normalized, so don't use it 1915 if ( !event.which && event.button !== undefined ) { 1916 event.which = (event.button & 1 ? 1 : ( event.button & 2 ? 3 : ( event.button & 4 ? 2 : 0 ) )); 1917 } 1918 1919 return event; 1920 }, 1921 1922 // Deprecated, use jQuery.guid instead 1923 guid: 1E8, 1924 1925 // Deprecated, use jQuery.proxy instead 1926 proxy: jQuery.proxy, 1927 1928 special: { 1929 ready: { 1930 // Make sure the ready event is setup 1931 setup: jQuery.bindReady, 1932 teardown: jQuery.noop 1933 }, 1934 1935 live: { 1936 add: function( proxy, data, namespaces, live ) { 1937 jQuery.extend( proxy, data || {} ); 1938 1939 proxy.guid += data.selector + data.live; 1940 jQuery.event.add( this, data.live, liveHandler, data ); 1941 1942 }, 1943 1944 remove: function( namespaces ) { 1945 if ( namespaces.length ) { 1946 var remove = 0, name = new RegExp("(^|\\.)" + namespaces[0] + "(\\.|$)"); 1947 1948 jQuery.each( (jQuery.data(this, "events").live || {}), function() { 1949 if ( name.test(this.type) ) { 1950 remove++; 1951 } 1952 }); 1953 1954 if ( remove < 1 ) { 1955 jQuery.event.remove( this, namespaces[0], liveHandler ); 1956 } 1957 } 1958 }, 1959 special: {} 1960 }, 1961 beforeunload: { 1962 setup: function( data, namespaces, fn ) { 1963 // We only want to do this special case on windows 1964 if ( this.setInterval ) { 1965 this.onbeforeunload = fn; 1966 } 1967 1968 return false; 1969 }, 1970 teardown: function( namespaces, fn ) { 1971 if ( this.onbeforeunload === fn ) { 1972 this.onbeforeunload = null; 1973 } 1974 } 1975 } 1976 } 1977 }; 1978 1979 jQuery.Event = function( src ) { 1980 // Allow instantiation without the 'new' keyword 1981 if ( !this.preventDefault ) { 1982 return new jQuery.Event( src ); 1983 } 1984 1985 // Event object 1986 if ( src && src.type ) { 1987 this.originalEvent = src; 1988 this.type = src.type; 1989 // Event type 1990 } else { 1991 this.type = src; 1992 } 1993 1994 // timeStamp is buggy for some events on Firefox(#3843) 1995 // So we won't rely on the native value 1996 this.timeStamp = now(); 1997 1998 // Mark it as fixed 1999 this[ expando ] = true; 2000 }; 2001 2002 function returnFalse() { 2003 return false; 2004 } 2005 function returnTrue() { 2006 return true; 2007 } 2008 2009 // jQuery.Event is based on DOM3 Events as specified by the ECMAScript Language Binding 2010 // http://www.w3.org/TR/2003/WD-DOM-Level-3-Events-20030331/ecma-script-binding.html 2011 jQuery.Event.prototype = { 2012 preventDefault: function() { 2013 this.isDefaultPrevented = returnTrue; 2014 2015 var e = this.originalEvent; 2016 if ( !e ) { 2017 return; 2018 } 2019 2020 // if preventDefault exists run it on the original event 2021 if ( e.preventDefault ) { 2022 e.preventDefault(); 2023 } 2024 // otherwise set the returnValue property of the original event to false (IE) 2025 e.returnValue = false; 2026 }, 2027 stopPropagation: function() { 2028 this.isPropagationStopped = returnTrue; 2029 2030 var e = this.originalEvent; 2031 if ( !e ) { 2032 return; 2033 } 2034 // if stopPropagation exists run it on the original event 2035 if ( e.stopPropagation ) { 2036 e.stopPropagation(); 2037 } 2038 // otherwise set the cancelBubble property of the original event to true (IE) 2039 e.cancelBubble = true; 2040 }, 2041 stopImmediatePropagation: function() { 2042 this.isImmediatePropagationStopped = returnTrue; 2043 this.stopPropagation(); 2044 }, 2045 isDefaultPrevented: returnFalse, 2046 isPropagationStopped: returnFalse, 2047 isImmediatePropagationStopped: returnFalse 2048 }; 2049 2050 // Checks if an event happened on an element within another element 2051 // Used in jQuery.event.special.mouseenter and mouseleave handlers 2052 var withinElement = function( event ) { 2053 // Check if mouse(over|out) are still within the same parent element 2054 var parent = event.relatedTarget; 2055 2056 // Traverse up the tree 2057 while ( parent && parent !== this ) { 2058 // Firefox sometimes assigns relatedTarget a XUL element 2059 // which we cannot access the parentNode property of 2060 try { 2061 parent = parent.parentNode; 2062 2063 // assuming we've left the element since we most likely mousedover a xul element 2064 } catch(e) { 2065 break; 2066 } 2067 } 2068 2069 if ( parent !== this ) { 2070 // set the correct event type 2071 event.type = event.data; 2072 2073 // handle event if we actually just moused on to a non sub-element 2074 jQuery.event.handle.apply( this, arguments ); 2075 } 2076 2077 }, 2078 2079 // In case of event delegation, we only need to rename the event.type, 2080 // liveHandler will take care of the rest. 2081 delegate = function( event ) { 2082 event.type = event.data; 2083 jQuery.event.handle.apply( this, arguments ); 2084 }; 2085 2086 // Create mouseenter and mouseleave events 2087 jQuery.each({ 2088 mouseenter: "mouseover", 2089 mouseleave: "mouseout" 2090 }, function( orig, fix ) { 2091 jQuery.event.special[ orig ] = { 2092 setup: function( data ) { 2093 jQuery.event.add( this, fix, data && data.selector ? delegate : withinElement, orig ); 2094 }, 2095 teardown: function( data ) { 2096 jQuery.event.remove( this, fix, data && data.selector ? delegate : withinElement ); 2097 } 2098 }; 2099 }); 2100 2101 // submit delegation 2102 if ( !jQuery.support.submitBubbles ) { 2103 2104 jQuery.event.special.submit = { 2105 setup: function( data, namespaces, fn ) { 2106 if ( this.nodeName.toLowerCase() !== "form" ) { 2107 jQuery.event.add(this, "click.specialSubmit." + fn.guid, function( e ) { 2108 var elem = e.target, type = elem.type; 2109 2110 if ( (type === "submit" || type === "image") && jQuery( elem ).closest("form").length ) { 2111 return trigger( "submit", this, arguments ); 2112 } 2113 }); 2114 2115 jQuery.event.add(this, "keypress.specialSubmit." + fn.guid, function( e ) { 2116 var elem = e.target, type = elem.type; 2117 2118 if ( (type === "text" || type === "password") && jQuery( elem ).closest("form").length && e.keyCode === 13 ) { 2119 return trigger( "submit", this, arguments ); 2120 } 2121 }); 2122 2123 } else { 2124 return false; 2125 } 2126 }, 2127 2128 remove: function( namespaces, fn ) { 2129 jQuery.event.remove( this, "click.specialSubmit" + (fn ? "."+fn.guid : "") ); 2130 jQuery.event.remove( this, "keypress.specialSubmit" + (fn ? "."+fn.guid : "") ); 2131 } 2132 }; 2133 2134 } 2135 2136 // change delegation, happens here so we have bind. 2137 if ( !jQuery.support.changeBubbles ) { 2138 2139 var formElems = /textarea|input|select/i; 2140 2141 function getVal( elem ) { 2142 var type = elem.type, val = elem.value; 2143 2144 if ( type === "radio" || type === "checkbox" ) { 2145 val = elem.checked; 2146 2147 } else if ( type === "select-multiple" ) { 2148 val = elem.selectedIndex > -1 ? 2149 jQuery.map( elem.options, function( elem ) { 2150 return elem.selected; 2151 }).join("-") : 2152 ""; 2153 2154 } else if ( elem.nodeName.toLowerCase() === "select" ) { 2155 val = elem.selectedIndex; 2156 } 2157 2158 return val; 2159 } 2160 2161 function testChange( e ) { 2162 var elem = e.target, data, val; 2163 2164 if ( !formElems.test( elem.nodeName ) || elem.readOnly ) { 2165 return; 2166 } 2167 2168 data = jQuery.data( elem, "_change_data" ); 2169 val = getVal(elem); 2170 2171 if ( val === data ) { 2172 return; 2173 } 2174 2175 // the current data will be also retrieved by beforeactivate 2176 if ( e.type !== "focusout" || elem.type !== "radio" ) { 2177 jQuery.data( elem, "_change_data", val ); 2178 } 2179 2180 if ( elem.type !== "select" && (data != null || val) ) { 2181 e.type = "change"; 2182 return jQuery.event.trigger( e, arguments[1], this ); 2183 } 2184 } 2185 2186 jQuery.event.special.change = { 2187 filters: { 2188 focusout: testChange, 2189 2190 click: function( e ) { 2191 var elem = e.target, type = elem.type; 2192 2193 if ( type === "radio" || type === "checkbox" || elem.nodeName.toLowerCase() === "select" ) { 2194 return testChange.call( this, e ); 2195 } 2196 }, 2197 2198 // Change has to be called before submit 2199 // Keydown will be called before keypress, which is used in submit-event delegation 2200 keydown: function( e ) { 2201 var elem = e.target, type = elem.type; 2202 2203 if ( (e.keyCode === 13 && elem.nodeName.toLowerCase() !== "textarea") || 2204 (e.keyCode === 32 && (type === "checkbox" || type === "radio")) || 2205 type === "select-multiple" ) { 2206 return testChange.call( this, e ); 2207 } 2208 }, 2209 2210 // Beforeactivate happens also before the previous element is blurred 2211 // with this event you can't trigger a change event, but you can store 2212 // information/focus[in] is not needed anymore 2213 beforeactivate: function( e ) { 2214 var elem = e.target; 2215 2216 if ( elem.nodeName.toLowerCase() === "input" && elem.type === "radio" ) { 2217 jQuery.data( elem, "_change_data", getVal(elem) ); 2218 } 2219 } 2220 }, 2221 setup: function( data, namespaces, fn ) { 2222 for ( var type in changeFilters ) { 2223 jQuery.event.add( this, type + ".specialChange." + fn.guid, changeFilters[type] ); 2224 } 2225 2226 return formElems.test( this.nodeName ); 2227 }, 2228 remove: function( namespaces, fn ) { 2229 for ( var type in changeFilters ) { 2230 jQuery.event.remove( this, type + ".specialChange" + (fn ? "."+fn.guid : ""), changeFilters[type] ); 2231 } 2232 2233 return formElems.test( this.nodeName ); 2234 } 2235 }; 2236 2237 var changeFilters = jQuery.event.special.change.filters; 2238 2239 } 2240 2241 function trigger( type, elem, args ) { 2242 args[0].type = type; 2243 return jQuery.event.handle.apply( elem, args ); 2244 } 2245 2246 // Create "bubbling" focus and blur events 2247 if ( document.addEventListener ) { 2248 jQuery.each({ focus: "focusin", blur: "focusout" }, function( orig, fix ) { 2249 jQuery.event.special[ fix ] = { 2250 setup: function() { 2251 this.addEventListener( orig, handler, true ); 2252 }, 2253 teardown: function() { 2254 this.removeEventListener( orig, handler, true ); 2255 } 2256 }; 2257 2258 function handler( e ) { 2259 e = jQuery.event.fix( e ); 2260 e.type = fix; 2261 return jQuery.event.handle.call( this, e ); 2262 } 2263 }); 2264 } 2265 2266 jQuery.each(["bind", "one"], function( i, name ) { 2267 jQuery.fn[ name ] = function( type, data, fn ) { 2268 // Handle object literals 2269 if ( typeof type === "object" ) { 2270 for ( var key in type ) { 2271 this[ name ](key, data, type[key], fn); 2272 } 2273 return this; 2274 } 2275 2276 if ( jQuery.isFunction( data ) ) { 2277 thisObject = fn; 2278 fn = data; 2279 data = undefined; 2280 } 2281 2282 var handler = name === "one" ? jQuery.proxy( fn, function( event ) { 2283 jQuery( this ).unbind( event, handler ); 2284 return fn.apply( this, arguments ); 2285 }) : fn; 2286 2287 return type === "unload" && name !== "one" ? 2288 this.one( type, data, fn, thisObject ) : 2289 this.each(function() { 2290 jQuery.event.add( this, type, handler, data ); 2291 }); 2292 }; 2293 }); 2294 2295 jQuery.fn.extend({ 2296 unbind: function( type, fn ) { 2297 // Handle object literals 2298 if ( typeof type === "object" && !type.preventDefault ) { 2299 for ( var key in type ) { 2300 this.unbind(key, type[key]); 2301 } 2302 return this; 2303 } 2304 2305 return this.each(function() { 2306 jQuery.event.remove( this, type, fn ); 2307 }); 2308 }, 2309 trigger: function( type, data ) { 2310 return this.each(function() { 2311 jQuery.event.trigger( type, data, this ); 2312 }); 2313 }, 2314 2315 triggerHandler: function( type, data ) { 2316 if ( this[0] ) { 2317 var event = jQuery.Event( type ); 2318 event.preventDefault(); 2319 event.stopPropagation(); 2320 jQuery.event.trigger( event, data, this[0] ); 2321 return event.result; 2322 } 2323 }, 2324 2325 toggle: function( fn ) { 2326 // Save reference to arguments for access in closure 2327 var args = arguments, i = 1; 2328 2329 // link all the functions, so any of them can unbind this click handler 2330 while ( i < args.length ) { 2331 jQuery.proxy( fn, args[ i++ ] ); 2332 } 2333 2334 return this.click( jQuery.proxy( fn, function( event ) { 2335 // Figure out which function to execute 2336 var lastToggle = ( jQuery.data( this, "lastToggle" + fn.guid ) || 0 ) % i; 2337 jQuery.data( this, "lastToggle" + fn.guid, lastToggle + 1 ); 2338 2339 // Make sure that clicks stop 2340 event.preventDefault(); 2341 2342 // and execute the function 2343 return args[ lastToggle ].apply( this, arguments ) || false; 2344 })); 2345 }, 2346 2347 hover: function( fnOver, fnOut ) { 2348 return this.mouseenter( fnOver ).mouseleave( fnOut || fnOver ); 2349 }, 2350 2351 live: function( type, data, fn ) { 2352 if ( jQuery.isFunction( data ) ) { 2353 fn = data; 2354 data = undefined; 2355 } 2356 2357 jQuery( this.context ).bind( liveConvert( type, this.selector ), { 2358 data: data, selector: this.selector, live: type 2359 }, fn ); 2360 2361 return this; 2362 }, 2363 2364 die: function( type, fn ) { 2365 jQuery( this.context ).unbind( liveConvert( type, this.selector ), fn ? { guid: fn.guid + this.selector + type } : null ); 2366 return this; 2367 } 2368 }); 2369 2370 function liveHandler( event ) { 2371 var stop = true, elems = [], selectors = [], args = arguments, 2372 related, match, fn, elem, j, i, data, 2373 live = jQuery.extend({}, jQuery.data( this, "events" ).live); 2374 2375 for ( j in live ) { 2376 fn = live[j]; 2377 if ( fn.live === event.type || 2378 fn.altLive && jQuery.inArray(event.type, fn.altLive) > -1 ) { 2379 2380 data = fn.data; 2381 if ( !(data.beforeFilter && data.beforeFilter[event.type] && 2382 !data.beforeFilter[event.type](event)) ) { 2383 selectors.push( fn.selector ); 2384 } 2385 } else { 2386 delete live[j]; 2387 } 2388 } 2389 2390 match = jQuery( event.target ).closest( selectors, event.currentTarget ); 2391 2392 for ( i = 0, l = match.length; i < l; i++ ) { 2393 for ( j in live ) { 2394 fn = live[j]; 2395 elem = match[i].elem; 2396 related = null; 2397 2398 if ( match[i].selector === fn.selector ) { 2399 // Those two events require additional checking 2400 if ( fn.live === "mouseenter" || fn.live === "mouseleave" ) { 2401 related = jQuery( event.relatedTarget ).closest( fn.selector )[0]; 2402 } 2403 2404 if ( !related || related !== elem ) { 2405 elems.push({ elem: elem, fn: fn }); 2406 } 2407 } 2408 } 2409 } 2410 2411 for ( i = 0, l = elems.length; i < l; i++ ) { 2412 match = elems[i]; 2413 event.currentTarget = match.elem; 2414 event.data = match.fn.data; 2415 if ( match.fn.apply( match.elem, args ) === false ) { 2416 stop = false; 2417 break; 2418 } 2419 } 2420 2421 return stop; 2422 } 2423 2424 function liveConvert( type, selector ) { 2425 return ["live", type, selector.replace(/\./g, "`").replace(/ /g, "&")].join("."); 2426 } 2427 2428 jQuery.each( ("blur focus focusin focusout load resize scroll unload click dblclick " + 2429 "mousedown mouseup mousemove mouseover mouseout mouseenter mouseleave " + 2430 "change select submit keydown keypress keyup error").split(" "), function( i, name ) { 2431 2432 // Handle event binding 2433 jQuery.fn[ name ] = function( fn ) { 2434 return fn ? this.bind( name, fn ) : this.trigger( name ); 2435 }; 2436 2437 if ( jQuery.attrFn ) { 2438 jQuery.attrFn[ name ] = true; 2439 } 2440 }); 2441 2442 // Prevent memory leaks in IE 2443 // Window isn't included so as not to unbind existing unload events 2444 // More info: 2445 // - http://isaacschlueter.com/2006/10/msie-memory-leaks/ 2446 if ( window.attachEvent && !window.addEventListener ) { 2447 window.attachEvent("onunload", function() { 2448 for ( var id in jQuery.cache ) { 2449 if ( jQuery.cache[ id ].handle ) { 2450 // Try/Catch is to handle iframes being unloaded, see #4280 2451 try { 2452 jQuery.event.remove( jQuery.cache[ id ].handle.elem ); 2453 } catch(e) {} 2454 } 2455 } 2456 }); 2457 } 2458 /*! 2459 * Sizzle CSS Selector Engine - v1.0 2460 * Copyright 2009, The Dojo Foundation 2461 * Released under the MIT, BSD, and GPL Licenses. 2462 * More information: http://sizzlejs.com/ 2463 */ 2464 (function(){ 2465 2466 var chunker = /((?:\((?:\([^()]+\)|[^()]+)+\)|\[(?:\[[^[\]]*\]|['"][^'"]*['"]|[^[\]'"]+)+\]|\\.|[^ >+~,(\[\\]+)+|[>+~])(\s*,\s*)?((?:.|\r|\n)*)/g, 2467 done = 0, 2468 toString = Object.prototype.toString, 2469 hasDuplicate = false, 2470 baseHasDuplicate = true; 2471 2472 // Here we check if the JavaScript engine is using some sort of 2473 // optimization where it does not always call our comparision 2474 // function. If that is the case, discard the hasDuplicate value. 2475 // Thus far that includes Google Chrome. 2476 [0, 0].sort(function(){ 2477 baseHasDuplicate = false; 2478 return 0; 2479 }); 2480 2481 var Sizzle = function(selector, context, results, seed) { 2482 results = results || []; 2483 var origContext = context = context || document; 2484 2485 if ( context.nodeType !== 1 && context.nodeType !== 9 ) { 2486 return []; 2487 } 2488 2489 if ( !selector || typeof selector !== "string" ) { 2490 return results; 2491 } 2492 2493 var parts = [], m, set, checkSet, extra, prune = true, contextXML = isXML(context), 2494 soFar = selector; 2495 2496 // Reset the position of the chunker regexp (start from head) 2497 while ( (chunker.exec(""), m = chunker.exec(soFar)) !== null ) { 2498 soFar = m[3]; 2499 2500 parts.push( m[1] ); 2501 2502 if ( m[2] ) { 2503 extra = m[3]; 2504 break; 2505 } 2506 } 2507 2508 if ( parts.length > 1 && origPOS.exec( selector ) ) { 2509 if ( parts.length === 2 && Expr.relative[ parts[0] ] ) { 2510 set = posProcess( parts[0] + parts[1], context ); 2511 } else { 2512 set = Expr.relative[ parts[0] ] ? 2513 [ context ] : 2514 Sizzle( parts.shift(), context ); 2515 2516 while ( parts.length ) { 2517 selector = parts.shift(); 2518 2519 if ( Expr.relative[ selector ] ) { 2520 selector += parts.shift(); 2521 } 2522 2523 set = posProcess( selector, set ); 2524 } 2525 } 2526 } else { 2527 // Take a shortcut and set the context if the root selector is an ID 2528 // (but not if it'll be faster if the inner selector is an ID) 2529 if ( !seed && parts.length > 1 && context.nodeType === 9 && !contextXML && 2530 Expr.match.ID.test(parts[0]) && !Expr.match.ID.test(parts[parts.length - 1]) ) { 2531 var ret = Sizzle.find( parts.shift(), context, contextXML ); 2532 context = ret.expr ? Sizzle.filter( ret.expr, ret.set )[0] : ret.set[0]; 2533 } 2534 2535 if ( context ) { 2536 var ret = seed ? 2537 { expr: parts.pop(), set: makeArray(seed) } : 2538 Sizzle.find( parts.pop(), parts.length === 1 && (parts[0] === "~" || parts[0] === "+") && context.parentNode ? context.parentNode : context, contextXML ); 2539 set = ret.expr ? Sizzle.filter( ret.expr, ret.set ) : ret.set; 2540 2541 if ( parts.length > 0 ) { 2542 checkSet = makeArray(set); 2543 } else { 2544 prune = false; 2545 } 2546 2547 while ( parts.length ) { 2548 var cur = parts.pop(), pop = cur; 2549 2550 if ( !Expr.relative[ cur ] ) { 2551 cur = ""; 2552 } else { 2553 pop = parts.pop(); 2554 } 2555 2556 if ( pop == null ) { 2557 pop = context; 2558 } 2559 2560 Expr.relative[ cur ]( checkSet, pop, contextXML ); 2561 } 2562 } else { 2563 checkSet = parts = []; 2564 } 2565 } 2566 2567 if ( !checkSet ) { 2568 checkSet = set; 2569 } 2570 2571 if ( !checkSet ) { 2572 throw "Syntax error, unrecognized expression: " + (cur || selector); 2573 } 2574 2575 if ( toString.call(checkSet) === "[object Array]" ) { 2576 if ( !prune ) { 2577 results.push.apply( results, checkSet ); 2578 } else if ( context && context.nodeType === 1 ) { 2579 for ( var i = 0; checkSet[i] != null; i++ ) { 2580 if ( checkSet[i] && (checkSet[i] === true || checkSet[i].nodeType === 1 && contains(context, checkSet[i])) ) { 2581 results.push( set[i] ); 2582 } 2583 } 2584 } else { 2585 for ( var i = 0; checkSet[i] != null; i++ ) { 2586 if ( checkSet[i] && checkSet[i].nodeType === 1 ) { 2587 results.push( set[i] ); 2588 } 2589 } 2590 } 2591 } else { 2592 makeArray( checkSet, results ); 2593 } 2594 2595 if ( extra ) { 2596 Sizzle( extra, origContext, results, seed ); 2597 Sizzle.uniqueSort( results ); 2598 } 2599 2600 return results; 2601 }; 2602 2603 Sizzle.uniqueSort = function(results){ 2604 if ( sortOrder ) { 2605 hasDuplicate = baseHasDuplicate; 2606 results.sort(sortOrder); 2607 2608 if ( hasDuplicate ) { 2609 for ( var i = 1; i < results.length; i++ ) { 2610 if ( results[i] === results[i-1] ) { 2611 results.splice(i--, 1); 2612 } 2613 } 2614 } 2615 } 2616 2617 return results; 2618 }; 2619 2620 Sizzle.matches = function(expr, set){ 2621 return Sizzle(expr, null, null, set); 2622 }; 2623 2624 Sizzle.find = function(expr, context, isXML){ 2625 var set, match; 2626 2627 if ( !expr ) { 2628 return []; 2629 } 2630 2631 for ( var i = 0, l = Expr.order.length; i < l; i++ ) { 2632 var type = Expr.order[i], match; 2633 2634 if ( (match = Expr.leftMatch[ type ].exec( expr )) ) { 2635 var left = match[1]; 2636 match.splice(1,1); 2637 2638 if ( left.substr( left.length - 1 ) !== "\\" ) { 2639 match[1] = (match[1] || "").replace(/\\/g, ""); 2640 set = Expr.find[ type ]( match, context, isXML ); 2641 if ( set != null ) { 2642 expr = expr.replace( Expr.match[ type ], "" ); 2643 break; 2644 } 2645 } 2646 } 2647 } 2648 2649 if ( !set ) { 2650 set = context.getElementsByTagName("*"); 2651 } 2652 2653 return {set: set, expr: expr}; 2654 }; 2655 2656 Sizzle.filter = function(expr, set, inplace, not){ 2657 var old = expr, result = [], curLoop = set, match, anyFound, 2658 isXMLFilter = set && set[0] && isXML(set[0]); 2659 2660 while ( expr && set.length ) { 2661 for ( var type in Expr.filter ) { 2662 if ( (match = Expr.leftMatch[ type ].exec( expr )) != null && match[2] ) { 2663 var filter = Expr.filter[ type ], found, item, left = match[1]; 2664 anyFound = false; 2665 2666 match.splice(1,1); 2667 2668 if ( left.substr( left.length - 1 ) === "\\" ) { 2669 continue; 2670 } 2671 2672 if ( curLoop === result ) { 2673 result = []; 2674 } 2675 2676 if ( Expr.preFilter[ type ] ) { 2677 match = Expr.preFilter[ type ]( match, curLoop, inplace, result, not, isXMLFilter ); 2678 2679 if ( !match ) { 2680 anyFound = found = true; 2681 } else if ( match === true ) { 2682 continue; 2683 } 2684 } 2685 2686 if ( match ) { 2687 for ( var i = 0; (item = curLoop[i]) != null; i++ ) { 2688 if ( item ) { 2689 found = filter( item, match, i, curLoop ); 2690 var pass = not ^ !!found; 2691 2692 if ( inplace && found != null ) { 2693 if ( pass ) { 2694 anyFound = true; 2695 } else { 2696 curLoop[i] = false; 2697 } 2698 } else if ( pass ) { 2699 result.push( item ); 2700 anyFound = true; 2701 } 2702 } 2703 } 2704 } 2705 2706 if ( found !== undefined ) { 2707 if ( !inplace ) { 2708 curLoop = result; 2709 } 2710 2711 expr = expr.replace( Expr.match[ type ], "" ); 2712 2713 if ( !anyFound ) { 2714 return []; 2715 } 2716 2717 break; 2718 } 2719 } 2720 } 2721 2722 // Improper expression 2723 if ( expr === old ) { 2724 if ( anyFound == null ) { 2725 throw "Syntax error, unrecognized expression: " + expr; 2726 } else { 2727 break; 2728 } 2729 } 2730 2731 old = expr; 2732 } 2733 2734 return curLoop; 2735 }; 2736 2737 var Expr = Sizzle.selectors = { 2738 order: [ "ID", "NAME", "TAG" ], 2739 match: { 2740 ID: /#((?:[\w\u00c0-\uFFFF-]|\\.)+)/, 2741 CLASS: /\.((?:[\w\u00c0-\uFFFF-]|\\.)+)/, 2742 NAME: /\[name=['"]*((?:[\w\u00c0-\uFFFF-]|\\.)+)['"]*\]/, 2743 ATTR: /\[\s*((?:[\w\u00c0-\uFFFF-]|\\.)+)\s*(?:(\S?=)\s*(['"]*)(.*?)\3|)\s*\]/, 2744 TAG: /^((?:[\w\u00c0-\uFFFF\*-]|\\.)+)/, 2745 CHILD: /:(only|nth|last|first)-child(?:\((even|odd|[\dn+-]*)\))?/, 2746 POS: /:(nth|eq|gt|lt|first|last|even|odd)(?:\((\d*)\))?(?=[^-]|$)/, 2747 PSEUDO: /:((?:[\w\u00c0-\uFFFF-]|\\.)+)(?:\((['"]?)((?:\([^\)]+\)|[^\(\)]*)+)\2\))?/ 2748 }, 2749 leftMatch: {}, 2750 attrMap: { 2751 "class": "className", 2752 "for": "htmlFor" 2753 }, 2754 attrHandle: { 2755 href: function(elem){ 2756 return elem.getAttribute("href"); 2757 } 2758 }, 2759 relative: { 2760 "+": function(checkSet, part){ 2761 var isPartStr = typeof part === "string", 2762 isTag = isPartStr && !/\W/.test(part), 2763 isPartStrNotTag = isPartStr && !isTag; 2764 2765 if ( isTag ) { 2766 part = part.toLowerCase(); 2767 } 2768 2769 for ( var i = 0, l = checkSet.length, elem; i < l; i++ ) { 2770 if ( (elem = checkSet[i]) ) { 2771 while ( (elem = elem.previousSibling) && elem.nodeType !== 1 ) {} 2772 2773 checkSet[i] = isPartStrNotTag || elem && elem.nodeName.toLowerCase() === part ? 2774 elem || false : 2775 elem === part; 2776 } 2777 } 2778 2779 if ( isPartStrNotTag ) { 2780 Sizzle.filter( part, checkSet, true ); 2781 } 2782 }, 2783 ">": function(checkSet, part){ 2784 var isPartStr = typeof part === "string"; 2785 2786 if ( isPartStr && !/\W/.test(part) ) { 2787 part = part.toLowerCase(); 2788 2789 for ( var i = 0, l = checkSet.length; i < l; i++ ) { 2790 var elem = checkSet[i]; 2791 if ( elem ) { 2792 var parent = elem.parentNode; 2793 checkSet[i] = parent.nodeName.toLowerCase() === part ? parent : false; 2794 } 2795 } 2796 } else { 2797 for ( var i = 0, l = checkSet.length; i < l; i++ ) { 2798 var elem = checkSet[i]; 2799 if ( elem ) { 2800 checkSet[i] = isPartStr ? 2801 elem.parentNode : 2802 elem.parentNode === part; 2803 } 2804 } 2805 2806 if ( isPartStr ) { 2807 Sizzle.filter( part, checkSet, true ); 2808 } 2809 } 2810 }, 2811 "": function(checkSet, part, isXML){ 2812 var doneName = done++, checkFn = dirCheck; 2813 2814 if ( typeof part === "string" && !/\W/.test(part) ) { 2815 var nodeCheck = part = part.toLowerCase(); 2816 checkFn = dirNodeCheck; 2817 } 2818 2819 checkFn("parentNode", part, doneName, checkSet, nodeCheck, isXML); 2820 }, 2821 "~": function(checkSet, part, isXML){ 2822 var doneName = done++, checkFn = dirCheck; 2823 2824 if ( typeof part === "string" && !/\W/.test(part) ) { 2825 var nodeCheck = part = part.toLowerCase(); 2826 checkFn = dirNodeCheck; 2827 } 2828 2829 checkFn("previousSibling", part, doneName, checkSet, nodeCheck, isXML); 2830 } 2831 }, 2832 find: { 2833 ID: function(match, context, isXML){ 2834 if ( typeof context.getElementById !== "undefined" && !isXML ) { 2835 var m = context.getElementById(match[1]); 2836 return m ? [m] : []; 2837 } 2838 }, 2839 NAME: function(match, context){ 2840 if ( typeof context.getElementsByName !== "undefined" ) { 2841 var ret = [], results = context.getElementsByName(match[1]); 2842 2843 for ( var i = 0, l = results.length; i < l; i++ ) { 2844 if ( results[i].getAttribute("name") === match[1] ) { 2845 ret.push( results[i] ); 2846 } 2847 } 2848 2849 return ret.length === 0 ? null : ret; 2850 } 2851 }, 2852 TAG: function(match, context){ 2853 return context.getElementsByTagName(match[1]); 2854 } 2855 }, 2856 preFilter: { 2857 CLASS: function(match, curLoop, inplace, result, not, isXML){ 2858 match = " " + match[1].replace(/\\/g, "") + " "; 2859 2860 if ( isXML ) { 2861 return match; 2862 } 2863 2864 for ( var i = 0, elem; (elem = curLoop[i]) != null; i++ ) { 2865 if ( elem ) { 2866 if ( not ^ (elem.className && (" " + elem.className + " ").replace(/[\t\n]/g, " ").indexOf(match) >= 0) ) { 2867 if ( !inplace ) { 2868 result.push( elem ); 2869 } 2870 } else if ( inplace ) { 2871 curLoop[i] = false; 2872 } 2873 } 2874 } 2875 2876 return false; 2877 }, 2878 ID: function(match){ 2879 return match[1].replace(/\\/g, ""); 2880 }, 2881 TAG: function(match, curLoop){ 2882 return match[1].toLowerCase(); 2883 }, 2884 CHILD: function(match){ 2885 if ( match[1] === "nth" ) { 2886 // parse equations like 'even', 'odd', '5', '2n', '3n+2', '4n-1', '-n+6' 2887 var test = /(-?)(\d*)n((?:\+|-)?\d*)/.exec( 2888 match[2] === "even" && "2n" || match[2] === "odd" && "2n+1" || 2889 !/\D/.test( match[2] ) && "0n+" + match[2] || match[2]); 2890 2891 // calculate the numbers (first)n+(last) including if they are negative 2892 match[2] = (test[1] + (test[2] || 1)) - 0; 2893 match[3] = test[3] - 0; 2894 } 2895 2896 // TODO: Move to normal caching system 2897 match[0] = done++; 2898 2899 return match; 2900 }, 2901 ATTR: function(match, curLoop, inplace, result, not, isXML){ 2902 var name = match[1].replace(/\\/g, ""); 2903 2904 if ( !isXML && Expr.attrMap[name] ) { 2905 match[1] = Expr.attrMap[name]; 2906 } 2907 2908 if ( match[2] === "~=" ) { 2909 match[4] = " " + match[4] + " "; 2910 } 2911 2912 return match; 2913 }, 2914 PSEUDO: function(match, curLoop, inplace, result, not){ 2915 if ( match[1] === "not" ) { 2916 // If we're dealing with a complex expression, or a simple one 2917 if ( ( chunker.exec(match[3]) || "" ).length > 1 || /^\w/.test(match[3]) ) { 2918 match[3] = Sizzle(match[3], null, null, curLoop); 2919 } else { 2920 var ret = Sizzle.filter(match[3], curLoop, inplace, true ^ not); 2921 if ( !inplace ) { 2922 result.push.apply( result, ret ); 2923 } 2924 return false; 2925 } 2926 } else if ( Expr.match.POS.test( match[0] ) || Expr.match.CHILD.test( match[0] ) ) { 2927 return true; 2928 } 2929 2930 return match; 2931 }, 2932 POS: function(match){ 2933 match.unshift( true ); 2934 return match; 2935 } 2936 }, 2937 filters: { 2938 enabled: function(elem){ 2939 return elem.disabled === false && elem.type !== "hidden"; 2940 }, 2941 disabled: function(elem){ 2942 return elem.disabled === true; 2943 }, 2944 checked: function(elem){ 2945 return elem.checked === true; 2946 }, 2947 selected: function(elem){ 2948 // Accessing this property makes selected-by-default 2949 // options in Safari work properly 2950 elem.parentNode.selectedIndex; 2951 return elem.selected === true; 2952 }, 2953 parent: function(elem){ 2954 return !!elem.firstChild; 2955 }, 2956 empty: function(elem){ 2957 return !elem.firstChild; 2958 }, 2959 has: function(elem, i, match){ 2960 return !!Sizzle( match[3], elem ).length; 2961 }, 2962 header: function(elem){ 2963 return /h\d/i.test( elem.nodeName ); 2964 }, 2965 text: function(elem){ 2966 return "text" === elem.type; 2967 }, 2968 radio: function(elem){ 2969 return "radio" === elem.type; 2970 }, 2971 checkbox: function(elem){ 2972 return "checkbox" === elem.type; 2973 }, 2974 file: function(elem){ 2975 return "file" === elem.type; 2976 }, 2977 password: function(elem){ 2978 return "password" === elem.type; 2979 }, 2980 submit: function(elem){ 2981 return "submit" === elem.type; 2982 }, 2983 image: function(elem){ 2984 return "image" === elem.type; 2985 }, 2986 reset: function(elem){ 2987 return "reset" === elem.type; 2988 }, 2989 button: function(elem){ 2990 return "button" === elem.type || elem.nodeName.toLowerCase() === "button"; 2991 }, 2992 input: function(elem){ 2993 return /input|select|textarea|button/i.test(elem.nodeName); 2994 } 2995 }, 2996 setFilters: { 2997 first: function(elem, i){ 2998 return i === 0; 2999 }, 3000 last: function(elem, i, match, array){ 3001 return i === array.length - 1; 3002 }, 3003 even: function(elem, i){ 3004 return i % 2 === 0; 3005 }, 3006 odd: function(elem, i){ 3007 return i % 2 === 1; 3008 }, 3009 lt: function(elem, i, match){ 3010 return i < match[3] - 0; 3011 }, 3012 gt: function(elem, i, match){ 3013 return i > match[3] - 0; 3014 }, 3015 nth: function(elem, i, match){ 3016 return match[3] - 0 === i; 3017 }, 3018 eq: function(elem, i, match){ 3019 return match[3] - 0 === i; 3020 } 3021 }, 3022 filter: { 3023 PSEUDO: function(elem, match, i, array){ 3024 var name = match[1], filter = Expr.filters[ name ]; 3025 3026 if ( filter ) { 3027 return filter( elem, i, match, array ); 3028 } else if ( name === "contains" ) { 3029 return (elem.textContent || elem.innerText || getText([ elem ]) || "").indexOf(match[3]) >= 0; 3030 } else if ( name === "not" ) { 3031 var not = match[3]; 3032 3033 for ( var i = 0, l = not.length; i < l; i++ ) { 3034 if ( not[i] === elem ) { 3035 return false; 3036 } 3037 } 3038 3039 return true; 3040 } else { 3041 throw "Syntax error, unrecognized expression: " + name; 3042 } 3043 }, 3044 CHILD: function(elem, match){ 3045 var type = match[1], node = elem; 3046 switch (type) { 3047 case 'only': 3048 case 'first': 3049 while ( (node = node.previousSibling) ) { 3050 if ( node.nodeType === 1 ) { 3051 return false; 3052 } 3053 } 3054 if ( type === "first" ) { 3055 return true; 3056 } 3057 node = elem; 3058 case 'last': 3059 while ( (node = node.nextSibling) ) { 3060 if ( node.nodeType === 1 ) { 3061 return false; 3062 } 3063 } 3064 return true; 3065 case 'nth': 3066 var first = match[2], last = match[3]; 3067 3068 if ( first === 1 && last === 0 ) { 3069 return true; 3070 } 3071 3072 var doneName = match[0], 3073 parent = elem.parentNode; 3074 3075 if ( parent && (parent.sizcache !== doneName || !elem.nodeIndex) ) { 3076 var count = 0; 3077 for ( node = parent.firstChild; node; node = node.nextSibling ) { 3078 if ( node.nodeType === 1 ) { 3079 node.nodeIndex = ++count; 3080 } 3081 } 3082 parent.sizcache = doneName; 3083 } 3084 3085 var diff = elem.nodeIndex - last; 3086 if ( first === 0 ) { 3087 return diff === 0; 3088 } else { 3089 return ( diff % first === 0 && diff / first >= 0 ); 3090 } 3091 } 3092 }, 3093 ID: function(elem, match){ 3094 return elem.nodeType === 1 && elem.getAttribute("id") === match; 3095 }, 3096 TAG: function(elem, match){ 3097 return (match === "*" && elem.nodeType === 1) || elem.nodeName.toLowerCase() === match; 3098 }, 3099 CLASS: function(elem, match){ 3100 return (" " + (elem.className || elem.getAttribute("class")) + " ") 3101 .indexOf( match ) > -1; 3102 }, 3103 ATTR: function(elem, match){ 3104 var name = match[1], 3105 result = Expr.attrHandle[ name ] ? 3106 Expr.attrHandle[ name ]( elem ) : 3107 elem[ name ] != null ? 3108 elem[ name ] : 3109 elem.getAttribute( name ), 3110 value = result + "", 3111 type = match[2], 3112 check = match[4]; 3113 3114 return result == null ? 3115 type === "!=" : 3116 type === "=" ? 3117 value === check : 3118 type === "*=" ? 3119 value.indexOf(check) >= 0 : 3120 type === "~=" ? 3121 (" " + value + " ").indexOf(check) >= 0 : 3122 !check ? 3123 value && result !== false : 3124 type === "!=" ? 3125 value !== check : 3126 type === "^=" ? 3127 value.indexOf(check) === 0 : 3128 type === "$=" ? 3129 value.substr(value.length - check.length) === check : 3130 type === "|=" ? 3131 value === check || value.substr(0, check.length + 1) === check + "-" : 3132 false; 3133 }, 3134 POS: function(elem, match, i, array){ 3135 var name = match[2], filter = Expr.setFilters[ name ]; 3136 3137 if ( filter ) { 3138 return filter( elem, i, match, array ); 3139 } 3140 } 3141 } 3142 }; 3143 3144 var origPOS = Expr.match.POS; 3145 3146 for ( var type in Expr.match ) { 3147 Expr.match[ type ] = new RegExp( Expr.match[ type ].source + /(?![^\[]*\])(?![^\(]*\))/.source ); 3148 Expr.leftMatch[ type ] = new RegExp( /(^(?:.|\r|\n)*?)/.source + Expr.match[ type ].source.replace(/\\(\d+)/g, function(all, num){ 3149 return "\\" + (num - 0 + 1); 3150 })); 3151 } 3152 3153 var makeArray = function(array, results) { 3154 array = Array.prototype.slice.call( array, 0 ); 3155 3156 if ( results ) { 3157 results.push.apply( results, array ); 3158 return results; 3159 } 3160 3161 return array; 3162 }; 3163 3164 // Perform a simple check to determine if the browser is capable of 3165 // converting a NodeList to an array using builtin methods. 3166 try { 3167 Array.prototype.slice.call( document.documentElement.childNodes, 0 ); 3168 3169 // Provide a fallback method if it does not work 3170 } catch(e){ 3171 makeArray = function(array, results) { 3172 var ret = results || []; 3173 3174 if ( toString.call(array) === "[object Array]" ) { 3175 Array.prototype.push.apply( ret, array ); 3176 } else { 3177 if ( typeof array.length === "number" ) { 3178 for ( var i = 0, l = array.length; i < l; i++ ) { 3179 ret.push( array[i] ); 3180 } 3181 } else { 3182 for ( var i = 0; array[i]; i++ ) { 3183 ret.push( array[i] ); 3184 } 3185 } 3186 } 3187 3188 return ret; 3189 }; 3190 } 3191 3192 var sortOrder; 3193 3194 if ( document.documentElement.compareDocumentPosition ) { 3195 sortOrder = function( a, b ) { 3196 if ( !a.compareDocumentPosition || !b.compareDocumentPosition ) { 3197 if ( a == b ) { 3198 hasDuplicate = true; 3199 } 3200 return a.compareDocumentPosition ? -1 : 1; 3201 } 3202 3203 var ret = a.compareDocumentPosition(b) & 4 ? -1 : a === b ? 0 : 1; 3204 if ( ret === 0 ) { 3205 hasDuplicate = true; 3206 } 3207 return ret; 3208 }; 3209 } else if ( "sourceIndex" in document.documentElement ) { 3210 sortOrder = function( a, b ) { 3211 if ( !a.sourceIndex || !b.sourceIndex ) { 3212 if ( a == b ) { 3213 hasDuplicate = true; 3214 } 3215 return a.sourceIndex ? -1 : 1; 3216 } 3217 3218 var ret = a.sourceIndex - b.sourceIndex; 3219 if ( ret === 0 ) { 3220 hasDuplicate = true; 3221 } 3222 return ret; 3223 }; 3224 } else if ( document.createRange ) { 3225 sortOrder = function( a, b ) { 3226 if ( !a.ownerDocument || !b.ownerDocument ) { 3227 if ( a == b ) { 3228 hasDuplicate = true; 3229 } 3230 return a.ownerDocument ? -1 : 1; 3231 } 3232 3233 var aRange = a.ownerDocument.createRange(), bRange = b.ownerDocument.createRange(); 3234 aRange.setStart(a, 0); 3235 aRange.setEnd(a, 0); 3236 bRange.setStart(b, 0); 3237 bRange.setEnd(b, 0); 3238 var ret = aRange.compareBoundaryPoints(Range.START_TO_END, bRange); 3239 if ( ret === 0 ) { 3240 hasDuplicate = true; 3241 } 3242 return ret; 3243 }; 3244 } 3245 3246 // Utility function for retreiving the text value of an array of DOM nodes 3247 function getText( elems ) { 3248 var ret = "", elem; 3249 3250 for ( var i = 0; elems[i]; i++ ) { 3251 elem = elems[i]; 3252 3253 // Get the text from text nodes and CDATA nodes 3254 if ( elem.nodeType === 3 || elem.nodeType === 4 ) { 3255 ret += elem.nodeValue; 3256 3257 // Traverse everything else, except comment nodes 3258 } else if ( elem.nodeType !== 8 ) { 3259 ret += getText( elem.childNodes ); 3260 } 3261 } 3262 3263 return ret; 3264 } 3265 3266 // Check to see if the browser returns elements by name when 3267 // querying by getElementById (and provide a workaround) 3268 (function(){ 3269 // We're going to inject a fake input element with a specified name 3270 var form = document.createElement("div"), 3271 id = "script" + (new Date).getTime(); 3272 form.innerHTML = "<a name='" + id + "'/>"; 3273 3274 // Inject it into the root element, check its status, and remove it quickly 3275 var root = document.documentElement; 3276 root.insertBefore( form, root.firstChild ); 3277 3278 // The workaround has to do additional checks after a getElementById 3279 // Which slows things down for other browsers (hence the branching) 3280 if ( document.getElementById( id ) ) { 3281 Expr.find.ID = function(match, context, isXML){ 3282 if ( typeof context.getElementById !== "undefined" && !isXML ) { 3283 var m = context.getElementById(match[1]); 3284 return m ? m.id === match[1] || typeof m.getAttributeNode !== "undefined" && m.getAttributeNode("id").nodeValue === match[1] ? [m] : undefined : []; 3285 } 3286 }; 3287 3288 Expr.filter.ID = function(elem, match){ 3289 var node = typeof elem.getAttributeNode !== "undefined" && elem.getAttributeNode("id"); 3290 return elem.nodeType === 1 && node && node.nodeValue === match; 3291 }; 3292 } 3293 3294 root.removeChild( form ); 3295 root = form = null; // release memory in IE 3296 })(); 3297 3298 (function(){ 3299 // Check to see if the browser returns only elements 3300 // when doing getElementsByTagName("*") 3301 3302 // Create a fake element 3303 var div = document.createElement("div"); 3304 div.appendChild( document.createComment("") ); 3305 3306 // Make sure no comments are found 3307 if ( div.getElementsByTagName("*").length > 0 ) { 3308 Expr.find.TAG = function(match, context){ 3309 var results = context.getElementsByTagName(match[1]); 3310 3311 // Filter out possible comments 3312 if ( match[1] === "*" ) { 3313 var tmp = []; 3314 3315 for ( var i = 0; results[i]; i++ ) { 3316 if ( results[i].nodeType === 1 ) { 3317 tmp.push( results[i] ); 3318 } 3319 } 3320 3321 results = tmp; 3322 } 3323 3324 return results; 3325 }; 3326 } 3327 3328 // Check to see if an attribute returns normalized href attributes 3329 div.innerHTML = "<a href='#'></a>"; 3330 if ( div.firstChild && typeof div.firstChild.getAttribute !== "undefined" && 3331 div.firstChild.getAttribute("href") !== "#" ) { 3332 Expr.attrHandle.href = function(elem){ 3333 return elem.getAttribute("href", 2); 3334 }; 3335 } 3336 3337 div = null; // release memory in IE 3338 })(); 3339 3340 if ( document.querySelectorAll ) { 3341 (function(){ 3342 var oldSizzle = Sizzle, div = document.createElement("div"); 3343 div.innerHTML = "<p class='TEST'></p>"; 3344 3345 // Safari can't handle uppercase or unicode characters when 3346 // in quirks mode. 3347 if ( div.querySelectorAll && div.querySelectorAll(".TEST").length === 0 ) { 3348 return; 3349 } 3350 3351 Sizzle = function(query, context, extra, seed){ 3352 context = context || document; 3353 3354 // Only use querySelectorAll on non-XML documents 3355 // (ID selectors don't work in non-HTML documents) 3356 if ( !seed && context.nodeType === 9 && !isXML(context) ) { 3357 try { 3358 return makeArray( context.querySelectorAll(query), extra ); 3359 } catch(e){} 3360 } 3361 3362 return oldSizzle(query, context, extra, seed); 3363 }; 3364 3365 for ( var prop in oldSizzle ) { 3366 Sizzle[ prop ] = oldSizzle[ prop ]; 3367 } 3368 3369 div = null; // release memory in IE 3370 })(); 3371 } 3372 3373 (function(){ 3374 var div = document.createElement("div"); 3375 3376 div.innerHTML = "<div class='test e'></div><div class='test'></div>"; 3377 3378 // Opera can't find a second classname (in 9.6) 3379 // Also, make sure that getElementsByClassName actually exists 3380 if ( !div.getElementsByClassName || div.getElementsByClassName("e").length === 0 ) { 3381 return; 3382 } 3383 3384 // Safari caches class attributes, doesn't catch changes (in 3.2) 3385 div.lastChild.className = "e"; 3386 3387 if ( div.getElementsByClassName("e").length === 1 ) { 3388 return; 3389 } 3390 3391 Expr.order.splice(1, 0, "CLASS"); 3392 Expr.find.CLASS = function(match, context, isXML) { 3393 if ( typeof context.getElementsByClassName !== "undefined" && !isXML ) { 3394 return context.getElementsByClassName(match[1]); 3395 } 3396 }; 3397 3398 div = null; // release memory in IE 3399 })(); 3400 3401 function dirNodeCheck( dir, cur, doneName, checkSet, nodeCheck, isXML ) { 3402 for ( var i = 0, l = checkSet.length; i < l; i++ ) { 3403 var elem = checkSet[i]; 3404 if ( elem ) { 3405 elem = elem[dir]; 3406 var match = false; 3407 3408 while ( elem ) { 3409 if ( elem.sizcache === doneName ) { 3410 match = checkSet[elem.sizset]; 3411 break; 3412 } 3413 3414 if ( elem.nodeType === 1 && !isXML ){ 3415 elem.sizcache = doneName; 3416 elem.sizset = i; 3417 } 3418 3419 if ( elem.nodeName.toLowerCase() === cur ) { 3420 match = elem; 3421 break; 3422 } 3423 3424 elem = elem[dir]; 3425 } 3426 3427 checkSet[i] = match; 3428 } 3429 } 3430 } 3431 3432 function dirCheck( dir, cur, doneName, checkSet, nodeCheck, isXML ) { 3433 for ( var i = 0, l = checkSet.length; i < l; i++ ) { 3434 var elem = checkSet[i]; 3435 if ( elem ) { 3436 elem = elem[dir]; 3437 var match = false; 3438 3439 while ( elem ) { 3440 if ( elem.sizcache === doneName ) { 3441 match = checkSet[elem.sizset]; 3442 break; 3443 } 3444 3445 if ( elem.nodeType === 1 ) { 3446 if ( !isXML ) { 3447 elem.sizcache = doneName; 3448 elem.sizset = i; 3449 } 3450 if ( typeof cur !== "string" ) { 3451 if ( elem === cur ) { 3452 match = true; 3453 break; 3454 } 3455 3456 } else if ( Sizzle.filter( cur, [elem] ).length > 0 ) { 3457 match = elem; 3458 break; 3459 } 3460 } 3461 3462 elem = elem[dir]; 3463 } 3464 3465 checkSet[i] = match; 3466 } 3467 } 3468 } 3469 3470 var contains = document.compareDocumentPosition ? function(a, b){ 3471 return a.compareDocumentPosition(b) & 16; 3472 } : function(a, b){ 3473 return a !== b && (a.contains ? a.contains(b) : true); 3474 }; 3475 3476 var isXML = function(elem){ 3477 // documentElement is verified for cases where it doesn't yet exist 3478 // (such as loading iframes in IE - #4833) 3479 var documentElement = (elem ? elem.ownerDocument || elem : 0).documentElement; 3480 return documentElement ? documentElement.nodeName !== "HTML" : false; 3481 }; 3482 3483 var posProcess = function(selector, context){ 3484 var tmpSet = [], later = "", match, 3485 root = context.nodeType ? [context] : context; 3486 3487 // Position selectors must be done after the filter 3488 // And so must :not(positional) so we move all PSEUDOs to the end 3489 while ( (match = Expr.match.PSEUDO.exec( selector )) ) { 3490 later += match[0]; 3491 selector = selector.replace( Expr.match.PSEUDO, "" ); 3492 } 3493 3494 selector = Expr.relative[selector] ? selector + "*" : selector; 3495 3496 for ( var i = 0, l = root.length; i < l; i++ ) { 3497 Sizzle( selector, root[i], tmpSet ); 3498 } 3499 3500 return Sizzle.filter( later, tmpSet ); 3501 }; 3502 3503 // EXPOSE 3504 jQuery.find = Sizzle; 3505 jQuery.expr = Sizzle.selectors; 3506 jQuery.expr[":"] = jQuery.expr.filters; 3507 jQuery.unique = Sizzle.uniqueSort; 3508 jQuery.getText = getText; 3509 jQuery.isXMLDoc = isXML; 3510 jQuery.contains = contains; 3511 3512 return; 3513 3514 window.Sizzle = Sizzle; 3515 3516 })(); 3517 var runtil = /Until$/, 3518 rparentsprev = /^(?:parents|prevUntil|prevAll)/, 3519 // Note: This RegExp should be improved, or likely pulled from Sizzle 3520 rmultiselector = /,/, 3521 slice = Array.prototype.slice; 3522 3523 // Implement the identical functionality for filter and not 3524 var winnow = function( elements, qualifier, keep ) { 3525 if ( jQuery.isFunction( qualifier ) ) { 3526 return jQuery.grep(elements, function( elem, i ) { 3527 return !!qualifier.call( elem, i, elem ) === keep; 3528 }); 3529 3530 } else if ( qualifier.nodeType ) { 3531 return jQuery.grep(elements, function( elem, i ) { 3532 return (elem === qualifier) === keep; 3533 }); 3534 3535 } else if ( typeof qualifier === "string" ) { 3536 var filtered = jQuery.grep(elements, function( elem ) { 3537 return elem.nodeType === 1; 3538 }); 3539 3540 if ( isSimple.test( qualifier ) ) { 3541 return jQuery.filter(qualifier, filtered, !keep); 3542 } else { 3543 qualifier = jQuery.filter( qualifier, elements ); 3544 } 3545 } 3546 3547 return jQuery.grep(elements, function( elem, i ) { 3548 return (jQuery.inArray( elem, qualifier ) >= 0) === keep; 3549 }); 3550 }; 3551 3552 jQuery.fn.extend({ 3553 find: function( selector ) { 3554 var ret = this.pushStack( "", "find", selector ), length = 0; 3555 3556 for ( var i = 0, l = this.length; i < l; i++ ) { 3557 length = ret.length; 3558 jQuery.find( selector, this[i], ret ); 3559 3560 if ( i > 0 ) { 3561 // Make sure that the results are unique 3562 for ( var n = length; n < ret.length; n++ ) { 3563 for ( var r = 0; r < length; r++ ) { 3564 if ( ret[r] === ret[n] ) { 3565 ret.splice(n--, 1); 3566 break; 3567 } 3568 } 3569 } 3570 } 3571 } 3572 3573 return ret; 3574 }, 3575 3576 has: function( target ) { 3577 var targets = jQuery( target ); 3578 return this.filter(function() { 3579 for ( var i = 0, l = targets.length; i < l; i++ ) { 3580 if ( jQuery.contains( this, targets[i] ) ) { 3581 return true; 3582 } 3583 } 3584 }); 3585 }, 3586 3587 not: function( selector ) { 3588 return this.pushStack( winnow(this, selector, false), "not", selector); 3589 }, 3590 3591 filter: function( selector ) { 3592 return this.pushStack( winnow(this, selector, true), "filter", selector ); 3593 }, 3594 3595 is: function( selector ) { 3596 return !!selector && jQuery.filter( selector, this ).length > 0; 3597 }, 3598 3599 closest: function( selectors, context ) { 3600 if ( jQuery.isArray( selectors ) ) { 3601 var ret = [], cur = this[0], match, matches = {}, selector; 3602 3603 if ( cur && selectors.length ) { 3604 for ( var i = 0, l = selectors.length; i < l; i++ ) { 3605 selector = selectors[i]; 3606 3607 if ( !matches[selector] ) { 3608 matches[selector] = jQuery.expr.match.POS.test( selector ) ? 3609 jQuery( selector, context || this.context ) : 3610 selector; 3611 } 3612 } 3613 3614 while ( cur && cur.ownerDocument && cur !== context ) { 3615 for ( selector in matches ) { 3616 match = matches[selector]; 3617 3618 if ( match.jquery ? match.index(cur) > -1 : jQuery(cur).is(match) ) { 3619 ret.push({ selector: selector, elem: cur }); 3620 delete matches[selector]; 3621 } 3622 } 3623 cur = cur.parentNode; 3624 } 3625 } 3626 3627 return ret; 3628 } 3629 3630 var pos = jQuery.expr.match.POS.test( selectors ) ? 3631 jQuery( selectors, context || this.context ) : null; 3632 3633 return this.map(function( i, cur ) { 3634 while ( cur && cur.ownerDocument && cur !== context ) { 3635 if ( pos ? pos.index(cur) > -1 : jQuery(cur).is(selectors) ) { 3636 return cur; 3637 } 3638 cur = cur.parentNode; 3639 } 3640 return null; 3641 }); 3642 }, 3643 3644 // Determine the position of an element within 3645 // the matched set of elements 3646 index: function( elem ) { 3647 if ( !elem || typeof elem === "string" ) { 3648 return jQuery.inArray( this[0], 3649 // If it receives a string, the selector is used 3650 // If it receives nothing, the siblings are used 3651 elem ? jQuery( elem ) : this.parent().children() ); 3652 } 3653 // Locate the position of the desired element 3654 return jQuery.inArray( 3655 // If it receives a jQuery object, the first element is used 3656 elem.jquery ? elem[0] : elem, this ); 3657 }, 3658 3659 add: function( selector, context ) { 3660 var set = typeof selector === "string" ? 3661 jQuery( selector, context || this.context ) : 3662 jQuery.makeArray( selector ), 3663 all = jQuery.merge( this.get(), set ); 3664 3665 return this.pushStack( isDisconnected( set[0] ) || isDisconnected( all[0] ) ? 3666 all : 3667 jQuery.unique( all ) ); 3668 }, 3669 3670 andSelf: function() { 3671 return this.add( this.prevObject ); 3672 } 3673 }); 3674 3675 // A painfully simple check to see if an element is disconnected 3676 // from a document (should be improved, where feasible). 3677 function isDisconnected( node ) { 3678 return !node || !node.parentNode || node.parentNode.nodeType === 11; 3679 } 3680 3681 jQuery.each({ 3682 parent: function( elem ) { 3683 var parent = elem.parentNode; 3684 return parent && parent.nodeType !== 11 ? parent : null; 3685 }, 3686 parents: function( elem ) { 3687 return jQuery.dir( elem, "parentNode" ); 3688 }, 3689 parentsUntil: function( elem, i, until ) { 3690 return jQuery.dir( elem, "parentNode", until ); 3691 }, 3692 next: function( elem ) { 3693 return jQuery.nth( elem, 2, "nextSibling" ); 3694 }, 3695 prev: function( elem ) { 3696 return jQuery.nth( elem, 2, "previousSibling" ); 3697 }, 3698 nextAll: function( elem ) { 3699 return jQuery.dir( elem, "nextSibling" ); 3700 }, 3701 prevAll: function( elem ) { 3702 return jQuery.dir( elem, "previousSibling" ); 3703 }, 3704 nextUntil: function( elem, i, until ) { 3705 return jQuery.dir( elem, "nextSibling", until ); 3706 }, 3707 prevUntil: function( elem, i, until ) { 3708 return jQuery.dir( elem, "previousSibling", until ); 3709 }, 3710 siblings: function( elem ) { 3711 return jQuery.sibling( elem.parentNode.firstChild, elem ); 3712 }, 3713 children: function( elem ) { 3714 return jQuery.sibling( elem.firstChild ); 3715 }, 3716 contents: function( elem ) { 3717 return jQuery.nodeName( elem, "iframe" ) ? 3718 elem.contentDocument || elem.contentWindow.document : 3719 jQuery.makeArray( elem.childNodes ); 3720 } 3721 }, function( name, fn ) { 3722 jQuery.fn[ name ] = function( until, selector ) { 3723 var ret = jQuery.map( this, fn, until ); 3724 3725 if ( !runtil.test( name ) ) { 3726 selector = until; 3727 } 3728 3729 if ( selector && typeof selector === "string" ) { 3730 ret = jQuery.filter( selector, ret ); 3731 } 3732 3733 ret = this.length > 1 ? jQuery.unique( ret ) : ret; 3734 3735 if ( (this.length > 1 || rmultiselector.test( selector )) && rparentsprev.test( name ) ) { 3736 ret = ret.reverse(); 3737 } 3738 3739 return this.pushStack( ret, name, slice.call(arguments).join(",") ); 3740 }; 3741 }); 3742 3743 jQuery.extend({ 3744 filter: function( expr, elems, not ) { 3745 if ( not ) { 3746 expr = ":not(" + expr + ")"; 3747 } 3748 3749 return jQuery.find.matches(expr, elems); 3750 }, 3751 3752 dir: function( elem, dir, until ) { 3753 var matched = [], cur = elem[dir]; 3754 while ( cur && cur.nodeType !== 9 && (until === undefined || !jQuery( cur ).is( until )) ) { 3755 if ( cur.nodeType === 1 ) { 3756 matched.push( cur ); 3757 } 3758 cur = cur[dir]; 3759 } 3760 return matched; 3761 }, 3762 3763 nth: function( cur, result, dir, elem ) { 3764 result = result || 1; 3765 var num = 0; 3766 3767 for ( ; cur; cur = cur[dir] ) { 3768 if ( cur.nodeType === 1 && ++num === result ) { 3769 break; 3770 } 3771 } 3772 3773 return cur; 3774 }, 3775 3776 sibling: function( n, elem ) { 3777 var r = []; 3778 3779 for ( ; n; n = n.nextSibling ) { 3780 if ( n.nodeType === 1 && n !== elem ) { 3781 r.push( n ); 3782 } 3783 } 3784 3785 return r; 3786 } 3787 }); 3788 var rinlinejQuery = / jQuery\d+="(?:\d+|null)"/g, 3789 rleadingWhitespace = /^\s+/, 3790 rxhtmlTag = /(<([\w:]+)[^>]*?)\/>/g, 3791 rselfClosing = /^(?:area|br|col|embed|hr|img|input|link|meta|param)$/i, 3792 rtagName = /<([\w:]+)/, 3793 rtbody = /<tbody/i, 3794 rhtml = /<|&\w+;/, 3795 fcloseTag = function( all, front, tag ) { 3796 return rselfClosing.test( tag ) ? 3797 all : 3798 front + "></" + tag + ">"; 3799 }, 3800 wrapMap = { 3801 option: [ 1, "<select multiple='multiple'>", "</select>" ], 3802 legend: [ 1, "<fieldset>", "</fieldset>" ], 3803 thead: [ 1, "<table>", "</table>" ], 3804 tr: [ 2, "<table><tbody>", "</tbody></table>" ], 3805 td: [ 3, "<table><tbody><tr>", "</tr></tbody></table>" ], 3806 col: [ 2, "<table><tbody></tbody><colgroup>", "</colgroup></table>" ], 3807 area: [ 1, "<map>", "</map>" ], 3808 _default: [ 0, "", "" ] 3809 }; 3810 3811 wrapMap.optgroup = wrapMap.option; 3812 wrapMap.tbody = wrapMap.tfoot = wrapMap.colgroup = wrapMap.caption = wrapMap.thead; 3813 wrapMap.th = wrapMap.td; 3814 3815 // IE can't serialize <link> and <script> tags normally 3816 if ( !jQuery.support.htmlSerialize ) { 3817 wrapMap._default = [ 1, "div<div>", "</div>" ]; 3818 } 3819 3820 jQuery.fn.extend({ 3821 text: function( text ) { 3822 if ( jQuery.isFunction(text) ) { 3823 return this.each(function(i) { 3824 var self = jQuery(this); 3825 return self.text( text.call(this, i, self.text()) ); 3826 }); 3827 } 3828 3829 if ( typeof text !== "object" && text !== undefined ) { 3830 return this.empty().append( (this[0] && this[0].ownerDocument || document).createTextNode( text ) ); 3831 } 3832 3833 return jQuery.getText( this ); 3834 }, 3835 3836 wrapAll: function( html ) { 3837 if ( jQuery.isFunction( html ) ) { 3838 return this.each(function(i) { 3839 jQuery(this).wrapAll( html.call(this, i) ); 3840 }); 3841 } 3842 3843 if ( this[0] ) { 3844 // The elements to wrap the target around 3845 var wrap = jQuery( html, this[0].ownerDocument ).eq(0).clone(true); 3846 3847 if ( this[0].parentNode ) { 3848 wrap.insertBefore( this[0] ); 3849 } 3850 3851 wrap.map(function() { 3852 var elem = this; 3853 3854 while ( elem.firstChild && elem.firstChild.nodeType === 1 ) { 3855 elem = elem.firstChild; 3856 } 3857 3858 return elem; 3859 }).append(this); 3860 } 3861 3862 return this; 3863 }, 3864 3865 wrapInner: function( html ) { 3866 return this.each(function() { 3867 var self = jQuery( this ), contents = self.contents(); 3868 3869 if ( contents.length ) { 3870 contents.wrapAll( html ); 3871 3872 } else { 3873 self.append( html ); 3874 } 3875 }); 3876 }, 3877 3878 wrap: function( html ) { 3879 return this.each(function() { 3880 jQuery( this ).wrapAll( html ); 3881 }); 3882 }, 3883 3884 unwrap: function() { 3885 return this.parent().each(function() { 3886 if ( !jQuery.nodeName( this, "body" ) ) { 3887 jQuery( this ).replaceWith( this.childNodes ); 3888 } 3889 }).end(); 3890 }, 3891 3892 append: function() { 3893 return this.domManip(arguments, true, function( elem ) { 3894 if ( this.nodeType === 1 ) { 3895 this.appendChild( elem ); 3896 } 3897 }); 3898 }, 3899 3900 prepend: function() { 3901 return this.domManip(arguments, true, function( elem ) { 3902 if ( this.nodeType === 1 ) { 3903 this.insertBefore( elem, this.firstChild ); 3904 } 3905 }); 3906 }, 3907 3908 before: function() { 3909 if ( this[0] && this[0].parentNode ) { 3910 return this.domManip(arguments, false, function( elem ) { 3911 this.parentNode.insertBefore( elem, this ); 3912 }); 3913 } else if ( arguments.length ) { 3914 var set = jQuery(arguments[0]); 3915 set.push.apply( set, this.toArray() ); 3916 return this.pushStack( set, "before", arguments ); 3917 } 3918 }, 3919 3920 after: function() { 3921 if ( this[0] && this[0].parentNode ) { 3922 return this.domManip(arguments, false, function( elem ) { 3923 this.parentNode.insertBefore( elem, this.nextSibling ); 3924 }); 3925 } else if ( arguments.length ) { 3926 var set = this.pushStack( this, "after", arguments ); 3927 set.push.apply( set, jQuery(arguments[0]).toArray() ); 3928 return set; 3929 } 3930 }, 3931 3932 clone: function( events ) { 3933 // Do the clone 3934 var ret = this.map(function() { 3935 if ( !jQuery.support.noCloneEvent && !jQuery.isXMLDoc(this) ) { 3936 // IE copies events bound via attachEvent when 3937 // using cloneNode. Calling detachEvent on the 3938 // clone will also remove the events from the orignal 3939 // In order to get around this, we use innerHTML. 3940 // Unfortunately, this means some modifications to 3941 // attributes in IE that are actually only stored 3942 // as properties will not be copied (such as the 3943 // the name attribute on an input). 3944 var html = this.outerHTML, ownerDocument = this.ownerDocument; 3945 if ( !html ) { 3946 var div = ownerDocument.createElement("div"); 3947 div.appendChild( this.cloneNode(true) ); 3948 html = div.innerHTML; 3949 } 3950 3951 return jQuery.clean([html.replace(rinlinejQuery, "") 3952 .replace(rleadingWhitespace, "")], ownerDocument)[0]; 3953 } else { 3954 return this.cloneNode(true); 3955 } 3956 }); 3957 3958 // Copy the events from the original to the clone 3959 if ( events === true ) { 3960 cloneCopyEvent( this, ret ); 3961 cloneCopyEvent( this.find("*"), ret.find("*") ); 3962 } 3963 3964 // Return the cloned set 3965 return ret; 3966 }, 3967 3968 html: function( value ) { 3969 if ( value === undefined ) { 3970 return this[0] && this[0].nodeType === 1 ? 3971 this[0].innerHTML.replace(rinlinejQuery, "") : 3972 null; 3973 3974 // See if we can take a shortcut and just use innerHTML 3975 } else if ( typeof value === "string" && !/<script/i.test( value ) && 3976 (jQuery.support.leadingWhitespace || !rleadingWhitespace.test( value )) && 3977 !wrapMap[ (rtagName.exec( value ) || ["", ""])[1].toLowerCase() ] ) { 3978 3979 try { 3980 for ( var i = 0, l = this.length; i < l; i++ ) { 3981 // Remove element nodes and prevent memory leaks 3982 if ( this[i].nodeType === 1 ) { 3983 cleanData( this[i].getElementsByTagName("*") ); 3984 this[i].innerHTML = value; 3985 } 3986 } 3987 3988 // If using innerHTML throws an exception, use the fallback method 3989 } catch(e) { 3990 this.empty().append( value ); 3991 } 3992 3993 } else if ( jQuery.isFunction( value ) ) { 3994 this.each(function(i){ 3995 var self = jQuery(this), old = self.html(); 3996 self.empty().append(function(){ 3997 return value.call( this, i, old ); 3998 }); 3999 }); 4000 4001 } else { 4002 this.empty().append( value ); 4003 } 4004 4005 return this; 4006 }, 4007 4008 replaceWith: function( value ) { 4009 if ( this[0] && this[0].parentNode ) { 4010 // Make sure that the elements are removed from the DOM before they are inserted 4011 // this can help fix replacing a parent with child elements 4012 if ( !jQuery.isFunction( value ) ) { 4013 value = jQuery( value ).detach(); 4014 } 4015 4016 return this.each(function() { 4017 var next = this.nextSibling, parent = this.parentNode; 4018 4019 jQuery(this).remove(); 4020 4021 if ( next ) { 4022 jQuery(next).before( value ); 4023 } else { 4024 jQuery(parent).append( value ); 4025 } 4026 }); 4027 } else { 4028 return this.pushStack( jQuery(jQuery.isFunction(value) ? value() : value), "replaceWith", value ); 4029 } 4030 }, 4031 4032 detach: function( selector ) { 4033 return this.remove( selector, true ); 4034 }, 4035 4036 domManip: function( args, table, callback ) { 4037 var results, first, value = args[0], scripts = []; 4038 4039 if ( jQuery.isFunction(value) ) { 4040 return this.each(function(i) { 4041 var self = jQuery(this); 4042 args[0] = value.call(this, i, table ? self.html() : undefined); 4043 return self.domManip( args, table, callback ); 4044 }); 4045 } 4046 4047 if ( this[0] ) { 4048 // If we're in a fragment, just use that instead of building a new one 4049 if ( args[0] && args[0].parentNode && args[0].parentNode.nodeType === 11 ) { 4050 results = { fragment: args[0].parentNode }; 4051 } else { 4052 results = buildFragment( args, this, scripts ); 4053 } 4054 4055 first = results.fragment.firstChild; 4056 4057 if ( first ) { 4058 table = table && jQuery.nodeName( first, "tr" ); 4059 4060 for ( var i = 0, l = this.length; i < l; i++ ) { 4061 callback.call( 4062 table ? 4063 root(this[i], first) : 4064 this[i], 4065 results.cacheable || this.length > 1 || i > 0 ? 4066 results.fragment.cloneNode(true) : 4067 results.fragment 4068 ); 4069 } 4070 } 4071 4072 if ( scripts ) { 4073 jQuery.each( scripts, evalScript ); 4074 } 4075 } 4076 4077 return this; 4078 4079 function root( elem, cur ) { 4080 return jQuery.nodeName(elem, "table") ? 4081 (elem.getElementsByTagName("tbody")[0] || 4082 elem.appendChild(elem.ownerDocument.createElement("tbody"))) : 4083 elem; 4084 } 4085 } 4086 }); 4087 4088 function cloneCopyEvent(orig, ret) { 4089 var i = 0; 4090 4091 ret.each(function() { 4092 if ( this.nodeName !== (orig[i] && orig[i].nodeName) ) { 4093 return; 4094 } 4095 4096 var oldData = jQuery.data( orig[i++] ), curData = jQuery.data( this, oldData ), events = oldData && oldData.events; 4097 4098 if ( events ) { 4099 delete curData.handle; 4100 curData.events = {}; 4101 4102 for ( var type in events ) { 4103 for ( var handler in events[ type ] ) { 4104 jQuery.event.add( this, type, events[ type ][ handler ], events[ type ][ handler ].data ); 4105 } 4106 } 4107 } 4108 }); 4109 } 4110 4111 function buildFragment( args, nodes, scripts ) { 4112 var fragment, cacheable, cached, cacheresults, doc; 4113 4114 if ( args.length === 1 && typeof args[0] === "string" && args[0].length < 512 && args[0].indexOf("<option") < 0 ) { 4115 cacheable = true; 4116 cacheresults = jQuery.fragments[ args[0] ]; 4117 if ( cacheresults ) { 4118 if ( cacheresults !== 1 ) { 4119 fragment = cacheresults; 4120 } 4121 cached = true; 4122 } 4123 } 4124 4125 if ( !fragment ) { 4126 doc = (nodes && nodes[0] ? nodes[0].ownerDocument || nodes[0] : document); 4127 fragment = doc.createDocumentFragment(); 4128 jQuery.clean( args, doc, fragment, scripts ); 4129 } 4130 4131 if ( cacheable ) { 4132 jQuery.fragments[ args[0] ] = cacheresults ? fragment : 1; 4133 } 4134 4135 return { fragment: fragment, cacheable: cacheable }; 4136 } 4137 4138 jQuery.fragments = {}; 4139 4140 jQuery.each({ 4141 appendTo: "append", 4142 prependTo: "prepend", 4143 insertBefore: "before", 4144 insertAfter: "after", 4145 replaceAll: "replaceWith" 4146 }, function( name, original ) { 4147 jQuery.fn[ name ] = function( selector ) { 4148 var ret = [], insert = jQuery( selector ); 4149 4150 for ( var i = 0, l = insert.length; i < l; i++ ) { 4151 var elems = (i > 0 ? this.clone(true) : this).get(); 4152 jQuery.fn[ original ].apply( jQuery(insert[i]), elems ); 4153 ret = ret.concat( elems ); 4154 } 4155 return this.pushStack( ret, name, insert.selector ); 4156 }; 4157 }); 4158 4159 jQuery.each({ 4160 // keepData is for internal use only--do not document 4161 remove: function( selector, keepData ) { 4162 if ( !selector || jQuery.filter( selector, [ this ] ).length ) { 4163 if ( !keepData && this.nodeType === 1 ) { 4164 cleanData( this.getElementsByTagName("*") ); 4165 cleanData( [ this ] ); 4166 } 4167 4168 if ( this.parentNode ) { 4169 this.parentNode.removeChild( this ); 4170 } 4171 } 4172 }, 4173 4174 empty: function() { 4175 // Remove element nodes and prevent memory leaks 4176 if ( this.nodeType === 1 ) { 4177 cleanData( this.getElementsByTagName("*") ); 4178 } 4179 4180 // Remove any remaining nodes 4181 while ( this.firstChild ) { 4182 this.removeChild( this.firstChild ); 4183 } 4184 } 4185 }, function( name, fn ) { 4186 jQuery.fn[ name ] = function() { 4187 return this.each( fn, arguments ); 4188 }; 4189 }); 4190 4191 jQuery.extend({ 4192 clean: function( elems, context, fragment, scripts ) { 4193 context = context || document; 4194 4195 // !context.createElement fails in IE with an error but returns typeof 'object' 4196 if ( typeof context.createElement === "undefined" ) { 4197 context = context.ownerDocument || context[0] && context[0].ownerDocument || document; 4198 } 4199 4200 var ret = []; 4201 4202 jQuery.each(elems, function( i, elem ) { 4203 if ( typeof elem === "number" ) { 4204 elem += ""; 4205 } 4206 4207 if ( !elem ) { 4208 return; 4209 } 4210 4211 // Convert html string into DOM nodes 4212 if ( typeof elem === "string" && !rhtml.test( elem ) ) { 4213 elem = context.createTextNode( elem ); 4214 4215 } else if ( typeof elem === "string" ) { 4216 // Fix "XHTML"-style tags in all browsers 4217 elem = elem.replace(rxhtmlTag, fcloseTag); 4218 4219 // Trim whitespace, otherwise indexOf won't work as expected 4220 var tag = (rtagName.exec( elem ) || ["", ""])[1].toLowerCase(), 4221 wrap = wrapMap[ tag ] || wrapMap._default, 4222 depth = wrap[0], 4223 div = context.createElement("div"); 4224 4225 // Go to html and back, then peel off extra wrappers 4226 div.innerHTML = wrap[1] + elem + wrap[2]; 4227 4228 // Move to the right depth 4229 while ( depth-- ) { 4230 div = div.lastChild; 4231 } 4232 4233 // Remove IE's autoinserted <tbody> from table fragments 4234 if ( !jQuery.support.tbody ) { 4235 4236 // String was a <table>, *may* have spurious <tbody> 4237 var hasBody = rtbody.test(elem), 4238 tbody = tag === "table" && !hasBody ? 4239 div.firstChild && div.firstChild.childNodes : 4240 4241 // String was a bare <thead> or <tfoot> 4242 wrap[1] === "<table>" && !hasBody ? 4243 div.childNodes : 4244 []; 4245 4246 for ( var j = tbody.length - 1; j >= 0 ; --j ) { 4247 if ( jQuery.nodeName( tbody[ j ], "tbody" ) && !tbody[ j ].childNodes.length ) { 4248 tbody[ j ].parentNode.removeChild( tbody[ j ] ); 4249 } 4250 } 4251 4252 } 4253 4254 // IE completely kills leading whitespace when innerHTML is used 4255 if ( !jQuery.support.leadingWhitespace && rleadingWhitespace.test( elem ) ) { 4256 div.insertBefore( context.createTextNode( rleadingWhitespace.exec(elem)[0] ), div.firstChild ); 4257 } 4258 4259 elem = jQuery.makeArray( div.childNodes ); 4260 } 4261 4262 if ( elem.nodeType ) { 4263 ret.push( elem ); 4264 } else { 4265 ret = jQuery.merge( ret, elem ); 4266 } 4267 4268 }); 4269 4270 if ( fragment ) { 4271 for ( var i = 0; ret[i]; i++ ) { 4272 if ( scripts && jQuery.nodeName( ret[i], "script" ) && (!ret[i].type || ret[i].type.toLowerCase() === "text/javascript") ) { 4273 scripts.push( ret[i].parentNode ? ret[i].parentNode.removeChild( ret[i] ) : ret[i] ); 4274 } else { 4275 if ( ret[i].nodeType === 1 ) { 4276 ret.splice.apply( ret, [i + 1, 0].concat(jQuery.makeArray(ret[i].getElementsByTagName("script"))) ); 4277 } 4278 fragment.appendChild( ret[i] ); 4279 } 4280 } 4281 } 4282 4283 return ret; 4284 } 4285 }); 4286 4287 function cleanData( elems ) { 4288 for ( var i = 0, elem, id; (elem = elems[i]) != null; i++ ) { 4289 if ( !jQuery.noData[elem.nodeName.toLowerCase()] && (id = elem[expando]) ) { 4290 delete jQuery.cache[ id ]; 4291 } 4292 } 4293 } 4294 // exclude the following css properties to add px 4295 var rexclude = /z-?index|font-?weight|opacity|zoom|line-?height/i, 4296 ralpha = /alpha\([^)]*\)/, 4297 ropacity = /opacity=([^)]*)/, 4298 rfloat = /float/i, 4299 rdashAlpha = /-([a-z])/ig, 4300 rupper = /([A-Z])/g, 4301 rnumpx = /^-?\d+(?:px)?$/i, 4302 rnum = /^-?\d/, 4303 4304 cssShow = { position: "absolute", visibility: "hidden", display:"block" }, 4305 cssWidth = [ "Left", "Right" ], 4306 cssHeight = [ "Top", "Bottom" ], 4307 4308 // cache check for defaultView.getComputedStyle 4309 getComputedStyle = document.defaultView && document.defaultView.getComputedStyle, 4310 // normalize float css property 4311 styleFloat = jQuery.support.cssFloat ? "cssFloat" : "styleFloat", 4312 fcamelCase = function( all, letter ) { 4313 return letter.toUpperCase(); 4314 }; 4315 4316 jQuery.fn.css = function( name, value ) { 4317 return access( this, name, value, true, function( elem, name, value ) { 4318 if ( value === undefined ) { 4319 return jQuery.curCSS( elem, name ); 4320 } 4321 4322 if ( typeof value === "number" && !rexclude.test(name) ) { 4323 value += "px"; 4324 } 4325 4326 jQuery.style( elem, name, value ); 4327 }); 4328 }; 4329 4330 jQuery.extend({ 4331 style: function( elem, name, value ) { 4332 // don't set styles on text and comment nodes 4333 if ( !elem || elem.nodeType === 3 || elem.nodeType === 8 ) { 4334 return undefined; 4335 } 4336 4337 // ignore negative width and height values #1599 4338 if ( (name === "width" || name === "height") && parseFloat(value) < 0 ) { 4339 value = undefined; 4340 } 4341 4342 var style = elem.style || elem, set = value !== undefined; 4343 4344 // IE uses filters for opacity 4345 if ( !jQuery.support.opacity && name === "opacity" ) { 4346 if ( set ) { 4347 // IE has trouble with opacity if it does not have layout 4348 // Force it by setting the zoom level 4349 style.zoom = 1; 4350 4351 // Set the alpha filter to set the opacity 4352 var opacity = parseInt( value, 10 ) + "" === "NaN" ? "" : "alpha(opacity=" + value * 100 + ")"; 4353 var filter = style.filter || jQuery.curCSS( elem, "filter" ) || ""; 4354 style.filter = ralpha.test(filter) ? filter.replace(ralpha, opacity) : opacity; 4355 } 4356 4357 return style.filter && style.filter.indexOf("opacity=") >= 0 ? 4358 (parseFloat( ropacity.exec(style.filter)[1] ) / 100) + "": 4359 ""; 4360 } 4361 4362 // Make sure we're using the right name for getting the float value 4363 if ( rfloat.test( name ) ) { 4364 name = styleFloat; 4365 } 4366 4367 name = name.replace(rdashAlpha, fcamelCase); 4368 4369 if ( set ) { 4370 style[ name ] = value; 4371 } 4372 4373 return style[ name ]; 4374 }, 4375 4376 css: function( elem, name, force, extra ) { 4377 if ( name === "width" || name === "height" ) { 4378 var val, props = cssShow, which = name === "width" ? cssWidth : cssHeight; 4379 4380 function getWH() { 4381 val = name === "width" ? elem.offsetWidth : elem.offsetHeight; 4382 4383 if ( extra === "border" ) { 4384 return; 4385 } 4386 4387 jQuery.each( which, function() { 4388 if ( !extra ) { 4389 val -= parseFloat(jQuery.curCSS( elem, "padding" + this, true)) || 0; 4390 } 4391 4392 if ( extra === "margin" ) { 4393 val += parseFloat(jQuery.curCSS( elem, "margin" + this, true)) || 0; 4394 } else { 4395 val -= parseFloat(jQuery.curCSS( elem, "border" + this + "Width", true)) || 0; 4396 } 4397 }); 4398 } 4399 4400 if ( elem.offsetWidth !== 0 ) { 4401 getWH(); 4402 } else { 4403 jQuery.swap( elem, props, getWH ); 4404 } 4405 4406 return Math.max(0, Math.round(val)); 4407 } 4408 4409 return jQuery.curCSS( elem, name, force ); 4410 }, 4411 4412 curCSS: function( elem, name, force ) { 4413 var ret, style = elem.style, filter; 4414 4415 // IE uses filters for opacity 4416 if ( !jQuery.support.opacity && name === "opacity" && elem.currentStyle ) { 4417 ret = ropacity.test(elem.currentStyle.filter || "") ? 4418 (parseFloat(RegExp.$1) / 100) + "" : 4419 ""; 4420 4421 return ret === "" ? 4422 "1" : 4423 ret; 4424 } 4425 4426 // Make sure we're using the right name for getting the float value 4427 if ( rfloat.test( name ) ) { 4428 name = styleFloat; 4429 } 4430 4431 if ( !force && style && style[ name ] ) { 4432 ret = style[ name ]; 4433 4434 } else if ( getComputedStyle ) { 4435 4436 // Only "float" is needed here 4437 if ( rfloat.test( name ) ) { 4438 name = "float"; 4439 } 4440 4441 name = name.replace( rupper, "-$1" ).toLowerCase(); 4442 4443 var defaultView = elem.ownerDocument.defaultView; 4444 4445 if ( !defaultView ) { 4446 return null; 4447 } 4448 4449 var computedStyle = defaultView.getComputedStyle( elem, null ); 4450 4451 if ( computedStyle ) { 4452 ret = computedStyle.getPropertyValue( name ); 4453 } 4454 4455 // We should always get a number back from opacity 4456 if ( name === "opacity" && ret === "" ) { 4457 ret = "1"; 4458 } 4459 4460 } else if ( elem.currentStyle ) { 4461 var camelCase = name.replace(rdashAlpha, fcamelCase); 4462 4463 ret = elem.currentStyle[ name ] || elem.currentStyle[ camelCase ]; 4464 4465 // From the awesome hack by Dean Edwards 4466 // http://erik.eae.net/archives/2007/07/27/18.54.15/#comment-102291 4467 4468 // If we're not dealing with a regular pixel number 4469 // but a number that has a weird ending, we need to convert it to pixels 4470 if ( !rnumpx.test( ret ) && rnum.test( ret ) ) { 4471 // Remember the original values 4472 var left = style.left, rsLeft = elem.runtimeStyle.left; 4473 4474 // Put in the new values to get a computed value out 4475 elem.runtimeStyle.left = elem.currentStyle.left; 4476 style.left = camelCase === "fontSize" ? "1em" : (ret || 0); 4477 ret = style.pixelLeft + "px"; 4478 4479 // Revert the changed values 4480 style.left = left; 4481 elem.runtimeStyle.left = rsLeft; 4482 } 4483 } 4484 4485 return ret; 4486 }, 4487 4488 // A method for quickly swapping in/out CSS properties to get correct calculations 4489 swap: function( elem, options, callback ) { 4490 var old = {}; 4491 4492 // Remember the old values, and insert the new ones 4493 for ( var name in options ) { 4494 old[ name ] = elem.style[ name ]; 4495 elem.style[ name ] = options[ name ]; 4496 } 4497 4498 callback.call( elem ); 4499 4500 // Revert the old values 4501 for ( var name in options ) { 4502 elem.style[ name ] = old[ name ]; 4503 } 4504 } 4505 }); 4506 4507 if ( jQuery.expr && jQuery.expr.filters ) { 4508 jQuery.expr.filters.hidden = function( elem ) { 4509 var width = elem.offsetWidth, height = elem.offsetHeight, 4510 skip = elem.nodeName.toLowerCase() === "tr"; 4511 4512 return width === 0 && height === 0 && !skip ? 4513 true : 4514 width > 0 && height > 0 && !skip ? 4515 false : 4516 jQuery.curCSS(elem, "display") === "none"; 4517 }; 4518 4519 jQuery.expr.filters.visible = function( elem ) { 4520 return !jQuery.expr.filters.hidden( elem ); 4521 }; 4522 } 4523 var jsc = now(), 4524 rscript = /<script(.|\s)*?\/script>/gi, 4525 rselectTextarea = /select|textarea/i, 4526 rinput = /color|date|datetime|email|hidden|month|number|password|range|search|tel|text|time|url|week/i, 4527 jsre = /=\?(&|$)/, 4528 rquery = /\?/, 4529 rts = /(\?|&)_=.*?(&|$)/, 4530 rurl = /^(\w+:)?\/\/([^\/?#]+)/, 4531 r20 = /%20/g; 4532 4533 jQuery.fn.extend({ 4534 // Keep a copy of the old load 4535 _load: jQuery.fn.load, 4536 4537 load: function( url, params, callback ) { 4538 if ( typeof url !== "string" ) { 4539 return this._load( url ); 4540 4541 // Don't do a request if no elements are being requested 4542 } else if ( !this.length ) { 4543 return this; 4544 } 4545 4546 var off = url.indexOf(" "); 4547 if ( off >= 0 ) { 4548 var selector = url.slice(off, url.length); 4549 url = url.slice(0, off); 4550 } 4551 4552 // Default to a GET request 4553 var type = "GET"; 4554 4555 // If the second parameter was provided 4556 if ( params ) { 4557 // If it's a function 4558 if ( jQuery.isFunction( params ) ) { 4559 // We assume that it's the callback 4560 callback = params; 4561 params = null; 4562 4563 // Otherwise, build a param string 4564 } else if ( typeof params === "object" ) { 4565 params = jQuery.param( params, jQuery.ajaxSettings.traditional ); 4566 type = "POST"; 4567 } 4568 } 4569 4570 // Request the remote document 4571 jQuery.ajax({ 4572 url: url, 4573 type: type, 4574 dataType: "html", 4575 data: params, 4576 context:this, 4577 complete: function( res, status ) { 4578 // If successful, inject the HTML into all the matched elements 4579 if ( status === "success" || status === "notmodified" ) { 4580 // See if a selector was specified 4581 this.html( selector ? 4582 // Create a dummy div to hold the results 4583 jQuery("<div />") 4584 // inject the contents of the document in, removing the scripts 4585 // to avoid any 'Permission Denied' errors in IE 4586 .append(res.responseText.replace(rscript, "")) 4587 4588 // Locate the specified elements 4589 .find(selector) : 4590 4591 // If not, just inject the full result 4592 res.responseText ); 4593 } 4594 4595 if ( callback ) { 4596 this.each( callback, [res.responseText, status, res] ); 4597 } 4598 } 4599 }); 4600 4601 return this; 4602 }, 4603 4604 serialize: function() { 4605 return jQuery.param(this.serializeArray()); 4606 }, 4607 serializeArray: function() { 4608 return this.map(function() { 4609 return this.elements ? jQuery.makeArray(this.elements) : this; 4610 }) 4611 .filter(function() { 4612 return this.name && !this.disabled && 4613 (this.checked || rselectTextarea.test(this.nodeName) || 4614 rinput.test(this.type)); 4615 }) 4616 .map(function( i, elem ) { 4617 var val = jQuery(this).val(); 4618 4619 return val == null ? 4620 null : 4621 jQuery.isArray(val) ? 4622 jQuery.map( val, function( val, i ) { 4623 return { name: elem.name, value: val }; 4624 }) : 4625 { name: elem.name, value: val }; 4626 }).get(); 4627 } 4628 }); 4629 4630 // Attach a bunch of functions for handling common AJAX events 4631 jQuery.each( "ajaxStart ajaxStop ajaxComplete ajaxError ajaxSuccess ajaxSend".split(" "), function( i, o ) { 4632 jQuery.fn[o] = function( f ) { 4633 return this.bind(o, f); 4634 }; 4635 }); 4636 4637 jQuery.extend({ 4638 4639 get: function( url, data, callback, type ) { 4640 // shift arguments if data argument was omited 4641 if ( jQuery.isFunction( data ) ) { 4642 type = type || callback; 4643 callback = data; 4644 data = null; 4645 } 4646 4647 return jQuery.ajax({ 4648 type: "GET", 4649 url: url, 4650 data: data, 4651 success: callback, 4652 dataType: type 4653 }); 4654 }, 4655 4656 getScript: function( url, callback ) { 4657 return jQuery.get(url, null, callback, "script"); 4658 }, 4659 4660 getJSON: function( url, data, callback ) { 4661 return jQuery.get(url, data, callback, "json"); 4662 }, 4663 4664 post: function( url, data, callback, type ) { 4665 // shift arguments if data argument was omited 4666 if ( jQuery.isFunction( data ) ) { 4667 type = type || callback; 4668 callback = data; 4669 data = {}; 4670 } 4671 4672 return jQuery.ajax({ 4673 type: "POST", 4674 url: url, 4675 data: data, 4676 success: callback, 4677 dataType: type 4678 }); 4679 }, 4680 4681 ajaxSetup: function( settings ) { 4682 jQuery.extend( jQuery.ajaxSettings, settings ); 4683 }, 4684 4685 ajaxSettings: { 4686 url: location.href, 4687 global: true, 4688 type: "GET", 4689 contentType: "application/x-www-form-urlencoded", 4690 processData: true, 4691 async: true, 4692 /* 4693 timeout: 0, 4694 data: null, 4695 username: null, 4696 password: null, 4697 traditional: false, 4698 */ 4699 // Create the request object; Microsoft failed to properly 4700 // implement the XMLHttpRequest in IE7 (can't request local files), 4701 // so we use the ActiveXObject when it is available 4702 // This function can be overriden by calling jQuery.ajaxSetup 4703 xhr: window.XMLHttpRequest && (window.location.protocol !== "file:" || !window.ActiveXObject) ? 4704 function() { 4705 return new window.XMLHttpRequest(); 4706 } : 4707 function() { 4708 try { 4709 return new window.ActiveXObject("Microsoft.XMLHTTP"); 4710 } catch(e) {} 4711 }, 4712 accepts: { 4713 xml: "application/xml, text/xml", 4714 html: "text/html", 4715 script: "text/javascript, application/javascript", 4716 json: "application/json, text/javascript", 4717 text: "text/plain", 4718 _default: "*/*" 4719 } 4720 }, 4721 4722 // Last-Modified header cache for next request 4723 lastModified: {}, 4724 etag: {}, 4725 4726 ajax: function( origSettings ) { 4727 var s = jQuery.extend(true, {}, jQuery.ajaxSettings, origSettings); 4728 4729 var jsonp, status, data, 4730 callbackContext = s.context || s, 4731 type = s.type.toUpperCase(); 4732 4733 // convert data if not already a string 4734 if ( s.data && s.processData && typeof s.data !== "string" ) { 4735 s.data = jQuery.param( s.data, s.traditional ); 4736 } 4737 4738 // Handle JSONP Parameter Callbacks 4739 if ( s.dataType === "jsonp" ) { 4740 if ( type === "GET" ) { 4741 if ( !jsre.test( s.url ) ) { 4742 s.url += (rquery.test( s.url ) ? "&" : "?") + (s.jsonp || "callback") + "=?"; 4743 } 4744 } else if ( !s.data || !jsre.test(s.data) ) { 4745 s.data = (s.data ? s.data + "&" : "") + (s.jsonp || "callback") + "=?"; 4746 } 4747 s.dataType = "json"; 4748 } 4749 4750 // Build temporary JSONP function 4751 if ( s.dataType === "json" && (s.data && jsre.test(s.data) || jsre.test(s.url)) ) { 4752 jsonp = s.jsonpCallback || ("jsonp" + jsc++); 4753 4754 // Replace the =? sequence both in the query string and the data 4755 if ( s.data ) { 4756 s.data = (s.data + "").replace(jsre, "=" + jsonp + "$1"); 4757 } 4758 4759 s.url = s.url.replace(jsre, "=" + jsonp + "$1"); 4760 4761 // We need to make sure 4762 // that a JSONP style response is executed properly 4763 s.dataType = "script"; 4764 4765 // Handle JSONP-style loading 4766 window[ jsonp ] = window[ jsonp ] || function( tmp ) { 4767 data = tmp; 4768 success(); 4769 complete(); 4770 // Garbage collect 4771 window[ jsonp ] = undefined; 4772 4773 try { 4774 delete window[ jsonp ]; 4775 } catch(e) {} 4776 4777 if ( head ) { 4778 head.removeChild( script ); 4779 } 4780 }; 4781 } 4782 4783 if ( s.dataType === "script" && s.cache === null ) { 4784 s.cache = false; 4785 } 4786 4787 if ( s.cache === false && type === "GET" ) { 4788 var ts = now(); 4789 4790 // try replacing _= if it is there 4791 var ret = s.url.replace(rts, "$1_=" + ts + "$2"); 4792 4793 // if nothing was replaced, add timestamp to the end 4794 s.url = ret + ((ret === s.url) ? (rquery.test(s.url) ? "&" : "?") + "_=" + ts : ""); 4795 } 4796 4797 // If data is available, append data to url for get requests 4798 if ( s.data && type === "GET" ) { 4799 s.url += (rquery.test(s.url) ? "&" : "?") + s.data; 4800 } 4801 4802 // Watch for a new set of requests 4803 if ( s.global && ! jQuery.active++ ) { 4804 jQuery.event.trigger( "ajaxStart" ); 4805 } 4806 4807 // Matches an absolute URL, and saves the domain 4808 var parts = rurl.exec( s.url ), 4809 remote = parts && (parts[1] && parts[1] !== location.protocol || parts[2] !== location.host); 4810 4811 // If we're requesting a remote document 4812 // and trying to load JSON or Script with a GET 4813 if ( s.dataType === "script" && type === "GET" && remote ) { 4814 var head = document.getElementsByTagName("head")[0] || document.documentElement; 4815 var script = document.createElement("script"); 4816 script.src = s.url; 4817 if ( s.scriptCharset ) { 4818 script.charset = s.scriptCharset; 4819 } 4820 4821 // Handle Script loading 4822 if ( !jsonp ) { 4823 var done = false; 4824 4825 // Attach handlers for all browsers 4826 script.onload = script.onreadystatechange = function() { 4827 if ( !done && (!this.readyState || 4828 this.readyState === "loaded" || this.readyState === "complete") ) { 4829 done = true; 4830 success(); 4831 complete(); 4832 4833 // Handle memory leak in IE 4834 script.onload = script.onreadystatechange = null; 4835 if ( head && script.parentNode ) { 4836 head.removeChild( script ); 4837 } 4838 } 4839 }; 4840 } 4841 4842 // Use insertBefore instead of appendChild to circumvent an IE6 bug. 4843 // This arises when a base node is used (#2709 and #4378). 4844 head.insertBefore( script, head.firstChild ); 4845 4846 // We handle everything using the script element injection 4847 return undefined; 4848 } 4849 4850 var requestDone = false; 4851 4852 // Create the request object 4853 var xhr = s.xhr(); 4854 4855 if ( !xhr ) { 4856 return; 4857 } 4858 4859 // Open the socket 4860 // Passing null username, generates a login popup on Opera (#2865) 4861 if ( s.username ) { 4862 xhr.open(type, s.url, s.async, s.username, s.password); 4863 } else { 4864 xhr.open(type, s.url, s.async); 4865 } 4866 4867 // Need an extra try/catch for cross domain requests in Firefox 3 4868 try { 4869 // Set the correct header, if data is being sent 4870 if ( s.data || origSettings && origSettings.contentType ) { 4871 xhr.setRequestHeader("Content-Type", s.contentType); 4872 } 4873 4874 // Set the If-Modified-Since and/or If-None-Match header, if in ifModified mode. 4875 if ( s.ifModified ) { 4876 if ( jQuery.lastModified[s.url] ) { 4877 xhr.setRequestHeader("If-Modified-Since", jQuery.lastModified[s.url]); 4878 } 4879 4880 if ( jQuery.etag[s.url] ) { 4881 xhr.setRequestHeader("If-None-Match", jQuery.etag[s.url]); 4882 } 4883 } 4884 4885 // Set header so the called script knows that it's an XMLHttpRequest 4886 // Only send the header if it's not a remote XHR 4887 if ( !remote ) { 4888 xhr.setRequestHeader("X-Requested-With", "XMLHttpRequest"); 4889 } 4890 4891 // Set the Accepts header for the server, depending on the dataType 4892 xhr.setRequestHeader("Accept", s.dataType && s.accepts[ s.dataType ] ? 4893 s.accepts[ s.dataType ] + ", */*" : 4894 s.accepts._default ); 4895 } catch(e) {} 4896 4897 // Allow custom headers/mimetypes and early abort 4898 if ( s.beforeSend && s.beforeSend.call(callbackContext, xhr, s) === false ) { 4899 // Handle the global AJAX counter 4900 if ( s.global && ! --jQuery.active ) { 4901 jQuery.event.trigger( "ajaxStop" ); 4902 } 4903 4904 // close opended socket 4905 xhr.abort(); 4906 return false; 4907 } 4908 4909 if ( s.global ) { 4910 trigger("ajaxSend", [xhr, s]); 4911 } 4912 4913 // Wait for a response to come back 4914 var onreadystatechange = xhr.onreadystatechange = function( isTimeout ) { 4915 // The request was aborted 4916 if ( !xhr || xhr.readyState === 0 ) { 4917 // Opera doesn't call onreadystatechange before this point 4918 // so we simulate the call 4919 if ( !requestDone ) { 4920 complete(); 4921 } 4922 4923 requestDone = true; 4924 if ( xhr ) { 4925 xhr.onreadystatechange = jQuery.noop; 4926 } 4927 4928 // The transfer is complete and the data is available, or the request timed out 4929 } else if ( !requestDone && xhr && (xhr.readyState === 4 || isTimeout === "timeout") ) { 4930 requestDone = true; 4931 xhr.onreadystatechange = jQuery.noop; 4932 4933 status = isTimeout === "timeout" ? 4934 "timeout" : 4935 !jQuery.httpSuccess( xhr ) ? 4936 "error" : 4937 s.ifModified && jQuery.httpNotModified( xhr, s.url ) ? 4938 "notmodified" : 4939 "success"; 4940 4941 if ( status === "success" ) { 4942 // Watch for, and catch, XML document parse errors 4943 try { 4944 // process the data (runs the xml through httpData regardless of callback) 4945 data = jQuery.httpData( xhr, s.dataType, s ); 4946 } catch(e) { 4947 status = "parsererror"; 4948 } 4949 } 4950 4951 // Make sure that the request was successful or notmodified 4952 if ( status === "success" || status === "notmodified" ) { 4953 // JSONP handles its own success callback 4954 if ( !jsonp ) { 4955 success(); 4956 } 4957 } else { 4958 jQuery.handleError(s, xhr, status); 4959 } 4960 4961 // Fire the complete handlers 4962 complete(); 4963 4964 if ( isTimeout === "timeout" ) { 4965 xhr.abort(); 4966 } 4967 4968 // Stop memory leaks 4969 if ( s.async ) { 4970 xhr = null; 4971 } 4972 } 4973 }; 4974 4975 // Override the abort handler, if we can (IE doesn't allow it, but that's OK) 4976 // Opera doesn't fire onreadystatechange at all on abort 4977 try { 4978 var oldAbort = xhr.abort; 4979 xhr.abort = function() { 4980 if ( xhr ) { 4981 oldAbort.call( xhr ); 4982 if ( xhr ) { 4983 xhr.readyState = 0; 4984 } 4985 } 4986 4987 onreadystatechange(); 4988 }; 4989 } catch(e) { } 4990 4991 // Timeout checker 4992 if ( s.async && s.timeout > 0 ) { 4993 setTimeout(function() { 4994 // Check to see if the request is still happening 4995 if ( xhr && !requestDone ) { 4996 onreadystatechange( "timeout" ); 4997 } 4998 }, s.timeout); 4999 } 5000 5001 // Send the data 5002 try { 5003 xhr.send( type === "POST" || type === "PUT" || type === "DELETE" ? s.data : null ); 5004 } catch(e) { 5005 jQuery.handleError(s, xhr, null, e); 5006 // Fire the complete handlers 5007 complete(); 5008 } 5009 5010 // firefox 1.5 doesn't fire statechange for sync requests 5011 if ( !s.async ) { 5012 onreadystatechange(); 5013 } 5014 5015 function success() { 5016 // If a local callback was specified, fire it and pass it the data 5017 if ( s.success ) { 5018 s.success.call( callbackContext, data, status, xhr ); 5019 } 5020 5021 // Fire the global callback 5022 if ( s.global ) { 5023 trigger( "ajaxSuccess", [xhr, s] ); 5024 } 5025 } 5026 5027 function complete() { 5028 // Process result 5029 if ( s.complete ) { 5030 s.complete.call( callbackContext, xhr, status); 5031 } 5032 5033 // The request was completed 5034 if ( s.global ) { 5035 trigger( "ajaxComplete", [xhr, s] ); 5036 } 5037 5038 // Handle the global AJAX counter 5039 if ( s.global && ! --jQuery.active ) { 5040 jQuery.event.trigger( "ajaxStop" ); 5041 } 5042 } 5043 5044 function trigger(type, args) { 5045 (s.context ? jQuery(s.context) : jQuery.event).trigger(type, args); 5046 } 5047 5048 // return XMLHttpRequest to allow aborting the request etc. 5049 return xhr; 5050 }, 5051 5052 handleError: function( s, xhr, status, e ) { 5053 // If a local callback was specified, fire it 5054 if ( s.error ) { 5055 s.error.call( s.context || window, xhr, status, e ); 5056 } 5057 5058 // Fire the global callback 5059 if ( s.global ) { 5060 (s.context ? jQuery(s.context) : jQuery.event).trigger( "ajaxError", [xhr, s, e] ); 5061 } 5062 }, 5063 5064 // Counter for holding the number of active queries 5065 active: 0, 5066 5067 // Determines if an XMLHttpRequest was successful or not 5068 httpSuccess: function( xhr ) { 5069 try { 5070 // IE error sometimes returns 1223 when it should be 204 so treat it as success, see #1450 5071 return !xhr.status && location.protocol === "file:" || 5072 // Opera returns 0 when status is 304 5073 ( xhr.status >= 200 && xhr.status < 300 ) || 5074 xhr.status === 304 || xhr.status === 1223 || xhr.status === 0; 5075 } catch(e) {} 5076 5077 return false; 5078 }, 5079 5080 // Determines if an XMLHttpRequest returns NotModified 5081 httpNotModified: function( xhr, url ) { 5082 var lastModified = xhr.getResponseHeader("Last-Modified"), 5083 etag = xhr.getResponseHeader("Etag"); 5084 5085 if ( lastModified ) { 5086 jQuery.lastModified[url] = lastModified; 5087 } 5088 5089 if ( etag ) { 5090 jQuery.etag[url] = etag; 5091 } 5092 5093 // Opera returns 0 when status is 304 5094 return xhr.status === 304 || xhr.status === 0; 5095 }, 5096 5097 httpData: function( xhr, type, s ) { 5098 var ct = xhr.getResponseHeader("content-type") || "", 5099 xml = type === "xml" || !type && ct.indexOf("xml") >= 0, 5100 data = xml ? xhr.responseXML : xhr.responseText; 5101 5102 if ( xml && data.documentElement.nodeName === "parsererror" ) { 5103 throw "parsererror"; 5104 } 5105 5106 // Allow a pre-filtering function to sanitize the response 5107 // s is checked to keep backwards compatibility 5108 if ( s && s.dataFilter ) { 5109 data = s.dataFilter( data, type ); 5110 } 5111 5112 // The filter can actually parse the response 5113 if ( typeof data === "string" ) { 5114 // Get the JavaScript object, if JSON is used. 5115 if ( type === "json" || !type && ct.indexOf("json") >= 0 ) { 5116 // Make sure the incoming data is actual JSON 5117 // Logic borrowed from http://json.org/json2.js 5118 if (/^[\],:{}\s]*$/.test(data.replace(/\\(?:["\\\/bfnrt]|u[0-9a-fA-F]{4})/g, "@") 5119 .replace(/"[^"\\\n\r]*"|true|false|null|-?\d+(?:\.\d*)?(?:[eE][+\-]?\d+)?/g, "]") 5120 .replace(/(?:^|:|,)(?:\s*\[)+/g, ""))) { 5121 5122 // Try to use the native JSON parser first 5123 if ( window.JSON && window.JSON.parse ) { 5124 data = window.JSON.parse( data ); 5125 5126 } else { 5127 data = (new Function("return " + data))(); 5128 } 5129 5130 } else { 5131 throw "Invalid JSON: " + data; 5132 } 5133 5134 // If the type is "script", eval it in global context 5135 } else if ( type === "script" || !type && ct.indexOf("javascript") >= 0 ) { 5136 jQuery.globalEval( data ); 5137 } 5138 } 5139 5140 return data; 5141 }, 5142 5143 // Serialize an array of form elements or a set of 5144 // key/values into a query string 5145 param: function( a, traditional ) { 5146 5147 var s = []; 5148 5149 // Set traditional to true for jQuery <= 1.3.2 behavior. 5150 if ( traditional === undefined ) { 5151 traditional = jQuery.ajaxSettings.traditional; 5152 } 5153 5154 function add( key, value ) { 5155 // If value is a function, invoke it and return its value 5156 value = jQuery.isFunction(value) ? value() : value; 5157 s[ s.length ] = encodeURIComponent(key) + "=" + encodeURIComponent(value); 5158 } 5159 5160 // If an array was passed in, assume that it is an array of form elements. 5161 if ( jQuery.isArray(a) || a.jquery ) { 5162 // Serialize the form elements 5163 jQuery.each( a, function() { 5164 add( this.name, this.value ); 5165 }); 5166 5167 } else { 5168 // If traditional, encode the "old" way (the way 1.3.2 or older 5169 // did it), otherwise encode params recursively. 5170 jQuery.each( a, function buildParams( prefix, obj ) { 5171 5172 if ( jQuery.isArray(obj) ) { 5173 // Serialize array item. 5174 jQuery.each( obj, function( i, v ) { 5175 if ( traditional ) { 5176 // Treat each array item as a scalar. 5177 add( prefix, v ); 5178 } else { 5179 // If array item is non-scalar (array or object), encode its 5180 // numeric index to resolve deserialization ambiguity issues. 5181 // Note that rack (as of 1.0.0) can't currently deserialize 5182 // nested arrays properly, and attempting to do so may cause 5183 // a server error. Possible fixes are to modify rack's 5184 // deserialization algorithm or to provide an option or flag 5185 // to force array serialization to be shallow. 5186 buildParams( prefix + "[" + ( typeof v === "object" || jQuery.isArray(v) ? i : "" ) + "]", v ); 5187 } 5188 }); 5189 5190 } else if ( !traditional && obj != null && typeof obj === "object" ) { 5191 // Serialize object item. 5192 jQuery.each( obj, function( k, v ) { 5193 buildParams( prefix + "[" + k + "]", v ); 5194 }); 5195 5196 } else { 5197 // Serialize scalar item. 5198 add( prefix, obj ); 5199 } 5200 }); 5201 } 5202 5203 // Return the resulting serialization 5204 return s.join("&").replace(r20, "+"); 5205 } 5206 5207 }); 5208 var elemdisplay = {}, 5209 rfxtypes = /toggle|show|hide/, 5210 rfxnum = /^([+-]=)?([\d+-.]+)(.*)$/, 5211 timerId, 5212 fxAttrs = [ 5213 // height animations 5214 [ "height", "marginTop", "marginBottom", "paddingTop", "paddingBottom" ], 5215 // width animations 5216 [ "width", "marginLeft", "marginRight", "paddingLeft", "paddingRight" ], 5217 // opacity animations 5218 [ "opacity" ] 5219 ]; 5220 5221 jQuery.fn.extend({ 5222 show: function( speed, callback ) { 5223 if ( speed != null ) { 5224 return this.animate( genFx("show", 3), speed, callback); 5225 5226 } else { 5227 for ( var i = 0, l = this.length; i < l; i++ ) { 5228 var old = jQuery.data(this[i], "olddisplay"); 5229 5230 this[i].style.display = old || ""; 5231 5232 if ( jQuery.css(this[i], "display") === "none" ) { 5233 var nodeName = this[i].nodeName, display; 5234 5235 if ( elemdisplay[ nodeName ] ) { 5236 display = elemdisplay[ nodeName ]; 5237 5238 } else { 5239 var elem = jQuery("<" + nodeName + " />").appendTo("body"); 5240 5241 display = elem.css("display"); 5242 5243 if ( display === "none" ) { 5244 display = "block"; 5245 } 5246 5247 elem.remove(); 5248 5249 elemdisplay[ nodeName ] = display; 5250 } 5251 5252 jQuery.data(this[i], "olddisplay", display); 5253 } 5254 } 5255 5256 // Set the display of the elements in a second loop 5257 // to avoid the constant reflow 5258 for ( var j = 0, k = this.length; j < k; j++ ) { 5259 this[j].style.display = jQuery.data(this[j], "olddisplay") || ""; 5260 } 5261 5262 return this; 5263 } 5264 }, 5265 5266 5267 5268 5269 5270 hide: function( speed, callback ) { 5271 if ( speed != null ) { 5272 return this.animate( genFx("hide", 3), speed, callback); 5273 5274 } else { 5275 for ( var i = 0, l = this.length; i < l; i++ ) { 5276 var old = jQuery.data(this[i], "olddisplay"); 5277 if ( !old && old !== "none" ) { 5278 jQuery.data(this[i], "olddisplay", jQuery.css(this[i], "display")); 5279 } 5280 } 5281 5282 // Set the display of the elements in a second loop 5283 // to avoid the constant reflow 5284 for ( var j = 0, k = this.length; j < k; j++ ) { 5285 this[j].style.display = "none"; 5286 } 5287 5288 return this; 5289 } 5290 }, 5291 5292 // Save the old toggle function 5293 _toggle: jQuery.fn.toggle, 5294 5295 toggle: function( fn, fn2 ) { 5296 var bool = typeof fn === "boolean"; 5297 5298 if ( jQuery.isFunction(fn) && jQuery.isFunction(fn2) ) { 5299 this._toggle.apply( this, arguments ); 5300 5301 } else if ( fn == null || bool ) { 5302 this.each(function() { 5303 var state = bool ? fn : jQuery(this).is(":hidden"); 5304 jQuery(this)[ state ? "show" : "hide" ](); 5305 }); 5306 5307 } else { 5308 this.animate(genFx("toggle", 3), fn, fn2); 5309 } 5310 5311 return this; 5312 }, 5313 5314 fadeTo: function( speed, to, callback ) { 5315 return this.filter(":hidden").css("opacity", 0).show().end() 5316 .animate({opacity: to}, speed, callback); 5317 }, 5318 5319 animate: function( prop, speed, easing, callback ) { 5320 var optall = jQuery.speed(speed, easing, callback); 5321 5322 if ( jQuery.isEmptyObject( prop ) ) { 5323 return this.each( optall.complete ); 5324 } 5325 5326 return this[ optall.queue === false ? "each" : "queue" ](function() { 5327 var opt = jQuery.extend({}, optall), p, 5328 hidden = this.nodeType === 1 && jQuery(this).is(":hidden"), 5329 self = this; 5330 5331 for ( p in prop ) { 5332 var name = p.replace(rdashAlpha, fcamelCase); 5333 5334 if ( p !== name ) { 5335 prop[ name ] = prop[ p ]; 5336 delete prop[ p ]; 5337 p = name; 5338 } 5339 5340 if ( prop[p] === "hide" && hidden || prop[p] === "show" && !hidden ) { 5341 return opt.complete.call(this); 5342 } 5343 5344 if ( ( p === "height" || p === "width" ) && this.style ) { 5345 // Store display property 5346 opt.display = jQuery.css(this, "display"); 5347 5348 // Make sure that nothing sneaks out 5349 opt.overflow = this.style.overflow; 5350 } 5351 5352 if ( jQuery.isArray( prop[p] ) ) { 5353 // Create (if needed) and add to specialEasing 5354 (opt.specialEasing = opt.specialEasing || {})[p] = prop[p][1]; 5355 prop[p] = prop[p][0]; 5356 } 5357 } 5358 5359 if ( opt.overflow != null ) { 5360 this.style.overflow = "hidden"; 5361 } 5362 5363 opt.curAnim = jQuery.extend({}, prop); 5364 5365 jQuery.each( prop, function( name, val ) { 5366 var e = new jQuery.fx( self, opt, name ); 5367 5368 if ( rfxtypes.test(val) ) { 5369 e[ val === "toggle" ? hidden ? "show" : "hide" : val ]( prop ); 5370 5371 } else { 5372 var parts = rfxnum.exec(val), 5373 start = e.cur(true) || 0; 5374 5375 if ( parts ) { 5376 var end = parseFloat( parts[2] ), 5377 unit = parts[3] || "px"; 5378 5379 // We need to compute starting value 5380 if ( unit !== "px" ) { 5381 self.style[ name ] = (end || 1) + unit; 5382 start = ((end || 1) / e.cur(true)) * start; 5383 self.style[ name ] = start + unit; 5384 } 5385 5386 // If a +=/-= token was provided, we're doing a relative animation 5387 if ( parts[1] ) { 5388 end = ((parts[1] === "-=" ? -1 : 1) * end) + start; 5389 } 5390 5391 e.custom( start, end, unit ); 5392 5393 } else { 5394 e.custom( start, val, "" ); 5395 } 5396 } 5397 }); 5398 5399 // For JS strict compliance 5400 return true; 5401 }); 5402 }, 5403 5404 stop: function( clearQueue, gotoEnd ) { 5405 var timers = jQuery.timers; 5406 5407 if ( clearQueue ) { 5408 this.queue([]); 5409 } 5410 5411 this.each(function() { 5412 // go in reverse order so anything added to the queue during the loop is ignored 5413 for ( var i = timers.length - 1; i >= 0; i-- ) { 5414 if ( timers[i].elem === this ) { 5415 if (gotoEnd) { 5416 // force the next step to be the last 5417 timers[i](true); 5418 } 5419 5420 timers.splice(i, 1); 5421 } 5422 } 5423 }); 5424 5425 // start the next in the queue if the last step wasn't forced 5426 if ( !gotoEnd ) { 5427 this.dequeue(); 5428 } 5429 5430 return this; 5431 } 5432 5433 }); 5434 5435 // Generate shortcuts for custom animations 5436 jQuery.each({ 5437 slideDown: genFx("show", 1), 5438 slideUp: genFx("hide", 1), 5439 slideToggle: genFx("toggle", 1), 5440 fadeIn: { opacity: "show" }, 5441 fadeOut: { opacity: "hide" } 5442 }, function( name, props ) { 5443 jQuery.fn[ name ] = function( speed, callback ) { 5444 return this.animate( props, speed, callback ); 5445 }; 5446 }); 5447 5448 jQuery.extend({ 5449 speed: function( speed, easing, fn ) { 5450 var opt = speed && typeof speed === "object" ? speed : { 5451 complete: fn || !fn && easing || 5452 jQuery.isFunction( speed ) && speed, 5453 duration: speed, 5454 easing: fn && easing || easing && !jQuery.isFunction(easing) && easing 5455 }; 5456 5457 opt.duration = jQuery.fx.off ? 0 : typeof opt.duration === "number" ? opt.duration : 5458 jQuery.fx.speeds[opt.duration] || jQuery.fx.speeds._default; 5459 5460 // Queueing 5461 opt.old = opt.complete; 5462 opt.complete = function() { 5463 if ( opt.queue !== false ) { 5464 jQuery(this).dequeue(); 5465 } 5466 if ( jQuery.isFunction( opt.old ) ) { 5467 opt.old.call( this ); 5468 } 5469 }; 5470 5471 return opt; 5472 }, 5473 5474 easing: { 5475 linear: function( p, n, firstNum, diff ) { 5476 return firstNum + diff * p; 5477 }, 5478 swing: function( p, n, firstNum, diff ) { 5479 return ((-Math.cos(p*Math.PI)/2) + 0.5) * diff + firstNum; 5480 } 5481 }, 5482 5483 timers: [], 5484 5485 fx: function( elem, options, prop ) { 5486 this.options = options; 5487 this.elem = elem; 5488 this.prop = prop; 5489 5490 if ( !options.orig ) { 5491 options.orig = {}; 5492 } 5493 } 5494 5495 }); 5496 5497 jQuery.fx.prototype = { 5498 // Simple function for setting a style value 5499 update: function() { 5500 if ( this.options.step ) { 5501 this.options.step.call( this.elem, this.now, this ); 5502 } 5503 5504 (jQuery.fx.step[this.prop] || jQuery.fx.step._default)( this ); 5505 5506 // Set display property to block for height/width animations 5507 if ( ( this.prop === "height" || this.prop === "width" ) && this.elem.style ) { 5508 this.elem.style.display = "block"; 5509 } 5510 }, 5511 5512 // Get the current size 5513 cur: function( force ) { 5514 if ( this.elem[this.prop] != null && (!this.elem.style || this.elem.style[this.prop] == null) ) { 5515 return this.elem[ this.prop ]; 5516 } 5517 5518 var r = parseFloat(jQuery.css(this.elem, this.prop, force)); 5519 return r && r > -10000 ? r : parseFloat(jQuery.curCSS(this.elem, this.prop)) || 0; 5520 }, 5521 5522 // Start an animation from one number to another 5523 custom: function( from, to, unit ) { 5524 this.startTime = now(); 5525 this.start = from; 5526 this.end = to; 5527 this.unit = unit || this.unit || "px"; 5528 this.now = this.start; 5529 this.pos = this.state = 0; 5530 5531 var self = this; 5532 function t( gotoEnd ) { 5533 return self.step(gotoEnd); 5534 } 5535 5536 t.elem = this.elem; 5537 5538 if ( t() && jQuery.timers.push(t) && !timerId ) { 5539 timerId = setInterval(jQuery.fx.tick, 13); 5540 } 5541 }, 5542 5543 // Simple 'show' function 5544 show: function() { 5545 // Remember where we started, so that we can go back to it later 5546 this.options.orig[this.prop] = jQuery.style( this.elem, this.prop ); 5547 this.options.show = true; 5548 5549 // Begin the animation 5550 // Make sure that we start at a small width/height to avoid any 5551 // flash of content 5552 this.custom(this.prop === "width" || this.prop === "height" ? 1 : 0, this.cur()); 5553 5554 // Start by showing the element 5555 jQuery( this.elem ).show(); 5556 }, 5557 5558 // Simple 'hide' function 5559 hide: function() { 5560 // Remember where we started, so that we can go back to it later 5561 this.options.orig[this.prop] = jQuery.style( this.elem, this.prop ); 5562 this.options.hide = true; 5563 5564 // Begin the animation 5565 this.custom(this.cur(), 0); 5566 }, 5567 5568 // Each step of an animation 5569 step: function( gotoEnd ) { 5570 var t = now(), done = true; 5571 5572 if ( gotoEnd || t >= this.options.duration + this.startTime ) { 5573 this.now = this.end; 5574 this.pos = this.state = 1; 5575 this.update(); 5576 5577 this.options.curAnim[ this.prop ] = true; 5578 5579 for ( var i in this.options.curAnim ) { 5580 if ( this.options.curAnim[i] !== true ) { 5581 done = false; 5582 } 5583 } 5584 5585 if ( done ) { 5586 if ( this.options.display != null ) { 5587 // Reset the overflow 5588 this.elem.style.overflow = this.options.overflow; 5589 5590 // Reset the display 5591 var old = jQuery.data(this.elem, "olddisplay"); 5592 this.elem.style.display = old ? old : this.options.display; 5593 5594 if ( jQuery.css(this.elem, "display") === "none" ) { 5595 this.elem.style.display = "block"; 5596 } 5597 } 5598 5599 // Hide the element if the "hide" operation was done 5600 if ( this.options.hide ) { 5601 jQuery(this.elem).hide(); 5602 } 5603 5604 // Reset the properties, if the item has been hidden or shown 5605 if ( this.options.hide || this.options.show ) { 5606 for ( var p in this.options.curAnim ) { 5607 jQuery.style(this.elem, p, this.options.orig[p]); 5608 } 5609 } 5610 5611 // Execute the complete function 5612 this.options.complete.call( this.elem ); 5613 } 5614 5615 return false; 5616 5617 } else { 5618 var n = t - this.startTime; 5619 this.state = n / this.options.duration; 5620 5621 // Perform the easing function, defaults to swing 5622 var specialEasing = this.options.specialEasing && this.options.specialEasing[this.prop]; 5623 var defaultEasing = this.options.easing || (jQuery.easing.swing ? "swing" : "linear"); 5624 this.pos = jQuery.easing[specialEasing || defaultEasing](this.state, n, 0, 1, this.options.duration); 5625 this.now = this.start + ((this.end - this.start) * this.pos); 5626 5627 // Perform the next step of the animation 5628 this.update(); 5629 } 5630 5631 return true; 5632 } 5633 }; 5634 5635 jQuery.extend( jQuery.fx, { 5636 tick: function() { 5637 var timers = jQuery.timers; 5638 5639 for ( var i = 0; i < timers.length; i++ ) { 5640 if ( !timers[i]() ) { 5641 timers.splice(i--, 1); 5642 } 5643 } 5644 5645 if ( !timers.length ) { 5646 jQuery.fx.stop(); 5647 } 5648 }, 5649 5650 stop: function() { 5651 clearInterval( timerId ); 5652 timerId = null; 5653 }, 5654 5655 speeds: { 5656 slow: 600, 5657 fast: 200, 5658 // Default speed 5659 _default: 400 5660 }, 5661 5662 step: { 5663 opacity: function( fx ) { 5664 jQuery.style(fx.elem, "opacity", fx.now); 5665 }, 5666 5667 _default: function( fx ) { 5668 if ( fx.elem.style && fx.elem.style[ fx.prop ] != null ) { 5669 fx.elem.style[ fx.prop ] = (fx.prop === "width" || fx.prop === "height" ? Math.max(0, fx.now) : fx.now) + fx.unit; 5670 } else { 5671 fx.elem[ fx.prop ] = fx.now; 5672 } 5673 } 5674 } 5675 }); 5676 5677 if ( jQuery.expr && jQuery.expr.filters ) { 5678 jQuery.expr.filters.animated = function( elem ) { 5679 return jQuery.grep(jQuery.timers, function( fn ) { 5680 return elem === fn.elem; 5681 }).length; 5682 }; 5683 } 5684 5685 function genFx( type, num ) { 5686 var obj = {}; 5687 5688 jQuery.each( fxAttrs.concat.apply([], fxAttrs.slice(0,num)), function() { 5689 obj[ this ] = type; 5690 }); 5691 5692 return obj; 5693 } 5694 if ( "getBoundingClientRect" in document.documentElement ) { 5695 jQuery.fn.offset = function( options ) { 5696 var elem = this[0]; 5697 5698 if ( !elem || !elem.ownerDocument ) { 5699 return null; 5700 } 5701 5702 if ( options ) { 5703 return this.each(function( i ) { 5704 jQuery.offset.setOffset( this, options, i ); 5705 }); 5706 } 5707 5708 if ( elem === elem.ownerDocument.body ) { 5709 return jQuery.offset.bodyOffset( elem ); 5710 } 5711 5712 var box = elem.getBoundingClientRect(), doc = elem.ownerDocument, body = doc.body, docElem = doc.documentElement, 5713 clientTop = docElem.clientTop || body.clientTop || 0, clientLeft = docElem.clientLeft || body.clientLeft || 0, 5714 top = box.top + (self.pageYOffset || jQuery.support.boxModel && docElem.scrollTop || body.scrollTop ) - clientTop, 5715 left = box.left + (self.pageXOffset || jQuery.support.boxModel && docElem.scrollLeft || body.scrollLeft) - clientLeft; 5716 5717 return { top: top, left: left }; 5718 }; 5719 5720 } else { 5721 jQuery.fn.offset = function( options ) { 5722 var elem = this[0]; 5723 5724 if ( !elem || !elem.ownerDocument ) { 5725 return null; 5726 } 5727 5728 if ( options ) { 5729 return this.each(function( i ) { 5730 jQuery.offset.setOffset( this, options, i ); 5731 }); 5732 } 5733 5734 if ( elem === elem.ownerDocument.body ) { 5735 return jQuery.offset.bodyOffset( elem ); 5736 } 5737 5738 jQuery.offset.initialize(); 5739 5740 var offsetParent = elem.offsetParent, prevOffsetParent = elem, 5741 doc = elem.ownerDocument, computedStyle, docElem = doc.documentElement, 5742 body = doc.body, defaultView = doc.defaultView, 5743 prevComputedStyle = defaultView ? defaultView.getComputedStyle( elem, null ) : elem.currentStyle, 5744 top = elem.offsetTop, left = elem.offsetLeft; 5745 5746 while ( (elem = elem.parentNode) && elem !== body && elem !== docElem ) { 5747 if ( jQuery.offset.supportsFixedPosition && prevComputedStyle.position === "fixed" ) { 5748 break; 5749 } 5750 5751 computedStyle = defaultView ? defaultView.getComputedStyle(elem, null) : elem.currentStyle; 5752 top -= elem.scrollTop; 5753 left -= elem.scrollLeft; 5754 5755 if ( elem === offsetParent ) { 5756 top += elem.offsetTop; 5757 left += elem.offsetLeft; 5758 5759 if ( jQuery.offset.doesNotAddBorder && !(jQuery.offset.doesAddBorderForTableAndCells && /^t(able|d|h)$/i.test(elem.nodeName)) ) { 5760 top += parseFloat( computedStyle.borderTopWidth ) || 0; 5761 left += parseFloat( computedStyle.borderLeftWidth ) || 0; 5762 } 5763 5764 prevOffsetParent = offsetParent, offsetParent = elem.offsetParent; 5765 } 5766 5767 if ( jQuery.offset.subtractsBorderForOverflowNotVisible && computedStyle.overflow !== "visible" ) { 5768 top += parseFloat( computedStyle.borderTopWidth ) || 0; 5769 left += parseFloat( computedStyle.borderLeftWidth ) || 0; 5770 } 5771 5772 prevComputedStyle = computedStyle; 5773 } 5774 5775 if ( prevComputedStyle.position === "relative" || prevComputedStyle.position === "static" ) { 5776 top += body.offsetTop; 5777 left += body.offsetLeft; 5778 } 5779 5780 if ( jQuery.offset.supportsFixedPosition && prevComputedStyle.position === "fixed" ) { 5781 top += Math.max( docElem.scrollTop, body.scrollTop ); 5782 left += Math.max( docElem.scrollLeft, body.scrollLeft ); 5783 } 5784 5785 return { top: top, left: left }; 5786 }; 5787 } 5788 5789 jQuery.offset = { 5790 initialize: function() { 5791 var body = document.body, container = document.createElement("div"), innerDiv, checkDiv, table, td, bodyMarginTop = parseFloat( jQuery.curCSS(body, "marginTop", true) ) || 0, 5792 html = "<div style='position:absolute;top:0;left:0;margin:0;border:5px solid #000;padding:0;width:1px;height:1px;'><div></div></div><table style='position:absolute;top:0;left:0;margin:0;border:5px solid #000;padding:0;width:1px;height:1px;' cellpadding='0' cellspacing='0'><tr><td></td></tr></table>"; 5793 5794 jQuery.extend( container.style, { position: "absolute", top: 0, left: 0, margin: 0, border: 0, width: "1px", height: "1px", visibility: "hidden" } ); 5795 5796 container.innerHTML = html; 5797 body.insertBefore( container, body.firstChild ); 5798 innerDiv = container.firstChild; 5799 checkDiv = innerDiv.firstChild; 5800 td = innerDiv.nextSibling.firstChild.firstChild; 5801 5802 this.doesNotAddBorder = (checkDiv.offsetTop !== 5); 5803 this.doesAddBorderForTableAndCells = (td.offsetTop === 5); 5804 5805 checkDiv.style.position = "fixed", checkDiv.style.top = "20px"; 5806 // safari subtracts parent border width here which is 5px 5807 this.supportsFixedPosition = (checkDiv.offsetTop === 20 || checkDiv.offsetTop === 15); 5808 checkDiv.style.position = checkDiv.style.top = ""; 5809 5810 innerDiv.style.overflow = "hidden", innerDiv.style.position = "relative"; 5811 this.subtractsBorderForOverflowNotVisible = (checkDiv.offsetTop === -5); 5812 5813 this.doesNotIncludeMarginInBodyOffset = (body.offsetTop !== bodyMarginTop); 5814 5815 body.removeChild( container ); 5816 body = container = innerDiv = checkDiv = table = td = null; 5817 jQuery.offset.initialize = jQuery.noop; 5818 }, 5819 5820 bodyOffset: function( body ) { 5821 var top = body.offsetTop, left = body.offsetLeft; 5822 5823 jQuery.offset.initialize(); 5824 5825 if ( jQuery.offset.doesNotIncludeMarginInBodyOffset ) { 5826 top += parseFloat( jQuery.curCSS(body, "marginTop", true) ) || 0; 5827 left += parseFloat( jQuery.curCSS(body, "marginLeft", true) ) || 0; 5828 } 5829 5830 return { top: top, left: left }; 5831 }, 5832 5833 setOffset: function( elem, options, i ) { 5834 // set position first, in-case top/left are set even on static elem 5835 if ( /static/.test( jQuery.curCSS( elem, "position" ) ) ) { 5836 elem.style.position = "relative"; 5837 } 5838 var curElem = jQuery( elem ), 5839 curOffset = curElem.offset(), 5840 curTop = parseInt( jQuery.curCSS( elem, "top", true ), 10 ) || 0, 5841 curLeft = parseInt( jQuery.curCSS( elem, "left", true ), 10 ) || 0; 5842 5843 if ( jQuery.isFunction( options ) ) { 5844 options = options.call( elem, i, curOffset ); 5845 } 5846 5847 var props = { 5848 top: (options.top - curOffset.top) + curTop, 5849 left: (options.left - curOffset.left) + curLeft 5850 }; 5851 5852 if ( "using" in options ) { 5853 options.using.call( elem, props ); 5854 } else { 5855 curElem.css( props ); 5856 } 5857 } 5858 }; 5859 5860 5861 jQuery.fn.extend({ 5862 position: function() { 5863 if ( !this[0] ) { 5864 return null; 5865 } 5866 5867 var elem = this[0], 5868 5869 // Get *real* offsetParent 5870 offsetParent = this.offsetParent(), 5871 5872 // Get correct offsets 5873 offset = this.offset(), 5874 parentOffset = /^body|html$/i.test(offsetParent[0].nodeName) ? { top: 0, left: 0 } : offsetParent.offset(); 5875 5876 // Subtract element margins 5877 // note: when an element has margin: auto the offsetLeft and marginLeft 5878 // are the same in Safari causing offset.left to incorrectly be 0 5879 offset.top -= parseFloat( jQuery.curCSS(elem, "marginTop", true) ) || 0; 5880 offset.left -= parseFloat( jQuery.curCSS(elem, "marginLeft", true) ) || 0; 5881 5882 // Add offsetParent borders 5883 parentOffset.top += parseFloat( jQuery.curCSS(offsetParent[0], "borderTopWidth", true) ) || 0; 5884 parentOffset.left += parseFloat( jQuery.curCSS(offsetParent[0], "borderLeftWidth", true) ) || 0; 5885 5886 // Subtract the two offsets 5887 return { 5888 top: offset.top - parentOffset.top, 5889 left: offset.left - parentOffset.left 5890 }; 5891 }, 5892 5893 offsetParent: function() { 5894 return this.map(function() { 5895 var offsetParent = this.offsetParent || document.body; 5896 while ( offsetParent && (!/^body|html$/i.test(offsetParent.nodeName) && jQuery.css(offsetParent, "position") === "static") ) { 5897 offsetParent = offsetParent.offsetParent; 5898 } 5899 return offsetParent; 5900 }); 5901 } 5902 }); 5903 5904 5905 // Create scrollLeft and scrollTop methods 5906 jQuery.each( ["Left", "Top"], function( i, name ) { 5907 var method = "scroll" + name; 5908 5909 jQuery.fn[ method ] = function(val) { 5910 var elem = this[0], win; 5911 5912 if ( !elem ) { 5913 return null; 5914 } 5915 5916 if ( val !== undefined ) { 5917 // Set the scroll offset 5918 return this.each(function() { 5919 win = getWindow( this ); 5920 5921 if ( win ) { 5922 win.scrollTo( 5923 !i ? val : jQuery(win).scrollLeft(), 5924 i ? val : jQuery(win).scrollTop() 5925 ); 5926 5927 } else { 5928 this[ method ] = val; 5929 } 5930 }); 5931 } else { 5932 win = getWindow( elem ); 5933 5934 // Return the scroll offset 5935 return win ? ("pageXOffset" in win) ? win[ i ? "pageYOffset" : "pageXOffset" ] : 5936 jQuery.support.boxModel && win.document.documentElement[ method ] || 5937 win.document.body[ method ] : 5938 elem[ method ]; 5939 } 5940 }; 5941 }); 5942 5943 function getWindow( elem ) { 5944 return ("scrollTo" in elem && elem.document) ? 5945 elem : 5946 elem.nodeType === 9 ? 5947 elem.defaultView || elem.parentWindow : 5948 false; 5949 } 5950 // Create innerHeight, innerWidth, outerHeight and outerWidth methods 5951 jQuery.each([ "Height", "Width" ], function( i, name ) { 5952 5953 var type = name.toLowerCase(); 5954 5955 // innerHeight and innerWidth 5956 jQuery.fn["inner" + name] = function() { 5957 return this[0] ? 5958 jQuery.css( this[0], type, false, "padding" ) : 5959 null; 5960 }; 5961 5962 // outerHeight and outerWidth 5963 jQuery.fn["outer" + name] = function( margin ) { 5964 return this[0] ? 5965 jQuery.css( this[0], type, false, margin ? "margin" : "border" ) : 5966 null; 5967 }; 5968 5969 jQuery.fn[ type ] = function( size ) { 5970 // Get window width or height 5971 var elem = this[0]; 5972 if ( !elem ) { 5973 return size == null ? null : this; 5974 } 5975 5976 return ("scrollTo" in elem && elem.document) ? // does it walk and quack like a window? 5977 // Everyone else use document.documentElement or document.body depending on Quirks vs Standards mode 5978 elem.document.compatMode === "CSS1Compat" && elem.document.documentElement[ "client" + name ] || 5979 elem.document.body[ "client" + name ] : 5980 5981 // Get document width or height 5982 (elem.nodeType === 9) ? // is it a document 5983 // Either scroll[Width/Height] or offset[Width/Height], whichever is greater 5984 Math.max( 5985 elem.documentElement["client" + name], 5986 elem.body["scroll" + name], elem.documentElement["scroll" + name], 5987 elem.body["offset" + name], elem.documentElement["offset" + name] 5988 ) : 5989 5990 // Get or set width or height on the element 5991 size === undefined ? 5992 // Get width or height on the element 5993 jQuery.css( elem, type ) : 5994 5995 // Set the width or height on the element (default to pixels if value is unitless) 5996 this.css( type, typeof size === "string" ? size : size + "px" ); 5997 }; 5998 5999 }); 6000 // Expose jQuery to the global object 6001 window.jQuery = window.$ = jQuery; 6002 6003 })(window);
title
Description
Body
title
Description
Body
title
Description
Body
title
Body
Generated: Fri Nov 28 20:08:37 2014 | Cross-referenced by PHPXref 0.7.1 |