APIs

Show:
  1. /**
  2. * BlockYouTube block resides inside a scene or timeline
  3. * @class BlockYouTube
  4. * @extends Block
  5. * @constructor
  6. * @param {string} i_placement location where objects resides which can be scene or timeline
  7. * @param {string} i_campaign_timeline_chanel_player_id required and set as block id when block is inserted onto timeline_channel
  8. * @return {Object} Block instance
  9. */
  10. define(['jquery', 'backbone', 'Block'], function ($, Backbone, Block) {
  11.  
  12. var BlockYouTube = Block.extend({
  13.  
  14. /**
  15. Constructor
  16. @method initialize
  17. **/
  18. constructor: function (options) {
  19. var self = this;
  20. self.m_blockType = 4600;
  21. _.extend(options, {blockType: self.m_blockType});
  22. Block.prototype.constructor.call(this, options);
  23. self._initSubPanel(Elements.BLOCK_YOUTUBE_COMMON_PROPERTIES);
  24. self.m_youtubeQualityMeter = self.m_blockProperty.getYouTubeQualityMeter();
  25. self._listenQualityChange();
  26. self._listenVolumeChange();
  27. self._listenPlaylistDropDownChange();
  28. self._listenCountryChange();
  29. self._listenVideoIdChange();
  30. self._listenAddVideoId();
  31. },
  32.  
  33. /**
  34. Listen to when a video id change in input box
  35. @method _listenVideoIdChange
  36. **/
  37. _listenVideoIdChange: function () {
  38. var self = this;
  39. // remove previous listeners and create fresh one,
  40. // have to run before we override self.m_inputVideoIdChangeHandler
  41. if (self.m_inputVideoIdChangeHandler)
  42. $(Elements.CLASS_YOUTUBE_VIDEO_ID).off("input", self.m_inputVideoIdChangeHandler);
  43. self.m_inputVideoIdChangeHandler = _.debounce(function (e) {
  44. if (!self.m_selected)
  45. return;
  46. var videoList = [];
  47. var domPlayerData = self._getBlockPlayerData();
  48. $(domPlayerData).find('VideoIdList').remove();
  49. var xSnippetYouTubeManualList = $(domPlayerData).find('YouTube');
  50. $(Elements.YOUTTUBE_VIDEOIDS).find('input').each(function (i, elem) {
  51. videoList.push($(elem).val());
  52. });
  53. videoList = videoList.join(',');
  54. $(xSnippetYouTubeManualList).append($('<VideoIdList>' + videoList + '</VideoIdList>'));
  55. self._setBlockPlayerData(pepper.xmlToStringIEfix(domPlayerData), BB.CONSTS.NO_NOTIFICATION, true);
  56. }, 250, false);
  57. $(Elements.CLASS_YOUTUBE_VIDEO_ID).on("input", self.m_inputVideoIdChangeHandler);
  58. },
  59.  
  60. /**
  61. Listen to removal of a video id from list
  62. @method self._listenVideoIdChange();
  63. **/
  64. _listenRemoveVideoId: function () {
  65. var self = this;
  66. // remove previous listeners and create fresh one,
  67. // have to run before we override self.m_removeVideoID
  68. if (self.m_removeVideoID)
  69. $(Elements.CLASS_YOUTUBE_VIDEO_ID_REMOVE).off('click', self.m_removeVideoID);
  70. self.m_removeVideoID = function (e) {
  71. if (!self.m_selected)
  72. return;
  73. var videoID = $(e.target).siblings('input').val();
  74. $(e.target).siblings('input').remove();
  75. $(e.target).remove();
  76. var domPlayerData = self._getBlockPlayerData();
  77. var xYouTubeSnippet = $(domPlayerData).find('YouTube');
  78. var xVideoListSnippet = $(domPlayerData).find('VideoIdList');
  79. var videoIDs = $(xVideoListSnippet).text();
  80. videoIDs = videoIDs.split(',');
  81. $(xVideoListSnippet).remove();
  82. var index = _.indexOf(videoIDs, videoID);
  83. videoIDs.splice(index, 1);
  84. videoIDs = videoIDs.join(',');
  85. $(xYouTubeSnippet).append($('<VideoIdList>' + videoIDs + '</VideoIdList>'));
  86. self._setBlockPlayerData(pepper.xmlToStringIEfix(domPlayerData), BB.CONSTS.NO_NOTIFICATION, true);
  87. };
  88. $(Elements.CLASS_YOUTUBE_VIDEO_ID_REMOVE).on('click', self.m_removeVideoID);
  89. },
  90.  
  91. /**
  92. Listen to addition of video id to list
  93. @method _listenAddVideoId
  94. **/
  95. _listenAddVideoId: function () {
  96. var self = this;
  97. self.m_addVideoID = function (e) {
  98. if (!self.m_selected)
  99. return;
  100. self._appendVideoIdInput('');
  101. self._listenRemoveVideoId();
  102. self._listenVideoIdChange();
  103. };
  104. $(Elements.YOUTUBE_LIST_ADD).on('click', self.m_addVideoID);
  105. },
  106.  
  107. /**
  108. Listen to playlist changes dropdown
  109. @method _listenPlaylistDropDownChange
  110. **/
  111. _listenCountryChange: function () {
  112. var self = this;
  113. self.m_countryListChange = function (e) {
  114. if (!self.m_selected)
  115. return;
  116. var listRegion = $(e.target).closest('li').attr('name');
  117. if (_.isUndefined(listRegion))
  118. return;
  119. self._populatePlaylistCountryFlag(listRegion);
  120. var domPlayerData = self._getBlockPlayerData();
  121. var xSnippet = $(domPlayerData).find('YouTube');
  122. $(xSnippet).attr('listRegion', listRegion);
  123. self._setBlockPlayerData(pepper.xmlToStringIEfix(domPlayerData), BB.CONSTS.NO_NOTIFICATION, true);
  124. };
  125. $(Elements.YOUTUBE_COUNTRY_LIST_DROPDOWN).on('click', self.m_countryListChange);
  126. },
  127.  
  128. /**
  129. Listen to playlist changes dropdown
  130. @method _listenPlaylistDropDownChange
  131. **/
  132. _listenPlaylistDropDownChange: function () {
  133. var self = this;
  134. self.m_playlistChange = function (e) {
  135. if (!self.m_selected)
  136. return;
  137. var listType = $(e.target).attr('name');
  138. if (_.isUndefined(listType))
  139. return;
  140. var listLabel = $(e.target).text();
  141. self._populatePlaylistLabel(listLabel);
  142. self._populateToggleListType(listType)
  143. var domPlayerData = self._getBlockPlayerData();
  144. var xSnippet = $(domPlayerData).find('YouTube');
  145. $(xSnippet).attr('listType', listType);
  146. $(xSnippet).find('VideoIdList').remove();
  147. if (listType == 'manually') {
  148. $(xSnippet).append($('<VideoIdList>9bZkp7q19f0</VideoIdList>'));
  149. // have to look for videoislist as lower case due to .append $(x) inject case change
  150. var xSnippetYouTubeManualList = $(domPlayerData).find('videoidlist');
  151. self._populateManualList(xSnippetYouTubeManualList);
  152. } else {
  153. $(xSnippet).find('VideoIdList').remove();
  154. }
  155. self._setBlockPlayerData(pepper.xmlToStringIEfix(domPlayerData), BB.CONSTS.NO_NOTIFICATION, true);
  156.  
  157. };
  158. $(Elements.YOUTUBE_LIST_DROPDOWN).on('click', self.m_playlistChange);
  159. },
  160.  
  161. /**
  162. Listen to changes in volume control
  163. @method _listenVolumeChange
  164. **/
  165. _listenVolumeChange: function () {
  166. var self = this;
  167. self.m_inputVolumeHandler = function (e) {
  168. if (!self.m_selected)
  169. return;
  170. var volume = e.edata;
  171. var domPlayerData = self._getBlockPlayerData();
  172. var xSnippet = $(domPlayerData).find('YouTube');
  173. $(xSnippet).attr('volume', volume);
  174. self._setBlockPlayerData(pepper.xmlToStringIEfix(domPlayerData), BB.CONSTS.NO_NOTIFICATION, true);
  175. };
  176. BB.comBroker.listen(BB.EVENTS.YOUTUBE_VOLUME_CHANGED, self.m_inputVolumeHandler);
  177. },
  178.  
  179. /**
  180. Listen to changes in volume control
  181. @method _listenVolumeChange
  182. **/
  183. _listenQualityChange: function () {
  184. var self = this;
  185. self.m_inputQualityHandler = function (e) {
  186. if (!self.m_selected)
  187. return;
  188. var value = e.edata;
  189. switch (value) {
  190. case 1:
  191. {
  192. value = 'small';
  193. break;
  194. }
  195. case 2:
  196. {
  197. value = 'medium';
  198. break;
  199. }
  200. case 3:
  201. {
  202. value = 'default';
  203. break;
  204. }
  205. case 4:
  206. {
  207. value = 'large';
  208. break;
  209. }
  210. case 5:
  211. {
  212. value = 'hd720';
  213. break;
  214. }
  215. }
  216. var domPlayerData = self._getBlockPlayerData();
  217. $(domPlayerData).find('YouTube').attr('quality', value);
  218. self._setBlockPlayerData(domPlayerData);
  219. };
  220. BB.comBroker.listen(BB.EVENTS.YOUTUBE_METER_QUALITY_CHANGED, self.m_inputQualityHandler);
  221. },
  222.  
  223. /**
  224. Load up property values in the common panel
  225. @method _populate
  226. @return none
  227. **/
  228. _populate: function () {
  229. var self = this;
  230. var domPlayerData = self._getBlockPlayerData();
  231. var xSnippetYouTube = $(domPlayerData).find('YouTube');
  232. var xSnippetYouTubeManualList = $(domPlayerData).find('VideoIdList');
  233. var listType = $(xSnippetYouTube).attr('listType');
  234. var listRegion = $(xSnippetYouTube).attr('listRegion');
  235. var label = listType == 'manually' ? $(Elements.BOOTBOX_CUSTOM_LIST).text() : $(Elements.BOOTBOX_MOST_VIEWED).text();
  236. self._populateQuality(xSnippetYouTube);
  237. self._populatePlaylistLabel(label);
  238. self._populateToggleListType(listType);
  239. self._populatePlaylistCountryFlag(listRegion);
  240. self._populateManualList(xSnippetYouTubeManualList);
  241. },
  242.  
  243. /**
  244. Populate the youtube country flag
  245. @method _populatePlaylistCountryFlag
  246. @params {String} i_listRegion
  247. **/
  248. _populatePlaylistCountryFlag: function (i_listRegion) {
  249. var self = this;
  250. $(Elements.CLASS_YOUTUBE_FLAG).removeClass(BB.lib.unclass(Elements.CLASS_SELECTED_YOUTUBE_FLAG));
  251. $(Elements.CLASS_YOUTUBE_FLAG).each(function (e) {
  252. if ($(this).attr('name') == i_listRegion)
  253. $(this).addClass(BB.lib.unclass(Elements.CLASS_SELECTED_YOUTUBE_FLAG));
  254. });
  255. },
  256.  
  257. /**
  258. Populate the youtube playlist label (most viewed / custom list)
  259. @method _populatePlaylistLabel
  260. @params {String} i_label
  261. **/
  262. _populatePlaylistLabel: function (i_label) {
  263. var self = this;
  264. $(Elements.YOUTUBE_MOST_VIEWED).text(i_label);
  265. },
  266.  
  267. /**
  268. Toggle the view of proper list selection (most viewed / custom list)
  269. @method _populateToggleListType
  270. @params {String} i_listType
  271. **/
  272. _populateToggleListType: function (i_listType) {
  273. var self = this;
  274. if (i_listType == 'manually') {
  275. $(Elements.YOUTUBE_CUSTOM_LIST).show();
  276. $(Elements.YOUTUBE_MOST_VIEWED_LIST).hide();
  277. $(Elements.YOUTUBE_LIST_ADD).show();
  278. $(Elements.YOUTUBE_LIST_REMOVE).show();
  279. } else {
  280. $(Elements.YOUTUBE_CUSTOM_LIST).hide();
  281. $(Elements.YOUTUBE_MOST_VIEWED_LIST).show();
  282. $(Elements.YOUTUBE_LIST_ADD).hide();
  283. $(Elements.YOUTUBE_LIST_REMOVE).hide();
  284. }
  285. },
  286.  
  287. /**
  288. Update the UI with list of youtube videos inserted by user
  289. @method _populateManualList
  290. @params {Object} i_xSnippetYouTube
  291. **/
  292. _populateManualList: function (i_xSnippetYouTubeManualList) {
  293. var self = this;
  294. $(Elements.YOUTTUBE_VIDEOIDS).empty();
  295. var videoIDs = $(i_xSnippetYouTubeManualList).text();
  296. videoIDs = videoIDs.split(',');
  297. _.each(videoIDs, function (videoID) {
  298. self._appendVideoIdInput(videoID);
  299. });
  300. self._listenVideoIdChange();
  301. self._listenRemoveVideoId();
  302. },
  303.  
  304. /**
  305. Append a video id to the input list
  306. @method _appendVideoIdInput
  307. @param {String} i_videoId
  308. **/
  309. _appendVideoIdInput: function (i_videoId) {
  310. var self = this;
  311. var snippet = '<span><input class="' + BB.lib.unclass(Elements.CLASS_YOUTUBE_VIDEO_ID) + ' form-control" value="' + i_videoId + '"><i class="' + BB.lib.unclass(Elements.CLASS_YOUTUBE_VIDEO_ID_REMOVE) + ' fa fa-times"/></span>';
  312. $(Elements.YOUTTUBE_VIDEOIDS).append($(snippet));
  313. },
  314.  
  315. /**
  316. Populate the youtube video quality meter
  317. @method _populateQuality
  318. @param {Object} i_xSnippetYouTube
  319. **/
  320. _populateQuality: function (i_xSnippetYouTube) {
  321. var self = this;
  322. var volume = parseFloat(i_xSnippetYouTube.attr('volume')) * 100;
  323. $(Elements.YOUTUBE_VOLUME_WRAP_SLIDER).val(volume);
  324. var value = $(i_xSnippetYouTube).attr('quality');
  325. switch (value) {
  326. case 'small':
  327. {
  328. value = 1;
  329. break;
  330. }
  331. case 'medium':
  332. {
  333. value = 2;
  334. break;
  335. }
  336. case 'default':
  337. {
  338. value = 3;
  339. break;
  340. }
  341. case 'large':
  342. {
  343. value = 4;
  344. break;
  345. }
  346. case 'hd720':
  347. {
  348. value = 5;
  349. break;
  350. }
  351. }
  352. self.m_youtubeQualityMeter.setMeter(value);
  353. },
  354.  
  355. /**
  356. Populate the common block properties panel, called from base class if exists
  357. @method _loadBlockSpecificProps
  358. @return none
  359. **/
  360. _loadBlockSpecificProps: function () {
  361. var self = this;
  362. self._populate();
  363. this._viewSubPanel(Elements.BLOCK_YOUTUBE_COMMON_PROPERTIES);
  364. },
  365.  
  366. /**
  367. Delete this block
  368. @method deleteBlock
  369. @params {Boolean} i_memoryOnly if true only remove from existance but not from msdb
  370. **/
  371. deleteBlock: function (i_memoryOnly) {
  372. var self = this;
  373. $(Elements.CLASS_YOUTUBE_VIDEO_ID).off("input", self.m_inputVideoIdChangeHandler);
  374. $(Elements.YOUTUBE_LIST_DROPDOWN).off('click', self.m_playlistChange);
  375. $(Elements.YOUTUBE_COUNTRY_LIST_DROPDOWN).off('click', self.m_countryListChange);
  376. $(Elements.YOUTUBE_LIST_ADD).off('click', self.m_addVideoID);
  377. $(Elements.CLASS_YOUTUBE_VIDEO_ID_REMOVE).off('click', self.m_removeVideoID);
  378. BB.comBroker.stopListen(BB.EVENTS.YOUTUBE_METER_QUALITY_CHANGED, self.m_inputQualityHandler);
  379. BB.comBroker.stopListen(BB.EVENTS.YOUTUBE_VOLUME_CHANGED, self.m_inputVolumeHandler);
  380. self._deleteBlock(i_memoryOnly);
  381. }
  382. });
  383.  
  384. return BlockYouTube;
  385. });