<?xml version="1.0" encoding="UTF-8"?>
<Module>
<ModulePrefs title="どぼん on Javascript" description="どぼん on BiwaScheme のJavascript移植版" author="gemma" author_email="teruakigemma@gmail.com" screenshot="http://sites.google.com/site/musubichat/dobon/dobonshot.png" thumbnail="http://sites.google.com/site/musubichat/dobon/dobonthum.png" height="550" width="480">  
  <Locale lang="ja" country="jp" />  
</ModulePrefs>
<Content type="html"><![CDATA[
<style type="text/css">
  <!--
  table {
  padding:0 0 0 0;
}
tr {
  padding:0 0 0 0;
}
td {
  padding:0 0 0 0;
}

#yama{
  padding-left:  12px;
  padding-right: 12px;
  padding-top:    6px;
  padding-bottom: 6px;
  cursor: pointer;
}

#ba{
  padding-left:  12px;
  padding-right: 12px;
  padding-top:    6px;
  padding-bottom: 6px;
  cursor: pointer;
}

#kotatu {
  background-color: #228822;
  text-align:        center;
  vertical-align:    center;
}

#info {
  margin-top: 5px;
}

#score-container {
  vertical-align:   bottom;
}

#score {
  background-color: #228822;
}

#character {
  border: double;
  width: 450px;
  height: 100px;
}

#char {
  float: left;
  margin-right: 10px;
}

#msgbox {
  margin-top: 5px;
}

span.next-game {
  color: blue;
  text-decoration: underline;
  cursor: pointer;
}

#s0 {cursor: pointer;}
#s1 {cursor: pointer;}
#s2 {cursor: pointer;}
#s3 {cursor: pointer;}
#s4 {cursor: pointer;}
#s5 {cursor: pointer;}
#s6 {cursor: pointer;}
#s7 {cursor: pointer;}
#s8 {cursor: pointer;}

.card-U {
  background-image: url(http://sites.google.com/site/musubichat/dobon/cards.gif);
  background-repeat: no-repeat;
  width:  24px;
  height: 32px;
}

.card-D {
  background-image: url(http://sites.google.com/site/musubichat/dobon/cards.gif);
  background-repeat: no-repeat;
  width:  24px;
  height: 32px;
}

.card-L {
  background-image: url(http://sites.google.com/site/musubichat/dobon/cards.gif);
  background-repeat: no-repeat;
  width:  32px;
  height: 24px;
}

.card-R {
  background-image: url(http://sites.google.com/site/musubichat/dobon/cards.gif);
  background-repeat: no-repeat;
  width:  32px;
  height: 24px;
}

.sprite-C01U { background-position:    0px     0px; } 
.sprite-C01D { background-position:    0px   -37px; } 
.sprite-C01L { background-position:    0px   -74px; } 
.sprite-C01R { background-position:    0px  -102px; } 
.sprite-C02U { background-position:    0px  -130px; } 
.sprite-C02D { background-position:    0px  -167px; } 
.sprite-C02L { background-position:    0px  -204px; } 
.sprite-C02R { background-position:    0px  -232px; } 
.sprite-C03U { background-position:    0px  -260px; } 
.sprite-C03D { background-position:    0px  -297px; } 
.sprite-C03L { background-position:    0px  -334px; } 
.sprite-C03R { background-position:    0px  -362px; } 
.sprite-C04U { background-position:    0px  -390px; } 
.sprite-C04D { background-position:    0px  -427px; } 
.sprite-C04L { background-position:    0px  -464px; } 
.sprite-C04R { background-position:    0px  -492px; } 
.sprite-C05U { background-position:    0px  -520px; } 
.sprite-C05D { background-position:    0px  -557px; } 
.sprite-C05L { background-position:    0px  -594px; } 
.sprite-C05R { background-position:    0px  -622px; } 
.sprite-C06U { background-position:    0px  -650px; } 
.sprite-C06D { background-position:    0px  -687px; } 
.sprite-C06L { background-position:    0px  -724px; } 
.sprite-C06R { background-position:    0px  -752px; } 
.sprite-C07U { background-position:    0px  -780px; } 
.sprite-C07D { background-position:    0px  -817px; } 
.sprite-C07L { background-position:    0px  -854px; } 
.sprite-C07R { background-position:    0px  -882px; } 
.sprite-C08U { background-position:    0px  -910px; } 
.sprite-C08D { background-position:    0px  -947px; } 
.sprite-C08L { background-position:    0px  -984px; } 
.sprite-C08R { background-position:    0px -1012px; } 
.sprite-C09U { background-position:    0px -1040px; } 
.sprite-C09D { background-position:    0px -1077px; } 
.sprite-C09L { background-position:    0px -1114px; } 
.sprite-C09R { background-position:    0px -1142px; } 
.sprite-C10U { background-position:    0px -1170px; } 
.sprite-C10D { background-position:    0px -1207px; } 
.sprite-C10L { background-position:    0px -1244px; } 
.sprite-C10R { background-position:    0px -1272px; } 
.sprite-C11U { background-position:    0px -1300px; } 
.sprite-C11D { background-position:    0px -1337px; } 
.sprite-C11L { background-position:    0px -1374px; } 
.sprite-C11R { background-position:    0px -1402px; } 
.sprite-C12U { background-position:    0px -1430px; } 
.sprite-C12D { background-position:    0px -1467px; } 
.sprite-C12L { background-position:    0px -1504px; } 
.sprite-C12R { background-position:    0px -1532px; } 
.sprite-C13U { background-position:    0px -1560px; } 
.sprite-C13D { background-position:    0px -1597px; } 
.sprite-C13L { background-position:    0px -1634px; } 
.sprite-C13R { background-position:    0px -1662px; } 
.sprite-D01U { background-position:    0px -1690px; } 
.sprite-D01D { background-position:    0px -1727px; } 
.sprite-D01L { background-position:    0px -1764px; } 
.sprite-D01R { background-position:    0px -1792px; } 
.sprite-D02U { background-position:    0px -1820px; } 
.sprite-D02D { background-position:    0px -1857px; } 
.sprite-D02L { background-position:    0px -1894px; } 
.sprite-D02R { background-position:    0px -1922px; } 
.sprite-D03U { background-position:    0px -1950px; } 
.sprite-D03D { background-position:    0px -1987px; } 
.sprite-D03L { background-position:  -37px     0px; } 
.sprite-D03R { background-position:  -37px   -28px; } 
.sprite-D04U { background-position:  -37px   -56px; } 
.sprite-D04D { background-position:  -37px   -93px; } 
.sprite-D04L { background-position:  -37px  -130px; } 
.sprite-D04R { background-position:  -37px  -158px; } 
.sprite-D05U { background-position:  -37px  -186px; } 
.sprite-D05D { background-position:  -37px  -223px; } 
.sprite-D05L { background-position:  -37px  -260px; } 
.sprite-D05R { background-position:  -37px  -288px; } 
.sprite-D06U { background-position:  -37px  -316px; } 
.sprite-D06D { background-position:  -37px  -353px; } 
.sprite-D06L { background-position:  -37px  -390px; } 
.sprite-D06R { background-position:  -37px  -418px; } 
.sprite-D07U { background-position:  -37px  -446px; } 
.sprite-D07D { background-position:  -37px  -483px; } 
.sprite-D07L { background-position:  -37px  -520px; } 
.sprite-D07R { background-position:  -37px  -548px; } 
.sprite-D08U { background-position:  -37px  -576px; } 
.sprite-D08D { background-position:  -37px  -613px; } 
.sprite-D08L { background-position:  -37px  -650px; } 
.sprite-D08R { background-position:  -37px  -678px; } 
.sprite-D09U { background-position:  -37px  -706px; } 
.sprite-D09D { background-position:  -37px  -743px; } 
.sprite-D09L { background-position:  -37px  -780px; } 
.sprite-D09R { background-position:  -37px  -808px; } 
.sprite-D10U { background-position:  -37px  -836px; } 
.sprite-D10D { background-position:  -37px  -873px; } 
.sprite-D10L { background-position:  -37px  -910px; } 
.sprite-D10R { background-position:  -37px  -938px; } 
.sprite-D11U { background-position:  -37px  -966px; } 
.sprite-D11D { background-position:  -37px -1003px; } 
.sprite-D11L { background-position:  -37px -1040px; } 
.sprite-D11R { background-position:  -37px -1068px; } 
.sprite-D12U { background-position:  -37px -1096px; } 
.sprite-D12D { background-position:  -37px -1133px; } 
.sprite-D12L { background-position:  -37px -1170px; } 
.sprite-D12R { background-position:  -37px -1198px; } 
.sprite-D13U { background-position:  -37px -1226px; } 
.sprite-D13D { background-position:  -37px -1263px; } 
.sprite-D13L { background-position:  -37px -1300px; } 
.sprite-D13R { background-position:  -37px -1328px; } 
.sprite-H01U { background-position:  -37px -1356px; } 
.sprite-H01D { background-position:  -37px -1393px; } 
.sprite-H01L { background-position:  -37px -1430px; } 
.sprite-H01R { background-position:  -37px -1458px; } 
.sprite-H02U { background-position:  -37px -1486px; } 
.sprite-H02D { background-position:  -37px -1523px; } 
.sprite-H02L { background-position:  -37px -1560px; } 
.sprite-H02R { background-position:  -37px -1588px; } 
.sprite-H03U { background-position:  -37px -1616px; } 
.sprite-H03D { background-position:  -37px -1653px; } 
.sprite-H03L { background-position:  -37px -1690px; } 
.sprite-H03R { background-position:  -37px -1718px; } 
.sprite-H04U { background-position:  -37px -1746px; } 
.sprite-H04D { background-position:  -37px -1783px; } 
.sprite-H04L { background-position:  -37px -1820px; } 
.sprite-H04R { background-position:  -37px -1848px; } 
.sprite-H05U { background-position:  -37px -1876px; } 
.sprite-H05D { background-position:  -37px -1913px; } 
.sprite-H05L { background-position:  -37px -1950px; } 
.sprite-H05R { background-position:  -37px -1978px; } 
.sprite-H06U { background-position:  -74px     0px; } 
.sprite-H06D { background-position:  -74px   -37px; } 
.sprite-H06L { background-position:  -74px   -74px; } 
.sprite-H06R { background-position:  -74px  -102px; } 
.sprite-H07U { background-position:  -74px  -130px; } 
.sprite-H07D { background-position:  -74px  -167px; } 
.sprite-H07L { background-position:  -74px  -204px; } 
.sprite-H07R { background-position:  -74px  -232px; } 
.sprite-H08U { background-position:  -74px  -260px; } 
.sprite-H08D { background-position:  -74px  -297px; } 
.sprite-H08L { background-position:  -74px  -334px; } 
.sprite-H08R { background-position:  -74px  -362px; } 
.sprite-H09U { background-position:  -74px  -390px; } 
.sprite-H09D { background-position:  -74px  -427px; } 
.sprite-H09L { background-position:  -74px  -464px; } 
.sprite-H09R { background-position:  -74px  -492px; } 
.sprite-H10U { background-position:  -74px  -520px; } 
.sprite-H10D { background-position:  -74px  -557px; } 
.sprite-H10L { background-position:  -74px  -594px; } 
.sprite-H10R { background-position:  -74px  -622px; } 
.sprite-H11U { background-position:  -74px  -650px; } 
.sprite-H11D { background-position:  -74px  -687px; } 
.sprite-H11L { background-position:  -74px  -724px; } 
.sprite-H11R { background-position:  -74px  -752px; } 
.sprite-H12U { background-position:  -74px  -780px; } 
.sprite-H12D { background-position:  -74px  -817px; } 
.sprite-H12L { background-position:  -74px  -854px; } 
.sprite-H12R { background-position:  -74px  -882px; } 
.sprite-H13U { background-position:  -74px  -910px; } 
.sprite-H13D { background-position:  -74px  -947px; } 
.sprite-H13L { background-position:  -74px  -984px; } 
.sprite-H13R { background-position:  -74px -1012px; } 
.sprite-NLU  { background-position:  -74px -1040px; } 
.sprite-NLD  { background-position:  -74px -1077px; } 
.sprite-NLL  { background-position:  -74px -1114px; } 
.sprite-NLR  { background-position:  -74px -1142px; } 
.sprite-S01U { background-position:  -74px -1170px; } 
.sprite-S01D { background-position:  -74px -1207px; } 
.sprite-S01L { background-position:  -74px -1244px; } 
.sprite-S01R { background-position:  -74px -1272px; } 
.sprite-S02U { background-position:  -74px -1300px; } 
.sprite-S02D { background-position:  -74px -1337px; } 
.sprite-S02L { background-position:  -74px -1374px; } 
.sprite-S02R { background-position:  -74px -1402px; } 
.sprite-S03U { background-position:  -74px -1430px; } 
.sprite-S03D { background-position:  -74px -1467px; } 
.sprite-S03L { background-position:  -74px -1504px; } 
.sprite-S03R { background-position:  -74px -1532px; } 
.sprite-S04U { background-position:  -74px -1560px; } 
.sprite-S04D { background-position:  -74px -1597px; } 
.sprite-S04L { background-position:  -74px -1634px; } 
.sprite-S04R { background-position:  -74px -1662px; } 
.sprite-S05U { background-position:  -74px -1690px; } 
.sprite-S05D { background-position:  -74px -1727px; } 
.sprite-S05L { background-position:  -74px -1764px; } 
.sprite-S05R { background-position:  -74px -1792px; } 
.sprite-S06U { background-position:  -74px -1820px; } 
.sprite-S06D { background-position:  -74px -1857px; } 
.sprite-S06L { background-position:  -74px -1894px; } 
.sprite-S06R { background-position:  -74px -1922px; } 
.sprite-S07U { background-position:  -74px -1950px; } 
.sprite-S07D { background-position:  -74px -1987px; } 
.sprite-S07L { background-position: -111px     0px; } 
.sprite-S07R { background-position: -111px   -28px; } 
.sprite-S08U { background-position: -111px   -56px; } 
.sprite-S08D { background-position: -111px   -93px; } 
.sprite-S08L { background-position: -111px  -130px; } 
.sprite-S08R { background-position: -111px  -158px; } 
.sprite-S09U { background-position: -111px  -186px; } 
.sprite-S09D { background-position: -111px  -223px; } 
.sprite-S09L { background-position: -111px  -260px; } 
.sprite-S09R { background-position: -111px  -288px; } 
.sprite-S10U { background-position: -111px  -316px; } 
.sprite-S10D { background-position: -111px  -353px; } 
.sprite-S10L { background-position: -111px  -390px; } 
.sprite-S10R { background-position: -111px  -418px; } 
.sprite-S11U { background-position: -111px  -446px; } 
.sprite-S11D { background-position: -111px  -483px; } 
.sprite-S11L { background-position: -111px  -520px; } 
.sprite-S11R { background-position: -111px  -548px; } 
.sprite-S12U { background-position: -111px  -576px; } 
.sprite-S12D { background-position: -111px  -613px; } 
.sprite-S12L { background-position: -111px  -650px; } 
.sprite-S12R { background-position: -111px  -678px; } 
.sprite-S13U { background-position: -111px  -706px; } 
.sprite-S13D { background-position: -111px  -743px; } 
.sprite-S13L { background-position: -111px  -780px; } 
.sprite-S13R { background-position: -111px  -808px; } 
.sprite-UR0U { background-position: -111px  -836px; } 
.sprite-UR0D { background-position: -111px  -873px; } 
.sprite-UR0L { background-position: -111px  -910px; } 
.sprite-UR0R { background-position: -111px  -938px; } 
  -->
</style>
<script type="text/javascript">
var idList = ["s", "w", "n", "e"]; //const
var dirs   = ["U", "R", "D", "L"]; //const
var suits  = ["C", "D", "H", "S"]; //const
var ranks  = ["01", "02", "03", "04", "05", "06", "07", "08", "09", "10", "11", "12", "13"]; //const
var enemyWait = 1000; //const
var gameCount = 0;
var oya = 0;
var turn = 0;
var scoreVec = [0,0,0,0];
var nameVec = ["名無し","名無し","名無し","名無し"];
var cardVec = [];
var suitVec = [];
var rankVec = [];
var usedCard = 0;
var gameDirection = 1;
var dropOnly = false;
var numDraw = 0;
var state = 0;
var yamaSuit = -2;
var yamaRank = -2;
var baSuit = -2;
var baRank = -2;
var skip = false;
var messageMode = false;

function cardImage(aDirection, aSuit, aRank) {
  return "sprite-" + suits[aSuit] + ranks[aRank] + dirs[aDirection] + " card-" +  dirs[aDirection];
}

function uraImage(aDirection) {
  return "sprite-UR0" + dirs[aDirection] + " card-" + dirs[aDirection];
}

function nlImage(aDirection) {
  return "sprite-NL"  + dirs[aDirection] + " card-" + dirs[aDirection];
}

function charImage(aChar) {
  switch (aChar) {
  case 0: return "http://sites.google.com/site/musubichat/dobon/d_lico.png";
  case 1: return "http://sites.google.com/site/musubichat/dobon/d_suzu.png";
  case 2: return "http://sites.google.com/site/musubichat/dobon/d_wakana.png";
  case 3: return "http://sites.google.com/site/musubichat/dobon/d_rikka.png";
  default: return "";
  }
}

function updateScoreTable() {
  for (var i = 0; i < 4; i++) {
    document.getElementById("sc_" + idList[i]).innerHTML =
      "<small>" + nameVec[i] + "<br/>" + scoreVec[i] + "点</small>";
  }
  document.getElementById("sc_count").innerHTML =
    "<small>" +
    (gameCount <= 4) ? (gameCount + 1) + "回戦" : "結果" +
    "</small>";
}

function playerCard(aPlayer, aCard) {
  return aPlayer * 9 + aCard;
}

function cardIndex(aSuit, aRank) {
  return aSuit * 13 + aRank;
}

function takeACard() {
  var arr = [];
  for (var i = 0, len = cardVec.length; i < len; i++) {
    if (cardVec[i] == "yama") arr.push(i);
  }
  if (!arr.length) return null;
  var index = arr[Math.floor(Math.random() * arr.length)];
  cardVec[index] = "hand";
  usedCard++;
  return [Math.floor(index / 13), index % 13];
}

function dealCards() {
  var c;
  for (var i = 0; i < 4; i++) {
    for (var j = 0; j < 5; j++) {
      if ((j != 4) || (i != oya)) {
        var index = playerCard(i, j);
        c = takeACard();
        suitVec[index] = c[0];
        rankVec[index] = c[1];
      }
    }
  }
  c = takeACard();
  yamaSuit = c[0];
  yamaRank = c[1];
  c = takeACard();
  baSuit = c[0];
  baRank = c[1];
  document.getElementById("info").innerHTML = "<small><b>欲しいカードを選んでください</b></small>";
}

function updateCard() {
  for (var i = 0; i < 4; i++) {
    for (var j = 0; j < 9; j++) {
      var elt = document.getElementById(idList[i] + j);
      var index = playerCard(i, j);
      if (suitVec[index] == -1) {
        elt.className = nlImage(i);
      } else if (i == 0) {
        elt.className = cardImage(i, suitVec[index], rankVec[index]);
      } else {
        elt.className = uraImage(i);
      }
    }
  }
  document.getElementById("yama").className = (yamaSuit == -2) ? uraImage(0) : cardImage(0, yamaSuit, yamaRank);
  document.getElementById("ba")  .className =   (baSuit == -2) ? uraImage(0) : cardImage(0,   baSuit,   baRank);
}

function showPlayerCard(aPlayer) {
  for (var i = 0; i < 9; i++) {
    var index = playerCard(aPlayer, i);
    var elt = document.getElementById(idList[aPlayer] + i);
    if (suitVec[index] == -1) {
      elt.className = nlImage(aPlayer);
    } else {
      elt.className = cardImage(aPlayer, suitVec[index], rankVec[index]);
    }
  }
}
function initOneGame() {
  var i = 0;
  for (i = 0; i < 4 * 13; i++) {
    cardVec[i] = "yama";
  }
  for (i = 0; i < 4 *  9; i++) {
    suitVec[i] = -1;
    rankVec[i] = -1;
  }
  usedCard = 0;
  gameDirection = 1;
  dropOnly = false;
  numDraw = 0;
  state = 0;
  dealCards();
  updateCard();
}
function init() {
  for (var i = 0; i < 4; i++) {
    nameVec[i] = document.getElementById("p" + i).value;
  }
  updateScoreTable();
  initOneGame();
}

function oyaSelection() {
  function yamaOrBa() {
    if (yamaRank == 2 - 1) return true;
    if (  baRank == 2 - 1) return false;
    if (yamaRank == 8 - 1) return true;
    if (  baRank == 8 - 1) return false;
    if (yamaRank < baRank) return true;
    return false;
  }
  var index = playerCard(turn, 4);
  if (yamaOrBa()) {
    suitVec[index] = yamaSuit;
    rankVec[index] = yamaRank;
  } else {
    suitVec[index] = baSuit;
    rankVec[index] = baRank;
    baSuit = yamaSuit;
    baRank = yamaRank;
  }
  yamaSuit = -2;
  state = 1;
  document.getElementById("info").innerHTML = "";
  updateCard();
  nextTurn();
}

function countCard(aPlayer) {
  for (var i = 0; i < 9; i++) {
    if (suitVec[playerCard(aPlayer, i)] == -1) break;
  }
  return i;
}

function countNCard(aPlayer, aN) {
  var num = 0;
  for (var i = 0; i < 9; i++) {
    var index = playerCard(aPlayer, i);
    if (suitVec[index] == -1) break;
    if (rankVec[index] == aN - 1) num++;
  }
  return num;
}

function countSpecialCard(aPlayer) {
  return countNCard(aPlayer, 1) +
         countNCard(aPlayer, 2) +
         countNCard(aPlayer, 8) +
         countNCard(aPlayer, 9);
}

function dropCheck(aPlayer) {
  var numCards = countCard(aPlayer);
  var num8     = countNCard(aPlayer, 8);
  if (numCards == 1 || numCards == num8) return false;
  if (numCards == 2 && num8     == 1)    return "almost8";
  return true;
}

function find2Card(aPlayer) {
  for (var i = 0; i < 9; i++) {
    var index = playerCard(aPlayer, i);
    if (suitVec[index] != -1 && rankVec[index] == 2 - 1) {
      return i;
    }
  }
  return false;
}
function findDropCard(aPlayer, aAlmost8) {
  for (var i = 0; i < 9; i++) {
    var index = playerCard(aPlayer, i);
    var suit = suitVec[index];
    var rank = rankVec[index];
    if (suit == -1) break;
    if (aAlmost8 && rank == 8 - 1) continue;
    if (dropOnly || suit == baSuit || rank == baRank) return i;
  }
  return false;
}

function enemyTurn() {
  var check = dropCheck(turn);
  if (check === false) {
    if (drawCard(turn)) { //can't drop
      updateCard();
      nextTurn();
    }
  } else if (numDraw > 0) {
    var pos2 = find2Card(turn); //exist 2
    if (!pos2 || check === "almost8") {
      if (drawMultiCards(turn, numDraw)) {
        numDraw = 0;
        nextTurn();
      }
    } else {
      var index = playerCard(turn, pos2);
      dropCard(suitVec[index], rankVec[index]);
      shiftCard(turn, pos2);
      updateCard();
      if (!dobonCheck(turn)) nextTurn();
    }
  } else {
    var posDrop = findDropCard(turn, check === "almost8"); // normal state;
    if (posDrop === false) {
      if (drawCard(turn)) {
        updateCard();
        nextTurn();
      }
    } else {
      var index = playerCard(turn, posDrop);
      var drop = dropCard(suitVec[index], rankVec[index]); // can drop
      shiftCard(turn, posDrop);
      updateCard();
      if (!dobonCheck(turn)) {
        if (drop == 8) {
          dropOnly = true;
          setTimeout(enemyTurn, enemyWait);
        } else {
          nextTurn();
        }
      }
    }
  }
}

function nextTurn() {
  var arrow = ["↓", "←", "↑", "→"];
  turn += gameDirection * (skip ? 2 : 1);
  skip = false;
  if (turn > 3) {
    turn -= 4;
  } else if (turn < 0) {
    turn += 4;
  }
  if (turn != 0) setTimeout(enemyTurn, enemyWait);
  showHint();
  document.getElementById("info").innerHTML = arrow[turn];
}

function nextGame(aNextOya) {
  gameCount++;
  updateScoreTable();
  if (gameCount == 5) {
    var c = Math.floor(Math.random() * 4);
    showMessage(c,
                "<b>" + nameVec[c] + "</b>:<br/>「おつかれさま。<br/>再プレイは更新ボタンでのセルフサービスとなっております。」<br/>",
                function () {});
  } else {
    clearMessage();
    turn = aNextOya;
    oya  = aNextOya;
    initOneGame();
    if (oya != 0) oyaSelection();
  }
}

function dobonCheckOnce(aPlayer) {
  var sum = 0;
  for (var i = 0; i < 9; i++) {
    var index = playerCard(aPlayer, i);
    if (suitVec[index] == -1) break;
    sum += rankVec[index] + 1;
  }
  return sum == baRank + 1;
}

function dobonCheck(aHurikomi) {
  var msg = "";
  var agariList = [];
  for (var i = 0; i < 4; i++) {
    if (i != aHurikomi && dobonCheckOnce(i)) {
      showPlayerCard(i);
      msg = "<b>" + nameVec[i] +  "</b>:<br/>「どぼん！」<br/>";
      agariList.unshift(i);
    }
  }
  if (agariList.length) {
    showMessage(agariList[0],
                msg,
                function() {
                  dobonGaeshiCheck(agariList, aHurikomi);
                });
    return true;
  }
  return false;
}

function dobonGaeshiCheck(aAgariList, aHurikomi) {
  if (dobonCheckOnce(aHurikomi)) {
    showPlayerCard(aHurikomi);
    showMessage(aHurikomi,
                "<b>" + nameVec[aHurikomi] + "</b>:<br/>「どぼん返し！」<br/>",
                function () {
                  dobonGaeshiCalc(aAgariList, aHurikomi);
                });
  } else {
    dobonCalc(aAgariList, aHurikomi);
  }
}

function dobonCalc(aAgariList, aHurikomi) {
  var msg = "";
  var baseScore = 0;
  var exScore = 0;
  var score = 0;
  for (var i = 0; i < aAgariList.length; i++) {
    var agari = aAgariList[i];
    baseScore = dobonBaseScore(agari, aHurikomi);
    exScore   = dobonExScore  (agari, aHurikomi);
    score = baseScore * (exScore + 1);
    scoreVec[agari]     += score;
    scoreVec[aHurikomi] -= score;
    msg = "<b>" +
          nameVec[agari] +
          "</b>へ<b>" +
          nameVec[aHurikomi] +
          "</b>から<b>" +
          score +
          "</b>点<br/>(基本点" +
          baseScore +
		      " * (1 + ドローカード" +
          exScore +
          "))<br/>";
  };
  updateScoreTable();
  showMessage(aAgariList[0],
              msg,
              function() {
                nextGame(aAgariList[0]);
              });
}

function dobonGaeshiCalc(aAgariList, aHurikomi) {
  var msg = "";
  var baseScore = 0;
  var exScore = 0;
  var score = 0;
  for (var i = 0; i < aAgariList.length; i++) {
    var agari = aAgariList[i];
    baseScore = dobonBaseScore(agari, aHurikomi);
    exScore   = dobonExScore  (agari, aHurikomi);
    score = baseScore * (exScore + 3);
    scoreVec[agari]     -= score;
    scoreVec[aHurikomi] += score;
    msg = "<b>" +
          nameVec[aHurikomi] +
          "</b>へ<b>" +
          nameVec[agari] +
          "</b>から<b>" +
          score +
          "</b>点<br/>(基本点" +
          baseScore +
          " * (3 + ドローカード" +
          exScore +
          "))<br/>";
  };
  updateScoreTable();
  showMessage(aAgariList[0],
              msg,
              function() {
                nextGame(aHurikomi);
              });

}

function dobonBaseScore(aAgari, aHurikomi) {
  var acc = 0;
  for (var i = 0; i < 4; i++) {
    if (i == aAgari || i == aHurikomi) {
      acc += countSpecialCard(i);
    }
    acc += countCard(i);
  }
  return acc;
}

function dobonExScore(aAgari, aHurikomi) {
  return countNCard(aAgari, 2) + countNCard(aHurikomi, 2);
}

function showMessage(aChar, aMsg, aCont) {
  messageMode = true;
  document.getElementById("char").src =  charImage(aChar);
  document.getElementById("msgbox").innerHTML =
    aMsg + "<span class='next-game' id='next'>&gt;&gt;&gt;next&lt;&lt;&lt;</a>";
  document.getElementById("next").onclick = aCont;
}

function showHint() {
  var suitList = ["クローバー", "ダイヤ", "ハート", "スペード"];
  var numCard = countCard(0);
  var check = dropCheck(0);
  if (state == 1 && turn == 0) {
    document.getElementById("char").src = charImage(0);
    var msg = "<b>" + nameVec[0] + "</b>:<br/>";
    if (numDraw > 0) {
      msg += "(「２」が出せなかったら山札から" + numDraw + "枚取らないと...)";
    } else if (numCard == 1 || check === false) {
      msg += "(今はカードを出せないから山札から取らないと...)";
    } else {
      msg += "(「" + suitList[baSuit] + "」か「" + (baRank + 1) + "」のカードが出せる...)";
    }
    document.getElementById("msgbox").innerHTML = msg;
  } else {
    clearMessage();
  }
}

function clearMessage() {
  messageMode = false;
  document.getElementById("char").src = charImage(0);
  document.getElementById("msgbox").innerHTML = "";
}

function dropCard(aSuit, aRank) {
  if (dropOnly || baSuit == aSuit || baRank == aRank) {
    dropOnly = false;
    cardVec[cardIndex(aSuit, aRank)] = "drop";
    baSuit = aSuit;
    baRank = aRank;
    switch (aRank) {
    case 8 - 1:
      document.getElementById("info").innerHTML = "<small>もう一枚カードを選んで下さい</small>";
      return 8;
    case 9 - 1:
      gameDirection *= -1;
      break;
    case 1 - 1:
      skip = true;
      break;
    case 2 - 1:
      numDraw += 2;
      break;
    }
    return true;
  }
  return false;
}

function shiftCard(aPlayer, aPos) {
  for (var i = aPos + 1; i < 9; i++) {
    if (suitVec[playerCard(aPlayer, 1)] == -1) break;
    var index0 = playerCard(aPlayer, i - 1);
    var index1 = playerCard(aPlayer, i);
    suitVec[index0] = suitVec[index1];
    rankVec[index0] = rankVec[index1];
  }
  var index2 = playerCard(aPlayer, 8);
  suitVec[index2] = -1;
  rankVec[index2] = -1;
}

function resetCard() {
  for (var i = 0, len = 4 * 13; i < len; i++) {
    if (cardVec[i] == "drop") {
      cardVec[i] = "yama";
      usedCard--;
    }
  }
}

function drawCard(aPlayer) {
  if (countCard(aPlayer) == 9) {
    //over 10
    scoreVec[aPlayer] -= 80;
    scoreVec[0]       += 20;
    scoreVec[1]       += 20;
    scoreVec[2]       += 20;
    scoreVec[3]       += 20;
    showMessage(aPlayer,
                "<b>" + nameVec[aPlayer] + "</b>:<br/>「カードが10枚をこえちゃった...」<br/>",
                function () {
                  nextGame(turn);
                });
    return false;
  }
  if (usedCard == 52) resetCard();
  var index = playerCard(aPlayer, countCard(aPlayer));
  var c = takeACard();
  suitVec[index] = c[0];
  rankVec[index] = c[1];
  return true;
}

function drawMultiCards(aPlayer, aDraw) {
  for (var i = 0; i < aDraw; i++) {
    if (!drawCard(aPlayer)) break;
  }
  updateCard();
  return i == aDraw;
}

function yamaClick() {
  if (state == 0) {
    if (!messageMode && oya == 0) {
      var index = playerCard(0, 4);
      suitVec[index] = yamaSuit;
      rankVec[index] = yamaRank;
      yamaSuit = -2;
      state = 1;
      document.getElementById("info").innerHTML = "";
      updateCard();
      nextTurn();
    }
  } else {
    if (!messageMode && turn == 0 && !dropOnly) {
      if (numDraw == 0) {
        if (drawCard(0)) {
          updateCard();
          nextTurn();
        }
      } else {
        if (drawMultiCards(0, numDraw)) {
          numDraw = 0;
          updateCard();
          nextTurn();
        }
      }
    }
  }
}

function baClick() {
  if (!messageMode && state == 0 && oya == 0) {
    var index = playerCard(0, 4);
    suitVec[index] = baSuit;
    rankVec[index] = baRank;
    baSuit = yamaSuit;
    baRank = yamaRank;
    yamaSuit = -2;
    state = 1;
    document.getElementById("info").innerHTML = "";
    updateCard();
    nextTurn();
  }
}

function cardClick(aN) {
  if (!messageMode && state == 1 && turn == 0) {
    var check = dropCheck(0);
    var index = playerCard(0, aN);
    var suit = suitVec[index];
    var rank = rankVec[index];
    if (numDraw > 0 && rank != 2 - 1) {
      if (drawMultiCards(0, numDraw)) {
        numDraw = 0;
        nextTurn();
      }
    } else {
      if (check === false) return;
      if (check === "almost8" && rank == 8 - 1) return;
      if (dropOnly || suit == baSuit || rank == baRank) {
        var drop = dropCard(suit, rank);
        shiftCard(0, aN);
        updateCard();
        if (!dobonCheck(0)) {
          if (drop == 8) {
            dropOnly = true;
          } else {
            nextTurn();
          }
        }
      }
    }
  }
}

function main() {
  for (var i = 0; i < 9; i++) {
    document.getElementById("s" + i).onclick = (function(x) {
      return function(e) {cardClick(x);};
    })(i);
  }
  document.getElementById("ba")  .onclick = baClick;
  document.getElementById("yama").onclick = yamaClick;
  init();
}

window.onload = main;
</script>
<h1>どぼん on Javascript</h1>
<small><a href="http://lambda.bugyo.tk/cdr/dobon/rule.html" target="_blank">ルール説明</a></small><br/>
<small>Lispの力で動く<a href="http://lambda.bugyo.tk/cdr/dobon">"どぼん on BiwaScheme"</a>を移植したものです。</small>
  <table>
  <tr>
    <td>
      <table id="sprites">
        <tr>
          <td class="sprite-NLD card-D"></td>
          <td id="n0" class="sprite-UR0D card-D"></td>
          <td id="n1" class="sprite-UR0D card-D"></td>
          <td id="n2" class="sprite-UR0D card-D"></td>
          <td id="n3" class="sprite-UR0D card-D"></td>
          <td id="n4" class="sprite-UR0D card-D"></td>
          <td id="n5" class="sprite-UR0D card-D"></td>
          <td id="n6" class="sprite-UR0D card-D"></td>
          <td id="n7" class="sprite-UR0D card-D"></td>
          <td id="n8" class="sprite-UR0D card-D"></td>
          <td class="sprite-NLD card-D"></td>
        </tr>
        <tr>
          <td id="w0" class="sprite-UR0R card-R"></td>
          <td id="kotatu" colspan="9" rowspan="9">
            <span id="yama" class="sprite-UR0 card-U"></span>
            <span id="ba"   class="sprite-UR0 card-U"></span>
            <div id="info"></div>
          </td>
          <td id="e0" class="sprite-UR0L card-L"></td>
        </tr>
        <tr>
          <td id="w1" class="sprite-UR0R card-R"></td>
          <td id="e1" class="sprite-UR0L card-L"></td>
        </tr>
        <tr>
          <td id="w2" class="sprite-UR0R card-R"></td>
          <td id="e2" class="sprite-UR0L card-L"></td>
        </tr>          
        <tr>
          <td id="w3" class="sprite-UR0R card-R"></td>
          <td id="e3" class="sprite-UR0L card-L"></td>
        </tr>
        <tr>
          <td id="w4" class="sprite-UR0R card-R"></td>
          <td id="e4" class="sprite-UR0L card-L"></td>
        </tr>
        <tr>
          <td id="w5" class="sprite-UR0R card-R"></td>
          <td id="e5" class="sprite-UR0L card-L"></td>
        </tr>
        <tr>
          <td id="w6" class="sprite-UR0R card-R"></td>
          <td id="e6" class="sprite-UR0L card-L"></td>
        </tr>
        <tr>
          <td id="w7" class="sprite-UR0R card-R"></td>
          <td id="e7" class="sprite-UR0L card-L"></td>
        </tr>
        <tr>
          <td id="w8" class="sprite-UR0R card-R"></td>
          <td id="e8" class="sprite-UR0L card-L"></td>
        </tr>
        <tr>
          <td class="sprite-NLU card-U"></td>
          <td id="s0" class="sprite-H01U card-U"></td>
          <td id="s1" class="sprite-H02U card-U"></td>
          <td id="s2" class="sprite-H03U card-U"></td>
          <td id="s3" class="sprite-H04U card-U"></td>
          <td id="s4" class="sprite-H05U card-U"></td>
          <td id="s5" class="sprite-H06U card-U"></td>
          <td id="s6" class="sprite-H07U card-U"></td>
          <td id="s7" class="sprite-H08U card-U"></td>
          <td id="s8" class="sprite-H09U card-U"></td>
          <td class="sprite-NLU card-U"></td>
        </tr>
      </table>
    </td>
    <td id="score-container">
      <b>得点表</b><br>
      <table id="score" cellspacing="5">
        <tr>
          <td></td>
          <td><div id="sc_n"></div></td>
          <td></td>
        </tr>
        <tr>
          <td><div id="sc_w"></div></td>
          <td><div id="sc_count"></div></td>
          <td><div id="sc_e"></div></td>
        </tr>
        <tr>
          <td></td>
          <td><div id="sc_s"></div></td>
          <td></td>
        </tr>
      </table>
    </td>
  </tr>
</table>

<div id="character">
  <img id="char" src="http://sites.google.com/site/musubichat/dobon_file/d_lico.png">
  <div id="msgbox">Javascriptの力で動いています</div>
</div>

<form id="f">
  <input type="hidden" id="p0" name="p0" value="りこ">
  <input type="hidden" id="s0" name="s0" value="0">
  <input type="hidden" id="i0" name="i0" value="./img/d_lico.png">
  <input type="hidden" id="p1" name="p1" value="すず">
  <input type="hidden" id="s1" name="s1" value="0">
  <input type="hidden" id="i1" name="i1" value="./img/d_suzu.png">
  <input type="hidden" id="p2" name="p2" value="わかな">
  <input type="hidden" id="s2" name="s2" value="0">
  <input type="hidden" id="i2" name="i2" value="./img/d_wakana.png">
  <input type="hidden" id="p3" name="p3" value="りっか">
  <input type="hidden" id="s3" name="s3" value="0">
  <input type="hidden" id="i3" name="i3" value="./img/d_rikka.png">
</form>
]]></Content>
</Module>
