imedo.QuestionnaireWidget = Class.create(thc2.Widget,
/** @scope QuestionnaireWidget.prototype */
{
  
    /**
    * Markup
    *
    *  <div class="thc2-questionnaire">
    *    <form ...>
    *      <table>
    *        <thead>
    *        ...
    *        </thead>
    *        <tbody>
    *         <tr>
    *          <td>Question</td>
    *          <td><input type="radio" name="answer1" value="2" id="..." /></td>
    *          <td><input type="radio" name="answer2" value="1" id="..." /></td>
    *          ...
    *         </tr>
    *         ...
    *         ...
    *        </tbody>
    *      </table>
    *     <p>
    *       <input type="submit" ... />
    *     </p>
    *    </form>
    *    <div class='results'>
    *      <span class="percent">0</span>%
    *    </div>
    *  </div>
    */

    /**
    * Constructor.
    * @param {HTMLElement} element The element to which this widget is connected.
    */
  initialize: function(element) {
    thc2.Widget.prototype.initialize.apply(this, arguments);
    var _this = this;
    var element = this.element;
    results = element.down(".results");
    results.hide();
    results.select(".barrier").each(function(el) {
      el.hide()
    })
    var form = element.down('form');
    percentBox = element.down(".percent");
    var inputs = element.select('table tbody > tr:first-child input');
    var maxPointsPerQuestion = parseInt(
      inputs.collect(function(input) { return input.readAttribute('value')}).sort().last()
    );
    var maxPoints = maxPointsPerQuestion * this.element.select('table tbody > tr').length;
    
    Event.observe(form, 'submit', function(e) {
      try {
        var score = _this.calculateScore(form.serialize(true));
      } catch(error) {
        if ( error == _this.EmptyFormError) {
          alert("Bitte beantworten Sie alle Testfragen um ein möglichst genaues Ergebnis zu erhalten.");
          e.stop();
          return
        } else {
          throw error;
        }
      }
      percentBox.update(parseInt((score/maxPoints)*100));
      _this.evaluateScore(parseInt((score/maxPoints)*100))
      results.appear();
      e.stop();
    })
  },

  evaluateScore: function(score) {
    var evaluated = false
    var explanations = this.element.select(".explanation");
    explanations.each(function(explanation) {
      explanation.hide()
      var barrier = explanation.select(".barrier").first().innerHTML
      if(!evaluated && (score > parseInt(barrier))) {
        evaluated = true
        explanation.show()
      }
    })
  },
  calculateScore: function(serialized_form) {
    var answers = $H(serialized_form).select(function(pair){return pair[0].match(/answer/)})
    if (answers.length == 0) {
      throw this.EmptyFormError
    } else {
      return answers.inject(0, function(sum, v){return sum + parseInt(v.value)});
    }
  },

  EmptyFormError: {}

});

thc2.CurrentPage.registerBehaviour("thc2-questionnaire", imedo.QuestionnaireWidget);

