1 |
efrain |
1 |
var H5P = window.H5P = window.H5P || {};
|
|
|
2 |
|
|
|
3 |
/**
|
|
|
4 |
* The external event dispatcher. Others, outside of H5P may register and
|
|
|
5 |
* listen for H5P Events here.
|
|
|
6 |
*
|
|
|
7 |
* @type {H5P.EventDispatcher}
|
|
|
8 |
*/
|
|
|
9 |
H5P.externalDispatcher = new H5P.EventDispatcher();
|
|
|
10 |
|
|
|
11 |
// EventDispatcher extensions
|
|
|
12 |
|
|
|
13 |
/**
|
|
|
14 |
* Helper function for triggering xAPI added to the EventDispatcher.
|
|
|
15 |
*
|
|
|
16 |
* @param {string} verb
|
|
|
17 |
* The short id of the verb we want to trigger
|
|
|
18 |
* @param {Oject} [extra]
|
|
|
19 |
* Extra properties for the xAPI statement
|
|
|
20 |
*/
|
|
|
21 |
H5P.EventDispatcher.prototype.triggerXAPI = function (verb, extra) {
|
|
|
22 |
this.trigger(this.createXAPIEventTemplate(verb, extra));
|
|
|
23 |
};
|
|
|
24 |
|
|
|
25 |
/**
|
|
|
26 |
* Helper function to create event templates added to the EventDispatcher.
|
|
|
27 |
*
|
|
|
28 |
* Will in the future be used to add representations of the questions to the
|
|
|
29 |
* statements.
|
|
|
30 |
*
|
|
|
31 |
* @param {string} verb
|
|
|
32 |
* Verb id in short form
|
|
|
33 |
* @param {Object} [extra]
|
|
|
34 |
* Extra values to be added to the statement
|
|
|
35 |
* @returns {H5P.XAPIEvent}
|
|
|
36 |
* Instance
|
|
|
37 |
*/
|
|
|
38 |
H5P.EventDispatcher.prototype.createXAPIEventTemplate = function (verb, extra) {
|
|
|
39 |
var event = new H5P.XAPIEvent();
|
|
|
40 |
|
|
|
41 |
event.setActor();
|
|
|
42 |
event.setVerb(verb);
|
|
|
43 |
if (extra !== undefined) {
|
|
|
44 |
for (var i in extra) {
|
|
|
45 |
event.data.statement[i] = extra[i];
|
|
|
46 |
}
|
|
|
47 |
}
|
|
|
48 |
if (!('object' in event.data.statement)) {
|
|
|
49 |
event.setObject(this);
|
|
|
50 |
}
|
|
|
51 |
if (!('context' in event.data.statement)) {
|
|
|
52 |
event.setContext(this);
|
|
|
53 |
}
|
|
|
54 |
return event;
|
|
|
55 |
};
|
|
|
56 |
|
|
|
57 |
/**
|
|
|
58 |
* Helper function to create xAPI completed events
|
|
|
59 |
*
|
|
|
60 |
* DEPRECATED - USE triggerXAPIScored instead
|
|
|
61 |
*
|
|
|
62 |
* @deprecated
|
|
|
63 |
* since 1.5, use triggerXAPIScored instead.
|
|
|
64 |
* @param {number} score
|
|
|
65 |
* Will be set as the 'raw' value of the score object
|
|
|
66 |
* @param {number} maxScore
|
|
|
67 |
* will be set as the "max" value of the score object
|
|
|
68 |
* @param {boolean} success
|
|
|
69 |
* will be set as the "success" value of the result object
|
|
|
70 |
*/
|
|
|
71 |
H5P.EventDispatcher.prototype.triggerXAPICompleted = function (score, maxScore, success) {
|
|
|
72 |
this.triggerXAPIScored(score, maxScore, 'completed', true, success);
|
|
|
73 |
};
|
|
|
74 |
|
|
|
75 |
/**
|
|
|
76 |
* Helper function to create scored xAPI events
|
|
|
77 |
*
|
|
|
78 |
* @param {number} score
|
|
|
79 |
* Will be set as the 'raw' value of the score object
|
|
|
80 |
* @param {number} maxScore
|
|
|
81 |
* Will be set as the "max" value of the score object
|
|
|
82 |
* @param {string} verb
|
|
|
83 |
* Short form of adl verb
|
|
|
84 |
* @param {boolean} completion
|
|
|
85 |
* Is this a statement from a completed activity?
|
|
|
86 |
* @param {boolean} success
|
|
|
87 |
* Is this a statement from an activity that was done successfully?
|
|
|
88 |
*/
|
|
|
89 |
H5P.EventDispatcher.prototype.triggerXAPIScored = function (score, maxScore, verb, completion, success) {
|
|
|
90 |
var event = this.createXAPIEventTemplate(verb);
|
|
|
91 |
event.setScoredResult(score, maxScore, this, completion, success);
|
|
|
92 |
this.trigger(event);
|
|
|
93 |
};
|
|
|
94 |
|
|
|
95 |
H5P.EventDispatcher.prototype.setActivityStarted = function () {
|
|
|
96 |
if (this.activityStartTime === undefined) {
|
|
|
97 |
// Don't trigger xAPI events in the editor
|
|
|
98 |
if (this.contentId !== undefined &&
|
|
|
99 |
H5PIntegration.contents !== undefined &&
|
|
|
100 |
H5PIntegration.contents['cid-' + this.contentId] !== undefined) {
|
|
|
101 |
this.triggerXAPI('attempted');
|
|
|
102 |
}
|
|
|
103 |
this.activityStartTime = Date.now();
|
|
|
104 |
}
|
|
|
105 |
};
|
|
|
106 |
|
|
|
107 |
/**
|
|
|
108 |
* Internal H5P function listening for xAPI completed events and stores scores
|
|
|
109 |
*
|
|
|
110 |
* @param {H5P.XAPIEvent} event
|
|
|
111 |
*/
|
|
|
112 |
H5P.xAPICompletedListener = function (event) {
|
|
|
113 |
if ((event.getVerb() === 'completed' || event.getVerb() === 'answered') && !event.getVerifiedStatementValue(['context', 'contextActivities', 'parent'])) {
|
|
|
114 |
var score = event.getScore();
|
|
|
115 |
var maxScore = event.getMaxScore();
|
|
|
116 |
var contentId = event.getVerifiedStatementValue(['object', 'definition', 'extensions', 'http://h5p.org/x-api/h5p-local-content-id']);
|
|
|
117 |
H5P.setFinished(contentId, score, maxScore);
|
|
|
118 |
}
|
|
|
119 |
};
|