// ==UserScript== // @name My.Helianthus.annuus // @namespace https://greasyfork.org/users/1006-peach // @description by 向日 // @version 3.10.15.6193.x.1 // @include http://*.hkgolden.com/* // @exclude http://*.hkgolden.com/mtgamer/* // @include https://*.hkgolden.com/* // @exclude https://*.hkgolden.com/mtgamer/* // @run-at document-start // @grant none // @downloadURL none // ==/UserScript== (function() { var location = window.location; var history = window.history; var navigator = window.navigator; if(window.AN || !/^(http|https):\/\/(?!(?:www|m\d*|articlehtml)\.)[^.]+\.hkgolden\.com\/(?![^.]+?_ad)/i.test(location.href) ) return; document.domain = 'hkgolden.com'; if(document.addEventListener) { (function() { var keywords = /bmediaasia|pixel-?hk|imrworldwide|googlesyndication|_getTracker|(?:Page|Inline|Google|\b)[Aa]ds?\b|scorecardresearch|addthis/; (window.opera || document).addEventListener(window.opera ? 'BeforeScript' : 'beforeload', function(event) { if(keywords.test(event.url || event.element.src || event.element.text)) { event.preventDefault(); } }, true); })(); // for some reason the load event is fired prematurely under Tampermonkey var onload = function() { if($ && document.readyState === 'loading') { $.holdReady(true); $(document).one('DOMContentLoaded', function() { $.holdReady(false); }); } window.removeEventListener('load', onload, false); }; window.addEventListener('load', onload, false); } document.head.appendChild(document.createElement('style')).appendChild(document.createTextNode('\ a[href*="bmediaasia"], \ div[id="Super Banner"] ~ *, \ div[id^="Top Textlink"] ~ *, \ span[id*="GoogleAd"], \ span[id*="LineAd"], \ span[id^="lineImage"], \ \ .PageMiddleFunctions, \ .ContentPanel > center + br, .ContentPanel > center + br + br, \ #mainTopicTable > tbody > tr:nth-child(2) ~ tr:not([userid]), \ td[colspan][height="52"], \ #ctl00_ContentPlaceHolder1_view_form > div[style*="945px"] > table[width="100%"] > tbody > tr > td:not([align="left"]), \ \ noscript, \ script + ins, \ script + object \ { display: none !important; } \ \ #ctl00_ContentPlaceHolder1_view_form > div[style*="954px"] > div:first-child \ { width: auto !important; } \ ')); var AN = window.AN = { mod: {}, version: '3.10.15.6193' }, jQuery, $, $d, $w, $r = { 'balloon--minus': 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAACCElEQVR42s3SX0hTURwH8ONvRGGAZEhYRRIBBRTgWxDQnoKgxwhiWVFJOAwiBKSctsyXgJUUumCQMO9EIwhyQK4XQ0DmljZaBq5s1233zq5Lubv70/LX7yfzwkx76aUDH87hnN/3dy+cI8R/NUZbocZ/E6zkKmkj7WVt5T0r12waft0KR8fu1LfPjXX5jcWQvJqPF7CYRCwmcDX/rWCoQXnujcPPNVxbEX5lh32BzkNOXZmMY+4rov6ZzG5Ae7kY6ol38YCjwckZs8HLFriofJDCmKWilcjf6Z9QCXnCnDEbjNwAR2k5msVMGNeVtHHUlSHU5Meozndj6svdNbzW4u4sZ8wGvma49zMzY+DSFJa+j+NywoPp+QdU7NyUEusxOGM28F6D6/Lks0hRC+CPhSe4JLu2lFl4hLNvmyOcMRsMXIGDL27v71Wjfams6kU96dlScvp+avhWXS9nKm7i+Wlo9NprXUGfbWIx+lQ1UkPFQnoEC+lhzBOeg4PnJ7z2XS7PJWg0g5IQbp8QU2tATEvbRUyqFomBhqqPfTZwr/ul+ZHnfhvsrvhyPwVzTU24Ee/z+ZljAC2nLCcenrNI7I8X2E1/0EXFnUKESJju5n2HEDOXhRik48OEX91x6xG40HHWMsprcoBUm01OClFFk4VsIzvITsJvvpbUkT2knuwtr2vKtf8+fgN0RI2UbTRH1wAAAABJRU5ErkJggg==', 'balloon--plus': 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAACHklEQVR42mNgGFRgay4T/7Y8JkcgTgbiUiCuhOJSqJgjSA1WzVtymTR3V0tW3tndsO3b67OP//149PP/r2f///96+v/fj4c/v708/fjOrrptIDUgtSiaN2YzSe+pV2r68uLko//f7////+UmEN9Aw0Cx73f/f3l6+NGeOoUmkB64AeuymGJfXFp27v9XoKJPl/HjL9f/vzg79xxID9yA1RlMdX8+Xvv6//25/zD85+2h/19erPj/9vHE/y8ftPx/fq8GjEHst49mfgXpgRuwPI2p8ff7i9/+vzvz/8+bQ/8/Pp37/9WDVqDiJqz4xd22byA9cAOWpDClPj456/Kvt3v+f3gy5f+7x/048fsnE/7f2Jt2GaQHbsDCRCZ5q8lCl7U36f5KOuTz/8uzuTjxswvNz1cVik4C6UGJCY6FwtdS3pX+V1qm+OX1takvvz1f8evnq9X/f75a9f8HEIPo00vDjy7JFuyfG89khNA5R2gmw1yhMyAc+jrtP/cMwbuC0wSemrbxXJ0ewzQThv++3fYfRM+IYRJGTUFTBc44Pg/6j45B4iBpL10mpiwHZsvuUOZlIIyZBHv5ZjL08J1h6OY7q/PI9j9DF995hk6+iwwZ3EuBsipADEp1eo4aTFG1vsxbQWwglgViLoQhruyMDE08Z6Xua/8H0ueAItxADErzQkAsCsTiQCwJxFJQNkiOFdUluWwzGTJZz4BpEgAAGMWWFPVe+3EAAAAASUVORK5CYII=', 'chain--arrow': 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAABhUlEQVR42mNgGAVgEBwcbBwSEhIPxOlIOB4kjk8OrNnHx8c0PT299tixY7fv3r379/Hjx/8fPHjw98SJE3cdHR2rQRibHEgPSC+Dq6tr6qFDB+80NNQfFRIS6mdhYenq6Oj4P3PmTBQMEgPJgdSA1IL0gPQyWFlZFV2+fPmHvLxcA8hFIEVAyf/Xrl39/+rVq/+vX7/+f+vWrf9AV4ANAKkBqQXpAell0NfXz9u0acf9urrmbQICAkXMzMzV5eXl/7FhkBxIDUgtSA9ILwMvL6+TlpbOtDlzlj4+cuTinytXHv8/efL6n3nzlj8GiaPLVW95/r920ZGPIHGQXpCLhIAmhwOd1wRyIhJuAopHgzCynGHz0RdGLceeyQdWTQPpBRnACcRiQCyFDSslz1qp23L2IjKe/vT/fxCtED8lhWAaUa48fGbS4///s67+/x97EYGLb/z/D5IjaIBkzvaZEllbzyBji6P//4NooFwMyamWN2b5GRDmi1sZQ1ayZwucMxOI4ZoBsGkPUwBKpQ4AAAAASUVORK5CYII=', //'control-stop-090': 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAABBUlEQVR42mNgGB7Aft7LmUB8hgQ8E8UA6xmPz0x58P9//+1/GLjvFiqeePf/f5B6FAPMJt6ZaTrh9hliMUg9QW/ptl2M0Wu/dAZEkxwmqjXHY9RqT5zpuPLrP4gG8YnWLFu4J0auaO+Z+tOf/wfOvfm/YM+L/yA+SJygZtH0TTFiGZvPZO19/d966mU4jlz/6D9IHCSPUzNf7IoY/riVZ7z3f/kvtfQNBjba9OE/SB6kDkMzR8j8GM7QBWcMD/37L7rj33/h7f/+C277958fiHm3/vvPveXff64tEHGQOpB6ZP3MzNbF85n9Zp4hGgPVg/TBDQBifiCWBGIpIrAkVD3z4MhHABdQ8Tt3BG1pAAAAAElFTkSuQmCC', 'control-270': 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAA/0lEQVR42mNgGAVgYDv7mbH93BdnSMEgPXADrKY/ErWYcn9d5t4Pzybd+/e/69ofFNx5FYL7bv39n7br/TOQWpAeFFcY990U1Wu/tC5564tn9ae//09e/+p/5NIH//1nX/vvOfXi/4Q1d/8HL73/DKQGpBarVzQbTosqVx5eF7z0zrPYTY//W0+9DMZBK+//d5117RlIDqQGb3jIFu4Rlcjaus58+rVnZls+/jfY+OG/7qQrz0BiIDmiApXTKFyUN2b5Osney88kei4/A7FBYsToFQBiLVCQMAkqOLD6TNkMwiA2SAyI9YBYBIgZcRnAAcQgm6RwYHEg5sJnwEgEAFrDorvTBfJaAAAAAElFTkSuQmCC', 'control-eject': 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAABNElEQVR42mNgGLTAft7LGCA+A6JJ1mw943GM9cwnZ2Y+/f8fRIP4RGs2m3gnxmzS3TPTH///X338x/+pD//9B/FB4gQ163deiTHounpm8v1//3N3foLjvlt//oPEQfI4NWs0nI7RbDxzpv/2n/9pm979T1z78n/44vv/fWde/e8x5cL/8sOv/4PkQeowNCuWHYxRKj90pufG7/9lhz7/z9r+4n/c6rv/Y1be/h+1/Nb/iKU3/4cvufE/c/uT/yB1IPUoBsjk75opnbfzDLEYpJ66cc4TtXQmb/SyM8RikHoUAzhC5p/ROPD/v+Tu///Fd/3/L7Lz/3+hHf//CwAx3/b//3m2/f/PDcScWyFskHpk/czM1sXzmf1mniEaA9WD9MENAGJ+IJYEYikisCRUPfPgyHQAtfPpcW73XZQAAAAASUVORK5CYII=', 'control-stop-270': 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAABHklEQVR42mNgGB7Aft7LmUB8hgQ8E8UAm5lPYqxnPD4z8+n//703/6LgnhsIPO3R//8gdSD1GK4wm3gnxnTC7TPTH///n7/7MwaecOfPf5A8SB1Or+h3XI7Ra790ZuLdP/9jVz79Hzj35n/v6Zf/N5z58B8kDpInGB7qdSdj1GpPnKk7/eG/88Sz/8uPvPkP4oPEiQ5U+ZJ9MXJFe89kHHz7H0SD+CTHjFj6phixjM1nQDRBxXyxK2byx608QywGqUcxgDN0wZmos///+5/4/9/j+P//jkf+/7c8/P+/wYH//zX2/f8vv+f/f/Gd//8L7Pj/n3/7//8g9cj6mZmti+cz+808QzQGqgfpgxsAxPxALAnEUkRgSah65sGRjwBY+PLdCjYKSQAAAABJRU5ErkJggg==', 'cross-shield': 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAACN0lEQVR4XpWNTUgTYBjH/+ZAp4vhvgyIQYoIbEkwT0MQcTBAsckM1ZPoRc8VXoIIKKCgS1RRtFBWm19BWlNMKIIyQJaTNtJ9YIPmmDHVy0TEp+eBl1gwgf7wg+d9nv+PF6dlCmhkPiga8T95BRiCwHyqo+O3IDPvzKcKL7nA3PUDFxg7z9PrLS2/9kdHaW9khL63tm7z7o3cpCNdcaCCCWAl09t7EKys/Dap1a7FXK7czvAwbXR30w+Ph7KDgxRtb98J8i3AnWRX14E4UIEP+MzCSXpggH7295Nk1eX6B0mip4fiXi9t9fWdiAMVPAOWk17v8Senk4oj71K7Nbf7WByo4DEwE+vsPFxubqapujqSFAoFymazlEqlKB6PUzKZpKc1NeQzm2nBbj8UByp4ADxabWvbf+9w0GJTE70wGikcDlMkEqFYLEaJRIJ8LI8rZq3WPXYeQgX3geshmy2zZLfTtMlEk1wqltPptOwEmuG732DIsHMNKrgHuPnXzY/19TRfQs5kMpTL5eRGCxYLPdFqN8WBCm4D+jtlZStfGhqOiuVZFgSR8/m8QEsm05F0xUFxbgE3x/X6rbf8g8hzLH5VyCyy7J5XVGxJF5JibgDGq8BiQK/fDhmNtG4wUIQFBb1j/FVV29KRLkrlMmAdAibGNJronE63u8GSIPNYeXlUbtIp5Z5hdIylFjh/CRi6AoQC1dU5QWbZyQ1ArXSV8zcadbAxDuEs4OTfXnsYmWWnuMicUw7+AKvQcvS+6EM5AAAAAElFTkSuQmCC', 'film--arrow': 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAACXElEQVR4Xo2STUhUURiGn3PPvTNO6kypSCoZ+UsGuJKWum4Vg4KgEyESERQBbYJwVVCbyEgIEyJkQtAkIDBoYxDQxqCVOmRFEiBQMY7ze+89X1MzY2mAPfDC4fKcl++7HCUiWJZ1EWgr5b/4WM5DmxJti4uLXdFo1L8/9y7qGwEUIgCCEUGMoBRci/Utll0AKgVW8cMHoB0lZAsuIIiAACKlczq587drAViVgoWFhU5AizEoJVCMiMF3XbLpDOurX1hb2wTQZdfaM8Hg4OAnoCObckml8/iej7IMkYhFzmRxjYegKu6/E8zPz58AtC8KJ+gQbqimuamW47Wa7sYQzc1hqsM1ALrs7p1gaGhoE+g8FKlCez4ikMzkMVqwHY22A7S21+26+wv03Nxcy/DwsH724PIqwNbWlp9IJPLsQyn1y20tul8BKu9gmhJdE9Pv+32jSKY9fF+oICIY4zN9/fRrIEGJC7srxOPxxpGREV0VCpIrGIJVijJ7SrrHJrsHB3ojt84NrOxZoXj5G9CAaApZH21Z2IFSv/ENnuviFVyCTSdrX2zgHO0/nxI79Kdgdna2LhaL2fmUKRYIruvheVkSCjKWxnYsLGWTS+9w9drZ+smdnR7nSMto5R88pUTPxNRGbybn4nk+Tkiz/D3J6Fgfa9uQ8tilMQjPn7xZscu7Vc/MzDjj4+O1giZUU0w4gNaKw9tJHk8to5WAgs8bq/mOK5eCS3ceJZ26Y/d+T6CUugucAno5gOozt+uxnYy7/nIpEG4ctilxAwgDFgfg2pGbkv3x1l1/FS8APwH/5BEQGBT1zwAAAABJRU5ErkJggg==', 'highlighter--minus': 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAA3ElEQVR42u3PsQsBYRgG8Oe+O5JLCIlSRzEopfgj/AsWNrv1JoP9yuRWw91gwWBgVZZvvf9CVuN5Pihdphvlrd/y9j7v+31AjDocUEXcOh4x2O8hNxu4scOXC8IgwNX3MYkd9jzI1Qq9f/i3woZh9C3L2n4Le4DrAzJK9R9hXdeb5DqOE3LJOXp5yeHbaBRGqf57wSMshNhpmja1bZifr5vz0ozDUaqP0+n551d4DKBMJSpQnrKUoTSlKAnAUHdJw3oNuVhANhoYAuhSh9rUojrVqEJFypH5WpQgcQcJm8GojKRW7AAAAABJRU5ErkJggg==', 'highlighter--plus': 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAABDElEQVR42mNgIAPs2sUgxUAu2L2bwWPbNoYzGzYwzCRb85s3DP+vXmV4t3w5QxrZmpctYzizaBGD8ahmumteKToTiM+AabJsXiJyJuVd6X8QjaGZhYXFREFBYSNWzXOEZjLMFToDwqGv0/7D2GBxEGBmZlYF4pn9/f3/gYYcx7B5qsAZx+dB/9ExSBxmAFgzExPTJkZGxsKqKgZuFOf18s1k6OE7A8I6j2z/w9hg8SNHIH6Gao4HKhcHYlEgFgZiQSDmB2JeIOZiaOI5J3Vf+z+QPguyF4gZGVavZjgzaRLDGSUlhkiggAEQ6wKxFhCrAbEiEMsCsSQQizD4sy5gyGA9xxDIOhfIZwViJgCDltVoETWpngAAAABJRU5ErkJggg==', 'image-export': 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAB6ElEQVR42sWTMWgTYRSAv7tc7kys2A7WxFJURAUL2sEGDS4S6SCESEHcnIOT4FIsbcEOEYmLULAohSoB0UFotkIGQTuok4NQ0VBUUpqisTGX5P673POa0cnQwQ++8X08HjxNRNgNOrtEuzo7mwYO0RsVESkCMDE1lZUe2ZkJZEfD8zzdF+FCrk1IB9MAX6DTgf0R6LOEqAlnD0PU/cAevU671TICcZXqBjRPhMRRjb2WdIc8H0LQDSoPdA1OxuDr502uZTLcX1qKiMhY07bfGa7r6p7v8+vnQ2LDZzg+eA4djf6oUPvdpGnXELXF+qcfKNWmUq3ytlC4N5LJ3BYRnYvZ7M1tpeTUjbScn7wu+eUVWV2ry6uPDXn/pSlrFUeq2544ri9/cySVmtGVUt0NKt/rrJerPC4ucuvRJPPFeQql5zwrvWRx+QUPnj7h7sIC3zY2AIglk3PBHUq66zjdQLzvCoPRDAPhy+wLXQIZo8Vp2pEExFJERyZwHIfheJz+0dGc02qtiMgbQykV6ohgWZFACzMwZIQR0Wg7QqPhIuKi3DAd8wBT+TwHh4bsIPDaCIfRjo2PT68Wi3eCEP+CaZok0+kZYA7A2CyXqycSiRw90LHtLb/ZBEADLGCgh7/wgRrgAPz/b/wDyPozmVUBpGMAAAAASUVORK5CYII=', //'layout-join-vertical': 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAMAAAAoLQ9TAAAAgVBMVEUAAAAAAAAAAAAAAACAgICAgIB5eXl8fHx0dHRra2twcHAvSasjRa8kRqsqTL4wUrU1V9I/YeVCZMhWeNxkhuzh4eHj4+Pm5ubn5+fp6enq6urr6+vs7Ozt7e3v7+/x8fHz8/P09PT19fX4+Pj5+fn6+vr7+/v8/Pz9/f3+/v7///9U8zd6AAAADHRSTlMAChcaTWZnZ2hpacOKeUSnAAAAbElEQVQYGU3BMQ7CMBBE0dFPUgWl4A7c/2IUCYUlYnYHuVq/x7rNVrG8Zouws9iCnCHIKImwVWyxn1c5d+HjUQ4Lx6+ERTiCbSDCIdKZvAcyncJh38/htsMC270N3TYClgKit29pXbTrU66mP9kmlUjFKf9PAAAAAElFTkSuQmCC', //'layout-split-vertical': 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAMAAAAoLQ9TAAAAilBMVEUAAAAAAAAAAAAAAACAgICAgIB5eXl8fHx0dHRra2twcHAvSavp6en4+Pj6+vowUrU1V9JCZMhWeNzm5uYjRa/q6uokRqvw8PAqTL7z8/P09PT19fX39/fv7+/x8fH+/v75+fn7+/vt7e329vY/YeVkhuzs7Ozj4+Pn5+fr6+v8/Pzh4eH9/f3///8fOEWCAAAADHRSTlMAChcaTWZnZ2hpacOKeUSnAAAAhklEQVR4XlXGxwLCIADA0FRrl0D33u75/78nnKjvkuAetlzwv1s+ePPHmj0IXqv1CiBS0lIRhIu0lhCu/yDrW21YB5M+g3S6aef0bDKlEI9CjJ2KVWcmhuqU521ltHl+qqAo7/dykoWczBTQiLdWN7WJaCB5PrRxGE2eCRwvW0dwdntr5/ADyxAXxxuhm0oAAAAASUVORK5CYII=', 'magnifier-zoom-in': 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAACNklEQVR42mNgwAOSWl5ppLS9mQvE94H4F5SeCxJnIAQiqu4HRtc+vN+04OmJrSff7rrz/MuJo1c+Hehd/vIUSBwkj1OzR9Z5DZ+8i/enbXy448iN14defvxx69O3389ff/p5+9Gbb2fnb3+yyxcoD1KH1QCrmANz83svnth96cWBq48/ngBpBor9B9FP3n47d+3JpxMlEy6dAqnDaoCO36b7c7fd3X7m3rsLd19+efDuy68PQLH/IBrEB4kv3XN/D0gdVgNU3Fb/2nn++QGQYiD7Pzr++O33s8PXXh8DqcNqgJLL2vsLtt/bDbIJpPjn77+fgWL/QTQ4LD7+vLVq38NDIHVYDVD33DE3u+382f1XXx2+//LraZAmoBg8DIABea64++IlkDqsBpg7ZVoZBR9+MW/zg7M3n30+DQp9WCw8e//94ob9r04Zh5y8rxdwDDMWrK2t5W1sbIo7Ju/5bxV54VXjjOeXTl75cvr5ux/XT139cqZj7strNnG37ptHXsdMB0CNWm5u7jU7duz5Lyoq1qxm1WLnmPx8LhDfB+JfUHqufeITTJttbW0tAgOD244cOfNfUVGph4WFRZWBWGBnZ+edkJAy4eLFu//19AymATUbM5ACzM3NS27devXf3t55HlCzCwOJgENUVNRFRESkBag5G8jXByVGIAb5UwWI5YFYGojFgFgQiHlAeoCYFYiZQAawQCWlgFgSiCWgfBEgFgJiASDmA2JuIOYEYjaoHmYgZgQAJMBTRbnQscgAAAAASUVORK5CYII=', 'magnifier-zoom-out': 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAACE0lEQVR42mNgwAOSWl5ppLS9mQvE94H4F5SeCxJnIAQiqu4HRtc+vN+04OmJrSff7rrz/MuJo1c+Hehd/vIUSBwkj1OzR9Z5DZ+8i/enbXy448iN14cevfl29snbb+dAGMSev/3JLl+gPEgdVgOsYg7Mze+9eGL3pRcHrj7+eAKmGYavPfl0omTCpVMgdVgN0PHbdH/utrvbz9x7d+Huyy8P0DFIfOme+3tA6rAaoOK2+tfO888PgBQD2f/R8cdvv58dvvb6GEgdVgOUXNbeX7D93m6QTSDFn779fo6MX3/8eWvVvoeHQOqwGqDuuWNudtv5s/uvvjp8/+XX0+hhAAzIc8XdFy+B1GE1wNwp08oo+PCLeZsfnL357DOKAc/ef7+4Yf+rU8YhJ+/rBRzDjAVra2t5Gxub4o7Je/5bRV541Tjj+aWTV76cfv7ux/VTV7+c6Zj78ppN3K375pHXMdMBUKOWm5t7zY4de/6Lioo1q1m12DkmP58LxPeB+BeUnmuf+ATTZltbW4vAwOC2I0fO/FdUVOphYWFRZSAW2NnZeSckpEy4ePHufz09g2lAzcYMpABzc/OSW7de/be3d54H1OzCQCLgEBUVdREREWkBas4G8vVBiRGIQf5UAWJ5IJYGYjEgFgRiHpAeIGYFYiaQASxQSSkglgRiCShfBIiFgFgAiPmAmBuIOYGYDaqHGYgZAVI8VtW3Z2FZAAAAAElFTkSuQmCC', 'picture--minus': 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAByElEQVR42sWTP2tTURiHn3vum5ubc//l1sSSxBoaQYcKUTpVEAo6CLq4Ojn4PfwUUh0KXQXp5OjiYAfBDgoKJQgFRRclbbRp7j0n1+FmCIqCdfDdzg/eh+dwfgf+9zgP1nkErJ5w/5XYKau3tt6fCPD0bg8xFpRS3HnSRTlQcUFcyAwUBcQ1iH0QBb0GrLTATGGtsY+xINaC67r0z4AnkNSgEcDnQ6hVynMBDI/gYhv6HTjKwJ26WAuSWxAR2sELzreWSYM2RQEXFmExKkHjDHqnSpOJKaEyEXILYkwJeLa7yY6vuXH5Nusr1xBVGvUaMM5hQUNuy0xXwFrBmDmDvcEe9aTO49EWB6OPLDXP0lpY4nScUvN8cHS57JVXO85mBvnMYHLQ4cs34ftXj+3hG2r+gEAHhEFIGIZEYUQSxSw12yw3O1ztCLkByWaAXus6nudRrVbRWhNFIUkSkaYxaRqRJAFx7BMEFVRVIXJMZuYM5qcoCoyxjMcZSo1pP7yPv/+OXCkOHQfHUTzXBd1PdGU4Kp/x5ca93xZme2PAzSuXfsnfvt7VzprHZurQ/1Pjzhm6ukD/nH+AHQfwgDogf9lkAwz/+Tf+AI0siBbqAfEPAAAAAElFTkSuQmCC', 'smiley-twist': 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAACXUlEQVR42oWScUhTYRTFLyUBawBBiQZIRoJoQbDI1IjI/opYBRuQBIVgkECMWP9FUATKAixwxDOczLKNoHBCWG5vYhnmWjI0020sYxCpW+sxwdrYdvvOV8YmQh8cDvec37084BGJ5yJSHhMZ3ppJt/KUjEKKkE8o8NcxG9GDA0/Fz0EUHKmqCnvqKJjyHwpnvtzW8klnltPPC3DMyNGDA19yoFsEq5fOZn++t2icVJhXhBJO5uSjP45Z5OjBdRcfiPWRrqdWHBi7oK3NX+Vg/1FOTVu58M0u9EA6ZuTowYHHnjwQ6SXj1+HaSOHzFdamTBx+1sLerr38faqdg45m6ZiRowcHHnvywJydlNVpk5YPneZlXwvnchk2XFbk0rowI0cPDjz25IHQPfJlZs9nF57U89JIE8eHjnDc08RLL4/xD/8J6ZiRowcHHnvyQMBGgdyMudDXUcaD1/TsuVnBo53VJV+AGTl6cOCxJw9M3CHf2uSprNuq448fVI7FYuz1ejd19ODAY08e8N0gZflFozZuq+CZV52cz+c5Go1u6ujBgceePDBkIeNEV3kkMdzAnlt7OP5J5VAoxOl0usSRowcHHnvywGA76QbayL3gOJBYdB/m0bv1POa6zovz7/j1uF86ZuTowYHH3r+fqbeVavovlqlzDw2JlPcczzqb+c39/aza9knHjBw9OPC08VmOU43dTG6PtTIcc53UNH9r9tdkWwGOGTl6cBt3twqVC9Xt1FOj6SB12M7QQI+JVLEQgGNGLvoGwVUL6YsPbBHaLrRLaPd/VCm0Q2jb+vJvBcwQQD7QC78AAAAASUVORK5CYII=', 'tick-shield': 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAACW0lEQVR42pWSb0hTYRSH3+lgptvkbrvTNol1p66YRjWSGlFFluWMiTSpkiihgvpYEUAQAQUUBBBVUI5a+5fOoA1mVFEIpmW2KY5y1Fob7YILKj8NEU/nva5uqwl04OGee855fsDlErJY9bIm5HkeE/mv8mpUxK8JbZns+EqhPc7YxQUPHng0l4hbsxxpwL7P8mrHl/2pE7Dv83FoGt3J4+yhsKM39JY6v8ulHrZNdc3IfLpImV8ftY61TTs+HoWWyF6BPR+OgPVNWxb3UZlXF9k24ZihjhjgVA11fjo23/7+MNjfHRKkTS/tBVgHbbB9rBNaJw7A7tjBeeqIAbeYp7bJrrn1L3ZBMVaFNwOt20m38L71dcccdcSAG0yg+a0jZ3nSDObQRqBPKtUG1oHunhlSqRSk02ngeR5YZz2sCG7IUUcMuFp53Tpk+0HlXC4HNf5GULmMwDg5SCQSQkAmkxHembsc6HsbvqNzTQy4ojxtCjZlvPEAxGIxyGazwHj+kl0o3+dA01eHvSGDzikx4LKyhekxxA0Da4SAeDxeKPtQDi3Ahuuh7KY2Th0x4IK8UnJRMcwNrp1V9RsL5X4Un4moH9fOErylTuHPdL7inOKOPlk9uhKYILcg45MZEVGNGEHWwybp7b9/49lyNTkpe6T06nh2vA5UA/gRxzmRKAflbi1Pb4TbomWXLiPdpS7pmSUxeXDpN2YKRYT2pTijO+GmSJUgckRLqiQ1ZLWkmzgk4QofO02hvTCjO0Kq8rclfwZI8wszYhFQECuxkwekHaH9rzkhjUh13iE/AQ4sY0V2q+EfAAAAAElFTkSuQmCC', 'gnome-mime-image-bmp': 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADAAAAA0CAYAAADMk7uRAAAN4ElEQVR4Xu2ayY8l2VXGf3eI6U05Zw09uKo9t2UBwgtjb/qPYAUbWCEQYsOChZeWNy3vEAtghWCDaHmBLXnBwljgBlkM7cbdXd0151RZWZn5xpjvwKurru6gn8tFJzJGwl/q6MY7cfXud+Kc78SNF8nPGb+AoguQgODjQwKCny1Eh5/vOvna1752bpbo+PwFF/BcHJvAOQFsAOOftoZe4hvf+MamDl4h5Ne//vUd/pfgvX/a8U7Ht7McnxyvjK+++uoUQEIIgFUE/wf280XgsjJ2a1fwfx2rFzrw1nwE3/vxIf1+xL0HM+4eFbzx1gHzShBHMEw0G0PN+jBiuLT+IKMpG7I4AuEp8oZIS5I0wVpH0xiqomB7a431YcpgkNLPYvqxRGqPEpBECiklzjm890+IBp9YmgSUlMEnsKxnKV2sBKCEJFOaQabpJZad9R7NcYNrDUa0KDTeQV1CPs8xraHfrxHe08tSRsOYNIlpGkvlPT5S4DxCSMAjnSWRgjTRxJEgUgqt9QdBGGOw1qKUCqSVlEQ6BAk4cPz0APJ8jsSSTytMURMph4wdHo0XLc7CZNZQtGUQlBMKzlt2RwmpThCtQicKEUlEJogijdYKayyilehYA+C8Q6BQAoJJAVIRKUnTGoy1SClQSn4oXicQCMA/PYDxrKasW8bz5dhCbRxSWBIJwyzFeMnZpGJePPZLiAxaO1Jp2RwJytbiijqQdh6kksSxIokF3rdL00gVBxFqrQNBKYPxBLEQKKdx7oPOE7JirCdWCt2Zqz8q4PG8ImvlciyZ5g7jFcMsJpWgJIyLksI4jBTgLbaVaK+YV5bTcUEca0SkcdZSLnKyLEVmmjhRZFotRx2Ix9FP7HAf1r4HZx3eWwgBOIq6RqVZNwAh+QiccUgXYytBGcrI0E8SRsMew96IUdonDlcN8JogRO0QSnByVnJ/f8pkkrNYVDg0SrmlWeI4Jk4S4p5Gpp449ijpQEAoRefg/b4v4IPSkjics5TOMWssxoU5T8/AxuYQ6Tz9QUqyqGiQOCuw3mJ8TjyI2IiGNGdzDJ5IaTItiIRHp4o2lGEVtPPC1R2iyKPfF6SUCuvAOYkzAq9Et4njATrkPIFs0IMxhro2+P4zRIx0aAVraxl50zI/nNFaSVkLysZQmZYoTclSTeEMfmmm8kRREmq8bj15GTPIVEg7gAtX2NO2Ld6CEgIVKYglAkLH6d5ppewIFxBA0IyK8J4u/EoG2taz1pcgHJujhMkkYu8kD4tZB9ZIXFWFtihVROUaagVxNUO032Pv/ru8+Pwr6Oe/RDkviIXGCk/VeNbSiDgWGG/x/RTvI0CghVmaRKEDUe/9B+a8ACGR0hApj6QLhOxGCjDqO0xVBWFGwrLWT5eWIRDUtaOqHG0TREWA0URtQ9M4EH1M8Tbnp9+jnN7k3s0fMJtPmM8Ns9mMsqqoqnZplnppTdMurcFYg32/TJxzwbz3H/rCWrx/3nazs6qBW7e+zb133+YrX/kNFtOWYe8q68MEW0iKqglfhnMgICyER7Y32R3MKKp3GUYpsa1J5HvU5YwHJynX175KlmiSOEFKEELhWZqXOO9wFly420Lo/0IAPAkg+BpnkVKubCdW9kLvvvM654vv81d/87v8+Z/9Ad/9zqt84ioMdYuzJa2yGAt1I6hqaC04m3Kw9xa37u5xsN8QlQWHt1+H9CqjzZeJBMRJTGtahPAgHbWvMNLj0BgvMBZaYzHW0S7NOI/1YIDaOerKhfNPhP2EswR8sADQzlJPwZSS2bTg/v7rvPatP1gS+i6Xh5pESqTy4ME7hxOW8ckBrd2msdcZJuvc3T/gjTdv8m///Pcc3XmH6TQH79FKAyKIVi4tZNCHcsEY0ymhVfPOhXLraNj/xC509+Yeaayo5pat7YzzyZzje7fI+2dcjxKS7Mu0bQTUCCTCJKRXv8z06Fs8Nzxh0TbsH5QMtnaw1RHCP0IqiY4isl4MmEDYGksrPDa00vBNSDz+A24ijGVZUJsW74LAEQSQpmn/C1/4wtpKCX3205/C0WKU4ey0oZo55mPL/v4xP/zBnzI/+g5K3ODRwR8zOXqN6fiH6ObHJOo+s8UdinoWrvBIp3z+c7/EcLDN1nAdLcEIR/izcmkKawW1a3nrvR9x4/YNZuWc0+kp94/vczI7ZVwu+MvX/oLf/8Pf4Z3bb6HUhwFA0OCqiO/cPuDSlescnd9k81LC4b0F6IRIaFIBt9/8ay59ZpP86BRrM7avWvI2QvoBo/VPMp7conKW47MZrVwe+4RPfupzFOUad/bfAmd4/vJLHD54j3/8p2/j5ZwHD/aJdLRsv1eZTiratuDFF3c4P605PMyZLSq+//rf0RrHlS/9Gj6Onty9V0uoKA3/8cYeL3zuCgfHe1y6pugPPShNfm5Z15JqMmE4SplNGpCCwhZQWs4fWspyTDTQzKdTonpBdfuQ1/72JtFI8fDkCIkliTKcFczOp5jaMlpLMHHE2++9gxQQacn+0aNQMum6Rq1Z3rzzHe4/+Ac+/+KfMLz2xSetdHUv5JXj4MGUN/7lDrNJi4w189owmTTEfUMyMkzPa6xruHzNMBxpaCQisszzMVJCPne0dc183PDgqGRv710m47tMHo5Jk5bZ+Iwb/3rEo72W0yNB25RkA8t84jjcy6lqy6Ozhv29OVIbbDtFihnj8SGLed4tIeRHhZznCzauSDavxniX8eiew5YRTSF4cN+h9ZDBRoxHk88k1cKClUiZhI7S1ILFzJMOQMaS1kry3HPj32foOA6tcDFzSBFhHUSZBG258eYYgM3dCETJYm5o2ojJ+RxnNVoH3eD86l5IdJ/+lSgYbLbEI0cx12xuSUYbhCueXNdEUc7GNjzYq6lLSZE1ZH3Bo+OG3iBm+rDBu5g49aHFbl3VxGnLxqUY7yzgA5mdKxl13aJSWA5INcD7lrYxLKaStY2IwzszZtMUJRouvxBj2gYpXeDazYCgg2w4YHYmaGrLYLtl8zlF01YspuCV4PieX2YlItIxZu6IhCCKPS+97GlNjRSStU1DlERIJ7hyvUVpxzBNaUvF2V7CyV2DzjxIz+LMUE4l/T5oHdHL1tneHYQ2+/KvXmE0kjSloiosyIim8QBPRCxWulA6smwnPfZvz8F7qvWKtolZnFnQEYuFYHxUkg0EmzsxTWt59I7hyrWEh3cKti4njDYj2mrB8y8JmtrR3/SoJIcziVKS4U5EXheMtjRtCW0tGW1akoEnipvQ851X4AWLacPGbg9rHf2RJk5kNwNo6GYBais4Pq7xRpH0JHUlKRegRMwgTdh+2dFLNG1pg07GD004frTX0E8TLn8ipixKvI15eNCQrW3TtDOa2jDa8fR6FeutYpaDMXpJzgKefC6Yjg1VWXD12oAsBSFLtnZTjDO0tefw7gLvRPeHMKGB7o6Us0MozyWLs+b9O6gle0x+q08UpUyPT5bEwdmEKCnYvbJGJBXeefKqDF3CGodMsmVwAt8a0B6PpDjzxDJsp0m0wAsTdGKNYr5oaM7h8tV1+plgetZwcjxmsB7R35RYD82pQQgP8HQNCAQ+GKSZRErNlc8M6G83HN8fU4wH7N+U3PxxzckBHB0uONifU7uG3Rc8vTWBQ9MfKBCesrCUuUKicLVYZgoevOfxtaYtW5rK0x+lOCMxrSPtebyTISilYrwVKDT1HLz11FUbRNy9D4huBrROqHNL0ktYW4+59lnLlU8HcdNLe5Szgp2dPuujNcaPHMXYYXPF4tHSziX9nmY4kJw+aHFG09QVi3FDNXksWEm7GHB66Ln3tkH4GK0Vs3FJmgg2tjI2NneQjJCkeKtZTATNPEE4WN8agucJ+WAakJ2IKM4b2upxB7hEslZS1Y6HD2d44+hvP9469DmbnOP7cP6uJVY29Pt8klOHX/AyirwAm2LrBp1qfGPJzx3WWrL1OVlPk6Y2PG8gFW3bsLYR0+SSN390h92r29RVw2JWIyCMo+c8ZycVxvxXDciPagDlef6zCtXPw81E2i2G+otsrW3xiWvbpLs1RelQCLZeSImyiCgOj5cUU8mtHy2YHkdgHgtxjfnEUOaWujZhTj6zNHXLcy+lTE9rpDAkEfR6AhueFxSeivHpAiEVox3BpeuGfmbJtEHpDldAAt0yYrihqSrY35syftSwvTli//4Nol6fo4c5tl5D2JhPfmbEr7yyG9qoc46qaHGtACsoZw3FfE4UCXr9mDiOsFZQ5A1V7vFE3HqrIh8nS01YFApTg9YNm7sJQsjQpp1t6W8o8qKm34u59mlJ2mOlC3U1wO/99h9xdnaC0AJnPJGWvPLLjkhq0jShKBv8488JpEnKV59fhADwAu8BPEKAlAqlCP3bubAAXoQRIQTOeyTg8WTrEmcETWmIYg0CVCSoC4PQHqwjSiVZlnD9uc8Hritt9Al+89d/66IvLFZ9T3+p8azzq3NW/av3gWfj4sGsjhcn3/V1AwipvThhLkJ8lfyzL0DXJzTAzyoDq8QvTj7oLIAVDVjAdbOwuijBf8GS6aJL5kLku/5uCfmOM5C9QKl8jHnPCHTl3Grw3d2ofoqofiY6WPXxLEE/NUvWWqEBB0Tf/OY3Gy6K/3mgF8m6stYaAewCVwAPtIC4wL8PCMCvfO76V48t4Ds+/THnR8A9DcwAB8jOoqy8P14518HqtsTxbHTJWCD6ePODlQKQgOK/i6dnxQGei8ED4mPODyP/z/EL/AL/CRMjAW6m+jLTAAAAAElFTkSuQmCC' }, $s = [ { desc: '\u8056\u8a95\u8868\u60c5\u5716\u793a', html: { path: 'faces/xmas', table: [ [ ['[O:-)x]', 'angel'], ['[xx(x]', 'dead'], ['[:)x]', 'smile'], ['[:o)x]', 'clown'], ['[:o)jx]', 'clown_jesus'], ['[:-(x]', 'frown'], ['[:~(x]', 'cry'], ['[;-)x]', 'wink'], ['[:-[x]', 'angry'], ['[:-]x]', 'devil'], ['[:Dx]', 'biggrin'], ['[:Ox]', 'oh'], ['[:Px]', 'tongue'], ['[^3^x]', 'kiss'], ['[?_?x]', 'wonder'], ['#yupx#', 'agree'], ['#ngx#', 'donno'], ['#hehex#', 'hehe'], ['#lovex#', 'love'], ['#ohx#', 'surprise'] ], [ ['#assx#', 'ass'], ['[sosadx]', 'sosad'], ['#goodx#', 'good'], ['#hohox#', 'hoho'], ['#killx#', 'kill'], ['#byex#', 'bye'], ['[Z_Zx]', 'z'], ['[@_@x]', '@'], ['#adorex#', 'adore'], ['#adore2x#', 'adore2'], ['[???x]', 'wonder2'], ['[bangheadx]', 'banghead'], ['[bouncerx]', 'bouncer'] ], [ ['[censoredx]', 'censored'], ['[flowerfacex]', 'flowerface'], ['[shockingx]', 'shocking'], ['[photox]', 'photo'], ['[yipesx]', 'yipes'], ['[yipes2x]', 'yipes2'], ['[yipes3x]', 'yipes3'], ['[yipes4x]', 'yipes4'], ['[369x]', '369'], ['[bombx]', 'bomb'], ['[slickx]', 'slick'], ['[fuckx]', 'diu'], ['#nox#', 'no'], ['#kill2x#', 'kill2'] ], [ ['#kill3x#', 'kill3'], ['#cnx#', 'chicken'], ['#cn2x#', 'chicken2'], ['[bouncyx]', 'bouncy'], ['[bouncy2x]', 'bouncy2'], ['#firex#', 'fire'] ] ], span: [ ['[offtopicx]', 'offtopic'] ] } }, { desc: '\u7da0\u5e3d\u8868\u60c5\u5716\u793a', html: { path: 'faces/xmas/green', table: [ [ ['[:)gx]', 'smile'], ['[:o)gx]', 'clown'], ['[:-(gx]', 'frown'], ['[:~(gx]', 'cry'], ['#yupgx#', 'agree'] ], [ ['[sosadgx]', 'sosad'], ['#goodgx#', 'good'], ['#byegx#', 'bye'] ], [ ['[369gx]', '369'], ['[fuckgx]', 'diu'] ] ] } }, { desc: '\u65b0\u5e74\u8868\u60c5\u5716\u793a', html: { path: 'faces/newyear', table: [ [ ['[:o)n]', 'clown'], ['[:o)2n]', 'clown2'], ['[:o)3n]', 'clown3'], ['#assn#', 'ass'], ['[sosadn]', 'sosad'], ['[sosad2n]', 'sosad2'], ['[sosad3n]', 'sosad3'], ['[bangheadn]', 'banghead'], ['[banghead2n]', 'banghead2'] ], [ ['[yipesn]', 'yipes'], ['[369n]', '369'], ['[3692n]', '3692'], ['[fuckn]', 'diu'], ['[bouncern]', 'bouncer'] ] ], span: [ ['[offtopicn]', 'offtopic'], ['[offtopic2n]', 'offtopic2'] ] } }, { desc: '\u8166\u9b54\u8868\u60c5\u5716\u793a', html: { path: 'faces/lomore', table: [ [ ['xx(lm', 'dead'], [':)lm', 'smile'], [':o)lm', 'clown'], [':o)2lm', 'clown2'], [':o)3lm', 'clown3'], [':o)4lm', 'clown4'], [':-(lm', 'frown'], [':~(lm', 'cry'], [';-)lm', 'wink'], [':-[lm', 'angry'], [':-]lm', 'devil'], [':Dlm', 'biggrin'], [':Olm', 'oh'], [':Plm', 'tongue'], ['^3^lm', 'kiss'], ['?_?lm', 'wonder'] ], [ ['#yup#lm', 'agree'], ['#hehe#lm', 'hehe'], ['#love#lm', 'love'], ['#oh#lm', 'surprise'], ['#ass#lm', 'ass'], ['[sosad]lm', 'sosad'], ['#good#lm', 'good'], ['#hoho#lm', 'hoho'], ['#kill#lm', 'kill'], ['@_@lm', '@'], ['#adore#lm', 'adore'], ['???lm', 'wonder2'], ['[banghead]lm', 'banghead'], ['[bouncer]lm', 'bouncer'], ['[flowerface]lm', 'flowerface'], ['[shocking]lm', 'shocking'], ['[photo]lm', 'photo'], ['[yipes]lm', 'yipes'], ['[369]lm', '369'], ['[slick]lm', 'slick'], ['fucklm', 'diu'], ['fuck2lm', 'diu2'], ['#kill2#lm', 'Kill2lm'], ['[offtopic]lm', 'offtopic'] ] ] } }, { desc: 'SARS\u8868\u60c5\u5716\u793a', html: { path: 'faces/sick', table: [ [ ['[O:-)sk]', 'angel'], ['[:o)sk]', 'clown'], ['[:-[sk]', 'angry'], ['[:-]sk]', 'devil'], ['#yupsk#', 'agree'], ['#ngsk#', 'donno'], ['#cnsk#', 'chicken'] ], [ ['#asssk#', 'ass'], ['[sosadsk]', 'sosad'], ['#hohosk#', 'hoho'], ['#hoho2sk#', 'hoho2'], ['#killsk#', 'kill'], ['#byesk#', 'bye'], ['[@_@sk]', '@'], ['#adoresk# ', 'adore'], ['[bangheadsk]', 'banghead'] ], [ ['[flowerfacesk]', 'flowerface'], ['[shockingsk]', 'shocking'], ['[photosk]', 'photo'], ['#firesk#', 'fire'], ['[369sk]', '369'], ['[fucksk]', 'diu'] ] ] } }, { desc: '\u8349\u6ce5\u99ac\u8868\u60c5\u5716\u793a', html: { path: 'faces/alpaca', table: [ [ [':~(al', 'cry'], [':Oal', 'oh'], [':Pal', 'tongue'], ['#yup#al', 'agree'], ['#ng#al', 'donno'], ['#hehe#al', 'hehe'], ['#love#al', 'love'], ['#oh#al', 'surprise'], ['#cn#al', 'chicken'] ], [ ['#ass#al', 'ass'], ['[sosad]al', 'sosad'], ['#good#al', 'good'], ['#kill#al', 'kill'], ['#bye#al', 'bye'], ['Z_Zal', 'z'], ['@_@al', '@'], ['#adore#al', 'adore'], ['???al', 'wonder2'], ['[banghead]al', 'banghead'], ['[bouncer]al', 'bouncer'], ['[bouncy]al', 'bouncy'] ], [ ['[flowerface]al', 'flowerface'], ['[shocking]al', 'shocking'], ['[photo]al', 'photo'], ['#fire#al', 'fire'], ['[yipes]al', 'yipes'], ['[369]al', '369'], ['[bomb]al', 'bomb'], ['[slick]al', 'slick'], ['#alfuckal#', 'diu'], ['#no#al', 'no'], ['#kill2#al', 'kill2'] ] ] } }, { desc: '\u98df\u9b3c\u8868\u60c5\u5716\u793a', html: { path: 'faces/ghost', table: [ [ ['O:-)g', 'angel'], ['xx(g', 'dead'], [':)g', 'smile'], [':o)g', 'clown'], [':-(g', 'frown'], [':~(g', 'cry'], [';-)g', 'wink'], [':-[g', 'angry'], [':-]g', 'devil'], [':Dg', 'biggrin'], [':Og', 'oh'], [':Pg', 'tongue'], ['^3^g', 'kiss'], ['?_?g', 'wonder'], ['#yup#g', 'agree'], ['#ng#g', 'donno'], ['#hehe#g', 'hehe'], ['#love#g', 'love'], ['#oh#g', 'surprise'], ['#cn#g', 'chicken'] ], [ ['#ass#g', 'ass'], ['[sosad]g', 'sosad'], ['#good#g', 'good'], ['#hoho#g', 'hoho'], ['#kill#g', 'kill'], ['#bye#g', 'bye'], ['Z_Zg', 'z'], ['@_@g', '@'], ['#adore#g', 'adore'], ['???g', 'wonder2'], ['[banghead]g', 'banghead'], ['[bouncer]g', 'bouncer'], ['[bouncy]g', 'bouncy'], ['[offtopic]g', 'offtopic'] ], [ ['[censored]g', 'censored'], ['[flowerface]g', 'flowerface'], ['[shocking]g', 'shocking'], ['[photo]g', 'photo'], ['#fire#g', 'fire'], ['[yipes]g', 'yipes'], ['[369]g', '369'], ['[bomb]g', 'bomb'], ['[slick]g', 'slick'], ['fuckg', 'diu'], ['#no#g', 'no'], ['#kill2#g', 'kill2'] ] ] } }, { desc: '\u6c34\u5f69\u8868\u60c5\u5716\u793a', html: { path: 'faces/draw', table: [ [ ['O:-)dw', 'angel'], ['xx(dw', 'dead'], [':)dw', 'smile'], [':o)dw', 'clown'], [':-(dw', 'frown'], [':~(dw', 'cry'], [';-)dw', 'wink'], [':-[dw', 'angry'], [':-]dw', 'devil'], [':Ddw', 'biggrin'], [':Odw', 'oh'], [':Pdw', 'tongue'], ['^3^dw', 'kiss'], ['?_?dw', 'wonder'], ['#yup#dw', 'agree'], ['#ng#dw', 'donno'], ['#hehe#dw', 'hehe'], ['#love#dw', 'love'], ['#oh#dw', 'surprise'] ], [ ['#cn#dw', 'chicken'], ['#ass#dw', 'ass'], ['[sosad]dw', 'sosad'], ['#good#dw', 'good'], ['#hoho#dw', 'hoho'], ['#kill#dw', 'kill'], ['#bye#dw', 'bye'], ['Z_Zdw', 'z'], ['@_@dw', '@'], ['#adore#dw', 'adore'], ['???dw', 'wonder2'], ['[banghead]dw', 'banghead'], ['[bouncer]dw', 'bouncer'] ], [ ['[bouncy]dw', 'bouncy'], ['[censored]dw', 'censored'], ['[flowerface]dw', 'flowerface'], ['[shocking]dw', 'shocking'], ['[photo]dw', 'photo'], ['#fire#dw', 'fire'], ['[yipes]dw', 'yipes'], ['[369]dw', '369'], ['[bomb]dw', 'bomb'], ['[slick]dw', 'slick'], ['fuckdw', 'diu'], ['#no#dw', 'no'], ['#kill2#dw', 'kill2'], ['[offtopic]dw', 'offtopic'] ] ] } }, { desc: '\u5317\u6975\u8868\u60c5\u5716\u793a', html: { path: 'faces/frozen', table: [ [ ['O:-)fr', 'angel'], ['xx(fr', 'dead'], [':)fr', 'smile'], [':o)fr', 'clown'], [':-(fr', 'frown'], [':~(fr', 'cry'], [';-)fr', 'wink'], [':-[fr', 'angry'], [':-]fr', 'devil'], [':Dfr', 'biggrin'], [':Ofr', 'oh'], [':Pfr', 'tongue'], ['^3^fr', 'kiss'], ['?_?fr', 'wonder'], ['#yup#fr', 'agree'], ['#ng#fr', 'donno'], ['#hehe#fr', 'hehe'], ['#love#fr', 'love'], ['#oh#fr', 'surprise'], ['#cn#fr', 'chicken'] ], [ ['#ass#fr', 'ass'], ['[sosad]fr', 'sosad'], ['#good#fr', 'good'], ['#hoho#fr', 'hoho'], ['#kill#fr', 'kill'], ['#bye#fr', 'bye'], ['Z_Zfr', 'z'], ['@_@fr', '@'], ['#adore#fr', 'adore'], ['???fr', 'wonder2'], ['[banghead]fr', 'banghead'], ['[banghead2]fr', 'banghead2'], ['[bouncer]fr', 'bouncer'], ['[bouncy]fr', 'bouncy'], ['[offtopic]fr', 'offtopic'] ], [ ['[censored]fr', 'censored'], ['[flowerface]fr', 'flowerface'], ['[shocking]fr', 'shocking'], ['[photo]fr', 'photo'], ['#fire#fr', 'fire'], ['[yipes]fr', 'yipes'], ['[369]fr', '369'], ['[bomb]fr', 'bomb'], ['[slick]fr', 'slick'], ['fuckfr', 'diu'], ['#no#fr', 'no'], ['#kill2#fr', 'kill2'] ] ] } }, { desc: 'Pixel\u8868\u60c5\u5716\u793a', html: { path: 'faces/pixel', table: [ [ ['O:-)px', 'angel'], ['xx(px', 'dead'], [':)px', 'smile'], [':o)px', 'clown'], [':-(px', 'frown'], [':~(px', 'cry'], [';-)px', 'wink'], [':-[px', 'angry'], [':-]px', 'devil'], [':Dpx', 'biggrin'], [':Opx', 'oh'], [':Ppx', 'tongue'], ['^3^px', 'kiss'], ['?_?px', 'wonder'], ['#yup#px', 'agree'], ['#ng#px', 'donno'], ['#hehe#px', 'hehe'], ['#love#px', 'love'], ['#oh#px', 'surprise'], ['#cn#px', 'chicken'] ], [ ['#ass#px', 'ass'], ['[sosad]px', 'sosad'], ['#good#px', 'good'], ['#hoho#px', 'hoho'], ['#kill#px', 'kill'], ['#bye#px', 'bye'], ['Z_Zpx', 'z'], ['@_@px', '@'], ['#adore#px', 'adore'], ['???px', 'wonder2'], ['[banghead]px', 'banghead'], ['[bouncer]px', 'bouncer'], ['[bouncy]px', 'bouncy'], ['[offtopic]px', 'offtopic'] ], [ ['[censored]px', 'censored'], ['[flowerface]px', 'flowerface'], ['[shocking]px', 'shocking'], ['[photo]px', 'photo'], ['#fire#px', 'fire'], ['[yipes]px', 'yipes'], ['[369]px', '369'], ['[bomb]px', 'bomb'], ['[slick]px', 'slick'], ['fuckpx', 'diu'], ['#no#px', 'no'], ['#kill2#px', 'kill2'] ] ] } }, { desc: '\u7279\u6b8a\u5716\u793a', html: { path: 'faces', table: [ [ ['#good2#', 'ThumbUp'], ['#bad#', 'ThumbDown'], ['[img]/faces/surprise2.gif[/img]', 'surprise2'], ['[img]/faces/beer.gif[/img]', 'beer'] ] ] } } ]; /*! * jQuery JavaScript Library v1.12.0 * http://jquery.com/ * * Includes Sizzle.js * http://sizzlejs.com/ * * Copyright jQuery Foundation and other contributors * Released under the MIT license * http://jquery.org/license * * Date: 2016-01-08T19:56Z */ (function( global, factory ) { if ( typeof module === "object" && typeof module.exports === "object" ) { // For CommonJS and CommonJS-like environments where a proper `window` // is present, execute the factory and get jQuery. // For environments that do not have a `window` with a `document` // (such as Node.js), expose a factory as module.exports. // This accentuates the need for the creation of a real `window`. // e.g. var jQuery = require("jquery")(window); // See ticket #14549 for more info. module.exports = global.document ? factory( global, true ) : function( w ) { if ( !w.document ) { throw new Error( "jQuery requires a window with a document" ); } return factory( w ); }; } else { factory( global ); } // Pass this if window is not defined yet }(typeof window !== "undefined" ? window : this, function( window, noGlobal ) { // Support: Firefox 18+ // Can't be in strict mode, several libs including ASP.NET trace // the stack via arguments.caller.callee and Firefox dies if // you try to trace through "use strict" call chains. (#13335) //"use strict"; var deletedIds = []; var document = window.document; var slice = deletedIds.slice; var concat = deletedIds.concat; var push = deletedIds.push; var indexOf = deletedIds.indexOf; var class2type = {}; var toString = class2type.toString; var hasOwn = class2type.hasOwnProperty; var support = {}; var version = "1.12.0", // Define a local copy of jQuery jQuery = function( selector, context ) { // The jQuery object is actually just the init constructor 'enhanced' // Need init if jQuery is called (just allow error to be thrown if not included) return new jQuery.fn.init( selector, context ); }, // Support: Android<4.1, IE<9 // Make sure we trim BOM and NBSP rtrim = /^[\s\uFEFF\xA0]+|[\s\uFEFF\xA0]+$/g, // Matches dashed string for camelizing rmsPrefix = /^-ms-/, rdashAlpha = /-([\da-z])/gi, // Used by jQuery.camelCase as callback to replace() fcamelCase = function( all, letter ) { return letter.toUpperCase(); }; jQuery.fn = jQuery.prototype = { // The current version of jQuery being used jquery: version, constructor: jQuery, // Start with an empty selector selector: "", // The default length of a jQuery object is 0 length: 0, toArray: function() { return slice.call( this ); }, // Get the Nth element in the matched element set OR // Get the whole matched element set as a clean array get: function( num ) { return num != null ? // Return just the one element from the set ( num < 0 ? this[ num + this.length ] : this[ num ] ) : // Return all the elements in a clean array slice.call( this ); }, // Take an array of elements and push it onto the stack // (returning the new matched element set) pushStack: function( elems ) { // Build a new jQuery matched element set var ret = jQuery.merge( this.constructor(), elems ); // Add the old object onto the stack (as a reference) ret.prevObject = this; ret.context = this.context; // Return the newly-formed element set return ret; }, // Execute a callback for every element in the matched set. each: function( callback ) { return jQuery.each( this, callback ); }, map: function( callback ) { return this.pushStack( jQuery.map( this, function( elem, i ) { return callback.call( elem, i, elem ); } ) ); }, slice: function() { return this.pushStack( slice.apply( this, arguments ) ); }, first: function() { return this.eq( 0 ); }, last: function() { return this.eq( -1 ); }, eq: function( i ) { var len = this.length, j = +i + ( i < 0 ? len : 0 ); return this.pushStack( j >= 0 && j < len ? [ this[ j ] ] : [] ); }, end: function() { return this.prevObject || this.constructor(); }, // For internal use only. // Behaves like an Array's method, not like a jQuery method. push: push, sort: deletedIds.sort, splice: deletedIds.splice }; jQuery.extend = jQuery.fn.extend = function() { var src, copyIsArray, copy, name, options, clone, target = arguments[ 0 ] || {}, i = 1, length = arguments.length, deep = false; // Handle a deep copy situation if ( typeof target === "boolean" ) { deep = target; // skip the boolean and the target target = arguments[ i ] || {}; i++; } // Handle case when target is a string or something (possible in deep copy) if ( typeof target !== "object" && !jQuery.isFunction( target ) ) { target = {}; } // extend jQuery itself if only one argument is passed if ( i === length ) { target = this; i--; } for ( ; i < length; i++ ) { // Only deal with non-null/undefined values if ( ( options = arguments[ i ] ) != null ) { // Extend the base object for ( name in options ) { src = target[ name ]; copy = options[ name ]; // Prevent never-ending loop if ( target === copy ) { continue; } // Recurse if we're merging plain objects or arrays if ( deep && copy && ( jQuery.isPlainObject( copy ) || ( copyIsArray = jQuery.isArray( copy ) ) ) ) { if ( copyIsArray ) { copyIsArray = false; clone = src && jQuery.isArray( src ) ? src : []; } else { clone = src && jQuery.isPlainObject( src ) ? src : {}; } // Never move original objects, clone them target[ name ] = jQuery.extend( deep, clone, copy ); // Don't bring in undefined values } else if ( copy !== undefined ) { target[ name ] = copy; } } } } // Return the modified object return target; }; jQuery.extend( { // Unique for each copy of jQuery on the page expando: "jQuery" + ( version + Math.random() ).replace( /\D/g, "" ), // Assume jQuery is ready without the ready module isReady: true, error: function( msg ) { throw new Error( msg ); }, noop: function() {}, // See test/unit/core.js for details concerning isFunction. // Since version 1.3, DOM methods and functions like alert // aren't supported. They return false on IE (#2968). isFunction: function( obj ) { return jQuery.type( obj ) === "function"; }, isArray: Array.isArray || function( obj ) { return jQuery.type( obj ) === "array"; }, isWindow: function( obj ) { /* jshint eqeqeq: false */ return obj != null && obj == obj.window; }, isNumeric: function( obj ) { // parseFloat NaNs numeric-cast false positives (null|true|false|"") // ...but misinterprets leading-number strings, particularly hex literals ("0x...") // subtraction forces infinities to NaN // adding 1 corrects loss of precision from parseFloat (#15100) var realStringObj = obj && obj.toString(); return !jQuery.isArray( obj ) && ( realStringObj - parseFloat( realStringObj ) + 1 ) >= 0; }, isEmptyObject: function( obj ) { var name; for ( name in obj ) { return false; } return true; }, isPlainObject: function( obj ) { var key; // Must be an Object. // Because of IE, we also have to check the presence of the constructor property. // Make sure that DOM nodes and window objects don't pass through, as well if ( !obj || jQuery.type( obj ) !== "object" || obj.nodeType || jQuery.isWindow( obj ) ) { return false; } try { // Not own constructor property must be Object if ( obj.constructor && !hasOwn.call( obj, "constructor" ) && !hasOwn.call( obj.constructor.prototype, "isPrototypeOf" ) ) { return false; } } catch ( e ) { // IE8,9 Will throw exceptions on certain host objects #9897 return false; } // Support: IE<9 // Handle iteration over inherited properties before own properties. if ( !support.ownFirst ) { for ( key in obj ) { return hasOwn.call( obj, key ); } } // Own properties are enumerated firstly, so to speed up, // if last one is own, then all properties are own. for ( key in obj ) {} return key === undefined || hasOwn.call( obj, key ); }, type: function( obj ) { if ( obj == null ) { return obj + ""; } return typeof obj === "object" || typeof obj === "function" ? class2type[ toString.call( obj ) ] || "object" : typeof obj; }, // Workarounds based on findings by Jim Driscoll // http://weblogs.java.net/blog/driscoll/archive/2009/09/08/eval-javascript-global-context globalEval: function( data ) { // if ( data && jQuery.trim( data ) ) { // // // We use execScript on Internet Explorer // // We use an anonymous function so that context is window // // rather than jQuery in Firefox // ( window.execScript || function( data ) { // window[ "eval" ].call( window, data ); // jscs:ignore requireDotNotation // } )( data ); // } }, // Convert dashed to camelCase; used by the css and data modules // Microsoft forgot to hump their vendor prefix (#9572) camelCase: function( string ) { return string.replace( rmsPrefix, "ms-" ).replace( rdashAlpha, fcamelCase ); }, nodeName: function( elem, name ) { return elem.nodeName && elem.nodeName.toLowerCase() === name.toLowerCase(); }, each: function( obj, callback ) { var length, i = 0; if ( isArrayLike( obj ) ) { length = obj.length; for ( ; i < length; i++ ) { if ( callback.call( obj[ i ], i, obj[ i ] ) === false ) { break; } } } else { for ( i in obj ) { if ( callback.call( obj[ i ], i, obj[ i ] ) === false ) { break; } } } return obj; }, // Support: Android<4.1, IE<9 trim: function( text ) { return text == null ? "" : ( text + "" ).replace( rtrim, "" ); }, // results is for internal usage only makeArray: function( arr, results ) { var ret = results || []; if ( arr != null ) { if ( isArrayLike( Object( arr ) ) ) { jQuery.merge( ret, typeof arr === "string" ? [ arr ] : arr ); } else { push.call( ret, arr ); } } return ret; }, inArray: function( elem, arr, i ) { var len; if ( arr ) { if ( indexOf ) { return indexOf.call( arr, elem, i ); } len = arr.length; i = i ? i < 0 ? Math.max( 0, len + i ) : i : 0; for ( ; i < len; i++ ) { // Skip accessing in sparse arrays if ( i in arr && arr[ i ] === elem ) { return i; } } } return -1; }, merge: function( first, second ) { var len = +second.length, j = 0, i = first.length; while ( j < len ) { first[ i++ ] = second[ j++ ]; } // Support: IE<9 // Workaround casting of .length to NaN on otherwise arraylike objects (e.g., NodeLists) if ( len !== len ) { while ( second[ j ] !== undefined ) { first[ i++ ] = second[ j++ ]; } } first.length = i; return first; }, grep: function( elems, callback, invert ) { var callbackInverse, matches = [], i = 0, length = elems.length, callbackExpect = !invert; // Go through the array, only saving the items // that pass the validator function for ( ; i < length; i++ ) { callbackInverse = !callback( elems[ i ], i ); if ( callbackInverse !== callbackExpect ) { matches.push( elems[ i ] ); } } return matches; }, // arg is for internal usage only map: function( elems, callback, arg ) { var length, value, i = 0, ret = []; // Go through the array, translating each of the items to their new values if ( isArrayLike( elems ) ) { length = elems.length; for ( ; i < length; i++ ) { value = callback( elems[ i ], i, arg ); if ( value != null ) { ret.push( value ); } } // Go through every key on the object, } else { for ( i in elems ) { value = callback( elems[ i ], i, arg ); if ( value != null ) { ret.push( value ); } } } // Flatten any nested arrays return concat.apply( [], ret ); }, // A global GUID counter for objects guid: 1, // Bind a function to a context, optionally partially applying any // arguments. proxy: function( fn, context ) { var args, proxy, tmp; if ( typeof context === "string" ) { tmp = fn[ context ]; context = fn; fn = tmp; } // Quick check to determine if target is callable, in the spec // this throws a TypeError, but we will just return undefined. if ( !jQuery.isFunction( fn ) ) { return undefined; } // Simulated bind args = slice.call( arguments, 2 ); proxy = function() { return fn.apply( context || this, args.concat( slice.call( arguments ) ) ); }; // Set the guid of unique handler to the same of original handler, so it can be removed proxy.guid = fn.guid = fn.guid || jQuery.guid++; return proxy; }, now: function() { return +( new Date() ); }, // jQuery.support is not used in Core but other projects attach their // properties to it so it needs to exist. support: support } ); // JSHint would error on this code due to the Symbol not being defined in ES5. // Defining this global in .jshintrc would create a danger of using the global // unguarded in another place, it seems safer to just disable JSHint for these // three lines. /* jshint ignore: start */ if ( typeof Symbol === "function" ) { jQuery.fn[ Symbol.iterator ] = deletedIds[ Symbol.iterator ]; } /* jshint ignore: end */ // Populate the class2type map jQuery.each( "Boolean Number String Function Array Date RegExp Object Error Symbol".split( " " ), function( i, name ) { class2type[ "[object " + name + "]" ] = name.toLowerCase(); } ); function isArrayLike( obj ) { // Support: iOS 8.2 (not reproducible in simulator) // `in` check used to prevent JIT error (gh-2145) // hasOwn isn't used here due to false negatives // regarding Nodelist length in IE var length = !!obj && "length" in obj && obj.length, type = jQuery.type( obj ); if ( type === "function" || jQuery.isWindow( obj ) ) { return false; } return type === "array" || length === 0 || typeof length === "number" && length > 0 && ( length - 1 ) in obj; } var Sizzle = /*! * Sizzle CSS Selector Engine v2.2.1 * http://sizzlejs.com/ * * Copyright jQuery Foundation and other contributors * Released under the MIT license * http://jquery.org/license * * Date: 2015-10-17 */ (function( window ) { var i, support, Expr, getText, isXML, tokenize, compile, select, outermostContext, sortInput, hasDuplicate, // Local document vars setDocument, document, docElem, documentIsHTML, rbuggyQSA, rbuggyMatches, matches, contains, // Instance-specific data expando = "sizzle" + 1 * new Date(), preferredDoc = window.document, dirruns = 0, done = 0, classCache = createCache(), tokenCache = createCache(), compilerCache = createCache(), sortOrder = function( a, b ) { if ( a === b ) { hasDuplicate = true; } return 0; }, // General-purpose constants MAX_NEGATIVE = 1 << 31, // Instance methods hasOwn = ({}).hasOwnProperty, arr = [], pop = arr.pop, push_native = arr.push, push = arr.push, slice = arr.slice, // Use a stripped-down indexOf as it's faster than native // http://jsperf.com/thor-indexof-vs-for/5 indexOf = function( list, elem ) { var i = 0, len = list.length; for ( ; i < len; i++ ) { if ( list[i] === elem ) { return i; } } return -1; }, booleans = "checked|selected|async|autofocus|autoplay|controls|defer|disabled|hidden|ismap|loop|multiple|open|readonly|required|scoped", // Regular expressions // http://www.w3.org/TR/css3-selectors/#whitespace whitespace = "[\\x20\\t\\r\\n\\f]", // http://www.w3.org/TR/CSS21/syndata.html#value-def-identifier identifier = "(?:\\\\.|[\\w-]|[^\\x00-\\xa0])+", // Attribute selectors: http://www.w3.org/TR/selectors/#attribute-selectors attributes = "\\[" + whitespace + "*(" + identifier + ")(?:" + whitespace + // Operator (capture 2) "*([*^$|!~]?=)" + whitespace + // "Attribute values must be CSS identifiers [capture 5] or strings [capture 3 or capture 4]" "*(?:'((?:\\\\.|[^\\\\'])*)'|\"((?:\\\\.|[^\\\\\"])*)\"|(" + identifier + "))|)" + whitespace + "*\\]", pseudos = ":(" + identifier + ")(?:\\((" + // To reduce the number of selectors needing tokenize in the preFilter, prefer arguments: // 1. quoted (capture 3; capture 4 or capture 5) "('((?:\\\\.|[^\\\\'])*)'|\"((?:\\\\.|[^\\\\\"])*)\")|" + // 2. simple (capture 6) "((?:\\\\.|[^\\\\()[\\]]|" + attributes + ")*)|" + // 3. anything else (capture 2) ".*" + ")\\)|)", // Leading and non-escaped trailing whitespace, capturing some non-whitespace characters preceding the latter rwhitespace = new RegExp( whitespace + "+", "g" ), rtrim = new RegExp( "^" + whitespace + "+|((?:^|[^\\\\])(?:\\\\.)*)" + whitespace + "+$", "g" ), rcomma = new RegExp( "^" + whitespace + "*," + whitespace + "*" ), rcombinators = new RegExp( "^" + whitespace + "*([>+~]|" + whitespace + ")" + whitespace + "*" ), rattributeQuotes = new RegExp( "=" + whitespace + "*([^\\]'\"]*?)" + whitespace + "*\\]", "g" ), rpseudo = new RegExp( pseudos ), ridentifier = new RegExp( "^" + identifier + "$" ), matchExpr = { "ID": new RegExp( "^#(" + identifier + ")" ), "CLASS": new RegExp( "^\\.(" + identifier + ")" ), "TAG": new RegExp( "^(" + identifier + "|[*])" ), "ATTR": new RegExp( "^" + attributes ), "PSEUDO": new RegExp( "^" + pseudos ), "CHILD": new RegExp( "^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\(" + whitespace + "*(even|odd|(([+-]|)(\\d*)n|)" + whitespace + "*(?:([+-]|)" + whitespace + "*(\\d+)|))" + whitespace + "*\\)|)", "i" ), "bool": new RegExp( "^(?:" + booleans + ")$", "i" ), // For use in libraries implementing .is() // We use this for POS matching in `select` "needsContext": new RegExp( "^" + whitespace + "*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\(" + whitespace + "*((?:-\\d)?\\d*)" + whitespace + "*\\)|)(?=[^-]|$)", "i" ) }, rinputs = /^(?:input|select|textarea|button)$/i, rheader = /^h\d$/i, rnative = /^[^{]+\{\s*\[native \w/, // Easily-parseable/retrievable ID or TAG or CLASS selectors rquickExpr = /^(?:#([\w-]+)|(\w+)|\.([\w-]+))$/, rsibling = /[+~]/, rescape = /'|\\/g, // CSS escapes http://www.w3.org/TR/CSS21/syndata.html#escaped-characters runescape = new RegExp( "\\\\([\\da-f]{1,6}" + whitespace + "?|(" + whitespace + ")|.)", "ig" ), funescape = function( _, escaped, escapedWhitespace ) { var high = "0x" + escaped - 0x10000; // NaN means non-codepoint // Support: Firefox<24 // Workaround erroneous numeric interpretation of +"0x" return high !== high || escapedWhitespace ? escaped : high < 0 ? // BMP codepoint String.fromCharCode( high + 0x10000 ) : // Supplemental Plane codepoint (surrogate pair) String.fromCharCode( high >> 10 | 0xD800, high & 0x3FF | 0xDC00 ); }, // Used for iframes // See setDocument() // Removing the function wrapper causes a "Permission Denied" // error in IE unloadHandler = function() { setDocument(); }; // Optimize for push.apply( _, NodeList ) try { push.apply( (arr = slice.call( preferredDoc.childNodes )), preferredDoc.childNodes ); // Support: Android<4.0 // Detect silently failing push.apply arr[ preferredDoc.childNodes.length ].nodeType; } catch ( e ) { push = { apply: arr.length ? // Leverage slice if possible function( target, els ) { push_native.apply( target, slice.call(els) ); } : // Support: IE<9 // Otherwise append directly function( target, els ) { var j = target.length, i = 0; // Can't trust NodeList.length while ( (target[j++] = els[i++]) ) {} target.length = j - 1; } }; } function Sizzle( selector, context, results, seed ) { var m, i, elem, nid, nidselect, match, groups, newSelector, newContext = context && context.ownerDocument, // nodeType defaults to 9, since context defaults to document nodeType = context ? context.nodeType : 9; results = results || []; // Return early from calls with invalid selector or context if ( typeof selector !== "string" || !selector || nodeType !== 1 && nodeType !== 9 && nodeType !== 11 ) { return results; } // Try to shortcut find operations (as opposed to filters) in HTML documents if ( !seed ) { if ( ( context ? context.ownerDocument || context : preferredDoc ) !== document ) { setDocument( context ); } context = context || document; if ( documentIsHTML ) { // If the selector is sufficiently simple, try using a "get*By*" DOM method // (excepting DocumentFragment context, where the methods don't exist) if ( nodeType !== 11 && (match = rquickExpr.exec( selector )) ) { // ID selector if ( (m = match[1]) ) { // Document context if ( nodeType === 9 ) { if ( (elem = context.getElementById( m )) ) { // Support: IE, Opera, Webkit // TODO: identify versions // getElementById can match elements by name instead of ID if ( elem.id === m ) { results.push( elem ); return results; } } else { return results; } // Element context } else { // Support: IE, Opera, Webkit // TODO: identify versions // getElementById can match elements by name instead of ID if ( newContext && (elem = newContext.getElementById( m )) && contains( context, elem ) && elem.id === m ) { results.push( elem ); return results; } } // Type selector } else if ( match[2] ) { push.apply( results, context.getElementsByTagName( selector ) ); return results; // Class selector } else if ( (m = match[3]) && support.getElementsByClassName && context.getElementsByClassName ) { push.apply( results, context.getElementsByClassName( m ) ); return results; } } // Take advantage of querySelectorAll if ( support.qsa && !compilerCache[ selector + " " ] && (!rbuggyQSA || !rbuggyQSA.test( selector )) ) { if ( nodeType !== 1 ) { newContext = context; newSelector = selector; // qSA looks outside Element context, which is not what we want // Thanks to Andrew Dupont for this workaround technique // Support: IE <=8 // Exclude object elements } else if ( context.nodeName.toLowerCase() !== "object" ) { // Capture the context ID, setting it first if necessary if ( (nid = context.getAttribute( "id" )) ) { nid = nid.replace( rescape, "\\$&" ); } else { context.setAttribute( "id", (nid = expando) ); } // Prefix every selector in the list groups = tokenize( selector ); i = groups.length; nidselect = ridentifier.test( nid ) ? "#" + nid : "[id='" + nid + "']"; while ( i-- ) { groups[i] = nidselect + " " + toSelector( groups[i] ); } newSelector = groups.join( "," ); // Expand context for sibling selectors newContext = rsibling.test( selector ) && testContext( context.parentNode ) || context; } if ( newSelector ) { try { push.apply( results, newContext.querySelectorAll( newSelector ) ); return results; } catch ( qsaError ) { } finally { if ( nid === expando ) { context.removeAttribute( "id" ); } } } } } } // All others return select( selector.replace( rtrim, "$1" ), context, results, seed ); } /** * Create key-value caches of limited size * @returns {function(string, object)} Returns the Object data after storing it on itself with * property name the (space-suffixed) string and (if the cache is larger than Expr.cacheLength) * deleting the oldest entry */ function createCache() { var keys = []; function cache( key, value ) { // Use (key + " ") to avoid collision with native prototype properties (see Issue #157) if ( keys.push( key + " " ) > Expr.cacheLength ) { // Only keep the most recent entries delete cache[ keys.shift() ]; } return (cache[ key + " " ] = value); } return cache; } /** * Mark a function for special use by Sizzle * @param {Function} fn The function to mark */ function markFunction( fn ) { fn[ expando ] = true; return fn; } /** * Support testing using an element * @param {Function} fn Passed the created div and expects a boolean result */ function assert( fn ) { var div = document.createElement("div"); try { return !!fn( div ); } catch (e) { return false; } finally { // Remove from its parent by default if ( div.parentNode ) { div.parentNode.removeChild( div ); } // release memory in IE div = null; } } /** * Adds the same handler for all of the specified attrs * @param {String} attrs Pipe-separated list of attributes * @param {Function} handler The method that will be applied */ function addHandle( attrs, handler ) { var arr = attrs.split("|"), i = arr.length; while ( i-- ) { Expr.attrHandle[ arr[i] ] = handler; } } /** * Checks document order of two siblings * @param {Element} a * @param {Element} b * @returns {Number} Returns less than 0 if a precedes b, greater than 0 if a follows b */ function siblingCheck( a, b ) { var cur = b && a, diff = cur && a.nodeType === 1 && b.nodeType === 1 && ( ~b.sourceIndex || MAX_NEGATIVE ) - ( ~a.sourceIndex || MAX_NEGATIVE ); // Use IE sourceIndex if available on both nodes if ( diff ) { return diff; } // Check if b follows a if ( cur ) { while ( (cur = cur.nextSibling) ) { if ( cur === b ) { return -1; } } } return a ? 1 : -1; } /** * Returns a function to use in pseudos for input types * @param {String} type */ function createInputPseudo( type ) { return function( elem ) { var name = elem.nodeName.toLowerCase(); return name === "input" && elem.type === type; }; } /** * Returns a function to use in pseudos for buttons * @param {String} type */ function createButtonPseudo( type ) { return function( elem ) { var name = elem.nodeName.toLowerCase(); return (name === "input" || name === "button") && elem.type === type; }; } /** * Returns a function to use in pseudos for positionals * @param {Function} fn */ function createPositionalPseudo( fn ) { return markFunction(function( argument ) { argument = +argument; return markFunction(function( seed, matches ) { var j, matchIndexes = fn( [], seed.length, argument ), i = matchIndexes.length; // Match elements found at the specified indexes while ( i-- ) { if ( seed[ (j = matchIndexes[i]) ] ) { seed[j] = !(matches[j] = seed[j]); } } }); }); } /** * Checks a node for validity as a Sizzle context * @param {Element|Object=} context * @returns {Element|Object|Boolean} The input node if acceptable, otherwise a falsy value */ function testContext( context ) { return context && typeof context.getElementsByTagName !== "undefined" && context; } // Expose support vars for convenience support = Sizzle.support = {}; /** * Detects XML nodes * @param {Element|Object} elem An element or a document * @returns {Boolean} True iff elem is a non-HTML XML node */ isXML = Sizzle.isXML = function( elem ) { // documentElement is verified for cases where it doesn't yet exist // (such as loading iframes in IE - #4833) var documentElement = elem && (elem.ownerDocument || elem).documentElement; return documentElement ? documentElement.nodeName !== "HTML" : false; }; /** * Sets document-related variables once based on the current document * @param {Element|Object} [doc] An element or document object to use to set the document * @returns {Object} Returns the current document */ setDocument = Sizzle.setDocument = function( node ) { var hasCompare, parent, doc = node ? node.ownerDocument || node : preferredDoc; // Return early if doc is invalid or already selected if ( doc === document || doc.nodeType !== 9 || !doc.documentElement ) { return document; } // Update global variables document = doc; docElem = document.documentElement; documentIsHTML = !isXML( document ); // Support: IE 9-11, Edge // Accessing iframe documents after unload throws "permission denied" errors (jQuery #13936) if ( (parent = document.defaultView) && parent.top !== parent ) { // Support: IE 11 if ( parent.addEventListener ) { parent.addEventListener( "unload", unloadHandler, false ); // Support: IE 9 - 10 only } else if ( parent.attachEvent ) { parent.attachEvent( "onunload", unloadHandler ); } } /* Attributes ---------------------------------------------------------------------- */ // Support: IE<8 // Verify that getAttribute really returns attributes and not properties // (excepting IE8 booleans) support.attributes = assert(function( div ) { div.className = "i"; return !div.getAttribute("className"); }); /* getElement(s)By* ---------------------------------------------------------------------- */ // Check if getElementsByTagName("*") returns only elements support.getElementsByTagName = assert(function( div ) { div.appendChild( document.createComment("") ); return !div.getElementsByTagName("*").length; }); // Support: IE<9 support.getElementsByClassName = rnative.test( document.getElementsByClassName ); // Support: IE<10 // Check if getElementById returns elements by name // The broken getElementById methods don't pick up programatically-set names, // so use a roundabout getElementsByName test support.getById = assert(function( div ) { docElem.appendChild( div ).id = expando; return !document.getElementsByName || !document.getElementsByName( expando ).length; }); // ID find and filter if ( support.getById ) { Expr.find["ID"] = function( id, context ) { if ( typeof context.getElementById !== "undefined" && documentIsHTML ) { var m = context.getElementById( id ); return m ? [ m ] : []; } }; Expr.filter["ID"] = function( id ) { var attrId = id.replace( runescape, funescape ); return function( elem ) { return elem.getAttribute("id") === attrId; }; }; } else { // Support: IE6/7 // getElementById is not reliable as a find shortcut delete Expr.find["ID"]; Expr.filter["ID"] = function( id ) { var attrId = id.replace( runescape, funescape ); return function( elem ) { var node = typeof elem.getAttributeNode !== "undefined" && elem.getAttributeNode("id"); return node && node.value === attrId; }; }; } // Tag Expr.find["TAG"] = support.getElementsByTagName ? function( tag, context ) { if ( typeof context.getElementsByTagName !== "undefined" ) { return context.getElementsByTagName( tag ); // DocumentFragment nodes don't have gEBTN } else if ( support.qsa ) { return context.querySelectorAll( tag ); } } : function( tag, context ) { var elem, tmp = [], i = 0, // By happy coincidence, a (broken) gEBTN appears on DocumentFragment nodes too results = context.getElementsByTagName( tag ); // Filter out possible comments if ( tag === "*" ) { while ( (elem = results[i++]) ) { if ( elem.nodeType === 1 ) { tmp.push( elem ); } } return tmp; } return results; }; // Class Expr.find["CLASS"] = support.getElementsByClassName && function( className, context ) { if ( typeof context.getElementsByClassName !== "undefined" && documentIsHTML ) { return context.getElementsByClassName( className ); } }; /* QSA/matchesSelector ---------------------------------------------------------------------- */ // QSA and matchesSelector support // matchesSelector(:active) reports false when true (IE9/Opera 11.5) rbuggyMatches = []; // qSa(:focus) reports false when true (Chrome 21) // We allow this because of a bug in IE8/9 that throws an error // whenever `document.activeElement` is accessed on an iframe // So, we allow :focus to pass through QSA all the time to avoid the IE error // See http://bugs.jquery.com/ticket/13378 rbuggyQSA = []; if ( (support.qsa = rnative.test( document.querySelectorAll )) ) { // Build QSA regex // Regex strategy adopted from Diego Perini assert(function( div ) { // Select is set to empty string on purpose // This is to test IE's treatment of not explicitly // setting a boolean content attribute, // since its presence should be enough // http://bugs.jquery.com/ticket/12359 docElem.appendChild( div ).innerHTML = "" + ""; // Support: IE8, Opera 11-12.16 // Nothing should be selected when empty strings follow ^= or $= or *= // The test attribute must be unknown in Opera but "safe" for WinRT // http://msdn.microsoft.com/en-us/library/ie/hh465388.aspx#attribute_section if ( div.querySelectorAll("[msallowcapture^='']").length ) { rbuggyQSA.push( "[*^$]=" + whitespace + "*(?:''|\"\")" ); } // Support: IE8 // Boolean attributes and "value" are not treated correctly if ( !div.querySelectorAll("[selected]").length ) { rbuggyQSA.push( "\\[" + whitespace + "*(?:value|" + booleans + ")" ); } // Support: Chrome<29, Android<4.4, Safari<7.0+, iOS<7.0+, PhantomJS<1.9.8+ if ( !div.querySelectorAll( "[id~=" + expando + "-]" ).length ) { rbuggyQSA.push("~="); } // Webkit/Opera - :checked should return selected option elements // http://www.w3.org/TR/2011/REC-css3-selectors-20110929/#checked // IE8 throws error here and will not see later tests if ( !div.querySelectorAll(":checked").length ) { rbuggyQSA.push(":checked"); } // Support: Safari 8+, iOS 8+ // https://bugs.webkit.org/show_bug.cgi?id=136851 // In-page `selector#id sibing-combinator selector` fails if ( !div.querySelectorAll( "a#" + expando + "+*" ).length ) { rbuggyQSA.push(".#.+[+~]"); } }); assert(function( div ) { // Support: Windows 8 Native Apps // The type and name attributes are restricted during .innerHTML assignment var input = document.createElement("input"); input.setAttribute( "type", "hidden" ); div.appendChild( input ).setAttribute( "name", "D" ); // Support: IE8 // Enforce case-sensitivity of name attribute if ( div.querySelectorAll("[name=d]").length ) { rbuggyQSA.push( "name" + whitespace + "*[*^$|!~]?=" ); } // FF 3.5 - :enabled/:disabled and hidden elements (hidden elements are still enabled) // IE8 throws error here and will not see later tests if ( !div.querySelectorAll(":enabled").length ) { rbuggyQSA.push( ":enabled", ":disabled" ); } // Opera 10-11 does not throw on post-comma invalid pseudos div.querySelectorAll("*,:x"); rbuggyQSA.push(",.*:"); }); } if ( (support.matchesSelector = rnative.test( (matches = docElem.matches || docElem.webkitMatchesSelector || docElem.mozMatchesSelector || docElem.oMatchesSelector || docElem.msMatchesSelector) )) ) { assert(function( div ) { // Check to see if it's possible to do matchesSelector // on a disconnected node (IE 9) support.disconnectedMatch = matches.call( div, "div" ); // This should fail with an exception // Gecko does not error, returns false instead matches.call( div, "[s!='']:x" ); rbuggyMatches.push( "!=", pseudos ); }); } rbuggyQSA = rbuggyQSA.length && new RegExp( rbuggyQSA.join("|") ); rbuggyMatches = rbuggyMatches.length && new RegExp( rbuggyMatches.join("|") ); /* Contains ---------------------------------------------------------------------- */ hasCompare = rnative.test( docElem.compareDocumentPosition ); // Element contains another // Purposefully self-exclusive // As in, an element does not contain itself contains = hasCompare || rnative.test( docElem.contains ) ? function( a, b ) { var adown = a.nodeType === 9 ? a.documentElement : a, bup = b && b.parentNode; return a === bup || !!( bup && bup.nodeType === 1 && ( adown.contains ? adown.contains( bup ) : a.compareDocumentPosition && a.compareDocumentPosition( bup ) & 16 )); } : function( a, b ) { if ( b ) { while ( (b = b.parentNode) ) { if ( b === a ) { return true; } } } return false; }; /* Sorting ---------------------------------------------------------------------- */ // Document order sorting sortOrder = hasCompare ? function( a, b ) { // Flag for duplicate removal if ( a === b ) { hasDuplicate = true; return 0; } // Sort on method existence if only one input has compareDocumentPosition var compare = !a.compareDocumentPosition - !b.compareDocumentPosition; if ( compare ) { return compare; } // Calculate position if both inputs belong to the same document compare = ( a.ownerDocument || a ) === ( b.ownerDocument || b ) ? a.compareDocumentPosition( b ) : // Otherwise we know they are disconnected 1; // Disconnected nodes if ( compare & 1 || (!support.sortDetached && b.compareDocumentPosition( a ) === compare) ) { // Choose the first element that is related to our preferred document if ( a === document || a.ownerDocument === preferredDoc && contains(preferredDoc, a) ) { return -1; } if ( b === document || b.ownerDocument === preferredDoc && contains(preferredDoc, b) ) { return 1; } // Maintain original order return sortInput ? ( indexOf( sortInput, a ) - indexOf( sortInput, b ) ) : 0; } return compare & 4 ? -1 : 1; } : function( a, b ) { // Exit early if the nodes are identical if ( a === b ) { hasDuplicate = true; return 0; } var cur, i = 0, aup = a.parentNode, bup = b.parentNode, ap = [ a ], bp = [ b ]; // Parentless nodes are either documents or disconnected if ( !aup || !bup ) { return a === document ? -1 : b === document ? 1 : aup ? -1 : bup ? 1 : sortInput ? ( indexOf( sortInput, a ) - indexOf( sortInput, b ) ) : 0; // If the nodes are siblings, we can do a quick check } else if ( aup === bup ) { return siblingCheck( a, b ); } // Otherwise we need full lists of their ancestors for comparison cur = a; while ( (cur = cur.parentNode) ) { ap.unshift( cur ); } cur = b; while ( (cur = cur.parentNode) ) { bp.unshift( cur ); } // Walk down the tree looking for a discrepancy while ( ap[i] === bp[i] ) { i++; } return i ? // Do a sibling check if the nodes have a common ancestor siblingCheck( ap[i], bp[i] ) : // Otherwise nodes in our document sort first ap[i] === preferredDoc ? -1 : bp[i] === preferredDoc ? 1 : 0; }; return document; }; Sizzle.matches = function( expr, elements ) { return Sizzle( expr, null, null, elements ); }; Sizzle.matchesSelector = function( elem, expr ) { // Set document vars if needed if ( ( elem.ownerDocument || elem ) !== document ) { setDocument( elem ); } // Make sure that attribute selectors are quoted expr = expr.replace( rattributeQuotes, "='$1']" ); if ( support.matchesSelector && documentIsHTML && !compilerCache[ expr + " " ] && ( !rbuggyMatches || !rbuggyMatches.test( expr ) ) && ( !rbuggyQSA || !rbuggyQSA.test( expr ) ) ) { try { var ret = matches.call( elem, expr ); // IE 9's matchesSelector returns false on disconnected nodes if ( ret || support.disconnectedMatch || // As well, disconnected nodes are said to be in a document // fragment in IE 9 elem.document && elem.document.nodeType !== 11 ) { return ret; } } catch (e) {} } return Sizzle( expr, document, null, [ elem ] ).length > 0; }; Sizzle.contains = function( context, elem ) { // Set document vars if needed if ( ( context.ownerDocument || context ) !== document ) { setDocument( context ); } return contains( context, elem ); }; Sizzle.attr = function( elem, name ) { // Set document vars if needed if ( ( elem.ownerDocument || elem ) !== document ) { setDocument( elem ); } var fn = Expr.attrHandle[ name.toLowerCase() ], // Don't get fooled by Object.prototype properties (jQuery #13807) val = fn && hasOwn.call( Expr.attrHandle, name.toLowerCase() ) ? fn( elem, name, !documentIsHTML ) : undefined; return val !== undefined ? val : support.attributes || !documentIsHTML ? elem.getAttribute( name ) : (val = elem.getAttributeNode(name)) && val.specified ? val.value : null; }; Sizzle.error = function( msg ) { throw new Error( "Syntax error, unrecognized expression: " + msg ); }; /** * Document sorting and removing duplicates * @param {ArrayLike} results */ Sizzle.uniqueSort = function( results ) { var elem, duplicates = [], j = 0, i = 0; // Unless we *know* we can detect duplicates, assume their presence hasDuplicate = !support.detectDuplicates; sortInput = !support.sortStable && results.slice( 0 ); results.sort( sortOrder ); if ( hasDuplicate ) { while ( (elem = results[i++]) ) { if ( elem === results[ i ] ) { j = duplicates.push( i ); } } while ( j-- ) { results.splice( duplicates[ j ], 1 ); } } // Clear input after sorting to release objects // See https://github.com/jquery/sizzle/pull/225 sortInput = null; return results; }; /** * Utility function for retrieving the text value of an array of DOM nodes * @param {Array|Element} elem */ getText = Sizzle.getText = function( elem ) { var node, ret = "", i = 0, nodeType = elem.nodeType; if ( !nodeType ) { // If no nodeType, this is expected to be an array while ( (node = elem[i++]) ) { // Do not traverse comment nodes ret += getText( node ); } } else if ( nodeType === 1 || nodeType === 9 || nodeType === 11 ) { // Use textContent for elements // innerText usage removed for consistency of new lines (jQuery #11153) if ( typeof elem.textContent === "string" ) { return elem.textContent; } else { // Traverse its children for ( elem = elem.firstChild; elem; elem = elem.nextSibling ) { ret += getText( elem ); } } } else if ( nodeType === 3 || nodeType === 4 ) { return elem.nodeValue; } // Do not include comment or processing instruction nodes return ret; }; Expr = Sizzle.selectors = { // Can be adjusted by the user cacheLength: 50, createPseudo: markFunction, match: matchExpr, attrHandle: {}, find: {}, relative: { ">": { dir: "parentNode", first: true }, " ": { dir: "parentNode" }, "+": { dir: "previousSibling", first: true }, "~": { dir: "previousSibling" } }, preFilter: { "ATTR": function( match ) { match[1] = match[1].replace( runescape, funescape ); // Move the given value to match[3] whether quoted or unquoted match[3] = ( match[3] || match[4] || match[5] || "" ).replace( runescape, funescape ); if ( match[2] === "~=" ) { match[3] = " " + match[3] + " "; } return match.slice( 0, 4 ); }, "CHILD": function( match ) { /* matches from matchExpr["CHILD"] 1 type (only|nth|...) 2 what (child|of-type) 3 argument (even|odd|\d*|\d*n([+-]\d+)?|...) 4 xn-component of xn+y argument ([+-]?\d*n|) 5 sign of xn-component 6 x of xn-component 7 sign of y-component 8 y of y-component */ match[1] = match[1].toLowerCase(); if ( match[1].slice( 0, 3 ) === "nth" ) { // nth-* requires argument if ( !match[3] ) { Sizzle.error( match[0] ); } // numeric x and y parameters for Expr.filter.CHILD // remember that false/true cast respectively to 0/1 match[4] = +( match[4] ? match[5] + (match[6] || 1) : 2 * ( match[3] === "even" || match[3] === "odd" ) ); match[5] = +( ( match[7] + match[8] ) || match[3] === "odd" ); // other types prohibit arguments } else if ( match[3] ) { Sizzle.error( match[0] ); } return match; }, "PSEUDO": function( match ) { var excess, unquoted = !match[6] && match[2]; if ( matchExpr["CHILD"].test( match[0] ) ) { return null; } // Accept quoted arguments as-is if ( match[3] ) { match[2] = match[4] || match[5] || ""; // Strip excess characters from unquoted arguments } else if ( unquoted && rpseudo.test( unquoted ) && // Get excess from tokenize (recursively) (excess = tokenize( unquoted, true )) && // advance to the next closing parenthesis (excess = unquoted.indexOf( ")", unquoted.length - excess ) - unquoted.length) ) { // excess is a negative index match[0] = match[0].slice( 0, excess ); match[2] = unquoted.slice( 0, excess ); } // Return only captures needed by the pseudo filter method (type and argument) return match.slice( 0, 3 ); } }, filter: { "TAG": function( nodeNameSelector ) { var nodeName = nodeNameSelector.replace( runescape, funescape ).toLowerCase(); return nodeNameSelector === "*" ? function() { return true; } : function( elem ) { return elem.nodeName && elem.nodeName.toLowerCase() === nodeName; }; }, "CLASS": function( className ) { var pattern = classCache[ className + " " ]; return pattern || (pattern = new RegExp( "(^|" + whitespace + ")" + className + "(" + whitespace + "|$)" )) && classCache( className, function( elem ) { return pattern.test( typeof elem.className === "string" && elem.className || typeof elem.getAttribute !== "undefined" && elem.getAttribute("class") || "" ); }); }, "ATTR": function( name, operator, check ) { return function( elem ) { var result = Sizzle.attr( elem, name ); if ( result == null ) { return operator === "!="; } if ( !operator ) { return true; } result += ""; return operator === "=" ? result === check : operator === "!=" ? result !== check : operator === "^=" ? check && result.indexOf( check ) === 0 : operator === "*=" ? check && result.indexOf( check ) > -1 : operator === "$=" ? check && result.slice( -check.length ) === check : operator === "~=" ? ( " " + result.replace( rwhitespace, " " ) + " " ).indexOf( check ) > -1 : operator === "|=" ? result === check || result.slice( 0, check.length + 1 ) === check + "-" : false; }; }, "CHILD": function( type, what, argument, first, last ) { var simple = type.slice( 0, 3 ) !== "nth", forward = type.slice( -4 ) !== "last", ofType = what === "of-type"; return first === 1 && last === 0 ? // Shortcut for :nth-*(n) function( elem ) { return !!elem.parentNode; } : function( elem, context, xml ) { var cache, uniqueCache, outerCache, node, nodeIndex, start, dir = simple !== forward ? "nextSibling" : "previousSibling", parent = elem.parentNode, name = ofType && elem.nodeName.toLowerCase(), useCache = !xml && !ofType, diff = false; if ( parent ) { // :(first|last|only)-(child|of-type) if ( simple ) { while ( dir ) { node = elem; while ( (node = node[ dir ]) ) { if ( ofType ? node.nodeName.toLowerCase() === name : node.nodeType === 1 ) { return false; } } // Reverse direction for :only-* (if we haven't yet done so) start = dir = type === "only" && !start && "nextSibling"; } return true; } start = [ forward ? parent.firstChild : parent.lastChild ]; // non-xml :nth-child(...) stores cache data on `parent` if ( forward && useCache ) { // Seek `elem` from a previously-cached index // ...in a gzip-friendly way node = parent; outerCache = node[ expando ] || (node[ expando ] = {}); // Support: IE <9 only // Defend against cloned attroperties (jQuery gh-1709) uniqueCache = outerCache[ node.uniqueID ] || (outerCache[ node.uniqueID ] = {}); cache = uniqueCache[ type ] || []; nodeIndex = cache[ 0 ] === dirruns && cache[ 1 ]; diff = nodeIndex && cache[ 2 ]; node = nodeIndex && parent.childNodes[ nodeIndex ]; while ( (node = ++nodeIndex && node && node[ dir ] || // Fallback to seeking `elem` from the start (diff = nodeIndex = 0) || start.pop()) ) { // When found, cache indexes on `parent` and break if ( node.nodeType === 1 && ++diff && node === elem ) { uniqueCache[ type ] = [ dirruns, nodeIndex, diff ]; break; } } } else { // Use previously-cached element index if available if ( useCache ) { // ...in a gzip-friendly way node = elem; outerCache = node[ expando ] || (node[ expando ] = {}); // Support: IE <9 only // Defend against cloned attroperties (jQuery gh-1709) uniqueCache = outerCache[ node.uniqueID ] || (outerCache[ node.uniqueID ] = {}); cache = uniqueCache[ type ] || []; nodeIndex = cache[ 0 ] === dirruns && cache[ 1 ]; diff = nodeIndex; } // xml :nth-child(...) // or :nth-last-child(...) or :nth(-last)?-of-type(...) if ( diff === false ) { // Use the same loop as above to seek `elem` from the start while ( (node = ++nodeIndex && node && node[ dir ] || (diff = nodeIndex = 0) || start.pop()) ) { if ( ( ofType ? node.nodeName.toLowerCase() === name : node.nodeType === 1 ) && ++diff ) { // Cache the index of each encountered element if ( useCache ) { outerCache = node[ expando ] || (node[ expando ] = {}); // Support: IE <9 only // Defend against cloned attroperties (jQuery gh-1709) uniqueCache = outerCache[ node.uniqueID ] || (outerCache[ node.uniqueID ] = {}); uniqueCache[ type ] = [ dirruns, diff ]; } if ( node === elem ) { break; } } } } } // Incorporate the offset, then check against cycle size diff -= last; return diff === first || ( diff % first === 0 && diff / first >= 0 ); } }; }, "PSEUDO": function( pseudo, argument ) { // pseudo-class names are case-insensitive // http://www.w3.org/TR/selectors/#pseudo-classes // Prioritize by case sensitivity in case custom pseudos are added with uppercase letters // Remember that setFilters inherits from pseudos var args, fn = Expr.pseudos[ pseudo ] || Expr.setFilters[ pseudo.toLowerCase() ] || Sizzle.error( "unsupported pseudo: " + pseudo ); // The user may use createPseudo to indicate that // arguments are needed to create the filter function // just as Sizzle does if ( fn[ expando ] ) { return fn( argument ); } // But maintain support for old signatures if ( fn.length > 1 ) { args = [ pseudo, pseudo, "", argument ]; return Expr.setFilters.hasOwnProperty( pseudo.toLowerCase() ) ? markFunction(function( seed, matches ) { var idx, matched = fn( seed, argument ), i = matched.length; while ( i-- ) { idx = indexOf( seed, matched[i] ); seed[ idx ] = !( matches[ idx ] = matched[i] ); } }) : function( elem ) { return fn( elem, 0, args ); }; } return fn; } }, pseudos: { // Potentially complex pseudos "not": markFunction(function( selector ) { // Trim the selector passed to compile // to avoid treating leading and trailing // spaces as combinators var input = [], results = [], matcher = compile( selector.replace( rtrim, "$1" ) ); return matcher[ expando ] ? markFunction(function( seed, matches, context, xml ) { var elem, unmatched = matcher( seed, null, xml, [] ), i = seed.length; // Match elements unmatched by `matcher` while ( i-- ) { if ( (elem = unmatched[i]) ) { seed[i] = !(matches[i] = elem); } } }) : function( elem, context, xml ) { input[0] = elem; matcher( input, null, xml, results ); // Don't keep the element (issue #299) input[0] = null; return !results.pop(); }; }), "has": markFunction(function( selector ) { return function( elem ) { return Sizzle( selector, elem ).length > 0; }; }), "contains": markFunction(function( text ) { text = text.replace( runescape, funescape ); return function( elem ) { return ( elem.textContent || elem.innerText || getText( elem ) ).indexOf( text ) > -1; }; }), // "Whether an element is represented by a :lang() selector // is based solely on the element's language value // being equal to the identifier C, // or beginning with the identifier C immediately followed by "-". // The matching of C against the element's language value is performed case-insensitively. // The identifier C does not have to be a valid language name." // http://www.w3.org/TR/selectors/#lang-pseudo "lang": markFunction( function( lang ) { // lang value must be a valid identifier if ( !ridentifier.test(lang || "") ) { Sizzle.error( "unsupported lang: " + lang ); } lang = lang.replace( runescape, funescape ).toLowerCase(); return function( elem ) { var elemLang; do { if ( (elemLang = documentIsHTML ? elem.lang : elem.getAttribute("xml:lang") || elem.getAttribute("lang")) ) { elemLang = elemLang.toLowerCase(); return elemLang === lang || elemLang.indexOf( lang + "-" ) === 0; } } while ( (elem = elem.parentNode) && elem.nodeType === 1 ); return false; }; }), // Miscellaneous "target": function( elem ) { var hash = window.location && window.location.hash; return hash && hash.slice( 1 ) === elem.id; }, "root": function( elem ) { return elem === docElem; }, "focus": function( elem ) { return elem === document.activeElement && (!document.hasFocus || document.hasFocus()) && !!(elem.type || elem.href || ~elem.tabIndex); }, // Boolean properties "enabled": function( elem ) { return elem.disabled === false; }, "disabled": function( elem ) { return elem.disabled === true; }, "checked": function( elem ) { // In CSS3, :checked should return both checked and selected elements // http://www.w3.org/TR/2011/REC-css3-selectors-20110929/#checked var nodeName = elem.nodeName.toLowerCase(); return (nodeName === "input" && !!elem.checked) || (nodeName === "option" && !!elem.selected); }, "selected": function( elem ) { // Accessing this property makes selected-by-default // options in Safari work properly if ( elem.parentNode ) { elem.parentNode.selectedIndex; } return elem.selected === true; }, // Contents "empty": function( elem ) { // http://www.w3.org/TR/selectors/#empty-pseudo // :empty is negated by element (1) or content nodes (text: 3; cdata: 4; entity ref: 5), // but not by others (comment: 8; processing instruction: 7; etc.) // nodeType < 6 works because attributes (2) do not appear as children for ( elem = elem.firstChild; elem; elem = elem.nextSibling ) { if ( elem.nodeType < 6 ) { return false; } } return true; }, "parent": function( elem ) { return !Expr.pseudos["empty"]( elem ); }, // Element/input types "header": function( elem ) { return rheader.test( elem.nodeName ); }, "input": function( elem ) { return rinputs.test( elem.nodeName ); }, "button": function( elem ) { var name = elem.nodeName.toLowerCase(); return name === "input" && elem.type === "button" || name === "button"; }, "text": function( elem ) { var attr; return elem.nodeName.toLowerCase() === "input" && elem.type === "text" && // Support: IE<8 // New HTML5 attribute values (e.g., "search") appear with elem.type === "text" ( (attr = elem.getAttribute("type")) == null || attr.toLowerCase() === "text" ); }, // Position-in-collection "first": createPositionalPseudo(function() { return [ 0 ]; }), "last": createPositionalPseudo(function( matchIndexes, length ) { return [ length - 1 ]; }), "eq": createPositionalPseudo(function( matchIndexes, length, argument ) { return [ argument < 0 ? argument + length : argument ]; }), "even": createPositionalPseudo(function( matchIndexes, length ) { var i = 0; for ( ; i < length; i += 2 ) { matchIndexes.push( i ); } return matchIndexes; }), "odd": createPositionalPseudo(function( matchIndexes, length ) { var i = 1; for ( ; i < length; i += 2 ) { matchIndexes.push( i ); } return matchIndexes; }), "lt": createPositionalPseudo(function( matchIndexes, length, argument ) { var i = argument < 0 ? argument + length : argument; for ( ; --i >= 0; ) { matchIndexes.push( i ); } return matchIndexes; }), "gt": createPositionalPseudo(function( matchIndexes, length, argument ) { var i = argument < 0 ? argument + length : argument; for ( ; ++i < length; ) { matchIndexes.push( i ); } return matchIndexes; }) } }; Expr.pseudos["nth"] = Expr.pseudos["eq"]; // Add button/input type pseudos for ( i in { radio: true, checkbox: true, file: true, password: true, image: true } ) { Expr.pseudos[ i ] = createInputPseudo( i ); } for ( i in { submit: true, reset: true } ) { Expr.pseudos[ i ] = createButtonPseudo( i ); } // Easy API for creating new setFilters function setFilters() {} setFilters.prototype = Expr.filters = Expr.pseudos; Expr.setFilters = new setFilters(); tokenize = Sizzle.tokenize = function( selector, parseOnly ) { var matched, match, tokens, type, soFar, groups, preFilters, cached = tokenCache[ selector + " " ]; if ( cached ) { return parseOnly ? 0 : cached.slice( 0 ); } soFar = selector; groups = []; preFilters = Expr.preFilter; while ( soFar ) { // Comma and first run if ( !matched || (match = rcomma.exec( soFar )) ) { if ( match ) { // Don't consume trailing commas as valid soFar = soFar.slice( match[0].length ) || soFar; } groups.push( (tokens = []) ); } matched = false; // Combinators if ( (match = rcombinators.exec( soFar )) ) { matched = match.shift(); tokens.push({ value: matched, // Cast descendant combinators to space type: match[0].replace( rtrim, " " ) }); soFar = soFar.slice( matched.length ); } // Filters for ( type in Expr.filter ) { if ( (match = matchExpr[ type ].exec( soFar )) && (!preFilters[ type ] || (match = preFilters[ type ]( match ))) ) { matched = match.shift(); tokens.push({ value: matched, type: type, matches: match }); soFar = soFar.slice( matched.length ); } } if ( !matched ) { break; } } // Return the length of the invalid excess // if we're just parsing // Otherwise, throw an error or return tokens return parseOnly ? soFar.length : soFar ? Sizzle.error( selector ) : // Cache the tokens tokenCache( selector, groups ).slice( 0 ); }; function toSelector( tokens ) { var i = 0, len = tokens.length, selector = ""; for ( ; i < len; i++ ) { selector += tokens[i].value; } return selector; } function addCombinator( matcher, combinator, base ) { var dir = combinator.dir, checkNonElements = base && dir === "parentNode", doneName = done++; return combinator.first ? // Check against closest ancestor/preceding element function( elem, context, xml ) { while ( (elem = elem[ dir ]) ) { if ( elem.nodeType === 1 || checkNonElements ) { return matcher( elem, context, xml ); } } } : // Check against all ancestor/preceding elements function( elem, context, xml ) { var oldCache, uniqueCache, outerCache, newCache = [ dirruns, doneName ]; // We can't set arbitrary data on XML nodes, so they don't benefit from combinator caching if ( xml ) { while ( (elem = elem[ dir ]) ) { if ( elem.nodeType === 1 || checkNonElements ) { if ( matcher( elem, context, xml ) ) { return true; } } } } else { while ( (elem = elem[ dir ]) ) { if ( elem.nodeType === 1 || checkNonElements ) { outerCache = elem[ expando ] || (elem[ expando ] = {}); // Support: IE <9 only // Defend against cloned attroperties (jQuery gh-1709) uniqueCache = outerCache[ elem.uniqueID ] || (outerCache[ elem.uniqueID ] = {}); if ( (oldCache = uniqueCache[ dir ]) && oldCache[ 0 ] === dirruns && oldCache[ 1 ] === doneName ) { // Assign to newCache so results back-propagate to previous elements return (newCache[ 2 ] = oldCache[ 2 ]); } else { // Reuse newcache so results back-propagate to previous elements uniqueCache[ dir ] = newCache; // A match means we're done; a fail means we have to keep checking if ( (newCache[ 2 ] = matcher( elem, context, xml )) ) { return true; } } } } } }; } function elementMatcher( matchers ) { return matchers.length > 1 ? function( elem, context, xml ) { var i = matchers.length; while ( i-- ) { if ( !matchers[i]( elem, context, xml ) ) { return false; } } return true; } : matchers[0]; } function multipleContexts( selector, contexts, results ) { var i = 0, len = contexts.length; for ( ; i < len; i++ ) { Sizzle( selector, contexts[i], results ); } return results; } function condense( unmatched, map, filter, context, xml ) { var elem, newUnmatched = [], i = 0, len = unmatched.length, mapped = map != null; for ( ; i < len; i++ ) { if ( (elem = unmatched[i]) ) { if ( !filter || filter( elem, context, xml ) ) { newUnmatched.push( elem ); if ( mapped ) { map.push( i ); } } } } return newUnmatched; } function setMatcher( preFilter, selector, matcher, postFilter, postFinder, postSelector ) { if ( postFilter && !postFilter[ expando ] ) { postFilter = setMatcher( postFilter ); } if ( postFinder && !postFinder[ expando ] ) { postFinder = setMatcher( postFinder, postSelector ); } return markFunction(function( seed, results, context, xml ) { var temp, i, elem, preMap = [], postMap = [], preexisting = results.length, // Get initial elements from seed or context elems = seed || multipleContexts( selector || "*", context.nodeType ? [ context ] : context, [] ), // Prefilter to get matcher input, preserving a map for seed-results synchronization matcherIn = preFilter && ( seed || !selector ) ? condense( elems, preMap, preFilter, context, xml ) : elems, matcherOut = matcher ? // If we have a postFinder, or filtered seed, or non-seed postFilter or preexisting results, postFinder || ( seed ? preFilter : preexisting || postFilter ) ? // ...intermediate processing is necessary [] : // ...otherwise use results directly results : matcherIn; // Find primary matches if ( matcher ) { matcher( matcherIn, matcherOut, context, xml ); } // Apply postFilter if ( postFilter ) { temp = condense( matcherOut, postMap ); postFilter( temp, [], context, xml ); // Un-match failing elements by moving them back to matcherIn i = temp.length; while ( i-- ) { if ( (elem = temp[i]) ) { matcherOut[ postMap[i] ] = !(matcherIn[ postMap[i] ] = elem); } } } if ( seed ) { if ( postFinder || preFilter ) { if ( postFinder ) { // Get the final matcherOut by condensing this intermediate into postFinder contexts temp = []; i = matcherOut.length; while ( i-- ) { if ( (elem = matcherOut[i]) ) { // Restore matcherIn since elem is not yet a final match temp.push( (matcherIn[i] = elem) ); } } postFinder( null, (matcherOut = []), temp, xml ); } // Move matched elements from seed to results to keep them synchronized i = matcherOut.length; while ( i-- ) { if ( (elem = matcherOut[i]) && (temp = postFinder ? indexOf( seed, elem ) : preMap[i]) > -1 ) { seed[temp] = !(results[temp] = elem); } } } // Add elements to results, through postFinder if defined } else { matcherOut = condense( matcherOut === results ? matcherOut.splice( preexisting, matcherOut.length ) : matcherOut ); if ( postFinder ) { postFinder( null, results, matcherOut, xml ); } else { push.apply( results, matcherOut ); } } }); } function matcherFromTokens( tokens ) { var checkContext, matcher, j, len = tokens.length, leadingRelative = Expr.relative[ tokens[0].type ], implicitRelative = leadingRelative || Expr.relative[" "], i = leadingRelative ? 1 : 0, // The foundational matcher ensures that elements are reachable from top-level context(s) matchContext = addCombinator( function( elem ) { return elem === checkContext; }, implicitRelative, true ), matchAnyContext = addCombinator( function( elem ) { return indexOf( checkContext, elem ) > -1; }, implicitRelative, true ), matchers = [ function( elem, context, xml ) { var ret = ( !leadingRelative && ( xml || context !== outermostContext ) ) || ( (checkContext = context).nodeType ? matchContext( elem, context, xml ) : matchAnyContext( elem, context, xml ) ); // Avoid hanging onto element (issue #299) checkContext = null; return ret; } ]; for ( ; i < len; i++ ) { if ( (matcher = Expr.relative[ tokens[i].type ]) ) { matchers = [ addCombinator(elementMatcher( matchers ), matcher) ]; } else { matcher = Expr.filter[ tokens[i].type ].apply( null, tokens[i].matches ); // Return special upon seeing a positional matcher if ( matcher[ expando ] ) { // Find the next relative operator (if any) for proper handling j = ++i; for ( ; j < len; j++ ) { if ( Expr.relative[ tokens[j].type ] ) { break; } } return setMatcher( i > 1 && elementMatcher( matchers ), i > 1 && toSelector( // If the preceding token was a descendant combinator, insert an implicit any-element `*` tokens.slice( 0, i - 1 ).concat({ value: tokens[ i - 2 ].type === " " ? "*" : "" }) ).replace( rtrim, "$1" ), matcher, i < j && matcherFromTokens( tokens.slice( i, j ) ), j < len && matcherFromTokens( (tokens = tokens.slice( j )) ), j < len && toSelector( tokens ) ); } matchers.push( matcher ); } } return elementMatcher( matchers ); } function matcherFromGroupMatchers( elementMatchers, setMatchers ) { var bySet = setMatchers.length > 0, byElement = elementMatchers.length > 0, superMatcher = function( seed, context, xml, results, outermost ) { var elem, j, matcher, matchedCount = 0, i = "0", unmatched = seed && [], setMatched = [], contextBackup = outermostContext, // We must always have either seed elements or outermost context elems = seed || byElement && Expr.find["TAG"]( "*", outermost ), // Use integer dirruns iff this is the outermost matcher dirrunsUnique = (dirruns += contextBackup == null ? 1 : Math.random() || 0.1), len = elems.length; if ( outermost ) { outermostContext = context === document || context || outermost; } // Add elements passing elementMatchers directly to results // Support: IE<9, Safari // Tolerate NodeList properties (IE: "length"; Safari: ) matching elements by id for ( ; i !== len && (elem = elems[i]) != null; i++ ) { if ( byElement && elem ) { j = 0; if ( !context && elem.ownerDocument !== document ) { setDocument( elem ); xml = !documentIsHTML; } while ( (matcher = elementMatchers[j++]) ) { if ( matcher( elem, context || document, xml) ) { results.push( elem ); break; } } if ( outermost ) { dirruns = dirrunsUnique; } } // Track unmatched elements for set filters if ( bySet ) { // They will have gone through all possible matchers if ( (elem = !matcher && elem) ) { matchedCount--; } // Lengthen the array for every element, matched or not if ( seed ) { unmatched.push( elem ); } } } // `i` is now the count of elements visited above, and adding it to `matchedCount` // makes the latter nonnegative. matchedCount += i; // Apply set filters to unmatched elements // NOTE: This can be skipped if there are no unmatched elements (i.e., `matchedCount` // equals `i`), unless we didn't visit _any_ elements in the above loop because we have // no element matchers and no seed. // Incrementing an initially-string "0" `i` allows `i` to remain a string only in that // case, which will result in a "00" `matchedCount` that differs from `i` but is also // numerically zero. if ( bySet && i !== matchedCount ) { j = 0; while ( (matcher = setMatchers[j++]) ) { matcher( unmatched, setMatched, context, xml ); } if ( seed ) { // Reintegrate element matches to eliminate the need for sorting if ( matchedCount > 0 ) { while ( i-- ) { if ( !(unmatched[i] || setMatched[i]) ) { setMatched[i] = pop.call( results ); } } } // Discard index placeholder values to get only actual matches setMatched = condense( setMatched ); } // Add matches to results push.apply( results, setMatched ); // Seedless set matches succeeding multiple successful matchers stipulate sorting if ( outermost && !seed && setMatched.length > 0 && ( matchedCount + setMatchers.length ) > 1 ) { Sizzle.uniqueSort( results ); } } // Override manipulation of globals by nested matchers if ( outermost ) { dirruns = dirrunsUnique; outermostContext = contextBackup; } return unmatched; }; return bySet ? markFunction( superMatcher ) : superMatcher; } compile = Sizzle.compile = function( selector, match /* Internal Use Only */ ) { var i, setMatchers = [], elementMatchers = [], cached = compilerCache[ selector + " " ]; if ( !cached ) { // Generate a function of recursive functions that can be used to check each element if ( !match ) { match = tokenize( selector ); } i = match.length; while ( i-- ) { cached = matcherFromTokens( match[i] ); if ( cached[ expando ] ) { setMatchers.push( cached ); } else { elementMatchers.push( cached ); } } // Cache the compiled function cached = compilerCache( selector, matcherFromGroupMatchers( elementMatchers, setMatchers ) ); // Save selector and tokenization cached.selector = selector; } return cached; }; /** * A low-level selection function that works with Sizzle's compiled * selector functions * @param {String|Function} selector A selector or a pre-compiled * selector function built with Sizzle.compile * @param {Element} context * @param {Array} [results] * @param {Array} [seed] A set of elements to match against */ select = Sizzle.select = function( selector, context, results, seed ) { var i, tokens, token, type, find, compiled = typeof selector === "function" && selector, match = !seed && tokenize( (selector = compiled.selector || selector) ); results = results || []; // Try to minimize operations if there is only one selector in the list and no seed // (the latter of which guarantees us context) if ( match.length === 1 ) { // Reduce context if the leading compound selector is an ID tokens = match[0] = match[0].slice( 0 ); if ( tokens.length > 2 && (token = tokens[0]).type === "ID" && support.getById && context.nodeType === 9 && documentIsHTML && Expr.relative[ tokens[1].type ] ) { context = ( Expr.find["ID"]( token.matches[0].replace(runescape, funescape), context ) || [] )[0]; if ( !context ) { return results; // Precompiled matchers will still verify ancestry, so step up a level } else if ( compiled ) { context = context.parentNode; } selector = selector.slice( tokens.shift().value.length ); } // Fetch a seed set for right-to-left matching i = matchExpr["needsContext"].test( selector ) ? 0 : tokens.length; while ( i-- ) { token = tokens[i]; // Abort if we hit a combinator if ( Expr.relative[ (type = token.type) ] ) { break; } if ( (find = Expr.find[ type ]) ) { // Search, expanding context for leading sibling combinators if ( (seed = find( token.matches[0].replace( runescape, funescape ), rsibling.test( tokens[0].type ) && testContext( context.parentNode ) || context )) ) { // If seed is empty or no tokens remain, we can return early tokens.splice( i, 1 ); selector = seed.length && toSelector( tokens ); if ( !selector ) { push.apply( results, seed ); return results; } break; } } } } // Compile and execute a filtering function if one is not provided // Provide `match` to avoid retokenization if we modified the selector above ( compiled || compile( selector, match ) )( seed, context, !documentIsHTML, results, !context || rsibling.test( selector ) && testContext( context.parentNode ) || context ); return results; }; // One-time assignments // Sort stability support.sortStable = expando.split("").sort( sortOrder ).join("") === expando; // Support: Chrome 14-35+ // Always assume duplicates if they aren't passed to the comparison function support.detectDuplicates = !!hasDuplicate; // Initialize against the default document setDocument(); // Support: Webkit<537.32 - Safari 6.0.3/Chrome 25 (fixed in Chrome 27) // Detached nodes confoundingly follow *each other* support.sortDetached = assert(function( div1 ) { // Should return 1, but returns 4 (following) return div1.compareDocumentPosition( document.createElement("div") ) & 1; }); // Support: IE<8 // Prevent attribute/property "interpolation" // http://msdn.microsoft.com/en-us/library/ms536429%28VS.85%29.aspx if ( !assert(function( div ) { div.innerHTML = ""; return div.firstChild.getAttribute("href") === "#" ; }) ) { addHandle( "type|href|height|width", function( elem, name, isXML ) { if ( !isXML ) { return elem.getAttribute( name, name.toLowerCase() === "type" ? 1 : 2 ); } }); } // Support: IE<9 // Use defaultValue in place of getAttribute("value") if ( !support.attributes || !assert(function( div ) { div.innerHTML = ""; div.firstChild.setAttribute( "value", "" ); return div.firstChild.getAttribute( "value" ) === ""; }) ) { addHandle( "value", function( elem, name, isXML ) { if ( !isXML && elem.nodeName.toLowerCase() === "input" ) { return elem.defaultValue; } }); } // Support: IE<9 // Use getAttributeNode to fetch booleans when getAttribute lies if ( !assert(function( div ) { return div.getAttribute("disabled") == null; }) ) { addHandle( booleans, function( elem, name, isXML ) { var val; if ( !isXML ) { return elem[ name ] === true ? name.toLowerCase() : (val = elem.getAttributeNode( name )) && val.specified ? val.value : null; } }); } return Sizzle; })( window ); jQuery.find = Sizzle; jQuery.expr = Sizzle.selectors; jQuery.expr[ ":" ] = jQuery.expr.pseudos; jQuery.uniqueSort = jQuery.unique = Sizzle.uniqueSort; jQuery.text = Sizzle.getText; jQuery.isXMLDoc = Sizzle.isXML; jQuery.contains = Sizzle.contains; var dir = function( elem, dir, until ) { var matched = [], truncate = until !== undefined; while ( ( elem = elem[ dir ] ) && elem.nodeType !== 9 ) { if ( elem.nodeType === 1 ) { if ( truncate && jQuery( elem ).is( until ) ) { break; } matched.push( elem ); } } return matched; }; var siblings = function( n, elem ) { var matched = []; for ( ; n; n = n.nextSibling ) { if ( n.nodeType === 1 && n !== elem ) { matched.push( n ); } } return matched; }; var rneedsContext = jQuery.expr.match.needsContext; var rsingleTag = ( /^<([\w-]+)\s*\/?>(?:<\/\1>|)$/ ); var risSimple = /^.[^:#\[\.,]*$/; // Implement the identical functionality for filter and not function winnow( elements, qualifier, not ) { if ( jQuery.isFunction( qualifier ) ) { return jQuery.grep( elements, function( elem, i ) { /* jshint -W018 */ return !!qualifier.call( elem, i, elem ) !== not; } ); } if ( qualifier.nodeType ) { return jQuery.grep( elements, function( elem ) { return ( elem === qualifier ) !== not; } ); } if ( typeof qualifier === "string" ) { if ( risSimple.test( qualifier ) ) { return jQuery.filter( qualifier, elements, not ); } qualifier = jQuery.filter( qualifier, elements ); } return jQuery.grep( elements, function( elem ) { return ( jQuery.inArray( elem, qualifier ) > -1 ) !== not; } ); } jQuery.filter = function( expr, elems, not ) { var elem = elems[ 0 ]; if ( not ) { expr = ":not(" + expr + ")"; } return elems.length === 1 && elem.nodeType === 1 ? jQuery.find.matchesSelector( elem, expr ) ? [ elem ] : [] : jQuery.find.matches( expr, jQuery.grep( elems, function( elem ) { return elem.nodeType === 1; } ) ); }; jQuery.fn.extend( { find: function( selector ) { var i, ret = [], self = this, len = self.length; if ( typeof selector !== "string" ) { return this.pushStack( jQuery( selector ).filter( function() { for ( i = 0; i < len; i++ ) { if ( jQuery.contains( self[ i ], this ) ) { return true; } } } ) ); } for ( i = 0; i < len; i++ ) { jQuery.find( selector, self[ i ], ret ); } // Needed because $( selector, context ) becomes $( context ).find( selector ) ret = this.pushStack( len > 1 ? jQuery.unique( ret ) : ret ); ret.selector = this.selector ? this.selector + " " + selector : selector; return ret; }, filter: function( selector ) { return this.pushStack( winnow( this, selector || [], false ) ); }, not: function( selector ) { return this.pushStack( winnow( this, selector || [], true ) ); }, is: function( selector ) { return !!winnow( this, // If this is a positional/relative selector, check membership in the returned set // so $("p:first").is("p:last") won't return true for a doc with two "p". typeof selector === "string" && rneedsContext.test( selector ) ? jQuery( selector ) : selector || [], false ).length; } } ); // Initialize a jQuery object // A central reference to the root jQuery(document) var rootjQuery, // A simple way to check for HTML strings // Prioritize #id over to avoid XSS via location.hash (#9521) // Strict HTML recognition (#11290: must start with <) rquickExpr = /^(?:\s*(<[\w\W]+>)[^>]*|#([\w-]*))$/, init = jQuery.fn.init = function( selector, context, root ) { var match, elem; // HANDLE: $(""), $(null), $(undefined), $(false) if ( !selector ) { return this; } // init accepts an alternate rootjQuery // so migrate can support jQuery.sub (gh-2101) root = root || rootjQuery; // Handle HTML strings if ( typeof selector === "string" ) { if ( selector.charAt( 0 ) === "<" && selector.charAt( selector.length - 1 ) === ">" && selector.length >= 3 ) { // Assume that strings that start and end with <> are HTML and skip the regex check match = [ null, selector, null ]; } else { match = rquickExpr.exec( selector ); } // Match html or make sure no context is specified for #id if ( match && ( match[ 1 ] || !context ) ) { // HANDLE: $(html) -> $(array) if ( match[ 1 ] ) { context = context instanceof jQuery ? context[ 0 ] : context; // scripts is true for back-compat // Intentionally let the error be thrown if parseHTML is not present jQuery.merge( this, jQuery.parseHTML( match[ 1 ], context && context.nodeType ? context.ownerDocument || context : document, true ) ); // HANDLE: $(html, props) if ( rsingleTag.test( match[ 1 ] ) && jQuery.isPlainObject( context ) ) { for ( match in context ) { // Properties of context are called as methods if possible if ( jQuery.isFunction( this[ match ] ) ) { this[ match ]( context[ match ] ); // ...and otherwise set as attributes } else { this.attr( match, context[ match ] ); } } } return this; // HANDLE: $(#id) } else { elem = document.getElementById( match[ 2 ] ); // Check parentNode to catch when Blackberry 4.6 returns // nodes that are no longer in the document #6963 if ( elem && elem.parentNode ) { // Handle the case where IE and Opera return items // by name instead of ID if ( elem.id !== match[ 2 ] ) { return rootjQuery.find( selector ); } // Otherwise, we inject the element directly into the jQuery object this.length = 1; this[ 0 ] = elem; } this.context = document; this.selector = selector; return this; } // HANDLE: $(expr, $(...)) } else if ( !context || context.jquery ) { return ( context || root ).find( selector ); // HANDLE: $(expr, context) // (which is just equivalent to: $(context).find(expr) } else { return this.constructor( context ).find( selector ); } // HANDLE: $(DOMElement) } else if ( selector.nodeType ) { this.context = this[ 0 ] = selector; this.length = 1; return this; // HANDLE: $(function) // Shortcut for document ready } else if ( jQuery.isFunction( selector ) ) { return typeof root.ready !== "undefined" ? root.ready( selector ) : // Execute immediately if ready is not present selector( jQuery ); } if ( selector.selector !== undefined ) { this.selector = selector.selector; this.context = selector.context; } return jQuery.makeArray( selector, this ); }; // Give the init function the jQuery prototype for later instantiation init.prototype = jQuery.fn; // Initialize central reference rootjQuery = jQuery( document ); var rparentsprev = /^(?:parents|prev(?:Until|All))/, // methods guaranteed to produce a unique set when starting from a unique set guaranteedUnique = { children: true, contents: true, next: true, prev: true }; jQuery.fn.extend( { has: function( target ) { var i, targets = jQuery( target, this ), len = targets.length; return this.filter( function() { for ( i = 0; i < len; i++ ) { if ( jQuery.contains( this, targets[ i ] ) ) { return true; } } } ); }, closest: function( selectors, context ) { var cur, i = 0, l = this.length, matched = [], pos = rneedsContext.test( selectors ) || typeof selectors !== "string" ? jQuery( selectors, context || this.context ) : 0; for ( ; i < l; i++ ) { for ( cur = this[ i ]; cur && cur !== context; cur = cur.parentNode ) { // Always skip document fragments if ( cur.nodeType < 11 && ( pos ? pos.index( cur ) > -1 : // Don't pass non-elements to Sizzle cur.nodeType === 1 && jQuery.find.matchesSelector( cur, selectors ) ) ) { matched.push( cur ); break; } } } return this.pushStack( matched.length > 1 ? jQuery.uniqueSort( matched ) : matched ); }, // Determine the position of an element within // the matched set of elements index: function( elem ) { // No argument, return index in parent if ( !elem ) { return ( this[ 0 ] && this[ 0 ].parentNode ) ? this.first().prevAll().length : -1; } // index in selector if ( typeof elem === "string" ) { return jQuery.inArray( this[ 0 ], jQuery( elem ) ); } // Locate the position of the desired element return jQuery.inArray( // If it receives a jQuery object, the first element is used elem.jquery ? elem[ 0 ] : elem, this ); }, add: function( selector, context ) { return this.pushStack( jQuery.uniqueSort( jQuery.merge( this.get(), jQuery( selector, context ) ) ) ); }, addBack: function( selector ) { return this.add( selector == null ? this.prevObject : this.prevObject.filter( selector ) ); } } ); function sibling( cur, dir ) { do { cur = cur[ dir ]; } while ( cur && cur.nodeType !== 1 ); return cur; } jQuery.each( { parent: function( elem ) { var parent = elem.parentNode; return parent && parent.nodeType !== 11 ? parent : null; }, parents: function( elem ) { return dir( elem, "parentNode" ); }, parentsUntil: function( elem, i, until ) { return dir( elem, "parentNode", until ); }, next: function( elem ) { return sibling( elem, "nextSibling" ); }, prev: function( elem ) { return sibling( elem, "previousSibling" ); }, nextAll: function( elem ) { return dir( elem, "nextSibling" ); }, prevAll: function( elem ) { return dir( elem, "previousSibling" ); }, nextUntil: function( elem, i, until ) { return dir( elem, "nextSibling", until ); }, prevUntil: function( elem, i, until ) { return dir( elem, "previousSibling", until ); }, siblings: function( elem ) { return siblings( ( elem.parentNode || {} ).firstChild, elem ); }, children: function( elem ) { return siblings( elem.firstChild ); }, contents: function( elem ) { return jQuery.nodeName( elem, "iframe" ) ? elem.contentDocument || elem.contentWindow.document : jQuery.merge( [], elem.childNodes ); } }, function( name, fn ) { jQuery.fn[ name ] = function( until, selector ) { var ret = jQuery.map( this, fn, until ); if ( name.slice( -5 ) !== "Until" ) { selector = until; } if ( selector && typeof selector === "string" ) { ret = jQuery.filter( selector, ret ); } if ( this.length > 1 ) { // Remove duplicates if ( !guaranteedUnique[ name ] ) { ret = jQuery.uniqueSort( ret ); } // Reverse order for parents* and prev-derivatives if ( rparentsprev.test( name ) ) { ret = ret.reverse(); } } return this.pushStack( ret ); }; } ); var rnotwhite = ( /\S+/g ); // Convert String-formatted options into Object-formatted ones function createOptions( options ) { var object = {}; jQuery.each( options.match( rnotwhite ) || [], function( _, flag ) { object[ flag ] = true; } ); return object; } /* * Create a callback list using the following parameters: * * options: an optional list of space-separated options that will change how * the callback list behaves or a more traditional option object * * By default a callback list will act like an event callback list and can be * "fired" multiple times. * * Possible options: * * once: will ensure the callback list can only be fired once (like a Deferred) * * memory: will keep track of previous values and will call any callback added * after the list has been fired right away with the latest "memorized" * values (like a Deferred) * * unique: will ensure a callback can only be added once (no duplicate in the list) * * stopOnFalse: interrupt callings when a callback returns false * */ jQuery.Callbacks = function( options ) { // Convert options from String-formatted to Object-formatted if needed // (we check in cache first) options = typeof options === "string" ? createOptions( options ) : jQuery.extend( {}, options ); var // Flag to know if list is currently firing firing, // Last fire value for non-forgettable lists memory, // Flag to know if list was already fired fired, // Flag to prevent firing locked, // Actual callback list list = [], // Queue of execution data for repeatable lists queue = [], // Index of currently firing callback (modified by add/remove as needed) firingIndex = -1, // Fire callbacks fire = function() { // Enforce single-firing locked = options.once; // Execute callbacks for all pending executions, // respecting firingIndex overrides and runtime changes fired = firing = true; for ( ; queue.length; firingIndex = -1 ) { memory = queue.shift(); while ( ++firingIndex < list.length ) { // Run callback and check for early termination if ( list[ firingIndex ].apply( memory[ 0 ], memory[ 1 ] ) === false && options.stopOnFalse ) { // Jump to end and forget the data so .add doesn't re-fire firingIndex = list.length; memory = false; } } } // Forget the data if we're done with it if ( !options.memory ) { memory = false; } firing = false; // Clean up if we're done firing for good if ( locked ) { // Keep an empty list if we have data for future add calls if ( memory ) { list = []; // Otherwise, this object is spent } else { list = ""; } } }, // Actual Callbacks object self = { // Add a callback or a collection of callbacks to the list add: function() { if ( list ) { // If we have memory from a past run, we should fire after adding if ( memory && !firing ) { firingIndex = list.length - 1; queue.push( memory ); } ( function add( args ) { jQuery.each( args, function( _, arg ) { if ( jQuery.isFunction( arg ) ) { if ( !options.unique || !self.has( arg ) ) { list.push( arg ); } } else if ( arg && arg.length && jQuery.type( arg ) !== "string" ) { // Inspect recursively add( arg ); } } ); } )( arguments ); if ( memory && !firing ) { fire(); } } return this; }, // Remove a callback from the list remove: function() { jQuery.each( arguments, function( _, arg ) { var index; while ( ( index = jQuery.inArray( arg, list, index ) ) > -1 ) { list.splice( index, 1 ); // Handle firing indexes if ( index <= firingIndex ) { firingIndex--; } } } ); return this; }, // Check if a given callback is in the list. // If no argument is given, return whether or not list has callbacks attached. has: function( fn ) { return fn ? jQuery.inArray( fn, list ) > -1 : list.length > 0; }, // Remove all callbacks from the list empty: function() { if ( list ) { list = []; } return this; }, // Disable .fire and .add // Abort any current/pending executions // Clear all callbacks and values disable: function() { locked = queue = []; list = memory = ""; return this; }, disabled: function() { return !list; }, // Disable .fire // Also disable .add unless we have memory (since it would have no effect) // Abort any pending executions lock: function() { locked = true; if ( !memory ) { self.disable(); } return this; }, locked: function() { return !!locked; }, // Call all callbacks with the given context and arguments fireWith: function( context, args ) { if ( !locked ) { args = args || []; args = [ context, args.slice ? args.slice() : args ]; queue.push( args ); if ( !firing ) { fire(); } } return this; }, // Call all the callbacks with the given arguments fire: function() { self.fireWith( this, arguments ); return this; }, // To know if the callbacks have already been called at least once fired: function() { return !!fired; } }; return self; }; jQuery.extend( { Deferred: function( func ) { var tuples = [ // action, add listener, listener list, final state [ "resolve", "done", jQuery.Callbacks( "once memory" ), "resolved" ], [ "reject", "fail", jQuery.Callbacks( "once memory" ), "rejected" ], [ "notify", "progress", jQuery.Callbacks( "memory" ) ] ], state = "pending", promise = { state: function() { return state; }, always: function() { deferred.done( arguments ).fail( arguments ); return this; }, then: function( /* fnDone, fnFail, fnProgress */ ) { var fns = arguments; return jQuery.Deferred( function( newDefer ) { jQuery.each( tuples, function( i, tuple ) { var fn = jQuery.isFunction( fns[ i ] ) && fns[ i ]; // deferred[ done | fail | progress ] for forwarding actions to newDefer deferred[ tuple[ 1 ] ]( function() { var returned = fn && fn.apply( this, arguments ); if ( returned && jQuery.isFunction( returned.promise ) ) { returned.promise() .progress( newDefer.notify ) .done( newDefer.resolve ) .fail( newDefer.reject ); } else { newDefer[ tuple[ 0 ] + "With" ]( this === promise ? newDefer.promise() : this, fn ? [ returned ] : arguments ); } } ); } ); fns = null; } ).promise(); }, // Get a promise for this deferred // If obj is provided, the promise aspect is added to the object promise: function( obj ) { return obj != null ? jQuery.extend( obj, promise ) : promise; } }, deferred = {}; // Keep pipe for back-compat promise.pipe = promise.then; // Add list-specific methods jQuery.each( tuples, function( i, tuple ) { var list = tuple[ 2 ], stateString = tuple[ 3 ]; // promise[ done | fail | progress ] = list.add promise[ tuple[ 1 ] ] = list.add; // Handle state if ( stateString ) { list.add( function() { // state = [ resolved | rejected ] state = stateString; // [ reject_list | resolve_list ].disable; progress_list.lock }, tuples[ i ^ 1 ][ 2 ].disable, tuples[ 2 ][ 2 ].lock ); } // deferred[ resolve | reject | notify ] deferred[ tuple[ 0 ] ] = function() { deferred[ tuple[ 0 ] + "With" ]( this === deferred ? promise : this, arguments ); return this; }; deferred[ tuple[ 0 ] + "With" ] = list.fireWith; } ); // Make the deferred a promise promise.promise( deferred ); // Call given func if any if ( func ) { func.call( deferred, deferred ); } // All done! return deferred; }, // Deferred helper when: function( subordinate /* , ..., subordinateN */ ) { var i = 0, resolveValues = slice.call( arguments ), length = resolveValues.length, // the count of uncompleted subordinates remaining = length !== 1 || ( subordinate && jQuery.isFunction( subordinate.promise ) ) ? length : 0, // the master Deferred. // If resolveValues consist of only a single Deferred, just use that. deferred = remaining === 1 ? subordinate : jQuery.Deferred(), // Update function for both resolve and progress values updateFunc = function( i, contexts, values ) { return function( value ) { contexts[ i ] = this; values[ i ] = arguments.length > 1 ? slice.call( arguments ) : value; if ( values === progressValues ) { deferred.notifyWith( contexts, values ); } else if ( !( --remaining ) ) { deferred.resolveWith( contexts, values ); } }; }, progressValues, progressContexts, resolveContexts; // add listeners to Deferred subordinates; treat others as resolved if ( length > 1 ) { progressValues = new Array( length ); progressContexts = new Array( length ); resolveContexts = new Array( length ); for ( ; i < length; i++ ) { if ( resolveValues[ i ] && jQuery.isFunction( resolveValues[ i ].promise ) ) { resolveValues[ i ].promise() .progress( updateFunc( i, progressContexts, progressValues ) ) .done( updateFunc( i, resolveContexts, resolveValues ) ) .fail( deferred.reject ); } else { --remaining; } } } // if we're not waiting on anything, resolve the master if ( !remaining ) { deferred.resolveWith( resolveContexts, resolveValues ); } return deferred.promise(); } } ); // The deferred used on DOM ready var readyList; jQuery.fn.ready = function( fn ) { // Add the callback jQuery.ready.promise().done( fn ); return this; }; jQuery.extend( { // Is the DOM ready to be used? Set to true once it occurs. isReady: false, // A counter to track how many items to wait for before // the ready event fires. See #6781 readyWait: 1, // Hold (or release) the ready event holdReady: function( hold ) { if ( hold ) { jQuery.readyWait++; } else { jQuery.ready( true ); } }, // Handle when the DOM is ready ready: function( wait ) { // Abort if there are pending holds or we're already ready if ( wait === true ? --jQuery.readyWait : jQuery.isReady ) { return; } // Remember that the DOM is ready jQuery.isReady = true; // If a normal DOM Ready event fired, decrement, and wait if need be if ( wait !== true && --jQuery.readyWait > 0 ) { return; } // If there are functions bound, to execute readyList.resolveWith( document, [ jQuery ] ); // Trigger any bound ready events if ( jQuery.fn.triggerHandler ) { jQuery( document ).triggerHandler( "ready" ); jQuery( document ).off( "ready" ); } } } ); /** * Clean-up method for dom ready events */ function detach() { if ( document.addEventListener ) { document.removeEventListener( "DOMContentLoaded", completed ); window.removeEventListener( "load", completed ); } else { document.detachEvent( "onreadystatechange", completed ); window.detachEvent( "onload", completed ); } } /** * The ready event handler and self cleanup method */ function completed() { // readyState === "complete" is good enough for us to call the dom ready in oldIE if ( document.addEventListener || window.event.type === "load" || document.readyState === "complete" ) { detach(); jQuery.ready(); } } jQuery.ready.promise = function( obj ) { if ( !readyList ) { readyList = jQuery.Deferred(); // Catch cases where $(document).ready() is called // after the browser event has already occurred. // we once tried to use readyState "interactive" here, // but it caused issues like the one // discovered by ChrisS here: // http://bugs.jquery.com/ticket/12282#comment:15 if ( document.readyState === "complete" ) { // Handle it asynchronously to allow scripts the opportunity to delay ready window.setTimeout( jQuery.ready ); // Standards-based browsers support DOMContentLoaded } else if ( document.addEventListener ) { // Use the handy event callback document.addEventListener( "DOMContentLoaded", completed ); // A fallback to window.onload, that will always work window.addEventListener( "load", completed ); // If IE event model is used } else { // Ensure firing before onload, maybe late but safe also for iframes document.attachEvent( "onreadystatechange", completed ); // A fallback to window.onload, that will always work window.attachEvent( "onload", completed ); // If IE and not a frame // continually check to see if the document is ready var top = false; try { top = window.frameElement == null && document.documentElement; } catch ( e ) {} if ( top && top.doScroll ) { ( function doScrollCheck() { if ( !jQuery.isReady ) { try { // Use the trick by Diego Perini // http://javascript.nwbox.com/IEContentLoaded/ top.doScroll( "left" ); } catch ( e ) { return window.setTimeout( doScrollCheck, 50 ); } // detach all dom ready events detach(); // and execute any waiting functions jQuery.ready(); } } )(); } } } return readyList.promise( obj ); }; // Kick off the DOM ready check even if the user does not jQuery.ready.promise(); // Support: IE<9 // Iteration over object's inherited properties before its own var i; for ( i in jQuery( support ) ) { break; } support.ownFirst = i === "0"; // Note: most support tests are defined in their respective modules. // false until the test is run support.inlineBlockNeedsLayout = false; // Execute ASAP in case we need to set body.style.zoom jQuery( function() { // Minified: var a,b,c,d var val, div, body, container; body = document.getElementsByTagName( "body" )[ 0 ]; if ( !body || !body.style ) { // Return for frameset docs that don't have a body return; } // Setup div = document.createElement( "div" ); container = document.createElement( "div" ); container.style.cssText = "position:absolute;border:0;width:0;height:0;top:0;left:-9999px"; body.appendChild( container ).appendChild( div ); if ( typeof div.style.zoom !== "undefined" ) { // Support: IE<8 // Check if natively block-level elements act like inline-block // elements when setting their display to 'inline' and giving // them layout div.style.cssText = "display:inline;margin:0;border:0;padding:1px;width:1px;zoom:1"; support.inlineBlockNeedsLayout = val = div.offsetWidth === 3; if ( val ) { // Prevent IE 6 from affecting layout for positioned elements #11048 // Prevent IE from shrinking the body in IE 7 mode #12869 // Support: IE<8 body.style.zoom = 1; } } body.removeChild( container ); } ); ( function() { var div = document.createElement( "div" ); // Support: IE<9 support.deleteExpando = true; try { delete div.test; } catch ( e ) { support.deleteExpando = false; } // Null elements to avoid leaks in IE. div = null; } )(); var acceptData = function( elem ) { var noData = jQuery.noData[ ( elem.nodeName + " " ).toLowerCase() ], nodeType = +elem.nodeType || 1; // Do not set data on non-element DOM nodes because it will not be cleared (#8335). return nodeType !== 1 && nodeType !== 9 ? false : // Nodes accept data unless otherwise specified; rejection can be conditional !noData || noData !== true && elem.getAttribute( "classid" ) === noData; }; var rbrace = /^(?:\{[\w\W]*\}|\[[\w\W]*\])$/, rmultiDash = /([A-Z])/g; function dataAttr( elem, key, data ) { // If nothing was found internally, try to fetch any // data from the HTML5 data-* attribute if ( data === undefined && elem.nodeType === 1 ) { var name = "data-" + key.replace( rmultiDash, "-$1" ).toLowerCase(); data = elem.getAttribute( name ); if ( typeof data === "string" ) { try { data = data === "true" ? true : data === "false" ? false : data === "null" ? null : // Only convert to a number if it doesn't change the string +data + "" === data ? +data : rbrace.test( data ) ? jQuery.parseJSON( data ) : data; } catch ( e ) {} // Make sure we set the data so it isn't changed later jQuery.data( elem, key, data ); } else { data = undefined; } } return data; } // checks a cache object for emptiness function isEmptyDataObject( obj ) { var name; for ( name in obj ) { // if the public data object is empty, the private is still empty if ( name === "data" && jQuery.isEmptyObject( obj[ name ] ) ) { continue; } if ( name !== "toJSON" ) { return false; } } return true; } function internalData( elem, name, data, pvt /* Internal Use Only */ ) { if ( !acceptData( elem ) ) { return; } var ret, thisCache, internalKey = jQuery.expando, // We have to handle DOM nodes and JS objects differently because IE6-7 // can't GC object references properly across the DOM-JS boundary isNode = elem.nodeType, // Only DOM nodes need the global jQuery cache; JS object data is // attached directly to the object so GC can occur automatically cache = isNode ? jQuery.cache : elem, // Only defining an ID for JS objects if its cache already exists allows // the code to shortcut on the same path as a DOM node with no cache id = isNode ? elem[ internalKey ] : elem[ internalKey ] && internalKey; // Avoid doing any more work than we need to when trying to get data on an // object that has no data at all if ( ( !id || !cache[ id ] || ( !pvt && !cache[ id ].data ) ) && data === undefined && typeof name === "string" ) { return; } if ( !id ) { // Only DOM nodes need a new unique ID for each element since their data // ends up in the global cache if ( isNode ) { id = elem[ internalKey ] = deletedIds.pop() || jQuery.guid++; } else { id = internalKey; } } if ( !cache[ id ] ) { // Avoid exposing jQuery metadata on plain JS objects when the object // is serialized using JSON.stringify cache[ id ] = isNode ? {} : { toJSON: jQuery.noop }; } // An object can be passed to jQuery.data instead of a key/value pair; this gets // shallow copied over onto the existing cache if ( typeof name === "object" || typeof name === "function" ) { if ( pvt ) { cache[ id ] = jQuery.extend( cache[ id ], name ); } else { cache[ id ].data = jQuery.extend( cache[ id ].data, name ); } } thisCache = cache[ id ]; // jQuery data() is stored in a separate object inside the object's internal data // cache in order to avoid key collisions between internal data and user-defined // data. if ( !pvt ) { if ( !thisCache.data ) { thisCache.data = {}; } thisCache = thisCache.data; } if ( data !== undefined ) { thisCache[ jQuery.camelCase( name ) ] = data; } // Check for both converted-to-camel and non-converted data property names // If a data property was specified if ( typeof name === "string" ) { // First Try to find as-is property data ret = thisCache[ name ]; // Test for null|undefined property data if ( ret == null ) { // Try to find the camelCased property ret = thisCache[ jQuery.camelCase( name ) ]; } } else { ret = thisCache; } return ret; } function internalRemoveData( elem, name, pvt ) { if ( !acceptData( elem ) ) { return; } var thisCache, i, isNode = elem.nodeType, // See jQuery.data for more information cache = isNode ? jQuery.cache : elem, id = isNode ? elem[ jQuery.expando ] : jQuery.expando; // If there is already no cache entry for this object, there is no // purpose in continuing if ( !cache[ id ] ) { return; } if ( name ) { thisCache = pvt ? cache[ id ] : cache[ id ].data; if ( thisCache ) { // Support array or space separated string names for data keys if ( !jQuery.isArray( name ) ) { // try the string as a key before any manipulation if ( name in thisCache ) { name = [ name ]; } else { // split the camel cased version by spaces unless a key with the spaces exists name = jQuery.camelCase( name ); if ( name in thisCache ) { name = [ name ]; } else { name = name.split( " " ); } } } else { // If "name" is an array of keys... // When data is initially created, via ("key", "val") signature, // keys will be converted to camelCase. // Since there is no way to tell _how_ a key was added, remove // both plain key and camelCase key. #12786 // This will only penalize the array argument path. name = name.concat( jQuery.map( name, jQuery.camelCase ) ); } i = name.length; while ( i-- ) { delete thisCache[ name[ i ] ]; } // If there is no data left in the cache, we want to continue // and let the cache object itself get destroyed if ( pvt ? !isEmptyDataObject( thisCache ) : !jQuery.isEmptyObject( thisCache ) ) { return; } } } // See jQuery.data for more information if ( !pvt ) { delete cache[ id ].data; // Don't destroy the parent cache unless the internal data object // had been the only thing left in it if ( !isEmptyDataObject( cache[ id ] ) ) { return; } } // Destroy the cache if ( isNode ) { jQuery.cleanData( [ elem ], true ); // Use delete when supported for expandos or `cache` is not a window per isWindow (#10080) /* jshint eqeqeq: false */ } else if ( support.deleteExpando || cache != cache.window ) { /* jshint eqeqeq: true */ delete cache[ id ]; // When all else fails, undefined } else { cache[ id ] = undefined; } } jQuery.extend( { cache: {}, // The following elements (space-suffixed to avoid Object.prototype collisions) // throw uncatchable exceptions if you attempt to set expando properties noData: { "applet ": true, "embed ": true, // ...but Flash objects (which have this classid) *can* handle expandos "object ": "clsid:D27CDB6E-AE6D-11cf-96B8-444553540000" }, hasData: function( elem ) { elem = elem.nodeType ? jQuery.cache[ elem[ jQuery.expando ] ] : elem[ jQuery.expando ]; return !!elem && !isEmptyDataObject( elem ); }, data: function( elem, name, data ) { return internalData( elem, name, data ); }, removeData: function( elem, name ) { return internalRemoveData( elem, name ); }, // For internal use only. _data: function( elem, name, data ) { return internalData( elem, name, data, true ); }, _removeData: function( elem, name ) { return internalRemoveData( elem, name, true ); } } ); jQuery.fn.extend( { data: function( key, value ) { var i, name, data, elem = this[ 0 ], attrs = elem && elem.attributes; // Special expections of .data basically thwart jQuery.access, // so implement the relevant behavior ourselves // Gets all values if ( key === undefined ) { if ( this.length ) { data = jQuery.data( elem ); if ( elem.nodeType === 1 && !jQuery._data( elem, "parsedAttrs" ) ) { i = attrs.length; while ( i-- ) { // Support: IE11+ // The attrs elements can be null (#14894) if ( attrs[ i ] ) { name = attrs[ i ].name; if ( name.indexOf( "data-" ) === 0 ) { name = jQuery.camelCase( name.slice( 5 ) ); dataAttr( elem, name, data[ name ] ); } } } jQuery._data( elem, "parsedAttrs", true ); } } return data; } // Sets multiple values if ( typeof key === "object" ) { return this.each( function() { jQuery.data( this, key ); } ); } return arguments.length > 1 ? // Sets one value this.each( function() { jQuery.data( this, key, value ); } ) : // Gets one value // Try to fetch any internally stored data first elem ? dataAttr( elem, key, jQuery.data( elem, key ) ) : undefined; }, removeData: function( key ) { return this.each( function() { jQuery.removeData( this, key ); } ); } } ); jQuery.extend( { queue: function( elem, type, data ) { var queue; if ( elem ) { type = ( type || "fx" ) + "queue"; queue = jQuery._data( elem, type ); // Speed up dequeue by getting out quickly if this is just a lookup if ( data ) { if ( !queue || jQuery.isArray( data ) ) { queue = jQuery._data( elem, type, jQuery.makeArray( data ) ); } else { queue.push( data ); } } return queue || []; } }, dequeue: function( elem, type ) { type = type || "fx"; var queue = jQuery.queue( elem, type ), startLength = queue.length, fn = queue.shift(), hooks = jQuery._queueHooks( elem, type ), next = function() { jQuery.dequeue( elem, type ); }; // If the fx queue is dequeued, always remove the progress sentinel if ( fn === "inprogress" ) { fn = queue.shift(); startLength--; } if ( fn ) { // Add a progress sentinel to prevent the fx queue from being // automatically dequeued if ( type === "fx" ) { queue.unshift( "inprogress" ); } // clear up the last queue stop function delete hooks.stop; fn.call( elem, next, hooks ); } if ( !startLength && hooks ) { hooks.empty.fire(); } }, // not intended for public consumption - generates a queueHooks object, // or returns the current one _queueHooks: function( elem, type ) { var key = type + "queueHooks"; return jQuery._data( elem, key ) || jQuery._data( elem, key, { empty: jQuery.Callbacks( "once memory" ).add( function() { jQuery._removeData( elem, type + "queue" ); jQuery._removeData( elem, key ); } ) } ); } } ); jQuery.fn.extend( { queue: function( type, data ) { var setter = 2; if ( typeof type !== "string" ) { data = type; type = "fx"; setter--; } if ( arguments.length < setter ) { return jQuery.queue( this[ 0 ], type ); } return data === undefined ? this : this.each( function() { var queue = jQuery.queue( this, type, data ); // ensure a hooks for this queue jQuery._queueHooks( this, type ); if ( type === "fx" && queue[ 0 ] !== "inprogress" ) { jQuery.dequeue( this, type ); } } ); }, dequeue: function( type ) { return this.each( function() { jQuery.dequeue( this, type ); } ); }, clearQueue: function( type ) { return this.queue( type || "fx", [] ); }, // Get a promise resolved when queues of a certain type // are emptied (fx is the type by default) promise: function( type, obj ) { var tmp, count = 1, defer = jQuery.Deferred(), elements = this, i = this.length, resolve = function() { if ( !( --count ) ) { defer.resolveWith( elements, [ elements ] ); } }; if ( typeof type !== "string" ) { obj = type; type = undefined; } type = type || "fx"; while ( i-- ) { tmp = jQuery._data( elements[ i ], type + "queueHooks" ); if ( tmp && tmp.empty ) { count++; tmp.empty.add( resolve ); } } resolve(); return defer.promise( obj ); } } ); ( function() { var shrinkWrapBlocksVal; support.shrinkWrapBlocks = function() { if ( shrinkWrapBlocksVal != null ) { return shrinkWrapBlocksVal; } // Will be changed later if needed. shrinkWrapBlocksVal = false; // Minified: var b,c,d var div, body, container; body = document.getElementsByTagName( "body" )[ 0 ]; if ( !body || !body.style ) { // Test fired too early or in an unsupported environment, exit. return; } // Setup div = document.createElement( "div" ); container = document.createElement( "div" ); container.style.cssText = "position:absolute;border:0;width:0;height:0;top:0;left:-9999px"; body.appendChild( container ).appendChild( div ); // Support: IE6 // Check if elements with layout shrink-wrap their children if ( typeof div.style.zoom !== "undefined" ) { // Reset CSS: box-sizing; display; margin; border div.style.cssText = // Support: Firefox<29, Android 2.3 // Vendor-prefix box-sizing "-webkit-box-sizing:content-box;-moz-box-sizing:content-box;" + "box-sizing:content-box;display:block;margin:0;border:0;" + "padding:1px;width:1px;zoom:1"; div.appendChild( document.createElement( "div" ) ).style.width = "5px"; shrinkWrapBlocksVal = div.offsetWidth !== 3; } body.removeChild( container ); return shrinkWrapBlocksVal; }; } )(); var pnum = ( /[+-]?(?:\d*\.|)\d+(?:[eE][+-]?\d+|)/ ).source; var rcssNum = new RegExp( "^(?:([+-])=|)(" + pnum + ")([a-z%]*)$", "i" ); var cssExpand = [ "Top", "Right", "Bottom", "Left" ]; var isHidden = function( elem, el ) { // isHidden might be called from jQuery#filter function; // in that case, element will be second argument elem = el || elem; return jQuery.css( elem, "display" ) === "none" || !jQuery.contains( elem.ownerDocument, elem ); }; function adjustCSS( elem, prop, valueParts, tween ) { var adjusted, scale = 1, maxIterations = 20, currentValue = tween ? function() { return tween.cur(); } : function() { return jQuery.css( elem, prop, "" ); }, initial = currentValue(), unit = valueParts && valueParts[ 3 ] || ( jQuery.cssNumber[ prop ] ? "" : "px" ), // Starting value computation is required for potential unit mismatches initialInUnit = ( jQuery.cssNumber[ prop ] || unit !== "px" && +initial ) && rcssNum.exec( jQuery.css( elem, prop ) ); if ( initialInUnit && initialInUnit[ 3 ] !== unit ) { // Trust units reported by jQuery.css unit = unit || initialInUnit[ 3 ]; // Make sure we update the tween properties later on valueParts = valueParts || []; // Iteratively approximate from a nonzero starting point initialInUnit = +initial || 1; do { // If previous iteration zeroed out, double until we get *something*. // Use string for doubling so we don't accidentally see scale as unchanged below scale = scale || ".5"; // Adjust and apply initialInUnit = initialInUnit / scale; jQuery.style( elem, prop, initialInUnit + unit ); // Update scale, tolerating zero or NaN from tween.cur() // Break the loop if scale is unchanged or perfect, or if we've just had enough. } while ( scale !== ( scale = currentValue() / initial ) && scale !== 1 && --maxIterations ); } if ( valueParts ) { initialInUnit = +initialInUnit || +initial || 0; // Apply relative offset (+=/-=) if specified adjusted = valueParts[ 1 ] ? initialInUnit + ( valueParts[ 1 ] + 1 ) * valueParts[ 2 ] : +valueParts[ 2 ]; if ( tween ) { tween.unit = unit; tween.start = initialInUnit; tween.end = adjusted; } } return adjusted; } // Multifunctional method to get and set values of a collection // The value/s can optionally be executed if it's a function var access = function( elems, fn, key, value, chainable, emptyGet, raw ) { var i = 0, length = elems.length, bulk = key == null; // Sets many values if ( jQuery.type( key ) === "object" ) { chainable = true; for ( i in key ) { access( elems, fn, i, key[ i ], true, emptyGet, raw ); } // Sets one value } else if ( value !== undefined ) { chainable = true; if ( !jQuery.isFunction( value ) ) { raw = true; } if ( bulk ) { // Bulk operations run against the entire set if ( raw ) { fn.call( elems, value ); fn = null; // ...except when executing function values } else { bulk = fn; fn = function( elem, key, value ) { return bulk.call( jQuery( elem ), value ); }; } } if ( fn ) { for ( ; i < length; i++ ) { fn( elems[ i ], key, raw ? value : value.call( elems[ i ], i, fn( elems[ i ], key ) ) ); } } } return chainable ? elems : // Gets bulk ? fn.call( elems ) : length ? fn( elems[ 0 ], key ) : emptyGet; }; var rcheckableType = ( /^(?:checkbox|radio)$/i ); var rtagName = ( /<([\w:-]+)/ ); var rscriptType = ( /^$|\/(?:java|ecma)script/i ); var rleadingWhitespace = ( /^\s+/ ); var nodeNames = "abbr|article|aside|audio|bdi|canvas|data|datalist|" + "details|dialog|figcaption|figure|footer|header|hgroup|main|" + "mark|meter|nav|output|picture|progress|section|summary|template|time|video"; function createSafeFragment( document ) { var list = nodeNames.split( "|" ), safeFrag = document.createDocumentFragment(); if ( safeFrag.createElement ) { while ( list.length ) { safeFrag.createElement( list.pop() ); } } return safeFrag; } ( function() { var div = document.createElement( "div" ), fragment = document.createDocumentFragment(), input = document.createElement( "input" ); // Setup div.innerHTML = "
a"; // IE strips leading whitespace when .innerHTML is used support.leadingWhitespace = div.firstChild.nodeType === 3; // Make sure that tbody elements aren't automatically inserted // IE will insert them into empty tables support.tbody = !div.getElementsByTagName( "tbody" ).length; // Make sure that link elements get serialized correctly by innerHTML // This requires a wrapper element in IE support.htmlSerialize = !!div.getElementsByTagName( "link" ).length; // Makes sure cloning an html5 element does not cause problems // Where outerHTML is undefined, this still works support.html5Clone = document.createElement( "nav" ).cloneNode( true ).outerHTML !== "<:nav>"; // Check if a disconnected checkbox will retain its checked // value of true after appended to the DOM (IE6/7) input.type = "checkbox"; input.checked = true; fragment.appendChild( input ); support.appendChecked = input.checked; // Make sure textarea (and checkbox) defaultValue is properly cloned // Support: IE6-IE11+ div.innerHTML = ""; support.noCloneChecked = !!div.cloneNode( true ).lastChild.defaultValue; // #11217 - WebKit loses check when the name is after the checked attribute fragment.appendChild( div ); // Support: Windows Web Apps (WWA) // `name` and `type` must use .setAttribute for WWA (#14901) input = document.createElement( "input" ); input.setAttribute( "type", "radio" ); input.setAttribute( "checked", "checked" ); input.setAttribute( "name", "t" ); div.appendChild( input ); // Support: Safari 5.1, iOS 5.1, Android 4.x, Android 2.3 // old WebKit doesn't clone checked state correctly in fragments support.checkClone = div.cloneNode( true ).cloneNode( true ).lastChild.checked; // Support: IE<9 // Cloned elements keep attachEvent handlers, we use addEventListener on IE9+ support.noCloneEvent = !!div.addEventListener; // Support: IE<9 // Since attributes and properties are the same in IE, // cleanData must set properties to undefined rather than use removeAttribute div[ jQuery.expando ] = 1; support.attributes = !div.getAttribute( jQuery.expando ); } )(); // We have to close these tags to support XHTML (#13200) var wrapMap = { option: [ 1, "" ], legend: [ 1, "
", "
" ], area: [ 1, "", "" ], // Support: IE8 param: [ 1, "", "" ], thead: [ 1, "", "
" ], tr: [ 2, "", "
" ], col: [ 2, "", "
" ], td: [ 3, "", "
" ], // IE6-8 can't serialize link, script, style, or any html5 (NoScope) tags, // unless wrapped in a div with non-breaking characters in front of it. _default: support.htmlSerialize ? [ 0, "", "" ] : [ 1, "X
", "
" ] }; // Support: IE8-IE9 wrapMap.optgroup = wrapMap.option; wrapMap.tbody = wrapMap.tfoot = wrapMap.colgroup = wrapMap.caption = wrapMap.thead; wrapMap.th = wrapMap.td; function getAll( context, tag ) { var elems, elem, i = 0, found = typeof context.getElementsByTagName !== "undefined" ? context.getElementsByTagName( tag || "*" ) : typeof context.querySelectorAll !== "undefined" ? context.querySelectorAll( tag || "*" ) : undefined; if ( !found ) { for ( found = [], elems = context.childNodes || context; ( elem = elems[ i ] ) != null; i++ ) { if ( !tag || jQuery.nodeName( elem, tag ) ) { found.push( elem ); } else { jQuery.merge( found, getAll( elem, tag ) ); } } } return tag === undefined || tag && jQuery.nodeName( context, tag ) ? jQuery.merge( [ context ], found ) : found; } // Mark scripts as having already been evaluated function setGlobalEval( elems, refElements ) { var elem, i = 0; for ( ; ( elem = elems[ i ] ) != null; i++ ) { jQuery._data( elem, "globalEval", !refElements || jQuery._data( refElements[ i ], "globalEval" ) ); } } var rhtml = /<|&#?\w+;/, rtbody = / from table fragments if ( !support.tbody ) { // String was a , *may* have spurious elem = tag === "table" && !rtbody.test( elem ) ? tmp.firstChild : // String was a bare or wrap[ 1 ] === "
" && !rtbody.test( elem ) ? tmp : 0; j = elem && elem.childNodes.length; while ( j-- ) { if ( jQuery.nodeName( ( tbody = elem.childNodes[ j ] ), "tbody" ) && !tbody.childNodes.length ) { elem.removeChild( tbody ); } } } jQuery.merge( nodes, tmp.childNodes ); // Fix #12392 for WebKit and IE > 9 tmp.textContent = ""; // Fix #12392 for oldIE while ( tmp.firstChild ) { tmp.removeChild( tmp.firstChild ); } // Remember the top-level container for proper cleanup tmp = safe.lastChild; } } } // Fix #11356: Clear elements from fragment if ( tmp ) { safe.removeChild( tmp ); } // Reset defaultChecked for any radios and checkboxes // about to be appended to the DOM in IE 6/7 (#8060) if ( !support.appendChecked ) { jQuery.grep( getAll( nodes, "input" ), fixDefaultChecked ); } i = 0; while ( ( elem = nodes[ i++ ] ) ) { // Skip elements already in the context collection (trac-4087) if ( selection && jQuery.inArray( elem, selection ) > -1 ) { if ( ignored ) { ignored.push( elem ); } continue; } contains = jQuery.contains( elem.ownerDocument, elem ); // Append to fragment tmp = getAll( safe.appendChild( elem ), "script" ); // Preserve script evaluation history if ( contains ) { setGlobalEval( tmp ); } // Capture executables if ( scripts ) { j = 0; while ( ( elem = tmp[ j++ ] ) ) { if ( rscriptType.test( elem.type || "" ) ) { scripts.push( elem ); } } } } tmp = null; return safe; } ( function() { var i, eventName, div = document.createElement( "div" ); // Support: IE<9 (lack submit/change bubble), Firefox (lack focus(in | out) events) for ( i in { submit: true, change: true, focusin: true } ) { eventName = "on" + i; if ( !( support[ i ] = eventName in window ) ) { // Beware of CSP restrictions (https://developer.mozilla.org/en/Security/CSP) div.setAttribute( eventName, "t" ); support[ i ] = div.attributes[ eventName ].expando === false; } } // Null elements to avoid leaks in IE. div = null; } )(); var rformElems = /^(?:input|select|textarea)$/i, rkeyEvent = /^key/, rmouseEvent = /^(?:mouse|pointer|contextmenu|drag|drop)|click/, rfocusMorph = /^(?:focusinfocus|focusoutblur)$/, rtypenamespace = /^([^.]*)(?:\.(.+)|)/; function returnTrue() { return true; } function returnFalse() { return false; } // Support: IE9 // See #13393 for more info function safeActiveElement() { try { return document.activeElement; } catch ( err ) { } } function on( elem, types, selector, data, fn, one ) { var origFn, type; // Types can be a map of types/handlers if ( typeof types === "object" ) { // ( types-Object, selector, data ) if ( typeof selector !== "string" ) { // ( types-Object, data ) data = data || selector; selector = undefined; } for ( type in types ) { on( elem, type, selector, data, types[ type ], one ); } return elem; } if ( data == null && fn == null ) { // ( types, fn ) fn = selector; data = selector = undefined; } else if ( fn == null ) { if ( typeof selector === "string" ) { // ( types, selector, fn ) fn = data; data = undefined; } else { // ( types, data, fn ) fn = data; data = selector; selector = undefined; } } if ( fn === false ) { fn = returnFalse; } else if ( !fn ) { return elem; } if ( one === 1 ) { origFn = fn; fn = function( event ) { // Can use an empty set, since event contains the info jQuery().off( event ); return origFn.apply( this, arguments ); }; // Use same guid so caller can remove using origFn fn.guid = origFn.guid || ( origFn.guid = jQuery.guid++ ); } return elem.each( function() { jQuery.event.add( this, types, fn, data, selector ); } ); } /* * Helper functions for managing events -- not part of the public interface. * Props to Dean Edwards' addEvent library for many of the ideas. */ jQuery.event = { global: {}, add: function( elem, types, handler, data, selector ) { var tmp, events, t, handleObjIn, special, eventHandle, handleObj, handlers, type, namespaces, origType, elemData = jQuery._data( elem ); // Don't attach events to noData or text/comment nodes (but allow plain objects) if ( !elemData ) { return; } // Caller can pass in an object of custom data in lieu of the handler if ( handler.handler ) { handleObjIn = handler; handler = handleObjIn.handler; selector = handleObjIn.selector; } // Make sure that the handler has a unique ID, used to find/remove it later if ( !handler.guid ) { handler.guid = jQuery.guid++; } // Init the element's event structure and main handler, if this is the first if ( !( events = elemData.events ) ) { events = elemData.events = {}; } if ( !( eventHandle = elemData.handle ) ) { eventHandle = elemData.handle = function( e ) { // Discard the second event of a jQuery.event.trigger() and // when an event is called after a page has unloaded return typeof jQuery !== "undefined" && ( !e || jQuery.event.triggered !== e.type ) ? jQuery.event.dispatch.apply( eventHandle.elem, arguments ) : undefined; }; // Add elem as a property of the handle fn to prevent a memory leak // with IE non-native events eventHandle.elem = elem; } // Handle multiple events separated by a space types = ( types || "" ).match( rnotwhite ) || [ "" ]; t = types.length; while ( t-- ) { tmp = rtypenamespace.exec( types[ t ] ) || []; type = origType = tmp[ 1 ]; namespaces = ( tmp[ 2 ] || "" ).split( "." ).sort(); // There *must* be a type, no attaching namespace-only handlers if ( !type ) { continue; } // If event changes its type, use the special event handlers for the changed type special = jQuery.event.special[ type ] || {}; // If selector defined, determine special event api type, otherwise given type type = ( selector ? special.delegateType : special.bindType ) || type; // Update special based on newly reset type special = jQuery.event.special[ type ] || {}; // handleObj is passed to all event handlers handleObj = jQuery.extend( { type: type, origType: origType, data: data, handler: handler, guid: handler.guid, selector: selector, needsContext: selector && jQuery.expr.match.needsContext.test( selector ), namespace: namespaces.join( "." ) }, handleObjIn ); // Init the event handler queue if we're the first if ( !( handlers = events[ type ] ) ) { handlers = events[ type ] = []; handlers.delegateCount = 0; // Only use addEventListener/attachEvent if the special events handler returns false if ( !special.setup || special.setup.call( elem, data, namespaces, eventHandle ) === false ) { // Bind the global event handler to the element if ( elem.addEventListener ) { elem.addEventListener( type, eventHandle, false ); } else if ( elem.attachEvent ) { elem.attachEvent( "on" + type, eventHandle ); } } } if ( special.add ) { special.add.call( elem, handleObj ); if ( !handleObj.handler.guid ) { handleObj.handler.guid = handler.guid; } } // Add to the element's handler list, delegates in front if ( selector ) { handlers.splice( handlers.delegateCount++, 0, handleObj ); } else { handlers.push( handleObj ); } // Keep track of which events have ever been used, for event optimization jQuery.event.global[ type ] = true; } // Nullify elem to prevent memory leaks in IE elem = null; }, // Detach an event or set of events from an element remove: function( elem, types, handler, selector, mappedTypes ) { var j, handleObj, tmp, origCount, t, events, special, handlers, type, namespaces, origType, elemData = jQuery.hasData( elem ) && jQuery._data( elem ); if ( !elemData || !( events = elemData.events ) ) { return; } // Once for each type.namespace in types; type may be omitted types = ( types || "" ).match( rnotwhite ) || [ "" ]; t = types.length; while ( t-- ) { tmp = rtypenamespace.exec( types[ t ] ) || []; type = origType = tmp[ 1 ]; namespaces = ( tmp[ 2 ] || "" ).split( "." ).sort(); // Unbind all events (on this namespace, if provided) for the element if ( !type ) { for ( type in events ) { jQuery.event.remove( elem, type + types[ t ], handler, selector, true ); } continue; } special = jQuery.event.special[ type ] || {}; type = ( selector ? special.delegateType : special.bindType ) || type; handlers = events[ type ] || []; tmp = tmp[ 2 ] && new RegExp( "(^|\\.)" + namespaces.join( "\\.(?:.*\\.|)" ) + "(\\.|$)" ); // Remove matching events origCount = j = handlers.length; while ( j-- ) { handleObj = handlers[ j ]; if ( ( mappedTypes || origType === handleObj.origType ) && ( !handler || handler.guid === handleObj.guid ) && ( !tmp || tmp.test( handleObj.namespace ) ) && ( !selector || selector === handleObj.selector || selector === "**" && handleObj.selector ) ) { handlers.splice( j, 1 ); if ( handleObj.selector ) { handlers.delegateCount--; } if ( special.remove ) { special.remove.call( elem, handleObj ); } } } // Remove generic event handler if we removed something and no more handlers exist // (avoids potential for endless recursion during removal of special event handlers) if ( origCount && !handlers.length ) { if ( !special.teardown || special.teardown.call( elem, namespaces, elemData.handle ) === false ) { jQuery.removeEvent( elem, type, elemData.handle ); } delete events[ type ]; } } // Remove the expando if it's no longer used if ( jQuery.isEmptyObject( events ) ) { delete elemData.handle; // removeData also checks for emptiness and clears the expando if empty // so use it instead of delete jQuery._removeData( elem, "events" ); } }, trigger: function( event, data, elem, onlyHandlers ) { var handle, ontype, cur, bubbleType, special, tmp, i, eventPath = [ elem || document ], type = hasOwn.call( event, "type" ) ? event.type : event, namespaces = hasOwn.call( event, "namespace" ) ? event.namespace.split( "." ) : []; cur = tmp = elem = elem || document; // Don't do events on text and comment nodes if ( elem.nodeType === 3 || elem.nodeType === 8 ) { return; } // focus/blur morphs to focusin/out; ensure we're not firing them right now if ( rfocusMorph.test( type + jQuery.event.triggered ) ) { return; } if ( type.indexOf( "." ) > -1 ) { // Namespaced trigger; create a regexp to match event type in handle() namespaces = type.split( "." ); type = namespaces.shift(); namespaces.sort(); } ontype = type.indexOf( ":" ) < 0 && "on" + type; // Caller can pass in a jQuery.Event object, Object, or just an event type string event = event[ jQuery.expando ] ? event : new jQuery.Event( type, typeof event === "object" && event ); // Trigger bitmask: & 1 for native handlers; & 2 for jQuery (always true) event.isTrigger = onlyHandlers ? 2 : 3; event.namespace = namespaces.join( "." ); event.rnamespace = event.namespace ? new RegExp( "(^|\\.)" + namespaces.join( "\\.(?:.*\\.|)" ) + "(\\.|$)" ) : null; // Clean up the event in case it is being reused event.result = undefined; if ( !event.target ) { event.target = elem; } // Clone any incoming data and prepend the event, creating the handler arg list data = data == null ? [ event ] : jQuery.makeArray( data, [ event ] ); // Allow special events to draw outside the lines special = jQuery.event.special[ type ] || {}; if ( !onlyHandlers && special.trigger && special.trigger.apply( elem, data ) === false ) { return; } // Determine event propagation path in advance, per W3C events spec (#9951) // Bubble up to document, then to window; watch for a global ownerDocument var (#9724) if ( !onlyHandlers && !special.noBubble && !jQuery.isWindow( elem ) ) { bubbleType = special.delegateType || type; if ( !rfocusMorph.test( bubbleType + type ) ) { cur = cur.parentNode; } for ( ; cur; cur = cur.parentNode ) { eventPath.push( cur ); tmp = cur; } // Only add window if we got to document (e.g., not plain obj or detached DOM) if ( tmp === ( elem.ownerDocument || document ) ) { eventPath.push( tmp.defaultView || tmp.parentWindow || window ); } } // Fire handlers on the event path i = 0; while ( ( cur = eventPath[ i++ ] ) && !event.isPropagationStopped() ) { event.type = i > 1 ? bubbleType : special.bindType || type; // jQuery handler handle = ( jQuery._data( cur, "events" ) || {} )[ event.type ] && jQuery._data( cur, "handle" ); if ( handle ) { handle.apply( cur, data ); } // Native handler handle = ontype && cur[ ontype ]; if ( handle && handle.apply && acceptData( cur ) ) { event.result = handle.apply( cur, data ); if ( event.result === false ) { event.preventDefault(); } } } event.type = type; // If nobody prevented the default action, do it now if ( !onlyHandlers && !event.isDefaultPrevented() ) { if ( ( !special._default || special._default.apply( eventPath.pop(), data ) === false ) && acceptData( elem ) ) { // Call a native DOM method on the target with the same name name as the event. // Can't use an .isFunction() check here because IE6/7 fails that test. // Don't do default actions on window, that's where global variables be (#6170) if ( ontype && elem[ type ] && !jQuery.isWindow( elem ) ) { // Don't re-trigger an onFOO event when we call its FOO() method tmp = elem[ ontype ]; if ( tmp ) { elem[ ontype ] = null; } // Prevent re-triggering of the same event, since we already bubbled it above jQuery.event.triggered = type; try { elem[ type ](); } catch ( e ) { // IE<9 dies on focus/blur to hidden element (#1486,#12518) // only reproducible on winXP IE8 native, not IE9 in IE8 mode } jQuery.event.triggered = undefined; if ( tmp ) { elem[ ontype ] = tmp; } } } } return event.result; }, dispatch: function( event ) { // Make a writable jQuery.Event from the native event object event = jQuery.event.fix( event ); var i, j, ret, matched, handleObj, handlerQueue = [], args = slice.call( arguments ), handlers = ( jQuery._data( this, "events" ) || {} )[ event.type ] || [], special = jQuery.event.special[ event.type ] || {}; // Use the fix-ed jQuery.Event rather than the (read-only) native event args[ 0 ] = event; event.delegateTarget = this; // Call the preDispatch hook for the mapped type, and let it bail if desired if ( special.preDispatch && special.preDispatch.call( this, event ) === false ) { return; } // Determine handlers handlerQueue = jQuery.event.handlers.call( this, event, handlers ); // Run delegates first; they may want to stop propagation beneath us i = 0; while ( ( matched = handlerQueue[ i++ ] ) && !event.isPropagationStopped() ) { event.currentTarget = matched.elem; j = 0; while ( ( handleObj = matched.handlers[ j++ ] ) && !event.isImmediatePropagationStopped() ) { // Triggered event must either 1) have no namespace, or 2) have namespace(s) // a subset or equal to those in the bound event (both can have no namespace). if ( !event.rnamespace || event.rnamespace.test( handleObj.namespace ) ) { event.handleObj = handleObj; event.data = handleObj.data; ret = ( ( jQuery.event.special[ handleObj.origType ] || {} ).handle || handleObj.handler ).apply( matched.elem, args ); if ( ret !== undefined ) { if ( ( event.result = ret ) === false ) { event.preventDefault(); event.stopPropagation(); } } } } } // Call the postDispatch hook for the mapped type if ( special.postDispatch ) { special.postDispatch.call( this, event ); } return event.result; }, handlers: function( event, handlers ) { var i, matches, sel, handleObj, handlerQueue = [], delegateCount = handlers.delegateCount, cur = event.target; // Support (at least): Chrome, IE9 // Find delegate handlers // Black-hole SVG instance trees (#13180) // // Support: Firefox<=42+ // Avoid non-left-click in FF but don't block IE radio events (#3861, gh-2343) if ( delegateCount && cur.nodeType && ( event.type !== "click" || isNaN( event.button ) || event.button < 1 ) ) { /* jshint eqeqeq: false */ for ( ; cur != this; cur = cur.parentNode || this ) { /* jshint eqeqeq: true */ // Don't check non-elements (#13208) // Don't process clicks on disabled elements (#6911, #8165, #11382, #11764) if ( cur.nodeType === 1 && ( cur.disabled !== true || event.type !== "click" ) ) { matches = []; for ( i = 0; i < delegateCount; i++ ) { handleObj = handlers[ i ]; // Don't conflict with Object.prototype properties (#13203) sel = handleObj.selector + " "; if ( matches[ sel ] === undefined ) { matches[ sel ] = handleObj.needsContext ? jQuery( sel, this ).index( cur ) > -1 : jQuery.find( sel, this, null, [ cur ] ).length; } if ( matches[ sel ] ) { matches.push( handleObj ); } } if ( matches.length ) { handlerQueue.push( { elem: cur, handlers: matches } ); } } } } // Add the remaining (directly-bound) handlers if ( delegateCount < handlers.length ) { handlerQueue.push( { elem: this, handlers: handlers.slice( delegateCount ) } ); } return handlerQueue; }, fix: function( event ) { if ( event[ jQuery.expando ] ) { return event; } // Create a writable copy of the event object and normalize some properties var i, prop, copy, type = event.type, originalEvent = event, fixHook = this.fixHooks[ type ]; if ( !fixHook ) { this.fixHooks[ type ] = fixHook = rmouseEvent.test( type ) ? this.mouseHooks : rkeyEvent.test( type ) ? this.keyHooks : {}; } copy = fixHook.props ? this.props.concat( fixHook.props ) : this.props; event = new jQuery.Event( originalEvent ); i = copy.length; while ( i-- ) { prop = copy[ i ]; event[ prop ] = originalEvent[ prop ]; } // Support: IE<9 // Fix target property (#1925) if ( !event.target ) { event.target = originalEvent.srcElement || document; } // Support: Safari 6-8+ // Target should not be a text node (#504, #13143) if ( event.target.nodeType === 3 ) { event.target = event.target.parentNode; } // Support: IE<9 // For mouse/key events, metaKey==false if it's undefined (#3368, #11328) event.metaKey = !!event.metaKey; return fixHook.filter ? fixHook.filter( event, originalEvent ) : event; }, // Includes some event props shared by KeyEvent and MouseEvent props: ( "altKey bubbles cancelable ctrlKey currentTarget detail eventPhase " + "metaKey relatedTarget shiftKey target timeStamp view which" ).split( " " ), fixHooks: {}, keyHooks: { props: "char charCode key keyCode".split( " " ), filter: function( event, original ) { // Add which for key events if ( event.which == null ) { event.which = original.charCode != null ? original.charCode : original.keyCode; } return event; } }, mouseHooks: { props: ( "button buttons clientX clientY fromElement offsetX offsetY " + "pageX pageY screenX screenY toElement" ).split( " " ), filter: function( event, original ) { var body, eventDoc, doc, button = original.button, fromElement = original.fromElement; // Calculate pageX/Y if missing and clientX/Y available if ( event.pageX == null && original.clientX != null ) { eventDoc = event.target.ownerDocument || document; doc = eventDoc.documentElement; body = eventDoc.body; event.pageX = original.clientX + ( doc && doc.scrollLeft || body && body.scrollLeft || 0 ) - ( doc && doc.clientLeft || body && body.clientLeft || 0 ); event.pageY = original.clientY + ( doc && doc.scrollTop || body && body.scrollTop || 0 ) - ( doc && doc.clientTop || body && body.clientTop || 0 ); } // Add relatedTarget, if necessary if ( !event.relatedTarget && fromElement ) { event.relatedTarget = fromElement === event.target ? original.toElement : fromElement; } // Add which for click: 1 === left; 2 === middle; 3 === right // Note: button is not normalized, so don't use it if ( !event.which && button !== undefined ) { event.which = ( button & 1 ? 1 : ( button & 2 ? 3 : ( button & 4 ? 2 : 0 ) ) ); } return event; } }, special: { load: { // Prevent triggered image.load events from bubbling to window.load noBubble: true }, focus: { // Fire native event if possible so blur/focus sequence is correct trigger: function() { if ( this !== safeActiveElement() && this.focus ) { try { this.focus(); return false; } catch ( e ) { // Support: IE<9 // If we error on focus to hidden element (#1486, #12518), // let .trigger() run the handlers } } }, delegateType: "focusin" }, blur: { trigger: function() { if ( this === safeActiveElement() && this.blur ) { this.blur(); return false; } }, delegateType: "focusout" }, click: { // For checkbox, fire native event so checked state will be right trigger: function() { if ( jQuery.nodeName( this, "input" ) && this.type === "checkbox" && this.click ) { this.click(); return false; } }, // For cross-browser consistency, don't fire native .click() on links _default: function( event ) { return jQuery.nodeName( event.target, "a" ); } }, beforeunload: { postDispatch: function( event ) { // Support: Firefox 20+ // Firefox doesn't alert if the returnValue field is not set. if ( event.result !== undefined && event.originalEvent ) { event.originalEvent.returnValue = event.result; } } } }, // Piggyback on a donor event to simulate a different one simulate: function( type, elem, event ) { var e = jQuery.extend( new jQuery.Event(), event, { type: type, isSimulated: true // Previously, `originalEvent: {}` was set here, so stopPropagation call // would not be triggered on donor event, since in our own // jQuery.event.stopPropagation function we had a check for existence of // originalEvent.stopPropagation method, so, consequently it would be a noop. // // Guard for simulated events was moved to jQuery.event.stopPropagation function // since `originalEvent` should point to the original event for the // constancy with other events and for more focused logic } ); jQuery.event.trigger( e, null, elem ); if ( e.isDefaultPrevented() ) { event.preventDefault(); } } }; jQuery.removeEvent = document.removeEventListener ? function( elem, type, handle ) { // This "if" is needed for plain objects if ( elem.removeEventListener ) { elem.removeEventListener( type, handle ); } } : function( elem, type, handle ) { var name = "on" + type; if ( elem.detachEvent ) { // #8545, #7054, preventing memory leaks for custom events in IE6-8 // detachEvent needed property on element, by name of that event, // to properly expose it to GC if ( typeof elem[ name ] === "undefined" ) { elem[ name ] = null; } elem.detachEvent( name, handle ); } }; jQuery.Event = function( src, props ) { // Allow instantiation without the 'new' keyword if ( !( this instanceof jQuery.Event ) ) { return new jQuery.Event( src, props ); } // Event object if ( src && src.type ) { this.originalEvent = src; this.type = src.type; // Events bubbling up the document may have been marked as prevented // by a handler lower down the tree; reflect the correct value. this.isDefaultPrevented = src.defaultPrevented || src.defaultPrevented === undefined && // Support: IE < 9, Android < 4.0 src.returnValue === false ? returnTrue : returnFalse; // Event type } else { this.type = src; } // Put explicitly provided properties onto the event object if ( props ) { jQuery.extend( this, props ); } // Create a timestamp if incoming event doesn't have one this.timeStamp = src && src.timeStamp || jQuery.now(); // Mark it as fixed this[ jQuery.expando ] = true; }; // jQuery.Event is based on DOM3 Events as specified by the ECMAScript Language Binding // http://www.w3.org/TR/2003/WD-DOM-Level-3-Events-20030331/ecma-script-binding.html jQuery.Event.prototype = { constructor: jQuery.Event, isDefaultPrevented: returnFalse, isPropagationStopped: returnFalse, isImmediatePropagationStopped: returnFalse, preventDefault: function() { var e = this.originalEvent; this.isDefaultPrevented = returnTrue; if ( !e ) { return; } // If preventDefault exists, run it on the original event if ( e.preventDefault ) { e.preventDefault(); // Support: IE // Otherwise set the returnValue property of the original event to false } else { e.returnValue = false; } }, stopPropagation: function() { var e = this.originalEvent; this.isPropagationStopped = returnTrue; if ( !e || this.isSimulated ) { return; } // If stopPropagation exists, run it on the original event if ( e.stopPropagation ) { e.stopPropagation(); } // Support: IE // Set the cancelBubble property of the original event to true e.cancelBubble = true; }, stopImmediatePropagation: function() { var e = this.originalEvent; this.isImmediatePropagationStopped = returnTrue; if ( e && e.stopImmediatePropagation ) { e.stopImmediatePropagation(); } this.stopPropagation(); } }; // Create mouseenter/leave events using mouseover/out and event-time checks // so that event delegation works in jQuery. // Do the same for pointerenter/pointerleave and pointerover/pointerout // // Support: Safari 7 only // Safari sends mouseenter too often; see: // https://code.google.com/p/chromium/issues/detail?id=470258 // for the description of the bug (it existed in older Chrome versions as well). jQuery.each( { mouseenter: "mouseover", mouseleave: "mouseout", pointerenter: "pointerover", pointerleave: "pointerout" }, function( orig, fix ) { jQuery.event.special[ orig ] = { delegateType: fix, bindType: fix, handle: function( event ) { var ret, target = this, related = event.relatedTarget, handleObj = event.handleObj; // For mouseenter/leave call the handler if related is outside the target. // NB: No relatedTarget if the mouse left/entered the browser window if ( !related || ( related !== target && !jQuery.contains( target, related ) ) ) { event.type = handleObj.origType; ret = handleObj.handler.apply( this, arguments ); event.type = fix; } return ret; } }; } ); // IE submit delegation if ( !support.submit ) { jQuery.event.special.submit = { setup: function() { // Only need this for delegated form submit events if ( jQuery.nodeName( this, "form" ) ) { return false; } // Lazy-add a submit handler when a descendant form may potentially be submitted jQuery.event.add( this, "click._submit keypress._submit", function( e ) { // Node name check avoids a VML-related crash in IE (#9807) var elem = e.target, form = jQuery.nodeName( elem, "input" ) || jQuery.nodeName( elem, "button" ) ? // Support: IE <=8 // We use jQuery.prop instead of elem.form // to allow fixing the IE8 delegated submit issue (gh-2332) // by 3rd party polyfills/workarounds. jQuery.prop( elem, "form" ) : undefined; if ( form && !jQuery._data( form, "submit" ) ) { jQuery.event.add( form, "submit._submit", function( event ) { event._submitBubble = true; } ); jQuery._data( form, "submit", true ); } } ); // return undefined since we don't need an event listener }, postDispatch: function( event ) { // If form was submitted by the user, bubble the event up the tree if ( event._submitBubble ) { delete event._submitBubble; if ( this.parentNode && !event.isTrigger ) { jQuery.event.simulate( "submit", this.parentNode, event ); } } }, teardown: function() { // Only need this for delegated form submit events if ( jQuery.nodeName( this, "form" ) ) { return false; } // Remove delegated handlers; cleanData eventually reaps submit handlers attached above jQuery.event.remove( this, "._submit" ); } }; } // IE change delegation and checkbox/radio fix if ( !support.change ) { jQuery.event.special.change = { setup: function() { if ( rformElems.test( this.nodeName ) ) { // IE doesn't fire change on a check/radio until blur; trigger it on click // after a propertychange. Eat the blur-change in special.change.handle. // This still fires onchange a second time for check/radio after blur. if ( this.type === "checkbox" || this.type === "radio" ) { jQuery.event.add( this, "propertychange._change", function( event ) { if ( event.originalEvent.propertyName === "checked" ) { this._justChanged = true; } } ); jQuery.event.add( this, "click._change", function( event ) { if ( this._justChanged && !event.isTrigger ) { this._justChanged = false; } // Allow triggered, simulated change events (#11500) jQuery.event.simulate( "change", this, event ); } ); } return false; } // Delegated event; lazy-add a change handler on descendant inputs jQuery.event.add( this, "beforeactivate._change", function( e ) { var elem = e.target; if ( rformElems.test( elem.nodeName ) && !jQuery._data( elem, "change" ) ) { jQuery.event.add( elem, "change._change", function( event ) { if ( this.parentNode && !event.isSimulated && !event.isTrigger ) { jQuery.event.simulate( "change", this.parentNode, event ); } } ); jQuery._data( elem, "change", true ); } } ); }, handle: function( event ) { var elem = event.target; // Swallow native change events from checkbox/radio, we already triggered them above if ( this !== elem || event.isSimulated || event.isTrigger || ( elem.type !== "radio" && elem.type !== "checkbox" ) ) { return event.handleObj.handler.apply( this, arguments ); } }, teardown: function() { jQuery.event.remove( this, "._change" ); return !rformElems.test( this.nodeName ); } }; } // Support: Firefox // Firefox doesn't have focus(in | out) events // Related ticket - https://bugzilla.mozilla.org/show_bug.cgi?id=687787 // // Support: Chrome, Safari // focus(in | out) events fire after focus & blur events, // which is spec violation - http://www.w3.org/TR/DOM-Level-3-Events/#events-focusevent-event-order // Related ticket - https://code.google.com/p/chromium/issues/detail?id=449857 if ( !support.focusin ) { jQuery.each( { focus: "focusin", blur: "focusout" }, function( orig, fix ) { // Attach a single capturing handler on the document while someone wants focusin/focusout var handler = function( event ) { jQuery.event.simulate( fix, event.target, jQuery.event.fix( event ) ); }; jQuery.event.special[ fix ] = { setup: function() { var doc = this.ownerDocument || this, attaches = jQuery._data( doc, fix ); if ( !attaches ) { doc.addEventListener( orig, handler, true ); } jQuery._data( doc, fix, ( attaches || 0 ) + 1 ); }, teardown: function() { var doc = this.ownerDocument || this, attaches = jQuery._data( doc, fix ) - 1; if ( !attaches ) { doc.removeEventListener( orig, handler, true ); jQuery._removeData( doc, fix ); } else { jQuery._data( doc, fix, attaches ); } } }; } ); } jQuery.fn.extend( { on: function( types, selector, data, fn ) { return on( this, types, selector, data, fn ); }, one: function( types, selector, data, fn ) { return on( this, types, selector, data, fn, 1 ); }, off: function( types, selector, fn ) { var handleObj, type; if ( types && types.preventDefault && types.handleObj ) { // ( event ) dispatched jQuery.Event handleObj = types.handleObj; jQuery( types.delegateTarget ).off( handleObj.namespace ? handleObj.origType + "." + handleObj.namespace : handleObj.origType, handleObj.selector, handleObj.handler ); return this; } if ( typeof types === "object" ) { // ( types-object [, selector] ) for ( type in types ) { this.off( type, selector, types[ type ] ); } return this; } if ( selector === false || typeof selector === "function" ) { // ( types [, fn] ) fn = selector; selector = undefined; } if ( fn === false ) { fn = returnFalse; } return this.each( function() { jQuery.event.remove( this, types, fn, selector ); } ); }, trigger: function( type, data ) { return this.each( function() { jQuery.event.trigger( type, data, this ); } ); }, triggerHandler: function( type, data ) { var elem = this[ 0 ]; if ( elem ) { return jQuery.event.trigger( type, data, elem, true ); } } } ); var rinlinejQuery = / jQuery\d+="(?:null|\d+)"/g, rnoshimcache = new RegExp( "<(?:" + nodeNames + ")[\\s/>]", "i" ), rxhtmlTag = /<(?!area|br|col|embed|hr|img|input|link|meta|param)(([\w:-]+)[^>]*)\/>/gi, // Support: IE 10-11, Edge 10240+ // In IE/Edge using regex groups here causes severe slowdowns. // See https://connect.microsoft.com/IE/feedback/details/1736512/ rnoInnerhtml = /\s*$/g, safeFragment = createSafeFragment( document ), fragmentDiv = safeFragment.appendChild( document.createElement( "div" ) ); // Support: IE<8 // Manipulating tables requires a tbody function manipulationTarget( elem, content ) { return jQuery.nodeName( elem, "table" ) && jQuery.nodeName( content.nodeType !== 11 ? content : content.firstChild, "tr" ) ? elem.getElementsByTagName( "tbody" )[ 0 ] || elem.appendChild( elem.ownerDocument.createElement( "tbody" ) ) : elem; } // Replace/restore the type attribute of script elements for safe DOM manipulation function disableScript( elem ) { elem.type = ( jQuery.find.attr( elem, "type" ) !== null ) + "/" + elem.type; return elem; } function restoreScript( elem ) { var match = rscriptTypeMasked.exec( elem.type ); if ( match ) { elem.type = match[ 1 ]; } else { elem.removeAttribute( "type" ); } return elem; } function cloneCopyEvent( src, dest ) { if ( dest.nodeType !== 1 || !jQuery.hasData( src ) ) { return; } var type, i, l, oldData = jQuery._data( src ), curData = jQuery._data( dest, oldData ), events = oldData.events; if ( events ) { delete curData.handle; curData.events = {}; for ( type in events ) { for ( i = 0, l = events[ type ].length; i < l; i++ ) { jQuery.event.add( dest, type, events[ type ][ i ] ); } } } // make the cloned public data object a copy from the original if ( curData.data ) { curData.data = jQuery.extend( {}, curData.data ); } } function fixCloneNodeIssues( src, dest ) { var nodeName, e, data; // We do not need to do anything for non-Elements if ( dest.nodeType !== 1 ) { return; } nodeName = dest.nodeName.toLowerCase(); // IE6-8 copies events bound via attachEvent when using cloneNode. if ( !support.noCloneEvent && dest[ jQuery.expando ] ) { data = jQuery._data( dest ); for ( e in data.events ) { jQuery.removeEvent( dest, e, data.handle ); } // Event data gets referenced instead of copied if the expando gets copied too dest.removeAttribute( jQuery.expando ); } // IE blanks contents when cloning scripts, and tries to evaluate newly-set text if ( nodeName === "script" && dest.text !== src.text ) { disableScript( dest ).text = src.text; restoreScript( dest ); // IE6-10 improperly clones children of object elements using classid. // IE10 throws NoModificationAllowedError if parent is null, #12132. } else if ( nodeName === "object" ) { if ( dest.parentNode ) { dest.outerHTML = src.outerHTML; } // This path appears unavoidable for IE9. When cloning an object // element in IE9, the outerHTML strategy above is not sufficient. // If the src has innerHTML and the destination does not, // copy the src.innerHTML into the dest.innerHTML. #10324 if ( support.html5Clone && ( src.innerHTML && !jQuery.trim( dest.innerHTML ) ) ) { dest.innerHTML = src.innerHTML; } } else if ( nodeName === "input" && rcheckableType.test( src.type ) ) { // IE6-8 fails to persist the checked state of a cloned checkbox // or radio button. Worse, IE6-7 fail to give the cloned element // a checked appearance if the defaultChecked value isn't also set dest.defaultChecked = dest.checked = src.checked; // IE6-7 get confused and end up setting the value of a cloned // checkbox/radio button to an empty string instead of "on" if ( dest.value !== src.value ) { dest.value = src.value; } // IE6-8 fails to return the selected option to the default selected // state when cloning options } else if ( nodeName === "option" ) { dest.defaultSelected = dest.selected = src.defaultSelected; // IE6-8 fails to set the defaultValue to the correct value when // cloning other types of input fields } else if ( nodeName === "input" || nodeName === "textarea" ) { dest.defaultValue = src.defaultValue; } } function domManip( collection, args, callback, ignored ) { // Flatten any nested arrays args = concat.apply( [], args ); var first, node, hasScripts, scripts, doc, fragment, i = 0, l = collection.length, iNoClone = l - 1, value = args[ 0 ], isFunction = jQuery.isFunction( value ); // We can't cloneNode fragments that contain checked, in WebKit if ( isFunction || ( l > 1 && typeof value === "string" && !support.checkClone && rchecked.test( value ) ) ) { return collection.each( function( index ) { var self = collection.eq( index ); if ( isFunction ) { args[ 0 ] = value.call( this, index, self.html() ); } domManip( self, args, callback, ignored ); } ); } if ( l ) { fragment = buildFragment( args, collection[ 0 ].ownerDocument, false, collection, ignored ); first = fragment.firstChild; if ( fragment.childNodes.length === 1 ) { fragment = first; } // Require either new content or an interest in ignored elements to invoke the callback if ( first || ignored ) { scripts = jQuery.map( getAll( fragment, "script" ), disableScript ); hasScripts = scripts.length; // Use the original fragment for the last item // instead of the first because it can end up // being emptied incorrectly in certain situations (#8070). for ( ; i < l; i++ ) { node = fragment; if ( i !== iNoClone ) { node = jQuery.clone( node, true, true ); // Keep references to cloned scripts for later restoration if ( hasScripts ) { // Support: Android<4.1, PhantomJS<2 // push.apply(_, arraylike) throws on ancient WebKit jQuery.merge( scripts, getAll( node, "script" ) ); } } callback.call( collection[ i ], node, i ); } if ( hasScripts ) { doc = scripts[ scripts.length - 1 ].ownerDocument; // Reenable scripts jQuery.map( scripts, restoreScript ); // Evaluate executable scripts on first document insertion for ( i = 0; i < hasScripts; i++ ) { node = scripts[ i ]; if ( rscriptType.test( node.type || "" ) && !jQuery._data( node, "globalEval" ) && jQuery.contains( doc, node ) ) { if ( node.src ) { // Optional AJAX dependency, but won't run scripts if not present if ( jQuery._evalUrl ) { jQuery._evalUrl( node.src ); } } else { jQuery.globalEval( ( node.text || node.textContent || node.innerHTML || "" ) .replace( rcleanScript, "" ) ); } } } } // Fix #11809: Avoid leaking memory fragment = first = null; } } return collection; } function remove( elem, selector, keepData ) { var node, elems = selector ? jQuery.filter( selector, elem ) : elem, i = 0; for ( ; ( node = elems[ i ] ) != null; i++ ) { if ( !keepData && node.nodeType === 1 ) { jQuery.cleanData( getAll( node ) ); } if ( node.parentNode ) { if ( keepData && jQuery.contains( node.ownerDocument, node ) ) { setGlobalEval( getAll( node, "script" ) ); } node.parentNode.removeChild( node ); } } return elem; } jQuery.extend( { htmlPrefilter: function( html ) { return html.replace( rxhtmlTag, "<$1>" ); }, clone: function( elem, dataAndEvents, deepDataAndEvents ) { var destElements, node, clone, i, srcElements, inPage = jQuery.contains( elem.ownerDocument, elem ); if ( support.html5Clone || jQuery.isXMLDoc( elem ) || !rnoshimcache.test( "<" + elem.nodeName + ">" ) ) { clone = elem.cloneNode( true ); // IE<=8 does not properly clone detached, unknown element nodes } else { fragmentDiv.innerHTML = elem.outerHTML; fragmentDiv.removeChild( clone = fragmentDiv.firstChild ); } if ( ( !support.noCloneEvent || !support.noCloneChecked ) && ( elem.nodeType === 1 || elem.nodeType === 11 ) && !jQuery.isXMLDoc( elem ) ) { // We eschew Sizzle here for performance reasons: http://jsperf.com/getall-vs-sizzle/2 destElements = getAll( clone ); srcElements = getAll( elem ); // Fix all IE cloning issues for ( i = 0; ( node = srcElements[ i ] ) != null; ++i ) { // Ensure that the destination node is not null; Fixes #9587 if ( destElements[ i ] ) { fixCloneNodeIssues( node, destElements[ i ] ); } } } // Copy the events from the original to the clone if ( dataAndEvents ) { if ( deepDataAndEvents ) { srcElements = srcElements || getAll( elem ); destElements = destElements || getAll( clone ); for ( i = 0; ( node = srcElements[ i ] ) != null; i++ ) { cloneCopyEvent( node, destElements[ i ] ); } } else { cloneCopyEvent( elem, clone ); } } // Preserve script evaluation history destElements = getAll( clone, "script" ); if ( destElements.length > 0 ) { setGlobalEval( destElements, !inPage && getAll( elem, "script" ) ); } destElements = srcElements = node = null; // Return the cloned set return clone; }, cleanData: function( elems, /* internal */ forceAcceptData ) { var elem, type, id, data, i = 0, internalKey = jQuery.expando, cache = jQuery.cache, attributes = support.attributes, special = jQuery.event.special; for ( ; ( elem = elems[ i ] ) != null; i++ ) { if ( forceAcceptData || acceptData( elem ) ) { id = elem[ internalKey ]; data = id && cache[ id ]; if ( data ) { if ( data.events ) { for ( type in data.events ) { if ( special[ type ] ) { jQuery.event.remove( elem, type ); // This is a shortcut to avoid jQuery.event.remove's overhead } else { jQuery.removeEvent( elem, type, data.handle ); } } } // Remove cache only if it was not already removed by jQuery.event.remove if ( cache[ id ] ) { delete cache[ id ]; // Support: IE<9 // IE does not allow us to delete expando properties from nodes // IE creates expando attributes along with the property // IE does not have a removeAttribute function on Document nodes if ( !attributes && typeof elem.removeAttribute !== "undefined" ) { elem.removeAttribute( internalKey ); // Webkit & Blink performance suffers when deleting properties // from DOM nodes, so set to undefined instead // https://code.google.com/p/chromium/issues/detail?id=378607 } else { elem[ internalKey ] = undefined; } deletedIds.push( id ); } } } } } } ); jQuery.fn.extend( { // Keep domManip exposed until 3.0 (gh-2225) domManip: domManip, detach: function( selector ) { return remove( this, selector, true ); }, remove: function( selector ) { return remove( this, selector ); }, text: function( value ) { return access( this, function( value ) { return value === undefined ? jQuery.text( this ) : this.empty().append( ( this[ 0 ] && this[ 0 ].ownerDocument || document ).createTextNode( value ) ); }, null, value, arguments.length ); }, append: function() { return domManip( this, arguments, function( elem ) { if ( this.nodeType === 1 || this.nodeType === 11 || this.nodeType === 9 ) { var target = manipulationTarget( this, elem ); target.appendChild( elem ); } } ); }, prepend: function() { return domManip( this, arguments, function( elem ) { if ( this.nodeType === 1 || this.nodeType === 11 || this.nodeType === 9 ) { var target = manipulationTarget( this, elem ); target.insertBefore( elem, target.firstChild ); } } ); }, before: function() { return domManip( this, arguments, function( elem ) { if ( this.parentNode ) { this.parentNode.insertBefore( elem, this ); } } ); }, after: function() { return domManip( this, arguments, function( elem ) { if ( this.parentNode ) { this.parentNode.insertBefore( elem, this.nextSibling ); } } ); }, empty: function() { var elem, i = 0; for ( ; ( elem = this[ i ] ) != null; i++ ) { // Remove element nodes and prevent memory leaks if ( elem.nodeType === 1 ) { jQuery.cleanData( getAll( elem, false ) ); } // Remove any remaining nodes while ( elem.firstChild ) { elem.removeChild( elem.firstChild ); } // If this is a select, ensure that it displays empty (#12336) // Support: IE<9 if ( elem.options && jQuery.nodeName( elem, "select" ) ) { elem.options.length = 0; } } return this; }, clone: function( dataAndEvents, deepDataAndEvents ) { dataAndEvents = dataAndEvents == null ? false : dataAndEvents; deepDataAndEvents = deepDataAndEvents == null ? dataAndEvents : deepDataAndEvents; return this.map( function() { return jQuery.clone( this, dataAndEvents, deepDataAndEvents ); } ); }, html: function( value ) { return access( this, function( value ) { var elem = this[ 0 ] || {}, i = 0, l = this.length; if ( value === undefined ) { return elem.nodeType === 1 ? elem.innerHTML.replace( rinlinejQuery, "" ) : undefined; } // See if we can take a shortcut and just use innerHTML if ( typeof value === "string" && !rnoInnerhtml.test( value ) && ( support.htmlSerialize || !rnoshimcache.test( value ) ) && ( support.leadingWhitespace || !rleadingWhitespace.test( value ) ) && !wrapMap[ ( rtagName.exec( value ) || [ "", "" ] )[ 1 ].toLowerCase() ] ) { value = jQuery.htmlPrefilter( value ); try { for ( ; i < l; i++ ) { // Remove element nodes and prevent memory leaks elem = this[ i ] || {}; if ( elem.nodeType === 1 ) { jQuery.cleanData( getAll( elem, false ) ); elem.innerHTML = value; } } elem = 0; // If using innerHTML throws an exception, use the fallback method } catch ( e ) {} } if ( elem ) { this.empty().append( value ); } }, null, value, arguments.length ); }, replaceWith: function() { var ignored = []; // Make the changes, replacing each non-ignored context element with the new content return domManip( this, arguments, function( elem ) { var parent = this.parentNode; if ( jQuery.inArray( this, ignored ) < 0 ) { jQuery.cleanData( getAll( this ) ); if ( parent ) { parent.replaceChild( elem, this ); } } // Force callback invocation }, ignored ); } } ); jQuery.each( { appendTo: "append", prependTo: "prepend", insertBefore: "before", insertAfter: "after", replaceAll: "replaceWith" }, function( name, original ) { jQuery.fn[ name ] = function( selector ) { var elems, i = 0, ret = [], insert = jQuery( selector ), last = insert.length - 1; for ( ; i <= last; i++ ) { elems = i === last ? this : this.clone( true ); jQuery( insert[ i ] )[ original ]( elems ); // Modern browsers can apply jQuery collections as arrays, but oldIE needs a .get() push.apply( ret, elems.get() ); } return this.pushStack( ret ); }; } ); var iframe, elemdisplay = { // Support: Firefox // We have to pre-define these values for FF (#10227) HTML: "block", BODY: "block" }; /** * Retrieve the actual display of a element * @param {String} name nodeName of the element * @param {Object} doc Document object */ // Called only from within defaultDisplay function actualDisplay( name, doc ) { var elem = jQuery( doc.createElement( name ) ).appendTo( doc.body ), display = jQuery.css( elem[ 0 ], "display" ); // We don't have any data stored on the element, // so use "detach" method as fast way to get rid of the element elem.detach(); return display; } /** * Try to determine the default display value of an element * @param {String} nodeName */ function defaultDisplay( nodeName ) { var doc = document, display = elemdisplay[ nodeName ]; if ( !display ) { display = actualDisplay( nodeName, doc ); // If the simple way fails, read from inside an iframe if ( display === "none" || !display ) { // Use the already-created iframe if possible iframe = ( iframe || jQuery( "', sub, sub))); } } var onerror = function() { failed.push($(this).data('forum')); done(this); }; var done = function(iframe, event) { iframes = iframes.not(iframe); $(iframe).remove(); if(iframes.length === 0) { $(window).off(event); msg.text(''); alert('\u540c\u6b65\u5b8c\u6210!' + (failed.length ? '\n\n\u4ee5\u4e0b\u4f3a\u670d\u5668\u540c\u6b65\u5931\u6557:\n' + failed.sort() : '')); working = false; } }; $(window).on('message', function(event) { try { var type = JSON.parse(event.originalEvent.data).type; } catch(e) {} if(type === 'an-sync-ready') { event.originalEvent.source.postMessage(data, '*'); } else if(type === 'an-sync-complete') { done(event.originalEvent.source.frameElement, event); } }); setTimeout(function() { $.each(iframes, function() { onerror.call(this); }); }, 10000); iframes.on({ error: onerror }).appendTo('#an'); } $(document).one('an-settings-special', function(event) { $('\
\

\u540c\u6b65\u8a2d\u5b9a

\
\
\ ') .appendTo(event.target) .on('click', '#an-settings-special-sync-settings', function() { var data = {}; $.each(['an_data', 'an_switches', 'an_options'], function(i, name) { data[name] = AN.util.storage(name); }); iframeSync('an-sync-settings', JSON.stringify(data)); }); }); if(top !== self && location.search.indexOf('an_sync') !== -1) { $(window).on('message', function(event) { try { var data = JSON.parse(event.originalEvent.data); } catch(e) { return; } if(data.type === 'an-sync-settings') { data = JSON.parse(data.value); $.each(['an_data', 'an_switches', 'an_options'], function(i, name) { if(name in data) { AN.util.storage(name, data[name]); } }); event.originalEvent.source.postMessage(JSON.stringify({ type: 'an-sync-complete' }), '*'); } }); window.top.postMessage(JSON.stringify({ type: 'an-sync-ready' }), '*'); } } } }}; AN.mod['Layout Designer'] = { ver: 'N/A', author: '\u5411\u65e5', fn: { '5e173905-9c47-4f37-8d3f-4c31ea871115': { desc: '\u96b1\u85cf\u9802\u90e8\u85cd\u8272\u5217', page: { 65534: false }, type: 3, once: function() { AN.util.stackStyle('body > #aspnetForm > table > tbody > tr:first-child { display: none; }'); } }, '7ca54ba4-e2b7-489c-9adc-7ac7d62012f0': { desc: '\u96b1\u85cf\u9802\u90e8\u5561\u8272\u5217', page: { 65534: false }, type: 3, once: function() { AN.util.stackStyle('body > #aspnetForm > table > tbody > tr:first-child + tr { display: none; }'); } }, '7af1060d-d38c-40b9-b16b-df1bb799cb74': { desc: '\u96b1\u85cfLogo\u5217', page: { 65534: false }, type: 3, once: function() { AN.util.stackStyle('body > #aspnetForm > table > tbody > tr:first-child + tr + tr { display: none; }'); } }, 'bbd5f176-c024-4684-ba98-b72da376a6eb': { desc: '\u96b1\u85cf\u6700\u5e95\u9801\u8173', page: { 65534: false }, type: 3, once: function() { AN.util.stackStyle('\ .PageMiddlePanel + br, \ .FooterPanel, \ .FooterPanel + div, \ .FooterPanel + div + div \ { display: none; }'); } }, '02837e6a-3dd7-4c73-a155-90d6f6edd8f9': { desc: '\u8a2d\u5b9a\u9801\u9762\u95ca\u5ea6', page: { 65534: false }, type: 3, options: { nPageWidth: { desc: '\u9801\u9762\u95ca\u5ea6 [\u53ef\u8a2d\u5b9a\u70ba80%, 1000px\u7b49]', defaultValue: '100%', type: 'text' } }, once: function() { var w = AN.util.getOptions('nPageWidth'); AN.util.addStyle($.sprintf('\ .PageWidthContainer { width: %s; } \ .PageMiddleBox, .repliers, table[width^="954"], table[width^="947"], \ #ctl00_ContentPlaceHolder1_view_form > div[style*="945px"], \ #ctl00_ContentPlaceHolder1_view_form > div[style*="945px"] > div[style*="945px"] \ { width: 100% !important; } \ .PageMiddleBox \ { box-sizing: border-box; -moz-box-sizing: border-box; } \ ', w === 'auto' ? '100%' : w )); } }, '1cbed44e-f3d5-4d53-b1e7-2d60e356f3f2': { desc: '\u96b1\u85cf\u500b\u4eba\u9023\u7d50', page: { 60: false }, type: 3, once: function() { AN.util.stackStyle('\ .ContentPanel table[width="954px"] b + div \ { display: none; }'); } }, '1c63cc45-21f7-40ab-905a-730dabffc2ab': { desc: '\u96b1\u85cf\u9ad8\u767b\u516c\u544a', page: { 60: false }, type: 3, once: function() { AN.util.stackStyle('\ .ContentPanel table[width="954px"] b + div + div[style*="280px"], \ #ctl00_ContentPlaceHolder1_topics_form .DivResizableBoxContainer, \ #ctl00_ContentPlaceHolder1_view_form > table[width="954px"] .DivResizableBoxContainer \ { display: none; } \ '); } }, 'cc95985d-34df-409d-a574-e8dca1531a3d': { desc: '\u96b1\u85cf\u7cbe\u9078\u6587\u7ae0', page: { 4: false }, type: 3, once: function() { AN.util.stackStyle('\ .ContentPanel table[width="954px"] b + div + div + div + div[style*="255px"] \ { display: none; } \ '); } }, 'b44ee3a6-950e-4b2a-b99a-399b6384bcce': { desc: '\u96b1\u85cf\u641c\u5c0b\u5217\u4e0a\u4e0b\u7a7a\u767d', page: { 28: false }, type: 3, once: function() { AN.util.stackStyle('\ .Topic_FunctionPanel { margin-top: 0; overflow: hidden; } \ .Topic_FunctionPanel > div:last-child { display: none; } \ #ctl00_ContentPlaceHolder1_topics_form > div + table { position: relative; } \ #ctl00_ContentPlaceHolder1_topics_form > div + table table:first-child br { display: none; } \ #ctl00_ContentPlaceHolder1_topics_form > div + table p { margin: 0; } \ #ctl00_ContentPlaceHolder1_topics_form #forum_list { position: absolute; } \ '); } }, '1ada74ac-9bae-47b2-914b-f1556dbab1a2': { desc: '\u96b1\u85cf\u8a0e\u8ad6\u5340\u9078\u55ae', page: { 28: false }, type: 3, once: function() { if($d.pageName() == 'topics') AN.util.stackStyle('#forum_list, #forum_list + br { display: none; }'); else AN.util.stackStyle('#ctl00_ContentPlaceHolder1_topics_form > div + table table:first-child { display: none; }'); } }, '4bf6619f-2cd8-4aa2-a54a-e7d7255e8603': { desc: '\u96b1\u85cf\u71b1\u9580\u95dc\u9375\u5b57', page: { 30: false }, type: 3, once: function() { AN.util.stackStyle('#ctl00_ContentPlaceHolder1_lb_HitSearchs { display: none; }'); } }, 'a5d7f8f0-99fc-4aaf-8c65-373b17cfcf69': { desc: '\u96b1\u85cf\u6295\u7968\u7ad9\u9023\u7d50(\u5982\u6709)', page: { 60: false }, type: 3, once: function() { AN.util.stackStyle('#ctl00_ContentPlaceHolder1_votingThreadMsg, #ctl00_ContentPlaceHolder1_MiddleAdSpace1 { display: none; }'); } }, '7ca271bc-d036-49a5-b1c1-e93990ed847a': { desc: '\u96b1\u85cf\u5c0f\u5708\u5b50\u904e\u6ffe\u63d0\u793a', page: { 4: false }, type: 3, infinite: function(jDoc) { jDoc.find('td[colspan="6"][style*="6EA0C4"] > b').closest('tr').hide(); } }, 'f41e288e-cd1d-4649-a396-83d92d99ded8': { desc: '\u96b1\u85cf\u7d05\u4eba\u699c', page: { 4: false }, type: 3, once: function() { AN.util.stackStyle('\ #ctl00_ContentPlaceHolder1_HotPeoples, \ #ctl00_ContentPlaceHolder1_HotPeoples + br \ { display: none; }'); } }, 'a2257837-e528-4b4c-a794-84fc4ccca225': { desc: '\u96b1\u85cf\u8a0e\u8ad6\u5340\u5b88\u5247', page: { 4: false }, type: 3, once: function() { AN.util.stackStyle('\ .ContentPanel > .DivBoxContainer, \ .ContentPanel > .DivBoxContainer + script + br \ { display: none; }'); } }, '516426b3-da86-4ed5-b30a-c5678863bb09': { desc: '\u96b1\u85cf\u8a0e\u8ad6\u5340\u5716\u793a\u8aaa\u660e', page: { 28: false }, type: 3, once: function() { AN.util.stackStyle('\ #ctl00_ContentPlaceHolder1_topics_form ~ br, \ #ctl00_ContentPlaceHolder1_topics_form ~ br + table, \ .ContentPanel > .DivBoxContainer + script + br + table \ { display: none; }'); } }, '74cd7f38-b0ad-4fca-ab39-673b0e2ee4c7': { desc: '\u4fee\u6b63\u8df3\u9801\u63a7\u4ef6\u4f4d\u7f6e', page: { 32: true }, type: 3, once: function() { AN.util.stackStyle($.sprintf('div[style] > div[style^="%s: center"] { margin: 0 100px; }', $.browser.msie ? 'TEXT-ALIGN' : 'text-align')); } }, '0941e559-3875-445a-9c56-799987fbdf87': { desc: '\u96b1\u85cf\u540d\u7a31\u6b04\u7269\u4ef6', page: { 32: false }, type: 3, options: { bHideAvatar: { desc: '\u96b1\u85cf\u9ad8\u7d1a\u6703\u54e1\u982d\u50cf', defaultValue: false, type: 'checkbox' }, bHideMemberLevel: { desc: '\u96b1\u85cf\u6703\u54e1\u7d1a\u5225\u5716\u7247', defaultValue: false, type: 'checkbox' }, bHideAward: { desc: '\u96b1\u85cf(\u5584)\u5716\u50cf', defaultValue: false, type: 'checkbox' } }, once: function() { var css = []; $.each({ bHideAvatar: 'div[id^="ThreadUser"] > a', bHideMemberLevel: 'div[id^="ThreadUser"] > img', bHideAward: 'div[id^="ThreadUser"] ~ *' }, function(name, selector) { if(AN.util.getOptions(name)) css.push(selector); }); AN.util.stackStyle(css.join(',') + ' { display: none; }'); } }, 'a0203b01-7565-46e1-a52e-260dd4d485a1': { desc: '\u96b1\u85cf\u5f15\u7528', page: { 32: false }, type: 3, once: function() { AN.util.stackStyle('.repliers_right blockquote { display: none; }'); } }, 'd0ac656c-e602-4852-843b-f776d8a976f4': { desc: '\u96b1\u85cf\u8a55\u5206\u683c', page: { 32: false }, type: 3, once: function() { AN.util.stackStyle('#DivMarkThread { display: none; }'); } }, '96df064c-efb6-44be-9251-4a7751a45504': { desc: '\u96b1\u85cfFacebook\u6309\u626d', page: { 32: false }, type: 3, once: function() { AN.util.stackStyle('.fb-like { display: none !important; }'); } }, 'eec2a29d-44b5-470b-bffd-2da4184428f4': { desc: '\u96b1\u85cf\u7559\u540d\u6309\u626d', page: { 32: false }, type: 3, once: function() { AN.util.stackStyle('div > a[id^="laumingHref"] { display: none; }'); } }, '2c7998ad-10cc-4bca-9f2c-85f1771356c2': { desc: '\u96b1\u85cf\u6295\u8a34\u6587\u7ae0\u6309\u626d', page: { 32: false }, type: 3, once: function() { AN.util.stackStyle('.repliers_right a[href^="contactus.aspx?messageid="] { display: none; }'); } }, '26eaf7f8-d260-4b42-b6d9-08b235f56d43': { desc: '\u96b1\u85cf\u5f15\u7528\u539f\u6587\u6309\u626d', page: { 32: false }, type: 3, options: { bCDROMMode: { desc: '\u540c\u6642\u96b1\u85cf\u5feb\u901f\u5f15\u7528\u6309\u626d\u53ca\u767b\u5165\u63d0\u793a [CD-ROM\u5c08\u7528]', defaultValue: false, type: 'checkbox' } }, once: function() { var sSelector = '.repliers_right a[href^="post.aspx?mt=Y&rid="]'; if(AN.util.getOptions('bCDROMMode')) { sSelector += ', .repliers_right a[href*="QuoteReply("],#ct100_ContentPlaceHolder1_QuickReplyLoginTable'; } AN.util.stackStyle(sSelector + '{ display: none; }'); } }, '2c026f6b-f252-4a58-b2ac-706fcd052fb6': { desc: '\u96b1\u85cf\u5feb\u901f\u56de\u8986\u7d44\u4ef6', page: { 32: false }, type: 3, options: { bRemNameRow: { desc: '\u96b1\u85cf\u540d\u5b57\u5217', defaultValue: false, type: 'checkbox' }, bRemTopicRow: { desc: '\u96b1\u85cf\u4e3b\u65e8\u5217', defaultValue: false, type: 'checkbox' }, bRemClassicRow: { desc: '\u96b1\u85cf\u7d93\u5178\u8868\u60c5\u5716\u793a\u5217', defaultValue: false, type: 'checkbox' }, bRemTempRow: { desc: '\u96b1\u85cf\u9644\u52a0\u8868\u60c5\u5716\u793a\u5217(\u5982\u6709)', defaultValue: false, type: 'checkbox' }, bRemPreviewRow: { desc: '\u96b1\u85cf\u9810\u89bd\u5217', defaultValue: false, type: 'checkbox' } }, once: function() { if(!AN.util.isLoggedIn()) return; var jRows = $('#ctl00_ContentPlaceHolder1_QuickReplyTable tbody:eq(2)').children(); if(AN.util.getOptions('bRemNameRow')) jRows.eq(0).hide(); if(AN.util.getOptions('bRemTopicRow')) jRows.eq(1).hide(); if(AN.util.getOptions('bRemClassicRow')) jRows.eq(3).hide(); if(AN.util.getOptions('bRemTempRow') && jRows.length > 5) jRows.eq(3).nextAll(':not(:last)').hide(); if(AN.util.getOptions('bRemPreviewRow')) jRows.last().hide(); } }, 'e424fe8d-852b-4239-b797-6aa682e68c39': { desc: '\u4fee\u6b63\u8868\u683c\u95ca\u5ea6', page: { 1024: true }, type: 3, once: function() { AN.util.stackStyle('table[width="800"] { width: 100%; }'); } } }}; AN.mod['Main Script'] = { ver: 'N/A', author: '\u5411\u65e5', fn: { // \u4f48\u5c40\u8a2d\u5b9a // '63d2407a-d8db-44cb-8666-64e5b76378a2': { desc: '\u96b1\u85cf\u5ee3\u544a\u6b98\u7559\u7269', page: { 65535: true }, type: 3, infinite: function(jDoc) { if($d.pageCode() & 88) { jDoc.find('td[colspan][height="52"]').parent().hide(); } else if($d.pageCode() === 32) { (jDoc.is('div') ? jDoc : jDoc.find('#ctl00_ContentPlaceHolder1_view_form > div[style*="945px"]')) .children('table[width="100%"]') .has('> tbody > tr > td:not([align="left"])') .hide(); } } }, // \u4fee\u6b63\u4fee\u6539 // 'b7ef89eb-1190-4466-899a-c19b3621d6b1': { desc: 'Opera: \u4fee\u6b63\u7121\u6cd5\u4f7f\u7528Enter\u641c\u5c0b\u7684\u932f\u8aa4', page: { 30: $.browser.opera || 'disabled' }, type: 4, once: function() { $('#aspnetForm').submit(function(event) { event.preventDefault(); }); } }, 'd4bf67cc-349c-4541-a8e4-9d9f9d0be267': { desc: 'Opera: \u4fee\u6b63\u7279\u6b8a\u5b57\u7b26\u5c0e\u81f4\u7684\u986f\u793a\u932f\u8aa4', page: { 92: $.browser.opera || 'disabled' }, type: 4, infinite: function(jDoc) { jDoc.topics().jNameLinks.each(function() { var jNameCell = $(this).parent(); if(jNameCell.nextAll().length != 2) { jNameCell[0].outerHTML = jNameCell[0].outerHTML.replace(/</g, '<').replace(/>/g, '>').replace(//, 'NAME_ERROR').replace(/=""/g, ''); } }); } }, '0293c9da-468f-4ed5-a2d7-ecb0067e713f': { desc: '\u53bb\u9664\u5f15\u7528\u534a\u900f\u660e', page: { 32: !$.browser.msie || 'disabled' }, type: 4, once: function() { AN.util.stackStyle('blockquote { opacity: 1; }'); } }, 'd563af32-bd37-4c67-8bd7-0721c0ab0b36': { desc: '\u512a\u5316\u9801\u6578\u8df3\u8f49\u9023\u7d50\u5730\u5740', page: { 32: true }, type: 4, once: function() { window.changePage = function(nPageNo) { var sPage = (nPageNo) ? ('&page=' + nPageNo) : ''; var sHighlight = (window.highlight_id) ? ('&highlight_id=' + window.highlight_id) : ''; location.assign($.sprintf('/view.aspx?message=%s%s%s', window.messageid, sPage, sHighlight)); }; var regex = /&(?:page=1(?!\d)|highlight_id=0)/g; $d.mouseover(function(event) { var jTarget = $(event.target); if(!(jTarget.is('a') && regex.test(jTarget.attr('href')))) return; jTarget.attr('href', jTarget.attr('href').replace(regex, '')); }); } }, 'b6b232c8-1f26-449e-bb0d-2b7826bf95ef': { desc: '\u81ea\u8a02\u5716\u7247\u7e2e\u5c0f\u5e45\u5ea6', page: { 32: true, 192: true }, type: 4, options: { normalImgMaxHeight: { desc: '\u5716\u7247\u6700\u5927\u9ad8\u5ea6', defaultValue: '100%', type: 'text' } }, once: function() { window.DrawImage = $.noop; AN.util.stackStyle($.sprintf('\ .repliers_right a[target] { display: inline-block; max-width: 100% } \ .repliers_right img[onload] { width: auto; height: auto; max-width: 100%; max-height: %s; } \ .repliers_right > tbody > tr:first-child a[target]:focus { outline: 0; } \ ', AN.util.getOptions('normalImgMaxHeight'))); } }, 'd7adafa8-cc14-45f9-b3e9-bc36eab05d4f': { desc: '\u7e2e\u5c0f\u5f15\u7528\u4e2d\u7684\u5716\u7247', page: { 32: false }, type: 4, options: { nQuoteImgMaxHeight: { desc: '\u5716\u7247\u6700\u5927\u9ad8\u5ea6(px)', defaultValue: 100, type: 'text' } }, once: function() { AN.util.stackStyle($.sprintf('.repliers_right blockquote img[onload] { width: auto; height: auto; max-height: %spx; }', AN.util.getOptions('nQuoteImgMaxHeight'))); } }, '52ebe3d3-bf98-44d2-a101-180ec69ce290': { desc: '\u79fb\u9664\u5e16\u5b50\u9023\u7d50\u9ad8\u4eae\u90e8\u4efd', page: { 64: false }, type: 4, once: function() { var regex = /&highlight_id=\d+/; $d.mouseover(function(event) { var jTarget = $(event.target); if(!(jTarget.is('a') && regex.test(jTarget.attr('href')))) return; jTarget.attr('href', jTarget.attr('href').replace(regex, '')); }); } }, '87a6307e-f5c2-405c-8614-af60c85b101e': { desc: '\u641c\u5c0b\u958b\u65b0\u9801', page: { 4: false, 24: false }, type: 4, once: function() { var getSearch = Function('return ' + window.getSearch.toString().replace('window.location =', 'return'))(); window.getSearch = function() { window.open(getSearch()); }; var Search = Function('return ' + window.Search.toString().replace('window.location.href =', 'return'))(); window.Search = function() { window.open(Search()); }; } }, 'a93f1149-d11b-4b72-98dd-c461fd9ee754': { desc: '\u9023\u7d50\u958b\u65b0\u9801', page: { 4: false, 24: false, 64: false }, type: 4, options: { bTopicLinksOnly: { desc: '\u53ea\u9650\u5e16\u5b50\u9023\u7d50', defaultValue: false, type: 'checkbox' } }, once: function() { $d.click(function(event) { var jTarget = $(event.target); if(jTarget.parent('a').length) jTarget = jTarget.parent(); if(!jTarget.is('a') || !(AN.util.getOptions('bTopicLinksOnly') ? /view\.aspx/i : /^(?!javascript|#)/i).test(jTarget.attr('href'))) return; event.preventDefault(); window.open(jTarget.attr('href')); }); } }, '2ab2f404-0d35-466f-98a5-c88fdbdaa031': { desc: '\u5916\u93c8\u9023\u7d50\u958b\u65b0\u9801', defer: 3, page: { 32: true }, type: 4, once: function() { $d.click(function(event) { var jTarget = $(event.target); if(jTarget.parent('a').length) jTarget = jTarget.parent(); if(!jTarget.is('.repliers_right > tbody > tr:first-child a') || /^(?:javascript|#)/.test(jTarget.attr('href'))) return; if(event.isDefaultPrevented()) return; event.preventDefault(); window.open(jTarget.attr('href')); }); } }, 'b73d2968-8301-4c5e-8700-a89541d274fc': { desc: '\u56de\u5fa9\u50b3\u7d71\u7528\u6236\u9023\u7d50', defer: 1, page: { 32: false }, type: 4, once: function() { $d .unbind('.userlinkbox') .bind('mouseover', function(event) { var jTarget = $(event.target); if(!jTarget.is('a[href^="javascript: ToggleUserDetail"]')) return; jTarget.attr('href', $.sprintf('ProfilePage.aspx?userid=%s', jTarget.up('tr').attr('userid'))); }); } }, '7f9780a6-395d-4b24-a0a8-dc58c4539408': { desc: '\u4fee\u6b63\u5b57\u578b\u5927\u5c0f/\u984f\u8272\u63d2\u5165\u63a7\u4ef6', page: { 416: true }, type: 4, once: function() { $('#ctl00_ContentPlaceHolder1_messagetext').siblings('select[onchange]').change(function() { this.selectedIndex = 0; }); } }, '6e978310-e87b-4043-9def-076a13377c19': { desc: '\u66f4\u63dbfavicon(\u5c0f\u4e11icon) [\u90e8\u4efd\u700f\u89bd\u5668\u7121\u6548]', page: { 65534: false }, type: 4, once: function() { $('head').append(''); } }, 'e54d5c5f-47ae-4839-b4e8-6fc3733edfef': { desc: '\u6539\u9032\u516c\u53f8\u6a21\u5f0f', page: { 65534: true }, type: 4, options: { sCModeFavicon: { desc: 'favicon\u9023\u7d50\u4f4d\u7f6e', defaultValue: 'http://www.google.com/favicon.ico', type: 'text' }, sCModeTitle: { desc: '\u6a19\u984c\u540d\u7a31', defaultValue: 'Google', type: 'text' } }, once: function() { if(AN.util.cookie('companymode') == 'Y') { $('head').append($.sprintf('', AN.util.getOptions('sCModeFavicon'))); document.title = AN.util.getOptions('sCModeTitle'); } } }, 'fecb6345-232f-4781-b839-4919f845959a': { desc: '\u5f37\u5236\u8a2d\u5b9a\u8ad6\u58c7\u9078\u9805', page: { 65534: 'disabled' }, type: 4, options: { companymode: { desc: '\u516c\u53f8\u6a21\u5f0f', defaultValue: false, type: 'checkbox' }, filtermode: { desc: '\u904e\u6ffe\u6a21\u5f0f', defaultValue: false, type: 'checkbox' }, sensormode: { desc: '\u61f7\u820a\u6a21\u5f0f', defaultValue: false, type: 'checkbox' }, fontsize: { desc: '\u5b57\u578b\u5927\u5c0f', type: 'select', choices: ['\u5927\u5b57\u578b', '\u5c0f\u5b57\u578b'], defaultValue: '\u5927\u5b57\u578b' } }, once: function() { $.each(['companymode', 'sensormode', 'filtermode', 'fontsize'], function(i, setting) { var val = AN.util.getOptions(setting); AN.util.cookie(setting, null, 'hkgolden.com'); AN.util.cookie(setting, null, location.hostname); AN.util.cookie(setting, setting === 'fontsize' ? (val === '\u5927\u5b57\u578b' ? 'L' : 'S') : (val ? 'Y' : 'N')); }); } }, // \u52a0\u5165\u7269\u4ef6 // '231825ad-aada-4f5f-8adc-5c2762c1b0e5': { desc: '\u986f\u793a\u8cc7\u6599: \u6a13\u4e3b\u540d\u7a31', page: { 32: false }, type: 5, once: function(jDoc) { AN.util.getOpenerInfo(jDoc, function(oInfo) { AN.shared('addInfo', $.sprintf('\u6a13\u4e3b: %s', oInfo.sId, oInfo.sName)); }); } }, '9e181e79-153b-44d5-a482-5ccc6496a172': { desc: '\u986f\u793a\u8cc7\u6599: \u7d2f\u8a08\u5728\u7dda\u6642\u9593', page: { 65534: false }, type: 5, once: function() { var nLastOnTime = AN.util.data('nLastOnTime'); var nCumulatedTime = AN.util.data('nCumulatedTime') || 0; if(nLastOnTime) { var nDifference = $.time() - nLastOnTime; nCumulatedTime += (nDifference >= 120000) ? 120000 : nDifference; } var sCumulated; if(nCumulatedTime > 86400000) { sCumulated = (nCumulatedTime / 86400000).toFixed(2) + ' days'; } else if(nCumulatedTime > 3600000) { sCumulated = (nCumulatedTime / 3600000).toFixed(2) + ' hours'; } else { sCumulated = (nCumulatedTime / 60000).toFixed(2) + ' minutes'; } AN.shared('addInfo', $.sprintf('\u5728\u7dda\u6642\u9593: %s', sCumulated)); AN.util.data('nLastOnTime', $.time()); AN.util.data('nCumulatedTime', nCumulatedTime); } }, 'f47e77c8-6f1a-43b2-8493-f43de222b3b4': { desc: '\u52a0\u5165\u4f3a\u670d\u5668\u72c0\u614b\u986f\u793a\u6309\u626d', page: { 65534: true }, type: 5, once: function() { AN.shared('addButton', '\u4f3a\u670d\u5668\u72c0\u614b', AN.shared.serverTable); } }, '7de28ca9-9c44-4949-ad4a-31f38a984715': { desc: '\u52a0\u5165\u4e00\u9375\u7559\u540d\u6309\u626d', page: { 32: false }, type: 5, options: { sLeaveNameMsg: { desc: '\u56de\u8986\u5167\u5bb9', defaultValue: '\u7559\u540d', type: 'text' } }, once: function() { if(!AN.util.isLoggedIn()) return; AN.shared('addButton', '\u4e00\u9375\u7559\u540d', function() { $('#ctl00_ContentPlaceHolder1_messagetext').val(AN.util.getOptions('sLeaveNameMsg')); $('#aspnetForm').submit(); }); } }, 'ec520b4e-8a4b-4414-acce-ed824bf806ce': { desc: '\u52a0\u5165\u500b\u4eba\u9023\u7d50\u6309\u626d', page: { 60: false }, type: 5, once: function() { $('#ctl00_ContentPlaceHolder1_lb_UserName > a').each(function(i, link) { link = $(link); AN.shared('addButton', ~link.attr('href').indexOf('login') ? '\u767b\u5165' : link.text(), link.attr('href')); }); } }, 'aad1f3ac-e70c-4878-a1ef-678539ca7ee4': { desc: '\u52a0\u5165\u524d\u5f80\u5439\u6c34\u53f0\u7684\u5feb\u901f\u9023\u7d50', page: { 65534: true }, type: 5, once: function() { AN.shared('addLink', '\u5439\u6c34\u53f0', '/topics.aspx?type=BW', 1); } }, 'd0d76204-4033-4bd6-a9a8-3afbb807495f': { desc: '\u52a0\u5165\u524d\u5f80\u6700\u9802/\u5e95\u7684\u6309\u626d', page: { 32: true }, type: 5, once: function() { AN.shared('addLink', '\u6700\u9802', function(){ document.body.scrollIntoView(); }, 0); AN.shared('addLink', '\u6700\u5e95', function(){ document.body.scrollIntoView(false); }, 2); } }, 'b78810a2-9022-43fb-9a9b-f776100dc1df': { desc: '\u52a0\u5165\u6a13\u5c64\u7de8\u865f', page: { 32: true }, type: 5, infinite: function(jDoc) { var nCurPageNo = jDoc.pageNo(); var nFloor = ((nCurPageNo == 1) ? 0 : 25 * (nCurPageNo - 1) + 1) + jDoc.pageScope().find('.an-content-floor').length; jDoc.replies().each(function() { $(this).find('span:last').append($.sprintf(' #%s', nFloor++)); }); } }, // \u5176\u4ed6\u529f\u80fd // '3f693a9e-e79d-4d14-b639-a57bee36079a': { desc: '\u81ea\u52d5\u986f\u793a\u4f3a\u670d\u5668\u72c0\u614b\u6aa2\u67e5\u8996\u7a97', page: { 1: true }, type: 6, defer: 5, once: function() { AN.shared('serverTable'); } }, '4cdce143-74a5-4bdb-abca-0351638816fb': { desc: '\u5e16\u5b50\u4e3b\u65e8\u6216\u5167\u6587\u51fa\u73fe\u932f\u8aa4\u6642\u9032\u884c\u63d0\u793a', page: { 288: true }, type: 6, once: function(jDoc) { $('#ctl00_ContentPlaceHolder1_messagesubject').css('width', '95%').attr('maxlength', '50'); var states = {}; $('#ctl00_ContentPlaceHolder1_messagesubject, #ctl00_ContentPlaceHolder1_messagetext').on('keyup change', function() { var target = $(this); var max = this.id === 'ctl00_ContentPlaceHolder1_messagesubject' ? 50 : 2000; var text = $(this).val(); var n = 0; if(this.id === 'ctl00_ContentPlaceHolder1_messagesubject') { if(text.length !== window.convert_text(text).length) { target.css('background-color', '#1BB5E0'); states[this.id] = 1; return; } } else { text = window.convert_text(text); } for(var i=0; i 255 ? 2 : 1; if(n > max) { target.css('background-color', 'pink'); states[this.id] = 2; return; } } target.css('background-color', ''); states[this.id] = 0; }); $('#aspnetForm').submit(function() { for(var id in states) { if(states[id]) { alert(states[id] === 1 ? '\u4e3b\u65e8\u5b58\u5728\u9999\u6e2f\u5b57!' : '\u4e3b\u65e8\u6216\u5167\u6587\u904e\u9577!'); return false; } } }); } }, '86d24fc8-476a-4de3-95e1-5e0eb02b3353': { desc: '\u8f49\u63db\u8868\u60c5\u78bc\u70ba\u5716\u7247', page: { 92: true }, type: 6, infinite: function(jDoc) { var topics = jDoc.topics() if(!topics) return; var rSmiley = /[#[](hehe|love|ass|sosad|good|hoho|kill|bye|adore|banghead|bouncer|bouncy|censored|flowerface|shocking|photo|fire|yipes|369|bomb|slick|no|kill2|offtopic)[\]#]/g; var aConvertMap = [ { regex: /O:-\)/g, result: 'angel' }, { regex: /xx\(/g, result: 'dead' }, { regex: /:\)/g, result: 'smile' }, { regex: /:o\)/g, result: 'clown' }, { regex: /:-\(/g, result: 'frown' }, { regex: /:~\(/g, result: 'cry' }, { regex: /;-\)/g, result: 'wink' }, { regex: /:-\[/g, result: 'angry' }, { regex: /:-]/g, result: 'devil' }, { regex: /:D/g, result: 'biggrin' }, { regex: /:O/g, result: 'oh' }, { regex: /:P/g, result: 'tongue' }, { regex: /^3^/g, result: 'kiss' }, { regex: /\?_\?/g, result: 'wonder' }, { regex: /#yup#/g, result: 'agree' }, { regex: /#ng#/g, result: 'donno' }, { regex: /#oh#/g, result: 'surprise' }, { regex: /#cn#/g, result: 'chicken' }, { regex: /Z_Z/g, result: 'z' }, { regex: /@_@/g, result: '@' }, { regex: /\?\?\?/g, result: 'wonder2' }, { regex: /fuck/g, result: 'fuck' } ]; topics.jTitleCells.find('a:first-child').each(function() { var jThis = $(this); var sOri = sText = jThis.text(); sText = sText.replace(rSmiley, '$&'); $.each(aConvertMap, function() { sText = sText.replace(this.regex, '$&'); }); if(sText != sOri) jThis.html(sText); }); } }, 'b69c5067-2726-43f8-b3de-dfb907355b71': { desc: '\u6a19\u984c\u904e\u6ffe\u529f\u80fd', page: { 4: true }, type: 6, options: { bFilterListButton: { desc: '\u52a0\u5165\u6a19\u984c\u904e\u6ffe\u5217\u8868\u6309\u626d', defaultValue: true, type: 'checkbox' }, bAddFilterButton: { desc: '\u52a0\u5165\u65b0\u589e\u904e\u6ffe\u5668\u6309\u626d', defauleValue: false, type: 'checkbox' }, filterBlockedUsers: { desc: '\u540c\u6642\u904e\u6ffe\u88ab\u5c01\u9396\u7528\u6236\u7684\u6a19\u984c', defaultValue: true, type: 'checkbox' }, logFilteredTopics: { desc: '\u8a18\u9304\u88ab\u904e\u6ffe\u7684\u6a19\u984c', defaultValue: false, type: 'checkbox' } }, once: function() { var getFilters = function() { return AN.util.data('aTopicFilter') || []; }; var jHiddenImg, jButton = $('', { src: $r['cross-shield'], css: { 'margin-left': '-1.5px' } }).hoverize('#HotTopics tr:has(td > a)', { autoPosition: false }) .bind({ entertarget: function() { jHiddenImg = jButton.data('hoverize').jTarget.find('img:first').css('visibility', 'hidden'); jButton.css(jHiddenImg.offset()); }, leavetarget: function() { jHiddenImg.css('visibility', 'visible'); }, click: function() { addFilter(jButton.data('hoverize').jTarget.find('a:first').html().trim().replace(/]+?alt="([^"]+)[^>]*>/ig, '$1')); } }); var logFiltered = AN.util.getOptions('logFilteredTopics'); var filterBlockedUsers = AN.util.getOptions('filterBlockedUsers'); var addFilter = function(sTopicName) { var sFilter = prompt('\u8acb\u8f38\u5165\u904e\u6ffe\u5668', sTopicName || '') if(!sFilter) return; var aFilter = getFilters(); aFilter.push(sFilter.trim()); AN.util.data('aTopicFilter', aFilter); filterTopics(); }; var filterTopics = this.filterTopics = function(jScope) { var aFilter = getFilters(); var bamList = AN.util.data('aBamList') || []; if(!aFilter.length && !bamList.length) return; var nCount = 0; (jScope || $(document)).topics().not(':hidden').each(function() { var done = false; var jThis = $(this); var link = jThis.find('a[href^="view."]:first').attr('href'); var sTitle = jThis.data('sTitle').toLowerCase(); $.each(aFilter, function(i, sFilter) { if(sTitle.indexOf(sFilter.toLowerCase()) != -1) { nCount++; jThis.hide(); logFiltered && AN.shared('log', $.sprintf('\u6a19\u984c\u5df2\u88ab\u904e\u6ffe(keyword): %s', link, sTitle, sFilter)); done = true; return false; } }); if(done || !filterBlockedUsers) return; var userId = jThis.data('jNameLink').attr('href').replace(/.+?userid=(\d+).*/, '$1'); $.each(bamList, function(i, idFilter) { if(userId === idFilter) { nCount++; jThis.hide(); logFiltered && AN.shared('log', $.sprintf('\u6a19\u984c\u5df2\u88ab\u904e\u6ffe(user): %s', link, sTitle, jThis.data('sUserName'))); return false; } }); }); if(nCount) AN.shared('log', $.sprintf('%s\u500b\u6a19\u984c\u5df2\u88ab\u904e\u6ffe', nCount)); }; if(AN.util.getOptions('bAddFilterButton')) AN.shared('addButton', '\u65b0\u589e\u904e\u6ffe\u5668', addFilter); if(AN.util.getOptions('bFilterListButton')) AN.shared('addButton', '\u6a19\u984c\u904e\u6ffe\u5217\u8868', function() { if(!$('#an-filterlist').length) { AN.util.addStyle($.sprintf('\ #an-filterlist > ul { margin: 5px; } \ #an-filterlist > ul > li { padding: 2px 0; } \ #an-filterlist > ul > li > span:first-child { margin-right: 5px; border: 1px solid black; padding: 0 5px; background-color: %(sMainHeaderBgColor)s; color: %(sMainHeaderFontColor)s; cursor: pointer; } \ ', AN.util.getOptions() )); AN.shared.box('an-filterlist', '\u6a19\u984c\u904e\u6ffe\u5217\u8868', 500); $('#an-filterlist').click(function(event) { var jTarget = $(event.target); if(!jTarget.is('span:first-child')) return; var nIndex = jTarget.closest('li').index(); var aFilter = getFilters(); if(nIndex != -1) aFilter.splice(nIndex, 1); AN.util.data('aTopicFilter', aFilter); jTarget.parent().remove(); if(aFilter.length === 0) { $(this).children().append('
  • \u6c92\u6709\u4efb\u4f55\u904e\u6ffe\u5668
  • '); } }); } var sHTML = ''; var aFilter = getFilters(); if(aFilter.length) { $.each(aFilter, function(i, sFilter) { sHTML += $.sprintf('
  • X%s
  • ', sFilter); }); } else { sHTML += '
  • \u6c92\u6709\u4efb\u4f55\u904e\u6ffe\u5668
  • '; } $('#an-filterlist').html('
      ' + sHTML + '
    ').css('max-height', $.winHeight(0.9)); AN.shared.gray(true, 'an-filterlist'); }); }, infinite: function(jDoc) { this.filterTopics(jDoc); } }, 'db770fdc-9bf5-46b9-b3fa-78807f242c3c': { desc: '\u7528\u6236\u5c01\u9396\u529f\u80fd', page: { 32: true }, type: 6, once: function() { AN.util.stackStyle('\ .an-bammed-msg { color: #999; font-size: 10px; text-align: center; } \ .an-bammed-msg > span { cursor: pointer; } \ .an-bammed > td { opacity: 0.5; } \ .an-bammed > .repliers_left > div > a[href] ~ *, .an-bammed > td > .repliers_right { display: none; } \ '); var getBamList = function() { return AN.util.data('aBamList') || []; }; var jButton = $.userButton().bind({ click: function() { var bamList = getBamList(); var userid = jButton.data('userButton').jTarget.attr('userid'); var index = $.inArray(userid, bamList); index === -1 ? bamList.push(userid) : bamList.splice(index, 1); AN.util.data('aBamList', bamList); toggleReplies(null); }, buttonshow: function() { var bamList = getBamList(); var isBammed = $.inArray(jButton.data('userButton').jTarget.attr('userid'), bamList) !== -1; jButton.attr('src', $r[isBammed ? 'tick-shield' : 'cross-shield']).siblings().toggle(!isBammed); } }), tempShown, jMsg = $('
    ( )
    ').hoverize('.repliers_left + td', { autoToggle: false, autoPosition: false }) .bind({ entertarget: function() { var jTarget = jMsg.data('hoverize').jTarget; if(!jTarget.parent().hasClass('an-bammed')) return; var height = jTarget.innerHeight(); jMsg .children().text('Show Blocked User - ' + jTarget.parent().attr('username')).end() .css($.extend(jTarget.offset(), { width: jTarget.innerWidth(), height: height, lineHeight: height + 'px' })) .show(); }, leavetarget: function() { jMsg.hide(); if(tempShown) { tempShown = false; jMsg.data('hoverize').jTarget.parent().addClass('an-bammed'); } }, click: function(event) { if(event.target === this) return; tempShown = true; jMsg.hide().data('hoverize').jTarget.parent().removeClass('an-bammed'); } }); var toggleReplies = this.toggleReplies = function(jScope) { var bamList = getBamList(); (jScope || $(document)).replies().each(function() { var jThis = $(this); jThis.find('tr[userid]').toggleClass('an-bammed', $.inArray(jThis.data('sUserid'), bamList) != -1); }); }; }, infinite: function(jDoc) { this.toggleReplies(jDoc); } }, '7906be8e-1809-40c1-8e27-96df3aa229d8': { desc: '\u7528\u6236\u9ad8\u4eae\u529f\u80fd', page: { 32: true }, type: 6, once: function() { var highlightList = this.highlightList = [], jButton = $.userButton().bind({ click: function() { var userid = jButton.data('userButton').jTarget.attr('userid'); var index = $.inArray(userid, highlightList); index === -1 ? highlightList.push(userid) : highlightList.splice(index, 1); toggleReplies(null); }, buttonshow: function() { jButton.attr('src', $r[jButton.data('userButton').jTarget.hasClass('an-highlighted') ? 'highlighter--minus': 'highlighter--plus']); } }); AN.util.stackStyle($.sprintf('.an-highlighted > td { background-color: %s !important; }', AN.util.getOptions('sHighlightBgColor'))); var toggleReplies = this.toggleReplies = function(jScope) { (jScope || $(document)).replies().each(function() { var jThis = $(this); jThis.find('tr[userid]').toggleClass('an-highlighted', $.inArray(jThis.data('sUserid'), highlightList) != -1); }); }; }, infinite: function(jDoc) { if(this.highlightList.length) this.toggleReplies(jDoc); } }, 'e82aa0ba-aa34-4277-99ea-41219dcdacf2': { desc: '\u7528\u6236\u55ae\u7368\u986f\u793a\u529f\u80fd', defer: 1, page: { 32: true }, type: 6, once: function() { var oFn = this, jButton = $.userButton().bind({ click: function() { oFn.targetId = oFn.targetId ? null : jButton.data('userButton').jTarget.attr('userid'); toggleReplies(null); }, buttonshow: function() { jButton.attr('src', $r[oFn.targetId ? 'magnifier-zoom-out' : 'magnifier-zoom-in']); } }); var toggleReplies = this.toggleReplies = function(jScope) { (jScope || $(document)).replies().each(function() { var jThis = $(this); jThis.closest('div > table').toggle(!oFn.targetId || jThis.data('sUserid') === oFn.targetId); }); }; }, infinite: function(jDoc) { if(this.targetId) this.toggleReplies(jDoc); } }, 'fc07ccda-4e76-4703-8388-81dac9427d7c': { desc: '\u5f37\u5236\u986f\u793a\u7a7a\u767d\u7528\u6236\u540d\u9023\u7d50', page: { 32: true }, type: 6, once: function() { AN.util.stackStyle('.an-nameforcedshown { font-style: italic; }'); }, infinite: function(jDoc) { jDoc.replies().jNameLinks.filter(function(){ return $(this).width() === 0; }).addClass('an-nameforcedshown').html('<\u7a7a\u767d\u540d\u7a31>'); } }, '63333a86-1916-45c1-96e0-f34a5add67c1': { desc: '\u9650\u5236\u56de\u8986\u9ad8\u5ea6', page: { 32: false }, type: 6, options: { replyMaxHeight: { desc: '\u6700\u5927\u9ad8\u5ea6(px)', type: 'text', defaultValue: 2000 } }, once: function() { var maxHeight = AN.util.getOptions('replyMaxHeight'); AN.util.stackStyle('\ .repliers_right, .repliers_right > tbody, .repliers_right > tbody > tr, .repliers_right > tbody > tr > td { display: block; } \ .repliers_right > tbody > tr:first-child { max-height: '+maxHeight+'px; overflow-y: hidden; } \ .an-maxheightremoved > .repliers_right > tbody > tr:first-child { max-height: none; } \ #an-heighttoggler { margin: -14px 0 0 3.5px; } \ #an-heighttoggler > img { padding: 7px 3.5px; cursor: pointer; } \ '); var jButton = $('
    ') .hoverize('.repliers_left + td', { filter: function(){ return $(this).hasClass('an-maxheightremoved') || $(this).find('td:first').innerHeight() > maxHeight; }, autoPosition: false }) .bind({ entertarget: function() { var jTarget = jButton.data('hoverize').jTarget, showFirst = jTarget.hasClass('an-maxheightremoved'), offset = jTarget.offset(); jButton.css({ top: offset.top + jTarget.height(), left: offset.left }).children(':first').toggle(showFirst).nextAll().toggle(!showFirst); }, click: function(event) { var data = jButton.data('hoverize'); data.fixScroll = $(event.target).index() === 2 ? 'top' : 'bottom'; data.fixScroll_difference = data.jTarget[data.fixScroll]() - $d.scrollTop(); data.jTarget.toggleClass('an-maxheightremoved'); } }); } }, '7b36188f-c566-46eb-b48d-5680a4331c1f': { desc: '\u8f49\u63db\u8ad6\u58c7\u9023\u7d50\u7684\u4f3a\u670d\u5668\u4f4d\u7f6e', page: { 32: true }, type: 6, once: function() { var rForum = /(?:demoforum|groupon|search|m\d*|forum\d*)\.hkgolden\.com/i; $d.mousedown(function(event) { var jTarget = $(event.target); if(!( jTarget.is('.repliers_right > tbody > tr:first-child a') && rForum.test(jTarget.attr('href')) )) return; jTarget.attr('href', jTarget.attr('href').replace(rForum, location.hostname)); }); } }, 'e33bf00c-9fc5-46ab-866a-03c4c7ca5056': { desc: '\u8f49\u63db\u6587\u5b57\u9023\u7d50\u6210\u9023\u7d50', page: { 32: true }, type: 6, once: function() { AN.util.stackStyle('.an-linkified { padding-right: 2px; }'); }, infinite: function(jDoc) { var rLink = /(?:https?|ftp):\/\/(?:[\w-]+\.)+[a-z]{2,3}(?![a-z])[\w.\/?:;~!@#$%^&*()+=-]*/i; jDoc.replies().jContents.each(function() { if(rLink.test($(this).text())) { var node, match, next = this.firstChild; while(node = next) { if(node.nodeType === 3 && (match = rLink.exec(node.data))) { next = node.splitText(match.index + match[0].length); $(node.splitText(match.index)) .before('') .after($.sprintf('%s', match[0], match[0])) .remove(); continue; } next = !/^(?:a|button|script|style)$/i.test(node.nodeName) && node.firstChild || node.nextSibling; while(!next && (node = node.parentNode)) next = node.nextSibling; } } }); } }, '422fe323-e61e-47d9-a348-d40011f5da28': { desc: '\u9023\u7d50\u5c01\u9396\u529f\u80fd', page: { 32: false }, type: 6, once: function() { AN.util.stackStyle('\ .repliers_right a[target] { display: inline-block; } \ a[href].an-linkblocked { text-decoration: line-through; font-style: italic; cursor: default; } \ a[target].an-linkblocked:before { content: attr(rel); } \ a[target].an-linkblocked > img { display: none; } \ #an-linkblocktoggler { margin: -16px 0 0 -34px; padding: 16px; padding-right: 2px; } \ '); var blockList = this.blockList = AN.util.data('linkBlockList') || [], rInternal = /^http:\/\/(?:[^.]+.)hkgolden\.com/, jButton = $('', { id: 'an-linkblocktoggler' }) .hoverize('.repliers_right > tbody > tr:first-child a', { filter: function(){ return $(this).hasClass('an-linkblocked') || !rInternal.test(this.href); }, fixScroll: 'top' }) .bind({ entertarget: function() { jButton.attr('src', $r[jButton.data('hoverize').jTarget.hasClass('an-linkblocked') ? 'tick-shield' : 'cross-shield']); }, click: function() { var jTarget = jButton.data('hoverize').jTarget, isBlocked = jTarget.hasClass('an-linkblocked'), hrefAttr = isBlocked ? 'rel' : 'href', realHref = jTarget.attr(hrefAttr), jLinks = $(document).replies().jContents.find('a').filter(function(){ return this[hrefAttr] === realHref; }).toggleClass('an-linkblocked'); if(isBlocked) { jLinks.attr({ href: realHref }); blockList.splice($.inArray(realHref, blockList), 1); } else { jLinks.attr({ href: 'javascript:', rel: realHref }); blockList.push(realHref); } AN.util.data('linkBlockList', blockList); } }); }, infinite: function(jDoc, fn) { jDoc.replies().jContents.find('a').filter(function(){ return $.inArray(this.href, fn.blockList) !== -1; }).toggleClass('an-linkblocked').each(function() { $(this).attr({ href: 'javascript:', rel: this.href }); }); } }, 'd761d6f7-8ef7-4d5b-84e9-db16a274f616': { desc: '\u8f49\u63db\u5716\u7247\u9023\u7d50\u6210\u5716\u7247', page: { 32: false }, type: 6, options: { imageConvertMode: { desc: '\u8f49\u63db\u6a21\u5f0f', type: 'select', choices: ['\u81ea\u52d5\u8f49\u63db', '\u81ea\u52d5\u8f49\u63db(\u5f15\u7528\u4e2d\u7684\u9023\u7d50\u9664\u5916)', '\u624b\u52d5\u8f49\u63db'], defaultValue: '\u81ea\u52d5\u8f49\u63db(\u5f15\u7528\u4e2d\u7684\u9023\u7d50\u9664\u5916)' } }, once: function() { AN.util.stackStyle('\ .an-imagified { padding-left: 2px; } \ .an-imagified + a { display: block; } \ .an-imagified + a > img { border: 0; } \ '); var rImg = /(?:na\.cx|uptow\.net|holland.pk)\/\w+$|\.(?:jpe?g|gif|png|bmp)\b/i; $d.bind('click imageconvert', function(event) { var jTarget = $(event.target); if(jTarget.next('.an-imagified').length) { event.preventDefault(); jTarget.next().next().toggle(); } else if(jTarget.children().length === 0 && (event.type === 'imageconvert' || jTarget.is('.repliers_right > tbody > tr:first-child a')) && rImg.test(event.target.href)) { event.preventDefault(); $('') .insertAfter(jTarget) .after($.sprintf('%(url)s', { url: event.target.href })); } }); }, infinite: function(jDoc) { var convertMode = $.inArray(AN.util.getOptions('imageConvertMode'), this.options.imageConvertMode.choices); if(convertMode !== 2) jDoc.replies().jContents.find(convertMode === 0 ? 'a' : 'a:not(blockquote a)').trigger('imageconvert'); } }, '8e1783cd-25d5-4b95-934c-48a650c5c042': { desc: '\u5716\u7247\u5c4f\u853d\u529f\u80fd', page: { 32: false }, type: 6, options: { imageMaskMode: { desc: '\u5c4f\u853d\u6a21\u5f0f', type: 'select', choices: ['\u81ea\u52d5\u5c4f\u853d', '\u81ea\u52d5\u5c4f\u853d(\u53ea\u9650\u5f15\u7528\u4e2d\u7684\u5716\u7247)', '\u624b\u52d5\u5c4f\u853d'], defaultValue: '\u81ea\u52d5\u5c4f\u853d(\u53ea\u9650\u5f15\u7528\u4e2d\u7684\u5716\u7247)' } }, once: function() { var maskMode = $.inArray(AN.util.getOptions('imageMaskMode'), this.options.imageMaskMode.choices); var selector = { 0: '.repliers_right img[src][onload],', 1: '.repliers_right blockquote img[onload],', 2: '' }[maskMode]; AN.util.stackStyle(selector + 'img[onload].an-maskedImage { padding: 52px 48px 0 0; width: 0; height: 0; background: url('+$r['gnome-mime-image-bmp']+') no-repeat; }'); if(maskMode !== 2) { AN.util.stackStyle('img[src][onload].an-unmaskedImage { padding: 0; width: auto; height: auto; background: none; }'); } var jButton = $('', { src: $r['picture--minus'], css: { 'margin-top': '-2px' } }) .hoverize('.repliers_right img[onload]', { filter: function(){ return $(this).width(); } }) .click(function() { jButton.data('hoverize').jTarget.addClass('an-maskedImage').removeClass('an-unmaskedImage'); }); $d.bind('click', function(event) { var jTarget = $(event.target); if(jTarget.is('img[onload]') && jTarget.width() === 0) { event.preventDefault(); jTarget.addClass('an-unmaskedImage').removeClass('an-maskedImage').mouseover(); } }); } }, '039d820f-d3c7-4539-8647-dde974ceec0b': { desc: '\u8f49\u63db\u8996\u983b\u7db2\u7ad9\u9023\u7d50\u6210\u5f71\u7247', page: { 32: true }, type: 6, defer: 2, // after layout is fixed options: { videoConvertMode: { desc: '\u8f49\u63db\u6a21\u5f0f', type: 'select', choices: ['\u81ea\u52d5\u8f49\u63db', '\u81ea\u52d5\u8f49\u63db(\u5f15\u7528\u4e2d\u7684\u9023\u7d50\u9664\u5916)', '\u624b\u52d5\u8f49\u63db'], defaultValue: '\u81ea\u52d5\u8f49\u63db(\u5f15\u7528\u4e2d\u7684\u9023\u7d50\u9664\u5916)' }, videoMaxWidth: { desc: '\u64ad\u653e\u5668\u6700\u5927\u95ca\u5ea6 [\u53ef\u8a2d\u5b9a\u70ba80%, 1000px\u7b49]', type: 'text', defaultValue: '100%' } }, once: function() { var nWidth, nHeight, sUrl; var aSites = [{ regex: 'youtube\\.com/watch\\?', fn: function() { nHeight = nWidth / 16 * 9 + 25; sUrl = $.sprintf('http://www.youtube.com/v/%s?version=3&fs=1&rel=0', sUrl.replace(/.+?v=([^&#]+).*/i, '$1')); } }, { regex: 'youtu\\.be/.', fn: function() { nHeight = nWidth / 16 * 9 + 25; sUrl = $.sprintf('http://www.youtube.com/v/%s?version=3&fs=1&rel=0', sUrl.replace(/.+\/([^?&#]+).*/i, '$1')); } }, { regex: 'vimeo\\.com/\\d', fn: function() { nHeight = nWidth / 1.5; sUrl = $.sprintf('http://vimeo.com/moogaloop.swf?clip_id=%s&show_title=1&fullscreen=1', sUrl.replace(/.+vimeo\.com\/(\d+).*/i, '$1')); } }, { regex: 'youku\\.com/v_show/', fn: function() { nHeight = nWidth / 4 * 3 + 40; sUrl = $.sprintf('http://player.youku.com/player.php/sid/%s/v.swf', sUrl.replace(/.+?id_([^\/]+).*/i, '$1')); } }, { regex: 'tudou\\.com/programs/', fn: function() { nHeight = nWidth / 4 * 3 + 48; sUrl = $.sprintf('http://www.tudou.com/v/%s', sUrl.replace(/.+?view\/([^\/]+).*/i, '$1')); } }]; var rLink = (function() { var aReg = []; $.each(aSites, function(){ aReg.push(this.regex); }); return new RegExp(aReg.join('|'), 'i'); })(); AN.util.stackStyle('\ .an-videoified { padding-left: 2px; } \ .an-videoified + object { display: block; outline: 0; } \ '); $d.bind('click videoconvert', function(event) { var jTarget = $(event.target); if(jTarget.next('.an-videoified').length) { event.preventDefault(); jTarget.next().next().remove().end().remove(); } else if((event.type === 'videoconvert' || jTarget.is('.repliers_right > tbody > tr:first-child a')) && rLink.test(event.target.href)) { event.preventDefault(); sUrl = event.target.href; var maxWidth = jTarget.up('div').width(); nWidth = AN.util.getOptions('videoMaxWidth'); nWidth = /.+%/.test(nWidth) ? maxWidth * parseInt(nWidth) / 100 : parseInt(nWidth); nWidth > maxWidth && (nWidth = maxWidth); $.each(aSites, function() { if(RegExp(this.regex, 'i').test(sUrl)) { this.fn(); return false; } }); $('
    ') .insertAfter(jTarget) .toFlash(sUrl, { width: nWidth, height: nHeight.toFixed(0) }, { wmode: 'opaque', allowfullscreen: 'true' }) .before(''); } }); }, infinite: function(jDoc, oFn) { var convertMode = $.inArray(AN.util.getOptions('videoConvertMode'), this.options.videoConvertMode.choices); if(convertMode !== 2) jDoc.replies().jContents.find(convertMode === 0 ? 'a' : 'a:not(blockquote a)').trigger('videoconvert'); } }, 'a7484cf2-9cbd-47aa-ac28-472f55a1b8f4': { desc: '\u9700\u8981\u6642\u81ea\u52d5\u52a0\u5165\u4ee3\u78bc\u63d2\u5165\u6309\u626d', page: { 288: true }, type: 6, once: function() { var rUrl, jUrlBtn, rImg, jImgBtn, text, match; var jTextarea = $('#ctl00_ContentPlaceHolder1_messagetext').bind('keyup mouseup change', function() { if(!rUrl) { var parts = { host: 'https?://(?:[\\w-]+\\.)+[a-z]{2,4}(?![a-z])', codes: '\\[/?(?:img|url|quote|\\*|left|center|right|b|i|u|s|size|red|green|blue|purple|violet|brown|black|pink|orange|gold|maroon|teal|navy|limegreen)' }; rUrl = new RegExp($.sprintf('%(host)s(?:/(?:(?!%(codes)s)\\S)*)?(?!(\\S*?| *)\\[/(?:img|url)])', parts), 'gi'); jUrlBtn = $('
    '; $.each(html.table, function(rowNo, row) { function writeLink(smileyNo, smiley) { tableHTML += $.sprintf( '%(code)s  ', { code: smiley[0], path: html.path, filename: smiley[1] } ); } tableHTML += ''; tableHTML += rowNo == 0 ? ''; if(rowNo == 1 && html.span) { tableHTML += ''; } tableHTML += ''; }); tableHTML += '
    ' : ''; $.each(row, writeLink); tableHTML += ''; $.each(html.span, writeLink); tableHTML += '
    '; }); return tableHTML; }); var lastSelected = AN.util.data('lastSelectedSmiley'); if(AN.util.getOptions('sSmileySelectMethod') === '\u5217\u8868') { var selectHTML = ''; var select = $(selectHTML).change(function() { AN.util.data('lastSelectedSmiley', this.selectedIndex); jSmileyTr.children(':last').children().hide().eq(this.selectedIndex).show(); }).appendTo(jSmileyTr.children(':first').empty()).after(':'); if(lastSelected != null) { select[0].selectedIndex = lastSelected; select.change(); } } else { AN.util.addStyle('#an-smileyselector { list-style: none; margin: 0; padding: 0; font-size: 80%; }'); var listHTML = ''; var list = $(listHTML).click(function(event) { var jTarget = $(event.target); if(!jTarget.is('a')) return; var index = jTarget.parent().index(); AN.util.data('lastSelectedSmiley', index); jSmileyTr.children(':last').children().hide().eq(index).show(); }).appendTo(jSmileyTr.children(':first').empty()); if(lastSelected != null) { list.children().eq(lastSelected).children('a').click(); } } }); } }, 'e336d377-bec0-4d88-b6f8-52e122f4d1c9': { desc: '\u52a0\u5165\u81ea\u8a02\u6587\u5b57\u63d2\u5165\u63a7\u4ef6', page: { 288: true }, type: 5, once: function() { if(!$('#ctl00_ContentPlaceHolder1_messagetext').length) return; var snippets = AN.util.data('snippets') || [ ['\u5bb6\u59d0\u6f6e\u6587', '\u8b1b\u8d77\u6211\u5c31\u626f\u706b\u5566\n\u6211\u5bb6\u59d0\u4e00\u8def\u90fd\u5728\u592a\u53e4\u5ee3\u5834\u4e00\u9593\u540d\u5e97\u505asales\n\u9593\u5e97\u6709\u597d\u591a\u6709\u9322\u4eba\u540c\u540d\u4eba\u5e6b\u896f\n\u505a\u4e86\u5f88\u591a\u5e74\uff0c\u5df2\u7d93\u662fsenior\n\u5481\u591a\u5e74\u9ece\u90fd\u597d\u4ffe\u5fc3\u6a5f\u505a\uff0c\u7d93\u7406\u4ea6\u597d like\u4f62\n\u56e0\u70ba\u6536\u5165\u4e0d\u932f\u53c8\u96b1\u5b9a\uff0c\u5bb6\u59d0\u539f\u672c\u8ad7\u4f4f\u540c\u62cd\u62d6\u591a\u5e74\u65e2bf\u7d50\u5a5a\n\u5481\u591a\u5e74\u9ece\u6211\u5bb6\u59d0\u597d\u5c11\u4ffe\u4eba\u6295\u8a34\n\u800c\u4e14\u540c\u597d\u591a\u5927\u5ba2\u65e2\u95dc\u4fc2\u90fd\u5514\u932f\n\u524d\u6392\u95dc\u5fc3\u7814\u53bb\u904e\u6211\u5bb6\u59d0\u9593\u5e97\u5e6b\u896f\n\u4e0d\u904eserve\u4f62\u65e2\u4e0d\u662f\u6211\u5bb6\u59d0\uff0c\u4f46\u4f62\u4e00\u8cb7\u5c31\u8cb7\u5de6\u597d\u591a\u91ce\n\u904e\u5de6\u500b\u5e7e\u661f\u671f\uff0c\u4f62\u53c8\u518d\u53bb\u9593\u5e97\u884c\n\u4e0a\u6b21serve\u679c\u500bDay-off, \u5481\u6211\u5bb6\u59d0\u5c31\u9802\u4e0aserve\u4f62\n\u958b\u982d\u5df2\u7d93\u597d\u6709\u79ae\u8c8c\u4ecb\u7d39d\u65b0\u8ca8\u4ffe\u4f62, \u4ef2\u8a71\u4ffe\u6298\u982d\u4f62\n\u4f62\u5c31\u7121\u4e5c\u53cd\u61c9\uff0c\u671b\u4e00\u671b\u53e6\u4e00\u5806\u5ba2\n\u679c\u5806\u5ba2\u4fc2\u5927\u9678\u4eba\uff0c\u4e09\u81f3\u56db\u500b\uff0c\u8b1b\u91ce\u597d\u5927\u8072\n\u95dc\u5c0f\u59d0\u5c31\u540c\u6211\u5bb6\u59d0\u8b1b\u8a71\u53ef\u5514\u53ef\u4ee5\u95dc\u5de6\u9593\u92ea\u4e00\u9663\n\u7b49\u4f62\u63c0\u886b\n \u6211\u5bb6\u59d0\u540c\u6211\u8b1b\uff0c\u4f62\u516c\u53f8\u4e00\u5411\u5514\u4ffe\u4f62\u5730\u5481\u505a\n\u9a5a\u505a\u58de\u500b\u982d\uff0c\u9664\u975e\u771f\u4fc2\u6709\u4e5c\u5927\u4eba\u7269\uff0c\u597d\u591a\u8a18\u8005\u597d\u6df7\u4e82\u5148\u53ef\u4ee5\u5481\u505a\n\u4f46\u4f62\u898b\u5230\u95dc\u5c0f\u59d0\u9ed1\u53e3\u9ed1\u9762\uff0c\u90fd\u8b58\u505a\u8a71\u6253\u96fb\u8a71\u53bb\u554f\u4e00\u554f\u8001\u95c6\n\u8001\u95c6\u6897\u4fc2\u8a71\u5514\u5f97\u5566\uff0c\u81f3\u591a\u4ffe\u591ad\u6298\u982d\u5979\n\u5481\u95dc\u5c0f\u59d0\u5c31\u767c\u8001\u813e\uff0c\u9b27\u5230\u6211\u5bb6\u59d0\u4e00\u9762\u5c41\nd\u8aaa\u8a71\u52c1\u96e3\u807d\uff0c\u53c8\u8a71\u81ea\u5df1\u8cb7\u91ce\u65e2\u9322\u591a\u904e\u6211\u5bb6\u59d0\u6435\u5e7e\u5e74\u65e2\u9322\n\u6211\u5bb6\u59d0\u90fd\u5514\u6562\u5f97\u7f6a\u4f62\uff0c\u4e00\u5473\u9053\u6b49\n\u8ddf\u4f4f\u95dc\u5c0f\u59d0\u5c31\u8d70\u5de6\u4eba\uff0c\u5bb6\u59d0\u5c31\u540c\u8001\u95c6\u5099\u6848\n\u8001\u95c6\u77ad\u89e3\u5de6\u60c5\u6cc1\u5c31\u7121\u518d\u8ffd\u554f\n\u904e\u5de6\u5169\u65e5\u4f62\u63a5\u5230\u8001\u95c6\u96fb\u8a71\u8a71\u6536\u5230complaint \n\u8a71\u6709\u4eba\u6295\u8a34\u4f62\u614b\u5ea6\u5514\u597d\uff0c\u5514\u7406\u9867\u5ba2\u611f\u53d7\n\u516c\u53f8policy\u4e00\u5411\u5514\u8a71\u4ffe\u4f62\u5730\u77e5\u4fc2\u908a\u6b21\u4e8b\u4ef6\n\u6211\u5bb6\u59d0\u4f30\u9ece\u4f30\u53bb\u90fd\u6de8\u4fc2\u5f97\u5931\u904e\u95dc\u5c0f\u59d0\u4e00\u4eba\n\u7e3d\u4e4b\u4ffe\u8001\u95c6\u8a71\u5de6\u5169\u53e5\n\u53c8\u904e\u5e7e\u65e5\uff0c\u95dc\u5c0f\u59d0\u53c8\u9ece\n\u9019\u6b21\u548c\u4ef6\u897f\u88dd\u53cb\u4e00\u9f4a\uff0c\u4f46\u597d\u5728\u6210\u5e97\u90fd\u7121\u5176\u4ed6\u5ba2\n\u6211\u5bb6\u59d0\u6015\u53c8\u60f9\u4e8b\uff0c\u53eb\u5de6\u500bjunior\u904e\u53bbserve\u4f62\n\u9ede\u77e5\u689d\u8001\u897f\u53cb\u4fc2\u8981\u9ede\u756a\u6211\u5bb6\u59d0serve.\n\u6839\u4f4f\u95dc\u5c0f\u59d0\u5c31\u73a9\u91ce\uff0c\u8a66\u886b\uff0c\u4f46\u8a71d\u886b\u4ffe\u5176\u4ed6\u4eba\u8a66\u904e\u6c61\u7cdf\n\u8981\u958b\u65b0\u886b\u8a66\uff0c\u6211\u5bb6\u59d0\u96d6\u7136\u77e5\u516c\u53f8\u5514\u4ffe\u5481\u505a\uff0c\n\u4f46\u6015\u5de6\u4f62\uff0c\u552f\u6709\u7167\u505a\n\u9ede\u77e5\u8a66\u5de6\u5169\u4e09\u4ef6\uff0c\u4ef6\u4ef6\u4f62\u90fd\u8981\u5481\u8a66\u53c8\u7121\u8a71\u8981\n\u6211\u5bb6\u59d0\u7d42\u65bc\u8a71\u5514\u597d\u610f\u601d\uff0c\u5176\u5be6\u5514\u53ef\u4ee5\u5481\u505a\n(\u6839\u672c\u660e\u77e5\u5979\u73a9\u91ce\u5566.....)\n\u53c8\u4fc2\u81f3\u591a\u4ffe\u591ad\u6298\u982d\u4f62\n\u8ddf\u4f4f\u4f62\u4ef6\u897f\u88dd\u53cb\u5c31\u9b27\u6211\u5bb6\u59d0\u8a71"\u4fc2\u54aa\u8a71\u6211\u5730\u7121\u9322\u8cb7\u4f60\u5730d\u91ce?"\n\u6211\u5bb6\u59d0\u8a71\u5514\u4fc2\uff0c\u4f46\u4f62\u7167\u9b27\n\u9b27\u5de6\u5341\u5e7e\u5206\u9418\nd\u540c\u4e8b\u898b\u5481\u5e6b\u624b\uff0c\u53c8\u7167\u9b27\n\u6700\u7d42\u6253\u4ffe\u8001\u95c6\u5099\u6848\n\u4e4b\u5f8c\u9023\u6536\u5169\u5c01warning letter\n\u65e9\u5169\u65e5\u63a5\u57cb\u5927\u4fe1\u5c01\n\u5e74\u5c3e\u4ffe\u4eba\u7092\u5de6'] ]; var jSelect = $(''); function writeSelect() { var selectHTML = ''; $.each(snippets, function(textNo) { selectHTML += $.sprintf('', textNo, this[0]); }); selectHTML += ''; jSelect.html(selectHTML); } writeSelect(); var jSnippets; jSelect.insertBefore($('#ctl00_ContentPlaceHolder1_messagetext').prev()).change(function() { if(this.value == 'customize') { if(!jSnippets) { AN.util.addStyle($.sprintf('\ #an-snippets { padding: 5px; } \ #an-snippets > ul { height: 350px; overflow: auto; } \ #an-snippets > ul > li { padding: 2px 0; } \ #an-snippets > ul > li > span { margin-right: 5px; border: 1px solid black; padding: 0 5px; background-color: %(sMainHeaderBgColor)s; color: %(sMainHeaderFontColor)s; cursor: pointer; } \ #an-snippets > div { float: right; margin-left: 10px; padding-left: 10px; text-align: center; border-left: 1px solid gray; } \ #an-snippets > div > textarea { display: block; width: 400px; height: 300px; } \ ', AN.util.getOptions() )); var index, editing, jDesc, jContent; jSnippets = AN.shared.box('an-snippets', '\u81ea\u8a02\u6587\u5b57', 700) .append('
    ') .click(function(event) { var jTarget = $(event.target); if(!jTarget.is('span,button')) return; var type = jTarget.text(); if(type == 'cancel') { jSnippets.children('div').css('opacity', '0.5').children().attr('disabled', true); } else if(type == 'E' || type == '+') { editing = (type === 'E'); index = jTarget.parent().index(); jDesc.val(type == 'E' ? snippets[index][0] : '').next().val(type == 'E' ? snippets[index][1] : '').parent().css('opacity', '1').children().attr('disabled', false); } else { if(type == 'ok') { if(editing) { snippets[index] = [jDesc.val(), jContent.val()]; editing = false; } else { snippets.push([jDesc.val(), jContent.val()]); } } else if(type == 'X' && confirm('\u78ba\u5b9a\u79fb\u9664?')) { snippets.splice(jTarget.parent().index(), 1); } AN.util.data('snippets', snippets); writeSnippets(); writeSelect(); } }); } jDesc = jSnippets.find('> div > input'); jContent = jDesc.next(); function writeSnippets() { var sHTML = ''; $.each(snippets, function() { sHTML += '
  • XE' + this[0] + '
  • '; }); sHTML += '
  • +...
  • '; jSnippets.children('ul').html(sHTML).next().css('opacity', '0.5').children().val('').attr('disabled', true); } writeSnippets(); AN.shared.gray(true, 'an-snippets'); } else { window.InsertText(snippets[this.value][1], false); } this.selectedIndex = 0; }); } } }}; AN.mod['Component Redesigner'] = { ver: 'N/A', author: '\u5411\u65e5', fn: { '8be1ac06-030a-42d4-a8f4-f2b7f4881300': { desc: '\u6539\u8b8a\u5f15\u7528\u98a8\u683c', page: { 32: true }, type: 8, options: { quoteStyle: { desc: '\u5f15\u7528\u98a8\u683c', type: 'select', choices: ['\u9810\u8a2d', '\u5fa9\u53e4', '\u73fe\u4ee3'], defaultValue: '\u9810\u8a2d' }, quoteMaskLevel: { desc: '\u5f15\u7528\u5c4f\u853d\u5c64\u7d1a', type: 'text', defaultValue: 10 } }, once: function() { AN.util.stackStyle('.repliers_right blockquote + br { display: none; }'); var styleNo = this.styleNo = $.inArray(AN.util.getOptions('quoteStyle'), this.options.quoteStyle.choices), jButton; switch(styleNo) { case 0: AN.util.stackStyle('\ .repliers_right blockquote { margin: 0 0 8px 1px; padding: 0 0 7px 40px; } \ blockquote.an-hiddenquote { padding-left: 0; } \ .an-hiddenquote:before { content: url('+ $r['balloon--plus'] +'); } \ .an-hiddenquote > div { display: none; } \ '); jButton = $('').hoverize('.repliers_right blockquote').bind({ 'mouseover mouseout': function(event) { var jTarget = jButton.data('hoverize').jTarget; jTarget.css('outline', event.type === 'mouseout' || jTarget.hasClass('an-hiddenquote') ? '0' : '1px dashed gray'); }, entertarget: function() { jButton.attr('src', $r[jButton.data('hoverize').jTarget.hasClass('an-hiddenquote') ? 'balloon--plus' : 'balloon--minus']); } }); break; case 1: AN.util.stackStyle('\ .an-quotetogglebutton { margin: -18px 0 0 -4px; } \ .an-quotetogglebutton, blockquote:before { color: #999; } \ .repliers_right blockquote:before { content: ""; position: absolute; width: 20px; height: 20px; top 0; left: -4px; margin-top: -18px; } \ .repliers_right td > blockquote { margin: 15px 0 10px 3px; } \ .repliers_right blockquote { position: relative; margin: 0 0 10px 0; } \ .repliers_right blockquote > div { border-left: 2px solid #999; padding-left: 5px; } \ blockquote.an-hiddenquote:before { content: "+"; } \ .an-hiddenquote > div > blockquote { display: none; } \ '); jButton = $('').hoverize('blockquote', { filter: ':has(blockquote)' }) .bind('entertarget', function() { jButton.text(jButton.data('hoverize').jTarget.hasClass('an-hiddenquote') ? '+' : '--'); }); break; case 2: AN.util.stackStyle($.sprintf('\ .an-quotetogglebutton { margin: 2px 0 0 -15px; font-weight: bold; } \ .an-quotetogglebutton, blockquote:before, .an-hiddenquote:after { font-size: 12px; color: %(sMainHeaderFontColor)s; } \ .repliers_right blockquote:before { content: "\u5f15\u7528:"; display: block; margin-bottom: 2px; padding-left: 3px; line-height: 1.3; background-color: %(sMainHeaderBgColor)s; } \ .repliers_right td > blockquote { border-right-width: 1px; } \ .repliers_right blockquote { margin: 0 0 5px 0; border: 1px solid %(sMainBorderColor)s; border-right-width: 0; } \ .repliers_right blockquote > div { padding: 0 0 5px 2px; } \ .an-hiddenquote { position: relative; } \ .an-hiddenquote:after { content: "\uff0b"; position: absolute; top: 1px; right: 3px; font-weight: bold; } \ .an-hiddenquote > div > blockquote { display: none; } \ ', AN.util.getOptions())); jButton = $('').hoverize('blockquote', { filter: ':has(blockquote)', autoPosition: false }) .bind('entertarget', function() { var jTarget = jButton.data('hoverize').jTarget, offset = jTarget.offset(); jButton.text(jTarget.hasClass('an-hiddenquote') ? '\uff0b' : '\uff0d').css({ top: offset.top, left: offset.left + jTarget.width() }); }); break; } jButton.click(function() { jButton.data('hoverize').jTarget.toggleClass('an-hiddenquote'); }); }, infinite: function(jDoc) { var level = AN.util.getOptions('quoteMaskLevel') - (this.styleNo === 0 ? 1 : 2); if(level < 0) return; jDoc.replies().jContents .find(this.styleNo === 0 ? 'blockquote' : 'blockquote:has(blockquote)') .filter(function(){ return $(this).parentsUntil('td', 'blockquote').length === level; }) .addClass('an-hiddenquote'); } }, 'cb1917f9-4053-40b1-870d-e0e2c6a90b39': { desc: '\u6539\u8b8a\u5feb\u901f\u56de\u8986\u7684\u98a8\u683c', page: { 32: true }, type: 8, options: { sQRHideMethod: { desc: '\u96b1\u85cf\u65b9\u5f0f', type: 'select', choices: ['\u5b8c\u5168\u96b1\u85cf', '\u96b1\u85cf\u65bc\u4e2d\u4e0b\u65b9, \u61f8\u6d6e\u5207\u63db\u986f\u793a', '\u96b1\u85cf\u65bc\u4e2d\u4e0b\u65b9, \u9ede\u64ca\u5207\u63db\u986f\u793a', '\u96b1\u85cf\u65bc\u53f3\u4e0b\u89d2'], defaultValue: '\u96b1\u85cf\u65bc\u4e2d\u4e0b\u65b9, \u9ede\u64ca\u5207\u63db\u986f\u793a' }, nQROpacity: { desc: '\u900f\u660e\u5ea6 (10 = \u79fb\u9664\u534a\u900f\u660e)', type: 'select', defaultValue: 10, choices: [10,9,8,7,6,5,4,3,2,1,0] } }, once: function(jDoc) { if(!AN.util.isLoggedIn()) return; var hideMode = $.inArray(AN.util.getOptions('sQRHideMethod'), this.options.sQRHideMethod.choices), jQR = $('#newmessage'), jQRTable = jQR.find('tr:eq(2)').attr('id', 'always-show'), jQRDummt = jQR.find('.tbl_wrapper_reply').append('  '), jQRHeader = jQR.find('td:eq(1)').attr('id', 'an-qr-header'), jToggle = (hideMode === 0 ? jQR : jQR.find('tr:eq(2)')).hide(), jPreview = $('#previewArea'), jTextarea = $('#ctl00_ContentPlaceHolder1_messagetext'), nWidth = 954, nRight = 50 - nWidth; jQRHeader.children()[0].nextSibling.nodeValue = '\u5feb\u901f\u56de\u8986'; AN.util.stackStyle($.sprintf('\ #always-show { display:table-row!important; } \ #newmessage { %s; z-index: 2; position: fixed; width: %spx; bottom: 0px; right: %s; max-height: 100%; overflow: auto; } \ #an-qr-header { cursor: pointer; text-align: center; position:fixed; left:0; bottom:0; } \ #previewArea { display: block; overflow: auto; width: %spx; } \ #previewArea img[onload] { max-width: 300px; } \ ', AN.util.getOpacityStr(AN.util.getOptions('nQROpacity')), nWidth, hideMode === 3 ? nRight + 'px': '50%', nWidth - 149 )); if(hideMode !== 3) { AN.util.stackStyle($.sprintf('#newmessage { margin-right: %spx; }', -nWidth / 2 - 9)); } function toggleQR(toShow, callback) { var isVisible = jToggle.is(':visible'); if(toShow === undefined) toShow = !isVisible; else if(isVisible === toShow) return; function toggle() { jQR.css('z-index', toShow ? 4 : 2); jPreview.empty(); jToggle.toggle(toShow); if(toShow) { window.moveEnd(); jTextarea.scrollTop(99999); } } if(hideMode === 3) { if(toShow) { jQR.animate({ right: Math.ceil(($.winWidth() - nWidth) / 2) }, 'slow', toggle); } else { toggle(); jQR.animate({ right: nRight }, 'slow'); } } else { toggle(); } } hideMode === 1 ? jQR.bind('mouseenter mouseleave', function(event){ toggleQR(event.type === 'mouseenter'); }) : jQRHeader.click(function(){ toggleQR(); }); $('#aspnetForm').submit(function() { toggleQR(false); }); window.OnQuoteSucceeded = function(result) { jTextarea.val(unescape(result) + '\n'); toggleQR(true); }; window.doPreview = (function(_doPreview) { return function() { _doPreview(); jPreview.css('max-height', $.winHeight() - jQR.height() - jPreview.height()); }; })(window.doPreview); } } }}; AN.mod['Style Editor'] = { ver: 'N/A', author: '\u5411\u65e5', fn: { '89615a78-21b7-46bd-aeb1-12e7f031e896': { desc: '\u5f37\u5236\u66f4\u6539\u5168\u5c40\u5b57\u9ad4', page: { 65534: false }, type: 2, options: { sMainFontFamily: { desc: '\u5b57\u9ad4\u540d\u7a31', defaultValue: 'SimSun', type: 'text' } }, once: function() { AN.util.stackStyle($.sprintf('#aspnetForm > div *, #an { font-family: %s; }', AN.util.getOptions('sMainFontFamily'))); } }, 'eda2bf08-c9d8-45ed-9f97-1936be93e32d': { desc: '\u5f37\u5236\u66f4\u6539\u5168\u5c40\u5b57\u9ad4\u5927\u5c0f', page: { 65534: false }, type: 2, options: { sMainFontSize: { desc: '\u5b57\u9ad4\u5927\u5c0f', defaultValue: '16', type: 'text' } }, once: function() { AN.util.stackStyle($.sprintf('body, td, p { font-size: %spx; }', AN.util.getOptions('sMainFontSize'))); } }, 'cad6d058-f999-460d-ac29-4074f33f46fb': { desc: '\u8a2d\u5b9a\u9023\u7d50\u6a23\u5f0f', page: { 65534: false }, type: 2, options: { sMainLinkFontColor: { desc: '\u666e\u901a\u9023\u7d50\u984f\u8272', defaultValue: '#1066d2', type: 'text' }, sMainVisitedColor: { desc: '\u5df2\u8a2a\u554f\u9023\u7d50\u984f\u8272', defaultValue: '#800080', type: 'text' }, sMainHoverColor: { desc: '\u9023\u7d50\u61f8\u6d6e\u984f\u8272', defaultValue: '', type: 'text' }, bRemoveLinkUnderline: { desc: '\u79fb\u9664\u9023\u7d50\u5e95\u7dda', defaultValue: false, type: 'checkbox' } }, once: function() { var sTextCSS = AN.util.getOptions('bRemoveLinkUnderline') ? 'text-decoration: none; } a[href^="/blog/blog.aspx"] > span { text-decoration: none !important; } .repliers_right a { text-decoration: underline; }' : '}'; AN.util.stackStyle($.sprintf('\ body > form a, #ctl00_ContentPlaceHolder1_MiddleAdSpace1 a { color: %(sMainLinkFontColor)s; ' + sTextCSS + ' \ body > form a[href*="view.aspx"]:visited, .repliers_right a:visited { color: %(sMainVisitedColor)s; } \ body > form a[href]:hover { color: %(sMainHoverColor)s; } \ ', AN.util.getOptions() )); } }, '7574582b-2fea-4079-8dfb-7ac4e5587ecb': { desc: '\u6539\u8b8a\u8ad6\u58c7\u6a23\u5f0f', page: { 65534: false }, type: 2, options: { sLogoBgImage: { desc: '\u9ad8\u767bLogo\u5716\u7247', defaultValue: '/images/index_images/logo.jpg', type: 'text' }, /*sTopBgImage: { desc: '\u9802\u90e8\u80cc\u666f\u5716\u7247', defaultValue: '/images/index_images/bg_top.jpg', type: 'text' },*/ sMainBgImage: { desc: '\u4e3b\u8868\u683c\u80cc\u666f\u5716\u7247', defaultValue: '/images/index_images/bg_maintop.jpg', type: 'text' }, sRedTitleFontColor: { desc: '\u7d05\u4eba\u699c\u6a19\u984c\u5b57\u9ad4\u984f\u8272', defaultValue: '#FFFFFF', type: 'text' }, sRedTitleBgColor: { desc: '\u7d05\u4eba\u699c\u6a19\u984c\u80cc\u666f\u984f\u8272', defaultValue: '#CC2331', type: 'text' }, sRedHeaderFontColor: { desc: '\u7d05\u4eba\u699c\u7b2c\u4e00\u5217\u5b57\u9ad4\u984f\u8272', defaultValue: '#003366', type: 'text' }, sRedHeaderBgColor: { desc: '\u7d05\u4eba\u699c\u7b2c\u4e00\u5217\u80cc\u666f\u984f\u8272', defaultValue: '#FF5560', type: 'text' }, sRedContentFontColor: { desc: '\u7d05\u4eba\u699c\u5167\u5bb9\u5b57\u9ad4\u984f\u8272', defaultValue: '#000000', type: 'text' }, sBlueBarFontColor: { desc: '\u85cd\u8272\u6a6b\u689d\u5b57\u9ad4\u984f\u8272', defaultValue: '#FFFFFF', type: 'text' }, sBlueBarBgColor: { desc: '\u85cd\u8272\u6a6b\u689d\u80cc\u666f\u984f\u8272', defaultValue: '#6EA0C4', type: 'text' }, sBlueBarBgImage: { desc: '\u85cd\u8272\u6a6b\u689d\u80cc\u666f\u5716\u7247', defaultValue: '/images/left_menu/p.png', type: 'text' }, sBlueSecBgColor: { desc: '\u9ad8\u767b\u516c\u544a\u5167\u90e8\u6a6b\u689d\u80cc\u666f\u984f\u8272', defaultValue: '#CCDDEA', type: 'text' }, sHighlightBgColor: { desc: '\u9ad8\u4eae\u80cc\u666f\u984f\u8272', defaultValue: '#E9EC6C', type: 'text' }, sTimeFontColor: { desc: '\u6642\u9593\u5b57\u9ad4\u984f\u8272', defaultValue: '#800000', type: 'text' }, sMaleFontColor: { desc: '\u7537\u7528\u6236\u9023\u7d50\u984f\u8272', defaultValue: '#0066FF', type: 'text' }, sFemaleFontColor: { desc: '\u5973\u7528\u6236\u9023\u7d50\u5b57\u9ad4\u984f\u8272', defaultValue: '#FF0066', type: 'text' }, sQuoteFontColor: { desc: '\u5f15\u7528\u5b57\u9ad4\u984f\u8272', defaultValue: '#0000A0', type: 'text' }, sFooterBgColor: { desc: '\u9801\u8173\u6a2a\u689d\u80cc\u666f\u984f\u8272', defaultValue: '#FFCC00', type: 'text' } }, once: function() { AN.util.stackStyle($.sprintf(' \ /* Global stuff */\ body, textarea, input, select { background-color: %(sMainBgColor)s; } \ textarea, input, select { border: 2px solid %(sMainBorderColor)s; } \ body, p, td, textarea, input, select, .addthis_toolbox > a, .addthis_toolbox > span, .href_txt1 { color: %(sMainFontColor)s; } \ *[style*="#EADEB8"] { background-color: %(sSecBgColor)s; } \ /* main border */\ div[style*="0, 0, 0"], div[style*="000000"], .DivMarkThread, .repliers_header, .repliers_left, .repliers, .repliers td, .Topic_ForumInfoPanel table, .Topic_ForumInfoPanel th { border-color: %(sMainBorderColor)s !important; } \ #aspnetForm table[cellspacing="1"][cellpadding="2"], #ctl00_ContentPlaceHolder1_PMMsgTable, #ctl00_ContentPlaceHolder1_QuickReplyTable, #ctl00_ContentPlaceHolder1_QuickReplyLoginTable { background-color: %(sMainBorderColor)s !important; } \ *[style*="128, 128, 128"], *[style*="808080"] { background-color: transparent !important; } \ /* sec border */\ .main_table1 { border-color: %(sSecBorderColor)s; } \ /* nearly-white backgrounds */\ *[style*="rgb(23"], *[style*="rgb(24"], *[style*="#E"], *[style*="#F"], *[style*="#e"], *[style*="#f"], .Topic_ForumInfoPanel table td { background-color: %(sSecBgColor)s !important; } \ /* PM Box & white table cells */\ .DivMarkThread, .ListPMText, *[style*="255, 255, 255"], *[style*="#FFFFFF"], *[style*="background-color: white"], *[style*="BACKGROUND-COLOR: white"], *[style*="BACKGROUND-COLOR:White"], *[style*="background-color:White"], *[bgcolor="#f8f8f8"] { background-color: %(sMainBgColor)s !important; } \ /* headers */\ *[style*="#6ea0c3"], .blue_bg, .repliers_header, *[style*="51, 102, 153"], *[style*="#336699"], .Topic_ForumInfoPanel table th, .Topic_ListPanel table th { color: %(sMainHeaderFontColor)s !important; background-color: %(sMainHeaderBgColor)s !important; } \ /* under logo links, footer text, username links, bookmarkbar */\ .encode_link, .txt_11pt_1A3448, *[style*="color: black"], *[style*="COLOR: black"], *[style*="color:Black"], *[style*="COLOR:Black"], .hkg_bottombar_link { color: %(sMainFontColor)s !important; } \ /* non-transparent images */\ body, .lightbrown_bg { background-image: none; } \ .TopMenuPanel, .bg_top { background-image: url(%(sTopBgImage)s); } \ .PageMiddleBox, .bg_main { background-image: url(%(sMainBgImage)s); } \ /* main logo */\ #ctl00_TopBarHomeLink { display: block; background: url(%(sLogoBgImage)s) no-repeat; } \ #ctl00_TopBarHomeLink img { visibility: hidden; } \ /* thin bars icon */\ .DivBoxTitle, .ProfileBoxTitle:first-child, .DivResizableBoxTitle:first-child, .title:first-child, *[bgcolor="#6ea0c4"]:first-child, .redhottitle:first-child { background: url(%(sBlueBarBgImage)s) no-repeat; } \ *[src*="/p.jpg"], *[src*="/redhotp.jpg"] { visibility: hidden; } \ /* blue bars , red bars, and main forum page bars */\ .DivBoxTitle, .ProfileBoxTitle, .DivResizableBoxTitle, .title, *[bgcolor="#6ea0c4"], *[colspan="6"] { background-color: %(sBlueBarBgColor)s !important; color: %(sBlueBarFontColor)s; } \ .redhottitle { background-color: %(sRedTitleBgColor)s; color: %(sRedTitleFontColor)s; } \ /* hot people */\ table[style*="255, 85, 96"], tr[style*="255, 85, 96"], table[style*="#ff5560"], tr[style*="#ff5560"] { background-color: %(sRedHeaderBgColor)s !important; } \ td[style*="255, 85, 96"], td[style*="#ff5560"] { border-color: %(sRedHeaderBgColor)s !important; } \ *[style*="0, 51, 102"], *[style*="#003366"] { color: %(sRedHeaderFontColor)s !important; } \ .redhot_text, a.redhot_link { color: %(sRedContentFontColor)s; } \ /* hot search */\ .HitSearchText { color: %(sMainHeaderFontColor)s; } \ a.hitsearch_link { color: %(sMainFontColor)s; } \ /* annoucements, profilepage tabs */\ .DivBoxDetails, .DivResizableBoxDetails, .ProfileBoxDetails { border-color: %(sBlueSecBgColor)s; } \ *[style*="background-color: #CCDDEA"], *[style*="BACKGROUND-COLOR: #CCDDEA"], *[bgcolor="#ccddea"], .ajax__tab_tab, #advarea tr:first-child + tr td { background-color: %(sBlueSecBgColor)s !important; } \ [class^="p__tab_xp"] .ajax__tab_tab { color: %(sMainFontColor)s; } \ [class^="p__tab_xp"] .ajax__tab_active .ajax__tab_tab, [class^="p__tab_xp"] .ajax__tab_hover .ajax__tab_tab { color: %(sMainHoverColor)s; } \ /* hightlight bg */\ *[style*="233, 236, 108"], *[style*="#E9EC6C"] { background-color: %(sHighlightBgColor)s !important; } \ /* time text */\ *[style*="128, 0, 0"], *[style*="#800000"], *[style*="maroon"] { color: %(sTimeFontColor)s !important; } \ /* male name link */\ *[style*="0, 102, 255"], *[style*="#0066ff"], *[style*="#0066FF"], *[color="blue"] { color: %(sMaleFontColor)s !important; } \ /* female name link */\ *[style*="255, 0, 102"], *[style*="#ff0066"], *[style*="#FF0066"], *[color="red"] { color: %(sFemaleFontColor)s !important; } \ /* quotes */\ blockquote > div[style*="color"], blockquote > div[style*="COLOR"] { color: %(sQuoteFontColor)s !important; } \ /* profilepage avater */\ table[width="150"] { border-color: %(sSecBorderColor)s !important; } \ /* footer */\ .FooterPanel > div:first-child { background-color: %(sFooterBgColor)s !important; } \ a.terms_link { color: %(sMainFontColor)s; } \ /* repliers_left_user_details */\ .repliers_left_user_details { background-color: %(sSecBgColor)s; border-color: %(sMainBorderColor)s; color: %(sMainFontColor)s; } \ ', AN.util.getOptions() )); } } }}; AN.mod['User Interface'] = { ver: 'N/A', author: '\u5411\u65e5', fn: { '6464e397-dfea-477f-9706-025ec439e810': { desc: '\u8a2d\u5b9aUI\u6a23\u5f0f', page: { 65535: 'comp' }, type: 2, options: { sMenuFontSize: { desc: 'UI\u4e3b\u8981\u5b57\u9ad4\u5927\u5c0f(px)', defaultValue: '16', type: 'text' }, sSmallFontSize: { desc: 'UI\u7d30\u5b57\u9ad4\u5927\u5c0f(px)', defaultValue: '10', type: 'text' } }, once: function() { AN.util.stackStyle($.sprintf(' \ .an-box { display: none; position: fixed; left: 50%; top: 50%; z-index: 10; border-width: 1px; } \ .an-box-header { line-height: 1.8em; margin: 0; padding: 0 0 0 0.2em; } \ .an-box-content { overflow: auto; position: relative; } \ \ .an-menu { font-size: %(sMenuFontSize)spx; } \ .an-menu a { display: block; } \ .an-menu a:hover { color: %(sUIHoverColor)s; } \ \ .an-small { font-size: %(sSmallFontSize)spx; } \ \ #an-ui ul { margin: 0; padding: 0; list-style: none; } \ #an-ui a:focus { outline: 0; } \ \ .an-mod { position: fixed; color: %(sUIFontColor)s; } \ .an-mod, .an-mod * { border: 0 solid %(sUIFontColor)s; } \ .an-mod a { text-decoration: none; color: %(sUIFontColor)s; } \ \ #an-backlayer { display: none; opacity: 0; -ms-filter: "alpha(opacity=0)"; z-index: 5; position: fixed; left: 0; top: 0; width: 100%; height: 100%; background: gray; } \ \ #an-mainmenu { top: 15%; right: 0; } \ #an-mainmenu a { padding: 0.3em 0.35em 0 0; border-bottom-width: 1px; } \ ', AN.util.getOptions() )); } }, '1db9ccc8-ad28-48b6-8744-22f892ca0a44': { desc: '\u52a0\u5165\u57fa\u672c\u5143\u4ef6', page: { 65535: 'comp' }, type: 1, once: function() { $('#an').append(' \
    \
    \
      \
      \ ').click(function(event){ event.stopPropagation(); }); AN.shared.gray = function(bClickToQuit, uExtra) { var jGray = $('#an-backlayer'); if(jGray.is(':hidden')) { //$('html').css('overflow', 'hidden'); if(bClickToQuit) { jGray.one('click', function() { AN.shared.gray(); }); } jGray.show().fadeTo('slow', 0.7); if(uExtra) { var jExtra = $('#' + uExtra); var oWH = jExtra.data('an-oWH'); var nMaxHeight = $.winHeight(0.9); var nMaxWidth = $.winWidth(0.9); jExtra.width((oWH.w == 'max' || oWH.w > nMaxWidth) ? nMaxWidth : oWH.w).height((oWH.h == 'max' || oWH.h > nMaxHeight) ? nMaxHeight : oWH.h); var jBox = jExtra.up('.an-box'); jBox.css({ marginTop: -jBox.height() / 2, marginLeft: -jBox.width() / 2 }).fadeIn('slow'); } } else { jGray.add('.an-box:visible').fadeOut('slow'); //$('html').css('overflow', ''); } }; AN.shared.addMain = function(sName, fHandler) { $('
    • ' + sName + '
    • ').click(fHandler).appendTo('#an-mainmenu'); }; AN.shared.box = function(sId, sHeader, uWidth, uHeight) { return $($.sprintf('

      %s

      ', sHeader, sId)).appendTo('#an-ui').children('.an-box-content').data('an-oWH', { w: uWidth || 'auto', h: uHeight || 'auto' }); }; } }, '72907d8e-4735-4f66-b3c9-20e26197663d': { desc: '\u52a0\u5165\u5171\u7528\u5143\u4ef6', page: { 65535: 'comp' }, type: 1, once: function() { (function() { AN.shared.serverTable = function() { if(!$('#an-server').length) { AN.util.addStyle('\ #an-server div { padding: 0.5em; } \ #an-server caption { padding-top: 0.5em; text-align: center; caption-side: bottom; } \ #an-server caption a { display: inline-block; border-width: 1px; padding: 0.2em; } \ #an-server table { text-align: center; } \ #an-server td { font-size: 80%; } \ '); AN.shared.box('an-server', '\u4f3a\u670d\u5668\u72c0\u614b', 300).append('
      \u9032\u884c\u6e2c\u8a66
      \u4f3a\u670d\u5668\u56de\u61c9\u6642\u9593
      '); var sURL = location.search.indexOf('error') !== -1 ? $.sprintf('http://%s/topics.aspx?type=BW', location.hostname) : location.href.replace(/topics_(bw)(?:_[^.]+)?\.htm(\??)/i, function($0, $1, $2){ return 'topics.aspx?type=' + $1.toUpperCase() + ($2 ? '&' : ''); }); var tableHTML = '', imgHTML = ''; var subs = [['forum101', 'Forum 101'], ['search', 'Search']]; for(var i=15; i--;) { subs.unshift(['forum' + (i + 1), 'Forum ' + (i + 1)]); } for(var i=0; i%s', sURL.replace(/\w+(?=\.hkgolden)/i, subs[i][0]), subs[i][1]); imgHTML += ''; } var jTestImages = $('
      ' + imgHTML + '
      ').children().bind('load error', function(event) { var jImg = $(event.target); $('#an-server .an-server-response').eq(jImg.index()).html(event.type == 'load' ? $.sprintf('~%s ms', $.time() - jImg.data('nTime')) : '\u767c\u751f\u932f\u8aa4'); }); $('#an-server') .find('caption').click(function() { $('#an-server .an-server-response').html('\u7b49\u5f85\u56de\u61c9\u4e2d...'); jTestImages.each(function(i) { var nTime = $.time(); $(this).data('nTime', nTime).attr('src', $.sprintf('http://%s.hkgolden.com/images/index_images/p.gif?tId=%s', subs[i][0], nTime)); }); }) .end().find('tbody').html(tableHTML); } AN.shared.gray(true, 'an-server'); $('#an-server caption').trigger('click'); }; })(); (function() { var jHoverObjects, objectSets = [], recordOffset = function() { var data = $(this).data('hoverize'); data.fixScroll_difference = data.jTarget[data.fixScroll]() - $d.scrollTop(); }; $.fn.hoverize = function(selector, option) { if(!jHoverObjects) { AN.util.addStyle('\ #an-hoverobjects > * { display: none; position: absolute; } \ #an-hoverobjects > img, #an-hoverobjects > span { cursor: pointer; } \ '); jHoverObjects = $('
      ').appendTo('#an').bind({ click: function(event) { event.stopPropagation(); var jObject = $(event.target).closest('#an-hoverobjects > *'), data = jObject.data('hoverize'); if(!data) return; var jTarget = data.jTarget; if(data.fixScroll) $d.scrollTop(jTarget[data.fixScroll]() - data.fixScroll_difference); if(!data.autoToggle) return; data.jTarget = null; jObject.hide(); jTarget.mouseover(); jObject.mouseover(); }, 'mouseover mouseout entertarget leavetarget': function(event) { event.stopPropagation(); } }); $d.mouseover(function(event) { var jEnterTree = $(event.target).parentsUntil('#aspnetForm').andSelf(); $.each(objectSets, function(i, objectSet) { var jNewTarget = jEnterTree.filter(objectSet.selector).eq(-1), jObject = objectSet.jObject, data = jObject.data('hoverize'); if(data.filter) jNewTarget = jNewTarget.filter(data.filter); if(data.jTarget) { if(jNewTarget[0] && jNewTarget[0] === data.jTarget[0]) { return; } else { jObject.trigger('leavetarget'); data.jTarget = null; if(data.autoToggle) jObject.hide(); } } if(jNewTarget.length) { data.jTarget = jNewTarget; jObject.trigger('entertarget'); if(data.autoPosition) jObject.css(jNewTarget.offset()); if(data.autoToggle) jObject.show(); } }); }); } var jObject = this; if(selector === null) { $.each(objectSets, function(i) { if(this.jObject[0] === jObject[0]) { objectSets.splice(i, 1); return false; } }); } else { objectSets.push({ selector: selector, jObject: jObject }); this.data('hoverize', $.extend({ fixScroll: false, fixScroll_autoRecord: true, autoToggle: true, autoPosition: true, filter: null }, option)).appendTo(jHoverObjects); if(this.data('hoverize').fixScroll && this.data('hoverize').fixScroll_autoRecord) this.click(recordOffset); } return this; }; })(); (function() { var jUserButtons, recordOffset = function() { var data = jUserButtons.data('hoverize'); data.fixScroll_difference = data.jTarget.top() - $d.scrollTop(); }; $.userButton = function(src) { if(!jUserButtons) { AN.util.addStyle('\ #an-userbuttons > img:first-child { padding-top: 7px; } \ #an-userbuttons > img { display: block; padding: 3.5px 7px; cursor: pointer; } \ '); jUserButtons = $('
      ').hoverize('.repliers_left', { fixScroll: 'top', fixScroll_autoRecord: false }).bind({ entertarget: function() { jUserButtons.children().data('userButton', { jTarget: jUserButtons.data('hoverize').jTarget.parent() }).trigger('buttonshow'); }, buttonshow: function(event) { event.stopPropagation(); } }); } return $('', { src: src, click: recordOffset }).appendTo(jUserButtons); }; })(); } }, '95e203b9-8d9a-46ad-be53-f4297bad7285': { desc: '\u52a0\u5165\u9078\u9805\u5143\u4ef6', page: { 65534: 'comp' }, type: 1, once: function() { var tabClick, getInfo, saveOptions, fillOptions, fillBoolean, importSettings, exportSettings, bFillAll, jFieldsets, jTabLinks, jSwitches, jOptions; AN.shared.addMain('\u9078\u9805', function() { if(!$('#an-settings').length) { AN.shared.box('an-settings', '\u9078\u9805', 900, 'max').append('
              '); AN.util.addStyle(' \ #an-settings-tabs { float: left; height: 100%; border-right-width: 1px; } \ #an-settings-tabs a { display: block; line-height: 2em; text-align: center; border-bottom-width: 1px; padding: 0 0.5em; } \ #an-settings-tabs-extend li:first-child { margin-top: 2em; border-top-width: 1px; } \ \ #an-settings-main { position: relative; overflow: hidden; height: 100%; } \ \ #an-settings-main-panelswrapper { overflow: auto; position: absolute; top: 0; right: 0; bottom: 2em; left: 0; border-bottom-width: 1px; padding: 0; margin: 0; } \ #an-settings-main-panels { padding: 1em; } \ #an-settings-main-panels fieldset { display: none; margin: 0; padding: 0 0.5em 1em; border-width: 1px; } \ #an-settings-main-panels h4 { font-weight: normal; overflow: hidden; margin: 1em 0 0.5em; } \ #an-settings-main-panels h4 span { float: left; margin-right: 0.2em; } \ #an-settings-main-panels h4 hr { overflow: hidden; margin: 0.5em 0 0 0; border-top-width: 1px; } \ #an-settings-main-panels dl { margin: 0.35em 0 0.35em 5px; } \ #an-settings-main-panels dd { margin: 0.25em 0 0 20px; } \ \ #an-settings-main-controls { position: absolute; left: 0; right: 0; bottom: 0; line-height: 2em; } \ #an-settings-main-control-1 { float: left; } \ #an-settings-main-control-2 { float: right; } \ #an-settings-main-controls li { float: left; } \ #an-settings-main-control-last, #an-settings-main-controls a { padding: 0 1em; } \ #an-settings-main-control-1 li { border-right-width: 1px; } \ #an-settings-main-control-last, #an-settings-main-control-2 li { border-left-width: 1px; } \ '); var oTypeMap = AN.box.oTypeMap; var oPageMap = AN.box.oPageMap; var oStructure = {}; $.each(oTypeMap, function(sType) { oStructure[sType] = {}; $.each(oPageMap, function(sPage) { oStructure[sType][sPage] = {}; }); }); var sSep = '_-_'; $.each(AN.mod, function(sMod) { if(!this.fn) return; $.each(this.fn, function(sId, oFn) { $.each(oFn.page, function(sPage, uDefault) { if(!oStructure[oFn.type][sPage]) oStructure[oFn.type][sPage] = {}; oStructure[oFn.type][sPage][sMod + sSep + sId] = { desc: oFn.desc, options: oFn.options, comp: (uDefault == 'comp'), disabled: (uDefault == 'disabled') }; }); }); }); var sHTML = ''; $.each(oStructure, function(sType) { var jContainer = (isNaN(sType) || sType > 6) ? $('#an-settings-tabs-extend') : $('#an-settings-tabs-main'); jContainer.append($.sprintf('
            • %s
            • ', sType, oTypeMap[sType])); sHTML += $.sprintf('
              %s', sType, oTypeMap[sType]); $.each(this, function(sPage) { if($.isEmpty(this)) return; var aGroup = []; if(sPage in oPageMap) aGroup.push(oPageMap[sPage].desc); else $.each(oPageMap, function(s) { if(s < 65534 && s & sPage) aGroup.push(this.desc); }); sHTML += $.sprintf('

              %s

              ', aGroup.join('\u3001')); $.each(this, function(sMixed) { sHTML += '
              '; var bDisabled = this.disabled; var sSwitchId = $.sprintf('an-settings-switch-%s%s%s', sPage, sSep, sMixed); var sChecked = this.comp ? 'checked="checked"' : ''; var sSavable = (this.comp || bDisabled) ? 'disabled="disabled"' : 'class="an-settings-switch"'; sHTML += $.sprintf('', sSwitchId, sChecked, sSavable); sHTML += $.sprintf('
              ', sSwitchId, this.desc); if(this.options) { $.each(this.options, function(sName) { sHTML += '
              '; var sOptionId = $.sprintf('an-settings-option-%s%s%s', sPage, sSep, sName); var sSavable = bDisabled ? 'disabled="disabled"' : 'class="an-settings-option"'; if(this.type == 'checkbox') { sHTML += $.sprintf('', sOptionId, sSavable, sOptionId, this.desc); } else if(this.type == 'text') { sHTML += $.sprintf('', sOptionId, this.desc, sOptionId, sSavable); } else if(this.type == 'select') { sHTML += $.sprintf('%s: '; } sHTML += '
              '; }); } sHTML += '
              '; }); }); sHTML += '
              '; }); $('#an-settings-main-panels').append(sHTML); sHTML = null; /* special settings start */ $('#an-settings-tabs-extend').append('
            • \u7279\u6b8a\u8a2d\u5b9a
            • '); AN.util.addStyle('\ #an-settings-panel-special span { font-size: 80%; } \ #an-settings-panel-special a { font-size: 80%; text-decoration: underline } \ #an-settings-special-config { width: 95%; height: 200px; font-size: 80%; } \ '); $('\
              \ \u7279\u6b8a\u8a2d\u5b9a \

              \u8a2d\u5b9a\u8cc7\u6599

              \
              \
              \ \u5132\u5b58\u4ee5\u4e0a\u8cc7\u6599\u81f3\u6a94\u6848(\u53e6\u5b58\u4e0b\u8f09) \ \u5f9e\u672c\u5730\u6a94\u6848\u8b80\u53d6... \
              \
              \ ') .on('mousedown', '#an-settings-special-tofile', function(event) { var URL = window.URL || window.webkitURL; var bb = window.BlobBuilder || window.WebKitBlobBuilder; var data = $('#an-settings-special-config').val(); if(URL && bb) { bb = new bb(); bb.append(data); event.target.href = URL.createObjectURL(bb.getBlob('text/plain')); } else { event.target.href = 'data:text/plain;base64,' + window.btoa(unescape(encodeURIComponent(data))); } }) .on('click', '#an-settings-special-fromfile', function(event) { $('').one('change', function(event) { if(this.files && window.FileReader) { var reader = new FileReader(); reader.onload = function() { $('#an-settings-special-config').val(reader.result); }; reader.onerror = function(config) { alert('\u8b80\u53d6\u8a2d\u5b9a\u8cc7\u6599\u6642\u767c\u751f\u932f\u8aa4!'); }; reader.readAsText(this.files[0]); } else { alert('\u4f60\u7684\u700f\u89bd\u5668\u4e0d\u652f\u6301\u6b64\u529f\u80fd!'); } }).click(); }) .appendTo('#an-settings-main-panels') .trigger('an-settings-special'); /* special settings end */ jFieldsets = $('#an-settings-main-panels fieldset'); // jQuery bug? $('#an-settings-main-panels > fieldset') got nth jTabLinks = $('#an-settings-tabs a'); jSwitches = $('.an-settings-switch'); jOptions = $('.an-settings-option'); // remove empty tab jFieldsets.each(function() { var jThis = $(this); if(!jThis.find('h4').length) { $($.sprintf('[data-panel=%s]', jThis.attr('id'))).parent().add(jThis).remove(); } }); // add tab click tabClick = function() { jTabLinks.css('text-decoration', ''); $(this).css('text-decoration', 'underline'); jFieldsets.hide(); $('#' + $(this).attr('data-panel')).show().parent().parent().scrollTop(0); }; jTabLinks.click(tabClick); // add switch click jSwitches.click(function() { var jThis = $(this); jThis.parent().parent().find('.an-settings-option').attr('disabled', !jThis.is(':checked')); }); getInfo = function(jTarget) { var oInfo = jTarget.data('info'); if(!oInfo) { var aInfo; if(jTarget.hasClass('an-settings-switch')) { aInfo = jTarget.attr('id').replace(/an-settings-switch-/, '').split(sSep); oInfo = { page: aInfo[0] * 1, mod: aInfo[1], id: aInfo[2] }; } else { aInfo = jTarget.attr('id').replace(/an-settings-option-/, '').split(sSep); oInfo = { page: aInfo[0] * 1, name: aInfo[1], type: jTarget[0].nodeName == 'SELECT' ? 'select' : jTarget.attr('type') }; } jTarget.data('info', oInfo); } return oInfo; }; saveOptions = function() { var oSwitches = {}; jSwitches.each(function() { var jThis = $(this); var oInfo = getInfo(jThis); $.make('a', $.make('o', oSwitches, oInfo.mod), oInfo.id); if(jThis.is(':checked')) oSwitches[oInfo.mod][oInfo.id].push(oInfo.page); }); AN.util.storage('an_switches', oSwitches); var oOptions = {}; var bHasQuote = false; jOptions.each(function() { var jThis = $(this); var oInfo = getInfo(jThis); $.make('o', oOptions, oInfo.name); if(oInfo.type == 'checkbox') { oOptions[oInfo.name][oInfo.page] = jThis.is(':checked'); } else if(oInfo.type == 'text' || oInfo.type == 'select') { if(!bHasQuote && oInfo.type == 'text' && jThis.val().match(/\'|\"/)) bHasQuote = true; oOptions[oInfo.name][oInfo.page] = $.correct(jThis.val()); } }); if(bHasQuote && !confirm('\u767c\u73fe\u6587\u5b57\u8a2d\u5b9a\u4e2d\u542b\u6709\u5f15\u865f!\n\u82e5\u8a72\u8a2d\u5b9a\u5c6c\u65bcCSS\u76f8\u95dc\u9805\u76ee(\u5982\u984f\u8272\u8a2d\u5b9a), \u5247\u6709\u53ef\u80fd\u5c0e\u81f4\u7248\u9762\u932f\u8aa4!\n\n\u78ba\u5b9a\u9032\u884c\u5132\u5b58?')) return false; AN.util.storage('an_options', oOptions); return true; }; fillOptions = AN.shared.fillOptions = function(bFillAll, bUseDefault) { var jScope = (bFillAll) ? $('#an-settings-main-panels') : jFieldsets.filter(':visible'); var oDB = AN.modFn.getDB(bUseDefault); jScope.find('.an-settings-switch').each(function() { var jThis = $(this); var oInfo = getInfo(jThis); var bOn = ($.inArray(oInfo.page, oDB.oSwitches[oInfo.mod][oInfo.id]) != -1); jThis.attr('checked', bOn).parent().parent().find('.an-settings-option').attr('disabled', !bOn); }); jScope.find('.an-settings-option').each(function() { var jThis = $(this); var oInfo = getInfo(jThis); var uValue = oDB.oOptions[oInfo.name][oInfo.page]; if(oInfo.type == 'checkbox') { jThis.attr('checked', uValue); } else if(oInfo.type == 'text' || oInfo.type == 'select') { jThis.val(uValue); } }); }; fillBoolean = function(bSwitchOn) { var jScope = (bFillAll) ? $('#an-settings-main-panels') : jFieldsets.filter(':visible'); jScope.find('.an-settings-switch').attr('checked', bSwitchOn); jScope.find('.an-settings-option').attr('disabled', !bSwitchOn); }; importSettings = function() { try { var oSettings = prompt('\u8acb\u8f38\u5165\u8a2d\u5b9a\u8cc7\u6599', ''); if(!oSettings) { return; } oSettings = JSON.parse(oSettings); } catch(e) { return alert('\u8a2d\u5b9a\u8cc7\u6599\u5256\u6790\u932f\u8aa4!'); } var jScope = (bFillAll) ? $('#an-settings-main-panels') : jFieldsets.filter(':visible'); if(oSettings.oSwitches) { jScope.find('.an-settings-switch').each(function() { var jThis = $(this); var oInfo = getInfo(jThis); if(oSettings.oSwitches[oInfo.mod] && oSettings.oSwitches[oInfo.mod][oInfo.id]) { var bOn = ($.inArray(oInfo.page, oSettings.oSwitches[oInfo.mod][oInfo.id]) != -1); jThis.attr('checked', bOn).parent().parent().find('.an-settings-option').attr('disabled', !bOn); } }); } if(oSettings.oOptions) { jScope.find('.an-settings-option').each(function() { var jThis = $(this); var oInfo = getInfo(jThis); if(oSettings.oOptions[oInfo.name] && oInfo.page in oSettings.oOptions[oInfo.name]) { var uValue = oSettings.oOptions[oInfo.name][oInfo.page]; if(oInfo.type == 'checkbox') { jThis.attr('checked', uValue); } else if(oInfo.type == 'text' || oInfo.type == 'select') { jThis.val(uValue); } } }); } alert('\u6ed9\u5165\u6210\u529f!'); }; exportSettings = function() { var jScope = (bFillAll) ? $('#an-settings-main-panels') : jFieldsets.filter(':visible'); var oExport = { oSwitches: {}, oOptions: {} }; jScope.find('.an-settings-switch').each(function() { var jThis = $(this); var oInfo = getInfo(jThis); var oFn = $.make('a', $.make('o', oExport.oSwitches, oInfo.mod), oInfo.id); if(jThis.is(':checked')) oFn.push(oInfo.page); }); jScope.find('.an-settings-option').each(function() { var jThis = $(this); var oInfo = getInfo(jThis); var oFn = $.make('o', oExport.oOptions, oInfo.name); if(oInfo.type == 'checkbox') { oFn[oInfo.page] = jThis.is(':checked'); } else if(oInfo.type == 'text' || oInfo.type == 'select') { oFn[oInfo.page] = $.correct(jThis.val()); } }); $('#an-settings-special-config').val(JSON.stringify(oExport) || ''); $('#an-settings-tab-sepcial').click(); alert('\u6ed9\u51fa\u6210\u529f! \u8acb\u8907\u88fd\u8a2d\u5b9a\u8cc7\u6599'); }; $.each( { '\u78ba\u5b9a': function() { if(saveOptions()) location.reload(); }, '\u53d6\u6d88': AN.shared.gray, '\u5957\u7528': function() { saveOptions(); AN.box.oSwitches = null; AN.box.oOptions = null; AN.modFn.getDB(); } }, function(sDesc, fControl) { $($.sprintf('
            • %s
            • ', sDesc)).click(fControl).appendTo('#an-settings-main-control-1'); }); $.each( { '\u5fa9\u539f': function() { fillOptions(bFillAll, false); }, '\u5168\u9078': function() { fillBoolean(true); }, '\u5168\u5426': function() { fillBoolean(false); }, '\u91cd\u8a2d': function() { fillOptions(bFillAll, true); }, '\u6ed9\u5165': function() { importSettings(); }, '\u6ed9\u51fa': function() { exportSettings(); } }, function(sDesc, fControl) { $($.sprintf('
            • %s
            • ', sDesc)).click(fControl).appendTo('#an-settings-main-control-2'); }); $('
            • ') .prepend($('').click(function() { bFillAll = !$(this).is(':checked'); })) .appendTo('#an-settings-main-control-2'); } fillOptions(true, false); //$('#an-settings-tabs a:first').click(); // FF3 throws error tabClick.call($('#an-settings-tabs a:first')[0]); AN.shared.gray(false, 'an-settings'); }); } }, '71c9bd88-dc3b-4a97-b04c-20052dcfcdcb': { desc: '\u52a0\u5165\u8a55\u6e2c\u5143\u4ef6', page: { 65534: true }, type: 1, once: function() { AN.shared.addMain('\u8a55\u6e2c', function() { if(!$('#an-benchmark').length) { AN.util.addStyle(' \ #an-benchmark div { padding: 0.5em; } \ '); AN.shared.box('an-benchmark', '\u8a55\u6e2c', 550, 500).append('
              #\u529f\u80fd\u57f7\u884c\u6642\u9593
              '); } var uCount, sName, sTime; var nCount, nSum, nTotal; nCount = nSum = nTotal = 0; var aBg = [AN.util.getOptions('sMainBgColor'), AN.util.getOptions('sSecBgColor')]; var sHTML = ''; $.each(AN.box.aBenchmark, function(i) { switch(this.type) { case 'start': uCount = 'N/A'; sName = $.sprintf('--- %s \u958b\u59cb ---', this.name); sTime = 'N/A'; break; case 'fn': uCount = ++nCount; sName = this.name; sTime = (this.time || '\u03b5') + ' ms'; nSum += this.time; nTotal += this.time; break; case 'end': uCount = 'N/A'; sName = $.sprintf('--- %s \u7d50\u675f ---', this.name); sTime = nSum + ' ms'; break; case 'final': sHTML += $.sprintf('N/A+++ \u7e3d\u548c +++%s ms', nTotal); nTotal = 0; uCount = 'N/A'; sName = '~~~ \u56de\u5408\u7d50\u675f ~~~'; sTime = this.time + ' ms'; break; } sHTML += $.sprintf('%s%s%s', aBg[i % 2], uCount, sName, sTime); if(this.type == 'end') nSum = 0; }); $('#an-benchmark tbody').append(sHTML); AN.box.aBenchmark = []; AN.shared.gray(true, 'an-benchmark'); }); } }, '0868eb64-9631-42dd-8b5c-02f11a8c9a48': { desc: '\u52a0\u5165\u8a18\u9304\u5143\u4ef6 [\u53f3\u4e0b]', page: { 65534: true }, type: 1, options: { bAddLogButton: { desc: '\u52a0\u5165\u8a18\u9304\u5143\u4ef6\u958b\u95dc\u6309\u626d', defaultValue: false, type: 'checkbox' }, bAutoShowLog: { desc: '\u81ea\u52d5\u986f\u793a\u8a18\u9304\u8996\u7a97', defaultValue: true, type: 'checkbox' }, bShowDetailLog: { desc: '\u986f\u793a\u8a73\u76e1\u8a18\u9304', defaultValue: false, type: 'checkbox' }, sLogWidth: { desc: '\u5143\u4ef6\u95ca\u5ea6 [\u53ef\u8a2d\u5b9a\u70ba20em, 15%, 200px\u7b49]', defaultValue: '200px', type: 'text' } }, once: function() { var getMod = function() { var jMod = $('#an-log'); if(jMod.length) return jMod; AN.util.addStyle($.sprintf('\ #an-log { display: none; height: 30%; width: %s; bottom: 0; right: 0; } \ #an-log-header { font-weight: bold; border-bottom-width: 1px; padding-bottom: 0.2em; } \ #an-log-content li { display: none; border-bottom: 1px dotted; padding: 0.3em 0; } \ ', AN.util.getOptions('sLogWidth') )); return $('
              Log
                ').appendTo('#an-ui'); }; if(AN.util.getOptions('bAddLogButton')) { AN.shared.addMain('\u8a18\u9304', function() { getMod().fadeToggle(); }); } AN.shared.log = function(sLog) { var jLog = getMod(); if($.isRubbish(sLog)) return; if(AN.util.getOptions('bAutoShowLog')) jLog.fadeIn('fast'); var dDate = new Date(); var hour = dDate.getHours(); if(hour < 10) hour = '0' + hour; var min = dDate.getMinutes(); if(min < 10) min = '0' + min; var jLogContainer = $('#an-log-content'); $($.sprintf('
              • %s:%s %s
              • ', hour, min, sLog)).prependTo(jLogContainer).slideDown('slow'); jLogContainer.children(':gt(50)').remove(); }; if(AN.util.getOptions('bShowDetailLog')) AN.shared.log2 = AN.shared.log; if(AN.box.debugMode) AN.shared.debug = AN.shared.log; $.ajaxSetup( { error: function(xhr, sStatus, err) { AN.shared.log($.sprintf('\u8b80\u53d6\u76ee\u6a19\u6642\u767c\u751f\u932f\u8aa4: %s %s', xhr.status, xhr.statusText)); } }); } }, 'e9051bb8-2613-4f10-82ec-69290831c6a5': { desc: '\u52a0\u5165\u6309\u626d\u5143\u4ef6 [\u5de6\u4e0a]', page: { 65534: true }, type: 1, options: { bAddButtonsButton: { desc: '\u52a0\u5165\u6309\u626d\u5143\u4ef6\u958b\u95dc\u6309\u626d', defaultValue: false, type: 'checkbox' }, bAutoShowButtons: { desc: '\u81ea\u52d5\u986f\u793a\u6309\u626d\u5143\u4ef6', defaultValue: true, type: 'checkbox' } }, once: function() { var getMod = function() { var jMod = $('#an-buttons'); if(jMod.length) return jMod; AN.util.addStyle($.sprintf(' \ #an-buttons { %s left: 5px; top: 30px; border-left: 5px solid; padding-left: 0.3em; } \ #an-buttons a { padding: 0.15em 0; } \ ', AN.util.getOptions('bAutoShowButtons') ? '' : 'display: none;')); return $('
                  ').appendTo('#an-ui'); }; if(AN.util.getOptions('bAddButtonsButton')) { AN.shared.addMain('\u6309\u626d', function() { getMod().fadeToggle(); }); } AN.shared.addButton = function(sDesc, uExtra) { var jButtons = getMod(); if(!sDesc) return; jButtons.find('ul').append( typeof uExtra === 'string' ? $.sprintf('
                • %s
                • ', uExtra, sDesc) : $('
                • ' + sDesc + '
                • ').click(uExtra) ); }; } }, '437dc7da-fdfa-429a-aec5-329c80222327': { desc: '\u52a0\u5165\u9023\u7d50\u5143\u4ef6 [\u5de6\u4e2d]', page: { 65534: true }, type: 1, options: { bAddLinksButton: { desc: '\u52a0\u5165\u9023\u7d50\u5143\u4ef6\u958b\u95dc\u6309\u626d', defaultValue: false, type: 'checkbox' }, bAutoShowLinks: { desc: '\u81ea\u52d5\u986f\u793a\u9023\u7d50\u5143\u4ef6', defaultValue: true, type: 'checkbox' } }, once: function(jDoc) { var getMod = function() { var jMod = $('#an-links'); if(jMod.length) return jMod; AN.util.addStyle($.sprintf(' \ #an-links { %s top: 50%; left: 0; text-align: right; } \ #an-links a { padding: 0.3em 0.1em 0.2em 1.5em; } \ #an-links-top li { border-bottom-width: 1px; } \ #an-links-middle li { border-width: 1px 0; } \ #an-links-bottom li { border-top-width: 1px; } \ ', AN.util.getOptions('bAutoShowLinks') ? '' : 'display: none;')); jMod = $('').appendTo('#an-ui'); jDoc.defer(1, '\u8abf\u6574\u9023\u7d50\u5143\u4ef6\u4f4d\u7f6e', function() // after all links are added { jMod.css('margin-top', - jMod.height() / 2); }); return jMod; }; if(AN.util.getOptions('bAddLinksButton')) { AN.shared.addMain('\u9023\u7d50', function() { getMod().fadeToggle(); }); } AN.shared.addLink = function(sDec, uExtra, nPos) { if(nPos === undefined) nPos = 1; var jLinks = getMod(); if(!sDec) return; jLinks.children().eq(nPos)[nPos == 2 ? 'append' : 'prepend']( (typeof uExtra == 'string') ? $.sprintf('
                • %s
                • ', uExtra, sDec) : $('
                • ' + sDec + '
                • ').click(uExtra) ); }; } }, '1c6e8869-8148-4e58-b440-31e1bee4aef1': { desc: '\u52a0\u5165\u8cc7\u8a0a\u5143\u4ef6 [\u5de6\u4e0b]', page: { 65534: true }, type: 1, options: { bAddInfoButton: { desc: '\u52a0\u5165\u8cc7\u8a0a\u5143\u4ef6\u958b\u95dc\u6309\u626d', defaultValue: false, type: 'checkbox' }, bAutoShowInfo: { desc: '\u81ea\u52d5\u986f\u793a\u8cc7\u8a0a\u8996\u7a97', defaultValue: true, type: 'checkbox' } }, once: function(jDoc) { var getMod = function() { var jMod = $('#an-info'); if(jMod.length) return jMod; AN.util.addStyle($.sprintf(' \ #an-info { %s; left: 10px; bottom: 10px; border-width: 0 0 1px 1px; } \ #an-info-content { padding: 1em 1em 0 0.5em !important; } \ #an-info-footer { text-align: right; font-weight: bold; } \ #an-info li { display: none; padding-bottom: 0.5em; } \ #an-info li a { display: inline; } \ ', AN.util.getOptions('bAutoShowInfo') ? '' : 'display: none' )); return $('
                    ').appendTo('#an-ui'); }; (function() { function check(){ return $('#hkg_bottombar').length && AN.util.addStyle('#an-info { bottom: 30px !important; }') && true; } // jQuery onload event sometimes does not fire on chrome? !check() && window.addEventListener ? window.addEventListener('load', check, false) : window.attachEvent('onload', check); })(); if(AN.util.getOptions('bAddInfoButton')) { AN.shared.addMain('\u8cc7\u8a0a', function() { getMod().fadeToggle(); }); } AN.shared.addInfo = function(sInfo) { getMod(); if(sInfo) return $('
                  • ' + sInfo + '
                  • ').appendTo('#an-info-content').fadeIn('slow'); }; } }, '56ecac51-0257-4d34-897d-6331247b017d': { desc: '\u52a0\u5165\u95dc\u65bc\u5143\u4ef6', page: { 65534: 'comp' }, type: 1, once: function() { AN.shared.addMain('\u95dc\u65bc', function() { if(!$('#an-about').length) { AN.util.addStyle('\ #an-about > div { margin: 0.5em; } \ #an-about h1 { margin: 0.5em; font-size: 2em; text-align: center; } \ #an-about hr { border-width: 1px; margin: 1em 0.5em; } \ #an-about div div { overflow-y: auto; overflow-x: hidden; width: 80%; height: 200px; margin: 0 auto; border-width: 1px; } \ #an-about dl { margin: 0; padding: 0 0.5em 0.5em; font-size: 0.8em; } \ #an-about dt { margin-top: 1em; } \ #an-about dd { margin: 0; line-height: 1.3; } \ #an-about p { margin: 1em 0; font-size: 0.75em; text-align: center; } \ '); var jAbout = AN.shared.box('an-about', '\u95dc\u65bc', 500, 'auto').append('

                    Helianthus.annuus


                    © 2009 \u5411\u65e5 Licenced under GNU General Public License v3

                    '); var sHTML = ''; sHTML += '
                    [\u7a0b\u5f0f]
                    '; $.each({ '\u540d\u7a31': 'Helianthus.annuus', '\u4f5c\u8005': '\u5411\u65e5', '\u4e3b\u9801': 'https://github.com/helianthus/Helianthus.annuus', '\u7248\u672c': AN.version, '\u9664\u932f\u6a21\u5f0f': AN.box.debugMode ? '\u555f\u7528' : '\u505c\u7528' }, function(sName, sValue) { sHTML += $.sprintf('
                    %s: %s
                    ', sName, sValue); }); sHTML += '
                    [Credits]
                    '; $.each([ { name: 'jQuery', author: 'John Resig', url: 'http://jquery.com', license: 'Dual licensed under the MIT or GPL Version 2 licenses', licenseUrl: 'http://docs.jquery.com/License' }, { name: 'json2.js', author: 'Douglas Crockford', url: 'http://www.json.org/js.html', license: 'Public Domain', licenseUrl: '#' }, { name: 'jquery.sprintf', author: 'Sabin Iacob', url: 'http://plugins.jquery.com/project/printf', license: 'GPL Version 3', licenseUrl: 'http://www.gnu.org/licenses/gpl.html' }, { name: 'jQuery doTimeout', author: 'Ben Alman', url: 'http://benalman.com/projects/jquery-dotimeout-plugin/', license: 'Dual licensed under the MIT and GPL licenses', licenseUrl: 'http://benalman.com/about/license/' }, { name: 'Red Flower Icon [Icons by: FastIcon.com]', author: 'Fast Icon', url: 'http://www.iconarchive.com/show/nature-icons-by-fasticon/Red-Flower-icon.html', license: 'Fast Icon Commercial License', licenseUrl: 'http://www.fasticon.com/commercial_license.html' }, { name: 'Fugue Icons', author: 'Yusuke Kamiyamane', url: 'http://www.pinvoke.com/', license: 'Creative Commons Attribution 3.0 license', licenseUrl: 'http://creativecommons.org/licenses/by/3.0/' }, { name: 'Still Life', author: 'Julian Turner ', url: 'http://art.gnome.org/themes/icon/1111', license: 'Creative Commons (Attribution-Share Alike 2.0 Generic)', licenseUrl: 'http://creativecommons.org/licenses/by-sa/2.0/' }], function() { sHTML += $.sprintf('
                    %(name)s
                    by %(author)s
                    %(url)s
                    License: %(license)s
                    ', this); }); jAbout.find('dl').append(sHTML); } AN.shared.gray(true, 'an-about'); }); } }, '629944a0-a4f2-493c-8c8d-e1261a9264f9': { desc: '\u9f20\u6a19\u9060\u96e2UI\u5143\u4ef6\u6642\u534a\u900f\u660e [buggy on IE8]', page: { 65534: false }, type: 1, options: { nUIOpacity: { desc: '\u900f\u660e\u5ea6 (10 = \u79fb\u9664\u534a\u900f\u660e)', type: 'select', defaultValue: 3, choices: [10,9,8,7,6,5,4,3,2,1,0] } }, once: function() { AN.util.stackStyle($.sprintf('\ .an-mod { opacity: %s; -ms-filter: alpha(opacity=%s); } \ .an-mod:hover { opacity: 1; -ms-filter: alpha(opacity=100); } \ ', AN.util.getOptions('nUIOpacity') / 10, AN.util.getOptions('nUIOpacity') * 10 )); } }, '0b587724-a3a7-41be-95d8-96c726d38343': { desc: '\u9664\u932f\u6a21\u5f0f(\u7e8c)', page: { 65535: 'comp' }, type: 1, once: function() { if(!AN.box.debugMode) return; AN.shared('log'); //AN.shared('addInfo'); AN.shared('addLink'); AN.shared('addButton', '\u79fb\u9664\u5132\u5b58\u8cc7\u6599', function() { if(confirm('\u78ba\u5b9a\u79fb\u9664\u5132\u5b58\u8cc7\u6599?')) { AN.util.storage(null); location.reload(); } }); AN.shared('addButton', '\u986f\u793a\u5132\u5b58\u8cc7\u6599', function() { if(!$('#an-savedsettings').length) { AN.shared('box', 'an-savedsettings', '\u5132\u5b58\u8cc7\u6599', null, 'max'); AN.util.addStyle('#an-savedsettings { padding: 0 2em; } #an-savedsettings code { display: block; white-space: pre; margin: 1em 0; font-family: Consolas; }'); $('#an-savedsettings').append(''); } $('#an-savedsettings code').text(AN.util.storage().replace(/{[^{]*},?/g, function(sMatch){ return sMatch.replace(/,/g, ',\n'); })); AN.shared('gray', true, 'an-savedsettings'); }); AN.shared('addButton', '\u986f\u793a\u529f\u80fd\u5217\u8868', function() { if(!$('#an-functionlist').length) { AN.shared('box', 'an-functionlist', '\u529f\u80fd\u5217\u8868', 600, 400); AN.util.addStyle('#an-functionlist textarea { margin: 10px; width: 570px; height: 370px; font-family: Consolas; }'); $('#an-functionlist').append(''); var sList = ''; $.each(AN.mod, function(sMod) { if(!this.fn) return; sList += '\r' + sMod + ':\r\r'; $.each(this.fn, function() { sList += ' * ' + this.desc + '\r'; }); }); $('#an-functionlist textarea').text(sList); } AN.shared('gray', true, 'an-functionlist'); }); } } }}; //////////////////// START OF - [jQuery Extension] //////////////////// $.extend( { time: function(nStart) { return nStart ? $.time() - nStart : +new Date; }, correct: function(sTarget) { if(sTarget == 'true') { return true; } else if(sTarget == 'false') { return false; } else if(!isNaN(sTarget) && sTarget !== '') { return sTarget * 1; } else { return sTarget; } }, doc: function(sHTML) { var eDiv = document.createElement('div'); eDiv.innerHTML = sHTML; return $(eDiv); }, getDoc: function(sURL, success) { var s = { url: sURL, dataType: 'text', success: function(sHTML) { var jNewDoc = $.doc(sHTML); jNewDoc.pageCode() & 65534 ? success.call(s, jNewDoc) : s.error(); }, error: function() { AN.shared('log', '\u9801\u9762\u8b80\u53d6\u5931\u6557, 5\u79d2\u5f8c\u91cd\u65b0\u8b80\u53d6...'); setTimeout(function(){ $.getDoc(sURL, success); }, 5000); } }; $.ajax(s); }, getLength: function(uTarget) { if('length' in uTarget) return uTarget.length; for(var nCount in uTarget){} return nCount; }, make: function(sType, uTarget) { $.each(arguments, function(i, sName) { if(i < 2) return; if(!uTarget[sName]) uTarget[sName] = (sType == 'o' ? {} : []); uTarget = uTarget[sName]; }); return uTarget; }, isEmpty: function(uTarget) { if('length' in uTarget) return uTarget.length; for(var i in uTarget){ return false; } return true; }, isRubbish: function(uTarget) { return (uTarget === undefined || uTarget === null || uTarget === NaN); }, winWidth: function(nMutiply) { return Math.round($w.width() * (nMutiply || 1)); }, winHeight: function(nMutiply) { return Math.round($w.height() * (nMutiply || 1)); } }); $.fn.extend( { toFlash: function(sURL, oAttrs, oParams) { if(!oAttrs) oAttrs = {}; if(!oAttrs.id) oAttrs.id = this[0].id || 'an-flash-' + $.time(); // IE: must have an id in order to allow JS access if(!oAttrs.width) oAttrs.width = 0; if(!oAttrs.height) oAttrs.height = 0; if(!oParams) oParams = {}; if(!oParams.allowscriptaccess) oParams.allowscriptaccess = 'always'; if($.browser.msie) { oAttrs.classid = 'clsid:D27CDB6E-AE6D-11cf-96B8-444553540000'; oParams.movie = sURL; } else { oAttrs.data = sURL; oAttrs.type = 'application/x-shockwave-flash'; } var sAttrs = ''; var sParams = ''; $.each(oAttrs, function(sName, sValue) { sAttrs += $.sprintf('%s="%s" ', sName, sValue); }); $.each(oParams, function(sName, sValue) { sParams += $.sprintf('', sName, sValue); }); var sHTML = $.sprintf('%s', sAttrs, sParams); if($.browser.msie) // IE: element must be created in this way in order to allow JS access { this[0].outerHTML = sHTML; } else { this.replaceWith(sHTML); } return $('#' + oAttrs.id); }, fn: function(fToExec) { if(this.length) fToExec.call(this); return this; }, outer: function() { if(!this[0]) return null; return this[0].outerHTML ? this[0].outerHTML : $('
                    ').append(this.eq(0).clone()).html(); }, aO: function() { alert(this.outer()); return this; }, aL: function() { alert(this.length); return this; }, fadeToggle: function(sSpeed) { if(!sSpeed) sSpeed = 'normal'; return this.is(':hidden') ? this.fadeIn(sSpeed) : this.fadeOut(sSpeed); }, up: function(sSelector, nTh) { if(!nTh) nTh = 1; return this.map(function() { var nCount = 0; var eCur = this; while(eCur && eCur.ownerDocument) { eCur = eCur.parentNode; if($(eCur).is(sSelector) && ++nCount >= nTh) return eCur; } }); }, own: function(target) { return this.is(target) || !!this.has(target).length; }, top: function() { return this.offset().top; }, right: function() { return this.offset().left + this.innerWidth(); }, bottom: function() { return this.offset().top + this.innerHeight(); }, left: function() { return this.offset().left; }, //--------[AN Related]--------// pageName: function() { if(this.sPageName) return this.sPageName; return this.sPageName = $('#ctl00_ContentPlaceHolder1_SystemMessageBoard', this).length && 'message' || $('#aspnetForm', this).length && $('#aspnetForm', this).attr('action').match(/[a-z0-9_]+(?=\.aspx)/i)[0].toLowerCase().replace(/_html$/, '') || $('body > :first', this).is('b') && 'terms' || $('#mytt', this).length && 'gogogame' || $('form[action*=".aspx"]', this).length && 'unknown'|| 'error'; }, pageCode: function() { if('nPageCode' in this) return this.nPageCode; var sPageName = this.pageName(); var nPageCode; $.each(AN.box.oPageMap, function(sPage) { if(this.action && (typeof this.action === 'string' ? this.action === sPageName : this.action.test(sPageName))) { nPageCode = sPage * 1; return false; } }); if(!nPageCode) nPageCode = 0; return (this.nPageCode = nPageCode); }, pageScope: function() { var jScope = this.closest('div'); return jScope.length ? jScope : this; }, pageNo: function() { return this.pageScope().find('select[name=page]:first').val() * 1; }, replies: function(sSelector) { if(this.jReplies) return this.jReplies; var jContents = $(); var jNameLinks = $(); var jReplies = this.jReplies = this.find('.repliers') .filter(function() { var jThis = $(this), jTr = jThis.find('.repliers_left').parent(); jThis.data({ jContent: jTr.find('.repliers_right td:first'), jNameLink: jTr.find('a[href]:first'), sUserid: jTr.attr('userid'), sUserName: jTr.attr('username') }); if(jThis.data('sUserid')) { jContents.push(jThis.data('jContent')[0]); jNameLinks.push(jThis.data('jNameLink')[0]); return true; } }) .extend({ jContents: jContents, jNameLinks: jNameLinks }); return sSelector ? jReplies.filter(sSelector) : jReplies; }, treeTop: function() { return (this[0] === document || $(document.documentElement).own(this)) ? $d : this; }, topicTable: function() { if(this.jTopicTable) return this.jTopicTable; var jThis = this; this.treeTop().find('td,th').filter(function(){ return $(this).children().length === 0; }).each(function() { if(/\s*\u56de\u8986/.test($(this).html())) { jThis.jTopicTable = $(this).up('table'); return false; } }); return this.jTopicTable; }, topics: function(sSelector) { if(this.jTopics) return this.jTopics; var topicTable = this.topicTable(); if(!topicTable) return; var jTopics = this.jTopics = topicTable.find('tr').filter(function(){ return !!$(this).children().children('a').length; }); jTopics .extend( { jNameLinks: $([]), jTitleCells: $([]), jTbody: this.topicTable().children() }) .each(function() { var jThis = $(this), jLinks = jThis.find('a'); jThis .data('jNameLink', jLinks.filter(':last')) .data('jTitleCell', jLinks.eq(0).parent()) .data('sTitle', jLinks.eq(0).html()) .data('sTopicid', jLinks.eq(0).attr('href').replace(/.+?id=(\d+).*/, '$1')) .data('sUserName', jLinks.filter(':last').html()); jTopics.jNameLinks.push(jThis.data('jNameLink')[0]); jTopics.jTitleCells.push(jThis.data('jTitleCell')[0]); }); return sSelector ? jTopics.filter(sSelector) : jTopics; }, defer: function(nPos, uArg, fHandler) { var oArg = (typeof uArg == 'string') ? { sDesc: uArg, aHandler: [fHandler] } : uArg; $.make('a', this, 'aDefer', nPos).push(oArg); return this; } }); //////////////////// END OF - [jQuery Extension] //////////////////// //////////////////// START OF - [AN Extension] //////////////////// $.extend(AN, { shared: function(sFnName) { if(AN.shared[sFnName]) return AN.shared[sFnName].apply(null, Array.prototype.slice.call(arguments, 1)); }, box: { aBenchmark: [], oTypeMap: { 1: '\u6838\u5fc3\u8a2d\u5b9a', 2: '\u6a23\u5f0f\u8a2d\u5b9a', 3: '\u4f48\u5c40\u8a2d\u5b9a', 4: '\u4fee\u6b63\u4fee\u6539', 5: '\u52a0\u5165\u7269\u4ef6', 6: '\u5176\u4ed6\u529f\u80fd', 7: 'Ajax\u5316', 8: '\u5143\u4ef6\u91cd\u9020', 9: '\u7d44\u5408\u6309\u626d' }, oPageMap: { 65535: { action: null, desc: '\u6240\u6709\u9801' }, 65534: { action: null, desc: '\u6240\u6709\u6b63\u5e38\u9801' }, 1: { action: 'error', desc: '\u6240\u6709\u932f\u8aa4\u9801' }, 2: { action: 'default', desc: '\u4e3b\u8ad6\u58c7\u9801' }, 4: { action: 'topics', desc: '\u6a19\u984c\u9801' }, 8: {action: /^search\d*$/, desc: '\u641c\u5c0b\u9801' }, 16: { action: 'tags', desc: '\u6a19\u7c64\u641c\u5c0b\u9801' }, 32: { action: 'view', desc: '\u5e16\u5b50\u9801' }, 64: { action: 'profilepage', desc: '\u7528\u6236\u8cc7\u6599\u9801' }, 128: { action: 'sendpm', desc: '\u79c1\u4eba\u8a0a\u606f\u767c\u9001\u9801' }, 256: { action: 'post', desc: '\u767c\u8868/\u56de\u8986\u9801' }, 512: { action: 'login', desc: '\u767b\u5165\u9801' }, 1024: { action: 'giftpage', desc: '\u4eba\u6c23\u9801' }, 2048: { action: 'blog', desc: '\u7db2\u8a8c\u9801' }, 4096: { action: 'message', desc: '\u7cfb\u7d71\u4fe1\u606f\u9801' }, 8192: { action: 'bookmark', desc: '\u66f8\u7c64\u9801' } } }, //--------[Utility Functions]--------// util: { addFnType: function(uType, sDec) { AN.box.oTypeMap[uType] = sDec; }, stackStyle: function(sStyle) { if(AN.util.stackStyle.sStyle === undefined) { AN.util.stackStyle.sStyle = ''; $d.bind('defer5', function() { AN.util.addStyle(AN.util.stackStyle.sStyle); AN.util.stackStyle.sStyle = ''; }); } AN.util.stackStyle.sStyle += sStyle; }, addStyle: function(sStyle) { if(!this.jStyle) this.jStyle = $('').appendTo('head'); if(AN.box.debugMode) sStyle = sStyle.replace(/(^|}|\*\/)\s+/g, '$1\n'); // indentation this.jStyle[0].styleSheet ? this.jStyle[0].styleSheet.cssText += sStyle : this.jStyle.append(sStyle); }, cookie: function(sName, sValue, sDomain) { if(sValue === undefined) // GET { var match = document.cookie.match(new RegExp("(?:^|;\\s*)" + sName + "=([^;]*)")); return match && match[1]; } else { var dExpire = new Date; dExpire.setFullYear(sValue ? 2999 : 1999); // SET : DEL document.cookie = $.sprintf('%s=%s; %s expires=%s; path=/', sName, sValue || '', sDomain ? 'domain=' + sDomain + ';': '', dExpire.toUTCString()); return true; } }, storage: function(sName, uToSet) { var storage = arguments.callee.storage || (arguments.callee.storage = AN.box.storageMode == 'Flash' && { get: function(sProfile, sName){ return AN.box.eLSO.get(sProfile, sName); }, set: function(sProfile, sName, sData){ AN.box.eLSO.set(sProfile, sName, sData.replace(/\\/g, '\\\\')); }, // escape the backslash so that it will not be removed on GET remove: function(sProfile, sName){ AN.box.eLSO.remove(sProfile, sName); } } || AN.box.storageMode == 'DOM' && (function() { var LS = window.localStorage || window.globalStorage[location.hostname]; return { get: function(sProfile, sName){ var r = LS[sProfile + '___' + sName]; return r && r.value || r; }, set: function(sProfile, sName, sData){ LS[sProfile + '___' + sName] = sData; }, remove: function(sProfile, sName){ LS.removeItem(sProfile + '___' + sName); } }; })() ); var sProfile = 'default'; var sData = ''; if(sName === undefined) // SHOW ALL { $.each(['an_data', 'an_switches', 'an_options'], function() { var uCookie = storage.get(sProfile, this + ''); if(uCookie) sData += uCookie + '\n\n'; }); return sData; } else if(sName === null) // DEL ALL { $.each(['an_data', 'an_switches', 'an_options'], function() { storage.remove(sProfile, this + ''); storage.remove(sProfile, this + '_backup'); }); } else if(uToSet === undefined) // GET { sData = storage.get(sProfile, sName); if(sData) sData = JSON.parse(sData); return sData || null; } else if(uToSet) // SET { sData = JSON.stringify(uToSet); storage.set(sProfile, sName, sData); } else // DEL { storage.remove(sProfile, sName); } return true; }, data: function(sName, uValue) { var oData = AN.util.storage('an_data') || {}; // GET if(uValue === undefined) { if(oData[sName] !== undefined) { return oData[sName]; } return null; } // SET else { uValue === null ? delete oData[sName] : oData[sName] = uValue; return AN.util.storage('an_data', oData); } }, getOpenerInfo: function(jDoc, fToExec) { var oInfo = arguments.callee.oInfo; if(oInfo) { if(oInfo.sId) { fToExec(oInfo); } else { return setTimeout(function(){ AN.util.getOpenerInfo(jDoc, fToExec); }, 100); } } else { oInfo = arguments.callee.oInfo = {}; if(jDoc.pageNo() == 1) { var jOpener = jDoc.replies(':first'); fToExec(oInfo = { sId: jOpener.data('sUserid'), sName: jOpener.data('sUserName') }); } else { $.get('/view.aspx?message=' + window.messageid, function(sHTML) { var jTr = $.doc(sHTML).find('.repliers_left:first').parent(); oInfo = { sId: jTr.attr('userid'), sName: jTr.attr('username') }; fToExec(oInfo); }); } } }, getOpacityStr: function(nOpacity) { return $.support.opacity ? $.sprintf('opacity: %s', nOpacity / 10) : $.sprintf('filter: alpha(opacity=%s)', nOpacity * 10); }, getOptions: function(sOptionName) { var oOptions = $.make('o', arguments.callee, 'oOptions'); if($.isEmpty(oOptions)) { $.each(AN.box.oOptions, function(sName) { $.each(this, function(sPage, uValue) { if($d.pageCode() & sPage) { oOptions[sName] = uValue; return false; } }); }); } return sOptionName ? oOptions[sOptionName] : oOptions; }, getForum: function() { var match = location.hostname.match(/^[^.]+/); return match && match[0]; }, getPageNo: function(sURL) { var sExtract = sURL.replace(/.+?page=(\d+).*/i, '$1'); return isNaN(sExtract) ? 1 : sExtract * 1; }, getURL: function(oParam) { var oSearch = {}; var aParam = location.search.substr(1).split('&'); $.each(aParam, function() { var aPair = this.split('='); if(aPair[1]) oSearch[aPair[0]] = aPair[1]; }); $.extend(oSearch, oParam); return '?' + $.param(oSearch); }, isLoggedIn: function() { return !!$('#ctl00_ContentPlaceHolder1_QuickReplyTable').length; } }, //--------[Module Functions]--------// modFn: { getDB: function(bGetDefault) { var oDB = (!AN.box.oSwitches) ? AN.box : {}; $.extend(oDB, (bGetDefault ? { oSwitches: {}, oOptions: {} } : { oSwitches: AN.util.storage('an_switches') || {}, oOptions: AN.util.storage('an_options') || {} })); $.each(AN.mod, function(sMod) { if(!AN.mod[sMod].fn) return; $.make('o', oDB.oSwitches, sMod); $.each(AN.mod[sMod].fn, function(sId, oFn) { if(!oDB.oSwitches[sMod][sId]) { $.make('a', oDB.oSwitches[sMod], sId); $.each(oFn.page, function(sPage, uDefault) { if(uDefault === true || uDefault == 'comp') oDB.oSwitches[sMod][sId].push(sPage * 1); }); } if(!oFn.options) return; $.each(oFn.options, function(sName, oOption) { $.make('o', oDB.oOptions, sName); $.each(oFn.page, function(sPage) { if(oDB.oOptions[sName][sPage] === undefined) { oDB.oOptions[sName][sPage] = oOption.defaultValue; } }); }); }); }); return oDB; }, execMods: function(jDoc) { var nBegin = $.time(); var execMod = function(sMod) { if(!(AN.mod[sMod] && AN.mod[sMod].fn)) return; AN.box.aBenchmark.push({ type: 'start', name: sMod }); $.each(AN.mod[sMod].fn, function(sId, oFn) { $.each(AN.box.oSwitches[sMod][sId], function() { if(oFn.page[this] != 'disabled' && this in oFn.page && $d.pageCode() & this) { var aHandler = []; if(!AN.firstRan && oFn.once) aHandler.push(oFn.once); if(oFn.infinite) aHandler.push(oFn.infinite); if(aHandler.length) { var oArg = { sDesc: oFn.desc, aHandler: aHandler, oFn: oFn }; oFn.defer ? jDoc.defer(oFn.defer, oArg) : execFn(oArg); } return false; } }); }); AN.box.aBenchmark.push({ type: 'end', name: sMod }); }; var execFn = function(oArg) { try { var nStart = $.time(); $.each(oArg.aHandler, function() { this.call(oArg.oFn, jDoc, oArg.oFn); }); AN.box.aBenchmark.push({ type: 'fn', name: oArg.sDesc, time: $.time(nStart) }); } catch(err) { if(AN.shared.log) { AN.shared.log('\u8acb\u901a\u77e5\u4f5c\u8005\u6709\u95dc\u6b64\u932f\u8aa4'); if(err.message) AN.shared.log('\u932f\u8aa4\u8a0a\u606f: ' + err.message); if(err.type) AN.shared.log('\u932f\u8aa4\u985e\u578b: ' + err.type); if(err.lineNumber) AN.shared.log('\u932f\u8aa4\u884c\u865f: ' + err.lineNumber); AN.shared.log('\u51fa\u73fe\u4f4d\u7f6e: ' + oArg.sDesc); AN.shared.log('\u51fa\u73fe\u5730\u5740: ' + location.href); AN.shared.log($.sprintf('\u767c\u751f\u932f\u8aa4: %s', oArg.sDesc)); } else if(AN.box.debugMode) alert($.sprintf('ERROR ON EXECUATION: %s\r\n%s', oArg.sDesc, err.message)); } }; if(!jDoc) jDoc = $(document.body); execMod('Kernel'); execMod('User Interface'); $.each(AN.mod, function(sMod) { if(sMod != 'Kernel' && sMod != 'User Interface') execMod(sMod); }); setTimeout(function() { AN.box.aBenchmark.push({ type: 'start', name: '\u5ef6\u671f\u57f7\u884c\u9805\u76ee' }); for(var i=1; i<=5; i++) { $d.trigger('defer' + i); if(jDoc.aDefer && jDoc.aDefer[i]) { $.each(jDoc.aDefer[i], function(){ execFn(this); }); } } jDoc.aDefer = null; AN.box.aBenchmark.push({ type: 'end', name: '\u5ef6\u671f\u57f7\u884c\u9805\u76ee' }); AN.firstRan = true; AN.shared('log2', '\u6240\u6709\u529f\u80fd\u57f7\u884c\u5b8c\u6210'); AN.box.aBenchmark.push({ type: 'final', time: $.time(nBegin) }); }, 0); } } }); //////////////////// END OF - [AN Extension] //////////////////// //////////////////// START OF - [Initialization] //////////////////// if(JSON.stringify(document.createElement("input").value)!== "" ) { (function(_stringify) { JSON.stringify = function(o, f, s) { return _stringify(o === '' ? '' : o , f, s); }; })(JSON.stringify); } $.event.special.click = { add: function(handleObj) { handleObj.handler = (function(handler) { return function(event) { if(event.type === 'click' && !(handleObj.data && handleObj.data.disableCheck) && event.button > 0) return; handler.apply(this, arguments); }; })(handleObj.handler); } }; $d.bind('click', { disableCheck: true }, function(event) { if($(event.target).closest('a').filter(function(){ return /^(?:#|javascript:)$/.test(this.getAttribute('href')); }).length) event.preventDefault(); }); $.support.localStorage = !!(window.localStorage || window.globalStorage || false); $(function() { $('
                    ').appendTo('body'); function exec(sStorageType) { AN.box.storageMode = sStorageType; AN.modFn.getDB(); AN.modFn.execMods(); } exec('DOM'); }); //////////////////// END OF - [Initialization] //////////////////// })();