You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

119 lines
2.8 KiB
JavaScript

clippy.BASE_PATH = '//s3.amazonaws.com/clippy.js/Agents/';
clippy.load = function (name, successCb, failCb) {
var path = clippy.BASE_PATH + name;
var mapDfd = clippy.load._loadMap(path);
var agentDfd = clippy.load._loadAgent(name, path);
var soundsDfd = clippy.load._loadSounds(name, path);
var data;
agentDfd.done(function (d) {
data = d;
});
var sounds;
soundsDfd.done(function (d) {
sounds = d;
});
// wrapper to the success callback
var cb = function () {
var a = new clippy.Agent(path, data,sounds);
successCb(a);
};
$.when(mapDfd, agentDfd, soundsDfd).done(cb).fail(failCb);
};
clippy.load._maps = {};
clippy.load._loadMap = function (path) {
var dfd = clippy.load._maps[path];
if (dfd) return dfd;
// set dfd if not defined
dfd = clippy.load._maps[path] = $.Deferred();
var src = path + '/map.png';
var img = new Image();
img.onload = dfd.resolve;
img.onerror = dfd.reject;
// start loading the map;
img.setAttribute('src', src);
return dfd.promise();
};
clippy.load._sounds = {};
clippy.load._loadSounds = function (name, path) {
var dfd = clippy.load._sounds[name];
if (dfd) return dfd;
// set dfd if not defined
dfd = clippy.load._sounds[name] = $.Deferred();
var audio = document.createElement('audio');
var canPlayMp3 = !!audio.canPlayType && "" != audio.canPlayType('audio/mpeg');
var canPlayOgg = !!audio.canPlayType && "" != audio.canPlayType('audio/ogg; codecs="vorbis"');
if (!canPlayMp3 && !canPlayOgg) {
dfd.resolve({});
} else {
var src = path + (canPlayMp3 ? '/sounds-mp3.js' : '/sounds-ogg.js');
// load
clippy.load._loadScript(src);
}
return dfd.promise()
};
clippy.load._data = {};
clippy.load._loadAgent = function (name, path) {
var dfd = clippy.load._data[name];
if (dfd) return dfd;
dfd = clippy.load._getAgentDfd(name);
var src = path + '/agent.js';
clippy.load._loadScript(src);
return dfd.promise();
};
clippy.load._loadScript = function (src) {
var script = document.createElement('script');
script.setAttribute('src', src);
script.setAttribute('async', 'async');
script.setAttribute('type', 'text/javascript');
document.head.appendChild(script);
};
clippy.load._getAgentDfd = function (name) {
var dfd = clippy.load._data[name];
if (!dfd) {
dfd = clippy.load._data[name] = $.Deferred();
}
return dfd;
};
clippy.ready = function (name, data) {
var dfd = clippy.load._getAgentDfd(name);
dfd.resolve(data);
};
clippy.soundsReady = function (name, data) {
var dfd = clippy.load._sounds[name];
if (!dfd) {
dfd = clippy.load._sounds[name] = $.Deferred();
}
dfd.resolve(data);
};