310 lines
11 KiB
JavaScript
310 lines
11 KiB
JavaScript
/*
|
|
* Copyright @ 2015 Atlassian Pty Ltd
|
|
*
|
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
|
* you may not use this file except in compliance with the License.
|
|
* You may obtain a copy of the License at
|
|
*
|
|
* http://www.apache.org/licenses/LICENSE-2.0
|
|
*
|
|
* Unless required by applicable law or agreed to in writing, software
|
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
* See the License for the specific language governing permissions and
|
|
* limitations under the License.
|
|
*/
|
|
(function() {
|
|
"use strict";
|
|
var __bind = function(fn, me){ return function(){ return fn.apply(me, arguments); }; };
|
|
|
|
window.PreziPlayer = (function() {
|
|
|
|
PreziPlayer.API_VERSION = 1;
|
|
PreziPlayer.CURRENT_STEP = 'currentStep';
|
|
PreziPlayer.CURRENT_ANIMATION_STEP = 'currentAnimationStep';
|
|
PreziPlayer.CURRENT_OBJECT = 'currentObject';
|
|
PreziPlayer.STATUS_LOADING = 'loading';
|
|
PreziPlayer.STATUS_READY = 'ready';
|
|
PreziPlayer.STATUS_CONTENT_READY = 'contentready';
|
|
PreziPlayer.EVENT_CURRENT_STEP = "currentStepChange";
|
|
PreziPlayer.EVENT_CURRENT_ANIMATION_STEP = "currentAnimationStepChange";
|
|
PreziPlayer.EVENT_CURRENT_OBJECT = "currentObjectChange";
|
|
PreziPlayer.EVENT_STATUS = "statusChange";
|
|
PreziPlayer.EVENT_PLAYING = "isAutoPlayingChange";
|
|
PreziPlayer.EVENT_IS_MOVING = "isMovingChange";
|
|
PreziPlayer.domain = "https://prezi.com";
|
|
PreziPlayer.path = "/player/";
|
|
PreziPlayer.players = {};
|
|
PreziPlayer.binded_methods = ['changesHandler'];
|
|
|
|
PreziPlayer.createMultiplePlayers = function(optionArray){
|
|
for(var i=0; i<optionArray.length; i++) {
|
|
var optionSet = optionArray[i];
|
|
new PreziPlayer(optionSet.id, optionSet);
|
|
};
|
|
};
|
|
|
|
PreziPlayer.messageReceived = function(event){
|
|
var message, item, player;
|
|
try {
|
|
message = JSON.parse(event.data);
|
|
if (message.id && (player = PreziPlayer.players[message.id])) {
|
|
if (player.options.debug === true) {
|
|
if (console && console.log)
|
|
console.log('received', message);
|
|
}
|
|
if (message.type === "changes") {
|
|
player.changesHandler(message);
|
|
}
|
|
for (var i = 0; i < player.callbacks.length; i++) {
|
|
item = player.callbacks[i];
|
|
if (item && message.type === item.event) {
|
|
item.callback(message);
|
|
}
|
|
}
|
|
}
|
|
} catch (e) { }
|
|
};
|
|
|
|
function PreziPlayer(id, options) {
|
|
var params, paramString = "", _this = this;
|
|
if (PreziPlayer.players[id]){
|
|
PreziPlayer.players[id].destroy();
|
|
}
|
|
for(var i=0; i<PreziPlayer.binded_methods.length; i++) {
|
|
var method_name = PreziPlayer.binded_methods[i];
|
|
_this[method_name] = __bind(_this[method_name], _this);
|
|
};
|
|
options = options || {};
|
|
this.options = options;
|
|
this.values = {'status': PreziPlayer.STATUS_LOADING};
|
|
this.values[PreziPlayer.CURRENT_STEP] = 0;
|
|
this.values[PreziPlayer.CURRENT_ANIMATION_STEP] = 0;
|
|
this.values[PreziPlayer.CURRENT_OBJECT] = null;
|
|
this.callbacks = [];
|
|
this.id = id;
|
|
this.embedTo = document.getElementById(id);
|
|
if (!this.embedTo) {
|
|
throw "The element id is not available.";
|
|
}
|
|
this.iframe = document.createElement('iframe');
|
|
params = [
|
|
{ name: 'oid', value: options.preziId },
|
|
{ name: 'explorable', value: options.explorable ? 1 : 0 },
|
|
{ name: 'controls', value: options.controls ? 1 : 0 }
|
|
];
|
|
for(var i=0; i<params.length; i++) {
|
|
var param = params[i];
|
|
paramString += (i===0 ? "?" : "&") + param.name + "=" + param.value;
|
|
};
|
|
this.iframe.src = PreziPlayer.domain + PreziPlayer.path + paramString;
|
|
this.iframe.frameBorder = 0;
|
|
this.iframe.scrolling = "no";
|
|
this.iframe.width = options.width || 640;
|
|
this.iframe.height = options.height || 480;
|
|
this.embedTo.innerHTML = '';
|
|
// JITSI: IN CASE SOMETHING GOES WRONG.
|
|
try {
|
|
this.embedTo.appendChild(this.iframe);
|
|
}
|
|
catch (err) {
|
|
console.log("CATCH ERROR");
|
|
}
|
|
|
|
// JITSI: Increase interval from 200 to 500, which fixes prezi
|
|
// crashes for us.
|
|
this.initPollInterval = setInterval(function(){
|
|
_this.sendMessage({'action': 'init'});
|
|
}, 500);
|
|
PreziPlayer.players[id] = this;
|
|
}
|
|
|
|
PreziPlayer.prototype.changesHandler = function(message) {
|
|
var key, value, j, item;
|
|
if (this.initPollInterval) {
|
|
clearInterval(this.initPollInterval);
|
|
this.initPollInterval = false;
|
|
}
|
|
for (key in message.data) {
|
|
if (message.data.hasOwnProperty(key)){
|
|
value = message.data[key];
|
|
this.values[key] = value;
|
|
for (j=0; j<this.callbacks.length; j++) {
|
|
item = this.callbacks[j];
|
|
if (item && item.event === key + "Change"){
|
|
item.callback({type: item.event, value: value});
|
|
}
|
|
}
|
|
}
|
|
}
|
|
};
|
|
|
|
PreziPlayer.prototype.destroy = function() {
|
|
if (this.initPollInterval) {
|
|
clearInterval(this.initPollInterval);
|
|
this.initPollInterval = false;
|
|
}
|
|
this.embedTo.innerHTML = '';
|
|
};
|
|
|
|
PreziPlayer.prototype.sendMessage = function(message) {
|
|
if (this.options.debug === true) {
|
|
if (console && console.log) console.log('sent', message);
|
|
}
|
|
message.version = PreziPlayer.API_VERSION;
|
|
message.id = this.id;
|
|
return this.iframe.contentWindow.postMessage(JSON.stringify(message), '*');
|
|
};
|
|
|
|
PreziPlayer.prototype.nextStep = /* nextStep is DEPRECATED */
|
|
PreziPlayer.prototype.flyToNextStep = function() {
|
|
return this.sendMessage({
|
|
'action': 'present',
|
|
'data': ['moveToNextStep']
|
|
});
|
|
};
|
|
|
|
PreziPlayer.prototype.previousStep = /* previousStep is DEPRECATED */
|
|
PreziPlayer.prototype.flyToPreviousStep = function() {
|
|
return this.sendMessage({
|
|
'action': 'present',
|
|
'data': ['moveToPrevStep']
|
|
});
|
|
};
|
|
|
|
PreziPlayer.prototype.toStep = /* toStep is DEPRECATED */
|
|
PreziPlayer.prototype.flyToStep = function(step, animation_step) {
|
|
var obj = this;
|
|
// check animation_step
|
|
if (animation_step > 0 &&
|
|
obj.values.animationCountOnSteps &&
|
|
obj.values.animationCountOnSteps[step] <= animation_step) {
|
|
animation_step = obj.values.animationCountOnSteps[step];
|
|
}
|
|
// jump to animation steps by calling flyToNextStep()
|
|
function doAnimationSteps() {
|
|
if (obj.values.isMoving == true) {
|
|
setTimeout(doAnimationSteps, 100); // wait until the flight ends
|
|
return;
|
|
}
|
|
while (animation_step-- > 0) {
|
|
obj.flyToNextStep(); // do the animation steps
|
|
}
|
|
}
|
|
setTimeout(doAnimationSteps, 200); // 200ms is the internal "reporting" time
|
|
// jump to the step
|
|
return this.sendMessage({
|
|
'action': 'present',
|
|
'data': ['moveToStep', step]
|
|
});
|
|
};
|
|
|
|
PreziPlayer.prototype.toObject = /* toObject is DEPRECATED */
|
|
PreziPlayer.prototype.flyToObject = function(objectId) {
|
|
return this.sendMessage({
|
|
'action': 'present',
|
|
'data': ['moveToObject', objectId]
|
|
});
|
|
};
|
|
|
|
PreziPlayer.prototype.play = function(defaultDelay) {
|
|
return this.sendMessage({
|
|
'action': 'present',
|
|
'data': ['startAutoPlay', defaultDelay]
|
|
});
|
|
};
|
|
|
|
PreziPlayer.prototype.stop = function() {
|
|
return this.sendMessage({
|
|
'action': 'present',
|
|
'data': ['stopAutoPlay']
|
|
});
|
|
};
|
|
|
|
PreziPlayer.prototype.pause = function(defaultDelay) {
|
|
return this.sendMessage({
|
|
'action': 'present',
|
|
'data': ['pauseAutoPlay', defaultDelay]
|
|
});
|
|
};
|
|
|
|
PreziPlayer.prototype.getCurrentStep = function() {
|
|
return this.values.currentStep;
|
|
};
|
|
|
|
PreziPlayer.prototype.getCurrentAnimationStep = function() {
|
|
return this.values.currentAnimationStep;
|
|
};
|
|
|
|
PreziPlayer.prototype.getCurrentObject = function() {
|
|
return this.values.currentObject;
|
|
};
|
|
|
|
PreziPlayer.prototype.getStatus = function() {
|
|
return this.values.status;
|
|
};
|
|
|
|
PreziPlayer.prototype.isPlaying = function() {
|
|
return this.values.isAutoPlaying;
|
|
};
|
|
|
|
PreziPlayer.prototype.getStepCount = function() {
|
|
return this.values.stepCount;
|
|
};
|
|
|
|
PreziPlayer.prototype.getAnimationCountOnSteps = function() {
|
|
return this.values.animationCountOnSteps;
|
|
};
|
|
|
|
PreziPlayer.prototype.getTitle = function() {
|
|
return this.values.title;
|
|
};
|
|
|
|
PreziPlayer.prototype.setDimensions = function(dims) {
|
|
for (var parameter in dims) {
|
|
this.iframe[parameter] = dims[parameter];
|
|
}
|
|
}
|
|
|
|
PreziPlayer.prototype.getDimensions = function() {
|
|
return {
|
|
width: parseInt(this.iframe.width, 10),
|
|
height: parseInt(this.iframe.height, 10)
|
|
}
|
|
}
|
|
|
|
PreziPlayer.prototype.on = function(event, callback) {
|
|
this.callbacks.push({
|
|
event: event,
|
|
callback: callback
|
|
});
|
|
};
|
|
|
|
PreziPlayer.prototype.off = function(event, callback) {
|
|
var j, item;
|
|
if (event === undefined) {
|
|
this.callbacks = [];
|
|
}
|
|
j = this.callbacks.length;
|
|
while (j--) {
|
|
item = this.callbacks[j];
|
|
if (item && item.event === event && (callback === undefined || item.callback === callback)){
|
|
this.callbacks.splice(j, 1);
|
|
}
|
|
}
|
|
};
|
|
|
|
if (window.addEventListener) {
|
|
window.addEventListener('message', PreziPlayer.messageReceived, false);
|
|
} else {
|
|
window.attachEvent('onmessage', PreziPlayer.messageReceived);
|
|
}
|
|
|
|
return PreziPlayer;
|
|
|
|
})();
|
|
|
|
})();
|
|
|
|
module.exports = PreziPlayer;
|