pootz / imdb link in speed.cd title

// ==UserScript==
// @name        imdb link in speed.cd title
// @namespace   pootz
// @description insert imdb link in the title of the details page
// @include     http*://*speed.cd/details.php?id=*
// @include     http*://*speed.cd/t/*
// @version     1.9
// @history     1.9 - fix after imdb change, imdb icon of movies without rate are no longer shown
// @history     1.8 - fix movies not yet released
// @history     1.7 - fix a bug where a movie not yet rated, would not insert the imdb icon button
// @history     1.6 - fix to work after page changes
// @history     1.5 - when the imdb link is found, it show the rates instead of the icon
// @history     1.4 - fix http bug, where the description link not preceeded by http would fail to open
// @history     1.3 - add imdb as button so it still appears when movie title is longer
// @history     1.2 - find for the title and until year, and retrieve imdb link's search results if found
// @history     1.1 - regex range updated
// @require     https://code.jquery.com/jquery-2.1.1.min.js
// @updateURL   https://openuserjs.org/meta/pootz/imdb_link_in_speed.cd_title.meta.js
// @downloadURL https://openuserjs.org/install/pootz/imdb_link_in_speed.cd_title.user.js
// @grant       GM_addStyle
// @grant       GM_xmlhttpRequest
// ==/UserScript==


imdbIcon = "data:image/png;base64,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";

var movieSearch = /xvid|264|[^a-z0-9](20[0-3][0-9]|19[1-9][0-9])/i;
var untilYear = /[\w\d '-]+[ |\[|\(](20[0-3][0-9]|19[0-9][0-9])/;
var titleID = $("#boxTitle");
var torrentTitle = titleID.prop("title");
var searchImdb = /(http:\/\/www.imdb.com\/title\/tt\d{7})|(http:\/\/imdb.com\/title\/tt\d{7})|(www.imdb.com\/title\/tt\d{7})|(http:\/\/akas.imdb.com\/title\/tt\d{7})/i;
var details = $(".infoBody").html();
var torrentOptions = $('.tOpt');

if ( searchImdb.test(details) ) {

    var imdb = details.match(searchImdb)[0];

    if (imdb.indexOf("http") == -1) {
        imdb = "http://" + imdb;
    }

    GM_xmlhttpRequest ( {
        method:         "GET",
        url:            imdb,
        onload:         imdbRate
    });

} else if ( movieSearch.test(torrentTitle) ) {

    if ( untilYear.test(torrentTitle) ) {

        var imdbSearch = "http://www.imdb.com/find?q=" + encodedTitle(true) + "&s=tt&exact=true";

        GM_xmlhttpRequest ( {
            method:         "GET",
            url:            imdbSearch,
            onload:         imdbResults
        });

    }

}

function insertImdbButton(imdb) {

    if (imdb != "undefined" || imdb !== null) {

        torrentOptions.append('<span> </span><label class="uiButton"><a href="' + imdb + '" target="_blank"><img src="' + imdbIcon + '"></img></a></label>');

    }
}

function insertRate(imdb, rates) {

    if (rates != "undefined" || rates !== null) {
        torrentOptions.append('<span> </span><label class="uiButton"><a href="' + imdb + '" target="_blank"><font color="blue" size="4">' + rates + '</font></a></label>');

    } else {

        insertImdbButton(imdb);
    }
}

function imdbRate(object) {


    var resp = $(object.responseText);
    //var isRated = resp.find('div.ratings_wrapper')[0].textContent.trim();
    var rate = resp.find('span[itemprop="ratingValue"]');
    var count = resp.find('span[itemprop="ratingCount"]');
    var rates = rate[0].textContent + " (" + count[0].textContent + ")";

    insertRate(imdb, rates);

}

function imdbResults(object) {

    var respDoc = $(object.responseText);
    var linkTitleYear = respDoc.find('.result_text');
    var imdb = "http://www.imdb.com";
    var foundIt = false;
    var year = encodedTitle(false);

    for (var i = 0; i < linkTitleYear.length; i++) {

        var searchTitle = linkTitleYear[i].textContent;
        var iLink = linkTitleYear[i].getElementsByTagName("a")[0].getAttribute("href");

        if (searchTitle.indexOf( year ) != -1) {

            foundIt = true;
            var searchLink = iLink.slice( iLink, iLink.indexOf("/?") );
            imdb = imdb + searchLink;
            insertImdbButton(imdb);
            break;

        }
    }

    if (!foundIt) {
        imdb = imdbSearch;
        insertImdbButton(imdb);
    }

}


function encodedTitle( boolean ) {

    var year = /20[0-3][0-9]|19[0-9][0-9]/;

    var grabYear = torrentTitle.match(year)[0];
    var grabTitle = torrentTitle.match(untilYear)[0].toLowerCase();

    grabTitle = grabTitle.slice( 0, -5 );
    grabTitle = grabTitle.replace(/-|\(|\[|'|/g,"");
    grabTitle = grabTitle.replace(/  |   /g, " ");
    grabTitle = grabTitle.replace(/ VS | vs /g," vs. ");

    if (grabTitle.charAt(0) == " ") {
        grabTitle = grabTitle.slice(1);
    }
    if (grabTitle.charAt(grabTitle.length - 1) == " ") {
        grabTitle = grabTitle.slice(0,-1);
    }

    var grabEncodedTitle = grabTitle.replace(/&/g,"%26");
    grabEncodedTitle = grabEncodedTitle.replace(/\?/g,"%3F");
    grabEncodedTitle = grabEncodedTitle.replace(/=/g,"%3D");
    grabEncodedTitle = grabEncodedTitle.replace(/ /g,"+");

    if (boolean)
        return grabEncodedTitle;
    else
        return grabYear;

}