YUI().use("node",function(Y){

  Y.on("domready", function()
  {
    var FACE = '23456789TJQKA';
    var SUIT = {
      'spades': 0,
      'hearts': 1,
      'clubs': 2,
      'diamonds': 3
    }
    
    var handbox = document.createElement('div');
    handbox.id = 'handbox';
    document.body.appendChild(handbox);
    
    Y.all('ol.deck').each(function()
    {
      var str = '';
      var deck = [];
      
      this.all('li').each(function(node, index, nodeList)
      {
        deck[index] = [FACE.indexOf(node.get('innerHTML').charAt(0)), getSuit(node)];
      });
      
      this.on("mouseover", function(evt)
      {
        mouseover(evt, evt.target, deck);
      });
      
      function getSuit(node)
      {
        for (var i in SUIT)
        {
          if (node.hasClass(i)) return SUIT[i];
        }
      }
    });
    
    function mouseover(evt, li, deck)
    {
      if (li.get('tagName') != 'LI')
      {
        return;
      }
     
      var parent = li.ancestor();
      var index = parent.all('li').indexOf(li);
      
      populateHandbox(parseInt(parent.getAttribute('data-players')), deck, index);
      
      Y.on('mousemove', mousemove);
      parent.on('mouseout', mouseout);
      
      handbox.style.display = 'block';
      
      mousemove(evt);
    }
    
    function mousemove(evt)
    {
      var target = evt.target;
      
      handbox.style.left = Math.round(Math.max(
        0,
        Math.min(evt.pageX, target.get('winWidth') - handbox.offsetWidth-30)
      )) + 'px';
      
      var scrollY = target.get('docScrollY');
      
      handbox.style.top = Math.round(
	  evt.pageY + handbox.offsetHeight + 30 < scrollY + target.get('winHeight')
          ||
          evt.pageY - handbox.offsetHeight - 30 < scrollY
          ?
          evt.pageY + 30
          :
          evt.pageY - handbox.offsetHeight - 30
        ) + 'px';
    }
    
    function mouseout()
    {
      Y.detach('mousemove', mousemove);
      Y.detach('mouseout', mouseout);
      handbox.style.display = 'none';
    }
    
    function getPlayerName(n, total)
    {
      return n==0 ? 'SB' :
       n+1==total ? 'DE' :
             n==1 ? 'BB' :
             n==2 ? 'UG' :
       n+2==total ? 'CO' :
                    'P'+(n+1);
    }
    /*var PLAYER_NAMES = {
      2: ['SB','DE'],
      3: ['SB','BB','DE'],
      4: ['SB','BB','UG','DE'],
      5: ['SB','BB','UG','CO','DE'],
      6: ['SB','BB','UG','','CO','DE'],
    }*/
    
    function populateHandbox(players, deck, index)
    {
      var hands = [];
      var table = [];
      var winStrings = [
        'Straight flush',
        'Four of a kind',
        'Full house',
        'Flush',
        'Straight',
        'Three of a kind',
        'Two pair',
        'Pair',
        'High card'
      ];
      
      for (var i=0; i<players; i++)
      {
        hands[i] = [deck[(index+i)%52], deck[(index+i+players)%52]];
      }
      table = [
        deck[(index+players*2+1)%52],
        deck[(index+players*2+2)%52],
        deck[(index+players*2+3)%52],
        deck[(index+players*2+5)%52],
        deck[(index+players*2+7)%52]
      ];
      
      var result = solveHand(hands, table);
      
      var str = '<ul>';
      
      for (i=0; i<players; i++)
      {
        str += '<li'+(result && i==result[0]?' class="winner"':'')+'><b>'+getPlayerName(i, players)+':</b> ';
        str += '<ol class="deck">';
        str += createCard(hands[i][0]) + createCard(hands[i][1])+'</ol>';
        
        if (result && i==result[0])
        {
          str += '<span class="desc">'+winStrings[result[1]]+'</span>';
        }
        else
        {
          str += '<span class="desc">'+winStrings[solveHand([hands[i]], table)[1]]+'</span>';
        }
        
        // columns
        if (i>0 && i+1<players && (i+1)%6==0) str += '</ul><ul>';
        
      }
      
      str += '</ul>';
      
      str += '<div>';
      str += '<b>Table:</b> ';
      str += '<ol class="deck">';
      for (i=0; i<5; i++)
      {
        str += createCard(table[i]);
      }
      str += '</ol>';
      
      str += '</div>';
      
      handbox.style.width = Math.ceil(players/6)*200;
      handbox.innerHTML = str;
    }
    
    function createCard(card)
    {
      var SUIT = ['spades','hearts','clubs','diamonds'];
      var FACE = '23456789TJQKA';
      return '<li class="'+SUIT[card[1]]+'">'+FACE.charAt(card[0]);
    }
    
  });
});