1(function(){ 2/* 3 * jQuery 1.2.6 - New Wave Javascript 4 * 5 * Copyright (c) 2008 John Resig (jquery.com) 6 * Dual licensed under the MIT (MIT-LICENSE.txt) 7 * and GPL (GPL-LICENSE.txt) licenses. 8 * 9 * $Date: 2008-05-24 14:22:17 -0400 (Sat, 24 May 2008) $ 10 * $Rev: 5685 $ 11 */ 12 13// Map over jQuery in case of overwrite 14var _jQuery = window.jQuery, 15// Map over the $ in case of overwrite 16 _$ = window.$; 17 18var jQuery = window.jQuery = window.$ = function( selector, context ) { 19 // The jQuery object is actually just the init constructor 'enhanced' 20 return new jQuery.fn.init( selector, context ); 21}; 22 23// A simple way to check for HTML strings or ID strings 24// (both of which we optimize for) 25var quickExpr = /^[^<]*(<(.|\s)+>)[^>]*$|^#(\w+)$/, 26 27// Is it a simple selector 28 isSimple = /^.[^:#\[\.]*$/, 29 30// Will speed up references to undefined, and allows munging its name. 31 undefined; 32 33jQuery.fn = jQuery.prototype = { 34 init: function( selector, context ) { 35 // Make sure that a selection was provided 36 selector = selector || document; 37 38 // Handle $(DOMElement) 39 if ( selector.nodeType ) { 40 this[0] = selector; 41 this.length = 1; 42 return this; 43 } 44 // Handle HTML strings 45 if ( typeof selector == "string" ) { 46 // Are we dealing with HTML string or an ID? 47 var match = quickExpr.exec( selector ); 48 49 // Verify a match, and that no context was specified for #id 50 if ( match && (match[1] || !context) ) { 51 52 // HANDLE: $(html) -> $(array) 53 if ( match[1] ) 54 selector = jQuery.clean( [ match[1] ], context ); 55 56 // HANDLE: $("#id") 57 else { 58 var elem = document.getElementById( match[3] ); 59 60 // Make sure an element was located 61 if ( elem ){ 62 // Handle the case where IE and Opera return items 63 // by name instead of ID 64 if ( elem.id != match[3] ) 65 return jQuery().find( selector ); 66 67 // Otherwise, we inject the element directly into the jQuery object 68 return jQuery( elem ); 69 } 70 selector = []; 71 } 72 73 // HANDLE: $(expr, [context]) 74 // (which is just equivalent to: $(content).find(expr) 75 } else 76 return jQuery( context ).find( selector ); 77 78 // HANDLE: $(function) 79 // Shortcut for document ready 80 } else if ( jQuery.isFunction( selector ) ) 81 return jQuery( document )[ jQuery.fn.ready ? "ready" : "load" ]( selector ); 82 83 return this.setArray(jQuery.makeArray(selector)); 84 }, 85 86 // The current version of jQuery being used 87 jquery: "1.2.6", 88 89 // The number of elements contained in the matched element set 90 size: function() { 91 return this.length; 92 }, 93 94 // The number of elements contained in the matched element set 95 length: 0, 96 97 // Get the Nth element in the matched element set OR 98 // Get the whole matched element set as a clean array 99 get: function( num ) { 100 return num == undefined ? 101 102 // Return a 'clean' array 103 jQuery.makeArray( this ) : 104 105 // Return just the object 106 this[ num ]; 107 }, 108 109 // Take an array of elements and push it onto the stack 110 // (returning the new matched element set) 111 pushStack: function( elems ) { 112 // Build a new jQuery matched element set 113 var ret = jQuery( elems ); 114 115 // Add the old object onto the stack (as a reference) 116 ret.prevObject = this; 117 118 // Return the newly-formed element set 119 return ret; 120 }, 121 122 // Force the current matched set of elements to become 123 // the specified array of elements (destroying the stack in the process) 124 // You should use pushStack() in order to do this, but maintain the stack 125 setArray: function( elems ) { 126 // Resetting the length to 0, then using the native Array push 127 // is a super-fast way to populate an object with array-like properties 128 this.length = 0; 129 Array.prototype.push.apply( this, elems ); 130 131 return this; 132 }, 133 134 // Execute a callback for every element in the matched set. 135 // (You can seed the arguments with an array of args, but this is 136 // only used internally.) 137 each: function( callback, args ) { 138 return jQuery.each( this, callback, args ); 139 }, 140 141 // Determine the position of an element within 142 // the matched set of elements 143 index: function( elem ) { 144 var ret = -1; 145 146 // Locate the position of the desired element 147 return jQuery.inArray( 148 // If it receives a jQuery object, the first element is used 149 elem && elem.jquery ? elem[0] : elem 150 , this ); 151 }, 152 153 attr: function( name, value, type ) { 154 var options = name; 155 156 // Look for the case where we're accessing a style value 157 if ( name.constructor == String ) 158 if ( value === undefined ) 159 return this[0] && jQuery[ type || "attr" ]( this[0], name ); 160 161 else { 162 options = {}; 163 options[ name ] = value; 164 } 165 166 // Check to see if we're setting style values 167 return this.each(function(i){ 168 // Set all the styles 169 for ( name in options ) 170 jQuery.attr( 171 type ? 172 this.style : 173 this, 174 name, jQuery.prop( this, options[ name ], type, i, name ) 175 ); 176 }); 177 }, 178 179 css: function( key, value ) { 180 // ignore negative width and height values 181 if ( (key == 'width' || key == 'height') && parseFloat(value) < 0 ) 182 value = undefined; 183 return this.attr( key, value, "curCSS" ); 184 }, 185 186 text: function( text ) { 187 if ( typeof text != "object" && text != null ) 188 return this.empty().append( (this[0] && this[0].ownerDocument || document).createTextNode( text ) ); 189 190 var ret = ""; 191 192 jQuery.each( text || this, function(){ 193 jQuery.each( this.childNodes, function(){ 194 if ( this.nodeType != 8 ) 195 ret += this.nodeType != 1 ? 196 this.nodeValue : 197 jQuery.fn.text( [ this ] ); 198 }); 199 }); 200 201 return ret; 202 }, 203 204 wrapAll: function( html ) { 205 if ( this[0] ) 206 // The elements to wrap the target around 207 jQuery( html, this[0].ownerDocument ) 208 .clone() 209 .insertBefore( this[0] ) 210 .map(function(){ 211 var elem = this; 212 213 while ( elem.firstChild ) 214 elem = elem.firstChild; 215 216 return elem; 217 }) 218 .append(this); 219 220 return this; 221 }, 222 223 wrapInner: function( html ) { 224 return this.each(function(){ 225 jQuery( this ).contents().wrapAll( html ); 226 }); 227 }, 228 229 wrap: function( html ) { 230 return this.each(function(){ 231 jQuery( this ).wrapAll( html ); 232 }); 233 }, 234 235 append: function() { 236 return this.domManip(arguments, true, false, function(elem){ 237 if (this.nodeType == 1) 238 this.appendChild( elem ); 239 }); 240 }, 241 242 prepend: function() { 243 return this.domManip(arguments, true, true, function(elem){ 244 if (this.nodeType == 1) 245 this.insertBefore( elem, this.firstChild ); 246 }); 247 }, 248 249 before: function() { 250 return this.domManip(arguments, false, false, function(elem){ 251 this.parentNode.insertBefore( elem, this ); 252 }); 253 }, 254 255 after: function() { 256 return this.domManip(arguments, false, true, function(elem){ 257 this.parentNode.insertBefore( elem, this.nextSibling ); 258 }); 259 }, 260 261 end: function() { 262 return this.prevObject || jQuery( [] ); 263 }, 264 265 find: function( selector ) { 266 var elems = jQuery.map(this, function(elem){ 267 return jQuery.find( selector, elem ); 268 }); 269 270 return this.pushStack( /[^+>] [^+>]/.test( selector ) || selector.indexOf("..") > -1 ? 271 jQuery.unique( elems ) : 272 elems ); 273 }, 274 275 clone: function( events ) { 276 // Do the clone 277 var ret = this.map(function(){ 278 if ( jQuery.browser.msie && !jQuery.isXMLDoc(this) ) { 279 // IE copies events bound via attachEvent when 280 // using cloneNode. Calling detachEvent on the 281 // clone will also remove the events from the orignal 282 // In order to get around this, we use innerHTML. 283 // Unfortunately, this means some modifications to 284 // attributes in IE that are actually only stored 285 // as properties will not be copied (such as the 286 // the name attribute on an input). 287 var clone = this.cloneNode(true), 288 container = document.createElement("div"); 289 container.appendChild(clone);
290 return jQuery.clean([container.innerHTML])[0]; 291 } else 292 return this.cloneNode(true); 293 }); 294 295 // Need to set the expando to null on the cloned set if it exists 296 // removeData doesn't work here, IE removes it from the original as well 297 // this is primarily for IE but the data expando shouldn't be copied over in any browser 298 var clone = ret.find("*").andSelf().each(function(){ 299 if ( this[ expando ] != undefined ) 300 this[ expando ] = null; 301 }); 302 303 // Copy the events from the original to the clone 304 if ( events === true ) 305 this.find("*").andSelf().each(function(i){ 306 if (this.nodeType == 3) 307 return; 308 var events = jQuery.data( this, "events" ); 309 310 for ( var type in events ) 311 for ( var handler in events[ type ] ) 312 jQuery.event.add( clone[ i ], type, events[ type ][ handler ], events[ type ][ handler ].data ); 313 }); 314 315 // Return the cloned set 316 return ret; 317 }, 318 319 filter: function( selector ) { 320 return this.pushStack( 321 jQuery.isFunction( selector ) && 322 jQuery.grep(this, function(elem, i){ 323 return selector.call( elem, i ); 324 }) || 325 326 jQuery.multiFilter( selector, this ) ); 327 }, 328 329 not: function( selector ) { 330 if ( selector.constructor == String ) 331 // test special case where just one selector is passed in 332 if ( isSimple.test( selector ) ) 333 return this.pushStack( jQuery.multiFilter( selector, this, true ) ); 334 else 335 selector = jQuery.multiFilter( selector, this ); 336 337 var isArrayLike = selector.length && selector[selector.length - 1] !== undefined && !selector.nodeType; 338 return this.filter(function() { 339 return isArrayLike ? jQuery.inArray( this, selector ) < 0 : this != selector; 340 }); 341 }, 342 343 add: function( selector ) { 344 return this.pushStack( jQuery.unique( jQuery.merge( 345 this.get(), 346 typeof selector == 'string' ? 347 jQuery( selector ) : 348 jQuery.makeArray( selector ) 349 ))); 350 }, 351 352 is: function( selector ) { 353 return !!selector && jQuery.multiFilter( selector, this ).length > 0; 354 }, 355 356 hasClass: function( selector ) { 357 return this.is( "." + selector ); 358 }, 359 360 val: function( value ) { 361 if ( value == undefined ) { 362 363 if ( this.length ) { 364 var elem = this[0]; 365 366 // We need to handle select boxes special 367 if ( jQuery.nodeName( elem, "select" ) ) { 368 var index = elem.selectedIndex, 369 values = [], 370 options = elem.options, 371 one = elem.type == "select-one"; 372 373 // Nothing was selected 374 if ( index < 0 ) 375 return null; 376 377 // Loop through all the selected options 378 for ( var i = one ? index : 0, max = one ? index + 1 : options.length; i < max; i++ ) { 379 var option = options[ i ]; 380 381 if ( option.selected ) { 382 // Get the specifc value for the option 383 value = jQuery.browser.msie && !option.attributes.value.specified ? option.text : option.value; 384 385 // We don't need an array for one selects 386 if ( one ) 387 return value; 388 389 // Multi-Selects return an array 390 values.push( value ); 391 } 392 } 393 394 return values; 395 396 // Everything else, we just grab the value 397 } else 398 return (this[0].value || "").replace(/\r/g, ""); 399 400 } 401 402 return undefined; 403 } 404 405 if( value.constructor == Number ) 406 value += ''; 407 408 return this.each(function(){ 409 if ( this.nodeType != 1 ) 410 return; 411 412 if ( value.constructor == Array && /radio|checkbox/.test( this.type ) ) 413 this.checked = (jQuery.inArray(this.value, value) >= 0 || 414 jQuery.inArray(this.name, value) >= 0); 415 416 else if ( jQuery.nodeName( this, "select" ) ) { 417 var values = jQuery.makeArray(value); 418 419 jQuery( "option", this ).each(function(){ 420 this.selected = (jQuery.inArray( this.value, values ) >= 0 || 421 jQuery.inArray( this.text, values ) >= 0); 422 }); 423 424 if ( !values.length ) 425 this.selectedIndex = -1; 426 427 } else 428 this.value = value; 429 }); 430 }, 431 432 html: function( value ) { 433 return value == undefined ? 434 (this[0] ? 435 this[0].innerHTML : 436 null) : 437 this.empty().append( value ); 438 }, 439 440 replaceWith: function( value ) { 441 return this.after( value ).remove(); 442 }, 443 444 eq: function( i ) { 445 return this.slice( i, i + 1 ); 446 }, 447
448 slice: function() { 449 return this.pushStack( Array.prototype.slice.apply( this, arguments ) ); 450 }, 451 452 map: function( callback ) { 453 return this.pushStack( jQuery.map(this, function(elem, i){ 454 return callback.call( elem, i, elem ); 455 })); 456 }, 457 458 andSelf: function() { 459 return this.add( this.prevObject ); 460 }, 461 462 data: function( key, value ){ 463 var parts = key.split("."); 464 parts[1] = parts[1] ? "." + parts[1] : ""; 465 466 if ( value === undefined ) { 467 var data = this.triggerHandler("getData" + parts[1] + "!", [parts[0]]); 468 469 if ( data === undefined && this.length ) 470 data = jQuery.data( this[0], key ); 471 472 return data === undefined && parts[1] ? 473 this.data( parts[0] ) : 474 data; 475 } else 476 return this.trigger("setData" + parts[1] + "!", [parts[0], value]).each(function(){ 477 jQuery.data( this, key, value ); 478 }); 479 }, 480 481 removeData: function( key ){ 482 return this.each(function(){ 483 jQuery.removeData( this, key ); 484 }); 485 }, 486 487 domManip: function( args, table, reverse, callback ) { 488 var clone = this.length > 1, elems; 489 490 return this.each(function(){ 491 if ( !elems ) { 492 elems = jQuery.clean( args, this.ownerDocument ); 493 494 if ( reverse ) 495 elems.reverse(); 496 } 497 498 var obj = this; 499 500 if ( table && jQuery.nodeName( this, "table" ) && jQuery.nodeName( elems[0], "tr" ) ) 501 obj = this.getElementsByTagName("tbody")[0] || this.appendChild( this.ownerDocument.createElement("tbody") ); 502 503 var scripts = jQuery( [] ); 504 505 jQuery.each(elems, function(){ 506 var elem = clone ? 507 jQuery( this ).clone( true )[0] : 508 this; 509 510 // execute all scripts after the elements have been injected 511 if ( jQuery.nodeName( elem, "script" ) ) 512 scripts = scripts.add( elem ); 513 else { 514 // Remove any inner scripts for later evaluation 515 if ( elem.nodeType == 1 ) 516 scripts = scripts.add( jQuery( "script", elem ).remove() ); 517 518 // Inject the elements into the document 519 callback.call( obj, elem ); 520 } 521 }); 522 523 scripts.each( evalScript ); 524 }); 525 } 526}; 527 528// Give the init function the jQuery prototype for later instantiation 529jQuery.fn.init.prototype = jQuery.fn; 530 531function evalScript( i, elem ) { 532 if ( elem.src ) 533 jQuery.ajax({ 534 url: elem.src, 535 async: false, 536 dataType: "script" 537 }); 538 539 else 540 jQuery.globalEval( elem.text || elem.textContent || elem.innerHTML || "" ); 541 542 if ( elem.parentNode ) 543 elem.parentNode.removeChild( elem ); 544} 545 546function now(){ 547 return +new Date; 548} 549 550jQuery.extend = jQuery.fn.extend = function() { 551 // copy reference to target object 552 var target = arguments[0] || {}, i = 1, length = arguments.length, deep = false, options; 553 554 // Handle a deep copy situation 555 if ( target.constructor == Boolean ) { 556 deep = target; 557 target = arguments[1] || {}; 558 // skip the boolean and the target 559 i = 2; 560 } 561 562 // Handle case when target is a string or something (possible in deep copy) 563 if ( typeof target != "object" && typeof target != "function" ) 564 target = {}; 565 566 // extend jQuery itself if only one argument is passed 567 if ( length == i ) { 568 target = this; 569 --i; 570 } 571 572 for ( ; i < length; i++ ) 573 // Only deal with non-null/undefined values 574 if ( (options = arguments[ i ]) != null ) 575 // Extend the base object 576 for ( var name in options ) { 577 var src = target[ name ], copy = options[ name ]; 578 579 // Prevent never-ending loop 580 if ( target === copy ) 581 continue; 582 583 // Recurse if we're merging object values 584 if ( deep && copy && typeof copy == "object" && !copy.nodeType ) 585 target[ name ] = jQuery.extend( deep, 586 // Never move original objects, clone them 587 src || ( copy.length != null ? [ ] : { } ) 588 , copy ); 589 590 // Don't bring in undefined values 591 else if ( copy !== undefined ) 592 target[ name ] = copy; 593 594 } 595 596 // Return the modified object 597 return target; 598}; 599 600var expando = "jQuery" + now(), uuid = 0, windowData = {}, 601 // exclude the following css properties to add px 602 exclude = /z-?index|font-?weight|opacity|zoom|line-?height/i, 603 // cache defaultView 604 defaultView = document.defaultView || {}; 605 606jQuery.extend({ 607 noConflict: function( deep ) { 608 window.$ = _$; 609 610 if ( deep ) 611 window.jQuery = _jQuery; 612 613 return jQuery; 614 }, 615 616 // See test/unit/core.js for details concerning this function. 617 isFunction: function( fn ) { 618 return !!fn && typeof fn != "string" && !fn.nodeName && 619 fn.constructor != Array && /^[\s[]?function/.test( fn + "" ); 620 }, 621 622 // check if an element is in a (or is an) XML document 623 isXMLDoc: function( elem ) { 624 return elem.documentElement && !elem.body || 625 elem.tagName && elem.ownerDocument && !elem.ownerDocument.body; 626 }, 627 628 // Evalulates a script in a global context 629 globalEval: function( data ) { 630 data = jQuery.trim( data ); 631 632 if ( data ) { 633 // Inspired by code by Andrea Giammarchi 634 // http://webreflection.blogspot.com/2007/08/global-scope-evaluation-and-dom.html 635 var head = document.getElementsByTagName("head")[0] || document.documentElement, 636 script = document.createElement("script"); 637 638 script.type = "text/javascript"; 639 if ( jQuery.browser.msie ) 640 script.text = data; 641 else 642 script.appendChild( document.createTextNode( data ) ); 643 644 // Use insertBefore instead of appendChild to circumvent an IE6 bug. 645 // This arises when a base node is used (#2709). 646 head.insertBefore( script, head.firstChild ); 647 head.removeChild( script ); 648 } 649 }, 650 651 nodeName: function( elem, name ) { 652 return elem.nodeName && elem.nodeName.toUpperCase() == name.toUpperCase(); 653 }, 654 655 cache: {}, 656 657 data: function( elem, name, data ) { 658 elem = elem == window ? 659 windowData : 660 elem; 661 662 var id = elem[ expando ]; 663 664 // Compute a unique ID for the element 665 if ( !id ) 666 id = elem[ expando ] = ++uuid; 667 668 // Only generate the data cache if we're 669 // trying to access or manipulate it 670 if ( name && !jQuery.cache[ id ] ) 671 jQuery.cache[ id ] = {}; 672 673 // Prevent overriding the named cache with undefined values 674 if ( data !== undefined ) 675 jQuery.cache[ id ][ name ] = data; 676 677 // Return the named cache data, or the ID for the element 678 return name ? 679 jQuery.cache[ id ][ name ] : 680 id; 681 }, 682 683 removeData: function( elem, name ) { 684 elem = elem == window ? 685 windowData : 686 elem; 687 688 var id = elem[ expando ]; 689 690 // If we want to remove a specific section of the element's data 691 if ( name ) { 692 if ( jQuery.cache[ id ] ) { 693 // Remove the section of cache data 694 delete jQuery.cache[ id ][ name ]; 695 696 // If we've removed all the data, remove the element's cache 697 name = ""; 698 699 for ( name in jQuery.cache[ id ] ) 700 break; 701 702 if ( !name ) 703 jQuery.removeData( elem ); 704 } 705 706 // Otherwise, we want to remove all of the element's data 707 } else { 708 // Clean up the element expando 709 try { 710 delete elem[ expando ]; 711 } catch(e){ 712 // IE has trouble directly removing the expando 713 // but it's ok with using removeAttribute 714 if ( elem.removeAttribute ) 715 elem.removeAttribute( expando ); 716 } 717 718 // Completely remove the data cache 719 delete jQuery.cache[ id ]; 720 } 721 }, 722 723 // args is for internal usage only 724 each: function( object, callback, args ) { 725 var name, i = 0, length = object.length; 726 727 if ( args ) { 728 if ( length == undefined ) { 729 for ( name in object ) 730 if ( callback.apply( object[ name ], args ) === false ) 731 break; 732 } else 733 for ( ; i < length; ) 734 if ( callback.apply( object[ i++ ], args ) === false ) 735 break; 736 737 // A special, fast, case for the most common use of each 738 } else { 739 if ( length == undefined ) { 740 for ( name in object ) 741 if ( callback.call( object[ name ], name, object[ name ] ) === false ) 742 break; 743 } else 744 for ( var value = object[0]; 745 i < length && callback.call( value, i, value ) !== false; value = object[++i] ){} 746 } 747 748 return object; 749 }, 750 751 prop: function( elem, value, type, i, name ) { 752 // Handle executable functions 753 if ( jQuery.isFunction( value ) ) 754 value = value.call( elem, i ); 755 756 // Handle passing in a number to a CSS property 757 return value && value.constructor == Number && type == "curCSS" && !exclude.test( name ) ? 758 value + "px" : 759 value; 760 }, 761 762 className: { 763 // internal only, use addClass("class") 764 add: function( elem, classNames ) { 765 jQuery.each((classNames || "").split(/\s+/), function(i, className){ 766 if ( elem.nodeType == 1 && !jQuery.className.has( elem.className, className ) ) 767 elem.className += (elem.className ? " " : "") + className; 768 }); 769 }, 770 771 // internal only, use removeClass("class") 772 remove: function( elem, classNames ) { 773 if (elem.nodeType == 1) 774 elem.className = classNames != undefined ? 775 jQuery.grep(elem.className.split(/\s+/), function(className){ 776 return !jQuery.className.has( classNames, className ); 777 }).join(" ") : 778 ""; 779 }, 780 781 // internal only, use hasClass("class") 782 has: function( elem, className ) { 783 return jQuery.inArray( className, (elem.className || elem).toString().split(/\s+/) ) > -1; 784 } 785 }, 786 787 // A method for quickly swapping in/out CSS properties to get correct calculations 788 swap: function( elem, options, callback ) { 789 var old = {}; 790 // Remember the old values, and insert the new ones 791 for ( var name in options ) { 792 old[ name ] = elem.style[ name ]; 793 elem.style[ name ] = options[ name ]; 794 } 795 796 callback.call( elem ); 797 798 // Revert the old values 799 for ( var name in options ) 800 elem.style[ name ] = old[ name ]; 801 }, 802 803 css: function( elem, name, force ) { 804 if ( name == "width" || name == "height" ) { 805 var val, props = { position: "absolute", visibility: "hidden", display:"block" }, which = name == "width" ? [ "Left", "Right" ] : [ "Top", "Bottom" ]; 806 807 function getWH() { 808 val = name == "width" ? elem.offsetWidth : elem.offsetHeight; 809 var padding = 0, border = 0; 810 jQuery.each( which, function() { 811 padding += parseFloat(jQuery.curCSS( elem, "padding" + this, true)) || 0; 812 border += parseFloat(jQuery.curCSS( elem, "border" + this + "Width", true)) || 0; 813 }); 814 val -= Math.round(padding + border); 815 } 816 817 if ( jQuery(elem).is(":visible") ) 818 getWH(); 819 else 820 jQuery.swap( elem, props, getWH ); 821 822 return Math.max(0, val); 823 } 824 825 return jQuery.curCSS( elem, name, force ); 826 }, 827 828 curCSS: function( elem, name, force ) { 829 var ret, style = elem.style; 830 831 // A helper method for determining if an element's values are broken 832 function color( elem ) { 833 if ( !jQuery.browser.safari ) 834 return false; 835 836 // defaultView is cached 837 var ret = defaultView.getComputedStyle( elem, null ); 838 return !ret || ret.getPropertyValue("color") == ""; 839 } 840 841 // We need to handle opacity special in IE 842 if ( name == "opacity" && jQuery.browser.msie ) { 843 ret = jQuery.attr( style, "opacity" ); 844 845 return ret == "" ? 846 "1" : 847 ret; 848 } 849 // Opera sometimes will give the wrong display answer, this fixes it, see #2037 850 if ( jQuery.browser.opera && name == "display" ) { 851 var save = style.outline;
852 style.outline = "0 solid black"; 853 style.outline = save; 854 } 855 856 // Make sure we're using the right name for getting the float value 857 if ( name.match( /float/i ) ) 858 name = styleFloat; 859 860 if ( !force && style && style[ name ] ) 861 ret = style[ name ]; 862 863 else if ( defaultView.getComputedStyle ) { 864 865 // Only "float" is needed here 866 if ( name.match( /float/i ) ) 867 name = "float"; 868 869 name = name.replace( /([A-Z])/g, "-$1" ).toLowerCase(); 870 871 var computedStyle = defaultView.getComputedStyle( elem, null ); 872 873 if ( computedStyle && !color( elem ) ) 874 ret = computedStyle.getPropertyValue( name ); 875 876 // If the element isn't reporting its values properly in Safari 877 // then some display: none elements are involved 878 else { 879 var swap = [], stack = [], a = elem, i = 0; 880 881 // Locate all of the parent display: none elements 882 for ( ; a && color(a); a = a.parentNode ) 883 stack.unshift(a); 884 885 // Go through and make them visible, but in reverse 886 // (It would be better if we knew the exact display type that they had) 887 for ( ; i < stack.length; i++ ) 888 if ( color( stack[ i ] ) ) { 889 swap[ i ] = stack[ i ].style.display; 890 stack[ i ].style.display = "block"; 891 } 892 893 // Since we flip the display style, we have to handle that 894 // one special, otherwise get the value 895 ret = name == "display" && swap[ stack.length - 1 ] != null ? 896 "none" : 897 ( computedStyle && computedStyle.getPropertyValue( name ) ) || ""; 898 899 // Finally, revert the display styles back 900 for ( i = 0; i < swap.length; i++ ) 901 if ( swap[ i ] != null ) 902 stack[ i ].style.display = swap[ i ]; 903 } 904 905 // We should always get a number back from opacity
906 if ( name == "opacity" && ret == "" ) 907 ret = "1"; 908 909 } else if ( elem.currentStyle ) { 910 var camelCase = name.replace(/\-(\w)/g, function(all, letter){ 911 return letter.toUpperCase(); 912 }); 913 914 ret = elem.currentStyle[ name ] || elem.currentStyle[ camelCase ]; 915 916 // From the awesome hack by Dean Edwards 917 // http://erik.eae.net/archives/2007/07/27/18.54.15/#comment-102291 918 919 // If we're not dealing with a regular pixel number 920 // but a number that has a weird ending, we need to convert it to pixels 921 if ( !/^\d+(px)?$/i.test( ret ) && /^\d/.test( ret ) ) { 922 // Remember the original values 923 var left = style.left, rsLeft = elem.runtimeStyle.left; 924 925 // Put in the new values to get a computed value out 926 elem.runtimeStyle.left = elem.currentStyle.left; 927 style.left = ret || 0; 928 ret = style.pixelLeft + "px"; 929 930 // Revert the changed values 931 style.left = left; 932 elem.runtimeStyle.left = rsLeft; 933 } 934 } 935 936 return ret; 937 }, 938 939 clean: function( elems, context ) { 940 var ret = []; 941 context = context || document; 942 // !context.createElement fails in IE with an error but returns typeof 'object' 943 if (typeof context.createElement == 'undefined') 944 context = context.ownerDocument || context[0] && context[0].ownerDocument || document; 945 946 jQuery.each(elems, function(i, elem){ 947 if ( !elem ) 948 return; 949 950 if ( elem.constructor == Number ) 951 elem += ''; 952 953 // Convert html string into DOM nodes 954 if ( typeof elem == "string" ) { 955 // Fix "XHTML"-style tags in all browsers 956 elem = elem.replace(/(<(\w+)[^>]*?)\/>/g, function(all, front, tag){ 957 return tag.match(/^(abbr|br|col|img|input|link|meta|param|hr|area|embed)$/i) ? 958 all : 959 front + "></" + tag + ">"; 960 }); 961 962 // Trim whitespace, otherwise indexOf won't work as expected 963 var tags = jQuery.trim( elem ).toLowerCase(), div = context.createElement("div"); 964 965 var wrap = 966 // option or optgroup 967 !tags.indexOf("<opt") && 968 [ 1, "<select multiple='multiple'>", "</select>" ] || 969 970 !tags.indexOf("<leg") && 971 [ 1, "<fieldset>", "</fieldset>" ] || 972 973 tags.match(/^<(thead|tbody|tfoot|colg|cap)/) && 974 [ 1, "<table>", "</table>" ] || 975 976 !tags.indexOf("<tr") && 977 [ 2, "<table><tbody>", "</tbody></table>" ] || 978 979 // <thead> matched above 980 (!tags.indexOf("<td") || !tags.indexOf("<th")) && 981 [ 3, "<table><tbody><tr>", "</tr></tbody></table>" ] || 982 983 !tags.indexOf("<col") && 984 [ 2, "<table><tbody></tbody><colgroup>", "</colgroup></table>" ] || 985 986 // IE can't serialize <link> and <script> tags normally 987 jQuery.browser.msie && 988 [ 1, "div<div>", "</div>" ] || 989 990 [ 0, "", "" ]; 991 992 // Go to html and back, then peel off extra wrappers 993 div.innerHTML = wrap[1] + elem + wrap[2]; 994 995 // Move to the right depth 996 while ( wrap[0]-- ) 997 div = div.lastChild; 998 999 // Remove IE's autoinserted <tbody> from table fragments 1000 if ( jQuery.browser.msie ) { 1001 1002 // String was a <table>, *may* have spurious <tbody> 1003 var tbody = !tags.indexOf("<table") && tags.indexOf("<tbody") < 0 ? 1004 div.firstChild && div.firstChild.childNodes : 1005 1006 // String was a bare <thead> or <tfoot> 1007 wrap[1] == "<table>" && tags.indexOf("<tbody") < 0 ? 1008 div.childNodes : 1009 []; 1010 1011 for ( var j = tbody.length - 1; j >= 0 ; --j ) 1012 1013 if ( jQuery.nodeName( tbody[ j ], "tbody" ) && !tbody[ j ].childNodes.length ) 1014 tbody[ j ].parentNode.removeChild( tbody[ j ] ); 1015 1016 // IE completely kills leading whitespace when innerHTML is used 1017 if ( /^\s/.test( elem ) ) 1018 div.insertBefore( context.createTextNode( elem.match(/^\s*/)[0] ), div.firstChild ); 1019 1020 } 1021 1022 elem = jQuery.makeArray( div.childNodes ); 1023 } 1024 1025 if ( elem.length === 0 && (!jQuery.nodeName( elem, "form" ) && !jQuery.nodeName( elem, "select" )) ) 1026 return; 1027 1028 if ( elem[0] == undefined || jQuery.nodeName( elem, "form" ) || elem.options ) 1029 ret.push( elem ); 1030 1031 else 1032 ret = jQuery.merge( ret, elem ); 1033 1034 }); 1035 1036 return ret; 1037 }, 1038 1039 attr: function( elem, name, value ) { 1040 // don't set attributes on text and comment nodes 1041 if (!elem || elem.nodeType == 3 || elem.nodeType == 8) 1042 return undefined; 1043 1044 var notxml = !jQuery.isXMLDoc( elem ), 1045 // Whether we are setting (or getting) 1046 set = value !== undefined, 1047 msie = jQuery.browser.msie; 1048
1049 // Try to normalize/fix the name 1050 name = notxml && jQuery.props[ name ] || name; 1051 1052 // Only do all the following if this is a node (faster for style) 1053 // IE elem.getAttribute passes even for style 1054 if ( elem.tagName ) { 1055 1056 // These attributes require special treatment 1057 var special = /href|src|style/.test( name ); 1058 1059 // Safari mis-reports the default selected property of a hidden option 1060 // Accessing the parent's selectedIndex property fixes it 1061 if ( name == "selected" && jQuery.browser.safari ) 1062 elem.parentNode.selectedIndex; 1063 1064 // If applicable, access the attribute via the DOM 0 way 1065 if ( name in elem && notxml && !special ) { 1066 if ( set ){ 1067 // We can't allow the type property to be changed (since it causes problems in IE) 1068 if ( name == "type" && jQuery.nodeName( elem, "input" ) && elem.parentNode ) 1069 throw "type property can't be changed"; 1070 1071 elem[ name ] = value; 1072 } 1073 1074 // browsers index elements by id/name on forms, give priority to attributes. 1075 if( jQuery.nodeName( elem, "form" ) && elem.getAttributeNode(name) ) 1076 return elem.getAttributeNode( name ).nodeValue; 1077 1078 return elem[ name ]; 1079 } 1080 1081 if ( msie && notxml && name == "style" ) 1082 return jQuery.attr( elem.style, "cssText", value ); 1083 1084 if ( set ) 1085 // convert the value to a string (all browsers do this but IE) see #1070 1086 elem.setAttribute( name, "" + value ); 1087 1088 var attr = msie && notxml && special 1089 // Some attributes require a special call on IE 1090 ? elem.getAttribute( name, 2 ) 1091 : elem.getAttribute( name ); 1092 1093 // Non-existent attributes return null, we normalize to undefined 1094 return attr === null ? undefined : attr; 1095 } 1096 1097 // elem is actually elem.style ... set the style 1098 1099 // IE uses filters for opacity 1100 if ( msie && name == "opacity" ) { 1101 if ( set ) { 1102 // IE has trouble with opacity if it does not have layout 1103 // Force it by setting the zoom level 1104 elem.zoom = 1; 1105 1106 // Set the alpha filter to set the opacity 1107 elem.filter = (elem.filter || "").replace( /alpha\([^)]*\)/, "" ) + 1108 (parseInt( value ) + '' == "NaN" ? "" : "alpha(opacity=" + value * 100 + ")"); 1109 } 1110 1111 return elem.filter && elem.filter.indexOf("opacity=") >= 0 ? 1112 (parseFloat( elem.filter.match(/opacity=([^)]*)/)[1] ) / 100) + '': 1113 ""; 1114 } 1115 1116 name = name.replace(/-([a-z])/ig, function(all, letter){ 1117 return letter.toUpperCase(); 1118 }); 1119 1120 if ( set ) 1121 elem[ name ] = value; 1122 1123 return elem[ name ]; 1124 }, 1125 1126 trim: function( text ) { 1127 return (text || "").replace( /^\s+|\s+$/g, "" ); 1128 }, 1129 1130 makeArray: function( array ) { 1131 var ret = []; 1132 1133 if( array != null ){ 1134 var i = array.length; 1135 //the window, strings and functions also have 'length' 1136 if( i == null || array.split || array.setInterval || array.call ) 1137 ret[0] = array; 1138 else 1139 while( i ) 1140 ret[--i] = array[i]; 1141 } 1142 1143 return ret; 1144 }, 1145 1146 inArray: function( elem, array ) { 1147 for ( var i = 0, length = array.length; i < length; i++ ) 1148 // Use === because on IE, window == document 1149 if ( array[ i ] === elem ) 1150 return i; 1151 1152 return -1; 1153 }, 1154 1155 merge: function( first, second ) { 1156 // We have to loop this way because IE & Opera overwrite the length 1157 // expando of getElementsByTagName 1158 var i = 0, elem, pos = first.length; 1159 // Also, we need to make sure that the correct elements are being returned 1160 // (IE returns comment nodes in a '*' query) 1161 if ( jQuery.browser.msie ) { 1162 while ( elem = second[ i++ ] ) 1163 if ( elem.nodeType != 8 ) 1164 first[ pos++ ] = elem; 1165 1166 } else 1167 while ( elem = second[ i++ ] ) 1168 first[ pos++ ] = elem; 1169 1170 return first; 1171 }, 1172 1173 unique: function( array ) { 1174 var ret = [], done = {}; 1175 1176 try { 1177 1178 for ( var i = 0, length = array.length; i < length; i++ ) { 1179 var id = jQuery.data( array[ i ] ); 1180 1181 if ( !done[ id ] ) { 1182 done[ id ] = true; 1183 ret.push( array[ i ] ); 1184 } 1185 } 1186 1187 } catch( e ) { 1188 ret = array; 1189 } 1190 1191 return ret; 1192 }, 1193 1194 grep: function( elems, callback, inv ) { 1195 var ret = []; 1196 1197 // Go through the array, only saving the items 1198 // that pass the validator function 1199 for ( var i = 0, length = elems.length; i < length; i++ ) 1200 if ( !inv != !callback( elems[ i ], i ) )
1201 ret.push( elems[ i ] ); 1202 1203 return ret; 1204 }, 1205 1206 map: function( elems, callback ) { 1207 var ret = []; 1208 1209 // Go through the array, translating each of the items to their 1210 // new value (or values). 1211 for ( var i = 0, length = elems.length; i < length; i++ ) { 1212 var value = callback( elems[ i ], i ); 1213 1214 if ( value != null ) 1215 ret[ ret.length ] = value; 1216 } 1217 1218 return ret.concat.apply( [], ret ); 1219 } 1220}); 1221 1222var userAgent = navigator.userAgent.toLowerCase(); 1223 1224// Figure out what browser is being used 1225jQuery.browser = { 1226 version: (userAgent.match( /.+(?:rv|it|ra|ie)[\/: ]([\d.]+)/ ) || [])[1], 1227 safari: /webkit/.test( userAgent ), 1228 opera: /opera/.test( userAgent ), 1229 msie: /msie/.test( userAgent ) && !/opera/.test( userAgent ), 1230 mozilla: /mozilla/.test( userAgent ) && !/(compatible|webkit)/.test( userAgent ) 1231}; 1232 1233var styleFloat = jQuery.browser.msie ? 1234 "styleFloat" : 1235 "cssFloat"; 1236 1237jQuery.extend({ 1238 // Check to see if the W3C box model is being used 1239 boxModel: !jQuery.browser.msie || document.compatMode == "CSS1Compat", 1240 1241 props: { 1242 "for": "htmlFor", 1243 "class": "className", 1244 "float": styleFloat, 1245 cssFloat: styleFloat, 1246 styleFloat: styleFloat, 1247 readonly: "readOnly", 1248 maxlength: "maxLength", 1249 cellspacing: "cellSpacing" 1250 } 1251}); 1252 1253jQuery.each({ 1254 parent: function(elem){return elem.parentNode;}, 1255 parents: function(elem){return jQuery.dir(elem,"parentNode");}, 1256 next: function(elem){return jQuery.nth(elem,2,"nextSibling");}, 1257 prev: function(elem){return jQuery.nth(elem,2,"previousSibling");}, 1258 nextAll: function(elem){return jQuery.dir(elem,"nextSibling");}, 1259 prevAll: function(elem){return jQuery.dir(elem,"previousSibling");}, 1260 siblings: function(elem){return jQuery.sibling(elem.parentNode.firstChild,elem);}, 1261 children: function(elem){return jQuery.sibling(elem.firstChild);}, 1262 contents: function(elem){return jQuery.nodeName(elem,"iframe")?elem.contentDocument||elem.contentWindow.document:jQuery.makeArray(elem.childNodes);} 1263}, function(name, fn){ 1264 jQuery.fn[ name ] = function( selector ) { 1265 var ret = jQuery.map( this, fn ); 1266 1267 if ( selector && typeof selector == "string" ) 1268 ret = jQuery.multiFilter( selector, ret ); 1269 1270 return this.pushStack( jQuery.unique( ret ) ); 1271 }; 1272}); 1273 1274jQuery.each({ 1275 appendTo: "append", 1276 prependTo: "prepend", 1277 insertBefore: "before", 1278 insertAfter: "after", 1279 replaceAll: "replaceWith" 1280}, function(name, original){ 1281 jQuery.fn[ name ] = function() { 1282 var args = arguments; 1283 1284 return this.each(function(){ 1285 for ( var i = 0, length = args.length; i < length; i++ ) 1286 jQuery( args[ i ] )[ original ]( this ); 1287 }); 1288 }; 1289}); 1290 1291jQuery.each({ 1292 removeAttr: function( name ) { 1293 jQuery.attr( this, name, "" ); 1294 if (this.nodeType == 1) 1295 this.removeAttribute( name ); 1296 }, 1297 1298 addClass: function( classNames ) { 1299 jQuery.className.add( this, classNames ); 1300 }, 1301 1302 removeClass: function( classNames ) { 1303 jQuery.className.remove( this, classNames ); 1304 }, 1305 1306 toggleClass: function( classNames ) { 1307 jQuery.className[ jQuery.className.has( this, classNames ) ? "remove" : "add" ]( this, classNames ); 1308 }, 1309 1310 remove: function( selector ) { 1311 if ( !selector || jQuery.filter( selector, [ this ] ).r.length ) { 1312 // Prevent memory leaks 1313 jQuery( "*", this ).add(this).each(function(){ 1314 jQuery.event.remove(this); 1315 jQuery.removeData(this); 1316 }); 1317 if (this.parentNode) 1318 this.parentNode.removeChild( this ); 1319 } 1320 }, 1321 1322 empty: function() { 1323 // Remove element nodes and prevent memory leaks 1324 jQuery( ">*", this ).remove(); 1325 1326 // Remove any remaining nodes 1327 while ( this.firstChild ) 1328 this.removeChild( this.firstChild ); 1329 } 1330}, function(name, fn){ 1331 jQuery.fn[ name ] = function(){ 1332 return this.each( fn, arguments ); 1333 }; 1334}); 1335 1336jQuery.each([ "Height", "Width" ], function(i, name){ 1337 var type = name.toLowerCase(); 1338 1339 jQuery.fn[ type ] = function( size ) { 1340 // Get window width or height 1341 return this[0] == window ? 1342 // Opera reports document.body.client[Width/Height] properly in both quirks and standards 1343 jQuery.browser.opera && document.body[ "client" + name ] || 1344 1345 // Safari reports inner[Width/Height] just fine (Mozilla and Opera include scroll bar widths)
1346 jQuery.browser.safari && window[ "inner" + name ] || 1347 1348 // Everyone else use document.documentElement or document.body depending on Quirks vs Standards mode 1349 document.compatMode == "CSS1Compat" && document.documentElement[ "client" + name ] || document.body[ "client" + name ] : 1350 1351 // Get document width or height 1352 this[0] == document ? 1353 // Either scroll[Width/Height] or offset[Width/Height], whichever is greater 1354 Math.max( 1355 Math.max(document.body["scroll" + name], document.documentElement["scroll" + name]), 1356 Math.max(document.body["offset" + name], document.documentElement["offset" + name]) 1357 ) : 1358 1359 // Get or set width or height on the element 1360 size == undefined ? 1361 // Get width or height on the element 1362 (this.length ? jQuery.css( this[0], type ) : null) : 1363 1364 // Set the width or height on the element (default to pixels if value is unitless) 1365 this.css( type, size.constructor == String ? size : size + "px" ); 1366 }; 1367}); 1368 1369// Helper function used by the dimensions and offset modules 1370function num(elem, prop) { 1371 return elem[0] && parseInt( jQuery.curCSS(elem[0], prop, true), 10 ) || 0; 1372}
1372var chars = jQuery.browser.safari && parseInt(jQuery.browser.version) < 417 ? 1373 "(?:[\\w*_-]|\\\\.)" : 1374 "(?:[\\w\u0128-\uFFFF*_-]|\\\\.)", 1375 quickChild = new RegExp("^>\\s*(" + chars + "+)"), 1376 quickID = new RegExp("^(" + chars + "+)(#)(" + chars + "+)"), 1377 quickClass = new RegExp("^([#.]?)(" + chars + "*)"); 1378 1379jQuery.extend({ 1380 expr: { 1381 "": function(a,i,m){return m[2]=="*"||jQuery.nodeName(a,m[2]);}, 1382 "#": function(a,i,m){return a.getAttribute("id")==m[2];}, 1383 ":": { 1384 // Position Checks 1385 lt: function(a,i,m){return i<m[3]-0;}, 1386 gt: function(a,i,m){return i>m[3]-0;}, 1387 nth: function(a,i,m){return m[3]-0==i;}, 1388 eq: function(a,i,m){return m[3]-0==i;}, 1389 first: function(a,i){return i==0;}, 1390 last: function(a,i,m,r){return i==r.length-1;}, 1391 even: function(a,i){return i%2==0;}, 1392 odd: function(a,i){return i%2;}, 1393 1394 // Child Checks 1395 "first-child": function(a){return a.parentNode.getElementsByTagName("*")[0]==a;}, 1396 "last-child": function(a){return jQuery.nth(a.parentNode.lastChild,1,"previousSibling")==a;}, 1397 "only-child": function(a){return !jQuery.nth(a.parentNode.lastChild,2,"previousSibling");}, 1398 1399 // Parent Checks 1400 parent: function(a){return a.firstChild;}, 1401 empty: function(a){return !a.firstChild;}, 1402 1403 // Text Check 1404 contains: function(a,i,m){return (a.textContent||a.innerText||jQuery(a).text()||"").indexOf(m[3])>=0;}, 1405 1406 // Visibility 1407 visible: function(a){return "hidden"!=a.type&&jQuery.css(a,"display")!="none"&&jQuery.css(a,"visibility")!="hidden";}, 1408 hidden: function(a){return "hidden"==a.type||jQuery.css(a,"display")=="none"||jQuery.css(a,"visibility")=="hidden";}, 1409 1410 // Form attributes 1411 enabled: function(a){return !a.disabled;}, 1412 disabled: function(a){return a.disabled;}, 1413 checked: function(a){return a.checked;}, 1414 selected: function(a){return a.selected||jQuery.attr(a,"selected");}, 1415 1416 // Form elements 1417 text: function(a){return "text"==a.type;}, 1418 radio: function(a){return "radio"==a.type;}, 1419 checkbox: function(a){return "checkbox"==a.type;}, 1420 file: function(a){return "file"==a.type;}, 1421 password: function(a){return "password"==a.type;}, 1422 submit: function(a){return "submit"==a.type;}, 1423 image: function(a){return "image"==a.type;}, 1424 reset: function(a){return "reset"==a.type;}, 1425 button: function(a){return "button"==a.type||jQuery.nodeName(a,"button");}, 1426 input: function(a){return /input|select|textarea|button/i.test(a.nodeName);}, 1427 1428 // :has() 1429 has: function(a,i,m){return jQuery.find(m[3],a).length;}, 1430 1431 // :header 1432 header: function(a){return /h\d/i.test(a.nodeName);}, 1433 1434 // :animated 1435 animated: function(a){return jQuery.grep(jQuery.timers,function(fn){return a==fn.elem;}).length;} 1436 } 1437 }, 1438 1439 // The regular expressions that power the parsing engine 1440 parse: [ 1441 // Match: [@value='test'], [@foo] 1442 /^(\[) *@?([\w-]+) *([!*$^~=]*) *('?"?)(.*?)\4 *\]/, 1443 1444 // Match: :contains('foo') 1445 /^(:)([\w-]+)\("?'?(.*?(\(.*?\))?[^(]*?)"?'?\)/, 1446 1447 // Match: :even, :last-child, #id, .class 1448 new RegExp("^([:.#]*)(" + chars + "+)") 1449 ], 1450 1451 multiFilter: function( expr, elems, not ) { 1452 var old, cur = []; 1453 1454 while ( expr && expr != old ) { 1455 old = expr; 1456 var f = jQuery.filter( expr, elems, not ); 1457 expr = f.t.replace(/^\s*,\s*/, "" ); 1458 cur = not ? elems = f.r : jQuery.merge( cur, f.r ); 1459 } 1460 1461 return cur; 1462 }, 1463 1464 find: function( t, context ) { 1465 // Quickly handle non-string expressions 1466 if ( typeof t != "string" ) 1467 return [ t ]; 1468 1469 // check to make sure context is a DOM element or a document 1470 if ( context && context.nodeType != 1 && context.nodeType != 9) 1471 return [ ]; 1472 1473 // Set the correct context (if none is provided) 1474 context = context || document; 1475 1476 // Initialize the search 1477 var ret = [context], done = [], last, nodeName; 1478 1479 // Continue while a selector expression exists, and while 1480 // we're no longer looping upon ourselves 1481 while ( t && last != t ) { 1482 var r = []; 1483 last = t; 1484 1485 t = jQuery.trim(t); 1486 1487 var foundToken = false, 1488 1489 // An attempt at speeding up child selectors that 1490 // point to a specific element tag 1491 re = quickChild, 1492 1493 m = re.exec(t); 1494 1495 if ( m ) { 1496 nodeName = m[1].toUpperCase(); 1497 1498 // Perform our own iteration and filter 1499 for ( var i = 0; ret[i]; i++ ) 1500 for ( var c = ret[i].firstChild; c;
1500 c = c.nextSibling ) 1501 if ( c.nodeType == 1 && (nodeName == "*" || c.nodeName.toUpperCase() == nodeName) ) 1502 r.push( c ); 1503 1504 ret = r; 1505 t = t.replace( re, "" ); 1506 if ( t.indexOf(" ") == 0 ) continue; 1507 foundToken = true; 1508 } else { 1509 re = /^([>+~])\s*(\w*)/i; 1510 1511 if ( (m = re.exec(t)) != null ) { 1512 r = []; 1513 1514 var merge = {}; 1515 nodeName = m[2].toUpperCase(); 1516 m = m[1]; 1517 1518 for ( var j = 0, rl = ret.length; j < rl; j++ ) { 1519 var n = m == "~" || m == "+" ? ret[j].nextSibling : ret[j].firstChild; 1520 for ( ; n; n = n.nextSibling ) 1521 if ( n.nodeType == 1 ) { 1522 var id = jQuery.data(n); 1523 1524 if ( m == "~" && merge[id] ) break; 1525 1526 if (!nodeName || n.nodeName.toUpperCase() == nodeName ) { 1527 if ( m == "~" ) merge[id] = true; 1528 r.push( n ); 1529 } 1530 1531 if ( m == "+" ) break; 1532 } 1533 } 1534 1535 ret = r; 1536 1537 // And remove the token 1538 t = jQuery.trim( t.replace( re, "" ) ); 1539 foundToken = true; 1540 } 1541 } 1542 1543 // See if there's still an expression, and that we haven't already 1544 // matched a token 1545 if ( t && !foundToken ) { 1546 // Handle multiple expressions 1547 if ( !t.indexOf(",") ) { 1548 // Clean the result set 1549 if ( context == ret[0] ) ret.shift(); 1550 1551 // Merge the result sets 1552 done = jQuery.merge( done, ret ); 1553 1554 // Reset the context 1555 r = ret = [context]; 1556 1557 // Touch up the selector string 1558 t = " " + t.substr(1,t.length); 1559 1560 } else { 1561 // Optimize for the case nodeName#idName 1562 var re2 = quickID; 1563 var m = re2.exec(t); 1564 1565 // Re-organize the results, so that they're consistent 1566 if ( m ) { 1567 m = [ 0, m[2], m[3], m[1] ]; 1568 1569 } else { 1570 // Otherwise, do a traditional filter check for 1571 // ID, class, and element selectors 1572 re2 = quickClass; 1573 m = re2.exec(t); 1574 } 1575 1576 m[2] = m[2].replace(/\\/g, ""); 1577 1578 var elem = ret[ret.length-1]; 1579 1580 // Try to do a global search by ID, where we can 1581 if ( m[1] == "#" && elem && elem.getElementById && !jQuery.isXMLDoc(elem) ) { 1582 // Optimization for HTML document case 1583 var oid = elem.getElementById(m[2]); 1584 1585 // Do a quick check for the existence of the actual ID attribute 1586 // to avoid selecting by the name attribute in IE 1587 // also check to insure id is a string to avoid selecting an element with the name of 'id' inside a form 1588 if ( (jQuery.browser.msie||jQuery.browser.opera) && oid && typeof oid.id == "string" && oid.id != m[2] ) 1589 oid = jQuery('[@id="'+m[2]+'"]', elem)[0]; 1590 1591 // Do a quick check for node name (where applicable) so 1592 // that div#foo searches will be really fast 1593 ret = r = oid && (!m[3] || jQuery.nodeName(oid, m[3])) ? [oid] : []; 1594 } else { 1595 // We need to find all descendant elements 1596 for ( var i = 0; ret[i]; i++ ) { 1597 // Grab the tag name being searched for 1598 var tag = m[1] == "#" && m[3] ? m[3] : m[1] != "" || m[0] == "" ? "*" : m[2]; 1599 1600 // Handle IE7 being really dumb about <object>s 1601 if ( tag == "*" && ret[i].nodeName.toLowerCase() == "object" ) 1602 tag = "param"; 1603 1604 r = jQuery.merge( r, ret[i].getElementsByTagName( tag )); 1605 } 1606 1607 // It's faster to filter by class and be done with it 1608 if ( m[1] == "." ) 1609 r = jQuery.classFilter( r, m[2] ); 1610 1611 // Same with ID filtering 1612 if ( m[1] == "#" ) { 1613 var tmp = []; 1614 1615 // Try to find the element with the ID 1616 for ( var i = 0; r[i]; i++ ) 1617 if ( r[i].getAttribute("id") == m[2] ) { 1618 tmp = [ r[i] ]; 1619 break; 1620 } 1621 1622 r = tmp; 1623 } 1624 1625 ret = r; 1626 } 1627 1628 t = t.replace( re2, "" ); 1629 } 1630 1631 } 1632 1633 // If a selector string still exists 1634 if ( t ) { 1635 // Attempt to filter it 1636 var val = jQuery.filter(t,r); 1637 ret = r = val.r; 1638 t = jQuery.trim(val.t); 1639 } 1640 } 1641 1642 // An error occurred with the selector; 1643 // just return an empty set instead 1644 if ( t ) 1645 ret = []; 1646 1647 // Remove the root context 1648 if ( ret && context == ret[0] ) 1649 ret.shift(); 1650 1651 // And combine the results 1652 done = jQuery.merge( done, ret ); 1653 1654 return done; 1655 }, 1656 1657 classFilter: function(r,m,not){ 1658 m = " " + m + " "; 1659 var tmp = []; 1660 for ( var i = 0; r[i]; i++ ) { 1661 var pass = (" " + r[i].className + " ").indexOf( m ) >= 0; 1662 if ( !not && pass || not && !pass ) 1663 tmp.push( r[i] ); 1664 } 1665 return tmp; 1666 }, 1667 1668 filter: function(t,r,not) { 1669 var last; 1670
1671 // Look for common filter expressions 1672 while ( t && t != last ) { 1673 last = t; 1674 1675 var p = jQuery.parse, m; 1676 1677 for ( var i = 0; p[i]; i++ ) { 1678 m = p[i].exec( t ); 1679 1680 if ( m ) { 1681 // Remove what we just matched 1682 t = t.substring( m[0].length ); 1683 1684 m[2] = m[2].replace(/\\/g, ""); 1685 break; 1686 } 1687 } 1688 1689 if ( !m ) 1690 break; 1691 1692 // :not() is a special case that can be optimized by 1693 // keeping it out of the expression list 1694 if ( m[1] == ":" && m[2] == "not" ) 1695 // optimize if only one selector found (most common case) 1696 r = isSimple.test( m[3] ) ? 1697 jQuery.filter(m[3], r, true).r : 1698 jQuery( r ).not( m[3] ); 1699 1700 // We can get a big speed boost by filtering by class here 1701 else if ( m[1] == "." ) 1702 r = jQuery.classFilter(r, m[2], not); 1703 1704 else if ( m[1] == "[" ) { 1705 var tmp = [], type = m[3]; 1706 1707 for ( var i = 0, rl = r.length; i < rl; i++ ) { 1708 var a = r[i], z = a[ jQuery.props[m[2]] || m[2] ]; 1709 1710 if ( z == null || /style|href|src|selected/.test(m[2]) ) 1711 z = jQuery.attr(a,m[2]) || ''; 1712 1713 if ( (type == "" && !!z || 1714 type == "=" && z == m[5] || 1715 type == "!=" && z != m[5] || 1716 type == "^=" && z && !z.indexOf(m[5]) || 1717 type == "$=" && z.substr(z.length - m[5].length) == m[5] || 1718 (type == "*=" || type == "~=") && z.indexOf(m[5]) >= 0) ^ not ) 1719 tmp.push( a ); 1720 } 1721 1722 r = tmp; 1723 1724 // We can get a speed boost by handling nth-child here 1725 } else if ( m[1] == ":" && m[2] == "nth-child" ) { 1726 var merge = {}, tmp = [], 1727 // parse equations like 'even', 'odd', '5', '2n', '3n+2', '4n-1', '-n+6' 1728 test = /(-?)(\d*)n((?:\+|-)?\d*)/.exec( 1729 m[3] == "even" && "2n" || m[3] == "odd" && "2n+1" || 1730 !/\D/.test(m[3]) && "0n+" + m[3] || m[3]), 1731 // calculate the numbers (first)n+(last) including if they are negative 1732 first = (test[1] + (test[2] || 1)) - 0, last = test[3] - 0; 1733 1734 // loop through all the elements left in the jQuery object 1735 for ( var i = 0, rl = r.length; i < rl; i++ ) { 1736 var node = r[i], parentNode = node.parentNode, id = jQuery.data(parentNode); 1737 1738 if ( !merge[id] ) { 1739 var c = 1; 1740 1741 for ( var n = parentNode.firstChild; n; n = n.nextSibling ) 1742 if ( n.nodeType == 1 ) 1743 n.nodeIndex = c++; 1744 1745 merge[id] = true; 1746 } 1747 1748 var add = false; 1749 1750 if ( first == 0 ) { 1751 if ( node.nodeIndex == last ) 1752 add = true; 1753 } else if ( (node.nodeIndex - last) % first == 0 && (node.nodeIndex - last) / first >= 0 ) 1754 add = true; 1755 1756 if ( add ^ not ) 1757 tmp.push( node ); 1758 } 1759 1760 r = tmp; 1761 1762 // Otherwise, find the expression to execute 1763 } else { 1764 var fn = jQuery.expr[ m[1] ]; 1765 if ( typeof fn == "object" ) 1766 fn = fn[ m[2] ]; 1767 1768 if ( typeof fn == "string" ) 1769 fn = eval("false||function(a,i){return " + fn + ";}"); 1770 1771 // Execute it against the current filter 1772 r = jQuery.grep( r, function(elem, i){ 1773 return fn(elem, i, m, r); 1774 }, not ); 1775 } 1776 } 1777 1778 // Return an array of filtered elements (r) 1779 // and the modified expression string (t) 1780 return { r: r, t: t }; 1781 }, 1782 1783 dir: function( elem, dir ){ 1784 var matched = [], 1785 cur = elem[dir]; 1786 while ( cur && cur != document ) { 1787 if ( cur.nodeType == 1 ) 1788 matched.push( cur ); 1789 cur = cur[dir]; 1790 } 1791 return matched; 1792 }, 1793 1794 nth: function(cur,result,dir,elem){ 1795 result = result || 1; 1796 var num = 0; 1797 1798 for ( ; cur; cur = cur[dir] ) 1799 if ( cur.nodeType == 1 && ++num == result ) 1800 break; 1801 1802 return cur; 1803 }, 1804 1805 sibling: function( n, elem ) { 1806 var r = []; 1807 1808 for ( ; n; n = n.nextSibling ) { 1809 if ( n.nodeType == 1 && n != elem ) 1810 r.push( n ); 1811 } 1812 1813 return r; 1814 } 1815}); 1816/* 1817 * A number of helper functions used for managing events. 1818 * Many of the ideas behind this code orignated from 1819 * Dean Edwards' addEvent library. 1820 */ 1821jQuery.event = { 1822 1823 // Bind an event to an element 1824 // Original by Dean Edwards 1825 add: function(elem, types, handler, data) { 1826 if ( elem.nodeType == 3 || elem.nodeType == 8 ) 1827 return; 1828 1829 // For whatever reason, IE has trouble passing the window object 1830 // around, causing it to be cloned in the process 1831 if ( jQuery.browser.msie && elem.setInterval ) 1832 elem = window; 1833 1834 // Make sure that the function being executed has a unique ID 1835 if ( !handler.guid ) 1836 handler.guid = this.guid++; 1837 1838 // if data is passed, bind to handler 1839 if( data != undefined ) { 1840 // Create temporary function pointer to original handler 1841 var fn = handler; 1842 1843 // Create unique handler function, wrapped around original handler 1844 handler = this.proxy( fn, function() { 1845 // Pass arguments and context to original handler 1846 return fn.apply(this, arguments); 1847 }); 1848 1849 // Store data in unique handler 1850 handler.data = data; 1851 } 1852 1853 // Init the element's event structure 1854 var events = jQuery.data(elem, "events") || jQuery.data(elem, "events", {}), 1855 handle = jQuery.data(elem, "handle") || jQuery.data(elem, "handle", function(){ 1856 // Handle the second event of a trigger and when 1857 // an event is called after a page has unloaded 1858 if ( typeof jQuery != "undefined" && !jQuery.event.triggered ) 1859 return jQuery.event.handle.apply(arguments.callee.elem, arguments); 1860 }); 1861 // Add elem as a property of the handle function 1862 // This is to prevent a memory leak with non-native 1863 // event in IE. 1864 handle.elem = elem; 1865 1866 // Handle multiple events separated by a space 1867 // jQuery(...).bind("mouseover mouseout", fn); 1868 jQuery.each(types.split(/\s+/), function(index, type) { 1869 // Namespaced event handlers 1870 var parts = type.split("."); 1871 type = parts[0]; 1872 handler.type = parts[1]; 1873
1874 // Get the current list of functions bound to this event 1875 var handlers = events[type]; 1876 1877 // Init the event handler queue 1878 if (!handlers) { 1879 handlers = events[type] = {}; 1880 1881 // Check for a special event handler 1882 // Only use addEventListener/attachEvent if the special 1883 // events handler returns false 1884 if ( !jQuery.event.special[type] || jQuery.event.special[type].setup.call(elem) === false ) { 1885 // Bind the global event handler to the element 1886 if (elem.addEventListener) 1887 elem.addEventListener(type, handle, false); 1888 else if (elem.attachEvent) 1889 elem.attachEvent("on" + type, handle); 1890 } 1891 } 1892 1893 // Add the function to the element's handler list 1894 handlers[handler.guid] = handler; 1895 1896 // Keep track of which events have been used, for global triggering 1897 jQuery.event.global[type] = true; 1898 }); 1899 1900 // Nullify elem to prevent memory leaks in IE 1901 elem = null; 1902 }, 1903 1904 guid: 1, 1905 global: {}, 1906 1907 // Detach an event or set of events from an element 1908 remove: function(elem, types, handler) { 1909 // don't do events on text and comment nodes 1910 if ( elem.nodeType == 3 || elem.nodeType == 8 ) 1911 return; 1912 1913 var events = jQuery.data(elem, "events"), ret, index; 1914 1915 if ( events ) { 1916 // Unbind all events for the element 1917 if ( types == undefined || (typeof types == "string" && types.charAt(0) == ".") ) 1918 for ( var type in events ) 1919 this.remove( elem, type + (types || "") ); 1920 else { 1921 // types is actually an event object here 1922 if ( types.type ) { 1923 handler = types.handler; 1924 types = types.type; 1925 } 1926 1927 // Handle multiple events seperated by a space 1928 // jQuery(...).unbind("mouseover mouseout", fn); 1929 jQuery.each(types.split(/\s+/), function(index, type){ 1930 // Namespaced event handlers 1931 var parts = type.split("."); 1932 type = parts[0]; 1933 1934 if ( events[type] ) { 1935 // remove the given handler for the given type 1936 if ( handler ) 1937 delete events[type][handler.guid]; 1938 1939 // remove all handlers for the given type 1940 else 1941 for ( handler in events[type] ) 1942 // Handle the removal of namespaced events 1943 if ( !parts[1] || events[type][handler].type == parts[1] ) 1944 delete events[type][handler]; 1945 1946 // remove generic event handler if no more handlers exist 1947 for ( ret in events[type] ) break; 1948 if ( !ret ) { 1949 if ( !jQuery.event.special[type] || jQuery.event.special[type].teardown.call(elem) === false ) { 1950 if (elem.removeEventListener) 1951 elem.removeEventListener(type, jQuery.data(elem, "handle"), false); 1952 else if (elem.detachEvent) 1953 elem.detachEvent("on" + type, jQuery.data(elem, "handle")); 1954 } 1955 ret = null; 1956 delete events[type]; 1957 } 1958 } 1959 }); 1960 } 1961 1962 // Remove the expando if it's no longer used 1963 for ( ret in events ) break; 1964 if ( !ret ) { 1965 var handle = jQuery.data( elem, "handle" ); 1966 if ( handle ) handle.elem = null; 1967 jQuery.removeData( elem, "events" ); 1968 jQuery.removeData( elem, "handle" ); 1969 } 1970 } 1971 }, 1972 1973 trigger: function(type, data, elem, donative, extra) { 1974 // Clone the incoming data, if any 1975 data = jQuery.makeArray(data); 1976 1977 if ( type.indexOf("!") >= 0 ) { 1978 type = type.slice(0, -1); 1979 var exclusive = true; 1980 } 1981 1982 // Handle a global trigger 1983 if ( !elem ) { 1984 // Only trigger if we've ever bound an event for it 1985 if ( this.global[type] ) 1986 jQuery("*").add([window, document]).trigger(type, data); 1987 1988 // Handle triggering a single element 1989 } else { 1990 // don't do events on text and comment nodes 1991 if ( elem.nodeType == 3 || elem.nodeType == 8 ) 1992 return undefined; 1993 1994 var val, ret, fn = jQuery.isFunction( elem[ type ] || null ), 1995 // Check to see if we need to provide a fake event, or not 1996 event = !data[0] || !data[0].preventDefault; 1997 1998 // Pass along a fake event 1999 if ( event ) { 2000 data.unshift({ 2001 type: type, 2002 target: elem, 2003 preventDefault: function(){}, 2004 stopPropagation: function(){}, 2005 timeStamp: now() 2006 }); 2007 data[0][expando] = true; // no need to fix fake event 2008 } 2009 2010 // Enforce the right trigger type 2011 data[0].type = type; 2012 if ( exclusive ) 2013 data[0].exclusive = true; 2014 2015 // Trigger the event, it is assumed that "handle" is a function 2016 var handle = jQuery.data(elem, "handle"); 2017 if ( handle ) 2018 val = handle.apply( elem, data ); 2019 2020 // Handle triggering native .onfoo handlers (and on links since we don't call .click() for links) 2021 if ( (!fn || (jQuery.nodeName(elem, 'a') && type == "click")) && elem["on"+type] && elem["on"+type].apply( elem, data ) === false ) 2022 val = false; 2023 2024 // Extra functions don't get the custom event object 2025 if ( event ) 2026 data.shift(); 2027 2028 // Handle triggering of extra function 2029 if ( extra && jQuery.isFunction( extra ) ) { 2030 // call the extra function and tack the current return value on the end for possible inspection 2031 ret = extra.apply( elem, val == null ? data : data.concat( val ) ); 2032 // if anything is returned, give it precedence and have it over
2032write the previous value 2033 if (ret !== undefined) 2034 val = ret; 2035 } 2036 2037 // Trigger the native events (except for clicks on links) 2038 if ( fn && donative !== false && val !== false && !(jQuery.nodeName(elem, 'a') && type == "click") ) { 2039 this.triggered = true; 2040 try { 2041 elem[ type ](); 2042 // prevent IE from throwing an error for some hidden elements 2043 } catch (e) {} 2044 } 2045 2046 this.triggered = false; 2047 } 2048 2049 return val; 2050 }, 2051 2052 handle: function(event) { 2053 // returned undefined or false 2054 var val, ret, namespace, all, handlers; 2055 2056 event = arguments[0] = jQuery.event.fix( event || window.event ); 2057 2058 // Namespaced event handlers 2059 namespace = event.type.split("."); 2060 event.type = namespace[0]; 2061 namespace = namespace[1]; 2062 // Cache this now, all = true means, any handler 2063 all = !namespace && !event.exclusive; 2064 2065 handlers = ( jQuery.data(this, "events") || {} )[event.type]; 2066 2067 for ( var j in handlers ) { 2068 var handler = handlers[j]; 2069 2070 // Filter the functions by class 2071 if ( all || handler.type == namespace ) { 2072 // Pass in a reference to the handler function itself 2073 // So that we can later remove it 2074 event.handler = handler; 2075 event.data = handler.data; 2076 2077 ret = handler.apply( this, arguments ); 2078 2079 if ( val !== false ) 2080 val = ret; 2081 2082 if ( ret === false ) { 2083 event.preventDefault(); 2084 event.stopPropagation(); 2085 } 2086 } 2087 } 2088 2089 return val; 2090 }, 2091 2092 fix: function(event) { 2093 if ( event[expando] == true ) 2094 return event; 2095 2096 // store a copy of the original event object 2097 // and "clone" to set read-only properties 2098 var originalEvent = event; 2099 event = { originalEvent: originalEvent }; 2100 var props = "altKey attrChange attrName bubbles button cancelable charCode clientX clientY ctrlKey currentTarget data detail eventPhase fromElement handler keyCode metaKey newValue originalTarget pageX pageY prevValue relatedNode relatedTarget screenX screenY shiftKey srcElement target timeStamp toElement type view wheelDelta which".split(" "); 2101 for ( var i=props.length; i; i-- ) 2102 event[ props[i] ] = originalEvent[ props[i] ]; 2103 2104 // Mark it as fixed 2105 event[expando] = true; 2106 2107 // add preventDefault and stopPropagation since 2108 // they will not work on the clone 2109 event.preventDefault = function() { 2110 // if preventDefault exists run it on the original event 2111 if (originalEvent.preventDefault) 2112 originalEvent.preventDefault(); 2113 // otherwise set the returnValue property of the original event to false (IE) 2114 originalEvent.returnValue = false; 2115 }; 2116 event.stopPropagation = function() { 2117 // if stopPropagation exists run it on the original event 2118 if (originalEvent.stopPropagation) 2119 originalEvent.stopPropagation(); 2120 // otherwise set the cancelBubble property of the original event to true (IE) 2121 originalEvent.cancelBubble = true; 2122 }; 2123 2124 // Fix timeStamp 2125 event.timeStamp = event.timeStamp || now(); 2126 2127 // Fix target property, if necessary 2128 if ( !event.target ) 2129 event.target = event.srcElement || document; // Fixes #1925 where srcElement might not be defined either 2130 2131 // check if target is a textnode (safari) 2132 if ( event.target.nodeType == 3 ) 2133 event.target = event.target.parentNode; 2134 2135 // Add relatedTarget, if necessary 2136 if ( !event.relatedTarget && event.fromElement ) 2137 event.relatedTarget = event.fromElement == event.target ? event.toElement : event.fromElement; 2138 2139 // Calculate pageX/Y if missing and clientX/Y available 2140 if ( event.pageX == null && event.clientX != null ) { 2141 var doc = document.documentElement, body = document.body; 2142 event.pageX = event.clientX + (doc && doc.scrollLeft || body && body.scrollLeft || 0) - (doc.clientLeft || 0); 2143 event.pageY = event.clientY + (doc && doc.scrollTop || body && body.scrollTop || 0) - (doc.clientTop || 0); 2144 } 2145 2146 // Add which for key events 2147 if ( !event.which && ((event.charCode || event.charCode === 0) ? event.charCode : event.keyCode) ) 2148 event.which = event.charCode || event.keyCode; 2149 2150 // Add metaKey to non-Mac browsers (use ctrl for PC's and Meta for Macs) 2151 if ( !event.metaKey && event.ctrlKey ) 2152 event.metaKey = event.ctrlKey; 2153 2154 // Add which for click: 1 == left; 2 == middle; 3 == right 2155 // Note: button is not normalized, so don't use it 2156 if ( !event.which && event.button ) 2157 event.which = (event.button & 1 ? 1 : ( event.button & 2 ? 3 : ( event.button & 4 ? 2 : 0 ) )); 2158 2159 return event; 2160 }, 2161 2162 proxy: function( fn, proxy ){ 2163 // Set the guid of unique handler to the same of original handler, so it can be removed 2164 proxy.guid = fn.guid = fn.guid || proxy.guid || this.guid++; 2165 // So proxy can be declared as an argument 2166 return proxy; 2167 }, 2168 2169 special: { 2170 ready: { 2171 setup: function() { 2172 // Make sure the ready event is setup 2173 bindReady(); 2174 return; 2175 }, 2176 2177 teardown: function() { return; } 2178 }, 2179
2180 mouseenter: { 2181 setup: function() { 2182 if ( jQuery.browser.msie ) return false; 2183 jQuery(this).bind("mouseover", jQuery.event.special.mouseenter.handler); 2184 return true; 2185 }, 2186 2187 teardown: function() { 2188 if ( jQuery.browser.msie ) return false; 2189 jQuery(this).unbind("mouseover", jQuery.event.special.mouseenter.handler); 2190 return true; 2191 }, 2192 2193 handler: function(event) { 2194 // If we actually just moused on to a sub-element, ignore it 2195 if ( withinElement(event, this) ) return true; 2196 // Execute the right handlers by setting the event type to mouseenter 2197 event.type = "mouseenter"; 2198 return jQuery.event.handle.apply(this, arguments); 2199 } 2200 }, 2201 2202 mouseleave: { 2203 setup: function() { 2204 if ( jQuery.browser.msie ) return false; 2205 jQuery(this).bind("mouseout", jQuery.event.special.mouseleave.handler); 2206 return true; 2207 }, 2208 2209 teardown: function() { 2210 if ( jQuery.browser.msie ) return false; 2211 jQuery(this).unbind("mouseout", jQuery.event.special.mouseleave.handler); 2212 return true; 2213 }, 2214 2215 handler: function(event) { 2216 // If we actually just moused on to a sub-element, ignore it 2217 if ( withinElement(event, this) ) return true; 2218 // Execute the right handlers by setting the event type to mouseleave 2219 event.type = "mouseleave"; 2220 return jQuery.event.handle.apply(this, arguments); 2221 } 2222 } 2223 } 2224}; 2225 2226jQuery.fn.extend({ 2227 bind: function( type, data, fn ) { 2228 return type == "unload" ? this.one(type, data, fn) : this.each(function(){ 2229 jQuery.event.add( this, type, fn || data, fn && data ); 2230 }); 2231 }, 2232 2233 one: function( type, data, fn ) { 2234 var one = jQuery.event.proxy( fn || data, function(event) { 2235 jQuery(this).unbind(event, one); 2236 return (fn || data).apply( this, arguments ); 2237 }); 2238 return this.each(function(){ 2239 jQuery.event.add( this, type, one, fn && data); 2240 }); 2241 }, 2242 2243 unbind: function( type, fn ) { 2244 return this.each(function(){ 2245 jQuery.event.remove( this, type, fn ); 2246 }); 2247 }, 2248 2249 trigger: function( type, data, fn ) { 2250 return this.each(function(){ 2251 jQuery.event.trigger( type, data, this, true, fn ); 2252 }); 2253 }, 2254 2255 triggerHandler: function( type, data, fn ) { 2256 return this[0] && jQuery.event.trigger( type, data, this[0], false, fn ); 2257 }, 2258 2259 toggle: function( fn ) { 2260 // Save reference to arguments for access in closure 2261 var args = arguments, i = 1; 2262 2263 // link all the functions, so any of them can unbind this click handler 2264 while( i < args.length ) 2265 jQuery.event.proxy( fn, args[i++] ); 2266 2267 return this.click( jQuery.event.proxy( fn, function(event) { 2268 // Figure out which function to execute 2269 this.lastToggle = ( this.lastToggle || 0 ) % i; 2270 2271 // Make sure that clicks stop 2272 event.preventDefault(); 2273 2274 // and execute the function 2275 return args[ this.lastToggle++ ].apply( this, arguments ) || false; 2276 })); 2277 }, 2278 2279 hover: function(fnOver, fnOut) { 2280 return this.bind('mouseenter', fnOver).bind('mouseleave', fnOut); 2281 }, 2282 2283 ready: function(fn) { 2284 // Attach the listeners 2285 bindReady(); 2286 2287 // If the DOM is already ready 2288 if ( jQuery.isReady ) 2289 // Execute the function immediately 2290 fn.call( document, jQuery ); 2291 2292 // Otherwise, remember the function for later 2293 else 2294 // Add the function to the wait list 2295 jQuery.readyList.push( function() { return fn.call(this, jQuery); } ); 2296 2297 return this; 2298 } 2299}); 2300 2301jQuery.extend({ 2302 isReady: false, 2303 readyList: [], 2304 // Handle when the DOM is ready 2305 ready: function() { 2306 // Make sure that the DOM is not already loaded 2307 if ( !jQuery.isReady ) { 2308 // Remember that the DOM is ready 2309 jQuery.isReady = true; 2310 2311 // If there are functions bound, to execute 2312 if ( jQuery.readyList ) { 2313 // Execute all of them 2314 jQuery.each( jQuery.readyList, function(){ 2315 this.call( document ); 2316 }); 2317 2318 // Reset the list of functions 2319 jQuery.readyList = null; 2320 } 2321 2322 // Trigger any bound ready events 2323 jQuery(document).triggerHandler("ready"); 2324 } 2325 } 2326}); 2327 2328var readyBound = false; 2329 2330function bindReady(){ 2331 if ( readyBound ) return; 2332 readyBound = true; 2333 2334 // Mozilla, Opera (see further below for it) and webkit nightlies currently support this event 2335 if ( document.addEventListener && !jQuery.browser.opera) 2336 // Use the handy event callback 2337 document.addEventListener( "DOMContentLoaded", jQuery.ready, false ); 2338 2339 // If IE is used and is not in a frame 2340 // Continually check to see if the document is ready 2341 if ( jQuery.browser.msie && window == top ) (function(){ 2342 if (jQuery.isReady) return; 2343 try { 2344 // If IE is used, use the trick by Diego Perini 2345 // http://javascript.nwbox.com/IEContentLoaded/ 2346 document.documentElement.doScroll("left"); 2347 } catch( error ) { 2348 setTimeout( arguments.callee, 0 ); 2349 return; 2350 } 2351 // and execute any waiting functions 2352 jQuery.ready(); 2353 })(); 2354 2355 if ( jQuery.browser.opera ) 2356 document.addEventListener( "DOMContentLoaded", function () { 2357 if (jQuery.isReady) return; 2358 for (var i = 0; i < document.styleSheets.length; i++) 2359 if (document.styleSheets[i].disabled) { 2360 setTimeout( arguments.callee, 0 ); 2361 return; 2362 } 2363 // and execute any waiting functions 2364 jQuery.ready(); 2365 }, false); 2366 2367 if ( jQuery.browser.safari ) { 2368 var numStyles; 2369 (function(){ 2370 if (jQuery.isReady) return; 2371 if ( document.readyState != "loaded" && document.readyState != "complete" ) { 2372 setTimeout( arguments.callee, 0 ); 2373 return; 2374 } 2375 if ( numStyles === undefined ) 2376 numStyles = jQuery("style, link[rel=stylesheet]").length; 2377 if ( document.styleSheets.length != numStyles ) { 2378 setTimeout( arguments.callee, 0 ); 2379 return; 2380 } 2381 // and execute any waiting functions 2382 jQuery.ready(); 2383 })();
2384 } 2385 2386 // A fallback to window.onload, that will always work 2387 jQuery.event.add( window, "load", jQuery.ready ); 2388} 2389 2390jQuery.each( ("blur,focus,load,resize,scroll,unload,click,dblclick," + 2391 "mousedown,mouseup,mousemove,mouseover,mouseout,change,select," + 2392 "submit,keydown,keypress,keyup,error").split(","), function(i, name){ 2393 2394 // Handle event binding 2395 jQuery.fn[name] = function(fn){ 2396 return fn ? this.bind(name, fn) : this.trigger(name); 2397 }; 2398}); 2399 2400// Checks if an event happened on an element within another element 2401// Used in jQuery.event.special.mouseenter and mouseleave handlers 2402var withinElement = function(event, elem) { 2403 // Check if mouse(over|out) are still within the same parent element 2404 var parent = event.relatedTarget; 2405 // Traverse up the tree 2406 while ( parent && parent != elem ) try { parent = parent.parentNode; } catch(error) { parent = elem; } 2407 // Return true if we actually just moused on to a sub-element 2408 return parent == elem; 2409}; 2410 2411// Prevent memory leaks in IE 2412// And prevent errors on refresh with events like mouseover in other browsers 2413// Window isn't included so as not to unbind existing unload events 2414jQuery(window).bind("unload", function() { 2415 jQuery("*").add(document).unbind(); 2416}); 2417jQuery.fn.extend({ 2418 // Keep a copy of the old load 2419 _load: jQuery.fn.load, 2420 2421 load: function( url, params, callback ) { 2422 if ( typeof url != 'string' ) 2423 return this._load( url ); 2424 2425 var off = url.indexOf(" "); 2426 if ( off >= 0 ) { 2427 var selector = url.slice(off, url.length); 2428 url = url.slice(0, off); 2429 } 2430 2431 callback = callback || function(){}; 2432 2433 // Default to a GET request 2434 var type = "GET"; 2435 2436 // If the second parameter was provided 2437 if ( params ) 2438 // If it's a function 2439 if ( jQuery.isFunction( params ) ) { 2440 // We assume that it's the callback 2441 callback = params; 2442 params = null; 2443 2444 // Otherwise, build a param string 2445 } else { 2446 params = jQuery.param( params ); 2447 type = "POST"; 2448 } 2449 2450 var self = this; 2451 2452 // Request the remote document 2453 jQuery.ajax({ 2454 url: url, 2455 type: type, 2456 dataType: "html", 2457 data: params, 2458 complete: function(res, status){ 2459 // If successful, inject the HTML into all the matched elements 2460 if ( status == "success" || status == "notmodified" ) 2461 // See if a selector was specified 2462 self.html( selector ? 2463 // Create a dummy div to hold the results 2464 jQuery("<div/>") 2465 // inject the contents of the document in, removing the scripts 2466 // to avoid any 'Permission Denied' errors in IE 2467 .append(res.responseText.replace(/<script(.|\s)*?\/script>/g, "")) 2468 2469 // Locate the specified elements 2470 .find(selector) : 2471 2472 // If not, just inject the full result 2473 res.responseText ); 2474 2475 self.each( callback, [res.responseText, status, res] ); 2476 } 2477 }); 2478 return this; 2479 }, 2480 2481 serialize: function() { 2482 return jQuery.param(this.serializeArray()); 2483 }, 2484 serializeArray: function() { 2485 return this.map(function(){ 2486 return jQuery.nodeName(this, "form") ? 2487 jQuery.makeArray(this.elements) : this; 2488 }) 2489 .filter(function(){ 2490 return this.name && !this.disabled && 2491 (this.checked || /select|textarea/i.test(this.nodeName) || 2492 /text|hidden|password/i.test(this.type)); 2493 }) 2494 .map(function(i, elem){ 2495 var val = jQuery(this).val(); 2496 return val == null ? null : 2497 val.constructor == Array ? 2498 jQuery.map( val, function(val, i){ 2499 return {name: elem.name, value: val}; 2500 }) : 2501 {name: elem.name, value: val}; 2502 }).get(); 2503 } 2504}); 2505 2506// Attach a bunch of functions for handling common AJAX events 2507jQuery.each( "ajaxStart,ajaxStop,ajaxComplete,ajaxError,ajaxSuccess,ajaxSend".split(","), function(i,o){ 2508 jQuery.fn[o] = function(f){ 2509 return this.bind(o, f); 2510 }; 2511}); 2512 2513var jsc = now(); 2514 2515jQuery.extend({ 2516 get: function( url, data, callback, type ) { 2517 // shift arguments if data argument was ommited 2518 if ( jQuery.isFunction( data ) ) { 2519 callback = data; 2520 data = null; 2521 } 2522 2523 return jQuery.ajax({ 2524 type: "GET", 2525 url: url, 2526 data: data, 2527 success: callback, 2528 dataType: type 2529 }); 2530 }, 2531 2532 getScript: function( url, callback ) { 2533 return jQuery.get(url, null, callback, "script"); 2534 }, 2535 2536 getJSON: function( url, data, callback ) { 2537 return jQuery.get(url, data, callback, "json"); 2538 }, 2539 2540 post: function( url, data, callback, type ) { 2541 if ( jQuery.isFunction( data ) ) { 2542 callback = data; 2543 data = {}; 2544 } 2545 2546 return jQuery.ajax({ 2547 type: "POST", 2548 url: url, 2549 data: data, 2550 success: callback, 2551 dataType: type 2552 }); 2553 }, 2554 2555 ajaxSetup: function( settings ) { 2556 jQuery.extend( jQuery.ajaxSettings, settings ); 2557 }, 2558 2559 ajaxSettings: { 2560 url: location.href, 2561 global: true, 2562 type: "GET", 2563 timeout: 0, 2564 contentType: "application/x-www-form-urlencoded", 2565 processData: true, 2566 async: true, 2567 data: null, 2568 username: null, 2569 password: null, 2570 accepts: { 2571 xml: "application/xml, text/xml", 2572 html: "text/html", 2573 script: "text/javascript, application/javascript", 2574 json: "application/json, text/javascript", 2575 text: "text/plain", 2576 _default: "*/*" 2577 } 2578 }, 2579 2580 // Last-Modified header cache for next request 2581 lastModified: {}, 2582 2583 ajax: function( s ) { 2584 // Extend the settings, but re-extend 's' so that it can be 2585 // checked again later (in the test suite, specifically) 2586 s = jQuery.extend(true, s, jQuery.extend(true, {}, jQuery.ajaxSettings, s)); 2587 2588 var jsonp, jsre = /=\?(&|$)/g, status, data, 2589 type = s.type.toUpperCase(); 2590 2591 // convert data if not already a string 2592 if ( s.data && s.processData && typeof s.data != "string" ) 2593 s.data = jQuery.param(s.data); 2594 2595 // Handle JSONP Parameter Callbacks 2596 if ( s.dataType == "jsonp" ) { 2597 if ( type == "GET" ) { 2598 if ( !s.url.match(jsre) ) 2599 s.url += (s.url.match(/\?/) ? "&" : "?") + (s.jsonp || "callback") + "=?"; 2600 } else if ( !s.data || !s.data.match(jsre) ) 2601 s.data = (s.data ? s.data + "&" : "") + (s.jsonp || "callback") + "=?"; 2602 s.dataType = "json"; 2603 } 2604 2605 // Build temporary JSONP function 2606 if ( s.dataType == "json" && (s.data && s.data.match(jsre) || s.url.match(jsre)) ) { 2607 jsonp = "jsonp" + jsc++; 2608 2609 // Replace the =? sequence both in the query string and the data 2610 if ( s.data ) 2611 s.data = (s.data + "").replace(jsre, "=" + jsonp + "$1"); 2612 s.url = s.url.replace(jsre, "=" + jsonp + "$1"); 2613 2614 // We need to make sure 2615 // that a JSONP style response is executed properly 2616 s.dataType = "script"; 2617 2618 // Handle JSONP-style loading 2619 window[ jsonp ] = function(tmp){ 2620 data = tmp; 2621 success(); 2622 complete(); 2623 // Garbage collect 2624 window[ jsonp ] = undefined; 2625 try{ delete window[ jsonp ]; } catch(e){} 2626 if ( head ) 2627 head.removeChild( script ); 2628 }; 2629 } 2630 2631 if ( s.dataType == "script" && s.cache == null ) 2632 s.cache = false; 2633 2634 if ( s.cache === false && type == "GET" ) { 2635 var ts = now(); 2636 // try replacing _= if it is there 2637 var ret = s.url.replace(/(\?|&)_=.*?(&|$)/, "$1_=" + ts + "$2"); 2638 // if nothing was replaced, add timestamp to the end 2639 s.url = ret + ((ret == s.url) ? (s.url.match(/\?/) ? "&" : "?") + "_=" + ts : ""); 2640 } 2641 2642 // If data is available, append data to url for get requests 2643 if ( s.data && type == "GET" ) { 2644 s.url += (s.url.match(/\?/) ? "&" : "?") + s.data; 2645 2646 // IE likes to send both get and post data, prevent this 2647 s.data = null; 2648 } 2649 2650 // Watch for a new set of requests 2651 if ( s.global && ! jQuery.active++ ) 2652 jQuery.event.trigger( "ajaxStart" ); 2653 2654 // Matches an absolute URL, and saves the domain 2655 var remote = /^(?:\w+:)?\/\/([^\/?#]+)/; 2656 2657 // If we're requesting a remote document 2658 // and trying to load JSON or Script with a GET 2659 if ( s.dataType == "script" && type == "GET" 2660 && remote.test(s.url) && remote.exec(s.url)[1] != location.host ){ 2661 var head = document.getElementsByTagName("head")[0]; 2662 var script = document.createElement("script"); 2663 script.src = s.url; 2664 if (s.scriptCharset) 2665 script.charset = s.scriptCharset; 2666 2667 // Handle Script loading 2668 if ( !jsonp ) { 2669 var done = false; 2670 2671 // Attach handlers for all browsers 2672 script.onload = script.onreadystatechange = function(){ 2673 if ( !done && (!this.readyState || 2674 this.readyState == "loaded" || this.readyState == "complete") ) { 2675 done = true; 2676 success(); 2677 complete(); 2678 head.removeChild( script ); 2679 } 2680 }; 2681 } 2682 2683 head.appendChild(script); 2684 2685 // We handle everything using the script element injection 2686 return undefined; 2687 } 2688 2689 var requestDone = false; 2690 2691 // Create the request object; Microsoft failed to properly 2692 // implement the XMLHttpRequest in IE7, so we use the ActiveXObject when it is available 2693 var xhr = window.ActiveXObject ? new ActiveXObject("Microsoft.XMLHTTP") : new XMLHttpRequest(); 2694 2695 // Open the socket 2696 // Passing null username, generates a login popup on Opera (#2865) 2697 if( s.username ) 2698 xhr.open(type, s.url, s.async, s.username, s.password); 2699 else 2700 xhr.open(type, s.url, s.async); 2701 2702 // Need an extra try/catch for cross domain requests in Firefox 3 2703 try { 2704 // Set the correct header, if data is being sent 2705 if ( s.data )
2706 xhr.setRequestHeader("Content-Type", s.contentType); 2707 2708 // Set the If-Modified-Since header, if ifModified mode. 2709 if ( s.ifModified ) 2710 xhr.setRequestHeader("If-Modified-Since", 2711 jQuery.lastModified[s.url] || "Thu, 01 Jan 1970 00:00:00 GMT" ); 2712 2713 // Set header so the called script knows that it's an XMLHttpRequest 2714 xhr.setRequestHeader("X-Requested-With", "XMLHttpRequest"); 2715 2716 // Set the Accepts header for the server, depending on the dataType 2717 xhr.setRequestHeader("Accept", s.dataType && s.accepts[ s.dataType ] ? 2718 s.accepts[ s.dataType ] + ", */*" : 2719 s.accepts._default ); 2720 } catch(e){} 2721 2722 // Allow custom headers/mimetypes 2723 if ( s.beforeSend && s.beforeSend(xhr, s) === false ) { 2724 // cleanup active request counter 2725 s.global && jQuery.active--; 2726 // close opended socket 2727 xhr.abort(); 2728 return false; 2729 } 2730 2731 if ( s.global ) 2732 jQuery.event.trigger("ajaxSend", [xhr, s]); 2733 2734 // Wait for a response to come back 2735 var onreadystatechange = function(isTimeout){ 2736 // The transfer is complete and the data is available, or the request timed out 2737 if ( !requestDone && xhr && (xhr.readyState == 4 || isTimeout == "timeout") ) { 2738 requestDone = true; 2739 2740 // clear poll interval 2741 if (ival) { 2742 clearInterval(ival); 2743 ival = null; 2744 } 2745 2746 status = isTimeout == "timeout" && "timeout" || 2747 !jQuery.httpSuccess( xhr ) && "error" || 2748 s.ifModified && jQuery.httpNotModified( xhr, s.url ) && "notmodified" || 2749 "success"; 2750 2751 if ( status == "success" ) { 2752 // Watch for, and catch, XML document parse errors 2753 try { 2754 // process the data (runs the xml through httpData regardless of callback) 2755 data = jQuery.httpData( xhr, s.dataType, s.dataFilter ); 2756 } catch(e) { 2757 status = "parsererror"; 2758 } 2759 } 2760 2761 // Make sure that the request was successful or notmodified 2762 if ( status == "success" ) { 2763 // Cache Last-Modified header, if ifModified mode. 2764 var modRes; 2765 try { 2766 modRes = xhr.getResponseHeader("Last-Modified"); 2767 } catch(e) {} // swallow exception thrown by FF if header is not available 2768 2769 if ( s.ifModified && modRes ) 2770 jQuery.lastModified[s.url] = modRes; 2771 2772 // JSONP handles its own success callback 2773 if ( !jsonp ) 2774 success(); 2775 } else 2776 jQuery.handleError(s, xhr, status); 2777 2778 // Fire the complete handlers 2779 complete(); 2780 2781 // Stop memory leaks 2782 if ( s.async ) 2783 xhr = null; 2784 } 2785 }; 2786 2787 if ( s.async ) { 2788 // don't attach the handler to the request, just poll it instead 2789 var ival = setInterval(onreadystatechange, 13); 2790 2791 // Timeout checker 2792 if ( s.timeout > 0 ) 2793 setTimeout(function(){ 2794 // Check to see if the request is still happening 2795 if ( xhr ) { 2796 // Cancel the request 2797 xhr.abort(); 2798 2799 if( !requestDone ) 2800 onreadystatechange( "timeout" ); 2801 } 2802 }, s.timeout); 2803 } 2804 2805 // Send the data 2806 try { 2807 xhr.send(s.data); 2808 } catch(e) { 2809 jQuery.handleError(s, xhr, null, e); 2810 } 2811 2812 // firefox 1.5 doesn't fire statechange for sync requests 2813 if ( !s.async ) 2814 onreadystatechange(); 2815 2816 function success(){ 2817 // If a local callback was specified, fire it and pass it the data 2818 if ( s.success ) 2819 s.success( data, status ); 2820 2821 // Fire the global callback 2822 if ( s.global ) 2823 jQuery.event.trigger( "ajaxSuccess", [xhr, s] ); 2824 } 2825 2826 function complete(){ 2827 // Process result 2828 if ( s.complete ) 2829 s.complete(xhr, status); 2830 2831 // The request was completed 2832 if ( s.global ) 2833 jQuery.event.trigger( "ajaxComplete", [xhr, s] ); 2834 2835 // Handle the global AJAX counter 2836 if ( s.global && ! --jQuery.active ) 2837 jQuery.event.trigger( "ajaxStop" ); 2838 } 2839 2840 // return XMLHttpRequest to allow aborting the request etc. 2841 return xhr; 2842 }, 2843 2844 handleError: function( s, xhr, status, e ) { 2845 // If a local callback was specified, fire it 2846 if ( s.error ) s.error( xhr, status, e ); 2847 2848 // Fire the global callback 2849 if ( s.global ) 2850 jQuery.event.trigger( "ajaxError", [xhr, s, e] ); 2851 }, 2852 2853 // Counter for holding the number of active queries 2854 active: 0, 2855 2856 // Determines if an XMLHttpRequest was successful or not 2857 httpSuccess: function( xhr ) { 2858 try { 2859 // IE error sometimes returns 1223 when it should be 204 so treat it as success, see #1450 2860 return !xhr.status && location.protocol == "file:" || 2861 ( xhr.status >= 200 && xhr.status < 300 ) || xhr.status == 304 || xhr.status == 1223 || 2862 jQuery.browser.safari && xhr.status == undefined; 2863 } catch(e){} 2864 return false; 2865 }, 2866 2867 // Determines if an XMLHttpRequest returns NotModified 2868 httpNotModified: function( xhr, url ) { 2869 try { 2870 var xhrRes = xhr.getResponseHeader("Last-Modified"); 2871 2872 // Firefox always returns 200. check Last-Modified date 2873 return xhr.status == 304 || xhrRes == jQuery.lastModified[url] || 2874 jQuery.browser.safari && xhr.status == undefined; 2875 } catch(e){} 2876 return false; 2877 }, 2878 2879 httpData: function( xhr, type, filter ) { 2880 var ct = xhr.getResponseHeader("content-type"), 2881 xml = type == "xml" || !type && ct && ct.indexOf("xml") >= 0, 2882 data = xml ? xhr.responseXML : xhr.responseText; 2883 2884 if ( xml && data.documentElement.tagName == "parsererror" ) 2885 throw "parsererror"; 2886 2887 // Allow a pre-filtering function to sanitize the response 2888 if( filter ) 2889 data = filter( data, type ); 2890 2891 // If the type is "script", eval it in global context 2892 if ( type == "script" ) 2893 jQuery.globalEval( data ); 2894 2895 // Get the JavaScript object, if JSON is used. 2896 if ( type == "json" ) 2897 data = eval("(" + data + ")"); 2898 2899 return data; 2900 }, 2901 2902 // Serialize an array of form elements or a set of 2903 // key/values into a query string 2904 param: function( a ) { 2905 var s = []; 2906 2907 // If an array was passed in, assume that it is an array 2908 // of form elements 2909 if ( a.constructor == Array || a.jquery ) 2910 // Serialize the form elements 2911 jQuery.each( a, function(){ 2912 s.push( encodeURIComponent(this.name) + "=" + encodeURIComponent( this.value ) ); 2913 }); 2914
2915 // Otherwise, assume that it's an object of key/value pairs 2916 else 2917 // Serialize the key/values 2918 for ( var j in a ) 2919 // If the value is an array then the key names need to be repeated 2920 if ( a[j] && a[j].constructor == Array ) 2921 jQuery.each( a[j], function(){ 2922 s.push( encodeURIComponent(j) + "=" + encodeURIComponent( this ) ); 2923 }); 2924 else 2925 s.push( encodeURIComponent(j) + "=" + encodeURIComponent( jQuery.isFunction(a[j]) ? a[j]() : a[j] ) ); 2926 2927 // Return the resulting serialization 2928 return s.join("&").replace(/%20/g, "+"); 2929 } 2930 2931}); 2932jQuery.fn.extend({ 2933 show: function(speed,callback){ 2934 return speed ? 2935 this.animate({ 2936 height: "show", width: "show", opacity: "show" 2937 }, speed, callback) : 2938 2939 this.filter(":hidden").each(function(){ 2940 this.style.display = this.oldblock || ""; 2941 if ( jQuery.css(this,"display") == "none" ) { 2942 var elem = jQuery("<" + this.tagName + " />").appendTo("body"); 2943 this.style.display = elem.css("display"); 2944 // handle an edge condition where css is - div { display:none; } or similar 2945 if (this.style.display == "none") 2946 this.style.display = "block"; 2947 elem.remove(); 2948 } 2949 }).end(); 2950 }, 2951 2952 hide: function(speed,callback){ 2953 return speed ? 2954 this.animate({ 2955 height: "hide", width: "hide", opacity: "hide" 2956 }, speed, callback) : 2957 2958 this.filter(":visible").each(function(){ 2959 this.oldblock = this.oldblock || jQuery.css(this,"display"); 2960 this.style.display = "none"; 2961 }).end(); 2962 }, 2963 2964 // Save the old toggle function 2965 _toggle: jQuery.fn.toggle, 2966 2967 toggle: function( fn, fn2 ){ 2968 return jQuery.isFunction(fn) && jQuery.isFunction(fn2) ? 2969 this._toggle.apply( this, arguments ) : 2970 fn ? 2971 this.animate({ 2972 height: "toggle", width: "toggle", opacity: "toggle" 2973 }, fn, fn2) : 2974 this.each(function(){ 2975 jQuery(this)[ jQuery(this).is(":hidden") ? "show" : "hide" ](); 2976 }); 2977 }, 2978 2979 slideDown: function(speed,callback){ 2980 return this.animate({height: "show"}, speed, callback); 2981 }, 2982 2983 slideUp: function(speed,callback){ 2984 return this.animate({height: "hide"}, speed, callback); 2985 }, 2986 2987 slideToggle: function(speed, callback){ 2988 return this.animate({height: "toggle"}, speed, callback); 2989 }, 2990 2991 fadeIn: function(speed, callback){ 2992 return this.animate({opacity: "show"}, speed, callback); 2993 }, 2994 2995 fadeOut: function(speed, callback){ 2996 return this.animate({opacity: "hide"}, speed, callback); 2997 }, 2998 2999 fadeTo: function(speed,to,callback){ 3000 return this.animate({opacity: to}, speed, callback); 3001 }, 3002 3003 animate: function( prop, speed, easing, callback ) { 3004 var optall = jQuery.speed(speed, easing, callback); 3005 3006 return this[ optall.queue === false ? "each" : "queue" ](function(){ 3007 if ( this.nodeType != 1) 3008 return false; 3009 3010 var opt = jQuery.extend({}, optall), p, 3011 hidden = jQuery(this).is(":hidden"), self = this; 3012 3013 for ( p in prop ) { 3014 if ( prop[p] == "hide" && hidden || prop[p] == "show" && !hidden ) 3015 return opt.complete.call(this); 3016 3017 if ( p == "height" || p == "width" ) { 3018 // Store display property 3019 opt.display = jQuery.css(this, "display"); 3020 3021 // Make sure that nothing sneaks out 3022 opt.overflow = this.style.overflow; 3023 } 3024 } 3025 3026 if ( opt.overflow != null ) 3027 this.style.overflow = "hidden"; 3028 3029 opt.curAnim = jQuery.extend({}, prop); 3030 3031 jQuery.each( prop, function(name, val){ 3032 var e = new jQuery.fx( self, opt, name ); 3033 3034 if ( /toggle|show|hide/.test(val) ) 3035 e[ val == "toggle" ? hidden ? "show" : "hide" : val ]( prop ); 3036 else { 3037 var parts = val.toString().match(/^([+-]=)?([\d+-.]+)(.*)$/), 3038 start = e.cur(true) || 0; 3039 3040 if ( parts ) { 3041 var end = parseFloat(parts[2]), 3042 unit = parts[3] || "px"; 3043 3044 // We need to compute starting value 3045 if ( unit != "px" ) { 3046 self.style[ name ] = (end || 1) + unit; 3047 start = ((end || 1) / e.cur(true)) * start; 3048 self.style[ name ] = start + unit; 3049 } 3050 3051 // If a +=/-= token was provided, we're doing a relative animation 3052 if ( parts[1] )
3053 end = ((parts[1] == "-=" ? -1 : 1) * end) + start; 3054 3055 e.custom( start, end, unit ); 3056 } else 3057 e.custom( start, val, "" ); 3058 } 3059 }); 3060 3061 // For JS strict compliance 3062 return true; 3063 }); 3064 }, 3065 3066 queue: function(type, fn){ 3067 if ( jQuery.isFunction(type) || ( type && type.constructor == Array )) { 3068 fn = type; 3069 type = "fx"; 3070 } 3071 3072 if ( !type || (typeof type == "string" && !fn) ) 3073 return queue( this[0], type ); 3074 3075 return this.each(function(){ 3076 if ( fn.constructor == Array ) 3077 queue(this, type, fn); 3078 else { 3079 queue(this, type).push( fn ); 3080 3081 if ( queue(this, type).length == 1 ) 3082 fn.call(this); 3083 } 3084 }); 3085 }, 3086 3087 stop: function(clearQueue, gotoEnd){ 3088 var timers = jQuery.timers; 3089 3090 if (clearQueue) 3091 this.queue([]); 3092 3093 this.each(function(){ 3094 // go in reverse order so anything added to the queue during the loop is ignored 3095 for ( var i = timers.length - 1; i >= 0; i-- ) 3096 if ( timers[i].elem == this ) { 3097 if (gotoEnd) 3098 // force the next step to be the last 3099 timers[i](true); 3100 timers.splice(i, 1); 3101 } 3102 }); 3103 3104 // start the next in the queue if the last step wasn't forced 3105 if (!gotoEnd) 3106 this.dequeue(); 3107 3108 return this; 3109 } 3110 3111}); 3112 3113var queue = function( elem, type, array ) { 3114 if ( elem ){ 3115 3116 type = type || "fx"; 3117 3118 var q = jQuery.data( elem, type + "queue" ); 3119 3120 if ( !q || array ) 3121 q = jQuery.data( elem, type + "queue", jQuery.makeArray(array) ); 3122 3123 } 3124 return q; 3125}; 3126 3127jQuery.fn.dequeue = function(type){ 3128 type = type || "fx"; 3129 3130 return this.each(function(){ 3131 var q = queue(this, type); 3132 3133 q.shift(); 3134 3135 if ( q.length ) 3136 q[0].call( this ); 3137 }); 3138}; 3139 3140jQuery.extend({ 3141 3142 speed: function(speed, easing, fn) { 3143 var opt = speed && speed.constructor == Object ? speed : { 3144 complete: fn || !fn && easing || 3145 jQuery.isFunction( speed ) && speed, 3146 duration: speed, 3147 easing: fn && easing || easing && easing.constructor != Function && easing 3148 }; 3149 3150 opt.duration = (opt.duration && opt.duration.constructor == Number ? 3151 opt.duration : 3152 jQuery.fx.speeds[opt.duration]) || jQuery.fx.speeds.def; 3153 3154 // Queueing 3155 opt.old = opt.complete; 3156 opt.complete = function(){ 3157 if ( opt.queue !== false ) 3158 jQuery(this).dequeue(); 3159 if ( jQuery.isFunction( opt.old ) ) 3160 opt.old.call( this ); 3161 }; 3162 3163 return opt; 3164 }, 3165 3166 easing: { 3167 linear: function( p, n, firstNum, diff ) { 3168 return firstNum + diff * p; 3169 }, 3170 swing: function( p, n, firstNum, diff ) { 3171 return ((-Math.cos(p*Math.PI)/2) + 0.5) * diff + firstNum; 3172 } 3173 }, 3174 3175 timers: [], 3176 timerId: null, 3177 3178 fx: function( elem, options, prop ){ 3179 this.options = options; 3180 this.elem = elem; 3181 this.prop = prop; 3182 3183 if ( !options.orig ) 3184 options.orig = {}; 3185 } 3186 3187}); 3188 3189jQuery.fx.prototype = { 3190 3191 // Simple function for setting a style value 3192 update: function(){ 3193 if ( this.options.step ) 3194 this.options.step.call( this.elem, this.now, this ); 3195 3196 (jQuery.fx.step[this.prop] || jQuery.fx.step._default)( this ); 3197 3198 // Set display property to block for height/width animations 3199 if ( this.prop == "height" || this.prop == "width" ) 3200 this.elem.style.display = "block"; 3201 }, 3202 3203 // Get the current size 3204 cur: function(force){ 3205 if ( this.elem[this.prop] != null && this.elem.style[this.prop] == null ) 3206 return this.elem[ this.prop ]; 3207 3208 var r = parseFloat(jQuery.css(this.elem, this.prop, force)); 3209 return r && r > -10000 ? r : parseFloat(jQuery.curCSS(this.elem, this.prop)) || 0; 3210 }, 3211 3212 // Start an animation from one number to another 3213 custom: function(from, to, unit){ 3214 this.startTime = now(); 3215 this.start = from; 3216 this.end = to; 3217 this.unit = unit || this.unit || "px"; 3218 this.now = this.start; 3219 this.pos = this.state = 0; 3220 this.update(); 3221 3222 var self = this; 3223 function t(gotoEnd){ 3224 return self.step(gotoEnd); 3225 } 3226 3227 t.elem = this.elem; 3228 3229 jQuery.timers.push(t); 3230 3231 if ( jQuery.timerId == null ) { 3232 jQuery.timerId = setInterval(function(){ 3233 var timers = jQuery.timers; 3234 3235 for ( var i = 0; i < timers.length; i++ ) 3236 if ( !timers[i]() ) 3237 timers.splice(i--, 1); 3238 3239 if ( !timers.length ) { 3240 clearInterval( jQuery.timerId ); 3241 jQuery.timerId = null; 3242 } 3243 }, 13); 3244 } 3245 }, 3246 3247 // Simple 'show' function 3248 show: function(){ 3249 // Remember where we started, so that we can go back to it later 3250 this.options.orig[this.prop] = jQuery.attr( this.elem.style, this.prop ); 3251 this.options.show = true; 3252 3253 // Begin the animation 3254 this.custom(0, this.cur()); 3255 3256 // Make sure that we start at a small width/height to avoid any 3257 // flash of content 3258 if ( this.prop == "width" || this.prop == "height" ) 3259 this.elem.style[this.prop] = "1px"; 3260 3261 // Start by showing the element 3262 jQuery(this.elem).show(); 3263 }, 3264 3265 // Simple 'hide' function 3266 hide: function(){ 3267 // Remember where we started, so that we can go back to it later 3268 this.options.orig[this.prop] = jQuery.attr( this.elem.style, this.prop ); 3269 this.options.hide = true; 3270 3271 // Begin the animation 3272 this.custom(this.cur(), 0); 3273 }, 3274 3275 // Each step of an animation 3276 step: function(gotoEnd){ 3277 var t = now(); 3278 3279 if ( gotoEnd || t > this.options.duration + this.startTime ) { 3280 this.now = this.end; 3281 this.pos = this.state = 1; 3282 this.update(); 3283 3284 this.options.curAnim[ this.prop ] = true; 3285 3286 var done = true; 3287 for ( var i in this.options.curAnim ) 3288 if ( this.options.curAnim[i] !== true ) 3289 done = false; 3290 3291 if ( done ) { 3292 if ( this.options.display != null ) { 3293 // Reset the overflow 3294 this.elem.style.overflow = this.options.overflow; 3295 3296 // Reset the display 3297 this.elem.style.display = this.options.display;
3298 if ( jQuery.css(this.elem, "display") == "none" ) 3299 this.elem.style.display = "block"; 3300 } 3301 3302 // Hide the element if the "hide" operation was done 3303 if ( this.options.hide ) 3304 this.elem.style.display = "none"; 3305 3306 // Reset the properties, if the item has been hidden or shown 3307 if ( this.options.hide || this.options.show ) 3308 for ( var p in this.options.curAnim ) 3309 jQuery.attr(this.elem.style, p, this.options.orig[p]); 3310 } 3311 3312 if ( done ) 3313 // Execute the complete function 3314 this.options.complete.call( this.elem ); 3315 3316 return false; 3317 } else { 3318 var n = t - this.startTime; 3319 this.state = n / this.options.duration; 3320 3321 // Perform the easing function, defaults to swing 3322 this.pos = jQuery.easing[this.options.easing || (jQuery.easing.swing ? "swing" : "linear")](this.state, n, 0, 1, this.options.duration); 3323 this.now = this.start + ((this.end - this.start) * this.pos); 3324 3325 // Perform the next step of the animation 3326 this.update(); 3327 } 3328 3329 return true; 3330 } 3331 3332}; 3333 3334jQuery.extend( jQuery.fx, { 3335 speeds:{ 3336 slow: 600, 3337 fast: 200, 3338 // Default speed 3339 def: 400 3340 }, 3341 step: { 3342 scrollLeft: function(fx){ 3343 fx.elem.scrollLeft = fx.now; 3344 }, 3345 3346 scrollTop: function(fx){ 3347 fx.elem.scrollTop = fx.now; 3348 }, 3349 3350 opacity: function(fx){ 3351 jQuery.attr(fx.elem.style, "opacity", fx.now); 3352 }, 3353 3354 _default: function(fx){ 3355 fx.elem.style[ fx.prop ] = fx.now + fx.unit; 3356 } 3357 } 3358}); 3359// The Offset Method 3360// Originally By Brandon Aaron, part of the Dimension Plugin 3361// http://jquery.com/plugins/project/dimensions 3362jQuery.fn.offset = function() { 3363 var left = 0, top = 0, elem = this[0], results; 3364 3365 if ( elem ) with ( jQuery.browser ) { 3366 var parent = elem.parentNode, 3367 offsetChild = elem, 3368 offsetParent = elem.offsetParent, 3369 doc = elem.ownerDocument, 3370 safari2 = safari && parseInt(version) < 522 && !/adobeair/i.test(userAgent), 3371 css = jQuery.curCSS, 3372 fixed = css(elem, "position") == "fixed"; 3373 3374 // Use getBoundingClientRect if available 3375 if ( elem.getBoundingClientRect ) { 3376 var box = elem.getBoundingClientRect(); 3377 3378 // Add the document scroll offsets 3379 add(box.left + Math.max(doc.documentElement.scrollLeft, doc.body.scrollLeft), 3380 box.top + Math.max(doc.documentElement.scrollTop, doc.body.scrollTop)); 3381 3382 // IE adds the HTML element's border, by default it is medium which is 2px 3383 // IE 6 and 7 quirks mode the border width is overwritable by the following css html { border: 0; } 3384 // IE 7 standards mode, the border is always 2px 3385 // This border/offset is typically represented by the clientLeft and clientTop properties 3386 // However, in IE6 and 7 quirks mode the clientLeft and clientTop properties are not updated when overwriting it via CSS 3387 // Therefore this method will be off by 2px in IE while in quirksmode 3388 add( -doc.documentElement.clientLeft, -doc.documentElement.clientTop ); 3389 3390 // Otherwise loop through the offsetParents and parentNodes 3391 } else { 3392 3393 // Initial element offsets 3394 add( elem.offsetLeft, elem.offsetTop ); 3395 3396 // Get parent offsets 3397 while ( offsetParent ) { 3398 // Add offsetParent offsets 3399 add( offsetParent.offsetLeft, offsetParent.offsetTop ); 3400 3401 // Mozilla and Safari > 2 does not include the border on offset parents 3402 // However Mozilla adds the border for table or table cells 3403 if ( mozilla && !/^t(able|d|h)$/i.test(offsetParent.tagName) || safari && !safari2 ) 3404 border( offsetParent ); 3405 3406 // Add the document scroll offsets if position is fixed on any offsetParent 3407 if ( !fixed && css(offsetParent, "position") == "fixed" ) 3408 fixed = true; 3409 3410 // Set offsetChild to previous offsetParent unless it is the body element 3411 offsetChild = /^body$/i.test(offsetParent.tagName) ? offsetChild : offsetParent; 3412 // Get next offsetParent 3413 offsetParent = offsetParent.offsetParent; 3414 } 3415 3416 // Get parent scroll offsets 3417 while ( parent && parent.tagName && !/^body|html$/i.test(parent.tagName) ) { 3418 // Remove parent scroll UNLESS that parent is inline or a table to work around Opera inline/table scrollLeft/Top bug 3419 if ( !/^inline|table.*$/i.test(css(parent, "display")) ) 3420 // Subtract parent scroll offsets 3421 add( -parent.scrollLeft, -parent.scrollTop ); 3422 3423 // Mozilla does not add the border for a parent that has overflow != visible 3424 if ( mozilla && css(parent, "overflow") != "visible" ) 3425 border( parent ); 3426 3427 // Get next parent 3428 parent = parent.parentNode; 3429 } 3430 3431 // Safari <= 2 doubles body offsets with a fixed position element/offsetParent or absolutely positioned offsetChild 3432 // Mozilla doubles body offsets with a non-absolutely positioned offsetChild 3433 if ( (safari2 && (fixed || css(offsetChild, "position") == "absolute")) || 3434 (mozilla && css(offsetChild, "position") != "absolute") ) 3435 add( -doc.body.offsetLeft, -doc.body.offsetTop ); 3436 3437 // Add the document scroll offsets if position is fixed 3438 if ( fixed ) 3439 add(Math.max(doc.documentElement.scrollLeft, doc.body.scrollLeft), 3440 Math.max(doc.documentElement.scrollTop, doc.body.scrollTop)); 3441 } 3442 3443 // Return an object with top and left properties 3444 results = { top: top, left: left }; 3445 } 3446 3447 function border(elem) { 3448 add( jQuery.curCSS(elem, "borderLeftWidth", true), jQuery.curCSS(elem, "borderTopWidth", true) ); 3449 } 3450 3451 function add(l, t) { 3452 left += parseInt(l, 10) || 0; 3453 top += parseInt(t, 10) || 0; 3454 } 3455 3456 return results; 3457}; 3458 3459 3460jQuery.fn.extend({ 3461 position: function() { 3462 var left = 0, top = 0, results; 3463 3464 if ( this[0] ) { 3465 // Get *real* offsetParent 3466 var offsetParent = this.offsetParent(), 3467 3468 // Get correct offsets 3469 offset = this.offset(), 3470 parentOffset = /^body|html$/i.test(offsetParent[0].tagName) ? { top: 0, left: 0 } : offsetParent.offset(); 3471 3472 // Subtract element margins 3473 // note: when an element has margin: auto the offsetLeft and marginLeft 3474 // are the same in Safari causing offset.left to incorrectly be 0 3475 offset.top -= num( this, 'marginTop' ); 3476 offset.left -= num( this, 'marginLeft' ); 3477 3478 // Add offsetParent borders 3479 parentOffset.top += num( offsetParent, 'borderTopWidth' ); 3480 parentOffset.left += num( offsetParent, 'borderLeftWidth' ); 3481 3482 // Subtract the two offsets 3483 results = { 3484 top: offset.top - parentOffset.top, 3485 left: offset.left - parentOffset.left 3486 }; 3487 } 3488 3489 return results; 3490 }, 3491 3492 offsetParent: function() { 3493 var offsetParent = this[0].offsetParent; 3494 while ( offsetParent && (!/^body|html$/i.test(offsetParent.tagName) && jQuery.css(offsetParent, 'position') == 'static') ) 3495 offsetParent = offsetParent.offsetParent; 3496 return jQuery(offsetParent); 3497 } 3498}); 3499 3500 3501// Create scrollLeft and scrollTop methods 3502jQuery.each( ['Left', 'Top'], function(i, name) { 3503 var method = 'scroll' + name; 3504 3505 jQuery.fn[ method ] = function(val) { 3506 if (!this[0]) return; 3507 3508 return val != undefined ? 3509 3510 // Set the scroll offset 3511 this.each(function() { 3512 this == window || this == document ? 3513 window.scrollTo( 3514 !i ? val : jQuery(window).scrollLeft(), 3515 i ? val : jQuery(window).scrollTop() 3516 ) : 3517 this[ method ] = val; 3518 }) : 3519 3520 // Return the scroll offset 3521 this[0] == window || this[0] == document ? 3522 self[ i ? 'pageYOffset' : 'pageXOffset' ] || 3523 jQuery.boxModel && document.documentElement[ method ] || 3524 document.body[ method ] : 3525 this[0][ method ]; 3526 }; 3527}); 3528// Create innerHeight, innerWidth, outerHeight and outerWidth methods 3529jQuery.each([ "Height", "Width" ], function(i, name){ 3530 3531 var tl = i ? "Left" : "Top", // top or left 3532 br = i ? "Right" : "Bottom"; // bottom or right 3533
3534 // innerHeight and innerWidth 3535 jQuery.fn["inner" + name] = function(){ 3536 return this[ name.toLowerCase() ]() + 3537 num(this, "padding" + tl) + 3538 num(this, "padding" + br); 3539 }; 3540 3541 // outerHeight and outerWidth 3542 jQuery.fn["outer" + name] = function(margin) { 3543 return this["inner" + name]() + 3544 num(this, "border" + tl + "Width") + 3545 num(this, "border" + br + "Width") + 3546 (margin ? 3547 num(this, "margin" + tl) + num(this, "margin" + br) : 0); 3548 }; 3549 3550});})(); 3551
Line numbers count LF bytes from the start of the resource, as the search results do. Vendor segments are library code the classifier recognised; they are stored but not indexed. Bytes are shown as Latin1 characters, one per byte.