function escapeHTML(str) {
  return str.replace(/&/g, "&amp;").replace(/"/g, "&quot;").replace(/</g, "&lt;").replace(/>/g, "&gt;");  // ")
}

function printQuestions() {
  for (var i = 0; i < questions.length; ++i) {
    var q = questions[i];
    var q_num = i + 1;
    document.write("<strong>Q. " + q_num + "&nbsp;&nbsp;" +
                   escapeHTML(q['question']) +
                   "</strong><br />");
    document.write("<ol>");
    for (var j = 0; j < q['candidates'].length; ++j) {
      var c = q['candidates'][j];
      var c_num = parseInt(j) + 1;
      document.write("<li><input name='q" + q_num +
                     "' type='radio' value='" + c_num + "' />" +
                     " " + escapeHTML(c) + "</li>");
    }
    document.write("</ol>");
    document.write("<div id='answer-q" + q_num + "'></div>");
  }
}

function printSubmitButton() {
  document.write("<hr />");
  document.write("<p style='text-align: center;'>");
  document.write("<input name='submit' type='submit' value='採点する' />");
  document.write("</p>");
}

function printResultArea() {
  document.write("<div id='quiz-result'></div>");
}

function startForm() {
  document.write("<form id='quiz-form' method='post' " +
                 "action='http://example.com/' " +
                 "onsubmit='showResult(); return false;'>");
}

function getUsersAnswer(q_num) {
  var form = document.getElementById("quiz-form");
  if (!form) {
    return 0;  // Should not happen.
  }
  var candidates = form.elements["q" + q_num];
  for (var j = 0; j < candidates.length; ++j) {
    var c = candidates[j];
    if (c.checked) {
      return parseInt(c.value);
    }
  }
  return 0;
}

function calculateScore() {
  var num_corrent_answers = 0;
  for (var i = 0; i < questions.length; ++i) {
    var q = questions[i];
    var q_num = parseInt(i) + 1;
    if (q['answer'] == getUsersAnswer(q_num)) {
      ++num_corrent_answers;
    }
  }
  return Math.floor(100.0 * num_corrent_answers / questions.length);
}

function validateAllAnswered() {
  var unanswered = [];
  for (var i = 0; i < questions.length; ++i) {
    var q_num = parseInt(i) + 1;
    if (getUsersAnswer(q_num) == 0) {
      unanswered.push(q_num);
    }
  }
  if (unanswered.length == 0) {
    return true;
  } else {
    alert("問題 " + unanswered.join(", ") + " が未回答です")
    return false;
  }
}

function showResult() {
  if (!validateAllAnswered()) {
    return;
  }
  var score = calculateScore();
  var result = "<h2>診断結果</h2>";
  result += "<p>あなたのバイナリアン度は" +
    "<strong style='color: red;'>" + score + "点</strong>です。<br />";
  diagnosises
  for (var i = 0; i < diagnosises.length; ++i) {
    if (score >= diagnosises[i][0]) {
      result += diagnosises[i][1];
      break;
    }
  }
  result += "</p>";

  result += "<p><a href='javascript:;' onclick='javascript:showAnswers();'>" +
    "解答を見る</a></p>";
  var element = document.getElementById("quiz-result");
  if (element) {
    element.innerHTML = result;
  }

  var form = document.getElementById("quiz-form");
  if (!form) {
    return;
  }
  form.elements["submit"].disabled = true;
}

function showAnswers() {
  for (var i = 0; i < questions.length; ++i) {
    var q = questions[i];
    var q_num = parseInt(i) + 1;
    var element = document.getElementById("answer-q" + q_num);
    if (!element) {
      continue;  // Should not happen.
    }
    var answer =
      "<div style='padding: 0.5em; margin: 0.5em;" +
      " background-color: #eee;" +
      "'>";
    if (q['answer'] == getUsersAnswer(q_num)) {
      answer += "<strong>正解です!</strong><br />";
    } else {
      answer += "<strong style='color: red;'>正解は" +
        q['answer'] + "です</strong><br />";
    }
    answer += "詳しくは Binary Hacks の"
    var references = q['references'];
    for (var j = 0; j < references.length; ++j) {
      answer += "「" + escapeHTML(references[j]) + "」";
    }
    answer += "を参照してください。";
    element.innerHTML = answer;
  }
  window.location.hash = "start";
}

function endForm() {
  document.write("</form>");
}

function createXMLHttpRequest() {
  if (this.XMLHttpRequest) {
    return new XMLHttpRequest();
  } else {
    return new ActiveXObject("Microsoft.XMLHTTP");
  }
}

function loadQuestions() {
  req = createXMLHttpRequest();
  req.open("GET", "questions.txt", false);
  req.send(null);
  eval(eval(req.responseText));
}

function printAll() {
  document.open();
  loadQuestions();
  startForm();
  printQuestions();
  printSubmitButton();
  printResultArea();
  endForm();
  document.close();
}

printAll();

