///////////////////////////////
//Blackjack Basic Strategy Trainer (Alpha)
//Javascript/DHTML Blackjack Memorizer
//Copyright 2005 Serge Saxonov
///////////////////////////////

/////////////////////////////////////////////////////////
//=======================================================
// ***Begin Utility Functions***
rnd.today=new Date();
rnd.seed=rnd.today.getTime();
function rnd() {
  rnd.seed = (rnd.seed*9301+49297) % 233280;
  return rnd.seed/(233280.0);
}
function setRndSeed(seed) {
  rnd.seed = seed;
  rnd();
}
function rand(n) {
  return Math.floor(Math.random() * (n));
}
function pickFromArray(A){
  return(A[rand(A.length)]);
}
function pickFromRange(i_start, i_end){ // Using pythonic ranges
  var i = rand(i_end-i_start);
  return i_start + i;
}

function max(a,b) { 
  var m = (a >= b) ? a : b; 
  return m;
}
//======================================================
////////////////////////////////////////////////////////


// Stuff to deal with cards
var cardWidth = 80;
var cardHeight = 112;
var numberOfDecks = 1;

card_types = Array("two_spades","three_spades","four_spades","five_spades","six_spades","seven_spades","eight_spades","nine_spades","ten_spades","jack_spades","queen_spades","king_spades","ace_spades","two_clubs","three_clubs","four_clubs","five_clubs","six_clubs","seven_clubs","eight_clubs","nine_clubs","ten_clubs","jack_clubs","queen_clubs","king_clubs","ace_clubs","two_diamonds","three_diamonds","four_diamonds","five_diamonds","six_diamonds","seven_diamonds","eight_diamonds","nine_diamonds","ten_diamonds","jack_diamonds","queen_diamonds","king_diamonds","ace_diamonds","two_hearts","three_hearts","four_hearts","five_hearts","six_hearts","seven_hearts","eight_hearts","nine_hearts","ten_hearts","jack_hearts","queen_hearts","king_hearts","ace_hearts");
card_images = Array();
for(var i =0;i<52;i++){ 
  var ci = new Image(cardWidth, cardHeight);
  ci.src =  "cards5/" + card_types[i] + ".80.gif";
  card_images.push(ci);
}
card_suits = Array('spades','hearts','clubs','diamonds');
//card_ranks = Array(1,2,3,4,5,6,7,8,9,10,11,12,13,1,2,3,4,5,6,7,8,9,10,11,12,13,1,2,3,4,5,6,7,8,9,10,11,12,13,1,2,3,4,5,6,7,8,9,10,11,12,13);
card_values =Array(2,3,4,5,6,7,8,9,10,10,10,10,11,2,3,4,5,6,7,8,9,10,10,10,10,11,2,3,4,5,6,7,8,9,10,10,10,10,11,2,3,4,5,6,7,8,9,10,10,10,10,11);
function card() {
    this.name = '';
    this.number = -1;
    this.value = '';
    this.type = '';
    this.image = 'none';
    this.suit = 'none';
}
function createAllCards(numberOfDecks) {
  var c;
  for (var i = 0; i < 52; i++) {
    c = createCard(i)
    allCards[i] = c;
    value_indices[c.value].push(c);
  }
}
function createCard(cardnumber) {
  cardtype = card_types[cardnumber];
  var c = new card();
  c.name = 'card' + cardnumber;
  c.number = cardnumber;
  c.type = cardtype;
  c.value = card_values[cardnumber];
  
  var info = cardtype.split('_');
  c.rank = c.number%13;
  c.kind = info[0];
  c.suit = info[1];
  c.image = card_images[cardnumber]
  return c;
}


//////////////////////////////////////////////////////////////////////////////
//==========================================================================//
// Structures, globals for dealing with hands
function hand(type, row, col) {
  this.type = type; // could be 'h', 's', or 'p' for hard, soft and split
  this.row = row;
  this.col = col;
}
function createHand(type, row, col){
  var h = new hand(type, row, col);
  return h;
}

var array_of_hands = new Array();
// First, add all the hard_total hands
for(var row = 8; row <18; row++)
  for(var col = 2; col < 12; col++)
    array_of_hands.push(createHand('h',row,col));
array_of_hands.splice(array_of_hands.length,0, createHand('h',18,2), createHand('h',18,4),createHand('h',18,6), createHand('h',18,8), createHand('h',18,10));
// Now all the soft hands
for(var row = 2; row <10; row++)
  for(var col = 2; col < 12; col++)
    array_of_hands.push(createHand('s',row,col)); // These are indexed by the non-ace card
// And all the splits
for(var row = 2; row <12; row++)
  for(var col = 2; col < 12; col++)
    array_of_hands.push(createHand('p',row,col));
//=====================================================\\

// These are for generating card combinations
value_indices = Array();
for(var i =0; i < 12; i++){
  value_indices[i] = new Array();
}

var sequence_of_hands = new Array();
var randomizedFlag = true;
var cycle_start = null;
var no_wrong = 0;
var no_right = 0;
var wrongFlag = 0;
//array_of_hands = array_of_hands.slice(0,20);
function setNewHandSequence(randomizedP){
    if (!randomizedP){
      sequence_of_hands = array_of_hands.slice();
      return;
    }
    temp_array = array_of_hands.slice();
    sequence_of_hands = new Array();
    while (temp_array.length>0){
      r=Math.floor(Math.random()*temp_array.length);
      sequence_of_hands.push(temp_array[r]);
      temp_array.splice(r,1);
    }
}
function _randomizePlayerCardOrder(){
    if(Math.random() > 0.5){ 
      var x = playerCard2; 
      playerCard2 = playerCard1; 
      playerCard1 = x;
    }
}
function _setProgressBarWidth(){
  maxwidth = parseInt(progbarC.style.width)
  //alert(maxwidth);
  progbar.style.width = maxwidth*(array_of_hands.length - sequence_of_hands.length)/array_of_hands.length
}
function generateCardsFromSequence(){
  if(sequence_of_hands.length < 1){
    return false;
  }
  new_hand = sequence_of_hands.shift();

  //progress_bar = document.getElementById('pb');
  //progress_bar.style.width = array_of_hands.length - sequence_of_hands.length;
  //debug_area.innerHTML += "hands covered: " + progbar.style.width +" " + sequence_of_hands.length +" " + array_of_hands.length+'<br>';
  //debug_area.innerHTML += "hand_kind: ("+new_hand.type+","+new_hand.row+","+new_hand.col+")<br>";

  if(new_hand.type == 'h'){
    card_sum = new_hand.row;
    // Here come up with a pair that give you the correct sum
    upper_range = Math.floor((card_sum-1)/2)+1;
    i1 = pickFromRange(max(2,card_sum-10), upper_range); 
    i2 = card_sum - i1;
    //debug_area.innerHTML += "values: ("+i1+","+i2+"["+upper_range+"])<br>"
    if(i2 > 10 || i2 < 2 || i1 == i2){
      alert("Error generating cards from (h,"+new_hand.row+","+new_hand.col+")");
    }
    playerCard1 = pickFromArray(value_indices[i1]);
    playerCard2 = pickFromArray(value_indices[i2]);
    _randomizePlayerCardOrder();
    dealerCard = pickFromArray(value_indices[new_hand.col]);
    return true;
  }
  else if(new_hand.type == 's'){
    playerCard1 = pickFromArray(value_indices[new_hand.row]);
    playerCard2 = pickFromArray(value_indices[11]);
    _randomizePlayerCardOrder();
    dealerCard = pickFromArray(value_indices[new_hand.col]);
    return true;
  }
  else if(new_hand.type == 'p'){
    playerCard1 = pickFromArray(value_indices[new_hand.row]);
    playerCard2 = pickFromArray(value_indices[new_hand.row]);
    dealerCard = pickFromArray(value_indices[new_hand.col]);
    return true;
  }
}

// This function is unnecessary at this point
/*function generateCardsRandomly(){
  dealerCard = pickFromArray(allCards);
  playerCard1 = pickFromArray(allCards);
  playerCard2 = pickFromArray(allCards);
}*/

function nextMove(){
  // Complete the last move
  wrongFlag = 0;
  no_handsleftEL.innerHTML = array_of_hands.length - no_wrong - no_right;
  _setProgressBarWidth();
  if(!generateCardsFromSequence()){ // reached the end of a cycle
    // So we need to 
    // (1) compile and present results for the cycle
    if(timerID)
      clearInterval(timerID);
    var now = new Date(); 
    time_took = now.getTime() - cycle_start;
    seconds = Math.floor(time_took/1000);
    var time_string = "" + seconds + " seconds";
    //var time_string = ""+ (hours>0?(""+hours+"h : "):"")  
     //               + (minutes>0?(""+minutes+"m : "):"")
     //               + seconds+ 's '
    alert_string = 'Your time for this cycle was '+ time_string +', and you got'
    switch(no_wrong){
      case 0:
        alert_string += ' none of the cases wrong. Excellent.';break;
      case 1:
        alert_string += ' 1 case wrong.'; break;
      default:
        alert_string += ' ' + no_wrong +' cases wrong.';
    }
    alert(alert_string);
    // (2) start a new sequence and cycle
    startNewCycle(randomizedFlag);     
  }
  else{ // cards were plucked normally from the sequence
    displayCards();
  }
}

function displayCards(){
  var cardPlaceD = document.getElementById("dealer_card_place");
  cardPlaceD.src = dealerCard.image.src;
  cardPlaceD.alt = dealerCard.kind + " of " + dealerCard.suit;
  cardPlaceD.title =  cardPlaceD.alt;
  var cardPlace1 = document.getElementById("card1_place");
  cardPlace1.src = playerCard1.image.src;
  cardPlace1.alt = playerCard1.kind + " of " + playerCard1.suit;
  cardPlace1.title =  cardPlace1.alt;
  var cardPlace2 = document.getElementById("card2_place");
  cardPlace2.src = playerCard2.image.src;
  cardPlace2.alt = playerCard2.kind + " of " + playerCard2.suit;
  cardPlace2.title =  cardPlace2.alt;
/*  debug_area.innerHTML += "numbers: ("+dealerCard.number+
    ","+playerCard1.number+","+playerCard2.number+")<br>";
  debug_area.innerHTML += "values: ("+dealerCard.value+
    ","+playerCard1.value+","+playerCard2.value+")<br>";
  debug_area.innerHTML += "ranks: (" + dealerCard.rank+
    ","+playerCard1.rank+","+playerCard2.rank+")<br>"
  debug_area.innerHTML += "("+dealerCard.type +
    ","+playerCard1.type+","+playerCard2.type+")<br>";
*/
  // Figure out the right move for the card combination 
  right_move = getTheRightMove();
  //DEBUG debug_area.innerHTML += "the right move: " + right_move;  
}
//==========================================================================//
//////////////////////////////////////////////////////////////////////////////

// Default Global Strategy (6 decks): stand on soft 17; 
// Playing without surrendering
/// Non-splits
var lower_thresh = 8; 
var lower_move = 'h';
var upper_thresh = 17;
var upper_move = 's';
/* Hard Hands */
var hard_totals = Array();
//////////////////////// 2    3    4    5    6    7    8    9    10   A
hard_totals[8] =  Array('h', 'h', 'h', 'h', 'h', 'h', 'h', 'h', 'h', 'h');
hard_totals[9] =  Array('h', 'd', 'd', 'd', 'd', 'h', 'h', 'h', 'h', 'h');
hard_totals[10] =  Array('d', 'd', 'd', 'd', 'd', 'd', 'd', 'd', 'h', 'h');
hard_totals[11] =  Array('d', 'd', 'd', 'd', 'd', 'd', 'd', 'd', 'd', 'h');
hard_totals[12] =  Array('h', 'h', 's', 's', 's', 'h', 'h', 'h', 'h', 'h');
hard_totals[13] =  Array('s', 's', 's', 's', 's', 'h', 'h', 'h', 'h', 'h');
hard_totals[14] =  Array('s', 's', 's', 's', 's', 'h', 'h', 'h', 'h', 'h');
hard_totals[15] =  Array('s', 's', 's', 's', 's', 'h', 'h', 'h', 'h', 'h');
hard_totals[16] =  Array('s', 's', 's', 's', 's', 'h', 'h', 'h', 'h', 'h');


/* Soft Hands */
var soft_totals = Array();
//////////////////////// 2    3    4    5    6   7    8    9    10   A
soft_totals[13] = Array('h','h','h','d','d','h', 'h','h','h','h'); // A-2
soft_totals[14] = Array('h','h','h','d','d','h', 'h','h','h','h'); // A-3
soft_totals[15] = Array('h','h','d','d','d','h', 'h','h','h','h'); // A-4
soft_totals[16] = Array('h','h','d','d','d','h', 'h','h','h','h'); // A-5
soft_totals[17] = Array('h','d','d','d','d','h', 'h','h','h','h'); // A-6
soft_totals[18] = Array('s','d','d','d','d','s', 's','h','h','h'); // A-7
soft_totals[19] = Array('s','s','s','s','s','s', 's','s','s','s'); // A-8
soft_totals[20] = Array('s','s','s','s','s','s', 's','s','s','s'); // A-9
soft_totals[21] = Array('s', 's', 's', 's', 's', 's', 's', 's','s', 's'); // A-10 hm...
soft_totals[22] = Array('h', 'h', 'h', 'h', 'h', 'h', 'h', 'h','h', 'h'); // A-A just to tie up...

/* Splits -- doubling after splits is allowed */
var split_pairs = Array();
//////////////////////// 2   3   4   5   6   7   8   9  10   A
split_pairs[2] =  Array('p','p','p','p','p','p','n','n','n','n');
split_pairs[3] =  Array('p','p','p','p','p','p','n','n','n','n');
split_pairs[4] =  Array('n','n','n','p','p','n','n','n','n','n');
split_pairs[5] =  Array('n','n','n','n','n','n','n','n','n','n');
split_pairs[6] =  Array('p','p','p','p','p','n','n','n','n','n');
split_pairs[7] =  Array('p','p','p','p','p','p','n','n','n','n');
split_pairs[8] =  Array('p','p','p','p','p','p','p','p','p','p');
split_pairs[9] =  Array('p','p','p','p','p','n','p','p','n','n');
split_pairs[10] = Array('n','n','n','n','n','n','n','n','n','n');
split_pairs[11] = Array('p','p','p','p','p','p','p','p','p','p');


//////////////////////////////////////////////////////////////////////////////////////
// each tuple is (i,j,rule)

function Strategy(id, short_desc, long_desc){
  this.id = id;
  this.short_desc = short_desc;
  this.long_desc = long_desc;  
  this.setChanges= function(hard_tuples, soft_tuples, split_tuples){
    this.hard_changes = new Array();
    this.soft_changes = new Array();
    this.split_changes = new Array();
    this.hard_changes_back = new Array();
    this.soft_changes_back = new Array();
    this.split_changes_back = new Array();
    for (var i =0; i < hard_tuples.length; i++){
      this.hard_changes[i] = hard_tuples[i].slice();
      this.hard_changes_back[i] = hard_tuples[i].slice(); this.hard_changes_back[i][2] = null;
    }
    for (var i =0; i < soft_tuples.length; i++){
      this.soft_changes[i] = soft_tuples[i].slice();
      this.soft_changes_back[i] = soft_tuples[i].slice(); this.soft_changes_back[i][2] = null;
    }
    for (var i =0; i < split_tuples.length; i++){
      this.split_changes[i] = split_tuples[i].slice();
      this.split_changes_back[i] = split_tuples[i].slice(); this.split_changes_back[i][2] = null;      
    }
  }
  //---------------------------------------------------------
  this.setStrategy = function(){
    for(var i =0; i < this.hard_changes.length; i++){
      tuple = this.hard_changes[i];
      this.hard_changes_back[i][2] = hard_totals[tuple[0]][tuple[1]];
      hard_totals[tuple[0]][tuple[1]] = tuple[2];
    }
    for(var i =0; i < this.soft_changes.length; i++){
      tuple = this.soft_changes[i];
      this.soft_changes_back[i][2] = soft_totals[tuple[0]][tuple[1]];
      soft_totals[tuple[0]][tuple[1]] = tuple[2];
    }
    for(var i =0; i < this.split_changes.length; i++){
      tuple = this.split_changes[i];
      this.split_changes_back[i][2] = split_pairs[tuple[0]][tuple[1]];
      split_pairs[tuple[0]][tuple[1]] = tuple[2];
    }
  }
  //---------------------------------------------------------
  this.unsetStrategy = function(){
    for(var i =0; i < this.hard_changes_back.length; i++){
      tuple = this.hard_changes_back[i];
      hard_totals[tuple[0]][tuple[1]] = this.hard_changes_back[i][2];
      this.hard_changes_back[i][2] = null;
    }
    for(var i =0; i < this.soft_changes_back.length; i++){
      tuple = this.soft_changes_back[i];
      soft_totals[tuple[0]][tuple[1]] = this.soft_changes_back[i][2];
      this.soft_changes_back[i][2] = null;
    }
    for(var i =0; i < this.split_changes_back.length; i++){
      tuple = this.split_changes_back[i];
      split_pairs[tuple[0]][tuple[1]] = this.split_changes_back[i][2];
      this.split_changes_back[i][2] = null;
    }
  }
}
// Playing without surrendering
// Now listing all the strategies;
strategy_list = new Array();
//===============
s = new Strategy("4d", "4d s17 DAS", 
    "This is the default strategy and is appropriate for 4 or more decks,"+
    "when the dealer stands on soft 17 and doubling after splits is allowed.<br><br>"+
    "This is a very common set of rules and this strategy is probably the most useful one to learn.");
// (hard_tuples, soft_tuples, split_tuples)
s.setChanges([],[],[]);
strategy_list['4d'] = s;
//===============
s = new Strategy("2d", "2d s17 DAS", 
    "This strategy is appropriate for 2 decks, when the dealer stands on soft 17,"+ 
    " and doubling after splits is allowed.<br><br>"+
    "A relatively common variant, very similar to the default.");
s.setChanges([[9,2-2,'d'], [11,11-2,'d'] ],  [],  [[6,7-2,'p'], [7,8-2,'p']]);
strategy_list['2d'] = s;
//===============
s = new Strategy("1d_h17_noDAS", "1d h17 noDAS", 
    "This strategy is appropriate for 1 deck, where the dealer hits on soft 17 "+
    "and no doubling after splits is allowed.<br><br>"+
    "This differs the most compared to the default; is played in downtown Las Vegas and Reno.");
s.setChanges([[8,5-2,'d' ], [8,6-2,'d'], [9,2-2,'d'],[11,11-2,'d'] ],
             [[13,4-2,'d'], [14,4-2,'d'], [17,2-2,'d'], [19,6-2,'d'] ], 
             [[2,2-2, 'n'], [3,2-2,'n'], [3,3-2,'n'], [4,5-2,'n'],[4,6-2,'n'],[7,10-2,'s'] ]);
strategy_list['1d_h17_noDAS'] = s;
//===============
s = new Strategy("4d_h17", "4d h17 DAS", 
    "This strategy is for 4 or more decks, where the dealer hits on soft 17, and doubling after splits is allowed."+
    "<br><br>Very similar to the default.");
    
s.setChanges([],
             [[18,2-2,'d'], [19,6-2,'d']],
             []);
strategy_list['4d_h17'] = s;
//===============

var current_strategy = strategy_list['4d']; //The default global 

function changeStrategy(strat_id){
  // 1. unset current strategy
  current_strategy.unsetStrategy();
  // 2. set new strategy
  var new_strat = strategy_list[strat_id];
  new_strat.setStrategy();
  // 3. rewrite the appropriate globals to account for the change
  current_strategy = new_strat;
  if(right_move != null)
    right_move = getTheRightMove();
  // 3a. make webpage changes.
  var strat_url = document.getElementById('strat_url');
  strat_url.href = "tables/"+strat_id+".html";
  var strat_desc = document.getElementById('strat_desc');
  strat_desc.innerHTML = current_strategy.short_desc;
  //strat_desc.title = current_strategy.long_desc;
  var strat_desc_note = document.getElementById('strat_desc_note');
  strat_desc_note.innerHTML = current_strategy.long_desc;
  var strategy_panel = document.getElementById('strategy_panel');
  strategy_panel.style.visibility = "visible";
  
}

function showCurrentStrategy(){
  var generator=window.open('bla',current_strategy.long_desc,'height=400,width=500');
  generator.document.write('<html><head><title>Basic Strategy Table</title>');
  generator.document.write('<link rel="stylesheet" href="style.css">');
  generator.document.write('</head><body>');
  generator.document.write('Table for '+ current_strategy.long_desc + 'id:' + current_strategy.id +"<br>");
  
  generator.document.write('Splits:');
  generator.document.write('<table><tr><th>Your cards</th>');
  for(i=2; i<10;i++)
    generator.document.write('<th>'+i+'</th>');
  generator.document.write('<th>T</th><th>A</th></tr>');
  for(i=2; i <12; i++){
    generator.document.write('<tr><td>('+ i+','+i + ')</td>');
    for(j=2; j < 12;j++)
         generator.document.write('<td>'+split_pairs[i][j-2] + '</td>');
    generator.document.write('</tr>');
  }
  generator.document.write('</table>');
  generator.document.write('Soft Totals:');
  generator.document.write('<table><tr><th>Your cards</th>');
  for(i=2; i<10;i++)
    generator.document.write('<th>'+i+'</th>');
  generator.document.write('<th>T</th><th>A</th></tr>');
  for(i=13; i <23; i++){
    generator.document.write('<tr><td>Soft '+ i+' </td>');
    for(j=2; j < 12;j++)
         generator.document.write('<td>'+soft_totals[i][j-2] + '</td>');
    generator.document.write('</tr>');
  }
  generator.document.write('</table>');
  generator.document.write('Hard Totals:');
  generator.document.write('<table><tr><th>Your cards</th>');
  for(i=2; i<10;i++)
    generator.document.write('<th>'+i+'</th>');
  generator.document.write('<th>T</th><th>A</th></tr>');
  for(i=8; i <17; i++){
    generator.document.write('<tr><td>Total '+ i+' </td>');
    for(j=2; j < 12;j++)
         generator.document.write('<td>'+hard_totals[i][j-2] + '</td>');
    generator.document.write('</tr>');
  }
  generator.document.write('</table>');
  generator.document.write('<p><a href="javascript:self.close()"> Close</a> the popup.</p>');
  generator.document.write('</body></html>');
  generator.document.close(); 
}

//////////////////////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////////////////////


function getTheRightMove(){
  /*if(playerCard1.value + playerCard2.value == 21)
    return 'bj';*/
  if(playerCard1.kind == playerCard2.kind){
    var split_decision = split_pairs[playerCard1.value][dealerCard.value-2];
    if(split_decision == 'p')
      return 'p';
    if(split_decision != 'n')
      return split_decision;
  }
  player_total = playerCard1.value + playerCard2.value;
  if (playerCard1.kind == 'ace' || playerCard2.kind == 'ace')
    return soft_totals[player_total][dealerCard.value-2]
  if (player_total <= lower_thresh)
    return lower_move;
  else if(player_total >= upper_thresh)
    return upper_move;
  else
    return hard_totals[player_total][dealerCard.value-2];
}
///////////////////////////////////////////////




// Globals referring to elements on the page
var message_area;
var wrongmove_area;
var progbarC;
var progbar;
var debug_area;
var hitbtn;
var standbtn;
var doublebtn;
var splitbtn;
var no_wrongEL; var no_rightEL; var no_handsleftEL; var timeEL;

var timerID;

var default_message_color = 'white';

var allCards = new Array();
var dealerCard = -1;
var playerCard1 = -1;
var playerCard2 = -1;
var right_move = null;

var moveText = new Array();
moveText['h'] = 'hit'; moveText['s'] = 'stand'; moveText['p'] = 'split'; moveText['d'] = 'double down';
var moveTextPastTense = new Array();
moveTextPastTense['h'] = 'hit'; moveTextPastTense['s'] = 'stood'; 
moveTextPastTense['p'] = 'split'; moveTextPastTense['d'] = 'doubled down';

/// Set up a little help note for the strategy mini-link
function createStratDescNote(){
    var strat_desc = document.getElementById('strat_desc');
    var noteObj = document.createElement("div");
    noteObj.id = 'strat_desc_note';
    document.body.appendChild(noteObj);
    strat_desc.onclick=function(evt){
        var strat_desc_note = document.getElementById('strat_desc_note');
        if(evt) //for mozilla browsers
          event = evt;
        strat_desc_note.style.left=event.clientX-280;
        strat_desc_note.style.top=event.clientY+20;
        var select_box = document.getElementById("gameRules");
        select_box.style.visibility = "hidden";
        strat_desc_note.style.visibility='visible';
    }
    strat_desc.onmouseout = function(){
        var select_box = document.getElementById("gameRules");
        select_box.style.visibility = "visible";
        var strat_desc_note=document.getElementById('strat_desc_note');
        strat_desc_note.style.visibility='hidden';
    }
}

function init() {
  message_area = document.getElementById('messages');
  wrongmove_area = document.getElementById('wrongmove');
  //DEBUG debug_area = document.getElementById('debug_area');
  progbarC = document.getElementById('pbc');
  progbar = document.getElementById('pb');
  hitbtn = document.getElementById("hitbtn");
  standbtn = document.getElementById("standbtn");
  doublebtn = document.getElementById("doublebtn");
  splitbtn = document.getElementById("splitbtn");
  no_wrongEL = document.getElementById("no_wrong");
  no_rightEL = document.getElementById("no_right");
  //no_handsleftEL = document.getElementById("no_handsleft");
  no_handsleftEL = new function(){}; // dummy object, because in the current implementatation
                                     // we are not displaying no_handsleft
  
  timeEL = document.getElementById("time");
  createStratDescNote();
  var select_box = document.getElementById("gameRules");
  select_box.selectedIndex = 0;
  changeStrategy(select_box.options[select_box.selectedIndex].value)
  document.onkeyup = processKeyUp;
  document.onkeypress = processKeyPress;
  createAllCards(1);
  var wait_screen = document.getElementById("wait_screen");
  if(wait_screen.parentNode){
    wait_screen.parentNode.removeChild(wait_screen);
  }
  startNewCycle(true)
}
// functions for doing cycling 
function setUpProgressBar(){
  //progbarC.width = array_of_hands.length + 2;
  progbarC.style.visibility = "visible";
  progbar.style.width = 0;
  progbar.style.visibility = "visible";
  //progbar.style.width = array_of_hands.length - sequence_of_hands.length;
}
function dropProgressBar(){
  progbar.style.visibility = "hidden";
  progbarC.style.visibility = "hidden";
}
function startNewCycle(){
  if(timerID)
    clearInterval(timerID);
  timeEL.innerHTML = "0s";

  if(document.getElementById('fixedOrderBox').checked)
    randomizedFlag = false;
  else
    randomizedFlag = true;
  setNewHandSequence(randomizedFlag);
  wrongFlag = 0;
  no_wrong = 0; no_right = 0;
  no_wrongEL.innerHTML = no_wrong;
  no_rightEL.innerHTML = no_right;
  no_handsleftEL.innerHTML = array_of_hands.length - no_wrong - no_right;
  setUpProgressBar();
  var now = new Date();
  cycle_start = now.getTime();
  timerID = setInterval("updateTime()",1000)
  nextMove();
}
function stopCycling(){
  sequence_of_hands.length = 0;
  cyclingFlag = false;
  no_wrong = 0; no_right = 0;
  wrongFlag = 0;
  dropProgressBar();
  nextMove();
}


function updateTime(){
  var now = new Date();
  var ms = now.getTime() - cycle_start;
  timeEL.innerHTML = "" + Math.floor(ms/1000) + "s"; //Math.floor(ms/1000);
}

function processKeyPress(evt){
  evt = (evt) ? evt:window.event;
  var code;
  code = (evt.charCode)?  evt.charCode: evt.keyCode;
  switch(code){
    case 72: case 104:
    case 83: case 115:
    case 68: case 100:
    case 80: case 112:
      return false;
    default:
  }
return true;

}
function processKeyDown(evt){
  evt = (evt) ? evt:window.event;
  //debug_area.innerHTML = "You pressed: " + evt.keyCode;
}

function processKeyUp(evt){
  evt = (evt) ? evt:window.event;
  var code;
  code = (evt.charCode)?  evt.charCode: evt.keyCode;
  switch(code){
    case 72: case 104:
      hitbtn.focus();
      playerMove('h');
      return false;
    case 83: case 115:
      standbtn.focus();
      playerMove('s');
      return false;
    case 68: case 100:
      doublebtn.focus();
      playerMove('d');
      return false;
    case 80: case 112:
      splitbtn.focus();
      playerMove('p');
      return false;
    default:
  }
  return true;
}

function getPlayerCardsText(){
  return("("+playerCard1.kind+", "+playerCard2.kind+")");
}

function setMessageColorRight(){
  message_area.style.color = "#00681c";
}

function playerMove(move_type){
  wrongmove_area.innerHTML = "";
  if((move_type == 'p') && (playerCard1.rank != playerCard2.rank )){
    wrongmove_area.style.color="#c88900";
    wrongmove_area.innerHTML = " You can only split if your cards are of the same rank.";
    return;
  }
  if(right_move == move_type){
    //debug_area.innerHTML = "";
    wrongmove_area.innerHTML = "";
    if(!wrongFlag){
      ++no_right;
      no_rightEL.innerHTML = no_right;
    }
    var strat_url = document.getElementById("strat_url");
    strat_url.style.color = ""; /* default is #2E5261 */

    /*setMessageColorRight();
    message_area.innerHTML = "Good move.<br><br>You "+ moveTextPastTense[right_move] + 
      " on " +getPlayerCardsText()+ " against the dealer's " + dealerCard.kind + ".";*/
    nextMove();
  }
  else{
    wrongmove_area.style.color="#cc0060";
    if(wrongFlag){
      wrongmove_area.innerHTML = "Nope, wrong move again. You should " + moveText[right_move]+ ".";
    }
    else{
      ++no_wrong;
      no_wrongEL.innerHTML = no_wrong;      
      wrongmove_area.innerHTML = "Wrong move: you should " + moveText[right_move]+ "." 
      var strat_url = document.getElementById("strat_url");
      strat_url.style.color = "#cc0060"; /* default is #2E5261 */
    }
    wrongFlag = 1;
  }
}

//=======================================================================//
///////////////////////////////////////////////////////////////////////////


