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