// ============================================================================
// One Eyed Flush.
// ============================================================================
 
// Constants.
 
var numPacks			=	6;
var numShuffles			=	10; 
var maxSplits			=	3;
var minBet				=	5;
var maxBet				=	100;
var initCredit			=	1000;
var initBet				=	10;
var bustVal				=	14
var dealTimeDelay		=	500;
var flipTimeDelay		=	600;
var discardTimeDelay	=	750;
var newGameTimeDelay	= 	1000;
 
// Globals.
var playsuits = new Array(4);			//  To check for a flush
var	dealsuits = new Array(4);
var playmatched = new Array(14);		//  To check for pairs, threes, fours
var dealmatched = new Array(14);
var playcardvals	= new Array(3);		//  Holds values of dealt cards
var dealcardvals	= new Array(3);
var playwild = new Array(14);
var dealwild = new Array(14);
var playWildRanks = new Array(3);		// 0 = JS, 1 = JH, 2 = KD
var dealWildRanks = new Array(3);		// 0 = JS, 1 = JH, 2 = KD
var playpairs;
var playthrees;
var dealpairs;
var dealthrees;
var playwilds;
var dealwilds;
var playwildsingles;
var playwildpairs;
var playwildthrees;
var dealwildsingles;
var dealwildpairs;
var dealwildthrees;
var playflush = false;
var playstraight = false;
var dealflush = false;
var dealstraight = false;
var winnings;
var mydiscards; 
var deck;
var burnCard; 
var dealer;
var player = new Array(maxSplits + 1);
var curPlayerHand, numPlayerHands;
var won, credits, defaultBet;
var creditsTextNode, defaultTextNode, winhandTextNode;
var dealRoundCounter;
var busted = false;


 
// Initialize game on page load.
 
window.onload = initGame;
 
function initGame() {
 
  var i;
 
  // Locate credits and default bet text nodes on the page.
 
  creditsTextNode = document.getElementById("credits").firstChild;
  defaultTextNode = document.getElementById("default").firstChild;
 
  // Initialize player's credits and bet amount.
 
  credits    = initCredit;
  defaultBet = initBet;
  changeBet(0);
  updateBetDisplay(0);
 
  // Initialize card deck.
 
  deck = new Stack();
  newDeck();
  
  mydiscards = new Stack();
 
  //deck.makeDeck(1);
  display();
 
  // Create dealer and player hands.
 
  dealer = new Hand("dealer");
  for (i = 0; i < player.length; i++)
    player[i] = new Hand("player" + i);
    
  //for (i = 0; i < 1; i++)
  //  player[i] = new Hand("player" + i);
  player[0].resultTextNode.nodeValue = "Press Deal to play...";
}
 
// ----------------------------------------------------------------------------
// One Eyed Flush hand object.                    
// ----------------------------------------------------------------------------
 
Hand.prototype.leftIncr  =  2.5;  // For positioning cards.
Hand.prototype.topIncr   =  0.2;
Hand.prototype.rollEvery =  3;
 
function Hand(id) {
 
  this.cards = new Array();
 
  // Get page elements based on id.
 
  this.fieldNode     = document.getElementById(id);
  this.cardsNode     = document.getElementById(id + "Cards");
  this.scoreTextNode = document.getElementById(id + "Score").firstChild;
  if (id != "dealer") {
    this.betTextNode    = document.getElementById(id + "Bet").firstChild;
    this.resultTextNode = document.getElementById(id + "Result").firstChild;
    this.winhandTextNode = document.getElementById(id + "Winhand").firstChild;
  }
  
  //alert(id + "Winhand");
 
  this.reset      = handReset;
  this.addCard    = handAddCard;
  this.removeLCard = handRemoveLCard;
  this.removeFCard = handRemoveFCard;
  this.removeCCard = handRemoveCCard;
  this.getScore   = handGetScore;
  this.getCardValue = handGetCardValue;
  this.getRankValue = handGetRankValue;
  this.clearCards = handClearCards;
 
  // Initialize as an empty hand.
 
  this.reset();
}
 
function handReset() {
 
  // Remove any cards and initialize properties.
 
  this.clearCards();
 
  this.cards     = new Array();
  this.singleton = new Array();
  this.threeKind = new Array();
  this.split     = false;
  this.doubled   = false;
  this.surrender = false;
  this.bust		 = false;
  this.left      = 0;
  this.top       = 0;
 
  this.scoreTextNode.nodeValue  = "\u00a0";
  if (this.betTextNode) {
    this.betTextNode.parentNode.className = "textBox dollars";
    this.betTextNode.nodeValue = "\u00a0";
  }
  if (this.resultTextNode)
    this.resultTextNode.nodeValue = "\u00a0";
  if (this.winhandTextNode)
    this.winhandTextNode.nodeValue = "\u00a0";
}
 
function handAddCard(card, down) {
 
  var n;
  var node;
 
  // Add the given card to the hand.
 
  n = this.cards.length;
  this.cards[n] = card;
 
  // Create a card node for display, set as face down if requested.
 
  node = this.cards[n].createNode();
  if (down)
    node.firstChild.style.visibility = "hidden";
 
  // Add the card display to the associated card area on the page.
 
  node.style.left = this.left + "em";
  node.style.top  = this.top  + "em";
  this.cardsNode.appendChild(node);
  this.left += this.leftIncr;
  if (this.cards.length % this.rollEvery == 0)
    this.top = 0;
  else
    this.top += this.topIncr;
}
 
function handRemoveLCard() {
 
  var card;
 
  // Remove the last card in the array and save it.
 
  card = null;
  if (this.cards.length > 0) {
    card = this.cards.pop();
         
    // Remove the card node from the display and reset position.
 
    this.cardsNode.removeChild(this.cardsNode.lastChild);
    //this.left -= this.leftIncr;
    //this.top  -= this.topIncr;
  }
 
  // Return the card.
 
  return card;
}

function handRemoveFCard() {
 
  var cardf, cardc, cardl;
 
  // Remove the first card in the array and save it.
 
  card = null;
  if (this.cards.length > 0) {
    cardl = this.cards.pop();
    cardc = this.cards.pop();
    cardf = this.cards.pop();
    this.cards.push(cardc);
    this.cards.push(cardl);
 
    // Remove the card node from the display and reset position.
 
    this.cardsNode.removeChild(this.cardsNode.firstChild);
    
    //this.left += this.leftIncr/3;
    //this.top  += this.topIncr/3;
  }
 
  // Return the card.
 
  return cardf;
}

function handRemoveCCard() {
 
  var cardc, cardl;
 
  // Remove the center card in the array and save it.
 
  card = null;
  if (this.cards.length > 0) {
    cardl = this.cards.pop();
    cardc = this.cards.pop();
    this.cards.push(cardl);
 
    // Remove the card node from the display and reset position.
 
    this.cardsNode.removeChild(this.cardsNode.firstChild.nextSibling);
   
    //this.left += this.leftIncr;
    //this.top  += this.topIncr;
  }
 
  // Return the card.
 
  return cardc;
}
 
function handGetScore() {
 
  var i, total;
 
  total = 0;
 
  // Total card values counting Aces as one.
 
  for (i = 0; i < this.cards.length; i++)
    if (this.cards[i].rank == "A")
      total++;
    else {
      if (this.cards[i].rank == "J" || this.cards[i].rank == "Q" ||
          this.cards[i].rank == "K")
        total += 10;
      else
        total += parseInt(this.cards[i].rank, 10);
	}
	    
  return total;
}
  

function handGetCardValue(i) {
	
  val = 0;
 
  // Get a card val counting Aces as one.
 
    if (this.cards[i].rank == "A")
      val++;
    else {
      if (this.cards[i].rank == "J" || this.cards[i].rank == "Q" ||
          this.cards[i].rank == "K")
        val += 10;
      else
        val += parseInt(this.cards[i].rank, 10);
    }
     
  return val;
}

function handGetRankValue(i) {
	
  val = 0;
 
  // Get a card rank val counting Aces as one.
 
    if (this.cards[i].rank == "A")
      val++;
    else {
      if (this.cards[i].rank == "J") val += 11;
      else
      if (this.cards[i].rank == "Q") val += 12;
      else
      if (this.cards[i].rank == "K") val += 13;
      else
        val += parseInt(this.cards[i].rank, 10);
    }
  return val;
}
	
function handClearCards() {
 
  // Remove the card nodes in the associated card area.
 
  while (this.cardsNode.lastChild)
    this.cardsNode.removeChild(this.cardsNode.lastChild);
}
 
// ----------------------------------------------------------------------------
// Game functions.
// ----------------------------------------------------------------------------
 
function newDeck() {
 
  // Create a deck.
 
  deck.makeDeck(numPacks);
  deck.shuffle(numShuffles);
 
  // Set the burn card.
 
  burnCard = Math.round(Math.random() * 26) + 26;
  //burnCard = Math.floor(Math.random() * 4) + 1;
  //alert (burnCard);
  mydiscards = new Stack();  
  display();
}
 
function getNextCard() {
 
  // If there are no cards left, start a new deck.
 
  if (deck.cardCount() == 0 ) {
    alert("New Decks...Shuffling...");
    newDeck();
  }
 
  return deck.deal();
}
 
function startRound() {
 
  var i, n, card;
 
  // Reset all hands.
  	
  dealer.reset();
  for (i = 0; i < player.length; i++) {
    player[i].reset();
    if (i > 0)
      player[i].fieldNode.style.display = "none";
  }
	  
 
  // Start with a single player hand.
 
  curPlayerHand  = 0;
  numPlayerHands = 1;
 
  // Enable/disable buttons.
 
  document.forms["controls"].elements["deal"].disabled      = true;
  // document.forms["controls"].elements["increase"].disabled  = true;
  // document.forms["controls"].elements["decrease"].disabled  = true;
  DisablePlayButtons();
 
  // If the burn card was reached, start a new deck.
 
  if (deck.cardCount() < burnCard) {
    alert("New deck.");
    newDeck();
    mydiscards = new Stack();
    display();
  }
 
  // Take the player's bet.
 
  player[0].bet = defaultBet;
  credits -= player[0].bet;
  updateBetDisplay(0);
 
  // Start dealing the cards.
  
  dealRoundCounter = 1;
  waitdealRound();
  player[0].resultTextNode.nodeValue = "Dealing hands...";
}

function waitdealRound() {
	setTimeout(dealRound, newGameTimeDelay);
}
 
function dealRound() {
	
	var card;
 
	// Deal a card to the player or the dealer based on the counter.
	// Dealers first and last cards are face down.
	// Start with player.
 
	switch(dealRoundCounter) {
		
		case 1:
		card = getNextCard();    
		player[0].addCard(card, false);
		display();
		break;
 
    	case 2:
		card = getNextCard();
		dealer.addCard(card, true);
		display();
		break;
 
    	case 3:
		card = getNextCard();
		player[0].addCard(card, false);
		display();
		break;
 
    	case 4:
		card = getNextCard();
		dealer.addCard(card, false);
		display();
		break;
      
    	case 5:
		card = getNextCard();
		player[0].addCard(card, false);
		display();
		break;
 
    	case 6:
		card = getNextCard();
		dealer.addCard(card, true);
		display();
		break;
 
    	default:
 
	// No more cards to deal, play the round.
  	player[0].resultTextNode.nodeValue = "Player's turn";      
	playRound();
	return;
	break;
	}
 
	// Update the player's score.
  
	player[0].scoreTextNode.nodeValue = player[0].getScore();
 
	// Set a timer for the next call.
 
	dealRoundCounter++;
	setTimeout(dealRound, dealTimeDelay);
}
 
function playRound() {
	
	var d, p, total;	
	total = 0;
 
	//	Get dealer's up card score
   
    if (dealer.cards[1].rank == "A")
      total++;
    else {
      if (dealer.cards[1].rank == "J" || dealer.cards[1].rank == "Q" || dealer.cards[1].rank == "K")
        total += 10;
      else
        total += parseInt(dealer.cards[1].rank, 10);
    }

	dealer.scoreTextNode.nodeValue = total;
 
	// Enable/disable buttons.
	
	getHands();
	p = player[0].getScore();
	
	if (playwilds != 0 || playpairs != 0 || playthrees != 0 || p <= bustVal) {		
		document.forms["controls"].elements["surrender"].disabled = false;
		document.forms["controls"].elements["stand"].disabled     = false;
		document.forms["controls"].elements["discard1"].disabled = false;
		document.forms["controls"].elements["discard2"].disabled = false;
		document.forms["controls"].elements["discard3"].disabled = false;
	}
	else {
		document.forms["controls"].elements["surrender"].disabled = false;
		document.forms["controls"].elements["stand"].disabled     = true;
		document.forms["controls"].elements["discard1"].disabled = false;
		document.forms["controls"].elements["discard2"].disabled = false;
		document.forms["controls"].elements["discard3"].disabled = false;
	}
 
	// Highlight the player's hand.
}
  

function playerDiscard1() {
 
	var n, p, discard, newcard;
 
	// Enable/disable buttons.
 
	DisablePlayButtons();
	DisableDiscardButtons();

 	// Discard the players card
  	// Give the player another card and find total.
  	player[0].resultTextNode.nodeValue = "Player discards...";    	
	discard = player[0].removeFCard();
	mydiscards.addCard(discard);
  	display();
  	player[0].scoreTextNode.nodeValue = player[0].getScore();
	p = player[0].getScore();
	player[0].scoreTextNode.nodeValue = p; 
	setTimeout(startReDealPlayer, discardTimeDelay);
}

function playerDiscard2() {
 
  var n, p;
  var discard, newcard, node;
 
  // Enable/disable buttons.
 
	DisablePlayButtons();
	DisableDiscardButtons();
 
	// Give the player another card and find total.
  	player[0].resultTextNode.nodeValue = "Player discards..."; 	
	discard = player[0].removeCCard();
	mydiscards.addCard(discard);
  	display();
  	player[0].scoreTextNode.nodeValue = player[0].getScore();
	p = player[0].getScore();
	player[0].scoreTextNode.nodeValue = p; 
	setTimeout(startReDealPlayer, discardTimeDelay); 
}

function playerDiscard3() {
 
  var n, p, discard, newcard;
 
  // Enable/disable buttons.
 
	DisablePlayButtons();
	DisableDiscardButtons();
 
	// Give the player another card and find total.
  	player[0].resultTextNode.nodeValue = "Player discards..."; 
	discard = player[0].removeLCard();
	mydiscards.addCard(discard);
  	display();
  	player[0].scoreTextNode.nodeValue = player[0].getScore();
	p = player[0].getScore();
	player[0].scoreTextNode.nodeValue = p;   
	setTimeout(startReDealPlayer, discardTimeDelay);
}
 
function playerStand() {
	
	DisablePlayButtons();
	DisableDiscardButtons();
	
	//document.forms["controls"].elements["stand"].disabled = false;

	// reveal dealer cards
  	player[0].resultTextNode.nodeValue = "Player stands...";	
    setTimeout(startReDealer, dealTimeDelay);
}

function startReDealPlayer() {
	
	var p;
	
	// deal player a new card
	
	newcard = getNextCard();
  	player[0].addCard(newcard, false);
  	
  	getHands();
  	player[0].bust = false;
 	if ((playpairs > 0 || playthrees > 0 || playwilds > 0) || (player[0].getScore() <= bustVal)) { 	 
		//Go on to the the dealer.
		p = player[0].getScore();
		player[0].scoreTextNode.nodeValue = p;
 		setTimeout(startReDealer, discardTimeDelay);
	}
	else {
		// Player bust
		player[0].bust = true;
		setTimeout(endRound, discardTimeDelay);
	}
}
 
function startReDealer() {
	 
  // Reveal the dealer's first down card and score
  
	dealer.cardsNode.firstChild.firstChild.style.visibility = "";
	dealer.scoreTextNode.nodeValue = dealer.getScore();
 		 
	//Go on to the the dealer.
 
    setTimeout(startDealer, flipTimeDelay);
}
 
function startDealer() {
 
  var i, allBusts;
 
  // Enable/disable buttons.
 
  	DisablePlayButtons();
	DisableDiscardButtons();
  
  // Reveal the dealer's last down card and score
  
	dealer.cardsNode.lastChild.lastChild.style.visibility = "";
	dealer.scoreTextNode.nodeValue = dealer.getScore();
	
  // play the hand.
	
 	setTimeout(playDealer, flipTimeDelay);
}
 
function playDealer() {
 
  	var d,j;
  	var discard, newcard;
  	 
  	// Get and show the dealer's score.
 
  	d = dealer.getScore();
  	dealer.scoreTextNode.nodeValue = d;
  	  	
  	// Show result of each player hand and pay it off, if appropriate.
	    
	getHands();
	
	d = dealer.getScore();
		
	// Nothing..No wilds, no pairs. Discard highest card >= 7
	  	 
  	if (dealwilds == 0 && dealthrees == 0 && dealpairs == 0) {
	  	if((dealer.getCardValue(0) >= dealer.getCardValue(1)) && 
	  		(dealer.getCardValue(0) >= dealer.getCardValue(2)) &&
	  		(dealer.getCardValue(0) >= 7)) {
	  		player[0].resultTextNode.nodeValue = "Dealer discards...";
		  	discard = dealer.removeFCard();
			mydiscards.addCard(discard);
			display();
			setTimeout(dealToDealer,discardTimeDelay);
		}
		else
	  	if((dealer.getCardValue(1) >= dealer.getCardValue(2)) &&
	  		(dealer.getCardValue(1) >= dealer.getCardValue(0)) &&
	  		(dealer.getCardValue(1) >= 7)) {
		  	player[0].resultTextNode.nodeValue = "Dealer discards...";
		  	discard = dealer.removeCCard();
			mydiscards.addCard(discard);
			display();
			setTimeout(dealToDealer,discardTimeDelay);
		}
		else
	  	if ((dealer.getCardValue(2) >= dealer.getCardValue(0)) &&
	  		(dealer.getCardValue(2) >= dealer.getCardValue(1)) &&
	  		(dealer.getCardValue(2) >= 7)) {
		  	player[0].resultTextNode.nodeValue = "Dealer discards...";
		  	discard = dealer.removeLCard();
			mydiscards.addCard(discard);
			display();
			setTimeout(dealToDealer,discardTimeDelay);
		}		
	}
	
	// Pairs..Discard the singleton if >= 5.. Dont discard the wildcard
	else
  	if (dealpairs > 0 && dealwilds == 0 && dealthrees == 0) {
	  	if (dealcardvals[0] == dealcardvals[1] && dealcardvals[2] >= 5) {
	  		player[0].resultTextNode.nodeValue = "Dealer discards...";
		  	discard = dealer.removeLCard();
			mydiscards.addCard(discard);
			display();
			setTimeout(dealToDealer,discardTimeDelay);
		}
		else
	  	if (dealcardvals[1] == dealcardvals[2] && dealcardvals[0] >= 5) {
		  	player[0].resultTextNode.nodeValue = "Dealer discards...";
		  	discard = dealer.removeFCard();
			mydiscards.addCard(discard);
  			display();
			setTimeout(dealToDealer,discardTimeDelay);
		}
		else
	  	if (dealcardvals[2] == dealcardvals[0] && dealcardvals[1] >= 5) {
		  	player[0].resultTextNode.nodeValue = "Dealer discards...";
		  	discard = dealer.removeCCard();
			mydiscards.addCard(discard);
			display();
			setTimeout(dealToDealer,discardTimeDelay);
		}				
	}
	else
  	if (dealwilds == 1 && playwilds == 1 && dealpairs != 0) {	
		if ((dealer.cards[0].rank == "J" && dealer.cards[0].suit == "S") ||
			(dealer.cards[0].rank == "J" && dealer.cards[0].suit == "H") ||
			(dealer.cards[0].rank == "K" && dealer.cards[0].suit == "D")) {
			if (dealer.getCardValue(1) < dealer.getCardValue(2)) {
				player[0].resultTextNode.nodeValue = "Dealer discards...";
		  		discard = dealer.removeLCard();
				mydiscards.addCard(discard);
				display();
				setTimeout(dealToDealer,discardTimeDelay);
			}
			else {
				player[0].resultTextNode.nodeValue = "Dealer discards...";
		  		discard = dealer.removeCCard();
				mydiscards.addCard(discard);
				display();
				setTimeout(dealToDealer,discardTimeDelay);
			}				
		}							
		else
		if ((dealer.cards[1].rank == "J" && dealer.cards[1].suit == "S") ||
			(dealer.cards[1].rank == "J" && dealer.cards[1].suit == "H") ||
			(dealer.cards[1].rank == "K" && dealer.cards[1].suit == "D")) {
			if (dealer.getCardValue(0) < dealer.getCardValue(2)) {
				player[0].resultTextNode.nodeValue = "Dealer discards...";
		  		discard = dealer.removeLCard();
				mydiscards.addCard(discard);
				display();
				setTimeout(dealToDealer,discardTimeDelay);
			}
			else {
				player[0].resultTextNode.nodeValue = "Dealer discards...";
		  		discard = dealer.removeFCard();
				mydiscards.addCard(discard);
				display();
				setTimeout(dealToDealer,discardTimeDelay);
			}
		}
		else
		if ((dealer.cards[2].rank == "J" && dealer.cards[2].suit == "S") ||
			(dealer.cards[2].rank == "J" && dealer.cards[2].suit == "H") ||
			(dealer.cards[2].rank == "K" && dealer.cards[2].suit == "D")) {
			if (dealer.getCardValue(0) < dealer.getCardValue(1)) {
				player[0].resultTextNode.nodeValue = "Dealer discards...";
		  		discard = dealer.removeCCard();
				mydiscards.addCard(discard);
				display();
				setTimeout(dealToDealer,discardTimeDelay);
			}
			else {
				player[0].resultTextNode.nodeValue = "Dealer discards...";
		  		discard = dealer.removeFCard();
				mydiscards.addCard(discard);
				display();
				setTimeout(dealToDealer,discardTimeDelay);
			}				
		}
	}

	//player[0].resultTextNode.nodeValue = "Dealer stands..."	
	d = dealer.getScore();
	dealer.scoreTextNode.nodeValue = d;
	setTimeout(endRound, dealTimeDelay);
}
 
function dealToDealer() {
 
  // Give the dealer another card and check the result.

	newcard = getNextCard();
	dealer.addCard(newcard, false);  			
	display();
	d = dealer.getScore();
	dealer.scoreTextNode.nodeValue = d;
	setTimeout(endRound, discardTimeDelay);
}
 
function endRound() {
 
  var i, d, p, tmp;
  var pwcnt, dwcnt, pp, dp, ps, ds, ph, dh;
  var psTotal, dsTotal;
 
  // Enable/disable buttons.
 
  DisablePlayButtons();
 
  // Fix for IE 6 rendering bug.
 
  if (navigator.userAgent.indexOf("MSIE 6") >= 0) {
    dealer.cardsNode.firstChild.style.backgroundImage = "none";
    dealer.cardsNode.firstChild.style.backgroundColor = "white";
  }
 
  // Show the dealer's down cards and score.
 
  d = dealer.getScore();
  dealer.scoreTextNode.nodeValue = d;
  p = player[0].getScore();
  player[0].scoreTextNode.nodeValue = p;
  			   
  	// Show result of each player hand and pay it off, if appropriate.
  	
  	  document.forms["controls"].elements["deal"].disabled = false;
	
  	// Player Surrender   
	if (player[0].surrender) {
		player[0].resultTextNode.nodeValue = "You Surrendered!";
		player[0].bet /= 2;
		credits += player[0].bet;
		setTimeout(updateBetDisplay(0), dealTimeDelay);
    }
    
  	// Player Bust  
	if (player[0].bust) {
		player[0].resultTextNode.nodeValue = "You bust!";
		setTimeout(updateBetDisplay(0), dealTimeDelay);
    }

    //  Check the hands and update winnings if we've won    
    checkhands();
    if ( won > 0 ) {
	    player[0].resultTextNode.nodeValue = "You win $" + won + "!";
      	credits += (won + player[0].bet);
    }
	setTimeout(updateBetDisplay(0), dealTimeDelay);
}

function playerSurrender() {
 
  // Unhighlight the player's hand.
 
  // Note the surrender and end the round.
  	player[0].resultTextNode.nodeValue = "Player surrenders!"; 
	player[0].surrender = true;
	setTimeout(endRound, dealTimeDelay);
}

function getHands() {
	
	playpairs = 0;
	playthrees = 0;
	dealpairs = 0;
	dealthrees = 0;
	playwilds = 0;
	dealwilds = 0;
	playwildsingles = 0;
	playwildpairs = 0;
	playwildthrees = 0;
	dealwildsingles = 0;
	dealwildpairs = 0;
	dealwildthrees = 0;
	playflush = false;
	playstraight = false;
	dealflush = false;
	dealstraight = false;
	
	for( var j = 0; j < 3; j++) {
		playcardvals[j] = player[0].getRankValue(j);
		dealcardvals[j] = dealer.getRankValue(j);			
	}
		
    //playcardvals.sort(compare);           //  Sort the cards
    //dealcardvals.sort(compare);	

    for ( var i = 0; i < 4; i++ ) {
        playsuits[i] = 0;                 //  Initialise suits array to zero
        dealsuits[i] = 0;
    }

    for ( var i = 1; i < 14; i++ ) {
        playmatched[i] = 0;               //  Initialise matched arrays to zero
        dealmatched[i] = 0; 
        playwild[i] = 0;
        dealwild[i] = 0; 
    }
    
    for ( var i = 0; i < 3; i++ ) {
		playmatched[playcardvals[i]]++;		//  Update matched for cards
		dealmatched[dealcardvals[i]]++;
		
		//Get the wild cards
		if (player[0].cards[i].rank == "J" && player[0].cards[i].suit == "S") {
			playwild[playcardvals[i]]++;
			playmatched[playcardvals[i]]--;
		}
		else
		if (player[0].cards[i].rank == "J" && player[0].cards[i].suit == "H") {
			playwild[playcardvals[i]]++;
			playmatched[playcardvals[i]]--;
		}
		else
		if (player[0].cards[i].rank == "K" && player[0].cards[i].suit == "D") {
			playwild[playcardvals[i]]++;
			playmatched[playcardvals[i]]--;
		}
			
		if (dealer.cards[i].rank == "J" && dealer.cards[i].suit == "S") {
			dealwild[dealcardvals[i]]++;
			dealmatched[dealcardvals[i]]--;
		}
		else
		if (dealer.cards[i].rank == "J" && dealer.cards[i].suit == "H") {
			dealwild[dealcardvals[i]]++;
			dealmatched[dealcardvals[i]]--;
		}
		else
		if (dealer.cards[i].rank == "K" && dealer.cards[i].suit == "D") {
			dealwild[dealcardvals[i]]++;
			dealmatched[dealcardvals[i]]--;
		}
			
			
		 // Get card suits       
        if (player[0].cards[i].suit == "C")
        	playsuits[0]++;    //  Update suits for cards
        else
        if (player[0].cards[i].suit == "S")
        	playsuits[1]++;    //  Update suits for cards
        else
        if (player[0].cards[i].suit == "D")
        	playsuits[2]++;    //  Update suits for cards
        else
        if (player[0].cards[i].suit == "H")        
        	playsuits[3]++;    //  Update suits for cards
        	
        if (dealer.cards[i].suit == "C")
        	dealsuits[0]++;    //  Update suits for cards
        else
        if (dealer.cards[i].suit == "S")
        	dealsuits[1]++;    //  Update suits for cards
        else
        if (dealer.cards[i].suit == "D")
        	dealsuits[2]++;    //  Update suits for cards
        else
        if (dealer.cards[i].suit == "H")        
        	dealsuits[3]++;    //  Update suits for cards
    }
    
    //  Check for pairs, threes

    for ( var i = 1; i < 14; i++ ) {
	    
        if (playmatched[i] == 2) {
            playpairs++;
        }
        else
        if (playmatched[i] == 3) {
            playthrees++;
        }
        
        if (playwild[i] == 1) {
	        playwilds += 1;
        }
        else
        if (playwild[i] == 2) {
	        playwilds += 2;
        }
        else
        if (playwild[i] == 3) {
	        playwilds += 3;
        }
        
        if (dealmatched[i] == 2) {
            dealpairs++;
        }
        else
        if (dealmatched[i] == 3) {
            dealthrees++;
    	}
    	
        if (dealwild[i] == 1) {
	        dealwilds += 1;
        }
        else
        if (dealwild[i] == 2) {
	        dealwilds += 2;
        }
        else
        if (dealwild[i] == 3) {
	        dealwilds += 3;
        }   	
    }
    
    //  Check for a flush

    for ( var i = 0; i < 4; i++ ) {
        if ( playsuits[i] == 3 ) {
            playflush = true;
        }
        if ( dealsuits[i] == 3 ) {
            dealflush = true;
        }
    }	
}

function checkhands() {

	var p, d;
    var ps, ds;     
    won = 0; 
    

    getHands();
         
	d = dealer.getScore();
	dealer.scoreTextNode.nodeValue = d;
	p = player[0].getScore();
	player[0].scoreTextNode.nodeValue = p;
	        
    ps = getPlaySingleton();
    ds = getDealSingleton();
    
    //alert ("playwilds= " + playwilds + " " + "playpairs= " + playpairs + " " + "playthrees= " + playthrees);
    //alert ("dealwilds= " + dealwilds + " " + "dealpairs= " + dealpairs + " " + "dealthrees= " + dealthrees);
    
    // Don't check further if we've already won
    if ( won == 0 ) {    
	    // Player = 3 wildcards, Dealer = 3 wildcards
	    if (playwilds == 3 && dealwilds == 3) {
		   	player[0].winhandTextNode.nodeValue = "Fuck!!, A One Eyed Push!";
	       	credits += player[0].bet;
            won = 0;
            return;
        }
        else
	    // Player = 3 wildcards, Dealer < 3 wildcards
	    if (playwilds == 3 && dealwilds != 3) {
		   	getPlayWildRanks();
		    if (playWildRanks[0] == 1 && playWildRanks[1] == 1 && playWildRanks[2] == 1) {
		   		player[0].winhandTextNode.nodeValue = "One Eyed Flush!";
		   		won = player[0].bet * 600;
            	return;
        	}
		   	player[0].winhandTextNode.nodeValue = "Wild 3 of a kind!";
		   	won = player[0].bet * 25;
            return;	         	           
    	}
      
	    // Player = 2 wildcards, Dealer = 2 wildcards, low point value
	    if (playwilds == 2 && dealwilds == 2 && p < d) {
		   	getPlayWildRanks();
			if ((playWildRanks[0] > 0 || playWildRanks[1] > 0) && (playWildRanks[2] > 0)) {
		   		player[0].winhandTextNode.nodeValue = "Lo Jack King wild 3 of a kind!";
		   		won = player[0].bet * 5;
            	return;
        	}
		   	player[0].winhandTextNode.nodeValue = "Lo Jack's wild 3 of a kind!";
		   	won = player[0].bet * 20;
            return;	 					           
    	}
        else
	    // Player = 2 wildcards, Dealer = 1 wildcard
	    if (playwilds == 2 && dealwilds == 1) {
		   	getPlayWildRanks();
			if ((playWildRanks[0] > 0 || playWildRanks[1] > 0) && (playWildRanks[2] > 0)) {
		   		player[0].winhandTextNode.nodeValue = "Jack King wild 3 of a kind!";
		   		won = player[0].bet * 5;
            	return;
        	}
		   	player[0].winhandTextNode.nodeValue = "Jack's wild 3 of a kind!";
		   	won = player[0].bet * 20;
            return;	 			
		}
        else
	    // Player = 2 wildcards, Dealer = 0 wildcard
	    if (playwilds == 2 && dealwilds == 0) {
		   	getPlayWildRanks();
			if ((playWildRanks[0] > 0 || playWildRanks[1] > 0) && (playWildRanks[2] > 0)) {
		   		player[0].winhandTextNode.nodeValue = "Jack King wild 3 of a kind!";
		   		won = player[0].bet * 5;
            	return;
        	}
		   	player[0].winhandTextNode.nodeValue = "Jack's wild 3 of a kind!";
		   	won = player[0].bet * 20;
            return;	 			       
    	}
        else
	    // Player = 1 wildcard, Dealer = 1 wildcard, singleton lower
	    if (playwilds == 1 && dealwilds == 1 && playpairs == 0 && dealpairs == 0 && ps < ds) {
		   	getPlayWildRanks();
			if (playWildRanks[0] > 0 || playWildRanks[1] > 0) {
		   		player[0].winhandTextNode.nodeValue = "Lo Jack wild pair!";
		   		won = player[0].bet * 2;
            	return;
        	}
		   	player[0].winhandTextNode.nodeValue = "Lo King wild pair!";
		   	won = player[0].bet * 3;
            return;	          
    	}
        else
	    // Player = 1 wildcard, Dealer = 1 wildcard, player pairs = true, dealer pairs = false
	    if (playwilds == 1 && dealwilds == 1 && playpairs == 1 && dealpairs == 0) {
		   	getPlayWildRanks();
			if (playWildRanks[0] > 0 || playWildRanks[1] > 0) {
		   		player[0].winhandTextNode.nodeValue = "Jack wild 3 of a kind!";
		   		won = player[0].bet * 4;
            	return;
        	}
		   	player[0].winhandTextNode.nodeValue = "King wild 3 of a kind!";
		   	won = player[0].bet * 5;
            return;	           
    	}
        else
	    // Player = 1 wildcard, Dealer = 0 wildcard && playpairs = true
	    if (playwilds == 1 && playpairs == 1 && dealwilds == 0) {
		   	getPlayWildRanks();
			if (playWildRanks[0] > 0 || playWildRanks[1] > 0) {
		   		player[0].winhandTextNode.nodeValue = "Jack wild 3 of a kind!";
		   		won = player[0].bet * 4;
            	return;
        	}
		   	player[0].winhandTextNode.nodeValue = "King wild 3 of a kind!";
		   	won = player[0].bet * 5;
            return;	 	        
    	}
        else
        // Player wildcard = 1, dealer wildcard = 0
	    if (playwilds == 1 && dealwilds == 0) {
		   	getPlayWildRanks();
			if (playWildRanks[0] > 0 || playWildRanks[1] > 0) {
		   		player[0].winhandTextNode.nodeValue = "Jack wild pair!";
		   		won = player[0].bet * 2;
            	return;
        	}
		   	player[0].winhandTextNode.nodeValue = "King wild pair!";
		   	won = player[0].bet * 3;
            return;	 	     
    	}
    	else
    	// Player threes = true, dealer threes = false, dealer wildcards = false    
        if ( playthrees == 1 && dealthrees == 0 && dealwilds == 0) {
	        player[0].winhandTextNode.nodeValue = "3 of a kind!";
            won = player[0].bet * 6;
            return;
        }
        else 
        // Player threes = true, dealer threes = true, lower point value
        if ( playthrees > 0 && dealthrees > 0 && p < d) {
	        player[0].winhandTextNode.nodeValue = "Lo 3 of a kind!";
            won = player[0].bet * 6;
            return;
        }
        else 
        // Player threes = true, dealer threes = true, equal point value        
        if ( playthrees > 0 && dealthrees > 0 && p == d) {
	        player[0].winhandTextNode.nodeValue = "Push!";
	       	credits += player[0].bet;
            won = 0;
            return;
        }
        else
        // Handle pairs
        // If player and dealer have a pair, find the singletons
        if ( playpairs > 0 && dealpairs > 0) {
	        if (playcardvals[0] == playcardvals[1])
	        	ps = player[0].getCardValue(2);
	        else
	        if (playcardvals[0] == playcardvals[2])
	        	ps = player[0].getCardValue(1);
	        else
	        if (playcardvals[1] == playcardvals[2])
	        	ps = player[0].getCardValue(0);
	        		
	        if (dealcardvals[0] == dealcardvals[1])
	        	ds = dealer.getCardValue(2);
	        else
	        if (dealcardvals[0] == dealcardvals[2])
	        	ds = dealer.getCardValue(1);
	        else
	        if (dealcardvals[1] == dealcardvals[2])
	        	ds = dealer.getCardValue(0);
      		
	        // Player has lower singleton, Win
	        if ( ps < ds && dealwilds == 0) { 
	       		player[0].winhandTextNode.nodeValue = "Lo pair!";
            	won = player[0].bet/2;
            	return;
        	}
        	
        	// Player has higher singleton, Lose
			player[0].resultTextNode.nodeValue = "No win... Bad luck!";
			won = 0;
			return;
        }
 		else
 		// Player has a pair, dealer has nothing
        if (playpairs > 0 && dealpairs == 0 && dealthrees == 0 && dealwilds == 0) { 
	       	player[0].winhandTextNode.nodeValue = "Pair!";
            won = player[0].bet;
            return;
        }     
        else
        // Player has lower point value, dealer has nothing
        if ( p < d && dealpairs == 0 && dealthrees == 0 && dealwilds == 0) {
	       	player[0].winhandTextNode.nodeValue = "Lo point... Push!";
	       	credits += player[0].bet;
            won = 0;
            return;
        }      
    }
	player[0].resultTextNode.nodeValue = "No win... Bad luck!";
	won = 0;
}

function getPlaySingleton() {
	
	var ps;
					
	if ((player[0].cards[0].rank == "J" && player[0].cards[0].suit == "S") ||
		(player[0].cards[0].rank == "J" && player[0].cards[0].suit == "H") ||
		(player[0].cards[0].rank == "K" && player[0].cards[0].suit == "D")) {
		ps = player[0].getCardValue(2);
		if (player[0].getCardValue(1) < player[0].getCardValue(2))	
			ps = player[0].getCardValue(1);		
	}			
	else
	if ((player[0].cards[1].rank == "J" && player[0].cards[1].suit == "S") ||
	 	(player[0].cards[1].rank == "J" && player[0].cards[1].suit == "H") ||
	 	(player[0].cards[1].rank == "K" && player[0].cards[1].suit == "D")) {
		ps = player[0].getCardValue(2);
		if (player[0].getCardValue(0) < player[0].getCardValue(2))
			ps = player[0].getCardValue(0);
	}
	else
	if ((player[0].cards[2].rank == "J" && player[0].cards[2].suit == "S") ||
		(player[0].cards[2].rank == "J" && player[0].cards[2].suit == "H") ||
		(player[0].cards[2].rank == "K" && player[0].cards[2].suit == "D")) {
		ps = player[0].getCardValue(1);
		if (player[0].getCardValue(0) < player[0].getCardValue(1))
			ps = player[0].getCardValue(0);
	}
	return ps;
}
	
function getDealSingleton() {
	
	var ds;
	
	if ((dealer.cards[0].rank == "J" && dealer.cards[0].suit == "S") ||
		(dealer.cards[0].rank == "J" && dealer.cards[0].suit == "H") ||
		(dealer.cards[0].rank == "K" && dealer.cards[0].suit == "D")) {
		ds = dealer.getCardValue(2);
		if (dealer.getCardValue(1) < dealer.getCardValue(2))	
			ds = dealer.getCardValue(1);					
	}
	else
	if ((dealer.cards[1].rank == "J" && dealer.cards[1].suit == "S") ||
		(dealer.cards[1].rank == "J" && dealer.cards[1].suit == "H") ||
		(dealer.cards[1].rank == "K" && dealer.cards[1].suit == "D")) {
		ds = dealer.getCardValue(2);
		if (dealer.getCardValue(0) < dealer.getCardValue(2))
			ds = dealer.getCardValue(0);	
	}
	else
	if ((dealer.cards[2].rank == "J" && dealer.cards[2].suit == "S") ||
		(dealer.cards[2].rank == "J" && dealer.cards[2].suit == "H") ||
		(dealer.cards[2].rank == "K" && dealer.cards[2].suit == "D")) {
		ds = dealer.getCardValue(1);
		if (dealer.getCardValue(0) < dealer.getCardValue(1))
			ds = dealer.getCardValue(0);	
	}
	return ds;			
}

function getPlayWildRanks() {
	
	for (var j = 0; j < 3; j++)
		playWildRanks[j] = 0;
			
	if (player[0].cards[0].rank == "J" && player[0].cards[0].suit == "S")
		playWildRanks[0]++;		
	else
	if (player[0].cards[0].rank == "J" && player[0].cards[0].suit == "H")
		playWildRanks[1]++;
	else
	if (player[0].cards[0].rank == "K" && player[0].cards[0].suit == "D")
		playWildRanks[2]++;				
		
	if (player[0].cards[1].rank == "J" && player[0].cards[1].suit == "S")
		playWildRanks[0]++;
	else
	if (player[0].cards[1].rank == "J" && player[0].cards[1].suit == "H")
		playWildRanks[1]++;
	else
	if (player[0].cards[1].rank == "K" && player[0].cards[1].suit == "D")
		playWildRanks[2]++;
		
	if (player[0].cards[2].rank == "J" && player[0].cards[2].suit == "S")
		playWildRanks[0]++;
	else
	if (player[0].cards[2].rank == "J" && player[0].cards[2].suit == "H")
		playWildRanks[1]++;
	else
	if (player[0].cards[2].rank == "K" && player[0].cards[2].suit == "D")
		playWildRanks[2]++;
}

function getDealWildRanks() {
	
	for (var j = 0; j < 3; j++)
		dealWildRanks[j] = "";
			
	if (dealer.cards[0].rank == "J" && dealer.cards[0].suit == "S")
		dealWildRanks[0] = "JS";
	else
	if	(dealer.cards[0].rank == "J" && dealer.cards[0].suit == "H")
		dealWildRanks[0] = "JH";
	else
	if	(dealer.cards[0].rank == "K" && dealer.cards[0].suit == "D")
		dealWildRanks[0] = "KD";				
		
	if (dealer.cards[1].rank == "J" && dealer.cards[1].suit == "S")
		dealWildRanks[1] = "JS";
	else
	if (dealer.cards[1].rank == "J" && dealer.cards[1].suit == "H")
		dealWildRanks[1] = "JH";
	else
	if (dealer.cards[1].rank == "K" && dealer.cards[1].suit == "D")
		dealWildRanks[1] = "KD";
		
	if (dealer.cards[2].rank == "J" && dealer.cards[2].suit == "S")
		dealWildRanks[2] = "JS";
	else
	if (dealer.cards[2].rank == "J" && dealer.cards[2].suit == "H")
		dealWildRanks[2] = "JH";
	else
	if (dealer.cards[2].rank == "K" && dealer.cards[2].suit == "D")
		dealWildRanks[2] = "KD";
}

//  Compare function for sorting the cards

function compare(a, b) {
    return a-b;
}


function updateBetDisplay(n) {
 
  var s;
 
  // Display the current bet on the given hand.
 
  if (player[n]) {
    if (player[n].bet != null)
      s = "Bet: " + formatDollar(player[n].bet);
    else
      s = "\u00a0";
    player[n].betTextNode.nodeValue = s;
  }
 
  // Display current credits.
 
  creditsTextNode.nodeValue = "Credits: " + formatDollar(credits);
}
 
function formatDollar(n) {
 
  var a, b;
 
  // Format the given number as a dollar amount for display.
 
  a = Math.abs(n);
  b = 100 * (a - Math.floor(a));
  if (b < 10)
    b = "0" + b;
  return (n < 0 ? "-" : "" ) + "$" + Math.floor(a) + "." + b;
}
 
function changeBet(n) {
 
  // Increase or decrease the default bet.
 
  defaultBet += n;
  defaultBet = Math.max(Math.min(defaultBet, maxBet), minBet);
  defaultTextNode.nodeValue = "Default Bet: " + formatDollar(defaultBet);
 
  // Reset the increase/decrease buttons.
 
  EnableBetButtons();
}
 
function EnableBetButtons() {
 
  // Enable the increase and decrease bet buttons provided the current bet
  // amount is within the allowed min/max value.
 
  // document.forms["controls"].elements["increase"].disabled = (defaultBet >= maxBet);
  // document.forms["controls"].elements["decrease"].disabled = (defaultBet <= minBet);
}
 
function DisablePlayButtons() {
 
  // Disable all the buttons used for playing a hand.
 
  document.forms["controls"].elements["surrender"].disabled = true;
  document.forms["controls"].elements["stand"].disabled     = true;
}

function DisableDiscardButtons() {
 
  // Disable all the buttons used for discarding a card.
  
  document.forms["controls"].elements["discard1"].disabled = true;
  document.forms["controls"].elements["discard2"].disabled = true;
  document.forms["controls"].elements["discard3"].disabled = true;
}
  
function addClassName(el, name)
{
	// Remove the class name if it already exists in the element's class name
	// list.
 
	removeClassName(el, name);
 
	// Add the class name to the element's current list of class names.
 
	if (el.className.length > 0)
		name = " " + name;
	el.className += name;
}
 
function removeClassName(el, name)
{
	// If the element has no class names, exit.
 
	if (el.className == null)
		return;
 
	// Rebuild the list of class names on the element but exclude the specified
	// class name.
 
	var newList = new Array();
	var curList = el.className.split(" ");
	for (var i = 0; i < curList.length; i++)
		if (curList[i] != name)
			newList.push(curList[i]);
	el.className = newList.join(" ");
}

function display() {
 
  var el, top, left;
  var n;
  
  left = 0;
  top  = 0;
  el = document.getElementById("showdeck");
  while (el.firstChild != null)
    el.removeChild(el.firstChild);
  n = deck.cardCount();
  for (i = 0; i < Math.round(n / numPacks); i++) {
    node = deck.cards[i].createNode();
    node.firstChild.style.visibility = "hidden";
    node.style.left = left + "em";
    node.style.top  = top  + "em";
    el.appendChild(node);
    left += 0.02;
    top  += 0.02;
  }
  
  left = 0;
  top  = 0;
  el = document.getElementById("showdiscards");
  while (el.firstChild != null)
    el.removeChild(el.firstChild);
  n = mydiscards.cardCount();
  for (i = 0; i < n; i++) {
    node = mydiscards.cards[i].createNode();
    node.style.left = left + "em";
    node.style.top  = top  + "em";
    el.appendChild(node);
    left += 0.02;
    top  += 0.02;
  }
}

function whichElement(e) {
var targ;
if (!e)
  {
  var e=window.event;
  }
if (e.target)
  {
  targ=e.target;
  x = e.pagex;
  y = e.pagey;
  }
else if (e.srcElement)
  {
  targ=e.srcElement;
  x = e.pagex;
  y = e.pagey;
  }
if (targ.nodeType==3) // defeat Safari bug
  {
  targ = targ.parentNode;
  }
var tname;
tname=targ.tagName;
//if (tname == "INPUT") return;
//alert("You clicked on a " + tname + " element.");
}

