Source: display/loadSwf.js

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
 */