APIs

Show:
  1. /**
  2. The timeline instance is created for each timeline in a campaign. It creates its UI, listens to timeline
  3. event selections, and holds a reference to its own timeline_id.
  4. The timeline instance also creates channel instances for all the channels it hosts and hold references to these
  5. channels via m_channels member.
  6. @class Timeline
  7. @constructor
  8. @return {Object} instantiated Timeline
  9. **/
  10. define(['jquery', 'backbone', 'Channel', 'ScreenTemplateFactory', 'datepicker', 'XDate'], function ($, Backbone, Channel, ScreenTemplateFactory, datepicker, Xdate) {
  11.  
  12. /**
  13. Custom event fired when a timeline is selected. If a timeline is not of the one selected,
  14. it ignores the event.
  15. @event Timeline.CAMPAIGN_TIMELINE_SELECTED
  16. @param {This} caller
  17. @param {Self} context caller
  18. @param {Event} timelineID of the timeline selected
  19. @static
  20. @final
  21. **/
  22. BB.EVENTS.CAMPAIGN_TIMELINE_SELECTED = 'CAMPAIGN_TIMELINE_SELECTED';
  23.  
  24. var Timeline = BB.Controller.extend({
  25.  
  26. /**
  27. Constructor
  28. @method initialize
  29. **/
  30. initialize: function () {
  31. var self = this;
  32. self.m_ONCE = '0';
  33. self.m_DAILY = '1';
  34. self.m_WEEKLY = '2';
  35. self.m_PRIORITY_LOW = 2;
  36. self.m_PRIORITY_MEDIUM = 1;
  37. self.m_PRIORITY_HIGH = 0;
  38. self.m_WEEKDAYS = [1, 2, 4, 8, 16, 32, 64];
  39. self.m_channels = {}; // hold references to all created channel instances
  40. self.m_screenTemplate = undefined;
  41. self.m_campaign_timeline_id = self.options.campaignTimelineID;
  42. self.m_timing = 'sequencer';
  43. self.m_stackViewID = undefined;
  44. self.m_property = BB.comBroker.getService(BB.SERVICES['PROPERTIES_VIEW']);
  45. self.m_sequences = BB.comBroker.getService(BB.SERVICES['SEQUENCER_VIEW']);
  46. self.m_selected = false;
  47. self._populateChannels();
  48. self.populateTimeline();
  49. self._listenInputChange();
  50. self._listenReset();
  51. self._listenViewerRemoved();
  52. self._onTimelineSelected();
  53. pepper.listenWithNamespace(Pepper.TEMPLATE_VIEWER_EDITED, self, $.proxy(self._templateViewerEdited, self));
  54. pepper.listenWithNamespace(Pepper.NEW_CHANNEL_ADDED, self, $.proxy(self._channelAdded, self));
  55.  
  56. var campaignPlayMode = pepper.getCampaignPlayModeFromTimeline(self.m_campaign_timeline_id);
  57. if (campaignPlayMode == BB.CONSTS.SCHEDULER_MODE) {
  58. self._listenSchedDurationChange();
  59. self._listenSchedPriorityChange();
  60. self._listenSchedStartTimeChange();
  61. self._listenSchedRepeatChange();
  62. self._listenDatePicker();
  63. self._listenWeekdayChange();
  64. }
  65. },
  66.  
  67. /**
  68. Listen to reset of when switching to different campaign so we forget current state
  69. @method _listenReset
  70. **/
  71. _listenReset: function () {
  72. var self = this;
  73. BB.comBroker.listenWithNamespace(BB.EVENTS.CAMPAIGN_RESET, self, function () {
  74. self._reset();
  75. });
  76. },
  77.  
  78. /**
  79. Listen to timeline selection events and populate the properties panel accordingly.
  80. @method _onTimelineSelected
  81. @return none
  82. **/
  83. _onTimelineSelected: function () {
  84. var self = this;
  85. self.m_campaignTimelineSelectedHandler = function (e) {
  86. var timelineID = e.edata;
  87. if (self.m_campaign_timeline_id != timelineID) {
  88. self.m_selected = false;
  89. return;
  90. }
  91. self.m_selected = true;
  92. self._propLoadTimeline();
  93. // log('timeline selected ' + self.m_campaign_timeline_id);
  94. };
  95. BB.comBroker.listenWithNamespace(BB.EVENTS.CAMPAIGN_TIMELINE_SELECTED, self, self.m_campaignTimelineSelectedHandler);
  96. },
  97.  
  98. /**
  99. Update msdb when the timeline title has changed.
  100. @method _listenInputChange
  101. @return none
  102. **/
  103. _listenInputChange: function () {
  104. var self = this;
  105. self.m_inputChangeHandler = _.debounce(function (e) {
  106. if (!self.m_selected)
  107. return;
  108. var text = $(Elements.TIME_LINE_PROP_TITLE_ID).val();
  109. if (BB.lib.isEmpty(text))
  110. return;
  111. text = BB.lib.cleanProbCharacters(text, 1);
  112. pepper.setCampaignTimelineRecord(self.m_campaign_timeline_id, 'timeline_name', text);
  113. }, 150, false);
  114. $(Elements.TIME_LINE_PROP_TITLE_ID).on("input", self.m_inputChangeHandler);
  115. },
  116.  
  117.  
  118. /**
  119. Listen to changes in timeline duration changes with respect to the scheduler
  120. @method _listenDatePicker
  121. @return none
  122. **/
  123. _listenDatePicker: function () {
  124. var self = this;
  125. self.m_listenDatePickerHandler = function (e) {
  126. if (!self.m_selected)
  127. return;
  128. if (_.isUndefined(e.date))
  129. return;
  130. var field = $(e.target).attr('name');
  131. var xd = new XDate(e.date);
  132. var date = xd.toString('MM/dd/yyyy');
  133. pepper.setCampaignsSchedule(self.m_campaign_timeline_id, field, date);
  134. };
  135. $(Elements.CLASS_TIME_PICKER_SCHEDULER).datepicker().on("hide", self.m_listenDatePickerHandler);
  136.  
  137. },
  138.  
  139. /**
  140. Listen weekdays change in scheduler
  141. @method _listenWeekdayChange
  142. @param {Number} i_playerData
  143. @return {Number} Unique clientId.
  144. **/
  145. _listenWeekdayChange: function () {
  146. var self = this;
  147. self.m_schedWeekdayHandler = function (e) {
  148. if (!self.m_selected)
  149. return;
  150. var weekBits = 0;
  151. // bitwize operator
  152. $(Elements.SCHEDUALED_DAYS).find('input').each(function (i, el) {
  153. if ($(el).prop('checked'))
  154. weekBits = weekBits + self.m_WEEKDAYS[i];
  155. });
  156. pepper.setCampaignsSchedule(self.m_campaign_timeline_id, 'week_days', weekBits);
  157. };
  158. $(Elements.CLASS_SCEDULE_DAY).on("change", self.m_schedWeekdayHandler);
  159. },
  160.  
  161. /**
  162. Listen to changes in timeline duration changes with respect to the scheduler
  163. @method _listenSchedDurationChange
  164. @return none
  165. **/
  166. _listenSchedDurationChange: function () {
  167. var self = this;
  168. self.m_schedChangeDurationHandler = function (e) {
  169. if (!self.m_selected)
  170. return;
  171. var totalSeconds = pepper.formatObjectToSeconds({
  172. hours: e.time.hours,
  173. minutes: e.time.minutes,
  174. seconds: e.time.seconds
  175. });
  176. pepper.setCampaignsSchedule(self.m_campaign_timeline_id, 'duration', totalSeconds);
  177. };
  178. $(Elements.TIME_PICKER_DURATION_INPUT).on("hide.timepicker", self.m_schedChangeDurationHandler);
  179. },
  180.  
  181. /**
  182. Listen to when sched repeat on the carousel changed
  183. @method _listenSchedRepeatChange
  184. **/
  185. _listenSchedRepeatChange: function(){
  186. var self = this;
  187. self.m_schedChangeRepeatHandler = _.debounce(function (e) {
  188. if (!self.m_selected)
  189. return;
  190. var carouselIndex = $(Elements.SCHEDULER_REPEAT_MODE + ' .active').index(Elements.SCHEDULER_REPEAT_MODE + ' .item');
  191. pepper.setCampaignsSchedule(self.m_campaign_timeline_id, 'repeat_type', carouselIndex);
  192. },500, false);
  193. $(Elements.SCHEDULER_REPEAT_MODE).on('slid.bs.carousel', self.m_schedChangeRepeatHandler);
  194. },
  195.  
  196. /**
  197. Listen to changes in scheduler start time playback values
  198. @method _listenSchedStartTimeChange
  199. **/
  200. _listenSchedStartTimeChange: function () {
  201. var self = this;
  202. self.m_schedChangeStartTimeHandler = function (e) {
  203. if (!self.m_selected)
  204. return;
  205. var totalSeconds = pepper.formatObjectToSeconds({
  206. hours: e.time.hours,
  207. minutes: e.time.minutes,
  208. seconds: e.time.seconds
  209. });
  210. pepper.setCampaignsSchedule(self.m_campaign_timeline_id, 'start_time', totalSeconds);
  211. };
  212. $(Elements.TIME_PICKER_TIME_INPUT).on('hide.timepicker', self.m_schedChangeStartTimeHandler);
  213. },
  214.  
  215. /**
  216. Listen to changes in scheduler priority values
  217. @method _listenSchedPriorityChange
  218. **/
  219. _listenSchedPriorityChange: function () {
  220. var self = this;
  221. self.m_schedChangePriorityHandler = function (e) {
  222. if (!self.m_selected)
  223. return;
  224. var priority = $(e.target).attr('name');
  225. pepper.setCampaignsSchedule(self.m_campaign_timeline_id, 'priorty', priority);
  226. if (Number(priority) == self.m_PRIORITY_LOW) {
  227. $(Elements.SCHEDULE_PRIORITY).find('img').eq(1).fadeTo('fast', 0.5).end().eq(2).fadeTo('fast', 0.5);
  228. } else if (Number(priority) == self.m_PRIORITY_MEDIUM) {
  229. $(Elements.SCHEDULE_PRIORITY).find('img').eq(1).fadeTo('fast', 1).end().eq(2).fadeTo('fast', 0.5);
  230. } else {
  231. $(Elements.SCHEDULE_PRIORITY).find('img').eq(1).fadeTo('fast', 1).end().eq(2).fadeTo('fast', 1);
  232. }
  233. };
  234. $(Elements.CLASS_SCHEDULE_PRIORITIES).on('click', self.m_schedChangePriorityHandler);
  235. },
  236.  
  237. /**
  238. When a campaign_timeline_board_template is edited, modify its related UI (inside sequencer)
  239. @method campaign_timeline_board_template_id
  240. @param {event} e template viewer ids
  241. **/
  242. _templateViewerEdited: function (e) {
  243. var self = this;
  244. if (!self.m_selected)
  245. return;
  246. var campaign_timeline_board_template_id = e.edata;
  247. self._populateBoardTemplate(campaign_timeline_board_template_id);
  248. },
  249.  
  250. /**
  251. New channel was added to an existing timeline (most likely through the addition of a viewer (screen division) template editor)
  252. @method _channelAdded
  253. @param {event} e
  254. **/
  255. _channelAdded: function (e) {
  256. var self = this;
  257. if (!self.m_selected)
  258. return;
  259. self.m_channels[e.edata.chanel] = new Channel({campaignTimelineChanelID: e.edata.chanel});
  260. },
  261.  
  262. /**
  263. Populate the timeline property
  264. @method _listenInputChange
  265. **/
  266. _propLoadTimeline: function () {
  267. var self = this;
  268. self.m_property.viewPanel(Elements.TIMELINE_PROPERTIES);
  269. var recTimeline = pepper.getCampaignTimelineRecord(self.m_campaign_timeline_id);
  270. $(Elements.TIME_LINE_PROP_TITLE_ID).val(recTimeline['timeline_name']);
  271. self._populateTimelineLength();
  272. self._populateTimelinePlayMode();
  273. },
  274.  
  275. /**
  276. Populate the Scheduler UI
  277. @method _populateScheduler
  278. @params {Number} i_timeline_id
  279. **/
  280. _populateScheduler: function () {
  281. var self = this;
  282. if ($(Elements.TIME_PICKER_DURATION_INPUT).timepicker == undefined)
  283. return;
  284. var recSchedule = pepper.getCampaignsSchedule(self.m_campaign_timeline_id);
  285. $(Elements.SCHEDULER_REPEAT_MODE).carousel(Number(recSchedule.repeat_type));
  286. var duration = pepper.formatSecondsToObject(recSchedule.duration);
  287. var startTime = pepper.formatSecondsToObject(recSchedule.start_time);
  288. $(Elements.TIME_PICKER_DURATION_INPUT).timepicker('setTime', duration.hours + ':' + duration.minutes + ':' + duration.seconds);
  289. $(Elements.TIME_PICKER_TIME_INPUT).timepicker('setTime', startTime.hours + ':' + startTime.minutes + ':' + startTime.seconds);
  290.  
  291. if (recSchedule.priorty == self.m_PRIORITY_LOW) {
  292. $(Elements.SCHEDULE_PRIORITY).find('img').eq(1).fadeTo('fast', 0.5).end().eq(2).fadeTo('fast', 0.5);
  293. } else if (recSchedule.priorty == self.m_PRIORITY_MEDIUM) {
  294. $(Elements.SCHEDULE_PRIORITY).find('img').eq(1).fadeTo('fast', 1).end().eq(2).fadeTo('fast', 0.5);
  295. } else {
  296. $(Elements.SCHEDULE_PRIORITY).find('img').eq(1).fadeTo('fast', 1).end().eq(2).fadeTo('fast', 1);
  297. }
  298.  
  299. $(Elements.SCHEDULE_PRIORITY)
  300. switch (String(recSchedule.repeat_type)) {
  301. case self.m_ONCE:
  302. {
  303. var date = recSchedule.start_date.split(' ')[0];
  304. $(Elements.DATE_PICKER_SCHEDULER_ONCE).datepicker('setDate', date);
  305. break;
  306. }
  307. case self.m_DAILY:
  308. {
  309. var startDate = recSchedule.start_date.split(' ')[0];
  310. var endDate = recSchedule.end_date.split(' ')[0];
  311. $(Elements.DATE_PICKER_SCHEDULER_DAILY_START).datepicker('setDate', startDate);
  312. $(Elements.DATE_PICKER_SCHEDULER_DAILY_END).datepicker('setDate', endDate);
  313. break;
  314. }
  315. case self.m_WEEKLY:
  316. {
  317. var startDate = recSchedule.start_date.split(' ')[0];
  318. var endDate = recSchedule.end_date.split(' ')[0];
  319. var weekDays = recSchedule.week_days;
  320. var elDays = $(Elements.SCHEDUALED_DAYS);
  321. // use bitwise (bitwize) operator << >> to compute days selected
  322. self.m_WEEKDAYS.forEach(function (v, i) {
  323. var n = weekDays & v;
  324. if (n == v) {
  325. $(elDays).find('input').eq(i).prop('checked', true);
  326. } else {
  327. $(elDays).find('input').eq(i).prop('checked', false);
  328. }
  329. });
  330. $(Elements.DATE_PICKER_SCHEDULER_WEEK_START).datepicker('setDate', startDate);
  331. $(Elements.DATE_PICKER_SCHEDULER_WEEK_END).datepicker('setDate', endDate);
  332. break;
  333. }
  334. }
  335. },
  336.  
  337. /**
  338. Populate the timeline depending if running with sequencer or scheduler
  339. @method _populateTimelinePlayMode
  340. **/
  341. _populateTimelinePlayMode: function () {
  342. var self = this;
  343. var campaignMode = pepper.getCampaignPlayModeFromTimeline(self.m_campaign_timeline_id);
  344. switch (campaignMode) {
  345. case BB.CONSTS.SEQUENCER_MODE:
  346. {
  347. $(Elements.TIMELINE_WRAP).show();
  348. $(Elements.TIMELINE_PLAYMODE_LABEL).find('aside').eq(0).show().end().eq(1).hide();
  349. $(Elements.CLASS_SCHEDULER_CLASS).hide();
  350. $(Elements.CLASS_SEQUENCE_CLASS).show();
  351. break;
  352. }
  353. case BB.CONSTS.SCHEDULER_MODE:
  354. {
  355. $(Elements.TIMELINE_WRAP).hide();
  356. $(Elements.TIMELINE_PLAYMODE_LABEL).find('aside').eq(1).show().end().eq(0).hide();
  357. $(Elements.CLASS_SCHEDULER_CLASS).show();
  358. $(Elements.CLASS_SEQUENCE_CLASS).hide();
  359. self._populateScheduler();
  360. break;
  361. }
  362. }
  363. },
  364.  
  365. /**
  366. Populate the timeline length in its properties box
  367. @method _populateTimelineLength
  368. **/
  369. _populateTimelineLength: function () {
  370. var self = this;
  371. self.m_xdate = BB.comBroker.getService('XDATE');
  372. var totalDuration = parseInt(pepper.getTimelineTotalDuration(self.m_campaign_timeline_id));
  373. totalDuration = self.m_xdate.clearTime().addSeconds(totalDuration).toString('HH:mm:ss');
  374. $(Elements.TIMELINE_LENGTH).text(totalDuration);
  375. },
  376.  
  377. /**
  378. Create a channel instance for every channel this timeline hosts
  379. @method _populateChannels
  380. @return none
  381. **/
  382. _populateChannels: function () {
  383. var self = this;
  384. var channelIDs = pepper.getChannelsOfTimeline(self.m_campaign_timeline_id);
  385. for (var i = 0; i < channelIDs.length; i++) {
  386. self.m_channels[channelIDs[i]] = new Channel({campaignTimelineChanelID: channelIDs[i]});
  387. }
  388. },
  389.  
  390. /**
  391. Load up the board template (screen divisions) for this timeline instance.
  392. In case sequencer is used, we push it to the sequencer, thus creating the thumbnail template
  393. inside the sequencer so this timeline can be selected.
  394. Scheduler future support.
  395. @method _populateBoardTemplate
  396. @param {Number} i_campaign_timeline_board_template_id
  397. @return none
  398. **/
  399. _populateBoardTemplate: function (i_campaign_timeline_board_template_id) {
  400. var self = this;
  401. var recBoard = pepper.getGlobalBoardRecFromTemplate(i_campaign_timeline_board_template_id);
  402. var width = parseInt(recBoard['board_pixel_width']);
  403. var height = parseInt(recBoard['board_pixel_height']);
  404.  
  405. BB.comBroker.getService(BB.SERVICES.RESOLUTION_SELECTOR_VIEW).setResolution(width + 'x' + height);
  406. if (width > height) {
  407. BB.comBroker.getService(BB.SERVICES.ORIENTATION_SELECTOR_VIEW).setOrientation(BB.CONSTS.HORIZONTAL);
  408. } else {
  409. BB.comBroker.getService(BB.SERVICES.ORIENTATION_SELECTOR_VIEW).setOrientation(BB.CONSTS.VERTICAL);
  410. }
  411. var screenProps = pepper.getTemplateViewersScreenProps(self.m_campaign_timeline_id, i_campaign_timeline_board_template_id)
  412. self.m_sequences.createTimelineThumbnailUI(screenProps);
  413. },
  414.  
  415. /**
  416. Listen when a screen division / viewer inside a screen layout was deleted and if the channel
  417. is equal to my channel, dispose of self
  418. @method _listenViewerRemoved
  419. **/
  420. _listenViewerRemoved: function () {
  421. var self = this;
  422. BB.comBroker.listenWithNamespace(BB.EVENTS.VIEWER_REMOVED, self, function (e) {
  423. for (var channel in self.m_channels) {
  424. if (e.edata.campaign_timeline_chanel_id == channel) {
  425. self.m_channels[channel].deleteChannel();
  426. delete self.m_channels[channel];
  427. break;
  428. }
  429. }
  430. });
  431. },
  432.  
  433. /**
  434. Create the actual UI for this timeline instance. We use the ScreenTemplateFactory for SVG creation
  435. and insert the snippet onto timelineViewStack so the timeline UI can be presented when selected.
  436. @method _createTimelineUI
  437. @param {Object} i_screenProps template properties object
  438. @return none
  439. _createTimelineUI: function (i_screenProps) {
  440. var self = this;
  441.  
  442. var screenTemplateData = {
  443. orientation: BB.comBroker.getService(BB.SERVICES.ORIENTATION_SELECTOR_VIEW).getOrientation(),
  444. resolution: BB.comBroker.getService(BB.SERVICES.RESOLUTION_SELECTOR_VIEW).getResolution(),
  445. screenProps: i_screenProps,
  446. scale: '7'
  447. };
  448.  
  449. var screenTemplate = new ScreenTemplateFactory({
  450. i_screenTemplateData: screenTemplateData,
  451. i_type: ScreenTemplateFactory.VIEWER_SELECTABLE,
  452. i_owner: this});
  453.  
  454. var snippet = screenTemplate.create();
  455. // var elemID = $(snippet).attr('id');
  456. var divID1 = 'selectableScreenCollections' + _.uniqueId();
  457. var divID2 = 'selectableScreenCollections' + _.uniqueId();
  458.  
  459. var snippetWrapper = '<div id="' + divID1 + '" style="display: none">' +
  460. '<div align="center" >' +
  461. '<div id="' + divID2 + '" align="center">' +
  462. '</div>' +
  463. '</div>' +
  464. '</div>';
  465.  
  466. $(Elements.SELECTED_TIMELINE).append(snippetWrapper);
  467.  
  468. var timelineViewStack = BB.comBroker.getService(BB.SERVICES.CAMPAIGN_VIEW).getTimelineViewStack();
  469. $('#' + divID2).append($(snippet));
  470. screenTemplate.selectablelDivision();
  471. var view = new BB.View({el: '#' + divID1});
  472.  
  473. // if we are updating layout from ScreenLayoutEditorView (but actually creating a new Template layout)
  474. // we remove the previous Template Layout from DOM as well as its matching ScreenTemplateFactory instance
  475. if (self.m_stackViewID) {
  476. $('#' + self.m_stackViewID).remove();
  477. self.m_screenTemplate.destroy();
  478. }
  479. ;
  480.  
  481. self.m_screenTemplate = screenTemplate;
  482. self.m_stackViewID = timelineViewStack.addView(view);
  483. screenTemplate.activate();
  484. },
  485. **/
  486.  
  487. /**
  488. Return the view stack index this timeline occupies in the timelineViewStack manager.
  489. @method getStackViewID
  490. @return {Number} m_stackViewID
  491. getStackViewID: function () {
  492. var self = this;
  493. return self.m_stackViewID;
  494. },
  495. **/
  496.  
  497. /**
  498. Reset current state
  499. @method _reset
  500. **/
  501. _reset: function () {
  502. var self = this;
  503. pepper.stopListenWithNamespace(Pepper.TEMPLATE_VIEWER_EDITED, self);
  504. pepper.stopListenWithNamespace(Pepper.NEW_CHANNEL_ADDED, self);
  505. BB.comBroker.stopListenWithNamespace(BB.EVENTS.CAMPAIGN_RESET, self);
  506. BB.comBroker.stopListenWithNamespace(BB.EVENTS.CAMPAIGN_TIMELINE_SELECTED, self);
  507. $(Elements.TIME_LINE_PROP_TITLE_ID).off("input", self.m_inputChangeHandler);
  508. $(Elements.TIME_PICKER_DURATION_INPUT).off("hide.timepicker", self.m_schedChangeDurationHandler);
  509. $(Elements.TIME_PICKER_TIME_INPUT).off('hide.timepicker', self.m_schedChangeStartTimeHandler);
  510. $(Elements.CLASS_SCHEDULE_PRIORITIES).off('click', self.m_schedChangePriorityHandler);
  511. $(Elements.CLASS_SCEDULE_DAY).off("change", self.m_schedWeekdayHandler);
  512. $(Elements.SCHEDULER_REPEAT_MODE).off('slid.bs.carousel', self.m_schedChangeRepeatHandler);
  513. $(Elements.CLASS_TIME_PICKER_SCHEDULER).datepicker().off("hide", self.m_listenDatePickerHandler);
  514.  
  515. $.each(self, function (k) {
  516. self[k] = undefined;
  517. });
  518. },
  519.  
  520. /**
  521. Create the timeline and load up its template (screen divisions) UI
  522. @method populateTimeline
  523. @return none
  524. **/
  525. populateTimeline: function () {
  526. var self = this;
  527. var boardTemplateIDs = pepper.getTemplatesOfTimeline(self.m_campaign_timeline_id);
  528. for (var i = 0; i < boardTemplateIDs.length; i++) {
  529. self._populateBoardTemplate(boardTemplateIDs[i]);
  530. }
  531. },
  532.  
  533. /**
  534. The timeline hold references to all of the channels it creates that exist within it.
  535. The getChannelInstance returns a specific channel instance for a channel_id.
  536. @method getChannelInstance
  537. @param {Number} i_campaign_timeline_chanel_id
  538. @return {Object} Channel
  539. **/
  540. getChannelInstance: function (i_campaign_timeline_chanel_id) {
  541. var self = this;
  542. return self.m_channels[i_campaign_timeline_chanel_id];
  543. },
  544.  
  545. /**
  546. Delete this timeline thus also need to delete all of its related channels
  547. @method deleteTimeline
  548. @return none
  549. **/
  550. deleteTimeline: function () {
  551. var self = this;
  552. var boardTemplateID = pepper.getGlobalTemplateIdOfTimeline(self.m_campaign_timeline_id);
  553. pepper.removeTimelineFromCampaign(self.m_campaign_timeline_id);
  554. pepper.removeSchedulerFromTime(self.m_campaign_timeline_id);
  555. var campaignTimelineBoardTemplateID = pepper.removeBoardTemplateFromTimeline(self.m_campaign_timeline_id);
  556. pepper.removeBoardTemplate(boardTemplateID);
  557. pepper.removeTimelineBoardViewerChannels(campaignTimelineBoardTemplateID);
  558. BB.comBroker.stopListenWithNamespace(BB.EVENTS.VIEWER_REMOVED, self);
  559. pepper.removeBoardTemplateViewers(boardTemplateID);
  560. for (var channel in self.m_channels) {
  561. self.m_channels[channel].deleteChannel();
  562. delete self.m_channels[channel];
  563. }
  564. self._reset();
  565. }
  566. });
  567.  
  568. return Timeline;
  569. });