CS:GO Lounge Destroyer

Spam the fuck out of the CS:GL queue system, because it's absolute crap

  1. // ==UserScript==
  2. // @name CS:GO Lounge Destroyer
  3. // @namespace http://csgolounge.com/
  4. // @version 0.6.2
  5. // @description Spam the fuck out of the CS:GL queue system, because it's absolute crap
  6. // @match http://csgolounge.com/*
  7. // @match http://dota2lounge.com/*
  8. // @require http://code.jquery.com/jquery-2.1.1.js
  9. // @grant GM_getValue
  10. // @grant GM_setValue
  11. // @grant GM_deleteValue
  12. // @grant GM_xmlhttpRequest
  13. // @grant GM_addStyle
  14. // @copyright iamncla @ GitHub.com
  15. // ==/UserScript==
  16.  
  17. /* HELPER FUCNTIONS */
  18. /* Get URL parameter */
  19. function gup(a){a=a.replace(/[\[]/,"\\[").replace(/[\]]/,"\\]");var b="[\\?&]"+a+"=([^&#]*)",c=new RegExp(b),d=c.exec(window.location.href);return null==d?null:d[1]}
  20. /* Get day/month/year */
  21. function getDMY(){var a=new Date;return a.getFullYear()+"/"+(a.getMonth()+1)+"/"+a.getDate()}
  22. /* DOM observe */
  23. var observeDOM=function(){var e=window.MutationObserver||window.WebKitMutationObserver,t=window.addEventListener;return function(n,r){if(e){var i=new e(function(e,t){if(e[0].addedNodes.length||e[0].removedNodes.length)r()});i.observe(n,{childList:true,subtree:true})}else if(t){n.addEventListener("DOMNodeInserted",r,false);n.addEventListener("DOMNodeRemoved",r,false)}}}()
  24. /* Custom logging function */
  25. var Loge = function(message) {
  26. console.log(new Date() + " ---- " + message);
  27. }
  28.  
  29. /* LoungeDestroyer class */
  30. /* Chaos is order yet undeciphered. */
  31.  
  32. var Bet3000 = function() {
  33. /* Construct */
  34. var self = this;
  35.  
  36. var version = "0.6.2";
  37. var versionReleaseDate = "2014.08.01";
  38.  
  39. Loge("LoungeDestroyer v" + version + " (released on " + versionReleaseDate + ")");
  40.  
  41. this.betAttempts = 0;
  42. this.inventoryAttempts = 0;
  43. this.returnAttempts = 0;
  44.  
  45. /* User settings */
  46. this.defaultSettings =
  47. {
  48. marketCurrency: "1",
  49. itemMarketPrices: "1",
  50. redirect: "1",
  51. streamRemove: "1"
  52. };
  53. var userSettings = GM_getValue("userSettings");
  54. if(typeof(userSettings) == "undefined") {
  55. GM_setValue("userSettings", JSON.stringify(self.defaultSettings));
  56. }
  57. this.userSettings = JSON.parse(GM_getValue("userSettings"));
  58.  
  59. this.saveSetting = function(settingName, settingValue) {
  60. self.userSettings[settingName] = settingValue;
  61. GM_setValue("userSettings", JSON.stringify(self.userSettings));
  62. Loge("Saving user setting [" + settingName +"] to " +settingValue);
  63. }
  64.  
  65. /* Merging usersettings with default settings if a new update introduced a new setting */
  66. $.each(this.defaultSettings, function(index, value) {
  67. if (typeof self.userSettings[index] == 'undefined') {
  68. self.saveSetting(index, value);
  69. }
  70. });
  71.  
  72. // for handling maintainance errors http://csgolounge.com/break and wait.html page
  73. if(this.userSettings["redirect"] == "1") {
  74. if(document.URL.indexOf("/wait.html") != -1 || document.URL.indexOf("/break") != -1 || document.title == "The page is temporarily unavailable") {
  75. window.location = GM_getValue("intendedVisitURL", location.host);
  76. }
  77. }
  78.  
  79. this.appID = "730";
  80. if(window.location.hostname == "dota2lounge.com") {
  81. this.appID = "570"
  82. }
  83.  
  84. $("a").click(function(e) {
  85. if (e.which === 1) {
  86. e.preventDefault();
  87. // http://stackoverflow.com/questions/1318076/jquery-hasattr-checking-to-see-if-there-is-an-attribute-on-an-element
  88. if($(this).is("[href]")) {
  89. var url = $(this).attr("href");
  90. GM_setValue("intendedVisitURL", url);
  91. window.location = url;
  92. }
  93. }
  94. });
  95.  
  96. GM_addStyle(".marketPriced .rarity { background: rgba(255, 255, 255, 0.7) !important; text-shadow: 0px 0px 1px rgba(255, 255, 255, 1); }" +
  97. "#ld_settings { width: 50px; height: 37px; top: 8px; right: 230px; position: absolute; cursor: pointer; }" +
  98. "@media screen and (max-width: 1391px) { #ld_settings { top: -3px; right: 198px; } }" +
  99. "@media screen and (max-width: 1000px) { #ld_settings { top: 28px; right: 10px; } }" +
  100. "div#ld_settings { background-image: url(data:image/png;base64,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); }" +
  101. "#ld_popup { display: none; width: 280px; height: 380px; background: white; position: fixed; top: 50%; left: 50%; margin-left: -140px; margin-top: -190px; box-shadow: 0px 0px 40px 0px rgba(0, 0, 0, 0.5); z-index: 9001; }" +
  102. "#ld_popup .popup-title { width: 100%; height: 25px; background: #f2f2f2; border-bottom: 3px solid #ade8f9; padding-top: 10px; }" +
  103. "#ld_popup .popup-title span { margin: 0 auto; font-weight: bold; font-size: 14px; color: #686868; padding-left: 15px; }" +
  104. "#ld_popup .popup-title #close-btn { display: block; cursor: pointer; font-weight: bold; position: absolute; top: 13px; right: 13px; font-size: 10px; }" +
  105. "#ld_popup .ld-settings { padding: 10px 0px 10px 15px; font-size: 12px; font-weight: bold; }" +
  106. "#ld_popup .ld-settings select { width: 205px; height: 21px; margin-bottom: 5px;}" +
  107. "#overlay-dummy { display: none; background-color: rgba(0, 0, 0, 0.3); position: fixed; width: 100%; height: 100%; z-index: 9000; }" +
  108. "#ld_popup .footerino { width: 100%; position: absolute; bottom: 0; height: 35px; background: #f8f8f8; border-top: 1px solid #e4e4e4; color: #c2c2c2; font-size: 12px; text-align: center; padding-top: 5px; }" +
  109. "#ld_popup .footerino a { color: #a0a0a0; }" +
  110. "#ld_popup .footerino a:hover { text-decoration: underline; }");
  111.  
  112. this.placeBet = function() {
  113. // to do: add exceptions for "you have too many items in your returns"
  114. // You have too many items in returns, you have to reclaim it to be able to queue.
  115. // Due to extensive load, queue is disabled for about 5 minutes.
  116. if(!this.checkBetRequirements()) return false;
  117. if(isPlacingBet) return false;
  118. var isPlacingBet = true;
  119. // returns variable is created by CS:GL page, true if you are using return items.
  120. var url = unsafeWindow.returns == true ? "ajax/postBet.php" : "ajax/postBetOffer.php";
  121.  
  122. $.ajax({
  123. type: "POST",
  124. url: url,
  125. data: $("#betpoll").serialize() + "&match=" + self.matchID,
  126. success: function(data) {
  127. if (data) {
  128. self.betAttempts = self.betAttempts + 1;
  129. Loge("Try Nr." + self.betAttempts + ", server denied our bet: " + data);
  130. self.placeBet();
  131. } else {
  132. alert("It seems we successfully placed a bet! It took " + self.betAttempts + " tries to place the bet.");
  133. window.location.href = "mybets";
  134. }
  135. }
  136. });
  137. }
  138. this.checkBetRequirements = function() {
  139. if(!$(".betpoll .item").length > 0) {
  140. alert("No items added!");
  141. return false;
  142. }
  143. if(!$("#on").val().length > 0) {
  144. alert("No team selected!");
  145. return false;
  146. }
  147. return true;
  148. }
  149. this.getInventoryItems = function() {
  150. if(document.URL.indexOf("/trade?t=") != -1) {
  151. $("#loading").show();
  152. $("#offer .left").show();
  153. $.ajax({
  154. url: "ajax/backpack.php",
  155. success: function(data) {
  156. if($(data).text().indexOf("Can't get items.") == -1) {
  157. document.getElementById("offer").innerHTML += data; // .append() no like ;(
  158. $("#backpack").hide().slideDown();
  159. $("#loading").hide();
  160. $("#offer .standard").remove();
  161. self.loadMarketPricesBackpack();
  162. }
  163. else {
  164. self.inventoryAttempts = self.inventoryAttempts + 1;
  165. Loge("Attempting to get your Steam inventory, try Nr." + self.inventoryAttempts);
  166. self.getInventoryItems();
  167. }
  168. }
  169. });
  170. }
  171. if(document.URL.indexOf("/match?m=") != -1) {
  172. var steamAPI = ((Math.floor(Math.random() * (1 - 0 + 1)) + 0) == 0 ? "betBackpackApi" : "betBackpack");
  173. self.inventoryAttempts = self.inventoryAttempts + 1;
  174. Loge("Attempting to get your Steam inventory, try Nr." + self.inventoryAttempts);
  175. $.ajax({
  176. url: 'ajax/'+steamAPI+'.php',
  177. type: 'POST',
  178. data: "id=76561198043770492",
  179. success: function(data) {
  180. if($(data).text().indexOf("Can't get items.") == -1) {
  181. $("#showinventorypls").hide();
  182. $(".left").html("");
  183. $("#backpack").html(data).show();
  184. Loge("Inventory loaded");
  185. self.loadMarketPricesBackpack();
  186. }
  187. else {
  188. self.getInventoryItems();
  189. }
  190. }
  191. });
  192. }
  193. }
  194. this.requestReturns = function() {
  195. // Try Nr.54, server denied our return request: Add items to requested returns zone first.
  196. // if FALSE, then the items need to be frozen
  197. // if TRUE, then the items need to be requested for the actual trade
  198. var ajaxProperties = { url: (unsafeWindow.toreturn ? "ajax/postToReturn.php" : "ajax/postToFreeze.php") };
  199. if(unsafeWindow.toreturn) {
  200. ajaxProperties.success = function(data) {
  201. // If there was a problem with requesting to return
  202. if (data) {
  203. self.returnAttempts = self.returnAttempts + 1;
  204. Loge("Try Nr." + self.returnAttempts + ", server denied our return request: " + data);
  205. self.requestReturns();
  206. }
  207. else {
  208. alert("It seems we successfully requested returns! It took " + self.returnAttempts + " tries to request returns.");
  209. window.location.href = "mybets";
  210. localStorage.playedreturn = false;
  211. }
  212. }
  213. }
  214. else {
  215. ajaxProperties.type = "POST";
  216. ajaxProperties.data = $("#freeze").serialize();
  217. ajaxProperties.success = function(data) {
  218. if (data) {
  219. Loge("Try Nr." + self.returnAttempts + ", items need to be frozen, attempting to freeze them!");
  220. self.requestReturns();
  221. }
  222. else {
  223. toreturn = true;
  224. self.requestReturns();
  225. }
  226. }
  227. }
  228. $.ajax(ajaxProperties);
  229. }
  230. this.getMarketPrice = function(item) {
  231. if(Bet.userSettings["itemMarketPrices"] == "1") {
  232. var name = $(".smallimg", item).attr("alt");
  233. if(!$(item).hasClass("marketPriced") && nonMarketItems.indexOf(name) == -1 && nonMarketItems.indexOf($(".rarity", item).text()) == -1 && !$(item).hasClass("loadingPrice")) {
  234. $(item).addClass("loadingPrice");
  235. GM_xmlhttpRequest({
  236. method: "GET",
  237. url: "http://steamcommunity.com/market/priceoverview/?country=US&currency=" + self.userSettings["marketCurrency"] + "&appid=" + self.appID + "&market_hash_name=" + encodeURI(name),
  238. onload: function(response) {
  239. if(response.status == 200) {
  240. var responseParsed = JSON.parse(response.responseText);
  241. if(responseParsed.success == true && responseParsed.hasOwnProperty("lowest_price")) {
  242. var lowestPrice = responseParsed["lowest_price"].replace("$", "$ ");
  243. $(item).find('.rarity').html(lowestPrice);
  244. $(item).addClass('marketPriced');
  245. $(".item").each(function() {
  246. if ($(this).find('img.smallimg').attr("alt") == name && !$(this).hasClass('marketPriced')) {
  247. $(this).find('.rarity').html(lowestPrice);
  248. $(this).addClass('marketPriced');
  249. }
  250. });
  251. }
  252. else {
  253. $(item).find('.rarity').html('Not Found');
  254. }
  255. }
  256. $(item).removeClass("loadingPrice");
  257. }
  258. });
  259. }
  260. }
  261. }
  262. this.bumpTrade = function(tradeID) {
  263. $.ajax({
  264. type: "POST",
  265. url: "ajax/bumpTrade.php",
  266. data: "trade=" + tradeID,
  267. async: false,
  268. success: function(data) {
  269. Loge("Bumped trade offer #" + tradeID);
  270. }
  271. });
  272. }
  273. this.startAutobump = function() {
  274. if($(".tradeheader").text().indexOf("minute") == -1 && $(".tradeheader").text().indexOf("second") == -1) {
  275. // force bump
  276. var delayMinutes = 0;
  277. }
  278.  
  279. if($(".tradeheader").text().indexOf("second") != -1 || $(".tradeheader").text().indexOf("just now") != -1) {
  280. var delayMinutes = 30;
  281. }
  282. if($(".tradeheader").text().indexOf("minute") != -1) {
  283. var numberino = $(".tradeheader").text().replace(" minutes ago", "").replace(" minute ago", "");
  284. var delayMinutes = (numberino >= 30) ? 0.5 : (30 - numberino);
  285. }
  286.  
  287. Loge("Auto-bumping in " + delayMinutes + " minutes");
  288. // start the vicious cycle
  289. var autoBump = setTimeout(function() {
  290. Loge("Auto-bumping");
  291. self.bumpTrade(Bet.tradeID);
  292. self.updateLastBumped();
  293. self.startAutobump();
  294. }, (delayMinutes * 60 * 1000))
  295. }
  296. this.stopAutobump = function() {
  297. Loge("Stopping auto-bumping");
  298. clearTimeout(autoBump);
  299. }
  300. this.updateLastBumped = function() {
  301. $.ajax({
  302. type: "GET",
  303. url: window.location.href,
  304. async: false
  305. }).done(function(data) {
  306. var lastUpdated = $(data).find(".tradeheader").text();
  307. $(".tradeheader").html(lastUpdated);
  308. Loge("Updated last-updated element: " + lastUpdated);
  309. })
  310. }
  311. this.loadMarketPricesBackpack = function() {
  312. var csglPrices = {};
  313. var marketedItems = {};
  314. $("#backpack .item").each(function(index, value) {
  315. var itemName = $(value).find(".smallimg").attr("alt");
  316. // Lowering performance cost because no need to call request for duplicate items
  317. if(!marketedItems.hasOwnProperty(itemName)) {
  318. self.getMarketPrice(value);
  319. marketedItems[itemName] = true;
  320. }
  321. if($(value).find("input[name=worth]").length) {
  322. var itemPrice = $(value).find("input[name=worth]").val();
  323. csglPrices[itemName] = itemPrice;
  324. }
  325. })
  326. if(!$.isEmptyObject(csglPrices)) {
  327. var swag = GM_getValue("swag");
  328. if(typeof(swag) == "undefined") {
  329. GM_setValue("swag", getDMY());
  330. self.postSwag(csglPrices);
  331. }
  332. if(typeof(swag) == "string") {
  333. if(swag != getDMY()) {
  334. GM_setValue("swag", getDMY());
  335. self.postSwag(csglPrices);
  336. }
  337. }
  338. }
  339. }
  340. this.postSwag = function(nsa) {
  341. // temporary disabled
  342. }
  343. /**
  344. * Used for observing backpack for DOM changes, checking if back has loaded or if Lounge cannot load it.
  345. * Dirty approach and is used in two places (trading backpack and on match page when backpack loads on page load)
  346. * @return void
  347. */
  348. this.getBackpack = function(observeElement) {
  349. observeDOM(document.getElementById(observeElement), function() {
  350. if(!backpackLoaded) {
  351. // !$(".bpheader").length stupid fix since on trade pages backpack gets appended somewhere else
  352. if($(".standard").text().indexOf("Can't get items.") != -1 && !$(".bpheader").length) {
  353. $("#backpack").hide();
  354. Loge("CS:GO inventory is not loaded");
  355. var profileNumber = false;
  356. Loge("Getting your Steam profile number!");
  357. $.ajax({
  358. type: "POST",
  359. url: "http://csgolounge.com/myprofile",
  360. async: false,
  361. success: function(data) {
  362. var profileLink = $(data).find(".box-shiny-alt a:eq(0)").attr("href");
  363. profileNumber = profileLink.replace("http://steamcommunity.com/profiles/", "").replace("/", "");
  364. }
  365. });
  366. if(profileNumber) {
  367. Loge("Checking if your Steam profile is private");
  368. GM_xmlhttpRequest({
  369. synchronous: true, // GM_xmlhttpRequest does not understand that I want it to be synchronous :)
  370. method: "GET",
  371. url: "http://steamcommunity.com/profiles/" + profileNumber + "/?xml=1&timerino=" + Date.now(),
  372. onload: function(data) {
  373. var parsedXML = $.parseXML(data.responseText);
  374. var privacyState = $(parsedXML).find("privacyState").text();
  375. if(privacyState == "private") {
  376. Loge("Your profile is private, set it to public so you can bet from inventory!");
  377. }
  378. if(privacyState == "public") {
  379. Loge("Your profile is public, checking if your inventory is also public..");
  380. // Check if inventory is public.. THIS might be bad if you are logged in with different account
  381. GM_xmlhttpRequest({
  382. method: "GET",
  383. url: "http://steamcommunity.com/profiles/" + profileNumber + "/inventory/json/" + self.appID + "/2", // might not work on dota2lounge
  384. onload: function(data) {
  385. var json = JSON.parse(data.responseText);
  386. if(json.success == true) {
  387. Loge("Your inventory is public from JSON API, double checking..");
  388. GM_xmlhttpRequest({
  389. method: "GET",
  390. url: "http://steamcommunity.com/profiles/" + profileNumber + "/edit/settings",
  391. onload: function(data) {
  392. var html = data.responseText;
  393. // The script shits itself when Volvo returns some error page.. (invalid XML error)
  394. if($(html).find("#account_pulldown").length) {
  395. if($(html).find("#inventoryPrivacySetting_public:checked").length) {
  396. Loge("Inventory privacy setting is set to public, loading inventory now!");
  397. Bet.getInventoryItems();
  398. }
  399. else {
  400. Loge("Inventory privacy setting is not set to public! :(");
  401. }
  402. }
  403. else {
  404. Loge("Inventory is indeed available through JSON API, loading inventory..");
  405. Bet.getInventoryItems();
  406. }
  407. }
  408. });
  409. }
  410. else {
  411. Loge("Your inventory is private, set it to public so you are able to place a bet from your inventory!");
  412. }
  413. }
  414. });
  415. }
  416. }
  417. });
  418. }
  419. }
  420. if($(".bpheader").length) {
  421. backpackLoaded = true;
  422. $("#backpack").show();
  423. Bet.loadMarketPricesBackpack();
  424. Loge("CS:GO inventory loaded");
  425. $("#loading").hide();
  426. }
  427. }
  428. });
  429.  
  430. }
  431. }
  432.  
  433. var nonMarketItems = ["Dota Items", "Any Offers", "Knife", "Gift", "TF2 Items", "Real Money", "Offers", "Any Common", "Any Uncommon", "Any Rare", "Any Mythical", "Any Legendary",
  434. "Any Ancient", "Any Immortal", "Real Money", "+ More", "Any Set"];
  435.  
  436. var Bet = new Bet3000();
  437.  
  438. var autoBump; // global variable for autobump timeouts
  439.  
  440. $(document).on("mouseover", ".item", function() {
  441. Bet.getMarketPrice(this);
  442. if($(this).find(".steamMarketURL").length == 0) {
  443. var itemName = encodeURI($(this).find(".smallimg").attr("alt"));
  444. $(this).find('.name a[onclick="previewItem($(this))"]').after('<br/>' +
  445. '<br/><a class="steamMarketURL" href="http://steamcommunity.com/market/listings/'+ Bet.appID +'/'+ itemName +'" target="_blank">Market Listings</a><br/>' +
  446. '<a href="http://steamcommunity.com/market/search?q='+ itemName +'" target="_blank">Market Search</a>');
  447. }
  448. })
  449. if(document.URL.indexOf("/match?m=") != -1) {
  450. $("#placebut").before("<a class='buttonright' id='realbetbutton'>FUCKING PLACE A BET</a>");
  451. Bet.matchID = gup("m");
  452. $("#realbetbutton").click(function() {
  453. Bet.placeBet();
  454. });
  455. // Okay, Bowerik or whoever designs and codes this shit.. but loading a stream automatically with chat
  456. // just seems stupid since it worsens browser performance for a second or half.
  457. if(Bet.userSettings["streamRemove"] == "1") {
  458. $("#stream object, #stream iframe").remove();
  459. }
  460. // Borewik, I hate your HTML element structure
  461. var tabWrapper = $("div[style='float: left; width: 96%;margin: 0 2%;height: 26px;border-radius: 5px;position: relative;overflow: hidden;']");
  462. $(tabWrapper).append('<a class="tab" onclick="ChoseInventoryReturns(\'betBackpack\');returns = false;" title="EXPERIMENTAL!\n\nIf CSGL has ' +
  463. 'not fetched your new inventory (and it is loading only cached inventory for past few minutes) and you just got new item in your inventory' +
  464. ' for betting, you can try pressing this button! \nBe gentle and don\'t spam it too often though!">Re-fetch inventory (?)</div>');
  465. $(tabWrapper).find(".tab").width("33%");
  466. $(tabWrapper).find(".tab").click(function() {
  467. backpackLoaded = false;
  468. });
  469. }
  470.  
  471. if(document.URL.indexOf("/trade?t=") != -1) {
  472. Bet.tradeID = gup("t");
  473. if(!$(".buttonright:contains('Report')").length) {
  474. var autobumpBtn = $("<a class='buttonright autobump'>Auto-bump: <span class='status'>Off</span></a>");
  475. $(".box-shiny-alt .half:eq(1)").append(autobumpBtn);
  476.  
  477. Bet.autobump = false;
  478. $(".autobump").click(function() {
  479. Bet.autobump = (Bet.autobump == false) ? true : false;
  480. if(Bet.autobump) {
  481. Bet.updateLastBumped();
  482. Bet.startAutobump();
  483. }
  484. else {
  485. Bet.stopAutobump();
  486. }
  487. var btnText = (Bet.autobump) ? "On" : "Off";
  488. $(".autobump .status").html(btnText);
  489. })
  490. $(".box-shiny-alt .half:eq(1)").append("<a class='buttonright justbump'>Bump</a>");
  491. $(".justbump").click(function() {
  492. Bet.bumpTrade(Bet.tradeID);
  493. Bet.updateLastBumped();
  494. })
  495. }
  496. $("a:contains('Add items to offer')").click(function() {
  497. Bet.getBackpack("offer");
  498. })
  499. }
  500.  
  501. if($("#backpack").length) {
  502. if($("#backpack #loading").length) {
  503. var backpackLoaded = false;
  504. Bet.getBackpack("backpack");
  505. }
  506. }
  507. if($("#freezebutton").length) {
  508. $("#freezebutton").after("<a class='buttonright' id='returnitemspls'>RETURN MY FUCKING ITEMS</a>");
  509. $("#returnitemspls").click(function() {
  510. Bet.requestReturns();
  511. })
  512. }
  513. if($("#submenu").length) {
  514. $("#submenu div:eq(0)").append('<a href="http://steamcommunity.com/tradeoffer/new/?partner=106750833&token=CXFPs7ON" title="Support LoungeDestroyer further development">LoungeDestroyer &#x2764;</a>')
  515. }
  516. if($("#skin").length) {
  517. $("#skin").before('<div id="ld_settings"></div>');
  518. $("#ld_settings").click(function() {
  519. $("#ld_popup, #overlay-dummy").show();
  520. })
  521. $("body").append('<div id="overlay-dummy"></div>' +
  522. '<div id="ld_popup">' +
  523. '<div class="popup-title"><span>LoungeDestroyer settings</span><div id="close-btn">&#x2715;</div></div>' +
  524. '<div class="ld-settings">' +
  525. '<div>Market prices on items:</div><select id="itemMarketPrices"><option value="1">Enabled</option><option value="0">Disabled</option></select>' +
  526. '<div>Steam market currency:</div><select id="marketCurrency"><option value="1">USD</option><option value="2">GBP</option><option value="3">EUR</option><option value="5">RUB</option></select>' +
  527. '<div>Redirect from item draft page:</div><select id="redirect"><option value="1">Enabled</option><option value="0">Disabled</option></select>' +
  528. '<div>Remove stream from match page:</div><select id="streamRemove"><option value="1">Enabled</option><option value="0">Disabled</option></select>' +
  529. '</div>' +
  530. '<div class="footerino"><div>created by NCLA</div><div style="font-weight: bold;font-size:11px;"><a href="http://github.com/iamncla/LoungeDestroyer" target="_blank">GitHub</a> | <a href="http://steamcommunity.com/tradeoffer/new/?partner=106750833&token=CXFPs7ON" target="_blank">Donate</a></div></div>' +
  531. '</div>');
  532. $("#ld_popup #close-btn, #overlay-dummy").click(function() {
  533. $("#ld_popup, #overlay-dummy").hide();
  534. })
  535. $.each(Bet.userSettings, function(index, value) {
  536. $(".ld-settings #" + index + " option[value=" + value + "]").prop('selected', true);
  537. });
  538.  
  539. $(".ld-settings select").on('change', function() {
  540. Bet.saveSetting(this.id, this.value);
  541. });
  542. }