function ltrim(str) {
  if (str == null) {
    return str;
  }

  for (var i = 0 ; str.charAt(i) == " " || str.charAt(i) == "\n" || str.charAt(i) == "\t" || str.charAt(i) == "," ; i++);

  return str.substring(i, str.length);
}

function rtrim(str) {
  if (str == null) {
    return str;
  }

  for (var i = str.length-1 ; str.charAt(i) == " " || str.charAt(i) == "\n" || str.charAt(i) == "\t" || str.charAt(i) == "," ; i--);

  return str.substring(0, i + 1);
}

function trim(str) {
  return ltrim(rtrim(str));
}

function handChange(e, obj) {
  this.handChange();
}

/*------------------------------------------------------------------------------------------------------------*/

function cardDrag(id, value, home) {
  // the text value of this card
  this.value = value;

  // this is where to go home to -- better cuz it can move around the screen
  this.home = home;

  // we need this to go home if we don't have a home
  this.startPos = YAHOO.util.Dom.getXY(id);
  
  // what slot am i in right now
  this.slot = null;

  // need this so we can drop cards on filled slots
  this.init(id);
  this.isTarget = false;
}

cardDrag.prototype = new YAHOO.util.DD();

cardDrag.prototype.gotoSlot = function(slot) {
  if (slot) {
    YAHOO.util.DDM.moveToEl(this.getEl(), slot.getEl());
  } else if (this.home) {
    YAHOO.util.Dom.setXY(this.getEl(), YAHOO.util.Dom.getXY(this.home));
  } else {
    YAHOO.util.Dom.setXY(this.getEl(), this.startPos);
  }
}

cardDrag.prototype.endDrag = function(e) {
  // go home unless just added to a slot
  if (!this.justDropped) {
    if (this.slot) {
      this.slot.updateCard(null);
    } else {
      this.gotoSlot(null);
    }
  }

  this.justDropped = 0;
};

cardDrag.prototype.setSlot = function(newSlot) {
  if (this.slot) {
    this.slot.updateCard(null);
  }

  newSlot.updateCard(this);

  this.slot = newSlot;
}

cardDrag.prototype.onDragDrop = function(e, id) {
  // get the drag and drop object that was targeted
  var newSlot;
  if ("string" == typeof id) {
      newSlot = YAHOO.util.DDM.getDDById(id);
  } else {
      newSlot = YAHOO.util.DDM.getBestMatch(id);
  }

  this.setSlot(newSlot);

  // tell endDrag not to go home
  this.justDropped = 1;
};

/*------------------------------------------------------------------------------------------------------------*/

function cardSlot(id, hand, cardno) {
  this.hand = hand;
  this.cardno = cardno;
  this.initTarget(id);
}

cardSlot.prototype = new YAHOO.util.DDTarget();

cardSlot.prototype.slotValue = function() {
  if (this.card) {
    return this.card.value;
  } else {
    return "";
  }
}

cardSlot.prototype.updateCard = function(newCard) {
  if (this.card == newCard) {
    return;
  }

  if (this.card) {
    this.card.gotoSlot(null);
    this.card.slot = null;
    this.card = null;
  }

  if (newCard) {
    newCard.gotoSlot(this);
    this.card = newCard;
  }

  this.hand.updateHand();
}

/*------------------------------------------------------------------------------------------------------------*/

function hand(element, handInput, allCards) {
  this.element = element;
  this.handInput = handInput;
  this.allCards = allCards;

  this.slots = new Array();

  YAHOO.util.Event.addListener(this.element, "change", handChange, this, true);
}

hand.prototype.handChange = function() {
  var str = trim(this.handInput.value);

  // break the string into an array of cards
  var cards = new Array();
  var i = 0;
  while (str.length > 0 && i < 7) {
    cards[i] = str.substr(0, 1).toUpperCase() + str.substr(1, 1).toLowerCase();
    str = trim(str.substr(2));
    i++;
  }

  // determine if this list of cards is legal
  var legal = 1;
  if (cards.length > this.slots.length) {
    legal = 0;
  } else {
    var seen = new Array();
    for (i = 0 ; i < cards.length ; i++) {
      if (seen[cards[i]] == null) {
        seen[cards[i]] = 0;
      }
      seen[cards[i]]++;
      if (!this.allCards[cards[i]] || seen[cards[i]] > 1) {
        legal = 0;
        break;
      }
    }
  }

  // populate the slots with these cards
  if (legal) {
    for (i = 0 ; i < this.slots.length ; i++) {
      if (i < cards.length) {
        this.allCards[cards[i]].setSlot(this.slots[i]);
      } else {
        this.slots[i].updateCard(null);
      }
    }
  } else {
    // roll back to what was previously there
    this.updateHand();
  }
}

hand.prototype.setSlots = function(newSlots, doHandChange) {
  if (this.slots == newSlots) {
    return;
  }

  if (this.slots) {
    for (var i = 0 ; i < this.slots.length ; i++) {
      this.slots[i].updateCard(null);
    }
    this.slots = new Array();
  }

  if (newSlots) {
    this.slots = newSlots;
  }

  if (doHandChange) {
    this.handChange();
  }

  this.updateHand();
}

hand.prototype.updateHand = function() {
  var newstring = "";

  if (this.slots) {
    for (var i = 0 ; i < this.slots.length ; i++) {
      if (this.slots[i].slotValue()) {
        if (newstring != "") {
          newstring = newstring + " ";
        }
        newstring = newstring + this.slots[i].slotValue();
      }
    }
  }

  if (newstring != this.handInput.value) {
    clearTimeout(odds_timeout);
    odds_timeout = setTimeout('do_odds();', 250);
    this.handInput.value = newstring;
  }
}

/*------------------------------------------------------------------------------------------------------------*/

var odds_timeout;

var populate_odds = function(o) {
  //alert(o.responseText);

  var link = YAHOO.util.Dom.get("handlink");
  var href = o.responseXML.getElementsByTagName('odds')[0].getAttribute('url');
  link.innerHTML = "<a href=" + href + ">" + href + "</a>";

  for (var i = 0 ; i <= 9 ; i++) {
    var span_ev = YAHOO.util.Dom.get("odds_ev" + i);
    var span_table = YAHOO.util.Dom.get("odds_table" + i);

    var handInfo = o.responseXML.getElementsByTagName('player')[i];

    var EV = handInfo.getAttribute('EV');
    if (EV == null) {
      span_ev.innerHTML = "";
      span_table.innerHTML = "";
    } else {
      span_ev.innerHTML = "&nbsp;<b>EV = " + EV + "</b>";

      var scoop = handInfo.getAttribute('scoop');
      if (scoop == null) {
        span_table.innerHTML = 
	  "<table cellpadding=0 cellspacing=0 border=0>" + 

	  "<tr><td align=right><font size=1>Win</td>" +
          "<td><font size=1><b>&nbsp;" + handInfo.getAttribute('pct_win') + "%</td></tr>" + 

	  "<tr><td align=right><font size=1>Lose</td>" +
          "<td><font size=1><b>&nbsp;" + handInfo.getAttribute('pct_lose') + "%</td></tr>" + 

	  "<tr><td align=right><font size=1>Tie</td>" +
          "<td><font size=1><b>&nbsp;" + handInfo.getAttribute('pct_tie') + "%</td></tr>" + 

	  "</table>";

      } else {
        span_table.innerHTML = 
	  "<table cellpadding=0 cellspacing=0 border=0>" + 

	  "<tr><td align=right><font size=1>&nbsp;</td>" +
              "<td><font size=1>&nbsp;Win</td>" + 
              "<td><font size=1>&nbsp;Lose</td>" +
              "<td><font size=1>&nbsp;Tie</td></tr>" + 

	  "<tr><td align=right><font size=1>Hi</td>" +
              "<td><font size=1><b>&nbsp;" + handInfo.getAttribute('pct_HIwin') + "%</td>" +
              "<td><font size=1><b>&nbsp;" + handInfo.getAttribute('pct_HIlos') + "%</td>" +
              "<td><font size=1><b>&nbsp;" + handInfo.getAttribute('pct_HItie') + "%</td></tr>" + 

	  "<tr><td align=right><font size=1>Lo</td>" +
              "<td><font size=1><b>&nbsp;" + handInfo.getAttribute('pct_LOwin') + "%</td>" +
              "<td><font size=1><b>&nbsp;" + handInfo.getAttribute('pct_LOlos') + "%</td>" +
              "<td><font size=1><b>&nbsp;" + handInfo.getAttribute('pct_LOtie') + "%</td></tr>" +
 
	  "<tr><td align=right><font size=1>Scoop</td>" +
              "<td colspan=3><font size=1><b>&nbsp;" + handInfo.getAttribute('pct_scoop') + "%</td></tr>" + 

	  "</table>";
      }
    }
  }
}

var odds_error = function(o) {
  var link = YAHOO.util.Dom.get("handlink");
  link.innerHTML = "";

  for (var i = 0 ; i <= 9 ; i++) {
    var span_ev = YAHOO.util.Dom.get("odds_ev" + i);
    var span_table = YAHOO.util.Dom.get("odds_table" + i);
    span_ev.innerHTML = '';
    span_table.innerHTML = '';
  }
}

var callback = {
  success: populate_odds,
  failure: odds_error
};

function do_odds(clear) {
  if (clear) {
    odds_error();
  }

  var d = new Date();
  oddsform.uniq.value = YAHOO.util.Dom.generateId() + "-" + d.getTime();
  YAHOO.util.Connect.setForm(oddsform);
  YAHOO.util.Connect.asyncRequest('GET', 'http://' + window.location.hostname + '/odds', callback);
}

/*------------------------------------------------------------------------------------------------------------*/

var flop;
var hands = new Array();

var h_slots = new Array();
var o_slots = new Array();
var s_slots = new Array();
var f_slots = new Array();

var drag = new Array();

function init_calc() {
  init_drag();
    
  flop = new hand("f", eval("oddsform.f"), drag);

  for (var j = 0 ; j <= 4 ; j++) {
    f_slots[j] = new cardSlot("flop" + j, flop, j);
  }

  for (var i = 0 ; i <= 9 ; i++) {
    hands[i] = new hand("p" + i, eval("oddsform.p" + i), drag);

    h_slots[i] = new Array();
    for (var j = 0 ; j <= 1 ; j++) {
      h_slots[i][j] = new cardSlot("hp" + i + "c" + j, hands[i], j);
    }

    o_slots[i] = new Array();
    for (var j = 0 ; j <= 3 ; j++) {
      o_slots[i][j] = new cardSlot("op" + i + "c" + j, hands[i], j);
    }

    s_slots[i] = new Array();
    for (var j = 0 ; j <= 6 ; j++) {
      s_slots[i][j] = new cardSlot("sp" + i + "c" + j, hands[i], j);
    }
  }

  pshowhide(null);
  gshowhide(null, true);
  flop.setSlots(f_slots, true);
}

function doSetSlots(prevPlayers, prevGame, doHandChange) {
  var g = oddsform.game.value;
  var p = oddsform.players.value;

  if (g != prevGame) {
    if (g == 's') {
      flop.setSlots(null);
    } else {
      flop.setSlots(f_slots, doHandChange);
    }
  }

  for (var j = 0 ; j <= 9 ; j++) {
    var slots = new Array();
    if (g == 'h') {
      slots = h_slots;
    } else if (g == 'o') {
      slots = o_slots;
    } else if (g == 's') {
      slots = s_slots;
    }

    if (j <= p) {
      if (j > prevPlayers) {
        hands[j].setSlots(slots[j], doHandChange);
      }
    } else {
      hands[j].setSlots(null);
    }
  }
}

function pshowhide(i) {
  var prevPlayers = oddsform.players.value;

  if (i) {
    oddsform.players.value = i;
  } else {
    i = oddsform.players.value;
  }

  for (var j = 0 ; j <= 9 ; j++) {
    if (j <= i) {
      YAHOO.util.Dom.setStyle('player'+j, 'display', 'block');
    } else {
      YAHOO.util.Dom.setStyle('player'+j, 'display', 'none');
    }
  }

  doSetSlots(prevPlayers, oddsform.game.value, false);
}

function gshowhide(g, doHandChange) {
  var prevGame = oddsform.game.value;

  if (g) {
    oddsform.game.value = g;
  } else {
    g = oddsform.game.value;
  }
    
  for (var j = 0 ; j <= 9 ; j++) {
    if (g == 'h') {
      YAHOO.util.Dom.setStyle('h'+j, 'display', 'inline');
      YAHOO.util.Dom.setStyle('hiplayerlinks', 'display', 'inline');
      YAHOO.util.Dom.setStyle('hiplayeroff', 'display', 'none');
      YAHOO.util.Dom.setStyle('flop', 'display', 'inline');
    } else {
      YAHOO.util.Dom.setStyle('h'+j, 'display', 'none');
    }

    if (g == 'o') {
      YAHOO.util.Dom.setStyle('o'+j, 'display', 'inline');
      YAHOO.util.Dom.setStyle('hiplayerlinks', 'display', 'inline');
      YAHOO.util.Dom.setStyle('hiplayeroff', 'display', 'none');
      YAHOO.util.Dom.setStyle('flop', 'display', 'inline');
    } else {
      YAHOO.util.Dom.setStyle('o'+j, 'display', 'none');
    }
      
    if (g == 's') {
      YAHOO.util.Dom.setStyle('s'+j, 'display', 'inline');
      YAHOO.util.Dom.setStyle('player8', 'display', 'none');
      YAHOO.util.Dom.setStyle('player9', 'display', 'none');
      YAHOO.util.Dom.setStyle('hiplayerlinks', 'display', 'none');
      YAHOO.util.Dom.setStyle('hiplayeroff', 'display', 'inline');
      YAHOO.util.Dom.setStyle('flop', 'display', 'none');
    } else {
      YAHOO.util.Dom.setStyle('s'+j, 'display', 'none');
    }
  }

  doSetSlots(-1, prevGame, doHandChange);
}

function init_drag() {
  drag["Ac"] = new cardDrag("ac", "Ac", "acanchor");
  drag["2c"] = new cardDrag("2c", "2c", "2canchor");
  drag["3c"] = new cardDrag("3c", "3c", "3canchor");
  drag["4c"] = new cardDrag("4c", "4c", "4canchor");
  drag["5c"] = new cardDrag("5c", "5c", "5canchor");
  drag["6c"] = new cardDrag("6c", "6c", "6canchor");
  drag["7c"] = new cardDrag("7c", "7c", "7canchor");
  drag["8c"] = new cardDrag("8c", "8c", "8canchor");
  drag["9c"] = new cardDrag("9c", "9c", "9canchor");
  drag["Tc"] = new cardDrag("tc", "Tc", "tcanchor");
  drag["Jc"] = new cardDrag("jc", "Jc", "jcanchor");
  drag["Qc"] = new cardDrag("qc", "Qc", "qcanchor");
  drag["Kc"] = new cardDrag("kc", "Kc", "kcanchor");
  drag["Ad"] = new cardDrag("ad", "Ad", "adanchor");
  drag["2d"] = new cardDrag("2d", "2d", "2danchor");
  drag["3d"] = new cardDrag("3d", "3d", "3danchor");
  drag["4d"] = new cardDrag("4d", "4d", "4danchor");
  drag["5d"] = new cardDrag("5d", "5d", "5danchor");
  drag["6d"] = new cardDrag("6d", "6d", "6danchor");
  drag["7d"] = new cardDrag("7d", "7d", "7danchor");
  drag["8d"] = new cardDrag("8d", "8d", "8danchor");
  drag["9d"] = new cardDrag("9d", "9d", "9danchor");
  drag["Td"] = new cardDrag("td", "Td", "tdanchor");
  drag["Jd"] = new cardDrag("jd", "Jd", "jdanchor");
  drag["Qd"] = new cardDrag("qd", "Qd", "qdanchor");
  drag["Kd"] = new cardDrag("kd", "Kd", "kdanchor");
  drag["Ah"] = new cardDrag("ah", "Ah", "ahanchor");
  drag["2h"] = new cardDrag("2h", "2h", "2hanchor");
  drag["3h"] = new cardDrag("3h", "3h", "3hanchor");
  drag["4h"] = new cardDrag("4h", "4h", "4hanchor");
  drag["5h"] = new cardDrag("5h", "5h", "5hanchor");
  drag["6h"] = new cardDrag("6h", "6h", "6hanchor");
  drag["7h"] = new cardDrag("7h", "7h", "7hanchor");
  drag["8h"] = new cardDrag("8h", "8h", "8hanchor");
  drag["9h"] = new cardDrag("9h", "9h", "9hanchor");
  drag["Th"] = new cardDrag("th", "Th", "thanchor");
  drag["Jh"] = new cardDrag("jh", "Jh", "jhanchor");
  drag["Qh"] = new cardDrag("qh", "Qh", "qhanchor");
  drag["Kh"] = new cardDrag("kh", "Kh", "khanchor");
  drag["As"] = new cardDrag("as", "As", "asanchor");
  drag["2s"] = new cardDrag("2s", "2s", "2sanchor");
  drag["3s"] = new cardDrag("3s", "3s", "3sanchor");
  drag["4s"] = new cardDrag("4s", "4s", "4sanchor");
  drag["5s"] = new cardDrag("5s", "5s", "5sanchor");
  drag["6s"] = new cardDrag("6s", "6s", "6sanchor");
  drag["7s"] = new cardDrag("7s", "7s", "7sanchor");
  drag["8s"] = new cardDrag("8s", "8s", "8sanchor");
  drag["9s"] = new cardDrag("9s", "9s", "9sanchor");
  drag["Ts"] = new cardDrag("ts", "Ts", "tsanchor");
  drag["Js"] = new cardDrag("js", "Js", "jsanchor");
  drag["Qs"] = new cardDrag("qs", "Qs", "qsanchor");
  drag["Ks"] = new cardDrag("ks", "Ks", "ksanchor");
}
