Guest User

Untitled

a guest
Jun 25th, 2013
196
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 5.71 KB | None | 0 0
  1. // funções Java Script ( MEDIA GROUP com base em HTML DOMContentLoader)
  2.  
  3. (function( window, document, mediagroup ) { //janela, grupo, documento MediaGrupo, sincronização do grupo
  4.  
  5. var requestAnimFrame = (function( window ) {
  6. var suffix = "equestAnimationFrame",
  7. rAF = [ "r", "webkitR", "mozR", "msR", "oR" ].filter(function( val ) {
  8. return val + suffix in window;
  9. })[ 0 ] + suffix;
  10.  
  11. return window[ rAF ] || function( callback, element ) {
  12. window.setTimeout(function() {
  13. callback( +new Date() );
  14. }, 1000 / 60);
  15. };
  16. })( window );
  17.  
  18. // Converte o DOMContentLoader num Array (Matriz)
  19.  
  20. Array.from = function( arrayish ) {
  21. return [].slice.call( arrayish );
  22. };
  23.  
  24. function mediaGroupSync( controller, slaves ) { // identifica os filhos "slaves" e sincronização
  25.  
  26. if ( slaves.length ) {
  27. slaves.forEach(function( slave ) {
  28. if ( slave.currentTime !== controller.currentTime ) {
  29. slave.currentTime = controller.currentTime;
  30. }
  31. });
  32. }
  33.  
  34. requestAnimFrame(function() {
  35. mediaGroupSync( controller, slaves );
  36. });
  37. }
  38.  
  39. function mediaGroupListeners( controller, slaves, callback ) {
  40.  
  41. // var events = [ "play", "pause" ];
  42. //
  43. // Associar eventos em todos os elementos escravos
  44. // events.forEach(function( type, i ) {
  45. //
  46. // Define eventos dos Ouvintes "filhos" para o elemento controlador pai
  47. // controller.addEventListener( type, function() {
  48. //
  49. // var evt = document.createEvent( "Events" );
  50. //
  51. // evt.initEvent(
  52. // type, true, true, window
  53. // );
  54. //
  55. // Delega eventos para escravos "filhos"
  56. // slaves.forEach(function( slave ) {
  57. // slave.dispatchEvent( evt );
  58. // });
  59. // });
  60. //
  61. // if ( (i + 1) === events.length ) {
  62. // callback();
  63. // }
  64. // });
  65.  
  66. callback();
  67. }
  68.  
  69. function mediaGroup( group, elements ) { // função de Grupo e elementos
  70.  
  71. var controller, slaves,
  72. ready = 0;
  73.  
  74. // Pega no elemento controlador único
  75. controller = elements.filter(function( elem ) {
  76. return !!elem.controls || elem.getAttribute("controls", true);
  77. })[ 0 ];
  78.  
  79. // filtro para todos os elementos que irão
  80. // ser controlados pelo elemento controlador unico
  81. slaves = elements.filter(function( elem ) {
  82. return !elem.controls;
  83. });
  84.  
  85. if ( !controller ) {
  86. return;
  87. }
  88.  
  89. // verifica que os elementos não são mainpulados "canplay"
  90. function canPlay() {
  91.  
  92. if ( ++ready === elements.length ) {
  93.  
  94. // Agora é seguro reproduzir o vídeo, remove os controlos
  95. elements.forEach(function( elem ) {
  96. elem.removeEventListener( "canplay", canPlay, false );
  97. });
  98.  
  99. mediaGroupListeners( controller, elements, function() {
  100. mediaGroupSync( controller, slaves );
  101. });
  102. }
  103. }
  104.  
  105. // Integra todos os elementos no conjunto MediaGroup
  106. // adiciona "canplay" aos filhos e garante que estão com tempos correctos
  107. // procura elemento de midia se ainda não foi encontrado
  108.  
  109. elements.forEach(function( elem ) {
  110.  
  111. // Define o elemento real IDL Propriedade "mediaGroup"
  112. elem.mediaGroup = elem.getAttribute( mediagroup );
  113.  
  114. elem.addEventListener( "canplay", canPlay, false );
  115. });
  116. }
  117.  
  118. function mediaGroupSetup( selector ) {
  119. // Declare referências
  120. // NodeList de todos os elementos com "MediaGroup" atribuidos
  121. // elements: `nodelist` como matriz verdadeira
  122. // filtereds: objeto cujas propriedades tem valor de atributo numa `MediaGroup`
  123. // Com os valores que são matrizes de elementos correspondentes
  124. // mediagroups: matriz única de cada nome MediaGroup
  125. var nodelist = document.querySelectorAll( selector || "[" + mediagroup + "]" ),
  126. elements = Array.from( nodelist ),
  127. filtereds = {},
  128. mediagroups;
  129.  
  130. // Condição, somente se nenhum "mediaGroup" existir
  131. elements = elements.filter(function( elem ) {
  132. return !elem.mediaGroup;
  133. });
  134.  
  135. // Filtro por GroupName "retornará True ou False"
  136. mediagroups = elements.map(function( elem ) {
  137. return elem.getAttribute( mediagroup );
  138. }).filter(function( val, i, array ) {
  139. if ( !filtereds[ val ] ) {
  140. filtereds[ val ] = elements.filter(function( elem ) {
  141. return elem.getAttribute( mediagroup ) === val;
  142. });
  143. return true;
  144. }
  145. return false;
  146. });
  147.  
  148. // Captura todos os nomes MediaGroup recolhidos
  149. // Chama todos os MediaGroup() com o nome de grupo e respectivos parametros
  150. mediagroups.forEach(function( group ) {
  151. mediaGroup( group, filtereds[ group ] );
  152. });
  153. }
  154.  
  155. // Faz escuta para eventos com alteração
  156. [ "DOMNodeInserted", "DOMAttrModified" ].forEach(function( mutation ) {
  157.  
  158. document.addEventListener( mutation, function( event ) {
  159.  
  160. // Detecta se existe recursos para apoio MediaGroup
  161. // se é TRUE volta e não faz nada.
  162. if ( "mediaGroup" in document.createElement("video") ) {
  163. return;
  164. }
  165.  
  166. var element = event.target,
  167. valid = [ "AUDIO", "VIDEO" ].some(function( val ) {
  168. return element.nodeName === val;
  169. });
  170.  
  171. if ( valid && !element.mediaGroup &&
  172. (element.controls || element.getAttribute("controls") === "true") ) {
  173.  
  174. window.setTimeout(function() {
  175. mediaGroupSetup( "[" + mediagroup + "='" + element.getAttribute( mediagroup ) + "']" );
  176. }, 100 );
  177. }
  178. });
  179. });
  180.  
  181. // Cria automaticamente defenições para o MediaGroup quando o "DOM" está pronto
  182. document.addEventListener( "DOMContentLoaded", function() {
  183.  
  184. // Detect o apoio MediaGroup
  185. // Se não existe, não faz nada.
  186. if ( "mediaGroup" in document.createElement("video") ) {
  187. return;
  188. }
  189.  
  190. mediaGroupSetup();
  191.  
  192. }, false );
  193.  
  194. // Garantia para que novos elementos adicionados, sejam reconhecidos pelo "MediaGroup"
  195.  
  196. })( this, this.document, "mediagroup" );
Advertisement
Add Comment
Please, Sign In to add comment