autoplay.js 11KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413
  1. /* Librairie Autoplay pour muzi.ch */
  2. $(document).ready(function(){
  3. /*
  4. * Section commune
  5. */
  6. // Liste de données pour la lecture
  7. var autoplay_list = new Array;
  8. // object player
  9. var autoplay_player = null;
  10. // Ritournelle pour le lecteur soundcloud (une seule variable sinon bug)
  11. var autoplay_player_soundcloud = null;
  12. // identifiant de la division du lecteur
  13. var autoplay_player_div_id = "autoplay_player";
  14. // identifiant du lecteur
  15. var autoplay_player_id = "autoplay_player_id";
  16. // étape de lecture, on commence naturellement a 0
  17. var autoplay_step = 0;
  18. // On utilise cette variable pour savoir quel est l'élélement choisis en
  19. // dernier (cas du brute click)
  20. var autoplay_last_element_id = null;
  21. // Pour savoir si on est en bout de ligne
  22. var autoplay_no_more = false;
  23. // En cas de click sur un bouton de lecture
  24. $('a#autoplay_launch').click(function(){
  25. // On ouvre la boite de dialogue pendant la demande ajax
  26. open_popin_dialog('autoplay');
  27. $('img#autoplay_loader').show();
  28. $.getJSON($(this).attr('href'), function(response) {
  29. if (response.status == 'mustbeconnected')
  30. {
  31. $(location).attr('href', url_index);
  32. }
  33. if (response.status == 'success')
  34. {
  35. // On récupère la liste d'élèments
  36. autoplay_list = response.data;
  37. autoplay_last_element_id = autoplay_list[0].element_id;
  38. autoplay_step = 0;
  39. autoplay_run(0);
  40. }
  41. });
  42. return false;
  43. });
  44. function autoplay_load_element(element_id, timeouted)
  45. {
  46. // On vérifie ici que c'est le dernier élement demandé, ca evite de multiples
  47. // requetes en cas de brute click sur les flèches.
  48. if (!timeouted)
  49. {
  50. $('#autoplay_element_loader').show();
  51. $('li#autoplay_element_container').html('');
  52. setTimeout(autoplay_load_element, 1000, element_id, true);
  53. }
  54. else
  55. {
  56. if (autoplay_last_element_id == element_id)
  57. {
  58. $.getJSON(url_element_dom_get_one_autoplay+'/'+element_id, function(response) {
  59. $('#autoplay_element_loader').hide();
  60. if (response.status == 'mustbeconnected')
  61. {
  62. $(location).attr('href', url_index);
  63. }
  64. if (response.status == 'success' && autoplay_last_element_id == element_id)
  65. {
  66. if (!autoplay_no_more)
  67. {
  68. // On récupère la liste d'élèments
  69. $('li#autoplay_element_container').html(response.data);
  70. }
  71. else
  72. {
  73. $('li#autoplay_element_container').html('');
  74. }
  75. }
  76. });
  77. }
  78. }
  79. }
  80. // Lancement de l'élèment suivant
  81. function autoplay_run(step)
  82. {
  83. // En premier lieu on réinitialise le lecteur en détruisant le dom qui a
  84. // pu être créé par la lecture précedente.
  85. autoplay_clean_for_player_creation();
  86. // Pause des lecteurs potentiels
  87. autoplay_pause_all_players();
  88. if (autoplay_list.length)
  89. {
  90. if (array_key_exists(step, autoplay_list))
  91. {
  92. // Youtube case
  93. if (autoplay_list[step].element_type == 'youtube.com' || autoplay_list[step].element_type == 'youtu.be')
  94. {
  95. autoplay_load_element(autoplay_list[step].element_id, false);
  96. youtube_create_player(autoplay_list[step].element_ref_id);
  97. }
  98. if (autoplay_list[step].element_type == 'soundcloud.com')
  99. {
  100. autoplay_load_element(autoplay_list[step].element_id, false);
  101. soundcloud_create_player(autoplay_list[step].element_ref_id, autoplay_list[step].element_normalized_url);
  102. }
  103. }
  104. }
  105. else
  106. {
  107. autoplay_display_nomore();
  108. }
  109. }
  110. function autoplay_clean_for_player_creation(clean_element)
  111. {
  112. autoplay_pause_all_players();
  113. $('div#'+autoplay_player_div_id+'_container').html('<div id="'+autoplay_player_div_id+'"></div>');
  114. $('#autoplay_noelements_text').hide();
  115. if (clean_element)
  116. {
  117. $('li#autoplay_element_container').html('');
  118. }
  119. $('img#autoplay_loader').show();
  120. }
  121. function autoplay_pause_all_players()
  122. {
  123. soundcloud_stop_player();
  124. }
  125. function autoplay_display_nomore()
  126. {
  127. autoplay_no_more = true;
  128. $('div#'+autoplay_player_div_id+'_container').html('<div id="'+autoplay_player_div_id+'"></div>');
  129. $('li#autoplay_element_container').html('');
  130. $('#autoplay_noelements_text').show();
  131. $('img#autoplay_loader').hide();
  132. if (autoplay_player_soundcloud)
  133. {
  134. $('div#autoplay_player_soundcloud').hide();
  135. autoplay_player_soundcloud.pause();
  136. }
  137. }
  138. // Avancer d'un élelement dans la liste
  139. function autoplay_next()
  140. {
  141. autoplay_no_more = false;
  142. autoplay_step++;
  143. if (array_key_exists(autoplay_step, autoplay_list))
  144. {
  145. autoplay_last_element_id = autoplay_list[autoplay_step].element_id;
  146. autoplay_run(autoplay_step);
  147. }
  148. else
  149. {
  150. autoplay_display_nomore();
  151. autoplay_step = autoplay_list.length;
  152. }
  153. }
  154. // Reculer d'un élement dans la liste
  155. function autoplay_previous()
  156. {
  157. autoplay_no_more = false;
  158. autoplay_step--;
  159. if (array_key_exists(autoplay_step, autoplay_list))
  160. {
  161. autoplay_last_element_id = autoplay_list[autoplay_step].element_id;
  162. autoplay_run(autoplay_step);
  163. }
  164. else
  165. {
  166. autoplay_display_nomore();
  167. autoplay_step = -1;
  168. }
  169. }
  170. // bouton précedent
  171. $('a#autoplay_previous').click(function(){autoplay_previous();});
  172. // bouton suivant
  173. $('a#autoplay_next').click(function(){autoplay_next();});
  174. // Fermeture de la lecture auto
  175. $('a#autoplay_close').click(function(){
  176. // Fond gris
  177. $('#fade').fadeOut(1000, function(){$('#fade').remove();});
  178. // On cache le lecteur
  179. $('#autoplay').hide();
  180. // On vide le dom du lecteur
  181. $('div#'+autoplay_player_div_id+'_container').html('<div id="'+autoplay_player_div_id+'"></div>');
  182. // Plus rien de dois être lu
  183. autoplay_pause_all_players();
  184. });
  185. /*
  186. *
  187. *
  188. *
  189. * Fonction youtube.com et youtu.be
  190. *
  191. *
  192. *
  193. */
  194. // Création du lecteur FLASH youtube
  195. function youtube_create_player(ref_id)
  196. {
  197. // Préparation du terrain
  198. autoplay_clean_for_player_creation();
  199. var playerapiid = "ytplayerapiid";
  200. var params = {allowScriptAccess: "always"};
  201. var atts = {id: autoplay_player_id};
  202. swfobject.embedSWF(
  203. "http://www.youtube.com/v/"+ref_id+"?enablejsapi=1&playerapiid="+playerapiid+"&version=3",
  204. autoplay_player_div_id,
  205. "425",
  206. "356",
  207. "8",
  208. null,
  209. null,
  210. params,
  211. atts
  212. );
  213. }
  214. // Fonction appelé par l'ActionScript (flash) du lecteur youtube quand il est prêt
  215. window.onYouTubePlayerReady = function()
  216. {
  217. autoplay_player = document.getElementById(autoplay_player_id);
  218. autoplay_player.addEventListener("onStateChange", "youtube_StateChange");
  219. autoplay_player.addEventListener("onError", "youtube_error");
  220. $('img#autoplay_loader').hide();
  221. youtube_play();
  222. }
  223. // Fonction appelé par le lecteur youtube quand il change d'état
  224. window.youtube_StateChange = function(newState)
  225. {
  226. // Lorsque la lecture est terminé
  227. if (newState === 0)
  228. {
  229. autoplay_next();
  230. }
  231. }
  232. // Fonction appelé par le lecteur youtube quand il y a une erreur
  233. window.youtube_error = function(newState)
  234. {
  235. autoplay_next();
  236. }
  237. // Lecture
  238. function youtube_play()
  239. {
  240. if (autoplay_player)
  241. {
  242. autoplay_player.playVideo();
  243. }
  244. }
  245. /*
  246. *
  247. *
  248. * Fonctions soundcloud
  249. *
  250. *
  251. *
  252. */
  253. function soundcloud_create_player(ref_id, ref_url)
  254. {
  255. // Préparation du terrain
  256. autoplay_clean_for_player_creation();
  257. // Variable dans lequelle on met l'index dela track lu précedamment
  258. var index_track_previous = 0;
  259. if (!$('iframe#soundcloud_iframe_player').length)
  260. {
  261. $('div#autoplay_player_soundcloud').show();
  262. // TODO: on garde ?
  263. SC.initialize({
  264. client_id: '39946ea18e3d78d64c0ac95a025794e1'
  265. });
  266. // Aucun lecteur soundcloud n'a été ouvert pour le moment
  267. $('#autoplay_player_soundcloud').html(
  268. '<iframe id="soundcloud_iframe_player" src="http://w.soundcloud.com/player/?url='
  269. +ref_url+'&show_artwork=false&auto_play=true" width="100%" '
  270. +'height="370" scrolling="no" frameborder="no"></iframe>'
  271. );
  272. //console.debug(document.getElementById('sc-widget_'+ref_id));
  273. var widgetIframe = document.getElementById('soundcloud_iframe_player');
  274. autoplay_player_soundcloud = SC.Widget(widgetIframe);
  275. SC.get(ref_url, function(track, error) {
  276. if (error)
  277. {
  278. // En cas d'erreur on passe a al suivante
  279. autoplay_next();
  280. }
  281. else
  282. {
  283. // Lorsque le lecteur est prêt on lance la lecture
  284. autoplay_player_soundcloud.bind(SC.Widget.Events.READY, function ()
  285. {
  286. autoplay_player_soundcloud.play();
  287. $('img#autoplay_loader').hide();
  288. });
  289. autoplay_player_soundcloud.bind(SC.Widget.Events.PLAY, function ()
  290. {
  291. // Lorsque le lecteur commence une lecture
  292. // On garde en mémoire l'index de la lecture en cours
  293. autoplay_player_soundcloud.getCurrentSoundIndex(function(value){
  294. index_track_previous = value;
  295. });
  296. });
  297. // Lorsque le lecteur a terminé sa lecture, on passe au suivant
  298. autoplay_player_soundcloud.bind(SC.Widget.Events.FINISH, function ()
  299. {
  300. // Cette variable contient le nombre de pistes dans la liste de lecture
  301. var track_count = 1;
  302. autoplay_player_soundcloud.getSounds(function(value){
  303. // On récupère le nomre de pistes
  304. track_count = value.length;
  305. });
  306. autoplay_player_soundcloud.getCurrentSoundIndex(function(value){
  307. // Si la index_track_previous est la même maintenant que la piste
  308. // est terminé, c'est que l'on est arrivé en fin de liste.
  309. // Cependant, si c'est une liste avec une piste unique, on passe
  310. // tout de suite a la suite
  311. if (value == index_track_previous || track_count == 1)
  312. {
  313. autoplay_next();
  314. }
  315. // Sinon on prend al nouvelle valeur
  316. index_track_previous = value;
  317. });
  318. });
  319. }
  320. });
  321. }
  322. else
  323. {
  324. SC.get(ref_url, function(track, error) {
  325. if (error)
  326. {
  327. // En cas d'erreur on passe a al suivante
  328. console.log('Not found!');
  329. autoplay_next();
  330. }
  331. else
  332. {
  333. // Le lecteur iframe existait déjà
  334. $('div#autoplay_player_soundcloud').show();
  335. autoplay_player_soundcloud.load(ref_url+'&show_artwork=false&auto_play=true');
  336. //autoplay_player_soundcloud.play();
  337. $('img#autoplay_loader').hide();
  338. }
  339. });
  340. }
  341. }
  342. function soundcloud_stop_player()
  343. {
  344. if (autoplay_player_soundcloud)
  345. {
  346. autoplay_player_soundcloud.pause();
  347. }
  348. $('div#autoplay_player_soundcloud').hide();
  349. }
  350. });