Flashscore Better Score

Adds score evaluation, view TotalScore, AH1 at matchdetails and can show soccer game stats on mygames tab.

目前為 2016-03-07 提交的版本,檢視 最新版本

您需要先安裝使用者腳本管理器擴展,如 TampermonkeyGreasemonkeyViolentmonkey 之後才能安裝該腳本。

You will need to install an extension such as Tampermonkey to install this script.

您需要先安裝使用者腳本管理器擴充功能,如 TampermonkeyViolentmonkey 後才能安裝該腳本。

您需要先安裝使用者腳本管理器擴充功能,如 TampermonkeyUserscripts 後才能安裝該腳本。

你需要先安裝一款使用者腳本管理器擴展,比如 Tampermonkey,才能安裝此腳本

您需要先安裝使用者腳本管理器擴充功能後才能安裝該腳本。

(我已經安裝了使用者腳本管理器,讓我安裝!)

你需要先安裝一款使用者樣式管理器擴展,比如 Stylus,才能安裝此樣式

你需要先安裝一款使用者樣式管理器擴展,比如 Stylus,才能安裝此樣式

你需要先安裝一款使用者樣式管理器擴展,比如 Stylus,才能安裝此樣式

你需要先安裝一款使用者樣式管理器擴展後才能安裝此樣式

你需要先安裝一款使用者樣式管理器擴展後才能安裝此樣式

你需要先安裝一款使用者樣式管理器擴展後才能安裝此樣式

(我已經安裝了使用者樣式管理器,讓我安裝!)

// ==UserScript==
// @name     Flashscore Better Score
// @namespace  Flashscore
// @version    0.4.1
// @include http://www.flashscore.com/*
// @description Adds score evaluation, view TotalScore, AH1 at matchdetails and can show soccer game stats on mygames tab.
// @author 2016+, [email protected]
// @licence Creative Commons (by-nc-sa)
// @grant       none
// ==/UserScript==

//Show Stats on Mygames Tab
var showSoccerStats = true;
//How many Stats Rows show
var soccerStatsCount = 3;
//Stats Row Width
var srw = 75;

var SRef = '<select id="SRef"><option value="AH1">AH1</option><option value="AH2">AH2</option><option value="TotalScore">TotalScore</option><option value="Team1Score">Team1Score</option><option value="Team1Score">Team2Score</option></select> OP:<select ID="SOP"><option value="LT">&#60</option><option value="GT">&#62</option><option value="LE">&#8804</option><option value="GE">&#8805</option><option value="EQ">&#8801</option><option value="NE">&#8800</option></select> COMP:<input type="number" id="SCOMP" value="0" step="0.5">';
var OStatsFT = '<option>FT - Ball Possession</option><option>FT - Goal Attempts</option><option>FT - Shots on Goal</option><option>FT - Shots off Goal</option><option>FT - Blocked Shots</option><option>FT - Free Kicks</option><option>FT - Corner Kicks</option><option>FT - Offsides</option><option>FT - Throw-in</option><option>FT - Goalkeeper Saves</option><option>FT - Red Cards</option><option>FT - Yellow Cards</option>';
var OStats1H = '<option>1H - Ball Possession</option><option>1H - Goal Attempts</option><option>1H - Shots on Goal</option><option>1H - Shots off Goal</option><option>1H - Blocked Shots</option><option>1H - Free Kicks</option><option>1H - Corner Kicks</option><option>1H - Offsides</option><option>1H - Throw-in</option><option>1H - Goalkeeper Saves</option><option>1H - Red Cards</option><option>1H - Yellow Cards</option>';
var OStats2H = '<option>2H - Ball Possession</option><option>2H - Goal Attempts</option><option>2H - Shots on Goal</option><option>2H - Shots off Goal</option><option>2H - Blocked Shots</option><option>2H - Free Kicks</option><option>2H - Corner Kicks</option><option>2H - Offsides</option><option>2H - Throw-in</option><option>2H - Goalkeeper Saves</option><option>2H - Red Cards</option><option>2H - Yellow Cards</option>';
var OStats = OStatsFT + OStats1H + OStats2H;


if (!showSoccerStats) {
    soccerStatsCount = 0;
}

function MyCompareScore(SRef, SCOMP, SOP, T1, T2) {
    var A;
    var B;
    var R;

    T1 = parseInt(T1);
    T2 = parseInt(T2);

    if (SRef == 'TotalScore') {
        A = T1 + T2;
    } else if (SRef == 'AH1') {
        A = T2 - T1;
    } else if (SRef == 'AH2') {
        A = T1 - T2;
    } else if (SRef == 'Team1Score') {
        A = T1;
    } else if (SRef == 'Team2Score') {
        A = T2;
    }

    B = parseFloat(SCOMP);

    if (SOP == 'GT') {
        return A > B;
    } else if (SOP == 'LT') {
        return A < B;
    } else if (SOP == 'GE') {
        return A >= B;
    } else if (SOP == 'LE') {
        return A <= B;
    } else if (SOP == 'EQ') {
        return A == B;
    } else if (SOP == 'NE') {
        return A != B;
    }

    return false;
}

function MyOperationText(SOP) {
    if (SOP == 'GT') {
        return '>';
    } else if (SOP == 'LT') {
        return '<';
    } else if (SOP == 'GE') {
        return '>=';
    } else if (SOP == 'LE') {
        return '<=';
    } else if (SOP == 'EQ') {
        return '==';
    } else if (SOP == 'NE') {
        return '!=';
    }

    return null;
}

function MyFlashscore() {


    //Get Saved
    if (localStorage.getItem('BetterScoreSel') === null) {
        LSSel = [];
    } else {
        LSSel = JSON.parse(localStorage['BetterScoreSel']);
    }

    //--------------------------------------------------------------------------------------------------------------
    // match-summary
    //--------------------------------------------------------------------------------------------------------------
    var uri;
    var re = /.*\/match\/(.*)\/#/;
    if ((uri = re.exec(window.location.href)) !== null) {

        //More Score Top
        if ($('.current-result > .r > .sum').length) {
            T1 = parseInt($('.current-result > .r > span:eq(0)').text());
            T2 = parseInt($('.current-result > .r > span:eq(2)').text());
            sum = T1 + T2;
            diff = T2 - T1;
            if (!isNaN(sum)) {
                $('.current-result > .r > .sum').text(sum + ' | AH1 ' + diff);
            }
        } else {
            if ($('.current-result > .r').length) {
                $('.current-result > .r').append('<div class="sum"></div>');
                MyFlashscore();
            } else {
                if ($('.current-result > .sum').length) {
                    T1 = parseInt($('.current-result > span:eq(0)').text());
                    T2 = parseInt($('.current-result > span:eq(2)').text());
                    sum = T1 + T2;
                    diff = T2 - T1;
                    if (!isNaN(sum)) {
                        $('.current-result > .sum').text(sum + ' | AH1 ' + diff);
                    }
                } else {
                    $('.current-result').append('<div class="sum"></div>');
                    MyFlashscore();
                }
            }
        }

        //Basketball Quarters sum
        if ($('#parts> tbody > tr.odd:first > td').length == 7 && $('#parts> tbody > tr').length <= 3) {
            $('#parts> tbody').append('<tr class="odd"><td></td><td class="Sum"></td><td class="score 1Q"></td><td class="score 2Q"></td><td class="score 3Q"></td><td class="score 4Q"></td></tr>');

            $sum = parseInt($('#parts> tbody > tr:eq(1) >td:eq(1)').text()) + parseInt($('#parts> tbody > tr:eq(2) >td:eq(1)').text());
            $sum1Q = parseInt($('#parts> tbody > tr:eq(1) >td:eq(2)').text()) + parseInt($('#parts> tbody > tr:eq(2) >td:eq(2)').text());
            $sum2Q = parseInt($('#parts> tbody > tr:eq(1) >td:eq(3)').text()) + parseInt($('#parts> tbody > tr:eq(2) >td:eq(3)').text());
            $sum3Q = parseInt($('#parts> tbody > tr:eq(1) >td:eq(4)').text()) + parseInt($('#parts> tbody > tr:eq(2) >td:eq(4)').text());
            $sum4Q = parseInt($('#parts> tbody > tr:eq(1) >td:eq(5)').text()) + parseInt($('#parts> tbody > tr:eq(2) >td:eq(5)').text());

            if (!isNaN($sum)) {
                $('#parts> tbody > tr >td.Sum').text($sum);
            }
            if (!isNaN($sum1Q)) {
                $('#parts> tbody > tr >td.1Q').text($sum1Q);
            }
            if (!isNaN($sum2Q)) {
                $('#parts> tbody > tr >td.2Q').text($sum2Q);
            }
            if (!isNaN($sum3Q)) {
                $('#parts> tbody > tr >td.3Q').text($sum3Q);
            }
            if (!isNaN($sum4Q)) {
                $('#parts> tbody > tr >td.4Q').text($sum4Q);
            }
        }

        // Add comparison options
        if ($('th.header > div').length == 1) {
            $('th.header').append('<div> - Ref:' + SRef + '</div>');
        }

        //Check have saved data	and first load	
        var i;
        var m;
        if (match_summary_first) {
            for (i = 0; i < LSSel.length; i++) {
                if (LSSel[i]['ID'] == uri[1]) {
                    $("#SRef").val(LSSel[i]['SRef']);
                    $("#SCOMP").val(LSSel[i]['SCOMP']);
                    $("#SOP").val(LSSel[i]['SOP']);
                    break;
                }
            }
            match_summary_first = false;
        }
        // Check comparison options
        if ($("#SCOMP").val() && !isNaN(sum)) {
            var R = MyCompareScore($("#SRef option:selected").val(), $("#SCOMP").val(), $("#SOP option:selected").val(), T1, T2);

            if (R) {
                $('#flashscore_column').css("background-color", "#9f9");
            } else {
                $('#flashscore_column').css("background-color", "#f99");
            }

            // add title icons
            /*             var link = document.createElement('link');
                        link.rel = 'shortcut icon';
                        if (R) {
                            link.href = 'http://files.softicons.com/download/application-icons/32x32-free-design-icons-by-aha-soft/ico/Ok.ico';
                        } else {
                            link.href = 'http://files.softicons.com/download/toolbar-icons/max-mini-icons-by-ashung/ico/error.ico ';
                        }
                        document.getElementsByTagName('head')[0].appendChild(link); */
        }
    }

    //--------------------------------------------------------------------------------------------------------------
    // My-Games
    //--------------------------------------------------------------------------------------------------------------
    if ($('li.ifmenu-custom.selected').length === 1) {
        //console.log('My-Games');

        if ($('div.MySRef').length === 0) {
            $('.table-line-bottom:first').after('<div class="MySRef"><label>Ref:</label>' + SRef + '</div>');
        }
        if ($('td.MyRefer').length === 0) {
            $skipnext = false;

            $('.table-main > table > tbody >tr:not([class="blank-line"]) ').each(function() {
                if ($skipnext) {
                    $skipnext = false;
                    return true;
                }


                var FO = null;
                var i;
                for (i = 0; i < LSSel.length; i++) {
                    if ($(this).attr('id').endsWith(LSSel[i]['ID'])) {
                        FO = LSSel[i];
                        break;
                    }
                }
                //console.log(FO);



                if ($(this).parents('table').attr('class') == 'basketball') {
                    if (!!FO) {
                        $(this).append('<td rowspan="2" class="MyRefer" style="nowrap;width: 100px;" sref="' + FO['SRef'] + '" sop="' + FO['SOP'] + '" scomp="' + FO['SCOMP'] + '">' + FO['SRef'] + ' ' + MyOperationText(FO['SOP']) + ' ' + FO['SCOMP'] + '</td>');
                    } else {
                        $(this).append('<td rowspan="2" class="MyRefer" style="nowrap;width: 100px;" >Choose your bet below the table and click here</td>');
                    }
                    $skipnext = true;
                } else {
                    var statshtml = '';

                    if ($(this).parents('table').attr('class') == 'soccer' && showSoccerStats) {
                        for (i = 0; i < soccerStatsCount; i++) {
                            statshtml += '<td id="MyS' + i + '_' + $(this).attr('id').substr(4) + '" style="nowrap;"></td>';
                        }
                    }

                    if (!!FO) {
                        $(this).append('<td class="MyRefer" style="nowrap;width: 100px;" sref="' + FO['SRef'] + '" sop="' + FO['SOP'] + '" scomp="' + FO['SCOMP'] + '">' + FO['SRef'] + ' ' + MyOperationText(FO['SOP']) + ' ' + FO['SCOMP'] + '</td>' + statshtml);
                    } else {
                        $(this).append('<td class="MyRefer" style="nowrap;width: 100px;">Choose your bet below the table and click here</td>' + statshtml);
                    }
                }


            });


            $('.table-main > table > thead >tr >td').each(function() {
                if (parseInt($(this).attr('colspan')) == 8) {
                    $(this).attr('colspan', 9);
                    if ($(this).parents('table').attr('class') == 'soccer' && showSoccerStats) {
                        for (i = 0; i < soccerStatsCount; i++) {
                            $(this).parent().append('<td style="nowrap;width: ' + srw + 'px;"><select style="width:' + srw + 'px" class="SStats' + i + '">' + OStats + '</select></td>');
                        }
                    }

                } else if (parseInt($(this).attr('colspan')) == 11) {
                    $(this).attr('colspan', 12);
                }
            });

            //Kosmetik
            $('.table-main > table > tbody >tr.blank-line > td ').each(function() {
                $(this).attr('colspan', $(this).attr('colspan') + 1);
            });
            if (fixedwidth) {
                var addwidth = 100 + soccerStatsCount * srw;
                $('div.container > .content').width($('div.container > .content').width() + addwidth);
                $('#fsbody').width($('#fsbody').width() + addwidth);
                $('.table-main > table.soccer  .stats-link').css('right', addwidth + 'px');
                fixedwidth = false;
            }




            // Save Changes from Select/Options
            $('.MyRefer').on('click', function(e) {
                e.stopPropagation();
                //console.log($(this));                

                var SRef = $("#SRef option:selected").val();
                var SOP = $("#SOP option:selected").val();
                var SCOMP = $("#SCOMP").val();
                var reb = /.+_.+_(.*)/;
                var m = reb.exec($(this).parent().attr('id'));
                var ID = m[1];
                MakeSave(ID);

                //Set Attr ad Displaytext
                $(this).attr('SRef', SRef);
                $(this).attr('SOP', SOP);
                $(this).attr('SCOMP', parseFloat(SCOMP));
                $(this).text(SRef + ' ' + MyOperationText(SOP) + ' ' + SCOMP);
            });
            $('.MyRefer').on('mouseover', function(e) {
                e.stopPropagation();
            });
        }

        $('td.MyRefer').each(function() {
            if ($(this).is('[SRef]')) {
                var T1, T2;
                var re = /(\d+).-.(\d+)/;

                if ((m = re.exec($($(this).parent()).find('.score').text())) !== null) {
                    T1 = m[1];
                    T2 = m[2];
                } else if ($($(this).parent()).find('.score-home').text() !== '') {
                    T1 = $($(this).parent()).find('.score-home').text();
                    T2 = $($(this).parent()).next().find('.score-away').text();

                }

                if (!isNaN(parseInt(T1))) {
                    var R = MyCompareScore($(this).attr('SRef'), parseFloat($(this).attr('SCOMP')), $(this).attr('SOP'), T1, T2);
                    //console.log($(this).attr('SRef'), $(this).attr('SCOMP'), $(this).attr('SOP'),R,T1,T2);

                    if (R) {
                        $(this).css("background-color", "#9f9");
                    } else {
                        $(this).css("background-color", "#f99");
                    }
                }
            }
        });
    }
}




function MyFlashscoreStats() {
    if ($('li.ifmenu-custom.selected').length === 1) {
        $('.table-main > table.soccer').each(function() {
            var i;
            var k;
            var action = {};
            var c = 0;
            $(this).find("select option:selected").each(function() {
                action['MyS' + c] = $(this).text();
                c++;
            });

            $(this).find('tr[id]').each(function() {
                action['gid'] = $(this).attr('id').substr(4);
                var x = cjs.feedRequest._createAjaxJqObject(
                    'http://d.flashscore.com/x/feed/d_st_' + action['gid'] + '_en_1',
                    function(status, header, data, json) {
                        var respond = $('<html />').html(data);
                        //console.log( respond ); 
                        //console.log( 'json:'+json );
                        var opt = JSON.parse(json);

                        //Get all Stats
                        var stats = [];
                        for (i = 0; i < 3; i++) {
                            stats[i] = [];
                            respond.find('#tab-statistics-' + i + '-statistic tr').each(function() {
                                var tds = $(this).find('td');
                                if (tds.length == 3) {
                                    var v = [];
                                    for (k = 0; k < 3; k++) {
                                        v[k] = $(tds[k]).text();
                                    }
                                    stats[i].push(v);
                                }
                            });
                        }
                        //console.log(stats);

                        for (i = 0; i < soccerStatsCount; i++) {
                            var m = 0;
                            var n = opt['MyS' + i].split(" - ");
                            if (n[0] == 'FT') {
                                m = 0;
                            } else if (n[0] == '1H') {
                                m = 1;
                            } else if (n[0] == '2H') {
                                m = 2;
                            }

                            for (k = 0; k < stats[m].length; k++) {
                                if (stats[m][k][1] == n[1]) {
                                    $('#MyS' + i + '_' + opt['gid']).text(stats[m][k][0] + ' : ' + stats[m][k][2]);
                                    break;
                                }
                            }
                        }
                    }, JSON.stringify(action)
                );
                x.update();

            });
        });
    }
    setTimeout(function() {
        MyFlashscoreStats();
    }, 10000);
}




function MakeSave(ID) {
    //Get Saved
    if (localStorage.getItem('BetterScoreSel') === null) {
        LSSel = [];
    } else {
        LSSel = JSON.parse(localStorage['BetterScoreSel']);
    }

    var SRef = $("#SRef option:selected").val();
    var SOP = $("#SOP option:selected").val();
    var SCOMP = $("#SCOMP").val();
    var TS = new Date().getTime();

    //Remove old timestamps (5 Days)
    for (var i = 0; i < LSSel.length; i++) {
        if ((LSSel[i]['TS'] + 432000000) <= TS) {
            LSSel.splice(i, 1);
        }
    }
    //Remove old values
    for (i = 0; i < LSSel.length; i++) {
        if (LSSel[i]['ID'] == ID) {
            LSSel.splice(i, 1);
            break;
        }
    }

    //Add new values and saved
    LSSel.push({
        SRef: SRef,
        SOP: SOP,
        SCOMP: SCOMP,
        TS: TS,
        ID: ID
    });
    localStorage.setItem('BetterScoreSel', JSON.stringify(LSSel));
}


var match_summary_first = true;
var fixedwidth = true;
var sum = 0;
var diff = 0;
var T1 = 0;
var T2 = 0;

$('th.header').change(function() {
    var uri;
    var re = /.*\/match\/(.*)\/#/;
    if ((uri = re.exec(window.location.href)) !== null) {
        MakeSave(uri[1]);
    }
    MyFlashscore();
});

$(document).ready(function() {
    setInterval(function() {
        MyFlashscore();
    }, 1000);
    if (showSoccerStats) {
        setTimeout(function() {
            MyFlashscoreStats();
        }, 2000);
    }
});