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>