Annotation of embedaddon/strongswan/src/manager/templates/static/jquery.js, revision 1.1.1.1
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: })();
FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>