{"version":3,"sources":["llms-av.js"],"names":["onYouTubeIframeAPIReady","jQuery","each","YT","Player","this","events","onReady","event","window","llms","av","player_ready","target","$","self","settings","do_ajax_completion","$el","LLMS","Ajax","call","data","action","id","post_id","nonce","beforeSend","Spinner","start","error","xhr","status","stop","console","responseText","log","success","res","time","$seconds","html","append","find","setInterval","text","closest","click","get_custom_controls","$iframe","has_custom_controls","length","player_on_end","meta","track_event","require_video_completion","toggle_mark_complete","player_on_pause","addClass","removeClass","player_on_play","ts","prevent_default","preventDefault","enabled","$form","$btn","$links","off","removeAttr","on","attr","event_id","tracking","addEvent","update_progress","total","elapsed","buffered","seconds","$controls","elapsed_perc","css","$time","Math","floor","round","map","val","filter","i","join","show","vimeo_update_progress","player","Promise","all","getDuration","getCurrentTime","then","values","wistia_update_progress","duration","youtube_update_progress","getVideoLoadedFraction","init","tracking_settings","getSettings","$vimeos","wait_for","Vimeo","_wq","push","provider","autoplay","URLSearchParams","location","search","get","video_completed","element","$wrapper","player_state","is_playing","has_started","progress","paused_by_blur","play","getPaused","paused","pause","last_user_timestamp","setCurrentTime","getVideoId","extend","url","pause_on_blur","document","addEventListener","hidden","resume_on_focus","vimeo_player_ready","iframe","state","bind","hashedId","wistia_player_ready","getIframe","playVideo","getPlayerState","pauseVideo","getVideoUrl","seekTo","youtube_player_ready"],"mappings":"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","file":"../../js/llms-av.min.js","sourcesContent":["/**\n * Frontend Javascript\n *\n * @package LifterLMS_Advanced_Videos/Scripts\n *\n * @since 1.0.0-beta.1\n * @version 1.0.0-beta.14\n */\n\n/**\n * Method called automatically when the YouTube JS Player API is loaded.\n *\n * @since 1.0.0-beta.1\n * @scince [version] Parse youtube-nocookie sources too.\n *\n * @return {void}\n */\nfunction onYouTubeIframeAPIReady() {\n\n\tjQuery( '.llms-av-embed iframe[src*=\"youtube.com\"], .llms-av-embed iframe[src*=\"youtube-nocookie.com\"]' ).each( function() {\n\t\tnew YT.Player( jQuery( this )[ 0 ], {\n\t\t\tevents: {\n\t\t\t\tonReady: function( event ) {\n\t\t\t\t\twindow.llms.av.player_ready( 'youtube', event.target );\n\t\t\t\t},\n\t\t\t},\n\t\t} );\n\n\t} );\n\n}\n\n( function( $ ) {\n\n\t/**\n\t * LifterLMS Advanced Videos Class.\n\t *\n\t * @since 1.0.0-beta.1\n\t * @since 1.0.0-beta.2 Fix syntax error when checking for async loading of the Vimeo player SDK.\n\t * Introduce `get_custom_controls()` to retrieve the player custom controls jQuery element.\n\t * Fix issue causing elapsed time (in hh:mm:ss) to be incorrectly reported on slim controls player.\n\t * Add Wistia Support.\n\t * @since 1.0.0-beta.3 Fix video end event for Wistia players.\n\t * @since 1.0.0-beta.6 Toggle mark complete button only if the video completion is required.\n\t * @since 1.0.0-beta.7 Toggle mark complete button(take quiz) on init only if the video completion is\n\t * required and video not completed.\n\t * @since 1.0.0-beta.10 Added logic to track player `paused` event just before the window unloads (reload/exit).\n\t * Fixed issue that prevented the video to start from the right position with Wistia and Vimeo players.\n\t * Fixed js error when seeking while a Vimeo video is already playing.\n\t */\n\tvar LLMS_Advanced_Videos = function() {\n\n\t\tvar self = this,\n\t\t\tsettings = {};\n\n\t\t/**\n\t\t * Initialize.\n\t\t *\n\t\t * @since 1.0.0-beta.1\n\t\t * @since 1.0.0-beta.2 `'undefined'` not `undefined`.\n\t\t * Add Wistia support.\n\t\t *\n\t\t * @return {void}\n\t\t */\n\t\tthis.init = function() {\n\n\t\t\tvar tracking_settings = llms.tracking.getSettings();\n\t\t\tif ( tracking_settings.av ) {\n\t\t\t\tsettings = tracking_settings.av;\n\t\t\t}\n\n\t\t\t// Maybe initialize Vimeo players.\n\t\t\tvar $vimeos = $( '.llms-av-embed iframe[src*=\"vimeo.com\"]' );\n\t\t\tif ( $vimeos.length ) {\n\t\t\t\tLLMS.wait_for( function() {\n\t\t\t\t\treturn ( 'undefined' !== typeof Vimeo );\n\t\t\t\t}, function() {\n\t\t\t\t\t$vimeos.each( function() {\n\t\t\t\t\t\tself.player_ready( 'vimeo', new Vimeo.Player( $( this )[ 0 ] ) );\n\t\t\t\t\t} );\n\t\t\t\t} );\n\t\t\t}\n\n\t\t\t// Maybe initialize Wistia players.\n\t\t\tvar $wistias = $( '.llms-av-embed iframe[src*=\"wistia.net\"]' );\n\t\t\tif ( $wistias.length ) {\n\t\t\t\tLLMS.wait_for( function() {\n\t\t\t\t\treturn ( 'undefined' !== typeof window._wq );\n\t\t\t\t}, function() {\n\t\t\t\t\twindow._wq = window._wq || [];\n\t\t\t\t\t_wq.push( {\n\t\t\t\t\t\tid: '_all',\n\t\t\t\t\t\tonReady: function( player ) {\n\t\t\t\t\t\t\tself.player_ready( 'wistia', player );\n\t\t\t\t\t\t},\n\t\t\t\t\t} );\n\t\t\t\t} );\n\t\t\t}\n\n\t\t};\n\n\t\t/**\n\t\t * Callback function when a video player is ready for a provider.\n\t\t *\n\t\t * @since 1.0.0-beta.1\n\t\t * @since 1.0.0-beta.2 Add Wistia Support.\n\t\t * @since 1.0.0-beta.6 Toggle mark complete button on init only if the video completion is required.\n\t\t * @since 1.0.0-beta.7 Toggle mark complete button(take quiz) on init only if the video completion is\n\t\t * required and video not completed\n\t\t *\n\t\t * @param {string} provider Provider ID, eg \"youtube\".\n\t\t * @param {Object} player Player instance from the provider's player API/SDK.\n\t\t * @return {void}\n\t\t */\n\t\tthis.player_ready = function( provider, player ) {\n\n\t\t\tvar autoplay = ( '1' === new URLSearchParams( window.location.search ).get( 'autoplay' ) );\n\n\t\t\tif ( settings.require_video_completion && ! settings.video_completed ) {\n\t\t\t\ttoggle_mark_complete( false );\n\t\t\t}\n\n\t\t\tif ( 'vimeo' === provider ) {\n\t\t\t\tvimeo_player_ready( player, autoplay );\n\t\t\t} else if ( 'wistia' === provider ) {\n\t\t\t\twistia_player_ready( player, autoplay );\n\t\t\t} else if ( 'youtube' === provider ) {\n\t\t\t\tyoutube_player_ready( player, autoplay );\n\t\t\t}\n\n\t\t};\n\n\t\t/**\n\t\t * Record video completion via AJAX.\n\t\t *\n\t\t * @since 1.0.0-beta.1\n\t\t *\n\t\t * @param {Object} $el Wrapper element ('.llms-av-embed').\n\t\t * @return {void}\n\t\t */\n\t\tfunction do_ajax_completion( $el ) {\n\n\t\t\tLLMS.Ajax.call( {\n\t\t\t\tdata: {\n\t\t\t\t\taction: 'llms_av_video_ended',\n\t\t\t\t\tid: settings.post_id,\n\t\t\t\t\tnonce: settings.nonce,\n\t\t\t\t},\n\t\t\t\tbeforeSend: function() {\n\t\t\t\t\tLLMS.Spinner.start( $el );\n\t\t\t\t},\n\t\t\t\terror: function( xhr, status, error ) {\n\n\t\t\t\t\tLLMS.Spinner.stop( $el );\n\t\t\t\t\tconsole.error( xhr.responseText + ' (' + error + ' ' + status + ')' ); /* eslint-disable-line no-console */\n\t\t\t\t\tconsole.log( xhr ); /* eslint-disable-line no-console */\n\n\t\t\t\t},\n\t\t\t\tsuccess: function( res ) {\n\n\t\t\t\t\tLLMS.Spinner.stop( $el );\n\n\t\t\t\t\tif ( res.html ) {\n\t\t\t\t\t\t$el.append( res.html );\n\t\t\t\t\t\tstart_countdown( $el );\n\t\t\t\t\t}\n\n\t\t\t\t},\n\n\t\t\t} );\n\n\t\t}\n\n\t\t/**\n\t\t * Retrieves the custom controls, if any.\n\t\t *\n\t\t * @since 1.0.0-beta.2\n\t\t *\n\t\t * @param {Object} $iframe Iframe object.\n\t\t * @return {Object} Controls element or zero length object, if no custom controls.\n\t\t */\n\t\tfunction get_custom_controls( $iframe ) {\n\t\t\treturn $iframe.closest( '.llms-av-embed' ).find( '.llms-av-controls' );\n\t\t}\n\n\t\t/**\n\t\t * Determines if the video player has custom controls.\n\t\t *\n\t\t * This will be true when the \"control-less\" UI is loaded.\n\t\t *\n\t\t * @since 1.0.0-beta.1\n\t\t * @since 1.0.0-beta.2 Use `get_custom_controls()` to retrieve the custom controls jQuery element.\n\t\t *\n\t\t * @param {Object} $iframe Iframe object.\n\t\t * @return {boolean} True if controls exist, false otherwise.\n\t\t */\n\t\tfunction has_custom_controls( $iframe ) {\n\t\t\treturn get_custom_controls( $iframe ).length ? true : false;\n\t\t}\n\n\t\t/**\n\t\t * Player event for video playback completion.\n\t\t *\n\t\t * @since 1.0.0-beta.1\n\t\t * @since 1.0.0-beta.6 Toggle mark complete button only if the video completion is required.\n\t\t *\n\t\t * @param {Object} $el Wrapper element, `.llms-av-embed`.\n\t\t * @param {Object} meta {\n\t\t * Hash of meta information for the event.\n\t\t *\n\t\t * @type {number} ts Duration of the video that's been played (in seconds).\n\t\t * @type {number} duration Total video duration (in seconds).\n\t\t * @type {string} url Video URL.\n\t\t * @type {string} provider Provider ID.\n\t\t * }\n\t\t * @return {void}\n\t\t */\n\t\tfunction player_on_end( $el, meta ) {\n\n\t\t\ttrack_event( 'ended', meta );\n\t\t\tdo_ajax_completion( $el );\n\t\t\tif ( settings.require_video_completion ) {\n\t\t\t\ttoggle_mark_complete( true );\n\t\t\t}\n\n\t\t}\n\n\t\t/**\n\t\t * Player event for video pause.\n\t\t *\n\t\t * @since 1.0.0-beta.1\n\t\t *\n\t\t * @param {Object} $el Wrapper element, `.llms-av-embed`.\n\t\t * @param {Object} meta {\n\t\t * Hash of meta information for the event.\n\t\t *\n\t\t * @type {number} ts Duration of the video that's been played (in seconds).\n\t\t * @type {number} duration Total video duration (in seconds).\n\t\t * @type {string} url Video URL.\n\t\t * @type {string} provider Provider ID.\n\t\t * }\n\t\t * @return {void}\n\t\t */\n\t\tfunction player_on_pause( $el, meta ) {\n\n\t\t\ttrack_event( 'paused', meta );\n\t\t\t$el.addClass( 'state--paused' );\n\t\t\t$el.removeClass( 'state--playing' );\n\n\t\t}\n\n\t\t/**\n\t\t * Player event for video play.\n\t\t *\n\t\t * @since 1.0.0-beta.1\n\t\t *\n\t\t * @param {Object} $el Wrapper element, `.llms-av-embed`.\n\t\t * @param {Object} meta {\n\t\t * Hash of meta information for the event.\n\t\t *\n\t\t * @type {number} ts Duration of the video that's been played (in seconds).\n\t\t * @type {number} duration Total video duration (in seconds).\n\t\t * @type {string} url Video URL.\n\t\t * @type {string} provider Provider ID.\n\t\t * }\n\t\t * @return {void}\n\t\t */\n\t\tfunction player_on_play( $el, meta ) {\n\n\t\t\tvar event_id = meta.ts < 1 ? 'started' : 'played';\n\t\t\ttrack_event( event_id, meta );\n\n\t\t\t$el.addClass( 'state--playing' );\n\t\t\t$el.removeClass( 'state--paused' );\n\n\t\t}\n\n\t\t/**\n\t\t * Prevent \"Mark Complete\" form submission and take quiz/assignment button clicks.\n\t\t *\n\t\t * This is unbound when the video has been completed.\n\t\t *\n\t\t * @since 1.0.0-beta.1\n\t\t *\n\t\t * @param {Object} event JS event object.\n\t\t * @return {void}\n\t\t */\n\t\tfunction prevent_default( event ) {\n\t\t\tevent.preventDefault();\n\t\t}\n\n\t\t/**\n\t\t * Start a countdown time in the \"Next\" button within the Post Video UI.\n\t\t *\n\t\t * @since 1.0.0-beta.1\n\t\t *\n\t\t * @param {Object} $el Wrapper element ('.llms-av-embed').\n\t\t * @return {void}\n\t\t */\n\t\tfunction start_countdown( $el ) {\n\n\t\t\tvar $seconds = $el.find( '.llms-av-pv--seconds' ),\n\t\t\t\ttime;\n\n\t\t\tsetInterval( function() {\n\n\t\t\t\ttime = ( $seconds.text() * 1 ) - 1;\n\t\t\t\tif ( 1 === time ) {\n\t\t\t\t\t$seconds.closest( 'a' )[ 0 ].click();\n\t\t\t\t}\n\n\t\t\t\tif ( time >= 0 ) {\n\t\t\t\t\t$seconds.text( time );\n\t\t\t\t}\n\n\t\t\t}, 1000 );\n\n\t\t}\n\n\t\t/**\n\t\t * Converts seconds to HH:MM:SS format.\n\t\t *\n\t\t * @since 1.0.0-beta.1\n\t\t *\n\t\t * @param {number} seconds Number of seconds.\n\t\t * @return {string} HH:MM:SS string.\n\t\t */\n\t\tfunction to_hhmmss( seconds ) {\n\n\t\t\tvar hours = Math.floor( seconds / 3600 ),\n\t\t\t\tmins = Math.floor( seconds / 60 ) % 60,\n\t\t\t\tsecs = Math.round( seconds % 60 );\n\n\t\t\treturn [ hours, mins, secs ].\n\t\t\t\tmap( function( val ) {\n\t\t\t\t\treturn val < 10 ? '0' + val : val;\n\t\t\t\t} ).\n\t\t\t\tfilter( function( val, i ) {\n\t\t\t\t\treturn val !== '00' || i > 0;\n\t\t\t\t} ).\n\t\t\t\tjoin( ':' );\n\n\t\t}\n\n\t\t/**\n\t\t * Toggles mark complete form submission.\n\t\t *\n\t\t * @since 1.0.0-beta.1\n\t\t *\n\t\t * @param {boolean} enabled If true, enables submission, otherwise disables it.\n\t\t * @return {void}\n\t\t */\n\t\tfunction toggle_mark_complete( enabled ) {\n\n\t\t\tvar $form = $( '.llms-complete-lesson-form' ),\n\t\t\t\t$btn = $( '.llms-complete-lesson-form button[type=\"submit\"]' ),\n\t\t\t\t$links = $( '#llms_start_quiz, #llms-start-assignment' );\n\n\t\t\tif ( true === enabled ) {\n\t\t\t\t$form.off( 'submit', prevent_default );\n\t\t\t\t$btn.removeAttr( 'disabled' );\n\t\t\t\t$links.removeClass( 'llms-av-disabled' ).off( 'click', prevent_default );\n\t\t\t} else {\n\t\t\t\t$form.on( 'submit', prevent_default );\n\t\t\t\t$btn.attr( 'disabled', 'disabled' );\n\t\t\t\t$links.addClass( 'llms-av-disabled' ).on( 'click', prevent_default );\n\t\t\t}\n\n\t\t}\n\n\t\t/**\n\t\t * Add a new event via llms.tracking\n\t\t *\n\t\t * @since 1.0.0-beta.1\n\t\t *\n\t\t * @param {string} event_id Video event id, eg: 'started' or 'paused'.\n\t\t * @param {Object} meta {\n\t\t * Hash of meta information for the event.\n\t\t *\n\t\t * @type {number} ts Duration of the video that's been played (in seconds).\n\t\t * @type {number} duration Total video duration (in seconds).\n\t\t * @type {string} url Video URL.\n\t\t * @type {string} provider Provider ID.\n\t\t * }\n\t\t * @return {void}\n\t\t */\n\t\tfunction track_event( event_id, meta ) {\n\n\t\t\tllms.tracking.addEvent( 'video.' + event_id, {\n\t\t\t\tmeta: meta,\n\t\t\t} );\n\n\t\t}\n\n\t\t/**\n\t\t * Update the progress of the \"control-less\" UI.\n\t\t *\n\t\t * @since 1.0.0-beta.1\n\t\t * @since 1.0.0-beta.2 Use `get_custom_controls()` to retrieve the custom controls jQuery element.\n\t\t * Fix issue causing elapsed time (in hh:mm:ss) to be incorrectly reported.\n\t\t *\n\t\t * @param {Object} $iframe Iframe object.\n\t\t * @param {number} total Total video duration (in seconds).\n\t\t * @param {number} elapsed Total elapsed time (in seconds).\n\t\t * @param {number} buffered Total time that's been buffered (in seconds).\n\t\t * @return {void}\n\t\t */\n\t\tfunction update_progress( $iframe, total, elapsed, buffered ) {\n\n\t\t\tvar $controls = get_custom_controls( $iframe );\n\n\t\t\tif ( false !== elapsed ) {\n\t\t\t\tvar elapsed_perc = 0 === elapsed ? 0 : ( elapsed / total ) * 100;\n\t\t\t\t$controls.find( '.llms-av--progress .llms-av--elapsed' ).css( 'width', 'calc( ' + elapsed_perc + '% - 2px' );\n\t\t\t}\n\n\t\t\tif ( false !== buffered ) {\n\t\t\t\tbuffered = 0 === buffered ? 0 : ( buffered / total ) * 100;\n\t\t\t\t$controls.find( '.llms-av--progress .llms-av--buffered' ).css( 'width', 'calc( ' + buffered + '% - 2px' );\n\t\t\t}\n\n\t\t\tif ( false !== total ) {\n\n\t\t\t\tvar $time = $controls.find( '.llms-av--progress .llms-av--time' ),\n\t\t\t\t\ttime = to_hhmmss( elapsed );\n\n\t\t\t\t$time.text( time );\n\t\t\t\tif ( '00:00' !== time ) {\n\t\t\t\t\t$time.show();\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\t\t/**\n\t\t * Callback function when a Vimeo player is ready.\n\t\t *\n\t\t * Binds all events and manages the interface.\n\t\t *\n\t\t * @since 1.0.0-beta.1\n\t\t * @since 1.0.0-beta.2 Use `get_custom_controls()` to retrieve the custom controls jQuery element.\n\t\t * @since 1.0.0-beta.10 Added logic to track player `paused` event just before the window unloads (reload/exit).\n\t\t * Fixed issue that prevented the video to start from the right position.\n\t\t * Fixed js error when seeking while the video is already playing.\n\t\t *\n\t\t * @param {Object} player Vimeo player instance.\n\t\t * @param {boolean} autoplay If autoplay is enabled for the video.\n\t\t * @return {void}\n\t\t */\n\t\tfunction vimeo_player_ready( player, autoplay ) {\n\n\t\t\tvar $iframe = $( player.element ),\n\t\t\t\t$wrapper = $iframe.closest( '.llms-av-embed' ),\n\t\t\t\tplayer_state = {\n\t\t\t\t\tid: 0,\n\t\t\t\t\t// Is the player playing.\n\t\t\t\t\tis_playing: false,\n\t\t\t\t\t// Has the play button been clicked at least one time this page load.\n\t\t\t\t\thas_started: false,\n\t\t\t\t\tduration: 0,\n\t\t\t\t\tprogress: '',\n\t\t\t\t\tpaused_by_blur: false,\n\t\t\t\t};\n\n\t\t\t$wrapper.addClass( 'provider--vimeo' );\n\n\t\t\t// Start playing if autoplay is on.\n\t\t\tif ( true === autoplay ) {\n\t\t\t\tplayer.play();\n\t\t\t}\n\n\t\t\t// Controls are disabled, must update the UI on our custom controls.\n\t\t\tif ( has_custom_controls( $iframe ) ) {\n\t\t\t\tvimeo_update_progress( $iframe, player );\n\t\t\t\tsetInterval( function() {\n\t\t\t\t\tvimeo_update_progress( $iframe, player );\n\t\t\t\t}, 150 );\n\t\t\t\tget_custom_controls( $iframe ).find( '.llms-av--play' ).on( 'click', function( event ) {\n\t\t\t\t\tevent.preventDefault();\n\t\t\t\t\tplayer.getPaused().then( function( paused ) {\n\t\t\t\t\t\tif ( true === paused ) {\n\t\t\t\t\t\t\tplayer.play();\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\tplayer.pause();\n\t\t\t\t\t\t}\n\t\t\t\t\t} );\n\t\t\t\t} );\n\n\t\t\t\t// Update buffer independently.\n\t\t\t\tplayer.on( 'progress', function( progress ) {\n\t\t\t\t\tupdate_progress( $iframe, progress.duration, false, progress.seconds );\n\t\t\t\t} );\n\t\t\t}\n\n\t\t\tplayer.on( 'play', function( data ) {\n\t\t\t\t/**\n\t\t\t\t * This event is fired even when seeking on the progress bar while the player is playing.\n\t\t\t\t * In that case no data is passed.\n\t\t\t\t *\n\t\t\t\t * @see https://github.com/gocodebox/lifterlms-advanced-videos/issues/24\n\t\t\t\t */\n\t\t\t\tif ( ! data ) {\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t\t// Resume from saved timestamp if this is the first play and a timestamp is saved.\n\t\t\t\tif ( ! player_state.has_started && settings.last_user_timestamp <= data.duration - 5 ) {\n\t\t\t\t\tplayer.setCurrentTime( settings.last_user_timestamp );\n\t\t\t\t\t/**\n\t\t\t\t\t * Set the data.seconds (to be stored as event meta) with the correct timestamp.\n\t\t\t\t\t *\n\t\t\t\t\t * @see https://github.com/gocodebox/lifterlms-advanced-videos/issues/30 2)\n\t\t\t\t\t */\n\t\t\t\t\tdata.seconds = settings.last_user_timestamp;\n\t\t\t\t}\n\t\t\t\tplayer_state.has_started = true;\n\n\t\t\t\tplayer.getVideoId().then( function( id ) {\n\n\t\t\t\t\t// Setup the player_state.\n\t\t\t\t\t$.extend(\n\t\t\t\t\t\tplayer_state,\n\t\t\t\t\t\tdata,\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tid: id,\n\t\t\t\t\t\t\tis_playing: true,\n\t\t\t\t\t\t}\n\t\t\t\t\t);\n\n\t\t\t\t\tplayer_on_play( $wrapper, {\n\t\t\t\t\t\tts: data.seconds,\n\t\t\t\t\t\tduration: data.duration,\n\t\t\t\t\t\turl: 'https://vimeo.com/' + id,\n\t\t\t\t\t\tprovider: 'vimeo',\n\t\t\t\t\t} );\n\t\t\t\t} );\n\n\t\t\t} );\n\n\t\t\tplayer.on( 'pause', function( data ) {\n\n\t\t\t\tplayer_state.is_playing = false;\n\n\t\t\t\tplayer.getVideoId().then( function( id ) {\n\t\t\t\t\tplayer_on_pause( $wrapper, {\n\t\t\t\t\t\tts: data.seconds,\n\t\t\t\t\t\tduration: data.duration,\n\t\t\t\t\t\turl: 'https://vimeo.com/' + id,\n\t\t\t\t\t\tprovider: 'vimeo',\n\t\t\t\t\t} );\n\t\t\t\t} );\n\t\t\t} );\n\n\t\t\tplayer.on( 'ended', function( data ) {\n\n\t\t\t\tplayer_state.is_playing = false;\n\n\t\t\t\tplayer.getVideoId().then( function( id ) {\n\t\t\t\t\tplayer_on_end( $wrapper, {\n\t\t\t\t\t\tts: data.seconds,\n\t\t\t\t\t\tduration: data.duration,\n\t\t\t\t\t\turl: 'https://vimeo.com/' + id,\n\t\t\t\t\t\tprovider: 'vimeo',\n\t\t\t\t\t} );\n\t\t\t\t} );\n\t\t\t} );\n\n\t\t\t/**\n\t\t\t * Cache the player progress\n\t\t\t *\n\t\t\t * @since 1.0.0-beta.10\n\t\t\t *\n\t\t\t * @return void\n\t\t\t */\n\t\t\tplayer.on( 'progress', function() {\n\t\t\t\t/**\n\t\t\t\t * The 'progress' event seems to be fired every 5-6s while the player plays.\n\t\t\t\t *\n\t\t\t\t * If we decide that we need much more precision, we should use the 'timeupdate'\n\t\t\t\t * event which fires \"generally every 250 ms during playback, but the interval can vary depending on the browser.\",\n\t\t\t\t * according to the api doc: https://developer.vimeo.com/player/sdk/reference#timeupdate\n\t\t\t\t */\n\t\t\t\tplayer.getCurrentTime().then( function( ts ) {\n\t\t\t\t\tplayer_state.progress = ts;\n\t\t\t\t} );\n\t\t\t} );\n\n\t\t\tif ( settings.pause_on_blur ) {\n\n\t\t\t\tdocument.addEventListener( 'visibilitychange', function() {\n\n\t\t\t\t\tif ( document.hidden && settings.pause_on_blur ) {\n\n\t\t\t\t\t\tplayer.getPaused().then( function( paused ) {\n\t\t\t\t\t\t\tif ( false === paused ) {\n\t\t\t\t\t\t\t\tplayer_state.paused_by_blur = true;\n\t\t\t\t\t\t\t\tplayer.pause();\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t} );\n\n\t\t\t\t\t} else if ( ! document.hidden && settings.resume_on_focus && player_state.paused_by_blur ) {\n\t\t\t\t\t\tplayer.play();\n\t\t\t\t\t\tplayer_state.paused_by_blur = false;\n\t\t\t\t\t}\n\n\t\t\t\t} );\n\n\t\t\t}\n\n\t\t\t/**\n\t\t\t * Before unloading the window (reload/exit)\n\t\t\t *\n\t\t\t * @since 1.0.0-beta.10\n\t\t\t *\n\t\t\t * @return void\n\t\t\t */\n\t\t\twindow.addEventListener( 'beforeunload', function() {\n\t\t\t\t/**\n\t\t\t\t * When the window is closed the player will be paused\n\t\t\t\t * but not 'paused' event will be catched, so here we\n\t\t\t\t * track the `pause` event anyways, with the latest available\n\t\t\t\t * information about the player state.\n\t\t\t\t *\n\t\t\t\t * For some reason, using the vimeo api in this callback\n\t\t\t\t * was not reliable, the information - retrieved via promises -\n\t\t\t\t * always came too late, after the window was reloaded.\n\t\t\t\t *\n\t\t\t\t * We don't actually pause the player here so there will always be\n\t\t\t\t * a small difference in seconds (<10s) between the latest actual\n\t\t\t\t * progress timestamp and the one we save.\n\t\t\t\t * This is also due to the fact that we save the latest cached\n\t\t\t\t * progress timestamp when the player's `progress` event is fired,\n\t\t\t\t * which seems to happen each 5-6s.\n\t\t\t\t */\n\t\t\t\tif ( player_state.is_playing ) {\n\t\t\t\t\ttrack_event( 'paused', {\n\t\t\t\t\t\tts: player_state.progress,\n\t\t\t\t\t\tduration: player_state.duration,\n\t\t\t\t\t\turl: 'https://vimeo.com/' + player_state.id,\n\t\t\t\t\t\tprovider: 'vimeo',\n\t\t\t\t\t} );\n\t\t\t\t}\n\t\t\t} );\n\n\t\t}\n\n\t\t/**\n\t\t * Update \"Control-less\" interface for a Vimeo player.\n\t\t *\n\t\t * @since 1.0.0-beta.1\n\t\t *\n\t\t * @param {Object} $iframe Iframe object.\n\t\t * @param {Object} player Vimeo Player instance.\n\t\t * @return {void}\n\t\t */\n\t\tfunction vimeo_update_progress( $iframe, player ) {\n\n\t\t\tPromise.all( [ player.getDuration(), player.getCurrentTime() ] ).then( function( values ) {\n\t\t\t\tupdate_progress( $iframe, values[ 0 ], values[ 1 ], false );\n\t\t\t} );\n\n\t\t}\n\n\t\t/**\n\t\t * Callback function when a Wistia player is ready.\n\t\t *\n\t\t * Binds all events and manages the interface.\n\t\t *\n\t\t * @since 1.0.0-beta.2\n\t\t * @since 1.0.0-beta.3 Fix video end event.\n\t\t * @since 1.0.0-beta.10 Added logic to track player `paused` event just before the window unloads (reload/exit).\n\t\t * Fixed issue that prevented the video to start from the right position.\n\t\t *\n\t\t * @param {Object} player Wistia player instance.\n\t\t * @param {boolean} autoplay If autoplay is enabled for the video.\n\t\t * @return {void}\n\t\t */\n\t\tfunction wistia_player_ready( player, autoplay ) {\n\n\t\t\tvar $iframe = $( player.iframe ),\n\t\t\t\t$wrapper = $iframe.closest( '.llms-av-embed' ),\n\t\t\t\tplayer_state = {\n\t\t\t\t\t// Has the play button been clicked at least one time this page load.\n\t\t\t\t\thas_started: false,\n\t\t\t\t\tpaused_by_blur: false,\n\t\t\t\t};\n\n\t\t\t$wrapper.addClass( 'provider--wistia' );\n\n\t\t\t// Start playing if autoplay is on.\n\t\t\tif ( true === autoplay ) {\n\t\t\t\tplayer.play();\n\t\t\t}\n\n\t\t\t// Controls are disabled, must update the UI on our custom controls.\n\t\t\tif ( has_custom_controls( $iframe ) ) {\n\t\t\t\twistia_update_progress( $iframe, player );\n\t\t\t\tsetInterval( function() {\n\t\t\t\t\twistia_update_progress( $iframe, player );\n\t\t\t\t}, 150 );\n\t\t\t\tget_custom_controls( $iframe ).find( '.llms-av--play' ).on( 'click', function( event ) {\n\t\t\t\t\tevent.preventDefault();\n\t\t\t\t\tif ( 'playing' === player.state() ) {\n\t\t\t\t\t\tplayer.pause();\n\t\t\t\t\t} else {\n\t\t\t\t\t\tplayer.play();\n\t\t\t\t\t}\n\n\t\t\t\t} );\n\t\t\t}\n\n\t\t\tplayer.bind( 'play', function() {\n\n\t\t\t\tvar duration = player.duration(),\n\t\t\t\t\ttime = player.time();\n\n\t\t\t\t// resume from saved timestamp if this is the first play and a timestamp is saved.\n\t\t\t\tif ( ! player_state.has_started && settings.last_user_timestamp <= duration - 5 ) {\n\t\t\t\t\tplayer.time( settings.last_user_timestamp );\n\t\t\t\t\t/**\n\t\t\t\t\t * Make sure we log the correct timestamp.\n\t\t\t\t\t *\n\t\t\t\t\t * Looks like that getting the player time through `player.time()` right after\n\t\t\t\t\t * having set it through `player.time(seconds)` doesn't return `seconds` as one\n\t\t\t\t\t * might expect, but `0` - the starting time.\n\t\t\t\t\t *\n\t\t\t\t\t * @see https://github.com/gocodebox/lifterlms-advanced-videos/issues/30 2)\n\t\t\t\t\t */\n\t\t\t\t\ttime = settings.last_user_timestamp;\n\t\t\t\t}\n\n\t\t\t\tplayer_state.has_started = true;\n\n\t\t\t\tplayer_on_play( $wrapper, {\n\t\t\t\t\tts: time,\n\t\t\t\t\tduration: duration,\n\t\t\t\t\tid: player.hashedId(),\n\t\t\t\t\tprovider: 'wistia',\n\t\t\t\t} );\n\n\t\t\t} );\n\n\t\t\tplayer.bind( 'pause', function() {\n\t\t\t\tplayer_on_pause( $wrapper, {\n\t\t\t\t\tts: player.time(),\n\t\t\t\t\tduration: player.duration(),\n\t\t\t\t\tid: player.hashedId(),\n\t\t\t\t\tprovider: 'wistia',\n\t\t\t\t} );\n\n\t\t\t} );\n\n\t\t\tplayer.bind( 'end', function() {\n\t\t\t\tplayer_on_end( $wrapper, {\n\t\t\t\t\tts: player.time(),\n\t\t\t\t\tduration: player.duration(),\n\t\t\t\t\tid: player.hashedId(),\n\t\t\t\t\tprovider: 'wistia',\n\t\t\t\t} );\n\t\t\t} );\n\n\t\t\tif ( settings.pause_on_blur ) {\n\n\t\t\t\tdocument.addEventListener( 'visibilitychange', function() {\n\n\t\t\t\t\tif ( document.hidden && settings.pause_on_blur ) {\n\n\t\t\t\t\t\tif ( 'playing' === player.state() ) {\n\t\t\t\t\t\t\tplayer_state.paused_by_blur = true;\n\t\t\t\t\t\t\tplayer.pause();\n\t\t\t\t\t\t}\n\n\t\t\t\t\t} else if ( ! document.hidden && settings.resume_on_focus && player_state.paused_by_blur ) {\n\t\t\t\t\t\tplayer.play();\n\t\t\t\t\t\tplayer_state.paused_by_blur = false;\n\t\t\t\t\t}\n\n\t\t\t\t} );\n\n\t\t\t}\n\n\t\t\t/**\n\t\t\t * Before unloading the window (reload/exit)\n\t\t\t *\n\t\t\t * @since 1.0.0-beta.10\n\t\t\t *\n\t\t\t * @return void\n\t\t\t */\n\t\t\twindow.addEventListener( 'beforeunloaad', function() {\n\t\t\t\t/**\n\t\t\t\t * When the window is closed the player will be paused\n\t\t\t\t * but not 'paused' event will be catched, so here we\n\t\t\t\t * track the pause event anyways.\n\t\t\t\t */\n\t\t\t\tif ( 'playing' === player.state() ) {\n\t\t\t\t\ttrack_event( 'paused', {\n\t\t\t\t\t\tts: player.time(),\n\t\t\t\t\t\tduration: player.duration(),\n\t\t\t\t\t\tid: player.hashedId(),\n\t\t\t\t\t\tprovider: 'wistia',\n\t\t\t\t\t} );\n\t\t\t\t}\n\t\t\t} );\n\n\t\t}\n\n\t\t/**\n\t\t * Update \"Control-less\" interface for a Vimeo player.\n\t\t *\n\t\t * @since 1.0.0-beta.2\n\t\t *\n\t\t * @param {Object} $iframe Iframe object.\n\t\t * @param {Object} player Vimeo Player instance.\n\t\t * @return {void}\n\t\t */\n\t\tfunction wistia_update_progress( $iframe, player ) {\n\n\t\t\tupdate_progress( $iframe, player.duration(), player.time(), false );\n\n\t\t}\n\n\t\t/**\n\t\t * Callback function when a YouTube player is ready.\n\t\t *\n\t\t * Binds all events and manages the interface.\n\t\t *\n\t\t * @since 1.0.0-beta.1\n\t\t * @since 1.0.0-beta.10 Added logic to track player `paused` event just before the window unloads (reload/exit).\n\t\t * When resuming a video, avoid tracking a `started` event at 0s.\n\t\t *\n\t\t * @param {Object} player YouTube player instance.\n\t\t * @param {boolean} autoplay If autoplay is enabled for the video.\n\t\t * @return {void}\n\t\t */\n\t\tfunction youtube_player_ready( player, autoplay ) {\n\n\t\t\tvar $iframe = $( player.getIframe() ),\n\t\t\t\t$wrapper = $iframe.closest( '.llms-av-embed' ),\n\t\t\t\tplayer_state = {\n\t\t\t\t\t// Has the play button been clicked at least one time this page load.\n\t\t\t\t\thas_started: false,\n\t\t\t\t\tpaused_by_blur: false,\n\t\t\t\t};\n\n\t\t\t$wrapper.addClass( 'provider--youtube' );\n\n\t\t\t// Start playing if autoplay is on.\n\t\t\tif ( true === autoplay ) {\n\t\t\t\tplayer.playVideo();\n\t\t\t}\n\n\t\t\t// Controls are disabled, must update the UI on our custom controls.\n\t\t\tif ( has_custom_controls( $iframe ) ) {\n\t\t\t\tyoutube_update_progress( $iframe, player );\n\t\t\t\tsetInterval( function() {\n\t\t\t\t\tyoutube_update_progress( $iframe, player );\n\t\t\t\t}, 150 );\n\t\t\t\tget_custom_controls( $iframe ).find( '.llms-av--play' ).on( 'click', function( event ) {\n\t\t\t\t\tevent.preventDefault();\n\t\t\t\t\tvar state = player.getPlayerState();\n\t\t\t\t\tif ( 1 === state ) { // playing.\n\t\t\t\t\t\tplayer.pauseVideo();\n\t\t\t\t\t} else { // any other state.\n\t\t\t\t\t\tplayer.playVideo();\n\t\t\t\t\t}\n\t\t\t\t} );\n\t\t\t}\n\n\t\t\tplayer.addEventListener( 'onStateChange', function( event ) {\n\n\t\t\t\tvar time = Math.round( player.getCurrentTime() ),\n\t\t\t\t\turl = player.getVideoUrl(),\n\t\t\t\t\tduration = player.getDuration();\n\n\t\t\t\tif ( 0 === event.data ) { // ended.\n\n\t\t\t\t\tplayer_on_end( $wrapper, {\n\t\t\t\t\t\tts: time,\n\t\t\t\t\t\tduration: duration,\n\t\t\t\t\t\turl: url,\n\t\t\t\t\t\tprovider: 'youtube',\n\t\t\t\t\t} );\n\n\t\t\t\t} else if ( 1 === event.data ) { // started.\n\n\t\t\t\t\t// Resume from saved timestamp if this is the first play and a timestamp is saved.\n\t\t\t\t\tif ( ! player_state.has_started && settings.last_user_timestamp <= duration - 5 ) {\n\t\t\t\t\t\t/**\n\t\t\t\t\t\t * `seekTo()` fires another `onStateChange` with 1 === event.data\n\t\t\t\t\t\t * So let's mark the player started - to avoid to enter this if block again -\n\t\t\t\t\t\t * and bail.\n\t\t\t\t\t\t */\n\t\t\t\t\t\tplayer.seekTo( settings.last_user_timestamp );\n\t\t\t\t\t\tplayer_state.has_started = true;\n\t\t\t\t\t\treturn;\n\t\t\t\t\t}\n\n\t\t\t\t\tplayer_on_play( $wrapper, {\n\t\t\t\t\t\tts: time,\n\t\t\t\t\t\tduration: duration,\n\t\t\t\t\t\turl: url,\n\t\t\t\t\t\tprovider: 'youtube',\n\t\t\t\t\t} );\n\n\t\t\t\t\tplayer_state.has_started = true;\n\n\t\t\t\t} else if ( 2 === event.data ) { // paused.\n\n\t\t\t\t\tplayer_on_pause( $wrapper, {\n\t\t\t\t\t\tts: time,\n\t\t\t\t\t\tduration: duration,\n\t\t\t\t\t\turl: url,\n\t\t\t\t\t\tprovider: 'youtube',\n\t\t\t\t\t} );\n\n\t\t\t\t}\n\n\t\t\t} );\n\n\t\t\tif ( settings.pause_on_blur ) {\n\n\t\t\t\tdocument.addEventListener( 'visibilitychange', function() {\n\n\t\t\t\t\tif ( document.hidden && 2 !== player.getPlayerState() && settings.pause_on_blur ) {\n\t\t\t\t\t\tplayer_state.paused_by_blur = true;\n\t\t\t\t\t\tplayer.pauseVideo();\n\t\t\t\t\t} else if ( ! document.hidden && settings.resume_on_focus && player_state.paused_by_blur ) {\n\t\t\t\t\t\tplayer_state.paused_by_blur = false;\n\t\t\t\t\t\tplayer.playVideo();\n\t\t\t\t\t}\n\n\t\t\t\t} );\n\n\t\t\t}\n\n\t\t\t/**\n\t\t\t * Before unloading the window (reload/exit)\n\t\t\t *\n\t\t\t * @since 1.0.0-beta.10\n\t\t\t *\n\t\t\t * @return void\n\t\t\t */\n\t\t\twindow.addEventListener( 'beforeunload', function() {\n\t\t\t\t/**\n\t\t\t\t * When the window is closed the player will be paused\n\t\t\t\t * but not 'paused' event will be catched, so here we\n\t\t\t\t * track the pause event anyways.\n\t\t\t\t */\n\t\t\t\tif ( 2 !== player.getPlayerState() ) {\n\t\t\t\t\ttrack_event( 'paused', {\n\t\t\t\t\t\tts: Math.round( player.getCurrentTime() ),\n\t\t\t\t\t\tduration: player.getDuration(),\n\t\t\t\t\t\turl: player.getVideoUrl(),\n\t\t\t\t\t\tprovider: 'youtube',\n\t\t\t\t\t} );\n\t\t\t\t}\n\t\t\t} );\n\n\t\t}\n\n\t\t/**\n\t\t * Update \"Control-less\" interface for a YouTube player.\n\t\t *\n\t\t * @since 1.0.0-beta.1\n\t\t *\n\t\t * @param {Object} $iframe Iframe object.\n\t\t * @param {Object} player YouTube Player instance.\n\t\t * @return {void}\n\t\t */\n\t\tfunction youtube_update_progress( $iframe, player ) {\n\n\t\t\tvar total = player.getDuration(),\n\t\t\t\tbuffered = player.getVideoLoadedFraction() * total;\n\t\t\tupdate_progress( $iframe, total, player.getCurrentTime(), buffered );\n\n\t\t}\n\n\t\t// Go.\n\t\tthis.init();\n\n\t};\n\n\t// Initialize on the global llms object.\n\twindow.llms.av = new LLMS_Advanced_Videos();\n\n}( jQuery ) );\n"],"sourceRoot":"../../js"}