diff --git a/static/js/pandora/embedTimeline.js b/static/js/pandora/embedTimeline.js new file mode 100644 index 000000000..7e4ae99a4 --- /dev/null +++ b/static/js/pandora/embedTimeline.js @@ -0,0 +1,185 @@ +'use strict'; + +pandora.ui.embedTimeline = function() { + + var that = Ox.Element(), + ui = pandora.user.ui, + defaults = { + annotationsFont: ui.annotationsFont, + annotationsRange: ui.annotationsRange, + annotationsSort: ui.annotationsSort, + paused: true, + showAnnotations: false, + showLayers: pandora.site.layers.map(function(layer) { + return layer.id; + }), + timeline: ui.videoTimeline + }, + options = getOptions(), + video, + $panel, $player, $annotations; + + pandora.api.get({id: ui.item, keys: [ + 'duration', 'layers', 'parts', 'rightslevel', 'videoRatio' + ]}, function(result)) { + + video = Ox.extend(result.data, pandora.getVideoOptions(result.data)); + + if (options.title) { + $title = Ox.Element() + .css({position: 'absolute'}) + .append( + $('
') + .css({ + marginTop: !options.title.match(/\\n/) ? '8px' : '2px', + textAlign: 'center' + }) + .html(options.title.replace(/\\n/g, '
')) + ); + } else { + $title = Ox.Element(); + } + + $player = Ox.VideoTimelinePlayer({ + censored: video.censored, + censoredIcon: pandora.site.cantPlay.icon, + censoredTooltip: pandora.site.cantPlay.text, + duration: video.duration, + followPlayer: ui.followPlayer, + getFrameURL: function(position) { + return '/' + ui.item + '/' + ui.videoResolution + 'p' + position + '.jpg'; + }, + getLargeTimelineURL: function(type, i) { + return '/' + ui.item + '/timeline' + type + '64p' + i + '.jpg'; + }, + height: options.height, + muted: ui.videoMuted, + paused: options.paused, + position: options.position, + resolution: Ox.min(pandora.site.video.resolutions), + smallTimelineURL: '/' + ui.item + '/timeline16p.jpg', + subtitles: video.subtitles, + timeline: ui.timeline, + video: video.video, + videoRatio: video.videoRatio, + volume: ui.videoVolume, + width: options.width + }) + .bindEvent({ + playing: function(data) { + setPosition(data.position, true); + }, + position: function(data) { + setPosition(data.position); + }, + }); + + if (options.showAnnotations) { + video.annotations = video.annotations.filter(function(layer) { + return Ox.contains(options.showLayers, layer.id); + }); + if (options.playInToOut) { + video.annotations.forEach(function(layer) { + var items = []; + layer.items.forEach(function(item) { + if (( + item['in'] >= options['in'] && item['in'] <= options.out + ) || ( + item.out >= options['in'] && item.out <= options.out + )) { + items.push(item); + } + }); + layer.items = items; + }); + } + $annotations = Ox.AnnotationPanel(Ox.extend({ + font: options.annotationsFont, + layers: video.annotations, + position: options.position, + range: options.annotationsRange, + showLayers: ui.showLayers, + showUsers: true, + sort: options.annotationsSort, + width: window.innerWidth + }, options['in'] ? { + 'in': options['in'] + } : {}, options.out ? { + out: options.out + } : {})) + .bindEvent({ + select: selectAnnotation + }) + } else { + $annotations = Ox.Element(); + } + + $panel = Ox.SplitPanel({ + elements: [ + {element: $title, size: options.title ? 32 : 0}, + {element: $player}, + {element: $annotations, size: options.showAnnotations ? 256 : 0} + ], + orientation: 'vertical' + }); + + that.setElement($panel); + + Ox.$parent.postMessage('loaded'); + + } + + function getOptions() { + var options = {}; + ui.hash.query.forEach(function(condition) { + if (condition.key != 'embed') { + options[condition.key] = condition.value; + } + }); + options = Ox.extend( + {item: ui.item}, + ui.videoPoints[ui.item] || {}, + defaults, + options + ); + if (!options.position) { + options.position = options['in'] || 0; + } + if (!options['in'] && !options.out) { + options.playInToOut = false; + } else if (options['in'] && options['in'] == options.out) { + options.invertHighlight = false; + options.paused = true; + options.playInToOut = false; + } + return options; + } + + function getTimelineHeight() { + return window.innerHeight + - (options.title ? 32 : 0) + - (options.showAnnotations ? 256 : 0); + } + + function selectAnnotation(data) { + if (data.id) { + setPosition(Math.max(data['in'], options['in'] || 0)); + $annotations.options({selected: ''}); + } + } + + function setPosition(position, playing) { + !playing && $player.options({position: position}); + options.showAnnotations && $annotations.options({position: position}); + } + + that.resizePanel = function() { + var sizes = getSizes(); + $player.options({width: window.innerWidth, height: getTimelineHeight()}); + options.showAnnotations && $annotations.options({width: window.innerWidth}); + return that; + }; + + return that; + +}; \ No newline at end of file