// ==UserScript==
// @name FCup Script
// @description This script aims to improve the game appearance and increase your gaming experience by adding new features. Under the MIT license the script is reproduced and further distributed. Copyright: Criyessei | mot33
// @version 3.7.1.7
// @icon https://i.ibb.co/tJC5RX3/HFWRRt6.png
// @namespace https://greasyfork.org/users/83290
// @author Criyessei | mot33
// @homepage https://www.fcup-tools.de/tool
// @supportURL https://forum.fussballcup.de/showthread.php?t=417372
// @include /^https?:\/\/(futbolcup.net|fussballcup.(de|at)|futbolcup.pl|footcup.fr|footballcup.nl).+/
// @require https://code.jquery.com/jquery-3.3.1.min.js
// @require https://code.jquery.com/ui/1.12.1/jquery-ui.min.js
// @require https://greasyfork.org/scripts/441421-t%C5%82umaczenia/code/T%C5%82umaczenia.js?version=1027588
// @compatible chrome
// @compatible firefox
// @compatible opera
// @connect greasyfork.org
// @grant GM_getValue
// @grant GM_setValue
// @grant GM_deleteValue
// @grant GM_listValues
// @grant GM_addStyle
// @grant GM_xmlhttpRequest
// @grant unsafeWindow
// @license MIT
// @run-at document-body
// @noframes
// ==/UserScript==
/* eslint no-eval: 0, no-implicit-globals: 0, no-native-reassign: 0, curly: 0, no-proto: 0 */
/* global $, currentLive, worldId, toolTipObj, plObj, SelectBox, closeFocus, toolPipe*/ //jquery script and Game veriables
/* other dependencies game functions: (these functions will be modified)
1. showServerTime: Necessary to take the server's time. [Temporary Modify]
2. updateLayout: Necessary to understand that the page has changed and to detect that goals have been scored in other matches on the live match page. [Permanent Modify]
3. Live: Neccessary to get old or new match events and to detect when the match is end on the live match page. [Permanent Modify]
4. openCard: Necessary to display captain image. [Permanent Modify]
*/
/* global Translate */ //Translation.js
"use strict";
if(location.protocol!='https:'){ //Routing to secure protocol
let pageHref = location.href;
location.href = 'https'+pageHref.substring(pageHref.indexOf(':'));
return;
}
else if(location.search.indexOf('action=logout')!=-1){
location.href = location.origin; //Go main page
return;
}
let serversDatas = {
"tr":{
"flag" : "TUR",
"language" : "Turkish",
"footballerPositions" : ["KL", "DD", "DI", "OD", "OL", "OR", "OH", "FO"],
"leagues" : [
"2. Amatör Lig",
"1. Amatör Lig",
"Süper Amatör Lig",
"Bölgesel Amatör Lig",
"TFF 3.Lig",
"TFF 2.Lig",
"Spor Toto 1.Lig",
"Spor Toto Süper Lig"
],
"replaceClubName" : "'den Profil",
"ScriptAuthorClubId" : "670524",
"ClubExchange" : "Kulüp Değiştirme",
"bidTexts" : {
'accept': 'kabul edildi',
'reject': 'reddedildi',
'read' : 'okundu',
'new' : 'yeni'
},
'news' : {
"youngPlayer": {"title":'Genç Oyuncu',"beforeName":"yetiyor.","afterName":"Detaylı incele"},
"increaseBid": {"title":"Transfer Pazarı","control":"tarafından geçildi.","beforeName":"Transfer Pazarı","afterName":"için transfer teklifin"},
"sellPlayer" : {"title":"Assistent: Transfer Pazarı","control":"yıllık kontrat imzaladı","beforeName":"</h2>","afterName":", <div"}
},
"ageDates" : [26483328, 26527104, 26570880, 26614656, 26658432, 26702208, 26746104, 26789880, 26833656, 26877432, 26921208, 26964984, 27008760, 27052536, 27096312, 27140088, 27183864, 27227640, 27271416, 27315192, 27358968, 27402744, 27446520, 27490296, 27534072, 27577848, 27621624, 27665400, 27709176, 27752952, 27796728, 27840504, 27884280, 27928056, 27971832, 28015608, 28059384, 28103160, 28146936, 28190712, 28234488, 28278264, 28322040, 28365816, 28409592, 28453368, 28497144, 28540920, 28584696, 28628472, 28672248],
},
"de":{
"flag" : "DEU",
"language" : "German", /*The game language*/
"footballerPositions" : ["TW", "AV", "IV", "DM", "LM", "RM", "OM", "ST"],
"leagues" : [
"Kreisliga",
"Landesliga",
"Verbandsliga",
"Oberliga",
"Regionalliga",
"3. Liga",
"2. Bundesliga",
"1. Bundesliga"
],
"replaceClubName" : "Profil von",
"ScriptAuthorClubId" : "1286060",
"ClubExchange" : "Vereinswechsel",
"bidTexts" : {
'accept': 'akzeptiert',
'reject': 'abgelehnt',
'read' : 'gelesen',
'new' : 'neu'
},
'news' : {
"youngPlayer": {"title":'Jugendspieler',"beforeName":"diesen ","afterName":" mal"},
"increaseBid": {"title":"Transfermarkt","control":"überboten","beforeName":"für ","afterName":" wurde"},
"sellPlayer" : {"title":"Assistent: Transfermarkt","control":"ausgehandelt","beforeName":"Spieler ","afterName":" hat"}
},
"ageDates" : [26402796, 26446632, 26490408, 26534184, 26579400, 26621736, 26665512, 26709288, 26753004, 26796780,26840676,26884452,26928228,26972004,27015780,27059556,27103332,27147108,27190884,27234660,27278436,27322212, 27365988, 27409764, 27453540, 27497316, 27541092, 27584868, 27628644, 27672420, 27716196, 27759972, 27803748, 27847524, 27891300, 27935076, 27978852, 28022628, 28066404, 28110180, 28153956, 28197732, 28241508, 28285284, 28329060, 28372836, 28416612, 28460388, 28504164, 28547940, 28591716, 28635492, 28679268, 28723044, 28766820, 28810596, 28854372, 28898148, 28941924, 28985700, 29029476, 29073252, 29117028, 29160804, 29204580, 29248356, 29292132, 29335908, 29379684, 29423460, 29467236, 29511012, 29554788, 29598564, 29642340, 29686116, 29729892, 29773668, 29817444, 29861220, 29904996, 29948772, 29992548, 30036324, 30080100, 30123876],
},
"at":{
"flag" : "AUT",
"language" : "German",
"footballerPositions" : ["TW", "AV", "IV", "DM", "LM", "RM", "OM", "ST"],
"leagues" : [
"2. Klasse",
"1. Klasse",
"Gebietsliga",
"2. Landesliga",
"Landesliga",
"Regionalliga",
"Erste Liga",
"Österreichische Bundesliga"
],
"replaceClubName" : "Profil von",
"ScriptAuthorClubId" : "1510674",
"ClubExchange" : "Vereinswechsel",
"bidTexts" : {
'accept': 'akzeptiert',
'reject': 'abgelehnt',
'read' : 'gelesen',
'new' : 'neu'
},
'news' : {
"youngPlayer": {"title":'Jugendspieler',"beforeName":"diesen ","afterName":" mal"},
"increaseBid": {"title":"Transfermarkt","control":"überboten","beforeName":"für ","afterName":" wurde"},
"sellPlayer" : {"title":"Assistent: Transfermarkt","control":"ausgehandelt","beforeName":"Spieler ","afterName":" hat"}
},
"ageDates" : [26542884,26588100,26630436,26674212,26717988,26761764,26805540, 26849316, 26893092, 26936868, 26980644, 27024420, 27068196, 27111972, 27155748, 27199524, 27243300, 27287076, 27330852, 27374628, 27418404, 27462180, 27505956, 27549732, 27593508, 27637284, 27681060, 27724836, 27768612, 27812388, 27856164, 27899940, 27943716, 27987492, 28031268, 28075044, 28118820, 28162596, 28206372, 28250148, 28293924, 28337700, 28381476, 28425252, 28469028, 28512804, 28556580],
},
"pl":{
"flag" : "POL",
"language" : "Polish",
"footballerPositions" : ["BR", "OZ", "OŚ", "DP", "LP", "PP", "OP","N"],
"leagues" : [
"Klasa B",
"Klasa A",
"Liga okręgowa",
"4 Liga",
"3 Liga",
"2 Liga",
"1 Liga",
"Ekstraklasa"
],
"replaceClubName" : "Profil",
"ScriptAuthorClubId" : "2074",
"ClubExchange" : "Zmienia klub",
"bidTexts" : {
'accept': 'Zaakceptowane',
'reject': 'Odrzucone',
'read' : 'przeczytana',
'new' : 'nowy'
},
'news' : {
"youngPlayer": {"title":'Junior',"beforeName":"dokładniej","afterName":"i zaproś"},
"increaseBid": {"title":"Rynek transferowy","control":"została przebita przez","beforeName":"spłaty za","afterName":"została"},
"sellPlayer" : {"title":"Assistent: Rynek transferowy","control":"periodzie rynku transferowego","beforeName":"</h2>","afterName":"wynegocjował"}
},
"ageDates" : [26196708, 26240484, 26284260, 26328036, 26371812, 26415588, 26459364, 26503140, 26546916, 26590692, 26634468, 26678244, 26722020, 26765796, 26809572, 26853348, 26897124, 26940900, 26984676, 27028452, 27072228, 27116004, 27159780, 27203556, 27247332, 27291108, 27334884, 27378660, 27422436, 27466212, 27509988, 27553764, 27597540, 27641316, 27685092, 27728868, 27772644, 27816420, 27860196, 27903972, 27947748, 27991524, 28035300, 28079076, 28122852, 28166628, 28210404, 28254180, 28297956, 28341732, 28385508, 28429284, 28473060, 28516836, 28560612, 28604388, 28648164, 28691940, 28735716, 28779492, 28823268, 28867044, 28910820, 28954596, 28998372, 29042148, 29085924, 29129700, 29173476, 29217252, 29261028, 29304804, 29348580, 29392356, 29436132, 29479908, 29523684, 29567460, 29611236, 29655012, 29698788, 29742564, 29786340, 29830116, 29873892],
},
"fr":{
"flag" : "FRA",
"language" : "French",
"footballerPositions" : ["GB", "DL", "DC", "Mdf", "MG", "MD", "MO", "BT"],
"leagues" : [
"PH",
"DHR",
"DH",
"CFA 2",
"CFA",
"National",
"Ligue 2",
"Ligue 1"
],
"replaceClubName" : "Profil de",
"ScriptAuthorClubId" : "169948",
"ClubExchange" : "Clubs Changer",
"bidTexts" : {
'accept': 'approuvé',
'reject': 'rejeté',
'read' : 'lu',
'new' : 'nouveau'
},
'news' : {
"youngPlayer": {"title":'Jeune joueur',"beforeName":"d'œil sur ce","afterName":"..."},
"increaseBid": undefined,
"sellPlayer" : undefined
},
"ageDates" : [25733556, 25778772, 25821109, 25864884, 25908660, 25952436, 25996212, 26039988, 26083764, 26127540, 26171316, 26215092, 26258868, 26302644, 26346420, 26390196, 26433972, 26477748, 26521524, 26565300, 26609076, 26652852, 26696628, 26740404, 26784180, 26827956, 26871732, 26915508, 26959284, 27003060, 27046836, 27090612, 27134388, 27178164, 27221940, 27265716, 27309492, 27353268, 27397044, 27440820, 27484596, 27528372, 27572148, 27615924, 27659700, 27703476, 27747252, 27791028, 27834804, 27878580, 27922356],
},
"nl":{
"flag" : "NLD",
"language" : "Dutch",
"footballerPositions" : ["GK", "VV", "CV", "DM", "LM", "RM", "AM", "AV"],
"leagues" : [
"4e Klasse",
"3e Klasse",
"2e Klasse",
"1e Klasse",
"Hoofdklasse",
"Topklasse",
"1e Divisie",
"Eredivisie"
],
"replaceClubName" : "Profiel van",
"ScriptAuthorClubId" : "108310",
//Aşağıdaki kısım düzeltilmeli!
"ClubExchange" : "Kulüp Değiştirme",
"bidTexts" : {
'accept': 'Geaccepteerd',
'reject': 'Afgewezen',
'read' : 'Gelezen',
'new' : 'Nieuw'
},
'news' : {
"youngPlayer": {"title":'Jeugdspeler',"beforeName":"De speler","afterName":"zou zeker"},
"increaseBid": {"title":"Transfer markt","control":"overboden","beforeName":"transferbod op","afterName":"werd door"},
"sellPlayer" : undefined,
},
"ageDates" : undefined
}
};
let GetText = (key, opt={tag:1})=>Translate.getText(key, opt);
class Page{
constructor(name, page_selector,run=null,sub_pages=null,parent_page=null){
this.name = name;
if(parent_page!==null) this.parent_page = parent_page;
this.page_selector = page_selector;
if(run!=null) this.run = run;
this.features = [];
this.features.getByName = function(n){
return this.find(f=>f.name==n);
};
if(Array.isArray(sub_pages) && sub_pages.length) this.sub_pages = sub_pages;
}
addFeature(feature){
this.features.push(feature);
}
getActiveFeatures(){
return this.features.filter(f=>f.active);
}
parentsByName(name){
let temp = this.parent_page;
while(temp instanceof Page && temp.name!=name) temp = temp.parent_page;
return temp;
}
findPath(){
let temp = this.parent_page,
path = this.name;
while(temp instanceof Page){
path=temp.name+"->"+path;
temp=temp.parent_page;
}
return path;
}
}
let Game = new (class{
constructor(){
this.currentPage = null;
this.pages = [];
this.pages.getByName = function(name){
let names = name.split('->');
if(names.length==1) return this.find(p=>p.name==names[0]);
try{
return eval("this.getByName('"+names.join("').sub_pages.getByName('")+"')");
}
catch(err){
return undefined;
}
};
this.pages.add = function(name, page_selector, run=null, sub_pages=null, parent_page=null){
let page = (parent_page instanceof Page?parent_page.sub_pages:this).getByName(name);
if(page instanceof Page) throw new Error(`A page with this name(${name}) was previously created in ${parent_page===null?'game page as top page':'sub pages of '+parent_page.name + ' page'}`);
page = new Page(name, page_selector, run, sub_pages, parent_page);
if(Array.isArray(sub_pages)){
if(!Array.isArray(sub_pages[0])) sub_pages=[sub_pages];
page.sub_pages = sub_pages;
page.sub_pages.getByName = Game.pages.getByName;
page.sub_pages.forEach((sub_page,i)=>{
page.sub_pages[i] = Game.pages.add(
sub_page[0], //name
sub_page[1], //page_selectort
sub_page.length>2?sub_page[2]:null, //page run function
sub_page.length>3?sub_page[3]:null, //page sub pages
page
)
});
}
if(parent_page!==null) return page; //this page is sub page
this.push(page);
};
this.link = new (function(){
this.pr = {};
this.on = function(a){
if(!Array.isArray(a)) a = [a];
for(let i=0,len=a.length;i<len;i++){
for(let p in a[i]){
let v=a[i][p];
if(!Array.isArray(v)) v = [v];
if(!(this.pr.hasOwnProperty(p) && v.includes(this.pr[p]))) return 0;
}
}
return 1;
}
})();
}
pageLoad(){// USE in async function: await PageLoad();
return new Promise(function(res,rej){
setTimeout(function(){
if(!$('#body').hasClass('loading')) res(10);
else{
let counter=0,
a = setInterval(function(){
++counter;
if(!$('#body').hasClass('loading')){
clearInterval(a);
res(counter*50);
}
},50);
}
},10);
});
}
async initialConfigure(){
delete this.__proto__.initialConfigure;
this.timeDifference = (
await this.getInitialServerTime()
+ Math.round(Math.abs(window.performance.timing.responseEnd-window.performance.timing.requestStart)/2)
+ new Date().getTime()-window.performance.timing.responseEnd
) - new Date().getTime(); //Difference between server and pc
/*printServerTime();
setInterval(printServerTime,1000);
function printServerTime(){
console.clear();
console.log(
'Server Time: '+$('#server-time').text()+
'\nTool Time : '+new Date(Game.getTime()).toLocaleTimeString()+
'\nPC Time : '+new Date().toLocaleTimeString()
);
}*/
let z_index = parseInt($('#chatToggleBtn').css('z-index'));
if(!isNaN(z_index)){
let z_index_ = parseInt($('#feedback').css('z-index'))||0;
if(z_index_<=z_index) $('#feedback').css('z-index',z_index+1);
}
}
giveNotification(NotificationType,Text){
$('#feedback').prepend(
`<p class="${NotificationType?'notice':'error'}" style="left: 0px;${NotificationType?'background:#1ba0de;border: 1px solid #000000;':''}">`+
` <span class="icon"></span>`+Text+
`</p>`
);
$('#feedback p:not(.minified)').each(function(a,e){
$(e).css('left',($(document).width() - $(e).outerWidth()) / 2);
setTimeout(()=>{
$(e).addClass('minified').css({left : 0});
},4000);
});
$('#feedback p').each(function(key){
if(key>19) {
$(this).slideUp(function(){
$(this).remove();
});
}
});
}
getInitialServerTime(){
delete this.__proto__.getInitialServerTime;
return new Promise(function(res,rej){
$('<button id="TimeTrigger">').hide().appendTo('body').click(function(){
$(this).off().remove();
let server_time = JSON.parse($(this).attr('server_time'));
Tool.modifyGameFunction('showServerTime',function(content){
return content.substring(content.indexOf('/*{end}*/')+9);
});
res(server_time);
});
Tool.modifyGameFunction('showServerTime',function(content){
return `$('#TimeTrigger').attr('server_time',
(function getServerTime(args){
args[1] = parseInt(args[1])-1; // month [0-11]
return new Date(...args).getTime();
})([...arguments])
).click();/*{end}*/` + content;
});
});
}
getTime(){
return this.timeDifference+new Date().getTime();
}
async detectPage(clear=true){
if(clear) console.clear();
console.log('Game Time: ' + new Date(this.getTime()).toLocaleString());
await Game.pageLoad();
this.link.pr = location.hash.substring(location.hash.indexOf('?')+1).split('&').reduce((acc, i)=>{
let parts = i.split('=');
acc[parts[0]] = parts[1];
return acc;
}, {});
//Problem : https://forum.fussballcup.de/showpost.php?p=7513019&postcount=1
$('#content table:has(.open-card)').each(function(){
if($(this).width()>942){
$(this).css({'display':'block','overflow-x':'auto'});
}
});
function find_page(pages){ //BFS Search
if(!Array.isArray(pages) || !pages.length) return undefined;
let page = pages.find(page=>{
return Game.link.on(page.page_selector);
});
if(page!==undefined) return page;
let pages_ = [];
pages.filter(page=>{
return page.sub_pages && Array.isArray(page.sub_pages) && page.sub_pages.length;
}).forEach(page=>{
pages_.push(...page.sub_pages);
});
return find_page(pages_);
}
let prev_page = this.currentPage;
this.currentPage = find_page(this.pages);
console.log('Current Page : ' + (this.currentPage||{}).name+ (prev_page==null?"":"\nPrevious Page: " + prev_page.name));
if(prev_page instanceof Page){
if(prev_page.name=="tournament"){
if(this.currentPage.name!="tournament" && Tool.hasOwnProperty('tournaments_data')) delete Tool.tournaments_data;
}
else if(prev_page.findPath()=='live->match'){
if(typeof unsafeWindow.timeout_1 != 'undefined') clearTimeout(unsafeWindow.timeout_1);
}
//Özelliklerin olduğu tablo temizleniyor. Çünkü sayfa değiştirildi ve bu sayfada başka özellikler olabilir.
Tool.featuresList.clear();
//Önceki sayfalardan kalan sayaçlar sıfırlanıyor.
Tool.intervals.clear();
}
if(this.currentPage == undefined){
$('#featureList').after(
`<p class="not-detected-info" style="color:red; font-weight:bold; text-align:center; border:1px dotted gray; border-radius:7px; margin:10px 0"${GetText('notdetected')}"</p>`
);
}
else{
$('#ScriptMenu .not-detected-info').remove();
if(typeof this.currentPage.run == 'function') this.currentPage.run();
this.currentPage.getActiveFeatures().forEach(f=>{
f.work = false !== f.run();
});
//Sayfalarda çalışan özelliklerin olduğu tablo gösteriliyor
Tool.featuresList.show(this.currentPage.features);
}
//Bir sonraki yaş atlamaya kalan süre sayaç şeklinde en alt menüye ekleniyor.
(()=>{
let sTime = Game.getTime(),
ageDates = Tool.ageDates;
if(!Array.isArray(ageDates) //Yaş atlama tarihleri mevcut değilse
|| $('#FutureAge').length //Geri sayım sayacı bulunuyorsa
|| ageDates[ageDates.length-1]*60000<sTime //Server zamanı, yaş atlama tarihlerinin sonuncusundan büyükse
) return;
let nextAgeDate = ageDates.find(date=>date*60000>sTime);
if(nextAgeDate === undefined){
return;
}
nextAgeDate*=60000;
let remainingTime = parseInt((nextAgeDate-sTime)/1000);//Yaş atlamaya kalan saniye hesaplanıyor.
$('#footer > div').css('width','300px');
$('#footer > .server-infos').prepend(
`<li style="padding: 4px 5px;font-size:12px;" title="${new Date(nextAgeDate).toLocaleString()}">`+
` ${GetText('NewAge')} : <label id="FutureAge">${SecToTime(remainingTime--)}</label>`+
`</li>`
);
Tool.intervals.create(function(){ //eslint-disable-line no-loop-func
$('#FutureAge').html(SecToTime(remainingTime--));
if(remainingTime<1){
$('#FutureAge').html('Yaş Atladı');
this.delete();
}
},1000);
})();
//Sayfanın düzeltildiği ana başlığa bildiriliyor.
$('#content').find('h2').first().attr('Fixed',this.getTime());
}
startDetectingPageChanging(){
delete this.__proto__.startDetectingPageChanging;
Tool.modifyGameFunction(//The function named updateLayout are needed update for the FCUP Script. Because when the page change, fcup script should work then.
'updateLayout',
function(content){
content = `\ntry{\nconsole.log("run updateLayout");`+ content + `\n}\ncatch(e){\nconsole.error('updateLayout: %o',e);}\n$('#ChangeContent').click();`;
let idx = content.indexOf('scores.php?world');
if(idx==-1) return content;
let idx2 = content.substring(idx).search(/function\s*\(\s*transport/);
if(idx2==-1) return content;
idx = content.indexOf('{',idx+idx2);
if(idx==-1) return content;
++idx;
if(!Tool.hasOwnProperty('goalTrigger')) Tool.goalTrigger = 0;
Tool.goalTrigger+=2;
return content.substring(0,idx)+
GetFuncContent(()=>{
if($('#NewGoalCatcher').length){/*This codes were written by FCUP Script.*/
try{
var datas = JSON.parse(transport); /*eslint-disable-line no-undef*/
for(let matchId in datas){
let data = datas[matchId], score = $('#'+matchId+' > .score');
if($('#MatchEndCatcher').length && data.status=="ended") $('#MatchEndCatcher').trigger('click', [matchId]);
if(
[data.home_goals, data.away_goals].find(v=>[null, undefined].includes(v))!==undefined ||
data.home_goals==parseInt(score.find('.score-home').text()) &&
data.away_goals==parseInt(score.find('.score-away').text())
){
delete datas[matchId];
continue;
}
}
if(Object.keys(datas).length) $('#NewGoalCatcher').trigger('click', [datas]);
}catch(err){ console.error(err);}
}
}) + content.substring(idx);
}
);
}
getPage(url,querySelector=null,callBack=null,fail=0,layoutData=null){
//let argNames = ['url','querySelector','callBack','fail','layoutData'];
//console.log(`[getPage] ${url}, arguments: %o`, Array.from(arguments).slice(1).reduce((acc,i,idx)=>{acc[argNames[idx+1]]=i;return acc;},{}));
return new Promise((res,rej)=>{
$.get(url, function(response){
let layout = url.indexOf('&layout=none')!=-1,
page = $('<html>').html(layout?response.content:response);
let newSecureId = page.find('input[name="secureId"][type="hidden"]');
if(newSecureId.length) $('body').find('input[name="secureId"][type="hidden"]').val(newSecureId.first().val());
if(layout && layoutData!=null){
if(!Array.isArray(layoutData)){
if(typeof layoutData != "string") throw new Error("layoutData must be array or string");
layoutData = [layoutData];
}
let data = Object.entries(response).filter(i=>layoutData.includes(i[0])), r;
if(querySelector != null && (r = data.find(i=>i[0]=='content'))!==undefined) r[1]=page.find(querySelector);
res(Object.fromEntries(data));
return;
}
if(typeof querySelector!='string' || (querySelector=querySelector.trim())==""){
res(page);
return;
}
let e = page.find(querySelector);
if(e.length!=0){
if(typeof callBack=='function') callBack(e);
res(e);
return;
}
rej(new Error("Game->getPage->html->find->querySelector->length==0"));
}).fail(function(){
if(++fail<3){
setTimeout(()=>{Game.getPage(url,querySelector,callBack,fail);},250);
}
else rej(new Error("Game->getPage->fail 3 times"));
}).always(function(){
});
});
}
})();
//CATEGORY: TEAM
Game.pages.add('squad',{
'module':'team','action':'squad'
},function(){
let comingPlayersCount = $('#players-table-changes > tbody').find('.open-card').length;
if(comingPlayersCount.length) $('#players-table-changes').prev('h3').append(`<span style="float:right;">${comingPlayersCount} ${comingPlayersCount>1?GetText('Players'):GetText('Player')}</span>`);
});
Game.pages.add('formation',{
'module':'formation','action':'index'
},function(){
if($('#squad span.field-player').length>1 || $('#bank span.field-player').length>1 ){
if($('#squad').find('span.field-player').length>1){
Create('squad');
$('#squad').css('height','auto');
}
if($('#bank').find('span.field-player').length>1) Create('bank',27);
function Create(divId,addHeight=0){
$('#'+divId).css('min-height',parseInt($('#'+divId).css('height'))+addHeight).find('>h3:first').after(
'<p class="sorting_players">'+
' <label>'+
' <input type="radio" name="sorting_preference_'+divId+'" value="Position">'+GetText('Position')+
' </label>'+
' <label>'+
' <input type="radio" name="sorting_preference_'+divId+'" value="Strength">'+GetText('Strength')+
' </label>'+
'</p>'+
'<p class="filterByPositions"></p>'
);
let positions = [...new Set($('#'+divId).find('span.field-player').toArray().map(e=>$('>div >div.position',e).text()))],
POSITIONS = Tool.footballerPositions;
positions.sort((a,b)=> POSITIONS.findIndex(x=>x==a)-POSITIONS.findIndex(x=>x==b));
let filterByPositions = $('#'+divId+' > p.filterByPositions'),
b_colors = ['green','#72ed72','#72ed72','#3f8a83','yellow','yellow','yellow','red'],
f_colors = ['white','black','black','white','black','black','black','white'];
positions.forEach(pos=>{
let index = POSITIONS.findIndex(x=>x==pos);
filterByPositions.append(`<span class="filter_position disHighlight" style="background-color:${b_colors[index]};color:${f_colors[index]};">${pos}</span>`);
});
filterByPositions.find('.filter_position').click(function(){
$(this).css("pointer-events", "none");
let isActive = !$(this).hasClass('not_active'),
pos = $(this).text();
$(this)[isActive?'addClass':'removeClass']('not_active').parents('div.ui-droppable').find('span.field-player').each(function(){
if($('> div > div.position',this).text()==pos) $(this)[isActive?'slideUp':'slideDown'](200);
});
setTimeout(()=>$(this).css("pointer-events", ""),200);
});
}
$('#squad,#bank').find('>.sorting_players input').click(function(){
let div = $(this).parents('div.ui-droppable'),
players = div.find('span.field-player'),
positions = Tool.footballerPositions;
switch(this.value){
case 'Position':
players.sort(function(a,b){
let compare;
if(compare = positions.findIndex(x=>x==$(' > div > div.position',a).text()) - positions.findIndex(x=>x==$(' > div > div.position',b).text())) return compare;
else if(compare = parseInt($(' > div > div.strength',b).text())-parseInt($(' > div > div.strength',a).text())) return compare;
return plObj[a.id.split('-')[2]].age-plObj[b.id.split('-')[2]].age;
}).appendTo(div);
break;
case 'Strength':
players.sort(function(a,b){
let compare;
if(compare = parseInt($(' > div > div.strength',b).text()) - parseInt($(' > div > div.strength',a).text())) return compare;
else if(compare = positions.findIndex(x=>x==$(' > div > div.position',a).text()) - positions.findIndex(x=>x==$(' > div > div.position',b).text())) return compare;
return plObj[a.id.split('-')[2]].age-plObj[b.id.split('-')[2]].age;
}).appendTo(div);
break;
}
});
let sorting_preferences = undefined || {squad:'Position',bank:'Strength'}
$('#squad .sorting_players input[value="'+sorting_preferences.squad+'"]:first').click();
$('#bank .sorting_players input[value="'+sorting_preferences.bank+'"]:first').click();
}
if(true){ //To show the leadership values of football players
$('#formation-select-captain > span > select > option:not([value="0"])').each(function(){
let playerId = this.value;
if(!plObj[playerId]) return true;
let attr_leadership = parseInt(plObj[playerId].attr_leadership),
text = $(this).html(),
find = text.indexOf(')');
if(find==-1) return true;
$(this).html("(" + attr_leadership + ")" + text.substring(find+1));
});
let selectedCaptain = plObj[$('#formation-select-captain > span > select > option:selected').val()];
if(selectedCaptain){
let attr_leadership = selectedCaptain.attr_leadership,
text = $('#formation-select-captain > span > div.button > span.text').html(),
find = text.indexOf(')');
$('#formation-select-captain > span > div.button > span.text').html("(" + attr_leadership + ")" + text.substring(find+1));
}
let li = $(SelectBox.instances[$('#formation-select-captain > span').attr('instance')].expand[0]).find('li') ;
li.each(function(){
let playerId = this.getAttribute('idvalue');
if(!plObj[playerId]) return true;
let attr_leadership = parseInt(plObj[playerId].attr_leadership),
text = $(this).html(),
find = text.indexOf(')');
if(find==-1) return true;
$(this).html("(" + attr_leadership + ")" + text.substring(find+1));
$(this).attr('leadership',attr_leadership);
});
let arr = li.map(function(_, o) {
return {
text : $(o).text(),
idvalue : $(o).attr('idvalue'),
leadership : $(o).attr('leadership')
};
}).get();
arr.sort((o1, o2)=>{ return o2.leadership-o1.leadership;});
li.each(function(i, option) {
$(option).text(arr[i].text).attr({
'idvalue':arr[i].idvalue,
'leadership':arr[i].leadership
});
});
}
});
Game.pages.add('training',{
'module':'team','action':'index'
},null,[
[
'groups',
{'module':'team','action':'groups'}
],[
'settings',
{'module':'team','action':'settings'},
function(){
$('#groupNameForm > table > tbody').find('input').attr('maxlength',16).mouseenter(function(){
$(this).focus().attr('placeHolder',$(this).val()).val('');
}).mouseleave(function(){
if($(this).val().trim()=="") $(this).val($(this).attr('placeHolder'));
$(this).removeAttr('placeHolder').focusout();
});
}
]
]);
Game.pages.add('camp',{
'module':'team','action':'camp'
});
Game.pages.add('scout',{
'module':'transfermarket','action':'scout'
});
Game.pages.add('transfermarket',{
'module':'transfermarket','action':'index'
},function(){
/*Transfermarket Filter*/
$('.table-container:first').children().first().after(
'<div id="show_transfermarket_filter" style="margin:5px 0;">'+
'➤ <span style="cursor:pointer;background-color:green;padding:2px;margin-left:-2px;border-radius:7px;" id="ShowAllPlayers">'+GetText('ShowAllPlayers')+'</span><br>'+
'➤ <span style="cursor:pointer;" id="OnlyForeignPlayers">'+GetText('OnlyForeignPlayers')+'</span><br>'+
'</div>'
);
$('#ShowAllPlayers').click(function(){
$('#content > div.container.transfermarket > div.table-container > table > tbody > tr').each(function(i){
$(this).show();
$(this).attr('class',i%2==0?"odd":"even");
});
$(this).css({
'background-color':'green',
'padding':'2px',
'margin-left':'-2px',
'border-radius':'7px'
});
$('#OnlyForeignPlayers')[0].style = "cursor:pointer;";
});
$('#OnlyForeignPlayers').click(function(){
let counter=0;
$('#content > div.container.transfermarket > div.table-container > table > tbody > tr').each(function(){
if(!$('td:nth-child(1) > img',this).attr('src').endsWith(Tool.flag+'.gif')){
$(this).show();
$(this).attr('class',counter++%2?'even':'odd');
}
else $(this).hide();
});
$(this).css({
'background-color':'green',
'padding':'2px',
'margin-left':'-2px',
'border-radius':'7px'
});
$('#ShowAllPlayers')[0].style = "cursor:pointer;";
});
//Kulüp arama kısmındaki tüm metni silmek için.
$('#club').after('<img style="float:right;margin:2px 2px 0 0;cursor:pointer;" id="clearText" src="'+Tool.sources.getLink('https://www.clipartmax.com/png/full/301-3016667_red-cross-clipart-high-resolution-red-cross-emoji-gif.png')+'" alt="remove" width="10px">');
$('#clearText').click(function(){
clearText('club');
function clearText(id){
let text = $('#'+id).val(),
length = text.length;
while(length>0){
setTimeout(function(){
let t = $('#'+id).val();
$('#'+id).val(t.substring(0,t.length-1));
},(text.length-length)*25);
length--;
}
}
});
if(Game.server == 'tr') $('#age_min').parents('li:first').next().find('>span:first').css('margin-left','-34px').html('Yerli Futbolcu');
//Kulübümüzün transfer pazarını göstermek için:
$('#content > .container:first').append(CreateButton('ShowMyTransferMarket', GetText('ShowMyMarket'),'margin-Right:12px; top:71px; right:0; position:absolute; z-index:'+$('#content .search-container:first').css('z-index')+';'));
$('#ShowMyTransferMarket').click(function(){
$('#age_min').val(16);
$('#age_max').val(34);
$('#searchform > ul > li.strength > span:nth-child(2) > input[type="text"]').val(0);
$('#searchform > ul > li.strength > span:nth-child(3) > input[type="text"]').val(999);
$('#positions').val(0);
$('#club').val(Tool.clubName);
$('#searchform > ul > li.transfermarket-search-button > span > a > span').click();
});
//Show total bid
if($('#club').val().trim()==Tool.clubName){
let totalBid = 0;
$('#content > div.container.transfermarket > div.table-container > table > tbody > tr').each(function(){
var o = $('td:nth-child(7)',this).find('.currency-number');
if(o.length) totalBid += parseInt(o.first().text().replace(/\./g,''));
});
if(totalBid>0){
$('#content > div.container.transfermarket > div.table-container > table > tfoot > tr').html(
`<td colspan="5"></td>`+
`<td colspan="2" style="color:#edfdff;font-weight:bold;text-align:right;">${GetText('totalBid')}: ${(totalBid).toLocaleString()} <span class="icon currency"></span></td>`+
`<td colspan="3"></td>`
);
}
}
//For the movement of the transfer page with the left and right arrow keys
/*if($('#container .pager').length){
$(document).keydown(function(e){
document.title = "Click:"+Math.floor(Math.random()*1000);
let a=undefined
if(e.which==37) a = $('#container .pager > strong:first').prev()[0];
else if(e.which==39) a = $('#container .pager > strong:first').next()[0];
if(a!=undefined && a.tagName=='A') a.click();
});
}*/
});
//CATEGORY: SEASON
Game.pages.add('fixture',{
'module':'statistics','action':'games'
});
Game.pages.add('league',{
'module':'statistics','action':'table'
});
Game.pages.add('friendly',{
'module':'friendly'
},function(){
if(!$('#own-invitations-table > tbody > tr').find('.no-invites').length){
//Kendi arkadaşlık maç davetlerimizin silinmesi
$('#invitations > div.table-container > div:nth-child(1) > h3').append(CreateButton('ClearInvitations', GetText('CancelUnnecessaryDays'),'float:right;margin-right:5px;'));
$('#ClearInvitations').click(function(){
var doluTarihler = {};
$('#friendly-matches > tbody > tr').each(function(){
doluTarihler[$(this).find('td:nth-child(2)').attr('sortvalue')] = '';
});
var silinecekIstekKeyleri = [];
$('#own-invitations-table > tbody > tr').each(function(){
if(doluTarihler[$(this).find('td:nth-child(2)').attr('sortvalue')]!==undefined){
var href = $(this).find('td.last-column > a')[0].href;
silinecekIstekKeyleri.push(href.substring(href.indexOf('delete=')+7,href.lastIndexOf('&')));
}
});
if(silinecekIstekKeyleri.length){
clearInvitations();
}
async function clearInvitations(){
if(!silinecekIstekKeyleri.length){
Game.detectPage();
return;
}
var key = silinecekIstekKeyleri[0];
silinecekIstekKeyleri.splice(0,1);
location.href = "#/index.php?w="+worldId+"&area=user&module=friendly&action=index&delete="+key;
await Game.pageLoad();
clearInvitations();
}
});
}
});
Game.pages.add('simulation',{
'module':'simulation'
},function(){
let LeagueData = Tool.getVal('LeagueData');
if(LeagueData!=undefined){
if((LeagueData.lastMatchDate+86400000)>Game.getTime()){
let clubs = LeagueData.clubs;
$('#simulations > tbody').find('.name-column').each(function(){
let a = $(this).find('a:first'),
clubId = a.attr('clubid');
if(!clubs.hasOwnProperty(clubId)) return;
$(this).parent().css('background','green').attr({
'title': GetText('SameLeague', {tag:0}),
'tool_tt': 'SameLeague'
});
})
}
else Tool.delVal('LeagueData');
}
});
Game.pages.add('tournament',{
'module':'tournament','action':['index','tournament','holding']
});
Game.pages.add('betoffice',{
'module':'betoffice'
});
//CATEGORY: CLUB MANAGEMENT
Game.pages.add('sponsors',{
'module':'club','action':'sponsors'
});
Game.pages.add('publicrelations',{
'module':'publicrelations'
});
Game.pages.add('assistants',{
'module':'assistants'
},function(){
let bars = $('#assistants').find('.bar'),
values = [];
bars.each(function(){
values.push(parseInt(this.style.width.replace('%','')));
this.style.width = '0%';
});
if(values.length){
Tool.intervals.create(function(){
for(let i = 0, width ; i < bars.length ; i++){
width = bars[i].style.width;
width = parseInt(width.substring(0,width.lastIndexOf('%')));
if(width<values[i]) bars[i].style.width = (width+1)+'%';
else{
bars.splice(i,1);
values.splice(i,1);
}
}
this.delete();
},20,'Asistants');
}
});
Game.pages.add('finances',{
'module':'finances'
});
Game.pages.add('stadium',{
'module':'stadium'
});
Game.pages.add('buildings',{
'module':'buildings'
});
Game.pages.add('shop',{
'module':'shop'
});
//CATEGORY: STATISTICS
Game.pages.add('rating',{
'module':'rating'
});
Game.pages.add('statistics',{
'module':'statistics','action':'season'
});
Game.pages.add('tournament_history',{
'module':'tournament','action':'history'
});
Game.pages.add('squadstrenght',{
'module':'statistics','action':'squadstrenght'
});
Game.pages.add('goalgetter',{
'module':'statistics','action':'goalgetter'
});
Game.pages.add('sales',{
'module':'statistics','action':'sales'
});
Game.pages.add('team_history',{
'module':'team','action':'history'
});
//CATEGORY: COMMUNITY
Game.pages.add('press',{
'module':'press','action':'index'
},null,[
[
'article',
{'module':'press','action':'article'}
],[
'topnews',
{'module':'press','action':'topnews'}
],[
'settings',
{'module':'press','action':'settings'}
],[
'comment',
{'module':'press','action':'comment'}
]
]);
Game.pages.add('friends',{
'module':'friends'
});
Game.pages.add('neighbors',{
'module':'main','action':'neighbors'
});
Game.pages.add('signatures',{
'module':'profile','action':'signatures'
});
//CATEGORY: CLUB
Game.pages.add('premium',{
'module':'premium'
});
Game.pages.add('menager_profile',{
'module':'profile','action':'index'
});
Game.pages.add('club_profile',{
'module':'profile','action':'club'
});
Game.pages.add('manager',{
'module':'profile','action':'show'
});
Game.pages.add('mail',{
'module':'mail','action':'index'
},null,[
[
'outbox',
{'module':'mail','action':'outbox'}
],[
'archive',
{'module':'mail','action':'archive'}
],[
'ignore',
{'module':'mail','action':'ignore'}
]
]);
Game.pages.add('tricotshop',{
'module':'tricotshop'
});
//NON-CATEGORY
Game.pages.add('main',{
'module':'main','action':['home','acceptSimulation','deleteSimulation','accept']
});
Game.pages.add('live',{
'module':'live','action':'index'
},null,[
[
'league',
{'module':'live','action':'league'}
],[
'match',
{'module':'live','action':'match'},
function(){
if($('#match').length){//Match is exist
// Add images
$('#goal-event-container').after(
`<div id="DivCards" class="match event-container" style="display:none;">`+
` <img id="yellow_card" src="${Tool.sources.getLink('yellowCard','png')}" alt="yellowCard" style="display:none;">`+
` <img id="red_card" src="${Tool.sources.getLink('redCard','png')}" alt="redCard" style="display:none;">`+
` <img id="yellow_red_card" src="${Tool.sources.getLink('yellowRedCard','png')}" alt="yellowRedCard" style="display:none;">`+
`</div>`
);
// Add audios
$('#goal-event-container').after(
'<div id="Songs">'+
' <audio id="goalSound" src="https://static.wixstatic.com/mp3/fcacd5_2794b8a8827a475eaf9a3241be0c42d5.mp3"></audio>'+
' <audio id="whistle1" src="https://static.wixstatic.com/mp3/fcacd5_4f0052fc29104ead86761cbb08d50774.mp3"></audio>'+
' <audio id="whistle2" src="https://static.wixstatic.com/mp3/fcacd5_b967408abf59401d9b71778ea45ae2b9.mp3"></audio>'+
' <audio id="whistle3" src="https://static.wixstatic.com/mp3/fcacd5_c4ccd759ec62404cb59f6a8ff906e110.mp3"></audio>'+
//' <audio id="backgroundSound" loop src="https://static.wixstatic.com/mp3/fcacd5_5a27a4e8ed2a482099ea0ba8839d4db9.mp3"></audio>'+
' <audio id="fan1" loop src="https://static.wixstatic.com/mp3/fcacd5_d7123a0a3c2f469cbdf603067579de93.mp3"></audio>'+
' <audio id="fan2" loop src="https://static.wixstatic.com/mp3/fcacd5_fde7b7b934d24cf98771cc022eb6bee3.mp3"></audio>'+
'</div>'
);
// Add Goals Container
$('#match-messages').before(
'<div style="width: 840px;position: absolute;left: 65px;top: 101px;color:white;">'+
' <div id="home-goals" style="float:left;width:48%;height:100%;text-align:center;overflow: auto;line-height:16px;height:38px;"></div>'+
' <div id="away-goals" style="float:right;width:48%;height:100%;text-align:center;overflow: auto;line-height:16px;height:38px;"></div>'+
'</div>'
);
// Is this match own?
currentLive.ownMatch = $('#'+currentLive.matchId +' h3 a[clubid="'+Tool.clubId+'"]').length!=0;
unsafeWindow.jQuery('<span id="MatchEventCatcher">').hide().appendTo('#content').click(function(_, event){
if(event.message) {
switch(event.type){
case 'goal': case 'penalty': case 'penaltyShootout':
if(event.type!='penaltyShootout' || event.goal == 'goal'){
if(currentLive.lastActiveMin < 120){ // GOOOOALL : event['team']
if(event._status == 'new'){
if(currentLive.ownMatch && event.team == currentLive.ownSquad){
$('#goalSound')[0].currentTime = 0;
$('#goalSound')[0].play();
}
if($('#NewGoalCatcher').length){
unsafeWindow.jQuery('#NewGoalCatcher').trigger('click', {
[currentLive.matchId]: { //Note: New goal has not yet been added to the element (score-home or score-away)
"status": event.action=="end"?"ended":"active",
"home_goals": parseInt($('#'+currentLive.matchId + '> span.score > div:first > span.score-home').text()) + (event.team==currentLive.homeId?1:0),
"away_goals": parseInt($('#'+currentLive.matchId + '> span.score > div:first > span.score-away').text()) + (event.team==currentLive.awayId?1:0),
"min": event.min
}
});
}
}
let message = event.message,
team_matchId = event.team,
min = event.min,
team = currentLive.homeId==team_matchId?"home":"away",
goal_scorer_lastname = $('<div>').html(message).find('.'+team+':last').text().trim(),
fonded_players = Object.values(currentLive.players[team_matchId]).filter(p=>p.lastname==goal_scorer_lastname)
if(fonded_players.length==1){
let goal_scorer = fonded_players[0],
spn = $('#player-goals-'+goal_scorer.id);
if(!spn.length){ // player's first goal
if($('#'+team+'-goals > span').length) $('#'+team+'-goals').append(' , ');
$('#'+team+'-goals').append(
`<span style="color:${team=="home"?'#f00':'#0ec6e7'};white-space:nowrap;">`+
` <img src="https://image.ibb.co/jdRxmK/Ads_z.png" height="15px;" style="vertical-align:middle;margin: 1px 2px 0 0;">`+
` <span id="player-goals-${goal_scorer.id}" style="color:white;font-size: 10px;font-weight:bold;">[${min}]</span> ${goal_scorer.lastname}`+
`</span>`
);
}
else{
let text = spn.text();
spn.text(text.substring(0,text.length-1)+','+min+']');
}
}
else{
if($('#'+team+'-goals > span').length) $('#'+team+'-goals').append(' , ');
$('#'+team+'-goals').append(
`<span style="color:${team=="home"?'#f00':'#0ec6e7'};white-space:nowrap;">`+
` <img src="https://image.ibb.co/jdRxmK/Ads_z.png" height="15px;" style="vertical-align:middle;margin: 1px 2px 0 0;"> ~`+
`</span>`
);
}
}
}
break;
case 'info':
if(event._status == 'new'){
let min = event.min,
whistle = $('#whistle'+(
min==1?1: //Match start
min==45?2: //First half end
event.action=='end'?3: //Match end
2 //Else
));
if(whistle.length){
whistle=whistle[0];
whistle.currentTime = 0;
whistle.play();
}
}
break;
}
}
switch(event.type){
case 'penaltyShootout':
if(event.goal == 'goal'){ //Penaltı atışı gol oldu
//Gol atan takım => event.team
}
else if(event.goal == 'miss'){ //Penaltı atışı kaçtı
}
break;
case 'penaltyShootoutScore': //Penaltı skor tablosu gösteriliyor
/*message = currentLive.getMessageElement(event['min']);
$(message).addClass('info');
$(message).append(event['template']);
$('#match-messages').prepend($(message));*/
break;
case 'red': case 'yellow': case 'yellow_red':
if(event._status == 'new'){
$('#whistle1')[0].currentTime=0;
$('#whistle1')[0].play();
if(currentLive.ownMatch && event.squad == currentLive.ownSquad){
$('#DivCards,#'+event.type+'_card').show();
setTimeout(()=>{
$('#DivCards,#'+event.type+'_card').hide();
},event.delay);
}
}
/*var player = $('#field-player-' + event['player']);
player.removeClass('weak');
player.addClass(event['type']);
if (event['type'] != 'yellow') {
if (event['squad'] == currentLive.ownSquad) {
$('#out-of-match').append($('#field-player-' + event['player']));
var playerObj = currentLive.players[currentLive.ownSquad][event['player']];
if (playerObj) {
$('#field-player-points-' + event['player']).html(playerObj['points']);
player.off();
}
} else {
$('#opponent-out-of-match').append($('#field-player-' + event['player']));
}
currentLive.players[event['squad']][event['player']]['a_position'] = 'Bank';
} */
break;
case 'move':
break;
case 'injured':
//var isOwnInjuredPlayer = currentLive.ownMatch && event.squad==currentLive.ownSquad;
/*currentLive.players[event['squad']][event['player']]['initial_health'] -= event['injuring'];
currentLive.setHealthStatus(event['player'], currentLive.players[event['squad']][event['player']]['initial_health']);*/
break;
case 'bonusHealthLoss':
break;
case 'bonusHealthGain':
break;
case 'bonusFormationLoss':
break;
case 'bonusFormationGain':
break;
case 'bonusLeadershipLoss':
break;
}
if(event.action == 'end'){
if(event._status == 'new'){
['backgroundSound','fan1','fan2'].map(n=>$('#'+n)[0]).forEach((audio,i)=>{
if(audio.paused) return;
let j = audio.volume*100;
for(let t = j ; j>=0 ; j--){
((j,i)=>{
setTimeout(function(){
audio.volume = j/100;
if(audio.volume < 1) audio.pause();
},(t-j)*50);
})(j,i);
}
});
if($('#NewGoalCatcher').length && event.min==1){ //the match is over due to insufficient number of players
let home_goals = $('<div>').html(event.message).find('span.away,span.home').first().attr('class')=="away"?3:0,
away_goals = home_goals==3?0:3;
unsafeWindow.jQuery('#NewGoalCatcher').trigger('click', {
[currentLive.matchId]: {
"status": "ended",
"home_goals": home_goals,
"away_goals": away_goals,
"min": event.min
}
});
}
}
else{ //Match has been already finished before, no new event will catched
$('#backgroundSound').attr('stop',true);
['backgroundSound','fan1','fan2'].map(n=>$('#'+n)[0]).forEach(audio=>{
if(!audio.paused) audio.pause();
});
}
}
});
if(Array.isArray(Tool.uncaught_events_queue)){
Tool.uncaught_events_queue.forEach(event=>{
unsafeWindow.jQuery("#MatchEventCatcher").trigger('click', [event]);
});
delete Tool.uncaught_events_queue;
}
if(!Tool.hasOwnProperty('goalTrigger')) Tool.goalTrigger = 0;
if(Tool.goalTrigger<3) ++Tool.goalTrigger;
//Show or hide home/away team's players in field.
for(let squadId in currentLive.players){
((index,playersClass)=>{ //eslint-disable-line no-loop-func
let data = {
home:{
style:'position:absolute;top:600px;',
id:"homePlayersFilter",
text:GetText('ShowHomeSquad')
},
away:{
style:"position:absolute;top:600px;right:20px;",
id:"awayPlayersFilter",
text:GetText('ShowAwaySquad')
}}[index];
$('#formation-container').append(
`<div style="${data.style}">`+
` <input id="${data.id}" type="checkBox">`+
` <label for="${data.id}" style="cursor:pointer;">${data.text}</label>`+
`</div>`
);
if(index==="away"){
$('#match-handle-container').css('height',"36px");
$('#match-handle-container > li:first').css('height',"36px");
}
$('#'+data.id).click(function(){
let checked = this.checked;
$('#field').find('.field-player').each(function(){
if($(this).hasClass(playersClass)){
$(this)[checked?'addClass':"removeClass"]('hover');
}
});
});
})(
squadId == currentLive.homeId?"home":"away",
squadId == currentLive.ownSquad?"own-player":"opponent"
);
}
try{
//Background Sound is playing
setTimeout(function(){
let backgroundSound = $('#backgroundSound')[0];
backgroundSound.currentTime = 0;
backgroundSound.volume = 0;
backgroundSound.play();
let intervals = [];
[...Array(51).keys()].slice(1).forEach(i=>{ // 1 to 50
intervals.push(setTimeout(()=>{
if(!$('#backgroundSound').attr('stop')){
backgroundSound.volume = i/100;
}
else{
intervals.forEach(id=>{ clearTimeout(id);});
}
},(i-1)*50));
});
},250);
}
catch(err){console.error(err);};
}
}
]
]);
class Feature{
constructor(name,page_names,run,hover_selector=null){
this.name = name;
this.page_names = page_names;
this.run = run;
this.active = null;
this.work = null;
if(typeof hover_selector == 'string' && (hover_selector=hover_selector.trim())!="") this.hover_selector = hover_selector;
}
deactivate(){
this.active = false;
}
activate(){
this.active = true;
}
}
let Tool = new (class{
constructor(){
this.sources = {
getLink: (url)=>{
return url;/*Thanks to mot33*/
}
};
this.features = [];
this.features.getByName = function(name){
return this.find(f=>f.name==name);
}
this.features.add = function(name,page_names,run,hover_selector=null,otherPages=null){
if(this.getByName(name) instanceof Feature) throw new Error(`A feature with this name(${name}) was previously created.`);
let feature = new Feature(name, page_names, run, hover_selector);
if(!Array.isArray(page_names)) page_names = [page_names];
page_names.forEach(page_name=>{
let page = Game.pages.getByName(page_name);
if(page === undefined) throw new Error(`Page(${page_name}) doesn't exist, therefore feature(${name}) can't be added.`);
page.addFeature(feature);
});
if(otherPages!=null){
if(!Array.isArray(otherPages[0])) otherPages=[otherPages];
otherPages.forEach(p=>{
let page_name = p[0],
run = p[1],
page = Game.pages.getByName(page_name)
if(page === undefined) throw new Error(`Page(${page_name}) doesn't exist, therefore feature(${name}) can't be added. (Page is in otherPages)`);
//Extends page's run function
let page_run = page.run;
if(typeof page_run=='function'){ //If page's run function already exist, it will be extended
page_run = page_run.toString();
page_run = page_run.substring(0,page_run.lastIndexOf('}'));
run = run.toString();
run = run.substring(run.indexOf('{')+1);
eval('page.run = '+page_run+`\n\t\t/*Extended by feature named ${name}*/`+run);
}
else{
run = run.toString();
let find = run.indexOf('{');
eval('page.run = ' + run.substring(0,find+1)+`\n\t\t/*Created by feature named ${name}*/`+run.substring(find+1));
}
});
}
this.push(feature);
};
this.log_intervals=false;
this.intervals = new (class{
constructor(){
this.named = {};
this.anonymous = [];
}
create(func,delay,name=null){
let that = this;
if(typeof name == "string" && (name=name.trim())!=""){
if(this.named.hasOwnProperty(name)) throw new Error(`Intervals.create with name(${name}) was already used in one of previous intervals`);
let interval = {
created_at : new Date().getTime(),
name : name,
delete : function(){
clearInterval(that.named[this.name]);
let diff = new Date().getTime()-this.created_at;
if(Tool.log_intervals) console.log('[intervals] Named('+this.name+') interval deleted itself after ' + SecToTime(parseInt((diff)/1000))+'.'+(diff%1000));
delete that.named[this.name];
},
func : func
};
this.named[name] = setInterval(function(){
func.call(interval);
},delay);
if(Tool.log_intervals) console.log('[intervals] Created named('+name+') interval with '+delay+' ms delay');
}
else{
let id,
interval = {
created_at : new Date().getTime(),
delete : function(){
clearInterval(id);
let diff = new Date().getTime()-this.created_at;
if(Tool.log_intervals) console.log('[intervals] Anonymous interval deleted itself id: '+id+' after ' + SecToTime(parseInt((diff)/1000))+'.'+(diff%1000));
that.anonymous.find((item,index,array)=>{
if(item==id){
array.splice(index,1);
if(Tool.log_intervals) console.log('[intervals]\t\t id in annoymous splice index: '+index);
return 1;
}
});
}
};
id = setInterval(function(){
func.call(interval);
},delay);
this.anonymous.push(id);
if(Tool.log_intervals) console.log('[intervals] Created anonymous interval with '+delay+' ms delay , id: '+id);
}
}
clear(){
if(Tool.log_intervals) console.log('[intervals] Clear all intervals');
let named = this.named;
for(var name in named){
clearInterval(named[name]);
delete named[name];
}
for(let i=0, len=this.anonymous.length; i<len; i++) clearInterval(this.anonymous[i])
this.anonymous=[];
}
})();
this.defaultFeaturesActiveStatus = {
"ConstructionCountdown" : !0,
"RematchMatch" : !0,
"NumberOfFootballerChecker" : !0,
"MatchAnalyst" : !0,
"TrainingControl" : !0,
"ClubExchange" : !0,
"RankingOfPlayers" : !0,
"ShowStrengthChange" : !0,
"ShowRealStrength" : !1,
"CalculateNonYoungPlayersStrength": !0,
"CalculatingStrengthOfYoungPlayer": !0,
"YoungPlayersHistory" : !0,
"TrainingGroups" : !1,
"CampHistory" : !0,
"TransferDates" : !0,
"GoOffer" : !0,
"ShowBoughtPlayers" : !0,
"ShowOwnOfferInMarket" : !0,
"FilterOwnOffers" : !0,
"FilterTransferMarket" : !0,
"DownloadTable" : !0,
"CancelFriendlyMatchInvites" : !0,
"QuickBet" : !0,
"ShowAsistantLevelIncrease" : !0,
"QuickShopping" : !0,
"AddImage" : !0,
"InviteSimulationMatch" : !0,
"ShowEloRating" : !0,
"LiveMatchesTable" : !0,
"SortTournaments" : !0,
};
}
async start(){
delete this.__proto__.start;
if($('#ChangeContent').length) throw new Error("Script already works!");
//Fix tool values and print
this.fixValues();
this.printValues();
//Wait game page loading first time
await new Promise(res=>{
let a, b = setTimeout(()=>{
clearInterval(a);
res();
},2500);
a = setInterval(()=>{
if($('body').hasClass('loading')){
clearInterval(a);
clearTimeout(b);
res();
}
},10);
});
//Wait game page loaded
let ms = await Game.pageLoad();
console.log('Wait for the game to load for the first time : ' + ms + ' ms');
if($('#logout').length==0) throw new Error("Logout button doesn't exist");
await Game.initialConfigure(); //After that initialize game configure
//Get game server and check if it's datas is already in the script
Game.server = $('body').attr('class').replace('loading','').trim();
if(!(Game.server in serversDatas)){
Game.giveNotification(false,"This server is not available in the script!");
throw new Error("This server is not available in the script!");
}
//Get tool features active status data. (Note: getVal use Game.server)
this.featuresActiveStatus = this.getVal('featuresActiveStatus', this.defaultFeaturesActiveStatus);
//Tool datas
for(const [key,value] of Object.entries(serversDatas[Game.server])) this[key] = value;
serversDatas = undefined;
let Positions = this.footballerPositions;
this.strengthFactors = new Proxy({ // this is required to calculate strength of a player
[['goalkeeper',Positions[0]].join('|')] : [[ 0,5], [ 1,5], [3,4], [ 8,3], [ 6,2], [10,1], [4,1], [2,1]],
[['defense',...Positions.slice(1,4)].join("|")] : [[ 6,4], [ 9,4], [3,3], [ 8,2], [10,2], [ 4,2], [5,2], [7,2], [11,2], [2,1]],
[['midfield',...Positions.slice(4,6)].join("|")] : [[ 3,4], [10,4], [8,3], [ 5,3], [ 6,2], [ 4,2], [7,2], [9,2], [11,2], [2,1]],
[['offensive',...Positions.slice(6,8)].join("|")]: [[11,4], [ 3,3], [8,3], [10,3], [ 2,3], [ 6,2], [4,2], [5,1], [ 7,1], [9,1]]
}, {
get: function(target, property, receiver) {
for(let k in target)
if(new RegExp(k).test(property))
return target[k];
return null;
}
});
(()=>{
let penalty_area_safety=0, catch_safety=1, two_footed=2, fitness=3, shot=4, header=5, duell=6, cover=7, speed=8, pass=9, endurance=10, running=11, ball_control=12, aggressive=13;
this.trainingPlan = { // this is required to check whether player skill that is being improved is true
[Positions[0]]: [penalty_area_safety, catch_safety, fitness, speed, duell, endurance, shot, two_footed], //TW
[Positions[1]]: [pass, duell, fitness, cover, speed, endurance, header, shot, running, two_footed], //AV
[Positions[2]]: [pass, duell, fitness, cover, speed, endurance, header, shot, running, two_footed], //IV
[Positions[3]]: [duell, pass, fitness, cover, endurance, speed, shot, running, header, two_footed], //DM
[Positions[4]]: [endurance, fitness, speed, header, pass, running, duell, shot, cover, two_footed], //LM
[Positions[5]]: [endurance, fitness, speed, header, pass, running, duell, shot, cover, two_footed], //RM
[Positions[6]]: [running, fitness, speed, endurance, two_footed, shot, duell, pass, header, cover], //OM
[Positions[7]]: [running, fitness, speed, two_footed, endurance, duell, shot, header, pass, cover] //ST
};
})();
Positions=undefined;
//Get translations
let userLanguages = GM_getValue('userLanguage',{}),
result, gameDefLanguage = this.language, chooseAlternative=!1;
if(userLanguages.hasOwnProperty(Game.server) && Translate.existLanguage(userLanguages[Game.server])){
result = Translate.start(userLanguages[Game.server]); //User preference language
}
else{
if(Translate.existLanguage(gameDefLanguage)) result = Translate.start(this.language); //Default server language
else{
result = Translate.start(); //Alternative language
chooseAlternative=!0;
}
}
if(result.status=='error'){
Game.giveNotification(false, result.msg);
throw new Error(JSON.stringify(result, null, '\t'));
}
this.language = Translate.locale.name;
if(chooseAlternative){
Game.giveNotification(true, `This script hasn't yet been translated into ${gameDefLanguage}!<br>Alternative language[${this.language}] selected!`);
}
//Get club datas
let clubDatas = Tool.getVal('clubDatas'),
dataResult = this.checkClubData(clubDatas);
if(dataResult == 'not-exist'){
clubDatas = await this.createWelcomeMenu();
dataResult = this.checkClubData(clubDatas);
}
delete this.__proto__.createWelcomeMenu;
delete this.__proto__.checkClubData;
if(dataResult!='correct'){
Game.giveNotification(false,"Club datas isn't correct!");
throw new Error("Club datas isn't correct!");
}
for(let [key,val] of Object.entries(clubDatas)) this[key] = val;
//
this.checkDatas();
//...
this.createToolMenu();
this.createMenuEvents();
this.checkVersion();
this.createNoticeArea();
//plObj[Oyuncu verileri] nin kaydedilmesi
/*$.get('?area=user&module=formation&action=index&layout=none',function(response) {
let r = response.content,
b = r.lastIndexOf('var plObj');
if(b!=-1){
b = r.indexOf('=',b);
playerObject = JSON.parse(r.substring(b+1,r.indexOf('}};',b)+2));
if(!typeof playerObject=='object' //Kadroda oyuncu olunca "plObj = {...};" oluyor.
|| Array.isArray(playerObject) //Kadroda hic oyuncu olmazsa "plObj = [];" oluyor.
) playerObject = undefined;
}
});*/
$('<span id="ChangeContent">').hide().appendTo('body').click(function(){
if(!$('#content').find('h2').first().attr('Fixed'))
Game.detectPage(); //Sayfa değiştirilince Fixed özelliği olmayacağı için undefined değeri dönecek ve main fonksiyonu çalıştırılacak.
});
Game.detectPage(false);
}
checkDatas(){
delete this.__proto__.checkDatas;
//ageDatas
if(Array.isArray(this.ageDates)){
let ageDates = this.ageDates.slice(0),
serverTime = Game.getTime();
if(ageDates[ageDates.length-1]*60000<serverTime) this.ageDates = undefined;
else{
while(ageDates.length){
let date = ageDates[0]*60000;
if(date>serverTime) break;
ageDates.splice(0,1);
}
if(!ageDates.length) this.ageDates = undefined;
else this.ageDates = ageDates.slice(0);
}
}
else delete this.ageDates;
//featuresActiveStatus
let updated=0; //Veri de herhangi bir güncelleme olursa onu kaydetmek için
Object.entries(this.defaultFeaturesActiveStatus).map(e=>{return {k:e[0],v:e[1]};}).forEach(f=>{ //Yeni bir özellik geldiğinde veya var olan özellik bir şekilde kaybolduysa eklemek için;
if(!this.featuresActiveStatus.hasOwnProperty(f.k)){
this.featuresActiveStatus[f.k] = f.v;
++updated;
}
});
delete this.defaultFeaturesActiveStatus;
for(let [featureKey,enable] of Object.entries(this.featuresActiveStatus)){ //Tool'a eklenen özelliklere başlangıç durumunu(etkin/devre dışı) verecek
let feature = this.features.getByName(featureKey);
if(feature==undefined){ //Özellik kaldırıldı veya verilerde yanlış düzenleme mevcut
delete this.featuresActiveStatus[featureKey];
++updated;
continue;
}
feature.active = enable;
}
if(updated>0) this.setVal('featuresActiveStatus',this.featuresActiveStatus);
delete this.featuresActiveStatus;
}
checkClubData(clubDatas){
if(typeof clubDatas == "object"){
if(clubDatas.trainerLevel==undefined ||
clubDatas.yTrainerLevel==undefined ||
clubDatas.clubId==undefined ||
clubDatas.clubName==undefined
) return 'incorrect';
return 'correct';
}
return 'not-exist';
}
createWelcomeMenu(){
delete this.__proto__.createWelcomeMenu;
//Eğer kulüp bilgileri mevcut değilse, kullanıcının verileri silinmiş olabilir yada kullanıcı scripti ilkkez yüklüyordur.
return new Promise((res,rej)=>{
let header = { //Scriptin açılış menüsünün baş kısmı
content : GetText('NeedNecessaryInformation')+`<img src="${Tool.sources.getLink('unhappy','png')}" alt="unhappy" height="25px" style="position:absolute;margin: 4px 0 4px 5px;">`,
css : {'text-align':'center'}
};
let div = { //Scriptin açılış menüsünün içeriği
footer : !0,
close : !0,
class : 'container'
};
div.content=
`<p style="color:red;margin-bottom:10px;font-weight:bold;text-align:left;font-size:12px;">${GetText('InformScriptWorking')}</p>`+
`<p style="color:blue;font-weight:bold;text-align:left;font-size:12px;margin-Bottom:10px;">${GetText('HelpDataUploading')}</p>`+
`<p style="text-align:center;margin-bottom:25px;">`+
` <img id="uploadDatas" class="grow" title="${GetText('UploadDatas', {tag:0})}" tool_tt="UploadDatas" src="https://i.ibb.co/WzvZS4s/Untitled.png" style="cursor:pointer;" height="40px">`+
`</p>`+
`<h3>${GetText('EnterClubInformation')} :</h3>`+
`<table style="width:280px;margin:0 auto 15px auto;border-radius:6px;color:#111b9c;background-color:white;box-shadow: 5px 10px 8px #3939398c;">`+
` <tbody>`+
` <tr class="odd">`+
` <td style="border:0;text-align:center;padding-Left:5px;">${GetText('TrainerLevel')}</td>`+
` <td style="border:0;">`+
` <label class="menü">`+
` <select id="AntrenörSeviyesi1" style="font-size:12px;width:55px;margin:0 auto;text-align-last: center;"></select>`+
` </label>`+
` </td>`+
` </tr>`+
` <tr class="even">`+
` <td style="border:0;border-radius:6px 0 0 6px;text-align:center;padding-Left:5px;">${GetText('YoungTrainerLevel')}</td>`+
` <td style="border:0;border-radius:0 6px 6px 0;">`+
` <label class="menü">`+
` <select id="GAntrenörSeviyesi1" style="font-size:12px;width:55px;margin:0 auto;text-align-last: center;"></select>`+
` </label>`+
` </td>`+
` </tr>`+
` </tbody>`+
`</table>`+
`<p style="text-align:center;">${CreateButton('butonOnayla', GetText('Confirm')+' !')}</p>`;
ShowDialog(div,header);
//Adding level options to selects
let selects = $('#AntrenörSeviyesi1, #GAntrenörSeviyesi1');
selects.append(`<option value="10" selected tool_ot="SortLevel_10 {X}">10 ${GetText('SortLevel', {tag:0})}</option>`)
for(let lvl=9; lvl>-1; lvl--) selects.append(`<option value="${lvl}" tool_ot="SortLevel_${lvl} {X}">${lvl} ${GetText('SortLevel', {tag:0})}</option>`)
$('#butonOnayla').click(async function(){
$(this).off();
let span = $(this).find('span:last'),
html = span.html(),
clubDatas = {
"trainerLevel" : parseInt($('#AntrenörSeviyesi1').val()),
"yTrainerLevel" : parseInt($('#GAntrenörSeviyesi1').val())
},
self = $('.self-link');
span.html('<img src="/designs/redesign/images/icons/loading/16x16.gif" style="margin-top: -1px;">');
if(self.length){
clubDatas.clubId = $('.self-link').first().attr('clubid');
clubDatas.clubName = $('.self-link').first().text().trim();
}
else{
try{
let profile_show = await Game.getPage('?w='+worldId+'&area=user&module=profile&action=show','#profile-show');
clubDatas.clubId = profile_show.find('div.container.profile-trophy > div.profile > ul.profile-box-club > li:nth-child(2) > a')[0].href.split('&').find(a=>a.split('=')[0]=='clubId').split('=')[1];
clubDatas.clubName = profile_show.find('h2').first().text().replace(Tool.replaceClubName,'').trim();
}
catch(err){
alert("An error is exist.\n"+err);
return;
}
}
span.html(html);
Tool.setVal('clubDatas',clubDatas);
closeFocus({target: $('.close')});
res(clubDatas);
});
$('#uploadDatas').click(function(){
ReadTextFile(
function(valuesText){
valuesText.split('CookieKey&:').slice(1).forEach(data=>{
let b = data.indexOf(':');
GM_setValue(data.substring(0,b),JSON.parse(data.substring(b+1)));
});
Tool.fixValues();
closeFocus({target: $('.close')});
Game.giveNotification(true, GetText('DataLoaded'));
res(Tool.getVal('clubDatas'));
}
);
});
});
}
createToolMenu(){
delete this.__proto__.createToolMenu;
$('html, body').animate({ scrollTop: 0 }, 'fast'); //Sayfanın başına getiriliyor. Menü ortaya çıkartılacak.
//Script menüsü için toogle buton ekleniyor ve açılıp-kapanabilmesi için click eventi ekleniyor.
$('#section-inner-container').after('<div id="scriptMenuToggleBtn" class="active"></div>');
$('#scriptMenuToggleBtn').click(function(){
let active = $(this).hasClass('active');
$(this)[active?'removeClass':'addClass']('active');
$('#ScriptMenu')[active?'slideUp':'slideDown']();
});
//Script menüsü butondan sonra ekleniyor.
$('#section-inner-container').after(
`<div id="ScriptMenu" class="box" style="position:absolute;">`+
` <h2>${GetText('ScriptMenuTitle')}</h2>`+
` <table class="table">`+
` <thead>`+
` <tr>`+
` <th>${GetText('Explanation')}</th>`+
` <th>${GetText('Action')}</th>`+
` </tr>`+
` </thead>`+
` <tbody>`+
` <tr class="odd">`+
` <td>${GetText('DownloadData')}</td>`+
` <td>${CreateButton('downloadValues', GetText('Download'), '', 'width:35px;')}</td>`+
` </tr>`+
` <tr class="even">`+
` <td>${GetText('UploadDatas')}</td>`+
` <td>${CreateButton('uploadValues', GetText('Load'), '', 'width:35px;')}</td>`+
` </tr>`+
` <tr class="odd">`+
` <td>${GetText('DeleteData')}</td>`+
` <td>${CreateButton('deleteValues', GetText('Delete'), '', 'width:35px;')}</td>`+
` </tr>`+
` <tr class="even">`+
` <td>${GetText('GameLanguage')}</td>`+
` <td>`+
` <label class="menü">`+
` <select id="gameLanguage" style="width:69px;margin:0 auto;text-align-last: center;">`+
` <option selected value="${Tool.language}">${GetText('Language', {tag:0})} *</option>`+
` </select>`+
` </label>`+
` </td>`+
` </tr>`+
` </tbody>`+
` <tbody id="ExtraSettings" style="display:none;">`+
` <tr class="odd">`+
` <td>${GetText('TrainerLevelS')}</td>`+
` <td>`+
` <label class="menü">`+
` <select id="AntrenörSeviyesi" k="trainerLevel" currentvalue="${Tool.trainerLevel}" style="width:55px; margin:0 auto; text-align-last:center;"></select>`+
` </label>`+
` </td>`+
` </tr>`+
` <tr class="even">`+
` <td>${GetText('YoungTrainerLevelS')}</td>`+
` <td>`+
` <label class="menü">`+
` <select id="GAntrenörSeviyesi" k="yTrainerLevel" currentvalue="${Tool.yTrainerLevel}" style="width:55px;margin:0 auto;text-align-last: center;"></select>`+
` </label>`+
` </td>`+
` </tr>`+
` <tr style="height:20px;line-height:20px;display:none;">`+
` <td colspan="2" style="text-align:center;">${CreateButton('saveChangeProperties', GetText('Update'), '', 'padding:3px 8px; width:43px;')}</td>`+
` </tr>`+
` </tbody>`+
` <tfoot>`+
` <tr style="line-height:10px;height:10px;">`+
` <td colspan="2">`+
` <p style="width: 60px;border-top:1px solid gray;margin:0 auto 2px;">`+
` <img id="toggleExtraSettings" src="${Tool.sources.getLink('https://img.favpng.com/11/7/10/computer-icons-eye-png-favpng-b9eV1DRv9qP55UTXxRh6EACiV.jpg')}" alt="show" height="15px" width="25px" style="cursor:pointer;margin-top:10px;">`+
` </p>`+
` </td>`+
` </tr>`+
` </tfoot>`+
` </table>`+
//Scriptin özelliklerinin gösterileceği tablo ekleniyor.
` <table id="featureList" class="table" style="margin-Top:10px;display:none;table-layout:fixed;">`+
` <thead>`+
` <tr style="background:none;">`+
` <th width="60%">${GetText('Features')}</th>`+
` <th>${GetText('Action')}</th>`+
` </tr>`+
` </thead>`+
` <tbody></tbody>`+
` </table>`+
//Script menüsünün en alt kısmı ekleniyor.
` <div style="font-family:Comic Sans MS; color:white; font-weight:bold; background-color:black; margin:15px -5px -6px -5px; border-radius: 0 0 6px 6px; padding:5px 0; text-align:center;">`+
` <p style="font-size:10px;margin:0;">`+
` ${GetText('QuestionHelp')} : `+
` <a href="https://forum.fussballcup.de/showthread.php?t=417372&page=22 "style="color:#14ffff; text-decoration:none; font-size:10px;" target="_blank">`+
` ${GetText('ClickMe')}`+
` </a>`+
` </p>`+
` <p style="font-size:10px;margin:0;">`+
` ${GetText('ScriptWriter')} : `+
` <a href="#/index.php?w=${worldId}&area=user&module=profile&action=show&clubId=${Tool.ScriptAuthorClubId}" style="color:#14ffff; text-decoration:none; cursor:pointer; font-size: 10px;">`+
` Criyessei | mot33`+
` </a>`+
` </p>`+
` </div>`+
`</div>`
);
//Script menüsüne seçili dil eklenmiş durumda fakat diğer diller şimdi ekleniyor.
for(let [key,name] of Object.entries(Translate.locale.texts.OtherLanguages)) $('#gameLanguage').append(`<option value="${key}">${name}</option>`);
let selects = $('#AntrenörSeviyesi, #GAntrenörSeviyesi');
for(let lvl=10; lvl>-1; lvl--) selects.append(`<option value="${lvl}">${lvl} ${GetText('SortLevel', {tag:0})}</option>`)
//Geçerli olan antrenör ve genç antrenör seviyeleri aktif ediliyor ve sonlarına ' *' ekleniyor.
$('#AntrenörSeviyesi').val(Tool.trainerLevel);
$('#AntrenörSeviyesi > option:selected')[0].innerHTML+=' *';
$('#GAntrenörSeviyesi').val(Tool.yTrainerLevel);
$('#GAntrenörSeviyesi > option:selected')[0].innerHTML+=' *';
//CSS Ekle
$('head').append('<link id="font-awesome" rel="stylesheet" type="text/css" href="https://stackpath.bootstrapcdn.com/font-awesome/4.7.0/css/font-awesome.min.css">');
GM_addStyle(`.disHighlight{ user-select: none; -webkit-user-select: none; -ms-user-select: none; -webkit-touch-callout: none; -o-user-select: none; -moz-user-select: none; } @keyframes flickerAnimation { 0% { opacity:1; } 50% { opacity:0; } 100% { opacity:1; } } @-o-keyframes flickerAnimation{ 0% { opacity:1; } 50% { opacity:0; } 100% { opacity:1; } } @-moz-keyframes flickerAnimation{ 0% { opacity:1; } 50% { opacity:0; } 100% { opacity:1; } } @-webkit-keyframes flickerAnimation{ 0% { opacity:1; } 50% { opacity:0; } 100% { opacity:1; } } .animate-flicker { -webkit-animation: flickerAnimation 1s infinite; -moz-animation: flickerAnimation 1s infinite; -o-animation: flickerAnimation 1s infinite; animation: flickerAnimation 1s infinite; } #scriptMenuToggleBtn{ position:absolute; top:-44px; right:-23px; height:40px; width:40px; background-image: url(https://i.ibb.co/tJC5RX3/HFWRRt6.png); z-index:20; opacity:.5; cursor:pointer; } #scriptMenuToggleBtn:hover , #scriptMenuToggleBtn.active{ opacity:1; } #ScriptMenu > table > tbody > tr > td{ word-wrap: break-word; white-space: normal; line-height: 15.5px; padding:3px 6px; } #ScriptMenu{ z-index:10; position: absolute; width: 180px; background: white; top: 0; right: -180px; overflow-wrap: break-word; display: block; margin: 0 auto; padding:5px; border-radius: 8px; font-size:10px; border: 1px solid black!important; box-sizing: border-box; } #ScriptMenu > h2{ width: 100%; color: white; font-weight: bold; border: 0; margin: -5px 0 0 -5px; text-align: center; font-size: 14px; height: 30px; background:url(/designs/redesign/images/layout/headlines_sprite.gif) 0 -70px repeat-x; border-radius: 7px 7px 0 0; margin-bottom:5px; cursor:move; } table.table thead th:first-of-type{ border-radius : 7px 0 0 7px; } table.table thead th:last-of-type{ border-radius : 0 7px 7px 0; } table.table th{ background : #c01700; } table.table tbody tr.even > td{ background: #eee; } table.table tbody tr > td:first-of-type{ padding-left:5px; text-align:left; } table.table tbody tr.even > td:first-of-type{ border-radius : 7px 0 0 7px; } table.table tbody tr.even > td:last-of-type{ border-radius : 0 7px 7px 0; } table.table tbody td{ border-bottom: 0; } div.box p{ margin-Bottom:5px; } .slideThree input[type=checkbox]{ visibility: hidden; } .slideThree { width: 55px; height: 21px; background: #333; margin: 0; -webkit-border-radius: 55px; -moz-border-radius: 50px; border-radius: 50px; position: relative; -webkit-box-shadow: inset 0px 1px 1px rgba(0,0,0,0.5), 0px 1px 0px rgba(255,255,255,0.2); -moz-box-shadow: inset 0px 1px 1px rgba(0,0,0,0.5), 0px 1px 0px rgba(255,255,255,0.2); box-shadow: inset 0px 1px 1px rgba(0,0,0,0.5), 0px 1px 0px rgba(255,255,255,0.2); } .slideThree:after { content: \'Off\'; font: 9px/26px Arial, sans-serif; color: red; position: absolute; right: 7px; top: -2px; z-index: 0; font-weight: bold; text-shadow: 1px 1px 0px rgba(255,255,255,.15); } .slideThree:before { content: \'On\'; font: 9px/26px Arial, sans-serif; color: #00bf00; position: absolute; left: 7px; top: -2px; z-index: 0; font-weight: bold; } .slideThree label { display: block; width: 25px; height: 17px; -webkit-border-radius: 50px; -moz-border-radius: 50px; border-radius: 50px; -webkit-transition: all .4s ease; -moz-transition: all .4s ease; -o-transition: all .4s ease; -ms-transition: all .4s ease; transition: all .4s ease; cursor: pointer; position: absolute; top: 2px; left: 3px; z-index: 1; -webkit-box-shadow: 0px 2px 5px 0px rgba(0,0,0,0.3); -moz-box-shadow: 0px 2px 5px 0px rgba(0,0,0,0.3); box-shadow: 0px 2px 5px 0px rgba(0,0,0,0.3); background: #fcfff4; background: -webkit-linear-gradient(top, #fcfff4 0%, #dfe5d7 40%, #b3bead 100%); background: -moz-linear-gradient(top, #fcfff4 0%, #dfe5d7 40%, #b3bead 100%); background: -o-linear-gradient(top, #fcfff4 0%, #dfe5d7 40%, #b3bead 100%); background: -ms-linear-gradient(top, #fcfff4 0%, #dfe5d7 40%, #b3bead 100%); background: linear-gradient(top, #fcfff4 0%, #dfe5d7 40%, #b3bead 100%); filter: progid:DXImageTransform.Microsoft.gradient( startColorstr=\'#fcfff4\', endColorstr=\'#b3bead\',GradientType=0 ); } .slideThree input[type=checkbox]:checked + label { left: 26px; } label.menü > select { padding:4px; margin: 0; -webkit-border-radius:9px; -moz-border-radius:4px; border-radius:4px; -webkit-box-shadow: 0 px 0 #ccc, 0 -1px #fff inset; -moz-box-shadow: 0 2px 0 #ccc, 0 -1px #fff inset; box-shadow: 0 2px 0 #ccc, 0 -1px #fff inset; background: #f8f8f8; color:#888; border:none; outline:none; display: inline-block; -webkit-appearance:none; -moz-appearance:none; appearance:none; cursor:pointer; } label.menü > select { padding-right:18px; font-size:9px; width:45px; margin:0 auto; text-align-last: center; } label.menü { position:relative } label.menü:after { content:'<>'; font:8px \"Consolas\", monospace; color:#aaa; -webkit-transform:rotate(90deg); -moz-transform:rotate(90deg); -ms-transform:rotate(90deg); transform:rotate(90deg); right:2px; top:2px; padding:0 0 2px; border-bottom:0px solid #ddd; position:absolute; pointer-events:none; } label.menü:before { content:''; right:0px; top:0px; width:5px; height:px; background:#f8f8f8; position:absolute; pointer-events:none; display:block; } @keyframes fadeInDown { 0% { opacity: 0; transform: translateY(-1.25em); } 100% { opacity: 1; transform: translateY(0); } } .openClose[open] { animation-name: fadeInDown; animation-duration: 0.5s; } @keyframes fadeInDown { 0% { opacity: 0; transform: translateY(-1.25em); } 100% { opacity: 1; transform: translateY(0); } } .details5[open] { animation-name: fadeInDown; animation-duration: 0.5s; } @keyframes fadeInUp { 0% { opacity: 1; transform: translateY(0); } 100% { opacity: 0; transform: translateY(-1.25em); } } .openClose[close] { animation-name: fadeInUp; animation-duration: 0.5s; } .checkbox_1 { display: none; } .checkbox_1 + label:before { cursor: pointer; content: \'\\2714\'; border: 0.1em solid #d95555; border-radius: 0.2em; display: inline-block; width: 1.1em; height: 1em; padding-left: 0em; padding-bottom: 0.3em; padding-top:-0.1em; margin-right: 0em; vertical-align: middle; text-align:center; color: #d95555; transition: .2s; } .checkbox_1 + label:active:before { transform: scale(0); } .checkbox_1:checked + label:before{ background-color: red; border-color: red; color: #fff; } /*** custom checkboxes ***/ .checkbox_2 { display:none; } /* to hide the checkbox itself */ .checkbox_2 + label:before { font-family: FontAwesome; display: inline-block; } .checkbox_2 + label:before { content: \'\\f096\'; } /* unchecked icon */ .checkbox_2 + label:before { letter-spacing: 2px; } /* space between checkbox and label */ .checkbox_2:not(:checked):hover + label:before{content: \'\\f046\';color:#6f6e6e;letter-spacing: 0;} .checkbox_2:checked + label:before { content: \'\\f046\'; } /* checked icon */ .checkbox_2:checked + label:before { letter-spacing: 0; } /* allow space for check mark */ .sorting_players{ font-size:10px; text-align:center; padding:5px 0; margin-bottom: 9px; border-bottom: 1px solid white; line-height:1.5; } .sorting_players > label{ display:inline-block; } .sorting_players > label:not(:first-child){ margin-left:8px; } .sorting_players > label > input{ vertical-align:middle; margin:-3px 1px 0 0; cursor:pointer; } .sorting_players st{ color:#c8c7c7; } .sorting_players input:checked + st{ color : #04da97; } .filterByPositions{ margin: -3px 0 7px; text-align: center; } .filterByPositions > .filter_position{ border-radius: 20%; background-color:green; cursor: pointer; display:inline-block; padding:2px 0; font-size: 8px; color: white; min-width: 20px; opacity:1; margin:2px; } .filterByPositions > .filter_position.not_active{ opacity:0.3; } .grow,.grow2 { transition: all .2s ease-in-out; } .grow:hover { transform: scale(1.1); } .grow2:hover{ transform: scale(1.5); } .slider { -webkit-appearance: none; width: 100%; height: 20px; background: #d3d3d3; outline: none; opacity: 0.7; -webkit-transition: .2s; transition: opacity .2s; } .slider:hover { opacity: 1; } .slider::-webkit-slider-thumb { -webkit-appearance: none; appearance: none; border-radius:6px; width: 30px; height: 20px; background: #4CAF50; cursor: pointer; } .slider::-moz-range-thumb { border-radius:6px; width: 30px; height: 20px; background: #4CAF50; cursor: pointer; }`);
//For Features Table
this.featuresList = {
clear:function(){
$('#featureList > tbody').html('');
$('#featureList > tbody').parent().hide();
},
show:function(features){
let counter=0;
features.forEach(feature=>{
let div = $('<div class="slideThree"></div>'),
featureId = feature.name,
featureName = Translate.locale.texts.FeaturesName[featureId] || featureId;
if(feature.hover_selector!=undefined){
div.attr('hover_selector',feature.hover_selector);
$(feature.hover_selector).css('transition','background-color 1s;');
}
div.append(
`<input type="checkbox" id="${featureId}" class="slideThreeInput" ${feature.active?'checked="checked"':''}>`+
`<label for="${featureId}"></label>`
);
$('#featureList > tbody').append(
`<tr class="${counter++%2?'even':'odd'}">`+
` <td><label k="${featureId}">${featureName}</label></td>`+
` <td>${div[0].outerHTML}</td>`+
'</tr>'
);
if(feature.active && !feature.work){
$('#featureList > tbody > tr:last > td:first').css({
'color':'#e23f3fb5',
'font-style':'italic'
});
}
});
if(counter>0){
$('#featureList > tbody').parent().show();
$('#featureList > tbody > tr .slideThreeInput').click(function(){
console.log(this);
Tool.features.getByName(this.id)[this.checked?'activate':'deactivate']();
Tool.setVal('featuresActiveStatus',Tool.features.reduce((acc,feature)=>{acc[feature.name]=feature.active;return acc},{}));
if(!this.checked) $('.addedBy_'+this.id).remove();
});
$('#featureList > tbody .slideThreeInput:checked').parent('[hover_selector]').mouseenter(function(){
$($(this).attr('hover_selector')).addClass('animate-flicker').css('background-color','#910e0ea8');
}).mouseleave(function(){
$($(this).attr('hover_selector')).removeClass('animate-flicker').css('background-color','');
});
}
else{
$('#featureList > tbody').parent().hide();
}
}
}
}
createMenuEvents(){
delete this.__proto__.createMenuEvents;
//Script menüsü hareket ettirilebilecek.
$("#ScriptMenu").draggable({ handle: "h2" });
//Oyun dili değiştirilmek istendiğinde yapılacak kodlar ekleniyor.
$('#gameLanguage').change(function(){
//Select box kitleniyor.Bu sayede dil değiştirilene kadar tekrar değiştirilmesine izin verilmiyor.
this.disabled = true;
this.style.cursor = 'not-allowed';
//Change Language
let result = Translate.changeLanguage(this.value, this.selectedIndex);
if(result.status=='success'){
Tool.language = Translate.locale.name;
//Update User Servers Language Preferences
let userLanguage = GM_getValue('userLanguage',{});
if(typeof userLanguage != 'object') userLanguage = {};
userLanguage[Game.server] = Tool.language;
GM_setValue('userLanguage', userLanguage);
}
else{
Game.giveNotification(false, result.msg);
throw new Error(JSON.stringify(result, null, '\t'));
}
//Kitlenen select box açılıyor.
this.disabled = false;
this.style.cursor = '';
});
//Script menüsünde çok yer kaplamaması için gizlenen antrenör ve genç antrenör select boxlarının gizlenip-gösterilebilmesi için click eventi oluşturuluyor.
$('#toggleExtraSettings').click(function(){
$('#ExtraSettings').toggle();
let a = $('#toggleExtraSettings').attr('alt')=='hide'?'show':'hide';
$(this).attr({
'src': Tool.sources.getLink('https://img.favpng.com/11/7/10/computer-icons-eye-png-favpng-b9eV1DRv9qP55UTXxRh6EACiV.jpg'),
'alt': a
});
if(a=='hide' && $('#saveChangeProperties').parents('tr:first').is(':visible')){ //Restore
$('#AntrenörSeviyesi').val($('#AntrenörSeviyesi').attr('currentvalue'));
$('#GAntrenörSeviyesi').val($('#GAntrenörSeviyesi').attr('currentvalue'));
$('#saveChangeProperties').parents('tr').first().hide();
}
});
//Antrenör veya genç antrenör seviyesi güncel seviyesinden farklı olursa kayıt etme butonu gösteriliyor,aksi taktirde gizleniyor.
$('#AntrenörSeviyesi').add($('#GAntrenörSeviyesi')).change(function(){
let o=$('#'+(this.id=='AntrenörSeviyesi'?'GAntrenörSeviyesi':'AntrenörSeviyesi'));
$('#saveChangeProperties').parents('tr').first()[
this.value!=$(this).attr('currentvalue') || o.val()!=o.attr('currentvalue')?'show':'hide'
]();
});
//Değiştirilen antrenör ve|veya genç antrenör seviyeleri kayıt ediliyor ve sayfa yenilenerek değişikli(ğin|klerin) gösterilmesi sağlanıyor.
$('#saveChangeProperties').click(function(){
$(this).parents('tr').first().hide();
let clubDatas = Tool.getVal('clubDatas');
clubDatas.trainerLevel = parseInt($('#AntrenörSeviyesi').val());
clubDatas.yTrainerLevel = parseInt($('#GAntrenörSeviyesi').val());
Tool.setVal('clubDatas',clubDatas);
location.reload();
});
//Script verilerilerinin indirilmesi
$('#downloadValues').click(function(){
let cookies = GM_listValues().sort(function(a,b){
let s1=a.substring(0,a.indexOf('_')+1),
s2=b.substring(0,b.indexOf('_')+1);
if((a=a.substring(a.indexOf('_')+1))>(b=b.substring(b.indexOf('_')+1))) return 1;
else if(a<b) return -1;
return s1>s2;
}),
cookiesText = '',
ekle='',
veri;
for(let i = 0; i < cookies.length ; i++){
ekle = '';
if(!(veri = GM_getValue(cookies[i]))) continue;
ekle = Array.isArray(veri)?returnArrayString(veri):JSON.stringify(veri,null,'\t');
cookiesText +='CookieKey&:'+cookies[i]+':'+ekle+'\n\n';
}
if(cookiesText.trim()) DownloadAsTextFile(cookiesText,'Fcup Script Datas');
else Game.giveNotification(false, GetText('NotDataExist'));
function returnArrayString(array){
let o='[';
for(let i = 0 ; i < array.length ; i++){
o+=Array.isArray(array[i])?returnArrayString(array[i]):JSON.stringify(array[i],null,'\t')+',';
}
o = o.substring(0,o.length-1)+']';
return o;
}
});
//İndirilen script verilerinin yüklenmesi
$('#uploadValues').click(function(){
ReadTextFile((valuesText)=>{
valuesText.split('CookieKey&:').slice(1).forEach(data=>{
let b = data.indexOf(':');
GM_setValue(data.substring(0,b),JSON.parse(data.substring(b+1)));
});
Tool.fixValues();
Game.giveNotification(true, GetText('DataLoaded')+'!!');
location.reload();
});
});
//Scriptin sıfırlanması
$('#deleteValues').click(function(){
let globaldatas = GM_listValues().filter(key=>{return key.indexOf('_')==-1}),
opt = ["1","2"],
exit = "3";
if(globaldatas.length!=0){
opt.push("3");
exit = "4";
};
let wrongChoise = $(this).attr('wrong_choise'),
choise = prompt(
(wrongChoise==undefined?"":"Wrong choise: "+wrongChoise+"\n\n")+
"1: Delete all servers datas\n"+
"2: Delete all current server["+Game.server+"] datas\n"+
(globaldatas.length==0?"":"3: Delete global datas: "+globaldatas.join(', ')+"\n")+
exit+": Exit\n"+
"Enter your choise:",2
);
$(this).removeAttr('wrong_choise');
if(choise==null || choise==exit) return;
if(!opt.includes(choise)){
$('#deleteValues').attr('wrong_choise',choise).click();
return;
}
let keys;
if(choise=="1") //Delete all servers datas
keys = GM_listValues();
else if(choise=="2"){ //Delete current server datas
keys = GM_listValues().filter(key=>{
let find = key.indexOf('_');
return find!=-1 && key.substring(0,find).trim() == Game.server
});
}
else keys = globaldatas;
keys.forEach(key=>GM_deleteValue(key));
Game.giveNotification(true, GetText('DataCleared'));
location.reload();
});
}
checkVersion(){
delete this.__proto__.checkVersion;
GM_xmlhttpRequest({
method: "GET",
url: "https://greasyfork.org/scripts/438633-fcup-script/code/FCup%20Script.user.js",
onload: function(response) {
let text = response.responseText,
b = text.indexOf('@version')+8,
b1 = text.indexOf('/',b),
version = text.substring(b,b1).trim(),
currentVersion = GM_info.script.version;
if(version!=currentVersion){
let header = {
css : {'text-align':'center'},
content :
`<span class="icon" style="background:url(/designs/redesign/images/layout/icons_sprite.png?v=2.2.6.14231) 0 -1180px no-repeat;margin-Right:10px;float:left;margin:6px;"></span>`+
GetText('ReleasedVersion', {args:[version]})
};
let div = {
footer : !0,
close : !0,
class : 'container'
};
div.content =
`<img src="https://image.ibb.co/jrcFap/Untitled.png" style="height:73px; float:left; margin:-15px 0 0 -15px;">`+
`<p style="font-size:15px; margin-Bottom:10px; font-weight:bold; color:red; text-align:center;">`+
` ${GetText('CurrentVersion')+' '+currentVersion}`+
` <label style="color:green; margin-Left:50px;">${GetText('NewVersion')+" : "+ version}</label>`+
`</p>`+
`<p style="font-size:14px; font-weight:bold; color:blue;">`+
` ${GetText('UpdateTheScriptInfo', {args:['<a href="https://greasyfork.org/scripts/438633-fcup-script/code/FCup%20Script.user.js" style="font-size:14px">','</a>']})}`+
`</p>`+
`<p style="margin-Top:20px;text-align:center;">${CreateButton('relaodPage', GetText('RefreshPage'))}</p>`;
ShowDialog(div,header);
$('#relaodPage').click(()=>location.reload());
}
else console.log('[Version control] => %cVersion up to date.','color:green;');
},
onerror: function() {
console.log('[Version control] => %cFail!','color:red;');
}
});
}
createNoticeArea(){
delete this.__proto__.createNoticeArea;
GM_addStyle(`#notice_in { color: white; font-size: 12px; background-color: #088A08; padding: 3px; width: 130px; margin: auto; border-radius: 10px; cursor: pointer; letter-spacing: 0.11em; } #notice_out { width: 100%; background-color: transparent; padding: 10px; border: 0px solid #088A08; } #Notizbereich { position: static; margin: 5px; height: 150px; background-color: #FFFFFF; border: 1px solid #DF0101; border-radius: 10px; padding: 4px 5px; min-height: 59px; min-width: 345px; } .notiz_button { border-radius: 12px; background-color: #B40404; border: none; color: #FFFFFF; text-align: center; font-size: 13px; padding: 4px; width: 106px; transition: all 0.5s; cursor: pointer; margin: 2px 8px; }`);
$('body').prepend(
`<div id="notice_area">`+
` <div id="notice_in" class="disHighlight" lock="0">${GetText('OpenNote')}</div>`+
` <div id="notice_out">`+
` <p>`+
` <textarea id="Notizbereich" cols="80" rows="5" placeholder="${GetText('WriteANote', {tag:0})}" tool_pt="WriteANote" style="max-width:${$('#header').width()}px;">${Tool.getVal('Notiz','')}</textarea>`+
` <p>`+
` <input id="notiz_save_btn" class="notiz_button" type="button" value="${GetText('SaveNote', {tag:0})}" tool_vt="SaveNote">`+
` <input id="notiz_clr_btn" class="notiz_button" type="button" value="${GetText('ClearField', {tag:0})}" tool_vt="ClearField">`+
` </p>`+
` </p>`+
` <p>`+
` <font id="change_clue" style="color:#1C6125;border-radius:7px;padding:3px 4px;text-align:center;opacity:0;"></font>`+
` </p>`+
` </div>`+
`</div>`
);
$('#notice_out').attr('outerHeight',$('#notice_out').outerHeight()).hide();
$("#chatToggleBtn").css('top','+='+$('#notice_area').outerHeight()+'px');//Düzenleme yapılıyor.
$('#notice_in').click(function(){
if($(this).attr('lock')!=0) return;
$(this).attr('lock',1);
let open = !$('#notice_out').is(':visible'),
time = 750;
$('#notice_in').html(open?GetText('CloseNote'):GetText('OpenNote'));
$('#notice_out').slideToggle(time);
$("#chatToggleBtn").animate({ "top": (open?"+":"-")+"="+$('#notice_out').attr('outerHeight')+"px" }, time);
setTimeout(()=>{ $(this).attr('lock',0); },time);
});
$('#notiz_save_btn').click(function(){
Tool.setVal('Notiz', $('#Notizbereich').val());
change_clue(GetText('SavedNote'));
});
$('#notiz_clr_btn').click(function(){
$('#Notizbereich').val('');
Tool.delVal('Notiz');
change_clue(GetText('ClearedNote'));
});
let interval;
function change_clue(value){
$('#change_clue').animate({'opacity':1});
clearTimeout(interval);
$('#change_clue').html(value);
interval = setTimeout(function() {
$('#change_clue').animate({'opacity':0},200);
setTimeout(()=>{
$('#change_clue').html('');
},200);
}, 2800);
}
}
pipe(func=()=>{}){func(Tool)}
printValues(){
delete this.__proto__.printValues;
console.clear();
let values = this.fixValues();
if(!values.length){
console.log("%c! ANY COOKIES ARE EXIST",'color:red;font-weight:bold;font-size:15px;');
return;
}
console.log("%cVALUES","color:white;text-align:center;font-size:15px;padding:2px 500px;background-color:black;border-radius:7px;text-weight:bold;display:inline;");
values.sort(function(a,b){
let s1=a.substring(0,a.indexOf('_')+1),
s2=b.substring(0,b.indexOf('_')+1);
if((a=a.substring(a.indexOf('_')+1))>(b=b.substring(b.indexOf('_')+1))) return 1;
else if(a<b) return -1;
return s1>s2;
});
let maxLongKey = values.reduce((acc,val)=>{return Math.max(acc,val);},-1);
values.forEach(cookieKey=>{
let find = cookieKey.indexOf('_');
console.log(
'%c' + cookieKey.substring(0,find) + '%c' + (find!=-1?'_':' ') + '%c' + cookieKey.substring(find+1) + (" ").repeat(Math.abs(maxLongKey-cookieKey.length+(find!=-1?0:-3))) + ' %c: %c%o',
'font-weight:bold;color:blue;',
'font-weight:bold;color:orange;',
'font-weight:bold;color:green;',
'font-weight:bold;color:black;',
'color:black;',
GM_getValue(cookieKey)
);
});
console.log('\n');
}
fixValues(valuesList=GM_listValues()){
for(let i=0,find,server,valueKey,valueName,deleteValue ; i < valuesList.length ; i++){
valueKey = valuesList[i];
deleteValue = !1;
if((find=valueKey.indexOf('_'))==-1) server=null;
else server = valueKey.substring(0,find);
switch(valueName=valueKey.substring(find+1)){
case 'clubDatas':
var clubDatas = GM_getValue(valueKey);
if(typeof clubDatas == 'object'){
if(clubDatas.hasOwnProperty('trainingProgram')){
delete clubDatas.trainingProgram;
GM_setValue(valueKey,clubDatas);
}
}
else deleteValue = !0;
break;
case 'LeagueData':
var LeagueData = GM_getValue(valueKey);
if(typeof LeagueData == 'object' && !$.isEmptyObject(LeagueData)){
if(LeagueData.hasOwnProperty('IlkMacTarihi')){
LeagueData.firstMatchDate = LeagueData.IlkMacTarihi;
LeagueData.firstHalfFinalMatchDate = LeagueData.IlkYarıSonMacTarihi;
LeagueData.lastMatchDate = LeagueData.SonMacTarihi;
LeagueData.league = LeagueData.lig;
delete LeagueData.IlkMacTarihi;
delete LeagueData.IlkYarıSonMacTarihi;
delete LeagueData.SonMacTarihi;
delete LeagueData.lig;
GM_setValue(valueKey,LeagueData);
}
}
else deleteValue = !0;
break;
/*case 'ClubExchange':
let ClubExchange = GM_getValue(cookieKey);
if(typeof ClubExchange == 'object' && !$.isEmptyObject(ClubExchange)){
for(let PlayerId in ClubExchange){
let date = ClubExchange.date; //03.02.2019
}
}
else deleteCookie = !0;
break;
case 'YoungPlayers':
let YoungPlayers = GM_getValue(cookieKey);
if(typeof YoungPlayers == 'object'){
}
else deleteCookie = !0;
break;*/
case 'AutomaticTraining':case 'PlayersHealth':case 'SquadsStrength':
deleteValue = !0;
break;
case 'FeaturesOfScript': case 'featuresActiveStatus':
var featuresActiveStatus = GM_getValue(valueKey);
if(valueName=='FeaturesOfScript'){
GM_setValue(server+'_featuresActiveStatus',featuresActiveStatus);
GM_deleteValue(valueKey);
}
if(typeof featuresActiveStatus == 'object'){
let changed = 0;
if(featuresActiveStatus.PlayersHealth){
delete featuresActiveStatus.PlayersHealth;
changed++;
}
/*
...
*/
if(changed){
if($.isEmptyObject(featuresActiveStatus)) deleteValue = !0;
else GM_setValue(valueKey,featuresActiveStatus);
}
}
break;
case 'YoungPlayers':
var YoungPlayers = GM_getValue(valueKey), //Structure: http://prntscr.com/ucg9s3
updated = 0;
if(typeof YoungPlayers != 'object') YoungPlayers = {};
if(typeof YoungPlayers.MessageBox != 'object'){ YoungPlayers.MessageBox = {}; ++updated; }
if(!Array.isArray(YoungPlayers.show)){ YoungPlayers.show = []; ++updated; }
var MessageBox = YoungPlayers.MessageBox,
show = YoungPlayers.show;
for(let playerName in MessageBox){
var date = MessageBox[playerName];
if(show.find(p=>{return p.name==playerName && p.date==date;}) != undefined){ //eslint-disable-line no-loop-func
delete MessageBox[playerName];
++updated;
}
}
if(updated) GM_setValue(valueKey,YoungPlayers);
break;
}
if(deleteValue){
GM_deleteValue(valueKey);
valuesList.splice(i--,1);
}
}
return valuesList;
}
modifyGameFunction(funcName, callBack){
let v = unsafeWindow[funcName];
if(typeof v != 'function') throw new Error(`Game function(${funcName}) try to been modified but it was't found!`);
let codes = v.toString(),
anonFunc = codes.substring(0,codes.indexOf('(')).replace('function','').trim() == "";
$(`<script id="modifyFunction_${funcName}" type="text/javascript">`).html(
"/*This function was modified by FCUP Script*/\n"+
(anonFunc?'window.'+funcName+"=":"")+
codes.substring(0, codes.indexOf('{')+1) + callBack(codes.substring(codes.indexOf('{')+1, codes.lastIndexOf('}'))) + '}'
).appendTo('body').remove();
}
setVal(key,data){
GM_setValue(Game.server+'_'+key, data);
}
getVal(key,defaultValue=undefined){
return GM_getValue(Game.server+'_'+key, defaultValue);
}
delVal(key){
GM_deleteValue(Game.server+'_'+key);
}
})();
unsafeWindow.toolPipe = Tool.pipe;
//Live game function is in minified.js that is external function in head tag. This function had been already declarated and it must be modify before first game page loaded.
//Before Sammy->get->updateLayout->$('#content').html(value)
Tool.modifyGameFunction('Live',content=>{
content = `\n\t$('#content > h2:first').append('<img src="https://cdn1.iconfinder.com/data/icons/interface-elements/32/accept-circle-512.png" height="25px" style="position:absolute;right: 3px;top: 3px;">');\n`+
content;
let b = content.search(/this.writeMessage\s*=\s*function/);
b = content.indexOf('{',b)+1;
b = content.indexOf('{',b)+1;
content = content.substring(0,b)+ GetFuncContent(()=>{
/*This codes were written by FCUP Script.*/
try{
var event_ = Object.assign({'_status': this.requestMin==0?'old':'new'}, arguments[1]);
if($("#MatchEventCatcher").length){
$("#MatchEventCatcher").trigger('click', [event_]);
}
else{ //Match event catcher not yet created
toolPipe(Tool=>{
if(!Tool.uncaught_events_queue) Tool.uncaught_events_queue = [];
Tool.uncaught_events_queue.push(event_);
});
}
}
catch(err){console.error('MatchEventCatcher Trigger ERROR: ' + err.message);}
}) + content.substring(b);
b = content.search(/this\s*\.\s*commit\s*=/);
let c = content.substring(b).search(/\$\s*\.\s*get/);
return content.substring(0, b+c) + GetFuncContent(()=>{
/*This codes were written by FCUP Script for Live League Table*/
$('#MatchEndCatcher').trigger('click', [this.matchId]);
}) + content.substring(b+c);
});
//Click event of .negotiation-bid-player is will declerate asap in body script tag.
//When the click event declarate, it will be deleted and new event created for them asap.
Tool.intervals.create(function(){
let events = unsafeWindow.jQuery._data($('body')[0], "events");
if(typeof events != 'object') return;
if(events.click.filter(e=>e.selector=='.negotiation-bid-player').length == 0) return;
this.delete();
unsafeWindow.jQuery('body')
.off('click', '.negotiation-bid-player')
.on('click', '.negotiation-bid-player', function(e) {
/* eslint no-multi-spaces: 0*/
/* global amountControl,durationControl,updateAds*/
let element = $(this), //Onaylama butonu
id = element.attr('unique'), //return player-29820872
playerId = element.attr('player'), //Oyuncunun id si alınıyor.
clubId = element.attr('club'), //Bizim kulüp id'imiz alınıyor.
offer = '', //Teklif ettiğimiz ücret
amount = '', //Oyuncuya vereceğimiz maaş
duration = '', //Oyuncuyla anlaşacağımız sezon sayısı
params, //Servere gönderilecek data
negotiation_type, //Müzakere tipi = [offer,negotiateDebts,negotiateWithOwnPlayer,acceptNegotiation]
pl; //Satın alınan oyuncunun isminin alınabilmesi için
//Onaylama butonu gizleniyor.
element.hide();
//Onaylama butonunun olduğu yere yükleniyor gifi ekleniyor.
element.parent().append($('<div class="load-icon loading" id="loading-'+id+'"></div>'));
if($('#bid-offer-'+id).length && $('#bid-offer-'+id).val()){ //Oyuncuyu satın almak için kulübe teklif ettiğimiz input mevcutsa ve değeri boş değilse
negotiation_type = 'offer'; //Oyuncuya teklif veriliyor.
$('#info-player-'+playerId+' .abort-negotiation-button-container').first().hide(); //Geri dönmeyi sağlayan buton gizleniyor.
offer = $('#bid-offer-' + id).val();
params = {//Example : {"elements": '{"offer":{"0":"1111;2222;3333"}}'}
'elements': JSON.stringify({
'offer': {
0: playerId+';'+clubId+';'+offer
}
})
};
}
else if($('#bid-amount-' + id).length && $ ('#bid-amount-' + id).val()){ //Teklif ettiğimiz maaş inputu mevcutsa ve değeri boş değilse
if($('#own-offers').length){//Transfer pazarı sayfası açık ise ya kendi oyuncumuzla yeni sözleşme imzalıyoruz. Yada yeni bir oyuncu satın alırken futbolcuyla sözleşme imzalıyoruz.
if((pl = $('#own-offers').find('tbody > tr span[pid="player-'+playerId+'"]')).length){ //Sözleşme imzalanan oyuncu tekliflerimiz tablosunda ise yeni bir oyuncu alarak sözleşme imzalıyoruz
negotiation_type = 'negotiateDebts';
pl = pl.parents('tr').first();
}
else//Tekliflerimizin bulunduğu tabloda yoksa, kendi oyuncumuz ile sözleşme imzalıyoruzdur.
negotiation_type = 'negotiateWithOwnPlayer'; //Oyuncu ile sözleşme yapılıyor.
}
else //Transfer pazarı sayfası açık değil. Not : Burada sıkıntı olabilir.
negotiation_type = 'negotiateWithOwnPlayer';
amount = amountControl[id].numberUnFormat($('#bid-amount-'+id).val()); //Formatı sıfırlıyor.Noktalar kaldırılıyor.Artık integer.
if($('#bid-duration-' + id).length && $('#bid-duration-'+id).val()) //Teklif ettiğimiz sezon inputu mevcutsa ve değeri boş değilse
duration = durationControl[id].numberUnFormat($('#bid-duration-'+id).val()); //Formatı sıfırlıyor.Noktalar kaldırılıyor.
params = {//Example : {"elements":'{"negotiateDebts":{"0":"1111;2222;amount=33333;duration=3"}}'}
'elements': JSON.stringify({
'negotiateDebts': {
0: playerId+';'+clubId+';amount='+amount+';duration='+duration
}
})
};
}
else{
negotiation_type = 'acceptNegotiation'; //Gözlemcinin getirdiği oyuncu için kapora ödeniyor.
params = { //Example : {"elements":'{"acceptNegotiation":{"0":"1111;2222"}}'}
'elements': JSON.stringify({'acceptNegotiation': {0: playerId+';'+clubId}})
};
}
$.get( //Servere istek gönderiliyor.
'/index.php?w='+worldId+'&area=user&module=player&action=negotiate&complex=0',
params,
function(response) { //İstek başarılı oldu!
$('#loading-'+id).remove(); //Yükleniyor gifi kaldırılıyor.
let div = $('<div>').html(response);
try{
let texts,negotiate_success = !1;
switch(negotiation_type){
case "offer":case "acceptNegotiation":break;
case "negotiateDebts": //Yeni bir oyuncu satın alırken kontrat yapıyoruz
case "negotiateWithOwnPlayer": //Kendi oyuncumuzla kontrat yeniliyoruz
div.find('script').each(function(i){
texts = $(this).html();
//window.location.href = $('span[pid=player-' + 29823205 + ']').first().attr('ref')
if(-1 != texts.search(new RegExp(`window\\s*.\\s*location\\s*.\\s*href\\s*=\\s*\\$\\s*\\(\\s*'span\\[pid=player-'\\s*\\+\\s*${playerId}\\s*\\+\\s*']'\\s*\\)`))){
div.find('script')[i].remove();
negotiate_success = !0;
let notification_text;
if(negotiation_type=="negotiateWithOwnPlayer"){//Kendi oyuncumuz ile başarılı bir şekilde sözleşme imzaladık!
notification_text = GetText('SuccessfullyContract');
}
else{//Yeni bir oyuncuyu sözleşme imzalayarak satın aldık.
let data = Tool.getVal('PlayersData',{BuyPlayers:[]}); //Structure: http://prntscr.com/uc2p4v
if(!Array.isArray(data.BuyPlayers)) data.BuyPlayers = [];
let playerName = pl.find('.player-name:first').text().trim(),
BuyPlayers = data.BuyPlayers;
BuyPlayers.splice(0,0,{
playerCountry : pl.find('td:nth-child(1) > img').attr('src').match(/\w+.gif/)[0].replace('.gif',''),
playerId : playerId,
playerName : playerName,
position : pl.find('td:nth-child(3)').text().trim(),
strength : parseInt(pl.find('td:nth-child(4)').text()),
age : parseInt(pl.find('td:nth-child(5)').text()),
salary : parseInt(amount),
price : parseInt(pl.find('td:nth-child(8)').attr('sortvalue')),
season : parseInt(duration),
club : {
id : parseInt(pl.find('td:nth-child(6) > a').attr('clubid')),
name : pl.find('td:nth-child(6) > a').text().trim()
},
date : GetDateText(Game.getTime()),
});
Tool.setVal('PlayersData',data);
notification_text = GetText('SuccessfullyTransferred', {args:[playerName]});
}
//Onaylama butonunu gizlemeye gerek yok çünkü en başta gizliyoruz : element.hide();
//$('#negotiation-bid-player-' + playerId).hide();
//Böyle bir element yok ki!
$('#info-window-player-' + playerId + ' .abort-negotiation-button-container').first().hide();
setTimeout(async function(){
location.href = $('span[pid=player-'+playerId+']').first().attr('ref');
if(notification_text){
await Game.pageLoad();
Game.giveNotification(true, notification_text);
}
},2000);
$('.negotiation table, .negotiation .info').each(function(key, e) {
e.hide();
});
return false;
}
});
break;
}
}
catch(err){
CatchError(err,'negotiation-bid-player');
}
$('#negotiate-container-'+id).html(div.html()); //Konteynıra server tarafından verilen cevap konuluyor.
updateAds(); //Reklamları güncelleme
$('body').trigger('content:changed');
}
).fail(function(){
}).always(function(){
});
});
},20);
//openCard function is will declerate asap in body script tag.
//When it is exist it will be updated to display captain image
Tool.intervals.create(function(){
if(typeof unsafeWindow.openCard != 'function') return
this.delete();
Tool.modifyGameFunction('openCard',function(content){/*To show Captain Image*/
/*global element,pid*/
return content + GetFuncContent(()=>{
/*New codes added here by FCUP Script*/
let div_dialog = element.parent();
div_dialog.css('display','none').fadeIn(400);
if(parseInt($('#agreement-info-'+pid+' > li:nth-child(8) > div > div.bar-text').text())>=55 && !$('#info-'+pid+' > div.name > img.captain_icon').length){
$('#info-'+pid+' > div.name').append(
`<img class="captain_icon" title="Captain" src="https://i.ibb.co/Sy52rxz/Captain.png" style="height:20px; float:none; margin:-7px 0 0 3px; vertical-align:middle; cursor:info;">`
);
}
});
});
},20);
Tool.features.add('ConstructionCountdown','main',function(){
$('.likebox').css('bottom','-28px');
$('#clubinfocard > ul').append(
`<li>`+
` <span class="label">${GetText('Buildings')}:</span>`+
` <span id="countdown_buildings">${GetText('Loading')}...</span>`+
`</li>`+
`<li>`+
` <span class="label">${GetText('Stadium')}:</span>`+
` <span id="countdown_stadium">${GetText('Loading')}...</span>`+
`</li>`
);
['buildings','stadium'].forEach(module=>{
if(Tool.hasOwnProperty(["finishDate_"+module])){
let seconds = parseInt((Tool["finishDate_"+module] - Game.getTime()) /1000);
let cd = $('#countdown_'+module);
cd.attr('title',new Date(Tool["finishDate_"+module]).toLocaleString());
startTimer(seconds,cd);
}
else getData(module);
});
function getData(module){
Game.getPage(`?w=${worldId}&area=user&module=${module}&action=index&_=squad`, '#content').then(content=>{
let cd = content.find('.countdown');
if(cd.length){
let seconds = parseInt(cd.first().attr('x')),
finishDate = Game.getTime()+seconds*1000;
Tool["finishDate_"+module] = finishDate; //Bitiş süresinin bir kere alınması yeterli.
cd = $('#countdown_'+module);
cd.attr('title',new Date(Tool["finishDate_"+module]).toLocaleString());
startTimer(seconds,cd);
}
else{
let result = '';
if(module=='buildings'){//buildings
if(content.find('.build').length)
result = `<a href="#/index.php?w=${worldId}&area=user&module=${module}&action=index" style="color:#51ff44;">${GetText('GoToBuildings')}</a>`;
else result = `<font color="white">${GetText('Full')}</font>`;
}
else{//stadium
let capacity = parseInt(content.find('.stadium-separator').parent().find('>span').last().text().replace('.','').trim());
let full_infrastructure = undefined == $(content[0].querySelector('#infrastructure')).find('ul.options-list > li > .imagesprite-container > div[class]').toArray().find(d=>{return $(d).hasClass('inactive')});
if(capacity == 77800 && full_infrastructure) result = `<font color="white">${GetText('Full')}</font>`;
else result = `<a href="#/index.php?w=${worldId}&area=user&module=${module}&action=index" style="color:#51ff44;">${GetText('GoToStadium')}</a>`;
}
$('#countdown_'+module).html(result);
}
}).catch(err=>{
$('#countdown_'+module).html(`<font color="#751b1b">${GetText('error')}</font>`);
console.error(err);
});
}
function startTimer(seconds,e){
e.html(SecToTime(seconds--));
Tool.intervals.create(function(){
if(seconds<1){
e.html(`<font style="color:#b20b0b; font-weight:bold;">${GetText('ItIsOver')} !</font>`);
this.delete();
return;
}
e.html(SecToTime(seconds--));
},1000,e[0].id);
}
},'#clubinfocard > ul > li:nth-child(6),#clubinfocard > ul > li:nth-child(7)');
Tool.features.add('RematchMatch','main',function(){
let requests = {
"myRequest":{
"accepted":[],
"unaccepted":[]
},
"otherRequest":{
"accepted":[],
"unaccepted":[]
}
};
$('#matches > ul.matches.simulations > li').each(function(){
let ul = $('ul',this),
o = ul.find('.squad-home .self-link').length?"myRequest":"otherRequest",
u;
if(o=="otherRequest")
u = ul.find('.show-button a[href*="acceptSimulation"]').length?"unaccepted":"accepted";
else//myRequest
u = ul.find('.show-button a[href*="match&id="]').length?"accepted":"unaccepted";
requests[o][u].push(ul);
});
let oa = requests.otherRequest.accepted,
i;
//Kabul etmiş olduğumuz deplasman isteğimiz olacak fakat o takıma gönderdiğimiz bir simülasyon davetimiz olmayacak.
for(i = 0; i < oa.length ; i++){
let find = !1,
clubId = $('li.col.info > span.squad-home > a',oa[i]).attr('clubid'),
m = requests.myRequest.accepted.concat(requests.myRequest.unaccepted),
j;
for(j = 0; j < m.length ; j++){
if(clubId == $('li.col.info > span.squad-away > a',m[j]).attr('clubid')){
find = true;
break;
}
}
if(!find){
let ul = oa[i];
ul.find('.show-button').append(`<img class="sendSimulation" k="${clubId}" src="${Tool.sources.getLink('https://www.pinclipart.com/picdir/big/130-1304128_left-curved-arrow-clipart-black-curved-arrow-png.png')}" alt="again" style="cursor:pointer; vertical-align:middle;" width="25x">`);
}
}
let images = $('img.sendSimulation');
if(!images.length) return false;
let get_club_matchId = (clubId)=>{
return new Promise((res,rej)=>{
Game.getPage(`?w=${worldId}&area=user&module=profile&action=show&clubId=${clubId}`,'#profile-show').then(profile_show=>{
res(profile_show.find('.button-container-friendly-invite-button > a')[0].href.split('&').find(a=>a.split('=')[0]=='invite').split('=')[1]);
}).catch(err=>{rej(err)});
});
};
let send_similation_request = (matchId)=>{
return new Promise((res,rej)=>{
Game.getPage(`?w=${worldId}&area=user&module=simulation&action=index&squad=${matchId}`,'#feedback').then(feedback=>{
res(!feedback.find('.error').length);
}).catch(err=>{rej(err)});
});
};
images.click(function(){
let success,
img = $(this).hide().after('<img src="/designs/redesign/images/icons/loading/16x16.gif" style="vertical-align:middle; margin-left:7px;">');
get_club_matchId($(this).attr('k'))
.then(match_id=>send_similation_request(match_id))
.then(status=>{
success = true;
if(status) Game.giveNotification(true, GetText('SimulationRequestSent'));
else Game.giveNotification(false, GetText('SimulationRequestAvailable'));
}).catch(err=>{
console.error(err);
}).finally(function(){
img.next().remove();
if(success) img.remove();
});
});
},'.sendSimulation');
Tool.features.add('NumberOfFootballerChecker','main',function(){
this.hover_selector = '#li_'+this.name;
$('#clubinfocard > div.club-avatar').append(
`<li>`+
` <span id="li_${this.name}" class="label">`+
` ${GetText('Team')}: <label id='auf_count_number'> ... </label>`+
` </span>`+
`</li>`
);
Game.getPage(`?w=${worldId}&area=user&module=formation&action=index`, '#formation-count')
.then(formation_count=>{
let count_number = formation_count.text();
if(count_number == "11") $('#auf_count_number').html('11/11');
else $('#auf_count_number').html(`<font style="color:red; text-shadow:0.5px 0.5px white;">${count_number}/11</font>`);
})
.catch(err=>{
$('#auf_count_number').html(`<font color="#751b1b">${GetText('error')}</font>`);
console.error(err);
});
});
Tool.features.add('MatchAnalyst', 'main',function(){
let box = $('#matches > ul.matches.next'), matches;
if(box.find('.no-entry').length || !(matches = box.find('>li')).length) return false;
let get_club_info = (tricot,squad)=>{
return {
id : squad.find('> a').attr('clubid'),
name: squad.find('> a').text().trim(),
logo: (squad.find('> .club-logo-container > img:first').attr('src')||"").split('/').splice(-2).shift() || 0,
tricot : {
shorts: tricot.find('img[src$="shorts.png"]').attr('color'),
tricot: tricot.find('img[src$="tricot.png"]').attr('color'),
design: tricot.find('img[src$="design.png"]').attr('color'),
model : tricot.find('img[src$="details.png"]').attr('model')
}
}
};
matches= matches.toArray().map(m=>{
let match={},
li = $(m).find('>ul>li');
match.type = $(li[0]).find('.icon.match')[0].className.replace('icon','').replace('match','').trim();
match.time = $(li[1]).find('>p').text().match(/([0-9]{2}:[0-9]{2}:[0-9]{2})/)[0];
match.date = $(li[1]).find('>p').text().replace(match.time,'').trim();
match.home = get_club_info($(li[2]), $(li[3]).find('>.squad-home:first'));
match.away = get_club_info($(li[4]), $(li[3]).find('>.squad-away:first'));
if(match.type == 'tournament' && parseInt(match.time.split(':')[0])>17) match.isSpecialTournament = !0;
return match;
});
get_club_info = undefined;
box.html('');
box[0].style="display:none; margin:0px; height:214px; background:url('https://i.ibb.co/pxPRgSL/background-image.png'); color:white; padding:5px; position:relative;";
//Create Next Matches Tables
let create_tricot = (t)=>$(
`<div class="tricot-container" style="display:inline-block;">`+
` <img class="background shorts png" src="/tricots/${t.model+'/'+t.shorts}/shorts.png" alt="shorts" model="${t.model}" color="${t.shorts}">`+
` <img class="background tricot png" src="/tricots/${t.model+'/'+t.tricot}/tricot.png" alt=tricot"" model="${t.model}" color="${t.tricot}">`+
` <img class="background design png" src="/tricots/${t.model+'/'+t.design}/design.png" alt="design" model="${t.model}" color="${t.design}">`+
` <img class="png" src="designs/redesign/images/tricots/${t.model}/details.png" alt="model" model="${t.model}">`+
`</div>`
);
let create_comparision = (compares)=>{
let e=$(`<div>`+compares.map(key=>`<p><strong>${GetText(key)}:</strong> <span>...</span></p>`).join('')+'</div>');
e.find('>p').css({
'text-align':'right',
'font-size':'12px',
'margin-bottom':'1px'
});
e.find('>p:not(:last)').css({
'border-bottom':'1px solid white',
'padding':'1px 0'
});
e.find('>p >strong').css('float','left');
return e;
}
let pages={rating:{}, manager:{}, squadstrenght:{}, fixture:{}};
for(let i=0; i<matches.length; i++){
let match = matches[i],
p_match= i-1>-1?matches[i-1]:0,
n_match= i+1<matches.length?matches[i+1]:0,
matchId= match.home.id+'_'+match.away.id+'_'+i;
let compares = [];
switch(match.type){
case "tournament":
//Turnuva sayfasına gidip, katıldığımız turnuvaları çek
if(match.isSpecialTournament){// 20:00:00
/*compare = {
rating: {
elo_rating: 1
},
manager : {
squad_strength : 1,
strongest_player: 1,
trophy: -1
}
};*/
}
else{// 14:00:00
compares = ['EloRank', 'SquadStrength', 'StrongestPlayer'];
[match.home.id, match.away.id].forEach((id,away)=>{
let squad = away?'away':'home',
e = matchId+'_'+squad;
if(!pages.rating.hasOwnProperty(id)) pages.rating[id] = {n:match[squad].name, e:[]};
pages.rating[id].e.push(e);
if(!pages.manager.hasOwnProperty(id)) pages.manager[id] = {};
['ss', 'sp'].forEach(k=>{
if(Array.isArray(pages.manager[id][k])) pages.manager[id][k].push(e);
else pages.manager[id][k] = [e]
});
});
}
break;
case "friendly":// 16:00:00
compares = ['StadiumCapacity', 'StadiumInfrastructure', 'HomeBonusCount', 'SquadStrength', 'StrongestPlayer'];
[match.home.id, match.away.id].forEach((id,away)=>{
let squad = away?'away':'home',
e = matchId+'_'+squad;
if(!pages.manager.hasOwnProperty(id)) pages.manager[id] = {};
['sc', 'si', 'hb', 'ss', 'sp',].forEach(k=>{
if(Array.isArray(pages.manager[id][k])) pages.manager[id][k].push(e);
else pages.manager[id][k] = [e]
});
});
break;
case "league":// 18:00:00
compares = ['EloRank', 'LeagueRank', 'SquadStrength', 'StrengthDetails', 'PrevMatchesScores', 'StrongestPlayer'];
if(!pages.squadstrenght.hasOwnProperty(Tool.clubId)) pages.squadstrenght[Tool.clubId] = {};
if(!pages.fixture.hasOwnProperty(Tool.clubId)) pages.fixture[Tool.clubId] = {};
[match.home.id, match.away.id].forEach((id,away)=>{
let squad = away?'away':'home',
e = matchId+'_'+squad;
if(!pages.rating.hasOwnProperty(id)) pages.rating[id] = {n:match[squad].name, e:[]};
pages.rating[id].e.push(e);
if(!pages.manager.hasOwnProperty(id)) pages.manager[id] = {};
['ss', 'sp', 'lr'].forEach(k=>{
if(Array.isArray(pages.manager[id][k])) pages.manager[id][k].push(e);
else pages.manager[id][k] = [e]
});
if(!pages.squadstrenght[Tool.clubId].hasOwnProperty(id)) pages.squadstrenght[Tool.clubId][id] = [];
pages.squadstrenght[Tool.clubId][id].push(e);
if(!pages.fixture[Tool.clubId].hasOwnProperty(id)) pages.fixture[Tool.clubId][id] = [];
pages.fixture[Tool.clubId][id].push(e);
});
break;
}
$(`<div class="matches" style="height:100%; position:relative;${i>0?" display:none;":""}">`+
` <p style="font-size:15px; color:white; text-align:center; font-weight:bold;">`+
` ${GetText(match.type=='tournament'?(match.isSpecialTournament?'specialTournamentMatch':'tournamentMatch'):(match.type+'Match'))} - ${match.date}, ${match.time}</p>`+
` <span class="fixture ${match.type}" style="width:128px; position:absolute; bottom:0; left:0;"></span>`+
` <div style="height:70%; width:90%; margin:5px auto 0 auto; position:relative; z-index:1;">`+
/* Home Club*/
` <div style="height:100%; width:49%; float:left;">`+
` <div style="position:relative; margin-bottom: 22px;">`+
` ${create_tricot(match.home.tricot).css('margin','0 5px -14px 0')[0].outerHTML}`+
` <a href="#/index.php?w=${worldId}&area=user&module=profile&action=show&clubId=${match.home.id}" clubid="${match.home.id}" ${match.home.id==Tool.clubId?'class="self-link"':''} style="font-size:13px; font-weight:bold; text-decoration:none;">${match.home.name}</a>`+
` ${match.home.logo?`<img src="/avatars/${worldId}/squad/${match.home.logo}/${match.home.id}" style="position:absolute; top:7px; right:5px;">`:''}`+
` </div>`+
` ${create_comparision(compares).attr('id',`comparison_${matchId}_home`)[0].outerHTML}`+
` </div>`+
` <div style="width:0.1%; height:100%; background-color:white; float:left; margin-left:5px;"></div>`+
/* Away Club*/
` <div style="height:100%; width:49%; float:right; text-align:right;">`+
` <div style="position:relative; margin-bottom:22px;">`+
` ${match.away.logo?`<img src="/avatars/${worldId}/squad/${match.away.logo}/${match.away.id}" style="position:absolute; top:7px; left:5px;">`:''}`+
` <a href="#/index.php?w=${worldId}&area=user&module=profile&action=show&clubId=${match.away.id}" clubid="${match.away.id}" ${match.away.id==Tool.clubId?'class="self-link"':''} style="font-size:13px; font-weight:bold; text-decoration:none;">${match.away.name}</a>`+
` ${create_tricot(match.away.tricot).css('margin','0 0 -14px 5px')[0].outerHTML}`+
` </div>`+
` ${create_comparision(compares).attr('id',`comparison_${matchId}_away`)[0].outerHTML}`+
` </div>`+
` </div>`+
`</div>`
).attr({
id: matchId,
prev_match: p_match? p_match.home.id+'_'+p_match.away.id+'_'+(i-1): null,
next_match: n_match? n_match.home.id+'_'+n_match.away.id+'_'+(i+1): null
}).appendTo(box);
}
create_tricot = create_comparision = undefined;
Object.values(pages.rating).forEach(data=>{
let e = data.e = $(data.e.map(e=>$(`#comparison_${e} strong>[k="EloRank"]`).parent().next())).map($.fn.toArray),
club_name = data.n;
e.html('<img src="/designs/redesign/images/icons/loading/16x16.gif" style="margin-left:10px; vertical-align:middle;">');
Game.getPage(`index.php?w=${worldId}&area=user&module=rating&action=index&club=${club_name}&_qf__form=&league=&path=index.php&layout=none`,'#container-rating')
.then(div=>{
let row = div.find('.table-rating > tbody > tr.odd,tr.even');
if(!row.length){
e.html('~');
return;
}
row = row.first();
let rank = parseInt(row.find('>td:first').text().split('.').join('')),
change_r = parseInt(row.find('>td:nth-child(2)').text().split('.').join('')),
points = parseInt(row.find('>td:nth-child(4)').text().split('.').join('')),
points_r = parseInt(row.find('>td:nth-child(5)').text().split('.').join(''));
e.html(rank);
})
.catch(err=>{
e.html(`<font color="#f34949" style="border-bottom:1px dashed red;">${GetText('error')}</font>`);
console.error(err);
});
});
Object.entries(pages.manager).forEach(d=>{
let clubId = d[0],
data = d[1],
ss = data.ss = $((Array.isArray(data.ss)?data.ss:[]).map(e=>$(`#comparison_${e} strong>[k="SquadStrength"]`).parent().next())).map($.fn.toArray),
sp = data.sp = $((Array.isArray(data.sp)?data.sp:[]).map(e=>$(`#comparison_${e} strong>[k="StrongestPlayer"]`).parent().next())).map($.fn.toArray),
lr = data.lr = $((Array.isArray(data.lr)?data.lr:[]).map(e=>$(`#comparison_${e} strong>[k="LeagueRank"]`).parent().next())).map($.fn.toArray),
sc = data.sc = $((Array.isArray(data.sc)?data.sc:[]).map(e=>$(`#comparison_${e} strong>[k="StadiumCapacity"]`).parent().next())).map($.fn.toArray),
si = data.si = $((Array.isArray(data.si)?data.si:[]).map(e=>$(`#comparison_${e} strong>[k="StadiumInfrastructure"]`).parent().next())).map($.fn.toArray),
hb = data.hb = $((Array.isArray(data.hb)?data.hb:[]).map(e=>$(`#comparison_${e} strong>[k="HomeBonusCount"]`).parent().next())).map($.fn.toArray);
let all = ss.add(sp).add(lr).add(sc).add(si).add(hb);
if(0 == all.length) return;
all.html('<img src="/designs/redesign/images/icons/loading/16x16.gif" style="margin-left:10px; vertical-align:middle;">');
Game.getPage(`?w=${worldId}&area=user&module=profile&action=show&clubId=${clubId}&layout=none`, '#profile-show')
.then(node=>{
let contents = node.find('ul.profile-box-squad > li:nth-child(1)').contents();
if(!contents.length) return; //Kein Verein gefunden.
if(ss.length) ss.html(node.find('ul.profile-box-squad > li:nth-child(1)').contents()[1].textContent); //Squad_Strength
if(lr.length){
let leaguetable = node[0].querySelector('#leaguetable');
if(leaguetable && !$('.no-entry',leaguetable).length){
//$('>h2',leaguetable).text().trim()+", " +
lr.html($('> div.container > div > table',leaguetable).find(`a[clubid="${clubId}"]`).parents('tr:first').find('td:first').text().trim()); //League
}
else lr.html('~');
}
if(sp.length){
let o = $('.profile-box-squad .open-card',node);
if(!o.length){
sp.html(GetText('NotFound'));
return;
}
let name = o.next().find('.ellipsis'),
playerDetails;
if(name.length){
let p = $(name.parent()[0].outerHTML);
name = name[0].title;
p.find('.ellipsis').remove();
playerDetails = p.html();
}
else{
name = o.next().text();
let idx = name.indexOf('(');
playerDetails = name.substring(idx).trim();
name = name.substring(0,idx).trim();
}
sp.html(`<span pid="player-${o.attr('pid').split('-')[1]}" class="icon details open-card" style="float:none;"></span>${/*name +" "+*/playerDetails}`);
}
if(sc.length) sc.html(node.find('.profile-box-stadium').text().trim().match(/[\d,\.]+/)[0]||"~");
if(hb.length + si.length){
unsafeWindow.jQuery.get(`/index.php?w=${worldId}&area=user&module=trophy&action=index&complex=0&clubId=${clubId}`).success(function(r){
if(si.length){
let node = $('<div>').html(r);
si.html(node.find('.trophy-50').hasClass('trophy-unavailable')?GetText("Missing"):GetText("Full"));
}
if(hb.length){
try{
let b = r.lastIndexOf('toolTipObj.addTooltips(')+23;
r = JSON.parse(r.substring(b,r.indexOf(');',b)));
let text= r.tt_trophy_70.trim(),
num = parseInt(text.substring(text.lastIndexOf(':')+1,text.lastIndexOf('<')))
hb.html(Number.isInteger(num)?num:"~");
}
catch(err){
hb.html(`<font color="#f34949" style="border-bottom:1px dashed red;">${GetText('error')}</font>`);
}
}
});
}
})
.catch(err=>{
$(all.toArray().filter(span=>$(span).find('>img').length)).html(`<font color="#f34949" style="border-bottom:1px dashed red;">${GetText('error')}</font>`);
console.error(err);
});
});
Object.entries(pages.squadstrenght).forEach(d=>{
let clubId = d[0];
if(clubId != Tool.clubId) return;
let data = d[1] = Object.entries(d[1])
.map(d=>[d[0], $(d[1].map(e=>$(`#comparison_${e} strong>[k="StrengthDetails"]`).parent().next())).map($.fn.toArray)])
.reduce((acc,d)=>{acc[d[0]]=d[1];return acc;},{});
$(Object.values(data)).map($.fn.toArray).html('<img src="/designs/redesign/images/icons/loading/16x16.gif" style="margin-left:10px; vertical-align:middle;">');
Game.getPage(`?w=${worldId}&area=user&module=statistics&action=squadstrenght&layout=none`, '#squad-strengths')
.then(table=>{
let tbody = table.find('>tbody:first');
Object.entries(data).forEach(d=>{
let clubId = d[0],
e = d[1],
a = tbody.find(`td.name-column > a[clubid="${clubId}"]:first`);
if(!a.length){
e.html('~');
return;
}
e.html(a.parents('tr').find('>td[sortvalue]:not(.last-column)').toArray().map(e=>$(e).attr('sortvalue')).join(' | '));
});
})
.catch(err=>{
$($(Object.values(data)).map($.fn.toArray).toArray().filter(span=>$(span).find('>img').length)).html(`<font color="#f34949" style="border-bottom:1px dashed red;">${GetText('error')}</font>`);
console.error(err);
});
});
Object.entries(pages.fixture).forEach(d=>{
let clubId = d[0];
if(clubId != Tool.clubId) return;
let data = d[1] = Object.entries(d[1])
.map(d=>[d[0], $(d[1].map(e=>$(`#comparison_${e} strong>[k="PrevMatchesScores"]`).parent().next())).map($.fn.toArray)])
.reduce((acc,d)=>{acc[d[0]]=d[1];return acc;},{});
let all = $(Object.values(data)).map($.fn.toArray);
all.html('<img src="/designs/redesign/images/icons/loading/16x16.gif" style="margin-left:10px; vertical-align:middle;">');
let images = {
'W': 'data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KPHN2ZyB3aWR0aD0iMTZweCIgaGVpZ2h0PSIxNnB4IiB2aWV3Qm94PSIwIDAgMTYgMTYiIHZlcnNpb249IjEuMSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiB4bWxuczp4bGluaz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94bGluayI+CiAgICA8ZyBpZD0iUGFnZS0xIiBzdHJva2U9Im5vbmUiIHN0cm9rZS13aWR0aD0iMSIgZmlsbD0ibm9uZSIgZmlsbC1ydWxlPSJldmVub2RkIj4KICAgICAgICA8ZyBpZD0iV2luIj4KICAgICAgICAgICAgPGNpcmNsZSBpZD0iT3ZhbCIgZmlsbD0iIzNBQTc1NyIgY3g9IjgiIGN5PSI4IiByPSI4Ij48L2NpcmNsZT4KICAgICAgICAgICAgPHBvbHlnb24gaWQ9IlBhdGgiIGZpbGw9IiNGRkZGRkYiIGZpbGwtcnVsZT0ibm9uemVybyIgcG9pbnRzPSI2LjQgOS43NiA0LjMyIDcuNjggMy4yIDguOCA2LjQgMTIgMTIuOCA1LjYgMTEuNjggNC40OCI+PC9wb2x5Z29uPgogICAgICAgIDwvZz4KICAgIDwvZz4KPC9zdmc+Cg==',
'D': 'data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KPHN2ZyB3aWR0aD0iMTZweCIgaGVpZ2h0PSIxNnB4IiB2aWV3Qm94PSIwIDAgMTYgMTYiIHZlcnNpb249IjEuMSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiB4bWxuczp4bGluaz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94bGluayI+CiAgICA8ZyBpZD0iUGFnZS0xIiBzdHJva2U9Im5vbmUiIHN0cm9rZS13aWR0aD0iMSIgZmlsbD0ibm9uZSIgZmlsbC1ydWxlPSJldmVub2RkIj4KICAgICAgICA8ZyBpZD0iRHJhdyI+CiAgICAgICAgICAgIDxjaXJjbGUgaWQ9Ik92YWwiIGZpbGw9IiM5QUEwQTYiIGN4PSI4IiBjeT0iOCIgcj0iOCI+PC9jaXJjbGU+CiAgICAgICAgICAgIDxwb2x5Z29uIGlkPSJQYXRoIiBmaWxsPSIjRkZGRkZGIiBwb2ludHM9IjUgNyAxMSA3IDExIDkgNSA5Ij48L3BvbHlnb24+CiAgICAgICAgPC9nPgogICAgPC9nPgo8L3N2Zz4K',
'L': 'data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KPHN2ZyB3aWR0aD0iMTZweCIgaGVpZ2h0PSIxNnB4IiB2aWV3Qm94PSIwIDAgMTYgMTYiIHZlcnNpb249IjEuMSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiB4bWxuczp4bGluaz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94bGluayI+CiAgICA8ZyBpZD0iUGFnZS0xIiBzdHJva2U9Im5vbmUiIHN0cm9rZS13aWR0aD0iMSIgZmlsbD0ibm9uZSIgZmlsbC1ydWxlPSJldmVub2RkIj4KICAgICAgICA8ZyBpZD0iTG9zcyI+CiAgICAgICAgICAgIDxjaXJjbGUgaWQ9Ik92YWwiIGZpbGw9IiNFQTQzMzUiIGN4PSI4IiBjeT0iOCIgcj0iOCI+PC9jaXJjbGU+CiAgICAgICAgICAgIDxwb2x5Z29uIGlkPSJQYXRoIiBmaWxsPSIjRkZGRkZGIiB0cmFuc2Zvcm09InRyYW5zbGF0ZSg4LjAwMDAwMCwgOC4wMDAwMDApIHJvdGF0ZSgtMzE1LjAwMDAwMCkgdHJhbnNsYXRlKC04LjAwMDAwMCwgLTguMDAwMDAwKSAiIHBvaW50cz0iMTIgOC44IDguOCA4LjggOC44IDEyIDcuMiAxMiA3LjIgOC44IDQgOC44IDQgNy4yIDcuMiA3LjIgNy4yIDQgOC44IDQgOC44IDcuMiAxMiA3LjIiPjwvcG9seWdvbj4KICAgICAgICA8L2c+CiAgICA8L2c+Cjwvc3ZnPgo=',
'-': 'data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KPHN2ZyB3aWR0aD0iMTZweCIgaGVpZ2h0PSIxNnB4IiB2aWV3Qm94PSIwIDAgMTYgMTYiIHZlcnNpb249IjEuMSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiB4bWxuczp4bGluaz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94bGluayI+CiAgICA8ZyBpZD0iUGFnZS0xIiBzdHJva2U9Im5vbmUiIHN0cm9rZS13aWR0aD0iMSIgZmlsbD0ibm9uZSIgZmlsbC1ydWxlPSJldmVub2RkIj4KICAgICAgICA8ZyBpZD0iRW1wdHkiIGZpbGw9IiNGRkZGRkYiIHN0cm9rZT0iI0JEQzFDNiIgc3Ryb2tlLXdpZHRoPSIyIj4KICAgICAgICAgICAgPGNpcmNsZSBpZD0iT3ZhbCIgY3g9IjgiIGN5PSI4IiByPSI3Ij48L2NpcmNsZT4KICAgICAgICA8L2c+CiAgICA8L2c+Cjwvc3ZnPgo='
}
Game.getPage(`?w=${worldId}&area=user&module=statistics&action=games&layout=none`)
.then(content=>{
let table ,ul, trs;
if(!(table=content.find('#league-crosstable')).length ||
!(ul=content.find('.date-selector > ul:first')).length ||
!(trs=table.find('>tbody > tr')).length){
all.html('~');
return;
}
let played = ul.find('li.day.past').length,
getDatas = (td)=>{
let goals, week;
if((goals=$('>p',td).text().trim().split(':').map(n=>parseInt(n))).length!=2 ||
undefined !== goals.find(n=>isNaN(n)) ||
(week=$('>p',td).attr('title').trim().split(':')).length!=2 ||
isNaN(week=parseInt(week[1]))
) return false;
return {goals:goals, week:week};
}, r,
thead = $('> thead > tr:nth-child(1)',table);
Object.entries(data).forEach(d=>{
let clubId = d[0],
e = d[1],
a = trs.find(`> td > a[clubid="${clubId}"]:first`);
if(!a.length){
e.html('~');
return;
}
let tr = a.parents('tr:first'),
results = ["-","-","-","-","-"];
tr.find('td:not(.nomatch):not(:first)').each(function(){ //Satırdaki bölümler incelenecek
if(!(r = getDatas(this))){
e.html('~');
return;
}
if(r.week<played-4 || played<r.week) return; //Too old score
results[4-Math.max(0,5-played)-played+r.week] = {
s: r.goals[0]>r.goals[1]?"W":r.goals[0]==r.goals[1]?"D":"L",
g: r.week+": " + a.text().trim() + " " + r.goals[0]+'-'+r.goals[1] + " " + thead.find(`>th:nth-child(${$(this).index()+1})`).text().trim()
};
});
trs.find(`>td:nth-child(${1+tr.index()+1}):not(.nomatch)`).each(function(i){ //Sutundaki bölümler incelenecek
if(!(r = getDatas(this))){
e.html('~');
return;
}
if(r.week<played-4 || played<r.week) return; //Too old score
results[4-Math.max(0,5-played)-played+r.week] = {
s: r.goals[1]>r.goals[0]?"W":r.goals[0]==r.goals[1]?"D":"L",
g: r.week+": " + $(this).parent().find('a[clubid]').text().trim() + " " + r.goals[0]+'-'+r.goals[1] + " " + a.text().trim()
};
});
e.html(`[${results.reduce((acc,r)=>acc+({W:3,D:1}[r.s]||0),0)} ${GetText('SPoints')}] `+results.map(r=>`<img src="${images[r=="-"?r:r.s]}" ${r=="-"?"":`title="${r.g}"`} style="margin:0 2px -1px 0">`).join(''));
});
})
.catch(err=>{
$(all.toArray().filter(span=>$(span).find('>img').length)).html(`<font color="#f34949" style="border-bottom:1px dashed red;">${GetText('error')}</font>`);
console.error(err);
});
});
//Create Animation
if(matches.length>1){
box.append(
`<img id="prev_match" matches_length="${matches.length}" src="https://i.ibb.co/p468SYn/Untitled.png" style="height:18px; position:absolute; left:2px; top:50%; cursor:pointer; transform:translate(0,-50%); display:none; ">`+
`<img id="next_match" matches_length="${matches.length}" src="https://i.ibb.co/p468SYn/Untitled.png" style="height:18px; position:absolute; right:2px; top:50%; cursor:pointer; transform:translate(0,-50%); -moz-transform:scaleX(-1); -o-transform:scaleX(-1); -webkit-transform:scaleX(-1); transform:scaleX(-1);">`
);
$('#prev_match,#next_match').click(function(){
$('#prev_match,#next_match').css("pointer-events", "none");
let k = this.id=='next_match'?1:0,
close_e = $('#matches > ul.matches.next').find('>div.matches:visible'),
open_e = $('#'+close_e.attr(k?'next_match':'prev_match'));
close_e.hide("slide", { direction: k?'left':'right' }, 200);
setTimeout(()=>{
open_e.show("slide", { direction: k?'right':'left' }, 300);
$('#prev_match,#next_match').css("pointer-events", "auto");
},250);
$('#prev_match')[open_e.attr('prev_match')?'show':'hide']();
$('#next_match')[open_e.attr('next_match')?'show':'hide']();
});
}
},'#matches > ul.matches.next,#matches-handle-container > li.handle:nth-child(2)');
Tool.features.add('TrainingControl',['squad','training->groups'],function(){
function getElementOffsetWidth(e) {
var element = $(e).clone().appendTo('body');
var width = element.outerWidth();
element.remove();
return width;
}
let trainingPlan = Tool.trainingPlan,
Positions = Tool.footballerPositions,
SkillsName = Translate.locale.texts.Skills,
alerts = {i:[],e:[]};
$('#players-table-skills > tbody > tr').each(function(){
let position = $(this).find('td:nth-child(3)').text().trim(),
developSkills = trainingPlan[position];
if(!developSkills) return true;
let skills = $(this).find('.skill-column');
for(let i = 0 ; i < developSkills.length ; i++){//Geliştirilecek yetenek aranıyor
let s = $(skills[developSkills[i]]).find('span');
if(s.hasClass("maximum")) continue;//Bu geliştirilecek yetenek maksimumsa bir sonraki geliştirilecek yeteneğe bak.
else if(s.hasClass("next-training")) break;//Bu geliştirilecek yetenek geliştirilmeye devam ediyorsa doğru yoldasın.
else{//Bu geliştirilecek yetenek maksimum değil ve geliştirilmeye devam edilmiyorsa.Bir sıkıntı var.
//Ya farklı bir yetenek geliştiriliyor yada hiçbir yetenek geliştirilmiyor.
let skillName = SkillsName[developSkills[i]],
left = (getElementOffsetWidth(s[0])-15)/2,
value = s.text().trim(),
playerName = $(this).find('.player-name').text().trim();
s.html(
`<img title="${GetText('ImproveSkillTitle', {tag:0, args:[skillName]})}!!!" tool_tt="ImproveSkillTitle_${encodeURIComponent(JSON.stringify([skillName]))}" src="${Tool.sources.getLink('https://c.tenor.com/nByXaSdQ13EAAAAi/down-arrow-going-down.gif')}" alt="here" width="30px" height="30px" style="-webkit-transform:rotate(0deg); margin:-25px -15px -15px -5px; position:absolute;">`+
value
);
if($(skills[0]).parent().find('span.next-training').length) alerts.e.push(playerName+'-> '+skillName.toLowerCase());
else alerts.i.push(playerName+'-> '+skillName.toLowerCase());
break;
}
}
});
if(alerts.i.length || alerts.e.length){
let content="";
if(alerts.i.length){
content= `<span style="text-decoration:underline; color:#3fffe4;">${GetText('TrainingMessage')}</span><br>`+alerts.i.join('<br>');
}
if(alerts.e.length){
if(content!="") content+="<br><br>"
content+= `<span style="text-decoration:underline; color: #3fffe4;">${GetText('FaultyTrainingMessage')}</span><br>`+alerts.e.join('<br>');
}
Game.giveNotification(true,content);
}
},null);
Tool.features.add('ClubExchange','squad',function(){
let ClubExchange = {
initial_data : Tool.getVal('ClubExchange',{}),
new : {},// Exp : {3252352:0,234131:1} , 0=>error , 1=>success
selector : [],
finish : 0,
initial : function(){
let initial_data = ClubExchange.initial_data;
$('#players-table-overview > tbody > tr').add($('#players-table-overview-club > tbody > tr')).each(function(){
let openCard;
if(!(openCard = $(this).find('.open-card')).length) return true;
let playerId = openCard.attr('pid').split('-')[1],
table = $(this).parents('table')[0].id.replace('players-table-',''),// overview or overview-club
index = $(this).index(),
td_contract = $('td:nth-child(11)',this);
if(td_contract.text().indexOf(Tool.ClubExchange)!=-1){//td_contract da Kulüp Değişimi yazıyor olmali...
//Bu futbolcu kulüp değiştiriyor!!!
let playerData = initial_data[playerId];
if(!playerData) //Oyuncunun gidiş bilgileri mevcut değilse
ClubExchange.getPage(playerId,table,index);
else //Oyuncunun gidiş bilgileri mevcutsa
ClubExchange.addImage(playerData,table,index);
}
});
},
getPage : function(playerId,table,index){
ClubExchange.new[playerId]=0;//Varsayılan değer olarak sayfa çekmeyi başarısız sayıyoruz.
$.get(`index.php?w=${worldId}&area=user&module=player&action=index&complex=0&id=${playerId}`, function(response){
ClubExchange.new[playerId]=1;//default olarak başarısız olarak varsayılan değeri başarılı değere çeviriyoruz.
let li = $('<div>'+response+'</div>').find('.data.attributes > ul > li:last'),
a = li.find('a'),
club = {
id : a.attr('clubid'),
name : a.text().trim()
};
li.find('a,strong').remove();
let li_text = li.text().trim(),
date = li_text.match(/(3[01]|[12][0-9]|0?[1-9])\.(1[012]|0?[1-9])\.((?:19|20)\d{2})/g);
if(date){
date=date[0];
let playerData = {date:date,club:club},
data = Tool.getVal('ClubExchange',{});
data[playerId] = playerData;
Tool.setVal('ClubExchange',data);
ClubExchange.addImage(playerData,table,index)
}
}).always(function() {
let _new = ClubExchange.new;
if(ClubExchange.finish++==Object.keys(_new).length){//Tüm istekler başarılı yada başarısız bir şekilde bitti!
//Eğer daha önceden kayıtlı edilmiş bir futbolcu varsa(kulübü terkeden) şimdi o oyuncu bulunmazsa kulübü terk etmiştir. Onu kayıtlardan çıkarmamız lazım.
let initial_data = ClubExchange.initial_data,
current_data = Tool.getVal('ClubExchange',{}),
counter = 0;
for(let playerId in initial_data){
if(_new[playerId]==undefined){//Oyuncu çoktan kulübü terk etmiş..
counter++;
delete current_data[playerId];
}
}
if(counter) Tool.setVal('ClubExchange',current_data);
}
});
},
addImage : function(playerData,table,index){
let d = playerData.date.split('.'),
sec = parseInt((new Date(d[2],parseInt(d[1])-1,d[0],3).getTime()-Game.getTime())/1000),
tds = [
$(`#players-table-${table} >tbody >tr:nth-child(${index+1}) >td:nth-child(11)`),
$(`#players-table-${table=='overview'?'agreements':'agreements-club'} >tbody >tr:nth-child(${index+1}) >td:nth-child(8)`)
];
//this.selector.push('#players-table-'+table+' > tbody > tr:nth-child('+(index+1)+') > td:nth-child(11)','#players-table-'+(table=='overview'?'agreements':'agreements-club')+' > tbody > tr:nth-child('+(index+1)+') > td:nth-child(8)');
$(tds).each(function(){
let time_text = $('<div>'+SecToTime(sec)+'</div>').text(),
args = [playerData.date, playerData.club.name];
$(this).html(
`<a href="#/index.php?w=${worldId}&area=user&module=profile&action=show&clubId=${playerData.club.id}" target="_blank">`+
` <img title="${GetText('ClubExchange', {tag:0, args:args})}" tool_tt="ClubExchange_${encodeURIComponent(JSON.stringify(args))}" src="${Tool.sources.getLink('https://thumbs.dreamstime.com/z/arrow-up-down-stock-%C3%A2%E2%82%AC-121724975.jpg')}" alt="exchange" height="15px" style="background-color:#00fff7; border-radius:50%; cursor:pointer; margin-right:4px;">`+
`</a>`+
`<font title="${GetText('RemainingTime', {tag:0})} : ${time_text}" tool_tt="RemainingTime_{X} : ${time_text}">${playerData.date}</font>`
);
});
}
};
ClubExchange.initial();
},null);
Tool.features.add('RankingOfPlayers','squad',function(){
if($('#players-table-overview > tbody > tr').find('.open-card').length==0) return false;
let players = $('#players-table-overview > tbody > tr');
players.each(function(i){
$(this).find('td:nth-child(6) >span >input[type="text"]').attr('tabindex', i+1);
});
$('#squad-handle-container').append(`<input id="RankingOfPlayersButton" type="button" value="${GetText('SortPlayers', {tag:0})}" tool_vt="SortPlayers" title="${GetText('rankOfPlayerExplanation', {tag:0})}" tool_tt="rankOfPlayerExplanation" style="-webkit-border-radius:7px !important; padding:2px 5px; border:1px solid #999; font-size:9px; margin:16px 90px 0 40px;">`);
$('#RankingOfPlayersButton').click(function(){
let klText = Tool.footballerPositions[0],
kl=[],genc=[],diger=[];
$('#players-table-overview > tbody > tr').each(function(i){
let mevki = $(this).find('td:nth-child(3)')[0].textContent.trim(),
güc = parseInt($(this).find('td:nth-child(4)')[0].textContent),
yas = parseInt($(this).find('td:nth-child(5)')[0].textContent);
if(IsYoungPlayer($(this).find('td:nth-child(12)'))){
let tarih = $(this).find('td:nth-child(11)')[0].textContent.split('.');
tarih = new Date(tarih[2],parseInt(tarih[1])-1,tarih[0]).getTime();
genc.push({'i':i,tarih:tarih});
}
else if(mevki===klText){
kl.push({'i':i,güc:güc,yas:yas});
}
else{
diger.push({'i':i,güc:güc,yas:yas});
}
});
let maxKl = {güc:0,i:null},
spliceIndex = null;
for(let i = 0 ; i < kl.length; i++){
if(kl[i].güc>maxKl.güc){
maxKl.güc = kl[i].güc;
maxKl.i = kl[i].i;
spliceIndex = i;
}
}
let no = 1;
if(maxKl.i!=null){
//Kaleci varsa, en güçlü kaleciyi 1.sıraya al!
$('#players-table-overview > tbody > tr:nth-child('+(maxKl.i+1)+') > td:nth-child(6) > span > input[type="text"]').val(no);
$('#players-table-overview > tbody > tr:nth-child('+(maxKl.i+1)+') > td:nth-child(6) > span > input[type="text"]').attr('tabindex',no++);
//En güçlü kaleciyi çıkart ve geri kalanını diger adlı diziye aktar
kl.splice(spliceIndex,1);
for(let i = 0 ; i < kl.length ; i++){
diger.push({'i':kl[i].i,'güc':kl[i].güc,'yas':kl[i].yas});
}
}
//En güçlüden en güçsüze göre sırala
diger.sort(function(a,b){
if(b.güc-a.güc!==0) return b.güc-a.güc;
else return a.yas-b.yas;
});
//Genç hariç geri kalanını sırala
for(let i = 0 ; i < diger.length ; i++){
$('#players-table-overview > tbody > tr:nth-child('+(diger[i].i+1)+') > td:nth-child(6) > span > input[type="text"]').val(no);
$('#players-table-overview > tbody > tr:nth-child('+(diger[i].i+1)+') > td:nth-child(6) > span > input[type="text"]').attr('tabindex',no++);
}
//Genç oyuncuları geliş tarihlerine göre sırala. Geliş tarihi en küçük olan ilk olmalı!
genc.sort(function(a,b){
return a.tarih-b.tarih;
});
//Genç oyuncuları 90 dan başlayarak sırala
for(let i = 0 ; i < genc.length ; i++){
$('#players-table-overview > tbody > tr:nth-child('+(genc[i].i+1)+') > td:nth-child(6) > span > input[type="text"]').val(90+i);
$('#players-table-overview > tbody > tr:nth-child('+(genc[i].i+1)+') > td:nth-child(6) > span > input[type="text"]').attr('tabindex',90+i);
}
$('#players-table-overview > tfoot > tr > td:nth-child(2) > span > a > span').click();
});
$('#squad-handle-container > li').click(function(){
$('#RankingOfPlayersButton')[$(this).index()?'slideUp':'slideDown']('slow');
});
},'#RankingOfPlayersButton');
Tool.features.add('ShowStrengthChange','squad',function(){
if($('#players-table-overview > tbody > tr').find('.open-card').length==0) return false;
let BuyPlayers = Tool.getVal('PlayersData',{BuyPlayers:[]}).BuyPlayers; //Structure: http://prntscr.com/uc2p4v
if(!Array.isArray(BuyPlayers) || BuyPlayers.length==0) return false;
let players = $('#players-table-changes > tbody > tr .open-card');
if(!players.length) return false;
players.each(function(){
let p_data = BuyPlayers.find(p=>p.playerId==$(this).attr('pid').split('-')[1]);
if(p_data===undefined) return;
let tr = $(this).parents('tr').first(),
currentStrength = parseInt(tr.find('td:nth-child(4)').text()),
oldStrength = p_data.strength,
difference = currentStrength-oldStrength;
if(difference>0) tr.find('td:nth-child(4)').append(`<span class="changed-property new-player" style="color:#42ff35; margin-left:2px;">(+${difference})</span>`);
//tr.find('.last-column').last().css('position','relative').append(
// `<img title="${GetText('InfoStrengthChange', {tag:0})}" tool_tt="InfoStrengthChange" src="${Tool.sources.getLink('data','png')}" alt="data" height="15px" style="position:absolute; top:9px; right:10px;">`
//);
});
},'#players-table-changes > tbody span.changed-property.new-player');
Tool.features.add('ShowRealStrength','squad',function(){
let tables =
[
["#players-table-overview", "#players-table-agreements", "#players-table-skills"],
["#players-table-overview-club", "#players-table-agreements-club", "#players-table-skills-club"]
],
counter = 0;
for(let i = 0 ; i < tables.length ; i++){
let first_table = $(tables[i][0]);
if(!first_table.find('.open-card').length) continue;
$('>tbody>tr',first_table).each(function(rowIndex){ //eslint-disable-line no-loop-func
let row = $(this),
position = row.find('> td:nth-child(3)').text().trim();
let skills = [];
$(tables[i][2]).find('> tbody > tr:nth-child('+(rowIndex+1)+')').find('.skill-column').each(function(){
skills.push(parseFloat($(this).text()));
});
let strengthColumn = row.find('> td:nth-child(4)'),
currentStrength = parseInt(strengthColumn.attr('sortvalue')),
realStrength = GetRealStrength(skills,position);
if(isNaN(realStrength)) return true;
realStrength = realStrength.toFixed(2);
let difference = (realStrength - currentStrength).toFixed(2),
color = difference>0?"green":difference<0?"#a62c2c":"#d9d9d9";
for(let j = 0 ; j < 3 ; j++){
strengthColumn = $(tables[i][j]).find('>tbody > tr:nth-child('+(rowIndex+1)+') > td:nth-child(4)');
strengthColumn.html(strengthColumn.html().replace(currentStrength,realStrength)).css('color',color).attr('title',(difference>0?'+':'')+difference).attr('realstrength',realStrength);
}
++counter;
});
}
if(counter==0) return false;
},"#players-table-overview > tbody td:nth-child(4)[realstrength],#players-table-overvie-club > tbody td:nth-child(4)[realstrength],#players-table-agreements > tbody td:nth-child(4)[realstrength],#players-table-agreement-club > tbody td:nth-child(4)[realstrength],#players-table-skills > tbody td:nth-child(4)[realstrength],#players-table-skill-club > tbody td:nth-child(4)[realstrength]");
Tool.features.add('CalculateNonYoungPlayersStrength','squad',function(){
if(!(Array.isArray(Tool.ageDates) && Tool.ageDates.length>0)) return false;
let tables =
[
['#players-table-overview', '#players-table-skills'],
['#players-table-overview-club', '#players-table-skills-club']
],
add =
`<h3>${GetText('CalculateNonYoungPlayersStrength')}</h3>`+
`<div id="CalculateFutureStrength" style="text-align:center; margin:5px auto; border-radius:15px; background-color:#4a6b3247;">`+
`<div style="border-radius:15px 15px 0 0; background-color:#4a6b32; padding:15px 15px 5px 15px; margin-bottom:20px;">`,
select =
`<select id="selectPlayers" style="margin:0 0 0 20px; text-align-last:center; border-radius:10px; padding:3px 2px; background-color:black; color:green;" onfocus="this.style.backgroundColor='green'; this.style.color='black';" onfocusout="this.style.backgroundColor='black'; this.style.color='green';">`+
`<option value="0" tool_ot="ChoosePlayer">${GetText('ChoosePlayer', {tag:0})}</option>`;
for(let i=0 ; i<tables.length; i++){
let first_table = $(tables[i][0]);
if(!first_table.find('.open-card').length) continue;
first_table.find('> tbody > tr').each(function(rowIndex){ //eslint-disable-line no-loop-func
let row = $(this);
if(IsYoungPlayer(row.find('td:nth-child(12)'))) return true;
let position = row.find('td:nth-child(3)').text().trim(),
playerId = row.find('.open-card').attr('pid').split('-')[1],
playerName = row.find('.player-name').text(),
skills = [];
$(tables[i][1]+' > tbody > tr:nth-child('+(rowIndex+1)+') .skill-column').each(function(){
skills.push(parseFloat($(this).text()));
});
select+=`<option value="${playerId}" position="${position}" age="${row.find('td:nth-child(5)').text()}" skill="${skills.join(',')}">[${position}] ${playerName}</option>`;
});
}
select += '</select>';
add+= GetText('ChoosePlayer')+': ' + select;
add+='</div></div>';
$('#squad > div.squad.personal').append('<hr>'+add);
tables = add = select = undefined;
let ageDates = Tool.ageDates,
age_length = ageDates.length,
serverTime = Game.getTime(),
nextAgesDates = [];
for(let i = 0 ; i < age_length ; i++){
if(ageDates[i]*60000>serverTime){
nextAgesDates.push(ageDates[i]);
};
}
$('#selectPlayers').attr('nextAgesDates',nextAgesDates.join(','));
ageDates = age_length = serverTime = nextAgesDates = undefined;
$('#selectPlayers').change(function(){
$('#Comparison').add($(this).nextAll()).remove();
if(this.value!=0){
let nextAgesDates = $(this).attr('nextAgesDates').split(','),
selectedOption = $('option:selected',this),
age = parseInt(selectedOption.attr('age')),
position = selectedOption.attr('position'),
skills = selectedOption.attr('skill').split(','),
text =
`<span id="ChoosedPlayer" class="icon details open-card" pid="player-${this.value}" style="float:none; margin-top:-3px;"></span>`+
`<p style="margin-top:5px;">`+
` ${GetText('SkillPassLimitPoint')} : `+
` <input id="ChangeSkillLimit" type="number" style="border-radius:7px; border:1px solid gray; width:75px; text-align:center; padding:0 2px;" value="990" step="10" max="990" min="0" onkeypress="return event.charCode >= 48 && event.charCode <= 57">`+
`</p>`+
`<p style="margin-top:5px;">`+
` ${GetText('TrainerLevel')} : ${Tool.trainerLevel} ${GetText('SortLevel')}`+
`</p>`+
`<p id="chooseRange" style="margin:10px 0;">`+
` ${GetText('ChooseAge')} :`+
` <input id="ageRange" class="slider" type="range" min="${age}" max="${Math.min(age+nextAgesDates.length, (position==Tool.footballerPositions[0]?(age<43?43:age+1):(age<41?41:age+1)))}" value="${age}" style="vertical-align:middle; margin:0 5px; border-radius:8px; width:300px;">`+
` <label id="lblageRange">${age}</label>`+
`</p>`;
selectedOption = undefined;
for(let i in skills) skills[i] = parseFloat(skills[i]);
$(this).after(text);
text = undefined;
$('#ChangeSkillLimit').keyup(function(){
let val = $(this).val();
if(isNaN(val)) val = 0;
val = parseInt(val);
if(val<$(this).attr('min')) val = $(this).attr('min');
else if(val>$(this).attr('max')) val = $(this).attr('max');
if($(this).val() != val) $(this).val(val);
}).mouseenter(function(){
$(this).focus();
$(this).select();
}).change(function(){
$('#ageRange').trigger('oninput');
});
document.getElementById('ageRange').oninput = function() {
$('#Comparison').remove();
$('#lblageRange').text(this.value);
if(parseInt(this.value)>age){
let now = Game.getTime(),
targetDate = nextAgesDates[parseInt(this.value)-age-1]*60000,
result = CalculateFutureStrength(now, targetDate, skills, position, false, parseInt($('#ChangeSkillLimit').val()));
if(!isNaN(result.current_strength)) result.current_strength = result.current_strength.toFixed(2);
if(!isNaN(result.future.normal.strength)) result.future.normal.strength = result.future.normal.strength.toFixed(2);
if(!isNaN(result.future.premium.strength)) result.future.premium.strength = result.future.premium.strength.toFixed(2);
let tables =
[
{
title : GetText('Now')+' ('+GetDateText(now)+')',
skills : skills,
age : age,
strength : result.current_strength
},
{
title : GetText('NonCreditTraining')+' ('+GetDateText(targetDate)+')',
skills : result.future.normal.skills,
age : parseInt(this.value),
strength : result.future.normal.strength,
numberOfTraining : result.future.normal.trainings
},
{
title : GetText('CreditTraining')+' ('+GetDateText(targetDate)+')',
skills : result.future.premium.skills,
age : parseInt(this.value),
strength : result.future.premium.strength,
numberOfTraining : result.future.premium.trainings
}
],
skillsId = ['penalty_area_safety', 'catch_safety', 'two_footed', 'fitness', 'shot', 'header', 'duell', 'cover', 'speed', 'pass', 'endurance', 'running', 'ball_control', 'aggressive'],
code = '<div id="Comparison" class="infosheet" style="text-align:center; margin-bottom:10px;">';
now = targetDate = undefined;
for(let tablesIndex = 0 ; tablesIndex < 3 ; tablesIndex++){
code +=
'<div class="data skills" style="height:100%; padding:5px; background-color:#58793d; border-radius:5px; position:static;'+(tablesIndex!=2?" margin-right:25px;":"")+'">'+
'<h2 style="font-size:12px; margin-bottom:5px; border:none; line-height:25px; height:25px; background:#4a6b32; width:auto; font-weight:bold;">'+
tables[tablesIndex].title+
'</h2>'+
'<ul style="margin:3px 0;">'+
'<li class="odd">'+
'<span style="float:left;">Ø</span>'+
'<span style="color:white;font-weight:bold;">'+
(typeof tables[tablesIndex].strength == 'number'?(tables[tablesIndex].strength).toFixed(2):tables[tablesIndex].strength)+
'</span>'+
'</li>'+
'<li class="odd">'+
'<span style="float:left;">'+
GetText('Age')+
'</span>'+
'<span style="color:white;font-weight:bold;">'+
tables[tablesIndex].age+
'</span>'+
'</li>'+
'</ul>'+
'<ul style="margin:0;">';
for(let j = 0 ; j < 14 ; j++){
var span='<span',
prevValOfSkill = tables[0].skills[j],
valueOfSkill = prevValOfSkill,
changedValue = '';
if(tablesIndex!=0 && tables[tablesIndex].skills[j]){
valueOfSkill = tables[tablesIndex].skills[j];
if(valueOfSkill!=prevValOfSkill){
span+= ' style="color:#ff0808"';
changedValue=
'<span class="changed-property" style="color:#3db3d5e6">'+
'(+'+(valueOfSkill-prevValOfSkill).toFixed(2)+')'+
'</span>';
}
}
if(valueOfSkill>=990) span+=' class="maximum"';
span+='>'+valueOfSkill+changedValue+'</span>';
let skillId = skillsId[j];
code +=
'<li class="odd">'+
'<strong>'+
'<span class="icon '+skillId+'" tooltip="tt_'+skillId+'"></span>'+
'</strong>'+
span+
'</li>';
}
code += '</ul>';
if(tablesIndex>0){
code +=
'<ul style="margin:4px auto 2px auto">'+
'<li class="odd" style="float:none;margin:auto;margin-bottom:1px;">'+
'<span style="float:left;">'+
GetText('Training')+
'</span>'+
'<span style="color:white;font-weight:bold;">'+
tables[tablesIndex].numberOfTraining+
'</span>'+
'</li>'+
'</ul>';
}
code +='</div>';
}
code += '</div>';
$('#chooseRange').parent().parent().append(code);
}
};
}
});
},'CalculateFutureStrength');
Tool.features.add('CalculatingStrengthOfYoungPlayer','squad',function(){
if(!(Array.isArray(Tool.ageDates) && Tool.ageDates.length>0)) return false;
let tables = [
["#players-table-overview","#players-table-agreements","#players-table-skills"],
["#players-table-overview-club","#players-table-agreements-club","#players-table-skills-club"]
], featureElements = [];
for(let i = 0 ; i < tables.length ; i++){
let first_table = $(tables[i][0]);
if(!first_table.find('.open-card').length) continue;
$('>tbody>tr',first_table).each(function(rowIndex){ //eslint-disable-line no-loop-func
let row = $(this);
if(!IsYoungPlayer(row.find('td:nth-child(12)'))) return true;
let startDate = Game.getTime(),
position = row.find('td:nth-child(3)').text().trim(),
currentAge = parseInt(row.find('td:nth-child(5)').text()),
skills = [];
$(tables[i][2]+' > tbody > tr:nth-child('+(rowIndex+1)+')').find('.skill-column').each(function(){
skills.push(parseFloat($(this).text()));
});
let finishDate = row.find('td:nth-child(11)').text().trim().match(/(3[01]|[12][0-9]|0?[1-9])\.(1[012]|0?[1-9])\.((?:19|20)\d{2})/g);
if(!finishDate.length) return true;
finishDate = finishDate[0].split('.');
finishDate = new Date(finishDate[2],parseInt(finishDate[1])-1,parseInt(finishDate[0])+1).getTime();
let result = CalculateFutureStrength(startDate, finishDate, skills, position, true);
if(!isNaN(result.current_strength)) result.current_strength = result.current_strength.toFixed(2);
if(!isNaN(result.future.normal.strength)) result.future.normal.strength = result.future.normal.strength.toFixed(2);
if(!isNaN(result.future.premium.strength)) result.future.premium.strength = result.future.premium.strength.toFixed(2);
let nextAge = currentAge,
dates = [],
remainingDay = '-',
start = !1,
ageDates = Tool.ageDates;
for(let p = 0 ; p < ageDates.length ; p++){
let date = ageDates[p]*60000;
if(start){
if(date <= finishDate){
dates.push({
s : 'color:white;',
v : GetDateText(date)
});
nextAge++;
}
else{
dates.push({
s : 'color:aqua; border-top:1px solid white; padding-top:1px; margin-top:1px; display:block;',
v : GetDateText(date)
});
remainingDay = ((date-finishDate)/86400000).toFixed(1);
break;
}
continue;
}
if(startDate<date){
start = !0;
p--;
}
}
let title =
GetText('EndYouth', {tag:0, args:[
((finishDate-startDate)/86400000).toFixed(1),
Pad2(new Date(finishDate).getDate())+'.'+
Pad2(new Date(finishDate).getMonth()+1)+'.'+
new Date(finishDate).getFullYear()
]})+';\n'+
GetText('Age', {tag:0})+' : '+nextAge+'\n'+
'Ø : '+result.future.normal.strength+' - ' + result.future.premium.strength+'\n'+
GetText('YoungTrainerLevelS', {tag:0})+' : '+Tool.yTrainerLevel+' '+GetText('SortLevel', {tag:0})+'\n'+
GetText('RemainingNumberOfNormalTraining', {tag:0})+' : ' + result.future.normal.trainings+'\n'+
GetText('RemainingNumberOfCreditTraining', {tag:0})+' : ' + (result.future.premium.trainings-result.future.normal.trainings)+'\n'+
GetText('RemainingNextAgeDay', {tag:0, args:[remainingDay]});
let selector = "";
for(let tablesIndex = 0 ; tablesIndex < 2 ; tablesIndex++){
MouseEnterLeaveEvent(
$(selector = tables[i][tablesIndex]+' > tbody > tr:nth-child('+(rowIndex+1)+') > td:nth-child(4)'), // Strength column
$(tables[i][tablesIndex]+' > tbody > tr:nth-child('+(rowIndex+1)+') > td:nth-child(5)'), // Age column
result.future.normal.strength,
nextAge,
result.future.premium.strength,
result.current_strength,
currentAge,
row.find('.open-card').attr('pid').split('-')[1],
row.find('> td.name-column > span.player-name').text().trim(),
dates
);
featureElements.push(selector);
featureElements.push(tables[i][tablesIndex]+' > tbody > tr:nth-child('+(rowIndex+1)+') > td:nth-child(5)');
$(selector = tables[i][tablesIndex]+' > tbody > tr:nth-child('+(rowIndex+1)+') > td:nth-child('+[11,8][tablesIndex]+')').attr('title',title);
featureElements.push(selector);
}
//$('#players-table-agreements > tbody > tr:nth-child('+(i+1)+') > td:nth-child(8)')[0].title = title;
if(i==0){
let u = this.getElementsByClassName('open-card')[0];
let TrainingSkills = Tool.trainingPlan[position]; // [9,6,3,7,8,10,5]
if(!Array.isArray(TrainingSkills)) return true;
for(let tablesIndex = 0 ; tablesIndex < tables[i].length ; tablesIndex++)
ClickOpenCard(
$(tables[i][tablesIndex]+' > tbody > tr:nth-child('+(rowIndex+1)+') .open-card'),
TrainingSkills
);
}
});
}
if(featureElements.length==0) return false;
this.hover_selector = featureElements.join(',');
tables = featureElements= undefined;
function MouseEnterLeaveEvent(strengthColumn, ageColumn, newStrength, nextAge, premiumNewStrength, currentStrength, currentAge, playerId, playerName, dates){
let strengthColHtml=strengthColumn.html(),
ageColHtml=ageColumn.html();
if(!toolTipObj.data['youngPlayerStrengthInfo_'+playerId]){
let tr =
[
[GetText('Strength'), strengthColumn.attr('sortvalue')],
[GetText('RealStrength'), currentStrength],
[GetText('YoungTrainerLevelS'), Tool.yTrainerLevel+' '+GetText('SortLevel')],
[GetText('NonCreditTraining'), newStrength + ' (' + (newStrength-currentStrength>0?'+':'') + (newStrength-currentStrength).toFixed(2)+')'],
[GetText('CreditTraining'), premiumNewStrength + ' (' + (premiumNewStrength-currentStrength>0?'+':'') + (premiumNewStrength-currentStrength).toFixed(2)+')']
],
html =
`<h3 style="text-align:center; margin-bottom:2px;">`+
` <label style="border-bottom:1px solid white;padding:0 2px;">${playerName}</label>`+
`</h3>`+
`<table>`+
` <tbody>`;
playerName = currentStrength = undefined;
for(let i = 0 ; i < tr.length ; i++){
html +=
`<tr style="line-height:20px; height:20px;">`+
` <td style="border-bottom:none; text-align:left;">`+
` ${tr[i][0]}`+
` <span style="float:right; margin:0 2px;">:</span>`+
` </td>`+
` <td style="border-bottom:none; text-align:left;">`+
` ${tr[i][1]}`+
` </td>`+
`</tr>`;
}
html += `</tbody></html>`;
toolTipObj.data['youngPlayerStrengthInfo_'+playerId] = html;
html =
`<h3 style="text-align:center; margin-bottom:2px;">`+
` <label style="border-bottom:1px solid white; padding:0 2px;">`+
` Age : ${currentAge} => ${nextAge} (${(nextAge-currentAge>0?'+':'')+(nextAge-currentAge)})`+
` </label>`+
`</h3>`;
let temp = currentAge;
for(let i = 0 ; i < dates.length ; i++,temp++)
html+=`<label style="${dates[i].s}">${temp}=>${temp+1} | ${dates[i].v+(i+1<dates.length?`</label><br>`:'')}`;
dates = currentAge = undefined;
toolTipObj.data['youngPlayerAgeInfo_'+playerId] = html;
}
strengthColumn.attr('tooltip','youngPlayerStrengthInfo_'+playerId);
ageColumn.attr('tooltip','youngPlayerAgeInfo_'+playerId);
strengthColumn.attr('title','');
playerId = undefined;
strengthColumn.add(ageColumn).mouseenter(function(){
strengthColumn.html(`<label style="color:#00e7ff;">${newStrength} / ${premiumNewStrength}</label>`);
ageColumn.html(`<label style="color:#00e7ff;">${nextAge}</label>`);
});
strengthColumn.add(ageColumn).mouseleave(function(){
$(toolTipObj.toolTipLayer).hide();
strengthColumn.html(strengthColHtml);
ageColumn.html(ageColHtml);
});
}
function ClickOpenCard(openCard,TrainingSkills){
if(!openCard.length) return;
openCard.click(function(){
let openCard = $(this);
openCard.off();
let rowIndex = openCard.parents('tr').index()+1;
$('#players-table-overview > tbody > tr:nth-child('+rowIndex+') .open-card').off();
$('#players-table-agreements > tbody > tr:nth-child('+rowIndex+') .open-card').off();
$('#players-table-skills > tbody > tr:nth-child('+rowIndex+') .open-card').off();
rowIndex = undefined;
let playerId = openCard.attr('pid').split('-')[1];
if($('#info-player-'+playerId).length) return;
let max = 300;
Tool.intervals.create(function(){
if(!openCard.hasClass('loading')){
this.delete();
let infoDiv = $('#info-player-'+playerId),
lis = infoDiv.find('div.data.skills > ul:first > li'),
romanNumerals = ["I","II","III","IV","V","VI","VII","VIII","IX","X","XI","XII","XIII","XIV"];
for(let p = 0 ; p < 3 ; p++){
lis[TrainingSkills[p]].style.backgroundColor = '#00585d';
$(lis[TrainingSkills[p]]).append(
'<label style="float:left;">'+
romanNumerals[p]+
'</label>'
);
}
infoDiv.find('.skill:not(.maximum)').each(function(){
let skillValue = parseFloat(this.textContent);
$(this).mouseenter(function(){
let result = GetMaxSkill(skillValue,parseInt(Tool.yTrainerLevel)+0.5),
args = [result.required_trainings];
if(result.required_trainings>0){
$(this).css({
'color':'#5eff0c',
'font-weight':'bold'
}).attr({
'title': GetText('AfterTrainings', {tag:0, args:args}),
'tool_tt': `AfterTrainings_${encodeURIComponent(JSON.stringify(args))}`
}).text(result.max_value);
}
}).mouseleave(function(){
$(this).css({
'color':'',
'font-weight':''
}).removeAttr('title').text(skillValue);
});
});
return false;
}
if(--max<1) this.delete();
},50,'OpenCard_'+playerId);
});
openCard = undefined;
}
},null);
Tool.features.add('YoungPlayersHistory','squad',function(){
let YoungPlayers = Tool.getVal('YoungPlayers', {MessageBox:{},show:[]}); //Structure: http://prntscr.com/ucg9s3
if(!Array.isArray(YoungPlayers.show)) YoungPlayers.show = [];
let players = YoungPlayers.show;
if(players.length == 0) return false;
players.sort(function(a,b){
a = (a.date || a.date_).split('.');
b = (b.date || b.date_).split('.');
return new Date(b[2],b[1]-1,b[0]).getTime() - new Date(a[2],a[1]-1,a[0]).getTime();
});
let max = 10, //maximum number of players shown on a page
sayfaSayısı = Math.ceil(players.length/max),
acıkSayfa = 1;
$('#squad > div.squad.personal').append(
`<hr>`+
`<div id="container-youngs-history" class="table-container">`+
` <h3>${GetText('TitleOfYoungPlayersTable')}</h3>`+
` <table id="players-table-youngs-history" class="sortable-table sortable">`+
` <thead>`+
` <tr>`+
` <th class="name-column sortcol">${GetText('Name')}</th>`+
` <th class="position-column sortcol">${GetText('Position')}</th>`+
` <th class="strength-column sortcol" tooltip="tt_strength">Ø</th>`+
` <th class="age-column sortcol">${GetText('Age')}</th>`+
` <th class="sortcol">${GetText('Date')}</th>`+
` </tr>`+
` </thead>`+
` <tbody></tbody>`+
` </table>`+
`</div>`
);
AddTableRows(players);
if(sayfaSayısı>1) CreateMenu(false,players.length);
players = undefined;
function AddTableRows(players){
for(let i = 0, k = (acıkSayfa-1)*max, player; i < max && i+k < players.length ; i++){
player = players[i+k];
$('#players-table-youngs-history>tbody').append(
`<tr class="${i%2?"even":"odd"}">`+
` <td class="name-column">`+
` <span pid="player-${player.id}" class="icon details open-card"></span>`+
` <span class="player-name">${player.name}</span>`+
` </td>`+
` <td>${player.position}</td>`+
` <td sortvalue="${player.strength}">${player.strength}</td>`+
` <td>${player.age}</td>`+
` <td${player.hasOwnProperty('date_')?` title="${GetText('mayNotTrue', {tag:0})}" tool_tt="mayNotTrue" style="font-style:italic;"`:''}>${player.date||player.date_}</td>`+
`</tr>`
);
}
}
function CreatePageLabel(sayfa){
return `<label class="page" style="color:white; cursor:pointer; text-decoration:underline;">${sayfa}</label> | `;
}
function CreateMenu(c,playersLength){
let text = '<div class="pager">';
if(acıkSayfa>=15){
for(let i = 1 ; i <=3 ; i++) text+=CreatePageLabel(i);
text+='... | ';
for(let i = acıkSayfa-10 ; i < acıkSayfa ; i++) text+=CreatePageLabel(i);
}
else{
for(let i = 1 ; i < acıkSayfa ; i++) text+=CreatePageLabel(i);
}
text+='<strong>'+acıkSayfa+'</strong>'+(acıkSayfa!=sayfaSayısı?' | ':'');
if(acıkSayfa<=sayfaSayısı-14){
for(let i = acıkSayfa+1 ; i<=acıkSayfa+10; i++) text+=CreatePageLabel(i);
text+='... | ';
for(let i = sayfaSayısı-2 ; i < sayfaSayısı ; i++) text+=CreatePageLabel(i);
}
else{
for(let i = acıkSayfa+1 ; i < sayfaSayısı ; i++) text+=CreatePageLabel(i);
}
if(acıkSayfa!==sayfaSayısı) text+=`<label class="page" style="color:white; cursor:pointer; text-decoration:underline;">${sayfaSayısı}</label>`;
text+=' '+GetText('total')+' : '+playersLength+'</div>';
let e = $('#players-table-youngs-history');
if(c){
e.prev().remove();
e.next().remove();
}
e.before(text);
e.after(text);
$('#container-youngs-history').find('.page').click(function(){
acıkSayfa = parseInt($(this).text());
let players = Tool.getVal('YoungPlayers',{MessageBox:{},show:[]}).show; //Structure: http://prntscr.com/ucg9s3
$('#players-table-youngs-history>tbody').html('');
AddTableRows(players);
CreateMenu(true,players.length);
});
}
},'#players-table-youngs-history',[
[
'main',
function(){
//Yeni gelen genç oyuncuların geliş tarihlerini bulma
if(typeof Tool.news.youngPlayer=='object'){ //{"title":'Jugendspieler',"beforeName":"diesen ","afterName":" mal"}
let yData=Tool.news.youngPlayer;
GetMessagesByTitle(yData.title,(messages)=>{
let YoungPlayers = Tool.getVal('YoungPlayers',{MessageBox:{}, show:[]}); //Structure: http://prntscr.com/ucg9s3
if(typeof YoungPlayers.MessageBox != 'object') YoungPlayers.MessageBox = {};
if(!Array.isArray(YoungPlayers.show)) YoungPlayers.show = [];
let MessageBox = YoungPlayers.MessageBox,
show = YoungPlayers.show,
html,start,end,playerName,date,newPlayer=0;
messages.forEach(message=>{ //message=> element : $('#newscenter-preview-'+id)
html = message.html().trim();
start = html.indexOf(yData.beforeName)+yData.beforeName.length;
end = html.indexOf(yData.afterName,start);
playerName = html.substring(start,end);
date = message.parents('tr').first().find('.last-column').text().trim();
message.html(html.substring(0,start)+`<font style="cursor:default;" title="${yData.title}" color="#89f4ff">${playerName}</font>`+html.substring(end));
playerName=playerName.trim();
if(!MessageBox.hasOwnProperty(playerName) && //MessageBox'a kayıtlı olmamış olacak
undefined==show.find(p=>{return p.name==playerName && p.date==date;})){ //show'a aynı isim ve tarihte kaydedilmiş genç futbolcu olmayacak
MessageBox[playerName] = date; //Yeni gelen gencin hangi tarihte geldiğinin kaydı alınıyor
newPlayer++;
}
});
if(newPlayer) Tool.setVal('YoungPlayers',YoungPlayers);
});
}
}
],
[
'squad',
function(){
if($('#players-table-overview-club > tbody').find('.open-card').length){
let YoungPlayers = Tool.getVal('YoungPlayers',{MessageBox:{}, show:[]}); //Structure: http://prntscr.com/ucg9s3
if(typeof YoungPlayers.MessageBox != 'object') YoungPlayers.MessageBox = {};
if(!Array.isArray(YoungPlayers.show)) YoungPlayers.show = [];
let MessageBox = YoungPlayers.MessageBox,
show = YoungPlayers.show,
update = 0;
let strength;
$('#players-table-overview-club > tbody > tr').each(function(){
strength=parseInt($('td:nth-child(4)',this).attr('sortvalue'));
if(IsYoungPlayer($('>td:nth-child(12)',this)) && 90>strength){ // limited by strength: https://forum.fussballcup.de/showthread.php?t=417372&page=22#post7485413
let playerId = $('.open-card',this).attr('pid').split('-')[1],
playerName = $('.player-name',this).text().trim(), //Format: lastNames, firstNames
found = !1;
for(let i = 0 ; i < show.length ; i++){
if(playerId == show[i].id){
found = !0;
if(show[i].hasOwnProperty('date_') && MessageBox.hasOwnProperty(playerName)){
show[i].date = MessageBox[playerName];
delete MessageBox[playerName];
delete show[i].date_;
++update;
}
break;
}
}
if(!found){
let data = {
id : playerId,
name : playerName,
position : $('td:nth-child(3)',this).text().trim(),
strength : strength,
age : parseInt($('td:nth-child(5)',this).text()),
};
if(MessageBox.hasOwnProperty(playerName)){
data.date = MessageBox[playerName];
delete MessageBox[playerName];
}
else{
let gameTime = new Date(Game.getTime());
data.date_ = Pad2(gameTime.getDate())+'.'+Pad2(gameTime.getMonth()+1)+'.'+gameTime.getFullYear();
}
show.splice(0,0,data); //Add to the top
++update;
}
}
});
if(update) Tool.setVal('YoungPlayers',YoungPlayers);
}
}
]
]);
Tool.features.add('TrainingGroups','training',function(){
if(Tool.getVal("TrainingGroups")==undefined) return false;
let data = Tool.getVal("TrainingGroups");
$('#training > div.schedule > div.table-container > table > tbody > tr').each(function(i){
if($('th',this).length){
var grupId = i/4 + 1;
var th = $('th',this)[1];
th.style.textAlign = 'left';
th.style.fontSize = '11px';
toolTipObj.data.showPlayersInGroups = GetText('NoInformation')+'!';
if(data[grupId]!==undefined){
var oyuncuSayısı = data[grupId].length;
if(oyuncuSayısı!==0){
th.innerHTML = GetText('TrainingGroupInformation', {args:[`<strong grupId="${grupId}" style="color:green; font-size:12px; cursor:default;" tooltip="showPlayersInGroups">${oyuncuSayısı}</strong>`]});
$('strong',th).mouseenter(function(){
var d = Tool.getVal("TrainingGroups")[$(this).attr('grupId')];
var text = '';
for(var i = 0 ; i < d.length ; i++){
text+=`[${d[i].position}] ${d[i].name}<br>`;
}
text = text.substring(0,text.length-4);
toolTipObj.data.showPlayersInGroups = text;
});
}
else th.innerHTML = GetText('NoPlayersInTheGroup');
}
else th.innerHTML = GetText('NoRecord');
}
});
},null,[
'training->groups',
function(){
let data = {},
groupLength = $('#players-table-skills > tbody').find('.select-box-container:first >select >option').length;
for(let i=1 ; i<=groupLength ; i++) data[i] = [];
$('#players-table-skills > tbody > tr').each(function(){
data[$('.select-box-container:first >select',this).val()].push({
name : $('.player-name',this).text().trim(),
position: $('td:nth-child(3)',this).text().trim()
});
});
Tool.setVal('TrainingGroups',data);
}
]);
Tool.features.add('CampHistory','camp',function(){
let imagesPos = [-641,-962,-214,-534,-748,-321,0,-107,-427,-854],
data = Tool.getVal('CampHistory',[]);
$('<div id="allCamps">').html(
imagesPos.reduce((acc,i,idx)=>acc+`<div class="camp-${idx+1}"><div id="camps_${idx+1}" class="image" style="margin-right:4px; float: left; opacity: 0.2;"></div></div>`,'')
).appendTo('#camp');
if(data.length){/*Show*/
//Tablo oluşturuluyor.
function dateFormat(a){
let b = a.split('.');
b = new Date(b[2],parseInt(b[1])-1,parseInt(b[0])+3);
return a+' - ' + Pad2(b.getDate())+'.'+Pad2(b.getMonth()+1)+'.'+b.getFullYear();
}
let text =
`<table id="lastCamps">`+
` <thead>`+
` <tr style="background:url();">`+
` <th colspan="7">${GetText('PreviouslyVisitedCamps')}</th>`+
` </tr>`+
` <tr>`+
` <th style="text-align:left;">${GetText('No')}</th>`+
` <th style="text-align:left;">${GetText('Camp')}</th>`+
` <th style="text-align:left;">${GetText('Country')}</th>`+
` <th style="text-align:left;">${GetText('Price')}</th>`+
` <th style="text-align:left;">${GetText('_Skills')}</th>`+
` <th style="text-align:left;">${GetText('Definition')}</th>`+
` <th style="text-align:left;">${GetText('Date')}</th>`+
` </tr>`+
` </thead>`+
` <tbody>`;
for(let i = 0 ; i < data.length ;i++){
let camp = data[i];
$('#camps_'+camp.campNo).css('opacity',1)
text+=
`<tr>`+
` <td style="color:white;font-weight: bold;text-align:center;">${i+1}</td>`+
` <td width="160" style="text-align:left;">`+
` <h3 style="margin:0;">${camp.campName}</h3>`+
` <div class="image" style="display:none;margin: 1px auto 3px; background-position: 0 ${imagesPos[camp.campNo-1]}px;"></div>`+
` </td>`+
` <td width="100" style="text-align:left;">`+
` <img class="flag" name="__tooltip" tooltip="tt_${camp.country.img}" src="/static/images/countries/${camp.country.img}.gif" alt=""> ${camp.country.name}`+
` </td>`+
` <td width="80" style="text-align:left;">${camp.price}`+
` <span class="icon currency"></span>`+
` </td>`+
` <td style="text-align:left;">`;
camp.skills.forEach(skill=>{ //eslint-disable-line no-loop-func
text+=`<span style="margin-right:3px;" class="icon ${skill}" name="__tooltip" tooltip="tt_${skill}"></span>`;
});
text+=
` </td>`+
` <td style="white-space: pre-wrap;font-Size:10px;line-height: 1.5;text-align:left;">${camp.description}</td>`+
` <td>`+
` <img src="${Tool.sources.getLink('https://www.pinclipart.com/picdir/big/561-5616345_transparent-time-clock-icon-png-5-minute-timer.png')}" alt="clock" height="15px" style="margin:0 2px 1px 0;cursor:help;text-align:left;" title="${GetText('ServerDate', {tag:0})}" tool_tt="ServerDate">`+
` ${dateFormat(camp.date)}`+
` </td>`+
`</tr>`;
}
text+=`</tbody><tfoot><tr></tr></tfoot></table>`;
$('#allCamps').before(text);
$('#lastCamps').find('.image').each(function(){
let image = $(this);
image.parent('td').mouseenter(function(){
image.slideDown();
}).mouseleave(function(){
image.slideUp();
});
});
}
if(!$('#camp > div.list-container > ul > li.disabled').length && //Kamp ayarlama inaktif olmayacak.
!$('#camp > div.list-container > ul > li > p.not-available').length //Kamplar kullanılmıyor olmayacak.
){/*Save*/
//Kamplar açık ve gidilebiliyor!
$('#camp > div.list-container > ul > li').each(function(){
let parent = this,
button = $('div.buttons > span > a',this);
button.attr('href_',button.attr('href')).removeAttr('href').click(function(){
$(this).off();
let skills = $('ul > li',parent),
_skills = [];
skills.each(function(){
_skills.push($('span',this).first().attr('class').replace('icon ',''));
});
let country = {name:'Berlin',img:'DEU'};
country.name = $('p',parent).first().text().trim();
var img = $('p > img',parent).first().attr('src');
country.img = img.substring(img.lastIndexOf('/')+1,img.lastIndexOf('.'));
//Yeni kampı en öne ekle!
data.splice(0,0,{
campName : $('h3',parent).first().text(),
campNo : $(parent).attr('class').replace('camp-',''),
date : $('span',this).first().text().trim().match(/(3[01]|[12][0-9]|0?[1-9])\.(1[012]|0?[1-9])\.((?:19|20)\d{2})/g)[0],
skills : _skills,
price : $('span.currency-number',parent).text().trim(),
country : country,
description: $('p.description',parent).text().trim(),
});
Tool.setVal('CampHistory',data);
location.href = $(this).attr('href_');
});
});
}
},null);
Tool.features.add('TransferDates','transfermarket',async function(){
let LeagueData = Tool.getVal('LeagueData'), save = true;
if(typeof LeagueData=='object' && (LeagueData.lastMatchDate+86400000)>Game.getTime()) save = false;
if(save){
let content = await Game.getPage('?w='+worldId+'&area=user&module=statistics&action=games','#content');
LeagueData = SaveLeagueData(content);
if(LeagueData==false) return false;
}
let aDay = 24*60*60*1000,
timeToMs = (t)=> ((t.h*60+t.m)*60+t.s)*1000,
fComingTime = timeToMs({h:6, m:0, s:0}),
tmChangingTime = timeToMs({h:0, m:0, s:0}),
firstMatchDate = LeagueData.firstMatchDate,
firstHalfFinalMatchDate= LeagueData.firstHalfFinalMatchDate,
lastMatchDate= LeagueData.lastMatchDate,
now = Game.getTime(),
footballerComing = null,
tmDateChanging = null;
if((firstMatchDate-1*aDay+fComingTime)>now)/*Alınan Oyuncu Bir Sonraki Gün Gelecek*/
footballerComing = new Date(new Date(now).getFullYear(),new Date(now).getMonth(),new Date(now).getDate()+1).getTime()+fComingTime;
else if((firstHalfFinalMatchDate+fComingTime)>now)/*Alınan Oyuncular Lig Arasında Gelecek*/
footballerComing = firstHalfFinalMatchDate+aDay+fComingTime;
else footballerComing = lastMatchDate+aDay+fComingTime; /*Alınan Oyuncu Lig Sonunda Gelecek*/
if((firstMatchDate-1*aDay+tmChangingTime)>now)/*Transfer Tarihinin Değişeceği Tarih*/
tmDateChanging = firstMatchDate-1*aDay+tmChangingTime;
else if((firstHalfFinalMatchDate+tmChangingTime)>now)/*Transfer Tarihinin Değişeceği Tarih*/
tmDateChanging = firstHalfFinalMatchDate+tmChangingTime;
let header = $('#content > h2:first'),
h_content = header.html() +
GetText('FootballersAreComing')+' : '+
`<label class="cntDwnTrnsfMrkt" style="color:#17fc17;" intervalName="footballerComing" title="${GetDateText(footballerComing)}" finish="${footballerComing}"></label>`;
if(tmDateChanging!=null){
h_content+=' '+
GetText('TransferDateWillChange')+' : '+
`<label class="cntDwnTrnsfMrkt" style="color:orange;" intervalName="tmDateChanging" title="${GetDateText(tmDateChanging)}" finish="${tmDateChanging}"></label>`;
}
header.html(h_content);
$('.cntDwnTrnsfMrkt').each(function(){
let t = $(this);
t.removeClass('cntDwnTrnsfMrkt');
Tool.intervals.create(function(){
let sec = parseInt((parseInt(t.attr('finish'))-Game.getTime())/1000);
if(sec<1){
this.delete();
t.html(GetText('ItIsOver'));
return;
}
t.html(SecToTime(sec));
},1000,t.attr('intervalName'));
t.removeAttr('intervalName');
});
},null,[
'fixture',
function(){
if($('#content').find('.date-selector').length){
let LeagueData = Tool.getVal('LeagueData'), save = true;
if(typeof LeagueData=='object' && (LeagueData.lastMatchDate+86400000)>Game.getTime()) save = false;
if(save) SaveLeagueData($('#content'));
}
}
]);
Tool.features.add('GoOffer','transfermarket',function(){
let data = Tool.getVal('increaseBid');//{playerName:'Criyessei',process:1}
if(typeof data != 'object') return false;
let playerName = data.playerName,
process = data.process,
find_player = !1;
if(process==1){
//Teklif tablonuzda oyuncu varsa devam edecek.
if($('#own-offers > tbody').find('.open-card').length){
$('#own-offers > tbody > tr').each(function(){
if(playerName == $(this).find('.name-column').first().text().trim()){
find_player = !0;
let clubName = $(this).find('td.name-column').last().attr('sortvalue');
if($('#club').val()==clubName){
find_player = !1;
process_2();
}
else{
$('#age_min').val(16);
$('#age_max').val(34);
$('#searchform > ul > li.strength > span:nth-child(2) > input[type="text"]').val(0);
$('#searchform > ul > li.strength > span:nth-child(3) > input[type="text"]').val(999);
$('#positions').val(0);
$('#club').val(clubName);
Tool.setVal('increaseBid', {playerName:playerName,process:2});
$('#searchform > ul > li.transfermarket-search-button > span > a > span').click();
}
return false;
}
});
}
}
else process_2();
function process_2(){
if($('#content > div.container.transfermarket > div.table-container > table > tbody').find('.open-card').length){
$('#content > div.container.transfermarket > div.table-container > table > tbody > tr').each(function(){
if(playerName == $(this).find('.name-column').first().text().trim()){
find_player = !0;
let tr = this,
pageHeight = $(window).height();
$('html, body').animate({ scrollTop: GetOffset(tr).top-pageHeight/2 }, 'fast');
setTimeout(function(){
tr.style = 'background-color:#fff2ac; background-image:linear-gradient(to right, #ffe359 0%, #fff2ac 100%);';
setTimeout(function(){
tr.style='';
},2000);
},200);
Tool.delVal('increaseBid');
return false;
}
});
}
}
if(!find_player){
Game.giveNotification(false, GetText('bidIncreasedPlayerNotFound'));
Tool.delVal('increaseBid');
}
},null,[
'main',
function(){
//Futbolcuya verilen teklif geçilirse kolay bir şekilde bu futbolcuyu transfer pazarında görüntüleyebileceğiz.
if(typeof Tool.news.increaseBid=='object'){// {"title":"Transfermarkt","control":"überboten","beforeName":"für ","afterName":" wurde"}
let iData = Tool.news.increaseBid;
GetMessagesByTitle(iData.title,(messages)=>{
let text,message,messageP=[];
for(let i=0; i<messages.length; i++){
message = messages[i]; // $ element
text = message.text().trim();
if(text.indexOf(iData.control)!=-1)
messageP.push(message.parent());
}
for(let i = 0 ; i < messageP.length ; i++){
messageP[i].click(function(){ // eslint-disable-line no-loop-func
let messageId = this.id.split('-')[2],
intName = 'OpenMessage_'+messageId,
k,max=50;
Tool.intervals.create(function(){
k = $('#readmessage-home');
if(k.length){
let a = $('<div>'+k.html()+'</div>');
a.find('a').remove();
let playerName = a.text().trim(),
start = playerName.indexOf(iData.beforeName)+iData.beforeName.length,
end = playerName.indexOf(iData.afterName,start);
playerName = playerName.substring(start,end).trim();
k.html(k.html().replace(playerName, `<font style="cursor:default;" color="#89f4ff">${playerName}</font>`));
k.find('a:last').click(function(){
Tool.setVal('increaseBid',{playerName:playerName,process:1});
});
this.delete();
}
else{
if(!--max) this.delete();
}
},50,intName);
}); // eslint-disable-line no-loop-func
}
});
}
}
]);
Tool.features.add('ShowBoughtPlayers','transfermarket',function(){
//Sattığımız oyunculara gelen teklifleri kabul edersek veya reddedersek PlayersData.AcceptedOffers güncellenmeli
let updated=0,
data = Tool.getVal('PlayersData',{}); //Structure: http://prntscr.com/uc2p4v
if(typeof data.AcceptedOffers != 'object') data.AcceptedOffers = {};
let AcceptedOffers = data.AcceptedOffers;
$('#foreigner-offers > tbody > tr').each(function(){ //Sattığımız oyunculara gelen teklifleri kontrol et
let accept_button = $(this).find('a.button[href*="do=accept"]');
if(accept_button.length){ //accept the bid
accept_button.attr('_href', $(this).find('.button:first > a')[0].href)
.removeAttr('href')
.css('cursor','pointer')
.click(function(){
$(this).off();
let data = Tool.getVal('PlayersData',{});
if(typeof data.AcceptedOffers != 'object') data.AcceptedOffers = {};
let AcceptedOffers = data.AcceptedOffers,
tr = $(this).parents('tr').first(),
playerId = tr.find('.open-card').attr('pid').split('-')[1],
a_club = $(`>td.name-column >a[clubid]:not([clubid="${Tool.clubId}"])`,tr).first(),
clubId = a_club.attr('clubid');
if(!AcceptedOffers.hasOwnProperty(playerId)){
AcceptedOffers[playerId] = {
playerName: tr.find('.player-name').text().trim(),
offers:{} //Accepted offers
};
}
AcceptedOffers[playerId].offers[clubId] = {
clubName: a_club.text().trim(),
price : tr.find('.currency-container').last().parent().attr('sortvalue').split('.').join(''),
date : GetDateText(Game.getTime())
};
Tool.setVal('PlayersData',data);
$(this).attr('href',$(this).attr('_href')).click();
});
}
else if($(this).find('>td.last-column a[href*="do=dismissOfferAcceptance"]').length){
//Oyuncuya gelen teklif daha önceden kabul edilmiş. Eğer verilerde kayıtlı değilse kaydedilecek.
let a_club = $(`>td.name-column >a[clubid]:not([clubid="${Tool.clubId}"])`,this).first(),
clubId = a_club.attr('clubid'),
playerId = $(this).find('.open-card').attr('pid').split('-')[1];
if(AcceptedOffers.hasOwnProperty(playerId)){
if(AcceptedOffers[playerId].offers.hasOwnProperty(clubId)) return; //continue
}
else{
AcceptedOffers[playerId] = {
playerName: $(this).find('.player-name').text().trim(),
offers:{}
};
}
AcceptedOffers[playerId].offers[clubId] = {
clubName : a_club.text().trim(),
price : $(this).find('.currency-container').last().parent().attr('sortvalue').split('.').join(''),
date : '-'
};
++updated;
}
});
//Teklifi iptal etmek için butona basıyoruz
if(Game.link.pr.do=="dismissOfferAcceptance" && ['playerid','clubid'].every(k=>Game.link.pr.hasOwnProperty(k))){
let playerId = Game.link.pr.playerid,
clubId = Game.link.pr.clubid,
offerStillExist = undefined != $('#foreigner-offers > tbody > tr .open-card').toArray().find(e=>{
return $(e).attr('pid').split('-')[1] == playerId && $(e).parents('tr').first().find('td.name-column:last > a').attr('clubid') == clubId;
});
if(!offerStillExist){ //Teklif silindi
if(AcceptedOffers.hasOwnProperty(playerId)){
let playerData = AcceptedOffers[playerId];
if(playerData.offers.hasOwnProperty(clubId)){
delete playerData.offers[clubId];
if($.isEmptyObject(playerData.offers)) delete AcceptedOffers[playerId];
++updated;
}
}
}
}
if(updated) Tool.setVal('PlayersData',data);
//Satın aldığımız oyuncuların listelenmesi. PlayersData.BuyPlayers verisi kullanarak
if(!Array.isArray(data.BuyPlayers)) data.BuyPlayers = [];
start(data.BuyPlayers);
function start(BoughtPlayers){
if(!BoughtPlayers.length){
UploadPlayersData();
return;
}
$('#own-offers').after(
`<h3>${GetText('ListofPurchasedFootballers')}</h3>`+
`<table id="purchased-players" class="sortable-table sortable">`+
` <thead>`+
` <tr class="">`+
` <th class="nosort">${GetText('Country')}</th>`+
` <th class="name-column sortcol">${GetText('Name')}<span class="sort-status"></span></th>`+
` <th class="sortcol">${GetText('SortPosition')}<span class="sort-status"></span></th>`+
` <th class="sortcol" name="__tooltip" tooltip="tt_strength"> Ø <span class="sort-status"></span></th>`+
` <th class="sortcol">${GetText('Age')}<span class="sort-status"></span></th>`+
` <th class="sortcol">${GetText('Salary')}<span class="sort-status"></span></th>`+
` <th class="sortcol">${GetText('Price')}</th>`+
` <th class="nosort">${GetText('Contract')}<span class="sort-status"></span></th>`+
` <th class="sortcol">${GetText('Club')}<span class="sort-status"></span> </th>`+
` <th class="sortcol">${GetText('Date')}<span class="sort-status"></span></th>`+
` <th class="sortcol">${GetText('Delete')}</th>`+
` </tr>`+
` </thead>`+
` <tbody></tbody>`+
` <tfoot>`+
` <tr class="even">`+
` <td class="last-column" colspan="9"></td>`+
` </tr>`+
` </tfoot>`+
`</table>`
);
let h3=$('#purchased-players').prev();
$(`<img style="float:right;cursor:pointer;margin-Right:5px;" src="${Tool.sources.getLink('https://www.clipartmax.com/png/full/52-527627_animated-down-arrow-arrow-down-gif-png.png')}" alt="download" width="20px" height="20px" title="${GetText('Download', {tag:0})}" tool_tt="Download">`)
.appendTo(h3)
.click(function(){ DownloadAsTextFile(JSON.stringify(BoughtPlayers,null,'\t'), "Bought Players Datas"); });
$(`<img style="margin-Right:7px;float:right;cursor:pointer" src="${Tool.sources.getLink('https://www.clipartmax.com/png/full/301-3016667_red-cross-clipart-high-resolution-red-cross-emoji-gif.png')}" alt="remove2" width="15px" height="15px" title="${GetText('Delete', {tag:0})}" tool_tt="Delete">`)
.appendTo(h3)
.click(function(){
if(confirm(GetText('Warning', {tag:0}))){
let table = $('#purchased-players');
table.prev().remove();
table.remove();
let data = Tool.getVal('PlayersData');
delete data.BuyPlayers;
Tool.setVal('PlayersData',data);
UploadPlayersData();
}
});
h3=undefined;
let tbody = $('#purchased-players>tbody');
BoughtPlayers.forEach((a,i)=>{
tbody.append(
`<tr class="${i%2?"even":"odd"}">`+
` <td>`+
` <img name="__tooltip" tooltip="tt_${a.playerCountry}" src="/static/images/countries/${a.playerCountry}.gif">`+
` </td>`+
` <td style="white-space:pre-wrap; line-height:1.5; width:25%; max-width:30%; text-align:left;">`+
` <span pid="player-${a.playerId}" class="icon details open-card"></span>`+
` <span class="player-name">${a.playerName}</span>`+
` </td>`+
` <td>${a.position}</td>`+
` <td>${a.strength}</td>`+
` <td>${a.age}</td>`+
` <td>${a.salary.toLocaleString()}<span class="icon currency"></span></td>`+
` <td>${a.price.toLocaleString()}<span class="icon currency"></span></td>`+
` <td>${a.season+' '+(a.season==1?GetText("Season"):GetText("Seasons"))}</td>`+
` <td style="text-align:left; white-space:pre-wrap; line-height:1.5; width:17%; max-width:20%;" sortvalue="${a.club.name}">`+
` <a href="#/index.php?w=${worldId}&area=user&module=profile&action=show&clubId=${a.club.id}" clubid="${a.club.id}">${a.club.name}</a>`+
` </td>`+
` <td>${a.date}</td>`+
` <td class="last-column">`+
` <img class="DeletePurchasedPlayerData" playerid="${a.playerId}" src="${Tool.sources.getLink('https://www.clipartmax.com/png/full/301-3016667_red-cross-clipart-high-resolution-red-cross-emoji-gif.png')}" alt="remove3" heigth="15px" width="15px" style="cursor:pointer">`+
` </td>`+
`</tr>`
);
});
$('#purchased-players').find('.DeletePurchasedPlayerData').click(function(){
let playerId = $(this).attr('playerid'),
data = Tool.getVal('PlayersData',{});
BoughtPlayers = data.BuyPlayers; //Structure: http://prntscr.com/uc2p4v
let idx = BoughtPlayers.findIndex(p=>p.playerId==playerId);
if(idx==-1) return;
BoughtPlayers.splice(idx,1);
data.BuyPlayers = BoughtPlayers;
Tool.setVal('PlayersData',data);
let tr = $(this).parents('tr').first();
tr.hide(400);
setTimeout(function(){
let i = tr.index();
tr.remove();
let table = $('#purchased-players'),
players = table.find('> tbody > tr');
if(players.length){
for(; i < players.length ; i++)
players[i].className = i%2?"even":"odd";
}
else{
table.prev().remove();
table.remove();
UploadPlayersData();
}
},400);
});
//Show Profit
let elements={p:[],n:[]};
$('#foreigner-offers > tbody > tr').toArray().map(t=>{
let td=$(t).find('>td:nth-child(8)'), offer;
if(!td[0].hasAttribute('sortvalue') || isNaN(offer = parseInt(td.attr('sortvalue')))) return false;
let id = $(t).find('.open-card').attr('pid').split('-')[1],
data = BoughtPlayers.find(p=>p.playerId==id);
if(data === undefined) return false;
return {
offer: offer,
price: data.price,
e : $(t).find('>td .currency-number').last()
};
}).filter(o=>o!==false).forEach(o=>{
let price = o.price,
profit = o.offer - price,
title_key = profit<0?GetText('Loss', {tag:0}):GetText('Gain', {tag:0});
o.e.css('color',profit>0?'#20ff63':profit==0?"white":"#a10c00").after(
`<span title="${title_key} : ${profit.toLocaleString()} €" tool_tt="${title_key}_{X} : ${profit.toLocaleString()} €" style="font-weight:bold; color:#42ead4; display:none; vertical-align:top;">${price.toLocaleString()}</span>`
);
elements.p.push(o.e);
elements.n.push(...[o.e.parent(),o.e.next()]);
});
$(elements.p).map($.fn.toArray).mouseenter(function(){
$(this).hide().next().show();
});
$(elements.n).map($.fn.toArray).mouseleave(function(){
($(this).hasClass('currency-container')?$('>span:nth-child(2)',this):$(this)).hide().prev().show();
});
elements=null;
}
function UploadPlayersData(){
if($('#UploadPlayerData').length) return;
$('#own-offers').after(
`<div align="center">`+
` <label style="color:#a5e4c6; font-weight:bold;">${GetText('UploadPlayersData')} : </label>`+
` <input id="UploadPlayerData" type="file" accept="text/plain">`+
`</div>`
);
$('#UploadPlayerData').change(function(e){
let that = $(this),
file = this.files[0];
if(file.type == 'text/plain'){
let reader = new FileReader();
reader.onload = function(){
let PlayersData = JSON.parse(reader.result),
data = Tool.getVal('PlayersData');
data.BuyPlayers = PlayersData;
Tool.setVal('PlayersData',data);
that.parent().remove();
start(PlayersData);
};
reader.readAsText(file);
}
else Game.giveNotification(false, GetText('ChooseNotebook'));
});
}
},null,[
'main',
function(){
//Sattığımız oyuncudan ne kadar kazanç sağladığımızı gösterebilmek için
if(typeof Tool.news.sellPlayer=='object'){ //{"title":"Assistent: Transfermarkt","control":"ausgehandelt","beforeName":"Spieler ","afterName":" hat"}
let sData=Tool.news.sellPlayer,
PlayersData = Tool.getVal('PlayersData'); //Structure: http://prntscr.com/uc2p4v
if(PlayersData){
GetMessagesByTitle(sData.title,(messages)=>{
if(typeof PlayersData.SellPlayers != 'object') PlayersData.SellPlayers = {};
let SellPlayers = PlayersData.SellPlayers;
let html,message,updated=0;
for(let i=0; i<messages.length ; i++){
message = messages[i]; // $ element
html = message.html().trim();
if(html.indexOf(sData.control)==-1) continue;
let start = html.indexOf(sData.beforeName)+sData.beforeName.length,
end = html.indexOf(sData.afterName,start),
a = message.find('a');
if(start==-1 || end==-1 || a.length==0) continue;
a = a.first();
let playerName = html.substring(start,end).trim(),
club = {
id : a.attr('clubid'),
name : a.text().trim()
};
message.html(html.substring(0,start)+`<font style="cursor:default;" color="#89f4ff">${playerName}</font>`+html.substring(end));
if(SellPlayers.hasOwnProperty(playerName)){
ShowLabels(message,SellPlayers[playerName].price,SellPlayers[playerName].purchase);
continue;
}
let AcceptedOffers = PlayersData.AcceptedOffers,
foundPlayers = [];
for(let playerId in AcceptedOffers){
let playerData = AcceptedOffers[playerId],
playerName_ = playerData.playerName;
if(playerName_.split(',').reverse().join(' ').trim() == playerName){
let offers = playerData.offers;
for(let clubId in offers){
if(clubId == club.id){
playerData.playerId = playerId;
playerData.clubId = clubId;
foundPlayers.push(playerData);
break;
}
}
}
}
if(foundPlayers.length != 1) continue;
let playerData = foundPlayers[0],
offer = playerData.offers[playerData.clubId];
SellPlayers[playerName] = {
playerName : playerData.playerName,
playerId : playerData.playerId,
clubId : playerData.clubId,
clubName : offer.clubName,
price : offer.price,
date : message.parents('tr').find('td.last-column').text().trim(),
purchase : !1
};
delete AcceptedOffers[playerData.playerId];
++updated;
if(!Array.isArray(PlayersData.BuyPlayers)) PlayersData.BuyPlayers = [];
let BuyPlayers = PlayersData.BuyPlayers,
purchase=!1;
for(let i = 0 ; i < BuyPlayers.length ; i++){
if(BuyPlayers[i].playerId == playerData.playerId){
SellPlayers[playerName].purchase = purchase = BuyPlayers[i].price;
break;
}
}
ShowLabels(message,offer.price,purchase);
}
if(updated) Tool.setVal('PlayersData',PlayersData);
function ShowLabels(e,sale,purchase=!1){
let text = `<p style="text-align:center; font-weight:bold; margin-top:10px;">`;
if(purchase!=!1)
text+=`<label style="color:#a11717; font-family:'comic sans'; font-size:15px;">${GetText('PurchasePrice')}: ${parseInt(purchase).toLocaleString()}<span class="icon currency"></span></label>`;
if(sale)
text+=`<label style="color:blue; font-family:'comic sans\; font-size:15px; margin:0 15px;">${GetText('SalePrice')}: ${parseInt(sale).toLocaleString()}<span class="icon currency"></span></label>`;
if(purchase!=!1){
let profit = parseInt(sale)-parseInt(purchase);
text+=`<label style="color:${profit>0?'green':(profit<0?'#9d2527; font-weight:bold':'white')}; font-family:'comic sans'; font-size: 15px;">${GetText('Profit')}: ${profit.toLocaleString()}<span class="icon currency"></span></label>`;
}
text+=`</p>`;
$(e).append(text)
.find('>p:last>label:not(:last)').css('margin-right', '10px')
}
});
}
}
}
]);
Tool.features.add('ShowOwnOfferInMarket','transfermarket',function(){
let players = $('#content > div.container.transfermarket > div.table-container > table > tbody');
if(!players.find('.open-card').length) return false;
let OwnOffers = {};
if($('#own-offers> tbody').find('.open-card').length){
$('#own-offers> tbody > tr').each(function(){
let OCard = $(this).find('.open-card'),
playerId = OCard.attr('pid').split('-')[1],
price = parseInt($(this).find('td:nth-child(8)').attr('sortvalue')),
bidStatus = $(this).find('td:nth-child(7)').text().trim().toLowerCase();
OwnOffers[playerId]= {
price : price,
bidStatus : bidStatus
};
});
}
players = players.find('tr');
players.each(function(i){
let playerId = $(this).find('.open-card').attr('pid').split('-')[1];
if(OwnOffers[playerId]){
let club = $(this).find('td:nth-child(8) > a'),
bidStatus = OwnOffers[playerId].bidStatus,
color,
title = '';
switch(bidStatus){
case Tool.bidTexts.accept.toLowerCase():
color = '#20ff63';
title = GetText('AcceptedOwnOffer', {tag:0});
break;
case Tool.bidTexts.reject.toLowerCase():
color = '#9e0e0e';
title = GetText('RejectedOwnOffer', {tag:0});
break;
case Tool.bidTexts.read.toLowerCase():
color = '#fcbd0f';
title = GetText('ReadOwnOffer', {tag:0});
break;
default: // Tool.bidTexts.new
color = '#ffffff82';
title = GetText('NewOwnOffer', {tag:0});
break;
}
var playerName = $(this).find('.player-name:first');
if(club.length){
if(club.hasClass('self-link')){
$(this).find('.currency-number').first().css('color',color);
}
else if(bidStatus != Tool.bidTexts.reject){
//Bu oyuncuya verdiğimiz geçilmiş fakat bizim teklifimiz reddedilmemiş ise
var price = OwnOffers[playerId].price;
showMyOffer(playerName,$(this).find('.currency-number:first'),club,price,color);
title += '\u000d'+GetText('PassedOwnOffer', {tag:0});
}
}
playerName[0].style = `background-color:${color}; border-radius:7px; padding:1px 3px;`;
playerName[0].title = title;
goToMyOffer(playerName,playerId);
}
});
function goToMyOffer(playerName,playerId){
let _playerId;
playerName.click(function(){
$('#own-offers > tbody > tr').each(function(){
_playerId = $(this).find('.open-card').attr('pid').split('-')[1];
if(_playerId == playerId){
$('html, body').animate({ scrollTop: GetOffset(this).top-$(window).height()/2 }, 'fast');
this.style = `background-color:#fff2ac; background-image:linear-gradient(to right, #ffe359 0%, #fff2ac 100%);`;
let tr = this;
setTimeout(function(){
tr.style = '';
},2000);
return;
}
});
});
}
function showMyOffer(e1,e2,club,price,color){
let temp = {
price : e2.html(),
clubId : club.attr('clubid'),
clubName : club.text().trim()
};
e1.add(e2).mouseenter(function(){
e2.html(`<font color:"${color}">${price.toLocaleString()}</font>`);
club.attr('clubid',Tool.clubId);
club.addClass('self-link');
club.text(Tool.clubName);
});
e1.add(e2).mouseleave(function(){
e2.html(temp.price);
club.attr('clubid',temp.clubId);
club.removeClass('self-link');
club.text(temp.clubName);
});
}
},null);
Tool.features.add('FilterOwnOffers','transfermarket',function(){
if(!$('#own-offers > tbody').find('.open-card').length) return false;
$('#own-offers').parent().before(
`<div id="divFilterOwnOffers" style="text-align:center;">`+
` <label style="color:white; font-size:13px;" title="${new Date(Game.getTime()).toLocaleDateString()}">`+
` <input type="checkbox">`+
` `+GetText('TodayOffers')+
` </label>`+
` <label style="color:white; font-size:13px;">`+
` <input type="checkbox" style="margin-Left:20px;" checked>`+
` `+GetText('AcceptedOffers')+
` </label>`+
` <label style="color:white; font-size:13px;">`+
` <input type="checkbox" style="margin-Left:20px;" checked>`+
` `+GetText('ReadingOffers')+
` </label>`+
` <label style="color:white; font-size:13px;">`+
` <input type="checkbox" style="margin-Left:20px;" checked>`+
` `+GetText('RejectedOffers')+
` </label>`+
` <label style="color:white; font-size:13px;">`+
` <input type="checkbox" style="margin-Left:20px;" checked>`+
` `+GetText('NewOffers')+
` </label>`+
`</div>`
);
$('#divFilterOwnOffers > label > input').click(function(){
$('#divFilterOwnOffers > input').attr('disabled',true);
let filter = {},
today = new Date(Game.getTime()).toLocaleDateString();
$('#divFilterOwnOffers > label > input').each(function(i){
filter[$(this).next().attr('k')]=this.checked;
});
let count = 0;
$('#own-offers > tbody > tr').each(function(){
let bidStatus = $(this).find('td:nth-child(7)').text().trim().toLowerCase(),
date = $(this).find('td:nth-child(9)').text().trim(),
show =
(filter.AcceptedOffers && bidStatus==Tool.bidTexts.accept.toLowerCase()) ||
(filter.ReadingOffers && bidStatus==Tool.bidTexts.read.toLowerCase()) ||
(filter.RejectedOffers && bidStatus==Tool.bidTexts.reject.toLowerCase()) ||
(filter.NewOffers && bidStatus==Tool.bidTexts.new.toLowerCase());
show = show && filter.TodayOffers?date.indexOf(today)!=-1:show;
if(show){
$(this).attr('class',(count++)%2==0?"odd":"even");
$(this).show();
}
else $(this).hide();
});
$('#divFilterOwnOffers > input').removeAttr('disabled');
});
},null);
Tool.features.add('FilterTransferMarket','transfermarket',function(){
if(!$('#content > div.container.transfermarket > div.table-container > table > tbody').find('.open-card').length || $('#club').val()==Tool.clubName) return false;
if(!Tool.hasOwnProperty('transferMarket')){
Tool.transferMarket = {
clubs: {},
values: {"ligaIndex":0,"checkBox":false}
};
}
let players = $('#content > div.container.transfermarket > div.table-container > table > tbody > tr'),
count = 0;
$('#content').find('.search-container').first().after(
`<div id="transferMarktMenu" style="clear:both; margin-left:18px; position:relative;">`+
` ${GetText('ShowOnlyOneLeague')} : `+
` <select id="select_lig" style="-webkit-border-radius:7px; margin-Left:10px; text-align-last:center;">`+
` <option value="0" selected="selected">${GetText('SelectLeague')}:</option>`+
` ${Tool.leagues.reduce((acc,league,idx)=>acc+`<option value="${idx+1}">${league}</option>`,'')}`+
` </select>`+
` <label style="display:none; vertical-align:middle;">`+
` <input id="only_one_lig" type="checkBox" style="margin-Left:10px;"></input>`+
` <label for="only_one_lig">${GetText('ShowOnlyOneLeague')}</label>`+
` </label>`+
` <p ${$('#positions').val()==0?'':`style="display:none;"`}>`+
` <input id="NoKeeperPlayers" type="checkBox" style="margin-left:0;">`+
` <label for="NoKeeperPlayers">${GetText('AllExceptGoalkeeper')}</label>`+
` </p>`+
`</div>`
);
let myLeague = (Tool.getVal('LeagueData',{league:false})).league;
if(myLeague){
let options = $('#select_lig > option');
options.each(function(i){
if($(this).text().toLowerCase()==myLeague.toLowerCase()){
$(this).attr({'title': GetText('ownLeague', {tag:0}), 'tool_tt':"ownLeague"}).css({
'background-color':'#8c0505',
'color':'white'
});
for(let j=i-3;j>0;j--) $(options[j]).attr('title', GetText('lowerLeague', {tag:0})+'. '+GetText('playerBuyInfo1', {tag:0})).css('background-color','yellow');
for(let j=i-1,c=0;j>0&&c<2;j--,c++) $(options[j]).attr({'title': GetText('lowerLeague', {tag:0}), 'tool_tt':'lowerLeague'}).css('background-color','orange');
let len = $('#select_lig > option').length;
for(let j=i+1,c=0;j<=len&&c<2;j++,c++) $(options[j]).attr({'title': GetText('upperLeague', {tag:0}), 'tool_tt':'upperLeague'}).css('background-color','#17fc17');
for(let j=i+3;j<=len;j++) $(options[j]).attr('title', GetText('upperLeague', {tag:0})+'. '+GetText('playerBuyInfo2', {tag:0})).css('color','#808080').prop('disabled',true);
return false;
}
});
}
$('#content > div.container.transfermarket > div.table-container > h3').after(
`<p id="filterPlayerInformation" style="background-color:black; color:white; line-height:33px; text-align:center;"></p>`
);
unsafeWindow.$('#positions').change(function(){
$('#NoKeeperPlayers').parent()[this.value=='0'?'slideDown':'slideUp']();
});
$('#NoKeeperPlayers').click(function(){
Tool.transferMarket.values.NoKeeperPlayers = this.checked;
if(this.checked && $('#positions').val()==0){
players.each(function(){
if($(this).css('display')!=='none'){
if(this.getElementsByTagName('td')[2].innerHTML === Tool.footballerPositions[0]){
$(this).hide();
}
}
});
}
else{
if($('#only_one_lig')[0].checked){
var lig = $('#select_lig')[0].options[$('#select_lig')[0].selectedIndex].textContent.trim();
players.each(function(){
var clubId = this.getElementsByClassName('name-column')[1].getElementsByTagName('a')[0].getAttribute('clubid');
if(Tool.transferMarket.clubs[clubId].indexOf(lig)!==-1){
$(this).show();
}
});
}
else{
players.each(function(){
$(this).show();
});
}
}
showFilterInfo();
});
$('#select_lig').change(function(){
Tool.transferMarket.values.ligaIndex= this.selectedIndex;
if(this.value==0){
$('#only_one_lig').parent().slideUp();
$('#only_one_lig')[0].checked = false;
Tool.transferMarket.values.checkBox = false;
players.each(function(i){
this.className = i%2===0?"odd":"even";
$(this).show();
});
}
else{
$('#only_one_lig').parent().slideDown();
if($('#only_one_lig')[0].checked){
tablo_oku();
}
}
});
$('#only_one_lig').click(function(){
Tool.transferMarket.values.checkBox = this.checked;
if(this.checked){
tablo_oku();
}
else{
if($('#NoKeeperPlayers')[0].checked){
var c = 0;
players.each(function(i){
if(this.getElementsByTagName('td')[2].innerHTML !== Tool.footballerPositions[0]){
this.className = c%2===0?"odd":"even";
this.style.display='';
c++;
}
});
}
else{
players.each(function(i){
this.className = i%2===0?"odd":"even";
$(this).show();
});
}
showFilterInfo();
}
});
if(Tool.transferMarket.values.NoKeeperPlayers){
if($('#positions').val()=='0')
$('#NoKeeperPlayers').click();
else{
Tool.transferMarket.values.NoKeeperPlayers = !1;
$('#NoKeeperPlayers')[0].checked = !1;
}
}
if(Tool.transferMarket.values.ligaIndex!==0){
document.getElementById('select_lig').selectedIndex = Tool.transferMarket.values.ligaIndex;
$('#only_one_lig').parent().show();
if(Tool.transferMarket.values.checkBox){
$('#only_one_lig')[0].checked=true;
tablo_oku();
}
}
function tablo_oku(){
$('#select_lig, #only_one_lig, #NoKeeperPlayers').prop('disabled', true);
$('#only_one_lig').parent().hide()
.parent().after(`<img id="LoadingTable" src="/designs/redesign/images/icons/loading/16x16.gif" style="margin-left:10px; vertical-align:middle;">`);
count = 0;
players.each(function(){
var clubId = this.getElementsByClassName('name-column')[1].getElementsByTagName('a')[0].getAttribute('clubid');
if(!Tool.transferMarket.clubs[clubId]){
count++;
kulüp_bilgileri_cek(clubId);
}
});
if(count==0){
tablo_göster();
}
}
function kulüp_bilgileri_cek(clubId){
$.get(`index.php?w=${worldId}&area=user&module=club&action=index&complex=0&id=${clubId}`, function(response){
var a = $('<diV>'+response+'</div>').find('ul > li:first');
a.find('strong').remove();
var leuage = a.text().trim();
Tool.transferMarket.clubs[clubId] = leuage;
count--;
if(count===0){
tablo_göster();
}
});
}
function tablo_göster(){
var kl_gösterme = Tool.transferMarket.values.NoKeeperPlayers && $('#positions').val()=="0"?true:false;
var görüntülenecek_lig = document.getElementById('select_lig').options[document.getElementById('select_lig').selectedIndex].textContent;
players.each(function(i){
var clubId = this.getElementsByClassName('name-column')[1].getElementsByTagName('a')[0].getAttribute('clubid');
var mevki = this.getElementsByTagName('td')[2].innerHTML;
if(Tool.transferMarket.clubs[clubId].indexOf(görüntülenecek_lig)!==-1 && !(kl_gösterme && mevki===Tool.footballerPositions[0])){
this.className = i%2==0?"odd":"even";
$(this).show();
}
else{
$(this).hide();
}
});
$('#select_lig, #only_one_lig, #NoKeeperPlayers').prop('disabled', false);
$('#LoadingTable').remove();
$('#only_one_lig').parent().show();
showFilterInfo();
}
function showFilterInfo(){
var show = 0;
players.each(function(){
if($(this).css('display')!=='none'){
show++;
}
});
if(players.length !== show){
$('#filterPlayerInformation').html(GetText('FilterPlayerInformation', {args:[players.length, show]}));
}
else{
$('#filterPlayerInformation').html('');
}
}
},null);
Tool.features.add('DownloadTable',['league','statistics','squadstrenght','goalgetter'],function(){
let element = {'league':'statistics-league-table' ,'statistics':'season-league-table', 'squadstrenght':'squad-strengths', 'goalgetter':'goalgetters'}[Game.currentPage.name];
if(element==null || (element=$('#'+element)).length==0) return false;
if(!$('#html2canvas').length)
$('head').append(`<script id="html2canvas" type="text/javascript" src="https://html2canvas.hertzen.com/dist/html2canvas.min.js">`);
$(`<img src="${Tool.sources.getLink('https://www.pinclipart.com/picdir/big/494-4943705_camera-symbol-png-video-camera-icon-gif-clipart.png')}" alt="printscreen" height="20px" style="cursor:pointer;" title="${GetText('DownloadTable', {tag:0})}" tool_tt="DownloadTable">`)
.appendTo(element.find('> tfoot > tr > td')).mouseenter(function(){
element.find('>tbody:first,>thead:first').addClass('animate-flicker');
}).mouseleave(function(){
element.find('>tbody:first,>thead:first').removeClass('animate-flicker');
}).click(function(){
$(this).hide().after(`<span class="load-icon loading" style="float:none; margin:0 auto;"></span>`);
element.css('background', '#6e9a5a url(/designs/redesign/images/layout/box_bg.gif) 0 -200px repeat-x')
.find('>tbody:first,>thead:first').removeClass('animate-flicker').css('opacity',1);
let that = $(this);
html2canvas( //eslint-disable-line no-undef
element[0],{
x: element.offset().left,
y: element.offset().top,
height: element.height()-element.find('>tfoot:first').height()
}
).then(function(canvas) {
let fileName = {'league':'LeagueTable' ,'statistics':'MatchResultsTable', 'squadstrenght':'SquadStrengthTable', 'goalgetter':'GoalScorerTable'}[Game.currentPage.name];
if(typeof fileName=='string') fileName= GetText(fileName, {tag:0});
switch(Game.currentPage.name){
}
canvas.toBlob(function(blob){
let object_URL = URL.createObjectURL(blob);
$('<a>').attr({'href':object_URL, 'download':(fileName||'screenshot')+'.png'})[0].click();
URL.revokeObjectURL(object_URL);
},'image/png');
that.show().next().remove();
});
});
},null);
Tool.features.add('CancelFriendlyMatchInvites','friendly',function(){
if($('#away-invitations-table > tbody .no-invites').length) return false;
let invites = $('#away-invitations-table > tbody > tr');
if(invites.length>1){
$('#away-invitations-table > thead > tr > th:last').append(
`<input id="SelectAllInvites" type="checkbox" class="checkbox_1">`+
`<label for="SelectAllInvites" title="${GetText('selectAll', {tag:0})}" tool_tt="selectAll" style="line-height:20px; float:right; margin-top:2.5px;"></label>`
);
$('#SelectAllInvites').click(function(){
$('#away-invitations-table > tbody .CancelInvite'+(this.checked?':not(:checked)':':checked')).prop('checked',this.checked);
$('#CancelInvites')[this.checked?'slideDown':'slideUp']();
});
}
$('#away-invitations-table > tbody > tr').each(function(i){
let a = $('.icon.delete',$(this)).parent(),
decline = a.attr('href'),
find = decline.indexOf('&decline=')+9;
decline = decline.substring(find,decline.indexOf('&',find));
a.after(
`<input id="Cancel_invite_${i}" class="CancelInvite checkbox_2" style="vertical-align:middle; margin:0;" type="checkbox" decline="${decline}">`+
`<label for="Cancel_invite_${i}" class="disHighlight" style="cursor:pointer;"></label>`
);
a.remove();
});
let prev_index=undefined;
$('.CancelInvite').click(function(e){
let index = $(this).parents('tr').index();
if(e.shiftKey && prev_index!=undefined){
$('#away-invitations-table > tbody > tr').slice(Math.min(prev_index,index),Math.max(prev_index,index)+1).find('.CancelInvite').prop('checked',this.checked);
}
prev_index = index;
$('#CancelInvites')[$('#away-invitations-table > tbody .CancelInvite:checked').length?'slideDown':'slideUp']();
if(!this.checked && $('#SelectAllInvites').prop('checked')) $('#SelectAllInvites').prop('checked',false);
else if(
this.checked
&& !$('#SelectAllInvites').prop('checked')
&& !$('#away-invitations-table > tbody .CancelInvite:not(:checked)').length
) $('#SelectAllInvites').prop('checked',true);
});
$('#away-invitations-table > tfoot > tr > td').append(CreateButton('CancelInvites', GetText('CancelSelectedInvites'), 'display:none; float:right;'));
$('#CancelInvites').click(function(){
let checked;
if(!(checked = $('#away-invitations-table > tbody .CancelInvite:checked')).length) return;
let links = [];
checked.each(function(){
links.push({tr:$(this).parents('tr'),decline:$(this).attr('decline')});
});
let invites_length=links.length,
counter=0;
for(let i=0;i<invites_length;i++){
CancelInvite(links[i]);
}
let control_time=0;
function CancelInvite(obj,err=0){
let success;
// index.php?w=3401&area=user&module=friendly&action=index&decline=668249_1550581200
$.get(`index.php?w=${worldId}&area=user&module=friendly&action=index&decline=${obj.decline}&layout=none`, function(response){
//Veri alımı başarılı oldu.
let feedback;
if(!(feedback=response.feedback).trim() //feedback yoksa
|| !(feedback = $(feedback)).length //tag bulunamadıysa
|| (feedback=feedback)[0].tagName!='P' //doğru tak değilse
|| !feedback.hasClass('notice') //bildirim başarılı değilse
){
console.log("feedback isn't exist || length=0 || tagname!='P'");
success=!1;
err = 3;
return;
}
else{
success=!0;
console.log("Canceling invite ["+obj.decline+"] is successfull!");
}
}).fail(function(){
//Veri alımı başarısız oldu. 3 Kere veri alımını tekrar dene. Eğer 2 kez daha başarısız olursa işlemi sonlandır.
if(++err<3) CancelInvite(obj,err);
}).always(function(){
if(success //Veri alımı başarılı
|| err==3 //veya 3 kere denenmesine rağmen veri alınamadı!
){
counter++;
let tr = obj.tr;
if(success){
tr.fadeOut(1000,()=>{
tr.remove();
});
control_time=new Date().getTime()+1000; // 1000 salise sonra satır silinecek.Eğer o esnada finish fonksiyonu çalışırsa..
}else{
tr.find('.CancelInvite').prop('checked',false);
BlinkEvent(tr,1000);
}
if(counter==invites_length)
setTimeout(finish,control_time-new Date().getTime());
}
});
}
function finish(){
if(!$('#away-invitations-table > tbody > tr').length){
$('#away-invitations-table > tbody').append(`<tr class="odd"> <td class="no-invites last-column" colspan="4"> - </td> </tr>`);
$('#SelectAllInvites').parent().find('label[for=SelectAllInvites]').remove();
$('#SelectAllInvites').remove();
$('#CancelInvites').remove();
}
}
});
},null);
Tool.features.add('QuickBet','betoffice',function(){
var t = $('#betoffice-container').find('.matches').find('tbody');
if(t.find('.club-logo-container').length){
t.find('tr').each(function(){
if($(this).find('.last-column').find('select').length){
var k = this.getElementsByClassName('bet-quote');
for(var j = 0 ; j < k.length ; j++){
var radio = k[j].getElementsByTagName('span')[0];
$(radio).click(function(){
var e = $(this).parents('tr').find('select')[0];
var q = $(this).parents('tr').find('.last-column > span > div > span')[0];
if(!$(this).hasClass('checked')){
e.selectedIndex = e.options.length-1;
q.innerHTML = e.options[e.selectedIndex].innerHTML;
}
else{
e.selectedIndex = 0;
q.innerHTML=0;
}
});
}
}
});
}
},null);
Tool.features.add('ShowAsistantLevelIncrease','assistants',function(){
var key = 'AsistanLevel';
var data = Tool.getVal(key,{});
var o = [];
$('#assistants').find('.bar-text').each(function(){
var level = this.textContent.trim();
var b = level.indexOf(' ');
level = level.substring(b,level.indexOf(' ',b+1));
var value = parseInt($(this).prev().find('div')[0].style.width.replace('%',''));
var asistant = $($(this).parents('li')[1]).index();
var asistantName = $(this).parents('ul').first().find('li:first > span').text();
if(data[asistant]!==undefined){
if(data[asistant].name == asistantName){
var difference = value - data[asistant].v;
if(difference>0){
var asistantType = $(this).parents('li').find('h3').text().trim();
o.push({asistantType:asistantType,asistantName:asistantName,difference:difference});
}
}
}
data[asistant] = {name:asistantName,v:(level*100+value)};
});
if(o.length){
var text = GetText('SeminarIsOver')+'<br>';
for(var i = 0 ; i < o.length-1 ; i++){
text += o[i].asistantName+`[${o[i].asistantType}] : +${o[i].difference}%<br>`;
}
text += o[o.length-1].asistantName+`[${o[o.length-1].asistantType}] : +${o[o.length-1].difference}`;
Game.giveNotification(true, text);
}
Tool.setVal(key,data);
},null);
Tool.features.add('QuickShopping','shop',function(){
$('#shop-content > .shop').each(function(){
let shop = this;
if($(shop).find('.shadow').length) return;
let e = $('div.table-container',shop)[0].getElementsByClassName('multi');
for(let i=0,len=e.length ; i<len ; i++){
let k = e[i].getElementsByTagName('tbody')[0].getElementsByTagName('tr');
for(var j = 0 ; j<k.length ; j++){
let t = k[j].getElementsByClassName('last-column order-quantity')[0];
if(t!==undefined && t.getElementsByClassName('input-container')[0]!==undefined){
let tk = t.innerHTML,
b = tk.indexOf('</span> / ')+7,
b1 = tk.indexOf('<span',b),
mi = tk.substring(b+3,b1).trim();
t.innerHTML = tk.substring(0,b)+`<span class="TrOk disHighlight" style="cursor:pointer;"> / ${mi}</span>`+tk.substring(b1);
ClickTrOk(t.getElementsByClassName('TrOk')[0]);
}
}
}
$('div.button-container > span.button.button-container-disabled.premium > a > span', shop)
.attr('k',1)
.removeAttr('class tooltip name')
.css('cursor','pointer')
.html(GetText('FillAll'))
.click(function(){
let k = shop.getElementsByClassName('TrOk');
if($(this).attr('k')==1){
for(let i = 0 ; i < k.length ; i++)
k[i].previousSibling.getElementsByTagName('input')[0].value = k[i].textContent.replace('/','').trim();
$(this).html(GetText('EmptyAll')).attr('k',0);
}
else{
for(let i = 0 ; i < k.length ; i++)
k[i].previousSibling.getElementsByTagName('input')[0].value = 0;
$(this).html(GetText('FillAll')).attr('k',0);
}
})
.parent().removeAttr('href');
$('div.button-container > span:nth-child(3) > a > span', shop).html(GetText('Ordering'));
});
function ClickTrOk(e){
$(e).click(function(){
let va = e.textContent.replace('/','').trim(),
t = e.previousSibling.getElementsByTagName('input')[0];
if(e.previousSibling.getElementsByTagName('input')[0].value!==va) t.value = va;
else t.value=0;
});
}
},null);
Tool.features.add('AddImage',['press->article','club_profile'],function(){
let elements = {
'article': { /*press->article*/
toolbar : $('#Toolbar_designArea > ul'),
textarea: $('#designArea')[0]
},
'club_profile' : {
toolbar : $('#Toolbar_profile-edit-club-information > ul'),
textarea: $('#profile-edit-club-information')[0]
}
}[Game.currentPage.name];
$(`<li class="" title="${GetText('AddImage', {tag:0})}" tool_tt="AddImage" style="cursor:pointer;" onmouseenter="$(this).addClass('hover')" onmouseleave="$(this).removeClass('hover')">`+
` <img src="${Tool.sources.getLink('https://icon-library.com/images/photo-gallery-icon/photo-gallery-icon-12.jpg')}" alt="image" width="20px" height="20px">`+
`</li>`
).appendTo(elements.toolbar).click(function(){
let txt = prompt(GetText('EnterImageLink', {tag:0}) + ' :', "");
if (!txt || !(txt=txt.trim())) return;
let intStart = elements.textarea.selectionStart,
img = new Image();
img.onload = function() {
let a = elements.textarea;
txt = `[color=rgb(255, 255, 255);background-image: url(${txt});width:${this.width}px;height:${this.height}px;display:block;overflow:visible;margin:0 auto;][/color]`;
a.value = String(a.value).substring(0, intStart) + txt + String(a.value).substring(a.selectionEnd);
a.selectionStart = intStart;
a.selectionEnd = intStart+txt.length;
a.focus();
};
img.src = txt;
});
},null);
Tool.features.add('InviteSimulationMatch','manager',function(){
if(isNaN(Game.link.pr.clubId) || Game.link.pr.clubId==Tool.clubId) return;
let matchId = (new URL(location.origin+'/'+$('#profile-show').find('.button-container-friendly-invite-button > a').attr('href').replace('#/',''))).searchParams.get('invite');
if(matchId == null) return false;
$('#profile-show').find('.profile-actions').first().append(
`<a class='button' href='#/index.php?w=${worldId}&area=user&module=simulation&action=index&squad=${matchId}'>`+
` <span>${GetText('InviteSimulation')}</span>`+
`</a>`
);
},null);
Tool.features.add('ShowEloRating','manager',function(){
$('#profile-show > div.container.profile-trophy > div.profile > ul.profile-box-club').append(
`<li><strong>${GetText('EloRank')} : </strong> <span id="SpanEloRating" class="icon details loading"></span></li>`
);
let clubName = $('#profile-show > h2:nth-child(1)').text().replace(Tool.replaceClubName,'').trim();
Game.getPage(`index.php?club=${clubName}&_qf__form=&module=rating&action=index&area=user&league=&path=index.php&layout=none`, null, null, 0, ['content'])
.then(data=>{
let odds = $('<div>').html(data.content).find('.odd');
$('#SpanEloRating').attr('class','');
if(odds.length) $('#SpanEloRating').html(odds.first().find('>td')[0].textContent);
else $('#SpanEloRating').css('color','gray').html('-');
})
.catch(err=>{
console.error(err);
$('#SpanEloRating').html(`<font color="#751b1b">${GetText('error')}</font>`);
});
},null);
Tool.features.add('LiveMatchesTable','live->match',function(){
if(typeof currentLive!='object') return false;
if(Tool.goalTrigger!==3) return false;
if(!($('#'+currentLive.matchId).hasClass('league') && $('#match-observer').length)) return false;
//If the match is league match
let LiveLeagueTable = {
Initialize : async function(){
delete this.Initialize;
$('#match > div.match.ticker').css('height','765px');
if(!currentLive.hasOwnProperty('homeClubId')){
currentLive.homeClubId = $('#'+currentLive.matchId+' > div.home > span > h3 > a').attr('clubid');
currentLive.awayClubId = $('#'+currentLive.matchId+' > div.away > span > h3 > a').attr('clubid');
}
this.InsertHeaderForObserver();
this.InsertLeagueTable();
this.InsertHeaderForTable();
this.CreateAnimation();
let all_matches_ended = this.AllMatchesEnded(),
league_table_updated = all_matches_ended && await this.AreScoresUpdated(),
matches_not_started = !all_matches_ended && new Date(Game.getTime()).getMinutes()>29,
any_match_is_continue = !all_matches_ended && !matches_not_started;
console.log('%call_matches_ended: %o\n%cleague_table_updated: %o','color:red;font-weight:bold;',all_matches_ended,'color:red;font-weight:bold;',league_table_updated);
let result = await this.GetTable();
this.leagueIndex = result.leagueIndex;
this.tableRowClass = result.rowClass;
this.SetMatchIdForClub(result.table);
this.SetOppenentId(result.table);
// match hour is x
if(!league_table_updated){ // (x-1) <-> x:15
this.old_table = result.table;
if(!all_matches_ended){ //Before match time or in match hour(x): (x-1):30 <-> x:10
if(matches_not_started){ // (x-1):30 <-> x (from when matches appear until when matches start)
console.log('1.Area');
this.new_table = this.old_table;
this.UpdateLiveLeagueTable();
//await until matches start
await new Promise((res,rej)=>{
let d = new Date(Game.getTime()),
ms = (3600-(d.getMinutes()*60+d.getSeconds()))*1000-d.getMilliseconds();
console.log('Beklenecek milisaniye: ' + ms);
clearTimeout(unsafeWindow.timeout_1);
unsafeWindow.timeout_1=setTimeout(function(){
res();
delete unsafeWindow.timeout_1;
}, ms);
});
console.log('Mathces start now');
this.new_table = this.CreateTableWithScores(this.GetCurrentScores(), this.old_table);
//this.new_table.forEach(club=>{++club.played;});
}
else{ // x <-> x:10 (from when matches start until when all matches end)
this.new_table = this.CreateTableWithScores(this.GetCurrentScores(), this.old_table);
//this.new_table.forEach(club=>{++club.played;});
console.log('2.Area');
}
this.StartToCatchNewGoals();
this.StartToCatchMatchEnd();
}
else{ // x:10 <->x:15 (from when all matches end until league table updated)
this.new_table = this.CreateTableWithScores(this.GetCurrentScores(), this.old_table);
this.new_table.forEach(club=>{++club.played;});
console.log('3.Area');
}
}
else{ // x:15 <-> 24:00 (from when league table updated until when matches result disappear)
this.new_table = result.table;
this.old_table = this.CreateTableWithScores(this.GetCurrentScores(), this.new_table.slice(0), true);
this.old_table.forEach(club=>{--club.played;});
console.log('4.Area');
}
this.UpdateLiveLeagueTable();
},
InsertLeagueTable : function(){
delete this.InsertLeagueTable;
let table_height=450,
space_height=188;
$(`<div id="league-table" style="position:absolute; background:#6e9a5a url(images/layout/box_bg.gif) 0 -200px repeat-x; overflow:auto; box-shadow:1px 1px 5px black;">`+
` <table class="table-league">`+
` <thead>`+
` <tr>`+
` <th>${GetText('Rank')}</th>`+
` <th>${GetText('Trend')}</th>`+
` <th>${GetText('Club')}</th>`+
` <th>${GetText('Played')}</th>`+
` <th>${GetText('Won')}</th>`+
` <th>${GetText('Drawn')}</th>`+
` <th>${GetText('Lost')}</th>`+
` <th title="${GetText('GoalFor', {tag:0})}" tool_tt="GoalFor">${GetText('SGoalFor')}</th>`+
` <th title="${GetText('GoalAgainst',{tag:0})}" tool_tt="GoalAgainst">${GetText('SGoalAgainst')}</th>`+
` <th>${GetText('Average')}</th>`+
` <th>${GetText('Points')}</th>`+
` </tr>`+
` </thead>`+
` <tbody></tbody>`+
` </table>`+
`</div>`
).css({
'top' :(parseInt($('#match-observer').css('top'))+24)+'px',
'left' :'0px',
'width':'0',
'height':table_height+'px'
}).insertAfter($('#match-observer')).find('table>thead th').css({position: 'sticky', top: '0','background-color':'black','border-bottom':'1px double white'});
$('#match > div.match').height($('#match > div.match').height()+table_height-space_height)
},
InsertHeaderForTable : function(){
delete this.InsertHeaderForTable;
$(`<p id="Toggle_league_table" class="disHighlight">${GetText('LiveLeagueTable')}</p>`).css({
"position" : "absolute",
"line-height" : "18px",
"cursor" : "pointer",
"text-align" : "center",
"color" : "black",
"font-weight" : "bold",
"font-size" : "15px",
"background-color" : "#d0cfcf",
"border-radius" : "0 10px 10px 0",
'padding':'0 2px',
"writing-mode" : "vertical-lr",
"text-orientation" : "unset",
"top" : (parseInt($('#match-observer').css('top'))+24)+'px',
"left" : "0px",
"width" : "18px",
"height" : $('#league-table').height()+"px"
}).insertAfter($('#match-observer'));
},
InsertHeaderForObserver : function(){
delete this.InsertHeaderForObserver;
$(`<p id="Toggle_match_observer" k="close" animate_top="${$('#match-observer').height()}" class="disHighlight">${GetText('LiveMatchScores')}</p>`).css({
'position' : 'absolute',
'line-height' : '18px',
'cursor' : 'pointer',
'text-align' : 'center',
'color' : 'black',
'font-weight' : 'bold',
'font-size' : '15px',
'background-color' : '#d0cfcf',
'border-radius' : '0 0 10px 10px',
'padding':'2px 0',
'top' : parseInt($('#match-observer').css('top'))+$('#match-observer').height(),
'width' : $('#match-observer').width()+parseInt($('#match-observer').css('padding-right'))+parseInt($('#match-observer').css('padding-left'))-2,
'left' : parseInt($('#match-observer').css('left'))+1
}).insertAfter($('#match-observer'));
},
CreateAnimation : function(){
delete this.CreateAnimation;
$('#Toggle_match_observer,#Toggle_league_table').click(function(){
let k = $('#Toggle_match_observer').attr('k'),
animate_left = $('#league-table>table').width() + ($('#league-table')[0].scrollHeight != $('#league-table')[0].offsetHeight?16.8:0),
animate_top = $('#Toggle_match_observer').attr('animate_top');
$('#Toggle_match_observer,#Toggle_league_table').css("pointer-events", "none");
if(k=='close'){
$('#Toggle_match_observer').animate({ "top":'-='+animate_top+"px" }, 500 );
$('#match-observer,#match-observer > ul').animate({
height : 0,
opacity: 0
}, 500);
setTimeout(function(){
$('#Toggle_match_observer').attr('k','open');
//Cookies.set('liveLeagueTable', 1, { expires: 365 });
$('#Toggle_league_table').animate({ "left": '+='+animate_left+"px" }, 500 );
$('#league-table').animate({
width : animate_left,
opacity: 1
}, 500);
setTimeout(function(){
$('#Toggle_match_observer,#Toggle_league_table').css("pointer-events", "auto");
},500);
},400);
}
else{
$('#Toggle_league_table').animate({ "left": '-='+animate_left+"px" }, 500 );
$('#league-table').animate({
width : 0,
opacity: 0
}, 500);
setTimeout(function(){
$('#Toggle_match_observer').attr('k','close');
//Cookies.set('liveLeagueTable', 0, { expires: 365 });
$('#match-observer,#match-observer > ul').animate({
height : animate_top,
opacity: "1"
}, 500);
$('#Toggle_match_observer').animate({ "top": '+='+animate_top+"px" }, 500 );
setTimeout(function(){
$('#Toggle_match_observer,#Toggle_league_table').css("pointer-events", "auto");
},500);
},400);
}
});
//if(Cookies.get('liveLeagueTable') == "1") $('#Toggle_match_observer').click();
unsafeWindow.jQuery('#content').off('mouseenter','#league-table > table > tbody > tr').on('mouseenter','#league-table > table > tbody > tr',function(){
let opp_idx = parseInt($(this).attr('opp_idx'));
if(isNaN(opp_idx)||opp_idx<0) return;
$('#league-table > table > tbody > tr').css('background-color','');
$(this).add($('#league-table > table > tbody > tr:nth-child('+(opp_idx+1)+')')).css('background-color','#4854a8;');
});
unsafeWindow.jQuery('#content').off('mouseleave','#league-table > table > tbody').on('mouseleave','#league-table > table > tbody',function(){
$('#league-table > table > tbody > tr').css('background-color','');
[currentLive.homeClubId,currentLive.awayClubId].forEach(id=>{$('#league-table > table > tbody > tr:has(a[clubid="'+id+'"])').css('background-color','#4854a8;');});
});
},
GetTable : function(tryGetPage=0){
delete this.GetTable;
return new Promise((res,rej)=>{
Game.getPage('index.php?w='+worldId+'&area=user&module=statistics&action=table&layout=none','#league-table-container').then(table_container=>{
let leagueIndex = $(table_container[0].querySelector('#leagueCatalogueForm')).find('select[group="league-selector"]').first().val(),
table = [],
rowClass = [];
$(table_container[0].querySelector('#statistics-league-table')).find('tbody > tr').each(function(i){
let tr = this,
data = {};
rowClass.push(tr.className.replace('odd','').replace('even','').trim());
//data.rank = i+1;
//data.trend = parseInt($(tr).find('> td:nth-child(2)').attr('sortvalue'));
data.clubId = $(tr).find('a[clubid]').attr('clubid');
data.clubName = $(tr).find('a[clubid]').text().trim();
data.played = parseInt($(tr).find('td:nth-child(4)').text());
data.won = parseInt($(tr).find('td:nth-child(5)').text());
data.drawn = parseInt($(tr).find('td:nth-child(6)').text());
data.lost = parseInt($(tr).find('td:nth-child(7)').text());
data.gf = parseInt($(tr).find('td:nth-child(8)').text().split(':')[0]);
data.ga = parseInt($(tr).find('td:nth-child(8)').text().split(':')[1]);
data.average = parseInt($(tr).find('td:nth-child(9)').text());
data.points = parseInt($(tr).find('td:nth-child(10)').text());
table.push(data);
});
res({leagueIndex:leagueIndex,table:table,rowClass:rowClass});
}).catch(err=>{rej(err);});
});
},
AllMatchesEnded : function(){ //In live->match page
let match_length = 1 + $('#match-observer > ul > li').length,
end_match_length = ($('#'+currentLive.matchId).hasClass('ended')?1:0) + $('#match-observer > ul > li.ended').length;
return match_length == end_match_length;
},
AreScoresUpdated : function(tryGetPage=0){
delete this.AreScoresUpdated;
return new Promise((res,rej)=>{
Game.getPage('index.php?w='+worldId+'&area=user&module=main&action=home&layout=none','#matches').then(matches=>{
let last_matches = $(matches).find('ul.matches.last'),
scores_updated = !1
if(!last_matches.find('li.no-entry').length){
last_matches = last_matches.find('>li');
let match_day = new Date(parseInt(currentLive.matchId.split('_')[2])*1000).toLocaleDateString();
last_matches.each(function(){
let match = $(this);
if(match.find('li.type > span.match.league').length){
let match_dates = match.find('li.date').text().trim().split(/\s+/g); // return ["23.02.2019", "18:00:00"] or ["Bugün, "18:00:00"] || ["Today, "18:00:00"]
if(match_dates[0].length != 10 || match_dates[0] == match_day)
scores_updated = !0;
return false;
}
});
}
res(scores_updated);
}).catch(err=>{rej(err);});
});
},
SetMatchIdForClub : function(table){
delete this.SetMatchIdForClub;
$('#match-observer>ul>li a[clubid]').each(function(){
let a = $(this);
table.find(c=>c.clubId==a.attr('clubid')).matchId = a.parents('li').first().attr('id').split('_')[a.parent().hasClass('squad-home')?0:1];
});
table.find(c=>c.clubId==currentLive.homeClubId).matchId = currentLive.homeId;
table.find(c=>c.clubId==currentLive.awayClubId).matchId = currentLive.awayId;
},
SetOppenentId : function(table){
table.forEach(c=>{
let clubId = c.clubId,
oppenent_id = null;
if(currentLive.homeClubId == clubId) oppenent_id = currentLive.awayClubId;
else if(currentLive.awayClubId == clubId) oppenent_id = currentLive.homeClubId
else{
$('#match-observer > ul > li').toArray().forEach(li=>{
li = $(li);
let a = li.find('a[clubid]');
if(a.toArray().find(a=>$(a).attr('clubid')==clubId)==undefined) return;
if(a.first().attr('clubid')==clubId) oppenent_id = a.last().attr('clubid')
else oppenent_id = a.first().attr('clubid');
});
}
if(oppenent_id!=null);
c.oppenent_id = oppenent_id;
});
},
GetCurrentScores : function(){
delete this.GetCurrentScores;
let scores = [];
//Add current matches scores
scores.push({
home: {
id: currentLive.homeClubId
},
away: {
id: currentLive.awayClubId
}
});
if($('#'+currentLive.matchId).hasClass('ended') && currentLive.timeElement.html()==1){ //Hükmen galibiyet
let home_goals = $('#match-messages > li.info').first().find('span.away,span.home').first().attr('class')=="away"?3:0,
away_goals = home_goals==3?0:3;
scores[0].home.goals = home_goals;
scores[0].away.goals = away_goals;
}
else{
scores[0].home.goals = parseInt($('#'+currentLive.matchId + '> span.score > div:first > span.score-home').text());
scores[0].away.goals = parseInt($('#'+currentLive.matchId + '> span.score > div:first > span.score-away').text());
}
scores.push(...$('#match-observer > ul > li').toArray().map(li=>{
return {
home: {
id: $('span.squad-home > a',li).attr('clubid'),
goals : parseInt($('> span.score > span.score-home',li).text())
},
away: {
id: $('span.squad-away > a',li).attr('clubid'),
goals : parseInt($('> span.score > span.score-away',li).text())
}
};
}));
//Add other matches scores
return scores;
},
CreateTableWithScores: function(scores, table, updated_table=false, fill_items=table){
let factor = updated_table?-1:1,
len = table.length,
new_table = new Array(len);
scores.forEach(score=>{
let diffGoals = score.home.goals - score.away.goals,
points = diffGoals!=0?3:1,
idx1 = table.findIndex(c=>c.clubId==score.home.id),
idx2 = table.findIndex(c=>c.clubId==score.away.id),
home_= table[idx1],
away_= table[idx2],
home,away;
new_table[idx1] = home = Object.create(home_);
new_table[idx2] = away = Object.create(away_);
home.points = home_.points + factor*points*(diffGoals>-1?1:0);
away.points = away_.points + factor*points*(diffGoals<1?1:0);
if(diffGoals!=0){
let key = diffGoals>0?'won':'lost';
home[key] = home_[key] + factor;
away[key = key=="lost"?'won':'lost'] = away_[key] + factor;
}
else{
home.drawn = home_.drawn + factor;
away.drawn = away_.drawn + factor;
}
home.gf = home_.gf + factor*score.home.goals;
away.gf = away_.gf + factor*score.away.goals;
home.ga = home_.ga + factor*score.away.goals;
away.ga = away_.ga + factor*score.home.goals;
home.average = home_.average + factor*diffGoals;
away.average = away_.average + factor*diffGoals*-1;
});
for(let i=0; i<len ;i++){
if(new_table[i]!==undefined) continue;
new_table[i] = fill_items.find(c=>c.clubId==table[i].clubId);
}
return this.SortTable(new_table);
},
SortTable : function(table){
return table.sort(function(a,b){
let compare;
if(compare = b.points - a.points) return compare; //En yüksek puana göre sırala
else if(compare = b.average - a.average) return compare; //Averajı yüksek olan
else if(compare = b.gf - a.ga) return compare; //Daha fazla gol atan
return a.clubId - b.clubId; //Daha önce takım açan
});
},
UpdateLiveLeagueTable : function(){
$('#league-table > table > tbody').html('')
function showChanged(diff){
return diff!=0?`<span class="changed-property" style="margin-left:2px;">(${(diff>0?'+':'')+diff})</span>`:'';
}
console.log('old: %o\n,new: %o',this.old_table,this.new_table);
this.new_table.forEach((club,i)=>{ //Add Row to Live League Table
let club_old_index = this.old_table.findIndex(c=>c.clubId==club.clubId),
club_old = this.old_table[club_old_index],
rank_dif = club_old_index-i,
diff = ['played','won','drawn','lost','gf','ga','average','points'].reduce((acc,key)=>{
acc[key] = club[key]-club_old[key];
return acc;
},{}),
opp_idx = null;
if(!isNaN(club.oppenent_id)) opp_idx = this.new_table.findIndex(c=>c.clubId==club.oppenent_id);
$('#league-table > table > tbody').append(
`<tr class="${this.tableRowClass[i]} ${i%2?'even':'odd'}" ${[currentLive.homeId, currentLive.awayId].includes(club.matchId)?`style="background-color:#4854a8;"`:''} ${!isNaN(opp_idx) && opp_idx>-1?`opp_idx="${opp_idx}"`:''}>`+
` <td>${i+1}</td>`+
` <td>`+
` <div class="icon ${rank_dif>0?'advancement':rank_dif<0?'relegation':'remain'}" ${rank_dif!=0?` title="${(rank_dif>0?'+':'')+rank_dif}"`:""}></div>`+
` </td>`+
` <td class="name-column">`+
` <a href="#/index.php?w=${worldId}&area=user&module=profile&action=show&clubId=${club.clubId}" clubid="${club.clubId}" ${club.clubId==Tool.clubId?'class="self-link"':''}>${club.clubName}</a>`+
` </td>`+
` <td style="color:black;">${club.played+showChanged(diff.played)}</td>`+
` <td style="color:black;">${club.won+showChanged(diff.won)}</td>`+
` <td style="color:black;">${club.drawn+showChanged(diff.drawn)}</td>`+
` <td style="color:black;">${club.lost+showChanged(diff.lost)}</td>`+
` <td style="color:black;">${club.gf+showChanged(diff.gf)}</td>`+
` <td style="color:black;">${club.ga+showChanged(diff.ga)}</td>`+
` <td style="color:black;">${club.average+showChanged(diff.average)}</td>`+
` <td class="last-column" style="color: black;"><b>${club.points}</b>${showChanged(diff.points)}</td>`+
`</tr>`
);
});
},
StartToCatchNewGoals : function(){
delete this.StartToCatchNewGoals;
unsafeWindow.jQuery('<span id="NewGoalCatcher">').hide().appendTo('#content').click(function(_, matches_status){
// matches_status: { "668262_667855_1550761200_league": { "status": "ended", "home_goals": 0, "away_goals": 3, "min": 1 }, "669559_669389_1550761200_league": { "status": "ended", "home_goals": 0, "away_goals": 1, "min": 93 }, "669599_106135_1550761200_league": { "status": "ended", "home_goals": 5, "away_goals": 0, "min": 92 } }
if(!matches_status) return;
let new_scores = [];
console.log('New Goal Catcher: %o',matches_status);
for(let matchId in matches_status){
if(matchId.split('_')[3]!='league') continue;
let match = matches_status[matchId];
new_scores.push({
home : {
id : LiveLeagueTable.new_table.find(c=>c.matchId==matchId.split('_')[0]).clubId,
goals: match.home_goals
},
away : {
id : LiveLeagueTable.new_table.find(c=>c.matchId==matchId.split('_')[1]).clubId,
goals: match.away_goals
},
});
}
LiveLeagueTable.new_table = LiveLeagueTable.CreateTableWithScores(
new_scores, //updated scores
LiveLeagueTable.old_table, //old scores in old table and new scores use to create a table
false, //create next table
LiveLeagueTable.new_table //old scores will not be updated
);
LiveLeagueTable.UpdateLiveLeagueTable();
});
},
StartToCatchMatchEnd : function(){
delete this.StartToCatchMatchEnd;
unsafeWindow.jQuery('<span id="MatchEndCatcher">').hide().appendTo('#content').click(function(_, matchId){
console.log("Match ended: "+matchId);
});
}
};
LiveLeagueTable.Initialize();
},null);
Tool.features.add('SortTournaments','tournament',function(){
let upcoming_table = $('#tournaments > div.container.upcoming > div > table');
if(upcoming_table.find('>tbody>tr').length==0) return false;
let getDateNum = (date) => parseInt(((date=new Date((date=date.split('.'))[2],parseInt(date[1])-1,date[0]))-date.getTimezoneOffset()*60*1000)/86400000);
if(!Tool.hasOwnProperty('tournaments_data')){
$(CreateButton('BtnSortTournaments', GetText('SortTournaments'),'top:55px;')).insertAfter('#button-container-create-own-tournament').click(function(){
$(this).off().remove();
$('#tournaments-handle-container > li.handle').off();
let total_tournaments = 0,
tournaments = [], //except credits tournament
other_pages = upcoming_table.find('> tfoot > tr > td > a'),
page_count = 1 + other_pages.length;
if(page_count == 1) saveTournament(upcoming_table.find('>tbody'), true, toolTipObj.data);/*save current page*/
else{
let cur_page_num=-1,
e = upcoming_table.find('> tfoot > tr > td > strong');
if(e.length){
cur_page_num = parseInt(e.first().text());
saveTournament(upcoming_table.find('> tbody'), false, toolTipObj.data);/*save current page*/
}
let get_page_count = 0,
success_count = 0,
fail_count = 0;
$('#button-container-create-own-tournament').after(
`<span style="position: absolute;top: 55px;right: 52px;">`+
` <img src="/designs/redesign/images/icons/loading/16x16.gif" style="vertical-align:middle;margin-right: 3px;">`+
` ${GetText('gettingPage')}: <span id="get_page_count">0</span>/${page_count-1} | ${GetText('success')}: <span id="success_count">0</span> | ${GetText('fail')}: <span id="fail_count">0</span>`+
`</span>`
);
let always=(data=null)=>{
let finish = get_page_count == page_count-1;
if(finish) $('#get_page_count').parent().find('img').first().remove();
if(data==null) return;
saveTournament(data.content, finish, data.tooltip);
};
Array.from({length: page_count}, (_, i) => i + 1).forEach(n=>{
if(n==cur_page_num) return;
Game.getPage(
`?area=user&module=tournament&action=index§ion=upcoming&posupcoming=${(n-1)*20}&layout=none`,
'#tournaments> div.container.upcoming> div> table> tbody:first',
null, //callback
0, //fail counter
['content','tooltip']
).then(data=>{
data.tooltip = JSON.parse(data.tooltip);
if(!data.content.length || typeof data.tooltip != 'object') throw new Error("There is an error in the requested data.");
$('#get_page_count,#success_count').toArray().forEach(e=>{$(e).html(eval("++"+e.id))})
always(data)
}).catch(err=>{
$('#get_page_count,#fail_count').toArray().forEach(e=>{$(e).html(eval("++"+e.id))})
console.error(err);
always();
});
});
}
function saveTournament(tbody, finish, tooltip){
total_tournaments += tbody.find('tr').length;
tbody.find('tr').each(function(i){
if($(this).find('.first-column > .credits').length) return;
let tournament_id = $(this).find(' td.info-column > a > img').attr('tooltip').replace('tt_',''),
tournament = {
has_psw : $(this).find('.first-column > .password').length?true:false,
name : $(this).find('.name-column:first>a').text().trim(),
id : tournament_id,
tt : tooltip['tt_'+tournament_id]
},
totalPrice = 0, koo = false;
$(tournament.tt).find('div.tournament-tooltip-table> table> tbody> tr').each(function(j){
if($(this).find('.last-column').length)
totalPrice += parseInt($(this).find('td.last-column > span > span.currency-number').text().split('.').join(''));
else{
koo = true;
return;
}
});
if(!koo){
let a = $(this).find('td:nth-child(4) > a').first(),
start = $(this).find('td:nth-child(5)').text().trim(),
end = $(this).find('td:nth-child(6)').text().trim();
tournaments.push(Object.assign({
totalPrice: totalPrice,
type: $(this).find('td:nth-child(3) > span')[0].className.replace('icon','').trim(),
club: {
id : a.attr('clubid'),
name: a.text().trim()
},
start : start,
startK: getDateNum(start),
end : end,
endK: getDateNum(end),
},tournament));
}
else{
console.info(`The tournament named ${tournament.name}[id=${tournament.id}] is not included in the ranking]`);
}
});
if(finish){
console.info(`Total tournaments: ${total_tournaments}. Maximum ${tournaments.length} of them will be sorted and shown!`);
Tool.tournaments_data = {
tournaments: tournaments,
total: total_tournaments,
except: total_tournaments-tournaments.length //Credit tournaments size
};
if($('#get_page_count').length){
Tool.tournaments_data = Object.assign({
page_count: page_count-1,
get_page_count: parseInt($('#get_page_count').html()),
success_count: parseInt($('#success_count').html()),
fail_count: parseInt($('#fail_count').html())
},Tool.tournaments_data);
}
sortTournaments('money', 'DESC');
showTournaments();
}
}
})[$('#tournaments-handle-container > li[target=".container.upcoming"]').hasClass('active')?'show':'hide']();
$('#tournaments-handle-container > li.handle').click(function(){
$('#BtnSortTournaments')[$(this).attr('target')==".container.upcoming"?'show':'hide']();
});
}
else{
if(Tool.tournaments_data.hasOwnProperty('page_count')){
$('#button-container-create-own-tournament').after(
'<span style="position: absolute;top: 55px;right: 52px;">'+
` ${GetText('gettingPage')}: ${Tool.tournaments_data.get_page_count}/${Tool.tournaments_data.page_count} | ${GetText('success')}: ${Tool.tournaments_data.success_count} | ${GetText('fail')}: ${Tool.tournaments_data.fail_count}`+
'</span>'
);
}
showTournaments(); /*Show saved tournaments*/
}
function showTournaments(){
let thead_row = $('>thead>tr',upcoming_table).first();
thead_row.before(
`<tr style="background:none;">`+
` <th colspan="8" style="background-color: #075971;border-radius: 7px 7px 0 0;padding:5px;"><span id="sorted_tournaments_length" style="line-height: 1.4; white-space: break-spaces;">...</span></th>`+
`</tr>`
);
$('>th:nth-child(5),>th:nth-child(6)',thead_row)
.addClass('sort_tournaments')
.attr({'sort_type':'date','order_by':'DESC'})
.css('cursor','pointer');
$('th:nth-child(6)',thead_row).after(`<th class="sort_tournaments" sort_type="money" order_by="ASC" style="cursor:pointer;">${GetText('totalprice')}</th>`);
$('.sort_tournaments').click(function(){
let order_by = $(this).attr('order_by');
sortTournaments($(this).attr('sort_type'), order_by);
updateTbody();
$(this).attr('order_by',order_by=='ASC'?'DESC':'ASC');
});
$('>tfoot',upcoming_table).html('');
let ownTournaments = [],
own_tbody = $('#tournaments > div.container.own > div > table > tbody');
if(own_tbody.find('.info-column').length){
own_tbody.find('tr').each(function(){
let icon = $(this).find('>td.first-column> span.icon'),
tournament = {
id: $(this).find('>td.info-column>a>img[tooltip]').attr('tooltip').replace('tt_',''),
type:'normal'
};
if(icon.length){
if(icon.hasClass('password')) tournament.has_psw = true;
if(icon.hasClass('credits')) tournament.type='credits';
else if(icon.hasClass('tournament')) tournament.type='special';
}
ownTournaments.push(Object.assign({
start: getDateNum($(this).find('td:nth-child(4)').text().trim()),
end : getDateNum($(this).find('td:nth-child(5)').text().trim())
},tournament));
});
}
let isTournamentIntersect = t1=>{
let s1=t1.startK, e1=t1.endK;
return undefined !== ownTournaments.filter(t2=>t2.type!='special').find(t2=>{
let s2=t2.start, e2=t2.end;
return (e1>=s2 && e1<=e2) || (s1<=e2 && s1>=s2);
});
}, tbody = $('>tbody',upcoming_table);
updateTbody()
function updateTbody(){
tbody.html('');
let intersect=0,
i=0;
Tool.tournaments_data.tournaments.forEach((t)=>{
if(isTournamentIntersect(t)){ ++intersect; return;} // or set background-color:#00000099
tbody.append(
`<tr class="${i++%2?"even":"odd"}">`+
` <td class="first-column">${t.has_psw?`<span class="icon password"></span>`:``}</td>`+
` <td class="name-column">`+
` <a href="#/index.php?w=${worldId}&area=user&module=tournament&action=tournament&tournament=${t.id}">${t.name}</a>`+
` </td>`+
` <td>`+
` <span class="icon ${t.type}" tooltip="tt_tournament_type_${t.type}"></span>`+
` </td>`+
` <td class="name-column">`+
` <div class="club-logo-container"></div>`+
` <a href="#/index.php?w=${worldId}&area=user&module=profile&action=show&clubId=${t.club.id}" clubid="${t.club.id}">${t.club.name}</a>`+
` </td>`+
` <td class="date-column" sortvalue="${t.startK}">${t.start}</td>`+
` <td class="date-column" sortvalue="${t.endK}">${t.end}</td>`+
` <td>${t.totalPrice.toLocaleString()}</td>`+
` <td class="last-column info-column">`+
` <a href="#/index.php?w=${worldId}&area=user&module=tournament&action=tournament&tournament=${t.id}">`+
` <img src="/designs/redesign/images/icons/tooltip.gif" name="__tooltip" tooltip="tt_${t.id}">`+
` </a>`+
` </td>`+
`</tr>`
);
if(!toolTipObj.data.hasOwnProperty('tt_'+t.id)) toolTipObj.data['tt_'+t.id] = t.tt;
});
let total = Tool.tournaments_data.total,
except = Tool.tournaments_data.except,
attended = ownTournaments.length,
shown = tbody.find('>tr').length,
lines=[GetText('Tournament_total', {args:[`<font color="chartreuse">${total}</font>`]})],
missing=0;
if(except){
lines.push(GetText('Tournament_except', {args:[`<font color="crimson">${except}</font>`]}));
missing+=except;
}
if(intersect){
if(missing==0){
lines.push(GetText('Tournament_intersect_1', {args:[`<font color="crimson">${intersect}</font>`, `<font color="chartreuse">${total}</font>`, `<font color="darkturquoise">${attended}</font>`]}));
}
else{
lines.push(GetText('Tournament_intersect_2', {args:[`<font color="crimson">${intersect}</font>`, `<font color="chocolate">${total-except}</font>`, `<font color="darkturquoise">${attended}</font>`]}));
}
missing+=intersect;
}
if(shown<total-missing){
lines.push(GetText('Tournament_unknown', {args:[`<font color="crimson">${(total-missing)-shown}</font>`]}));
missing+=(total-missing)-shown;
}
if(missing==0) lines[0]+=" "+GetText('Tournament_end_1', {args:[]});
else{
lines.push(GetText('Tournament_end_2', {args:[`<font color="mediumspringgreen" style="font-size: 15px;">${shown}</font>`]}));
}
$('#sorted_tournaments_length').html(lines.join('<br>'));
}
}
function sortTournaments(type, order_by='DESC'){
order_by=order_by=='DESC'?1:-1;
switch(type){
case "money":
Tool.tournaments_data.tournaments.sort((a,b)=>order_by*(b.totalPrice-a.totalPrice));
break;
case "date":
Tool.tournaments_data.tournaments.sort((a,b)=>order_by*(a.startK-b.startK));
break;
}
}
},null);
(async ()=>{
await new Promise(res=>{
//updateLayout function is will declerate asap in body script tag.
//When it is exist it will be updated to start detecting page changing
Tool.intervals.create(function(){
if(typeof unsafeWindow.updateLayout != 'function') return;
this.delete();
Game.startDetectingPageChanging();
res();
},20);
});
Tool.start();
})();
//FUNCTIONS
function CatchError(e,where){
console.log('%c[FCUP-SCRİPT] %cERROR%c | '+ e + '%c\tIn'+where,'color:blue;font-weight:bold;','color:red;','','float:right;color:green;');
}
function SecToTime(s){
//Converts seconds to [d [day|days]] hh:mm:ss
if(s<0) return '-';
let m = 0,h = 0,t='';
if(s>59)
if((m = parseInt(s/60))>59)
if((h = parseInt(m/60))>23)
t = parseInt(h/24)+' '+(h<48?GetText('aDay'):GetText('Days'))+' ';
return t + Pad2(h%24)+':'+Pad2(m%60)+':'+Pad2(s%60);
}
function GetDateText(ms){
// Converts milliseconds to d.m.Y H:i:s date format
let d = new Date(ms);
return Pad2(d.getDate())+"."+
Pad2(d.getMonth()+1)+"."+
d.getFullYear()+' '+
Pad2(d.getHours())+":"+
Pad2(d.getMinutes())+":"+
Pad2(d.getSeconds());
}
function Pad2(a){
return (a<10?"0":"")+a;
}
function GetOffset(el){
let _x = 0,_y = 0;
while(el && !isNaN(el.offsetLeft) && !isNaN(el.offsetTop)) {
_x += el.offsetLeft - el.scrollLeft;
_y += el.offsetTop - el.scrollTop;
el = el.offsetParent;
}
return {top: _y, left: _x};
}
function GetFuncContent(func){
return (func=func.toString()).substring(func.indexOf('{')+1, func.lastIndexOf('}'));
}
function DownloadAsTextFile(text,filename){
let object_URL = URL.createObjectURL(new Blob([text], {type: "text/plain"}));
$('<a>').attr({'href':object_URL,'download':(filename||'Fcup Script Datas')+'.txt'})[0].click();
URL.revokeObjectURL(object_URL);
}
function ReadTextFile(func){
$('<input type="file" accept="text/plain">').change(function(e){
let file = this.files[0];
if(file.type == 'text/plain') {
let reader = new FileReader();
reader.onload = function() {
func(reader.result);
};
reader.readAsText(file);
}
}).click();
}
function ShowDialog(div,header=undefined,setMid=true){
$('html, body').animate({ scrollTop: 0 }, 'fast');
$('#container > .shadow').show();
let focus = $('<div>').attr('id',div.id || null).css({
'padding' : '15px',
'width' : '580px',
'wordWrap' : 'break-word',
'textAlign' : 'center!important',
'box-sizing': 'border-box'
}).css(div.css || {}).addClass('focus visible').addClass(div.class || null).html(div.content || '');
if(typeof header == 'object'){
let h2 = $('<h2>').css(header.css || {}).html(header.content || '').css({
width : '100%',
paddingLeft : '0px',
paddingRight : '0px',
top : '0px',
transform : 'translateY(-100%)'
});
focus.prepend(h2);
}
if(div.footer) focus.append('<div class="footer"></div>');
if(div.close) focus.append('<div class="close" style="position:absolute;top:-46px"></div>');
$('#container').append(focus);
let topOffset = 190;
if(setMid){
//Set In The Midst
topOffset = 0/*$(window).scrollTop()*/ + ($(window).innerHeight() - focus.height()) / 2;
if (topOffset < 190) topOffset = 190;
}
focus.css({
'position': 'absolute',
'top' : topOffset + 'px',
'left' : ($(window).scrollLeft() + ($(window).innerWidth() / 2) - (focus.width() / 2 + focus.parent().offset().left)) + 'px'
});
}
function CreateButton(id,value,buttonStyle='',spanStyle=''){
return `<span class="button disHighlight" id="${id}" style="cursor:pointer; ${buttonStyle}">`+
` <a class="button" style="text-decoration:none;">`+
` <span style="${spanStyle}">${value}</span>`+
` </a>`+
`</span>`;
}
function BlinkEvent(e,duration,duration2=2500,times=5){
times = Math.max(times,1);
if(e.attr('BlinkEvent')!=undefined){
if(e.attr('BlinkEvent')!=0){
e.attr('BlinkEvent',times);
return;
}
else e.attr('BlinkEvent',times);
}
e.attr('BlinkEvent',times);
e.css('background-color','#910e0ea8');
f();
let blink = setInterval(f, duration);
function f(){
e.fadeOut(duration/2);
e.fadeIn(duration/2);
let times = parseInt(e.attr('BlinkEvent'))||1;
e.attr('BlinkEvent',--times);
if(times<1){
clearInterval(blink);
setTimeout(()=>{
if(e.attr('BlinkEvent')==0){
e.css('transition','background-color 1s').css('background-color','');
setTimeout(()=>{
if(e.attr('BlinkEvent')==0){
e.css('transition','');
e.removeAttr('BlinkEvent');
}
},1000);
}
},duration2);
}
}
}
function SaveLeagueData(cntnt){
if(cntnt.find('.date-selector').length==0) return false;
if(cntnt.find('div.table-container table > tbody a[clubid][class*="self-link"]').length==0) return false;
let match_weeks = cntnt.find('.date-selector > ul >li.day').length,
date = $('div > div.table-container > h3',cntnt)[0].textContent, // "Spieltag: 2 - 13.09.2020 18:00:00"
idx1 = date.indexOf(':');
if(idx1==-1) return false;
idx1++;
let idx2 = date.indexOf('-',idx1+1);
if(idx2==-1) return false;
let match_day_number = parseInt(date.substring(idx1,idx2)); //Exp: Return 2
idx2++;
let lastMatchDate = date.substring(idx2,date.indexOf(' ',date.indexOf('.',idx2+1)+1)).trim().split('.'),
addDay = match_weeks-match_day_number,
aDay = 24*60*60*1000; // ms
if(match_day_number<match_weeks/2) addDay+=3; //League break days
lastMatchDate = new Date(lastMatchDate[2],parseInt(lastMatchDate[1])-1,parseInt(lastMatchDate[0])+addDay).getTime();
if(lastMatchDate+aDay<=Game.getTime()) return false;
let firstMatchDate = lastMatchDate-(match_weeks-1+3)*aDay,
firstHalfFinalMatchDate = firstMatchDate+(match_weeks/2-1)*aDay,
clubs = {};
cntnt.find('div.table-container table >tbody .name-column').each(function(){
let a = $(this).find('a:first'),
clubId = a.attr('clubid');
if(clubId==Tool.clubId) return;
clubs[clubId] = a.text().trim();
});
let LeagueData = {
league : cntnt.find('select:first > option:selected').text().trim(),
firstMatchDate : firstMatchDate,
firstHalfFinalMatchDate: firstHalfFinalMatchDate,
lastMatchDate : lastMatchDate,
clubs : clubs
};
Tool.setVal('LeagueData',LeagueData);
return LeagueData;
}
function IsYoungPlayer(td){
return $(td).find('[tooltip="tt_extendNotPossibleJunior"]').length;
}
function GetRealStrength(skills,position){
// skills: Float Array(14), positions: String
let strengthFactors = Tool.strengthFactors[position];
if(!Array.isArray(strengthFactors)) return "-";
return strengthFactors.reduce((acc,i)=>acc+skills[i[0]]/28*i[1],0);
}
function FindNumberOfTraining(start,end){
// start and end are dates ms
if(end <= start) return 0;
let normalTrainingsTimeCycle = [
[36000, 54000],
[36000, 54000],
[25200, 36000, 54000],
[36000, 54000]
], premiumTrainingsTimeCycle = [[25200],[],[],[]],
normalTrainingsInACycle = normalTrainingsTimeCycle.reduce((acc,v)=>acc+v.length,0),
premiumTrainingsInACycle = premiumTrainingsTimeCycle.reduce((acc,v)=>acc+v.length,0),
startDate = new Date(start),
endDate = new Date(end),
getDaySeconds = (date)=>date.getHours()*3600+ date.getMinutes()*60+ date.getSeconds(), //Return [0,86400]
getDayIndex = (date)=>parseInt((date.getTime()-date.getTimezoneOffset()*60*1000)/86400000)%4,
normalTrainings = 0,
premiumTrainings = 0,
addDayTrainings = (date,dayIndex,after=true)=>{
let daySeconds = getDaySeconds(date);
let a,b;
normalTrainings += a = normalTrainingsTimeCycle[dayIndex].filter(time=>after?time>daySeconds:daySeconds>time).length;
premiumTrainings += b = premiumTrainingsTimeCycle[dayIndex].filter(time=>after?time>daySeconds:daySeconds>time).length;
return dayIndex;
},
getDaysBetweenDates = (s,e)=> (new Date(e.getFullYear(),e.getMonth(),e.getDate()).getTime() - new Date(s.getFullYear(),s.getMonth(),s.getDate()).getTime())/86400000-1;
// 1- Calculate the day index using the start date and add trainings in the starting day.
let dayIndex = getDayIndex(startDate);
addDayTrainings(startDate,dayIndex);
// 2- Başlangıç ve bitiş günleri arasındaki gün sayısını bul. Gün sayısını kullanarak döngü sayısını bul. Döngü kadar antrenman ekle
let days = getDaysBetweenDates(startDate,endDate),
cycle_count = parseInt(days/4);
normalTrainings += cycle_count*normalTrainingsInACycle;
premiumTrainings += cycle_count*premiumTrainingsInACycle;
// 3- Döngüsü tamamlanmamış günleri tek tek ekle
for(let i=0,len=days%4; i<len; i++){
dayIndex = (dayIndex+1)%4;
normalTrainings += normalTrainingsTimeCycle[dayIndex].length;
premiumTrainings += premiumTrainingsTimeCycle[dayIndex].length;
}
// 4- Bitiş günündeki anrenman sayısını ekle
dayIndex = (dayIndex+1)%4;
addDayTrainings(endDate,dayIndex,false);
return {normal: normalTrainings, premium: premiumTrainings};
}
function CalculateFutureStrength(start, end, skills, position, young, limit=990){
let trainings = FindNumberOfTraining(start,end),
training_score = young==true?parseInt(Tool.yTrainerLevel)+0.5: parseInt(Tool.trainerLevel)*0.25+0.5,
next_skills = {
normal : skills.slice(0),
premium: skills.slice(0)
},
trainingRankingOfSkills = Tool.trainingPlan[position];
for(let i=0, remaining_trainings=trainings.normal ; i < trainingRankingOfSkills.length && remaining_trainings>0 ; i++){
let skillIndex = trainingRankingOfSkills[i],
cur_value = skills[skillIndex];
if(cur_value>=limit) continue;
let apply_trainings = Math.min(
remaining_trainings,
GetMaxSkill(cur_value, training_score, limit).required_trainings
);
next_skills.premium[skillIndex] = next_skills.normal[skillIndex] = cur_value + (apply_trainings*training_score);
remaining_trainings-=apply_trainings;
}
for(let i=0, remaining_trainings=trainings.premium ; i < trainingRankingOfSkills.length && remaining_trainings>0 ; i++){
let skillIndex = trainingRankingOfSkills[i],
cur_value = next_skills.premium[skillIndex];
if(cur_value>=limit) continue;
let apply_trainings = Math.min(
remaining_trainings,
GetMaxSkill(cur_value, training_score, limit).required_trainings
);
next_skills.premium[skillIndex] += apply_trainings*training_score;
remaining_trainings-=apply_trainings;
}
return {
current_strength: GetRealStrength(skills, position),
future : {
normal : {
strength : GetRealStrength(next_skills.normal, position),
skills : next_skills.normal,
trainings: trainings.normal
},
premium:{
strength : GetRealStrength(next_skills.premium, position),
skills : next_skills.premium,
trainings: trainings.normal + trainings.premium
}
}
};
}
function GetMaxSkill(curVal,trainingScore,limit=990){
let diff = limit-curVal,
numberOfTrainings = 0;
if(diff>0){
numberOfTrainings = Math.ceil(diff/trainingScore);
curVal = Math.min(1000,curVal+numberOfTrainings*trainingScore);
}
return {max_value:curVal, required_trainings:numberOfTrainings};
}
function GetMessagesByTitle(title,func){
let id,messages=[],message,_title;
$('#deleteForm > table > tbody').find('.odd,.even').each(function(){
id = $(this).attr('id').split('-')[1];
message = $('#newscenter-preview-'+id);
_title = message.find('h2').first().text().replace(/\s\s+/g, ' ').trim();
if(_title == title) messages.push(message);
});
if(messages.length) func(messages);
}