import log from 'sesajstools/utils/log'
import dom from 'sesajstools/dom'
import page from '../page/index'
/**
* Ce module est à disposition des plugins qui voudraient charger un swf
* Il est utilisé par sesatheque-plugin-em & sesatheque-plugin-url
*/
/**
* Charge un swf dans l'élément container
* @param {Element} container L'élément html dans lequel on ajoutera
* @param {string} swfHref Le chemin vers le swf à charger
* @param {swfloadOptions} [options] Des paramètres utilisés pour le chargement
* @param {errorCallback} next Appelé quand le swf est chargé (mais pas forcément tout ce qu'il charge lui-même)
*/
export default function loadSwf (container, swfHref, options, next) {
/**
* Callback appelée après le chargement de swfobject
* @private
* @param {Event} e
*/
function callbackFn (e) {
function forceEmbed () {
dom.empty(htmlElt)
dom.addElement(htmlElt, 'embed', {
type: 'application/x-shockwave-flash',
width: largeur + 'px',
height: hauteur + 'px',
src: swfHref,
wmode: 'window',
pluginspage: 'https://get.adobe.com/flashplayer/',
menu: 'false',
allowScriptAccess: 'true'
})
}
if (!next) next = function () {}
if (e && e.success) {
log('Lancement de ' + swfHref + ' réussi')
return next()
}
dom.empty(htmlElt)
// on affiche l'erreur…
const errorMsg = "Javascript fonctionne mais votre navigateur ne supporte pas les éléments Adobe Flash, ou bien le fichier swf est introuvable, mais impossible d'afficher cette ressource."
next(new Error(errorMsg))
// un lien pour le télécharger
dom.addElement(htmlElt, 'a', { href: 'https://get.adobe.com/flashplayer/' }, 'télécharger flash')
dom.addElement(htmlElt, 'br')
// et un moyen de forcer le chargement
const link = dom.getElement('a', {}, 'forcer l’inclusion du fichier flash dans la page')
link.addEventListener('click', forceEmbed)
htmlElt.appendChild(wd.createTextNode('Si vous avez flash installé et activé, vous pouvez '))
htmlElt.appendChild(link)
}
const wd = window.document
// l'id du div html que l'on créé, qui sera remplacé par un tag object pour le swf
const divId = options.id || 'sesaSwf' + (new Date()).getTime()
// le message en attendant le chargement
const htmlElt = wd.createElement('div')
htmlElt.id = divId
htmlElt.appendChild(wd.createTextNode('Chargement de la ressource en cours'))
container.appendChild(htmlElt)
const flashvars = options.flashvars || {}
// les params pour le player
const swfParams = {
menu: 'false',
wmode: 'window',
allowScriptAccess: 'always' // important pour que le swf puisse communiquer avec le js de cette page
}
if (options.base) swfParams.base = options.base
// et les attributs pour le loader swfobject.embedSWF
const swfAttributes = {
id: divId,
name: divId
}
const largeur = options.largeur || 400
const hauteur = options.hauteur || 400
const flashversion = options.flashversion || '8'
// apparemment ça marche plus avec chrome depuis avril 2017
// regarder http://help.adobe.com/en_US/as3/dev/WS4B441C24-BAE3-4110-91FD-A4E5EEFB2467.html
// et https://helpx.adobe.com/flash/kb/flash-object-embed-tag-attributes.html
// swfobject.embedSWF (swfUrl, htmlId, largeur, hauteur, version_requise,
// expressInstallSwfurl, flashvars, params, attributes, callbackFn)
page.loadAsync('swfobject', function () {
try {
// console.log('on va charger ' + swfHref)
window.swfobject.embedSWF(swfHref, divId, largeur, hauteur, flashversion, null, flashvars, swfParams, swfAttributes, callbackFn)
} catch (error) {
page.addError(error)
}
})
}
/**
* @typedef swfloadOptions
* @type {Object}
* @param {string} [id] Id du div html que l'on va créer
* @param {Object} [flashvars] Les flashvars qui seront passées au swf
* @param {string} [base] Une base à passer en paramètre au swf, tous les load lancés par le swf seront traité en relatif à cette base
* @param {Integer} [hauteur=400] La hauteur d'affichage imposée au swf
* @param {Integer} [largeur=400] La largeur d'affichage imposée au swf
*/