    var p1 = new Image();
    p1.src = 'images/p3con1.gif';
    var imgurl = 'images/';
    var gf0 = 'rnbqkbnrpppppppp8888PPPPPPPPRNBQKBNR 1';
    var delay = 2000;
    var gm;
    var gc = new Array;
    var gflip = new Array;
    var gend = new Array;
    var gres = new Array;
    var gf = new Array;
    var gb = new Array;
    var ie4 = 1;
    document.onkeydown = KeyDown;
    var restr = ['1-0', '0-1', '1/2-1/2', '*'];
    var s1 = s2 = r1 = r2 = flags = mvflg = 0;
    var pc = capc = cf = ep = pr = tmid = tmc = 0;
    var atgm = -1;
    var lk = vl = cm = tm = ml = cg = cb = 0;
    var prepc = 8;
    if (ie4) document.onmousemove = MsMove;
    var gx = -3
    var mn = 0;
    var gn = 0;
    var jb = 0
    var ipcs = 'ipnbrqkxov';
    var fench = '/PNBRQK//pnbrqk12345678XOV';
    var files = 'abcdefgh';
    var ranks = '87654321';
    var chks = ['', '#', '+', ''];
    var MsX = MsY = 0;
    var PcX = PcY = 0;
    var Bx = By = 0;
    var nq = dgp = dgs = 0;

    gb = [[64]];
    gf = ['rnbqkbnrpppppppp8888PPPPPPPPRNBQKBNR 1'];
    gc = [''];
    gm = ['sc@KS@rb@JZ@xr@ET@c[@TJ@qi@IY@td@@Q@rl@LT@|j@BP@}s@DK@og@CEpp`@Yb@ib@T[@b[@GW@`X@Q@@zq@NV@lb@JY@jN@EF@{}pAJ@g_@JC@yk@@J@}~@PB@|l@?A@qx@JP@Nq@C^@ln@^e@nm@es@bs@Pa@k}@ar@xz@Yc@mU@KY@qc@rc@US@BJ@SP@YP@}P@JS@P}@Aa@sb@SU@d\\@U]@bS@]f@ue@fn@'];
    gflip = [0, 0];
    gres = [1, 0];
    gend = [231, 0];

    function WriteCap(tx) {
      document.getElementById('brdt0').title = tx;
      if (tx == '') tx = '&nbsp;';
      document.getElementById('it0').innerHTML = tx;
    }

    function FindScrBrd() {
      for (var i = 0; i < document.images.length; i++)
        if (document.images[i].id != '')
        if (document.images[i].id == 'brd0') {
        jb = i;
        return;
      }
    }

    function InitSys() {
      FindScrBrd();
      GoStart(0);
    }
    
    function DrawPc(g, pc, sqr) {
      var clr, pi;
      clr = '';
      pi = ipcs.charAt(pc >= 23 ? pc - 16 : pc & 7);
      if (pc)
        clr = (pc & 8) ? 'b' : 'w';
      if (gflip[g])
        sqr = 63 - sqr;
      document.images[jb + sqr].src = imgurl + clr + pi + '.gif';
    }
    function Fen2Brd(g, fn) {
      var fc;
      var s = 0;
      for (var i = 0; i < 64; i++) {
        fc = fench.indexOf(fn.charAt(s++));
        if (fc <= 14 || fc >= 23)
          gb[g][i] = fc;
        else {
          fc -= 14;
          while (fc--)
            gb[g][i++] = 0;
          --i;
        }
      }
      if (s != fn.length)
        mn = parseInt(fn.substr(++s));
    }
    function InitBoard(g) {
      if (atgm != cg) Astop();
      Fen2Brd(g, gf[g]);
      gx = -3;
      cg = g;
    }
    function DrawBoard(g) {
      for (var i = 0; i < 64; i++)
        DrawPc(g, gb[g][i], i);
    }
    function DoMv(g, pc, to, from) {
      gb[g][to] = pc;
      gb[g][from] = 0;
    }
    function MvD(g) {
      var m = gx;
      ep = cf = pr = 0;
      s1 = r1 = gm[g].charCodeAt(m) - 63;
      s2 = r2 = gm[g].charCodeAt(m + 1) - 63;
      flags = gm[g].charCodeAt(m + 2);
      capc = gb[g][s2];
      pc = gb[g][s1];
      if ((pc & 7) == 1)
        if ((s2 < 8) || (s2 > 55)) {
        pr = (pc & 8) + ((flags >> 4) & 3) + 2;
        return;
      }
      if (flags & 32) {
        flags & 16 ? ++r1 : --r1;
        if ((pc & 7) == 1)
          ep = (pc & 8) ? 1 : 9;
        else {
          r2 = (s1 - s2) > 0 ? s1 - 4 : s1 + 3;
          cf = 1;
        }
      }
    }
    function Mv1(g) {
      DoMv(g, pc, s2, s1);
      if (pr)
        gb[g][s2] = pr;
      if (ep)
        gb[g][r1] = 0;
      if (cf)
        DoMv(g, gb[g][r2], r1, r2);
      if (pc & 8)
        ++mn;
    }
    function Mva(g, mv) {
      var tf;
      InitBoard(g);
      while (gx < mv) {
        gx += 3;
        MvD(g);
        Mv1(g);
      }
      DrawBoard(g);
      MvStr(g);
    }
    function Mv(g, mv) {
      Mva(g, --mv * 3);
    }
    function AutoMv() {
      var cm = gx + 3;
      if (cm - 3 >= gend[atgm])
        Astop();
      else {
        tmc = 1;
        Forward(atgm);
        tmc = 0;
      }
    }
    function Astop() {
      atgm = -1;
      tmc = 0;
      clearInterval(tmid);
    }
    function Astart(g) {
      if (atgm >= 0)
        Astop();
      else {
        atgm = g;
        tmid = setInterval('AutoMv()', delay);
        AutoMv();
      }
    }
    function Flip(g) {
      gflip[g] ^= 1;
      DrawBoard(g);
    }
    function Nxm5(g, dr) {
      var i = 11;
      var gln = gm[g].length - 3;
      tm = gx;
      while (i--) {
        tm += dr;
        if ((tm < -3) || (tm > gln)) break;
      }
      tm -= dr;
      Mva(g, tm);
    }
    function Forward5(g) {
      Nxm5(g, 3);
    }
    function Back5(g) {
      Nxm5(g, -3);
    }
    function GoStart(g) {
      if (atgm >= 0) Astop();
      Mva(g, -3);
    }
    function GoEnd(g) {
      if (atgm >= 0) Astop();
      Mva(g, gend[g]);
    }
    function Forward(g) {
      if (atgm >= 0 && tmc == 0) Astop();
      if (gx >= gm[g].length - 3) return;
      Mva(g, gx + 3);
    }
    function Back(g) {
      if (atgm >= 0) Astop();
      if (gx < 0) return;
      Mva(g, gx - 3);
    }
    function Step(g) {
    }
    function GetOrds(sqr, rf) {
      var co = '';
      if (rf & 4)
        co = files.charAt(sqr & 7);
      if (rf & 8)
        co = co + ranks.charAt((sqr & 0x38) >> 3);
      return co;
    }
    function MvStr(g) {
      var clr;
      posbrd = 0;
      if (gx < 0) {
        WriteCap(gc[g]);
        if (gc[g] != '')
          posbrd = 1;
        return;
      }

      var mvs = (pc & 8) ? mn - 1 : mn;
      mvs = mvs.toString() + '. ';
      if (pc & 8)
        mvs += '... ';

      chk = chks[flags & 3];
      if (gx == gend[g])
        chk += ' ' + restr[gres[g]];
      if (cf)
        mvs += (flags & 16) ? 'O-O' : 'O-O-O';
      else {
        pi = (pc & 6) ? fench.charAt(pc & 7) : '';
        pc2 = '';
        if (pr) {
          pc2 = '=' + fench.charAt(pr & 7);
          pi = '';
        }
        capflg = (capc || ep) ? 'x' : '';
        mvs += pi + GetOrds(s1, flags) + capflg + GetOrds(s2, 0x0C) + pc2;
      }
      mvs += chk;
      WriteCap(mvs);
    }
    function KeyDown(e) {
      var key = 0;
      key = ie4 ? event.keyCode : e.which;
      if (key != 0)
        ActOnKey(key);
    }
    function ActOnKey(key) {
      if (key == 37 || key == 100)
        Back(cg)
      if (key == 39 || key == 102)
        Forward(cg)
      if (key == 103)
        GoStart(cg)
      if (key == 97)
        GoEnd(cg)
      if (key == 111)
        Flip(cg)
      if (key == 106)
        Astart(cg)
      if (key == 96)
        Step(cg);
      if (!posbrd)
        MvStr(cg);
    }
    function MsMove() {
      if (ie4) {
        if (dgp) {
          MvPc(event.x, event.y);
        }
      }
    }
    function MvPc(x, y) {
      PcX -= MsX - x;
      PcY -= MsY - y;
      MsX = x;
      MsY = y;
      document.all.pc1.style.pixelLeft = PcX;
      document.all.pc1.style.pixelTop = PcY;
      return false;
    }
    function DropPc(g) {
      var Sx, Sy;

      document.all.pc1.style.visibility = 'hidden';

      if (PcX + 14 < Bx || PcX + 14 > (Bx + 232)) {
        PcOffBrd(g);
        return false;
      }
      if (PcY + 14 < By || PcY + 14 > (By + 232)) {
        PcOffBrd(g);
        return false;
      }

      Sx = PcX - Bx + 14;
      Sy = PcY - By + 14;
      Sx = Math.floor(Sx / 29);
      Sy = Math.floor(Sy / 29);

      nq = Sy * 8 + Sx;
      if (gflip[g])
        nq = 63 - nq;

      Kibitz(g);
      return false;
    }
    function BrdNum(g) {
      var s, a8, sqr;
      debugger;
      g = cg;
      if (ie4) {
        e = window.event;
        a8 = document.images[jb].sourceIndex;
        if (dgp == 0) {
          sqr = document.elementFromPoint(MsX = e.clientX, MsY = e.clientY).sourceIndex;
          PcX = MsX - e.offsetX + document.body.scrollLeft;
          PcY = MsY - e.offsetY + document.body.scrollTop;
          Bx = PcX - document.all[sqr].offsetLeft;
          By = PcY - document.all[sqr].offsetTop;
          s = sqr - a8;
          s -= Math.floor(s / 9);
          if (gflip[g])
            s = 63 - s;

          dgp = gb[g][s];
          if (dgp) {
            dgs = s;
            col = dgp & 8 ? 'b' : 'w';
            pcstr = imgurl + col + ipcs.charAt(dgp & 7) + '.gif';
            document.images['dpc'].src = pcstr;
            gb[g][s] = 0;
            DrawPc(g, 0, s);
            document.all.pc1.style.pixelLeft = PcX;
            document.all.pc1.style.pixelTop = PcY;
            document.all.pc1.style.visibility = 'visible';
            return false;
          }
        }
        else
          DropPc(cg);
        return false;
      }
    }
    function PcOffBrd(g) {
      alert('Piece Off Board!');
      gb[g][dgs] = dgp;
      DrawPc(g, dgp, dgs);
      dgp = 0;
    }
    function Kibitz(g) {
      if (dgp == 1 || dgp == 9)
        if (nq < 8 || nq > 55)
        dgp += 4;

      if (dgp == 6 && dgs == 60)
        if (nq == 62)
        DoMv(g, 4, 61, 63);
      else
        if (nq == 58)
        DoMv(g, 4, 59, 56);

      if (dgp == 14 && dgs == 4)
        if (nq == 6)
        DoMv(g, 12, 5, 7);
      else
        if (nq == 2)
        DoMv(g, 12, 3, 0);

      gb[g][nq] = dgp;
      DrawBoard(g)
      dgp = 0;
    }
