APIs

Show:
  1. /**
  2. factory to create blocks and block property
  3. @class BlockFactory
  4. @constructor
  5. @return {Object} instantiated BlockFactory
  6. **/
  7. define(['jquery', 'backbone', 'X2JS', 'fabric'], function ($, Backbone, X2JS, fabric) {
  8.  
  9. /**
  10. All blocks and related property modules loaded by require.js
  11. @event BLOCKS_LOADED
  12. @param {This} caller
  13. @static
  14. @final
  15. **/
  16. BB.EVENTS.BLOCKS_LOADED = 'BLOCKS_LOADED';
  17.  
  18. /**
  19. block.PLACEMENT_SCENE indicates the insertion is inside a Scene
  20. @property Block.PLACEMENT_SCENE
  21. @static
  22. @final
  23. @type String
  24. */
  25. BB.CONSTS.PLACEMENT_SCENE = 'PLACEMENT_SCENE';
  26.  
  27. /**
  28. block.PLACEMENT_CHANNEL indicates the insertion is on the timeline_channel
  29. @property Block.PLACEMENT_CHANNEL
  30. @static
  31. @final
  32. @type String
  33. */
  34. BB.CONSTS.PLACEMENT_CHANNEL = 'PLACEMENT_CHANNEL';
  35.  
  36. /**
  37. block.PLACEMENT_IS_SCENE indicates the insertion is itself a Scene
  38. @property Block.PLACEMENT_IS_SCENE
  39. @static
  40. @final
  41. @type String
  42. */
  43. BB.CONSTS.PLACEMENT_IS_SCENE = 'PLACEMENT_IS_SCENE';
  44.  
  45. /**
  46. block.PLACEMENT_LISTS indicates the insertion is inside a collection list such
  47. as the Collection Block or the Location based block. This event is used for example
  48. when building the list of available blocks in AddBlockView
  49. @property Block.PLACEMENT_LISTS
  50. @static
  51. @final
  52. @type String
  53. */
  54. BB.CONSTS.PLACEMENT_LISTS = 'PLACEMENT_LISTS';
  55.  
  56. BB.CONSTS.BLOCKCODE_SCENE = '3510';
  57. BB.CONSTS.BLOCKCODE_COLLECTION = '4100';
  58. BB.CONSTS.BLOCKCODE_TWITTER = '4500';
  59. BB.CONSTS.BLOCKCODE_TWITTER_ITEM = '4505';
  60. BB.CONSTS.BLOCKCODE_JSON = '4300';
  61. BB.CONSTS.BLOCKCODE_JSON_ITEM = '4310';
  62. BB.CONSTS.BLOCKCODE_WORLD_WEATHER = '6010';
  63. BB.CONSTS.BLOCKCODE_GOOGLE_SHEETS = '6022';
  64. BB.CONSTS.BLOCKCODE_CALENDAR = '6020';
  65. BB.CONSTS.BLOCKCODE_TWITTERV3 = '6230';
  66. BB.CONSTS.BLOCKCODE_INSTAGRAM = '6050';
  67. BB.CONSTS.BLOCKCODE_DIGG = '6000';
  68. BB.CONSTS.BLOCKCODE_IMAGE = '3130';
  69. BB.CONSTS.BLOCKCODE_SVG = '3140';
  70. BB.CONSTS.BLOCKCODE_VIDEO = '3100';
  71.  
  72. BB.SERVICES.BLOCK_FACTORY = 'BlockFactory';
  73.  
  74. var BlockFactory = BB.Controller.extend({
  75.  
  76. /**
  77. Constructor
  78. @method initialize
  79. @return {} Unique clientId.
  80. **/
  81. initialize: function () {
  82. var self = this;
  83. BB.comBroker.setService(BB.SERVICES['BLOCK_FACTORY'], self);
  84. self.x2js = new X2JS({
  85. escapeMode: true,
  86. attributePrefix: "_",
  87. arrayAccessForm: "none",
  88. emptyNodeForm: "text",
  89. enableToStringFunc: true,
  90. arrayAccessFormPaths: [],
  91. skipEmptyTextNodesForObj: true
  92. });
  93. BB.comBroker.setService('compX2JS', this.x2js);
  94. },
  95.  
  96. /**
  97. Load all block modules via require js and fire event to subscribers when all loaded
  98. @method loadBlockModules
  99. **/
  100. loadBlockModules: function () {
  101. var self = this;
  102.  
  103. require(['BlockProperties',
  104. 'Block',
  105. 'BlockScene',
  106. 'BlockRSS',
  107. 'BlockQR',
  108. 'BlockYouTube',
  109. 'BlockCollection',
  110. 'BlockLocation',
  111. 'BlockFasterQ',
  112. 'BlockTwitter',
  113. 'BlockTwitterItem',
  114. 'BlockJson',
  115. 'BlockJsonItem',
  116. 'BlockWorldWeather',
  117. 'BlockGoogleSheets',
  118. 'BlockTwitterV3',
  119. 'BlockInstagram',
  120. 'BlockDigg',
  121. 'BlockVideo',
  122. 'BlockImage',
  123. 'BlockSVG',
  124. 'BlockExtImage',
  125. 'BlockExtVideo',
  126. 'BlockMRSS',
  127. 'BlockHTML',
  128. 'BlockGoogleCalendar',
  129. 'BlockLabel',
  130. 'BlockClock'],
  131.  
  132. function (BlockProperties,
  133. Block, BlockScene,
  134. BlockRSS,
  135. BlockQR,
  136. BlockYouTube,
  137. BlockCollection,
  138. BlockLocation,
  139. BlockFasterQ,
  140. BlockTwitter,
  141. BlockTwitterItem,
  142. BlockJson,
  143. BlockJsonItem,
  144. BlockWorldWeather,
  145. BlockGoogleSheets,
  146. BlockTwitterV3,
  147. BlockInstagram,
  148. BlockDigg,
  149. BlockVideo,
  150. BlockImage,
  151. BlockSVG,
  152. BlockExtImage,
  153. BlockExtVideo,
  154. BlockMRSS,
  155. BlockHTML,
  156. BlockGoogleCalendar,
  157. BlockLabel,
  158. BlockClock) {
  159.  
  160. if (self.m_blockProperties)
  161. return;
  162.  
  163. self.m_blockProperties = new BlockProperties({el: Elements.BLOCK_PROPERTIES});
  164.  
  165. self.m_block = Block;
  166. self.m_blockScene = BlockScene;
  167. self.m_blockRSS = BlockRSS;
  168. self.m_blockQR = BlockQR;
  169. self.m_blockYouTube = BlockYouTube;
  170. self.m_blockCollection = BlockCollection;
  171. self.m_blockLocation = BlockLocation
  172. self.m_blockFasterQ = BlockFasterQ;
  173. self.m_blockTwitter = BlockTwitter;
  174. self.m_blockTwitterItem = BlockTwitterItem;
  175. self.m_blockJson = BlockJson;
  176. self.m_blockJsonItem = BlockJsonItem;
  177. self.m_blockWorldWeather = BlockWorldWeather;
  178. self.m_blockGoogleSheets = BlockGoogleSheets;
  179. self.m_blockTwitterV3 = BlockTwitterV3;
  180. self.m_blockInstagram = BlockInstagram;
  181. self.m_blockDigg = BlockDigg;
  182. self.m_blockVideo = BlockVideo;
  183. self.m_blockImage = BlockImage;
  184. self.m_blockSVG = BlockSVG;
  185. self.m_blockExtImage = BlockExtImage;
  186. self.m_blockExtVideo = BlockExtVideo;
  187. self.m_blockMRSS = BlockMRSS;
  188. self.m_blockHTML = BlockHTML;
  189. self.m_blockGoogleCalendar = BlockGoogleCalendar;
  190. self.m_blockLabel = BlockLabel;
  191. self.m_blockClock = BlockClock;
  192.  
  193. BB.comBroker.fire(BB.EVENTS.BLOCKS_LOADED);
  194. });
  195. },
  196.  
  197. /**
  198. This is factory method produces block instances which will reside on the timeline and referenced within this
  199. channel instance. The factory will parse the blockCode and create the appropriate block type.
  200. @method createBlock
  201. @param {Number} block_id
  202. @param {String} i_playerData
  203. @param {String} i_placement where does the block reside, scene or channel
  204. @param {Number} i_scene_id
  205. @return {Object} reference to the block instance
  206. **/
  207. createBlock: function (block_id, i_player_data, i_placement, i_scene_id) {
  208. var self = this;
  209. var block = undefined;
  210. // uncomment to see XML when adding new components
  211. // console.log(i_player_data);
  212. var playerData = this.x2js.xml_str2json(i_player_data);
  213. var blockCode;
  214.  
  215. if (playerData['Player']['_player']) {
  216. // Standard block
  217. blockCode = playerData['Player']['_player'];
  218. } else {
  219. // Scene
  220. blockCode = BB.CONSTS.BLOCKCODE_SCENE;
  221. if (_.isUndefined(i_scene_id)) {
  222. var domPlayerData = $.parseXML(i_player_data);
  223. i_scene_id = $(domPlayerData).find('Player').attr('hDataSrc');
  224. }
  225. }
  226. switch (parseInt(blockCode)) {
  227. case parseInt(BB.CONSTS.BLOCKCODE_SCENE):
  228. {
  229. block = new self.m_blockScene({
  230. i_placement: i_placement,
  231. i_block_id: block_id
  232. });
  233. break;
  234. }
  235. case 3345:
  236. {
  237. block = new self.m_blockRSS({
  238. i_placement: i_placement,
  239. i_block_id: block_id,
  240. i_scene_player_data_id: i_scene_id
  241. });
  242. break;
  243. }
  244. case 3430:
  245. {
  246. block = new self.m_blockQR({
  247. i_placement: i_placement,
  248. i_block_id: block_id,
  249. i_scene_player_data_id: i_scene_id
  250. });
  251. break;
  252. }
  253. case 4600:
  254. {
  255. block = new self.m_blockYouTube({
  256. i_placement: i_placement,
  257. i_block_id: block_id,
  258. i_scene_player_data_id: i_scene_id
  259. });
  260. break;
  261. }
  262. case parseInt(BB.CONSTS.BLOCKCODE_COLLECTION):
  263. {
  264. block = new self.m_blockCollection({
  265. i_placement: i_placement,
  266. i_block_id: block_id,
  267. i_scene_player_data_id: i_scene_id
  268. });
  269. break;
  270. }
  271. case 4105:
  272. {
  273. block = new self.m_blockLocation({
  274. i_placement: i_placement,
  275. i_block_id: block_id,
  276. i_scene_player_data_id: i_scene_id
  277. });
  278. break;
  279. }
  280. case 6100:
  281. {
  282. block = new self.m_blockFasterQ({
  283. i_placement: i_placement,
  284. i_block_id: block_id,
  285. i_scene_player_data_id: i_scene_id
  286. });
  287. break;
  288. }
  289. case parseInt(BB.CONSTS.BLOCKCODE_TWITTER):
  290. {
  291. block = new self.m_blockTwitter({
  292. i_placement: i_placement,
  293. i_block_id: block_id,
  294. i_scene_player_data_id: i_scene_id
  295. });
  296. break;
  297. }
  298. case parseInt(BB.CONSTS.BLOCKCODE_TWITTER_ITEM):
  299. {
  300. block = new self.m_blockTwitterItem({
  301. i_placement: i_placement,
  302. i_block_id: block_id,
  303. i_scene_player_data_id: i_scene_id
  304. });
  305. break;
  306. }
  307. case parseInt(BB.CONSTS.BLOCKCODE_WORLD_WEATHER):
  308. {
  309. block = new self.m_blockWorldWeather({
  310. i_placement: i_placement,
  311. i_block_id: block_id,
  312. i_scene_player_data_id: i_scene_id
  313. });
  314. break;
  315. }
  316. case parseInt(BB.CONSTS.BLOCKCODE_GOOGLE_SHEETS):
  317. {
  318. block = new self.m_blockGoogleSheets({
  319. i_placement: i_placement,
  320. i_block_id: block_id,
  321. i_scene_player_data_id: i_scene_id
  322. });
  323. break;
  324. }
  325. case parseInt(BB.CONSTS.BLOCKCODE_TWITTERV3):
  326. {
  327. block = new self.m_blockTwitterV3({
  328. i_placement: i_placement,
  329. i_block_id: block_id,
  330. i_scene_player_data_id: i_scene_id
  331. });
  332. break;
  333. }
  334. case parseInt(BB.CONSTS.BLOCKCODE_CALENDAR):
  335. {
  336. block = new self.m_blockGoogleCalendar({
  337. i_placement: i_placement,
  338. i_block_id: block_id,
  339. i_scene_player_data_id: i_scene_id
  340. });
  341. break;
  342. }
  343. case parseInt(BB.CONSTS.BLOCKCODE_INSTAGRAM):
  344. {
  345. block = new self.m_blockInstagram({
  346. i_placement: i_placement,
  347. i_block_id: block_id,
  348. i_scene_player_data_id: i_scene_id
  349. });
  350. break;
  351. }
  352. case parseInt(BB.CONSTS.BLOCKCODE_DIGG):
  353. {
  354. block = new self.m_blockDigg({
  355. i_placement: i_placement,
  356. i_block_id: block_id,
  357. i_scene_player_data_id: i_scene_id
  358. });
  359. break;
  360. }
  361. case parseInt(BB.CONSTS.BLOCKCODE_VIDEO):
  362. {
  363. block = new self.m_blockVideo({
  364. i_placement: i_placement,
  365. i_block_id: block_id,
  366. i_scene_player_data_id: i_scene_id
  367. });
  368. break;
  369. }
  370. case parseInt(BB.CONSTS.BLOCKCODE_SVG):
  371. {
  372. block = new self.m_blockSVG({
  373. i_placement: i_placement,
  374. i_block_id: block_id,
  375. i_scene_player_data_id: i_scene_id
  376. });
  377. break;
  378. }
  379. case parseInt(BB.CONSTS.BLOCKCODE_IMAGE):
  380. {
  381. block = new self.m_blockImage({
  382. i_placement: i_placement,
  383. i_block_id: block_id,
  384. i_scene_player_data_id: i_scene_id
  385. });
  386. break;
  387. }
  388. case 3160:
  389. {
  390. block = new self.m_blockExtImage({
  391. i_placement: i_placement,
  392. i_block_id: block_id,
  393. i_scene_player_data_id: i_scene_id
  394. });
  395. break;
  396. }
  397. case 3150:
  398. {
  399. block = new self.m_blockExtVideo({
  400. i_placement: i_placement,
  401. i_block_id: block_id,
  402. i_scene_player_data_id: i_scene_id
  403. });
  404. break;
  405. }
  406. case 3320:
  407. {
  408. block = new self.m_blockClock({
  409. i_placement: i_placement,
  410. i_block_id: block_id,
  411. i_scene_player_data_id: i_scene_id
  412. });
  413. break;
  414. }
  415. case 3235:
  416. {
  417. block = new self.m_blockHTML({
  418. i_placement: i_placement,
  419. i_block_id: block_id,
  420. i_scene_player_data_id: i_scene_id
  421. });
  422. break;
  423. }
  424. case 3241:
  425. {
  426. block = new self.m_blockLabel({
  427. i_placement: i_placement,
  428. i_block_id: block_id,
  429. i_scene_player_data_id: i_scene_id
  430. });
  431. break;
  432. }
  433. case 3340:
  434. {
  435. block = new self.m_blockMRSS({
  436. i_placement: i_placement,
  437. i_block_id: block_id,
  438. i_scene_player_data_id: i_scene_id
  439. });
  440. break;
  441. }
  442. case parseInt(BB.CONSTS.BLOCKCODE_JSON):
  443. {
  444. block = new self.m_blockJson({
  445. i_placement: i_placement,
  446. i_block_id: block_id,
  447. i_scene_player_data_id: i_scene_id
  448. });
  449. break;
  450. }
  451. case parseInt(BB.CONSTS.BLOCKCODE_JSON_ITEM):
  452. {
  453. block = new self.m_blockJsonItem({
  454. i_placement: i_placement,
  455. i_block_id: block_id,
  456. i_scene_player_data_id: i_scene_id
  457. });
  458. break;
  459. }
  460. }
  461.  
  462. // subclass our block from fabric.Group if resides inside scene
  463. if (i_placement == BB.CONSTS.PLACEMENT_SCENE) {
  464. var g = new fabric.Group([]);
  465. _.extend(block, g);
  466. g = undefined;
  467. }
  468. return block;
  469. },
  470.  
  471. /**
  472. Get the status of modules, i.e.: loaded yet?
  473. @method blocksLoaded
  474. **/
  475. blocksLoaded: function () {
  476. var self = this;
  477. if (self.m_block)
  478. return true;
  479. return false;
  480. }
  481. });
  482.  
  483. return BlockFactory;
  484. });
  485.  
  486.  
  487.