//Used for giving information to the current player
function setInfo(info) {
	document.getElementById("infoDiv").innerHTML=info;
}

//Sets the continue button with a timeout
function setButton(text) {
	document.getElementById("mainButton").value=text;
}

//candidates is an array of player objects
function setCandidates(candidates) {
	candidatesToWrite="";
	for (i=0; i<candidates.length; i++) {
		person=players[candidates[i]];
		candidatesToWrite+="<input type='button' value='" + person.name + "' onclick='javascript:choose(\""+candidates[i]+"\")'>&nbsp;";
	}
	candidatesToWrite+="&nbsp;";
	document.getElementById("candidatesDiv").innerHTML=candidatesToWrite;
}

function clearCandidates(message) {
	if (message) {
		document.getElementById("candidatesDiv").innerHTML=message;
	} else
		document.getElementById("candidatesDiv").innerHTML="&nbsp;";
}

//Occurs whenever the main button is clicked
function mainButtonClick() {
	if (currentPhase==addingPlayers) {
		if (players.length>3)
			confirmPlayers();
		 else
			alert("A bare minimum of 4 players is required.\r\n\r\nPlayers currently registered: "+players);
	} else if (currentPhase==confirmingPlayers) {
		setupDeckForm();
	} else if (currentPhase==constructDecks) {
		verifyDeck();
	} else if (currentPhase==night) {
		login(currentPlayer+1);
	} else if (currentPhase==authenticating) {
		pass=document.getElementById("ppassword").value;
		if (players[currentPlayer].password==pass) {
			currentPhase=night;
			players[currentPlayer].role.exec();
		} else
			alert("Incorrect password");
	} else if (currentPhase==day) {
		nighttime();
	} else if (currentPhase==endgame) {
		confirmPlayers();
	} else {
		alert("Unknown phase");
	}
}

//Used to start the game
function initialize() {
	setButton("Done adding players");
	players=new Array();
	currentPhase=addingPlayers;
	getPlayers();
}

//Get players at the beginning of the game
function getPlayers() {
	toWrite="<p>Add players</p>"
		+ "<table>"
		+ "<tr><td>Name:</td><td><input id='pname'></td></tr>"
		+ "<tr><td>Password:</td><td><input type='password' id='ppassword'></td>"
		+ "<tr><td>Confirm:</td><td><input type='password' id='pconfirm'></td>"
		+ "<tr><td colspan='2'><center><input type='button' value='Add' onclick='javascript:addPlayer()'></center></td>"
		+ "</table>";
	setInfo(toWrite);
}

function addPlayer() {
	name=document.getElementById('pname').value;
	pass=document.getElementById('ppassword').value;
	conf=document.getElementById('pconfirm').value;
	if (name=="")
		alert("Please enter a name.");
	else if (pass=="")
		alert("Please enter a password");
	else if (pass!=conf)
		alert("Your password and confirmation don't match");
	else {
		unique=true;
		for each (person in players) 
			if (person.name.toLowerCase()==name.toLowerCase())
				unique=false;
		if (!unique)
			alert("That name is already taken. Please choose another");
		else {
			players[players.length]=new Player(name, pass);
			alert(name+" has been added");
			document.getElementById('pname').value="";
			document.getElementById('ppassword').value="";
			document.getElementById('pconfirm').value="";
		}
	}		
}

function confirmPlayers() {
	k=players.length;
	for (i=0; i<k; i++)
		for (j=0; j<k; j++)
			players[i].priorChosen[k]=false;
	currentPhase=confirmingPlayers;
	toWrite="<p>Confirm the following list of players: "+players.toString()+"</p>"
		+ "<p><input type='button' value='Redo players' onclick='javascript:initialize()'>";
	setInfo(toWrite);
	setButton("Create deck");
	clearCandidates();
}

function setupDeckForm() {
	currentPhase=constructDecks;
	setButton("Start the game!");
	n=players.length;
	if (howManyWolves==0)
		howManyWolves=Math.max(1, Math.floor(n/4));
	if (howManySeers==0)
		howManySeers=Math.max(1, Math.floor(n/6));
	if (howManyLycans==0)
		howManyLycans=Math.max(1, Math.floor(n/8));
	if (howManyProtectors==0)
		howManyProtectors=Math.floor(n/8);
	checked="";
	if (twins)
		checked=" checked";
	toWrite="<b>Create deck:</b> ("+n+" players)"
		+ "<table>"
		+ "<tr><td>Wolves</td><td><input id='wolves' value='"+howManyWolves+"'></td></tr>"
		+ "<tr><td>Sorcerers</td><td><input id='sorcerers' value='"+howManySorcerers+"'></td></tr>"
		+ "<tr><td>Seers</td><td><input id='seers' value='"+howManySeers+"'></td></tr>"
		+ "<tr><td>Lycans</td><td><input id='lycans' value='"+howManyLycans+"'></td></tr>"
		+ "<tr><td>Protectors</td><td><input id='protectors' value='"+howManyProtectors+"'></td></tr>"
		+ "<tr><td>Twins</td><td><input id='twins' type='checkbox' "+checked+"> (2 cards)</td></tr>"
		+ "</table><br>(Extra slots filled with villagers)";
	setInfo(toWrite);
}

function verifyDeck() {
	w=document.getElementById('wolves').value;
	s=document.getElementById('seers').value;
	l=document.getElementById('lycans').value;
	src=document.getElementById('sorcerers').value;
	p=document.getElementById('protectors').value;
	t=document.getElementById('twins').checked;
	total=w*1+s*1+l*1+src*1+p*1;
	if (t)
		total+=2;
	if (isNaN(w))
		alert("Please enter a number of wolves.");
	else if (isNaN(s))
		alert("Please enter a number of seers.");
	else if (isNaN(l))
		alert("Please enter a number of lycans.");
	else if (isNaN(src))
		alert("Please enter a number of sorcerers.");
	else if (isNaN(p))
		alert("Please enter a number of protectors.");
	else if (w==0)
		alert("Must have at least 1 wolf");
	else if (w>=(players.length/2))
		alert("Too many wolves");
	else if (total>players.length)
		alert("More cards than players")
	else {
		howManyWolves=w
		howManySeers=s
		howManyLycans=l
		howManySorcerers=src
		howManyProtectors=p
		twins=t
		selectRoles();
		nighttime();
	}
}

function selectRoles() {
	deckSize=players.length;
	deck=new Array();
	for (i=0; i<howManyWolves; i++)
		deck[deck.length]=werewolf
	for (i=0; i<howManySeers; i++)
		deck[deck.length]=seer
	for (i=0; i<howManyLycans; i++)
		deck[deck.length]=lycan
	for (i=0; i<howManySorcerers; i++)
		deck[deck.length]=sorcerer
	for (i=0; i<howManyProtectors; i++)
		deck[deck.length]=protector
	if (twins) {
		deck[deck.length]=twin
		deck[deck.length]=twin
	}
	while (deck.length<deckSize) {
		deck[deck.length]=villager
	}

	for each (person in players) {
		n=Math.floor(Math.random()*deck.length);
		person.role=deck[n];
		deck.splice(n, 1);
		person.alive=true;
		person.chosen=-1;
	}
}

function nighttime() {
	clearProtection();
	login(0);
}

function clearProtection() {
	for (i=0; i<players.length; i++)
		players[i].invincible=false;
}

function login(current) {
	clearCandidates();
	currentPlayer=current;
	currentPhase=authenticating
	if (current>=players.length) {
		daytime();
	} else if (players[current].alive) {
		toWrite="<p>Please log in: <b>"+players[current]+"</b></p>"
			+ "<p><input type=password id='ppassword'></p>";
		setInfo(toWrite);
		setButton("Log in to take your turn");
	} else
		login(current+1);
}

function choose(chosen) {
	if (currentPhase==night)
		players[currentPlayer].role.choose(chosen);
	else if (currentPhase==day)
		lynch(chosen);
	else if (currentPhase==endgame) {
		//Do nothing
	}
	else
		alert("Choose not set for phase: "+currentPhase);
}

function lynch(chosen) {
	kill(chosen)
	clearCandidates("<b>"+players[chosen]+"</b>, a <b>"+players[chosen].role.name+"</b>, has been lynched!");
}

function daytime() {
	currentPhase=day;
	setButton("Go to sleep...");
	toWrite="";
	werewolfVictims=new Array();
	for (i=0; i<players.length; i++) {
		person=players[i];
		if (person.role=="Werewolf" && person.chosen!=-1) {
			werewolfVictims[werewolfVictims.length]=person.chosen;
			person.chosen=-1;
		}
	}
	k=werewolfVictims.length;
	if (k>0) {
		n=Math.floor(Math.random()*k);
		killed=werewolfVictims[n]
		if(kill(killed))
			toWrite+="<p><b>"+players[killed]+"</b>, a <b>"+players[killed].role.name+"</b>, has been eaten by wolves in the night!</p>";
		else
			toWrite+="<p>The wolves were scared off by a protector!";
	}
	if (currentPhase!=endgame) {
		x=countWolves();
		if (x==1)
			toWrite+="<p>There is but one werewolf amongst you...</p>";
		else
			toWrite+="<p>There are still <b>"+x+"</b> werewolves remaining...</p>";
		toWrite+="<p>Choose someone to lynch, or go to sleep without lynching anyone.</p>";
		setInfo(toWrite);
		candidates=new Array();
		for (i=0; i<players.length; i++)
			if (players[i].alive)
				candidates[candidates.length]=i;
		setCandidates(candidates);
	}
	clearProtection();
}

function kill(chosen) {
	if (players[chosen].invincible)
		return false;
	else {
		players[chosen].alive=false;
		checkForVictory();
		return true;
	}
}

function checkForVictory() {
	werewolves=new Array();
	villagers=new Array();
	werewolvesLeft=0;
	villagersLeft=0;
	for (i=0; i<players.length; i++) {
		switch (players[i].role.name) {
			case "Werewolf":
				werewolves[werewolves.length]=i;
				if (players[i].alive)
					werewolvesLeft++;
				break;
			case "Sorcerer":
				//The sorcerer wins or loses with the werewolves, but does not count as a werewolf or a villager
				werewolves[werewolves.length]=i;
				break;
			case "Lycan":
			case "Protector":
			case "Seer":
			case "Twin":
			case "Villager":
				villagers[villagers.length]=i;
				if (players[i].alive)
					villagersLeft++;
				break;
			default:
				alert("Unexpected role!: "+players[i].role.name);
				break;
		}
	}
	if (werewolvesLeft==0)
		victory("The villagers have successfully killed the werewolves!", villagers, werewolves);
	else if (werewolvesLeft>=villagersLeft)
		victory("Oh no! The werewolves have overrun the village!", werewolves, villagers);
}

function victory(text, winners, losers) {
	currentPhase=endgame;
	clearCandidates();
	toWrite="<p>"+text+"</p>"
	toWrite+="<p><b>Winners:</b><br>";
	for (i=0; i<winners.length; i++) {
		k=winners[i];
		n=players[k].name;
		r=players[k].role.name;
		dead="";
		if (!players[k].alive)
			dead=" (Deceased)";
		toWrite+=n+": "+r+dead+"<br>";
	}
	toWrite+="</p>";

	toWrite+="<p><b>Losers:</b><br>";
	for (i=0; i<losers.length; i++) {
		k=losers[i];
		n=players[k].name;
		r=players[k].role.name;
		dead="";
		if (!players[k].alive)
			dead=" (Deceased)";
		toWrite+=n+": "+r+dead+"<br>";
	}
	toWrite+="</p>";
	setInfo(toWrite);
	setButton("Play again");
	clearCandidates();
}

function countWolves() {
	wolves=0;
	for (i=0; i<players.length; i++)
		if (players[i].alive && players[i].role.name=="Werewolf")
			wolves++
	return wolves;
}