// vim: et:ts=4:sw=4:sts=4:ft=javascript /*@ Ox.SmallTimeline SmallTimeline Object () -> SmallTimeline Object (options) -> SmallTimeline Object (options, self) -> SmallTimeline Object options Options object self shared private variable @*/ Ox.SmallTimeline = function(options, self) { self = self || {}; var that = Ox.Element({}, self) .defaults({ duration: 0, find: '', matches: [], points: [0, 0], position: 0, subtitles: [], videoId: '', width: 0 }) .options(options || {}) .addClass('OxTimelineSmall') .mousedown(mousedown) .mouseleave(mouseleave) .mousemove(mousemove) .bindEvent({ drag: function(data) { mousedown(data); } }); Ox.extend(self, { $images: [], $markerPoint: [], $subtitles: [], $tooltip: Ox.Tooltip({ animate: false }).css({ textAlign: 'center' }), hasSubtitles: self.options.subtitles.length, height: 16, margin: 8 }); that.css({ width: (self.options.width + self.margin) + 'px', height: (self.height + self.margin) + 'px' }); self.$line = $('') .addClass('OxTimelineSmallImage') .attr({ src: '/' + self.options.videoId + '/timeline16p.png' }) .css({ position: 'absolute', left: '4px', top: '4px', width: self.options.width, height: '16px' }) .appendTo(that.$element); self.$markerPosition = $('') .addClass('OxMarkerPosition') .attr({ src: Ox.UI.PATH + 'png/videoMarkerPlay.png' }) .css({ position: 'absolute', width: '9px', height: '5px', zIndex: 10 }) .appendTo(that.$element); setPosition(); ['in', 'out'].forEach(function(v, i) { var titleCase = Ox.toTitleCase(v); self.$markerPoint[i] = $('') .addClass('OxMarkerPoint' + titleCase) .attr({ src: Ox.UI.PATH + 'png/videoMarker' + titleCase + '.png' }) .appendTo(that.$element); setMarkerPoint(i); }); function getPosition(e) { return e.offsetX / self.options.width * self.options.duration; } function getSubtitle(position) { var subtitle = null; Ox.forEach(self.options.subtitles, function(v) { if (v['in'] <= position && v['out'] >= position) { subtitle = v; return false; } }); return subtitle; } function mousedown(e) { var $target = $(e.target); if ( $target.hasClass('OxTimelineSmallImage') || $target.hasClass('OxTimelineSmallSubtitles') ) { self.options.position = getPosition(e); setPosition(); that.triggerEvent('change', { position: self.options.position }); } e.preventDefault(); } function mouseleave(e) { self.$tooltip.hide(); } function mousemove(e) { var $target = $(e.target), position, subtitle; if ( $target.hasClass('OxTimelineSmallImage') || $target.hasClass('OxTimelineSmallSubtitles') ) { position = getPosition(e); subtitle = getSubtitle(position); self.$tooltip.options({ title: subtitle ? '' + Ox.highlight(subtitle.value, self.options.find, 'OxHighlight').replace(/\n/g, '
') + '

' + Ox.formatDuration(subtitle['in'], 3) + ' - ' + Ox.formatDuration(subtitle['out'], 3) : Ox.formatDuration(position, 3) }) .show(e.clientX, e.clientY); } else { self.$tooltip.hide(); } } function setMarker() { self.$markerPosition .css({ left: parseInt( self.options.position / self.options.duration * self.options.width ) + 'px', top: '2px', }); } function setMarkerPoint(i) { var position = self.options.points[i]; self.$markerPoint[i] .css({ left: (position % self.options.width) + 'px', top: (parseInt(position / self.options.width) * (self.height + self.margin) + 16) + 'px', }); } function setPosition() { self.options.position = Ox.limit(self.options.position, 0, self.options.duration); setMarker(); } function setWidth() { self.$line.css({ width: self.options.width + 'px', }); setMarker(); setMarkerPoint(0); setMarkerPoint(1); } self.setOption = function(key, value) { //Ox.Log('Video', 'onChange:', key, value) if (key == 'points') { //Ox.Log('Video', 'key', key, 'value', value) setMarkerPoint(0); setMarkerPoint(1); } else if (key == 'position') { setPosition(); } else if (key == 'width') { setWidth(); } }; return that; };