/***
	www.ludogene.com
	You may grab some things if you like, but that would be kind to
	say so by sending an email to denys.seguret @ gmail.com
***/

var page_gameVariant = "Pionmor 2 players";
var page_userNickname = "dys";
var page_pageIndex = 0;


/**********************************************************************************************************
	class			LudoMatchPlayer
**********************************************************************************************************/
function LudoMatchPlayer(index, nickname, score) {
	this.index = index;
	this.nickname = nickname;
	this.score = score;
}

/**********************************************************************************************************
	class			LudoMatch
**********************************************************************************************************/
function LudoMatch(id, gameVariant, lastActionDate, players, state) {
	this.id = id;
	this.gameVariant = gameVariant;
	this.lastActionDate = lastActionDate;
	this.players = players; // tableau de instances de LudoMatchPlayer
	this.state = state;
}

/**********************************************************************************************************
	class			LudoMatchesList
**********************************************************************************************************/
function LudoMatchesList(matches, pageIndex, pageNumber, pageSize) {
	this.matches = matches; // instances de LudoMatch
	this.pageIndex = pageIndex;
	this.pageNumber = pageNumber;
	this.pageSize = pageSize;
}


/**********************************************************************************************************
			Ludo_getHTTPObject
**********************************************************************************************************/
function Ludo_getHTTPObject()
{
  var xmlhttp = false;

  /* Compilation conditionnelle IE */
  /*@cc_on
  @if (@_jscript_version >= 5)
     try
     {
        xmlhttp = new ActiveXObject("Msxml2.XMLHTTP");
     }
     catch (e)
     {
        try
        {
           xmlhttp = new ActiveXObject("Microsoft.XMLHTTP");
        }
        catch (E)
        {
           xmlhttp = false;
        }
     }
  @else
     xmlhttp = false;
  @end @*/

  /* on essaie de creer l'objet si ce n'est pas deja fait */
  if (!xmlhttp && typeof XMLHttpRequest != 'undefined')
  {
     try
     {
        xmlhttp = new XMLHttpRequest();
     }
     catch (e)
     {
        xmlhttp = false;
     }
  }

  return xmlhttp;
}

/**********************************************************************************************************
			Ludo_getElementTextNS
**********************************************************************************************************/
function Ludo_getElementTextNS(prefix, local, parentElem, index) {
    var result = "";
    if (prefix && isIE) {
        // IE/Windows way of handling namespaces
        result = parentElem.getElementsByTagName(prefix + ":" + local)[index];
    } else {
        // the namespace versions of this method 
        // (getElementsByTagNameNS()) operate
        // differently in Safari and Mozilla, but both
        // return value with just local name, provided 
        // there aren't conflicts with non-namespace element
        // names
        result = parentElem.getElementsByTagName(local)[index];
    }
    if (result) {
        // get text, accounting for possible
        // whitespace (carriage return) text nodes 
        if (result.childNodes.length > 1) {
            return result.childNodes[1].nodeValue;
        } else {
            return result.firstChild.nodeValue;
        }
    } else {
        return "n/a";
    }
}



/**********************************************************************************************************
			Ludo_getPieceImg
			
**********************************************************************************************************/
function Ludo_getPieceImg(playerIndex, gameVariant) {
	if (gameVariant=="Flore 2 players size 8") {
		if (playerIndex==0) return "piece_flore_blue.png";
		else return "piece_flore_red.png";
	} else if (gameVariant=="Pionmor 2 players") {
		if (playerIndex==0) return "piece_pionmor_blue.png";
		else return "piece_pionmor_red.png";
	} else if (gameVariant=="Pionmor 4 players" || gameVariant=="Pionmor 3 players") {
		if (playerIndex==0) return "piece_pionmor_blue.png";
		else if (playerIndex==1) return "piece_pionmor_yellow.png";
		else if (playerIndex==2) return "piece_pionmor_red.png";
		else return "piece_pionmor_green.png";
	} else if (gameVariant=="Syndicat") {
		if (playerIndex==0) return "piece_syndicat_black.png";
		else return "piece_syndicat_white.png";
	} else if (gameVariant=="Tribo 2 players") {
		if (playerIndex==0) return "piece_tribo_white.png";
		else return "piece_tribo_black.png";
	} else return "";
}


/**********************************************************************************************************
			Ludo_getGameVariantShortLabel
			
**********************************************************************************************************/
function Ludo_getGameVariantShortLabel(gameVariant) {
	if (gameVariant=="Flore 2 players size 8") return "Flore";
	else if (gameVariant=="Pionmor 2 players") return "Pionmor";
	else if (gameVariant=="Tribo 2 players") return "Tribo";
	return gameVariant;
}

/**********************************************************************************************************
			Ludo_fillBestPlayersDiv
			
			remplit la petite liste (menu de gauche) des 5 meilleurs joueurs
**********************************************************************************************************/
function Ludo_fillBestPlayersDiv(gameVariant, divTitle) {
	var d = document.getElementById("bestPlayers-"+divTitle);
	if (!d) return;
	var xmlhttp = Ludo_getHTTPObject();
	if (xmlhttp) {
		d.innerHTML = "Loading...";
		xmlhttp.onreadystatechange=function() {
 			if (xmlhttp.readyState == 4) { /* 4 : etat "complete" */
 				if (xmlhttp.status == 200) /* 200 : code HTTP pour OK */ {
					var bpDivContent = "<table id=bestPlayersTitle width=100% border=0 cellpadding=4 cellspacing=0><tr><th colspan=2><a href=players.php?gameVariant="+encodeURIComponent(gameVariant)+">Best players<br>" + divTitle + "</a></th></tr></table>";
					bpDivContent += "<table id=bestPlayersTable width=100% border=0 cellpadding=4 cellspacing=0>";
					for(index=0;index<5;index++) {
						player = xmlhttp.responseXML.getElementsByTagName("Player")[index];
						if (!player) break;
						var playerId = Ludo_getElementTextNS(null, "playerId", player, 0);
						var playerScore = Ludo_getElementTextNS(null, "score", player, 0);
						bpDivContent += "<tr><th align=center><a href=playerProfile.php?userNickname="+playerId+">" + playerId + "</a></th><td align=right>" + playerScore + "</td></tr>";
					}
					bpDivContent += "</table><br>";
					d.innerHTML = bpDivContent;
				}
			}
		}
		xmlhttp.open("GET", "/ludogenes_webapp/bestPlayers-xml.jsp?pageSize=5&variantId="+encodeURIComponent(gameVariant),true);
		xmlhttp.send(null);
	}
}

/**********************************************************************************************************
			Ludo_fillPlayersDiv
			
			remplit la liste de tous les joueurs (page "players.php")
**********************************************************************************************************/
function Ludo_fillPlayersDiv() {
	var d = document.getElementById("playersList");
	if(!d) return;
	var xmlhttp = Ludo_getHTTPObject();
	if (xmlhttp) {
		d.innerHTML = "Loading...";
		var numero = 0;
		xmlhttp.onreadystatechange=function() {
 			if (xmlhttp.readyState == 4) { /* 4 : etat "complete" */
 				if (xmlhttp.status == 200) /* 200 : code HTTP pour OK */ {
					var bpDivContent = "<table id=playersTable width=100% border=0 cellpadding=4 cellspacing=0><tr><td align=right>#</td><th>Player</th><th>Matches</th><th>Finished</th><th>Score</th><th>Awards</th></tr>";
					for(index=0;;index++) {
						player = xmlhttp.responseXML.getElementsByTagName("Player")[index];
						if (!player) break;
						numero++;
						var playerId = Ludo_getElementTextNS(null, "playerId", player, 0);
						var playerScore = Ludo_getElementTextNS(null, "score", player, 0);
						var nbFinishedMatches = parseInt(Ludo_getElementTextNS(null, "nbFinishedMatches", player, 0));
						var nbMatchesInProgress = parseInt(Ludo_getElementTextNS(null, "nbMatchesInProgress", player, 0));
						var nbTotalMatches = nbFinishedMatches + nbMatchesInProgress;
						var playerPercentFinishedGames = nbTotalMatches>0 ? Math.round((nbFinishedMatches*100)/nbTotalMatches) : 0;
						bpDivContent += "<tr><td align=right>"+numero+"</td><th><a href=playerProfile.php?userNickname="+encodeURIComponent(playerId)+">" + playerId + "</a></th><td>" + nbTotalMatches + "</td><td>";
						if (playerPercentFinishedGames<80) bpDivContent += "<font color=red>"+playerPercentFinishedGames+" %</font>";
						else bpDivContent += playerPercentFinishedGames+" %";
						bpDivContent += "</td><td>" + playerScore + "</td><td>-</td></tr>";
					}
					bpDivContent += "</table>";
					d.innerHTML = bpDivContent;
				}
			}
		}
		xmlhttp.open("GET", "/ludogenes_webapp/bestPlayers-xml.jsp?pageSize=20&variantId="+encodeURIComponent(page_gameVariant),true);
		xmlhttp.send(null);
	}
}

/********************************************************************************************************** 	
			Ludo_fillPlayerProfileDiv
			
			remplit le profil du joueur courant
**********************************************************************************************************/
function Ludo_fillPlayerProfileDiv() {
	var d = document.getElementById("playerProfile");
	if(!d) return;
	var divContent = "<center>";
	var xmlhttp = Ludo_getHTTPObject();
	if (xmlhttp) {
		d.innerHTML = "Loading...";
		xmlhttp.onreadystatechange=function() {
 			if (xmlhttp.readyState == 4) { /* 4 : etat "complete" */
 				if (xmlhttp.status == 200) /* 200 : code HTTP pour OK */ {
 					var d = document.getElementById("playerProfile");
					if(!d) return;
 					user = xmlhttp.responseXML.getElementsByTagName("User")[0];
					var userType = Ludo_getElementTextNS(null, "type", user, 0);
					var phpbbId = Ludo_getElementTextNS(null, "phpbbId", user, 0);
					
					var divContent = "<h2>Player profile</h2>";
					divContent += "<br><b>Type : </b>";
					if (userType=="AI") {
						divContent += "Artificial Intelligence";
					} else {
						divContent += "probably human";
						divContent += "<br><b>Forum profile : </b> <a href=/phpbb2/profile.php?mode=viewprofile&u="+phpbbId+">" + page_userNickname +"</a>";
					}
					
					divContent += "<br><br><table id=playersTable width=100% border=0 cellpadding=4 cellspacing=0><tr><th>Game</th><th>Matches</th><th>Finished</th><th>Score</th><th>Awards</th></tr>";
					for (infoIndex=0;;infoIndex++) {
						var info = user.getElementsByTagName("UserGameInfo")[infoIndex];
						if (!info) break;
						var gameVariant = Ludo_getElementTextNS(null, "variantId", info, 0);
						var gameVariantLabel = Ludo_getGameVariantShortLabel(gameVariant);
						var playerScore = Ludo_getElementTextNS(null, "score", info, 0);
						var nbFinishedMatches = parseInt(Ludo_getElementTextNS(null, "nbFinishedMatches", info, 0));
						var nbMatchesInProgress = parseInt(Ludo_getElementTextNS(null, "nbMatchesInProgress", info, 0));
						var nbTotalMatches = nbFinishedMatches + nbMatchesInProgress;
						var playerPercentFinishedGames = nbTotalMatches>0 ? Math.round((nbFinishedMatches*100)/nbTotalMatches) : 0;
						divContent += "<tr><th><a href=players.php?gameVariant="+encodeURIComponent(gameVariant)+">"+gameVariantLabel+"</a></th>";
						divContent += "<td>" + nbTotalMatches + "</td><td>";
						if (playerPercentFinishedGames<80) divContent += "<font color=red>"+playerPercentFinishedGames+" %</font>";
						else divContent += playerPercentFinishedGames+" %";
						divContent += "</td><td>" + playerScore + "</td><td>-</td></tr>";
					}
					
					divContent += "</table>";
					
					d.innerHTML = divContent;
				}
			}
		}
		xmlhttp.open("GET", "/ludogenes_webapp/userProfile-xml.jsp?user="+encodeURIComponent(page_userNickname),true);
		xmlhttp.send(null);
	}
	divContent += "</center>";
	d.innerHTML = divContent;
}

/********************************************************************************************************** 	
			Ludo_fetchMatches
			
			remplit la liste des matches (ne l'affiche pas)
			Le userNickname est optionnel
**********************************************************************************************************/
function Ludo_fetchMatches(drawingFunction, userNickname) {
	var xmlhttp = Ludo_getHTTPObject();
	if (xmlhttp) {
		xmlhttp.onreadystatechange=function() {
 			if (xmlhttp.readyState == 4) { /* 4 : etat "complete" */
 				if (xmlhttp.status == 200) /* 200 : code HTTP pour OK */ {
 					matchesList = xmlhttp.responseXML.getElementsByTagName("MatchesList")[0];
					var pageNumber = matchesList.getAttribute("nbPages");
					var matchesArray = new Array;
					var matchesArrayLength = 0;
					for(index=0;;index++) {
						match = matchesList.getElementsByTagName("Match")[index];
						if (!match) break;
						var matchId = parseInt(Ludo_getElementTextNS(null, "id", match, 0));
						var gameVariant = Ludo_getElementTextNS(null, "gameVariant", match, 0);
						var lastActionDate = Ludo_getElementTextNS(null, "lastActionDate", match, 0);
						var state =  Ludo_getElementTextNS(null, "state", match, 0);
						var playersArray = new Array;						
						for (i=0;;i++) {
							matchPlayer = match.getElementsByTagName("Player")[i];
							if (!matchPlayer) break;
							var playerIndex = parseInt(Ludo_getElementTextNS(null, "index", matchPlayer, 0));
							var playerNickname = Ludo_getElementTextNS(null, "nickname", matchPlayer, 0);
							var playerScore = parseInt(Ludo_getElementTextNS(null, "score", matchPlayer, 0));
							playersArray[i] = new LudoMatchPlayer(playerIndex, playerNickname, playerScore);
						}
						matchesArray[matchesArrayLength++] = new LudoMatch(matchId, gameVariant, lastActionDate, playersArray, state);
					}
					var ml = new LudoMatchesList(matchesArray, page_pageIndex, pageNumber, 10);
					if(drawingFunction) drawingFunction(ml);
				}
			}
		}
		var xmlURI = "/ludogenes_webapp/matches-xml.jsp?pageIndex="+page_pageIndex+"&pageSize=10&sorting=date";
		if (userNickname) {
			xmlURI += "&player="+encodeURIComponent(userNickname);
		}
		xmlhttp.open("GET", xmlURI, true);
		xmlhttp.send(null);
	}
}

/********************************************************************************************************** 	
			Ludo_drawPlayerMatchesDiv
			
			remplit la liste des matches du joueur courant.
			Se base sur la matchesList qui lui est passée
**********************************************************************************************************/
function Ludo_drawPlayerMatchesDiv(matchesList) {
	var d = document.getElementById("playerMatches");
	if(!d) return;
	var divContent = "<center>";
	var pageNumberDiv = document.getElementById("nbPages");
	if (pageNumberDiv) pageNumberDiv.innerHTML = matchesList.pageNumber;

	var divContent = "<table id=matchesTable width=100% border=0 cellpadding=4 cellspacing=0><tr><th>Game</th><th>Date</th><th>Status</th><th>Opponent(s)</th><th>Score</th><th>View</th></tr>";
	for(index=0; index<matchesList.matches.length; index++) {
		match = matchesList.matches[index];
		var requestorScore = 0;
		var maxAdverseScore = -99999; // TODO regarder si on a un MIN_VALUE sur les entiers javascript...
		var opponentsList = "";
		var userIndex=0;
		for (p=0; p<match.players.length; p++) {
			matchPlayer = match.players[p];
			if (matchPlayer.nickname==page_userNickname) {
				requestorScore = matchPlayer.score;
				userIndex = matchPlayer.index;
			} else {
				if (maxAdverseScore<matchPlayer.score) {
					maxAdverseScore = matchPlayer.score;
				}
				opponentsList += " <a href=playerProfile.php?userNickname="+encodeURIComponent(matchPlayer.nickname)+">" + matchPlayer.nickname + "</a> ";
			}
		}
		requestorScore -= maxAdverseScore;
		divContent += "<tr><td align=left><img src=\"img/" + Ludo_getPieceImg(userIndex, match.gameVariant) + "\"> &nbsp;"+Ludo_getGameVariantShortLabel(match.gameVariant)+"</td><td>" + match.lastActionDate + "</td>";
		divContent += "<td>" + match.state + "</td>";
		divContent += "<th>" + opponentsList + "</th><td>" + requestorScore + "</td>";
		divContent += "<td><a onMouseOver=\"popImage('/ludogenes_webapp/matchView-png.jsp?match="+match.id+"', "+(match.state=='P')+");style.cursor='pointer';\"  onMouseOut=\"disparaitre();\"><img src=img/CriEye.jpg border=0></a></td>";
		divContent += "</tr>";
	}
	divContent += "</table>";
	divContent += "</center>";
	d.innerHTML = divContent;
}

/********************************************************************************************************** 	
			Ludo_drawAllMatchesDiv
			
			remplit la liste des matches du joueur courant.
			Se base sur la matchesList qui lui est passée
**********************************************************************************************************/
function Ludo_drawAllMatchesDiv(matchesList) {
	var d = document.getElementById("allMatches");
	if(!d) return;
	var divContent = "<center>";
	var pageNumberDiv = document.getElementById("nbPages");
	if (pageNumberDiv) pageNumberDiv.innerHTML = matchesList.pageNumber;

	var divContent = "<table id=matchesTable width=100% border=0 cellpadding=4 cellspacing=0><tr><th>Game</th><th>Date</th><th>Status</th><th>Player</th><th>Score</th><th>View</th></tr>";
	for(index=0; index<matchesList.matches.length; index++) {
		match = matchesList.matches[index];
		divContent += "<tr><td align=left rowspan="+match.players.length+">"+Ludo_getGameVariantShortLabel(match.gameVariant)+"</td><td rowspan="+match.players.length+">" + match.lastActionDate + "</td>";
		divContent += "<td rowspan="+match.players.length+">" + match.state + "</td>";
		divContent += "<th><img src=\"img/" + Ludo_getPieceImg(match.players[0].index, match.gameVariant) + "\"> &nbsp; <a href=playerProfile.php?userNickname="+encodeURIComponent(match.players[0].nickname)+">" + match.players[0].nickname + "</a></th><td>" + match.players[0].score + "</td>";
		divContent += "<td rowspan="+match.players.length+"><a onMouseOver=\"popImage('/ludogenes_webapp/matchView-png.jsp?match="+match.id+"', "+(match.state=='P')+");style.cursor='pointer';\"  onMouseOut=\"disparaitre();\"><img src=img/CriEye.jpg border=0></a></td>";
		divContent += "</tr>";
		for (p=1; p<match.players.length; p++) {
			divContent += "<tr>";
			divContent += "<th><img src=\"img/" + Ludo_getPieceImg(match.players[p].index, match.gameVariant) + "\"> &nbsp; <a href=playerProfile.php?userNickname="+encodeURIComponent(match.players[p].nickname)+">" + match.players[p].nickname + "</a></th><td>" + match.players[p].score + "</td>";
			divContent += "</tr>";
		}
		
	}
	divContent += "</table>";
	divContent += "</center>";
	d.innerHTML = divContent;
}


/********************************************************************************************************** 	
			Ludo_fillMatchesDivs
			
			remplit les listes de matches
**********************************************************************************************************/
function Ludo_fillMatchesDivs() {
	var d1 = document.getElementById("playerMatches");
	var mustRefresh = false;
	if(d1) {
		Ludo_fetchMatches(Ludo_drawPlayerMatchesDiv, page_userNickname);
		mustRefresh = true;
	}
	
	d2 = document.getElementById("allMatches");
	if(d2) {
		Ludo_fetchMatches(Ludo_drawAllMatchesDiv);
		mustRefresh = true;
	}
	
	if (mustRefresh) {
		setTimeout(Ludo_fillMatchesDivs, 5000);
	}
}

/**********************************************************************************************************
			Ludo_setGameVariant
**********************************************************************************************************/
function Ludo_setGameVariant(gameVariant) {
	page_gameVariant = gameVariant;
	Ludo_fillPlayersDiv();
}

/**********************************************************************************************************
			Ludo_setUserNickname
**********************************************************************************************************/
function Ludo_setUserNickname(nickname) {
	page_userNickname = nickname;
	Ludo_fillMatchesDivs();
}


/**********************************************************************************************************
			Ludo_changeMatchesListPageIndex
**********************************************************************************************************/
function Ludo_changeMatchesListPageIndex(modif) {
	page_pageIndex = parseInt(document.forms.matchesNavForm.pageIndexField.value)-1;
	page_pageIndex += modif;
	if (page_pageIndex<0) page_pageIndex=0;
	document.forms.matchesNavForm.pageIndexField.value = page_pageIndex+1;
	Ludo_fillMatchesDivs();
}

/**********************************************************************************************************
			Ludo_postLoad
**********************************************************************************************************/
function Ludo_postLoad() {
	Ludo_fillBestPlayersDiv("Flore 2 players size 8", "Flore");
	Ludo_fillBestPlayersDiv("Pionmor 2 players", "Pionmor");
	Ludo_fillBestPlayersDiv("Syndicat", "Syndicat");
	Ludo_fillBestPlayersDiv("Tribo 2 players", "Tribo");
	Ludo_fillPlayersDiv();
	Ludo_fillPlayerProfileDiv();
	Ludo_fillMatchesDivs();
}

