Dashboard sipadu mbip
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

aui-audio.js 6.3KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307
  1. AUI.add('aui-audio', function(A) {
  2. var AObject = A.Object,
  3. Lang = A.Lang,
  4. UA = A.UA,
  5. DOC = A.config.doc,
  6. NAME = 'audio',
  7. getClassName = A.getClassName,
  8. CSS_AUDIO = getClassName(NAME),
  9. CSS_AUDIO_NODE = getClassName(NAME, 'node'),
  10. DEFAULT_PLAYER_PATH = A.config.base + 'aui-audio/assets/player.swf',
  11. FIXED_ATTRIBUTES = 'fixedAttributes',
  12. FLASH_VARS = 'flashVars',
  13. MP3 = 'mp3',
  14. OGG_URL = 'oggUrl',
  15. SRC = 'src',
  16. SWF_URL = 'swfUrl',
  17. URL = 'url',
  18. REGEX_FILE_EXTENSION = /\.([^\.]+)$/;
  19. var Audio = A.Component.create(
  20. {
  21. NAME: NAME,
  22. ATTRS: {
  23. url: {
  24. value: '',
  25. validator: Lang.isString
  26. },
  27. oggUrl: {
  28. value: '',
  29. validator: Lang.isString
  30. },
  31. type: {
  32. value: MP3,
  33. validator: Lang.isString
  34. },
  35. swfWidth: {
  36. value: '100%',
  37. validator: Lang.isString
  38. },
  39. swfHeight: {
  40. value: '30',
  41. validator: Lang.isString
  42. },
  43. swfUrl: {
  44. value: DEFAULT_PLAYER_PATH,
  45. validator: Lang.isString
  46. },
  47. fixedAttributes: {
  48. value: {},
  49. validator: Lang.isObject
  50. },
  51. flashVars: {
  52. value: {},
  53. validator: Lang.isObject
  54. },
  55. render: {
  56. value: true,
  57. validator: Lang.isBoolean
  58. }
  59. },
  60. BIND_UI_ATTRS: [URL, OGG_URL, SWF_URL, FIXED_ATTRIBUTES, FLASH_VARS],
  61. SYNC_UI_ATTRS: [URL, OGG_URL],
  62. prototype: {
  63. renderUI: function () {
  64. var instance = this;
  65. instance._renderAudioTask = A.debounce(instance._renderAudio, 1, instance);
  66. instance._renderSwfTask = A.debounce(instance._renderSwf, 1, instance);
  67. instance._renderAudio(!instance.get(OGG_URL));
  68. },
  69. bindUI: function () {
  70. var instance = this;
  71. instance.publish(
  72. 'audioReady',
  73. {
  74. fireOnce: true
  75. }
  76. );
  77. },
  78. _createSource: function(type) {
  79. var sourceNode = new A.Node(DOC.createElement('source'));
  80. sourceNode.attr('type', type);
  81. return sourceNode;
  82. },
  83. _renderSwf: function () {
  84. var instance = this;
  85. var swfUrl = instance.get(SWF_URL);
  86. if (swfUrl) {
  87. var flashVars = instance.get(FLASH_VARS);
  88. instance._setMedia(flashVars);
  89. var flashVarString = A.QueryString.stringify(flashVars);
  90. if (instance._swfId) {
  91. instance._audio.removeChild(A.one('#' + instance._swfId));
  92. }
  93. else {
  94. instance._swfId = A.guid();
  95. }
  96. var applicationType = 'type="application/x-shockwave-flash" data="' + swfUrl + '"';
  97. var movie = '';
  98. if (UA.ie) {
  99. applicationType = 'classid="clsid:d27cdb6e-ae6d-11cf-96b8-444553540000"';
  100. movie = '<param name="movie" value="' + swfUrl + '"/>';
  101. }
  102. var fixedAttributes = instance.get(FIXED_ATTRIBUTES);
  103. var fixedAttributesParam = [];
  104. for (var attributeName in fixedAttributes) {
  105. if (AObject.owns(fixedAttributes, attributeName)) {
  106. fixedAttributesParam.push('<param name="', attributeName, '" value="', fixedAttributes[attributeName], '" />');
  107. }
  108. }
  109. var flashVarsParam = '';
  110. if (flashVarString) {
  111. flashVarsParam = '<param name="flashVars" value="' + flashVarString + '" />';
  112. }
  113. var height = instance.get('swfHeight');
  114. var width = instance.get('swfWidth');
  115. var tplObj = Lang.sub(
  116. Audio.TPL_FLASH,
  117. {
  118. applicationType: applicationType,
  119. id: instance._swfId,
  120. fixedAttributes: fixedAttributesParam.join(''),
  121. flashVars: flashVarsParam,
  122. height: height,
  123. movie: movie,
  124. width: width
  125. }
  126. );
  127. instance._audio.append(tplObj);
  128. }
  129. },
  130. _renderAudio: function(fallback) {
  131. var instance = this;
  132. var tpl = Audio.TPL_AUDIO;
  133. if (UA.gecko && fallback) {
  134. tpl = Audio.TPL_AUDIO_FALLBACK;
  135. }
  136. var tplObj = Lang.sub(tpl, [A.guid()]);
  137. var audio = A.Node.create(tplObj);
  138. instance.get('contentBox').append(audio);
  139. instance._audio = audio;
  140. return audio;
  141. },
  142. _setMedia: function(flashVars) {
  143. var instance = this;
  144. if (!AObject.owns(flashVars, MP3) && !AObject.owns(flashVars, 'mp4') && !AObject.owns(flashVars, 'flv')) {
  145. var audioUrl = instance.get(URL);
  146. var type = instance.get('type');
  147. if (!type) {
  148. var typeMatch = REGEX_FILE_EXTENSION.exec(audioUrl);
  149. if (typeMatch) {
  150. type = typeMatch[1];
  151. }
  152. }
  153. flashVars[type] = audioUrl;
  154. }
  155. },
  156. _uiSetFixedAttributes: function (val) {
  157. var instance = this;
  158. instance._renderSwfTask();
  159. },
  160. _uiSetFlashVars: function (val) {
  161. var instance = this;
  162. instance._renderSwfTask();
  163. },
  164. _uiSetOggUrl: function (val) {
  165. var instance = this;
  166. if (UA.gecko || UA.opera) {
  167. var audio = instance._audio;
  168. var usingAudio = instance._usingAudio();
  169. if ((!val && usingAudio) || (val && !usingAudio)) {
  170. audio.remove(true);
  171. audio = instance._renderAudio(!val);
  172. }
  173. if (!val) {
  174. instance._renderSwfTask();
  175. }
  176. else {
  177. var sourceOgg = instance._sourceOgg;
  178. if (!sourceOgg) {
  179. sourceOgg = instance._createSource('audio/ogg');
  180. audio.append(sourceOgg);
  181. instance._sourceOgg = sourceOgg;
  182. }
  183. sourceOgg.attr(SRC, val);
  184. }
  185. }
  186. },
  187. _uiSetSwfUrl: function (val) {
  188. var instance = this;
  189. instance._renderSwfTask();
  190. },
  191. _uiSetUrl: function (val) {
  192. var instance = this;
  193. var oggUrl = instance.get(OGG_URL);
  194. var audio = instance._audio;
  195. var sourceMp3 = instance._sourceMp3;
  196. if (UA.gecko && !instance._usingAudio()) {
  197. if (sourceMp3 != null) {
  198. sourceMp3.remove(true);
  199. instance._sourceMp3 = null;
  200. }
  201. }
  202. else
  203. {
  204. if (audio || !oggUrl) {
  205. if (!sourceMp3) {
  206. sourceMp3 = instance._createSource('audio/mp3');
  207. audio.append(sourceMp3);
  208. instance._sourceMp3 = sourceMp3;
  209. }
  210. sourceMp3.attr(SRC, val);
  211. }
  212. }
  213. instance._renderSwfTask();
  214. },
  215. _usingAudio: function() {
  216. var instance = this;
  217. return (instance._audio.get('nodeName').toLowerCase() == 'audio');
  218. }
  219. }
  220. }
  221. );
  222. Audio.TPL_AUDIO = '<audio id="{0}" controls class="' + CSS_AUDIO_NODE + '"></audio>';
  223. Audio.TPL_AUDIO_FALLBACK = '<div class="' + CSS_AUDIO_NODE + '"></div>';
  224. Audio.TPL_FLASH = '<object id="{id}" {applicationType} height="{height}" width="{width}">{movie}{fixedAttributes}{flashVars}</object>';
  225. A.Audio = Audio;
  226. }, '@VERSION@' ,{skinnable:true, requires:['aui-base','querystring-stringify-simple']});