|
|
- /*
- 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();
- }
-
-
|