您需要先安装一个扩展,例如 篡改猴、Greasemonkey 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 Userscripts ,之后才能安装此脚本。
您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey,才能安装此脚本。
您需要先安装用户脚本管理器扩展后才能安装此脚本。
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
// ==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); }