diff --git a/js/questionset.js b/js/questionset.js
index e69de29..93e7d0b 100644
--- a/js/questionset.js
+++ b/js/questionset.js
@@ -0,0 +1,136 @@
+// Will render a Question with multiple choices for answers.
+
+// Options format:
+// {
+// title: "Optional title for question box",
+// question: "Question text",
+// answers: [{text: "Answer text", correct: false}, ...],
+// singleAnswer: true, // or false, will change rendered output slightly.
+// }
+window.H5P = window.H5P || {};
+
+H5P.QuestionSet = function (options) {
+ if ( !(this instanceof H5P.QuestionSet) )
+ return new H5P.QuestionSet(options);
+
+ var texttemplate = '' +
+'
' +
+'
<%= title %>
' +
+' <% for (var i=0; i
' +
+' ' +
+'
<%= questions[i].machineName %>
' +
+' ' +
+' <% } %>' +
+' ' +
+' ' +
+ '';
+
+ var defaults = {
+ title: "",
+ randomOrder: false,
+ initialQuestion: 0,
+ progressType: 'textual',
+ questions: []
+ };
+
+ var template = new EJS({text: texttemplate});
+ var params = jQuery.extend({}, defaults, options);
+
+ var currentQuestion = -1;
+ var questionInstances = new Array();
+ var allQuestionsAnswered = false;
+ var myDom;
+
+ if (params.randomOrder) {
+ // TODO: Randomize order of questions
+ console.log("TODO: Randomize order of questions");
+ }
+
+ var _showQuestion = function (questionNumber) {
+ // Sanitize input.
+ if (questionNumber < 0) { questionNumber = 0; }
+ if (questionNumber >= params.questions.length) { questionNumber = params.questions.length - 1; }
+
+ $('.prev.button', myDom).attr({'disabled': (questionNumber === 0)});
+ $('.next.button', myDom).attr({'disabled': (questionNumber == params.questions.length-1)});
+
+ // Hide all questions
+ $('.question', myDom).hide();
+
+ // Reshow the requested question
+ $('#q-' + questionNumber, myDom).show();
+
+ // Update progress indicator
+ // Test if current has been answered.
+ if (params.progressType == 'textual') {
+ $('.progress-current', myDom).text("" + (questionNumber+1));
+ } else {
+ $('.progress-dot.current', myDom).removeClass('current');
+ // Set answered/unanswered for current.
+ $('#qdot-' + questionNumber, myDom).addClass('current');
+ }
+
+ // Remember where we are
+ currentQuestion = questionNumber;
+ return currentQuestion;
+ };
+
+ // Function for attaching the multichoice to a DOM element.
+ var attach = function (targetId) {
+ // Render own DOM into target.
+ template.update(targetId, params);
+ myDom = jQuery('#' + targetId);
+
+ // Attach questions
+ for (var i=0; i= 0; i--) {
+ score += questionInstances[i].getScore();
+ }
+ return score;
+ };
+
+ return {
+ attach: attach, // Attach to DOM object
+ getQuestions: function () {return questionInstances;},
+ getScore: getScore,
+ defaults: defaults // Provide defaults for inspection
+ };
+};
diff --git a/schema.json b/schema.json
index e69de29..63026ba 100644
--- a/schema.json
+++ b/schema.json
@@ -0,0 +1,35 @@
+{
+ "title": {
+ "name": "Title",
+ "description": "Question set title (optional)",
+ "type": "text",
+ "default": ""
+ },
+ "randomOrder": {
+ "name": "Randomize order",
+ "description": "Whether questions should be shown in random order",
+ "type": "boolean",
+ "default": false
+ },
+ "initialQuestion": {
+ "name": "Initial question",
+ "description": "Which question to start with. Count from 0",
+ "type": "integer",
+ "default": 0
+ },
+ "progressType": {
+ "name": "Progress indicator",
+ "description": "Question set progress indicator style",
+ "type": "select",
+ "values": [{"text": "Textual", "value": "textual"}, {"text": "Dots", "value": "dots"}],
+ "default": "textual"
+ },
+ "questions": {
+ "name": "Questions",
+ "description": "List of questions in this set.",
+ "type": "h5p-library",
+ "array": true,
+ "minEntries": 1,
+ "maxEntries": -1
+ }
+}
diff --git a/views/questionset.ejs b/views/questionset.ejs
index e69de29..a9c19b4 100644
--- a/views/questionset.ejs
+++ b/views/questionset.ejs
@@ -0,0 +1,25 @@
+
+
<%= title %>
+ <% for (var i=0; i
+
+
<%= questions[i].machineName %>
+
+ <% } %>
+
+