diff --git a/source/UI/js/Core/URL.js b/source/UI/js/Core/URL.js index c802d353..814044d0 100644 --- a/source/UI/js/Core/URL.js +++ b/source/UI/js/Core/URL.js @@ -618,6 +618,16 @@ Ox.URL = function(options) { }); } + function isDate(str) { + var values = /^(-?\d+)-?(\d+)?-?(\d+)? ?(\d+)?:?(\d+)?:?(\d+)?\.?(\d+)?$/ + .exec(str); + return Boolean( + values && + parseInt(values[1]) <= 9999 && + (!values[2] || parseInt(values[2]) <= 12) && + (!values[3] || parseInt(values[3]) <= 31) + ) + } function getSpanType(str, types) { Ox.Log('Core', 'getSpanType', str, types) @@ -633,7 +643,7 @@ Ox.URL = function(options) { : canBeLocation && length == 4 ? 'location' // leaves us with [-]D[.D][,[-]D[.D]] : canBeDuration ? 'duration' - : canBeDate && !/\./.test(str) && !/^\d{7}$/.test(str) && !/^\d{8}$/.test(str) ? 'date' + : canBeDate && isDate(str) ? 'date' : canBeLocation && length == 2 ? 'location' : canBeNumber && /^\d+$/.test(str) ? 'number' : canBeString && str.length ? 'string' diff --git a/source/UI/js/List/TableList.js b/source/UI/js/List/TableList.js index 63320f03..d72a7f06 100644 --- a/source/UI/js/List/TableList.js +++ b/source/UI/js/List/TableList.js @@ -206,7 +206,7 @@ Ox.TableList = function(options, self) { .addClass('OxHead') .css({ right: self.options.scrollbarVisible - ? Ox.UI.SCROLLBAR_SIZE + 'px' : 0 + ? Math.max(Ox.UI.SCROLLBAR_SIZE, 8) + 'px' : 0 }) .appendTo(that.$bar); that.$head.$content.addClass('OxTitles'); diff --git a/source/UI/js/Video/VideoAnnotationPanel.js b/source/UI/js/Video/VideoAnnotationPanel.js index 4700b283..a3935b1e 100644 --- a/source/UI/js/Video/VideoAnnotationPanel.js +++ b/source/UI/js/Video/VideoAnnotationPanel.js @@ -237,7 +237,9 @@ Ox.VideoAnnotationPanel = function(options, self) { setPoint('in', self.options.position); }, key_k: function togglePlaybackRate() { - that.options({playbackRate: self.options.playbackRate == 1 ? 2 : 1}); + that.options({ + playbackRate: self.options.playbackRate == 1 ? 2 : self.options.playbackRate == 2 ? 0.5 : 1 + }); }, key_l: toggleLoop, key_left: function() { diff --git a/source/UI/js/Video/VideoPlayer.js b/source/UI/js/Video/VideoPlayer.js index 0ffaab2b..36c2822b 100644 --- a/source/UI/js/Video/VideoPlayer.js +++ b/source/UI/js/Video/VideoPlayer.js @@ -321,6 +321,11 @@ Ox.VideoPlayer = function(options, self) { key_g: function() { goToNext('result', 1); }, + key_k: function togglePlaybackRate() { + that.options({ + playbackRate: self.options.playbackRate == 1 ? 2 : self.options.playbackRate == 2 ? 0.5 : 1 + }); + }, key_l: toggleLoop, key_left: function() { setPosition(self.options.position - self.secondsPerFrame); diff --git a/source/UI/js/Video/VideoPlayerPanel.js b/source/UI/js/Video/VideoPlayerPanel.js index d59d4862..1b376d81 100644 --- a/source/UI/js/Video/VideoPlayerPanel.js +++ b/source/UI/js/Video/VideoPlayerPanel.js @@ -16,6 +16,7 @@ Ox.VideoPlayerPanel VideoPlayerPanel Object key_* key_* muted muted paused paused + playbackRate: playback rate position position resizecalendar resizecalendar resolution resolution @@ -62,6 +63,7 @@ Ox.VideoPlayerPanel = function(options, self) { muted: false, out: 0, paused: true, + playbackRate: 1, playInToOut: false, position: 0, poster: '', @@ -106,6 +108,11 @@ Ox.VideoPlayerPanel = function(options, self) { paused: function() { self.$video.options({paused: self.options.paused}); }, + playbackRate: function() { + self.$video.options({ + playbackRate: self.options.playbackRate + }); + }, position: function() { self.$video.options({position: self.options.position}); self.$timeline.options({position: self.options.position}); @@ -167,6 +174,11 @@ Ox.VideoPlayerPanel = function(options, self) { self.$annotationPanel.options({selected: ''}); setPoint('in', self.options.position, false, true); }, + key_k: function togglePlaybackRate() { + that.options({ + playbackRate: self.options.playbackRate == 1 ? 2 : self.options.playbackRate == 2 ? 0.5 : 1 + }); + }, key_l: toggleLoop, key_left: function() { movePositionBy(-1 / self.options.fps);