//################## computing server ##################

 var server="nfo.arcanum.hu";
// var server="127.0.0.1";

//################## variables ##################

 var pnames = new Array(10);
 var hands = new Array(10);
 var deadcards = new Array(20);
 var flop = new Array(3);
 var turn = '';
 var river = '';

 var gtype='omhHILO';
 var low=true;
 
 var resultsVisible=false;
 
 var pageHash='-';
 var dontSync=false;

//################## initialize ##################

 function initPage()
 {
  setLang(navigator.systemLanguage?navigator.systemLanguage:navigator.language?navigator.language:navigator.userLanguage);

  initDragDrop();

  setResultTable('');

  clearAll();
  
  syncHash();
 }

 function setLang(lang)
 {
  var lng=lang.substr(0,2);
  lng=(lng=='hu'?'hu':'en');

  var l=document.createElement('script');
  l.type = 'text/javascript';
  l.src = 'http://onlinepokerhu.com/omaha/locale_'+lng+'.js';
  document.body.appendChild(l);
 }

 function getLocHash()
 {
  var p=location.href.indexOf('#');
  return p?location.href.substr(p+1):'-';
 }

 function syncHash()
 {
  if (!dontSync)
  {
   var h=getLocHash();
   if (unescape(h)!=unescape(pageHash))
   {
    parseParams(h);
    if (resultsVisible)
     compute(1);
    else
     getParams();
   }
  }

  setTimeout(syncHash,100);
 }

 function initDragDrop()
 {
  var i;
  var j;

  for (i=0;i<10;i++)
   for (j=0;j<4;j++)
    ADD_DHTML('p'+i+'_'+(j+1)+NO_DRAG);

  for (i=0;i<20;i++)
   ADD_DHTML('dead'+i+NO_DRAG);

  ADD_DHTML('flop1'+NO_DRAG);
  ADD_DHTML('flop2'+NO_DRAG);
  ADD_DHTML('flop3'+NO_DRAG);
  ADD_DHTML('turn'+NO_DRAG);
  ADD_DHTML('river'+NO_DRAG);
 }

//################## parameters ##################

 function parseCards(array, cards)
 {
  array.length=0;
  
  if (!cards)
   return;

  cards=cards.toLowerCase();

  var ss="CDHScdhs";
  var cc="JQKAjqkaBDK1bdka";
  
  var rev=false;
  var suit='';
  var rank='';
  
  var i;
  for (i=0;i<cards.length;i++)
  {
   var c=cards.charAt(i);
   
   if (c=='+' || c=='/')
    break;

   if (ss.indexOf(c)>=0)
   {
    suit=c;
    if (rev)
     array[array.length]=suit+rank;
   }
   else
   {
    var rank1='';

    var j=cc.indexOf(c);
    if (j>=0)
     rank1='jqka'.charAt(j%4);
    else if (c>'1' && c<='9' || c=='t')
     rank1=c;
     
    if (rank1!='')
    {
     rank=rank1;

     if (suit=='')
      rev=true;
     else if (!rev)
      array[array.length]=suit+rank;
    }
   }
  }
 }

 function parseParams(p)
 {
//  if (!p)
//   return;

  var p1=(p.indexOf('=')<0 && p.indexOf('%')>=0)?unescape(p):p;
  var params=p1.split('&');
  var pp={};
  var i=params.length;
  while (i--)
   if (params[i].length)
   {
    var pos=params[i].indexOf('=');
    if (pos>0)
     pp[params[i].substr(0,pos)]=params[i].substr(pos+1);
   }

  if (!pp.o)
  {
   gtype='texas';
   low=false;
  }
  else if (!pp.l)
  {
   gtype='omhHI';
   low=false;
  }
  else
  {
   gtype='omhHILO';
   low=true;
  }

  document.getElementById(gtype).checked=true;

  clearTexas(gtype!='texas');
  clearAll();

  var arr=new Array();

  parseCards(arr, pp.ex);
  i=arr.length;
  while (i--)
   moveCardTo(arr[i],'dead'+i);

  parseCards(arr, pp.flop);
  moveCardTo(arr[0],'flop1');
  moveCardTo(arr[1],'flop2');
  moveCardTo(arr[2],'flop3');

  parseCards(arr, pp.turn);
  moveCardTo(arr[0],'turn');

  parseCards(arr, pp.river);
  moveCardTo(arr[0],'river');

  for (i=0;i<10;i++)
  {
   var pname=undefined;

   if (pp['p'+i])
   {
    p1=pp['p'+i];
    if (p1.charAt(0)=='-')
    {
     hands[i].folded=true;
     document.getElementById('p'+i+'_f').checked=true;
    }

    var pos=p1.indexOf('+');
    if (pos>=0)
    {
     var v=parseFloat(p1.substr(pos+1));
     hands[i].bet=(v>0)?v:'';
     document.getElementById('p'+i+'_b').value=v;
    }

    var pos=p1.indexOf('/');
    if (pos>=0)
     pname=unescape(p1.substr(pos+1));

    parseCards(arr, p1);
    var j;
    for (j=0;j<4;j++)
     if (arr[j])
      moveCardTo(arr[j],'p'+i+'_'+(j+1));
   }

   setPlayerName(i,pname);
  }

  resultsVisible=pp.c?true:false;
 }

 function getParams(forCompute)
 {
  var empty=true;

  var q='';
  var i;
  for (i=0;i<10;i++)
  {
   var hand=hands[i];
   var n=pnames[i];
   var pp=hand.c1+hand.c2+hand.c3+hand.c4;
//   var p=(hand.folded?'-':'')+pp+(hand.bet?'+'+hand.bet:'')+(n?'/'+n:'');
   var p=(hand.folded?'-':'')+pp+(hand.bet?'+'+hand.bet:'')+(n?'/'+escape(n):'');

   if (p)
    q+='&p'+i+'='+p;

   if (pp.length && !hand.folded)
    empty=false;
  }

  var fl=flop[0]+flop[1]+flop[2];
  if (fl.length>0)
   q+='&flop='+fl;

  if (turn!='')
   q+='&turn='+turn;

  if (river!='')
   q+='&river='+river;

  var dead='';
  for (i=0;i<20;i++)
   dead+=deadcards[i];

  if (dead.length)
   q+='&ex='+dead;

  if (low)
   q+='&l=1';

  if (gtype!='texas')
   q+='&o=1';

  q=q.substr(1);
  if (forCompute)
   return empty?false:q;

  if (!empty && resultsVisible)
   q+='&c=1';
   
dontSync=true;
  pageHash=q;
  var h=getLocHash();
  if (unescape(h)!=unescape(pageHash))
   location.replace('#'+pageHash);
dontSync=false;

  return empty;
 }

 function setPlayerName(i,pname)
 {
  pnames[i]=pname;
  var t='';
  if (pname)
  {
   if (pname.length>5)
   {
    t=pname;
    pname=t.substr(0,5)+'..';
   }
  }
  else
   pname='P '+(i+1);

  var p=document.getElementById('pn'+i);
  p.innerHTML=pname;
  p.title=t;
 }

//################## edit player names ##################

 var pnEditNo=-1;

 function pNameEdit(obj,playa)
 {
  if (pnEditNo==playa)
   return;

  pnEditNo=playa;

  var e=document.getElementById('pnedit');
  e.value=pnames[playa]?pnames[playa]:'';

  var d=document.getElementById('p'+playa);
  var s=d.currentStyle?d.currentStyle:getComputedStyle(d,null);

  var p=document.getElementById('div_pnedit');
  p.style.top=(parseInt(s.top)+4)+'px';
  p.style.left=(parseInt(s.left)+5)+'px';
  p.style.visibility='visible';

  e.focus();
 }

 function pNameKeyUp(e)
 {
  if (e.keyCode==27)
   pnEditNo=-1;
  if (e.keyCode==13 || e.keyCode==14 || e.keyCode==27)
   pNameHide()
 }

 function pNameChange()
 {
  if (pnEditNo<0)
   return;
  var e=document.getElementById('pnedit');
  setPlayerName(pnEditNo,e.value);
  getParams();
 }

 function pNameHide()
 {
  pNameChange();
  var p=document.getElementById('div_pnedit');
  p.style.visibility='hidden';
  pnEditNo=-1;
 }

//################## events ##################

 function foldClick(obj,playa)
 {
  clearResults();
  hands[playa].folded=obj.checked;
  getParams();
 }

 function betChange(obj,playa)
 {
  clearResults();
  var v=parseFloat(obj.value);
  hands[playa].bet=(v>0)?v:'';
  obj.value=hands[playa].bet;
  getParams();
 }

 function gameChg(obj)
 {
  if (gtype==obj.id)
   return;
  clearResults();
  gtype=obj.id;
  low=gtype=='omhHILO';
  clearTexas(gtype!='texas');
  var i;
  for (i=0;i<10;i++)
   setHutch(i);
  getParams();
 }

 function cardPlaceChanged(place,card,userMove)
 {
  clearResults();
  if (place.charAt(0)=='p')
  {
   var i=place.charAt(1);
   var c=place.charAt(3);
   hands[i]['c'+c]=card;
   setHutch(i);
  }
  else if (place.substr(0,4)=='dead')
   deadcards[place.substr(4,2)]=card;
  else if (place.substr(0,4)=='flop')
   flop[place.charAt(4)-1]=card;
  else if (place=='turn')
   turn=card;
  else if (place=='river')
   river=card;
  if (userMove)
   getParams();
 }

 function clearClick()
 {
  clearAll()
  getParams();
 }

//################## clear ##################

 function clearPlace(hand,place,enable)
 {
  var c=hands[hand]['c'+place];
  if (c && !enable)
  {
   defPosCard(c);
   hands[hand]['c'+place]='';
  }
  var e=document.getElementById('p'+i+'_'+place);
  e.style.visibility=enable?'visible':'hidden';
 }

 function clearTexas(enable)
 {
  for (i=0;i<10;i++)
  {
   clearPlace(i,3,enable);
   clearPlace(i,4,enable);
  }
 }
 
 function clearResults()
 {
   if (!resultsVisible)
    return;
   var i;
   for (i=0;i<10;i++)
    writeInfo(i,undefined);
   resultsVisible=false;
 }

 function clearAll()
 {
  clearResults();
  var i;
  for (i=0;i<10;i++)
  {
   hands[i]={c1:'', c2:'', c3:'', c4:'', folded:false, bet:''};
   document.getElementById('p'+i+'_b').value='';
   document.getElementById('p'+i+'_f').checked=false;
   setHutch(i);
  }

  i=dd.elements.length;
  while (i--)
  {
   var e=dd.elements[i];
   e.moveTo(e.defx, e.defy);
  }

  for (i=0;i<20;i++)
   deadcards[i]='';

  flop[0]='';
  flop[1]='';
  flop[2]='';
  turn='';
  river='';
 }

//################## Hutchison points ##################

 function setHutch(playa)
 {
   var h=document.getElementById('p'+playa+'_h');
   while (h.hasChildNodes())
    h.removeChild(h.firstChild);
   var hp=CountPoints(low?HP_OMHL:((gtype=='texas')?HP_THM:HP_OMHI),hands[playa].c1,hands[playa].c2,hands[playa].c3,hands[playa].c4);
//   var mp='';
//   if (low)
//    mp=' - CP '+CountPoints(MP_OMHL,hands[playa].c1,hands[playa].c2,hands[playa].c3,hands[playa].c4);
   var txt=document.createTextNode(hp/*+mp*/);
//   var txt=document.createTextNode('<a href="http://www.softforpoker.com/count.htm" title="Hutchison Point Count Systems">HP</a> '+hp/*+mp*/);
   h.appendChild(txt);
 }

//################## compute ##################

 function computed()
 {
  setResultTable(resultHTML);
  var i;
  for (i=0;i<10;i++)
   writeInfo(i,results['p'+i]);
  resultsVisible=true;
  getParams();
 }

 function compute(force)
 {
  if (resultsVisible && !force)
   return;

  validate();

  var h=getParams(1);
  if (!h)
   return;

  setResultTable('');

  var res = document.createElement("script");
  res.type='text/javascript';
  res.src='http://'+server+'/poker/a.pkr?'+h+'&j=1';
  document.body.appendChild(res);
 }

 function validate()
 {
  var chg=false;

  var fl=flop[0]+flop[1]+flop[2];

  if (fl.length>0 && fl.length<6)
  {
   defPosCard(flop[0]);
   defPosCard(flop[1]);
   defPosCard(flop[2]);
   fl='';
   chg=true;
  }

  if (turn!='' && fl=='')
  {
   defPosCard(turn);
   chg=true;
  }

  if (river!='' && turn=='')
  {
   defPosCard(river);
   chg=true;
  }
  
  var i;
  for (i=0;i<10;i++)
  {
   var hand=hands[i];
   var p=hand.c1+hand.c2+hand.c3+hand.c4;
   if (p.length>0 &&  p.length!=((gtype=='texas')?4:8))
   {
    defPosCard(hand.c1);
    defPosCard(hand.c2);
    defPosCard(hand.c3);
    defPosCard(hand.c4);
    chg=true;
   }
  }

  return chg;
 }

//################## display results ##################

 function setResultTable(data)
 {
  var r=document.getElementById('res_table');
  r.innerHTML=data;
  if (data)
   ChgResultTable();
  r.style.visibility=data?'visible':'hidden';
  r=document.getElementById('res_hint');
  r.style.visibility=data?'visible':'hidden';
 }

 function addInfoField1(t,nam)
 {
  var row=document.createElement("tr");
//  row.innerHTML="<td colSpan=\"2\" align=\"center\">"+nam+"</td>";
  var row=document.createElement("tr");
  var d=document.createElement("td");
  d.setAttribute("class","res_EV");
  d.setAttribute("colSpan","2");
  d.setAttribute("align","center");
  row.appendChild(d);
  var txt=document.createTextNode(nam);
  d.appendChild(txt);
  t.appendChild(row);
 }

 function addInfoField2(t,nam,val)
 {
  var row=document.createElement("tr");
//  row.innerHTML="<td>"+nam+"</td><td>"+val+"</td>";
  var d=document.createElement("td");
  row.appendChild(d);
  var txt=document.createTextNode(nam);
  d.appendChild(txt);
  var v=document.createElement("td");
  row.appendChild(v);
  txt=document.createTextNode(val);
  v.appendChild(txt);
  t.appendChild(row);
 }

 function writeInfo(playa,obj)
 {
  var table=document.getElementById('res'+playa);

  while (table.hasChildNodes())
   table.removeChild(table.firstChild);

  if (obj==undefined)
   return;

  var t = document.createElement("tbody");
  table.appendChild(t);

  addInfoField1(t,'EV '+obj.ev);
  addInfoField2(t,'Hi',obj.winhi);
  addInfoField2(t,'tie',obj.tiehi);
  if (low)
  {
   addInfoField2(t,'Lo',obj.winlo);
   addInfoField2(t,'tie',obj.tielo);
   addInfoField2(t,'Sc',obj.scoop);
  }
  t.normalize();
 }
