/Src/Bowerbird.Website/js/bowerbird/views/observationMediaItemFormView.js

https://github.com/Bowerbird/bowerbird-web · JavaScript · 164 lines · 129 code · 25 blank · 10 comment · 12 complexity · 8e56c67372ff1a5916bc4c89cbb0abfb MD5 · raw file

  1. /// <reference path="../../libs/log.js" />
  2. /// <reference path="../../libs/require/require.js" />
  3. /// <reference path="../../libs/jquery/jquery-1.7.2.js" />
  4. /// <reference path="../../libs/underscore/underscore.js" />
  5. /// <reference path="../../libs/backbone/backbone.js" />
  6. /// <reference path="../../libs/backbone.marionette/backbone.marionette.js" />
  7. // ObservationMediaItemFormView
  8. // ----------------------------
  9. define(['jquery', 'underscore', 'backbone', 'app', 'ich', 'views/mediaformview', 'licences', 'circleplayer'],
  10. function ($, _, Backbone, app, ich, MediaFormView, licences, CirclePlayer) {
  11. var ImageProvider = function (options) {
  12. this.start = function () {
  13. };
  14. };
  15. var VideoProvider = function (options) {
  16. this.start = function () {
  17. };
  18. };
  19. var AudioProvider = function (options) {
  20. this.id = app.generateGuid();
  21. this.start = function (model) {
  22. if (model.mediaResource.get('MediaResourceType') === 'audio') {
  23. this.audioPlayer = new CirclePlayer('#audio-player-' + this.id,
  24. {
  25. mp3: model.mediaResource.get('Audio').Constrained600.Uri,
  26. m4a: model.mediaResource.get('Audio').Constrained600.Uri
  27. },
  28. {
  29. cssSelectorAncestor: '#audio-player-container-' + this.id,
  30. swfPath: '/js/libs/jquery.jplayer',
  31. supplied: 'mp3,m4a',
  32. wmode: 'window',
  33. //errorAlerts: true,
  34. solution: 'html,flash'
  35. });
  36. //$("#jplayer_inspector").jPlayerInspector({ jPlayer: $('#audio-player') });
  37. }
  38. };
  39. };
  40. var ObservationMediaItemFormView = Backbone.Marionette.ItemView.extend({
  41. className: 'observation-media-item',
  42. events: {
  43. 'click .sub-menu': '_showMenu',
  44. 'click .sub-menu li': '_selectMenuItem',
  45. 'click .view-menu-item': '_viewMedia',
  46. 'click .edit-menu-item': '_editMediaDetails',
  47. 'click .remove-menu-item': '_removeMedia',
  48. 'click .primary-menu-item': '_setPrimaryMedia'
  49. },
  50. template: 'ObservationMediaItem',
  51. provider: null,
  52. initialize: function () {
  53. var mediaResourceType = this.model.mediaResource.get('MediaResourceType');
  54. if (mediaResourceType === 'image') {
  55. this.provider = new ImageProvider();
  56. } else if (mediaResourceType === 'video') {
  57. this.provider = new VideoProvider();
  58. } else if (mediaResourceType === 'audio') {
  59. this.provider = new AudioProvider();
  60. }
  61. this.model.on('change:IsPrimaryMedia', this._onUpdatePrimaryMedia, this);
  62. },
  63. serializeData: function () {
  64. var licence = licences.get(this.model.get('Licence'));
  65. return {
  66. Description: this.model.get('Description'),
  67. LicenceName: licence.Name,
  68. LicenceIcons: licence.Icons,
  69. IsPrimaryMedia: this.model.get('IsPrimaryMedia'),
  70. MediaResource: this.model.mediaResource.toJSON()
  71. };
  72. },
  73. onRender: function () {
  74. this.$el.css({ position: 'absolute', top: '-250px', width: 296 + 'px' });
  75. this.$el.find('.cp-jplayer').attr('id', 'audio-player-' + this.provider.id);
  76. this.$el.find('.cp-container').attr('id', 'audio-player-container-' + this.provider.id);
  77. return this;
  78. },
  79. start: function () {
  80. this.provider.start(this.model);
  81. },
  82. _showMenu: function (e) {
  83. app.vent.trigger('close-sub-menus');
  84. $(e.currentTarget).addClass('active');
  85. e.stopPropagation();
  86. },
  87. _selectMenuItem: function (e) {
  88. app.vent.trigger('close-sub-menus');
  89. e.stopPropagation();
  90. },
  91. _viewMedia: function (e) {
  92. e.preventDefault();
  93. alert('Coming soon');
  94. },
  95. _setPrimaryMedia: function (e) {
  96. e.preventDefault();
  97. this.trigger('newprimarymedia', this.model);
  98. },
  99. _editMediaDetails: function (e) {
  100. e.preventDefault();
  101. $('body').append('<div id="modal-dialog"></div>');
  102. var mediaFormView = new MediaFormView({ el: $('#modal-dialog'), model: this.model });
  103. mediaFormView.on('editmediadone', this._onEditMedia, this);
  104. mediaFormView.render();
  105. },
  106. _onEditMedia: function () {
  107. log('editmediadone');
  108. var licence = licences.get(this.model.get('Licence'));
  109. if (this.model.get('Description').trim().length > 0) {
  110. if (this.$el.find('.description').length === 0) {
  111. this.$el.find('.overlay').after('<p class="description" />');
  112. }
  113. this.$el.find('.description').text(this.model.get('Description').trim());
  114. } else {
  115. this.$el.find('.description').remove();
  116. }
  117. this.$el.find('.licence-name').text(licence.Name);
  118. this.$el.find('.licence-icons img').remove();
  119. _.forEach(licence.Icons, function (icon) {
  120. this.$el.find('.licence-icons').append('<img src="' + icon + '" alt="" />');
  121. }, this);
  122. },
  123. _onUpdatePrimaryMedia: function (media) {
  124. var $elem = this.$el.find('.primary-media');
  125. if (media.get('IsPrimaryMedia') === true) {
  126. if ($elem.length === 0) {
  127. this.$el.find('.licence-name').after('<p class="primary-media">&bull; Show This Media First</p>');
  128. }
  129. } else {
  130. $elem.remove();
  131. }
  132. },
  133. _removeMedia: function (e) {
  134. e.preventDefault();
  135. this.trigger('removemedia', this);
  136. }
  137. });
  138. return ObservationMediaItemFormView;
  139. });