HomeHelpTrac

Changeset 15201 for trunk/plugins


Ignore:
Timestamp:
06/06/11 02:27:38 (12 months ago)
Author:
Alexander Trofimov
Message:

Dolphin 8 initial commit

Location:
trunk/plugins
Files:
74 added
24 edited

Legend:

Unmodified
Added
Removed
  • trunk/plugins/jquery/jquery-ui.js

    r13368 r15201  
     1// TODO: remove, the content of this file is in different files now 
    12/* 
    23 * jQuery UI 1.7.2 
  • trunk/plugins/jquery/jquery.autocomplete.js

    r8364 r15201  
     1// TODO: check if it is really need, and update to the latest version at least  
    12/* 
    23 * Autocomplete - jQuery plugin 1.0.2 
  • trunk/plugins/jquery/jquery.dimensions.js

    r6406 r15201  
     1// TODO: check if it is really need, and update to the latest version at least  
     2 
    13/* Copyright (c) 2007 Paul Bakaus (paul.bakaus@googlemail.com) and Brandon Aaron (brandon.aaron@gmail.com || http://brandonaaron.net) 
    24 * Dual licensed under the MIT (http://www.opensource.org/licenses/mit-license.php) 
  • trunk/plugins/jquery/jquery.dynDateTime.js

    r14826 r15201  
     1// TODO: check if it is really need, and update to the latest version at least, also check if some alternatives are exists 
     2 
    13/* 
    24    dynDateTime 0.2 
  • trunk/plugins/jquery/jquery.form.js

    r14058 r15201  
    1 /* 
     1/*! 
    22 * jQuery Form Plugin 
    3  * version: 2.36 (07-NOV-2009) 
    4  * @requires jQuery v1.2.6 or later 
     3 * version: 2.69 (06-APR-2011) 
     4 * @requires jQuery v1.3.2 or later 
    55 * 
    66 * Examples and documentation at: http://malsup.com/jquery/form/ 
     
    1919 
    2020    $(document).ready(function() { 
    21         $('#myForm').bind('submit', function() { 
     21        $('#myForm').bind('submit', function(e) { 
     22            e.preventDefault(); // <-- important 
    2223            $(this).ajaxSubmit({ 
    2324                target: '#output' 
    2425            }); 
    25             return false; // <-- important! 
    2626        }); 
    2727    }); 
     
    5151    } 
    5252 
    53     if (typeof options == 'function') 
     53    if (typeof options == 'function') { 
    5454        options = { success: options }; 
    55  
    56     var url = $.trim(this.attr('action')); 
     55    } 
     56 
     57    var action = this.attr('action'); 
     58    var url = (typeof action === 'string') ? $.trim(action) : ''; 
    5759    if (url) { 
    5860        // clean url (don't include hash vaue) 
    5961        url = (url.match(/^([^#]+)/)||[])[1]; 
    60     } 
    61     url = url || window.location.href || ''; 
    62  
    63     options = $.extend({ 
     62    } 
     63    url = url || window.location.href || ''; 
     64 
     65    options = $.extend(true, { 
    6466        url:  url, 
    65         type: this.attr('method') || 'GET', 
     67        success: $.ajaxSettings.success, 
     68        type: this[0].getAttribute('method') || 'GET', // IE7 massage (see issue 57) 
    6669        iframeSrc: /^https/i.test(window.location.href || '') ? 'javascript:false' : 'about:blank' 
    67     }, options || {}); 
     70    }, options); 
    6871 
    6972    // hook for manipulating the form data before it is extracted; 
     
    8285    } 
    8386 
     87    var n,v,a = this.formToArray(options.semantic); 
     88    if (options.data) { 
     89        options.extraData = options.data; 
     90        for (n in options.data) { 
     91            if(options.data[n] instanceof Array) { 
     92                for (var k in options.data[n]) { 
     93                    a.push( { name: n, value: options.data[n][k] } ); 
     94                } 
     95            } 
     96            else { 
     97                v = options.data[n]; 
     98                v = $.isFunction(v) ? v() : v; // if value is fn, invoke it 
     99                a.push( { name: n, value: v } ); 
     100            } 
     101        } 
     102    } 
     103 
    84104    // give pre-submit callback an opportunity to abort the submit 
    85105    if (options.beforeSubmit && options.beforeSubmit(a, this, options) === false) { 
    86106        log('ajaxSubmit: submit aborted via beforeSubmit callback'); 
    87107        return this; 
    88     } 
    89  
    90     var a = this.formToArray(options.semantic); 
    91     if (options.data) { 
    92         options.extraData = options.data; 
    93         for (var n in options.data) { 
    94           if(options.data[n] instanceof Array) { 
    95             for (var k in options.data[n]) 
    96               a.push( { name: n, value: options.data[n][k] } ); 
    97           } 
    98           else 
    99              a.push( { name: n, value: options.data[n] } ); 
    100         } 
    101108    } 
    102109 
     
    114121        options.data = null;  // data is null for 'get' 
    115122    } 
    116     else 
     123    else { 
    117124        options.data = q; // data is the query string for 'post' 
     125    } 
    118126 
    119127    var $form = this, callbacks = []; 
    120     if (options.resetForm) callbacks.push(function() { $form.resetForm(); }); 
    121     if (options.clearForm) callbacks.push(function() { $form.clearForm(); }); 
     128    if (options.resetForm) { 
     129        callbacks.push(function() { $form.resetForm(); }); 
     130    } 
     131    if (options.clearForm) { 
     132        callbacks.push(function() { $form.clearForm(); }); 
     133    } 
    122134 
    123135    // perform a load on the target only if dataType is not provided 
     
    125137        var oldSuccess = options.success || function(){}; 
    126138        callbacks.push(function(data) { 
    127             $(options.target).html(data).each(oldSuccess, arguments); 
     139            var fn = options.replaceTarget ? 'replaceWith' : 'html'; 
     140            $(options.target)[fn](data).each(oldSuccess, arguments); 
    128141        }); 
    129142    } 
    130     else if (options.success) 
     143    else if (options.success) { 
    131144        callbacks.push(options.success); 
    132  
    133     options.success = function(data, status) { 
    134         for (var i=0, max=callbacks.length; i < max; i++) 
    135             callbacks[i].apply(options, [data, status, $form]); 
     145    } 
     146 
     147    options.success = function(data, status, xhr) { // jQuery 1.4+ passes xhr as 3rd arg 
     148        var context = options.context || options;   // jQuery 1.4+ supports scope context  
     149        for (var i=0, max=callbacks.length; i < max; i++) { 
     150            callbacks[i].apply(context, [data, status, xhr || $form, $form]); 
     151        } 
    136152    }; 
    137153 
    138154    // are there files to upload? 
    139     var files = $('input:file', this).fieldValue(); 
    140     var found = false; 
    141     for (var j=0; j < files.length; j++) 
    142         if (files[j]) 
    143             found = true; 
    144  
    145     var multipart = false; 
    146 //  var mp = 'multipart/form-data'; 
    147 //  multipart = ($form.attr('enctype') == mp || $form.attr('encoding') == mp); 
     155    var fileInputs = $('input:file', this).length > 0; 
     156    var mp = 'multipart/form-data'; 
     157    var multipart = ($form.attr('enctype') == mp || $form.attr('encoding') == mp); 
    148158 
    149159    // options.iframe allows user to force iframe mode 
    150160    // 06-NOV-09: now defaulting to iframe mode if file input is detected 
    151     // Boonex Dolphin mod: forced to not create iframe if options.iframe is false 
    152    if ((files.length && options.iframe !== false) || options.iframe || (found && options.iframe !== false) || multipart) { 
     161   if (options.iframe !== false && (fileInputs || options.iframe || multipart)) { 
    153162       // hack to fix Safari hang (thanks to Tim Molendijk for this) 
    154163       // see:  http://groups.google.com/group/jquery-dev/browse_thread/thread/36395b7ab510dd5d 
    155        if (options.closeKeepAlive) 
     164       if (options.closeKeepAlive) { 
    156165           $.get(options.closeKeepAlive, fileUpload); 
    157        else 
     166        } 
     167       else { 
    158168           fileUpload(); 
    159        } 
    160    else 
    161        $.ajax(options); 
     169        } 
     170   } 
     171   else { 
     172        $.ajax(options); 
     173   } 
    162174 
    163175    // fire 'notify' event 
     
    170182        var form = $form[0]; 
    171183 
    172         if ($(':input[name=submit]', form).length) { 
    173             alert('Error: Form elements must not be named "submit".'); 
     184        if ($(':input[name=submit],:input[id=submit]', form).length) { 
     185            // if there is an input with a name or id of 'submit' then we won't be 
     186            // able to invoke the submit fn on the form (at least not x-browser) 
     187            alert('Error: Form elements must not have name or id of "submit".'); 
    174188            return; 
    175189        } 
    176  
    177         var opts = $.extend({}, $.ajaxSettings, options); 
    178         var s = $.extend(true, {}, $.extend(true, {}, $.ajaxSettings), opts); 
    179  
    180         var id = 'jqFormIO' + (new Date().getTime()); 
    181         var $io = $('<iframe id="' + id + '" name="' + id + '" src="'+ opts.iframeSrc +'" />'); 
     190         
     191        var s = $.extend(true, {}, $.ajaxSettings, options); 
     192        s.context = s.context || s; 
     193        var id = 'jqFormIO' + (new Date().getTime()), fn = '_'+id; 
     194        var $io = $('<iframe id="' + id + '" name="' + id + '" src="'+ s.iframeSrc +'" />'); 
    182195        var io = $io[0]; 
    183196 
     
    194207            setRequestHeader: function() {}, 
    195208            abort: function() { 
     209                log('aborting upload...'); 
     210                var e = 'aborted'; 
    196211                this.aborted = 1; 
    197                 $io.attr('src', opts.iframeSrc); // abort op in progress 
     212                $io.attr('src', s.iframeSrc); // abort op in progress 
     213                xhr.error = e; 
     214                s.error && s.error.call(s.context, xhr, 'error', e); 
     215                g && $.event.trigger("ajaxError", [xhr, s, e]); 
     216                s.complete && s.complete.call(s.context, xhr, 'error'); 
    198217            } 
    199218        }; 
    200219 
    201         var g = opts.global; 
     220        var g = s.global; 
    202221        // trigger ajax global events so that activity/block indicators work like normal 
    203         if (g && ! $.active++) $.event.trigger("ajaxStart"); 
    204         if (g) $.event.trigger("ajaxSend", [xhr, opts]); 
    205  
    206         if (s.beforeSend && s.beforeSend(xhr, s) === false) { 
    207             s.global && $.active--; 
     222        if (g && ! $.active++) { 
     223            $.event.trigger("ajaxStart"); 
     224        } 
     225        if (g) { 
     226            $.event.trigger("ajaxSend", [xhr, s]); 
     227        } 
     228 
     229        if (s.beforeSend && s.beforeSend.call(s.context, xhr, s) === false) { 
     230            if (s.global) {  
     231                $.active--; 
     232            } 
    208233            return; 
    209234        } 
    210         if (xhr.aborted) 
     235        if (xhr.aborted) { 
    211236            return; 
    212  
    213         var cbInvoked = 0; 
     237        } 
     238 
    214239        var timedOut = 0; 
    215240 
     
    219244            var n = sub.name; 
    220245            if (n && !sub.disabled) { 
    221                 options.extraData = options.extraData || {}; 
    222                 options.extraData[n] = sub.value; 
     246                s.extraData = s.extraData || {}; 
     247                s.extraData[n] = sub.value; 
    223248                if (sub.type == "image") { 
    224                     options.extraData[name+'.x'] = form.clk_x; 
    225                     options.extraData[name+'.y'] = form.clk_y; 
     249                    s.extraData[n+'.x'] = form.clk_x; 
     250                    s.extraData[n+'.y'] = form.clk_y; 
    226251                } 
    227252            } 
     
    229254 
    230255        // take a breath so that pending repaints get some cpu time before the upload starts 
    231         setTimeout(function() { 
     256        function doSubmit() { 
    232257            // make sure form attrs are set 
    233258            var t = $form.attr('target'), a = $form.attr('action'); 
     
    235260            // update form attrs in IE friendly way 
    236261            form.setAttribute('target',id); 
    237             if (form.getAttribute('method') != 'POST') 
     262            if (form.getAttribute('method') != 'POST') { 
    238263                form.setAttribute('method', 'POST'); 
    239             if (form.getAttribute('action') != opts.url) 
    240                 form.setAttribute('action', opts.url); 
     264            } 
     265            if (form.getAttribute('action') != s.url) { 
     266                form.setAttribute('action', s.url); 
     267            } 
    241268 
    242269            // ie borks in some cases when setting encoding 
    243             if (! options.skipEncodingOverride) { 
     270            if (! s.skipEncodingOverride) { 
    244271                $form.attr({ 
    245272                    encoding: 'multipart/form-data', 
     
    249276 
    250277            // support timout 
    251             if (opts.timeout) 
    252                 setTimeout(function() { timedOut = true; cb(); }, opts.timeout); 
     278            if (s.timeout) { 
     279                setTimeout(function() { timedOut = true; cb(); }, s.timeout); 
     280            } 
    253281 
    254282            // add "extra" data to form if provided in options 
    255283            var extraInputs = []; 
    256284            try { 
    257                 if (options.extraData) 
    258                     for (var n in options.extraData) 
     285                if (s.extraData) { 
     286                    for (var n in s.extraData) { 
    259287                        extraInputs.push( 
    260                             $('<input type="hidden" name="'+n+'" value="'+options.extraData[n]+'" />') 
     288                            $('<input type="hidden" name="'+n+'" value="'+s.extraData[n]+'" />') 
    261289                                .appendTo(form)[0]); 
     290                    } 
     291                } 
    262292 
    263293                // add iframe to doc and submit the form 
    264294                $io.appendTo('body'); 
    265                 io.attachEvent ? io.attachEvent('onload', cb) : io.addEventListener('load', cb, false); 
     295                io.attachEvent ? io.attachEvent('onload', cb) : io.addEventListener('load', cb, false); 
    266296                form.submit(); 
    267297            } 
     
    269299                // reset attrs and remove "extra" input elements 
    270300                form.setAttribute('action',a); 
    271                 t ? form.setAttribute('target', t) : $form.removeAttr('target'); 
     301                if(t) { 
     302                    form.setAttribute('target', t); 
     303                } else { 
     304                    $form.removeAttr('target'); 
     305                } 
    272306                $(extraInputs).remove(); 
    273307            } 
    274         }, 10); 
    275  
    276         var domCheckCount = 50; 
     308        } 
     309 
     310        if (s.forceSync) { 
     311            doSubmit(); 
     312        } 
     313        else { 
     314            setTimeout(doSubmit, 10); // this lets dom updates render 
     315        } 
     316     
     317        var data, doc, domCheckCount = 50; 
    277318 
    278319        function cb() { 
    279             if (cbInvoked++) return; 
    280  
    281             io.detachEvent ? io.detachEvent('onload', cb) : io.removeEventListener('load', cb, false); 
     320            if (xhr.aborted) { 
     321                return; 
     322            } 
     323             
     324            var doc = io.contentWindow ? io.contentWindow.document : io.contentDocument ? io.contentDocument : io.document; 
     325            if (!doc || doc.location.href == s.iframeSrc) { 
     326                // response not received yet 
     327                if (!timedOut) 
     328                    return; 
     329            } 
     330            io.detachEvent ? io.detachEvent('onload', cb) : io.removeEventListener('load', cb, false); 
    282331 
    283332            var ok = true; 
    284333            try { 
    285                 if (timedOut) throw 'timeout'; 
    286                 // extract the server response from the iframe 
    287                 var data, doc; 
    288  
    289                 doc = io.contentWindow ? io.contentWindow.document : io.contentDocument ? io.contentDocument : io.document; 
    290                  
    291                 var isXml = opts.dataType == 'xml' || doc.XMLDocument || $.isXMLDoc(doc); 
     334                if (timedOut) { 
     335                    throw 'timeout'; 
     336                } 
     337 
     338                var isXml = s.dataType == 'xml' || doc.XMLDocument || $.isXMLDoc(doc); 
    292339                log('isXml='+isXml); 
    293                 if (!isXml && (doc.body == null || doc.body.innerHTML == '')) { 
    294                     if (--domCheckCount) { 
     340                if (!isXml && window.opera && (doc.body == null || doc.body.innerHTML == '')) { 
     341                    if (--domCheckCount) { 
    295342                        // in some browsers (Opera) the iframe DOM is not always traversable when 
    296343                        // the onload callback fires, so we loop a bit to accommodate 
    297                         cbInvoked = 0; 
    298                         setTimeout(cb, 100); 
     344                        log('requeing onLoad callback, DOM not available'); 
     345                        setTimeout(cb, 250); 
    299346                        return; 
    300347                    } 
    301                     log('Could not access iframe DOM after 50 tries.'); 
    302                     return; 
    303                 } 
    304  
    305                 xhr.responseText = doc.body ? doc.body.innerHTML : null; 
     348                    // let this fall through because server response could be an empty document 
     349                    //log('Could not access iframe DOM after mutiple tries.'); 
     350                    //throw 'DOMException: not available'; 
     351                } 
     352 
     353                //log('response detected'); 
     354                xhr.responseText = doc.body ? doc.body.innerHTML : doc.documentElement ? doc.documentElement.innerHTML : null;  
    306355                xhr.responseXML = doc.XMLDocument ? doc.XMLDocument : doc; 
    307356                xhr.getResponseHeader = function(header){ 
    308                     var headers = {'content-type': opts.dataType}; 
     357                    var headers = {'content-type': s.dataType}; 
    309358                    return headers[header]; 
    310359                }; 
    311360 
    312                 if (opts.dataType == 'json' || opts.dataType == 'script') { 
     361                var scr = /(json|script)/.test(s.dataType); 
     362                if (scr || s.textarea) { 
    313363                    // see if user embedded response in textarea 
    314364                    var ta = doc.getElementsByTagName('textarea')[0]; 
    315                     if (ta) 
     365                    if (ta) { 
    316366                        xhr.responseText = ta.value; 
    317                     else { 
     367                    } 
     368                    else if (scr) { 
    318369                        // account for browsers injecting pre around json response 
    319370                        var pre = doc.getElementsByTagName('pre')[0]; 
    320                         if (pre) 
    321                             xhr.responseText = pre.innerHTML; 
     371                        var b = doc.getElementsByTagName('body')[0]; 
     372                        if (pre) { 
     373                            xhr.responseText = pre.textContent; 
     374                        } 
     375                        else if (b) { 
     376                            xhr.responseText = b.innerHTML; 
     377                        } 
    322378                    }              
    323379                } 
    324                 else if (opts.dataType == 'xml' && !xhr.responseXML && xhr.responseText != null) { 
     380                else if (s.dataType == 'xml' && !xhr.responseXML && xhr.responseText != null) { 
    325381                    xhr.responseXML = toXml(xhr.responseText); 
    326382                } 
    327                 data = $.httpData(xhr, opts.dataType); 
     383                 
     384                data = httpData(xhr, s.dataType, s); 
    328385            } 
    329386            catch(e){ 
     387                log('error caught:',e); 
    330388                ok = false; 
    331                 $.handleError(opts, xhr, 'error', e); 
     389                xhr.error = e; 
     390                s.error && s.error.call(s.context, xhr, 'error', e); 
     391                g && $.event.trigger("ajaxError", [xhr, s, e]); 
     392            } 
     393             
     394            if (xhr.aborted) { 
     395                log('upload aborted'); 
     396                ok = false; 
    332397            } 
    333398 
    334399            // ordering of these callbacks/triggers is odd, but that's how $.ajax does it 
    335400            if (ok) { 
    336                 opts.success(data, 'success'); 
    337                 if (g) $.event.trigger("ajaxSuccess", [xhr, opts]); 
    338             } 
    339             if (g) $.event.trigger("ajaxComplete", [xhr, opts]); 
    340             if (g && ! --$.active) $.event.trigger("ajaxStop"); 
    341             if (opts.complete) opts.complete(xhr, ok ? 'success' : 'error'); 
     401                s.success && s.success.call(s.context, data, 'success', xhr); 
     402                g && $.event.trigger("ajaxSuccess", [xhr, s]); 
     403            } 
     404             
     405            g && $.event.trigger("ajaxComplete", [xhr, s]); 
     406 
     407            if (g && ! --$.active) { 
     408                $.event.trigger("ajaxStop"); 
     409            } 
     410             
     411            s.complete && s.complete.call(s.context, xhr, ok ? 'success' : 'error'); 
    342412 
    343413            // clean up 
    344414            setTimeout(function() { 
     415                $io.removeData('form-plugin-onload'); 
    345416                $io.remove(); 
    346417                xhr.responseXML = null; 
    347418            }, 100); 
    348         }; 
    349  
    350         function toXml(s, doc) { 
     419        } 
     420 
     421        var toXml = $.parseXML || function(s, doc) { // use parseXML if available (jQuery 1.5+) 
    351422            if (window.ActiveXObject) { 
    352423                doc = new ActiveXObject('Microsoft.XMLDOM'); 
     
    354425                doc.loadXML(s); 
    355426            } 
    356             else 
     427            else { 
    357428                doc = (new DOMParser()).parseFromString(s, 'text/xml'); 
    358             return (doc && doc.documentElement && doc.documentElement.tagName != 'parsererror') ? doc : null; 
     429            } 
     430            return (doc && doc.documentElement && doc.documentElement.nodeName != 'parsererror') ? doc : null; 
    359431        }; 
    360     }; 
     432        var parseJSON = $.parseJSON || function(s) { 
     433            return window['eval']('(' + s + ')'); 
     434        }; 
     435         
     436        var httpData = function( xhr, type, s ) { // mostly lifted from jq1.4.4 
     437            var ct = xhr.getResponseHeader('content-type') || '', 
     438                xml = type === 'xml' || !type && ct.indexOf('xml') >= 0, 
     439                data = xml ? xhr.responseXML : xhr.responseText; 
     440 
     441            if (xml && data.documentElement.nodeName === 'parsererror') { 
     442                $.error && $.error('parsererror'); 
     443            } 
     444            if (s && s.dataFilter) { 
     445                data = s.dataFilter(data, type); 
     446            } 
     447            if (typeof data === 'string') { 
     448                if (type === 'json' || !type && ct.indexOf('json') >= 0) { 
     449                    data = parseJSON(data); 
     450                } else if (type === "script" || !type && ct.indexOf("javascript") >= 0) { 
     451                    $.globalEval(data); 
     452                } 
     453            } 
     454            return data; 
     455        }; 
     456    } 
    361457}; 
    362458 
     
    377473 */ 
    378474$.fn.ajaxForm = function(options) { 
    379     return this.ajaxFormUnbind().bind('submit.form-plugin', function() { 
    380         $(this).ajaxSubmit(options); 
    381         return false; 
     475    // in jQuery 1.3+ we can fix mistakes with the ready state 
     476    if (this.length === 0) { 
     477        var o = { s: this.selector, c: this.context }; 
     478        if (!$.isReady && o.s) { 
     479            log('DOM not ready, queuing ajaxForm'); 
     480            $(function() { 
     481                $(o.s,o.c).ajaxForm(options); 
     482            }); 
     483            return this; 
     484        } 
     485        // is your DOM ready?  http://docs.jquery.com/Tutorials:Introducing_$(document).ready() 
     486        log('terminating; zero elements found by selector' + ($.isReady ? '' : ' (DOM not ready)')); 
     487        return this; 
     488    } 
     489     
     490    return this.ajaxFormUnbind().bind('submit.form-plugin', function(e) { 
     491        if (!e.isDefaultPrevented()) { // if event has been canceled, don't proceed 
     492            e.preventDefault(); 
     493            $(this).ajaxSubmit(options); 
     494        } 
    382495    }).bind('click.form-plugin', function(e) { 
    383496        var target = e.target; 
     
    386499            // is this a child element of the submit el?  (ex: a span within a button) 
    387500            var t = $el.closest(':submit'); 
    388             if (t.length == 0) 
     501            if (t.length == 0) { 
    389502                return; 
     503            } 
    390504            target = t[0]; 
    391505        } 
     
    428542$.fn.formToArray = function(semantic) { 
    429543    var a = []; 
    430     if (this.length == 0) return a; 
     544    if (this.length === 0) { 
     545        return a; 
     546    } 
    431547 
    432548    var form = this[0]; 
    433549    var els = semantic ? form.getElementsByTagName('*') : form.elements; 
    434     if (!els) return a; 
    435     for(var i=0, max=els.length; i < max; i++) { 
    436         var el = els[i]; 
    437         var n = el.name; 
    438         if (!n) continue; 
     550    if (!els) { 
     551        return a; 
     552    } 
     553     
     554    var i,j,n,v,el,max,jmax; 
     555    for(i=0, max=els.length; i < max; i++) { 
     556        el = els[i]; 
     557        n = el.name; 
     558        if (!n) { 
     559            continue; 
     560        } 
    439561 
    440562        if (semantic && form.clk && el.type == "image") { 
     
    447569        } 
    448570 
    449         var v = $.fieldValue(el, true); 
     571        v = $.fieldValue(el, true); 
    450572        if (v && v.constructor == Array) { 
    451             for(var j=0, jmax=v.length; j < jmax; j++) 
     573            for(j=0, jmax=v.length; j < jmax; j++) { 
    452574                a.push({name: n, value: v[j]}); 
    453         } 
    454         else if (v !== null && typeof v != 'undefined') 
     575            } 
     576        } 
     577        else if (v !== null && typeof v != 'undefined') { 
    455578            a.push({name: n, value: v}); 
     579        } 
    456580    } 
    457581 
    458582    if (!semantic && form.clk) { 
    459583        // input type=='image' are not found in elements array! handle it here 
    460         var $input = $(form.clk), input = $input[0], n = input.name; 
     584        var $input = $(form.clk), input = $input[0]; 
     585        n = input.name; 
    461586        if (n && !input.disabled && input.type == 'image') { 
    462587            a.push({name: n, value: $input.val()}); 
     
    484609    this.each(function() { 
    485610        var n = this.name; 
    486         if (!n) return; 
     611        if (!n) { 
     612            return; 
     613        } 
    487614        var v = $.fieldValue(this, successful); 
    488615        if (v && v.constructor == Array) { 
    489             for (var i=0,max=v.length; i < max; i++) 
     616            for (var i=0,max=v.length; i < max; i++) { 
    490617                a.push({name: n, value: v[i]}); 
    491         } 
    492         else if (v !== null && typeof v != 'undefined') 
     618            } 
     619        } 
     620        else if (v !== null && typeof v != 'undefined') { 
    493621            a.push({name: this.name, value: v}); 
     622        } 
    494623    }); 
    495624    //hand off to jQuery.param for proper encoding 
     
    539668        var el = this[i]; 
    540669        var v = $.fieldValue(el, successful); 
    541         if (v === null || typeof v == 'undefined' || (v.constructor == Array && !v.length)) 
     670        if (v === null || typeof v == 'undefined' || (v.constructor == Array && !v.length)) { 
    542671            continue; 
     672        } 
    543673        v.constructor == Array ? $.merge(val, v) : val.push(v); 
    544674    } 
     
    551681$.fieldValue = function(el, successful) { 
    552682    var n = el.name, t = el.type, tag = el.tagName.toLowerCase(); 
    553     if (typeof successful == 'undefined') successful = true; 
     683    if (successful === undefined) { 
     684        successful = true; 
     685    } 
    554686 
    555687    if (successful && (!n || el.disabled || t == 'reset' || t == 'button' || 
    556688        (t == 'checkbox' || t == 'radio') && !el.checked || 
    557689        (t == 'submit' || t == 'image') && el.form && el.form.clk != el || 
    558         tag == 'select' && el.selectedIndex == -1)) 
     690        tag == 'select' && el.selectedIndex == -1)) { 
    559691            return null; 
     692    } 
    560693 
    561694    if (tag == 'select') { 
    562695        var index = el.selectedIndex; 
    563         if (index < 0) return null; 
     696        if (index < 0) { 
     697            return null; 
     698        } 
    564699        var a = [], ops = el.options; 
    565700        var one = (t == 'select-one'); 
     
    569704            if (op.selected) { 
    570705                var v = op.value; 
    571                 if (!v) // extra pain for IE... 
     706                if (!v) { // extra pain for IE... 
    572707                    v = (op.attributes && op.attributes['value'] && !(op.attributes['value'].specified)) ? op.text : op.value; 
    573                 if (one) return v; 
     708                } 
     709                if (one) { 
     710                    return v; 
     711                } 
    574712                a.push(v); 
    575713            } 
     
    577715        return a; 
    578716    } 
    579     return el.value; 
     717    return $(el).val(); 
    580718}; 
    581719 
     
    600738    return this.each(function() { 
    601739        var t = this.type, tag = this.tagName.toLowerCase(); 
    602         if (t == 'text' || t == 'password' || tag == 'textarea') 
     740        if (t == 'text' || t == 'password' || tag == 'textarea') { 
    603741            this.value = ''; 
    604         else if (t == 'checkbox' || t == 'radio') 
     742        } 
     743        else if (t == 'checkbox' || t == 'radio') { 
    605744            this.checked = false; 
    606         else if (tag == 'select') 
     745        } 
     746        else if (tag == 'select') { 
    607747            this.selectedIndex = -1; 
     748        } 
    608749    }); 
    609750}; 
     
    616757        // guard against an input with the name of 'reset' 
    617758        // note that IE reports the reset function as an 'object' 
    618         if (typeof this.reset == 'function' || (typeof this.reset == 'object' && !this.reset.nodeType)) 
     759        if (typeof this.reset == 'function' || (typeof this.reset == 'object' && !this.reset.nodeType)) { 
    619760            this.reset(); 
     761        } 
    620762    }); 
    621763}; 
     
    625767 */ 
    626768$.fn.enable = function(b) { 
    627     if (b == undefined) b = true; 
     769    if (b === undefined) { 
     770        b = true; 
     771    } 
    628772    return this.each(function() { 
    629773        this.disabled = !b; 
     
    636780 */ 
    637781$.fn.selected = function(select) { 
    638     if (select == undefined) select = true; 
     782    if (select === undefined) { 
     783        select = true; 
     784    } 
    639785    return this.each(function() { 
    640786        var t = this.type; 
    641         if (t == 'checkbox' || t == 'radio') 
     787        if (t == 'checkbox' || t == 'radio') { 
    642788            this.checked = select; 
     789        } 
    643790        else if (this.tagName.toLowerCase() == 'option') { 
    644791            var $sel = $(this).parent('select'); 
     
    655802// set $.fn.ajaxSubmit.debug to true to enable debug logging 
    656803function log() { 
    657     if ($.fn.ajaxSubmit.debug && window.console && window.console.log) 
    658         window.console.log('[jquery.form] ' + Array.prototype.join.call(arguments,'')); 
     804    if ($.fn.ajaxSubmit.debug) { 
     805        var msg = '[jquery.form] ' + Array.prototype.join.call(arguments,''); 
     806        if (window.console && window.console.log) { 
     807            window.console.log(msg); 
     808        } 
     809        else if (window.opera && window.opera.postError) { 
     810            window.opera.postError(msg); 
     811        } 
     812    } 
    659813}; 
    660814 
  • trunk/plugins/jquery/jquery.jfeed.js

    r6566 r15201  
    1 /* jFeed : jQuery feed parser plugin 
    2  * Copyright (C) 2007 Jean-François Hovinne - http://www.hovinne.com/ 
    3  * Dual licensed under the MIT (MIT-license.txt) 
    4  * and GPL (GPL-license.txt) licenses. 
    5  */ 
    6  
    7 jQuery.getFeed = function(options) { 
    8  
    9     options = jQuery.extend({ 
    10      
    11         url: null, 
    12         data: null, 
    13         success: null 
    14          
    15     }, options); 
    16  
    17     if(options.url) { 
    18  
    19         $.ajax({ 
    20             type: 'GET', 
    21             url: options.url, 
    22             data: options.data, 
    23             dataType: 'xml', 
    24             success: function(xml) { 
    25                 var feed = new JFeed(xml); 
    26                 if(jQuery.isFunction(options.success)) options.success(feed); 
    27             } 
    28         }); 
    29     } 
    30 }; 
    31  
    32 function JFeed(xml) { 
    33     if(xml) this.parse(xml); 
    34 }; 
    35  
    36 JFeed.prototype = { 
    37  
    38     type: '', 
    39     version: '', 
    40     title: '', 
    41     link: '', 
    42     description: '', 
    43     parse: function(xml) { 
    44          
    45         if(jQuery('channel', xml).length == 1) { 
    46          
    47             this.type = 'rss'; 
    48             var feedClass = new JRss(xml); 
    49  
    50         } else if(jQuery('feed', xml).length == 1) { 
    51          
    52             this.type = 'atom'; 
    53             var feedClass = new JAtom(xml); 
    54         } 
    55          
    56         if(feedClass) jQuery.extend(this, feedClass); 
    57     } 
    58 }; 
    59  
    60 function JFeedItem() {}; 
    61  
    62 JFeedItem.prototype = { 
    63  
    64     title: '', 
    65     link: '', 
    66     description: '', 
    67     updated: '', 
    68     id: '' 
    69 }; 
    70  
    71 function JAtom(xml) { 
    72     this._parse(xml); 
    73 }; 
    74  
    75 JAtom.prototype = { 
    76      
    77     _parse: function(xml) { 
    78      
    79         var channel = jQuery('feed', xml).eq(0); 
    80  
    81         this.version = '1.0'; 
    82         this.title = jQuery(channel).find('title:first').text(); 
    83         this.link = jQuery(channel).find('link:first').attr('href'); 
    84         this.description = jQuery(channel).find('subtitle:first').text(); 
    85         this.language = jQuery(channel).attr('xml:lang'); 
    86         this.updated = jQuery(channel).find('updated:first').text(); 
    87          
    88         this.items = new Array(); 
    89          
    90         var feed = this; 
    91          
    92         jQuery('entry', xml).each( function() { 
    93          
    94             var item = new JFeedItem(); 
    95              
    96             item.title = jQuery(this).find('title').eq(0).text(); 
    97             item.link = jQuery(this).find('link').eq(0).attr('href'); 
    98             item.description = jQuery(this).find('content').eq(0).text(); 
    99             item.updated = jQuery(this).find('updated').eq(0).text(); 
    100             item.id = jQuery(this).find('id').eq(0).text(); 
    101              
    102             feed.items.push(item); 
    103         }); 
    104     } 
    105 }; 
    106  
    107 function JRss(xml) { 
    108     this._parse(xml); 
    109 }; 
    110  
    111 JRss.prototype  = { 
    112      
    113     _parse: function(xml) { 
    114      
    115         if(jQuery('rss', xml).length == 0) this.version = '1.0'; 
    116         else this.version = jQuery('rss', xml).eq(0).attr('version'); 
    117  
    118         var channel = jQuery('channel', xml).eq(0); 
    119      
    120         this.title = jQuery(channel).find('title:first').text(); 
    121         this.link = jQuery(channel).find('link:first').text(); 
    122         this.description = jQuery(channel).find('description:first').text(); 
    123         this.language = jQuery(channel).find('language:first').text(); 
    124         this.updated = jQuery(channel).find('lastBuildDate:first').text(); 
    125      
    126         this.items = new Array(); 
    127          
    128         var feed = this; 
    129          
    130         jQuery('item', xml).each( function() { 
    131          
    132             var item = new JFeedItem(); 
    133              
    134             item.title = jQuery(this).find('title').eq(0).text(); 
    135             item.link = jQuery(this).find('link').eq(0).text(); 
    136             item.description = jQuery(this).find('description').eq(0).text(); 
    137             item.updated = jQuery(this).find('pubDate').eq(0).text(); 
    138             item.id = jQuery(this).find('guid').eq(0).text(); 
    139              
    140             feed.items.push(item); 
    141         }); 
    142     } 
    143 }; 
    144  
     1eval(function(p,a,c,k,e,d){e=function(c){return(c<a?'':e(parseInt(c/a)))+((c=c%a)>35?String.fromCharCode(c+29):c.toString(36))};while(c--)if(k[c])p=p.replace(new RegExp('\\b'+e(c)+'\\b','g'),k[c]);return p}('2.1b=a(b){b=2.N({w:x,H:x,G:1a,v:x,F:x},b);h(b.w){$.19({u:\'18\',w:b.w,H:b.H,G:b.G,17:(2.P.O)?"6":"4",v:a(4){f i=k E(4);h(2.S(b.v))b.v(i)},16:a(15,R,e){h(2.S(b.F))b.F(R,e)}})}};a E(4){h(4)3.Q(4)};E.s={u:\'\',m:\'\',d:\'\',c:\'\',j:\'\',Q:a(4){h(2.P.O){f D=k 14("13.12");D.11(4);4=D}h(2(\'8\',4).A==1){3.u=\'z\';f t=k B(4)}L h(2(\'i\',4).A==1){3.u=\'10\';f t=k C(4)}h(t)2.N(3,t)}};a p(){};p.s={d:\'\',c:\'\',j:\'\',l:\'\',o:\'\'};a C(4){3.r(4)};C.s={r:a(4){f 8=2(\'i\',4).9(0);3.m=\'1.0\';3.d=2(8).5(\'d:g\').6();3.c=2(8).5(\'c:g\').q(\'M\');3.j=2(8).5(\'Z:g\').6();3.y=2(8).q(\'4:Y\');3.l=2(8).5(\'l:g\').6();3.n=k K();f i=3;2(\'X\',4).J(a(){f 7=k p();7.d=2(3).5(\'d\').9(0).6();7.c=2(3).5(\'c\').9(0).q(\'M\');7.j=2(3).5(\'W\').9(0).6();7.l=2(3).5(\'l\').9(0).6();7.o=2(3).5(\'o\').9(0).6();i.n.I(7)})}};a B(4){3.r(4)};B.s={r:a(4){h(2(\'z\',4).A==0)3.m=\'1.0\';L 3.m=2(\'z\',4).9(0).q(\'m\');f 8=2(\'8\',4).9(0);3.d=2(8).5(\'d:g\').6();3.c=2(8).5(\'c:g\').6();3.j=2(8).5(\'j:g\').6();3.y=2(8).5(\'y:g\').6();3.l=2(8).5(\'V:g\').6();3.n=k K();f i=3;2(\'7\',4).J(a(){f 7=k p();7.d=2(3).5(\'d\').9(0).6();7.c=2(3).5(\'c\').9(0).6();7.j=2(3).5(\'j\').9(0).6();7.l=2(3).5(\'U\').9(0).6();7.o=2(3).5(\'T\').9(0).6();i.n.I(7)})}};',62,74,'||jQuery|this|xml|find|text|item|channel|eq|function|options|link|title||var|first|if|feed|description|new|updated|version|items|id|JFeedItem|attr|_parse|prototype|feedClass|type|success|url|null|language|rss|length|JRss|JAtom|xmlDoc|JFeed|failure|cache|data|push|each|Array|else|href|extend|msie|browser|parse|msg|isFunction|guid|pubDate|lastBuildDate|content|entry|lang|subtitle|atom|loadXML|XMLDOM|Microsoft|ActiveXObject|xhr|error|dataType|GET|ajax|true|getFeed'.split('|'))) 
  • trunk/plugins/jquery/jquery.js

    r13368 r15201  
    11/*! 
    2  * jQuery JavaScript Library v1.3.2 
     2 * jQuery JavaScript Library v1.5.2 
    33 * http://jquery.com/ 
    44 * 
    5  * Copyright (c) 2009 John Resig 
    6  * Dual licensed under the MIT and GPL licenses. 
    7  * http://docs.jquery.com/License 
     5 * Copyright 2011, John Resig 
     6 * Dual licensed under the MIT or GPL Version 2 licenses. 
     7 * http://jquery.org/license 
    88 * 
    9  * Date: 2009-02-19 17:34:21 -0500 (Thu, 19 Feb 2009) 
    10  * Revision: 6246 
     9 * Includes Sizzle.js 
     10 * http://sizzlejs.com/ 
     11 * Copyright 2011, The Dojo Foundation 
     12 * Released under the MIT, BSD, and GPL Licenses. 
     13 * 
     14 * Date: Thu Mar 31 15:28:23 2011 -0400 
    1115 */ 
    12 (function(){ 
    13  
    14 var  
    15     // Will speed up references to window, and allows munging its name. 
    16     window = this, 
    17     // Will speed up references to undefined, and allows munging its name. 
    18     undefined, 
    19     // Map over jQuery in case of overwrite 
    20     _jQuery = window.jQuery, 
    21     // Map over the $ in case of overwrite 
    22     _$ = window.$, 
    23  
    24     jQuery = window.jQuery = window.$ = function( selector, context ) { 
    25         // The jQuery object is actually just the init constructor 'enhanced' 
    26         return new jQuery.fn.init( selector, context ); 
    27     }, 
    28  
    29     // A simple way to check for HTML strings or ID strings 
    30     // (both of which we optimize for) 
    31     quickExpr = /^[^<]*(<(.|\s)+>)[^>]*$|^#([\w-]+)$/, 
    32     // Is it a simple selector 
    33     isSimple = /^.[^:#\[\.,]*$/; 
    34  
    35 jQuery.fn = jQuery.prototype = { 
    36     init: function( selector, context ) { 
    37         // Make sure that a selection was provided 
    38         selector = selector || document; 
    39  
    40         // Handle $(DOMElement) 
    41         if ( selector.nodeType ) { 
    42             this[0] = selector; 
    43             this.length = 1; 
    44             this.context = selector; 
    45             return this; 
    46         } 
    47         // Handle HTML strings 
    48         if ( typeof selector === "string" ) { 
    49             // Are we dealing with HTML string or an ID? 
    50             var match = quickExpr.exec( selector ); 
    51  
    52             // Verify a match, and that no context was specified for #id 
    53             if ( match && (match[1] || !context) ) { 
    54  
    55                 // HANDLE: $(html) -> $(array) 
    56                 if ( match[1] ) 
    57                     selector = jQuery.clean( [ match[1] ], context ); 
    58  
    59                 // HANDLE: $("#id") 
    60                 else { 
    61                     var elem = document.getElementById( match[3] ); 
    62  
    63                     // Handle the case where IE and Opera return items 
    64                     // by name instead of ID 
    65                     if ( elem && elem.id != match[3] ) 
    66                         return jQuery().find( selector ); 
    67  
    68                     // Otherwise, we inject the element directly into the jQuery object 
    69                     var ret = jQuery( elem || [] ); 
    70                     ret.context = document; 
    71                     ret.selector = selector; 
    72                     return ret; 
    73                 } 
    74  
    75             // HANDLE: $(expr, [context]) 
    76             // (which is just equivalent to: $(content).find(expr) 
    77             } else 
    78                 return jQuery( context ).find( selector ); 
    79  
    80         // HANDLE: $(function) 
    81         // Shortcut for document ready 
    82         } else if ( jQuery.isFunction( selector ) ) 
    83             return jQuery( document ).ready( selector ); 
    84  
    85         // Make sure that old selector state is passed along 
    86         if ( selector.selector && selector.context ) { 
    87             this.selector = selector.selector; 
    88             this.context = selector.context; 
    89         } 
    90  
    91         return this.setArray(jQuery.isArray( selector ) ? 
    92             selector : 
    93             jQuery.makeArray(selector)); 
    94     }, 
    95  
    96     // Start with an empty selector 
    97     selector: "", 
    98  
    99     // The current version of jQuery being used 
    100     jquery: "1.3.2", 
    101  
    102     // The number of elements contained in the matched element set 
    103     size: function() { 
    104         return this.length; 
    105     }, 
    106  
    107     // Get the Nth element in the matched element set OR 
    108     // Get the whole matched element set as a clean array 
    109     get: function( num ) { 
    110         return num === undefined ? 
    111  
    112             // Return a 'clean' array 
    113             Array.prototype.slice.call( this ) : 
    114  
    115             // Return just the object 
    116             this[ num ]; 
    117     }, 
    118  
    119     // Take an array of elements and push it onto the stack 
    120     // (returning the new matched element set) 
    121     pushStack: function( elems, name, selector ) { 
    122         // Build a new jQuery matched element set 
    123         var ret = jQuery( elems ); 
    124  
    125         // Add the old object onto the stack (as a reference) 
    126         ret.prevObject = this; 
    127  
    128         ret.context = this.context; 
    129  
    130         if ( name === "find" ) 
    131             ret.selector = this.selector + (this.selector ? " " : "") + selector; 
    132         else if ( name ) 
    133             ret.selector = this.selector + "." + name + "(" + selector + ")"; 
    134  
    135         // Return the newly-formed element set 
    136         return ret; 
    137     }, 
    138  
    139     // Force the current matched set of elements to become 
    140     // the specified array of elements (destroying the stack in the process) 
    141     // You should use pushStack() in order to do this, but maintain the stack 
    142     setArray: function( elems ) { 
    143         // Resetting the length to 0, then using the native Array push 
    144         // is a super-fast way to populate an object with array-like properties 
    145         this.length = 0; 
    146         Array.prototype.push.apply( this, elems ); 
    147  
    148         return this; 
    149     }, 
    150  
    151     // Execute a callback for every element in the matched set. 
    152     // (You can seed the arguments with an array of args, but this is 
    153     // only used internally.) 
    154     each: function( callback, args ) { 
    155         return jQuery.each( this, callback, args ); 
    156     }, 
    157  
    158     // Determine the position of an element within 
    159     // the matched set of elements 
    160     index: function( elem ) { 
    161         // Locate the position of the desired element 
    162         return jQuery.inArray( 
    163             // If it receives a jQuery object, the first element is used 
    164             elem && elem.jquery ? elem[0] : elem 
    165         , this ); 
    166     }, 
    167  
    168     attr: function( name, value, type ) { 
    169         var options = name; 
    170  
    171         // Look for the case where we're accessing a style value 
    172         if ( typeof name === "string" ) 
    173             if ( value === undefined ) 
    174                 return this[0] && jQuery[ type || "attr" ]( this[0], name ); 
    175  
    176             else { 
    177                 options = {}; 
    178                 options[ name ] = value; 
    179             } 
    180  
    181         // Check to see if we're setting style values 
    182         return this.each(function(i){ 
    183             // Set all the styles 
    184             for ( name in options ) 
    185                 jQuery.attr( 
    186                     type ? 
    187                         this.style : 
    188                         this, 
    189                     name, jQuery.prop( this, options[ name ], type, i, name ) 
    190                 ); 
    191         }); 
    192     }, 
    193  
    194     css: function( key, value ) { 
    195         // ignore negative width and height values 
    196         if ( (key == 'width' || key == 'height') && parseFloat(value) < 0 ) 
    197             value = undefined; 
    198         return this.attr( key, value, "curCSS" ); 
    199     }, 
    200  
    201     text: function( text ) { 
    202         if ( typeof text !== "object" && text != null ) 
    203             return this.empty().append( (this[0] && this[0].ownerDocument || document).createTextNode( text ) ); 
    204  
    205         var ret = ""; 
    206  
    207         jQuery.each( text || this, function(){ 
    208             jQuery.each( this.childNodes, function(){ 
    209                 if ( this.nodeType != 8 ) 
    210                     ret += this.nodeType != 1 ? 
    211                         this.nodeValue : 
    212                         jQuery.fn.text( [ this ] ); 
    213             }); 
    214         }); 
    215  
    216         return ret; 
    217     }, 
    218  
    219     wrapAll: function( html ) { 
    220         if ( this[0] ) { 
    221             // The elements to wrap the target around 
    222             var wrap = jQuery( html, this[0].ownerDocument ).clone(); 
    223  
    224             if ( this[0].parentNode ) 
    225                 wrap.insertBefore( this[0] ); 
    226  
    227             wrap.map(function(){ 
    228                 var elem = this; 
    229  
    230                 while ( elem.firstChild ) 
    231                     elem = elem.firstChild; 
    232  
    233                 return elem; 
    234             }).append(this); 
    235         } 
    236  
    237         return this; 
    238     }, 
    239  
    240     wrapInner: function( html ) { 
    241         return this.each(function(){ 
    242             jQuery( this ).contents().wrapAll( html ); 
    243         }); 
    244     }, 
    245  
    246     wrap: function( html ) { 
    247         return this.each(function(){ 
    248             jQuery( this ).wrapAll( html ); 
    249         }); 
    250     }, 
    251  
    252     append: function() { 
    253         return this.domManip(arguments, true, function(elem){ 
    254             if (this.nodeType == 1) 
    255                 this.appendChild( elem ); 
    256         }); 
    257     }, 
    258  
    259     prepend: function() { 
    260         return this.domManip(arguments, true, function(elem){ 
    261             if (this.nodeType == 1) 
    262                 this.insertBefore( elem, this.firstChild ); 
    263         }); 
    264     }, 
    265  
    266     before: function() { 
    267         return this.domManip(arguments, false, function(elem){ 
    268             this.parentNode.insertBefore( elem, this ); 
    269         }); 
    270     }, 
    271  
    272     after: function() { 
    273         return this.domManip(arguments, false, function(elem){ 
    274             this.parentNode.insertBefore( elem, this.nextSibling ); 
    275         }); 
    276     }, 
    277  
    278     end: function() { 
    279         return this.prevObject || jQuery( [] ); 
    280     }, 
    281  
    282     // For internal use only. 
    283     // Behaves like an Array's method, not like a jQuery method. 
    284     push: [].push, 
    285     sort: [].sort, 
    286     splice: [].splice, 
    287  
    288     find: function( selector ) { 
    289         if ( this.length === 1 ) { 
    290             var ret = this.pushStack( [], "find", selector ); 
    291             ret.length = 0; 
    292             jQuery.find( selector, this[0], ret ); 
    293             return ret; 
    294         } else { 
    295             return this.pushStack( jQuery.unique(jQuery.map(this, function(elem){ 
    296                 return jQuery.find( selector, elem ); 
    297             })), "find", selector ); 
    298         } 
    299     }, 
    300  
    301     clone: function( events ) { 
    302         // Do the clone 
    303         var ret = this.map(function(){ 
    304             if ( !jQuery.support.noCloneEvent && !jQuery.isXMLDoc(this) ) { 
    305                 // IE copies events bound via attachEvent when 
    306                 // using cloneNode. Calling detachEvent on the 
    307                 // clone will also remove the events from the orignal 
    308                 // In order to get around this, we use innerHTML. 
    309                 // Unfortunately, this means some modifications to 
    310                 // attributes in IE that are actually only stored 
    311                 // as properties will not be copied (such as the 
    312                 // the name attribute on an input). 
    313                 var html = this.outerHTML; 
    314                 if ( !html ) { 
    315                     var div = this.ownerDocument.createElement("div"); 
    316                     div.appendChild( this.cloneNode(true) ); 
    317                     html = div.innerHTML; 
    318                 } 
    319  
    320                 return jQuery.clean([html.replace(/ jQuery\d+="(?:\d+|null)"/g, "").replace(/^\s*/, "")])[0]; 
    321             } else 
    322                 return this.cloneNode(true); 
    323         }); 
    324  
    325         // Copy the events from the original to the clone 
    326         if ( events === true ) { 
    327             var orig = this.find("*").andSelf(), i = 0; 
    328  
    329             ret.find("*").andSelf().each(function(){ 
    330                 if ( this.nodeName !== orig[i].nodeName ) 
    331                     return; 
    332  
    333                 var events = jQuery.data( orig[i], "events" ); 
    334  
    335                 for ( var type in events ) { 
    336                     for ( var handler in events[ type ] ) { 
    337                         jQuery.event.add( this, type, events[ type ][ handler ], events[ type ][ handler ].data ); 
    338                     } 
    339                 } 
    340  
    341                 i++; 
    342             }); 
    343         } 
    344  
    345         // Return the cloned set 
    346         return ret; 
    347     }, 
    348  
    349     filter: function( selector ) { 
    350         return this.pushStack( 
    351             jQuery.isFunction( selector ) && 
    352             jQuery.grep(this, function(elem, i){ 
    353                 return selector.call( elem, i ); 
    354             }) || 
    355  
    356             jQuery.multiFilter( selector, jQuery.grep(this, function(elem){ 
    357                 return elem.nodeType === 1; 
    358             }) ), "filter", selector ); 
    359     }, 
    360  
    361     closest: function( selector ) { 
    362         var pos = jQuery.expr.match.POS.test( selector ) ? jQuery(selector) : null, 
    363             closer = 0; 
    364  
    365         return this.map(function(){ 
    366             var cur = this; 
    367             while ( cur && cur.ownerDocument ) { 
    368                 if ( pos ? pos.index(cur) > -1 : jQuery(cur).is(selector) ) { 
    369                     jQuery.data(cur, "closest", closer); 
    370                     return cur; 
    371                 } 
    372                 cur = cur.parentNode; 
    373                 closer++; 
    374             } 
    375         }); 
    376     }, 
    377  
    378     not: function( selector ) { 
    379         if ( typeof selector === "string" ) 
    380             // test special case where just one selector is passed in 
    381             if ( isSimple.test( selector ) ) 
    382                 return this.pushStack( jQuery.multiFilter( selector, this, true ), "not", selector ); 
    383             else 
    384                 selector = jQuery.multiFilter( selector, this ); 
    385  
    386         var isArrayLike = selector.length && selector[selector.length - 1] !== undefined && !selector.nodeType; 
    387         return this.filter(function() { 
    388             return isArrayLike ? jQuery.inArray( this, selector ) < 0 : this != selector; 
    389         }); 
    390     }, 
    391  
    392     add: function( selector ) { 
    393         return this.pushStack( jQuery.unique( jQuery.merge( 
    394             this.get(), 
    395             typeof selector === "string" ? 
    396                 jQuery( selector ) : 
    397                 jQuery.makeArray( selector ) 
    398         ))); 
    399     }, 
    400  
    401     is: function( selector ) { 
    402         return !!selector && jQuery.multiFilter( selector, this ).length > 0; 
    403     }, 
    404  
    405     hasClass: function( selector ) { 
    406         return !!selector && this.is( "." + selector ); 
    407     }, 
    408  
    409     val: function( value ) { 
    410         if ( value === undefined ) {             
    411             var elem = this[0]; 
    412  
    413             if ( elem ) { 
    414                 if( jQuery.nodeName( elem, 'option' ) ) 
    415                     return (elem.attributes.value || {}).specified ? elem.value : elem.text; 
    416                  
    417                 // We need to handle select boxes special 
    418                 if ( jQuery.nodeName( elem, "select" ) ) { 
    419                     var index = elem.selectedIndex, 
    420                         values = [], 
    421                         options = elem.options, 
    422                         one = elem.type == "select-one"; 
    423  
    424                     // Nothing was selected 
    425                     if ( index < 0 ) 
    426                         return null; 
    427  
    428                     // Loop through all the selected options 
    429                     for ( var i = one ? index : 0, max = one ? index + 1 : options.length; i < max; i++ ) { 
    430                         var option = options[ i ]; 
    431  
    432                         if ( option.selected ) { 
    433                             // Get the specifc value for the option 
    434                             value = jQuery(option).val(); 
    435  
    436                             // We don't need an array for one selects 
    437                             if ( one ) 
    438                                 return value; 
    439  
    440                             // Multi-Selects return an array 
    441                             values.push( value ); 
    442                         } 
    443                     } 
    444  
    445                     return values;               
    446                 } 
    447  
    448                 // Everything else, we just grab the value 
    449                 return (elem.value || "").replace(/\r/g, ""); 
    450  
    451             } 
    452  
    453             return undefined; 
    454         } 
    455  
    456         if ( typeof value === "number" ) 
    457             value += ''; 
    458  
    459         return this.each(function(){ 
    460             if ( this.nodeType != 1 ) 
    461                 return; 
    462  
    463             if ( jQuery.isArray(value) && /radio|checkbox/.test( this.type ) ) 
    464                 this.checked = (jQuery.inArray(this.value, value) >= 0 || 
    465                     jQuery.inArray(this.name, value) >= 0); 
    466  
    467             else if ( jQuery.nodeName( this, "select" ) ) { 
    468                 var values = jQuery.makeArray(value); 
    469  
    470                 jQuery( "option", this ).each(function(){ 
    471                     this.selected = (jQuery.inArray( this.value, values ) >= 0 || 
    472                         jQuery.inArray( this.text, values ) >= 0); 
    473                 }); 
    474  
    475                 if ( !values.length ) 
    476                     this.selectedIndex = -1; 
    477  
    478             } else 
    479                 this.value = value; 
    480         }); 
    481     }, 
    482  
    483     html: function( value ) { 
    484         return value === undefined ? 
    485             (this[0] ? 
    486                 this[0].innerHTML.replace(/ jQuery\d+="(?:\d+|null)"/g, "") : 
    487                 null) : 
    488             this.empty().append( value ); 
    489     }, 
    490  
    491     replaceWith: function( value ) { 
    492         return this.after( value ).remove(); 
    493     }, 
    494  
    495     eq: function( i ) { 
    496         return this.slice( i, +i + 1 ); 
    497     }, 
    498  
    499     slice: function() { 
    500         return this.pushStack( Array.prototype.slice.apply( this, arguments ), 
    501             "slice", Array.prototype.slice.call(arguments).join(",") ); 
    502     }, 
    503  
    504     map: function( callback ) { 
    505         return this.pushStack( jQuery.map(this, function(elem, i){ 
    506             return callback.call( elem, i, elem ); 
    507         })); 
    508     }, 
    509  
    510     andSelf: function() { 
    511         return this.add( this.prevObject ); 
    512     }, 
    513  
    514     domManip: function( args, table, callback ) { 
    515         if ( this[0] ) { 
    516             var fragment = (this[0].ownerDocument || this[0]).createDocumentFragment(), 
    517                 scripts = jQuery.clean( args, (this[0].ownerDocument || this[0]), fragment ), 
    518                 first = fragment.firstChild; 
    519  
    520             if ( first ) 
    521                 for ( var i = 0, l = this.length; i < l; i++ ) 
    522                     callback.call( root(this[i], first), this.length > 1 || i > 0 ? 
    523                             fragment.cloneNode(true) : fragment ); 
    524          
    525             if ( scripts ) 
    526                 jQuery.each( scripts, evalScript ); 
    527         } 
    528  
    529         return this; 
    530          
    531         function root( elem, cur ) { 
    532             return table && jQuery.nodeName(elem, "table") && jQuery.nodeName(cur, "tr") ? 
    533                 (elem.getElementsByTagName("tbody")[0] || 
    534                 elem.appendChild(elem.ownerDocument.createElement("tbody"))) : 
    535                 elem; 
    536         } 
    537     } 
    538 }; 
    539  
    540 // Give the init function the jQuery prototype for later instantiation 
    541 jQuery.fn.init.prototype = jQuery.fn; 
    542  
    543 function evalScript( i, elem ) { 
    544     if ( elem.src ) 
    545         jQuery.ajax({ 
    546             url: elem.src, 
    547             async: false, 
    548             dataType: "script" 
    549         }); 
    550  
    551     else 
    552         jQuery.globalEval( elem.text || elem.textContent || elem.innerHTML || "" ); 
    553  
    554     if ( elem.parentNode ) 
    555         elem.parentNode.removeChild( elem ); 
    556 } 
    557  
    558 function now(){ 
    559     return +new Date; 
    560 } 
    561  
    562 jQuery.extend = jQuery.fn.extend = function() { 
    563     // copy reference to target object 
    564     var target = arguments[0] || {}, i = 1, length = arguments.length, deep = false, options; 
    565  
    566     // Handle a deep copy situation 
    567     if ( typeof target === "boolean" ) { 
    568         deep = target; 
    569         target = arguments[1] || {}; 
    570         // skip the boolean and the target 
    571         i = 2; 
    572     } 
    573  
    574     // Handle case when target is a string or something (possible in deep copy) 
    575     if ( typeof target !== "object" && !jQuery.isFunction(target) ) 
    576         target = {}; 
    577  
    578     // extend jQuery itself if only one argument is passed 
    579     if ( length == i ) { 
    580         target = this; 
    581         --i; 
    582     } 
    583  
    584     for ( ; i < length; i++ ) 
    585         // Only deal with non-null/undefined values 
    586         if ( (options = arguments[ i ]) != null ) 
    587             // Extend the base object 
    588             for ( var name in options ) { 
    589                 var src = target[ name ], copy = options[ name ]; 
    590  
    591                 // Prevent never-ending loop 
    592                 if ( target === copy ) 
    593                     continue; 
    594  
    595                 // Recurse if we're merging object values 
    596                 if ( deep && copy && typeof copy === "object" && !copy.nodeType ) 
    597                     target[ name ] = jQuery.extend( deep,  
    598                         // Never move original objects, clone them 
    599                         src || ( copy.length != null ? [ ] : { } ) 
    600                     , copy ); 
    601  
    602                 // Don't bring in undefined values 
    603                 else if ( copy !== undefined ) 
    604                     target[ name ] = copy; 
    605  
    606             } 
    607  
    608     // Return the modified object 
    609     return target; 
    610 }; 
    611  
    612 // exclude the following css properties to add px 
    613 var exclude = /z-?index|font-?weight|opacity|zoom|line-?height/i, 
    614     // cache defaultView 
    615     defaultView = document.defaultView || {}, 
    616     toString = Object.prototype.toString; 
    617  
    618 jQuery.extend({ 
    619     noConflict: function( deep ) { 
    620         window.$ = _$; 
    621  
    622         if ( deep ) 
    623             window.jQuery = _jQuery; 
    624  
    625         return jQuery; 
    626     }, 
    627  
    628     // See test/unit/core.js for details concerning isFunction. 
    629     // Since version 1.3, DOM methods and functions like alert 
    630     // aren't supported. They return false on IE (#2968). 
    631     isFunction: function( obj ) { 
    632         return toString.call(obj) === "[object Function]"; 
    633     }, 
    634  
    635     isArray: function( obj ) { 
    636         return toString.call(obj) === "[object Array]"; 
    637     }, 
    638  
    639     // check if an element is in a (or is an) XML document 
    640     isXMLDoc: function( elem ) { 
    641         return elem.nodeType === 9 && elem.documentElement.nodeName !== "HTML" || 
    642             !!elem.ownerDocument && jQuery.isXMLDoc( elem.ownerDocument ); 
    643     }, 
    644  
    645     // Evalulates a script in a global context 
    646     globalEval: function( data ) { 
    647         if ( data && /\S/.test(data) ) { 
    648             // Inspired by code by Andrea Giammarchi 
    649             // http://webreflection.blogspot.com/2007/08/global-scope-evaluation-and-dom.html 
    650             var head = document.getElementsByTagName("head")[0] || document.documentElement, 
    651                 script = document.createElement("script"); 
    652  
    653             script.type = "text/javascript"; 
    654             if ( jQuery.support.scriptEval ) 
    655                 script.appendChild( document.createTextNode( data ) ); 
    656             else 
    657                 script.text = data; 
    658  
    659             // Use insertBefore instead of appendChild  to circumvent an IE6 bug. 
    660             // This arises when a base node is used (#2709). 
    661             head.insertBefore( script, head.firstChild ); 
    662             head.removeChild( script ); 
    663         } 
    664     }, 
    665  
    666     nodeName: function( elem, name ) { 
    667         return elem.nodeName && elem.nodeName.toUpperCase() == name.toUpperCase(); 
    668     }, 
    669  
    670     // args is for internal usage only 
    671     each: function( object, callback, args ) { 
    672         var name, i = 0, length = object.length; 
    673  
    674         if ( args ) { 
    675             if ( length === undefined ) { 
    676                 for ( name in object ) 
    677                     if ( callback.apply( object[ name ], args ) === false ) 
    678                         break; 
    679             } else 
    680                 for ( ; i < length; ) 
    681                     if ( callback.apply( object[ i++ ], args ) === false ) 
    682                         break; 
    683  
    684         // A special, fast, case for the most common use of each 
    685         } else { 
    686             if ( length === undefined ) { 
    687                 for ( name in object ) 
    688                     if ( callback.call( object[ name ], name, object[ name ] ) === false ) 
    689                         break; 
    690             } else 
    691                 for ( var value = object[0]; 
    692                     i < length && callback.call( value, i, value ) !== false; value = object[++i] ){} 
    693         } 
    694  
    695         return object; 
    696     }, 
    697  
    698     prop: function( elem, value, type, i, name ) { 
    699         // Handle executable functions 
    700         if ( jQuery.isFunction( value ) ) 
    701             value = value.call( elem, i ); 
    702  
    703         // Handle passing in a number to a CSS property 
    704         return typeof value === "number" && type == "curCSS" && !exclude.test( name ) ? 
    705             value + "px" : 
    706             value; 
    707     }, 
    708  
    709     className: { 
    710         // internal only, use addClass("class") 
    711         add: function( elem, classNames ) { 
    712             jQuery.each((classNames || "").split(/\s+/), function(i, className){ 
    713                 if ( elem.nodeType == 1 && !jQuery.className.has( elem.className, className ) ) 
    714                     elem.className += (elem.className ? " " : "") + className; 
    715             }); 
    716         }, 
    717  
    718         // internal only, use removeClass("class") 
    719         remove: function( elem, classNames ) { 
    720             if (elem.nodeType == 1) 
    721                 elem.className = classNames !== undefined ? 
    722                     jQuery.grep(elem.className.split(/\s+/), function(className){ 
    723                         return !jQuery.className.has( classNames, className ); 
    724                     }).join(" ") : 
    725                     ""; 
    726         }, 
    727  
    728         // internal only, use hasClass("class") 
    729         has: function( elem, className ) { 
    730             return elem && jQuery.inArray( className, (elem.className || elem).toString().split(/\s+/) ) > -1; 
    731         } 
    732     }, 
    733  
    734     // A method for quickly swapping in/out CSS properties to get correct calculations 
    735     swap: function( elem, options, callback ) { 
    736         var old = {}; 
    737         // Remember the old values, and insert the new ones 
    738         for ( var name in options ) { 
    739             old[ name ] = elem.style[ name ]; 
    740             elem.style[ name ] = options[ name ]; 
    741         } 
    742  
    743         callback.call( elem ); 
    744  
    745         // Revert the old values 
    746         for ( var name in options ) 
    747             elem.style[ name ] = old[ name ]; 
    748     }, 
    749  
    750     css: function( elem, name, force, extra ) { 
    751         if ( name == "width" || name == "height" ) { 
    752             var val, props = { position: "absolute", visibility: "hidden", display:"block" }, which = name == "width" ? [ "Left", "Right" ] : [ "Top", "Bottom" ]; 
    753  
    754             function getWH() { 
    755                 val = name == "width" ? elem.offsetWidth : elem.offsetHeight; 
    756  
    757                 if ( extra === "border" ) 
    758                     return; 
    759  
    760                 jQuery.each( which, function() { 
    761                     if ( !extra ) 
    762                         val -= parseFloat(jQuery.curCSS( elem, "padding" + this, true)) || 0; 
    763                     if ( extra === "margin" ) 
    764                         val += parseFloat(jQuery.curCSS( elem, "margin" + this, true)) || 0; 
    765                     else 
    766                         val -= parseFloat(jQuery.curCSS( elem, "border" + this + "Width", true)) || 0; 
    767                 }); 
    768             } 
    769  
    770             if ( elem.offsetWidth !== 0 ) 
    771                 getWH(); 
    772             else 
    773                 jQuery.swap( elem, props, getWH ); 
    774  
    775             return Math.max(0, Math.round(val)); 
    776         } 
    777  
    778         return jQuery.curCSS( elem, name, force ); 
    779     }, 
    780  
    781     curCSS: function( elem, name, force ) { 
    782         var ret, style = elem.style; 
    783  
    784         // We need to handle opacity special in IE 
    785         if ( name == "opacity" && !jQuery.support.opacity ) { 
    786             ret = jQuery.attr( style, "opacity" ); 
    787  
    788             return ret == "" ? 
    789                 "1" : 
    790                 ret; 
    791         } 
    792  
    793         // Make sure we're using the right name for getting the float value 
    794         if ( name.match( /float/i ) ) 
    795             name = styleFloat; 
    796  
    797         if ( !force && style && style[ name ] ) 
    798             ret = style[ name ]; 
    799  
    800         else if ( defaultView.getComputedStyle ) { 
    801  
    802             // Only "float" is needed here 
    803             if ( name.match( /float/i ) ) 
    804                 name = "float"; 
    805  
    806             name = name.replace( /([A-Z])/g, "-$1" ).toLowerCase(); 
    807  
    808             var computedStyle = defaultView.getComputedStyle( elem, null ); 
    809  
    810             if ( computedStyle ) 
    811                 ret = computedStyle.getPropertyValue( name ); 
    812  
    813             // We should always get a number back from opacity 
    814             if ( name == "opacity" && ret == "" ) 
    815                 ret = "1"; 
    816  
    817         } else if ( elem.currentStyle ) { 
    818             var camelCase = name.replace(/\-(\w)/g, function(all, letter){ 
    819                 return letter.toUpperCase(); 
    820             }); 
    821  
    822             ret = elem.currentStyle[ name ] || elem.currentStyle[ camelCase ]; 
    823  
    824             // From the awesome hack by Dean Edwards 
    825             // http://erik.eae.net/archives/2007/07/27/18.54.15/#comment-102291 
    826  
    827             // If we're not dealing with a regular pixel number 
    828             // but a number that has a weird ending, we need to convert it to pixels 
    829             if ( !/^\d+(px)?$/i.test( ret ) && /^\d/.test( ret ) ) { 
    830                 // Remember the original values 
    831                 var left = style.left, rsLeft = elem.runtimeStyle.left; 
    832  
    833                 // Put in the new values to get a computed value out 
    834                 elem.runtimeStyle.left = elem.currentStyle.left; 
    835                 style.left = ret || 0; 
    836                 ret = style.pixelLeft + "px"; 
    837  
    838                 // Revert the changed values 
    839                 style.left = left; 
    840                 elem.runtimeStyle.left = rsLeft; 
    841             } 
    842         } 
    843  
    844         return ret; 
    845     }, 
    846  
    847     clean: function( elems, context, fragment ) { 
    848         context = context || document; 
    849  
    850         // !context.createElement fails in IE with an error but returns typeof 'object' 
    851         if ( typeof context.createElement === "undefined" ) 
    852             context = context.ownerDocument || context[0] && context[0].ownerDocument || document; 
    853  
    854         // If a single string is passed in and it's a single tag 
    855         // just do a createElement and skip the rest 
    856         if ( !fragment && elems.length === 1 && typeof elems[0] === "string" ) { 
    857             var match = /^<(\w+)\s*\/?>$/.exec(elems[0]); 
    858             if ( match ) 
    859                 return [ context.createElement( match[1] ) ]; 
    860         } 
    861  
    862         var ret = [], scripts = [], div = context.createElement("div"); 
    863  
    864         jQuery.each(elems, function(i, elem){ 
    865             if ( typeof elem === "number" ) 
    866                 elem += ''; 
    867  
    868             if ( !elem ) 
    869                 return; 
    870  
    871             // Convert html string into DOM nodes 
    872             if ( typeof elem === "string" ) { 
    873                 // Fix "XHTML"-style tags in all browsers 
    874                 elem = elem.replace(/(<(\w+)[^>]*?)\/>/g, function(all, front, tag){ 
    875                     return tag.match(/^(abbr|br|col|img|input|link|meta|param|hr|area|embed)$/i) ? 
    876                         all : 
    877                         front + "></" + tag + ">"; 
    878                 }); 
    879  
    880                 // Trim whitespace, otherwise indexOf won't work as expected 
    881                 var tags = elem.replace(/^\s+/, "").substring(0, 10).toLowerCase(); 
    882  
    883                 var wrap = 
    884                     // option or optgroup 
    885                     !tags.indexOf("<opt") && 
    886                     [ 1, "<select multiple='multiple'>", "</select>" ] || 
    887  
    888                     !tags.indexOf("<leg") && 
    889                     [ 1, "<fieldset>", "</fieldset>" ] || 
    890  
    891                     tags.match(/^<(thead|tbody|tfoot|colg|cap)/) && 
    892                     [ 1, "<table>", "</table>" ] || 
    893  
    894                     !tags.indexOf("<tr") && 
    895                     [ 2, "<table><tbody>", "</tbody></table>" ] || 
    896  
    897                     // <thead> matched above 
    898                     (!tags.indexOf("<td") || !tags.indexOf("<th")) && 
    899                     [ 3, "<table><tbody><tr>", "</tr></tbody></table>" ] || 
    900  
    901                     !tags.indexOf("<col") && 
    902                     [ 2, "<table><tbody></tbody><colgroup>", "</colgroup></table>" ] || 
    903  
    904                     // IE can't serialize <link> and <script> tags normally 
    905                     !jQuery.support.htmlSerialize && 
    906                     [ 1, "div<div>", "</div>" ] || 
    907  
    908                     [ 0, "", "" ]; 
    909  
    910                 // Go to html and back, then peel off extra wrappers 
    911                 div.innerHTML = wrap[1] + elem + wrap[2]; 
    912  
    913                 // Move to the right depth 
    914                 while ( wrap[0]-- ) 
    915                     div = div.lastChild; 
    916  
    917                 // Remove IE's autoinserted <tbody> from table fragments 
    918                 if ( !jQuery.support.tbody ) { 
    919  
    920                     // String was a <table>, *may* have spurious <tbody> 
    921                     var hasBody = /<tbody/i.test(elem), 
    922                         tbody = !tags.indexOf("<table") && !hasBody ? 
    923                             div.firstChild && div.firstChild.childNodes : 
    924  
    925                         // String was a bare <thead> or <tfoot> 
    926                         wrap[1] == "<table>" && !hasBody ? 
    927                             div.childNodes : 
    928                             []; 
    929  
    930                     for ( var j = tbody.length - 1; j >= 0 ; --j ) 
    931                         if ( jQuery.nodeName( tbody[ j ], "tbody" ) && !tbody[ j ].childNodes.length ) 
    932                             tbody[ j ].parentNode.removeChild( tbody[ j ] ); 
    933  
    934                     } 
    935  
    936                 // IE completely kills leading whitespace when innerHTML is used 
    937                 if ( !jQuery.support.leadingWhitespace && /^\s/.test( elem ) ) 
    938                     div.insertBefore( context.createTextNode( elem.match(/^\s*/)[0] ), div.firstChild ); 
    939                  
    940                 elem = jQuery.makeArray( div.childNodes ); 
    941             } 
    942  
    943             if ( elem.nodeType ) 
    944                 ret.push( elem ); 
    945             else 
    946                 ret = jQuery.merge( ret, elem ); 
    947  
    948         }); 
    949  
    950         if ( fragment ) { 
    951             for ( var i = 0; ret[i]; i++ ) { 
    952                 if ( jQuery.nodeName( ret[i], "script" ) && (!ret[i].type || ret[i].type.toLowerCase() === "text/javascript") ) { 
    953                     scripts.push( ret[i].parentNode ? ret[i].parentNode.removeChild( ret[i] ) : ret[i] ); 
    954                 } else { 
    955                     if ( ret[i].nodeType === 1 ) 
    956                         ret.splice.apply( ret, [i + 1, 0].concat(jQuery.makeArray(ret[i].getElementsByTagName("script"))) ); 
    957                     fragment.appendChild( ret[i] ); 
    958                 } 
    959             } 
    960              
    961             return scripts; 
    962         } 
    963  
    964         return ret; 
    965     }, 
    966  
    967     attr: function( elem, name, value ) { 
    968         // don't set attributes on text and comment nodes 
    969         if (!elem || elem.nodeType == 3 || elem.nodeType == 8) 
    970             return undefined; 
    971  
    972         var notxml = !jQuery.isXMLDoc( elem ), 
    973             // Whether we are setting (or getting) 
    974             set = value !== undefined; 
    975  
    976         // Try to normalize/fix the name 
    977         name = notxml && jQuery.props[ name ] || name; 
    978  
    979         // Only do all the following if this is a node (faster for style) 
    980         // IE elem.getAttribute passes even for style 
    981         if ( elem.tagName ) { 
    982  
    983             // These attributes require special treatment 
    984             var special = /href|src|style/.test( name ); 
    985  
    986             // Safari mis-reports the default selected property of a hidden option 
    987             // Accessing the parent's selectedIndex property fixes it 
    988             if ( name == "selected" && elem.parentNode ) 
    989                 elem.parentNode.selectedIndex; 
    990  
    991             // If applicable, access the attribute via the DOM 0 way 
    992             if ( name in elem && notxml && !special ) { 
    993                 if ( set ){ 
    994                     // We can't allow the type property to be changed (since it causes problems in IE) 
    995                     if ( name == "type" && jQuery.nodeName( elem, "input" ) && elem.parentNode ) 
    996                         throw "type property can't be changed"; 
    997  
    998                     elem[ name ] = value; 
    999                 } 
    1000  
    1001                 // browsers index elements by id/name on forms, give priority to attributes. 
    1002                 if( jQuery.nodeName( elem, "form" ) && elem.getAttributeNode(name) ) 
    1003                     return elem.getAttributeNode( name ).nodeValue; 
    1004  
    1005                 // elem.tabIndex doesn't always return the correct value when it hasn't been explicitly set 
    1006                 // http://fluidproject.org/blog/2008/01/09/getting-setting-and-removing-tabindex-values-with-javascript/ 
    1007                 if ( name == "tabIndex" ) { 
    1008                     var attributeNode = elem.getAttributeNode( "tabIndex" ); 
    1009                     return attributeNode && attributeNode.specified 
    1010                         ? attributeNode.value 
    1011                         : elem.nodeName.match(/(button|input|object|select|textarea)/i) 
    1012                             ? 0 
    1013                             : elem.nodeName.match(/^(a|area)$/i) && elem.href 
    1014                                 ? 0 
    1015                                 : undefined; 
    1016                 } 
    1017  
    1018                 return elem[ name ]; 
    1019             } 
    1020  
    1021             if ( !jQuery.support.style && notxml &&  name == "style" ) 
    1022                 return jQuery.attr( elem.style, "cssText", value ); 
    1023  
    1024             if ( set ) 
    1025                 // convert the value to a string (all browsers do this but IE) see #1070 
    1026                 elem.setAttribute( name, "" + value ); 
    1027  
    1028             var attr = !jQuery.support.hrefNormalized && notxml && special 
    1029                     // Some attributes require a special call on IE 
    1030                     ? elem.getAttribute( name, 2 ) 
    1031                     : elem.getAttribute( name ); 
    1032  
    1033             // Non-existent attributes return null, we normalize to undefined 
    1034             return attr === null ? undefined : attr; 
    1035         } 
    1036  
    1037         // elem is actually elem.style ... set the style 
    1038  
    1039         // IE uses filters for opacity 
    1040         if ( !jQuery.support.opacity && name == "opacity" ) { 
    1041             if ( set ) { 
    1042                 // IE has trouble with opacity if it does not have layout 
    1043                 // Force it by setting the zoom level 
    1044                 elem.zoom = 1; 
    1045  
    1046                 // Set the alpha filter to set the opacity 
    1047                 elem.filter = (elem.filter || "").replace( /alpha\([^)]*\)/, "" ) + 
    1048                     (parseInt( value ) + '' == "NaN" ? "" : "alpha(opacity=" + value * 100 + ")"); 
    1049             } 
    1050  
    1051             return elem.filter && elem.filter.indexOf("opacity=") >= 0 ? 
    1052                 (parseFloat( elem.filter.match(/opacity=([^)]*)/)[1] ) / 100) + '': 
    1053                 ""; 
    1054         } 
    1055  
    1056         name = name.replace(/-([a-z])/ig, function(all, letter){ 
    1057             return letter.toUpperCase(); 
    1058         }); 
    1059  
    1060         if ( set ) 
    1061             elem[ name ] = value; 
    1062  
    1063         return elem[ name ]; 
    1064     }, 
    1065  
    1066     trim: function( text ) { 
    1067         return (text || "").replace( /^\s+|\s+$/g, "" ); 
    1068     }, 
    1069  
    1070     makeArray: function( array ) { 
    1071         var ret = []; 
    1072  
    1073         if( array != null ){ 
    1074             var i = array.length; 
    1075             // The window, strings (and functions) also have 'length' 
    1076             if( i == null || typeof array === "string" || jQuery.isFunction(array) || array.setInterval ) 
    1077                 ret[0] = array; 
    1078             else 
    1079                 while( i ) 
    1080                     ret[--i] = array[i]; 
    1081         } 
    1082  
    1083         return ret; 
    1084     }, 
    1085  
    1086     inArray: function( elem, array ) { 
    1087         for ( var i = 0, length = array.length; i < length; i++ ) 
    1088         // Use === because on IE, window == document 
    1089             if ( array[ i ] === elem ) 
    1090                 return i; 
    1091  
    1092         return -1; 
    1093     }, 
    1094  
    1095     merge: function( first, second ) { 
    1096         // We have to loop this way because IE & Opera overwrite the length 
    1097         // expando of getElementsByTagName 
    1098         var i = 0, elem, pos = first.length; 
    1099         // Also, we need to make sure that the correct elements are being returned 
    1100         // (IE returns comment nodes in a '*' query) 
    1101         if ( !jQuery.support.getAll ) { 
    1102             while ( (elem = second[ i++ ]) != null ) 
    1103                 if ( elem.nodeType != 8 ) 
    1104                     first[ pos++ ] = elem; 
    1105  
    1106         } else 
    1107             while ( (elem = second[ i++ ]) != null ) 
    1108                 first[ pos++ ] = elem; 
    1109  
    1110         return first; 
    1111     }, 
    1112  
    1113     unique: function( array ) { 
    1114         var ret = [], done = {}; 
    1115  
    1116         try { 
    1117  
    1118             for ( var i = 0, length = array.length; i < length; i++ ) { 
    1119                 var id = jQuery.data( array[ i ] ); 
    1120  
    1121                 if ( !done[ id ] ) { 
    1122                     done[ id ] = true; 
    1123                     ret.push( array[ i ] ); 
    1124                 } 
    1125             } 
    1126  
    1127         } catch( e ) { 
    1128             ret = array; 
    1129         } 
    1130  
    1131         return ret; 
    1132     }, 
    1133  
    1134     grep: function( elems, callback, inv ) { 
    1135         var ret = []; 
    1136  
    1137         // Go through the array, only saving the items 
    1138         // that pass the validator function 
    1139         for ( var i = 0, length = elems.length; i < length; i++ ) 
    1140             if ( !inv != !callback( elems[ i ], i ) ) 
    1141                 ret.push( elems[ i ] ); 
    1142  
    1143         return ret; 
    1144     }, 
    1145  
    1146     map: function( elems, callback ) { 
    1147         var ret = []; 
    1148  
    1149         // Go through the array, translating each of the items to their 
    1150         // new value (or values). 
    1151         for ( var i = 0, length = elems.length; i < length; i++ ) { 
    1152             var value = callback( elems[ i ], i ); 
    1153  
    1154             if ( value != null ) 
    1155                 ret[ ret.length ] = value; 
    1156         } 
    1157  
    1158         return ret.concat.apply( [], ret ); 
    1159     } 
    1160 }); 
    1161  
    1162 // Use of jQuery.browser is deprecated. 
    1163 // It's included for backwards compatibility and plugins, 
    1164 // although they should work to migrate away. 
    1165  
    1166 var userAgent = navigator.userAgent.toLowerCase(); 
    1167  
    1168 // Figure out what browser is being used 
    1169 jQuery.browser = { 
    1170     version: (userAgent.match( /.+(?:rv|it|ra|ie)[\/: ]([\d.]+)/ ) || [0,'0'])[1], 
    1171     safari: /webkit/.test( userAgent ), 
    1172     opera: /opera/.test( userAgent ), 
    1173     msie: /msie/.test( userAgent ) && !/opera/.test( userAgent ), 
    1174     mozilla: /mozilla/.test( userAgent ) && !/(compatible|webkit)/.test( userAgent ) 
    1175 }; 
    1176  
    1177 jQuery.each({ 
    1178     parent: function(elem){return elem.parentNode;}, 
    1179     parents: function(elem){return jQuery.dir(elem,"parentNode");}, 
    1180     next: function(elem){return jQuery.nth(elem,2,"nextSibling");}, 
    1181     prev: function(elem){return jQuery.nth(elem,2,"previousSibling");}, 
    1182     nextAll: function(elem){return jQuery.dir(elem,"nextSibling");}, 
    1183     prevAll: function(elem){return jQuery.dir(elem,"previousSibling");}, 
    1184     siblings: function(elem){return jQuery.sibling(elem.parentNode.firstChild,elem);}, 
    1185     children: function(elem){return jQuery.sibling(elem.firstChild);}, 
    1186     contents: function(elem){return jQuery.nodeName(elem,"iframe")?elem.contentDocument||elem.contentWindow.document:jQuery.makeArray(elem.childNodes);} 
    1187 }, function(name, fn){ 
    1188     jQuery.fn[ name ] = function( selector ) { 
    1189         var ret = jQuery.map( this, fn ); 
    1190  
    1191         if ( selector && typeof selector == "string" ) 
    1192             ret = jQuery.multiFilter( selector, ret ); 
    1193  
    1194         return this.pushStack( jQuery.unique( ret ), name, selector ); 
    1195     }; 
    1196 }); 
    1197  
    1198 jQuery.each({ 
    1199     appendTo: "append", 
    1200     prependTo: "prepend", 
    1201     insertBefore: "before", 
    1202     insertAfter: "after", 
    1203     replaceAll: "replaceWith" 
    1204 }, function(name, original){ 
    1205     jQuery.fn[ name ] = function( selector ) { 
    1206         var ret = [], insert = jQuery( selector ); 
    1207  
    1208         for ( var i = 0, l = insert.length; i < l; i++ ) { 
    1209             var elems = (i > 0 ? this.clone(true) : this).get(); 
    1210             jQuery.fn[ original ].apply( jQuery(insert[i]), elems ); 
    1211             ret = ret.concat( elems ); 
    1212         } 
    1213  
    1214         return this.pushStack( ret, name, selector ); 
    1215     }; 
    1216 }); 
    1217  
    1218 jQuery.each({ 
    1219     removeAttr: function( name ) { 
    1220         jQuery.attr( this, name, "" ); 
    1221         if (this.nodeType == 1) 
    1222             this.removeAttribute( name ); 
    1223     }, 
    1224  
    1225     addClass: function( classNames ) { 
    1226         jQuery.className.add( this, classNames ); 
    1227     }, 
    1228  
    1229     removeClass: function( classNames ) { 
    1230         jQuery.className.remove( this, classNames ); 
    1231     }, 
    1232  
    1233     toggleClass: function( classNames, state ) { 
    1234         if( typeof state !== "boolean" ) 
    1235             state = !jQuery.className.has( this, classNames ); 
    1236         jQuery.className[ state ? "add" : "remove" ]( this, classNames ); 
    1237     }, 
    1238  
    1239     remove: function( selector ) { 
    1240         if ( !selector || jQuery.filter( selector, [ this ] ).length ) { 
    1241             // Prevent memory leaks 
    1242             jQuery( "*", this ).add([this]).each(function(){ 
    1243                 jQuery.event.remove(this); 
    1244                 jQuery.removeData(this); 
    1245             }); 
    1246             if (this.parentNode) 
    1247                 this.parentNode.removeChild( this ); 
    1248         } 
    1249     }, 
    1250  
    1251     empty: function() { 
    1252         // Remove element nodes and prevent memory leaks 
    1253         jQuery(this).children().remove(); 
    1254  
    1255         // Remove any remaining nodes 
    1256         while ( this.firstChild ) 
    1257             this.removeChild( this.firstChild ); 
    1258     } 
    1259 }, function(name, fn){ 
    1260     jQuery.fn[ name ] = function(){ 
    1261         return this.each( fn, arguments ); 
    1262     }; 
    1263 }); 
    1264  
    1265 // Helper function used by the dimensions and offset modules 
    1266 function num(elem, prop) { 
    1267     return elem[0] && parseInt( jQuery.curCSS(elem[0], prop, true), 10 ) || 0; 
    1268 } 
    1269 var expando = "jQuery" + now(), uuid = 0, windowData = {}; 
    1270  
    1271 jQuery.extend({ 
    1272     cache: {}, 
    1273  
    1274     data: function( elem, name, data ) { 
    1275         elem = elem == window ? 
    1276             windowData : 
    1277             elem; 
    1278  
    1279         var id = elem[ expando ]; 
    1280  
    1281         // Compute a unique ID for the element 
    1282         if ( !id ) 
    1283             id = elem[ expando ] = ++uuid; 
    1284  
    1285         // Only generate the data cache if we're 
    1286         // trying to access or manipulate it 
    1287         if ( name && !jQuery.cache[ id ] ) 
    1288             jQuery.cache[ id ] = {}; 
    1289  
    1290         // Prevent overriding the named cache with undefined values 
    1291         if ( data !== undefined ) 
    1292             jQuery.cache[ id ][ name ] = data; 
    1293  
    1294         // Return the named cache data, or the ID for the element 
    1295         return name ? 
    1296             jQuery.cache[ id ][ name ] : 
    1297             id; 
    1298     }, 
    1299  
    1300     removeData: function( elem, name ) { 
    1301         elem = elem == window ? 
    1302             windowData : 
    1303             elem; 
    1304  
    1305         var id = elem[ expando ]; 
    1306  
    1307         // If we want to remove a specific section of the element's data 
    1308         if ( name ) { 
    1309             if ( jQuery.cache[ id ] ) { 
    1310                 // Remove the section of cache data 
    1311                 delete jQuery.cache[ id ][ name ]; 
    1312  
    1313                 // If we've removed all the data, remove the element's cache 
    1314                 name = ""; 
    1315  
    1316                 for ( name in jQuery.cache[ id ] ) 
    1317                     break; 
    1318  
    1319                 if ( !name ) 
    1320                     jQuery.removeData( elem ); 
    1321             } 
    1322  
    1323         // Otherwise, we want to remove all of the element's data 
    1324         } else { 
    1325             // Clean up the element expando 
    1326             try { 
    1327                 delete elem[ expando ]; 
    1328             } catch(e){ 
    1329                 // IE has trouble directly removing the expando 
    1330                 // but it's ok with using removeAttribute 
    1331                 if ( elem.removeAttribute ) 
    1332                     elem.removeAttribute( expando ); 
    1333             } 
    1334  
    1335             // Completely remove the data cache 
    1336             delete jQuery.cache[ id ]; 
    1337         } 
    1338     }, 
    1339     queue: function( elem, type, data ) { 
    1340         if ( elem ){ 
    1341      
    1342             type = (type || "fx") + "queue"; 
    1343      
    1344             var q = jQuery.data( elem, type ); 
    1345      
    1346             if ( !q || jQuery.isArray(data) ) 
    1347                 q = jQuery.data( elem, type, jQuery.makeArray(data) ); 
    1348             else if( data ) 
    1349                 q.push( data ); 
    1350      
    1351         } 
    1352         return q; 
    1353     }, 
    1354  
    1355     dequeue: function( elem, type ){ 
    1356         var queue = jQuery.queue( elem, type ), 
    1357             fn = queue.shift(); 
    1358          
    1359         if( !type || type === "fx" ) 
    1360             fn = queue[0]; 
    1361              
    1362         if( fn !== undefined ) 
    1363             fn.call(elem); 
    1364     } 
    1365 }); 
    1366  
    1367 jQuery.fn.extend({ 
    1368     data: function( key, value ){ 
    1369         var parts = key.split("."); 
    1370         parts[1] = parts[1] ? "." + parts[1] : ""; 
    1371  
    1372         if ( value === undefined ) { 
    1373             var data = this.triggerHandler("getData" + parts[1] + "!", [parts[0]]); 
    1374  
    1375             if ( data === undefined && this.length ) 
    1376                 data = jQuery.data( this[0], key ); 
    1377  
    1378             return data === undefined && parts[1] ? 
    1379                 this.data( parts[0] ) : 
    1380                 data; 
    1381         } else 
    1382             return this.trigger("setData" + parts[1] + "!", [parts[0], value]).each(function(){ 
    1383                 jQuery.data( this, key, value ); 
    1384             }); 
    1385     }, 
    1386  
    1387     removeData: function( key ){ 
    1388         return this.each(function(){ 
    1389             jQuery.removeData( this, key ); 
    1390         }); 
    1391     }, 
    1392     queue: function(type, data){ 
    1393         if ( typeof type !== "string" ) { 
    1394             data = type; 
    1395             type = "fx"; 
    1396         } 
    1397  
    1398         if ( data === undefined ) 
    1399             return jQuery.queue( this[0], type ); 
    1400  
    1401         return this.each(function(){ 
    1402             var queue = jQuery.queue( this, type, data ); 
    1403              
    1404              if( type == "fx" && queue.length == 1 ) 
    1405                 queue[0].call(this); 
    1406         }); 
    1407     }, 
    1408     dequeue: function(type){ 
    1409         return this.each(function(){ 
    1410             jQuery.dequeue( this, type ); 
    1411         }); 
    1412     } 
    1413 });/*! 
    1414  * Sizzle CSS Selector Engine - v0.9.3 
    1415  *  Copyright 2009, The Dojo Foundation 
    1416  *  Released under the MIT, BSD, and GPL Licenses. 
    1417  *  More information: http://sizzlejs.com/ 
    1418  */ 
    1419 (function(){ 
    1420  
    1421 var chunker = /((?:\((?:\([^()]+\)|[^()]+)+\)|\[(?:\[[^[\]]*\]|['"][^'"]*['"]|[^[\]'"]+)+\]|\\.|[^ >+~,(\[\\]+)+|[>+~])(\s*,\s*)?/g, 
    1422     done = 0, 
    1423     toString = Object.prototype.toString; 
    1424  
    1425 var Sizzle = function(selector, context, results, seed) { 
    1426     results = results || []; 
    1427     context = context || document; 
    1428  
    1429     if ( context.nodeType !== 1 && context.nodeType !== 9 ) 
    1430         return []; 
    1431      
    1432     if ( !selector || typeof selector !== "string" ) { 
    1433         return results; 
    1434     } 
    1435  
    1436     var parts = [], m, set, checkSet, check, mode, extra, prune = true; 
    1437      
    1438     // Reset the position of the chunker regexp (start from head) 
    1439     chunker.lastIndex = 0; 
    1440      
    1441     while ( (m = chunker.exec(selector)) !== null ) { 
    1442         parts.push( m[1] ); 
    1443          
    1444         if ( m[2] ) { 
    1445             extra = RegExp.rightContext; 
    1446             break; 
    1447         } 
    1448     } 
    1449  
    1450     if ( parts.length > 1 && origPOS.exec( selector ) ) { 
    1451         if ( parts.length === 2 && Expr.relative[ parts[0] ] ) { 
    1452             set = posProcess( parts[0] + parts[1], context ); 
    1453         } else { 
    1454             set = Expr.relative[ parts[0] ] ? 
    1455                 [ context ] : 
    1456                 Sizzle( parts.shift(), context ); 
    1457  
    1458             while ( parts.length ) { 
    1459                 selector = parts.shift(); 
    1460  
    1461                 if ( Expr.relative[ selector ] ) 
    1462                     selector += parts.shift(); 
    1463  
    1464                 set = posProcess( selector, set ); 
    1465             } 
    1466         } 
    1467     } else { 
    1468         var ret = seed ? 
    1469             { expr: parts.pop(), set: makeArray(seed) } : 
    1470             Sizzle.find( parts.pop(), parts.length === 1 && context.parentNode ? context.parentNode : context, isXML(context) ); 
    1471         set = Sizzle.filter( ret.expr, ret.set ); 
    1472  
    1473         if ( parts.length > 0 ) { 
    1474             checkSet = makeArray(set); 
    1475         } else { 
    1476             prune = false; 
    1477         } 
    1478  
    1479         while ( parts.length ) { 
    1480             var cur = parts.pop(), pop = cur; 
    1481  
    1482             if ( !Expr.relative[ cur ] ) { 
    1483                 cur = ""; 
    1484             } else { 
    1485                 pop = parts.pop(); 
    1486             } 
    1487  
    1488             if ( pop == null ) { 
    1489                 pop = context; 
    1490             } 
    1491  
    1492             Expr.relative[ cur ]( checkSet, pop, isXML(context) ); 
    1493         } 
    1494     } 
    1495  
    1496     if ( !checkSet ) { 
    1497         checkSet = set; 
    1498     } 
    1499  
    1500     if ( !checkSet ) { 
    1501         throw "Syntax error, unrecognized expression: " + (cur || selector); 
    1502     } 
    1503  
    1504     if ( toString.call(checkSet) === "[object Array]" ) { 
    1505         if ( !prune ) { 
    1506             results.push.apply( results, checkSet ); 
    1507         } else if ( context.nodeType === 1 ) { 
    1508             for ( var i = 0; checkSet[i] != null; i++ ) { 
    1509                 if ( checkSet[i] && (checkSet[i] === true || checkSet[i].nodeType === 1 && contains(context, checkSet[i])) ) { 
    1510                     results.push( set[i] ); 
    1511                 } 
    1512             } 
    1513         } else { 
    1514             for ( var i = 0; checkSet[i] != null; i++ ) { 
    1515                 if ( checkSet[i] && checkSet[i].nodeType === 1 ) { 
    1516                     results.push( set[i] ); 
    1517                 } 
    1518             } 
    1519         } 
    1520     } else { 
    1521         makeArray( checkSet, results ); 
    1522     } 
    1523  
    1524     if ( extra ) { 
    1525         Sizzle( extra, context, results, seed ); 
    1526  
    1527         if ( sortOrder ) { 
    1528             hasDuplicate = false; 
    1529             results.sort(sortOrder); 
    1530  
    1531             if ( hasDuplicate ) { 
    1532                 for ( var i = 1; i < results.length; i++ ) { 
    1533                     if ( results[i] === results[i-1] ) { 
    1534                         results.splice(i--, 1); 
    1535                     } 
    1536                 } 
    1537             } 
    1538         } 
    1539     } 
    1540  
    1541     return results; 
    1542 }; 
    1543  
    1544 Sizzle.matches = function(expr, set){ 
    1545     return Sizzle(expr, null, null, set); 
    1546 }; 
    1547  
    1548 Sizzle.find = function(expr, context, isXML){ 
    1549     var set, match; 
    1550  
    1551     if ( !expr ) { 
    1552         return []; 
    1553     } 
    1554  
    1555     for ( var i = 0, l = Expr.order.length; i < l; i++ ) { 
    1556         var type = Expr.order[i], match; 
    1557          
    1558         if ( (match = Expr.match[ type ].exec( expr )) ) { 
    1559             var left = RegExp.leftContext; 
    1560  
    1561             if ( left.substr( left.length - 1 ) !== "\\" ) { 
    1562                 match[1] = (match[1] || "").replace(/\\/g, ""); 
    1563                 set = Expr.find[ type ]( match, context, isXML ); 
    1564                 if ( set != null ) { 
    1565                     expr = expr.replace( Expr.match[ type ], "" ); 
    1566                     break; 
    1567                 } 
    1568             } 
    1569         } 
    1570     } 
    1571  
    1572     if ( !set ) { 
    1573         set = context.getElementsByTagName("*"); 
    1574     } 
    1575  
    1576     return {set: set, expr: expr}; 
    1577 }; 
    1578  
    1579 Sizzle.filter = function(expr, set, inplace, not){ 
    1580     var old = expr, result = [], curLoop = set, match, anyFound, 
    1581         isXMLFilter = set && set[0] && isXML(set[0]); 
    1582  
    1583     while ( expr && set.length ) { 
    1584         for ( var type in Expr.filter ) { 
    1585             if ( (match = Expr.match[ type ].exec( expr )) != null ) { 
    1586                 var filter = Expr.filter[ type ], found, item; 
    1587                 anyFound = false; 
    1588  
    1589                 if ( curLoop == result ) { 
    1590                     result = []; 
    1591                 } 
    1592  
    1593                 if ( Expr.preFilter[ type ] ) { 
    1594                     match = Expr.preFilter[ type ]( match, curLoop, inplace, result, not, isXMLFilter ); 
    1595  
    1596                     if ( !match ) { 
    1597                         anyFound = found = true; 
    1598                     } else if ( match === true ) { 
    1599                         continue; 
    1600                     } 
    1601                 } 
    1602  
    1603                 if ( match ) { 
    1604                     for ( var i = 0; (item = curLoop[i]) != null; i++ ) { 
    1605                         if ( item ) { 
    1606                             found = filter( item, match, i, curLoop ); 
    1607                             var pass = not ^ !!found; 
    1608  
    1609                             if ( inplace && found != null ) { 
    1610                                 if ( pass ) { 
    1611                                     anyFound = true; 
    1612                                 } else { 
    1613                                     curLoop[i] = false; 
    1614                                 } 
    1615                             } else if ( pass ) { 
    1616                                 result.push( item ); 
    1617                                 anyFound = true; 
    1618                             } 
    1619                         } 
    1620                     } 
    1621                 } 
    1622  
    1623                 if ( found !== undefined ) { 
    1624                     if ( !inplace ) { 
    1625                         curLoop = result; 
    1626                     } 
    1627  
    1628                     expr = expr.replace( Expr.match[ type ], "" ); 
    1629  
    1630                     if ( !anyFound ) { 
    1631                         return []; 
    1632                     } 
    1633  
    1634                     break; 
    1635                 } 
    1636             } 
    1637         } 
    1638  
    1639         // Improper expression 
    1640         if ( expr == old ) { 
    1641             if ( anyFound == null ) { 
    1642                 throw "Syntax error, unrecognized expression: " + expr; 
    1643             } else { 
    1644                 break; 
    1645             } 
    1646         } 
    1647  
    1648         old = expr; 
    1649     } 
    1650  
    1651     return curLoop; 
    1652 }; 
    1653  
    1654 var Expr = Sizzle.selectors = { 
    1655     order: [ "ID", "NAME", "TAG" ], 
    1656     match: { 
    1657         ID: /#((?:[\w\u00c0-\uFFFF_-]|\\.)+)/, 
    1658         CLASS: /\.((?:[\w\u00c0-\uFFFF_-]|\\.)+)/, 
    1659         NAME: /\[name=['"]*((?:[\w\u00c0-\uFFFF_-]|\\.)+)['"]*\]/, 
    1660         ATTR: /\[\s*((?:[\w\u00c0-\uFFFF_-]|\\.)+)\s*(?:(\S?=)\s*(['"]*)(.*?)\3|)\s*\]/, 
    1661         TAG: /^((?:[\w\u00c0-\uFFFF\*_-]|\\.)+)/, 
    1662         CHILD: /:(only|nth|last|first)-child(?:\((even|odd|[\dn+-]*)\))?/, 
    1663         POS: /:(nth|eq|gt|lt|first|last|even|odd)(?:\((\d*)\))?(?=[^-]|$)/, 
    1664         PSEUDO: /:((?:[\w\u00c0-\uFFFF_-]|\\.)+)(?:\((['"]*)((?:\([^\)]+\)|[^\2\(\)]*)+)\2\))?/ 
    1665     }, 
    1666     attrMap: { 
    1667         "class": "className", 
    1668         "for": "htmlFor" 
    1669     }, 
    1670     attrHandle: { 
    1671         href: function(elem){ 
    1672             return elem.getAttribute("href"); 
    1673         } 
    1674     }, 
    1675     relative: { 
    1676         "+": function(checkSet, part, isXML){ 
    1677             var isPartStr = typeof part === "string", 
    1678                 isTag = isPartStr && !/\W/.test(part), 
    1679                 isPartStrNotTag = isPartStr && !isTag; 
    1680  
    1681             if ( isTag && !isXML ) { 
    1682                 part = part.toUpperCase(); 
    1683             } 
    1684  
    1685             for ( var i = 0, l = checkSet.length, elem; i < l; i++ ) { 
    1686                 if ( (elem = checkSet[i]) ) { 
    1687                     while ( (elem = elem.previousSibling) && elem.nodeType !== 1 ) {} 
    1688  
    1689                     checkSet[i] = isPartStrNotTag || elem && elem.nodeName === part ? 
    1690                         elem || false : 
    1691                         elem === part; 
    1692                 } 
    1693             } 
    1694  
    1695             if ( isPartStrNotTag ) { 
    1696                 Sizzle.filter( part, checkSet, true ); 
    1697             } 
    1698         }, 
    1699         ">": function(checkSet, part, isXML){ 
    1700             var isPartStr = typeof part === "string"; 
    1701  
    1702             if ( isPartStr && !/\W/.test(part) ) { 
    1703                 part = isXML ? part : part.toUpperCase(); 
    1704  
    1705                 for ( var i = 0, l = checkSet.length; i < l; i++ ) { 
    1706                     var elem = checkSet[i]; 
    1707                     if ( elem ) { 
    1708                         var parent = elem.parentNode; 
    1709                         checkSet[i] = parent.nodeName === part ? parent : false; 
    1710                     } 
    1711                 } 
    1712             } else { 
    1713                 for ( var i = 0, l = checkSet.length; i < l; i++ ) { 
    1714                     var elem = checkSet[i]; 
    1715                     if ( elem ) { 
    1716                         checkSet[i] = isPartStr ? 
    1717                             elem.parentNode : 
    1718                             elem.parentNode === part; 
    1719                     } 
    1720                 } 
    1721  
    1722                 if ( isPartStr ) { 
    1723                     Sizzle.filter( part, checkSet, true ); 
    1724                 } 
    1725             } 
    1726         }, 
    1727         "": function(checkSet, part, isXML){ 
    1728             var doneName = done++, checkFn = dirCheck; 
    1729  
    1730             if ( !part.match(/\W/) ) { 
    1731                 var nodeCheck = part = isXML ? part : part.toUpperCase(); 
    1732                 checkFn = dirNodeCheck; 
    1733             } 
    1734  
    1735             checkFn("parentNode", part, doneName, checkSet, nodeCheck, isXML); 
    1736         }, 
    1737         "~": function(checkSet, part, isXML){ 
    1738             var doneName = done++, checkFn = dirCheck; 
    1739  
    1740             if ( typeof part === "string" && !part.match(/\W/) ) { 
    1741                 var nodeCheck = part = isXML ? part : part.toUpperCase(); 
    1742                 checkFn = dirNodeCheck; 
    1743             } 
    1744  
    1745             checkFn("previousSibling", part, doneName, checkSet, nodeCheck, isXML); 
    1746         } 
    1747     }, 
    1748     find: { 
    1749         ID: function(match, context, isXML){ 
    1750             if ( typeof context.getElementById !== "undefined" && !isXML ) { 
    1751                 var m = context.getElementById(match[1]); 
    1752                 return m ? [m] : []; 
    1753             } 
    1754         }, 
    1755         NAME: function(match, context, isXML){ 
    1756             if ( typeof context.getElementsByName !== "undefined" ) { 
    1757                 var ret = [], results = context.getElementsByName(match[1]); 
    1758  
    1759                 for ( var i = 0, l = results.length; i < l; i++ ) { 
    1760                     if ( results[i].getAttribute("name") === match[1] ) { 
    1761                         ret.push( results[i] ); 
    1762                     } 
    1763                 } 
    1764  
    1765                 return ret.length === 0 ? null : ret; 
    1766             } 
    1767         }, 
    1768         TAG: function(match, context){ 
    1769             return context.getElementsByTagName(match[1]); 
    1770         } 
    1771     }, 
    1772     preFilter: { 
    1773         CLASS: function(match, curLoop, inplace, result, not, isXML){ 
    1774             match = " " + match[1].replace(/\\/g, "") + " "; 
    1775  
    1776             if ( isXML ) { 
    1777                 return match; 
    1778             } 
    1779  
    1780             for ( var i = 0, elem; (elem = curLoop[i]) != null; i++ ) { 
    1781                 if ( elem ) { 
    1782                     if ( not ^ (elem.className && (" " + elem.className + " ").indexOf(match) >= 0) ) { 
    1783                         if ( !inplace ) 
    1784                             result.push( elem ); 
    1785                     } else if ( inplace ) { 
    1786                         curLoop[i] = false; 
    1787                     } 
    1788                 } 
    1789             } 
    1790  
    1791             return false; 
    1792         }, 
    1793         ID: function(match){ 
    1794             return match[1].replace(/\\/g, ""); 
    1795         }, 
    1796         TAG: function(match, curLoop){ 
    1797             for ( var i = 0; curLoop[i] === false; i++ ){} 
    1798             return curLoop[i] && isXML(curLoop[i]) ? match[1] : match[1].toUpperCase(); 
    1799         }, 
    1800         CHILD: function(match){ 
    1801             if ( match[1] == "nth" ) { 
    1802                 // parse equations like 'even', 'odd', '5', '2n', '3n+2', '4n-1', '-n+6' 
    1803                 var test = /(-?)(\d*)n((?:\+|-)?\d*)/.exec( 
    1804                     match[2] == "even" && "2n" || match[2] == "odd" && "2n+1" || 
    1805                     !/\D/.test( match[2] ) && "0n+" + match[2] || match[2]); 
    1806  
    1807                 // calculate the numbers (first)n+(last) including if they are negative 
    1808                 match[2] = (test[1] + (test[2] || 1)) - 0; 
    1809                 match[3] = test[3] - 0; 
    1810             } 
    1811  
    1812             // TODO: Move to normal caching system 
    1813             match[0] = done++; 
    1814  
    1815             return match; 
    1816         }, 
    1817         ATTR: function(match, curLoop, inplace, result, not, isXML){ 
    1818             var name = match[1].replace(/\\/g, ""); 
    1819              
    1820             if ( !isXML && Expr.attrMap[name] ) { 
    1821                 match[1] = Expr.attrMap[name]; 
    1822             } 
    1823  
    1824             if ( match[2] === "~=" ) { 
    1825                 match[4] = " " + match[4] + " "; 
    1826             } 
    1827  
    1828             return match; 
    1829         }, 
    1830         PSEUDO: function(match, curLoop, inplace, result, not){ 
    1831             if ( match[1] === "not" ) { 
    1832                 // If we're dealing with a complex expression, or a simple one 
    1833                 if ( match[3].match(chunker).length > 1 || /^\w/.test(match[3]) ) { 
    1834                     match[3] = Sizzle(match[3], null, null, curLoop); 
    1835                 } else { 
    1836                     var ret = Sizzle.filter(match[3], curLoop, inplace, true ^ not); 
    1837                     if ( !inplace ) { 
    1838                         result.push.apply( result, ret ); 
    1839                     } 
    1840                     return false; 
    1841                 } 
    1842             } else if ( Expr.match.POS.test( match[0] ) || Expr.match.CHILD.test( match[0] ) ) { 
    1843                 return true; 
    1844             } 
    1845              
    1846             return match; 
    1847         }, 
    1848         POS: function(match){ 
    1849             match.unshift( true ); 
    1850             return match; 
    1851         } 
    1852     }, 
    1853     filters: { 
    1854         enabled: function(elem){ 
    1855             return elem.disabled === false && elem.type !== "hidden"; 
    1856         }, 
    1857         disabled: function(elem){ 
    1858             return elem.disabled === true; 
    1859         }, 
    1860         checked: function(elem){ 
    1861             return elem.checked === true; 
    1862         }, 
    1863         selected: function(elem){ 
    1864             // Accessing this property makes selected-by-default 
    1865             // options in Safari work properly 
    1866             elem.parentNode.selectedIndex; 
    1867             return elem.selected === true; 
    1868         }, 
    1869         parent: function(elem){ 
    1870             return !!elem.firstChild; 
    1871         }, 
    1872         empty: function(elem){ 
    1873             return !elem.firstChild; 
    1874         }, 
    1875         has: function(elem, i, match){ 
    1876             return !!Sizzle( match[3], elem ).length; 
    1877         }, 
    1878         header: function(elem){ 
    1879             return /h\d/i.test( elem.nodeName ); 
    1880         }, 
    1881         text: function(elem){ 
    1882             return "text" === elem.type; 
    1883         }, 
    1884         radio: function(elem){ 
    1885             return "radio" === elem.type; 
    1886         }, 
    1887         checkbox: function(elem){ 
    1888             return "checkbox" === elem.type; 
    1889         }, 
    1890         file: function(elem){ 
    1891             return "file" === elem.type; 
    1892         }, 
    1893         password: function(elem){ 
    1894             return "password" === elem.type; 
    1895         }, 
    1896         submit: function(elem){ 
    1897             return "submit" === elem.type; 
    1898         }, 
    1899         image: function(elem){ 
    1900             return "image" === elem.type; 
    1901         }, 
    1902         reset: function(elem){ 
    1903             return "reset" === elem.type; 
    1904         }, 
    1905         button: function(elem){ 
    1906             return "button" === elem.type || elem.nodeName.toUpperCase() === "BUTTON"; 
    1907         }, 
    1908         input: function(elem){ 
    1909             return /input|select|textarea|button/i.test(elem.nodeName); 
    1910         } 
    1911     }, 
    1912     setFilters: { 
    1913         first: function(elem, i){ 
    1914             return i === 0; 
    1915         }, 
    1916         last: function(elem, i, match, array){ 
    1917             return i === array.length - 1; 
    1918         }, 
    1919         even: function(elem, i){ 
    1920             return i % 2 === 0; 
    1921         }, 
    1922         odd: function(elem, i){ 
    1923             return i % 2 === 1; 
    1924         }, 
    1925         lt: function(elem, i, match){ 
    1926             return i < match[3] - 0; 
    1927         }, 
    1928         gt: function(elem, i, match){ 
    1929             return i > match[3] - 0; 
    1930         }, 
    1931         nth: function(elem, i, match){ 
    1932             return match[3] - 0 == i; 
    1933         }, 
    1934         eq: function(elem, i, match){ 
    1935             return match[3] - 0 == i; 
    1936         } 
    1937     }, 
    1938     filter: { 
    1939         PSEUDO: function(elem, match, i, array){ 
    1940             var name = match[1], filter = Expr.filters[ name ]; 
    1941  
    1942             if ( filter ) { 
    1943                 return filter( elem, i, match, array ); 
    1944             } else if ( name === "contains" ) { 
    1945                 return (elem.textContent || elem.innerText || "").indexOf(match[3]) >= 0; 
    1946             } else if ( name === "not" ) { 
    1947                 var not = match[3]; 
    1948  
    1949                 for ( var i = 0, l = not.length; i < l; i++ ) { 
    1950                     if ( not[i] === elem ) { 
    1951                         return false; 
    1952                     } 
    1953                 } 
    1954  
    1955                 return true; 
    1956             } 
    1957         }, 
    1958         CHILD: function(elem, match){ 
    1959             var type = match[1], node = elem; 
    1960             switch (type) { 
    1961                 case 'only': 
    1962                 case 'first': 
    1963                     while (node = node.previousSibling)  { 
    1964                         if ( node.nodeType === 1 ) return false; 
    1965                     } 
    1966                     if ( type == 'first') return true; 
    1967                     node = elem; 
    1968                 case 'last': 
    1969                     while (node = node.nextSibling)  { 
    1970                         if ( node.nodeType === 1 ) return false; 
    1971                     } 
    1972                     return true; 
    1973                 case 'nth': 
    1974                     var first = match[2], last = match[3]; 
    1975  
    1976                     if ( first == 1 && last == 0 ) { 
    1977                         return true; 
    1978                     } 
    1979                      
    1980                     var doneName = match[0], 
    1981                         parent = elem.parentNode; 
    1982      
    1983                     if ( parent && (parent.sizcache !== doneName || !elem.nodeIndex) ) { 
    1984                         var count = 0; 
    1985                         for ( node = parent.firstChild; node; node = node.nextSibling ) { 
    1986                             if ( node.nodeType === 1 ) { 
    1987                                 node.nodeIndex = ++count; 
    1988                             } 
    1989                         }  
    1990                         parent.sizcache = doneName; 
    1991                     } 
    1992                      
    1993                     var diff = elem.nodeIndex - last; 
    1994                     if ( first == 0 ) { 
    1995                         return diff == 0; 
    1996                     } else { 
    1997                         return ( diff % first == 0 && diff / first >= 0 ); 
    1998                     } 
    1999             } 
    2000         }, 
    2001         ID: function(elem, match){ 
    2002             return elem.nodeType === 1 && elem.getAttribute("id") === match; 
    2003         }, 
    2004         TAG: function(elem, match){ 
    2005             return (match === "*" && elem.nodeType === 1) || elem.nodeName === match; 
    2006         }, 
    2007         CLASS: function(elem, match){ 
    2008             return (" " + (elem.className || elem.getAttribute("class")) + " ") 
    2009                 .indexOf( match ) > -1; 
    2010         }, 
    2011         ATTR: function(elem, match){ 
    2012             var name = match[1], 
    2013                 result = Expr.attrHandle[ name ] ? 
    2014                     Expr.attrHandle[ name ]( elem ) : 
    2015                     elem[ name ] != null ? 
    2016                         elem[ name ] : 
    2017                         elem.getAttribute( name ), 
    2018                 value = result + "", 
    2019                 type = match[2], 
    2020                 check = match[4]; 
    2021  
    2022             return result == null ? 
    2023                 type === "!=" : 
    2024                 type === "=" ? 
    2025                 value === check : 
    2026                 type === "*=" ? 
    2027                 value.indexOf(check) >= 0 : 
    2028                 type === "~=" ? 
    2029                 (" " + value + " ").indexOf(check) >= 0 : 
    2030                 !check ? 
    2031                 value && result !== false : 
    2032                 type === "!=" ? 
    2033                 value != check : 
    2034                 type === "^=" ? 
    2035                 value.indexOf(check) === 0 : 
    2036                 type === "$=" ? 
    2037                 value.substr(value.length - check.length) === check : 
    2038                 type === "|=" ? 
    2039                 value === check || value.substr(0, check.length + 1) === check + "-" : 
    2040                 false; 
    2041         }, 
    2042         POS: function(elem, match, i, array){ 
    2043             var name = match[2], filter = Expr.setFilters[ name ]; 
    2044  
    2045             if ( filter ) { 
    2046                 return filter( elem, i, match, array ); 
    2047             } 
    2048         } 
    2049     } 
    2050 }; 
    2051  
    2052 var origPOS = Expr.match.POS; 
    2053  
    2054 for ( var type in Expr.match ) { 
    2055     Expr.match[ type ] = RegExp( Expr.match[ type ].source + /(?![^\[]*\])(?![^\(]*\))/.source ); 
    2056 } 
    2057  
    2058 var makeArray = function(array, results) { 
    2059     array = Array.prototype.slice.call( array ); 
    2060  
    2061     if ( results ) { 
    2062         results.push.apply( results, array ); 
    2063         return results; 
    2064     } 
    2065      
    2066     return array; 
    2067 }; 
    2068  
    2069 // Perform a simple check to determine if the browser is capable of 
    2070 // converting a NodeList to an array using builtin methods. 
    2071 try { 
    2072     Array.prototype.slice.call( document.documentElement.childNodes ); 
    2073  
    2074 // Provide a fallback method if it does not work 
    2075 } catch(e){ 
    2076     makeArray = function(array, results) { 
    2077         var ret = results || []; 
    2078  
    2079         if ( toString.call(array) === "[object Array]" ) { 
    2080             Array.prototype.push.apply( ret, array ); 
    2081         } else { 
    2082             if ( typeof array.length === "number" ) { 
    2083                 for ( var i = 0, l = array.length; i < l; i++ ) { 
    2084                     ret.push( array[i] ); 
    2085                 } 
    2086             } else { 
    2087                 for ( var i = 0; array[i]; i++ ) { 
    2088                     ret.push( array[i] ); 
    2089                 } 
    2090             } 
    2091         } 
    2092  
    2093         return ret; 
    2094     }; 
    2095 } 
    2096  
    2097 var sortOrder; 
    2098  
    2099 if ( document.documentElement.compareDocumentPosition ) { 
    2100     sortOrder = function( a, b ) { 
    2101         var ret = a.compareDocumentPosition(b) & 4 ? -1 : a === b ? 0 : 1; 
    2102         if ( ret === 0 ) { 
    2103             hasDuplicate = true; 
    2104         } 
    2105         return ret; 
    2106     }; 
    2107 } else if ( "sourceIndex" in document.documentElement ) { 
    2108     sortOrder = function( a, b ) { 
    2109         var ret = a.sourceIndex - b.sourceIndex; 
    2110         if ( ret === 0 ) { 
    2111             hasDuplicate = true; 
    2112         } 
    2113         return ret; 
    2114     }; 
    2115 } else if ( document.createRange ) { 
    2116     sortOrder = function( a, b ) { 
    2117         var aRange = a.ownerDocument.createRange(), bRange = b.ownerDocument.createRange(); 
    2118         aRange.selectNode(a); 
    2119         aRange.collapse(true); 
    2120         bRange.selectNode(b); 
    2121         bRange.collapse(true); 
    2122         var ret = aRange.compareBoundaryPoints(Range.START_TO_END, bRange); 
    2123         if ( ret === 0 ) { 
    2124             hasDuplicate = true; 
    2125         } 
    2126         return ret; 
    2127     }; 
    2128 } 
    2129  
    2130 // Check to see if the browser returns elements by name when 
    2131 // querying by getElementById (and provide a workaround) 
    2132 (function(){ 
    2133     // We're going to inject a fake input element with a specified name 
    2134     var form = document.createElement("form"), 
    2135         id = "script" + (new Date).getTime(); 
    2136     form.innerHTML = "<input name='" + id + "'/>"; 
    2137  
    2138     // Inject it into the root element, check its status, and remove it quickly 
    2139     var root = document.documentElement; 
    2140     root.insertBefore( form, root.firstChild ); 
    2141  
    2142     // The workaround has to do additional checks after a getElementById 
    2143     // Which slows things down for other browsers (hence the branching) 
    2144     if ( !!document.getElementById( id ) ) { 
    2145         Expr.find.ID = function(match, context, isXML){ 
    2146             if ( typeof context.getElementById !== "undefined" && !isXML ) { 
    2147                 var m = context.getElementById(match[1]); 
    2148                 return m ? m.id === match[1] || typeof m.getAttributeNode !== "undefined" && m.getAttributeNode("id").nodeValue === match[1] ? [m] : undefined : []; 
    2149             } 
    2150         }; 
    2151  
    2152         Expr.filter.ID = function(elem, match){ 
    2153             var node = typeof elem.getAttributeNode !== "undefined" && elem.getAttributeNode("id"); 
    2154             return elem.nodeType === 1 && node && node.nodeValue === match; 
    2155         }; 
    2156     } 
    2157  
    2158     root.removeChild( form ); 
    2159 })(); 
    2160  
    2161 (function(){ 
    2162     // Check to see if the browser returns only elements 
    2163     // when doing getElementsByTagName("*") 
    2164  
    2165     // Create a fake element 
    2166     var div = document.createElement("div"); 
    2167     div.appendChild( document.createComment("") ); 
    2168  
    2169     // Make sure no comments are found 
    2170     if ( div.getElementsByTagName("*").length > 0 ) { 
    2171         Expr.find.TAG = function(match, context){ 
    2172             var results = context.getElementsByTagName(match[1]); 
    2173  
    2174             // Filter out possible comments 
    2175             if ( match[1] === "*" ) { 
    2176                 var tmp = []; 
    2177  
    2178                 for ( var i = 0; results[i]; i++ ) { 
    2179                     if ( results[i].nodeType === 1 ) { 
    2180                         tmp.push( results[i] ); 
    2181                     } 
    2182                 } 
    2183  
    2184                 results = tmp; 
    2185             } 
    2186  
    2187             return results; 
    2188         }; 
    2189     } 
    2190  
    2191     // Check to see if an attribute returns normalized href attributes 
    2192     div.innerHTML = "<a href='#'></a>"; 
    2193     if ( div.firstChild && typeof div.firstChild.getAttribute !== "undefined" && 
    2194             div.firstChild.getAttribute("href") !== "#" ) { 
    2195         Expr.attrHandle.href = function(elem){ 
    2196             return elem.getAttribute("href", 2); 
    2197         }; 
    2198     } 
    2199 })(); 
    2200  
    2201 if ( document.querySelectorAll ) (function(){ 
    2202     var oldSizzle = Sizzle, div = document.createElement("div"); 
    2203     div.innerHTML = "<p class='TEST'></p>"; 
    2204  
    2205     // Safari can't handle uppercase or unicode characters when 
    2206     // in quirks mode. 
    2207     if ( div.querySelectorAll && div.querySelectorAll(".TEST").length === 0 ) { 
    2208         return; 
    2209     } 
    2210      
    2211     Sizzle = function(query, context, extra, seed){ 
    2212         context = context || document; 
    2213  
    2214         // Only use querySelectorAll on non-XML documents 
    2215         // (ID selectors don't work in non-HTML documents) 
    2216         if ( !seed && context.nodeType === 9 && !isXML(context) ) { 
    2217             try { 
    2218                 return makeArray( context.querySelectorAll(query), extra ); 
    2219             } catch(e){} 
    2220         } 
    2221          
    2222         return oldSizzle(query, context, extra, seed); 
    2223     }; 
    2224  
    2225     Sizzle.find = oldSizzle.find; 
    2226     Sizzle.filter = oldSizzle.filter; 
    2227     Sizzle.selectors = oldSizzle.selectors; 
    2228     Sizzle.matches = oldSizzle.matches; 
    2229 })(); 
    2230  
    2231 if ( document.getElementsByClassName && document.documentElement.getElementsByClassName ) (function(){ 
    2232     var div = document.createElement("div"); 
    2233     div.innerHTML = "<div class='test e'></div><div class='test'></div>"; 
    2234  
    2235     // Opera can't find a second classname (in 9.6) 
    2236     if ( div.getElementsByClassName("e").length === 0 ) 
    2237         return; 
    2238  
    2239     // Safari caches class attributes, doesn't catch changes (in 3.2) 
    2240     div.lastChild.className = "e"; 
    2241  
    2242     if ( div.getElementsByClassName("e").length === 1 ) 
    2243         return; 
    2244  
    2245     Expr.order.splice(1, 0, "CLASS"); 
    2246     Expr.find.CLASS = function(match, context, isXML) { 
    2247         if ( typeof context.getElementsByClassName !== "undefined" && !isXML ) { 
    2248             return context.getElementsByClassName(match[1]); 
    2249         } 
    2250     }; 
    2251 })(); 
    2252  
    2253 function dirNodeCheck( dir, cur, doneName, checkSet, nodeCheck, isXML ) { 
    2254     var sibDir = dir == "previousSibling" && !isXML; 
    2255     for ( var i = 0, l = checkSet.length; i < l; i++ ) { 
    2256         var elem = checkSet[i]; 
    2257         if ( elem ) { 
    2258             if ( sibDir && elem.nodeType === 1 ){ 
    2259                 elem.sizcache = doneName; 
    2260                 elem.sizset = i; 
    2261             } 
    2262             elem = elem[dir]; 
    2263             var match = false; 
    2264  
    2265             while ( elem ) { 
    2266                 if ( elem.sizcache === doneName ) { 
    2267                     match = checkSet[elem.sizset]; 
    2268                     break; 
    2269                 } 
    2270  
    2271                 if ( elem.nodeType === 1 && !isXML ){ 
    2272                     elem.sizcache = doneName; 
    2273                     elem.sizset = i; 
    2274                 } 
    2275  
    2276                 if ( elem.nodeName === cur ) { 
    2277                     match = elem; 
    2278                     break; 
    2279                 } 
    2280  
    2281                 elem = elem[dir]; 
    2282             } 
    2283  
    2284             checkSet[i] = match; 
    2285         } 
    2286     } 
    2287 } 
    2288  
    2289 function dirCheck( dir, cur, doneName, checkSet, nodeCheck, isXML ) { 
    2290     var sibDir = dir == "previousSibling" && !isXML; 
    2291     for ( var i = 0, l = checkSet.length; i < l; i++ ) { 
    2292         var elem = checkSet[i]; 
    2293         if ( elem ) { 
    2294             if ( sibDir && elem.nodeType === 1 ) { 
    2295                 elem.sizcache = doneName; 
    2296                 elem.sizset = i; 
    2297             } 
    2298             elem = elem[dir]; 
    2299             var match = false; 
    2300  
    2301             while ( elem ) { 
    2302                 if ( elem.sizcache === doneName ) { 
    2303                     match = checkSet[elem.sizset]; 
    2304                     break; 
    2305                 } 
    2306  
    2307                 if ( elem.nodeType === 1 ) { 
    2308                     if ( !isXML ) { 
    2309                         elem.sizcache = doneName; 
    2310                         elem.sizset = i; 
    2311                     } 
    2312                     if ( typeof cur !== "string" ) { 
    2313                         if ( elem === cur ) { 
    2314                             match = true; 
    2315                             break; 
    2316                         } 
    2317  
    2318                     } else if ( Sizzle.filter( cur, [elem] ).length > 0 ) { 
    2319                         match = elem; 
    2320                         break; 
    2321                     } 
    2322                 } 
    2323  
    2324                 elem = elem[dir]; 
    2325             } 
    2326  
    2327             checkSet[i] = match; 
    2328         } 
    2329     } 
    2330 } 
    2331  
    2332 var contains = document.compareDocumentPosition ?  function(a, b){ 
    2333     return a.compareDocumentPosition(b) & 16; 
    2334 } : function(a, b){ 
    2335     return a !== b && (a.contains ? a.contains(b) : true); 
    2336 }; 
    2337  
    2338 var isXML = function(elem){ 
    2339     return elem.nodeType === 9 && elem.documentElement.nodeName !== "HTML" || 
    2340         !!elem.ownerDocument && isXML( elem.ownerDocument ); 
    2341 }; 
    2342  
    2343 var posProcess = function(selector, context){ 
    2344     var tmpSet = [], later = "", match, 
    2345         root = context.nodeType ? [context] : context; 
    2346  
    2347     // Position selectors must be done after the filter 
    2348     // And so must :not(positional) so we move all PSEUDOs to the end 
    2349     while ( (match = Expr.match.PSEUDO.exec( selector )) ) { 
    2350         later += match[0]; 
    2351         selector = selector.replace( Expr.match.PSEUDO, "" ); 
    2352     } 
    2353  
    2354     selector = Expr.relative[selector] ? selector + "*" : selector; 
    2355  
    2356     for ( var i = 0, l = root.length; i < l; i++ ) { 
    2357         Sizzle( selector, root[i], tmpSet ); 
    2358     } 
    2359  
    2360     return Sizzle.filter( later, tmpSet ); 
    2361 }; 
    2362  
    2363 // EXPOSE 
    2364 jQuery.find = Sizzle; 
    2365 jQuery.filter = Sizzle.filter; 
    2366 jQuery.expr = Sizzle.selectors; 
    2367 jQuery.expr[":"] = jQuery.expr.filters; 
    2368  
    2369 Sizzle.selectors.filters.hidden = function(elem){ 
    2370     return elem.offsetWidth === 0 || elem.offsetHeight === 0; 
    2371 }; 
    2372  
    2373 Sizzle.selectors.filters.visible = function(elem){ 
    2374     return elem.offsetWidth > 0 || elem.offsetHeight > 0; 
    2375 }; 
    2376  
    2377 Sizzle.selectors.filters.animated = function(elem){ 
    2378     return jQuery.grep(jQuery.timers, function(fn){ 
    2379         return elem === fn.elem; 
    2380     }).length; 
    2381 }; 
    2382  
    2383 jQuery.multiFilter = function( expr, elems, not ) { 
    2384     if ( not ) { 
    2385         expr = ":not(" + expr + ")"; 
    2386     } 
    2387  
    2388     return Sizzle.matches(expr, elems); 
    2389 }; 
    2390  
    2391 jQuery.dir = function( elem, dir ){ 
    2392     var matched = [], cur = elem[dir]; 
    2393     while ( cur && cur != document ) { 
    2394         if ( cur.nodeType == 1 ) 
    2395             matched.push( cur ); 
    2396         cur = cur[dir]; 
    2397     } 
    2398     return matched; 
    2399 }; 
    2400  
    2401 jQuery.nth = function(cur, result, dir, elem){ 
    2402     result = result || 1; 
    2403     var num = 0; 
    2404  
    2405     for ( ; cur; cur = cur[dir] ) 
    2406         if ( cur.nodeType == 1 && ++num == result ) 
    2407             break; 
    2408  
    2409     return cur; 
    2410 }; 
    2411  
    2412 jQuery.sibling = function(n, elem){ 
    2413     var r = []; 
    2414  
    2415     for ( ; n; n = n.nextSibling ) { 
    2416         if ( n.nodeType == 1 && n != elem ) 
    2417             r.push( n ); 
    2418     } 
    2419  
    2420     return r; 
    2421 }; 
    2422  
    2423 return; 
    2424  
    2425 window.Sizzle = Sizzle; 
    2426  
    2427 })(); 
    2428 /* 
    2429  * A number of helper functions used for managing events. 
    2430  * Many of the ideas behind this code originated from 
    2431  * Dean Edwards' addEvent library. 
    2432  */ 
    2433 jQuery.event = { 
    2434  
    2435     // Bind an event to an element 
    2436     // Original by Dean Edwards 
    2437     add: function(elem, types, handler, data) { 
    2438         if ( elem.nodeType == 3 || elem.nodeType == 8 ) 
    2439             return; 
    2440  
    2441         // For whatever reason, IE has trouble passing the window object 
    2442         // around, causing it to be cloned in the process 
    2443         if ( elem.setInterval && elem != window ) 
    2444             elem = window; 
    2445  
    2446         // Make sure that the function being executed has a unique ID 
    2447         if ( !handler.guid ) 
    2448             handler.guid = this.guid++; 
    2449  
    2450         // if data is passed, bind to handler 
    2451         if ( data !== undefined ) { 
    2452             // Create temporary function pointer to original handler 
    2453             var fn = handler; 
    2454  
    2455             // Create unique handler function, wrapped around original handler 
    2456             handler = this.proxy( fn ); 
    2457  
    2458             // Store data in unique handler 
    2459             handler.data = data; 
    2460         } 
    2461  
    2462         // Init the element's event structure 
    2463         var events = jQuery.data(elem, "events") || jQuery.data(elem, "events", {}), 
    2464             handle = jQuery.data(elem, "handle") || jQuery.data(elem, "handle", function(){ 
    2465                 // Handle the second event of a trigger and when 
    2466                 // an event is called after a page has unloaded 
    2467                 return typeof jQuery !== "undefined" && !jQuery.event.triggered ? 
    2468                     jQuery.event.handle.apply(arguments.callee.elem, arguments) : 
    2469                     undefined; 
    2470             }); 
    2471         // Add elem as a property of the handle function 
    2472         // This is to prevent a memory leak with non-native 
    2473         // event in IE. 
    2474         handle.elem = elem; 
    2475  
    2476         // Handle multiple events separated by a space 
    2477         // jQuery(...).bind("mouseover mouseout", fn); 
    2478         jQuery.each(types.split(/\s+/), function(index, type) { 
    2479             // Namespaced event handlers 
    2480             var namespaces = type.split("."); 
    2481             type = namespaces.shift(); 
    2482             handler.type = namespaces.slice().sort().join("."); 
    2483  
    2484             // Get the current list of functions bound to this event 
    2485             var handlers = events[type]; 
    2486              
    2487             if ( jQuery.event.specialAll[type] ) 
    2488                 jQuery.event.specialAll[type].setup.call(elem, data, namespaces); 
    2489  
    2490             // Init the event handler queue 
    2491             if (!handlers) { 
    2492                 handlers = events[type] = {}; 
    2493  
    2494                 // Check for a special event handler 
    2495                 // Only use addEventListener/attachEvent if the special 
    2496                 // events handler returns false 
    2497                 if ( !jQuery.event.special[type] || jQuery.event.special[type].setup.call(elem, data, namespaces) === false ) { 
    2498                     // Bind the global event handler to the element 
    2499                     if (elem.addEventListener) 
    2500                         elem.addEventListener(type, handle, false); 
    2501                     else if (elem.attachEvent) 
    2502                         elem.attachEvent("on" + type, handle); 
    2503                 } 
    2504             } 
    2505  
    2506             // Add the function to the element's handler list 
    2507             handlers[handler.guid] = handler; 
    2508  
    2509             // Keep track of which events have been used, for global triggering 
    2510             jQuery.event.global[type] = true; 
    2511         }); 
    2512  
    2513         // Nullify elem to prevent memory leaks in IE 
    2514         elem = null; 
    2515     }, 
    2516  
    2517     guid: 1, 
    2518     global: {}, 
    2519  
    2520     // Detach an event or set of events from an element 
    2521     remove: function(elem, types, handler) { 
    2522         // don't do events on text and comment nodes 
    2523         if ( elem.nodeType == 3 || elem.nodeType == 8 ) 
    2524             return; 
    2525  
    2526         var events = jQuery.data(elem, "events"), ret, index; 
    2527  
    2528         if ( events ) { 
    2529             // Unbind all events for the element 
    2530             if ( types === undefined || (typeof types === "string" && types.charAt(0) == ".") ) 
    2531                 for ( var type in events ) 
    2532                     this.remove( elem, type + (types || "") ); 
    2533             else { 
    2534                 // types is actually an event object here 
    2535                 if ( types.type ) { 
    2536                     handler = types.handler; 
    2537                     types = types.type; 
    2538                 } 
    2539  
    2540                 // Handle multiple events seperated by a space 
    2541                 // jQuery(...).unbind("mouseover mouseout", fn); 
    2542                 jQuery.each(types.split(/\s+/), function(index, type){ 
    2543                     // Namespaced event handlers 
    2544                     var namespaces = type.split("."); 
    2545                     type = namespaces.shift(); 
    2546                     var namespace = RegExp("(^|\\.)" + namespaces.slice().sort().join(".*\\.") + "(\\.|$)"); 
    2547  
    2548                     if ( events[type] ) { 
    2549                         // remove the given handler for the given type 
    2550                         if ( handler ) 
    2551                             delete events[type][handler.guid]; 
    2552  
    2553                         // remove all handlers for the given type 
    2554                         else 
    2555                             for ( var handle in events[type] ) 
    2556                                 // Handle the removal of namespaced events 
    2557                                 if ( namespace.test(events[type][handle].type) ) 
    2558                                     delete events[type][handle]; 
    2559                                      
    2560                         if ( jQuery.event.specialAll[type] ) 
    2561                             jQuery.event.specialAll[type].teardown.call(elem, namespaces); 
    2562  
    2563                         // remove generic event handler if no more handlers exist 
    2564                         for ( ret in events[type] ) break; 
    2565                         if ( !ret ) { 
    2566                             if ( !jQuery.event.special[type] || jQuery.event.special[type].teardown.call(elem, namespaces) === false ) { 
    2567                                 if (elem.removeEventListener) 
    2568                                     elem.removeEventListener(type, jQuery.data(elem, "handle"), false); 
    2569                                 else if (elem.detachEvent) 
    2570                                     elem.detachEvent("on" + type, jQuery.data(elem, "handle")); 
    2571                             } 
    2572                             ret = null; 
    2573                             delete events[type]; 
    2574                         } 
    2575                     } 
    2576                 }); 
    2577             } 
    2578  
    2579             // Remove the expando if it's no longer used 
    2580             for ( ret in events ) break; 
    2581             if ( !ret ) { 
    2582                 var handle = jQuery.data( elem, "handle" ); 
    2583                 if ( handle ) handle.elem = null; 
    2584                 jQuery.removeData( elem, "events" ); 
    2585                 jQuery.removeData( elem, "handle" ); 
    2586             } 
    2587         } 
    2588     }, 
    2589  
    2590     // bubbling is internal 
    2591     trigger: function( event, data, elem, bubbling ) { 
    2592         // Event object or event type 
    2593         var type = event.type || event; 
    2594  
    2595         if( !bubbling ){ 
    2596             event = typeof event === "object" ? 
    2597                 // jQuery.Event object 
    2598                 event[expando] ? event : 
    2599                 // Object literal 
    2600                 jQuery.extend( jQuery.Event(type), event ) : 
    2601                 // Just the event type (string) 
    2602                 jQuery.Event(type); 
    2603  
    2604             if ( type.indexOf("!") >= 0 ) { 
    2605                 event.type = type = type.slice(0, -1); 
    2606                 event.exclusive = true; 
    2607             } 
    2608  
    2609             // Handle a global trigger 
    2610             if ( !elem ) { 
    2611                 // Don't bubble custom events when global (to avoid too much overhead) 
    2612                 event.stopPropagation(); 
    2613                 // Only trigger if we've ever bound an event for it 
    2614                 if ( this.global[type] ) 
    2615                     jQuery.each( jQuery.cache, function(){ 
    2616                         if ( this.events && this.events[type] ) 
    2617                             jQuery.event.trigger( event, data, this.handle.elem ); 
    2618                     }); 
    2619             } 
    2620  
    2621             // Handle triggering a single element 
    2622  
    2623             // don't do events on text and comment nodes 
    2624             if ( !elem || elem.nodeType == 3 || elem.nodeType == 8 ) 
    2625                 return undefined; 
    2626              
    2627             // Clean up in case it is reused 
    2628             event.result = undefined; 
    2629             event.target = elem; 
    2630              
    2631             // Clone the incoming data, if any 
    2632             data = jQuery.makeArray(data); 
    2633             data.unshift( event ); 
    2634         } 
    2635  
    2636         event.currentTarget = elem; 
    2637  
    2638         // Trigger the event, it is assumed that "handle" is a function 
    2639         var handle = jQuery.data(elem, "handle"); 
    2640         if ( handle ) 
    2641             handle.apply( elem, data ); 
    2642  
    2643         // Handle triggering native .onfoo handlers (and on links since we don't call .click() for links) 
    2644         if ( (!elem[type] || (jQuery.nodeName(elem, 'a') && type == "click")) && elem["on"+type] && elem["on"+type].apply( elem, data ) === false ) 
    2645             event.result = false; 
    2646  
    2647         // Trigger the native events (except for clicks on links) 
    2648         if ( !bubbling && elem[type] && !event.isDefaultPrevented() && !(jQuery.nodeName(elem, 'a') && type == "click") ) { 
    2649             this.triggered = true; 
    2650             try { 
    2651                 elem[ type ](); 
    2652             // prevent IE from throwing an error for some hidden elements 
    2653             } catch (e) {} 
    2654         } 
    2655  
    2656         this.triggered = false; 
    2657  
    2658         if ( !event.isPropagationStopped() ) { 
    2659             var parent = elem.parentNode || elem.ownerDocument; 
    2660             if ( parent ) 
    2661                 jQuery.event.trigger(event, data, parent, true); 
    2662         } 
    2663     }, 
    2664  
    2665     handle: function(event) { 
    2666         // returned undefined or false 
    2667         var all, handlers; 
    2668  
    2669         event = arguments[0] = jQuery.event.fix( event || window.event ); 
    2670         event.currentTarget = this; 
    2671          
    2672         // Namespaced event handlers 
    2673         var namespaces = event.type.split("."); 
    2674         event.type = namespaces.shift(); 
    2675  
    2676         // Cache this now, all = true means, any handler 
    2677         all = !namespaces.length && !event.exclusive; 
    2678          
    2679         var namespace = RegExp("(^|\\.)" + namespaces.slice().sort().join(".*\\.") + "(\\.|$)"); 
    2680  
    2681         handlers = ( jQuery.data(this, "events") || {} )[event.type]; 
    2682  
    2683         for ( var j in handlers ) { 
    2684             var handler = handlers[j]; 
    2685  
    2686             // Filter the functions by class 
    2687             if ( all || namespace.test(handler.type) ) { 
    2688                 // Pass in a reference to the handler function itself 
    2689                 // So that we can later remove it 
    2690                 event.handler = handler; 
    2691                 event.data = handler.data; 
    2692  
    2693                 var ret = handler.apply(this, arguments); 
    2694  
    2695                 if( ret !== undefined ){ 
    2696                     event.result = ret; 
    2697                     if ( ret === false ) { 
    2698                         event.preventDefault(); 
    2699                         event.stopPropagation(); 
    2700                     } 
    2701                 } 
    2702  
    2703                 if( event.isImmediatePropagationStopped() ) 
    2704                     break; 
    2705  
    2706             } 
    2707         } 
    2708     }, 
    2709  
    2710     props: "altKey attrChange attrName bubbles button cancelable charCode clientX clientY ctrlKey currentTarget data detail eventPhase fromElement handler keyCode metaKey newValue originalTarget pageX pageY prevValue relatedNode relatedTarget screenX screenY shiftKey srcElement target toElement view wheelDelta which".split(" "), 
    2711  
    2712     fix: function(event) { 
    2713         if ( event[expando] ) 
    2714             return event; 
    2715  
    2716         // store a copy of the original event object 
    2717         // and "clone" to set read-only properties 
    2718         var originalEvent = event; 
    2719         event = jQuery.Event( originalEvent ); 
    2720  
    2721         for ( var i = this.props.length, prop; i; ){ 
    2722             prop = this.props[ --i ]; 
    2723             event[ prop ] = originalEvent[ prop ]; 
    2724         } 
    2725  
    2726         // Fix target property, if necessary 
    2727         if ( !event.target ) 
    2728             event.target = event.srcElement || document; // Fixes #1925 where srcElement might not be defined either 
    2729  
    2730         // check if target is a textnode (safari) 
    2731         if ( event.target.nodeType == 3 ) 
    2732             event.target = event.target.parentNode; 
    2733  
    2734         // Add relatedTarget, if necessary 
    2735         if ( !event.relatedTarget && event.fromElement ) 
    2736             event.relatedTarget = event.fromElement == event.target ? event.toElement : event.fromElement; 
    2737  
    2738         // Calculate pageX/Y if missing and clientX/Y available 
    2739         if ( event.pageX == null && event.clientX != null ) { 
    2740             var doc = document.documentElement, body = document.body; 
    2741             event.pageX = event.clientX + (doc && doc.scrollLeft || body && body.scrollLeft || 0) - (doc.clientLeft || 0); 
    2742             event.pageY = event.clientY + (doc && doc.scrollTop || body && body.scrollTop || 0) - (doc.clientTop || 0); 
    2743         } 
    2744  
    2745         // Add which for key events 
    2746         if ( !event.which && ((event.charCode || event.charCode === 0) ? event.charCode : event.keyCode) ) 
    2747             event.which = event.charCode || event.keyCode; 
    2748  
    2749         // Add metaKey to non-Mac browsers (use ctrl for PC's and Meta for Macs) 
    2750         if ( !event.metaKey && event.ctrlKey ) 
    2751             event.metaKey = event.ctrlKey; 
    2752  
    2753         // Add which for click: 1 == left; 2 == middle; 3 == right 
    2754         // Note: button is not normalized, so don't use it 
    2755         if ( !event.which && event.button ) 
    2756             event.which = (event.button & 1 ? 1 : ( event.button & 2 ? 3 : ( event.button & 4 ? 2 : 0 ) )); 
    2757  
    2758         return event; 
    2759     }, 
    2760  
    2761     proxy: function( fn, proxy ){ 
    2762         proxy = proxy || function(){ return fn.apply(this, arguments); }; 
    2763         // Set the guid of unique handler to the same of original handler, so it can be removed 
    2764         proxy.guid = fn.guid = fn.guid || proxy.guid || this.guid++; 
    2765         // So proxy can be declared as an argument 
    2766         return proxy; 
    2767     }, 
    2768  
    2769     special: { 
    2770         ready: { 
    2771             // Make sure the ready event is setup 
    2772             setup: bindReady, 
    2773             teardown: function() {} 
    2774         } 
    2775     }, 
    2776      
    2777     specialAll: { 
    2778         live: { 
    2779             setup: function( selector, namespaces ){ 
    2780                 jQuery.event.add( this, namespaces[0], liveHandler ); 
    2781             }, 
    2782             teardown:  function( namespaces ){ 
    2783                 if ( namespaces.length ) { 
    2784                     var remove = 0, name = RegExp("(^|\\.)" + namespaces[0] + "(\\.|$)"); 
    2785                      
    2786                     jQuery.each( (jQuery.data(this, "events").live || {}), function(){ 
    2787                         if ( name.test(this.type) ) 
    2788                             remove++; 
    2789                     }); 
    2790                      
    2791                     if ( remove < 1 ) 
    2792                         jQuery.event.remove( this, namespaces[0], liveHandler ); 
    2793                 } 
    2794             } 
    2795         } 
    2796     } 
    2797 }; 
    2798  
    2799 jQuery.Event = function( src ){ 
    2800     // Allow instantiation without the 'new' keyword 
    2801     if( !this.preventDefault ) 
    2802         return new jQuery.Event(src); 
    2803      
    2804     // Event object 
    2805     if( src && src.type ){ 
    2806         this.originalEvent = src; 
    2807         this.type = src.type; 
    2808     // Event type 
    2809     }else 
    2810         this.type = src; 
    2811  
    2812     // timeStamp is buggy for some events on Firefox(#3843) 
    2813     // So we won't rely on the native value 
    2814     this.timeStamp = now(); 
    2815      
    2816     // Mark it as fixed 
    2817     this[expando] = true; 
    2818 }; 
    2819  
    2820 function returnFalse(){ 
    2821     return false; 
    2822 } 
    2823 function returnTrue(){ 
    2824     return true; 
    2825 } 
    2826  
    2827 // jQuery.Event is based on DOM3 Events as specified by the ECMAScript Language Binding 
    2828 // http://www.w3.org/TR/2003/WD-DOM-Level-3-Events-20030331/ecma-script-binding.html 
    2829 jQuery.Event.prototype = { 
    2830     preventDefault: function() { 
    2831         this.isDefaultPrevented = returnTrue; 
    2832  
    2833         var e = this.originalEvent; 
    2834         if( !e ) 
    2835             return; 
    2836         // if preventDefault exists run it on the original event 
    2837         if (e.preventDefault) 
    2838             e.preventDefault(); 
    2839         // otherwise set the returnValue property of the original event to false (IE) 
    2840         e.returnValue = false; 
    2841     }, 
    2842     stopPropagation: function() { 
    2843         this.isPropagationStopped = returnTrue; 
    2844  
    2845         var e = this.originalEvent; 
    2846         if( !e ) 
    2847             return; 
    2848         // if stopPropagation exists run it on the original event 
    2849         if (e.stopPropagation) 
    2850             e.stopPropagation(); 
    2851         // otherwise set the cancelBubble property of the original event to true (IE) 
    2852         e.cancelBubble = true; 
    2853     }, 
    2854     stopImmediatePropagation:function(){ 
    2855         this.isImmediatePropagationStopped = returnTrue; 
    2856         this.stopPropagation(); 
    2857     }, 
    2858     isDefaultPrevented: returnFalse, 
    2859     isPropagationStopped: returnFalse, 
    2860     isImmediatePropagationStopped: returnFalse 
    2861 }; 
    2862 // Checks if an event happened on an element within another element 
    2863 // Used in jQuery.event.special.mouseenter and mouseleave handlers 
    2864 var withinElement = function(event) { 
    2865     // Check if mouse(over|out) are still within the same parent element 
    2866     var parent = event.relatedTarget; 
    2867     // Traverse up the tree 
    2868     while ( parent && parent != this ) 
    2869         try { parent = parent.parentNode; } 
    2870         catch(e) { parent = this; } 
    2871      
    2872     if( parent != this ){ 
    2873         // set the correct event type 
    2874         event.type = event.data; 
    2875         // handle event if we actually just moused on to a non sub-element 
    2876         jQuery.event.handle.apply( this, arguments ); 
    2877     } 
    2878 }; 
    2879      
    2880 jQuery.each({  
    2881     mouseover: 'mouseenter',  
    2882     mouseout: 'mouseleave' 
    2883 }, function( orig, fix ){ 
    2884     jQuery.event.special[ fix ] = { 
    2885         setup: function(){ 
    2886             jQuery.event.add( this, orig, withinElement, fix ); 
    2887         }, 
    2888         teardown: function(){ 
    2889             jQuery.event.remove( this, orig, withinElement ); 
    2890         } 
    2891     };              
    2892 }); 
    2893  
    2894 jQuery.fn.extend({ 
    2895     bind: function( type, data, fn ) { 
    2896         return type == "unload" ? this.one(type, data, fn) : this.each(function(){ 
    2897             jQuery.event.add( this, type, fn || data, fn && data ); 
    2898         }); 
    2899     }, 
    2900  
    2901     one: function( type, data, fn ) { 
    2902         var one = jQuery.event.proxy( fn || data, function(event) { 
    2903             jQuery(this).unbind(event, one); 
    2904             return (fn || data).apply( this, arguments ); 
    2905         }); 
    2906         return this.each(function(){ 
    2907             jQuery.event.add( this, type, one, fn && data); 
    2908         }); 
    2909     }, 
    2910  
    2911     unbind: function( type, fn ) { 
    2912         return this.each(function(){ 
    2913             jQuery.event.remove( this, type, fn ); 
    2914         }); 
    2915     }, 
    2916  
    2917     trigger: function( type, data ) { 
    2918         return this.each(function(){ 
    2919             jQuery.event.trigger( type, data, this ); 
    2920         }); 
    2921     }, 
    2922  
    2923     triggerHandler: function( type, data ) { 
    2924         if( this[0] ){ 
    2925             var event = jQuery.Event(type); 
    2926             event.preventDefault(); 
    2927             event.stopPropagation(); 
    2928             jQuery.event.trigger( event, data, this[0] ); 
    2929             return event.result; 
    2930         }        
    2931     }, 
    2932  
    2933     toggle: function( fn ) { 
    2934         // Save reference to arguments for access in closure 
    2935         var args = arguments, i = 1; 
    2936  
    2937         // link all the functions, so any of them can unbind this click handler 
    2938         while( i < args.length ) 
    2939             jQuery.event.proxy( fn, args[i++] ); 
    2940  
    2941         return this.click( jQuery.event.proxy( fn, function(event) { 
    2942             // Figure out which function to execute 
    2943             this.lastToggle = ( this.lastToggle || 0 ) % i; 
    2944  
    2945             // Make sure that clicks stop 
    2946             event.preventDefault(); 
    2947  
    2948             // and execute the function 
    2949             return args[ this.lastToggle++ ].apply( this, arguments ) || false; 
    2950         })); 
    2951     }, 
    2952  
    2953     hover: function(fnOver, fnOut) { 
    2954         return this.mouseenter(fnOver).mouseleave(fnOut); 
    2955     }, 
    2956  
    2957     ready: function(fn) { 
    2958         // Attach the listeners 
    2959         bindReady(); 
    2960  
    2961         // If the DOM is already ready 
    2962         if ( jQuery.isReady ) 
    2963             // Execute the function immediately 
    2964             fn.call( document, jQuery ); 
    2965  
    2966         // Otherwise, remember the function for later 
    2967         else 
    2968             // Add the function to the wait list 
    2969             jQuery.readyList.push( fn ); 
    2970  
    2971         return this; 
    2972     }, 
    2973      
    2974     live: function( type, fn ){ 
    2975         var proxy = jQuery.event.proxy( fn ); 
    2976         proxy.guid += this.selector + type; 
    2977  
    2978         jQuery(document).bind( liveConvert(type, this.selector), this.selector, proxy ); 
    2979  
    2980         return this; 
    2981     }, 
    2982      
    2983     die: function( type, fn ){ 
    2984         jQuery(document).unbind( liveConvert(type, this.selector), fn ? { guid: fn.guid + this.selector + type } : null ); 
    2985         return this; 
    2986     } 
    2987 }); 
    2988  
    2989 function liveHandler( event ){ 
    2990     var check = RegExp("(^|\\.)" + event.type + "(\\.|$)"), 
    2991         stop = true, 
    2992         elems = []; 
    2993  
    2994     jQuery.each(jQuery.data(this, "events").live || [], function(i, fn){ 
    2995         if ( check.test(fn.type) ) { 
    2996             var elem = jQuery(event.target).closest(fn.data)[0]; 
    2997             if ( elem ) 
    2998                 elems.push({ elem: elem, fn: fn }); 
    2999         } 
    3000     }); 
    3001  
    3002     elems.sort(function(a,b) { 
    3003         return jQuery.data(a.elem, "closest") - jQuery.data(b.elem, "closest"); 
    3004     }); 
    3005      
    3006     jQuery.each(elems, function(){ 
    3007         if ( this.fn.call(this.elem, event, this.fn.data) === false ) 
    3008             return (stop = false); 
    3009     }); 
    3010  
    3011     return stop; 
    3012 } 
    3013  
    3014 function liveConvert(type, selector){ 
    3015     return ["live", type, selector.replace(/\./g, "`").replace(/ /g, "|")].join("."); 
    3016 } 
    3017  
    3018 jQuery.extend({ 
    3019     isReady: false, 
    3020     readyList: [], 
    3021     // Handle when the DOM is ready 
    3022     ready: function() { 
    3023         // Make sure that the DOM is not already loaded 
    3024         if ( !jQuery.isReady ) { 
    3025             // Remember that the DOM is ready 
    3026             jQuery.isReady = true; 
    3027  
    3028             // If there are functions bound, to execute 
    3029             if ( jQuery.readyList ) { 
    3030                 // Execute all of them 
    3031                 jQuery.each( jQuery.readyList, function(){ 
    3032                     this.call( document, jQuery ); 
    3033                 }); 
    3034  
    3035                 // Reset the list of functions 
    3036                 jQuery.readyList = null; 
    3037             } 
    3038  
    3039             // Trigger any bound ready events 
    3040             jQuery(document).triggerHandler("ready"); 
    3041         } 
    3042     } 
    3043 }); 
    3044  
    3045 var readyBound = false; 
    3046  
    3047 function bindReady(){ 
    3048     if ( readyBound ) return; 
    3049     readyBound = true; 
    3050  
    3051     // Mozilla, Opera and webkit nightlies currently support this event 
    3052     if ( document.addEventListener ) { 
    3053         // Use the handy event callback 
    3054         document.addEventListener( "DOMContentLoaded", function(){ 
    3055             document.removeEventListener( "DOMContentLoaded", arguments.callee, false ); 
    3056             jQuery.ready(); 
    3057         }, false ); 
    3058  
    3059     // If IE event model is used 
    3060     } else if ( document.attachEvent ) { 
    3061         // ensure firing before onload, 
    3062         // maybe late but safe also for iframes 
    3063         document.attachEvent("onreadystatechange", function(){ 
    3064             if ( document.readyState === "complete" ) { 
    3065                 document.detachEvent( "onreadystatechange", arguments.callee ); 
    3066                 jQuery.ready(); 
    3067             } 
    3068         }); 
    3069  
    3070         // If IE and not an iframe 
    3071         // continually check to see if the document is ready 
    3072         if ( document.documentElement.doScroll && window == window.top ) (function(){ 
    3073             if ( jQuery.isReady ) return; 
    3074  
    3075             try { 
    3076                 // If IE is used, use the trick by Diego Perini 
    3077                 // http://javascript.nwbox.com/IEContentLoaded/ 
    3078                 document.documentElement.doScroll("left"); 
    3079             } catch( error ) { 
    3080                 setTimeout( arguments.callee, 0 ); 
    3081                 return; 
    3082             } 
    3083  
    3084             // and execute any waiting functions 
    3085             jQuery.ready(); 
    3086         })(); 
    3087     } 
    3088  
    3089     // A fallback to window.onload, that will always work 
    3090     jQuery.event.add( window, "load", jQuery.ready ); 
    3091 } 
    3092  
    3093 jQuery.each( ("blur,focus,load,resize,scroll,unload,click,dblclick," + 
    3094     "mousedown,mouseup,mousemove,mouseover,mouseout,mouseenter,mouseleave," + 
    3095     "change,select,submit,keydown,keypress,keyup,error").split(","), function(i, name){ 
    3096  
    3097     // Handle event binding 
    3098     jQuery.fn[name] = function(fn){ 
    3099         return fn ? this.bind(name, fn) : this.trigger(name); 
    3100     }; 
    3101 }); 
    3102  
    3103 // Prevent memory leaks in IE 
    3104 // And prevent errors on refresh with events like mouseover in other browsers 
    3105 // Window isn't included so as not to unbind existing unload events 
    3106 jQuery( window ).bind( 'unload', function(){  
    3107     for ( var id in jQuery.cache ) 
    3108         // Skip the window 
    3109         if ( id != 1 && jQuery.cache[ id ].handle ) 
    3110             jQuery.event.remove( jQuery.cache[ id ].handle.elem ); 
    3111 });  
    3112 (function(){ 
    3113  
    3114     jQuery.support = {}; 
    3115  
    3116     var root = document.documentElement, 
    3117         script = document.createElement("script"), 
    3118         div = document.createElement("div"), 
    3119         id = "script" + (new Date).getTime(); 
    3120  
    3121     div.style.display = "none"; 
    3122     div.innerHTML = '   <link/><table></table><a href="/a" style="color:red;float:left;opacity:.5;">a</a><select><option>text</option></select><object><param/></object>'; 
    3123  
    3124     var all = div.getElementsByTagName("*"), 
    3125         a = div.getElementsByTagName("a")[0]; 
    3126  
    3127     // Can't get basic test support 
    3128     if ( !all || !all.length || !a ) { 
    3129         return; 
    3130     } 
    3131  
    3132     jQuery.support = { 
    3133         // IE strips leading whitespace when .innerHTML is used 
    3134         leadingWhitespace: div.firstChild.nodeType == 3, 
    3135          
    3136         // Make sure that tbody elements aren't automatically inserted 
    3137         // IE will insert them into empty tables 
    3138         tbody: !div.getElementsByTagName("tbody").length, 
    3139          
    3140         // Make sure that you can get all elements in an <object> element 
    3141         // IE 7 always returns no results 
    3142         objectAll: !!div.getElementsByTagName("object")[0] 
    3143             .getElementsByTagName("*").length, 
    3144          
    3145         // Make sure that link elements get serialized correctly by innerHTML 
    3146         // This requires a wrapper element in IE 
    3147         htmlSerialize: !!div.getElementsByTagName("link").length, 
    3148          
    3149         // Get the style information from getAttribute 
    3150         // (IE uses .cssText insted) 
    3151         style: /red/.test( a.getAttribute("style") ), 
    3152          
    3153         // Make sure that URLs aren't manipulated 
    3154         // (IE normalizes it by default) 
    3155         hrefNormalized: a.getAttribute("href") === "/a", 
    3156          
    3157         // Make sure that element opacity exists 
    3158         // (IE uses filter instead) 
    3159         opacity: a.style.opacity === "0.5", 
    3160          
    3161         // Verify style float existence 
    3162         // (IE uses styleFloat instead of cssFloat) 
    3163         cssFloat: !!a.style.cssFloat, 
    3164  
    3165         // Will be defined later 
    3166         scriptEval: false, 
    3167         noCloneEvent: true, 
    3168         boxModel: null 
    3169     }; 
    3170      
    3171     script.type = "text/javascript"; 
    3172     try { 
    3173         script.appendChild( document.createTextNode( "window." + id + "=1;" ) ); 
    3174     } catch(e){} 
    3175  
    3176     root.insertBefore( script, root.firstChild ); 
    3177      
    3178     // Make sure that the execution of code works by injecting a script 
    3179     // tag with appendChild/createTextNode 
    3180     // (IE doesn't support this, fails, and uses .text instead) 
    3181     if ( window[ id ] ) { 
    3182         jQuery.support.scriptEval = true; 
    3183         delete window[ id ]; 
    3184     } 
    3185  
    3186     root.removeChild( script ); 
    3187  
    3188     if ( div.attachEvent && div.fireEvent ) { 
    3189         div.attachEvent("onclick", function(){ 
    3190             // Cloning a node shouldn't copy over any 
    3191             // bound event handlers (IE does this) 
    3192             jQuery.support.noCloneEvent = false; 
    3193             div.detachEvent("onclick", arguments.callee); 
    3194         }); 
    3195         div.cloneNode(true).fireEvent("onclick"); 
    3196     } 
    3197  
    3198     // Figure out if the W3C box model works as expected 
    3199     // document.body must exist before we can do this 
    3200     jQuery(function(){ 
    3201         var div = document.createElement("div"); 
    3202         div.style.width = div.style.paddingLeft = "1px"; 
    3203  
    3204         document.body.appendChild( div ); 
    3205         jQuery.boxModel = jQuery.support.boxModel = div.offsetWidth === 2; 
    3206         document.body.removeChild( div ).style.display = 'none'; 
    3207     }); 
    3208 })(); 
    3209  
    3210 var styleFloat = jQuery.support.cssFloat ? "cssFloat" : "styleFloat"; 
    3211  
    3212 jQuery.props = { 
    3213     "for": "htmlFor", 
    3214     "class": "className", 
    3215     "float": styleFloat, 
    3216     cssFloat: styleFloat, 
    3217     styleFloat: styleFloat, 
    3218     readonly: "readOnly", 
    3219     maxlength: "maxLength", 
    3220     cellspacing: "cellSpacing", 
    3221     rowspan: "rowSpan", 
    3222     tabindex: "tabIndex" 
    3223 }; 
    3224 jQuery.fn.extend({ 
    3225     // Keep a copy of the old load 
    3226     _load: jQuery.fn.load, 
    3227  
    3228     load: function( url, params, callback ) { 
    3229         if ( typeof url !== "string" ) 
    3230             return this._load( url ); 
    3231  
    3232         var off = url.indexOf(" "); 
    3233         if ( off >= 0 ) { 
    3234             var selector = url.slice(off, url.length); 
    3235             url = url.slice(0, off); 
    3236         } 
    3237  
    3238         // Default to a GET request 
    3239         var type = "GET"; 
    3240  
    3241         // If the second parameter was provided 
    3242         if ( params ) 
    3243             // If it's a function 
    3244             if ( jQuery.isFunction( params ) ) { 
    3245                 // We assume that it's the callback 
    3246                 callback = params; 
    3247                 params = null; 
    3248  
    3249             // Otherwise, build a param string 
    3250             } else if( typeof params === "object" ) { 
    3251                 params = jQuery.param( params ); 
    3252                 type = "POST"; 
    3253             } 
    3254  
    3255         var self = this; 
    3256  
    3257         // Request the remote document 
    3258         jQuery.ajax({ 
    3259             url: url, 
    3260             type: type, 
    3261             dataType: "html", 
    3262             data: params, 
    3263             complete: function(res, status){ 
    3264                 // If successful, inject the HTML into all the matched elements 
    3265                 if ( status == "success" || status == "notmodified" ) 
    3266                     // See if a selector was specified 
    3267                     self.html( selector ? 
    3268                         // Create a dummy div to hold the results 
    3269                         jQuery("<div/>") 
    3270                             // inject the contents of the document in, removing the scripts 
    3271                             // to avoid any 'Permission Denied' errors in IE 
    3272                             .append(res.responseText.replace(/<script(.|\s)*?\/script>/g, "")) 
    3273  
    3274                             // Locate the specified elements 
    3275                             .find(selector) : 
    3276  
    3277                         // If not, just inject the full result 
    3278                         res.responseText ); 
    3279  
    3280                 if( callback ) 
    3281                     self.each( callback, [res.responseText, status, res] ); 
    3282             } 
    3283         }); 
    3284         return this; 
    3285     }, 
    3286  
    3287     serialize: function() { 
    3288         return jQuery.param(this.serializeArray()); 
    3289     }, 
    3290     serializeArray: function() { 
    3291         return this.map(function(){ 
    3292             return this.elements ? jQuery.makeArray(this.elements) : this; 
    3293         }) 
    3294         .filter(function(){ 
    3295             return this.name && !this.disabled && 
    3296                 (this.checked || /select|textarea/i.test(this.nodeName) || 
    3297                     /text|hidden|password|search/i.test(this.type)); 
    3298         }) 
    3299         .map(function(i, elem){ 
    3300             var val = jQuery(this).val(); 
    3301             return val == null ? null : 
    3302                 jQuery.isArray(val) ? 
    3303                     jQuery.map( val, function(val, i){ 
    3304                         return {name: elem.name, value: val}; 
    3305                     }) : 
    3306                     {name: elem.name, value: val}; 
    3307         }).get(); 
    3308     } 
    3309 }); 
    3310  
    3311 // Attach a bunch of functions for handling common AJAX events 
    3312 jQuery.each( "ajaxStart,ajaxStop,ajaxComplete,ajaxError,ajaxSuccess,ajaxSend".split(","), function(i,o){ 
    3313     jQuery.fn[o] = function(f){ 
    3314         return this.bind(o, f); 
    3315     }; 
    3316 }); 
    3317  
    3318 var jsc = now(); 
    3319  
    3320 jQuery.extend({ 
    3321    
    3322     get: function( url, data, callback, type ) { 
    3323         // shift arguments if data argument was ommited 
    3324         if ( jQuery.isFunction( data ) ) { 
    3325             callback = data; 
    3326             data = null; 
    3327         } 
    3328  
    3329         return jQuery.ajax({ 
    3330             type: "GET", 
    3331             url: url, 
    3332             data: data, 
    3333             success: callback, 
    3334             dataType: type 
    3335         }); 
    3336     }, 
    3337  
    3338     getScript: function( url, callback ) { 
    3339         return jQuery.get(url, null, callback, "script"); 
    3340     }, 
    3341  
    3342     getJSON: function( url, data, callback ) { 
    3343         return jQuery.get(url, data, callback, "json"); 
    3344     }, 
    3345  
    3346     post: function( url, data, callback, type ) { 
    3347         if ( jQuery.isFunction( data ) ) { 
    3348             callback = data; 
    3349             data = {}; 
    3350         } 
    3351  
    3352         return jQuery.ajax({ 
    3353             type: "POST", 
    3354             url: url, 
    3355             data: data, 
    3356             success: callback, 
    3357             dataType: type 
    3358         }); 
    3359     }, 
    3360  
    3361     ajaxSetup: function( settings ) { 
    3362         jQuery.extend( jQuery.ajaxSettings, settings ); 
    3363     }, 
    3364  
    3365     ajaxSettings: { 
    3366         url: location.href, 
    3367         global: true, 
    3368         type: "GET", 
    3369         contentType: "application/x-www-form-urlencoded", 
    3370         processData: true, 
    3371         async: true, 
    3372         /* 
    3373         timeout: 0, 
    3374         data: null, 
    3375         username: null, 
    3376         password: null, 
    3377         */ 
    3378         // Create the request object; Microsoft failed to properly 
    3379         // implement the XMLHttpRequest in IE7, so we use the ActiveXObject when it is available 
    3380         // This function can be overriden by calling jQuery.ajaxSetup 
    3381         xhr:function(){ 
    3382             return window.ActiveXObject ? new ActiveXObject("Microsoft.XMLHTTP") : new XMLHttpRequest(); 
    3383         }, 
    3384         accepts: { 
    3385             xml: "application/xml, text/xml", 
    3386             html: "text/html", 
    3387             script: "text/javascript, application/javascript", 
    3388             json: "application/json, text/javascript", 
    3389             text: "text/plain", 
    3390             _default: "*/*" 
    3391         } 
    3392     }, 
    3393  
    3394     // Last-Modified header cache for next request 
    3395     lastModified: {}, 
    3396  
    3397     ajax: function( s ) { 
    3398         // Extend the settings, but re-extend 's' so that it can be 
    3399         // checked again later (in the test suite, specifically) 
    3400         s = jQuery.extend(true, s, jQuery.extend(true, {}, jQuery.ajaxSettings, s)); 
    3401  
    3402         var jsonp, jsre = /=\?(&|$)/g, status, data, 
    3403             type = s.type.toUpperCase(); 
    3404  
    3405         // convert data if not already a string 
    3406         if ( s.data && s.processData && typeof s.data !== "string" ) 
    3407             s.data = jQuery.param(s.data); 
    3408  
    3409         // Handle JSONP Parameter Callbacks 
    3410         if ( s.dataType == "jsonp" ) { 
    3411             if ( type == "GET" ) { 
    3412                 if ( !s.url.match(jsre) ) 
    3413                     s.url += (s.url.match(/\?/) ? "&" : "?") + (s.jsonp || "callback") + "=?"; 
    3414             } else if ( !s.data || !s.data.match(jsre) ) 
    3415                 s.data = (s.data ? s.data + "&" : "") + (s.jsonp || "callback") + "=?"; 
    3416             s.dataType = "json"; 
    3417         } 
    3418  
    3419         // Build temporary JSONP function 
    3420         if ( s.dataType == "json" && (s.data && s.data.match(jsre) || s.url.match(jsre)) ) { 
    3421             jsonp = "jsonp" + jsc++; 
    3422  
    3423             // Replace the =? sequence both in the query string and the data 
    3424             if ( s.data ) 
    3425                 s.data = (s.data + "").replace(jsre, "=" + jsonp + "$1"); 
    3426             s.url = s.url.replace(jsre, "=" + jsonp + "$1"); 
    3427  
    3428             // We need to make sure 
    3429             // that a JSONP style response is executed properly 
    3430             s.dataType = "script"; 
    3431  
    3432             // Handle JSONP-style loading 
    3433             window[ jsonp ] = function(tmp){ 
    3434                 data = tmp; 
    3435                 success(); 
    3436                 complete(); 
    3437                 // Garbage collect 
    3438                 window[ jsonp ] = undefined; 
    3439                 try{ delete window[ jsonp ]; } catch(e){} 
    3440                 if ( head ) 
    3441                     head.removeChild( script ); 
    3442             }; 
    3443         } 
    3444  
    3445         if ( s.dataType == "script" && s.cache == null ) 
    3446             s.cache = false; 
    3447  
    3448         if ( s.cache === false && type == "GET" ) { 
    3449             var ts = now(); 
    3450             // try replacing _= if it is there 
    3451             var ret = s.url.replace(/(\?|&)_=.*?(&|$)/, "$1_=" + ts + "$2"); 
    3452             // if nothing was replaced, add timestamp to the end 
    3453             s.url = ret + ((ret == s.url) ? (s.url.match(/\?/) ? "&" : "?") + "_=" + ts : ""); 
    3454         } 
    3455  
    3456         // If data is available, append data to url for get requests 
    3457         if ( s.data && type == "GET" ) { 
    3458             s.url += (s.url.match(/\?/) ? "&" : "?") + s.data; 
    3459  
    3460             // IE likes to send both get and post data, prevent this 
    3461             s.data = null; 
    3462         } 
    3463  
    3464         // Watch for a new set of requests 
    3465         if ( s.global && ! jQuery.active++ ) 
    3466             jQuery.event.trigger( "ajaxStart" ); 
    3467  
    3468         // Matches an absolute URL, and saves the domain 
    3469         var parts = /^(\w+:)?\/\/([^\/?#]+)/.exec( s.url ); 
    3470  
    3471         // If we're requesting a remote document 
    3472         // and trying to load JSON or Script with a GET 
    3473         if ( s.dataType == "script" && type == "GET" && parts 
    3474             && ( parts[1] && parts[1] != location.protocol || parts[2] != location.host )){ 
    3475  
    3476             var head = document.getElementsByTagName("head")[0]; 
    3477             var script = document.createElement("script"); 
    3478             script.src = s.url; 
    3479             if (s.scriptCharset) 
    3480                 script.charset = s.scriptCharset; 
    3481  
    3482             // Handle Script loading 
    3483             if ( !jsonp ) { 
    3484                 var done = false; 
    3485  
    3486                 // Attach handlers for all browsers 
    3487                 script.onload = script.onreadystatechange = function(){ 
    3488                     if ( !done && (!this.readyState || 
    3489                             this.readyState == "loaded" || this.readyState == "complete") ) { 
    3490                         done = true; 
    3491                         success(); 
    3492                         complete(); 
    3493  
    3494                         // Handle memory leak in IE 
    3495                         script.onload = script.onreadystatechange = null; 
    3496                         head.removeChild( script ); 
    3497                     } 
    3498                 }; 
    3499             } 
    3500  
    3501             head.appendChild(script); 
    3502  
    3503             // We handle everything using the script element injection 
    3504             return undefined; 
    3505         } 
    3506  
    3507         var requestDone = false; 
    3508  
    3509         // Create the request object 
    3510         var xhr = s.xhr(); 
    3511  
    3512         // Open the socket 
    3513         // Passing null username, generates a login popup on Opera (#2865) 
    3514         if( s.username ) 
    3515             xhr.open(type, s.url, s.async, s.username, s.password); 
    3516         else 
    3517             xhr.open(type, s.url, s.async); 
    3518  
    3519         // Need an extra try/catch for cross domain requests in Firefox 3 
    3520         try { 
    3521             // Set the correct header, if data is being sent 
    3522             if ( s.data ) 
    3523                 xhr.setRequestHeader("Content-Type", s.contentType); 
    3524  
    3525             // Set the If-Modified-Since header, if ifModified mode. 
    3526             if ( s.ifModified ) 
    3527                 xhr.setRequestHeader("If-Modified-Since", 
    3528                     jQuery.lastModified[s.url] || "Thu, 01 Jan 1970 00:00:00 GMT" ); 
    3529  
    3530             // Set header so the called script knows that it's an XMLHttpRequest 
    3531             xhr.setRequestHeader("X-Requested-With", "XMLHttpRequest"); 
    3532  
    3533             // Set the Accepts header for the server, depending on the dataType 
    3534             xhr.setRequestHeader("Accept", s.dataType && s.accepts[ s.dataType ] ? 
    3535                 s.accepts[ s.dataType ] + ", */*" : 
    3536                 s.accepts._default ); 
    3537         } catch(e){} 
    3538  
    3539         // Allow custom headers/mimetypes and early abort 
    3540         if ( s.beforeSend && s.beforeSend(xhr, s) === false ) { 
    3541             // Handle the global AJAX counter 
    3542             if ( s.global && ! --jQuery.active ) 
    3543                 jQuery.event.trigger( "ajaxStop" ); 
    3544             // close opended socket 
    3545             xhr.abort(); 
    3546             return false; 
    3547         } 
    3548  
    3549         if ( s.global ) 
    3550             jQuery.event.trigger("ajaxSend", [xhr, s]); 
    3551  
    3552         // Wait for a response to come back 
    3553         var onreadystatechange = function(isTimeout){ 
    3554             // The request was aborted, clear the interval and decrement jQuery.active 
    3555             if (xhr.readyState == 0) { 
    3556                 if (ival) { 
    3557                     // clear poll interval 
    3558                     clearInterval(ival); 
    3559                     ival = null; 
    3560                     // Handle the global AJAX counter 
    3561                     if ( s.global && ! --jQuery.active ) 
    3562                         jQuery.event.trigger( "ajaxStop" ); 
    3563                 } 
    3564             // The transfer is complete and the data is available, or the request timed out 
    3565             } else if ( !requestDone && xhr && (xhr.readyState == 4 || isTimeout == "timeout") ) { 
    3566                 requestDone = true; 
    3567  
    3568                 // clear poll interval 
    3569                 if (ival) { 
    3570                     clearInterval(ival); 
    3571                     ival = null; 
    3572                 } 
    3573  
    3574                 status = isTimeout == "timeout" ? "timeout" : 
    3575                     !jQuery.httpSuccess( xhr ) ? "error" : 
    3576                     s.ifModified && jQuery.httpNotModified( xhr, s.url ) ? "notmodified" : 
    3577                     "success"; 
    3578  
    3579                 if ( status == "success" ) { 
    3580                     // Watch for, and catch, XML document parse errors 
    3581                     try { 
    3582                         // process the data (runs the xml through httpData regardless of callback) 
    3583                         data = jQuery.httpData( xhr, s.dataType, s ); 
    3584                     } catch(e) { 
    3585                         status = "parsererror"; 
    3586                     } 
    3587                 } 
    3588  
    3589                 // Make sure that the request was successful or notmodified 
    3590                 if ( status == "success" ) { 
    3591                     // Cache Last-Modified header, if ifModified mode. 
    3592                     var modRes; 
    3593                     try { 
    3594                         modRes = xhr.getResponseHeader("Last-Modified"); 
    3595                     } catch(e) {} // swallow exception thrown by FF if header is not available 
    3596  
    3597                     if ( s.ifModified && modRes ) 
    3598                         jQuery.lastModified[s.url] = modRes; 
    3599  
    3600                     // JSONP handles its own success callback 
    3601                     if ( !jsonp ) 
    3602                         success(); 
    3603                 } else 
    3604                     jQuery.handleError(s, xhr, status); 
    3605  
    3606                 // Fire the complete handlers 
    3607                 complete(); 
    3608  
    3609                 if ( isTimeout ) 
    3610                     xhr.abort(); 
    3611  
    3612                 // Stop memory leaks 
    3613                 if ( s.async ) 
    3614                     xhr = null; 
    3615             } 
    3616         }; 
    3617  
    3618         if ( s.async ) { 
    3619             // don't attach the handler to the request, just poll it instead 
    3620             var ival = setInterval(onreadystatechange, 13); 
    3621  
    3622             // Timeout checker 
    3623             if ( s.timeout > 0 ) 
    3624                 setTimeout(function(){ 
    3625                     // Check to see if the request is still happening 
    3626                     if ( xhr && !requestDone ) 
    3627                         onreadystatechange( "timeout" ); 
    3628                 }, s.timeout); 
    3629         } 
    3630  
    3631         // Send the data 
    3632         try { 
    3633             xhr.send(s.data); 
    3634         } catch(e) { 
    3635             jQuery.handleError(s, xhr, null, e); 
    3636         } 
    3637  
    3638         // firefox 1.5 doesn't fire statechange for sync requests 
    3639         if ( !s.async ) 
    3640             onreadystatechange(); 
    3641  
    3642         function success(){ 
    3643             // If a local callback was specified, fire it and pass it the data 
    3644             if ( s.success ) 
    3645                 s.success( data, status ); 
    3646  
    3647             // Fire the global callback 
    3648             if ( s.global ) 
    3649                 jQuery.event.trigger( "ajaxSuccess", [xhr, s] ); 
    3650         } 
    3651  
    3652         function complete(){ 
    3653             // Process result 
    3654             if ( s.complete ) 
    3655                 s.complete(xhr, status); 
    3656  
    3657             // The request was completed 
    3658             if ( s.global ) 
    3659                 jQuery.event.trigger( "ajaxComplete", [xhr, s] ); 
    3660  
    3661             // Handle the global AJAX counter 
    3662             if ( s.global && ! --jQuery.active ) 
    3663                 jQuery.event.trigger( "ajaxStop" ); 
    3664         } 
    3665  
    3666         // return XMLHttpRequest to allow aborting the request etc. 
    3667         return xhr; 
    3668     }, 
    3669  
    3670     handleError: function( s, xhr, status, e ) { 
    3671         // If a local callback was specified, fire it 
    3672         if ( s.error ) s.error( xhr, status, e ); 
    3673  
    3674         // Fire the global callback 
    3675         if ( s.global ) 
    3676             jQuery.event.trigger( "ajaxError", [xhr, s, e] ); 
    3677     }, 
    3678  
    3679     // Counter for holding the number of active queries 
    3680     active: 0, 
    3681  
    3682     // Determines if an XMLHttpRequest was successful or not 
    3683     httpSuccess: function( xhr ) { 
    3684         try { 
    3685             // IE error sometimes returns 1223 when it should be 204 so treat it as success, see #1450 
    3686             return !xhr.status && location.protocol == "file:" || 
    3687                 ( xhr.status >= 200 && xhr.status < 300 ) || xhr.status == 304 || xhr.status == 1223; 
    3688         } catch(e){} 
    3689         return false; 
    3690     }, 
    3691  
    3692     // Determines if an XMLHttpRequest returns NotModified 
    3693     httpNotModified: function( xhr, url ) { 
    3694         try { 
    3695             var xhrRes = xhr.getResponseHeader("Last-Modified"); 
    3696  
    3697             // Firefox always returns 200. check Last-Modified date 
    3698             return xhr.status == 304 || xhrRes == jQuery.lastModified[url]; 
    3699         } catch(e){} 
    3700         return false; 
    3701     }, 
    3702  
    3703     httpData: function( xhr, type, s ) { 
    3704         var ct = xhr.getResponseHeader("content-type"), 
    3705             xml = type == "xml" || !type && ct && ct.indexOf("xml") >= 0, 
    3706             data = xml ? xhr.responseXML : xhr.responseText; 
    3707  
    3708         if ( xml && data.documentElement.tagName == "parsererror" ) 
    3709             throw "parsererror"; 
    3710              
    3711         // Allow a pre-filtering function to sanitize the response 
    3712         // s != null is checked to keep backwards compatibility 
    3713         if( s && s.dataFilter ) 
    3714             data = s.dataFilter( data, type ); 
    3715  
    3716         // The filter can actually parse the response 
    3717         if( typeof data === "string" ){ 
    3718  
    3719             // If the type is "script", eval it in global context 
    3720             if ( type == "script" ) 
    3721                 jQuery.globalEval( data ); 
    3722  
    3723             // Get the JavaScript object, if JSON is used. 
    3724             if ( type == "json" ) 
    3725                 data = window["eval"]("(" + data + ")"); 
    3726         } 
    3727          
    3728         return data; 
    3729     }, 
    3730  
    3731     // Serialize an array of form elements or a set of 
    3732     // key/values into a query string 
    3733     param: function( a ) { 
    3734         var s = [ ]; 
    3735  
    3736         function add( key, value ){ 
    3737             s[ s.length ] = encodeURIComponent(key) + '=' + encodeURIComponent(value); 
    3738         }; 
    3739  
    3740         // If an array was passed in, assume that it is an array 
    3741         // of form elements 
    3742         if ( jQuery.isArray(a) || a.jquery ) 
    3743             // Serialize the form elements 
    3744             jQuery.each( a, function(){ 
    3745                 add( this.name, this.value ); 
    3746             }); 
    3747  
    3748         // Otherwise, assume that it's an object of key/value pairs 
    3749         else 
    3750             // Serialize the key/values 
    3751             for ( var j in a ) 
    3752                 // If the value is an array then the key names need to be repeated 
    3753                 if ( jQuery.isArray(a[j]) ) 
    3754                     jQuery.each( a[j], function(){ 
    3755                         add( j, this ); 
    3756                     }); 
    3757                 else 
    3758                     add( j, jQuery.isFunction(a[j]) ? a[j]() : a[j] ); 
    3759  
    3760         // Return the resulting serialization 
    3761         return s.join("&").replace(/%20/g, "+"); 
    3762     } 
    3763  
    3764 }); 
    3765 var elemdisplay = {}, 
    3766     timerId, 
    3767     fxAttrs = [ 
    3768         // height animations 
    3769         [ "height", "marginTop", "marginBottom", "paddingTop", "paddingBottom" ], 
    3770         // width animations 
    3771         [ "width", "marginLeft", "marginRight", "paddingLeft", "paddingRight" ], 
    3772         // opacity animations 
    3773         [ "opacity" ] 
    3774     ]; 
    3775  
    3776 function genFx( type, num ){ 
    3777     var obj = {}; 
    3778     jQuery.each( fxAttrs.concat.apply([], fxAttrs.slice(0,num)), function(){ 
    3779         obj[ this ] = type; 
    3780     }); 
    3781     return obj; 
    3782 } 
    3783  
    3784 jQuery.fn.extend({ 
    3785     show: function(speed,callback){ 
    3786         if ( speed ) { 
    3787             return this.animate( genFx("show", 3), speed, callback); 
    3788         } else { 
    3789             for ( var i = 0, l = this.length; i < l; i++ ){ 
    3790                 var old = jQuery.data(this[i], "olddisplay"); 
    3791                  
    3792                 this[i].style.display = old || ""; 
    3793                  
    3794                 if ( jQuery.css(this[i], "display") === "none" ) { 
    3795                     var tagName = this[i].tagName, display; 
    3796                      
    3797                     if ( elemdisplay[ tagName ] ) { 
    3798                         display = elemdisplay[ tagName ]; 
    3799                     } else { 
    3800                         var elem = jQuery("<" + tagName + " />").appendTo("body"); 
    3801                          
    3802                         display = elem.css("display"); 
    3803                         if ( display === "none" ) 
    3804                             display = "block"; 
    3805                          
    3806                         elem.remove(); 
    3807                          
    3808                         elemdisplay[ tagName ] = display; 
    3809                     } 
    3810                      
    3811                     jQuery.data(this[i], "olddisplay", display); 
    3812                 } 
    3813             } 
    3814  
    3815             // Set the display of the elements in a second loop 
    3816             // to avoid the constant reflow 
    3817             for ( var i = 0, l = this.length; i < l; i++ ){ 
    3818                 this[i].style.display = jQuery.data(this[i], "olddisplay") || ""; 
    3819             } 
    3820              
    3821             return this; 
    3822         } 
    3823     }, 
    3824  
    3825     hide: function(speed,callback){ 
    3826         if ( speed ) { 
    3827             return this.animate( genFx("hide", 3), speed, callback); 
    3828         } else { 
    3829             for ( var i = 0, l = this.length; i < l; i++ ){ 
    3830                 var old = jQuery.data(this[i], "olddisplay"); 
    3831                 if ( !old && old !== "none" ) 
    3832                     jQuery.data(this[i], "olddisplay", jQuery.css(this[i], "display")); 
    3833             } 
    3834  
    3835             // Set the display of the elements in a second loop 
    3836             // to avoid the constant reflow 
    3837             for ( var i = 0, l = this.length; i < l; i++ ){ 
    3838                 this[i].style.display = "none"; 
    3839             } 
    3840  
    3841             return this; 
    3842         } 
    3843     }, 
    3844  
    3845     // Save the old toggle function 
    3846     _toggle: jQuery.fn.toggle, 
    3847  
    3848     toggle: function( fn, fn2 ){ 
    3849         var bool = typeof fn === "boolean"; 
    3850  
    3851         return jQuery.isFunction(fn) && jQuery.isFunction(fn2) ? 
    3852             this._toggle.apply( this, arguments ) : 
    3853             fn == null || bool ? 
    3854                 this.each(function(){ 
    3855                     var state = bool ? fn : jQuery(this).is(":hidden"); 
    3856                     jQuery(this)[ state ? "show" : "hide" ](); 
    3857                 }) : 
    3858                 this.animate(genFx("toggle", 3), fn, fn2); 
    3859     }, 
    3860  
    3861     fadeTo: function(speed,to,callback){ 
    3862         return this.animate({opacity: to}, speed, callback); 
    3863     }, 
    3864  
    3865     animate: function( prop, speed, easing, callback ) { 
    3866         var optall = jQuery.speed(speed, easing, callback); 
    3867  
    3868         return this[ optall.queue === false ? "each" : "queue" ](function(){ 
    3869          
    3870             var opt = jQuery.extend({}, optall), p, 
    3871                 hidden = this.nodeType == 1 && jQuery(this).is(":hidden"), 
    3872                 self = this; 
    3873      
    3874             for ( p in prop ) { 
    3875                 if ( prop[p] == "hide" && hidden || prop[p] == "show" && !hidden ) 
    3876                     return opt.complete.call(this); 
    3877  
    3878                 if ( ( p == "height" || p == "width" ) && this.style ) { 
    3879                     // Store display property 
    3880                     opt.display = jQuery.css(this, "display"); 
    3881  
    3882                     // Make sure that nothing sneaks out 
    3883                     opt.overflow = this.style.overflow; 
    3884                 } 
    3885             } 
    3886  
    3887             if ( opt.overflow != null ) 
    3888                 this.style.overflow = "hidden"; 
    3889  
    3890             opt.curAnim = jQuery.extend({}, prop); 
    3891  
    3892             jQuery.each( prop, function(name, val){ 
    3893                 var e = new jQuery.fx( self, opt, name ); 
    3894  
    3895                 if ( /toggle|show|hide/.test(val) ) 
    3896                     e[ val == "toggle" ? hidden ? "show" : "hide" : val ]( prop ); 
    3897                 else { 
    3898                     var parts = val.toString().match(/^([+-]=)?([\d+-.]+)(.*)$/), 
    3899                         start = e.cur(true) || 0; 
    3900  
    3901                     if ( parts ) { 
    3902                         var end = parseFloat(parts[2]), 
    3903                             unit = parts[3] || "px"; 
    3904  
    3905                         // We need to compute starting value 
    3906                         if ( unit != "px" ) { 
    3907                             self.style[ name ] = (end || 1) + unit; 
    3908                             start = ((end || 1) / e.cur(true)) * start; 
    3909                             self.style[ name ] = start + unit; 
    3910                         } 
    3911  
    3912                         // If a +=/-= token was provided, we're doing a relative animation 
    3913                         if ( parts[1] ) 
    3914                             end = ((parts[1] == "-=" ? -1 : 1) * end) + start; 
    3915  
    3916                         e.custom( start, end, unit ); 
    3917                     } else 
    3918                         e.custom( start, val, "" ); 
    3919                 } 
    3920             }); 
    3921  
    3922             // For JS strict compliance 
    3923             return true; 
    3924         }); 
    3925     }, 
    3926  
    3927     stop: function(clearQueue, gotoEnd){ 
    3928         var timers = jQuery.timers; 
    3929  
    3930         if (clearQueue) 
    3931             this.queue([]); 
    3932  
    3933         this.each(function(){ 
    3934             // go in reverse order so anything added to the queue during the loop is ignored 
    3935             for ( var i = timers.length - 1; i >= 0; i-- ) 
    3936                 if ( timers[i].elem == this ) { 
    3937                     if (gotoEnd) 
    3938                         // force the next step to be the last 
    3939                         timers[i](true); 
    3940                     timers.splice(i, 1); 
    3941                 } 
    3942         }); 
    3943  
    3944         // start the next in the queue if the last step wasn't forced 
    3945         if (!gotoEnd) 
    3946             this.dequeue(); 
    3947  
    3948         return this; 
    3949     } 
    3950  
    3951 }); 
    3952  
    3953 // Generate shortcuts for custom animations 
    3954 jQuery.each({ 
    3955     slideDown: genFx("show", 1), 
    3956     slideUp: genFx("hide", 1), 
    3957     slideToggle: genFx("toggle", 1), 
    3958     fadeIn: { opacity: "show" }, 
    3959     fadeOut: { opacity: "hide" } 
    3960 }, function( name, props ){ 
    3961     jQuery.fn[ name ] = function( speed, callback ){ 
    3962         return this.animate( props, speed, callback ); 
    3963     }; 
    3964 }); 
    3965  
    3966 jQuery.extend({ 
    3967  
    3968     speed: function(speed, easing, fn) { 
    3969         var opt = typeof speed === "object" ? speed : { 
    3970             complete: fn || !fn && easing || 
    3971                 jQuery.isFunction( speed ) && speed, 
    3972             duration: speed, 
    3973             easing: fn && easing || easing && !jQuery.isFunction(easing) && easing 
    3974         }; 
    3975  
    3976         opt.duration = jQuery.fx.off ? 0 : typeof opt.duration === "number" ? opt.duration : 
    3977             jQuery.fx.speeds[opt.duration] || jQuery.fx.speeds._default; 
    3978  
    3979         // Queueing 
    3980         opt.old = opt.complete; 
    3981         opt.complete = function(){ 
    3982             if ( opt.queue !== false ) 
    3983                 jQuery(this).dequeue(); 
    3984             if ( jQuery.isFunction( opt.old ) ) 
    3985                 opt.old.call( this ); 
    3986         }; 
    3987  
    3988         return opt; 
    3989     }, 
    3990  
    3991     easing: { 
    3992         linear: function( p, n, firstNum, diff ) { 
    3993             return firstNum + diff * p; 
    3994         }, 
    3995         swing: function( p, n, firstNum, diff ) { 
    3996             return ((-Math.cos(p*Math.PI)/2) + 0.5) * diff + firstNum; 
    3997         } 
    3998     }, 
    3999  
    4000     timers: [], 
    4001  
    4002     fx: function( elem, options, prop ){ 
    4003         this.options = options; 
    4004         this.elem = elem; 
    4005         this.prop = prop; 
    4006  
    4007         if ( !options.orig ) 
    4008             options.orig = {}; 
    4009     } 
    4010  
    4011 }); 
    4012  
    4013 jQuery.fx.prototype = { 
    4014  
    4015     // Simple function for setting a style value 
    4016     update: function(){ 
    4017         if ( this.options.step ) 
    4018             this.options.step.call( this.elem, this.now, this ); 
    4019  
    4020         (jQuery.fx.step[this.prop] || jQuery.fx.step._default)( this ); 
    4021  
    4022         // Set display property to block for height/width animations 
    4023         if ( ( this.prop == "height" || this.prop == "width" ) && this.elem.style ) 
    4024             this.elem.style.display = "block"; 
    4025     }, 
    4026  
    4027     // Get the current size 
    4028     cur: function(force){ 
    4029         if ( this.elem[this.prop] != null && (!this.elem.style || this.elem.style[this.prop] == null) ) 
    4030             return this.elem[ this.prop ]; 
    4031  
    4032         var r = parseFloat(jQuery.css(this.elem, this.prop, force)); 
    4033         return r && r > -10000 ? r : parseFloat(jQuery.curCSS(this.elem, this.prop)) || 0; 
    4034     }, 
    4035  
    4036     // Start an animation from one number to another 
    4037     custom: function(from, to, unit){ 
    4038         this.startTime = now(); 
    4039         this.start = from; 
    4040         this.end = to; 
    4041         this.unit = unit || this.unit || "px"; 
    4042         this.now = this.start; 
    4043         this.pos = this.state = 0; 
    4044  
    4045         var self = this; 
    4046         function t(gotoEnd){ 
    4047             return self.step(gotoEnd); 
    4048         } 
    4049  
    4050         t.elem = this.elem; 
    4051  
    4052         if ( t() && jQuery.timers.push(t) && !timerId ) { 
    4053             timerId = setInterval(function(){ 
    4054                 var timers = jQuery.timers; 
    4055  
    4056                 for ( var i = 0; i < timers.length; i++ ) 
    4057                     if ( !timers[i]() ) 
    4058                         timers.splice(i--, 1); 
    4059  
    4060                 if ( !timers.length ) { 
    4061                     clearInterval( timerId ); 
    4062                     timerId = undefined; 
    4063                 } 
    4064             }, 13); 
    4065         } 
    4066     }, 
    4067  
    4068     // Simple 'show' function 
    4069     show: function(){ 
    4070         // Remember where we started, so that we can go back to it later 
    4071         this.options.orig[this.prop] = jQuery.attr( this.elem.style, this.prop ); 
    4072         this.options.show = true; 
    4073  
    4074         // Begin the animation 
    4075         // Make sure that we start at a small width/height to avoid any 
    4076         // flash of content 
    4077         this.custom(this.prop == "width" || this.prop == "height" ? 1 : 0, this.cur()); 
    4078  
    4079         // Start by showing the element 
    4080         jQuery(this.elem).show(); 
    4081     }, 
    4082  
    4083     // Simple 'hide' function 
    4084     hide: function(){ 
    4085         // Remember where we started, so that we can go back to it later 
    4086         this.options.orig[this.prop] = jQuery.attr( this.elem.style, this.prop ); 
    4087         this.options.hide = true; 
    4088  
    4089         // Begin the animation 
    4090         this.custom(this.cur(), 0); 
    4091     }, 
    4092  
    4093     // Each step of an animation 
    4094     step: function(gotoEnd){ 
    4095         var t = now(); 
    4096  
    4097         if ( gotoEnd || t >= this.options.duration + this.startTime ) { 
    4098             this.now = this.end; 
    4099             this.pos = this.state = 1; 
    4100             this.update(); 
    4101  
    4102             this.options.curAnim[ this.prop ] = true; 
    4103  
    4104             var done = true; 
    4105             for ( var i in this.options.curAnim ) 
    4106                 if ( this.options.curAnim[i] !== true ) 
    4107                     done = false; 
    4108  
    4109             if ( done ) { 
    4110                 if ( this.options.display != null ) { 
    4111                     // Reset the overflow 
    4112                     this.elem.style.overflow = this.options.overflow; 
    4113  
    4114                     // Reset the display 
    4115                     this.elem.style.display = this.options.display; 
    4116                     if ( jQuery.css(this.elem, "display") == "none" ) 
    4117                         this.elem.style.display = "block"; 
    4118                 } 
    4119  
    4120                 // Hide the element if the "hide" operation was done 
    4121                 if ( this.options.hide ) 
    4122                     jQuery(this.elem).hide(); 
    4123  
    4124                 // Reset the properties, if the item has been hidden or shown 
    4125                 if ( this.options.hide || this.options.show ) 
    4126                     for ( var p in this.options.curAnim ) 
    4127                         jQuery.attr(this.elem.style, p, this.options.orig[p]); 
    4128                      
    4129                 // Execute the complete function 
    4130                 this.options.complete.call( this.elem ); 
    4131             } 
    4132  
    4133             return false; 
    4134         } else { 
    4135             var n = t - this.startTime; 
    4136             this.state = n / this.options.duration; 
    4137  
    4138             // Perform the easing function, defaults to swing 
    4139             this.pos = jQuery.easing[this.options.easing || (jQuery.easing.swing ? "swing" : "linear")](this.state, n, 0, 1, this.options.duration); 
    4140             this.now = this.start + ((this.end - this.start) * this.pos); 
    4141  
    4142             // Perform the next step of the animation 
    4143             this.update(); 
    4144         } 
    4145  
    4146         return true; 
    4147     } 
    4148  
    4149 }; 
    4150  
    4151 jQuery.extend( jQuery.fx, { 
    4152     speeds:{ 
    4153         slow: 600, 
    4154         fast: 200, 
    4155         // Default speed 
    4156         _default: 400 
    4157     }, 
    4158     step: { 
    4159  
    4160         opacity: function(fx){ 
    4161             jQuery.attr(fx.elem.style, "opacity", fx.now); 
    4162         }, 
    4163  
    4164         _default: function(fx){ 
    4165             if ( fx.elem.style && fx.elem.style[ fx.prop ] != null ) 
    4166                 fx.elem.style[ fx.prop ] = fx.now + fx.unit; 
    4167             else 
    4168                 fx.elem[ fx.prop ] = fx.now; 
    4169         } 
    4170     } 
    4171 }); 
    4172 if ( document.documentElement["getBoundingClientRect"] ) 
    4173     jQuery.fn.offset = function() { 
    4174         if ( !this[0] ) return { top: 0, left: 0 }; 
    4175         if ( this[0] === this[0].ownerDocument.body ) return jQuery.offset.bodyOffset( this[0] ); 
    4176         var box  = this[0].getBoundingClientRect(), doc = this[0].ownerDocument, body = doc.body, docElem = doc.documentElement, 
    4177             clientTop = docElem.clientTop || body.clientTop || 0, clientLeft = docElem.clientLeft || body.clientLeft || 0, 
    4178             top  = box.top  + (self.pageYOffset || jQuery.boxModel && docElem.scrollTop  || body.scrollTop ) - clientTop, 
    4179             left = box.left + (self.pageXOffset || jQuery.boxModel && docElem.scrollLeft || body.scrollLeft) - clientLeft; 
    4180         return { top: top, left: left }; 
    4181     }; 
    4182 else  
    4183     jQuery.fn.offset = function() { 
    4184         if ( !this[0] ) return { top: 0, left: 0 }; 
    4185         if ( this[0] === this[0].ownerDocument.body ) return jQuery.offset.bodyOffset( this[0] ); 
    4186         jQuery.offset.initialized || jQuery.offset.initialize(); 
    4187  
    4188         var elem = this[0], offsetParent = elem.offsetParent, prevOffsetParent = elem, 
    4189             doc = elem.ownerDocument, computedStyle, docElem = doc.documentElement, 
    4190             body = doc.body, defaultView = doc.defaultView, 
    4191             prevComputedStyle = defaultView.getComputedStyle(elem, null), 
    4192             top = elem.offsetTop, left = elem.offsetLeft; 
    4193  
    4194         while ( (elem = elem.parentNode) && elem !== body && elem !== docElem ) { 
    4195             computedStyle = defaultView.getComputedStyle(elem, null); 
    4196             top -= elem.scrollTop, left -= elem.scrollLeft; 
    4197             if ( elem === offsetParent ) { 
    4198                 top += elem.offsetTop, left += elem.offsetLeft; 
    4199                 if ( jQuery.offset.doesNotAddBorder && !(jQuery.offset.doesAddBorderForTableAndCells && /^t(able|d|h)$/i.test(elem.tagName)) ) 
    4200                     top  += parseInt( computedStyle.borderTopWidth,  10) || 0, 
    4201                     left += parseInt( computedStyle.borderLeftWidth, 10) || 0; 
    4202                 prevOffsetParent = offsetParent, offsetParent = elem.offsetParent; 
    4203             } 
    4204             if ( jQuery.offset.subtractsBorderForOverflowNotVisible && computedStyle.overflow !== "visible" ) 
    4205                 top  += parseInt( computedStyle.borderTopWidth,  10) || 0, 
    4206                 left += parseInt( computedStyle.borderLeftWidth, 10) || 0; 
    4207             prevComputedStyle = computedStyle; 
    4208         } 
    4209  
    4210         if ( prevComputedStyle.position === "relative" || prevComputedStyle.position === "static" ) 
    4211             top  += body.offsetTop, 
    4212             left += body.offsetLeft; 
    4213  
    4214         if ( prevComputedStyle.position === "fixed" ) 
    4215             top  += Math.max(docElem.scrollTop, body.scrollTop), 
    4216             left += Math.max(docElem.scrollLeft, body.scrollLeft); 
    4217  
    4218         return { top: top, left: left }; 
    4219     }; 
    4220  
    4221 jQuery.offset = { 
    4222     initialize: function() { 
    4223         if ( this.initialized ) return; 
    4224         var body = document.body, container = document.createElement('div'), innerDiv, checkDiv, table, td, rules, prop, bodyMarginTop = body.style.marginTop, 
    4225             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>'; 
    4226  
    4227         rules = { position: 'absolute', top: 0, left: 0, margin: 0, border: 0, width: '1px', height: '1px', visibility: 'hidden' }; 
    4228         for ( prop in rules ) container.style[prop] = rules[prop]; 
    4229  
    4230         container.innerHTML = html; 
    4231         body.insertBefore(container, body.firstChild); 
    4232         innerDiv = container.firstChild, checkDiv = innerDiv.firstChild, td = innerDiv.nextSibling.firstChild.firstChild; 
    4233  
    4234         this.doesNotAddBorder = (checkDiv.offsetTop !== 5); 
    4235         this.doesAddBorderForTableAndCells = (td.offsetTop === 5); 
    4236  
    4237         innerDiv.style.overflow = 'hidden', innerDiv.style.position = 'relative'; 
    4238         this.subtractsBorderForOverflowNotVisible = (checkDiv.offsetTop === -5); 
    4239  
    4240         body.style.marginTop = '1px'; 
    4241         this.doesNotIncludeMarginInBodyOffset = (body.offsetTop === 0); 
    4242         body.style.marginTop = bodyMarginTop; 
    4243  
    4244         body.removeChild(container); 
    4245         this.initialized = true; 
    4246     }, 
    4247  
    4248     bodyOffset: function(body) { 
    4249         jQuery.offset.initialized || jQuery.offset.initialize(); 
    4250         var top = body.offsetTop, left = body.offsetLeft; 
    4251         if ( jQuery.offset.doesNotIncludeMarginInBodyOffset ) 
    4252             top  += parseInt( jQuery.curCSS(body, 'marginTop',  true), 10 ) || 0, 
    4253             left += parseInt( jQuery.curCSS(body, 'marginLeft', true), 10 ) || 0; 
    4254         return { top: top, left: left }; 
    4255     } 
    4256 }; 
    4257  
    4258  
    4259 jQuery.fn.extend({ 
    4260     position: function() { 
    4261         var left = 0, top = 0, results; 
    4262  
    4263         if ( this[0] ) { 
    4264             // Get *real* offsetParent 
    4265             var offsetParent = this.offsetParent(), 
    4266  
    4267             // Get correct offsets 
    4268             offset       = this.offset(), 
    4269             parentOffset = /^body|html$/i.test(offsetParent[0].tagName) ? { top: 0, left: 0 } : offsetParent.offset(); 
    4270  
    4271             // Subtract element margins 
    4272             // note: when an element has margin: auto the offsetLeft and marginLeft  
    4273             // are the same in Safari causing offset.left to incorrectly be 0 
    4274             offset.top  -= num( this, 'marginTop'  ); 
    4275             offset.left -= num( this, 'marginLeft' ); 
    4276  
    4277             // Add offsetParent borders 
    4278             parentOffset.top  += num( offsetParent, 'borderTopWidth'  ); 
    4279             parentOffset.left += num( offsetParent, 'borderLeftWidth' ); 
    4280  
    4281             // Subtract the two offsets 
    4282             results = { 
    4283                 top:  offset.top  - parentOffset.top, 
    4284                 left: offset.left - parentOffset.left 
    4285             }; 
    4286         } 
    4287  
    4288         return results; 
    4289     }, 
    4290  
    4291     offsetParent: function() { 
    4292         var offsetParent = this[0].offsetParent || document.body; 
    4293         while ( offsetParent && (!/^body|html$/i.test(offsetParent.tagName) && jQuery.css(offsetParent, 'position') == 'static') ) 
    4294             offsetParent = offsetParent.offsetParent; 
    4295         return jQuery(offsetParent); 
    4296     } 
    4297 }); 
    4298  
    4299  
    4300 // Create scrollLeft and scrollTop methods 
    4301 jQuery.each( ['Left', 'Top'], function(i, name) { 
    4302     var method = 'scroll' + name; 
    4303      
    4304     jQuery.fn[ method ] = function(val) { 
    4305         if (!this[0]) return null; 
    4306  
    4307         return val !== undefined ? 
    4308  
    4309             // Set the scroll offset 
    4310             this.each(function() { 
    4311                 this == window || this == document ? 
    4312                     window.scrollTo( 
    4313                         !i ? val : jQuery(window).scrollLeft(), 
    4314                          i ? val : jQuery(window).scrollTop() 
    4315                     ) : 
    4316                     this[ method ] = val; 
    4317             }) : 
    4318  
    4319             // Return the scroll offset 
    4320             this[0] == window || this[0] == document ? 
    4321                 self[ i ? 'pageYOffset' : 'pageXOffset' ] || 
    4322                     jQuery.boxModel && document.documentElement[ method ] || 
    4323                     document.body[ method ] : 
    4324                 this[0][ method ]; 
    4325     }; 
    4326 }); 
    4327 // Create innerHeight, innerWidth, outerHeight and outerWidth methods 
    4328 jQuery.each([ "Height", "Width" ], function(i, name){ 
    4329  
    4330     var tl = i ? "Left"  : "Top",  // top or left 
    4331         br = i ? "Right" : "Bottom", // bottom or right 
    4332         lower = name.toLowerCase(); 
    4333  
    4334     // innerHeight and innerWidth 
    4335     jQuery.fn["inner" + name] = function(){ 
    4336         return this[0] ? 
    4337             jQuery.css( this[0], lower, false, "padding" ) : 
    4338             null; 
    4339     }; 
    4340  
    4341     // outerHeight and outerWidth 
    4342     jQuery.fn["outer" + name] = function(margin) { 
    4343         return this[0] ? 
    4344             jQuery.css( this[0], lower, false, margin ? "margin" : "border" ) : 
    4345             null; 
    4346     }; 
    4347      
    4348     var type = name.toLowerCase(); 
    4349  
    4350     jQuery.fn[ type ] = function( size ) { 
    4351         // Get window width or height 
    4352         return this[0] == window ? 
    4353             // Everyone else use document.documentElement or document.body depending on Quirks vs Standards mode 
    4354             document.compatMode == "CSS1Compat" && document.documentElement[ "client" + name ] || 
    4355             document.body[ "client" + name ] : 
    4356  
    4357             // Get document width or height 
    4358             this[0] == document ? 
    4359                 // Either scroll[Width/Height] or offset[Width/Height], whichever is greater 
    4360                 Math.max( 
    4361                     document.documentElement["client" + name], 
    4362                     document.body["scroll" + name], document.documentElement["scroll" + name], 
    4363                     document.body["offset" + name], document.documentElement["offset" + name] 
    4364                 ) : 
    4365  
    4366                 // Get or set width or height on the element 
    4367                 size === undefined ? 
    4368                     // Get width or height on the element 
    4369                     (this.length ? jQuery.css( this[0], type ) : null) : 
    4370  
    4371                     // Set the width or height on the element (default to pixels if value is unitless) 
    4372                     this.css( type, typeof size === "string" ? size : size + "px" ); 
    4373     }; 
    4374  
    4375 }); 
    4376 })(); 
     16(function(a,b){function ci(a){return d.isWindow(a)?a:a.nodeType===9?a.defaultView||a.parentWindow:!1}function cf(a){if(!b_[a]){var b=d("<"+a+">").appendTo("body"),c=b.css("display");b.remove();if(c==="none"||c==="")c="block";b_[a]=c}return b_[a]}function ce(a,b){var c={};d.each(cd.concat.apply([],cd.slice(0,b)),function(){c[this]=a});return c}function b$(){try{return new a.ActiveXObject("Microsoft.XMLHTTP")}catch(b){}}function bZ(){try{return new a.XMLHttpRequest}catch(b){}}function bY(){d(a).unload(function(){for(var a in bW)bW[a](0,1)})}function bS(a,c){a.dataFilter&&(c=a.dataFilter(c,a.dataType));var e=a.dataTypes,f={},g,h,i=e.length,j,k=e[0],l,m,n,o,p;for(g=1;g<i;g++){if(g===1)for(h in a.converters)typeof h==="string"&&(f[h.toLowerCase()]=a.converters[h]);l=k,k=e[g];if(k==="*")k=l;else if(l!=="*"&&l!==k){m=l+" "+k,n=f[m]||f["* "+k];if(!n){p=b;for(o in f){j=o.split(" ");if(j[0]===l||j[0]==="*"){p=f[j[1]+" "+k];if(p){o=f[o],o===!0?n=p:p===!0&&(n=o);break}}}}!n&&!p&&d.error("No conversion from "+m.replace(" "," to ")),n!==!0&&(c=n?n(c):p(o(c)))}}return c}function bR(a,c,d){var e=a.contents,f=a.dataTypes,g=a.responseFields,h,i,j,k;for(i in g)i in d&&(c[g[i]]=d[i]);while(f[0]==="*")f.shift(),h===b&&(h=a.mimeType||c.getResponseHeader("content-type"));if(h)for(i in e)if(e[i]&&e[i].test(h)){f.unshift(i);break}if(f[0]in d)j=f[0];else{for(i in d){if(!f[0]||a.converters[i+" "+f[0]]){j=i;break}k||(k=i)}j=j||k}if(j){j!==f[0]&&f.unshift(j);return d[j]}}function bQ(a,b,c,e){if(d.isArray(b)&&b.length)d.each(b,function(b,f){c||bs.test(a)?e(a,f):bQ(a+"["+(typeof f==="object"||d.isArray(f)?b:"")+"]",f,c,e)});else if(c||b==null||typeof b!=="object")e(a,b);else if(d.isArray(b)||d.isEmptyObject(b))e(a,"");else for(var f in b)bQ(a+"["+f+"]",b[f],c,e)}function bP(a,c,d,e,f,g){f=f||c.dataTypes[0],g=g||{},g[f]=!0;var h=a[f],i=0,j=h?h.length:0,k=a===bJ,l;for(;i<j&&(k||!l);i++)l=h[i](c,d,e),typeof l==="string"&&(!k||g[l]?l=b:(c.dataTypes.unshift(l),l=bP(a,c,d,e,l,g)));(k||!l)&&!g["*"]&&(l=bP(a,c,d,e,"*",g));return l}function bO(a){return function(b,c){typeof b!=="string"&&(c=b,b="*");if(d.isFunction(c)){var e=b.toLowerCase().split(bD),f=0,g=e.length,h,i,j;for(;f<g;f++)h=e[f],j=/^\+/.test(h),j&&(h=h.substr(1)||"*"),i=a[h]=a[h]||[],i[j?"unshift":"push"](c)}}}function bq(a,b,c){var e=b==="width"?bk:bl,f=b==="width"?a.offsetWidth:a.offsetHeight;if(c==="border")return f;d.each(e,function(){c||(f-=parseFloat(d.css(a,"padding"+this))||0),c==="margin"?f+=parseFloat(d.css(a,"margin"+this))||0:f-=parseFloat(d.css(a,"border"+this+"Width"))||0});return f}function bc(a,b){b.src?d.ajax({url:b.src,async:!1,dataType:"script"}):d.globalEval(b.text||b.textContent||b.innerHTML||""),b.parentNode&&b.parentNode.removeChild(b)}function bb(a){return"getElementsByTagName"in a?a.getElementsByTagName("*"):"querySelectorAll"in a?a.querySelectorAll("*"):[]}function ba(a,b){if(b.nodeType===1){var c=b.nodeName.toLowerCase();b.clearAttributes(),b.mergeAttributes(a);if(c==="object")b.outerHTML=a.outerHTML;else if(c!=="input"||a.type!=="checkbox"&&a.type!=="radio"){if(c==="option")b.selected=a.defaultSelected;else if(c==="input"||c==="textarea")b.defaultValue=a.defaultValue}else a.checked&&(b.defaultChecked=b.checked=a.checked),b.value!==a.value&&(b.value=a.value);b.removeAttribute(d.expando)}}function _(a,b){if(b.nodeType===1&&d.hasData(a)){var c=d.expando,e=d.data(a),f=d.data(b,e);if(e=e[c]){var g=e.events;f=f[c]=d.extend({},e);if(g){delete f.handle,f.events={};for(var h in g)for(var i=0,j=g[h].length;i<j;i++)d.event.add(b,h+(g[h][i].namespace?".":"")+g[h][i].namespace,g[h][i],g[h][i].data)}}}}function $(a,b){return d.nodeName(a,"table")?a.getElementsByTagName("tbody")[0]||a.appendChild(a.ownerDocument.createElement("tbody")):a}function Q(a,b,c){if(d.isFunction(b))return d.grep(a,function(a,d){var e=!!b.call(a,d,a);return e===c});if(b.nodeType)return d.grep(a,function(a,d){return a===b===c});if(typeof b==="string"){var e=d.grep(a,function(a){return a.nodeType===1});if(L.test(b))return d.filter(b,e,!c);b=d.filter(b,e)}return d.grep(a,function(a,e){return d.inArray(a,b)>=0===c})}function P(a){return!a||!a.parentNode||a.parentNode.nodeType===11}function H(a,b){return(a&&a!=="*"?a+".":"")+b.replace(t,"`").replace(u,"&")}function G(a){var b,c,e,f,g,h,i,j,k,l,m,n,o,p=[],q=[],s=d._data(this,"events");if(a.liveFired!==this&&s&&s.live&&!a.target.disabled&&(!a.button||a.type!=="click")){a.namespace&&(n=new RegExp("(^|\\.)"+a.namespace.split(".").join("\\.(?:.*\\.)?")+"(\\.|$)")),a.liveFired=this;var t=s.live.slice(0);for(i=0;i<t.length;i++)g=t[i],g.origType.replace(r,"")===a.type?q.push(g.selector):t.splice(i--,1);f=d(a.target).closest(q,a.currentTarget);for(j=0,k=f.length;j<k;j++){m=f[j];for(i=0;i<t.length;i++){g=t[i];if(m.selector===g.selector&&(!n||n.test(g.namespace))&&!m.elem.disabled){h=m.elem,e=null;if(g.preType==="mouseenter"||g.preType==="mouseleave")a.type=g.preType,e=d(a.relatedTarget).closest(g.selector)[0];(!e||e!==h)&&p.push({elem:h,handleObj:g,level:m.level})}}}for(j=0,k=p.length;j<k;j++){f=p[j];if(c&&f.level>c)break;a.currentTarget=f.elem,a.data=f.handleObj.data,a.handleObj=f.handleObj,o=f.handleObj.origHandler.apply(f.elem,arguments);if(o===!1||a.isPropagationStopped()){c=f.level,o===!1&&(b=!1);if(a.isImmediatePropagationStopped())break}}return b}}function E(a,c,e){var f=d.extend({},e[0]);f.type=a,f.originalEvent={},f.liveFired=b,d.event.handle.call(c,f),f.isDefaultPrevented()&&e[0].preventDefault()}function y(){return!0}function x(){return!1}function i(a){for(var b in a)if(b!=="toJSON")return!1;return!0}function h(a,c,e){if(e===b&&a.nodeType===1){e=a.getAttribute("data-"+c);if(typeof e==="string"){try{e=e==="true"?!0:e==="false"?!1:e==="null"?null:d.isNaN(e)?g.test(e)?d.parseJSON(e):e:parseFloat(e)}catch(f){}d.data(a,c,e)}else e=b}return e}var c=a.document,d=function(){function G(){if(!d.isReady){try{c.documentElement.doScroll("left")}catch(a){setTimeout(G,1);return}d.ready()}}var d=function(a,b){return new d.fn.init(a,b,g)},e=a.jQuery,f=a.$,g,h=/^(?:[^<]*(<[\w\W]+>)[^>]*$|#([\w\-]+)$)/,i=/\S/,j=/^\s+/,k=/\s+$/,l=/\d/,m=/^<(\w+)\s*\/?>(?:<\/\1>)?$/,n=/^[\],:{}\s]*$/,o=/\\(?:["\\\/bfnrt]|u[0-9a-fA-F]{4})/g,p=/"[^"\\\n\r]*"|true|false|null|-?\d+(?:\.\d*)?(?:[eE][+\-]?\d+)?/g,q=/(?:^|:|,)(?:\s*\[)+/g,r=/(webkit)[ \/]([\w.]+)/,s=/(opera)(?:.*version)?[ \/]([\w.]+)/,t=/(msie) ([\w.]+)/,u=/(mozilla)(?:.*? rv:([\w.]+))?/,v=navigator.userAgent,w,x,y,z=Object.prototype.toString,A=Object.prototype.hasOwnProperty,B=Array.prototype.push,C=Array.prototype.slice,D=String.prototype.trim,E=Array.prototype.indexOf,F={};d.fn=d.prototype={constructor:d,init:function(a,e,f){var g,i,j,k;if(!a)return this;if(a.nodeType){this.context=this[0]=a,this.length=1;return this}if(a==="body"&&!e&&c.body){this.context=c,this[0]=c.body,this.selector="body",this.length=1;return this}if(typeof a==="string"){g=h.exec(a);if(!g||!g[1]&&e)return!e||e.jquery?(e||f).find(a):this.constructor(e).find(a);if(g[1]){e=e instanceof d?e[0]:e,k=e?e.ownerDocument||e:c,j=m.exec(a),j?d.isPlainObject(e)?(a=[c.createElement(j[1])],d.fn.attr.call(a,e,!0)):a=[k.createElement(j[1])]:(j=d.buildFragment([g[1]],[k]),a=(j.cacheable?d.clone(j.fragment):j.fragment).childNodes);return d.merge(this,a)}i=c.getElementById(g[2]);if(i&&i.parentNode){if(i.id!==g[2])return f.find(a);this.length=1,this[0]=i}this.context=c,this.selector=a;return this}if(d.isFunction(a))return f.ready(a);a.selector!==b&&(this.selector=a.selector,this.context=a.context);return d.makeArray(a,this)},selector:"",jquery:"1.5.2",length:0,size:function(){return this.length},toArray:function(){return C.call(this,0)},get:function(a){return a==null?this.toArray():a<0?this[this.length+a]:this[a]},pushStack:function(a,b,c){var e=this.constructor();d.isArray(a)?B.apply(e,a):d.merge(e,a),e.prevObject=this,e.context=this.context,b==="find"?e.selector=this.selector+(this.selector?" ":"")+c:b&&(e.selector=this.selector+"."+b+"("+c+")");return e},each:function(a,b){return d.each(this,a,b)},ready:function(a){d.bindReady(),x.done(a);return this},eq:function(a){return a===-1?this.slice(a):this.slice(a,+a+1)},first:function(){return this.eq(0)},last:function(){return this.eq(-1)},slice:function(){return this.pushStack(C.apply(this,arguments),"slice",C.call(arguments).join(","))},map:function(a){return this.pushStack(d.map(this,function(b,c){return a.call(b,c,b)}))},end:function(){return this.prevObject||this.constructor(null)},push:B,sort:[].sort,splice:[].splice},d.fn.init.prototype=d.fn,d.extend=d.fn.extend=function(){var a,c,e,f,g,h,i=arguments[0]||{},j=1,k=arguments.length,l=!1;typeof i==="boolean"&&(l=i,i=arguments[1]||{},j=2),typeof i!=="object"&&!d.isFunction(i)&&(i={}),k===j&&(i=this,--j);for(;j<k;j++)if((a=arguments[j])!=null)for(c in a){e=i[c],f=a[c];if(i===f)continue;l&&f&&(d.isPlainObject(f)||(g=d.isArray(f)))?(g?(g=!1,h=e&&d.isArray(e)?e:[]):h=e&&d.isPlainObject(e)?e:{},i[c]=d.extend(l,h,f)):f!==b&&(i[c]=f)}return i},d.extend({noConflict:function(b){a.$=f,b&&(a.jQuery=e);return d},isReady:!1,readyWait:1,ready:function(a){a===!0&&d.readyWait--;if(!d.readyWait||a!==!0&&!d.isReady){if(!c.body)return setTimeout(d.ready,1);d.isReady=!0;if(a!==!0&&--d.readyWait>0)return;x.resolveWith(c,[d]),d.fn.trigger&&d(c).trigger("ready").unbind("ready")}},bindReady:function(){if(!x){x=d._Deferred();if(c.readyState==="complete")return setTimeout(d.ready,1);if(c.addEventListener)c.addEventListener("DOMContentLoaded",y,!1),a.addEventListener("load",d.ready,!1);else if(c.attachEvent){c.attachEvent("onreadystatechange",y),a.attachEvent("onload",d.ready);var b=!1;try{b=a.frameElement==null}catch(e){}c.documentElement.doScroll&&b&&G()}}},isFunction:function(a){return d.type(a)==="function"},isArray:Array.isArray||function(a){return d.type(a)==="array"},isWindow:function(a){return a&&typeof a==="object"&&"setInterval"in a},isNaN:function(a){return a==null||!l.test(a)||isNaN(a)},type:function(a){return a==null?String(a):F[z.call(a)]||"object"},isPlainObject:function(a){if(!a||d.type(a)!=="object"||a.nodeType||d.isWindow(a))return!1;if(a.constructor&&!A.call(a,"constructor")&&!A.call(a.constructor.prototype,"isPrototypeOf"))return!1;var c;for(c in a){}return c===b||A.call(a,c)},isEmptyObject:function(a){for(var b in a)return!1;return!0},error:function(a){throw a},parseJSON:function(b){if(typeof b!=="string"||!b)return null;b=d.trim(b);if(n.test(b.replace(o,"@").replace(p,"]").replace(q,"")))return a.JSON&&a.JSON.parse?a.JSON.parse(b):(new Function("return "+b))();d.error("Invalid JSON: "+b)},parseXML:function(b,c,e){a.DOMParser?(e=new DOMParser,c=e.parseFromString(b,"text/xml")):(c=new ActiveXObject("Microsoft.XMLDOM"),c.async="false",c.loadXML(b)),e=c.documentElement,(!e||!e.nodeName||e.nodeName==="parsererror")&&d.error("Invalid XML: "+b);return c},noop:function(){},globalEval:function(a){if(a&&i.test(a)){var b=c.head||c.getElementsByTagName("head")[0]||c.documentElement,e=c.createElement("script");d.support.scriptEval()?e.appendChild(c.createTextNode(a)):e.text=a,b.insertBefore(e,b.firstChild),b.removeChild(e)}},nodeName:function(a,b){return a.nodeName&&a.nodeName.toUpperCase()===b.toUpperCase()},each:function(a,c,e){var f,g=0,h=a.length,i=h===b||d.isFunction(a);if(e){if(i){for(f in a)if(c.apply(a[f],e)===!1)break}else for(;g<h;)if(c.apply(a[g++],e)===!1)break}else if(i){for(f in a)if(c.call(a[f],f,a[f])===!1)break}else for(var j=a[0];g<h&&c.call(j,g,j)!==!1;j=a[++g]){}return a},trim:D?function(a){return a==null?"":D.call(a)}:function(a){return a==null?"":(a+"").replace(j,"").replace(k,"")},makeArray:function(a,b){var c=b||[];if(a!=null){var e=d.type(a);a.length==null||e==="string"||e==="function"||e==="regexp"||d.isWindow(a)?B.call(c,a):d.merge(c,a)}return c},inArray:function(a,b){if(b.indexOf)return b.indexOf(a);for(var c=0,d=b.length;c<d;c++)if(b[c]===a)return c;return-1},merge:function(a,c){var d=a.length,e=0;if(typeof c.length==="number")for(var f=c.length;e<f;e++)a[d++]=c[e];else while(c[e]!==b)a[d++]=c[e++];a.length=d;return a},grep:function(a,b,c){var d=[],e;c=!!c;for(var f=0,g=a.length;f<g;f++)e=!!b(a[f],f),c!==e&&d.push(a[f]);return d},map:function(a,b,c){var d=[],e;for(var f=0,g=a.length;f<g;f++)e=b(a[f],f,c),e!=null&&(d[d.length]=e);return d.concat.apply([],d)},guid:1,proxy:function(a,c,e){arguments.length===2&&(typeof c==="string"?(e=a,a=e[c],c=b):c&&!d.isFunction(c)&&(e=c,c=b)),!c&&a&&(c=function(){return a.apply(e||this,arguments)}),a&&(c.guid=a.guid=a.guid||c.guid||d.guid++);return c},access:function(a,c,e,f,g,h){var i=a.length;if(typeof c==="object"){for(var j in c)d.access(a,j,c[j],f,g,e);return a}if(e!==b){f=!h&&f&&d.isFunction(e);for(var k=0;k<i;k++)g(a[k],c,f?e.call(a[k],k,g(a[k],c)):e,h);return a}return i?g(a[0],c):b},now:function(){return(new Date).getTime()},uaMatch:function(a){a=a.toLowerCase();var b=r.exec(a)||s.exec(a)||t.exec(a)||a.indexOf("compatible")<0&&u.exec(a)||[];return{browser:b[1]||"",version:b[2]||"0"}},sub:function(){function a(b,c){return new a.fn.init(b,c)}d.extend(!0,a,this),a.superclass=this,a.fn=a.prototype=this(),a.fn.constructor=a,a.subclass=this.subclass,a.fn.init=function b(b,c){c&&c instanceof d&&!(c instanceof a)&&(c=a(c));return d.fn.init.call(this,b,c,e)},a.fn.init.prototype=a.fn;var e=a(c);return a},browser:{}}),d.each("Boolean Number String Function Array Date RegExp Object".split(" "),function(a,b){F["[object "+b+"]"]=b.toLowerCase()}),w=d.uaMatch(v),w.browser&&(d.browser[w.browser]=!0,d.browser.version=w.version),d.browser.webkit&&(d.browser.safari=!0),E&&(d.inArray=function(a,b){return E.call(b,a)}),i.test(" ")&&(j=/^[\s\xA0]+/,k=/[\s\xA0]+$/),g=d(c),c.addEventListener?y=function(){c.removeEventListener("DOMContentLoaded",y,!1),d.ready()}:c.attachEvent&&(y=function(){c.readyState==="complete"&&(c.detachEvent("onreadystatechange",y),d.ready())});return d}(),e="then done fail isResolved isRejected promise".split(" "),f=[].slice;d.extend({_Deferred:function(){var a=[],b,c,e,f={done:function(){if(!e){var c=arguments,g,h,i,j,k;b&&(k=b,b=0);for(g=0,h=c.length;g<h;g++)i=c[g],j=d.type(i),j==="array"?f.done.apply(f,i):j==="function"&&a.push(i);k&&f.resolveWith(k[0],k[1])}return this},resolveWith:function(d,f){if(!e&&!b&&!c){f=f||[],c=1;try{while(a[0])a.shift().apply(d,f)}finally{b=[d,f],c=0}}return this},resolve:function(){f.resolveWith(this,arguments);return this},isResolved:function(){return c||b},cancel:function(){e=1,a=[];return this}};return f},Deferred:function(a){var b=d._Deferred(),c=d._Deferred(),f;d.extend(b,{then:function(a,c){b.done(a).fail(c);return this},fail:c.done,rejectWith:c.resolveWith,reject:c.resolve,isRejected:c.isResolved,promise:function(a){if(a==null){if(f)return f;f=a={}}var c=e.length;while(c--)a[e[c]]=b[e[c]];return a}}),b.done(c.cancel).fail(b.cancel),delete b.cancel,a&&a.call(b,b);return b},when:function(a){function i(a){return function(c){b[a]=arguments.length>1?f.call(arguments,0):c,--g||h.resolveWith(h,f.call(b,0))}}var b=arguments,c=0,e=b.length,g=e,h=e<=1&&a&&d.isFunction(a.promise)?a:d.Deferred();if(e>1){for(;c<e;c++)b[c]&&d.isFunction(b[c].promise)?b[c].promise().then(i(c),h.reject):--g;g||h.resolveWith(h,b)}else h!==a&&h.resolveWith(h,e?[a]:[]);return h.promise()}}),function(){d.support={};var b=c.createElement("div");b.style.display="none",b.innerHTML="   <link/><table></table><a href='/a' style='color:red;float:left;opacity:.55;'>a</a><input type='checkbox'/>";var e=b.getElementsByTagName("*"),f=b.getElementsByTagName("a")[0],g=c.createElement("select"),h=g.appendChild(c.createElement("option")),i=b.getElementsByTagName("input")[0];if(e&&e.length&&f){d.support={leadingWhitespace:b.firstChild.nodeType===3,tbody:!b.getElementsByTagName("tbody").length,htmlSerialize:!!b.getElementsByTagName("link").length,style:/red/.test(f.getAttribute("style")),hrefNormalized:f.getAttribute("href")==="/a",opacity:/^0.55$/.test(f.style.opacity),cssFloat:!!f.style.cssFloat,checkOn:i.value==="on",optSelected:h.selected,deleteExpando:!0,optDisabled:!1,checkClone:!1,noCloneEvent:!0,noCloneChecked:!0,boxModel:null,inlineBlockNeedsLayout:!1,shrinkWrapBlocks:!1,reliableHiddenOffsets:!0,reliableMarginRight:!0},i.checked=!0,d.support.noCloneChecked=i.cloneNode(!0).checked,g.disabled=!0,d.support.optDisabled=!h.disabled;var j=null;d.support.scriptEval=function(){if(j===null){var b=c.documentElement,e=c.createElement("script"),f="script"+d.now();try{e.appendChild(c.createTextNode("window."+f+"=1;"))}catch(g){}b.insertBefore(e,b.firstChild),a[f]?(j=!0,delete a[f]):j=!1,b.removeChild(e)}return j};try{delete b.test}catch(k){d.support.deleteExpando=!1}!b.addEventListener&&b.attachEvent&&b.fireEvent&&(b.attachEvent("onclick",function l(){d.support.noCloneEvent=!1,b.detachEvent("onclick",l)}),b.cloneNode(!0).fireEvent("onclick")),b=c.createElement("div"),b.innerHTML="<input type='radio' name='radiotest' checked='checked'/>";var m=c.createDocumentFragment();m.appendChild(b.firstChild),d.support.checkClone=m.cloneNode(!0).cloneNode(!0).lastChild.checked,d(function(){var a=c.createElement("div"),b=c.getElementsByTagName("body")[0];if(b){a.style.width=a.style.paddingLeft="1px",b.appendChild(a),d.boxModel=d.support.boxModel=a.offsetWidth===2,"zoom"in a.style&&(a.style.display="inline",a.style.zoom=1,d.support.inlineBlockNeedsLayout=a.offsetWidth===2,a.style.display="",a.innerHTML="<div style='width:4px;'></div>",d.support.shrinkWrapBlocks=a.offsetWidth!==2),a.innerHTML="<table><tr><td style='padding:0;border:0;display:none'></td><td>t</td></tr></table>";var e=a.getElementsByTagName("td");d.support.reliableHiddenOffsets=e[0].offsetHeight===0,e[0].style.display="",e[1].style.display="none",d.support.reliableHiddenOffsets=d.support.reliableHiddenOffsets&&e[0].offsetHeight===0,a.innerHTML="",c.defaultView&&c.defaultView.getComputedStyle&&(a.style.width="1px",a.style.marginRight="0",d.support.reliableMarginRight=(parseInt(c.defaultView.getComputedStyle(a,null).marginRight,10)||0)===0),b.removeChild(a).style.display="none",a=e=null}});var n=function(a){var b=c.createElement("div");a="on"+a;if(!b.attachEvent)return!0;var d=a in b;d||(b.setAttribute(a,"return;"),d=typeof b[a]==="function");return d};d.support.submitBubbles=n("submit"),d.support.changeBubbles=n("change"),b=e=f=null}}();var g=/^(?:\{.*\}|\[.*\])$/;d.extend({cache:{},uuid:0,expando:"jQuery"+(d.fn.jquery+Math.random()).replace(/\D/g,""),noData:{embed:!0,object:"clsid:D27CDB6E-AE6D-11cf-96B8-444553540000",applet:!0},hasData:function(a){a=a.nodeType?d.cache[a[d.expando]]:a[d.expando];return!!a&&!i(a)},data:function(a,c,e,f){if(d.acceptData(a)){var g=d.expando,h=typeof c==="string",i,j=a.nodeType,k=j?d.cache:a,l=j?a[d.expando]:a[d.expando]&&d.expando;if((!l||f&&l&&!k[l][g])&&h&&e===b)return;l||(j?a[d.expando]=l=++d.uuid:l=d.expando),k[l]||(k[l]={},j||(k[l].toJSON=d.noop));if(typeof c==="object"||typeof c==="function")f?k[l][g]=d.extend(k[l][g],c):k[l]=d.extend(k[l],c);i=k[l],f&&(i[g]||(i[g]={}),i=i[g]),e!==b&&(i[c]=e);if(c==="events"&&!i[c])return i[g]&&i[g].events;return h?i[c]:i}},removeData:function(b,c,e){if(d.acceptData(b)){var f=d.expando,g=b.nodeType,h=g?d.cache:b,j=g?b[d.expando]:d.expando;if(!h[j])return;if(c){var k=e?h[j][f]:h[j];if(k){delete k[c];if(!i(k))return}}if(e){delete h[j][f];if(!i(h[j]))return}var l=h[j][f];d.support.deleteExpando||h!=a?delete h[j]:h[j]=null,l?(h[j]={},g||(h[j].toJSON=d.noop),h[j][f]=l):g&&(d.support.deleteExpando?delete b[d.expando]:b.removeAttribute?b.removeAttribute(d.expando):b[d.expando]=null)}},_data:function(a,b,c){return d.data(a,b,c,!0)},acceptData:function(a){if(a.nodeName){var b=d.noData[a.nodeName.toLowerCase()];if(b)return b!==!0&&a.getAttribute("classid")===b}return!0}}),d.fn.extend({data:function(a,c){var e=null;if(typeof a==="undefined"){if(this.length){e=d.data(this[0]);if(this[0].nodeType===1){var f=this[0].attributes,g;for(var i=0,j=f.length;i<j;i++)g=f[i].name,g.indexOf("data-")===0&&(g=g.substr(5),h(this[0],g,e[g]))}}return e}if(typeof a==="object")return this.each(function(){d.data(this,a)});var k=a.split(".");k[1]=k[1]?"."+k[1]:"";if(c===b){e=this.triggerHandler("getData"+k[1]+"!",[k[0]]),e===b&&this.length&&(e=d.data(this[0],a),e=h(this[0],a,e));return e===b&&k[1]?this.data(k[0]):e}return this.each(function(){var b=d(this),e=[k[0],c];b.triggerHandler("setData"+k[1]+"!",e),d.data(this,a,c),b.triggerHandler("changeData"+k[1]+"!",e)})},removeData:function(a){return this.each(function(){d.removeData(this,a)})}}),d.extend({queue:function(a,b,c){if(a){b=(b||"fx")+"queue";var e=d._data(a,b);if(!c)return e||[];!e||d.isArray(c)?e=d._data(a,b,d.makeArray(c)):e.push(c);return e}},dequeue:function(a,b){b=b||"fx";var c=d.queue(a,b),e=c.shift();e==="inprogress"&&(e=c.shift()),e&&(b==="fx"&&c.unshift("inprogress"),e.call(a,function(){d.dequeue(a,b)})),c.length||d.removeData(a,b+"queue",!0)}}),d.fn.extend({queue:function(a,c){typeof a!=="string"&&(c=a,a="fx");if(c===b)return d.queue(this[0],a);return this.each(function(b){var e=d.queue(this,a,c);a==="fx"&&e[0]!=="inprogress"&&d.dequeue(this,a)})},dequeue:function(a){return this.each(function(){d.dequeue(this,a)})},delay:function(a,b){a=d.fx?d.fx.speeds[a]||a:a,b=b||"fx";return this.queue(b,function(){var c=this;setTimeout(function(){d.dequeue(c,b)},a)})},clearQueue:function(a){return this.queue(a||"fx",[])}});var j=/[\n\t\r]/g,k=/\s+/,l=/\r/g,m=/^(?:href|src|style)$/,n=/^(?:button|input)$/i,o=/^(?:button|input|object|select|textarea)$/i,p=/^a(?:rea)?$/i,q=/^(?:radio|checkbox)$/i;d.props={"for":"htmlFor","class":"className",readonly:"readOnly",maxlength:"maxLength",cellspacing:"cellSpacing",rowspan:"rowSpan",colspan:"colSpan",tabindex:"tabIndex",usemap:"useMap",frameborder:"frameBorder"},d.fn.extend({attr:function(a,b){return d.access(this,a,b,!0,d.attr)},removeAttr:function(a,b){return this.each(function(){d.attr(this,a,""),this.nodeType===1&&this.removeAttribute(a)})},addClass:function(a){if(d.isFunction(a))return this.each(function(b){var c=d(this);c.addClass(a.call(this,b,c.attr("class")))});if(a&&typeof a==="string"){var b=(a||"").split(k);for(var c=0,e=this.length;c<e;c++){var f=this[c];if(f.nodeType===1)if(f.className){var g=" "+f.className+" ",h=f.className;for(var i=0,j=b.length;i<j;i++)g.indexOf(" "+b[i]+" ")<0&&(h+=" "+b[i]);f.className=d.trim(h)}else f.className=a}}return this},removeClass:function(a){if(d.isFunction(a))return this.each(function(b){var c=d(this);c.removeClass(a.call(this,b,c.attr("class")))});if(a&&typeof a==="string"||a===b){var c=(a||"").split(k);for(var e=0,f=this.length;e<f;e++){var g=this[e];if(g.nodeType===1&&g.className)if(a){var h=(" "+g.className+" ").replace(j," ");for(var i=0,l=c.length;i<l;i++)h=h.replace(" "+c[i]+" "," ");g.className=d.trim(h)}else g.className=""}}return this},toggleClass:function(a,b){var c=typeof a,e=typeof b==="boolean";if(d.isFunction(a))return this.each(function(c){var e=d(this);e.toggleClass(a.call(this,c,e.attr("class"),b),b)});return this.each(function(){if(c==="string"){var f,g=0,h=d(this),i=b,j=a.split(k);while(f=j[g++])i=e?i:!h.hasClass(f),h[i?"addClass":"removeClass"](f)}else if(c==="undefined"||c==="boolean")this.className&&d._data(this,"__className__",this.className),this.className=this.className||a===!1?"":d._data(this,"__className__")||""})},hasClass:function(a){var b=" "+a+" ";for(var c=0,d=this.length;c<d;c++)if((" "+this[c].className+" ").replace(j," ").indexOf(b)>-1)return!0;return!1},val:function(a){if(!arguments.length){var c=this[0];if(c){if(d.nodeName(c,"option")){var e=c.attributes.value;return!e||e.specified?c.value:c.text}if(d.nodeName(c,"select")){var f=c.selectedIndex,g=[],h=c.options,i=c.type==="select-one";if(f<0)return null;for(var j=i?f:0,k=i?f+1:h.length;j<k;j++){var m=h[j];if(m.selected&&(d.support.optDisabled?!m.disabled:m.getAttribute("disabled")===null)&&(!m.parentNode.disabled||!d.nodeName(m.parentNode,"optgroup"))){a=d(m).val();if(i)return a;g.push(a)}}if(i&&!g.length&&h.length)return d(h[f]).val();return g}if(q.test(c.type)&&!d.support.checkOn)return c.getAttribute("value")===null?"on":c.value;return(c.value||"").replace(l,"")}return b}var n=d.isFunction(a);return this.each(function(b){var c=d(this),e=a;if(this.nodeType===1){n&&(e=a.call(this,b,c.val())),e==null?e="":typeof e==="number"?e+="":d.isArray(e)&&(e=d.map(e,function(a){return a==null?"":a+""}));if(d.isArray(e)&&q.test(this.type))this.checked=d.inArray(c.val(),e)>=0;else if(d.nodeName(this,"select")){var f=d.makeArray(e);d("option",this).each(function(){this.selected=d.inArray(d(this).val(),f)>=0}),f.length||(this.selectedIndex=-1)}else this.value=e}})}}),d.extend({attrFn:{val:!0,css:!0,html:!0,text:!0,data:!0,width:!0,height:!0,offset:!0},attr:function(a,c,e,f){if(!a||a.nodeType===3||a.nodeType===8||a.nodeType===2)return b;if(f&&c in d.attrFn)return d(a)[c](e);var g=a.nodeType!==1||!d.isXMLDoc(a),h=e!==b;c=g&&d.props[c]||c;if(a.nodeType===1){var i=m.test(c);if(c==="selected"&&!d.support.optSelected){var j=a.parentNode;j&&(j.selectedIndex,j.parentNode&&j.parentNode.selectedIndex)}if((c in a||a[c]!==b)&&g&&!i){h&&(c==="type"&&n.test(a.nodeName)&&a.parentNode&&d.error("type property can't be changed"),e===null?a.nodeType===1&&a.removeAttribute(c):a[c]=e);if(d.nodeName(a,"form")&&a.getAttributeNode(c))return a.getAttributeNode(c).nodeValue;if(c==="tabIndex"){var k=a.getAttributeNode("tabIndex");return k&&k.specified?k.value:o.test(a.nodeName)||p.test(a.nodeName)&&a.href?0:b}return a[c]}if(!d.support.style&&g&&c==="style"){h&&(a.style.cssText=""+e);return a.style.cssText}h&&a.setAttribute(c,""+e);if(!a.attributes[c]&&(a.hasAttribute&&!a.hasAttribute(c)))return b;var l=!d.support.hrefNormalized&&g&&i?a.getAttribute(c,2):a.getAttribute(c);return l===null?b:l}h&&(a[c]=e);return a[c]}});var r=/\.(.*)$/,s=/^(?:textarea|input|select)$/i,t=/\./g,u=/ /g,v=/[^\w\s.|`]/g,w=function(a){return a.replace(v,"\\$&")};d.event={add:function(c,e,f,g){if(c.nodeType!==3&&c.nodeType!==8){try{d.isWindow(c)&&(c!==a&&!c.frameElement)&&(c=a)}catch(h){}if(f===!1)f=x;else if(!f)return;var i,j;f.handler&&(i=f,f=i.handler),f.guid||(f.guid=d.guid++);var k=d._data(c);if(!k)return;var l=k.events,m=k.handle;l||(k.events=l={}),m||(k.handle=m=function(a){return typeof d!=="undefined"&&d.event.triggered!==a.type?d.event.handle.apply(m.elem,arguments):b}),m.elem=c,e=e.split(" ");var n,o=0,p;while(n=e[o++]){j=i?d.extend({},i):{handler:f,data:g},n.indexOf(".")>-1?(p=n.split("."),n=p.shift(),j.namespace=p.slice(0).sort().join(".")):(p=[],j.namespace=""),j.type=n,j.guid||(j.guid=f.guid);var q=l[n],r=d.event.special[n]||{};if(!q){q=l[n]=[];if(!r.setup||r.setup.call(c,g,p,m)===!1)c.addEventListener?c.addEventListener(n,m,!1):c.attachEvent&&c.attachEvent("on"+n,m)}r.add&&(r.add.call(c,j),j.handler.guid||(j.handler.guid=f.guid)),q.push(j),d.event.global[n]=!0}c=null}},global:{},remove:function(a,c,e,f){if(a.nodeType!==3&&a.nodeType!==8){e===!1&&(e=x);var g,h,i,j,k=0,l,m,n,o,p,q,r,s=d.hasData(a)&&d._data(a),t=s&&s.events;if(!s||!t)return;c&&c.type&&(e=c.handler,c=c.type);if(!c||typeof c==="string"&&c.charAt(0)==="."){c=c||"";for(h in t)d.event.remove(a,h+c);return}c=c.split(" ");while(h=c[k++]){r=h,q=null,l=h.indexOf(".")<0,m=[],l||(m=h.split("."),h=m.shift(),n=new RegExp("(^|\\.)"+d.map(m.slice(0).sort(),w).join("\\.(?:.*\\.)?")+"(\\.|$)")),p=t[h];if(!p)continue;if(!e){for(j=0;j<p.length;j++){q=p[j];if(l||n.test(q.namespace))d.event.remove(a,r,q.handler,j),p.splice(j--,1)}continue}o=d.event.special[h]||{};for(j=f||0;j<p.length;j++){q=p[j];if(e.guid===q.guid){if(l||n.test(q.namespace))f==null&&p.splice(j--,1),o.remove&&o.remove.call(a,q);if(f!=null)break}}if(p.length===0||f!=null&&p.length===1)(!o.teardown||o.teardown.call(a,m)===!1)&&d.removeEvent(a,h,s.handle),g=null,delete t[h]}if(d.isEmptyObject(t)){var u=s.handle;u&&(u.elem=null),delete s.events,delete s.handle,d.isEmptyObject(s)&&d.removeData(a,b,!0)}}},trigger:function(a,c,e){var f=a.type||a,g=arguments[3];if(!g){a=typeof a==="object"?a[d.expando]?a:d.extend(d.Event(f),a):d.Event(f),f.indexOf("!")>=0&&(a.type=f=f.slice(0,-1),a.exclusive=!0),e||(a.stopPropagation(),d.event.global[f]&&d.each(d.cache,function(){var b=d.expando,e=this[b];e&&e.events&&e.events[f]&&d.event.trigger(a,c,e.handle.elem)}));if(!e||e.nodeType===3||e.nodeType===8)return b;a.result=b,a.target=e,c=d.makeArray(c),c.unshift(a)}a.currentTarget=e;var h=d._data(e,"handle");h&&h.apply(e,c);var i=e.parentNode||e.ownerDocument;try{e&&e.nodeName&&d.noData[e.nodeName.toLowerCase()]||e["on"+f]&&e["on"+f].apply(e,c)===!1&&(a.result=!1,a.preventDefault())}catch(j){}if(!a.isPropagationStopped()&&i)d.event.trigger(a,c,i,!0);else if(!a.isDefaultPrevented()){var k,l=a.target,m=f.replace(r,""),n=d.nodeName(l,"a")&&m==="click",o=d.event.special[m]||{};if((!o._default||o._default.call(e,a)===!1)&&!n&&!(l&&l.nodeName&&d.noData[l.nodeName.toLowerCase()])){try{l[m]&&(k=l["on"+m],k&&(l["on"+m]=null),d.event.triggered=a.type,l[m]())}catch(p){}k&&(l["on"+m]=k),d.event.triggered=b}}},handle:function(c){var e,f,g,h,i,j=[],k=d.makeArray(arguments);c=k[0]=d.event.fix(c||a.event),c.currentTarget=this,e=c.type.indexOf(".")<0&&!c.exclusive,e||(g=c.type.split("."),c.type=g.shift(),j=g.slice(0).sort(),h=new RegExp("(^|\\.)"+j.join("\\.(?:.*\\.)?")+"(\\.|$)")),c.namespace=c.namespace||j.join("."),i=d._data(this,"events"),f=(i||{})[c.type];if(i&&f){f=f.slice(0);for(var l=0,m=f.length;l<m;l++){var n=f[l];if(e||h.test(n.namespace)){c.handler=n.handler,c.data=n.data,c.handleObj=n;var o=n.handler.apply(this,k);o!==b&&(c.result=o,o===!1&&(c.preventDefault(),c.stopPropagation()));if(c.isImmediatePropagationStopped())break}}}return c.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(" "),fix:function(a){if(a[d.expando])return a;var e=a;a=d.Event(e);for(var f=this.props.length,g;f;)g=this.props[--f],a[g]=e[g];a.target||(a.target=a.srcElement||c),a.target.nodeType===3&&(a.target=a.target.parentNode),!a.relatedTarget&&a.fromElement&&(a.relatedTarget=a.fromElement===a.target?a.toElement:a.fromElement);if(a.pageX==null&&a.clientX!=null){var h=c.documentElement,i=c.body;a.pageX=a.clientX+(h&&h.scrollLeft||i&&i.scrollLeft||0)-(h&&h.clientLeft||i&&i.clientLeft||0),a.pageY=a.clientY+(h&&h.scrollTop||i&&i.scrollTop||0)-(h&&h.clientTop||i&&i.clientTop||0)}a.which==null&&(a.charCode!=null||a.keyCode!=null)&&(a.which=a.charCode!=null?a.charCode:a.keyCode),!a.metaKey&&a.ctrlKey&&(a.metaKey=a.ctrlKey),!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:d.proxy,special:{ready:{setup:d.bindReady,teardown:d.noop},live:{add:function(a){d.event.add(this,H(a.origType,a.selector),d.extend({},a,{handler:G,guid:a.handler.guid}))},remove:function(a){d.event.remove(this,H(a.origType,a.selector),a)}},beforeunload:{setup:function(a,b,c){d.isWindow(this)&&(this.onbeforeunload=c)},teardown:function(a,b){this.onbeforeunload===b&&(this.onbeforeunload=null)}}}},d.removeEvent=c.removeEventListener?function(a,b,c){a.removeEventListener&&a.removeEventListener(b,c,!1)}:function(a,b,c){a.detachEvent&&a.detachEvent("on"+b,c)},d.Event=function(a){if(!this.preventDefault)return new d.Event(a);a&&a.type?(this.originalEvent=a,this.type=a.type,this.isDefaultPrevented=a.defaultPrevented||a.returnValue===!1||a.getPreventDefault&&a.getPreventDefault()?y:x):this.type=a,this.timeStamp=d.now(),this[d.expando]=!0},d.Event.prototype={preventDefault:function(){this.isDefaultPrevented=y;var a=this.originalEvent;a&&(a.preventDefault?a.preventDefault():a.returnValue=!1)},stopPropagation:function(){this.isPropagationStopped=y;var a=this.originalEvent;a&&(a.stopPropagation&&a.stopPropagation(),a.cancelBubble=!0)},stopImmediatePropagation:function(){this.isImmediatePropagationStopped=y,this.stopPropagation()},isDefaultPrevented:x,isPropagationStopped:x,isImmediatePropagationStopped:x};var z=function(a){var b=a.relatedTarget;try{if(b&&b!==c&&!b.parentNode)return;while(b&&b!==this)b=b.parentNode;b!==this&&(a.type=a.data,d.event.handle.apply(this,arguments))}catch(e){}},A=function(a){a.type=a.data,d.event.handle.apply(this,arguments)};d.each({mouseenter:"mouseover",mouseleave:"mouseout"},function(a,b){d.event.special[a]={setup:function(c){d.event.add(this,b,c&&c.selector?A:z,a)},teardown:function(a){d.event.remove(this,b,a&&a.selector?A:z)}}}),d.support.submitBubbles||(d.event.special.submit={setup:function(a,b){if(this.nodeName&&this.nodeName.toLowerCase()!=="form")d.event.add(this,"click.specialSubmit",function(a){var b=a.target,c=b.type;(c==="submit"||c==="image")&&d(b).closest("form").length&&E("submit",this,arguments)}),d.event.add(this,"keypress.specialSubmit",function(a){var b=a.target,c=b.type;(c==="text"||c==="password")&&d(b).closest("form").length&&a.keyCode===13&&E("submit",this,arguments)});else return!1},teardown:function(a){d.event.remove(this,".specialSubmit")}});if(!d.support.changeBubbles){var B,C=function(a){var b=a.type,c=a.value;b==="radio"||b==="checkbox"?c=a.checked:b==="select-multiple"?c=a.selectedIndex>-1?d.map(a.options,function(a){return a.selected}).join("-"):"":a.nodeName.toLowerCase()==="select"&&(c=a.selectedIndex);return c},D=function D(a){var c=a.target,e,f;if(s.test(c.nodeName)&&!c.readOnly){e=d._data(c,"_change_data"),f=C(c),(a.type!=="focusout"||c.type!=="radio")&&d._data(c,"_change_data",f);if(e===b||f===e)return;if(e!=null||f)a.type="change",a.liveFired=b,d.event.trigger(a,arguments[1],c)}};d.event.special.change={filters:{focusout:D,beforedeactivate:D,click:function(a){var b=a.target,c=b.type;(c==="radio"||c==="checkbox"||b.nodeName.toLowerCase()==="select")&&D.call(this,a)},keydown:function(a){var b=a.target,c=b.type;(a.keyCode===13&&b.nodeName.toLowerCase()!=="textarea"||a.keyCode===32&&(c==="checkbox"||c==="radio")||c==="select-multiple")&&D.call(this,a)},beforeactivate:function(a){var b=a.target;d._data(b,"_change_data",C(b))}},setup:function(a,b){if(this.type==="file")return!1;for(var c in B)d.event.add(this,c+".specialChange",B[c]);return s.test(this.nodeName)},teardown:function(a){d.event.remove(this,".specialChange");return s.test(this.nodeName)}},B=d.event.special.change.filters,B.focus=B.beforeactivate}c.addEventListener&&d.each({focus:"focusin",blur:"focusout"},function(a,b){function f(a){var c=d.event.fix(a);c.type=b,c.originalEvent={},d.event.trigger(c,null,c.target),c.isDefaultPrevented()&&a.preventDefault()}var e=0;d.event.special[b]={setup:function(){e++===0&&c.addEventListener(a,f,!0)},teardown:function(){--e===0&&c.removeEventListener(a,f,!0)}}}),d.each(["bind","one"],function(a,c){d.fn[c]=function(a,e,f){if(typeof a==="object"){for(var g in a)this[c](g,e,a[g],f);return this}if(d.isFunction(e)||e===!1)f=e,e=b;var h=c==="one"?d.proxy(f,function(a){d(this).unbind(a,h);return f.apply(this,arguments)}):f;if(a==="unload"&&c!=="one")this.one(a,e,f);else for(var i=0,j=this.length;i<j;i++)d.event.add(this[i],a,h,e);return this}}),d.fn.extend({unbind:function(a,b){if(typeof a!=="object"||a.preventDefault)for(var e=0,f=this.length;e<f;e++)d.event.remove(this[e],a,b);else for(var c in a)this.unbind(c,a[c]);return this},delegate:function(a,b,c,d){return this.live(b,c,d,a)},undelegate:function(a,b,c){return arguments.length===0?this.unbind("live"):this.die(b,null,c,a)},trigger:function(a,b){return this.each(function(){d.event.trigger(a,b,this)})},triggerHandler:function(a,b){if(this[0]){var c=d.Event(a);c.preventDefault(),c.stopPropagation(),d.event.trigger(c,b,this[0]);return c.result}},toggle:function(a){var b=arguments,c=1;while(c<b.length)d.proxy(a,b[c++]);return this.click(d.proxy(a,function(e){var f=(d._data(this,"lastToggle"+a.guid)||0)%c;d._data(this,"lastToggle"+a.guid,f+1),e.preventDefault();return b[f].apply(this,arguments)||!1}))},hover:function(a,b){return this.mouseenter(a).mouseleave(b||a)}});var F={focus:"focusin",blur:"focusout",mouseenter:"mouseover",mouseleave:"mouseout"};d.each(["live","die"],function(a,c){d.fn[c]=function(a,e,f,g){var h,i=0,j,k,l,m=g||this.selector,n=g?this:d(this.context);if(typeof a==="object"&&!a.preventDefault){for(var o in a)n[c](o,e,a[o],m);return this}d.isFunction(e)&&(f=e,e=b),a=(a||"").split(" ");while((h=a[i++])!=null){j=r.exec(h),k="",j&&(k=j[0],h=h.replace(r,""));if(h==="hover"){a.push("mouseenter"+k,"mouseleave"+k);continue}l=h,h==="focus"||h==="blur"?(a.push(F[h]+k),h=h+k):h=(F[h]||h)+k;if(c==="live")for(var p=0,q=n.length;p<q;p++)d.event.add(n[p],"live."+H(h,m),{data:e,selector:m,handler:f,origType:h,origHandler:f,preType:l});else n.unbind("live."+H(h,m),f)}return this}}),d.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){d.fn[b]=function(a,c){c==null&&(c=a,a=null);return arguments.length>0?this.bind(b,a,c):this.trigger(b)},d.attrFn&&(d.attrFn[b]=!0)}),function(){function u(a,b,c,d,e,f){for(var g=0,h=d.length;g<h;g++){var i=d[g];if(i){var j=!1;i=i[a];while(i){if(i.sizcache===c){j=d[i.sizset];break}if(i.nodeType===1){f||(i.sizcache=c,i.sizset=g);if(typeof b!=="string"){if(i===b){j=!0;break}}else if(k.filter(b,[i]).length>0){j=i;break}}i=i[a]}d[g]=j}}}function t(a,b,c,d,e,f){for(var g=0,h=d.length;g<h;g++){var i=d[g];if(i){var j=!1;i=i[a];while(i){if(i.sizcache===c){j=d[i.sizset];break}i.nodeType===1&&!f&&(i.sizcache=c,i.sizset=g);if(i.nodeName.toLowerCase()===b){j=i;break}i=i[a]}d[g]=j}}}var a=/((?:\((?:\([^()]+\)|[^()]+)+\)|\[(?:\[[^\[\]]*\]|['"][^'"]*['"]|[^\[\]'"]+)+\]|\\.|[^ >+~,(\[\\]+)+|[>+~])(\s*,\s*)?((?:.|\r|\n)*)/g,e=0,f=Object.prototype.toString,g=!1,h=!0,i=/\\/g,j=/\W/;[0,0].sort(function(){h=!1;return 0});var k=function(b,d,e,g){e=e||[],d=d||c;var h=d;if(d.nodeType!==1&&d.nodeType!==9)return[];if(!b||typeof b!=="string")return e;var i,j,n,o,q,r,s,t,u=!0,w=k.isXML(d),x=[],y=b;do{a.exec(""),i=a.exec(y);if(i){y=i[3],x.push(i[1]);if(i[2]){o=i[3];break}}}while(i);if(x.length>1&&m.exec(b))if(x.length===2&&l.relative[x[0]])j=v(x[0]+x[1],d);else{j=l.relative[x[0]]?[d]:k(x.shift(),d);while(x.length)b=x.shift(),l.relative[b]&&(b+=x.shift()),j=v(b,j)}else{!g&&x.length>1&&d.nodeType===9&&!w&&l.match.ID.test(x[0])&&!l.match.ID.test(x[x.length-1])&&(q=k.find(x.shift(),d,w),d=q.expr?k.filter(q.expr,q.set)[0]:q.set[0]);if(d){q=g?{expr:x.pop(),set:p(g)}:k.find(x.pop(),x.length===1&&(x[0]==="~"||x[0]==="+")&&d.parentNode?d.parentNode:d,w),j=q.expr?k.filter(q.expr,q.set):q.set,x.length>0?n=p(j):u=!1;while(x.length)r=x.pop(),s=r,l.relative[r]?s=x.pop():r="",s==null&&(s=d),l.relative[r](n,s,w)}else n=x=[]}n||(n=j),n||k.error(r||b);if(f.call(n)==="[object Array]")if(u)if(d&&d.nodeType===1)for(t=0;n[t]!=null;t++)n[t]&&(n[t]===!0||n[t].nodeType===1&&k.contains(d,n[t]))&&e.push(j[t]);else for(t=0;n[t]!=null;t++)n[t]&&n[t].nodeType===1&&e.push(j[t]);else e.push.apply(e,n);else p(n,e);o&&(k(o,h,e,g),k.uniqueSort(e));return e};k.uniqueSort=function(a){if(r){g=h,a.sort(r);if(g)for(var b=1;b<a.length;b++)a[b]===a[b-1]&&a.splice(b--,1)}return a},k.matches=function(a,b){return k(a,null,null,b)},k.matchesSelector=function(a,b){return k(b,null,null,[a]).length>0},k.find=function(a,b,c){var d;if(!a)return[];for(var e=0,f=l.order.length;e<f;e++){var g,h=l.order[e];if(g=l.leftMatch[h].exec(a)){var j=g[1];g.splice(1,1);if(j.substr(j.length-1)!=="\\"){g[1]=(g[1]||"").replace(i,""),d=l.find[h](g,b,c);if(d!=null){a=a.replace(l.match[h],"");break}}}}d||(d=typeof b.getElementsByTagName!=="undefined"?b.getElementsByTagName("*"):[]);return{set:d,expr:a}},k.filter=function(a,c,d,e){var f,g,h=a,i=[],j=c,m=c&&c[0]&&k.isXML(c[0]);while(a&&c.length){for(var n in l.filter)if((f=l.leftMatch[n].exec(a))!=null&&f[2]){var o,p,q=l.filter[n],r=f[1];g=!1,f.splice(1,1);if(r.substr(r.length-1)==="\\")continue;j===i&&(i=[]);if(l.preFilter[n]){f=l.preFilter[n](f,j,d,i,e,m);if(f){if(f===!0)continue}else g=o=!0}if(f)for(var s=0;(p=j[s])!=null;s++)if(p){o=q(p,f,s,j);var t=e^!!o;d&&o!=null?t?g=!0:j[s]=!1:t&&(i.push(p),g=!0)}if(o!==b){d||(j=i),a=a.replace(l.match[n],"");if(!g)return[];break}}if(a===h)if(g==null)k.error(a);else break;h=a}return j},k.error=function(a){throw"Syntax error, unrecognized expression: "+a};var l=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|(#?(?:[\w\u00c0-\uFFFF\-]|\\.)*)|)|)\s*\]/,TAG:/^((?:[\w\u00c0-\uFFFF\*\-]|\\.)+)/,CHILD:/:(only|nth|last|first)-child(?:\(\s*(even|odd|(?:[+\-]?\d+|(?:[+\-]?\d*)?n\s*(?:[+\-]\s*\d+)?))\s*\))?/,POS:/:(nth|eq|gt|lt|first|last|even|odd)(?:\((\d*)\))?(?=[^\-]|$)/,PSEUDO:/:((?:[\w\u00c0-\uFFFF\-]|\\.)+)(?:\((['"]?)((?:\([^\)]+\)|[^\(\)]*)+)\2\))?/},leftMatch:{},attrMap:{"class":"className","for":"htmlFor"},attrHandle:{href:function(a){return a.getAttribute("href")},type:function(a){return a.getAttribute("type")}},relative:{"+":function(a,b){var c=typeof b==="string",d=c&&!j.test(b),e=c&&!d;d&&(b=b.toLowerCase());for(var f=0,g=a.length,h;f<g;f++)if(h=a[f]){while((h=h.previousSibling)&&h.nodeType!==1){}a[f]=e||h&&h.nodeName.toLowerCase()===b?h||!1:h===b}e&&k.filter(b,a,!0)},">":function(a,b){var c,d=typeof b==="string",e=0,f=a.length;if(d&&!j.test(b)){b=b.toLowerCase();for(;e<f;e++){c=a[e];if(c){var g=c.parentNode;a[e]=g.nodeName.toLowerCase()===b?g:!1}}}else{for(;e<f;e++)c=a[e],c&&(a[e]=d?c.parentNode:c.parentNode===b);d&&k.filter(b,a,!0)}},"":function(a,b,c){var d,f=e++,g=u;typeof b==="string"&&!j.test(b)&&(b=b.toLowerCase(),d=b,g=t),g("parentNode",b,f,a,d,c)},"~":function(a,b,c){var d,f=e++,g=u;typeof b==="string"&&!j.test(b)&&(b=b.toLowerCase(),d=b,g=t),g("previousSibling",b,f,a,d,c)}},find:{ID:function(a,b,c){if(typeof b.getElementById!=="undefined"&&!c){var d=b.getElementById(a[1]);return d&&d.parentNode?[d]:[]}},NAME:function(a,b){if(typeof b.getElementsByName!=="undefined"){var c=[],d=b.getElementsByName(a[1]);for(var e=0,f=d.length;e<f;e++)d[e].getAttribute("name")===a[1]&&c.push(d[e]);return c.length===0?null:c}},TAG:function(a,b){if(typeof b.getElementsByTagName!=="undefined")return b.getElementsByTagName(a[1])}},preFilter:{CLASS:function(a,b,c,d,e,f){a=" "+a[1].replace(i,"")+" ";if(f)return a;for(var g=0,h;(h=b[g])!=null;g++)h&&(e^(h.className&&(" "+h.className+" ").replace(/[\t\n\r]/g," ").indexOf(a)>=0)?c||d.push(h):c&&(b[g]=!1));return!1},ID:function(a){return a[1].replace(i,"")},TAG:function(a,b){return a[1].replace(i,"").toLowerCase()},CHILD:function(a){if(a[1]==="nth"){a[2]||k.error(a[0]),a[2]=a[2].replace(/^\+|\s*/g,"");var b=/(-?)(\d*)(?:n([+\-]?\d*))?/.exec(a[2]==="even"&&"2n"||a[2]==="odd"&&"2n+1"||!/\D/.test(a[2])&&"0n+"+a[2]||a[2]);a[2]=b[1]+(b[2]||1)-0,a[3]=b[3]-0}else a[2]&&k.error(a[0]);a[0]=e++;return a},ATTR:function(a,b,c,d,e,f){var g=a[1]=a[1].replace(i,"");!f&&l.attrMap[g]&&(a[1]=l.attrMap[g]),a[4]=(a[4]||a[5]||"").replace(i,""),a[2]==="~="&&(a[4]=" "+a[4]+" ");return a},PSEUDO:function(b,c,d,e,f){if(b[1]==="not")if((a.exec(b[3])||"").length>1||/^\w/.test(b[3]))b[3]=k(b[3],null,null,c);else{var g=k.filter(b[3],c,d,!0^f);d||e.push.apply(e,g);return!1}else if(l.match.POS.test(b[0])||l.match.CHILD.test(b[0]))return!0;return b},POS:function(a){a.unshift(!0);return a}},filters:{enabled:function(a){return a.disabled===!1&&a.type!=="hidden"},disabled:function(a){return a.disabled===!0},checked:function(a){return a.checked===!0},selected:function(a){a.parentNode&&a.parentNode.selectedIndex;return a.selected===!0},parent:function(a){return!!a.firstChild},empty:function(a){return!a.firstChild},has:function(a,b,c){return!!k(c[3],a).length},header:function(a){return/h\d/i.test(a.nodeName)},text:function(a){var b=a.getAttribute("type"),c=a.type;return"text"===c&&(b===c||b===null)},radio:function(a){return"radio"===a.type},checkbox:function(a){return"checkbox"===a.type},file:function(a){return"file"===a.type},password:function(a){return"password"===a.type},submit:function(a){return"submit"===a.type},image:function(a){return"image"===a.type},reset:function(a){return"reset"===a.type},button:function(a){return"button"===a.type||a.nodeName.toLowerCase()==="button"},input:function(a){return/input|select|textarea|button/i.test(a.nodeName)}},setFilters:{first:function(a,b){return b===0},last:function(a,b,c,d){return b===d.length-1},even:function(a,b){return b%2===0},odd:function(a,b){return b%2===1},lt:function(a,b,c){return b<c[3]-0},gt:function(a,b,c){return b>c[3]-0},nth:function(a,b,c){return c[3]-0===b},eq:function(a,b,c){return c[3]-0===b}},filter:{PSEUDO:function(a,b,c,d){var e=b[1],f=l.filters[e];if(f)return f(a,c,b,d);if(e==="contains")return(a.textContent||a.innerText||k.getText([a])||"").indexOf(b[3])>=0;if(e==="not"){var g=b[3];for(var h=0,i=g.length;h<i;h++)if(g[h]===a)return!1;return!0}k.error(e)},CHILD:function(a,b){var c=b[1],d=a;switch(c){case"only":case"first":while(d=d.previousSibling)if(d.nodeType===1)return!1;if(c==="first")return!0;d=a;case"last":while(d=d.nextSibling)if(d.nodeType===1)return!1;return!0;case"nth":var e=b[2],f=b[3];if(e===1&&f===0)return!0;var g=b[0],h=a.parentNode;if(h&&(h.sizcache!==g||!a.nodeIndex)){var i=0;for(d=h.firstChild;d;d=d.nextSibling)d.nodeType===1&&(d.nodeIndex=++i);h.sizcache=g}var j=a.nodeIndex-f;return e===0?j===0:j%e===0&&j/e>=0}},ID:function(a,b){return a.nodeType===1&&a.getAttribute("id")===b},TAG:function(a,b){return b==="*"&&a.nodeType===1||a.nodeName.toLowerCase()===b},CLASS:function(a,b){return(" "+(a.className||a.getAttribute("class"))+" ").indexOf(b)>-1},ATTR:function(a,b){var c=b[1],d=l.attrHandle[c]?l.attrHandle[c](a):a[c]!=null?a[c]:a.getAttribute(c),e=d+"",f=b[2],g=b[4];return d==null?f==="!=":f==="="?e===g:f==="*="?e.indexOf(g)>=0:f==="~="?(" "+e+" ").indexOf(g)>=0:g?f==="!="?e!==g:f==="^="?e.indexOf(g)===0:f==="$="?e.substr(e.length-g.length)===g:f==="|="?e===g||e.substr(0,g.length+1)===g+"-":!1:e&&d!==!1},POS:function(a,b,c,d){var e=b[2],f=l.setFilters[e];if(f)return f(a,c,b,d)}}},m=l.match.POS,n=function(a,b){return"\\"+(b-0+1)};for(var o in l.match)l.match[o]=new RegExp(l.match[o].source+/(?![^\[]*\])(?![^\(]*\))/.source),l.leftMatch[o]=new RegExp(/(^(?:.|\r|\n)*?)/.source+l.match[o].source.replace(/\\(\d+)/g,n));var p=function(a,b){a=Array.prototype.slice.call(a,0);if(b){b.push.apply(b,a);return b}return a};try{Array.prototype.slice.call(c.documentElement.childNodes,0)[0].nodeType}catch(q){p=function(a,b){var c=0,d=b||[];if(f.call(a)==="[object Array]")Array.prototype.push.apply(d,a);else if(typeof a.length==="number")for(var e=a.length;c<e;c++)d.push(a[c]);else for(;a[c];c++)d.push(a[c]);return d}}var r,s;c.documentElement.compareDocumentPosition?r=function(a,b){if(a===b){g=!0;return 0}if(!a.compareDocumentPosition||!b.compareDocumentPosition)return a.compareDocumentPosition?-1:1;return a.compareDocumentPosition(b)&4?-1:1}:(r=function(a,b){var c,d,e=[],f=[],h=a.parentNode,i=b.parentNode,j=h;if(a===b){g=!0;return 0}if(h===i)return s(a,b);if(!h)return-1;if(!i)return 1;while(j)e.unshift(j),j=j.parentNode;j=i;while(j)f.unshift(j),j=j.parentNode;c=e.length,d=f.length;for(var k=0;k<c&&k<d;k++)if(e[k]!==f[k])return s(e[k],f[k]);return k===c?s(a,f[k],-1):s(e[k],b,1)},s=function(a,b,c){if(a===b)return c;var d=a.nextSibling;while(d){if(d===b)return-1;d=d.nextSibling}return 1}),k.getText=function(a){var b="",c;for(var d=0;a[d];d++)c=a[d],c.nodeType===3||c.nodeType===4?b+=c.nodeValue:c.nodeType!==8&&(b+=k.getText(c.childNodes));return b},function(){var a=c.createElement("div"),d="script"+(new Date).getTime(),e=c.documentElement;a.innerHTML="<a name='"+d+"'/>",e.insertBefore(a,e.firstChild),c.getElementById(d)&&(l.find.ID=function(a,c,d){if(typeof c.getElementById!=="undefined"&&!d){var e=c.getElementById(a[1]);return e?e.id===a[1]||typeof e.getAttributeNode!=="undefined"&&e.getAttributeNode("id").nodeValue===a[1]?[e]:b:[]}},l.filter.ID=function(a,b){var c=typeof a.getAttributeNode!=="undefined"&&a.getAttributeNode("id");return a.nodeType===1&&c&&c.nodeValue===b}),e.removeChild(a),e=a=null}(),function(){var a=c.createElement("div");a.appendChild(c.createComment("")),a.getElementsByTagName("*").length>0&&(l.find.TAG=function(a,b){var c=b.getElementsByTagName(a[1]);if(a[1]==="*"){var d=[];for(var e=0;c[e];e++)c[e].nodeType===1&&d.push(c[e]);c=d}return c}),a.innerHTML="<a href='#'></a>",a.firstChild&&typeof a.firstChild.getAttribute!=="undefined"&&a.firstChild.getAttribute("href")!=="#"&&(l.attrHandle.href=function(a){return a.getAttribute("href",2)}),a=null}(),c.querySelectorAll&&function(){var a=k,b=c.createElement("div"),d="__sizzle__";b.innerHTML="<p class='TEST'></p>";if(!b.querySelectorAll||b.querySelectorAll(".TEST").length!==0){k=function(b,e,f,g){e=e||c;if(!g&&!k.isXML(e)){var h=/^(\w+$)|^\.([\w\-]+$)|^#([\w\-]+$)/.exec(b);if(h&&(e.nodeType===1||e.nodeType===9)){if(h[1])return p(e.getElementsByTagName(b),f);if(h[2]&&l.find.CLASS&&e.getElementsByClassName)return p(e.getElementsByClassName(h[2]),f)}if(e.nodeType===9){if(b==="body"&&e.body)return p([e.body],f);if(h&&h[3]){var i=e.getElementById(h[3]);if(!i||!i.parentNode)return p([],f);if(i.id===h[3])return p([i],f)}try{return p(e.querySelectorAll(b),f)}catch(j){}}else if(e.nodeType===1&&e.nodeName.toLowerCase()!=="object"){var m=e,n=e.getAttribute("id"),o=n||d,q=e.parentNode,r=/^\s*[+~]/.test(b);n?o=o.replace(/'/g,"\\$&"):e.setAttribute("id",o),r&&q&&(e=e.parentNode);try{if(!r||q)return p(e.querySelectorAll("[id='"+o+"'] "+b),f)}catch(s){}finally{n||m.removeAttribute("id")}}}return a(b,e,f,g)};for(var e in a)k[e]=a[e];b=null}}(),function(){var a=c.documentElement,b=a.matchesSelector||a.mozMatchesSelector||a.webkitMatchesSelector||a.msMatchesSelector;if(b){var d=!b.call(c.createElement("div"),"div"),e=!1;try{b.call(c.documentElement,"[test!='']:sizzle")}catch(f){e=!0}k.matchesSelector=function(a,c){c=c.replace(/\=\s*([^'"\]]*)\s*\]/g,"='$1']");if(!k.isXML(a))try{if(e||!l.match.PSEUDO.test(c)&&!/!=/.test(c)){var f=b.call(a,c);if(f||!d||a.document&&a.document.nodeType!==11)return f}}catch(g){}return k(c,null,null,[a]).length>0}}}(),function(){var a=c.createElement("div");a.innerHTML="<div class='test e'></div><div class='test'></div>";if(a.getElementsByClassName&&a.getElementsByClassName("e").length!==0){a.lastChild.className="e";if(a.getElementsByClassName("e").length===1)return;l.order.splice(1,0,"CLASS"),l.find.CLASS=function(a,b,c){if(typeof b.getElementsByClassName!=="undefined"&&!c)return b.getElementsByClassName(a[1])},a=null}}(),c.documentElement.contains?k.contains=function(a,b){return a!==b&&(a.contains?a.contains(b):!0)}:c.documentElement.compareDocumentPosition?k.contains=function(a,b){return!!(a.compareDocumentPosition(b)&16)}:k.contains=function(){return!1},k.isXML=function(a){var b=(a?a.ownerDocument||a:0).documentElement;return b?b.nodeName!=="HTML":!1};var v=function(a,b){var c,d=[],e="",f=b.nodeType?[b]:b;while(c=l.match.PSEUDO.exec(a))e+=c[0],a=a.replace(l.match.PSEUDO,"");a=l.relative[a]?a+"*":a;for(var g=0,h=f.length;g<h;g++)k(a,f[g],d);return k.filter(e,d)};d.find=k,d.expr=k.selectors,d.expr[":"]=d.expr.filters,d.unique=k.uniqueSort,d.text=k.getText,d.isXMLDoc=k.isXML,d.contains=k.contains}();var I=/Until$/,J=/^(?:parents|prevUntil|prevAll)/,K=/,/,L=/^.[^:#\[\.,]*$/,M=Array.prototype.slice,N=d.expr.match.POS,O={children:!0,contents:!0,next:!0,prev:!0};d.fn.extend({find:function(a){var b=this.pushStack("","find",a),c=0;for(var e=0,f=this.length;e<f;e++){c=b.length,d.find(a,this[e],b);if(e>0)for(var g=c;g<b.length;g++)for(var h=0;h<c;h++)if(b[h]===b[g]){b.splice(g--,1);break}}return b},has:function(a){var b=d(a);return this.filter(function(){for(var a=0,c=b.length;a<c;a++)if(d.contains(this,b[a]))return!0})},not:function(a){return this.pushStack(Q(this,a,!1),"not",a)},filter:function(a){return this.pushStack(Q(this,a,!0),"filter",a)},is:function(a){return!!a&&d.filter(a,this).length>0},closest:function(a,b){var c=[],e,f,g=this[0];if(d.isArray(a)){var h,i,j={},k=1;if(g&&a.length){for(e=0,f=a.length;e<f;e++)i=a[e],j[i]||(j[i]=d.expr.match.POS.test(i)?d(i,b||this.context):i);while(g&&g.ownerDocument&&g!==b){for(i in j)h=j[i],(h.jquery?h.index(g)>-1:d(g).is(h))&&c.push({selector:i,elem:g,level:k});g=g.parentNode,k++}}return c}var l=N.test(a)?d(a,b||this.context):null;for(e=0,f=this.length;e<f;e++){g=this[e];while(g){if(l?l.index(g)>-1:d.find.matchesSelector(g,a)){c.push(g);break}g=g.parentNode;if(!g||!g.ownerDocument||g===b)break}}c=c.length>1?d.unique(c):c;return this.pushStack(c,"closest",a)},index:function(a){if(!a||typeof a==="string")return d.inArray(this[0],a?d(a):this.parent().children());return d.inArray(a.jquery?a[0]:a,this)},add:function(a,b){var c=typeof a==="string"?d(a,b):d.makeArray(a),e=d.merge(this.get(),c);return this.pushStack(P(c[0])||P(e[0])?e:d.unique(e))},andSelf:function(){return this.add(this.prevObject)}}),d.each({parent:function(a){var b=a.parentNode;return b&&b.nodeType!==11?b:null},parents:function(a){return d.dir(a,"parentNode")},parentsUntil:function(a,b,c){return d.dir(a,"parentNode",c)},next:function(a){return d.nth(a,2,"nextSibling")},prev:function(a){return d.nth(a,2,"previousSibling")},nextAll:function(a){return d.dir(a,"nextSibling")},prevAll:function(a){return d.dir(a,"previousSibling")},nextUntil:function(a,b,c){return d.dir(a,"nextSibling",c)},prevUntil:function(a,b,c){return d.dir(a,"previousSibling",c)},siblings:function(a){return d.sibling(a.parentNode.firstChild,a)},children:function(a){return d.sibling(a.firstChild)},contents:function(a){return d.nodeName(a,"iframe")?a.contentDocument||a.contentWindow.document:d.makeArray(a.childNodes)}},function(a,b){d.fn[a]=function(c,e){var f=d.map(this,b,c),g=M.call(arguments);I.test(a)||(e=c),e&&typeof e==="string"&&(f=d.filter(e,f)),f=this.length>1&&!O[a]?d.unique(f):f,(this.length>1||K.test(e))&&J.test(a)&&(f=f.reverse());return this.pushStack(f,a,g.join(","))}}),d.extend({filter:function(a,b,c){c&&(a=":not("+a+")");return b.length===1?d.find.matchesSelector(b[0],a)?[b[0]]:[]:d.find.matches(a,b)},dir:function(a,c,e){var f=[],g=a[c];while(g&&g.nodeType!==9&&(e===b||g.nodeType!==1||!d(g).is(e)))g.nodeType===1&&f.push(g),g=g[c];return f},nth:function(a,b,c,d){b=b||1;var e=0;for(;a;a=a[c])if(a.nodeType===1&&++e===b)break;return a},sibling:function(a,b){var c=[];for(;a;a=a.nextSibling)a.nodeType===1&&a!==b&&c.push(a);return c}});var R=/ jQuery\d+="(?:\d+|null)"/g,S=/^\s+/,T=/<(?!area|br|col|embed|hr|img|input|link|meta|param)(([\w:]+)[^>]*)\/>/ig,U=/<([\w:]+)/,V=/<tbody/i,W=/<|&#?\w+;/,X=/<(?:script|object|embed|option|style)/i,Y=/checked\s*(?:[^=]|=\s*.checked.)/i,Z={option:[1,"<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,"",""]};Z.optgroup=Z.option,Z.tbody=Z.tfoot=Z.colgroup=Z.caption=Z.thead,Z.th=Z.td,d.support.htmlSerialize||(Z._default=[1,"div<div>","</div>"]),d.fn.extend({text:function(a){if(d.isFunction(a))return this.each(function(b){var c=d(this);c.text(a.call(this,b,c.text()))});if(typeof a!=="object"&&a!==b)return this.empty().append((this[0]&&this[0].ownerDocument||c).createTextNode(a));return d.text(this)},wrapAll:function(a){if(d.isFunction(a))return this.each(function(b){d(this).wrapAll(a.call(this,b))});if(this[0]){var b=d(a,this[0].ownerDocument).eq(0).clone(!0);this[0].parentNode&&b.insertBefore(this[0]),b.map(function(){var a=this;while(a.firstChild&&a.firstChild.nodeType===1)a=a.firstChild;return a}).append(this)}return this},wrapInner:function(a){if(d.isFunction(a))return this.each(function(b){d(this).wrapInner(a.call(this,b))});return this.each(function(){var b=d(this),c=b.contents();c.length?c.wrapAll(a):b.append(a)})},wrap:function(a){return this.each(function(){d(this).wrapAll(a)})},unwrap:function(){return this.parent().each(function(){d.nodeName(this,"body")||d(this).replaceWith(this.childNodes)}).end()},append:function(){return this.domManip(arguments,!0,function(a){this.nodeType===1&&this.appendChild(a)})},prepend:function(){return this.domManip(arguments,!0,function(a){this.nodeType===1&&this.insertBefore(a,this.firstChild)})},before:function(){if(this[0]&&this[0].parentNode)return this.domManip(arguments,!1,function(a){this.parentNode.insertBefore(a,this)});if(arguments.length){var a=d(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,!1,function(a){this.parentNode.insertBefore(a,this.nextSibling)});if(arguments.length){var a=this.pushStack(this,"after",arguments);a.push.apply(a,d(arguments[0]).toArray());return a}},remove:function(a,b){for(var c=0,e;(e=this[c])!=null;c++)if(!a||d.filter(a,[e]).length)!b&&e.nodeType===1&&(d.cleanData(e.getElementsByTagName("*")),d.cleanData([e])),e.parentNode&&e.parentNode.removeChild(e);return this},empty:function(){for(var a=0,b;(b=this[a])!=null;a++){b.nodeType===1&&d.cleanData(b.getElementsByTagName("*"));while(b.firstChild)b.removeChild(b.firstChild)}return this},clone:function(a,b){a=a==null?!1:a,b=b==null?a:b;return this.map(function(){return d.clone(this,a,b)})},html:function(a){if(a===b)return this[0]&&this[0].nodeType===1?this[0].innerHTML.replace(R,""):null;if(typeof a!=="string"||X.test(a)||!d.support.leadingWhitespace&&S.test(a)||Z[(U.exec(a)||["",""])[1].toLowerCase()])d.isFunction(a)?this.each(function(b){var c=d(this);c.html(a.call(this,b,c.html()))}):this.empty().append(a);else{a=a.replace(T,"<$1></$2>");try{for(var c=0,e=this.length;c<e;c++)this[c].nodeType===1&&(d.cleanData(this[c].getElementsByTagName("*")),this[c].innerHTML=a)}catch(f){this.empty().append(a)}}return this},replaceWith:function(a){if(this[0]&&this[0].parentNode){if(d.isFunction(a))return this.each(function(b){var c=d(this),e=c.html();c.replaceWith(a.call(this,b,e))});typeof a!=="string"&&(a=d(a).detach());return this.each(function(){var b=this.nextSibling,c=this.parentNode;d(this).remove(),b?d(b).before(a):d(c).append(a)})}return this.length?this.pushStack(d(d.isFunction(a)?a():a),"replaceWith",a):this},detach:function(a){return this.remove(a,!0)},domManip:function(a,c,e){var f,g,h,i,j=a[0],k=[];if(!d.support.checkClone&&arguments.length===3&&typeof j==="string"&&Y.test(j))return this.each(function(){d(this).domManip(a,c,e,!0)});if(d.isFunction(j))return this.each(function(f){var g=d(this);a[0]=j.call(this,f,c?g.html():b),g.domManip(a,c,e)});if(this[0]){i=j&&j.parentNode,d.support.parentNode&&i&&i.nodeType===11&&i.childNodes.length===this.length?f={fragment:i}:f=d.buildFragment(a,this,k),h=f.fragment,h.childNodes.length===1?g=h=h.firstChild:g=h.firstChild;if(g){c=c&&d.nodeName(g,"tr");for(var l=0,m=this.length,n=m-1;l<m;l++)e.call(c?$(this[l],g):this[l],f.cacheable||m>1&&l<n?d.clone(h,!0,!0):h)}k.length&&d.each(k,bc)}return this}}),d.buildFragment=function(a,b,e){var f,g,h,i=b&&b[0]?b[0].ownerDocument||b[0]:c;a.length===1&&typeof a[0]==="string"&&a[0].length<512&&i===c&&a[0].charAt(0)==="<"&&!X.test(a[0])&&(d.support.checkClone||!Y.test(a[0]))&&(g=!0,h=d.fragments[a[0]],h&&(h!==1&&(f=h))),f||(f=i.createDocumentFragment(),d.clean(a,i,f,e)),g&&(d.fragments[a[0]]=h?f:1);return{fragment:f,cacheable:g}},d.fragments={},d.each({appendTo:"append",prependTo:"prepend",insertBefore:"before",insertAfter:"after",replaceAll:"replaceWith"},function(a,b){d.fn[a]=function(c){var e=[],f=d(c),g=this.length===1&&this[0].parentNode;if(g&&g.nodeType===11&&g.childNodes.length===1&&f.length===1){f[b](this[0]);return this}for(var h=0,i=f.length;h<i;h++){var j=(h>0?this.clone(!0):this).get();d(f[h])[b](j),e=e.concat(j)}return this.pushStack(e,a,f.selector)}}),d.extend({clone:function(a,b,c){var e=a.cloneNode(!0),f,g,h;if((!d.support.noCloneEvent||!d.support.noCloneChecked)&&(a.nodeType===1||a.nodeType===11)&&!d.isXMLDoc(a)){ba(a,e),f=bb(a),g=bb(e);for(h=0;f[h];++h)ba(f[h],g[h])}if(b){_(a,e);if(c){f=bb(a),g=bb(e);for(h=0;f[h];++h)_(f[h],g[h])}}return e},clean:function(a,b,e,f){b=b||c,typeof b.createElement==="undefined"&&(b=b.ownerDocument||b[0]&&b[0].ownerDocument||c);var g=[];for(var h=0,i;(i=a[h])!=null;h++){typeof i==="number"&&(i+="");if(!i)continue;if(typeof i!=="string"||W.test(i)){if(typeof i==="string"){i=i.replace(T,"<$1></$2>");var j=(U.exec(i)||["",""])[1].toLowerCase(),k=Z[j]||Z._default,l=k[0],m=b.createElement("div");m.innerHTML=k[1]+i+k[2];while(l--)m=m.lastChild;if(!d.support.tbody){var n=V.test(i),o=j==="table"&&!n?m.firstChild&&m.firstChild.childNodes:k[1]==="<table>"&&!n?m.childNodes:[];for(var p=o.length-1;p>=0;--p)d.nodeName(o[p],"tbody")&&!o[p].childNodes.length&&o[p].parentNode.removeChild(o[p])}!d.support.leadingWhitespace&&S.test(i)&&m.insertBefore(b.createTextNode(S.exec(i)[0]),m.firstChild),i=m.childNodes}}else i=b.createTextNode(i);i.nodeType?g.push(i):g=d.merge(g,i)}if(e)for(h=0;g[h];h++)!f||!d.nodeName(g[h],"script")||g[h].type&&g[h].type.toLowerCase()!=="text/javascript"?(g[h].nodeType===1&&g.splice.apply(g,[h+1,0].concat(d.makeArray(g[h].getElementsByTagName("script")))),e.appendChild(g[h])):f.push(g[h].parentNode?g[h].parentNode.removeChild(g[h]):g[h]);return g},cleanData:function(a){var b,c,e=d.cache,f=d.expando,g=d.event.special,h=d.support.deleteExpando;for(var i=0,j;(j=a[i])!=null;i++){if(j.nodeName&&d.noData[j.nodeName.toLowerCase()])continue;c=j[d.expando];if(c){b=e[c]&&e[c][f];if(b&&b.events){for(var k in b.events)g[k]?d.event.remove(j,k):d.removeEvent(j,k,b.handle);b.handle&&(b.handle.elem=null)}h?delete j[d.expando]:j.removeAttribute&&j.removeAttribute(d.expando),delete e[c]}}}});var bd=/alpha\([^)]*\)/i,be=/opacity=([^)]*)/,bf=/-([a-z])/ig,bg=/([A-Z]|^ms)/g,bh=/^-?\d+(?:px)?$/i,bi=/^-?\d/,bj={position:"absolute",visibility:"hidden",display:"block"},bk=["Left","Right"],bl=["Top","Bottom"],bm,bn,bo,bp=function(a,b){return b.toUpperCase()};d.fn.css=function(a,c){if(arguments.length===2&&c===b)return this;return d.access(this,a,c,!0,function(a,c,e){return e!==b?d.style(a,c,e):d.css(a,c)})},d.extend({cssHooks:{opacity:{get:function(a,b){if(b){var c=bm(a,"opacity","opacity");return c===""?"1":c}return a.style.opacity}}},cssNumber:{zIndex:!0,fontWeight:!0,opacity:!0,zoom:!0,lineHeight:!0},cssProps:{"float":d.support.cssFloat?"cssFloat":"styleFloat"},style:function(a,c,e,f){if(a&&a.nodeType!==3&&a.nodeType!==8&&a.style){var g,h=d.camelCase(c),i=a.style,j=d.cssHooks[h];c=d.cssProps[h]||h;if(e===b){if(j&&"get"in j&&(g=j.get(a,!1,f))!==b)return g;return i[c]}if(typeof e==="number"&&isNaN(e)||e==null)return;typeof e==="number"&&!d.cssNumber[h]&&(e+="px");if(!j||!("set"in j)||(e=j.set(a,e))!==b)try{i[c]=e}catch(k){}}},css:function(a,c,e){var f,g=d.camelCase(c),h=d.cssHooks[g];c=d.cssProps[g]||g;if(h&&"get"in h&&(f=h.get(a,!0,e))!==b)return f;if(bm)return bm(a,c,g)},swap:function(a,b,c){var d={};for(var e in b)d[e]=a.style[e],a.style[e]=b[e];c.call(a);for(e in b)a.style[e]=d[e]},camelCase:function(a){return a.replace(bf,bp)}}),d.curCSS=d.css,d.each(["height","width"],function(a,b){d.cssHooks[b]={get:function(a,c,e){var f;if(c){a.offsetWidth!==0?f=bq(a,b,e):d.swap(a,bj,function(){f=bq(a,b,e)});if(f<=0){f=bm(a,b,b),f==="0px"&&bo&&(f=bo(a,b,b));if(f!=null)return f===""||f==="auto"?"0px":f}if(f<0||f==null){f=a.style[b];return f===""||f==="auto"?"0px":f}return typeof f==="string"?f:f+"px"}},set:function(a,b){if(!bh.test(b))return b;b=parseFloat(b);if(b>=0)return b+"px"}}}),d.support.opacity||(d.cssHooks.opacity={get:function(a,b){return be.test((b&&a.currentStyle?a.currentStyle.filter:a.style.filter)||"")?parseFloat(RegExp.$1)/100+"":b?"1":""},set:function(a,b){var c=a.style;c.zoom=1;var e=d.isNaN(b)?"":"alpha(opacity="+b*100+")",f=c.filter||"";c.filter=bd.test(f)?f.replace(bd,e):c.filter+" "+e}}),d(function(){d.support.reliableMarginRight||(d.cssHooks.marginRight={get:function(a,b){var c;d.swap(a,{display:"inline-block"},function(){b?c=bm(a,"margin-right","marginRight"):c=a.style.marginRight});return c}})}),c.defaultView&&c.defaultView.getComputedStyle&&(bn=function(a,c,e){var f,g,h;e=e.replace(bg,"-$1").toLowerCase();if(!(g=a.ownerDocument.defaultView))return b;if(h=g.getComputedStyle(a,null))f=h.getPropertyValue(e),f===""&&!d.contains(a.ownerDocument.documentElement,a)&&(f=d.style(a,e));return f}),c.documentElement.currentStyle&&(bo=function(a,b){var c,d=a.currentStyle&&a.currentStyle[b],e=a.runtimeStyle&&a.runtimeStyle[b],f=a.style;!bh.test(d)&&bi.test(d)&&(c=f.left,e&&(a.runtimeStyle.left=a.currentStyle.left),f.left=b==="fontSize"?"1em":d||0,d=f.pixelLeft+"px",f.left=c,e&&(a.runtimeStyle.left=e));return d===""?"auto":d}),bm=bn||bo,d.expr&&d.expr.filters&&(d.expr.filters.hidden=function(a){var b=a.offsetWidth,c=a.offsetHeight;return b===0&&c===0||!d.support.reliableHiddenOffsets&&(a.style.display||d.css(a,"display"))==="none"},d.expr.filters.visible=function(a){return!d.expr.filters.hidden(a)});var br=/%20/g,bs=/\[\]$/,bt=/\r?\n/g,bu=/#.*$/,bv=/^(.*?):[ \t]*([^\r\n]*)\r?$/mg,bw=/^(?:color|date|datetime|email|hidden|month|number|password|range|search|tel|text|time|url|week)$/i,bx=/^(?:about|app|app\-storage|.+\-extension|file|widget):$/,by=/^(?:GET|HEAD)$/,bz=/^\/\//,bA=/\?/,bB=/<script\b[^<]*(?:(?!<\/script>)<[^<]*)*<\/script>/gi,bC=/^(?:select|textarea)/i,bD=/\s+/,bE=/([?&])_=[^&]*/,bF=/(^|\-)([a-z])/g,bG=function(a,b,c){return b+c.toUpperCase()},bH=/^([\w\+\.\-]+:)(?:\/\/([^\/?#:]*)(?::(\d+))?)?/,bI=d.fn.load,bJ={},bK={},bL,bM;try{bL=c.location.href}catch(bN){bL=c.createElement("a"),bL.href="",bL=bL.href}bM=bH.exec(bL.toLowerCase())||[],d.fn.extend({load:function(a,c,e){if(typeof a!=="string"&&bI)return bI.apply(this,arguments);if(!this.length)return this;var f=a.indexOf(" ");if(f>=0){var g=a.slice(f,a.length);a=a.slice(0,f)}var h="GET";c&&(d.isFunction(c)?(e=c,c=b):typeof c==="object"&&(c=d.param(c,d.ajaxSettings.traditional),h="POST"));var i=this;d.ajax({url:a,type:h,dataType:"html",data:c,complete:function(a,b,c){c=a.responseText,a.isResolved()&&(a.done(function(a){c=a}),i.html(g?d("<div>").append(c.replace(bB,"")).find(g):c)),e&&i.each(e,[c,b,a])}});return this},serialize:function(){return d.param(this.serializeArray())},serializeArray:function(){return this.map(function(){return this.elements?d.makeArray(this.elements):this}).filter(function(){return this.name&&!this.disabled&&(this.checked||bC.test(this.nodeName)||bw.test(this.type))}).map(function(a,b){var c=d(this).val();return c==null?null:d.isArray(c)?d.map(c,function(a,c){return{name:b.name,value:a.replace(bt,"\r\n")}}):{name:b.name,value:c.replace(bt,"\r\n")}}).get()}}),d.each("ajaxStart ajaxStop ajaxComplete ajaxError ajaxSuccess ajaxSend".split(" "),function(a,b){d.fn[b]=function(a){return this.bind(b,a)}}),d.each(["get","post"],function(a,c){d[c]=function(a,e,f,g){d.isFunction(e)&&(g=g||f,f=e,e=b);return d.ajax({type:c,url:a,data:e,success:f,dataType:g})}}),d.extend({getScript:function(a,c){return d.get(a,b,c,"script")},getJSON:function(a,b,c){return d.get(a,b,c,"json")},ajaxSetup:function(a,b){b?d.extend(!0,a,d.ajaxSettings,b):(b=a,a=d.extend(!0,d.ajaxSettings,b));for(var c in {context:1,url:1})c in b?a[c]=b[c]:c in d.ajaxSettings&&(a[c]=d.ajaxSettings[c]);return a},ajaxSettings:{url:bL,isLocal:bx.test(bM[1]),global:!0,type:"GET",contentType:"application/x-www-form-urlencoded",processData:!0,async:!0,accepts:{xml:"application/xml, text/xml",html:"text/html",text:"text/plain",json:"application/json, text/javascript","*":"*/*"},contents:{xml:/xml/,html:/html/,json:/json/},responseFields:{xml:"responseXML",text:"responseText"},converters:{"* text":a.String,"text html":!0,"text json":d.parseJSON,"text xml":d.parseXML}},ajaxPrefilter:bO(bJ),ajaxTransport:bO(bK),ajax:function(a,c){function v(a,c,l,n){if(r!==2){r=2,p&&clearTimeout(p),o=b,m=n||"",u.readyState=a?4:0;var q,t,v,w=l?bR(e,u,l):b,x,y;if(a>=200&&a<300||a===304){if(e.ifModified){if(x=u.getResponseHeader("Last-Modified"))d.lastModified[k]=x;if(y=u.getResponseHeader("Etag"))d.etag[k]=y}if(a===304)c="notmodified",q=!0;else try{t=bS(e,w),c="success",q=!0}catch(z){c="parsererror",v=z}}else{v=c;if(!c||a)c="error",a<0&&(a=0)}u.status=a,u.statusText=c,q?h.resolveWith(f,[t,c,u]):h.rejectWith(f,[u,c,v]),u.statusCode(j),j=b,s&&g.trigger("ajax"+(q?"Success":"Error"),[u,e,q?t:v]),i.resolveWith(f,[u,c]),s&&(g.trigger("ajaxComplete",[u,e]),--d.active||d.event.trigger("ajaxStop"))}}typeof a==="object"&&(c=a,a=b),c=c||{};var e=d.ajaxSetup({},c),f=e.context||e,g=f!==e&&(f.nodeType||f instanceof d)?d(f):d.event,h=d.Deferred(),i=d._Deferred(),j=e.statusCode||{},k,l={},m,n,o,p,q,r=0,s,t,u={readyState:0,setRequestHeader:function(a,b){r||(l[a.toLowerCase().replace(bF,bG)]=b);return this},getAllResponseHeaders:function(){return r===2?m:null},getResponseHeader:function(a){var c;if(r===2){if(!n){n={};while(c=bv.exec(m))n[c[1].toLowerCase()]=c[2]}c=n[a.toLowerCase()]}return c===b?null:c},overrideMimeType:function(a){r||(e.mimeType=a);return this},abort:function(a){a=a||"abort",o&&o.abort(a),v(0,a);return this}};h.promise(u),u.success=u.done,u.error=u.fail,u.complete=i.done,u.statusCode=function(a){if(a){var b;if(r<2)for(b in a)j[b]=[j[b],a[b]];else b=a[u.status],u.then(b,b)}return this},e.url=((a||e.url)+"").replace(bu,"").replace(bz,bM[1]+"//"),e.dataTypes=d.trim(e.dataType||"*").toLowerCase().split(bD),e.crossDomain==null&&(q=bH.exec(e.url.toLowerCase()),e.crossDomain=q&&(q[1]!=bM[1]||q[2]!=bM[2]||(q[3]||(q[1]==="http:"?80:443))!=(bM[3]||(bM[1]==="http:"?80:443)))),e.data&&e.processData&&typeof e.data!=="string"&&(e.data=d.param(e.data,e.traditional)),bP(bJ,e,c,u);if(r===2)return!1;s=e.global,e.type=e.type.toUpperCase(),e.hasContent=!by.test(e.type),s&&d.active++===0&&d.event.trigger("ajaxStart");if(!e.hasContent){e.data&&(e.url+=(bA.test(e.url)?"&":"?")+e.data),k=e.url;if(e.cache===!1){var w=d.now(),x=e.url.replace(bE,"$1_="+w);e.url=x+(x===e.url?(bA.test(e.url)?"&":"?")+"_="+w:"")}}if(e.data&&e.hasContent&&e.contentType!==!1||c.contentType)l["Content-Type"]=e.contentType;e.ifModified&&(k=k||e.url,d.lastModified[k]&&(l["If-Modified-Since"]=d.lastModified[k]),d.etag[k]&&(l["If-None-Match"]=d.etag[k])),l.Accept=e.dataTypes[0]&&e.accepts[e.dataTypes[0]]?e.accepts[e.dataTypes[0]]+(e.dataTypes[0]!=="*"?", */*; q=0.01":""):e.accepts["*"];for(t in e.headers)u.setRequestHeader(t,e.headers[t]);if(e.beforeSend&&(e.beforeSend.call(f,u,e)===!1||r===2)){u.abort();return!1}for(t in {success:1,error:1,complete:1})u[t](e[t]);o=bP(bK,e,c,u);if(o){u.readyState=1,s&&g.trigger("ajaxSend",[u,e]),e.async&&e.timeout>0&&(p=setTimeout(function(){u.abort("timeout")},e.timeout));try{r=1,o.send(l,v)}catch(y){status<2?v(-1,y):d.error(y)}}else v(-1,"No Transport");return u},param:function(a,c){var e=[],f=function(a,b){b=d.isFunction(b)?b():b,e[e.length]=encodeURIComponent(a)+"="+encodeURIComponent(b)};c===b&&(c=d.ajaxSettings.traditional);if(d.isArray(a)||a.jquery&&!d.isPlainObject(a))d.each(a,function(){f(this.name,this.value)});else for(var g in a)bQ(g,a[g],c,f);return e.join("&").replace(br,"+")}}),d.extend({active:0,lastModified:{},etag:{}});var bT=d.now(),bU=/(\=)\?(&|$)|\?\?/i;d.ajaxSetup({jsonp:"callback",jsonpCallback:function(){return d.expando+"_"+bT++}}),d.ajaxPrefilter("json jsonp",function(b,c,e){var f=typeof b.data==="string";if(b.dataTypes[0]==="jsonp"||c.jsonpCallback||c.jsonp!=null||b.jsonp!==!1&&(bU.test(b.url)||f&&bU.test(b.data))){var g,h=b.jsonpCallback=d.isFunction(b.jsonpCallback)?b.jsonpCallback():b.jsonpCallback,i=a[h],j=b.url,k=b.data,l="$1"+h+"$2",m=function(){a[h]=i,g&&d.isFunction(i)&&a[h](g[0])};b.jsonp!==!1&&(j=j.replace(bU,l),b.url===j&&(f&&(k=k.replace(bU,l)),b.data===k&&(j+=(/\?/.test(j)?"&":"?")+b.jsonp+"="+h))),b.url=j,b.data=k,a[h]=function(a){g=[a]},e.then(m,m),b.converters["script json"]=function(){g||d.error(h+" was not called");return g[0]},b.dataTypes[0]="json";return"script"}}),d.ajaxSetup({accepts:{script:"text/javascript, application/javascript, application/ecmascript, application/x-ecmascript"},contents:{script:/javascript|ecmascript/},converters:{"text script":function(a){d.globalEval(a);return a}}}),d.ajaxPrefilter("script",function(a){a.cache===b&&(a.cache=!1),a.crossDomain&&(a.type="GET",a.global=!1)}),d.ajaxTransport("script",function(a){if(a.crossDomain){var d,e=c.head||c.getElementsByTagName("head")[0]||c.documentElement;return{send:function(f,g){d=c.createElement("script"),d.async="async",a.scriptCharset&&(d.charset=a.scriptCharset),d.src=a.url,d.onload=d.onreadystatechange=function(a,c){if(!d.readyState||/loaded|complete/.test(d.readyState))d.onload=d.onreadystatechange=null,e&&d.parentNode&&e.removeChild(d),d=b,c||g(200,"success")},e.insertBefore(d,e.firstChild)},abort:function(){d&&d.onload(0,1)}}}});var bV=d.now(),bW,bX;d.ajaxSettings.xhr=a.ActiveXObject?function(){return!this.isLocal&&bZ()||b$()}:bZ,bX=d.ajaxSettings.xhr(),d.support.ajax=!!bX,d.support.cors=bX&&"withCredentials"in bX,bX=b,d.support.ajax&&d.ajaxTransport(function(a){if(!a.crossDomain||d.support.cors){var c;return{send:function(e,f){var g=a.xhr(),h,i;a.username?g.open(a.type,a.url,a.async,a.username,a.password):g.open(a.type,a.url,a.async);if(a.xhrFields)for(i in a.xhrFields)g[i]=a.xhrFields[i];a.mimeType&&g.overrideMimeType&&g.overrideMimeType(a.mimeType),!a.crossDomain&&!e["X-Requested-With"]&&(e["X-Requested-With"]="XMLHttpRequest");try{for(i in e)g.setRequestHeader(i,e[i])}catch(j){}g.send(a.hasContent&&a.data||null),c=function(e,i){var j,k,l,m,n;try{if(c&&(i||g.readyState===4)){c=b,h&&(g.onreadystatechange=d.noop,delete bW[h]);if(i)g.readyState!==4&&g.abort();else{j=g.status,l=g.getAllResponseHeaders(),m={},n=g.responseXML,n&&n.documentElement&&(m.xml=n),m.text=g.responseText;try{k=g.statusText}catch(o){k=""}j||!a.isLocal||a.crossDomain?j===1223&&(j=204):j=m.text?200:404}}}catch(p){i||f(-1,p)}m&&f(j,k,m,l)},a.async&&g.readyState!==4?(bW||(bW={},bY()),h=bV++,g.onreadystatechange=bW[h]=c):c()},abort:function(){c&&c(0,1)}}}});var b_={},ca=/^(?:toggle|show|hide)$/,cb=/^([+\-]=)?([\d+.\-]+)([a-z%]*)$/i,cc,cd=[["height","marginTop","marginBottom","paddingTop","paddingBottom"],["width","marginLeft","marginRight","paddingLeft","paddingRight"],["opacity"]];d.fn.extend({show:function(a,b,c){var e,f;if(a||a===0)return this.animate(ce("show",3),a,b,c);for(var g=0,h=this.length;g<h;g++)e=this[g],f=e.style.display,!d._data(e,"olddisplay")&&f==="none"&&(f=e.style.display=""),f===""&&d.css(e,"display")==="none"&&d._data(e,"olddisplay",cf(e.nodeName));for(g=0;g<h;g++){e=this[g],f=e.style.display;if(f===""||f==="none")e.style.display=d._data(e,"olddisplay")||""}return this},hide:function(a,b,c){if(a||a===0)return this.animate(ce("hide",3),a,b,c);for(var e=0,f=this.length;e<f;e++){var g=d.css(this[e],"display");g!=="none"&&!d._data(this[e],"olddisplay")&&d._data(this[e],"olddisplay",g)}for(e=0;e<f;e++)this[e].style.display="none";return this},_toggle:d.fn.toggle,toggle:function(a,b,c){var e=typeof a==="boolean";d.isFunction(a)&&d.isFunction(b)?this._toggle.apply(this,arguments):a==null||e?this.each(function(){var b=e?a:d(this).is(":hidden");d(this)[b?"show":"hide"]()}):this.animate(ce("toggle",3),a,b,c);return this},fadeTo:function(a,b,c,d){return this.filter(":hidden").css("opacity",0).show().end().animate({opacity:b},a,c,d)},animate:function(a,b,c,e){var f=d.speed(b,c,e);if(d.isEmptyObject(a))return this.each(f.complete);return this[f.queue===!1?"each":"queue"](function(){var b=d.extend({},f),c,e=this.nodeType===1,g=e&&d(this).is(":hidden"),h=this;for(c in a){var i=d.camelCase(c);c!==i&&(a[i]=a[c],delete a[c],c=i);if(a[c]==="hide"&&g||a[c]==="show"&&!g)return b.complete.call(this);if(e&&(c==="height"||c==="width")){b.overflow=[this.style.overflow,this.style.overflowX,this.style.overflowY];if(d.css(this,"display")==="inline"&&d.css(this,"float")==="none")if(d.support.inlineBlockNeedsLayout){var j=cf(this.nodeName);j==="inline"?this.style.display="inline-block":(this.style.display="inline",this.style.zoom=1)}else this.style.display="inline-block"}d.isArray(a[c])&&((b.specialEasing=b.specialEasing||{})[c]=a[c][1],a[c]=a[c][0])}b.overflow!=null&&(this.style.overflow="hidden"),b.curAnim=d.extend({},a),d.each(a,function(c,e){var f=new d.fx(h,b,c);if(ca.test(e))f[e==="toggle"?g?"show":"hide":e](a);else{var i=cb.exec(e),j=f.cur();if(i){var k=parseFloat(i[2]),l=i[3]||(d.cssNumber[c]?"":"px");l!=="px"&&(d.style(h,c,(k||1)+l),j=(k||1)/f.cur()*j,d.style(h,c,j+l)),i[1]&&(k=(i[1]==="-="?-1:1)*k+j),f.custom(j,k,l)}else f.custom(j,e,"")}});return!0})},stop:function(a,b){var c=d.timers;a&&this.queue([]),this.each(function(){for(var a=c.length-1;a>=0;a--)c[a].elem===this&&(b&&c[a](!0),c.splice(a,1))}),b||this.dequeue();return this}}),d.each({slideDown:ce("show",1),slideUp:ce("hide",1),slideToggle:ce("toggle",1),fadeIn:{opacity:"show"},fadeOut:{opacity:"hide"},fadeToggle:{opacity:"toggle"}},function(a,b){d.fn[a]=function(a,c,d){return this.animate(b,a,c,d)}}),d.extend({speed:function(a,b,c){var e=a&&typeof a==="object"?d.extend({},a):{complete:c||!c&&b||d.isFunction(a)&&a,duration:a,easing:c&&b||b&&!d.isFunction(b)&&b};e.duration=d.fx.off?0:typeof e.duration==="number"?e.duration:e.duration in d.fx.speeds?d.fx.speeds[e.duration]:d.fx.speeds._default,e.old=e.complete,e.complete=function(){e.queue!==!1&&d(this).dequeue(),d.isFunction(e.old)&&e.old.call(this)};return e},easing:{linear:function(a,b,c,d){return c+d*a},swing:function(a,b,c,d){return(-Math.cos(a*Math.PI)/2+.5)*d+c}},timers:[],fx:function(a,b,c){this.options=b,this.elem=a,this.prop=c,b.orig||(b.orig={})}}),d.fx.prototype={update:function(){this.options.step&&this.options.step.call(this.elem,this.now,this),(d.fx.step[this.prop]||d.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,b=d.css(this.elem,this.prop);return isNaN(a=parseFloat(b))?!b||b==="auto"?0:b:a},custom:function(a,b,c){function g(a){return e.step(a)}var e=this,f=d.fx;this.startTime=d.now(),this.start=a,this.end=b,this.unit=c||this.unit||(d.cssNumber[this.prop]?"":"px"),this.now=this.start,this.pos=this.state=0,g.elem=this.elem,g()&&d.timers.push(g)&&!cc&&(cc=setInterval(f.tick,f.interval))},show:function(){this.options.orig[this.prop]=d.style(this.elem,this.prop),this.options.show=!0,this.custom(this.prop==="width"||this.prop==="height"?1:0,this.cur()),d(this.elem).show()},hide:function(){this.options.orig[this.prop]=d.style(this.elem,this.prop),this.options.hide=!0,this.custom(this.cur(),0)},step:function(a){var b=d.now(),c=!0;if(a||b>=this.options.duration+this.startTime){this.now=this.end,this.pos=this.state=1,this.update(),this.options.curAnim[this.prop]=!0;for(var e in this.options.curAnim)this.options.curAnim[e]!==!0&&(c=!1);if(c){if(this.options.overflow!=null&&!d.support.shrinkWrapBlocks){var f=this.elem,g=this.options;d.each(["","X","Y"],function(a,b){f.style["overflow"+b]=g.overflow[a]})}this.options.hide&&d(this.elem).hide();if(this.options.hide||this.options.show)for(var h in this.options.curAnim)d.style(this.elem,h,this.options.orig[h]);this.options.complete.call(this.elem)}return!1}var i=b-this.startTime;this.state=i/this.options.duration;var j=this.options.specialEasing&&this.options.specialEasing[this.prop],k=this.options.easing||(d.easing.swing?"swing":"linear");this.pos=d.easing[j||k](this.state,i,0,1,this.options.duration),this.now=this.start+(this.end-this.start)*this.pos,this.update();return!0}},d.extend(d.fx,{tick:function(){var a=d.timers;for(var b=0;b<a.length;b++)a[b]()||a.splice(b--,1);a.length||d.fx.stop()},interval:13,stop:function(){clearInterval(cc),cc=null},speeds:{slow:600,fast:200,_default:400},step:{opacity:function(a){d.style(a.elem,"opacity",a.now)},_default:function(a){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:a.elem[a.prop]=a.now}}}),d.expr&&d.expr.filters&&(d.expr.filters.animated=function(a){return d.grep(d.timers,function(b){return a===b.elem}).length});var cg=/^t(?:able|d|h)$/i,ch=/^(?:body|html)$/i;"getBoundingClientRect"in c.documentElement?d.fn.offset=function(a){var b=this[0],c;if(a)return this.each(function(b){d.offset.setOffset(this,a,b)});if(!b||!b.ownerDocument)return null;if(b===b.ownerDocument.body)return d.offset.bodyOffset(b);try{c=b.getBoundingClientRect()}catch(e){}var f=b.ownerDocument,g=f.documentElement;if(!c||!d.contains(g,b))return c?{top:c.top,left:c.left}:{top:0,left:0};var h=f.body,i=ci(f),j=g.clientTop||h.clientTop||0,k=g.clientLeft||h.clientLeft||0,l=i.pageYOffset||d.support.boxModel&&g.scrollTop||h.scrollTop,m=i.pageXOffset||d.support.boxModel&&g.scrollLeft||h.scrollLeft,n=c.top+l-j,o=c.left+m-k;return{top:n,left:o}}:d.fn.offset=function(a){var b=this[0];if(a)return this.each(function(b){d.offset.setOffset(this,a,b)});if(!b||!b.ownerDocument)return null;if(b===b.ownerDocument.body)return d.offset.bodyOffset(b);d.offset.initialize();var c,e=b.offsetParent,f=b,g=b.ownerDocument,h=g.documentElement,i=g.body,j=g.defaultView,k=j?j.getComputedStyle(b,null):b.currentStyle,l=b.offsetTop,m=b.offsetLeft;while((b=b.parentNode)&&b!==i&&b!==h){if(d.offset.supportsFixedPosition&&k.position==="fixed")break;c=j?j.getComputedStyle(b,null):b.currentStyle,l-=b.scrollTop,m-=b.scrollLeft,b===e&&(l+=b.offsetTop,m+=b.offsetLeft,d.offset.doesNotAddBorder&&(!d.offset.doesAddBorderForTableAndCells||!cg.test(b.nodeName))&&(l+=parseFloat(c.borderTopWidth)||0,m+=parseFloat(c.borderLeftWidth)||0),f=e,e=b.offsetParent),d.offset.subtractsBorderForOverflowNotVisible&&c.overflow!=="visible"&&(l+=parseFloat(c.borderTopWidth)||0,m+=parseFloat(c.borderLeftWidth)||0),k=c}if(k.position==="relative"||k.position==="static")l+=i.offsetTop,m+=i.offsetLeft;d.offset.supportsFixedPosition&&k.position==="fixed"&&(l+=Math.max(h.scrollTop,i.scrollTop),m+=Math.max(h.scrollLeft,i.scrollLeft));return{top:l,left:m}},d.offset={initialize:function(){var a=c.body,b=c.createElement("div"),e,f,g,h,i=parseFloat(d.css(a,"marginTop"))||0,j="<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>";d.extend(b.style,{position:"absolute",top:0,left:0,margin:0,border:0,width:"1px",height:"1px",visibility:"hidden"}),b.innerHTML=j,a.insertBefore(b,a.firstChild),e=b.firstChild,f=e.firstChild,h=e.nextSibling.firstChild.firstChild,this.doesNotAddBorder=f.offsetTop!==5,this.doesAddBorderForTableAndCells=h.offsetTop===5,f.style.position="fixed",f.style.top="20px",this.supportsFixedPosition=f.offsetTop===20||f.offsetTop===15,f.style.position=f.style.top="",e.style.overflow="hidden",e.style.position="relative",this.subtractsBorderForOverflowNotVisible=f.offsetTop===-5,this.doesNotIncludeMarginInBodyOffset=a.offsetTop!==i,a.removeChild(b),d.offset.initialize=d.noop},bodyOffset:function(a){var b=a.offsetTop,c=a.offsetLeft;d.offset.initialize(),d.offset.doesNotIncludeMarginInBodyOffset&&(b+=parseFloat(d.css(a,"marginTop"))||0,c+=parseFloat(d.css(a,"marginLeft"))||0);return{top:b,left:c}},setOffset:function(a,b,c){var e=d.css(a,"position");e==="static"&&(a.style.position="relative");var f=d(a),g=f.offset(),h=d.css(a,"top"),i=d.css(a,"left"),j=(e==="absolute"||e==="fixed")&&d.inArray("auto",[h,i])>-1,k={},l={},m,n;j&&(l=f.position()),m=j?l.top:parseInt(h,10)||0,n=j?l.left:parseInt(i,10)||0,d.isFunction(b)&&(b=b.call(a,c,g)),b.top!=null&&(k.top=b.top-g.top+m),b.left!=null&&(k.left=b.left-g.left+n),"using"in b?b.using.call(a,k):f.css(k)}},d.fn.extend({position:function(){if(!this[0])return null;var a=this[0],b=this.offsetParent(),c=this.offset(),e=ch.test(b[0].nodeName)?{top:0,left:0}:b.offset();c.top-=parseFloat(d.css(a,"marginTop"))||0,c.left-=parseFloat(d.css(a,"marginLeft"))||0,e.top+=parseFloat(d.css(b[0],"borderTopWidth"))||0,e.left+=parseFloat(d.css(b[0],"borderLeftWidth"))||0;return{top:c.top-e.top,left:c.left-e.left}},offsetParent:function(){return this.map(function(){var a=this.offsetParent||c.body;while(a&&(!ch.test(a.nodeName)&&d.css(a,"position")==="static"))a=a.offsetParent;return a})}}),d.each(["Left","Top"],function(a,c){var e="scroll"+c;d.fn[e]=function(c){var f=this[0],g;if(!f)return null;if(c!==b)return this.each(function(){g=ci(this),g?g.scrollTo(a?d(g).scrollLeft():c,a?c:d(g).scrollTop()):this[e]=c});g=ci(f);return g?"pageXOffset"in g?g[a?"pageYOffset":"pageXOffset"]:d.support.boxModel&&g.document.documentElement[e]||g.document.body[e]:f[e]}}),d.each(["Height","Width"],function(a,c){var e=c.toLowerCase();d.fn["inner"+c]=function(){return this[0]?parseFloat(d.css(this[0],e,"padding")):null},d.fn["outer"+c]=function(a){return this[0]?parseFloat(d.css(this[0],e,a?"margin":"border")):null},d.fn[e]=function(a){var f=this[0];if(!f)return a==null?null:this;if(d.isFunction(a))return this.each(function(b){var c=d(this);c[e](a.call(this,b,c[e]()))});if(d.isWindow(f)){var g=f.document.documentElement["client"+c];return f.document.compatMode==="CSS1Compat"&&g||f.document.body["client"+c]||g}if(f.nodeType===9)return Math.max(f.documentElement["client"+c],f.body["scroll"+c],f.documentElement["scroll"+c],f.body["offset"+c],f.documentElement["offset"+c]);if(a===b){var h=d.css(f,e),i=parseFloat(h);return d.isNaN(i)?h:i}return this.css(e,typeof a==="string"?a:a+"px")}}),a.jQuery=a.$=d})(window); 
  • trunk/plugins/jquery/jquery.simple.tree.js

    r10689 r15201  
     1// TODO: check if it is really need, and update to the latest version at least  (also it is used in Ads only) 
    12/* 
    23* jQuery SimpleTree Drag&Drop plugin 
  • trunk/plugins/jquery/jquery.tablesorter.js

    r8988 r15201  
    1 /* 
    2  * 
    3  * TableSorter - Client-side table sorting with ease! 
    4  * 
    5  * Copyright (c) 2006 Christian Bach (http://motherrussia.polyester.se) 
    6  * Dual licensed under the MIT (http://www.opensource.org/licenses/mit-license.php) 
    7  * and GPL (http://www.opensource.org/licenses/gpl-license.php) licenses. 
    8  * 
    9  * jQueryDate:  
    10  * jQueryAuthor: Christian jQuery 
    11  * 
    12  */ 
    13 (function($) { 
    141 
    15     $.fn.tableSorter = function(o) { 
    16      
    17         var defaults =  { 
    18             sortDir: 0, 
    19             sortColumn: null, 
    20             sortClassAsc: 'ascending', 
    21             sortClassDesc: 'descending', 
    22             headerClass: null, 
    23             stripingRowClass: false, 
    24             highlightClass: false, 
    25             rowLimit: 0, 
    26             minRowsForWaitingMsg: 0, 
    27             disableHeader: -1, 
    28             stripeRowsOnStartUp: false, 
    29             columnParser: false, 
    30             rowHighlightClass: false, 
    31             useCache: true, 
    32             debug: false, 
    33             textExtraction: 'simple', 
    34             textExtractionCustom: false, 
    35             textExtractionType: false, 
    36             bind: true, 
    37             addHeaderLink: false, 
    38             lockedSortDir: false, 
    39             enableResize: false, 
    40             dateFormat: 'mm/dd/yyyy' /** us default, uk dd/mm/yyyy */ 
    41         }; 
    42       
    43         return this.each(function(){ 
    44              
    45             /** merge default with custom options */ 
    46             $.extend(defaults, o); 
    47      
    48             /** Private vars */ 
    49             var COLUMN_DATA;            /** array for storing columns */ 
    50             var COLUMN_CACHE;           /** array for storing sort caches.*/ 
    51             var COLUMN_INDEX;               /** int for storing current cell index */ 
    52             var COLUMN_SORTER_CACHE = [];   /** array for sorter parser cache */ 
    53             var COLUMN_CELL;                /** stores the current cell object */ 
    54             var COLUMN_DIR;                 /** stores the current soring direction */ 
    55             var COLUMN_HEADER_LENGTH;       /** stores the columns header length */ 
    56             var COLUMN_ROW_LENGTH; 
    57             var ROW_LAST_HIGHLIGHT_OBJ = false; 
    58             var COLUMN_LAST_INDEX = -1; 
    59             var COLUMN_LAST_DIR = defaults.sortDir; 
    60              
    61             /** table object holder.*/ 
    62             var oTable = this; 
    63      
    64             if(defaults.stripeRowsOnStartUp && defaults.stripingRowClass) { 
    65                 $.tableSorter.utils.stripeRows(defaults,oTable); 
    66             } 
    67              
    68             /** bind events to the tablesorter element */ 
    69             $(this).bind("resort",doSorting); 
    70              
    71             $(this).bind("flushCache",function(event) { 
    72                 COLUMN_CACHE = []; 
    73             }); 
    74              
    75             $(this).bind("updateColumnData",buildColumnDataIndex); 
    76              
    77             /** Store length of table rows. */ 
    78             var tableRowLength = (oTable.tBodies[0] && oTable.tBodies[0].rows.length-1) || 0; 
    79      
    80             /** Index column data. */ 
    81             buildColumnDataIndex(); 
    82              
    83             /** when done, build headers. */ 
    84             buildColumnHeaders(); 
    85      
    86             function buildColumnHeaders() { 
    87                 var oFirstTableRow = oTable.rows[0]; 
    88                 var oDataSampleRow = oTable.rows[1]; 
    89                 /** store column length */ 
    90                 COLUMN_HEADER_LENGTH = oFirstTableRow.cells.length; 
    91                 /** loop column headers */ 
    92                 for( var i=0; i < COLUMN_HEADER_LENGTH; i++ ) { 
    93                     var oCell = oFirstTableRow.cells[i]; 
    94      
    95                     if(oDataSampleRow && !$.tableSorter.utils.isHeaderDisabled(defaults,oCell,defaults.disableHeader,i)) { 
    96                         /** get current cell from columns headers */ 
    97                         var oCellValue = $.tableSorter.utils.getElementText(defaults,oDataSampleRow.cells[i],'columns',i); 
    98                         /** check for default column. */ 
    99                         if(typeof(defaults.sortColumn) == "string") { 
    100                             if(defaults.sortColumn.toLowerCase() == $.tableSorter.utils.getElementText(defaults,oCell,'header',i).toLowerCase()) { 
    101                                 defaults.sortColumn = i; 
    102                             } 
    103                         } 
    104      
    105                         /** get sorting method for column. */ 
    106                         COLUMN_SORTER_CACHE[i] = $.tableSorter.analyzer.analyseString(defaults,oCellValue); 
    107                          
    108                         /** if we have a column parser, set it manual. */ 
    109                         if(defaults.columnParser) { 
    110                             var a = defaults.columnParser; 
    111                             var l = a.length; 
    112                             for(var j=0; j < l; j++) { 
    113                                 if(i == a[j][0]) { 
    114                                     COLUMN_SORTER_CACHE[i] = $.tableSorter.analyzer.getById(a[j][1]); 
    115                                     continue; 
    116                                 } 
    117                             } 
    118                         } 
    119      
    120                         if(defaults.headerClass) { 
    121                             $(oCell).addClass(defaults.headerClass); 
    122                         } 
    123                         if(defaults.addHeaderLink) { 
    124                             $(oCell).wrapInner({element: '<a href="#">', name: 'a', className: 'sorter'}); 
    125      
    126                             $(".sorter",oCell).click(function(e) { 
    127                                 sortOnColumn( $(this).parent(), ((defaults.lockedSortDir) ? defaults.lockedSortDir : $(this).parent()[0].count++) % 2, $(this).parent()[0].index ); 
    128                                 return false; 
    129                             }); 
    130                         } else { 
    131                             $(oCell).click(function(e) { 
    132                                 sortOnColumn( $(this), ((defaults.lockedSortDir) ? defaults.lockedSortDir : $(this)[0].count++) % 2, $(this)[0].index ); 
    133                                 return false; 
    134                             }); 
    135                         } 
    136                         oCell.index = i; 
    137                         oCell.count = 0; 
    138                     } 
    139                 } 
    140                 /** comming feature. */ 
    141                 if(defaults.enableResize) { 
    142                     addColGroup(oFirstTableRow); 
    143                 } 
    144                 /** if we have a init sorting, fire it! */ 
    145                 if(defaults.sortColumn != null) { 
    146                     $(oFirstTableRow.cells[defaults.sortColumn]).trigger("click"); 
    147                 } 
    148      
    149                 if(defaults.rowHighlightClass) { 
    150                     $("> tbody:first/tr",oTable).click(function() { 
    151                         if(ROW_LAST_HIGHLIGHT_OBJ) { 
    152                             ROW_LAST_HIGHLIGHT_OBJ.removeClass(defaults.rowHighlightClass); 
    153                         } 
    154                         ROW_LAST_HIGHLIGHT_OBJ = $(this).addClass(defaults.rowHighlightClass); 
    155                     }); 
    156                 } 
    157             } 
    158             /** break out and put i $.tableSorter? */ 
    159             function buildColumnDataIndex() { 
    160                 /** make colum data. */ 
    161                 COLUMN_DATA = []; 
    162                 COLUMN_CACHE = []; 
    163                 COLUMN_ROW_LENGTH = (oTable.tBodies[0] && oTable.tBodies[0].rows.length) || 0; 
    164                 var l = COLUMN_ROW_LENGTH; 
    165                 for (var i=0;i < l; i++) { 
    166                     /** Add the table data to main data array */ 
    167                     COLUMN_DATA.push(oTable.tBodies[0].rows[i]); 
    168                 } 
    169             } 
    170                  
    171             function addColGroup(columnsHeader) { 
    172                 var oSampleTableRow = oTable.rows[1]; 
    173                 /** adjust header to the sample rows */ 
    174                 for(var i=0; i < COLUMN_HEADER_LENGTH; i++) { 
    175                     if(oSampleTableRow && oSampleTableRow.cells[i]) 
    176                         $(columnsHeader.cells[i]).css("width",oSampleTableRow.cells[i].clientWidth + "px"); 
    177                 } 
    178             } 
    179              
    180             function sortOnColumn(oCell,dir,index) { 
    181                 /** trigger event sort start. */ 
    182                 if(tableRowLength > defaults.minRowsForWaitingMsg) { 
    183                     $(oTable).trigger( "sortStart"); 
    184                 } 
    185                 /** define globals for current sorting. */ 
    186                 COLUMN_INDEX = index; 
    187                 COLUMN_CELL = oCell; 
    188                 COLUMN_DIR = dir; 
    189                 /** clear all classes, need to be optimized. */ 
    190                 $("thead th",oTable).removeClass(defaults.sortClassAsc).removeClass(defaults.sortClassDesc); 
    191                 /**add active class and append image. */ 
    192                 $(COLUMN_CELL).addClass((dir % 2 ? defaults.sortClassAsc : defaults.sortClassDesc)); 
    193                 /** if this is fired, with a straight call, sortStart / Stop would never be fired. */ 
    194                 setTimeout(doSorting,0); 
    195             } 
    196              
    197             function doSorting() { 
    198                 /** added check to see if COLUMN_INDEX is set */ 
    199                 if(COLUMN_INDEX >= 0) { 
    200                     /** array for storing sorted data. */ 
    201                     var columns; 
    202                     /** sorting exist in cache, get it. */ 
    203                     if($.tableSorter.cache.exist(COLUMN_CACHE,COLUMN_INDEX) && defaults.useCache) { 
    204                         /** get from cache */ 
    205                         var cache = $.tableSorter.cache.get(COLUMN_CACHE,COLUMN_INDEX); 
    206                         /** figure out the way to sort. */ 
    207                         if(cache.dir == COLUMN_DIR) { 
    208                             columns = cache.data; 
    209                             cache.dir = COLUMN_DIR; 
    210                         } else { 
    211                             columns = cache.data.reverse(); 
    212                             cache.dir = COLUMN_DIR; 
    213                         } 
    214                     /** sort and cache */ 
    215                     } else { 
    216                         /** return flat data, and then sort it. */ 
    217                         var flatData = $.tableSorter.data.flatten(defaults,COLUMN_DATA,COLUMN_SORTER_CACHE,COLUMN_INDEX); 
    218                         /** do sorting, only onces per column. */ 
    219                         flatData.sort(COLUMN_SORTER_CACHE[COLUMN_INDEX].sorter); 
    220                         /** if we have a sortDir, reverse the damn thing. */ 
    221                         if(COLUMN_LAST_DIR != COLUMN_DIR) { 
    222                             flatData.reverse(); 
    223                         } 
    224                         /** rebuild data from flat. */ 
    225                         columns = $.tableSorter.data.rebuild(COLUMN_DATA,flatData,COLUMN_INDEX,COLUMN_LAST_INDEX); 
    226                         /** append to table cache. */ 
    227                         $.tableSorter.cache.add(COLUMN_CACHE,COLUMN_INDEX,COLUMN_DIR,columns); 
    228                         /** good practise */ 
    229                         flatData = null; 
    230                     } 
    231                     /** append to table > tbody */ 
    232                     $.tableSorter.utils.appendToTable(defaults,oTable,columns,COLUMN_INDEX,COLUMN_LAST_INDEX); 
    233                     /** good practise i guess */ 
    234                     columns = null; 
    235                     /** trigger stop event. */ 
    236                     if(tableRowLength > defaults.minRowsForWaitingMsg) { 
    237                         $(oTable).trigger("sortStop",[COLUMN_INDEX]); 
    238                     } 
    239                     COLUMN_LAST_INDEX = COLUMN_INDEX; 
    240                 } 
    241             } 
    242         }); 
    243     }; 
    244     $.fn.sortStart = function(fn) { 
    245         return this.bind("sortStart",fn); 
    246     }; 
    247     $.fn.sortReload = function(fn) { 
    248         return this.bind("sortStart",fn); 
    249     }; 
    250     $.fn.sortStop = function(fn) { 
    251         return this.bind("sortStop",fn); 
    252     }; 
    253     $.tableSorter = { 
    254         params: {}, 
    255         /** cache functions, okey for now. */ 
    256         cache: { 
    257             add: function(cache,index,dir,data) { 
    258                 var oCache = {}; 
    259                 oCache.dir = dir; 
    260                 oCache.data = data; 
    261                 cache[index] = oCache; 
    262             }, 
    263             get: function (cache,index) { 
    264                 return cache[index]; 
    265             }, 
    266             exist: function(cache,index) { 
    267                 var oCache = cache[index]; 
    268                 if(!oCache) { 
    269                     return false 
    270                 } else { 
    271                     return true 
    272                 } 
    273             }, 
    274             clear: function(cache) { 
    275                 cache = []; 
    276             } 
    277         }, 
    278         data: { 
    279             flatten: function(defaults,columnData,columnCache,columnIndex) { 
    280                 var flatData = []; 
    281                 var l = columnData.length; 
    282                 for (var i=0;i < l; i++) { 
    283                     flatData.push([i,columnCache[columnIndex].format($.tableSorter.utils.getElementText(defaults,columnData[i].cells[columnIndex],'columns',columnIndex),defaults)]); 
    284                 } 
    285                 return flatData; 
    286             }, 
    287             rebuild: function(columnData,flatData,columnIndex,columnLastIndex) { 
    288                 var l = flatData.length; 
    289                 var sortedData = []; 
    290                 for (var i=0;i < l; i++) { 
    291                     sortedData.push(columnData[flatData[i][0]]); 
    292                 } 
    293                 return sortedData; 
    294             } 
    295         }, 
    296         sorters: {}, 
    297         parsers: {}, 
    298         analyzer: { 
    299             analyzers: [], 
    300             add: function(analyzer) { 
    301                 this.analyzers.push(analyzer); 
    302             }, 
    303             add_to_front: function(analyzer) { 
    304                 this.analyzers.unshift(analyzer); 
    305             }, 
    306             analyseString: function(defaults,s) { 
    307                 /** set defaults params. */ 
    308                 var found = false; 
    309                 var analyzer = $.tableSorter.parsers.generic; 
    310                 var list = this.analyzers; 
    311                 $.each(list, function(i) { 
    312                     if(!found) { 
    313                         if(list[i].is(s)) { 
    314                             found = true; 
    315                             analyzer = list[i]; 
    316                         } 
    317                     } 
    318                 }); 
    319                 return analyzer; 
    320                  
    321             }, 
    322             getById: function(s) { 
    323                 var list = this.analyzers; 
    324                 var analyzer = $.tableSorter.parsers.generic; 
    325                 $.each(list, function(i) { 
    326                     if(list[i].id == s) { 
    327                         analyzer = list[i]; 
    328                     } 
    329                 }); 
    330                 return analyzer; 
    331             } 
    332         }, 
    333         utils: { 
    334             getElementText: function(defaults,o,type,index) { 
    335                 if(!o) return ""; 
    336                 var elementText = ""; 
    337                 if(type == 'header') { 
    338                     elementText = $(o).text(); 
    339                 } else if(type == 'columns') { 
    340                     if(defaults.textExtractionCustom && typeof(defaults.textExtractionCustom[index]) == "function") { 
    341                         elementText = defaults.textExtractionCustom[index](o); 
    342                     } else { 
    343                         if(defaults.textExtraction == 'simple') { 
    344                             if(typeof(defaults.textExtractionType) == "object") { 
    345                                 var d = defaults.textExtractionType; 
    346                                 $.each(d,function(i) { 
    347                                     var val = o[d[i]];       
    348                                     if(val && val.length > 0) { 
    349                                         elementText = val; 
    350                                     } 
    351                                 }); 
    352                             } else { 
    353                                 if(o.childNodes[0] && o.childNodes[0].hasChildNodes()) { 
    354                                     elementText = o.childNodes[0].innerHTML; 
    355                                 } else { 
    356                                     elementText = o.innerHTML; 
    357                                 } 
    358                             } 
    359                         } else if(defaults.textExtraction == 'complex') { 
    360                             // make a jquery object, this will take forever with large tables. 
    361                             elementText = $(o).text(); 
    362                         } 
    363                     } 
    364                 } 
    365                 return elementText; 
    366             }, 
    367             formatFloat: function(s) { 
    368                 var i = parseFloat(s); 
    369                 return (isNaN(i)) ? 0 : i; 
    370             }, 
    371             appendToTable: function(defaults,o,c,index,lastIndex) { 
    372                 var l = c.length; 
    373                 $("> tbody:first",o).empty().append(c); 
    374                 /** jquery way, need to be benched mark! */ 
    375                 if(defaults.stripingRowClass) { 
    376                     /** remove old! */ 
    377                     $("> tbody:first/tr",o).removeClass(defaults.stripingRowClass[0]).removeClass(defaults.stripingRowClass[1]); 
    378                     /** add new! */ 
    379                     $.tableSorter.utils.stripeRows(defaults,o); 
    380                 } 
    381                 if(defaults.highlightClass) { 
    382                     $.tableSorter.utils.highlightColumn(defaults,o,index,lastIndex); 
    383                 } 
    384                  
    385                 /** empty object, good practice! */ 
    386                 c=null; 
    387             }, 
    388             highlightColumn : function(defaults,o,index, lastIndex) { 
    389                 $("> tbody:first/tr", o).find("td:eq(" + lastIndex+ ")").removeClass(defaults.highlightClass); 
    390                 $("> tbody:first/tr", o).find("td:eq(" + index + ")").addClass(defaults.highlightClass); 
    391             }, 
    392             stripeRows: function(defaults,o) { 
    393                 $("> tbody:first/tr:visible:even",o).addClass(defaults.stripingRowClass[0]); 
    394                 $("> tbody:first/tr:visible:odd",o).addClass(defaults.stripingRowClass[1]); 
    395             }, 
    396             isHeaderDisabled: function(defaults,o,arg,index) { 
    397                 if(typeof(arg) == "number") { 
    398                     return (arg == index)? true : false; 
    399                 } else if(typeof(arg) == "string") { 
    400                     return (arg.toLowerCase() == $.tableSorter.utils.getElementText(defaults,o,'header',index).toLowerCase()) ? true : false; 
    401                 } else if(arg.parentNode) { 
    402                     return (o == arg) ? true : false 
    403                 } else if(typeof(arg) == "object") { 
    404                     var l = arg.length; 
    405                     if(!this.lastFound) { this.lastFound = -1; } 
    406                     for(var i=0; i < l; i++) { 
    407                         var val = $.tableSorter.utils.isHeaderDisabled(defaults,o,arg[i],index); 
    408                         if(this.lastFound != i && val) { 
    409                             this.lastFound = i; 
    410                             return val; 
    411                         } 
    412                     } 
    413                 } else { 
    414                     return false 
    415                 } 
    416             } 
    417         }, 
    418         sorters: { 
    419             generic: function(a,b) { 
    420                 return ((a[1] < b[1]) ? -1 : ((a[1] > b[1]) ? 1 : 0)); 
    421             }, 
    422             numeric: function(a,b) { 
    423                 return a[1]-b[1]; 
    424             } 
    425         } 
    426     }; 
    427     $.tableSorter.parsers.generic = { 
    428         id: 'generic', 
    429         is: function(s) { 
    430             return true; 
    431         }, 
    432         format: function(s) { 
    433             return jQuery.trim(s.toLowerCase()); 
    434         }, 
    435         sorter: $.tableSorter.sorters.generic 
    436     }; 
    437     $.tableSorter.parsers.currency = { 
    438         id: 'currency', 
    439         is: function(s) { 
    440             return s.match(new RegExp(/^[£$?.]/g)); 
    441         }, 
    442         format: function(s) { 
    443             return $.tableSorter.utils.formatFloat(s.replace(new RegExp(/[^0-9.]/g),'')); 
    444         }, 
    445         sorter: $.tableSorter.sorters.numeric 
    446     }; 
    447     $.tableSorter.parsers.integer = { 
    448         id: 'integer', 
    449         is: function(s) { 
    450             return s.match(new RegExp(/^\d+$/)); 
    451         }, 
    452         format: function(s) { 
    453             return $.tableSorter.utils.formatFloat(s); 
    454         }, 
    455         sorter: $.tableSorter.sorters.numeric 
    456     }; 
    457     $.tableSorter.parsers.floating = { 
    458         id: 'floating', 
    459         is: function(s) { 
    460             return s.match(new RegExp(/^(\+|-)?[0-9]+\.[0-9]+((E|e)(\+|-)?[0-9]+)?$/)); 
    461         }, 
    462         format: function(s) { 
    463             return $.tableSorter.utils.formatFloat(s.replace(new RegExp(/,/),'')); 
    464         }, 
    465         sorter: $.tableSorter.sorters.numeric 
    466     }; 
    467     $.tableSorter.parsers.ipAddress = { 
    468         id: 'ipAddress', 
    469         is: function(s) { 
    470             return s.match(/^\d{2,3}[\.]\d{2,3}[\.]\d{2,3}[\.]\d{2,3}$/); 
    471         }, 
    472         format: function(s) { 
    473             var a = s.split('.'); 
    474             var r = ''; 
    475             for (var i = 0, item; item = a[i]; i++) { 
    476                if(item.length == 2) { 
    477                     r += '0' + item; 
    478                } else { 
    479                     r += item; 
    480                } 
    481             } 
    482             return $.tableSorter.utils.formatFloat(r); 
    483         }, 
    484         sorter: $.tableSorter.sorters.numeric 
    485     }; 
    486     $.tableSorter.parsers.url = { 
    487         id: 'url', 
    488         is: function(s) { 
    489             return s.match(new RegExp(/(https?|ftp|file):\/\//)); 
    490         }, 
    491         format: function(s) { 
    492             return jQuery.trim(s.replace(new RegExp(/(https?|ftp|file):\/\//),'')); 
    493         }, 
    494         sorter: $.tableSorter.sorters.generic 
    495     }; 
    496     $.tableSorter.parsers.isoDate = { 
    497         id: 'isoDate', 
    498         is: function(s) { 
    499             return s.match(new RegExp(/^\d{4}[\/-]\d{1,2}[\/-]\d{1,2}$/)); 
    500         }, 
    501         format: function(s) { 
    502             return parseFloat((s != "") ? new Date(s.replace(new RegExp(/-/g),'/')).getTime() : "0"); 
    503         }, 
    504         sorter: $.tableSorter.sorters.numeric 
    505     }; 
    506     $.tableSorter.parsers.usLongDate = { 
    507         id: 'usLongDate', 
    508         is: function(s) { 
    509             return s.match(new RegExp(/^[A-Za-z]{3,10}\.? [0-9]{1,2}, ([0-9]{4}|'?[0-9]{2}) (([0-2]?[0-9]:[0-5][0-9])|([0-1]?[0-9]:[0-5][0-9]\s(AM|PM)))$/)); 
    510         }, 
    511         format: function(s) { 
    512             return $.tableSorter.utils.formatFloat((new Date(s)).getTime()); 
    513         }, 
    514         sorter: $.tableSorter.sorters.numeric 
    515     }; 
    516     $.tableSorter.parsers.shortDate = { 
    517         id: 'shortDate', 
    518         is: function(s) { 
    519             return s.match(new RegExp(/\d{1,2}[\/-]\d{1,2}[\/-]\d{2,4}/)); 
    520         }, 
    521         format: function(s,defaults) { 
    522             s = s.replace(new RegExp(/-/g),'/'); 
    523             if(defaults.dateFormat == "mm/dd/yyyy" || defaults.dateFormat == "mm-dd-yyyy") { 
    524                 /** reformat the string in ISO format */ 
    525                 s = s.replace(new RegExp(/(\d{1,2})[\/-](\d{1,2})[\/-](\d{4})/), '$3/$1/$2'); 
    526             } else if(defaults.dateFormat == "dd/mm/yyyy" || defaults.dateFormat == "dd-mm-yyyy") { 
    527                 /** reformat the string in ISO format */ 
    528                 s = s.replace(new RegExp(/(\d{1,2})[\/-](\d{1,2})[\/-](\d{4})/), '$3/$2/$1'); 
    529             } else if(defaults.dateFormat == "dd/mm/yy" || defaults.dateFormat == "dd-mm-yy") { 
    530                 s = s.replace(new RegExp(/(\d{1,2})[\/-](\d{1,2})[\/-](\d{2})/), '$1/$2/$3');    
    531             } 
    532             return $.tableSorter.utils.formatFloat((new Date(s)).getTime()); 
    533         }, 
    534         sorter: $.tableSorter.sorters.numeric 
    535     }; 
    536     $.tableSorter.parsers.time = { 
    537         id: 'time', 
    538         is: function(s) { 
    539             return s.toUpperCase().match(new RegExp(/^(([0-2]?[0-9]:[0-5][0-9])|([0-1]?[0-9]:[0-5][0-9]\s(AM|PM)))$/)); 
    540         }, 
    541         format: function(s) { 
    542             return $.tableSorter.utils.formatFloat((new Date("2000/01/01 " + s)).getTime()); 
    543         }, 
    544         sorter: $.tableSorter.sorters.numeric 
    545     }; 
    546     /** add parsers */ 
    547     $.tableSorter.analyzer.add($.tableSorter.parsers.currency); 
    548     $.tableSorter.analyzer.add($.tableSorter.parsers.integer); 
    549     $.tableSorter.analyzer.add($.tableSorter.parsers.isoDate); 
    550     $.tableSorter.analyzer.add($.tableSorter.parsers.shortDate); 
    551     $.tableSorter.analyzer.add($.tableSorter.parsers.usLongDate); 
    552     $.tableSorter.analyzer.add($.tableSorter.parsers.ipAddress); 
    553     $.tableSorter.analyzer.add($.tableSorter.parsers.url); 
    554     $.tableSorter.analyzer.add($.tableSorter.parsers.time); 
    555     $.tableSorter.analyzer.add($.tableSorter.parsers.floating); 
    556  
    557 })(jQuery); 
     2(function($){$.extend({tablesorter:new 
     3function(){var parsers=[],widgets=[];this.defaults={cssHeader:"header",cssAsc:"headerSortUp",cssDesc:"headerSortDown",cssChildRow:"expand-child",sortInitialOrder:"asc",sortMultiSortKey:"shiftKey",sortForce:null,sortAppend:null,sortLocaleCompare:true,textExtraction:"simple",parsers:{},widgets:[],widgetZebra:{css:["even","odd"]},headers:{},widthFixed:false,cancelSelection:true,sortList:[],headerList:[],dateFormat:"us",decimal:'/\.|\,/g',onRenderHeader:null,selectorHeaders:'thead th',debug:false};function benchmark(s,d){log(s+","+(new Date().getTime()-d.getTime())+"ms");}this.benchmark=benchmark;function log(s){if(typeof console!="undefined"&&typeof console.debug!="undefined"){console.log(s);}else{alert(s);}}function buildParserCache(table,$headers){if(table.config.debug){var parsersDebug="";}if(table.tBodies.length==0)return;var rows=table.tBodies[0].rows;if(rows[0]){var list=[],cells=rows[0].cells,l=cells.length;for(var i=0;i<l;i++){var p=false;if($.metadata&&($($headers[i]).metadata()&&$($headers[i]).metadata().sorter)){p=getParserById($($headers[i]).metadata().sorter);}else if((table.config.headers[i]&&table.config.headers[i].sorter)){p=getParserById(table.config.headers[i].sorter);}if(!p){p=detectParserForColumn(table,rows,-1,i);}if(table.config.debug){parsersDebug+="column:"+i+" parser:"+p.id+"\n";}list.push(p);}}if(table.config.debug){log(parsersDebug);}return list;};function detectParserForColumn(table,rows,rowIndex,cellIndex){var l=parsers.length,node=false,nodeValue=false,keepLooking=true;while(nodeValue==''&&keepLooking){rowIndex++;if(rows[rowIndex]){node=getNodeFromRowAndCellIndex(rows,rowIndex,cellIndex);nodeValue=trimAndGetNodeText(table.config,node);if(table.config.debug){log('Checking if value was empty on row:'+rowIndex);}}else{keepLooking=false;}}for(var i=1;i<l;i++){if(parsers[i].is(nodeValue,table,node)){return parsers[i];}}return parsers[0];}function getNodeFromRowAndCellIndex(rows,rowIndex,cellIndex){return rows[rowIndex].cells[cellIndex];}function trimAndGetNodeText(config,node){return $.trim(getElementText(config,node));}function getParserById(name){var l=parsers.length;for(var i=0;i<l;i++){if(parsers[i].id.toLowerCase()==name.toLowerCase()){return parsers[i];}}return false;}function buildCache(table){if(table.config.debug){var cacheTime=new Date();}var totalRows=(table.tBodies[0]&&table.tBodies[0].rows.length)||0,totalCells=(table.tBodies[0].rows[0]&&table.tBodies[0].rows[0].cells.length)||0,parsers=table.config.parsers,cache={row:[],normalized:[]};for(var i=0;i<totalRows;++i){var c=$(table.tBodies[0].rows[i]),cols=[];if(c.hasClass(table.config.cssChildRow)){cache.row[cache.row.length-1]=cache.row[cache.row.length-1].add(c);continue;}cache.row.push(c);for(var j=0;j<totalCells;++j){cols.push(parsers[j].format(getElementText(table.config,c[0].cells[j]),table,c[0].cells[j]));}cols.push(cache.normalized.length);cache.normalized.push(cols);cols=null;};if(table.config.debug){benchmark("Building cache for "+totalRows+" rows:",cacheTime);}return cache;};function getElementText(config,node){var text="";if(!node)return"";if(!config.supportsTextContent)config.supportsTextContent=node.textContent||false;if(config.textExtraction=="simple"){if(config.supportsTextContent){text=node.textContent;}else{if(node.childNodes[0]&&node.childNodes[0].hasChildNodes()){text=node.childNodes[0].innerHTML;}else{text=node.innerHTML;}}}else{if(typeof(config.textExtraction)=="function"){text=config.textExtraction(node);}else{text=$(node).text();}}return text;}function appendToTable(table,cache){if(table.config.debug){var appendTime=new Date()}var c=cache,r=c.row,n=c.normalized,totalRows=n.length,checkCell=(n[0].length-1),tableBody=$(table.tBodies[0]),rows=[];for(var i=0;i<totalRows;i++){var pos=n[i][checkCell];rows.push(r[pos]);if(!table.config.appender){var l=r[pos].length;for(var j=0;j<l;j++){tableBody[0].appendChild(r[pos][j]);}}}if(table.config.appender){table.config.appender(table,rows);}rows=null;if(table.config.debug){benchmark("Rebuilt table:",appendTime);}applyWidget(table);setTimeout(function(){$(table).trigger("sortEnd");},0);};function buildHeaders(table){if(table.config.debug){var time=new Date();}var meta=($.metadata)?true:false;var header_index=computeTableHeaderCellIndexes(table);$tableHeaders=$(table.config.selectorHeaders,table).each(function(index){this.column=header_index[this.parentNode.rowIndex+"-"+this.cellIndex];this.order=formatSortingOrder(table.config.sortInitialOrder);this.count=this.order;if(checkHeaderMetadata(this)||checkHeaderOptions(table,index))this.sortDisabled=true;if(checkHeaderOptionsSortingLocked(table,index))this.order=this.lockedOrder=checkHeaderOptionsSortingLocked(table,index);if(!this.sortDisabled){var $th=$(this).addClass(table.config.cssHeader);if(table.config.onRenderHeader)table.config.onRenderHeader.apply($th);}table.config.headerList[index]=this;});if(table.config.debug){benchmark("Built headers:",time);log($tableHeaders);}return $tableHeaders;};function computeTableHeaderCellIndexes(t){var matrix=[];var lookup={};var thead=t.getElementsByTagName('THEAD')[0];var trs=thead.getElementsByTagName('TR');for(var i=0;i<trs.length;i++){var cells=trs[i].cells;for(var j=0;j<cells.length;j++){var c=cells[j];var rowIndex=c.parentNode.rowIndex;var cellId=rowIndex+"-"+c.cellIndex;var rowSpan=c.rowSpan||1;var colSpan=c.colSpan||1 
     4var firstAvailCol;if(typeof(matrix[rowIndex])=="undefined"){matrix[rowIndex]=[];}for(var k=0;k<matrix[rowIndex].length+1;k++){if(typeof(matrix[rowIndex][k])=="undefined"){firstAvailCol=k;break;}}lookup[cellId]=firstAvailCol;for(var k=rowIndex;k<rowIndex+rowSpan;k++){if(typeof(matrix[k])=="undefined"){matrix[k]=[];}var matrixrow=matrix[k];for(var l=firstAvailCol;l<firstAvailCol+colSpan;l++){matrixrow[l]="x";}}}}return lookup;}function checkCellColSpan(table,rows,row){var arr=[],r=table.tHead.rows,c=r[row].cells;for(var i=0;i<c.length;i++){var cell=c[i];if(cell.colSpan>1){arr=arr.concat(checkCellColSpan(table,headerArr,row++));}else{if(table.tHead.length==1||(cell.rowSpan>1||!r[row+1])){arr.push(cell);}}}return arr;};function checkHeaderMetadata(cell){if(($.metadata)&&($(cell).metadata().sorter===false)){return true;};return false;}function checkHeaderOptions(table,i){if((table.config.headers[i])&&(table.config.headers[i].sorter===false)){return true;};return false;}function checkHeaderOptionsSortingLocked(table,i){if((table.config.headers[i])&&(table.config.headers[i].lockedOrder))return table.config.headers[i].lockedOrder;return false;}function applyWidget(table){var c=table.config.widgets;var l=c.length;for(var i=0;i<l;i++){getWidgetById(c[i]).format(table);}}function getWidgetById(name){var l=widgets.length;for(var i=0;i<l;i++){if(widgets[i].id.toLowerCase()==name.toLowerCase()){return widgets[i];}}};function formatSortingOrder(v){if(typeof(v)!="Number"){return(v.toLowerCase()=="desc")?1:0;}else{return(v==1)?1:0;}}function isValueInArray(v,a){var l=a.length;for(var i=0;i<l;i++){if(a[i][0]==v){return true;}}return false;}function setHeadersCss(table,$headers,list,css){$headers.removeClass(css[0]).removeClass(css[1]);var h=[];$headers.each(function(offset){if(!this.sortDisabled){h[this.column]=$(this);}});var l=list.length;for(var i=0;i<l;i++){h[list[i][0]].addClass(css[list[i][1]]);}}function fixColumnWidth(table,$headers){var c=table.config;if(c.widthFixed){var colgroup=$('<colgroup>');$("tr:first td",table.tBodies[0]).each(function(){colgroup.append($('<col>').css('width',$(this).width()));});$(table).prepend(colgroup);};}function updateHeaderSortCount(table,sortList){var c=table.config,l=sortList.length;for(var i=0;i<l;i++){var s=sortList[i],o=c.headerList[s[0]];o.count=s[1];o.count++;}}function multisort(table,sortList,cache){if(table.config.debug){var sortTime=new Date();}var dynamicExp="var sortWrapper = function(a,b) {",l=sortList.length;for(var i=0;i<l;i++){var c=sortList[i][0];var order=sortList[i][1];var s=(table.config.parsers[c].type=="text")?((order==0)?makeSortFunction("text","asc",c):makeSortFunction("text","desc",c)):((order==0)?makeSortFunction("numeric","asc",c):makeSortFunction("numeric","desc",c));var e="e"+i;dynamicExp+="var "+e+" = "+s;dynamicExp+="if("+e+") { return "+e+"; } ";dynamicExp+="else { ";}var orgOrderCol=cache.normalized[0].length-1;dynamicExp+="return a["+orgOrderCol+"]-b["+orgOrderCol+"];";for(var i=0;i<l;i++){dynamicExp+="}; ";}dynamicExp+="return 0; ";dynamicExp+="}; ";if(table.config.debug){benchmark("Evaling expression:"+dynamicExp,new Date());}eval(dynamicExp);cache.normalized.sort(sortWrapper);if(table.config.debug){benchmark("Sorting on "+sortList.toString()+" and dir "+order+" time:",sortTime);}return cache;};function makeSortFunction(type,direction,index){var a="a["+index+"]",b="b["+index+"]";if(type=='text'&&direction=='asc'){return"("+a+" == "+b+" ? 0 : ("+a+" === null ? Number.POSITIVE_INFINITY : ("+b+" === null ? Number.NEGATIVE_INFINITY : ("+a+" < "+b+") ? -1 : 1 )));";}else if(type=='text'&&direction=='desc'){return"("+a+" == "+b+" ? 0 : ("+a+" === null ? Number.POSITIVE_INFINITY : ("+b+" === null ? Number.NEGATIVE_INFINITY : ("+b+" < "+a+") ? -1 : 1 )));";}else if(type=='numeric'&&direction=='asc'){return"("+a+" === null && "+b+" === null) ? 0 :("+a+" === null ? Number.POSITIVE_INFINITY : ("+b+" === null ? Number.NEGATIVE_INFINITY : "+a+" - "+b+"));";}else if(type=='numeric'&&direction=='desc'){return"("+a+" === null && "+b+" === null) ? 0 :("+a+" === null ? Number.POSITIVE_INFINITY : ("+b+" === null ? Number.NEGATIVE_INFINITY : "+b+" - "+a+"));";}};function makeSortText(i){return"((a["+i+"] < b["+i+"]) ? -1 : ((a["+i+"] > b["+i+"]) ? 1 : 0));";};function makeSortTextDesc(i){return"((b["+i+"] < a["+i+"]) ? -1 : ((b["+i+"] > a["+i+"]) ? 1 : 0));";};function makeSortNumeric(i){return"a["+i+"]-b["+i+"];";};function makeSortNumericDesc(i){return"b["+i+"]-a["+i+"];";};function sortText(a,b){if(table.config.sortLocaleCompare)return a.localeCompare(b);return((a<b)?-1:((a>b)?1:0));};function sortTextDesc(a,b){if(table.config.sortLocaleCompare)return b.localeCompare(a);return((b<a)?-1:((b>a)?1:0));};function sortNumeric(a,b){return a-b;};function sortNumericDesc(a,b){return b-a;};function getCachedSortType(parsers,i){return parsers[i].type;};this.construct=function(settings){return this.each(function(){if(!this.tHead||!this.tBodies)return;var $this,$document,$headers,cache,config,shiftDown=0,sortOrder;this.config={};config=$.extend(this.config,$.tablesorter.defaults,settings);$this=$(this);$.data(this,"tablesorter",config);$headers=buildHeaders(this);this.config.parsers=buildParserCache(this,$headers);cache=buildCache(this);var sortCSS=[config.cssDesc,config.cssAsc];fixColumnWidth(this);$headers.click(function(e){var totalRows=($this[0].tBodies[0]&&$this[0].tBodies[0].rows.length)||0;if(!this.sortDisabled&&totalRows>0){$this.trigger("sortStart");var $cell=$(this);var i=this.column;this.order=this.count++%2;if(this.lockedOrder)this.order=this.lockedOrder;if(!e[config.sortMultiSortKey]){config.sortList=[];if(config.sortForce!=null){var a=config.sortForce;for(var j=0;j<a.length;j++){if(a[j][0]!=i){config.sortList.push(a[j]);}}}config.sortList.push([i,this.order]);}else{if(isValueInArray(i,config.sortList)){for(var j=0;j<config.sortList.length;j++){var s=config.sortList[j],o=config.headerList[s[0]];if(s[0]==i){o.count=s[1];o.count++;s[1]=o.count%2;}}}else{config.sortList.push([i,this.order]);}};setTimeout(function(){setHeadersCss($this[0],$headers,config.sortList,sortCSS);appendToTable($this[0],multisort($this[0],config.sortList,cache));},1);return false;}}).mousedown(function(){if(config.cancelSelection){this.onselectstart=function(){return false};return false;}});$this.bind("update",function(){var me=this;setTimeout(function(){me.config.parsers=buildParserCache(me,$headers);cache=buildCache(me);},1);}).bind("updateCell",function(e,cell){var config=this.config;var pos=[(cell.parentNode.rowIndex-1),cell.cellIndex];cache.normalized[pos[0]][pos[1]]=config.parsers[pos[1]].format(getElementText(config,cell),cell);}).bind("sorton",function(e,list){$(this).trigger("sortStart");config.sortList=list;var sortList=config.sortList;updateHeaderSortCount(this,sortList);setHeadersCss(this,$headers,sortList,sortCSS);appendToTable(this,multisort(this,sortList,cache));}).bind("appendCache",function(){appendToTable(this,cache);}).bind("applyWidgetId",function(e,id){getWidgetById(id).format(this);}).bind("applyWidgets",function(){applyWidget(this);});if($.metadata&&($(this).metadata()&&$(this).metadata().sortlist)){config.sortList=$(this).metadata().sortlist;}if(config.sortList.length>0){$this.trigger("sorton",[config.sortList]);}applyWidget(this);});};this.addParser=function(parser){var l=parsers.length,a=true;for(var i=0;i<l;i++){if(parsers[i].id.toLowerCase()==parser.id.toLowerCase()){a=false;}}if(a){parsers.push(parser);};};this.addWidget=function(widget){widgets.push(widget);};this.formatFloat=function(s){var i=parseFloat(s);return(isNaN(i))?0:i;};this.formatInt=function(s){var i=parseInt(s);return(isNaN(i))?0:i;};this.isDigit=function(s,config){return/^[-+]?\d*$/.test($.trim(s.replace(/[,.']/g,'')));};this.clearTableBody=function(table){if($.browser.msie){function empty(){while(this.firstChild)this.removeChild(this.firstChild);}empty.apply(table.tBodies[0]);}else{table.tBodies[0].innerHTML="";}};}});$.fn.extend({tablesorter:$.tablesorter.construct});var ts=$.tablesorter;ts.addParser({id:"text",is:function(s){return true;},format:function(s){return $.trim(s.toLocaleLowerCase());},type:"text"});ts.addParser({id:"digit",is:function(s,table){var c=table.config;return $.tablesorter.isDigit(s,c);},format:function(s){return $.tablesorter.formatFloat(s);},type:"numeric"});ts.addParser({id:"currency",is:function(s){return/^[£$€?.]/.test(s);},format:function(s){return $.tablesorter.formatFloat(s.replace(new RegExp(/[£$€]/g),""));},type:"numeric"});ts.addParser({id:"ipAddress",is:function(s){return/^\d{2,3}[\.]\d{2,3}[\.]\d{2,3}[\.]\d{2,3}$/.test(s);},format:function(s){var a=s.split("."),r="",l=a.length;for(var i=0;i<l;i++){var item=a[i];if(item.length==2){r+="0"+item;}else{r+=item;}}return $.tablesorter.formatFloat(r);},type:"numeric"});ts.addParser({id:"url",is:function(s){return/^(https?|ftp|file):\/\/$/.test(s);},format:function(s){return jQuery.trim(s.replace(new RegExp(/(https?|ftp|file):\/\//),''));},type:"text"});ts.addParser({id:"isoDate",is:function(s){return/^\d{4}[\/-]\d{1,2}[\/-]\d{1,2}$/.test(s);},format:function(s){return $.tablesorter.formatFloat((s!="")?new Date(s.replace(new RegExp(/-/g),"/")).getTime():"0");},type:"numeric"});ts.addParser({id:"percent",is:function(s){return/\%$/.test($.trim(s));},format:function(s){return $.tablesorter.formatFloat(s.replace(new RegExp(/%/g),""));},type:"numeric"});ts.addParser({id:"usLongDate",is:function(s){return s.match(new RegExp(/^[A-Za-z]{3,10}\.? [0-9]{1,2}, ([0-9]{4}|'?[0-9]{2}) (([0-2]?[0-9]:[0-5][0-9])|([0-1]?[0-9]:[0-5][0-9]\s(AM|PM)))$/));},format:function(s){return $.tablesorter.formatFloat(new Date(s).getTime());},type:"numeric"});ts.addParser({id:"shortDate",is:function(s){return/\d{1,2}[\/\-]\d{1,2}[\/\-]\d{2,4}/.test(s);},format:function(s,table){var c=table.config;s=s.replace(/\-/g,"/");if(c.dateFormat=="us"){s=s.replace(/(\d{1,2})[\/\-](\d{1,2})[\/\-](\d{4})/,"$3/$1/$2");}else if(c.dateFormat=="uk"){s=s.replace(/(\d{1,2})[\/\-](\d{1,2})[\/\-](\d{4})/,"$3/$2/$1");}else if(c.dateFormat=="dd/mm/yy"||c.dateFormat=="dd-mm-yy"){s=s.replace(/(\d{1,2})[\/\-](\d{1,2})[\/\-](\d{2})/,"$1/$2/$3");}return $.tablesorter.formatFloat(new Date(s).getTime());},type:"numeric"});ts.addParser({id:"time",is:function(s){return/^(([0-2]?[0-9]:[0-5][0-9])|([0-1]?[0-9]:[0-5][0-9]\s(am|pm)))$/.test(s);},format:function(s){return $.tablesorter.formatFloat(new Date("2000/01/01 "+s).getTime());},type:"numeric"});ts.addParser({id:"metadata",is:function(s){return false;},format:function(s,table,cell){var c=table.config,p=(!c.parserMetadataName)?'sortValue':c.parserMetadataName;return $(cell).metadata()[p];},type:"numeric"});ts.addWidget({id:"zebra",format:function(table){if(table.config.debug){var time=new Date();}var $tr,row=-1,odd;$("tr:visible",table.tBodies[0]).each(function(i){$tr=$(this);if(!$tr.hasClass(table.config.cssChildRow))row++;odd=(row%2==0);$tr.removeClass(table.config.widgetZebra.css[odd?0:1]).addClass(table.config.widgetZebra.css[odd?1:0])});if(table.config.debug){$.tablesorter.benchmark("Applying Zebra widget",time);}}});})(jQuery); 
  • trunk/plugins/jquery/themes/ui.core.css

    r13369 r15201  
     1/* TODO: remove, all necessary styles are in jquery-ui.css file  */ 
     2 
    13/* 
    24* jQuery UI CSS Framework 
  • trunk/plugins/jquery/themes/ui.datepicker.css

    r13459 r15201  
     1/* TODO: remove, all necessary styles are in jquery-ui.css file  */ 
     2 
    13/* Datepicker 
    24----------------------------------*/ 
  • trunk/plugins/jquery/themes/ui.theme.css

    r13369 r15201  
     1/* TODO: remove, all necessary styles are in jquery-ui.css file  */ 
     2 
    13/* 
    24* jQuery UI CSS Framework 
  • trunk/plugins/jquery/ui.core.js

    r13368 r15201  
     1// TODO: remove, the content of this file is in different files now 
     2 
    13/* 
    24 * jQuery UI 1.7.2 
  • trunk/plugins/jquery/ui.datepicker-ru.js

    r13368 r15201  
     1// TODO: remove, the content of this file is in different files now 
     2 
    13/* Russian (UTF-8) initialisation for the jQuery UI date picker plugin. */ 
    24/* Written by Andrew Stromnov (stromnov@gmail.com). */ 
  • trunk/plugins/jquery/ui.datepicker.js

    r13418 r15201  
     1// TODO: remove, the content of this file is in different files now 
     2 
    13/* 
    24 * jQuery UI Datepicker 1.7.2 
  • trunk/plugins/jquery/ui.draggable.js

    r13368 r15201  
     1// TODO: remove, the content of this file is in different files now 
     2 
    13/* 
    24 * jQuery UI Draggable 1.7.2 
  • trunk/plugins/jquery/ui.slider.js

    r13368 r15201  
     1// TODO: remove, the content of this file is in different files now 
     2 
    13/* 
    24 * jQuery UI Slider 1.7.2 
  • trunk/plugins/jquery/ui.sortable.js

    r13414 r15201  
     1// TODO: remove, the content of this file is in different files now 
     2 
    13/* 
    24 * jQuery UI Sortable 1.7.2 
  • trunk/plugins/jquery/ui.tabs.js

    r13368 r15201  
     1// TODO: remove, the content of this file is in different files now 
     2 
    13/* 
    24 * jQuery UI Tabs 1.7.2 
Note: See TracChangeset for help on using the changeset viewer.