WordPress.org

Make WordPress Core

Ticket #6988: 6988.003.diff

File 6988.003.diff, 163.0 KB (added by AaronCampbell, 10 years ago)
  • wp-includes/js/jquery/ui.core.js

     
    77 *
    88 * http://docs.jquery.com/UI
    99 *
    10  * $Id: ui.core.js 5587 2008-05-13 19:56:42Z scott.gonzalez $
     10 * $Id: ui.core.js 5634 2008-05-19 20:53:51Z joern.zaefferer $
    1111 */
    1212;(function($) {
    1313       
     
    8282                var methods = $[namespace][plugin].getter || [];
    8383                methods = (typeof methods == "string" ? methods.split(/,?\s+/) : methods);
    8484                return ($.inArray(method, methods) != -1);
    85         };
     85        }
    8686       
    8787        var widgetPrototype = {
    8888                init: function() {},
     
    109109                var namespace = name.split(".")[0];
    110110                name = name.split(".")[1];
    111111                // create plugin method
    112                 $.fn[name] = function(options, data) {
    113                         var isMethodCall = (typeof options == 'string');
    114                         [].shift.call(arguments);
     112                $.fn[name] = function(options) {
     113                        var isMethodCall = (typeof options == 'string'),
     114                                args = Array.prototype.slice.call(arguments, 1);
    115115                       
    116116                        if (isMethodCall && getter(namespace, name, options)) {
    117117                                var instance = $.data(this[0], name);
    118                                 return (instance ? instance[options].apply(instance, arguments)
     118                                return (instance ? instance[options].apply(instance, args)
    119119                                        : undefined);
    120120                        }
    121121                       
     
    124124                                if (!instance) {
    125125                                        $.data(this, name, new $[namespace][name](this, options));
    126126                                } else if (isMethodCall) {
    127                                         instance[options].apply(instance, arguments);
     127                                        instance[options].apply(instance, args);
    128128                                }
    129129                        });
    130130                };
  • wp-includes/js/jquery/ui.sortable.js

     
     1/*
     2 * jQuery UI Sortable
     3 *
     4 * Copyright (c) 2008 Paul Bakaus
     5 * Dual licensed under the MIT (MIT-LICENSE.txt)
     6 * and GPL (GPL-LICENSE.txt) licenses.
     7 *
     8 * http://docs.jquery.com/UI/Sortables
     9 *
     10 * Depends:
     11 *      ui.core.js
     12 *
     13 * Revision: $Id: ui.sortable.js 5433 2008-05-04 20:07:17Z joern.zaefferer $
     14 */
     15;(function($) {
     16       
     17        function contains(a, b) {
     18            var safari2 = $.browser.safari && $.browser.version < 522;
     19            if (a.contains && !safari2) {
     20                return a.contains(b);
     21            }
     22            if (a.compareDocumentPosition)
     23                return !!(a.compareDocumentPosition(b) & 16);
     24            while (b = b.parentNode)
     25                  if (b == a) return true;
     26            return false;
     27        };
     28       
     29        $.widget("ui.sortable", {
     30                init: function() {
     31
     32                        var o = this.options;
     33                        this.containerCache = {};
     34                        this.element.addClass("ui-sortable");
     35               
     36                        //Get the items
     37                        this.refresh();
     38       
     39                        //Let's determine if the items are floating
     40                        this.floating = this.items.length ? (/left|right/).test(this.items[0].item.css('float')) : false;
     41                       
     42                        //Let's determine the parent's offset
     43                        if(!(/(relative|absolute|fixed)/).test(this.element.css('position'))) this.element.css('position', 'relative');
     44                        this.offset = this.element.offset();
     45       
     46                        //Initialize mouse events for interaction
     47                        this.element.mouse({
     48                                executor: this,
     49                                delay: o.delay,
     50                                distance: o.distance || 1,
     51                                dragPrevention: o.prevention ? o.prevention.toLowerCase().split(',') : ['input','textarea','button','select','option'],
     52                                start: this.start,
     53                                stop: this.stop,
     54                                drag: this.drag,
     55                                condition: function(e) {
     56       
     57                                        if(this.options.disabled || this.options.type == 'static') return false;
     58       
     59                                        //Find out if the clicked node (or one of its parents) is a actual item in this.items
     60                                        var currentItem = null, nodes = $(e.target).parents().each(function() {
     61                                                if($.data(this, 'sortable-item')) {
     62                                                        currentItem = $(this);
     63                                                        return false;
     64                                                }
     65                                        });
     66                                        if($.data(e.target, 'sortable-item')) currentItem = $(e.target);
     67                                       
     68                                        if(!currentItem) return false; 
     69                                        if(this.options.handle) {
     70                                                var validHandle = false;
     71                                                $(this.options.handle, currentItem).each(function() { if(this == e.target) validHandle = true; });
     72                                                if(!validHandle) return false;
     73                                        }
     74                                               
     75                                        this.currentItem = currentItem;
     76                                        return true;
     77       
     78                                }
     79                        });
     80                       
     81                },
     82                plugins: {},
     83                ui: function(inst) {
     84                        return {
     85                                helper: (inst || this)["helper"],
     86                                placeholder: (inst || this)["placeholder"] || $([]),
     87                                position: (inst || this)["position"].current,
     88                                absolutePosition: (inst || this)["position"].absolute,
     89                                instance: this,
     90                                options: this.options,
     91                                element: this.element,
     92                                item: (inst || this)["currentItem"],
     93                                sender: inst ? inst.element : null
     94                        };             
     95                },
     96                propagate: function(n,e,inst) {
     97                        $.ui.plugin.call(this, n, [e, this.ui(inst)]);
     98                        this.element.triggerHandler(n == "sort" ? n : "sort"+n, [e, this.ui(inst)], this.options[n]);
     99                },
     100                serialize: function(o) {
     101                       
     102                        var items = $(this.options.items, this.element).not('.ui-sortable-helper'); //Only the items of the sortable itself
     103                        var str = []; o = o || {};
     104                       
     105                        items.each(function() {
     106                                var res = ($(this).attr(o.attribute || 'id') || '').match(o.expression || (/(.+)[-=_](.+)/));
     107                                if(res) str.push((o.key || res[1])+'[]='+(o.key ? res[1] : res[2]));
     108                        });
     109                       
     110                        return str.join('&');
     111                       
     112                },
     113                toArray: function(attr) {
     114                        var items = $(this.options.items, this.element).not('.ui-sortable-helper'); //Only the items of the sortable itself
     115                        var ret = [];
     116
     117                        items.each(function() { ret.push($(this).attr(attr || 'id')); });
     118                        return ret;
     119                },
     120                enable: function() {
     121                        this.element.removeClass("ui-sortable-disabled");
     122                        this.options.disabled = false;
     123                },
     124                disable: function() {
     125                        this.element.addClass("ui-sortable-disabled");
     126                        this.options.disabled = true;
     127                },
     128                /* Be careful with the following core functions */
     129                intersectsWith: function(item) {
     130                       
     131                        var x1 = this.position.absolute.left, x2 = x1 + this.helperProportions.width,
     132                        y1 = this.position.absolute.top, y2 = y1 + this.helperProportions.height;
     133                        var l = item.left, r = l + item.width,
     134                        t = item.top, b = t + item.height;
     135
     136                        if(this.options.tolerance == "pointer") {
     137                                return (y1 + this.clickOffset.top > t && y1 + this.clickOffset.top < b && x1 + this.clickOffset.left > l && x1 + this.clickOffset.left < r);
     138                        } else {
     139                       
     140                                return (l < x1 + (this.helperProportions.width / 2) // Right Half
     141                                        && x2 - (this.helperProportions.width / 2) < r // Left Half
     142                                        && t < y1 + (this.helperProportions.height / 2) // Bottom Half
     143                                        && y2 - (this.helperProportions.height / 2) < b ); // Top Half
     144                       
     145                        }
     146                       
     147                },
     148                intersectsWithEdge: function(item) {   
     149                        var x1 = this.position.absolute.left, x2 = x1 + this.helperProportions.width,
     150                                y1 = this.position.absolute.top, y2 = y1 + this.helperProportions.height;
     151                        var l = item.left, r = l + item.width,
     152                                t = item.top, b = t + item.height;
     153
     154                        if(this.options.tolerance == "pointer") {
     155
     156                                if(!(y1 + this.clickOffset.top > t && y1 + this.clickOffset.top < b && x1 + this.clickOffset.left > l && x1 + this.clickOffset.left < r)) return false;
     157                               
     158                                if(this.floating) {
     159                                        if(x1 + this.clickOffset.left > l && x1 + this.clickOffset.left < l + item.width/2) return 2;
     160                                        if(x1 + this.clickOffset.left > l+item.width/2 && x1 + this.clickOffset.left < r) return 1;
     161                                } else {
     162                                        if(y1 + this.clickOffset.top > t && y1 + this.clickOffset.top < t + item.height/2) return 2;
     163                                        if(y1 + this.clickOffset.top > t+item.height/2 && y1 + this.clickOffset.top < b) return 1;
     164                                }
     165
     166                        } else {
     167                       
     168                                if (!(l < x1 + (this.helperProportions.width / 2) // Right Half
     169                                        && x2 - (this.helperProportions.width / 2) < r // Left Half
     170                                        && t < y1 + (this.helperProportions.height / 2) // Bottom Half
     171                                        && y2 - (this.helperProportions.height / 2) < b )) return false; // Top Half
     172                               
     173                                if(this.floating) {
     174                                        if(x2 > l && x1 < l) return 2; //Crosses left edge
     175                                        if(x1 < r && x2 > r) return 1; //Crosses right edge
     176                                } else {
     177                                        if(y2 > t && y1 < t) return 1; //Crosses top edge
     178                                        if(y1 < b && y2 > b) return 2; //Crosses bottom edge
     179                                }
     180                       
     181                        }
     182                       
     183                        return false;
     184                       
     185                },
     186                //This method checks approximately if the item is dragged in a container, but doesn't touch any items
     187                inEmptyZone: function(container) {
     188
     189                        if(!$(container.options.items, container.element).length) {
     190                                return container.options.dropOnEmpty ? true : false;
     191                        };
     192
     193                        var last = $(container.options.items, container.element).not('.ui-sortable-helper'); last = $(last[last.length-1]);
     194                        var top = last.offset()[this.floating ? 'left' : 'top'] + last[0][this.floating ? 'offsetWidth' : 'offsetHeight'];
     195                        return (this.position.absolute[this.floating ? 'left' : 'top'] > top);
     196                },
     197                refresh: function() {
     198                        this.refreshItems();
     199                        this.refreshPositions();
     200                },
     201                refreshItems: function() {
     202                       
     203                        this.items = [];
     204                        this.containers = [this];
     205                        var items = this.items;
     206                        var queries = [$(this.options.items, this.element)];
     207                       
     208                        if(this.options.connectWith) {
     209                                for (var i = this.options.connectWith.length - 1; i >= 0; i--){
     210                                        var cur = $(this.options.connectWith[i]);
     211                                        for (var j = cur.length - 1; j >= 0; j--){
     212                                                var inst = $.data(cur[j], 'sortable');
     213                                                if(inst && !inst.options.disabled) {
     214                                                        queries.push($(inst.options.items, inst.element));
     215                                                        this.containers.push(inst);
     216                                                }
     217                                        };
     218                                };
     219                        }
     220
     221                        for (var i = queries.length - 1; i >= 0; i--){
     222                                queries[i].each(function() {
     223                                        $.data(this, 'sortable-item', true); // Data for target checking (mouse manager)
     224                                        items.push({
     225                                                item: $(this),
     226                                                width: 0, height: 0,
     227                                                left: 0, top: 0
     228                                        });
     229                                });
     230                        };
     231
     232                },
     233                refreshPositions: function(fast) {
     234                        for (var i = this.items.length - 1; i >= 0; i--){
     235                                var t = this.items[i].item;
     236                                if(!fast) this.items[i].width = (this.options.toleranceElement ? $(this.options.toleranceElement, t) : t).outerWidth();
     237                                if(!fast) this.items[i].height = (this.options.toleranceElement ? $(this.options.toleranceElement, t) : t).outerHeight();
     238                                var p = (this.options.toleranceElement ? $(this.options.toleranceElement, t) : t).offset();
     239                                this.items[i].left = p.left;
     240                                this.items[i].top = p.top;
     241                        };
     242                        for (var i = this.containers.length - 1; i >= 0; i--){
     243                                var p =this.containers[i].element.offset();
     244                                this.containers[i].containerCache.left = p.left;
     245                                this.containers[i].containerCache.top = p.top;
     246                                this.containers[i].containerCache.width = this.containers[i].element.outerWidth();
     247                                this.containers[i].containerCache.height = this.containers[i].element.outerHeight();
     248                        };
     249                },
     250                destroy: function() {
     251                        this.element
     252                                .removeClass("ui-sortable ui-sortable-disabled")
     253                                .removeData("sortable")
     254                                .unbind(".sortable")
     255                                .mouse("destroy");
     256                       
     257                        for ( var i = this.items.length - 1; i >= 0; i-- )
     258                                this.items[i].item.removeData("sortable-item");
     259                },
     260                createPlaceholder: function(that) {
     261                        (that || this).placeholderElement = this.options.placeholderElement ? $(this.options.placeholderElement, (that || this).currentItem) : (that || this).currentItem;
     262                        (that || this).placeholder = $('<div></div>')
     263                                .addClass(this.options.placeholder)
     264                                .appendTo('body')
     265                                .css({ position: 'absolute' })
     266                                .css((that || this).placeholderElement.offset())
     267                                .css({ width: (that || this).placeholderElement.outerWidth(), height: (that || this).placeholderElement.outerHeight() })
     268                                ;
     269                },
     270                contactContainers: function(e) {
     271                        for (var i = this.containers.length - 1; i >= 0; i--){
     272
     273                                if(this.intersectsWith(this.containers[i].containerCache)) {
     274                                        if(!this.containers[i].containerCache.over) {
     275                                               
     276
     277                                                if(this.currentContainer != this.containers[i]) {
     278                                                       
     279                                                        //When entering a new container, we will find the item with the least distance and append our item near it
     280                                                        var dist = 10000; var itemWithLeastDistance = null; var base = this.position.absolute[this.containers[i].floating ? 'left' : 'top'];
     281                                                        for (var j = this.items.length - 1; j >= 0; j--) {
     282                                                                if(!contains(this.containers[i].element[0], this.items[j].item[0])) continue;
     283                                                                var cur = this.items[j][this.containers[i].floating ? 'left' : 'top'];
     284                                                                if(Math.abs(cur - base) < dist) {
     285                                                                        dist = Math.abs(cur - base); itemWithLeastDistance = this.items[j];
     286                                                                }
     287                                                        }
     288                                                       
     289                                                        //We also need to exchange the placeholder
     290                                                        if(this.placeholder) this.placeholder.remove();
     291                                                        if(this.containers[i].options.placeholder) {
     292                                                                this.containers[i].createPlaceholder(this);
     293                                                        } else {
     294                                                                this.placeholder = null; this.placeholderElement = null;
     295                                                        }
     296                                                       
     297                                                       
     298                                                        itemWithLeastDistance ? this.rearrange(e, itemWithLeastDistance) : this.rearrange(e, null, this.containers[i].element);
     299                                                        this.propagate("change", e); //Call plugins and callbacks
     300                                                        this.containers[i].propagate("change", e, this); //Call plugins and callbacks
     301                                                        this.currentContainer = this.containers[i];
     302
     303                                                }
     304                                               
     305                                                this.containers[i].propagate("over", e, this);
     306                                                this.containers[i].containerCache.over = 1;
     307                                        }
     308                                } else {
     309                                        if(this.containers[i].containerCache.over) {
     310                                                this.containers[i].propagate("out", e, this);
     311                                                this.containers[i].containerCache.over = 0;
     312                                        }
     313                                }
     314                               
     315                        };                     
     316                },
     317                start: function(e,el) {
     318               
     319                        var o = this.options;
     320                        this.currentContainer = this;
     321                        this.refresh();
     322
     323                        //Create and append the visible helper
     324                        this.helper = typeof o.helper == 'function' ? $(o.helper.apply(this.element[0], [e, this.currentItem])) : this.currentItem.clone();
     325                        if(!this.helper.parents('body').length) this.helper.appendTo(o.appendTo || this.currentItem[0].parentNode); //Add the helper to the DOM if that didn't happen already
     326                        this.helper.css({ position: 'absolute', clear: 'both' }).addClass('ui-sortable-helper'); //Position it absolutely and add a helper class
     327                       
     328                        //Prepare variables for position generation
     329                        $.extend(this, {
     330                                offsetParent: this.helper.offsetParent(),
     331                                offsets: {
     332                                        absolute: this.currentItem.offset()
     333                                },
     334                                mouse: {
     335                                        start: { top: e.pageY, left: e.pageX }
     336                                },
     337                                margins: {
     338                                        top: parseInt(this.currentItem.css("marginTop")) || 0,
     339                                        left: parseInt(this.currentItem.css("marginLeft")) || 0
     340                                }
     341                        });
     342                       
     343                        //The relative click offset
     344                        this.offsets.parent = this.offsetParent.offset();
     345                        this.clickOffset = { left: e.pageX - this.offsets.absolute.left, top: e.pageY - this.offsets.absolute.top };
     346                       
     347                        this.originalPosition = {
     348                                left: this.offsets.absolute.left - this.offsets.parent.left - this.margins.left,
     349                                top: this.offsets.absolute.top - this.offsets.parent.top - this.margins.top
     350                        }
     351                       
     352                        //Generate a flexible offset that will later be subtracted from e.pageX/Y
     353                        //I hate margins - they need to be removed before positioning the element absolutely..
     354                        this.offset = {
     355                                left: e.pageX - this.originalPosition.left,
     356                                top: e.pageY - this.originalPosition.top
     357                        };
     358
     359                        //Save the first time position
     360                        $.extend(this, {
     361                                position: {
     362                                        current: { top: e.pageY - this.offset.top, left: e.pageX - this.offset.left },
     363                                        absolute: { left: e.pageX - this.clickOffset.left, top: e.pageY - this.clickOffset.top },
     364                                        dom: this.currentItem.prev()[0]
     365                                }
     366                        });
     367
     368                        //If o.placeholder is used, create a new element at the given position with the class
     369                        if(o.placeholder) this.createPlaceholder();
     370
     371                        this.propagate("start", e); //Call plugins and callbacks
     372                        this.helperProportions = { width: this.helper.outerWidth(), height: this.helper.outerHeight() }; //Save and store the helper proportions
     373
     374                        //If we have something in cursorAt, we'll use it
     375                        if(o.cursorAt) {
     376                                if(o.cursorAt.top != undefined || o.cursorAt.bottom != undefined) {
     377                                        this.offset.top -= this.clickOffset.top - (o.cursorAt.top != undefined ? o.cursorAt.top : (this.helperProportions.height - o.cursorAt.bottom));
     378                                        this.clickOffset.top = (o.cursorAt.top != undefined ? o.cursorAt.top : (this.helperProportions.height - o.cursorAt.bottom));
     379                                }
     380                                if(o.cursorAt.left != undefined || o.cursorAt.right != undefined) {
     381                                        this.offset.left -= this.clickOffset.left - (o.cursorAt.left != undefined ? o.cursorAt.left : (this.helperProportions.width - o.cursorAt.right));
     382                                        this.clickOffset.left = (o.cursorAt.left != undefined ? o.cursorAt.left : (this.helperProportions.width - o.cursorAt.right));
     383                                }
     384                        }
     385
     386                        if(this.options.placeholder != 'clone') $(this.currentItem).css('visibility', 'hidden'); //Set the original element visibility to hidden to still fill out the white space
     387                        for (var i = this.containers.length - 1; i >= 0; i--) { this.containers[i].propagate("activate", e, this); } //Post 'activate' events to possible containers
     388                       
     389                        //Prepare possible droppables
     390                        if($.ui.ddmanager) $.ui.ddmanager.current = this;
     391                        if ($.ui.ddmanager && !o.dropBehaviour) $.ui.ddmanager.prepareOffsets(this, e);
     392
     393                        this.dragging = true;
     394                        return false;
     395                       
     396                },
     397                stop: function(e) {
     398
     399                        this.propagate("stop", e); //Call plugins and trigger callbacks
     400                        if(this.position.dom != this.currentItem.prev()[0]) this.propagate("update", e); //Trigger update callback if the DOM position has changed
     401                        if(!contains(this.element[0], this.currentItem[0])) { //Node was moved out of the current element
     402                                this.propagate("remove", e);
     403                                for (var i = this.containers.length - 1; i >= 0; i--){
     404                                        if(contains(this.containers[i].element[0], this.currentItem[0])) {
     405                                                this.containers[i].propagate("update", e, this);
     406                                                this.containers[i].propagate("receive", e, this);
     407                                        }
     408                                };
     409                        };
     410                       
     411                        //Post events to containers
     412                        for (var i = this.containers.length - 1; i >= 0; i--){
     413                                this.containers[i].propagate("deactivate", e, this);
     414                                if(this.containers[i].containerCache.over) {
     415                                        this.containers[i].propagate("out", e, this);
     416                                        this.containers[i].containerCache.over = 0;
     417                                }
     418                        }
     419                       
     420                        //If we are using droppables, inform the manager about the drop
     421                        if ($.ui.ddmanager && !this.options.dropBehaviour) $.ui.ddmanager.drop(this, e);
     422                       
     423                        this.dragging = false;
     424                        if(this.cancelHelperRemoval) return false;
     425                        $(this.currentItem).css('visibility', '');
     426                        if(this.placeholder) this.placeholder.remove();
     427                        this.helper.remove();
     428
     429                        return false;
     430                       
     431                },
     432                drag: function(e) {
     433
     434                        //Compute the helpers position
     435                        this.position.current = { top: e.pageY - this.offset.top, left: e.pageX - this.offset.left };
     436                        this.position.absolute = { left: e.pageX - this.clickOffset.left, top: e.pageY - this.clickOffset.top };
     437
     438                        //Rearrange
     439                        for (var i = this.items.length - 1; i >= 0; i--) {
     440                                var intersection = this.intersectsWithEdge(this.items[i]);
     441                                if(!intersection) continue;
     442                               
     443                                if(this.items[i].item[0] != this.currentItem[0] //cannot intersect with itself
     444                                        &&      this.currentItem[intersection == 1 ? "next" : "prev"]()[0] != this.items[i].item[0] //no useless actions that have been done before
     445                                        &&      !contains(this.currentItem[0], this.items[i].item[0]) //no action if the item moved is the parent of the item checked
     446                                        && (this.options.type == 'semi-dynamic' ? !contains(this.element[0], this.items[i].item[0]) : true)
     447                                ) {
     448                                       
     449                                        this.direction = intersection == 1 ? "down" : "up";
     450                                        this.rearrange(e, this.items[i]);
     451                                        this.propagate("change", e); //Call plugins and callbacks
     452                                        break;
     453                                }
     454                        }
     455                       
     456                        //Post events to containers
     457                        this.contactContainers(e);
     458                       
     459                        //Interconnect with droppables
     460                        if($.ui.ddmanager) $.ui.ddmanager.drag(this, e);
     461
     462                        this.propagate("sort", e); //Call plugins and callbacks
     463                        this.helper.css({ left: this.position.current.left+'px', top: this.position.current.top+'px' }); // Stick the helper to the cursor
     464                        return false;
     465                       
     466                },
     467                rearrange: function(e, i, a) {
     468                        a ? a.append(this.currentItem) : i.item[this.direction == 'down' ? 'before' : 'after'](this.currentItem);
     469                        this.refreshPositions(true); //Precompute after each DOM insertion, NOT on mousemove
     470                        if(this.placeholderElement) this.placeholder.css(this.placeholderElement.offset());
     471                        if(this.placeholderElement && this.placeholderElement.is(":visible")) this.placeholder.css({ width: this.placeholderElement.outerWidth(), height: this.placeholderElement.outerHeight() });
     472                }
     473        });
     474       
     475        $.extend($.ui.sortable, {
     476                getter: "serialize toArray",
     477                defaults: {
     478                        items: '> *',
     479                        zIndex: 1000
     480                }
     481        });
     482
     483       
     484/*
     485 * Sortable Extensions
     486 */
     487
     488        $.ui.plugin.add("sortable", "cursor", {
     489                start: function(e, ui) {
     490                        var t = $('body');
     491                        if (t.css("cursor")) ui.options._cursor = t.css("cursor");
     492                        t.css("cursor", ui.options.cursor);
     493                },
     494                stop: function(e, ui) {
     495                        if (ui.options._cursor) $('body').css("cursor", ui.options._cursor);
     496                }
     497        });
     498
     499        $.ui.plugin.add("sortable", "zIndex", {
     500                start: function(e, ui) {
     501                        var t = ui.helper;
     502                        if(t.css("zIndex")) ui.options._zIndex = t.css("zIndex");
     503                        t.css('zIndex', ui.options.zIndex);
     504                },
     505                stop: function(e, ui) {
     506                        if(ui.options._zIndex) $(ui.helper).css('zIndex', ui.options._zIndex);
     507                }
     508        });
     509
     510        $.ui.plugin.add("sortable", "opacity", {
     511                start: function(e, ui) {
     512                        var t = ui.helper;
     513                        if(t.css("opacity")) ui.options._opacity = t.css("opacity");
     514                        t.css('opacity', ui.options.opacity);
     515                },
     516                stop: function(e, ui) {
     517                        if(ui.options._opacity) $(ui.helper).css('opacity', ui.options._opacity);
     518                }
     519        });
     520
     521
     522        $.ui.plugin.add("sortable", "revert", {
     523                stop: function(e, ui) {
     524                        var self = ui.instance;
     525                        self.cancelHelperRemoval = true;
     526                        var cur = self.currentItem.offset();
     527                        var op = self.helper.offsetParent().offset();
     528                        if(ui.instance.options.zIndex) ui.helper.css('zIndex', ui.instance.options.zIndex); //Do the zIndex again because it already was resetted by the plugin above on stop
     529
     530                        //Also animate the placeholder if we have one
     531                        if(ui.instance.placeholder) ui.instance.placeholder.animate({ opacity: 'hide' }, parseInt(ui.options.revert, 10) || 500);
     532                       
     533                       
     534                        ui.helper.animate({
     535                                left: cur.left - op.left - self.margins.left,
     536                                top: cur.top - op.top - self.margins.top
     537                        }, parseInt(ui.options.revert, 10) || 500, function() {
     538                                self.currentItem.css('visibility', 'visible');
     539                                window.setTimeout(function() {
     540                                        if(self.placeholder) self.placeholder.remove();
     541                                        self.helper.remove();
     542                                        if(ui.options._zIndex) ui.helper.css('zIndex', ui.options._zIndex);
     543                                }, 50);
     544                        });
     545                }
     546        });
     547
     548       
     549        $.ui.plugin.add("sortable", "containment", {
     550                start: function(e, ui) {
     551
     552                        var o = ui.options;
     553                        if((o.containment.left != undefined || o.containment.constructor == Array) && !o._containment) return;
     554                        if(!o._containment) o._containment = o.containment;
     555
     556                        if(o._containment == 'parent') o._containment = this[0].parentNode;
     557                        if(o._containment == 'sortable') o._containment = this[0];
     558                        if(o._containment == 'document') {
     559                                o.containment = [
     560                                        0,
     561                                        0,
     562                                        $(document).width(),
     563                                        ($(document).height() || document.body.parentNode.scrollHeight)
     564                                ];
     565                        } else { //I'm a node, so compute top/left/right/bottom
     566
     567                                var ce = $(o._containment);
     568                                var co = ce.offset();
     569
     570                                o.containment = [
     571                                        co.left,
     572                                        co.top,
     573                                        co.left+(ce.outerWidth() || ce[0].scrollWidth),
     574                                        co.top+(ce.outerHeight() || ce[0].scrollHeight)
     575                                ];
     576                        }
     577
     578                },
     579                sort: function(e, ui) {
     580
     581                        var o = ui.options;
     582                        var h = ui.helper;
     583                        var c = o.containment;
     584                        var self = ui.instance;
     585                        var borderLeft = (parseInt(self.offsetParent.css("borderLeftWidth"), 10) || 0);
     586                        var borderRight = (parseInt(self.offsetParent.css("borderRightWidth"), 10) || 0);
     587                        var borderTop = (parseInt(self.offsetParent.css("borderTopWidth"), 10) || 0);
     588                        var borderBottom = (parseInt(self.offsetParent.css("borderBottomWidth"), 10) || 0);
     589                       
     590                        if(c.constructor == Array) {
     591                                if((self.position.absolute.left < c[0])) self.position.current.left = c[0] - self.offsets.parent.left - self.margins.left;
     592                                if((self.position.absolute.top < c[1])) self.position.current.top = c[1] - self.offsets.parent.top - self.margins.top;
     593                                if(self.position.absolute.left - c[2] + self.helperProportions.width >= 0) self.position.current.left = c[2] - self.offsets.parent.left - self.helperProportions.width - self.margins.left - borderLeft - borderRight;
     594                                if(self.position.absolute.top - c[3] + self.helperProportions.height >= 0) self.position.current.top = c[3] - self.offsets.parent.top - self.helperProportions.height - self.margins.top - borderTop - borderBottom;
     595                        } else {
     596                                if((ui.position.left < c.left)) self.position.current.left = c.left;
     597                                if((ui.position.top < c.top)) self.position.current.top = c.top;
     598                                if(ui.position.left - self.offsetParent.innerWidth() + self.helperProportions.width + c.right + borderLeft + borderRight >= 0) self.position.current.left = self.offsetParent.innerWidth() - self.helperProportions.width - c.right - borderLeft - borderRight;
     599                                if(ui.position.top - self.offsetParent.innerHeight() + self.helperProportions.height + c.bottom + borderTop + borderBottom >= 0) self.position.current.top = self.offsetParent.innerHeight() - self.helperProportions.height - c.bottom - borderTop - borderBottom;
     600                        }
     601
     602                }
     603        });
     604
     605        $.ui.plugin.add("sortable", "axis", {
     606                sort: function(e, ui) {
     607                        var o = ui.options;
     608                        if(o.constraint) o.axis = o.constraint; //Legacy check
     609                        o.axis == 'x' ? ui.instance.position.current.top = ui.instance.originalPosition.top : ui.instance.position.current.left = ui.instance.originalPosition.left;
     610                }
     611        });
     612
     613        $.ui.plugin.add("sortable", "scroll", {
     614                start: function(e, ui) {
     615                        var o = ui.options;
     616                        o.scrollSensitivity     = o.scrollSensitivity || 20;
     617                        o.scrollSpeed           = o.scrollSpeed || 20;
     618
     619                        ui.instance.overflowY = function(el) {
     620                                do { if((/auto|scroll/).test(el.css('overflow')) || (/auto|scroll/).test(el.css('overflow-y'))) return el; el = el.parent(); } while (el[0].parentNode);
     621                                return $(document);
     622                        }(this);
     623                        ui.instance.overflowX = function(el) {
     624                                do { if((/auto|scroll/).test(el.css('overflow')) || (/auto|scroll/).test(el.css('overflow-x'))) return el; el = el.parent(); } while (el[0].parentNode);
     625                                return $(document);
     626                        }(this);
     627                       
     628                        if(ui.instance.overflowY[0] != document && ui.instance.overflowY[0].tagName != 'HTML') ui.instance.overflowYstart = ui.instance.overflowY[0].scrollTop;
     629                        if(ui.instance.overflowX[0] != document && ui.instance.overflowX[0].tagName != 'HTML') ui.instance.overflowXstart = ui.instance.overflowX[0].scrollLeft;
     630                       
     631                },
     632                sort: function(e, ui) {
     633                       
     634                        var o = ui.options;
     635                        var i = ui.instance;
     636
     637                        if(i.overflowY[0] != document && i.overflowY[0].tagName != 'HTML') {
     638                                if(i.overflowY[0].offsetHeight - (ui.position.top - i.overflowY[0].scrollTop + i.clickOffset.top) < o.scrollSensitivity)
     639                                        i.overflowY[0].scrollTop = i.overflowY[0].scrollTop + o.scrollSpeed;
     640                                if((ui.position.top - i.overflowY[0].scrollTop + i.clickOffset.top) < o.scrollSensitivity)
     641                                        i.overflowY[0].scrollTop = i.overflowY[0].scrollTop - o.scrollSpeed;                           
     642                        } else {
     643                                //$(document.body).append('<p>'+(e.pageY - $(document).scrollTop())+'</p>');
     644                                if(e.pageY - $(document).scrollTop() < o.scrollSensitivity)
     645                                        $(document).scrollTop($(document).scrollTop() - o.scrollSpeed);
     646                                if($(window).height() - (e.pageY - $(document).scrollTop()) < o.scrollSensitivity)
     647                                        $(document).scrollTop($(document).scrollTop() + o.scrollSpeed);
     648                        }
     649                       
     650                        if(i.overflowX[0] != document && i.overflowX[0].tagName != 'HTML') {
     651                                if(i.overflowX[0].offsetWidth - (ui.position.left - i.overflowX[0].scrollLeft + i.clickOffset.left) < o.scrollSensitivity)
     652                                        i.overflowX[0].scrollLeft = i.overflowX[0].scrollLeft + o.scrollSpeed;
     653                                if((ui.position.top - i.overflowX[0].scrollLeft + i.clickOffset.left) < o.scrollSensitivity)
     654                                        i.overflowX[0].scrollLeft = i.overflowX[0].scrollLeft - o.scrollSpeed;                         
     655                        } else {
     656                                if(e.pageX - $(document).scrollLeft() < o.scrollSensitivity)
     657                                        $(document).scrollLeft($(document).scrollLeft() - o.scrollSpeed);
     658                                if($(window).width() - (e.pageX - $(document).scrollLeft()) < o.scrollSensitivity)
     659                                        $(document).scrollLeft($(document).scrollLeft() + o.scrollSpeed);
     660                        }
     661                       
     662                        //ui.instance.recallOffset(e);
     663                        i.offset = {
     664                                left: i.mouse.start.left - i.originalPosition.left + (i.overflowXstart !== undefined ? i.overflowXstart - i.overflowX[0].scrollLeft : 0),
     665                                top: i.mouse.start.top - i.originalPosition.top + (i.overflowYstart !== undefined ? i.overflowYstart - i.overflowX[0].scrollTop : 0)
     666                        };
     667
     668                }
     669        });
     670
     671})(jQuery);
  • wp-includes/js/jquery/jquery.js

     
     1(function(){
    12/*
    2  * jQuery 1.2.3 - New Wave Javascript
     3 * jQuery 1.2.5 - New Wave Javascript
    34 *
    45 * Copyright (c) 2008 John Resig (jquery.com)
    56 * Dual licensed under the MIT (MIT-LICENSE.txt)
    67 * and GPL (GPL-LICENSE.txt) licenses.
    78 *
    8  * $Date: 2008-02-06 00:21:25 -0500 (Wed, 06 Feb 2008) $
    9  * $Rev: 4663 $
     9 * $Date: 2008-05-16 11:37:11 -0700 (Fri, 16 May 2008) $
     10 * $Rev: 5623 $
    1011 */
    11 eval(function(p,a,c,k,e,r){e=function(c){return(c<a?'':e(parseInt(c/a)))+((c=c%a)>35?String.fromCharCode(c+29):c.toString(36))};if(!''.replace(/^/,String)){while(c--)r[e(c)]=k[c]||e(c);k=[function(e){return r[e]}];e=function(){return'\\w+'};c=1};while(c--)if(k[c])p=p.replace(new RegExp('\\b'+e(c)+'\\b','g'),k[c]);return p}('(J(){7(1e.3N)L w=1e.3N;L E=1e.3N=J(a,b){K 1B E.2l.4T(a,b)};7(1e.$)L D=1e.$;1e.$=E;L u=/^[^<]*(<(.|\\s)+>)[^>]*$|^#(\\w+)$/;L G=/^.[^:#\\[\\.]*$/;E.1n=E.2l={4T:J(d,b){d=d||T;7(d.15){6[0]=d;6.M=1;K 6}N 7(1o d=="25"){L c=u.2O(d);7(c&&(c[1]||!b)){7(c[1])d=E.4a([c[1]],b);N{L a=T.5J(c[3]);7(a)7(a.2w!=c[3])K E().2s(d);N{6[0]=a;6.M=1;K 6}N d=[]}}N K 1B E(b).2s(d)}N 7(E.1q(d))K 1B E(T)[E.1n.21?"21":"3U"](d);K 6.6E(d.1k==1M&&d||(d.5h||d.M&&d!=1e&&!d.15&&d[0]!=10&&d[0].15)&&E.2I(d)||[d])},5h:"1.2.3",87:J(){K 6.M},M:0,22:J(a){K a==10?E.2I(6):6[a]},2F:J(b){L a=E(b);a.54=6;K a},6E:J(a){6.M=0;1M.2l.1g.1i(6,a);K 6},R:J(a,b){K E.R(6,a,b)},4X:J(b){L a=-1;6.R(J(i){7(6==b)a=i});K a},1J:J(c,a,b){L d=c;7(c.1k==4e)7(a==10)K 6.M&&E[b||"1J"](6[0],c)||10;N{d={};d[c]=a}K 6.R(J(i){Q(c 1p d)E.1J(b?6.W:6,c,E.1l(6,d[c],b,i,c))})},1j:J(b,a){7((b==\'27\'||b==\'1R\')&&2M(a)<0)a=10;K 6.1J(b,a,"2o")},1u:J(b){7(1o b!="3V"&&b!=V)K 6.4x().3t((6[0]&&6[0].2i||T).5r(b));L a="";E.R(b||6,J(){E.R(6.3p,J(){7(6.15!=8)a+=6.15!=1?6.6K:E.1n.1u([6])})});K a},5m:J(b){7(6[0])E(b,6[0].2i).5k().3o(6[0]).2c(J(){L a=6;2b(a.1C)a=a.1C;K a}).3t(6);K 6},8w:J(a){K 6.R(J(){E(6).6z().5m(a)})},8p:J(a){K 6.R(J(){E(6).5m(a)})},3t:J(){K 6.3O(18,P,S,J(a){7(6.15==1)6.38(a)})},6q:J(){K 6.3O(18,P,P,J(a){7(6.15==1)6.3o(a,6.1C)})},6o:J(){K 6.3O(18,S,S,J(a){6.1a.3o(a,6)})},5a:J(){K 6.3O(18,S,P,J(a){6.1a.3o(a,6.2B)})},3h:J(){K 6.54||E([])},2s:J(b){L c=E.2c(6,J(a){K E.2s(b,a)});K 6.2F(/[^+>] [^+>]/.17(b)||b.1f("..")>-1?E.57(c):c)},5k:J(e){L f=6.2c(J(){7(E.14.1d&&!E.3E(6)){L a=6.69(P),4Y=T.3s("1x");4Y.38(a);K E.4a([4Y.3d])[0]}N K 6.69(P)});L d=f.2s("*").4R().R(J(){7(6[F]!=10)6[F]=V});7(e===P)6.2s("*").4R().R(J(i){7(6.15==3)K;L c=E.O(6,"2R");Q(L a 1p c)Q(L b 1p c[a])E.16.1b(d[i],a,c[a][b],c[a][b].O)});K f},1E:J(b){K 6.2F(E.1q(b)&&E.3y(6,J(a,i){K b.1P(a,i)})||E.3e(b,6))},56:J(b){7(b.1k==4e)7(G.17(b))K 6.2F(E.3e(b,6,P));N b=E.3e(b,6);L a=b.M&&b[b.M-1]!==10&&!b.15;K 6.1E(J(){K a?E.33(6,b)<0:6!=b})},1b:J(a){K!a?6:6.2F(E.37(6.22(),a.1k==4e?E(a).22():a.M!=10&&(!a.12||E.12(a,"3u"))?a:[a]))},3H:J(a){K a?E.3e(a,6).M>0:S},7j:J(a){K 6.3H("."+a)},5O:J(b){7(b==10){7(6.M){L c=6[0];7(E.12(c,"2k")){L e=c.3T,5I=[],11=c.11,2X=c.U=="2k-2X";7(e<0)K V;Q(L i=2X?e:0,2f=2X?e+1:11.M;i<2f;i++){L d=11[i];7(d.2p){b=E.14.1d&&!d.9J.1A.9y?d.1u:d.1A;7(2X)K b;5I.1g(b)}}K 5I}N K(6[0].1A||"").1r(/\\r/g,"")}K 10}K 6.R(J(){7(6.15!=1)K;7(b.1k==1M&&/5u|5t/.17(6.U))6.3k=(E.33(6.1A,b)>=0||E.33(6.31,b)>=0);N 7(E.12(6,"2k")){L a=b.1k==1M?b:[b];E("98",6).R(J(){6.2p=(E.33(6.1A,a)>=0||E.33(6.1u,a)>=0)});7(!a.M)6.3T=-1}N 6.1A=b})},3q:J(a){K a==10?(6.M?6[0].3d:V):6.4x().3t(a)},6S:J(a){K 6.5a(a).1V()},6Z:J(i){K 6.2K(i,i+1)},2K:J(){K 6.2F(1M.2l.2K.1i(6,18))},2c:J(b){K 6.2F(E.2c(6,J(a,i){K b.1P(a,i,a)}))},4R:J(){K 6.1b(6.54)},O:J(d,b){L a=d.23(".");a[1]=a[1]?"."+a[1]:"";7(b==V){L c=6.5n("8P"+a[1]+"!",[a[0]]);7(c==10&&6.M)c=E.O(6[0],d);K c==V&&a[1]?6.O(a[0]):c}N K 6.1N("8K"+a[1]+"!",[a[0],b]).R(J(){E.O(6,d,b)})},35:J(a){K 6.R(J(){E.35(6,a)})},3O:J(g,f,h,d){L e=6.M>1,3n;K 6.R(J(){7(!3n){3n=E.4a(g,6.2i);7(h)3n.8D()}L b=6;7(f&&E.12(6,"1O")&&E.12(3n[0],"4v"))b=6.3S("1U")[0]||6.38(6.2i.3s("1U"));L c=E([]);E.R(3n,J(){L a=e?E(6).5k(P)[0]:6;7(E.12(a,"1m")){c=c.1b(a)}N{7(a.15==1)c=c.1b(E("1m",a).1V());d.1P(b,a)}});c.R(6A)})}};E.2l.4T.2l=E.2l;J 6A(i,a){7(a.3Q)E.3P({1c:a.3Q,3l:S,1H:"1m"});N E.5g(a.1u||a.6x||a.3d||"");7(a.1a)a.1a.34(a)}E.1s=E.1n.1s=J(){L b=18[0]||{},i=1,M=18.M,5c=S,11;7(b.1k==8d){5c=b;b=18[1]||{};i=2}7(1o b!="3V"&&1o b!="J")b={};7(M==1){b=6;i=0}Q(;i<M;i++)7((11=18[i])!=V)Q(L a 1p 11){7(b===11[a])6w;7(5c&&11[a]&&1o 11[a]=="3V"&&b[a]&&!11[a].15)b[a]=E.1s(b[a],11[a]);N 7(11[a]!=10)b[a]=11[a]}K b};L F="3N"+(1B 3v()).3L(),6t=0,5b={};L H=/z-?4X|86-?84|1w|6k|7Z-?1R/i;E.1s({7Y:J(a){1e.$=D;7(a)1e.3N=w;K E},1q:J(a){K!!a&&1o a!="25"&&!a.12&&a.1k!=1M&&/J/i.17(a+"")},3E:J(a){K a.1F&&!a.1h||a.28&&a.2i&&!a.2i.1h},5g:J(a){a=E.3g(a);7(a){L b=T.3S("6f")[0]||T.1F,1m=T.3s("1m");1m.U="1u/4m";7(E.14.1d)1m.1u=a;N 1m.38(T.5r(a));b.38(1m);b.34(1m)}},12:J(b,a){K b.12&&b.12.2E()==a.2E()},1T:{},O:J(c,d,b){c=c==1e?5b:c;L a=c[F];7(!a)a=c[F]=++6t;7(d&&!E.1T[a])E.1T[a]={};7(b!=10)E.1T[a][d]=b;K d?E.1T[a][d]:a},35:J(c,b){c=c==1e?5b:c;L a=c[F];7(b){7(E.1T[a]){2V E.1T[a][b];b="";Q(b 1p E.1T[a])1Q;7(!b)E.35(c)}}N{1S{2V c[F]}1X(e){7(c.52)c.52(F)}2V E.1T[a]}},R:J(c,a,b){7(b){7(c.M==10){Q(L d 1p c)7(a.1i(c[d],b)===S)1Q}N Q(L i=0,M=c.M;i<M;i++)7(a.1i(c[i],b)===S)1Q}N{7(c.M==10){Q(L d 1p c)7(a.1P(c[d],d,c[d])===S)1Q}N Q(L i=0,M=c.M,1A=c[0];i<M&&a.1P(1A,i,1A)!==S;1A=c[++i]){}}K c},1l:J(b,a,c,i,d){7(E.1q(a))a=a.1P(b,i);K a&&a.1k==51&&c=="2o"&&!H.17(d)?a+"2S":a},1t:{1b:J(c,b){E.R((b||"").23(/\\s+/),J(i,a){7(c.15==1&&!E.1t.3Y(c.1t,a))c.1t+=(c.1t?" ":"")+a})},1V:J(c,b){7(c.15==1)c.1t=b!=10?E.3y(c.1t.23(/\\s+/),J(a){K!E.1t.3Y(b,a)}).6a(" "):""},3Y:J(b,a){K E.33(a,(b.1t||b).3X().23(/\\s+/))>-1}},68:J(b,c,a){L e={};Q(L d 1p c){e[d]=b.W[d];b.W[d]=c[d]}a.1P(b);Q(L d 1p c)b.W[d]=e[d]},1j:J(d,e,c){7(e=="27"||e=="1R"){L b,46={43:"4W",4U:"1Z",19:"3D"},3c=e=="27"?["7O","7M"]:["7J","7I"];J 5E(){b=e=="27"?d.7H:d.7F;L a=0,2N=0;E.R(3c,J(){a+=2M(E.2o(d,"7E"+6,P))||0;2N+=2M(E.2o(d,"2N"+6+"5X",P))||0});b-=24.7C(a+2N)}7(E(d).3H(":4d"))5E();N E.68(d,46,5E);K 24.2f(0,b)}K E.2o(d,e,c)},2o:J(e,k,j){L d;J 3x(b){7(!E.14.2d)K S;L a=T.4c.4K(b,V);K!a||a.4M("3x")==""}7(k=="1w"&&E.14.1d){d=E.1J(e.W,"1w");K d==""?"1":d}7(E.14.2z&&k=="19"){L c=e.W.50;e.W.50="0 7r 7o";e.W.50=c}7(k.1D(/4g/i))k=y;7(!j&&e.W&&e.W[k])d=e.W[k];N 7(T.4c&&T.4c.4K){7(k.1D(/4g/i))k="4g";k=k.1r(/([A-Z])/g,"-$1").2h();L h=T.4c.4K(e,V);7(h&&!3x(e))d=h.4M(k);N{L f=[],2C=[];Q(L a=e;a&&3x(a);a=a.1a)2C.4J(a);Q(L i=0;i<2C.M;i++)7(3x(2C[i])){f[i]=2C[i].W.19;2C[i].W.19="3D"}d=k=="19"&&f[2C.M-1]!=V?"2H":(h&&h.4M(k))||"";Q(L i=0;i<f.M;i++)7(f[i]!=V)2C[i].W.19=f[i]}7(k=="1w"&&d=="")d="1"}N 7(e.4n){L g=k.1r(/\\-(\\w)/g,J(a,b){K b.2E()});d=e.4n[k]||e.4n[g];7(!/^\\d+(2S)?$/i.17(d)&&/^\\d/.17(d)){L l=e.W.26,3K=e.3K.26;e.3K.26=e.4n.26;e.W.26=d||0;d=e.W.7f+"2S";e.W.26=l;e.3K.26=3K}}K d},4a:J(l,h){L k=[];h=h||T;7(1o h.3s==\'10\')h=h.2i||h[0]&&h[0].2i||T;E.R(l,J(i,d){7(!d)K;7(d.1k==51)d=d.3X();7(1o d=="25"){d=d.1r(/(<(\\w+)[^>]*?)\\/>/g,J(b,a,c){K c.1D(/^(aa|a6|7e|a5|4D|7a|a0|3m|9W|9U|9S)$/i)?b:a+"></"+c+">"});L f=E.3g(d).2h(),1x=h.3s("1x");L e=!f.1f("<9P")&&[1,"<2k 74=\'74\'>","</2k>"]||!f.1f("<9M")&&[1,"<73>","</73>"]||f.1D(/^<(9G|1U|9E|9B|9x)/)&&[1,"<1O>","</1O>"]||!f.1f("<4v")&&[2,"<1O><1U>","</1U></1O>"]||(!f.1f("<9w")||!f.1f("<9v"))&&[3,"<1O><1U><4v>","</4v></1U></1O>"]||!f.1f("<7e")&&[2,"<1O><1U></1U><6V>","</6V></1O>"]||E.14.1d&&[1,"1x<1x>","</1x>"]||[0,"",""];1x.3d=e[1]+d+e[2];2b(e[0]--)1x=1x.5o;7(E.14.1d){L g=!f.1f("<1O")&&f.1f("<1U")<0?1x.1C&&1x.1C.3p:e[1]=="<1O>"&&f.1f("<1U")<0?1x.3p:[];Q(L j=g.M-1;j>=0;--j)7(E.12(g[j],"1U")&&!g[j].3p.M)g[j].1a.34(g[j]);7(/^\\s/.17(d))1x.3o(h.5r(d.1D(/^\\s*/)[0]),1x.1C)}d=E.2I(1x.3p)}7(d.M===0&&(!E.12(d,"3u")&&!E.12(d,"2k")))K;7(d[0]==10||E.12(d,"3u")||d.11)k.1g(d);N k=E.37(k,d)});K k},1J:J(d,e,c){7(!d||d.15==3||d.15==8)K 10;L f=E.3E(d)?{}:E.46;7(e=="2p"&&E.14.2d)d.1a.3T;7(f[e]){7(c!=10)d[f[e]]=c;K d[f[e]]}N 7(E.14.1d&&e=="W")K E.1J(d.W,"9u",c);N 7(c==10&&E.14.1d&&E.12(d,"3u")&&(e=="9r"||e=="9o"))K d.9m(e).6K;N 7(d.28){7(c!=10){7(e=="U"&&E.12(d,"4D")&&d.1a)6Q"U 9i 9h\'t 9g 9e";d.9b(e,""+c)}7(E.14.1d&&/6O|3Q/.17(e)&&!E.3E(d))K d.4z(e,2);K d.4z(e)}N{7(e=="1w"&&E.14.1d){7(c!=10){d.6k=1;d.1E=(d.1E||"").1r(/6M\\([^)]*\\)/,"")+(2M(c).3X()=="96"?"":"6M(1w="+c*6L+")")}K d.1E&&d.1E.1f("1w=")>=0?(2M(d.1E.1D(/1w=([^)]*)/)[1])/6L).3X():""}e=e.1r(/-([a-z])/95,J(a,b){K b.2E()});7(c!=10)d[e]=c;K d[e]}},3g:J(a){K(a||"").1r(/^\\s+|\\s+$/g,"")},2I:J(b){L a=[];7(1o b!="93")Q(L i=0,M=b.M;i<M;i++)a.1g(b[i]);N a=b.2K(0);K a},33:J(b,a){Q(L i=0,M=a.M;i<M;i++)7(a[i]==b)K i;K-1},37:J(a,b){7(E.14.1d){Q(L i=0;b[i];i++)7(b[i].15!=8)a.1g(b[i])}N Q(L i=0;b[i];i++)a.1g(b[i]);K a},57:J(a){L c=[],2r={};1S{Q(L i=0,M=a.M;i<M;i++){L b=E.O(a[i]);7(!2r[b]){2r[b]=P;c.1g(a[i])}}}1X(e){c=a}K c},3y:J(c,a,d){L b=[];Q(L i=0,M=c.M;i<M;i++)7(!d&&a(c[i],i)||d&&!a(c[i],i))b.1g(c[i]);K b},2c:J(d,a){L c=[];Q(L i=0,M=d.M;i<M;i++){L b=a(d[i],i);7(b!==V&&b!=10){7(b.1k!=1M)b=[b];c=c.71(b)}}K c}});L v=8Y.8W.2h();E.14={5K:(v.1D(/.+(?:8T|8S|8R|8O)[\\/: ]([\\d.]+)/)||[])[1],2d:/77/.17(v),2z:/2z/.17(v),1d:/1d/.17(v)&&!/2z/.17(v),48:/48/.17(v)&&!/(8L|77)/.17(v)};L y=E.14.1d?"6H":"75";E.1s({8I:!E.14.1d||T.6F=="79",46:{"Q":"8F","8E":"1t","4g":y,75:y,6H:y,3d:"3d",1t:"1t",1A:"1A",2Y:"2Y",3k:"3k",8C:"8B",2p:"2p",8A:"8z",3T:"3T",6C:"6C",28:"28",12:"12"}});E.R({6B:J(a){K a.1a},8y:J(a){K E.4u(a,"1a")},8x:J(a){K E.2Z(a,2,"2B")},8v:J(a){K E.2Z(a,2,"4t")},8u:J(a){K E.4u(a,"2B")},8t:J(a){K E.4u(a,"4t")},8s:J(a){K E.5i(a.1a.1C,a)},8r:J(a){K E.5i(a.1C)},6z:J(a){K E.12(a,"8q")?a.8o||a.8n.T:E.2I(a.3p)}},J(c,d){E.1n[c]=J(b){L a=E.2c(6,d);7(b&&1o b=="25")a=E.3e(b,a);K 6.2F(E.57(a))}});E.R({6y:"3t",8m:"6q",3o:"6o",8l:"5a",8k:"6S"},J(c,b){E.1n[c]=J(){L a=18;K 6.R(J(){Q(L i=0,M=a.M;i<M;i++)E(a[i])[b](6)})}});E.R({8j:J(a){E.1J(6,a,"");7(6.15==1)6.52(a)},8i:J(a){E.1t.1b(6,a)},8h:J(a){E.1t.1V(6,a)},8g:J(a){E.1t[E.1t.3Y(6,a)?"1V":"1b"](6,a)},1V:J(a){7(!a||E.1E(a,[6]).r.M){E("*",6).1b(6).R(J(){E.16.1V(6);E.35(6)});7(6.1a)6.1a.34(6)}},4x:J(){E(">*",6).1V();2b(6.1C)6.34(6.1C)}},J(a,b){E.1n[a]=J(){K 6.R(b,18)}});E.R(["8f","5X"],J(i,c){L b=c.2h();E.1n[b]=J(a){K 6[0]==1e?E.14.2z&&T.1h["5e"+c]||E.14.2d&&1e["8e"+c]||T.6F=="79"&&T.1F["5e"+c]||T.1h["5e"+c]:6[0]==T?24.2f(24.2f(T.1h["5d"+c],T.1F["5d"+c]),24.2f(T.1h["5L"+c],T.1F["5L"+c])):a==10?(6.M?E.1j(6[0],b):V):6.1j(b,a.1k==4e?a:a+"2S")}});L C=E.14.2d&&4s(E.14.5K)<8c?"(?:[\\\\w*4r-]|\\\\\\\\.)":"(?:[\\\\w\\8b-\\8a*4r-]|\\\\\\\\.)",6v=1B 4q("^>\\\\s*("+C+"+)"),6u=1B 4q("^("+C+"+)(#)("+C+"+)"),6s=1B 4q("^([#.]?)("+C+"*)");E.1s({6r:{"":J(a,i,m){K m[2]=="*"||E.12(a,m[2])},"#":J(a,i,m){K a.4z("2w")==m[2]},":":{89:J(a,i,m){K i<m[3]-0},88:J(a,i,m){K i>m[3]-0},2Z:J(a,i,m){K m[3]-0==i},6Z:J(a,i,m){K m[3]-0==i},3j:J(a,i){K i==0},3J:J(a,i,m,r){K i==r.M-1},6n:J(a,i){K i%2==0},6l:J(a,i){K i%2},"3j-4p":J(a){K a.1a.3S("*")[0]==a},"3J-4p":J(a){K E.2Z(a.1a.5o,1,"4t")==a},"83-4p":J(a){K!E.2Z(a.1a.5o,2,"4t")},6B:J(a){K a.1C},4x:J(a){K!a.1C},82:J(a,i,m){K(a.6x||a.81||E(a).1u()||"").1f(m[3])>=0},4d:J(a){K"1Z"!=a.U&&E.1j(a,"19")!="2H"&&E.1j(a,"4U")!="1Z"},1Z:J(a){K"1Z"==a.U||E.1j(a,"19")=="2H"||E.1j(a,"4U")=="1Z"},80:J(a){K!a.2Y},2Y:J(a){K a.2Y},3k:J(a){K a.3k},2p:J(a){K a.2p||E.1J(a,"2p")},1u:J(a){K"1u"==a.U},5u:J(a){K"5u"==a.U},5t:J(a){K"5t"==a.U},59:J(a){K"59"==a.U},3I:J(a){K"3I"==a.U},58:J(a){K"58"==a.U},6j:J(a){K"6j"==a.U},6i:J(a){K"6i"==a.U},2G:J(a){K"2G"==a.U||E.12(a,"2G")},4D:J(a){K/4D|2k|6h|2G/i.17(a.12)},3Y:J(a,i,m){K E.2s(m[3],a).M},7X:J(a){K/h\\d/i.17(a.12)},7W:J(a){K E.3y(E.3G,J(b){K a==b.Y}).M}}},6g:[/^(\\[) *@?([\\w-]+) *([!*$^~=]*) *(\'?"?)(.*?)\\4 *\\]/,/^(:)([\\w-]+)\\("?\'?(.*?(\\(.*?\\))?[^(]*?)"?\'?\\)/,1B 4q("^([:.#]*)("+C+"+)")],3e:J(a,c,b){L d,2m=[];2b(a&&a!=d){d=a;L f=E.1E(a,c,b);a=f.t.1r(/^\\s*,\\s*/,"");2m=b?c=f.r:E.37(2m,f.r)}K 2m},2s:J(t,p){7(1o t!="25")K[t];7(p&&p.15!=1&&p.15!=9)K[];p=p||T;L d=[p],2r=[],3J,12;2b(t&&3J!=t){L r=[];3J=t;t=E.3g(t);L o=S;L g=6v;L m=g.2O(t);7(m){12=m[1].2E();Q(L i=0;d[i];i++)Q(L c=d[i].1C;c;c=c.2B)7(c.15==1&&(12=="*"||c.12.2E()==12))r.1g(c);d=r;t=t.1r(g,"");7(t.1f(" ")==0)6w;o=P}N{g=/^([>+~])\\s*(\\w*)/i;7((m=g.2O(t))!=V){r=[];L l={};12=m[2].2E();m=m[1];Q(L j=0,3f=d.M;j<3f;j++){L n=m=="~"||m=="+"?d[j].2B:d[j].1C;Q(;n;n=n.2B)7(n.15==1){L h=E.O(n);7(m=="~"&&l[h])1Q;7(!12||n.12.2E()==12){7(m=="~")l[h]=P;r.1g(n)}7(m=="+")1Q}}d=r;t=E.3g(t.1r(g,""));o=P}}7(t&&!o){7(!t.1f(",")){7(p==d[0])d.4l();2r=E.37(2r,d);r=d=[p];t=" "+t.6e(1,t.M)}N{L k=6u;L m=k.2O(t);7(m){m=[0,m[2],m[3],m[1]]}N{k=6s;m=k.2O(t)}m[2]=m[2].1r(/\\\\/g,"");L f=d[d.M-1];7(m[1]=="#"&&f&&f.5J&&!E.3E(f)){L q=f.5J(m[2]);7((E.14.1d||E.14.2z)&&q&&1o q.2w=="25"&&q.2w!=m[2])q=E(\'[@2w="\'+m[2]+\'"]\',f)[0];d=r=q&&(!m[3]||E.12(q,m[3]))?[q]:[]}N{Q(L i=0;d[i];i++){L a=m[1]=="#"&&m[3]?m[3]:m[1]!=""||m[0]==""?"*":m[2];7(a=="*"&&d[i].12.2h()=="3V")a="3m";r=E.37(r,d[i].3S(a))}7(m[1]==".")r=E.55(r,m[2]);7(m[1]=="#"){L e=[];Q(L i=0;r[i];i++)7(r[i].4z("2w")==m[2]){e=[r[i]];1Q}r=e}d=r}t=t.1r(k,"")}}7(t){L b=E.1E(t,r);d=r=b.r;t=E.3g(b.t)}}7(t)d=[];7(d&&p==d[0])d.4l();2r=E.37(2r,d);K 2r},55:J(r,m,a){m=" "+m+" ";L c=[];Q(L i=0;r[i];i++){L b=(" "+r[i].1t+" ").1f(m)>=0;7(!a&&b||a&&!b)c.1g(r[i])}K c},1E:J(t,r,h){L d;2b(t&&t!=d){d=t;L p=E.6g,m;Q(L i=0;p[i];i++){m=p[i].2O(t);7(m){t=t.7V(m[0].M);m[2]=m[2].1r(/\\\\/g,"");1Q}}7(!m)1Q;7(m[1]==":"&&m[2]=="56")r=G.17(m[3])?E.1E(m[3],r,P).r:E(r).56(m[3]);N 7(m[1]==".")r=E.55(r,m[2],h);N 7(m[1]=="["){L g=[],U=m[3];Q(L i=0,3f=r.M;i<3f;i++){L a=r[i],z=a[E.46[m[2]]||m[2]];7(z==V||/6O|3Q|2p/.17(m[2]))z=E.1J(a,m[2])||\'\';7((U==""&&!!z||U=="="&&z==m[5]||U=="!="&&z!=m[5]||U=="^="&&z&&!z.1f(m[5])||U=="$="&&z.6e(z.M-m[5].M)==m[5]||(U=="*="||U=="~=")&&z.1f(m[5])>=0)^h)g.1g(a)}r=g}N 7(m[1]==":"&&m[2]=="2Z-4p"){L e={},g=[],17=/(-?)(\\d*)n((?:\\+|-)?\\d*)/.2O(m[3]=="6n"&&"2n"||m[3]=="6l"&&"2n+1"||!/\\D/.17(m[3])&&"7U+"+m[3]||m[3]),3j=(17[1]+(17[2]||1))-0,d=17[3]-0;Q(L i=0,3f=r.M;i<3f;i++){L j=r[i],1a=j.1a,2w=E.O(1a);7(!e[2w]){L c=1;Q(L n=1a.1C;n;n=n.2B)7(n.15==1)n.4k=c++;e[2w]=P}L b=S;7(3j==0){7(j.4k==d)b=P}N 7((j.4k-d)%3j==0&&(j.4k-d)/3j>=0)b=P;7(b^h)g.1g(j)}r=g}N{L f=E.6r[m[1]];7(1o f=="3V")f=f[m[2]];7(1o f=="25")f=6c("S||J(a,i){K "+f+";}");r=E.3y(r,J(a,i){K f(a,i,m,r)},h)}}K{r:r,t:t}},4u:J(b,c){L d=[];L a=b[c];2b(a&&a!=T){7(a.15==1)d.1g(a);a=a[c]}K d},2Z:J(a,e,c,b){e=e||1;L d=0;Q(;a;a=a[c])7(a.15==1&&++d==e)1Q;K a},5i:J(n,a){L r=[];Q(;n;n=n.2B){7(n.15==1&&(!a||n!=a))r.1g(n)}K r}});E.16={1b:J(f,i,g,e){7(f.15==3||f.15==8)K;7(E.14.1d&&f.53!=10)f=1e;7(!g.2D)g.2D=6.2D++;7(e!=10){L h=g;g=J(){K h.1i(6,18)};g.O=e;g.2D=h.2D}L j=E.O(f,"2R")||E.O(f,"2R",{}),1v=E.O(f,"1v")||E.O(f,"1v",J(){L a;7(1o E=="10"||E.16.5f)K a;a=E.16.1v.1i(18.3R.Y,18);K a});1v.Y=f;E.R(i.23(/\\s+/),J(c,b){L a=b.23(".");b=a[0];g.U=a[1];L d=j[b];7(!d){d=j[b]={};7(!E.16.2y[b]||E.16.2y[b].4j.1P(f)===S){7(f.3F)f.3F(b,1v,S);N 7(f.6b)f.6b("4i"+b,1v)}}d[g.2D]=g;E.16.2a[b]=P});f=V},2D:1,2a:{},1V:J(e,h,f){7(e.15==3||e.15==8)K;L i=E.O(e,"2R"),29,4X;7(i){7(h==10||(1o h=="25"&&h.7T(0)=="."))Q(L g 1p i)6.1V(e,g+(h||""));N{7(h.U){f=h.2q;h=h.U}E.R(h.23(/\\s+/),J(b,a){L c=a.23(".");a=c[0];7(i[a]){7(f)2V i[a][f.2D];N Q(f 1p i[a])7(!c[1]||i[a][f].U==c[1])2V i[a][f];Q(29 1p i[a])1Q;7(!29){7(!E.16.2y[a]||E.16.2y[a].4h.1P(e)===S){7(e.67)e.67(a,E.O(e,"1v"),S);N 7(e.66)e.66("4i"+a,E.O(e,"1v"))}29=V;2V i[a]}}})}Q(29 1p i)1Q;7(!29){L d=E.O(e,"1v");7(d)d.Y=V;E.35(e,"2R");E.35(e,"1v")}}},1N:J(g,c,d,f,h){c=E.2I(c||[]);7(g.1f("!")>=0){g=g.2K(0,-1);L a=P}7(!d){7(6.2a[g])E("*").1b([1e,T]).1N(g,c)}N{7(d.15==3||d.15==8)K 10;L b,29,1n=E.1q(d[g]||V),16=!c[0]||!c[0].36;7(16)c.4J(6.4Z({U:g,2L:d}));c[0].U=g;7(a)c[0].65=P;7(E.1q(E.O(d,"1v")))b=E.O(d,"1v").1i(d,c);7(!1n&&d["4i"+g]&&d["4i"+g].1i(d,c)===S)b=S;7(16)c.4l();7(h&&E.1q(h)){29=h.1i(d,b==V?c:c.71(b));7(29!==10)b=29}7(1n&&f!==S&&b!==S&&!(E.12(d,\'a\')&&g=="4V")){6.5f=P;1S{d[g]()}1X(e){}}6.5f=S}K b},1v:J(c){L a;c=E.16.4Z(c||1e.16||{});L b=c.U.23(".");c.U=b[0];L f=E.O(6,"2R")&&E.O(6,"2R")[c.U],42=1M.2l.2K.1P(18,1);42.4J(c);Q(L j 1p f){L d=f[j];42[0].2q=d;42[0].O=d.O;7(!b[1]&&!c.65||d.U==b[1]){L e=d.1i(6,42);7(a!==S)a=e;7(e===S){c.36();c.44()}}}7(E.14.1d)c.2L=c.36=c.44=c.2q=c.O=V;K a},4Z:J(c){L a=c;c=E.1s({},a);c.36=J(){7(a.36)a.36();a.7S=S};c.44=J(){7(a.44)a.44();a.7R=P};7(!c.2L)c.2L=c.7Q||T;7(c.2L.15==3)c.2L=a.2L.1a;7(!c.4S&&c.5w)c.4S=c.5w==c.2L?c.7P:c.5w;7(c.64==V&&c.63!=V){L b=T.1F,1h=T.1h;c.64=c.63+(b&&b.2v||1h&&1h.2v||0)-(b.62||0);c.7N=c.7L+(b&&b.2x||1h&&1h.2x||0)-(b.60||0)}7(!c.3c&&((c.4f||c.4f===0)?c.4f:c.5Z))c.3c=c.4f||c.5Z;7(!c.7b&&c.5Y)c.7b=c.5Y;7(!c.3c&&c.2G)c.3c=(c.2G&1?1:(c.2G&2?3:(c.2G&4?2:0)));K c},2y:{21:{4j:J(){5M();K},4h:J(){K}},3C:{4j:J(){7(E.14.1d)K S;E(6).2j("4P",E.16.2y.3C.2q);K P},4h:J(){7(E.14.1d)K S;E(6).3w("4P",E.16.2y.3C.2q);K P},2q:J(a){7(I(a,6))K P;18[0].U="3C";K E.16.1v.1i(6,18)}},3B:{4j:J(){7(E.14.1d)K S;E(6).2j("4O",E.16.2y.3B.2q);K P},4h:J(){7(E.14.1d)K S;E(6).3w("4O",E.16.2y.3B.2q);K P},2q:J(a){7(I(a,6))K P;18[0].U="3B";K E.16.1v.1i(6,18)}}}};E.1n.1s({2j:J(c,a,b){K c=="4H"?6.2X(c,a,b):6.R(J(){E.16.1b(6,c,b||a,b&&a)})},2X:J(d,b,c){K 6.R(J(){E.16.1b(6,d,J(a){E(6).3w(a);K(c||b).1i(6,18)},c&&b)})},3w:J(a,b){K 6.R(J(){E.16.1V(6,a,b)})},1N:J(c,a,b){K 6.R(J(){E.16.1N(c,a,6,P,b)})},5n:J(c,a,b){7(6[0])K E.16.1N(c,a,6[0],S,b);K 10},2g:J(){L b=18;K 6.4V(J(a){6.4N=0==6.4N?1:0;a.36();K b[6.4N].1i(6,18)||S})},7D:J(a,b){K 6.2j(\'3C\',a).2j(\'3B\',b)},21:J(a){5M();7(E.2Q)a.1P(T,E);N E.3A.1g(J(){K a.1P(6,E)});K 6}});E.1s({2Q:S,3A:[],21:J(){7(!E.2Q){E.2Q=P;7(E.3A){E.R(E.3A,J(){6.1i(T)});E.3A=V}E(T).5n("21")}}});L x=S;J 5M(){7(x)K;x=P;7(T.3F&&!E.14.2z)T.3F("5W",E.21,S);7(E.14.1d&&1e==3b)(J(){7(E.2Q)K;1S{T.1F.7B("26")}1X(3a){3z(18.3R,0);K}E.21()})();7(E.14.2z)T.3F("5W",J(){7(E.2Q)K;Q(L i=0;i<T.4L.M;i++)7(T.4L[i].2Y){3z(18.3R,0);K}E.21()},S);7(E.14.2d){L a;(J(){7(E.2Q)K;7(T.39!="5V"&&T.39!="1y"){3z(18.3R,0);K}7(a===10)a=E("W, 7a[7A=7z]").M;7(T.4L.M!=a){3z(18.3R,0);K}E.21()})()}E.16.1b(1e,"3U",E.21)}E.R(("7y,7x,3U,7w,5d,4H,4V,7v,"+"7G,7u,7t,4P,4O,7s,2k,"+"58,7K,7q,7p,3a").23(","),J(i,b){E.1n[b]=J(a){K a?6.2j(b,a):6.1N(b)}});L I=J(a,c){L b=a.4S;2b(b&&b!=c)1S{b=b.1a}1X(3a){b=c}K b==c};E(1e).2j("4H",J(){E("*").1b(T).3w()});E.1n.1s({3U:J(g,d,c){7(E.1q(g))K 6.2j("3U",g);L e=g.1f(" ");7(e>=0){L i=g.2K(e,g.M);g=g.2K(0,e)}c=c||J(){};L f="4Q";7(d)7(E.1q(d)){c=d;d=V}N{d=E.3m(d);f="61"}L h=6;E.3P({1c:g,U:f,1H:"3q",O:d,1y:J(a,b){7(b=="1W"||b=="5U")h.3q(i?E("<1x/>").3t(a.4b.1r(/<1m(.|\\s)*?\\/1m>/g,"")).2s(i):a.4b);h.R(c,[a.4b,b,a])}});K 6},7n:J(){K E.3m(6.5T())},5T:J(){K 6.2c(J(){K E.12(6,"3u")?E.2I(6.7m):6}).1E(J(){K 6.31&&!6.2Y&&(6.3k||/2k|6h/i.17(6.12)||/1u|1Z|3I/i.17(6.U))}).2c(J(i,c){L b=E(6).5O();K b==V?V:b.1k==1M?E.2c(b,J(a,i){K{31:c.31,1A:a}}):{31:c.31,1A:b}}).22()}});E.R("5S,6d,5R,6D,5Q,6m".23(","),J(i,o){E.1n[o]=J(f){K 6.2j(o,f)}});L B=(1B 3v).3L();E.1s({22:J(d,b,a,c){7(E.1q(b)){a=b;b=V}K E.3P({U:"4Q",1c:d,O:b,1W:a,1H:c})},7l:J(b,a){K E.22(b,V,a,"1m")},7k:J(c,b,a){K E.22(c,b,a,"3i")},7i:J(d,b,a,c){7(E.1q(b)){a=b;b={}}K E.3P({U:"61",1c:d,O:b,1W:a,1H:c})},85:J(a){E.1s(E.4I,a)},4I:{2a:P,U:"4Q",2U:0,5P:"4o/x-7h-3u-7g",5N:P,3l:P,O:V,6p:V,3I:V,49:{3M:"4o/3M, 1u/3M",3q:"1u/3q",1m:"1u/4m, 4o/4m",3i:"4o/3i, 1u/4m",1u:"1u/a7",4G:"*/*"}},4F:{},3P:J(s){L f,2W=/=\\?(&|$)/g,1z,O;s=E.1s(P,s,E.1s(P,{},E.4I,s));7(s.O&&s.5N&&1o s.O!="25")s.O=E.3m(s.O);7(s.1H=="4E"){7(s.U.2h()=="22"){7(!s.1c.1D(2W))s.1c+=(s.1c.1D(/\\?/)?"&":"?")+(s.4E||"7d")+"=?"}N 7(!s.O||!s.O.1D(2W))s.O=(s.O?s.O+"&":"")+(s.4E||"7d")+"=?";s.1H="3i"}7(s.1H=="3i"&&(s.O&&s.O.1D(2W)||s.1c.1D(2W))){f="4E"+B++;7(s.O)s.O=(s.O+"").1r(2W,"="+f+"$1");s.1c=s.1c.1r(2W,"="+f+"$1");s.1H="1m";1e[f]=J(a){O=a;1W();1y();1e[f]=10;1S{2V 1e[f]}1X(e){}7(h)h.34(g)}}7(s.1H=="1m"&&s.1T==V)s.1T=S;7(s.1T===S&&s.U.2h()=="22"){L i=(1B 3v()).3L();L j=s.1c.1r(/(\\?|&)4r=.*?(&|$)/,"$a4="+i+"$2");s.1c=j+((j==s.1c)?(s.1c.1D(/\\?/)?"&":"?")+"4r="+i:"")}7(s.O&&s.U.2h()=="22"){s.1c+=(s.1c.1D(/\\?/)?"&":"?")+s.O;s.O=V}7(s.2a&&!E.5H++)E.16.1N("5S");7((!s.1c.1f("a3")||!s.1c.1f("//"))&&s.1H=="1m"&&s.U.2h()=="22"){L h=T.3S("6f")[0];L g=T.3s("1m");g.3Q=s.1c;7(s.7c)g.a2=s.7c;7(!f){L l=S;g.9Z=g.9Y=J(){7(!l&&(!6.39||6.39=="5V"||6.39=="1y")){l=P;1W();1y();h.34(g)}}}h.38(g);K 10}L m=S;L k=1e.78?1B 78("9X.9V"):1B 76();k.9T(s.U,s.1c,s.3l,s.6p,s.3I);1S{7(s.O)k.4C("9R-9Q",s.5P);7(s.5C)k.4C("9O-5A-9N",E.4F[s.1c]||"9L, 9K 9I 9H 5z:5z:5z 9F");k.4C("X-9C-9A","76");k.4C("9z",s.1H&&s.49[s.1H]?s.49[s.1H]+", */*":s.49.4G)}1X(e){}7(s.6Y)s.6Y(k);7(s.2a)E.16.1N("6m",[k,s]);L c=J(a){7(!m&&k&&(k.39==4||a=="2U")){m=P;7(d){6I(d);d=V}1z=a=="2U"&&"2U"||!E.6X(k)&&"3a"||s.5C&&E.6J(k,s.1c)&&"5U"||"1W";7(1z=="1W"){1S{O=E.6W(k,s.1H)}1X(e){1z="5x"}}7(1z=="1W"){L b;1S{b=k.5q("6U-5A")}1X(e){}7(s.5C&&b)E.4F[s.1c]=b;7(!f)1W()}N E.5v(s,k,1z);1y();7(s.3l)k=V}};7(s.3l){L d=53(c,13);7(s.2U>0)3z(J(){7(k){k.9t();7(!m)c("2U")}},s.2U)}1S{k.9s(s.O)}1X(e){E.5v(s,k,V,e)}7(!s.3l)c();J 1W(){7(s.1W)s.1W(O,1z);7(s.2a)E.16.1N("5Q",[k,s])}J 1y(){7(s.1y)s.1y(k,1z);7(s.2a)E.16.1N("5R",[k,s]);7(s.2a&&!--E.5H)E.16.1N("6d")}K k},5v:J(s,a,b,e){7(s.3a)s.3a(a,b,e);7(s.2a)E.16.1N("6D",[a,s,e])},5H:0,6X:J(r){1S{K!r.1z&&9q.9p=="59:"||(r.1z>=6T&&r.1z<9n)||r.1z==6R||r.1z==9l||E.14.2d&&r.1z==10}1X(e){}K S},6J:J(a,c){1S{L b=a.5q("6U-5A");K a.1z==6R||b==E.4F[c]||E.14.2d&&a.1z==10}1X(e){}K S},6W:J(r,b){L c=r.5q("9k-U");L d=b=="3M"||!b&&c&&c.1f("3M")>=0;L a=d?r.9j:r.4b;7(d&&a.1F.28=="5x")6Q"5x";7(b=="1m")E.5g(a);7(b=="3i")a=6c("("+a+")");K a},3m:J(a){L s=[];7(a.1k==1M||a.5h)E.R(a,J(){s.1g(3r(6.31)+"="+3r(6.1A))});N Q(L j 1p a)7(a[j]&&a[j].1k==1M)E.R(a[j],J(){s.1g(3r(j)+"="+3r(6))});N s.1g(3r(j)+"="+3r(a[j]));K s.6a("&").1r(/%20/g,"+")}});E.1n.1s({1G:J(c,b){K c?6.2e({1R:"1G",27:"1G",1w:"1G"},c,b):6.1E(":1Z").R(J(){6.W.19=6.5s||"";7(E.1j(6,"19")=="2H"){L a=E("<"+6.28+" />").6y("1h");6.W.19=a.1j("19");7(6.W.19=="2H")6.W.19="3D";a.1V()}}).3h()},1I:J(b,a){K b?6.2e({1R:"1I",27:"1I",1w:"1I"},b,a):6.1E(":4d").R(J(){6.5s=6.5s||E.1j(6,"19");6.W.19="2H"}).3h()},6N:E.1n.2g,2g:J(a,b){K E.1q(a)&&E.1q(b)?6.6N(a,b):a?6.2e({1R:"2g",27:"2g",1w:"2g"},a,b):6.R(J(){E(6)[E(6).3H(":1Z")?"1G":"1I"]()})},9f:J(b,a){K 6.2e({1R:"1G"},b,a)},9d:J(b,a){K 6.2e({1R:"1I"},b,a)},9c:J(b,a){K 6.2e({1R:"2g"},b,a)},9a:J(b,a){K 6.2e({1w:"1G"},b,a)},99:J(b,a){K 6.2e({1w:"1I"},b,a)},97:J(c,a,b){K 6.2e({1w:a},c,b)},2e:J(l,k,j,h){L i=E.6P(k,j,h);K 6[i.2P===S?"R":"2P"](J(){7(6.15!=1)K S;L g=E.1s({},i);L f=E(6).3H(":1Z"),4A=6;Q(L p 1p l){7(l[p]=="1I"&&f||l[p]=="1G"&&!f)K E.1q(g.1y)&&g.1y.1i(6);7(p=="1R"||p=="27"){g.19=E.1j(6,"19");g.32=6.W.32}}7(g.32!=V)6.W.32="1Z";g.40=E.1s({},l);E.R(l,J(c,a){L e=1B E.2t(4A,g,c);7(/2g|1G|1I/.17(a))e[a=="2g"?f?"1G":"1I":a](l);N{L b=a.3X().1D(/^([+-]=)?([\\d+-.]+)(.*)$/),1Y=e.2m(P)||0;7(b){L d=2M(b[2]),2A=b[3]||"2S";7(2A!="2S"){4A.W[c]=(d||1)+2A;1Y=((d||1)/e.2m(P))*1Y;4A.W[c]=1Y+2A}7(b[1])d=((b[1]=="-="?-1:1)*d)+1Y;e.45(1Y,d,2A)}N e.45(1Y,a,"")}});K P})},2P:J(a,b){7(E.1q(a)||(a&&a.1k==1M)){b=a;a="2t"}7(!a||(1o a=="25"&&!b))K A(6[0],a);K 6.R(J(){7(b.1k==1M)A(6,a,b);N{A(6,a).1g(b);7(A(6,a).M==1)b.1i(6)}})},94:J(b,c){L a=E.3G;7(b)6.2P([]);6.R(J(){Q(L i=a.M-1;i>=0;i--)7(a[i].Y==6){7(c)a[i](P);a.72(i,1)}});7(!c)6.5p();K 6}});L A=J(b,c,a){7(!b)K 10;c=c||"2t";L q=E.O(b,c+"2P");7(!q||a)q=E.O(b,c+"2P",a?E.2I(a):[]);K q};E.1n.5p=J(a){a=a||"2t";K 6.R(J(){L q=A(6,a);q.4l();7(q.M)q[0].1i(6)})};E.1s({6P:J(b,a,c){L d=b&&b.1k==92?b:{1y:c||!c&&a||E.1q(b)&&b,2u:b,3Z:c&&a||a&&a.1k!=91&&a};d.2u=(d.2u&&d.2u.1k==51?d.2u:{90:8Z,9D:6T}[d.2u])||8X;d.5y=d.1y;d.1y=J(){7(d.2P!==S)E(6).5p();7(E.1q(d.5y))d.5y.1i(6)};K d},3Z:{70:J(p,n,b,a){K b+a*p},5j:J(p,n,b,a){K((-24.8V(p*24.8U)/2)+0.5)*a+b}},3G:[],3W:V,2t:J(b,c,a){6.11=c;6.Y=b;6.1l=a;7(!c.47)c.47={}}});E.2t.2l={4y:J(){7(6.11.30)6.11.30.1i(6.Y,[6.2J,6]);(E.2t.30[6.1l]||E.2t.30.4G)(6);7(6.1l=="1R"||6.1l=="27")6.Y.W.19="3D"},2m:J(a){7(6.Y[6.1l]!=V&&6.Y.W[6.1l]==V)K 6.Y[6.1l];L r=2M(E.1j(6.Y,6.1l,a));K r&&r>-8Q?r:2M(E.2o(6.Y,6.1l))||0},45:J(c,b,d){6.5B=(1B 3v()).3L();6.1Y=c;6.3h=b;6.2A=d||6.2A||"2S";6.2J=6.1Y;6.4B=6.4w=0;6.4y();L e=6;J t(a){K e.30(a)}t.Y=6.Y;E.3G.1g(t);7(E.3W==V){E.3W=53(J(){L a=E.3G;Q(L i=0;i<a.M;i++)7(!a[i]())a.72(i--,1);7(!a.M){6I(E.3W);E.3W=V}},13)}},1G:J(){6.11.47[6.1l]=E.1J(6.Y.W,6.1l);6.11.1G=P;6.45(0,6.2m());7(6.1l=="27"||6.1l=="1R")6.Y.W[6.1l]="8N";E(6.Y).1G()},1I:J(){6.11.47[6.1l]=E.1J(6.Y.W,6.1l);6.11.1I=P;6.45(6.2m(),0)},30:J(a){L t=(1B 3v()).3L();7(a||t>6.11.2u+6.5B){6.2J=6.3h;6.4B=6.4w=1;6.4y();6.11.40[6.1l]=P;L b=P;Q(L i 1p 6.11.40)7(6.11.40[i]!==P)b=S;7(b){7(6.11.19!=V){6.Y.W.32=6.11.32;6.Y.W.19=6.11.19;7(E.1j(6.Y,"19")=="2H")6.Y.W.19="3D"}7(6.11.1I)6.Y.W.19="2H";7(6.11.1I||6.11.1G)Q(L p 1p 6.11.40)E.1J(6.Y.W,p,6.11.47[p])}7(b&&E.1q(6.11.1y))6.11.1y.1i(6.Y);K S}N{L n=t-6.5B;6.4w=n/6.11.2u;6.4B=E.3Z[6.11.3Z||(E.3Z.5j?"5j":"70")](6.4w,n,0,1,6.11.2u);6.2J=6.1Y+((6.3h-6.1Y)*6.4B);6.4y()}K P}};E.2t.30={2v:J(a){a.Y.2v=a.2J},2x:J(a){a.Y.2x=a.2J},1w:J(a){E.1J(a.Y.W,"1w",a.2J)},4G:J(a){a.Y.W[a.1l]=a.2J+a.2A}};E.1n.5L=J(){L b=0,3b=0,Y=6[0],5l;7(Y)8M(E.14){L d=Y.1a,41=Y,1K=Y.1K,1L=Y.2i,5D=2d&&4s(5K)<8J&&!/a1/i.17(v),2T=E.1j(Y,"43")=="2T";7(Y.6G){L c=Y.6G();1b(c.26+24.2f(1L.1F.2v,1L.1h.2v),c.3b+24.2f(1L.1F.2x,1L.1h.2x));1b(-1L.1F.62,-1L.1F.60)}N{1b(Y.5G,Y.5F);2b(1K){1b(1K.5G,1K.5F);7(48&&!/^t(8H|d|h)$/i.17(1K.28)||2d&&!5D)2N(1K);7(!2T&&E.1j(1K,"43")=="2T")2T=P;41=/^1h$/i.17(1K.28)?41:1K;1K=1K.1K}2b(d&&d.28&&!/^1h|3q$/i.17(d.28)){7(!/^8G|1O.*$/i.17(E.1j(d,"19")))1b(-d.2v,-d.2x);7(48&&E.1j(d,"32")!="4d")2N(d);d=d.1a}7((5D&&(2T||E.1j(41,"43")=="4W"))||(48&&E.1j(41,"43")!="4W"))1b(-1L.1h.5G,-1L.1h.5F);7(2T)1b(24.2f(1L.1F.2v,1L.1h.2v),24.2f(1L.1F.2x,1L.1h.2x))}5l={3b:3b,26:b}}J 2N(a){1b(E.2o(a,"a8",P),E.2o(a,"a9",P))}J 1b(l,t){b+=4s(l)||0;3b+=4s(t)||0}K 5l}})();',62,631,'||||||this|if||||||||||||||||||||||||||||||||||||||function|return|var|length|else|data|true|for|each|false|document|type|null|style||elem||undefined|options|nodeName||browser|nodeType|event|test|arguments|display|parentNode|add|url|msie|window|indexOf|push|body|apply|css|constructor|prop|script|fn|typeof|in|isFunction|replace|extend|className|text|handle|opacity|div|complete|status|value|new|firstChild|match|filter|documentElement|show|dataType|hide|attr|offsetParent|doc|Array|trigger|table|call|break|height|try|cache|tbody|remove|success|catch|start|hidden||ready|get|split|Math|string|left|width|tagName|ret|global|while|map|safari|animate|max|toggle|toLowerCase|ownerDocument|bind|select|prototype|cur||curCSS|selected|handler|done|find|fx|duration|scrollLeft|id|scrollTop|special|opera|unit|nextSibling|stack|guid|toUpperCase|pushStack|button|none|makeArray|now|slice|target|parseFloat|border|exec|queue|isReady|events|px|fixed|timeout|delete|jsre|one|disabled|nth|step|name|overflow|inArray|removeChild|removeData|preventDefault|merge|appendChild|readyState|error|top|which|innerHTML|multiFilter|rl|trim|end|json|first|checked|async|param|elems|insertBefore|childNodes|html|encodeURIComponent|createElement|append|form|Date|unbind|color|grep|setTimeout|readyList|mouseleave|mouseenter|block|isXMLDoc|addEventListener|timers|is|password|last|runtimeStyle|getTime|xml|jQuery|domManip|ajax|src|callee|getElementsByTagName|selectedIndex|load|object|timerId|toString|has|easing|curAnim|offsetChild|args|position|stopPropagation|custom|props|orig|mozilla|accepts|clean|responseText|defaultView|visible|String|charCode|float|teardown|on|setup|nodeIndex|shift|javascript|currentStyle|application|child|RegExp|_|parseInt|previousSibling|dir|tr|state|empty|update|getAttribute|self|pos|setRequestHeader|input|jsonp|lastModified|_default|unload|ajaxSettings|unshift|getComputedStyle|styleSheets|getPropertyValue|lastToggle|mouseout|mouseover|GET|andSelf|relatedTarget|init|visibility|click|absolute|index|container|fix|outline|Number|removeAttribute|setInterval|prevObject|classFilter|not|unique|submit|file|after|windowData|deep|scroll|client|triggered|globalEval|jquery|sibling|swing|clone|results|wrapAll|triggerHandler|lastChild|dequeue|getResponseHeader|createTextNode|oldblock|checkbox|radio|handleError|fromElement|parsererror|old|00|Modified|startTime|ifModified|safari2|getWH|offsetTop|offsetLeft|active|values|getElementById|version|offset|bindReady|processData|val|contentType|ajaxSuccess|ajaxComplete|ajaxStart|serializeArray|notmodified|loaded|DOMContentLoaded|Width|ctrlKey|keyCode|clientTop|POST|clientLeft|clientX|pageX|exclusive|detachEvent|removeEventListener|swap|cloneNode|join|attachEvent|eval|ajaxStop|substr|head|parse|textarea|reset|image|zoom|odd|ajaxSend|even|before|username|prepend|expr|quickClass|uuid|quickID|quickChild|continue|textContent|appendTo|contents|evalScript|parent|defaultValue|ajaxError|setArray|compatMode|getBoundingClientRect|styleFloat|clearInterval|httpNotModified|nodeValue|100|alpha|_toggle|href|speed|throw|304|replaceWith|200|Last|colgroup|httpData|httpSuccess|beforeSend|eq|linear|concat|splice|fieldset|multiple|cssFloat|XMLHttpRequest|webkit|ActiveXObject|CSS1Compat|link|metaKey|scriptCharset|callback|col|pixelLeft|urlencoded|www|post|hasClass|getJSON|getScript|elements|serialize|black|keyup|keypress|solid|change|mousemove|mouseup|dblclick|resize|focus|blur|stylesheet|rel|doScroll|round|hover|padding|offsetHeight|mousedown|offsetWidth|Bottom|Top|keydown|clientY|Right|pageY|Left|toElement|srcElement|cancelBubble|returnValue|charAt|0n|substring|animated|header|noConflict|line|enabled|innerText|contains|only|weight|ajaxSetup|font|size|gt|lt|uFFFF|u0128|417|Boolean|inner|Height|toggleClass|removeClass|addClass|removeAttr|replaceAll|insertAfter|prependTo|contentWindow|contentDocument|wrap|iframe|children|siblings|prevAll|nextAll|prev|wrapInner|next|parents|maxLength|maxlength|readOnly|readonly|reverse|class|htmlFor|inline|able|boxModel|522|setData|compatible|with|1px|ie|getData|10000|ra|it|rv|PI|cos|userAgent|400|navigator|600|slow|Function|Object|array|stop|ig|NaN|fadeTo|option|fadeOut|fadeIn|setAttribute|slideToggle|slideUp|changed|slideDown|be|can|property|responseXML|content|1223|getAttributeNode|300|method|protocol|location|action|send|abort|cssText|th|td|cap|specified|Accept|With|colg|Requested|fast|tfoot|GMT|thead|1970|Jan|attributes|01|Thu|leg|Since|If|opt|Type|Content|embed|open|area|XMLHTTP|hr|Microsoft|onreadystatechange|onload|meta|adobeair|charset|http|1_|img|br|plain|borderLeftWidth|borderTopWidth|abbr'.split('|'),0,{}));jQuery.noConflict();
    12  No newline at end of file
     12
     13// Map over jQuery in case of overwrite
     14var _jQuery = window.jQuery,
     15// Map over the $ in case of overwrite
     16        _$ = window.$;
     17
     18var jQuery = window.jQuery = window.$ = function( selector, context ) {
     19        // The jQuery object is actually just the init constructor 'enhanced'
     20        return new jQuery.fn.init( selector, context );
     21};
     22
     23// A simple way to check for HTML strings or ID strings
     24// (both of which we optimize for)
     25var quickExpr = /^[^<]*(<(.|\s)+>)[^>]*$|^#(\w+)$/,
     26
     27// Is it a simple selector
     28        isSimple = /^.[^:#\[\.]*$/,
     29
     30// Will speed up references to undefined, and allows munging its name.
     31        undefined;
     32
     33jQuery.fn = jQuery.prototype = {
     34        init: function( selector, context ) {
     35                // Make sure that a selection was provided
     36                selector = selector || document;
     37
     38                // Handle $(DOMElement)
     39                if ( selector.nodeType ) {
     40                        this[0] = selector;
     41                        this.length = 1;
     42                        return this;
     43                }
     44                // Handle HTML strings
     45                if ( typeof selector == "string" ) {
     46                        // Are we dealing with HTML string or an ID?
     47                        var match = quickExpr.exec( selector );
     48
     49                        // Verify a match, and that no context was specified for #id
     50                        if ( match && (match[1] || !context) ) {
     51
     52                                // HANDLE: $(html) -> $(array)
     53                                if ( match[1] )
     54                                        selector = jQuery.clean( [ match[1] ], context );
     55
     56                                // HANDLE: $("#id")
     57                                else {
     58                                        var elem = document.getElementById( match[3] );
     59
     60                                        // Make sure an element was located
     61                                        if ( elem ){
     62                                                // Handle the case where IE and Opera return items
     63                                                // by name instead of ID
     64                                                if ( elem.id != match[3] )
     65                                                        return jQuery().find( selector );
     66
     67                                                // Otherwise, we inject the element directly into the jQuery object
     68                                                return jQuery( elem );
     69                                        }
     70                                        selector = [];
     71                                }
     72
     73                        // HANDLE: $(expr, [context])
     74                        // (which is just equivalent to: $(content).find(expr)
     75                        } else
     76                                return jQuery( context ).find( selector );
     77
     78                // HANDLE: $(function)
     79                // Shortcut for document ready
     80                } else if ( jQuery.isFunction( selector ) )
     81                        return jQuery( document )[ jQuery.fn.ready ? "ready" : "load" ]( selector );
     82
     83                return this.setArray(jQuery.makeArray(selector));
     84        },
     85
     86        // The current version of jQuery being used
     87        jquery: "1.2.5",
     88
     89        // The number of elements contained in the matched element set
     90        size: function() {
     91                return this.length;
     92        },
     93
     94        // The number of elements contained in the matched element set
     95        length: 0,
     96
     97        // Get the Nth element in the matched element set OR
     98        // Get the whole matched element set as a clean array
     99        get: function( num ) {
     100                return num == undefined ?
     101
     102                        // Return a 'clean' array
     103                        jQuery.makeArray( this ) :
     104
     105                        // Return just the object
     106                        this[ num ];
     107        },
     108
     109        // Take an array of elements and push it onto the stack
     110        // (returning the new matched element set)
     111        pushStack: function( elems ) {
     112                // Build a new jQuery matched element set
     113                var ret = jQuery( elems );
     114
     115                // Add the old object onto the stack (as a reference)
     116                ret.prevObject = this;
     117
     118                // Return the newly-formed element set
     119                return ret;
     120        },
     121
     122        // Force the current matched set of elements to become
     123        // the specified array of elements (destroying the stack in the process)
     124        // You should use pushStack() in order to do this, but maintain the stack
     125        setArray: function( elems ) {
     126                // Resetting the length to 0, then using the native Array push
     127                // is a super-fast way to populate an object with array-like properties
     128                this.length = 0;
     129                Array.prototype.push.apply( this, elems );
     130
     131                return this;
     132        },
     133
     134        // Execute a callback for every element in the matched set.
     135        // (You can seed the arguments with an array of args, but this is
     136        // only used internally.)
     137        each: function( callback, args ) {
     138                return jQuery.each( this, callback, args );
     139        },
     140
     141        // Determine the position of an element within
     142        // the matched set of elements
     143        index: function( elem ) {
     144                var ret = -1;
     145
     146                // Locate the position of the desired element
     147                return jQuery.inArray(
     148                        // If it receives a jQuery object, the first element is used
     149                        elem && elem.jquery ? elem[0] : elem
     150                , this );
     151        },
     152
     153        attr: function( name, value, type ) {
     154                var options = name;
     155
     156                // Look for the case where we're accessing a style value
     157                if ( name.constructor == String )
     158                        if ( value === undefined )
     159                                return this[0] && jQuery[ type || "attr" ]( this[0], name );
     160
     161                        else {
     162                                options = {};
     163                                options[ name ] = value;
     164                        }
     165
     166                // Check to see if we're setting style values
     167                return this.each(function(i){
     168                        // Set all the styles
     169                        for ( name in options )
     170                                jQuery.attr(
     171                                        type ?
     172                                                this.style :
     173                                                this,
     174                                        name, jQuery.prop( this, options[ name ], type, i, name )
     175                                );
     176                });
     177        },
     178
     179        css: function( key, value ) {
     180                // ignore negative width and height values
     181                if ( (key == 'width' || key == 'height') && parseFloat(value) < 0 )
     182                        value = undefined;
     183                return this.attr( key, value, "curCSS" );
     184        },
     185
     186        text: function( text ) {
     187                if ( typeof text != "object" && text != null )
     188                        return this.empty().append( (this[0] && this[0].ownerDocument || document).createTextNode( text ) );
     189
     190                var ret = "";
     191
     192                jQuery.each( text || this, function(){
     193                        jQuery.each( this.childNodes, function(){
     194                                if ( this.nodeType != 8 )
     195                                        ret += this.nodeType != 1 ?
     196                                                this.nodeValue :
     197                                                jQuery.fn.text( [ this ] );
     198                        });
     199                });
     200
     201                return ret;
     202        },
     203
     204        wrapAll: function( html ) {
     205                if ( this[0] )
     206                        // The elements to wrap the target around
     207                        jQuery( html, this[0].ownerDocument )
     208                                .clone()
     209                                .insertBefore( this[0] )
     210                                .map(function(){
     211                                        var elem = this;
     212
     213                                        while ( elem.firstChild )
     214                                                elem = elem.firstChild;
     215
     216                                        return elem;
     217                                })
     218                                .append(this);
     219
     220                return this;
     221        },
     222
     223        wrapInner: function( html ) {
     224                return this.each(function(){
     225                        jQuery( this ).contents().wrapAll( html );
     226                });
     227        },
     228
     229        wrap: function( html ) {
     230                return this.each(function(){
     231                        jQuery( this ).wrapAll( html );
     232                });
     233        },
     234
     235        append: function() {
     236                return this.domManip(arguments, true, false, function(elem){
     237                        if (this.nodeType == 1)
     238                                this.appendChild( elem );
     239                });
     240        },
     241
     242        prepend: function() {
     243                return this.domManip(arguments, true, true, function(elem){
     244                        if (this.nodeType == 1)
     245                                this.insertBefore( elem, this.firstChild );
     246                });
     247        },
     248
     249        before: function() {
     250                return this.domManip(arguments, false, false, function(elem){
     251                        this.parentNode.insertBefore( elem, this );
     252                });
     253        },
     254
     255        after: function() {
     256                return this.domManip(arguments, false, true, function(elem){
     257                        this.parentNode.insertBefore( elem, this.nextSibling );
     258                });
     259        },
     260
     261        end: function() {
     262                return this.prevObject || jQuery( [] );
     263        },
     264
     265        find: function( selector ) {
     266                var elems = jQuery.map(this, function(elem){
     267                        return jQuery.find( selector, elem );
     268                });
     269
     270                return this.pushStack( /[^+>] [^+>]/.test( selector ) || selector.indexOf("..") > -1 ?
     271                        jQuery.unique( elems ) :
     272                        elems );
     273        },
     274
     275        clone: function( events ) {
     276                // Do the clone
     277                var ret = this.map(function(){
     278                        if ( jQuery.browser.msie && !jQuery.isXMLDoc(this) ) {
     279                                // IE copies events bound via attachEvent when
     280                                // using cloneNode. Calling detachEvent on the
     281                                // clone will also remove the events from the orignal
     282                                // In order to get around this, we use innerHTML.
     283                                // Unfortunately, this means some modifications to
     284                                // attributes in IE that are actually only stored
     285                                // as properties will not be copied (such as the
     286                                // the name attribute on an input).
     287                                var clone = this.cloneNode(true),
     288                                        container = document.createElement("div");
     289                                container.appendChild(clone);
     290                                return jQuery.clean([container.innerHTML])[0];
     291                        } else
     292                                return this.cloneNode(true);
     293                });
     294
     295                // Need to set the expando to null on the cloned set if it exists
     296                // removeData doesn't work here, IE removes it from the original as well
     297                // this is primarily for IE but the data expando shouldn't be copied over in any browser
     298                var clone = ret.find("*").andSelf().each(function(){
     299                        if ( this[ expando ] != undefined )
     300                                this[ expando ] = null;
     301                });
     302
     303                // Copy the events from the original to the clone
     304                if ( events === true )
     305                        this.find("*").andSelf().each(function(i){
     306                                if (this.nodeType == 3)
     307                                        return;
     308                                var events = jQuery.data( this, "events" );
     309
     310                                for ( var type in events )
     311                                        for ( var handler in events[ type ] )
     312                                                jQuery.event.add( clone[ i ], type, events[ type ][ handler ], events[ type ][ handler ].data );
     313                        });
     314
     315                // Return the cloned set
     316                return ret;
     317        },
     318
     319        filter: function( selector ) {
     320                return this.pushStack(
     321                        jQuery.isFunction( selector ) &&
     322                        jQuery.grep(this, function(elem, i){
     323                                return selector.call( elem, i );
     324                        }) ||
     325
     326                        jQuery.multiFilter( selector, this ) );
     327        },
     328
     329        not: function( selector ) {
     330                if ( selector.constructor == String )
     331                        // test special case where just one selector is passed in
     332                        if ( isSimple.test( selector ) )
     333                                return this.pushStack( jQuery.multiFilter( selector, this, true ) );
     334                        else
     335                                selector = jQuery.multiFilter( selector, this );
     336
     337                var isArrayLike = selector.length && selector[selector.length - 1] !== undefined && !selector.nodeType;
     338                return this.filter(function() {
     339                        return isArrayLike ? jQuery.inArray( this, selector ) < 0 : this != selector;
     340                });
     341        },
     342
     343        add: function( selector ) {
     344                return this.pushStack( jQuery.unique( jQuery.merge(
     345                        this.get(),
     346                        typeof selector == 'string' ?
     347                                jQuery( selector ) :
     348                                jQuery.makeArray( selector )
     349                )));
     350        },
     351
     352        is: function( selector ) {
     353                return !!selector && jQuery.multiFilter( selector, this ).length > 0;
     354        },
     355
     356        hasClass: function( selector ) {
     357                return this.is( "." + selector );
     358        },
     359
     360        val: function( value ) {
     361                if ( value == undefined ) {
     362
     363                        if ( this.length ) {
     364                                var elem = this[0];
     365
     366                                // We need to handle select boxes special
     367                                if ( jQuery.nodeName( elem, "select" ) ) {
     368                                        var index = elem.selectedIndex,
     369                                                values = [],
     370                                                options = elem.options,
     371                                                one = elem.type == "select-one";
     372
     373                                        // Nothing was selected
     374                                        if ( index < 0 )
     375                                                return null;
     376
     377                                        // Loop through all the selected options
     378                                        for ( var i = one ? index : 0, max = one ? index + 1 : options.length; i < max; i++ ) {
     379                                                var option = options[ i ];
     380
     381                                                if ( option.selected ) {
     382                                                        // Get the specifc value for the option
     383                                                        value = jQuery.browser.msie && !option.attributes.value.specified ? option.text : option.value;
     384
     385                                                        // We don't need an array for one selects
     386                                                        if ( one )
     387                                                                return value;
     388
     389                                                        // Multi-Selects return an array
     390                                                        values.push( value );
     391                                                }
     392                                        }
     393
     394                                        return values;
     395
     396                                // Everything else, we just grab the value
     397                                } else
     398                                        return (this[0].value || "").replace(/\r/g, "");
     399
     400                        }
     401
     402                        return undefined;
     403                }
     404
     405                return this.each(function(){
     406                        if ( this.nodeType != 1 )
     407                                return;
     408
     409                        if ( value.constructor == Array && /radio|checkbox/.test( this.type ) )
     410                                this.checked = (jQuery.inArray(this.value, value) >= 0 ||
     411                                        jQuery.inArray(this.name, value) >= 0);
     412
     413                        else if ( jQuery.nodeName( this, "select" ) ) {
     414                                var values = jQuery.makeArray(value);
     415
     416                                jQuery( "option", this ).each(function(){
     417                                        this.selected = (jQuery.inArray( this.value, values ) >= 0 ||
     418                                                jQuery.inArray( this.text, values ) >= 0);
     419                                });
     420
     421                                if ( !values.length )
     422                                        this.selectedIndex = -1;
     423
     424                        } else
     425                                this.value = value;
     426                });
     427        },
     428
     429        html: function( value ) {
     430                return value == undefined ?
     431                        (this.length ?
     432                                this[0].innerHTML :
     433                                null) :
     434                        this.empty().append( value );
     435        },
     436
     437        replaceWith: function( value ) {
     438                return this.after( value ).remove();
     439        },
     440
     441        eq: function( i ) {
     442                return this.slice( i, i + 1 );
     443        },
     444
     445        slice: function() {
     446                return this.pushStack( Array.prototype.slice.apply( this, arguments ) );
     447        },
     448
     449        map: function( callback ) {
     450                return this.pushStack( jQuery.map(this, function(elem, i){
     451                        return callback.call( elem, i, elem );
     452                }));
     453        },
     454
     455        andSelf: function() {
     456                return this.add( this.prevObject );
     457        },
     458
     459        data: function( key, value ){
     460                var parts = key.split(".");
     461                parts[1] = parts[1] ? "." + parts[1] : "";
     462
     463                if ( value === undefined ) {
     464                        var data = this.triggerHandler("getData" + parts[1] + "!", [parts[0]]);
     465
     466                        if ( data === undefined && this.length )
     467                                data = jQuery.data( this[0], key );
     468
     469                        return data === undefined && parts[1] ?
     470                                this.data( parts[0] ) :
     471                                data;
     472                } else
     473                        return this.trigger("setData" + parts[1] + "!", [parts[0], value]).each(function(){
     474                                jQuery.data( this, key, value );
     475                        });
     476        },
     477
     478        removeData: function( key ){
     479                return this.each(function(){
     480                        jQuery.removeData( this, key );
     481                });
     482        },
     483
     484        domManip: function( args, table, reverse, callback ) {
     485                var clone = this.length > 1, elems;
     486
     487                return this.each(function(){
     488                        if ( !elems ) {
     489                                elems = jQuery.clean( args, this.ownerDocument );
     490
     491                                if ( reverse )
     492                                        elems.reverse();
     493                        }
     494
     495                        var obj = this;
     496
     497                        if ( table && jQuery.nodeName( this, "table" ) && jQuery.nodeName( elems[0], "tr" ) )
     498                                obj = this.getElementsByTagName("tbody")[0] || this.appendChild( this.ownerDocument.createElement("tbody") );
     499
     500                        var scripts = jQuery( [] );
     501
     502                        jQuery.each(elems, function(){
     503                                var elem = clone ?
     504                                        jQuery( this ).clone( true )[0] :
     505                                        this;
     506
     507                                // execute all scripts after the elements have been injected
     508                                if ( jQuery.nodeName( elem, "script" ) ) {
     509                                        scripts = scripts.add( elem );
     510                                } else {
     511                                        // Remove any inner scripts for later evaluation
     512                                        if ( elem.nodeType == 1 )
     513                                                scripts = scripts.add( jQuery( "script", elem ).remove() );
     514
     515                                        // Inject the elements into the document
     516                                        callback.call( obj, elem );
     517                                }
     518                        });
     519
     520                        scripts.each( evalScript );
     521                });
     522        }
     523};
     524
     525// Give the init function the jQuery prototype for later instantiation
     526jQuery.fn.init.prototype = jQuery.fn;
     527
     528function evalScript( i, elem ) {
     529        if ( elem.src )
     530                jQuery.ajax({
     531                        url: elem.src,
     532                        async: false,
     533                        dataType: "script"
     534                });
     535
     536        else
     537                jQuery.globalEval( elem.text || elem.textContent || elem.innerHTML || "" );
     538
     539        if ( elem.parentNode )
     540                elem.parentNode.removeChild( elem );
     541}
     542
     543function now(){
     544        return +new Date;
     545}
     546
     547jQuery.extend = jQuery.fn.extend = function() {
     548        // copy reference to target object
     549        var target = arguments[0] || {}, i = 1, length = arguments.length, deep = false, options;
     550
     551        // Handle a deep copy situation
     552        if ( target.constructor == Boolean ) {
     553                deep = target;
     554                target = arguments[1] || {};
     555                // skip the boolean and the target
     556                i = 2;
     557        }
     558
     559        // Handle case when target is a string or something (possible in deep copy)
     560        if ( typeof target != "object" && typeof target != "function" )
     561                target = {};
     562
     563        // extend jQuery itself if only one argument is passed
     564        if ( length == i ) {
     565                target = this;
     566                --i;
     567        }
     568
     569        for ( ; i < length; i++ )
     570                // Only deal with non-null/undefined values
     571                if ( (options = arguments[ i ]) != null )
     572                        // Extend the base object
     573                        for ( var name in options ) {
     574                                var src = target[ name ], copy = options[ name ];
     575
     576                                // Prevent never-ending loop
     577                                if ( target === copy )
     578                                        continue;
     579
     580                                // Recurse if we're merging object values
     581                                if ( deep && copy && typeof copy == "object" && !copy.nodeType )
     582                                        target[ name ] = jQuery.extend( deep,
     583                                                // Never move original objects, clone them
     584                                                src || ( copy.length != null ? [ ] : { } )
     585                                        , copy );
     586
     587                                // Don't bring in undefined values
     588                                else if ( copy !== undefined )
     589                                        target[ name ] = copy;
     590
     591                        }
     592
     593        // Return the modified object
     594        return target;
     595};
     596
     597var expando = "jQuery" + now(), uuid = 0, windowData = {},
     598        // exclude the following css properties to add px
     599        exclude = /z-?index|font-?weight|opacity|zoom|line-?height/i,
     600        // cache defaultView
     601        defaultView = document.defaultView || {};
     602
     603jQuery.extend({
     604        noConflict: function( deep ) {
     605                window.$ = _$;
     606
     607                if ( deep )
     608                        window.jQuery = _jQuery;
     609
     610                return jQuery;
     611        },
     612
     613        // See test/unit/core.js for details concerning this function.
     614        isFunction: function( fn ) {
     615                return !!fn && typeof fn != "string" && !fn.nodeName &&
     616                        fn.constructor != Array && /^[\s[]?function/.test( fn + "" );
     617        },
     618
     619        // check if an element is in a (or is an) XML document
     620        isXMLDoc: function( elem ) {
     621                return elem.documentElement && !elem.body ||
     622                        elem.tagName && elem.ownerDocument && !elem.ownerDocument.body;
     623        },
     624
     625        // Evalulates a script in a global context
     626        globalEval: function( data ) {
     627                data = jQuery.trim( data );
     628
     629                if ( data ) {
     630                        // Inspired by code by Andrea Giammarchi
     631                        // http://webreflection.blogspot.com/2007/08/global-scope-evaluation-and-dom.html
     632                        var head = document.getElementsByTagName("head")[0] || document.documentElement,
     633                                script = document.createElement("script");
     634
     635                        script.type = "text/javascript";
     636                        if ( jQuery.browser.msie )
     637                                script.text = data;
     638                        else
     639                                script.appendChild( document.createTextNode( data ) );
     640
     641                        // Use insertBefore instead of appendChild  to circumvent an IE6 bug.
     642                        // This arises when a base node is used (#2709).
     643                        head.insertBefore( script, head.firstChild );
     644                        head.removeChild( script );
     645                }
     646        },
     647
     648        nodeName: function( elem, name ) {
     649                return elem.nodeName && elem.nodeName.toUpperCase() == name.toUpperCase();
     650        },
     651
     652        cache: {},
     653
     654        data: function( elem, name, data ) {
     655                elem = elem == window ?
     656                        windowData :
     657                        elem;
     658
     659                var id = elem[ expando ];
     660
     661                // Compute a unique ID for the element
     662                if ( !id )
     663                        id = elem[ expando ] = ++uuid;
     664
     665                // Only generate the data cache if we're
     666                // trying to access or manipulate it
     667                if ( name && !jQuery.cache[ id ] )
     668                        jQuery.cache[ id ] = {};
     669
     670                // Prevent overriding the named cache with undefined values
     671                if ( data !== undefined )
     672                        jQuery.cache[ id ][ name ] = data;
     673
     674                // Return the named cache data, or the ID for the element
     675                return name ?
     676                        jQuery.cache[ id ][ name ] :
     677                        id;
     678        },
     679
     680        removeData: function( elem, name ) {
     681                elem = elem == window ?
     682                        windowData :
     683                        elem;
     684
     685                var id = elem[ expando ];
     686
     687                // If we want to remove a specific section of the element's data
     688                if ( name ) {
     689                        if ( jQuery.cache[ id ] ) {
     690                                // Remove the section of cache data
     691                                delete jQuery.cache[ id ][ name ];
     692
     693                                // If we've removed all the data, remove the element's cache
     694                                name = "";
     695
     696                                for ( name in jQuery.cache[ id ] )
     697                                        break;
     698
     699                                if ( !name )
     700                                        jQuery.removeData( elem );
     701                        }
     702
     703                // Otherwise, we want to remove all of the element's data
     704                } else {
     705                        // Clean up the element expando
     706                        try {
     707                                delete elem[ expando ];
     708                        } catch(e){
     709                                // IE has trouble directly removing the expando
     710                                // but it's ok with using removeAttribute
     711                                if ( elem.removeAttribute )
     712                                        elem.removeAttribute( expando );
     713                        }
     714
     715                        // Completely remove the data cache
     716                        delete jQuery.cache[ id ];
     717                }
     718        },
     719
     720        // args is for internal usage only
     721        each: function( object, callback, args ) {
     722                var name, i = 0, length = object.length;
     723
     724                if ( args ) {
     725                        if ( length == undefined ) {
     726                                for ( name in object )
     727                                        if ( callback.apply( object[ name ], args ) === false )
     728                                                break;
     729                        } else
     730                                for ( ; i < length; )
     731                                        if ( callback.apply( object[ i++ ], args ) === false )
     732                                                break;
     733
     734                // A special, fast, case for the most common use of each
     735                } else {
     736                        if ( length == undefined ) {
     737                                for ( name in object )
     738                                        if ( callback.call( object[ name ], name, object[ name ] ) === false )
     739                                                break;
     740                        } else
     741                                for ( var value = object[0];
     742                                        i < length && callback.call( value, i, value ) !== false; value = object[++i] ){}
     743                }
     744
     745                return object;
     746        },
     747
     748        prop: function( elem, value, type, i, name ) {
     749                        // Handle executable functions
     750                        if ( jQuery.isFunction( value ) )
     751                                value = value.call( elem, i );
     752
     753                        // Handle passing in a number to a CSS property
     754                        return value && value.constructor == Number && type == "curCSS" && !exclude.test( name ) ?
     755                                value + "px" :
     756                                value;
     757        },
     758
     759        className: {
     760                // internal only, use addClass("class")
     761                add: function( elem, classNames ) {
     762                        jQuery.each((classNames || "").split(/\s+/), function(i, className){
     763                                if ( elem.nodeType == 1 && !jQuery.className.has( elem.className, className ) )
     764                                        elem.className += (elem.className ? " " : "") + className;
     765                        });
     766                },
     767
     768                // internal only, use removeClass("class")
     769                remove: function( elem, classNames ) {
     770                        if (elem.nodeType == 1)
     771                                elem.className = classNames != undefined ?
     772                                        jQuery.grep(elem.className.split(/\s+/), function(className){
     773                                                return !jQuery.className.has( classNames, className );
     774                                        }).join(" ") :
     775                                        "";
     776                },
     777
     778                // internal only, use hasClass("class")
     779                has: function( elem, className ) {
     780                        return jQuery.inArray( className, (elem.className || elem).toString().split(/\s+/) ) > -1;
     781                }
     782        },
     783
     784        // A method for quickly swapping in/out CSS properties to get correct calculations
     785        swap: function( elem, options, callback ) {
     786                var old = {};
     787                // Remember the old values, and insert the new ones
     788                for ( var name in options ) {
     789                        old[ name ] = elem.style[ name ];
     790                        elem.style[ name ] = options[ name ];
     791                }
     792
     793                callback.call( elem );
     794
     795                // Revert the old values
     796                for ( var name in options )
     797                        elem.style[ name ] = old[ name ];
     798        },
     799
     800        css: function( elem, name, force ) {
     801                if ( name == "width" || name == "height" ) {
     802                        var val, props = { position: "absolute", visibility: "hidden", display:"block" }, which = name == "width" ? [ "Left", "Right" ] : [ "Top", "Bottom" ];
     803
     804                        function getWH() {
     805                                val = name == "width" ? elem.offsetWidth : elem.offsetHeight;
     806                                var padding = 0, border = 0;
     807                                jQuery.each( which, function() {
     808                                        padding += parseFloat(jQuery.curCSS( elem, "padding" + this, true)) || 0;
     809                                        border += parseFloat(jQuery.curCSS( elem, "border" + this + "Width", true)) || 0;
     810                                });
     811                                val -= Math.round(padding + border);
     812                        }
     813
     814                        if ( jQuery(elem).is(":visible") )
     815                                getWH();
     816                        else
     817                                jQuery.swap( elem, props, getWH );
     818
     819                        return Math.max(0, val);
     820                }
     821
     822                return jQuery.curCSS( elem, name, force );
     823        },
     824
     825        curCSS: function( elem, name, force ) {
     826                var ret, style = elem.style;
     827
     828                // A helper method for determining if an element's values are broken
     829                function color( elem ) {
     830                        if ( !jQuery.browser.safari )
     831                                return false;
     832
     833                        // defaultView is cached
     834                        var ret = defaultView.getComputedStyle( elem, null );
     835                        return !ret || ret.getPropertyValue("color") == "";
     836                }
     837
     838                // We need to handle opacity special in IE
     839                if ( name == "opacity" && jQuery.browser.msie ) {
     840                        ret = jQuery.attr( style, "opacity" );
     841
     842                        return ret == "" ?
     843                                "1" :
     844                                ret;
     845                }
     846                // Opera sometimes will give the wrong display answer, this fixes it, see #2037
     847                if ( jQuery.browser.opera && name == "display" ) {
     848                        var save = style.outline;
     849                        style.outline = "0 solid black";
     850                        style.outline = save;
     851                }
     852
     853                // Make sure we're using the right name for getting the float value
     854                if ( name.match( /float/i ) )
     855                        name = styleFloat;
     856
     857                if ( !force && style && style[ name ] )
     858                        ret = style[ name ];
     859
     860                else if ( defaultView.getComputedStyle ) {
     861
     862                        // Only "float" is needed here
     863                        if ( name.match( /float/i ) )
     864                                name = "float";
     865
     866                        name = name.replace( /([A-Z])/g, "-$1" ).toLowerCase();
     867
     868                        var computedStyle = defaultView.getComputedStyle( elem, null );
     869
     870                        if ( computedStyle && !color( elem ) )
     871                                ret = computedStyle.getPropertyValue( name );
     872
     873                        // If the element isn't reporting its values properly in Safari
     874                        // then some display: none elements are involved
     875                        else {
     876                                var swap = [], stack = [], a = elem, i = 0;
     877
     878                                // Locate all of the parent display: none elements
     879                                for ( ; a && color(a); a = a.parentNode )
     880                                        stack.unshift(a);
     881
     882                                // Go through and make them visible, but in reverse
     883                                // (It would be better if we knew the exact display type that they had)
     884                                for ( ; i < stack.length; i++ )
     885                                        if ( color( stack[ i ] ) ) {
     886                                                swap[ i ] = stack[ i ].style.display;
     887                                                stack[ i ].style.display = "block";
     888                                        }
     889
     890                                // Since we flip the display style, we have to handle that
     891                                // one special, otherwise get the value
     892                                ret = name == "display" && swap[ stack.length - 1 ] != null ?
     893                                        "none" :
     894                                        ( computedStyle && computedStyle.getPropertyValue( name ) ) || "";
     895
     896                                // Finally, revert the display styles back
     897                                for ( i = 0; i < swap.length; i++ )
     898                                        if ( swap[ i ] != null )
     899                                                stack[ i ].style.display = swap[ i ];
     900                        }
     901
     902                        // We should always get a number back from opacity
     903                        if ( name == "opacity" && ret == "" )
     904                                ret = "1";
     905
     906                } else if ( elem.currentStyle ) {
     907                        var camelCase = name.replace(/\-(\w)/g, function(all, letter){
     908                                return letter.toUpperCase();
     909                        });
     910
     911                        ret = elem.currentStyle[ name ] || elem.currentStyle[ camelCase ];
     912
     913                        // From the awesome hack by Dean Edwards
     914                        // http://erik.eae.net/archives/2007/07/27/18.54.15/#comment-102291
     915
     916                        // If we're not dealing with a regular pixel number
     917                        // but a number that has a weird ending, we need to convert it to pixels
     918                        if ( !/^\d+(px)?$/i.test( ret ) && /^\d/.test( ret ) ) {
     919                                // Remember the original values
     920                                var left = style.left, rsLeft = elem.runtimeStyle.left;
     921
     922                                // Put in the new values to get a computed value out
     923                                elem.runtimeStyle.left = elem.currentStyle.left;
     924                                style.left = ret || 0;
     925                                ret = style.pixelLeft + "px";
     926
     927                                // Revert the changed values
     928                                style.left = left;
     929                                elem.runtimeStyle.left = rsLeft;
     930                        }
     931                }
     932
     933                return ret;
     934        },
     935
     936        clean: function( elems, context ) {
     937                var ret = [];
     938                context = context || document;
     939                // !context.createElement fails in IE with an error but returns typeof 'object'
     940                if (typeof context.createElement == 'undefined')
     941                        context = context.ownerDocument || context[0] && context[0].ownerDocument || document;
     942
     943                jQuery.each(elems, function(i, elem){
     944                        if ( !elem )
     945                                return;
     946
     947                        if ( elem.constructor == Number )
     948                                elem += '';
     949
     950                        // Convert html string into DOM nodes
     951                        if ( typeof elem == "string" ) {
     952                                // Fix "XHTML"-style tags in all browsers
     953                                elem = elem.replace(/(<(\w+)[^>]*?)\/>/g, function(all, front, tag){
     954                                        return tag.match(/^(abbr|br|col|img|input|link|meta|param|hr|area|embed)$/i) ?
     955                                                all :
     956                                                front + "></" + tag + ">";
     957                                });
     958
     959                                // Trim whitespace, otherwise indexOf won't work as expected
     960                                var tags = jQuery.trim( elem ).toLowerCase(), div = context.createElement("div");
     961
     962                                var wrap =
     963                                        // option or optgroup
     964                                        !tags.indexOf("<opt") &&
     965                                        [ 1, "<select multiple='multiple'>", "</select>" ] ||
     966
     967                                        !tags.indexOf("<leg") &&
     968                                        [ 1, "<fieldset>", "</fieldset>" ] ||
     969
     970                                        tags.match(/^<(thead|tbody|tfoot|colg|cap)/) &&
     971                                        [ 1, "<table>", "</table>" ] ||
     972
     973                                        !tags.indexOf("<tr") &&
     974                                        [ 2, "<table><tbody>", "</tbody></table>" ] ||
     975
     976                                        // <thead> matched above
     977                                        (!tags.indexOf("<td") || !tags.indexOf("<th")) &&
     978                                        [ 3, "<table><tbody><tr>", "</tr></tbody></table>" ] ||
     979
     980                                        !tags.indexOf("<col") &&
     981                                        [ 2, "<table><tbody></tbody><colgroup>", "</colgroup></table>" ] ||
     982
     983                                        // IE can't serialize <link> and <script> tags normally
     984                                        jQuery.browser.msie &&
     985                                        [ 1, "div<div>", "</div>" ] ||
     986
     987                                        [ 0, "", "" ];
     988
     989                                // Go to html and back, then peel off extra wrappers
     990                                div.innerHTML = wrap[1] + elem + wrap[2];
     991
     992                                // Move to the right depth
     993                                while ( wrap[0]-- )
     994                                        div = div.lastChild;
     995
     996                                // Remove IE's autoinserted <tbody> from table fragments
     997                                if ( jQuery.browser.msie ) {
     998
     999                                        // String was a <table>, *may* have spurious <tbody>
     1000                                        var tbody = !tags.indexOf("<table") && tags.indexOf("<tbody") < 0 ?
     1001                                                div.firstChild && div.firstChild.childNodes :
     1002
     1003                                                // String was a bare <thead> or <tfoot>
     1004                                                wrap[1] == "<table>" && tags.indexOf("<tbody") < 0 ?
     1005                                                        div.childNodes :
     1006                                                        [];
     1007
     1008                                        for ( var j = tbody.length - 1; j >= 0 ; --j )
     1009                                                if ( jQuery.nodeName( tbody[ j ], "tbody" ) && !tbody[ j ].childNodes.length )
     1010                                                        tbody[ j ].parentNode.removeChild( tbody[ j ] );
     1011
     1012                                        // IE completely kills leading whitespace when innerHTML is used
     1013                                        if ( /^\s/.test( elem ) )
     1014                                                div.insertBefore( context.createTextNode( elem.match(/^\s*/)[0] ), div.firstChild );
     1015
     1016                                }
     1017
     1018                                elem = jQuery.makeArray( div.childNodes );
     1019                        }
     1020
     1021                        if ( elem.length === 0 && (!jQuery.nodeName( elem, "form" ) && !jQuery.nodeName( elem, "select" )) )
     1022                                return;
     1023
     1024                        if ( elem[0] == undefined || jQuery.nodeName( elem, "form" ) || elem.options )
     1025                                ret.push( elem );
     1026
     1027                        else
     1028                                ret = jQuery.merge( ret, elem );
     1029
     1030                });
     1031
     1032                return ret;
     1033        },
     1034
     1035        attr: function( elem, name, value ) {
     1036                // don't set attributes on text and comment nodes
     1037                if (!elem || elem.nodeType == 3 || elem.nodeType == 8)
     1038                        return undefined;
     1039
     1040                var notxml = !jQuery.isXMLDoc( elem ),
     1041                        // Whether we are setting (or getting)
     1042                        set = value !== undefined,
     1043                        msie = jQuery.browser.msie;
     1044
     1045                // Try to normalize/fix the name
     1046                name = notxml && jQuery.props[ name ] || name;
     1047
     1048                // Only do all the following if this is a node (faster for style)
     1049                // IE elem.getAttribute passes even for style
     1050                if ( elem.tagName ) {
     1051
     1052                        // These attributes require special treatment
     1053                        var special = /href|src|style/.test( name );
     1054
     1055                        // Safari mis-reports the default selected property of a hidden option
     1056                        // Accessing the parent's selectedIndex property fixes it
     1057                        if ( name == "selected" && jQuery.browser.safari )
     1058                                elem.parentNode.selectedIndex;
     1059
     1060                        // If applicable, access the attribute via the DOM 0 way
     1061                        if ( notxml && !special && name in elem ) {
     1062                                if ( set ){
     1063                                        // We can't allow the type property to be changed (since it causes problems in IE)
     1064                                        if ( name == "type" && jQuery.nodeName( elem, "input" ) && elem.parentNode )
     1065                                                throw "type property can't be changed";
     1066
     1067                                        elem[ name ] = value;
     1068                                }
     1069
     1070                                // browsers index elements by id/name on forms, give priority to attributes.
     1071                                if( jQuery.nodeName( elem, "form" ) && elem.getAttributeNode(name) )
     1072                                        return elem.getAttributeNode( name ).nodeValue;
     1073
     1074                                return elem[ name ];
     1075                        }
     1076
     1077                        if ( msie && notxml &&  name == "style" )
     1078                                return jQuery.attr( elem.style, "cssText", value );
     1079
     1080                        if ( set )
     1081                                // convert the value to a string (all browsers do this but IE) see #1070
     1082                                elem.setAttribute( name, "" + value );
     1083
     1084                        if ( msie && special && notxml )
     1085                                return elem.getAttribute( name, 2 );
     1086
     1087                        return elem.getAttribute( name );
     1088
     1089                }
     1090
     1091                // elem is actually elem.style ... set the style
     1092
     1093                // IE uses filters for opacity
     1094                if ( msie && name == "opacity" ) {
     1095                        if ( set ) {
     1096                                // IE has trouble with opacity if it does not have layout
     1097                                // Force it by setting the zoom level
     1098                                elem.zoom = 1;
     1099
     1100                                // Set the alpha filter to set the opacity
     1101                                elem.filter = (elem.filter || "").replace( /alpha\([^)]*\)/, "" ) +
     1102                                        (parseInt( value ) + '' == "NaN" ? "" : "alpha(opacity=" + value * 100 + ")");
     1103                        }
     1104
     1105                        return elem.filter && elem.filter.indexOf("opacity=") >= 0 ?
     1106                                (parseFloat( elem.filter.match(/opacity=([^)]*)/)[1] ) / 100) + '':
     1107                                "";
     1108                }
     1109
     1110                name = name.replace(/-([a-z])/ig, function(all, letter){
     1111                        return letter.toUpperCase();
     1112                });
     1113
     1114                if ( set )
     1115                        elem[ name ] = value;
     1116
     1117                return elem[ name ];
     1118        },
     1119
     1120        trim: function( text ) {
     1121                return (text || "").replace( /^\s+|\s+$/g, "" );
     1122        },
     1123
     1124        makeArray: function( array ) {
     1125                var ret = [];
     1126
     1127                if( array != null ){
     1128                        var i = array.length;
     1129                        //the window, strings and functions also have 'length'
     1130                        if( i == null || array.split || array.setInterval || array.call )
     1131                                ret[0] = array;
     1132                        else
     1133                                while( i )
     1134                                        ret[--i] = array[i];
     1135                }
     1136
     1137                return ret;
     1138        },
     1139
     1140        inArray: function( elem, array ) {
     1141                for ( var i = 0, length = array.length; i < length; i++ )
     1142                // Use === because on IE, window == document
     1143                        if ( array[ i ] === elem )
     1144                                return i;
     1145
     1146                return -1;
     1147        },
     1148
     1149        merge: function( first, second ) {
     1150                // We have to loop this way because IE & Opera overwrite the length
     1151                // expando of getElementsByTagName
     1152                var i = 0, elem, pos = first.length;
     1153                // Also, we need to make sure that the correct elements are being returned
     1154                // (IE returns comment nodes in a '*' query)
     1155                if ( jQuery.browser.msie ) {
     1156                        while ( elem = second[ i++ ] )
     1157                                if ( elem.nodeType != 8 )
     1158                                        first[ pos++ ] = elem;
     1159
     1160                } else
     1161                        while ( elem = second[ i++ ] )
     1162                                first[ pos++ ] = elem;
     1163
     1164                return first;
     1165        },
     1166
     1167        unique: function( array ) {
     1168                var ret = [], done = {};
     1169
     1170                try {
     1171
     1172                        for ( var i = 0, length = array.length; i < length; i++ ) {
     1173                                var id = jQuery.data( array[ i ] );
     1174
     1175                                if ( !done[ id ] ) {
     1176                                        done[ id ] = true;
     1177                                        ret.push( array[ i ] );
     1178                                }
     1179                        }
     1180
     1181                } catch( e ) {
     1182                        ret = array;
     1183                }
     1184
     1185                return ret;
     1186        },
     1187
     1188        grep: function( elems, callback, inv ) {
     1189                var ret = [];
     1190
     1191                // Go through the array, only saving the items
     1192                // that pass the validator function
     1193                for ( var i = 0, length = elems.length; i < length; i++ )
     1194                        if ( !inv != !callback( elems[ i ], i ) )
     1195                                ret.push( elems[ i ] );
     1196
     1197                return ret;
     1198        },
     1199
     1200        map: function( elems, callback ) {
     1201                var ret = [];
     1202
     1203                // Go through the array, translating each of the items to their
     1204                // new value (or values).
     1205                for ( var i = 0, length = elems.length; i < length; i++ ) {
     1206                        var value = callback( elems[ i ], i );
     1207
     1208                        if ( value != null )
     1209                                ret[ ret.length ] = value;
     1210                }
     1211
     1212                return ret.concat.apply( [], ret );
     1213        }
     1214});
     1215
     1216var userAgent = navigator.userAgent.toLowerCase();
     1217
     1218// Figure out what browser is being used
     1219jQuery.browser = {
     1220        version: (userAgent.match( /.+(?:rv|it|ra|ie)[\/: ]([\d.]+)/ ) || [])[1],
     1221        safari: /webkit/.test( userAgent ),
     1222        opera: /opera/.test( userAgent ),
     1223        msie: /msie/.test( userAgent ) && !/opera/.test( userAgent ),
     1224        mozilla: /mozilla/.test( userAgent ) && !/(compatible|webkit)/.test( userAgent )
     1225};
     1226
     1227var styleFloat = jQuery.browser.msie ?
     1228        "styleFloat" :
     1229        "cssFloat";
     1230
     1231jQuery.extend({
     1232        // Check to see if the W3C box model is being used
     1233        boxModel: !jQuery.browser.msie || document.compatMode == "CSS1Compat",
     1234
     1235        props: {
     1236                "for": "htmlFor",
     1237                "class": "className",
     1238                "float": styleFloat,
     1239                cssFloat: styleFloat,
     1240                styleFloat: styleFloat,
     1241                readonly: "readOnly",
     1242                maxlength: "maxLength",
     1243                cellspacing: "cellSpacing"
     1244        }
     1245});
     1246
     1247jQuery.each({
     1248        parent: function(elem){return elem.parentNode;},
     1249        parents: function(elem){return jQuery.dir(elem,"parentNode");},
     1250        next: function(elem){return jQuery.nth(elem,2,"nextSibling");},
     1251        prev: function(elem){return jQuery.nth(elem,2,"previousSibling");},
     1252        nextAll: function(elem){return jQuery.dir(elem,"nextSibling");},
     1253        prevAll: function(elem){return jQuery.dir(elem,"previousSibling");},
     1254        siblings: function(elem){return jQuery.sibling(elem.parentNode.firstChild,elem);},
     1255        children: function(elem){return jQuery.sibling(elem.firstChild);},
     1256        contents: function(elem){return jQuery.nodeName(elem,"iframe")?elem.contentDocument||elem.contentWindow.document:jQuery.makeArray(elem.childNodes);}
     1257}, function(name, fn){
     1258        jQuery.fn[ name ] = function( selector ) {
     1259                var ret = jQuery.map( this, fn );
     1260
     1261                if ( selector && typeof selector == "string" )
     1262                        ret = jQuery.multiFilter( selector, ret );
     1263
     1264                return this.pushStack( jQuery.unique( ret ) );
     1265        };
     1266});
     1267
     1268jQuery.each({
     1269        appendTo: "append",
     1270        prependTo: "prepend",
     1271        insertBefore: "before",
     1272        insertAfter: "after",
     1273        replaceAll: "replaceWith"
     1274}, function(name, original){
     1275        jQuery.fn[ name ] = function() {
     1276                var args = arguments;
     1277
     1278                return this.each(function(){
     1279                        for ( var i = 0, length = args.length; i < length; i++ )
     1280                                jQuery( args[ i ] )[ original ]( this );
     1281                });
     1282        };
     1283});
     1284
     1285jQuery.each({
     1286        removeAttr: function( name ) {
     1287                jQuery.attr( this, name, "" );
     1288                if (this.nodeType == 1)
     1289                        this.removeAttribute( name );
     1290        },
     1291
     1292        addClass: function( classNames ) {
     1293                jQuery.className.add( this, classNames );
     1294        },
     1295
     1296        removeClass: function( classNames ) {
     1297                jQuery.className.remove( this, classNames );
     1298        },
     1299
     1300        toggleClass: function( classNames ) {
     1301                jQuery.className[ jQuery.className.has( this, classNames ) ? "remove" : "add" ]( this, classNames );
     1302        },
     1303
     1304        remove: function( selector ) {
     1305                if ( !selector || jQuery.filter( selector, [ this ] ).r.length ) {
     1306                        // Prevent memory leaks
     1307                        jQuery( "*", this ).add(this).each(function(){
     1308                                jQuery.event.remove(this);
     1309                                jQuery.removeData(this);
     1310                        });
     1311                        if (this.parentNode)
     1312                                this.parentNode.removeChild( this );
     1313                }
     1314        },
     1315
     1316        empty: function() {
     1317                // Remove element nodes and prevent memory leaks
     1318                jQuery( ">*", this ).remove();
     1319
     1320                // Remove any remaining nodes
     1321                while ( this.firstChild )
     1322                        this.removeChild( this.firstChild );
     1323        }
     1324}, function(name, fn){
     1325        jQuery.fn[ name ] = function(){
     1326                return this.each( fn, arguments );
     1327        };
     1328});
     1329
     1330jQuery.each([ "Height", "Width" ], function(i, name){
     1331        var type = name.toLowerCase();
     1332
     1333        jQuery.fn[ type ] = function( size ) {
     1334                // Get window width or height
     1335                return this[0] == window ?
     1336                        // Opera reports document.body.client[Width/Height] properly in both quirks and standards
     1337                        jQuery.browser.opera && document.body[ "client" + name ] ||
     1338
     1339                        // Safari reports inner[Width/Height] just fine (Mozilla and Opera include scroll bar widths)
     1340                        jQuery.browser.safari && window[ "inner" + name ] ||
     1341
     1342                        // Everyone else use document.documentElement or document.body depending on Quirks vs Standards mode
     1343                        document.compatMode == "CSS1Compat" && document.documentElement[ "client" + name ] || document.body[ "client" + name ] :
     1344
     1345                        // Get document width or height
     1346                        this[0] == document ?
     1347                                // Either scroll[Width/Height] or offset[Width/Height], whichever is greater
     1348                                Math.max(
     1349                                        Math.max(document.body["scroll" + name], document.documentElement["scroll" + name]),
     1350                                        Math.max(document.body["offset" + name], document.documentElement["offset" + name])
     1351                                ) :
     1352
     1353                                // Get or set width or height on the element
     1354                                size == undefined ?
     1355                                        // Get width or height on the element
     1356                                        (this.length ? jQuery.css( this[0], type ) : null) :
     1357
     1358                                        // Set the width or height on the element (default to pixels if value is unitless)
     1359                                        this.css( type, size.constructor == String ? size : size + "px" );
     1360        };
     1361});
     1362
     1363// Helper function used by the dimensions and offset modules
     1364function num(elem, prop) {
     1365        return elem[0] && parseInt( jQuery.curCSS(elem[0], prop, true), 10 ) || 0;
     1366}var chars = jQuery.browser.safari && parseInt(jQuery.browser.version) < 417 ?
     1367                "(?:[\\w*_-]|\\\\.)" :
     1368                "(?:[\\w\u0128-\uFFFF*_-]|\\\\.)",
     1369        quickChild = new RegExp("^>\\s*(" + chars + "+)"),
     1370        quickID = new RegExp("^(" + chars + "+)(#)(" + chars + "+)"),
     1371        quickClass = new RegExp("^([#.]?)(" + chars + "*)");
     1372
     1373jQuery.extend({
     1374        expr: {
     1375                "": function(a,i,m){return m[2]=="*"||jQuery.nodeName(a,m[2]);},
     1376                "#": function(a,i,m){return a.getAttribute("id")==m[2];},
     1377                ":": {
     1378                        // Position Checks
     1379                        lt: function(a,i,m){return i<m[3]-0;},
     1380                        gt: function(a,i,m){return i>m[3]-0;},
     1381                        nth: function(a,i,m){return m[3]-0==i;},
     1382                        eq: function(a,i,m){return m[3]-0==i;},
     1383                        first: function(a,i){return i==0;},
     1384                        last: function(a,i,m,r){return i==r.length-1;},
     1385                        even: function(a,i){return i%2==0;},
     1386                        odd: function(a,i){return i%2;},
     1387
     1388                        // Child Checks
     1389                        "first-child": function(a){return a.parentNode.getElementsByTagName("*")[0]==a;},
     1390                        "last-child": function(a){return jQuery.nth(a.parentNode.lastChild,1,"previousSibling")==a;},
     1391                        "only-child": function(a){return !jQuery.nth(a.parentNode.lastChild,2,"previousSibling");},
     1392
     1393                        // Parent Checks
     1394                        parent: function(a){return a.firstChild;},
     1395                        empty: function(a){return !a.firstChild;},
     1396
     1397                        // Text Check
     1398                        contains: function(a,i,m){return (a.textContent||a.innerText||jQuery(a).text()||"").indexOf(m[3])>=0;},
     1399
     1400                        // Visibility
     1401                        visible: function(a){return "hidden"!=a.type&&jQuery.css(a,"display")!="none"&&jQuery.css(a,"visibility")!="hidden";},
     1402                        hidden: function(a){return "hidden"==a.type||jQuery.css(a,"display")=="none"||jQuery.css(a,"visibility")=="hidden";},
     1403
     1404                        // Form attributes
     1405                        enabled: function(a){return !a.disabled;},
     1406                        disabled: function(a){return a.disabled;},
     1407                        checked: function(a){return a.checked;},
     1408                        selected: function(a){return a.selected||jQuery.attr(a,"selected");},
     1409
     1410                        // Form elements
     1411                        text: function(a){return "text"==a.type;},
     1412                        radio: function(a){return "radio"==a.type;},
     1413                        checkbox: function(a){return "checkbox"==a.type;},
     1414                        file: function(a){return "file"==a.type;},
     1415                        password: function(a){return "password"==a.type;},
     1416                        submit: function(a){return "submit"==a.type;},
     1417                        image: function(a){return "image"==a.type;},
     1418                        reset: function(a){return "reset"==a.type;},
     1419                        button: function(a){return "button"==a.type||jQuery.nodeName(a,"button");},
     1420                        input: function(a){return /input|select|textarea|button/i.test(a.nodeName);},
     1421
     1422                        // :has()
     1423                        has: function(a,i,m){return jQuery.find(m[3],a).length;},
     1424
     1425                        // :header
     1426                        header: function(a){return /h\d/i.test(a.nodeName);},
     1427
     1428                        // :animated
     1429                        animated: function(a){return jQuery.grep(jQuery.timers,function(fn){return a==fn.elem;}).length;}
     1430                }
     1431        },
     1432
     1433        // The regular expressions that power the parsing engine
     1434        parse: [
     1435                // Match: [@value='test'], [@foo]
     1436                /^(\[) *@?([\w-]+) *([!*$^~=]*) *('?"?)(.*?)\4 *\]/,
     1437
     1438                // Match: :contains('foo')
     1439                /^(:)([\w-]+)\("?'?(.*?(\(.*?\))?[^(]*?)"?'?\)/,
     1440
     1441                // Match: :even, :last-child, #id, .class
     1442                new RegExp("^([:.#]*)(" + chars + "+)")
     1443        ],
     1444
     1445        multiFilter: function( expr, elems, not ) {
     1446                var old, cur = [];
     1447
     1448                while ( expr && expr != old ) {
     1449                        old = expr;
     1450                        var f = jQuery.filter( expr, elems, not );
     1451                        expr = f.t.replace(/^\s*,\s*/, "" );
     1452                        cur = not ? elems = f.r : jQuery.merge( cur, f.r );
     1453                }
     1454
     1455                return cur;
     1456        },
     1457
     1458        find: function( t, context ) {
     1459                // Quickly handle non-string expressions
     1460                if ( typeof t != "string" )
     1461                        return [ t ];
     1462
     1463                // check to make sure context is a DOM element or a document
     1464                if ( context && context.nodeType != 1 && context.nodeType != 9)
     1465                        return [ ];
     1466
     1467                // Set the correct context (if none is provided)
     1468                context = context || document;
     1469
     1470                // Initialize the search
     1471                var ret = [context], done = [], last, nodeName;
     1472
     1473                // Continue while a selector expression exists, and while
     1474                // we're no longer looping upon ourselves
     1475                while ( t && last != t ) {
     1476                        var r = [];
     1477                        last = t;
     1478
     1479                        t = jQuery.trim(t);
     1480
     1481                        var foundToken = false,
     1482
     1483                        // An attempt at speeding up child selectors that
     1484                        // point to a specific element tag
     1485                                re = quickChild,
     1486
     1487                                m = re.exec(t);
     1488
     1489                        if ( m ) {
     1490                                nodeName = m[1].toUpperCase();
     1491
     1492                                // Perform our own iteration and filter
     1493                                for ( var i = 0; ret[i]; i++ )
     1494                                        for ( var c = ret[i].firstChild; c; c = c.nextSibling )
     1495                                                if ( c.nodeType == 1 && (nodeName == "*" || c.nodeName.toUpperCase() == nodeName) )
     1496                                                        r.push( c );
     1497
     1498                                ret = r;
     1499                                t = t.replace( re, "" );
     1500                                if ( t.indexOf(" ") == 0 ) continue;
     1501                                foundToken = true;
     1502                        } else {
     1503                                re = /^([>+~])\s*(\w*)/i;
     1504
     1505                                if ( (m = re.exec(t)) != null ) {
     1506                                        r = [];
     1507
     1508                                        var merge = {};
     1509                                        nodeName = m[2].toUpperCase();
     1510                                        m = m[1];
     1511
     1512                                        for ( var j = 0, rl = ret.length; j < rl; j++ ) {
     1513                                                var n = m == "~" || m == "+" ? ret[j].nextSibling : ret[j].firstChild;
     1514                                                for ( ; n; n = n.nextSibling )
     1515                                                        if ( n.nodeType == 1 ) {
     1516                                                                var id = jQuery.data(n);
     1517
     1518                                                                if ( m == "~" && merge[id] ) break;
     1519
     1520                                                                if (!nodeName || n.nodeName.toUpperCase() == nodeName ) {
     1521                                                                        if ( m == "~" ) merge[id] = true;
     1522                                                                        r.push( n );
     1523                                                                }
     1524
     1525                                                                if ( m == "+" ) break;
     1526                                                        }
     1527                                        }
     1528
     1529                                        ret = r;
     1530
     1531                                        // And remove the token
     1532                                        t = jQuery.trim( t.replace( re, "" ) );
     1533                                        foundToken = true;
     1534                                }
     1535                        }
     1536
     1537                        // See if there's still an expression, and that we haven't already
     1538                        // matched a token
     1539                        if ( t && !foundToken ) {
     1540                                // Handle multiple expressions
     1541                                if ( !t.indexOf(",") ) {
     1542                                        // Clean the result set
     1543                                        if ( context == ret[0] ) ret.shift();
     1544
     1545                                        // Merge the result sets
     1546                                        done = jQuery.merge( done, ret );
     1547
     1548                                        // Reset the context
     1549                                        r = ret = [context];
     1550
     1551                                        // Touch up the selector string
     1552                                        t = " " + t.substr(1,t.length);
     1553
     1554                                } else {
     1555                                        // Optimize for the case nodeName#idName
     1556                                        var re2 = quickID;
     1557                                        var m = re2.exec(t);
     1558
     1559                                        // Re-organize the results, so that they're consistent
     1560                                        if ( m ) {
     1561                                                m = [ 0, m[2], m[3], m[1] ];
     1562
     1563                                        } else {
     1564                                                // Otherwise, do a traditional filter check for
     1565                                                // ID, class, and element selectors
     1566                                                re2 = quickClass;
     1567                                                m = re2.exec(t);
     1568                                        }
     1569
     1570                                        m[2] = m[2].replace(/\\/g, "");
     1571
     1572                                        var elem = ret[ret.length-1];
     1573
     1574                                        // Try to do a global search by ID, where we can
     1575                                        if ( m[1] == "#" && elem && elem.getElementById && !jQuery.isXMLDoc(elem) ) {
     1576                                                // Optimization for HTML document case
     1577                                                var oid = elem.getElementById(m[2]);
     1578
     1579                                                // Do a quick check for the existence of the actual ID attribute
     1580                                                // to avoid selecting by the name attribute in IE
     1581                                                // also check to insure id is a string to avoid selecting an element with the name of 'id' inside a form
     1582                                                if ( (jQuery.browser.msie||jQuery.browser.opera) && oid && typeof oid.id == "string" && oid.id != m[2] )
     1583                                                        oid = jQuery('[@id="'+m[2]+'"]', elem)[0];
     1584
     1585                                                // Do a quick check for node name (where applicable) so
     1586                                                // that div#foo searches will be really fast
     1587                                                ret = r = oid && (!m[3] || jQuery.nodeName(oid, m[3])) ? [oid] : [];
     1588                                        } else {
     1589                                                // We need to find all descendant elements
     1590                                                for ( var i = 0; ret[i]; i++ ) {
     1591                                                        // Grab the tag name being searched for
     1592                                                        var tag = m[1] == "#" && m[3] ? m[3] : m[1] != "" || m[0] == "" ? "*" : m[2];
     1593
     1594                                                        // Handle IE7 being really dumb about <object>s
     1595                                                        if ( tag == "*" && ret[i].nodeName.toLowerCase() == "object" )
     1596                                                                tag = "param";
     1597
     1598                                                        r = jQuery.merge( r, ret[i].getElementsByTagName( tag ));
     1599                                                }
     1600
     1601                                                // It's faster to filter by class and be done with it
     1602                                                if ( m[1] == "." )
     1603                                                        r = jQuery.classFilter( r, m[2] );
     1604
     1605                                                // Same with ID filtering
     1606                                                if ( m[1] == "#" ) {
     1607                                                        var tmp = [];
     1608
     1609                                                        // Try to find the element with the ID
     1610                                                        for ( var i = 0; r[i]; i++ )
     1611                                                                if ( r[i].getAttribute("id") == m[2] ) {
     1612                                                                        tmp = [ r[i] ];
     1613                                                                        break;
     1614                                                                }
     1615
     1616                                                        r = tmp;
     1617                                                }
     1618
     1619                                                ret = r;
     1620                                        }
     1621
     1622                                        t = t.replace( re2, "" );
     1623                                }
     1624
     1625                        }
     1626
     1627                        // If a selector string still exists
     1628                        if ( t ) {
     1629                                // Attempt to filter it
     1630                                var val = jQuery.filter(t,r);
     1631                                ret = r = val.r;
     1632                                t = jQuery.trim(val.t);
     1633                        }
     1634                }
     1635
     1636                // An error occurred with the selector;
     1637                // just return an empty set instead
     1638                if ( t )
     1639                        ret = [];
     1640
     1641                // Remove the root context
     1642                if ( ret && context == ret[0] )
     1643                        ret.shift();
     1644
     1645                // And combine the results
     1646                done = jQuery.merge( done, ret );
     1647
     1648                return done;
     1649        },
     1650
     1651        classFilter: function(r,m,not){
     1652                m = " " + m + " ";
     1653                var tmp = [];
     1654                for ( var i = 0; r[i]; i++ ) {
     1655                        var pass = (" " + r[i].className + " ").indexOf( m ) >= 0;
     1656                        if ( !not && pass || not && !pass )
     1657                                tmp.push( r[i] );
     1658                }
     1659                return tmp;
     1660        },
     1661
     1662        filter: function(t,r,not) {
     1663                var last;
     1664
     1665                // Look for common filter expressions
     1666                while ( t && t != last ) {
     1667                        last = t;
     1668
     1669                        var p = jQuery.parse, m;
     1670
     1671                        for ( var i = 0; p[i]; i++ ) {
     1672                                m = p[i].exec( t );
     1673
     1674                                if ( m ) {
     1675                                        // Remove what we just matched
     1676                                        t = t.substring( m[0].length );
     1677
     1678                                        m[2] = m[2].replace(/\\/g, "");
     1679                                        break;
     1680                                }
     1681                        }
     1682
     1683                        if ( !m )
     1684                                break;
     1685
     1686                        // :not() is a special case that can be optimized by
     1687                        // keeping it out of the expression list
     1688                        if ( m[1] == ":" && m[2] == "not" )
     1689                                // optimize if only one selector found (most common case)
     1690                                r = isSimple.test( m[3] ) ?
     1691                                        jQuery.filter(m[3], r, true).r :
     1692                                        jQuery( r ).not( m[3] );
     1693
     1694                        // We can get a big speed boost by filtering by class here
     1695                        else if ( m[1] == "." )
     1696                                r = jQuery.classFilter(r, m[2], not);
     1697
     1698                        else if ( m[1] == "[" ) {
     1699                                var tmp = [], type = m[3];
     1700
     1701                                for ( var i = 0, rl = r.length; i < rl; i++ ) {
     1702                                        var a = r[i], z = a[ jQuery.props[m[2]] || m[2] ];
     1703
     1704                                        if ( z == null || /href|src|selected/.test(m[2]) )
     1705                                                z = jQuery.attr(a,m[2]) || '';
     1706
     1707                                        if ( (type == "" && !!z ||
     1708                                                 type == "=" && z == m[5] ||
     1709                                                 type == "!=" && z != m[5] ||
     1710                                                 type == "^=" && z && !z.indexOf(m[5]) ||
     1711                                                 type == "$=" && z.substr(z.length - m[5].length) == m[5] ||
     1712                                                 (type == "*=" || type == "~=") && z.indexOf(m[5]) >= 0) ^ not )
     1713                                                        tmp.push( a );
     1714                                }
     1715
     1716                                r = tmp;
     1717
     1718                        // We can get a speed boost by handling nth-child here
     1719                        } else if ( m[1] == ":" && m[2] == "nth-child" ) {
     1720                                var merge = {}, tmp = [],
     1721                                        // parse equations like 'even', 'odd', '5', '2n', '3n+2', '4n-1', '-n+6'
     1722                                        test = /(-?)(\d*)n((?:\+|-)?\d*)/.exec(
     1723                                                m[3] == "even" && "2n" || m[3] == "odd" && "2n+1" ||
     1724                                                !/\D/.test(m[3]) && "0n+" + m[3] || m[3]),
     1725                                        // calculate the numbers (first)n+(last) including if they are negative
     1726                                        first = (test[1] + (test[2] || 1)) - 0, last = test[3] - 0;
     1727
     1728                                // loop through all the elements left in the jQuery object
     1729                                for ( var i = 0, rl = r.length; i < rl; i++ ) {
     1730                                        var node = r[i], parentNode = node.parentNode, id = jQuery.data(parentNode);
     1731
     1732                                        if ( !merge[id] ) {
     1733                                                var c = 1;
     1734
     1735                                                for ( var n = parentNode.firstChild; n; n = n.nextSibling )
     1736                                                        if ( n.nodeType == 1 )
     1737                                                                n.nodeIndex = c++;
     1738
     1739                                                merge[id] = true;
     1740                                        }
     1741
     1742                                        var add = false;
     1743
     1744                                        if ( first == 0 ) {
     1745                                                if ( node.nodeIndex == last )
     1746                                                        add = true;
     1747                                        } else if ( (node.nodeIndex - last) % first == 0 && (node.nodeIndex - last) / first >= 0 )
     1748                                                add = true;
     1749
     1750                                        if ( add ^ not )
     1751                                                tmp.push( node );
     1752                                }
     1753
     1754                                r = tmp;
     1755
     1756                        // Otherwise, find the expression to execute
     1757                        } else {
     1758                                var fn = jQuery.expr[ m[1] ];
     1759                                if ( typeof fn == "object" )
     1760                                        fn = fn[ m[2] ];
     1761
     1762                                if ( typeof fn == "string" )
     1763                                        fn = eval("false||function(a,i){return " + fn + ";}");
     1764
     1765                                // Execute it against the current filter
     1766                                r = jQuery.grep( r, function(elem, i){
     1767                                        return fn(elem, i, m, r);
     1768                                }, not );
     1769                        }
     1770                }
     1771
     1772                // Return an array of filtered elements (r)
     1773                // and the modified expression string (t)
     1774                return { r: r, t: t };
     1775        },
     1776
     1777        dir: function( elem, dir ){
     1778                var matched = [],
     1779                        cur = elem[dir];
     1780                while ( cur && cur != document ) {
     1781                        if ( cur.nodeType == 1 )
     1782                                matched.push( cur );
     1783                        cur = cur[dir];
     1784                }
     1785                return matched;
     1786        },
     1787
     1788        nth: function(cur,result,dir,elem){
     1789                result = result || 1;
     1790                var num = 0;
     1791
     1792                for ( ; cur; cur = cur[dir] )
     1793                        if ( cur.nodeType == 1 && ++num == result )
     1794                                break;
     1795
     1796                return cur;
     1797        },
     1798
     1799        sibling: function( n, elem ) {
     1800                var r = [];
     1801
     1802                for ( ; n; n = n.nextSibling ) {
     1803                        if ( n.nodeType == 1 && n != elem )
     1804                                r.push( n );
     1805                }
     1806
     1807                return r;
     1808        }
     1809});
     1810/*
     1811 * A number of helper functions used for managing events.
     1812 * Many of the ideas behind this code orignated from
     1813 * Dean Edwards' addEvent library.
     1814 */
     1815jQuery.event = {
     1816
     1817        // Bind an event to an element
     1818        // Original by Dean Edwards
     1819        add: function(elem, types, handler, data) {
     1820                if ( elem.nodeType == 3 || elem.nodeType == 8 )
     1821                        return;
     1822
     1823                // For whatever reason, IE has trouble passing the window object
     1824                // around, causing it to be cloned in the process
     1825                if ( jQuery.browser.msie && elem.setInterval )
     1826                        elem = window;
     1827
     1828                // Make sure that the function being executed has a unique ID
     1829                if ( !handler.guid )
     1830                        handler.guid = this.guid++;
     1831
     1832                // if data is passed, bind to handler
     1833                if( data != undefined ) {
     1834                        // Create temporary function pointer to original handler
     1835                        var fn = handler;
     1836
     1837                        // Create unique handler function, wrapped around original handler
     1838                        handler = this.proxy( fn, function() {
     1839                                // Pass arguments and context to original handler
     1840                                return fn.apply(this, arguments);
     1841                        });
     1842
     1843                        // Store data in unique handler
     1844                        handler.data = data;
     1845                }
     1846
     1847                // Init the element's event structure
     1848                var events = jQuery.data(elem, "events") || jQuery.data(elem, "events", {}),
     1849                        handle = jQuery.data(elem, "handle") || jQuery.data(elem, "handle", function(){
     1850                                // Handle the second event of a trigger and when
     1851                                // an event is called after a page has unloaded
     1852                                if ( typeof jQuery != "undefined" && !jQuery.event.triggered )
     1853                                        return jQuery.event.handle.apply(arguments.callee.elem, arguments);
     1854                        });
     1855                // Add elem as a property of the handle function
     1856                // This is to prevent a memory leak with non-native
     1857                // event in IE.
     1858                handle.elem = elem;
     1859
     1860                // Handle multiple events separated by a space
     1861                // jQuery(...).bind("mouseover mouseout", fn);
     1862                jQuery.each(types.split(/\s+/), function(index, type) {
     1863                        // Namespaced event handlers
     1864                        var parts = type.split(".");
     1865                        type = parts[0];
     1866                        handler.type = parts[1];
     1867
     1868                        // Get the current list of functions bound to this event
     1869                        var handlers = events[type];
     1870
     1871                        // Init the event handler queue
     1872                        if (!handlers) {
     1873                                handlers = events[type] = {};
     1874
     1875                                // Check for a special event handler
     1876                                // Only use addEventListener/attachEvent if the special
     1877                                // events handler returns false
     1878                                if ( !jQuery.event.special[type] || jQuery.event.special[type].setup.call(elem) === false ) {
     1879                                        // Bind the global event handler to the element
     1880                                        if (elem.addEventListener)
     1881                                                elem.addEventListener(type, handle, false);
     1882                                        else if (elem.attachEvent)
     1883                                                elem.attachEvent("on" + type, handle);
     1884                                }
     1885                        }
     1886
     1887                        // Add the function to the element's handler list
     1888                        handlers[handler.guid] = handler;
     1889
     1890                        // Keep track of which events have been used, for global triggering
     1891                        jQuery.event.global[type] = true;
     1892                });
     1893
     1894                // Nullify elem to prevent memory leaks in IE
     1895                elem = null;
     1896        },
     1897
     1898        guid: 1,
     1899        global: {},
     1900
     1901        // Detach an event or set of events from an element
     1902        remove: function(elem, types, handler) {
     1903                // don't do events on text and comment nodes
     1904                if ( elem.nodeType == 3 || elem.nodeType == 8 )
     1905                        return;
     1906
     1907                var events = jQuery.data(elem, "events"), ret, index;
     1908
     1909                if ( events ) {
     1910                        // Unbind all events for the element
     1911                        if ( types == undefined || (typeof types == "string" && types.charAt(0) == ".") )
     1912                                for ( var type in events )
     1913                                        this.remove( elem, type + (types || "") );
     1914                        else {
     1915                                // types is actually an event object here
     1916                                if ( types.type ) {
     1917                                        handler = types.handler;
     1918                                        types = types.type;
     1919                                }
     1920
     1921                                // Handle multiple events seperated by a space
     1922                                // jQuery(...).unbind("mouseover mouseout", fn);
     1923                                jQuery.each(types.split(/\s+/), function(index, type){
     1924                                        // Namespaced event handlers
     1925                                        var parts = type.split(".");
     1926                                        type = parts[0];
     1927
     1928                                        if ( events[type] ) {
     1929                                                // remove the given handler for the given type
     1930                                                if ( handler )
     1931                                                        delete events[type][handler.guid];
     1932
     1933                                                // remove all handlers for the given type
     1934                                                else
     1935                                                        for ( handler in events[type] )
     1936                                                                // Handle the removal of namespaced events
     1937                                                                if ( !parts[1] || events[type][handler].type == parts[1] )
     1938                                                                        delete events[type][handler];
     1939
     1940                                                // remove generic event handler if no more handlers exist
     1941                                                for ( ret in events[type] ) break;
     1942                                                if ( !ret ) {
     1943                                                        if ( !jQuery.event.special[type] || jQuery.event.special[type].teardown.call(elem) === false ) {
     1944                                                                if (elem.removeEventListener)
     1945                                                                        elem.removeEventListener(type, jQuery.data(elem, "handle"), false);
     1946                                                                else if (elem.detachEvent)
     1947                                                                        elem.detachEvent("on" + type, jQuery.data(elem, "handle"));
     1948                                                        }
     1949                                                        ret = null;
     1950                                                        delete events[type];
     1951                                                }
     1952                                        }
     1953                                });
     1954                        }
     1955
     1956                        // Remove the expando if it's no longer used
     1957                        for ( ret in events ) break;
     1958                        if ( !ret ) {
     1959                                var handle = jQuery.data( elem, "handle" );
     1960                                if ( handle ) handle.elem = null;
     1961                                jQuery.removeData( elem, "events" );
     1962                                jQuery.removeData( elem, "handle" );
     1963                        }
     1964                }
     1965        },
     1966
     1967        trigger: function(type, data, elem, donative, extra) {
     1968                // Clone the incoming data, if any
     1969                data = jQuery.makeArray(data);
     1970
     1971                if ( type.indexOf("!") >= 0 ) {
     1972                        type = type.slice(0, -1);
     1973                        var exclusive = true;
     1974                }
     1975
     1976                // Handle a global trigger
     1977                if ( !elem ) {
     1978                        // Only trigger if we've ever bound an event for it
     1979                        if ( this.global[type] )
     1980                                jQuery("*").add([window, document]).trigger(type, data);
     1981
     1982                // Handle triggering a single element
     1983                } else {
     1984                        // don't do events on text and comment nodes
     1985                        if ( elem.nodeType == 3 || elem.nodeType == 8 )
     1986                                return undefined;
     1987
     1988                        var val, ret, fn = jQuery.isFunction( elem[ type ] || null ),
     1989                                // Check to see if we need to provide a fake event, or not
     1990                                event = !data[0] || !data[0].preventDefault;
     1991
     1992                        // Pass along a fake event
     1993                        if ( event ) {
     1994                                data.unshift({
     1995                                        type: type,
     1996                                        target: elem,
     1997                                        preventDefault: function(){},
     1998                                        stopPropagation: function(){},
     1999                                        timeStamp: now()
     2000                                });
     2001                                data[0][expando] = true; // no need to fix fake event
     2002                        }
     2003
     2004                        // Enforce the right trigger type
     2005                        data[0].type = type;
     2006                        if ( exclusive )
     2007                                data[0].exclusive = true;
     2008
     2009                        // Trigger the event, it is assumed that "handle" is a function
     2010                        var handle = jQuery.data(elem, "handle");
     2011                        if ( handle )
     2012                                val = handle.apply( elem, data );
     2013
     2014                        // Handle triggering native .onfoo handlers (and on links since we don't call .click() for links)
     2015                        if ( (!fn || (jQuery.nodeName(elem, 'a') && type == "click")) && elem["on"+type] && elem["on"+type].apply( elem, data ) === false )
     2016                                val = false;
     2017
     2018                        // Extra functions don't get the custom event object
     2019                        if ( event )
     2020                                data.shift();
     2021
     2022                        // Handle triggering of extra function
     2023                        if ( extra && jQuery.isFunction( extra ) ) {
     2024                                // call the extra function and tack the current return value on the end for possible inspection
     2025                                ret = extra.apply( elem, val == null ? data : data.concat( val ) );
     2026                                // if anything is returned, give it precedence and have it overwrite the previous value
     2027                                if (ret !== undefined)
     2028                                        val = ret;
     2029                        }
     2030
     2031                        // Trigger the native events (except for clicks on links)
     2032                        if ( fn && donative !== false && val !== false && !(jQuery.nodeName(elem, 'a') && type == "click") ) {
     2033                                this.triggered = true;
     2034                                try {
     2035                                        elem[ type ]();
     2036                                // prevent IE from throwing an error for some hidden elements
     2037                                } catch (e) {}
     2038                        }
     2039
     2040                        this.triggered = false;
     2041                }
     2042
     2043                return val;
     2044        },
     2045
     2046        handle: function(event) {
     2047                // returned undefined or false
     2048                var val, ret, namespace, all, handlers;
     2049
     2050                event = arguments[0] = jQuery.event.fix( event || window.event );
     2051
     2052                // Namespaced event handlers
     2053                namespace = event.type.split(".");
     2054                event.type = namespace[0];
     2055                namespace = namespace[1];
     2056                // Cache this now, all = true means, any handler
     2057                all = !namespace && !event.exclusive;
     2058
     2059                handlers = ( jQuery.data(this, "events") || {} )[event.type];
     2060
     2061                for ( var j in handlers ) {
     2062                        var handler = handlers[j];
     2063
     2064                        // Filter the functions by class
     2065                        if ( all || handler.type == namespace ) {
     2066                                // Pass in a reference to the handler function itself
     2067                                // So that we can later remove it
     2068                                event.handler = handler;
     2069                                event.data = handler.data;
     2070
     2071                                ret = handler.apply( this, arguments );
     2072
     2073                                if ( val !== false )
     2074                                        val = ret;
     2075
     2076                                if ( ret === false ) {
     2077                                        event.preventDefault();
     2078                                        event.stopPropagation();
     2079                                }
     2080                        }
     2081                }
     2082
     2083                return val;
     2084        },
     2085
     2086        fix: function(event) {
     2087                if ( event[expando] == true )
     2088                        return event;
     2089
     2090                // store a copy of the original event object
     2091                // and "clone" to set read-only properties
     2092                var originalEvent = event;
     2093                event = { originalEvent: originalEvent };
     2094                var 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 timeStamp toElement type view wheelDelta which".split(" ");
     2095                for ( var i=props.length; i; i-- )
     2096                        event[ props[i] ] = originalEvent[ props[i] ];
     2097
     2098                // Mark it as fixed
     2099                event[expando] = true;
     2100
     2101                // add preventDefault and stopPropagation since
     2102                // they will not work on the clone
     2103                event.preventDefault = function() {
     2104                        // if preventDefault exists run it on the original event
     2105                        if (originalEvent.preventDefault)
     2106                                originalEvent.preventDefault();
     2107                        // otherwise set the returnValue property of the original event to false (IE)
     2108                        originalEvent.returnValue = false;
     2109                };
     2110                event.stopPropagation = function() {
     2111                        // if stopPropagation exists run it on the original event
     2112                        if (originalEvent.stopPropagation)
     2113                                originalEvent.stopPropagation();
     2114                        // otherwise set the cancelBubble property of the original event to true (IE)
     2115                        originalEvent.cancelBubble = true;
     2116                };
     2117
     2118                // Fix timeStamp
     2119                event.timeStamp = event.timeStamp || now();
     2120
     2121                // Fix target property, if necessary
     2122                if ( !event.target )
     2123                        event.target = event.srcElement || document; // Fixes #1925 where srcElement might not be defined either
     2124
     2125                // check if target is a textnode (safari)
     2126                if ( event.target.nodeType == 3 )
     2127                        event.target = event.target.parentNode;
     2128
     2129                // Add relatedTarget, if necessary
     2130                if ( !event.relatedTarget && event.fromElement )
     2131                        event.relatedTarget = event.fromElement == event.target ? event.toElement : event.fromElement;
     2132
     2133                // Calculate pageX/Y if missing and clientX/Y available
     2134                if ( event.pageX == null && event.clientX != null ) {
     2135                        var doc = document.documentElement, body = document.body;
     2136                        event.pageX = event.clientX + (doc && doc.scrollLeft || body && body.scrollLeft || 0) - (doc.clientLeft || 0);
     2137                        event.pageY = event.clientY + (doc && doc.scrollTop || body && body.scrollTop || 0) - (doc.clientTop || 0);
     2138                }
     2139
     2140                // Add which for key events
     2141                if ( !event.which && ((event.charCode || event.charCode === 0) ? event.charCode : event.keyCode) )
     2142                        event.which = event.charCode || event.keyCode;
     2143
     2144                // Add metaKey to non-Mac browsers (use ctrl for PC's and Meta for Macs)
     2145                if ( !event.metaKey && event.ctrlKey )
     2146                        event.metaKey = event.ctrlKey;
     2147
     2148                // Add which for click: 1 == left; 2 == middle; 3 == right
     2149                // Note: button is not normalized, so don't use it
     2150                if ( !event.which && event.button )
     2151                        event.which = (event.button & 1 ? 1 : ( event.button & 2 ? 3 : ( event.button & 4 ? 2 : 0 ) ));
     2152
     2153                return event;
     2154        },
     2155
     2156        proxy: function( fn, proxy ){
     2157                // Set the guid of unique handler to the same of original handler, so it can be removed
     2158                proxy.guid = fn.guid = fn.guid || proxy.guid || this.guid++;
     2159                // So proxy can be declared as an argument
     2160                return proxy;
     2161        },
     2162
     2163        special: {
     2164                ready: {
     2165                        setup: function() {
     2166                                // Make sure the ready event is setup
     2167                                bindReady();
     2168                                return;
     2169                        },
     2170
     2171                        teardown: function() { return; }
     2172                },
     2173
     2174                mouseenter: {
     2175                        setup: function() {
     2176                                if ( jQuery.browser.msie ) return false;
     2177                                jQuery(this).bind("mouseover", jQuery.event.special.mouseenter.handler);
     2178                                return true;
     2179                        },
     2180
     2181                        teardown: function() {
     2182                                if ( jQuery.browser.msie ) return false;
     2183                                jQuery(this).unbind("mouseover", jQuery.event.special.mouseenter.handler);
     2184                                return true;
     2185                        },
     2186
     2187                        handler: function(event) {
     2188                                // If we actually just moused on to a sub-element, ignore it
     2189                                if ( withinElement(event, this) ) return true;
     2190                                // Execute the right handlers by setting the event type to mouseenter
     2191                                event.type = "mouseenter";
     2192                                return jQuery.event.handle.apply(this, arguments);
     2193                        }
     2194                },
     2195
     2196                mouseleave: {
     2197                        setup: function() {
     2198                                if ( jQuery.browser.msie ) return false;
     2199                                jQuery(this).bind("mouseout", jQuery.event.special.mouseleave.handler);
     2200                                return true;
     2201                        },
     2202
     2203                        teardown: function() {
     2204                                if ( jQuery.browser.msie ) return false;
     2205                                jQuery(this).unbind("mouseout", jQuery.event.special.mouseleave.handler);
     2206                                return true;
     2207                        },
     2208
     2209                        handler: function(event) {
     2210                                // If we actually just moused on to a sub-element, ignore it
     2211                                if ( withinElement(event, this) ) return true;
     2212                                // Execute the right handlers by setting the event type to mouseleave
     2213                                event.type = "mouseleave";
     2214                                return jQuery.event.handle.apply(this, arguments);
     2215                        }
     2216                }
     2217        }
     2218};
     2219
     2220jQuery.fn.extend({
     2221        bind: function( type, data, fn ) {
     2222                return type == "unload" ? this.one(type, data, fn) : this.each(function(){
     2223                        jQuery.event.add( this, type, fn || data, fn && data );
     2224                });
     2225        },
     2226
     2227        one: function( type, data, fn ) {
     2228                var one = jQuery.event.proxy( fn || data, function(event) {
     2229                        jQuery(this).unbind(event, one);
     2230                        return (fn || data).apply( this, arguments );
     2231                });
     2232                return this.each(function(){
     2233                        jQuery.event.add( this, type, one, fn && data);
     2234                });
     2235        },
     2236
     2237        unbind: function( type, fn ) {
     2238                return this.each(function(){
     2239                        jQuery.event.remove( this, type, fn );
     2240                });
     2241        },
     2242
     2243        trigger: function( type, data, fn ) {
     2244                return this.each(function(){
     2245                        jQuery.event.trigger( type, data, this, true, fn );
     2246                });
     2247        },
     2248
     2249        triggerHandler: function( type, data, fn ) {
     2250                return this[0] && jQuery.event.trigger( type, data, this[0], false, fn );
     2251        },
     2252
     2253        toggle: function( fn ) {
     2254                // Save reference to arguments for access in closure
     2255                var args = arguments, i = 1;
     2256
     2257                // link all the functions, so any of them can unbind this click handler
     2258                while( i < args.length )
     2259                        jQuery.event.proxy( fn, args[i++] );
     2260
     2261                return this.click( jQuery.event.proxy( fn, function(event) {
     2262                        // Figure out which function to execute
     2263                        this.lastToggle = ( this.lastToggle || 0 ) % i;
     2264
     2265                        // Make sure that clicks stop
     2266                        event.preventDefault();
     2267
     2268                        // and execute the function
     2269                        return args[ this.lastToggle++ ].apply( this, arguments ) || false;
     2270                }));
     2271        },
     2272
     2273        hover: function(fnOver, fnOut) {
     2274                return this.bind('mouseenter', fnOver).bind('mouseleave', fnOut);
     2275        },
     2276
     2277        ready: function(fn) {
     2278                // Attach the listeners
     2279                bindReady();
     2280
     2281                // If the DOM is already ready
     2282                if ( jQuery.isReady )
     2283                        // Execute the function immediately
     2284                        fn.call( document, jQuery );
     2285
     2286                // Otherwise, remember the function for later
     2287                else
     2288                        // Add the function to the wait list
     2289                        jQuery.readyList.push( function() { return fn.call(this, jQuery); } );
     2290
     2291                return this;
     2292        }
     2293});
     2294
     2295jQuery.extend({
     2296        isReady: false,
     2297        readyList: [],
     2298        // Handle when the DOM is ready
     2299        ready: function() {
     2300                // Make sure that the DOM is not already loaded
     2301                if ( !jQuery.isReady ) {
     2302                        // Remember that the DOM is ready
     2303                        jQuery.isReady = true;
     2304
     2305                        // If there are functions bound, to execute
     2306                        if ( jQuery.readyList ) {
     2307                                // Execute all of them
     2308                                jQuery.each( jQuery.readyList, function(){
     2309                                        this.call( document );
     2310                                });
     2311
     2312                                // Reset the list of functions
     2313                                jQuery.readyList = null;
     2314                        }
     2315
     2316                        // Trigger any bound ready events
     2317                        jQuery(document).triggerHandler("ready");
     2318                }
     2319        }
     2320});
     2321
     2322var readyBound = false;
     2323
     2324function bindReady(){
     2325        if ( readyBound ) return;
     2326        readyBound = true;
     2327
     2328        // Mozilla, Opera (see further below for it) and webkit nightlies currently support this event
     2329        if ( document.addEventListener && !jQuery.browser.opera)
     2330                // Use the handy event callback
     2331                document.addEventListener( "DOMContentLoaded", jQuery.ready, false );
     2332
     2333        // If IE is used and is not in a frame
     2334        // Continually check to see if the document is ready
     2335        if ( jQuery.browser.msie && window == top ) (function(){
     2336                if (jQuery.isReady) return;
     2337                try {
     2338                        // If IE is used, use the trick by Diego Perini
     2339                        // http://javascript.nwbox.com/IEContentLoaded/
     2340                        document.documentElement.doScroll("left");
     2341                } catch( error ) {
     2342                        setTimeout( arguments.callee, 0 );
     2343                        return;
     2344                }
     2345                // and execute any waiting functions
     2346                jQuery.ready();
     2347        })();
     2348
     2349        if ( jQuery.browser.opera )
     2350                document.addEventListener( "DOMContentLoaded", function () {
     2351                        if (jQuery.isReady) return;
     2352                        for (var i = 0; i < document.styleSheets.length; i++)
     2353                                if (document.styleSheets[i].disabled) {
     2354                                        setTimeout( arguments.callee, 0 );
     2355                                        return;
     2356                                }
     2357                        // and execute any waiting functions
     2358                        jQuery.ready();
     2359                }, false);
     2360
     2361        if ( jQuery.browser.safari ) {
     2362                var numStyles;
     2363                (function(){
     2364                        if (jQuery.isReady) return;
     2365                        if ( document.readyState != "loaded" && document.readyState != "complete" ) {
     2366                                setTimeout( arguments.callee, 0 );
     2367                                return;
     2368                        }
     2369                        if ( numStyles === undefined )
     2370                                numStyles = jQuery("style, link[rel=stylesheet]").length;
     2371                        if ( document.styleSheets.length != numStyles ) {
     2372                                setTimeout( arguments.callee, 0 );
     2373                                return;
     2374                        }
     2375                        // and execute any waiting functions
     2376                        jQuery.ready();
     2377                })();
     2378        }
     2379
     2380        // A fallback to window.onload, that will always work
     2381        jQuery.event.add( window, "load", jQuery.ready );
     2382}
     2383
     2384jQuery.each( ("blur,focus,load,resize,scroll,unload,click,dblclick," +
     2385        "mousedown,mouseup,mousemove,mouseover,mouseout,change,select," +
     2386        "submit,keydown,keypress,keyup,error").split(","), function(i, name){
     2387
     2388        // Handle event binding
     2389        jQuery.fn[name] = function(fn){
     2390                return fn ? this.bind(name, fn) : this.trigger(name);
     2391        };
     2392});
     2393
     2394// Checks if an event happened on an element within another element
     2395// Used in jQuery.event.special.mouseenter and mouseleave handlers
     2396var withinElement = function(event, elem) {
     2397        // Check if mouse(over|out) are still within the same parent element
     2398        var parent = event.relatedTarget;
     2399        // Traverse up the tree
     2400        while ( parent && parent != elem ) try { parent = parent.parentNode; } catch(error) { parent = elem; }
     2401        // Return true if we actually just moused on to a sub-element
     2402        return parent == elem;
     2403};
     2404
     2405// Prevent memory leaks in IE
     2406// And prevent errors on refresh with events like mouseover in other browsers
     2407// Window isn't included so as not to unbind existing unload events
     2408jQuery(window).bind("unload", function() {
     2409        jQuery("*").add(document).unbind();
     2410});
     2411jQuery.fn.extend({
     2412        // Keep a copy of the old load
     2413        _load: jQuery.fn.load,
     2414
     2415        load: function( url, params, callback ) {
     2416                if ( typeof url != 'string' )
     2417                        return this._load( url );
     2418
     2419                var off = url.indexOf(" ");
     2420                if ( off >= 0 ) {
     2421                        var selector = url.slice(off, url.length);
     2422                        url = url.slice(0, off);
     2423                }
     2424
     2425                callback = callback || function(){};
     2426
     2427                // Default to a GET request
     2428                var type = "GET";
     2429
     2430                // If the second parameter was provided
     2431                if ( params )
     2432                        // If it's a function
     2433                        if ( jQuery.isFunction( params ) ) {
     2434                                // We assume that it's the callback
     2435                                callback = params;
     2436                                params = null;
     2437
     2438                        // Otherwise, build a param string
     2439                        } else {
     2440                                params = jQuery.param( params );
     2441                                type = "POST";
     2442                        }
     2443
     2444                var self = this;
     2445
     2446                // Request the remote document
     2447                jQuery.ajax({
     2448                        url: url,
     2449                        type: type,
     2450                        dataType: "html",
     2451                        data: params,
     2452                        complete: function(res, status){
     2453                                // If successful, inject the HTML into all the matched elements
     2454                                if ( status == "success" || status == "notmodified" )
     2455                                        // See if a selector was specified
     2456                                        self.html( selector ?
     2457                                                // Create a dummy div to hold the results
     2458                                                jQuery("<div/>")
     2459                                                        // inject the contents of the document in, removing the scripts
     2460                                                        // to avoid any 'Permission Denied' errors in IE
     2461                                                        .append(res.responseText.replace(/<script(.|\s)*?\/script>/g, ""))
     2462
     2463                                                        // Locate the specified elements
     2464                                                        .find(selector) :
     2465
     2466                                                // If not, just inject the full result
     2467                                                res.responseText );
     2468
     2469                                self.each( callback, [res.responseText, status, res] );
     2470                        }
     2471                });
     2472                return this;
     2473        },
     2474
     2475        serialize: function() {
     2476                return jQuery.param(this.serializeArray());
     2477        },
     2478        serializeArray: function() {
     2479                return this.map(function(){
     2480                        return jQuery.nodeName(this, "form") ?
     2481                                jQuery.makeArray(this.elements) : this;
     2482                })
     2483                .filter(function(){
     2484                        return this.name && !this.disabled &&
     2485                                (this.checked || /select|textarea/i.test(this.nodeName) ||
     2486                                        /text|hidden|password/i.test(this.type));
     2487                })
     2488                .map(function(i, elem){
     2489                        var val = jQuery(this).val();
     2490                        return val == null ? null :
     2491                                val.constructor == Array ?
     2492                                        jQuery.map( val, function(val, i){
     2493                                                return {name: elem.name, value: val};
     2494                                        }) :
     2495                                        {name: elem.name, value: val};
     2496                }).get();
     2497        }
     2498});
     2499
     2500// Attach a bunch of functions for handling common AJAX events
     2501jQuery.each( "ajaxStart,ajaxStop,ajaxComplete,ajaxError,ajaxSuccess,ajaxSend".split(","), function(i,o){
     2502        jQuery.fn[o] = function(f){
     2503                return this.bind(o, f);
     2504        };
     2505});
     2506
     2507var jsc = now();
     2508
     2509jQuery.extend({
     2510        get: function( url, data, callback, type ) {
     2511                // shift arguments if data argument was ommited
     2512                if ( jQuery.isFunction( data ) ) {
     2513                        callback = data;
     2514                        data = null;
     2515                }
     2516
     2517                return jQuery.ajax({
     2518                        type: "GET",
     2519                        url: url,
     2520                        data: data,
     2521                        success: callback,
     2522                        dataType: type
     2523                });
     2524        },
     2525
     2526        getScript: function( url, callback ) {
     2527                return jQuery.get(url, null, callback, "script");
     2528        },
     2529
     2530        getJSON: function( url, data, callback ) {
     2531                return jQuery.get(url, data, callback, "json");
     2532        },
     2533
     2534        post: function( url, data, callback, type ) {
     2535                if ( jQuery.isFunction( data ) ) {
     2536                        callback = data;
     2537                        data = {};
     2538                }
     2539
     2540                return jQuery.ajax({
     2541                        type: "POST",
     2542                        url: url,
     2543                        data: data,
     2544                        success: callback,
     2545                        dataType: type
     2546                });
     2547        },
     2548
     2549        ajaxSetup: function( settings ) {
     2550                jQuery.extend( jQuery.ajaxSettings, settings );
     2551        },
     2552
     2553        ajaxSettings: {
     2554                url: location.href,
     2555                global: true,
     2556                type: "GET",
     2557                timeout: 0,
     2558                contentType: "application/x-www-form-urlencoded",
     2559                processData: true,
     2560                async: true,
     2561                data: null,
     2562                username: null,
     2563                password: null,
     2564                accepts: {
     2565                        xml: "application/xml, text/xml",
     2566                        html: "text/html",
     2567                        script: "text/javascript, application/javascript",
     2568                        json: "application/json, text/javascript",
     2569                        text: "text/plain",
     2570                        _default: "*/*"
     2571                }
     2572        },
     2573
     2574        // Last-Modified header cache for next request
     2575        lastModified: {},
     2576
     2577        ajax: function( s ) {
     2578                // Extend the settings, but re-extend 's' so that it can be
     2579                // checked again later (in the test suite, specifically)
     2580                s = jQuery.extend(true, s, jQuery.extend(true, {}, jQuery.ajaxSettings, s));
     2581
     2582                var jsonp, jsre = /=\?(&|$)/g, status, data,
     2583                        type = s.type.toUpperCase();
     2584
     2585                // convert data if not already a string
     2586                if ( s.data && s.processData && typeof s.data != "string" )
     2587                        s.data = jQuery.param(s.data);
     2588
     2589                // Handle JSONP Parameter Callbacks
     2590                if ( s.dataType == "jsonp" ) {
     2591                        if ( type == "GET" ) {
     2592                                if ( !s.url.match(jsre) )
     2593                                        s.url += (s.url.match(/\?/) ? "&" : "?") + (s.jsonp || "callback") + "=?";
     2594                        } else if ( !s.data || !s.data.match(jsre) )
     2595                                s.data = (s.data ? s.data + "&" : "") + (s.jsonp || "callback") + "=?";
     2596                        s.dataType = "json";
     2597                }
     2598
     2599                // Build temporary JSONP function
     2600                if ( s.dataType == "json" && (s.data && s.data.match(jsre) || s.url.match(jsre)) ) {
     2601                        jsonp = "jsonp" + jsc++;
     2602
     2603                        // Replace the =? sequence both in the query string and the data
     2604                        if ( s.data )
     2605                                s.data = (s.data + "").replace(jsre, "=" + jsonp + "$1");
     2606                        s.url = s.url.replace(jsre, "=" + jsonp + "$1");
     2607
     2608                        // We need to make sure
     2609                        // that a JSONP style response is executed properly
     2610                        s.dataType = "script";
     2611
     2612                        // Handle JSONP-style loading
     2613                        window[ jsonp ] = function(tmp){
     2614                                data = tmp;
     2615                                success();
     2616                                complete();
     2617                                // Garbage collect
     2618                                window[ jsonp ] = undefined;
     2619                                try{ delete window[ jsonp ]; } catch(e){}
     2620                                if ( head )
     2621                                        head.removeChild( script );
     2622                        };
     2623                }
     2624
     2625                if ( s.dataType == "script" && s.cache == null )
     2626                        s.cache = false;
     2627
     2628                if ( s.cache === false && type == "GET" ) {
     2629                        var ts = now();
     2630                        // try replacing _= if it is there
     2631                        var ret = s.url.replace(/(\?|&)_=.*?(&|$)/, "$1_=" + ts + "$2");
     2632                        // if nothing was replaced, add timestamp to the end
     2633                        s.url = ret + ((ret == s.url) ? (s.url.match(/\?/) ? "&" : "?") + "_=" + ts : "");
     2634                }
     2635
     2636                // If data is available, append data to url for get requests
     2637                if ( s.data && type == "GET" ) {
     2638                        s.url += (s.url.match(/\?/) ? "&" : "?") + s.data;
     2639
     2640                        // IE likes to send both get and post data, prevent this
     2641                        s.data = null;
     2642                }
     2643
     2644                // Watch for a new set of requests
     2645                if ( s.global && ! jQuery.active++ )
     2646                        jQuery.event.trigger( "ajaxStart" );
     2647
     2648                // Matches an absolute URL, and saves the domain
     2649                var remote = /^(?:\w+:)?\/\/([^\/?#]+)/;
     2650
     2651                // If we're requesting a remote document
     2652                // and trying to load JSON or Script with a GET
     2653                if ( s.dataType == "script" && type == "GET"
     2654                                && remote.test(s.url) && remote.exec(s.url)[1] != location.host ){
     2655                        var head = document.getElementsByTagName("head")[0];
     2656                        var script = document.createElement("script");
     2657                        script.src = s.url;
     2658                        if (s.scriptCharset)
     2659                                script.charset = s.scriptCharset;
     2660
     2661                        // Handle Script loading
     2662                        if ( !jsonp ) {
     2663                                var done = false;
     2664
     2665                                // Attach handlers for all browsers
     2666                                script.onload = script.onreadystatechange = function(){
     2667                                        if ( !done && (!this.readyState ||
     2668                                                        this.readyState == "loaded" || this.readyState == "complete") ) {
     2669                                                done = true;
     2670                                                success();
     2671                                                complete();
     2672                                                head.removeChild( script );
     2673                                        }
     2674                                };
     2675                        }
     2676
     2677                        head.appendChild(script);
     2678
     2679                        // We handle everything using the script element injection
     2680                        return undefined;
     2681                }
     2682
     2683                var requestDone = false;
     2684
     2685                // Create the request object; Microsoft failed to properly
     2686                // implement the XMLHttpRequest in IE7, so we use the ActiveXObject when it is available
     2687                var xhr = window.ActiveXObject ? new ActiveXObject("Microsoft.XMLHTTP") : new XMLHttpRequest();
     2688
     2689                // Open the socket
     2690                // Passing null username, generates a login popup on Opera (#2865)
     2691                if( s.username )
     2692                        xhr.open(type, s.url, s.async, s.username, s.password);
     2693                else
     2694                        xhr.open(type, s.url, s.async);
     2695
     2696                // Need an extra try/catch for cross domain requests in Firefox 3
     2697                try {
     2698                        // Set the correct header, if data is being sent
     2699                        if ( s.data )
     2700                                xhr.setRequestHeader("Content-Type", s.contentType);
     2701
     2702                        // Set the If-Modified-Since header, if ifModified mode.
     2703                        if ( s.ifModified )
     2704                                xhr.setRequestHeader("If-Modified-Since",
     2705                                        jQuery.lastModified[s.url] || "Thu, 01 Jan 1970 00:00:00 GMT" );
     2706
     2707                        // Set header so the called script knows that it's an XMLHttpRequest
     2708                        xhr.setRequestHeader("X-Requested-With", "XMLHttpRequest");
     2709
     2710                        // Set the Accepts header for the server, depending on the dataType
     2711                        xhr.setRequestHeader("Accept", s.dataType && s.accepts[ s.dataType ] ?
     2712                                s.accepts[ s.dataType ] + ", */*" :
     2713                                s.accepts._default );
     2714                } catch(e){}
     2715
     2716                // Allow custom headers/mimetypes
     2717                if ( s.beforeSend && s.beforeSend(xhr, s) === false ) {
     2718                        // cleanup active request counter
     2719                        s.global && jQuery.active--;
     2720                        // close opended socket
     2721                        xhr.abort();
     2722                        return false;
     2723                }
     2724
     2725                if ( s.global )
     2726                        jQuery.event.trigger("ajaxSend", [xhr, s]);
     2727
     2728                // Wait for a response to come back
     2729                var onreadystatechange = function(isTimeout){
     2730                        // The transfer is complete and the data is available, or the request timed out
     2731                        if ( !requestDone && xhr && (xhr.readyState == 4 || isTimeout == "timeout") ) {
     2732                                requestDone = true;
     2733
     2734                                // clear poll interval
     2735                                if (ival) {
     2736                                        clearInterval(ival);
     2737                                        ival = null;
     2738                                }
     2739
     2740                                status = isTimeout == "timeout" && "timeout" ||
     2741                                        !jQuery.httpSuccess( xhr ) && "error" ||
     2742                                        s.ifModified && jQuery.httpNotModified( xhr, s.url ) && "notmodified" ||
     2743                                        "success";
     2744
     2745                                if ( status == "success" ) {
     2746                                        // Watch for, and catch, XML document parse errors
     2747                                        try {
     2748                                                // process the data (runs the xml through httpData regardless of callback)
     2749                                                data = jQuery.httpData( xhr, s.dataType, s.dataFilter );
     2750                                        } catch(e) {
     2751                                                status = "parsererror";
     2752                                        }
     2753                                }
     2754
     2755                                // Make sure that the request was successful or notmodified
     2756                                if ( status == "success" ) {
     2757                                        // Cache Last-Modified header, if ifModified mode.
     2758                                        var modRes;
     2759                                        try {
     2760                                                modRes = xhr.getResponseHeader("Last-Modified");
     2761                                        } catch(e) {} // swallow exception thrown by FF if header is not available
     2762
     2763                                        if ( s.ifModified && modRes )
     2764                                                jQuery.lastModified[s.url] = modRes;
     2765
     2766                                        // JSONP handles its own success callback
     2767                                        if ( !jsonp )
     2768                                                success();
     2769                                } else
     2770                                        jQuery.handleError(s, xhr, status);
     2771
     2772                                // Fire the complete handlers
     2773                                complete();
     2774
     2775                                // Stop memory leaks
     2776                                if ( s.async )
     2777                                        xhr = null;
     2778                        }
     2779                };
     2780
     2781                if ( s.async ) {
     2782                        // don't attach the handler to the request, just poll it instead
     2783                        var ival = setInterval(onreadystatechange, 13);
     2784
     2785                        // Timeout checker
     2786                        if ( s.timeout > 0 )
     2787                                setTimeout(function(){
     2788                                        // Check to see if the request is still happening
     2789                                        if ( xhr ) {
     2790                                                // Cancel the request
     2791                                                xhr.abort();
     2792
     2793                                                if( !requestDone )
     2794                                                        onreadystatechange( "timeout" );
     2795                                        }
     2796                                }, s.timeout);
     2797                }
     2798
     2799                // Send the data
     2800                try {
     2801                        xhr.send(s.data);
     2802                } catch(e) {
     2803                        jQuery.handleError(s, xhr, null, e);
     2804                }
     2805
     2806                // firefox 1.5 doesn't fire statechange for sync requests
     2807                if ( !s.async )
     2808                        onreadystatechange();
     2809
     2810                function success(){
     2811                        // If a local callback was specified, fire it and pass it the data
     2812                        if ( s.success )
     2813                                s.success( data, status );
     2814
     2815                        // Fire the global callback
     2816                        if ( s.global )
     2817                                jQuery.event.trigger( "ajaxSuccess", [xhr, s] );
     2818                }
     2819
     2820                function complete(){
     2821                        // Process result
     2822                        if ( s.complete )
     2823                                s.complete(xhr, status);
     2824
     2825                        // The request was completed
     2826                        if ( s.global )
     2827                                jQuery.event.trigger( "ajaxComplete", [xhr, s] );
     2828
     2829                        // Handle the global AJAX counter
     2830                        if ( s.global && ! --jQuery.active )
     2831                                jQuery.event.trigger( "ajaxStop" );
     2832                }
     2833
     2834                // return XMLHttpRequest to allow aborting the request etc.
     2835                return xhr;
     2836        },
     2837
     2838        handleError: function( s, xhr, status, e ) {
     2839                // If a local callback was specified, fire it
     2840                if ( s.error ) s.error( xhr, status, e );
     2841
     2842                // Fire the global callback
     2843                if ( s.global )
     2844                        jQuery.event.trigger( "ajaxError", [xhr, s, e] );
     2845        },
     2846
     2847        // Counter for holding the number of active queries
     2848        active: 0,
     2849
     2850        // Determines if an XMLHttpRequest was successful or not
     2851        httpSuccess: function( xhr ) {
     2852                try {
     2853                        // IE error sometimes returns 1223 when it should be 204 so treat it as success, see #1450
     2854                        return !xhr.status && location.protocol == "file:" ||
     2855                                ( xhr.status >= 200 && xhr.status < 300 ) || xhr.status == 304 || xhr.status == 1223 ||
     2856                                jQuery.browser.safari && xhr.status == undefined;
     2857                } catch(e){}
     2858                return false;
     2859        },
     2860
     2861        // Determines if an XMLHttpRequest returns NotModified
     2862        httpNotModified: function( xhr, url ) {
     2863                try {
     2864                        var xhrRes = xhr.getResponseHeader("Last-Modified");
     2865
     2866                        // Firefox always returns 200. check Last-Modified date
     2867                        return xhr.status == 304 || xhrRes == jQuery.lastModified[url] ||
     2868                                jQuery.browser.safari && xhr.status == undefined;
     2869                } catch(e){}
     2870                return false;
     2871        },
     2872
     2873        httpData: function( xhr, type, filter ) {
     2874                var ct = xhr.getResponseHeader("content-type"),
     2875                        xml = type == "xml" || !type && ct && ct.indexOf("xml") >= 0,
     2876                        data = xml ? xhr.responseXML : xhr.responseText;
     2877
     2878                if ( xml && data.documentElement.tagName == "parsererror" )
     2879                        throw "parsererror";
     2880                       
     2881                // Allow a pre-filtering function to sanitize the response
     2882                if( filter )
     2883                        data = filter( data, type );
     2884
     2885                // If the type is "script", eval it in global context
     2886                if ( type == "script" )
     2887                        jQuery.globalEval( data );
     2888
     2889                // Get the JavaScript object, if JSON is used.
     2890                if ( type == "json" )
     2891                        data = eval("(" + data + ")");
     2892
     2893                return data;
     2894        },
     2895
     2896        // Serialize an array of form elements or a set of
     2897        // key/values into a query string
     2898        param: function( a ) {
     2899                var s = [];
     2900
     2901                // If an array was passed in, assume that it is an array
     2902                // of form elements
     2903                if ( a.constructor == Array || a.jquery )
     2904                        // Serialize the form elements
     2905                        jQuery.each( a, function(){
     2906                                s.push( encodeURIComponent(this.name) + "=" + encodeURIComponent( this.value ) );
     2907                        });
     2908
     2909                // Otherwise, assume that it's an object of key/value pairs
     2910                else
     2911                        // Serialize the key/values
     2912                        for ( var j in a )
     2913                                // If the value is an array then the key names need to be repeated
     2914                                if ( a[j] && a[j].constructor == Array )
     2915                                        jQuery.each( a[j], function(){
     2916                                                s.push( encodeURIComponent(j) + "=" + encodeURIComponent( this ) );
     2917                                        });
     2918                                else
     2919                                        s.push( encodeURIComponent(j) + "=" + encodeURIComponent( jQuery.isFunction(a[j]) ? a[j]() : a[j] ) );
     2920
     2921                // Return the resulting serialization
     2922                return s.join("&").replace(/%20/g, "+");
     2923        }
     2924
     2925});
     2926jQuery.fn.extend({
     2927        show: function(speed,callback){
     2928                return speed ?
     2929                        this.animate({
     2930                                height: "show", width: "show", opacity: "show"
     2931                        }, speed, callback) :
     2932
     2933                        this.filter(":hidden").each(function(){
     2934                                this.style.display = this.oldblock || "";
     2935                                if ( jQuery.css(this,"display") == "none" ) {
     2936                                        var elem = jQuery("<" + this.tagName + " />").appendTo("body");
     2937                                        this.style.display = elem.css("display");
     2938                                        // handle an edge condition where css is - div { display:none; } or similar
     2939                                        if (this.style.display == "none")
     2940                                                this.style.display = "block";
     2941                                        elem.remove();
     2942                                }
     2943                        }).end();
     2944        },
     2945
     2946        hide: function(speed,callback){
     2947                return speed ?
     2948                        this.animate({
     2949                                height: "hide", width: "hide", opacity: "hide"
     2950                        }, speed, callback) :
     2951
     2952                        this.filter(":visible").each(function(){
     2953                                this.oldblock = this.oldblock || jQuery.css(this,"display");
     2954                                this.style.display = "none";
     2955                        }).end();
     2956        },
     2957
     2958        // Save the old toggle function
     2959        _toggle: jQuery.fn.toggle,
     2960
     2961        toggle: function( fn, fn2 ){
     2962                return jQuery.isFunction(fn) && jQuery.isFunction(fn2) ?
     2963                        this._toggle.apply( this, arguments ) :
     2964                        fn ?
     2965                                this.animate({
     2966                                        height: "toggle", width: "toggle", opacity: "toggle"
     2967                                }, fn, fn2) :
     2968                                this.each(function(){
     2969                                        jQuery(this)[ jQuery(this).is(":hidden") ? "show" : "hide" ]();
     2970                                });
     2971        },
     2972
     2973        slideDown: function(speed,callback){
     2974                return this.animate({height: "show"}, speed, callback);
     2975        },
     2976
     2977        slideUp: function(speed,callback){
     2978                return this.animate({height: "hide"}, speed, callback);
     2979        },
     2980
     2981        slideToggle: function(speed, callback){
     2982                return this.animate({height: "toggle"}, speed, callback);
     2983        },
     2984
     2985        fadeIn: function(speed, callback){
     2986                return this.animate({opacity: "show"}, speed, callback);
     2987        },
     2988
     2989        fadeOut: function(speed, callback){
     2990                return this.animate({opacity: "hide"}, speed, callback);
     2991        },
     2992
     2993        fadeTo: function(speed,to,callback){
     2994                return this.animate({opacity: to}, speed, callback);
     2995        },
     2996
     2997        animate: function( prop, speed, easing, callback ) {
     2998                var optall = jQuery.speed(speed, easing, callback);
     2999
     3000                return this[ optall.queue === false ? "each" : "queue" ](function(){
     3001                        if ( this.nodeType != 1)
     3002                                return false;
     3003
     3004                        var opt = jQuery.extend({}, optall), p,
     3005                                hidden = jQuery(this).is(":hidden"), self = this;
     3006
     3007                        for ( p in prop ) {
     3008                                if ( prop[p] == "hide" && hidden || prop[p] == "show" && !hidden )
     3009                                        return opt.complete.call(this);
     3010
     3011                                if ( p == "height" || p == "width" ) {
     3012                                        // Store display property
     3013                                        opt.display = jQuery.css(this, "display");
     3014
     3015                                        // Make sure that nothing sneaks out
     3016                                        opt.overflow = this.style.overflow;
     3017                                }
     3018                        }
     3019
     3020                        if ( opt.overflow != null )
     3021                                this.style.overflow = "hidden";
     3022
     3023                        opt.curAnim = jQuery.extend({}, prop);
     3024
     3025                        jQuery.each( prop, function(name, val){
     3026                                var e = new jQuery.fx( self, opt, name );
     3027
     3028                                if ( /toggle|show|hide/.test(val) )
     3029                                        e[ val == "toggle" ? hidden ? "show" : "hide" : val ]( prop );
     3030                                else {
     3031                                        var parts = val.toString().match(/^([+-]=)?([\d+-.]+)(.*)$/),
     3032                                                start = e.cur(true) || 0;
     3033
     3034                                        if ( parts ) {
     3035                                                var end = parseFloat(parts[2]),
     3036                                                        unit = parts[3] || "px";
     3037
     3038                                                // We need to compute starting value
     3039                                                if ( unit != "px" ) {
     3040                                                        self.style[ name ] = (end || 1) + unit;
     3041                                                        start = ((end || 1) / e.cur(true)) * start;
     3042                                                        self.style[ name ] = start + unit;
     3043                                                }
     3044
     3045                                                // If a +=/-= token was provided, we're doing a relative animation
     3046                                                if ( parts[1] )
     3047                                                        end = ((parts[1] == "-=" ? -1 : 1) * end) + start;
     3048
     3049                                                e.custom( start, end, unit );
     3050                                        } else
     3051                                                e.custom( start, val, "" );
     3052                                }
     3053                        });
     3054
     3055                        // For JS strict compliance
     3056                        return true;
     3057                });
     3058        },
     3059
     3060        queue: function(type, fn){
     3061                if ( jQuery.isFunction(type) || ( type && type.constructor == Array )) {
     3062                        fn = type;
     3063                        type = "fx";
     3064                }
     3065
     3066                if ( !type || (typeof type == "string" && !fn) )
     3067                        return queue( this[0], type );
     3068
     3069                return this.each(function(){
     3070                        if ( fn.constructor == Array )
     3071                                queue(this, type, fn);
     3072                        else {
     3073                                queue(this, type).push( fn );
     3074
     3075                                if ( queue(this, type).length == 1 )
     3076                                        fn.call(this);
     3077                        }
     3078                });
     3079        },
     3080
     3081        stop: function(clearQueue, gotoEnd){
     3082                var timers = jQuery.timers;
     3083
     3084                if (clearQueue)
     3085                        this.queue([]);
     3086
     3087                this.each(function(){
     3088                        // go in reverse order so anything added to the queue during the loop is ignored
     3089                        for ( var i = timers.length - 1; i >= 0; i-- )
     3090                                if ( timers[i].elem == this ) {
     3091                                        if (gotoEnd)
     3092                                                // force the next step to be the last
     3093                                                timers[i](true);
     3094                                        timers.splice(i, 1);
     3095                                }
     3096                });
     3097
     3098                // start the next in the queue if the last step wasn't forced
     3099                if (!gotoEnd)
     3100                        this.dequeue();
     3101
     3102                return this;
     3103        }
     3104
     3105});
     3106
     3107var queue = function( elem, type, array ) {
     3108        if ( elem ){
     3109
     3110                type = type || "fx";
     3111
     3112                var q = jQuery.data( elem, type + "queue" );
     3113
     3114                if ( !q || array )
     3115                        q = jQuery.data( elem, type + "queue", jQuery.makeArray(array) );
     3116
     3117        }
     3118        return q;
     3119};
     3120
     3121jQuery.fn.dequeue = function(type){
     3122        type = type || "fx";
     3123
     3124        return this.each(function(){
     3125                var q = queue(this, type);
     3126
     3127                q.shift();
     3128
     3129                if ( q.length )
     3130                        q[0].call( this );
     3131        });
     3132};
     3133
     3134jQuery.extend({
     3135
     3136        speed: function(speed, easing, fn) {
     3137                var opt = speed && speed.constructor == Object ? speed : {
     3138                        complete: fn || !fn && easing ||
     3139                                jQuery.isFunction( speed ) && speed,
     3140                        duration: speed,
     3141                        easing: fn && easing || easing && easing.constructor != Function && easing
     3142                };
     3143
     3144                opt.duration = (opt.duration && opt.duration.constructor == Number ?
     3145                        opt.duration :
     3146                        jQuery.fx.speeds[opt.duration]) || jQuery.fx.speeds.def;
     3147
     3148                // Queueing
     3149                opt.old = opt.complete;
     3150                opt.complete = function(){
     3151                        if ( opt.queue !== false )
     3152                                jQuery(this).dequeue();
     3153                        if ( jQuery.isFunction( opt.old ) )
     3154                                opt.old.call( this );
     3155                };
     3156
     3157                return opt;
     3158        },
     3159
     3160        easing: {
     3161                linear: function( p, n, firstNum, diff ) {
     3162                        return firstNum + diff * p;
     3163                },
     3164                swing: function( p, n, firstNum, diff ) {
     3165                        return ((-Math.cos(p*Math.PI)/2) + 0.5) * diff + firstNum;
     3166                }
     3167        },
     3168
     3169        timers: [],
     3170        timerId: null,
     3171
     3172        fx: function( elem, options, prop ){
     3173                this.options = options;
     3174                this.elem = elem;
     3175                this.prop = prop;
     3176
     3177                if ( !options.orig )
     3178                        options.orig = {};
     3179        }
     3180
     3181});
     3182
     3183jQuery.fx.prototype = {
     3184
     3185        // Simple function for setting a style value
     3186        update: function(){
     3187                if ( this.options.step )
     3188                        this.options.step.call( this.elem, this.now, this );
     3189
     3190                (jQuery.fx.step[this.prop] || jQuery.fx.step._default)( this );
     3191
     3192                // Set display property to block for height/width animations
     3193                if ( this.prop == "height" || this.prop == "width" )
     3194                        this.elem.style.display = "block";
     3195        },
     3196
     3197        // Get the current size
     3198        cur: function(force){
     3199                if ( this.elem[this.prop] != null && this.elem.style[this.prop] == null )
     3200                        return this.elem[ this.prop ];
     3201
     3202                var r = parseFloat(jQuery.css(this.elem, this.prop, force));
     3203                return r && r > -10000 ? r : parseFloat(jQuery.curCSS(this.elem, this.prop)) || 0;
     3204        },
     3205
     3206        // Start an animation from one number to another
     3207        custom: function(from, to, unit){
     3208                this.startTime = now();
     3209                this.start = from;
     3210                this.end = to;
     3211                this.unit = unit || this.unit || "px";
     3212                this.now = this.start;
     3213                this.pos = this.state = 0;
     3214                this.update();
     3215
     3216                var self = this;
     3217                function t(gotoEnd){
     3218                        return self.step(gotoEnd);
     3219                }
     3220
     3221                t.elem = this.elem;
     3222
     3223                jQuery.timers.push(t);
     3224
     3225                if ( jQuery.timerId == null ) {
     3226                        jQuery.timerId = setInterval(function(){
     3227                                var timers = jQuery.timers;
     3228
     3229                                for ( var i = 0; i < timers.length; i++ )
     3230                                        if ( !timers[i]() )
     3231                                                timers.splice(i--, 1);
     3232
     3233                                if ( !timers.length ) {
     3234                                        clearInterval( jQuery.timerId );
     3235                                        jQuery.timerId = null;
     3236                                }
     3237                        }, 13);
     3238                }
     3239        },
     3240
     3241        // Simple 'show' function
     3242        show: function(){
     3243                // Remember where we started, so that we can go back to it later
     3244                this.options.orig[this.prop] = jQuery.attr( this.elem.style, this.prop );
     3245                this.options.show = true;
     3246
     3247                // Begin the animation
     3248                this.custom(0, this.cur());
     3249
     3250                // Make sure that we start at a small width/height to avoid any
     3251                // flash of content
     3252                if ( this.prop == "width" || this.prop == "height" )
     3253                        this.elem.style[this.prop] = "1px";
     3254
     3255                // Start by showing the element
     3256                jQuery(this.elem).show();
     3257        },
     3258
     3259        // Simple 'hide' function
     3260        hide: function(){
     3261                // Remember where we started, so that we can go back to it later
     3262                this.options.orig[this.prop] = jQuery.attr( this.elem.style, this.prop );
     3263                this.options.hide = true;
     3264
     3265                // Begin the animation
     3266                this.custom(this.cur(), 0);
     3267        },
     3268
     3269        // Each step of an animation
     3270        step: function(gotoEnd){
     3271                var t = now();
     3272
     3273                if ( gotoEnd || t > this.options.duration + this.startTime ) {
     3274                        this.now = this.end;
     3275                        this.pos = this.state = 1;
     3276                        this.update();
     3277
     3278                        this.options.curAnim[ this.prop ] = true;
     3279
     3280                        var done = true;
     3281                        for ( var i in this.options.curAnim )
     3282                                if ( this.options.curAnim[i] !== true )
     3283                                        done = false;
     3284
     3285                        if ( done ) {
     3286                                if ( this.options.display != null ) {
     3287                                        // Reset the overflow
     3288                                        this.elem.style.overflow = this.options.overflow;
     3289
     3290                                        // Reset the display
     3291                                        this.elem.style.display = this.options.display;
     3292                                        if ( jQuery.css(this.elem, "display") == "none" )
     3293                                                this.elem.style.display = "block";
     3294                                }
     3295
     3296                                // Hide the element if the "hide" operation was done
     3297                                if ( this.options.hide )
     3298                                        this.elem.style.display = "none";
     3299
     3300                                // Reset the properties, if the item has been hidden or shown
     3301                                if ( this.options.hide || this.options.show )
     3302                                        for ( var p in this.options.curAnim )
     3303                                                jQuery.attr(this.elem.style, p, this.options.orig[p]);
     3304                        }
     3305
     3306                        if ( done )
     3307                                // Execute the complete function
     3308                                this.options.complete.call( this.elem );
     3309
     3310                        return false;
     3311                } else {
     3312                        var n = t - this.startTime;
     3313                        this.state = n / this.options.duration;
     3314
     3315                        // Perform the easing function, defaults to swing
     3316                        this.pos = jQuery.easing[this.options.easing || (jQuery.easing.swing ? "swing" : "linear")](this.state, n, 0, 1, this.options.duration);
     3317                        this.now = this.start + ((this.end - this.start) * this.pos);
     3318
     3319                        // Perform the next step of the animation
     3320                        this.update();
     3321                }
     3322
     3323                return true;
     3324        }
     3325
     3326};
     3327
     3328jQuery.extend( jQuery.fx, {
     3329        speeds:{
     3330                slow: 600,
     3331                fast: 200,
     3332                // Default speed
     3333                def: 400
     3334        },
     3335        step: {
     3336                scrollLeft: function(fx){
     3337                        fx.elem.scrollLeft = fx.now;
     3338                },
     3339
     3340                scrollTop: function(fx){
     3341                        fx.elem.scrollTop = fx.now;
     3342                },
     3343
     3344                opacity: function(fx){
     3345                        jQuery.attr(fx.elem.style, "opacity", fx.now);
     3346                },
     3347
     3348                _default: function(fx){
     3349                        fx.elem.style[ fx.prop ] = fx.now + fx.unit;
     3350                }
     3351        }
     3352});
     3353// The Offset Method
     3354// Originally By Brandon Aaron, part of the Dimension Plugin
     3355// http://jquery.com/plugins/project/dimensions
     3356jQuery.fn.offset = function() {
     3357        var left = 0, top = 0, elem = this[0], results;
     3358
     3359        if ( elem ) with ( jQuery.browser ) {
     3360                var parent       = elem.parentNode,
     3361                    offsetChild  = elem,
     3362                    offsetParent = elem.offsetParent,
     3363                    doc          = elem.ownerDocument,
     3364                    safari2      = safari && parseInt(version) < 522 && !/adobeair/i.test(userAgent),
     3365                    css          = jQuery.curCSS,
     3366                    fixed        = css(elem, "position") == "fixed";
     3367
     3368                // Use getBoundingClientRect if available
     3369                if ( elem.getBoundingClientRect ) {
     3370                        var box = elem.getBoundingClientRect();
     3371
     3372                        // Add the document scroll offsets
     3373                        add(box.left + Math.max(doc.documentElement.scrollLeft, doc.body.scrollLeft),
     3374                                box.top  + Math.max(doc.documentElement.scrollTop,  doc.body.scrollTop));
     3375
     3376                        // IE adds the HTML element's border, by default it is medium which is 2px
     3377                        // IE 6 and 7 quirks mode the border width is overwritable by the following css html { border: 0; }
     3378                        // IE 7 standards mode, the border is always 2px
     3379                        // This border/offset is typically represented by the clientLeft and clientTop properties
     3380                        // However, in IE6 and 7 quirks mode the clientLeft and clientTop properties are not updated when overwriting it via CSS
     3381                        // Therefore this method will be off by 2px in IE while in quirksmode
     3382                        add( -doc.documentElement.clientLeft, -doc.documentElement.clientTop );
     3383
     3384                // Otherwise loop through the offsetParents and parentNodes
     3385                } else {
     3386
     3387                        // Initial element offsets
     3388                        add( elem.offsetLeft, elem.offsetTop );
     3389
     3390                        // Get parent offsets
     3391                        while ( offsetParent ) {
     3392                                // Add offsetParent offsets
     3393                                add( offsetParent.offsetLeft, offsetParent.offsetTop );
     3394
     3395                                // Mozilla and Safari > 2 does not include the border on offset parents
     3396                                // However Mozilla adds the border for table or table cells
     3397                                if ( mozilla && !/^t(able|d|h)$/i.test(offsetParent.tagName) || safari && !safari2 )
     3398                                        border( offsetParent );
     3399
     3400                                // Add the document scroll offsets if position is fixed on any offsetParent
     3401                                if ( !fixed && css(offsetParent, "position") == "fixed" )
     3402                                        fixed = true;
     3403
     3404                                // Set offsetChild to previous offsetParent unless it is the body element
     3405                                offsetChild  = /^body$/i.test(offsetParent.tagName) ? offsetChild : offsetParent;
     3406                                // Get next offsetParent
     3407                                offsetParent = offsetParent.offsetParent;
     3408                        }
     3409
     3410                        // Get parent scroll offsets
     3411                        while ( parent && parent.tagName && !/^body|html$/i.test(parent.tagName) ) {
     3412                                // Remove parent scroll UNLESS that parent is inline or a table to work around Opera inline/table scrollLeft/Top bug
     3413                                if ( !/^inline|table.*$/i.test(css(parent, "display")) )
     3414                                        // Subtract parent scroll offsets
     3415                                        add( -parent.scrollLeft, -parent.scrollTop );
     3416
     3417                                // Mozilla does not add the border for a parent that has overflow != visible
     3418                                if ( mozilla && css(parent, "overflow") != "visible" )
     3419                                        border( parent );
     3420
     3421                                // Get next parent
     3422                                parent = parent.parentNode;
     3423                        }
     3424
     3425                        // Safari <= 2 doubles body offsets with a fixed position element/offsetParent or absolutely positioned offsetChild
     3426                        // Mozilla doubles body offsets with a non-absolutely positioned offsetChild
     3427                        if ( (safari2 && (fixed || css(offsetChild, "position") == "absolute")) ||
     3428                                (mozilla && css(offsetChild, "position") != "absolute") )
     3429                                        add( -doc.body.offsetLeft, -doc.body.offsetTop );
     3430
     3431                        // Add the document scroll offsets if position is fixed
     3432                        if ( fixed )
     3433                                add(Math.max(doc.documentElement.scrollLeft, doc.body.scrollLeft),
     3434                                        Math.max(doc.documentElement.scrollTop,  doc.body.scrollTop));
     3435                }
     3436
     3437                // Return an object with top and left properties
     3438                results = { top: top, left: left };
     3439        }
     3440
     3441        function border(elem) {
     3442                add( jQuery.curCSS(elem, "borderLeftWidth", true), jQuery.curCSS(elem, "borderTopWidth", true) );
     3443        }
     3444
     3445        function add(l, t) {
     3446                left += parseInt(l, 10) || 0;
     3447                top += parseInt(t, 10) || 0;
     3448        }
     3449
     3450        return results;
     3451};
     3452
     3453
     3454jQuery.fn.extend({
     3455        position: function() {
     3456                var left = 0, top = 0, results;
     3457
     3458                if ( this[0] ) {
     3459                        // Get *real* offsetParent
     3460                        var offsetParent = this.offsetParent(),
     3461
     3462                        // Get correct offsets
     3463                        offset       = this.offset(),
     3464                        parentOffset = /^body|html$/i.test(offsetParent[0].tagName) ? { top: 0, left: 0 } : offsetParent.offset();
     3465
     3466                        // Subtract element margins
     3467                        // note: when an element has margin: auto the offsetLeft and marginLeft
     3468                        // are the same in Safari causing offset.left to incorrectly be 0
     3469                        offset.top  -= num( this, 'marginTop' );
     3470                        offset.left -= num( this, 'marginLeft' );
     3471
     3472                        // Add offsetParent borders
     3473                        parentOffset.top  += num( offsetParent, 'borderTopWidth' );
     3474                        parentOffset.left += num( offsetParent, 'borderLeftWidth' );
     3475
     3476                        // Subtract the two offsets
     3477                        results = {
     3478                                top:  offset.top  - parentOffset.top,
     3479                                left: offset.left - parentOffset.left
     3480                        };
     3481                }
     3482
     3483                return results;
     3484        },
     3485
     3486        offsetParent: function() {
     3487                var offsetParent = this[0].offsetParent;
     3488                while ( offsetParent && (!/^body|html$/i.test(offsetParent.tagName) && jQuery.css(offsetParent, 'position') == 'static') )
     3489                        offsetParent = offsetParent.offsetParent;
     3490                return jQuery(offsetParent);
     3491        }
     3492});
     3493
     3494
     3495// Create scrollLeft and scrollTop methods
     3496jQuery.each( ['Left', 'Top'], function(i, name) {
     3497        var method = 'scroll' + name;
     3498       
     3499        jQuery.fn[ method ] = function(val) {
     3500                if (!this[0]) return;
     3501
     3502                return val != undefined ?
     3503
     3504                        // Set the scroll offset
     3505                        this.each(function() {
     3506                                this == window || this == document ?
     3507                                        window.scrollTo(
     3508                                                !i ? val : jQuery(window).scrollLeft(),
     3509                                                 i ? val : jQuery(window).scrollTop()
     3510                                        ) :
     3511                                        this[ method ] = val;
     3512                        }) :
     3513
     3514                        // Return the scroll offset
     3515                        this[0] == window || this[0] == document ?
     3516                                self[ i ? 'pageYOffset' : 'pageXOffset' ] ||
     3517                                        jQuery.boxModel && document.documentElement[ method ] ||
     3518                                        document.body[ method ] :
     3519                                this[0][ method ];
     3520        };
     3521});
     3522// Create innerHeight, innerWidth, outerHeight and outerWidth methods
     3523jQuery.each([ "Height", "Width" ], function(i, name){
     3524
     3525        var tl = i ? "Left"  : "Top",  // top or left
     3526                br = i ? "Right" : "Bottom"; // bottom or right
     3527
     3528        // innerHeight and innerWidth
     3529        jQuery.fn["inner" + name] = function(){
     3530                return this[ name.toLowerCase() ]() +
     3531                        num(this, "padding" + tl) +
     3532                        num(this, "padding" + br);
     3533        };
     3534
     3535        // outerHeight and outerWidth
     3536        jQuery.fn["outer" + name] = function(margin) {
     3537                return this["inner" + name]() +
     3538                        num(this, "border" + tl + "Width") +
     3539                        num(this, "border" + br + "Width") +
     3540                        (margin ?
     3541                                num(this, "margin" + tl) + num(this, "margin" + br) : 0);
     3542        };
     3543
     3544});})();
  • wp-includes/script-loader.php

     
    7272
    7373        $scripts->add( 'cropper', '/wp-includes/js/crop/cropper.js', array('scriptaculous-dragdrop'), '20070118');
    7474
    75         $scripts->add( 'jquery', '/wp-includes/js/jquery/jquery.js', false, '1.2.3');
     75        $scripts->add( 'jquery', '/wp-includes/js/jquery/jquery.js', false, '1.2.5');
    7676        $scripts->add( 'jquery-form', '/wp-includes/js/jquery/jquery.form.js', array('jquery'), '2.02');
    7777        $scripts->add( 'jquery-color', '/wp-includes/js/jquery/jquery.color.js', array('jquery'), '2.0-4561');
    7878        $scripts->add( 'interface', '/wp-includes/js/jquery/interface.js', array('jquery'), '1.2' );
     
    109109
    110110        $scripts->add( 'jquery-ui-core', '/wp-includes/js/jquery/ui.core.js', array('jquery'), '1.5b4' );
    111111        $scripts->add( 'jquery-ui-tabs', '/wp-includes/js/jquery/ui.tabs.js', array('jquery-ui-core'), '1.5b4' );
     112        $scripts->add( 'jquery-ui-sortable', '/wp-includes/js/jquery/ui.sortable.js', array('jquery-ui-core'), '1.5b4' );
    112113
    113114        if ( is_admin() ) {
    114115                $scripts->add( 'ajaxcat', '/wp-admin/js/cat.js', array( 'wp-lists' ), '20071101' );
     
    164165                        'cancel' => __('Cancel'),
    165166                        'edit' => __('Edit'),
    166167                ) );
     168                $scripts->add( 'admin-gallery', '/wp-admin/js/gallery.js', array( 'jquery-ui-sortable' ), '20080520' );
    167169                $scripts->add( 'media-upload', '/wp-admin/js/media-upload.js', false, '20080430' );
    168170                $scripts->localize( 'upload', 'uploadL10n', array(
    169171                        'browseTitle' => attribute_escape(__('Browse your files')),
  • wp-admin/includes/media.php

     
    199199                        $post['post_title'] = $attachment['post_title'];
    200200                if ( isset($attachment['post_excerpt']) )
    201201                        $post['post_excerpt'] = $attachment['post_excerpt'];
     202                if ( isset($attachment['menu_order']) )
     203                        $post['menu_order'] = $attachment['menu_order'];
    202204
    203205                $post = apply_filters('attachment_fields_to_save', $post, $attachment);
    204206
     
    399401                        $errors = $return;
    400402        }
    401403
     404        wp_enqueue_script('admin-gallery');
    402405        return wp_iframe( 'media_upload_gallery_form', $errors );
    403406}
    404407
     
    535538                                </script>\n",
    536539                        'helps'      => __('Enter a link URL or click above for presets.'),
    537540                ),
     541        'menu_order'   => array(
     542                        'label'      => __('Order'),
     543                        'value'      => $edit_post->menu_order
     544                ),
    538545        );
    539546
    540547        foreach ( get_attachment_taxonomies($post) as $taxonomy ) {
  • wp-admin/js/gallery.js

     
     1jQuery(function($) {
     2        var gallerySortable;
     3        var gallerySortableInit = function() {
     4                gallerySortable = $('#media-items').sortable( {
     5                        items: '.media-item',
     6                        placeholder: 'sorthelper',
     7                        update: galleryReorder
     8                } );
     9        }
     10
     11        // When an update has occurred, adjust the order for each item
     12        var galleryReorder = function(e, sort) {
     13                jQuery.each(sort['instance'].toArray(), function(i, id) {
     14                        jQuery('#' + id + ' .menu_order input')[0].value = i;
     15                });
     16        }
     17
     18        // initialize sortable
     19        gallerySortableInit();
     20});
  • wp-admin/css/colors-fresh.css

     
    6363        color: #000;
    6464}
    6565
    66 ul.widget-control-list .sorthelper {
     66.sorthelper {
    6767        background-color: #ccf3fa;
    6868}
    6969
  • wp-admin/css/media.css

     
    216216}
    217217
    218218#media-upload .media-item {
     219        cursor:move;
    219220        position: relative;
    220221        border-bottom-width: 1px;
    221222        border-bottom-style: solid;
  • wp-admin/css/colors-classic.css

     
    6363        color: #000;
    6464}
    6565
    66 ul.widget-control-list .sorthelper {
     66.sorthelper {
    6767        background-color: #ccf3fa;
    6868}
    6969