-
Notifications
You must be signed in to change notification settings - Fork 0
/
embed.js
327 lines (275 loc) · 9.4 KB
/
embed.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
/* eslint-disable require-jsdoc */
/* global H5PEmbedCommunicator:true */
/**
* When embedded the communicator helps talk to the parent page.
* This is a copy of the H5P.communicator, which we need to communicate in this context
*
* @type {H5PEmbedCommunicator}
*/
H5PEmbedCommunicator = (function() {
/**
* @class
* @private
*/
function Communicator() {
var self = this;
// Maps actions to functions.
var actionHandlers = {};
// Register message listener.
window.addEventListener('message', function receiveMessage(event) {
if (window.parent !== event.source || event.data.context !== 'h5p') {
return; // Only handle messages from parent and in the correct context.
}
if (actionHandlers[event.data.action] !== undefined) {
actionHandlers[event.data.action](event.data);
}
}, false);
/**
* Register action listener.
*
* @param {string} action What you are waiting for
* @param {function} handler What you want done
*/
self.on = function(action, handler) {
actionHandlers[action] = handler;
};
/**
* Send a message to the all mighty father.
*
* @param {string} action
* @param {Object} [data] payload
*/
self.send = function(action, data) {
if (data === undefined) {
data = {};
}
data.context = 'h5p';
data.action = action;
// Parent origin can be anything.
window.parent.postMessage(data, '*');
};
}
return (window.postMessage && window.addEventListener ? new Communicator() : undefined);
})();
var starttime;
var stoptime;
var timespent=0;
var endtime;
var available_time = 0;
var videoTimeout;
var courseid;
var userid;
var cm;
var cm_name;
document.onreadystatechange = function() {
// Wait for instances to be initialize.
if (document.readyState !== 'complete') {
return;
}
// eslint-disable-next-line no-console
console.log("Logging inside embed");
// Check for H5P iFrame.
var iFrame = document.querySelector('.h5p-iframe');
if (!iFrame || !iFrame.contentWindow) {
return;
}
var H5P = iFrame.contentWindow.H5P;
// Check for H5P instances.
if (!H5P || !H5P.instances || !H5P.instances[0]) {
return;
}
var resizeDelay;
var instance = H5P.instances[0];
var parentIsFriendly = false;
postLoading(instance, H5P);
// Handle that the resizer is loaded after the iframe.
H5PEmbedCommunicator.on('ready', function() {
H5PEmbedCommunicator.send('hello');
});
// Handle hello message from our parent window.
H5PEmbedCommunicator.on('hello', function(e) {
courseid = e['courseid'];
cm = e['cm'];
cm_name = e['cm_name'];
userid = e['userid'];
console.log("Loaded all instances: " + courseid + cm + cm_name + userid);
// Initial setup/handshake is done.
parentIsFriendly = true;
// Hide scrollbars for correct size.
iFrame.contentDocument.body.style.overflow = 'hidden';
document.body.classList.add('h5p-resizing');
// Content need to be resized to fit the new iframe size.
H5P.trigger(instance, 'resize');
});
// When resize has been prepared tell parent window to resize.
H5PEmbedCommunicator.on('resizePrepared', function() {
H5PEmbedCommunicator.send('resize', {
/** CODE EDITED BY SANAT SHARMA */
scrollHeight: getIframeBodyHeights(iFrame).scrollHeight
// eslint-disable-next-line capitalized-comments
// scrollHeight: iFrame.contentDocument.body.scrollHeight
});
});
H5PEmbedCommunicator.on('resize', function() {
H5P.trigger(instance, 'resize');
});
H5P.on(instance, 'resize', function() {
if (H5P.isFullscreen) {
return; // Skip iframe resize.
}
// Use a delay to make sure iframe is resized to the correct size.
clearTimeout(resizeDelay);
resizeDelay = setTimeout(function() {
// Only resize if the iframe can be resized.
if (parentIsFriendly) {
// CODE ADDED BY SANAT SHARMA
var heights = getIframeBodyHeights(iFrame);
H5PEmbedCommunicator.send('prepareResize',
{
scrollHeight: heights.scrollHeight,
clientHeight: heights.clientHeight
// scrollHeight: iFrame.contentDocument.body.scrollHeight,
// clientHeight: iFrame.contentDocument.body.clientHeight
}
);
// Code change end
} else {
H5PEmbedCommunicator.send('hello');
}
}, 0);
});
window.onbeforeunload = function () {
if (starttime) {
stoptime = new Date().getTime();
return addTime();
}
};
window.addEventListener("beforeunload", function (e) {
// var confirmationMessage = "\o/";
console.log(starttime)
if (starttime && starttime > 0) {
stoptime = new Date().getTime();
return addTime();
}
});
// Trigger initial resize for instance.
H5P.trigger(instance, 'resize');
};
function getIframeBodyHeights(iFrame) {
var margin = parseInt(getComputedStyle(document.body)['margin'], 10) || 0;
return {
scrollHeight: iFrame.contentDocument.body.scrollHeight + margin * 2,
clientHeight: iFrame.contentDocument.body.clientHeight + margin * 2,
};
}
function postLoading(instance, iframeH5P) {
var vid = instance.video;
vid.on('stateChange', function (event) {
switch (event.data) {
case iframeH5P.Video.ENDED:
endtime = new Date().getTime();
console.log('ended => '+ endtime);
addTime();
if(videoTimeout) clearTimeout(videoTimeout);
break;
case iframeH5P.Video.PLAYING:
// Do not change start time if caused due to buffering
if (!starttime || starttime == 0)
starttime = new Date().getTime();
else
console.log("Not setting new starttime.");
console.log('play => '+ starttime);
if (available_time > 0) {
if(videoTimeout) clearTimeout(videoTimeout);
setVideoTimeout(available_time);
}
break;
case iframeH5P.Video.PAUSED:
stoptime = new Date().getTime();
console.log('pause => '+ stoptime);
addTime();
if(videoTimeout) clearTimeout(videoTimeout);
break;
}
});
}
function setVideoTimeout(time) {
time = (time) ? time * 1000 : 0;
if (time > 0 ) {
videoTimeout = setTimeout(function() {
stoptime = new Date().getTime();
//console.log(time);
addTime('refresh');
// window.location.reload();
}, time);
}
}
function addTime(type='') {
console.log("INSIDE ADDTIME");
var now = new Date().getTime();
stoptime = (stoptime != '' ) ? stoptime : now;
if (endtime && starttime != 0) {
timespent = Math.abs( ( parseInt(endtime) - parseInt(starttime) ) / 1000 );
starttime = 0;
}
else if ( starttime < stoptime && starttime != 0) {
timespent = timespent + Math.abs( ( parseInt(stoptime) - parseInt(starttime) ) / 1000 );
starttime = 0;
}
// TODO Call servuce function local_vpt_addUserTime_mobile
sendTime(type);
}
function sendTime(type='') {
console.log("inside SENDTIME");
var data = {
wstoken: 'b81f5e684fbf38b8af50ff0bf226f714',
wsfunction: 'local_vpt_addUserTime_mobile',
courseid: courseid,
userid: userid,
timespent: Math.ceil(timespent),
cm: cm,
cm_name: cm_name
}
var url = 'https://go.2learn.in/webservice/rest/server.php?' +
'wstoken=' + data.wstoken + '&' +
'wsfunction=' + data.wsfunction + '&' +
'moodlewsrestformat=json' + '&' +
'courseid=' + data.courseid + '&' +
'userid=' + data.userid + '&' +
'timespent=' + data.timespent + '&' +
'cm=' + data.cm + '&' +
'cm_name=' + data.cm_name;
timespent= 0;
var xhttp = new XMLHttpRequest();
xhttp.open('POST', url, true);
xhttp.send();
xhttp.onreadystatechange=function() {
if (this.readyState == 4 && this.status == 200) {
var response = this.response;
try {
var record = JSON.parse(response);
console.log(record);
if (typeof record.available_time != 'undefined' && record.available_time > 0) {
available_time = record.available_time;
clearTimeout(videoTimeout);
timespent=0;
}
else {
if (typeof record.available_time == 'undefined')
alert("Error Occurred, please contact admin");
else {
alert("Your Available Play Time for this course has completed. Please purchase more to continue");
}
location.reload();
}
}
catch{
console.log ("Some other erro occured");
}
}
else {
// some error happened
console.log("Errors occured in trying to add time.")
}
};
}