// ==UserScript==
// @name Flashscore Better Score
// @namespace Flashscore
// @version 0.6
// @include http://www.flashscore.com/*
// @include http://www.flashscore.de/*
// @description Adds score evaluation, view TotalScore, AH1,AH2 (+ 1H and 1P) at matchdetails and can show soccer game stats on mygames tab.
// @author [email protected]
// @license Creative Commons (by-nc-sa); http://creativecommons.org/licenses/by-sa/4.0/
// @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;
//browser compatible
if(!String.prototype.startsWith){
String.prototype.startsWith = function (str) {
return !this.indexOf(str);
}
}
if(!String.prototype.endsWith){
String.prototype.endsWith = function (s) {
return this.indexOf(s, this.length - s.length) !== -1;
}
}
function isInt(n){
return Number(n) === n && n % 1 === 0;
}
if (typeof String.prototype.translate !== 'function') {
String.prototype.translate = function (o) {
return this.replace(/{([^{}]*)}/g, function (a, b) {
var r = o[b];
return typeof r === 'string' ? r : a;
});
};
}
var SRefD = '<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><option value="1H_AH1">1H_AH1</option><option value="1H_AH2">1H_AH2</option><option value="1H_TotalScore">1H_TotalScore</option><option value="1P_AH1">1P_AH1</option><option value="1P_AH2">1P_AH2</option><option value="1P_TotalScore">1P_TotalScore</option>';
var SOPD = '</select> OP:<select ID="SOP"><option value="LT"><</option><option value="GT">></option><option value="LE">≤</option><option value="GE">≥</option><option value="EQ">≡</option><option value="NE">≠</option>';
var COMPD = '</select> COMP:<input type="number" id="SCOMP" value="0" step="0.5">';
var SelDef = SRefD + SOPD + COMPD;
var OStatsFT = '<option>FT - {a}</option><option>FT - {b}</option><option>FT - {c}</option><option>FT - {d}</option><option>FT - {e}</option><option>FT - {f}</option><option>FT - {g}</option><option>FT - {h}</option><option>FT - {i}</option><option>FT - {j}</option><option>FT - {k}</option><option>FT - {l}</option><option>FT - {m}</option>';
var OStats1H = '<option>1H - {a}</option><option>1H - {b}</option><option>1H - {c}</option><option>1H - {d}</option><option>1H - {e}</option><option>1H - {f}</option><option>1H - {g}</option><option>1H - {h}</option><option>1H - {i}</option><option>1H - {j}</option><option>1H - {k}</option><option>1H - {l}</option><option>1H - {m}</option>';
var OStats2H = '<option>2H - {a}</option><option>2H - {b}</option><option>2H - {c}</option><option>2H - {d}</option><option>2H - {e}</option><option>2H - {f}</option><option>2H - {g}</option><option>2H - {h}</option><option>2H - {i}</option><option>2H - {j}</option><option>2H - {k}</option><option>2H - {l}</option><option>2H - {m}</option>';
var OStatsDef = OStatsFT + OStats1H + OStats2H;
var translateCOM = {a:'Ball Possession',b:'Goal Attempts',c:'Shots on Goal',d:'Shots off Goal',e:'Blocked Shots',f:'Free Kicks',g:'Corner Kicks',h:'Offsides',i:'Throw-in',j:'Goalkeeper Saves',k:'Red Cards',l:'Yellow Cards',m:'Fouls'};
var translateDE = {a:'Ballbesitz',b:'Torversuche',c:'Schüsse aufs Tor',d:'Schüsse neben das Tor',e:'Blocked Shots',f:'Freistöße',g:'Eckbälle',h:'Abseits',i:'Einwürfe',j:'Gehaltene Bälle',k:'Rote Karten',l:'Gelbe Karten',m:'Fouls'};
if(document.domain.endsWith('.de')){
console.log('Translate to German');
var OStats = OStatsDef.translate(translateDE);
} else {
console.log('Translate to English');
var OStats = OStatsDef.translate(translateCOM);
}
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.endsWith('TotalScore') ){
A = T1 + T2;
} else if (SRef.endsWith('AH1') ){
A = T2 - T1;
} else if (SRef.endsWith('AH2') ){
A = T1 - T2;
} else if (SRef.endsWith('Team1Score') ){
A = T1;
} else if (SRef.endsWith('Team2Score') ){
A = T2;
}
B = parseFloat(SCOMP);
C = isInt(B);
if (SOP == 'GT') {
if(C && B == A) return 2;
return A > B;
} else if (SOP == 'LT') {
if(C && B == A) return 2;
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 0;
}
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:' + SelDef + '</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 CT1;
var CT2;
if( $("#SRef option:selected").val().startsWith('1H_') ){
if( $('body.basketball').length > 0){
CT1 = parseInt($('.p1_home').text())+ parseInt($('.p2_home').text());
CT2 = parseInt($('.p1_away').text())+ parseInt($('.p2_away').text());
} else {
CT1 = $('.p1_home').text();
CT2 = $('.p1_away').text();
}
} else if( $("#SRef option:selected").val().startsWith('1P_') ){
CT1 = $('.p1_home').text();
CT2 = $('.p1_away').text();
} else {
CT1 = T1;
CT2 = T2;
}
var R = MyCompareScore($("#SRef option:selected").val(), $("#SCOMP").val(), $("#SOP option:selected").val(), CT1, CT2);
console.log($("#SRef option:selected").val(), $("#SCOMP").val(), $("#SOP option:selected").val(), R, CT1, CT2);
if (R == 1) {
$('#flashscore_column').css("background-color", "#9f9");
}
else if (R == 2) {
$('#flashscore_column').css("background-color", "#ff9");
}
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>' + SelDef + '</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);
}
}
});
$('.head_ab').each(function() {
$(this).parent().append('<td></td>');
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>');
}
}
});
//Kosmetik
$('.table-main > table > tbody >tr.blank-line > td ').each(function() {
$(this).attr('colspan', $(this).attr('colspan') + 1);
});
$('.stats-link').css({'position':'relative','float':'right'});
if (MyGamesRunOne) {
var addwidth = 100 + soccerStatsCount * srw;
$('div.container > .content').width($('div.container > .content').width() + addwidth);
$('#fsbody').width($('#fsbody').width() + addwidth);
MyGamesRunOne = 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 = '';
if( $(this).attr('SRef').startsWith('1H_') ){
re = /\((\d+).-.(\d+)\)/;
if ((m = re.exec($($(this).parent()).find('.cell_sb').text())) !== null) {
T1 = m[1];
T2 = m[2];
} else {
if ($(this).parents('table').attr('class') == 'basketball') {
T1 = parseInt($($(this).parent()).find('.cell_sd').text()) + parseInt($($(this).parent()).find('.cell_se').text());
T2 = parseInt($($(this).parent()).next().find('.cell_tb').text()) + parseInt($($(this).parent()).next().find('.cell_tc').text());
} else {
T1 = $($(this).parent()).find('.cell_sd').text();
T2 = $($(this).parent()).next().find('.cell_tb').text();
}
}
}
else if( $(this).attr('SRef').startsWith('1P_') ){
T1 = $($(this).parent()).find('.cell_sd').text();
T2 = $($(this).parent()).next().find('.cell_tb').text();
}
else {
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 == 1) {
$(this).css("background-color", "#9f9");
}
else if (R == 2) {
$(this).css("background-color", "#ff9");
}
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);
if(document.domain.endsWith('.de')){
var url = 'http://d.flashscore.de/x/feed/d_st_' + action['gid'] + '_de_1';
} else {
var url = 'http://d.flashscore.com/x/feed/d_st_' + action['gid'] + '_en_1';
}
var x = cjs.feedRequest._createAjaxJqObject(
url,
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 MyGamesRunOne = 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);
}
});