PageSourceSearch

https://www.footballtransfers.com/js/custom.js?v=36829873447-199

js footballtransfers.com collected 2026-10-02 07:19:14 UTC 13,082 bytes, 324 lines download raw bytes

1/* custom js */
2$('.header-bar .btn-toggle').click(function () {
3    $(this).toggleClass('change');
4    $('.header-bar nav').slideToggle().toggleClass('open');
5    if ($(".header-bar .btn-toggle").hasClass('change')) {
6        $("#header-part.new .header-bar .menu ul.main li").removeClass("active");
7    }
8});
9
10/*mobile menu*/
11if ($(document).width() < 1024) {
12    $("#header-part.new .header-bar .menu ul.main > li").click(function () {
13        if ($(this).hasClass('active')) {
14            $("#header-part.new .header-bar .menu ul.main li").removeClass("active");
15        } else {
16            $("#header-part.new .header-bar .menu ul.main li").removeClass("active");
17            $(this).addClass("active");
18        }
19    });
20
21    $(document).on('click', ".navigation2 .has-sub > a:not('.open')", function (e) {
22        e.preventDefault();
23        const parent = $(this).parent();
24        const link = $(this);
25        const nav = parent.find('.nav2__sub');
26        const navBar = $(this).parents('.navigation2');
27        const closeBtn = '<button type="button" class="btn-close-sub"><i class="fa fa-times"></i></button>';
28
29        $(this).addClass('open');
30        nav.clone().appendTo(navBar);
31        link.clone().prependTo('.navigation2 > .nav2__sub');
32        $('.navigation2 > .nav2__sub').prepend(closeBtn);
33    });
34
35    $(document).on('click', '.btn-close-sub, .navigation2 .has-sub > a.open', function (e) {
36        e.preventDefault();
37        $('.navigation2 .has-sub > a.open').removeClass('open');
38        $('.navigation2 > .nav2__sub').remove();
39    })
40}
41
42
43//SCROLL DOWN
44
45window.onscroll = function () { scrollDown() };
46window.onload = function () { scrollDown() };
47
48var navbar = document.getElementById("onlyMenu");
49var bodytop = document.getElementById("template");
50var sticky = navbar ? navbar.offsetTop : null;
51
52function scrollDown() {
53    if ($(document).width() > 1024) {
54        if (window.pageYOffset >= 90) {
55            $("body").addClass("sticky");
56        } else {
57            $("body").removeClass("sticky");
58        }
59    }
60}
61
62/**
63 * Replaces variables in the template.
64 * @param string template.
65 * @param object variables.
66 */
67function replaceInTemplate(template, variables) {
68    for (var key in variables) {
69        template = template.replaceAll(key, variables[key]);
70    }
71
72    return template;
73}
74
75const SI_SYMBOL = ["", "K", "M", "B", "T", "P", "E"];
76
77function abbreviateNumber(number) {
78    const tier = Math.log10(Math.abs(number)) / 3 | 0;
79
80    if (tier == 0) return number;
81
82    const suffix = SI_SYMBOL[tier];
83
84    if (suffix === 'B') {
85        return parseFloat((number / Math.pow(10, 2 * 3)).toFixed(1)) + 'M';
86    } else if (suffix === 'K' && Math.abs(number) >= Math.pow(10, 5) && Math.abs(number) < Math.pow(1000, 2)) { // >= 100k and < 1M
87        return (number / Math.pow(10, 5)) == Math.round(number / Math.pow(10, 5))
88            ? parseFloat((number / Math.pow(10, 2 * 3)).toFixed(1)) + 'M'
89            : parseFloat((number / Math.pow(10, 2 * 3)).toFixed(2)) + 'M';
90    }
91
92    const scale = Math.pow(10, tier * 3);
93    const scaled = number / scale;
94
95    return parseFloat(scaled.toFixed(1)) + suffix;
96}
97
98if (!String.prototype.replaceAll) {
99    String.prototype.replaceAll = function (s, f, r) { return s.split(f).join(r) };
100}
101
102if (!Array.prototype.every) {
103    Array.prototype.every = function (callbackfn, thisArg) {
104        'use strict';
105        var T, k;
106
107        if (this == null) {
108            throw new TypeError('this is null or not defined');
109        }
110
111        // 1. Let O be the result of calling ToObject passing the this
112        //    value as the argument.
113        var O = Object(this);
114
115        // 2. Let lenValue be the result of calling the Get internal method
116        //    of O with the argument "length".
117        // 3. Let len be ToUint32(lenValue).
118        var len = O.length >>> 0;
119
120        // 4. If IsCallable(callbackfn) is false, throw a TypeError exception.
121        if (typeof callbackfn !== 'function' && Object.prototype.toString.call(callbackfn) !== '[object Function]') {
122            throw new TypeError();
123        }
124
125        // 5. If thisArg was supplied, let T be thisArg; else let T be undefined.
126        if (arguments.length > 1) {
127            T = thisArg;
128        }
129
130        // 6. Let k be 0.
131        k = 0;
132
133        // 7. Repeat, while k < len
134        while (k < len) {
135
136            var kValue;
137
138            // a. Let Pk be ToString(k).
139            //   This is implicit for LHS operands of the in operator
140            // b. Let kPresent be the result of calling the HasProperty internal
141            //    method of O with argument Pk.
142            //   This step can be combined with c
143            // c. If kPresent is true, then
144            if (k in O) {
145                var testResult;
146                // i. Let kValue be the result of calling the Get internal method
147                //    of O with argument Pk.
148                kValue = O[k];
149
150                // ii. Let testResult be the result of calling the Call internal method
151                // of callbackfn with T as the this value if T is not undefined
152                // else is the result of calling callbackfn
153                // and argument list containing kValue, k, and O.
154                if (T) testResult = callbackfn.call(T, kValue, k, O);
155                else testResult = callbackfn(kValue, k, O)
156
157                // iii. If ToBoolean(testResult) is false, return false.
158                if (!testResult) {
159                    return false;
160                }
161            }
162            k++;
163        }
164        return true;
165    };
166}
167
168////
169$('.popover-container').each(function () {
170    const container = $(this);
171    const trigger = container.find('.popover-trigger');
172    const modal = container.find('.popover-modal');
173    const close = container.find('.popover-close');
174
175    let offset;
176    let offsetLeft;
177    let offsetRight;
178    let offsetTop;
179    let offsetBottom;
180
181    trigger.on('click', function () {
182        offset = container.offset();
183        offsetLeft = offset.left;
184        offsetRight = ($(window).width() - (offsetLeft + container.outerWidth()))
185        offsetTop = offset.top;
186        offsetBottom = ($(window).height() - (offsetTop + container.outerHeight()))
187
188        container.toggleClass('open');
189
190        if (offsetLeft <= offsetRight) {
191            modal.css({
192                'left': offsetLeft,
193            })
194        } else {
195            modal.css({
196                'right': offsetRight,
197            })
198        }
199
200        if (offsetTop <= offsetBottom) {
201            modal.css({
202                'top': (offsetTop + container.outerHeight()),
203            })
204        } else {
205            modal.css({
206                'bottom': (offsetBottom + container.outerHeight()),
207            })
208        }
209    })
210
211    close.on('click', function () {
212        container.removeClass('open');
213    })
214})
215
216
217// Custom Tooltip
218$(document).ready(function () {
219    $.fn.toolTip = function () {
220        return this.each(function () {
221            let $toolTip = $(".popup-player-container"),
222                changeTipPosition = function (event, action) {
223                    let $target = $(event.target);
224                    let xPos = parseFloat($target.offset().left) + (parseFloat($target.width()) / 2);
225                    let yPos = $target.offset().top + 25;
226
227                    $toolTip.css({
228                        top: (yPos - 230) + "px",
229                        left: (xPos - 150) + "px"
230                    });
231                },
232                showTip = function (event, action) {
233                    $toolTip.attr("aria-hidden", false);
234                    changeTipPosition(event, action);
235                },
236                hideTip = function () {
237                    $("[role=toolTip]").attr("aria-hidden", true);
238                };
239
240            $(this).on({
241                // mousemove: changeTipPosition, // Disables the tooltip following the mouse movement
242                mouseenter: showTip,
243                focus: function (event) {
244                    showTip(event, 'keyboard');
245                },
246                mouseleave: hideTip,
247                blur: hideTip
248            });
249        });
250    };
251});
252
253
254$(function () {
255    // Player Pop-up info on article page
256    let mainArticleLinks = $('.main-article a[data-player-toolTip=1]');
257    let deviceWidth = $(window).width();
258
259    if (deviceWidth > 767) {
260        mainArticleLinks.each(function (i) {
261            $(this).addClass('popup-player')
262                .attr('aria-haspopup', true)
263                .attr('aria-describedby', 'tip-' + i);
264
265            $('.popup-player').toolTip();
266
267            $(this).hover(function () {
268                $('.popup-player-container').attr('id', $(this).attr('aria-describedby'));
269
270                // Player Variables
271                let playerName = $(this).attr('title');
272                let skill = $(this).data('skill');
273                let pot = $(this).data('pot');
274                let position = $(this).data('position');
275                let estimates = $(this).data('estimates');
276                let xtvrange = $(this).data('xtvrange');
277                let team = $(this).data('team');
278                let teamImage = $(this).data('team-image');
279                let profileImage = $(this).data('profile-image');
280
281                // Replace short dash to a long hyphen
282                let xtvRangeNew = xtvrange?.replace('-', '—');
283
284                $('.player-image img').attr('src', profileImage);
285                $('.player-name').text(playerName);
286                $('.player-position').text(position);
287                $('.player-skill').text(skill);
288                $('.player-pot').text(pot);
289                $('.player-estimates').text(estimates);
290                $('.player-team').text(team);
291                $('.player-team-image').attr('src', teamImage);
292                $('.player-xtvrange').text(xtvRangeNew);
293
294                // Check player name character length
295                let playerNameLength = playerName.length;
296
297                if (playerNameLength > 24 && playerNameLength < 32) {
298                    $('.player-name').css('fontSize', '1.7vmin');
299                } else if (playerNameLength > 31 && playerNameLength < 37) {
300                    $('.player-name').css('fontSize', '1.5vmin');
301                } else if (playerNameLength > 36 && playerNameLength < 43) {
302                    $('.player-name').css('fontSize', '1.3vmin');
303                } else if (playerNameLength > 42 && playerNameLength < 52) {
304                    $('.player-name').css('fontSize', '1vmin');
305                } else if ( playerNameLength > 51) {
306                    $('.player-name').css({'fontSize': '0.9vmin', 'textOverflow' : 'ellipsis', 'width' : '200px', 'overflow': 'hidden' });
307                } else {
308                    $('.player-name').removeAttr('style');
309                }
310
311
312            }, function () {
313                $('.popup-player-container').removeAttr('id');
314                $('.player-name').removeAttr('style');
315            });
316        });
317    };
318
319});
320
321var Base64 = { _keyStr: "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=", encode: function (r) { var e, t, o, a, h, d, C, c = "", f = 0; for (r = Base64._utf8_encode(r); f < r.length;)e = r.charCodeAt(f++), t = r.charCodeAt(f++), o = r.charCodeAt(f++), a = e >> 2, h = (3 & e) << 4 | t >> 4, d = (15 & t) << 2 | o >> 6, C = 63 & o, isNaN(t) ? d = C = 64 : isNaN(o) && (C = 64), c = c + this._keyStr.charAt(a) + this._keyStr.charAt(h) + this._keyStr.charAt(d) + this._keyStr.charAt(C); return c }, decode: function (r) { var e, t, o, a, h, d, C, c = "", f = 0; for (r = r.replace(/[^A-Za-z0-9\+\/\=]/g, ""); f < r.length;)a = this._keyStr.indexOf(r.charAt(f++)), h = this._keyStr.indexOf(r.charAt(f++)), d = this._keyStr.indexOf(r.charAt(f++)), C = this._keyStr.indexOf(r.charAt(f++)), e = a << 2 | h >> 4, t = (15 & h) << 4 | d >> 2, o = (3 & d) << 6 | C, c += String.fromCharCode(e), 64 != d && (c += String.fromCharCode(t)), 64 != C && (c += String.fromCharCode(o)); return Base64._utf8_decode(c) }, _utf8_encode: function (r) { var e = ""; r = r.replace(/\r\n/g, "\n"); for (var t = 0; t < r.length; t++) { var o = r.charCodeAt(t); o < 128 ? e += String.fromCharCode(o) : o > 127 && o < 2048 ? (e += String.fromCharCode(o >> 6 | 192), e += String.fromCharCode(63 & o | 128)) : (e += String.fromCharCode(o >> 12 | 224), e += String.fromCharCode(o >> 6 & 63 | 128), e += String.fromCharCode(63 & o | 128)) } return e }, _utf8_decode: function (r) { var e, t, o, a, h = "", d = 0; for (e = t = o = 0; d < r.length;)(e = r.charCodeAt(d)) < 128 ? (h += String.fromCharCode(e), d++) : e > 191 && e < 224 ? (h += String.fromCharCode((31 & e) << 6 | 63 & (o = r.charCodeAt(d + 1))), d += 2) : (h += String.fromCharCode((15 & e) << 12 | (63 & (o = r.charCodeAt(d + 1))) << 6 | 63 & (a = r.charCodeAt(d + 2))), d += 3); return h } };
322
323// FTDEV-344: the data-src -> src pass that used to live here is gone. Images are emitted with
324// a real src by the image managers, so there is nothing left to restore.

Line numbers count LF bytes from the start of the resource, as the search results do. Vendor segments are library code the classifier recognised; they are stored but not indexed. Bytes are shown as Latin1 characters, one per byte.