function loadSpreadsheet() {
  var QUESTIONS_KEY = "o06224816262962358512.2715576756611077364"
  var script = document.createElement("script")
  script.src =
      "http://spreadsheets.google.com/feeds/cells/" +
      QUESTIONS_KEY +
      "/default/public/basic?alt=json-in-script&callback=loadQuestions"
  document.body.appendChild(script)
}

var bigCategoryNames = ["ProCon.org's Questions",]

var bigCategories = {
  "ProCon.org's Questions": ["Abortion", "Health Care", "Marriage", "Medical Marijuana", "Stem Cells", "China", "Cuba", "Darfur", "Defense", "Immigration","Iran", "Iraq", "Israel", "Israeli- Palestinian Conflict", "Kosovo", "Turkey","Criminal Justice", "Death Penalty", "War on Terror", "Character", "Election Reform", "District of Columbia", "Gun Control", "Media", "National ID", "Religion", "Science", "Social Security", "Eminent Domain", "Education", "Environment", "National Service", "Presidential Power", "US Constitution", "Economy", "Energy", "Taxes"]
}
function findBigCategory(smallCategory) {
  for (var big in bigCategories) {
    if (bigCategories[big].indexOf(smallCategory) != -1) {
      return big;
    }
  }
  return smallCategory;
}

var candidates
var questions
var questionsByCategory
var currentPage = 0

function nextPage(amount) {
  var newPage = currentPage + amount
  if (newPage < 0 || newPage >= bigCategoryNames.length) {
    return;
  }
  
  saveCurrentPageAnswers()
  
  currentPage = newPage
  populateQuestionTable()
  updateCheckboxes()
  updateMatches()
}

function saveCurrentPageAnswers() {
  for (var i = 0; i < questions.length; i++) {
    if (getAnswerButtons(i)) {
      questions[i].userAnswer = getUserAnswer(i)
    }
  }
}

function loadQuestions(json) {
  questions = []
  candidates = []

  var entries = json.feed.entry
  for (var i = 0; i < entries.length; i++) {
    var entry = entries[i]
    var value = entry.content.$t

    var rowcol = entry.id.$t.match(/R([0-9]+)C([0-9]+)$/)
    if (rowcol) {
      var row = parseInt(rowcol[1]) - 2
      var col = parseInt(rowcol[2])
      if (row == -1) {
        if (col >= 4) {
          var j = col - 4
          candidates[j] = new Object()
          candidates[j].checked = false
          candidates[j].name = value
        }
        // candidates
      } else {
        if (!questions[row]) {
          questions[row] = new Object()
          questions[row].answers = []
          questions[row].userAnswer = null
          questions[row].index = row
        }
        if (col == 2) {
          questions[row].topic = value
          
        } else if (col == 3) {
          questions[row].question = value
          
        } else if (col >= 4) {
          var lvalue = value.toLowerCase()
          var answer
          if (lvalue == "pro") answer = "yes"
          else if (lvalue == "con") answer = "no"
          else answer = null
          questions[row].answers[col - 4] = answer
        }
      }
    }
  }
  
  questionsByCategory = {}
  for (var i = 0; i < questions.length; i++) {
    var category = findBigCategory(questions[i].topic)
    if (!questionsByCategory[category]) {
      questionsByCategory[category] = []
    }
    questionsByCategory[category].push(questions[i])
  }

  populateQuestionTable()
  updateMatches()
}

function radioButton(i, text, checked) {
  var id = text.toLowerCase().replace("/", "")
  return "<td><input type=radio" +
         " id=" + i + "-" + id +
         " name=q" + i +
         " value=" + id +
         (checked ? " checked" : "") +
         " onclick=updateMatches() onchange=updateMatches()>&nbsp;" + 
         answerLabel(i, text) +
         "<span class=candidate-answers " +
         "id=below-q" + i + "-" + id + "></span></td>"
}

function answerLabel(i, text) {
  var id = text.toLowerCase().replace("/", "")
//  if (text == "Yes") text = "Pro"
//  if (text == "No") text = "Con"
  return "<label for=" + i + "-" + id + " " +
         " onclick=updateMatches()" +
         ">" +
         text + "</label>"
}


function populateQuestionTable() {
  $("questions-table-wrapper").innerHTML = "<table id=questions></table>"
  var table = $("questions")
  var tbody = table.childNodes[0]
  if (tbody) {
    table = tbody
  }
  var currentTopic = bigCategoryNames[currentPage]
  var questions = questionsByCategory[currentTopic]
  for (var i = 0; i < questions.length; i++) {
    var tr = document.createElement("tr")
    var cell = document.createElement("td")
    var index = questions[i].index
    var answer = questions[i].userAnswer
    cell.innerHTML = questions[i].question + "<br><table class=radiobuttons><tr>" +
                     radioButton(index, "Yes", answer == "yes") +
                     radioButton(index, "No", answer == "no") +
                     radioButton(index, "Unsure", answer == null) + "</tr></table>"
    tr.appendChild(cell);
    table.appendChild(tr)
  }
  $('category').innerHTML = currentTopic
  $$(".pager-text").each(function(div) { 
    div.innerHTML = "Page " + (currentPage+1) + " of " + bigCategoryNames.length
  })
  $('loading').hide()
}

function getAnswerButtons(questionIndex) {
  var form = document.getElementById("form")
  var nodes = form["q" + questionIndex]
  if (!nodes || nodes.length < 3) {
    return null
  }
  return nodes
}

function getUserAnswer(questionIndex) {
  var nodes = getAnswerButtons(questionIndex)
  for (var i = 0; i < nodes.length; i++) {
    if (nodes[i].checked) {
      var value = nodes[i].value
      if (value == "yes" || value == "no") {
        return value
      } else {
        return null
      }
    }
  }
  return null
}

function updateMatches() {
  saveCurrentPageAnswers()
  var score = []
  for (var i = 0; i < questions.length; i++) {
    var answers = questions[i].answers
    var userAnswer = questions[i].userAnswer
    for (var j = 0; j < answers.length; j++) {
      var candidateAnswer = answers[j]
      if (score[j] == null) {
        score[j] = new Object()
        score[j].candidate = candidates[j]
        score[j].candidateIndex = j
        score[j].score = 0
        score[j].agree = 0
        score[j].disagree = 0
        score[j].missed = 0
      }
      if (userAnswer) {

        if (candidateAnswer) {
          if (userAnswer == candidateAnswer) {
            score[j].score++
            score[j].agree++
          } else {
            score[j].score--
            score[j].disagree++
          }
        } else { // candidate gave NC or ? answer
          score[j].missed++
        }
      }
    }
  }

  score.sort(function(a,b) {
    return b.agree - a.agree
  })

  var table = document.createElement("table")
  table.className = "matches"
  var actualTable = table
  var tbody = document.createElement("tbody")
  table.appendChild(tbody)

  for (var i = 0; i < score.length; i++) {
    var tr = document.createElement("tr")
    var td = document.createElement("td")
    var name = score[i].candidate.name
    var agreed = score[i].agree
    var disagreed = score[i].disagree
    var missed = score[i].missed
    var answered = agreed + disagreed + missed
    var agreedPc
    var disagreedPc
    if (answered > 0) {
      agreedPc = Math.round(agreed / answered * 100)
      disagreedPc = Math.round(disagreed / answered * 100)
      missedPc = Math.round(missed / answered * 100)
    } else {
      agreedPc = 0
      disagreedPc = 0
      missedPc = 0
    }
    td.innerHTML =
        "<input type=checkbox id=candidate-checkbox-" +
        score[i].candidateIndex + (score[i].candidate.checked ? " checked" : "") +
        " onclick=updateCheckboxes()> " + name

    var agreeStmt = "Agreed with " + name + ": " + agreed + " " + pluralize("answer", agreed)
    td.title = agreeStmt
    tr.appendChild(td)
    var scoretd = document.createElement("td")
    var missedStmt = name + " did not answer " + missed + " of the questions you answered"
    var disagreeStmt = "Disagreed with " + name + ": " + disagreed + " " + pluralize("answer", disagreed)
    scoretd.innerHTML =
        "<table class=agreements>" +

        "<tr>" + 
        "<td class=bar title='" + agreeStmt + "'>" +
        "<div class='agree-bar " +
        (agreed > 0 ? "nonzero" : "") +
        "' style=width:" + agreed*2 + "px>" + 
        (agreed > 0 ? "&nbsp;" : "") + 
        "</div></td>" +
        "<td class=agree-percent>" + agreedPc + "%</td>" +
        "</tr>" +

/*
        "<tr>" + 
        "<td class=bar title='" + missedStmt + "'>" +
        "<div class='missed-bar " +
        (missed > 0 ? "nonzero" : "") +
        "' style=width:" + missed*2 + "px>" + 
        (missed > 0 ? "&nbsp;" : "") +
        "</div></td>" + 
        "<td class=agree-percent>" + missedPc + "%</td>" +
        "</tr>" +

        "<tr>" +
        "<td class=bar title='" + disagreeStmt + "'>" +
        "<div class='disagree-bar " +
        (disagreed > 0 ? "nonzero" : "") +
        "' style=width:" + disagreed*2 + "px>" + 
        (disagreed > 0 ? "&nbsp;" : "") +
        "</div></td>" +
        "<td class=agree-percent>" + disagreedPc + "%</td>" +
        "</tr>" + 
*/

        "</table>"
    tr.appendChild(scoretd)
    tbody.appendChild(tr)
  }
  var wrapper = $("table-wrapper")
  wrapper.innerHTML = ""
  wrapper.appendChild(table)
}

function pluralize(word, number) {
  return number == 1 ? word : word + "s" 
}

function updateCheckboxes() {
  for (var i = 0; i < candidates.length; i++) {
    var checkbox = $("candidate-checkbox-" + i)
    candidates[i].checked = checkbox ? checkbox.checked : false
  }
  for (var i = 0; i < questions.length; i++) {
    showCheckedCandidates(i, "yes")
    showCheckedCandidates(i, "no")
  }
}

function showCheckedCandidates(i, answer) {
  var el = document.getElementById("below-q" + i + "-" + answer)
  if (!el) {
    return
  }
  var str = ""
  for (var j = 0; j < candidates.length; j++) {
    if (candidates[j].checked && questions[i].answers[j] == answer) {
      str += "<br>" + candidates[j].name
    }
  }
  el.innerHTML = str
}
