autoplay.js 10KB

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