Paymh

Untitled

Nov 23rd, 2017
702
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 56.06 KB | None | 0 0
  1. const SETTINGS_COOKIE_NAME = "sitePrefs";
  2. var settings = getSettings();
  3. var friendsArray;
  4. var myPermissions = null;
  5. (function(A) {
  6. A.fn.votesCounterBar = function(B) {
  7. this.each(function() {
  8. var C = A(this).find(".votesCounterBar");
  9. var D = parseInt(A(this).find("div.votesNumber").text());
  10. C.width((((B - D) / B) * 100) + "%")
  11. });
  12. return this
  13. }
  14. }(jQuery));
  15. (function(A) {
  16. A.fn.animateNumbers = function(B, C) {
  17. return this.each(function() {
  18. var E = A(this);
  19. var D = parseInt(E.text());
  20. A({
  21. value: 0
  22. }).animate({
  23. value: D
  24. }, {
  25. duration: B === undefined ? 1000 : B,
  26. easing: C === undefined ? "swing" : C,
  27. step: function() {
  28. E.text(Math.floor(this.value))
  29. },
  30. complete: function() {
  31. if (parseInt(E.text()) !== D) {
  32. E.text(D)
  33. }
  34. }
  35. })
  36. })
  37. }
  38. }(jQuery));
  39. $(document).ready(function() {
  40. initGlobals();
  41. p();
  42. $(".playerTopMenu .trigger").click(function() {
  43. $(this).toggleClass("active");
  44. if ($(this).is(".active")) {
  45. $(".playerTopMenu .icons.carrot.grey").removeClass("down").addClass("up");
  46. $(".speechBubble").css("z-index", 0);
  47. $(".playerTopMenu").animate({
  48. height: advancedLobbiesReleased ? "137px" : "108px"
  49. }, 200)
  50. } else {
  51. $(".playerTopMenu .icons.carrot.grey").removeClass("up").addClass("down");
  52. $(".playerTopMenu").animate({
  53. height: "45px"
  54. }, 200, function() {
  55. $(".speechBubble").css("z-index", 200)
  56. })
  57. }
  58. });
  59. if (advancedLobbiesReleased) {
  60. $("#trigg_menu1").click(function() {
  61. var A = function() {
  62. $("#trigg_menu1 .icons.carrot.micro").removeClass("up").addClass("down");
  63. $("#wrap_menu1 #drop_menu1").slideUp(200, function() {
  64. $("#trigg_menu1").removeClass("active");
  65. $(this).removeClass("active")
  66. })
  67. };
  68. $(this).toggleClass("active");
  69. if ($(this).is(".active")) {
  70. $("#trigg_menu1 .icons.carrot.micro").removeClass("down").addClass("up");
  71. $("#wrap_menu1 #drop_menu1").addClass("active").slideDown(200)
  72. } else {
  73. A()
  74. }
  75. $("#trigg_menu1, #wrap_menu1, #drop_menu1").each(function(B, C) {
  76. if (typeof C !== "boolean") {
  77. $(C).click(function(D) {
  78. D.stopPropagation ? D.stopPropagation() : (D.cancelBubble = true)
  79. })
  80. }
  81. });
  82. $("html").click(function() {
  83. A()
  84. });
  85. $("#drop_menu1 a").click(function() {
  86. A()
  87. });
  88. return false
  89. })
  90. }
  91. $("#info-bar .lobbySort").click(function() {
  92. if ($(this).is(".active")) {
  93. $(".carrot", this).removeClass("up").addClass("down");
  94. $(this).removeClass("active")
  95. } else {
  96. $("#info-bar .lobbySort").removeClass("active");
  97. $("#info-bar .lobbySort .carrot").removeClass("up").addClass("down");
  98. $(".carrot", this).removeClass("down").addClass("up");
  99. $(this).addClass("active")
  100. }
  101. });
  102. $(".content-requirements input[type='radio']").change(function() {
  103. update_restrictions($(this).val())
  104. });
  105. $("#game-type").change(function() {
  106. $(".class-reservations").html($("#class-reservations-" + $(this).val()).html());
  107. $(".class-reservations .class-row .slot").click(function() {
  108. if ($(this).hasClass("reserved")) {
  109. $(this).removeClass("reserved");
  110. $(this).children(".reserve").removeClass("lock");
  111. $(this).children(".reserve").addClass("unlock");
  112. $(this).children("label").text("Reserve slot")
  113. } else {
  114. $(this).addClass("reserved");
  115. $(this).children(".reserve").removeClass("unlock");
  116. $(this).children(".reserve").addClass("lock");
  117. $(this).children("label").text("Reserved")
  118. }
  119. });
  120. selected_requirements = $(".content-requirements input[type='radio']:checked").val();
  121. if (selected_requirements == "some-classes-requirements") {
  122. update_restrictions(selected_requirements)
  123. }
  124. });
  125. $("#advancedSettingsLink").click(function() {
  126. if ($(".content-advanced").hasClass("hidden")) {
  127. $("#advancedSettingsLink .carrot").removeClass("right");
  128. $("#advancedSettingsLink .carrot").addClass("left");
  129. $("#_wicket_window_0").animate({
  130. width: [967, "swing"]
  131. }, 200, function() {
  132. $(".content-advanced").removeClass("hidden")
  133. })
  134. } else {
  135. $(".content-advanced").addClass("hidden");
  136. $("#_wicket_window_0").animate({
  137. width: [474, "swing"]
  138. }, 200);
  139. $("#advancedSettingsLink .carrot").removeClass("left");
  140. $("#advancedSettingsLink .carrot").addClass("right")
  141. }
  142. });
  143. $("#shareLinkBtn").click(function() {
  144. $("#linkInput").addClass("selected green");
  145. $("#linkText").removeClass("invisible");
  146. return false
  147. });
  148. $("#enterPasswordBtn").click(function() {
  149. $("#enterPasswordInput").addClass("selected red");
  150. $("#wrongPasswordText").removeClass("invisible");
  151. return false
  152. });
  153. if ($(".wicket-modal input:radio").length) {
  154. $(".wicket-modal input:radio").transformRadio({
  155. base: "image",
  156. checked: "../assets/images/box_checked_dark.png",
  157. unchecked: "../assets/images/box_unchecked_dark.png"
  158. });
  159. $(".wicket-modal input:radio").each(function() {
  160. var A = this;
  161. $("label[for='" + A.id + "']").click(function() {
  162. $("#" + A.id + " + img").click()
  163. })
  164. })
  165. }
  166. $(".playerScrollContainerLoading").addClass("hidden");
  167. $(".playerScrollContainer").removeClass("hidden");
  168. if ($(".scrollable").length) {
  169. $(".scrollable").jScrollPane()
  170. }
  171. initConnectionPanelHeader();
  172. $("textArea#chatInput").keypress(function(A) {
  173. if (A.keyCode == 13) {
  174. A.preventDefault(A)
  175. }
  176. });
  177. $("#FAQmenu h3").click(function() {
  178. $("#FAQmenu ul ul").slideUp();
  179. if (!$(this).next().is(":visible")) {
  180. $(this).next().slideDown()
  181. }
  182. });
  183. $("#info-bar .playersOnline.hideable").click(function() {
  184. if ($(this).is(".active")) {
  185. $(".carrot", this).removeClass("up").addClass("down");
  186. $(this).removeClass("active");
  187. $("#players-online").stop().slideUp(300);
  188. toggleChatSize()
  189. } else {
  190. $("#info-bar .infoPanel").removeClass("active");
  191. $("#info-bar .infoPanel .carrot").removeClass("up").addClass("down");
  192. $(".carrot", this).removeClass("down").addClass("up");
  193. $(this).addClass("active");
  194. $("#players-online").stop().slideDown(300);
  195. toggleChatSize()
  196. }
  197. });
  198. $("#achvFullBtn").click(function() {
  199. if ($(this).hasClass("off")) {
  200. $(this).removeClass("off").addClass("on");
  201. $("#achvCompBtn").removeClass("on").addClass("off");
  202. $(this).parent().removeClass("active");
  203. $(".achvItem").removeClass("ym-g1220-3").addClass("ym-g1220-6");
  204. $(".achvDesc, .achvGrades").show(200)
  205. } else {
  206. return
  207. }
  208. });
  209. $("#achvCompBtn").click(function() {
  210. if ($(this).hasClass("off")) {
  211. $(this).removeClass("off").addClass("on");
  212. $("#achvFullBtn").removeClass("on").addClass("off");
  213. $(this).parent().removeClass("active");
  214. $(".achvItem").removeClass("ym-g1220-6").addClass("ym-g1220-3");
  215. $(".achvDesc, .achvGrades").hide(200)
  216. } else {
  217. return
  218. }
  219. });
  220. $("#achvCompBtn, #achvFullBtn").hover(function() {
  221. if ($(this).hasClass("off")) {
  222. $(this).parent().addClass("active")
  223. }
  224. }, function() {
  225. if ($(this).hasClass("off")) {
  226. $(this).parent().removeClass("active")
  227. }
  228. });
  229. $(".userBansHeader").click(function() {
  230. $(".userBansList").slideToggle(400);
  231. $(".userBansHeader .arrow").toggleClass("down")
  232. });
  233. if (location.pathname.indexOf("/profile") == 0 && location.href.indexOf("#bans") > 0) {
  234. console.log("before click");
  235. $(".userBansHeader").trigger("click")
  236. }
  237. ranksChartAnimation();
  238. if (!advancedLobbiesReleased) {
  239. showALcountDown()
  240. }
  241. });
  242. function showALcountDown() {
  243. try {
  244. var E = countdown(new Date(), 1467482400680, countdown.HOURS | countdown.MINUTES | countdown.SECONDS, 0, 0).toString();
  245. if (Date.now() < 1467482400680) {
  246. var B = /(\d+).+?(\d+).+?(\d+)/g.exec(E);
  247. var A = leadZero(B[1]);
  248. var D = leadZero(B[2]);
  249. var C = leadZero(B[3]);
  250. $("#alCountdownTimer").text(A + ":" + D + ":" + C)
  251. }
  252. } catch (F) {}
  253. setTimeout(showALcountDown, 1000)
  254. }
  255. function leadZero(A) {
  256. return A < 10 ? "0" + A : A
  257. }
  258. function initGlobals() {
  259. myPermissions = $.parseJSON(permissions)
  260. }
  261. function hasPermission(A) {
  262. if (!myPermissions) {
  263. initGlobals()
  264. }
  265. return myPermissions.indexOf(A) > -1
  266. }
  267. function closeMenu() {
  268. $(".playerTopMenu .trigger").click()
  269. }
  270. function update_restrictions(A) {
  271. if (A == "some-classes-requirements") {
  272. $(".class-requirements").html($("#" + A + "-" + $("#game-type").val()).html())
  273. } else {
  274. $(".class-requirements").html($("#" + A).html())
  275. }
  276. }
  277. function checkAndAddDefaultPort() {
  278. var A = $("#hostAndPort").val();
  279. if (A != "" && A.indexOf(":") == -1) {
  280. $("#hostAndPort").val(A + ":27015")
  281. }
  282. }
  283. function setPreReadyTimer(C, A) {
  284. if ($(document).ready) {
  285. var D = "#pre-ready-timer";
  286. var B = "#pre-ready-button";
  287. $(D).buildCounter({
  288. now_timestamp: A - C,
  289. stardate_timestamp: 0,
  290. enddate_timestamp: A,
  291. color: "#213438",
  292. backgroundcolor: "#3f5a61",
  293. backgroundwidth: "4",
  294. frontwidth: "6",
  295. size: "36",
  296. countsize: "8",
  297. countcolor: "#5f94a2",
  298. callback: function() {
  299. $(D).trigger("click")
  300. },
  301. });
  302. $(B).hide();
  303. $(D).show()
  304. } else {
  305. return
  306. }
  307. }
  308. function isMySteamId(A) {
  309. return (typeof mySteamId != "undefined") && (mySteamId == A)
  310. }
  311. function initConnectionPanelHeader() {
  312. $("#connectionPanel .connectionHeader span").click(function() {
  313. $(this).toggleClass("active");
  314. if ($(this).is(".active")) {
  315. $("#connectionPanel .connectionHeader .icons.carrot.grey").removeClass("down").addClass("up");
  316. $("#connectionPanel .connectionDetails").stop().slideDown(200, "swing", function() {
  317. $(this).css("display", "table")
  318. })
  319. } else {
  320. $("#connectionPanel .connectionHeader .icons.carrot.grey").removeClass("up").addClass("down");
  321. $("#connectionPanel .connectionDetails").css("display", "block");
  322. $("#connectionPanel .connectionDetails").stop().slideUp(200, "swing")
  323. }
  324. })
  325. }
  326. function meetsHoursRestriction(A) {
  327. return typeof A === "undefined" || myTotalHoursPlayed >= A
  328. }
  329. function meetsMinimumLobbiesRestriction(A) {
  330. return typeof A === "undefined" || myLobbiesPlayed >= A
  331. }
  332. function meetsReliabilityRestriction(A) {
  333. return typeof A === "undefined" || myReliability >= A
  334. }
  335. function isHostUp(A) {
  336. result = false;
  337. jQuery.ajax({
  338. url: "http://" + A + "/about",
  339. async: false,
  340. success: function() {
  341. result = true
  342. }
  343. });
  344. return result
  345. }
  346. function ranksChartAnimation() {
  347. var C = $(".ranksChartCol").toArray(), A, B = 0;
  348. A = setInterval(function() {
  349. $(C[B]).slideDown(500, "easeOutBounce");
  350. ++B;
  351. if (C[B] === undefined) {
  352. clearInterval(A);
  353. return
  354. }
  355. }, 50)
  356. }
  357. function isSteamFriend(A) {
  358. if (friendsArray == undefined) {
  359. if (friendsJsonStr == undefined || friendsJsonStr == null) {
  360. return false
  361. }
  362. friendsArray = $.parseJSON(friendsJsonStr)
  363. }
  364. return friendsArray.indexOf(A) !== -1
  365. }
  366. function isMe(A) {
  367. return A == mySteamId
  368. }
  369. function initServerFieldsFromSettings() {
  370. if ($("#hostAndPort").val().length == 0) {
  371. $("#hostAndPort").val(settings.serverHost);
  372. $("#rcon").val(settings.serverRcon)
  373. }
  374. }
  375. function getSettings() {
  376. var A = loadFromCookie();
  377. if (A == null) {
  378. A = getDefaultSettings()
  379. }
  380. return A
  381. }
  382. function getDefaultSettings() {
  383. return {
  384. soundVolume: 75,
  385. enableDesktopNotifications: false,
  386. enableSoundNotifications: true,
  387. serverHost: null,
  388. serverRcon: null
  389. }
  390. }
  391. function loadFromCookie() {
  392. return Cookies.getJSON(SETTINGS_COOKIE_NAME)
  393. }
  394. function saveSettings(A) {
  395. Cookies.set(SETTINGS_COOKIE_NAME, A, {
  396. expires: 1000
  397. })
  398. }
  399. if (navigator.userAgent.indexOf("Googlebot") == -1) {
  400. if (!("WebSocket"in window) || navigator.userAgent.indexOf("MSIE") > -1 || navigator.userAgent.indexOf("Valve Steam GameOverlay") > -1) {
  401. window.location = "/unsupported"
  402. }
  403. }
  404. const VALID_AD_INS_COUNT = 3;
  405. $(document).ready(function() {
  406. if(Notification.permission !== "granted") {
  407. Notification.requestPermission();
  408. }
  409. var D = $(".join-steam-group").length;
  410. var E = $(".joinALs").length;
  411. if (D) {
  412. $(".join-steam-group").show();
  413. $(".join-steam-group").animate({
  414. height: "26px"
  415. }, 250, "swing")
  416. }
  417. if (E) {
  418. $(".joinALs").show();
  419. $(".joinALs").animate({
  420. height: "26px"
  421. }, 250, "swing")
  422. }
  423. if (D || E) {
  424. $(".youShallNotPassEnabled").animate({
  425. marginTop: "29px"
  426. }, 300, "swing")
  427. } else {
  428. $(".youShallNotPassEnabled").removeClass("youShallNotPassEnabled")
  429. }
  430. function C() {
  431. if (noAds || mySteamId == "" || myLobbiesPlayed < 50) {
  432. return false
  433. }
  434. var H = window.location.pathname;
  435. if (H.indexOf("/lobbies") == 0 || H.indexOf("/profile") == 0) {
  436. var G = $("._containerVer ins").length;
  437. var F = $("._containerVerRight ins").length;
  438. if (G < VALID_AD_INS_COUNT || F < VALID_AD_INS_COUNT || !A(H)) {
  439. return true
  440. }
  441. }
  442. return false
  443. }
  444. function A(F) {
  445. return $("#aswift_0_anchor > iframe")[0].isVisible(160, 600) && $("#aswift_1_anchor > iframe")[0].isVisible(160, 600) && (F != "/lobbies" || $("#aswift_2_anchor > iframe")[0].isVisible(718, 90))
  446. }
  447. });
  448. function isBlocked2(A) {
  449. return !A || A.closed || typeof A.closed == "undefined" || A.outerHeight === 0
  450. }
  451. function openWindow(B, A) {
  452. var C = window.open(B, A);
  453. setTimeout(function() {
  454. if (isBlocked2(C)) {
  455. alert("Your browser is blocking a new window! Please adjust popup settings for this domain.")
  456. }
  457. }, 1000)
  458. }
  459. function playReadySoundHeavy() {
  460. playSound(settings, "/assets/sounds/ready_heavy.wav", "Lobby is ready!")
  461. }
  462. function playSteamMsg() {
  463. playSound({
  464. enableSoundNotifications: true,
  465. soundVolume: 100,
  466. enableDesktopNotifications: settings.enableDesktopNotifications
  467. }, "/assets/sounds/steam_msg.mp3", "A moderator has pinged you!")
  468. }
  469. function playBanPing() {
  470. playSound({
  471. enableSoundNotifications: true,
  472. soundVolume: 100,
  473. enableDesktopNotifications: settings.enableDesktopNotifications
  474. }, "/assets/sounds/steam_msg.mp3", "You have banned or received a cooldown!")
  475. }
  476. function playLaunchSoundAnnouncer() {
  477. playSound(settings, "/assets/sounds/announcer_am_gamestarting.mp3", "Lobby has launched!")
  478. }
  479. function playIncomingSoundHeavy() {
  480. playSound(settings, "/assets/sounds/incoming_heavy.ogg", "Critical notification received!")
  481. }
  482. function playPrematureLobbyEnding() {
  483. playSound(settings, "/assets/sounds/heavy_premature_ending.wav", "Lobby closed or you were kicked!")
  484. }
  485. function playAchievementUnlocked() {
  486. new Audio("/assets/sounds/achievement-unlocked.mp3").play()
  487. }
  488. function playTeamsBalanced() {
  489. playSound(settings, "/assets/sounds/gong.mp3", "Lobby balanced!")
  490. }
  491. function p() {
  492. new Audio("/assets/sounds/v.wav").play()
  493. }
  494. function playSound(A, C, D) {
  495. if (A.enableSoundNotifications) {
  496. var B = new Audio(C);
  497. B.volume = A.soundVolume / 100;
  498. B.play()
  499. }
  500. showDesktopNotification(A, D)
  501. }
  502. function showDesktopNotification(A, B) {
  503. if (A.enableDesktopNotifications) {
  504. var C = new Notification("TF2Center",{
  505. body: B,
  506. icon: "/assets/images/tf2center_logo_archimedes.png"
  507. });
  508. C.onclick = function(D) {
  509. window.focus();
  510. C.close()
  511. }
  512. ;
  513. setTimeout(function() {
  514. C.close()
  515. }, 8000)
  516. }
  517. }
  518. function delayedReload(A) {
  519. setTimeout("location.href='" + A + "'", 2000)
  520. }
  521. function advancedLobbyClearAnimation() {
  522. var A = 0;
  523. players = shufflePlayers($(".blue-team div.playerSlot.lobbySlot, .red-team div.playerSlot.lobbySlot").toArray());
  524. $("#balanceLogo").addClass("balanceProgress");
  525. setInterval(function() {
  526. $(players[A]).children(".showOnHover").hide();
  527. $(players[A]).children(":not(.showOnHover)").fadeToggle(200, function() {
  528. if ($(this).is(":last-child")) {
  529. $(this).parent().css({
  530. "border-bottom": "1px solid #1b1b1b"
  531. }).animate({
  532. "background-color": "#2c2b2b"
  533. }, 200)
  534. }
  535. });
  536. ++A
  537. }, 100)
  538. }
  539. function advancedLobbyFillAnimation() {
  540. var A = $(".blue-team div.playerSlot.lobbySlot").toArray()
  541. , C = $(".red-team div.playerSlot.lobbySlot").toArray()
  542. , B = 0;
  543. $("#lobbyPanel").addClass("balanced");
  544. $("#balanceLogo").removeClass("balanceProgress").addClass("balanceDone");
  545. playTeamsBalanced();
  546. $(".blue-team .playerSlot.header.advanced").animate({
  547. "background-color": "#48707d",
  548. "border-bottom-color": "#2e4952"
  549. }, 200, function() {
  550. $(this).removeClass("advanced").addClass("blue")
  551. });
  552. $(".red-team .playerSlot.header.advanced").animate({
  553. "background-color": "#9e403d",
  554. "border-bottom-color": "#66302e"
  555. }, 200, function() {
  556. $(this).removeClass("advanced").addClass("red")
  557. });
  558. setInterval(function() {
  559. $(C[B]).removeClass("balanced-hidden").css({
  560. "border-bottom": "1px solid #2c2b2b"
  561. }).animate({
  562. "background-color": "#1b1b1b"
  563. }, 200);
  564. $(A[B]).removeClass("balanced-hidden").css({
  565. "border-bottom": "1px solid #2c2b2b"
  566. }).animate({
  567. "background-color": "#1b1b1b"
  568. }, 200);
  569. ++B
  570. }, 600)
  571. }
  572. function shufflePlayers(A) {
  573. for (var C = A.length - 1; C > 0; C--) {
  574. var B = Math.floor(Math.random() * (C + 1));
  575. var D = A[B];
  576. A[B] = A[C];
  577. A[C] = D
  578. }
  579. return A
  580. }
  581. $(document).ready(function() {
  582. setupChatScrollPane(true);
  583. setupChatHandling()
  584. });
  585. function addChatMsg(A, B) {
  586. if (!checkLobbyFilter(B)) {
  587. return
  588. }
  589. var C = $(".chatLinePanel.templateHolder li").clone();
  590. var F = "/profile/" + A.authorSteamId;
  591. var E = new Date(A.created).toTimeString().replace(/.*(\d{2}:\d{2}:\d{2}).*/, "$1");
  592. C.find(".date").text(E);
  593. C.find(".author").attr("href", F);
  594. if (A.admin) {
  595. C.find(".author .name").addClass("admin");
  596. C.find(".message").addClass("admin")
  597. }
  598. if (A.donator) {
  599. C.find(".author .name").addClass("donator")
  600. } else {
  601. C.find(".donateLink").hide()
  602. }
  603. if (A.freemium) {
  604. C.find(".author .name").addClass("freemium")
  605. } else {
  606. C.find(".freemiumLink").hide()
  607. }
  608. if (!A.advanced) {
  609. C.find(".icons.playerRank.blue").hide()
  610. }
  611. if (isMySteamId(A.authorSteamId)) {
  612. C.find(".author").addClass("me")
  613. }
  614. if (isSteamFriend(A.authorSteamId)) {
  615. C.find(".author").addClass("friend");
  616. C.find(".author .icons.person").addClass("friend")
  617. }
  618. C.find(".author .name").text(A.authorName);
  619. C.find(".message").html(A.message);
  620. var D = $(".chatScrollContainer").jScrollPane().data("jsp").getIsScrollableV() == false || $(".chatScrollContainer").jScrollPane().data("jsp").getPercentScrolledY() == 1;
  621. $("#chat .chatContainer").append(C);
  622. if ($("#chat .chatContainer > li").size() > 250) {
  623. $("#chat .chatContainer > li").slice(0, -250).remove()
  624. }
  625. setupChatScrollPane(D)
  626. }
  627. function checkLobbyFilter(A) {
  628. try {
  629. if (A != null && !lobbyMatchesFilter1(A)) {
  630. return false
  631. }
  632. } catch (B) {}
  633. return true
  634. }
  635. function setupChatScrollPane(B) {
  636. if (!$(".chatScrollContainer").length) {
  637. return
  638. }
  639. var A = $(".chatScrollContainer").jScrollPane().data("jsp");
  640. if (B == true || A != null && A.getPercentScrolledY() == 1) {
  641. A.scrollToPercentY(100)
  642. } else {
  643. $(".chatScrollContainer").jScrollPane({
  644. maintainPosition: true
  645. })
  646. }
  647. }
  648. function setupChatHandling() {
  649. var A = function() {
  650. var C = $("#chatInput").val();
  651. if (C.trim().length > 0) {
  652. var B = $.post("/rest/chat", {
  653. msg: C
  654. });
  655. B.always(function(D) {
  656. if (D.blocked) {
  657. D.message = "BLOCKED: " + D.message;
  658. addChatMsg(D, null)
  659. }
  660. });
  661. $("#chatInput").val("")
  662. }
  663. };
  664. $("#chatInput").keyup(function(B) {
  665. if (B.keyCode == 13) {
  666. A()
  667. }
  668. });
  669. $("#chatSayBtn").on("click", A)
  670. }
  671. function toggleChatSize() {
  672. var A = 535;
  673. if ($(".chatScrollContainer").height() == 535) {
  674. A = 250
  675. }
  676. $(".chatScrollContainer").animate({
  677. height: A
  678. }, {
  679. duration: 300,
  680. queue: false
  681. });
  682. $("#chat .scrollable").animate({
  683. height: A
  684. }, {
  685. duration: 300,
  686. queue: false
  687. });
  688. setTimeout(function() {
  689. $(".chatScrollContainer").jScrollPane().data("jsp").scrollToPercentY(100)
  690. }, 450);
  691. $(".chatPanel").animate({
  692. height: A + 150
  693. }, {
  694. duration: 300,
  695. queue: false
  696. })
  697. }
  698.  
  699. var displayedNotifications = [];
  700. function createLobbyOverviewItemElement(E) {
  701. var B = $(".lobby.templateHolder div.lobbyOverviewPanel").clone();
  702. var F = E.no;
  703. B.attr("id", "lobbyOverview-" + F);
  704. B.find("a.lobbyLink").attr("href", "/lobbies/" + F);
  705. B.find(".lobbyID").text("#" + F);
  706. B.find(".icons.flags").addClass(E.region.toLowerCase());
  707. B.find(".mapName").text(E.map);
  708. B.find(".mapThumb img").attr("src", E.thumbnailUrl);
  709. B.find(".gameType").text(E.gameType);
  710. B.find(".restrictionText").text(E.restrictionsText);
  711. B.find(".lobbyPlayerCount").text(E.playersInLobby);
  712. B.find(".lobbySize").text(E.playersForGame);
  713. B.addClass(E.advanced ? "advanced" : "manual");
  714. if (E.mumbleRequired == false) {
  715. B.find(".mumbleReq").remove()
  716. }
  717. if (E.useBalancer == false) {
  718. B.find(".balanced").remove()
  719. }
  720. if (E.inReadyUpMode == false) {
  721. B.find(".icons.lobbyReady").remove()
  722. }
  723. var A = userCanOverrideRestrictedSlots(E.leaderSteamId);
  724. for (var C = 0; C < E.slots.length; C++) {
  725. var D = createClassSlotElement(F, E.slots[C], A);
  726. B.find(".lobbyClassContainer").append(D)
  727. }
  728. if(displayedNotifications.indexOf(F) === -1) {
  729. var notification = new Notification(E.map,{
  730. tag: F,
  731. icon:E.thumbnailUrl,
  732. body:"Game Type: " + E.gameType + "\r\nPlayers: " + E.playersInLobby + " of " + E.playersForGame + "\r\nCountry: " + E.region
  733. });
  734. notification.onclick = function() {
  735. window.open("/lobbies/" + F, '_blank');
  736. };
  737. notification.onshow = function () { setTimeout(notification.close.bind(notification), 5000); };
  738. displayedNotifications.push(F);
  739. }
  740. return B
  741. }
  742. function userCanOverrideRestrictedSlots(A) {
  743. return (typeof canOverrideRestrictedSlots !== "undefined" && canOverrideRestrictedSlots == true) || isMySteamId(A)
  744. }
  745. function createClassSlotElement(F, C, B) {
  746. var E = $(".classSlot.templateHolder div").clone();
  747. var G = C.tf2Class;
  748. if (C.availableSlots.length > 0) {
  749. var D = C.availableSlots[0].team;
  750. var A = "/join/lobby/" + F + "/" + D + "/" + G;
  751. E.find(".link").attr("href", A);
  752. if (C.availableSlots.length == 1) {
  753. E.append('<span class="icons available ' + D + '"></span>')
  754. } else {
  755. E.append('<span class="icons available blue"></span>');
  756. E.append('<span class="icons available red"></span>')
  757. }
  758. if (allSlotsHaveRestrictions(C)) {
  759. E.addClass(B || meetsRestrictionsForAnySlot(C) ? "green" : "red")
  760. }
  761. }
  762. if (C.availableReservedSlots.length > 0) {
  763. if (C.availableReservedSlots.length == 1) {
  764. E.append('<span class="icons available reserved-' + C.availableReservedSlots[0].team + '"></span>')
  765. } else {
  766. E.append('<span class="icons available reserved-blue"></span>');
  767. E.append('<span class="icons available reserved-red"></span>')
  768. }
  769. }
  770. if (C.availableSlots.length + C.availableReservedSlots.length == 0) {
  771. E.find(".icons.classes").addClass("unavailable")
  772. }
  773. E.find(".icons.classes").addClass(getCssClassForTf2Class(G));
  774. return E
  775. }
  776. function getCssClassForTf2Class(A) {
  777. switch (A) {
  778. case "solly":
  779. return "soldier";
  780. case "demo":
  781. return "demoman";
  782. case "med":
  783. return "medic";
  784. case "engie":
  785. return "engineer";
  786. case "roamer":
  787. return "soldier classextra roamer";
  788. case "pocket":
  789. return "soldier classextra pocket";
  790. default:
  791. return A
  792. }
  793. }
  794. function allSlotsHaveRestrictions(B) {
  795. for (var A = 0; A < B.availableSlots.length; A++) {
  796. if ($.isEmptyObject(B.availableSlots[A].restrictions)) {
  797. return false
  798. }
  799. }
  800. return true
  801. }
  802. function meetsRestrictionsForAnySlot(C) {
  803. for (var A = 0; A < C.availableSlots.length; A++) {
  804. var B = C.availableSlots[A].restrictions;
  805. if ($.isEmptyObject(B)) {
  806. continue
  807. }
  808. if (!meetsRestrictions(B)) {
  809. continue
  810. }
  811. return true
  812. }
  813. return false
  814. }
  815. function meetsRestrictions(A) {
  816. if ($.isEmptyObject(A)) {
  817. return true
  818. }
  819. if (!(meetsHoursRestriction(A.hours))) {
  820. return false
  821. }
  822. if (!(meetsReliabilityRestriction(A.reliability))) {
  823. return false
  824. }
  825. if (!(meetsMinimumLobbiesRestriction(A.games))) {
  826. return false
  827. }
  828. return true
  829. }
  830. function replaceAllLobbies(B) {
  831. B = filterLobbies(B);
  832. $("#lobbyContainer").children().remove();
  833. for (var A = 0; A < B.length; A++) {
  834. $("#lobbyContainer").append(createLobbyOverviewItemElement(B[A]))
  835. }
  836. }
  837. function replaceSingleLobby(B) {
  838. if ($.cookie("filter") != undefined) {
  839. var A = JSON.parse($.cookie("filter"));
  840. if (A.filterEnabled == true && !lobbyMatchesFilter(B, A)) {
  841. return
  842. }
  843. }
  844. var C = B.no;
  845. $("#lobbyContainer").find("#lobbyOverview-" + C).replaceWith(createLobbyOverviewItemElement(B))
  846. }
  847. function filterLobbies(E) {
  848. E = filterRegionLocked(E);
  849. if ($.cookie("filter") == undefined) {
  850. return E
  851. }
  852. var C = JSON.parse($.cookie("filter"));
  853. var A = [];
  854. if (C.filterEnabled) {
  855. for (var B = 0; B < E.length; B++) {
  856. var D = E[B];
  857. if (lobbyMatchesFilter(D, C)) {
  858. A.push(D)
  859. }
  860. }
  861. } else {
  862. A = E
  863. }
  864. A = sortLobbiesByKey(A, C.sortField, C.sortAscending);
  865. return A
  866. }
  867. function filterRegionLocked(A) {
  868. return A.filter(function(B) {
  869. return !B.regionLock || B.region == myRegion || hasPermission("JOIN_REGION_LOCKED_SLOT")
  870. })
  871. }
  872. function lobbyMatchesFilter1(B) {
  873. if ($.cookie("filter") == undefined) {
  874. return true
  875. }
  876. var A = JSON.parse($.cookie("filter"));
  877. if (A.filterEnabled) {
  878. return lobbyMatchesFilter(B, A)
  879. }
  880. return true
  881. }
  882. function lobbyMatchesFilter(B, A) {
  883. if (A.mumbleRequired == true && !B.mumbleRequired == true) {
  884. return false
  885. }
  886. if (A.advancedOnly == true && !B.advanced == true) {
  887. return false
  888. }
  889. if (!arrayContainsGameType(A.gameTypes, B.gameType)) {
  890. return false
  891. }
  892. if (!arrayContainsRegion(A.locations, B.region)) {
  893. return false
  894. }
  895. if (!arrayContainsMapType(A.mapTypes, B.map)) {
  896. return false
  897. }
  898. return true
  899. }
  900. function arrayContainsGameType(C, A) {
  901. if (C.length == 0) {
  902. return true
  903. }
  904. switch (A) {
  905. case "Highlander":
  906. A = "HIGHLANDER";
  907. break;
  908. case "6v6":
  909. A = "_6VS6";
  910. break;
  911. case "4v4":
  912. A = "_4VS4";
  913. break;
  914. case "Ultiduo":
  915. A = "ULTIDUO";
  916. break;
  917. case "BBall":
  918. A = "BBALL";
  919. break;
  920. case "Test 1v1":
  921. A = "TEST2";
  922. break;
  923. case "NoobParty":
  924. A = "NOOBPARTY";
  925. break
  926. }
  927. for (var B = 0; B < C.length; B++) {
  928. if (A == C[B]) {
  929. return true
  930. }
  931. }
  932. return false
  933. }
  934. function arrayContainsRegion(C, D) {
  935. if (C.length == 0) {
  936. return true
  937. }
  938. var A;
  939. switch (D) {
  940. case "EU":
  941. A = "EUROPE";
  942. break;
  943. case "NA":
  944. A = "NORTH_AMERICA";
  945. break;
  946. case "SA":
  947. A = "SOUTH_AMERICA";
  948. break;
  949. case "RU":
  950. A = "RUSSIA";
  951. break;
  952. case "AS":
  953. A = "ASIA";
  954. break;
  955. case "AF":
  956. A = "AFRICA";
  957. break;
  958. case "AU":
  959. A = "OCEANIA";
  960. break
  961. }
  962. for (var B = 0; B < C.length; B++) {
  963. if (A == C[B]) {
  964. return true
  965. }
  966. }
  967. return false
  968. }
  969. function arrayContainsMapType(B, C) {
  970. if (B.length == 0) {
  971. return true
  972. }
  973. var E = C.split("_")[0];
  974. var D;
  975. switch (E) {
  976. case "cp":
  977. D = "CONTROL_POINT";
  978. break;
  979. case "pl":
  980. D = "PAYLOAD";
  981. break;
  982. case "koth":
  983. D = "KOTH";
  984. break;
  985. case "ctf":
  986. D = "CTF";
  987. break;
  988. case "sd":
  989. D = "SPECIAL_DELIVERY";
  990. break;
  991. case "mvm":
  992. D = "MVM";
  993. break
  994. }
  995. for (var A = 0; A < B.length; A++) {
  996. if (D == B[A]) {
  997. return true
  998. }
  999. }
  1000. return false
  1001. }
  1002. function sortLobbiesByKey(A, C, D) {
  1003. var E;
  1004. switch (C) {
  1005. case "map.name":
  1006. E = "map";
  1007. break;
  1008. case "restriction":
  1009. E = "restrictionsText";
  1010. break;
  1011. case "location":
  1012. E = "region";
  1013. break;
  1014. case "gameType":
  1015. E = "gameType";
  1016. break;
  1017. default:
  1018. E = "no"
  1019. }
  1020. var B = A.sort(function(H, G) {
  1021. if (H.advanced && !G.advanced) {
  1022. return -1
  1023. }
  1024. if (!H.advanced && G.advanced) {
  1025. return 1
  1026. }
  1027. var F = sort(H, G, E);
  1028. return D ? F : 1 - F
  1029. });
  1030. return B
  1031. }
  1032. function sort(C, B, D) {
  1033. var A = C[D];
  1034. var E = B[D];
  1035. if (A == E) {
  1036. return C.no < B.no ? -1 : 1
  1037. }
  1038. return ((A < E) ? -1 : 1)
  1039. }
  1040. $(document).ready(function() {
  1041. $(document).bind("tf2center.overview.refresh-substitutes", function(E, D) {
  1042. $("#substituteRequests").children().remove();
  1043. if (myLobbiesPlayed < 20) {
  1044. return
  1045. }
  1046. var C = 0;
  1047. for (var B = 0; B < D.data.length && C < maxSubsToDisplay; B++) {
  1048. var A = createSubstituteRequest(D.data[B]);
  1049. if (typeof A !== undefined) {
  1050. $("#substituteRequests").append(A);
  1051. C++
  1052. }
  1053. }
  1054. })
  1055. });
  1056. function createSubstituteRequest(B) {
  1057. if (!($.isEmptyObject(B.restrictions)) && !(userCanOverrideRestrictedSlots(B.leaderSteamId)) && !(meetsRestrictions(B.restrictions))) {
  1058. return
  1059. }
  1060. if (!substituteRequestMatchesFilter(B)) {
  1061. return
  1062. }
  1063. var D = $(".substituteRequest.templateHolder div.lobbySubPanel").clone();
  1064. var C = generateRequestId(B);
  1065. D.attr("id", C);
  1066. D.find("a.joinLink").attr("href", B.joinLink);
  1067. D.find("a.joinLink").attr("onClick", 'if (!confirm("' + getConfirmText(B) + '"))return false;');
  1068. D.find(".icons.flags").addClass(B.region.toLowerCase());
  1069. D.find(".lobbySubClass").addClass(B.team);
  1070. D.find(".subName .icons.classes").addClass(getCssClassForTf2Class(B.tf2Class));
  1071. D.find(".subName .displayName").text(B.className);
  1072. D.find(".mapName").text(B.map);
  1073. D.find(".gameType").text(B.gameType);
  1074. D.addClass(B.advanced ? "advanced" : "manual");
  1075. if (B.mumbleRequired == false) {
  1076. D.find(".mumbleReq").addClass("hidden")
  1077. }
  1078. if ($.isEmptyObject(B.restrictions)) {
  1079. D.find(".requirements").text("None")
  1080. } else {
  1081. var A = createStatsPanel(B.restrictions, B.leaderSteamId);
  1082. D.find(".requirements").html(A)
  1083. }
  1084. var notification = new Notification(B.map,{
  1085. tag: C,
  1086. icon:"", //TODO: Think of way to use icons since we aren't given information, maybe a switch statement ick
  1087. body:"Team: " + B.team.charAt(0).toUpperCase() + B.team.substring(1) + "\r\nClass: " + B.className + "\r\nGame Type: " + B.gameType + "\r\nCountry: " + B.region
  1088. });
  1089. notification.onclick = function() {
  1090. window.open(B.joinLink, '_blank');
  1091. };
  1092. notification.onshow = function () { setTimeout(notification.close.bind(notification), 5000); };
  1093. return D
  1094. }
  1095. function getConfirmText(A) {
  1096. return "Are you sure you wish to take this sub as " + A.region + " " + A.team.toUpperCase() + " " + A.tf2Class.toUpperCase() + "?"
  1097. }
  1098. function generateRequestId(A) {
  1099. return "subRequest-" + A.lobbyNo + "-" + A.slotIndex
  1100. }
  1101. function substituteRequestMatchesFilter(B, A) {
  1102. if (B.regionLock && B.region != myRegion) {
  1103. return false
  1104. }
  1105. if ($.cookie("filter") == undefined) {
  1106. return true
  1107. }
  1108. var A = JSON.parse($.cookie("filter"));
  1109. if (A.filterEnabled != true) {
  1110. return true
  1111. }
  1112. if (A.mumbleRequired == true && !B.mumbleRequired == true) {
  1113. return false
  1114. }
  1115. if (A.advancedOnly == true && !B.advanced == true) {
  1116. return false
  1117. }
  1118. if (!arrayContainsGameType(A.gameTypes, B.gameType)) {
  1119. return false
  1120. }
  1121. if (!arrayContainsRegion(A.locations, B.region)) {
  1122. return false
  1123. }
  1124. if (!arrayContainsMapType(A.mapTypes, B.map)) {
  1125. return false
  1126. }
  1127. return true
  1128. }
  1129. function testSubstituteRequestPanel() {
  1130. var A = {
  1131. lobbyNo: "1234",
  1132. leaderSteamId: "76561197985830365",
  1133. joinLink: "/join/lobby/1234/red/scout",
  1134. slotIndex: 5,
  1135. region: "EU",
  1136. mumbleRequired: false,
  1137. map: "koth_lakeside_final",
  1138. gameType: "Highlander",
  1139. team: "red",
  1140. tf2Class: "roamer",
  1141. className: "Soldier",
  1142. advanced: true,
  1143. restrictions: {
  1144. hours: 1500,
  1145. reliability: 85
  1146. }
  1147. };
  1148. console.log(A);
  1149. $("#substituteRequests").append(createSubstituteRequest(A));
  1150. A = {
  1151. lobbyNo: "1235",
  1152. leaderSteamId: "76561197985822365",
  1153. joinLink: "/join/lobby/1234/red/scout",
  1154. slotIndex: 5,
  1155. region: "EU",
  1156. mumbleRequired: false,
  1157. map: "koth_pro_viaduct_rc4",
  1158. gameType: "Highlander",
  1159. team: "red",
  1160. tf2Class: "demoman",
  1161. className: "Demoman",
  1162. advanced: false,
  1163. restrictions: {}
  1164. };
  1165. $("#substituteRequests").append(createSubstituteRequest(A));
  1166. A = {
  1167. lobbyNo: "1236",
  1168. leaderSteamId: "76561197985822365",
  1169. joinLink: "/join/lobby/1234/red/scout",
  1170. slotIndex: 5,
  1171. region: "NA",
  1172. regionLock: true,
  1173. mumbleRequired: false,
  1174. map: "pl_badwater",
  1175. gameType: "Highlander",
  1176. team: "blue",
  1177. tf2Class: "scout",
  1178. className: "Scout",
  1179. restrictions: {
  1180. hours: 750,
  1181. games: 150,
  1182. reliability: 85
  1183. }
  1184. };
  1185. $("#substituteRequests").append(createSubstituteRequest(A))
  1186. }
  1187. function createStatsPanel(E, D) {
  1188. var C = $(".restrictedSlotStats.templateHolder div.statsContainer").clone();
  1189. var G;
  1190. var A;
  1191. var B;
  1192. var F = canOverrideRestrictedSlots;
  1193. if (!F && typeof D !== "undefined") {
  1194. F = userCanOverrideRestrictedSlots(D)
  1195. }
  1196. if (F) {
  1197. G = "darkgrey";
  1198. A = "darkgrey";
  1199. B = "darkgrey"
  1200. } else {
  1201. if (meetsHoursRestriction(E.hours)) {
  1202. G = "green"
  1203. } else {
  1204. G = "red"
  1205. }
  1206. if (meetsMinimumLobbiesRestriction(E.games)) {
  1207. A = "green"
  1208. } else {
  1209. A = "red"
  1210. }
  1211. if (meetsReliabilityRestriction(E.reliability)) {
  1212. B = "green"
  1213. } else {
  1214. B = "red"
  1215. }
  1216. }
  1217. C.find(".hours.value").text(E.hours > 0 ? E.hours : 0);
  1218. C.find(".lobbies.value").text(E.games > 0 ? E.games : 0);
  1219. C.find(".reliability.value").text(E.reliability > 0 ? E.reliability : 0);
  1220. C.find(".hours").addClass(G);
  1221. C.find(".lobbies").addClass(A);
  1222. C.find(".reliability").addClass(B);
  1223. return C
  1224. }
  1225. var friendsOnline = new Array();
  1226. var diffSinceLastPlayersOnlineScrollGeneration = 0;
  1227. $(document).ready(function() {
  1228. setupPlayersOnlineScrollPane();
  1229. $(document).bind("tf2center.refresh-players-online", function(B, C) {
  1230. $(".playerScrollContainer .jspPane").children().remove();
  1231. for (var A = 0; A < C.data.length; A++) {
  1232. $(".playerScrollContainer .jspPane").append(createPlayerOnlineRow(C.data[A]))
  1233. }
  1234. playersOnlineCount = C.data.length;
  1235. sortPlayersOnline();
  1236. setupPlayersOnlineScrollPane();
  1237. setupFriendsOnlineCount(C.data)
  1238. });
  1239. $(document).bind("tf2center.player-login", function(C, B) {
  1240. for (var A = 0; A < B.data.length; A++) {
  1241. if (isSteamFriend(B.data[A].steamId)) {
  1242. incFriendsOnline(B.data[A].steamId)
  1243. }
  1244. addPlayerInLine(B.data[A]);
  1245. diffSinceLastPlayersOnlineScrollGeneration = diffSinceLastPlayersOnlineScrollGeneration + 1
  1246. }
  1247. if (Math.abs(diffSinceLastPlayersOnlineScrollGeneration) >= 5) {
  1248. setupPlayersOnlineScrollPane()
  1249. }
  1250. });
  1251. $(document).bind("tf2center.player-logout", function(B, C) {
  1252. for (var A = 0; A < C.data.length; A++) {
  1253. if (isSteamFriend(C.data[A])) {
  1254. decFriendsOnline(C.data[A])
  1255. }
  1256. removePlayerRow(C.data[A]);
  1257. diffSinceLastPlayersOnlineScrollGeneration = diffSinceLastPlayersOnlineScrollGeneration - 1
  1258. }
  1259. if (Math.abs(diffSinceLastPlayersOnlineScrollGeneration) >= 5) {
  1260. setupPlayersOnlineScrollPane()
  1261. }
  1262. });
  1263. $(".playerScrollContainer").removeClass("hidden")
  1264. });
  1265. function setupFriendsOnlineCount(C) {
  1266. for (var A = 0; A < C.length; A++) {
  1267. var B = C[A].steamId;
  1268. if (isSteamFriend(B)) {
  1269. incFriendsOnline(B)
  1270. }
  1271. }
  1272. showFriendsOnlineCounter()
  1273. }
  1274. function incFriendsOnline(A) {
  1275. if ($.inArray(A, friendsOnline) == -1) {
  1276. friendsOnline.push(A);
  1277. showFriendsOnlineCounter()
  1278. }
  1279. }
  1280. function decFriendsOnline(B) {
  1281. var A = friendsOnline.indexOf(B);
  1282. if (A > -1) {
  1283. friendsOnline.splice(A, 1);
  1284. showFriendsOnlineCounter()
  1285. }
  1286. }
  1287. function showFriendsOnlineCounter() {
  1288. $("#friendsOnline").text(friendsOnline.length)
  1289. }
  1290. function addPlayerInLine(D) {
  1291. if ($('.friend-row[steamid="' + D.steamId + '"]').length) {
  1292. return
  1293. }
  1294. var C = createPlayerOnlineRow(D);
  1295. var A = isSteamFriend(D.steamId);
  1296. var B = false;
  1297. $("#players-online .friend-row").each(function() {
  1298. var E = ($(this).attr("friend") == "true");
  1299. if (E && !A) {
  1300. return
  1301. }
  1302. if ((A && !E) || $(this).attr("steamname").localeCompare(D.playerName) === 1) {
  1303. C.insertBefore($(this));
  1304. B = true;
  1305. return false
  1306. }
  1307. });
  1308. if (!B) {
  1309. $(".playerScrollContainer .jspPane").append(C)
  1310. }
  1311. }
  1312. function createPlayerOnlineRow(B) {
  1313. var A = $(".singleSpectatorRow.templateHolder div.friend-row").clone();
  1314. if (isSteamFriend(B.steamId)) {
  1315. A.attr("friend", "true");
  1316. A.find(".friend-icon.icons.person").addClass("friend")
  1317. }
  1318. A.attr("steamname", B.playerName);
  1319. A.attr("steamId", B.steamId);
  1320. A.find(".name").text(B.playerName);
  1321. A.find("a.profileLink").attr("href", "/profile/" + B.steamId);
  1322. return A
  1323. }
  1324. function removePlayerRow(A) {
  1325. $('.friend-row[steamid="' + A + '"]').remove()
  1326. }
  1327. function setupPlayersOnlineScrollPane() {
  1328. if (!$(".playerScrollContainer.scrollable").length) {
  1329. return
  1330. }
  1331. var A = $(".playerScrollContainer.scrollable").jScrollPane().data("jsp");
  1332. if (A != null && A.getPercentScrolledY() == 1) {
  1333. A.scrollToPercentY(100)
  1334. } else {
  1335. $(".playerScrollContainer.scrollable").jScrollPane({
  1336. maintainPosition: true
  1337. })
  1338. }
  1339. diffSinceLastPlayersOnlineScrollGeneration = 0
  1340. }
  1341. function sortPlayersOnline() {
  1342. $(".playerScrollContainer .jspPane div.friend-row").sort(function(B, A) {
  1343. try {
  1344. var D = $(B).attr("friend") == "true";
  1345. var C = $(A).attr("friend") == "true";
  1346. if (D !== C) {
  1347. return (D && !C) ? -1 : 1
  1348. }
  1349. return $(B).attr("steamname").localeCompare($(A).attr("steamname"))
  1350. } catch (E) {
  1351. return 0
  1352. }
  1353. }).appendTo(".playerScrollContainer .jspPane")
  1354. }
  1355. var slider;
  1356. var notifications;
  1357. var currentNotification;
  1358. $(document).ready(function() {
  1359. notifications = $.parseJSON(notificationsJsonStr);
  1360. var D = 0;
  1361. var C = false;
  1362. var B = false;
  1363. var E = true;
  1364. for (var A = 0; A < notifications.length; A++) {
  1365. $("#notificationSlider").append(createDOMNotification(notifications[A]));
  1366. if (isLoggedIn()) {
  1367. if (notifications[A].created > notificationLastRead) {
  1368. C = true;
  1369. if (notifications[A].level == "CRITICAL" || notifications[A].level == "BAN") {
  1370. B = true;
  1371. D = A
  1372. }
  1373. if (!B) {
  1374. D = A
  1375. }
  1376. }
  1377. }
  1378. }
  1379. $(document).bind("tf2center.notification-added", function(F, H) {
  1380. notifications.unshift(H.data);
  1381. $("#notificationSlider").prepend(createDOMNotification(H.data));
  1382. var G = slider.getCurrentSlide();
  1383. slider.reloadSlider();
  1384. if (H.data.level == "CRITICAL") {
  1385. playIncomingSoundHeavy();
  1386. slider.goToSlide(getFirstUnreadIndex());
  1387. openNotifications()
  1388. } else {
  1389. if (H.data.level == "BAN") {
  1390. playBanPing();
  1391. slider.goToSlide(getFirstUnreadIndex());
  1392. openNotifications()
  1393. } else {
  1394. if ($(".notificationButton").is(".active")) {
  1395. calSetToday();
  1396. slider.goToSlide(G + 1);
  1397. $("#notificationSlider, .bx-wrapper").hide().show();
  1398. $("#notificationSlider .notificationBox").first().hide().prop("z-index", 0)
  1399. } else {
  1400. if (getUnreadCount() == 1) {
  1401. slider.goToSlide(0)
  1402. }
  1403. }
  1404. updateUnreadCounter(true)
  1405. }
  1406. }
  1407. });
  1408. if ($(".notificationButton.enabled").length) {
  1409. setInterval(function() {
  1410. if (!$(".notificationButton").is(".active")) {
  1411. if (getUnreadCount() > 0) {
  1412. $(".notificationButton .red").fadeTo(500, 0.1).fadeTo(900, 1)
  1413. }
  1414. }
  1415. }, 500 + 900)
  1416. }
  1417. if ($("#notificationSlider").length) {
  1418. slider = $("#notificationSlider").bxSlider({
  1419. startSlide: D,
  1420. slideWidth: 718,
  1421. minSlides: 1,
  1422. maxSlides: 1,
  1423. slideMargin: 14,
  1424. mode: "fade",
  1425. speed: 300,
  1426. pager: false,
  1427. infiniteLoop: true,
  1428. hideControlOnEnd: false,
  1429. onSliderLoad: function(F) {
  1430. if (E) {
  1431. E = false;
  1432. if (B && isLoggedIn()) {
  1433. openNotifications()
  1434. }
  1435. }
  1436. },
  1437. onSlideNext: function(F) {
  1438. showNotification(getNotificationById(+(F.find(".id").text())))
  1439. },
  1440. onSlidePrev: function(F) {
  1441. showNotification(getNotificationById(+(F.find(".id").text())))
  1442. }
  1443. });
  1444. $(".notificationCalendar").pickmeup({
  1445. flat: true,
  1446. format: "Y-m-d",
  1447. render: function(G) {
  1448. var F = getCssClassForDate(G);
  1449. if (F != null) {
  1450. return {
  1451. class_name: F
  1452. }
  1453. }
  1454. return {
  1455. disabled: true
  1456. }
  1457. },
  1458. change: function(F) {
  1459. var G = getNotificationIndexByDate(new Date(F));
  1460. slider.goToSlide(G);
  1461. showNotification(notifications[G])
  1462. }
  1463. });
  1464. $(".notificationToday a").click(function() {
  1465. calSetToday()
  1466. });
  1467. $(".notificationButton.enabled").click(function() {
  1468. toggleNotifications()
  1469. });
  1470. $(".notificationClose").click(function() {
  1471. closeNotifications()
  1472. });
  1473. if (isLoggedIn()) {
  1474. if (C) {
  1475. updateUnreadCounter(true);
  1476. if (B) {
  1477. playIncomingSoundHeavy();
  1478. openNotifications()
  1479. }
  1480. } else {
  1481. clearUnreadCounter()
  1482. }
  1483. }
  1484. } else {
  1485. updateUnreadCounter(true)
  1486. }
  1487. if (!isLoggedIn()) {
  1488. notificationLastRead = new Date().getTime();
  1489. clearUnreadCounter()
  1490. }
  1491. });
  1492. function preview(D, C, B) {
  1493. playIncomingSoundHeavy = function() {}
  1494. ;
  1495. var A = {
  1496. id: 1,
  1497. created: new Date().getTime(),
  1498. dateDay: "12",
  1499. dateMonth: "DEC",
  1500. level: D,
  1501. title: $("<div/>").text(C).html(),
  1502. message: $("<div/>").text(B).html(),
  1503. author: "TF2Center"
  1504. };
  1505. $(document).trigger("tf2center.notification-added", {
  1506. data: A
  1507. });
  1508. showNotification(A);
  1509. openNotifications()
  1510. }
  1511. function isLoggedIn() {
  1512. return mySteamId != ""
  1513. }
  1514. function showNotification(A) {
  1515. currentNotification = A;
  1516. updateNotificationLastRead(A);
  1517. applyHeader(A.level == "REGULAR");
  1518. calSetDate(A.created)
  1519. }
  1520. function createDOMNotification(B) {
  1521. var A = $("#notificationTemplate").clone();
  1522. A.find(".id").text(B.id);
  1523. A.find(".date").text(B.dateDay);
  1524. A.find(".month").text(B.dateMonth);
  1525. A.find("h1").html($("<span />").html(B.title).text());
  1526. A.find(".notificationText").html($("<span />").html(B.message).text());
  1527. A.addClass(B.level == "CRITICAL" || B.level == "BAN" ? "critical" : "regular");
  1528. A.removeAttr("style");
  1529. A.removeAttr("id");
  1530. return A
  1531. }
  1532. function applyHeader(C) {
  1533. var A = C ? "regular" : "critical";
  1534. var B = C ? "critical" : "regular";
  1535. $("#mainHeader").removeClass(B).addClass(A);
  1536. $("#mainHeader .backgroundMain").removeClass(B).addClass(A)
  1537. }
  1538. function showUnreadCounter(A) {
  1539. $(".notificationButton .icons").removeClass("grey").addClass("red").text(A)
  1540. }
  1541. function clearUnreadCounter() {
  1542. $(".notificationButton .icons").removeClass("red").addClass("grey").text("")
  1543. }
  1544. function calSetToday() {
  1545. calSetDate(new Date())
  1546. }
  1547. function calSetDate(A) {
  1548. $(".notificationCalendar").pickmeup("set_date", A)
  1549. }
  1550. function toggleNotifications() {
  1551. if ($(".notificationButton").toggleClass("active").is(".active")) {
  1552. openNotifications()
  1553. } else {
  1554. closeNotifications()
  1555. }
  1556. }
  1557. function openNotifications() {
  1558. var A = getCurrentNotification();
  1559. if (A != null) {
  1560. $(".notificationButton").addClass("active");
  1561. $("#mainHeader .backgroundLeft").css("visibility", "hidden");
  1562. $(".lobbyVoteCreate, .mostVotedMaps, .speechBubbleText, .lobbyHeader, .userProfile, .editProfile, .userProfileAdminButtons").hide();
  1563. $(".notificationClose, #notificationSlider, .bx-wrapper, .notificationCalendar, .notificationToday").show();
  1564. showNotification(getCurrentNotification())
  1565. }
  1566. }
  1567. function getCurrentNotification() {
  1568. var A = slider ? slider.getCurrentSlide() : 0;
  1569. var B = $($("#notificationSlider .notificationBox").get(A));
  1570. return getNotificationById(+(B.find(".id").text()))
  1571. }
  1572. function closeNotifications() {
  1573. $(".notificationButton").removeClass("active");
  1574. $("#mainHeader").removeClass("critical regular");
  1575. $("#mainHeader .backgroundMain").removeClass("critical regular");
  1576. $("#mainHeader .backgroundLeft").css("visibility", "visible");
  1577. $(".bx-wrapper, .notificationClose, .notificationCalendar, .notificationToday").hide();
  1578. $(".lobbyVoteCreate, .mostVotedMaps, .speechBubbleText, .lobbyHeader, .userProfile, .editProfile, .userProfileAdminButtons").show()
  1579. }
  1580. function updateNotificationLastRead(A) {
  1581. if (A != null) {
  1582. if (A.created > notificationLastRead) {
  1583. notificationLastRead = A.created;
  1584. $.get("/notifications/lastread/" + notificationLastRead)
  1585. }
  1586. updateUnreadCounter()
  1587. }
  1588. }
  1589. function updateUnreadCounter(A) {
  1590. var B = getUnreadCount();
  1591. if (B > 0) {
  1592. if (A) {
  1593. showUnreadCounter(B)
  1594. } else {
  1595. $("#notificationUnreadCounter").text(B)
  1596. }
  1597. } else {
  1598. clearUnreadCounter()
  1599. }
  1600. }
  1601. function getFirstUnreadIndex() {
  1602. for (var A = 0; A < notifications.length; A++) {
  1603. if (notifications[A].created > notificationLastRead) {
  1604. return A
  1605. }
  1606. }
  1607. return 0
  1608. }
  1609. function getUnreadCount() {
  1610. var B = 0;
  1611. for (var A = 0; A < notifications.length; A++) {
  1612. if (notifications[A].created > notificationLastRead) {
  1613. B++
  1614. }
  1615. }
  1616. return B
  1617. }
  1618. function getNotificationById(B) {
  1619. for (var A = 0; A < notifications.length; A++) {
  1620. if (notifications[A].id == B) {
  1621. return notifications[A]
  1622. }
  1623. }
  1624. return null
  1625. }
  1626. function getCssClassForDate(A) {
  1627. var B = getNotificationByDate(A);
  1628. var C = B != null && currentNotification && datesEqual(new Date(currentNotification.created), A) ? " active" : "";
  1629. return B != null ? B.level == "CRITICAL" || B.level == "BAN" ? "critical" + C : "regular" + C : null
  1630. }
  1631. function getNotificationByDate(A) {
  1632. for (var B = 0; B < notifications.length; B++) {
  1633. if (datesEqual(new Date(notifications[B].created), A)) {
  1634. return notifications[B]
  1635. }
  1636. }
  1637. return null
  1638. }
  1639. function getNotificationIndexByDate(A) {
  1640. for (var B = 0; B < notifications.length; B++) {
  1641. if (datesEqual(new Date(notifications[B].created), A)) {
  1642. return B
  1643. }
  1644. }
  1645. return 0
  1646. }
  1647. function datesEqual(B, A) {
  1648. B.setHours(0, 0, 0, 0);
  1649. A.setHours(0, 0, 0, 0);
  1650. return B.getTime() == A.getTime()
  1651. }
  1652. var ws;
  1653. var wsOpened = false;
  1654. var WS_CHECK_TIMEOUT_SEC = 7;
  1655. var WS_CHECK_JUST_STARTED_TIMEOUT_SEC = 30;
  1656. $(document).ready(function() {
  1657. openWebSocket();
  1658. scheduleCheck()
  1659. });
  1660. function openWebSocket() {
  1661. console.info("openWebSocket()");
  1662. try {
  1663. ws = new WebSocket(getWebsocketPath());
  1664. ws.onopen = function(event) {
  1665. console.debug("websocket successfully established")
  1666. }
  1667. ;
  1668. ws.onclose = function(event) {
  1669. console.warn("websocket disconnected; reconnecting...");
  1670. setTimeout(function() {
  1671. window.location.reload()
  1672. }, 40000 + Math.floor(Math.random() * 30000))
  1673. }
  1674. ;
  1675. ws.onmessage = function(event) {
  1676. wsOpened = true;
  1677. console.debug(event.data);
  1678. try {
  1679. if (event.data.indexOf('<?xml version="1.0" encoding="UTF-8"?>') === 0) {
  1680. Wicket.Ajax.process(event.data)
  1681. } else {
  1682. eval(event.data)
  1683. }
  1684. } catch (e) {
  1685. console.error("failed to process websocket data: " + event.data + " | " + e)
  1686. }
  1687. }
  1688. ;
  1689. ws.onerror = function(event) {
  1690. console.error("ws.onerror(): " + event)
  1691. }
  1692. } catch (e) {
  1693. console.error(e)
  1694. }
  1695. }
  1696. function scheduleCheck() {
  1697. setTimeout(function() {
  1698. var A = window.location;
  1699. if (!wsOpened && A.pathname.indexOf("/lobbies") == 0) {
  1700. if (A.host == "tf2center.com" && A.protocol === "http:") {
  1701. window.location = "https://" + A.host + A.pathname
  1702. } else {
  1703. console.warn("failed to open websocket; reloading page...");
  1704. window.location.reload()
  1705. }
  1706. }
  1707. }, (hasJustStarted ? WS_CHECK_JUST_STARTED_TIMEOUT_SEC : WS_CHECK_TIMEOUT_SEC) * 1000)
  1708. }
  1709. function getWebsocketPath() {
  1710. var B = window.location, A;
  1711. if (B.protocol === "https:") {
  1712. A = "wss:"
  1713. } else {
  1714. A = "ws:"
  1715. }
  1716. A += "//" + ((B.host === "tf2center.com" || B.host === "www.tf2center.com") ? "ws.tf2center.com" : B.host);
  1717. A += "/ws" + B.pathname;
  1718. return A
  1719. }
  1720. Element.prototype.isVisible = function(E, C) {
  1721. function B(J, L, G, I) {
  1722. var K = J.parentNode;
  1723. if (!D(J)) {
  1724. return false
  1725. }
  1726. if (K.nodeType == 9 || J.tagName == "BODY") {
  1727. return true
  1728. }
  1729. var H = $(J);
  1730. var F = (J === I);
  1731. if (A(J, "opacity") < 1 || A(J, "display") == "none" || A(J, "visibility") == "hidden" || H.width() < L || H.height() < G || (F && (A(J, "left") != "0px" || A(J, "top") != "0px" || A(J, "margin-left") != "0px" || A(J, "padding-left") != "0px"))) {
  1732. return false
  1733. }
  1734. if (K) {
  1735. return B(K, L, G, J)
  1736. }
  1737. return true
  1738. }
  1739. function A(F, G) {
  1740. if (window.getComputedStyle) {
  1741. return document.defaultView.getComputedStyle(F, null)[G]
  1742. }
  1743. if (F.currentStyle) {
  1744. return F.currentStyle[G]
  1745. }
  1746. }
  1747. function D(F) {
  1748. while (F = F.parentNode) {
  1749. if (F == document) {
  1750. return true
  1751. }
  1752. }
  1753. return false
  1754. }
  1755. return B(this, E, C, this)
  1756. }
  1757. ;
Add Comment
Please, Sign In to add comment