Make WordPress Core

Changeset 10352


Ignore:
Timestamp:
01/13/2009 11:50:01 AM (18 years ago)
Author:
azaozz
Message:

jQuery 1.3RC2

File:
1 edited

Legend:

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

    r10326 r10352  
    11/*!
    2  * jQuery JavaScript Library v1.3b2
     2 * jQuery JavaScript Library v1.3rc2
    33 * http://jquery.com/
    44 *
     
    77 * http://docs.jquery.com/License
    88 *
    9  * Date: 2009-01-05 18:33:56 -0500 (Mon, 05 Jan 2009)
    10  * Revision: 6056
     9 * Date: 2009-01-12 19:11:21 -0500 (Mon, 12 Jan 2009)
     10 * Revision: 6100
    1111 */
    1212(function(){
     
    8787                        return jQuery( document ).ready( selector );
    8888
     89                // Make sure that old selector state is passed along
     90                if ( selector.selector && selector.context ) {
     91                        this.selector = selector.selector;
     92                        this.context = selector.context;
     93                }
     94
    8995                return this.setArray(jQuery.makeArray(selector));
    9096        },
     
    94100
    95101        // The current version of jQuery being used
    96         jquery: "1.3b2",
     102        jquery: "1.3rc2",
    97103
    98104        // The number of elements contained in the matched element set
     
    214220
    215221        wrapAll: function( html ) {
    216                 if ( this[0] )
     222                if ( this[0] ) {
    217223                        // The elements to wrap the target around
    218                         jQuery( html, this[0].ownerDocument )
    219                                 .clone()
    220                                 .insertBefore( this[0] )
    221                                 .map(function(){
    222                                         var elem = this;
    223 
    224                                         while ( elem.firstChild )
    225                                                 elem = elem.firstChild;
    226 
    227                                         return elem;
    228                                 })
    229                                 .append(this);
     224                        var wrap = jQuery( html, this[0].ownerDocument ).clone();
     225
     226                        if ( this[0].parentNode )
     227                                wrap.insertBefore( this[0] );
     228
     229                        wrap.map(function(){
     230                                var elem = this;
     231
     232                                while ( elem.firstChild )
     233                                        elem = elem.firstChild;
     234
     235                                return elem;
     236                        }).append(this);
     237                }
    230238
    231239                return this;
     
    274282        },
    275283
     284        // For internal use only.
     285        // Behaves like an Array's .push method, not like a jQuery method.
     286        push: [].push,
     287
    276288        find: function( selector ) {
    277                 var elems = jQuery.map(this, function(elem){
    278                         return jQuery.find( selector, elem );
    279                 });
    280 
    281                 return this.pushStack( /[^+>] [^+>]/.test( selector ) ?
    282                         jQuery.unique( elems ) :
    283                         elems, "find", selector );
     289                if ( this.length === 1 && !/,/.test(selector) ) {
     290                        var ret = this.pushStack( [], "find", selector );
     291                        ret.length = 0;
     292                        jQuery.find( selector, this[0], ret );
     293                        return ret;
     294                } else {
     295                        var elems = jQuery.map(this, function(elem){
     296                                return jQuery.find( selector, elem );
     297                        });
     298
     299                        return this.pushStack( /[^+>] [^+>]/.test( selector ) ?
     300                                jQuery.unique( elems ) :
     301                                elems, "find", selector );
     302                }
    284303        },
    285304
     
    341360
    342361        closest: function( selector ) {
     362                var pos = jQuery.expr.match.POS.test( selector ) ? jQuery(selector) : null;
     363
    343364                return this.map(function(){
    344365                        var cur = this;
    345366                        while ( cur && cur.ownerDocument ) {
    346                                 if ( jQuery(cur).is(selector) )
     367                                if ( pos ? pos.index(cur) > -1 : jQuery(cur).is(selector) )
    347368                                        return cur;
    348369                                cur = cur.parentNode;
     
    920941                if ( fragment ) {
    921942                        for ( var i = 0; ret[i]; i++ ) {
    922                                 if ( jQuery.nodeName( ret[i], "script" ) ) {
    923                                         scripts.push( ret[i].parentNode.removeChild( ret[i] ) );
     943                                if ( jQuery.nodeName( ret[i], "script" ) && (!ret[i].type || ret[i].type.toLowerCase() === "text/javascript") ) {
     944                                        scripts.push( ret[i].parentNode ? ret[i].parentNode.removeChild( ret[i] ) : ret[i] );
    924945                                } else {
    925946                                        if ( ret[i].nodeType === 1 )
     
    956977                        // Safari mis-reports the default selected property of a hidden option
    957978                        // Accessing the parent's selectedIndex property fixes it
    958                         if ( name == "selected" )
     979                        if ( name == "selected" && elem.parentNode )
    959980                                elem.parentNode.selectedIndex;
    960981
     
    973994                                        return elem.getAttributeNode( name ).nodeValue;
    974995
    975                                 // elem.tabindex doesn't always return the correct value
     996                                // elem.tabIndex doesn't always return the correct value when it hasn't been explicitly set
    976997                                // http://fluidproject.org/blog/2008/01/09/getting-setting-and-removing-tabindex-values-with-javascript/
    977                                 if ( name == jQuery.props.tabindex ) {
    978                                         var attributeNode = elem.getAttributeNode(jQuery.props.tabindex);
    979                                         return attributeNode && attributeNode.specified && attributeNode.value || undefined;
     998                                if ( name == "tabIndex" ) {
     999                                        var attributeNode = elem.getAttributeNode( "tabIndex" );
     1000                                        return attributeNode && attributeNode.specified
     1001                                                ? attributeNode.value
     1002                                                : elem.nodeName.match(/^(a|area|button|input|object|select|textarea)$/i)
     1003                                                        ? 0
     1004                                                        : undefined;
    9801005                                }
    9811006
     
    11381163        mozilla: /mozilla/.test( userAgent ) && !/(compatible|webkit)/.test( userAgent )
    11391164};
    1140 
    1141 // Check to see if the W3C box model is being used
    1142 jQuery.boxModel = !jQuery.browser.msie || document.compatMode == "CSS1Compat";
    11431165
    11441166jQuery.each({
     
    13751397                });
    13761398        }
    1377 });(function(){
     1399});/*!
     1400 * Sizzle CSS Selector Engine - v0.9.1
     1401 *  Copyright 2009, The Dojo Foundation
     1402 *  Released under the MIT, BSD, and GPL Licenses.
     1403 *  More information: http://sizzlejs.com/
     1404 */
     1405(function(){
     1406
     1407var chunker = /((?:\((?:\([^()]+\)|[^()]+)+\)|\[(?:\[[^[\]]*\]|[^[\]]+)+\]|\\.|[^ >+~,(\[]+)+|[>+~])(\s*,\s*)?/g,
     1408        done = 0,
     1409        toString = Object.prototype.toString;
     1410
     1411var Sizzle = function(selector, context, results, seed) {
     1412        results = results || [];
     1413        context = context || document;
     1414
     1415        if ( context.nodeType !== 1 && context.nodeType !== 9 )
     1416                return [];
     1417       
     1418        if ( !selector || typeof selector !== "string" ) {
     1419                return results;
     1420        }
     1421
     1422        var parts = [], m, set, checkSet, check, mode, extra, prune = true;
     1423       
     1424        // Reset the position of the chunker regexp (start from head)
     1425        chunker.lastIndex = 0;
     1426       
     1427        while ( (m = chunker.exec(selector)) !== null ) {
     1428                parts.push( m[1] );
     1429               
     1430                if ( m[2] ) {
     1431                        extra = RegExp.rightContext;
     1432                        break;
     1433                }
     1434        }
     1435
     1436        if ( parts.length > 1 && Expr.match.POS.exec( selector ) ) {
     1437                if ( parts.length === 2 && Expr.relative[ parts[0] ] ) {
     1438                        var later = "", match;
     1439
     1440                        // Position selectors must be done after the filter
     1441                        while ( (match = Expr.match.POS.exec( selector )) ) {
     1442                                later += match[0];
     1443                                selector = selector.replace( Expr.match.POS, "" );
     1444                        }
     1445
     1446                        set = Sizzle.filter( later, Sizzle( selector, context ) );
     1447                } else {
     1448                        set = Expr.relative[ parts[0] ] ?
     1449                                [ context ] :
     1450                                Sizzle( parts.shift(), context );
     1451
     1452                        while ( parts.length ) {
     1453                                var tmpSet = [];
     1454
     1455                                selector = parts.shift();
     1456                                if ( Expr.relative[ selector ] )
     1457                                        selector += parts.shift();
     1458
     1459                                for ( var i = 0, l = set.length; i < l; i++ ) {
     1460                                        Sizzle( selector, set[i], tmpSet );
     1461                                }
     1462
     1463                                set = tmpSet;
     1464                        }
     1465                }
     1466        } else {
     1467                var ret = seed ?
     1468                        { expr: parts.pop(), set: makeArray(seed) } :
     1469                        Sizzle.find( parts.pop(), parts.length === 1 && context.parentNode ? context.parentNode : context );
     1470                set = Sizzle.filter( ret.expr, ret.set );
     1471
     1472                if ( parts.length > 0 ) {
     1473                        checkSet = makeArray(set);
     1474                } else {
     1475                        prune = false;
     1476                }
     1477
     1478                while ( parts.length ) {
     1479                        var cur = parts.pop(), pop = cur;
     1480
     1481                        if ( !Expr.relative[ cur ] ) {
     1482                                cur = "";
     1483                        } else {
     1484                                pop = parts.pop();
     1485                        }
     1486
     1487                        if ( pop == null ) {
     1488                                pop = context;
     1489                        }
     1490
     1491                        Expr.relative[ cur ]( checkSet, pop, isXML(context) );
     1492                }
     1493        }
     1494
     1495        if ( !checkSet ) {
     1496                checkSet = set;
     1497        }
     1498
     1499        if ( !checkSet ) {
     1500                throw "Syntax error, unrecognized expression: " + (cur || selector);
     1501        }
     1502
     1503        if ( toString.call(checkSet) === "[object Array]" ) {
     1504                if ( !prune ) {
     1505                        results.push.apply( results, checkSet );
     1506                } else if ( context.nodeType === 1 ) {
     1507                        for ( var i = 0; checkSet[i] != null; i++ ) {
     1508                                if ( checkSet[i] && (checkSet[i] === true || checkSet[i].nodeType === 1 && contains(context, checkSet[i])) ) {
     1509                                        results.push( set[i] );
     1510                                }
     1511                        }
     1512                } else {
     1513                        for ( var i = 0; checkSet[i] != null; i++ ) {
     1514                                if ( checkSet[i] && checkSet[i].nodeType === 1 ) {
     1515                                        results.push( set[i] );
     1516                                }
     1517                        }
     1518                }
     1519        } else {
     1520                makeArray( checkSet, results );
     1521        }
     1522
     1523        if ( extra ) {
     1524                Sizzle( extra, context, results, seed );
     1525        }
     1526
     1527        return results;
     1528};
     1529
     1530Sizzle.matches = function(expr, set){
     1531        return Sizzle(expr, null, null, set);
     1532};
     1533
     1534Sizzle.find = function(expr, context){
     1535        var set, match;
     1536
     1537        if ( !expr ) {
     1538                return [];
     1539        }
     1540
     1541        for ( var i = 0, l = Expr.order.length; i < l; i++ ) {
     1542                var type = Expr.order[i], match;
     1543               
     1544                if ( (match = Expr.match[ type ].exec( expr )) ) {
     1545                        var left = RegExp.leftContext;
     1546
     1547                        if ( left.substr( left.length - 1 ) !== "\\" ) {
     1548                                match[1] = (match[1] || "").replace(/\\/g, "");
     1549                                set = Expr.find[ type ]( match, context );
     1550                                if ( set != null ) {
     1551                                        expr = expr.replace( Expr.match[ type ], "" );
     1552                                        break;
     1553                                }
     1554                        }
     1555                }
     1556        }
     1557
     1558        if ( !set ) {
     1559                set = context.getElementsByTagName("*");
     1560        }
     1561
     1562        return {set: set, expr: expr};
     1563};
     1564
     1565Sizzle.filter = function(expr, set, inplace, not){
     1566        var old = expr, result = [], curLoop = set, match, anyFound;
     1567
     1568        while ( expr && set.length ) {
     1569                for ( var type in Expr.filter ) {
     1570                        if ( (match = Expr.match[ type ].exec( expr )) != null ) {
     1571                                var filter = Expr.filter[ type ], goodArray = null, goodPos = 0, found, item;
     1572                                anyFound = false;
     1573
     1574                                if ( curLoop == result ) {
     1575                                        result = [];
     1576                                }
     1577
     1578                                if ( Expr.preFilter[ type ] ) {
     1579                                        match = Expr.preFilter[ type ]( match, curLoop, inplace, result, not );
     1580
     1581                                        if ( !match ) {
     1582                                                anyFound = found = true;
     1583                                        } else if ( match === true ) {
     1584                                                continue;
     1585                                        } else if ( match[0] === true ) {
     1586                                                goodArray = [];
     1587                                                var last = null, elem;
     1588                                                for ( var i = 0; (elem = curLoop[i]) !== undefined; i++ ) {
     1589                                                        if ( elem && last !== elem ) {
     1590                                                                goodArray.push( elem );
     1591                                                                last = elem;
     1592                                                        }
     1593                                                }
     1594                                        }
     1595                                }
     1596
     1597                                if ( match ) {
     1598                                        for ( var i = 0; (item = curLoop[i]) !== undefined; i++ ) {
     1599                                                if ( item ) {
     1600                                                        if ( goodArray && item != goodArray[goodPos] ) {
     1601                                                                goodPos++;
     1602                                                        }
     1603       
     1604                                                        found = filter( item, match, goodPos, goodArray );
     1605                                                        var pass = not ^ !!found;
     1606
     1607                                                        if ( inplace && found != null ) {
     1608                                                                if ( pass ) {
     1609                                                                        anyFound = true;
     1610                                                                } else {
     1611                                                                        curLoop[i] = false;
     1612                                                                }
     1613                                                        } else if ( pass ) {
     1614                                                                result.push( item );
     1615                                                                anyFound = true;
     1616                                                        }
     1617                                                }
     1618                                        }
     1619                                }
     1620
     1621                                if ( found !== undefined ) {
     1622                                        if ( !inplace ) {
     1623                                                curLoop = result;
     1624                                        }
     1625
     1626                                        expr = expr.replace( Expr.match[ type ], "" );
     1627
     1628                                        if ( !anyFound ) {
     1629                                                return [];
     1630                                        }
     1631
     1632                                        break;
     1633                                }
     1634                        }
     1635                }
     1636
     1637                expr = expr.replace(/\s*,\s*/, "");
     1638
     1639                // Improper expression
     1640                if ( expr == old ) {
     1641                        if ( anyFound == null ) {
     1642                                throw "Syntax error, unrecognized expression: " + expr;
     1643                        } else {
     1644                                break;
     1645                        }
     1646                }
     1647
     1648                old = expr;
     1649        }
     1650
     1651        return curLoop;
     1652};
     1653
     1654var Expr = Sizzle.selectors = {
     1655        order: [ "ID", "NAME", "TAG" ],
     1656        match: {
     1657                ID: /#((?:[\w\u00c0-\uFFFF_-]|\\.)+)/,
     1658                CLASS: /\.((?:[\w\u00c0-\uFFFF_-]|\\.)+)/,
     1659                NAME: /\[name=['"]*((?:[\w\u00c0-\uFFFF_-]|\\.)+)['"]*\]/,
     1660                ATTR: /\[((?:[\w\u00c0-\uFFFF_-]|\\.)+)\s*(?:(\S?=)\s*(['"]*)(.*?)\3|)\]/,
     1661                TAG: /^((?:[\w\u00c0-\uFFFF\*_-]|\\.)+)/,
     1662                CHILD: /:(only|nth|last|first)-child(?:\((even|odd|[\dn+-]*)\))?/,
     1663                POS: /:(nth|eq|gt|lt|first|last|even|odd)(?:\((\d*)\))?(?=[^-]|$)/,
     1664                PSEUDO: /:((?:[\w\u00c0-\uFFFF_-]|\\.)+)(?:\((['"]*)((?:\([^\)]+\)|[^\2\(\)]*)+)\2\))?/
     1665        },
     1666        attrMap: {
     1667                "class": "className",
     1668                "for": "htmlFor"
     1669        },
     1670        relative: {
     1671                "+": function(checkSet, part){
     1672                        for ( var i = 0, l = checkSet.length; i < l; i++ ) {
     1673                                var elem = checkSet[i];
     1674                                if ( elem ) {
     1675                                        var cur = elem.previousSibling;
     1676                                        while ( cur && cur.nodeType !== 1 ) {
     1677                                                cur = cur.previousSibling;
     1678                                        }
     1679                                        checkSet[i] = typeof part === "string" ?
     1680                                                cur || false :
     1681                                                cur === part;
     1682                                }
     1683                        }
     1684
     1685                        if ( typeof part === "string" ) {
     1686                                Sizzle.filter( part, checkSet, true );
     1687                        }
     1688                },
     1689                ">": function(checkSet, part, isXML){
     1690                        if ( typeof part === "string" && !/\W/.test(part) ) {
     1691                                part = isXML ? part : part.toUpperCase();
     1692
     1693                                for ( var i = 0, l = checkSet.length; i < l; i++ ) {
     1694                                        var elem = checkSet[i];
     1695                                        if ( elem ) {
     1696                                                var parent = elem.parentNode;
     1697                                                checkSet[i] = parent.nodeName === part ? parent : false;
     1698                                        }
     1699                                }
     1700                        } else {
     1701                                for ( var i = 0, l = checkSet.length; i < l; i++ ) {
     1702                                        var elem = checkSet[i];
     1703                                        if ( elem ) {
     1704                                                checkSet[i] = typeof part === "string" ?
     1705                                                        elem.parentNode :
     1706                                                        elem.parentNode === part;
     1707                                        }
     1708                                }
     1709
     1710                                if ( typeof part === "string" ) {
     1711                                        Sizzle.filter( part, checkSet, true );
     1712                                }
     1713                        }
     1714                },
     1715                "": function(checkSet, part, isXML){
     1716                        var doneName = "done" + (done++), checkFn = dirCheck;
     1717
     1718                        if ( !part.match(/\W/) ) {
     1719                                var nodeCheck = part = isXML ? part : part.toUpperCase();
     1720                                checkFn = dirNodeCheck;
     1721                        }
     1722
     1723                        checkFn("parentNode", part, doneName, checkSet, nodeCheck);
     1724                },
     1725                "~": function(checkSet, part, isXML){
     1726                        var doneName = "done" + (done++), checkFn = dirCheck;
     1727
     1728                        if ( typeof part === "string" && !part.match(/\W/) ) {
     1729                                var nodeCheck = part = isXML ? part : part.toUpperCase();
     1730                                checkFn = dirNodeCheck;
     1731                        }
     1732
     1733                        checkFn("previousSibling", part, doneName, checkSet, nodeCheck);
     1734                }
     1735        },
     1736        find: {
     1737                ID: function(match, context){
     1738                        if ( context.getElementById ) {
     1739                                var m = context.getElementById(match[1]);
     1740                                return m ? [m] : [];
     1741                        }
     1742                },
     1743                NAME: function(match, context){
     1744                        return context.getElementsByName ? context.getElementsByName(match[1]) : null;
     1745                },
     1746                TAG: function(match, context){
     1747                        return context.getElementsByTagName(match[1]);
     1748                }
     1749        },
     1750        preFilter: {
     1751                CLASS: function(match, curLoop, inplace, result, not){
     1752                        match = " " + match[1].replace(/\\/g, "") + " ";
     1753
     1754                        for ( var i = 0; curLoop[i]; i++ ) {
     1755                                if ( not ^ (" " + curLoop[i].className + " ").indexOf(match) >= 0 ) {
     1756                                        if ( !inplace )
     1757                                                result.push( curLoop[i] );
     1758                                } else if ( inplace ) {
     1759                                        curLoop[i] = false;
     1760                                }
     1761                        }
     1762
     1763                        return false;
     1764                },
     1765                ID: function(match){
     1766                        return match[1].replace(/\\/g, "");
     1767                },
     1768                TAG: function(match, curLoop){
     1769                        for ( var i = 0; !curLoop[i]; i++ ){}
     1770                        return isXML(curLoop[i]) ? match[1] : match[1].toUpperCase();
     1771                },
     1772                CHILD: function(match){
     1773                        if ( match[1] == "nth" ) {
     1774                                // parse equations like 'even', 'odd', '5', '2n', '3n+2', '4n-1', '-n+6'
     1775                                var test = /(-?)(\d*)n((?:\+|-)?\d*)/.exec(
     1776                                        match[2] == "even" && "2n" || match[2] == "odd" && "2n+1" ||
     1777                                        !/\D/.test( match[2] ) && "0n+" + match[2] || match[2]);
     1778
     1779                                // calculate the numbers (first)n+(last) including if they are negative
     1780                                match[2] = (test[1] + (test[2] || 1)) - 0;
     1781                                match[3] = test[3] - 0;
     1782                        }
     1783
     1784                        // TODO: Move to normal caching system
     1785                        match[0] = "done" + (done++);
     1786
     1787                        return match;
     1788                },
     1789                ATTR: function(match){
     1790                        var name = match[1];
     1791                       
     1792                        if ( Expr.attrMap[name] ) {
     1793                                match[1] = Expr.attrMap[name];
     1794                        }
     1795
     1796                        if ( match[2] === "~=" ) {
     1797                                match[4] = " " + match[4] + " ";
     1798                        }
     1799
     1800                        return match;
     1801                },
     1802                PSEUDO: function(match, curLoop, inplace, result, not){
     1803                        if ( match[1] === "not" ) {
     1804                                // If we're dealing with a complex expression, or a simple one
     1805                                if ( match[3].match(chunker).length > 1 ) {
     1806                                        match[3] = Sizzle(match[3], null, null, curLoop);
     1807                                } else {
     1808                                        var ret = Sizzle.filter(match[3], curLoop, inplace, true ^ not);
     1809                                        if ( !inplace ) {
     1810                                                result.push.apply( result, ret );
     1811                                        }
     1812                                        return false;
     1813                                }
     1814                        } else if ( Expr.match.POS.test( match[0] ) ) {
     1815                                return true;
     1816                        }
     1817                       
     1818                        return match;
     1819                },
     1820                POS: function(match){
     1821                        match.unshift( true );
     1822                        return match;
     1823                }
     1824        },
     1825        filters: {
     1826                enabled: function(elem){
     1827                        return elem.disabled === false && elem.type !== "hidden";
     1828                },
     1829                disabled: function(elem){
     1830                        return elem.disabled === true;
     1831                },
     1832                checked: function(elem){
     1833                        return elem.checked === true;
     1834                },
     1835                selected: function(elem){
     1836                        // Accessing this property makes selected-by-default
     1837                        // options in Safari work properly
     1838                        elem.parentNode.selectedIndex;
     1839                        return elem.selected === true;
     1840                },
     1841                parent: function(elem){
     1842                        return !!elem.firstChild;
     1843                },
     1844                empty: function(elem){
     1845                        return !elem.firstChild;
     1846                },
     1847                has: function(elem, i, match){
     1848                        return !!Sizzle( match[3], elem ).length;
     1849                },
     1850                header: function(elem){
     1851                        return /h\d/i.test( elem.nodeName );
     1852                },
     1853                text: function(elem){
     1854                        return "text" === elem.type;
     1855                },
     1856                radio: function(elem){
     1857                        return "radio" === elem.type;
     1858                },
     1859                checkbox: function(elem){
     1860                        return "checkbox" === elem.type;
     1861                },
     1862                file: function(elem){
     1863                        return "file" === elem.type;
     1864                },
     1865                password: function(elem){
     1866                        return "password" === elem.type;
     1867                },
     1868                submit: function(elem){
     1869                        return "submit" === elem.type;
     1870                },
     1871                image: function(elem){
     1872                        return "image" === elem.type;
     1873                },
     1874                reset: function(elem){
     1875                        return "reset" === elem.type;
     1876                },
     1877                button: function(elem){
     1878                        return "button" === elem.type || elem.nodeName.toUpperCase() === "BUTTON";
     1879                },
     1880                input: function(elem){
     1881                        return /input|select|textarea|button/i.test(elem.nodeName);
     1882                }
     1883        },
     1884        setFilters: {
     1885                first: function(elem, i){
     1886                        return i === 0;
     1887                },
     1888                last: function(elem, i, match, array){
     1889                        return i === array.length - 1;
     1890                },
     1891                even: function(elem, i){
     1892                        return i % 2 === 0;
     1893                },
     1894                odd: function(elem, i){
     1895                        return i % 2 === 1;
     1896                },
     1897                lt: function(elem, i, match){
     1898                        return i < match[3] - 0;
     1899                },
     1900                gt: function(elem, i, match){
     1901                        return i > match[3] - 0;
     1902                },
     1903                nth: function(elem, i, match){
     1904                        return match[3] - 0 == i;
     1905                },
     1906                eq: function(elem, i, match){
     1907                        return match[3] - 0 == i;
     1908                }
     1909        },
     1910        filter: {
     1911                CHILD: function(elem, match){
     1912                        var type = match[1], parent = elem.parentNode;
     1913
     1914                        var doneName = "child" + parent.childNodes.length;
     1915                       
     1916                        if ( parent && (!parent[ doneName ] || !elem.nodeIndex) ) {
     1917                                var count = 1;
     1918
     1919                                for ( var node = parent.firstChild; node; node = node.nextSibling ) {
     1920                                        if ( node.nodeType == 1 ) {
     1921                                                node.nodeIndex = count++;
     1922                                        }
     1923                                }
     1924
     1925                                parent[ doneName ] = count - 1;
     1926                        }
     1927
     1928                        if ( type == "first" ) {
     1929                                return elem.nodeIndex == 1;
     1930                        } else if ( type == "last" ) {
     1931                                return elem.nodeIndex == parent[ doneName ];
     1932                        } else if ( type == "only" ) {
     1933                                return parent[ doneName ] == 1;
     1934                        } else if ( type == "nth" ) {
     1935                                var add = false, first = match[2], last = match[3];
     1936
     1937                                if ( first == 1 && last == 0 ) {
     1938                                        return true;
     1939                                }
     1940
     1941                                if ( first == 0 ) {
     1942                                        if ( elem.nodeIndex == last ) {
     1943                                                add = true;
     1944                                        }
     1945                                } else if ( (elem.nodeIndex - last) % first == 0 && (elem.nodeIndex - last) / first >= 0 ) {
     1946                                        add = true;
     1947                                }
     1948
     1949                                return add;
     1950                        }
     1951                },
     1952                PSEUDO: function(elem, match, i, array){
     1953                        var name = match[1], filter = Expr.filters[ name ];
     1954
     1955                        if ( filter ) {
     1956                                return filter( elem, i, match, array );
     1957                        } else if ( name === "contains" ) {
     1958                                return (elem.textContent || elem.innerText || "").indexOf(match[3]) >= 0;
     1959                        } else if ( name === "not" ) {
     1960                                var not = match[3];
     1961
     1962                                for ( var i = 0, l = not.length; i < l; i++ ) {
     1963                                        if ( not[i] === elem ) {
     1964                                                return false;
     1965                                        }
     1966                                }
     1967
     1968                                return true;
     1969                        }
     1970                },
     1971                ID: function(elem, match){
     1972                        return elem.nodeType === 1 && elem.getAttribute("id") === match;
     1973                },
     1974                TAG: function(elem, match){
     1975                        return (match === "*" && elem.nodeType === 1) || elem.nodeName === match;
     1976                },
     1977                CLASS: function(elem, match){
     1978                        return match.test( elem.className );
     1979                },
     1980                ATTR: function(elem, match){
     1981                        var result = elem[ match[1] ] || elem.getAttribute( match[1] ), value = result + "", type = match[2], check = match[4];
     1982                        return result == null ?
     1983                                false :
     1984                                type === "=" ?
     1985                                value === check :
     1986                                type === "*=" ?
     1987                                value.indexOf(check) >= 0 :
     1988                                type === "~=" ?
     1989                                (" " + value + " ").indexOf(check) >= 0 :
     1990                                !match[4] ?
     1991                                result :
     1992                                type === "!=" ?
     1993                                value != check :
     1994                                type === "^=" ?
     1995                                value.indexOf(check) === 0 :
     1996                                type === "$=" ?
     1997                                value.substr(value.length - check.length) === check :
     1998                                type === "|=" ?
     1999                                value === check || value.substr(0, check.length + 1) === check + "-" :
     2000                                false;
     2001                },
     2002                POS: function(elem, match, i, array){
     2003                        var name = match[2], filter = Expr.setFilters[ name ];
     2004
     2005                        if ( filter ) {
     2006                                return filter( elem, i, match, array );
     2007                        }
     2008                }
     2009        }
     2010};
     2011
     2012for ( var type in Expr.match ) {
     2013        Expr.match[ type ] = RegExp( Expr.match[ type ].source + /(?![^\[]*\])(?![^\(]*\))/.source );
     2014}
     2015
     2016var makeArray = function(array, results) {
     2017        array = Array.prototype.slice.call( array );
     2018
     2019        if ( results ) {
     2020                results.push.apply( results, array );
     2021                return results;
     2022        }
     2023       
     2024        return array;
     2025};
     2026
     2027// Perform a simple check to determine if the browser is capable of
     2028// converting a NodeList to an array using builtin methods.
     2029try {
     2030        Array.prototype.slice.call( document.documentElement.childNodes );
     2031
     2032// Provide a fallback method if it does not work
     2033} catch(e){
     2034        makeArray = function(array, results) {
     2035                var ret = results || [];
     2036
     2037                if ( toString.call(array) === "[object Array]" ) {
     2038                        Array.prototype.push.apply( ret, array );
     2039                } else {
     2040                        if ( typeof array.length === "number" ) {
     2041                                for ( var i = 0, l = array.length; i < l; i++ ) {
     2042                                        ret.push( array[i] );
     2043                                }
     2044                        } else {
     2045                                for ( var i = 0; array[i]; i++ ) {
     2046                                        ret.push( array[i] );
     2047                                }
     2048                        }
     2049                }
     2050
     2051                return ret;
     2052        };
     2053}
     2054
     2055// Check to see if the browser returns elements by name when
     2056// querying by getElementById (and provide a workaround)
     2057(function(){
     2058        // We're going to inject a fake input element with a specified name
     2059        var form = document.createElement("form"),
     2060                id = "script" + (new Date).getTime();
     2061        form.innerHTML = "<input name='" + id + "'/>";
     2062
     2063        // Inject it into the root element, check its status, and remove it quickly
     2064        var root = document.documentElement;
     2065        root.insertBefore( form, root.firstChild );
     2066
     2067        // The workaround has to do additional checks after a getElementById
     2068        // Which slows things down for other browsers (hence the branching)
     2069        if ( !!document.getElementById( id ) ) {
     2070                Expr.find.ID = function(match, context){
     2071                        if ( context.getElementById ) {
     2072                                var m = context.getElementById(match[1]);
     2073                                return m ? m.id === match[1] || m.getAttributeNode && m.getAttributeNode("id").nodeValue === match[1] ? [m] : undefined : [];
     2074                        }
     2075                };
     2076
     2077                Expr.filter.ID = function(elem, match){
     2078                        var node = elem.getAttributeNode && elem.getAttributeNode("id");
     2079                        return elem.nodeType === 1 && node && node.nodeValue === match;
     2080                };
     2081        }
     2082
     2083        root.removeChild( form );
     2084})();
     2085
     2086// Check to see if the browser returns only elements
     2087// when doing getElementsByTagName("*")
     2088(function(){
     2089        // Create a fake element
     2090        var div = document.createElement("div");
     2091        div.appendChild( document.createComment("") );
     2092
     2093        // Make sure no comments are found
     2094        if ( div.getElementsByTagName("*").length > 0 ) {
     2095                Expr.find.TAG = function(match, context){
     2096                        var results = context.getElementsByTagName(match[1]);
     2097
     2098                        // Filter out possible comments
     2099                        if ( match[1] === "*" ) {
     2100                                var tmp = [];
     2101
     2102                                for ( var i = 0; results[i]; i++ ) {
     2103                                        if ( results[i].nodeType === 1 ) {
     2104                                                tmp.push( results[i] );
     2105                                        }
     2106                                }
     2107
     2108                                results = tmp;
     2109                        }
     2110
     2111                        return results;
     2112                };
     2113        }
     2114})();
     2115
     2116if ( document.querySelectorAll ) (function(){
     2117        var oldSizzle = Sizzle;
     2118       
     2119        Sizzle = function(query, context, extra, seed){
     2120                context = context || document;
     2121
     2122                if ( !seed && context.nodeType === 9 ) {
     2123                        try {
     2124                                return makeArray( context.querySelectorAll(query), extra );
     2125                        } catch(e){}
     2126                }
     2127               
     2128                return oldSizzle(query, context, extra, seed);
     2129        };
     2130
     2131        Sizzle.find = oldSizzle.find;
     2132        Sizzle.filter = oldSizzle.filter;
     2133        Sizzle.selectors = oldSizzle.selectors;
     2134        Sizzle.matches = oldSizzle.matches;
     2135})();
     2136
     2137if ( document.documentElement.getElementsByClassName ) {
     2138        Expr.order.splice(1, 0, "CLASS");
     2139        Expr.find.CLASS = function(match, context) {
     2140                return context.getElementsByClassName(match[1]);
     2141        };
     2142}
     2143
     2144function dirNodeCheck( dir, cur, doneName, checkSet, nodeCheck ) {
     2145        for ( var i = 0, l = checkSet.length; i < l; i++ ) {
     2146                var elem = checkSet[i];
     2147                if ( elem ) {
     2148                        elem = elem[dir];
     2149                        var match = false;
     2150
     2151                        while ( elem && elem.nodeType ) {
     2152                                var done = elem[doneName];
     2153                                if ( done ) {
     2154                                        match = checkSet[ done ];
     2155                                        break;
     2156                                }
     2157
     2158                                if ( elem.nodeType === 1 )
     2159                                        elem[doneName] = i;
     2160
     2161                                if ( elem.nodeName === cur ) {
     2162                                        match = elem;
     2163                                        break;
     2164                                }
     2165
     2166                                elem = elem[dir];
     2167                        }
     2168
     2169                        checkSet[i] = match;
     2170                }
     2171        }
     2172}
     2173
     2174function dirCheck( dir, cur, doneName, checkSet, nodeCheck ) {
     2175        for ( var i = 0, l = checkSet.length; i < l; i++ ) {
     2176                var elem = checkSet[i];
     2177                if ( elem ) {
     2178                        elem = elem[dir];
     2179                        var match = false;
     2180
     2181                        while ( elem && elem.nodeType ) {
     2182                                if ( elem[doneName] ) {
     2183                                        match = checkSet[ elem[doneName] ];
     2184                                        break;
     2185                                }
     2186
     2187                                if ( elem.nodeType === 1 ) {
     2188                                        elem[doneName] = i;
     2189
     2190                                        if ( typeof cur !== "string" ) {
     2191                                                if ( elem === cur ) {
     2192                                                        match = true;
     2193                                                        break;
     2194                                                }
     2195
     2196                                        } else if ( Sizzle.filter( cur, [elem] ).length > 0 ) {
     2197                                                match = elem;
     2198                                                break;
     2199                                        }
     2200                                }
     2201
     2202                                elem = elem[dir];
     2203                        }
     2204
     2205                        checkSet[i] = match;
     2206                }
     2207        }
     2208}
     2209
     2210var contains = document.compareDocumentPosition ?  function(a, b){
     2211        return a.compareDocumentPosition(b) & 16;
     2212} : function(a, b){
     2213        return a !== b && (a.contains ? a.contains(b) : true);
     2214};
     2215
     2216var isXML = function(elem){
     2217        return elem.documentElement && !elem.body ||
     2218                elem.tagName && elem.ownerDocument && !elem.ownerDocument.body;
     2219};
     2220
     2221// EXPOSE
     2222jQuery.find = Sizzle;
     2223jQuery.filter = Sizzle.filter;
     2224jQuery.expr = Sizzle.selectors;
     2225jQuery.expr[":"] = jQuery.expr.filters;
     2226
     2227Sizzle.selectors.filters.hidden = function(elem){
     2228        return "hidden" === elem.type ||
     2229                jQuery.css(elem, "display") === "none" ||
     2230                jQuery.css(elem, "visibility") === "hidden";
     2231};
     2232
     2233Sizzle.selectors.filters.visible = function(elem){
     2234        return "hidden" !== elem.type &&
     2235                jQuery.css(elem, "display") !== "none" &&
     2236                jQuery.css(elem, "visibility") !== "hidden";
     2237};
     2238
     2239Sizzle.selectors.filters.animated = function(elem){
     2240        return jQuery.grep(jQuery.timers, function(fn){
     2241                return elem === fn.elem;
     2242        }).length;
     2243};
     2244
     2245jQuery.multiFilter = function( expr, elems, not ) {
     2246        if ( not ) {
     2247                expr = ":not(" + expr + ")";
     2248        }
     2249
     2250        return Sizzle.matches(expr, elems);
     2251};
     2252
     2253jQuery.dir = function( elem, dir ){
     2254        var matched = [], cur = elem[dir];
     2255        while ( cur && cur != document ) {
     2256                if ( cur.nodeType == 1 )
     2257                        matched.push( cur );
     2258                cur = cur[dir];
     2259        }
     2260        return matched;
     2261};
     2262
     2263jQuery.nth = function(cur, result, dir, elem){
     2264        result = result || 1;
     2265        var num = 0;
     2266
     2267        for ( ; cur; cur = cur[dir] )
     2268                if ( cur.nodeType == 1 && ++num == result )
     2269                        break;
     2270
     2271        return cur;
     2272};
     2273
     2274jQuery.sibling = function(n, elem){
     2275        var r = [];
     2276
     2277        for ( ; n; n = n.nextSibling ) {
     2278                if ( n.nodeType == 1 && n != elem )
     2279                        r.push( n );
     2280        }
     2281
     2282        return r;
     2283};
     2284
     2285return;
     2286
     2287window.Sizzle = Sizzle;
     2288
     2289})();
     2290/*
     2291 * A number of helper functions used for managing events.
     2292 * Many of the ideas behind this code originated from
     2293 * Dean Edwards' addEvent library.
     2294 */
     2295jQuery.event = {
     2296
     2297        // Bind an event to an element
     2298        // Original by Dean Edwards
     2299        add: function(elem, types, handler, data) {
     2300                if ( elem.nodeType == 3 || elem.nodeType == 8 )
     2301                        return;
     2302
     2303                // For whatever reason, IE has trouble passing the window object
     2304                // around, causing it to be cloned in the process
     2305                if ( elem.setInterval && elem != window )
     2306                        elem = window;
     2307
     2308                // Make sure that the function being executed has a unique ID
     2309                if ( !handler.guid )
     2310                        handler.guid = this.guid++;
     2311
     2312                // if data is passed, bind to handler
     2313                if ( data !== undefined ) {
     2314                        // Create temporary function pointer to original handler
     2315                        var fn = handler;
     2316
     2317                        // Create unique handler function, wrapped around original handler
     2318                        handler = this.proxy( fn );
     2319
     2320                        // Store data in unique handler
     2321                        handler.data = data;
     2322                }
     2323
     2324                // Init the element's event structure
     2325                var events = jQuery.data(elem, "events") || jQuery.data(elem, "events", {}),
     2326                        handle = jQuery.data(elem, "handle") || jQuery.data(elem, "handle", function(){
     2327                                // Handle the second event of a trigger and when
     2328                                // an event is called after a page has unloaded
     2329                                return typeof jQuery !== "undefined" && !jQuery.event.triggered ?
     2330                                        jQuery.event.handle.apply(arguments.callee.elem, arguments) :
     2331                                        undefined;
     2332                        });
     2333                // Add elem as a property of the handle function
     2334                // This is to prevent a memory leak with non-native
     2335                // event in IE.
     2336                handle.elem = elem;
     2337
     2338                // Handle multiple events separated by a space
     2339                // jQuery(...).bind("mouseover mouseout", fn);
     2340                jQuery.each(types.split(/\s+/), function(index, type) {
     2341                        // Namespaced event handlers
     2342                        var namespaces = type.split(".");
     2343                        type = namespaces.shift();
     2344                        handler.type = namespaces.slice().sort().join(".");
     2345
     2346                        // Get the current list of functions bound to this event
     2347                        var handlers = events[type];
     2348                       
     2349                        if ( jQuery.event.specialAll[type] )
     2350                                jQuery.event.specialAll[type].setup.call(elem, data, namespaces);
     2351
     2352                        // Init the event handler queue
     2353                        if (!handlers) {
     2354                                handlers = events[type] = {};
     2355
     2356                                // Check for a special event handler
     2357                                // Only use addEventListener/attachEvent if the special
     2358                                // events handler returns false
     2359                                if ( !jQuery.event.special[type] || jQuery.event.special[type].setup.call(elem, data, namespaces) === false ) {
     2360                                        // Bind the global event handler to the element
     2361                                        if (elem.addEventListener)
     2362                                                elem.addEventListener(type, handle, false);
     2363                                        else if (elem.attachEvent)
     2364                                                elem.attachEvent("on" + type, handle);
     2365                                }
     2366                        }
     2367
     2368                        // Add the function to the element's handler list
     2369                        handlers[handler.guid] = handler;
     2370
     2371                        // Keep track of which events have been used, for global triggering
     2372                        jQuery.event.global[type] = true;
     2373                });
     2374
     2375                // Nullify elem to prevent memory leaks in IE
     2376                elem = null;
     2377        },
     2378
     2379        guid: 1,
     2380        global: {},
     2381
     2382        // Detach an event or set of events from an element
     2383        remove: function(elem, types, handler) {
     2384                // don't do events on text and comment nodes
     2385                if ( elem.nodeType == 3 || elem.nodeType == 8 )
     2386                        return;
     2387
     2388                var events = jQuery.data(elem, "events"), ret, index;
     2389
     2390                if ( events ) {
     2391                        // Unbind all events for the element
     2392                        if ( types === undefined || (typeof types === "string" && types.charAt(0) == ".") )
     2393                                for ( var type in events )
     2394                                        this.remove( elem, type + (types || "") );
     2395                        else {
     2396                                // types is actually an event object here
     2397                                if ( types.type ) {
     2398                                        handler = types.handler;
     2399                                        types = types.type;
     2400                                }
     2401
     2402                                // Handle multiple events seperated by a space
     2403                                // jQuery(...).unbind("mouseover mouseout", fn);
     2404                                jQuery.each(types.split(/\s+/), function(index, type){
     2405                                        // Namespaced event handlers
     2406                                        var namespaces = type.split(".");
     2407                                        type = namespaces.shift();
     2408                                        var namespace = RegExp("(^|\\.)" + namespaces.slice().sort().join(".*\\.") + "(\\.|$)");
     2409
     2410                                        if ( events[type] ) {
     2411                                                // remove the given handler for the given type
     2412                                                if ( handler )
     2413                                                        delete events[type][handler.guid];
     2414
     2415                                                // remove all handlers for the given type
     2416                                                else
     2417                                                        for ( var handle in events[type] )
     2418                                                                // Handle the removal of namespaced events
     2419                                                                if ( namespace.test(events[type][handle].type) )
     2420                                                                        delete events[type][handle];
     2421                                                                       
     2422                                                if ( jQuery.event.specialAll[type] )
     2423                                                        jQuery.event.specialAll[type].teardown.call(elem, namespaces);
     2424
     2425                                                // remove generic event handler if no more handlers exist
     2426                                                for ( ret in events[type] ) break;
     2427                                                if ( !ret ) {
     2428                                                        if ( !jQuery.event.special[type] || jQuery.event.special[type].teardown.call(elem, namespaces) === false ) {
     2429                                                                if (elem.removeEventListener)
     2430                                                                        elem.removeEventListener(type, jQuery.data(elem, "handle"), false);
     2431                                                                else if (elem.detachEvent)
     2432                                                                        elem.detachEvent("on" + type, jQuery.data(elem, "handle"));
     2433                                                        }
     2434                                                        ret = null;
     2435                                                        delete events[type];
     2436                                                }
     2437                                        }
     2438                                });
     2439                        }
     2440
     2441                        // Remove the expando if it's no longer used
     2442                        for ( ret in events ) break;
     2443                        if ( !ret ) {
     2444                                var handle = jQuery.data( elem, "handle" );
     2445                                if ( handle ) handle.elem = null;
     2446                                jQuery.removeData( elem, "events" );
     2447                                jQuery.removeData( elem, "handle" );
     2448                        }
     2449                }
     2450        },
     2451
     2452        // bubbling is internal
     2453        trigger: function( event, data, elem, bubbling ) {
     2454                // Event object or event type
     2455                var type = event.type || event;
     2456
     2457                if( !bubbling ){
     2458                        event = typeof event === "object" ?
     2459                                // jQuery.Event object
     2460                                event[expando] ? event :
     2461                                // Object literal
     2462                                jQuery.extend( jQuery.Event(type), event ) :
     2463                                // Just the event type (string)
     2464                                jQuery.Event(type);
     2465
     2466                        if ( type.indexOf("!") >= 0 ) {
     2467                                event.type = type = type.slice(0, -1);
     2468                                event.exclusive = true;
     2469                        }
     2470
     2471                        // Handle a global trigger
     2472                        if ( !elem ) {
     2473                                // Don't bubble custom events when global (to avoid too much overhead)
     2474                                event.stopPropagation();
     2475                                // Only trigger if we've ever bound an event for it
     2476                                if ( this.global[type] )
     2477                                        jQuery.each( jQuery.cache, function(){
     2478                                                if ( this.events && this.events[type] )
     2479                                                        jQuery.event.trigger( event, data, this.handle.elem );
     2480                                        });
     2481                        }
     2482
     2483                        // Handle triggering a single element
     2484
     2485                        // don't do events on text and comment nodes
     2486                        if ( !elem || elem.nodeType == 3 || elem.nodeType == 8 )
     2487                                return undefined;
     2488                       
     2489                        // Clean up in case it is reused
     2490                        event.result = undefined;
     2491                        event.target = elem;
     2492                       
     2493                        // Clone the incoming data, if any
     2494                        data = jQuery.makeArray(data);
     2495                        data.unshift( event );
     2496                }
     2497
     2498                event.currentTarget = elem;
     2499
     2500                // Trigger the event, it is assumed that "handle" is a function
     2501                var handle = jQuery.data(elem, "handle");
     2502                if ( handle )
     2503                        handle.apply( elem, data );
     2504
     2505                // Handle triggering native .onfoo handlers (and on links since we don't call .click() for links)
     2506                if ( (!elem[type] || (jQuery.nodeName(elem, 'a') && type == "click")) && elem["on"+type] && elem["on"+type].apply( elem, data ) === false )
     2507                        event.result = false;
     2508
     2509                // Trigger the native events (except for clicks on links)
     2510                if ( !bubbling && elem[type] && !event.isDefaultPrevented() && !(jQuery.nodeName(elem, 'a') && type == "click") ) {
     2511                        this.triggered = true;
     2512                        try {
     2513                                elem[ type ]();
     2514                        // prevent IE from throwing an error for some hidden elements
     2515                        } catch (e) {}
     2516                }
     2517
     2518                this.triggered = false;
     2519
     2520                if ( !event.isPropagationStopped() ) {
     2521                        var parent = elem.parentNode || elem.ownerDocument;
     2522                        if ( parent )
     2523                                jQuery.event.trigger(event, data, parent, true);
     2524                }
     2525        },
     2526
     2527        handle: function(event) {
     2528                // returned undefined or false
     2529                var all, handlers;
     2530
     2531                event = arguments[0] = jQuery.event.fix( event || window.event );
     2532
     2533                // Namespaced event handlers
     2534                var namespaces = event.type.split(".");
     2535                event.type = namespaces.shift();
     2536
     2537                // Cache this now, all = true means, any handler
     2538                all = !namespaces.length && !event.exclusive;
     2539               
     2540                var namespace = RegExp("(^|\\.)" + namespaces.slice().sort().join(".*\\.") + "(\\.|$)");
     2541
     2542                handlers = ( jQuery.data(this, "events") || {} )[event.type];
     2543
     2544                for ( var j in handlers ) {
     2545                        var handler = handlers[j];
     2546
     2547                        // Filter the functions by class
     2548                        if ( all || namespace.test(handler.type) ) {
     2549                                // Pass in a reference to the handler function itself
     2550                                // So that we can later remove it
     2551                                event.handler = handler;
     2552                                event.data = handler.data;
     2553
     2554                                var ret = handler.apply(this, arguments);
     2555
     2556                                if( ret !== undefined ){
     2557                                        event.result = ret;
     2558                                        if ( ret === false ) {
     2559                                                event.preventDefault();
     2560                                                event.stopPropagation();
     2561                                        }
     2562                                }
     2563
     2564                                if( event.isImmediatePropagationStopped() )
     2565                                        break;
     2566
     2567                        }
     2568                }
     2569        },
     2570
     2571        props: "altKey attrChange attrName bubbles button cancelable charCode clientX clientY ctrlKey currentTarget data detail eventPhase fromElement handler keyCode metaKey newValue originalTarget pageX pageY prevValue relatedNode relatedTarget screenX screenY shiftKey srcElement target toElement view wheelDelta which".split(" "),
     2572
     2573        fix: function(event) {
     2574                if ( event[expando] )
     2575                        return event;
     2576
     2577                // store a copy of the original event object
     2578                // and "clone" to set read-only properties
     2579                var originalEvent = event;
     2580                event = jQuery.Event( originalEvent );
     2581
     2582                for ( var i = this.props.length, prop; i; ){
     2583                        prop = this.props[ --i ];
     2584                        event[ prop ] = originalEvent[ prop ];
     2585                }
     2586
     2587                // Fix target property, if necessary
     2588                if ( !event.target )
     2589                        event.target = event.srcElement || document; // Fixes #1925 where srcElement might not be defined either
     2590
     2591                // check if target is a textnode (safari)
     2592                if ( event.target.nodeType == 3 )
     2593                        event.target = event.target.parentNode;
     2594
     2595                // Add relatedTarget, if necessary
     2596                if ( !event.relatedTarget && event.fromElement )
     2597                        event.relatedTarget = event.fromElement == event.target ? event.toElement : event.fromElement;
     2598
     2599                // Calculate pageX/Y if missing and clientX/Y available
     2600                if ( event.pageX == null && event.clientX != null ) {
     2601                        var doc = document.documentElement, body = document.body;
     2602                        event.pageX = event.clientX + (doc && doc.scrollLeft || body && body.scrollLeft || 0) - (doc.clientLeft || 0);
     2603                        event.pageY = event.clientY + (doc && doc.scrollTop || body && body.scrollTop || 0) - (doc.clientTop || 0);
     2604                }
     2605
     2606                // Add which for key events
     2607                if ( !event.which && ((event.charCode || event.charCode === 0) ? event.charCode : event.keyCode) )
     2608                        event.which = event.charCode || event.keyCode;
     2609
     2610                // Add metaKey to non-Mac browsers (use ctrl for PC's and Meta for Macs)
     2611                if ( !event.metaKey && event.ctrlKey )
     2612                        event.metaKey = event.ctrlKey;
     2613
     2614                // Add which for click: 1 == left; 2 == middle; 3 == right
     2615                // Note: button is not normalized, so don't use it
     2616                if ( !event.which && event.button )
     2617                        event.which = (event.button & 1 ? 1 : ( event.button & 2 ? 3 : ( event.button & 4 ? 2 : 0 ) ));
     2618
     2619                return event;
     2620        },
     2621
     2622        proxy: function( fn, proxy ){
     2623                proxy = proxy || function(){ return fn.apply(this, arguments); };
     2624                // Set the guid of unique handler to the same of original handler, so it can be removed
     2625                proxy.guid = fn.guid = fn.guid || proxy.guid || this.guid++;
     2626                // So proxy can be declared as an argument
     2627                return proxy;
     2628        },
     2629
     2630        special: {
     2631                ready: {
     2632                        // Make sure the ready event is setup
     2633                        setup: bindReady,
     2634                        teardown: function() {}
     2635                }
     2636        },
     2637       
     2638        specialAll: {
     2639                live: {
     2640                        setup: function( selector, namespaces ){
     2641                                jQuery.event.add( this, namespaces[0], liveHandler );
     2642                        },
     2643                        teardown:  function( namespaces ){
     2644                                if ( namespaces.length ) {
     2645                                        var remove = 0, name = RegExp("(^|\\.)" + namespaces[0] + "(\\.|$)");
     2646                                       
     2647                                        jQuery.each( (jQuery.data(this, "events").live || {}), function(){
     2648                                                if ( name.test(this.type) )
     2649                                                        remove++;
     2650                                        });
     2651                                       
     2652                                        if ( remove < 1 )
     2653                                                jQuery.event.remove( this, namespaces[0], liveHandler );
     2654                                }
     2655                        }
     2656                }
     2657        }
     2658};
     2659
     2660jQuery.Event = function( src ){
     2661        // Allow instantiation without the 'new' keyword
     2662        if( !this.preventDefault )
     2663                return new jQuery.Event(src);
     2664       
     2665        // Event object
     2666        if( src && src.type ){
     2667                this.originalEvent = src;
     2668                this.type = src.type;
     2669                this.timeStamp = src.timeStamp;
     2670        // Event type
     2671        }else
     2672                this.type = src;
     2673
     2674        if( !this.timeStamp )
     2675                this.timeStamp = now();
     2676       
     2677        // Mark it as fixed
     2678        this[expando] = true;
     2679};
     2680
     2681function returnFalse(){
     2682        return false;
     2683}
     2684function returnTrue(){
     2685        return true;
     2686}
     2687
     2688// jQuery.Event is based on DOM3 Events as specified by the ECMAScript Language Binding
     2689// http://www.w3.org/TR/2003/WD-DOM-Level-3-Events-20030331/ecma-script-binding.html
     2690jQuery.Event.prototype = {
     2691        preventDefault: function() {
     2692                this.isDefaultPrevented = returnTrue;
     2693
     2694                var e = this.originalEvent;
     2695                if( !e )
     2696                        return;
     2697                // if preventDefault exists run it on the original event
     2698                if (e.preventDefault)
     2699                        e.preventDefault();
     2700                // otherwise set the returnValue property of the original event to false (IE)
     2701                e.returnValue = false;
     2702        },
     2703        stopPropagation: function() {
     2704                this.isPropagationStopped = returnTrue;
     2705
     2706                var e = this.originalEvent;
     2707                if( !e )
     2708                        return;
     2709                // if stopPropagation exists run it on the original event
     2710                if (e.stopPropagation)
     2711                        e.stopPropagation();
     2712                // otherwise set the cancelBubble property of the original event to true (IE)
     2713                e.cancelBubble = true;
     2714        },
     2715        stopImmediatePropagation:function(){
     2716                this.isImmediatePropagationStopped = returnTrue;
     2717                this.stopPropagation();
     2718        },
     2719        isDefaultPrevented: returnFalse,
     2720        isPropagationStopped: returnFalse,
     2721        isImmediatePropagationStopped: returnFalse
     2722};
     2723// Checks if an event happened on an element within another element
     2724// Used in jQuery.event.special.mouseenter and mouseleave handlers
     2725var withinElement = function(event) {
     2726        // Check if mouse(over|out) are still within the same parent element
     2727        var parent = event.relatedTarget;
     2728        // Traverse up the tree
     2729        while ( parent && parent != this )
     2730                try { parent = parent.parentNode; }
     2731                catch(e) { parent = this; }
     2732       
     2733        if( parent != this ){
     2734                // set the correct event type
     2735                event.type = event.data;
     2736                // handle event if we actually just moused on to a non sub-element
     2737                jQuery.event.handle.apply( this, arguments );
     2738        }
     2739};
     2740       
     2741jQuery.each({
     2742        mouseover: 'mouseenter',
     2743        mouseout: 'mouseleave'
     2744}, function( orig, fix ){
     2745        jQuery.event.special[ fix ] = {
     2746                setup: function(){
     2747                        jQuery.event.add( this, orig, withinElement, fix );
     2748                },
     2749                teardown: function(){
     2750                        jQuery.event.remove( this, orig, withinElement );
     2751                }
     2752        };                         
     2753});
     2754
     2755jQuery.fn.extend({
     2756        bind: function( type, data, fn ) {
     2757                return type == "unload" ? this.one(type, data, fn) : this.each(function(){
     2758                        jQuery.event.add( this, type, fn || data, fn && data );
     2759                });
     2760        },
     2761
     2762        one: function( type, data, fn ) {
     2763                var one = jQuery.event.proxy( fn || data, function(event) {
     2764                        jQuery(this).unbind(event, one);
     2765                        return (fn || data).apply( this, arguments );
     2766                });
     2767                return this.each(function(){
     2768                        jQuery.event.add( this, type, one, fn && data);
     2769                });
     2770        },
     2771
     2772        unbind: function( type, fn ) {
     2773                return this.each(function(){
     2774                        jQuery.event.remove( this, type, fn );
     2775                });
     2776        },
     2777
     2778        trigger: function( type, data ) {
     2779                return this.each(function(){
     2780                        jQuery.event.trigger( type, data, this );
     2781                });
     2782        },
     2783
     2784        triggerHandler: function( type, data ) {
     2785                if( this[0] ){
     2786                        var event = jQuery.Event(type);
     2787                        event.preventDefault();
     2788                        event.stopPropagation();
     2789                        jQuery.event.trigger( event, data, this[0] );
     2790                        return event.result;
     2791                }               
     2792        },
     2793
     2794        toggle: function( fn ) {
     2795                // Save reference to arguments for access in closure
     2796                var args = arguments, i = 1;
     2797
     2798                // link all the functions, so any of them can unbind this click handler
     2799                while( i < args.length )
     2800                        jQuery.event.proxy( fn, args[i++] );
     2801
     2802                return this.click( jQuery.event.proxy( fn, function(event) {
     2803                        // Figure out which function to execute
     2804                        this.lastToggle = ( this.lastToggle || 0 ) % i;
     2805
     2806                        // Make sure that clicks stop
     2807                        event.preventDefault();
     2808
     2809                        // and execute the function
     2810                        return args[ this.lastToggle++ ].apply( this, arguments ) || false;
     2811                }));
     2812        },
     2813
     2814        hover: function(fnOver, fnOut) {
     2815                return this.mouseenter(fnOver).mouseleave(fnOut);
     2816        },
     2817
     2818        ready: function(fn) {
     2819                // Attach the listeners
     2820                bindReady();
     2821
     2822                // If the DOM is already ready
     2823                if ( jQuery.isReady )
     2824                        // Execute the function immediately
     2825                        fn.call( document, jQuery );
     2826
     2827                // Otherwise, remember the function for later
     2828                else
     2829                        // Add the function to the wait list
     2830                        jQuery.readyList.push( fn );
     2831
     2832                return this;
     2833        },
     2834       
     2835        live: function( type, fn ){
     2836                var proxy = jQuery.event.proxy( fn );
     2837                proxy.guid += this.selector + type;
     2838
     2839                jQuery(document).bind( liveConvert(type, this.selector), this.selector, proxy );
     2840
     2841                return this;
     2842        },
     2843       
     2844        die: function( type, fn ){
     2845                jQuery(document).unbind( liveConvert(type, this.selector), fn ? { guid: fn.guid + this.selector + type } : null );
     2846                return this;
     2847        }
     2848});
     2849
     2850function liveHandler( event ){
     2851        var check = RegExp("(^|\\.)" + event.type + "(\\.|$)"),
     2852                stop = true,
     2853                elems = [];
     2854
     2855        jQuery.each(jQuery.data(this, "events").live || [], function(i, fn){
     2856                if ( check.test(fn.type) ) {
     2857                        var elem = jQuery(event.target).closest(fn.data)[0];
     2858                        if ( elem )
     2859                                elems.push({ elem: elem, fn: fn });
     2860                }
     2861        });
     2862
     2863        jQuery.each(elems, function(){
     2864                if ( !event.isImmediatePropagationStopped() &&
     2865                        this.fn.call(this.elem, event, this.fn.data) === false )
     2866                                stop = false;
     2867        });
     2868
     2869        return stop;
     2870}
     2871
     2872function liveConvert(type, selector){
     2873        return ["live", type, selector.replace(/\./g, "`").replace(/ /g, "|")].join(".");
     2874}
     2875
     2876jQuery.extend({
     2877        isReady: false,
     2878        readyList: [],
     2879        // Handle when the DOM is ready
     2880        ready: function() {
     2881                // Make sure that the DOM is not already loaded
     2882                if ( !jQuery.isReady ) {
     2883                        // Remember that the DOM is ready
     2884                        jQuery.isReady = true;
     2885
     2886                        // If there are functions bound, to execute
     2887                        if ( jQuery.readyList ) {
     2888                                // Execute all of them
     2889                                jQuery.each( jQuery.readyList, function(){
     2890                                        this.call( document, jQuery );
     2891                                });
     2892
     2893                                // Reset the list of functions
     2894                                jQuery.readyList = null;
     2895                        }
     2896
     2897                        // Trigger any bound ready events
     2898                        jQuery(document).triggerHandler("ready");
     2899                }
     2900        }
     2901});
     2902
     2903var readyBound = false;
     2904
     2905function bindReady(){
     2906        if ( readyBound ) return;
     2907        readyBound = true;
     2908
     2909        // Mozilla, Opera and webkit nightlies currently support this event
     2910        if ( document.addEventListener ) {
     2911                // Use the handy event callback
     2912                document.addEventListener( "DOMContentLoaded", function(){
     2913                        document.removeEventListener( "DOMContentLoaded", arguments.callee, false );
     2914                        jQuery.ready();
     2915                }, false );
     2916
     2917        // If IE event model is used
     2918        } else if ( document.attachEvent ) {
     2919                // ensure firing before onload,
     2920                // maybe late but safe also for iframes
     2921                document.attachEvent("onreadystatechange", function(){
     2922                        if ( document.readyState === "complete" ) {
     2923                                document.detachEvent( "onreadystatechange", arguments.callee );
     2924                                jQuery.ready();
     2925                        }
     2926                });
     2927
     2928                // If IE and not an iframe
     2929                // continually check to see if the document is ready
     2930                if ( document.documentElement.doScroll && !window.frameElement ) (function(){
     2931                        if ( jQuery.isReady ) return;
     2932
     2933                        try {
     2934                                // If IE is used, use the trick by Diego Perini
     2935                                // http://javascript.nwbox.com/IEContentLoaded/
     2936                                document.documentElement.doScroll("left");
     2937                        } catch( error ) {
     2938                                setTimeout( arguments.callee, 0 );
     2939                                return;
     2940                        }
     2941
     2942                        // and execute any waiting functions
     2943                        jQuery.ready();
     2944                })();
     2945        }
     2946
     2947        // A fallback to window.onload, that will always work
     2948        jQuery.event.add( window, "load", jQuery.ready );
     2949}
     2950
     2951jQuery.each( ("blur,focus,load,resize,scroll,unload,click,dblclick," +
     2952        "mousedown,mouseup,mousemove,mouseover,mouseout,mouseenter,mouseleave," +
     2953        "change,select,submit,keydown,keypress,keyup,error").split(","), function(i, name){
     2954
     2955        // Handle event binding
     2956        jQuery.fn[name] = function(fn){
     2957                return fn ? this.bind(name, fn) : this.trigger(name);
     2958        };
     2959});
     2960
     2961// Prevent memory leaks in IE
     2962// And prevent errors on refresh with events like mouseover in other browsers
     2963// Window isn't included so as not to unbind existing unload events
     2964jQuery( window ).bind( 'unload', function(){
     2965        for ( var id in jQuery.cache )
     2966                // Skip the window
     2967                if ( id != 1 && jQuery.cache[ id ].handle )
     2968                        jQuery.event.remove( jQuery.cache[ id ].handle.elem );
     2969});
     2970(function(){
    13782971
    13792972        jQuery.support = {};
     
    14283021                cssFloat: !!a.style.cssFloat,
    14293022
    1430                 // Verify tabindex attribute existence
    1431                 // (IE uses tabIndex instead of tabindex)
    1432                 tabindex: !a.getAttributeNode('tabindex'),
    1433 
    14343023                // Will be defined later
    14353024                scriptEval: false,
    1436                 noCloneEvent: true
     3025                noCloneEvent: true,
     3026                boxModel: null
    14373027        };
    14383028       
     
    14643054        }
    14653055
     3056        // Figure out if the W3C box model works as expected
     3057        // document.body must exist before we can do this
     3058        jQuery(function(){
     3059                var div = document.createElement("div");
     3060                div.style.width = "1px";
     3061                div.style.paddingLeft = "1px";
     3062
     3063                document.body.appendChild( div );
     3064                jQuery.boxModel = jQuery.support.boxModel = div.offsetWidth === 2;
     3065                document.body.removeChild( div );
     3066        });
    14663067})();
    14673068
     
    14783079        cellspacing: "cellSpacing",
    14793080        rowspan: "rowSpan",
    1480         tabindex: jQuery.support.tabindex ? "tabindex" : "tabIndex"
     3081        tabindex: "tabIndex"
    14813082};
    1482 /*
    1483  * Sizzle CSS Selector Engine - v0.9
    1484  *  Copyright 2009, John Resig (http://ejohn.org/)
    1485  *  released under the MIT License
    1486  */
    1487 (function(){
    1488 
    1489 var chunker = /((?:\((?:\([^()]+\)|[^()]+)+\)|\[(?:\[[^[\]]*\]|[^[\]]+)+\]|\\.|[^ >+~,(\[]+)+|[>+~])(\s*,\s*)?/g;
    1490 
    1491 var done = 0;
    1492 
    1493 var Sizzle = function(selector, context, results, seed) {
    1494         var doCache = !results;
    1495         results = results || [];
    1496         context = context || document;
    1497 
    1498         if ( context.nodeType !== 1 && context.nodeType !== 9 )
    1499                 return [];
    1500        
    1501         if ( !selector || typeof selector !== "string" ) {
    1502                 return results;
    1503         }
    1504 
    1505         var parts = [], m, set, checkSet, check, mode, extra;
    1506        
    1507         // Reset the position of the chunker regexp (start from head)
    1508         chunker.lastIndex = 0;
    1509        
    1510         while ( (m = chunker.exec(selector)) !== null ) {
    1511                 parts.push( m[1] );
    1512                
    1513                 if ( m[2] ) {
    1514                         extra = RegExp.rightContext;
    1515                         break;
    1516                 }
    1517         }
    1518 
    1519         if ( parts.length > 1 && Expr.match.POS.exec( selector ) ) {
    1520                 if ( parts.length === 2 && Expr.relative[ parts[0] ] ) {
    1521                         var later = "", match;
    1522 
    1523                         // Position selectors must be done after the filter
    1524                         while ( (match = Expr.match.POS.exec( selector )) ) {
    1525                                 later += match[0];
    1526                                 selector = selector.replace( Expr.match.POS, "" );
    1527                         }
    1528 
    1529                         set = Sizzle.filter( later, Sizzle( selector, context ) );
    1530                 } else {
    1531                         set = Expr.relative[ parts[0] ] ?
    1532                                 [ context ] :
    1533                                 Sizzle( parts.shift(), context );
    1534 
    1535                         while ( parts.length ) {
    1536                                 var tmpSet = [];
    1537 
    1538                                 selector = parts.shift();
    1539                                 if ( Expr.relative[ selector ] )
    1540                                         selector += parts.shift();
    1541 
    1542                                 for ( var i = 0, l = set.length; i < l; i++ ) {
    1543                                         Sizzle( selector, set[i], tmpSet );
    1544                                 }
    1545 
    1546                                 set = tmpSet;
    1547                         }
    1548                 }
    1549         } else {
    1550                 var ret = seed ?
    1551                         { expr: parts.pop(), set: makeArray(seed) } :
    1552                         Sizzle.find( parts.pop(), parts.length === 1 && context.parentNode ? context.parentNode : context );
    1553                 set = Sizzle.filter( ret.expr, ret.set );
    1554 
    1555                 if ( parts.length > 0 ) {
    1556                         checkSet = makeArray(set);
    1557                 }
    1558 
    1559                 while ( parts.length ) {
    1560                         var cur = parts.pop(), pop = cur;
    1561 
    1562                         if ( !Expr.relative[ cur ] ) {
    1563                                 cur = "";
    1564                         } else {
    1565                                 pop = parts.pop();
    1566                         }
    1567 
    1568                         if ( pop == null ) {
    1569                                 pop = context;
    1570                         }
    1571 
    1572                         Expr.relative[ cur ]( checkSet, pop );
    1573                 }
    1574         }
    1575 
    1576         if ( !checkSet ) {
    1577                 checkSet = set;
    1578         }
    1579 
    1580         if ( !checkSet ) {
    1581                 throw "Syntax error, unrecognized expression: " + (cur || selector);
    1582         }
    1583 
    1584         if ( checkSet instanceof Array ) {
    1585                 if ( context.nodeType === 1 ) {
    1586                         for ( var i = 0; checkSet[i] != null; i++ ) {
    1587                                 if ( checkSet[i] && (checkSet[i] === true || checkSet[i].nodeType === 1 && contains(context, checkSet[i])) ) {
    1588                                         results.push( set[i] );
    1589                                 }
    1590                         }
    1591                 } else {
    1592                         for ( var i = 0; checkSet[i] != null; i++ ) {
    1593                                 if ( checkSet[i] && checkSet[i].nodeType === 1 ) {
    1594                                         results.push( set[i] );
    1595                                 }
    1596                         }
    1597                 }
    1598         } else {
    1599                 makeArray( checkSet, results );
    1600         }
    1601 
    1602         if ( extra ) {
    1603                 Sizzle( extra, context, results, seed );
    1604         }
    1605 
    1606         return results;
    1607 };
    1608 
    1609 Sizzle.matches = function(expr, set){
    1610         return Sizzle(expr, null, null, set);
    1611 };
    1612 
    1613 Sizzle.find = function(expr, context){
    1614         var set, match;
    1615 
    1616         if ( !expr ) {
    1617                 return [];
    1618         }
    1619 
    1620         for ( var i = 0, l = Expr.order.length; i < l; i++ ) {
    1621                 var type = Expr.order[i], match;
    1622                
    1623                 if ( (match = Expr.match[ type ].exec( expr )) ) {
    1624                         var left = RegExp.leftContext;
    1625 
    1626                         if ( left.substr( left.length - 1 ) !== "\\" ) {
    1627                                 match[1] = (match[1] || "").replace(/\\/g, "");
    1628                                 set = Expr.find[ type ]( match, context );
    1629                                 if ( set != null ) {
    1630                                         expr = expr.replace( Expr.match[ type ], "" );
    1631                                         break;
    1632                                 }
    1633                         }
    1634                 }
    1635         }
    1636 
    1637         if ( !set ) {
    1638                 set = context.getElementsByTagName("*");
    1639         }
    1640 
    1641         return {set: set, expr: expr};
    1642 };
    1643 
    1644 Sizzle.filter = function(expr, set, inplace){
    1645         var old = expr, result = [], curLoop = set, match, anyFound;
    1646 
    1647         while ( expr && set.length ) {
    1648                 for ( var type in Expr.filter ) {
    1649                         if ( (match = Expr.match[ type ].exec( expr )) != null ) {
    1650                                 var filter = Expr.filter[ type ], goodArray = null, goodPos = 0, found, item;
    1651                                 anyFound = false;
    1652 
    1653                                 if ( curLoop == result ) {
    1654                                         result = [];
    1655                                 }
    1656 
    1657                                 if ( Expr.preFilter[ type ] ) {
    1658                                         match = Expr.preFilter[ type ]( match, curLoop );
    1659 
    1660                                         if ( match[0] === true ) {
    1661                                                 goodArray = [];
    1662                                                 var last = null, elem;
    1663                                                 for ( var i = 0; (elem = curLoop[i]) !== undefined; i++ ) {
    1664                                                         if ( elem && last !== elem ) {
    1665                                                                 goodArray.push( elem );
    1666                                                                 last = elem;
    1667                                                         }
    1668                                                 }
    1669                                         }
    1670                                 }
    1671 
    1672                                 for ( var i = 0; (item = curLoop[i]) !== undefined; i++ ) {
    1673                                         if ( item ) {
    1674                                                 if ( goodArray && item != goodArray[goodPos] ) {
    1675                                                         goodPos++;
    1676                                                 }
    1677 
    1678                                                 found = filter( item, match, goodPos, goodArray );
    1679                                                 if ( inplace && found != null ) {
    1680                                                         curLoop[i] = found ? curLoop[i] : false;
    1681                                                         if ( found ) {
    1682                                                                 anyFound = true;
    1683                                                         }
    1684                                                 } else if ( found ) {
    1685                                                         result.push( item );
    1686                                                         anyFound = true;
    1687                                                 }
    1688                                         }
    1689                                 }
    1690 
    1691                                 if ( found !== undefined ) {
    1692                                         if ( !inplace ) {
    1693                                                 curLoop = result;
    1694                                         }
    1695 
    1696                                         expr = expr.replace( Expr.match[ type ], "" );
    1697 
    1698                                         if ( !anyFound ) {
    1699                                                 return [];
    1700                                         }
    1701 
    1702                                         break;
    1703                                 }
    1704                         }
    1705                 }
    1706 
    1707                 expr = expr.replace(/\s*,\s*/, "");
    1708 
    1709                 // Improper expression
    1710                 if ( expr == old ) {
    1711                         if ( anyFound == null ) {
    1712                                 throw "Syntax error, unrecognized expression: " + expr;
    1713                         } else {
    1714                                 break;
    1715                         }
    1716                 }
    1717 
    1718                 old = expr;
    1719         }
    1720 
    1721         return curLoop;
    1722 };
    1723 
    1724 var Expr = Sizzle.selectors = {
    1725         order: [ "ID", "NAME", "TAG" ],
    1726         match: {
    1727                 ID: /#((?:[\w\u0128-\uFFFF_-]|\\.)+)/,
    1728                 CLASS: /\.((?:[\w\u0128-\uFFFF_-]|\\.)+)/,
    1729                 NAME: /\[name=['"]*((?:[\w\u0128-\uFFFF_-]|\\.)+)['"]*\]/,
    1730                 ATTR: /\[((?:[\w\u0128-\uFFFF_-]|\\.)+)\s*(?:(\S?=)\s*(['"]*)(.*?)\3|)\]/,
    1731                 TAG: /^((?:[\w\u0128-\uFFFF\*_-]|\\.)+)/,
    1732                 CHILD: /:(only|nth|last|first)-child\(?(even|odd|[\dn+-]*)\)?/,
    1733                 POS: /:(nth|eq|gt|lt|first|last|even|odd)\(?(\d*)\)?(?:[^-]|$)/,
    1734                 PSEUDO: /:((?:[\w\u0128-\uFFFF_-]|\\.)+)(?:\((['"]*)((?:\([^\)]+\)|[^\2\(\)]*)+)\2\))?/
    1735         },
    1736         attrMap: {
    1737                 "class": "className"
    1738         },
    1739         relative: {
    1740                 "+": function(checkSet, part){
    1741                         for ( var i = 0, l = checkSet.length; i < l; i++ ) {
    1742                                 var elem = checkSet[i];
    1743                                 if ( elem ) {
    1744                                         var cur = elem.previousSibling;
    1745                                         while ( cur && cur.nodeType !== 1 ) {
    1746                                                 cur = cur.previousSibling;
    1747                                         }
    1748                                         checkSet[i] = typeof part === "string" ?
    1749                                                 cur || false :
    1750                                                 cur === part;
    1751                                 }
    1752                         }
    1753 
    1754                         if ( typeof part === "string" ) {
    1755                                 Sizzle.filter( part, checkSet, true );
    1756                         }
    1757                 },
    1758                 ">": function(checkSet, part){
    1759                         if ( typeof part === "string" && !/\W/.test(part) ) {
    1760                                 part = part.toUpperCase();
    1761 
    1762                                 for ( var i = 0, l = checkSet.length; i < l; i++ ) {
    1763                                         var elem = checkSet[i];
    1764                                         if ( elem ) {
    1765                                                 var parent = elem.parentNode;
    1766                                                 checkSet[i] = parent.nodeName === part ? parent : false;
    1767                                         }
    1768                                 }
    1769                         } else {
    1770                                 for ( var i = 0, l = checkSet.length; i < l; i++ ) {
    1771                                         var elem = checkSet[i];
    1772                                         if ( elem ) {
    1773                                                 checkSet[i] = typeof part === "string" ?
    1774                                                         elem.parentNode :
    1775                                                         elem.parentNode === part;
    1776                                         }
    1777                                 }
    1778 
    1779                                 if ( typeof part === "string" ) {
    1780                                         Sizzle.filter( part, checkSet, true );
    1781                                 }
    1782                         }
    1783                 },
    1784                 "": function(checkSet, part){
    1785                         var doneName = "done" + (done++), checkFn = dirCheck;
    1786 
    1787                         if ( !part.match(/\W/) ) {
    1788                                 var nodeCheck = part = part.toUpperCase();
    1789                                 checkFn = dirNodeCheck;
    1790                         }
    1791 
    1792                         checkFn("parentNode", part, doneName, checkSet, nodeCheck);
    1793                 },
    1794                 "~": function(checkSet, part){
    1795                         var doneName = "done" + (done++), checkFn = dirCheck;
    1796 
    1797                         if ( typeof part === "string" && !part.match(/\W/) ) {
    1798                                 var nodeCheck = part = part.toUpperCase();
    1799                                 checkFn = dirNodeCheck;
    1800                         }
    1801 
    1802                         checkFn("previousSibling", part, doneName, checkSet, nodeCheck);
    1803                 }
    1804         },
    1805         find: {
    1806                 ID: function(match, context){
    1807                         if ( context.getElementById ) {
    1808                                 var m = context.getElementById(match[1]);
    1809                                 return m ? [m] : [];
    1810                         }
    1811                 },
    1812                 NAME: function(match, context){
    1813                         return context.getElementsByName ? context.getElementsByName(match[1]) : null;
    1814                 },
    1815                 TAG: function(match, context){
    1816                         return context.getElementsByTagName(match[1]);
    1817                 }
    1818         },
    1819         preFilter: {
    1820                 CLASS: function(match){
    1821                         return new RegExp( "(?:^|\\s)" + match[1] + "(?:\\s|$)" );
    1822                 },
    1823                 ID: function(match){
    1824                         return match[1];
    1825                 },
    1826                 TAG: function(match){
    1827                         return match[1].toUpperCase();
    1828                 },
    1829                 CHILD: function(match){
    1830                         if ( match[1] == "nth" ) {
    1831                                 // parse equations like 'even', 'odd', '5', '2n', '3n+2', '4n-1', '-n+6'
    1832                                 var test = /(-?)(\d*)n((?:\+|-)?\d*)/.exec(
    1833                                         match[2] == "even" && "2n" || match[2] == "odd" && "2n+1" ||
    1834                                         !/\D/.test( match[2] ) && "0n+" + match[2] || match[2]);
    1835 
    1836                                 // calculate the numbers (first)n+(last) including if they are negative
    1837                                 match[2] = (test[1] + (test[2] || 1)) - 0;
    1838                                 match[3] = test[3] - 0;
    1839                         }
    1840 
    1841                         // TODO: Move to normal caching system
    1842                         match[0] = "done" + (done++);
    1843 
    1844                         return match;
    1845                 },
    1846                 ATTR: function(match){
    1847                         var name = match[1];
    1848                        
    1849                         if ( Expr.attrMap[name] ) {
    1850                                 match[1] = Expr.attrMap[name];
    1851                         }
    1852 
    1853                         if ( match[2] === "~=" ) {
    1854                                 match[4] = " " + match[4] + " ";
    1855                         }
    1856 
    1857                         return match;
    1858                 },
    1859                 PSEUDO: function(match, curLoop){
    1860                         if ( match[1] === "not" ) {
    1861                                 // If we're dealing with a complex expression, or a simple one
    1862                                 match[3] = match[3].match(chunker).length > 1 ?
    1863                                         Sizzle(match[3], null, null, curLoop) :
    1864                                         Sizzle.filter(match[3], curLoop);
    1865                         }
    1866                        
    1867                         return match;
    1868                 },
    1869                 POS: function(match){
    1870                         match.unshift( true );
    1871                         return match;
    1872                 }
    1873         },
    1874         filters: {
    1875                 enabled: function(elem){
    1876                         return elem.disabled === false && elem.type !== "hidden";
    1877                 },
    1878                 disabled: function(elem){
    1879                         return elem.disabled === true;
    1880                 },
    1881                 checked: function(elem){
    1882                         return elem.checked === true;
    1883                 },
    1884                 selected: function(elem){
    1885                         // Accessing this property makes selected-by-default
    1886                         // options in Safari work properly
    1887                         elem.parentNode.selectedIndex;
    1888                         return elem.selected === true;
    1889                 },
    1890                 parent: function(elem){
    1891                         return !!elem.firstChild;
    1892                 },
    1893                 empty: function(elem){
    1894                         return !elem.firstChild;
    1895                 },
    1896                 has: function(elem, i, match){
    1897                         return !!Sizzle( match[3], elem ).length;
    1898                 },
    1899                 header: function(elem){
    1900                         return /h\d/i.test( elem.nodeName );
    1901                 },
    1902                 text: function(elem){
    1903                         return "text" === elem.type;
    1904                 },
    1905                 radio: function(elem){
    1906                         return "radio" === elem.type;
    1907                 },
    1908                 checkbox: function(elem){
    1909                         return "checkbox" === elem.type;
    1910                 },
    1911                 file: function(elem){
    1912                         return "file" === elem.type;
    1913                 },
    1914                 password: function(elem){
    1915                         return "password" === elem.type;
    1916                 },
    1917                 submit: function(elem){
    1918                         return "submit" === elem.type;
    1919                 },
    1920                 image: function(elem){
    1921                         return "image" === elem.type;
    1922                 },
    1923                 reset: function(elem){
    1924                         return "reset" === elem.type;
    1925                 },
    1926                 button: function(elem){
    1927                         return "button" === elem.type || elem.nodeName.toUpperCase() === "BUTTON";
    1928                 },
    1929                 input: function(elem){
    1930                         return /input|select|textarea|button/i.test(elem.nodeName);
    1931                 }
    1932         },
    1933         setFilters: {
    1934                 first: function(elem, i){
    1935                         return i === 0;
    1936                 },
    1937                 last: function(elem, i, match, array){
    1938                         return i === array.length - 1;
    1939                 },
    1940                 even: function(elem, i){
    1941                         return i % 2 === 0;
    1942                 },
    1943                 odd: function(elem, i){
    1944                         return i % 2 === 1;
    1945                 },
    1946                 lt: function(elem, i, match){
    1947                         return i < match[3] - 0;
    1948                 },
    1949                 gt: function(elem, i, match){
    1950                         return i > match[3] - 0;
    1951                 },
    1952                 nth: function(elem, i, match){
    1953                         return match[3] - 0 == i;
    1954                 },
    1955                 eq: function(elem, i, match){
    1956                         return match[3] - 0 == i;
    1957                 }
    1958         },
    1959         filter: {
    1960                 CHILD: function(elem, match){
    1961                         var type = match[1], parent = elem.parentNode;
    1962 
    1963                         var doneName = match[0];
    1964                        
    1965                         if ( parent && !parent[ doneName ] ) {
    1966                                 var count = 1;
    1967 
    1968                                 for ( var node = parent.firstChild; node; node = node.nextSibling ) {
    1969                                         if ( node.nodeType == 1 ) {
    1970                                                 node.nodeIndex = count++;
    1971                                         }
    1972                                 }
    1973 
    1974                                 parent[ doneName ] = count - 1;
    1975                         }
    1976 
    1977                         if ( type == "first" ) {
    1978                                 return elem.nodeIndex == 1;
    1979                         } else if ( type == "last" ) {
    1980                                 return elem.nodeIndex == parent[ doneName ];
    1981                         } else if ( type == "only" ) {
    1982                                 return parent[ doneName ] == 1;
    1983                         } else if ( type == "nth" ) {
    1984                                 var add = false, first = match[2], last = match[3];
    1985 
    1986                                 if ( first == 1 && last == 0 ) {
    1987                                         return true;
    1988                                 }
    1989 
    1990                                 if ( first == 0 ) {
    1991                                         if ( elem.nodeIndex == last ) {
    1992                                                 add = true;
    1993                                         }
    1994                                 } else if ( (elem.nodeIndex - last) % first == 0 && (elem.nodeIndex - last) / first >= 0 ) {
    1995                                         add = true;
    1996                                 }
    1997 
    1998                                 return add;
    1999                         }
    2000                 },
    2001                 PSEUDO: function(elem, match, i, array){
    2002                         var name = match[1], filter = Expr.filters[ name ];
    2003 
    2004                         if ( filter ) {
    2005                                 return filter( elem, i, match, array );
    2006                         } else if ( name === "contains" ) {
    2007                                 return (elem.textContent || elem.innerText || "").indexOf(match[3]) >= 0;
    2008                         } else if ( name === "not" ) {
    2009                                 var not = match[3];
    2010 
    2011                                 for ( var i = 0, l = not.length; i < l; i++ ) {
    2012                                         if ( not[i] === elem ) {
    2013                                                 return false;
    2014                                         }
    2015                                 }
    2016 
    2017                                 return true;
    2018                         }
    2019                 },
    2020                 ID: function(elem, match){
    2021                         return elem.nodeType === 1 && elem.getAttribute("id") === match;
    2022                 },
    2023                 TAG: function(elem, match){
    2024                         return (match === "*" && elem.nodeType === 1) || elem.nodeName === match;
    2025                 },
    2026                 CLASS: function(elem, match){
    2027                         return match.test( elem.className );
    2028                 },
    2029                 ATTR: function(elem, match){
    2030                         var result = elem[ match[1] ] || elem.getAttribute( match[1] ), value = result + "", type = match[2], check = match[4];
    2031                         return result == null ?
    2032                                 false :
    2033                                 type === "=" ?
    2034                                 value === check :
    2035                                 type === "*=" ?
    2036                                 value.indexOf(check) >= 0 :
    2037                                 type === "~=" ?
    2038                                 (" " + value + " ").indexOf(check) >= 0 :
    2039                                 !match[4] ?
    2040                                 result :
    2041                                 type === "!=" ?
    2042                                 value != check :
    2043                                 type === "^=" ?
    2044                                 value.indexOf(check) === 0 :
    2045                                 type === "$=" ?
    2046                                 value.substr(value.length - check.length) === check :
    2047                                 type === "|=" ?
    2048                                 value === check || value.substr(0, check.length + 1) === check + "-" :
    2049                                 false;
    2050                 },
    2051                 POS: function(elem, match, i, array){
    2052                         var name = match[2], filter = Expr.setFilters[ name ];
    2053 
    2054                         if ( filter ) {
    2055                                 return filter( elem, i, match, array );
    2056                         }
    2057                 }
    2058         }
    2059 };
    2060 
    2061 for ( var type in Expr.match ) {
    2062         Expr.match[ type ] = RegExp( Expr.match[ type ].source + /(?![^\[]*\])(?![^\(]*\))/.source );
    2063 }
    2064 
    2065 var makeArray = function(array, results) {
    2066         array = Array.prototype.slice.call( array );
    2067 
    2068         if ( results ) {
    2069                 results.push.apply( results, array );
    2070                 return results;
    2071         }
    2072        
    2073         return array;
    2074 };
    2075 
    2076 // Perform a simple check to determine if the browser is capable of
    2077 // converting a NodeList to an array using builtin methods.
    2078 try {
    2079         Array.prototype.slice.call( document.documentElement.childNodes );
    2080 
    2081 // Provide a fallback method if it does not work
    2082 } catch(e){
    2083         makeArray = function(array, results) {
    2084                 var ret = results || [];
    2085 
    2086                 if ( array instanceof Array ) {
    2087                         Array.prototype.push.apply( ret, array );
    2088                 } else {
    2089                         if ( typeof array.length === "number" ) {
    2090                                 for ( var i = 0, l = array.length; i < l; i++ ) {
    2091                                         ret.push( array[i] );
    2092                                 }
    2093                         } else {
    2094                                 for ( var i = 0; array[i]; i++ ) {
    2095                                         ret.push( array[i] );
    2096                                 }
    2097                         }
    2098                 }
    2099 
    2100                 return ret;
    2101         };
    2102 }
    2103 
    2104 // Check to see if the browser returns elements by name when
    2105 // querying by getElementById (and provide a workaround)
    2106 (function(){
    2107         // We're going to inject a fake input element with a specified name
    2108         var form = document.createElement("form"),
    2109                 id = "script" + (new Date).getTime();
    2110         form.innerHTML = "<input name='" + id + "'/>";
    2111 
    2112         // Inject it into the root element, check its status, and remove it quickly
    2113         var root = document.documentElement;
    2114         root.insertBefore( form, root.firstChild );
    2115 
    2116         // The workaround has to do additional checks after a getElementById
    2117         // Which slows things down for other browsers (hence the branching)
    2118         if ( !!document.getElementById( id ) ) {
    2119                 Expr.find.ID = function(match, context){
    2120                         if ( context.getElementById ) {
    2121                                 var m = context.getElementById(match[1]);
    2122                                 return m ? m.id === match[1] || m.getAttributeNode && m.getAttributeNode("id").nodeValue === match[1] ? [m] : undefined : [];
    2123                         }
    2124                 };
    2125 
    2126                 Expr.filter.ID = function(elem, match){
    2127                         var node = elem.getAttributeNode && elem.getAttributeNode("id");
    2128                         return elem.nodeType === 1 && node && node.nodeValue === match;
    2129                 };
    2130         }
    2131 
    2132         root.removeChild( form );
    2133 })();
    2134 
    2135 // Check to see if the browser returns only elements
    2136 // when doing getElementsByTagName("*")
    2137 (function(){
    2138         // Create a fake element
    2139         var div = document.createElement("div");
    2140         div.appendChild( document.createComment("") );
    2141 
    2142         // Make sure no comments are found
    2143         if ( div.getElementsByTagName("*").length > 0 ) {
    2144                 Expr.find.TAG = function(match, context){
    2145                         var results = context.getElementsByTagName(match[1]);
    2146 
    2147                         // Filter out possible comments
    2148                         if ( match[1] === "*" ) {
    2149                                 var tmp = [];
    2150 
    2151                                 for ( var i = 0; results[i]; i++ ) {
    2152                                         if ( results[i].nodeType === 1 ) {
    2153                                                 tmp.push( results[i] );
    2154                                         }
    2155                                 }
    2156 
    2157                                 results = tmp;
    2158                         }
    2159 
    2160                         return results;
    2161                 };
    2162         }
    2163 })();
    2164 
    2165 if ( document.querySelectorAll ) (function(){
    2166         var oldSizzle = Sizzle;
    2167        
    2168         Sizzle = function(query, context, extra, seed){
    2169                 context = context || document;
    2170 
    2171                 if ( !seed && context.nodeType === 9 ) {
    2172                         try {
    2173                                 return makeArray( context.querySelectorAll(query) );
    2174                         } catch(e){}
    2175                 }
    2176                
    2177                 return oldSizzle(query, context, extra, seed);
    2178         };
    2179 
    2180         Sizzle.find = oldSizzle.find;
    2181         Sizzle.filter = oldSizzle.filter;
    2182         Sizzle.selectors = oldSizzle.selectors;
    2183         Sizzle.matches = oldSizzle.matches;
    2184 })();
    2185 
    2186 if ( document.documentElement.getElementsByClassName ) {
    2187         Expr.order.splice(1, 0, "CLASS");
    2188         Expr.find.CLASS = function(match, context) {
    2189                 return context.getElementsByClassName(match[1]);
    2190         };
    2191 }
    2192 
    2193 function dirNodeCheck( dir, cur, doneName, checkSet, nodeCheck ) {
    2194         for ( var i = 0, l = checkSet.length; i < l; i++ ) {
    2195                 var elem = checkSet[i];
    2196                 if ( elem ) {
    2197                         elem = elem[dir];
    2198                         var match = false;
    2199 
    2200                         while ( elem && elem.nodeType ) {
    2201                                 var done = elem[doneName];
    2202                                 if ( done ) {
    2203                                         match = checkSet[ done ];
    2204                                         break;
    2205                                 }
    2206 
    2207                                 if ( elem.nodeType === 1 )
    2208                                         elem[doneName] = i;
    2209 
    2210                                 if ( elem.nodeName === cur ) {
    2211                                         match = elem;
    2212                                         break;
    2213                                 }
    2214 
    2215                                 elem = elem[dir];
    2216                         }
    2217 
    2218                         checkSet[i] = match;
    2219                 }
    2220         }
    2221 }
    2222 
    2223 function dirCheck( dir, cur, doneName, checkSet, nodeCheck ) {
    2224         for ( var i = 0, l = checkSet.length; i < l; i++ ) {
    2225                 var elem = checkSet[i];
    2226                 if ( elem ) {
    2227                         elem = elem[dir];
    2228                         var match = false;
    2229 
    2230                         while ( elem && elem.nodeType ) {
    2231                                 if ( elem[doneName] ) {
    2232                                         match = checkSet[ elem[doneName] ];
    2233                                         break;
    2234                                 }
    2235 
    2236                                 if ( elem.nodeType === 1 ) {
    2237                                         elem[doneName] = i;
    2238 
    2239                                         if ( typeof cur !== "string" ) {
    2240                                                 if ( elem === cur ) {
    2241                                                         match = true;
    2242                                                         break;
    2243                                                 }
    2244 
    2245                                         } else if ( Sizzle.filter( cur, [elem] ).length > 0 ) {
    2246                                                 match = elem;
    2247                                                 break;
    2248                                         }
    2249                                 }
    2250 
    2251                                 elem = elem[dir];
    2252                         }
    2253 
    2254                         checkSet[i] = match;
    2255                 }
    2256         }
    2257 }
    2258 
    2259 var contains = document.compareDocumentPosition ?  function(a, b){
    2260         return a.compareDocumentPosition(b) & 16;
    2261 } : function(a, b){
    2262         return a !== b && (a.contains ? a.contains(b) : true);
    2263 };
    2264 
    2265 // EXPOSE
    2266 jQuery.find = Sizzle;
    2267 jQuery.filter = Sizzle.filter;
    2268 jQuery.expr = Sizzle.selectors;
    2269 jQuery.expr[":"] = jQuery.expr.filters;
    2270 
    2271 Sizzle.selectors.filters.hidden = function(elem){
    2272         return "hidden" === elem.type ||
    2273                 jQuery.css(elem, "display") === "none" ||
    2274                 jQuery.css(elem, "visibility") === "hidden";
    2275 };
    2276 
    2277 Sizzle.selectors.filters.visible = function(elem){
    2278         return "hidden" !== elem.type &&
    2279                 jQuery.css(elem, "display") !== "none" &&
    2280                 jQuery.css(elem, "visibility") !== "hidden";
    2281 };
    2282 
    2283 Sizzle.selectors.filters.animated = function(elem){
    2284         return jQuery.grep(jQuery.timers, function(fn){
    2285                 return elem === fn.elem;
    2286         }).length;
    2287 };
    2288 
    2289 jQuery.multiFilter = function( expr, elems, not ) {
    2290         if ( not ) {
    2291                 expr = ":not(" + expr + ")";
    2292         }
    2293 
    2294         return Sizzle.matches(expr, elems);
    2295 };
    2296 
    2297 jQuery.dir = function( elem, dir ){
    2298         var matched = [], cur = elem[dir];
    2299         while ( cur && cur != document ) {
    2300                 if ( cur.nodeType == 1 )
    2301                         matched.push( cur );
    2302                 cur = cur[dir];
    2303         }
    2304         return matched;
    2305 };
    2306 
    2307 jQuery.nth = function(cur, result, dir, elem){
    2308         result = result || 1;
    2309         var num = 0;
    2310 
    2311         for ( ; cur; cur = cur[dir] )
    2312                 if ( cur.nodeType == 1 && ++num == result )
    2313                         break;
    2314 
    2315         return cur;
    2316 };
    2317 
    2318 jQuery.sibling = function(n, elem){
    2319         var r = [];
    2320 
    2321         for ( ; n; n = n.nextSibling ) {
    2322                 if ( n.nodeType == 1 && n != elem )
    2323                         r.push( n );
    2324         }
    2325 
    2326         return r;
    2327 };
    2328 
    2329 return;
    2330 
    2331 window.Sizzle = Sizzle;
    2332 
    2333 })();
    2334 /*
    2335  * A number of helper functions used for managing events.
    2336  * Many of the ideas behind this code originated from
    2337  * Dean Edwards' addEvent library.
    2338  */
    2339 jQuery.event = {
    2340 
    2341         // Bind an event to an element
    2342         // Original by Dean Edwards
    2343         add: function(elem, types, handler, data) {
    2344                 if ( elem.nodeType == 3 || elem.nodeType == 8 )
    2345                         return;
    2346 
    2347                 // For whatever reason, IE has trouble passing the window object
    2348                 // around, causing it to be cloned in the process
    2349                 if ( elem.setInterval && elem != window )
    2350                         elem = window;
    2351 
    2352                 // Make sure that the function being executed has a unique ID
    2353                 if ( !handler.guid )
    2354                         handler.guid = this.guid++;
    2355 
    2356                 // if data is passed, bind to handler
    2357                 if ( data !== undefined ) {
    2358                         // Create temporary function pointer to original handler
    2359                         var fn = handler;
    2360 
    2361                         // Create unique handler function, wrapped around original handler
    2362                         handler = this.proxy( fn, function() {
    2363                                 // Pass arguments and context to original handler
    2364                                 return fn.apply(this, arguments);
    2365                         });
    2366 
    2367                         // Store data in unique handler
    2368                         handler.data = data;
    2369                 }
    2370 
    2371                 // Init the element's event structure
    2372                 var events = jQuery.data(elem, "events") || jQuery.data(elem, "events", {}),
    2373                         handle = jQuery.data(elem, "handle") || jQuery.data(elem, "handle", function(){
    2374                                 // Handle the second event of a trigger and when
    2375                                 // an event is called after a page has unloaded
    2376                                 return typeof jQuery !== "undefined" && !jQuery.event.triggered ?
    2377                                         jQuery.event.handle.apply(arguments.callee.elem, arguments) :
    2378                                         undefined;
    2379                         });
    2380                 // Add elem as a property of the handle function
    2381                 // This is to prevent a memory leak with non-native
    2382                 // event in IE.
    2383                 handle.elem = elem;
    2384 
    2385                 // Handle multiple events separated by a space
    2386                 // jQuery(...).bind("mouseover mouseout", fn);
    2387                 jQuery.each(types.split(/\s+/), function(index, type) {
    2388                         // Namespaced event handlers
    2389                         var namespaces = type.split(".");
    2390                         type = namespaces.shift();
    2391                         handler.type = namespaces.slice().sort().join(".");
    2392 
    2393                         // Get the current list of functions bound to this event
    2394                         var handlers = events[type];
    2395                        
    2396                         if ( jQuery.event.specialAll[type] )
    2397                                 jQuery.event.specialAll[type].setup.call(elem, data, namespaces);
    2398 
    2399                         // Init the event handler queue
    2400                         if (!handlers) {
    2401                                 handlers = events[type] = {};
    2402 
    2403                                 // Check for a special event handler
    2404                                 // Only use addEventListener/attachEvent if the special
    2405                                 // events handler returns false
    2406                                 if ( !jQuery.event.special[type] || jQuery.event.special[type].setup.call(elem, data, namespaces) === false ) {
    2407                                         // Bind the global event handler to the element
    2408                                         if (elem.addEventListener)
    2409                                                 elem.addEventListener(type, handle, false);
    2410                                         else if (elem.attachEvent)
    2411                                                 elem.attachEvent("on" + type, handle);
    2412                                 }
    2413                         }
    2414 
    2415                         // Add the function to the element's handler list
    2416                         handlers[handler.guid] = handler;
    2417 
    2418                         // Keep track of which events have been used, for global triggering
    2419                         jQuery.event.global[type] = true;
    2420                 });
    2421 
    2422                 // Nullify elem to prevent memory leaks in IE
    2423                 elem = null;
    2424         },
    2425 
    2426         guid: 1,
    2427         global: {},
    2428 
    2429         // Detach an event or set of events from an element
    2430         remove: function(elem, types, handler) {
    2431                 // don't do events on text and comment nodes
    2432                 if ( elem.nodeType == 3 || elem.nodeType == 8 )
    2433                         return;
    2434 
    2435                 var events = jQuery.data(elem, "events"), ret, index;
    2436 
    2437                 if ( events ) {
    2438                         // Unbind all events for the element
    2439                         if ( types === undefined || (typeof types === "string" && types.charAt(0) == ".") )
    2440                                 for ( var type in events )
    2441                                         this.remove( elem, type + (types || "") );
    2442                         else {
    2443                                 // types is actually an event object here
    2444                                 if ( types.type ) {
    2445                                         handler = types.handler;
    2446                                         types = types.type;
    2447                                 }
    2448 
    2449                                 // Handle multiple events seperated by a space
    2450                                 // jQuery(...).unbind("mouseover mouseout", fn);
    2451                                 jQuery.each(types.split(/\s+/), function(index, type){
    2452                                         // Namespaced event handlers
    2453                                         var namespaces = type.split(".");
    2454                                         type = namespaces.shift();
    2455                                         var namespace = RegExp("(^|\\.)" + namespaces.slice().sort().join(".*\\.") + "(\\.|$)");
    2456 
    2457                                         if ( events[type] ) {
    2458                                                 // remove the given handler for the given type
    2459                                                 if ( handler )
    2460                                                         delete events[type][handler.guid];
    2461 
    2462                                                 // remove all handlers for the given type
    2463                                                 else
    2464                                                         for ( handler in events[type] )
    2465                                                                 // Handle the removal of namespaced events
    2466                                                                 if ( namespace.test(events[type][handler].type) )
    2467 
    2468                                                                         delete events[type][handler];
    2469                                                                        
    2470                                                 if ( jQuery.event.specialAll[type] )
    2471                                                         jQuery.event.specialAll[type].teardown.call(elem, namespaces);
    2472 
    2473                                                 // remove generic event handler if no more handlers exist
    2474                                                 for ( ret in events[type] ) break;
    2475                                                 if ( !ret ) {
    2476                                                         if ( !jQuery.event.special[type] || jQuery.event.special[type].teardown.call(elem, namespaces) === false ) {
    2477                                                                 if (elem.removeEventListener)
    2478                                                                         elem.removeEventListener(type, jQuery.data(elem, "handle"), false);
    2479                                                                 else if (elem.detachEvent)
    2480                                                                         elem.detachEvent("on" + type, jQuery.data(elem, "handle"));
    2481                                                         }
    2482                                                         ret = null;
    2483                                                         delete events[type];
    2484                                                 }
    2485                                         }
    2486                                 });
    2487                         }
    2488 
    2489                         // Remove the expando if it's no longer used
    2490                         for ( ret in events ) break;
    2491                         if ( !ret ) {
    2492                                 var handle = jQuery.data( elem, "handle" );
    2493                                 if ( handle ) handle.elem = null;
    2494                                 jQuery.removeData( elem, "events" );
    2495                                 jQuery.removeData( elem, "handle" );
    2496                         }
    2497                 }
    2498         },
    2499 
    2500         // bubbling is internal
    2501         trigger: function( event, data, elem, bubbling ) {
    2502                 // Event object or event type
    2503                 var type = event.type || event;
    2504 
    2505                 if( !bubbling ){
    2506                         event = typeof event === "object" ?
    2507                                 // jQuery.Event object
    2508                                 event[expando] ? event :
    2509                                 // Object literal
    2510                                 jQuery.extend( jQuery.Event(type), event ) :
    2511                                 // Just the event type (string)
    2512                                 jQuery.Event(type);
    2513 
    2514                         if ( type.indexOf("!") >= 0 ) {
    2515                                 event.type = type = type.slice(0, -1);
    2516                                 event.exclusive = true;
    2517                         }
    2518 
    2519                         // Handle a global trigger
    2520                         if ( !elem ) {
    2521                                 // Don't bubble custom events when global (to avoid too much overhead)
    2522                                 event.stopPropagation();
    2523                                 // Only trigger if we've ever bound an event for it
    2524                                 if ( this.global[type] )
    2525                                         jQuery.each( jQuery.cache, function(){
    2526                                                 if ( this.events && this.events[type] )
    2527                                                         jQuery.event.trigger( event, data, this.handle.elem );
    2528                                         });
    2529                         }
    2530 
    2531                         // Handle triggering a single element
    2532 
    2533                         // don't do events on text and comment nodes
    2534                         if ( !elem || elem.nodeType == 3 || elem.nodeType == 8 )
    2535                                 return undefined;
    2536                        
    2537                         // Clean up in case it is reused
    2538                         event.result = undefined;
    2539                         event.target = elem;
    2540                        
    2541                         // Clone the incoming data, if any
    2542                         data = jQuery.makeArray(data);
    2543                         data.unshift( event );
    2544                 }
    2545 
    2546                 event.currentTarget = elem;
    2547 
    2548                 // Trigger the event, it is assumed that "handle" is a function
    2549                 var handle = jQuery.data(elem, "handle");
    2550                 if ( handle )
    2551                         handle.apply( elem, data );
    2552 
    2553                 // Handle triggering native .onfoo handlers (and on links since we don't call .click() for links)
    2554                 if ( (!elem[type] || (jQuery.nodeName(elem, 'a') && type == "click")) && elem["on"+type] && elem["on"+type].apply( elem, data ) === false )
    2555                         event.result = false;
    2556 
    2557                 // Trigger the native events (except for clicks on links)
    2558                 if ( !bubbling && elem[type] && !event.isDefaultPrevented() && !(jQuery.nodeName(elem, 'a') && type == "click") ) {
    2559                         this.triggered = true;
    2560                         try {
    2561                                 elem[ type ]();
    2562                         // prevent IE from throwing an error for some hidden elements
    2563                         } catch (e) {}
    2564                 }
    2565 
    2566                 this.triggered = false;
    2567 
    2568                 if ( !event.isPropagationStopped() ) {
    2569                         var parent = elem.parentNode || elem.ownerDocument;
    2570                         if ( parent )
    2571                                 jQuery.event.trigger(event, data, parent, true);
    2572                 }
    2573         },
    2574 
    2575         handle: function(event) {
    2576                 // returned undefined or false
    2577                 var all, handlers;
    2578 
    2579                 event = arguments[0] = jQuery.event.fix( event || window.event );
    2580 
    2581                 // Namespaced event handlers
    2582                 var namespaces = event.type.split(".");
    2583                 event.type = namespaces.shift();
    2584 
    2585                 // Cache this now, all = true means, any handler
    2586                 all = !namespaces.length && !event.exclusive;
    2587                
    2588                 var namespace = RegExp("(^|\\.)" + namespaces.slice().sort().join(".*\\.") + "(\\.|$)");
    2589 
    2590                 handlers = ( jQuery.data(this, "events") || {} )[event.type];
    2591 
    2592                 for ( var j in handlers ) {
    2593                         var handler = handlers[j];
    2594 
    2595                         // Filter the functions by class
    2596                         if ( all || namespace.test(handler.type) ) {
    2597                                 // Pass in a reference to the handler function itself
    2598                                 // So that we can later remove it
    2599                                 event.handler = handler;
    2600                                 event.data = handler.data;
    2601 
    2602                                 var ret = handler.apply(this, arguments);
    2603 
    2604                                 if( ret !== undefined ){
    2605                                         event.result = ret;
    2606                                         if ( ret === false ) {
    2607                                                 event.preventDefault();
    2608                                                 event.stopPropagation();
    2609                                         }
    2610                                 }
    2611 
    2612                                 if( event.isImmediatePropagationStopped() )
    2613                                         break;
    2614 
    2615                         }
    2616                 }
    2617         },
    2618 
    2619         props: "altKey attrChange attrName bubbles button cancelable charCode clientX clientY ctrlKey currentTarget data detail eventPhase fromElement handler keyCode metaKey newValue originalTarget pageX pageY prevValue relatedNode relatedTarget screenX screenY shiftKey srcElement target toElement view wheelDelta which".split(" "),
    2620 
    2621         fix: function(event) {
    2622                 if ( event[expando] )
    2623                         return event;
    2624 
    2625                 // store a copy of the original event object
    2626                 // and "clone" to set read-only properties
    2627                 var originalEvent = event;
    2628                 event = jQuery.Event( originalEvent );
    2629 
    2630                 for ( var i = this.props.length, prop; i; ){
    2631                         prop = this.props[ --i ];
    2632                         event[ prop ] = originalEvent[ prop ];
    2633                 }
    2634 
    2635                 // Fix target property, if necessary
    2636                 if ( !event.target )
    2637                         event.target = event.srcElement || document; // Fixes #1925 where srcElement might not be defined either
    2638 
    2639                 // check if target is a textnode (safari)
    2640                 if ( event.target.nodeType == 3 )
    2641                         event.target = event.target.parentNode;
    2642 
    2643                 // Add relatedTarget, if necessary
    2644                 if ( !event.relatedTarget && event.fromElement )
    2645                         event.relatedTarget = event.fromElement == event.target ? event.toElement : event.fromElement;
    2646 
    2647                 // Calculate pageX/Y if missing and clientX/Y available
    2648                 if ( event.pageX == null && event.clientX != null ) {
    2649                         var doc = document.documentElement, body = document.body;
    2650                         event.pageX = event.clientX + (doc && doc.scrollLeft || body && body.scrollLeft || 0) - (doc.clientLeft || 0);
    2651                         event.pageY = event.clientY + (doc && doc.scrollTop || body && body.scrollTop || 0) - (doc.clientTop || 0);
    2652                 }
    2653 
    2654                 // Add which for key events
    2655                 if ( !event.which && ((event.charCode || event.charCode === 0) ? event.charCode : event.keyCode) )
    2656                         event.which = event.charCode || event.keyCode;
    2657 
    2658                 // Add metaKey to non-Mac browsers (use ctrl for PC's and Meta for Macs)
    2659                 if ( !event.metaKey && event.ctrlKey )
    2660                         event.metaKey = event.ctrlKey;
    2661 
    2662                 // Add which for click: 1 == left; 2 == middle; 3 == right
    2663                 // Note: button is not normalized, so don't use it
    2664                 if ( !event.which && event.button )
    2665                         event.which = (event.button & 1 ? 1 : ( event.button & 2 ? 3 : ( event.button & 4 ? 2 : 0 ) ));
    2666 
    2667                 return event;
    2668         },
    2669 
    2670         proxy: function( fn, proxy ){
    2671                 // Set the guid of unique handler to the same of original handler, so it can be removed
    2672                 proxy.guid = fn.guid = fn.guid || proxy.guid || this.guid++;
    2673                 // So proxy can be declared as an argument
    2674                 return proxy;
    2675         },
    2676 
    2677         special: {
    2678                 ready: {
    2679                         // Make sure the ready event is setup
    2680                         setup: bindReady,
    2681                         teardown: function() {}
    2682                 }
    2683         },
    2684        
    2685         specialAll: {
    2686                 live: {
    2687                         setup: function( selector, namespaces ){
    2688                                 jQuery.event.add( this, namespaces[0], liveHandler );
    2689                         },
    2690                         teardown:  function( namespaces ){
    2691                                 if ( namespaces.length ) {
    2692                                         var remove = 0, name = RegExp("(^|\\.)" + namespaces[0] + "(\\.|$)");
    2693                                        
    2694                                         jQuery.each( (jQuery.data(this, "events").live || {}), function(){
    2695                                                 if ( name.test(this.type) )
    2696                                                         remove++;
    2697                                         });
    2698                                        
    2699                                         if ( remove <= 1 )
    2700                                                 jQuery.event.remove( this, namespaces[0], liveHandler );
    2701                                 }
    2702                         }
    2703                 }
    2704         }
    2705 };
    2706 
    2707 jQuery.Event = function( src ){
    2708         // Allow instantiation without the 'new' keyword
    2709         if( !this.preventDefault )
    2710                 return new jQuery.Event(src);
    2711        
    2712         // Event object
    2713         if( src && src.type ){
    2714                 this.originalEvent = src;
    2715                 this.type = src.type;
    2716                 this.timeStamp = src.timeStamp;
    2717         // Event type
    2718         }else
    2719                 this.type = src;
    2720 
    2721         if( !this.timeStamp )
    2722                 this.timeStamp = now();
    2723        
    2724         // Mark it as fixed
    2725         this[expando] = true;
    2726 };
    2727 
    2728 function returnFalse(){
    2729         return false;
    2730 }
    2731 function returnTrue(){
    2732         return true;
    2733 }
    2734 
    2735 // jQuery.Event is based on DOM3 Events as specified by the ECMAScript Language Binding
    2736 // http://www.w3.org/TR/2003/WD-DOM-Level-3-Events-20030331/ecma-script-binding.html
    2737 jQuery.Event.prototype = {
    2738         preventDefault: function() {
    2739                 this.isDefaultPrevented = returnTrue;
    2740 
    2741                 var e = this.originalEvent;
    2742                 if( !e )
    2743                         return;
    2744                 // if preventDefault exists run it on the original event
    2745                 if (e.preventDefault)
    2746                         e.preventDefault();
    2747                 // otherwise set the returnValue property of the original event to false (IE)
    2748                 e.returnValue = false;
    2749         },
    2750         stopPropagation: function() {
    2751                 this.isPropagationStopped = returnTrue;
    2752 
    2753                 var e = this.originalEvent;
    2754                 if( !e )
    2755                         return;
    2756                 // if stopPropagation exists run it on the original event
    2757                 if (e.stopPropagation)
    2758                         e.stopPropagation();
    2759                 // otherwise set the cancelBubble property of the original event to true (IE)
    2760                 e.cancelBubble = true;
    2761         },
    2762         stopImmediatePropagation:function(){
    2763                 this.isImmediatePropagationStopped = returnTrue;
    2764                 this.stopPropagation();
    2765         },
    2766         isDefaultPrevented: returnFalse,
    2767         isPropagationStopped: returnFalse,
    2768         isImmediatePropagationStopped: returnFalse
    2769 };
    2770 // Checks if an event happened on an element within another element
    2771 // Used in jQuery.event.special.mouseenter and mouseleave handlers
    2772 var withinElement = function(event) {
    2773         // Check if mouse(over|out) are still within the same parent element
    2774         var parent = event.relatedTarget;
    2775         // Traverse up the tree
    2776         while ( parent && parent != this )
    2777                 try { parent = parent.parentNode; }
    2778                 catch(e) { parent = this; }
    2779        
    2780         if( parent != this ){
    2781                 // set the correct event type
    2782                 event.type = event.data;
    2783                 // handle event if we actually just moused on to a non sub-element
    2784                 jQuery.event.handle.apply( this, arguments );
    2785         }
    2786 };
    2787        
    2788 jQuery.each({
    2789         mouseover: 'mouseenter',
    2790         mouseout: 'mouseleave'
    2791 }, function( orig, fix ){
    2792         jQuery.event.special[ fix ] = {
    2793                 setup: function(){
    2794                         jQuery.event.add( this, orig, withinElement, fix );
    2795                 },
    2796                 teardown: function(){
    2797                         jQuery.event.remove( this, orig, withinElement );
    2798                 }
    2799         };                         
    2800 });
    2801 
    2802 jQuery.fn.extend({
    2803         bind: function( type, data, fn ) {
    2804                 return type == "unload" ? this.one(type, data, fn) : this.each(function(){
    2805                         jQuery.event.add( this, type, fn || data, fn && data );
    2806                 });
    2807         },
    2808 
    2809         one: function( type, data, fn ) {
    2810                 var one = jQuery.event.proxy( fn || data, function(event) {
    2811                         jQuery(this).unbind(event, one);
    2812                         return (fn || data).apply( this, arguments );
    2813                 });
    2814                 return this.each(function(){
    2815                         jQuery.event.add( this, type, one, fn && data);
    2816                 });
    2817         },
    2818 
    2819         unbind: function( type, fn ) {
    2820                 return this.each(function(){
    2821                         jQuery.event.remove( this, type, fn );
    2822                 });
    2823         },
    2824 
    2825         trigger: function( type, data ) {
    2826                 return this.each(function(){
    2827                         jQuery.event.trigger( type, data, this );
    2828                 });
    2829         },
    2830 
    2831         triggerHandler: function( type, data ) {
    2832                 if( this[0] ){
    2833                         var event = jQuery.Event(type);
    2834                         event.preventDefault();
    2835                         event.stopPropagation();
    2836                         jQuery.event.trigger( event, data, this[0] );
    2837                         return event.result;
    2838                 }               
    2839         },
    2840 
    2841         toggle: function( fn ) {
    2842                 // Save reference to arguments for access in closure
    2843                 var args = arguments, i = 1;
    2844 
    2845                 // link all the functions, so any of them can unbind this click handler
    2846                 while( i < args.length )
    2847                         jQuery.event.proxy( fn, args[i++] );
    2848 
    2849                 return this.click( jQuery.event.proxy( fn, function(event) {
    2850                         // Figure out which function to execute
    2851                         this.lastToggle = ( this.lastToggle || 0 ) % i;
    2852 
    2853                         // Make sure that clicks stop
    2854                         event.preventDefault();
    2855 
    2856                         // and execute the function
    2857                         return args[ this.lastToggle++ ].apply( this, arguments ) || false;
    2858                 }));
    2859         },
    2860 
    2861         hover: function(fnOver, fnOut) {
    2862                 return this.mouseenter(fnOver).mouseleave(fnOut);
    2863         },
    2864 
    2865         ready: function(fn) {
    2866                 // Attach the listeners
    2867                 bindReady();
    2868 
    2869                 // If the DOM is already ready
    2870                 if ( jQuery.isReady )
    2871                         // Execute the function immediately
    2872                         fn.call( document, jQuery );
    2873 
    2874                 // Otherwise, remember the function for later
    2875                 else
    2876                         // Add the function to the wait list
    2877                         jQuery.readyList.push( fn );
    2878 
    2879                 return this;
    2880         },
    2881        
    2882         live: function( type, fn ){
    2883                 jQuery(document).bind( liveConvert(type, this.selector), this.selector, fn );
    2884                 return this;
    2885         },
    2886        
    2887         die: function( type, fn ){
    2888                 jQuery(document).unbind( liveConvert(type, this.selector), fn );
    2889                 return this;
    2890         }
    2891 });
    2892 
    2893 function liveHandler( event ){
    2894         var check = RegExp("(^|\\.)" + event.type + "(\\.|$)"),
    2895                 stop = true;
    2896 
    2897         jQuery.each(jQuery.data(this, "events").live || [], function(i, fn){
    2898                 if ( !event.isImmediatePropagationStopped() && check.test(fn.type) ) {
    2899                         var elem = jQuery(event.target).closest(fn.data)[0];
    2900                         if ( elem && fn.call(elem, event, fn.data) === false )
    2901                                 stop = false;
    2902                 }
    2903         });
    2904         return stop;
    2905 }
    2906 
    2907 function liveConvert(type, selector){
    2908         return ["live", type, selector.replace(/\./g, "`").replace(/ /g, "|")].join(".");
    2909 }
    2910 
    2911 jQuery.extend({
    2912         isReady: false,
    2913         readyList: [],
    2914         // Handle when the DOM is ready
    2915         ready: function() {
    2916                 // Make sure that the DOM is not already loaded
    2917                 if ( !jQuery.isReady ) {
    2918                         // Remember that the DOM is ready
    2919                         jQuery.isReady = true;
    2920 
    2921                         // If there are functions bound, to execute
    2922                         if ( jQuery.readyList ) {
    2923                                 // Execute all of them
    2924                                 jQuery.each( jQuery.readyList, function(){
    2925                                         this.call( document, jQuery );
    2926                                 });
    2927 
    2928                                 // Reset the list of functions
    2929                                 jQuery.readyList = null;
    2930                         }
    2931 
    2932                         // Trigger any bound ready events
    2933                         jQuery(document).triggerHandler("ready");
    2934                 }
    2935         }
    2936 });
    2937 
    2938 var readyBound = false;
    2939 
    2940 function bindReady(){
    2941         if ( readyBound ) return;
    2942         readyBound = true;
    2943 
    2944         // Mozilla, Opera and webkit nightlies currently support this event
    2945         if ( document.addEventListener ) {
    2946                 // Use the handy event callback
    2947                 document.addEventListener( "DOMContentLoaded", function(){
    2948                         document.removeEventListener( "DOMContentLoaded", arguments.callee, false );
    2949                         jQuery.ready();
    2950                 }, false );
    2951 
    2952         // If IE event model is used
    2953         } else if ( document.attachEvent ) {
    2954                 // ensure firing before onload,
    2955                 // maybe late but safe also for iframes
    2956                 document.attachEvent("onreadystatechange", function(){
    2957                         if ( document.readyState === "complete" ) {
    2958                                 document.detachEvent( "onreadystatechange", arguments.callee );
    2959                                 jQuery.ready();
    2960                         }
    2961                 });
    2962 
    2963                 // If IE and not an iframe
    2964                 // continually check to see if the document is ready
    2965                 if ( document.documentElement.doScroll && !window.frameElement ) (function(){
    2966                         if ( jQuery.isReady ) return;
    2967 
    2968                         try {
    2969                                 // If IE is used, use the trick by Diego Perini
    2970                                 // http://javascript.nwbox.com/IEContentLoaded/
    2971                                 document.documentElement.doScroll("left");
    2972                         } catch( error ) {
    2973                                 setTimeout( arguments.callee, 0 );
    2974                                 return;
    2975                         }
    2976 
    2977                         // and execute any waiting functions
    2978                         jQuery.ready();
    2979                 })();
    2980         }
    2981 
    2982         // A fallback to window.onload, that will always work
    2983         jQuery.event.add( window, "load", jQuery.ready );
    2984 }
    2985 
    2986 jQuery.each( ("blur,focus,load,resize,scroll,unload,click,dblclick," +
    2987         "mousedown,mouseup,mousemove,mouseover,mouseout,mouseenter,mouseleave," +
    2988         "change,select,submit,keydown,keypress,keyup,error").split(","), function(i, name){
    2989 
    2990         // Handle event binding
    2991         jQuery.fn[name] = function(fn){
    2992                 return fn ? this.bind(name, fn) : this.trigger(name);
    2993         };
    2994 });
    2995 
    2996 // Prevent memory leaks in IE
    2997 // And prevent errors on refresh with events like mouseover in other browsers
    2998 // Window isn't included so as not to unbind existing unload events
    2999 jQuery( window ).bind( 'unload', function(){
    3000         for ( var id in jQuery.cache )
    3001                 // Skip the window
    3002                 if ( id != 1 && jQuery.cache[ id ].handle )
    3003                         jQuery.event.remove( jQuery.cache[ id ].handle.elem );
    3004 });
    30053083jQuery.fn.extend({
    30063084        // Keep a copy of the old load
Note: See TracChangeset for help on using the changeset viewer.