SMDb - Sharing Movie Databases

Cross-site searching for IMDb, cinema communities and open trackers

当前为 2015-12-13 提交的版本,查看 最新版本

// ==UserScript==
// @name           SMDb - Sharing Movie Databases
// @namespace      www.surrealmoviez.info
// @description    Cross-site searching for IMDb, cinema communities and open trackers
// @include        http://www.imdb.com/title/*
// @require        http://code.jquery.com/jquery-1.11.1.min.js
// @grant          GM_xmlhttpRequest
// @grant          GM_addStyle
// @grant          GM_setValue
// @grant          GM_getValue
// @license        GNU GPL v3.0 http://www.gnu.org/licenses/gpl-3.0.txt
// @version        0.7.2
// ==/UserScript==

/**
 * CREDITS
 * 
 * Silk icon set 1.3 by Mark James
 * http://www.famfamfam.com/lab/icons/silk/
 * Creative Commons Attribution 2.5 License http://creativecommons.org/licenses/by/2.5/
 * (+ custom icons gimpped from the collection)
 */

// Add "special" styles (for hover, hidding table-rows, etc)
GM_addStyle(''
        + '.aux-button { opacity: 0.4; }'
        + '.aux-button:hover { opacity: 1; }'
        + '.smdb-table-row { display: table-row; }'
        + '.smdb-hidden-row { display: none; }'
        + '.smdb-search-icon { opacity: 0.4; }'
        + '.smdb-search-icon:hover { opacity: 1; }'
        );

// IMDb parameters
var imdb = {
    'id': null,
    'idNum': null,
    'name': null,
    'tName': null,
    'year': null,
    'extractId': function () {
        var IMDbID = document.documentURI.match(/tt\d{4,}/i)[0];
        if (typeof IMDbID !== 'string') {
            alert('Critical error, no IMDb ID found. Please report this issue.');
            throw new Error("No regex match in URI");
        } else {
            this.id = IMDbID;
            this.idNum = IMDbID.replace('tt', '');
        }
    },
    'extractTitle': function () {
        if (this.isOldDisplay()) {
            var tempTitle = $('#tn15title > h1').clone().children().remove().end().text().replace(/"/g, '').trim();
            var tempYear = $('#tn15title > h1 > span > a').text().trim();
            this.name = tempTitle;
            this.year = tempYear;
        } else {
            var tempTitle = $('#overview-top > .header > .itemprop');
            var tempOriginalTitle = $('#overview-top > .header > .title-extra');
            this.year = $('#overview-top > .header > .nobr').text().replace('(', '').replace(')', '').trim();
            if (tempOriginalTitle.length > 0) {
                this.name = tempOriginalTitle.clone().children().remove().end().text().replace(/"/g, '').trim();
                this.tName = tempTitle.text().replace('"', '').trim();
            } else {
                this.name = tempTitle.text().trim();
            }
        }

    },
    'getTitle': function (withYear, preferOriginal) {
        var tempName = this.name;
        if (!preferOriginal && this.tName !== null) {
            tempName = this.tName;
        }
        var tempYear = ' ' + this.year;
        if (!withYear) {
            tempYear = '';
        }
        return tempName + tempYear;
    },
    'isOldDisplay': function () {
        if (document.documentURI.indexOf("/reference") !== -1 || document.documentURI.indexOf("/combined") !== -1) {
            return true;
        }
        return false;
    },
    'isTestingDisplay': function () {
        if ($('.plot_summary_wrapper > .plot_summary').length === 1) {
            return true;
        }
        return false;
    },
    'getContainerPosition': function () {
        if (this.isOldDisplay()) {
            return '#tn15content';
        }
        if (this.isTestingDisplay()) {
            return '.plot_summary';
        }
        return '.star-box';
    }
};

imdb.extractId();
imdb.extractTitle();

// Images for the possible search result statuses
var status = {
    none: {
        'img': 'https://raw.githubusercontent.com/surrealcode/smz-userscripts/master/smdb/img/statusicons/none.png',
        'description': 'Not searched yet'
    },
    found: {
        'img': 'https://raw.githubusercontent.com/surrealcode/smz-userscripts/master/smdb/img/statusicons/corner_found.png',
        'description': 'Something found'
    },
    notFound: {
        'img': 'https://raw.githubusercontent.com/surrealcode/smz-userscripts/master/smdb/img/statusicons/corner_not-found.png',
        'description': 'Nothing found'
    },
    notLoggedIn: {
        'img': 'https://raw.githubusercontent.com/surrealcode/smz-userscripts/master/smdb/img/statusicons/corner_not-logged-in.png',
        'description': 'Not logged in'
    },
    error: {
        'img': 'https://raw.githubusercontent.com/surrealcode/smz-userscripts/master/smdb/img/statusicons/corner_error.png',
        'description': 'Site error (down, moved, etc)'
    },
    bug: {
        'img': 'https://raw.githubusercontent.com/surrealcode/smz-userscripts/master/smdb/img/statusicons/corner_bug.png',
        'description': 'Bug in the script code (report <a href="https://github.com/surrealcode/smz-userscripts/issues" target="reportIssues">here</a>)'
    },
    timeout: {
        'img': 'https://raw.githubusercontent.com/surrealcode/smz-userscripts/master/smdb/img/statusicons/corner_timeout.png',
        'description': 'Timeout (no response after 15 seconds)'
    }
};

// Settings switch
var switchy = {
    'on': 'https://raw.githubusercontent.com/surrealcode/smz-userscripts/master/smdb/img/configicons/switch-on.png',
    'off': 'https://raw.githubusercontent.com/surrealcode/smz-userscripts/master/smdb/img/configicons/switch-off.png',
    'getImg': function (bool) {
        if (bool) {
            return switchy.on;
        }
        return switchy.off;
    },
    'getOpositeImg': function (src) {
        if (src === switchy.on) {
            return switchy.off;
        }
        return switchy.on;
    }
};

// GM values getter/setter
var gm = {
    'setBool': function (valueName, bool) {
        if (typeof bool === 'boolean') {
            GM_setValue(valueName, bool);
            return true;
        }
        return false;
    },
    'getBool': function (valueName) {
        return GM_getValue(valueName, true);
    }
};

/**
 * Creates a linkeable site.
 *
 * @constructor
 * @this {MiniSite}
 * @param {string} name - Complete name of the site.
 * @param {string} icon - Site icon (favicon if available), 20x20 px.
 * @param {string} query - String to perform a search using the IMDb parameter.
 * @param {string} imdbInput - Parameter extracted from IMDb to use as search string.
 */
function MiniSite(name, icon, query, imdbInput) {
    this.name = name;
    this.icon = icon;
    this.query = query;
    this.imdbInput = imdbInput;
    this.getSearchUrl = function () {
        return query.replace('%q', imdbInput);
    };
}

/**
 * Creates a searcheable site.
 *
 * @constructor
 * @this {Site}
 * @param {string} name - Complete name of the site.
 * @param {string} abbreviation - Abbreviation of the site.
 * @param {string} icon - Site icon (favicon if available), 20x20 px.
 * @param {string} query - String to perform a search using the IMDb parameter.
 * @param {string} resultsPath - CSS path indicating matches in the site.
 * @param {string} noResultsPath - CSS path indicating no matches in the site.
 * @param {string} loginPath - CSS path to identify the site's login page.
 * @param {string} imdbInput - Parameter extracted from IMDb to use as search string.
 */
function Site(name, abbreviation, icon, query, resultsPath, noResultsPath, loginPath, imdbInput) {
    this.name = name;
    this.abbreviation = abbreviation;
    this.icon = icon;
    this.query = query;
    this.resultsPath = resultsPath;
    this.noResultsPath = noResultsPath;
    this.loginPath = loginPath;
    this.imdbInput = imdbInput;
    this.searchMe = true; // After a successful search (with or without results), will be false to prevent re-searching if the user hits the pirate button again
    this.isEnabled = function () {
        return gm.getBool(this.getGMValueName());
    };
    this.getImageId = function () {
        return 'share-icon-' + abbreviation.toLowerCase();
    };
    this.getSearchUrl = function () {
        return query.replace('%q', imdbInput);
    };
    this.getGMValueName = function () {
        return 'smdb-' + this.abbreviation.toLowerCase() + '-enabled';
    };
    this.performSearch = function () {
        if (!this.searchMe || !this.isEnabled()) {
            return false;
        }
        var targetImage = $('#' + this.getImageId());
        var thisSite = this;
        targetImage.attr('src', status.none.img);
        GM_xmlhttpRequest({
            method: "GET",
            timeout: 15000,
            url: this.getSearchUrl(),
            onload: function (response) {
                var responseDom = $(response.responseText);
                if ($(thisSite.resultsPath, responseDom).length > 0) {
                    targetImage.attr('src', status.found.img);
                    thisSite.searchMe = false;
                } else if ($(thisSite.noResultsPath, responseDom).length > 0) {
                    targetImage.attr('src', status.notFound.img);
                    thisSite.searchMe = false;
                } else if (thisSite.loginPath !== null && $(thisSite.loginPath, responseDom).length > 0) {
                    targetImage.attr('src', status.notLoggedIn.img).attr('title', thisSite.name + ' - not logged in');
                } else {
                    targetImage.attr('src', status.bug.img);
                }
            },
            onerror: function (response) {
                var errorStatus = response.statusText;
                if (errorStatus === null) {
                    errorStatus = 'Site unreachable';
                }
                console.log(name + ' - error\n\n*****Status*****\n\n' + response.status + ' ' + response.statusText + '\n\n*****Content*****\n\n' + response.responseText);
                targetImage.attr('src', status.error.img).attr('title', thisSite.name + ' - error: ' + errorStatus);
            },
            ontimeout: function (response) {
                targetImage.attr('src', status.timeout.img).attr('title', thisSite.name + ' - timeout');
            }
        });
    };

}

var miniSites = [
    new MiniSite(
            'Youtube',
            'https://raw.githubusercontent.com/surrealcode/smz-userscripts/master/smdb/img/favicons/youtube.png',
            'https://www.youtube.com/results?search_query=%q',
            imdb.getTitle(true, true)
            ),
    new MiniSite(
            'OpenSubtitles',
            'https://raw.githubusercontent.com/surrealcode/smz-userscripts/master/smdb/img/favicons/opensubtitles.png',
            'http://www.opensubtitles.org/en/search/imdbid-%q',
            imdb.idNum
            ),
    new MiniSite(
            'SubtitleSeeker',
            'https://raw.githubusercontent.com/surrealcode/smz-userscripts/master/smdb/img/favicons/all4divx.png',
            'http://www.subtitleseeker.com/search/TITLES/%q',
            imdb.getTitle(false, true)
            ),
    new MiniSite(
            'Rotten Tomatoes',
            'https://raw.githubusercontent.com/surrealcode/smz-userscripts/master/smdb/img/favicons/rottentomatoes.png',
            'http://www.rottentomatoes.com/alias?type=imdbid&s=%q',
            imdb.idNum
            ),
    new MiniSite(
            'TMDb',
            'https://raw.githubusercontent.com/surrealcode/smz-userscripts/master/smdb/img/favicons/tmdb.png',
            'http://www.themoviedb.org/search?query=%q',
            imdb.id
            ),
    new MiniSite(
            'Filmaffinity',
            'https://raw.githubusercontent.com/surrealcode/smz-userscripts/master/smdb/img/favicons/filmaffinity.png',
            'http://www.filmaffinity.com/en/search.php?stext=%q&stype=title',
            imdb.getTitle(false, true)
            ),
    new MiniSite(
            'AllMovie',
            'https://raw.githubusercontent.com/surrealcode/smz-userscripts/master/smdb/img/favicons/allmovie.png',
            'http://www.allmovie.com/search/all/%q',
            imdb.getTitle(false, true)
            ),
    new MiniSite(
            'Letterboxd',
            'https://raw.githubusercontent.com/surrealcode/smz-userscripts/master/smdb/img/favicons/letterboxd.png',
            'http://letterboxd.com/search/%q/',
            imdb.id
            )
];

var sites = [
    new Site(
            'Surrealmoviez',
            'SMz',
            'https://raw.githubusercontent.com/surrealcode/smz-userscripts/master/smdb/img/favicons/smz.png',
            'http://www.surrealmoviez.info/search.php?stext=%q&search=Search',
            '.main-bg .main-body > a',
            '.main-body > center:contains(0 Movies found matching search criteria.)',
            '.side-body [name=loginform]',
            imdb.id
            ),
    new Site(
            'Karagarga',
            'KG',
            'https://raw.githubusercontent.com/surrealcode/smz-userscripts/master/smdb/img/favicons/kg.png',
            'https://karagarga.in/browse.php?search=%q&search_type=imdb',
            '#browse .oddrow',
            '.outer center > h2:contains(No torrents found)',
            '.outer > h1:contains(Not logged in!)',
            imdb.id
            ),
    new Site(
            'Cinemageddon',
            'CG',
            'https://raw.githubusercontent.com/surrealcode/smz-userscripts/master/smdb/img/favicons/cg.png',
            'http://cinemageddon.net/browse.php?search=%q&proj=0&descr=1',
            '.torrenttable .prim, .torrenttable .torrenttable_usersnatched',
            '.outer form h2:contains(Nothing found!)',
            'input[value="Log in!"]',
            imdb.id
            ),
    new Site(
            'Cinematik',
            'Tik',
            'https://raw.githubusercontent.com/surrealcode/smz-userscripts/master/smdb/img/favicons/tik.png',
            'http://cinematik.net/browse.php?search=%q&cat=0&incldead=1&sort=1&type=asc&srchdtls=1',
            '.outer table .brolin',
            '.outer h2:contains(Nothing found!)',
            '#usrlogin',
            imdb.id
            ),
    new Site(
            'PassThePopcorn',
            'PtP',
            'https://raw.githubusercontent.com/surrealcode/smz-userscripts/master/smdb/img/favicons/ptp.png',
            'https://tls.passthepopcorn.me/torrents.php?order_by=relevance&searchstr=%q',
            '.basic-movie-list__torrent-row, .page__title',
            'h2:contains(Your search did not match anything)',
            '#loginfields',
            imdb.id
            ),
    new Site(
            'I Love Classics',
            'ILC',
            'https://raw.githubusercontent.com/surrealcode/smz-userscripts/master/smdb/img/favicons/ilc.png',
            'http://www.iloveclassics.com/browse.php?cat=0&incldead=1&search=%q&searchin=2',
            '.NB_fmmain > #hover-over',
            '.table_col1 > td:contains(Try again with a refined search string.)',
            '#topdrag:contains(Log On To I Love Classics)',
            imdb.id
            ),
    new Site(
            'Secret Cinema',
            'SC',
            'https://raw.githubusercontent.com/surrealcode/smz-userscripts/master/smdb/img/favicons/sc.png',
            'http://www.secret-cinema.net/search.php?action=search&keywords=%q&author=&forum=-1&sort_by=5&sort_dir=DESC&show_as=topics&search=Submit',
            '.tcl .tclcon',
            '.inbox p:contains(Your search returned no hits.)',
            '#msg p:contains(You do not have permission to view these forums)',
            imdb.id
            ),
    new Site(
            'Gormogon',
            'GG',
            'https://raw.githubusercontent.com/surrealcode/smz-userscripts/master/smdb/img/favicons/gg.png',
            'http://www.gormogon.com/index.php?page=torrents&search=%q&category=0&options=1&active=0',
            '.lista > a > img[alt=torrent]',
            '.lista .header > a:contains(AddDate)', // No real way to know, using a selector to determine that we are at least in a search result page
            '.b-content td:contains(not authorized to view the Torrents!)',
            imdb.id
            ),
    new Site(
            'euTorrents',
            'euT',
            'https://raw.githubusercontent.com/surrealcode/smz-userscripts/master/smdb/img/favicons/eut.png',
            'https://eutorrents.to/movies?search=%q&genres=&countries=&languages=&casts=',
            '.col-md-12 > .movies-block',
            '.well-sm > .btn-info', // No real way to know, using a selector to determine that we are at least in a search result page
            '#navbar a:contains(Login)',
            imdb.id
            ),
    new Site(
            'Asian DVD Club',
            'ADV',
            'https://raw.githubusercontent.com/surrealcode/smz-userscripts/master/smdb/img/favicons/adc.png',
            'http://asiandvdclub.org/browse.php?search=%q&descr=1&btnSubmit=Search!',
            '.torrenttable .torrentname',
            '#resultcount > h1:contains(Your search returned zero results!)',
            'form > .clean #username',
            imdb.id
            ),
    new Site(
            'Asia Torrents',
            'AT',
            'https://raw.githubusercontent.com/surrealcode/smz-userscripts/master/smdb/img/favicons/at.png',
            'https://avistaz.to/torrents?in=0&search=%q&tags=&type=0&language=0&subtitle=0&discount=0&rip_type=0&video_quality=0&tv_type=0&uploader=',
            '.col-md-12 .torrent-filename',
            '.lead:contains(No torrents found!)',
            '.page-header > h1:contains(Login)',
            imdb.id
            ),
    new Site(
            'ruTracker',
            'RT',
            'https://raw.githubusercontent.com/surrealcode/smz-userscripts/master/smdb/img/favicons/rt.png',
            'http://rutracker.org/forum/tracker.php?nm=%q',
            '#search-results .f-name',
            '#search-results .row1:contains(Не найдено)',
            'input[name=login_username]',
            imdb.getTitle(true, true)
            ),
    new Site(
            't411',
            't411',
            'https://raw.githubusercontent.com/surrealcode/smz-userscripts/master/smdb/img/favicons/t411.png',
            'http://www.t411.io/torrents/search/?search=%q',
            '.results .down',
            '.error:contains(Aucun Résultat)',
            null,
            imdb.getTitle(true, true)
            ),
    new Site(
            'Demonoid',
            'Demo',
            'https://raw.githubusercontent.com/surrealcode/smz-userscripts/master/smdb/img/favicons/demo.png',
            'http://www.demonoid.pw/files/?category=0&subcategory=All&quality=All&seeded=2&external=0&query=%q&uid=0&sort=',
            '.font_12px .tone_1_pad > a',
            '.red > b:contains(No torrents found)',
            null,
            imdb.id
            ),
    new Site(
            'The Pirate Bay',
            'TPB',
            'https://raw.githubusercontent.com/surrealcode/smz-userscripts/master/smdb/img/favicons/tpb.png',
            'https://thepiratebay.se/search/%q/0/7/0',
            '.vertTh',
            'h2:contains(No hits. Try adding)',
            null,
            imdb.id
            ),
    new Site(
            'KickassTorrents',
            'KAT',
            'https://raw.githubusercontent.com/surrealcode/smz-userscripts/master/smdb/img/favicons/kat.png',
            'https://kickass.to/usearch/imdb%3A%q/',
            '.data .torrentname',
            '.errorpage > h2:contains(Nothing found!)',
            null,
            imdb.idNum
            ),
    new Site(
            'BitSnoop',
            'BS',
            'https://raw.githubusercontent.com/surrealcode/smz-userscripts/master/smdb/img/favicons/bs.png',
            'http://bitsnoop.com/search/all/%q/c/d/1/',
            '#torrents',
            '#search > h1:contains(Nothing was found.)',
            null,
            imdb.getTitle(true, true)
            ),
    new Site(
            'My Duck is Dead',
            'MDiD',
            'https://raw.githubusercontent.com/surrealcode/smz-userscripts/master/smdb/img/favicons/mdid.png',
            'http://www.myduckisdead.org/search?q=%q',
            '.postwrap',
            '.status-msg-body:contains(No posts matching)',
            null,
            imdb.id
            ),
    new Site(
            'Rarelust',
            'RL',
            'https://raw.githubusercontent.com/surrealcode/smz-userscripts/master/smdb/img/favicons/rl.png',
            'http://rarelust.com/?s=%q',
            '.entry-content',
            '.entry-header > .entry-title:contains(Nothing Found)',
            null,
            imdb.id
            ),
    new Site(
            'AvaxHome',
            'AH',
            'https://raw.githubusercontent.com/surrealcode/smz-userscripts/master/smdb/img/favicons/ah.png',
            'http://avxsearch.se/search?q=%q&a=&exact=0&c=54&l=any&sort_by=relevance',
            '.title-link',
            '.amount:contains(Found 0 post)',
            null,
            imdb.getTitle(true, true)
            )
];

var container = '<div style="display: table; width: 100%; max-width: 400px; border-top: 1px solid #e8e8e8, padding-top: 1em, padding-bottom: 1em; border-collapse: collapse;">'

        + '<div style="display: table-row;">'
        + '<div id="mini-container" style="display: table-cell; vertical-align: middle; text-align: center;"></div>'
        + '</div>'

        + '<div style="display: table-row;">'
        + '<div id="share-container" style="display: table-cell; vertical-align: middle; text-align: center;"></div>'
        + '<div style="display: table-cell; width: 70px; vertical-align: middle;">'
        + '<img id="share-button" src="https://raw.githubusercontent.com/surrealcode/smz-userscripts/master/smdb/img/button.png" alt="Search!" title="Search!" style="margin-left: 20px; cursor: pointer;">'
        + '</div>'
        + '</div>'

        + '<div style="display: table-row; height: 20px;">'
        + '<div style="display: table-cell;">'
        + '</div>'
        + '<div style="display: table-cell; vertical-align: bottom; text-align: center;">'
        + '<img id="smdb-settings-button" class="aux-button row-displayer" target-row="smdb-settings-row" src="https://raw.githubusercontent.com/surrealcode/smz-userscripts/master/smdb/img/config.png" alt="Settings" title="Settings" style="cursor: pointer;">'
        + '<img id="smdb-help-button" class="aux-button row-displayer" target-row="smdb-help-row" src="https://raw.githubusercontent.com/surrealcode/smz-userscripts/master/smdb/img/manual.png" alt="Help" title="Help" style="cursor: pointer;">'
        + '</div>'
        + '</div>'

        + '<div id="smdb-settings-row" class="smdb-hidden-row" style="border: 1px dashed silver;">'
        + '<div id="smdb-settings" style="display: table-cell;"></div>'
        + '<div style="display: table-cell; vertical-align: middle; text-align: center;"><img id="smdb-reload" src="https://raw.githubusercontent.com/surrealcode/smz-userscripts/master/smdb/img/reload.png" alt="Reload" title="Reload" style="cursor: pointer; display: none;"></div>'
        + '</div>'

        + '<div id="smdb-help-row" class="smdb-hidden-row" style="border: 1px dashed silver;">'
        + '<div id="smdb-help" style="display: table-cell; padding: 5px;">'
        + '<h4>Usage:</h4>See the complete usage instructions <a href="https://github.com/surrealcode/smz-userscripts/tree/master/smdb#usage" target="smdbHelp">here</a>.<br>'
        + '<h4>Statuses:</h4><ul id="smdb-statuses-list" style="list-style-type: none;"></ul><br>'
        + '<h4>Accuracy:</h4>The results are only a reference. Sites can have missing info or misspelled names. Do some manual searches if you want to be 100% sure.<br><br>'
        + '<h4>Why is site X not listed?</h4>Some sites don\'t support straightforward searches (listed <a href="https://github.com/surrealcode/smz-userscripts/tree/master/smdb#list-of-unsupported-sites" target="smdbHelp">here</a>). Others are currently out of my reach, I don\'t know them or are not in the focus of the script.<br><br>'
        + '</div>'
        + '</div>'

        + '</div>';

$(document).ready(function () {
    $(container).insertBefore(imdb.getContainerPosition());

    // Insert the list of mini sites to be clicked only
    for (var i = 0; i < miniSites.length; i++) {
        var miniSite = miniSites[i];
        $('#mini-container').append('<a href="' + miniSite.getSearchUrl() + '" target="miniTab"><img src="' + miniSite.icon + '" style="width: 16px; height: 16px; margin: 2px;" alt="' + miniSite.name + '" title="' + miniSite.name + '"></a>');
    }

    // Insert the list of sites to be searched
    for (var i = 0; i < sites.length; i++) {
        var site = sites[i];
        // Add it to the fetch list
        if (site.isEnabled()) {
            $('#share-container').append('<a href="' + site.getSearchUrl() + '" target="shareTab"><img id="' + site.getImageId() + '" class="smdb-search-icon" src="' + status.none.img + '" style="width: 20px; height: 20px; background: url(' + site.icon + '); background-repeat: no-repeat; margin: 2px;" alt="' + site.abbreviation + '" title="' + site.name + '"></a>');
        }
        // Add it to the settings list
        $('#smdb-settings').append('<div style="display: inline-block; width: 33px; margin: 11px;"><img class="smdb-settings-switch" target-gm-value="' + site.getGMValueName() + '" src="' + switchy.getImg(site.isEnabled()) + '" style="margin-right: 3px; cursor: pointer;"><img src="' + site.icon + '" alt="' + site.abbreviation + '" title="' + site.name + '"></div>');
    }

    // Insert the list of possible statuses in the help area
    for (var stat in status) {
        $('#smdb-statuses-list').append('<li style="padding: 0; margin: 0;"><img src="' + status[stat]['img'] + '"> = ' + status[stat]['description'] + '</li>');
    }

    // Add action to the search button
    $('#share-button').click(function () {
        $('.smdb-search-icon').css('opacity', '1');
        $('#share-button').attr('alt', 'Retry!').attr('title', 'Retry!');
        for (var i = 0; i < sites.length; i++) {
            var site = sites[i];
            site.performSearch();
        }
    });

    // Add action to the auxiliary buttons (config, help, etc)
    $('.row-displayer').click(function () {
        $(this).toggleClass('aux-button');
        $('#' + $(this).attr('target-row')).toggleClass('smdb-hidden-row smdb-table-row');
    });

    // Add action to the site switches in the config area
    $('.smdb-settings-switch').click(function () {
        var targetGMValue = $(this).attr('target-gm-value');
        if (gm.setBool(targetGMValue, !gm.getBool(targetGMValue))) {
            $(this).attr('src', switchy.getOpositeImg($(this).attr('src')));
            $('#smdb-reload').show();
        } else {
            alert('Error saving settings!');
        }
    });

    // Add action to the reload button in the search area
    $('#smdb-reload').click(function () {
        window.location.reload();
    });
});

长期地址
遇到问题?请前往 GitHub 提 Issues。