// -*- coding: utf-8; -*-

//browser detect
var br_check=0;
if(document.all) br_check=1 //MSIE4以上
    else if(document.layers) br_check=2 //Netscape4.x
        else if(document.getElementById) br_check=3 //Netscape 6

//IE4対策(IE4にはgetElementByIdがないので)
function myGetElementById(myid){
    if(br_check==1){ //IE4
      myelement = eval("document.all\(\"" + myid + "\"\)");
      return myelement;
    } else if(br_check==3){ //NN6
      myelement = eval("document.getElementById\(\"" + myid +"\"\)");
      return myelement;
    }
}


//emulationするかどうか
var isEmulation = true;

//randomに出題するかどうか
var isRandom = false;

var color_mark_key = "#00FFFF" //打つべきキーの背景色

//入力文字列を保持する
//typing2.jsでは、テキストエリアは入力のみに使う
//なぜなら、テキストエリアでの文字化け防止のため
var ansString;

var KeyCommentTable = new Array();

function insertOneAsCode(mycode) {
//  document.sample_form.sample_text.value += String.fromCharCode(mycode);
} //この関数は使わない

//外国語文字を、キー入力するASCII文字に変換する
function OtherToAsciiKey(mychar) {
  var i=0;
  for(i=0; i<AsciiToOtherTable.length; i++) {
    if(mychar == AsciiToOtherTable[i][1]) {
      return AsciiToOtherTable[i][0];
    }
  }
  return mychar;
}

//文字列全体にOtherToAsciiKeyを実行する
function OtherToAsciiKeyAll(mytext) {
  var i=0;
  var j=0;
  var return_text = "";
  //for(i=0; i<mytext.length; i++) {
    //return_text += OtherToAsciiKey(mytext.charAt(i));
  //}
  for(i=0;i<text_s_len;i++){
    for(j=0; j<AsciiToOtherTable.length; j++) {
      if(text_s[i] == AsciiToOtherTable[j][1]){
        return_text += AsciiToOtherTable[j][0];
        break;
      }
    }
  }
  return return_text;
}

//キー配列の図に表示したい外国語文字に変換
function AsciiKeyToOtherKeyTop(mychar) {
  var i=0;
  for(i=0; i<AsciiToOtherTable.length; i++) {
    if(mychar == AsciiToOtherTable[i][0]) {
      return AsciiToOtherTable[i][2];
    }
  }
  return "";
}

//キー入力した文字を外国語文字に変換(変換できなければ空文字列を返す)
function AsciiKeyToOtherOrNull(mychar) {
  var i=0;
  for(i=0; i<AsciiToOtherTable.length; i++) {
    if(mychar == AsciiToOtherTable[i][0]) {
      return AsciiToOtherTable[i][1];
    }
  }
  return ""; //変換できなければ空文字列を返す
}

//キー入力した文字を外国語文字に変換(変換できなければ元の文字をそのまま返す)
function AsciiKeyToOther(mychar) {
  var i=0;
  for(i=0; i<AsciiToOtherTable.length; i++) {
    if(mychar == AsciiToOtherTable[i][0]) {
      return AsciiToOtherTable[i][1];
    }
  }
  return mychar; //変換できなければ元の文字を返す
}

//キー配列の図を作成するのに使う
function makeSpanTag(key) {
  var my_text = "";
  var ks = "";
  my_text += key;
  my_text += " <span class='off' id='key";
  ks = AsciiKeyToOther(key);
  my_text += ks.charCodeAt(0);

  if(ks.length >= 2){
    my_text += ks.charCodeAt(1);
　}
  my_text += "'";
  my_text += " onClick='insertOneAsCode(\"";
  my_text += AsciiKeyToOther(key).charCodeAt(0);
  if(ks.length >= 2){
    my_text += ks.charCodeAt(1);
  }
  my_text += "\")'";
  my_text += ">"
  if(AsciiKeyToOtherKeyTop(key) == "") {
    my_text += key;
  } else {
    my_text += AsciiKeyToOtherKeyTop(key);
  }
  my_text += "</span>";
  return my_text;
}

//キー配列の図で円記号を表示するのに使う
function makeSpanTagYenSign() {
  if(AsciiKeyToOtherOrNull("YenSign") == "") {
    return makeSpanTag("\\");
  } else {
    var my_text = "";
    my_text += "￥";
    my_text += " <span class='off' id='key";
    my_text += AsciiKeyToOtherOrNull("YenSign").charCodeAt(0);
    my_text += "'";
    my_text += " onClick='insertOneAsCode(\"";
    my_text += AsciiKeyToOtherOrNull("YenSign").charCodeAt(0);;
    my_text += "\")'";
    my_text += ">"
    my_text += AsciiKeyToOtherKeyTop("YenSign");
    my_text += "</span>";
    return my_text;
  }
}

//キー配列の図でBackSlash記号を表示するのに使う
function makeSpanTagBackSlash() {
  if(AsciiKeyToOtherOrNull("BackSlash") == "") {
    return makeSpanTag("\\");
  } else {
    var my_text = "";
    my_text += "\\";
    my_text += " <span class='off' id='key";
    my_text += AsciiKeyToOtherOrNull("BackSlash").charCodeAt(0);
    my_text += "'";
    my_text += " onClick='insertOneAsCode(\"";
    my_text += AsciiKeyToOtherOrNull("BackSlash").charCodeAt(0);;
    my_text += "\")'";
    my_text += ">"
    my_text += AsciiKeyToOtherKeyTop("BackSlash");
    my_text += "</span>";
    return my_text;
  }
}

//JIS配列の図でShift+0の部分に使う
function makeSpanTagShiftZero (){
  var my_text = "";
  my_text += "&nbsp;&nbsp; <span class='off' id='key";
  my_text += AsciiKeyToOtherOrNull("Shift-0").charCodeAt(0);
  my_text += "'";
  my_text += " onClick='insertOneAsCode(\"";
  my_text += AsciiKeyToOtherOrNull("Shift-0").charCodeAt(0);
  my_text += "\")'";
  my_text += ">"
  my_text += AsciiKeyToOtherKeyTop("Shift-0");
  my_text += "</span>";
  return my_text;
}

//USキー配列の図を作成する
function makeUSKeyboard() {
  var mytext = "";
  mytext += "<table border=1>";
  mytext += "<tr><td> </td>";
  mytext += "<td colspan=4>左手</td>";
  mytext += "<td>左</td><td>右</td><td colspan=4>右手</td></tr>";
  mytext += "<tr>";
  mytext += ("<td>" + makeSpanTag("~") + "<br>" + makeSpanTag("`") + "</td>");
  mytext += ("<td>" + makeSpanTag("!") + "<br>" + makeSpanTag("1") + "</td>");
  mytext += ("<td>" + makeSpanTag("@") + "<br>" + makeSpanTag("2") + "</td>");
  mytext += ("<td>" + makeSpanTag("#") + "<br>" + makeSpanTag("3") + "</td>");
  mytext += ("<td>" + makeSpanTag("$") + "<br>" + makeSpanTag("4") + "</td>");
  mytext += ("<td>" + makeSpanTag("%") + "<br>" + makeSpanTag("5") + "</td>");
  mytext += ("<td>" + makeSpanTag("^") + "<br>" + makeSpanTag("6") + "</td>");
  mytext += ("<td>" + makeSpanTag("&") + "<br>" + makeSpanTag("7") + "</td>");
  mytext += ("<td>" + makeSpanTag("*") + "<br>" + makeSpanTag("8") + "</td>");
  mytext += ("<td>" + makeSpanTag("(") + "<br>" + makeSpanTag("9") + "</td>");
  mytext += ("<td>" + makeSpanTag(")") + "<br>" + makeSpanTag("0") + "</td>");
  mytext += ("<td>" + makeSpanTag("_") + "<br>" + makeSpanTag("-") + "</td>");
  mytext += ("<td>" + makeSpanTag("+") + "<br>" + makeSpanTag("=") + "</td>");
  mytext += "</tr>";
  mytext += "<tr>";
  mytext += "<td> </td>";
  mytext += ("<td>" + makeSpanTag("Q") + "<br>" + makeSpanTag("q") + "</td>");
  mytext += ("<td>" + makeSpanTag("W") + "<br>" + makeSpanTag("w") + "</td>");
  mytext += ("<td>" + makeSpanTag("E") + "<br>" + makeSpanTag("e") + "</td>");
  mytext += ("<td>" + makeSpanTag("R") + "<br>" + makeSpanTag("r") + "</td>");
  mytext += ("<td>" + makeSpanTag("T") + "<br>" + makeSpanTag("t") + "</td>");
  mytext += ("<td>" + makeSpanTag("Y") + "<br>" + makeSpanTag("y") + "</td>");
  mytext += ("<td>" + makeSpanTag("U") + "<br>" + makeSpanTag("u") + "</td>");
  mytext += ("<td>" + makeSpanTag("I") + "<br>" + makeSpanTag("i") + "</td>");
  mytext += ("<td>" + makeSpanTag("O") + "<br>" + makeSpanTag("o") + "</td>");
  mytext += ("<td>" + makeSpanTag("P") + "<br>" + makeSpanTag("p") + "</td>");
  mytext += ("<td>" + makeSpanTag("{") + "<br>" + makeSpanTag("[") + "</td>");
  mytext += ("<td>" + makeSpanTag("}") + "<br>" + makeSpanTag("]") + "</td>");
  mytext += "</tr>";
  mytext += "<tr>";
  mytext += "<td> </td>";
  mytext += ("<td>" + makeSpanTag("A") + "<br>" + makeSpanTag("a") + "</td>");
  mytext += ("<td>" + makeSpanTag("S") + "<br>" + makeSpanTag("s") + "</td>");
  mytext += ("<td>" + makeSpanTag("D") + "<br>" + makeSpanTag("d") + "</td>");
  mytext += ("<td>" + makeSpanTag("F") + "<br>" + makeSpanTag("f") + "</td>");
  mytext += ("<td>" + makeSpanTag("G") + "<br>" + makeSpanTag("g") + "</td>");
  mytext += ("<td>" + makeSpanTag("H") + "<br>" + makeSpanTag("h") + "</td>");
  mytext += ("<td>" + makeSpanTag("J") + "<br>" + makeSpanTag("j") + "</td>");
  mytext += ("<td>" + makeSpanTag("K") + "<br>" + makeSpanTag("k") + "</td>");
  mytext += ("<td>" + makeSpanTag("L") + "<br>" + makeSpanTag("l") + "</td>");
  mytext += ("<td>" + makeSpanTag(":") + "<br>" + makeSpanTag(";") + "</td>");
  mytext += ("<td>" + makeSpanTag("\"") + "<br>" + makeSpanTag("\'") + "</td>");
  mytext += ("<td>" + makeSpanTag("|") + "<br>" + makeSpanTag("\\") + "</td>");
  mytext += "</tr>";
  mytext += "<tr>";
  mytext += "<td> </td>";
  mytext += ("<td>" + makeSpanTag("Z") + "<br>" + makeSpanTag("z") + "</td>");
  mytext += ("<td>" + makeSpanTag("X") + "<br>" + makeSpanTag("x") + "</td>");
  mytext += ("<td>" + makeSpanTag("C") + "<br>" + makeSpanTag("c") + "</td>");
  mytext += ("<td>" + makeSpanTag("V") + "<br>" + makeSpanTag("v") + "</td>");
  mytext += ("<td>" + makeSpanTag("B") + "<br>" + makeSpanTag("b") + "</td>");
  mytext += ("<td>" + makeSpanTag("N") + "<br>" + makeSpanTag("n") + "</td>");
  mytext += ("<td>" + makeSpanTag("M") + "<br>" + makeSpanTag("m") + "</td>");
  mytext += ("<td>" + makeSpanTag("<") + "<br>" + makeSpanTag(",") + "</td>");
  mytext += ("<td>" + makeSpanTag(">") + "<br>" + makeSpanTag(".") + "</td>");
  mytext += ("<td>" + makeSpanTag("?") + "<br>" + makeSpanTag("/") + "</td>");
  mytext += "</tr>";
  mytext += "<tr>";
  mytext += "<td> </td>";
  mytext += "<td colspan=10 class='off' id='key32' onClick='insertOneAsCode(32)'> SPACE BAR ";
  mytext += AsciiKeyToOtherKeyTop(" ");
  mytext += "</td>";
  mytext += "</tr>";
  mytext += "</table>";
  return mytext;
}


//USキー配列の図を実際に描画する
function insertUSKeyboard() {
  myGetElementById("keyboard_image").innerHTML = makeUSKeyboard();
}

//JISキー配列の図を作成する
function makeJISKeyboard() {
  var mytext = "";
  mytext += "<table border=1>";
  mytext += "<tr><td colspan=4>左手</td>";
  mytext += "<td>左</td><td>右</td><td colspan=4>右手</td></tr>";
  mytext += "<tr>";
  mytext += ("<td>" + makeSpanTag("!") + "<br>" + makeSpanTag("1") + "</td>");
  mytext += ("<td>" + makeSpanTag("\"") + "<br>" + makeSpanTag("2") + "</td>");
  mytext += ("<td>" + makeSpanTag("#") + "<br>" + makeSpanTag("3") + "</td>");
  mytext += ("<td>" + makeSpanTag("$") + "<br>" + makeSpanTag("4") + "</td>");
  mytext += ("<td>" + makeSpanTag("%") + "<br>" + makeSpanTag("5") + "</td>");
  mytext += ("<td>" + makeSpanTag("&") + "<br>" + "<br>" + makeSpanTag("6") + "</td>");
  mytext += ("<td>" + makeSpanTag("\'") + "<br>" + makeSpanTag("7") + "</td>");
  mytext += ("<td>" + makeSpanTag("(") + "<br>" + makeSpanTag("8") + "</td>");
  mytext += ("<td>" + makeSpanTag(")") + "<br>" + makeSpanTag("9") + "</td>");
  mytext += ("<td>" + makeSpanTagShiftZero() + "<br>" + makeSpanTag("0") + "</td>");
  mytext += ("<td>" + makeSpanTag("=") + "<br>" + makeSpanTag("-") + "</td>");
  mytext += ("<td>" + makeSpanTag("~") + "<br>" + makeSpanTag("^") + "</td>");
  mytext += ("<td>" + makeSpanTag("|") + "<br>" + makeSpanTagYenSign() + "</td>");
  mytext += "</tr>";
  mytext += "<tr>";
  mytext += ("<td>" + "<br>" + makeSpanTag("Q") + "<br>" + makeSpanTag("q") + "</td>");
  mytext += ("<td>" + makeSpanTag("W") + "<br>" + makeSpanTag("w") + "</td>");
  mytext += ("<td>" + "<br>" + makeSpanTag("E") + "<br>" + makeSpanTag("e") + "</td>");
  mytext += ("<td>" + makeSpanTag("R") + "<br>" + makeSpanTag("r") + "</td>");
  mytext += ("<td>" + makeSpanTag("T") + "<br>" + makeSpanTag("t") + "</td>");
  mytext += ("<td>" + "<br>" + makeSpanTag("Y") + "<br>" + makeSpanTag("y") + "</td>");
  mytext += ("<td>" + "<br>" + makeSpanTag("U") + "<br>" + makeSpanTag("u") + "</td>");
  mytext += ("<td>" + makeSpanTag("I") + "<br>" + makeSpanTag("i") + "</td>");
  mytext += ("<td>" + makeSpanTag("O") + "<br>" + makeSpanTag("o") + "</td>");
  mytext += ("<td>" + makeSpanTag("P") + "<br>" + "<br>" + makeSpanTag("p") + "</td>");
  mytext += ("<td>" + makeSpanTag("`") + "<br>" + makeSpanTag("@") + "</td>");
  mytext += ("<td>" + makeSpanTag("{") + "<br>" + makeSpanTag("[") + "</td>");
  mytext += "</tr>";
  mytext += "<tr>";
  mytext += ("<td>" + "<br>" + makeSpanTag("A") + "<br>" + makeSpanTag("a") + "</td>");
  mytext += ("<td>" + makeSpanTag("S") + "<br>" + makeSpanTag("s") + "</td>");
  mytext += ("<td>" + makeSpanTag("D") + "<br>" + makeSpanTag("d") + "</td>");
  mytext += ("<td>" + makeSpanTag("F") + "<br>" + makeSpanTag("f") + "</td>");
  mytext += ("<td>" + makeSpanTag("G") + "<br>" + makeSpanTag("g") + "</td>");
  mytext += ("<td>" + makeSpanTag("H") + "<br>" + makeSpanTag("h") + "</td>");
  mytext += ("<td>" + makeSpanTag("J") + "<br>" + makeSpanTag("j") + "</td>");
  mytext += ("<td>" + makeSpanTag("K") + "<br>" + makeSpanTag("k") + "</td>");
  mytext += ("<td>" + makeSpanTag("L") + "<br>" + makeSpanTag("l") + "</td>");
  mytext += ("<td>" + "<br>" + makeSpanTag("+") + "<br>" + makeSpanTag(";") + "</td>");
  mytext += ("<td>" + makeSpanTag("*") + "<br>" + makeSpanTag(":") + "</td>");
  mytext += ("<td>" + makeSpanTag("}") + "<br>" + makeSpanTag("]") + "</td>");
  mytext += "</tr>";
  mytext += "<tr>";
  mytext += ("<td>" + makeSpanTag("Z") + "<br>" + makeSpanTag("z") + "</td>");
  mytext += ("<td>" + makeSpanTag("X") + "<br>" + makeSpanTag("x") + "</td>");
  mytext += ("<td>" + makeSpanTag("C") + "<br>" + makeSpanTag("c") + "</td>");
  mytext += ("<td>" + makeSpanTag("V") + "<br>" + makeSpanTag("v") + "</td>");
  mytext += ("<td>" + "<br>" + makeSpanTag("B") + "<br>" + makeSpanTag("b") + "</td>");
  mytext += ("<td>" + "<br>" + makeSpanTag("N") + "<br>" + makeSpanTag("n") + "</td>");
  mytext += ("<td>" + makeSpanTag("M") + "<br>" + makeSpanTag("m") + "</td>");
  mytext += ("<td>" + makeSpanTag("<") + "<br>" + makeSpanTag(",") + "</td>");
  mytext += ("<td>" + makeSpanTag(">") + "<br>" + makeSpanTag(".") + "</td>");
  mytext += ("<td>" + makeSpanTag("?") + "<br>" + makeSpanTag("/") + "</td>");
  mytext += ("<td>" + makeSpanTag("_") + "<br>" + makeSpanTagBackSlash() + "</td>");
  mytext += "</tr>";
  mytext += "<tr>";
  mytext += "<td colspan=10 class='off' id='key32' onClick='insertOneAsCode(32)'> SPACE BAR ";
  mytext += AsciiKeyToOtherKeyTop(" ");
  mytext += "</td>";
  mytext += "</tr>";
  mytext += "</table>";
  return mytext;
}

//JISキー配列の図を実際に描画する
function insertJISKeyboard() {
  myGetElementById("keyboard_image").innerHTML = makeJISKeyboard();
}


//JISキー配列(2)の図を作成する
function makeJISKeyboard2() {
  var mytext = "";
  mytext += "<table border='1'>";
  mytext += "<tr>";
  mytext += "<td colspan='2'>" + makeSpanTag("!") + "<br>" + makeSpanTag("1") + "</td>";
  mytext += ("<td colspan='2'>" + makeSpanTag("\"") + "<br>" + makeSpanTag("2") + "</td>");
  mytext += ("<td colspan='2'>" + makeSpanTag("#") + "<br>" + makeSpanTag("3") + "</td>");
  mytext += ("<td colspan='2'>" + makeSpanTag("$") + "<br>" + makeSpanTag("4") + "</td>");
  mytext += ("<td colspan='2'>" + makeSpanTag("%") + "<br>" + makeSpanTag("5") + "</td>");
  mytext += ("<td colspan='2'>" + makeSpanTag("&") + "<br>" + makeSpanTag("6") + "</td>");
  mytext += ("<td colspan='2'>" + makeSpanTag("\'") + "<br>" + makeSpanTag("7") + "</td>");
  mytext += ("<td colspan='2'>" + makeSpanTag("(") + "<br>" + makeSpanTag("8") + "</td>");
  mytext += ("<td colspan='2'>" + makeSpanTag(")") + "<br>" + makeSpanTag("9") + "</td>");
  mytext += ("<td colspan='2'>" + makeSpanTagShiftZero() + "<br>" + makeSpanTag("0") + "</td>");
  mytext += ("<td colspan='2'>" + makeSpanTag("=") + "<br>" + makeSpanTag("-") + "</td>");
  mytext += ("<td colspan='2'>" + makeSpanTag("~") + "<br>" + makeSpanTag("^") + "</td>");
  mytext += ("<td colspan='2'>" + makeSpanTag("|") + "<br>" + makeSpanTagYenSign() + "</td>");
  mytext += "</tr>";
  mytext += "<tr>";
  mytext += "<td></td>";
  mytext += ("<td colspan='2'>" + makeSpanTag("Q") + "<br>" + makeSpanTag("q") + "</td>");
  mytext += ("<td colspan='2'>" + makeSpanTag("W") + "<br>" + makeSpanTag("w") + "</td>");
  mytext += ("<td colspan='2'>" + makeSpanTag("E") + "<br>" + makeSpanTag("e") + "</td>");
  mytext += ("<td colspan='2'>" + makeSpanTag("R") + "<br>" + makeSpanTag("r") + "</td>");
  mytext += ("<td colspan='2'>" + makeSpanTag("T") + "<br>" + makeSpanTag("t") + "</td>");
  mytext += ("<td colspan='2'>" + makeSpanTag("Y") + "<br>" + makeSpanTag("y") + "</td>");
  mytext += ("<td colspan='2'>" + makeSpanTag("U") + "<br>" + makeSpanTag("u") + "</td>");
  mytext += ("<td colspan='2'>" + makeSpanTag("I") + "<br>" + makeSpanTag("i") + "</td>");
  mytext += ("<td colspan='2'>" + makeSpanTag("O") + "<br>" + makeSpanTag("o") + "</td>");
  mytext += ("<td colspan='2'>" + makeSpanTag("P") + "<br>" + makeSpanTag("p") + "</td>");
  mytext += ("<td colspan='2'>" + makeSpanTag("`") + "<br>" + makeSpanTag("@") + "</td>");
  mytext += ("<td colspan='2'>" + makeSpanTag("{") + "<br>" + makeSpanTag("[") + "</td>");
  mytext += "<td></td>";
  mytext += "</tr>";
  mytext += "<tr>";
  mytext += "<td></td>";
  mytext += ("<td colspan='2'>" + makeSpanTag("A") + "<br>" + makeSpanTag("a") + "</td>");
  mytext += ("<td colspan='2'>" + makeSpanTag("S") + "<br>" + makeSpanTag("s") + "</td>");
  mytext += ("<td colspan='2'>" + makeSpanTag("D") + "<br>" + makeSpanTag("d") + "</td>");
  mytext += ("<td colspan='2'>" + makeSpanTag("F") + "<br>" + makeSpanTag("f") + "</td>");
  mytext += ("<td colspan='2'>" + makeSpanTag("G") + "<br>" + makeSpanTag("g") + "</td>");
  mytext += ("<td colspan='2'>" + makeSpanTag("H") + "<br>" + makeSpanTag("h") + "</td>");
  mytext += ("<td colspan='2'>" + makeSpanTag("J") + "<br>" + makeSpanTag("j") + "</td>");
  mytext += ("<td colspan='2'>" + makeSpanTag("K") + "<br>" + makeSpanTag("k") + "</td>");
  mytext += ("<td colspan='2'>" + makeSpanTag("L") + "<br>" + makeSpanTag("l") + "</td>");
  mytext += ("<td colspan='2'>" + makeSpanTag("+") + "<br>" + makeSpanTag(";") + "</td>");
  mytext += ("<td colspan='2'>" + makeSpanTag("*") + "<br>" + makeSpanTag(":") + "</td>");
  mytext += ("<td colspan='2'>" + makeSpanTag("}") + "<br>" + makeSpanTag("]") + "</td>");
  mytext += "<td></td>";
  mytext += "</tr>";
  mytext += "<tr>";
  mytext += "<td colspan='2'></td>";
  mytext += ("<td colspan='2'>" + makeSpanTag("Z") + "<br>" + makeSpanTag("z") + "</td>");
  mytext += ("<td colspan='2'>" + makeSpanTag("X") + "<br>" + makeSpanTag("x") + "</td>");
  mytext += ("<td colspan='2'>" + makeSpanTag("C") + "<br>" + makeSpanTag("c") + "</td>");
  mytext += ("<td colspan='2'>" + makeSpanTag("V") + "<br>" + makeSpanTag("v") + "</td>");
  mytext += ("<td colspan='2'>" + makeSpanTag("B") + "<br>" + makeSpanTag("b") + "</td>");
  mytext += ("<td colspan='2'>" + makeSpanTag("N") + "<br>" + makeSpanTag("n") + "</td>");
  mytext += ("<td colspan='2'>" + makeSpanTag("M") + "<br>" + makeSpanTag("m") + "</td>");
  mytext += ("<td colspan='2'>" + makeSpanTag("<") + "<br>" + makeSpanTag(",") + "</td>");
  mytext += ("<td colspan='2'>" + makeSpanTag(">") + "<br>" + makeSpanTag(".") + "</td>");
  mytext += ("<td colspan='2'>" + makeSpanTag("?") + "<br>" + makeSpanTag("/") + "</td>");
  mytext += ("<td colspan='2'>" + makeSpanTag("_") + "<br>" + makeSpanTagBackSlash() + "</td>");
  mytext += "</tr>";
  mytext += "<tr>";
  mytext += "<td colspan='2'></td>";
  mytext += "<td colspan=20 class='off' id='key32' onClick='insertOneAsCode(32)'> SPACE BAR ";
  mytext += AsciiKeyToOtherKeyTop(" ");
  mytext += "</td>";
  mytext += "<td colspan='3'></td>";
  mytext += "</tr>";
  mytext += "</table>";
  return mytext;
}

//JISキー配列(2)の図を実際に描画する
function insertJISKeyboard2() {
  myGetElementById("keyboard_image").innerHTML = makeJISKeyboard2();
}

//USキー配列(2)の図を作成する
function makeUSKeyboard2() {
  var mytext = "";
  mytext += "<table border='1'>";
  mytext += "<tr>";
  mytext += ("<td>" + makeSpanTag("~") + "<br>" + makeSpanTag("`") + "</td>");
  mytext += "<td colspan='2'>" + makeSpanTag("!") + "<br>" + makeSpanTag("1") + "</td>";
  mytext += ("<td colspan='2'>" + makeSpanTag("@") + "<br>" + makeSpanTag("2") + "</td>");
  mytext += ("<td colspan='2'>" + makeSpanTag("#") + "<br>" + makeSpanTag("3") + "</td>");
  mytext += ("<td colspan='2'>" + makeSpanTag("$") + "<br>" + makeSpanTag("4") + "</td>");
  mytext += ("<td colspan='2'>" + makeSpanTag("%") + "<br>" + makeSpanTag("5") + "</td>");
  mytext += ("<td colspan='2'>" + makeSpanTag("^") + "<br>" + makeSpanTag("6") + "</td>");
  mytext += ("<td colspan='2'>" + makeSpanTag("&") + "<br>" + makeSpanTag("7") + "</td>");
  mytext += ("<td colspan='2'>" + makeSpanTag("*") + "<br>" + makeSpanTag("8") + "</td>");
  mytext += ("<td colspan='2'>" + makeSpanTag("(") + "<br>" + makeSpanTag("9") + "</td>");
  mytext += ("<td colspan='2'>" + makeSpanTag(")") + "<br>" + makeSpanTag("0") + "</td>");
  mytext += ("<td colspan='2'>" + makeSpanTag("_") + "<br>" + makeSpanTag("-") + "</td>");
  mytext += ("<td colspan='2'>" + makeSpanTag("+") + "<br>" + makeSpanTag("=") + "</td>");
  mytext += "</tr>";
  mytext += "<tr>";
  mytext += "<td colspan='2'></td>";
  mytext += ("<td colspan='2'>" + makeSpanTag("Q") + "<br>" + makeSpanTag("q") + "</td>");
  mytext += ("<td colspan='2'>" + makeSpanTag("W") + "<br>" + makeSpanTag("w") + "</td>");
  mytext += ("<td colspan='2'>" + makeSpanTag("E") + "<br>" + makeSpanTag("e") + "</td>");
  mytext += ("<td colspan='2'>" + makeSpanTag("R") + "<br>" + makeSpanTag("r") + "</td>");
  mytext += ("<td colspan='2'>" + makeSpanTag("T") + "<br>" + makeSpanTag("t") + "</td>");
  mytext += ("<td colspan='2'>" + makeSpanTag("Y") + "<br>" + makeSpanTag("y") + "</td>");
  mytext += ("<td colspan='2'>" + makeSpanTag("U") + "<br>" + makeSpanTag("u") + "</td>");
  mytext += ("<td colspan='2'>" + makeSpanTag("I") + "<br>" + makeSpanTag("i") + "</td>");
  mytext += ("<td colspan='2'>" + makeSpanTag("O") + "<br>" + makeSpanTag("o") + "</td>");
  mytext += ("<td colspan='2'>" + makeSpanTag("P") + "<br>" + makeSpanTag("p") + "</td>");
  mytext += ("<td colspan='2'>" + makeSpanTag("{") + "<br>" + makeSpanTag("[") + "</td>");
  mytext += ("<td colspan='2'>" + makeSpanTag("}") + "<br>" + makeSpanTag("]") + "</td>");
  mytext += "<td></td>";
  mytext += "</tr>";
  mytext += "<tr>";
  mytext += "<td colspan='2'></td>";
  mytext += ("<td colspan='2'>" + makeSpanTag("A") + "<br>" + makeSpanTag("a") + "</td>");
  mytext += ("<td colspan='2'>" + makeSpanTag("S") + "<br>" + makeSpanTag("s") + "</td>");
  mytext += ("<td colspan='2'>" + makeSpanTag("D") + "<br>" + makeSpanTag("d") + "</td>");
  mytext += ("<td colspan='2'>" + makeSpanTag("F") + "<br>" + makeSpanTag("f") + "</td>");
  mytext += ("<td colspan='2'>" + makeSpanTag("G") + "<br>" + makeSpanTag("g") + "</td>");
  mytext += ("<td colspan='2'>" + makeSpanTag("H") + "<br>" + makeSpanTag("h") + "</td>");
  mytext += ("<td colspan='2'>" + makeSpanTag("J") + "<br>" + makeSpanTag("j") + "</td>");
  mytext += ("<td colspan='2'>" + makeSpanTag("K") + "<br>" + makeSpanTag("k") + "</td>");
  mytext += ("<td colspan='2'>" + makeSpanTag("L") + "<br>" + makeSpanTag("l") + "</td>");
  mytext += ("<td colspan='2'>" + makeSpanTag(":") + "<br>" + makeSpanTag(";") + "</td>");
  mytext += ("<td colspan='2'>" + makeSpanTag("\"") + "<br>" + makeSpanTag("\'") + "</td>");
  mytext += ("<td colspan='2'>" + makeSpanTag("|") + "<br>" + makeSpanTag("\\") + "</td>");
  mytext += "<td></td>";
  mytext += "</tr>";
  mytext += "<tr>";
  mytext += "<td colspan='3'></td>";
  mytext += ("<td colspan='2'>" + makeSpanTag("Z") + "<br>" + makeSpanTag("z") + "</td>");
  mytext += ("<td colspan='2'>" + makeSpanTag("X") + "<br>" + makeSpanTag("x") + "</td>");
  mytext += ("<td colspan='2'>" + makeSpanTag("C") + "<br>" + makeSpanTag("c") + "</td>");
  mytext += ("<td colspan='2'>" + makeSpanTag("V") + "<br>" + makeSpanTag("v") + "</td>");
  mytext += ("<td colspan='2'>" + makeSpanTag("B") + "<br>" + makeSpanTag("b") + "</td>");
  mytext += ("<td colspan='2'>" + makeSpanTag("N") + "<br>" + makeSpanTag("n") + "</td>");
  mytext += ("<td colspan='2'>" + makeSpanTag("M") + "<br>" + makeSpanTag("m") + "</td>");
  mytext += ("<td colspan='2'>" + makeSpanTag("<") + "<br>" + makeSpanTag(",") + "</td>");
  mytext += ("<td colspan='2'>" + makeSpanTag(">") + "<br>" + makeSpanTag(".") + "</td>");
  mytext += ("<td colspan='2'>" + makeSpanTag("?") + "<br>" + makeSpanTag("/") + "</td>");
  mytext += "</tr>";
  mytext += "<tr>";
  mytext += "<td colspan='3'></td>";
  mytext += "<td colspan=20 class='off' id='key32' onClick='insertOneAsCode(32)'> SPACE BAR ";
  mytext += AsciiKeyToOtherKeyTop(" ");
  mytext += "</td>";
  mytext += "<td colspan='3'></td>";
  mytext += "</tr>";
  mytext += "</table>";
  return mytext;
}

//USキー配列(2)の図を実際に描画する
function insertUSKeyboard2() {
  myGetElementById("keyboard_image").innerHTML = makeUSKeyboard2();
}

// ここから、実際のtypingソフトの動作の定義になる

var sample_i=0; //sample_text文字列の何文字目か
var sample_text="";
var text_s = new Array(500);
var text_s_len = 0;
var last_key_id=""; //色を変更したid(つまり，前回のid)
var current_sample_key=""; //次に打つべきkey(sample_textのi番目)
var sample_text_array; //問題文の配列
var sample_element_i; //何番目の問題文か
var start_go=0;

//typing練習開始時に、何番目の問題を表示するのかを決定する。
function initSampleTextIndex () {
  if(isRandom) {
    return Math.floor(Math.random() * sample_text_array.length);
  } else {
    return 0;
  }
}

//次の問題表示時に、何番目の問題を表示するのかを決定する。
function nextSampleTextIndex () {
  if(isRandom) {
    return Math.floor(Math.random() * sample_text_array.length);
  } else {
    return ((sample_element_i + 1) % sample_text_array.length);
  }
}

//typing練習のスタート
function start_main() {
  document.onkeypress = kpress;
  document.sample_form.key_input.text = "";
//document.sample_form.testinput.value = "sssgbb";

//emulation機能を使うかどうか
  if(document.sample_form.emulationoff && document.sample_form.emulationoff.checked) {
    isEmulation = false;
  }
  if(document.sample_form.emulationoff && !document.sample_form.emulationoff.checked) {
    isEmulation = true;
  }

//random出題をするかどうか
  if(document.sample_form.randomon && document.sample_form.randomon.checked) {
    isRandom = true;
  }
  if(document.sample_form.randomon && !document.sample_form.randomon.checked) {
    isRandom = false;
  }

//自分で問題文を設定するかどうか
//  if(document.sample_form.origtext && document.sample_form.origtext.checked) {
//    sample_text_array = new Array(new Array(
//            document.sample_form.sample_text.value,
//            document.sample_form.sample_memo.value));
//  } else {
    sample_text_array = sample_text_array_0;
//  }//この機能は使わない

  sample_element_i = initSampleTextIndex(); //最初の問題文
  init_sample_text(sample_element_i);
  sample_key_set_and_display();
  document.sample_form.key_input.focus(); //入力窓にfocusをあてる
  start_go = 1;
}

//単語のスキップ
function tango_skip() {
  if(start_go == 0){
    start_main();
  }
  sample_i = sample_text.length;
  sample_key_set_and_display();
}
//単語のバック
function tango_modosu() {
  if(start_go == 0){
    start_main();
  }
  else{
     sample_element_i -=2;
     if(sample_element_i < -1){
       sample_element_i = 0;
     }
    sample_i = sample_text.length;
    sample_key_set_and_display();
  }
}

function text_bunkai(s)
{
  var i = 0;
  var n = 0;
  var c = "";
  var c2 = "";
  for(i=0;i<s.length;i++){
    c = s.charAt(i);
    if(i < s.length - 1){
      c2 = s.charAt(i+1);
      if(c == "ິ" && c2 == "້"){//'Y'sara i + mai too
        text_s[n++] = c + c2;
        ++i;
      }
      else
      if(c == "ີ" && c2 == "້"){//'U'sara ii + mai too
        text_s[n++] = c + c2;
        ++i;
      }
      else
      if(c == "ົ" && c2 == "້"){//'Q'
        text_s[n++] = c + c2;
        ++i;
      }
      else
      if(c == "້" && c2 == "ຳ"){//'E'mai too + sara am
        text_s[n++] = c + c2;
        ++i;
      }
      else
      if(c == "ັ" && c2 == "້"){//'A'
        text_s[n++] = c + c2;
        ++i;
      }
      else
      if(c == "ໍ" && c2 == "່"){//'+'
        text_s[n++] = c + c2;
        ++i;
      }
      else
      if(c == "ຶ" && c2 == "້"){//'B'
        text_s[n++] = c + c2;
        ++i;
      }
      else
      if(c == "ື" && c2 == "້"){//'N'
        text_s[n++] = c + c2;
        ++i;
      }
      else{
        text_s[n++] = c;
      }
    }
    else{
      text_s[n++] = c;
    }
  }
  text_s_len = n;
}

//問題文表示処理など
function init_sample_text(my_element_i) {
  sample_text = sample_text_array[my_element_i][0];
  text_bunkai(sample_text);
  myGetElementById("sample_text").innerHTML = sample_text;
  myGetElementById("sample_memo").innerHTML = sample_memoModify(sample_text_array[my_element_i][1]);
  //if(isEmulation) {
    sample_text = toAsciiKeyAll(sample_text); //問題文をascii key列に変換
  //} else {
    //sample_text = decomposeAllChar(sample_text); //問題文内の文字を分解する
  //}


  ansString="";
  myGetElementById("ans_output").innerHTML = "";
  sample_i=0;

  if(last_key_id!="") { //キー配列図で、前回のキーの色を元に戻す
    myGetElementById(last_key_id).style.backgroundColor = "white";
  } else {
    last_key_id="";
  }
}

//次の問題文を設定して、表示する
function sample_key_set_and_display() {
  if(sample_i>=sample_text.length) {
//    alert("おめでとう．無事タイプできました．");
    sample_element_i = nextSampleTextIndex();
    init_sample_text(sample_element_i);
    document.sample_form.key_input.focus(); //入力窓にfocusをあてる
  }
  current_sample_key=sample_text.charAt(sample_i);
  display_key(current_sample_key);
  sample_i++; //次の番号にしている
}

//キー配列の図でtypeすべきキートップの色を変える
function display_key(mykey) {
  if(last_key_id!="") {
    myGetElementById(last_key_id).style.backgroundColor = "white";
  }

  if(isEmulation) {
    var ks = "";
    ks = AsciiKeyToOther(mykey);
    last_key_id = "key" + ks.charCodeAt(0);
    if(ks.length >= 2){
      last_key_id += ks.charCodeAt(1); 
    }
    //last_key_id = mykey + " " + AsciiKeyToOther(mykey);
  } else {
    last_key_id = "key" + mykey.charCodeAt(0);
  }
//document.sample_form.testinput.value = last_key_id;
  myGetElementById(last_key_id).style.backgroundColor = color_mark_key;
}


//キー入力(type)された時の処理
function kpress(ev) {
  if(br_check == 1) { //IEやOpera
    mykeynum = event.keyCode;
  } else if(br_check == 3) { //NN6
    mykeynum = ev.which;
  }
  if(mykeynum == 57389) return; //Opera7でShiftキーのみの値...無視する。
  mykey = String.fromCharCode(mykeynum);
  document.sample_form.key_input.value = "";
  if(!isEmulation) {
    //入力文内の文字を分解する
    mykey = decomposeAllChar(mykey);
  }
  mytext = ansString;
  if(mykey==current_sample_key) {
    myGetElementById("ans_misstype").innerHTML = "";
    if(isEmulation) {
      ansString = strAddKey(mytext, AsciiKeyToOther(mykey));
      myGetElementById("ans_output").innerHTML = ans_outputModify(ansString);
    } else {
      ansString = strAddKey(mytext, mykey);
      myGetElementById("ans_output").innerHTML = ans_outputModify(ansString);
    }
    sample_key_set_and_display();
  } else {
//    alert("残念，やりなおし!!");
    myGetElementById("ans_misstype").innerHTML = "タイプミス ^^;;";
    document.sample_form.key_input.focus(); //入力窓にfocusをあてる
  }
}

//デッドキー対策
function deadkey_decompose(current_text, from_to_data) {
  var i,j;
  var in_string, out_string;
  var tmp_string;
  var after_text = "";
  for(i=0; i < current_text.length; i++) {
    tmp_string = current_text.charAt(i);
    for(j=0; j < from_to_data.length; j=j+2) {
      in_string = from_to_data[j];
      out_string = from_to_data[j+1];
      if(current_text.charAt(i) == in_string) {
        tmp_string = out_string;
      }
    }
  after_text += tmp_string;
  }
  return after_text;
}

function deadkey_compose(current_text, from_to_data) {
  var j;
  var in_string, out_string;
  var tmp_string;
  var after_text = current_text;
  for(j=0; j < from_to_data.length; j=j+2) {
    in_string = from_to_data[j+1]; //reverse
    out_string = from_to_data[j]; //reverse
    if(current_text.length < in_string.length) continue;
    if(current_text.substring(current_text.length - in_string.length, current_text.length) == in_string) {
      after_text = current_text.substring(0, current_text.length - in_string.length);
      after_text += out_string;
    }
  }
  return after_text;
}

//個々のJavaScript内で必要に応じてオーバーライドする関数など
isEmulation = false;
AsciiToOtherTable = new Array();

function decomposeAllChar(mytext) {
  return mytext;
}

function toAsciiKeyAll(mytext) {
  return OtherToAsciiKeyAll(mytext);
}

function strAddKey(mystr, mykey) {
  return mystr+mykey;
}

function ans_outputModify(mystr) {
  return mystr;
}

function sample_memoModify(mystr) {
  return mystr;
}

