comunic/tools/speaker/msie_flashFallback/flashFallback.js
2016-11-19 12:08:12 +01:00

228 lines
5.8 KiB
JavaScript
Executable File

/*
A fallback to flash for wav-output (for IE 10)
Please mind that wav data has to be copied to an ArrayBuffer object internally,
since we may not send binary data to the swf.
This may take some time and memory for longer utterances.
*/
var meSpeakFlashFallback = new function() {
var swfDefaultId='meSpeakFallback',
swfDefaultUrl='meSpeakFallback.swf',
swfElementId='', swfViaAX=false, swfInstalled=false, swfHasLoaded=false, swfVol=1;
// public
function swfInstallFallback(swfUrl, swfId, parentElementOrId) {
var parentEl, url;
if (swfInstalled) return true;
if (!swfIsAvailable(10)) return false;
swfInstalled=true;
// set defaults
swfElementId = (swfId && typeof swfId == 'string')? swfId:swfDefaultId;
url = (swfUrl && typeof swfUrl == 'string')? swfUrl:swfDefaultUrl;
if (parentElementOrId) {
if (typeof parentElementOrId == 'string') {
parentEl=document.getElementById(parentElementOrId);
}
else if (typeof parentElementOrId == 'object') {
parentEl=parentElementOrId=null;
}
}
if (!parentEl) parentEl=document.getElementsByTagName('body')[0];
if (!parentEl) return false;
// inject
var obj = swfCreate(
{
'data': url,
'width': '2',
'height': '2',
'id': swfElementId,
'name': swfElementId,
'align': 'top'
},
{
'quality': 'low',
'bgcolor': 'transparent',
'allowscriptaccess': 'sameDomain',
'allowfullscreen': 'false'
}
);
parentEl.appendChild(obj);
swfRegisterUnloadHandler();
return true;
}
function swfReady() {
return swfHasLoaded;
}
function swfSetVolume(v) {
if (wfHasLoaded) {
var obj=document.getElementById(swfElementId);
if (obj) el.setVolume(v);
}
swfVol=v;
}
function swfSpeak(txt, options) {
if (swfHasLoaded && window.meSpeak) {
var obj=document.getElementById(swfElementId);
if (obj) {
if (!typeof options != 'object') options={};
options.rawdata='array';
obj.play( meSpeak.speak(txt, options) );
}
}
}
function swf10Available() {
return swfIsAvailable(10);
}
function swfFallbackHandshake() {
swfHasLoaded=true;
if (swfVol!=1) swfSetVolume(swfVol);
if (window.console) console.log('meSpeak-SWF-fallback available.');
}
// private: a stripped-down version of swfobject.js
function swfIsAvailable(leastMajorVersion) {
// returns Boolean: flashplayer and version at least 10.x
var sf='Shockwave Flash', sfm='application/x-shockwave-flash';
if (navigator.plugins !== undefined && typeof navigator.plugins[sf] == 'object') {
var d=navigator.plugins[sf].description;
if (d && !(typeof navigator.mimeTypes !==undefined && navigator.mimeTypes[sfm] && !navigator.mimeTypes[sfm].enabledPlugin)) {
d=d.replace(/^.*\s+(\S+\s+\S+$)/, '$1');
if (leastMajorVersion<= parseInt(d.replace(/^(.*)\..*$/, '$1'), 10)) return true;
}
}
else if (window.ActiveXObject) {
try {
var a=new ActiveXObject('ShockwaveFlash.ShockwaveFlash');
if (a) {
swfViaAX=true;
d=a.GetVariable('$version');
if (d) {
d=d.split(' ')[1].split(',');
if (leastMajorVersion<= parseInt(d[0], 10)) return true;
}
}
}
catch(e) {}
}
return false;
}
function swfCreate(attributes, params) {
if (swfViaAX) {
var att='', par='', i;
for (i in attributes) {
var a=i.toLowerCase;
if (a=='data') {
params.movie=attributes[i];
}
else if (a=='styleclass') {
att+=' class="'+attributes[i]+'"';
}
else if (a!='classid') {
att+=' '+i+'="'+attributes[i]+'"';
}
}
for (i in params) {
if (params[i] != Object.prototype[i]) par+=' <param name="'+i+'" value="'+params[i]+'" />';
}
var el=document.createElement('div');
el.outerHTML='<object classid="clsid:D27CDB6E-AE6D-11cf-96B8-444553540000"'+att+'>'+par+'</object>';
return el;
}
else {
var o=document.createElement('object');
o.setAttribute('type', 'application/x-shockwave-flash');
for (var i in attributes) {
if (attributes[i] != Object.prototype[i]) {
var a=i.toLowerCase();
if (a=='styleclass') {
o.setAttribute('class', attributes[i]);
}
else if (a!='styleclass') {
o.setAttribute(i, attributes[i]);
}
}
}
for (i in params) {
if (attributes[i] != Object.prototype[i] && i.toLowerCase() != 'movie') {
var p=document.createElement('param');
p.setAttribute('name', i);
p.setAttribute('value', attributes[i]);
o.appendChild(p);
}
}
return o;
}
}
function swfRemove(obj) {
try {
if (typeof obj =='string') obj=document.getElementById(obj);
if (!obj || typeof obj !='object') return;
if (swfViaAX) {
obj.style.display='none';
swfRemoveObjectInIE(obj.id);
}
else if (obj.parentNode) {
obj.parentNode.removeChild(obj);
}
swfInstalled=false;
}
catch(e) {}
}
function swfRemoveObjectInIE(id) {
var obj=document.getElementById(obj);
if (obj) {
if (obj.readyState==4) {
for (var i in obj) {
if (typeof obj[i] =='function') obj[i] = null;
}
if (obj.parentNode) obj.parentNode.removeChild(obj);
}
else {
setTimeout(function() {swfRemoveObjectInIE(id)}, 10);
}
}
}
function swfUnloadHandler() {
if (swfElementId) swfRemove(swfElementId);
if (!window.addEventListener && window.detachEvent) window.detachEvent('onunload', swfUnloadHandler);
}
function swfRegisterUnloadHandler() {
if (window.addEventListener) {
window.addEventListener('unload', swfUnloadHandler, false);
}
else if (window.attachEvent) {
window.attachEvent('onunload', swfUnloadHandler);
}
}
return {
'install': swfInstallFallback,
'isAvailable': swf10Available,
'ready': swfReady,
'speak': swfSpeak,
'setVolume': swfSetVolume,
'swfFallbackHandshake': swfFallbackHandshake
}
};
function meSpeakFallbackHandshake() {
// handshake handler with swf external interface
meSpeakFlashFallback.swfFallbackHandshake();
}