var iconDir = "img2/";
var iconPrefix = "";
var job = 00;  // 00:ナガ／キン   01:仁王   02:金剛
               // 10:アス／ラク   11:修羅   21:羅刹
               // 20:ヤク／ガン   21:夜叉   22:薬叉
               // 30:ディバ／ガル 31:呪法師 32:召還師


/**
 * 2次職か否かを返す。
 */
function is2nd() {
  return job % 10 != 0;
}


/**
 * ベース・レベルを返す。
 *
 * @return ベース・レベルの整数。
 */
function getBlv() {
  return parseInt(document.all("selBlv").value);
}


/**
 * 総スキル・ポイント数を返す。
 * 1 次職では、スキル・ポイント数 = レベル。
 * 2 次職では、スキル・ポイント数 = レベル + ((レベル - 45) / 10 + 1) * 2。
 */
function getSptTotal() {
  var blv = getBlv();
  return blv + (is2nd()? (Math.floor((blv - 45) / 10) + 1) * 2: 0);
}


/**
 * スキル・ポイント残数を返す。
 */
function getSpt() {
  var sp = getSptTotal();  // 総スキル・ポイント
  for (i = 0; i<skill.length; i++)  // 使用済みポイントを減算
    sp -= skill[i][5];
  return sp;
}


/**
 * スキル上昇処理。
 * @param skillID スキル番号の整数。
 */
function skillUp(skillID) {
  var skl = skill[skillID];
  var chk;
if (!isNaN(skl[3])){

 if (isNaN(skl[1])){

  if (getSpt() > 0 &&  // 残スキルポイント有り
      skl[1][skl[5]] <= getBlv() &&  // bLv は足りているか★
      skl[5] < skl[2] &&  // sLv が限界に達しているか 
      (skl[3] == -1 ||  // 必要スキル無し、または、
       skill[skl[3]][5] >= skl[4])) {  // 必要スキル及びそのレベル
    skl[5]++;
    document.all("sk" + skillID).innerHTML = skl[5];
    document.all("skpoint").innerHTML = getSpt();
  }

 }else{

  if (getSpt() > 0 &&  // 残スキルポイント有り
      (skl[0] + Math.floor(skl[1] * skl[5])) <= getBlv() &&  // bLv は足りているか★
      skl[5] < skl[2] &&  // sLv が限界に達しているか 
      (skl[3] == -1 ||  // 必要スキル無し、または、
       skill[skl[3]][5] >= skl[4])) {  // 必要スキル及びそのレベル
    skl[5]++;
    document.all("sk" + skillID).innerHTML = skl[5];
    document.all("skpoint").innerHTML = getSpt();
  }

 }

}else{

 if (isNaN(skl[1])){

  chk = 0;
  for (j = 0; j < skl[3].length; j++) {
    if(skill[skl[3][j]][5] < skl[4][j]) chk++;
  }
  if (getSpt() > 0 &&  // 残スキルポイント有り
      skl[1][skl[5]] <= getBlv() &&  // bLv は足りているか★
      skl[5] < skl[2] &&  // sLv が限界に達しているか 
      chk == 0) {  // 必要スキル及びそのレベル
    skl[5]++;
    document.all("sk" + skillID).innerHTML = skl[5];
    document.all("skpoint").innerHTML = getSpt();
  }

 }else{

  chk = 0;
  for (j = 0; j < skl[3].length; j++) {
    if(skill[skl[3][j]][5] < skl[4][j]) chk++;
  }
  if (getSpt() > 0 &&  // 残スキルポイント有り
      (skl[0] + Math.floor(skl[1] * skl[5])) <= getBlv() &&  // bLv は足りているか★
      skl[5] < skl[2] &&  // sLv が限界に達しているか 
      chk == 0) {  // 必要スキル及びそのレベル
    skl[5]++;
    document.all("sk" + skillID).innerHTML = skl[5];
    document.all("skpoint").innerHTML = getSpt();
  }

 }
}

  setAlpha();
  showPopup(skillID);
}

/**
 * スキル下降処理。
 * @param skillID スキル番号の整数。
 */
function skillDown(skillID) {
  if (skill[skillID][5] > 0) {
    skill[skillID][5]--;
    document.all("sk" + skillID).innerHTML = skill[skillID][5];
    checkRequiredLevel();
    document.all("skpoint").innerHTML = getSpt();
  }
  setAlpha();
  showPopup(skillID);
}

/**
 */
function checkRequiredLevel() {
  //var skl;
  // 必要ベースレベルチェック
  for (i = 0; i < skill.length; i++) {
    //skl = 
    for (;;) {
 if (isNaN(skill[i][1])){

      if (skill[i][5] > 0 && skill[i][1][skill[i][5] - 1] > getBlv()) { //★
        skill[i][5]--;
        continue;
      }

 }else{

      if (skill[i][5] > 0 && (skill[i][0] + Math.floor(skill[i][1] * (skill[i][5] - 1))) > getBlv()) { //★
        skill[i][5]--;
        continue;
      }

 }
      break;
    }
    document.all("sk" + i).innerHTML = skill[i][5];
  }
  // 必要スキルチェック
  for (i = 0; i < skill.length; i++) {
if (!isNaN(skill[i][3])){
    if (skill[i][5] != 0 &&
        skill[i][3] != -1 &&
        skill[skill[i][3]][5] < skill[i][4]) {
      skill[i][5] = 0;
      document.all("sk" + i).innerHTML = 0;
    }
}else{
  for (j = 0; j < skill[i][3].length; j++) {
    if (skill[i][5] != 0 &&
        skill[skill[i][3][j]][5] < skill[i][4][j]) {
      skill[i][5] = 0;
      document.all("sk" + i).innerHTML = 0;
    }
  }
}

  }
  document.all("skpoint").innerHTML = getSpt();
}


function chgBlv() {
  document.all("skpoint").innerHTML = getSpt();
  checkRequiredLevel()
  setAlpha();
}

/**
 * スキル・アイコンを描画処理。
 * @param skillID スキル番号の整数。
 */
function drawIcon(skillID) {
  if (skillID == -1)
    return;
  var sklIco;
  if (skill[skillID][8] == -1)
    sklIco = iconDir + iconPrefix + skillID + ".png";
  else
    sklIco = iconDir + iconPrefix + skill[skillID][8] + ".png";
  document.write("<table cellpadding=0 cellspacing=0 class=iconblock onmouseover='showPopup(" + skillID + ");' onMouseOut='hidePopup();'>");
  document.write("<tr>");
  document.write("<td rowspan=2><img src=" + sklIco + " "
               + "onclick='skillDown(" + skillID + ");' "
               + "ondblclick='skillDown(" + skillID + ");' "
               + "class=iconimg id=icon" + skillID + "></td>");
  document.write("<td class=level><span id=sk" + skillID + ">0</span></td><tr>");
  document.write("<td><img src=" + iconDir + "plus.png "
               + "onclick='skillUp(" + skillID + ");' "
               + "ondblclick='skillUp(" + skillID + ");' "
               + "onmouseover=this.src='" + iconDir + "up.png' "
               + "onmouseout=this.src='" + iconDir + "plus.png' "
               + "class=plus></td></tr>");
  document.write("</table>");
}


function setAlpha() {
  var blv = getBlv();
  var chk;
  for (i = 0; i < skill.length; i++) {
if (!isNaN(skill[i][3])){
    if ((skill[i][3] != -1 && skill[skill[i][3]][5] < skill[i][4]) ||
        skill[i][0] > blv) {
      document.all("icon" + i).filters["alpha"].opacity = 30;
    } else {
      document.all("icon" + i).filters["alpha"].opacity = 100;
    }
}else{
  chk = 0;
  for (j = 0; j < skill[i][3].length; j++) {
    if ((skill[i][3][j] != -1 && skill[skill[i][3][j]][5] < skill[i][4][j]) ||
        skill[i][0] > blv) chk++;
  }
    if(chk != 0) {
      document.all("icon" + i).filters["alpha"].opacity = 30;
    } else {
      document.all("icon" + i).filters["alpha"].opacity = 100;
    }
}

  }
}

/**
 * ポップアップ描画。
 * @param skillID スキル番号の整数。
 */
function showPopup(skillID) {
  var skl = skill[skillID];
  var x = event.clientX + document.body.scrollLeft;
  var y = event.clientY + document.body.scrollTop;
  var htm =  "<b>" + skl[6] + "</b><br>";

  if (skl[7])
    htm += "<span class=f12>" + skl[7] + "</span><br>";
  htm += "<table border cellspacing=0><tr><th>SLv</th><th>必要BLv</th>";
  for (i = 9; i < skl.length; i++)
    htm += "<th>" + skl[i][0] + "</th>";
  htm += "</tr>";
  for (i = 0; i < skl[2]; i++) {
    if (i == skl[5] - 1)
      htm += "<tr bgcolor=#d0d0ff>";
    else 
      htm += "<tr>";

 if (isNaN(skl[1])){
    htm += "<td align=center>" + (i + 1) + "</td><td align=center>" + skl[1][i] + "</td>"; //★
 }else{
    htm += "<td align=center>" + (i + 1) + "</td><td align=center>" + Math.floor(skl[0] + skl[1] * i) + "</td>"; //★
 }

    for (j = 9; j < skl.length; j++) {
      htm += "<td align=center>";
      for (k = 0; k < (skl[j].length - 1) / 3; k++) {
        htm += skl[j][k * 3 + 1];
        if (skl[j].length > k * 3 + 3) {
          if (!isNaN(skl[j][k * 3 + 2]))
            htm += Math.floor(skl[j][k * 3 + 2] + skl[j][k * 3 + 3] * i);
          else
            htm += skl[j][k * 3 + 2][i];
        }
      }
      htm += "</td>";
    }
    htm += "</tr>";
  }
  htm += "</table>";
 
  document.all("popup").innerHTML = htm;
  document.all("popup").style.pixelLeft = x + 20;
  document.all("popup").style.pixelTop = y + 0;
  document.all("popup").style.visibility = "visible";
}


function hidePopup() {
  document.all("popup").style.visibility = "hidden";
}

/**
 * スキルツリー描画。
 */
function drawTree() {
  for (i = 0; i < tree.length; i++) {
    document.write("<tr><td class=space></td>");
    for (j = 0; j < tree[i].length; j++) {
      if (i % 2 == 0) {  // 偶数行はスキル・アイコン
        //document.write("<td><script>drawIcon(" + tree[i][j] + ");</s" + "cript></td>");
        document.write("<td><script>drawIcon(" + tree[i][j] + ");</script></td>");
      }
      else {  // 奇数行はアイコンを繋ぐ矢印
        if (tree[i][j] != -1) {  // 矢印有り
          document.write("<td><img src=" + iconDir + "arrow" + tree[i][j] + ".png></td>");
        }
        else {  // 矢印無し
          document.write("<td></td>");
        }
      }
      //if (j > 0 && i % 2 == 1 && (tree[i][j] == 1 || tree[i][j] == 3)) {
      if (i % 2 == 1 && (tree[i][j] == 1 || tree[i][j] == 3 || tree[i][j] == 6 || tree[i][j] == 7)) {
        document.write("<td><img src=" + iconDir + "arrow2.png></td>");
      }
      else {
        document.write("<td class=space>&nbsp;</td>");
      }
      if (j % 4 == 3 && j < 11) {
        document.write("<td class=space>&nbsp;</td>");
      }
    }
    document.write("</tr>");
  }
}


function drawBaseLv() {
  document.write("<div id=popup class=popup></div>");
  document.write("Lv&nbsp;<select id=\"selBlv\" onchange=\"chgBlv();\" style=\"color:#c0c0c0;background-color:#000000;\">");
  for (i = is2nd()? 45: 1; i < 121; i++) {
    if (i == 45) {
      document.write("<option value=" + i + " selected>" + i);
    }
    else {
      document.write("<option value=" + i + ">" + i);
    }
  }
  document.write("</select>&nbsp;&nbsp;&nbsp;&nbsp;");
  document.write("<font color=\"#c0c0c0\">残りスキルポイント&nbsp;:&nbsp;<span id=skpoint>" + getSpt() + "</span>");
  document.write("<br><br>");
}


