var numToShow = 25;
var numOfDots = 0;
var outputEle = null;
var errEle = null;
var isSearching = false;
var isSearchingForGamertag = false;

var pathToService = "../../../XBLLeaderboardSvc/Service.asmx/";
var pathToXboxWeb = "http://live.xbox.com/en-US/profile/profile.aspx?GamerTag="
var xblResultLimit = 1000;

var gameId = 1;
var currentRank = 1;
var currentLB = 0;
var currentGameType = 0;

var titles = new Array();
titles[0] = "StandardCombinedEasy";
titles[1] = "StandardCombinedMedium";
titles[2] = "StandardCombinedHard";
titles[3] = "EnduranceCombinedEasy";
titles[4] = "EnduranceCombinedMedium";
titles[5] = "EnduranceCombinedHard";
titles[6] = "StandardSmoothOperettaEasy";
titles[7] = "StandardSmoothOperettaMedium";
titles[8] = "StandardSmoothOperettaHard";
titles[9] = "EnduranceSmoothOperettaEasy";
titles[10] = "EnduranceSmoothOperettaMedium";
titles[11] = "EnduranceSmoothOperettaHard";
titles[12] = "StandardRaveNewWorldEasy";
titles[13] = "StandardRaveNewWorldMedium";
titles[14] = "StandardRaveNewWorldHard";
titles[15] = "EnduranceRaveNewWorldEasy";
titles[16] = "EnduranceRaveNewWorldMedium";
titles[17] = "EnduranceRaveNewWorldHard";
titles[18] = "StandardWilliamTellOverloadEasy";
titles[19] = "StandardWilliamTellOverloadMedium";
titles[20] = "StandardWilliamTellOverloadHard";
titles[21] = "EnduranceWilliamTellOverloadEasy";
titles[22] = "EnduranceWilliamTellOverloadMedium";
titles[23] = "EnduranceWilliamTellOverloadHard";
titles[24] = "StandardHallOfTheMountainDudeEasy";
titles[25] = "StandardHallOfTheMountainDudeMedium";
titles[26] = "StandardHallOfTheMountainDudeHard";
titles[27] = "EnduranceHallOfTheMountainDudeEasy";
titles[28] = "EnduranceHallOfTheMountainDudeMedium";
titles[29] = "EnduranceHallOfTheMountainDudeHard";
titles[30] = "Standard1812OverdriveEasy";
titles[31] = "Standard1812OverdriveMedium";
titles[32] = "Standard1812OverdriveHard";
titles[33] = "Endurance1812OverdriveEasy";
titles[34] = "Endurance1812OverdriveMedium";
titles[35] = "Endurance1812OverdriveHard";
titles[36] = "StandardValkyriesRisingEasy";
titles[37] = "StandardValkyriesRisingMedium";
titles[38] = "StandardValkyriesRisingHard";
titles[39] = "EnduranceValkyriesRisingEasy";
titles[40] = "EnduranceValkyriesRisingMedium";
titles[41] = "EnduranceValkyriesRisingHard";
titles[42] = "StandardTailLightSonataEasy";
titles[43] = "StandardTailLightSonataMedium";
titles[44] = "StandardTailLightSonataHard";
titles[45] = "EnduranceTailLightSonataEasy";
titles[46] = "EnduranceTailLightSonataMedium";
titles[47] = "EnduranceTailLightSonataHard";
titles[48] = "StandardCarmenElectricEasy";
titles[49] = "StandardCarmenElectricMedium";
titles[50] = "StandardCarmenElectricHard";
titles[51] = "EnduranceCarmenElectricEasy";
titles[52] = "EnduranceCarmenElectricMedium";
titles[53] = "EnduranceCarmenElectricHard";
titles[54] = "StandardGameOverBeethovenEasy";
titles[55] = "StandardGameOverBeethovenMedium";
titles[56] = "StandardGameOverBeethovenHard";
titles[57] = "EnduranceGameOverBeethovenEasy";
titles[58] = "EnduranceGameOverBeethovenMedium";
titles[59] = "EnduranceGameOverBeethovenHard";
titles[60] = "StandardToccataAndFunkEasy";
titles[61] = "StandardToccataAndFunkMedium";
titles[62] = "StandardToccataAndFunkHard";
titles[63] = "EnduranceToccataAndFunkEasy";
titles[64] = "EnduranceToccataAndFunkMedium";
titles[65] = "EnduranceToccataAndFunkHard";

titles[66] = "StandardRPCombineEasy";
titles[67] = "StandardRPCombineMedium";
titles[68] = "StandardRPCombineHard";
titles[69] = "EnduranceRPCombineEasy";
titles[70] = "EnduranceRPCombineMedium";
titles[71] = "EnduranceRPCombineHard";
titles[72] = "StandardStingOfTheBumbleBeeEasy";
titles[73] = "StandardStingOfTheBumbleBeeMedium";
titles[74] = "StandardStingOfTheBumbleBeeHard";
titles[75] = "EnduranceStingOfTheBumbleBeeEasy";
titles[76] = "EnduranceStingOfTheBumbleBeeMedium";
titles[77] = "EnduranceStingOfTheBumbleBeeHard";
titles[78] = "StandardExplodeToJoyEasy";
titles[79] = "StandardExplodeToJoyMedium";
titles[80] = "StandardExplodeToJoyHard";
titles[81] = "EnduranceExplodeToJoyEasy";
titles[82] = "EnduranceExplodeToJoyMedium";
titles[83] = "EnduranceExplodeToJoyHard";
titles[84] = "StandardSugarHighEasy";
titles[85] = "StandardSugarHighMedium";
titles[86] = "StandardSugarHighHard";
titles[87] = "EnduranceSugarHighEasy";
titles[88] = "EnduranceSugarHighMedium";
titles[89] = "EnduranceSugarHighHard";
titles[90] = "StandardEineKleineRochtmusikEasy";
titles[91] = "StandardEineKleineRochtmusikMedium";
titles[92] = "StandardEineKleineRochtmusikHard";
titles[93] = "EnduranceEineKleineRochtmusikEasy";
titles[94] = "EnduranceEineKleineRochtmusikMedium";
titles[95] = "EnduranceEineKleineRochtmusikHard";
titles[96] = "StandardCannonInDEasy";
titles[97] = "StandardCannonInDMedium";
titles[98] = "StandardCannonInDHard";
titles[99] = "EnduranceCannonInDEasy";
titles[100] = "EnduranceCannonInDMedium";
titles[101] = "EnduranceCannonInDHard";
titles[102] = "StandardWeekly";
titles[103] = "EnduranceWeekly";

$j(document).ready(function(){
	startPage();
});

//Work out what leaderboard/search the user has asked for
function startPage()
{
	var winAnchor = window.location.hash;
	currentLB = 7;
	if (!winAnchor) { currentRank=1; initLBPage(currentLB,1); }
	else
	{
		handleDropDownsOnLoad();
		
		var hashArray = winAnchor.split("_");
		for (i=0; i<titles.length; i++)
		{
			if (hashArray[0] == "#"+titles[i]) { currentLB = i; break; }
		}

		if (hashArray[1] == "search") {
			$j('#gwreGamertag').val(hashArray[2]);
			getLeaderboardNearGamertag(currentLB, hashArray[2]);
		} else {
			initLBPage(currentLB, hashArray[2]);
		}
	}
}

//Handle drop-down input from user
function handleDropDowns()
{
	clearGamertagField();
	
	var gametype = parseInt($j('#gametype').val());
	var song = parseInt($j('#song').val());
	var difficulty = parseInt($j('#difficulty').val());
	
	//Swap out appropriate table header
	if (gametype == 0) { $j('#standardHeader').show(); $j('#enduranceHeader').hide(); currentGameType = 0; }
	else { $j('#standardHeader').hide(); $j('#enduranceHeader').show(); currentGameType = 1; }
	
	if (song==102)
	{
		//Difficulty does not apply on Weekly scoreboards
		currentLB = gametype + song;
		$j('#difficulty').disabled=1;
	} else {
		currentLB = (gametype*3) + song + difficulty;
		$j('#difficulty').disabled=0;
	}
	currentRank = 1;
	getLeaderboard(currentLB,currentRank);
}

//Reset drop-downs to anchor location on page load
function handleDropDownsOnLoad()
{
	clearGamertagField();
	
	var winAnchor = window.location.hash;
	var userGametype=0, userSong=0, userDifficulty=1;
	
	var gametypeList = new Array("Standard","Endurance");
	for(i=0; i<gametypeList.length; i++)
	{
		if (winAnchor.match(gametypeList[i])) { userGametype = i; break; }
	}
	
	var songList = new Array("SmoothOperetta","RaveNewWorld","WilliamTellOverload","HallOfTheMountainDude","1812Overdrive","ValkyriesRising","TailLightSonata","CarmenElectric","GameOverBeethoven","ToccataAndFunk","StingOfTheBumblebee","ExplodeToJoy","SugarHigh","EineKleineRochtmusik","CannonInD","Weekly","Combined","RPCombine");
	for(i=0; i<songList.length; i++)
	{
		if (winAnchor.match(songList[i])) { userSong = i; break; }
	}
	
	var difficultyList = new Array("Easy","Medium","Hard");
	for(i=0; i<difficultyList.length; i++)
	{
		if (winAnchor.match(difficultyList[i])) { userDifficulty = i; break; }
	}

	//Swap out appropriate table header
	if (userGametype == 0) { $j('#standardHeader').show(); $j('#enduranceHeader').hide(); currentGameType = 0; }
	else { $j('#standardHeader').hide(); $j('#enduranceHeader').show(); currentGameType = 1; }

	//Difficulty does not apply on Weekly scoreboards
	if (userSong==15) { $j('#difficulty').disabled=1; }
	else { $j('#difficulty').disabled=0; }

	$j('#gametype').attr('selectedIndex',userGametype);
	$j('#song').attr('selectedIndex',userSong);
	$j('#difficulty').attr('selectedIndex',userDifficulty);
}


function clearGamertagField()
{
	$j('#gwreGamertag').val("");
}

//Initialise everything and fetch a leaderboard
function initLBPage(pageID,rankToStart)
{
	clearGamertagField();

	if ((rankToStart!=null) && (rankToStart.toString().search(/^[0-9]+$/) == 0) && (rankToStart>0)) { currentRank = rankToStart; }
	else { currentRank = 1; }
	currentLB = pageID;
	getLeaderboard(currentLB,currentRank);
}

function prevResults()
{
	clearGamertagField();
	currentRank=parseInt(currentRank);
	currentRank-=numToShow;
	if (currentRank<1) { currentRank=1; }
	toggleButtons();
	getLeaderboard(currentLB,currentRank);
}

function nextResults()
{
	clearGamertagField();
	currentRank=parseInt(currentRank);
	currentRank+=numToShow;
	toggleButtons();
	getLeaderboard(currentLB,currentRank);
}

function toggleButtons()
{
	if (currentRank<2) { $j('#prevButton').hide(); }
	else { $j('#prevButton').show(); }
}

function doInit()
{
    outputEle = $j('#outputEle');
    errEle = $j('#errorMsg');
}

function updateDots()
{
    if (isSearching)
    {
        if (numOfDots==0) { outputEle.html("Searching"); }
        if (numOfDots > 10) { numOfDots=0; }
        else {
            numOfDots++;
            outputEle.append(".");
        }
        setTimeout("updateDots();",100);
    } else { numOfDots = 0; }
}

//Grab a new leaderboard by rank
function getLeaderboard(lbId,rankToStart)
{
    if (outputEle==null) { doInit(); }
    hideError();
    isSearching=true;
	isSearchingForGamertag=false;
    setTimeout("updateDots();",100);
	window.location.hash=encodeURIComponent(titles[lbId]+"_overall_"+rankToStart);
				
	$j.ajax({
		type:"POST",
		contentType:"application/json",
		cache:false,
		url:pathToService+"getLeaderboard",
		processData:false,
		data:"{gameId:"+gameId+",leaderboardId:"+lbId+",rankToStart:"+rankToStart+",numToShow:"+numToShow+"}",
		dataType:'json',
		success: callComplete,
		error: callError
	});
}

//Grab a new leaderboard by GamerTag
function getLeaderboardNearGamertag(lbId)
{
	var gamertag = $j('#gwreGamertag').val();
    if (outputEle==null) { doInit(); }
    if ((gamertag==null) || (gamertag.length == 0) || (gamertag.length > 15)) { handleError("gamertag"); return false; }    
    hideError();
    isSearching=true;
	isSearchingForGamertag=gamertag;
	currentRank = 0;
    setTimeout("updateDots();",100);
	window.location.hash=encodeURIComponent(titles[lbId]+"_search_"+gamertag);
				
	$j.ajax({
		type:"POST",
		contentType:"application/json",
		cache:false,
		url:pathToService+"getLeaderboardNearGamertag",
		processData:false,
		data:"{gameId:"+gameId+",leaderboardId:"+lbId+",gamerTag:\""+gamertag+"\",numToShow:"+numToShow+"}",
		dataType:'json',
		success: callComplete,
		error: callError
	});
}

//Insert data into page
function callComplete(results)
{
	isSearching=false;	
	var score=0;
	var gt="";
	var rank;
    
    if ((results.d[0] == null) || (results.d[0].length == 0) || (parseInt(results.d[0])!=(results.d[0]-0)) || (results.d[0] == "Error"))
    {
        if (results.d[1] != null) { handleError(results.d[1]); }
        else { handleError("comms"); }
		$j('#nextButton').hide();
		$j('#prevButton').hide();
        return false;
    } else {
        
        if (results.d[0] == 0)
		{
			$j('#nextButton').hide();
			$j('#prevButton').hide();
			outputEle.html("No results found. Try going <a href=\"javascript:getLeaderboard("+currentLB.toString()+",1);\">back to the top</a> of this leaderboard.");
		} else {
			buffer="";
			
			var grades = new Array();
			grades[8] = "A***";
			grades[7] = "A**";
			grades[6] = "A*";
			grades[5] = "A";
			grades[4] = "B";
			grades[3] = "C";
			grades[2] = "D";
			grades[1] = "E";
			grades[0] = "F";
			
            for(var i=0; i<results.d[0]; i++)
            {
				gt = results.d[(i*3)+2];
				score = results.d[(i*3)+3];
				rank = results.d[(i*3)+1];
				buffer += "<div class=\"resContainer";
				if (isSearchingForGamertag != false) {
					if (isSearchingForGamertag.toLowerCase() == gt.toLowerCase()) { buffer += "Highlight"; }
					if (currentRank==0) { currentRank = rank; }
				}
                buffer += "\">\n<div class=\"colLrgLeft\" style=\"text-align:left;\">"+rank+". <a href=\""+pathToXboxWeb+encodeURIComponent(gt)+"\" target=\"blank\">"+gt+"</a></div>\n";
				var BBRData = score.split("_");
				
				//Use different data for weekly and combined leaderboards
				if ((currentLB <= 5) || (currentLB >= 101) || ((currentLB >= 66) && (currentLB <= 71))) {
					buffer += "<div class=\"col\">-</div>\n<div class=\"col\">-</div>\n<div class=\"col\">-</div>\n";
					var sub = 0;
					if (currentLB<102) { sub=7; }	//Combined scoreboards don't use the 0th subscript, they use the 7th.
					buffer += "<div class=\"colLrgRight\">" + addCommas(BBRData[sub]) + "</div>\n";
				}
				else {
					if (currentGameType == 0)
					{
						//Standard mode
						buffer += "<div class=\"col\">" + grades[BBRData[1]] + "</div>\n";
						buffer += "<div class=\"col\">" + parseInt(BBRData[0] * 100) + "%</div>\n";
						buffer += "<div class=\"col\">" + parseInt(BBRData[2]) + "%</div>\n";
					} else {
						//Endurance mode
						buffer += "<div class=\"col\">" + BBRData[3] + "</div>\n";
						buffer += "<div class=\"col\">" + BBRData[4] + "</div>\n";
						var secs = parseInt(BBRData[5]%60);
						if (secs.toString().length < 2) { secs="0"+secs; }
						buffer += "<div class=\"col\">" + parseInt(BBRData[5]/60) + ":" + secs + "</div>\n";
					}
					buffer += "<div class=\"colLrgRight\">" + addCommas(BBRData[7]) + "</div>\n";
				}

				buffer += "</div>\n";
            }
			outputEle.html(buffer);
			//animResults(0,$j('.resContainer').length);
			
			//Hide next and previous buttons if applicable
			if (results.d[0] < numToShow) { $j('#nextButton').hide(); }
			else { $j('#nextButton').show(); }
			toggleButtons();
			
			//Hide both previous and next if past XBL result limit
			if (results.d[1] > xblResultLimit-numToShow) { $j('#nextButton').hide(); $j('#prevButton').hide(); }
        }
    }
	
	isSearchingForGamertag=false;
}

//Animate the rows in
function animResults(index,numToLoop)
{
	if (index < numToLoop) {
		$j('.resContainer').eq(index).slideToggle(15,function() { animResults(index + 1,numToLoop); });//, animResults(index + 1,numToLoop));
	}
}

//From http://www.mredkj.com/javascript/nfbasic.html
function addCommas(nStr)
{
	nStr += '';
	x = nStr.split('.');
	x1 = x[0];
	x2 = x.length > 1 ? '.' + x[1] : '';
	var rgx = /(\d+)(\d{3})/;
	while (rgx.test(x1)) {
		x1 = x1.replace(rgx, '$1' + ',' + '$2');
	}
	return x1 + x2;
}

function callError(error) { isSearching=false; handleError("comms"); return false; }

//Deal with all errors
function handleError(errorCode)
{
    errEle.show();
    switch (errorCode)
    {
        case "comms":
            errEle.html("A communications error has occured. Please try again in a few minutes.");
            break;
        case "gamertag":
            errEle.html("Please fill in a valid GamerTag");
            break;
        default:
            errEle.html("An error has occured! Code: "+errorCode);
            break;
    }
	
	errEle.append("<br/>If this error continues to occur, please contact the <a href=\"mailto:webdev@bizarrecreations.com\">Web Team</a>.");
}

function hideError() { errEle.hide(); }