/********************************* nation_leaderboards.js for EA.com *********************************/ // global vars var leaderboardList = new Array(); var currentListElement; var currentFilterElement; var currentPlayerName = ''; var currentPlatform; // constants var columnHeaders = new Array(); var xmlBaseURL = '/_includes/nation/xml_leader_boards.jsp'; var personaNodeName; /****************************************************************************** Initialization *****************************************************************************/ function initLeaderboards() { if (initPlatform) { currentPlatform = initPlatform; } else if (playerPlatform) { currentPlatform = playerPlatform; } else { currentPlatform = 'ps2'; } // show header document.getElementById('leaderboard-header2').innerHTML = ''; // set dropdown to match var dropdown = document.getElementById('filter-platforms'); for (var optionIndex = 0; optionIndex < dropdown.options.length; optionIndex++) { if (dropdown.options[optionIndex].value == currentPlatform) { dropdown.selectedIndex = optionIndex; break; } } // display the leaderboard nav displayLeaderboardList(); // load initial leader if (initLeaderboard) { var numLeaderboards = leaderboardList.length; for (var listIndex = 0; listIndex < numLeaderboards; listIndex++) { var leaderboardItem = leaderboardList[listIndex]; if (leaderboardItem.name == initLeaderboard) { setLeaderboard(document.getElementById('leaderboard-list').childNodes[0].childNodes[listIndex], leaderboardList[listIndex].name); break; } } } else { setLeaderboard(document.getElementById('leaderboard-list').childNodes[0].childNodes[0], leaderboardList[0].name); } } function displayLeaderboardList() { var listHTML = ''; listHTML += ''; document.getElementById('leaderboard-list').innerHTML = listHTML; } /****************************************************************************** Set leaderboard variables *****************************************************************************/ function setLeaderboard(listElement, listItemName) { // highlight correct item if (currentListElement) { currentListElement.className = ''; } currentListElement = listElement; currentListElement.className = 'currentListItem'; // get leaderboardList item var numLeaderboards = leaderboardList.length; for (var listIndex = 0; listIndex < numLeaderboards; listIndex++) { var leaderboardItem = leaderboardList[listIndex]; if (leaderboardItem.name == listItemName) { break; } } // show header document.getElementById('leaderboard-header').innerHTML = ''; // show filters if needed var filtersHTML = ''; if (leaderboardItem.filters.length > 2) { filtersHTML += 'View By:'; filtersHTML += ''; } document.getElementById('filters-list').innerHTML = filtersHTML; // set current filter (also loads new leaderboard) if (leaderboardItem.filters.length > 2) { setFilter(document.getElementById('filter0'), leaderboardItem.filters[0].url); return; } // load new leaderboard loadLeaderboard(leaderboardItem.filters[0].url); } function setPlatform(platform) { currentPlatform = platform; // show header document.getElementById('leaderboard-header2').innerHTML = ''; // set dropdown to match var dropdown = document.getElementById('filter-platforms'); for (var optionIndex = 0; optionIndex < dropdown.options.length; optionIndex++) { if (dropdown.options[optionIndex].value == currentPlatform) { dropdown.selectedIndex = optionIndex; break; } } loadLeaderboard(currentQueryString); } function setFilter(filterElement, url) { // highlight correct item if (currentFilterElement) { currentFilterElement.className = ''; } currentFilterElement = filterElement; currentFilterElement.className = 'currentFilterItem'; // load new leaderboard loadLeaderboard(url); } function setPage(url) { loadLeaderboard(url, true); } /****************************************************************************** Load leaderboard data *****************************************************************************/ function loadLeaderboard(queryString, isURL) { // replace platform with current platform queryString = queryString.replace(/platform=[^&]+/, 'platform=' + currentPlatform); xmlDocs["leaderboardData"] = null; if (isURL) { loadXMLDoc(queryString, 'leaderboardData', doLeaderboardXMLReady, doLeaderboardXMLWait); // loadXMLDoc('/_includes/xml_leader_boards2.jsp.xml', 'leaderboardData', doLeaderboardXMLReady, doLeaderboardXMLWait); } else { loadXMLDoc(xmlBaseURL + '?' + queryString, 'leaderboardData', doLeaderboardXMLReady, doLeaderboardXMLWait); } //loadXMLDoc(xmlBaseURL, 'leaderboardData', doLeaderboardXMLReady, doLeaderboardXMLWait) currentQueryString = queryString; } /****************************************************************************** XML Callbacks *****************************************************************************/ function doLeaderboardXMLWait() { // display loading message in place of data table document.getElementById('leaderboard-table-container').innerHTML = '

Loading Data...

'; } function doLeaderboardXMLReady() { var leaderboardXML = xmlDocs["leaderboardData"].xml; // find the first ELEMENT_NODE node - its our root (IE will place a PROCESSING_INSTRUCTION_NODE in there) for (var childIndex = 0; childIndex < leaderboardXML.childNodes.length; childIndex++) { if (leaderboardXML.childNodes[childIndex].nodeType == Node.ELEMENT_NODE) { leaderboardXML = leaderboardXML.childNodes[childIndex]; break; } } // clean whitespace from the DOM cleanWhitespace(leaderboardXML); // extract data from xml file for (var childIndex = 0; childIndex < leaderboardXML.childNodes.length; childIndex++) { var sectionNode = leaderboardXML.childNodes[childIndex]; switch (sectionNode.nodeName) { // column names case 'ColumnNames': var columnNames = new Array(); var numColumns = sectionNode.childNodes.length; for (var columnIndex = 0; columnIndex < numColumns; columnIndex++) { columnNames[columnIndex] = sectionNode.childNodes[columnIndex].firstChild.nodeValue; switch (columnNames[columnIndex]) { case 'Persona': personaNodeName = 'Persona'; break; case 'Name': personaNodeName = 'Name'; break; } } break; // player data case 'Leaders': var players = new Array(); var numPlayers = sectionNode.childNodes.length; for (var playerIndex = 0; playerIndex < numPlayers; playerIndex++) { var leaderNode = sectionNode.childNodes[playerIndex]; players[playerIndex] = new Array(); for (var columnIndex = 0; columnIndex < numColumns; columnIndex++) { var columnNode = leaderNode.childNodes[columnIndex]; if (columnNode.childNodes[0].firstChild.nodeValue == 'Persona') { players[playerIndex][personaNodeName] = columnNode.childNodes[1].childNodes[1].firstChild.nodeValue; players[playerIndex][columnNode.childNodes[1].childNodes[0].nodeName] = columnNode.childNodes[1].childNodes[0].firstChild.nodeValue; players[playerIndex][columnNode.childNodes[1].childNodes[2].nodeName] = columnNode.childNodes[1].childNodes[2].firstChild.nodeValue; } else { players[playerIndex][columnNode.childNodes[0].firstChild.nodeValue] = columnNode.childNodes[1].firstChild.nodeValue; } } } break; // current player stats case 'MyStat': var myStats = new Array(); if (sectionNode.childNodes.length) { for (var columnIndex = 0; columnIndex < numColumns; columnIndex++) { var columnNode = sectionNode.firstChild.childNodes[columnIndex]; if (columnNode.firstChild.firstChild.nodeValue == 'Persona') { myStats[personaNodeName] = columnNode.childNodes[1].childNodes[1].firstChild.nodeValue; myStats[columnNode.childNodes[1].childNodes[0].nodeValue] = columnNode.childNodes[1].childNodes[0].firstChild.nodeValue; myStats[columnNode.childNodes[1].childNodes[2].nodeValue] = columnNode.childNodes[1].childNodes[2].firstChild.nodeValue; } else { myStats[columnNode.childNodes[0].firstChild.nodeValue] = columnNode.childNodes[1].firstChild.nodeValue; } } currentPlayerName = myStats[personaNodeName]; } break; // paging info case 'Pages': var numPageBlocks = sectionNode.childNodes.length; for (var pageBlockIndex = 0; pageBlockIndex < numPageBlocks; pageBlockIndex++) { var pageBlockNode = sectionNode.childNodes[pageBlockIndex]; switch (pageBlockNode.nodeName) { case 'PreviousPages': var previousPages = new Array(); var numPreviousPages = pageBlockNode.childNodes.length - 1; for (var pageIndex = 0; pageIndex < numPreviousPages; pageIndex++) { var page = pageBlockNode.childNodes[pageIndex + 1]; previousPages[page.childNodes[0].firstChild.nodeValue] = page.childNodes[1].firstChild.nodeValue; } break; case 'NextPages': var nextPages = new Array(); var numNextPages = pageBlockNode.childNodes.length - 1; for (var pageIndex = 0; pageIndex < numNextPages; pageIndex++) { var page = pageBlockNode.childNodes[pageIndex + 1]; nextPages[page.childNodes[0].firstChild.nodeValue] = page.childNodes[1].firstChild.nodeValue; } break; } } break; } } // write out table of players data var tableHtml = ''; tableHtml += ''; tableHtml += ''; tableHtml += ''; // column headers for (var columnIndex = 0; columnIndex < numColumns; columnIndex++) { tableHtml += ''; } tableHtml += ''; tableHtml += ''; tableHtml += ''; // current players stats (if it exists) if (myStats && myStats[personaNodeName]) { tableHtml += ''; for (var columnIndex = 0; columnIndex < numColumns; columnIndex++) { tableHtml += ''; } tableHtml += ''; } // create rows for each player for (var playerIndex = 0; playerIndex < numPlayers; playerIndex++) { var player = players[playerIndex]; tableHtml += ''; for (var columnIndex = 0; columnIndex < numColumns; columnIndex++) { if (columnNames[columnIndex] == personaNodeName) { tableHtml += '' + player[personaNodeName] + ''; } else { tableHtml += ''; } } tableHtml += ''; } // empty row tableHtml += ''; for (var columnIndex = 0; columnIndex < numColumns; columnIndex++) { tableHtml += ''; } tableHtml += ''; tableHtml += '
' + columnHeaders[columnNames[columnIndex]] + '
' + myStats[columnNames[columnIndex]] + '
' + player[columnNames[columnIndex]] + '
 
'; // write html to page document.getElementById('leaderboard-table-container').innerHTML = tableHtml; // write out paging navigation var pagingHtml = ''; // previous pages var pagingIndex = 1; if (previousPages) { // "first" link pagingHtml += '
  • << First
  • '; // "previous" link pagingHtml += '
  • < Prev
  • '; // numbered links for (pagingIndex = (numPreviousPages > 5 ? numPreviousPages - 5 : 1); pagingIndex <= numPreviousPages; pagingIndex++) { pagingHtml += '
  • ' + (pagingIndex) + '
  • '; } } // current page (show only if there are other pages) if (previousPages || nextPages) { var currentPage = pagingIndex; pagingHtml += '
  • ' + currentPage + '
  • '; } // next pages if (nextPages) { // numbered links for (var pagingIndex = currentPage + 1; pagingIndex < (numNextPages > 5 ? currentPage + 5 : currentPage + 1 + numNextPages); pagingIndex++) { pagingHtml += '
  • ' + (pagingIndex) + '
  • '; } // "next" link pagingHtml += '
  • Next >
  • '; // "last" link pagingHtml += '
  • Last >>
  • '; } // write html to the two paging modules document.getElementById('paging-top').innerHTML = pagingHtml; document.getElementById('paging-bottom').innerHTML = pagingHtml; } /****************************************************************************** Utility functions *****************************************************************************/ function isUndefined(property) { return (typeof property == 'undefined'); } function isUser(playerName) { return (currentPlayerName == playerName); } /********************************************************************** Cleaning the DOM (for Mozilla) (see http://www.codingforums.com/showthread.php?t=7028) *********************************************************************/ var notWhitespace = /\S/; function cleanWhitespace(node) { for (var x = 0; x < node.childNodes.length; x++) { var childNode = node.childNodes[x]; // remove any whitespace text nodes if ( childNode.nodeType == 3 && !notWhitespace.test(childNode.nodeValue) ) { node.removeChild(node.childNodes[x]); x--; } // recurse thru any element nodes removing whitespace if (childNode.nodeType == 1) { cleanWhitespace(childNode); } } }