From a077064bb9e0efb7f66c166fb2867ca42adc53cb Mon Sep 17 00:00:00 2001
From: "cedric@yterium.com" <>
Date: Mon, 2 Mar 2015 09:04:00 +0000
Subject: [PATCH] Mise a jour de l'initialisation : chargement plus rapide de
 la CSS (en meme temps qu'on lance le chargement du js, et pas lors de l'init
 du player) + mise a jour optimisation du js d'initialisation (report du
 plugin player)

---
 javascript/mejs-init.js     | 150 ++++++++++++++++++++----------------
 javascript/mejs-init.min.js |   2 +-
 modeles/audio.html          |   7 +-
 modeles/video.html          |   7 +-
 paquet.xml                  |   2 +-
 5 files changed, 91 insertions(+), 77 deletions(-)

diff --git a/javascript/mejs-init.js b/javascript/mejs-init.js
index d1b5aa60..24dc65ca 100644
--- a/javascript/mejs-init.js
+++ b/javascript/mejs-init.js
@@ -1,78 +1,94 @@
 var mejsloader;
-var mejsplugins={};
-var mejscss={};
 (function(){
-	var mejs_counter = 0;
-	function mejs_init(){
-		(function($) {
-			jQuery("audio.mejs,video.mejs").not('.done').each(function(){
-				jQuery(this).addClass('done');
-				//console.log(this);
-				mejs_counter++;
-				var id = "mejs-" + (jQuery(this).attr('data-id')) + "-" + mejs_counter;
-				jQuery(this).attr('id',id);
-				var autoplay = jQuery(this).attr('autoplay');
-				var opt = {options:{},plugins:{},css:[]}, i,v;
-				for (i in opt){
-					if (v = jQuery(this).attr('data-mejs'+i)) opt[i] = jQuery.parseJSON(v);
-				}
-				function runthisplayer(){
-					var run = true;
-					//console.log(css);
-					for(var c in opt.css){
-						if (typeof mejscss[opt.css[c]]=="undefined"){
-							mejscss[opt.css[c]] = true;
-							var stylesheet = document.createElement('link');
-							stylesheet.href = opt.css[c];
-							stylesheet.rel = 'stylesheet';
-							stylesheet.type = 'text/css';
-							document.getElementsByTagName('head')[0].appendChild(stylesheet);
-						}
+	var L=mejsloader;
+	if (typeof L == "undefined")
+		mejsloader = L = {gs:null,plug:{},css:{},init:null,c:0,cssload:null};
+	if (!L.init){
+		L.cssload = function (f){
+			if (typeof L.css[f]=="undefined"){
+				L.css[f] = true;
+				var stylesheet = document.createElement('link');
+				stylesheet.href = f;
+				stylesheet.rel = 'stylesheet';
+				stylesheet.type = 'text/css';
+				document.getElementsByTagName('head')[0].appendChild(stylesheet);
+			}
+		}
+		L.init = function (){
+			if (!(L.gs===true)) return;
+			(function ($){
+				jQuery("audio.mejs,video.mejs").not('.done').each(function (){
+					var me = jQuery(this).addClass('done');
+					//console.log(this);
+					var id;
+					if (!(id = me.attr('id'))){
+						id = "mejs-"+(me.attr('data-id'))+"-"+(L.c++);
+						me.attr('id', id);
 					}
-					for(var p in opt.plugins){
-						//console.log(p);
-						//console.log(mejsplugins[p]);
-						// load this plugin
-						if (typeof mejsplugins[p]=="undefined"){
-							//console.log("Load Plugin "+p);
-							run = false;
-							mejsplugins[p] = false;
-							jQuery.getScript(opt.plugins[p],function(){mejsplugins[p] = true;runthisplayer();});
-						}
-						// this plugin is loading
-						else if(mejsplugins[p]==false){
-							//console.log("Plugin "+p+" loading...");
-							run = false;
+					var opt = {options: {}, plugins: {}, css: []}, i, v;
+					for (i in opt){
+						if (v = me.attr('data-mejs'+i)) opt[i] = jQuery.parseJSON(v);
+					}
+					function runthisplayer(){
+						var run = true;
+						//console.log(css);
+						for (var c in opt.css){
+							L.cssload(opt.css[c]);
 						}
-						else {
-							//console.log("Plugin "+p+" loaded");
+						for (var p in opt.plugins){
+							//console.log(p);
+							//console.log(L.plug[p]);
+							// load this plugin
+							if (typeof L.plug[p]=="undefined"){
+								//console.log("Load Plugin "+p);
+								run = false;
+								L.plug[p] = false;
+								jQuery.getScript(opt.plugins[p], function (){
+									L.plug[p] = true;
+									runthisplayer();
+								});
+							}
+							// this plugin is loading
+							else if (L.plug[p]==false){
+								//console.log("Plugin "+p+" loading...");
+								run = false;
+							}
+							else {
+								//console.log("Plugin "+p+" loaded");
+							}
 						}
-					}
-					if (run) {
-						new MediaElementPlayer('#'+id,jQuery.extend(opt.options,{
-							"success": function(media) {
-								function togglePlayingState(){
-									jQuery(media).closest('.mejs-inner').removeClass(media.paused?'playing':'paused').addClass(media.paused?'paused':'playing');
+						if (run){
+							new MediaElementPlayer('#'+id, jQuery.extend(opt.options, {
+								"success": function (media){
+									function togglePlayingState(){
+										jQuery(media).closest('.mejs-inner').removeClass(media.paused ? 'playing' : 'paused').addClass(media.paused ? 'paused' : 'playing');
+									}
+
+									togglePlayingState();
+									media.addEventListener('play', togglePlayingState, false);
+									media.addEventListener('playing', togglePlayingState, false);
+									media.addEventListener('pause', togglePlayingState, false);
+									media.addEventListener('paused', togglePlayingState, false);
+									if (me.attr('autoplay')) media.play();
 								}
-								togglePlayingState();
-								media.addEventListener('play',togglePlayingState, false);
-								media.addEventListener('playing',togglePlayingState, false);
-								media.addEventListener('pause',togglePlayingState, false);
-								media.addEventListener('paused',togglePlayingState, false);
-								if (autoplay) media.play();
-							}
-						}));
+							}));
+						}
 					}
-				}
-				runthisplayer();
-			})
-		})(jQuery);
+
+					runthisplayer();
+				})
+			})(jQuery);
+		}
 	}
-	if (typeof mejsloader=="undefined"){
-		mejsloader = jQuery.getScript(mejspath,function(){
-			mejs_init(); // init immediate des premiers players dans la page
-			jQuery(mejs_init); // init exhaustive de tous les players
-			onAjaxLoad(mejs_init); // init lors d'un load ajax
+	if (!L.gs){
+		if (typeof mejscss !== "undefined"){
+			L.cssload(mejscss);
+		}
+		L.gs = jQuery.getScript(mejspath,function(){
+			L.gs = true;
+			L.init(); // init immediate des premiers players dans la page
+			jQuery(L.init); // init exhaustive de tous les players
+			onAjaxLoad(L.init); // init lors d'un load ajax
 		});
 	}
 })();
diff --git a/javascript/mejs-init.min.js b/javascript/mejs-init.min.js
index 1515ef9c..69e0262e 100644
--- a/javascript/mejs-init.min.js
+++ b/javascript/mejs-init.min.js
@@ -1 +1 @@
-var mejsloader,mejsplugins={},mejscss={}; (function(){function b(){(function(b){jQuery("audio.mejs,video.mejs").not(".done").each(function(){function b(){var c=!0,e;for(e in a.css)if("undefined"==typeof mejscss[a.css[e]]){mejscss[a.css[e]]=!0;var f=document.createElement("link");f.href=a.css[e];f.rel="stylesheet";f.type="text/css";document.getElementsByTagName("head")[0].appendChild(f)}for(var d in a.plugins)"undefined"==typeof mejsplugins[d]?(c=!1,mejsplugins[d]=!1,jQuery.getScript(a.plugins[d],function(){mejsplugins[d]=!0;b()})):0==mejsplugins[d]&& (c=!1);c&&new MediaElementPlayer("#"+g,jQuery.extend(a.options,{success:function(a){function b(){jQuery(a).closest(".mejs-inner").removeClass(a.paused?"playing":"paused").addClass(a.paused?"paused":"playing")}b();a.addEventListener("play",b,!1);a.addEventListener("playing",b,!1);a.addEventListener("pause",b,!1);a.addEventListener("paused",b,!1);l&&a.play()}}))}jQuery(this).addClass("done");h++;var g="mejs-"+jQuery(this).attr("data-id")+"-"+h;jQuery(this).attr("id",g);var l=jQuery(this).attr("autoplay"), a={options:{},plugins:{},css:[]},c,k;for(c in a)if(k=jQuery(this).attr("data-mejs"+c))a[c]=jQuery.parseJSON(k);b()})})(jQuery)}var h=0;"undefined"==typeof mejsloader&&(mejsloader=jQuery.getScript(mejspath,function(){b();jQuery(b);onAjaxLoad(b)}))})();
\ No newline at end of file
+var mejsloader; (function(){var a=mejsloader;"undefined"==typeof a&&(mejsloader=a={gs:null,plug:{},css:{},init:null,c:0,cssload:null});a.init||(a.cssload=function(b){if("undefined"==typeof a.css[b]){a.css[b]=!0;var c=document.createElement("link");c.href=b;c.rel="stylesheet";c.type="text/css";document.getElementsByTagName("head")[0].appendChild(c)}},a.init=function(){!0===a.gs&&function(b){jQuery("audio.mejs,video.mejs").not(".done").each(function(){function c(){var e=!0,h;for(h in d.css)a.cssload(d.css[h]);for(var f in d.plugins)"undefined"== typeof a.plug[f]?(e=!1,a.plug[f]=!1,jQuery.getScript(d.plugins[f],function(){a.plug[f]=!0;c()})):0==a.plug[f]&&(e=!1);e&&new MediaElementPlayer("#"+b,jQuery.extend(d.options,{success:function(a){function b(){jQuery(a).closest(".mejs-inner").removeClass(a.paused?"playing":"paused").addClass(a.paused?"paused":"playing")}b();a.addEventListener("play",b,!1);a.addEventListener("playing",b,!1);a.addEventListener("pause",b,!1);a.addEventListener("paused",b,!1);g.attr("autoplay")&&a.play()}}))}var g=jQuery(this).addClass("done"), b;(b=g.attr("id"))||(b="mejs-"+g.attr("data-id")+"-"+a.c++,g.attr("id",b));var d={options:{},plugins:{},css:[]},e,h;for(e in d)if(h=g.attr("data-mejs"+e))d[e]=jQuery.parseJSON(h);c()})}(jQuery)});a.gs||("undefined"!==typeof mejscss&&a.cssload(mejscss),a.gs=jQuery.getScript(mejspath,function(){a.gs=!0;a.init();jQuery(a.init);onAjaxLoad(a.init)}))})();
\ No newline at end of file
diff --git a/modeles/audio.html b/modeles/audio.html
index e11c9586..2a59fa6f 100644
--- a/modeles/audio.html
+++ b/modeles/audio.html
@@ -9,14 +9,13 @@
 	       src="#FICHIER"
 	       type="#MIME_TYPE"
 	       data-mejsoptions='{"alwaysShowControls": true[,"loop":(#ENV{loop}|?{true,false})],"audioWidth":"100%"[,"audioHeight":"(#ENV{hauteur})"][,"startVolume":"(#ENV{volume})"]}'
-	       data-mejscss='[(#LISTE{#CHEMIN{lib/mejs/mediaelementplayer.min.css}}|json_encode)]'
 	       controls="controls"
 				 [autoplay="autoplay"(#ENV{autoplay}|oui)]></audio>
 </div>
 [<div class='spip_doc_titre'><strong>(#TITRE)</strong></div>]
 [<div class='spip_doc_descriptif'>(#DESCRIPTIF|PtoBR)[(#NOTES|PtoBR)]</div>]
-[<script>/*<!\[CDATA\[*/var mejspath = '[(#CHEMIN{lib/mejs/mediaelement-and-player.min.js}|timestamp)]';
-(#INCLURE{javascript/mejs-init.min.js}|compacte{js})/*\]\]>*/</script>]
-[(#ENV{skin}|oui)[<style>(#INCLURE{#CHEMIN{css/mejs-skin-#ENV{skin}.css}|sinon{#CHEMIN{lib/mejs/mejs-skins.css}}|url_absolue_css})</style>]]
+[<script>/*<!\[CDATA\[*/var mejspath='[(#CHEMIN{lib/mejs/mediaelement-and-player.min.js}|timestamp)]',mejscss='[(#CHEMIN{lib/mejs/mediaelementplayer.min.css}|timestamp)]';
+(#INCLURE{javascript/mejs-init.min.js})/*\]\]>*/</script>]
+[(#ENV{skin}|oui)[<style>(#INCLURE{#CHEMIN{css/mejs-skin-#ENV{skin}.css}|sinon{#CHEMIN{lib/mejs/mejs-skins.css}}|url_absolue_css})</style>]]</span>
 </div>
 </BOUCLE_tous>
\ No newline at end of file
diff --git a/modeles/video.html b/modeles/video.html
index 713f495a..dd73c69b 100644
--- a/modeles/video.html
+++ b/modeles/video.html
@@ -14,7 +14,6 @@
 		<video class="mejs mejs-#ID_DOCUMENT [ mejs-(#ENV{skin})]"
 		       data-id="[(#VAL{mejs-#ID_DOCUMENT}|concat{#ENV{skin}}|md5)]"
 		       data-mejsoptions='{"alwaysShowControls": true,"pluginPath":"[(#CHEMIN{lib/mejs/flashmediaelement.swf}|dirname)/]"[,"loop":(#ENV{loop}|?{true,false})],"videoWidth":"100%",videoHeight:"100%"[,startVolume:"(#ENV{volume})"]}'
-		       data-mejscss='[(#LISTE{#CHEMIN{lib/mejs/mediaelementplayer.min.css}}|json_encode)]'
 		       width="100%"
 		       height="100%"
 		       poster="[(#LOGO_DOCUMENT{vignette}|image_reduire{#GET{largeur},0}|extraire_attribut{src})]"
@@ -35,8 +34,8 @@
 </div>
 [<div class='spip_doc_titre'><strong>(#TITRE)</strong></div>]
 [<div class='spip_doc_descriptif'>(#DESCRIPTIF|PtoBR)[(#NOTES|PtoBR)]</div>]
-[<script>/*<!\[CDATA\[*/var mejspath = '[(#CHEMIN{lib/mejs/mediaelement-and-player.min.js}|timestamp)]';
-(#INCLURE{javascript/mejs-init.min.js}|compacte{js})/*\]\]>*/</script>]
-[(#ENV{skin}|oui)[<style>(#INCLURE{#CHEMIN{css/mejs-skin-#ENV{skin}.css}|sinon{#CHEMIN{lib/mejs/mejs-skins.css}}|url_absolue_css})</style>]]
+[<script>/*<!\[CDATA\[*/var mejspath='[(#CHEMIN{lib/mejs/mediaelement-and-player.min.js}|timestamp)]',mejscss='[(#CHEMIN{lib/mejs/mediaelementplayer.min.css}|timestamp)]';
+(#INCLURE{javascript/mejs-init.min.js})/*\]\]>*/</script>]
+[(#ENV{skin}|oui)[<style>(#INCLURE{#CHEMIN{css/mejs-skin-#ENV{skin}.css}|sinon{#CHEMIN{lib/mejs/mejs-skins.css}}|url_absolue_css})</style>]]</span>
 </div>
 </BOUCLE_tous>
\ No newline at end of file
diff --git a/paquet.xml b/paquet.xml
index c1e2752c..35e19dd7 100644
--- a/paquet.xml
+++ b/paquet.xml
@@ -1,7 +1,7 @@
 <paquet
 	prefix="medias"
 	categorie="multimedia"
-	version="2.10.8"
+	version="2.10.9"
 	etat="stable"
 	compatibilite="[3.0.0;3.1.*]"
 	logo="prive/themes/spip/images/portfolio-32.png"
-- 
GitLab