Make WordPress Core

Changeset 16318


Ignore:
Timestamp:
11/12/2010 07:13:11 AM (16 years ago)
Author:
nacin
Message:

jQuery 1.4.4. props demetris, fixes #15201, #15227.

Location:
trunk/wp-includes
Files:
2 edited

Legend:

Unmodified
Added
Removed
  • trunk/wp-includes/js/jquery/jquery.js

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

    r16314 r16318  
    122122        $scripts->add( 'cropper', '/wp-includes/js/crop/cropper.js', array('scriptaculous-dragdrop'), '20070118');
    123123
    124         $scripts->add( 'jquery', '/wp-includes/js/jquery/jquery.js', false, '1.4.4rc2');
     124        $scripts->add( 'jquery', '/wp-includes/js/jquery/jquery.js', false, '1.4.4');
    125125
    126126        $scripts->add( 'jquery-ui-core', '/wp-includes/js/jquery/ui.core.js', array('jquery'), '1.8.6' );
Note: See TracChangeset for help on using the changeset viewer.