$.quiz = {
  correctAnswers: {},
  personalities: [],
  questionCount: 0,

  score: 0,
  scoreMap: {},

  correct: {},
  incorrect: {}, 
 
  answerMap: {
    1: 'A',
    2: 'B',
    3: 'C',
    4: 'D',
    5: 'E',
  },

  quizTypes: {
    'multiple_choice': 1,
    'personality': 4,
    'scale': 9 
  },

  gradeAnswer: function(quizType, questionNum, value) {
    if (quizType == $.quiz.quizTypes['multiple_choice']) {
      $.quiz.gradeAnswerMC(questionNum, value);
    } else if (quizType == $.quiz.quizTypes['personality']) {
      $.quiz.gradeAnswerPers(questionNum, value);
    } else if (quizType == $.quiz.quizTypes['scale']) {
      $.quiz.gradeAnswerPers(questionNum, value);
    }
  },

  gradeAnswerMC: function(questionNum, answerNum) {
    if (inArray(answerNum, $.quiz.correctAnswers[questionNum])) {
      $('#result_'+questionNum).html('<span class="correct_answer">CORRECT!</span>');
      delete $.quiz.incorrect[questionNum];
      $.quiz.correct[questionNum]++;
    } else {
      var answers = [];
      $.each($.quiz.correctAnswers[questionNum], function(i) {
        answers[i] = $.quiz.answerMap[this];
      });
        
      $('#result_'+questionNum).html('<span class="incorrect_answer">Sorry, the correct answer is '+answers.join(' or ')+'</span>');
      delete $.quiz.correct[questionNum];
      $.quiz.incorrect[questionNum]++;
    }
    $('#explanation_'+questionNum).show();  
  },

  gradeAnswerPers: function(questionNum, answerValue) {
    $.quiz.scoreMap[questionNum] = answerValue;
    $.quiz.score = 0;
    $.each($.quiz.scoreMap, function(key) {
      $.quiz.score += $.quiz.scoreMap[key];
    });
  },

  registerQuestion: function(questionNum, correctAnswer) {
    $.quiz.correctAnswers[questionNum] = correctAnswer.split(',');
    $.quiz.questionCount++;
  },

  registerPersonality: function(lo, hi, description) {
    $.quiz.personalities.push({
      lo: lo,
      hi: hi,
      description: description
    });
  },

  revealScore: function(quizType) {
    if (quizType == $.quiz.quizTypes['multiple_choice']) {
      $.quiz.revealScoreMC();
    } else if (quizType == $.quiz.quizTypes['personality']) {
      $.quiz.revealScorePers();
    }
  },

  revealScoreMC: function() {
    var numCorrect = 0;
    $.each($.quiz.correct, function() { numCorrect++; });
    $('#score').html("Your score is:  "+numCorrect+" out of "+$.quiz.questionCount);
    $('#takeaway').show();
  },

  revealScorePers: function() {
    var pers = {};
    $.each($.quiz.personalities, function() {
      if (($.quiz.score+0) >= (this.lo+0) && ($.quiz.score+0) <= (this.hi+0)) {
        pers = this;
      }
    });
    if ($.quiz.score+0 < pers.lo+0 || $.quiz.score == 0) {
      $('#takeaway').html("Please answer all the questions before revealing your score").show();
    } else {
      $('#score').html("Your score is:  "+$.quiz.score);
      $('#score_explanation').html("<p>You scored between "+pers.lo+" and "+pers.hi+".</p>  "+pers.description).show();
      $('#takeaway').show();
    }
  }
};

function inArray(needle, haystack) {
    var length = haystack.length;
    for(var i = 0; i < length; i++) {
        if(haystack[i] == needle) return true;
    }
    return false;
}

