// Preload graphics.

var cardImg0 = new Image(); cardImg0.src= "graphics/cardback.gif";
var cardImg1 = new Image(); cardImg1.src= "graphics/jack.gif";
var cardImg2 = new Image(); cardImg2.src= "graphics/queen.gif";
var cardImg3 = new Image(); cardImg3.src= "graphics/king.gif";

// globals
var state = 'player';
var players = new Array();
var community = new Array();
var dead = new Array();
var placeholders  = new Array();
var placeholderNumber  = -1;
var thisSuit = null;
var thisRank = null;
var winner = null;

function Card(rank, suit)
{
  var cardNode, frontNode, indexNode, spotNode, tempNode, textNode;
  var indexStr, spotChar;

  // This is the main node, a DIV tag.

  cardNode = document.createElement("DIV");
  cardNode.rank = rank;
  cardNode.suit = suit;
  cardNode.className = "card";

  // Build the front of card.

  frontNode = document.createElement("DIV");
  frontNode.className = "front";
  frontNode.style.visibility = 'visible';

  // Get proper character for card suit and change font color if necessary.

  spotChar = "\u00a0";
  switch (suit) {
    case "C" :
      spotChar = "\u2663";
      break;
    case "D" :
      frontNode.className += " red";
      spotChar = "\u2666";
      break;
    case "H" :
      frontNode.className += " red";
      spotChar = "\u2665";
      break;
    case "S" :
      spotChar = "\u2660";
      break;
  }

  // Create and add the index (rank) to the upper-left corner of the card.

  indexStr = rank;
  spotNode = document.createElement("DIV");
  spotNode.className = "index";
  textNode = document.createTextNode(indexStr);
  spotNode.appendChild(textNode);
  spotNode.appendChild(document.createElement("BR"));
  textNode = document.createTextNode(spotChar);
  spotNode.appendChild(textNode);
  frontNode.appendChild(spotNode);

  // Create and add spots based on card rank (Ace thru 10).

  spotNode = document.createElement("DIV");
  textNode = document.createTextNode(spotChar);
  spotNode.appendChild(textNode);
  if (rank == "A") {
    spotNode.className = "ace";
    tempNode = spotNode.cloneNode(true);
    frontNode.appendChild(tempNode);
  }
  if (rank == "3" || rank == "5" || rank == "9") {
    spotNode.className = "spotB3";
    tempNode = spotNode.cloneNode(true);
    frontNode.appendChild(tempNode);
  }
  if (rank == "2" || rank == "3") {
    spotNode.className = "spotB1";
    tempNode = spotNode.cloneNode(true);
    frontNode.appendChild(tempNode);
  }
  if (rank == "2" || rank == "3") {
    spotNode.className = "spotB5";
    tempNode = spotNode.cloneNode(true);
    frontNode.appendChild(tempNode);
  }
  if (rank == "4" || rank == "5" || rank == "6" || rank == "7" || rank == "8" || rank == "9" || rank == "10") {
    spotNode.className = "spotA1";
    tempNode = spotNode.cloneNode(true);
    frontNode.appendChild(tempNode);
    spotNode.className = "spotA5";
    tempNode = spotNode.cloneNode(true);
    frontNode.appendChild(tempNode);
    spotNode.className = "spotC1";
    tempNode = spotNode.cloneNode(true);
    frontNode.appendChild(tempNode);
    spotNode.className = "spotC5";
    tempNode = spotNode.cloneNode(true);
    frontNode.appendChild(tempNode);
  }
  if (rank == "6" || rank == "7" || rank == "8") {
    spotNode.className = "spotA3";
    tempNode = spotNode.cloneNode(true);
    frontNode.appendChild(tempNode);
    spotNode.className = "spotC3";
    tempNode = spotNode.cloneNode(true);
    frontNode.appendChild(tempNode);
  }
  if (rank == "7" || rank == "8" || rank == "10") {
    spotNode.className = "spotB2";
    tempNode = spotNode.cloneNode(true);
    frontNode.appendChild(tempNode);
  }
  if (rank == "8" || rank == "10") {
    spotNode.className = "spotB4";
    tempNode = spotNode.cloneNode(true);
    frontNode.appendChild(tempNode);
  }
  if (rank == "9" || rank == "10") {
    spotNode.className = "spotA2";
    tempNode = spotNode.cloneNode(true);
    frontNode.appendChild(tempNode);
    spotNode.className = "spotA4";
    tempNode = spotNode.cloneNode(true);
    frontNode.appendChild(tempNode);
    spotNode.className = "spotC2";
    tempNode = spotNode.cloneNode(true);
    frontNode.appendChild(tempNode);
    spotNode.className = "spotC4";
    tempNode = spotNode.cloneNode(true);
    frontNode.appendChild(tempNode);
  }

  // For face cards (Jack, Queen or King), create and add the proper image.

  tempNode = document.createElement("IMG");
  tempNode.className = "face";
  if (rank == "J")
    tempNode.src = "graphics/jack.gif";
  if (rank == "Q")
    tempNode.src = "graphics/queen.gif";
  if (rank == "K")
    tempNode.src = "graphics/king.gif";

  // For face cards, add suit characters to the upper-left and lower-right
  // corners.

  if (rank == "J" || rank == "Q" || rank == "K") {
    frontNode.appendChild(tempNode);
    spotNode.className = "spotA1";
    tempNode = spotNode.cloneNode(true);
    frontNode.appendChild(tempNode);
    spotNode.className = "spotC5";
    tempNode = spotNode.cloneNode(true);
    frontNode.appendChild(tempNode);
  }

  // Add front node to the card node.

  cardNode.appendChild(frontNode);

  // Return the card node.

  return cardNode;
}

function MakeDeck() {

  var ranks = new Array("A", "2", "3", "4", "5", "6", "7", "8", "9", "10", "J", "Q", "K");
  var suits = new Array("D", "C", "H", "S");
  var j, k, m;
  
  i = 0;

  m = ranks.length * suits.length;

  // Set array of cards.

  var Cards = new Array(m);

  // Fill the array with 'n' packs of cards.

  for (j = 0; j < suits.length; j++)
    for (k = 0; k < ranks.length; k++)
      Cards[i++] =  Card(ranks[k], suits[j]);
  return Cards;
}

function SetDeck()
{
	var Deck;
	Deck = MakeDeck();
	j = 0;k = 0; l = 5;
	for(i=0;i<Deck.length;i++)
	{
		if(i == 13 || i == 26 || i == 39) {j++; k = 0; l-=1.5;}
		Deck[i].style.left = ((k++*1.1)+l) + 'em';
		Deck[i].style.top = ((j*1.6)+(k*0.4)) + 'em';
		Deck[i].style.cursor = 'pointer';
		Deck[i].onclick=function(){SelectCard(this);}
		document.getElementById('deck').appendChild(Deck[i]);
	}
}

function DeleteNode(node)
{
	if(node) //make sure the node exists
	{
		DeleteChildren(node); //delete node's children
		if(node.parentNode) //if the node has a parent
		{
			node.parentNode.removeChild(node); //remove the node from the DOM tree
		}
		delete node; //clean up just to be sure
	}
}

function DeleteChildren(node)
{
	if(node) //make sure the node exists
	{
		for(var x = node.childNodes.length - 1; x >= 0; x--) //delete all of node's children
		{
			var childNode = node.childNodes[x];
			if(childNode.hasChildNodes()) //if the child node has children then delete them first
			{
				DeleteChildren(childNode);
			}
			node.removeChild(childNode); //remove the child from the DOM tree
			delete childNode; //clean up just to be sure
		}
	}
}

function ResetFunction()
{
	var NODES, i;
	
	NODES = document.getElementById('deck').getElementsByTagName('DIV');
	for(i=NODES.length;i>0;i--)
	{
		if(NODES[i-1].className == 'card')
		{
			DeleteNode(NODES[i-1]);
		}
	}
	NODES = document.getElementById('communityCards').getElementsByTagName('DIV');
	for(i=NODES.length;i>0;i--)
	{
		if(NODES[i-1].className == 'card')
		{
			DeleteNode(NODES[i-1]);
		}
	}
	NODES = document.getElementById('players').getElementsByTagName('DIV');
	for(i=NODES.length;i>0;i--)
	{
		if(NODES[i-1].className == 'placeholder')
		{
			DeleteNode(NODES[i-1]);
		}
	}
	NODES = document.getElementById('dead').getElementsByTagName('DIV');
	for(i=NODES.length;i>0;i--)
	{
		if(NODES[i-1].className == 'card')
		{
			DeleteNode(NODES[i-1]);
		}
	}
	placeholders = new Array();
	community = new Array();
	players = new Array();
	dead = new Array();
	placeholderNumber  = -1;
	ChangeState('player');
	SetDeck();
}

function ChangeState(input)
{
	if(input)
	{
		state = input;
	}
	else
	{
		input = state = (state == 'player' ? 'community' : 'player');
	}
	if(input == 'player')
	{
		document.getElementById('players').getElementsByTagName('p')[0].className = 'heading selected';
		document.getElementById('communityCards').getElementsByTagName('p')[0].className = 'heading hand';
	}
	else if(input == 'community')
	{
		document.getElementById('players').getElementsByTagName('p')[0].className = 'heading hand';
		document.getElementById('communityCards').getElementsByTagName('p')[0].className = 'heading selected';
	}
}

function SelectCard(input)
{
	var CARD,i,PLACEHOLDER,FOLD,P;
	
	if(!(state == 'player' || state == 'community'))
	{
		alert('Before choosing cards you need to select player or community!');
		return false;
	}
	if(state == 'community' && community.length > 4)
	{
		alert('You have already chosen 5 community cards!');
		return false;
	}
	if(state == 'player' && players.length > 19)
	{
		alert('You have already selected cards for 10 players!');
		return false;
	}
	//input.style.display = 'none'; // remove card from deck
	if(state == 'community')
	{
		i = community.length;
		community[i] = new Object();
		community[i].rank = input.rank;
		community[i].suit = input.suit;
		CARD = Card(input.rank,input.suit);
		CARD.style.left = (0.5 + (i*4.4)) + 'em';
		CARD.style.top = '1.7em'; 
		document.getElementById('communityCards').appendChild(CARD);
		if(players.length>3 && (players.length%2)===0 && (community.length === 3 || community.length === 4 || community.length === 5))
		{
			setTimeout("Score()",1);
		}
	}
	else if(state == 'player')
	{
		i = players.length;
		players[i] = new Object();
		players[i].rank = input.rank;
		players[i].suit = input.suit;
		CARD = Card(input.rank,input.suit);
		if(players.length % 2)
		{
			players[i].placeholder  = 'P' + (++placeholderNumber);
			CARD.style.left = '0.2em';
			CARD.style.top = '0.4em';
			PLACEHOLDER = document.createElement("DIV");
			PLACEHOLDER.appendChild(CARD);
			PLACEHOLDER.className = "placeholder";
			PLACEHOLDER.id = players[i].placeholder;
			document.getElementById('players').appendChild(PLACEHOLDER);
			placeholders[placeholders.length] = players[i].placeholder;
			
		}
		else
		{
			players[i].placeholder  = 'P' + placeholderNumber;
			PLACEHOLDER = document.getElementById(players[i].placeholder);
			CARD.style.left = '1.2em';
			CARD.style.top = '0.7em';
			PLACEHOLDER.appendChild(CARD);
			BUTTON = document.createElement("BUTTON");
			FOLD = document.createTextNode('Fold?');
			BUTTON.appendChild(FOLD);
			BUTTON.onclick=function(){Fold(this.parentNode)};
			PLACEHOLDER.appendChild(BUTTON);
			P = document.createElement("P");
			P.className = 'win';
			PLACEHOLDER.appendChild(P);
			P = document.createElement("P");
			P.className = 'split';
			PLACEHOLDER.appendChild(P);
			if(community.length === 1)
			{
				alert('The flop must be 3 cards. Please select 2 more.');
				ChangeState('community');
			}
			else if(community.length === 2)
			{
				alert('The flop must be 3 cards. Please select 1 more.');
				ChangeState('community');
			}
			else
			{
				setTimeout("Score()",1);
			}
		}
	}
	DeleteNode(input);
}

function Score(response)
{
	if(response)
	{
		var TEXT, PLACEHOLDERS, WIN, SPLIT, i, P;
		winner = null;
		PLACEHOLDERS = response.getElementsByTagName('placeholder');
		WIN = response.getElementsByTagName('win');
		SPLIT = response.getElementsByTagName('split');
		for(i=0;i<PLACEHOLDERS.length;i++)
		{
			if(document.getElementById(PLACEHOLDERS[i].firstChild.data))
			{
				P = document.getElementById(PLACEHOLDERS[i].firstChild.data).getElementsByTagName('P')[0];
				if(P.hasChildNodes())
				{
					DeleteChildren(P);
				}
				if(WIN[i].firstChild.data === 'Win: 100.00%') // update the winner variable
				{
					winner = PLACEHOLDERS[i].firstChild.data;
				} 
				TEXT = document.createTextNode(WIN[i].firstChild.data);
				P.appendChild(TEXT);
				P = document.getElementById(PLACEHOLDERS[i].firstChild.data).getElementsByTagName('P')[1];
				if(P.hasChildNodes())
				{
					DeleteChildren(P);
				}
				TEXT = document.createTextNode(SPLIT[i].firstChild.data);
				P.appendChild(TEXT);
			}
		}
	}
	else if(!(state === 'community' && community.length < 5 && winner))
	{
		var TEXT,PLACEHOLDERS,Ps,i,URL,IMG;
		
		Ps = document.getElementById('players').getElementsByTagName('P');
		for(i=0;i<Ps.length;i++)
		{
			if(Ps[i].className && (Ps[i].className == 'win' || Ps[i].className == 'split'))
			{
				if(Ps[i].hasChildNodes())
				{
					DeleteChildren(Ps[i]);				
				}
				if(placeholders.length == 1 && Ps[i].className == 'win')
				{
					TEXT = document.createTextNode('Win: 100%');
					Ps[i].appendChild(TEXT);
				}
				else if(placeholders.length > 1 && Ps[i].className == 'win')
				{
					TEXT = document.createTextNode('Calculating...');
					Ps[i].appendChild(TEXT);
				}
			}
		}
		if(placeholders.length > 1 && (players.length%2) === 0 && (community.length === 0 || community.length === 3 || community.length === 4 || community.length === 5))
		{
			URL = './score.php?';
			for(i=0;i<players.length;i++)
			{
				URL += 'players[' + players[i].placeholder + '][]=' + players[i].rank + players[i].suit + '&';
			}
			for(i=0;i<community.length;i++)
			{
				URL += 'community[]=' + community[i].rank + community[i].suit + '&';
			}
			for(i=0;i<dead.length;i++)
			{
				URL += 'dead[]=' + dead[i].rank + dead[i].suit + '&';
			}
			URL += 'score';
			loadXMLDoc(URL);
		}
	}
}

function Fold(input)
{
	var DIVs,i,CARD,j,k;
	var CARDs = new Array();
	var temp = new Array();
	
	DIVs = document.getElementById(input.id).getElementsByTagName('DIV');
	for(i=0;i<DIVs.length;i++)
	{
		if(DIVs[i].className && DIVs[i].className == 'card')
		{
			CARDs[CARDs.length] = DIVs[i];
		}
	}
	for(i=0;i<CARDs.length;i++)
	{
		j = dead.length;
		CARD = Card(CARDs[i].rank,CARDs[i].suit);
		CARD.style.left = (0.5 + (j*0.93)) + 'em';
		CARD.style.top = (1.7) + 'em';
		dead[j] = new Object();
		dead[j].suit = CARDs[i].suit;
		dead[j].rank = CARDs[i].rank;
		document.getElementById('dead').appendChild(CARD);
		for(k=0;k<players.length;k++)
		{
			if(players[k].placeholder == input.id)
			{
				delete players[k];				
				continue;
			}
		}
		
		// start: re-key players array
		for(k=0;k<players.length;k++)
		{
			if(players[k])
			{
				temp[temp.length] = players[k];
			}
		}
		players = temp;
		temp = new Array();
		// end: re-key players array
	}
	
	for(k=0;k<placeholders.length;k++)
	{
		if(placeholders[k] == input.id)
		{
			delete placeholders[k];
			continue;
		}
	}
	
	// start: re-key placeholders array
	for(k=0;k<placeholders.length;k++)
	{
		if(placeholders[k])
		{
			temp[temp.length] = placeholders[k];
		}
	}
	placeholders = temp;
	// end: re-key placeholders array
	
	if(winner === input.id) // we are folding the 100% hand (if there is one)
	{
		winner = null;
	}
	
	DeleteNode(input);
	setTimeout("Score()",1);
}

function loadXMLDoc(url) 
{
    if (window.XMLHttpRequest)
    {
        req = new XMLHttpRequest();
        req.onreadystatechange = processReqChange;
        req.open("GET", url, true);
        req.send(null);
    } else if (window.ActiveXObject) {
        req = new ActiveXObject("Microsoft.XMLHTTP");
        if (req)
        {
            req.onreadystatechange = processReqChange;
            req.open("GET", url, true);
            req.send();
        }
    }
}

function processReqChange() 
{
	if (req.readyState == 4) {
		if (req.status == 200) {
			response = req.responseXML.documentElement;
			method = response.getElementsByTagName('method')[0].firstChild.data;
			result = response.getElementsByTagName('result')[0];
			eval(method + '(result)');
        }
    }
}

function keyDown(e)
{
 var key,thisKey;
 
 thisKey = e ? e.which : window.event.keyCode;
 alt_key_down = e ? e.altKey : window.event.altKey;
 ctrl_key_down = e ? e.ctrlKey : window.event.ctrlKey;
 shift_key_down = e ? e.shiftKey : window.event.shiftKey;
 switch (thisKey) 
 {
  case 65: thisRank = 'A';
   break;
  case 50: thisRank = '2';
   break;
  case 51: thisRank = '3';
   break;
  case 52: thisRank = '4';
   break;
  case 53: thisRank = '5';
   break;
  case 54: thisRank = '6';
   break;
  case 55: thisRank = '7';
   break;
  case 56: thisRank = '8';
   break;
  case 57: thisRank = '9';
   break;
  case 84: thisRank = '10';
   break;
  case 74: thisRank = 'J';
   break;
  case 81: thisRank = 'Q';
   break;
  case 75: thisRank = 'K';
   break;
  case 67: thisSuit = 'C';
   break;
  case 68: thisSuit = 'D';
   break;
  case 72: thisSuit = 'H';
   break;
  case 83: thisSuit = 'S';
   break;
 }
 if(thisRank && thisSuit)
 {
	var NODES, i, FOUND;
	
	NODES = document.getElementById('deck').getElementsByTagName('DIV');
	for(i=NODES.length;i>0;i--)
	{
		if(NODES[i-1].className == 'card' && NODES[i-1].suit == thisSuit && NODES[i-1].rank == thisRank)
		{
			SelectCard(NODES[i-1]);
			FOUND = true;
		}
	}
	if(!(FOUND))
	{
		alert('The '+ cardName(thisRank, thisSuit) + ' is already in use');
		thisRank = null;
		thisSuit = null;
	}
 }
 else if(alt_key_down && thisKey == 75)
 {
	 ChangeState();
 }
 else if(alt_key_down && thisKey == 82)
 {
	 ResetFunction();
 }
 else if(alt_key_down && thisKey == 13)
 {
	 Score();
 }
}

function keyUp(e)
{
 var key,thisKey;
 
 thisKey = e ? e.which : window.event.keyCode;
 //alt_key_down = e ? e.altKey : window.event.altKey;
 //ctrl_key_down = e ? e.ctrlKey : window.event.ctrlKey;
 //shift_key_down = e ? e.shiftKey : window.event.shiftKey;
 switch (thisKey) 
 {
  case 65: thisRank = null;
   break;
  case 50: thisRank = null;
   break;
  case 51: thisRank = null;
   break;
  case 52: thisRank = null;
   break;
  case 53: thisRank = null;
   break;
  case 54: thisRank = null;
   break;
  case 55: thisRank = null;
   break;
  case 56: thisRank = null;
   break;
  case 57: thisRank = null;
   break;
  case 84: thisRank = null;
   break;
  case 74: thisRank = null;
   break;
  case 81: thisRank = null;
   break;
  case 75: thisRank = null;
   break;
  case 67: thisSuit = null;
   break;
  case 68: thisSuit = null;
   break;
  case 72: thisSuit = null;
   break;
  case 83: thisSuit = null;
   break;
 }
}

function cardName(r, s) {

	var rank, suit;
  
  switch (r) {
    case "A" :
      rank = "Ace";
      break;
    case "2" :
      rank = "Two";
      break;
    case "3" :
      rank = "Three";
      break;
    case "4" :
      rank = "Four";
      break;
    case "5" :
      rank = "Five";
      break;
    case "6" :
      rank = "Six";
      break;
    case "7" :
      rank = "Seven";
      break;
    case "8" :
      rank = "Eight";
      break;
    case "9" :
      rank = "Nine";
      break;
    case "10" :
      rank = "Ten";
      break;
    case "J" :
      rank = "Jack";
      break;
    case "Q" :
      rank = "Queen";
      break;
    case "K" :
      rank = "King";
      break;
    default :
      rank = null;
      break;
  }

  switch (s) {
    case "C" :
      suit = "Clubs";
      break;
    case "D" :
      suit = "Diamonds";
      break;
    case "H" :
      suit = "Hearts";
      break;
    case "S" :
      suit = "Spades";
      break;
    default :
      suit = null;
      break;
  }

  if (rank == null || suit == null)
    return "";

  return rank + " of " + suit;
}

function Layout()
{
	document.getElementById('help').style.display = 'none';
	document.getElementById('help').style.position = 'absolute';
	document.getElementById('help').style.top = '-1em';
	document.getElementById('help').style.left = '0';
	document.getElementById('help').style.width = '39.7em';
	document.getElementById('help').style.height = '28.7em';
	document.getElementById('help').style.overflow = 'auto';
	
	SetDeck();
	document.onkeydown = keyDown;
	document.onkeyup = keyUp;
	document.getElementsByTagName('body')[0].focus();
	
}

onload = Layout;
