您需要先安装一个扩展,例如 篡改猴、Greasemonkey 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 Userscripts ,之后才能安装此脚本。
您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey,才能安装此脚本。
您需要先安装用户脚本管理器扩展后才能安装此脚本。
Adds pie charts and other enhancements to backloggery.com
当前为
// ==UserScript== // @name Tor's Backloggery enhancements // @version 2.1.16 // @namespace werhi23uhkjwesda // @description Adds pie charts and other enhancements to backloggery.com // @copyright 2010+, Tor // @license MIT License; http://www.opensource.org/licenses/mit-license.php // @match http://backloggery.com/* // @match http://www.backloggery.com/* // @grant none // @require https://code.jquery.com/jquery-1.8.3.min.js // ==/UserScript== /* This script uses icons from the "Silk" and "Diagona" icon sets, which may be found at http://www.famfamfam.com/lab/icons/silk/ and http://p.yusukekamiyamane.com/ */ /* Use transparent backgrounds for charts. Set to false if the text in the charts is hard to read. */ var transparentBackgroundForCharts = true; //Enable or disable log messages in the browser's javascript console var enableLogging = false; /* In the pie charts, merge categories with very few games into an "other" category. 0.05 means that services with fewer than 5% of the total number of games will be put in the "other" category. This might make the chart less cluttered. A setting between 0.10 and 0.01 recommended. Set to 0.00 to disable. */ var otherThreshold = 0.04 // Width and height of charts. var chartWidth = 281; var chartHeight = 100; var ddicons = new Array(); var miscIcons = new Array(); var icon_urls = new Array(); var systemIcons = new Array(); //Association between keywords and icons ddicons['gog.com'] = 0; ddicons['gog'] = 0; ddicons['steampowered.com'] = 2; ddicons['steam'] = 2; ddicons['playgreenhouse.com'] = 3; ddicons['greenhouse'] = 3; ddicons['telltalegames.com'] = 4; ddicons['telltale'] = 4; ddicons['zombie-cow.com'] = 5; ddicons['zombie-cow'] = 5; ddicons['impulsedriven.com'] = 6; ddicons['impulse'] = 6; ddicons['direct2drive.com'] = 7; ddicons['direct2drive.co.uk'] = 7; ddicons['direct2drive.eu'] = 7; ddicons['direct2drive'] = 7; ddicons['d2d'] = 7; ddicons['gamersgate.com'] = 8; ddicons['gamersgate'] = 8; ddicons['amanita-design.net'] = 9; ddicons['amanitadesign'] = 9; ddicons['tale-of-tales.com'] = 10; ddicons['taleoftales'] = 10; ddicons['bigfinishgames.com'] = 11; ddicons['bigfinish'] = 11; ddicons['2dboy.com'] = 12; ddicons['2dboy'] = 12; ddicons['crayonphysics.com'] = 13; ddicons['crayonphysics'] = 13; ddicons['bit-blot.com'] = 14; ddicons['bitblot'] = 14; ddicons['areo.areograph.com'] = 15; ddicons['areogames'] = 15; ddicons['battle.net'] = 20; ddicons['xboxlive'] = 21; ddicons['gfw'] = 24; ddicons['gamesforwindows'] = 24; ddicons['gamesforwindowsmarketplace'] = 24; ddicons['getgames'] = 23; ddicons['getgamesgo'] = 23; ddicons['android'] = 25; ddicons['androidmarket'] = 25; ddicons['googleplay'] = 25; ddicons['yawma'] = 26; ddicons['yawma.net'] = 26; ddicons['humbleindiebundle'] = 27; ddicons['humblebundle.com'] = 27; ddicons['humblebundle'] = 27; ddicons['desura'] = 28; ddicons['desura.com'] = 28; ddicons['beamdog'] = 29; ddicons['beamdog.com'] = 29; ddicons['casebookthegame.com'] = 30; ddicons['casebook'] = 30; ddicons['theballthegame.com'] = 31; ddicons['theball'] = 31; ddicons['origin'] = 32; ddicons['nintendo'] = 33; ddicons['psn'] = 34; ddicons['sizefivegames.com'] = 35; ddicons['sizefivegames'] = 35; ddicons['indieroyale.com'] = 36; ddicons['indieroyale'] = 36; ddicons['gamefly.com'] = 37; ddicons['gamefly'] = 37; ddicons['amazon.com'] = 38; ddicons['amazon'] = 38; ddicons['greenmangaming.com'] = 39; ddicons['greenmangaming'] = 39; ddicons['gmg'] = 39; ddicons['uplay'] = 40; ddicons['uplay.ubi.com'] = 40; ddicons['freebird'] = 41; ddicons['freebirdgames'] = 41; ddicons['freebirdgames.com'] = 41; ddicons['indiegala'] = 42; ddicons['indiegala.com'] = 42; ddicons['kickstarter'] = 43; ddicons['kickstarter.com'] = 43; ddicons['indiegamestand'] = 44; ddicons['indiegamestand.com'] = 44; ddicons['indiegogo'] = 45; ddicons['indiegogo.com'] = 45; ddicons['gamestop'] = 46; ddicons['gamestop.com'] = 46; ddicons['groupees'] = 47; ddicons['groupees.com'] = 47; ddicons['playism'] = 48; ddicons['playism-games.com'] = 48; ddicons['bigfish'] = 49; ddicons['bigfishgames'] = 49; ddicons['bigfishgames.com'] = 49; ddicons['dotemu'] = 50; ddicons['dotemu.com'] = 50; ddicons['indiecity'] = 51; ddicons['indiecity.com'] = 51; ddicons['nuuvem'] = 52; ddicons['nuuvem.com.br'] = 52; ddicons['windowsstore'] = 53; ddicons['itch.io'] = 54; //Do not count these icons in the digital distribution stores chart miscIcons['floppy'] = 16; miscIcons['disc'] = 17; miscIcons['cartridge'] = 18; miscIcons['soundtrack'] = 19; miscIcons['collectorsedition'] = 22; miscIcons['specialedition'] = 22; //List of URLs to icons icon_urls[0] = "https://lh3.googleusercontent.com/-PhuK9fCqWXg/U4sbbMxLmYI/AAAAAAAABhQ/xYtsQcM6LiY/s800/gog.png"; icon_urls[2] = "https://store.steampowered.com/favicon.ico"; icon_urls[3] = "https://lh6.googleusercontent.com/-i1ugqfN2sM4/U4YanM5_lII/AAAAAAAABdM/RIndcc33kwo/s800/greenhouse.png"; icon_urls[4] = "https://lh3.googleusercontent.com/-LqhGwE8Uyjw/U4YcXukagxI/AAAAAAAABeU/ox9DrBYqDsg/s800/telltale.png"; icon_urls[5] = "https://lh5.googleusercontent.com/-wXSLqwLwihM/U4YcUesxPEI/AAAAAAAABeM/qecM551KaEc/s800/zombie-cow.png"; icon_urls[6] = "https://lh6.googleusercontent.com/-Pc3nu4XDPyE/U4YiGtNVuyI/AAAAAAAABgc/5HFCyvMykiQ/s800/impulse.png"; icon_urls[7] = "https://lh4.googleusercontent.com/-uzHpk1lSL34/U4YYKWxA_5I/AAAAAAAABcU/4V4aJ4p402I/s800/d2d.png"; icon_urls[8] = "https://www.gamersgate.com/favicon.ico"; icon_urls[9] = "https://lh5.googleusercontent.com/-G1BUB8sbDYM/U4Ycre-N0cI/AAAAAAAABe4/XCkQRlAKkRA/s800/amanitadesign.png"; icon_urls[10] = "https://lh4.googleusercontent.com/-z1mzei2qLuk/U4YcMNddPaI/AAAAAAAABeE/kCOwM1d0C98/s800/taleoftales.png"; icon_urls[11] = "https://lh5.googleusercontent.com/-ovDvrXveHKI/U4YY3pqECjI/AAAAAAAABcg/fLSfwSa4PdY/s800/bigfinish.png"; icon_urls[12] = "https://lh3.googleusercontent.com/-cqTpbNOc3Eo/U4YekNHEraI/AAAAAAAABf0/Uimh4LlA9fE/s800/2dboy.png"; icon_urls[13] = "https://lh6.googleusercontent.com/-BCOuRHWLVPU/U4YcMLRzYMI/AAAAAAAABeA/zoLcuAPTTL8/s800/crayonphysics.png"; icon_urls[14] = "https://lh3.googleusercontent.com/-YWvBV6SG95s/U4YVOZiDqOI/AAAAAAAABbg/DWks790O8Tw/s800/bit-blot.png"; icon_urls[15] = "https://lh4.googleusercontent.com/-hiTvab7fNeQ/U4YVNkVzdbI/AAAAAAAABcA/9IR0d7vj5Rw/s800/areogames.png"; icon_urls[16] = "https://lh4.googleusercontent.com/-Fw5IgzTXS0E/U4Yee5J6qWI/AAAAAAAABfs/1I6iJpnY46w/s800/floppy.png"; icon_urls[17] = "https://lh6.googleusercontent.com/-fgYO_GO8n0A/U4Yee6LkbrI/AAAAAAAABfc/syry88tZqUs/s800/disc.png"; icon_urls[18] = "https://lh3.googleusercontent.com/-iwXya8FD7AM/U4YVOp6-AvI/AAAAAAAABbk/WBMb1AgtN2c/s800/cart.png"; icon_urls[19] = "https://lh5.googleusercontent.com/-r8C-lX0w_bI/U4YefafJe7I/AAAAAAAABfo/niNWzjrY3zk/s800/soundtrack.png"; icon_urls[20] = "https://battle.net/static/images/meta/favicon.ico"; icon_urls[21] = "https://lh6.googleusercontent.com/-QRWAZw-QeVI/U4YbLQRWCvI/AAAAAAAABdc/UM6aD_OC45Q/s800/xboxlive.png"; icon_urls[22] = "https://lh6.googleusercontent.com/-VQx0m0aF2vU/U4Yee7XwMFI/AAAAAAAABfY/iQuU-QE9jJA/s800/collectors.png"; icon_urls[23] = "https://getgamesgo.com/static/images/favicon.ico"; icon_urls[24] = "https://lh3.googleusercontent.com/-n3zHP5ZTEk8/U4YoNRILjFI/AAAAAAAABgs/donquTXcOI8/s800/gamesforwindows.png"; icon_urls[25] = "https://lh4.googleusercontent.com/-8k0SFFIFooQ/U4YY4QHg-fI/AAAAAAAABco/6yRzMjhm3BA/s800/googleplay.png"; icon_urls[26] = "https://lh6.googleusercontent.com/-QBuHwtRK93I/U4YapJUfBEI/AAAAAAAABdU/MwwsXQ_3fW4/s800/yawma.png"; icon_urls[27] = "https://humblebundle-a.akamaihd.net/static/hashed/46cf2ed85a0641bfdc052121786440c70da77d75.png"; icon_urls[28] = "https://lh6.googleusercontent.com/-YE1_ScE2oSA/U4Yab588McI/AAAAAAAABc8/MW30tqHQTRo/s800/desura.png"; icon_urls[29] = "https://www.beamdog.com/images/2.0/favicon.png"; icon_urls[30] = "https://lh3.googleusercontent.com/-HwUaInJeAcM/U4YcrYrLjNI/AAAAAAAABe8/L1ks1Jtprqg/s800/casebookthegame.png"; icon_urls[31] = "https://lh6.googleusercontent.com/-imwyJ2Luq18/U4YcZ0s4j6I/AAAAAAAABec/HL0PGHlaD0I/s800/theball.png"; icon_urls[32] = "https://lh4.googleusercontent.com/-HrU72c5icvg/U4YalWTsVOI/AAAAAAAABdE/NvEzPCfVgpw/s800/origin.png"; icon_urls[33] = "https://lh5.googleusercontent.com/-1YJ5GkrcnBg/U4YbYfGR41I/AAAAAAAABds/hk6DEBHe6CI/s800/nintendo.png"; icon_urls[34] = "https://i.imgur.com/BEHlNk2.png"; icon_urls[35] = "https://lh6.googleusercontent.com/-sUX5ivzf6ZY/U4Ycr0vY0nI/AAAAAAAABe0/cchIab0uxsk/s800/sizefivegames.png"; icon_urls[36] = "https://lh6.googleusercontent.com/-KXKZW_UP__k/U4YcrhklOqI/AAAAAAAABew/iZYgGG_T7GM/s800/indieroyale.png"; icon_urls[37] = "https://lh6.googleusercontent.com/-T6pBLW644C4/U4YaRDp7F-I/AAAAAAAABc0/tXWjiAAenZ0/s800/gamefly.png"; icon_urls[38] = "https://lh3.googleusercontent.com/-gNQGzO6OVp8/U4YVNiESYAI/AAAAAAAABbs/yFfiybWjTNk/s800/amazon.png"; icon_urls[39] = "https://www.greenmangaming.com/static/favicon.ico"; icon_urls[40] = "https://static2.cdn.ubi.com/gamesites/uplay/201212201711/img/favicon.ico"; icon_urls[41] = "https://lh6.googleusercontent.com/-mquB7vxjefw/U4YcrV1mJ8I/AAAAAAAABfE/N8IEKbWLgv8/s800/freebird.png"; icon_urls[42] = "https://www.indiegala.com/favicon.ico"; icon_urls[43] = "https://lh4.googleusercontent.com/-QxASAMDxDtY/U4YbYdMopKI/AAAAAAAABd0/aktUFbnE_Lk/s800/kickstarter.png"; icon_urls[44] = "https://indiegamestand.com/favicon.ico"; icon_urls[45] = "https://lh5.googleusercontent.com/-33drwcq-8Mg/U4YbYdhNlbI/AAAAAAAABdo/o1tR4OM3SaA/s800/indiegogo.png"; icon_urls[46] = "https://www.gamestop.com/favicon.ico"; icon_urls[47] = "https://lh5.googleusercontent.com/-JqxT5YXGyxo/VLJUVkpErPI/AAAAAAAABmQ/IQcgSJH8iGQ/s800/groupees.png"; icon_urls[48] = "https://lh3.googleusercontent.com/--2pe41xzPjQ/VLJUWniehmI/AAAAAAAABmA/RglbG5rP3Jk/s800/playism-games.png"; icon_urls[49] = "https://lh3.googleusercontent.com/-WTH88IRzlQA/VLJUVpYqu8I/AAAAAAAABmM/b3QZTgeeI4s/s800/bigfishgames.png"; icon_urls[50] = "https://lh3.googleusercontent.com/-q3n7oxCgWso/VLJUVsGuhnI/AAAAAAAABmY/iD6J0AtUpdw/s800/dotemu.png"; icon_urls[51] = "https://lh6.googleusercontent.com/-7W3inoXb0rA/VLJUWHMPa1I/AAAAAAAABmI/v2l2bu1WiB8/s800/indiecity.png"; icon_urls[52] = "https://lh6.googleusercontent.com/-yFqz3QiC_kA/VLJWAcx6cbI/AAAAAAAABmo/WhfJU1JhuoU/s800/nuuvem.png"; icon_urls[53] = "https://lh3.googleusercontent.com/-L0Ae5fzDP9I/VLJUXP5o9RI/AAAAAAAABl8/xb9GYMwX3F0/s800/windowsstore.png"; icon_urls[54] = "https://lh5.googleusercontent.com/-CZqVqn8d67I/VLJUWchVXyI/AAAAAAAABmE/ehhftDUkpi4/s800/itch.io.png"; //Icons for game systems defined by backloggery.com systemIcons['BNet'] = "Battle.net"; systemIcons['Bdog'] = "Beamdog"; systemIcons['BFG'] = "BigFishGames"; systemIcons['Desura'] = "Desura"; systemIcons['DotEmu'] = "DotEmu"; systemIcons['GGate'] = "GamersGate"; systemIcons['G4W'] = "GamesforWindows"; systemIcons['GGames'] = "GetGames"; systemIcons['GMG'] = "GMG"; systemIcons['GOG'] = "GOG"; systemIcons['Imp'] = "GameStop"; systemIcons['IndieC'] = "IndieCity"; systemIcons['Nuuvem'] = "Nuuvem"; systemIcons['Origin'] = "Origin"; systemIcons['Steam'] = "Steam"; systemIcons['UPlay'] = "UPlay"; systemIcons['WinStr'] = "WindowsStore"; //Variables for gathering statistics var downloadServiceStatistics = new Object(); var yearStatistics = new Object(); var downloadServiceTotalCount = 0; var yearTotalCount = 0; var gamesSum = 0; var systemCount = new Object(); var ownershipCount = new Array(6); for (i = 0; i < ownershipCount.length; i++) ownershipCount[i] = 0; //Process game list on games.php page function gameListUpdated() { log("gameListUpdated starts"); detachGameListEventReceiver(); var gameboxesProcessed = 0; $("section.gamebox:not(.processed):not(.boxtop):not(.systemend)").each(function(index) { if (enableLogging) log("Processing gamebox "+$(this).find("h2 b:first").text()); if ($(this).find('h2 img[alt="Comp"]').size() > 0) { log("Skipping this gamebox, it's a compilation"); $(this).addClass("processed"); return; } var gameRow1 = $(this).find("div.gamerow").first(); var gameRow2 = $(this).find("div.gamerow").eq(1); //Get system information var system = $.trim(gameRow1.text()).split(" ")[0]; log("System is "+system); if (!systemCount[system]) systemCount[system] = 1; else systemCount[system]++; //Add icons for systems that really represent digital distribution stores addSystemIcon(system, gameRow1); //Get ownership information if (gameRow1.find('img[title="Household"]').size() > 0) ownershipCount[1]++; else if (gameRow1.find('img[title="Subscription"]').size() > 0) ownershipCount[2]++; else if (gameRow1.find('img[title="Borrowed/Rented"]').size() > 0) ownershipCount[3]++; else if (gameRow1.find('img[title="Formerly Owned"]').size() > 0) ownershipCount[4]++; else if (gameRow1.find('img[title="Ownership: Other"]').size() > 0) ownershipCount[5]++; else ownershipCount[0]++; //Parse words var words = gameRow2.text().split(" "); var hasYear = false; for (i in words) { var word = words[i]; //Get year if (!hasYear) { hasYear = createYearLabelFromKeyWord(word, gameRow1.find("b:first")); if (hasYear) { words[i] = null; continue; } } //Create icons from keyword if (createIconsFromKeyWord(word, gameRow1)) { words[i] = null; continue; } } gameRow2.text(words.join(" ")); if (! /\S/.test(gameRow2.text())) gameRow2.remove(); $(this).addClass("processed"); gameboxesProcessed++; gamesSum++; }); if (gameboxesProcessed > 0) { updateCharts(); } attachGameListEventReceiver(); log("gameListUpdated end"); } //Process now playing list function processNowPlayingList() { $("div.npgame").each(function(index) { var progressDiv = $(this).children().eq(-2); var words = progressDiv.contents().get(0).data.split(" "); var hasYear = false; progressDiv.prepend("<span class='scripticons'></span>"); for (i in words) { var word = words[i]; if (!hasYear) { hasYear = createYearLabelFromKeyWord(word, progressDiv.prev()); if (hasYear) { words[i] = null; continue; } } if (createIconsFromKeyWord(word, progressDiv.find("span.scripticons"))) { words[i] = null; continue; } } progressDiv.contents().get(1).data = words.join(" "); }); } //Process multitap function processMultitap() { $("div.friend li").each(function(index) { if ($(this).contents().length < 4) return; var words = $(this).contents().get(3).data.split(" "); var hasYear = false; $(this).append("<span class='scripticons'></span>"); for (i in words) { var word = words[i]; if (createIconsFromKeyWord(word, $(this).find("span.scripticons"))) { words[i] = null; continue; } } $(this).contents().get(3).data = words.join(" "); }); } function createYearLabelFromKeyWord(word, yearNode) { year = /^\((\d{4})\)$/.exec($.trim(word)); if (year) { log("Appending year node "+year[0]); yearNode.append(" "+year[0]); //Update year statistics yearTotalCount++; if (!yearStatistics[year[1]]) yearStatistics[year[1]] = 1; else yearStatistics[year[1]] += 1; return true; } return false; } function addSystemIcon(system, iconsNode) { if (systemIcons[system]) createIconsFromKeyWord("["+systemIcons[system]+"]", iconsNode); } function createIconsFromKeyWord(word, iconsNode) { var keyWord = /^\[([\w\.-]+)\]$/.exec($.trim(word)); if (keyWord) { log("Found keyword "+keyWord[1]); //Try to parse keyword as download service icon var iconNumber = ddicons[keyWord[1].toLowerCase()]; if (isValid(iconNumber)) { appendIconNumberToNode(iconNumber, keyWord[1], iconsNode); //Increment counters for charts downloadServiceTotalCount++; if (!downloadServiceStatistics[keyWord[1]]) downloadServiceStatistics[keyWord[1]] = 1; else downloadServiceStatistics[keyWord[1]]++; return true; } //Try to parse keyword as "misc" icon iconNumber = miscIcons[keyWord[1].toLowerCase()]; if (isValid(iconNumber)) { appendIconNumberToNode(iconNumber, keyWord[1], iconsNode); return true; } } return false; } function appendIconNumberToNode(iconNumber, iconTitle, node) { log("Appending icon "+iconNumber+" with title "+iconTitle+" to current node"); node.append(createIconFromURLandTitle(icon_urls[iconNumber], iconTitle)); } function createIconFromURLandTitle(url, title) { return ' <span class="info"><img width="16" height="16" src="' + url + '" alt="' + title + '" title="' + title + '" ' + 'style="margin-bottom: -1px;" /></span> '; } function updateCharts() { log("Updating charts"); var headerSection = $("section").first(); if (headerSection.find('div#chartDiv1').size() < 1) headerSection.append("<div id='chartDiv1'></div>"); if (headerSection.find('div#chartDiv2').size() < 1) headerSection.append("<div id='chartDiv2'></div>"); updateStatusChart(headerSection.find('div#chartDiv1')); updateSystemChart(headerSection.find('div#chartDiv1')); updateOwnershipChart(headerSection.find('div#chartDiv1')); updateDDserviceChart(headerSection.find('div#chartDiv1')); updateYearChart(headerSection.find('div#chartDiv2')); } function updateStatusChart(headerSection) { var img = headerSection.find("#statusChart"); if (img.size() > 0) return; $('div#maincolumn > section:first > table').css('display', 'none'); var tableRows = $('div#maincolumn > section:first > table tr'); var unfinishedCount = tableRows.eq(0).children(":eq(1)").text(); var beatenCount = tableRows.eq(1).children(":eq(1)").text(); var completedCount = tableRows.eq(2).children(":eq(1)").text(); if (!isValidAndNotEmpty(unfinishedCount) || !isValidAndNotEmpty(beatenCount) || !isValidAndNotEmpty(completedCount) || parseInt(unfinishedCount) + parseInt(beatenCount) + parseInt(completedCount) < 1) return; var data = unfinishedCount + "," + beatenCount + "," + completedCount; var url = createPieChart(data, "Unfinished|Beaten|Completed", "990000,BDBDBD,FFCC66", transparentBackgroundForCharts, chartWidth, chartHeight); log("Adding status chart"); var imgHtml = "<img src='" + url + "' title='Status chart' " + "alt='Status chart' id='statusChart' " + "width='" + chartWidth + "' height='" + chartHeight + "'/> "; headerSection.append(imgHtml); } function updateSystemChart(headerSection) { var img = headerSection.find("#systemChart"); if (gamesSum < 1) { img.remove(); return; } var url = createSystemChartUrl(); if (isValidAndNotEmpty(url)) { if (img.size() > 0) { log("Updating system chart"); img.attr("src", url); } else { log("Adding system service chart"); var imgHtml = "<img src='" + url + "' title='System chart' " + "alt='System chart' id='systemChart' " + "width='" + chartWidth + "' height='" + chartHeight + "'/> "; headerSection.append(imgHtml); } } } function updateOwnershipChart(headerSection) { var img = headerSection.find("#ownershipChart"); if (gamesSum < 1) { img.remove(); return; } var url = createOwnershipChartUrl(); if (isValidAndNotEmpty(url)) { if (img.size() > 0) { log("Updating ownership chart"); img.attr("src", url); } else { log("Adding ownership service chart"); var imgHtml = "<img src='" + url + "' title='Ownership chart' " + "alt='Ownership chart' id='ownershipChart' " + "width='" + chartWidth + "' height='" + chartHeight + "'/> "; headerSection.append(imgHtml); } } } function updateDDserviceChart(headerSection) { var img = headerSection.find("#ddChart"); if (downloadServiceTotalCount < 1) { img.remove(); return; } var url = createDDserviceChartUrl(); if (isValidAndNotEmpty(url)) { if (img.size() > 0) { log("Updating DD service chart"); img.attr("src", url); } else { log("Adding DD service chart"); var imgHtml = "<img src='" + url + "' title='Digital distribution services chart' " + "alt='Digital distribution services chart' id='ddChart' " + "width='" + chartWidth + "' height='" + chartHeight + "'/> "; headerSection.append(imgHtml); } } } function updateYearChart(headerSection) { var img = headerSection.find("#yearChart"); if (yearTotalCount < 2) { img.remove(); return; } var url = createYearChartUrl(); if (isValidAndNotEmpty(url)) { if (img.size() > 0) { log("Updating year chart"); img.attr("src", url); } else { log("Adding year chart"); var imgHtml = "<img src='" + url + "' title='Release years chart' alt='Release years chart' id='yearChart' " + "width='" + chartWidth*2 + "' height='" + chartHeight + "'/> "; headerSection.append(imgHtml); } } } function createSystemChartUrl() { var chartData = ""; var chartLabels = ""; var other = 0; for (var system in systemCount) { if (systemCount[system] / gamesSum > otherThreshold) { chartData += 100 * systemCount[system] / gamesSum + ","; chartLabels += system + "|"; } else { other += systemCount[system]; } } if (other > 0) { chartData += 100 * other / gamesSum + ","; chartLabels += "Other" + "|"; } return createPieChart( chartData.substr(0, chartData.length-1), chartLabels.substr(0, chartLabels.length-1), "7777ff", transparentBackgroundForCharts, chartWidth, chartHeight); } function createOwnershipChartUrl() { var ownershipLabels = ["Owned", "Household", "Subscription", "Borrowed/Rented", "Formerly Owned", "Other"]; //Use chart colors similar to the ownership icons var colors = ["b6b718", "fffcb5", "dec123", "7a9e9c", "9bacff", "9b89b6"]; var chartData = ""; var chartLabels = ""; var chartColors = ""; for (i = 0; i < ownershipCount.length; i++) if (ownershipCount[i] > 0) { chartData += 100 * ownershipCount[i] / gamesSum + ","; chartLabels += ownershipLabels[i] + "|"; chartColors += colors[i] + ","; } return createPieChart( chartData.substr(0, chartData.length-1), chartLabels.substr(0, chartLabels.length-1), chartColors.substr(0, chartColors.length-1), transparentBackgroundForCharts, chartWidth, chartHeight); } function createDDserviceChartUrl() { var chartData = ""; var chartLabels = ""; var other = 0; for (var keyword in downloadServiceStatistics) { if (downloadServiceStatistics[keyword] / downloadServiceTotalCount > otherThreshold) { chartData += 100 * downloadServiceStatistics[keyword] / downloadServiceTotalCount + ","; chartLabels += keyword + "|"; } else { other += downloadServiceStatistics[keyword]; } } if (other > 0) { chartData += 100 * other / downloadServiceTotalCount + ","; chartLabels += "Other" + "|"; } return createPieChart( chartData.substr(0, chartData.length-1), chartLabels.substr(0, chartLabels.length-1), "11aa11", transparentBackgroundForCharts, chartWidth, chartHeight); } function createYearChartUrl() { var years = new Array(); var yearStatisticsIdx = 0; var highestValue = 0; for (var year in yearStatistics) { years[yearStatisticsIdx] = year; yearStatisticsIdx++; if (yearStatistics[year] > highestValue) highestValue = yearStatistics[year]; } years.sort(); var lowestYear = parseInt(years[0]); var highestYear = parseInt(years[years.length-1]); var chartDataX = ""; var chartDataY = ""; var chartLabelScaleFactor = Math.ceil((1 + highestYear - lowestYear) / 20); for (var i = lowestYear; i <= highestYear; i++) { if (i%chartLabelScaleFactor == 0) chartDataX += i + "|"; else chartDataX += "|"; if (yearStatistics[i.toString()] == null) chartDataY += "0,"; else chartDataY += 100*yearStatistics[i.toString()] / highestValue + ","; } var barChartUrl = "http://chart.apis.google.com/chart" + "?cht=bvs&chs=" + chartWidth*2 + "x" + chartHeight + "&chd=t:" + chartDataY.substr(0, chartDataY.length-1) + "&chxl=0:|" + chartDataX.substr(0, chartDataX.length-1) + "&chxt=x,y&chbh=a" + "&chxr=1,0," + highestValue; if (transparentBackgroundForCharts) barChartUrl += "&chf=bg,s,00000000"; barChartUrl += "&chco=4D89F9"; log(barChartUrl); return barChartUrl; } //Creates pie chart from parameters function createPieChart(data, labels, colors, transparent, width, height){ var pieChartUrl = "http://chart.apis.google.com/chart" + "?cht=p&chs=" + width + "x" + height + "&chd=t:" + data + "&chl=" + labels; if (transparent) pieChartUrl += "&chf=bg,s,00000000"; pieChartUrl += "&chco=" + colors; log(pieChartUrl); return pieChartUrl; } function isValid(variable) { if (typeof variable != 'undefined' && variable != null) { return true; } return false; } function isValidAndNotEmpty(variable) { if (isValid(variable) && variable != "") { return true; } return false; } function log(message) { if (enableLogging) { var now = new Date(); var addZero = function(d) { if (d < 10) d = "0" + d; return d; }; var millis = now.getMilliseconds(); if (millis < 10) millis = "00" + millis; else if (millis < 100) millis = "0" + millis; displayMessage = addZero(now.getHours()) + ":" + addZero(now.getMinutes()) + ":" + addZero(now.getSeconds()) + ":" + millis + " " + message; console.log(displayMessage); } } //setCookie and getCookie functions from w3schools.com function setCookie(c_name,value,exdays) { var exdate=new Date(); exdate.setDate(exdate.getDate() + exdays); var c_value=escape(value) + ((exdays==null) ? "" : "; expires="+exdate.toUTCString()); document.cookie=c_name + "=" + c_value; log("Saved cookie " + c_name + " with value " + value); } function getCookie(c_name) { var i,x,y,ARRcookies=document.cookie.split(";"); for (i=0;i<ARRcookies.length;i++) { x=ARRcookies[i].substr(0,ARRcookies[i].indexOf("=")); y=ARRcookies[i].substr(ARRcookies[i].indexOf("=")+1); x=x.replace(/^\s+|\s+$/g,""); if (x==c_name) { log("Retrieved cookie " + c_name + " with value " + unescape(y)); return unescape(y); } } log("Cookie " + c_name + " not found"); } function getCookieOrDefaultValue(c_name, defaultValue) { var val = getCookie(c_name); if (isValidAndNotEmpty(val)) return val; return defaultValue; } function attachGameListEventReceiver() { $("div#content").bind("DOMNodeInserted", gameListUpdated); } function detachGameListEventReceiver() { $("div#content").unbind("DOMNodeInserted", gameListUpdated); } var loadAllTriggered = false; $(document).keyup(function(event) { if (event.which == 76 && event.shiftKey && event.ctrlKey && !isLoadingAjax()) { //Ctrl-Shift-L if (!loadAllTriggered && documentContainsStuffToLoad()) { log("Starting load all"); detachGameListEventReceiver(); addActivityIndicator(); loadAllTriggered = true; tryLoadNext(); } } }); function documentContainsStuffToLoad() { return ($("input[type='button'][value='Show more games']").length > 0) || ($(".lessmore[onclick]:contains('\u25BC')").length > 0); } function isLoadingAjax() { return $("img[src$='AJAX_loading.gif']").length > 0; } function tryLoadNext() { $("div#content").unbind("DOMNodeInserted", tryLoadNext); if (isLoadingAjax()) $("div#content").bind("DOMNodeInserted", tryLoadNext); else triggerNext(); } function triggerNext() { var showMoreBtn = $("input[type='button'][value='Show more games']"); if (showMoreBtn.length > 0) { log("Loading next page"); showMoreBtn.click(); setTimeout(tryLoadNext, 1000); return; } var expandBtn = $(".lessmore[onclick]:contains('\u25BC')").first(); if (expandBtn.length > 0) { log("Expanding collection"); expandBtn.click(); setTimeout(tryLoadNext, 1000); return; } log("Load all done"); gameListUpdated(); removeActivityIndicator(); } function addActivityIndicator() { var x = (window.innerWidth - 100)/2; var y = (window.innerHeight - 100)/2; $(document.body).append('<div class="loadallindicator" style="width:100px;height:100px;position:fixed;left:' + x + 'px;top:' + y + 'px;z-index:100;background-color:black;opacity:0.7"></div>'); x += 28; y += 27; $(document.body).append('<img class="loadallindicator" style="position:fixed;left:' + x + 'px;top:' + y + 'px;z-index:100" src="images/AJAX_loading.gif?foo" alt="Now Loading..." width="44" height="46" />'); } function removeActivityIndicator() { $('.loadallindicator').remove(); } processNowPlayingList(); processMultitap(); gameListUpdated();