var SCRIPT_TITLE  = "FT - Stud Hand Converter";
var STATUS_MSG    = "Status: ";
var HERO_ID       = "Hero";
var ACTION_SEP    = " ___";
var ALL_IN_ID     = "all-in";
var DEAL_ID       = "Dealt to ";
var HAND_NUMBER   = "Hand #";
var INVALID_INPUT = "Invalid hand history, make sure you paste the whole thing.";

var CONVERTER_LINK_A = " ([url=http://www.alliance-x.com/stud_converter.html]";
var CONVERTER_LINK_B = "converter[/url])";

var output_format = "1";

var UBB_CODE    = "1";
var HTML        = "2";
var PLAIN_TEXT  = "3";

var pokerSite = 1;

var FULL_TILT = 1;

var hand = {
  hand_start: 0, 
  hand_end: 0, 
  tourney_hand: false, 
  street_number: 3, 
  last_street: 3, 
  street_start: 0, 
  street_end: 0, 
  big_bet: "",
  small_bet: "",  
  ante: "", 
  bring_in: "", 
  pot: 0, 
  hero_max: "", 
  stud_hand: true, 
  dbl_raise: false, 
}

var players = new Array(8);
for(var p = 0; p < players.length; p++) {
  players[p] = {
    seat: "", 
    s_name: "", 
    first_card: "", 
    second_card: "", 
    last_card: "", 
    in_hand: false,
    all_in: false, 
    stack: 0, 
    orig_seat: "", 
    last_bet: "", 
  }
}


var actions = new Array(7);
for(var i in actions) {
  actions[i] = new Array();
}
var ACTION_INDEX = 0;
var FIRST_ACTION = 1;

var valid_actions = ["brings", "completes", "folds", "checks", "calls", "bets", "raises"];
var ACTION_BI     = 0;
var ACTION_FOLD   = 2;
var ACTION_BET    = 5;
var ACTION_RAISE  = 6;

// Misc variables
var hand_count = 0;
var single_hand;
var converter_output = "";
var line_start;
var line_end;
var current_line;
var max_sname_length;
var decimal_point;
var bln_script_running;

// FullTilt constants
var FT_SITE_ID      = "Full Tilt Poker";
var FT_SITE_ID_PTS  = "FullTiltPoker";
var FT_HAND_ID      = "Poker Game #";

// Const FTHighID = "Seven Card Stud -"
// Const FTHighLowID = "Seven Card Stud Hi/Lo"
// Const FTRazzID = "Limit Razz"

var FT_HIGH_ID      = "Limit Stud Hi ";
var FT_HIGH_LOW_ID  = "Limit Stud H/L";
var FT_RAZZ_ID      = "Limit Razz";

var FT_SEAT_ID      = "Seat ";
var FT_ANTE_ID      = " antes";
var FT_BRINGIN_ID   = "brings in for ";
var FT_BRINGIN_MSG  = "brings-in";
var FT_ALLIN_ID     = ", and is all in";
var FT_UNCALLED     = "Uncalled bet of ";
var FT_POT_ID       = "Total pot ";

var FT_THIRD_ST_ID  = "* 3RD STREET *";
var FT_SHOWDOWN     = "* SHOW DOWN *";
var FT_SUMMARY      = "* SUMMARY *";

function windowOnload() {
  decimal_point = decimalPoint();
  output_format = UBB_CODE;
}

function get(el) {
  return document.getElementById(el);
}

function runScript() {
  var no_input = "The input area is empty - please paste some hand histories.";

  if(get("script_input").value == "") {
    alert(no_input);
  } else {
    bln_script_running = true;
    
    hand_count = 0;
    hand.hand_start = 1;
    converter_output = "";
    //arrHand[HAND_START] = 1;

    get("script_input").value = get("script_input").value + '\n';

    get("status_line").innerHtml = STATUS_MSG;

    disableControls();
    actions = [];
    current_line = "foo";
    setTimeout("scriptMain()", 1);
    //scriptMain();
  }
}

function scriptMain() {
  
  while(true) {
    if(gotHand()) {
      if(hand_count == 0) get("script_output").value = "";

      convertHand();
      hand_count++;
      updateStatus();

      window.setTimeout('scriptMain()', 1);
    } else {

      switch(output_format) {
        case HTML:
        convertToHTML();
        break
        case PLAIN_TEXT:
        convertToText();
        break
      }

      updateStatus();

      get("script_output").value = converter_output;

      enableControls();
      bln_script_running = false;
      break;
    }
  }
}

function gotHand() {
  if(hand.hand_start == 1) {
    if(foundSite()) { getFirstHand() } else { return; }
  } 
  else {
    if(hand.hand_end == get("script_input").value.length) {
      return false;
    } 
    else {
      hand.hand_start = hand.hand_end;
    }
  }
  
  getHandEnd()
  
  single_hand = get("script_input").value.substr(hand.hand_start, (hand.hand_end - hand.hand_start))
  
  single_hand = removeSpaces(single_hand);
  return true;
}

function convertHand() {
   initHand()
   getTitleFT()
   
   if(output_format == UBB_CODE) {
     updateOutput(CONVERTER_LINK_A + CONVERTER_LINK_B, false, false)
   }
   if(get("show_stacks").checked || hand.tourney_hand) {
     updateOutput("", true, false)
   }
   
   getPlayers();
   getStreet();
   
   get("show_results").checked ? getResults() : updateOutput("",true,true);
   
   updateOutput("", true, false)
}

function getResults() {
   var ShuffleMsg = "Note: this site shuffles the hole cards."
   var pos;
   var pos1;
   
   updateOutput("\n" +  "Results (in white):[color=white]", true, true)
   
   hand.street_start = hand.street_end;
   hand.street_end = hand.hand_end;
   
   pos = single_hand.indexOf(FT_POT_ID, hand.street_start)
   
   if(pos > 0) {
     pos1 = single_hand.indexOf("|", pos)
   }    

   if(pos1 > 0) {
     pos1 = single_hand.indexOf("\n", pos1)
   } else {
     pos1 = single_hand.indexOf("\n", pos)
   }
   
   if(pos1 > 0) {
     updateOutput(single_hand.substr(pos, pos1 - pos), true, true)
   }
   
   updateOutput(ShuffleMsg, true, true)
   
   getResultsFT()
   
   updateOutput("[/color]", false, false)
}  

function getResultsFT() {
  var FTShows = " showed "
  var FTMucked = " mucked "
  var i;
  var pos, pos1, pos2, pos3;
  var tempResults;

  for(i = 0; i < players.length; i++) {
    
    if(players[i]["in_hand"] && (players[i]["seat"] != HERO_ID)) {
      tempResults = ""

      pos = single_hand.indexOf(players[i]["s_name"] + FTShows, hand.street_start);

      if(pos > 0) {
        pos3 = single_hand.indexOf("\n", pos)
        pos1 = single_hand.indexOf("[", pos)

        if((pos1 > 0) && (pos1 < pos3)) {
          pos2 = single_hand.indexOf("]", pos1)

          if( (pos2 > 0) && (pos2 < pos3) ) {
            tempResults = single_hand.substr(pos1, pos2 - pos1 + 1)
          }
        }
      } else {
        pos = single_hand.lastIndexOf(players[i]["s_name"] + FTMucked)

        if( onThisStreet(pos) ) {
          pos2 = single_hand.indexOf("\n", pos)
          pos1 = single_hand.indexOf("[", pos)

          if( (pos1 > 0) && (pos1 < pos2) ) {
            tempResults = single_hand.substr(pos1, pos2 - pos1)
          } else if( (pos1 > 0) && (pos2 = 0) ) {
            tempResults = single_hand.substr(single_hand.length - pos1 + 1)
          }
        }
      }

      if(tempResults == "") {
        pos = single_hand.lastIndexOf(players[i]["s_name"] + FTShows)

        if(pos > 0) {
          pos3 = single_hand.indexOf("\n", pos)
          pos1 = single_hand.indexOf("[", pos)

          if( (pos1 > 0) && (pos1 < pos3) ) {
            pos2 = single_hand.indexOf("]", pos1)

            if( (pos2 > 0) && (pos2 < pos3) ) {
              tempResults = single_hand.substr(pos1, pos2 - pos1 + 1)
            }
          }
        }
      }

      if( tempResults != "") {
        tempResults = tempResults.replace("(", "")
        tempResults = tempResults.replace(")", "")
        tempResults = tempResults.replace("- ", "")
        tempResults = tempResults.replace("]", "] -")

        if(output_format == UBB_CODE) {
          tempResults = players[i]["seat"] + ": " + tempResults
        } else {
          tempResults = players[i]["s_name"] + ": " + tempResults
        }

        updateOutput(tempResults, true, true)
      }
    }
  }
}

function getStreet() {
  var i, z;
  var cards;
  var streetID;

  updateOutput("", true, false)

  switch(hand.street_number) {
    case 3:
    streetID = "[b]3rd Street[/b]"
    break;
    case 7:
    streetID = "[b]River[/b]"
    break;
    default:
    streetID = "[b]" + hand.street_number + "th Street[/b]"
  }

  updateOutput(streetID + " - " + getPot(), true, true)

  getAction();
  
  for(i = 0; i < players.length; i++) {
    if(players[i]["in_hand"]) {
      if((hand.street_number == 7) && (players[i]["seat"] != HERO_ID)){ 
        listCards(i)
        listAction(i)
      } else {
        cards = getRawCards(i)

        if(cards == "" || !cards) {
          players[i]["in_hand"] = false;
          
        } else {
          getCards(i, cards)

          if( players[i]["cards"][hand.street_number - 1] != ""){
            listCards(i)
            listAction(i)
          }
        }
      }

      actions[i][ACTION_INDEX] = FIRST_ACTION;
      
      for(z = FIRST_ACTION; z<=actions[i].length-1; z++) {
        actions[i][z] = "";
      }

      players[i]["last_bet"] = 0;
    }
  }

  if( (hand.street_number < 7) && !hand.last_street) {
    hand.street_number = hand.street_number + 1;
    hand.street_start = hand.street_end;
    hand.street_end = getNextStreetFT();
    current_line = "foo";
    getStreet();
  } else {
    updateOutput("\n" + "[b]Total pot:[/b] " + getPot().replace(")", "") +
    " - " + formatMoney(hand.pot) + ")", true, false)
  }
}

function listAction(player) {
  var z;
  var tempAction = "";

  for(z=1; z<=actions[player].length; z++) {
    if(actions[player][z]) {
      tempAction = tempAction + ACTION_SEP + actions[player][z];

      if(actions[player][z] == valid_actions[ACTION_FOLD]) {
        players[player]["in_hand"] = false;
      }
    }
  }

  if(tempAction != "") {
    updateOutput(tempAction, false, false)
  } else if(players[player]["all_in"]) {
    updateOutput(ACTION_SEP + ALL_IN_ID, false, false)
  }
}

function getAction() {
  var ACTION_EXCEEDED = "action truncated";
  var i, z;
  var pos, pos1;
  var sname_len; //sname_len
  var action_line; //actionLine
  var temp_action; //tempAction
  var bln_first_action; //blnFirstAction

  pos = single_hand.lastIndexOf(DEAL_ID, hand.street_end)

  if(onThisStreet(pos)){
    pos1 = single_hand.indexOf("\n", pos)
    line_start = pos1 + "\n".length
  }

  while(current_line != "") {
    nextLine();
    
    if (current_line == "") { break; };

    if (current_line.substr(0, FT_UNCALLED.length) == FT_UNCALLED) {
      action_line = current_line.substr(current_line.length - FT_UNCALLED.length)

      pos = action_line.indexOf(" ")

      action_line = "x " + action_line.substr(pos - 1)

      countPot(0, action_line, FT_UNCALLED)
    }

    for(i=0; i < players.length; i++ ) {
      if(players[i]["in_hand"]) {
        sname_len = (players[i]["s_name"] + " ").length

        if(current_line.substr(0, sname_len) == (players[i]["s_name"] + " ")) {
          action_line = current_line.substr(sname_len)
          pos = action_line.indexOf(" ")

          if(pos > 0) {
            temp_action = action_line.substr(0, pos);
          } else {
            temp_action = action_line;
          }

          if(validAction(temp_action)) {
            if(temp_action == valid_actions[ACTION_BI]) {
              temp_action = FT_BRINGIN_MSG;
            }

            pos = action_line.indexOf(FT_ALLIN_ID)

            if(pos > 0) {
              players[i]["all_in"] = true;
              temp_action = action_line.replace(FT_ALLIN_ID, " (" + ALL_IN_ID + ")")
              action_line = action_line.substr(pos - 1)
            }

            temp_action = countPot(i, action_line, temp_action)

            if(!bln_first_action) {
              bln_first_action = true
              temp_action = "[b]" + temp_action + "[/b]"
            }

            z = actions[i][ACTION_INDEX]; //arrAction[i][ACTION_INDEX]

            if(z < actions.length) {
              if(players[i]["all_in"]) {
                actions[i][z] = temp_action;
              }  else {
                actions[i][z] = temp_action;
              }

              z = z + 1;
              actions[i][ACTION_INDEX] = z;
            } else {
              actions[i][z] = ACTION_EXCEEDED;
            };
          };
        };
      };
    };
  };
};

function countPot(player, actionBets, action) {
  var DoubleBet = "double-";
  var pos, pos1;
  var bet;

  pos = actionBets.lastIndexOf(" ")

  if (pos > 0) {
    bet = actionBets.substr(pos)
    bet = parseFloat(convertMoney(bet))

    if (bet) {
      if (action == FT_UNCALLED) {
        hand.pot = hand.pot - bet;
        return
      };

      if (hand.stud_hand && (hand.street_number == 4)) {
        if ((action == valid_actions[ACTION_BET]) && 
            ((bet / 1) > (hand.small_bet / 1))) {
          action = DoubleBet + action;
        } else if ( action == valid_actions[ACTION_RAISE]) {
          if (!hand.dbl_raise) {
            hand.dbl_raise = true;

            if ((bet - hand.small_bet / 1) == (hand.big_bet / 1)) {
              action = DoubleBet + action;
            };
          };
        };
      };

      if ((action == valid_actions[ACTION_RAISE]) || 
          (action == valid_actions[ACTION_BET])) {
        hand.pot = hand.pot - parseFloat(players[player]["last_bet"]);
        players[player]["last_bet"] = bet;
      } else if (players[player]["last_bet"] == 0) {
        players[player]["last_bet"] = bet
      }

      hand.pot = parseFloat(hand.pot) + bet;
      hand.pot = hand.pot.toFixed(2);
    };
  };
  return action;
}

function validAction(action) {
  for ( var i = 0; i < valid_actions.length; i++) {
    if (action == valid_actions[i]) {
      return true;
    }
  }
}

function  listCards(player) {
  var i;
  var tempName;

  if (output_format == UBB_CODE) {
    tempName = players[player]["seat"] + ":"
  } else if ( players[player]["s_name"].length == max_sname_length) {
    tempName = players[player]["s_name"] + ":"

    if (hand.hero_max && (players[player]["seat"] != HERO_ID)) {
      tempName = tempName + "\t";
    };
  } else {
    switch(output_format) {
      case HTML:
      tempName = players[player]["s_name"] + ":" + 
        ("\t" * (max_sname_length - players[player]["s_name"].length));

      if (players[player]["seat"] == HERO_ID) {
        tempName = tempName.substr(tempName.length - 1)
      } else if (hand.hero_max) {
        tempName = tempName + "\t"
      };
      break;
      case PLAIN_TEXT:
      tempName = players[player]["s_name"] + ":" + 
        (" " * (max_sname_length - players[player]["s_name"].length));
      break;
    };
  };

  updateOutput(tempName, true, false)

  for(i = 0; i < hand.street_number; i++) {
    updateOutput(" " + players[player]["cards"][i], false, false)
  };
};

function  getCards(player, cards) {
  var i, z;
  var oneCard;

  z = 0;

  for (var i=1; i < cards.length; i++) {
    switch(cards.substr(i,1)) {
      case "c":
        oneCard = cards.substr(i-1,1) + " :club:";
        break;
      case "d":
        oneCard = cards.substr(i-1,1) + " :diamond:";
        break;
      case "h":
        oneCard = cards.substr(i-1,1) + " :heart:";
        break;
      case "s":
        oneCard = cards.substr(i-1,1) + " :spade:";
        break;
      default:
        oneCard = "";
    }

    if (oneCard != "") {
      if ((hand.street_number == 3) &&
      (players[player]["seat"] == HERO_ID)) {
        players[player]["cards"][z] = oneCard
        z = z+1
      } else {
        players[player]["cards"][hand.street_number - 1] = oneCard
      };
    };
  };
};

function getRawCards(player) {
  var pos, pos1

  pos = single_hand.indexOf(DEAL_ID + players[player]["s_name"], hand.street_start)

  if (onThisStreet(pos)) {
    pos = pos + (DEAL_ID + players[player]["s_name"]).length + 1
    pos1 = single_hand.indexOf("\n", pos)

    return single_hand.substr(pos, pos1 - pos)
  };
}

function getPot() {
  var out
  if (hand.street_number < 5) {
    out = "(" + parseFloat(hand.pot) / parseFloat(hand.small_bet) + " SB)"
  } else {
    out = "(" + parseFloat(hand.pot) / parseFloat(hand.big_bet) + " BB)"
  }
  
  return out.replace(",", ".")
}

function  getPlayers() {
  // (FT) Seat 1: XXX ($49.40), is sitting out
  var i;
  var pos, pos1;

  max_sname_length = 0;

  for (var i=0; i < players.length; i++) {
    pos = single_hand.indexOf(players[i]["seat"] + ": ")

    if (pos > 0) {
      pos = pos + (players[i]["seat"] + ": ").length
      pos1 = single_hand.indexOf(" (", pos)

      if (pos1 > 0) {
        players[i]["s_name"] = single_hand.substr(pos, pos1 - pos)
      };
    };

    if (players[i]["s_name"] != "") {
      if (playerAnted(i)) {
        players[i]["in_hand"] = true;

        hand.pot = parseFloat(hand.pot) + parseFloat(hand.ante);
        hand.pot = hand.pot.toFixed(2);

        if (players[i]["s_name"].length > max_sname_length) {
          max_sname_length = players[i]["s_name"].length;
        };

        if (get("show_stacks").checked || hand.tourney_hand) {
          players[i]["stack"] = getStacks(pos);
        };

        players[i]["orig_seat"] = players[i]["seat"];

        if (gotHero(i)) {
          players[i]["seat"] = HERO_ID
        } else {
          players[i]["first_card"]  = "xx"
          players[i]["second_card"] = "xx"
          players[i]["last_card"]   = "xx"
          players[i]["cards"][0] = players[i]["first_card"];
          players[i]["cards"][1] = players[i]["second_card"];
          players[i]["cards"][6] = players[i]["last_card"];
        }
      };
    };
  };

  for (var i=0; i < players.length; i++) {
    if (players[i]["in_hand"]) {
      if ((output_format == HTML) && (players[i]["seat"] == HERO_ID)) {
        if (players[i]["s_name"].length == max_sname_length) {
          hand.hero_max = true;
        };
      };

      if (get("show_stacks").checked || hand.tourney_hand) {
        displayStacks(i)
      };
    };
  };
}

function displayStacks(player) {
  var tempName;

  if (output_format == UBB_CODE) {
    tempName = players[player]["seat"] + ": "
  } else if (players[player]["s_name"].length == max_sname_length) {
    tempName = players[player]["s_name"] + " (" + players[player]["orig_seat"] + "): "
  } else {
    switch(output_format) {
      case HTML:
        tempName = players[player]["s_name"] + 
              ("\t" * (max_sname_length - players[player]["s_name"].length)) +
              " (" + players[player]["orig_seat"] + "): "
        break;
      case PLAIN_TEXT:
        tempName = players[player]["s_name"] + 
                (" " * (max_sname_length - players[player]["s_name"].length)) +
                " (" + players[player]["orig_seat"] + "): "
        break;
    }
  }

  updateOutput(tempName + formatMoney(players[player]["stack"]), true, false)
}

function gotHero(player) {
  // Dealt to xxx [8s]
  // Dealt to xxx [4c Qs] [9s]
  var CardsLen = 6;
  var pos, pos1;

  pos = single_hand.indexOf(DEAL_ID + players[player]["s_name"]);

  if (pos > 0) {
    pos = pos + (DEAL_ID + players[player]["s_name"]).length + 1;
    pos1 = single_hand.indexOf("\n", pos);

    if (single_hand.substr(pos, pos1 - pos).length > CardsLen) {
      return true;
    };
  };
}

function getStacks(posStart) {
  // (FT) Seat 1: XXX ($49.40), is sitting out
  var pos, pos1

  pos = single_hand.indexOf("(", posStart) + 1;

  if (pos > 0) {
    pos = pos + 1
    pos1 = single_hand.indexOf(")", pos)

    if (pos1 > 0) {
      return single_hand.substr(pos, pos1 - pos)
    };
  };
}

function playerAnted(player) {
  var pos
  pos = single_hand.indexOf( players[player]["s_name"] + FT_ANTE_ID )

  if (pos > 0) {
    return true
  };
}

function  getTitleFT() {
  var ErrorMsg = "Error found in getTitleFT "
  // Full Tilt Poker Game #581386131: Table Arroyo Grande - $0.25/$0.50 Ante $0.05
  // Ante $0.05 - Limit Seven Card Stud - 19:42:37 ET - 2006/04/20

  // Full Tilt Poker Game #577081643: Table Play Chip 167 - 100/200 Ante 20 -
  // Ante 20 - Limit Seven Card Stud Hi/Lo - 21:21:27 ET - 2006/04/18

  // Full Tilt Poker Game #574598537: Table Spring Mountain - $0.50/$1 Ante $0.10
  // Ante $0.10 - Limit Razz - 19:59:02 ET - 2006/04/17

  // Full Tilt Poker Game #577099357: $5 + $0.50 Sit & Go (3769121), Table 1 - 30/60
  // 30/60 Ante 5 - Limit Seven Card Stud - 21:28:24 ET - 2006/04/18

  // xxx brings in for $0.10

  var ante_id = " Ante ";
  var pos, pos1;
  var pos_save;

  pos_save = 1;

  // Get hand number
  if (output_format != UBB_CODE) {
    pos = single_hand.indexOf("#", pos_save)

    if (pos > 0) {
      pos = pos + 1
      pos1 = single_hand.indexOf(":", pos)

      if (pos1 > 0) {
        updateOutput(HAND_NUMBER + single_hand.substr(pos, pos1 - pos), false, true)
        pos_save = pos1
      };
    } else {
      reportError(ErrorMsg + "(hand number).")
    }
  };

  // Get stakes
  pos1 = single_hand.indexOf(ante_id, pos_save)

  if (pos1 > 0) {
    pos = single_hand.lastIndexOf(" ", pos1 - 1)
    pos = pos + 1

    getStakes(single_hand.substr(pos, pos1 - pos))
    pos_save = pos1 + ante_id.length
  } else {
    reportError(ErrorMsg + "(ante).")
  }

  // Check for tourney
  pos = single_hand.lastIndexOf(")", pos_save)

  if (pos > 0) {
    hand.tourney_hand = true;
  };

  // Get ante
  pos = single_hand.indexOf(" ", pos_save)
  hand.ante = convertMoney(single_hand.substr(pos_save, pos - pos_save));

  // Get bring-in
  pos = single_hand.indexOf(FT_BRINGIN_ID, pos_save);

  if (pos > 0) {
    pos = pos + FT_BRINGIN_ID.length;
    pos1 = single_hand.indexOf("\n", pos);

    hand.bring_in = convertMoney(single_hand.substr(pos, pos1 - pos));
  };

  // Get game type
  getGameType(pos_save, FT_HIGH_ID, FT_HIGH_LOW_ID, FT_RAZZ_ID)
}

function  getGameType(posStart, highID, highLowID, razzID) {
  var ErrorMsg   = "Error found in getGameType."
  var TourneyMsg = "Tournament - "
  var HighMsg    = "7 Card Stud [b]High[/b] "
  var HighLowMsg = "7 Card Stud [b]High-Low[/b] "
  var RazzMsg    = "[b]Razz[/b] "
  var pos;

  if (hand.tourney_hand) {
    updateOutput(TourneyMsg, false, false)
  }

  pos = single_hand.indexOf(highID, posStart)

  if (pos > 0) {
    hand.stud_hand = true;
    updateOutput(HighMsg, false, false)
  } else {
    pos = single_hand.indexOf(highLowID, posStart)
    if (pos > 0) {
      updateOutput(HighLowMsg, false, false)
    } else {
      pos = single_hand.indexOf(razzID, posStart)
      if (pos > 0) {
        updateOutput(RazzMsg, false, false)
      } else {
        reportError(ErrorMsg)
      }
    }
  }

  updateOutput("(" + formatMoney(hand.small_bet) + "/" + 
  formatMoney(hand.big_bet) + "), Ante " + 
  formatMoney(hand.ante), false, false)

  if (hand.bring_in > 0) {
    updateOutput(", Bring-In " + formatMoney(hand.bring_in),
    false, false)
  }
}

function  getStakes(stakes) {
  var pos;

  pos = stakes.indexOf("/")

  if (pos > 0) {
    hand.small_bet = parseFloat(convertMoney(stakes.substr(0, stakes.length - (pos+1))));
    hand.big_bet = parseFloat(convertMoney(stakes.substr(stakes.length - pos)));  }
}

function initHand() {
  var i, z;

  line_start = 1; //global

  hand.tourney_hand   = false;
  hand.street_number  = 3;
  hand.last_street    = false;
  hand.small_bet      = 0;
  hand.big_bet        = 0;
  hand.ante           = 0;
  hand.bring_in       = 0;
  hand.pot            = 0;
  hand.hero_max       = false;
  hand.stud_hand      = false;
  hand.dbl_raise      = false;
  
  for (i=0; i < players.length; i++) {
    //players[i] = new Array();
    players[i].seat = FT_SEAT_ID + (i + 1);

    players[i]["cards"] = new Array(7);

    //for (z=1; z <= 8; z++) {
    //  players[i]["card_" + z] = "";
    //}

    players[i].in_hand   = false;
    players[i].all_in    = false;
    players[i].stack     = 0;
    players[i].orig_seat = "";
    players[i].last_bet  = 0;

    actions[i] = new Array();
    actions[i][0] = 1;
    //arrAction[i] = new Array()
    //arrAction[i][ACTION_INDEX] = FIRST_ACTION

    //for(z = FIRST_ACTION; z <= arrAction.length; z++) {
    //  arrAction[i][z] = "";
    //}
  }

  hand.street_start = getThirdStreet()
  hand.street_end   = getNextStreetFT()
}

function getNextStreetFT() {
  var ErrorMsg = "Error found in getNextStreetFT."
  var pos

  switch(hand.street_number) {
    case 7:
    pos = single_hand.indexOf(FT_SHOWDOWN, hand.street_start)
    break;
    default:
    pos = single_hand.indexOf("* " + (hand.street_number + 1) + "TH STREET *", hand.street_start)
  }

  if (pos > 0) {
    return pos
  } else {
    hand.last_street = true
    
    pos = single_hand.indexOf(FT_SUMMARY, hand.street_start)

    if (pos > 0) {
      return pos
    } else {
      reportError(ErrorMsg)
    }
  }
}

function getThirdStreet() {
  var ErrorMsg = "Error found in getThirdStreet."

  var out = single_hand.indexOf(FT_THIRD_ST_ID)

  if (out == -1) {
    reportError(ErrorMsg)
  }
  return out
}

function nextLine() {
  line_end = single_hand.indexOf("\n", line_start)

  if (onThisStreet(line_end)) {
    current_line = single_hand.substr(line_start, line_end - line_start)
    line_start = line_end + "\n".length
  } else {
    current_line = ""
  }
}

function onThisStreet(pos) {
  if (pos > 0) {
    if ((pos >= hand.street_start) && (pos <= hand.street_end)) {
      return true
    }
  }
}

function convertMoney(amount) {
  amount = amount.replace("$", "")
  return amount.replace(".", decimal_point)
}

function formatMoney(amount) {
  var pos, out

  pos = amount.toString().indexOf(decimal_point)

  if (pos > 0) {
    out = amount
  } else {
    out = amount
  }

  if(!hand.tourney_hand) {
    out = "$" + out
  }

  return out
}

function foundSite() {
  var pos
  var temp_input
  var out

  temp_input = get("script_input").value.substr(0,512)

  pos = temp_input.indexOf(FT_SITE_ID)

  if(pos >= 0) {
    pokerSite = FULL_TILT
    return true
  } else {
    pos = temp_input.indexOf(FT_SITE_ID_PTS)

    if (pos >= 0) {
      pokerSite = FULL_TILT
      return true
    } else {
      return false
    }
  }
}

function getFirstHand() {
  var ErrorMsg = "Error found in getFirstHand."

  hand.hand_start = get("script_input").value.indexOf(FT_HAND_ID)

  if(hand.hand_start == -1) {
    reportError(ErrorMsg)
  }
}

function getHandEnd() {
  var pos
  
  pos = get("script_input").value.indexOf(FT_HAND_ID, hand.hand_start + FT_HAND_ID.length)
  
  if(pos >= 0) {
    hand.hand_end = pos;
  } else {
    hand.hand_end = get("script_input").value.length;
  }
  return hand.hand_end;
}

function updateOutput(text, lead, trail) {
  switch(true){
    case lead && trail:
      converter_output = converter_output + "\n" + text + "\n"
      break;
    case lead:
      converter_output = converter_output + "\n" + text
      break;
    case trail:
      converter_output = converter_output + text + "\n"
      break;
    default:
      converter_output = converter_output + text;
  }
}

function updateStatus() {
  var CountMsg = "Converted hands = "
  var statusLine;

  statusLine = STATUS_MSG + CountMsg + hand_count;
  get("status_line").innerHTML = statusLine
}

// actually removes tabs
function removeSpaces(text) {
  while(text.match("  ")) {
    text = text.replace("  ", " ")
  }
  return text
}

function reportError(message) {
  alert(message)
  return 
   //self.Close
}

function convertToHTML() {
  converter_output = "<html><body>" + "<head><style type=\"text/css\"> "
  converter_output += "body { font-family: monospace; } </style></head>"

  converter_output = converter_output.replace(":club:", "<img src=\"club.gif\" >")
  converter_output = converter_output.replace(":diamond:", "<img src=\"diamond.gif\" >")
  converter_output = converter_output.replace(":heart:", "<img src=\"heart.gif\" >")
  converter_output = converter_output.replace(":spade:", "<img src=\"spade.gif\" >")

  converter_output = converter_output.replace("Results (in white):", "Results:")

  converter_output = converter_output.replace("[color:white]", "")
  converter_output = converter_output.replace("[/color]", "")

  converter_output = converter_output.replace("\n", "<br>" + "\n")

  converter_output = converter_output.replace("[b]", "<b>")
  converter_output = converter_output.replace("[/b]", "</b>")
  converter_output = converter_output.replace("\t", "&nbsp;")
  
  return converter_output + "</body></html>"
}

function convertToText() {
  converter_output = converter_output.replace(":club:", "c")
  converter_output = converter_output.replace(":diamond:", "d")
  converter_output = converter_output.replace(":heart:", "h")
  converter_output = converter_output.replace(":spade:", "s")

  converter_output = converter_output.replace("Results (in white):", "Results:")

  converter_output = converter_output.replace("[color:white]", "")
  converter_output = converter_output.replace("[/color]", "")

  converter_output = converter_output.replace("[b]", "*")
  converter_output = converter_output.replace("[/b]", "*")

  converter_output = converter_output.replace(HERO_ID + ":", HERO_ID + ":" + "  ")

  return converter_output;
}

function decimalPoint() {
  var pos;
  var tempNum;

  // tempNum = 1 / 2
  // pos = tempNum.indexOf(",")
  // 
  // if(pos > 0) {
  //   Decimal_Point = ","
  // } else {
  //   Decimal_Point = "."
  // }
  // return Decimal_Point
  return ".";
}

function disableControls() {
   get("b1").style.cursor = "wait"
   
   get("run_button").disabled = true
   //get("copy_button").disabled = true
   //get("paste_button").disabled = true
   get("clear_button").disabled = true
   
   // show_cards.Disabled = true
   get("show_results").disabled = true
   get("show_stacks").disabled = true
   
   get("format_ubb").disabled = true
   //get("format_html").disabled = true
   //get("format_text").disabled = true

   get("script_input").disabled = true
}

function enableControls() {
   get("b1").style.cursor = ""
   
   get("run_button").disabled = false
   //get("copy_button").disabled = false
   //get("paste_button").disabled = false
   get("clear_button").disabled = false
   
   // show_cards.Disabled = false
   get("show_results").disabled = false
   get("show_stacks").disabled = false
   
   get("format_ubb").disabled = false
   //get("format_html").disabled = false
   //get("format_text").disabled = false

   get("script_input").disabled = false
}

function copyClip() {
  document.parent.window.clipboardData.SetData("text", script_output.value)
}

function pasteClip() {
  get("script_input").value = document.parent.window.clipboardData.GetData("text")
} 

function clearAll() {
  get("script_input").value = ""
  get("script_output").value = ""
}

function quitScript() {
  var QuitMsg = "The converter is working, do you really want to quit?"
  var reply

  if(bln_script_running) {
    reply = confirm(QuitMsg)

    if(reply) {
      alert("Stopping Script")
    }
  } else {
    alert("Stopping Script")
  }
}

function setOutputFormat(format) {
  output_format = format

  switch(output_format) {
    case UBB_CODE:
      get("format_html").checked = false
      get("format_text").checked = false
      break;
    case HTML:
      get("format_ubb").checked = false
      get("format_text").checked = false
      break;
    case PLAIN_TEXT:
      get("format_ubb").checked = false
      get("format_html").checked = false
      break;
  }
}
