var deck = new Array();
var tempDeck = new Array();
var numberOfDecks = 1;

var dealersHand = new Array();
var accomplicesHand = new Array();
for (i = 0; i < 10; i++) accomplicesHand[i] = new Array();
var donsHand = new Array();
for (i = 0; i < 10; i++) donsHand[i] = new Array();

var ACCOMPLICE = 0;
var DON = 1;
var DONNOCOUNT = 2;

var bets = new Array();
bets[ACCOMPLICE] = new Array();
bets[DON] = new Array();
bets[DONNOCOUNT] = new Array();
var wallet = 100;

var accomplicesBets = new Array();
var donsBets = new Array();

var accomplicesChips = 0;
var donsChips = 100;
var donsNoCountChips = 100;
var increasedBet = 2;
var donsBet = 2;
var stackThreshold = 0;
var maxHands = 1;
var handCount = 1;
var interval = 250;

var card = 0;
var dealersUpCard;

function initDeck()
{
  numberOfDecks = document.forms['theForm'].deckCount.options[document.forms['theForm'].deckCount.selectedIndex].value;
  d = 0
  for (i = 0; i < numberOfDecks; i++)
  {
    for (n = 2; n < 11; n++)
    {
      for (s = 0; s < 4; s++)
      {
        deck[d++] = n;
      }
    }
    for (s = 0; s < 4; s++) deck[d++] = 'J';
    for (s = 0; s < 4; s++) deck[d++] = 'Q';
    for (s = 0; s < 4; s++) deck[d++] = 'K';
    for (s = 0; s < 4; s++) deck[d++] = 'A';
  }
  for (i = 0; i < (52 * 8); i++) tempDeck[i] = deck[i];
  document.forms[0].dealersHandValue.value = "";
  for (i = 0; i < 4; i++)
  {
    eval("document.forms[0].accomplicesHandValue"+i).value = "";
    eval("document.forms[0].donsHandValue"+i).value= "";
  }
}	/* initDeck() */


function shuffle()
{
  var remainingCards = (52 * numberOfDecks)-1;
  var d = 0;
  initDeck();
  if (accomplicesChips > 100)
  {
    wallet += accomplicesChips - 100;
  }
  else
  {
      wallet -= (100 - accomplicesChips);
  }
  accomplicesChips = 100;
  document.getElementById("wallet").innerHTML = "Wallet: "+wallet;

  for (i = remainingCards; i >= 0; i--)
  {
    c = Math.round(i * Math.random());
    deck[d++] = tempDeck[c];
    for (j = c; j < remainingCards; j++) tempDeck[j] = tempDeck[j+1];
//    document.forms['theForm'].test.value=c+" "+(d-1)+" "+deck[d-1];
  }
  card = 0;

  for (i = 0; i < (52 * numberOfDecks); i++) invalidCard(deck[i], i);
}	/* shuffle */


function invalidCard(c, i)
{
  if ((c >= 2) || (c < 11)) return false;
  if ((c == 'J') || (c == 'Q') || (c == 'K') || (c == 'A')) return false;
  alert("Bad Card! "+c+" "+i);
}


function getHandValue(hand)
{
  var value = 0;
  var aceCount = 0;
  var i;

  for (i = 0; i < hand.length; i++)
  {
    if (hand[i] <= 9) value += hand[i];
    else if (hand[i] != "A") value += 10;
    else aceCount++;
  }
  for (i = 0; i < aceCount; i++)
  {
    if (value + (aceCount - 1) < 11) value += 11;
    else value += 1;
  }
  return value;
}	/* getHandValue() */


function split(hand, idx)
{
  var newHand = idx+1;

  while ((hand[newHand].length > 0) && (newHand < 10)) newHand++;

  hand[newHand][0] = hand[idx][1];
  hand[idx][1] = deck[card++];

  if (accomplicesHand[newHand].length > 0)
  {
    document.getElementById("aHand"+newHand).style.display = "block";
  }
  if (donsHand[newHand].length > 0)
  {
    document.getElementById("dHand"+newHand).style.display = "block";
  }
}	/* splitHand() */


function evalSplit(hand, idx)
{
  if (hand[idx][0] != hand[idx][1]) return;

  if ((hand[idx][0] == 'K') || (hand[idx][0] == 'Q') ||
      (hand[idx][0] == 'J') || (hand[idx][0] == 10) ||
      (hand[idx][0] == 5)) return;

  if ((hand[idx][0] == 9) && 
      ((dealersUpCard == 7) || (dealersUpCard > 9))) return;

  if ((hand[idx][0] == 7) && (dealersUpCard > 7)) return;

  if ((hand[idx][0] == 6) &&
      ((dealersUpCard == 2) ||
      (dealersUpCard > 6))) return;

  if (hand[idx][0] == 4) return;

  if ((hand[idx][0] < 4) &&
      ((dealersUpCard < 4) ||
      (dealersUpCard > 7))) return;

  split(hand, idx);

  evalSplit(hand, idx);
}	/* evalSplit() */


function evalDoubleDown(hand)
{
  var v = getHandValue(hand);
  var soft = isSoft(hand);
  if (dealersUpCard == 'A') return false;
  if (soft)
  {
    if ((v == 13) && ((dealersUpCard < 5) || (dealersUpCard > 6))) return false;
    if ((v == 14) && ((dealersUpCard < 5) || (dealersUpCard > 6))) return false;
    if ((v == 15) && ((dealersUpCard < 4) || (dealersUpCard > 6))) return false;
    if ((v == 16) && ((dealersUpCard < 4) || (dealersUpCard > 6))) return false;
    if ((v == 17) && ((dealersUpCard == 2) || (dealersUpCard > 6))) return false;
    if ((v == 18) && ((dealersUpCard == 2) || (dealersUpCard > 6))) return false;
    if (v > 18) return false;
//    alert("soft double down");
    return true;
  }
  if ((v == 10) && (dealersUpCard == 10)) return false;
  if ((v == 9) && ((dealersUpCard == 2) || (dealersUpCard > 6))) return false;
  if ((v < 9) || (v > 11)) return false;
//  alert("double down");
  return true;
}	/* evalDoubleDown */



function softHit(hand)
{
  if (!isSoft(hand)) return;
}	/* softHit() */



function playHand(hand, idx, player)
{
  bets[player][idx] = 2;
  if (player == DON)
  {
    bets[DON][idx] = donsBet;
    bets[DONNOCOUNT][idx] = 2;
  }
  var v = getHandValue(hand[idx]);
  evalSplit(hand, idx, player);
  if (hand[idx].length < 2) hand[idx][1] = deck[card++];
// alert("playHand "+i+" "+hand[idx]);
  if (evalDoubleDown(hand[idx]))
  {
    bets[player][idx] *= 2;
    if (player == DON) bets[DONNOCOUNT][idx] *= 2;
    hand[idx][2] = deck[card++];
    return;
  }
  softHit(hand[idx]);

  while (getHandValue(hand[idx]) < 12) hand[idx][hand[idx].length] = deck[card++];

  if (dealersUpCard >= "7")
  {
    while (getHandValue(hand[idx]) < 17)
    {
      hand[idx][hand[idx].length] = deck[card++];
    }
  }
}	/* playHand() */



/*  */
function isSoft(hand)
{
  var i;
  for (i = 0; i < hand[0].length; i++)
    if (hand[0][i] == 'A') return true;
  return false;
}	/* isSoft() */


function playDealersHand()
{
  var v = getHandValue(dealersHand);
  while ((v = getHandValue(dealersHand)) < 17)
  {
    while ((v = getHandValue(dealersHand)) < 17) dealersHand[dealersHand.length] = deck[card++];

    if ((isSoft(dealersHand)) && (v == 17)) dealersHand[dealersHand.length] = deck[card++];
  }
}	/* playDealersHand() */


function score()
{
  var i;

  var d = getHandValue(dealersHand);

  for (i = 0; i < 4; i++)
  {
    if (accomplicesHand[i].length < 1) break;
    var a = getHandValue(accomplicesHand[i]);
    if ((a > 21) || ((d < 22) && (d > a)))
    {
      accomplicesChips -= bets[ACCOMPLICE][i];
      document.getElementById("accomplicesResult"+i).innerHTML = "LOSER -"+bets[ACCOMPLICE][i];
      continue;
    }
    if ((a == 21) && (accomplicesHand[i].length == 2) && 
        !((d == 21) && (dealersHand.length == 2)))
    {
      accomplicesChips += ((bets[ACCOMPLICE][i] * 3) / 2);
      document.getElementById("accomplicesResult"+i).innerHTML = "WINNER +"+((bets[ACCOMPLICE][i] * 3) / 2);
      continue;
    }
    if ((a > d) || (d > 21))
    {
      accomplicesChips += bets[ACCOMPLICE][i];
      document.getElementById("accomplicesResult"+i).innerHTML = "WINNER +"+bets[ACCOMPLICE][i];
      continue;
    }
    if (a == d)
    {
      document.getElementById("accomplicesResult"+i).innerHTML = "PUSH";
      continue;
    }
  }
  document.getElementById("accomplicesChips").innerHTML = "Stack size: "+accomplicesChips;

  for (i = 0; i < 4; i++)
  {
    if (donsHand[i].length < 1) break;
    var a = getHandValue(donsHand[i]);
    if ((a > 21) || ((d < 22) && (d > a)))
    {
      donsChips -= bets[DON][i];
      document.getElementById("donsResult"+i).innerHTML = "LOSER -"+bets[DON][i];
      donsNoCountChips -= bets[DONNOCOUNT][i];
      continue;
    }
    if ((a == 21) && (donsHand[i].length == 2) && 
        !((d == 21) && (dealersHand.length == 2)))
    {
      donsChips += ((bets[DON][i] * 3) / 2);
      document.getElementById("donsResult"+i).innerHTML = "WINNER +"+((bets[DON][i] * 3) / 2);
      donsNoCountChips += ((bets[DONNOCOUNT][i] * 3) / 2);
      continue;
    }
    if ((a > d) || (d > 21))
    {
      donsChips += bets[DON][i];
      document.getElementById("donsResult"+i).innerHTML = "WINNER +"+bets[DON][i];
      donsNoCountChips += bets[DONNOCOUNT][i];
      continue;
    }
    if (a == d)
    {
      document.getElementById("donsResult"+i).innerHTML = "PUSH";
      continue;
    }
  }
  document.getElementById("donsChips").innerHTML = "&nbsp;&nbsp;&nbsp;Stack size: "+donsChips;
  document.getElementById("donsNoCountChips").innerHTML = "NC Stack size: "+donsNoCountChips;
  document.getElementById("benefit").innerHTML = "Benefit: "+(donsChips - donsNoCountChips);

}	/* score() */




function evalBet()
{
  if (accomplicesChips <= stackThreshold)
  {
    donsBet = increasedBet;
    document.getElementById("accomplice").style.backgroundColor = "#ff8888";
  }
  else
  {
    donsBet = 2;
    document.getElementById("accomplice").style.backgroundColor = "#ffffff";
  }
}



function initHands()
{
  dealersHand.length = 0;


  for (i = 0; i < 10; i++)
  {
    accomplicesHand[i].length = 0;
    donsHand[i].length = 0;
    bets[ACCOMPLICE][i] = 0;
    bets[DON][i] = 0;
  }
  document.forms[0].dealersHandValue.value = "";
  for (i = 0; i < 4; i++)
  {
    eval("document.forms[0].accomplicesHandValue"+i).value = "";
    eval("document.forms[0].donsHandValue"+i).value= "";
    document.getElementById("accomplicesCards"+i).innerHTML = "";
    document.getElementById("donsCards"+i).innerHTML = "";
    if (i > 0)
    {
      document.getElementById("aHand"+i).style.display = "none";
      document.getElementById("dHand"+i).style.display = "none";
    }
  }

}	/* initHands() */



function getParams()
{
  var frm = document.forms[0];
  if (frm.increasedBet.value.length > 0)
  {
    increasedBet = parseInt(frm.increasedBet.value);
    if (increasedBet & 0x1)
    {
      alert("odd!");
      increasedBet++;
      frm.increasedBet.value = increasedBet;
    }
  }

  if (frm.stackThreshold.value.length > 0)
    stackThreshold = parseInt(frm.stackThreshold.value);
  if (frm.maxHands.value.length > 0)
    maxHands = parseInt(frm.maxHands.value);

  if (frm.interval.value.length > 0)
    interval = parseInt(frm.interval.value);
}


var dealCnt = 0;
var timeoutID;

function autoDeal(reset)
{
  if (reset)
  {
    getParams();
    dealCnt = 0;
  }
  dealCnt++;
  if (dealCnt < maxHands)
    timeoutID = setTimeout("autoDeal(false)", interval);
  deal();
}


function deal()
{
  getParams();

  var j = 0;

  evalBet();

  if (card > ((52 * numberOfDecks * 2) / 3))
  {
//    alert("shuffling");
    shuffle();
  }

  document.getElementById("handCount").innerHTML = "Hand: "+(handCount++);
  initHands();

  for (i = 0; i < 2; i++)
  {
    accomplicesHand[0][i] = deck[card++];
    donsHand[0][i] = deck[card++];
    dealersHand[i] = deck[card++];
  }
  dealersUpCard = dealersHand[1];
  if ((dealersUpCard >= 'J') && (dealersUpCard <= 'Q')) dealersUpCard = 10;
  document.getElementById("dealersUpCard").innerHTML = "Dealers Up Card: "+dealersUpCard;
  document.getElementById("dealersCards").innerHTML = dealersHand;
  document.getElementById("accomplicesCards0").innerHTML = accomplicesHand[0];
  document.getElementById("donsCards0").innerHTML = donsHand[0];

  for (i = 0; i < 4; i++)
  {
    if (accomplicesHand[i].length < 1) break;
    playHand(accomplicesHand, i, ACCOMPLICE);
    if (accomplicesHand[i].length == 1) accomplicesHand[i][1] = deck[card++];
    eval("document.forms[0].accomplicesHandValue"+i).value = getHandValue(accomplicesHand[i]);
    document.getElementById("accomplicesCards"+i).innerHTML = accomplicesHand[i];
    if (getHandValue(accomplicesHand[i]) > 21)
      eval("document.forms[0].accomplicesHandValue"+i).value = getHandValue(accomplicesHand[i])+" BUST";
    if ((getHandValue(accomplicesHand[i]) == 21) && (accomplicesHand[i].length == 2))
      eval("document.forms[0].accomplicesHandValue"+i).value = getHandValue(accomplicesHand[i])+" BLACKJACK";
  }

  for (i = 0; i < 4; i++)
  {
    if (donsHand[i].length < 1) break;
    playHand(donsHand, i, DON);
    if (donsHand[i].length == 1) donsHand[i][1] = deck[card++];
    eval("document.forms[0].donsHandValue"+i).value = getHandValue(donsHand[i]);
    document.getElementById("donsCards"+i).innerHTML = donsHand[i];
    if (getHandValue(donsHand[i]) > 21)
      eval("document.forms[0].donsHandValue"+i).value = getHandValue(donsHand[i])+" BUST";
    if ((getHandValue(donsHand[i]) == 21) && (donsHand[i].length == 2))
      eval("document.forms[0].donsHandValue"+i).value = getHandValue(donsHand[i])+" BLACKJACK";
  }

  playDealersHand();
  document.forms["theForm"].dealersHandValue.value = getHandValue(dealersHand);
  if (getHandValue(dealersHand) > 21) document.forms["theForm"].dealersHandValue.value = getHandValue(dealersHand)+" BUST";
  document.getElementById("dealersCards").innerHTML = dealersHand;

  score();
  evalBet();
}	/* deal() */



function preload()
{
  initHands();
  card = 0;
  deck = [8, 6, 8, 4, 4, 'Q', 3, 10, 5, 5, 5, 5, 5, 5, 5];
  dealersHand = [2, 9];

  accomplicesHand[0] = [10, 'Q'];

  donsHand[0] = [8, 8];

  dealersUpCard = dealersHand[1];
  if ((dealersUpCard >= 'J') && (dealersUpCard <= 'Q')) dealersUpCard = 10;
  document.getElementById("dealersUpCard").innerHTML = "Dealers Up Card: "+dealersUpCard;
  document.getElementById("dealersCards").innerHTML = dealersHand;
  document.getElementById("accomplicesCards0").innerHTML = accomplicesHand[0];
  document.getElementById("donsCards0").innerHTML = donsHand[0];

  for (i = 0; i < 4; i++)
  {
    if (accomplicesHand[i].length < 1) break;
    playHand(accomplicesHand, i, ACCOMPLICE);
    if (accomplicesHand[i].length == 1) accomplicesHand[i][1] = deck[card++];
    eval("document.forms[0].accomplicesHandValue"+i).value = getHandValue(accomplicesHand[i]);
    document.getElementById("accomplicesCards"+i).innerHTML = accomplicesHand[i];
    if (getHandValue(accomplicesHand[i]) > 21)
      eval("document.forms[0].accomplicesHandValue"+i).value = getHandValue(accomplicesHand[i])+" BUST";
    if ((getHandValue(accomplicesHand[i]) == 21) && (accomplicesHand[i].length == 2))
      eval("document.forms[0].accomplicesHandValue"+i).value = getHandValue(accomplicesHand[i])+" BLACKJACK";
  }

  for (i = 0; i < 4; i++)
  {
    if (donsHand[i].length < 1) break;
    playHand(donsHand, i, DON);
    if (donsHand[i].length == 1) donsHand[i][1] = deck[card++];
    eval("document.forms[0].donsHandValue"+i).value = getHandValue(donsHand[i]);
    document.getElementById("donsCards"+i).innerHTML = donsHand[i];
    if (getHandValue(donsHand[i]) > 21)
      eval("document.forms[0].donsHandValue"+i).value = getHandValue(donsHand[i])+" BUST";
    if ((getHandValue(donsHand[i]) == 21) && (donsHand[i].length == 2))
      eval("document.forms[0].donsHandValue"+i).value = getHandValue(donsHand[i])+" BLACKJACK";
  }

  playDealersHand();
  document.forms["theForm"].dealersHandValue.value = getHandValue(dealersHand);
  if (getHandValue(dealersHand) > 21) document.forms["theForm"].dealersHandValue.value = getHandValue(dealersHand)+" BUST";
  document.getElementById("dealersCards").innerHTML = dealersHand;

  score();

}


function varReset()
{
  var i;
  shuffle();
  handCount = 1;
  dealCnt = 0;
  wallet = 0;
  donsChips = 100;
  donsNoCountChips = 100;
  accomplicesChips = 100;
  document.getElementById("handCount").innerHTML = "Hand: 0";
  document.getElementById("dealersCards").innerHTML = "";
  for (i = 0; i < 4; i++)
  {
    document.getElementById("donsCards"+i).innerHTML = "";
    document.getElementById("donsResult"+i).innerHTML = "";
    document.getElementById("accomplicesCards"+i).innerHTML = "";
    document.getElementById("accomplicesResult"+i).innerHTML = "";
  }
  document.getElementById("accomplicesChips").innerHTML = "Stack size: 100";
  document.getElementById("wallet").innerHTML = "Wallet: 0";
  document.getElementById("donsChips").innerHTML = "Stack size: 100";
  document.getElementById("donsNoCountChips").innerHTML = "NC Stack size: 100";
  document.getElementById("benefit").innerHTML = "Benefit: 0";
  clearTimeout(timeoutID);
}
