function AjaxUser() {
	AjaxUser.baseConstructor.call(this);
	
	this.useXML = true;
	this.scriptNameAndArguments = "/app/ajax/userFormParser.php";
}

extend(AjaxUser, AjaxInterface); //in Utilities.js, included in html file that includes this js file

var useremail; //global for reference from other js files

//this is how you override a superclass' function
AjaxUser.prototype.actOnResponse = function(responseText) {
	var action = responseText.getElementsByTagName('action')[0];
	var actionType = getNodeValue(action,'type');
	var data = action.getElementsByTagName('data')[0];
	
	document.body.style.cursor = "default";
	
	switch(actionType){
		case "justrankings":
			updateRankingsTable(data);
			runPostAjaxOnload();
			break;
		case "alluserinfo":
			var user = data.getElementsByTagName('user')[0];
			var username = getNodeValue(user,'username');
			var email = getNodeValue(user,'email');
			useremail = email; //set global
			var credits = 1 * getNodeValue(user,'credits');
			var reuptotal = getNodeValue(user,'reuptotal');
			var winningfinishes = getNodeValue(user,'winningfinishes');
			var losingfinishes = getNodeValue(user,'losingfinishes');
			var totalgames = 1 * getNodeValue(user,'totalgames');
			var usercount = getNodeValue(user,'usercount');
			var place = getNodeValue(user,'place');
			var tokens = getNodeValue(user,'tokens');
			var runninggame = getNodeValue(user,'runninggame');
			var runninggameid = getNodeValue(user,'runninggameid');
			
			var lastGameCredits = 0;
			if(totalgames == 0) {
				var systemGreeting = document.getElementById('systemGreeting');
				systemGreeting.style.display = 'block';
			} else {
				var lastGamePlace = getNodeValue(user,'lastGamePlace');
				var lastGameCredits = getNodeValue(user,'lastGameCredits');
				var lastGameTokens = getNodeValue(user,'lastGameTokens');
				var robotAvgYearlyProfit = 1 * getNodeValue(user,'robotAvgYearlyProfit');
				var startingCash = getNodeValue(user,'startingCash');
				
				jQuery('#resultGameID').text(getNodeValue(user,'lastGameID'));
			
				var resultPlace = document.getElementById('resultPlace');
				removeNodeChildren(resultPlace);
				resultPlace.appendChild(document.createTextNode(ordinalize(lastGamePlace)));
				
				var resultPayout = document.getElementById('resultPayout');
				removeNodeChildren(resultPayout);
				resultPayout.appendChild(document.createTextNode(lastGameCredits));
				
				var resultTokens = document.getElementById('resultTokens');
				removeNodeChildren(resultTokens);
				resultTokens.appendChild(document.createTextNode(lastGameTokens));
							
				var playerStats = data.getElementsByTagName('playerStats')[0];
				if(playerStats != undefined)
					var players = playerStats.getElementsByTagName('player');
				
				var results = document.getElementById('results');
				if(players == undefined || players.length == 0){
					results.style.display = 'none';
				} else {
					results.style.display = 'block';

					if(players.length == 1){
						var averageYearlyProfit = 1 * getNodeValue(players[0],'averageYearlyProfit');
						
						jQuery("#1pMessage").show();
						
						if(robotAvgYearlyProfit > averageYearlyProfit) {
							jQuery("#1pMessageNot").show();
						} else {
							jQuery("#1pMessageNot").hide();
						}
						
						jQuery("#1pMessageComputer").text(round(robotAvgYearlyProfit,2));
						jQuery("#1pMessageYou").text(round(averageYearlyProfit,2));
					} else {
						jQuery("#1pMessage").hide();
					}
					
					var theTable = document.getElementById("resultsTableBody");
					removeNodeChildren(theTable);
					
					for(var i = 0; i < players.length; i++){
						var playerName = getNodeValue(players[i],'playerName');
						var cashAccount = 1 * getNodeValue(players[i],'cashAccount');
						var propertiesValue = 1 * getNodeValue(players[i],'propertiesValue');
						var propertiesInitialValue = 1 * getNodeValue(players[i],'propertiesInitialValue');
						var netIncome = 1 * getNodeValue(players[i],'netIncome');
						
						var netWorth = cashAccount + propertiesValue;
						var netWorthDelta = round((netWorth - startingCash) / startingCash * 100,0);
						var buildingValueDelta = propertiesValue - propertiesInitialValue;
						var buildingValueDeltaDelta = round(buildingValueDelta / propertiesInitialValue * 100,0);
						
						if(propertiesInitialValue == 0)
							buildingValueDeltaDelta = 0;
						
						var theRow = document.createElement("tr");
						theTable.appendChild(theRow);
						var theCell = document.createElement("td");
						theCell.appendChild(document.createTextNode(playerName));
						theRow.appendChild(theCell);
						theCell = document.createElement("td");
						theCell.appendChild(document.createTextNode(round(netWorth,2) + " {" + netWorthDelta + "%}"));
						theRow.appendChild(theCell);
						theCell = document.createElement("td");
						theCell.appendChild(document.createTextNode(round(buildingValueDelta,2) + " {" + buildingValueDeltaDelta + "%}"));
						theRow.appendChild(theCell);
						theCell = document.createElement("td");
						theCell.appendChild(document.createTextNode(round(netIncome,2)));
						theRow.appendChild(theCell);
					}
				}
			}
			
			if(credits - lastGameCredits == 0) { //need to account for last game payoutS
				var systemReUp = document.getElementById('systemReUp');
				systemReUp.style.display = 'block';
			}
			/*
			var username1 = document.getElementById("username1");
			removeNodeChildren(username1);
			username1.appendChild(document.createTextNode(username));
			*/
			var username2 = document.getElementById("username2");
			removeNodeChildren(username2);
			username2.appendChild(document.createTextNode(username));
			
			var emailField = document.getElementById("email");
			removeNodeChildren(emailField);
			emailField.appendChild(document.createTextNode(email));
			
			var creditsField = document.getElementById("credits");
			removeNodeChildren(creditsField);
			creditsField.appendChild(document.createTextNode(credits));
			
			var reUpTotalField = document.getElementById("reUpTotal");
			removeNodeChildren(reUpTotalField);
			reUpTotalField.appendChild(document.createTextNode(reuptotal));
			
			var winningFinishesField = document.getElementById("winningFinishes");
			removeNodeChildren(winningFinishesField);
			winningFinishesField.appendChild(document.createTextNode(winningfinishes));
			
			var losingFinishesField = document.getElementById("losingFinishes");
			removeNodeChildren(losingFinishesField);
			losingFinishesField.appendChild(document.createTextNode(losingfinishes));
			
			var totalGamesField = document.getElementById("totalGames");
			removeNodeChildren(totalGamesField);
			totalGamesField.appendChild(document.createTextNode(totalgames));
			/*
			var nUsersField = document.getElementById("nUsers");
			removeNodeChildren(nUsersField);
			nUsersField.appendChild(document.createTextNode(usercount));
			
			var myPlaceField = document.getElementById("myPlace");
			removeNodeChildren(myPlaceField);
			myPlaceField.appendChild(document.createTextNode(place));
			*/
			var tokensField = document.getElementById("tokens");
			removeNodeChildren(tokensField);
			tokensField.appendChild(document.createTextNode(tokens));
			
			if(runninggame == "true"){
				document.getElementById("systemGameRunningHref").onclick = function(){returnToGame(runninggameid)};
				document.getElementById("systemGameRunning").style.display = 'block';
			}
			
			updateRankingsTable(data);
			runPostAjaxOnload();
			break;
		case "changepassword":
			var message = getNodeValue(data,'message');
			if(message == "success") {
				document.getElementById("changePasswordTable").style.display = "none";  //hide change password input stuff
				if(getNodeValue(data,'isnew') == "true") {
					document.getElementById("changePasswordNewUser").style.display = "block";
				} else {
					document.getElementById("changePasswordExistingUser").style.display = "block";
				}
				//getLoginStatus(); //from dynamicHeader.js  -- hmm, was having display issues with this...
			}
			else {
				document.getElementById("activationPasswordErrors").style.display = "block";
				document.getElementById("invalidActivationURL").style.display = "block";
			}
			break;
		case "changeemail":
			var message = getNodeValue(data,'message');
			if(message == "success") {
				document.getElementById("changeEmailInput").style.display = "none";
				var newEmailInMessage = document.getElementById("newEmailInMessage");
				removeNodeChildren(newEmailInMessage);
				newEmailInMessage.appendChild(document.createTextNode(document.getElementById("newEmail").value));
				document.getElementById("changeEmailConfirmation").style.display = "block";
			} else {
				document.getElementById("errorEmailExists").style.display = "block";
				document.getElementById("changeEmailError").style.display = "block";
			}
			break;
		case "confirmemailchange":
			var message = getNodeValue(data,'message');
			if(message != "success") {
				document.getElementById("invalidURL").style.display = "block";
				document.getElementById("changeEmailConfirmationErrors").style.display = "block";
				document.getElementById("changeEmailConfirmationSuccess").style.display = "none";
			} else {
				var email = getNodeValue(data,'email');
				var changeEmailNewEmail = document.getElementById("changeEmailNewEmail");
				removeNodeChildren(changeEmailNewEmail);
				changeEmailNewEmail.appendChild(document.createTextNode(email));
			}
			break;
		case "error":
			var error = getNodeValue(data,'message');
			alert("Error: " + error);
			window.location = "/login/";
			break;
		default:
			alert("AJAX return action not recognized: \n" + responseText.text);
	}
};

function updateRankingsTable(data){
	var rankings = data.getElementsByTagName('rankings')[0];
	rankings = rankings.getElementsByTagName('ranking');
	var leaderboard = document.getElementById("sidebar-leaderboard-body");
	removeNodeChildren(leaderboard);
	
	for(var i=0; i < rankings.length; i++) {
		var tr = document.createElement('tr');
		
		var td = document.createElement('td');
		td.appendChild(document.createTextNode(getNodeValue(rankings[i],'place')));
		tr.appendChild(td);
		
		td = document.createElement('td');
		td.appendChild(document.createTextNode(getNodeValue(rankings[i],'username')));
		tr.appendChild(td);
		
		td = document.createElement('td');
		td.appendChild(document.createTextNode(getNodeValue(rankings[i],'balance')));
		tr.appendChild(td);
		
		leaderboard.appendChild(tr);
	}
}

function getAllUserInfo(){
	hideNotifications();
	document.getElementById("playerWaitingMessage").style.color = '#FFFFFF';
	//hideDummy();        called in dynamicHeader.js

	document.body.style.cursor = "wait";
	var myAjaxUser = new AjaxUser();
	myAjaxUser.data = "action=alluserinfo";
	myAjaxUser.send();
}

function getRankings(){
	document.body.style.cursor = "wait";
	var myAjaxUser = new AjaxUser();
	myAjaxUser.data = "action=justrankings";
	myAjaxUser.send();
}

function submitEnterPassword(event) {
	if(gotEnter(event)) {
		changePassword();
	}
}

function changePassword(){
	var passwordNoMatch = document.getElementById("passwordNoMatch");
	var passwordInvalidChar = document.getElementById("passwordInvalidChar");
	var invalidActivationURL = document.getElementById("invalidActivationURL");
	
	var password = document.getElementById("password");
	var passwordConfirm = document.getElementById("passwordConfirm");
	var urlParts = window.location.search.split('?');
	
	var gotError = false;
	var activationPasswordErrors = document.getElementById("activationPasswordErrors");
	if(password.value != passwordConfirm.value) {
		gotError = true;
		passwordNoMatch.style.display = "block";
	}
	else {
		passwordNoMatch.style.display = "none";
	}
	passwordInvalidChar.style.display = "none";            //not checking this yet
	invalidActivationURL.style.display = "none";
	/* not checking this since we can arrive here without key in URL from account page
	if(urlParts.length < 2) {
		gotError = true;
		invalidActivationURL.style.display = "block";
	}
	else {
		invalidActivationURL.style.display = "none"
	}
	*/
	if(gotError == true) {
		activationPasswordErrors.style.display = "block";
		return;
	}
	else {
		activationPasswordErrors.style.display = "none";
	}
	
	var key = "";
	if(urlParts.length > 1) {
		key = urlParts[1];
	}
	
	document.body.style.cursor = "wait";
	var myAjaxUser = new AjaxUser();
	myAjaxUser.data = "action=changepassword&password=" + password.value + "&key=" + key;
	myAjaxUser.send();
}

function submitEnterEmail(event) {
	if(gotEnter(event)) {
		changeEmail();
	}
}

function changeEmail(){
	var errorEmailInvalid = document.getElementById("errorEmailInvalid");
	var errorEmailNoMatch = document.getElementById("errorEmailNoMatch");
	
	var newEmail = document.getElementById("newEmail");
	var confirmNewEmail = document.getElementById("confirmNewEmail");
	
	var gotError = false;
	var changeEmailError = document.getElementById("changeEmailError");
	if(newEmail.value != confirmNewEmail.value) {
		gotError = true;
		errorEmailNoMatch.style.display = "block";
	}
	else {
		errorEmailNoMatch.style.display = "none";
	}
	if(!isEmailValid(newEmail.value)) {
		gotError = true;
		errorEmailInvalid.style.display = "block";
	}
	else {
		errorEmailInvalid.style.display = "none";
	}
	
	if(gotError == true) {
		changeEmailError.style.display = "block";
		return;
	}
	else {
		changeEmailError.style.display = "none";
	}
	
	document.body.style.cursor = "wait";
	var myAjaxUser = new AjaxUser();
	myAjaxUser.data = "action=changeemail&email=" + newEmail.value;
	myAjaxUser.send();
}

function processAndConfirmEmailChange(){
	var urlParts = window.location.search.split('?');
	
	var invalidURL = document.getElementById("invalidURL");
	if(urlParts.length < 2) {
		invalidURL.style.display = "block";
		document.getElementById("changeEmailConfirmationErrors").style.display = "block";
		document.getElementById("changeEmailConfirmationSuccess").style.display = "none";
	}
	else {
		invalidURL.style.display = "none"
	}
	
	var key = urlParts[1];
	
	var myAjaxUser = new AjaxUser();
	myAjaxUser.data = "action=confirmemailchange&key=" + key;
	myAjaxUser.send();
}