2017-09-24 01:54:46 +02:00
if ( Debug . debug )
console . log ( "Loading: Resizer.js" ) ;
2018-05-12 02:51:58 +02:00
var StretchMode = {
NO _STRETCH = 0 ,
CONDITIONAL = 1 ,
FULL = 2
}
2018-01-02 03:36:29 +01:00
2018-05-08 23:35:16 +02:00
class Resizer {
2017-09-24 01:54:46 +02:00
2018-05-12 02:51:58 +02:00
constructor ( videoData ) {
this . conf = videoData ;
2018-05-08 23:35:16 +02:00
this . video = videoData . video ;
2018-05-12 02:51:58 +02:00
this . scaler = new Scaler ( ) ;
this . stretcher = new Stretcher ( ) ;
this . zoom = new Zoom ( ) ;
// load up default values
this . stretch = { mode : ExtensionConf . stretch . initialMode } ;
// restore watchdog. While true, applyCss() tries to re-apply new css until this value becomes false again
// value becomes false when width and height of <video> tag match with what we want to set. Only necessary when
// calling _res_restore() for some weird reason.
this . restore _wd = false ;
2017-09-24 01:54:46 +02:00
}
2018-05-12 02:51:58 +02:00
setAr ( ar , lastAr ) {
2018-05-08 23:35:16 +02:00
if ( Debug . debug ) {
console . log ( '[Resizer::setAr] trying to set ar. New ar:' , ar )
}
2017-09-24 01:54:46 +02:00
2018-05-12 02:51:58 +02:00
if ( lastAr ) {
this . lastAr = lastAr ;
} else {
this . lastAr = { type : 'static' , ar : ar } ;
}
2018-05-01 23:09:58 +02:00
2018-05-08 23:35:16 +02:00
if ( ! this . video ) {
console . log ( "No video detected." )
this . videoData . destroy ( ) ;
}
2018-05-01 23:09:58 +02:00
2017-11-13 22:35:04 +01:00
2018-05-12 02:51:58 +02:00
var dimensions = Scaler . calculateCrop ( ar , this . video , this . conf . player . dimensions ) ;
var stretchFactors ;
2018-01-18 22:34:42 +01:00
2018-05-12 02:51:58 +02:00
// if we set stretching, we apply stretching
if ( this . stretch . mode == StretchMode . FULL ) {
stretchFactors = Stretcher . calculateStretch ( dimensions ) ;
} else if ( this . stretch . mode == StretchMode . CONDITIONAL ) {
stretchFactors = Stretcher . conditionalStretch ( dimensions , ExtensionConf . stretch . conditionalDifferencePercent ) ;
2018-02-04 17:39:26 +01:00
}
2018-05-02 17:52:25 +02:00
2018-05-12 02:51:58 +02:00
zoom . applyZoom ( dimensions ) ;
2018-05-02 17:52:25 +02:00
2018-05-12 02:51:58 +02:00
}
2018-05-02 17:52:25 +02:00
2018-05-12 02:51:58 +02:00
}
2018-02-04 17:39:26 +01:00
2018-05-02 17:52:25 +02:00
2017-09-24 01:54:46 +02:00
var _res _computeOffsets = function ( vidDim , playerDim ) {
2018-05-02 17:52:25 +02:00
2017-12-29 23:34:40 +01:00
if ( Debug . debug )
2018-03-13 23:55:38 +01:00
console . log ( "[Resizer::_res_computeOffsets] video will be aligned to " , ExtensionConf . miscFullscreenSettings . videoFloat ) ;
2018-05-02 17:52:25 +02:00
2017-09-24 01:54:46 +02:00
var offsets = {
width : vidDim . width ,
height : vidDim . height ,
left : 0 ,
top : ( ( playerDim . height - vidDim . height ) / 2 )
}
2018-03-13 23:55:38 +01:00
if ( ExtensionConf . miscFullscreenSettings . videoFloat == "center" ) {
2017-09-24 01:54:46 +02:00
offsets . left = ( playerDim . width - vidDim . width ) / 2 ;
}
2018-03-13 23:55:38 +01:00
else if ( ExtensionConf . miscFullscreenSettings . videoFloat == "right" ) {
2017-09-24 01:54:46 +02:00
offsets . left = ( playerDim . width - vidDim . width ) ;
}
2018-03-18 15:14:57 +01:00
GlobalVars . correctedVideoDimensions . width = parseInt ( offsets . width ) ;
GlobalVars . correctedVideoDimensions . height = parseInt ( offsets . height ) ;
GlobalVars . correctedVideoDimensions . left = parseInt ( offsets . left ) ;
GlobalVars . correctedVideoDimensions . top = parseInt ( offsets . top ) ;
2017-09-24 01:54:46 +02:00
return offsets ;
}
2017-12-29 23:34:40 +01:00
var _res _align = function ( float ) {
if ( ! float )
2018-03-13 23:55:38 +01:00
float = ExtensionConf . miscFullscreenSettings . videoFloat ;
2017-09-24 01:54:46 +02:00
2017-12-29 23:34:40 +01:00
var dimensions = { left : 0 } ;
2017-09-24 01:54:46 +02:00
2017-12-29 23:34:40 +01:00
if ( float == "left" ) {
_res _applyCss ( dimensions ) ;
return ;
2017-09-24 01:54:46 +02:00
}
2017-12-29 23:34:40 +01:00
if ( float == "center" ) {
// dimensions.left =
// _res_applyCss(
2017-09-24 01:54:46 +02:00
}
}
2018-01-02 03:36:29 +01:00
var _res _setStyleString _maxRetries = 3 ;
var _res _setStyleString = function ( vid , styleString , count ) {
vid . setAttribute ( "style" , styleString ) ;
if ( _res _restore _wd ) {
2018-01-20 22:59:31 +01:00
var vid2 = GlobalVars . video ;
2018-04-22 14:35:40 +02:00
if ( vid2 == undefined || vid2 == null ) {
if ( Debug . debug )
console . log ( "[Resizer::_res_setStyleString] Video element went missing, nothing to do here." )
return ;
}
2018-01-02 03:36:29 +01:00
if (
styleString . indexOf ( "width: " + vid2 . style . width ) == - 1 ||
styleString . indexOf ( "height: " + vid2 . style . height ) == - 1 ) {
// css ni nastavljen?
// css not set?
if ( Debug . debug )
console . log ( "[Resizer::_res_setStyleString] Style string not set ???" ) ;
if ( count ++ < _res _setStyleString _maxRetries ) {
setTimeout ( _res _setStyleString , 200 , count ) ;
}
else if ( Debug . debug ) {
console . log ( "[Resizer::_res_setStyleString] we give up. css string won't be set" ) ;
}
}
else {
_res _restore _wd = false ;
}
}
else {
if ( Debug . debug )
console . log ( "[Resizer::_res_setStyleString] css applied. Style string:" , styleString ) ;
}
}
2017-12-29 23:34:40 +01:00
function _res _applyCss ( dimensions ) {
2018-04-22 14:35:40 +02:00
if ( GlobalVars . video == undefined || GlobalVars . video == null ) {
if ( Debug . debug )
console . log ( "[Resizer::_res_applyCss] Video went missing, doing nothing." ) ;
return ;
}
2017-09-24 01:54:46 +02:00
2017-12-29 23:34:40 +01:00
if ( Debug . debug )
console . log ( "[Resizer::_res_applyCss] Starting to apply css. this is what we're getting in:" , dimensions ) ;
2017-09-24 01:54:46 +02:00
2017-12-29 23:34:40 +01:00
if ( dimensions . top !== undefined )
dimensions . top = "top: " + Math . round ( dimensions . top ) + "px !important" ;
2017-09-24 01:54:46 +02:00
2017-12-29 23:34:40 +01:00
if ( dimensions . left !== undefined )
dimensions . left = "left: " + Math . round ( dimensions . left ) + "px !important" ;
2017-09-24 01:54:46 +02:00
2017-12-29 23:34:40 +01:00
if ( dimensions . width !== undefined )
dimensions . width = "width: " + Math . round ( dimensions . width ) + "px !important" ;
2017-11-13 22:35:04 +01:00
2017-12-29 23:34:40 +01:00
if ( dimensions . height !== undefined )
dimensions . height = "height: " + Math . round ( dimensions . height ) + "px !important" ;
2017-12-02 21:09:08 +01:00
// misc.
dimensions . position = "position: absolute !important" ;
2018-01-12 22:53:07 +01:00
dimensions . margin = "margin: 0px !important" ;
2017-11-13 22:35:04 +01:00
2018-02-05 22:46:38 +01:00
// save values for left and top to GlobalVars
GlobalVars . currentCss . top = dimensions . top ;
GlobalVars . currentCss . left = dimensions . left ;
2018-01-20 22:59:31 +01:00
var vid = GlobalVars . video ;
2017-12-29 23:34:40 +01:00
if ( Debug . debug )
console . log ( "[Resizer::_res_applyCss] trying to apply css. Css strings: " , dimensions , "video tag: " , vid ) ;
2017-12-02 21:09:08 +01:00
var styleArrayStr = vid . getAttribute ( 'style' ) ;
2017-11-13 22:35:04 +01:00
2017-12-02 21:09:08 +01:00
if ( styleArrayStr !== null && styleArrayStr !== undefined ) {
2017-11-13 22:35:04 +01:00
2017-12-29 23:34:40 +01:00
var styleArray = styleArrayStr . split ( ";" ) ;
2017-12-02 21:09:08 +01:00
for ( var i in styleArray ) {
styleArray [ i ] = styleArray [ i ] . trim ( ) ;
2017-12-29 23:34:40 +01:00
if ( styleArray [ i ] . startsWith ( "top:" ) ) {
2017-12-02 21:09:08 +01:00
styleArray [ i ] = dimensions . top ;
delete dimensions . top ;
}
else if ( styleArray [ i ] . startsWith ( "left:" ) ) {
styleArray [ i ] = dimensions . left ;
delete dimensions . left ;
}
else if ( styleArray [ i ] . startsWith ( "width:" ) ) {
styleArray [ i ] = dimensions . width ;
delete dimensions . width ;
}
else if ( styleArray [ i ] . startsWith ( "height:" ) ) {
styleArray [ i ] = dimensions . height ;
delete dimensions . height ;
}
else if ( styleArray [ i ] . startsWith ( "position:" ) ) {
styleArray [ i ] = dimensions . position ;
2018-01-20 22:59:31 +01:00
delete dimensions . position ;
}
else if ( styleArray [ i ] . startsWith ( "margin:" ) ) {
styleArray [ i ] = dimensions . margin ;
delete dimensions . margin ;
2017-12-02 21:09:08 +01:00
}
2017-11-13 22:35:04 +01:00
}
}
2017-12-02 21:09:08 +01:00
else {
var styleArray = [ ] ;
}
2017-09-24 01:54:46 +02:00
2017-11-13 22:35:04 +01:00
// add remaining elements
for ( var key in dimensions )
styleArray . push ( dimensions [ key ] ) ;
2018-04-25 20:39:52 +02:00
2017-11-13 22:35:04 +01:00
// build style string back
var styleString = "" ;
for ( var i in styleArray )
if ( styleArray [ i ] !== undefined && styleArray [ i ] !== "" )
styleString += styleArray [ i ] + "; " ;
2018-01-02 03:36:29 +01:00
_res _setStyleString ( vid , styleString ) ;
2017-12-29 23:34:40 +01:00
}
2018-02-05 22:46:38 +01:00
var _res _antiCssOverride = function ( ) {
// this means we haven't set our CSS yet, or that we changed video.
if ( GlobalVars . currentCss . top === null )
return ;
2018-04-22 14:35:40 +02:00
// this means video went missing.
if ( GlobalVars . video == undefined || GlobalVars . video == null )
return ;
2018-02-05 22:46:38 +01:00
2018-04-25 20:39:52 +02:00
// // our current css is fucky? Null, undefined and 0 are invalid values.
// if(! GlobalVars.currentCss.width || ! GlobalVars.currentCss.height )
// return;
2018-02-05 22:46:38 +01:00
var styleArrayStr = GlobalVars . video . getAttribute ( 'style' ) ;
if ( styleArrayStr !== null && styleArrayStr !== undefined ) {
var styleArray = styleArrayStr . split ( ";" ) ;
var stuffChecked = 0 ;
var stuffToCheck = 2 ;
for ( var i in styleArray ) {
styleArray [ i ] = styleArray [ i ] . trim ( ) ;
if ( styleArray [ i ] . startsWith ( "top:" ) ) {
2018-05-05 23:19:42 +02:00
// don't force css restore if currentCss.top is not defined
if ( GlobalVars . currentCss . top && styleArray [ i ] != GlobalVars . currentCss . top ) {
2018-02-05 22:46:38 +01:00
if ( Debug . debug ) {
console . log ( "[Resizer::_res_antiCssOverride] SOMEBODY TOUCHED MA SPAGHETT (our CSS got overriden, restoring our css)" ) ;
2018-04-25 20:39:52 +02:00
console . log ( "[Resizer::_res_antiCssOverride] MA SPAGHETT: top:" , GlobalVars . currentCss . top , "left:" , GlobalVars . currentCss . left , "thing that touched ma spaghett" , styleArrayStr ) ;
2018-02-05 22:46:38 +01:00
}
2018-02-12 23:28:31 +01:00
_res _restore ( ) ;
2018-02-05 22:46:38 +01:00
return ;
}
stuffChecked ++ ;
}
else if ( styleArray [ i ] . startsWith ( "left:" ) ) {
2018-05-05 23:19:42 +02:00
// don't force css restore if currentCss.left is not defined
if ( GlobalVars . currentCss . left && styleArray [ i ] != GlobalVars . currentCss . left ) {
2018-02-05 22:46:38 +01:00
if ( Debug . debug ) {
console . log ( "[Resizer::_res_antiCssOverride] SOMEBODY TOUCHED MA SPAGHETT (our CSS got overriden, restoring our css)" ) ;
2018-04-22 16:51:35 +02:00
console . log ( "[Resizer::_res_antiCssOverride] MA SPAGHETT: width:" , GlobalVars . currentCss . width , "height:" , GlobalVars . currentCss . height , "thing that touched ma spaghett" , styleArrayStr ) ;
2018-02-05 22:46:38 +01:00
}
2018-02-12 23:28:31 +01:00
_res _restore ( ) ;
2018-02-05 22:46:38 +01:00
return ;
}
stuffChecked ++ ;
}
2018-02-06 00:36:48 +01:00
if ( stuffChecked == stuffToCheck ) {
2018-05-02 17:52:25 +02:00
// if(Debug.debug){
// console.log("[Resizer::_res_antiCssOverride] My spaghett rests untouched. (nobody overrode our CSS, doing nothing)");
// }
2018-02-05 22:46:38 +01:00
return ;
}
}
}
}
2018-01-02 03:36:29 +01:00
2017-12-29 23:34:40 +01:00
var _res _restore = function ( ) {
2018-04-22 15:11:48 +02:00
if ( ! GlobalVars . video )
return false ;
2017-12-29 23:34:40 +01:00
if ( Debug . debug ) {
console . log ( "[Resizer::_res_restore] attempting to restore aspect ratio. this & settings:" , { 'this' : this , "settings" : Settings } ) ;
}
2018-01-02 03:36:29 +01:00
// this is true until we verify that css has actually been applied
_res _restore _wd = true ;
2018-01-27 22:25:25 +01:00
if ( GlobalVars . lastAr . type == "legacy" ) {
_res _legacyAr ( GlobalVars . lastAr . action ) ;
}
else if ( GlobalVars . lastAr . type == "static" ) {
_res _setAr ( GlobalVars . lastAr . ar ) ;
}
else if ( GlobalVars . lastAr . type == "original" ) {
_res _legacyAr ( "reset" ) ;
}
2018-02-12 23:28:31 +01:00
else if ( GlobalVars . lastAr . type == "auto" ) {
// do same as static, except keep lastAr to 'auto'. If we're here, this means video probably changed
// and there's something broken that prevents AR from working properly
2018-03-07 23:49:43 +01:00
var storeLastAr = { type : GlobalVars . lastAr . type , ar : GlobalVars . lastAr . ar } ;
_res _setAr ( GlobalVars . lastAr . ar ) ;
GlobalVars . lastAr = storeLastAr ;
// ArDetect.init();
2018-02-12 23:28:31 +01:00
}
2018-04-22 15:11:48 +02:00
return true ;
2018-01-27 22:25:25 +01:00
}
var _res _reset = function ( ) {
_res _legacyAr ( "reset" ) ;
2017-09-24 01:54:46 +02:00
}
var Resizer = {
2017-12-29 23:34:40 +01:00
_currentAr : - 1 ,
align : _res _align ,
2018-01-18 22:34:42 +01:00
setAr : _res _setAr ,
2017-11-13 22:35:04 +01:00
legacyAr : _res _legacyAr ,
2017-12-29 23:34:40 +01:00
reset : _res _reset ,
2018-02-05 22:46:38 +01:00
restore : _res _restore ,
antiCssOverride : _res _antiCssOverride
2017-09-24 01:54:46 +02:00
}